var Aag = Object.defineProperty;
var J6 = (t) => {
throw TypeError(t);
};
var sag = (t, I, g) => I in t ? Aag(t, I, { enumerable: !0, configurable: !0, writable: !0, value: g }) : t[I] = g;
var iI = (t, I, g) => sag(t, typeof I != "symbol" ? I + "" : I, g), KH = (t, I, g) => I.has(t) || J6("Cannot " + g);
var M = (t, I, g) => (KH(t, I, "read from private field"), g ? g.call(t) : I.get(t)), tg = (t, I, g) => I.has(t) ? J6("Cannot add the same private member more than once") : I instanceof WeakSet ? I.add(t) : I.set(t, g), $ = (t, I, g, C) => (KH(t, I, "write to private field"), C ? C.call(t, g) : I.set(t, g), g), ig = (t, I, g) => (KH(t, I, "access private method"), g);
var Wi = (t, I, g, C) => ({
set _(i) {
$(t, I, i, g);
},
get _() {
return M(t, I, C);
}
});
import { ref as wi, onMounted as tG, createElementBlock as Pg, openBlock as Ug, createElementVNode as tC, normalizeStyle as Ae, Fragment as ct, renderList as vi, createApp as iG, computed as DA, onBeforeUnmount as s9, renderSlot as d$, createCommentVNode as Yt, withModifiers as ah, toDisplayString as um, defineComponent as r$, h as yI, unref as Dg, createBlock as h$, watch as b$, resolveComponent as lag, createTextVNode as nag, createVNode as aag, withCtx as oag, nextTick as cag, withDirectives as SY, vShow as DY } from "vue";
var JI = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
function u$(t) {
return t && t.__esModule && Object.prototype.hasOwnProperty.call(t, "default") ? t.default : t;
}
function Qa(t) {
throw new Error('Could not dynamically require "' + t + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
}
var FH = { exports: {} };
/*!
JSZip v3.10.1 - A JavaScript class for generating and reading zip files
(c) 2009-2016 Stuart Knightley
Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown.
JSZip uses the library pako released under the MIT license :
https://github.com/nodeca/pako/blob/main/LICENSE
*/
var L6;
function dag() {
return L6 || (L6 = 1, function(t, I) {
(function(g) {
t.exports = g();
})(function() {
return function g(C, i, e) {
function A(n, a) {
if (!i[n]) {
if (!C[n]) {
var d = typeof Qa == "function" && Qa;
if (!a && d) return d(n, !0);
if (s) return s(n, !0);
var o = new Error("Cannot find module '" + n + "'");
throw o.code = "MODULE_NOT_FOUND", o;
}
var c = i[n] = { exports: {} };
C[n][0].call(c.exports, function(r) {
var h = C[n][1][r];
return A(h || r);
}, c, c.exports, g, C, i, e);
}
return i[n].exports;
}
for (var s = typeof Qa == "function" && Qa, l = 0; l < e.length; l++) A(e[l]);
return A;
}({ 1: [function(g, C, i) {
var e = g("./utils"), A = g("./support"), s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
i.encode = function(l) {
for (var n, a, d, o, c, r, h, b = [], u = 0, m = l.length, Z = m, p = e.getTypeOf(l) !== "string"; u < l.length; ) Z = m - u, d = p ? (n = l[u++], a = u < m ? l[u++] : 0, u < m ? l[u++] : 0) : (n = l.charCodeAt(u++), a = u < m ? l.charCodeAt(u++) : 0, u < m ? l.charCodeAt(u++) : 0), o = n >> 2, c = (3 & n) << 4 | a >> 4, r = 1 < Z ? (15 & a) << 2 | d >> 6 : 64, h = 2 < Z ? 63 & d : 64, b.push(s.charAt(o) + s.charAt(c) + s.charAt(r) + s.charAt(h));
return b.join("");
}, i.decode = function(l) {
var n, a, d, o, c, r, h = 0, b = 0, u = "data:";
if (l.substr(0, u.length) === u) throw new Error("Invalid base64 input, it looks like a data url.");
var m, Z = 3 * (l = l.replace(/[^A-Za-z0-9+/=]/g, "")).length / 4;
if (l.charAt(l.length - 1) === s.charAt(64) && Z--, l.charAt(l.length - 2) === s.charAt(64) && Z--, Z % 1 != 0) throw new Error("Invalid base64 input, bad content length.");
for (m = A.uint8array ? new Uint8Array(0 | Z) : new Array(0 | Z); h < l.length; ) n = s.indexOf(l.charAt(h++)) << 2 | (o = s.indexOf(l.charAt(h++))) >> 4, a = (15 & o) << 4 | (c = s.indexOf(l.charAt(h++))) >> 2, d = (3 & c) << 6 | (r = s.indexOf(l.charAt(h++))), m[b++] = n, c !== 64 && (m[b++] = a), r !== 64 && (m[b++] = d);
return m;
};
}, { "./support": 30, "./utils": 32 }], 2: [function(g, C, i) {
var e = g("./external"), A = g("./stream/DataWorker"), s = g("./stream/Crc32Probe"), l = g("./stream/DataLengthProbe");
function n(a, d, o, c, r) {
this.compressedSize = a, this.uncompressedSize = d, this.crc32 = o, this.compression = c, this.compressedContent = r;
}
n.prototype = { getContentWorker: function() {
var a = new A(e.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new l("data_length")), d = this;
return a.on("end", function() {
if (this.streamInfo.data_length !== d.uncompressedSize) throw new Error("Bug : uncompressed data size mismatch");
}), a;
}, getCompressedWorker: function() {
return new A(e.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize", this.compressedSize).withStreamInfo("uncompressedSize", this.uncompressedSize).withStreamInfo("crc32", this.crc32).withStreamInfo("compression", this.compression);
} }, n.createWorkerFrom = function(a, d, o) {
return a.pipe(new s()).pipe(new l("uncompressedSize")).pipe(d.compressWorker(o)).pipe(new l("compressedSize")).withStreamInfo("compression", d);
}, C.exports = n;
}, { "./external": 6, "./stream/Crc32Probe": 25, "./stream/DataLengthProbe": 26, "./stream/DataWorker": 27 }], 3: [function(g, C, i) {
var e = g("./stream/GenericWorker");
i.STORE = { magic: "\0\0", compressWorker: function() {
return new e("STORE compression");
}, uncompressWorker: function() {
return new e("STORE decompression");
} }, i.DEFLATE = g("./flate");
}, { "./flate": 7, "./stream/GenericWorker": 28 }], 4: [function(g, C, i) {
var e = g("./utils"), A = function() {
for (var s, l = [], n = 0; n < 256; n++) {
s = n;
for (var a = 0; a < 8; a++) s = 1 & s ? 3988292384 ^ s >>> 1 : s >>> 1;
l[n] = s;
}
return l;
}();
C.exports = function(s, l) {
return s !== void 0 && s.length ? e.getTypeOf(s) !== "string" ? function(n, a, d, o) {
var c = A, r = o + d;
n ^= -1;
for (var h = o; h < r; h++) n = n >>> 8 ^ c[255 & (n ^ a[h])];
return -1 ^ n;
}(0 | l, s, s.length, 0) : function(n, a, d, o) {
var c = A, r = o + d;
n ^= -1;
for (var h = o; h < r; h++) n = n >>> 8 ^ c[255 & (n ^ a.charCodeAt(h))];
return -1 ^ n;
}(0 | l, s, s.length, 0) : 0;
};
}, { "./utils": 32 }], 5: [function(g, C, i) {
i.base64 = !1, i.binary = !1, i.dir = !1, i.createFolders = !0, i.date = null, i.compression = null, i.compressionOptions = null, i.comment = null, i.unixPermissions = null, i.dosPermissions = null;
}, {}], 6: [function(g, C, i) {
var e = null;
e = typeof Promise < "u" ? Promise : g("lie"), C.exports = { Promise: e };
}, { lie: 37 }], 7: [function(g, C, i) {
var e = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Uint32Array < "u", A = g("pako"), s = g("./utils"), l = g("./stream/GenericWorker"), n = e ? "uint8array" : "array";
function a(d, o) {
l.call(this, "FlateWorker/" + d), this._pako = null, this._pakoAction = d, this._pakoOptions = o, this.meta = {};
}
i.magic = "\b\0", s.inherits(a, l), a.prototype.processChunk = function(d) {
this.meta = d.meta, this._pako === null && this._createPako(), this._pako.push(s.transformTo(n, d.data), !1);
}, a.prototype.flush = function() {
l.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);
}, a.prototype.cleanUp = function() {
l.prototype.cleanUp.call(this), this._pako = null;
}, a.prototype._createPako = function() {
this._pako = new A[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });
var d = this;
this._pako.onData = function(o) {
d.push({ data: o, meta: d.meta });
};
}, i.compressWorker = function(d) {
return new a("Deflate", d);
}, i.uncompressWorker = function() {
return new a("Inflate", {});
};
}, { "./stream/GenericWorker": 28, "./utils": 32, pako: 38 }], 8: [function(g, C, i) {
function e(c, r) {
var h, b = "";
for (h = 0; h < r; h++) b += String.fromCharCode(255 & c), c >>>= 8;
return b;
}
function A(c, r, h, b, u, m) {
var Z, p, Y = c.file, R = c.compression, X = m !== n.utf8encode, H = s.transformTo("string", m(Y.name)), S = s.transformTo("string", n.utf8encode(Y.name)), z = Y.comment, v = s.transformTo("string", m(z)), K = s.transformTo("string", n.utf8encode(z)), V = S.length !== Y.name.length, N = K.length !== z.length, B = "", G = "", w = "", W = Y.dir, y = Y.date, f = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };
r && !h || (f.crc32 = c.crc32, f.compressedSize = c.compressedSize, f.uncompressedSize = c.uncompressedSize);
var D = 0;
r && (D |= 8), X || !V && !N || (D |= 2048);
var F = 0, T = 0;
W && (F |= 16), u === "UNIX" ? (T = 798, F |= function(P, L) {
var E = P;
return P || (E = L ? 16893 : 33204), (65535 & E) << 16;
}(Y.unixPermissions, W)) : (T = 20, F |= function(P) {
return 63 & (P || 0);
}(Y.dosPermissions)), Z = y.getUTCHours(), Z <<= 6, Z |= y.getUTCMinutes(), Z <<= 5, Z |= y.getUTCSeconds() / 2, p = y.getUTCFullYear() - 1980, p <<= 4, p |= y.getUTCMonth() + 1, p <<= 5, p |= y.getUTCDate(), V && (G = e(1, 1) + e(a(H), 4) + S, B += "up" + e(G.length, 2) + G), N && (w = e(1, 1) + e(a(v), 4) + K, B += "uc" + e(w.length, 2) + w);
var Q = "";
return Q += `
\0`, Q += e(D, 2), Q += R.magic, Q += e(Z, 2), Q += e(p, 2), Q += e(f.crc32, 4), Q += e(f.compressedSize, 4), Q += e(f.uncompressedSize, 4), Q += e(H.length, 2), Q += e(B.length, 2), { fileRecord: d.LOCAL_FILE_HEADER + Q + H + B, dirRecord: d.CENTRAL_FILE_HEADER + e(T, 2) + Q + e(v.length, 2) + "\0\0\0\0" + e(F, 4) + e(b, 4) + H + B + v };
}
var s = g("../utils"), l = g("../stream/GenericWorker"), n = g("../utf8"), a = g("../crc32"), d = g("../signature");
function o(c, r, h, b) {
l.call(this, "ZipFileWorker"), this.bytesWritten = 0, this.zipComment = r, this.zipPlatform = h, this.encodeFileName = b, this.streamFiles = c, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];
}
s.inherits(o, l), o.prototype.push = function(c) {
var r = c.meta.percent || 0, h = this.entriesCount, b = this._sources.length;
this.accumulate ? this.contentBuffer.push(c) : (this.bytesWritten += c.data.length, l.prototype.push.call(this, { data: c.data, meta: { currentFile: this.currentFile, percent: h ? (r + 100 * (h - b - 1)) / h : 100 } }));
}, o.prototype.openedSource = function(c) {
this.currentSourceOffset = this.bytesWritten, this.currentFile = c.file.name;
var r = this.streamFiles && !c.file.dir;
if (r) {
var h = A(c, r, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
this.push({ data: h.fileRecord, meta: { percent: 0 } });
} else this.accumulate = !0;
}, o.prototype.closedSource = function(c) {
this.accumulate = !1;
var r = this.streamFiles && !c.file.dir, h = A(c, r, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
if (this.dirRecords.push(h.dirRecord), r) this.push({ data: function(b) {
return d.DATA_DESCRIPTOR + e(b.crc32, 4) + e(b.compressedSize, 4) + e(b.uncompressedSize, 4);
}(c), meta: { percent: 100 } });
else for (this.push({ data: h.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());
this.currentFile = null;
}, o.prototype.flush = function() {
for (var c = this.bytesWritten, r = 0; r < this.dirRecords.length; r++) this.push({ data: this.dirRecords[r], meta: { percent: 100 } });
var h = this.bytesWritten - c, b = function(u, m, Z, p, Y) {
var R = s.transformTo("string", Y(p));
return d.CENTRAL_DIRECTORY_END + "\0\0\0\0" + e(u, 2) + e(u, 2) + e(m, 4) + e(Z, 4) + e(R.length, 2) + R;
}(this.dirRecords.length, h, c, this.zipComment, this.encodeFileName);
this.push({ data: b, meta: { percent: 100 } });
}, o.prototype.prepareNextSource = function() {
this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();
}, o.prototype.registerPrevious = function(c) {
this._sources.push(c);
var r = this;
return c.on("data", function(h) {
r.processChunk(h);
}), c.on("end", function() {
r.closedSource(r.previous.streamInfo), r._sources.length ? r.prepareNextSource() : r.end();
}), c.on("error", function(h) {
r.error(h);
}), this;
}, o.prototype.resume = function() {
return !!l.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));
}, o.prototype.error = function(c) {
var r = this._sources;
if (!l.prototype.error.call(this, c)) return !1;
for (var h = 0; h < r.length; h++) try {
r[h].error(c);
} catch {
}
return !0;
}, o.prototype.lock = function() {
l.prototype.lock.call(this);
for (var c = this._sources, r = 0; r < c.length; r++) c[r].lock();
}, C.exports = o;
}, { "../crc32": 4, "../signature": 23, "../stream/GenericWorker": 28, "../utf8": 31, "../utils": 32 }], 9: [function(g, C, i) {
var e = g("../compressions"), A = g("./ZipFileWorker");
i.generateWorker = function(s, l, n) {
var a = new A(l.streamFiles, n, l.platform, l.encodeFileName), d = 0;
try {
s.forEach(function(o, c) {
d++;
var r = function(m, Z) {
var p = m || Z, Y = e[p];
if (!Y) throw new Error(p + " is not a valid compression method !");
return Y;
}(c.options.compression, l.compression), h = c.options.compressionOptions || l.compressionOptions || {}, b = c.dir, u = c.date;
c._compressWorker(r, h).withStreamInfo("file", { name: o, dir: b, date: u, comment: c.comment || "", unixPermissions: c.unixPermissions, dosPermissions: c.dosPermissions }).pipe(a);
}), a.entriesCount = d;
} catch (o) {
a.error(o);
}
return a;
};
}, { "../compressions": 3, "./ZipFileWorker": 8 }], 10: [function(g, C, i) {
function e() {
if (!(this instanceof e)) return new e();
if (arguments.length) throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = "", this.clone = function() {
var A = new e();
for (var s in this) typeof this[s] != "function" && (A[s] = this[s]);
return A;
};
}
(e.prototype = g("./object")).loadAsync = g("./load"), e.support = g("./support"), e.defaults = g("./defaults"), e.version = "3.10.1", e.loadAsync = function(A, s) {
return new e().loadAsync(A, s);
}, e.external = g("./external"), C.exports = e;
}, { "./defaults": 5, "./external": 6, "./load": 11, "./object": 15, "./support": 30 }], 11: [function(g, C, i) {
var e = g("./utils"), A = g("./external"), s = g("./utf8"), l = g("./zipEntries"), n = g("./stream/Crc32Probe"), a = g("./nodejsUtils");
function d(o) {
return new A.Promise(function(c, r) {
var h = o.decompressed.getContentWorker().pipe(new n());
h.on("error", function(b) {
r(b);
}).on("end", function() {
h.streamInfo.crc32 !== o.decompressed.crc32 ? r(new Error("Corrupted zip : CRC32 mismatch")) : c();
}).resume();
});
}
C.exports = function(o, c) {
var r = this;
return c = e.extend(c || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: s.utf8decode }), a.isNode && a.isStream(o) ? A.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")) : e.prepareContent("the loaded zip file", o, !0, c.optimizedBinaryString, c.base64).then(function(h) {
var b = new l(c);
return b.load(h), b;
}).then(function(h) {
var b = [A.Promise.resolve(h)], u = h.files;
if (c.checkCRC32) for (var m = 0; m < u.length; m++) b.push(d(u[m]));
return A.Promise.all(b);
}).then(function(h) {
for (var b = h.shift(), u = b.files, m = 0; m < u.length; m++) {
var Z = u[m], p = Z.fileNameStr, Y = e.resolve(Z.fileNameStr);
r.file(Y, Z.decompressed, { binary: !0, optimizedBinaryString: !0, date: Z.date, dir: Z.dir, comment: Z.fileCommentStr.length ? Z.fileCommentStr : null, unixPermissions: Z.unixPermissions, dosPermissions: Z.dosPermissions, createFolders: c.createFolders }), Z.dir || (r.file(Y).unsafeOriginalName = p);
}
return b.zipComment.length && (r.comment = b.zipComment), r;
});
};
}, { "./external": 6, "./nodejsUtils": 14, "./stream/Crc32Probe": 25, "./utf8": 31, "./utils": 32, "./zipEntries": 33 }], 12: [function(g, C, i) {
var e = g("../utils"), A = g("../stream/GenericWorker");
function s(l, n) {
A.call(this, "Nodejs stream input adapter for " + l), this._upstreamEnded = !1, this._bindStream(n);
}
e.inherits(s, A), s.prototype._bindStream = function(l) {
var n = this;
(this._stream = l).pause(), l.on("data", function(a) {
n.push({ data: a, meta: { percent: 0 } });
}).on("error", function(a) {
n.isPaused ? this.generatedError = a : n.error(a);
}).on("end", function() {
n.isPaused ? n._upstreamEnded = !0 : n.end();
});
}, s.prototype.pause = function() {
return !!A.prototype.pause.call(this) && (this._stream.pause(), !0);
}, s.prototype.resume = function() {
return !!A.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);
}, C.exports = s;
}, { "../stream/GenericWorker": 28, "../utils": 32 }], 13: [function(g, C, i) {
var e = g("readable-stream").Readable;
function A(s, l, n) {
e.call(this, l), this._helper = s;
var a = this;
s.on("data", function(d, o) {
a.push(d) || a._helper.pause(), n && n(o);
}).on("error", function(d) {
a.emit("error", d);
}).on("end", function() {
a.push(null);
});
}
g("../utils").inherits(A, e), A.prototype._read = function() {
this._helper.resume();
}, C.exports = A;
}, { "../utils": 32, "readable-stream": 16 }], 14: [function(g, C, i) {
C.exports = { isNode: typeof Buffer < "u", newBufferFrom: function(e, A) {
if (Buffer.from && Buffer.from !== Uint8Array.from) return Buffer.from(e, A);
if (typeof e == "number") throw new Error('The "data" argument must not be a number');
return new Buffer(e, A);
}, allocBuffer: function(e) {
if (Buffer.alloc) return Buffer.alloc(e);
var A = new Buffer(e);
return A.fill(0), A;
}, isBuffer: function(e) {
return Buffer.isBuffer(e);
}, isStream: function(e) {
return e && typeof e.on == "function" && typeof e.pause == "function" && typeof e.resume == "function";
} };
}, {}], 15: [function(g, C, i) {
function e(Y, R, X) {
var H, S = s.getTypeOf(R), z = s.extend(X || {}, a);
z.date = z.date || /* @__PURE__ */ new Date(), z.compression !== null && (z.compression = z.compression.toUpperCase()), typeof z.unixPermissions == "string" && (z.unixPermissions = parseInt(z.unixPermissions, 8)), z.unixPermissions && 16384 & z.unixPermissions && (z.dir = !0), z.dosPermissions && 16 & z.dosPermissions && (z.dir = !0), z.dir && (Y = u(Y)), z.createFolders && (H = b(Y)) && m.call(this, H, !0);
var v = S === "string" && z.binary === !1 && z.base64 === !1;
X && X.binary !== void 0 || (z.binary = !v), (R instanceof d && R.uncompressedSize === 0 || z.dir || !R || R.length === 0) && (z.base64 = !1, z.binary = !0, R = "", z.compression = "STORE", S = "string");
var K = null;
K = R instanceof d || R instanceof l ? R : r.isNode && r.isStream(R) ? new h(Y, R) : s.prepareContent(Y, R, z.binary, z.optimizedBinaryString, z.base64);
var V = new o(Y, K, z);
this.files[Y] = V;
}
var A = g("./utf8"), s = g("./utils"), l = g("./stream/GenericWorker"), n = g("./stream/StreamHelper"), a = g("./defaults"), d = g("./compressedObject"), o = g("./zipObject"), c = g("./generate"), r = g("./nodejsUtils"), h = g("./nodejs/NodejsStreamInputAdapter"), b = function(Y) {
Y.slice(-1) === "/" && (Y = Y.substring(0, Y.length - 1));
var R = Y.lastIndexOf("/");
return 0 < R ? Y.substring(0, R) : "";
}, u = function(Y) {
return Y.slice(-1) !== "/" && (Y += "/"), Y;
}, m = function(Y, R) {
return R = R !== void 0 ? R : a.createFolders, Y = u(Y), this.files[Y] || e.call(this, Y, null, { dir: !0, createFolders: R }), this.files[Y];
};
function Z(Y) {
return Object.prototype.toString.call(Y) === "[object RegExp]";
}
var p = { load: function() {
throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
}, forEach: function(Y) {
var R, X, H;
for (R in this.files) H = this.files[R], (X = R.slice(this.root.length, R.length)) && R.slice(0, this.root.length) === this.root && Y(X, H);
}, filter: function(Y) {
var R = [];
return this.forEach(function(X, H) {
Y(X, H) && R.push(H);
}), R;
}, file: function(Y, R, X) {
if (arguments.length !== 1) return Y = this.root + Y, e.call(this, Y, R, X), this;
if (Z(Y)) {
var H = Y;
return this.filter(function(z, v) {
return !v.dir && H.test(z);
});
}
var S = this.files[this.root + Y];
return S && !S.dir ? S : null;
}, folder: function(Y) {
if (!Y) return this;
if (Z(Y)) return this.filter(function(S, z) {
return z.dir && Y.test(S);
});
var R = this.root + Y, X = m.call(this, R), H = this.clone();
return H.root = X.name, H;
}, remove: function(Y) {
Y = this.root + Y;
var R = this.files[Y];
if (R || (Y.slice(-1) !== "/" && (Y += "/"), R = this.files[Y]), R && !R.dir) delete this.files[Y];
else for (var X = this.filter(function(S, z) {
return z.name.slice(0, Y.length) === Y;
}), H = 0; H < X.length; H++) delete this.files[X[H].name];
return this;
}, generate: function() {
throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
}, generateInternalStream: function(Y) {
var R, X = {};
try {
if ((X = s.extend(Y || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: A.utf8encode })).type = X.type.toLowerCase(), X.compression = X.compression.toUpperCase(), X.type === "binarystring" && (X.type = "string"), !X.type) throw new Error("No output type specified.");
s.checkSupport(X.type), X.platform !== "darwin" && X.platform !== "freebsd" && X.platform !== "linux" && X.platform !== "sunos" || (X.platform = "UNIX"), X.platform === "win32" && (X.platform = "DOS");
var H = X.comment || this.comment || "";
R = c.generateWorker(this, X, H);
} catch (S) {
(R = new l("error")).error(S);
}
return new n(R, X.type || "string", X.mimeType);
}, generateAsync: function(Y, R) {
return this.generateInternalStream(Y).accumulate(R);
}, generateNodeStream: function(Y, R) {
return (Y = Y || {}).type || (Y.type = "nodebuffer"), this.generateInternalStream(Y).toNodejsStream(R);
} };
C.exports = p;
}, { "./compressedObject": 2, "./defaults": 5, "./generate": 9, "./nodejs/NodejsStreamInputAdapter": 12, "./nodejsUtils": 14, "./stream/GenericWorker": 28, "./stream/StreamHelper": 29, "./utf8": 31, "./utils": 32, "./zipObject": 35 }], 16: [function(g, C, i) {
C.exports = g("stream");
}, { stream: void 0 }], 17: [function(g, C, i) {
var e = g("./DataReader");
function A(s) {
e.call(this, s);
for (var l = 0; l < this.data.length; l++) s[l] = 255 & s[l];
}
g("../utils").inherits(A, e), A.prototype.byteAt = function(s) {
return this.data[this.zero + s];
}, A.prototype.lastIndexOfSignature = function(s) {
for (var l = s.charCodeAt(0), n = s.charCodeAt(1), a = s.charCodeAt(2), d = s.charCodeAt(3), o = this.length - 4; 0 <= o; --o) if (this.data[o] === l && this.data[o + 1] === n && this.data[o + 2] === a && this.data[o + 3] === d) return o - this.zero;
return -1;
}, A.prototype.readAndCheckSignature = function(s) {
var l = s.charCodeAt(0), n = s.charCodeAt(1), a = s.charCodeAt(2), d = s.charCodeAt(3), o = this.readData(4);
return l === o[0] && n === o[1] && a === o[2] && d === o[3];
}, A.prototype.readData = function(s) {
if (this.checkOffset(s), s === 0) return [];
var l = this.data.slice(this.zero + this.index, this.zero + this.index + s);
return this.index += s, l;
}, C.exports = A;
}, { "../utils": 32, "./DataReader": 18 }], 18: [function(g, C, i) {
var e = g("../utils");
function A(s) {
this.data = s, this.length = s.length, this.index = 0, this.zero = 0;
}
A.prototype = { checkOffset: function(s) {
this.checkIndex(this.index + s);
}, checkIndex: function(s) {
if (this.length < this.zero + s || s < 0) throw new Error("End of data reached (data length = " + this.length + ", asked index = " + s + "). Corrupted zip ?");
}, setIndex: function(s) {
this.checkIndex(s), this.index = s;
}, skip: function(s) {
this.setIndex(this.index + s);
}, byteAt: function() {
}, readInt: function(s) {
var l, n = 0;
for (this.checkOffset(s), l = this.index + s - 1; l >= this.index; l--) n = (n << 8) + this.byteAt(l);
return this.index += s, n;
}, readString: function(s) {
return e.transformTo("string", this.readData(s));
}, readData: function() {
}, lastIndexOfSignature: function() {
}, readAndCheckSignature: function() {
}, readDate: function() {
var s = this.readInt(4);
return new Date(Date.UTC(1980 + (s >> 25 & 127), (s >> 21 & 15) - 1, s >> 16 & 31, s >> 11 & 31, s >> 5 & 63, (31 & s) << 1));
} }, C.exports = A;
}, { "../utils": 32 }], 19: [function(g, C, i) {
var e = g("./Uint8ArrayReader");
function A(s) {
e.call(this, s);
}
g("../utils").inherits(A, e), A.prototype.readData = function(s) {
this.checkOffset(s);
var l = this.data.slice(this.zero + this.index, this.zero + this.index + s);
return this.index += s, l;
}, C.exports = A;
}, { "../utils": 32, "./Uint8ArrayReader": 21 }], 20: [function(g, C, i) {
var e = g("./DataReader");
function A(s) {
e.call(this, s);
}
g("../utils").inherits(A, e), A.prototype.byteAt = function(s) {
return this.data.charCodeAt(this.zero + s);
}, A.prototype.lastIndexOfSignature = function(s) {
return this.data.lastIndexOf(s) - this.zero;
}, A.prototype.readAndCheckSignature = function(s) {
return s === this.readData(4);
}, A.prototype.readData = function(s) {
this.checkOffset(s);
var l = this.data.slice(this.zero + this.index, this.zero + this.index + s);
return this.index += s, l;
}, C.exports = A;
}, { "../utils": 32, "./DataReader": 18 }], 21: [function(g, C, i) {
var e = g("./ArrayReader");
function A(s) {
e.call(this, s);
}
g("../utils").inherits(A, e), A.prototype.readData = function(s) {
if (this.checkOffset(s), s === 0) return new Uint8Array(0);
var l = this.data.subarray(this.zero + this.index, this.zero + this.index + s);
return this.index += s, l;
}, C.exports = A;
}, { "../utils": 32, "./ArrayReader": 17 }], 22: [function(g, C, i) {
var e = g("../utils"), A = g("../support"), s = g("./ArrayReader"), l = g("./StringReader"), n = g("./NodeBufferReader"), a = g("./Uint8ArrayReader");
C.exports = function(d) {
var o = e.getTypeOf(d);
return e.checkSupport(o), o !== "string" || A.uint8array ? o === "nodebuffer" ? new n(d) : A.uint8array ? new a(e.transformTo("uint8array", d)) : new s(e.transformTo("array", d)) : new l(d);
};
}, { "../support": 30, "../utils": 32, "./ArrayReader": 17, "./NodeBufferReader": 19, "./StringReader": 20, "./Uint8ArrayReader": 21 }], 23: [function(g, C, i) {
i.LOCAL_FILE_HEADER = "PK", i.CENTRAL_FILE_HEADER = "PK", i.CENTRAL_DIRECTORY_END = "PK", i.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x07", i.ZIP64_CENTRAL_DIRECTORY_END = "PK", i.DATA_DESCRIPTOR = "PK\x07\b";
}, {}], 24: [function(g, C, i) {
var e = g("./GenericWorker"), A = g("../utils");
function s(l) {
e.call(this, "ConvertWorker to " + l), this.destType = l;
}
A.inherits(s, e), s.prototype.processChunk = function(l) {
this.push({ data: A.transformTo(this.destType, l.data), meta: l.meta });
}, C.exports = s;
}, { "../utils": 32, "./GenericWorker": 28 }], 25: [function(g, C, i) {
var e = g("./GenericWorker"), A = g("../crc32");
function s() {
e.call(this, "Crc32Probe"), this.withStreamInfo("crc32", 0);
}
g("../utils").inherits(s, e), s.prototype.processChunk = function(l) {
this.streamInfo.crc32 = A(l.data, this.streamInfo.crc32 || 0), this.push(l);
}, C.exports = s;
}, { "../crc32": 4, "../utils": 32, "./GenericWorker": 28 }], 26: [function(g, C, i) {
var e = g("../utils"), A = g("./GenericWorker");
function s(l) {
A.call(this, "DataLengthProbe for " + l), this.propName = l, this.withStreamInfo(l, 0);
}
e.inherits(s, A), s.prototype.processChunk = function(l) {
if (l) {
var n = this.streamInfo[this.propName] || 0;
this.streamInfo[this.propName] = n + l.data.length;
}
A.prototype.processChunk.call(this, l);
}, C.exports = s;
}, { "../utils": 32, "./GenericWorker": 28 }], 27: [function(g, C, i) {
var e = g("../utils"), A = g("./GenericWorker");
function s(l) {
A.call(this, "DataWorker");
var n = this;
this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = "", this._tickScheduled = !1, l.then(function(a) {
n.dataIsReady = !0, n.data = a, n.max = a && a.length || 0, n.type = e.getTypeOf(a), n.isPaused || n._tickAndRepeat();
}, function(a) {
n.error(a);
});
}
e.inherits(s, A), s.prototype.cleanUp = function() {
A.prototype.cleanUp.call(this), this.data = null;
}, s.prototype.resume = function() {
return !!A.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, e.delay(this._tickAndRepeat, [], this)), !0);
}, s.prototype._tickAndRepeat = function() {
this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (e.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));
}, s.prototype._tick = function() {
if (this.isPaused || this.isFinished) return !1;
var l = null, n = Math.min(this.max, this.index + 16384);
if (this.index >= this.max) return this.end();
switch (this.type) {
case "string":
l = this.data.substring(this.index, n);
break;
case "uint8array":
l = this.data.subarray(this.index, n);
break;
case "array":
case "nodebuffer":
l = this.data.slice(this.index, n);
}
return this.index = n, this.push({ data: l, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });
}, C.exports = s;
}, { "../utils": 32, "./GenericWorker": 28 }], 28: [function(g, C, i) {
function e(A) {
this.name = A || "default", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;
}
e.prototype = { push: function(A) {
this.emit("data", A);
}, end: function() {
if (this.isFinished) return !1;
this.flush();
try {
this.emit("end"), this.cleanUp(), this.isFinished = !0;
} catch (A) {
this.emit("error", A);
}
return !0;
}, error: function(A) {
return !this.isFinished && (this.isPaused ? this.generatedError = A : (this.isFinished = !0, this.emit("error", A), this.previous && this.previous.error(A), this.cleanUp()), !0);
}, on: function(A, s) {
return this._listeners[A].push(s), this;
}, cleanUp: function() {
this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];
}, emit: function(A, s) {
if (this._listeners[A]) for (var l = 0; l < this._listeners[A].length; l++) this._listeners[A][l].call(this, s);
}, pipe: function(A) {
return A.registerPrevious(this);
}, registerPrevious: function(A) {
if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
this.streamInfo = A.streamInfo, this.mergeStreamInfo(), this.previous = A;
var s = this;
return A.on("data", function(l) {
s.processChunk(l);
}), A.on("end", function() {
s.end();
}), A.on("error", function(l) {
s.error(l);
}), this;
}, pause: function() {
return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);
}, resume: function() {
if (!this.isPaused || this.isFinished) return !1;
var A = this.isPaused = !1;
return this.generatedError && (this.error(this.generatedError), A = !0), this.previous && this.previous.resume(), !A;
}, flush: function() {
}, processChunk: function(A) {
this.push(A);
}, withStreamInfo: function(A, s) {
return this.extraStreamInfo[A] = s, this.mergeStreamInfo(), this;
}, mergeStreamInfo: function() {
for (var A in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, A) && (this.streamInfo[A] = this.extraStreamInfo[A]);
}, lock: function() {
if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
this.isLocked = !0, this.previous && this.previous.lock();
}, toString: function() {
var A = "Worker " + this.name;
return this.previous ? this.previous + " -> " + A : A;
} }, C.exports = e;
}, {}], 29: [function(g, C, i) {
var e = g("../utils"), A = g("./ConvertWorker"), s = g("./GenericWorker"), l = g("../base64"), n = g("../support"), a = g("../external"), d = null;
if (n.nodestream) try {
d = g("../nodejs/NodejsStreamOutputAdapter");
} catch {
}
function o(r, h) {
return new a.Promise(function(b, u) {
var m = [], Z = r._internalType, p = r._outputType, Y = r._mimeType;
r.on("data", function(R, X) {
m.push(R), h && h(X);
}).on("error", function(R) {
m = [], u(R);
}).on("end", function() {
try {
var R = function(X, H, S) {
switch (X) {
case "blob":
return e.newBlob(e.transformTo("arraybuffer", H), S);
case "base64":
return l.encode(H);
default:
return e.transformTo(X, H);
}
}(p, function(X, H) {
var S, z = 0, v = null, K = 0;
for (S = 0; S < H.length; S++) K += H[S].length;
switch (X) {
case "string":
return H.join("");
case "array":
return Array.prototype.concat.apply([], H);
case "uint8array":
for (v = new Uint8Array(K), S = 0; S < H.length; S++) v.set(H[S], z), z += H[S].length;
return v;
case "nodebuffer":
return Buffer.concat(H);
default:
throw new Error("concat : unsupported type '" + X + "'");
}
}(Z, m), Y);
b(R);
} catch (X) {
u(X);
}
m = [];
}).resume();
});
}
function c(r, h, b) {
var u = h;
switch (h) {
case "blob":
case "arraybuffer":
u = "uint8array";
break;
case "base64":
u = "string";
}
try {
this._internalType = u, this._outputType = h, this._mimeType = b, e.checkSupport(u), this._worker = r.pipe(new A(u)), r.lock();
} catch (m) {
this._worker = new s("error"), this._worker.error(m);
}
}
c.prototype = { accumulate: function(r) {
return o(this, r);
}, on: function(r, h) {
var b = this;
return r === "data" ? this._worker.on(r, function(u) {
h.call(b, u.data, u.meta);
}) : this._worker.on(r, function() {
e.delay(h, arguments, b);
}), this;
}, resume: function() {
return e.delay(this._worker.resume, [], this._worker), this;
}, pause: function() {
return this._worker.pause(), this;
}, toNodejsStream: function(r) {
if (e.checkSupport("nodestream"), this._outputType !== "nodebuffer") throw new Error(this._outputType + " is not supported by this method");
return new d(this, { objectMode: this._outputType !== "nodebuffer" }, r);
} }, C.exports = c;
}, { "../base64": 1, "../external": 6, "../nodejs/NodejsStreamOutputAdapter": 13, "../support": 30, "../utils": 32, "./ConvertWorker": 24, "./GenericWorker": 28 }], 30: [function(g, C, i) {
if (i.base64 = !0, i.array = !0, i.string = !0, i.arraybuffer = typeof ArrayBuffer < "u" && typeof Uint8Array < "u", i.nodebuffer = typeof Buffer < "u", i.uint8array = typeof Uint8Array < "u", typeof ArrayBuffer > "u") i.blob = !1;
else {
var e = new ArrayBuffer(0);
try {
i.blob = new Blob([e], { type: "application/zip" }).size === 0;
} catch {
try {
var A = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
A.append(e), i.blob = A.getBlob("application/zip").size === 0;
} catch {
i.blob = !1;
}
}
}
try {
i.nodestream = !!g("readable-stream").Readable;
} catch {
i.nodestream = !1;
}
}, { "readable-stream": 16 }], 31: [function(g, C, i) {
for (var e = g("./utils"), A = g("./support"), s = g("./nodejsUtils"), l = g("./stream/GenericWorker"), n = new Array(256), a = 0; a < 256; a++) n[a] = 252 <= a ? 6 : 248 <= a ? 5 : 240 <= a ? 4 : 224 <= a ? 3 : 192 <= a ? 2 : 1;
n[254] = n[254] = 1;
function d() {
l.call(this, "utf-8 decode"), this.leftOver = null;
}
function o() {
l.call(this, "utf-8 encode");
}
i.utf8encode = function(c) {
return A.nodebuffer ? s.newBufferFrom(c, "utf-8") : function(r) {
var h, b, u, m, Z, p = r.length, Y = 0;
for (m = 0; m < p; m++) (64512 & (b = r.charCodeAt(m))) == 55296 && m + 1 < p && (64512 & (u = r.charCodeAt(m + 1))) == 56320 && (b = 65536 + (b - 55296 << 10) + (u - 56320), m++), Y += b < 128 ? 1 : b < 2048 ? 2 : b < 65536 ? 3 : 4;
for (h = A.uint8array ? new Uint8Array(Y) : new Array(Y), m = Z = 0; Z < Y; m++) (64512 & (b = r.charCodeAt(m))) == 55296 && m + 1 < p && (64512 & (u = r.charCodeAt(m + 1))) == 56320 && (b = 65536 + (b - 55296 << 10) + (u - 56320), m++), b < 128 ? h[Z++] = b : (b < 2048 ? h[Z++] = 192 | b >>> 6 : (b < 65536 ? h[Z++] = 224 | b >>> 12 : (h[Z++] = 240 | b >>> 18, h[Z++] = 128 | b >>> 12 & 63), h[Z++] = 128 | b >>> 6 & 63), h[Z++] = 128 | 63 & b);
return h;
}(c);
}, i.utf8decode = function(c) {
return A.nodebuffer ? e.transformTo("nodebuffer", c).toString("utf-8") : function(r) {
var h, b, u, m, Z = r.length, p = new Array(2 * Z);
for (h = b = 0; h < Z; ) if ((u = r[h++]) < 128) p[b++] = u;
else if (4 < (m = n[u])) p[b++] = 65533, h += m - 1;
else {
for (u &= m === 2 ? 31 : m === 3 ? 15 : 7; 1 < m && h < Z; ) u = u << 6 | 63 & r[h++], m--;
1 < m ? p[b++] = 65533 : u < 65536 ? p[b++] = u : (u -= 65536, p[b++] = 55296 | u >> 10 & 1023, p[b++] = 56320 | 1023 & u);
}
return p.length !== b && (p.subarray ? p = p.subarray(0, b) : p.length = b), e.applyFromCharCode(p);
}(c = e.transformTo(A.uint8array ? "uint8array" : "array", c));
}, e.inherits(d, l), d.prototype.processChunk = function(c) {
var r = e.transformTo(A.uint8array ? "uint8array" : "array", c.data);
if (this.leftOver && this.leftOver.length) {
if (A.uint8array) {
var h = r;
(r = new Uint8Array(h.length + this.leftOver.length)).set(this.leftOver, 0), r.set(h, this.leftOver.length);
} else r = this.leftOver.concat(r);
this.leftOver = null;
}
var b = function(m, Z) {
var p;
for ((Z = Z || m.length) > m.length && (Z = m.length), p = Z - 1; 0 <= p && (192 & m[p]) == 128; ) p--;
return p < 0 || p === 0 ? Z : p + n[m[p]] > Z ? p : Z;
}(r), u = r;
b !== r.length && (A.uint8array ? (u = r.subarray(0, b), this.leftOver = r.subarray(b, r.length)) : (u = r.slice(0, b), this.leftOver = r.slice(b, r.length))), this.push({ data: i.utf8decode(u), meta: c.meta });
}, d.prototype.flush = function() {
this.leftOver && this.leftOver.length && (this.push({ data: i.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);
}, i.Utf8DecodeWorker = d, e.inherits(o, l), o.prototype.processChunk = function(c) {
this.push({ data: i.utf8encode(c.data), meta: c.meta });
}, i.Utf8EncodeWorker = o;
}, { "./nodejsUtils": 14, "./stream/GenericWorker": 28, "./support": 30, "./utils": 32 }], 32: [function(g, C, i) {
var e = g("./support"), A = g("./base64"), s = g("./nodejsUtils"), l = g("./external");
function n(h) {
return h;
}
function a(h, b) {
for (var u = 0; u < h.length; ++u) b[u] = 255 & h.charCodeAt(u);
return b;
}
g("setimmediate"), i.newBlob = function(h, b) {
i.checkSupport("blob");
try {
return new Blob([h], { type: b });
} catch {
try {
var u = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
return u.append(h), u.getBlob(b);
} catch {
throw new Error("Bug : can't construct the Blob.");
}
}
};
var d = { stringifyByChunk: function(h, b, u) {
var m = [], Z = 0, p = h.length;
if (p <= u) return String.fromCharCode.apply(null, h);
for (; Z < p; ) b === "array" || b === "nodebuffer" ? m.push(String.fromCharCode.apply(null, h.slice(Z, Math.min(Z + u, p)))) : m.push(String.fromCharCode.apply(null, h.subarray(Z, Math.min(Z + u, p)))), Z += u;
return m.join("");
}, stringifyByChar: function(h) {
for (var b = "", u = 0; u < h.length; u++) b += String.fromCharCode(h[u]);
return b;
}, applyCanBeUsed: { uint8array: function() {
try {
return e.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;
} catch {
return !1;
}
}(), nodebuffer: function() {
try {
return e.nodebuffer && String.fromCharCode.apply(null, s.allocBuffer(1)).length === 1;
} catch {
return !1;
}
}() } };
function o(h) {
var b = 65536, u = i.getTypeOf(h), m = !0;
if (u === "uint8array" ? m = d.applyCanBeUsed.uint8array : u === "nodebuffer" && (m = d.applyCanBeUsed.nodebuffer), m) for (; 1 < b; ) try {
return d.stringifyByChunk(h, u, b);
} catch {
b = Math.floor(b / 2);
}
return d.stringifyByChar(h);
}
function c(h, b) {
for (var u = 0; u < h.length; u++) b[u] = h[u];
return b;
}
i.applyFromCharCode = o;
var r = {};
r.string = { string: n, array: function(h) {
return a(h, new Array(h.length));
}, arraybuffer: function(h) {
return r.string.uint8array(h).buffer;
}, uint8array: function(h) {
return a(h, new Uint8Array(h.length));
}, nodebuffer: function(h) {
return a(h, s.allocBuffer(h.length));
} }, r.array = { string: o, array: n, arraybuffer: function(h) {
return new Uint8Array(h).buffer;
}, uint8array: function(h) {
return new Uint8Array(h);
}, nodebuffer: function(h) {
return s.newBufferFrom(h);
} }, r.arraybuffer = { string: function(h) {
return o(new Uint8Array(h));
}, array: function(h) {
return c(new Uint8Array(h), new Array(h.byteLength));
}, arraybuffer: n, uint8array: function(h) {
return new Uint8Array(h);
}, nodebuffer: function(h) {
return s.newBufferFrom(new Uint8Array(h));
} }, r.uint8array = { string: o, array: function(h) {
return c(h, new Array(h.length));
}, arraybuffer: function(h) {
return h.buffer;
}, uint8array: n, nodebuffer: function(h) {
return s.newBufferFrom(h);
} }, r.nodebuffer = { string: o, array: function(h) {
return c(h, new Array(h.length));
}, arraybuffer: function(h) {
return r.nodebuffer.uint8array(h).buffer;
}, uint8array: function(h) {
return c(h, new Uint8Array(h.length));
}, nodebuffer: n }, i.transformTo = function(h, b) {
if (b = b || "", !h) return b;
i.checkSupport(h);
var u = i.getTypeOf(b);
return r[u][h](b);
}, i.resolve = function(h) {
for (var b = h.split("/"), u = [], m = 0; m < b.length; m++) {
var Z = b[m];
Z === "." || Z === "" && m !== 0 && m !== b.length - 1 || (Z === ".." ? u.pop() : u.push(Z));
}
return u.join("/");
}, i.getTypeOf = function(h) {
return typeof h == "string" ? "string" : Object.prototype.toString.call(h) === "[object Array]" ? "array" : e.nodebuffer && s.isBuffer(h) ? "nodebuffer" : e.uint8array && h instanceof Uint8Array ? "uint8array" : e.arraybuffer && h instanceof ArrayBuffer ? "arraybuffer" : void 0;
}, i.checkSupport = function(h) {
if (!e[h.toLowerCase()]) throw new Error(h + " is not supported by this platform");
}, i.MAX_VALUE_16BITS = 65535, i.MAX_VALUE_32BITS = -1, i.pretty = function(h) {
var b, u, m = "";
for (u = 0; u < (h || "").length; u++) m += "\\x" + ((b = h.charCodeAt(u)) < 16 ? "0" : "") + b.toString(16).toUpperCase();
return m;
}, i.delay = function(h, b, u) {
setImmediate(function() {
h.apply(u || null, b || []);
});
}, i.inherits = function(h, b) {
function u() {
}
u.prototype = b.prototype, h.prototype = new u();
}, i.extend = function() {
var h, b, u = {};
for (h = 0; h < arguments.length; h++) for (b in arguments[h]) Object.prototype.hasOwnProperty.call(arguments[h], b) && u[b] === void 0 && (u[b] = arguments[h][b]);
return u;
}, i.prepareContent = function(h, b, u, m, Z) {
return l.Promise.resolve(b).then(function(p) {
return e.blob && (p instanceof Blob || ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(p)) !== -1) && typeof FileReader < "u" ? new l.Promise(function(Y, R) {
var X = new FileReader();
X.onload = function(H) {
Y(H.target.result);
}, X.onerror = function(H) {
R(H.target.error);
}, X.readAsArrayBuffer(p);
}) : p;
}).then(function(p) {
var Y = i.getTypeOf(p);
return Y ? (Y === "arraybuffer" ? p = i.transformTo("uint8array", p) : Y === "string" && (Z ? p = A.decode(p) : u && m !== !0 && (p = function(R) {
return a(R, e.uint8array ? new Uint8Array(R.length) : new Array(R.length));
}(p))), p) : l.Promise.reject(new Error("Can't read the data of '" + h + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));
});
};
}, { "./base64": 1, "./external": 6, "./nodejsUtils": 14, "./support": 30, setimmediate: 54 }], 33: [function(g, C, i) {
var e = g("./reader/readerFor"), A = g("./utils"), s = g("./signature"), l = g("./zipEntry"), n = g("./support");
function a(d) {
this.files = [], this.loadOptions = d;
}
a.prototype = { checkSignature: function(d) {
if (!this.reader.readAndCheckSignature(d)) {
this.reader.index -= 4;
var o = this.reader.readString(4);
throw new Error("Corrupted zip or bug: unexpected signature (" + A.pretty(o) + ", expected " + A.pretty(d) + ")");
}
}, isSignature: function(d, o) {
var c = this.reader.index;
this.reader.setIndex(d);
var r = this.reader.readString(4) === o;
return this.reader.setIndex(c), r;
}, readBlockEndOfCentral: function() {
this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);
var d = this.reader.readData(this.zipCommentLength), o = n.uint8array ? "uint8array" : "array", c = A.transformTo(o, d);
this.zipComment = this.loadOptions.decodeFileName(c);
}, readBlockZip64EndOfCentral: function() {
this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};
for (var d, o, c, r = this.zip64EndOfCentralSize - 44; 0 < r; ) d = this.reader.readInt(2), o = this.reader.readInt(4), c = this.reader.readData(o), this.zip64ExtensibleData[d] = { id: d, length: o, value: c };
}, readBlockZip64EndOfCentralLocator: function() {
if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), 1 < this.disksCount) throw new Error("Multi-volumes zip are not supported");
}, readLocalFiles: function() {
var d, o;
for (d = 0; d < this.files.length; d++) o = this.files[d], this.reader.setIndex(o.localHeaderOffset), this.checkSignature(s.LOCAL_FILE_HEADER), o.readLocalPart(this.reader), o.handleUTF8(), o.processAttributes();
}, readCentralDir: function() {
var d;
for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(s.CENTRAL_FILE_HEADER); ) (d = new l({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(d);
if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);
}, readEndOfCentral: function() {
var d = this.reader.lastIndexOfSignature(s.CENTRAL_DIRECTORY_END);
if (d < 0) throw this.isSignature(0, s.LOCAL_FILE_HEADER) ? new Error("Corrupted zip: can't find end of central directory") : new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html");
this.reader.setIndex(d);
var o = d;
if (this.checkSignature(s.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === A.MAX_VALUE_16BITS || this.diskWithCentralDirStart === A.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === A.MAX_VALUE_16BITS || this.centralDirRecords === A.MAX_VALUE_16BITS || this.centralDirSize === A.MAX_VALUE_32BITS || this.centralDirOffset === A.MAX_VALUE_32BITS) {
if (this.zip64 = !0, (d = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");
if (this.reader.setIndex(d), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, s.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");
this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(s.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();
}
var c = this.centralDirOffset + this.centralDirSize;
this.zip64 && (c += 20, c += 12 + this.zip64EndOfCentralSize);
var r = o - c;
if (0 < r) this.isSignature(o, s.CENTRAL_FILE_HEADER) || (this.reader.zero = r);
else if (r < 0) throw new Error("Corrupted zip: missing " + Math.abs(r) + " bytes.");
}, prepareReader: function(d) {
this.reader = e(d);
}, load: function(d) {
this.prepareReader(d), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();
} }, C.exports = a;
}, { "./reader/readerFor": 22, "./signature": 23, "./support": 30, "./utils": 32, "./zipEntry": 34 }], 34: [function(g, C, i) {
var e = g("./reader/readerFor"), A = g("./utils"), s = g("./compressedObject"), l = g("./crc32"), n = g("./utf8"), a = g("./compressions"), d = g("./support");
function o(c, r) {
this.options = c, this.loadOptions = r;
}
o.prototype = { isEncrypted: function() {
return (1 & this.bitFlag) == 1;
}, useUTF8: function() {
return (2048 & this.bitFlag) == 2048;
}, readLocalPart: function(c) {
var r, h;
if (c.skip(22), this.fileNameLength = c.readInt(2), h = c.readInt(2), this.fileName = c.readData(this.fileNameLength), c.skip(h), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");
if ((r = function(b) {
for (var u in a) if (Object.prototype.hasOwnProperty.call(a, u) && a[u].magic === b) return a[u];
return null;
}(this.compressionMethod)) === null) throw new Error("Corrupted zip : compression " + A.pretty(this.compressionMethod) + " unknown (inner file : " + A.transformTo("string", this.fileName) + ")");
this.decompressed = new s(this.compressedSize, this.uncompressedSize, this.crc32, r, c.readData(this.compressedSize));
}, readCentralPart: function(c) {
this.versionMadeBy = c.readInt(2), c.skip(2), this.bitFlag = c.readInt(2), this.compressionMethod = c.readString(2), this.date = c.readDate(), this.crc32 = c.readInt(4), this.compressedSize = c.readInt(4), this.uncompressedSize = c.readInt(4);
var r = c.readInt(2);
if (this.extraFieldsLength = c.readInt(2), this.fileCommentLength = c.readInt(2), this.diskNumberStart = c.readInt(2), this.internalFileAttributes = c.readInt(2), this.externalFileAttributes = c.readInt(4), this.localHeaderOffset = c.readInt(4), this.isEncrypted()) throw new Error("Encrypted zip are not supported");
c.skip(r), this.readExtraFields(c), this.parseZIP64ExtraField(c), this.fileComment = c.readData(this.fileCommentLength);
}, processAttributes: function() {
this.unixPermissions = null, this.dosPermissions = null;
var c = this.versionMadeBy >> 8;
this.dir = !!(16 & this.externalFileAttributes), c == 0 && (this.dosPermissions = 63 & this.externalFileAttributes), c == 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== "/" || (this.dir = !0);
}, parseZIP64ExtraField: function() {
if (this.extraFields[1]) {
var c = e(this.extraFields[1].value);
this.uncompressedSize === A.MAX_VALUE_32BITS && (this.uncompressedSize = c.readInt(8)), this.compressedSize === A.MAX_VALUE_32BITS && (this.compressedSize = c.readInt(8)), this.localHeaderOffset === A.MAX_VALUE_32BITS && (this.localHeaderOffset = c.readInt(8)), this.diskNumberStart === A.MAX_VALUE_32BITS && (this.diskNumberStart = c.readInt(4));
}
}, readExtraFields: function(c) {
var r, h, b, u = c.index + this.extraFieldsLength;
for (this.extraFields || (this.extraFields = {}); c.index + 4 < u; ) r = c.readInt(2), h = c.readInt(2), b = c.readData(h), this.extraFields[r] = { id: r, length: h, value: b };
c.setIndex(u);
}, handleUTF8: function() {
var c = d.uint8array ? "uint8array" : "array";
if (this.useUTF8()) this.fileNameStr = n.utf8decode(this.fileName), this.fileCommentStr = n.utf8decode(this.fileComment);
else {
var r = this.findExtraFieldUnicodePath();
if (r !== null) this.fileNameStr = r;
else {
var h = A.transformTo(c, this.fileName);
this.fileNameStr = this.loadOptions.decodeFileName(h);
}
var b = this.findExtraFieldUnicodeComment();
if (b !== null) this.fileCommentStr = b;
else {
var u = A.transformTo(c, this.fileComment);
this.fileCommentStr = this.loadOptions.decodeFileName(u);
}
}
}, findExtraFieldUnicodePath: function() {
var c = this.extraFields[28789];
if (c) {
var r = e(c.value);
return r.readInt(1) !== 1 || l(this.fileName) !== r.readInt(4) ? null : n.utf8decode(r.readData(c.length - 5));
}
return null;
}, findExtraFieldUnicodeComment: function() {
var c = this.extraFields[25461];
if (c) {
var r = e(c.value);
return r.readInt(1) !== 1 || l(this.fileComment) !== r.readInt(4) ? null : n.utf8decode(r.readData(c.length - 5));
}
return null;
} }, C.exports = o;
}, { "./compressedObject": 2, "./compressions": 3, "./crc32": 4, "./reader/readerFor": 22, "./support": 30, "./utf8": 31, "./utils": 32 }], 35: [function(g, C, i) {
function e(r, h, b) {
this.name = r, this.dir = b.dir, this.date = b.date, this.comment = b.comment, this.unixPermissions = b.unixPermissions, this.dosPermissions = b.dosPermissions, this._data = h, this._dataBinary = b.binary, this.options = { compression: b.compression, compressionOptions: b.compressionOptions };
}
var A = g("./stream/StreamHelper"), s = g("./stream/DataWorker"), l = g("./utf8"), n = g("./compressedObject"), a = g("./stream/GenericWorker");
e.prototype = { internalStream: function(r) {
var h = null, b = "string";
try {
if (!r) throw new Error("No output type specified.");
var u = (b = r.toLowerCase()) === "string" || b === "text";
b !== "binarystring" && b !== "text" || (b = "string"), h = this._decompressWorker();
var m = !this._dataBinary;
m && !u && (h = h.pipe(new l.Utf8EncodeWorker())), !m && u && (h = h.pipe(new l.Utf8DecodeWorker()));
} catch (Z) {
(h = new a("error")).error(Z);
}
return new A(h, b, "");
}, async: function(r, h) {
return this.internalStream(r).accumulate(h);
}, nodeStream: function(r, h) {
return this.internalStream(r || "nodebuffer").toNodejsStream(h);
}, _compressWorker: function(r, h) {
if (this._data instanceof n && this._data.compression.magic === r.magic) return this._data.getCompressedWorker();
var b = this._decompressWorker();
return this._dataBinary || (b = b.pipe(new l.Utf8EncodeWorker())), n.createWorkerFrom(b, r, h);
}, _decompressWorker: function() {
return this._data instanceof n ? this._data.getContentWorker() : this._data instanceof a ? this._data : new s(this._data);
} };
for (var d = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"], o = function() {
throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
}, c = 0; c < d.length; c++) e.prototype[d[c]] = o;
C.exports = e;
}, { "./compressedObject": 2, "./stream/DataWorker": 27, "./stream/GenericWorker": 28, "./stream/StreamHelper": 29, "./utf8": 31 }], 36: [function(g, C, i) {
(function(e) {
var A, s, l = e.MutationObserver || e.WebKitMutationObserver;
if (l) {
var n = 0, a = new l(r), d = e.document.createTextNode("");
a.observe(d, { characterData: !0 }), A = function() {
d.data = n = ++n % 2;
};
} else if (e.setImmediate || e.MessageChannel === void 0) A = "document" in e && "onreadystatechange" in e.document.createElement("script") ? function() {
var h = e.document.createElement("script");
h.onreadystatechange = function() {
r(), h.onreadystatechange = null, h.parentNode.removeChild(h), h = null;
}, e.document.documentElement.appendChild(h);
} : function() {
setTimeout(r, 0);
};
else {
var o = new e.MessageChannel();
o.port1.onmessage = r, A = function() {
o.port2.postMessage(0);
};
}
var c = [];
function r() {
var h, b;
s = !0;
for (var u = c.length; u; ) {
for (b = c, c = [], h = -1; ++h < u; ) b[h]();
u = c.length;
}
s = !1;
}
C.exports = function(h) {
c.push(h) !== 1 || s || A();
};
}).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
}, {}], 37: [function(g, C, i) {
var e = g("immediate");
function A() {
}
var s = {}, l = ["REJECTED"], n = ["FULFILLED"], a = ["PENDING"];
function d(u) {
if (typeof u != "function") throw new TypeError("resolver must be a function");
this.state = a, this.queue = [], this.outcome = void 0, u !== A && h(this, u);
}
function o(u, m, Z) {
this.promise = u, typeof m == "function" && (this.onFulfilled = m, this.callFulfilled = this.otherCallFulfilled), typeof Z == "function" && (this.onRejected = Z, this.callRejected = this.otherCallRejected);
}
function c(u, m, Z) {
e(function() {
var p;
try {
p = m(Z);
} catch (Y) {
return s.reject(u, Y);
}
p === u ? s.reject(u, new TypeError("Cannot resolve promise with itself")) : s.resolve(u, p);
});
}
function r(u) {
var m = u && u.then;
if (u && (typeof u == "object" || typeof u == "function") && typeof m == "function") return function() {
m.apply(u, arguments);
};
}
function h(u, m) {
var Z = !1;
function p(X) {
Z || (Z = !0, s.reject(u, X));
}
function Y(X) {
Z || (Z = !0, s.resolve(u, X));
}
var R = b(function() {
m(Y, p);
});
R.status === "error" && p(R.value);
}
function b(u, m) {
var Z = {};
try {
Z.value = u(m), Z.status = "success";
} catch (p) {
Z.status = "error", Z.value = p;
}
return Z;
}
(C.exports = d).prototype.finally = function(u) {
if (typeof u != "function") return this;
var m = this.constructor;
return this.then(function(Z) {
return m.resolve(u()).then(function() {
return Z;
});
}, function(Z) {
return m.resolve(u()).then(function() {
throw Z;
});
});
}, d.prototype.catch = function(u) {
return this.then(null, u);
}, d.prototype.then = function(u, m) {
if (typeof u != "function" && this.state === n || typeof m != "function" && this.state === l) return this;
var Z = new this.constructor(A);
return this.state !== a ? c(Z, this.state === n ? u : m, this.outcome) : this.queue.push(new o(Z, u, m)), Z;
}, o.prototype.callFulfilled = function(u) {
s.resolve(this.promise, u);
}, o.prototype.otherCallFulfilled = function(u) {
c(this.promise, this.onFulfilled, u);
}, o.prototype.callRejected = function(u) {
s.reject(this.promise, u);
}, o.prototype.otherCallRejected = function(u) {
c(this.promise, this.onRejected, u);
}, s.resolve = function(u, m) {
var Z = b(r, m);
if (Z.status === "error") return s.reject(u, Z.value);
var p = Z.value;
if (p) h(u, p);
else {
u.state = n, u.outcome = m;
for (var Y = -1, R = u.queue.length; ++Y < R; ) u.queue[Y].callFulfilled(m);
}
return u;
}, s.reject = function(u, m) {
u.state = l, u.outcome = m;
for (var Z = -1, p = u.queue.length; ++Z < p; ) u.queue[Z].callRejected(m);
return u;
}, d.resolve = function(u) {
return u instanceof this ? u : s.resolve(new this(A), u);
}, d.reject = function(u) {
var m = new this(A);
return s.reject(m, u);
}, d.all = function(u) {
var m = this;
if (Object.prototype.toString.call(u) !== "[object Array]") return this.reject(new TypeError("must be an array"));
var Z = u.length, p = !1;
if (!Z) return this.resolve([]);
for (var Y = new Array(Z), R = 0, X = -1, H = new this(A); ++X < Z; ) S(u[X], X);
return H;
function S(z, v) {
m.resolve(z).then(function(K) {
Y[v] = K, ++R !== Z || p || (p = !0, s.resolve(H, Y));
}, function(K) {
p || (p = !0, s.reject(H, K));
});
}
}, d.race = function(u) {
var m = this;
if (Object.prototype.toString.call(u) !== "[object Array]") return this.reject(new TypeError("must be an array"));
var Z = u.length, p = !1;
if (!Z) return this.resolve([]);
for (var Y = -1, R = new this(A); ++Y < Z; ) X = u[Y], m.resolve(X).then(function(H) {
p || (p = !0, s.resolve(R, H));
}, function(H) {
p || (p = !0, s.reject(R, H));
});
var X;
return R;
};
}, { immediate: 36 }], 38: [function(g, C, i) {
var e = {};
(0, g("./lib/utils/common").assign)(e, g("./lib/deflate"), g("./lib/inflate"), g("./lib/zlib/constants")), C.exports = e;
}, { "./lib/deflate": 39, "./lib/inflate": 40, "./lib/utils/common": 41, "./lib/zlib/constants": 44 }], 39: [function(g, C, i) {
var e = g("./zlib/deflate"), A = g("./utils/common"), s = g("./utils/strings"), l = g("./zlib/messages"), n = g("./zlib/zstream"), a = Object.prototype.toString, d = 0, o = -1, c = 0, r = 8;
function h(u) {
if (!(this instanceof h)) return new h(u);
this.options = A.assign({ level: o, method: r, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: c, to: "" }, u || {});
var m = this.options;
m.raw && 0 < m.windowBits ? m.windowBits = -m.windowBits : m.gzip && 0 < m.windowBits && m.windowBits < 16 && (m.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new n(), this.strm.avail_out = 0;
var Z = e.deflateInit2(this.strm, m.level, m.method, m.windowBits, m.memLevel, m.strategy);
if (Z !== d) throw new Error(l[Z]);
if (m.header && e.deflateSetHeader(this.strm, m.header), m.dictionary) {
var p;
if (p = typeof m.dictionary == "string" ? s.string2buf(m.dictionary) : a.call(m.dictionary) === "[object ArrayBuffer]" ? new Uint8Array(m.dictionary) : m.dictionary, (Z = e.deflateSetDictionary(this.strm, p)) !== d) throw new Error(l[Z]);
this._dict_set = !0;
}
}
function b(u, m) {
var Z = new h(m);
if (Z.push(u, !0), Z.err) throw Z.msg || l[Z.err];
return Z.result;
}
h.prototype.push = function(u, m) {
var Z, p, Y = this.strm, R = this.options.chunkSize;
if (this.ended) return !1;
p = m === ~~m ? m : m === !0 ? 4 : 0, typeof u == "string" ? Y.input = s.string2buf(u) : a.call(u) === "[object ArrayBuffer]" ? Y.input = new Uint8Array(u) : Y.input = u, Y.next_in = 0, Y.avail_in = Y.input.length;
do {
if (Y.avail_out === 0 && (Y.output = new A.Buf8(R), Y.next_out = 0, Y.avail_out = R), (Z = e.deflate(Y, p)) !== 1 && Z !== d) return this.onEnd(Z), !(this.ended = !0);
Y.avail_out !== 0 && (Y.avail_in !== 0 || p !== 4 && p !== 2) || (this.options.to === "string" ? this.onData(s.buf2binstring(A.shrinkBuf(Y.output, Y.next_out))) : this.onData(A.shrinkBuf(Y.output, Y.next_out)));
} while ((0 < Y.avail_in || Y.avail_out === 0) && Z !== 1);
return p === 4 ? (Z = e.deflateEnd(this.strm), this.onEnd(Z), this.ended = !0, Z === d) : p !== 2 || (this.onEnd(d), !(Y.avail_out = 0));
}, h.prototype.onData = function(u) {
this.chunks.push(u);
}, h.prototype.onEnd = function(u) {
u === d && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = A.flattenChunks(this.chunks)), this.chunks = [], this.err = u, this.msg = this.strm.msg;
}, i.Deflate = h, i.deflate = b, i.deflateRaw = function(u, m) {
return (m = m || {}).raw = !0, b(u, m);
}, i.gzip = function(u, m) {
return (m = m || {}).gzip = !0, b(u, m);
};
}, { "./utils/common": 41, "./utils/strings": 42, "./zlib/deflate": 46, "./zlib/messages": 51, "./zlib/zstream": 53 }], 40: [function(g, C, i) {
var e = g("./zlib/inflate"), A = g("./utils/common"), s = g("./utils/strings"), l = g("./zlib/constants"), n = g("./zlib/messages"), a = g("./zlib/zstream"), d = g("./zlib/gzheader"), o = Object.prototype.toString;
function c(h) {
if (!(this instanceof c)) return new c(h);
this.options = A.assign({ chunkSize: 16384, windowBits: 0, to: "" }, h || {});
var b = this.options;
b.raw && 0 <= b.windowBits && b.windowBits < 16 && (b.windowBits = -b.windowBits, b.windowBits === 0 && (b.windowBits = -15)), !(0 <= b.windowBits && b.windowBits < 16) || h && h.windowBits || (b.windowBits += 32), 15 < b.windowBits && b.windowBits < 48 && (15 & b.windowBits) == 0 && (b.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new a(), this.strm.avail_out = 0;
var u = e.inflateInit2(this.strm, b.windowBits);
if (u !== l.Z_OK) throw new Error(n[u]);
this.header = new d(), e.inflateGetHeader(this.strm, this.header);
}
function r(h, b) {
var u = new c(b);
if (u.push(h, !0), u.err) throw u.msg || n[u.err];
return u.result;
}
c.prototype.push = function(h, b) {
var u, m, Z, p, Y, R, X = this.strm, H = this.options.chunkSize, S = this.options.dictionary, z = !1;
if (this.ended) return !1;
m = b === ~~b ? b : b === !0 ? l.Z_FINISH : l.Z_NO_FLUSH, typeof h == "string" ? X.input = s.binstring2buf(h) : o.call(h) === "[object ArrayBuffer]" ? X.input = new Uint8Array(h) : X.input = h, X.next_in = 0, X.avail_in = X.input.length;
do {
if (X.avail_out === 0 && (X.output = new A.Buf8(H), X.next_out = 0, X.avail_out = H), (u = e.inflate(X, l.Z_NO_FLUSH)) === l.Z_NEED_DICT && S && (R = typeof S == "string" ? s.string2buf(S) : o.call(S) === "[object ArrayBuffer]" ? new Uint8Array(S) : S, u = e.inflateSetDictionary(this.strm, R)), u === l.Z_BUF_ERROR && z === !0 && (u = l.Z_OK, z = !1), u !== l.Z_STREAM_END && u !== l.Z_OK) return this.onEnd(u), !(this.ended = !0);
X.next_out && (X.avail_out !== 0 && u !== l.Z_STREAM_END && (X.avail_in !== 0 || m !== l.Z_FINISH && m !== l.Z_SYNC_FLUSH) || (this.options.to === "string" ? (Z = s.utf8border(X.output, X.next_out), p = X.next_out - Z, Y = s.buf2string(X.output, Z), X.next_out = p, X.avail_out = H - p, p && A.arraySet(X.output, X.output, Z, p, 0), this.onData(Y)) : this.onData(A.shrinkBuf(X.output, X.next_out)))), X.avail_in === 0 && X.avail_out === 0 && (z = !0);
} while ((0 < X.avail_in || X.avail_out === 0) && u !== l.Z_STREAM_END);
return u === l.Z_STREAM_END && (m = l.Z_FINISH), m === l.Z_FINISH ? (u = e.inflateEnd(this.strm), this.onEnd(u), this.ended = !0, u === l.Z_OK) : m !== l.Z_SYNC_FLUSH || (this.onEnd(l.Z_OK), !(X.avail_out = 0));
}, c.prototype.onData = function(h) {
this.chunks.push(h);
}, c.prototype.onEnd = function(h) {
h === l.Z_OK && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = A.flattenChunks(this.chunks)), this.chunks = [], this.err = h, this.msg = this.strm.msg;
}, i.Inflate = c, i.inflate = r, i.inflateRaw = function(h, b) {
return (b = b || {}).raw = !0, r(h, b);
}, i.ungzip = r;
}, { "./utils/common": 41, "./utils/strings": 42, "./zlib/constants": 44, "./zlib/gzheader": 47, "./zlib/inflate": 49, "./zlib/messages": 51, "./zlib/zstream": 53 }], 41: [function(g, C, i) {
var e = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Int32Array < "u";
i.assign = function(l) {
for (var n = Array.prototype.slice.call(arguments, 1); n.length; ) {
var a = n.shift();
if (a) {
if (typeof a != "object") throw new TypeError(a + "must be non-object");
for (var d in a) a.hasOwnProperty(d) && (l[d] = a[d]);
}
}
return l;
}, i.shrinkBuf = function(l, n) {
return l.length === n ? l : l.subarray ? l.subarray(0, n) : (l.length = n, l);
};
var A = { arraySet: function(l, n, a, d, o) {
if (n.subarray && l.subarray) l.set(n.subarray(a, a + d), o);
else for (var c = 0; c < d; c++) l[o + c] = n[a + c];
}, flattenChunks: function(l) {
var n, a, d, o, c, r;
for (n = d = 0, a = l.length; n < a; n++) d += l[n].length;
for (r = new Uint8Array(d), n = o = 0, a = l.length; n < a; n++) c = l[n], r.set(c, o), o += c.length;
return r;
} }, s = { arraySet: function(l, n, a, d, o) {
for (var c = 0; c < d; c++) l[o + c] = n[a + c];
}, flattenChunks: function(l) {
return [].concat.apply([], l);
} };
i.setTyped = function(l) {
l ? (i.Buf8 = Uint8Array, i.Buf16 = Uint16Array, i.Buf32 = Int32Array, i.assign(i, A)) : (i.Buf8 = Array, i.Buf16 = Array, i.Buf32 = Array, i.assign(i, s));
}, i.setTyped(e);
}, {}], 42: [function(g, C, i) {
var e = g("./common"), A = !0, s = !0;
try {
String.fromCharCode.apply(null, [0]);
} catch {
A = !1;
}
try {
String.fromCharCode.apply(null, new Uint8Array(1));
} catch {
s = !1;
}
for (var l = new e.Buf8(256), n = 0; n < 256; n++) l[n] = 252 <= n ? 6 : 248 <= n ? 5 : 240 <= n ? 4 : 224 <= n ? 3 : 192 <= n ? 2 : 1;
function a(d, o) {
if (o < 65537 && (d.subarray && s || !d.subarray && A)) return String.fromCharCode.apply(null, e.shrinkBuf(d, o));
for (var c = "", r = 0; r < o; r++) c += String.fromCharCode(d[r]);
return c;
}
l[254] = l[254] = 1, i.string2buf = function(d) {
var o, c, r, h, b, u = d.length, m = 0;
for (h = 0; h < u; h++) (64512 & (c = d.charCodeAt(h))) == 55296 && h + 1 < u && (64512 & (r = d.charCodeAt(h + 1))) == 56320 && (c = 65536 + (c - 55296 << 10) + (r - 56320), h++), m += c < 128 ? 1 : c < 2048 ? 2 : c < 65536 ? 3 : 4;
for (o = new e.Buf8(m), h = b = 0; b < m; h++) (64512 & (c = d.charCodeAt(h))) == 55296 && h + 1 < u && (64512 & (r = d.charCodeAt(h + 1))) == 56320 && (c = 65536 + (c - 55296 << 10) + (r - 56320), h++), c < 128 ? o[b++] = c : (c < 2048 ? o[b++] = 192 | c >>> 6 : (c < 65536 ? o[b++] = 224 | c >>> 12 : (o[b++] = 240 | c >>> 18, o[b++] = 128 | c >>> 12 & 63), o[b++] = 128 | c >>> 6 & 63), o[b++] = 128 | 63 & c);
return o;
}, i.buf2binstring = function(d) {
return a(d, d.length);
}, i.binstring2buf = function(d) {
for (var o = new e.Buf8(d.length), c = 0, r = o.length; c < r; c++) o[c] = d.charCodeAt(c);
return o;
}, i.buf2string = function(d, o) {
var c, r, h, b, u = o || d.length, m = new Array(2 * u);
for (c = r = 0; c < u; ) if ((h = d[c++]) < 128) m[r++] = h;
else if (4 < (b = l[h])) m[r++] = 65533, c += b - 1;
else {
for (h &= b === 2 ? 31 : b === 3 ? 15 : 7; 1 < b && c < u; ) h = h << 6 | 63 & d[c++], b--;
1 < b ? m[r++] = 65533 : h < 65536 ? m[r++] = h : (h -= 65536, m[r++] = 55296 | h >> 10 & 1023, m[r++] = 56320 | 1023 & h);
}
return a(m, r);
}, i.utf8border = function(d, o) {
var c;
for ((o = o || d.length) > d.length && (o = d.length), c = o - 1; 0 <= c && (192 & d[c]) == 128; ) c--;
return c < 0 || c === 0 ? o : c + l[d[c]] > o ? c : o;
};
}, { "./common": 41 }], 43: [function(g, C, i) {
C.exports = function(e, A, s, l) {
for (var n = 65535 & e | 0, a = e >>> 16 & 65535 | 0, d = 0; s !== 0; ) {
for (s -= d = 2e3 < s ? 2e3 : s; a = a + (n = n + A[l++] | 0) | 0, --d; ) ;
n %= 65521, a %= 65521;
}
return n | a << 16 | 0;
};
}, {}], 44: [function(g, C, i) {
C.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 };
}, {}], 45: [function(g, C, i) {
var e = function() {
for (var A, s = [], l = 0; l < 256; l++) {
A = l;
for (var n = 0; n < 8; n++) A = 1 & A ? 3988292384 ^ A >>> 1 : A >>> 1;
s[l] = A;
}
return s;
}();
C.exports = function(A, s, l, n) {
var a = e, d = n + l;
A ^= -1;
for (var o = n; o < d; o++) A = A >>> 8 ^ a[255 & (A ^ s[o])];
return -1 ^ A;
};
}, {}], 46: [function(g, C, i) {
var e, A = g("../utils/common"), s = g("./trees"), l = g("./adler32"), n = g("./crc32"), a = g("./messages"), d = 0, o = 4, c = 0, r = -2, h = -1, b = 4, u = 2, m = 8, Z = 9, p = 286, Y = 30, R = 19, X = 2 * p + 1, H = 15, S = 3, z = 258, v = z + S + 1, K = 42, V = 113, N = 1, B = 2, G = 3, w = 4;
function W(x, Ag) {
return x.msg = a[Ag], Ag;
}
function y(x) {
return (x << 1) - (4 < x ? 9 : 0);
}
function f(x) {
for (var Ag = x.length; 0 <= --Ag; ) x[Ag] = 0;
}
function D(x) {
var Ag = x.state, eg = Ag.pending;
eg > x.avail_out && (eg = x.avail_out), eg !== 0 && (A.arraySet(x.output, Ag.pending_buf, Ag.pending_out, eg, x.next_out), x.next_out += eg, Ag.pending_out += eg, x.total_out += eg, x.avail_out -= eg, Ag.pending -= eg, Ag.pending === 0 && (Ag.pending_out = 0));
}
function F(x, Ag) {
s._tr_flush_block(x, 0 <= x.block_start ? x.block_start : -1, x.strstart - x.block_start, Ag), x.block_start = x.strstart, D(x.strm);
}
function T(x, Ag) {
x.pending_buf[x.pending++] = Ag;
}
function Q(x, Ag) {
x.pending_buf[x.pending++] = Ag >>> 8 & 255, x.pending_buf[x.pending++] = 255 & Ag;
}
function P(x, Ag) {
var eg, O, _ = x.max_chain_length, gg = x.strstart, lg = x.prev_length, ng = x.nice_match, sg = x.strstart > x.w_size - v ? x.strstart - (x.w_size - v) : 0, og = x.window, cg = x.w_mask, rg = x.prev, dg = x.strstart + z, Bg = og[gg + lg - 1], Zg = og[gg + lg];
x.prev_length >= x.good_match && (_ >>= 2), ng > x.lookahead && (ng = x.lookahead);
do
if (og[(eg = Ag) + lg] === Zg && og[eg + lg - 1] === Bg && og[eg] === og[gg] && og[++eg] === og[gg + 1]) {
gg += 2, eg++;
do
;
while (og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && og[++gg] === og[++eg] && gg < dg);
if (O = z - (dg - gg), gg = dg - z, lg < O) {
if (x.match_start = Ag, ng <= (lg = O)) break;
Bg = og[gg + lg - 1], Zg = og[gg + lg];
}
}
while ((Ag = rg[Ag & cg]) > sg && --_ != 0);
return lg <= x.lookahead ? lg : x.lookahead;
}
function L(x) {
var Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg = x.w_size;
do {
if (_ = x.window_size - x.lookahead - x.strstart, x.strstart >= rg + (rg - v)) {
for (A.arraySet(x.window, x.window, rg, rg, 0), x.match_start -= rg, x.strstart -= rg, x.block_start -= rg, Ag = eg = x.hash_size; O = x.head[--Ag], x.head[Ag] = rg <= O ? O - rg : 0, --eg; ) ;
for (Ag = eg = rg; O = x.prev[--Ag], x.prev[Ag] = rg <= O ? O - rg : 0, --eg; ) ;
_ += rg;
}
if (x.strm.avail_in === 0) break;
if (lg = x.strm, ng = x.window, sg = x.strstart + x.lookahead, og = _, cg = void 0, cg = lg.avail_in, og < cg && (cg = og), eg = cg === 0 ? 0 : (lg.avail_in -= cg, A.arraySet(ng, lg.input, lg.next_in, cg, sg), lg.state.wrap === 1 ? lg.adler = l(lg.adler, ng, cg, sg) : lg.state.wrap === 2 && (lg.adler = n(lg.adler, ng, cg, sg)), lg.next_in += cg, lg.total_in += cg, cg), x.lookahead += eg, x.lookahead + x.insert >= S) for (gg = x.strstart - x.insert, x.ins_h = x.window[gg], x.ins_h = (x.ins_h << x.hash_shift ^ x.window[gg + 1]) & x.hash_mask; x.insert && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[gg + S - 1]) & x.hash_mask, x.prev[gg & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = gg, gg++, x.insert--, !(x.lookahead + x.insert < S)); ) ;
} while (x.lookahead < v && x.strm.avail_in !== 0);
}
function E(x, Ag) {
for (var eg, O; ; ) {
if (x.lookahead < v) {
if (L(x), x.lookahead < v && Ag === d) return N;
if (x.lookahead === 0) break;
}
if (eg = 0, x.lookahead >= S && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart), eg !== 0 && x.strstart - eg <= x.w_size - v && (x.match_length = P(x, eg)), x.match_length >= S) if (O = s._tr_tally(x, x.strstart - x.match_start, x.match_length - S), x.lookahead -= x.match_length, x.match_length <= x.max_lazy_match && x.lookahead >= S) {
for (x.match_length--; x.strstart++, x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart, --x.match_length != 0; ) ;
x.strstart++;
} else x.strstart += x.match_length, x.match_length = 0, x.ins_h = x.window[x.strstart], x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + 1]) & x.hash_mask;
else O = s._tr_tally(x, 0, x.window[x.strstart]), x.lookahead--, x.strstart++;
if (O && (F(x, !1), x.strm.avail_out === 0)) return N;
}
return x.insert = x.strstart < S - 1 ? x.strstart : S - 1, Ag === o ? (F(x, !0), x.strm.avail_out === 0 ? G : w) : x.last_lit && (F(x, !1), x.strm.avail_out === 0) ? N : B;
}
function J(x, Ag) {
for (var eg, O, _; ; ) {
if (x.lookahead < v) {
if (L(x), x.lookahead < v && Ag === d) return N;
if (x.lookahead === 0) break;
}
if (eg = 0, x.lookahead >= S && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart), x.prev_length = x.match_length, x.prev_match = x.match_start, x.match_length = S - 1, eg !== 0 && x.prev_length < x.max_lazy_match && x.strstart - eg <= x.w_size - v && (x.match_length = P(x, eg), x.match_length <= 5 && (x.strategy === 1 || x.match_length === S && 4096 < x.strstart - x.match_start) && (x.match_length = S - 1)), x.prev_length >= S && x.match_length <= x.prev_length) {
for (_ = x.strstart + x.lookahead - S, O = s._tr_tally(x, x.strstart - 1 - x.prev_match, x.prev_length - S), x.lookahead -= x.prev_length - 1, x.prev_length -= 2; ++x.strstart <= _ && (x.ins_h = (x.ins_h << x.hash_shift ^ x.window[x.strstart + S - 1]) & x.hash_mask, eg = x.prev[x.strstart & x.w_mask] = x.head[x.ins_h], x.head[x.ins_h] = x.strstart), --x.prev_length != 0; ) ;
if (x.match_available = 0, x.match_length = S - 1, x.strstart++, O && (F(x, !1), x.strm.avail_out === 0)) return N;
} else if (x.match_available) {
if ((O = s._tr_tally(x, 0, x.window[x.strstart - 1])) && F(x, !1), x.strstart++, x.lookahead--, x.strm.avail_out === 0) return N;
} else x.match_available = 1, x.strstart++, x.lookahead--;
}
return x.match_available && (O = s._tr_tally(x, 0, x.window[x.strstart - 1]), x.match_available = 0), x.insert = x.strstart < S - 1 ? x.strstart : S - 1, Ag === o ? (F(x, !0), x.strm.avail_out === 0 ? G : w) : x.last_lit && (F(x, !1), x.strm.avail_out === 0) ? N : B;
}
function k(x, Ag, eg, O, _) {
this.good_length = x, this.max_lazy = Ag, this.nice_length = eg, this.max_chain = O, this.func = _;
}
function j() {
this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = m, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new A.Buf16(2 * X), this.dyn_dtree = new A.Buf16(2 * (2 * Y + 1)), this.bl_tree = new A.Buf16(2 * (2 * R + 1)), f(this.dyn_ltree), f(this.dyn_dtree), f(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new A.Buf16(H + 1), this.heap = new A.Buf16(2 * p + 1), f(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new A.Buf16(2 * p + 1), f(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;
}
function q(x) {
var Ag;
return x && x.state ? (x.total_in = x.total_out = 0, x.data_type = u, (Ag = x.state).pending = 0, Ag.pending_out = 0, Ag.wrap < 0 && (Ag.wrap = -Ag.wrap), Ag.status = Ag.wrap ? K : V, x.adler = Ag.wrap === 2 ? 0 : 1, Ag.last_flush = d, s._tr_init(Ag), c) : W(x, r);
}
function Cg(x) {
var Ag = q(x);
return Ag === c && function(eg) {
eg.window_size = 2 * eg.w_size, f(eg.head), eg.max_lazy_match = e[eg.level].max_lazy, eg.good_match = e[eg.level].good_length, eg.nice_match = e[eg.level].nice_length, eg.max_chain_length = e[eg.level].max_chain, eg.strstart = 0, eg.block_start = 0, eg.lookahead = 0, eg.insert = 0, eg.match_length = eg.prev_length = S - 1, eg.match_available = 0, eg.ins_h = 0;
}(x.state), Ag;
}
function Ig(x, Ag, eg, O, _, gg) {
if (!x) return r;
var lg = 1;
if (Ag === h && (Ag = 6), O < 0 ? (lg = 0, O = -O) : 15 < O && (lg = 2, O -= 16), _ < 1 || Z < _ || eg !== m || O < 8 || 15 < O || Ag < 0 || 9 < Ag || gg < 0 || b < gg) return W(x, r);
O === 8 && (O = 9);
var ng = new j();
return (x.state = ng).strm = x, ng.wrap = lg, ng.gzhead = null, ng.w_bits = O, ng.w_size = 1 << ng.w_bits, ng.w_mask = ng.w_size - 1, ng.hash_bits = _ + 7, ng.hash_size = 1 << ng.hash_bits, ng.hash_mask = ng.hash_size - 1, ng.hash_shift = ~~((ng.hash_bits + S - 1) / S), ng.window = new A.Buf8(2 * ng.w_size), ng.head = new A.Buf16(ng.hash_size), ng.prev = new A.Buf16(ng.w_size), ng.lit_bufsize = 1 << _ + 6, ng.pending_buf_size = 4 * ng.lit_bufsize, ng.pending_buf = new A.Buf8(ng.pending_buf_size), ng.d_buf = 1 * ng.lit_bufsize, ng.l_buf = 3 * ng.lit_bufsize, ng.level = Ag, ng.strategy = gg, ng.method = eg, Cg(x);
}
e = [new k(0, 0, 0, 0, function(x, Ag) {
var eg = 65535;
for (eg > x.pending_buf_size - 5 && (eg = x.pending_buf_size - 5); ; ) {
if (x.lookahead <= 1) {
if (L(x), x.lookahead === 0 && Ag === d) return N;
if (x.lookahead === 0) break;
}
x.strstart += x.lookahead, x.lookahead = 0;
var O = x.block_start + eg;
if ((x.strstart === 0 || x.strstart >= O) && (x.lookahead = x.strstart - O, x.strstart = O, F(x, !1), x.strm.avail_out === 0) || x.strstart - x.block_start >= x.w_size - v && (F(x, !1), x.strm.avail_out === 0)) return N;
}
return x.insert = 0, Ag === o ? (F(x, !0), x.strm.avail_out === 0 ? G : w) : (x.strstart > x.block_start && (F(x, !1), x.strm.avail_out), N);
}), new k(4, 4, 8, 4, E), new k(4, 5, 16, 8, E), new k(4, 6, 32, 32, E), new k(4, 4, 16, 16, J), new k(8, 16, 32, 32, J), new k(8, 16, 128, 128, J), new k(8, 32, 128, 256, J), new k(32, 128, 258, 1024, J), new k(32, 258, 258, 4096, J)], i.deflateInit = function(x, Ag) {
return Ig(x, Ag, m, 15, 8, 0);
}, i.deflateInit2 = Ig, i.deflateReset = Cg, i.deflateResetKeep = q, i.deflateSetHeader = function(x, Ag) {
return x && x.state ? x.state.wrap !== 2 ? r : (x.state.gzhead = Ag, c) : r;
}, i.deflate = function(x, Ag) {
var eg, O, _, gg;
if (!x || !x.state || 5 < Ag || Ag < 0) return x ? W(x, r) : r;
if (O = x.state, !x.output || !x.input && x.avail_in !== 0 || O.status === 666 && Ag !== o) return W(x, x.avail_out === 0 ? -5 : r);
if (O.strm = x, eg = O.last_flush, O.last_flush = Ag, O.status === K) if (O.wrap === 2) x.adler = 0, T(O, 31), T(O, 139), T(O, 8), O.gzhead ? (T(O, (O.gzhead.text ? 1 : 0) + (O.gzhead.hcrc ? 2 : 0) + (O.gzhead.extra ? 4 : 0) + (O.gzhead.name ? 8 : 0) + (O.gzhead.comment ? 16 : 0)), T(O, 255 & O.gzhead.time), T(O, O.gzhead.time >> 8 & 255), T(O, O.gzhead.time >> 16 & 255), T(O, O.gzhead.time >> 24 & 255), T(O, O.level === 9 ? 2 : 2 <= O.strategy || O.level < 2 ? 4 : 0), T(O, 255 & O.gzhead.os), O.gzhead.extra && O.gzhead.extra.length && (T(O, 255 & O.gzhead.extra.length), T(O, O.gzhead.extra.length >> 8 & 255)), O.gzhead.hcrc && (x.adler = n(x.adler, O.pending_buf, O.pending, 0)), O.gzindex = 0, O.status = 69) : (T(O, 0), T(O, 0), T(O, 0), T(O, 0), T(O, 0), T(O, O.level === 9 ? 2 : 2 <= O.strategy || O.level < 2 ? 4 : 0), T(O, 3), O.status = V);
else {
var lg = m + (O.w_bits - 8 << 4) << 8;
lg |= (2 <= O.strategy || O.level < 2 ? 0 : O.level < 6 ? 1 : O.level === 6 ? 2 : 3) << 6, O.strstart !== 0 && (lg |= 32), lg += 31 - lg % 31, O.status = V, Q(O, lg), O.strstart !== 0 && (Q(O, x.adler >>> 16), Q(O, 65535 & x.adler)), x.adler = 1;
}
if (O.status === 69) if (O.gzhead.extra) {
for (_ = O.pending; O.gzindex < (65535 & O.gzhead.extra.length) && (O.pending !== O.pending_buf_size || (O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), D(x), _ = O.pending, O.pending !== O.pending_buf_size)); ) T(O, 255 & O.gzhead.extra[O.gzindex]), O.gzindex++;
O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), O.gzindex === O.gzhead.extra.length && (O.gzindex = 0, O.status = 73);
} else O.status = 73;
if (O.status === 73) if (O.gzhead.name) {
_ = O.pending;
do {
if (O.pending === O.pending_buf_size && (O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), D(x), _ = O.pending, O.pending === O.pending_buf_size)) {
gg = 1;
break;
}
gg = O.gzindex < O.gzhead.name.length ? 255 & O.gzhead.name.charCodeAt(O.gzindex++) : 0, T(O, gg);
} while (gg !== 0);
O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), gg === 0 && (O.gzindex = 0, O.status = 91);
} else O.status = 91;
if (O.status === 91) if (O.gzhead.comment) {
_ = O.pending;
do {
if (O.pending === O.pending_buf_size && (O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), D(x), _ = O.pending, O.pending === O.pending_buf_size)) {
gg = 1;
break;
}
gg = O.gzindex < O.gzhead.comment.length ? 255 & O.gzhead.comment.charCodeAt(O.gzindex++) : 0, T(O, gg);
} while (gg !== 0);
O.gzhead.hcrc && O.pending > _ && (x.adler = n(x.adler, O.pending_buf, O.pending - _, _)), gg === 0 && (O.status = 103);
} else O.status = 103;
if (O.status === 103 && (O.gzhead.hcrc ? (O.pending + 2 > O.pending_buf_size && D(x), O.pending + 2 <= O.pending_buf_size && (T(O, 255 & x.adler), T(O, x.adler >> 8 & 255), x.adler = 0, O.status = V)) : O.status = V), O.pending !== 0) {
if (D(x), x.avail_out === 0) return O.last_flush = -1, c;
} else if (x.avail_in === 0 && y(Ag) <= y(eg) && Ag !== o) return W(x, -5);
if (O.status === 666 && x.avail_in !== 0) return W(x, -5);
if (x.avail_in !== 0 || O.lookahead !== 0 || Ag !== d && O.status !== 666) {
var ng = O.strategy === 2 ? function(sg, og) {
for (var cg; ; ) {
if (sg.lookahead === 0 && (L(sg), sg.lookahead === 0)) {
if (og === d) return N;
break;
}
if (sg.match_length = 0, cg = s._tr_tally(sg, 0, sg.window[sg.strstart]), sg.lookahead--, sg.strstart++, cg && (F(sg, !1), sg.strm.avail_out === 0)) return N;
}
return sg.insert = 0, og === o ? (F(sg, !0), sg.strm.avail_out === 0 ? G : w) : sg.last_lit && (F(sg, !1), sg.strm.avail_out === 0) ? N : B;
}(O, Ag) : O.strategy === 3 ? function(sg, og) {
for (var cg, rg, dg, Bg, Zg = sg.window; ; ) {
if (sg.lookahead <= z) {
if (L(sg), sg.lookahead <= z && og === d) return N;
if (sg.lookahead === 0) break;
}
if (sg.match_length = 0, sg.lookahead >= S && 0 < sg.strstart && (rg = Zg[dg = sg.strstart - 1]) === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg]) {
Bg = sg.strstart + z;
do
;
while (rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && rg === Zg[++dg] && dg < Bg);
sg.match_length = z - (Bg - dg), sg.match_length > sg.lookahead && (sg.match_length = sg.lookahead);
}
if (sg.match_length >= S ? (cg = s._tr_tally(sg, 1, sg.match_length - S), sg.lookahead -= sg.match_length, sg.strstart += sg.match_length, sg.match_length = 0) : (cg = s._tr_tally(sg, 0, sg.window[sg.strstart]), sg.lookahead--, sg.strstart++), cg && (F(sg, !1), sg.strm.avail_out === 0)) return N;
}
return sg.insert = 0, og === o ? (F(sg, !0), sg.strm.avail_out === 0 ? G : w) : sg.last_lit && (F(sg, !1), sg.strm.avail_out === 0) ? N : B;
}(O, Ag) : e[O.level].func(O, Ag);
if (ng !== G && ng !== w || (O.status = 666), ng === N || ng === G) return x.avail_out === 0 && (O.last_flush = -1), c;
if (ng === B && (Ag === 1 ? s._tr_align(O) : Ag !== 5 && (s._tr_stored_block(O, 0, 0, !1), Ag === 3 && (f(O.head), O.lookahead === 0 && (O.strstart = 0, O.block_start = 0, O.insert = 0))), D(x), x.avail_out === 0)) return O.last_flush = -1, c;
}
return Ag !== o ? c : O.wrap <= 0 ? 1 : (O.wrap === 2 ? (T(O, 255 & x.adler), T(O, x.adler >> 8 & 255), T(O, x.adler >> 16 & 255), T(O, x.adler >> 24 & 255), T(O, 255 & x.total_in), T(O, x.total_in >> 8 & 255), T(O, x.total_in >> 16 & 255), T(O, x.total_in >> 24 & 255)) : (Q(O, x.adler >>> 16), Q(O, 65535 & x.adler)), D(x), 0 < O.wrap && (O.wrap = -O.wrap), O.pending !== 0 ? c : 1);
}, i.deflateEnd = function(x) {
var Ag;
return x && x.state ? (Ag = x.state.status) !== K && Ag !== 69 && Ag !== 73 && Ag !== 91 && Ag !== 103 && Ag !== V && Ag !== 666 ? W(x, r) : (x.state = null, Ag === V ? W(x, -3) : c) : r;
}, i.deflateSetDictionary = function(x, Ag) {
var eg, O, _, gg, lg, ng, sg, og, cg = Ag.length;
if (!x || !x.state || (gg = (eg = x.state).wrap) === 2 || gg === 1 && eg.status !== K || eg.lookahead) return r;
for (gg === 1 && (x.adler = l(x.adler, Ag, cg, 0)), eg.wrap = 0, cg >= eg.w_size && (gg === 0 && (f(eg.head), eg.strstart = 0, eg.block_start = 0, eg.insert = 0), og = new A.Buf8(eg.w_size), A.arraySet(og, Ag, cg - eg.w_size, eg.w_size, 0), Ag = og, cg = eg.w_size), lg = x.avail_in, ng = x.next_in, sg = x.input, x.avail_in = cg, x.next_in = 0, x.input = Ag, L(eg); eg.lookahead >= S; ) {
for (O = eg.strstart, _ = eg.lookahead - (S - 1); eg.ins_h = (eg.ins_h << eg.hash_shift ^ eg.window[O + S - 1]) & eg.hash_mask, eg.prev[O & eg.w_mask] = eg.head[eg.ins_h], eg.head[eg.ins_h] = O, O++, --_; ) ;
eg.strstart = O, eg.lookahead = S - 1, L(eg);
}
return eg.strstart += eg.lookahead, eg.block_start = eg.strstart, eg.insert = eg.lookahead, eg.lookahead = 0, eg.match_length = eg.prev_length = S - 1, eg.match_available = 0, x.next_in = ng, x.input = sg, x.avail_in = lg, eg.wrap = gg, c;
}, i.deflateInfo = "pako deflate (from Nodeca project)";
}, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./messages": 51, "./trees": 52 }], 47: [function(g, C, i) {
C.exports = function() {
this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1;
};
}, {}], 48: [function(g, C, i) {
C.exports = function(e, A) {
var s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B;
s = e.state, l = e.next_in, N = e.input, n = l + (e.avail_in - 5), a = e.next_out, B = e.output, d = a - (A - e.avail_out), o = a + (e.avail_out - 257), c = s.dmax, r = s.wsize, h = s.whave, b = s.wnext, u = s.window, m = s.hold, Z = s.bits, p = s.lencode, Y = s.distcode, R = (1 << s.lenbits) - 1, X = (1 << s.distbits) - 1;
g: do {
Z < 15 && (m += N[l++] << Z, Z += 8, m += N[l++] << Z, Z += 8), H = p[m & R];
I: for (; ; ) {
if (m >>>= S = H >>> 24, Z -= S, (S = H >>> 16 & 255) === 0) B[a++] = 65535 & H;
else {
if (!(16 & S)) {
if ((64 & S) == 0) {
H = p[(65535 & H) + (m & (1 << S) - 1)];
continue I;
}
if (32 & S) {
s.mode = 12;
break g;
}
e.msg = "invalid literal/length code", s.mode = 30;
break g;
}
z = 65535 & H, (S &= 15) && (Z < S && (m += N[l++] << Z, Z += 8), z += m & (1 << S) - 1, m >>>= S, Z -= S), Z < 15 && (m += N[l++] << Z, Z += 8, m += N[l++] << Z, Z += 8), H = Y[m & X];
C: for (; ; ) {
if (m >>>= S = H >>> 24, Z -= S, !(16 & (S = H >>> 16 & 255))) {
if ((64 & S) == 0) {
H = Y[(65535 & H) + (m & (1 << S) - 1)];
continue C;
}
e.msg = "invalid distance code", s.mode = 30;
break g;
}
if (v = 65535 & H, Z < (S &= 15) && (m += N[l++] << Z, (Z += 8) < S && (m += N[l++] << Z, Z += 8)), c < (v += m & (1 << S) - 1)) {
e.msg = "invalid distance too far back", s.mode = 30;
break g;
}
if (m >>>= S, Z -= S, (S = a - d) < v) {
if (h < (S = v - S) && s.sane) {
e.msg = "invalid distance too far back", s.mode = 30;
break g;
}
if (V = u, (K = 0) === b) {
if (K += r - S, S < z) {
for (z -= S; B[a++] = u[K++], --S; ) ;
K = a - v, V = B;
}
} else if (b < S) {
if (K += r + b - S, (S -= b) < z) {
for (z -= S; B[a++] = u[K++], --S; ) ;
if (K = 0, b < z) {
for (z -= S = b; B[a++] = u[K++], --S; ) ;
K = a - v, V = B;
}
}
} else if (K += b - S, S < z) {
for (z -= S; B[a++] = u[K++], --S; ) ;
K = a - v, V = B;
}
for (; 2 < z; ) B[a++] = V[K++], B[a++] = V[K++], B[a++] = V[K++], z -= 3;
z && (B[a++] = V[K++], 1 < z && (B[a++] = V[K++]));
} else {
for (K = a - v; B[a++] = B[K++], B[a++] = B[K++], B[a++] = B[K++], 2 < (z -= 3); ) ;
z && (B[a++] = B[K++], 1 < z && (B[a++] = B[K++]));
}
break;
}
}
break;
}
} while (l < n && a < o);
l -= z = Z >> 3, m &= (1 << (Z -= z << 3)) - 1, e.next_in = l, e.next_out = a, e.avail_in = l < n ? n - l + 5 : 5 - (l - n), e.avail_out = a < o ? o - a + 257 : 257 - (a - o), s.hold = m, s.bits = Z;
};
}, {}], 49: [function(g, C, i) {
var e = g("../utils/common"), A = g("./adler32"), s = g("./crc32"), l = g("./inffast"), n = g("./inftrees"), a = 1, d = 2, o = 0, c = -2, r = 1, h = 852, b = 592;
function u(K) {
return (K >>> 24 & 255) + (K >>> 8 & 65280) + ((65280 & K) << 8) + ((255 & K) << 24);
}
function m() {
this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new e.Buf16(320), this.work = new e.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;
}
function Z(K) {
var V;
return K && K.state ? (V = K.state, K.total_in = K.total_out = V.total = 0, K.msg = "", V.wrap && (K.adler = 1 & V.wrap), V.mode = r, V.last = 0, V.havedict = 0, V.dmax = 32768, V.head = null, V.hold = 0, V.bits = 0, V.lencode = V.lendyn = new e.Buf32(h), V.distcode = V.distdyn = new e.Buf32(b), V.sane = 1, V.back = -1, o) : c;
}
function p(K) {
var V;
return K && K.state ? ((V = K.state).wsize = 0, V.whave = 0, V.wnext = 0, Z(K)) : c;
}
function Y(K, V) {
var N, B;
return K && K.state ? (B = K.state, V < 0 ? (N = 0, V = -V) : (N = 1 + (V >> 4), V < 48 && (V &= 15)), V && (V < 8 || 15 < V) ? c : (B.window !== null && B.wbits !== V && (B.window = null), B.wrap = N, B.wbits = V, p(K))) : c;
}
function R(K, V) {
var N, B;
return K ? (B = new m(), (K.state = B).window = null, (N = Y(K, V)) !== o && (K.state = null), N) : c;
}
var X, H, S = !0;
function z(K) {
if (S) {
var V;
for (X = new e.Buf32(512), H = new e.Buf32(32), V = 0; V < 144; ) K.lens[V++] = 8;
for (; V < 256; ) K.lens[V++] = 9;
for (; V < 280; ) K.lens[V++] = 7;
for (; V < 288; ) K.lens[V++] = 8;
for (n(a, K.lens, 0, 288, X, 0, K.work, { bits: 9 }), V = 0; V < 32; ) K.lens[V++] = 5;
n(d, K.lens, 0, 32, H, 0, K.work, { bits: 5 }), S = !1;
}
K.lencode = X, K.lenbits = 9, K.distcode = H, K.distbits = 5;
}
function v(K, V, N, B) {
var G, w = K.state;
return w.window === null && (w.wsize = 1 << w.wbits, w.wnext = 0, w.whave = 0, w.window = new e.Buf8(w.wsize)), B >= w.wsize ? (e.arraySet(w.window, V, N - w.wsize, w.wsize, 0), w.wnext = 0, w.whave = w.wsize) : (B < (G = w.wsize - w.wnext) && (G = B), e.arraySet(w.window, V, N - B, G, w.wnext), (B -= G) ? (e.arraySet(w.window, V, N - B, B, 0), w.wnext = B, w.whave = w.wsize) : (w.wnext += G, w.wnext === w.wsize && (w.wnext = 0), w.whave < w.wsize && (w.whave += G))), 0;
}
i.inflateReset = p, i.inflateReset2 = Y, i.inflateResetKeep = Z, i.inflateInit = function(K) {
return R(K, 15);
}, i.inflateInit2 = R, i.inflate = function(K, V) {
var N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _ = 0, gg = new e.Buf8(4), lg = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
if (!K || !K.state || !K.output || !K.input && K.avail_in !== 0) return c;
(N = K.state).mode === 12 && (N.mode = 13), W = K.next_out, G = K.output, f = K.avail_out, w = K.next_in, B = K.input, y = K.avail_in, D = N.hold, F = N.bits, T = y, Q = f, Ag = o;
g: for (; ; ) switch (N.mode) {
case r:
if (N.wrap === 0) {
N.mode = 13;
break;
}
for (; F < 16; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
if (2 & N.wrap && D === 35615) {
gg[N.check = 0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0), F = D = 0, N.mode = 2;
break;
}
if (N.flags = 0, N.head && (N.head.done = !1), !(1 & N.wrap) || (((255 & D) << 8) + (D >> 8)) % 31) {
K.msg = "incorrect header check", N.mode = 30;
break;
}
if ((15 & D) != 8) {
K.msg = "unknown compression method", N.mode = 30;
break;
}
if (F -= 4, x = 8 + (15 & (D >>>= 4)), N.wbits === 0) N.wbits = x;
else if (x > N.wbits) {
K.msg = "invalid window size", N.mode = 30;
break;
}
N.dmax = 1 << x, K.adler = N.check = 1, N.mode = 512 & D ? 10 : 12, F = D = 0;
break;
case 2:
for (; F < 16; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
if (N.flags = D, (255 & N.flags) != 8) {
K.msg = "unknown compression method", N.mode = 30;
break;
}
if (57344 & N.flags) {
K.msg = "unknown header flags set", N.mode = 30;
break;
}
N.head && (N.head.text = D >> 8 & 1), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0)), F = D = 0, N.mode = 3;
case 3:
for (; F < 32; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
N.head && (N.head.time = D), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, gg[2] = D >>> 16 & 255, gg[3] = D >>> 24 & 255, N.check = s(N.check, gg, 4, 0)), F = D = 0, N.mode = 4;
case 4:
for (; F < 16; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
N.head && (N.head.xflags = 255 & D, N.head.os = D >> 8), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0)), F = D = 0, N.mode = 5;
case 5:
if (1024 & N.flags) {
for (; F < 16; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
N.length = D, N.head && (N.head.extra_len = D), 512 & N.flags && (gg[0] = 255 & D, gg[1] = D >>> 8 & 255, N.check = s(N.check, gg, 2, 0)), F = D = 0;
} else N.head && (N.head.extra = null);
N.mode = 6;
case 6:
if (1024 & N.flags && (y < (P = N.length) && (P = y), P && (N.head && (x = N.head.extra_len - N.length, N.head.extra || (N.head.extra = new Array(N.head.extra_len)), e.arraySet(N.head.extra, B, w, P, x)), 512 & N.flags && (N.check = s(N.check, B, P, w)), y -= P, w += P, N.length -= P), N.length)) break g;
N.length = 0, N.mode = 7;
case 7:
if (2048 & N.flags) {
if (y === 0) break g;
for (P = 0; x = B[w + P++], N.head && x && N.length < 65536 && (N.head.name += String.fromCharCode(x)), x && P < y; ) ;
if (512 & N.flags && (N.check = s(N.check, B, P, w)), y -= P, w += P, x) break g;
} else N.head && (N.head.name = null);
N.length = 0, N.mode = 8;
case 8:
if (4096 & N.flags) {
if (y === 0) break g;
for (P = 0; x = B[w + P++], N.head && x && N.length < 65536 && (N.head.comment += String.fromCharCode(x)), x && P < y; ) ;
if (512 & N.flags && (N.check = s(N.check, B, P, w)), y -= P, w += P, x) break g;
} else N.head && (N.head.comment = null);
N.mode = 9;
case 9:
if (512 & N.flags) {
for (; F < 16; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
if (D !== (65535 & N.check)) {
K.msg = "header crc mismatch", N.mode = 30;
break;
}
F = D = 0;
}
N.head && (N.head.hcrc = N.flags >> 9 & 1, N.head.done = !0), K.adler = N.check = 0, N.mode = 12;
break;
case 10:
for (; F < 32; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
K.adler = N.check = u(D), F = D = 0, N.mode = 11;
case 11:
if (N.havedict === 0) return K.next_out = W, K.avail_out = f, K.next_in = w, K.avail_in = y, N.hold = D, N.bits = F, 2;
K.adler = N.check = 1, N.mode = 12;
case 12:
if (V === 5 || V === 6) break g;
case 13:
if (N.last) {
D >>>= 7 & F, F -= 7 & F, N.mode = 27;
break;
}
for (; F < 3; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
switch (N.last = 1 & D, F -= 1, 3 & (D >>>= 1)) {
case 0:
N.mode = 14;
break;
case 1:
if (z(N), N.mode = 20, V !== 6) break;
D >>>= 2, F -= 2;
break g;
case 2:
N.mode = 17;
break;
case 3:
K.msg = "invalid block type", N.mode = 30;
}
D >>>= 2, F -= 2;
break;
case 14:
for (D >>>= 7 & F, F -= 7 & F; F < 32; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
if ((65535 & D) != (D >>> 16 ^ 65535)) {
K.msg = "invalid stored block lengths", N.mode = 30;
break;
}
if (N.length = 65535 & D, F = D = 0, N.mode = 15, V === 6) break g;
case 15:
N.mode = 16;
case 16:
if (P = N.length) {
if (y < P && (P = y), f < P && (P = f), P === 0) break g;
e.arraySet(G, B, w, P, W), y -= P, w += P, f -= P, W += P, N.length -= P;
break;
}
N.mode = 12;
break;
case 17:
for (; F < 14; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
if (N.nlen = 257 + (31 & D), D >>>= 5, F -= 5, N.ndist = 1 + (31 & D), D >>>= 5, F -= 5, N.ncode = 4 + (15 & D), D >>>= 4, F -= 4, 286 < N.nlen || 30 < N.ndist) {
K.msg = "too many length or distance symbols", N.mode = 30;
break;
}
N.have = 0, N.mode = 18;
case 18:
for (; N.have < N.ncode; ) {
for (; F < 3; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
N.lens[lg[N.have++]] = 7 & D, D >>>= 3, F -= 3;
}
for (; N.have < 19; ) N.lens[lg[N.have++]] = 0;
if (N.lencode = N.lendyn, N.lenbits = 7, eg = { bits: N.lenbits }, Ag = n(0, N.lens, 0, 19, N.lencode, 0, N.work, eg), N.lenbits = eg.bits, Ag) {
K.msg = "invalid code lengths set", N.mode = 30;
break;
}
N.have = 0, N.mode = 19;
case 19:
for (; N.have < N.nlen + N.ndist; ) {
for (; k = (_ = N.lencode[D & (1 << N.lenbits) - 1]) >>> 16 & 255, j = 65535 & _, !((J = _ >>> 24) <= F); ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
if (j < 16) D >>>= J, F -= J, N.lens[N.have++] = j;
else {
if (j === 16) {
for (O = J + 2; F < O; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
if (D >>>= J, F -= J, N.have === 0) {
K.msg = "invalid bit length repeat", N.mode = 30;
break;
}
x = N.lens[N.have - 1], P = 3 + (3 & D), D >>>= 2, F -= 2;
} else if (j === 17) {
for (O = J + 3; F < O; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
F -= J, x = 0, P = 3 + (7 & (D >>>= J)), D >>>= 3, F -= 3;
} else {
for (O = J + 7; F < O; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
F -= J, x = 0, P = 11 + (127 & (D >>>= J)), D >>>= 7, F -= 7;
}
if (N.have + P > N.nlen + N.ndist) {
K.msg = "invalid bit length repeat", N.mode = 30;
break;
}
for (; P--; ) N.lens[N.have++] = x;
}
}
if (N.mode === 30) break;
if (N.lens[256] === 0) {
K.msg = "invalid code -- missing end-of-block", N.mode = 30;
break;
}
if (N.lenbits = 9, eg = { bits: N.lenbits }, Ag = n(a, N.lens, 0, N.nlen, N.lencode, 0, N.work, eg), N.lenbits = eg.bits, Ag) {
K.msg = "invalid literal/lengths set", N.mode = 30;
break;
}
if (N.distbits = 6, N.distcode = N.distdyn, eg = { bits: N.distbits }, Ag = n(d, N.lens, N.nlen, N.ndist, N.distcode, 0, N.work, eg), N.distbits = eg.bits, Ag) {
K.msg = "invalid distances set", N.mode = 30;
break;
}
if (N.mode = 20, V === 6) break g;
case 20:
N.mode = 21;
case 21:
if (6 <= y && 258 <= f) {
K.next_out = W, K.avail_out = f, K.next_in = w, K.avail_in = y, N.hold = D, N.bits = F, l(K, Q), W = K.next_out, G = K.output, f = K.avail_out, w = K.next_in, B = K.input, y = K.avail_in, D = N.hold, F = N.bits, N.mode === 12 && (N.back = -1);
break;
}
for (N.back = 0; k = (_ = N.lencode[D & (1 << N.lenbits) - 1]) >>> 16 & 255, j = 65535 & _, !((J = _ >>> 24) <= F); ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
if (k && (240 & k) == 0) {
for (q = J, Cg = k, Ig = j; k = (_ = N.lencode[Ig + ((D & (1 << q + Cg) - 1) >> q)]) >>> 16 & 255, j = 65535 & _, !(q + (J = _ >>> 24) <= F); ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
D >>>= q, F -= q, N.back += q;
}
if (D >>>= J, F -= J, N.back += J, N.length = j, k === 0) {
N.mode = 26;
break;
}
if (32 & k) {
N.back = -1, N.mode = 12;
break;
}
if (64 & k) {
K.msg = "invalid literal/length code", N.mode = 30;
break;
}
N.extra = 15 & k, N.mode = 22;
case 22:
if (N.extra) {
for (O = N.extra; F < O; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
N.length += D & (1 << N.extra) - 1, D >>>= N.extra, F -= N.extra, N.back += N.extra;
}
N.was = N.length, N.mode = 23;
case 23:
for (; k = (_ = N.distcode[D & (1 << N.distbits) - 1]) >>> 16 & 255, j = 65535 & _, !((J = _ >>> 24) <= F); ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
if ((240 & k) == 0) {
for (q = J, Cg = k, Ig = j; k = (_ = N.distcode[Ig + ((D & (1 << q + Cg) - 1) >> q)]) >>> 16 & 255, j = 65535 & _, !(q + (J = _ >>> 24) <= F); ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
D >>>= q, F -= q, N.back += q;
}
if (D >>>= J, F -= J, N.back += J, 64 & k) {
K.msg = "invalid distance code", N.mode = 30;
break;
}
N.offset = j, N.extra = 15 & k, N.mode = 24;
case 24:
if (N.extra) {
for (O = N.extra; F < O; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
N.offset += D & (1 << N.extra) - 1, D >>>= N.extra, F -= N.extra, N.back += N.extra;
}
if (N.offset > N.dmax) {
K.msg = "invalid distance too far back", N.mode = 30;
break;
}
N.mode = 25;
case 25:
if (f === 0) break g;
if (P = Q - f, N.offset > P) {
if ((P = N.offset - P) > N.whave && N.sane) {
K.msg = "invalid distance too far back", N.mode = 30;
break;
}
L = P > N.wnext ? (P -= N.wnext, N.wsize - P) : N.wnext - P, P > N.length && (P = N.length), E = N.window;
} else E = G, L = W - N.offset, P = N.length;
for (f < P && (P = f), f -= P, N.length -= P; G[W++] = E[L++], --P; ) ;
N.length === 0 && (N.mode = 21);
break;
case 26:
if (f === 0) break g;
G[W++] = N.length, f--, N.mode = 21;
break;
case 27:
if (N.wrap) {
for (; F < 32; ) {
if (y === 0) break g;
y--, D |= B[w++] << F, F += 8;
}
if (Q -= f, K.total_out += Q, N.total += Q, Q && (K.adler = N.check = N.flags ? s(N.check, G, Q, W - Q) : A(N.check, G, Q, W - Q)), Q = f, (N.flags ? D : u(D)) !== N.check) {
K.msg = "incorrect data check", N.mode = 30;
break;
}
F = D = 0;
}
N.mode = 28;
case 28:
if (N.wrap && N.flags) {
for (; F < 32; ) {
if (y === 0) break g;
y--, D += B[w++] << F, F += 8;
}
if (D !== (4294967295 & N.total)) {
K.msg = "incorrect length check", N.mode = 30;
break;
}
F = D = 0;
}
N.mode = 29;
case 29:
Ag = 1;
break g;
case 30:
Ag = -3;
break g;
case 31:
return -4;
case 32:
default:
return c;
}
return K.next_out = W, K.avail_out = f, K.next_in = w, K.avail_in = y, N.hold = D, N.bits = F, (N.wsize || Q !== K.avail_out && N.mode < 30 && (N.mode < 27 || V !== 4)) && v(K, K.output, K.next_out, Q - K.avail_out) ? (N.mode = 31, -4) : (T -= K.avail_in, Q -= K.avail_out, K.total_in += T, K.total_out += Q, N.total += Q, N.wrap && Q && (K.adler = N.check = N.flags ? s(N.check, G, Q, K.next_out - Q) : A(N.check, G, Q, K.next_out - Q)), K.data_type = N.bits + (N.last ? 64 : 0) + (N.mode === 12 ? 128 : 0) + (N.mode === 20 || N.mode === 15 ? 256 : 0), (T == 0 && Q === 0 || V === 4) && Ag === o && (Ag = -5), Ag);
}, i.inflateEnd = function(K) {
if (!K || !K.state) return c;
var V = K.state;
return V.window && (V.window = null), K.state = null, o;
}, i.inflateGetHeader = function(K, V) {
var N;
return K && K.state ? (2 & (N = K.state).wrap) == 0 ? c : ((N.head = V).done = !1, o) : c;
}, i.inflateSetDictionary = function(K, V) {
var N, B = V.length;
return K && K.state ? (N = K.state).wrap !== 0 && N.mode !== 11 ? c : N.mode === 11 && A(1, V, B, 0) !== N.check ? -3 : v(K, V, B, B) ? (N.mode = 31, -4) : (N.havedict = 1, o) : c;
}, i.inflateInfo = "pako inflate (from Nodeca project)";
}, { "../utils/common": 41, "./adler32": 43, "./crc32": 45, "./inffast": 48, "./inftrees": 50 }], 50: [function(g, C, i) {
var e = g("../utils/common"), A = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], s = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], l = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], n = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];
C.exports = function(a, d, o, c, r, h, b, u) {
var m, Z, p, Y, R, X, H, S, z, v = u.bits, K = 0, V = 0, N = 0, B = 0, G = 0, w = 0, W = 0, y = 0, f = 0, D = 0, F = null, T = 0, Q = new e.Buf16(16), P = new e.Buf16(16), L = null, E = 0;
for (K = 0; K <= 15; K++) Q[K] = 0;
for (V = 0; V < c; V++) Q[d[o + V]]++;
for (G = v, B = 15; 1 <= B && Q[B] === 0; B--) ;
if (B < G && (G = B), B === 0) return r[h++] = 20971520, r[h++] = 20971520, u.bits = 1, 0;
for (N = 1; N < B && Q[N] === 0; N++) ;
for (G < N && (G = N), K = y = 1; K <= 15; K++) if (y <<= 1, (y -= Q[K]) < 0) return -1;
if (0 < y && (a === 0 || B !== 1)) return -1;
for (P[1] = 0, K = 1; K < 15; K++) P[K + 1] = P[K] + Q[K];
for (V = 0; V < c; V++) d[o + V] !== 0 && (b[P[d[o + V]]++] = V);
if (X = a === 0 ? (F = L = b, 19) : a === 1 ? (F = A, T -= 257, L = s, E -= 257, 256) : (F = l, L = n, -1), K = N, R = h, W = V = D = 0, p = -1, Y = (f = 1 << (w = G)) - 1, a === 1 && 852 < f || a === 2 && 592 < f) return 1;
for (; ; ) {
for (H = K - W, z = b[V] < X ? (S = 0, b[V]) : b[V] > X ? (S = L[E + b[V]], F[T + b[V]]) : (S = 96, 0), m = 1 << K - W, N = Z = 1 << w; r[R + (D >> W) + (Z -= m)] = H << 24 | S << 16 | z | 0, Z !== 0; ) ;
for (m = 1 << K - 1; D & m; ) m >>= 1;
if (m !== 0 ? (D &= m - 1, D += m) : D = 0, V++, --Q[K] == 0) {
if (K === B) break;
K = d[o + b[V]];
}
if (G < K && (D & Y) !== p) {
for (W === 0 && (W = G), R += N, y = 1 << (w = K - W); w + W < B && !((y -= Q[w + W]) <= 0); ) w++, y <<= 1;
if (f += 1 << w, a === 1 && 852 < f || a === 2 && 592 < f) return 1;
r[p = D & Y] = G << 24 | w << 16 | R - h | 0;
}
}
return D !== 0 && (r[R + D] = K - W << 24 | 64 << 16 | 0), u.bits = G, 0;
};
}, { "../utils/common": 41 }], 51: [function(g, C, i) {
C.exports = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" };
}, {}], 52: [function(g, C, i) {
var e = g("../utils/common"), A = 0, s = 1;
function l(_) {
for (var gg = _.length; 0 <= --gg; ) _[gg] = 0;
}
var n = 0, a = 29, d = 256, o = d + 1 + a, c = 30, r = 19, h = 2 * o + 1, b = 15, u = 16, m = 7, Z = 256, p = 16, Y = 17, R = 18, X = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], H = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], S = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], z = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], v = new Array(2 * (o + 2));
l(v);
var K = new Array(2 * c);
l(K);
var V = new Array(512);
l(V);
var N = new Array(256);
l(N);
var B = new Array(a);
l(B);
var G, w, W, y = new Array(c);
function f(_, gg, lg, ng, sg) {
this.static_tree = _, this.extra_bits = gg, this.extra_base = lg, this.elems = ng, this.max_length = sg, this.has_stree = _ && _.length;
}
function D(_, gg) {
this.dyn_tree = _, this.max_code = 0, this.stat_desc = gg;
}
function F(_) {
return _ < 256 ? V[_] : V[256 + (_ >>> 7)];
}
function T(_, gg) {
_.pending_buf[_.pending++] = 255 & gg, _.pending_buf[_.pending++] = gg >>> 8 & 255;
}
function Q(_, gg, lg) {
_.bi_valid > u - lg ? (_.bi_buf |= gg << _.bi_valid & 65535, T(_, _.bi_buf), _.bi_buf = gg >> u - _.bi_valid, _.bi_valid += lg - u) : (_.bi_buf |= gg << _.bi_valid & 65535, _.bi_valid += lg);
}
function P(_, gg, lg) {
Q(_, lg[2 * gg], lg[2 * gg + 1]);
}
function L(_, gg) {
for (var lg = 0; lg |= 1 & _, _ >>>= 1, lg <<= 1, 0 < --gg; ) ;
return lg >>> 1;
}
function E(_, gg, lg) {
var ng, sg, og = new Array(b + 1), cg = 0;
for (ng = 1; ng <= b; ng++) og[ng] = cg = cg + lg[ng - 1] << 1;
for (sg = 0; sg <= gg; sg++) {
var rg = _[2 * sg + 1];
rg !== 0 && (_[2 * sg] = L(og[rg]++, rg));
}
}
function J(_) {
var gg;
for (gg = 0; gg < o; gg++) _.dyn_ltree[2 * gg] = 0;
for (gg = 0; gg < c; gg++) _.dyn_dtree[2 * gg] = 0;
for (gg = 0; gg < r; gg++) _.bl_tree[2 * gg] = 0;
_.dyn_ltree[2 * Z] = 1, _.opt_len = _.static_len = 0, _.last_lit = _.matches = 0;
}
function k(_) {
8 < _.bi_valid ? T(_, _.bi_buf) : 0 < _.bi_valid && (_.pending_buf[_.pending++] = _.bi_buf), _.bi_buf = 0, _.bi_valid = 0;
}
function j(_, gg, lg, ng) {
var sg = 2 * gg, og = 2 * lg;
return _[sg] < _[og] || _[sg] === _[og] && ng[gg] <= ng[lg];
}
function q(_, gg, lg) {
for (var ng = _.heap[lg], sg = lg << 1; sg <= _.heap_len && (sg < _.heap_len && j(gg, _.heap[sg + 1], _.heap[sg], _.depth) && sg++, !j(gg, ng, _.heap[sg], _.depth)); ) _.heap[lg] = _.heap[sg], lg = sg, sg <<= 1;
_.heap[lg] = ng;
}
function Cg(_, gg, lg) {
var ng, sg, og, cg, rg = 0;
if (_.last_lit !== 0) for (; ng = _.pending_buf[_.d_buf + 2 * rg] << 8 | _.pending_buf[_.d_buf + 2 * rg + 1], sg = _.pending_buf[_.l_buf + rg], rg++, ng === 0 ? P(_, sg, gg) : (P(_, (og = N[sg]) + d + 1, gg), (cg = X[og]) !== 0 && Q(_, sg -= B[og], cg), P(_, og = F(--ng), lg), (cg = H[og]) !== 0 && Q(_, ng -= y[og], cg)), rg < _.last_lit; ) ;
P(_, Z, gg);
}
function Ig(_, gg) {
var lg, ng, sg, og = gg.dyn_tree, cg = gg.stat_desc.static_tree, rg = gg.stat_desc.has_stree, dg = gg.stat_desc.elems, Bg = -1;
for (_.heap_len = 0, _.heap_max = h, lg = 0; lg < dg; lg++) og[2 * lg] !== 0 ? (_.heap[++_.heap_len] = Bg = lg, _.depth[lg] = 0) : og[2 * lg + 1] = 0;
for (; _.heap_len < 2; ) og[2 * (sg = _.heap[++_.heap_len] = Bg < 2 ? ++Bg : 0)] = 1, _.depth[sg] = 0, _.opt_len--, rg && (_.static_len -= cg[2 * sg + 1]);
for (gg.max_code = Bg, lg = _.heap_len >> 1; 1 <= lg; lg--) q(_, og, lg);
for (sg = dg; lg = _.heap[1], _.heap[1] = _.heap[_.heap_len--], q(_, og, 1), ng = _.heap[1], _.heap[--_.heap_max] = lg, _.heap[--_.heap_max] = ng, og[2 * sg] = og[2 * lg] + og[2 * ng], _.depth[sg] = (_.depth[lg] >= _.depth[ng] ? _.depth[lg] : _.depth[ng]) + 1, og[2 * lg + 1] = og[2 * ng + 1] = sg, _.heap[1] = sg++, q(_, og, 1), 2 <= _.heap_len; ) ;
_.heap[--_.heap_max] = _.heap[1], function(Zg, Xg) {
var Kg, kg, Wg, Ng, wg, fg, Jg = Xg.dyn_tree, zg = Xg.max_code, cI = Xg.stat_desc.static_tree, YI = Xg.stat_desc.has_stree, Eg = Xg.stat_desc.extra_bits, aI = Xg.stat_desc.extra_base, dI = Xg.stat_desc.max_length, _g = 0;
for (Ng = 0; Ng <= b; Ng++) Zg.bl_count[Ng] = 0;
for (Jg[2 * Zg.heap[Zg.heap_max] + 1] = 0, Kg = Zg.heap_max + 1; Kg < h; Kg++) dI < (Ng = Jg[2 * Jg[2 * (kg = Zg.heap[Kg]) + 1] + 1] + 1) && (Ng = dI, _g++), Jg[2 * kg + 1] = Ng, zg < kg || (Zg.bl_count[Ng]++, wg = 0, aI <= kg && (wg = Eg[kg - aI]), fg = Jg[2 * kg], Zg.opt_len += fg * (Ng + wg), YI && (Zg.static_len += fg * (cI[2 * kg + 1] + wg)));
if (_g !== 0) {
do {
for (Ng = dI - 1; Zg.bl_count[Ng] === 0; ) Ng--;
Zg.bl_count[Ng]--, Zg.bl_count[Ng + 1] += 2, Zg.bl_count[dI]--, _g -= 2;
} while (0 < _g);
for (Ng = dI; Ng !== 0; Ng--) for (kg = Zg.bl_count[Ng]; kg !== 0; ) zg < (Wg = Zg.heap[--Kg]) || (Jg[2 * Wg + 1] !== Ng && (Zg.opt_len += (Ng - Jg[2 * Wg + 1]) * Jg[2 * Wg], Jg[2 * Wg + 1] = Ng), kg--);
}
}(_, gg), E(og, Bg, _.bl_count);
}
function x(_, gg, lg) {
var ng, sg, og = -1, cg = gg[1], rg = 0, dg = 7, Bg = 4;
for (cg === 0 && (dg = 138, Bg = 3), gg[2 * (lg + 1) + 1] = 65535, ng = 0; ng <= lg; ng++) sg = cg, cg = gg[2 * (ng + 1) + 1], ++rg < dg && sg === cg || (rg < Bg ? _.bl_tree[2 * sg] += rg : sg !== 0 ? (sg !== og && _.bl_tree[2 * sg]++, _.bl_tree[2 * p]++) : rg <= 10 ? _.bl_tree[2 * Y]++ : _.bl_tree[2 * R]++, og = sg, Bg = (rg = 0) === cg ? (dg = 138, 3) : sg === cg ? (dg = 6, 3) : (dg = 7, 4));
}
function Ag(_, gg, lg) {
var ng, sg, og = -1, cg = gg[1], rg = 0, dg = 7, Bg = 4;
for (cg === 0 && (dg = 138, Bg = 3), ng = 0; ng <= lg; ng++) if (sg = cg, cg = gg[2 * (ng + 1) + 1], !(++rg < dg && sg === cg)) {
if (rg < Bg) for (; P(_, sg, _.bl_tree), --rg != 0; ) ;
else sg !== 0 ? (sg !== og && (P(_, sg, _.bl_tree), rg--), P(_, p, _.bl_tree), Q(_, rg - 3, 2)) : rg <= 10 ? (P(_, Y, _.bl_tree), Q(_, rg - 3, 3)) : (P(_, R, _.bl_tree), Q(_, rg - 11, 7));
og = sg, Bg = (rg = 0) === cg ? (dg = 138, 3) : sg === cg ? (dg = 6, 3) : (dg = 7, 4);
}
}
l(y);
var eg = !1;
function O(_, gg, lg, ng) {
Q(_, (n << 1) + (ng ? 1 : 0), 3), function(sg, og, cg, rg) {
k(sg), T(sg, cg), T(sg, ~cg), e.arraySet(sg.pending_buf, sg.window, og, cg, sg.pending), sg.pending += cg;
}(_, gg, lg);
}
i._tr_init = function(_) {
eg || (function() {
var gg, lg, ng, sg, og, cg = new Array(b + 1);
for (sg = ng = 0; sg < a - 1; sg++) for (B[sg] = ng, gg = 0; gg < 1 << X[sg]; gg++) N[ng++] = sg;
for (N[ng - 1] = sg, sg = og = 0; sg < 16; sg++) for (y[sg] = og, gg = 0; gg < 1 << H[sg]; gg++) V[og++] = sg;
for (og >>= 7; sg < c; sg++) for (y[sg] = og << 7, gg = 0; gg < 1 << H[sg] - 7; gg++) V[256 + og++] = sg;
for (lg = 0; lg <= b; lg++) cg[lg] = 0;
for (gg = 0; gg <= 143; ) v[2 * gg + 1] = 8, gg++, cg[8]++;
for (; gg <= 255; ) v[2 * gg + 1] = 9, gg++, cg[9]++;
for (; gg <= 279; ) v[2 * gg + 1] = 7, gg++, cg[7]++;
for (; gg <= 287; ) v[2 * gg + 1] = 8, gg++, cg[8]++;
for (E(v, o + 1, cg), gg = 0; gg < c; gg++) K[2 * gg + 1] = 5, K[2 * gg] = L(gg, 5);
G = new f(v, X, d + 1, o, b), w = new f(K, H, 0, c, b), W = new f(new Array(0), S, 0, r, m);
}(), eg = !0), _.l_desc = new D(_.dyn_ltree, G), _.d_desc = new D(_.dyn_dtree, w), _.bl_desc = new D(_.bl_tree, W), _.bi_buf = 0, _.bi_valid = 0, J(_);
}, i._tr_stored_block = O, i._tr_flush_block = function(_, gg, lg, ng) {
var sg, og, cg = 0;
0 < _.level ? (_.strm.data_type === 2 && (_.strm.data_type = function(rg) {
var dg, Bg = 4093624447;
for (dg = 0; dg <= 31; dg++, Bg >>>= 1) if (1 & Bg && rg.dyn_ltree[2 * dg] !== 0) return A;
if (rg.dyn_ltree[18] !== 0 || rg.dyn_ltree[20] !== 0 || rg.dyn_ltree[26] !== 0) return s;
for (dg = 32; dg < d; dg++) if (rg.dyn_ltree[2 * dg] !== 0) return s;
return A;
}(_)), Ig(_, _.l_desc), Ig(_, _.d_desc), cg = function(rg) {
var dg;
for (x(rg, rg.dyn_ltree, rg.l_desc.max_code), x(rg, rg.dyn_dtree, rg.d_desc.max_code), Ig(rg, rg.bl_desc), dg = r - 1; 3 <= dg && rg.bl_tree[2 * z[dg] + 1] === 0; dg--) ;
return rg.opt_len += 3 * (dg + 1) + 5 + 5 + 4, dg;
}(_), sg = _.opt_len + 3 + 7 >>> 3, (og = _.static_len + 3 + 7 >>> 3) <= sg && (sg = og)) : sg = og = lg + 5, lg + 4 <= sg && gg !== -1 ? O(_, gg, lg, ng) : _.strategy === 4 || og === sg ? (Q(_, 2 + (ng ? 1 : 0), 3), Cg(_, v, K)) : (Q(_, 4 + (ng ? 1 : 0), 3), function(rg, dg, Bg, Zg) {
var Xg;
for (Q(rg, dg - 257, 5), Q(rg, Bg - 1, 5), Q(rg, Zg - 4, 4), Xg = 0; Xg < Zg; Xg++) Q(rg, rg.bl_tree[2 * z[Xg] + 1], 3);
Ag(rg, rg.dyn_ltree, dg - 1), Ag(rg, rg.dyn_dtree, Bg - 1);
}(_, _.l_desc.max_code + 1, _.d_desc.max_code + 1, cg + 1), Cg(_, _.dyn_ltree, _.dyn_dtree)), J(_), ng && k(_);
}, i._tr_tally = function(_, gg, lg) {
return _.pending_buf[_.d_buf + 2 * _.last_lit] = gg >>> 8 & 255, _.pending_buf[_.d_buf + 2 * _.last_lit + 1] = 255 & gg, _.pending_buf[_.l_buf + _.last_lit] = 255 & lg, _.last_lit++, gg === 0 ? _.dyn_ltree[2 * lg]++ : (_.matches++, gg--, _.dyn_ltree[2 * (N[lg] + d + 1)]++, _.dyn_dtree[2 * F(gg)]++), _.last_lit === _.lit_bufsize - 1;
}, i._tr_align = function(_) {
Q(_, 2, 3), P(_, Z, v), function(gg) {
gg.bi_valid === 16 ? (T(gg, gg.bi_buf), gg.bi_buf = 0, gg.bi_valid = 0) : 8 <= gg.bi_valid && (gg.pending_buf[gg.pending++] = 255 & gg.bi_buf, gg.bi_buf >>= 8, gg.bi_valid -= 8);
}(_);
};
}, { "../utils/common": 41 }], 53: [function(g, C, i) {
C.exports = function() {
this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0;
};
}, {}], 54: [function(g, C, i) {
(function(e) {
(function(A, s) {
if (!A.setImmediate) {
var l, n, a, d, o = 1, c = {}, r = !1, h = A.document, b = Object.getPrototypeOf && Object.getPrototypeOf(A);
b = b && b.setTimeout ? b : A, l = {}.toString.call(A.process) === "[object process]" ? function(p) {
process.nextTick(function() {
m(p);
});
} : function() {
if (A.postMessage && !A.importScripts) {
var p = !0, Y = A.onmessage;
return A.onmessage = function() {
p = !1;
}, A.postMessage("", "*"), A.onmessage = Y, p;
}
}() ? (d = "setImmediate$" + Math.random() + "$", A.addEventListener ? A.addEventListener("message", Z, !1) : A.attachEvent("onmessage", Z), function(p) {
A.postMessage(d + p, "*");
}) : A.MessageChannel ? ((a = new MessageChannel()).port1.onmessage = function(p) {
m(p.data);
}, function(p) {
a.port2.postMessage(p);
}) : h && "onreadystatechange" in h.createElement("script") ? (n = h.documentElement, function(p) {
var Y = h.createElement("script");
Y.onreadystatechange = function() {
m(p), Y.onreadystatechange = null, n.removeChild(Y), Y = null;
}, n.appendChild(Y);
}) : function(p) {
setTimeout(m, 0, p);
}, b.setImmediate = function(p) {
typeof p != "function" && (p = new Function("" + p));
for (var Y = new Array(arguments.length - 1), R = 0; R < Y.length; R++) Y[R] = arguments[R + 1];
var X = { callback: p, args: Y };
return c[o] = X, l(o), o++;
}, b.clearImmediate = u;
}
function u(p) {
delete c[p];
}
function m(p) {
if (r) setTimeout(m, 0, p);
else {
var Y = c[p];
if (Y) {
r = !0;
try {
(function(R) {
var X = R.callback, H = R.args;
switch (H.length) {
case 0:
X();
break;
case 1:
X(H[0]);
break;
case 2:
X(H[0], H[1]);
break;
case 3:
X(H[0], H[1], H[2]);
break;
default:
X.apply(s, H);
}
})(Y);
} finally {
u(p), r = !1;
}
}
}
}
function Z(p) {
p.source === A && typeof p.data == "string" && p.data.indexOf(d) === 0 && m(+p.data.slice(d.length));
}
})(typeof self > "u" ? e === void 0 ? this : e : self);
}).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
}, {}] }, {}, [10])(10);
});
}(FH)), FH.exports;
}
var rag = dag();
const hag = /* @__PURE__ */ u$(rag);
var At;
(function(t) {
t.OfficeDocument = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", t.FontTable = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable", t.Image = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", t.Numbering = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering", t.Styles = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", t.StylesWithEffects = "http://schemas.microsoft.com/office/2007/relationships/stylesWithEffects", t.Theme = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme", t.Settings = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings", t.WebSettings = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings", t.Hyperlink = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", t.Footnotes = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes", t.Endnotes = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes", t.Footer = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", t.Header = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", t.ExtendedProperties = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties", t.CoreProperties = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties", t.CustomProperties = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/custom-properties", t.Comments = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments", t.CommentsExtended = "http://schemas.microsoft.com/office/2011/relationships/commentsExtended", t.AltChunk = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk";
})(At || (At = {}));
function bag(t, I) {
return I.elements(t).map((g) => ({
id: I.attr(g, "Id"),
type: I.attr(g, "Type"),
target: I.attr(g, "Target"),
targetMode: I.attr(g, "TargetMode")
}));
}
function uag(t) {
return t == null ? void 0 : t.replace(/[ .]+/g, "-").replace(/[&]+/g, "and").toLowerCase();
}
function xX(t) {
return /^[^"'].*\s.*[^"']$/.test(t) ? `'${t}'` : t;
}
function lN(t) {
let I = t.lastIndexOf("/") + 1, g = I == 0 ? "" : t.substring(0, I), C = I == 0 ? t : t.substring(I);
return [g, C];
}
function kH(t, I) {
try {
const g = "http://docx/";
return new URL(t, g + I).toString().substring(g.length);
} catch {
return `${I}${t}`;
}
}
function ea(t, I) {
return t.reduce((g, C) => (g[I(C)] = C, g), {});
}
function mag(t) {
return new Promise((I, g) => {
const C = new FileReader();
C.onloadend = () => I(C.result), C.onerror = () => g(), C.readAsDataURL(t);
});
}
function zH(t) {
return t && typeof t == "object" && !Array.isArray(t);
}
function Zag(t) {
return typeof t == "string" || t instanceof String;
}
function gV(t, ...I) {
if (!I.length)
return t;
const g = I.shift();
if (zH(t) && zH(g))
for (const C in g)
if (zH(g[C])) {
const i = t[C] ?? (t[C] = {});
gV(i, g[C]);
} else
t[C] = g[C];
return gV(t, ...I);
}
function Ru(t) {
return Array.isArray(t) ? t : [t];
}
function Gag(t, I, g) {
return I > t ? I : g < t ? g : t;
}
const m$ = {
wordml: "http://schemas.openxmlformats.org/wordprocessingml/2006/main"
}, st = {
Dxa: { mul: 0.05, unit: "pt" },
Emu: { mul: 1 / 12700, unit: "pt" },
FontSize: { mul: 0.5, unit: "pt" },
Border: { mul: 0.125, unit: "pt", min: 0.25, max: 12 },
Point: { mul: 1, unit: "pt" },
Percent: { mul: 0.02, unit: "%" }
};
function Z$(t, I = st.Dxa) {
if (t == null || /.+(p[xt]|[%])$/.test(t))
return t;
var g = parseInt(t) * I.mul;
return I.min && I.max && (g = Gag(g, I.min, I.max)), `${g.toFixed(2)}${I.unit}`;
}
function wag(t, I = !1) {
switch (t) {
case "1":
return !0;
case "0":
return !1;
case "on":
return !0;
case "off":
return !1;
case "true":
return !0;
case "false":
return !1;
default:
return I;
}
}
function G$(t, I, g) {
if (t.namespaceURI != m$.wordml)
return !1;
switch (t.localName) {
case "color":
I.color = g.attr(t, "val");
break;
case "sz":
I.fontSize = g.lengthAttr(t, "val", st.FontSize);
break;
default:
return !1;
}
return !0;
}
function pag(t, I = !1) {
I && (t = t.replace(/<[?].*[?]>/, "")), t = Wag(t);
const g = new DOMParser().parseFromString(t, "application/xml"), C = Bag(g);
if (C)
throw new Error(C);
return g;
}
function Bag(t) {
var I;
return (I = t.getElementsByTagName("parsererror")[0]) == null ? void 0 : I.textContent;
}
function Wag(t) {
return t.charCodeAt(0) === 65279 ? t.substring(1) : t;
}
function yag(t) {
return new XMLSerializer().serializeToString(t);
}
class w$ {
elements(I, g = null) {
const C = [];
for (let i = 0, e = I.childNodes.length; i < e; i++) {
let A = I.childNodes.item(i);
A.nodeType == 1 && (g == null || A.localName == g) && C.push(A);
}
return C;
}
element(I, g) {
for (let C = 0, i = I.childNodes.length; C < i; C++) {
let e = I.childNodes.item(C);
if (e.nodeType == 1 && e.localName == g)
return e;
}
return null;
}
elementAttr(I, g, C) {
var i = this.element(I, g);
return i ? this.attr(i, C) : void 0;
}
attrs(I) {
return Array.from(I.attributes);
}
attr(I, g) {
for (let C = 0, i = I.attributes.length; C < i; C++) {
let e = I.attributes.item(C);
if (e.localName == g)
return e.value;
}
return null;
}
intAttr(I, g, C = null) {
var i = this.attr(I, g);
return i ? parseInt(i) : C;
}
hexAttr(I, g, C = null) {
var i = this.attr(I, g);
return i ? parseInt(i, 16) : C;
}
floatAttr(I, g, C = null) {
var i = this.attr(I, g);
return i ? parseFloat(i) : C;
}
boolAttr(I, g, C = null) {
return wag(this.attr(I, g), C);
}
lengthAttr(I, g, C = st.Dxa) {
return Z$(this.attr(I, g), C);
}
}
const ug = new w$();
class Re {
constructor(I, g) {
this._package = I, this.path = g;
}
async load() {
this.rels = await this._package.loadRelationships(this.path);
const I = await this._package.load(this.path), g = this._package.parseXmlDocument(I);
this._package.options.keepOrigin && (this._xmlDocument = g), this.parseXml(g.firstElementChild);
}
save() {
this._package.update(this.path, yag(this._xmlDocument));
}
parseXml(I) {
}
}
const Yag = {
embedRegular: "regular",
embedBold: "bold",
embedItalic: "italic",
embedBoldItalic: "boldItalic"
};
function Nag(t, I) {
return I.elements(t).map((g) => Vag(g, I));
}
function Vag(t, I) {
let g = {
name: I.attr(t, "name"),
embedFontRefs: []
};
for (let C of I.elements(t))
switch (C.localName) {
case "family":
g.family = I.attr(C, "val");
break;
case "altName":
g.altName = I.attr(C, "val");
break;
case "embedRegular":
case "embedBold":
case "embedItalic":
case "embedBoldItalic":
g.embedFontRefs.push(Mag(C, I));
break;
}
return g;
}
function Mag(t, I) {
return {
id: I.attr(t, "id"),
key: I.attr(t, "fontKey"),
type: Yag[t.localName]
};
}
class Rag extends Re {
parseXml(I) {
this.fonts = Nag(I, this._package.xmlParser);
}
}
class l9 {
constructor(I, g) {
this._zip = I, this.options = g, this.xmlParser = new w$();
}
get(I) {
const g = fag(I);
return this._zip.files[g] ?? this._zip.files[g.replace(/\//g, "\\")];
}
update(I, g) {
this._zip.file(I, g);
}
static async load(I, g) {
const C = await hag.loadAsync(I);
return new l9(C, g);
}
save(I = "blob") {
return this._zip.generateAsync({ type: I });
}
load(I, g = "string") {
var C;
return ((C = this.get(I)) == null ? void 0 : C.async(g)) ?? Promise.resolve(null);
}
async loadRelationships(I = null) {
let g = "_rels/.rels";
if (I != null) {
const [i, e] = lN(I);
g = `${i}_rels/${e}.rels`;
}
const C = await this.load(g);
return C ? bag(this.parseXmlDocument(C).firstElementChild, this.xmlParser) : null;
}
parseXmlDocument(I) {
return pag(I, this.options.trimXmlDeclaration);
}
}
function fag(t) {
return t.startsWith("/") ? t.substr(1) : t;
}
class Hag extends Re {
constructor(I, g, C) {
super(I, g), this._documentParser = C;
}
parseXml(I) {
this.body = this._documentParser.parseDocumentFile(I);
}
}
function KY(t, I) {
return {
type: I.attr(t, "val"),
color: I.attr(t, "color"),
size: I.lengthAttr(t, "sz", st.Border),
offset: I.lengthAttr(t, "space", st.Point),
frame: I.boolAttr(t, "frame"),
shadow: I.boolAttr(t, "shadow")
};
}
function Xag(t, I) {
var g = {};
for (let C of I.elements(t))
switch (C.localName) {
case "left":
g.left = KY(C, I);
break;
case "top":
g.top = KY(C, I);
break;
case "right":
g.right = KY(C, I);
break;
case "bottom":
g.bottom = KY(C, I);
break;
}
return g;
}
var v6;
(function(t) {
t.Continuous = "continuous", t.NextPage = "nextPage", t.NextColumn = "nextColumn", t.EvenPage = "evenPage", t.OddPage = "oddPage";
})(v6 || (v6 = {}));
function p$(t, I = ug) {
var g = {};
for (let C of I.elements(t))
switch (C.localName) {
case "pgSz":
g.pageSize = {
width: I.lengthAttr(C, "w"),
height: I.lengthAttr(C, "h"),
orientation: I.attr(C, "orient")
};
break;
case "type":
g.type = I.attr(C, "val");
break;
case "pgMar":
g.pageMargins = {
left: I.lengthAttr(C, "left"),
right: I.lengthAttr(C, "right"),
top: I.lengthAttr(C, "top"),
bottom: I.lengthAttr(C, "bottom"),
header: I.lengthAttr(C, "header"),
footer: I.lengthAttr(C, "footer"),
gutter: I.lengthAttr(C, "gutter")
};
break;
case "cols":
g.columns = Sag(C, I);
break;
case "headerReference":
(g.headerRefs ?? (g.headerRefs = [])).push(T6(C, I));
break;
case "footerReference":
(g.footerRefs ?? (g.footerRefs = [])).push(T6(C, I));
break;
case "titlePg":
g.titlePage = I.boolAttr(C, "val", !0);
break;
case "pgBorders":
g.pageBorders = Xag(C, I);
break;
case "pgNumType":
g.pageNumber = Dag(C, I);
break;
}
return g;
}
function Sag(t, I) {
return {
numberOfColumns: I.intAttr(t, "num"),
space: I.lengthAttr(t, "space"),
separator: I.boolAttr(t, "sep"),
equalWidth: I.boolAttr(t, "equalWidth", !0),
columns: I.elements(t, "col").map((g) => ({
width: I.lengthAttr(g, "w"),
space: I.lengthAttr(g, "space")
}))
};
}
function Dag(t, I) {
return {
chapSep: I.attr(t, "chapSep"),
chapStyle: I.attr(t, "chapStyle"),
format: I.attr(t, "fmt"),
start: I.intAttr(t, "start")
};
}
function T6(t, I) {
return {
id: I.attr(t, "id"),
type: I.attr(t, "type")
};
}
function Kag(t, I) {
return {
before: I.lengthAttr(t, "before"),
after: I.lengthAttr(t, "after"),
line: I.intAttr(t, "line"),
lineRule: I.attr(t, "lineRule")
};
}
function n9(t, I) {
let g = {};
for (let C of I.elements(t))
Fag(C, g, I);
return g;
}
function Fag(t, I, g) {
return !!G$(t, I, g);
}
function B$(t, I) {
let g = {};
for (let C of I.elements(t))
W$(C, g, I);
return g;
}
function W$(t, I, g) {
if (t.namespaceURI != m$.wordml)
return !1;
if (G$(t, I, g))
return !0;
switch (t.localName) {
case "tabs":
I.tabs = kag(t, g);
break;
case "sectPr":
I.sectionProps = p$(t, g);
break;
case "numPr":
I.numbering = zag(t, g);
break;
case "spacing":
return I.lineSpacing = Kag(t, g), !1;
case "textAlignment":
return I.textAlignment = g.attr(t, "val"), !1;
case "keepLines":
I.keepLines = g.boolAttr(t, "val", !0);
break;
case "keepNext":
I.keepNext = g.boolAttr(t, "val", !0);
break;
case "pageBreakBefore":
I.pageBreakBefore = g.boolAttr(t, "val", !0);
break;
case "outlineLvl":
I.outlineLevel = g.intAttr(t, "val");
break;
case "pStyle":
I.styleName = g.attr(t, "val");
break;
case "rPr":
I.runProps = n9(t, g);
break;
default:
return !1;
}
return !0;
}
function kag(t, I) {
return I.elements(t, "tab").map((g) => ({
position: I.lengthAttr(g, "pos"),
leader: I.attr(g, "leader"),
style: I.attr(g, "val")
}));
}
function zag(t, I) {
var g = {};
for (let C of I.elements(t))
switch (C.localName) {
case "numId":
g.id = I.attr(C, "val");
break;
case "ilvl":
g.level = I.intAttr(C, "val");
break;
}
return g;
}
function Jag(t, I) {
let g = {
numberings: [],
abstractNumberings: [],
bulletPictures: []
};
for (let C of I.elements(t))
switch (C.localName) {
case "num":
g.numberings.push(Lag(C, I));
break;
case "abstractNum":
g.abstractNumberings.push(vag(C, I));
break;
case "numPicBullet":
g.bulletPictures.push(xag(C, I));
break;
}
return g;
}
function Lag(t, I) {
let g = {
id: I.attr(t, "numId"),
overrides: []
};
for (let C of I.elements(t))
switch (C.localName) {
case "abstractNumId":
g.abstractId = I.attr(C, "val");
break;
case "lvlOverride":
g.overrides.push(Tag(C, I));
break;
}
return g;
}
function vag(t, I) {
let g = {
id: I.attr(t, "abstractNumId"),
levels: []
};
for (let C of I.elements(t))
switch (C.localName) {
case "name":
g.name = I.attr(C, "val");
break;
case "multiLevelType":
g.multiLevelType = I.attr(C, "val");
break;
case "numStyleLink":
g.numberingStyleLink = I.attr(C, "val");
break;
case "styleLink":
g.styleLink = I.attr(C, "val");
break;
case "lvl":
g.levels.push(y$(C, I));
break;
}
return g;
}
function y$(t, I) {
let g = {
level: I.intAttr(t, "ilvl")
};
for (let C of I.elements(t))
switch (C.localName) {
case "start":
g.start = I.attr(C, "val");
break;
case "lvlRestart":
g.restart = I.intAttr(C, "val");
break;
case "numFmt":
g.format = I.attr(C, "val");
break;
case "lvlText":
g.text = I.attr(C, "val");
break;
case "lvlJc":
g.justification = I.attr(C, "val");
break;
case "lvlPicBulletId":
g.bulletPictureId = I.attr(C, "val");
break;
case "pStyle":
g.paragraphStyle = I.attr(C, "val");
break;
case "pPr":
g.paragraphProps = B$(C, I);
break;
case "rPr":
g.runProps = n9(C, I);
break;
}
return g;
}
function Tag(t, I) {
let g = {
level: I.intAttr(t, "ilvl")
};
for (let C of I.elements(t))
switch (C.localName) {
case "startOverride":
g.start = I.intAttr(C, "val");
break;
case "lvl":
g.numberingLevel = y$(C, I);
break;
}
return g;
}
function xag(t, I) {
var g = I.element(t, "pict"), C = g && I.element(g, "shape"), i = C && I.element(C, "imagedata");
return i ? {
id: I.attr(t, "numPicBulletId"),
referenceId: I.attr(i, "id"),
style: I.attr(C, "style")
} : null;
}
class jag extends Re {
constructor(I, g, C) {
super(I, g), this._documentParser = C;
}
parseXml(I) {
Object.assign(this, Jag(I, this._package.xmlParser)), this.domNumberings = this._documentParser.parseNumberingFile(I);
}
}
class Qag extends Re {
constructor(I, g, C) {
super(I, g), this._documentParser = C;
}
parseXml(I) {
this.styles = this._documentParser.parseStylesFile(I);
}
}
var Yg;
(function(t) {
t.Document = "document", t.Paragraph = "paragraph", t.Run = "run", t.Break = "break", t.NoBreakHyphen = "noBreakHyphen", t.Table = "table", t.Row = "row", t.Cell = "cell", t.Hyperlink = "hyperlink", t.SmartTag = "smartTag", t.Drawing = "drawing", t.Image = "image", t.Text = "text", t.Tab = "tab", t.Symbol = "symbol", t.BookmarkStart = "bookmarkStart", t.BookmarkEnd = "bookmarkEnd", t.Footer = "footer", t.Header = "header", t.FootnoteReference = "footnoteReference", t.EndnoteReference = "endnoteReference", t.Footnote = "footnote", t.Endnote = "endnote", t.SimpleField = "simpleField", t.ComplexField = "complexField", t.Instruction = "instruction", t.VmlPicture = "vmlPicture", t.MmlMath = "mmlMath", t.MmlMathParagraph = "mmlMathParagraph", t.MmlFraction = "mmlFraction", t.MmlFunction = "mmlFunction", t.MmlFunctionName = "mmlFunctionName", t.MmlNumerator = "mmlNumerator", t.MmlDenominator = "mmlDenominator", t.MmlRadical = "mmlRadical", t.MmlBase = "mmlBase", t.MmlDegree = "mmlDegree", t.MmlSuperscript = "mmlSuperscript", t.MmlSubscript = "mmlSubscript", t.MmlPreSubSuper = "mmlPreSubSuper", t.MmlSubArgument = "mmlSubArgument", t.MmlSuperArgument = "mmlSuperArgument", t.MmlNary = "mmlNary", t.MmlDelimiter = "mmlDelimiter", t.MmlRun = "mmlRun", t.MmlEquationArray = "mmlEquationArray", t.MmlLimit = "mmlLimit", t.MmlLimitLower = "mmlLimitLower", t.MmlMatrix = "mmlMatrix", t.MmlMatrixRow = "mmlMatrixRow", t.MmlBox = "mmlBox", t.MmlBar = "mmlBar", t.MmlGroupChar = "mmlGroupChar", t.VmlElement = "vmlElement", t.Inserted = "inserted", t.Deleted = "deleted", t.DeletedText = "deletedText", t.Comment = "comment", t.CommentReference = "commentReference", t.CommentRangeStart = "commentRangeStart", t.CommentRangeEnd = "commentRangeEnd", t.AltChunk = "altChunk";
})(Yg || (Yg = {}));
class bd {
constructor() {
this.children = [], this.cssStyle = {};
}
}
class Oag extends bd {
constructor() {
super(...arguments), this.type = Yg.Header;
}
}
class Uag extends bd {
constructor() {
super(...arguments), this.type = Yg.Footer;
}
}
class Y$ extends Re {
constructor(I, g, C) {
super(I, g), this._documentParser = C;
}
parseXml(I) {
this.rootElement = this.createRootElement(), this.rootElement.children = this._documentParser.parseBodyElements(I);
}
}
class Eag extends Y$ {
createRootElement() {
return new Oag();
}
}
class Pag extends Y$ {
createRootElement() {
return new Uag();
}
}
function _ag(t, I) {
const g = {};
for (let C of I.elements(t))
switch (C.localName) {
case "Template":
g.template = C.textContent;
break;
case "Pages":
g.pages = fu(C.textContent);
break;
case "Words":
g.words = fu(C.textContent);
break;
case "Characters":
g.characters = fu(C.textContent);
break;
case "Application":
g.application = C.textContent;
break;
case "Lines":
g.lines = fu(C.textContent);
break;
case "Paragraphs":
g.paragraphs = fu(C.textContent);
break;
case "Company":
g.company = C.textContent;
break;
case "AppVersion":
g.appVersion = C.textContent;
break;
}
return g;
}
function fu(t) {
if (!(typeof t > "u"))
return parseInt(t);
}
class qag extends Re {
parseXml(I) {
this.props = _ag(I, this._package.xmlParser);
}
}
function $ag(t, I) {
const g = {};
for (let C of I.elements(t))
switch (C.localName) {
case "title":
g.title = C.textContent;
break;
case "description":
g.description = C.textContent;
break;
case "subject":
g.subject = C.textContent;
break;
case "creator":
g.creator = C.textContent;
break;
case "keywords":
g.keywords = C.textContent;
break;
case "language":
g.language = C.textContent;
break;
case "lastModifiedBy":
g.lastModifiedBy = C.textContent;
break;
case "revision":
C.textContent && (g.revision = parseInt(C.textContent));
break;
}
return g;
}
class gog extends Re {
parseXml(I) {
this.props = $ag(I, this._package.xmlParser);
}
}
class Iog {
}
function Cog(t, I) {
var g = new Iog(), C = I.element(t, "themeElements");
for (let i of I.elements(C))
switch (i.localName) {
case "clrScheme":
g.colorScheme = tog(i, I);
break;
case "fontScheme":
g.fontScheme = iog(i, I);
break;
}
return g;
}
function tog(t, I) {
var g = {
name: I.attr(t, "name"),
colors: {}
};
for (let e of I.elements(t)) {
var C = I.element(e, "srgbClr"), i = I.element(e, "sysClr");
C ? g.colors[e.localName] = I.attr(C, "val") : i && (g.colors[e.localName] = I.attr(i, "lastClr"));
}
return g;
}
function iog(t, I) {
var g = {
name: I.attr(t, "name")
};
for (let C of I.elements(t))
switch (C.localName) {
case "majorFont":
g.majorFont = x6(C, I);
break;
case "minorFont":
g.minorFont = x6(C, I);
break;
}
return g;
}
function x6(t, I) {
return {
latinTypeface: I.elementAttr(t, "latin", "typeface"),
eaTypeface: I.elementAttr(t, "ea", "typeface"),
csTypeface: I.elementAttr(t, "cs", "typeface")
};
}
class eog extends Re {
constructor(I, g) {
super(I, g);
}
parseXml(I) {
this.theme = Cog(I, this._package.xmlParser);
}
}
class N$ {
}
class Aog extends N$ {
constructor() {
super(...arguments), this.type = Yg.Footnote;
}
}
class sog extends N$ {
constructor() {
super(...arguments), this.type = Yg.Endnote;
}
}
class V$ extends Re {
constructor(I, g, C) {
super(I, g), this._documentParser = C;
}
}
class log extends V$ {
constructor(I, g, C) {
super(I, g, C);
}
parseXml(I) {
this.notes = this._documentParser.parseNotes(I, "footnote", Aog);
}
}
class nog extends V$ {
constructor(I, g, C) {
super(I, g, C);
}
parseXml(I) {
this.notes = this._documentParser.parseNotes(I, "endnote", sog);
}
}
function aog(t, I) {
var g = {};
for (let C of I.elements(t))
switch (C.localName) {
case "defaultTabStop":
g.defaultTabStop = I.lengthAttr(C, "val");
break;
case "footnotePr":
g.footnoteProps = j6(C, I);
break;
case "endnotePr":
g.endnoteProps = j6(C, I);
break;
case "autoHyphenation":
g.autoHyphenation = I.boolAttr(C, "val");
break;
}
return g;
}
function j6(t, I) {
var g = {
defaultNoteIds: []
};
for (let C of I.elements(t))
switch (C.localName) {
case "numFmt":
g.nummeringFormat = I.attr(C, "val");
break;
case "footnote":
case "endnote":
g.defaultNoteIds.push(I.attr(C, "id"));
break;
}
return g;
}
class oog extends Re {
constructor(I, g) {
super(I, g);
}
parseXml(I) {
this.settings = aog(I, this._package.xmlParser);
}
}
function cog(t, I) {
return I.elements(t, "property").map((g) => {
const C = g.firstChild;
return {
formatId: I.attr(g, "fmtid"),
name: I.attr(g, "name"),
type: C.nodeName,
value: C.textContent
};
});
}
class dog extends Re {
parseXml(I) {
this.props = cog(I, this._package.xmlParser);
}
}
class rog extends Re {
constructor(I, g, C) {
super(I, g), this._documentParser = C;
}
parseXml(I) {
this.comments = this._documentParser.parseComments(I), this.commentMap = ea(this.comments, (g) => g.id);
}
}
class hog extends Re {
constructor(I, g) {
super(I, g), this.comments = [];
}
parseXml(I) {
const g = this._package.xmlParser;
for (let C of g.elements(I, "commentEx"))
this.comments.push({
paraId: g.attr(C, "paraId"),
paraIdParent: g.attr(C, "paraIdParent"),
done: g.boolAttr(C, "done")
});
this.commentMap = ea(this.comments, (C) => C.paraId);
}
}
const bog = [
{ type: At.OfficeDocument, target: "word/document.xml" },
{ type: At.ExtendedProperties, target: "docProps/app.xml" },
{ type: At.CoreProperties, target: "docProps/core.xml" },
{ type: At.CustomProperties, target: "docProps/custom.xml" }
];
class a9 {
constructor() {
this.parts = [], this.partsMap = {};
}
static async load(I, g, C) {
var i = new a9();
return i._options = C, i._parser = g, i._package = await l9.load(I, C), i.rels = await i._package.loadRelationships(), await Promise.all(bog.map((e) => {
const A = i.rels.find((s) => s.type === e.type) ?? e;
return i.loadRelationshipPart(A.target, A.type);
})), i;
}
save(I = "blob") {
return this._package.save(I);
}
async loadRelationshipPart(I, g) {
var i;
if (this.partsMap[I])
return this.partsMap[I];
if (!this._package.get(I))
return null;
let C = null;
switch (g) {
case At.OfficeDocument:
this.documentPart = C = new Hag(this._package, I, this._parser);
break;
case At.FontTable:
this.fontTablePart = C = new Rag(this._package, I);
break;
case At.Numbering:
this.numberingPart = C = new jag(this._package, I, this._parser);
break;
case At.Styles:
this.stylesPart = C = new Qag(this._package, I, this._parser);
break;
case At.Theme:
this.themePart = C = new eog(this._package, I);
break;
case At.Footnotes:
this.footnotesPart = C = new log(this._package, I, this._parser);
break;
case At.Endnotes:
this.endnotesPart = C = new nog(this._package, I, this._parser);
break;
case At.Footer:
C = new Pag(this._package, I, this._parser);
break;
case At.Header:
C = new Eag(this._package, I, this._parser);
break;
case At.CoreProperties:
this.corePropsPart = C = new gog(this._package, I);
break;
case At.ExtendedProperties:
this.extendedPropsPart = C = new qag(this._package, I);
break;
case At.CustomProperties:
C = new dog(this._package, I);
break;
case At.Settings:
this.settingsPart = C = new oog(this._package, I);
break;
case At.Comments:
this.commentsPart = C = new rog(this._package, I, this._parser);
break;
case At.CommentsExtended:
this.commentsExtendedPart = C = new hog(this._package, I);
break;
}
if (C == null)
return Promise.resolve(null);
if (this.partsMap[I] = C, this.parts.push(C), await C.load(), ((i = C.rels) == null ? void 0 : i.length) > 0) {
const [e] = lN(C.path);
await Promise.all(C.rels.map((A) => this.loadRelationshipPart(kH(A.target, e), A.type)));
}
return C;
}
async loadDocumentImage(I, g) {
const C = await this.loadResource(g ?? this.documentPart, I, "blob");
return this.blobToURL(C);
}
async loadNumberingImage(I) {
const g = await this.loadResource(this.numberingPart, I, "blob");
return this.blobToURL(g);
}
async loadFont(I, g) {
const C = await this.loadResource(this.fontTablePart, I, "uint8array");
return C && this.blobToURL(new Blob([uog(C, g)]));
}
async loadAltChunk(I, g) {
return await this.loadResource(g ?? this.documentPart, I, "string");
}
blobToURL(I) {
return I ? this._options.useBase64URL ? mag(I) : URL.createObjectURL(I) : null;
}
findPartByRelId(I, g = null) {
var C = (g.rels ?? this.rels).find((e) => e.id == I);
const i = g ? lN(g.path)[0] : "";
return C ? this.partsMap[kH(C.target, i)] : null;
}
getPathById(I, g) {
const C = I.rels.find((e) => e.id == g), [i] = lN(I.path);
return C ? kH(C.target, i) : null;
}
loadResource(I, g, C) {
const i = this.getPathById(I, g);
return i ? this._package.load(i, C) : Promise.resolve(null);
}
}
function uog(t, I) {
const C = I.replace(/{|}|-/g, ""), i = new Array(16);
for (let e = 0; e < 16; e++)
i[16 - e - 1] = parseInt(C.substr(e * 2, 2), 16);
for (let e = 0; e < 32; e++)
t[e] = t[e] ^ i[e % 16];
return t;
}
function mog(t, I) {
return {
type: Yg.BookmarkStart,
id: I.attr(t, "id"),
name: I.attr(t, "name"),
colFirst: I.intAttr(t, "colFirst"),
colLast: I.intAttr(t, "colLast")
};
}
function Zog(t, I) {
return {
type: Yg.BookmarkEnd,
id: I.attr(t, "id")
};
}
class Gog extends bd {
constructor() {
super(...arguments), this.type = Yg.VmlElement, this.attrs = {};
}
}
function M$(t, I) {
var g = new Gog();
switch (t.localName) {
case "rect":
g.tagName = "rect", Object.assign(g.attrs, { width: "100%", height: "100%" });
break;
case "oval":
g.tagName = "ellipse", Object.assign(g.attrs, { cx: "50%", cy: "50%", rx: "50%", ry: "50%" });
break;
case "line":
g.tagName = "line";
break;
case "shape":
g.tagName = "g";
break;
case "textbox":
g.tagName = "foreignObject", Object.assign(g.attrs, { width: "100%", height: "100%" });
break;
default:
return null;
}
for (const C of ug.attrs(t))
switch (C.localName) {
case "style":
g.cssStyleText = C.value;
break;
case "fillcolor":
g.attrs.fill = C.value;
break;
case "from":
const [i, e] = Q6(C.value);
Object.assign(g.attrs, { x1: i, y1: e });
break;
case "to":
const [A, s] = Q6(C.value);
Object.assign(g.attrs, { x2: A, y2: s });
break;
}
for (const C of ug.elements(t))
switch (C.localName) {
case "stroke":
Object.assign(g.attrs, wog(C));
break;
case "fill":
Object.assign(g.attrs, pog());
break;
case "imagedata":
g.tagName = "image", Object.assign(g.attrs, { width: "100%", height: "100%" }), g.imageHref = {
id: ug.attr(C, "id"),
title: ug.attr(C, "title")
};
break;
case "txbxContent":
g.children.push(...I.parseBodyElements(C));
break;
default:
const i = M$(C, I);
i && g.children.push(i);
break;
}
return g;
}
function wog(t) {
return {
stroke: ug.attr(t, "color"),
"stroke-width": ug.lengthAttr(t, "weight", st.Emu) ?? "1px"
};
}
function pog(t) {
return {};
}
function Q6(t) {
return t.split(",");
}
class Bog extends bd {
constructor() {
super(...arguments), this.type = Yg.Comment;
}
}
class Wog extends bd {
constructor(I) {
super(), this.id = I, this.type = Yg.CommentReference;
}
}
class yog extends bd {
constructor(I) {
super(), this.id = I, this.type = Yg.CommentRangeStart;
}
}
class Yog extends bd {
constructor(I) {
super(), this.id = I, this.type = Yg.CommentRangeEnd;
}
}
var nN = {
shd: "inherit",
color: "black",
borderColor: "black",
highlight: "transparent"
};
const Nog = [], O6 = {
oMath: Yg.MmlMath,
oMathPara: Yg.MmlMathParagraph,
f: Yg.MmlFraction,
func: Yg.MmlFunction,
fName: Yg.MmlFunctionName,
num: Yg.MmlNumerator,
den: Yg.MmlDenominator,
rad: Yg.MmlRadical,
deg: Yg.MmlDegree,
e: Yg.MmlBase,
sSup: Yg.MmlSuperscript,
sSub: Yg.MmlSubscript,
sPre: Yg.MmlPreSubSuper,
sup: Yg.MmlSuperArgument,
sub: Yg.MmlSubArgument,
d: Yg.MmlDelimiter,
nary: Yg.MmlNary,
eqArr: Yg.MmlEquationArray,
lim: Yg.MmlLimit,
limLow: Yg.MmlLimitLower,
m: Yg.MmlMatrix,
mr: Yg.MmlMatrixRow,
box: Yg.MmlBox,
bar: Yg.MmlBar,
groupChr: Yg.MmlGroupChar
};
class Vog {
constructor(I) {
this.options = {
ignoreWidth: !1,
debug: !1,
...I
};
}
parseNotes(I, g, C) {
var i = [];
for (let e of ug.elements(I, g)) {
const A = new C();
A.id = ug.attr(e, "id"), A.noteType = ug.attr(e, "type"), A.children = this.parseBodyElements(e), i.push(A);
}
return i;
}
parseComments(I) {
var g = [];
for (let C of ug.elements(I, "comment")) {
const i = new Bog();
i.id = ug.attr(C, "id"), i.author = ug.attr(C, "author"), i.initials = ug.attr(C, "initials"), i.date = ug.attr(C, "date"), i.children = this.parseBodyElements(C), g.push(i);
}
return g;
}
parseDocumentFile(I) {
var g = ug.element(I, "body"), C = ug.element(I, "background"), i = ug.element(g, "sectPr");
return {
type: Yg.Document,
children: this.parseBodyElements(g),
props: i ? p$(i, ug) : {},
cssStyle: C ? this.parseBackground(C) : {}
};
}
parseBackground(I) {
var g = {}, C = fC.colorAttr(I, "color");
return C && (g["background-color"] = C), g;
}
parseBodyElements(I) {
var g = [];
for (let C of ug.elements(I))
switch (C.localName) {
case "p":
g.push(this.parseParagraph(C));
break;
case "altChunk":
g.push(this.parseAltChunk(C));
break;
case "tbl":
g.push(this.parseTable(C));
break;
case "sdt":
g.push(...this.parseSdt(C, (i) => this.parseBodyElements(i)));
break;
}
return g;
}
parseStylesFile(I) {
var g = [];
return fC.foreach(I, (C) => {
switch (C.localName) {
case "style":
g.push(this.parseStyle(C));
break;
case "docDefaults":
g.push(this.parseDefaultStyles(C));
break;
}
}), g;
}
parseDefaultStyles(I) {
var g = {
id: null,
name: null,
target: null,
basedOn: null,
styles: []
};
return fC.foreach(I, (C) => {
switch (C.localName) {
case "rPrDefault":
var i = ug.element(C, "rPr");
i && g.styles.push({
target: "span",
values: this.parseDefaultProperties(i, {})
});
break;
case "pPrDefault":
var e = ug.element(C, "pPr");
e && g.styles.push({
target: "p",
values: this.parseDefaultProperties(e, {})
});
break;
}
}), g;
}
parseStyle(I) {
var g = {
id: ug.attr(I, "styleId"),
isDefault: ug.boolAttr(I, "default"),
name: null,
target: null,
basedOn: null,
styles: [],
linked: null
};
switch (ug.attr(I, "type")) {
case "paragraph":
g.target = "p";
break;
case "table":
g.target = "table";
break;
case "character":
g.target = "span";
break;
}
return fC.foreach(I, (C) => {
switch (C.localName) {
case "basedOn":
g.basedOn = ug.attr(C, "val");
break;
case "name":
g.name = ug.attr(C, "val");
break;
case "link":
g.linked = ug.attr(C, "val");
break;
case "next":
g.next = ug.attr(C, "val");
break;
case "aliases":
g.aliases = ug.attr(C, "val").split(",");
break;
case "pPr":
g.styles.push({
target: "p",
values: this.parseDefaultProperties(C, {})
}), g.paragraphProps = B$(C, ug);
break;
case "rPr":
g.styles.push({
target: "span",
values: this.parseDefaultProperties(C, {})
}), g.runProps = n9(C, ug);
break;
case "tblPr":
case "tcPr":
g.styles.push({
target: "td",
values: this.parseDefaultProperties(C, {})
});
break;
case "tblStylePr":
for (let i of this.parseTableStyle(C))
g.styles.push(i);
break;
case "rsid":
case "qFormat":
case "hidden":
case "semiHidden":
case "unhideWhenUsed":
case "autoRedefine":
case "uiPriority":
break;
default:
this.options.debug && console.warn(`DOCX: Unknown style element: ${C.localName}`);
}
}), g;
}
parseTableStyle(I) {
var g = [], C = ug.attr(I, "type"), i = "", e = "";
switch (C) {
case "firstRow":
e = ".first-row", i = "tr.first-row td";
break;
case "lastRow":
e = ".last-row", i = "tr.last-row td";
break;
case "firstCol":
e = ".first-col", i = "td.first-col";
break;
case "lastCol":
e = ".last-col", i = "td.last-col";
break;
case "band1Vert":
e = ":not(.no-vband)", i = "td.odd-col";
break;
case "band2Vert":
e = ":not(.no-vband)", i = "td.even-col";
break;
case "band1Horz":
e = ":not(.no-hband)", i = "tr.odd-row";
break;
case "band2Horz":
e = ":not(.no-hband)", i = "tr.even-row";
break;
default:
return [];
}
return fC.foreach(I, (A) => {
switch (A.localName) {
case "pPr":
g.push({
target: `${i} p`,
mod: e,
values: this.parseDefaultProperties(A, {})
});
break;
case "rPr":
g.push({
target: `${i} span`,
mod: e,
values: this.parseDefaultProperties(A, {})
});
break;
case "tblPr":
case "tcPr":
g.push({
target: i,
mod: e,
values: this.parseDefaultProperties(A, {})
});
break;
}
}), g;
}
parseNumberingFile(I) {
var g = [], C = {}, i = [];
return fC.foreach(I, (e) => {
switch (e.localName) {
case "abstractNum":
this.parseAbstractNumbering(e, i).forEach((l) => g.push(l));
break;
case "numPicBullet":
i.push(this.parseNumberingPicBullet(e));
break;
case "num":
var A = ug.attr(e, "numId"), s = ug.elementAttr(e, "abstractNumId", "val");
C[s] = A;
break;
}
}), g.forEach((e) => e.id = C[e.id]), g;
}
parseNumberingPicBullet(I) {
var g = ug.element(I, "pict"), C = g && ug.element(g, "shape"), i = C && ug.element(C, "imagedata");
return i ? {
id: ug.intAttr(I, "numPicBulletId"),
src: ug.attr(i, "id"),
style: ug.attr(C, "style")
} : null;
}
parseAbstractNumbering(I, g) {
var C = [], i = ug.attr(I, "abstractNumId");
return fC.foreach(I, (e) => {
switch (e.localName) {
case "lvl":
C.push(this.parseNumberingLevel(i, e, g));
break;
}
}), C;
}
parseNumberingLevel(I, g, C) {
var i = {
id: I,
level: ug.intAttr(g, "ilvl"),
start: 1,
pStyleName: void 0,
pStyle: {},
rStyle: {},
suff: "tab"
};
return fC.foreach(g, (e) => {
switch (e.localName) {
case "start":
i.start = ug.intAttr(e, "val");
break;
case "pPr":
this.parseDefaultProperties(e, i.pStyle);
break;
case "rPr":
this.parseDefaultProperties(e, i.rStyle);
break;
case "lvlPicBulletId":
var A = ug.intAttr(e, "val");
i.bullet = C.find((s) => (s == null ? void 0 : s.id) == A);
break;
case "lvlText":
i.levelText = ug.attr(e, "val");
break;
case "pStyle":
i.pStyleName = ug.attr(e, "val");
break;
case "numFmt":
i.format = ug.attr(e, "val");
break;
case "suff":
i.suff = ug.attr(e, "val");
break;
}
}), i;
}
parseSdt(I, g) {
const C = ug.element(I, "sdtContent");
return C ? g(C) : [];
}
parseInserted(I, g) {
var C;
return {
type: Yg.Inserted,
children: ((C = g(I)) == null ? void 0 : C.children) ?? []
};
}
parseDeleted(I, g) {
var C;
return {
type: Yg.Deleted,
children: ((C = g(I)) == null ? void 0 : C.children) ?? []
};
}
parseAltChunk(I) {
return { type: Yg.AltChunk, children: [], id: ug.attr(I, "id") };
}
parseParagraph(I) {
var g = { type: Yg.Paragraph, children: [] };
for (let C of ug.elements(I))
switch (C.localName) {
case "pPr":
this.parseParagraphProperties(C, g);
break;
case "r":
g.children.push(this.parseRun(C, g));
break;
case "hyperlink":
g.children.push(this.parseHyperlink(C, g));
break;
case "smartTag":
g.children.push(this.parseSmartTag(C, g));
break;
case "bookmarkStart":
g.children.push(mog(C, ug));
break;
case "bookmarkEnd":
g.children.push(Zog(C, ug));
break;
case "commentRangeStart":
g.children.push(new yog(ug.attr(C, "id")));
break;
case "commentRangeEnd":
g.children.push(new Yog(ug.attr(C, "id")));
break;
case "oMath":
case "oMathPara":
g.children.push(this.parseMathElement(C));
break;
case "sdt":
g.children.push(...this.parseSdt(C, (i) => this.parseParagraph(i).children));
break;
case "ins":
g.children.push(this.parseInserted(C, (i) => this.parseParagraph(i)));
break;
case "del":
g.children.push(this.parseDeleted(C, (i) => this.parseParagraph(i)));
break;
}
return g;
}
parseParagraphProperties(I, g) {
this.parseDefaultProperties(I, g.cssStyle = {}, null, (C) => {
if (W$(C, g, ug))
return !0;
switch (C.localName) {
case "pStyle":
g.styleName = ug.attr(C, "val");
break;
case "cnfStyle":
g.className = RC.classNameOfCnfStyle(C);
break;
case "framePr":
this.parseFrame(C, g);
break;
case "rPr":
break;
default:
return !1;
}
return !0;
});
}
parseFrame(I, g) {
var C = ug.attr(I, "dropCap");
C == "drop" && (g.cssStyle.float = "left");
}
parseHyperlink(I, g) {
var C = { type: Yg.Hyperlink, parent: g, children: [] };
return C.anchor = ug.attr(I, "anchor"), C.id = ug.attr(I, "id"), fC.foreach(I, (i) => {
switch (i.localName) {
case "r":
C.children.push(this.parseRun(i, C));
break;
}
}), C;
}
parseSmartTag(I, g) {
var C = { type: Yg.SmartTag, parent: g, children: [] }, i = ug.attr(I, "uri"), e = ug.attr(I, "element");
return i && (C.uri = i), e && (C.element = e), fC.foreach(I, (A) => {
switch (A.localName) {
case "r":
C.children.push(this.parseRun(A, C));
break;
}
}), C;
}
parseRun(I, g) {
var C = { type: Yg.Run, parent: g, children: [] };
return fC.foreach(I, (i) => {
switch (i = this.checkAlternateContent(i), i.localName) {
case "t":
C.children.push({
type: Yg.Text,
text: i.textContent
});
break;
case "delText":
C.children.push({
type: Yg.DeletedText,
text: i.textContent
});
break;
case "commentReference":
C.children.push(new Wog(ug.attr(i, "id")));
break;
case "fldSimple":
C.children.push({
type: Yg.SimpleField,
instruction: ug.attr(i, "instr"),
lock: ug.boolAttr(i, "lock", !1),
dirty: ug.boolAttr(i, "dirty", !1)
});
break;
case "instrText":
C.fieldRun = !0, C.children.push({
type: Yg.Instruction,
text: i.textContent
});
break;
case "fldChar":
C.fieldRun = !0, C.children.push({
type: Yg.ComplexField,
charType: ug.attr(i, "fldCharType"),
lock: ug.boolAttr(i, "lock", !1),
dirty: ug.boolAttr(i, "dirty", !1)
});
break;
case "noBreakHyphen":
C.children.push({ type: Yg.NoBreakHyphen });
break;
case "br":
C.children.push({
type: Yg.Break,
break: ug.attr(i, "type") || "textWrapping"
});
break;
case "lastRenderedPageBreak":
C.children.push({
type: Yg.Break,
break: "lastRenderedPageBreak"
});
break;
case "sym":
C.children.push({
type: Yg.Symbol,
font: xX(ug.attr(i, "font")),
char: ug.attr(i, "char")
});
break;
case "tab":
C.children.push({ type: Yg.Tab });
break;
case "footnoteReference":
C.children.push({
type: Yg.FootnoteReference,
id: ug.attr(i, "id")
});
break;
case "endnoteReference":
C.children.push({
type: Yg.EndnoteReference,
id: ug.attr(i, "id")
});
break;
case "drawing":
let e = this.parseDrawing(i);
e && (C.children = [e]);
break;
case "pict":
C.children.push(this.parseVmlPicture(i));
break;
case "rPr":
this.parseRunProperties(i, C);
break;
}
}), C;
}
parseMathElement(I) {
const g = `${I.localName}Pr`, C = { type: O6[I.localName], children: [] };
for (const e of ug.elements(I))
if (O6[e.localName])
C.children.push(this.parseMathElement(e));
else if (e.localName == "r") {
var i = this.parseRun(e);
i.type = Yg.MmlRun, C.children.push(i);
} else e.localName == g && (C.props = this.parseMathProperies(e));
return C;
}
parseMathProperies(I) {
const g = {};
for (const C of ug.elements(I))
switch (C.localName) {
case "chr":
g.char = ug.attr(C, "val");
break;
case "vertJc":
g.verticalJustification = ug.attr(C, "val");
break;
case "pos":
g.position = ug.attr(C, "val");
break;
case "degHide":
g.hideDegree = ug.boolAttr(C, "val");
break;
case "begChr":
g.beginChar = ug.attr(C, "val");
break;
case "endChr":
g.endChar = ug.attr(C, "val");
break;
}
return g;
}
parseRunProperties(I, g) {
this.parseDefaultProperties(I, g.cssStyle = {}, null, (C) => {
switch (C.localName) {
case "rStyle":
g.styleName = ug.attr(C, "val");
break;
case "vertAlign":
g.verticalAlign = RC.valueOfVertAlign(C, !0);
break;
default:
return !1;
}
return !0;
});
}
parseVmlPicture(I) {
const g = { type: Yg.VmlPicture, children: [] };
for (const C of ug.elements(I)) {
const i = M$(C, this);
i && g.children.push(i);
}
return g;
}
checkAlternateContent(I) {
var e;
if (I.localName != "AlternateContent")
return I;
var g = ug.element(I, "Choice");
if (g) {
var C = ug.attr(g, "Requires"), i = I.lookupNamespaceURI(C);
if (Nog.includes(i))
return g.firstElementChild;
}
return (e = ug.element(I, "Fallback")) == null ? void 0 : e.firstElementChild;
}
parseDrawing(I) {
for (var g of ug.elements(I))
switch (g.localName) {
case "inline":
case "anchor":
return this.parseDrawingWrapper(g);
}
}
parseDrawingWrapper(I) {
var g = { type: Yg.Drawing, children: [], cssStyle: {} }, C = I.localName == "anchor";
let i = null, e = ug.boolAttr(I, "simplePos");
ug.boolAttr(I, "behindDoc");
let A = { relative: "page", align: "left", offset: "0" }, s = { relative: "page", align: "top", offset: "0" };
for (var l of ug.elements(I))
switch (l.localName) {
case "simplePos":
e && (A.offset = ug.lengthAttr(l, "x", st.Emu), s.offset = ug.lengthAttr(l, "y", st.Emu));
break;
case "extent":
g.cssStyle.width = ug.lengthAttr(l, "cx", st.Emu), g.cssStyle.height = ug.lengthAttr(l, "cy", st.Emu);
break;
case "positionH":
case "positionV":
if (!e) {
let o = l.localName == "positionH" ? A : s;
var n = ug.element(l, "align"), a = ug.element(l, "posOffset");
o.relative = ug.attr(l, "relativeFrom") ?? o.relative, n && (o.align = n.textContent), a && (o.offset = fC.sizeValue(a, st.Emu));
}
break;
case "wrapTopAndBottom":
i = "wrapTopAndBottom";
break;
case "wrapNone":
i = "wrapNone";
break;
case "graphic":
var d = this.parseGraphic(l);
d && g.children.push(d);
break;
}
return i == "wrapTopAndBottom" ? (g.cssStyle.display = "block", A.align && (g.cssStyle["text-align"] = A.align, g.cssStyle.width = "100%")) : i == "wrapNone" ? (g.cssStyle.display = "block", g.cssStyle.position = "relative", g.cssStyle.width = "0px", g.cssStyle.height = "0px", A.offset && (g.cssStyle.left = A.offset), s.offset && (g.cssStyle.top = s.offset)) : C && (A.align == "left" || A.align == "right") && (g.cssStyle.float = A.align), g;
}
parseGraphic(I) {
var g = ug.element(I, "graphicData");
for (let C of ug.elements(g))
switch (C.localName) {
case "pic":
return this.parsePicture(C);
}
return null;
}
parsePicture(I) {
var g = { type: Yg.Image, src: "", cssStyle: {} }, C = ug.element(I, "blipFill"), i = ug.element(C, "blip");
g.src = ug.attr(i, "embed");
var e = ug.element(I, "spPr"), A = ug.element(e, "xfrm");
g.cssStyle.position = "relative";
for (var s of ug.elements(A))
switch (s.localName) {
case "ext":
g.cssStyle.width = ug.lengthAttr(s, "cx", st.Emu), g.cssStyle.height = ug.lengthAttr(s, "cy", st.Emu);
break;
case "off":
g.cssStyle.left = ug.lengthAttr(s, "x", st.Emu), g.cssStyle.top = ug.lengthAttr(s, "y", st.Emu);
break;
}
return g;
}
parseTable(I) {
var g = { type: Yg.Table, children: [] };
return fC.foreach(I, (C) => {
switch (C.localName) {
case "tr":
g.children.push(this.parseTableRow(C));
break;
case "tblGrid":
g.columns = this.parseTableColumns(C);
break;
case "tblPr":
this.parseTableProperties(C, g);
break;
}
}), g;
}
parseTableColumns(I) {
var g = [];
return fC.foreach(I, (C) => {
switch (C.localName) {
case "gridCol":
g.push({ width: ug.lengthAttr(C, "w") });
break;
}
}), g;
}
parseTableProperties(I, g) {
switch (g.cssStyle = {}, g.cellStyle = {}, this.parseDefaultProperties(I, g.cssStyle, g.cellStyle, (C) => {
switch (C.localName) {
case "tblStyle":
g.styleName = ug.attr(C, "val");
break;
case "tblLook":
g.className = RC.classNameOftblLook(C);
break;
case "tblpPr":
this.parseTablePosition(C, g);
break;
case "tblStyleColBandSize":
g.colBandSize = ug.intAttr(C, "val");
break;
case "tblStyleRowBandSize":
g.rowBandSize = ug.intAttr(C, "val");
break;
default:
return !1;
}
return !0;
}), g.cssStyle["text-align"]) {
case "center":
delete g.cssStyle["text-align"], g.cssStyle["margin-left"] = "auto", g.cssStyle["margin-right"] = "auto";
break;
case "right":
delete g.cssStyle["text-align"], g.cssStyle["margin-left"] = "auto";
break;
}
}
parseTablePosition(I, g) {
var C = ug.lengthAttr(I, "topFromText"), i = ug.lengthAttr(I, "bottomFromText"), e = ug.lengthAttr(I, "rightFromText"), A = ug.lengthAttr(I, "leftFromText");
g.cssStyle.float = "left", g.cssStyle["margin-bottom"] = RC.addSize(g.cssStyle["margin-bottom"], i), g.cssStyle["margin-left"] = RC.addSize(g.cssStyle["margin-left"], A), g.cssStyle["margin-right"] = RC.addSize(g.cssStyle["margin-right"], e), g.cssStyle["margin-top"] = RC.addSize(g.cssStyle["margin-top"], C);
}
parseTableRow(I) {
var g = { type: Yg.Row, children: [] };
return fC.foreach(I, (C) => {
switch (C.localName) {
case "tc":
g.children.push(this.parseTableCell(C));
break;
case "trPr":
this.parseTableRowProperties(C, g);
break;
}
}), g;
}
parseTableRowProperties(I, g) {
g.cssStyle = this.parseDefaultProperties(I, {}, null, (C) => {
switch (C.localName) {
case "cnfStyle":
g.className = RC.classNameOfCnfStyle(C);
break;
case "tblHeader":
g.isHeader = ug.boolAttr(C, "val");
break;
default:
return !1;
}
return !0;
});
}
parseTableCell(I) {
var g = { type: Yg.Cell, children: [] };
return fC.foreach(I, (C) => {
switch (C.localName) {
case "tbl":
g.children.push(this.parseTable(C));
break;
case "p":
g.children.push(this.parseParagraph(C));
break;
case "tcPr":
this.parseTableCellProperties(C, g);
break;
}
}), g;
}
parseTableCellProperties(I, g) {
g.cssStyle = this.parseDefaultProperties(I, {}, null, (C) => {
switch (C.localName) {
case "gridSpan":
g.span = ug.intAttr(C, "val", null);
break;
case "vMerge":
g.verticalMerge = ug.attr(C, "val") ?? "continue";
break;
case "cnfStyle":
g.className = RC.classNameOfCnfStyle(C);
break;
default:
return !1;
}
return !0;
}), this.parseTableCellVerticalText(I, g);
}
parseTableCellVerticalText(I, g) {
const C = {
btLr: {
writingMode: "vertical-rl",
transform: "rotate(180deg)"
},
lrTb: {
writingMode: "vertical-lr",
transform: "none"
},
tbRl: {
writingMode: "vertical-rl",
transform: "none"
}
};
fC.foreach(I, (i) => {
if (i.localName === "textDirection") {
const e = ug.attr(i, "val"), A = C[e] || { writingMode: "horizontal-tb" };
g.cssStyle["writing-mode"] = A.writingMode, g.cssStyle.transform = A.transform;
}
});
}
parseDefaultProperties(I, g = null, C = null, i = null) {
return g = g || {}, fC.foreach(I, (e) => {
if (!(i != null && i(e)))
switch (e.localName) {
case "jc":
g["text-align"] = RC.valueOfJc(e);
break;
case "textAlignment":
g["vertical-align"] = RC.valueOfTextAlignment(e);
break;
case "color":
g.color = fC.colorAttr(e, "val", null, nN.color);
break;
case "sz":
g["font-size"] = g["min-height"] = ug.lengthAttr(e, "val", st.FontSize);
break;
case "shd":
g["background-color"] = fC.colorAttr(e, "fill", null, nN.shd);
break;
case "highlight":
g["background-color"] = fC.colorAttr(e, "val", null, nN.highlight);
break;
case "vertAlign":
break;
case "position":
g.verticalAlign = ug.lengthAttr(e, "val", st.FontSize);
break;
case "tcW":
if (this.options.ignoreWidth)
break;
case "tblW":
g.width = RC.valueOfSize(e, "w");
break;
case "trHeight":
this.parseTrHeight(e, g);
break;
case "strike":
g["text-decoration"] = ug.boolAttr(e, "val", !0) ? "line-through" : "none";
break;
case "b":
g["font-weight"] = ug.boolAttr(e, "val", !0) ? "bold" : "normal";
break;
case "i":
g["font-style"] = ug.boolAttr(e, "val", !0) ? "italic" : "normal";
break;
case "caps":
g["text-transform"] = ug.boolAttr(e, "val", !0) ? "uppercase" : "none";
break;
case "smallCaps":
g["font-variant"] = ug.boolAttr(e, "val", !0) ? "small-caps" : "none";
break;
case "u":
this.parseUnderline(e, g);
break;
case "ind":
case "tblInd":
this.parseIndentation(e, g);
break;
case "rFonts":
this.parseFont(e, g);
break;
case "tblBorders":
this.parseBorderProperties(e, C || g);
break;
case "tblCellSpacing":
g["border-spacing"] = RC.valueOfMargin(e), g["border-collapse"] = "separate";
break;
case "pBdr":
this.parseBorderProperties(e, g);
break;
case "bdr":
g.border = RC.valueOfBorder(e);
break;
case "tcBorders":
this.parseBorderProperties(e, g);
break;
case "vanish":
ug.boolAttr(e, "val", !0) && (g.display = "none");
break;
case "kern":
break;
case "noWrap":
break;
case "tblCellMar":
case "tcMar":
this.parseMarginProperties(e, C || g);
break;
case "tblLayout":
g["table-layout"] = RC.valueOfTblLayout(e);
break;
case "vAlign":
g["vertical-align"] = RC.valueOfTextAlignment(e);
break;
case "spacing":
I.localName == "pPr" && this.parseSpacing(e, g);
break;
case "wordWrap":
ug.boolAttr(e, "val") && (g["overflow-wrap"] = "break-word");
break;
case "suppressAutoHyphens":
g.hyphens = ug.boolAttr(e, "val", !0) ? "none" : "auto";
break;
case "lang":
g.$lang = ug.attr(e, "val");
break;
case "bCs":
case "iCs":
case "szCs":
case "tabs":
case "outlineLvl":
case "contextualSpacing":
case "tblStyleColBandSize":
case "tblStyleRowBandSize":
case "webHidden":
case "pageBreakBefore":
case "suppressLineNumbers":
case "keepLines":
case "keepNext":
case "widowControl":
case "bidi":
case "rtl":
case "noProof":
break;
default:
this.options.debug && console.warn(`DOCX: Unknown document element: ${I.localName}.${e.localName}`);
break;
}
}), g;
}
parseUnderline(I, g) {
var C = ug.attr(I, "val");
if (C != null) {
switch (C) {
case "dash":
case "dashDotDotHeavy":
case "dashDotHeavy":
case "dashedHeavy":
case "dashLong":
case "dashLongHeavy":
case "dotDash":
case "dotDotDash":
g["text-decoration"] = "underline dashed";
break;
case "dotted":
case "dottedHeavy":
g["text-decoration"] = "underline dotted";
break;
case "double":
g["text-decoration"] = "underline double";
break;
case "single":
case "thick":
g["text-decoration"] = "underline";
break;
case "wave":
case "wavyDouble":
case "wavyHeavy":
g["text-decoration"] = "underline wavy";
break;
case "words":
g["text-decoration"] = "underline";
break;
case "none":
g["text-decoration"] = "none";
break;
}
var i = fC.colorAttr(I, "color");
i && (g["text-decoration-color"] = i);
}
}
parseFont(I, g) {
var C = ug.attr(I, "ascii"), i = RC.themeValue(I, "asciiTheme"), e = ug.attr(I, "eastAsia"), A = [C, i, e].filter((s) => s).map((s) => xX(s));
A.length > 0 && (g["font-family"] = [...new Set(A)].join(", "));
}
parseIndentation(I, g) {
var C = ug.lengthAttr(I, "firstLine"), i = ug.lengthAttr(I, "hanging"), e = ug.lengthAttr(I, "left"), A = ug.lengthAttr(I, "start"), s = ug.lengthAttr(I, "right"), l = ug.lengthAttr(I, "end");
C && (g["text-indent"] = C), i && (g["text-indent"] = `-${i}`), (e || A) && (g["margin-left"] = e || A), (s || l) && (g["margin-right"] = s || l);
}
parseSpacing(I, g) {
var C = ug.lengthAttr(I, "before"), i = ug.lengthAttr(I, "after"), e = ug.intAttr(I, "line", null), A = ug.attr(I, "lineRule");
if (C && (g["margin-top"] = C), i && (g["margin-bottom"] = i), e !== null)
switch (A) {
case "auto":
g["line-height"] = `${(e / 240).toFixed(2)}`;
break;
case "atLeast":
g["line-height"] = `calc(100% + ${e / 20}pt)`;
break;
default:
g["line-height"] = g["min-height"] = `${e / 20}pt`;
break;
}
}
parseMarginProperties(I, g) {
fC.foreach(I, (C) => {
switch (C.localName) {
case "left":
g["padding-left"] = RC.valueOfMargin(C);
break;
case "right":
g["padding-right"] = RC.valueOfMargin(C);
break;
case "top":
g["padding-top"] = RC.valueOfMargin(C);
break;
case "bottom":
g["padding-bottom"] = RC.valueOfMargin(C);
break;
}
});
}
parseTrHeight(I, g) {
switch (ug.attr(I, "hRule")) {
case "exact":
g.height = ug.lengthAttr(I, "val");
break;
case "atLeast":
default:
g.height = ug.lengthAttr(I, "val");
break;
}
}
parseBorderProperties(I, g) {
fC.foreach(I, (C) => {
switch (C.localName) {
case "start":
case "left":
g["border-left"] = RC.valueOfBorder(C);
break;
case "end":
case "right":
g["border-right"] = RC.valueOfBorder(C);
break;
case "top":
g["border-top"] = RC.valueOfBorder(C);
break;
case "bottom":
g["border-bottom"] = RC.valueOfBorder(C);
break;
}
});
}
}
const Mog = ["black", "blue", "cyan", "darkBlue", "darkCyan", "darkGray", "darkGreen", "darkMagenta", "darkRed", "darkYellow", "green", "lightGray", "magenta", "none", "red", "white", "yellow"];
class fC {
static foreach(I, g) {
for (var C = 0; C < I.childNodes.length; C++) {
let i = I.childNodes[C];
i.nodeType == Node.ELEMENT_NODE && g(i);
}
}
static colorAttr(I, g, C = null, i = "black") {
var e = ug.attr(I, g);
if (e)
return e == "auto" ? i : Mog.includes(e) ? e : `#${e}`;
var A = ug.attr(I, "themeColor");
return A ? `var(--docx-${A}-color)` : C;
}
static sizeValue(I, g = st.Dxa) {
return Z$(I.textContent, g);
}
}
class RC {
static themeValue(I, g) {
var C = ug.attr(I, g);
return C ? `var(--docx-${C}-font)` : null;
}
static valueOfSize(I, g) {
var C = st.Dxa;
switch (ug.attr(I, "type")) {
case "dxa":
break;
case "pct":
C = st.Percent;
break;
case "auto":
return "auto";
}
return ug.lengthAttr(I, g, C);
}
static valueOfMargin(I) {
return ug.lengthAttr(I, "w");
}
static valueOfBorder(I) {
var g = ug.attr(I, "val");
if (g == "nil")
return "none";
var C = fC.colorAttr(I, "color"), i = ug.lengthAttr(I, "sz", st.Border);
return `${i} solid ${C == "auto" ? nN.borderColor : C}`;
}
static valueOfTblLayout(I) {
var g = ug.attr(I, "val");
return g == "fixed" ? "fixed" : "auto";
}
static classNameOfCnfStyle(I) {
const g = ug.attr(I, "val");
return [
"first-row",
"last-row",
"first-col",
"last-col",
"odd-col",
"even-col",
"odd-row",
"even-row",
"ne-cell",
"nw-cell",
"se-cell",
"sw-cell"
].filter((i, e) => g[e] == "1").join(" ");
}
static valueOfJc(I) {
var g = ug.attr(I, "val");
switch (g) {
case "start":
case "left":
return "left";
case "center":
return "center";
case "end":
case "right":
return "right";
case "both":
return "justify";
}
return g;
}
static valueOfVertAlign(I, g = !1) {
var C = ug.attr(I, "val");
switch (C) {
case "subscript":
return "sub";
case "superscript":
return g ? "sup" : "super";
}
return g ? null : C;
}
static valueOfTextAlignment(I) {
var g = ug.attr(I, "val");
switch (g) {
case "auto":
case "baseline":
return "baseline";
case "top":
return "top";
case "center":
return "middle";
case "bottom":
return "bottom";
}
return g;
}
static addSize(I, g) {
return I == null ? g : g == null ? I : `calc(${I} + ${g})`;
}
static classNameOftblLook(I) {
const g = ug.hexAttr(I, "val", 0);
let C = "";
return (ug.boolAttr(I, "firstRow") || g & 32) && (C += " first-row"), (ug.boolAttr(I, "lastRow") || g & 64) && (C += " last-row"), (ug.boolAttr(I, "firstColumn") || g & 128) && (C += " first-col"), (ug.boolAttr(I, "lastColumn") || g & 256) && (C += " last-col"), (ug.boolAttr(I, "noHBand") || g & 512) && (C += " no-hband"), (ug.boolAttr(I, "noVBand") || g & 1024) && (C += " no-vband"), C.trim();
}
}
const U6 = { pos: 0, leader: "none", style: "left" }, Rog = 50;
function fog(t = document.body) {
const I = document.createElement("div");
I.style.width = "100pt", t.appendChild(I);
const g = 100 / I.offsetWidth;
return t.removeChild(I), g;
}
function Hog(t, I, g, C = 72 / 96) {
const i = t.closest("p"), e = t.getBoundingClientRect(), A = i.getBoundingClientRect(), s = getComputedStyle(i), l = (I == null ? void 0 : I.length) > 0 ? I.map((m) => ({
pos: E6(m.position),
leader: m.leader,
style: m.style
})).sort((m, Z) => m.pos - Z.pos) : [U6], n = l[l.length - 1], a = A.width * C, d = E6(g);
let o = n.pos + d;
if (o < a)
for (; o < a && l.length < Rog; o += d)
l.push({ ...U6, pos: o });
const c = parseFloat(s.marginLeft), r = A.left + c, h = (e.left - r) * C, b = l.find((m) => m.style != "clear" && m.pos > h);
if (b == null)
return;
let u = 1;
if (b.style == "right" || b.style == "center") {
const m = Array.from(i.querySelectorAll(`.${t.className}`)), Z = m.indexOf(t) + 1, p = document.createRange();
p.setStart(t, 1), Z < m.length ? p.setEndBefore(m[Z]) : p.setEndAfter(i);
const Y = b.style == "center" ? 0.5 : 1, R = p.getBoundingClientRect(), X = R.left + Y * R.width - (A.left - c);
u = b.pos - X * C;
} else
u = b.pos - h;
switch (t.innerHTML = " ", t.style.textDecoration = "inherit", t.style.wordSpacing = `${u.toFixed(0)}pt`, b.leader) {
case "dot":
case "middleDot":
t.style.textDecoration = "underline", t.style.textDecorationStyle = "dotted";
break;
case "hyphen":
case "heavy":
case "underscore":
t.style.textDecoration = "underline";
break;
}
}
function E6(t) {
return parseFloat(t);
}
const OI = {
svg: "http://www.w3.org/2000/svg",
mathML: "http://www.w3.org/1998/Math/MathML"
};
class Xog {
constructor(I) {
this.htmlDocument = I, this.className = "docx", this.styleMap = {}, this.currentPart = null, this.tableVerticalMerges = [], this.currentVerticalMerge = null, this.tableCellPositions = [], this.currentCellPosition = null, this.footnoteMap = {}, this.endnoteMap = {}, this.currentEndnoteIds = [], this.usedHederFooterParts = [], this.currentTabs = [], this.commentMap = {}, this.tasks = [], this.postRenderTasks = [];
}
async render(I, g, C = null, i) {
var A;
this.document = I, this.options = i, this.className = i.className, this.rootSelector = i.inWrapper ? `.${this.className}-wrapper` : ":root", this.styleMap = null, this.tasks = [], this.options.renderComments && globalThis.Highlight && (this.commentHighlight = new Highlight()), C = C || g, P6(C), P6(g), C.appendChild(this.createComment("docxjs library predefined styles")), C.appendChild(this.renderDefaultStyle()), I.themePart && (C.appendChild(this.createComment("docxjs document theme values")), this.renderTheme(I.themePart, C)), I.stylesPart != null && (this.styleMap = this.processStyles(I.stylesPart.styles), C.appendChild(this.createComment("docxjs document styles")), C.appendChild(this.renderStyles(I.stylesPart.styles))), I.numberingPart && (this.prodessNumberings(I.numberingPart.domNumberings), C.appendChild(this.createComment("docxjs document numbering styles")), C.appendChild(this.renderNumbering(I.numberingPart.domNumberings, C))), I.footnotesPart && (this.footnoteMap = ea(I.footnotesPart.notes, (s) => s.id)), I.endnotesPart && (this.endnoteMap = ea(I.endnotesPart.notes, (s) => s.id)), I.settingsPart && (this.defaultTabSize = (A = I.settingsPart.settings) == null ? void 0 : A.defaultTabStop), !i.ignoreFonts && I.fontTablePart && this.renderFontTable(I.fontTablePart, C);
var e = this.renderSections(I.documentPart.body);
this.options.inWrapper ? g.appendChild(this.renderWrapper(e)) : JH(g, e), this.commentHighlight && i.renderComments && CSS.highlights.set(`${this.className}-comments`, this.commentHighlight), this.postRenderTasks.forEach((s) => s()), await Promise.allSettled(this.tasks), this.refreshTabStops();
}
renderTheme(I, g) {
var s, l;
const C = {}, i = (s = I.theme) == null ? void 0 : s.fontScheme;
i && (i.majorFont && (C["--docx-majorHAnsi-font"] = i.majorFont.latinTypeface), i.minorFont && (C["--docx-minorHAnsi-font"] = i.minorFont.latinTypeface));
const e = (l = I.theme) == null ? void 0 : l.colorScheme;
if (e)
for (let [n, a] of Object.entries(e.colors))
C[`--docx-${n}-color`] = `#${a}`;
const A = this.styleToString(`.${this.className}`, C);
g.appendChild(this.createStyleElement(A));
}
renderFontTable(I, g) {
for (let C of I.fonts)
for (let i of C.embedFontRefs)
this.tasks.push(this.document.loadFont(i.id, i.key).then((e) => {
const A = {
"font-family": xX(C.name),
src: `url(${e})`
};
(i.type == "bold" || i.type == "boldItalic") && (A["font-weight"] = "bold"), (i.type == "italic" || i.type == "boldItalic") && (A["font-style"] = "italic");
const s = this.styleToString("@font-face", A);
g.appendChild(this.createComment(`docxjs ${C.name} font`)), g.appendChild(this.createStyleElement(s));
}));
}
processStyleName(I) {
return I ? `${this.className}_${uag(I)}` : this.className;
}
processStyles(I) {
const g = ea(I.filter((i) => i.id != null), (i) => i.id);
for (const i of I.filter((e) => e.basedOn)) {
var C = g[i.basedOn];
if (C) {
i.paragraphProps = gV(i.paragraphProps, C.paragraphProps), i.runProps = gV(i.runProps, C.runProps);
for (const e of C.styles) {
const A = i.styles.find((s) => s.target == e.target);
A ? this.copyStyleProperties(e.values, A.values) : i.styles.push({ ...e, values: { ...e.values } });
}
} else this.options.debug && console.warn(`Can't find base style ${i.basedOn}`);
}
for (let i of I)
i.cssName = this.processStyleName(i.id);
return g;
}
prodessNumberings(I) {
var g;
for (let C of I.filter((i) => i.pStyleName)) {
const i = this.findStyle(C.pStyleName);
(g = i == null ? void 0 : i.paragraphProps) != null && g.numbering && (i.paragraphProps.numbering.level = C.level);
}
}
processElement(I) {
if (I.children)
for (var g of I.children)
g.parent = I, g.type == Yg.Table ? this.processTable(g) : this.processElement(g);
}
processTable(I) {
for (var g of I.children)
for (var C of g.children)
C.cssStyle = this.copyStyleProperties(I.cellStyle, C.cssStyle, [
"border-left",
"border-right",
"border-top",
"border-bottom",
"padding-left",
"padding-right",
"padding-top",
"padding-bottom"
]), this.processElement(C);
}
copyStyleProperties(I, g, C = null) {
if (!I)
return g;
g == null && (g = {}), C == null && (C = Object.getOwnPropertyNames(I));
for (var i of C)
I.hasOwnProperty(i) && !g.hasOwnProperty(i) && (g[i] = I[i]);
return g;
}
createPageElement(I, g) {
var C = this.createElement("section", { className: I });
return g && (g.pageMargins && (C.style.paddingLeft = g.pageMargins.left, C.style.paddingRight = g.pageMargins.right, C.style.paddingTop = g.pageMargins.top, C.style.paddingBottom = g.pageMargins.bottom), g.pageSize && (this.options.ignoreWidth || (C.style.width = g.pageSize.width), this.options.ignoreHeight || (C.style.minHeight = g.pageSize.height))), C;
}
createSectionContent(I) {
var g = this.createElement("article");
return I.columns && I.columns.numberOfColumns && (g.style.columnCount = `${I.columns.numberOfColumns}`, g.style.columnGap = I.columns.space, I.columns.separator && (g.style.columnRule = "1px solid black")), g;
}
renderSections(I) {
const g = [];
this.processElement(I);
const C = this.splitBySection(I.children, I.props), i = this.groupByPageBreaks(C);
let e = null;
for (let s = 0, l = i.length; s < l; s++) {
this.currentFootnoteIds = [];
let a = i[s][0].sectProps;
const d = this.createPageElement(this.className, a);
this.renderStyleValues(I.cssStyle, d), this.options.renderHeaders && this.renderHeaderFooter(a.headerRefs, a, g.length, e != a, d);
for (const o of i[s]) {
var A = this.createSectionContent(o.sectProps);
this.renderElements(o.elements, A), d.appendChild(A), a = o.sectProps;
}
this.options.renderFootnotes && this.renderNotes(this.currentFootnoteIds, this.footnoteMap, d), this.options.renderEndnotes && s == l - 1 && this.renderNotes(this.currentEndnoteIds, this.endnoteMap, d), this.options.renderFooters && this.renderHeaderFooter(a.footerRefs, a, g.length, e != a, d), g.push(d), e = a;
}
return g;
}
renderHeaderFooter(I, g, C, i, e) {
if (I) {
var A = (g.titlePage && i ? I.find((l) => l.type == "first") : null) ?? (C % 2 == 1 ? I.find((l) => l.type == "even") : null) ?? I.find((l) => l.type == "default"), s = A && this.document.findPartByRelId(A.id, this.document.documentPart);
if (s) {
this.currentPart = s, this.usedHederFooterParts.includes(s.path) || (this.processElement(s.rootElement), this.usedHederFooterParts.push(s.path));
const [l] = this.renderElements([s.rootElement], e);
g != null && g.pageMargins && (s.rootElement.type === Yg.Header ? (l.style.marginTop = `calc(${g.pageMargins.header} - ${g.pageMargins.top})`, l.style.minHeight = `calc(${g.pageMargins.top} - ${g.pageMargins.header})`) : s.rootElement.type === Yg.Footer && (l.style.marginBottom = `calc(${g.pageMargins.footer} - ${g.pageMargins.bottom})`, l.style.minHeight = `calc(${g.pageMargins.bottom} - ${g.pageMargins.footer})`)), this.currentPart = null;
}
}
}
isPageBreakElement(I) {
return I.type != Yg.Break ? !1 : I.break == "lastRenderedPageBreak" ? !this.options.ignoreLastRenderedPageBreak : I.break == "page";
}
isPageBreakSection(I, g) {
var C, i, e, A, s, l;
return !I || !g ? !1 : ((C = I.pageSize) == null ? void 0 : C.orientation) != ((i = g.pageSize) == null ? void 0 : i.orientation) || ((e = I.pageSize) == null ? void 0 : e.width) != ((A = g.pageSize) == null ? void 0 : A.width) || ((s = I.pageSize) == null ? void 0 : s.height) != ((l = g.pageSize) == null ? void 0 : l.height);
}
splitBySection(I, g) {
var d;
var C = { sectProps: null, elements: [], pageBreak: !1 }, i = [C];
for (let o of I) {
if (o.type == Yg.Paragraph) {
const c = this.findStyle(o.styleName);
(d = c == null ? void 0 : c.paragraphProps) != null && d.pageBreakBefore && (C.sectProps = e, C.pageBreak = !0, C = { sectProps: null, elements: [], pageBreak: !1 }, i.push(C));
}
if (C.elements.push(o), o.type == Yg.Paragraph) {
const c = o;
var e = c.sectionProps, A = -1, s = -1;
if (this.options.breakPages && c.children && (A = c.children.findIndex((r) => {
var h;
return s = ((h = r.children) == null ? void 0 : h.findIndex(this.isPageBreakElement.bind(this))) ?? -1, s != -1;
})), (e || A != -1) && (C.sectProps = e, C.pageBreak = A != -1, C = { sectProps: null, elements: [], pageBreak: !1 }, i.push(C)), A != -1) {
let r = c.children[A], h = s < r.children.length - 1;
if (A < c.children.length - 1 || h) {
var l = o.children, n = { ...o, children: l.slice(A) };
if (o.children = l.slice(0, A), C.elements.push(n), h) {
let b = r.children, u = { ...r, children: b.slice(0, s) };
o.children.push(u), r.children = b.slice(s);
}
}
}
}
}
let a = null;
for (let o = i.length - 1; o >= 0; o--)
i[o].sectProps == null ? i[o].sectProps = a ?? g : a = i[o].sectProps;
return i;
}
groupByPageBreaks(I) {
let g = [], C;
const i = [g];
for (let e of I)
g.push(e), (this.options.ignoreLastRenderedPageBreak || e.pageBreak || this.isPageBreakSection(C, e.sectProps)) && i.push(g = []), C = e.sectProps;
return i.filter((e) => e.length > 0);
}
renderWrapper(I) {
return this.createElement("div", { className: `${this.className}-wrapper` }, I);
}
renderDefaultStyle() {
var I = this.className, g = `
.${I}-wrapper { background: gray; padding: 30px; padding-bottom: 0px; display: flex; flex-flow: column; align-items: center; }
.${I}-wrapper>section.${I} { background: white; box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); margin-bottom: 30px; }`;
this.options.hideWrapperOnPrint && (g = `@media not print { ${g} }`);
var C = `${g}
.${I} { color: black; hyphens: auto; text-underline-position: from-font; }
section.${I} { box-sizing: border-box; display: flex; flex-flow: column nowrap; position: relative; overflow: hidden; }
section.${I}>article { margin-bottom: auto; z-index: 1; }
section.${I}>footer { z-index: 1; }
.${I} table { border-collapse: collapse; }
.${I} table td, .${I} table th { vertical-align: top; }
.${I} p { margin: 0pt; min-height: 1em; }
.${I} span { white-space: pre-wrap; overflow-wrap: break-word; }
.${I} a { color: inherit; text-decoration: inherit; }
.${I} svg { fill: transparent; }
`;
return this.options.renderComments && (C += `
.${I}-comment-ref { cursor: default; }
.${I}-comment-popover { display: none; z-index: 1000; padding: 0.5rem; background: white; position: absolute; box-shadow: 0 0 0.25rem rgba(0, 0, 0, 0.25); width: 30ch; }
.${I}-comment-ref:hover~.${I}-comment-popover { display: block; }
.${I}-comment-author,.${I}-comment-date { font-size: 0.875rem; color: #888; }
`), this.createStyleElement(C);
}
renderNumbering(I, g) {
var C = "", i = [];
for (var e of I) {
var A = `p.${this.numberingClass(e.id, e.level)}`, s = "none";
if (e.bullet) {
let l = `--${this.className}-${e.bullet.src}`.toLowerCase();
C += this.styleToString(`${A}:before`, {
content: "' '",
display: "inline-block",
background: `var(${l})`
}, e.bullet.style), this.tasks.push(this.document.loadNumberingImage(e.bullet.src).then((n) => {
var a = `${this.rootSelector} { ${l}: url(${n}) }`;
g.appendChild(this.createStyleElement(a));
}));
} else if (e.levelText) {
let l = this.numberingCounter(e.id, e.level);
const n = l + " " + (e.start - 1);
e.level > 0 && (C += this.styleToString(`p.${this.numberingClass(e.id, e.level - 1)}`, {
"counter-set": n
})), i.push(n), C += this.styleToString(`${A}:before`, {
content: this.levelTextToContent(e.levelText, e.suff, e.id, this.numFormatToCssValue(e.format)),
"counter-increment": l,
...e.rStyle
});
} else
s = this.numFormatToCssValue(e.format);
C += this.styleToString(A, {
display: "list-item",
"list-style-position": "inside",
"list-style-type": s,
...e.pStyle
});
}
return i.length > 0 && (C += this.styleToString(this.rootSelector, {
"counter-reset": i.join(" ")
})), this.createStyleElement(C);
}
renderStyles(I) {
var g = "";
const C = this.styleMap, i = ea(I.filter((l) => l.isDefault), (l) => l.target);
for (const l of I) {
var e = l.styles;
if (l.linked) {
var A = l.linked && C[l.linked];
A ? e = e.concat(A.styles) : this.options.debug && console.warn(`Can't find linked style ${l.linked}`);
}
for (const n of e) {
var s = `${l.target ?? ""}.${l.cssName}`;
l.target != n.target && (s += ` ${n.target}`), i[l.target] == l && (s = `.${this.className} ${l.target}, ` + s), g += this.styleToString(s, n.values);
}
}
return this.createStyleElement(g);
}
renderNotes(I, g, C) {
var i = I.map((A) => g[A]).filter((A) => A);
if (i.length > 0) {
var e = this.createElement("ol", null, this.renderElements(i));
C.appendChild(e);
}
}
renderElement(I) {
switch (I.type) {
case Yg.Paragraph:
return this.renderParagraph(I);
case Yg.BookmarkStart:
return this.renderBookmarkStart(I);
case Yg.BookmarkEnd:
return null;
case Yg.Run:
return this.renderRun(I);
case Yg.Table:
return this.renderTable(I);
case Yg.Row:
return this.renderTableRow(I);
case Yg.Cell:
return this.renderTableCell(I);
case Yg.Hyperlink:
return this.renderHyperlink(I);
case Yg.SmartTag:
return this.renderSmartTag(I);
case Yg.Drawing:
return this.renderDrawing(I);
case Yg.Image:
return this.renderImage(I);
case Yg.Text:
return this.renderText(I);
case Yg.Text:
return this.renderText(I);
case Yg.DeletedText:
return this.renderDeletedText(I);
case Yg.Tab:
return this.renderTab(I);
case Yg.Symbol:
return this.renderSymbol(I);
case Yg.Break:
return this.renderBreak(I);
case Yg.Footer:
return this.renderContainer(I, "footer");
case Yg.Header:
return this.renderContainer(I, "header");
case Yg.Footnote:
case Yg.Endnote:
return this.renderContainer(I, "li");
case Yg.FootnoteReference:
return this.renderFootnoteReference(I);
case Yg.EndnoteReference:
return this.renderEndnoteReference(I);
case Yg.NoBreakHyphen:
return this.createElement("wbr");
case Yg.VmlPicture:
return this.renderVmlPicture(I);
case Yg.VmlElement:
return this.renderVmlElement(I);
case Yg.MmlMath:
return this.renderContainerNS(I, OI.mathML, "math", { xmlns: OI.mathML });
case Yg.MmlMathParagraph:
return this.renderContainer(I, "span");
case Yg.MmlFraction:
return this.renderContainerNS(I, OI.mathML, "mfrac");
case Yg.MmlBase:
return this.renderContainerNS(I, OI.mathML, I.parent.type == Yg.MmlMatrixRow ? "mtd" : "mrow");
case Yg.MmlNumerator:
case Yg.MmlDenominator:
case Yg.MmlFunction:
case Yg.MmlLimit:
case Yg.MmlBox:
return this.renderContainerNS(I, OI.mathML, "mrow");
case Yg.MmlGroupChar:
return this.renderMmlGroupChar(I);
case Yg.MmlLimitLower:
return this.renderContainerNS(I, OI.mathML, "munder");
case Yg.MmlMatrix:
return this.renderContainerNS(I, OI.mathML, "mtable");
case Yg.MmlMatrixRow:
return this.renderContainerNS(I, OI.mathML, "mtr");
case Yg.MmlRadical:
return this.renderMmlRadical(I);
case Yg.MmlSuperscript:
return this.renderContainerNS(I, OI.mathML, "msup");
case Yg.MmlSubscript:
return this.renderContainerNS(I, OI.mathML, "msub");
case Yg.MmlDegree:
case Yg.MmlSuperArgument:
case Yg.MmlSubArgument:
return this.renderContainerNS(I, OI.mathML, "mn");
case Yg.MmlFunctionName:
return this.renderContainerNS(I, OI.mathML, "ms");
case Yg.MmlDelimiter:
return this.renderMmlDelimiter(I);
case Yg.MmlRun:
return this.renderMmlRun(I);
case Yg.MmlNary:
return this.renderMmlNary(I);
case Yg.MmlPreSubSuper:
return this.renderMmlPreSubSuper(I);
case Yg.MmlBar:
return this.renderMmlBar(I);
case Yg.MmlEquationArray:
return this.renderMllList(I);
case Yg.Inserted:
return this.renderInserted(I);
case Yg.Deleted:
return this.renderDeleted(I);
case Yg.CommentRangeStart:
return this.renderCommentRangeStart(I);
case Yg.CommentRangeEnd:
return this.renderCommentRangeEnd(I);
case Yg.CommentReference:
return this.renderCommentReference(I);
case Yg.AltChunk:
return this.renderAltChunk(I);
}
return null;
}
renderElements(I, g) {
if (I == null)
return null;
var C = I.flatMap((i) => this.renderElement(i)).filter((i) => i != null);
return g && JH(g, C), C;
}
renderContainer(I, g, C) {
return this.createElement(g, C, this.renderElements(I.children));
}
renderContainerNS(I, g, C, i) {
return this.createElementNS(g, C, i, this.renderElements(I.children));
}
renderParagraph(I) {
var e, A;
var g = this.renderContainer(I, "p");
const C = this.findStyle(I.styleName);
I.tabs ?? (I.tabs = (e = C == null ? void 0 : C.paragraphProps) == null ? void 0 : e.tabs), this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), this.renderCommonProperties(g.style, I);
const i = I.numbering ?? ((A = C == null ? void 0 : C.paragraphProps) == null ? void 0 : A.numbering);
return i && g.classList.add(this.numberingClass(i.id, i.level)), g;
}
renderRunProperties(I, g) {
this.renderCommonProperties(I, g);
}
renderCommonProperties(I, g) {
g != null && (g.color && (I.color = g.color), g.fontSize && (I["font-size"] = g.fontSize));
}
renderHyperlink(I) {
var g = this.renderContainer(I, "a");
this.renderStyleValues(I.cssStyle, g);
let C = "";
if (I.id) {
const i = this.document.documentPart.rels.find((e) => e.id == I.id && e.targetMode === "External");
C = (i == null ? void 0 : i.target) ?? C;
}
return I.anchor && (C += `#${I.anchor}`), g.href = C, g;
}
renderSmartTag(I) {
return this.renderContainer(I, "span");
}
renderCommentRangeStart(I) {
var i;
if (!this.options.renderComments)
return null;
const g = new Range();
(i = this.commentHighlight) == null || i.add(g);
const C = this.htmlDocument.createComment(`start of comment #${I.id}`);
return this.later(() => g.setStart(C, 0)), this.commentMap[I.id] = g, C;
}
renderCommentRangeEnd(I) {
if (!this.options.renderComments)
return null;
const g = this.commentMap[I.id], C = this.htmlDocument.createComment(`end of comment #${I.id}`);
return this.later(() => g == null ? void 0 : g.setEnd(C, 0)), C;
}
renderCommentReference(I) {
var A;
if (!this.options.renderComments)
return null;
var g = (A = this.document.commentsPart) == null ? void 0 : A.commentMap[I.id];
if (!g)
return null;
const C = new DocumentFragment(), i = this.createElement("span", { className: `${this.className}-comment-ref` }, ["💬"]), e = this.createElement("div", { className: `${this.className}-comment-popover` });
return this.renderCommentContent(g, e), C.appendChild(this.htmlDocument.createComment(`comment #${g.id} by ${g.author} on ${g.date}`)), C.appendChild(i), C.appendChild(e), C;
}
renderAltChunk(I) {
if (!this.options.renderAltChunks)
return null;
var g = this.createElement("iframe");
return this.tasks.push(this.document.loadAltChunk(I.id, this.currentPart).then((C) => {
g.srcdoc = C;
})), g;
}
renderCommentContent(I, g) {
g.appendChild(this.createElement("div", { className: `${this.className}-comment-author` }, [I.author])), g.appendChild(this.createElement("div", { className: `${this.className}-comment-date` }, [new Date(I.date).toLocaleString()])), this.renderElements(I.children, g);
}
renderDrawing(I) {
var g = this.renderContainer(I, "div");
return g.style.display = "inline-block", g.style.position = "relative", g.style.textIndent = "0px", this.renderStyleValues(I.cssStyle, g), g;
}
renderImage(I) {
let g = this.createElement("img");
return this.renderStyleValues(I.cssStyle, g), this.document && this.tasks.push(this.document.loadDocumentImage(I.src, this.currentPart).then((C) => {
g.src = C;
})), g;
}
renderText(I) {
return this.htmlDocument.createTextNode(I.text);
}
renderDeletedText(I) {
return this.options.renderEndnotes ? this.htmlDocument.createTextNode(I.text) : null;
}
renderBreak(I) {
return I.break == "textWrapping" ? this.createElement("br") : null;
}
renderInserted(I) {
return this.options.renderChanges ? this.renderContainer(I, "ins") : this.renderElements(I.children);
}
renderDeleted(I) {
return this.options.renderChanges ? this.renderContainer(I, "del") : null;
}
renderSymbol(I) {
var g = this.createElement("span");
return g.style.fontFamily = I.font, g.innerHTML = `${I.char};`, g;
}
renderFootnoteReference(I) {
var g = this.createElement("sup");
return this.currentFootnoteIds.push(I.id), g.textContent = `${this.currentFootnoteIds.length}`, g;
}
renderEndnoteReference(I) {
var g = this.createElement("sup");
return this.currentEndnoteIds.push(I.id), g.textContent = `${this.currentEndnoteIds.length}`, g;
}
renderTab(I) {
var i;
var g = this.createElement("span");
if (g.innerHTML = " ", this.options.experimental) {
g.className = this.tabStopClass();
var C = (i = Sog(I, Yg.Paragraph)) == null ? void 0 : i.tabs;
this.currentTabs.push({ stops: C, span: g });
}
return g;
}
renderBookmarkStart(I) {
return this.createElement("span", { id: I.name });
}
renderRun(I) {
if (I.fieldRun)
return null;
const g = this.createElement("span");
if (I.id && (g.id = I.id), this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), I.verticalAlign) {
const C = this.createElement(I.verticalAlign);
this.renderElements(I.children, C), g.appendChild(C);
} else
this.renderElements(I.children, g);
return g;
}
renderTable(I) {
let g = this.createElement("table");
return this.tableCellPositions.push(this.currentCellPosition), this.tableVerticalMerges.push(this.currentVerticalMerge), this.currentVerticalMerge = {}, this.currentCellPosition = { col: 0, row: 0 }, I.columns && g.appendChild(this.renderTableColumns(I.columns)), this.renderClass(I, g), this.renderElements(I.children, g), this.renderStyleValues(I.cssStyle, g), this.currentVerticalMerge = this.tableVerticalMerges.pop(), this.currentCellPosition = this.tableCellPositions.pop(), g;
}
renderTableColumns(I) {
let g = this.createElement("colgroup");
for (let C of I) {
let i = this.createElement("col");
C.width && (i.style.width = C.width), g.appendChild(i);
}
return g;
}
renderTableRow(I) {
let g = this.renderContainer(I, "tr");
return this.currentCellPosition.col = 0, this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), this.currentCellPosition.row++, g;
}
renderTableCell(I) {
let g = this.renderContainer(I, "td");
const C = this.currentCellPosition.col;
return I.verticalMerge ? I.verticalMerge == "restart" ? (this.currentVerticalMerge[C] = g, g.rowSpan = 1) : this.currentVerticalMerge[C] && (this.currentVerticalMerge[C].rowSpan += 1, g.style.display = "none") : this.currentVerticalMerge[C] = null, this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), I.span && (g.colSpan = I.span), this.currentCellPosition.col += g.colSpan, g;
}
renderVmlPicture(I) {
return this.renderContainer(I, "div");
}
renderVmlElement(I) {
var i, e;
var g = this.createSvgElement("svg");
g.setAttribute("style", I.cssStyleText);
const C = this.renderVmlChildElement(I);
return (i = I.imageHref) != null && i.id && this.tasks.push((e = this.document) == null ? void 0 : e.loadDocumentImage(I.imageHref.id, this.currentPart).then((A) => C.setAttribute("href", A))), g.appendChild(C), requestAnimationFrame(() => {
const A = g.firstElementChild.getBBox();
g.setAttribute("width", `${Math.ceil(A.x + A.width)}`), g.setAttribute("height", `${Math.ceil(A.y + A.height)}`);
}), g;
}
renderVmlChildElement(I) {
const g = this.createSvgElement(I.tagName);
Object.entries(I.attrs).forEach(([C, i]) => g.setAttribute(C, i));
for (let C of I.children)
C.type == Yg.VmlElement ? g.appendChild(this.renderVmlChildElement(C)) : g.appendChild(...Ru(this.renderElement(C)));
return g;
}
renderMmlRadical(I) {
var i;
const g = I.children.find((e) => e.type == Yg.MmlBase);
if ((i = I.props) != null && i.hideDegree)
return this.createElementNS(OI.mathML, "msqrt", null, this.renderElements([g]));
const C = I.children.find((e) => e.type == Yg.MmlDegree);
return this.createElementNS(OI.mathML, "mroot", null, this.renderElements([g, C]));
}
renderMmlDelimiter(I) {
const g = [];
return g.push(this.createElementNS(OI.mathML, "mo", null, [I.props.beginChar ?? "("])), g.push(...this.renderElements(I.children)), g.push(this.createElementNS(OI.mathML, "mo", null, [I.props.endChar ?? ")"])), this.createElementNS(OI.mathML, "mrow", null, g);
}
renderMmlNary(I) {
var n;
const g = [], C = ea(I.children, (a) => a.type), i = C[Yg.MmlSuperArgument], e = C[Yg.MmlSubArgument], A = i ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(i))) : null, s = e ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(e))) : null, l = this.createElementNS(OI.mathML, "mo", null, [((n = I.props) == null ? void 0 : n.char) ?? "∫"]);
return A || s ? g.push(this.createElementNS(OI.mathML, "munderover", null, [l, s, A])) : A ? g.push(this.createElementNS(OI.mathML, "mover", null, [l, A])) : s ? g.push(this.createElementNS(OI.mathML, "munder", null, [l, s])) : g.push(l), g.push(...this.renderElements(C[Yg.MmlBase].children)), this.createElementNS(OI.mathML, "mrow", null, g);
}
renderMmlPreSubSuper(I) {
const g = [], C = ea(I.children, (n) => n.type), i = C[Yg.MmlSuperArgument], e = C[Yg.MmlSubArgument], A = i ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(i))) : null, s = e ? this.createElementNS(OI.mathML, "mo", null, Ru(this.renderElement(e))) : null, l = this.createElementNS(OI.mathML, "mo", null);
return g.push(this.createElementNS(OI.mathML, "msubsup", null, [l, s, A])), g.push(...this.renderElements(C[Yg.MmlBase].children)), this.createElementNS(OI.mathML, "mrow", null, g);
}
renderMmlGroupChar(I) {
const g = I.props.verticalJustification === "bot" ? "mover" : "munder", C = this.renderContainerNS(I, OI.mathML, g);
return I.props.char && C.appendChild(this.createElementNS(OI.mathML, "mo", null, [I.props.char])), C;
}
renderMmlBar(I) {
const g = this.renderContainerNS(I, OI.mathML, "mrow");
switch (I.props.position) {
case "top":
g.style.textDecoration = "overline";
break;
case "bottom":
g.style.textDecoration = "underline";
break;
}
return g;
}
renderMmlRun(I) {
const g = this.createElementNS(OI.mathML, "ms", null, this.renderElements(I.children));
return this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g), g;
}
renderMllList(I) {
const g = this.createElementNS(OI.mathML, "mtable");
this.renderClass(I, g), this.renderStyleValues(I.cssStyle, g);
for (let C of this.renderElements(I.children))
g.appendChild(this.createElementNS(OI.mathML, "mtr", null, [
this.createElementNS(OI.mathML, "mtd", null, [C])
]));
return g;
}
renderStyleValues(I, g) {
for (let C in I)
C.startsWith("$") ? g.setAttribute(C.slice(1), I[C]) : g.style[C] = I[C];
}
renderClass(I, g) {
I.className && (g.className = I.className), I.styleName && g.classList.add(this.processStyleName(I.styleName));
}
findStyle(I) {
var g;
return I && ((g = this.styleMap) == null ? void 0 : g[I]);
}
numberingClass(I, g) {
return `${this.className}-num-${I}-${g}`;
}
tabStopClass() {
return `${this.className}-tab-stop`;
}
styleToString(I, g, C = null) {
let i = `${I} {\r
`;
for (const e in g)
e.startsWith("$") || (i += ` ${e}: ${g[e]};\r
`);
return C && (i += C), i + `}\r
`;
}
numberingCounter(I, g) {
return `${this.className}-num-${I}-${g}`;
}
levelTextToContent(I, g, C, i) {
const e = {
tab: "\\9",
space: "\\a0"
};
var A = I.replace(/%\d*/g, (s) => {
let l = parseInt(s.substring(1), 10) - 1;
return `"counter(${this.numberingCounter(C, l)}, ${i})"`;
});
return `"${A}${e[g] ?? ""}"`;
}
numFormatToCssValue(I) {
var g = {
none: "none",
bullet: "disc",
decimal: "decimal",
lowerLetter: "lower-alpha",
upperLetter: "upper-alpha",
lowerRoman: "lower-roman",
upperRoman: "upper-roman",
decimalZero: "decimal-leading-zero",
aiueo: "katakana",
aiueoFullWidth: "katakana",
chineseCounting: "simp-chinese-informal",
chineseCountingThousand: "simp-chinese-informal",
chineseLegalSimplified: "simp-chinese-formal",
chosung: "hangul-consonant",
ideographDigital: "cjk-ideographic",
ideographTraditional: "cjk-heavenly-stem",
ideographLegalTraditional: "trad-chinese-formal",
ideographZodiac: "cjk-earthly-branch",
iroha: "katakana-iroha",
irohaFullWidth: "katakana-iroha",
japaneseCounting: "japanese-informal",
japaneseDigitalTenThousand: "cjk-decimal",
japaneseLegal: "japanese-formal",
thaiNumbers: "thai",
koreanCounting: "korean-hangul-formal",
koreanDigital: "korean-hangul-formal",
koreanDigital2: "korean-hanja-informal",
hebrew1: "hebrew",
hebrew2: "hebrew",
hindiNumbers: "devanagari",
ganada: "hangul",
taiwaneseCounting: "cjk-ideographic",
taiwaneseCountingThousand: "cjk-ideographic",
taiwaneseDigital: "cjk-decimal"
};
return g[I] ?? I;
}
refreshTabStops() {
this.options.experimental && setTimeout(() => {
const I = fog();
for (let g of this.currentTabs)
Hog(g.span, g.stops, this.defaultTabSize, I);
}, 500);
}
createElementNS(I, g, C, i) {
var e = I ? this.htmlDocument.createElementNS(I, g) : this.htmlDocument.createElement(g);
return Object.assign(e, C), i && JH(e, i), e;
}
createElement(I, g, C) {
return this.createElementNS(void 0, I, g, C);
}
createSvgElement(I, g, C) {
return this.createElementNS(OI.svg, I, g, C);
}
createStyleElement(I) {
return this.createElement("style", { innerHTML: I });
}
createComment(I) {
return this.htmlDocument.createComment(I);
}
later(I) {
this.postRenderTasks.push(I);
}
}
function P6(t) {
t.innerHTML = "";
}
function JH(t, I) {
I.forEach((g) => t.appendChild(Zag(g) ? document.createTextNode(g) : g));
}
function Sog(t, I) {
for (var g = t.parent; g != null && g.type != I; )
g = g.parent;
return g;
}
const o9 = {
ignoreHeight: !1,
ignoreWidth: !1,
ignoreFonts: !1,
breakPages: !0,
debug: !1,
experimental: !1,
className: "docx",
inWrapper: !0,
hideWrapperOnPrint: !1,
trimXmlDeclaration: !0,
ignoreLastRenderedPageBreak: !0,
renderHeaders: !0,
renderFooters: !0,
renderFootnotes: !0,
renderEndnotes: !0,
useBase64URL: !1,
renderChanges: !1,
renderComments: !1,
renderAltChunks: !0
};
function Dog(t, I) {
const g = { ...o9, ...I };
return a9.load(t, new Vog(g), g);
}
async function Kog(t, I, g, C) {
const i = { ...o9, ...C };
return await new Xog(window.document).render(t, I, g, i);
}
async function Fog(t, I, g, C) {
const i = await Dog(t, C);
return await Kog(i, I, g, C), i;
}
var mm = {};
mm.d = (t, I) => {
for (var g in I)
mm.o(I, g) && !mm.o(t, g) && Object.defineProperty(t, g, { enumerable: !0, get: I[g] });
};
mm.o = (t, I) => Object.prototype.hasOwnProperty.call(t, I);
var pI = globalThis.pdfjsLib = {};
mm.d(pI, {
AbortException: () => (
/* reexport */
Ea
),
AnnotationEditorLayer: () => (
/* reexport */
tD
),
AnnotationEditorParamsType: () => (
/* reexport */
iC
),
AnnotationEditorType: () => (
/* reexport */
XI
),
AnnotationEditorUIManager: () => (
/* reexport */
dd
),
AnnotationLayer: () => (
/* reexport */
HS
),
AnnotationMode: () => (
/* reexport */
la
),
AnnotationType: () => (
/* reexport */
dt
),
ColorPicker: () => (
/* reexport */
sV
),
DOMSVGFactory: () => (
/* reexport */
eV
),
DrawLayer: () => (
/* reexport */
AD
),
FeatureTest: () => (
/* reexport */
Ai
),
GlobalWorkerOptions: () => (
/* reexport */
Ql
),
ImageKind: () => (
/* reexport */
aN
),
InvalidPDFException: () => (
/* reexport */
QX
),
MathClamp: () => (
/* reexport */
fi
),
OPS: () => (
/* reexport */
IV
),
OutputScale: () => (
/* reexport */
In
),
PDFDataRangeTransport: () => (
/* reexport */
Hgg
),
PDFDateString: () => (
/* reexport */
b9
),
PDFWorker: () => (
/* reexport */
ch
),
PasswordResponses: () => (
/* reexport */
Jog
),
PermissionFlag: () => (
/* reexport */
zog
),
PixelsPerInch: () => (
/* reexport */
Pa
),
RenderingCancelledException: () => (
/* reexport */
r9
),
ResponseException: () => (
/* reexport */
CV
),
SignatureExtractor: () => (
/* reexport */
Ol
),
SupportedImageMimeTypes: () => (
/* reexport */
UX
),
TextLayer: () => (
/* reexport */
Mm
),
TouchManager: () => (
/* reexport */
iV
),
Util: () => (
/* reexport */
AI
),
VerbosityLevel: () => (
/* reexport */
PV
),
XfaLayer: () => (
/* reexport */
Sgg
),
build: () => (
/* reexport */
ldg
),
createValidAbsoluteUrl: () => (
/* reexport */
xog
),
fetchData: () => (
/* reexport */
AG
),
getDocument: () => (
/* reexport */
_cg
),
getFilenameFromUrl: () => (
/* reexport */
$og
),
getPdfFilenameFromUrl: () => (
/* reexport */
gcg
),
getUuid: () => (
/* reexport */
H$
),
getXfaPageViewport: () => (
/* reexport */
Icg
),
isDataScheme: () => (
/* reexport */
$V
),
isPdfFile: () => (
/* reexport */
h9
),
isValidExplicitDest: () => (
/* reexport */
Idg
),
noContextMenu: () => (
/* reexport */
zA
),
normalizeUnicode: () => (
/* reexport */
Pog
),
setLayerDimensions: () => (
/* reexport */
cd
),
shadow: () => (
/* reexport */
UI
),
stopEvent: () => (
/* reexport */
ht
),
version: () => (
/* reexport */
sdg
)
});
const $t = typeof process == "object" && process + "" == "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"), R$ = [1, 0, 0, 1, 0, 0], jX = [1e-3, 0, 0, 1e-3, 0, 0], LH = 1.35, ye = {
ANY: 1,
DISPLAY: 2,
PRINT: 4,
ANNOTATIONS_FORMS: 16,
ANNOTATIONS_STORAGE: 32,
ANNOTATIONS_DISABLE: 64,
IS_EDITING: 128,
OPLIST: 256
}, la = {
DISABLE: 0,
ENABLE: 1,
ENABLE_FORMS: 2,
ENABLE_STORAGE: 3
}, kog = "pdfjs_internal_editor_", XI = {
DISABLE: -1,
NONE: 0,
FREETEXT: 3,
HIGHLIGHT: 9,
STAMP: 13,
INK: 15,
SIGNATURE: 101
}, iC = {
RESIZE: 1,
CREATE: 2,
FREETEXT_SIZE: 11,
FREETEXT_COLOR: 12,
FREETEXT_OPACITY: 13,
INK_COLOR: 21,
INK_THICKNESS: 22,
INK_OPACITY: 23,
HIGHLIGHT_COLOR: 31,
HIGHLIGHT_DEFAULT_COLOR: 32,
HIGHLIGHT_THICKNESS: 33,
HIGHLIGHT_FREE: 34,
HIGHLIGHT_SHOW_ALL: 35,
DRAW_STEP: 41
}, zog = {
PRINT: 4,
MODIFY_CONTENTS: 8,
COPY: 16,
MODIFY_ANNOTATIONS: 32,
FILL_INTERACTIVE_FORMS: 256,
COPY_FOR_ACCESSIBILITY: 512,
ASSEMBLE: 1024,
PRINT_HIGH_QUALITY: 2048
}, hi = {
FILL: 0,
STROKE: 1,
FILL_STROKE: 2,
INVISIBLE: 3,
FILL_STROKE_MASK: 3,
ADD_TO_PATH_FLAG: 4
}, aN = {
GRAYSCALE_1BPP: 1,
RGB_24BPP: 2,
RGBA_32BPP: 3
}, dt = {
TEXT: 1,
LINK: 2,
FREETEXT: 3,
LINE: 4,
SQUARE: 5,
CIRCLE: 6,
POLYGON: 7,
POLYLINE: 8,
HIGHLIGHT: 9,
UNDERLINE: 10,
SQUIGGLY: 11,
STRIKEOUT: 12,
STAMP: 13,
CARET: 14,
INK: 15,
POPUP: 16,
FILEATTACHMENT: 17,
SOUND: 18,
MOVIE: 19,
WIDGET: 20,
SCREEN: 21,
PRINTERMARK: 22,
TRAPNET: 23,
WATERMARK: 24,
THREED: 25,
REDACT: 26
}, Qr = {
SOLID: 1,
DASHED: 2,
BEVELED: 3,
INSET: 4,
UNDERLINE: 5
}, PV = {
ERRORS: 0,
WARNINGS: 1,
INFOS: 5
}, IV = {
dependency: 1,
setLineWidth: 2,
setLineCap: 3,
setLineJoin: 4,
setMiterLimit: 5,
setDash: 6,
setRenderingIntent: 7,
setFlatness: 8,
setGState: 9,
save: 10,
restore: 11,
transform: 12,
moveTo: 13,
lineTo: 14,
curveTo: 15,
curveTo2: 16,
curveTo3: 17,
closePath: 18,
rectangle: 19,
stroke: 20,
closeStroke: 21,
fill: 22,
eoFill: 23,
fillStroke: 24,
eoFillStroke: 25,
closeFillStroke: 26,
closeEOFillStroke: 27,
endPath: 28,
clip: 29,
eoClip: 30,
beginText: 31,
endText: 32,
setCharSpacing: 33,
setWordSpacing: 34,
setHScale: 35,
setLeading: 36,
setFont: 37,
setTextRenderingMode: 38,
setTextRise: 39,
moveText: 40,
setLeadingMoveText: 41,
setTextMatrix: 42,
nextLine: 43,
showText: 44,
showSpacedText: 45,
nextLineShowText: 46,
nextLineSetSpacingShowText: 47,
setCharWidth: 48,
setCharWidthAndBounds: 49,
setStrokeColorSpace: 50,
setFillColorSpace: 51,
setStrokeColor: 52,
setStrokeColorN: 53,
setFillColor: 54,
setFillColorN: 55,
setStrokeGray: 56,
setFillGray: 57,
setStrokeRGBColor: 58,
setFillRGBColor: 59,
setStrokeCMYKColor: 60,
setFillCMYKColor: 61,
shadingFill: 62,
beginInlineImage: 63,
beginImageData: 64,
endInlineImage: 65,
paintXObject: 66,
markPoint: 67,
markPointProps: 68,
beginMarkedContent: 69,
beginMarkedContentProps: 70,
endMarkedContent: 71,
beginCompat: 72,
endCompat: 73,
paintFormXObjectBegin: 74,
paintFormXObjectEnd: 75,
beginGroup: 76,
endGroup: 77,
beginAnnotation: 80,
endAnnotation: 81,
paintImageMaskXObject: 83,
paintImageMaskXObjectGroup: 84,
paintImageXObject: 85,
paintInlineImageXObject: 86,
paintInlineImageXObjectGroup: 87,
paintImageXObjectRepeat: 88,
paintImageMaskXObjectRepeat: 89,
paintSolidColorImageMask: 90,
constructPath: 91,
setStrokeTransparent: 92,
setFillTransparent: 93
}, FY = {
moveTo: 0,
lineTo: 1,
curveTo: 2,
closePath: 3
}, Jog = {
NEED_PASSWORD: 1,
INCORRECT_PASSWORD: 2
};
let _V = PV.WARNINGS;
function Log(t) {
Number.isInteger(t) && (_V = t);
}
function vog() {
return _V;
}
function qV(t) {
_V >= PV.INFOS && console.log(`Info: ${t}`);
}
function DI(t) {
_V >= PV.WARNINGS && console.log(`Warning: ${t}`);
}
function BC(t) {
throw new Error(t);
}
function ut(t, I) {
t || BC(I);
}
function Tog(t) {
switch (t == null ? void 0 : t.protocol) {
case "http:":
case "https:":
case "ftp:":
case "mailto:":
case "tel:":
return !0;
default:
return !1;
}
}
function xog(t, I = null, g = null) {
if (!t)
return null;
if (g && typeof t == "string") {
if (g.addDefaultProtocol && t.startsWith("www.")) {
const i = t.match(/\./g);
(i == null ? void 0 : i.length) >= 2 && (t = `http://${t}`);
}
if (g.tryConvertEncoding)
try {
t = Eog(t);
} catch {
}
}
const C = I ? URL.parse(t, I) : URL.parse(t);
return Tog(C) ? C : null;
}
function UI(t, I, g, C = !1) {
return Object.defineProperty(t, I, {
value: g,
enumerable: !C,
configurable: !0,
writable: !1
}), g;
}
const ud = function() {
function I(g, C) {
this.message = g, this.name = C;
}
return I.prototype = new Error(), I.constructor = I, I;
}();
class _6 extends ud {
constructor(I, g) {
super(I, "PasswordException"), this.code = g;
}
}
class vH extends ud {
constructor(I, g) {
super(I, "UnknownErrorException"), this.details = g;
}
}
class QX extends ud {
constructor(I) {
super(I, "InvalidPDFException");
}
}
class CV extends ud {
constructor(I, g, C) {
super(I, "ResponseException"), this.status = g, this.missing = C;
}
}
class jog extends ud {
constructor(I) {
super(I, "FormatError");
}
}
class Ea extends ud {
constructor(I) {
super(I, "AbortException");
}
}
function f$(t) {
(typeof t != "object" || (t == null ? void 0 : t.length) === void 0) && BC("Invalid argument for bytesToString");
const I = t.length, g = 8192;
if (I < g)
return String.fromCharCode.apply(null, t);
const C = [];
for (let i = 0; i < I; i += g) {
const e = Math.min(i + g, I), A = t.subarray(i, e);
C.push(String.fromCharCode.apply(null, A));
}
return C.join("");
}
function eG(t) {
typeof t != "string" && BC("Invalid argument for stringToBytes");
const I = t.length, g = new Uint8Array(I);
for (let C = 0; C < I; ++C)
g[C] = t.charCodeAt(C) & 255;
return g;
}
function Qog(t) {
return String.fromCharCode(t >> 24 & 255, t >> 16 & 255, t >> 8 & 255, t & 255);
}
function c9(t) {
const I = /* @__PURE__ */ Object.create(null);
for (const [g, C] of t)
I[g] = C;
return I;
}
function Oog() {
const t = new Uint8Array(4);
return t[0] = 1, new Uint32Array(t.buffer, 0, 1)[0] === 1;
}
function Uog() {
try {
return new Function(""), !0;
} catch {
return !1;
}
}
class Ai {
static get isLittleEndian() {
return UI(this, "isLittleEndian", Oog());
}
static get isEvalSupported() {
return UI(this, "isEvalSupported", Uog());
}
static get isOffscreenCanvasSupported() {
return UI(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas < "u");
}
static get isImageDecoderSupported() {
return UI(this, "isImageDecoderSupported", typeof ImageDecoder < "u");
}
static get platform() {
if (typeof navigator < "u" && typeof (navigator == null ? void 0 : navigator.platform) == "string" && typeof (navigator == null ? void 0 : navigator.userAgent) == "string") {
const {
platform: I,
userAgent: g
} = navigator;
return UI(this, "platform", {
isAndroid: g.includes("Android"),
isLinux: I.includes("Linux"),
isMac: I.includes("Mac"),
isWindows: I.includes("Win"),
isFirefox: g.includes("Firefox")
});
}
return UI(this, "platform", {
isAndroid: !1,
isLinux: !1,
isMac: !1,
isWindows: !1,
isFirefox: !1
});
}
static get isCSSRoundSupported() {
var I, g;
return UI(this, "isCSSRoundSupported", (g = (I = globalThis.CSS) == null ? void 0 : I.supports) == null ? void 0 : g.call(I, "width: round(1.5px, 1px)"));
}
}
const TH = Array.from(Array(256).keys(), (t) => t.toString(16).padStart(2, "0"));
var $l, oN, OX;
class AI {
static makeHexColor(I, g, C) {
return `#${TH[I]}${TH[g]}${TH[C]}`;
}
static transform(I, g) {
return [I[0] * g[0] + I[2] * g[1], I[1] * g[0] + I[3] * g[1], I[0] * g[2] + I[2] * g[3], I[1] * g[2] + I[3] * g[3], I[0] * g[4] + I[2] * g[5] + I[4], I[1] * g[4] + I[3] * g[5] + I[5]];
}
static applyTransform(I, g) {
const C = I[0] * g[0] + I[1] * g[2] + g[4], i = I[0] * g[1] + I[1] * g[3] + g[5];
return [C, i];
}
static applyInverseTransform(I, g) {
const C = g[0] * g[3] - g[1] * g[2], i = (I[0] * g[3] - I[1] * g[2] + g[2] * g[5] - g[4] * g[3]) / C, e = (-I[0] * g[1] + I[1] * g[0] + g[4] * g[1] - g[5] * g[0]) / C;
return [i, e];
}
static getAxialAlignedBoundingBox(I, g) {
const C = this.applyTransform(I, g), i = this.applyTransform(I.slice(2, 4), g), e = this.applyTransform([I[0], I[3]], g), A = this.applyTransform([I[2], I[1]], g);
return [Math.min(C[0], i[0], e[0], A[0]), Math.min(C[1], i[1], e[1], A[1]), Math.max(C[0], i[0], e[0], A[0]), Math.max(C[1], i[1], e[1], A[1])];
}
static inverseTransform(I) {
const g = I[0] * I[3] - I[1] * I[2];
return [I[3] / g, -I[1] / g, -I[2] / g, I[0] / g, (I[2] * I[5] - I[4] * I[3]) / g, (I[4] * I[1] - I[5] * I[0]) / g];
}
static singularValueDecompose2dScale(I) {
const g = [I[0], I[2], I[1], I[3]], C = I[0] * g[0] + I[1] * g[2], i = I[0] * g[1] + I[1] * g[3], e = I[2] * g[0] + I[3] * g[2], A = I[2] * g[1] + I[3] * g[3], s = (C + A) / 2, l = Math.sqrt((C + A) ** 2 - 4 * (C * A - e * i)) / 2, n = s + l || 1, a = s - l || 1;
return [Math.sqrt(n), Math.sqrt(a)];
}
static normalizeRect(I) {
const g = I.slice(0);
return I[0] > I[2] && (g[0] = I[2], g[2] = I[0]), I[1] > I[3] && (g[1] = I[3], g[3] = I[1]), g;
}
static intersect(I, g) {
const C = Math.max(Math.min(I[0], I[2]), Math.min(g[0], g[2])), i = Math.min(Math.max(I[0], I[2]), Math.max(g[0], g[2]));
if (C > i)
return null;
const e = Math.max(Math.min(I[1], I[3]), Math.min(g[1], g[3])), A = Math.min(Math.max(I[1], I[3]), Math.max(g[1], g[3]));
return e > A ? null : [C, e, i, A];
}
static pointBoundingBox(I, g, C) {
C[0] = Math.min(C[0], I), C[1] = Math.min(C[1], g), C[2] = Math.max(C[2], I), C[3] = Math.max(C[3], g);
}
static rectBoundingBox(I, g, C, i, e) {
e[0] = Math.min(e[0], I, C), e[1] = Math.min(e[1], g, i), e[2] = Math.max(e[2], I, C), e[3] = Math.max(e[3], g, i);
}
static bezierBoundingBox(I, g, C, i, e, A, s, l, n) {
n[0] = Math.min(n[0], I, s), n[1] = Math.min(n[1], g, l), n[2] = Math.max(n[2], I, s), n[3] = Math.max(n[3], g, l), ig(this, $l, OX).call(this, I, C, e, s, g, i, A, l, 3 * (-I + 3 * (C - e) + s), 6 * (I - 2 * C + e), 3 * (C - I), n), ig(this, $l, OX).call(this, I, C, e, s, g, i, A, l, 3 * (-g + 3 * (i - A) + l), 6 * (g - 2 * i + A), 3 * (i - g), n);
}
}
$l = new WeakSet(), oN = function(I, g, C, i, e, A, s, l, n, a) {
if (n <= 0 || n >= 1)
return;
const d = 1 - n, o = n * n, c = o * n, r = d * (d * (d * I + 3 * n * g) + 3 * o * C) + c * i, h = d * (d * (d * e + 3 * n * A) + 3 * o * s) + c * l;
a[0] = Math.min(a[0], r), a[1] = Math.min(a[1], h), a[2] = Math.max(a[2], r), a[3] = Math.max(a[3], h);
}, OX = function(I, g, C, i, e, A, s, l, n, a, d, o) {
if (Math.abs(n) < 1e-12) {
Math.abs(a) >= 1e-12 && ig(this, $l, oN).call(this, I, g, C, i, e, A, s, l, -d / a, o);
return;
}
const c = a ** 2 - 4 * d * n;
if (c < 0)
return;
const r = Math.sqrt(c), h = 2 * n;
ig(this, $l, oN).call(this, I, g, C, i, e, A, s, l, (-a + r) / h, o), ig(this, $l, oN).call(this, I, g, C, i, e, A, s, l, (-a - r) / h, o);
}, tg(AI, $l);
function Eog(t) {
return decodeURIComponent(escape(t));
}
let xH = null, q6 = null;
function Pog(t) {
return xH || (xH = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu, q6 = /* @__PURE__ */ new Map([["ſt", "ſt"]])), t.replaceAll(xH, (I, g, C) => g ? g.normalize("NFKC") : q6.get(C));
}
function H$() {
if (typeof crypto.randomUUID == "function")
return crypto.randomUUID();
const t = new Uint8Array(32);
return crypto.getRandomValues(t), f$(t);
}
const d9 = "pdfjs_internal_id_";
function _og(t, I, g) {
if (!Array.isArray(g) || g.length < 2)
return !1;
const [C, i, ...e] = g;
if (!t(C) && !Number.isInteger(C) || !I(i))
return !1;
const A = e.length;
let s = !0;
switch (i.name) {
case "XYZ":
if (A < 2 || A > 3)
return !1;
break;
case "Fit":
case "FitB":
return A === 0;
case "FitH":
case "FitBH":
case "FitV":
case "FitBV":
if (A > 1)
return !1;
break;
case "FitR":
if (A !== 4)
return !1;
s = !1;
break;
default:
return !1;
}
for (const l of e)
if (!(typeof l == "number" || s && l === null))
return !1;
return !0;
}
function fi(t, I, g) {
return Math.min(Math.max(t, I), g);
}
function X$(t) {
return Uint8Array.prototype.toBase64 ? t.toBase64() : btoa(f$(t));
}
function qog(t) {
return Uint8Array.fromBase64 ? Uint8Array.fromBase64(t) : eG(atob(t));
}
typeof Promise.try != "function" && (Promise.try = function(t, ...I) {
return new Promise((g) => {
g(t(...I));
});
});
typeof Math.sumPrecise != "function" && (Math.sumPrecise = function(t) {
return t.reduce((I, g) => I + g, 0);
});
const dl = "http://www.w3.org/2000/svg", _o = class _o {
};
iI(_o, "CSS", 96), iI(_o, "PDF", 72), iI(_o, "PDF_TO_CSS_UNITS", _o.CSS / _o.PDF);
let Pa = _o;
async function AG(t, I = "text") {
if (Or(t, document.baseURI)) {
const g = await fetch(t);
if (!g.ok)
throw new Error(g.statusText);
switch (I) {
case "arraybuffer":
return g.arrayBuffer();
case "blob":
return g.blob();
case "json":
return g.json();
}
return g.text();
}
return new Promise((g, C) => {
const i = new XMLHttpRequest();
i.open("GET", t, !0), i.responseType = I, i.onreadystatechange = () => {
if (i.readyState === XMLHttpRequest.DONE) {
if (i.status === 200 || i.status === 0) {
switch (I) {
case "arraybuffer":
case "blob":
case "json":
g(i.response);
return;
}
g(i.responseText);
return;
}
C(new Error(i.statusText));
}
}, i.send(null);
});
}
class sG {
constructor({
viewBox: I,
userUnit: g,
scale: C,
rotation: i,
offsetX: e = 0,
offsetY: A = 0,
dontFlip: s = !1
}) {
this.viewBox = I, this.userUnit = g, this.scale = C, this.rotation = i, this.offsetX = e, this.offsetY = A, C *= g;
const l = (I[2] + I[0]) / 2, n = (I[3] + I[1]) / 2;
let a, d, o, c;
switch (i %= 360, i < 0 && (i += 360), i) {
case 180:
a = -1, d = 0, o = 0, c = 1;
break;
case 90:
a = 0, d = 1, o = 1, c = 0;
break;
case 270:
a = 0, d = -1, o = -1, c = 0;
break;
case 0:
a = 1, d = 0, o = 0, c = -1;
break;
default:
throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.");
}
s && (o = -o, c = -c);
let r, h, b, u;
a === 0 ? (r = Math.abs(n - I[1]) * C + e, h = Math.abs(l - I[0]) * C + A, b = (I[3] - I[1]) * C, u = (I[2] - I[0]) * C) : (r = Math.abs(l - I[0]) * C + e, h = Math.abs(n - I[1]) * C + A, b = (I[2] - I[0]) * C, u = (I[3] - I[1]) * C), this.transform = [a * C, d * C, o * C, c * C, r - a * C * l - o * C * n, h - d * C * l - c * C * n], this.width = b, this.height = u;
}
get rawDims() {
const I = this.viewBox;
return UI(this, "rawDims", {
pageWidth: I[2] - I[0],
pageHeight: I[3] - I[1],
pageX: I[0],
pageY: I[1]
});
}
clone({
scale: I = this.scale,
rotation: g = this.rotation,
offsetX: C = this.offsetX,
offsetY: i = this.offsetY,
dontFlip: e = !1
} = {}) {
return new sG({
viewBox: this.viewBox.slice(),
userUnit: this.userUnit,
scale: I,
rotation: g,
offsetX: C,
offsetY: i,
dontFlip: e
});
}
convertToViewportPoint(I, g) {
return AI.applyTransform([I, g], this.transform);
}
convertToViewportRectangle(I) {
const g = AI.applyTransform([I[0], I[1]], this.transform), C = AI.applyTransform([I[2], I[3]], this.transform);
return [g[0], g[1], C[0], C[1]];
}
convertToPdfPoint(I, g) {
return AI.applyInverseTransform([I, g], this.transform);
}
}
class r9 extends ud {
constructor(I, g = 0) {
super(I, "RenderingCancelledException"), this.extraDelay = g;
}
}
function $V(t) {
const I = t.length;
let g = 0;
for (; g < I && t[g].trim() === ""; )
g++;
return t.substring(g, g + 5).toLowerCase() === "data:";
}
function h9(t) {
return typeof t == "string" && /\.pdf$/i.test(t);
}
function $og(t) {
return [t] = t.split(/[#?]/, 1), t.substring(t.lastIndexOf("/") + 1);
}
function gcg(t, I = "document.pdf") {
if (typeof t != "string")
return I;
if ($V(t))
return DI('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'), I;
const g = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/, C = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i, i = g.exec(t);
let e = C.exec(i[1]) || C.exec(i[2]) || C.exec(i[3]);
if (e && (e = e[0], e.includes("%")))
try {
e = C.exec(decodeURIComponent(e))[0];
} catch {
}
return e || I;
}
class $6 {
constructor() {
iI(this, "started", /* @__PURE__ */ Object.create(null));
iI(this, "times", []);
}
time(I) {
I in this.started && DI(`Timer is already running for ${I}`), this.started[I] = Date.now();
}
timeEnd(I) {
I in this.started || DI(`Timer has not been started for ${I}`), this.times.push({
name: I,
start: this.started[I],
end: Date.now()
}), delete this.started[I];
}
toString() {
const I = [];
let g = 0;
for (const {
name: C
} of this.times)
g = Math.max(C.length, g);
for (const {
name: C,
start: i,
end: e
} of this.times)
I.push(`${C.padEnd(g)} ${e - i}ms
`);
return I.join("");
}
}
function Or(t, I) {
const g = I ? URL.parse(t, I) : URL.parse(t);
return (g == null ? void 0 : g.protocol) === "http:" || (g == null ? void 0 : g.protocol) === "https:";
}
function zA(t) {
t.preventDefault();
}
function ht(t) {
t.preventDefault(), t.stopPropagation();
}
var Sm;
class b9 {
static toDateObject(I) {
if (!I || typeof I != "string")
return null;
M(this, Sm) || $(this, Sm, new RegExp("^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([Z|+|-])?(\\d{2})?'?(\\d{2})?'?"));
const g = M(this, Sm).exec(I);
if (!g)
return null;
const C = parseInt(g[1], 10);
let i = parseInt(g[2], 10);
i = i >= 1 && i <= 12 ? i - 1 : 0;
let e = parseInt(g[3], 10);
e = e >= 1 && e <= 31 ? e : 1;
let A = parseInt(g[4], 10);
A = A >= 0 && A <= 23 ? A : 0;
let s = parseInt(g[5], 10);
s = s >= 0 && s <= 59 ? s : 0;
let l = parseInt(g[6], 10);
l = l >= 0 && l <= 59 ? l : 0;
const n = g[7] || "Z";
let a = parseInt(g[8], 10);
a = a >= 0 && a <= 23 ? a : 0;
let d = parseInt(g[9], 10) || 0;
return d = d >= 0 && d <= 59 ? d : 0, n === "-" ? (A += a, s += d) : n === "+" && (A -= a, s -= d), new Date(Date.UTC(C, i, e, A, s, l));
}
}
Sm = new WeakMap(), tg(b9, Sm);
function Icg(t, {
scale: I = 1,
rotation: g = 0
}) {
const {
width: C,
height: i
} = t.attributes.style, e = [0, 0, parseInt(C), parseInt(i)];
return new sG({
viewBox: e,
userUnit: 1,
scale: I,
rotation: g
});
}
function u9(t) {
if (t.startsWith("#")) {
const I = parseInt(t.slice(1), 16);
return [(I & 16711680) >> 16, (I & 65280) >> 8, I & 255];
}
return t.startsWith("rgb(") ? t.slice(4, -1).split(",").map((I) => parseInt(I)) : t.startsWith("rgba(") ? t.slice(5, -1).split(",").map((I) => parseInt(I)).slice(0, 3) : (DI(`Not a valid color format: "${t}"`), [0, 0, 0]);
}
function Ccg(t) {
const I = document.createElement("span");
I.style.visibility = "hidden", document.body.append(I);
for (const g of t.keys()) {
I.style.color = g;
const C = window.getComputedStyle(I).color;
t.set(g, u9(C));
}
I.remove();
}
function zC(t) {
const {
a: I,
b: g,
c: C,
d: i,
e,
f: A
} = t.getTransform();
return [I, g, C, i, e, A];
}
function ss(t) {
const {
a: I,
b: g,
c: C,
d: i,
e,
f: A
} = t.getTransform().invertSelf();
return [I, g, C, i, e, A];
}
function cd(t, I, g = !1, C = !0) {
if (I instanceof sG) {
const {
pageWidth: i,
pageHeight: e
} = I.rawDims, {
style: A
} = t, s = Ai.isCSSRoundSupported, l = `var(--total-scale-factor) * ${i}px`, n = `var(--total-scale-factor) * ${e}px`, a = s ? `round(down, ${l}, var(--scale-round-x))` : `calc(${l})`, d = s ? `round(down, ${n}, var(--scale-round-y))` : `calc(${n})`;
!g || I.rotation % 180 === 0 ? (A.width = a, A.height = d) : (A.width = d, A.height = a);
}
C && t.setAttribute("data-main-rotation", I.rotation);
}
class In {
constructor() {
const {
pixelRatio: I
} = In;
this.sx = I, this.sy = I;
}
get scaled() {
return this.sx !== 1 || this.sy !== 1;
}
get symmetric() {
return this.sx === this.sy;
}
limitCanvas(I, g, C, i) {
let e = 1 / 0, A = 1 / 0, s = 1 / 0;
C > 0 && (e = Math.sqrt(C / (I * g))), i !== -1 && (A = i / I, s = i / g);
const l = Math.min(e, A, s);
return this.sx > l || this.sy > l ? (this.sx = l, this.sy = l, !0) : !1;
}
static get pixelRatio() {
return globalThis.devicePixelRatio || 1;
}
}
const UX = ["image/apng", "image/avif", "image/bmp", "image/gif", "image/jpeg", "image/png", "image/svg+xml", "image/webp", "image/x-icon"];
var aa, Cc, je, oa, Dm, mh, Km, fV, S$, ei, D$, K$, vu, F$, cN;
const ul = class ul {
constructor(I) {
tg(this, ei);
tg(this, aa, null);
tg(this, Cc, null);
tg(this, je);
tg(this, oa, null);
tg(this, Dm, null);
tg(this, mh, null);
$(this, je, I), M(ul, Km) || $(ul, Km, Object.freeze({
freetext: "pdfjs-editor-remove-freetext-button",
highlight: "pdfjs-editor-remove-highlight-button",
ink: "pdfjs-editor-remove-ink-button",
stamp: "pdfjs-editor-remove-stamp-button",
signature: "pdfjs-editor-remove-signature-button"
}));
}
render() {
const I = $(this, aa, document.createElement("div"));
I.classList.add("editToolbar", "hidden"), I.setAttribute("role", "toolbar");
const g = M(this, je)._uiManager._signal;
I.addEventListener("contextmenu", zA, {
signal: g
}), I.addEventListener("pointerdown", ig(ul, fV, S$), {
signal: g
});
const C = $(this, oa, document.createElement("div"));
C.className = "buttons", I.append(C);
const i = M(this, je).toolbarPosition;
if (i) {
const {
style: e
} = I, A = M(this, je)._uiManager.direction === "ltr" ? 1 - i[0] : i[0];
e.insetInlineEnd = `${100 * A}%`, e.top = `calc(${100 * i[1]}% + var(--editor-toolbar-vert-offset))`;
}
return ig(this, ei, F$).call(this), I;
}
get div() {
return M(this, aa);
}
hide() {
var I;
M(this, aa).classList.add("hidden"), (I = M(this, Cc)) == null || I.hideDropdown();
}
show() {
var I;
M(this, aa).classList.remove("hidden"), (I = M(this, Dm)) == null || I.shown();
}
async addAltText(I) {
const g = await I.render();
ig(this, ei, vu).call(this, g), M(this, oa).prepend(g, M(this, ei, cN)), $(this, Dm, I);
}
addColorPicker(I) {
$(this, Cc, I);
const g = I.renderButton();
ig(this, ei, vu).call(this, g), M(this, oa).prepend(g, M(this, ei, cN));
}
async addEditSignatureButton(I) {
const g = $(this, mh, await I.renderEditButton(M(this, je)));
ig(this, ei, vu).call(this, g), M(this, oa).prepend(g, M(this, ei, cN));
}
updateEditSignatureButton(I) {
M(this, mh) && (M(this, mh).title = I);
}
remove() {
var I;
M(this, aa).remove(), (I = M(this, Cc)) == null || I.destroy(), $(this, Cc, null);
}
};
aa = new WeakMap(), Cc = new WeakMap(), je = new WeakMap(), oa = new WeakMap(), Dm = new WeakMap(), mh = new WeakMap(), Km = new WeakMap(), fV = new WeakSet(), S$ = function(I) {
I.stopPropagation();
}, ei = new WeakSet(), D$ = function(I) {
M(this, je)._focusEventsAllowed = !1, ht(I);
}, K$ = function(I) {
M(this, je)._focusEventsAllowed = !0, ht(I);
}, vu = function(I) {
const g = M(this, je)._uiManager._signal;
I.addEventListener("focusin", ig(this, ei, D$).bind(this), {
capture: !0,
signal: g
}), I.addEventListener("focusout", ig(this, ei, K$).bind(this), {
capture: !0,
signal: g
}), I.addEventListener("contextmenu", zA, {
signal: g
});
}, F$ = function() {
const {
editorType: I,
_uiManager: g
} = M(this, je), C = document.createElement("button");
C.className = "delete", C.tabIndex = 0, C.setAttribute("data-l10n-id", M(ul, Km)[I]), ig(this, ei, vu).call(this, C), C.addEventListener("click", (i) => {
g.delete();
}, {
signal: g._signal
}), M(this, oa).append(C);
}, cN = function() {
const I = document.createElement("div");
return I.className = "divider", I;
}, tg(ul, fV), tg(ul, Km, null);
let EX = ul;
var Fm, tc, ic, qa, k$, z$, J$;
class tcg {
constructor(I) {
tg(this, qa);
tg(this, Fm, null);
tg(this, tc, null);
tg(this, ic);
$(this, ic, I);
}
show(I, g, C) {
const [i, e] = ig(this, qa, z$).call(this, g, C), {
style: A
} = M(this, tc) || $(this, tc, ig(this, qa, k$).call(this));
I.append(M(this, tc)), A.insetInlineEnd = `${100 * i}%`, A.top = `calc(${100 * e}% + var(--editor-toolbar-vert-offset))`;
}
hide() {
M(this, tc).remove();
}
}
Fm = new WeakMap(), tc = new WeakMap(), ic = new WeakMap(), qa = new WeakSet(), k$ = function() {
const I = $(this, tc, document.createElement("div"));
I.className = "editToolbar", I.setAttribute("role", "toolbar"), I.addEventListener("contextmenu", zA, {
signal: M(this, ic)._signal
});
const g = $(this, Fm, document.createElement("div"));
return g.className = "buttons", I.append(g), ig(this, qa, J$).call(this), I;
}, z$ = function(I, g) {
let C = 0, i = 0;
for (const e of I) {
const A = e.y + e.height;
if (A < C)
continue;
const s = e.x + (g ? e.width : 0);
if (A > C) {
i = s, C = A;
continue;
}
g ? s > i && (i = s) : s < i && (i = s);
}
return [g ? 1 - i : i, C];
}, J$ = function() {
const I = document.createElement("button");
I.className = "highlightButton", I.tabIndex = 0, I.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button1");
const g = document.createElement("span");
I.append(g), g.className = "visuallyHidden", g.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button-label");
const C = M(this, ic)._signal;
I.addEventListener("contextmenu", zA, {
signal: C
}), I.addEventListener("click", () => {
M(this, ic).highlightSelection("floating_button");
}, {
signal: C
}), M(this, Fm).append(I);
};
function m9(t, I, g) {
for (const C of g)
I.addEventListener(C, t[C].bind(t));
}
var HV;
class icg {
constructor() {
tg(this, HV, 0);
}
get id() {
return `${kog}${Wi(this, HV)._++}`;
}
}
HV = new WeakMap();
var Zh, km, ui, Gh, dN;
const C1 = class C1 {
constructor() {
tg(this, Gh);
tg(this, Zh, H$());
tg(this, km, 0);
tg(this, ui, null);
}
static get _isSVGFittingCanvas() {
const I = 'data:image/svg+xml;charset=UTF-8,', C = new OffscreenCanvas(1, 3).getContext("2d", {
willReadFrequently: !0
}), i = new Image();
i.src = I;
const e = i.decode().then(() => (C.drawImage(i, 0, 0, 1, 1, 0, 0, 1, 3), new Uint32Array(C.getImageData(0, 0, 1, 1).data.buffer)[0] === 0));
return UI(this, "_isSVGFittingCanvas", e);
}
async getFromFile(I) {
const {
lastModified: g,
name: C,
size: i,
type: e
} = I;
return ig(this, Gh, dN).call(this, `${g}_${C}_${i}_${e}`, I);
}
async getFromUrl(I) {
return ig(this, Gh, dN).call(this, I, I);
}
async getFromBlob(I, g) {
const C = await g;
return ig(this, Gh, dN).call(this, I, C);
}
async getFromId(I) {
M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
const g = M(this, ui).get(I);
if (!g)
return null;
if (g.bitmap)
return g.refCounter += 1, g;
if (g.file)
return this.getFromFile(g.file);
if (g.blobPromise) {
const {
blobPromise: C
} = g;
return delete g.blobPromise, this.getFromBlob(g.id, C);
}
return this.getFromUrl(g.url);
}
getFromCanvas(I, g) {
M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
let C = M(this, ui).get(I);
if (C != null && C.bitmap)
return C.refCounter += 1, C;
const i = new OffscreenCanvas(g.width, g.height);
return i.getContext("2d").drawImage(g, 0, 0), C = {
bitmap: i.transferToImageBitmap(),
id: `image_${M(this, Zh)}_${Wi(this, km)._++}`,
refCounter: 1,
isSvg: !1
}, M(this, ui).set(I, C), M(this, ui).set(C.id, C), C;
}
getSvgUrl(I) {
const g = M(this, ui).get(I);
return g != null && g.isSvg ? g.svgUrl : null;
}
deleteId(I) {
var i;
M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
const g = M(this, ui).get(I);
if (!g || (g.refCounter -= 1, g.refCounter !== 0))
return;
const {
bitmap: C
} = g;
if (!g.url && !g.file) {
const e = new OffscreenCanvas(C.width, C.height);
e.getContext("bitmaprenderer").transferFromImageBitmap(C), g.blobPromise = e.convertToBlob();
}
(i = C.close) == null || i.call(C), g.bitmap = null;
}
isValidId(I) {
return I.startsWith(`image_${M(this, Zh)}_`);
}
};
Zh = new WeakMap(), km = new WeakMap(), ui = new WeakMap(), Gh = new WeakSet(), dN = async function(I, g) {
M(this, ui) || $(this, ui, /* @__PURE__ */ new Map());
let C = M(this, ui).get(I);
if (C === null)
return null;
if (C != null && C.bitmap)
return C.refCounter += 1, C;
try {
C || (C = {
bitmap: null,
id: `image_${M(this, Zh)}_${Wi(this, km)._++}`,
refCounter: 0,
isSvg: !1
});
let i;
if (typeof g == "string" ? (C.url = g, i = await AG(g, "blob")) : g instanceof File ? i = C.file = g : g instanceof Blob && (i = g), i.type === "image/svg+xml") {
const e = C1._isSVGFittingCanvas, A = new FileReader(), s = new Image(), l = new Promise((n, a) => {
s.onload = () => {
C.bitmap = s, C.isSvg = !0, n();
}, A.onload = async () => {
const d = C.svgUrl = A.result;
s.src = await e ? `${d}#svgView(preserveAspectRatio(none))` : d;
}, s.onerror = A.onerror = a;
});
A.readAsDataURL(i), await l;
} else
C.bitmap = await createImageBitmap(i);
C.refCounter = 1;
} catch (i) {
DI(i), C = null;
}
return M(this, ui).set(I, C), C && M(this, ui).set(C.id, C), C;
};
let PX = C1;
var it, ca, zm, EC;
class ecg {
constructor(I = 128) {
tg(this, it, []);
tg(this, ca, !1);
tg(this, zm);
tg(this, EC, -1);
$(this, zm, I);
}
add({
cmd: I,
undo: g,
post: C,
mustExec: i,
type: e = NaN,
overwriteIfSameType: A = !1,
keepUndo: s = !1
}) {
if (i && I(), M(this, ca))
return;
const l = {
cmd: I,
undo: g,
post: C,
type: e
};
if (M(this, EC) === -1) {
M(this, it).length > 0 && (M(this, it).length = 0), $(this, EC, 0), M(this, it).push(l);
return;
}
if (A && M(this, it)[M(this, EC)].type === e) {
s && (l.undo = M(this, it)[M(this, EC)].undo), M(this, it)[M(this, EC)] = l;
return;
}
const n = M(this, EC) + 1;
n === M(this, zm) ? M(this, it).splice(0, 1) : ($(this, EC, n), n < M(this, it).length && M(this, it).splice(n)), M(this, it).push(l);
}
undo() {
if (M(this, EC) === -1)
return;
$(this, ca, !0);
const {
undo: I,
post: g
} = M(this, it)[M(this, EC)];
I(), g == null || g(), $(this, ca, !1), $(this, EC, M(this, EC) - 1);
}
redo() {
if (M(this, EC) < M(this, it).length - 1) {
$(this, EC, M(this, EC) + 1), $(this, ca, !0);
const {
cmd: I,
post: g
} = M(this, it)[M(this, EC)];
I(), g == null || g(), $(this, ca, !1);
}
}
hasSomethingToUndo() {
return M(this, EC) !== -1;
}
hasSomethingToRedo() {
return M(this, EC) < M(this, it).length - 1;
}
cleanType(I) {
if (M(this, EC) !== -1) {
for (let g = M(this, EC); g >= 0; g--)
if (M(this, it)[g].type !== I) {
M(this, it).splice(g + 1, M(this, EC) - g), $(this, EC, g);
return;
}
M(this, it).length = 0, $(this, EC, -1);
}
}
destroy() {
$(this, it, null);
}
}
it = new WeakMap(), ca = new WeakMap(), zm = new WeakMap(), EC = new WeakMap();
var XV, L$;
class lG {
constructor(I) {
tg(this, XV);
this.buffer = [], this.callbacks = /* @__PURE__ */ new Map(), this.allKeys = /* @__PURE__ */ new Set();
const {
isMac: g
} = Ai.platform;
for (const [C, i, e = {}] of I)
for (const A of C) {
const s = A.startsWith("mac+");
g && s ? (this.callbacks.set(A.slice(4), {
callback: i,
options: e
}), this.allKeys.add(A.split("+").at(-1))) : !g && !s && (this.callbacks.set(A, {
callback: i,
options: e
}), this.allKeys.add(A.split("+").at(-1)));
}
}
exec(I, g) {
if (!this.allKeys.has(g.key))
return;
const C = this.callbacks.get(ig(this, XV, L$).call(this, g));
if (!C)
return;
const {
callback: i,
options: {
bubbles: e = !1,
args: A = [],
checker: s = null
}
} = C;
s && !s(I, g) || (i.bind(I, ...A, g)(), e || ht(g));
}
}
XV = new WeakSet(), L$ = function(I) {
I.altKey && this.buffer.push("alt"), I.ctrlKey && this.buffer.push("ctrl"), I.metaKey && this.buffer.push("meta"), I.shiftKey && this.buffer.push("shift"), this.buffer.push(I.key);
const g = this.buffer.join("+");
return this.buffer.length = 0, g;
};
const SV = class SV {
get _colors() {
const I = /* @__PURE__ */ new Map([["CanvasText", null], ["Canvas", null]]);
return Ccg(I), UI(this, "_colors", I);
}
convert(I) {
const g = u9(I);
if (!window.matchMedia("(forced-colors: active)").matches)
return g;
for (const [C, i] of this._colors)
if (i.every((e, A) => e === g[A]))
return SV._colorsMapping.get(C);
return g;
}
getHexCode(I) {
const g = this._colors.get(I);
return g ? AI.makeHexColor(...g) : I;
}
};
iI(SV, "_colorsMapping", /* @__PURE__ */ new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]));
let _X = SV;
var wh, ce, Bt, Et, ph, Zl, Bh, Qe, da, ec, Wh, Ac, bs, pA, sc, Jm, Lm, yh, vm, us, ra, Yh, ha, ms, DV, ba, Tm, ua, lc, nc, ma, xm, St, hC, Gl, Za, ac, jm, Qm, Ga, Zs, wl, Om, Oe, Og, rN, qX, v$, T$, hN, x$, j$, Q$, $X, O$, gS, IS, U$, Yi, rl, E$, P$, CS, _$, Tu, tS;
const lh = class lh {
constructor(I, g, C, i, e, A, s, l, n, a, d, o, c, r) {
tg(this, Og);
tg(this, wh, new AbortController());
tg(this, ce, null);
tg(this, Bt, /* @__PURE__ */ new Map());
tg(this, Et, /* @__PURE__ */ new Map());
tg(this, ph, null);
tg(this, Zl, null);
tg(this, Bh, null);
tg(this, Qe, new ecg());
tg(this, da, null);
tg(this, ec, null);
tg(this, Wh, 0);
tg(this, Ac, /* @__PURE__ */ new Set());
tg(this, bs, null);
tg(this, pA, null);
tg(this, sc, /* @__PURE__ */ new Set());
iI(this, "_editorUndoBar", null);
tg(this, Jm, !1);
tg(this, Lm, !1);
tg(this, yh, !1);
tg(this, vm, null);
tg(this, us, null);
tg(this, ra, null);
tg(this, Yh, null);
tg(this, ha, !1);
tg(this, ms, null);
tg(this, DV, new icg());
tg(this, ba, !1);
tg(this, Tm, !1);
tg(this, ua, null);
tg(this, lc, null);
tg(this, nc, null);
tg(this, ma, null);
tg(this, xm, null);
tg(this, St, XI.NONE);
tg(this, hC, /* @__PURE__ */ new Set());
tg(this, Gl, null);
tg(this, Za, null);
tg(this, ac, null);
tg(this, jm, null);
tg(this, Qm, {
isEditing: !1,
isEmpty: !0,
hasSomethingToUndo: !1,
hasSomethingToRedo: !1,
hasSelectedEditor: !1,
hasSelectedText: !1
});
tg(this, Ga, [0, 0]);
tg(this, Zs, null);
tg(this, wl, null);
tg(this, Om, null);
tg(this, Oe, null);
const h = this._signal = M(this, wh).signal;
$(this, wl, I), $(this, Om, g), $(this, ph, C), $(this, Za, i), this._eventBus = e, e._on("editingaction", this.onEditingAction.bind(this), {
signal: h
}), e._on("pagechanging", this.onPageChanging.bind(this), {
signal: h
}), e._on("scalechanging", this.onScaleChanging.bind(this), {
signal: h
}), e._on("rotationchanging", this.onRotationChanging.bind(this), {
signal: h
}), e._on("setpreference", this.onSetPreference.bind(this), {
signal: h
}), e._on("switchannotationeditorparams", (b) => this.updateParams(b.type, b.value), {
signal: h
}), ig(this, Og, x$).call(this), ig(this, Og, U$).call(this), ig(this, Og, $X).call(this), $(this, Zl, A.annotationStorage), $(this, vm, A.filterFactory), $(this, ac, s), $(this, Yh, l || null), $(this, Jm, n), $(this, Lm, a), $(this, yh, d), $(this, xm, o || null), this.viewParameters = {
realScale: Pa.PDF_TO_CSS_UNITS,
rotation: 0
}, this.isShiftKeyDown = !1, this._editorUndoBar = c || null, this._supportsPinchToZoom = r !== !1;
}
static get _keyboardManager() {
const I = lh.prototype, g = (A) => M(A, wl).contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && A.hasSomethingToControl(), C = (A, {
target: s
}) => {
if (s instanceof HTMLInputElement) {
const {
type: l
} = s;
return l !== "text" && l !== "number";
}
return !0;
}, i = this.TRANSLATE_SMALL, e = this.TRANSLATE_BIG;
return UI(this, "_keyboardManager", new lG([[["ctrl+a", "mac+meta+a"], I.selectAll, {
checker: C
}], [["ctrl+z", "mac+meta+z"], I.undo, {
checker: C
}], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], I.redo, {
checker: C
}], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], I.delete, {
checker: C
}], [["Enter", "mac+Enter"], I.addNewEditorFromKeyboard, {
checker: (A, {
target: s
}) => !(s instanceof HTMLButtonElement) && M(A, wl).contains(s) && !A.isEnterHandled
}], [[" ", "mac+ "], I.addNewEditorFromKeyboard, {
checker: (A, {
target: s
}) => !(s instanceof HTMLButtonElement) && M(A, wl).contains(document.activeElement)
}], [["Escape", "mac+Escape"], I.unselectAll], [["ArrowLeft", "mac+ArrowLeft"], I.translateSelectedEditors, {
args: [-i, 0],
checker: g
}], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], I.translateSelectedEditors, {
args: [-e, 0],
checker: g
}], [["ArrowRight", "mac+ArrowRight"], I.translateSelectedEditors, {
args: [i, 0],
checker: g
}], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], I.translateSelectedEditors, {
args: [e, 0],
checker: g
}], [["ArrowUp", "mac+ArrowUp"], I.translateSelectedEditors, {
args: [0, -i],
checker: g
}], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], I.translateSelectedEditors, {
args: [0, -e],
checker: g
}], [["ArrowDown", "mac+ArrowDown"], I.translateSelectedEditors, {
args: [0, i],
checker: g
}], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], I.translateSelectedEditors, {
args: [0, e],
checker: g
}]]));
}
destroy() {
var I, g, C, i, e, A, s, l;
(I = M(this, Oe)) == null || I.resolve(), $(this, Oe, null), (g = M(this, wh)) == null || g.abort(), $(this, wh, null), this._signal = null;
for (const n of M(this, Et).values())
n.destroy();
M(this, Et).clear(), M(this, Bt).clear(), M(this, sc).clear(), (C = M(this, ma)) == null || C.clear(), $(this, ce, null), M(this, hC).clear(), M(this, Qe).destroy(), (i = M(this, ph)) == null || i.destroy(), (e = M(this, Za)) == null || e.destroy(), (A = M(this, ms)) == null || A.hide(), $(this, ms, null), (s = M(this, nc)) == null || s.destroy(), $(this, nc, null), M(this, us) && (clearTimeout(M(this, us)), $(this, us, null)), M(this, Zs) && (clearTimeout(M(this, Zs)), $(this, Zs, null)), (l = this._editorUndoBar) == null || l.destroy();
}
combinedSignal(I) {
return AbortSignal.any([this._signal, I.signal]);
}
get mlManager() {
return M(this, xm);
}
get useNewAltTextFlow() {
return M(this, Lm);
}
get useNewAltTextWhenAddingImage() {
return M(this, yh);
}
get hcmFilter() {
return UI(this, "hcmFilter", M(this, ac) ? M(this, vm).addHCMFilter(M(this, ac).foreground, M(this, ac).background) : "none");
}
get direction() {
return UI(this, "direction", getComputedStyle(M(this, wl)).direction);
}
get highlightColors() {
return UI(this, "highlightColors", M(this, Yh) ? new Map(M(this, Yh).split(",").map((I) => I.split("=").map((g) => g.trim()))) : null);
}
get highlightColorNames() {
return UI(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, (I) => I.reverse())) : null);
}
setCurrentDrawingSession(I) {
I ? (this.unselectAll(), this.disableUserSelect(!0)) : this.disableUserSelect(!1), $(this, ec, I);
}
setMainHighlightColorPicker(I) {
$(this, nc, I);
}
editAltText(I, g = !1) {
var C;
(C = M(this, ph)) == null || C.editAltText(this, I, g);
}
getSignature(I) {
var g;
(g = M(this, Za)) == null || g.getSignature({
uiManager: this,
editor: I
});
}
get signatureManager() {
return M(this, Za);
}
switchToMode(I, g) {
this._eventBus.on("annotationeditormodechanged", g, {
once: !0,
signal: this._signal
}), this._eventBus.dispatch("showannotationeditorui", {
source: this,
mode: I
});
}
setPreference(I, g) {
this._eventBus.dispatch("setpreference", {
source: this,
name: I,
value: g
});
}
onSetPreference({
name: I,
value: g
}) {
switch (I) {
case "enableNewAltTextWhenAddingImage":
$(this, yh, g);
break;
}
}
onPageChanging({
pageNumber: I
}) {
$(this, Wh, I - 1);
}
focusMainContainer() {
M(this, wl).focus();
}
findParent(I, g) {
for (const C of M(this, Et).values()) {
const {
x: i,
y: e,
width: A,
height: s
} = C.div.getBoundingClientRect();
if (I >= i && I <= i + A && g >= e && g <= e + s)
return C;
}
return null;
}
disableUserSelect(I = !1) {
M(this, Om).classList.toggle("noUserSelect", I);
}
addShouldRescale(I) {
M(this, sc).add(I);
}
removeShouldRescale(I) {
M(this, sc).delete(I);
}
onScaleChanging({
scale: I
}) {
var g;
this.commitOrRemove(), this.viewParameters.realScale = I * Pa.PDF_TO_CSS_UNITS;
for (const C of M(this, sc))
C.onScaleChanging();
(g = M(this, ec)) == null || g.onScaleChanging();
}
onRotationChanging({
pagesRotation: I
}) {
this.commitOrRemove(), this.viewParameters.rotation = I;
}
highlightSelection(I = "") {
const g = document.getSelection();
if (!g || g.isCollapsed)
return;
const {
anchorNode: C,
anchorOffset: i,
focusNode: e,
focusOffset: A
} = g, s = g.toString(), n = ig(this, Og, rN).call(this, g).closest(".textLayer"), a = this.getSelectionBoxes(n);
if (!a)
return;
g.empty();
const d = ig(this, Og, qX).call(this, n), o = M(this, St) === XI.NONE, c = () => {
d == null || d.createAndAddNewEditor({
x: 0,
y: 0
}, !1, {
methodOfCreation: I,
boxes: a,
anchorNode: C,
anchorOffset: i,
focusNode: e,
focusOffset: A,
text: s
}), o && this.showAllEditors("highlight", !0, !0);
};
if (o) {
this.switchToMode(XI.HIGHLIGHT, c);
return;
}
c();
}
addToAnnotationStorage(I) {
!I.isEmpty() && M(this, Zl) && !M(this, Zl).has(I.id) && M(this, Zl).setValue(I.id, I);
}
blur() {
if (this.isShiftKeyDown = !1, M(this, ha) && ($(this, ha, !1), ig(this, Og, hN).call(this, "main_toolbar")), !this.hasSelection)
return;
const {
activeElement: I
} = document;
for (const g of M(this, hC))
if (g.div.contains(I)) {
$(this, lc, [g, I]), g._focusEventsAllowed = !1;
break;
}
}
focus() {
if (!M(this, lc))
return;
const [I, g] = M(this, lc);
$(this, lc, null), g.addEventListener("focusin", () => {
I._focusEventsAllowed = !0;
}, {
once: !0,
signal: this._signal
}), g.focus();
}
addEditListeners() {
ig(this, Og, $X).call(this), ig(this, Og, gS).call(this);
}
removeEditListeners() {
ig(this, Og, O$).call(this), ig(this, Og, IS).call(this);
}
dragOver(I) {
for (const {
type: g
} of I.dataTransfer.items)
for (const C of M(this, pA))
if (C.isHandlingMimeForPasting(g)) {
I.dataTransfer.dropEffect = "copy", I.preventDefault();
return;
}
}
drop(I) {
for (const g of I.dataTransfer.items)
for (const C of M(this, pA))
if (C.isHandlingMimeForPasting(g.type)) {
C.paste(g, this.currentLayer), I.preventDefault();
return;
}
}
copy(I) {
var C;
if (I.preventDefault(), (C = M(this, ce)) == null || C.commitOrRemove(), !this.hasSelection)
return;
const g = [];
for (const i of M(this, hC)) {
const e = i.serialize(!0);
e && g.push(e);
}
g.length !== 0 && I.clipboardData.setData("application/pdfjs", JSON.stringify(g));
}
cut(I) {
this.copy(I), this.delete();
}
async paste(I) {
I.preventDefault();
const {
clipboardData: g
} = I;
for (const e of g.items)
for (const A of M(this, pA))
if (A.isHandlingMimeForPasting(e.type)) {
A.paste(e, this.currentLayer);
return;
}
let C = g.getData("application/pdfjs");
if (!C)
return;
try {
C = JSON.parse(C);
} catch (e) {
DI(`paste: "${e.message}".`);
return;
}
if (!Array.isArray(C))
return;
this.unselectAll();
const i = this.currentLayer;
try {
const e = [];
for (const l of C) {
const n = await i.deserialize(l);
if (!n)
return;
e.push(n);
}
const A = () => {
for (const l of e)
ig(this, Og, CS).call(this, l);
ig(this, Og, tS).call(this, e);
}, s = () => {
for (const l of e)
l.remove();
};
this.addCommands({
cmd: A,
undo: s,
mustExec: !0
});
} catch (e) {
DI(`paste: "${e.message}".`);
}
}
keydown(I) {
!this.isShiftKeyDown && I.key === "Shift" && (this.isShiftKeyDown = !0), M(this, St) !== XI.NONE && !this.isEditorHandlingKeyboard && lh._keyboardManager.exec(this, I);
}
keyup(I) {
this.isShiftKeyDown && I.key === "Shift" && (this.isShiftKeyDown = !1, M(this, ha) && ($(this, ha, !1), ig(this, Og, hN).call(this, "main_toolbar")));
}
onEditingAction({
name: I
}) {
switch (I) {
case "undo":
case "redo":
case "delete":
case "selectAll":
this[I]();
break;
case "highlightSelection":
this.highlightSelection("context_menu");
break;
}
}
setEditingState(I) {
I ? (ig(this, Og, j$).call(this), ig(this, Og, gS).call(this), ig(this, Og, Yi).call(this, {
isEditing: M(this, St) !== XI.NONE,
isEmpty: ig(this, Og, Tu).call(this),
hasSomethingToUndo: M(this, Qe).hasSomethingToUndo(),
hasSomethingToRedo: M(this, Qe).hasSomethingToRedo(),
hasSelectedEditor: !1
})) : (ig(this, Og, Q$).call(this), ig(this, Og, IS).call(this), ig(this, Og, Yi).call(this, {
isEditing: !1
}), this.disableUserSelect(!1));
}
registerEditorTypes(I) {
if (!M(this, pA)) {
$(this, pA, I);
for (const g of M(this, pA))
ig(this, Og, rl).call(this, g.defaultPropertiesToUpdate);
}
}
getId() {
return M(this, DV).id;
}
get currentLayer() {
return M(this, Et).get(M(this, Wh));
}
getLayer(I) {
return M(this, Et).get(I);
}
get currentPageIndex() {
return M(this, Wh);
}
addLayer(I) {
M(this, Et).set(I.pageIndex, I), M(this, ba) ? I.enable() : I.disable();
}
removeLayer(I) {
M(this, Et).delete(I.pageIndex);
}
async updateMode(I, g = null, C = !1) {
var i, e;
if (M(this, St) !== I && !(M(this, Oe) && (await M(this, Oe).promise, !M(this, Oe)))) {
if ($(this, Oe, Promise.withResolvers()), $(this, St, I), I === XI.NONE) {
this.setEditingState(!1), ig(this, Og, P$).call(this), (i = this._editorUndoBar) == null || i.hide(), M(this, Oe).resolve();
return;
}
I === XI.SIGNATURE && await ((e = M(this, Za)) == null ? void 0 : e.loadSignatures()), this.setEditingState(!0), await ig(this, Og, E$).call(this), this.unselectAll();
for (const A of M(this, Et).values())
A.updateMode(I);
if (!g) {
C && this.addNewEditorFromKeyboard(), M(this, Oe).resolve();
return;
}
for (const A of M(this, Bt).values())
A.annotationElementId === g ? (this.setSelected(A), A.enterInEditMode()) : A.unselect();
M(this, Oe).resolve();
}
}
addNewEditorFromKeyboard() {
this.currentLayer.canCreateNewEmptyEditor() && this.currentLayer.addNewEditor();
}
updateToolbar(I) {
I !== M(this, St) && this._eventBus.dispatch("switchannotationeditormode", {
source: this,
mode: I
});
}
updateParams(I, g) {
var C;
if (M(this, pA)) {
switch (I) {
case iC.CREATE:
this.currentLayer.addNewEditor(g);
return;
case iC.HIGHLIGHT_DEFAULT_COLOR:
(C = M(this, nc)) == null || C.updateColor(g);
break;
case iC.HIGHLIGHT_SHOW_ALL:
this._eventBus.dispatch("reporttelemetry", {
source: this,
details: {
type: "editing",
data: {
type: "highlight",
action: "toggle_visibility"
}
}
}), (M(this, jm) || $(this, jm, /* @__PURE__ */ new Map())).set(I, g), this.showAllEditors("highlight", g);
break;
}
for (const i of M(this, hC))
i.updateParams(I, g);
for (const i of M(this, pA))
i.updateDefaultParams(I, g);
}
}
showAllEditors(I, g, C = !1) {
var e;
for (const A of M(this, Bt).values())
A.editorType === I && A.show(g);
(((e = M(this, jm)) == null ? void 0 : e.get(iC.HIGHLIGHT_SHOW_ALL)) ?? !0) !== g && ig(this, Og, rl).call(this, [[iC.HIGHLIGHT_SHOW_ALL, g]]);
}
enableWaiting(I = !1) {
if (M(this, Tm) !== I) {
$(this, Tm, I);
for (const g of M(this, Et).values())
I ? g.disableClick() : g.enableClick(), g.div.classList.toggle("waiting", I);
}
}
getEditors(I) {
const g = [];
for (const C of M(this, Bt).values())
C.pageIndex === I && g.push(C);
return g;
}
getEditor(I) {
return M(this, Bt).get(I);
}
addEditor(I) {
M(this, Bt).set(I.id, I);
}
removeEditor(I) {
var g, C;
I.div.contains(document.activeElement) && (M(this, us) && clearTimeout(M(this, us)), $(this, us, setTimeout(() => {
this.focusMainContainer(), $(this, us, null);
}, 0))), M(this, Bt).delete(I.id), I.annotationElementId && ((g = M(this, ma)) == null || g.delete(I.annotationElementId)), this.unselect(I), (!I.annotationElementId || !M(this, Ac).has(I.annotationElementId)) && ((C = M(this, Zl)) == null || C.remove(I.id));
}
addDeletedAnnotationElement(I) {
M(this, Ac).add(I.annotationElementId), this.addChangedExistingAnnotation(I), I.deleted = !0;
}
isDeletedAnnotationElement(I) {
return M(this, Ac).has(I);
}
removeDeletedAnnotationElement(I) {
M(this, Ac).delete(I.annotationElementId), this.removeChangedExistingAnnotation(I), I.deleted = !1;
}
setActiveEditor(I) {
M(this, ce) !== I && ($(this, ce, I), I && ig(this, Og, rl).call(this, I.propertiesToUpdate));
}
updateUI(I) {
M(this, Og, _$) === I && ig(this, Og, rl).call(this, I.propertiesToUpdate);
}
updateUIForDefaultProperties(I) {
ig(this, Og, rl).call(this, I.defaultPropertiesToUpdate);
}
toggleSelected(I) {
if (M(this, hC).has(I)) {
M(this, hC).delete(I), I.unselect(), ig(this, Og, Yi).call(this, {
hasSelectedEditor: this.hasSelection
});
return;
}
M(this, hC).add(I), I.select(), ig(this, Og, rl).call(this, I.propertiesToUpdate), ig(this, Og, Yi).call(this, {
hasSelectedEditor: !0
});
}
setSelected(I) {
var g;
(g = M(this, ec)) == null || g.commitOrRemove();
for (const C of M(this, hC))
C !== I && C.unselect();
M(this, hC).clear(), M(this, hC).add(I), I.select(), ig(this, Og, rl).call(this, I.propertiesToUpdate), ig(this, Og, Yi).call(this, {
hasSelectedEditor: !0
});
}
isSelected(I) {
return M(this, hC).has(I);
}
get firstSelectedEditor() {
return M(this, hC).values().next().value;
}
unselect(I) {
I.unselect(), M(this, hC).delete(I), ig(this, Og, Yi).call(this, {
hasSelectedEditor: this.hasSelection
});
}
get hasSelection() {
return M(this, hC).size !== 0;
}
get isEnterHandled() {
return M(this, hC).size === 1 && this.firstSelectedEditor.isEnterHandled;
}
undo() {
var I;
M(this, Qe).undo(), ig(this, Og, Yi).call(this, {
hasSomethingToUndo: M(this, Qe).hasSomethingToUndo(),
hasSomethingToRedo: !0,
isEmpty: ig(this, Og, Tu).call(this)
}), (I = this._editorUndoBar) == null || I.hide();
}
redo() {
M(this, Qe).redo(), ig(this, Og, Yi).call(this, {
hasSomethingToUndo: !0,
hasSomethingToRedo: M(this, Qe).hasSomethingToRedo(),
isEmpty: ig(this, Og, Tu).call(this)
});
}
addCommands(I) {
M(this, Qe).add(I), ig(this, Og, Yi).call(this, {
hasSomethingToUndo: !0,
hasSomethingToRedo: !1,
isEmpty: ig(this, Og, Tu).call(this)
});
}
cleanUndoStack(I) {
M(this, Qe).cleanType(I);
}
delete() {
var e;
this.commitOrRemove();
const I = (e = this.currentLayer) == null ? void 0 : e.endDrawingSession(!0);
if (!this.hasSelection && !I)
return;
const g = I ? [I] : [...M(this, hC)], C = () => {
var A;
(A = this._editorUndoBar) == null || A.show(i, g.length === 1 ? g[0].editorType : g.length);
for (const s of g)
s.remove();
}, i = () => {
for (const A of g)
ig(this, Og, CS).call(this, A);
};
this.addCommands({
cmd: C,
undo: i,
mustExec: !0
});
}
commitOrRemove() {
var I;
(I = M(this, ce)) == null || I.commitOrRemove();
}
hasSomethingToControl() {
return M(this, ce) || this.hasSelection;
}
selectAll() {
for (const I of M(this, hC))
I.commit();
ig(this, Og, tS).call(this, M(this, Bt).values());
}
unselectAll() {
var I;
if (!(M(this, ce) && (M(this, ce).commitOrRemove(), M(this, St) !== XI.NONE)) && !((I = M(this, ec)) != null && I.commitOrRemove()) && this.hasSelection) {
for (const g of M(this, hC))
g.unselect();
M(this, hC).clear(), ig(this, Og, Yi).call(this, {
hasSelectedEditor: !1
});
}
}
translateSelectedEditors(I, g, C = !1) {
if (C || this.commitOrRemove(), !this.hasSelection)
return;
M(this, Ga)[0] += I, M(this, Ga)[1] += g;
const [i, e] = M(this, Ga), A = [...M(this, hC)], s = 1e3;
M(this, Zs) && clearTimeout(M(this, Zs)), $(this, Zs, setTimeout(() => {
$(this, Zs, null), M(this, Ga)[0] = M(this, Ga)[1] = 0, this.addCommands({
cmd: () => {
for (const l of A)
M(this, Bt).has(l.id) && (l.translateInPage(i, e), l.translationDone());
},
undo: () => {
for (const l of A)
M(this, Bt).has(l.id) && (l.translateInPage(-i, -e), l.translationDone());
},
mustExec: !1
});
}, s));
for (const l of A)
l.translateInPage(I, g), l.translationDone();
}
setUpDragSession() {
if (this.hasSelection) {
this.disableUserSelect(!0), $(this, bs, /* @__PURE__ */ new Map());
for (const I of M(this, hC))
M(this, bs).set(I, {
savedX: I.x,
savedY: I.y,
savedPageIndex: I.pageIndex,
newX: 0,
newY: 0,
newPageIndex: -1
});
}
}
endDragSession() {
if (!M(this, bs))
return !1;
this.disableUserSelect(!1);
const I = M(this, bs);
$(this, bs, null);
let g = !1;
for (const [{
x: i,
y: e,
pageIndex: A
}, s] of I)
s.newX = i, s.newY = e, s.newPageIndex = A, g || (g = i !== s.savedX || e !== s.savedY || A !== s.savedPageIndex);
if (!g)
return !1;
const C = (i, e, A, s) => {
if (M(this, Bt).has(i.id)) {
const l = M(this, Et).get(s);
l ? i._setParentAndPosition(l, e, A) : (i.pageIndex = s, i.x = e, i.y = A);
}
};
return this.addCommands({
cmd: () => {
for (const [i, {
newX: e,
newY: A,
newPageIndex: s
}] of I)
C(i, e, A, s);
},
undo: () => {
for (const [i, {
savedX: e,
savedY: A,
savedPageIndex: s
}] of I)
C(i, e, A, s);
},
mustExec: !0
}), !0;
}
dragSelectedEditors(I, g) {
if (M(this, bs))
for (const C of M(this, bs).keys())
C.drag(I, g);
}
rebuild(I) {
if (I.parent === null) {
const g = this.getLayer(I.pageIndex);
g ? (g.changeParent(I), g.addOrRebuild(I)) : (this.addEditor(I), this.addToAnnotationStorage(I), I.rebuild());
} else
I.parent.addOrRebuild(I);
}
get isEditorHandlingKeyboard() {
var I;
return ((I = this.getActive()) == null ? void 0 : I.shouldGetKeyboardEvents()) || M(this, hC).size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents();
}
isActive(I) {
return M(this, ce) === I;
}
getActive() {
return M(this, ce);
}
getMode() {
return M(this, St);
}
get imageManager() {
return UI(this, "imageManager", new PX());
}
getSelectionBoxes(I) {
if (!I)
return null;
const g = document.getSelection();
for (let n = 0, a = g.rangeCount; n < a; n++)
if (!I.contains(g.getRangeAt(n).commonAncestorContainer))
return null;
const {
x: C,
y: i,
width: e,
height: A
} = I.getBoundingClientRect();
let s;
switch (I.getAttribute("data-main-rotation")) {
case "90":
s = (n, a, d, o) => ({
x: (a - i) / A,
y: 1 - (n + d - C) / e,
width: o / A,
height: d / e
});
break;
case "180":
s = (n, a, d, o) => ({
x: 1 - (n + d - C) / e,
y: 1 - (a + o - i) / A,
width: d / e,
height: o / A
});
break;
case "270":
s = (n, a, d, o) => ({
x: 1 - (a + o - i) / A,
y: (n - C) / e,
width: o / A,
height: d / e
});
break;
default:
s = (n, a, d, o) => ({
x: (n - C) / e,
y: (a - i) / A,
width: d / e,
height: o / A
});
break;
}
const l = [];
for (let n = 0, a = g.rangeCount; n < a; n++) {
const d = g.getRangeAt(n);
if (!d.collapsed)
for (const {
x: o,
y: c,
width: r,
height: h
} of d.getClientRects())
r === 0 || h === 0 || l.push(s(o, c, r, h));
}
return l.length === 0 ? null : l;
}
addChangedExistingAnnotation({
annotationElementId: I,
id: g
}) {
(M(this, Bh) || $(this, Bh, /* @__PURE__ */ new Map())).set(I, g);
}
removeChangedExistingAnnotation({
annotationElementId: I
}) {
var g;
(g = M(this, Bh)) == null || g.delete(I);
}
renderAnnotationElement(I) {
var i;
const g = (i = M(this, Bh)) == null ? void 0 : i.get(I.data.id);
if (!g)
return;
const C = M(this, Zl).getRawValue(g);
C && (M(this, St) === XI.NONE && !C.hasBeenModified || C.renderAnnotationElement(I));
}
setMissingCanvas(I, g, C) {
var e;
const i = (e = M(this, ma)) == null ? void 0 : e.get(I);
i && (i.setCanvas(g, C), M(this, ma).delete(I));
}
addMissingCanvas(I, g) {
(M(this, ma) || $(this, ma, /* @__PURE__ */ new Map())).set(I, g);
}
};
wh = new WeakMap(), ce = new WeakMap(), Bt = new WeakMap(), Et = new WeakMap(), ph = new WeakMap(), Zl = new WeakMap(), Bh = new WeakMap(), Qe = new WeakMap(), da = new WeakMap(), ec = new WeakMap(), Wh = new WeakMap(), Ac = new WeakMap(), bs = new WeakMap(), pA = new WeakMap(), sc = new WeakMap(), Jm = new WeakMap(), Lm = new WeakMap(), yh = new WeakMap(), vm = new WeakMap(), us = new WeakMap(), ra = new WeakMap(), Yh = new WeakMap(), ha = new WeakMap(), ms = new WeakMap(), DV = new WeakMap(), ba = new WeakMap(), Tm = new WeakMap(), ua = new WeakMap(), lc = new WeakMap(), nc = new WeakMap(), ma = new WeakMap(), xm = new WeakMap(), St = new WeakMap(), hC = new WeakMap(), Gl = new WeakMap(), Za = new WeakMap(), ac = new WeakMap(), jm = new WeakMap(), Qm = new WeakMap(), Ga = new WeakMap(), Zs = new WeakMap(), wl = new WeakMap(), Om = new WeakMap(), Oe = new WeakMap(), Og = new WeakSet(), rN = function({
anchorNode: I
}) {
return I.nodeType === Node.TEXT_NODE ? I.parentElement : I;
}, qX = function(I) {
const {
currentLayer: g
} = this;
if (g.hasTextLayer(I))
return g;
for (const C of M(this, Et).values())
if (C.hasTextLayer(I))
return C;
return null;
}, v$ = function() {
const I = document.getSelection();
if (!I || I.isCollapsed)
return;
const C = ig(this, Og, rN).call(this, I).closest(".textLayer"), i = this.getSelectionBoxes(C);
i && (M(this, ms) || $(this, ms, new tcg(this)), M(this, ms).show(C, i, this.direction === "ltr"));
}, T$ = function() {
var e, A, s;
const I = document.getSelection();
if (!I || I.isCollapsed) {
M(this, Gl) && ((e = M(this, ms)) == null || e.hide(), $(this, Gl, null), ig(this, Og, Yi).call(this, {
hasSelectedText: !1
}));
return;
}
const {
anchorNode: g
} = I;
if (g === M(this, Gl))
return;
const i = ig(this, Og, rN).call(this, I).closest(".textLayer");
if (!i) {
M(this, Gl) && ((A = M(this, ms)) == null || A.hide(), $(this, Gl, null), ig(this, Og, Yi).call(this, {
hasSelectedText: !1
}));
return;
}
if ((s = M(this, ms)) == null || s.hide(), $(this, Gl, g), ig(this, Og, Yi).call(this, {
hasSelectedText: !0
}), !(M(this, St) !== XI.HIGHLIGHT && M(this, St) !== XI.NONE) && (M(this, St) === XI.HIGHLIGHT && this.showAllEditors("highlight", !0, !0), $(this, ha, this.isShiftKeyDown), !this.isShiftKeyDown)) {
const l = M(this, St) === XI.HIGHLIGHT ? ig(this, Og, qX).call(this, i) : null;
l == null || l.toggleDrawing();
const n = new AbortController(), a = this.combinedSignal(n), d = (o) => {
o.type === "pointerup" && o.button !== 0 || (n.abort(), l == null || l.toggleDrawing(!0), o.type === "pointerup" && ig(this, Og, hN).call(this, "main_toolbar"));
};
window.addEventListener("pointerup", d, {
signal: a
}), window.addEventListener("blur", d, {
signal: a
});
}
}, hN = function(I = "") {
M(this, St) === XI.HIGHLIGHT ? this.highlightSelection(I) : M(this, Jm) && ig(this, Og, v$).call(this);
}, x$ = function() {
document.addEventListener("selectionchange", ig(this, Og, T$).bind(this), {
signal: this._signal
});
}, j$ = function() {
if (M(this, ra))
return;
$(this, ra, new AbortController());
const I = this.combinedSignal(M(this, ra));
window.addEventListener("focus", this.focus.bind(this), {
signal: I
}), window.addEventListener("blur", this.blur.bind(this), {
signal: I
});
}, Q$ = function() {
var I;
(I = M(this, ra)) == null || I.abort(), $(this, ra, null);
}, $X = function() {
if (M(this, ua))
return;
$(this, ua, new AbortController());
const I = this.combinedSignal(M(this, ua));
window.addEventListener("keydown", this.keydown.bind(this), {
signal: I
}), window.addEventListener("keyup", this.keyup.bind(this), {
signal: I
});
}, O$ = function() {
var I;
(I = M(this, ua)) == null || I.abort(), $(this, ua, null);
}, gS = function() {
if (M(this, da))
return;
$(this, da, new AbortController());
const I = this.combinedSignal(M(this, da));
document.addEventListener("copy", this.copy.bind(this), {
signal: I
}), document.addEventListener("cut", this.cut.bind(this), {
signal: I
}), document.addEventListener("paste", this.paste.bind(this), {
signal: I
});
}, IS = function() {
var I;
(I = M(this, da)) == null || I.abort(), $(this, da, null);
}, U$ = function() {
const I = this._signal;
document.addEventListener("dragover", this.dragOver.bind(this), {
signal: I
}), document.addEventListener("drop", this.drop.bind(this), {
signal: I
});
}, Yi = function(I) {
Object.entries(I).some(([C, i]) => M(this, Qm)[C] !== i) && (this._eventBus.dispatch("annotationeditorstateschanged", {
source: this,
details: Object.assign(M(this, Qm), I)
}), M(this, St) === XI.HIGHLIGHT && I.hasSelectedEditor === !1 && ig(this, Og, rl).call(this, [[iC.HIGHLIGHT_FREE, !0]]));
}, rl = function(I) {
this._eventBus.dispatch("annotationeditorparamschanged", {
source: this,
details: I
});
}, E$ = async function() {
if (!M(this, ba)) {
$(this, ba, !0);
const I = [];
for (const g of M(this, Et).values())
I.push(g.enable());
await Promise.all(I);
for (const g of M(this, Bt).values())
g.enable();
}
}, P$ = function() {
if (this.unselectAll(), M(this, ba)) {
$(this, ba, !1);
for (const I of M(this, Et).values())
I.disable();
for (const I of M(this, Bt).values())
I.disable();
}
}, CS = function(I) {
const g = M(this, Et).get(I.pageIndex);
g ? g.addOrRebuild(I) : (this.addEditor(I), this.addToAnnotationStorage(I));
}, _$ = function() {
let I = null;
for (I of M(this, hC))
;
return I;
}, Tu = function() {
if (M(this, Bt).size === 0)
return !0;
if (M(this, Bt).size === 1)
for (const I of M(this, Bt).values())
return I.isEmpty();
return !1;
}, tS = function(I) {
for (const g of M(this, hC))
g.unselect();
M(this, hC).clear();
for (const g of I)
g.isEmpty() || (M(this, hC).add(g), g.select());
ig(this, Og, Yi).call(this, {
hasSelectedEditor: this.hasSelection
});
}, iI(lh, "TRANSLATE_SMALL", 1), iI(lh, "TRANSLATE_BIG", 10);
let dd = lh;
var Dt, Gs, BA, Nh, ws, de, Vh, ps, Qi, pl, oc, Bs, wa, kA, xu, bN;
const Ni = class Ni {
constructor(I) {
tg(this, kA);
tg(this, Dt, null);
tg(this, Gs, !1);
tg(this, BA, null);
tg(this, Nh, null);
tg(this, ws, null);
tg(this, de, null);
tg(this, Vh, !1);
tg(this, ps, null);
tg(this, Qi, null);
tg(this, pl, null);
tg(this, oc, null);
tg(this, Bs, !1);
$(this, Qi, I), $(this, Bs, I._uiManager.useNewAltTextFlow), M(Ni, wa) || $(Ni, wa, Object.freeze({
added: "pdfjs-editor-new-alt-text-added-button",
"added-label": "pdfjs-editor-new-alt-text-added-button-label",
missing: "pdfjs-editor-new-alt-text-missing-button",
"missing-label": "pdfjs-editor-new-alt-text-missing-button-label",
review: "pdfjs-editor-new-alt-text-to-review-button",
"review-label": "pdfjs-editor-new-alt-text-to-review-button-label"
}));
}
static initialize(I) {
Ni._l10n ?? (Ni._l10n = I);
}
async render() {
const I = $(this, BA, document.createElement("button"));
I.className = "altText", I.tabIndex = "0";
const g = $(this, Nh, document.createElement("span"));
I.append(g), M(this, Bs) ? (I.classList.add("new"), I.setAttribute("data-l10n-id", M(Ni, wa).missing), g.setAttribute("data-l10n-id", M(Ni, wa)["missing-label"])) : (I.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button"), g.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button-label"));
const C = M(this, Qi)._uiManager._signal;
I.addEventListener("contextmenu", zA, {
signal: C
}), I.addEventListener("pointerdown", (e) => e.stopPropagation(), {
signal: C
});
const i = (e) => {
e.preventDefault(), M(this, Qi)._uiManager.editAltText(M(this, Qi)), M(this, Bs) && M(this, Qi)._reportTelemetry({
action: "pdfjs.image.alt_text.image_status_label_clicked",
data: {
label: M(this, kA, xu)
}
});
};
return I.addEventListener("click", i, {
capture: !0,
signal: C
}), I.addEventListener("keydown", (e) => {
e.target === I && e.key === "Enter" && ($(this, Vh, !0), i(e));
}, {
signal: C
}), await ig(this, kA, bN).call(this), I;
}
finish() {
M(this, BA) && (M(this, BA).focus({
focusVisible: M(this, Vh)
}), $(this, Vh, !1));
}
isEmpty() {
return M(this, Bs) ? M(this, Dt) === null : !M(this, Dt) && !M(this, Gs);
}
hasData() {
return M(this, Bs) ? M(this, Dt) !== null || !!M(this, pl) : this.isEmpty();
}
get guessedText() {
return M(this, pl);
}
async setGuessedText(I) {
M(this, Dt) === null && ($(this, pl, I), $(this, oc, await Ni._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer", {
generatedAltText: I
})), ig(this, kA, bN).call(this));
}
toggleAltTextBadge(I = !1) {
var g;
if (!M(this, Bs) || M(this, Dt)) {
(g = M(this, ps)) == null || g.remove(), $(this, ps, null);
return;
}
if (!M(this, ps)) {
const C = $(this, ps, document.createElement("div"));
C.className = "noAltTextBadge", M(this, Qi).div.append(C);
}
M(this, ps).classList.toggle("hidden", !I);
}
serialize(I) {
let g = M(this, Dt);
return !I && M(this, pl) === g && (g = M(this, oc)), {
altText: g,
decorative: M(this, Gs),
guessedText: M(this, pl),
textWithDisclaimer: M(this, oc)
};
}
get data() {
return {
altText: M(this, Dt),
decorative: M(this, Gs)
};
}
set data({
altText: I,
decorative: g,
guessedText: C,
textWithDisclaimer: i,
cancel: e = !1
}) {
C && ($(this, pl, C), $(this, oc, i)), !(M(this, Dt) === I && M(this, Gs) === g) && (e || ($(this, Dt, I), $(this, Gs, g)), ig(this, kA, bN).call(this));
}
toggle(I = !1) {
M(this, BA) && (!I && M(this, de) && (clearTimeout(M(this, de)), $(this, de, null)), M(this, BA).disabled = !I);
}
shown() {
M(this, Qi)._reportTelemetry({
action: "pdfjs.image.alt_text.image_status_label_displayed",
data: {
label: M(this, kA, xu)
}
});
}
destroy() {
var I, g;
(I = M(this, BA)) == null || I.remove(), $(this, BA, null), $(this, Nh, null), $(this, ws, null), (g = M(this, ps)) == null || g.remove(), $(this, ps, null);
}
};
Dt = new WeakMap(), Gs = new WeakMap(), BA = new WeakMap(), Nh = new WeakMap(), ws = new WeakMap(), de = new WeakMap(), Vh = new WeakMap(), ps = new WeakMap(), Qi = new WeakMap(), pl = new WeakMap(), oc = new WeakMap(), Bs = new WeakMap(), wa = new WeakMap(), kA = new WeakSet(), xu = function() {
return M(this, Dt) && "added" || M(this, Dt) === null && this.guessedText && "review" || "missing";
}, bN = async function() {
var i, e, A;
const I = M(this, BA);
if (!I)
return;
if (M(this, Bs)) {
if (I.classList.toggle("done", !!M(this, Dt)), I.setAttribute("data-l10n-id", M(Ni, wa)[M(this, kA, xu)]), (i = M(this, Nh)) == null || i.setAttribute("data-l10n-id", M(Ni, wa)[`${M(this, kA, xu)}-label`]), !M(this, Dt)) {
(e = M(this, ws)) == null || e.remove();
return;
}
} else {
if (!M(this, Dt) && !M(this, Gs)) {
I.classList.remove("done"), (A = M(this, ws)) == null || A.remove();
return;
}
I.classList.add("done"), I.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-edit-button");
}
let g = M(this, ws);
if (!g) {
$(this, ws, g = document.createElement("span")), g.className = "tooltip", g.setAttribute("role", "tooltip"), g.id = `alt-text-tooltip-${M(this, Qi).id}`;
const s = 100, l = M(this, Qi)._uiManager._signal;
l.addEventListener("abort", () => {
clearTimeout(M(this, de)), $(this, de, null);
}, {
once: !0
}), I.addEventListener("mouseenter", () => {
$(this, de, setTimeout(() => {
$(this, de, null), M(this, ws).classList.add("show"), M(this, Qi)._reportTelemetry({
action: "alt_text_tooltip"
});
}, s));
}, {
signal: l
}), I.addEventListener("mouseleave", () => {
var n;
M(this, de) && (clearTimeout(M(this, de)), $(this, de, null)), (n = M(this, ws)) == null || n.classList.remove("show");
}, {
signal: l
});
}
M(this, Gs) ? g.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-decorative-tooltip") : (g.removeAttribute("data-l10n-id"), g.textContent = M(this, Dt)), g.parentNode || I.append(g);
const C = M(this, Qi).getElementForAltText();
C == null || C.setAttribute("aria-describedby", g.id);
}, tg(Ni, wa, null), iI(Ni, "_l10n", null);
let tV = Ni;
var Mh, cc, Um, Em, Pm, _m, qm, Bl, dc, Wl, rc, pa, $a, q$, $$, ggg;
const t1 = class t1 {
constructor({
container: I,
isPinchingDisabled: g = null,
isPinchingStopped: C = null,
onPinchStart: i = null,
onPinching: e = null,
onPinchEnd: A = null,
signal: s
}) {
tg(this, $a);
tg(this, Mh);
tg(this, cc, !1);
tg(this, Um, null);
tg(this, Em);
tg(this, Pm);
tg(this, _m);
tg(this, qm);
tg(this, Bl, null);
tg(this, dc);
tg(this, Wl, null);
tg(this, rc);
tg(this, pa, null);
$(this, Mh, I), $(this, Um, C), $(this, Em, g), $(this, Pm, i), $(this, _m, e), $(this, qm, A), $(this, rc, new AbortController()), $(this, dc, AbortSignal.any([s, M(this, rc).signal])), I.addEventListener("touchstart", ig(this, $a, q$).bind(this), {
passive: !1,
signal: M(this, dc)
});
}
get MIN_TOUCH_DISTANCE_TO_PINCH() {
return 35 / In.pixelRatio;
}
destroy() {
var I, g;
(I = M(this, rc)) == null || I.abort(), $(this, rc, null), (g = M(this, Bl)) == null || g.abort(), $(this, Bl, null);
}
};
Mh = new WeakMap(), cc = new WeakMap(), Um = new WeakMap(), Em = new WeakMap(), Pm = new WeakMap(), _m = new WeakMap(), qm = new WeakMap(), Bl = new WeakMap(), dc = new WeakMap(), Wl = new WeakMap(), rc = new WeakMap(), pa = new WeakMap(), $a = new WeakSet(), q$ = function(I) {
var i, e, A;
if ((i = M(this, Em)) != null && i.call(this))
return;
if (I.touches.length === 1) {
if (M(this, Bl))
return;
const s = $(this, Bl, new AbortController()), l = AbortSignal.any([M(this, dc), s.signal]), n = M(this, Mh), a = {
capture: !0,
signal: l,
passive: !1
}, d = (o) => {
var c;
o.pointerType === "touch" && ((c = M(this, Bl)) == null || c.abort(), $(this, Bl, null));
};
n.addEventListener("pointerdown", (o) => {
o.pointerType === "touch" && (ht(o), d(o));
}, a), n.addEventListener("pointerup", d, a), n.addEventListener("pointercancel", d, a);
return;
}
if (!M(this, pa)) {
$(this, pa, new AbortController());
const s = AbortSignal.any([M(this, dc), M(this, pa).signal]), l = M(this, Mh), n = {
signal: s,
capture: !1,
passive: !1
};
l.addEventListener("touchmove", ig(this, $a, $$).bind(this), n);
const a = ig(this, $a, ggg).bind(this);
l.addEventListener("touchend", a, n), l.addEventListener("touchcancel", a, n), n.capture = !0, l.addEventListener("pointerdown", ht, n), l.addEventListener("pointermove", ht, n), l.addEventListener("pointercancel", ht, n), l.addEventListener("pointerup", ht, n), (e = M(this, Pm)) == null || e.call(this);
}
if (ht(I), I.touches.length !== 2 || (A = M(this, Um)) != null && A.call(this)) {
$(this, Wl, null);
return;
}
let [g, C] = I.touches;
g.identifier > C.identifier && ([g, C] = [C, g]), $(this, Wl, {
touch0X: g.screenX,
touch0Y: g.screenY,
touch1X: C.screenX,
touch1Y: C.screenY
});
}, $$ = function(I) {
var p;
if (!M(this, Wl) || I.touches.length !== 2)
return;
ht(I);
let [g, C] = I.touches;
g.identifier > C.identifier && ([g, C] = [C, g]);
const {
screenX: i,
screenY: e
} = g, {
screenX: A,
screenY: s
} = C, l = M(this, Wl), {
touch0X: n,
touch0Y: a,
touch1X: d,
touch1Y: o
} = l, c = d - n, r = o - a, h = A - i, b = s - e, u = Math.hypot(h, b) || 1, m = Math.hypot(c, r) || 1;
if (!M(this, cc) && Math.abs(m - u) <= t1.MIN_TOUCH_DISTANCE_TO_PINCH)
return;
if (l.touch0X = i, l.touch0Y = e, l.touch1X = A, l.touch1Y = s, !M(this, cc)) {
$(this, cc, !0);
return;
}
const Z = [(i + A) / 2, (e + s) / 2];
(p = M(this, _m)) == null || p.call(this, Z, m, u);
}, ggg = function(I) {
var g;
I.touches.length >= 2 || (M(this, pa).abort(), $(this, pa, null), (g = M(this, qm)) == null || g.call(this), M(this, Wl) && (ht(I), $(this, Wl, null), $(this, cc, !1)));
};
let iV = t1;
var hc, WA, XC, Rh, Ba, $m, bc, Pt, uc, yl, Wa, gZ, mc, re, IZ, Zc, Yl, Ws, fh, Hh, Ue, Gc, CZ, KV, wI, iS, tZ, eS, uN, Igg, Cgg, AS, mN, sS, tgg, igg, egg, lS, Agg, nS, sgg, lgg, ngg, aS, ju;
const zI = class zI {
constructor(I) {
tg(this, wI);
tg(this, hc, null);
tg(this, WA, null);
tg(this, XC, null);
tg(this, Rh, !1);
tg(this, Ba, null);
tg(this, $m, "");
tg(this, bc, !1);
tg(this, Pt, null);
tg(this, uc, null);
tg(this, yl, null);
tg(this, Wa, null);
tg(this, gZ, "");
tg(this, mc, !1);
tg(this, re, null);
tg(this, IZ, !1);
tg(this, Zc, !1);
tg(this, Yl, !1);
tg(this, Ws, null);
tg(this, fh, 0);
tg(this, Hh, 0);
tg(this, Ue, null);
tg(this, Gc, null);
iI(this, "_isCopy", !1);
iI(this, "_editToolbar", null);
iI(this, "_initialOptions", /* @__PURE__ */ Object.create(null));
iI(this, "_initialData", null);
iI(this, "_isVisible", !0);
iI(this, "_uiManager", null);
iI(this, "_focusEventsAllowed", !0);
tg(this, CZ, !1);
tg(this, KV, zI._zIndex++);
this.parent = I.parent, this.id = I.id, this.width = this.height = null, this.pageIndex = I.parent.pageIndex, this.name = I.name, this.div = null, this._uiManager = I.uiManager, this.annotationElementId = null, this._willKeepAspectRatio = !1, this._initialOptions.isCentered = I.isCentered, this._structTreeParentId = null;
const {
rotation: g,
rawDims: {
pageWidth: C,
pageHeight: i,
pageX: e,
pageY: A
}
} = this.parent.viewport;
this.rotation = g, this.pageRotation = (360 + g - this._uiManager.viewParameters.rotation) % 360, this.pageDimensions = [C, i], this.pageTranslation = [e, A];
const [s, l] = this.parentDimensions;
this.x = I.x / s, this.y = I.y / l, this.isAttachedToDOM = !1, this.deleted = !1;
}
static get _resizerKeyboardManager() {
const I = zI.prototype._resizeWithKeyboard, g = dd.TRANSLATE_SMALL, C = dd.TRANSLATE_BIG;
return UI(this, "_resizerKeyboardManager", new lG([[["ArrowLeft", "mac+ArrowLeft"], I, {
args: [-g, 0]
}], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], I, {
args: [-C, 0]
}], [["ArrowRight", "mac+ArrowRight"], I, {
args: [g, 0]
}], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], I, {
args: [C, 0]
}], [["ArrowUp", "mac+ArrowUp"], I, {
args: [0, -g]
}], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], I, {
args: [0, -C]
}], [["ArrowDown", "mac+ArrowDown"], I, {
args: [0, g]
}], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], I, {
args: [0, C]
}], [["Escape", "mac+Escape"], zI.prototype._stopResizingWithKeyboard]]));
}
get editorType() {
return Object.getPrototypeOf(this).constructor._type;
}
static get isDrawer() {
return !1;
}
static get _defaultLineColor() {
return UI(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText"));
}
static deleteAnnotationElement(I) {
const g = new Acg({
id: I.parent.getNextId(),
parent: I.parent,
uiManager: I._uiManager
});
g.annotationElementId = I.annotationElementId, g.deleted = !0, g._uiManager.addToAnnotationStorage(g);
}
static initialize(I, g) {
if (zI._l10n ?? (zI._l10n = I), zI._l10nResizer || (zI._l10nResizer = Object.freeze({
topLeft: "pdfjs-editor-resizer-top-left",
topMiddle: "pdfjs-editor-resizer-top-middle",
topRight: "pdfjs-editor-resizer-top-right",
middleRight: "pdfjs-editor-resizer-middle-right",
bottomRight: "pdfjs-editor-resizer-bottom-right",
bottomMiddle: "pdfjs-editor-resizer-bottom-middle",
bottomLeft: "pdfjs-editor-resizer-bottom-left",
middleLeft: "pdfjs-editor-resizer-middle-left"
})), zI._borderLineWidth !== -1)
return;
const C = getComputedStyle(document.documentElement);
zI._borderLineWidth = parseFloat(C.getPropertyValue("--outline-width")) || 0;
}
static updateDefaultParams(I, g) {
}
static get defaultPropertiesToUpdate() {
return [];
}
static isHandlingMimeForPasting(I) {
return !1;
}
static paste(I, g) {
BC("Not implemented");
}
get propertiesToUpdate() {
return [];
}
get _isDraggable() {
return M(this, CZ);
}
set _isDraggable(I) {
var g;
$(this, CZ, I), (g = this.div) == null || g.classList.toggle("draggable", I);
}
get isEnterHandled() {
return !0;
}
center() {
const [I, g] = this.pageDimensions;
switch (this.parentRotation) {
case 90:
this.x -= this.height * g / (I * 2), this.y += this.width * I / (g * 2);
break;
case 180:
this.x += this.width / 2, this.y += this.height / 2;
break;
case 270:
this.x += this.height * g / (I * 2), this.y -= this.width * I / (g * 2);
break;
default:
this.x -= this.width / 2, this.y -= this.height / 2;
break;
}
this.fixAndSetPosition();
}
addCommands(I) {
this._uiManager.addCommands(I);
}
get currentLayer() {
return this._uiManager.currentLayer;
}
setInBackground() {
this.div.style.zIndex = 0;
}
setInForeground() {
this.div.style.zIndex = M(this, KV);
}
setParent(I) {
I !== null ? (this.pageIndex = I.pageIndex, this.pageDimensions = I.pageDimensions) : ig(this, wI, ju).call(this), this.parent = I;
}
focusin(I) {
this._focusEventsAllowed && (M(this, mc) ? $(this, mc, !1) : this.parent.setSelected(this));
}
focusout(I) {
var C;
if (!this._focusEventsAllowed || !this.isAttachedToDOM)
return;
const g = I.relatedTarget;
g != null && g.closest(`#${this.id}`) || (I.preventDefault(), (C = this.parent) != null && C.isMultipleSelection || this.commitOrRemove());
}
commitOrRemove() {
this.isEmpty() ? this.remove() : this.commit();
}
commit() {
this.addToAnnotationStorage();
}
addToAnnotationStorage() {
this._uiManager.addToAnnotationStorage(this);
}
setAt(I, g, C, i) {
const [e, A] = this.parentDimensions;
[C, i] = this.screenToPageTranslation(C, i), this.x = (I + C) / e, this.y = (g + i) / A, this.fixAndSetPosition();
}
_moveAfterPaste(I, g) {
const [C, i] = this.parentDimensions;
this.setAt(I * C, g * i, this.width * C, this.height * i), this._onTranslated();
}
translate(I, g) {
ig(this, wI, iS).call(this, this.parentDimensions, I, g);
}
translateInPage(I, g) {
M(this, re) || $(this, re, [this.x, this.y, this.width, this.height]), ig(this, wI, iS).call(this, this.pageDimensions, I, g), this.div.scrollIntoView({
block: "nearest"
});
}
translationDone() {
this._onTranslated(this.x, this.y);
}
drag(I, g) {
M(this, re) || $(this, re, [this.x, this.y, this.width, this.height]);
const {
div: C,
parentDimensions: [i, e]
} = this;
if (this.x += I / i, this.y += g / e, this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {
const {
x: d,
y: o
} = this.div.getBoundingClientRect();
this.parent.findNewParent(this, d, o) && (this.x -= Math.floor(this.x), this.y -= Math.floor(this.y));
}
let {
x: A,
y: s
} = this;
const [l, n] = this.getBaseTranslation();
A += l, s += n;
const {
style: a
} = C;
a.left = `${(100 * A).toFixed(2)}%`, a.top = `${(100 * s).toFixed(2)}%`, this._onTranslating(A, s), C.scrollIntoView({
block: "nearest"
});
}
_onTranslating(I, g) {
}
_onTranslated(I, g) {
}
get _hasBeenMoved() {
return !!M(this, re) && (M(this, re)[0] !== this.x || M(this, re)[1] !== this.y);
}
get _hasBeenResized() {
return !!M(this, re) && (M(this, re)[2] !== this.width || M(this, re)[3] !== this.height);
}
getBaseTranslation() {
const [I, g] = this.parentDimensions, {
_borderLineWidth: C
} = zI, i = C / I, e = C / g;
switch (this.rotation) {
case 90:
return [-i, e];
case 180:
return [i, e];
case 270:
return [i, -e];
default:
return [-i, -e];
}
}
get _mustFixPosition() {
return !0;
}
fixAndSetPosition(I = this.rotation) {
const {
div: {
style: g
},
pageDimensions: [C, i]
} = this;
let {
x: e,
y: A,
width: s,
height: l
} = this;
if (s *= C, l *= i, e *= C, A *= i, this._mustFixPosition)
switch (I) {
case 0:
e = fi(e, 0, C - s), A = fi(A, 0, i - l);
break;
case 90:
e = fi(e, 0, C - l), A = fi(A, s, i);
break;
case 180:
e = fi(e, s, C), A = fi(A, l, i);
break;
case 270:
e = fi(e, l, C), A = fi(A, 0, i - s);
break;
}
this.x = e /= C, this.y = A /= i;
const [n, a] = this.getBaseTranslation();
e += n, A += a, g.left = `${(100 * e).toFixed(2)}%`, g.top = `${(100 * A).toFixed(2)}%`, this.moveInDOM();
}
screenToPageTranslation(I, g) {
var C;
return ig(C = zI, tZ, eS).call(C, I, g, this.parentRotation);
}
pageTranslationToScreen(I, g) {
var C;
return ig(C = zI, tZ, eS).call(C, I, g, 360 - this.parentRotation);
}
get parentScale() {
return this._uiManager.viewParameters.realScale;
}
get parentRotation() {
return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360;
}
get parentDimensions() {
const {
parentScale: I,
pageDimensions: [g, C]
} = this;
return [g * I, C * I];
}
setDims(I, g) {
const [C, i] = this.parentDimensions, {
style: e
} = this.div;
e.width = `${(100 * I / C).toFixed(2)}%`, M(this, bc) || (e.height = `${(100 * g / i).toFixed(2)}%`);
}
fixDims() {
const {
style: I
} = this.div, {
height: g,
width: C
} = I, i = C.endsWith("%"), e = !M(this, bc) && g.endsWith("%");
if (i && e)
return;
const [A, s] = this.parentDimensions;
i || (I.width = `${(100 * parseFloat(C) / A).toFixed(2)}%`), !M(this, bc) && !e && (I.height = `${(100 * parseFloat(g) / s).toFixed(2)}%`);
}
getInitialTranslation() {
return [0, 0];
}
_onResized() {
}
static _round(I) {
return Math.round(I * 1e4) / 1e4;
}
_onResizing() {
}
altTextFinish() {
var I;
(I = M(this, XC)) == null || I.finish();
}
async addEditToolbar() {
return this._editToolbar || M(this, Zc) ? this._editToolbar : (this._editToolbar = new EX(this), this.div.append(this._editToolbar.render()), M(this, XC) && await this._editToolbar.addAltText(M(this, XC)), this._editToolbar);
}
removeEditToolbar() {
var I;
this._editToolbar && (this._editToolbar.remove(), this._editToolbar = null, (I = M(this, XC)) == null || I.destroy());
}
addContainer(I) {
var C;
const g = (C = this._editToolbar) == null ? void 0 : C.div;
g ? g.before(I) : this.div.append(I);
}
getClientDimensions() {
return this.div.getBoundingClientRect();
}
async addAltTextButton() {
M(this, XC) || (tV.initialize(zI._l10n), $(this, XC, new tV(this)), M(this, hc) && (M(this, XC).data = M(this, hc), $(this, hc, null)), await this.addEditToolbar());
}
get altTextData() {
var I;
return (I = M(this, XC)) == null ? void 0 : I.data;
}
set altTextData(I) {
M(this, XC) && (M(this, XC).data = I);
}
get guessedAltText() {
var I;
return (I = M(this, XC)) == null ? void 0 : I.guessedText;
}
async setGuessedAltText(I) {
var g;
await ((g = M(this, XC)) == null ? void 0 : g.setGuessedText(I));
}
serializeAltText(I) {
var g;
return (g = M(this, XC)) == null ? void 0 : g.serialize(I);
}
hasAltText() {
return !!M(this, XC) && !M(this, XC).isEmpty();
}
hasAltTextData() {
var I;
return ((I = M(this, XC)) == null ? void 0 : I.hasData()) ?? !1;
}
render() {
var A;
const I = this.div = document.createElement("div");
I.setAttribute("data-editor-rotation", (360 - this.rotation) % 360), I.className = this.name, I.setAttribute("id", this.id), I.tabIndex = M(this, Rh) ? -1 : 0, I.setAttribute("role", "application"), this.defaultL10nId && I.setAttribute("data-l10n-id", this.defaultL10nId), this._isVisible || I.classList.add("hidden"), this.setInForeground(), ig(this, wI, nS).call(this);
const [g, C] = this.parentDimensions;
this.parentRotation % 180 !== 0 && (I.style.maxWidth = `${(100 * C / g).toFixed(2)}%`, I.style.maxHeight = `${(100 * g / C).toFixed(2)}%`);
const [i, e] = this.getInitialTranslation();
return this.translate(i, e), m9(this, I, ["keydown", "pointerdown"]), this.isResizable && this._uiManager._supportsPinchToZoom && (M(this, Gc) || $(this, Gc, new iV({
container: I,
isPinchingDisabled: () => !this.isSelected,
onPinchStart: ig(this, wI, tgg).bind(this),
onPinching: ig(this, wI, igg).bind(this),
onPinchEnd: ig(this, wI, egg).bind(this),
signal: this._uiManager._signal
}))), (A = this._uiManager._editorUndoBar) == null || A.hide(), I;
}
pointerdown(I) {
const {
isMac: g
} = Ai.platform;
if (I.button !== 0 || I.ctrlKey && g) {
I.preventDefault();
return;
}
if ($(this, mc, !0), this._isDraggable) {
ig(this, wI, Agg).call(this, I);
return;
}
ig(this, wI, lS).call(this, I);
}
get isSelected() {
return this._uiManager.isSelected(this);
}
_onStartDragging() {
}
_onStopDragging() {
}
moveInDOM() {
M(this, Ws) && clearTimeout(M(this, Ws)), $(this, Ws, setTimeout(() => {
var I;
$(this, Ws, null), (I = this.parent) == null || I.moveEditorInDOM(this);
}, 0));
}
_setParentAndPosition(I, g, C) {
I.changeParent(this), this.x = g, this.y = C, this.fixAndSetPosition(), this._onTranslated();
}
getRect(I, g, C = this.rotation) {
const i = this.parentScale, [e, A] = this.pageDimensions, [s, l] = this.pageTranslation, n = I / i, a = g / i, d = this.x * e, o = this.y * A, c = this.width * e, r = this.height * A;
switch (C) {
case 0:
return [d + n + s, A - o - a - r + l, d + n + c + s, A - o - a + l];
case 90:
return [d + a + s, A - o + n + l, d + a + r + s, A - o + n + c + l];
case 180:
return [d - n - c + s, A - o + a + l, d - n + s, A - o + a + r + l];
case 270:
return [d - a - r + s, A - o - n - c + l, d - a + s, A - o - n + l];
default:
throw new Error("Invalid rotation");
}
}
getRectInCurrentCoords(I, g) {
const [C, i, e, A] = I, s = e - C, l = A - i;
switch (this.rotation) {
case 0:
return [C, g - A, s, l];
case 90:
return [C, g - i, l, s];
case 180:
return [e, g - i, s, l];
case 270:
return [e, g - A, l, s];
default:
throw new Error("Invalid rotation");
}
}
onceAdded(I) {
}
isEmpty() {
return !1;
}
enableEditMode() {
$(this, Zc, !0);
}
disableEditMode() {
$(this, Zc, !1);
}
isInEditMode() {
return M(this, Zc);
}
shouldGetKeyboardEvents() {
return M(this, Yl);
}
needsToBeRebuilt() {
return this.div && !this.isAttachedToDOM;
}
get isOnScreen() {
const {
top: I,
left: g,
bottom: C,
right: i
} = this.getClientDimensions(), {
innerHeight: e,
innerWidth: A
} = window;
return g < A && i > 0 && I < e && C > 0;
}
rebuild() {
ig(this, wI, nS).call(this);
}
rotate(I) {
}
resize() {
}
serializeDeleted() {
var I;
return {
id: this.annotationElementId,
deleted: !0,
pageIndex: this.pageIndex,
popupRef: ((I = this._initialData) == null ? void 0 : I.popupRef) || ""
};
}
serialize(I = !1, g = null) {
BC("An editor must be serializable");
}
static async deserialize(I, g, C) {
const i = new this.prototype.constructor({
parent: g,
id: g.getNextId(),
uiManager: C
});
i.rotation = I.rotation, $(i, hc, I.accessibilityData), i._isCopy = I.isCopy || !1;
const [e, A] = i.pageDimensions, [s, l, n, a] = i.getRectInCurrentCoords(I.rect, A);
return i.x = s / e, i.y = l / A, i.width = n / e, i.height = a / A, i;
}
get hasBeenModified() {
return !!this.annotationElementId && (this.deleted || this.serialize() !== null);
}
remove() {
var I, g;
if ((I = M(this, Wa)) == null || I.abort(), $(this, Wa, null), this.isEmpty() || this.commit(), this.parent ? this.parent.remove(this) : this._uiManager.removeEditor(this), M(this, Ws) && (clearTimeout(M(this, Ws)), $(this, Ws, null)), ig(this, wI, ju).call(this), this.removeEditToolbar(), M(this, Ue)) {
for (const C of M(this, Ue).values())
clearTimeout(C);
$(this, Ue, null);
}
this.parent = null, (g = M(this, Gc)) == null || g.destroy(), $(this, Gc, null);
}
get isResizable() {
return !1;
}
makeResizable() {
this.isResizable && (ig(this, wI, Igg).call(this), M(this, Pt).classList.remove("hidden"));
}
get toolbarPosition() {
return null;
}
keydown(I) {
if (!this.isResizable || I.target !== this.div || I.key !== "Enter")
return;
this._uiManager.setSelected(this), $(this, yl, {
savedX: this.x,
savedY: this.y,
savedWidth: this.width,
savedHeight: this.height
});
const g = M(this, Pt).children;
if (!M(this, WA)) {
$(this, WA, Array.from(g));
const A = ig(this, wI, sgg).bind(this), s = ig(this, wI, lgg).bind(this), l = this._uiManager._signal;
for (const n of M(this, WA)) {
const a = n.getAttribute("data-resizer-name");
n.setAttribute("role", "spinbutton"), n.addEventListener("keydown", A, {
signal: l
}), n.addEventListener("blur", s, {
signal: l
}), n.addEventListener("focus", ig(this, wI, ngg).bind(this, a), {
signal: l
}), n.setAttribute("data-l10n-id", zI._l10nResizer[a]);
}
}
const C = M(this, WA)[0];
let i = 0;
for (const A of g) {
if (A === C)
break;
i++;
}
const e = (360 - this.rotation + this.parentRotation) % 360 / 90 * (M(this, WA).length / 4);
if (e !== i) {
if (e < i)
for (let s = 0; s < i - e; s++)
M(this, Pt).append(M(this, Pt).firstChild);
else if (e > i)
for (let s = 0; s < e - i; s++)
M(this, Pt).firstChild.before(M(this, Pt).lastChild);
let A = 0;
for (const s of g) {
const n = M(this, WA)[A++].getAttribute("data-resizer-name");
s.setAttribute("data-l10n-id", zI._l10nResizer[n]);
}
}
ig(this, wI, aS).call(this, 0), $(this, Yl, !0), M(this, Pt).firstChild.focus({
focusVisible: !0
}), I.preventDefault(), I.stopImmediatePropagation();
}
_resizeWithKeyboard(I, g) {
M(this, Yl) && ig(this, wI, sS).call(this, M(this, gZ), {
deltaX: I,
deltaY: g,
fromKeyboard: !0
});
}
_stopResizingWithKeyboard() {
ig(this, wI, ju).call(this), this.div.focus();
}
select() {
var I, g, C;
if (this.makeResizable(), (I = this.div) == null || I.classList.add("selectedEditor"), !this._editToolbar) {
this.addEditToolbar().then(() => {
var i, e;
(i = this.div) != null && i.classList.contains("selectedEditor") && ((e = this._editToolbar) == null || e.show());
});
return;
}
(g = this._editToolbar) == null || g.show(), (C = M(this, XC)) == null || C.toggleAltTextBadge(!1);
}
unselect() {
var I, g, C, i, e;
(I = M(this, Pt)) == null || I.classList.add("hidden"), (g = this.div) == null || g.classList.remove("selectedEditor"), (C = this.div) != null && C.contains(document.activeElement) && this._uiManager.currentLayer.div.focus({
preventScroll: !0
}), (i = this._editToolbar) == null || i.hide(), (e = M(this, XC)) == null || e.toggleAltTextBadge(!0);
}
updateParams(I, g) {
}
disableEditing() {
}
enableEditing() {
}
enterInEditMode() {
}
getElementForAltText() {
return this.div;
}
get contentDiv() {
return this.div;
}
get isEditing() {
return M(this, IZ);
}
set isEditing(I) {
$(this, IZ, I), this.parent && (I ? (this.parent.setSelected(this), this.parent.setActiveEditor(this)) : this.parent.setActiveEditor(null));
}
setAspectRatio(I, g) {
$(this, bc, !0);
const C = I / g, {
style: i
} = this.div;
i.aspectRatio = C, i.height = "auto";
}
static get MIN_SIZE() {
return 16;
}
static canCreateNewEmptyEditor() {
return !0;
}
get telemetryInitialData() {
return {
action: "added"
};
}
get telemetryFinalData() {
return null;
}
_reportTelemetry(I, g = !1) {
if (g) {
M(this, Ue) || $(this, Ue, /* @__PURE__ */ new Map());
const {
action: C
} = I;
let i = M(this, Ue).get(C);
i && clearTimeout(i), i = setTimeout(() => {
this._reportTelemetry(I), M(this, Ue).delete(C), M(this, Ue).size === 0 && $(this, Ue, null);
}, zI._telemetryTimeout), M(this, Ue).set(C, i);
return;
}
I.type || (I.type = this.editorType), this._uiManager._eventBus.dispatch("reporttelemetry", {
source: this,
details: {
type: "editing",
data: I
}
});
}
show(I = this._isVisible) {
this.div.classList.toggle("hidden", !I), this._isVisible = I;
}
enable() {
this.div && (this.div.tabIndex = 0), $(this, Rh, !1);
}
disable() {
this.div && (this.div.tabIndex = -1), $(this, Rh, !0);
}
renderAnnotationElement(I) {
let g = I.container.querySelector(".annotationContent");
if (!g)
g = document.createElement("div"), g.classList.add("annotationContent", this.editorType), I.container.prepend(g);
else if (g.nodeName === "CANVAS") {
const C = g;
g = document.createElement("div"), g.classList.add("annotationContent", this.editorType), C.before(g);
}
return g;
}
resetAnnotationElement(I) {
const {
firstChild: g
} = I.container;
(g == null ? void 0 : g.nodeName) === "DIV" && g.classList.contains("annotationContent") && g.remove();
}
};
hc = new WeakMap(), WA = new WeakMap(), XC = new WeakMap(), Rh = new WeakMap(), Ba = new WeakMap(), $m = new WeakMap(), bc = new WeakMap(), Pt = new WeakMap(), uc = new WeakMap(), yl = new WeakMap(), Wa = new WeakMap(), gZ = new WeakMap(), mc = new WeakMap(), re = new WeakMap(), IZ = new WeakMap(), Zc = new WeakMap(), Yl = new WeakMap(), Ws = new WeakMap(), fh = new WeakMap(), Hh = new WeakMap(), Ue = new WeakMap(), Gc = new WeakMap(), CZ = new WeakMap(), KV = new WeakMap(), wI = new WeakSet(), iS = function([I, g], C, i) {
[C, i] = this.screenToPageTranslation(C, i), this.x += C / I, this.y += i / g, this._onTranslating(this.x, this.y), this.fixAndSetPosition();
}, tZ = new WeakSet(), eS = function(I, g, C) {
switch (C) {
case 90:
return [g, -I];
case 180:
return [-I, -g];
case 270:
return [-g, I];
default:
return [I, g];
}
}, uN = function(I) {
switch (I) {
case 90: {
const [g, C] = this.pageDimensions;
return [0, -g / C, C / g, 0];
}
case 180:
return [-1, 0, 0, -1];
case 270: {
const [g, C] = this.pageDimensions;
return [0, g / C, -C / g, 0];
}
default:
return [1, 0, 0, 1];
}
}, Igg = function() {
if (M(this, Pt))
return;
$(this, Pt, document.createElement("div")), M(this, Pt).classList.add("resizers");
const I = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"], g = this._uiManager._signal;
for (const C of I) {
const i = document.createElement("div");
M(this, Pt).append(i), i.classList.add("resizer", C), i.setAttribute("data-resizer-name", C), i.addEventListener("pointerdown", ig(this, wI, Cgg).bind(this, C), {
signal: g
}), i.addEventListener("contextmenu", zA, {
signal: g
}), i.tabIndex = -1;
}
this.div.prepend(M(this, Pt));
}, Cgg = function(I, g) {
var a;
g.preventDefault();
const {
isMac: C
} = Ai.platform;
if (g.button !== 0 || g.ctrlKey && C)
return;
(a = M(this, XC)) == null || a.toggle(!1);
const i = this._isDraggable;
this._isDraggable = !1, $(this, uc, [g.screenX, g.screenY]);
const e = new AbortController(), A = this._uiManager.combinedSignal(e);
this.parent.togglePointerEvents(!1), window.addEventListener("pointermove", ig(this, wI, sS).bind(this, I), {
passive: !0,
capture: !0,
signal: A
}), window.addEventListener("touchmove", ht, {
passive: !1,
signal: A
}), window.addEventListener("contextmenu", zA, {
signal: A
}), $(this, yl, {
savedX: this.x,
savedY: this.y,
savedWidth: this.width,
savedHeight: this.height
});
const s = this.parent.div.style.cursor, l = this.div.style.cursor;
this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(g.target).cursor;
const n = () => {
var d;
e.abort(), this.parent.togglePointerEvents(!0), (d = M(this, XC)) == null || d.toggle(!0), this._isDraggable = i, this.parent.div.style.cursor = s, this.div.style.cursor = l, ig(this, wI, mN).call(this);
};
window.addEventListener("pointerup", n, {
signal: A
}), window.addEventListener("blur", n, {
signal: A
});
}, AS = function(I, g, C, i) {
this.width = C, this.height = i, this.x = I, this.y = g;
const [e, A] = this.parentDimensions;
this.setDims(e * C, A * i), this.fixAndSetPosition(), this._onResized();
}, mN = function() {
if (!M(this, yl))
return;
const {
savedX: I,
savedY: g,
savedWidth: C,
savedHeight: i
} = M(this, yl);
$(this, yl, null);
const e = this.x, A = this.y, s = this.width, l = this.height;
e === I && A === g && s === C && l === i || this.addCommands({
cmd: ig(this, wI, AS).bind(this, e, A, s, l),
undo: ig(this, wI, AS).bind(this, I, g, C, i),
mustExec: !0
});
}, sS = function(I, g) {
const [C, i] = this.parentDimensions, e = this.x, A = this.y, s = this.width, l = this.height, n = zI.MIN_SIZE / C, a = zI.MIN_SIZE / i, d = ig(this, wI, uN).call(this, this.rotation), o = (G, w) => [d[0] * G + d[2] * w, d[1] * G + d[3] * w], c = ig(this, wI, uN).call(this, 360 - this.rotation), r = (G, w) => [c[0] * G + c[2] * w, c[1] * G + c[3] * w];
let h, b, u = !1, m = !1;
switch (I) {
case "topLeft":
u = !0, h = (G, w) => [0, 0], b = (G, w) => [G, w];
break;
case "topMiddle":
h = (G, w) => [G / 2, 0], b = (G, w) => [G / 2, w];
break;
case "topRight":
u = !0, h = (G, w) => [G, 0], b = (G, w) => [0, w];
break;
case "middleRight":
m = !0, h = (G, w) => [G, w / 2], b = (G, w) => [0, w / 2];
break;
case "bottomRight":
u = !0, h = (G, w) => [G, w], b = (G, w) => [0, 0];
break;
case "bottomMiddle":
h = (G, w) => [G / 2, w], b = (G, w) => [G / 2, 0];
break;
case "bottomLeft":
u = !0, h = (G, w) => [0, w], b = (G, w) => [G, 0];
break;
case "middleLeft":
m = !0, h = (G, w) => [0, w / 2], b = (G, w) => [G, w / 2];
break;
}
const Z = h(s, l), p = b(s, l);
let Y = o(...p);
const R = zI._round(e + Y[0]), X = zI._round(A + Y[1]);
let H = 1, S = 1, z, v;
if (g.fromKeyboard)
({
deltaX: z,
deltaY: v
} = g);
else {
const {
screenX: G,
screenY: w
} = g, [W, y] = M(this, uc);
[z, v] = this.screenToPageTranslation(G - W, w - y), M(this, uc)[0] = G, M(this, uc)[1] = w;
}
if ([z, v] = r(z / C, v / i), u) {
const G = Math.hypot(s, l);
H = S = Math.max(Math.min(Math.hypot(p[0] - Z[0] - z, p[1] - Z[1] - v) / G, 1 / s, 1 / l), n / s, a / l);
} else m ? H = fi(Math.abs(p[0] - Z[0] - z), n, 1) / s : S = fi(Math.abs(p[1] - Z[1] - v), a, 1) / l;
const K = zI._round(s * H), V = zI._round(l * S);
Y = o(...b(K, V));
const N = R - Y[0], B = X - Y[1];
M(this, re) || $(this, re, [this.x, this.y, this.width, this.height]), this.width = K, this.height = V, this.x = N, this.y = B, this.setDims(C * K, i * V), this.fixAndSetPosition(), this._onResizing();
}, tgg = function() {
var I;
$(this, yl, {
savedX: this.x,
savedY: this.y,
savedWidth: this.width,
savedHeight: this.height
}), (I = M(this, XC)) == null || I.toggle(!1), this.parent.togglePointerEvents(!1);
}, igg = function(I, g, C) {
let e = 0.7 * (C / g) + 1 - 0.7;
if (e === 1)
return;
const A = ig(this, wI, uN).call(this, this.rotation), s = (R, X) => [A[0] * R + A[2] * X, A[1] * R + A[3] * X], [l, n] = this.parentDimensions, a = this.x, d = this.y, o = this.width, c = this.height, r = zI.MIN_SIZE / l, h = zI.MIN_SIZE / n;
e = Math.max(Math.min(e, 1 / o, 1 / c), r / o, h / c);
const b = zI._round(o * e), u = zI._round(c * e);
if (b === o && u === c)
return;
M(this, re) || $(this, re, [a, d, o, c]);
const m = s(o / 2, c / 2), Z = zI._round(a + m[0]), p = zI._round(d + m[1]), Y = s(b / 2, u / 2);
this.x = Z - Y[0], this.y = p - Y[1], this.width = b, this.height = u, this.setDims(l * b, n * u), this.fixAndSetPosition(), this._onResizing();
}, egg = function() {
var I;
(I = M(this, XC)) == null || I.toggle(!0), this.parent.togglePointerEvents(!0), ig(this, wI, mN).call(this);
}, lS = function(I) {
const {
isMac: g
} = Ai.platform;
I.ctrlKey && !g || I.shiftKey || I.metaKey && g ? this.parent.toggleSelected(this) : this.parent.setSelected(this);
}, Agg = function(I) {
const {
isSelected: g
} = this;
this._uiManager.setUpDragSession();
let C = !1;
const i = new AbortController(), e = this._uiManager.combinedSignal(i), A = {
capture: !0,
passive: !1,
signal: e
}, s = (n) => {
i.abort(), $(this, Ba, null), $(this, mc, !1), this._uiManager.endDragSession() || ig(this, wI, lS).call(this, n), C && this._onStopDragging();
};
g && ($(this, fh, I.clientX), $(this, Hh, I.clientY), $(this, Ba, I.pointerId), $(this, $m, I.pointerType), window.addEventListener("pointermove", (n) => {
C || (C = !0, this._onStartDragging());
const {
clientX: a,
clientY: d,
pointerId: o
} = n;
if (o !== M(this, Ba)) {
ht(n);
return;
}
const [c, r] = this.screenToPageTranslation(a - M(this, fh), d - M(this, Hh));
$(this, fh, a), $(this, Hh, d), this._uiManager.dragSelectedEditors(c, r);
}, A), window.addEventListener("touchmove", ht, A), window.addEventListener("pointerdown", (n) => {
n.pointerType === M(this, $m) && (M(this, Gc) || n.isPrimary) && s(n), ht(n);
}, A));
const l = (n) => {
if (!M(this, Ba) || M(this, Ba) === n.pointerId) {
s(n);
return;
}
ht(n);
};
window.addEventListener("pointerup", l, {
signal: e
}), window.addEventListener("blur", l, {
signal: e
});
}, nS = function() {
if (M(this, Wa) || !this.div)
return;
$(this, Wa, new AbortController());
const I = this._uiManager.combinedSignal(M(this, Wa));
this.div.addEventListener("focusin", this.focusin.bind(this), {
signal: I
}), this.div.addEventListener("focusout", this.focusout.bind(this), {
signal: I
});
}, sgg = function(I) {
zI._resizerKeyboardManager.exec(this, I);
}, lgg = function(I) {
var g;
M(this, Yl) && ((g = I.relatedTarget) == null ? void 0 : g.parentNode) !== M(this, Pt) && ig(this, wI, ju).call(this);
}, ngg = function(I) {
$(this, gZ, M(this, Yl) ? I : "");
}, aS = function(I) {
if (M(this, WA))
for (const g of M(this, WA))
g.tabIndex = I;
}, ju = function() {
$(this, Yl, !1), ig(this, wI, aS).call(this, -1), ig(this, wI, mN).call(this);
}, tg(zI, tZ), iI(zI, "_l10n", null), iI(zI, "_l10nResizer", null), iI(zI, "_borderLineWidth", -1), iI(zI, "_colorManager", new _X()), iI(zI, "_zIndex", 1), iI(zI, "_telemetryTimeout", 1e3);
let TC = zI;
class Acg extends TC {
constructor(I) {
super(I), this.annotationElementId = I.annotationElementId, this.deleted = !0;
}
serialize() {
return this.serializeDeleted();
}
}
const g8 = 3285377520, Te = 4294901760, ls = 65535;
class agg {
constructor(I) {
this.h1 = I ? I & 4294967295 : g8, this.h2 = I ? I & 4294967295 : g8;
}
update(I) {
let g, C;
if (typeof I == "string") {
g = new Uint8Array(I.length * 2), C = 0;
for (let h = 0, b = I.length; h < b; h++) {
const u = I.charCodeAt(h);
u <= 255 ? g[C++] = u : (g[C++] = u >>> 8, g[C++] = u & 255);
}
} else if (ArrayBuffer.isView(I))
g = I.slice(), C = g.byteLength;
else
throw new Error("Invalid data format, must be a string or TypedArray.");
const i = C >> 2, e = C - i * 4, A = new Uint32Array(g.buffer, 0, i);
let s = 0, l = 0, n = this.h1, a = this.h2;
const d = 3432918353, o = 461845907, c = d & ls, r = o & ls;
for (let h = 0; h < i; h++)
h & 1 ? (s = A[h], s = s * d & Te | s * c & ls, s = s << 15 | s >>> 17, s = s * o & Te | s * r & ls, n ^= s, n = n << 13 | n >>> 19, n = n * 5 + 3864292196) : (l = A[h], l = l * d & Te | l * c & ls, l = l << 15 | l >>> 17, l = l * o & Te | l * r & ls, a ^= l, a = a << 13 | a >>> 19, a = a * 5 + 3864292196);
switch (s = 0, e) {
case 3:
s ^= g[i * 4 + 2] << 16;
case 2:
s ^= g[i * 4 + 1] << 8;
case 1:
s ^= g[i * 4], s = s * d & Te | s * c & ls, s = s << 15 | s >>> 17, s = s * o & Te | s * r & ls, i & 1 ? n ^= s : a ^= s;
}
this.h1 = n, this.h2 = a;
}
hexdigest() {
let I = this.h1, g = this.h2;
return I ^= g >>> 1, I = I * 3981806797 & Te | I * 36045 & ls, g = g * 4283543511 & Te | ((g << 16 | I >>> 16) * 2950163797 & Te) >>> 16, I ^= g >>> 1, I = I * 444984403 & Te | I * 60499 & ls, g = g * 3301882366 & Te | ((g << 16 | I >>> 16) * 3120437893 & Te) >>> 16, I ^= g >>> 1, (I >>> 0).toString(16).padStart(8, "0") + (g >>> 0).toString(16).padStart(8, "0");
}
}
const oS = Object.freeze({
map: null,
hash: "",
transfer: void 0
});
var wc, pc, Kt, FV, ogg;
class Z9 {
constructor() {
tg(this, FV);
tg(this, wc, !1);
tg(this, pc, null);
tg(this, Kt, /* @__PURE__ */ new Map());
this.onSetModified = null, this.onResetModified = null, this.onAnnotationEditor = null;
}
getValue(I, g) {
const C = M(this, Kt).get(I);
return C === void 0 ? g : Object.assign(g, C);
}
getRawValue(I) {
return M(this, Kt).get(I);
}
remove(I) {
if (M(this, Kt).delete(I), M(this, Kt).size === 0 && this.resetModified(), typeof this.onAnnotationEditor == "function") {
for (const g of M(this, Kt).values())
if (g instanceof TC)
return;
this.onAnnotationEditor(null);
}
}
setValue(I, g) {
const C = M(this, Kt).get(I);
let i = !1;
if (C !== void 0)
for (const [e, A] of Object.entries(g))
C[e] !== A && (i = !0, C[e] = A);
else
i = !0, M(this, Kt).set(I, g);
i && ig(this, FV, ogg).call(this), g instanceof TC && typeof this.onAnnotationEditor == "function" && this.onAnnotationEditor(g.constructor._type);
}
has(I) {
return M(this, Kt).has(I);
}
getAll() {
return M(this, Kt).size > 0 ? c9(M(this, Kt)) : null;
}
setAll(I) {
for (const [g, C] of Object.entries(I))
this.setValue(g, C);
}
get size() {
return M(this, Kt).size;
}
resetModified() {
M(this, wc) && ($(this, wc, !1), typeof this.onResetModified == "function" && this.onResetModified());
}
get print() {
return new cgg(this);
}
get serializable() {
if (M(this, Kt).size === 0)
return oS;
const I = /* @__PURE__ */ new Map(), g = new agg(), C = [], i = /* @__PURE__ */ Object.create(null);
let e = !1;
for (const [A, s] of M(this, Kt)) {
const l = s instanceof TC ? s.serialize(!1, i) : s;
l && (I.set(A, l), g.update(`${A}:${JSON.stringify(l)}`), e || (e = !!l.bitmap));
}
if (e)
for (const A of I.values())
A.bitmap && C.push(A.bitmap);
return I.size > 0 ? {
map: I,
hash: g.hexdigest(),
transfer: C
} : oS;
}
get editorStats() {
let I = null;
const g = /* @__PURE__ */ new Map();
for (const C of M(this, Kt).values()) {
if (!(C instanceof TC))
continue;
const i = C.telemetryFinalData;
if (!i)
continue;
const {
type: e
} = i;
g.has(e) || g.set(e, Object.getPrototypeOf(C).constructor), I || (I = /* @__PURE__ */ Object.create(null));
const A = I[e] || (I[e] = /* @__PURE__ */ new Map());
for (const [s, l] of Object.entries(i)) {
if (s === "type")
continue;
let n = A.get(s);
n || (n = /* @__PURE__ */ new Map(), A.set(s, n));
const a = n.get(l) ?? 0;
n.set(l, a + 1);
}
}
for (const [C, i] of g)
I[C] = i.computeTelemetryFinalData(I[C]);
return I;
}
resetModifiedIds() {
$(this, pc, null);
}
get modifiedIds() {
if (M(this, pc))
return M(this, pc);
const I = [];
for (const g of M(this, Kt).values())
!(g instanceof TC) || !g.annotationElementId || !g.serialize() || I.push(g.annotationElementId);
return $(this, pc, {
ids: new Set(I),
hash: I.join(",")
});
}
}
wc = new WeakMap(), pc = new WeakMap(), Kt = new WeakMap(), FV = new WeakSet(), ogg = function() {
M(this, wc) || ($(this, wc, !0), typeof this.onSetModified == "function" && this.onSetModified());
};
var iZ;
class cgg extends Z9 {
constructor(g) {
super();
tg(this, iZ);
const {
map: C,
hash: i,
transfer: e
} = g.serializable, A = structuredClone(C, e ? {
transfer: e
} : null);
$(this, iZ, {
map: A,
hash: i,
transfer: e
});
}
get print() {
BC("Should not call PrintAnnotationStorage.print");
}
get serializable() {
return M(this, iZ);
}
get modifiedIds() {
return UI(this, "modifiedIds", {
ids: /* @__PURE__ */ new Set(),
hash: ""
});
}
}
iZ = new WeakMap();
var Xh;
class scg {
constructor({
ownerDocument: I = globalThis.document,
styleElement: g = null
}) {
tg(this, Xh, /* @__PURE__ */ new Set());
this._document = I, this.nativeFontFaces = /* @__PURE__ */ new Set(), this.styleElement = null, this.loadingRequests = [], this.loadTestFontId = 0;
}
addNativeFontFace(I) {
this.nativeFontFaces.add(I), this._document.fonts.add(I);
}
removeNativeFontFace(I) {
this.nativeFontFaces.delete(I), this._document.fonts.delete(I);
}
insertRule(I) {
this.styleElement || (this.styleElement = this._document.createElement("style"), this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement));
const g = this.styleElement.sheet;
g.insertRule(I, g.cssRules.length);
}
clear() {
for (const I of this.nativeFontFaces)
this._document.fonts.delete(I);
this.nativeFontFaces.clear(), M(this, Xh).clear(), this.styleElement && (this.styleElement.remove(), this.styleElement = null);
}
async loadSystemFont({
systemFontInfo: I,
disableFontFace: g,
_inspectFont: C
}) {
if (!(!I || M(this, Xh).has(I.loadedName))) {
if (ut(!g, "loadSystemFont shouldn't be called when `disableFontFace` is set."), this.isFontLoadingAPISupported) {
const {
loadedName: i,
src: e,
style: A
} = I, s = new FontFace(i, e, A);
this.addNativeFontFace(s);
try {
await s.load(), M(this, Xh).add(i), C == null || C(I);
} catch {
DI(`Cannot load system font: ${I.baseFontName}, installing it could help to improve PDF rendering.`), this.removeNativeFontFace(s);
}
return;
}
BC("Not implemented: loadSystemFont without the Font Loading API.");
}
}
async bind(I) {
if (I.attached || I.missingFile && !I.systemFontInfo)
return;
if (I.attached = !0, I.systemFontInfo) {
await this.loadSystemFont(I);
return;
}
if (this.isFontLoadingAPISupported) {
const C = I.createNativeFontFace();
if (C) {
this.addNativeFontFace(C);
try {
await C.loaded;
} catch (i) {
throw DI(`Failed to load font '${C.family}': '${i}'.`), I.disableFontFace = !0, i;
}
}
return;
}
const g = I.createFontFaceRule();
if (g) {
if (this.insertRule(g), this.isSyncFontLoadingSupported)
return;
await new Promise((C) => {
const i = this._queueLoadingCallback(C);
this._prepareFontLoadEvent(I, i);
});
}
}
get isFontLoadingAPISupported() {
var g;
const I = !!((g = this._document) != null && g.fonts);
return UI(this, "isFontLoadingAPISupported", I);
}
get isSyncFontLoadingSupported() {
return UI(this, "isSyncFontLoadingSupported", $t || Ai.platform.isFirefox);
}
_queueLoadingCallback(I) {
function g() {
for (ut(!i.done, "completeRequest() cannot be called twice."), i.done = !0; C.length > 0 && C[0].done; ) {
const e = C.shift();
setTimeout(e.callback, 0);
}
}
const {
loadingRequests: C
} = this, i = {
done: !1,
complete: g,
callback: I
};
return C.push(i), i;
}
get _loadTestFont() {
const I = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==");
return UI(this, "_loadTestFont", I);
}
_prepareFontLoadEvent(I, g) {
function C(p, Y) {
return p.charCodeAt(Y) << 24 | p.charCodeAt(Y + 1) << 16 | p.charCodeAt(Y + 2) << 8 | p.charCodeAt(Y + 3) & 255;
}
function i(p, Y, R, X) {
const H = p.substring(0, Y), S = p.substring(Y + R);
return H + X + S;
}
let e, A;
const s = this._document.createElement("canvas");
s.width = 1, s.height = 1;
const l = s.getContext("2d");
let n = 0;
function a(p, Y) {
if (++n > 30) {
DI("Load test font never loaded."), Y();
return;
}
if (l.font = "30px " + p, l.fillText(".", 0, 20), l.getImageData(0, 0, 1, 1).data[3] > 0) {
Y();
return;
}
setTimeout(a.bind(null, p, Y));
}
const d = `lt${Date.now()}${this.loadTestFontId++}`;
let o = this._loadTestFont;
o = i(o, 976, d.length, d);
const r = 16, h = 1482184792;
let b = C(o, r);
for (e = 0, A = d.length - 3; e < A; e += 4)
b = b - h + C(d, e) | 0;
e < d.length && (b = b - h + C(d + "XXX", e) | 0), o = i(o, r, 4, Qog(b));
const u = `url(data:font/opentype;base64,${btoa(o)});`, m = `@font-face {font-family:"${d}";src:${u}}`;
this.insertRule(m);
const Z = this._document.createElement("div");
Z.style.visibility = "hidden", Z.style.width = Z.style.height = "10px", Z.style.position = "absolute", Z.style.top = Z.style.left = "0px";
for (const p of [I.loadedName, d]) {
const Y = this._document.createElement("span");
Y.textContent = "Hi", Y.style.fontFamily = p, Z.append(Y);
}
this._document.body.append(Z), a(d, () => {
Z.remove(), g.complete();
});
}
}
Xh = new WeakMap();
class lcg {
constructor(I, g = null) {
this.compiledGlyphs = /* @__PURE__ */ Object.create(null);
for (const C in I)
this[C] = I[C];
this._inspectFont = g;
}
createNativeFontFace() {
var g;
if (!this.data || this.disableFontFace)
return null;
let I;
if (!this.cssFontInfo)
I = new FontFace(this.loadedName, this.data, {});
else {
const C = {
weight: this.cssFontInfo.fontWeight
};
this.cssFontInfo.italicAngle && (C.style = `oblique ${this.cssFontInfo.italicAngle}deg`), I = new FontFace(this.cssFontInfo.fontFamily, this.data, C);
}
return (g = this._inspectFont) == null || g.call(this, this), I;
}
createFontFaceRule() {
var C;
if (!this.data || this.disableFontFace)
return null;
const I = `url(data:${this.mimetype};base64,${X$(this.data)});`;
let g;
if (!this.cssFontInfo)
g = `@font-face {font-family:"${this.loadedName}";src:${I}}`;
else {
let i = `font-weight: ${this.cssFontInfo.fontWeight};`;
this.cssFontInfo.italicAngle && (i += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`), g = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${i}src:${I}}`;
}
return (C = this._inspectFont) == null || C.call(this, this, I), g;
}
getPathGenerator(I, g) {
if (this.compiledGlyphs[g] !== void 0)
return this.compiledGlyphs[g];
const C = this.loadedName + "_path_" + g;
let i;
try {
i = I.get(C);
} catch (A) {
DI(`getPathGenerator - ignoring character: "${A}".`);
}
const e = new Path2D(i || "");
return this.fontExtraProperties || I.delete(C), this.compiledGlyphs[g] = e;
}
}
const kY = {
DATA: 1,
ERROR: 2
}, ot = {
CANCEL: 1,
CANCEL_COMPLETE: 2,
CLOSE: 3,
ENQUEUE: 4,
ERROR: 5,
PULL: 6,
PULL_COMPLETE: 7,
START_COMPLETE: 8
};
function I8() {
}
function xi(t) {
if (t instanceof Ea || t instanceof QX || t instanceof _6 || t instanceof CV || t instanceof vH)
return t;
switch (t instanceof Error || typeof t == "object" && t !== null || BC('wrapReason: Expected "reason" to be a (possibly cloned) Error.'), t.name) {
case "AbortException":
return new Ea(t.message);
case "InvalidPDFException":
return new QX(t.message);
case "PasswordException":
return new _6(t.message, t.code);
case "ResponseException":
return new CV(t.message, t.status, t.missing);
case "UnknownErrorException":
return new vH(t.message, t.details);
}
return new vH(t.message, t.toString());
}
var Sh, iA, dgg, rgg, hgg, ZN;
class Qu {
constructor(I, g, C) {
tg(this, iA);
tg(this, Sh, new AbortController());
this.sourceName = I, this.targetName = g, this.comObj = C, this.callbackId = 1, this.streamId = 1, this.streamSinks = /* @__PURE__ */ Object.create(null), this.streamControllers = /* @__PURE__ */ Object.create(null), this.callbackCapabilities = /* @__PURE__ */ Object.create(null), this.actionHandler = /* @__PURE__ */ Object.create(null), C.addEventListener("message", ig(this, iA, dgg).bind(this), {
signal: M(this, Sh).signal
});
}
on(I, g) {
const C = this.actionHandler;
if (C[I])
throw new Error(`There is already an actionName called "${I}"`);
C[I] = g;
}
send(I, g, C) {
this.comObj.postMessage({
sourceName: this.sourceName,
targetName: this.targetName,
action: I,
data: g
}, C);
}
sendWithPromise(I, g, C) {
const i = this.callbackId++, e = Promise.withResolvers();
this.callbackCapabilities[i] = e;
try {
this.comObj.postMessage({
sourceName: this.sourceName,
targetName: this.targetName,
action: I,
callbackId: i,
data: g
}, C);
} catch (A) {
e.reject(A);
}
return e.promise;
}
sendWithStream(I, g, C, i) {
const e = this.streamId++, A = this.sourceName, s = this.targetName, l = this.comObj;
return new ReadableStream({
start: (n) => {
const a = Promise.withResolvers();
return this.streamControllers[e] = {
controller: n,
startCall: a,
pullCall: null,
cancelCall: null,
isClosed: !1
}, l.postMessage({
sourceName: A,
targetName: s,
action: I,
streamId: e,
data: g,
desiredSize: n.desiredSize
}, i), a.promise;
},
pull: (n) => {
const a = Promise.withResolvers();
return this.streamControllers[e].pullCall = a, l.postMessage({
sourceName: A,
targetName: s,
stream: ot.PULL,
streamId: e,
desiredSize: n.desiredSize
}), a.promise;
},
cancel: (n) => {
ut(n instanceof Error, "cancel must have a valid reason");
const a = Promise.withResolvers();
return this.streamControllers[e].cancelCall = a, this.streamControllers[e].isClosed = !0, l.postMessage({
sourceName: A,
targetName: s,
stream: ot.CANCEL,
streamId: e,
reason: xi(n)
}), a.promise;
}
}, C);
}
destroy() {
var I;
(I = M(this, Sh)) == null || I.abort(), $(this, Sh, null);
}
}
Sh = new WeakMap(), iA = new WeakSet(), dgg = function({
data: I
}) {
if (I.targetName !== this.sourceName)
return;
if (I.stream) {
ig(this, iA, hgg).call(this, I);
return;
}
if (I.callback) {
const C = I.callbackId, i = this.callbackCapabilities[C];
if (!i)
throw new Error(`Cannot resolve callback ${C}`);
if (delete this.callbackCapabilities[C], I.callback === kY.DATA)
i.resolve(I.data);
else if (I.callback === kY.ERROR)
i.reject(xi(I.reason));
else
throw new Error("Unexpected callback case");
return;
}
const g = this.actionHandler[I.action];
if (!g)
throw new Error(`Unknown action from worker: ${I.action}`);
if (I.callbackId) {
const C = this.sourceName, i = I.sourceName, e = this.comObj;
Promise.try(g, I.data).then(function(A) {
e.postMessage({
sourceName: C,
targetName: i,
callback: kY.DATA,
callbackId: I.callbackId,
data: A
});
}, function(A) {
e.postMessage({
sourceName: C,
targetName: i,
callback: kY.ERROR,
callbackId: I.callbackId,
reason: xi(A)
});
});
return;
}
if (I.streamId) {
ig(this, iA, rgg).call(this, I);
return;
}
g(I.data);
}, rgg = function(I) {
const g = I.streamId, C = this.sourceName, i = I.sourceName, e = this.comObj, A = this, s = this.actionHandler[I.action], l = {
enqueue(n, a = 1, d) {
if (this.isCancelled)
return;
const o = this.desiredSize;
this.desiredSize -= a, o > 0 && this.desiredSize <= 0 && (this.sinkCapability = Promise.withResolvers(), this.ready = this.sinkCapability.promise), e.postMessage({
sourceName: C,
targetName: i,
stream: ot.ENQUEUE,
streamId: g,
chunk: n
}, d);
},
close() {
this.isCancelled || (this.isCancelled = !0, e.postMessage({
sourceName: C,
targetName: i,
stream: ot.CLOSE,
streamId: g
}), delete A.streamSinks[g]);
},
error(n) {
ut(n instanceof Error, "error must have a valid reason"), !this.isCancelled && (this.isCancelled = !0, e.postMessage({
sourceName: C,
targetName: i,
stream: ot.ERROR,
streamId: g,
reason: xi(n)
}));
},
sinkCapability: Promise.withResolvers(),
onPull: null,
onCancel: null,
isCancelled: !1,
desiredSize: I.desiredSize,
ready: null
};
l.sinkCapability.resolve(), l.ready = l.sinkCapability.promise, this.streamSinks[g] = l, Promise.try(s, I.data, l).then(function() {
e.postMessage({
sourceName: C,
targetName: i,
stream: ot.START_COMPLETE,
streamId: g,
success: !0
});
}, function(n) {
e.postMessage({
sourceName: C,
targetName: i,
stream: ot.START_COMPLETE,
streamId: g,
reason: xi(n)
});
});
}, hgg = function(I) {
const g = I.streamId, C = this.sourceName, i = I.sourceName, e = this.comObj, A = this.streamControllers[g], s = this.streamSinks[g];
switch (I.stream) {
case ot.START_COMPLETE:
I.success ? A.startCall.resolve() : A.startCall.reject(xi(I.reason));
break;
case ot.PULL_COMPLETE:
I.success ? A.pullCall.resolve() : A.pullCall.reject(xi(I.reason));
break;
case ot.PULL:
if (!s) {
e.postMessage({
sourceName: C,
targetName: i,
stream: ot.PULL_COMPLETE,
streamId: g,
success: !0
});
break;
}
s.desiredSize <= 0 && I.desiredSize > 0 && s.sinkCapability.resolve(), s.desiredSize = I.desiredSize, Promise.try(s.onPull || I8).then(function() {
e.postMessage({
sourceName: C,
targetName: i,
stream: ot.PULL_COMPLETE,
streamId: g,
success: !0
});
}, function(n) {
e.postMessage({
sourceName: C,
targetName: i,
stream: ot.PULL_COMPLETE,
streamId: g,
reason: xi(n)
});
});
break;
case ot.ENQUEUE:
if (ut(A, "enqueue should have stream controller"), A.isClosed)
break;
A.controller.enqueue(I.chunk);
break;
case ot.CLOSE:
if (ut(A, "close should have stream controller"), A.isClosed)
break;
A.isClosed = !0, A.controller.close(), ig(this, iA, ZN).call(this, A, g);
break;
case ot.ERROR:
ut(A, "error should have stream controller"), A.controller.error(xi(I.reason)), ig(this, iA, ZN).call(this, A, g);
break;
case ot.CANCEL_COMPLETE:
I.success ? A.cancelCall.resolve() : A.cancelCall.reject(xi(I.reason)), ig(this, iA, ZN).call(this, A, g);
break;
case ot.CANCEL:
if (!s)
break;
const l = xi(I.reason);
Promise.try(s.onCancel || I8, l).then(function() {
e.postMessage({
sourceName: C,
targetName: i,
stream: ot.CANCEL_COMPLETE,
streamId: g,
success: !0
});
}, function(n) {
e.postMessage({
sourceName: C,
targetName: i,
stream: ot.CANCEL_COMPLETE,
streamId: g,
reason: xi(n)
});
}), s.sinkCapability.reject(l), s.isCancelled = !0, delete this.streamSinks[g];
break;
default:
throw new Error("Unexpected stream case");
}
}, ZN = async function(I, g) {
var C, i, e;
await Promise.allSettled([(C = I.startCall) == null ? void 0 : C.promise, (i = I.pullCall) == null ? void 0 : i.promise, (e = I.cancelCall) == null ? void 0 : e.promise]), delete this.streamControllers[g];
};
var eZ;
class bgg {
constructor({
enableHWA: I = !1
}) {
tg(this, eZ, !1);
$(this, eZ, I);
}
create(I, g) {
if (I <= 0 || g <= 0)
throw new Error("Invalid canvas size");
const C = this._createCanvas(I, g);
return {
canvas: C,
context: C.getContext("2d", {
willReadFrequently: !M(this, eZ)
})
};
}
reset(I, g, C) {
if (!I.canvas)
throw new Error("Canvas is not specified");
if (g <= 0 || C <= 0)
throw new Error("Invalid canvas size");
I.canvas.width = g, I.canvas.height = C;
}
destroy(I) {
if (!I.canvas)
throw new Error("Canvas is not specified");
I.canvas.width = 0, I.canvas.height = 0, I.canvas = null, I.context = null;
}
_createCanvas(I, g) {
BC("Abstract method `_createCanvas` called.");
}
}
eZ = new WeakMap();
class ncg extends bgg {
constructor({
ownerDocument: I = globalThis.document,
enableHWA: g = !1
}) {
super({
enableHWA: g
}), this._document = I;
}
_createCanvas(I, g) {
const C = this._document.createElement("canvas");
return C.width = I, C.height = g, C;
}
}
class ugg {
constructor({
baseUrl: I = null,
isCompressed: g = !0
}) {
this.baseUrl = I, this.isCompressed = g;
}
async fetch({
name: I
}) {
if (!this.baseUrl)
throw new Error("Ensure that the `cMapUrl` and `cMapPacked` API parameters are provided.");
if (!I)
throw new Error("CMap name must be specified.");
const g = this.baseUrl + I + (this.isCompressed ? ".bcmap" : "");
return this._fetch(g).then((C) => ({
cMapData: C,
isCompressed: this.isCompressed
})).catch((C) => {
throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${g}`);
});
}
async _fetch(I) {
BC("Abstract method `_fetch` called.");
}
}
class C8 extends ugg {
async _fetch(I) {
const g = await AG(I, this.isCompressed ? "arraybuffer" : "text");
return g instanceof ArrayBuffer ? new Uint8Array(g) : eG(g);
}
}
class mgg {
addFilter(I) {
return "none";
}
addHCMFilter(I, g) {
return "none";
}
addAlphaFilter(I) {
return "none";
}
addLuminosityFilter(I) {
return "none";
}
addHighlightHCMFilter(I, g, C, i, e) {
return "none";
}
destroy(I = !1) {
}
}
var Bc, Dh, Nl, Vl, mi, Wc, yc, qg, bi, Ou, Ur, GN, Er, Zgg, cS, Pr, Uu, Eu, dS, Pu;
class acg extends mgg {
constructor({
docId: g,
ownerDocument: C = globalThis.document
}) {
super();
tg(this, qg);
tg(this, Bc);
tg(this, Dh);
tg(this, Nl);
tg(this, Vl);
tg(this, mi);
tg(this, Wc);
tg(this, yc, 0);
$(this, Vl, g), $(this, mi, C);
}
addFilter(g) {
if (!g)
return "none";
let C = M(this, qg, bi).get(g);
if (C)
return C;
const [i, e, A] = ig(this, qg, GN).call(this, g), s = g.length === 1 ? i : `${i}${e}${A}`;
if (C = M(this, qg, bi).get(s), C)
return M(this, qg, bi).set(g, C), C;
const l = `g_${M(this, Vl)}_transfer_map_${Wi(this, yc)._++}`, n = ig(this, qg, Er).call(this, l);
M(this, qg, bi).set(g, n), M(this, qg, bi).set(s, n);
const a = ig(this, qg, Pr).call(this, l);
return ig(this, qg, Eu).call(this, i, e, A, a), n;
}
addHCMFilter(g, C) {
var r;
const i = `${g}-${C}`, e = "base";
let A = M(this, qg, Ou).get(e);
if ((A == null ? void 0 : A.key) === i || (A ? ((r = A.filter) == null || r.remove(), A.key = i, A.url = "none", A.filter = null) : (A = {
key: i,
url: "none",
filter: null
}, M(this, qg, Ou).set(e, A)), !g || !C))
return A.url;
const s = ig(this, qg, Pu).call(this, g);
g = AI.makeHexColor(...s);
const l = ig(this, qg, Pu).call(this, C);
if (C = AI.makeHexColor(...l), M(this, qg, Ur).style.color = "", g === "#000000" && C === "#ffffff" || g === C)
return A.url;
const n = new Array(256);
for (let h = 0; h <= 255; h++) {
const b = h / 255;
n[h] = b <= 0.03928 ? b / 12.92 : ((b + 0.055) / 1.055) ** 2.4;
}
const a = n.join(","), d = `g_${M(this, Vl)}_hcm_filter`, o = A.filter = ig(this, qg, Pr).call(this, d);
ig(this, qg, Eu).call(this, a, a, a, o), ig(this, qg, cS).call(this, o);
const c = (h, b) => {
const u = s[h] / 255, m = l[h] / 255, Z = new Array(b + 1);
for (let p = 0; p <= b; p++)
Z[p] = u + p / b * (m - u);
return Z.join(",");
};
return ig(this, qg, Eu).call(this, c(0, 5), c(1, 5), c(2, 5), o), A.url = ig(this, qg, Er).call(this, d), A.url;
}
addAlphaFilter(g) {
let C = M(this, qg, bi).get(g);
if (C)
return C;
const [i] = ig(this, qg, GN).call(this, [g]), e = `alpha_${i}`;
if (C = M(this, qg, bi).get(e), C)
return M(this, qg, bi).set(g, C), C;
const A = `g_${M(this, Vl)}_alpha_map_${Wi(this, yc)._++}`, s = ig(this, qg, Er).call(this, A);
M(this, qg, bi).set(g, s), M(this, qg, bi).set(e, s);
const l = ig(this, qg, Pr).call(this, A);
return ig(this, qg, dS).call(this, i, l), s;
}
addLuminosityFilter(g) {
let C = M(this, qg, bi).get(g || "luminosity");
if (C)
return C;
let i, e;
if (g ? ([i] = ig(this, qg, GN).call(this, [g]), e = `luminosity_${i}`) : e = "luminosity", C = M(this, qg, bi).get(e), C)
return M(this, qg, bi).set(g, C), C;
const A = `g_${M(this, Vl)}_luminosity_map_${Wi(this, yc)._++}`, s = ig(this, qg, Er).call(this, A);
M(this, qg, bi).set(g, s), M(this, qg, bi).set(e, s);
const l = ig(this, qg, Pr).call(this, A);
return ig(this, qg, Zgg).call(this, l), g && ig(this, qg, dS).call(this, i, l), s;
}
addHighlightHCMFilter(g, C, i, e, A) {
var m;
const s = `${C}-${i}-${e}-${A}`;
let l = M(this, qg, Ou).get(g);
if ((l == null ? void 0 : l.key) === s || (l ? ((m = l.filter) == null || m.remove(), l.key = s, l.url = "none", l.filter = null) : (l = {
key: s,
url: "none",
filter: null
}, M(this, qg, Ou).set(g, l)), !C || !i))
return l.url;
const [n, a] = [C, i].map(ig(this, qg, Pu).bind(this));
let d = Math.round(0.2126 * n[0] + 0.7152 * n[1] + 0.0722 * n[2]), o = Math.round(0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2]), [c, r] = [e, A].map(ig(this, qg, Pu).bind(this));
o < d && ([d, o, c, r] = [o, d, r, c]), M(this, qg, Ur).style.color = "";
const h = (Z, p, Y) => {
const R = new Array(256), X = (o - d) / Y, H = Z / 255, S = (p - Z) / (255 * Y);
let z = 0;
for (let v = 0; v <= Y; v++) {
const K = Math.round(d + v * X), V = H + v * S;
for (let N = z; N <= K; N++)
R[N] = V;
z = K + 1;
}
for (let v = z; v < 256; v++)
R[v] = R[z - 1];
return R.join(",");
}, b = `g_${M(this, Vl)}_hcm_${g}_filter`, u = l.filter = ig(this, qg, Pr).call(this, b);
return ig(this, qg, cS).call(this, u), ig(this, qg, Eu).call(this, h(c[0], r[0], 5), h(c[1], r[1], 5), h(c[2], r[2], 5), u), l.url = ig(this, qg, Er).call(this, b), l.url;
}
destroy(g = !1) {
var C, i, e, A;
g && ((C = M(this, Wc)) != null && C.size) || ((i = M(this, Nl)) == null || i.parentNode.parentNode.remove(), $(this, Nl, null), (e = M(this, Dh)) == null || e.clear(), $(this, Dh, null), (A = M(this, Wc)) == null || A.clear(), $(this, Wc, null), $(this, yc, 0));
}
}
Bc = new WeakMap(), Dh = new WeakMap(), Nl = new WeakMap(), Vl = new WeakMap(), mi = new WeakMap(), Wc = new WeakMap(), yc = new WeakMap(), qg = new WeakSet(), bi = function() {
return M(this, Dh) || $(this, Dh, /* @__PURE__ */ new Map());
}, Ou = function() {
return M(this, Wc) || $(this, Wc, /* @__PURE__ */ new Map());
}, Ur = function() {
if (!M(this, Nl)) {
const g = M(this, mi).createElement("div"), {
style: C
} = g;
C.visibility = "hidden", C.contain = "strict", C.width = C.height = 0, C.position = "absolute", C.top = C.left = 0, C.zIndex = -1;
const i = M(this, mi).createElementNS(dl, "svg");
i.setAttribute("width", 0), i.setAttribute("height", 0), $(this, Nl, M(this, mi).createElementNS(dl, "defs")), g.append(i), i.append(M(this, Nl)), M(this, mi).body.append(g);
}
return M(this, Nl);
}, GN = function(g) {
if (g.length === 1) {
const n = g[0], a = new Array(256);
for (let o = 0; o < 256; o++)
a[o] = n[o] / 255;
const d = a.join(",");
return [d, d, d];
}
const [C, i, e] = g, A = new Array(256), s = new Array(256), l = new Array(256);
for (let n = 0; n < 256; n++)
A[n] = C[n] / 255, s[n] = i[n] / 255, l[n] = e[n] / 255;
return [A.join(","), s.join(","), l.join(",")];
}, Er = function(g) {
if (M(this, Bc) === void 0) {
$(this, Bc, "");
const C = M(this, mi).URL;
C !== M(this, mi).baseURI && ($V(C) ? DI('#createUrl: ignore "data:"-URL for performance reasons.') : $(this, Bc, C.split("#", 1)[0]));
}
return `url(${M(this, Bc)}#${g})`;
}, Zgg = function(g) {
const C = M(this, mi).createElementNS(dl, "feColorMatrix");
C.setAttribute("type", "matrix"), C.setAttribute("values", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0"), g.append(C);
}, cS = function(g) {
const C = M(this, mi).createElementNS(dl, "feColorMatrix");
C.setAttribute("type", "matrix"), C.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"), g.append(C);
}, Pr = function(g) {
const C = M(this, mi).createElementNS(dl, "filter");
return C.setAttribute("color-interpolation-filters", "sRGB"), C.setAttribute("id", g), M(this, qg, Ur).append(C), C;
}, Uu = function(g, C, i) {
const e = M(this, mi).createElementNS(dl, C);
e.setAttribute("type", "discrete"), e.setAttribute("tableValues", i), g.append(e);
}, Eu = function(g, C, i, e) {
const A = M(this, mi).createElementNS(dl, "feComponentTransfer");
e.append(A), ig(this, qg, Uu).call(this, A, "feFuncR", g), ig(this, qg, Uu).call(this, A, "feFuncG", C), ig(this, qg, Uu).call(this, A, "feFuncB", i);
}, dS = function(g, C) {
const i = M(this, mi).createElementNS(dl, "feComponentTransfer");
C.append(i), ig(this, qg, Uu).call(this, i, "feFuncA", g);
}, Pu = function(g) {
return M(this, qg, Ur).style.color = g, u9(getComputedStyle(M(this, qg, Ur)).getPropertyValue("color"));
};
class Ggg {
constructor({
baseUrl: I = null
}) {
this.baseUrl = I;
}
async fetch({
filename: I
}) {
if (!this.baseUrl)
throw new Error("Ensure that the `standardFontDataUrl` API parameter is provided.");
if (!I)
throw new Error("Font filename must be specified.");
const g = `${this.baseUrl}${I}`;
return this._fetch(g).catch((C) => {
throw new Error(`Unable to load font data at: ${g}`);
});
}
async _fetch(I) {
BC("Abstract method `_fetch` called.");
}
}
class t8 extends Ggg {
async _fetch(I) {
const g = await AG(I, "arraybuffer");
return new Uint8Array(g);
}
}
class wgg {
constructor({
baseUrl: I = null
}) {
this.baseUrl = I;
}
async fetch({
filename: I
}) {
if (!this.baseUrl)
throw new Error("Ensure that the `wasmUrl` API parameter is provided.");
if (!I)
throw new Error("Wasm filename must be specified.");
const g = `${this.baseUrl}${I}`;
return this._fetch(g).catch((C) => {
throw new Error(`Unable to load wasm data at: ${g}`);
});
}
async _fetch(I) {
BC("Abstract method `_fetch` called.");
}
}
class i8 extends wgg {
async _fetch(I) {
const g = await AG(I, "arraybuffer");
return new Uint8Array(g);
}
}
$t && DI("Please use the `legacy` build in Node.js environments.");
async function G9(t) {
const g = await process.getBuiltinModule("fs").promises.readFile(t);
return new Uint8Array(g);
}
class ocg extends mgg {
}
class ccg extends bgg {
_createCanvas(I, g) {
return process.getBuiltinModule("module").createRequire(import.meta.url)("@napi-rs/canvas").createCanvas(I, g);
}
}
class dcg extends ugg {
async _fetch(I) {
return G9(I);
}
}
class rcg extends Ggg {
async _fetch(I) {
return G9(I);
}
}
class hcg extends wgg {
async _fetch(I) {
return G9(I);
}
}
const Ci = {
FILL: "Fill",
STROKE: "Stroke",
SHADING: "Shading"
};
function rS(t, I) {
if (!I)
return;
const g = I[2] - I[0], C = I[3] - I[1], i = new Path2D();
i.rect(I[0], I[1], g, C), t.clip(i);
}
class w9 {
isModifyingCurrentTransform() {
return !1;
}
getPattern() {
BC("Abstract method `getPattern` called.");
}
}
class bcg extends w9 {
constructor(I) {
super(), this._type = I[1], this._bbox = I[2], this._colorStops = I[3], this._p0 = I[4], this._p1 = I[5], this._r0 = I[6], this._r1 = I[7], this.matrix = null;
}
_createGradient(I) {
let g;
this._type === "axial" ? g = I.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]) : this._type === "radial" && (g = I.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1));
for (const C of this._colorStops)
g.addColorStop(C[0], C[1]);
return g;
}
getPattern(I, g, C, i) {
let e;
if (i === Ci.STROKE || i === Ci.FILL) {
const A = g.current.getClippedPathBoundingBox(i, zC(I)) || [0, 0, 0, 0], s = Math.ceil(A[2] - A[0]) || 1, l = Math.ceil(A[3] - A[1]) || 1, n = g.cachedCanvases.getCanvas("pattern", s, l), a = n.context;
a.clearRect(0, 0, a.canvas.width, a.canvas.height), a.beginPath(), a.rect(0, 0, a.canvas.width, a.canvas.height), a.translate(-A[0], -A[1]), C = AI.transform(C, [1, 0, 0, 1, A[0], A[1]]), a.transform(...g.baseTransform), this.matrix && a.transform(...this.matrix), rS(a, this._bbox), a.fillStyle = this._createGradient(a), a.fill(), e = I.createPattern(n.canvas, "no-repeat");
const d = new DOMMatrix(C);
e.setTransform(d);
} else
rS(I, this._bbox), e = this._createGradient(I);
return e;
}
}
function jH(t, I, g, C, i, e, A, s) {
const l = I.coords, n = I.colors, a = t.data, d = t.width * 4;
let o;
l[g + 1] > l[C + 1] && (o = g, g = C, C = o, o = e, e = A, A = o), l[C + 1] > l[i + 1] && (o = C, C = i, i = o, o = A, A = s, s = o), l[g + 1] > l[C + 1] && (o = g, g = C, C = o, o = e, e = A, A = o);
const c = (l[g] + I.offsetX) * I.scaleX, r = (l[g + 1] + I.offsetY) * I.scaleY, h = (l[C] + I.offsetX) * I.scaleX, b = (l[C + 1] + I.offsetY) * I.scaleY, u = (l[i] + I.offsetX) * I.scaleX, m = (l[i + 1] + I.offsetY) * I.scaleY;
if (r >= m)
return;
const Z = n[e], p = n[e + 1], Y = n[e + 2], R = n[A], X = n[A + 1], H = n[A + 2], S = n[s], z = n[s + 1], v = n[s + 2], K = Math.round(r), V = Math.round(m);
let N, B, G, w, W, y, f, D;
for (let F = K; F <= V; F++) {
if (F < b) {
const E = F < r ? 0 : (r - F) / (r - b);
N = c - (c - h) * E, B = Z - (Z - R) * E, G = p - (p - X) * E, w = Y - (Y - H) * E;
} else {
let E;
F > m ? E = 1 : b === m ? E = 0 : E = (b - F) / (b - m), N = h - (h - u) * E, B = R - (R - S) * E, G = X - (X - z) * E, w = H - (H - v) * E;
}
let T;
F < r ? T = 0 : F > m ? T = 1 : T = (r - F) / (r - m), W = c - (c - u) * T, y = Z - (Z - S) * T, f = p - (p - z) * T, D = Y - (Y - v) * T;
const Q = Math.round(Math.min(N, W)), P = Math.round(Math.max(N, W));
let L = d * F + Q * 4;
for (let E = Q; E <= P; E++)
T = (N - E) / (N - W), T < 0 ? T = 0 : T > 1 && (T = 1), a[L++] = B - (B - y) * T | 0, a[L++] = G - (G - f) * T | 0, a[L++] = w - (w - D) * T | 0, a[L++] = 255;
}
}
function ucg(t, I, g) {
const C = I.coords, i = I.colors;
let e, A;
switch (I.type) {
case "lattice":
const s = I.verticesPerRow, l = Math.floor(C.length / s) - 1, n = s - 1;
for (e = 0; e < l; e++) {
let a = e * s;
for (let d = 0; d < n; d++, a++)
jH(t, g, C[a], C[a + 1], C[a + s], i[a], i[a + 1], i[a + s]), jH(t, g, C[a + s + 1], C[a + 1], C[a + s], i[a + s + 1], i[a + 1], i[a + s]);
}
break;
case "triangles":
for (e = 0, A = C.length; e < A; e += 3)
jH(t, g, C[e], C[e + 1], C[e + 2], i[e], i[e + 1], i[e + 2]);
break;
default:
throw new Error("illegal figure");
}
}
class mcg extends w9 {
constructor(I) {
super(), this._coords = I[2], this._colors = I[3], this._figures = I[4], this._bounds = I[5], this._bbox = I[6], this._background = I[7], this.matrix = null;
}
_createMeshCanvas(I, g, C) {
const s = Math.floor(this._bounds[0]), l = Math.floor(this._bounds[1]), n = Math.ceil(this._bounds[2]) - s, a = Math.ceil(this._bounds[3]) - l, d = Math.min(Math.ceil(Math.abs(n * I[0] * 1.1)), 3e3), o = Math.min(Math.ceil(Math.abs(a * I[1] * 1.1)), 3e3), c = n / d, r = a / o, h = {
coords: this._coords,
colors: this._colors,
offsetX: -s,
offsetY: -l,
scaleX: 1 / c,
scaleY: 1 / r
}, b = d + 2 * 2, u = o + 2 * 2, m = C.getCanvas("mesh", b, u), Z = m.context, p = Z.createImageData(d, o);
if (g) {
const R = p.data;
for (let X = 0, H = R.length; X < H; X += 4)
R[X] = g[0], R[X + 1] = g[1], R[X + 2] = g[2], R[X + 3] = 255;
}
for (const R of this._figures)
ucg(p, R, h);
return Z.putImageData(p, 2, 2), {
canvas: m.canvas,
offsetX: s - 2 * c,
offsetY: l - 2 * r,
scaleX: c,
scaleY: r
};
}
isModifyingCurrentTransform() {
return !0;
}
getPattern(I, g, C, i) {
rS(I, this._bbox);
let e;
if (i === Ci.SHADING)
e = AI.singularValueDecompose2dScale(zC(I));
else if (e = AI.singularValueDecompose2dScale(g.baseTransform), this.matrix) {
const s = AI.singularValueDecompose2dScale(this.matrix);
e = [e[0] * s[0], e[1] * s[1]];
}
const A = this._createMeshCanvas(e, i === Ci.SHADING ? null : this._background, g.cachedCanvases);
return i !== Ci.SHADING && (I.setTransform(...g.baseTransform), this.matrix && I.transform(...this.matrix)), I.translate(A.offsetX, A.offsetY), I.scale(A.scaleX, A.scaleY), I.createPattern(A.canvas, "no-repeat");
}
}
class Zcg extends w9 {
getPattern() {
return "hotpink";
}
}
function Gcg(t) {
switch (t[0]) {
case "RadialAxial":
return new bcg(t);
case "Mesh":
return new mcg(t);
case "Dummy":
return new Zcg();
}
throw new Error(`Unknown IR type: ${t[0]}`);
}
const e8 = {
COLORED: 1,
UNCOLORED: 2
}, kV = class kV {
constructor(I, g, C, i) {
this.color = I[1], this.operatorList = I[2], this.matrix = I[3], this.bbox = I[4], this.xstep = I[5], this.ystep = I[6], this.paintType = I[7], this.tilingType = I[8], this.ctx = g, this.canvasGraphicsFactory = C, this.baseTransform = i;
}
createPatternCanvas(I) {
const {
bbox: g,
operatorList: C,
paintType: i,
tilingType: e,
color: A,
canvasGraphicsFactory: s
} = this;
let {
xstep: l,
ystep: n
} = this;
l = Math.abs(l), n = Math.abs(n), qV("TilingType: " + e);
const a = g[0], d = g[1], o = g[2], c = g[3], r = o - a, h = c - d, b = AI.singularValueDecompose2dScale(this.matrix), u = AI.singularValueDecompose2dScale(this.baseTransform), m = b[0] * u[0], Z = b[1] * u[1];
let p = r, Y = h, R = !1, X = !1;
const H = Math.ceil(l * m), S = Math.ceil(n * Z), z = Math.ceil(r * m), v = Math.ceil(h * Z);
H >= z ? p = l : R = !0, S >= v ? Y = n : X = !0;
const K = this.getSizeAndScale(p, this.ctx.canvas.width, m), V = this.getSizeAndScale(Y, this.ctx.canvas.height, Z), N = I.cachedCanvases.getCanvas("pattern", K.size, V.size), B = N.context, G = s.createCanvasGraphics(B);
if (G.groupLevel = I.groupLevel, this.setFillAndStrokeStyleToContext(G, i, A), B.translate(-K.scale * a, -V.scale * d), G.transform(K.scale, 0, 0, V.scale, 0, 0), B.save(), this.clipBbox(G, a, d, o, c), G.baseTransform = zC(G.ctx), G.executeOperatorList(C), G.endDrawing(), B.restore(), R || X) {
const w = N.canvas;
R && (p = l), X && (Y = n);
const W = this.getSizeAndScale(p, this.ctx.canvas.width, m), y = this.getSizeAndScale(Y, this.ctx.canvas.height, Z), f = W.size, D = y.size, F = I.cachedCanvases.getCanvas("pattern-workaround", f, D), T = F.context, Q = R ? Math.floor(r / l) : 0, P = X ? Math.floor(h / n) : 0;
for (let L = 0; L <= Q; L++)
for (let E = 0; E <= P; E++)
T.drawImage(w, f * L, D * E, f, D, 0, 0, f, D);
return {
canvas: F.canvas,
scaleX: W.scale,
scaleY: y.scale,
offsetX: a,
offsetY: d
};
}
return {
canvas: N.canvas,
scaleX: K.scale,
scaleY: V.scale,
offsetX: a,
offsetY: d
};
}
getSizeAndScale(I, g, C) {
const i = Math.max(kV.MAX_PATTERN_SIZE, g);
let e = Math.ceil(I * C);
return e >= i ? e = i : C = e / I, {
scale: C,
size: e
};
}
clipBbox(I, g, C, i, e) {
const A = i - g, s = e - C;
I.ctx.rect(g, C, A, s), I.current.updateRectMinMax(zC(I.ctx), [g, C, i, e]), I.clip(), I.endPath();
}
setFillAndStrokeStyleToContext(I, g, C) {
const i = I.ctx, e = I.current;
switch (g) {
case e8.COLORED:
const A = this.ctx;
i.fillStyle = A.fillStyle, i.strokeStyle = A.strokeStyle, e.fillColor = A.fillStyle, e.strokeColor = A.strokeStyle;
break;
case e8.UNCOLORED:
const s = AI.makeHexColor(C[0], C[1], C[2]);
i.fillStyle = s, i.strokeStyle = s, e.fillColor = s, e.strokeColor = s;
break;
default:
throw new jog(`Unsupported paint type: ${g}`);
}
}
isModifyingCurrentTransform() {
return !1;
}
getPattern(I, g, C, i) {
let e = C;
i !== Ci.SHADING && (e = AI.transform(e, g.baseTransform), this.matrix && (e = AI.transform(e, this.matrix)));
const A = this.createPatternCanvas(g);
let s = new DOMMatrix(e);
s = s.translate(A.offsetX, A.offsetY), s = s.scale(1 / A.scaleX, 1 / A.scaleY);
const l = I.createPattern(A.canvas, "repeat");
return l.setTransform(s), l;
}
};
iI(kV, "MAX_PATTERN_SIZE", 3e3);
let hS = kV;
function wcg({
src: t,
srcPos: I = 0,
dest: g,
width: C,
height: i,
nonBlackColor: e = 4294967295,
inverseDecode: A = !1
}) {
const s = Ai.isLittleEndian ? 4278190080 : 255, [l, n] = A ? [e, s] : [s, e], a = C >> 3, d = C & 7, o = t.length;
g = new Uint32Array(g.buffer);
let c = 0;
for (let r = 0; r < i; r++) {
for (const b = I + a; I < b; I++) {
const u = I < o ? t[I] : 255;
g[c++] = u & 128 ? n : l, g[c++] = u & 64 ? n : l, g[c++] = u & 32 ? n : l, g[c++] = u & 16 ? n : l, g[c++] = u & 8 ? n : l, g[c++] = u & 4 ? n : l, g[c++] = u & 2 ? n : l, g[c++] = u & 1 ? n : l;
}
if (d === 0)
continue;
const h = I < o ? t[I++] : 255;
for (let b = 0; b < d; b++)
g[c++] = h & 1 << 7 - b ? n : l;
}
return {
srcPos: I,
destPos: c
};
}
const A8 = 16, s8 = 100, pcg = 15, l8 = 10, n8 = 1e3, Ei = 16, QH = new DOMMatrix();
function Bcg(t, I) {
if (t._removeMirroring)
throw new Error("Context is already forwarding operations.");
t.__originalSave = t.save, t.__originalRestore = t.restore, t.__originalRotate = t.rotate, t.__originalScale = t.scale, t.__originalTranslate = t.translate, t.__originalTransform = t.transform, t.__originalSetTransform = t.setTransform, t.__originalResetTransform = t.resetTransform, t.__originalClip = t.clip, t.__originalMoveTo = t.moveTo, t.__originalLineTo = t.lineTo, t.__originalBezierCurveTo = t.bezierCurveTo, t.__originalRect = t.rect, t.__originalClosePath = t.closePath, t.__originalBeginPath = t.beginPath, t._removeMirroring = () => {
t.save = t.__originalSave, t.restore = t.__originalRestore, t.rotate = t.__originalRotate, t.scale = t.__originalScale, t.translate = t.__originalTranslate, t.transform = t.__originalTransform, t.setTransform = t.__originalSetTransform, t.resetTransform = t.__originalResetTransform, t.clip = t.__originalClip, t.moveTo = t.__originalMoveTo, t.lineTo = t.__originalLineTo, t.bezierCurveTo = t.__originalBezierCurveTo, t.rect = t.__originalRect, t.closePath = t.__originalClosePath, t.beginPath = t.__originalBeginPath, delete t._removeMirroring;
}, t.save = function() {
I.save(), this.__originalSave();
}, t.restore = function() {
I.restore(), this.__originalRestore();
}, t.translate = function(C, i) {
I.translate(C, i), this.__originalTranslate(C, i);
}, t.scale = function(C, i) {
I.scale(C, i), this.__originalScale(C, i);
}, t.transform = function(C, i, e, A, s, l) {
I.transform(C, i, e, A, s, l), this.__originalTransform(C, i, e, A, s, l);
}, t.setTransform = function(C, i, e, A, s, l) {
I.setTransform(C, i, e, A, s, l), this.__originalSetTransform(C, i, e, A, s, l);
}, t.resetTransform = function() {
I.resetTransform(), this.__originalResetTransform();
}, t.rotate = function(C) {
I.rotate(C), this.__originalRotate(C);
}, t.clip = function(C) {
I.clip(C), this.__originalClip(C);
}, t.moveTo = function(g, C) {
I.moveTo(g, C), this.__originalMoveTo(g, C);
}, t.lineTo = function(g, C) {
I.lineTo(g, C), this.__originalLineTo(g, C);
}, t.bezierCurveTo = function(g, C, i, e, A, s) {
I.bezierCurveTo(g, C, i, e, A, s), this.__originalBezierCurveTo(g, C, i, e, A, s);
}, t.rect = function(g, C, i, e) {
I.rect(g, C, i, e), this.__originalRect(g, C, i, e);
}, t.closePath = function() {
I.closePath(), this.__originalClosePath();
}, t.beginPath = function() {
I.beginPath(), this.__originalBeginPath();
};
}
class Wcg {
constructor(I) {
this.canvasFactory = I, this.cache = /* @__PURE__ */ Object.create(null);
}
getCanvas(I, g, C) {
let i;
return this.cache[I] !== void 0 ? (i = this.cache[I], this.canvasFactory.reset(i, g, C)) : (i = this.canvasFactory.create(g, C), this.cache[I] = i), i;
}
delete(I) {
delete this.cache[I];
}
clear() {
for (const I in this.cache) {
const g = this.cache[I];
this.canvasFactory.destroy(g), delete this.cache[I];
}
}
}
function zY(t, I, g, C, i, e, A, s, l, n) {
const [a, d, o, c, r, h] = zC(t);
if (d === 0 && o === 0) {
const m = A * a + r, Z = Math.round(m), p = s * c + h, Y = Math.round(p), R = (A + l) * a + r, X = Math.abs(Math.round(R) - Z) || 1, H = (s + n) * c + h, S = Math.abs(Math.round(H) - Y) || 1;
return t.setTransform(Math.sign(a), 0, 0, Math.sign(c), Z, Y), t.drawImage(I, g, C, i, e, 0, 0, X, S), t.setTransform(a, d, o, c, r, h), [X, S];
}
if (a === 0 && c === 0) {
const m = s * o + r, Z = Math.round(m), p = A * d + h, Y = Math.round(p), R = (s + n) * o + r, X = Math.abs(Math.round(R) - Z) || 1, H = (A + l) * d + h, S = Math.abs(Math.round(H) - Y) || 1;
return t.setTransform(0, Math.sign(d), Math.sign(o), 0, Z, Y), t.drawImage(I, g, C, i, e, 0, 0, S, X), t.setTransform(a, d, o, c, r, h), [S, X];
}
t.drawImage(I, g, C, i, e, A, s, l, n);
const b = Math.hypot(a, d), u = Math.hypot(o, c);
return [b * l, u * n];
}
function ycg(t) {
const {
width: I,
height: g
} = t;
if (I > n8 || g > n8)
return null;
const C = 1e3, i = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]), e = I + 1, A = new Uint8Array(e * (g + 1));
let s, l, n;
const a = I + 7 & -8, d = new Uint8Array(a * g);
let o = 0;
for (const R of t.data) {
let X = 128;
for (; X > 0; )
d[o++] = R & X ? 0 : 255, X >>= 1;
}
let c = 0;
for (o = 0, d[o] !== 0 && (A[0] = 1, ++c), l = 1; l < I; l++)
d[o] !== d[o + 1] && (A[l] = d[o] ? 2 : 1, ++c), o++;
for (d[o] !== 0 && (A[l] = 2, ++c), s = 1; s < g; s++) {
o = s * a, n = s * e, d[o - a] !== d[o] && (A[n] = d[o] ? 1 : 8, ++c);
let R = (d[o] ? 4 : 0) + (d[o - a] ? 8 : 0);
for (l = 1; l < I; l++)
R = (R >> 2) + (d[o + 1] ? 4 : 0) + (d[o - a + 1] ? 8 : 0), i[R] && (A[n + l] = i[R], ++c), o++;
if (d[o - a] !== d[o] && (A[n + l] = d[o] ? 2 : 4, ++c), c > C)
return null;
}
for (o = a * (g - 1), n = s * e, d[o] !== 0 && (A[n] = 8, ++c), l = 1; l < I; l++)
d[o] !== d[o + 1] && (A[n + l] = d[o] ? 4 : 8, ++c), o++;
if (d[o] !== 0 && (A[n + l] = 4, ++c), c > C)
return null;
const r = new Int32Array([0, e, -1, 0, -e, 0, 0, 0, 1]), h = new Path2D(), {
a: b,
b: u,
c: m,
d: Z,
e: p,
f: Y
} = new DOMMatrix().scaleSelf(1 / I, -1 / g).translateSelf(0, -g);
for (s = 0; c && s <= g; s++) {
let R = s * e;
const X = R + I;
for (; R < X && !A[R]; )
R++;
if (R === X)
continue;
let H = R % e, S = s;
h.moveTo(b * H + m * S + p, u * H + Z * S + Y);
const z = R;
let v = A[R];
do {
const K = r[v];
do
R += K;
while (!A[R]);
const V = A[R];
V !== 5 && V !== 10 ? (v = V, A[R] = 0) : (v = V & 51 * v >> 4, A[R] &= v >> 2 | v << 2), H = R % e, S = R / e | 0, h.lineTo(b * H + m * S + p, u * H + Z * S + Y), A[R] || --c;
} while (z !== R);
--s;
}
return h;
}
class a8 {
constructor(I, g) {
this.alphaIsShape = !1, this.fontSize = 0, this.fontSizeScale = 1, this.textMatrix = R$, this.textMatrixScale = 1, this.fontMatrix = jX, this.leading = 0, this.x = 0, this.y = 0, this.lineX = 0, this.lineY = 0, this.charSpacing = 0, this.wordSpacing = 0, this.textHScale = 1, this.textRenderingMode = hi.FILL, this.textRise = 0, this.fillColor = "#000000", this.strokeColor = "#000000", this.patternFill = !1, this.patternStroke = !1, this.fillAlpha = 1, this.strokeAlpha = 1, this.lineWidth = 1, this.activeSMask = null, this.transferMaps = "none", this.startNewPathAndClipBox([0, 0, I, g]);
}
clone() {
const I = Object.create(this);
return I.clipBox = this.clipBox.slice(), I;
}
updateRectMinMax(I, g) {
const C = AI.applyTransform(g, I), i = AI.applyTransform(g.slice(2), I), e = AI.applyTransform([g[0], g[3]], I), A = AI.applyTransform([g[2], g[1]], I);
this.minX = Math.min(this.minX, C[0], i[0], e[0], A[0]), this.minY = Math.min(this.minY, C[1], i[1], e[1], A[1]), this.maxX = Math.max(this.maxX, C[0], i[0], e[0], A[0]), this.maxY = Math.max(this.maxY, C[1], i[1], e[1], A[1]);
}
getPathBoundingBox(I = Ci.FILL, g = null) {
const C = [this.minX, this.minY, this.maxX, this.maxY];
if (I === Ci.STROKE) {
g || BC("Stroke bounding box must include transform.");
const i = AI.singularValueDecompose2dScale(g), e = i[0] * this.lineWidth / 2, A = i[1] * this.lineWidth / 2;
C[0] -= e, C[1] -= A, C[2] += e, C[3] += A;
}
return C;
}
updateClipFromPath() {
const I = AI.intersect(this.clipBox, this.getPathBoundingBox());
this.startNewPathAndClipBox(I || [0, 0, 0, 0]);
}
isEmptyClip() {
return this.minX === 1 / 0;
}
startNewPathAndClipBox(I) {
this.clipBox = I, this.minX = 1 / 0, this.minY = 1 / 0, this.maxX = 0, this.maxY = 0;
}
getClippedPathBoundingBox(I = Ci.FILL, g = null) {
return AI.intersect(this.clipBox, this.getPathBoundingBox(I, g));
}
}
function o8(t, I) {
if (I instanceof ImageData) {
t.putImageData(I, 0, 0);
return;
}
const g = I.height, C = I.width, i = g % Ei, e = (g - i) / Ei, A = i === 0 ? e : e + 1, s = t.createImageData(C, Ei);
let l = 0, n;
const a = I.data, d = s.data;
let o, c, r, h;
if (I.kind === aN.GRAYSCALE_1BPP) {
const b = a.byteLength, u = new Uint32Array(d.buffer, 0, d.byteLength >> 2), m = u.length, Z = C + 7 >> 3, p = 4294967295, Y = Ai.isLittleEndian ? 4278190080 : 255;
for (o = 0; o < A; o++) {
for (r = o < e ? Ei : i, n = 0, c = 0; c < r; c++) {
const R = b - l;
let X = 0;
const H = R > Z ? C : R * 8 - 7, S = H & -8;
let z = 0, v = 0;
for (; X < S; X += 8)
v = a[l++], u[n++] = v & 128 ? p : Y, u[n++] = v & 64 ? p : Y, u[n++] = v & 32 ? p : Y, u[n++] = v & 16 ? p : Y, u[n++] = v & 8 ? p : Y, u[n++] = v & 4 ? p : Y, u[n++] = v & 2 ? p : Y, u[n++] = v & 1 ? p : Y;
for (; X < H; X++)
z === 0 && (v = a[l++], z = 128), u[n++] = v & z ? p : Y, z >>= 1;
}
for (; n < m; )
u[n++] = 0;
t.putImageData(s, 0, o * Ei);
}
} else if (I.kind === aN.RGBA_32BPP) {
for (c = 0, h = C * Ei * 4, o = 0; o < e; o++)
d.set(a.subarray(l, l + h)), l += h, t.putImageData(s, 0, c), c += Ei;
o < A && (h = C * i * 4, d.set(a.subarray(l, l + h)), t.putImageData(s, 0, c));
} else if (I.kind === aN.RGB_24BPP)
for (r = Ei, h = C * r, o = 0; o < A; o++) {
for (o >= e && (r = i, h = C * r), n = 0, c = h; c--; )
d[n++] = a[l++], d[n++] = a[l++], d[n++] = a[l++], d[n++] = 255;
t.putImageData(s, 0, o * Ei);
}
else
throw new Error(`bad image kind: ${I.kind}`);
}
function c8(t, I) {
if (I.bitmap) {
t.drawImage(I.bitmap, 0, 0);
return;
}
const g = I.height, C = I.width, i = g % Ei, e = (g - i) / Ei, A = i === 0 ? e : e + 1, s = t.createImageData(C, Ei);
let l = 0;
const n = I.data, a = s.data;
for (let d = 0; d < A; d++) {
const o = d < e ? Ei : i;
({
srcPos: l
} = wcg({
src: n,
srcPos: l,
dest: a,
width: C,
height: o,
nonBlackColor: 0
})), t.putImageData(s, 0, d * Ei);
}
}
function Hu(t, I) {
const g = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"];
for (const C of g)
t[C] !== void 0 && (I[C] = t[C]);
t.setLineDash !== void 0 && (I.setLineDash(t.getLineDash()), I.lineDashOffset = t.lineDashOffset);
}
function JY(t) {
if (t.strokeStyle = t.fillStyle = "#000000", t.fillRule = "nonzero", t.globalAlpha = 1, t.lineWidth = 1, t.lineCap = "butt", t.lineJoin = "miter", t.miterLimit = 10, t.globalCompositeOperation = "source-over", t.font = "10px sans-serif", t.setLineDash !== void 0 && (t.setLineDash([]), t.lineDashOffset = 0), !$t) {
const {
filter: I
} = t;
I !== "none" && I !== "" && (t.filter = "none");
}
}
function d8(t, I) {
if (I)
return !0;
const g = AI.singularValueDecompose2dScale(t);
g[0] = Math.fround(g[0]), g[1] = Math.fround(g[1]);
const C = Math.fround(In.pixelRatio * Pa.PDF_TO_CSS_UNITS);
return g[0] <= C && g[1] <= C;
}
const Ycg = ["butt", "round", "square"], Ncg = ["miter", "round", "bevel"], Vcg = {}, r8 = {};
var JA, bS, uS, mS;
const i1 = class i1 {
constructor(I, g, C, i, e, {
optionalContentConfig: A,
markedContentStack: s = null
}, l, n) {
tg(this, JA);
this.ctx = I, this.current = new a8(this.ctx.canvas.width, this.ctx.canvas.height), this.stateStack = [], this.pendingClip = null, this.pendingEOFill = !1, this.res = null, this.xobjs = null, this.commonObjs = g, this.objs = C, this.canvasFactory = i, this.filterFactory = e, this.groupStack = [], this.processingType3 = null, this.baseTransform = null, this.baseTransformStack = [], this.groupLevel = 0, this.smaskStack = [], this.smaskCounter = 0, this.tempSMask = null, this.suspendedCtx = null, this.contentVisible = !0, this.markedContentStack = s || [], this.optionalContentConfig = A, this.cachedCanvases = new Wcg(this.canvasFactory), this.cachedPatterns = /* @__PURE__ */ new Map(), this.annotationCanvasMap = l, this.viewportScale = 1, this.outputScaleX = 1, this.outputScaleY = 1, this.pageColors = n, this._cachedScaleForStroking = [-1, 0], this._cachedGetSinglePixelWidth = null, this._cachedBitmapsMap = /* @__PURE__ */ new Map();
}
getObject(I, g = null) {
return typeof I == "string" ? I.startsWith("g_") ? this.commonObjs.get(I) : this.objs.get(I) : g;
}
beginDrawing({
transform: I,
viewport: g,
transparency: C = !1,
background: i = null
}) {
const e = this.ctx.canvas.width, A = this.ctx.canvas.height, s = this.ctx.fillStyle;
if (this.ctx.fillStyle = i || "#ffffff", this.ctx.fillRect(0, 0, e, A), this.ctx.fillStyle = s, C) {
const l = this.cachedCanvases.getCanvas("transparent", e, A);
this.compositeCtx = this.ctx, this.transparentCanvas = l.canvas, this.ctx = l.context, this.ctx.save(), this.ctx.transform(...zC(this.compositeCtx));
}
this.ctx.save(), JY(this.ctx), I && (this.ctx.transform(...I), this.outputScaleX = I[0], this.outputScaleY = I[0]), this.ctx.transform(...g.transform), this.viewportScale = g.scale, this.baseTransform = zC(this.ctx);
}
executeOperatorList(I, g, C, i) {
const e = I.argsArray, A = I.fnArray;
let s = g || 0;
const l = e.length;
if (l === s)
return s;
const n = l - s > l8 && typeof C == "function", a = n ? Date.now() + pcg : 0;
let d = 0;
const o = this.commonObjs, c = this.objs;
let r;
for (; ; ) {
if (i !== void 0 && s === i.nextBreakPoint)
return i.breakIt(s, C), s;
if (r = A[s], r !== IV.dependency)
this[r].apply(this, e[s]);
else
for (const h of e[s]) {
const b = h.startsWith("g_") ? o : c;
if (!b.has(h))
return b.get(h, C), s;
}
if (s++, s === l)
return s;
if (n && ++d > l8) {
if (Date.now() > a)
return C(), s;
d = 0;
}
}
}
endDrawing() {
ig(this, JA, bS).call(this), this.cachedCanvases.clear(), this.cachedPatterns.clear();
for (const I of this._cachedBitmapsMap.values()) {
for (const g of I.values())
typeof HTMLCanvasElement < "u" && g instanceof HTMLCanvasElement && (g.width = g.height = 0);
I.clear();
}
this._cachedBitmapsMap.clear(), ig(this, JA, uS).call(this);
}
_scaleImage(I, g) {
const C = I.width ?? I.displayWidth, i = I.height ?? I.displayHeight;
let e = Math.max(Math.hypot(g[0], g[1]), 1), A = Math.max(Math.hypot(g[2], g[3]), 1), s = C, l = i, n = "prescale1", a, d;
for (; e > 2 && s > 1 || A > 2 && l > 1; ) {
let o = s, c = l;
e > 2 && s > 1 && (o = s >= 16384 ? Math.floor(s / 2) - 1 || 1 : Math.ceil(s / 2), e /= s / o), A > 2 && l > 1 && (c = l >= 16384 ? Math.floor(l / 2) - 1 || 1 : Math.ceil(l) / 2, A /= l / c), a = this.cachedCanvases.getCanvas(n, o, c), d = a.context, d.clearRect(0, 0, o, c), d.drawImage(I, 0, 0, s, l, 0, 0, o, c), I = a.canvas, s = o, l = c, n = n === "prescale1" ? "prescale2" : "prescale1";
}
return {
img: I,
paintWidth: s,
paintHeight: l
};
}
_createMaskCanvas(I) {
const g = this.ctx, {
width: C,
height: i
} = I, e = this.current.fillColor, A = this.current.patternFill, s = zC(g);
let l, n, a, d;
if ((I.bitmap || I.data) && I.count > 1) {
const H = I.bitmap || I.data.buffer;
n = JSON.stringify(A ? s : [s.slice(0, 4), e]), l = this._cachedBitmapsMap.get(H), l || (l = /* @__PURE__ */ new Map(), this._cachedBitmapsMap.set(H, l));
const S = l.get(n);
if (S && !A) {
const z = Math.round(Math.min(s[0], s[2]) + s[4]), v = Math.round(Math.min(s[1], s[3]) + s[5]);
return {
canvas: S,
offsetX: z,
offsetY: v
};
}
a = S;
}
a || (d = this.cachedCanvases.getCanvas("maskCanvas", C, i), c8(d.context, I));
let o = AI.transform(s, [1 / C, 0, 0, -1 / i, 0, 0]);
o = AI.transform(o, [1, 0, 0, 1, 0, -i]);
const [c, r, h, b] = AI.getAxialAlignedBoundingBox([0, 0, C, i], o), u = Math.round(h - c) || 1, m = Math.round(b - r) || 1, Z = this.cachedCanvases.getCanvas("fillCanvas", u, m), p = Z.context, Y = c, R = r;
p.translate(-Y, -R), p.transform(...o), a || (a = this._scaleImage(d.canvas, ss(p)), a = a.img, l && A && l.set(n, a)), p.imageSmoothingEnabled = d8(zC(p), I.interpolate), zY(p, a, 0, 0, a.width, a.height, 0, 0, C, i), p.globalCompositeOperation = "source-in";
const X = AI.transform(ss(p), [1, 0, 0, 1, -Y, -R]);
return p.fillStyle = A ? e.getPattern(g, this, X, Ci.FILL) : e, p.fillRect(0, 0, C, i), l && !A && (this.cachedCanvases.delete("fillCanvas"), l.set(n, Z.canvas)), {
canvas: Z.canvas,
offsetX: Math.round(Y),
offsetY: Math.round(R)
};
}
setLineWidth(I) {
I !== this.current.lineWidth && (this._cachedScaleForStroking[0] = -1), this.current.lineWidth = I, this.ctx.lineWidth = I;
}
setLineCap(I) {
this.ctx.lineCap = Ycg[I];
}
setLineJoin(I) {
this.ctx.lineJoin = Ncg[I];
}
setMiterLimit(I) {
this.ctx.miterLimit = I;
}
setDash(I, g) {
const C = this.ctx;
C.setLineDash !== void 0 && (C.setLineDash(I), C.lineDashOffset = g);
}
setRenderingIntent(I) {
}
setFlatness(I) {
}
setGState(I) {
for (const [g, C] of I)
switch (g) {
case "LW":
this.setLineWidth(C);
break;
case "LC":
this.setLineCap(C);
break;
case "LJ":
this.setLineJoin(C);
break;
case "ML":
this.setMiterLimit(C);
break;
case "D":
this.setDash(C[0], C[1]);
break;
case "RI":
this.setRenderingIntent(C);
break;
case "FL":
this.setFlatness(C);
break;
case "Font":
this.setFont(C[0], C[1]);
break;
case "CA":
this.current.strokeAlpha = C;
break;
case "ca":
this.ctx.globalAlpha = this.current.fillAlpha = C;
break;
case "BM":
this.ctx.globalCompositeOperation = C;
break;
case "SMask":
this.current.activeSMask = C ? this.tempSMask : null, this.tempSMask = null, this.checkSMaskState();
break;
case "TR":
this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(C);
break;
}
}
get inSMaskMode() {
return !!this.suspendedCtx;
}
checkSMaskState() {
const I = this.inSMaskMode;
this.current.activeSMask && !I ? this.beginSMaskMode() : !this.current.activeSMask && I && this.endSMaskMode();
}
beginSMaskMode() {
if (this.inSMaskMode)
throw new Error("beginSMaskMode called while already in smask mode");
const I = this.ctx.canvas.width, g = this.ctx.canvas.height, C = "smaskGroupAt" + this.groupLevel, i = this.cachedCanvases.getCanvas(C, I, g);
this.suspendedCtx = this.ctx;
const e = this.ctx = i.context;
e.setTransform(this.suspendedCtx.getTransform()), Hu(this.suspendedCtx, e), Bcg(e, this.suspendedCtx), this.setGState([["BM", "source-over"]]);
}
endSMaskMode() {
if (!this.inSMaskMode)
throw new Error("endSMaskMode called while not in smask mode");
this.ctx._removeMirroring(), Hu(this.ctx, this.suspendedCtx), this.ctx = this.suspendedCtx, this.suspendedCtx = null;
}
compose(I) {
if (!this.current.activeSMask)
return;
I ? (I[0] = Math.floor(I[0]), I[1] = Math.floor(I[1]), I[2] = Math.ceil(I[2]), I[3] = Math.ceil(I[3])) : I = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];
const g = this.current.activeSMask, C = this.suspendedCtx;
this.composeSMask(C, g, this.ctx, I), this.ctx.save(), this.ctx.setTransform(1, 0, 0, 1, 0, 0), this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height), this.ctx.restore();
}
composeSMask(I, g, C, i) {
const e = i[0], A = i[1], s = i[2] - e, l = i[3] - A;
s === 0 || l === 0 || (this.genericComposeSMask(g.context, C, s, l, g.subtype, g.backdrop, g.transferMap, e, A, g.offsetX, g.offsetY), I.save(), I.globalAlpha = 1, I.globalCompositeOperation = "source-over", I.setTransform(1, 0, 0, 1, 0, 0), I.drawImage(C.canvas, 0, 0), I.restore());
}
genericComposeSMask(I, g, C, i, e, A, s, l, n, a, d) {
let o = I.canvas, c = l - a, r = n - d;
if (A) {
const b = AI.makeHexColor(...A);
if (c < 0 || r < 0 || c + C > o.width || r + i > o.height) {
const u = this.cachedCanvases.getCanvas("maskExtension", C, i), m = u.context;
m.drawImage(o, -c, -r), m.globalCompositeOperation = "destination-atop", m.fillStyle = b, m.fillRect(0, 0, C, i), m.globalCompositeOperation = "source-over", o = u.canvas, c = r = 0;
} else {
I.save(), I.globalAlpha = 1, I.setTransform(1, 0, 0, 1, 0, 0);
const u = new Path2D();
u.rect(c, r, C, i), I.clip(u), I.globalCompositeOperation = "destination-atop", I.fillStyle = b, I.fillRect(c, r, C, i), I.restore();
}
}
g.save(), g.globalAlpha = 1, g.setTransform(1, 0, 0, 1, 0, 0), e === "Alpha" && s ? g.filter = this.filterFactory.addAlphaFilter(s) : e === "Luminosity" && (g.filter = this.filterFactory.addLuminosityFilter(s));
const h = new Path2D();
h.rect(l, n, C, i), g.clip(h), g.globalCompositeOperation = "destination-in", g.drawImage(o, c, r, C, i, l, n, C, i), g.restore();
}
save() {
this.inSMaskMode && Hu(this.ctx, this.suspendedCtx), this.ctx.save();
const I = this.current;
this.stateStack.push(I), this.current = I.clone();
}
restore() {
if (this.stateStack.length === 0) {
this.inSMaskMode && this.endSMaskMode();
return;
}
this.current = this.stateStack.pop(), this.ctx.restore(), this.inSMaskMode && Hu(this.suspendedCtx, this.ctx), this.checkSMaskState(), this.pendingClip = null, this._cachedScaleForStroking[0] = -1, this._cachedGetSinglePixelWidth = null;
}
transform(I, g, C, i, e, A) {
this.ctx.transform(I, g, C, i, e, A), this._cachedScaleForStroking[0] = -1, this._cachedGetSinglePixelWidth = null;
}
constructPath(I, g, C) {
let [i] = g;
if (!C) {
i || (i = g[0] = new Path2D()), this[I](i);
return;
}
if (!(i instanceof Path2D)) {
const e = g[0] = new Path2D();
for (let A = 0, s = i.length; A < s; )
switch (i[A++]) {
case FY.moveTo:
e.moveTo(i[A++], i[A++]);
break;
case FY.lineTo:
e.lineTo(i[A++], i[A++]);
break;
case FY.curveTo:
e.bezierCurveTo(i[A++], i[A++], i[A++], i[A++], i[A++], i[A++]);
break;
case FY.closePath:
e.closePath();
break;
default:
DI(`Unrecognized drawing path operator: ${i[A - 1]}`);
break;
}
i = e;
}
this.current.updateRectMinMax(zC(this.ctx), C), this[I](i);
}
closePath() {
this.ctx.closePath();
}
stroke(I, g = !0) {
const C = this.ctx, i = this.current.strokeColor;
if (C.globalAlpha = this.current.strokeAlpha, this.contentVisible)
if (typeof i == "object" && (i != null && i.getPattern)) {
const e = i.isModifyingCurrentTransform() ? C.getTransform() : null;
if (C.save(), C.strokeStyle = i.getPattern(C, this, ss(C), Ci.STROKE), e) {
const A = new Path2D();
A.addPath(I, C.getTransform().invertSelf().multiplySelf(e)), I = A;
}
this.rescaleAndStroke(I, !1), C.restore();
} else
this.rescaleAndStroke(I, !0);
g && this.consumePath(I, this.current.getClippedPathBoundingBox(Ci.STROKE, zC(this.ctx))), C.globalAlpha = this.current.fillAlpha;
}
closeStroke(I) {
this.stroke(I);
}
fill(I, g = !0) {
const C = this.ctx, i = this.current.fillColor, e = this.current.patternFill;
let A = !1;
if (e) {
const l = i.isModifyingCurrentTransform() ? C.getTransform() : null;
if (C.save(), C.fillStyle = i.getPattern(C, this, ss(C), Ci.FILL), l) {
const n = new Path2D();
n.addPath(I, C.getTransform().invertSelf().multiplySelf(l)), I = n;
}
A = !0;
}
const s = this.current.getClippedPathBoundingBox();
this.contentVisible && s !== null && (this.pendingEOFill ? (C.fill(I, "evenodd"), this.pendingEOFill = !1) : C.fill(I)), A && C.restore(), g && this.consumePath(I, s);
}
eoFill(I) {
this.pendingEOFill = !0, this.fill(I);
}
fillStroke(I) {
this.fill(I, !1), this.stroke(I, !1), this.consumePath(I);
}
eoFillStroke(I) {
this.pendingEOFill = !0, this.fillStroke(I);
}
closeFillStroke(I) {
this.fillStroke(I);
}
closeEOFillStroke(I) {
this.pendingEOFill = !0, this.fillStroke(I);
}
endPath(I) {
this.consumePath(I);
}
clip() {
this.pendingClip = Vcg;
}
eoClip() {
this.pendingClip = r8;
}
beginText() {
this.current.textMatrix = R$, this.current.textMatrixScale = 1, this.current.x = this.current.lineX = 0, this.current.y = this.current.lineY = 0;
}
endText() {
const I = this.pendingTextPaths, g = this.ctx;
if (I === void 0) {
g.beginPath();
return;
}
const C = new Path2D(), i = g.getTransform().invertSelf();
for (const {
transform: e,
x: A,
y: s,
fontSize: l,
path: n
} of I)
C.addPath(n, new DOMMatrix(e).preMultiplySelf(i).translate(A, s).scale(l, -l));
g.clip(C), g.beginPath(), delete this.pendingTextPaths;
}
setCharSpacing(I) {
this.current.charSpacing = I;
}
setWordSpacing(I) {
this.current.wordSpacing = I;
}
setHScale(I) {
this.current.textHScale = I / 100;
}
setLeading(I) {
this.current.leading = -I;
}
setFont(I, g) {
var a;
const C = this.commonObjs.get(I), i = this.current;
if (!C)
throw new Error(`Can't find font for ${I}`);
if (i.fontMatrix = C.fontMatrix || jX, (i.fontMatrix[0] === 0 || i.fontMatrix[3] === 0) && DI("Invalid font matrix for font " + I), g < 0 ? (g = -g, i.fontDirection = -1) : i.fontDirection = 1, this.current.font = C, this.current.fontSize = g, C.isType3Font)
return;
const e = C.loadedName || "sans-serif", A = ((a = C.systemFontInfo) == null ? void 0 : a.css) || `"${e}", ${C.fallbackName}`;
let s = "normal";
C.black ? s = "900" : C.bold && (s = "bold");
const l = C.italic ? "italic" : "normal";
let n = g;
g < A8 ? n = A8 : g > s8 && (n = s8), this.current.fontSizeScale = g / n, this.ctx.font = `${l} ${s} ${n}px ${A}`;
}
setTextRenderingMode(I) {
this.current.textRenderingMode = I;
}
setTextRise(I) {
this.current.textRise = I;
}
moveText(I, g) {
this.current.x = this.current.lineX += I, this.current.y = this.current.lineY += g;
}
setLeadingMoveText(I, g) {
this.setLeading(-g), this.moveText(I, g);
}
setTextMatrix(I, g, C, i, e, A) {
this.current.textMatrix = [I, g, C, i, e, A], this.current.textMatrixScale = Math.hypot(I, g), this.current.x = this.current.lineX = 0, this.current.y = this.current.lineY = 0;
}
nextLine() {
this.moveText(0, this.current.leading);
}
paintChar(I, g, C, i, e) {
const A = this.ctx, s = this.current, l = s.font, n = s.textRenderingMode, a = s.fontSize / s.fontSizeScale, d = n & hi.FILL_STROKE_MASK, o = !!(n & hi.ADD_TO_PATH_FLAG), c = s.patternFill && !l.missingFile, r = s.patternStroke && !l.missingFile;
let h;
if ((l.disableFontFace || o || c || r) && (h = l.getPathGenerator(this.commonObjs, I)), l.disableFontFace || c || r) {
A.save(), A.translate(g, C), A.scale(a, -a);
let b;
if ((d === hi.FILL || d === hi.FILL_STROKE) && (i ? (b = A.getTransform(), A.setTransform(...i), A.fill(ig(this, JA, mS).call(this, h, b, i))) : A.fill(h)), d === hi.STROKE || d === hi.FILL_STROKE)
if (e) {
b || (b = A.getTransform()), A.setTransform(...e);
const {
a: u,
b: m,
c: Z,
d: p
} = b, Y = AI.inverseTransform(e), R = AI.transform([u, m, Z, p, 0, 0], Y), [X, H] = AI.singularValueDecompose2dScale(R);
A.lineWidth *= Math.max(X, H) / a, A.stroke(ig(this, JA, mS).call(this, h, b, e));
} else
A.lineWidth /= a, A.stroke(h);
A.restore();
} else
(d === hi.FILL || d === hi.FILL_STROKE) && A.fillText(I, g, C), (d === hi.STROKE || d === hi.FILL_STROKE) && A.strokeText(I, g, C);
o && (this.pendingTextPaths || (this.pendingTextPaths = [])).push({
transform: zC(A),
x: g,
y: C,
fontSize: a,
path: h
});
}
get isFontSubpixelAAEnabled() {
const {
context: I
} = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10);
I.scale(1.5, 1), I.fillText("I", 0, 10);
const g = I.getImageData(0, 0, 10, 10).data;
let C = !1;
for (let i = 3; i < g.length; i += 4)
if (g[i] > 0 && g[i] < 255) {
C = !0;
break;
}
return UI(this, "isFontSubpixelAAEnabled", C);
}
showText(I) {
const g = this.current, C = g.font;
if (C.isType3Font)
return this.showType3Text(I);
const i = g.fontSize;
if (i === 0)
return;
const e = this.ctx, A = g.fontSizeScale, s = g.charSpacing, l = g.wordSpacing, n = g.fontDirection, a = g.textHScale * n, d = I.length, o = C.vertical, c = o ? 1 : -1, r = C.defaultVMetrics, h = i * g.fontMatrix[0], b = g.textRenderingMode === hi.FILL && !C.disableFontFace && !g.patternFill;
e.save(), e.transform(...g.textMatrix), e.translate(g.x, g.y + g.textRise), n > 0 ? e.scale(a, -1) : e.scale(a, 1);
let u, m;
if (g.patternFill) {
e.save();
const X = g.fillColor.getPattern(e, this, ss(e), Ci.FILL);
u = zC(e), e.restore(), e.fillStyle = X;
}
if (g.patternStroke) {
e.save();
const X = g.strokeColor.getPattern(e, this, ss(e), Ci.STROKE);
m = zC(e), e.restore(), e.strokeStyle = X;
}
let Z = g.lineWidth;
const p = g.textMatrixScale;
if (p === 0 || Z === 0) {
const X = g.textRenderingMode & hi.FILL_STROKE_MASK;
(X === hi.STROKE || X === hi.FILL_STROKE) && (Z = this.getSinglePixelWidth());
} else
Z /= p;
if (A !== 1 && (e.scale(A, A), Z /= A), e.lineWidth = Z, C.isInvalidPDFjsFont) {
const X = [];
let H = 0;
for (const S of I)
X.push(S.unicode), H += S.width;
e.fillText(X.join(""), 0, 0), g.x += H * h * a, e.restore(), this.compose();
return;
}
let Y = 0, R;
for (R = 0; R < d; ++R) {
const X = I[R];
if (typeof X == "number") {
Y += c * X * i / 1e3;
continue;
}
let H = !1;
const S = (X.isSpace ? l : 0) + s, z = X.fontChar, v = X.accent;
let K, V, N = X.width;
if (o) {
const G = X.vmetric || r, w = -(X.vmetric ? G[1] : N * 0.5) * h, W = G[2] * h;
N = G ? -G[0] : N, K = w / A, V = (Y + W) / A;
} else
K = Y / A, V = 0;
if (C.remeasure && N > 0) {
const G = e.measureText(z).width * 1e3 / i * A;
if (N < G && this.isFontSubpixelAAEnabled) {
const w = N / G;
H = !0, e.save(), e.scale(w, 1), K /= w;
} else N !== G && (K += (N - G) / 2e3 * i / A);
}
if (this.contentVisible && (X.isInFont || C.missingFile)) {
if (b && !v)
e.fillText(z, K, V);
else if (this.paintChar(z, K, V, u, m), v) {
const G = K + i * v.offset.x / A, w = V - i * v.offset.y / A;
this.paintChar(v.fontChar, G, w, u, m);
}
}
const B = o ? N * h - S * n : N * h + S * n;
Y += B, H && e.restore();
}
o ? g.y -= Y : g.x += Y * a, e.restore(), this.compose();
}
showType3Text(I) {
const g = this.ctx, C = this.current, i = C.font, e = C.fontSize, A = C.fontDirection, s = i.vertical ? 1 : -1, l = C.charSpacing, n = C.wordSpacing, a = C.textHScale * A, d = C.fontMatrix || jX, o = I.length, c = C.textRenderingMode === hi.INVISIBLE;
let r, h, b, u;
if (!(c || e === 0)) {
for (this._cachedScaleForStroking[0] = -1, this._cachedGetSinglePixelWidth = null, g.save(), g.transform(...C.textMatrix), g.translate(C.x, C.y + C.textRise), g.scale(a, A), r = 0; r < o; ++r) {
if (h = I[r], typeof h == "number") {
u = s * h * e / 1e3, this.ctx.translate(u, 0), C.x += u * a;
continue;
}
const m = (h.isSpace ? n : 0) + l, Z = i.charProcOperatorList[h.operatorListId];
Z ? this.contentVisible && (this.processingType3 = h, this.save(), g.scale(e, e), g.transform(...d), this.executeOperatorList(Z), this.restore()) : DI(`Type3 character "${h.operatorListId}" is not available.`), b = AI.applyTransform([h.width, 0], d)[0] * e + m, g.translate(b, 0), C.x += b * a;
}
g.restore(), this.processingType3 = null;
}
}
setCharWidth(I, g) {
}
setCharWidthAndBounds(I, g, C, i, e, A) {
this.ctx.rect(C, i, e - C, A - i), this.ctx.clip(), this.endPath();
}
getColorN_Pattern(I) {
let g;
if (I[0] === "TilingPattern") {
const C = this.baseTransform || zC(this.ctx), i = {
createCanvasGraphics: (e) => new i1(e, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {
optionalContentConfig: this.optionalContentConfig,
markedContentStack: this.markedContentStack
})
};
g = new hS(I, this.ctx, i, C);
} else
g = this._getPattern(I[1], I[2]);
return g;
}
setStrokeColorN() {
this.current.strokeColor = this.getColorN_Pattern(arguments), this.current.patternStroke = !0;
}
setFillColorN() {
this.current.fillColor = this.getColorN_Pattern(arguments), this.current.patternFill = !0;
}
setStrokeRGBColor(I, g, C) {
this.ctx.strokeStyle = this.current.strokeColor = AI.makeHexColor(I, g, C), this.current.patternStroke = !1;
}
setStrokeTransparent() {
this.ctx.strokeStyle = this.current.strokeColor = "transparent", this.current.patternStroke = !1;
}
setFillRGBColor(I, g, C) {
this.ctx.fillStyle = this.current.fillColor = AI.makeHexColor(I, g, C), this.current.patternFill = !1;
}
setFillTransparent() {
this.ctx.fillStyle = this.current.fillColor = "transparent", this.current.patternFill = !1;
}
_getPattern(I, g = null) {
let C;
return this.cachedPatterns.has(I) ? C = this.cachedPatterns.get(I) : (C = Gcg(this.getObject(I)), this.cachedPatterns.set(I, C)), g && (C.matrix = g), C;
}
shadingFill(I) {
if (!this.contentVisible)
return;
const g = this.ctx;
this.save();
const C = this._getPattern(I);
g.fillStyle = C.getPattern(g, this, ss(g), Ci.SHADING);
const i = ss(g);
if (i) {
const {
width: e,
height: A
} = g.canvas, [s, l, n, a] = AI.getAxialAlignedBoundingBox([0, 0, e, A], i);
this.ctx.fillRect(s, l, n - s, a - l);
} else
this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
this.compose(this.current.getClippedPathBoundingBox()), this.restore();
}
beginInlineImage() {
BC("Should not call beginInlineImage");
}
beginImageData() {
BC("Should not call beginImageData");
}
paintFormXObjectBegin(I, g) {
if (this.contentVisible && (this.save(), this.baseTransformStack.push(this.baseTransform), I && this.transform(...I), this.baseTransform = zC(this.ctx), g)) {
const C = g[2] - g[0], i = g[3] - g[1];
this.ctx.rect(g[0], g[1], C, i), this.current.updateRectMinMax(zC(this.ctx), g), this.clip(), this.endPath();
}
}
paintFormXObjectEnd() {
this.contentVisible && (this.restore(), this.baseTransform = this.baseTransformStack.pop());
}
beginGroup(I) {
if (!this.contentVisible)
return;
this.save(), this.inSMaskMode && (this.endSMaskMode(), this.current.activeSMask = null);
const g = this.ctx;
I.isolated || qV("TODO: Support non-isolated groups."), I.knockout && DI("Knockout groups not supported.");
const C = zC(g);
if (I.matrix && g.transform(...I.matrix), !I.bbox)
throw new Error("Bounding box is required.");
let i = AI.getAxialAlignedBoundingBox(I.bbox, zC(g));
const e = [0, 0, g.canvas.width, g.canvas.height];
i = AI.intersect(i, e) || [0, 0, 0, 0];
const A = Math.floor(i[0]), s = Math.floor(i[1]), l = Math.max(Math.ceil(i[2]) - A, 1), n = Math.max(Math.ceil(i[3]) - s, 1);
this.current.startNewPathAndClipBox([0, 0, l, n]);
let a = "groupAt" + this.groupLevel;
I.smask && (a += "_smask_" + this.smaskCounter++ % 2);
const d = this.cachedCanvases.getCanvas(a, l, n), o = d.context;
o.translate(-A, -s), o.transform(...C);
let c = new Path2D();
const [r, h, b, u] = I.bbox;
if (c.rect(r, h, b - r, u - h), I.matrix) {
const m = new Path2D();
m.addPath(c, new DOMMatrix(I.matrix)), c = m;
}
o.clip(c), I.smask ? this.smaskStack.push({
canvas: d.canvas,
context: o,
offsetX: A,
offsetY: s,
subtype: I.smask.subtype,
backdrop: I.smask.backdrop,
transferMap: I.smask.transferMap || null,
startTransformInverse: null
}) : (g.setTransform(1, 0, 0, 1, 0, 0), g.translate(A, s), g.save()), Hu(g, o), this.ctx = o, this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]), this.groupStack.push(g), this.groupLevel++;
}
endGroup(I) {
if (!this.contentVisible)
return;
this.groupLevel--;
const g = this.ctx, C = this.groupStack.pop();
if (this.ctx = C, this.ctx.imageSmoothingEnabled = !1, I.smask)
this.tempSMask = this.smaskStack.pop(), this.restore();
else {
this.ctx.restore();
const i = zC(this.ctx);
this.restore(), this.ctx.save(), this.ctx.setTransform(...i);
const e = AI.getAxialAlignedBoundingBox([0, 0, g.canvas.width, g.canvas.height], i);
this.ctx.drawImage(g.canvas, 0, 0), this.ctx.restore(), this.compose(e);
}
}
beginAnnotation(I, g, C, i, e) {
if (ig(this, JA, bS).call(this), JY(this.ctx), this.ctx.save(), this.save(), this.baseTransform && this.ctx.setTransform(...this.baseTransform), g) {
const A = g[2] - g[0], s = g[3] - g[1];
if (e && this.annotationCanvasMap) {
C = C.slice(), C[4] -= g[0], C[5] -= g[1], g = g.slice(), g[0] = g[1] = 0, g[2] = A, g[3] = s;
const [l, n] = AI.singularValueDecompose2dScale(zC(this.ctx)), {
viewportScale: a
} = this, d = Math.ceil(A * this.outputScaleX * a), o = Math.ceil(s * this.outputScaleY * a);
this.annotationCanvas = this.canvasFactory.create(d, o);
const {
canvas: c,
context: r
} = this.annotationCanvas;
this.annotationCanvasMap.set(I, c), this.annotationCanvas.savedCtx = this.ctx, this.ctx = r, this.ctx.save(), this.ctx.setTransform(l, 0, 0, -n, 0, s * n), JY(this.ctx);
} else
JY(this.ctx), this.endPath(), this.ctx.rect(g[0], g[1], A, s), this.ctx.clip(), this.ctx.beginPath();
}
this.current = new a8(this.ctx.canvas.width, this.ctx.canvas.height), this.transform(...C), this.transform(...i);
}
endAnnotation() {
this.annotationCanvas && (this.ctx.restore(), ig(this, JA, uS).call(this), this.ctx = this.annotationCanvas.savedCtx, delete this.annotationCanvas.savedCtx, delete this.annotationCanvas);
}
paintImageMaskXObject(I) {
if (!this.contentVisible)
return;
const g = I.count;
I = this.getObject(I.data, I), I.count = g;
const C = this.ctx, i = this.processingType3;
if (i && (i.compiled === void 0 && (i.compiled = ycg(I)), i.compiled)) {
C.fill(i.compiled);
return;
}
const e = this._createMaskCanvas(I), A = e.canvas;
C.save(), C.setTransform(1, 0, 0, 1, 0, 0), C.drawImage(A, e.offsetX, e.offsetY), C.restore(), this.compose();
}
paintImageMaskXObjectRepeat(I, g, C = 0, i = 0, e, A) {
if (!this.contentVisible)
return;
I = this.getObject(I.data, I);
const s = this.ctx;
s.save();
const l = zC(s);
s.transform(g, C, i, e, 0, 0);
const n = this._createMaskCanvas(I);
s.setTransform(1, 0, 0, 1, n.offsetX - l[4], n.offsetY - l[5]);
for (let a = 0, d = A.length; a < d; a += 2) {
const o = AI.transform(l, [g, C, i, e, A[a], A[a + 1]]), [c, r] = AI.applyTransform([0, 0], o);
s.drawImage(n.canvas, c, r);
}
s.restore(), this.compose();
}
paintImageMaskXObjectGroup(I) {
if (!this.contentVisible)
return;
const g = this.ctx, C = this.current.fillColor, i = this.current.patternFill;
for (const e of I) {
const {
data: A,
width: s,
height: l,
transform: n
} = e, a = this.cachedCanvases.getCanvas("maskCanvas", s, l), d = a.context;
d.save();
const o = this.getObject(A, e);
c8(d, o), d.globalCompositeOperation = "source-in", d.fillStyle = i ? C.getPattern(d, this, ss(g), Ci.FILL) : C, d.fillRect(0, 0, s, l), d.restore(), g.save(), g.transform(...n), g.scale(1, -1), zY(g, a.canvas, 0, 0, s, l, 0, -1, 1, 1), g.restore();
}
this.compose();
}
paintImageXObject(I) {
if (!this.contentVisible)
return;
const g = this.getObject(I);
if (!g) {
DI("Dependent image isn't ready yet");
return;
}
this.paintInlineImageXObject(g);
}
paintImageXObjectRepeat(I, g, C, i) {
if (!this.contentVisible)
return;
const e = this.getObject(I);
if (!e) {
DI("Dependent image isn't ready yet");
return;
}
const A = e.width, s = e.height, l = [];
for (let n = 0, a = i.length; n < a; n += 2)
l.push({
transform: [g, 0, 0, C, i[n], i[n + 1]],
x: 0,
y: 0,
w: A,
h: s
});
this.paintInlineImageXObjectGroup(e, l);
}
applyTransferMapsToCanvas(I) {
return this.current.transferMaps !== "none" && (I.filter = this.current.transferMaps, I.drawImage(I.canvas, 0, 0), I.filter = "none"), I.canvas;
}
applyTransferMapsToBitmap(I) {
if (this.current.transferMaps === "none")
return I.bitmap;
const {
bitmap: g,
width: C,
height: i
} = I, e = this.cachedCanvases.getCanvas("inlineImage", C, i), A = e.context;
return A.filter = this.current.transferMaps, A.drawImage(g, 0, 0), A.filter = "none", e.canvas;
}
paintInlineImageXObject(I) {
if (!this.contentVisible)
return;
const g = I.width, C = I.height, i = this.ctx;
if (this.save(), !$t) {
const {
filter: s
} = i;
s !== "none" && s !== "" && (i.filter = "none");
}
i.scale(1 / g, -1 / C);
let e;
if (I.bitmap)
e = this.applyTransferMapsToBitmap(I);
else if (typeof HTMLElement == "function" && I instanceof HTMLElement || !I.data)
e = I;
else {
const l = this.cachedCanvases.getCanvas("inlineImage", g, C).context;
o8(l, I), e = this.applyTransferMapsToCanvas(l);
}
const A = this._scaleImage(e, ss(i));
i.imageSmoothingEnabled = d8(zC(i), I.interpolate), zY(i, A.img, 0, 0, A.paintWidth, A.paintHeight, 0, -C, g, C), this.compose(), this.restore();
}
paintInlineImageXObjectGroup(I, g) {
if (!this.contentVisible)
return;
const C = this.ctx;
let i;
if (I.bitmap)
i = I.bitmap;
else {
const e = I.width, A = I.height, l = this.cachedCanvases.getCanvas("inlineImage", e, A).context;
o8(l, I), i = this.applyTransferMapsToCanvas(l);
}
for (const e of g)
C.save(), C.transform(...e.transform), C.scale(1, -1), zY(C, i, e.x, e.y, e.w, e.h, 0, -1, 1, 1), C.restore();
this.compose();
}
paintSolidColorImageMask() {
this.contentVisible && (this.ctx.fillRect(0, 0, 1, 1), this.compose());
}
markPoint(I) {
}
markPointProps(I, g) {
}
beginMarkedContent(I) {
this.markedContentStack.push({
visible: !0
});
}
beginMarkedContentProps(I, g) {
I === "OC" ? this.markedContentStack.push({
visible: this.optionalContentConfig.isVisible(g)
}) : this.markedContentStack.push({
visible: !0
}), this.contentVisible = this.isContentVisible();
}
endMarkedContent() {
this.markedContentStack.pop(), this.contentVisible = this.isContentVisible();
}
beginCompat() {
}
endCompat() {
}
consumePath(I, g) {
const C = this.current.isEmptyClip();
this.pendingClip && this.current.updateClipFromPath(), this.pendingClip || this.compose(g);
const i = this.ctx;
this.pendingClip && (C || (this.pendingClip === r8 ? i.clip(I, "evenodd") : i.clip(I)), this.pendingClip = null), this.current.startNewPathAndClipBox(this.current.clipBox), i.beginPath();
}
getSinglePixelWidth() {
if (!this._cachedGetSinglePixelWidth) {
const I = zC(this.ctx);
if (I[1] === 0 && I[2] === 0)
this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(I[0]), Math.abs(I[3]));
else {
const g = Math.abs(I[0] * I[3] - I[2] * I[1]), C = Math.hypot(I[0], I[2]), i = Math.hypot(I[1], I[3]);
this._cachedGetSinglePixelWidth = Math.max(C, i) / g;
}
}
return this._cachedGetSinglePixelWidth;
}
getScaleForStroking() {
if (this._cachedScaleForStroking[0] === -1) {
const {
lineWidth: I
} = this.current, {
a: g,
b: C,
c: i,
d: e
} = this.ctx.getTransform();
let A, s;
if (C === 0 && i === 0) {
const l = Math.abs(g), n = Math.abs(e);
if (l === n)
if (I === 0)
A = s = 1 / l;
else {
const a = l * I;
A = s = a < 1 ? 1 / a : 1;
}
else if (I === 0)
A = 1 / l, s = 1 / n;
else {
const a = l * I, d = n * I;
A = a < 1 ? 1 / a : 1, s = d < 1 ? 1 / d : 1;
}
} else {
const l = Math.abs(g * e - C * i), n = Math.hypot(g, C), a = Math.hypot(i, e);
if (I === 0)
A = a / l, s = n / l;
else {
const d = I * l;
A = a > d ? a / d : 1, s = n > d ? n / d : 1;
}
}
this._cachedScaleForStroking[0] = A, this._cachedScaleForStroking[1] = s;
}
return this._cachedScaleForStroking;
}
rescaleAndStroke(I, g) {
const {
ctx: C,
current: {
lineWidth: i
}
} = this, [e, A] = this.getScaleForStroking();
if (e === A) {
C.lineWidth = (i || 1) * e, C.stroke(I);
return;
}
const s = C.getLineDash();
g && C.save(), C.scale(e, A), QH.a = 1 / e, QH.d = 1 / A;
const l = new Path2D();
if (l.addPath(I, QH), s.length > 0) {
const n = Math.max(e, A);
C.setLineDash(s.map((a) => a / n)), C.lineDashOffset /= n;
}
C.lineWidth = i || 1, C.stroke(l), g && C.restore();
}
isContentVisible() {
for (let I = this.markedContentStack.length - 1; I >= 0; I--)
if (!this.markedContentStack[I].visible)
return !1;
return !0;
}
};
JA = new WeakSet(), bS = function() {
for (; this.stateStack.length || this.inSMaskMode; )
this.restore();
this.current.activeSMask = null, this.ctx.restore(), this.transparentCanvas && (this.ctx = this.compositeCtx, this.ctx.save(), this.ctx.setTransform(1, 0, 0, 1, 0, 0), this.ctx.drawImage(this.transparentCanvas, 0, 0), this.ctx.restore(), this.transparentCanvas = null);
}, uS = function() {
if (this.pageColors) {
const I = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background);
if (I !== "none") {
const g = this.ctx.filter;
this.ctx.filter = I, this.ctx.drawImage(this.ctx.canvas, 0, 0), this.ctx.filter = g;
}
}
}, mS = function(I, g, C) {
const i = new Path2D();
return i.addPath(I, new DOMMatrix(C).invertSelf().multiplySelf(g)), i;
};
let oh = i1;
for (const t in IV)
oh.prototype[t] !== void 0 && (oh.prototype[IV[t]] = oh.prototype[t]);
var AZ, sZ;
class Ql {
static get workerPort() {
return M(this, AZ);
}
static set workerPort(I) {
if (!(typeof Worker < "u" && I instanceof Worker) && I !== null)
throw new Error("Invalid `workerPort` type.");
$(this, AZ, I);
}
static get workerSrc() {
return M(this, sZ);
}
static set workerSrc(I) {
if (typeof I != "string")
throw new Error("Invalid `workerSrc` type.");
$(this, sZ, I);
}
}
AZ = new WeakMap(), sZ = new WeakMap(), tg(Ql, AZ, null), tg(Ql, sZ, "");
var Yc, lZ;
class Mcg {
constructor({
parsedData: I,
rawData: g
}) {
tg(this, Yc);
tg(this, lZ);
$(this, Yc, I), $(this, lZ, g);
}
getRaw() {
return M(this, lZ);
}
get(I) {
return M(this, Yc).get(I) ?? null;
}
getAll() {
return c9(M(this, Yc));
}
has(I) {
return M(this, Yc).has(I);
}
}
Yc = new WeakMap(), lZ = new WeakMap();
const _r = Symbol("INTERNAL");
var nZ, aZ, oZ, Kh;
class Rcg {
constructor(I, {
name: g,
intent: C,
usage: i,
rbGroups: e
}) {
tg(this, nZ, !1);
tg(this, aZ, !1);
tg(this, oZ, !1);
tg(this, Kh, !0);
$(this, nZ, !!(I & ye.DISPLAY)), $(this, aZ, !!(I & ye.PRINT)), this.name = g, this.intent = C, this.usage = i, this.rbGroups = e;
}
get visible() {
if (M(this, oZ))
return M(this, Kh);
if (!M(this, Kh))
return !1;
const {
print: I,
view: g
} = this.usage;
return M(this, nZ) ? (g == null ? void 0 : g.viewState) !== "OFF" : M(this, aZ) ? (I == null ? void 0 : I.printState) !== "OFF" : !0;
}
_setVisible(I, g, C = !1) {
I !== _r && BC("Internal method `_setVisible` called."), $(this, oZ, C), $(this, Kh, g);
}
}
nZ = new WeakMap(), aZ = new WeakMap(), oZ = new WeakMap(), Kh = new WeakMap();
var ya, bC, Fh, kh, cZ, ZS;
class fcg {
constructor(I, g = ye.DISPLAY) {
tg(this, cZ);
tg(this, ya, null);
tg(this, bC, /* @__PURE__ */ new Map());
tg(this, Fh, null);
tg(this, kh, null);
if (this.renderingIntent = g, this.name = null, this.creator = null, I !== null) {
this.name = I.name, this.creator = I.creator, $(this, kh, I.order);
for (const C of I.groups)
M(this, bC).set(C.id, new Rcg(g, C));
if (I.baseState === "OFF")
for (const C of M(this, bC).values())
C._setVisible(_r, !1);
for (const C of I.on)
M(this, bC).get(C)._setVisible(_r, !0);
for (const C of I.off)
M(this, bC).get(C)._setVisible(_r, !1);
$(this, Fh, this.getHash());
}
}
isVisible(I) {
if (M(this, bC).size === 0)
return !0;
if (!I)
return qV("Optional content group not defined."), !0;
if (I.type === "OCG")
return M(this, bC).has(I.id) ? M(this, bC).get(I.id).visible : (DI(`Optional content group not found: ${I.id}`), !0);
if (I.type === "OCMD") {
if (I.expression)
return ig(this, cZ, ZS).call(this, I.expression);
if (!I.policy || I.policy === "AnyOn") {
for (const g of I.ids) {
if (!M(this, bC).has(g))
return DI(`Optional content group not found: ${g}`), !0;
if (M(this, bC).get(g).visible)
return !0;
}
return !1;
} else if (I.policy === "AllOn") {
for (const g of I.ids) {
if (!M(this, bC).has(g))
return DI(`Optional content group not found: ${g}`), !0;
if (!M(this, bC).get(g).visible)
return !1;
}
return !0;
} else if (I.policy === "AnyOff") {
for (const g of I.ids) {
if (!M(this, bC).has(g))
return DI(`Optional content group not found: ${g}`), !0;
if (!M(this, bC).get(g).visible)
return !0;
}
return !1;
} else if (I.policy === "AllOff") {
for (const g of I.ids) {
if (!M(this, bC).has(g))
return DI(`Optional content group not found: ${g}`), !0;
if (M(this, bC).get(g).visible)
return !1;
}
return !0;
}
return DI(`Unknown optional content policy ${I.policy}.`), !0;
}
return DI(`Unknown group type ${I.type}.`), !0;
}
setVisibility(I, g = !0, C = !0) {
var e;
const i = M(this, bC).get(I);
if (!i) {
DI(`Optional content group not found: ${I}`);
return;
}
if (C && g && i.rbGroups.length)
for (const A of i.rbGroups)
for (const s of A)
s !== I && ((e = M(this, bC).get(s)) == null || e._setVisible(_r, !1, !0));
i._setVisible(_r, !!g, !0), $(this, ya, null);
}
setOCGState({
state: I,
preserveRB: g
}) {
let C;
for (const i of I) {
switch (i) {
case "ON":
case "OFF":
case "Toggle":
C = i;
continue;
}
const e = M(this, bC).get(i);
if (e)
switch (C) {
case "ON":
this.setVisibility(i, !0, g);
break;
case "OFF":
this.setVisibility(i, !1, g);
break;
case "Toggle":
this.setVisibility(i, !e.visible, g);
break;
}
}
$(this, ya, null);
}
get hasInitialVisibility() {
return M(this, Fh) === null || this.getHash() === M(this, Fh);
}
getOrder() {
return M(this, bC).size ? M(this, kh) ? M(this, kh).slice() : [...M(this, bC).keys()] : null;
}
getGroups() {
return M(this, bC).size > 0 ? c9(M(this, bC)) : null;
}
getGroup(I) {
return M(this, bC).get(I) || null;
}
getHash() {
if (M(this, ya) !== null)
return M(this, ya);
const I = new agg();
for (const [g, C] of M(this, bC))
I.update(`${g}:${C.visible}`);
return $(this, ya, I.hexdigest());
}
}
ya = new WeakMap(), bC = new WeakMap(), Fh = new WeakMap(), kh = new WeakMap(), cZ = new WeakSet(), ZS = function(I) {
const g = I.length;
if (g < 2)
return !0;
const C = I[0];
for (let i = 1; i < g; i++) {
const e = I[i];
let A;
if (Array.isArray(e))
A = ig(this, cZ, ZS).call(this, e);
else if (M(this, bC).has(e))
A = M(this, bC).get(e).visible;
else
return DI(`Optional content group not found: ${e}`), !0;
switch (C) {
case "And":
if (!A)
return !1;
break;
case "Or":
if (A)
return !0;
break;
case "Not":
return !A;
default:
return !0;
}
}
return C === "And";
};
class Hcg {
constructor(I, {
disableRange: g = !1,
disableStream: C = !1
}) {
ut(I, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.');
const {
length: i,
initialData: e,
progressiveDone: A,
contentDispositionFilename: s
} = I;
if (this._queuedChunks = [], this._progressiveDone = A, this._contentDispositionFilename = s, (e == null ? void 0 : e.length) > 0) {
const l = e instanceof Uint8Array && e.byteLength === e.buffer.byteLength ? e.buffer : new Uint8Array(e).buffer;
this._queuedChunks.push(l);
}
this._pdfDataRangeTransport = I, this._isStreamingSupported = !C, this._isRangeSupported = !g, this._contentLength = i, this._fullRequestReader = null, this._rangeReaders = [], I.addRangeListener((l, n) => {
this._onReceiveData({
begin: l,
chunk: n
});
}), I.addProgressListener((l, n) => {
this._onProgress({
loaded: l,
total: n
});
}), I.addProgressiveReadListener((l) => {
this._onReceiveData({
chunk: l
});
}), I.addProgressiveDoneListener(() => {
this._onProgressiveDone();
}), I.transportReady();
}
_onReceiveData({
begin: I,
chunk: g
}) {
const C = g instanceof Uint8Array && g.byteLength === g.buffer.byteLength ? g.buffer : new Uint8Array(g).buffer;
if (I === void 0)
this._fullRequestReader ? this._fullRequestReader._enqueue(C) : this._queuedChunks.push(C);
else {
const i = this._rangeReaders.some(function(e) {
return e._begin !== I ? !1 : (e._enqueue(C), !0);
});
ut(i, "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.");
}
}
get _progressiveDataLength() {
var I;
return ((I = this._fullRequestReader) == null ? void 0 : I._loaded) ?? 0;
}
_onProgress(I) {
var g, C, i, e;
I.total === void 0 ? (C = (g = this._rangeReaders[0]) == null ? void 0 : g.onProgress) == null || C.call(g, {
loaded: I.loaded
}) : (e = (i = this._fullRequestReader) == null ? void 0 : i.onProgress) == null || e.call(i, {
loaded: I.loaded,
total: I.total
});
}
_onProgressiveDone() {
var I;
(I = this._fullRequestReader) == null || I.progressiveDone(), this._progressiveDone = !0;
}
_removeRangeReader(I) {
const g = this._rangeReaders.indexOf(I);
g >= 0 && this._rangeReaders.splice(g, 1);
}
getFullReader() {
ut(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called once.");
const I = this._queuedChunks;
return this._queuedChunks = null, new Xcg(this, I, this._progressiveDone, this._contentDispositionFilename);
}
getRangeReader(I, g) {
if (g <= this._progressiveDataLength)
return null;
const C = new Scg(this, I, g);
return this._pdfDataRangeTransport.requestDataRange(I, g), this._rangeReaders.push(C), C;
}
cancelAllRequests(I) {
var g;
(g = this._fullRequestReader) == null || g.cancel(I);
for (const C of this._rangeReaders.slice(0))
C.cancel(I);
this._pdfDataRangeTransport.abort();
}
}
class Xcg {
constructor(I, g, C = !1, i = null) {
this._stream = I, this._done = C || !1, this._filename = h9(i) ? i : null, this._queuedChunks = g || [], this._loaded = 0;
for (const e of this._queuedChunks)
this._loaded += e.byteLength;
this._requests = [], this._headersReady = Promise.resolve(), I._fullRequestReader = this, this.onProgress = null;
}
_enqueue(I) {
this._done || (this._requests.length > 0 ? this._requests.shift().resolve({
value: I,
done: !1
}) : this._queuedChunks.push(I), this._loaded += I.byteLength);
}
get headersReady() {
return this._headersReady;
}
get filename() {
return this._filename;
}
get isRangeSupported() {
return this._stream._isRangeSupported;
}
get isStreamingSupported() {
return this._stream._isStreamingSupported;
}
get contentLength() {
return this._stream._contentLength;
}
async read() {
if (this._queuedChunks.length > 0)
return {
value: this._queuedChunks.shift(),
done: !1
};
if (this._done)
return {
value: void 0,
done: !0
};
const I = Promise.withResolvers();
return this._requests.push(I), I.promise;
}
cancel(I) {
this._done = !0;
for (const g of this._requests)
g.resolve({
value: void 0,
done: !0
});
this._requests.length = 0;
}
progressiveDone() {
this._done || (this._done = !0);
}
}
class Scg {
constructor(I, g, C) {
this._stream = I, this._begin = g, this._end = C, this._queuedChunk = null, this._requests = [], this._done = !1, this.onProgress = null;
}
_enqueue(I) {
if (!this._done) {
if (this._requests.length === 0)
this._queuedChunk = I;
else {
this._requests.shift().resolve({
value: I,
done: !1
});
for (const C of this._requests)
C.resolve({
value: void 0,
done: !0
});
this._requests.length = 0;
}
this._done = !0, this._stream._removeRangeReader(this);
}
}
get isStreamingSupported() {
return !1;
}
async read() {
if (this._queuedChunk) {
const g = this._queuedChunk;
return this._queuedChunk = null, {
value: g,
done: !1
};
}
if (this._done)
return {
value: void 0,
done: !0
};
const I = Promise.withResolvers();
return this._requests.push(I), I.promise;
}
cancel(I) {
this._done = !0;
for (const g of this._requests)
g.resolve({
value: void 0,
done: !0
});
this._requests.length = 0, this._stream._removeRangeReader(this);
}
}
function Dcg(t) {
let I = !0, g = C("filename\\*", "i").exec(t);
if (g) {
g = g[1];
let a = s(g);
return a = unescape(a), a = l(a), a = n(a), e(a);
}
if (g = A(t), g) {
const a = n(g);
return e(a);
}
if (g = C("filename", "i").exec(t), g) {
g = g[1];
let a = s(g);
return a = n(a), e(a);
}
function C(a, d) {
return new RegExp("(?:^|;)\\s*" + a + '\\s*=\\s*([^";\\s][^;\\s]*|"(?:[^"\\\\]|\\\\"?)+"?)', d);
}
function i(a, d) {
if (a) {
if (!/^[\x00-\xFF]+$/.test(d))
return d;
try {
const o = new TextDecoder(a, {
fatal: !0
}), c = eG(d);
d = o.decode(c), I = !1;
} catch {
}
}
return d;
}
function e(a) {
return I && /[\x80-\xff]/.test(a) && (a = i("utf-8", a), I && (a = i("iso-8859-1", a))), a;
}
function A(a) {
const d = [];
let o;
const c = C("filename\\*((?!0\\d)\\d+)(\\*?)", "ig");
for (; (o = c.exec(a)) !== null; ) {
let [, h, b, u] = o;
if (h = parseInt(h, 10), h in d) {
if (h === 0)
break;
continue;
}
d[h] = [b, u];
}
const r = [];
for (let h = 0; h < d.length && h in d; ++h) {
let [b, u] = d[h];
u = s(u), b && (u = unescape(u), h === 0 && (u = l(u))), r.push(u);
}
return r.join("");
}
function s(a) {
if (a.startsWith('"')) {
const d = a.slice(1).split('\\"');
for (let o = 0; o < d.length; ++o) {
const c = d[o].indexOf('"');
c !== -1 && (d[o] = d[o].slice(0, c), d.length = o + 1), d[o] = d[o].replaceAll(/\\(.)/g, "$1");
}
a = d.join('"');
}
return a;
}
function l(a) {
const d = a.indexOf("'");
if (d === -1)
return a;
const o = a.slice(0, d), r = a.slice(d + 1).replace(/^[^']*'/, "");
return i(o, r);
}
function n(a) {
return !a.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(a) ? a : a.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function(d, o, c, r) {
if (c === "q" || c === "Q")
return r = r.replaceAll("_", " "), r = r.replaceAll(/=([0-9a-fA-F]{2})/g, function(h, b) {
return String.fromCharCode(parseInt(b, 16));
}), i(o, r);
try {
r = atob(r);
} catch {
}
return i(o, r);
});
}
return "";
}
function pgg(t, I) {
const g = new Headers();
if (!t || !I || typeof I != "object")
return g;
for (const C in I) {
const i = I[C];
i !== void 0 && g.append(C, i);
}
return g;
}
function gM(t) {
var I;
return ((I = URL.parse(t)) == null ? void 0 : I.origin) ?? null;
}
function Bgg({
responseHeaders: t,
isHttp: I,
rangeChunkSize: g,
disableRange: C
}) {
const i = {
allowRangeRequests: !1,
suggestedLength: void 0
}, e = parseInt(t.get("Content-Length"), 10);
return !Number.isInteger(e) || (i.suggestedLength = e, e <= 2 * g) || C || !I || t.get("Accept-Ranges") !== "bytes" || (t.get("Content-Encoding") || "identity") !== "identity" || (i.allowRangeRequests = !0), i;
}
function Wgg(t) {
const I = t.get("Content-Disposition");
if (I) {
let g = Dcg(I);
if (g.includes("%"))
try {
g = decodeURIComponent(g);
} catch {
}
if (h9(g))
return g;
}
return null;
}
function nG(t, I) {
return new CV(`Unexpected server response (${t}) while retrieving PDF "${I}".`, t, t === 404 || t === 0 && I.startsWith("file:"));
}
function ygg(t) {
return t === 200 || t === 206;
}
function Ygg(t, I, g) {
return {
method: "GET",
headers: t,
signal: g.signal,
mode: "cors",
credentials: I ? "include" : "same-origin",
redirect: "follow"
};
}
function Ngg(t) {
return t instanceof Uint8Array ? t.buffer : t instanceof ArrayBuffer ? t : (DI(`getArrayBuffer - unexpected data format: ${t}`), new Uint8Array(t).buffer);
}
class h8 {
constructor(I) {
iI(this, "_responseOrigin", null);
this.source = I, this.isHttp = /^https?:/i.test(I.url), this.headers = pgg(this.isHttp, I.httpHeaders), this._fullRequestReader = null, this._rangeRequestReaders = [];
}
get _progressiveDataLength() {
var I;
return ((I = this._fullRequestReader) == null ? void 0 : I._loaded) ?? 0;
}
getFullReader() {
return ut(!this._fullRequestReader, "PDFFetchStream.getFullReader can only be called once."), this._fullRequestReader = new Kcg(this), this._fullRequestReader;
}
getRangeReader(I, g) {
if (g <= this._progressiveDataLength)
return null;
const C = new Fcg(this, I, g);
return this._rangeRequestReaders.push(C), C;
}
cancelAllRequests(I) {
var g;
(g = this._fullRequestReader) == null || g.cancel(I);
for (const C of this._rangeRequestReaders.slice(0))
C.cancel(I);
}
}
class Kcg {
constructor(I) {
this._stream = I, this._reader = null, this._loaded = 0, this._filename = null;
const g = I.source;
this._withCredentials = g.withCredentials || !1, this._contentLength = g.length, this._headersCapability = Promise.withResolvers(), this._disableRange = g.disableRange || !1, this._rangeChunkSize = g.rangeChunkSize, !this._rangeChunkSize && !this._disableRange && (this._disableRange = !0), this._abortController = new AbortController(), this._isStreamingSupported = !g.disableStream, this._isRangeSupported = !g.disableRange;
const C = new Headers(I.headers), i = g.url;
fetch(i, Ygg(C, this._withCredentials, this._abortController)).then((e) => {
if (I._responseOrigin = gM(e.url), !ygg(e.status))
throw nG(e.status, i);
this._reader = e.body.getReader(), this._headersCapability.resolve();
const A = e.headers, {
allowRangeRequests: s,
suggestedLength: l
} = Bgg({
responseHeaders: A,
isHttp: I.isHttp,
rangeChunkSize: this._rangeChunkSize,
disableRange: this._disableRange
});
this._isRangeSupported = s, this._contentLength = l || this._contentLength, this._filename = Wgg(A), !this._isStreamingSupported && this._isRangeSupported && this.cancel(new Ea("Streaming is disabled."));
}).catch(this._headersCapability.reject), this.onProgress = null;
}
get headersReady() {
return this._headersCapability.promise;
}
get filename() {
return this._filename;
}
get contentLength() {
return this._contentLength;
}
get isRangeSupported() {
return this._isRangeSupported;
}
get isStreamingSupported() {
return this._isStreamingSupported;
}
async read() {
var C;
await this._headersCapability.promise;
const {
value: I,
done: g
} = await this._reader.read();
return g ? {
value: I,
done: g
} : (this._loaded += I.byteLength, (C = this.onProgress) == null || C.call(this, {
loaded: this._loaded,
total: this._contentLength
}), {
value: Ngg(I),
done: !1
});
}
cancel(I) {
var g;
(g = this._reader) == null || g.cancel(I), this._abortController.abort();
}
}
class Fcg {
constructor(I, g, C) {
this._stream = I, this._reader = null, this._loaded = 0;
const i = I.source;
this._withCredentials = i.withCredentials || !1, this._readCapability = Promise.withResolvers(), this._isStreamingSupported = !i.disableStream, this._abortController = new AbortController();
const e = new Headers(I.headers);
e.append("Range", `bytes=${g}-${C - 1}`);
const A = i.url;
fetch(A, Ygg(e, this._withCredentials, this._abortController)).then((s) => {
const l = gM(s.url);
if (l !== I._responseOrigin)
throw new Error(`Expected range response-origin "${l}" to match "${I._responseOrigin}".`);
if (!ygg(s.status))
throw nG(s.status, A);
this._readCapability.resolve(), this._reader = s.body.getReader();
}).catch(this._readCapability.reject), this.onProgress = null;
}
get isStreamingSupported() {
return this._isStreamingSupported;
}
async read() {
var C;
await this._readCapability.promise;
const {
value: I,
done: g
} = await this._reader.read();
return g ? {
value: I,
done: g
} : (this._loaded += I.byteLength, (C = this.onProgress) == null || C.call(this, {
loaded: this._loaded
}), {
value: Ngg(I),
done: !1
});
}
cancel(I) {
var g;
(g = this._reader) == null || g.cancel(I), this._abortController.abort();
}
}
const OH = 200, UH = 206;
function kcg(t) {
const I = t.response;
return typeof I != "string" ? I : eG(I).buffer;
}
class zcg {
constructor({
url: I,
httpHeaders: g,
withCredentials: C
}) {
iI(this, "_responseOrigin", null);
this.url = I, this.isHttp = /^https?:/i.test(I), this.headers = pgg(this.isHttp, g), this.withCredentials = C || !1, this.currXhrId = 0, this.pendingRequests = /* @__PURE__ */ Object.create(null);
}
request(I) {
const g = new XMLHttpRequest(), C = this.currXhrId++, i = this.pendingRequests[C] = {
xhr: g
};
g.open("GET", this.url), g.withCredentials = this.withCredentials;
for (const [e, A] of this.headers)
g.setRequestHeader(e, A);
return this.isHttp && "begin" in I && "end" in I ? (g.setRequestHeader("Range", `bytes=${I.begin}-${I.end - 1}`), i.expectedStatus = UH) : i.expectedStatus = OH, g.responseType = "arraybuffer", ut(I.onError, "Expected `onError` callback to be provided."), g.onerror = () => {
I.onError(g.status);
}, g.onreadystatechange = this.onStateChange.bind(this, C), g.onprogress = this.onProgress.bind(this, C), i.onHeadersReceived = I.onHeadersReceived, i.onDone = I.onDone, i.onError = I.onError, i.onProgress = I.onProgress, g.send(null), C;
}
onProgress(I, g) {
var i;
const C = this.pendingRequests[I];
C && ((i = C.onProgress) == null || i.call(C, g));
}
onStateChange(I, g) {
const C = this.pendingRequests[I];
if (!C)
return;
const i = C.xhr;
if (i.readyState >= 2 && C.onHeadersReceived && (C.onHeadersReceived(), delete C.onHeadersReceived), i.readyState !== 4 || !(I in this.pendingRequests))
return;
if (delete this.pendingRequests[I], i.status === 0 && this.isHttp) {
C.onError(i.status);
return;
}
const e = i.status || OH;
if (!(e === OH && C.expectedStatus === UH) && e !== C.expectedStatus) {
C.onError(i.status);
return;
}
const s = kcg(i);
if (e === UH) {
const l = i.getResponseHeader("Content-Range"), n = /bytes (\d+)-(\d+)\/(\d+)/.exec(l);
n ? C.onDone({
begin: parseInt(n[1], 10),
chunk: s
}) : (DI('Missing or invalid "Content-Range" header.'), C.onError(0));
} else s ? C.onDone({
begin: 0,
chunk: s
}) : C.onError(i.status);
}
getRequestXhr(I) {
return this.pendingRequests[I].xhr;
}
isPendingRequest(I) {
return I in this.pendingRequests;
}
abortRequest(I) {
const g = this.pendingRequests[I].xhr;
delete this.pendingRequests[I], g.abort();
}
}
class Jcg {
constructor(I) {
this._source = I, this._manager = new zcg(I), this._rangeChunkSize = I.rangeChunkSize, this._fullRequestReader = null, this._rangeRequestReaders = [];
}
_onRangeRequestReaderClosed(I) {
const g = this._rangeRequestReaders.indexOf(I);
g >= 0 && this._rangeRequestReaders.splice(g, 1);
}
getFullReader() {
return ut(!this._fullRequestReader, "PDFNetworkStream.getFullReader can only be called once."), this._fullRequestReader = new Lcg(this._manager, this._source), this._fullRequestReader;
}
getRangeReader(I, g) {
const C = new vcg(this._manager, I, g);
return C.onClosed = this._onRangeRequestReaderClosed.bind(this), this._rangeRequestReaders.push(C), C;
}
cancelAllRequests(I) {
var g;
(g = this._fullRequestReader) == null || g.cancel(I);
for (const C of this._rangeRequestReaders.slice(0))
C.cancel(I);
}
}
class Lcg {
constructor(I, g) {
this._manager = I, this._url = g.url, this._fullRequestId = I.request({
onHeadersReceived: this._onHeadersReceived.bind(this),
onDone: this._onDone.bind(this),
onError: this._onError.bind(this),
onProgress: this._onProgress.bind(this)
}), this._headersCapability = Promise.withResolvers(), this._disableRange = g.disableRange || !1, this._contentLength = g.length, this._rangeChunkSize = g.rangeChunkSize, !this._rangeChunkSize && !this._disableRange && (this._disableRange = !0), this._isStreamingSupported = !1, this._isRangeSupported = !1, this._cachedChunks = [], this._requests = [], this._done = !1, this._storedError = void 0, this._filename = null, this.onProgress = null;
}
_onHeadersReceived() {
const I = this._fullRequestId, g = this._manager.getRequestXhr(I);
this._manager._responseOrigin = gM(g.responseURL);
const C = g.getAllResponseHeaders(), i = new Headers(C ? C.trimStart().replace(/[^\S ]+$/, "").split(/[\r\n]+/).map((s) => {
const [l, ...n] = s.split(": ");
return [l, n.join(": ")];
}) : []), {
allowRangeRequests: e,
suggestedLength: A
} = Bgg({
responseHeaders: i,
isHttp: this._manager.isHttp,
rangeChunkSize: this._rangeChunkSize,
disableRange: this._disableRange
});
e && (this._isRangeSupported = !0), this._contentLength = A || this._contentLength, this._filename = Wgg(i), this._isRangeSupported && this._manager.abortRequest(I), this._headersCapability.resolve();
}
_onDone(I) {
if (I && (this._requests.length > 0 ? this._requests.shift().resolve({
value: I.chunk,
done: !1
}) : this._cachedChunks.push(I.chunk)), this._done = !0, !(this._cachedChunks.length > 0)) {
for (const g of this._requests)
g.resolve({
value: void 0,
done: !0
});
this._requests.length = 0;
}
}
_onError(I) {
this._storedError = nG(I, this._url), this._headersCapability.reject(this._storedError);
for (const g of this._requests)
g.reject(this._storedError);
this._requests.length = 0, this._cachedChunks.length = 0;
}
_onProgress(I) {
var g;
(g = this.onProgress) == null || g.call(this, {
loaded: I.loaded,
total: I.lengthComputable ? I.total : this._contentLength
});
}
get filename() {
return this._filename;
}
get isRangeSupported() {
return this._isRangeSupported;
}
get isStreamingSupported() {
return this._isStreamingSupported;
}
get contentLength() {
return this._contentLength;
}
get headersReady() {
return this._headersCapability.promise;
}
async read() {
if (await this._headersCapability.promise, this._storedError)
throw this._storedError;
if (this._cachedChunks.length > 0)
return {
value: this._cachedChunks.shift(),
done: !1
};
if (this._done)
return {
value: void 0,
done: !0
};
const I = Promise.withResolvers();
return this._requests.push(I), I.promise;
}
cancel(I) {
this._done = !0, this._headersCapability.reject(I);
for (const g of this._requests)
g.resolve({
value: void 0,
done: !0
});
this._requests.length = 0, this._manager.isPendingRequest(this._fullRequestId) && this._manager.abortRequest(this._fullRequestId), this._fullRequestReader = null;
}
}
class vcg {
constructor(I, g, C) {
this._manager = I, this._url = I.url, this._requestId = I.request({
begin: g,
end: C,
onHeadersReceived: this._onHeadersReceived.bind(this),
onDone: this._onDone.bind(this),
onError: this._onError.bind(this),
onProgress: this._onProgress.bind(this)
}), this._requests = [], this._queuedChunk = null, this._done = !1, this._storedError = void 0, this.onProgress = null, this.onClosed = null;
}
_onHeadersReceived() {
var g;
const I = gM((g = this._manager.getRequestXhr(this._requestId)) == null ? void 0 : g.responseURL);
I !== this._manager._responseOrigin && (this._storedError = new Error(`Expected range response-origin "${I}" to match "${this._manager._responseOrigin}".`), this._onError(0));
}
_close() {
var I;
(I = this.onClosed) == null || I.call(this, this);
}
_onDone(I) {
const g = I.chunk;
this._requests.length > 0 ? this._requests.shift().resolve({
value: g,
done: !1
}) : this._queuedChunk = g, this._done = !0;
for (const C of this._requests)
C.resolve({
value: void 0,
done: !0
});
this._requests.length = 0, this._close();
}
_onError(I) {
this._storedError ?? (this._storedError = nG(I, this._url));
for (const g of this._requests)
g.reject(this._storedError);
this._requests.length = 0, this._queuedChunk = null;
}
_onProgress(I) {
var g;
this.isStreamingSupported || (g = this.onProgress) == null || g.call(this, {
loaded: I.loaded
});
}
get isStreamingSupported() {
return !1;
}
async read() {
if (this._storedError)
throw this._storedError;
if (this._queuedChunk !== null) {
const g = this._queuedChunk;
return this._queuedChunk = null, {
value: g,
done: !1
};
}
if (this._done)
return {
value: void 0,
done: !0
};
const I = Promise.withResolvers();
return this._requests.push(I), I.promise;
}
cancel(I) {
this._done = !0;
for (const g of this._requests)
g.resolve({
value: void 0,
done: !0
});
this._requests.length = 0, this._manager.isPendingRequest(this._requestId) && this._manager.abortRequest(this._requestId), this._close();
}
}
const Tcg = /^[a-z][a-z0-9\-+.]+:/i;
function xcg(t) {
if (Tcg.test(t))
return new URL(t);
const I = process.getBuiltinModule("url");
return new URL(I.pathToFileURL(t));
}
class jcg {
constructor(I) {
this.source = I, this.url = xcg(I.url), ut(this.url.protocol === "file:", "PDFNodeStream only supports file:// URLs."), this._fullRequestReader = null, this._rangeRequestReaders = [];
}
get _progressiveDataLength() {
var I;
return ((I = this._fullRequestReader) == null ? void 0 : I._loaded) ?? 0;
}
getFullReader() {
return ut(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once."), this._fullRequestReader = new Qcg(this), this._fullRequestReader;
}
getRangeReader(I, g) {
if (g <= this._progressiveDataLength)
return null;
const C = new Ocg(this, I, g);
return this._rangeRequestReaders.push(C), C;
}
cancelAllRequests(I) {
var g;
(g = this._fullRequestReader) == null || g.cancel(I);
for (const C of this._rangeRequestReaders.slice(0))
C.cancel(I);
}
}
class Qcg {
constructor(I) {
this._url = I.url, this._done = !1, this._storedError = null, this.onProgress = null;
const g = I.source;
this._contentLength = g.length, this._loaded = 0, this._filename = null, this._disableRange = g.disableRange || !1, this._rangeChunkSize = g.rangeChunkSize, !this._rangeChunkSize && !this._disableRange && (this._disableRange = !0), this._isStreamingSupported = !g.disableStream, this._isRangeSupported = !g.disableRange, this._readableStream = null, this._readCapability = Promise.withResolvers(), this._headersCapability = Promise.withResolvers();
const C = process.getBuiltinModule("fs");
C.promises.lstat(this._url).then((i) => {
this._contentLength = i.size, this._setReadableStream(C.createReadStream(this._url)), this._headersCapability.resolve();
}, (i) => {
i.code === "ENOENT" && (i = nG(0, this._url.href)), this._storedError = i, this._headersCapability.reject(i);
});
}
get headersReady() {
return this._headersCapability.promise;
}
get filename() {
return this._filename;
}
get contentLength() {
return this._contentLength;
}
get isRangeSupported() {
return this._isRangeSupported;
}
get isStreamingSupported() {
return this._isStreamingSupported;
}
async read() {
var C;
if (await this._readCapability.promise, this._done)
return {
value: void 0,
done: !0
};
if (this._storedError)
throw this._storedError;
const I = this._readableStream.read();
return I === null ? (this._readCapability = Promise.withResolvers(), this.read()) : (this._loaded += I.length, (C = this.onProgress) == null || C.call(this, {
loaded: this._loaded,
total: this._contentLength
}), {
value: new Uint8Array(I).buffer,
done: !1
});
}
cancel(I) {
if (!this._readableStream) {
this._error(I);
return;
}
this._readableStream.destroy(I);
}
_error(I) {
this._storedError = I, this._readCapability.resolve();
}
_setReadableStream(I) {
this._readableStream = I, I.on("readable", () => {
this._readCapability.resolve();
}), I.on("end", () => {
I.destroy(), this._done = !0, this._readCapability.resolve();
}), I.on("error", (g) => {
this._error(g);
}), !this._isStreamingSupported && this._isRangeSupported && this._error(new Ea("streaming is disabled")), this._storedError && this._readableStream.destroy(this._storedError);
}
}
class Ocg {
constructor(I, g, C) {
this._url = I.url, this._done = !1, this._storedError = null, this.onProgress = null, this._loaded = 0, this._readableStream = null, this._readCapability = Promise.withResolvers();
const i = I.source;
this._isStreamingSupported = !i.disableStream;
const e = process.getBuiltinModule("fs");
this._setReadableStream(e.createReadStream(this._url, {
start: g,
end: C - 1
}));
}
get isStreamingSupported() {
return this._isStreamingSupported;
}
async read() {
var C;
if (await this._readCapability.promise, this._done)
return {
value: void 0,
done: !0
};
if (this._storedError)
throw this._storedError;
const I = this._readableStream.read();
return I === null ? (this._readCapability = Promise.withResolvers(), this.read()) : (this._loaded += I.length, (C = this.onProgress) == null || C.call(this, {
loaded: this._loaded
}), {
value: new Uint8Array(I).buffer,
done: !1
});
}
cancel(I) {
if (!this._readableStream) {
this._error(I);
return;
}
this._readableStream.destroy(I);
}
_error(I) {
this._storedError = I, this._readCapability.resolve();
}
_setReadableStream(I) {
this._readableStream = I, I.on("readable", () => {
this._readCapability.resolve();
}), I.on("end", () => {
I.destroy(), this._done = !0, this._readCapability.resolve();
}), I.on("error", (g) => {
this._error(g);
}), this._storedError && this._readableStream.destroy(this._storedError);
}
}
const Ucg = 1e5, b8 = 30;
var c$, Ya, Oi, dZ, rZ, Nc, Ml, hZ, bZ, Vc, zh, Jh, Na, Lh, uZ, vh, Mc, mZ, ZZ, Th, Rc, GZ, Va, xh, Cn, Vgg, Mgg, GS, Me, wN, wS, Rgg, fgg;
const wt = class wt {
constructor({
textContentSource: I,
container: g,
viewport: C
}) {
tg(this, Cn);
tg(this, Ya, Promise.withResolvers());
tg(this, Oi, null);
tg(this, dZ, !1);
tg(this, rZ, !!((c$ = globalThis.FontInspector) != null && c$.enabled));
tg(this, Nc, null);
tg(this, Ml, null);
tg(this, hZ, 0);
tg(this, bZ, 0);
tg(this, Vc, null);
tg(this, zh, null);
tg(this, Jh, 0);
tg(this, Na, 0);
tg(this, Lh, /* @__PURE__ */ Object.create(null));
tg(this, uZ, []);
tg(this, vh, null);
tg(this, Mc, []);
tg(this, mZ, /* @__PURE__ */ new WeakMap());
tg(this, ZZ, null);
var l;
if (I instanceof ReadableStream)
$(this, vh, I);
else if (typeof I == "object")
$(this, vh, new ReadableStream({
start(n) {
n.enqueue(I), n.close();
}
}));
else
throw new Error('No "textContentSource" parameter specified.');
$(this, Oi, $(this, zh, g)), $(this, Na, C.scale * In.pixelRatio), $(this, Jh, C.rotation), $(this, Ml, {
div: null,
properties: null,
ctx: null
});
const {
pageWidth: i,
pageHeight: e,
pageX: A,
pageY: s
} = C.rawDims;
$(this, ZZ, [1, 0, 0, -1, -A, s + e]), $(this, bZ, i), $(this, hZ, e), ig(l = wt, Me, Rgg).call(l), cd(g, C), M(this, Ya).promise.finally(() => {
M(wt, xh).delete(this), $(this, Ml, null), $(this, Lh, null);
}).catch(() => {
});
}
static get fontFamilyMap() {
const {
isWindows: I,
isFirefox: g
} = Ai.platform;
return UI(this, "fontFamilyMap", /* @__PURE__ */ new Map([["sans-serif", `${I && g ? "Calibri, " : ""}sans-serif`], ["monospace", `${I && g ? "Lucida Console, " : ""}monospace`]]));
}
render() {
const I = () => {
M(this, Vc).read().then(({
value: g,
done: C
}) => {
if (C) {
M(this, Ya).resolve();
return;
}
M(this, Nc) ?? $(this, Nc, g.lang), Object.assign(M(this, Lh), g.styles), ig(this, Cn, Vgg).call(this, g.items), I();
}, M(this, Ya).reject);
};
return $(this, Vc, M(this, vh).getReader()), M(wt, xh).add(this), I(), M(this, Ya).promise;
}
update({
viewport: I,
onBefore: g = null
}) {
var e;
const C = I.scale * In.pixelRatio, i = I.rotation;
if (i !== M(this, Jh) && (g == null || g(), $(this, Jh, i), cd(M(this, zh), {
rotation: i
})), C !== M(this, Na)) {
g == null || g(), $(this, Na, C);
const A = {
div: null,
properties: null,
ctx: ig(e = wt, Me, wN).call(e, M(this, Nc))
};
for (const s of M(this, Mc))
A.properties = M(this, mZ).get(s), A.div = s, ig(this, Cn, GS).call(this, A);
}
}
cancel() {
var g;
const I = new Ea("TextLayer task cancelled.");
(g = M(this, Vc)) == null || g.cancel(I).catch(() => {
}), $(this, Vc, null), M(this, Ya).reject(I);
}
get textDivs() {
return M(this, Mc);
}
get textContentItemsStr() {
return M(this, uZ);
}
static cleanup() {
if (!(M(this, xh).size > 0)) {
M(this, Th).clear();
for (const {
canvas: I
} of M(this, Rc).values())
I.remove();
M(this, Rc).clear();
}
}
};
Ya = new WeakMap(), Oi = new WeakMap(), dZ = new WeakMap(), rZ = new WeakMap(), Nc = new WeakMap(), Ml = new WeakMap(), hZ = new WeakMap(), bZ = new WeakMap(), Vc = new WeakMap(), zh = new WeakMap(), Jh = new WeakMap(), Na = new WeakMap(), Lh = new WeakMap(), uZ = new WeakMap(), vh = new WeakMap(), Mc = new WeakMap(), mZ = new WeakMap(), ZZ = new WeakMap(), Th = new WeakMap(), Rc = new WeakMap(), GZ = new WeakMap(), Va = new WeakMap(), xh = new WeakMap(), Cn = new WeakSet(), Vgg = function(I) {
var i, e;
if (M(this, dZ))
return;
(e = M(this, Ml)).ctx ?? (e.ctx = ig(i = wt, Me, wN).call(i, M(this, Nc)));
const g = M(this, Mc), C = M(this, uZ);
for (const A of I) {
if (g.length > Ucg) {
DI("Ignoring additional textDivs for performance reasons."), $(this, dZ, !0);
return;
}
if (A.str === void 0) {
if (A.type === "beginMarkedContentProps" || A.type === "beginMarkedContent") {
const s = M(this, Oi);
$(this, Oi, document.createElement("span")), M(this, Oi).classList.add("markedContent"), A.id !== null && M(this, Oi).setAttribute("id", `${A.id}`), s.append(M(this, Oi));
} else A.type === "endMarkedContent" && $(this, Oi, M(this, Oi).parentNode);
continue;
}
C.push(A.str), ig(this, Cn, Mgg).call(this, A);
}
}, Mgg = function(I) {
var h;
const g = document.createElement("span"), C = {
angle: 0,
canvasWidth: 0,
hasText: I.str !== "",
hasEOL: I.hasEOL,
fontSize: 0
};
M(this, Mc).push(g);
const i = AI.transform(M(this, ZZ), I.transform);
let e = Math.atan2(i[1], i[0]);
const A = M(this, Lh)[I.fontName];
A.vertical && (e += Math.PI / 2);
let s = M(this, rZ) && A.fontSubstitution || A.fontFamily;
s = wt.fontFamilyMap.get(s) || s;
const l = Math.hypot(i[2], i[3]), n = l * ig(h = wt, Me, fgg).call(h, s, A, M(this, Nc));
let a, d;
e === 0 ? (a = i[4], d = i[5] - n) : (a = i[4] + n * Math.sin(e), d = i[5] - n * Math.cos(e));
const o = "calc(var(--total-scale-factor) *", c = g.style;
M(this, Oi) === M(this, zh) ? (c.left = `${(100 * a / M(this, bZ)).toFixed(2)}%`, c.top = `${(100 * d / M(this, hZ)).toFixed(2)}%`) : (c.left = `${o}${a.toFixed(2)}px)`, c.top = `${o}${d.toFixed(2)}px)`), c.fontSize = `${o}${(M(wt, Va) * l).toFixed(2)}px)`, c.fontFamily = s, C.fontSize = l, g.setAttribute("role", "presentation"), g.textContent = I.str, g.dir = I.dir, M(this, rZ) && (g.dataset.fontName = A.fontSubstitutionLoadedName || I.fontName), e !== 0 && (C.angle = e * (180 / Math.PI));
let r = !1;
if (I.str.length > 1)
r = !0;
else if (I.str !== " " && I.transform[0] !== I.transform[3]) {
const b = Math.abs(I.transform[0]), u = Math.abs(I.transform[3]);
b !== u && Math.max(b, u) / Math.min(b, u) > 1.5 && (r = !0);
}
if (r && (C.canvasWidth = A.vertical ? I.height : I.width), M(this, mZ).set(g, C), M(this, Ml).div = g, M(this, Ml).properties = C, ig(this, Cn, GS).call(this, M(this, Ml)), C.hasText && M(this, Oi).append(g), C.hasEOL) {
const b = document.createElement("br");
b.setAttribute("role", "presentation"), M(this, Oi).append(b);
}
}, GS = function(I) {
var s;
const {
div: g,
properties: C,
ctx: i
} = I, {
style: e
} = g;
let A = "";
if (M(wt, Va) > 1 && (A = `scale(${1 / M(wt, Va)})`), C.canvasWidth !== 0 && C.hasText) {
const {
fontFamily: l
} = e, {
canvasWidth: n,
fontSize: a
} = C;
ig(s = wt, Me, wS).call(s, i, a * M(this, Na), l);
const {
width: d
} = i.measureText(g.textContent);
d > 0 && (A = `scaleX(${n * M(this, Na) / d}) ${A}`);
}
C.angle !== 0 && (A = `rotate(${C.angle}deg) ${A}`), A.length > 0 && (e.transform = A);
}, Me = new WeakSet(), wN = function(I = null) {
let g = M(this, Rc).get(I || (I = ""));
if (!g) {
const C = document.createElement("canvas");
C.className = "hiddenCanvasElement", C.lang = I, document.body.append(C), g = C.getContext("2d", {
alpha: !1,
willReadFrequently: !0
}), M(this, Rc).set(I, g), M(this, GZ).set(g, {
size: 0,
family: ""
});
}
return g;
}, wS = function(I, g, C) {
const i = M(this, GZ).get(I);
g === i.size && C === i.family || (I.font = `${g}px ${C}`, i.size = g, i.family = C);
}, Rgg = function() {
if (M(this, Va) !== null)
return;
const I = document.createElement("div");
I.style.opacity = 0, I.style.lineHeight = 1, I.style.fontSize = "1px", I.style.position = "absolute", I.textContent = "X", document.body.append(I), $(this, Va, I.getBoundingClientRect().height), I.remove();
}, fgg = function(I, g, C) {
const i = M(this, Th).get(I);
if (i)
return i;
const e = ig(this, Me, wN).call(this, C);
e.canvas.width = e.canvas.height = b8, ig(this, Me, wS).call(this, e, b8, I);
const A = e.measureText(""), s = A.fontBoundingBoxAscent, l = Math.abs(A.fontBoundingBoxDescent);
e.canvas.width = e.canvas.height = 0;
let n = 0.8;
return s ? n = s / (s + l) : (Ai.platform.isFirefox && DI("Enable the `dom.textMetrics.fontBoundingBox.enabled` preference in `about:config` to improve TextLayer rendering."), g.ascent ? n = g.ascent : g.descent && (n = 1 + g.descent)), M(this, Th).set(I, n), n;
}, tg(wt, Me), tg(wt, Th, /* @__PURE__ */ new Map()), tg(wt, Rc, /* @__PURE__ */ new Map()), tg(wt, GZ, /* @__PURE__ */ new WeakMap()), tg(wt, Va, null), tg(wt, xh, /* @__PURE__ */ new Set());
let Mm = wt;
class Rm {
static textContent(I) {
const g = [], C = {
items: g,
styles: /* @__PURE__ */ Object.create(null)
};
function i(e) {
var l;
if (!e)
return;
let A = null;
const s = e.name;
if (s === "#text")
A = e.value;
else if (Rm.shouldBuildText(s))
(l = e == null ? void 0 : e.attributes) != null && l.textContent ? A = e.attributes.textContent : e.value && (A = e.value);
else return;
if (A !== null && g.push({
str: A
}), !!e.children)
for (const n of e.children)
i(n);
}
return i(I), C;
}
static shouldBuildText(I) {
return !(I === "textarea" || I === "input" || I === "option" || I === "select");
}
}
const Ecg = 65536, Pcg = 100;
function _cg(t = {}) {
typeof t == "string" || t instanceof URL ? t = {
url: t
} : (t instanceof ArrayBuffer || ArrayBuffer.isView(t)) && (t = {
data: t
});
const I = new BS(), {
docId: g
} = I, C = t.url ? qcg(t.url) : null, i = t.data ? $cg(t.data) : null, e = t.httpHeaders || null, A = t.withCredentials === !0, s = t.password ?? null, l = t.range instanceof Hgg ? t.range : null, n = Number.isInteger(t.rangeChunkSize) && t.rangeChunkSize > 0 ? t.rangeChunkSize : Ecg;
let a = t.worker instanceof ch ? t.worker : null;
const d = t.verbosity, o = typeof t.docBaseUrl == "string" && !$V(t.docBaseUrl) ? t.docBaseUrl : null, c = LY(t.cMapUrl), r = t.cMapPacked !== !1, h = t.CMapReaderFactory || ($t ? dcg : C8), b = LY(t.iccUrl), u = LY(t.standardFontDataUrl), m = t.StandardFontDataFactory || ($t ? rcg : t8), Z = LY(t.wasmUrl), p = t.WasmFactory || ($t ? hcg : i8), Y = t.stopAtErrors !== !0, R = Number.isInteger(t.maxImageSize) && t.maxImageSize > -1 ? t.maxImageSize : -1, X = t.isEvalSupported !== !1, H = typeof t.isOffscreenCanvasSupported == "boolean" ? t.isOffscreenCanvasSupported : !$t, S = typeof t.isImageDecoderSupported == "boolean" ? t.isImageDecoderSupported : !$t && (Ai.platform.isFirefox || !globalThis.chrome), z = Number.isInteger(t.canvasMaxAreaInBytes) ? t.canvasMaxAreaInBytes : -1, v = typeof t.disableFontFace == "boolean" ? t.disableFontFace : $t, K = t.fontExtraProperties === !0, V = t.enableXfa === !0, N = t.ownerDocument || globalThis.document, B = t.disableRange === !0, G = t.disableStream === !0, w = t.disableAutoFetch === !0, W = t.pdfBug === !0, y = t.CanvasFactory || ($t ? ccg : ncg), f = t.FilterFactory || ($t ? ocg : acg), D = t.enableHWA === !0, F = t.useWasm !== !1, T = l ? l.length : t.length ?? NaN, Q = typeof t.useSystemFonts == "boolean" ? t.useSystemFonts : !$t && !v, P = typeof t.useWorkerFetch == "boolean" ? t.useWorkerFetch : !!(h === C8 && m === t8 && p === i8 && c && u && Z && Or(c, document.baseURI) && Or(u, document.baseURI) && Or(Z, document.baseURI)), L = null;
Log(d);
const E = {
canvasFactory: new y({
ownerDocument: N,
enableHWA: D
}),
filterFactory: new f({
docId: g,
ownerDocument: N
}),
cMapReaderFactory: P ? null : new h({
baseUrl: c,
isCompressed: r
}),
standardFontDataFactory: P ? null : new m({
baseUrl: u
}),
wasmFactory: P ? null : new p({
baseUrl: Z
})
};
if (!a) {
const j = {
verbosity: d,
port: Ql.workerPort
};
a = j.port ? ch.fromPort(j) : new ch(j), I._worker = a;
}
const J = {
docId: g,
apiVersion: "5.1.91",
data: i,
password: s,
disableAutoFetch: w,
rangeChunkSize: n,
length: T,
docBaseUrl: o,
enableXfa: V,
evaluatorOptions: {
maxImageSize: R,
disableFontFace: v,
ignoreErrors: Y,
isEvalSupported: X,
isOffscreenCanvasSupported: H,
isImageDecoderSupported: S,
canvasMaxAreaInBytes: z,
fontExtraProperties: K,
useSystemFonts: Q,
useWasm: F,
useWorkerFetch: P,
cMapUrl: c,
iccUrl: b,
standardFontDataUrl: u,
wasmUrl: Z
}
}, k = {
ownerDocument: N,
pdfBug: W,
styleElement: L,
loadingParams: {
disableAutoFetch: w,
enableXfa: V
}
};
return a.promise.then(function() {
if (I.destroyed)
throw new Error("Loading aborted");
if (a.destroyed)
throw new Error("Worker was destroyed");
const j = a.messageHandler.sendWithPromise("GetDocRequest", J, i ? [i.buffer] : null);
let q;
if (l)
q = new Hcg(l, {
disableRange: B,
disableStream: G
});
else if (!i) {
if (!C)
throw new Error("getDocument - no `url` parameter provided.");
let Cg;
if ($t)
if (Or(C)) {
if (typeof fetch > "u" || typeof Response > "u" || !("body" in Response.prototype))
throw new Error("getDocument - the Fetch API was disabled in Node.js, see `--no-experimental-fetch`.");
Cg = h8;
} else
Cg = jcg;
else
Cg = Or(C) ? h8 : Jcg;
q = new Cg({
url: C,
length: T,
httpHeaders: e,
withCredentials: A,
rangeChunkSize: n,
disableRange: B,
disableStream: G
});
}
return j.then((Cg) => {
if (I.destroyed)
throw new Error("Loading aborted");
if (a.destroyed)
throw new Error("Worker was destroyed");
const Ig = new Qu(g, Cg, a.port), x = new edg(Ig, I, q, k, E);
I._transport = x, Ig.send("Ready", null);
});
}).catch(I._capability.reject), I;
}
function qcg(t) {
if (t instanceof URL)
return t.href;
if (typeof t == "string") {
if ($t)
return t;
const I = URL.parse(t, window.location);
if (I)
return I.href;
}
throw new Error("Invalid PDF url data: either string or URL-object is expected in the url property.");
}
function $cg(t) {
if ($t && typeof Buffer < "u" && t instanceof Buffer)
throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`.");
if (t instanceof Uint8Array && t.byteLength === t.buffer.byteLength)
return t;
if (typeof t == "string")
return eG(t);
if (t instanceof ArrayBuffer || ArrayBuffer.isView(t) || typeof t == "object" && !isNaN(t == null ? void 0 : t.length))
return new Uint8Array(t);
throw new Error("Invalid PDF binary data: either TypedArray, string, or array-like object is expected in the data property.");
}
function LY(t) {
if (typeof t != "string")
return null;
if (t.endsWith("/"))
return t;
throw new Error(`Invalid factory url: "${t}" must include trailing slash.`);
}
const pS = (t) => typeof t == "object" && Number.isInteger(t == null ? void 0 : t.num) && t.num >= 0 && Number.isInteger(t == null ? void 0 : t.gen) && t.gen >= 0, gdg = (t) => typeof t == "object" && typeof (t == null ? void 0 : t.name) == "string", Idg = _og.bind(null, pS, gdg);
var zV;
const JV = class JV {
constructor() {
iI(this, "_capability", Promise.withResolvers());
iI(this, "_transport", null);
iI(this, "_worker", null);
iI(this, "docId", `d${Wi(JV, zV)._++}`);
iI(this, "destroyed", !1);
iI(this, "onPassword", null);
iI(this, "onProgress", null);
}
get promise() {
return this._capability.promise;
}
async destroy() {
var I, g, C, i;
this.destroyed = !0;
try {
(I = this._worker) != null && I.port && (this._worker._pendingDestroy = !0), await ((g = this._transport) == null ? void 0 : g.destroy());
} catch (e) {
throw (C = this._worker) != null && C.port && delete this._worker._pendingDestroy, e;
}
this._transport = null, (i = this._worker) == null || i.destroy(), this._worker = null;
}
async getData() {
return this._transport.getData();
}
};
zV = new WeakMap(), tg(JV, zV, 0);
let BS = JV;
class Hgg {
constructor(I, g, C = !1, i = null) {
this.length = I, this.initialData = g, this.progressiveDone = C, this.contentDispositionFilename = i, this._rangeListeners = [], this._progressListeners = [], this._progressiveReadListeners = [], this._progressiveDoneListeners = [], this._readyCapability = Promise.withResolvers();
}
addRangeListener(I) {
this._rangeListeners.push(I);
}
addProgressListener(I) {
this._progressListeners.push(I);
}
addProgressiveReadListener(I) {
this._progressiveReadListeners.push(I);
}
addProgressiveDoneListener(I) {
this._progressiveDoneListeners.push(I);
}
onDataRange(I, g) {
for (const C of this._rangeListeners)
C(I, g);
}
onDataProgress(I, g) {
this._readyCapability.promise.then(() => {
for (const C of this._progressListeners)
C(I, g);
});
}
onDataProgressiveRead(I) {
this._readyCapability.promise.then(() => {
for (const g of this._progressiveReadListeners)
g(I);
});
}
onDataProgressiveDone() {
this._readyCapability.promise.then(() => {
for (const I of this._progressiveDoneListeners)
I();
});
}
transportReady() {
this._readyCapability.resolve();
}
requestDataRange(I, g) {
BC("Abstract method PDFDataRangeTransport.requestDataRange");
}
abort() {
}
}
class Cdg {
constructor(I, g) {
this._pdfInfo = I, this._transport = g;
}
get annotationStorage() {
return this._transport.annotationStorage;
}
get canvasFactory() {
return this._transport.canvasFactory;
}
get filterFactory() {
return this._transport.filterFactory;
}
get numPages() {
return this._pdfInfo.numPages;
}
get fingerprints() {
return this._pdfInfo.fingerprints;
}
get isPureXfa() {
return UI(this, "isPureXfa", !!this._transport._htmlForXfa);
}
get allXfaHtml() {
return this._transport._htmlForXfa;
}
getPage(I) {
return this._transport.getPage(I);
}
getPageIndex(I) {
return this._transport.getPageIndex(I);
}
getDestinations() {
return this._transport.getDestinations();
}
getDestination(I) {
return this._transport.getDestination(I);
}
getPageLabels() {
return this._transport.getPageLabels();
}
getPageLayout() {
return this._transport.getPageLayout();
}
getPageMode() {
return this._transport.getPageMode();
}
getViewerPreferences() {
return this._transport.getViewerPreferences();
}
getOpenAction() {
return this._transport.getOpenAction();
}
getAttachments() {
return this._transport.getAttachments();
}
getJSActions() {
return this._transport.getDocJSActions();
}
getOutline() {
return this._transport.getOutline();
}
getOptionalContentConfig({
intent: I = "display"
} = {}) {
const {
renderingIntent: g
} = this._transport.getRenderingIntent(I);
return this._transport.getOptionalContentConfig(g);
}
getPermissions() {
return this._transport.getPermissions();
}
getMetadata() {
return this._transport.getMetadata();
}
getMarkInfo() {
return this._transport.getMarkInfo();
}
getData() {
return this._transport.getData();
}
saveDocument() {
return this._transport.saveDocument();
}
getDownloadInfo() {
return this._transport.downloadInfoCapability.promise;
}
cleanup(I = !1) {
return this._transport.startCleanup(I || this.isPureXfa);
}
destroy() {
return this.loadingTask.destroy();
}
cachedPageNumber(I) {
return this._transport.cachedPageNumber(I);
}
get loadingParams() {
return this._transport.loadingParams;
}
get loadingTask() {
return this._transport.loadingTask;
}
getFieldObjects() {
return this._transport.getFieldObjects();
}
hasJSActions() {
return this._transport.hasJSActions();
}
getCalculationOrderIds() {
return this._transport.getCalculationOrderIds();
}
}
var Rl, fc, _u;
class tdg {
constructor(I, g, C, i = !1) {
tg(this, fc);
tg(this, Rl, !1);
this._pageIndex = I, this._pageInfo = g, this._transport = C, this._stats = i ? new $6() : null, this._pdfBug = i, this.commonObjs = C.commonObjs, this.objs = new Xgg(), this._intentStates = /* @__PURE__ */ new Map(), this.destroyed = !1;
}
get pageNumber() {
return this._pageIndex + 1;
}
get rotate() {
return this._pageInfo.rotate;
}
get ref() {
return this._pageInfo.ref;
}
get userUnit() {
return this._pageInfo.userUnit;
}
get view() {
return this._pageInfo.view;
}
getViewport({
scale: I,
rotation: g = this.rotate,
offsetX: C = 0,
offsetY: i = 0,
dontFlip: e = !1
} = {}) {
return new sG({
viewBox: this.view,
userUnit: this.userUnit,
scale: I,
rotation: g,
offsetX: C,
offsetY: i,
dontFlip: e
});
}
getAnnotations({
intent: I = "display"
} = {}) {
const {
renderingIntent: g
} = this._transport.getRenderingIntent(I);
return this._transport.getAnnotations(this._pageIndex, g);
}
getJSActions() {
return this._transport.getPageJSActions(this._pageIndex);
}
get filterFactory() {
return this._transport.filterFactory;
}
get isPureXfa() {
return UI(this, "isPureXfa", !!this._transport._htmlForXfa);
}
async getXfa() {
var I;
return ((I = this._transport._htmlForXfa) == null ? void 0 : I.children[this._pageIndex]) || null;
}
render({
canvasContext: I,
viewport: g,
intent: C = "display",
annotationMode: i = la.ENABLE,
transform: e = null,
background: A = null,
optionalContentConfigPromise: s = null,
annotationCanvasMap: l = null,
pageColors: n = null,
printAnnotationStorage: a = null,
isEditing: d = !1
}) {
var p, Y;
(p = this._stats) == null || p.time("Overall");
const o = this._transport.getRenderingIntent(C, i, a, d), {
renderingIntent: c,
cacheKey: r
} = o;
$(this, Rl, !1), s || (s = this._transport.getOptionalContentConfig(c));
let h = this._intentStates.get(r);
h || (h = /* @__PURE__ */ Object.create(null), this._intentStates.set(r, h)), h.streamReaderCancelTimeout && (clearTimeout(h.streamReaderCancelTimeout), h.streamReaderCancelTimeout = null);
const b = !!(c & ye.PRINT);
h.displayReadyCapability || (h.displayReadyCapability = Promise.withResolvers(), h.operatorList = {
fnArray: [],
argsArray: [],
lastChunk: !1,
separateAnnots: null
}, (Y = this._stats) == null || Y.time("Page Request"), this._pumpOperatorList(o));
const u = (R) => {
var X;
h.renderTasks.delete(m), b && $(this, Rl, !0), ig(this, fc, _u).call(this), R ? (m.capability.reject(R), this._abortOperatorList({
intentState: h,
reason: R instanceof Error ? R : new Error(R)
})) : m.capability.resolve(), this._stats && (this._stats.timeEnd("Rendering"), this._stats.timeEnd("Overall"), (X = globalThis.Stats) != null && X.enabled && globalThis.Stats.add(this.pageNumber, this._stats));
}, m = new yS({
callback: u,
params: {
canvasContext: I,
viewport: g,
transform: e,
background: A
},
objs: this.objs,
commonObjs: this.commonObjs,
annotationCanvasMap: l,
operatorList: h.operatorList,
pageIndex: this._pageIndex,
canvasFactory: this._transport.canvasFactory,
filterFactory: this._transport.filterFactory,
useRequestAnimationFrame: !b,
pdfBug: this._pdfBug,
pageColors: n
});
(h.renderTasks || (h.renderTasks = /* @__PURE__ */ new Set())).add(m);
const Z = m.task;
return Promise.all([h.displayReadyCapability.promise, s]).then(([R, X]) => {
var H;
if (this.destroyed) {
u();
return;
}
if ((H = this._stats) == null || H.time("Rendering"), !(X.renderingIntent & c))
throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` and `PDFDocumentProxy.getOptionalContentConfig` methods.");
m.initializeGraphics({
transparency: R,
optionalContentConfig: X
}), m.operatorListChanged();
}).catch(u), Z;
}
getOperatorList({
intent: I = "display",
annotationMode: g = la.ENABLE,
printAnnotationStorage: C = null,
isEditing: i = !1
} = {}) {
var n;
function e() {
s.operatorList.lastChunk && (s.opListReadCapability.resolve(s.operatorList), s.renderTasks.delete(l));
}
const A = this._transport.getRenderingIntent(I, g, C, i, !0);
let s = this._intentStates.get(A.cacheKey);
s || (s = /* @__PURE__ */ Object.create(null), this._intentStates.set(A.cacheKey, s));
let l;
return s.opListReadCapability || (l = /* @__PURE__ */ Object.create(null), l.operatorListChanged = e, s.opListReadCapability = Promise.withResolvers(), (s.renderTasks || (s.renderTasks = /* @__PURE__ */ new Set())).add(l), s.operatorList = {
fnArray: [],
argsArray: [],
lastChunk: !1,
separateAnnots: null
}, (n = this._stats) == null || n.time("Page Request"), this._pumpOperatorList(A)), s.opListReadCapability.promise;
}
streamTextContent({
includeMarkedContent: I = !1,
disableNormalization: g = !1
} = {}) {
return this._transport.messageHandler.sendWithStream("GetTextContent", {
pageIndex: this._pageIndex,
includeMarkedContent: I === !0,
disableNormalization: g === !0
}, {
highWaterMark: 100,
size(i) {
return i.items.length;
}
});
}
getTextContent(I = {}) {
if (this._transport._htmlForXfa)
return this.getXfa().then((C) => Rm.textContent(C));
const g = this.streamTextContent(I);
return new Promise(function(C, i) {
function e() {
A.read().then(function({
value: l,
done: n
}) {
if (n) {
C(s);
return;
}
s.lang ?? (s.lang = l.lang), Object.assign(s.styles, l.styles), s.items.push(...l.items), e();
}, i);
}
const A = g.getReader(), s = {
items: [],
styles: /* @__PURE__ */ Object.create(null),
lang: null
};
e();
});
}
getStructTree() {
return this._transport.getStructTree(this._pageIndex);
}
_destroy() {
this.destroyed = !0;
const I = [];
for (const g of this._intentStates.values())
if (this._abortOperatorList({
intentState: g,
reason: new Error("Page was destroyed."),
force: !0
}), !g.opListReadCapability)
for (const C of g.renderTasks)
I.push(C.completed), C.cancel();
return this.objs.clear(), $(this, Rl, !1), Promise.all(I);
}
cleanup(I = !1) {
$(this, Rl, !0);
const g = ig(this, fc, _u).call(this);
return I && g && this._stats && (this._stats = new $6()), g;
}
_startRenderPage(I, g) {
var i, e;
const C = this._intentStates.get(g);
C && ((i = this._stats) == null || i.timeEnd("Page Request"), (e = C.displayReadyCapability) == null || e.resolve(I));
}
_renderPageChunk(I, g) {
for (let C = 0, i = I.length; C < i; C++)
g.operatorList.fnArray.push(I.fnArray[C]), g.operatorList.argsArray.push(I.argsArray[C]);
g.operatorList.lastChunk = I.lastChunk, g.operatorList.separateAnnots = I.separateAnnots;
for (const C of g.renderTasks)
C.operatorListChanged();
I.lastChunk && ig(this, fc, _u).call(this);
}
_pumpOperatorList({
renderingIntent: I,
cacheKey: g,
annotationStorageSerializable: C,
modifiedIds: i
}) {
const {
map: e,
transfer: A
} = C, l = this._transport.messageHandler.sendWithStream("GetOperatorList", {
pageIndex: this._pageIndex,
intent: I,
cacheKey: g,
annotationStorage: e,
modifiedIds: i
}, A).getReader(), n = this._intentStates.get(g);
n.streamReader = l;
const a = () => {
l.read().then(({
value: d,
done: o
}) => {
if (o) {
n.streamReader = null;
return;
}
this._transport.destroyed || (this._renderPageChunk(d, n), a());
}, (d) => {
if (n.streamReader = null, !this._transport.destroyed) {
if (n.operatorList) {
n.operatorList.lastChunk = !0;
for (const o of n.renderTasks)
o.operatorListChanged();
ig(this, fc, _u).call(this);
}
if (n.displayReadyCapability)
n.displayReadyCapability.reject(d);
else if (n.opListReadCapability)
n.opListReadCapability.reject(d);
else
throw d;
}
});
};
a();
}
_abortOperatorList({
intentState: I,
reason: g,
force: C = !1
}) {
if (I.streamReader) {
if (I.streamReaderCancelTimeout && (clearTimeout(I.streamReaderCancelTimeout), I.streamReaderCancelTimeout = null), !C) {
if (I.renderTasks.size > 0)
return;
if (g instanceof r9) {
let i = Pcg;
g.extraDelay > 0 && g.extraDelay < 1e3 && (i += g.extraDelay), I.streamReaderCancelTimeout = setTimeout(() => {
I.streamReaderCancelTimeout = null, this._abortOperatorList({
intentState: I,
reason: g,
force: !0
});
}, i);
return;
}
}
if (I.streamReader.cancel(new Ea(g.message)).catch(() => {
}), I.streamReader = null, !this._transport.destroyed) {
for (const [i, e] of this._intentStates)
if (e === I) {
this._intentStates.delete(i);
break;
}
this.cleanup();
}
}
}
get stats() {
return this._stats;
}
}
Rl = new WeakMap(), fc = new WeakSet(), _u = function() {
if (!M(this, Rl) || this.destroyed)
return !1;
for (const {
renderTasks: I,
operatorList: g
} of this._intentStates.values())
if (I.size > 0 || !g.lastChunk)
return !1;
return this._intentStates.clear(), this.objs.clear(), $(this, Rl, !1), !0;
};
var fl, LV;
class idg {
constructor() {
tg(this, fl, /* @__PURE__ */ new Map());
tg(this, LV, Promise.resolve());
}
postMessage(I, g) {
const C = {
data: structuredClone(I, g ? {
transfer: g
} : null)
};
M(this, LV).then(() => {
for (const [i] of M(this, fl))
i.call(this, C);
});
}
addEventListener(I, g, C = null) {
let i = null;
if ((C == null ? void 0 : C.signal) instanceof AbortSignal) {
const {
signal: e
} = C;
if (e.aborted) {
DI("LoopbackPort - cannot use an `aborted` signal.");
return;
}
const A = () => this.removeEventListener(I, g);
i = () => e.removeEventListener("abort", A), e.addEventListener("abort", A);
}
M(this, fl).set(g, i);
}
removeEventListener(I, g) {
const C = M(this, fl).get(g);
C == null || C(), M(this, fl).delete(g);
}
terminate() {
for (const [, I] of M(this, fl))
I == null || I();
M(this, fl).clear();
}
}
fl = new WeakMap(), LV = new WeakMap();
var vV, Hc, Xc, jh, pN, Qh, BN;
const FC = class FC {
constructor({
name: I = null,
port: g = null,
verbosity: C = vog()
} = {}) {
tg(this, jh);
var i;
if (this.name = I, this.destroyed = !1, this.verbosity = C, this._readyCapability = Promise.withResolvers(), this._port = null, this._webWorker = null, this._messageHandler = null, g) {
if ((i = M(FC, Xc)) != null && i.has(g))
throw new Error("Cannot use more than one PDFWorker per port.");
(M(FC, Xc) || $(FC, Xc, /* @__PURE__ */ new WeakMap())).set(g, this), this._initializeFromPort(g);
return;
}
this._initialize();
}
get promise() {
return this._readyCapability.promise;
}
get port() {
return this._port;
}
get messageHandler() {
return this._messageHandler;
}
_initializeFromPort(I) {
this._port = I, this._messageHandler = new Qu("main", "worker", I), this._messageHandler.on("ready", function() {
}), ig(this, jh, pN).call(this);
}
_initialize() {
if (M(FC, Hc) || M(FC, Qh, BN)) {
this._setupFakeWorker();
return;
}
let {
workerSrc: I
} = FC;
try {
FC._isSameOrigin(window.location, I) || (I = FC._createCDNWrapper(new URL(I, window.location).href));
const g = new Worker(I, {
type: "module"
}), C = new Qu("main", "worker", g), i = () => {
e.abort(), C.destroy(), g.terminate(), this.destroyed ? this._readyCapability.reject(new Error("Worker was destroyed")) : this._setupFakeWorker();
}, e = new AbortController();
g.addEventListener("error", () => {
this._webWorker || i();
}, {
signal: e.signal
}), C.on("test", (s) => {
if (e.abort(), this.destroyed || !s) {
i();
return;
}
this._messageHandler = C, this._port = g, this._webWorker = g, ig(this, jh, pN).call(this);
}), C.on("ready", (s) => {
if (e.abort(), this.destroyed) {
i();
return;
}
try {
A();
} catch {
this._setupFakeWorker();
}
});
const A = () => {
const s = new Uint8Array();
C.send("test", s, [s.buffer]);
};
A();
return;
} catch {
qV("The worker has been disabled.");
}
this._setupFakeWorker();
}
_setupFakeWorker() {
M(FC, Hc) || (DI("Setting up fake worker."), $(FC, Hc, !0)), FC._setupFakeWorkerGlobal.then((I) => {
if (this.destroyed) {
this._readyCapability.reject(new Error("Worker was destroyed"));
return;
}
const g = new idg();
this._port = g;
const C = `fake${Wi(FC, vV)._++}`, i = new Qu(C + "_worker", C, g);
I.setup(i, g), this._messageHandler = new Qu(C, C + "_worker", g), ig(this, jh, pN).call(this);
}).catch((I) => {
this._readyCapability.reject(new Error(`Setting up fake worker failed: "${I.message}".`));
});
}
destroy() {
var I, g, C;
this.destroyed = !0, (I = this._webWorker) == null || I.terminate(), this._webWorker = null, (g = M(FC, Xc)) == null || g.delete(this._port), this._port = null, (C = this._messageHandler) == null || C.destroy(), this._messageHandler = null;
}
static fromPort(I) {
var C;
if (!(I != null && I.port))
throw new Error("PDFWorker.fromPort - invalid method signature.");
const g = (C = M(this, Xc)) == null ? void 0 : C.get(I.port);
if (g) {
if (g._pendingDestroy)
throw new Error("PDFWorker.fromPort - the worker is being destroyed.\nPlease remember to await `PDFDocumentLoadingTask.destroy()`-calls.");
return g;
}
return new FC(I);
}
static get workerSrc() {
if (Ql.workerSrc)
return Ql.workerSrc;
throw new Error('No "GlobalWorkerOptions.workerSrc" specified.');
}
static get _setupFakeWorkerGlobal() {
return UI(this, "_setupFakeWorkerGlobal", (async () => M(this, Qh, BN) ? M(this, Qh, BN) : (await import(
/*webpackIgnore: true*/
/*@vite-ignore*/
this.workerSrc
)).WorkerMessageHandler)());
}
};
vV = new WeakMap(), Hc = new WeakMap(), Xc = new WeakMap(), jh = new WeakSet(), pN = function() {
this._readyCapability.resolve(), this._messageHandler.send("configure", {
verbosity: this.verbosity
});
}, Qh = new WeakSet(), BN = function() {
var I;
try {
return ((I = globalThis.pdfjsWorker) == null ? void 0 : I.WorkerMessageHandler) || null;
} catch {
return null;
}
}, tg(FC, Qh), tg(FC, vV, 0), tg(FC, Hc, !1), tg(FC, Xc), $t && ($(FC, Hc, !0), Ql.workerSrc || (Ql.workerSrc = "./pdf.worker.mjs")), FC._isSameOrigin = (I, g) => {
const C = URL.parse(I);
if (!(C != null && C.origin) || C.origin === "null")
return !1;
const i = new URL(g, C);
return C.origin === i.origin;
}, FC._createCDNWrapper = (I) => {
const g = `await import("${I}");`;
return URL.createObjectURL(new Blob([g], {
type: "text/javascript"
}));
};
let ch = FC;
var Hl, ys, Oh, Uh, Xl, Sc, qu;
class edg {
constructor(I, g, C, i, e) {
tg(this, Sc);
tg(this, Hl, /* @__PURE__ */ new Map());
tg(this, ys, /* @__PURE__ */ new Map());
tg(this, Oh, /* @__PURE__ */ new Map());
tg(this, Uh, /* @__PURE__ */ new Map());
tg(this, Xl, null);
this.messageHandler = I, this.loadingTask = g, this.commonObjs = new Xgg(), this.fontLoader = new scg({
ownerDocument: i.ownerDocument,
styleElement: i.styleElement
}), this.loadingParams = i.loadingParams, this._params = i, this.canvasFactory = e.canvasFactory, this.filterFactory = e.filterFactory, this.cMapReaderFactory = e.cMapReaderFactory, this.standardFontDataFactory = e.standardFontDataFactory, this.wasmFactory = e.wasmFactory, this.destroyed = !1, this.destroyCapability = null, this._networkStream = C, this._fullReader = null, this._lastProgress = null, this.downloadInfoCapability = Promise.withResolvers(), this.setupMessageHandler();
}
get annotationStorage() {
return UI(this, "annotationStorage", new Z9());
}
getRenderingIntent(I, g = la.ENABLE, C = null, i = !1, e = !1) {
let A = ye.DISPLAY, s = oS;
switch (I) {
case "any":
A = ye.ANY;
break;
case "display":
break;
case "print":
A = ye.PRINT;
break;
default:
DI(`getRenderingIntent - invalid intent: ${I}`);
}
const l = A & ye.PRINT && C instanceof cgg ? C : this.annotationStorage;
switch (g) {
case la.DISABLE:
A += ye.ANNOTATIONS_DISABLE;
break;
case la.ENABLE:
break;
case la.ENABLE_FORMS:
A += ye.ANNOTATIONS_FORMS;
break;
case la.ENABLE_STORAGE:
A += ye.ANNOTATIONS_STORAGE, s = l.serializable;
break;
default:
DI(`getRenderingIntent - invalid annotationMode: ${g}`);
}
i && (A += ye.IS_EDITING), e && (A += ye.OPLIST);
const {
ids: n,
hash: a
} = l.modifiedIds, d = [A, s.hash, a];
return {
renderingIntent: A,
cacheKey: d.join("_"),
annotationStorageSerializable: s,
modifiedIds: n
};
}
destroy() {
var C;
if (this.destroyCapability)
return this.destroyCapability.promise;
this.destroyed = !0, this.destroyCapability = Promise.withResolvers(), (C = M(this, Xl)) == null || C.reject(new Error("Worker was destroyed during onPassword callback"));
const I = [];
for (const i of M(this, ys).values())
I.push(i._destroy());
M(this, ys).clear(), M(this, Oh).clear(), M(this, Uh).clear(), this.hasOwnProperty("annotationStorage") && this.annotationStorage.resetModified();
const g = this.messageHandler.sendWithPromise("Terminate", null);
return I.push(g), Promise.all(I).then(() => {
var i, e;
this.commonObjs.clear(), this.fontLoader.clear(), M(this, Hl).clear(), this.filterFactory.destroy(), Mm.cleanup(), (i = this._networkStream) == null || i.cancelAllRequests(new Ea("Worker was terminated.")), (e = this.messageHandler) == null || e.destroy(), this.messageHandler = null, this.destroyCapability.resolve();
}, this.destroyCapability.reject), this.destroyCapability.promise;
}
setupMessageHandler() {
const {
messageHandler: I,
loadingTask: g
} = this;
I.on("GetReader", (C, i) => {
ut(this._networkStream, "GetReader - no `IPDFStream` instance available."), this._fullReader = this._networkStream.getFullReader(), this._fullReader.onProgress = (e) => {
this._lastProgress = {
loaded: e.loaded,
total: e.total
};
}, i.onPull = () => {
this._fullReader.read().then(function({
value: e,
done: A
}) {
if (A) {
i.close();
return;
}
ut(e instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer."), i.enqueue(new Uint8Array(e), 1, [e]);
}).catch((e) => {
i.error(e);
});
}, i.onCancel = (e) => {
this._fullReader.cancel(e), i.ready.catch((A) => {
if (!this.destroyed)
throw A;
});
};
}), I.on("ReaderHeadersReady", async (C) => {
var s;
await this._fullReader.headersReady;
const {
isStreamingSupported: i,
isRangeSupported: e,
contentLength: A
} = this._fullReader;
return (!i || !e) && (this._lastProgress && ((s = g.onProgress) == null || s.call(g, this._lastProgress)), this._fullReader.onProgress = (l) => {
var n;
(n = g.onProgress) == null || n.call(g, {
loaded: l.loaded,
total: l.total
});
}), {
isStreamingSupported: i,
isRangeSupported: e,
contentLength: A
};
}), I.on("GetRangeReader", (C, i) => {
ut(this._networkStream, "GetRangeReader - no `IPDFStream` instance available.");
const e = this._networkStream.getRangeReader(C.begin, C.end);
if (!e) {
i.close();
return;
}
i.onPull = () => {
e.read().then(function({
value: A,
done: s
}) {
if (s) {
i.close();
return;
}
ut(A instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer."), i.enqueue(new Uint8Array(A), 1, [A]);
}).catch((A) => {
i.error(A);
});
}, i.onCancel = (A) => {
e.cancel(A), i.ready.catch((s) => {
if (!this.destroyed)
throw s;
});
};
}), I.on("GetDoc", ({
pdfInfo: C
}) => {
this._numPages = C.numPages, this._htmlForXfa = C.htmlForXfa, delete C.htmlForXfa, g._capability.resolve(new Cdg(C, this));
}), I.on("DocException", (C) => {
g._capability.reject(xi(C));
}), I.on("PasswordRequest", (C) => {
$(this, Xl, Promise.withResolvers());
try {
if (!g.onPassword)
throw xi(C);
const i = (e) => {
e instanceof Error ? M(this, Xl).reject(e) : M(this, Xl).resolve({
password: e
});
};
g.onPassword(i, C.code);
} catch (i) {
M(this, Xl).reject(i);
}
return M(this, Xl).promise;
}), I.on("DataLoaded", (C) => {
var i;
(i = g.onProgress) == null || i.call(g, {
loaded: C.length,
total: C.length
}), this.downloadInfoCapability.resolve(C);
}), I.on("StartRenderPage", (C) => {
if (this.destroyed)
return;
M(this, ys).get(C.pageIndex)._startRenderPage(C.transparency, C.cacheKey);
}), I.on("commonobj", ([C, i, e]) => {
var A;
if (this.destroyed || this.commonObjs.has(C))
return null;
switch (i) {
case "Font":
if ("error" in e) {
const a = e.error;
DI(`Error during font loading: ${a}`), this.commonObjs.resolve(C, a);
break;
}
const s = this._params.pdfBug && ((A = globalThis.FontInspector) != null && A.enabled) ? (a, d) => globalThis.FontInspector.fontAdded(a, d) : null, l = new lcg(e, s);
this.fontLoader.bind(l).catch(() => I.sendWithPromise("FontFallback", {
id: C
})).finally(() => {
!l.fontExtraProperties && l.data && (l.data = null), this.commonObjs.resolve(C, l);
});
break;
case "CopyLocalImage":
const {
imageRef: n
} = e;
ut(n, "The imageRef must be defined.");
for (const a of M(this, ys).values())
for (const [, d] of a.objs)
if ((d == null ? void 0 : d.ref) === n)
return d.dataLen ? (this.commonObjs.resolve(C, structuredClone(d)), d.dataLen) : null;
break;
case "FontPath":
case "Image":
case "Pattern":
this.commonObjs.resolve(C, e);
break;
default:
throw new Error(`Got unknown common object type ${i}`);
}
return null;
}), I.on("obj", ([C, i, e, A]) => {
var l;
if (this.destroyed)
return;
const s = M(this, ys).get(i);
if (!s.objs.has(C)) {
if (s._intentStates.size === 0) {
(l = A == null ? void 0 : A.bitmap) == null || l.close();
return;
}
switch (e) {
case "Image":
case "Pattern":
s.objs.resolve(C, A);
break;
default:
throw new Error(`Got unknown object type ${e}`);
}
}
}), I.on("DocProgress", (C) => {
var i;
this.destroyed || (i = g.onProgress) == null || i.call(g, {
loaded: C.loaded,
total: C.total
});
}), I.on("FetchBinaryData", async (C) => {
if (this.destroyed)
throw new Error("Worker was destroyed.");
const i = this[C.type];
if (!i)
throw new Error(`${C.type} not initialized, see the \`useWorkerFetch\` parameter.`);
return i.fetch(C);
});
}
getData() {
return this.messageHandler.sendWithPromise("GetData", null);
}
saveDocument() {
var C;
this.annotationStorage.size <= 0 && DI("saveDocument called while `annotationStorage` is empty, please use the getData-method instead.");
const {
map: I,
transfer: g
} = this.annotationStorage.serializable;
return this.messageHandler.sendWithPromise("SaveDocument", {
isPureXfa: !!this._htmlForXfa,
numPages: this._numPages,
annotationStorage: I,
filename: ((C = this._fullReader) == null ? void 0 : C.filename) ?? null
}, g).finally(() => {
this.annotationStorage.resetModified();
});
}
getPage(I) {
if (!Number.isInteger(I) || I <= 0 || I > this._numPages)
return Promise.reject(new Error("Invalid page request."));
const g = I - 1, C = M(this, Oh).get(g);
if (C)
return C;
const i = this.messageHandler.sendWithPromise("GetPage", {
pageIndex: g
}).then((e) => {
if (this.destroyed)
throw new Error("Transport destroyed");
e.refStr && M(this, Uh).set(e.refStr, I);
const A = new tdg(g, e, this, this._params.pdfBug);
return M(this, ys).set(g, A), A;
});
return M(this, Oh).set(g, i), i;
}
getPageIndex(I) {
return pS(I) ? this.messageHandler.sendWithPromise("GetPageIndex", {
num: I.num,
gen: I.gen
}) : Promise.reject(new Error("Invalid pageIndex request."));
}
getAnnotations(I, g) {
return this.messageHandler.sendWithPromise("GetAnnotations", {
pageIndex: I,
intent: g
});
}
getFieldObjects() {
return ig(this, Sc, qu).call(this, "GetFieldObjects");
}
hasJSActions() {
return ig(this, Sc, qu).call(this, "HasJSActions");
}
getCalculationOrderIds() {
return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null);
}
getDestinations() {
return this.messageHandler.sendWithPromise("GetDestinations", null);
}
getDestination(I) {
return typeof I != "string" ? Promise.reject(new Error("Invalid destination request.")) : this.messageHandler.sendWithPromise("GetDestination", {
id: I
});
}
getPageLabels() {
return this.messageHandler.sendWithPromise("GetPageLabels", null);
}
getPageLayout() {
return this.messageHandler.sendWithPromise("GetPageLayout", null);
}
getPageMode() {
return this.messageHandler.sendWithPromise("GetPageMode", null);
}
getViewerPreferences() {
return this.messageHandler.sendWithPromise("GetViewerPreferences", null);
}
getOpenAction() {
return this.messageHandler.sendWithPromise("GetOpenAction", null);
}
getAttachments() {
return this.messageHandler.sendWithPromise("GetAttachments", null);
}
getDocJSActions() {
return ig(this, Sc, qu).call(this, "GetDocJSActions");
}
getPageJSActions(I) {
return this.messageHandler.sendWithPromise("GetPageJSActions", {
pageIndex: I
});
}
getStructTree(I) {
return this.messageHandler.sendWithPromise("GetStructTree", {
pageIndex: I
});
}
getOutline() {
return this.messageHandler.sendWithPromise("GetOutline", null);
}
getOptionalContentConfig(I) {
return ig(this, Sc, qu).call(this, "GetOptionalContentConfig").then((g) => new fcg(g, I));
}
getPermissions() {
return this.messageHandler.sendWithPromise("GetPermissions", null);
}
getMetadata() {
const I = "GetMetadata", g = M(this, Hl).get(I);
if (g)
return g;
const C = this.messageHandler.sendWithPromise(I, null).then((i) => {
var e, A;
return {
info: i[0],
metadata: i[1] ? new Mcg(i[1]) : null,
contentDispositionFilename: ((e = this._fullReader) == null ? void 0 : e.filename) ?? null,
contentLength: ((A = this._fullReader) == null ? void 0 : A.contentLength) ?? null
};
});
return M(this, Hl).set(I, C), C;
}
getMarkInfo() {
return this.messageHandler.sendWithPromise("GetMarkInfo", null);
}
async startCleanup(I = !1) {
if (!this.destroyed) {
await this.messageHandler.sendWithPromise("Cleanup", null);
for (const g of M(this, ys).values())
if (!g.cleanup())
throw new Error(`startCleanup: Page ${g.pageNumber} is currently rendering.`);
this.commonObjs.clear(), I || this.fontLoader.clear(), M(this, Hl).clear(), this.filterFactory.destroy(!0), Mm.cleanup();
}
}
cachedPageNumber(I) {
if (!pS(I))
return null;
const g = I.gen === 0 ? `${I.num}R` : `${I.num}R${I.gen}`;
return M(this, Uh).get(g) ?? null;
}
}
Hl = new WeakMap(), ys = new WeakMap(), Oh = new WeakMap(), Uh = new WeakMap(), Xl = new WeakMap(), Sc = new WeakSet(), qu = function(I, g = null) {
const C = M(this, Hl).get(I);
if (C)
return C;
const i = this.messageHandler.sendWithPromise(I, g);
return M(this, Hl).set(I, i), i;
};
const Xu = Symbol("INITIAL_DATA");
var he, wZ, WS;
class Xgg {
constructor() {
tg(this, wZ);
tg(this, he, /* @__PURE__ */ Object.create(null));
}
get(I, g = null) {
if (g) {
const i = ig(this, wZ, WS).call(this, I);
return i.promise.then(() => g(i.data)), null;
}
const C = M(this, he)[I];
if (!C || C.data === Xu)
throw new Error(`Requesting object that isn't resolved yet ${I}.`);
return C.data;
}
has(I) {
const g = M(this, he)[I];
return !!g && g.data !== Xu;
}
delete(I) {
const g = M(this, he)[I];
return !g || g.data === Xu ? !1 : (delete M(this, he)[I], !0);
}
resolve(I, g = null) {
const C = ig(this, wZ, WS).call(this, I);
C.data = g, C.resolve();
}
clear() {
var I;
for (const g in M(this, he)) {
const {
data: C
} = M(this, he)[g];
(I = C == null ? void 0 : C.bitmap) == null || I.close();
}
$(this, he, /* @__PURE__ */ Object.create(null));
}
*[Symbol.iterator]() {
for (const I in M(this, he)) {
const {
data: g
} = M(this, he)[I];
g !== Xu && (yield [I, g]);
}
}
}
he = new WeakMap(), wZ = new WeakSet(), WS = function(I) {
var g;
return (g = M(this, he))[I] || (g[I] = {
...Promise.withResolvers(),
data: Xu
});
};
var Ma;
class Adg {
constructor(I) {
tg(this, Ma, null);
iI(this, "onContinue", null);
iI(this, "onError", null);
$(this, Ma, I);
}
get promise() {
return M(this, Ma).capability.promise;
}
cancel(I = 0) {
M(this, Ma).cancel(null, I);
}
get separateAnnots() {
const {
separateAnnots: I
} = M(this, Ma).operatorList;
if (!I)
return !1;
const {
annotationCanvasMap: g
} = M(this, Ma);
return I.form || I.canvas && (g == null ? void 0 : g.size) > 0;
}
}
Ma = new WeakMap();
var Ra, Dc;
const qo = class qo {
constructor({
callback: I,
params: g,
objs: C,
commonObjs: i,
annotationCanvasMap: e,
operatorList: A,
pageIndex: s,
canvasFactory: l,
filterFactory: n,
useRequestAnimationFrame: a = !1,
pdfBug: d = !1,
pageColors: o = null
}) {
tg(this, Ra, null);
this.callback = I, this.params = g, this.objs = C, this.commonObjs = i, this.annotationCanvasMap = e, this.operatorListIdx = null, this.operatorList = A, this._pageIndex = s, this.canvasFactory = l, this.filterFactory = n, this._pdfBug = d, this.pageColors = o, this.running = !1, this.graphicsReadyCallback = null, this.graphicsReady = !1, this._useRequestAnimationFrame = a === !0 && typeof window < "u", this.cancelled = !1, this.capability = Promise.withResolvers(), this.task = new Adg(this), this._cancelBound = this.cancel.bind(this), this._continueBound = this._continue.bind(this), this._scheduleNextBound = this._scheduleNext.bind(this), this._nextBound = this._next.bind(this), this._canvas = g.canvasContext.canvas;
}
get completed() {
return this.capability.promise.catch(function() {
});
}
initializeGraphics({
transparency: I = !1,
optionalContentConfig: g
}) {
var s, l;
if (this.cancelled)
return;
if (this._canvas) {
if (M(qo, Dc).has(this._canvas))
throw new Error("Cannot use the same canvas during multiple render() operations. Use different canvas or ensure previous operations were cancelled or completed.");
M(qo, Dc).add(this._canvas);
}
this._pdfBug && ((s = globalThis.StepperManager) != null && s.enabled) && (this.stepper = globalThis.StepperManager.create(this._pageIndex), this.stepper.init(this.operatorList), this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint());
const {
canvasContext: C,
viewport: i,
transform: e,
background: A
} = this.params;
this.gfx = new oh(C, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {
optionalContentConfig: g
}, this.annotationCanvasMap, this.pageColors), this.gfx.beginDrawing({
transform: e,
viewport: i,
transparency: I,
background: A
}), this.operatorListIdx = 0, this.graphicsReady = !0, (l = this.graphicsReadyCallback) == null || l.call(this);
}
cancel(I = null, g = 0) {
var C, i, e;
this.running = !1, this.cancelled = !0, (C = this.gfx) == null || C.endDrawing(), M(this, Ra) && (window.cancelAnimationFrame(M(this, Ra)), $(this, Ra, null)), M(qo, Dc).delete(this._canvas), I || (I = new r9(`Rendering cancelled, page ${this._pageIndex + 1}`, g)), this.callback(I), (e = (i = this.task).onError) == null || e.call(i, I);
}
operatorListChanged() {
var I;
if (!this.graphicsReady) {
this.graphicsReadyCallback || (this.graphicsReadyCallback = this._continueBound);
return;
}
(I = this.stepper) == null || I.updateOperatorList(this.operatorList), !this.running && this._continue();
}
_continue() {
this.running = !0, !this.cancelled && (this.task.onContinue ? this.task.onContinue(this._scheduleNextBound) : this._scheduleNext());
}
_scheduleNext() {
this._useRequestAnimationFrame ? $(this, Ra, window.requestAnimationFrame(() => {
$(this, Ra, null), this._nextBound().catch(this._cancelBound);
})) : Promise.resolve().then(this._nextBound).catch(this._cancelBound);
}
async _next() {
this.cancelled || (this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper), this.operatorListIdx === this.operatorList.argsArray.length && (this.running = !1, this.operatorList.lastChunk && (this.gfx.endDrawing(), M(qo, Dc).delete(this._canvas), this.callback())));
}
};
Ra = new WeakMap(), Dc = new WeakMap(), tg(qo, Dc, /* @__PURE__ */ new WeakSet());
let yS = qo;
const sdg = "5.1.91", ldg = "45cbe8bb0";
function u8(t) {
return Math.floor(Math.max(0, Math.min(1, t)) * 255).toString(16).padStart(2, "0");
}
function Su(t) {
return Math.max(0, Math.min(255, 255 * t));
}
class m8 {
static CMYK_G([I, g, C, i]) {
return ["G", 1 - Math.min(1, 0.3 * I + 0.59 * C + 0.11 * g + i)];
}
static G_CMYK([I]) {
return ["CMYK", 0, 0, 0, 1 - I];
}
static G_RGB([I]) {
return ["RGB", I, I, I];
}
static G_rgb([I]) {
return I = Su(I), [I, I, I];
}
static G_HTML([I]) {
const g = u8(I);
return `#${g}${g}${g}`;
}
static RGB_G([I, g, C]) {
return ["G", 0.3 * I + 0.59 * g + 0.11 * C];
}
static RGB_rgb(I) {
return I.map(Su);
}
static RGB_HTML(I) {
return `#${I.map(u8).join("")}`;
}
static T_HTML() {
return "#00000000";
}
static T_rgb() {
return [null];
}
static CMYK_RGB([I, g, C, i]) {
return ["RGB", 1 - Math.min(1, I + i), 1 - Math.min(1, C + i), 1 - Math.min(1, g + i)];
}
static CMYK_rgb([I, g, C, i]) {
return [Su(1 - Math.min(1, I + i)), Su(1 - Math.min(1, C + i)), Su(1 - Math.min(1, g + i))];
}
static CMYK_HTML(I) {
const g = this.CMYK_RGB(I).slice(1);
return this.RGB_HTML(g);
}
static RGB_CMYK([I, g, C]) {
const i = 1 - I, e = 1 - g, A = 1 - C, s = Math.min(i, e, A);
return ["CMYK", i, e, A, s];
}
}
class ndg {
create(I, g, C = !1) {
if (I <= 0 || g <= 0)
throw new Error("Invalid SVG dimensions");
const i = this._createSVG("svg:svg");
return i.setAttribute("version", "1.1"), C || (i.setAttribute("width", `${I}px`), i.setAttribute("height", `${g}px`)), i.setAttribute("preserveAspectRatio", "none"), i.setAttribute("viewBox", `0 0 ${I} ${g}`), i;
}
createElement(I) {
if (typeof I != "string")
throw new Error("Invalid SVG element type");
return this._createSVG(I);
}
_createSVG(I) {
BC("Abstract method `_createSVG` called.");
}
}
class eV extends ndg {
_createSVG(I) {
return document.createElementNS(dl, I);
}
}
class Sgg {
static setupStorage(I, g, C, i, e) {
const A = i.getValue(g, {
value: null
});
switch (C.name) {
case "textarea":
if (A.value !== null && (I.textContent = A.value), e === "print")
break;
I.addEventListener("input", (s) => {
i.setValue(g, {
value: s.target.value
});
});
break;
case "input":
if (C.attributes.type === "radio" || C.attributes.type === "checkbox") {
if (A.value === C.attributes.xfaOn ? I.setAttribute("checked", !0) : A.value === C.attributes.xfaOff && I.removeAttribute("checked"), e === "print")
break;
I.addEventListener("change", (s) => {
i.setValue(g, {
value: s.target.checked ? s.target.getAttribute("xfaOn") : s.target.getAttribute("xfaOff")
});
});
} else {
if (A.value !== null && I.setAttribute("value", A.value), e === "print")
break;
I.addEventListener("input", (s) => {
i.setValue(g, {
value: s.target.value
});
});
}
break;
case "select":
if (A.value !== null) {
I.setAttribute("value", A.value);
for (const s of C.children)
s.attributes.value === A.value ? s.attributes.selected = !0 : s.attributes.hasOwnProperty("selected") && delete s.attributes.selected;
}
I.addEventListener("input", (s) => {
const l = s.target.options, n = l.selectedIndex === -1 ? "" : l[l.selectedIndex].value;
i.setValue(g, {
value: n
});
});
break;
}
}
static setAttributes({
html: I,
element: g,
storage: C = null,
intent: i,
linkService: e
}) {
const {
attributes: A
} = g, s = I instanceof HTMLAnchorElement;
A.type === "radio" && (A.name = `${A.name}-${i}`);
for (const [l, n] of Object.entries(A))
if (n != null)
switch (l) {
case "class":
n.length && I.setAttribute(l, n.join(" "));
break;
case "dataId":
break;
case "id":
I.setAttribute("data-element-id", n);
break;
case "style":
Object.assign(I.style, n);
break;
case "textContent":
I.textContent = n;
break;
default:
(!s || l !== "href" && l !== "newWindow") && I.setAttribute(l, n);
}
s && e.addLinkAttributes(I, A.href, A.newWindow), C && A.dataId && this.setupStorage(I, A.dataId, g, C);
}
static render(I) {
var d, o;
const g = I.annotationStorage, C = I.linkService, i = I.xfaHtml, e = I.intent || "display", A = document.createElement(i.name);
i.attributes && this.setAttributes({
html: A,
element: i,
intent: e,
linkService: C
});
const s = e !== "richText", l = I.div;
if (l.append(A), I.viewport) {
const c = `matrix(${I.viewport.transform.join(",")})`;
l.style.transform = c;
}
s && l.setAttribute("class", "xfaLayer xfaFont");
const n = [];
if (i.children.length === 0) {
if (i.value) {
const c = document.createTextNode(i.value);
A.append(c), s && Rm.shouldBuildText(i.name) && n.push(c);
}
return {
textDivs: n
};
}
const a = [[i, -1, A]];
for (; a.length > 0; ) {
const [c, r, h] = a.at(-1);
if (r + 1 === c.children.length) {
a.pop();
continue;
}
const b = c.children[++a.at(-1)[1]];
if (b === null)
continue;
const {
name: u
} = b;
if (u === "#text") {
const Z = document.createTextNode(b.value);
n.push(Z), h.append(Z);
continue;
}
const m = (d = b == null ? void 0 : b.attributes) != null && d.xmlns ? document.createElementNS(b.attributes.xmlns, u) : document.createElement(u);
if (h.append(m), b.attributes && this.setAttributes({
html: m,
element: b,
storage: g,
intent: e,
linkService: C
}), ((o = b.children) == null ? void 0 : o.length) > 0)
a.push([b, -1, m]);
else if (b.value) {
const Z = document.createTextNode(b.value);
s && Rm.shouldBuildText(u) && n.push(Z), m.append(Z);
}
}
for (const c of l.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea"))
c.setAttribute("readOnly", !0);
return {
textDivs: n
};
}
static update(I) {
const g = `matrix(${I.viewport.transform.join(",")})`;
I.div.style.transform = g, I.div.hidden = !1;
}
}
const aG = 1e3, adg = 9, rd = /* @__PURE__ */ new WeakSet();
class Z8 {
static create(I) {
switch (I.data.annotationType) {
case dt.LINK:
return new Dgg(I);
case dt.TEXT:
return new odg(I);
case dt.WIDGET:
switch (I.data.fieldType) {
case "Tx":
return new cdg(I);
case "Btn":
return I.data.radioButton ? new kgg(I) : I.data.checkBox ? new rdg(I) : new hdg(I);
case "Ch":
return new bdg(I);
case "Sig":
return new ddg(I);
}
return new md(I);
case dt.POPUP:
return new NS(I);
case dt.FREETEXT:
return new Tgg(I);
case dt.LINE:
return new mdg(I);
case dt.SQUARE:
return new Zdg(I);
case dt.CIRCLE:
return new Gdg(I);
case dt.POLYLINE:
return new xgg(I);
case dt.CARET:
return new pdg(I);
case dt.INK:
return new p9(I);
case dt.POLYGON:
return new wdg(I);
case dt.HIGHLIGHT:
return new jgg(I);
case dt.UNDERLINE:
return new Bdg(I);
case dt.SQUIGGLY:
return new Wdg(I);
case dt.STRIKEOUT:
return new ydg(I);
case dt.STAMP:
return new Qgg(I);
case dt.FILEATTACHMENT:
return new Ydg(I);
default:
return new nt(I);
}
}
}
var Kc, Eh, Ph, pZ, YS;
const e1 = class e1 {
constructor(I, {
isRenderable: g = !1,
ignoreBorder: C = !1,
createQuadrilaterals: i = !1
} = {}) {
tg(this, pZ);
tg(this, Kc, null);
tg(this, Eh, !1);
tg(this, Ph, null);
this.isRenderable = g, this.data = I.data, this.layer = I.layer, this.linkService = I.linkService, this.downloadManager = I.downloadManager, this.imageResourcesPath = I.imageResourcesPath, this.renderForms = I.renderForms, this.svgFactory = I.svgFactory, this.annotationStorage = I.annotationStorage, this.enableScripting = I.enableScripting, this.hasJSActions = I.hasJSActions, this._fieldObjects = I.fieldObjects, this.parent = I.parent, g && (this.container = this._createContainer(C)), i && this._createQuadrilaterals();
}
static _hasPopupData({
titleObj: I,
contentsObj: g,
richText: C
}) {
return !!(I != null && I.str || g != null && g.str || C != null && C.str);
}
get _isEditable() {
return this.data.isEditable;
}
get hasPopupData() {
return e1._hasPopupData(this.data);
}
updateEdited(I) {
var C;
if (!this.container)
return;
M(this, Kc) || $(this, Kc, {
rect: this.data.rect.slice(0)
});
const {
rect: g
} = I;
g && ig(this, pZ, YS).call(this, g), (C = M(this, Ph)) == null || C.popup.updateEdited(I);
}
resetEdited() {
var I;
M(this, Kc) && (ig(this, pZ, YS).call(this, M(this, Kc).rect), (I = M(this, Ph)) == null || I.popup.resetEdited(), $(this, Kc, null));
}
_createContainer(I) {
const {
data: g,
parent: {
page: C,
viewport: i
}
} = this, e = document.createElement("section");
e.setAttribute("data-annotation-id", g.id), this instanceof md || (e.tabIndex = aG);
const {
style: A
} = e;
if (A.zIndex = this.parent.zIndex++, g.alternativeText && (e.title = g.alternativeText), g.noRotate && e.classList.add("norotate"), !g.rect || this instanceof NS) {
const {
rotation: h
} = g;
return !g.hasOwnCanvas && h !== 0 && this.setRotation(h, e), e;
}
const {
width: s,
height: l
} = this;
if (!I && g.borderStyle.width > 0) {
A.borderWidth = `${g.borderStyle.width}px`;
const h = g.borderStyle.horizontalCornerRadius, b = g.borderStyle.verticalCornerRadius;
if (h > 0 || b > 0) {
const m = `calc(${h}px * var(--total-scale-factor)) / calc(${b}px * var(--total-scale-factor))`;
A.borderRadius = m;
} else if (this instanceof kgg) {
const m = `calc(${s}px * var(--total-scale-factor)) / calc(${l}px * var(--total-scale-factor))`;
A.borderRadius = m;
}
switch (g.borderStyle.style) {
case Qr.SOLID:
A.borderStyle = "solid";
break;
case Qr.DASHED:
A.borderStyle = "dashed";
break;
case Qr.BEVELED:
DI("Unimplemented border style: beveled");
break;
case Qr.INSET:
DI("Unimplemented border style: inset");
break;
case Qr.UNDERLINE:
A.borderBottomStyle = "solid";
break;
}
const u = g.borderColor || null;
u ? ($(this, Eh, !0), A.borderColor = AI.makeHexColor(u[0] | 0, u[1] | 0, u[2] | 0)) : A.borderWidth = 0;
}
const n = AI.normalizeRect([g.rect[0], C.view[3] - g.rect[1] + C.view[1], g.rect[2], C.view[3] - g.rect[3] + C.view[1]]), {
pageWidth: a,
pageHeight: d,
pageX: o,
pageY: c
} = i.rawDims;
A.left = `${100 * (n[0] - o) / a}%`, A.top = `${100 * (n[1] - c) / d}%`;
const {
rotation: r
} = g;
return g.hasOwnCanvas || r === 0 ? (A.width = `${100 * s / a}%`, A.height = `${100 * l / d}%`) : this.setRotation(r, e), e;
}
setRotation(I, g = this.container) {
if (!this.data.rect)
return;
const {
pageWidth: C,
pageHeight: i
} = this.parent.viewport.rawDims;
let {
width: e,
height: A
} = this;
I % 180 !== 0 && ([e, A] = [A, e]), g.style.width = `${100 * e / C}%`, g.style.height = `${100 * A / i}%`, g.setAttribute("data-main-rotation", (360 - I) % 360);
}
get _commonActions() {
const I = (g, C, i) => {
const e = i.detail[g], A = e[0], s = e.slice(1);
i.target.style[C] = m8[`${A}_HTML`](s), this.annotationStorage.setValue(this.data.id, {
[C]: m8[`${A}_rgb`](s)
});
};
return UI(this, "_commonActions", {
display: (g) => {
const {
display: C
} = g.detail, i = C % 2 === 1;
this.container.style.visibility = i ? "hidden" : "visible", this.annotationStorage.setValue(this.data.id, {
noView: i,
noPrint: C === 1 || C === 2
});
},
print: (g) => {
this.annotationStorage.setValue(this.data.id, {
noPrint: !g.detail.print
});
},
hidden: (g) => {
const {
hidden: C
} = g.detail;
this.container.style.visibility = C ? "hidden" : "visible", this.annotationStorage.setValue(this.data.id, {
noPrint: C,
noView: C
});
},
focus: (g) => {
setTimeout(() => g.target.focus({
preventScroll: !1
}), 0);
},
userName: (g) => {
g.target.title = g.detail.userName;
},
readonly: (g) => {
g.target.disabled = g.detail.readonly;
},
required: (g) => {
this._setRequired(g.target, g.detail.required);
},
bgColor: (g) => {
I("bgColor", "backgroundColor", g);
},
fillColor: (g) => {
I("fillColor", "backgroundColor", g);
},
fgColor: (g) => {
I("fgColor", "color", g);
},
textColor: (g) => {
I("textColor", "color", g);
},
borderColor: (g) => {
I("borderColor", "borderColor", g);
},
strokeColor: (g) => {
I("strokeColor", "borderColor", g);
},
rotation: (g) => {
const C = g.detail.rotation;
this.setRotation(C), this.annotationStorage.setValue(this.data.id, {
rotation: C
});
}
});
}
_dispatchEventFromSandbox(I, g) {
const C = this._commonActions;
for (const i of Object.keys(g.detail)) {
const e = I[i] || C[i];
e == null || e(g);
}
}
_setDefaultPropertiesFromJS(I) {
if (!this.enableScripting)
return;
const g = this.annotationStorage.getRawValue(this.data.id);
if (!g)
return;
const C = this._commonActions;
for (const [i, e] of Object.entries(g)) {
const A = C[i];
if (A) {
const s = {
detail: {
[i]: e
},
target: I
};
A(s), delete g[i];
}
}
}
_createQuadrilaterals() {
if (!this.container)
return;
const {
quadPoints: I
} = this.data;
if (!I)
return;
const [g, C, i, e] = this.data.rect.map((h) => Math.fround(h));
if (I.length === 8) {
const [h, b, u, m] = I.subarray(2, 6);
if (i === h && e === b && g === u && C === m)
return;
}
const {
style: A
} = this.container;
let s;
if (M(this, Eh)) {
const {
borderColor: h,
borderWidth: b
} = A;
A.borderWidth = 0, s = ["url('data:image/svg+xml;utf8,", '')"), A.backgroundImage = s.join("")), this.container.append(d), this.container.style.clipPath = `url(#${r})`;
}
_createPopup() {
const {
data: I
} = this, g = $(this, Ph, new NS({
data: {
color: I.color,
titleObj: I.titleObj,
modificationDate: I.modificationDate,
contentsObj: I.contentsObj,
richText: I.richText,
parentRect: I.rect,
borderStyle: 0,
id: `popup_${I.id}`,
rotation: I.rotation
},
parent: this.parent,
elements: [this]
}));
this.parent.div.append(g.render());
}
render() {
BC("Abstract method `AnnotationElement.render` called");
}
_getElementsByName(I, g = null) {
const C = [];
if (this._fieldObjects) {
const i = this._fieldObjects[I];
if (i)
for (const {
page: e,
id: A,
exportValues: s
} of i) {
if (e === -1 || A === g)
continue;
const l = typeof s == "string" ? s : null, n = document.querySelector(`[data-element-id="${A}"]`);
if (n && !rd.has(n)) {
DI(`_getElementsByName - element not allowed: ${A}`);
continue;
}
C.push({
id: A,
exportValue: l,
domElement: n
});
}
return C;
}
for (const i of document.getElementsByName(I)) {
const {
exportValue: e
} = i, A = i.getAttribute("data-element-id");
A !== g && rd.has(i) && C.push({
id: A,
exportValue: e,
domElement: i
});
}
return C;
}
show() {
var I;
this.container && (this.container.hidden = !1), (I = this.popup) == null || I.maybeShow();
}
hide() {
var I;
this.container && (this.container.hidden = !0), (I = this.popup) == null || I.forceHide();
}
getElementsToTriggerPopup() {
return this.container;
}
addHighlightArea() {
const I = this.getElementsToTriggerPopup();
if (Array.isArray(I))
for (const g of I)
g.classList.add("highlightArea");
else
I.classList.add("highlightArea");
}
_editOnDoubleClick() {
if (!this._isEditable)
return;
const {
annotationEditorType: I,
data: {
id: g
}
} = this;
this.container.addEventListener("dblclick", () => {
var C;
(C = this.linkService.eventBus) == null || C.dispatch("switchannotationeditormode", {
source: this,
mode: I,
editId: g
});
});
}
get width() {
return this.data.rect[2] - this.data.rect[0];
}
get height() {
return this.data.rect[3] - this.data.rect[1];
}
};
Kc = new WeakMap(), Eh = new WeakMap(), Ph = new WeakMap(), pZ = new WeakSet(), YS = function(I) {
const {
container: {
style: g
},
data: {
rect: C,
rotation: i
},
parent: {
viewport: {
rawDims: {
pageWidth: e,
pageHeight: A,
pageX: s,
pageY: l
}
}
}
} = this;
C == null || C.splice(0, 4, ...I), g.left = `${100 * (I[0] - s) / e}%`, g.top = `${100 * (A - I[3] + l) / A}%`, i === 0 ? (g.width = `${100 * (I[2] - I[0]) / e}%`, g.height = `${100 * (I[3] - I[1]) / A}%`) : this.setRotation(i);
};
let nt = e1;
var Ye, To, Kgg, Fgg;
class Dgg extends nt {
constructor(g, C = null) {
super(g, {
isRenderable: !0,
ignoreBorder: !!(C != null && C.ignoreBorder),
createQuadrilaterals: !0
});
tg(this, Ye);
this.isTooltipOnly = g.data.isTooltipOnly;
}
render() {
const {
data: g,
linkService: C
} = this, i = document.createElement("a");
i.setAttribute("data-element-id", g.id);
let e = !1;
return g.url ? (C.addLinkAttributes(i, g.url, g.newWindow), e = !0) : g.action ? (this._bindNamedAction(i, g.action), e = !0) : g.attachment ? (ig(this, Ye, Kgg).call(this, i, g.attachment, g.attachmentDest), e = !0) : g.setOCGState ? (ig(this, Ye, Fgg).call(this, i, g.setOCGState), e = !0) : g.dest ? (this._bindLink(i, g.dest), e = !0) : (g.actions && (g.actions.Action || g.actions["Mouse Up"] || g.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions && (this._bindJSAction(i, g), e = !0), g.resetForm ? (this._bindResetFormAction(i, g.resetForm), e = !0) : this.isTooltipOnly && !e && (this._bindLink(i, ""), e = !0)), this.container.classList.add("linkAnnotation"), e && this.container.append(i), this.container;
}
_bindLink(g, C) {
g.href = this.linkService.getDestinationHash(C), g.onclick = () => (C && this.linkService.goToDestination(C), !1), (C || C === "") && ig(this, Ye, To).call(this);
}
_bindNamedAction(g, C) {
g.href = this.linkService.getAnchorUrl(""), g.onclick = () => (this.linkService.executeNamedAction(C), !1), ig(this, Ye, To).call(this);
}
_bindJSAction(g, C) {
g.href = this.linkService.getAnchorUrl("");
const i = /* @__PURE__ */ new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]);
for (const e of Object.keys(C.actions)) {
const A = i.get(e);
A && (g[A] = () => {
var s;
return (s = this.linkService.eventBus) == null || s.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: C.id,
name: e
}
}), !1;
});
}
g.onclick || (g.onclick = () => !1), ig(this, Ye, To).call(this);
}
_bindResetFormAction(g, C) {
const i = g.onclick;
if (i || (g.href = this.linkService.getAnchorUrl("")), ig(this, Ye, To).call(this), !this._fieldObjects) {
DI('_bindResetFormAction - "resetForm" action not supported, ensure that the `fieldObjects` parameter is provided.'), i || (g.onclick = () => !1);
return;
}
g.onclick = () => {
var d;
i == null || i();
const {
fields: e,
refs: A,
include: s
} = C, l = [];
if (e.length !== 0 || A.length !== 0) {
const o = new Set(A);
for (const c of e) {
const r = this._fieldObjects[c] || [];
for (const {
id: h
} of r)
o.add(h);
}
for (const c of Object.values(this._fieldObjects))
for (const r of c)
o.has(r.id) === s && l.push(r);
} else
for (const o of Object.values(this._fieldObjects))
l.push(...o);
const n = this.annotationStorage, a = [];
for (const o of l) {
const {
id: c
} = o;
switch (a.push(c), o.type) {
case "text": {
const h = o.defaultValue || "";
n.setValue(c, {
value: h
});
break;
}
case "checkbox":
case "radiobutton": {
const h = o.defaultValue === o.exportValues;
n.setValue(c, {
value: h
});
break;
}
case "combobox":
case "listbox": {
const h = o.defaultValue || "";
n.setValue(c, {
value: h
});
break;
}
default:
continue;
}
const r = document.querySelector(`[data-element-id="${c}"]`);
if (r) {
if (!rd.has(r)) {
DI(`_bindResetFormAction - element not allowed: ${c}`);
continue;
}
} else continue;
r.dispatchEvent(new Event("resetform"));
}
return this.enableScripting && ((d = this.linkService.eventBus) == null || d.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: "app",
ids: a,
name: "ResetForm"
}
})), !1;
};
}
}
Ye = new WeakSet(), To = function() {
this.container.setAttribute("data-internal-link", "");
}, Kgg = function(g, C, i = null) {
g.href = this.linkService.getAnchorUrl(""), C.description && (g.title = C.description), g.onclick = () => {
var e;
return (e = this.downloadManager) == null || e.openOrDownloadData(C.content, C.filename, i), !1;
}, ig(this, Ye, To).call(this);
}, Fgg = function(g, C) {
g.href = this.linkService.getAnchorUrl(""), g.onclick = () => (this.linkService.executeSetOCGState(C), !1), ig(this, Ye, To).call(this);
};
class odg extends nt {
constructor(I) {
super(I, {
isRenderable: !0
});
}
render() {
this.container.classList.add("textAnnotation");
const I = document.createElement("img");
return I.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg", I.setAttribute("data-l10n-id", "pdfjs-text-annotation-type"), I.setAttribute("data-l10n-args", JSON.stringify({
type: this.data.name
})), !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.append(I), this.container;
}
}
class md extends nt {
render() {
return this.container;
}
showElementAndHideCanvas(I) {
var g;
this.data.hasOwnCanvas && (((g = I.previousSibling) == null ? void 0 : g.nodeName) === "CANVAS" && (I.previousSibling.hidden = !0), I.hidden = !1);
}
_getKeyModifier(I) {
return Ai.platform.isMac ? I.metaKey : I.ctrlKey;
}
_setEventListener(I, g, C, i, e) {
C.includes("mouse") ? I.addEventListener(C, (A) => {
var s;
(s = this.linkService.eventBus) == null || s.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: this.data.id,
name: i,
value: e(A),
shift: A.shiftKey,
modifier: this._getKeyModifier(A)
}
});
}) : I.addEventListener(C, (A) => {
var s;
if (C === "blur") {
if (!g.focused || !A.relatedTarget)
return;
g.focused = !1;
} else if (C === "focus") {
if (g.focused)
return;
g.focused = !0;
}
e && ((s = this.linkService.eventBus) == null || s.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: this.data.id,
name: i,
value: e(A)
}
}));
});
}
_setEventListeners(I, g, C, i) {
var e, A, s;
for (const [l, n] of C)
(n === "Action" || (e = this.data.actions) != null && e[n]) && ((n === "Focus" || n === "Blur") && (g || (g = {
focused: !1
})), this._setEventListener(I, g, l, n, i), n === "Focus" && !((A = this.data.actions) != null && A.Blur) ? this._setEventListener(I, g, "blur", "Blur", null) : n === "Blur" && !((s = this.data.actions) != null && s.Focus) && this._setEventListener(I, g, "focus", "Focus", null));
}
_setBackgroundColor(I) {
const g = this.data.backgroundColor || null;
I.style.backgroundColor = g === null ? "transparent" : AI.makeHexColor(g[0], g[1], g[2]);
}
_setTextStyle(I) {
const g = ["left", "center", "right"], {
fontColor: C
} = this.data.defaultAppearanceData, i = this.data.defaultAppearanceData.fontSize || adg, e = I.style;
let A;
const s = 2, l = (n) => Math.round(10 * n) / 10;
if (this.data.multiLine) {
const n = Math.abs(this.data.rect[3] - this.data.rect[1] - s), a = Math.round(n / (LH * i)) || 1, d = n / a;
A = Math.min(i, l(d / LH));
} else {
const n = Math.abs(this.data.rect[3] - this.data.rect[1] - s);
A = Math.min(i, l(n / LH));
}
e.fontSize = `calc(${A}px * var(--total-scale-factor))`, e.color = AI.makeHexColor(C[0], C[1], C[2]), this.data.textAlignment !== null && (e.textAlign = g[this.data.textAlignment]);
}
_setRequired(I, g) {
g ? I.setAttribute("required", !0) : I.removeAttribute("required"), I.setAttribute("aria-required", g);
}
}
class cdg extends md {
constructor(I) {
const g = I.renderForms || I.data.hasOwnCanvas || !I.data.hasAppearance && !!I.data.fieldValue;
super(I, {
isRenderable: g
});
}
setPropertyOnSiblings(I, g, C, i) {
const e = this.annotationStorage;
for (const A of this._getElementsByName(I.name, I.id))
A.domElement && (A.domElement[g] = C), e.setValue(A.id, {
[i]: C
});
}
render() {
var i, e;
const I = this.annotationStorage, g = this.data.id;
this.container.classList.add("textWidgetAnnotation");
let C = null;
if (this.renderForms) {
const A = I.getValue(g, {
value: this.data.fieldValue
});
let s = A.value || "";
const l = I.getValue(g, {
charLimit: this.data.maxLen
}).charLimit;
l && s.length > l && (s = s.slice(0, l));
let n = A.formattedValue || ((i = this.data.textContent) == null ? void 0 : i.join(`
`)) || null;
n && this.data.comb && (n = n.replaceAll(/\s+/g, ""));
const a = {
userValue: s,
formattedValue: n,
lastCommittedValue: null,
commitKey: 1,
focused: !1
};
this.data.multiLine ? (C = document.createElement("textarea"), C.textContent = n ?? s, this.data.doNotScroll && (C.style.overflowY = "hidden")) : (C = document.createElement("input"), C.type = this.data.password ? "password" : "text", C.setAttribute("value", n ?? s), this.data.doNotScroll && (C.style.overflowX = "hidden")), this.data.hasOwnCanvas && (C.hidden = !0), rd.add(C), C.setAttribute("data-element-id", g), C.disabled = this.data.readOnly, C.name = this.data.fieldName, C.tabIndex = aG, this._setRequired(C, this.data.required), l && (C.maxLength = l), C.addEventListener("input", (o) => {
I.setValue(g, {
value: o.target.value
}), this.setPropertyOnSiblings(C, "value", o.target.value, "value"), a.formattedValue = null;
}), C.addEventListener("resetform", (o) => {
const c = this.data.defaultFieldValue ?? "";
C.value = a.userValue = c, a.formattedValue = null;
});
let d = (o) => {
const {
formattedValue: c
} = a;
c != null && (o.target.value = c), o.target.scrollLeft = 0;
};
if (this.enableScripting && this.hasJSActions) {
C.addEventListener("focus", (c) => {
var h;
if (a.focused)
return;
const {
target: r
} = c;
a.userValue && (r.value = a.userValue), a.lastCommittedValue = r.value, a.commitKey = 1, (h = this.data.actions) != null && h.Focus || (a.focused = !0);
}), C.addEventListener("updatefromsandbox", (c) => {
this.showElementAndHideCanvas(c.target);
const r = {
value(h) {
a.userValue = h.detail.value ?? "", I.setValue(g, {
value: a.userValue.toString()
}), h.target.value = a.userValue;
},
formattedValue(h) {
const {
formattedValue: b
} = h.detail;
a.formattedValue = b, b != null && h.target !== document.activeElement && (h.target.value = b), I.setValue(g, {
formattedValue: b
});
},
selRange(h) {
h.target.setSelectionRange(...h.detail.selRange);
},
charLimit: (h) => {
var Z;
const {
charLimit: b
} = h.detail, {
target: u
} = h;
if (b === 0) {
u.removeAttribute("maxLength");
return;
}
u.setAttribute("maxLength", b);
let m = a.userValue;
!m || m.length <= b || (m = m.slice(0, b), u.value = a.userValue = m, I.setValue(g, {
value: m
}), (Z = this.linkService.eventBus) == null || Z.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: g,
name: "Keystroke",
value: m,
willCommit: !0,
commitKey: 1,
selStart: u.selectionStart,
selEnd: u.selectionEnd
}
}));
}
};
this._dispatchEventFromSandbox(r, c);
}), C.addEventListener("keydown", (c) => {
var b;
a.commitKey = 1;
let r = -1;
if (c.key === "Escape" ? r = 0 : c.key === "Enter" && !this.data.multiLine ? r = 2 : c.key === "Tab" && (a.commitKey = 3), r === -1)
return;
const {
value: h
} = c.target;
a.lastCommittedValue !== h && (a.lastCommittedValue = h, a.userValue = h, (b = this.linkService.eventBus) == null || b.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: g,
name: "Keystroke",
value: h,
willCommit: !0,
commitKey: r,
selStart: c.target.selectionStart,
selEnd: c.target.selectionEnd
}
}));
});
const o = d;
d = null, C.addEventListener("blur", (c) => {
var h, b;
if (!a.focused || !c.relatedTarget)
return;
(h = this.data.actions) != null && h.Blur || (a.focused = !1);
const {
value: r
} = c.target;
a.userValue = r, a.lastCommittedValue !== r && ((b = this.linkService.eventBus) == null || b.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: g,
name: "Keystroke",
value: r,
willCommit: !0,
commitKey: a.commitKey,
selStart: c.target.selectionStart,
selEnd: c.target.selectionEnd
}
})), o(c);
}), (e = this.data.actions) != null && e.Keystroke && C.addEventListener("beforeinput", (c) => {
var Y;
a.lastCommittedValue = null;
const {
data: r,
target: h
} = c, {
value: b,
selectionStart: u,
selectionEnd: m
} = h;
let Z = u, p = m;
switch (c.inputType) {
case "deleteWordBackward": {
const R = b.substring(0, u).match(/\w*[^\w]*$/);
R && (Z -= R[0].length);
break;
}
case "deleteWordForward": {
const R = b.substring(u).match(/^[^\w]*\w*/);
R && (p += R[0].length);
break;
}
case "deleteContentBackward":
u === m && (Z -= 1);
break;
case "deleteContentForward":
u === m && (p += 1);
break;
}
c.preventDefault(), (Y = this.linkService.eventBus) == null || Y.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: g,
name: "Keystroke",
value: b,
change: r || "",
willCommit: !1,
selStart: Z,
selEnd: p
}
});
}), this._setEventListeners(C, a, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (c) => c.target.value);
}
if (d && C.addEventListener("blur", d), this.data.comb) {
const c = (this.data.rect[2] - this.data.rect[0]) / l;
C.classList.add("comb"), C.style.letterSpacing = `calc(${c}px * var(--total-scale-factor) - 1ch)`;
}
} else
C = document.createElement("div"), C.textContent = this.data.fieldValue, C.style.verticalAlign = "middle", C.style.display = "table-cell", this.data.hasOwnCanvas && (C.hidden = !0);
return this._setTextStyle(C), this._setBackgroundColor(C), this._setDefaultPropertiesFromJS(C), this.container.append(C), this.container;
}
}
class ddg extends md {
constructor(I) {
super(I, {
isRenderable: !!I.data.hasOwnCanvas
});
}
}
class rdg extends md {
constructor(I) {
super(I, {
isRenderable: I.renderForms
});
}
render() {
const I = this.annotationStorage, g = this.data, C = g.id;
let i = I.getValue(C, {
value: g.exportValue === g.fieldValue
}).value;
typeof i == "string" && (i = i !== "Off", I.setValue(C, {
value: i
})), this.container.classList.add("buttonWidgetAnnotation", "checkBox");
const e = document.createElement("input");
return rd.add(e), e.setAttribute("data-element-id", C), e.disabled = g.readOnly, this._setRequired(e, this.data.required), e.type = "checkbox", e.name = g.fieldName, i && e.setAttribute("checked", !0), e.setAttribute("exportValue", g.exportValue), e.tabIndex = aG, e.addEventListener("change", (A) => {
const {
name: s,
checked: l
} = A.target;
for (const n of this._getElementsByName(s, C)) {
const a = l && n.exportValue === g.exportValue;
n.domElement && (n.domElement.checked = a), I.setValue(n.id, {
value: a
});
}
I.setValue(C, {
value: l
});
}), e.addEventListener("resetform", (A) => {
const s = g.defaultFieldValue || "Off";
A.target.checked = s === g.exportValue;
}), this.enableScripting && this.hasJSActions && (e.addEventListener("updatefromsandbox", (A) => {
const s = {
value(l) {
l.target.checked = l.detail.value !== "Off", I.setValue(C, {
value: l.target.checked
});
}
};
this._dispatchEventFromSandbox(s, A);
}), this._setEventListeners(e, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (A) => A.target.checked)), this._setBackgroundColor(e), this._setDefaultPropertiesFromJS(e), this.container.append(e), this.container;
}
}
class kgg extends md {
constructor(I) {
super(I, {
isRenderable: I.renderForms
});
}
render() {
this.container.classList.add("buttonWidgetAnnotation", "radioButton");
const I = this.annotationStorage, g = this.data, C = g.id;
let i = I.getValue(C, {
value: g.fieldValue === g.buttonValue
}).value;
if (typeof i == "string" && (i = i !== g.buttonValue, I.setValue(C, {
value: i
})), i)
for (const A of this._getElementsByName(g.fieldName, C))
I.setValue(A.id, {
value: !1
});
const e = document.createElement("input");
if (rd.add(e), e.setAttribute("data-element-id", C), e.disabled = g.readOnly, this._setRequired(e, this.data.required), e.type = "radio", e.name = g.fieldName, i && e.setAttribute("checked", !0), e.tabIndex = aG, e.addEventListener("change", (A) => {
const {
name: s,
checked: l
} = A.target;
for (const n of this._getElementsByName(s, C))
I.setValue(n.id, {
value: !1
});
I.setValue(C, {
value: l
});
}), e.addEventListener("resetform", (A) => {
const s = g.defaultFieldValue;
A.target.checked = s != null && s === g.buttonValue;
}), this.enableScripting && this.hasJSActions) {
const A = g.buttonValue;
e.addEventListener("updatefromsandbox", (s) => {
const l = {
value: (n) => {
const a = A === n.detail.value;
for (const d of this._getElementsByName(n.target.name)) {
const o = a && d.id === C;
d.domElement && (d.domElement.checked = o), I.setValue(d.id, {
value: o
});
}
}
};
this._dispatchEventFromSandbox(l, s);
}), this._setEventListeners(e, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (s) => s.target.checked);
}
return this._setBackgroundColor(e), this._setDefaultPropertiesFromJS(e), this.container.append(e), this.container;
}
}
class hdg extends Dgg {
constructor(I) {
super(I, {
ignoreBorder: I.data.hasAppearance
});
}
render() {
const I = super.render();
I.classList.add("buttonWidgetAnnotation", "pushButton");
const g = I.lastChild;
return this.enableScripting && this.hasJSActions && g && (this._setDefaultPropertiesFromJS(g), g.addEventListener("updatefromsandbox", (C) => {
this._dispatchEventFromSandbox({}, C);
})), I;
}
}
class bdg extends md {
constructor(I) {
super(I, {
isRenderable: I.renderForms
});
}
render() {
this.container.classList.add("choiceWidgetAnnotation");
const I = this.annotationStorage, g = this.data.id, C = I.getValue(g, {
value: this.data.fieldValue
}), i = document.createElement("select");
rd.add(i), i.setAttribute("data-element-id", g), i.disabled = this.data.readOnly, this._setRequired(i, this.data.required), i.name = this.data.fieldName, i.tabIndex = aG;
let e = this.data.combo && this.data.options.length > 0;
this.data.combo || (i.size = this.data.options.length, this.data.multiSelect && (i.multiple = !0)), i.addEventListener("resetform", (a) => {
const d = this.data.defaultFieldValue;
for (const o of i.options)
o.selected = o.value === d;
});
for (const a of this.data.options) {
const d = document.createElement("option");
d.textContent = a.displayValue, d.value = a.exportValue, C.value.includes(a.exportValue) && (d.setAttribute("selected", !0), e = !1), i.append(d);
}
let A = null;
if (e) {
const a = document.createElement("option");
a.value = " ", a.setAttribute("hidden", !0), a.setAttribute("selected", !0), i.prepend(a), A = () => {
a.remove(), i.removeEventListener("input", A), A = null;
}, i.addEventListener("input", A);
}
const s = (a) => {
const d = a ? "value" : "textContent", {
options: o,
multiple: c
} = i;
return c ? Array.prototype.filter.call(o, (r) => r.selected).map((r) => r[d]) : o.selectedIndex === -1 ? null : o[o.selectedIndex][d];
};
let l = s(!1);
const n = (a) => {
const d = a.target.options;
return Array.prototype.map.call(d, (o) => ({
displayValue: o.textContent,
exportValue: o.value
}));
};
return this.enableScripting && this.hasJSActions ? (i.addEventListener("updatefromsandbox", (a) => {
const d = {
value(o) {
A == null || A();
const c = o.detail.value, r = new Set(Array.isArray(c) ? c : [c]);
for (const h of i.options)
h.selected = r.has(h.value);
I.setValue(g, {
value: s(!0)
}), l = s(!1);
},
multipleSelection(o) {
i.multiple = !0;
},
remove(o) {
const c = i.options, r = o.detail.remove;
c[r].selected = !1, i.remove(r), c.length > 0 && Array.prototype.findIndex.call(c, (b) => b.selected) === -1 && (c[0].selected = !0), I.setValue(g, {
value: s(!0),
items: n(o)
}), l = s(!1);
},
clear(o) {
for (; i.length !== 0; )
i.remove(0);
I.setValue(g, {
value: null,
items: []
}), l = s(!1);
},
insert(o) {
const {
index: c,
displayValue: r,
exportValue: h
} = o.detail.insert, b = i.children[c], u = document.createElement("option");
u.textContent = r, u.value = h, b ? b.before(u) : i.append(u), I.setValue(g, {
value: s(!0),
items: n(o)
}), l = s(!1);
},
items(o) {
const {
items: c
} = o.detail;
for (; i.length !== 0; )
i.remove(0);
for (const r of c) {
const {
displayValue: h,
exportValue: b
} = r, u = document.createElement("option");
u.textContent = h, u.value = b, i.append(u);
}
i.options.length > 0 && (i.options[0].selected = !0), I.setValue(g, {
value: s(!0),
items: n(o)
}), l = s(!1);
},
indices(o) {
const c = new Set(o.detail.indices);
for (const r of o.target.options)
r.selected = c.has(r.index);
I.setValue(g, {
value: s(!0)
}), l = s(!1);
},
editable(o) {
o.target.disabled = !o.detail.editable;
}
};
this._dispatchEventFromSandbox(d, a);
}), i.addEventListener("input", (a) => {
var c;
const d = s(!0), o = s(!1);
I.setValue(g, {
value: d
}), a.preventDefault(), (c = this.linkService.eventBus) == null || c.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: g,
name: "Keystroke",
value: l,
change: o,
changeEx: d,
willCommit: !1,
commitKey: 1,
keyDown: !1
}
});
}), this._setEventListeners(i, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], (a) => a.target.value)) : i.addEventListener("input", function(a) {
I.setValue(g, {
value: s(!0)
});
}), this.data.combo && this._setTextStyle(i), this._setBackgroundColor(i), this._setDefaultPropertiesFromJS(i), this.container.append(i), this.container;
}
}
class NS extends nt {
constructor(I) {
const {
data: g,
elements: C
} = I;
super(I, {
isRenderable: nt._hasPopupData(g)
}), this.elements = C, this.popup = null;
}
render() {
this.container.classList.add("popupAnnotation");
const I = this.popup = new udg({
container: this.container,
color: this.data.color,
titleObj: this.data.titleObj,
modificationDate: this.data.modificationDate,
contentsObj: this.data.contentsObj,
richText: this.data.richText,
rect: this.data.rect,
parentRect: this.data.parentRect || null,
parent: this.parent,
elements: this.elements,
open: this.data.open
}), g = [];
for (const C of this.elements)
C.popup = I, C.container.ariaHasPopup = "dialog", g.push(C.data.id), C.addHighlightArea();
return this.container.setAttribute("aria-controls", g.map((C) => `${d9}${C}`).join(",")), this.container;
}
}
var _h, TV, xV, qh, $h, $C, Sl, g0, BZ, WZ, I0, Dl, yA, Kl, yZ, Fl, YZ, Fc, kc, WC, WN, VS, zgg, Jgg, Lgg, vgg, yN, YN, MS;
class udg {
constructor({
container: I,
color: g,
elements: C,
titleObj: i,
modificationDate: e,
contentsObj: A,
richText: s,
parent: l,
rect: n,
parentRect: a,
open: d
}) {
tg(this, WC);
tg(this, _h, ig(this, WC, Lgg).bind(this));
tg(this, TV, ig(this, WC, MS).bind(this));
tg(this, xV, ig(this, WC, YN).bind(this));
tg(this, qh, ig(this, WC, yN).bind(this));
tg(this, $h, null);
tg(this, $C, null);
tg(this, Sl, null);
tg(this, g0, null);
tg(this, BZ, null);
tg(this, WZ, null);
tg(this, I0, null);
tg(this, Dl, !1);
tg(this, yA, null);
tg(this, Kl, null);
tg(this, yZ, null);
tg(this, Fl, null);
tg(this, YZ, null);
tg(this, Fc, null);
tg(this, kc, !1);
var o;
$(this, $C, I), $(this, YZ, i), $(this, Sl, A), $(this, Fl, s), $(this, WZ, l), $(this, $h, g), $(this, yZ, n), $(this, I0, a), $(this, BZ, C), $(this, g0, b9.toDateObject(e)), this.trigger = C.flatMap((c) => c.getElementsToTriggerPopup());
for (const c of this.trigger)
c.addEventListener("click", M(this, qh)), c.addEventListener("mouseenter", M(this, xV)), c.addEventListener("mouseleave", M(this, TV)), c.classList.add("popupTriggerArea");
for (const c of C)
(o = c.container) == null || o.addEventListener("keydown", M(this, _h));
M(this, $C).hidden = !0, d && ig(this, WC, yN).call(this);
}
render() {
if (M(this, yA))
return;
const I = $(this, yA, document.createElement("div"));
if (I.className = "popup", M(this, $h)) {
const e = I.style.outlineColor = AI.makeHexColor(...M(this, $h));
I.style.backgroundColor = `color-mix(in srgb, ${e} 30%, white)`;
}
const g = document.createElement("span");
g.className = "header";
const C = document.createElement("h1");
if (g.append(C), {
dir: C.dir,
str: C.textContent
} = M(this, YZ), I.append(g), M(this, g0)) {
const e = document.createElement("span");
e.classList.add("popupDate"), e.setAttribute("data-l10n-id", "pdfjs-annotation-date-time-string"), e.setAttribute("data-l10n-args", JSON.stringify({
dateObj: M(this, g0).valueOf()
})), g.append(e);
}
const i = M(this, WC, WN);
if (i)
Sgg.render({
xfaHtml: i,
intent: "richText",
div: I
}), I.lastChild.classList.add("richText", "popupContent");
else {
const e = this._formatContents(M(this, Sl));
I.append(e);
}
M(this, $C).append(I);
}
_formatContents({
str: I,
dir: g
}) {
const C = document.createElement("p");
C.classList.add("popupContent"), C.dir = g;
const i = I.split(/(?:\r\n?|\n)/);
for (let e = 0, A = i.length; e < A; ++e) {
const s = i[e];
C.append(document.createTextNode(s)), e < A - 1 && C.append(document.createElement("br"));
}
return C;
}
updateEdited({
rect: I,
popupContent: g
}) {
var C;
M(this, Fc) || $(this, Fc, {
contentsObj: M(this, Sl),
richText: M(this, Fl)
}), I && $(this, Kl, null), g && ($(this, Fl, ig(this, WC, Jgg).call(this, g)), $(this, Sl, null)), (C = M(this, yA)) == null || C.remove(), $(this, yA, null);
}
resetEdited() {
var I;
M(this, Fc) && ({
contentsObj: Wi(this, Sl)._,
richText: Wi(this, Fl)._
} = M(this, Fc), $(this, Fc, null), (I = M(this, yA)) == null || I.remove(), $(this, yA, null), $(this, Kl, null));
}
forceHide() {
$(this, kc, this.isVisible), M(this, kc) && (M(this, $C).hidden = !0);
}
maybeShow() {
M(this, kc) && (M(this, yA) || ig(this, WC, YN).call(this), $(this, kc, !1), M(this, $C).hidden = !1);
}
get isVisible() {
return M(this, $C).hidden === !1;
}
}
_h = new WeakMap(), TV = new WeakMap(), xV = new WeakMap(), qh = new WeakMap(), $h = new WeakMap(), $C = new WeakMap(), Sl = new WeakMap(), g0 = new WeakMap(), BZ = new WeakMap(), WZ = new WeakMap(), I0 = new WeakMap(), Dl = new WeakMap(), yA = new WeakMap(), Kl = new WeakMap(), yZ = new WeakMap(), Fl = new WeakMap(), YZ = new WeakMap(), Fc = new WeakMap(), kc = new WeakMap(), WC = new WeakSet(), WN = function() {
const I = M(this, Fl), g = M(this, Sl);
return I != null && I.str && (!(g != null && g.str) || g.str === I.str) && M(this, Fl).html || null;
}, VS = function() {
var I, g, C;
return ((C = (g = (I = M(this, WC, WN)) == null ? void 0 : I.attributes) == null ? void 0 : g.style) == null ? void 0 : C.fontSize) || 0;
}, zgg = function() {
var I, g, C;
return ((C = (g = (I = M(this, WC, WN)) == null ? void 0 : I.attributes) == null ? void 0 : g.style) == null ? void 0 : C.color) || null;
}, Jgg = function(I) {
const g = [], C = {
str: I,
html: {
name: "div",
attributes: {
dir: "auto"
},
children: [{
name: "p",
children: g
}]
}
}, i = {
style: {
color: M(this, WC, zgg),
fontSize: M(this, WC, VS) ? `calc(${M(this, WC, VS)}px * var(--total-scale-factor))` : ""
}
};
for (const e of I.split(`
`))
g.push({
name: "span",
value: e,
attributes: i
});
return C;
}, Lgg = function(I) {
I.altKey || I.shiftKey || I.ctrlKey || I.metaKey || (I.key === "Enter" || I.key === "Escape" && M(this, Dl)) && ig(this, WC, yN).call(this);
}, vgg = function() {
if (M(this, Kl) !== null)
return;
const {
page: {
view: I
},
viewport: {
rawDims: {
pageWidth: g,
pageHeight: C,
pageX: i,
pageY: e
}
}
} = M(this, WZ);
let A = !!M(this, I0), s = A ? M(this, I0) : M(this, yZ);
for (const r of M(this, BZ))
if (!s || AI.intersect(r.data.rect, s) !== null) {
s = r.data.rect, A = !0;
break;
}
const l = AI.normalizeRect([s[0], I[3] - s[1] + I[1], s[2], I[3] - s[3] + I[1]]), a = A ? s[2] - s[0] + 5 : 0, d = l[0] + a, o = l[1];
$(this, Kl, [100 * (d - i) / g, 100 * (o - e) / C]);
const {
style: c
} = M(this, $C);
c.left = `${M(this, Kl)[0]}%`, c.top = `${M(this, Kl)[1]}%`;
}, yN = function() {
$(this, Dl, !M(this, Dl)), M(this, Dl) ? (ig(this, WC, YN).call(this), M(this, $C).addEventListener("click", M(this, qh)), M(this, $C).addEventListener("keydown", M(this, _h))) : (ig(this, WC, MS).call(this), M(this, $C).removeEventListener("click", M(this, qh)), M(this, $C).removeEventListener("keydown", M(this, _h)));
}, YN = function() {
M(this, yA) || this.render(), this.isVisible ? M(this, Dl) && M(this, $C).classList.add("focused") : (ig(this, WC, vgg).call(this), M(this, $C).hidden = !1, M(this, $C).style.zIndex = parseInt(M(this, $C).style.zIndex) + 1e3);
}, MS = function() {
M(this, $C).classList.remove("focused"), !(M(this, Dl) || !this.isVisible) && (M(this, $C).hidden = !0, M(this, $C).style.zIndex = parseInt(M(this, $C).style.zIndex) - 1e3);
};
class Tgg extends nt {
constructor(I) {
super(I, {
isRenderable: !0,
ignoreBorder: !0
}), this.textContent = I.data.textContent, this.textPosition = I.data.textPosition, this.annotationEditorType = XI.FREETEXT;
}
render() {
if (this.container.classList.add("freeTextAnnotation"), this.textContent) {
const I = document.createElement("div");
I.classList.add("annotationTextContent"), I.setAttribute("role", "comment");
for (const g of this.textContent) {
const C = document.createElement("span");
C.textContent = g, I.append(C);
}
this.container.append(I);
}
return !this.data.popupRef && this.hasPopupData && this._createPopup(), this._editOnDoubleClick(), this.container;
}
}
var NZ;
class mdg extends nt {
constructor(g) {
super(g, {
isRenderable: !0,
ignoreBorder: !0
});
tg(this, NZ, null);
}
render() {
this.container.classList.add("lineAnnotation");
const {
data: g,
width: C,
height: i
} = this, e = this.svgFactory.create(C, i, !0), A = $(this, NZ, this.svgFactory.createElement("svg:line"));
return A.setAttribute("x1", g.rect[2] - g.lineCoordinates[0]), A.setAttribute("y1", g.rect[3] - g.lineCoordinates[1]), A.setAttribute("x2", g.rect[2] - g.lineCoordinates[2]), A.setAttribute("y2", g.rect[3] - g.lineCoordinates[3]), A.setAttribute("stroke-width", g.borderStyle.width || 1), A.setAttribute("stroke", "transparent"), A.setAttribute("fill", "transparent"), e.append(A), this.container.append(e), !g.popupRef && this.hasPopupData && this._createPopup(), this.container;
}
getElementsToTriggerPopup() {
return M(this, NZ);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
}
NZ = new WeakMap();
var VZ;
class Zdg extends nt {
constructor(g) {
super(g, {
isRenderable: !0,
ignoreBorder: !0
});
tg(this, VZ, null);
}
render() {
this.container.classList.add("squareAnnotation");
const {
data: g,
width: C,
height: i
} = this, e = this.svgFactory.create(C, i, !0), A = g.borderStyle.width, s = $(this, VZ, this.svgFactory.createElement("svg:rect"));
return s.setAttribute("x", A / 2), s.setAttribute("y", A / 2), s.setAttribute("width", C - A), s.setAttribute("height", i - A), s.setAttribute("stroke-width", A || 1), s.setAttribute("stroke", "transparent"), s.setAttribute("fill", "transparent"), e.append(s), this.container.append(e), !g.popupRef && this.hasPopupData && this._createPopup(), this.container;
}
getElementsToTriggerPopup() {
return M(this, VZ);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
}
VZ = new WeakMap();
var MZ;
class Gdg extends nt {
constructor(g) {
super(g, {
isRenderable: !0,
ignoreBorder: !0
});
tg(this, MZ, null);
}
render() {
this.container.classList.add("circleAnnotation");
const {
data: g,
width: C,
height: i
} = this, e = this.svgFactory.create(C, i, !0), A = g.borderStyle.width, s = $(this, MZ, this.svgFactory.createElement("svg:ellipse"));
return s.setAttribute("cx", C / 2), s.setAttribute("cy", i / 2), s.setAttribute("rx", C / 2 - A / 2), s.setAttribute("ry", i / 2 - A / 2), s.setAttribute("stroke-width", A || 1), s.setAttribute("stroke", "transparent"), s.setAttribute("fill", "transparent"), e.append(s), this.container.append(e), !g.popupRef && this.hasPopupData && this._createPopup(), this.container;
}
getElementsToTriggerPopup() {
return M(this, MZ);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
}
MZ = new WeakMap();
var RZ;
class xgg extends nt {
constructor(g) {
super(g, {
isRenderable: !0,
ignoreBorder: !0
});
tg(this, RZ, null);
this.containerClassName = "polylineAnnotation", this.svgElementName = "svg:polyline";
}
render() {
this.container.classList.add(this.containerClassName);
const {
data: {
rect: g,
vertices: C,
borderStyle: i,
popupRef: e
},
width: A,
height: s
} = this;
if (!C)
return this.container;
const l = this.svgFactory.create(A, s, !0);
let n = [];
for (let d = 0, o = C.length; d < o; d += 2) {
const c = C[d] - g[0], r = g[3] - C[d + 1];
n.push(`${c},${r}`);
}
n = n.join(" ");
const a = $(this, RZ, this.svgFactory.createElement(this.svgElementName));
return a.setAttribute("points", n), a.setAttribute("stroke-width", i.width || 1), a.setAttribute("stroke", "transparent"), a.setAttribute("fill", "transparent"), l.append(a), this.container.append(l), !e && this.hasPopupData && this._createPopup(), this.container;
}
getElementsToTriggerPopup() {
return M(this, RZ);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
}
RZ = new WeakMap();
class wdg extends xgg {
constructor(I) {
super(I), this.containerClassName = "polygonAnnotation", this.svgElementName = "svg:polygon";
}
}
class pdg extends nt {
constructor(I) {
super(I, {
isRenderable: !0,
ignoreBorder: !0
});
}
render() {
return this.container.classList.add("caretAnnotation"), !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container;
}
}
var fZ, zc, HZ, RS;
class p9 extends nt {
constructor(g) {
super(g, {
isRenderable: !0,
ignoreBorder: !0
});
tg(this, HZ);
tg(this, fZ, null);
tg(this, zc, []);
this.containerClassName = "inkAnnotation", this.svgElementName = "svg:polyline", this.annotationEditorType = this.data.it === "InkHighlight" ? XI.HIGHLIGHT : XI.INK;
}
render() {
this.container.classList.add(this.containerClassName);
const {
data: {
rect: g,
rotation: C,
inkLists: i,
borderStyle: e,
popupRef: A
}
} = this, {
transform: s,
width: l,
height: n
} = ig(this, HZ, RS).call(this, C, g), a = this.svgFactory.create(l, n, !0), d = $(this, fZ, this.svgFactory.createElement("svg:g"));
a.append(d), d.setAttribute("stroke-width", e.width || 1), d.setAttribute("stroke-linecap", "round"), d.setAttribute("stroke-linejoin", "round"), d.setAttribute("stroke-miterlimit", 10), d.setAttribute("stroke", "transparent"), d.setAttribute("fill", "transparent"), d.setAttribute("transform", s);
for (let o = 0, c = i.length; o < c; o++) {
const r = this.svgFactory.createElement(this.svgElementName);
M(this, zc).push(r), r.setAttribute("points", i[o].join(",")), d.append(r);
}
return !A && this.hasPopupData && this._createPopup(), this.container.append(a), this._editOnDoubleClick(), this.container;
}
updateEdited(g) {
super.updateEdited(g);
const {
thickness: C,
points: i,
rect: e
} = g, A = M(this, fZ);
if (C >= 0 && A.setAttribute("stroke-width", C || 1), i)
for (let s = 0, l = M(this, zc).length; s < l; s++)
M(this, zc)[s].setAttribute("points", i[s].join(","));
if (e) {
const {
transform: s,
width: l,
height: n
} = ig(this, HZ, RS).call(this, this.data.rotation, e);
A.parentElement.setAttribute("viewBox", `0 0 ${l} ${n}`), A.setAttribute("transform", s);
}
}
getElementsToTriggerPopup() {
return M(this, zc);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
}
fZ = new WeakMap(), zc = new WeakMap(), HZ = new WeakSet(), RS = function(g, C) {
switch (g) {
case 90:
return {
transform: `rotate(90) translate(${-C[0]},${C[1]}) scale(1,-1)`,
width: C[3] - C[1],
height: C[2] - C[0]
};
case 180:
return {
transform: `rotate(180) translate(${-C[2]},${C[1]}) scale(1,-1)`,
width: C[2] - C[0],
height: C[3] - C[1]
};
case 270:
return {
transform: `rotate(270) translate(${-C[2]},${C[3]}) scale(1,-1)`,
width: C[3] - C[1],
height: C[2] - C[0]
};
default:
return {
transform: `translate(${-C[0]},${C[3]}) scale(1,-1)`,
width: C[2] - C[0],
height: C[3] - C[1]
};
}
};
class jgg extends nt {
constructor(I) {
super(I, {
isRenderable: !0,
ignoreBorder: !0,
createQuadrilaterals: !0
}), this.annotationEditorType = XI.HIGHLIGHT;
}
render() {
return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("highlightAnnotation"), this._editOnDoubleClick(), this.container;
}
}
class Bdg extends nt {
constructor(I) {
super(I, {
isRenderable: !0,
ignoreBorder: !0,
createQuadrilaterals: !0
});
}
render() {
return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("underlineAnnotation"), this.container;
}
}
class Wdg extends nt {
constructor(I) {
super(I, {
isRenderable: !0,
ignoreBorder: !0,
createQuadrilaterals: !0
});
}
render() {
return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("squigglyAnnotation"), this.container;
}
}
class ydg extends nt {
constructor(I) {
super(I, {
isRenderable: !0,
ignoreBorder: !0,
createQuadrilaterals: !0
});
}
render() {
return !this.data.popupRef && this.hasPopupData && this._createPopup(), this.container.classList.add("strikeoutAnnotation"), this.container;
}
}
class Qgg extends nt {
constructor(I) {
super(I, {
isRenderable: !0,
ignoreBorder: !0
}), this.annotationEditorType = XI.STAMP;
}
render() {
return this.container.classList.add("stampAnnotation"), this.container.setAttribute("role", "img"), !this.data.popupRef && this.hasPopupData && this._createPopup(), this._editOnDoubleClick(), this.container;
}
}
var XZ, SZ, fS;
class Ydg extends nt {
constructor(g) {
var i;
super(g, {
isRenderable: !0
});
tg(this, SZ);
tg(this, XZ, null);
const {
file: C
} = this.data;
this.filename = C.filename, this.content = C.content, (i = this.linkService.eventBus) == null || i.dispatch("fileattachmentannotation", {
source: this,
...C
});
}
render() {
this.container.classList.add("fileAttachmentAnnotation");
const {
container: g,
data: C
} = this;
let i;
C.hasAppearance || C.fillAlpha === 0 ? i = document.createElement("div") : (i = document.createElement("img"), i.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(C.name) ? "paperclip" : "pushpin"}.svg`, C.fillAlpha && C.fillAlpha < 1 && (i.style = `filter: opacity(${Math.round(C.fillAlpha * 100)}%);`)), i.addEventListener("dblclick", ig(this, SZ, fS).bind(this)), $(this, XZ, i);
const {
isMac: e
} = Ai.platform;
return g.addEventListener("keydown", (A) => {
A.key === "Enter" && (e ? A.metaKey : A.ctrlKey) && ig(this, SZ, fS).call(this);
}), !C.popupRef && this.hasPopupData ? this._createPopup() : i.classList.add("popupTriggerArea"), g.append(i), g;
}
getElementsToTriggerPopup() {
return M(this, XZ);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
}
XZ = new WeakMap(), SZ = new WeakSet(), fS = function() {
var g;
(g = this.downloadManager) == null || g.openOrDownloadData(this.content, this.filename);
};
var DZ, Jc, fa, KZ, go, XS, SS;
const A1 = class A1 {
constructor({
div: I,
accessibilityManager: g,
annotationCanvasMap: C,
annotationEditorUIManager: i,
page: e,
viewport: A,
structTreeLayer: s
}) {
tg(this, go);
tg(this, DZ, null);
tg(this, Jc, null);
tg(this, fa, /* @__PURE__ */ new Map());
tg(this, KZ, null);
this.div = I, $(this, DZ, g), $(this, Jc, C), $(this, KZ, s || null), this.page = e, this.viewport = A, this.zIndex = 0, this._annotationEditorUIManager = i;
}
hasEditableAnnotations() {
return M(this, fa).size > 0;
}
async render(I) {
var A;
const {
annotations: g
} = I, C = this.div;
cd(C, this.viewport);
const i = /* @__PURE__ */ new Map(), e = {
data: null,
layer: C,
linkService: I.linkService,
downloadManager: I.downloadManager,
imageResourcesPath: I.imageResourcesPath || "",
renderForms: I.renderForms !== !1,
svgFactory: new eV(),
annotationStorage: I.annotationStorage || new Z9(),
enableScripting: I.enableScripting === !0,
hasJSActions: I.hasJSActions,
fieldObjects: I.fieldObjects,
parent: this,
elements: null
};
for (const s of g) {
if (s.noHTML)
continue;
const l = s.annotationType === dt.POPUP;
if (l) {
const d = i.get(s.id);
if (!d)
continue;
e.elements = d;
} else if (s.rect[2] === s.rect[0] || s.rect[3] === s.rect[1])
continue;
e.data = s;
const n = Z8.create(e);
if (!n.isRenderable)
continue;
if (!l && s.popupRef) {
const d = i.get(s.popupRef);
d ? d.push(n) : i.set(s.popupRef, [n]);
}
const a = n.render();
s.hidden && (a.style.visibility = "hidden"), await ig(this, go, XS).call(this, a, s.id), n._isEditable && (M(this, fa).set(n.data.id, n), (A = this._annotationEditorUIManager) == null || A.renderAnnotationElement(n));
}
ig(this, go, SS).call(this);
}
async addLinkAnnotations(I, g) {
const C = {
data: null,
layer: this.div,
linkService: g,
svgFactory: new eV(),
parent: this
};
for (const i of I) {
i.borderStyle || (i.borderStyle = A1._defaultBorderStyle), C.data = i;
const e = Z8.create(C);
if (!e.isRenderable)
continue;
const A = e.render();
await ig(this, go, XS).call(this, A, i.id);
}
}
update({
viewport: I
}) {
const g = this.div;
this.viewport = I, cd(g, {
rotation: I.rotation
}), ig(this, go, SS).call(this), g.hidden = !1;
}
getEditableAnnotations() {
return Array.from(M(this, fa).values());
}
getEditableAnnotation(I) {
return M(this, fa).get(I);
}
static get _defaultBorderStyle() {
return UI(this, "_defaultBorderStyle", Object.freeze({
width: 1,
rawWidth: 1,
style: Qr.SOLID,
dashArray: [3],
horizontalCornerRadius: 0,
verticalCornerRadius: 0
}));
}
};
DZ = new WeakMap(), Jc = new WeakMap(), fa = new WeakMap(), KZ = new WeakMap(), go = new WeakSet(), XS = async function(I, g) {
var A, s;
const C = I.firstChild || I, i = C.id = `${d9}${g}`, e = await ((A = M(this, KZ)) == null ? void 0 : A.getAriaAttributes(i));
if (e)
for (const [l, n] of e)
C.setAttribute(l, n);
this.div.append(I), (s = M(this, DZ)) == null || s.moveElementInDOM(this.div, I, C, !1);
}, SS = function() {
var g;
if (!M(this, Jc))
return;
const I = this.div;
for (const [C, i] of M(this, Jc)) {
const e = I.querySelector(`[data-annotation-id="${C}"]`);
if (!e)
continue;
i.className = "annotationContent";
const {
firstChild: A
} = e;
A ? A.nodeName === "CANVAS" ? A.replaceWith(i) : A.classList.contains("annotationContent") ? A.after(i) : A.before(i) : e.append(i);
const s = M(this, fa).get(C);
s && (s._hasNoCanvas ? ((g = this._annotationEditorUIManager) == null || g.setMissingCanvas(C, e.id, i), s._hasNoCanvas = !1) : s.canvas = i);
}
M(this, Jc).clear();
};
let HS = A1;
const vY = /\r\n?|\n/g;
var YA, be, FZ, Lc, ue, mt, Ogg, Ugg, Egg, NN, gn, VN, MN, Pgg, KS, _gg;
const NC = class NC extends TC {
constructor(g) {
super({
...g,
name: "freeTextEditor"
});
tg(this, mt);
tg(this, YA);
tg(this, be, "");
tg(this, FZ, `${this.id}-editor`);
tg(this, Lc, null);
tg(this, ue);
$(this, YA, g.color || NC._defaultColor || TC._defaultLineColor), $(this, ue, g.fontSize || NC._defaultFontSize);
}
static get _keyboardManager() {
const g = NC.prototype, C = (A) => A.isEmpty(), i = dd.TRANSLATE_SMALL, e = dd.TRANSLATE_BIG;
return UI(this, "_keyboardManager", new lG([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], g.commitOrRemove, {
bubbles: !0
}], [["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], g.commitOrRemove], [["ArrowLeft", "mac+ArrowLeft"], g._translateEmpty, {
args: [-i, 0],
checker: C
}], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], g._translateEmpty, {
args: [-e, 0],
checker: C
}], [["ArrowRight", "mac+ArrowRight"], g._translateEmpty, {
args: [i, 0],
checker: C
}], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], g._translateEmpty, {
args: [e, 0],
checker: C
}], [["ArrowUp", "mac+ArrowUp"], g._translateEmpty, {
args: [0, -i],
checker: C
}], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], g._translateEmpty, {
args: [0, -e],
checker: C
}], [["ArrowDown", "mac+ArrowDown"], g._translateEmpty, {
args: [0, i],
checker: C
}], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], g._translateEmpty, {
args: [0, e],
checker: C
}]]));
}
static initialize(g, C) {
TC.initialize(g, C);
const i = getComputedStyle(document.documentElement);
this._internalPadding = parseFloat(i.getPropertyValue("--freetext-padding"));
}
static updateDefaultParams(g, C) {
switch (g) {
case iC.FREETEXT_SIZE:
NC._defaultFontSize = C;
break;
case iC.FREETEXT_COLOR:
NC._defaultColor = C;
break;
}
}
updateParams(g, C) {
switch (g) {
case iC.FREETEXT_SIZE:
ig(this, mt, Ogg).call(this, C);
break;
case iC.FREETEXT_COLOR:
ig(this, mt, Ugg).call(this, C);
break;
}
}
static get defaultPropertiesToUpdate() {
return [[iC.FREETEXT_SIZE, NC._defaultFontSize], [iC.FREETEXT_COLOR, NC._defaultColor || TC._defaultLineColor]];
}
get propertiesToUpdate() {
return [[iC.FREETEXT_SIZE, M(this, ue)], [iC.FREETEXT_COLOR, M(this, YA)]];
}
_translateEmpty(g, C) {
this._uiManager.translateSelectedEditors(g, C, !0);
}
getInitialTranslation() {
const g = this.parentScale;
return [-NC._internalPadding * g, -(NC._internalPadding + M(this, ue)) * g];
}
rebuild() {
this.parent && (super.rebuild(), this.div !== null && (this.isAttachedToDOM || this.parent.add(this)));
}
enableEditMode() {
if (this.isInEditMode())
return;
this.parent.setEditingState(!1), this.parent.updateToolbar(XI.FREETEXT), super.enableEditMode(), this.overlayDiv.classList.remove("enabled"), this.editorDiv.contentEditable = !0, this._isDraggable = !1, this.div.removeAttribute("aria-activedescendant"), $(this, Lc, new AbortController());
const g = this._uiManager.combinedSignal(M(this, Lc));
this.editorDiv.addEventListener("keydown", this.editorDivKeydown.bind(this), {
signal: g
}), this.editorDiv.addEventListener("focus", this.editorDivFocus.bind(this), {
signal: g
}), this.editorDiv.addEventListener("blur", this.editorDivBlur.bind(this), {
signal: g
}), this.editorDiv.addEventListener("input", this.editorDivInput.bind(this), {
signal: g
}), this.editorDiv.addEventListener("paste", this.editorDivPaste.bind(this), {
signal: g
});
}
disableEditMode() {
var g;
this.isInEditMode() && (this.parent.setEditingState(!0), super.disableEditMode(), this.overlayDiv.classList.add("enabled"), this.editorDiv.contentEditable = !1, this.div.setAttribute("aria-activedescendant", M(this, FZ)), this._isDraggable = !0, (g = M(this, Lc)) == null || g.abort(), $(this, Lc, null), this.div.focus({
preventScroll: !0
}), this.isEditing = !1, this.parent.div.classList.add("freetextEditing"));
}
focusin(g) {
this._focusEventsAllowed && (super.focusin(g), g.target !== this.editorDiv && this.editorDiv.focus());
}
onceAdded(g) {
var C;
this.width || (this.enableEditMode(), g && this.editorDiv.focus(), (C = this._initialOptions) != null && C.isCentered && this.center(), this._initialOptions = null);
}
isEmpty() {
return !this.editorDiv || this.editorDiv.innerText.trim() === "";
}
remove() {
this.isEditing = !1, this.parent && (this.parent.setEditingState(!0), this.parent.div.classList.add("freetextEditing")), super.remove();
}
commit() {
if (!this.isInEditMode())
return;
super.commit(), this.disableEditMode();
const g = M(this, be), C = $(this, be, ig(this, mt, Egg).call(this).trimEnd());
if (g === C)
return;
const i = (e) => {
if ($(this, be, e), !e) {
this.remove();
return;
}
ig(this, mt, MN).call(this), this._uiManager.rebuild(this), ig(this, mt, NN).call(this);
};
this.addCommands({
cmd: () => {
i(C);
},
undo: () => {
i(g);
},
mustExec: !1
}), ig(this, mt, NN).call(this);
}
shouldGetKeyboardEvents() {
return this.isInEditMode();
}
enterInEditMode() {
this.enableEditMode(), this.editorDiv.focus();
}
dblclick(g) {
this.enterInEditMode();
}
keydown(g) {
g.target === this.div && g.key === "Enter" && (this.enterInEditMode(), g.preventDefault());
}
editorDivKeydown(g) {
NC._keyboardManager.exec(this, g);
}
editorDivFocus(g) {
this.isEditing = !0;
}
editorDivBlur(g) {
this.isEditing = !1;
}
editorDivInput(g) {
this.parent.div.classList.toggle("freetextEditing", this.isEmpty());
}
disableEditing() {
this.editorDiv.setAttribute("role", "comment"), this.editorDiv.removeAttribute("aria-multiline");
}
enableEditing() {
this.editorDiv.setAttribute("role", "textbox"), this.editorDiv.setAttribute("aria-multiline", !0);
}
render() {
if (this.div)
return this.div;
let g, C;
(this._isCopy || this.annotationElementId) && (g = this.x, C = this.y), super.render(), this.editorDiv = document.createElement("div"), this.editorDiv.className = "internal", this.editorDiv.setAttribute("id", M(this, FZ)), this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text2"), this.editorDiv.setAttribute("data-l10n-attrs", "default-content"), this.enableEditing(), this.editorDiv.contentEditable = !0;
const {
style: i
} = this.editorDiv;
if (i.fontSize = `calc(${M(this, ue)}px * var(--total-scale-factor))`, i.color = M(this, YA), this.div.append(this.editorDiv), this.overlayDiv = document.createElement("div"), this.overlayDiv.classList.add("overlay", "enabled"), this.div.append(this.overlayDiv), m9(this, this.div, ["dblclick", "keydown"]), this._isCopy || this.annotationElementId) {
const [e, A] = this.parentDimensions;
if (this.annotationElementId) {
const {
position: s
} = this._initialData;
let [l, n] = this.getInitialTranslation();
[l, n] = this.pageTranslationToScreen(l, n);
const [a, d] = this.pageDimensions, [o, c] = this.pageTranslation;
let r, h;
switch (this.rotation) {
case 0:
r = g + (s[0] - o) / a, h = C + this.height - (s[1] - c) / d;
break;
case 90:
r = g + (s[0] - o) / a, h = C - (s[1] - c) / d, [l, n] = [n, -l];
break;
case 180:
r = g - this.width + (s[0] - o) / a, h = C - (s[1] - c) / d, [l, n] = [-l, -n];
break;
case 270:
r = g + (s[0] - o - this.height * d) / a, h = C + (s[1] - c - this.width * a) / d, [l, n] = [-n, l];
break;
}
this.setAt(r * e, h * A, l, n);
} else
this._moveAfterPaste(g, C);
ig(this, mt, MN).call(this), this._isDraggable = !0, this.editorDiv.contentEditable = !1;
} else
this._isDraggable = !1, this.editorDiv.contentEditable = !0;
return this.div;
}
editorDivPaste(g) {
var r, h, b;
const C = g.clipboardData || window.clipboardData, {
types: i
} = C;
if (i.length === 1 && i[0] === "text/plain")
return;
g.preventDefault();
const e = ig(r = NC, gn, KS).call(r, C.getData("text") || "").replaceAll(vY, `
`);
if (!e)
return;
const A = window.getSelection();
if (!A.rangeCount)
return;
this.editorDiv.normalize(), A.deleteFromDocument();
const s = A.getRangeAt(0);
if (!e.includes(`
`)) {
s.insertNode(document.createTextNode(e)), this.editorDiv.normalize(), A.collapseToStart();
return;
}
const {
startContainer: l,
startOffset: n
} = s, a = [], d = [];
if (l.nodeType === Node.TEXT_NODE) {
const u = l.parentElement;
if (d.push(l.nodeValue.slice(n).replaceAll(vY, "")), u !== this.editorDiv) {
let m = a;
for (const Z of this.editorDiv.childNodes) {
if (Z === u) {
m = d;
continue;
}
m.push(ig(h = NC, gn, VN).call(h, Z));
}
}
a.push(l.nodeValue.slice(0, n).replaceAll(vY, ""));
} else if (l === this.editorDiv) {
let u = a, m = 0;
for (const Z of this.editorDiv.childNodes)
m++ === n && (u = d), u.push(ig(b = NC, gn, VN).call(b, Z));
}
$(this, be, `${a.join(`
`)}${e}${d.join(`
`)}`), ig(this, mt, MN).call(this);
const o = new Range();
let c = Math.sumPrecise(a.map((u) => u.length));
for (const {
firstChild: u
} of this.editorDiv.childNodes)
if (u.nodeType === Node.TEXT_NODE) {
const m = u.nodeValue.length;
if (c <= m) {
o.setStart(u, c), o.setEnd(u, c);
break;
}
c -= m;
}
A.removeAllRanges(), A.addRange(o);
}
get contentDiv() {
return this.editorDiv;
}
static async deserialize(g, C, i) {
var s;
let e = null;
if (g instanceof Tgg) {
const {
data: {
defaultAppearanceData: {
fontSize: l,
fontColor: n
},
rect: a,
rotation: d,
id: o,
popupRef: c
},
textContent: r,
textPosition: h,
parent: {
page: {
pageNumber: b
}
}
} = g;
if (!r || r.length === 0)
return null;
e = g = {
annotationType: XI.FREETEXT,
color: Array.from(n),
fontSize: l,
value: r.join(`
`),
position: h,
pageIndex: b - 1,
rect: a.slice(0),
rotation: d,
id: o,
deleted: !1,
popupRef: c
};
}
const A = await super.deserialize(g, C, i);
return $(A, ue, g.fontSize), $(A, YA, AI.makeHexColor(...g.color)), $(A, be, ig(s = NC, gn, KS).call(s, g.value)), A.annotationElementId = g.id || null, A._initialData = e, A;
}
serialize(g = !1) {
if (this.isEmpty())
return null;
if (this.deleted)
return this.serializeDeleted();
const C = NC._internalPadding * this.parentScale, i = this.getRect(C, C), e = TC._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : M(this, YA)), A = {
annotationType: XI.FREETEXT,
color: e,
fontSize: M(this, ue),
value: ig(this, mt, Pgg).call(this),
pageIndex: this.pageIndex,
rect: i,
rotation: this.rotation,
structTreeParentId: this._structTreeParentId
};
return g ? (A.isCopy = !0, A) : this.annotationElementId && !ig(this, mt, _gg).call(this, A) ? null : (A.id = this.annotationElementId, A);
}
renderAnnotationElement(g) {
const C = super.renderAnnotationElement(g);
if (this.deleted)
return C;
const {
style: i
} = C;
i.fontSize = `calc(${M(this, ue)}px * var(--total-scale-factor))`, i.color = M(this, YA), C.replaceChildren();
for (const A of M(this, be).split(`
`)) {
const s = document.createElement("div");
s.append(A ? document.createTextNode(A) : document.createElement("br")), C.append(s);
}
const e = NC._internalPadding * this.parentScale;
return g.updateEdited({
rect: this.getRect(e, e),
popupContent: M(this, be)
}), C;
}
resetAnnotationElement(g) {
super.resetAnnotationElement(g), g.resetEdited();
}
};
YA = new WeakMap(), be = new WeakMap(), FZ = new WeakMap(), Lc = new WeakMap(), ue = new WeakMap(), mt = new WeakSet(), Ogg = function(g) {
const C = (e) => {
this.editorDiv.style.fontSize = `calc(${e}px * var(--total-scale-factor))`, this.translate(0, -(e - M(this, ue)) * this.parentScale), $(this, ue, e), ig(this, mt, NN).call(this);
}, i = M(this, ue);
this.addCommands({
cmd: C.bind(this, g),
undo: C.bind(this, i),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: !0,
type: iC.FREETEXT_SIZE,
overwriteIfSameType: !0,
keepUndo: !0
});
}, Ugg = function(g) {
const C = (e) => {
$(this, YA, this.editorDiv.style.color = e);
}, i = M(this, YA);
this.addCommands({
cmd: C.bind(this, g),
undo: C.bind(this, i),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: !0,
type: iC.FREETEXT_COLOR,
overwriteIfSameType: !0,
keepUndo: !0
});
}, Egg = function() {
var i;
const g = [];
this.editorDiv.normalize();
let C = null;
for (const e of this.editorDiv.childNodes)
(C == null ? void 0 : C.nodeType) === Node.TEXT_NODE && e.nodeName === "BR" || (g.push(ig(i = NC, gn, VN).call(i, e)), C = e);
return g.join(`
`);
}, NN = function() {
const [g, C] = this.parentDimensions;
let i;
if (this.isAttachedToDOM)
i = this.div.getBoundingClientRect();
else {
const {
currentLayer: e,
div: A
} = this, s = A.style.display, l = A.classList.contains("hidden");
A.classList.remove("hidden"), A.style.display = "hidden", e.div.append(this.div), i = A.getBoundingClientRect(), A.remove(), A.style.display = s, A.classList.toggle("hidden", l);
}
this.rotation % 180 === this.parentRotation % 180 ? (this.width = i.width / g, this.height = i.height / C) : (this.width = i.height / g, this.height = i.width / C), this.fixAndSetPosition();
}, gn = new WeakSet(), VN = function(g) {
return (g.nodeType === Node.TEXT_NODE ? g.nodeValue : g.innerText).replaceAll(vY, "");
}, MN = function() {
if (this.editorDiv.replaceChildren(), !!M(this, be))
for (const g of M(this, be).split(`
`)) {
const C = document.createElement("div");
C.append(g ? document.createTextNode(g) : document.createElement("br")), this.editorDiv.append(C);
}
}, Pgg = function() {
return M(this, be).replaceAll(" ", " ");
}, KS = function(g) {
return g.replaceAll(" ", " ");
}, _gg = function(g) {
const {
value: C,
fontSize: i,
color: e,
pageIndex: A
} = this._initialData;
return this._hasBeenMoved || g.value !== C || g.fontSize !== i || g.color.some((s, l) => s !== e[l]) || g.pageIndex !== A;
}, tg(NC, gn), iI(NC, "_freeTextDefaultContent", ""), iI(NC, "_internalPadding", 0), iI(NC, "_defaultColor", null), iI(NC, "_defaultFontSize", 10), iI(NC, "_type", "freetext"), iI(NC, "_editorType", XI.FREETEXT);
let DS = NC;
class $g {
toSVGPath() {
BC("Abstract method `toSVGPath` must be implemented.");
}
get box() {
BC("Abstract getter `box` must be implemented.");
}
serialize(I, g) {
BC("Abstract method `serialize` must be implemented.");
}
static _rescale(I, g, C, i, e, A) {
A || (A = new Float32Array(I.length));
for (let s = 0, l = I.length; s < l; s += 2)
A[s] = g + I[s] * i, A[s + 1] = C + I[s + 1] * e;
return A;
}
static _rescaleAndSwap(I, g, C, i, e, A) {
A || (A = new Float32Array(I.length));
for (let s = 0, l = I.length; s < l; s += 2)
A[s] = g + I[s + 1] * i, A[s + 1] = C + I[s] * e;
return A;
}
static _translate(I, g, C, i) {
i || (i = new Float32Array(I.length));
for (let e = 0, A = I.length; e < A; e += 2)
i[e] = g + I[e], i[e + 1] = C + I[e + 1];
return i;
}
static svgRound(I) {
return Math.round(I * 1e4);
}
static _normalizePoint(I, g, C, i, e) {
switch (e) {
case 90:
return [1 - g / C, I / i];
case 180:
return [1 - I / C, 1 - g / i];
case 270:
return [g / C, 1 - I / i];
default:
return [I / C, g / i];
}
}
static _normalizePagePoint(I, g, C) {
switch (C) {
case 90:
return [1 - g, I];
case 180:
return [1 - I, 1 - g];
case 270:
return [g, 1 - I];
default:
return [I, g];
}
}
static createBezierPoints(I, g, C, i, e, A) {
return [(I + 5 * C) / 6, (g + 5 * i) / 6, (5 * C + e) / 6, (5 * i + A) / 6, (C + e) / 2, (i + A) / 2];
}
}
iI($g, "PRECISION", 1e-4);
var me, NA, C0, t0, Ys, TI, vc, Tc, kZ, zZ, i0, e0, Ha, JZ, jV, QV, Nt, $u, qgg, $gg, gIg, IIg, CIg, tIg;
const ml = class ml {
constructor({
x: I,
y: g
}, C, i, e, A, s = 0) {
tg(this, Nt);
tg(this, me);
tg(this, NA, []);
tg(this, C0);
tg(this, t0);
tg(this, Ys, []);
tg(this, TI, new Float32Array(18));
tg(this, vc);
tg(this, Tc);
tg(this, kZ);
tg(this, zZ);
tg(this, i0);
tg(this, e0);
tg(this, Ha, []);
$(this, me, C), $(this, e0, e * i), $(this, t0, A), M(this, TI).set([NaN, NaN, NaN, NaN, I, g], 6), $(this, C0, s), $(this, zZ, M(ml, JZ) * i), $(this, kZ, M(ml, QV) * i), $(this, i0, i), M(this, Ha).push(I, g);
}
isEmpty() {
return isNaN(M(this, TI)[8]);
}
add({
x: I,
y: g
}) {
var S;
$(this, vc, I), $(this, Tc, g);
const [C, i, e, A] = M(this, me);
let [s, l, n, a] = M(this, TI).subarray(8, 12);
const d = I - n, o = g - a, c = Math.hypot(d, o);
if (c < M(this, kZ))
return !1;
const r = c - M(this, zZ), h = r / c, b = h * d, u = h * o;
let m = s, Z = l;
s = n, l = a, n += b, a += u, (S = M(this, Ha)) == null || S.push(I, g);
const p = -u / r, Y = b / r, R = p * M(this, e0), X = Y * M(this, e0);
return M(this, TI).set(M(this, TI).subarray(2, 8), 0), M(this, TI).set([n + R, a + X], 4), M(this, TI).set(M(this, TI).subarray(14, 18), 12), M(this, TI).set([n - R, a - X], 16), isNaN(M(this, TI)[6]) ? (M(this, Ys).length === 0 && (M(this, TI).set([s + R, l + X], 2), M(this, Ys).push(NaN, NaN, NaN, NaN, (s + R - C) / e, (l + X - i) / A), M(this, TI).set([s - R, l - X], 14), M(this, NA).push(NaN, NaN, NaN, NaN, (s - R - C) / e, (l - X - i) / A)), M(this, TI).set([m, Z, s, l, n, a], 6), !this.isEmpty()) : (M(this, TI).set([m, Z, s, l, n, a], 6), Math.abs(Math.atan2(Z - l, m - s) - Math.atan2(u, b)) < Math.PI / 2 ? ([s, l, n, a] = M(this, TI).subarray(2, 6), M(this, Ys).push(NaN, NaN, NaN, NaN, ((s + n) / 2 - C) / e, ((l + a) / 2 - i) / A), [s, l, m, Z] = M(this, TI).subarray(14, 18), M(this, NA).push(NaN, NaN, NaN, NaN, ((m + s) / 2 - C) / e, ((Z + l) / 2 - i) / A), !0) : ([m, Z, s, l, n, a] = M(this, TI).subarray(0, 6), M(this, Ys).push(((m + 5 * s) / 6 - C) / e, ((Z + 5 * l) / 6 - i) / A, ((5 * s + n) / 6 - C) / e, ((5 * l + a) / 6 - i) / A, ((s + n) / 2 - C) / e, ((l + a) / 2 - i) / A), [n, a, s, l, m, Z] = M(this, TI).subarray(12, 18), M(this, NA).push(((m + 5 * s) / 6 - C) / e, ((Z + 5 * l) / 6 - i) / A, ((5 * s + n) / 6 - C) / e, ((5 * l + a) / 6 - i) / A, ((s + n) / 2 - C) / e, ((l + a) / 2 - i) / A), !0));
}
toSVGPath() {
if (this.isEmpty())
return "";
const I = M(this, Ys), g = M(this, NA);
if (isNaN(M(this, TI)[6]) && !this.isEmpty())
return ig(this, Nt, qgg).call(this);
const C = [];
C.push(`M${I[4]} ${I[5]}`);
for (let i = 6; i < I.length; i += 6)
isNaN(I[i]) ? C.push(`L${I[i + 4]} ${I[i + 5]}`) : C.push(`C${I[i]} ${I[i + 1]} ${I[i + 2]} ${I[i + 3]} ${I[i + 4]} ${I[i + 5]}`);
ig(this, Nt, gIg).call(this, C);
for (let i = g.length - 6; i >= 6; i -= 6)
isNaN(g[i]) ? C.push(`L${g[i + 4]} ${g[i + 5]}`) : C.push(`C${g[i]} ${g[i + 1]} ${g[i + 2]} ${g[i + 3]} ${g[i + 4]} ${g[i + 5]}`);
return ig(this, Nt, $gg).call(this, C), C.join(" ");
}
newFreeDrawOutline(I, g, C, i, e, A) {
return new iIg(I, g, C, i, e, A);
}
getOutlines() {
var d;
const I = M(this, Ys), g = M(this, NA), C = M(this, TI), [i, e, A, s] = M(this, me), l = new Float32Array((((d = M(this, Ha)) == null ? void 0 : d.length) ?? 0) + 2);
for (let o = 0, c = l.length - 2; o < c; o += 2)
l[o] = (M(this, Ha)[o] - i) / A, l[o + 1] = (M(this, Ha)[o + 1] - e) / s;
if (l[l.length - 2] = (M(this, vc) - i) / A, l[l.length - 1] = (M(this, Tc) - e) / s, isNaN(C[6]) && !this.isEmpty())
return ig(this, Nt, IIg).call(this, l);
const n = new Float32Array(M(this, Ys).length + 24 + M(this, NA).length);
let a = I.length;
for (let o = 0; o < a; o += 2) {
if (isNaN(I[o])) {
n[o] = n[o + 1] = NaN;
continue;
}
n[o] = I[o], n[o + 1] = I[o + 1];
}
a = ig(this, Nt, tIg).call(this, n, a);
for (let o = g.length - 6; o >= 6; o -= 6)
for (let c = 0; c < 6; c += 2) {
if (isNaN(g[o + c])) {
n[a] = n[a + 1] = NaN, a += 2;
continue;
}
n[a] = g[o + c], n[a + 1] = g[o + c + 1], a += 2;
}
return ig(this, Nt, CIg).call(this, n, a), this.newFreeDrawOutline(n, l, M(this, me), M(this, i0), M(this, C0), M(this, t0));
}
};
me = new WeakMap(), NA = new WeakMap(), C0 = new WeakMap(), t0 = new WeakMap(), Ys = new WeakMap(), TI = new WeakMap(), vc = new WeakMap(), Tc = new WeakMap(), kZ = new WeakMap(), zZ = new WeakMap(), i0 = new WeakMap(), e0 = new WeakMap(), Ha = new WeakMap(), JZ = new WeakMap(), jV = new WeakMap(), QV = new WeakMap(), Nt = new WeakSet(), $u = function() {
const I = M(this, TI).subarray(4, 6), g = M(this, TI).subarray(16, 18), [C, i, e, A] = M(this, me);
return [(M(this, vc) + (I[0] - g[0]) / 2 - C) / e, (M(this, Tc) + (I[1] - g[1]) / 2 - i) / A, (M(this, vc) + (g[0] - I[0]) / 2 - C) / e, (M(this, Tc) + (g[1] - I[1]) / 2 - i) / A];
}, qgg = function() {
const [I, g, C, i] = M(this, me), [e, A, s, l] = ig(this, Nt, $u).call(this);
return `M${(M(this, TI)[2] - I) / C} ${(M(this, TI)[3] - g) / i} L${(M(this, TI)[4] - I) / C} ${(M(this, TI)[5] - g) / i} L${e} ${A} L${s} ${l} L${(M(this, TI)[16] - I) / C} ${(M(this, TI)[17] - g) / i} L${(M(this, TI)[14] - I) / C} ${(M(this, TI)[15] - g) / i} Z`;
}, $gg = function(I) {
const g = M(this, NA);
I.push(`L${g[4]} ${g[5]} Z`);
}, gIg = function(I) {
const [g, C, i, e] = M(this, me), A = M(this, TI).subarray(4, 6), s = M(this, TI).subarray(16, 18), [l, n, a, d] = ig(this, Nt, $u).call(this);
I.push(`L${(A[0] - g) / i} ${(A[1] - C) / e} L${l} ${n} L${a} ${d} L${(s[0] - g) / i} ${(s[1] - C) / e}`);
}, IIg = function(I) {
const g = M(this, TI), [C, i, e, A] = M(this, me), [s, l, n, a] = ig(this, Nt, $u).call(this), d = new Float32Array(36);
return d.set([NaN, NaN, NaN, NaN, (g[2] - C) / e, (g[3] - i) / A, NaN, NaN, NaN, NaN, (g[4] - C) / e, (g[5] - i) / A, NaN, NaN, NaN, NaN, s, l, NaN, NaN, NaN, NaN, n, a, NaN, NaN, NaN, NaN, (g[16] - C) / e, (g[17] - i) / A, NaN, NaN, NaN, NaN, (g[14] - C) / e, (g[15] - i) / A], 0), this.newFreeDrawOutline(d, I, M(this, me), M(this, i0), M(this, C0), M(this, t0));
}, CIg = function(I, g) {
const C = M(this, NA);
return I.set([NaN, NaN, NaN, NaN, C[4], C[5]], g), g += 6;
}, tIg = function(I, g) {
const C = M(this, TI).subarray(4, 6), i = M(this, TI).subarray(16, 18), [e, A, s, l] = M(this, me), [n, a, d, o] = ig(this, Nt, $u).call(this);
return I.set([NaN, NaN, NaN, NaN, (C[0] - e) / s, (C[1] - A) / l, NaN, NaN, NaN, NaN, n, a, NaN, NaN, NaN, NaN, d, o, NaN, NaN, NaN, NaN, (i[0] - e) / s, (i[1] - A) / l], g), g += 24;
}, tg(ml, JZ, 8), tg(ml, jV, 2), tg(ml, QV, M(ml, JZ) + M(ml, jV));
let AV = ml;
var A0, xc, kl, LZ, Ze, vZ, et, OV, eIg;
class iIg extends $g {
constructor(g, C, i, e, A, s) {
super();
tg(this, OV);
tg(this, A0);
tg(this, xc, new Float32Array(4));
tg(this, kl);
tg(this, LZ);
tg(this, Ze);
tg(this, vZ);
tg(this, et);
$(this, et, g), $(this, Ze, C), $(this, A0, i), $(this, vZ, e), $(this, kl, A), $(this, LZ, s), this.lastPoint = [NaN, NaN], ig(this, OV, eIg).call(this, s);
const [l, n, a, d] = M(this, xc);
for (let o = 0, c = g.length; o < c; o += 2)
g[o] = (g[o] - l) / a, g[o + 1] = (g[o + 1] - n) / d;
for (let o = 0, c = C.length; o < c; o += 2)
C[o] = (C[o] - l) / a, C[o + 1] = (C[o + 1] - n) / d;
}
toSVGPath() {
const g = [`M${M(this, et)[4]} ${M(this, et)[5]}`];
for (let C = 6, i = M(this, et).length; C < i; C += 6) {
if (isNaN(M(this, et)[C])) {
g.push(`L${M(this, et)[C + 4]} ${M(this, et)[C + 5]}`);
continue;
}
g.push(`C${M(this, et)[C]} ${M(this, et)[C + 1]} ${M(this, et)[C + 2]} ${M(this, et)[C + 3]} ${M(this, et)[C + 4]} ${M(this, et)[C + 5]}`);
}
return g.push("Z"), g.join(" ");
}
serialize([g, C, i, e], A) {
const s = i - g, l = e - C;
let n, a;
switch (A) {
case 0:
n = $g._rescale(M(this, et), g, e, s, -l), a = $g._rescale(M(this, Ze), g, e, s, -l);
break;
case 90:
n = $g._rescaleAndSwap(M(this, et), g, C, s, l), a = $g._rescaleAndSwap(M(this, Ze), g, C, s, l);
break;
case 180:
n = $g._rescale(M(this, et), i, C, -s, l), a = $g._rescale(M(this, Ze), i, C, -s, l);
break;
case 270:
n = $g._rescaleAndSwap(M(this, et), i, e, -s, -l), a = $g._rescaleAndSwap(M(this, Ze), i, e, -s, -l);
break;
}
return {
outline: Array.from(n),
points: [Array.from(a)]
};
}
get box() {
return M(this, xc);
}
newOutliner(g, C, i, e, A, s = 0) {
return new AV(g, C, i, e, A, s);
}
getNewOutline(g, C) {
const [i, e, A, s] = M(this, xc), [l, n, a, d] = M(this, A0), o = A * a, c = s * d, r = i * a + l, h = e * d + n, b = this.newOutliner({
x: M(this, Ze)[0] * o + r,
y: M(this, Ze)[1] * c + h
}, M(this, A0), M(this, vZ), g, M(this, LZ), C ?? M(this, kl));
for (let u = 2; u < M(this, Ze).length; u += 2)
b.add({
x: M(this, Ze)[u] * o + r,
y: M(this, Ze)[u + 1] * c + h
});
return b.getOutlines();
}
}
A0 = new WeakMap(), xc = new WeakMap(), kl = new WeakMap(), LZ = new WeakMap(), Ze = new WeakMap(), vZ = new WeakMap(), et = new WeakMap(), OV = new WeakSet(), eIg = function(g) {
const C = M(this, et);
let i = C[4], e = C[5];
const A = [i, e, i, e];
let s = i, l = e;
const n = g ? Math.max : Math.min;
for (let d = 6, o = C.length; d < o; d += 6) {
const c = C[d + 4], r = C[d + 5];
if (isNaN(C[d]))
AI.pointBoundingBox(c, r, A), l < r ? (s = c, l = r) : l === r && (s = n(s, c));
else {
const h = [1 / 0, 1 / 0, -1 / 0, -1 / 0];
AI.bezierBoundingBox(i, e, ...C.slice(d, d + 6), h), AI.rectBoundingBox(...h, A), l < h[3] ? (s = h[2], l = h[3]) : l === h[3] && (s = n(s, h[2]));
}
i = c, e = r;
}
const a = M(this, xc);
a[0] = A[0] - M(this, kl), a[1] = A[1] - M(this, kl), a[2] = A[2] - A[0] + 2 * M(this, kl), a[3] = A[3] - A[1] + 2 * M(this, kl), this.lastPoint = [s, l];
};
var TZ, xZ, Xa, VA, Xi, AIg, RN, sIg, lIg, kS;
class FS {
constructor(I, g = 0, C = 0, i = !0) {
tg(this, Xi);
tg(this, TZ);
tg(this, xZ);
tg(this, Xa, []);
tg(this, VA, []);
const e = [1 / 0, 1 / 0, -1 / 0, -1 / 0], A = 10 ** -4;
for (const {
x: c,
y: r,
width: h,
height: b
} of I) {
const u = Math.floor((c - g) / A) * A, m = Math.ceil((c + h + g) / A) * A, Z = Math.floor((r - g) / A) * A, p = Math.ceil((r + b + g) / A) * A, Y = [u, Z, p, !0], R = [m, Z, p, !1];
M(this, Xa).push(Y, R), AI.rectBoundingBox(u, Z, m, p, e);
}
const s = e[2] - e[0] + 2 * C, l = e[3] - e[1] + 2 * C, n = e[0] - C, a = e[1] - C, d = M(this, Xa).at(i ? -1 : -2), o = [d[0], d[2]];
for (const c of M(this, Xa)) {
const [r, h, b] = c;
c[0] = (r - n) / s, c[1] = (h - a) / l, c[2] = (b - a) / l;
}
$(this, TZ, new Float32Array([n, a, s, l])), $(this, xZ, o);
}
getOutlines() {
M(this, Xa).sort((g, C) => g[0] - C[0] || g[1] - C[1] || g[2] - C[2]);
const I = [];
for (const g of M(this, Xa))
g[3] ? (I.push(...ig(this, Xi, kS).call(this, g)), ig(this, Xi, sIg).call(this, g)) : (ig(this, Xi, lIg).call(this, g), I.push(...ig(this, Xi, kS).call(this, g)));
return ig(this, Xi, AIg).call(this, I);
}
}
TZ = new WeakMap(), xZ = new WeakMap(), Xa = new WeakMap(), VA = new WeakMap(), Xi = new WeakSet(), AIg = function(I) {
const g = [], C = /* @__PURE__ */ new Set();
for (const A of I) {
const [s, l, n] = A;
g.push([s, l, A], [s, n, A]);
}
g.sort((A, s) => A[1] - s[1] || A[0] - s[0]);
for (let A = 0, s = g.length; A < s; A += 2) {
const l = g[A][2], n = g[A + 1][2];
l.push(n), n.push(l), C.add(l), C.add(n);
}
const i = [];
let e;
for (; C.size > 0; ) {
const A = C.values().next().value;
let [s, l, n, a, d] = A;
C.delete(A);
let o = s, c = l;
for (e = [s, n], i.push(e); ; ) {
let r;
if (C.has(a))
r = a;
else if (C.has(d))
r = d;
else
break;
C.delete(r), [s, l, n, a, d] = r, o !== s && (e.push(o, c, s, c === l ? l : n), o = s), c = c === l ? n : l;
}
e.push(o, c);
}
return new Ndg(i, M(this, TZ), M(this, xZ));
}, RN = function(I) {
const g = M(this, VA);
let C = 0, i = g.length - 1;
for (; C <= i; ) {
const e = C + i >> 1, A = g[e][0];
if (A === I)
return e;
A < I ? C = e + 1 : i = e - 1;
}
return i + 1;
}, sIg = function([, I, g]) {
const C = ig(this, Xi, RN).call(this, I);
M(this, VA).splice(C, 0, [I, g]);
}, lIg = function([, I, g]) {
const C = ig(this, Xi, RN).call(this, I);
for (let i = C; i < M(this, VA).length; i++) {
const [e, A] = M(this, VA)[i];
if (e !== I)
break;
if (e === I && A === g) {
M(this, VA).splice(i, 1);
return;
}
}
for (let i = C - 1; i >= 0; i--) {
const [e, A] = M(this, VA)[i];
if (e !== I)
break;
if (e === I && A === g) {
M(this, VA).splice(i, 1);
return;
}
}
}, kS = function(I) {
const [g, C, i] = I, e = [[g, C, i]], A = ig(this, Xi, RN).call(this, i);
for (let s = 0; s < A; s++) {
const [l, n] = M(this, VA)[s];
for (let a = 0, d = e.length; a < d; a++) {
const [, o, c] = e[a];
if (!(n <= o || c <= l)) {
if (o >= l) {
if (c > n)
e[a][1] = n;
else {
if (d === 1)
return [];
e.splice(a, 1), a--, d--;
}
continue;
}
e[a][2] = l, c > n && e.push([g, n, c]);
}
}
}
return e;
};
var jZ, s0;
class Ndg extends $g {
constructor(g, C, i) {
super();
tg(this, jZ);
tg(this, s0);
$(this, s0, g), $(this, jZ, C), this.lastPoint = i;
}
toSVGPath() {
const g = [];
for (const C of M(this, s0)) {
let [i, e] = C;
g.push(`M${i} ${e}`);
for (let A = 2; A < C.length; A += 2) {
const s = C[A], l = C[A + 1];
s === i ? (g.push(`V${l}`), e = l) : l === e && (g.push(`H${s}`), i = s);
}
g.push("Z");
}
return g.join(" ");
}
serialize([g, C, i, e], A) {
const s = [], l = i - g, n = e - C;
for (const a of M(this, s0)) {
const d = new Array(a.length);
for (let o = 0; o < a.length; o += 2)
d[o] = g + a[o] * l, d[o + 1] = e - a[o + 1] * n;
s.push(d);
}
return s;
}
get box() {
return M(this, jZ);
}
get classNamesForOutlining() {
return ["highlightOutline"];
}
}
jZ = new WeakMap(), s0 = new WeakMap();
class zS extends AV {
newFreeDrawOutline(I, g, C, i, e, A) {
return new Vdg(I, g, C, i, e, A);
}
}
class Vdg extends iIg {
newOutliner(I, g, C, i, e, A = 0) {
return new zS(I, g, C, i, e, A);
}
}
var MA, jc, l0, Wt, QZ, n0, OZ, UZ, Sa, RA, a0, EZ, pC, JS, LS, vS, xo, nIg, $n;
const ji = class ji {
constructor({
editor: I = null,
uiManager: g = null
}) {
tg(this, pC);
tg(this, MA, null);
tg(this, jc, null);
tg(this, l0);
tg(this, Wt, null);
tg(this, QZ, !1);
tg(this, n0, !1);
tg(this, OZ, null);
tg(this, UZ);
tg(this, Sa, null);
tg(this, RA, null);
tg(this, a0);
var C;
I ? ($(this, n0, !1), $(this, a0, iC.HIGHLIGHT_COLOR), $(this, OZ, I)) : ($(this, n0, !0), $(this, a0, iC.HIGHLIGHT_DEFAULT_COLOR)), $(this, RA, (I == null ? void 0 : I._uiManager) || g), $(this, UZ, M(this, RA)._eventBus), $(this, l0, (I == null ? void 0 : I.color) || ((C = M(this, RA)) == null ? void 0 : C.highlightColors.values().next().value) || "#FFFF98"), M(ji, EZ) || $(ji, EZ, Object.freeze({
blue: "pdfjs-editor-colorpicker-blue",
green: "pdfjs-editor-colorpicker-green",
pink: "pdfjs-editor-colorpicker-pink",
red: "pdfjs-editor-colorpicker-red",
yellow: "pdfjs-editor-colorpicker-yellow"
}));
}
static get _keyboardManager() {
return UI(this, "_keyboardManager", new lG([[["Escape", "mac+Escape"], ji.prototype._hideDropdownFromKeyboard], [[" ", "mac+ "], ji.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight", "mac+ArrowDown", "mac+ArrowRight"], ji.prototype._moveToNext], [["ArrowUp", "ArrowLeft", "mac+ArrowUp", "mac+ArrowLeft"], ji.prototype._moveToPrevious], [["Home", "mac+Home"], ji.prototype._moveToBeginning], [["End", "mac+End"], ji.prototype._moveToEnd]]));
}
renderButton() {
const I = $(this, MA, document.createElement("button"));
I.className = "colorPicker", I.tabIndex = "0", I.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button"), I.setAttribute("aria-haspopup", !0);
const g = M(this, RA)._signal;
I.addEventListener("click", ig(this, pC, xo).bind(this), {
signal: g
}), I.addEventListener("keydown", ig(this, pC, vS).bind(this), {
signal: g
});
const C = $(this, jc, document.createElement("span"));
return C.className = "swatch", C.setAttribute("aria-hidden", !0), C.style.backgroundColor = M(this, l0), I.append(C), I;
}
renderMainDropdown() {
const I = $(this, Wt, ig(this, pC, JS).call(this));
return I.setAttribute("aria-orientation", "horizontal"), I.setAttribute("aria-labelledby", "highlightColorPickerLabel"), I;
}
_colorSelectFromKeyboard(I) {
if (I.target === M(this, MA)) {
ig(this, pC, xo).call(this, I);
return;
}
const g = I.target.getAttribute("data-color");
g && ig(this, pC, LS).call(this, g, I);
}
_moveToNext(I) {
var g, C;
if (!M(this, pC, $n)) {
ig(this, pC, xo).call(this, I);
return;
}
if (I.target === M(this, MA)) {
(g = M(this, Wt).firstChild) == null || g.focus();
return;
}
(C = I.target.nextSibling) == null || C.focus();
}
_moveToPrevious(I) {
var g, C;
if (I.target === ((g = M(this, Wt)) == null ? void 0 : g.firstChild) || I.target === M(this, MA)) {
M(this, pC, $n) && this._hideDropdownFromKeyboard();
return;
}
M(this, pC, $n) || ig(this, pC, xo).call(this, I), (C = I.target.previousSibling) == null || C.focus();
}
_moveToBeginning(I) {
var g;
if (!M(this, pC, $n)) {
ig(this, pC, xo).call(this, I);
return;
}
(g = M(this, Wt).firstChild) == null || g.focus();
}
_moveToEnd(I) {
var g;
if (!M(this, pC, $n)) {
ig(this, pC, xo).call(this, I);
return;
}
(g = M(this, Wt).lastChild) == null || g.focus();
}
hideDropdown() {
var I, g;
(I = M(this, Wt)) == null || I.classList.add("hidden"), (g = M(this, Sa)) == null || g.abort(), $(this, Sa, null);
}
_hideDropdownFromKeyboard() {
var I;
if (!M(this, n0)) {
if (!M(this, pC, $n)) {
(I = M(this, OZ)) == null || I.unselect();
return;
}
this.hideDropdown(), M(this, MA).focus({
preventScroll: !0,
focusVisible: M(this, QZ)
});
}
}
updateColor(I) {
if (M(this, jc) && (M(this, jc).style.backgroundColor = I), !M(this, Wt))
return;
const g = M(this, RA).highlightColors.values();
for (const C of M(this, Wt).children)
C.setAttribute("aria-selected", g.next().value === I);
}
destroy() {
var I, g;
(I = M(this, MA)) == null || I.remove(), $(this, MA, null), $(this, jc, null), (g = M(this, Wt)) == null || g.remove(), $(this, Wt, null);
}
};
MA = new WeakMap(), jc = new WeakMap(), l0 = new WeakMap(), Wt = new WeakMap(), QZ = new WeakMap(), n0 = new WeakMap(), OZ = new WeakMap(), UZ = new WeakMap(), Sa = new WeakMap(), RA = new WeakMap(), a0 = new WeakMap(), EZ = new WeakMap(), pC = new WeakSet(), JS = function() {
const I = document.createElement("div"), g = M(this, RA)._signal;
I.addEventListener("contextmenu", zA, {
signal: g
}), I.className = "dropdown", I.role = "listbox", I.setAttribute("aria-multiselectable", !1), I.setAttribute("aria-orientation", "vertical"), I.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown");
for (const [C, i] of M(this, RA).highlightColors) {
const e = document.createElement("button");
e.tabIndex = "0", e.role = "option", e.setAttribute("data-color", i), e.title = C, e.setAttribute("data-l10n-id", M(ji, EZ)[C]);
const A = document.createElement("span");
e.append(A), A.className = "swatch", A.style.backgroundColor = i, e.setAttribute("aria-selected", i === M(this, l0)), e.addEventListener("click", ig(this, pC, LS).bind(this, i), {
signal: g
}), I.append(e);
}
return I.addEventListener("keydown", ig(this, pC, vS).bind(this), {
signal: g
}), I;
}, LS = function(I, g) {
g.stopPropagation(), M(this, UZ).dispatch("switchannotationeditorparams", {
source: this,
type: M(this, a0),
value: I
});
}, vS = function(I) {
ji._keyboardManager.exec(this, I);
}, xo = function(I) {
if (M(this, pC, $n)) {
this.hideDropdown();
return;
}
if ($(this, QZ, I.detail === 0), M(this, Sa) || ($(this, Sa, new AbortController()), window.addEventListener("pointerdown", ig(this, pC, nIg).bind(this), {
signal: M(this, RA).combinedSignal(M(this, Sa))
})), M(this, Wt)) {
M(this, Wt).classList.remove("hidden");
return;
}
const g = $(this, Wt, ig(this, pC, JS).call(this));
M(this, MA).append(g);
}, nIg = function(I) {
var g;
(g = M(this, Wt)) != null && g.contains(I.target) || this.hideDropdown();
}, $n = function() {
return M(this, Wt) && !M(this, Wt).classList.contains("hidden");
}, tg(ji, EZ, null);
let sV = ji;
var o0, PZ, zl, Qc, c0, Ui, _Z, qZ, Oc, Ee, Ge, _t, d0, Jl, Zi, r0, Pe, $Z, kI, TS, fN, aIg, oIg, cIg, xS, jo, CA, qr, dIg, HN, gm, rIg, hIg, bIg, uIg, mIg;
const cC = class cC extends TC {
constructor(g) {
super({
...g,
name: "highlightEditor"
});
tg(this, kI);
tg(this, o0, null);
tg(this, PZ, 0);
tg(this, zl);
tg(this, Qc, null);
tg(this, c0, null);
tg(this, Ui, null);
tg(this, _Z, null);
tg(this, qZ, 0);
tg(this, Oc, null);
tg(this, Ee, null);
tg(this, Ge, null);
tg(this, _t, !1);
tg(this, d0, null);
tg(this, Jl);
tg(this, Zi, null);
tg(this, r0, "");
tg(this, Pe);
tg(this, $Z, "");
this.color = g.color || cC._defaultColor, $(this, Pe, g.thickness || cC._defaultThickness), $(this, Jl, g.opacity || cC._defaultOpacity), $(this, zl, g.boxes || null), $(this, $Z, g.methodOfCreation || ""), $(this, r0, g.text || ""), this._isDraggable = !1, this.defaultL10nId = "pdfjs-editor-highlight-editor", g.highlightId > -1 ? ($(this, _t, !0), ig(this, kI, fN).call(this, g), ig(this, kI, jo).call(this)) : M(this, zl) && ($(this, o0, g.anchorNode), $(this, PZ, g.anchorOffset), $(this, _Z, g.focusNode), $(this, qZ, g.focusOffset), ig(this, kI, TS).call(this), ig(this, kI, jo).call(this), this.rotate(this.rotation));
}
static get _keyboardManager() {
const g = cC.prototype;
return UI(this, "_keyboardManager", new lG([[["ArrowLeft", "mac+ArrowLeft"], g._moveCaret, {
args: [0]
}], [["ArrowRight", "mac+ArrowRight"], g._moveCaret, {
args: [1]
}], [["ArrowUp", "mac+ArrowUp"], g._moveCaret, {
args: [2]
}], [["ArrowDown", "mac+ArrowDown"], g._moveCaret, {
args: [3]
}]]));
}
get telemetryInitialData() {
return {
action: "added",
type: M(this, _t) ? "free_highlight" : "highlight",
color: this._uiManager.highlightColorNames.get(this.color),
thickness: M(this, Pe),
methodOfCreation: M(this, $Z)
};
}
get telemetryFinalData() {
return {
type: "highlight",
color: this._uiManager.highlightColorNames.get(this.color)
};
}
static computeTelemetryFinalData(g) {
return {
numberOfColors: g.get("color").size
};
}
static initialize(g, C) {
var i;
TC.initialize(g, C), cC._defaultColor || (cC._defaultColor = ((i = C.highlightColors) == null ? void 0 : i.values().next().value) || "#fff066");
}
static updateDefaultParams(g, C) {
switch (g) {
case iC.HIGHLIGHT_DEFAULT_COLOR:
cC._defaultColor = C;
break;
case iC.HIGHLIGHT_THICKNESS:
cC._defaultThickness = C;
break;
}
}
translateInPage(g, C) {
}
get toolbarPosition() {
return M(this, d0);
}
updateParams(g, C) {
switch (g) {
case iC.HIGHLIGHT_COLOR:
ig(this, kI, aIg).call(this, C);
break;
case iC.HIGHLIGHT_THICKNESS:
ig(this, kI, oIg).call(this, C);
break;
}
}
static get defaultPropertiesToUpdate() {
return [[iC.HIGHLIGHT_DEFAULT_COLOR, cC._defaultColor], [iC.HIGHLIGHT_THICKNESS, cC._defaultThickness]];
}
get propertiesToUpdate() {
return [[iC.HIGHLIGHT_COLOR, this.color || cC._defaultColor], [iC.HIGHLIGHT_THICKNESS, M(this, Pe) || cC._defaultThickness], [iC.HIGHLIGHT_FREE, M(this, _t)]];
}
async addEditToolbar() {
const g = await super.addEditToolbar();
return g ? (this._uiManager.highlightColors && ($(this, c0, new sV({
editor: this
})), g.addColorPicker(M(this, c0))), g) : null;
}
disableEditing() {
super.disableEditing(), this.div.classList.toggle("disabled", !0);
}
enableEditing() {
super.enableEditing(), this.div.classList.toggle("disabled", !1);
}
fixAndSetPosition() {
return super.fixAndSetPosition(ig(this, kI, gm).call(this));
}
getBaseTranslation() {
return [0, 0];
}
getRect(g, C) {
return super.getRect(g, C, ig(this, kI, gm).call(this));
}
onceAdded(g) {
this.annotationElementId || this.parent.addUndoableEditor(this), g && this.div.focus();
}
remove() {
ig(this, kI, xS).call(this), this._reportTelemetry({
action: "deleted"
}), super.remove();
}
rebuild() {
this.parent && (super.rebuild(), this.div !== null && (ig(this, kI, jo).call(this), this.isAttachedToDOM || this.parent.add(this)));
}
setParent(g) {
var i;
let C = !1;
this.parent && !g ? ig(this, kI, xS).call(this) : g && (ig(this, kI, jo).call(this, g), C = !this.parent && ((i = this.div) == null ? void 0 : i.classList.contains("selectedEditor"))), super.setParent(g), this.show(this._isVisible), C && this.select();
}
rotate(g) {
var e, A, s;
const {
drawLayer: C
} = this.parent;
let i;
M(this, _t) ? (g = (g - this.rotation + 360) % 360, i = ig(e = cC, CA, qr).call(e, M(this, Ee).box, g)) : i = ig(A = cC, CA, qr).call(A, [this.x, this.y, this.width, this.height], g), C.updateProperties(M(this, Ge), {
bbox: i,
root: {
"data-main-rotation": g
}
}), C.updateProperties(M(this, Zi), {
bbox: ig(s = cC, CA, qr).call(s, M(this, Ui).box, g),
root: {
"data-main-rotation": g
}
});
}
render() {
if (this.div)
return this.div;
const g = super.render();
M(this, r0) && (g.setAttribute("aria-label", M(this, r0)), g.setAttribute("role", "mark")), M(this, _t) ? g.classList.add("free") : this.div.addEventListener("keydown", ig(this, kI, dIg).bind(this), {
signal: this._uiManager._signal
});
const C = $(this, Oc, document.createElement("div"));
g.append(C), C.setAttribute("aria-hidden", "true"), C.className = "internal", C.style.clipPath = M(this, Qc);
const [i, e] = this.parentDimensions;
return this.setDims(this.width * i, this.height * e), m9(this, M(this, Oc), ["pointerover", "pointerleave"]), this.enableEditing(), g;
}
pointerover() {
var g;
this.isSelected || (g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
rootClass: {
hovered: !0
}
});
}
pointerleave() {
var g;
this.isSelected || (g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
rootClass: {
hovered: !1
}
});
}
_moveCaret(g) {
switch (this.parent.unselect(this), g) {
case 0:
case 2:
ig(this, kI, HN).call(this, !0);
break;
case 1:
case 3:
ig(this, kI, HN).call(this, !1);
break;
}
}
select() {
var g;
super.select(), M(this, Zi) && ((g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
rootClass: {
hovered: !1,
selected: !0
}
}));
}
unselect() {
var g;
super.unselect(), M(this, Zi) && ((g = this.parent) == null || g.drawLayer.updateProperties(M(this, Zi), {
rootClass: {
selected: !1
}
}), M(this, _t) || ig(this, kI, HN).call(this, !1));
}
get _mustFixPosition() {
return !M(this, _t);
}
show(g = this._isVisible) {
super.show(g), this.parent && (this.parent.drawLayer.updateProperties(M(this, Ge), {
rootClass: {
hidden: !g
}
}), this.parent.drawLayer.updateProperties(M(this, Zi), {
rootClass: {
hidden: !g
}
}));
}
static startHighlighting(g, C, {
target: i,
x: e,
y: A
}) {
const {
x: s,
y: l,
width: n,
height: a
} = i.getBoundingClientRect(), d = new AbortController(), o = g.combinedSignal(d), c = (r) => {
d.abort(), ig(this, CA, uIg).call(this, g, r);
};
window.addEventListener("blur", c, {
signal: o
}), window.addEventListener("pointerup", c, {
signal: o
}), window.addEventListener("pointerdown", ht, {
capture: !0,
passive: !1,
signal: o
}), window.addEventListener("contextmenu", zA, {
signal: o
}), i.addEventListener("pointermove", ig(this, CA, bIg).bind(this, g), {
signal: o
}), this._freeHighlight = new zS({
x: e,
y: A
}, [s, l, n, a], g.scale, this._defaultThickness / 2, C, 1e-3), {
id: this._freeHighlightId,
clipPathId: this._freeHighlightClipId
} = g.drawLayer.draw({
bbox: [0, 0, 1, 1],
root: {
viewBox: "0 0 1 1",
fill: this._defaultColor,
"fill-opacity": this._defaultOpacity
},
rootClass: {
highlight: !0,
free: !0
},
path: {
d: this._freeHighlight.toSVGPath()
}
}, !0, !0);
}
static async deserialize(g, C, i) {
var h, b, u, m;
let e = null;
if (g instanceof jgg) {
const {
data: {
quadPoints: Z,
rect: p,
rotation: Y,
id: R,
color: X,
opacity: H,
popupRef: S
},
parent: {
page: {
pageNumber: z
}
}
} = g;
e = g = {
annotationType: XI.HIGHLIGHT,
color: Array.from(X),
opacity: H,
quadPoints: Z,
boxes: null,
pageIndex: z - 1,
rect: p.slice(0),
rotation: Y,
id: R,
deleted: !1,
popupRef: S
};
} else if (g instanceof p9) {
const {
data: {
inkLists: Z,
rect: p,
rotation: Y,
id: R,
color: X,
borderStyle: {
rawWidth: H
},
popupRef: S
},
parent: {
page: {
pageNumber: z
}
}
} = g;
e = g = {
annotationType: XI.HIGHLIGHT,
color: Array.from(X),
thickness: H,
inkLists: Z,
boxes: null,
pageIndex: z - 1,
rect: p.slice(0),
rotation: Y,
id: R,
deleted: !1,
popupRef: S
};
}
const {
color: A,
quadPoints: s,
inkLists: l,
opacity: n
} = g, a = await super.deserialize(g, C, i);
a.color = AI.makeHexColor(...A), $(a, Jl, n || 1), l && $(a, Pe, g.thickness), a.annotationElementId = g.id || null, a._initialData = e;
const [d, o] = a.pageDimensions, [c, r] = a.pageTranslation;
if (s) {
const Z = $(a, zl, []);
for (let p = 0; p < s.length; p += 8)
Z.push({
x: (s[p] - c) / d,
y: 1 - (s[p + 1] - r) / o,
width: (s[p + 2] - s[p]) / d,
height: (s[p + 1] - s[p + 5]) / o
});
ig(h = a, kI, TS).call(h), ig(b = a, kI, jo).call(b), a.rotate(a.rotation);
} else if (l) {
$(a, _t, !0);
const Z = l[0], p = {
x: Z[0] - c,
y: o - (Z[1] - r)
}, Y = new zS(p, [0, 0, d, o], 1, M(a, Pe) / 2, !0, 1e-3);
for (let H = 0, S = Z.length; H < S; H += 2)
p.x = Z[H] - c, p.y = o - (Z[H + 1] - r), Y.add(p);
const {
id: R,
clipPathId: X
} = C.drawLayer.draw({
bbox: [0, 0, 1, 1],
root: {
viewBox: "0 0 1 1",
fill: a.color,
"fill-opacity": a._defaultOpacity
},
rootClass: {
highlight: !0,
free: !0
},
path: {
d: Y.toSVGPath()
}
}, !0, !0);
ig(u = a, kI, fN).call(u, {
highlightOutlines: Y.getOutlines(),
highlightId: R,
clipPathId: X
}), ig(m = a, kI, jo).call(m), a.rotate(a.parentRotation);
}
return a;
}
serialize(g = !1) {
if (this.isEmpty() || g)
return null;
if (this.deleted)
return this.serializeDeleted();
const C = this.getRect(0, 0), i = TC._colorManager.convert(this.color), e = {
annotationType: XI.HIGHLIGHT,
color: i,
opacity: M(this, Jl),
thickness: M(this, Pe),
quadPoints: ig(this, kI, rIg).call(this),
outlines: ig(this, kI, hIg).call(this, C),
pageIndex: this.pageIndex,
rect: C,
rotation: ig(this, kI, gm).call(this),
structTreeParentId: this._structTreeParentId
};
return this.annotationElementId && !ig(this, kI, mIg).call(this, e) ? null : (e.id = this.annotationElementId, e);
}
renderAnnotationElement(g) {
return g.updateEdited({
rect: this.getRect(0, 0)
}), null;
}
static canCreateNewEmptyEditor() {
return !1;
}
};
o0 = new WeakMap(), PZ = new WeakMap(), zl = new WeakMap(), Qc = new WeakMap(), c0 = new WeakMap(), Ui = new WeakMap(), _Z = new WeakMap(), qZ = new WeakMap(), Oc = new WeakMap(), Ee = new WeakMap(), Ge = new WeakMap(), _t = new WeakMap(), d0 = new WeakMap(), Jl = new WeakMap(), Zi = new WeakMap(), r0 = new WeakMap(), Pe = new WeakMap(), $Z = new WeakMap(), kI = new WeakSet(), TS = function() {
const g = new FS(M(this, zl), 1e-3);
$(this, Ee, g.getOutlines()), [this.x, this.y, this.width, this.height] = M(this, Ee).box;
const C = new FS(M(this, zl), 25e-4, 1e-3, this._uiManager.direction === "ltr");
$(this, Ui, C.getOutlines());
const {
lastPoint: i
} = M(this, Ui);
$(this, d0, [(i[0] - this.x) / this.width, (i[1] - this.y) / this.height]);
}, fN = function({
highlightOutlines: g,
highlightId: C,
clipPathId: i
}) {
var d, o;
if ($(this, Ee, g), $(this, Ui, g.getNewOutline(M(this, Pe) / 2 + 1.5, 25e-4)), C >= 0)
$(this, Ge, C), $(this, Qc, i), this.parent.drawLayer.finalizeDraw(C, {
bbox: g.box,
path: {
d: g.toSVGPath()
}
}), $(this, Zi, this.parent.drawLayer.drawOutline({
rootClass: {
highlightOutline: !0,
free: !0
},
bbox: M(this, Ui).box,
path: {
d: M(this, Ui).toSVGPath()
}
}, !0));
else if (this.parent) {
const c = this.parent.viewport.rotation;
this.parent.drawLayer.updateProperties(M(this, Ge), {
bbox: ig(d = cC, CA, qr).call(d, M(this, Ee).box, (c - this.rotation + 360) % 360),
path: {
d: g.toSVGPath()
}
}), this.parent.drawLayer.updateProperties(M(this, Zi), {
bbox: ig(o = cC, CA, qr).call(o, M(this, Ui).box, c),
path: {
d: M(this, Ui).toSVGPath()
}
});
}
const [A, s, l, n] = g.box;
switch (this.rotation) {
case 0:
this.x = A, this.y = s, this.width = l, this.height = n;
break;
case 90: {
const [c, r] = this.parentDimensions;
this.x = s, this.y = 1 - A, this.width = l * r / c, this.height = n * c / r;
break;
}
case 180:
this.x = 1 - A, this.y = 1 - s, this.width = l, this.height = n;
break;
case 270: {
const [c, r] = this.parentDimensions;
this.x = 1 - s, this.y = A, this.width = l * r / c, this.height = n * c / r;
break;
}
}
const {
lastPoint: a
} = M(this, Ui);
$(this, d0, [(a[0] - A) / l, (a[1] - s) / n]);
}, aIg = function(g) {
const C = (A, s) => {
var l, n;
this.color = A, $(this, Jl, s), (l = this.parent) == null || l.drawLayer.updateProperties(M(this, Ge), {
root: {
fill: A,
"fill-opacity": s
}
}), (n = M(this, c0)) == null || n.updateColor(A);
}, i = this.color, e = M(this, Jl);
this.addCommands({
cmd: C.bind(this, g, cC._defaultOpacity),
undo: C.bind(this, i, e),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: !0,
type: iC.HIGHLIGHT_COLOR,
overwriteIfSameType: !0,
keepUndo: !0
}), this._reportTelemetry({
action: "color_changed",
color: this._uiManager.highlightColorNames.get(g)
}, !0);
}, oIg = function(g) {
const C = M(this, Pe), i = (e) => {
$(this, Pe, e), ig(this, kI, cIg).call(this, e);
};
this.addCommands({
cmd: i.bind(this, g),
undo: i.bind(this, C),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: !0,
type: iC.INK_THICKNESS,
overwriteIfSameType: !0,
keepUndo: !0
}), this._reportTelemetry({
action: "thickness_changed",
thickness: g
}, !0);
}, cIg = function(g) {
if (!M(this, _t))
return;
ig(this, kI, fN).call(this, {
highlightOutlines: M(this, Ee).getNewOutline(g / 2)
}), this.fixAndSetPosition();
const [C, i] = this.parentDimensions;
this.setDims(this.width * C, this.height * i);
}, xS = function() {
M(this, Ge) === null || !this.parent || (this.parent.drawLayer.remove(M(this, Ge)), $(this, Ge, null), this.parent.drawLayer.remove(M(this, Zi)), $(this, Zi, null));
}, jo = function(g = this.parent) {
M(this, Ge) === null && ({
id: Wi(this, Ge)._,
clipPathId: Wi(this, Qc)._
} = g.drawLayer.draw({
bbox: M(this, Ee).box,
root: {
viewBox: "0 0 1 1",
fill: this.color,
"fill-opacity": M(this, Jl)
},
rootClass: {
highlight: !0,
free: M(this, _t)
},
path: {
d: M(this, Ee).toSVGPath()
}
}, !1, !0), $(this, Zi, g.drawLayer.drawOutline({
rootClass: {
highlightOutline: !0,
free: M(this, _t)
},
bbox: M(this, Ui).box,
path: {
d: M(this, Ui).toSVGPath()
}
}, M(this, _t))), M(this, Oc) && (M(this, Oc).style.clipPath = M(this, Qc)));
}, CA = new WeakSet(), qr = function([g, C, i, e], A) {
switch (A) {
case 90:
return [1 - C - e, g, e, i];
case 180:
return [1 - g - i, 1 - C - e, i, e];
case 270:
return [C, 1 - g - i, e, i];
}
return [g, C, i, e];
}, dIg = function(g) {
cC._keyboardManager.exec(this, g);
}, HN = function(g) {
if (!M(this, o0))
return;
const C = window.getSelection();
g ? C.setPosition(M(this, o0), M(this, PZ)) : C.setPosition(M(this, _Z), M(this, qZ));
}, gm = function() {
return M(this, _t) ? this.rotation : 0;
}, rIg = function() {
if (M(this, _t))
return null;
const [g, C] = this.pageDimensions, [i, e] = this.pageTranslation, A = M(this, zl), s = new Float32Array(A.length * 8);
let l = 0;
for (const {
x: n,
y: a,
width: d,
height: o
} of A) {
const c = n * g + i, r = (1 - a) * C + e;
s[l] = s[l + 4] = c, s[l + 1] = s[l + 3] = r, s[l + 2] = s[l + 6] = c + d * g, s[l + 5] = s[l + 7] = r - o * C, l += 8;
}
return s;
}, hIg = function(g) {
return M(this, Ee).serialize(g, ig(this, kI, gm).call(this));
}, bIg = function(g, C) {
this._freeHighlight.add(C) && g.drawLayer.updateProperties(this._freeHighlightId, {
path: {
d: this._freeHighlight.toSVGPath()
}
});
}, uIg = function(g, C) {
this._freeHighlight.isEmpty() ? g.drawLayer.remove(this._freeHighlightId) : g.createAndAddNewEditor(C, !1, {
highlightId: this._freeHighlightId,
highlightOutlines: this._freeHighlight.getOutlines(),
clipPathId: this._freeHighlightClipId,
methodOfCreation: "main_toolbar"
}), this._freeHighlightId = -1, this._freeHighlight = null, this._freeHighlightClipId = "";
}, mIg = function(g) {
const {
color: C
} = this._initialData;
return g.color.some((i, e) => i !== C[e]);
}, tg(cC, CA), iI(cC, "_defaultColor", null), iI(cC, "_defaultOpacity", 1), iI(cC, "_defaultThickness", 12), iI(cC, "_type", "highlight"), iI(cC, "_editorType", XI.HIGHLIGHT), iI(cC, "_freeHighlightId", -1), iI(cC, "_freeHighlight", null), iI(cC, "_freeHighlightClipId", "");
let lV = cC;
var Uc;
class ZIg {
constructor() {
tg(this, Uc, /* @__PURE__ */ Object.create(null));
}
updateProperty(I, g) {
this[I] = g, this.updateSVGProperty(I, g);
}
updateProperties(I) {
if (I)
for (const [g, C] of Object.entries(I))
g.startsWith("_") || this.updateProperty(g, C);
}
updateSVGProperty(I, g) {
M(this, Uc)[I] = g;
}
toSVGProperties() {
const I = M(this, Uc);
return $(this, Uc, /* @__PURE__ */ Object.create(null)), {
root: I
};
}
reset() {
$(this, Uc, /* @__PURE__ */ Object.create(null));
}
updateAll(I = this) {
this.updateProperties(I);
}
clone() {
BC("Not implemented");
}
}
Uc = new WeakMap();
var we, h0, Ft, Ec, Pc, Da, Ka, Fa, _c, sC, jS, QS, OS, Im, GIg, XN, Cm, $r;
const II = class II extends TC {
constructor(g) {
super(g);
tg(this, sC);
tg(this, we, null);
tg(this, h0);
iI(this, "_drawId", null);
$(this, h0, g.mustBeCommitted || !1), this._addOutlines(g);
}
_addOutlines(g) {
g.drawOutlines && (ig(this, sC, jS).call(this, g), ig(this, sC, Im).call(this));
}
static _mergeSVGProperties(g, C) {
const i = new Set(Object.keys(g));
for (const [e, A] of Object.entries(C))
i.has(e) ? Object.assign(g[e], A) : g[e] = A;
return g;
}
static getDefaultDrawingOptions(g) {
BC("Not implemented");
}
static get typesMap() {
BC("Not implemented");
}
static get isDrawer() {
return !0;
}
static get supportMultipleDrawings() {
return !1;
}
static updateDefaultParams(g, C) {
const i = this.typesMap.get(g);
i && this._defaultDrawingOptions.updateProperty(i, C), this._currentParent && (M(II, Ft).updateProperty(i, C), this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()));
}
updateParams(g, C) {
const i = this.constructor.typesMap.get(g);
i && this._updateProperty(g, i, C);
}
static get defaultPropertiesToUpdate() {
const g = [], C = this._defaultDrawingOptions;
for (const [i, e] of this.typesMap)
g.push([i, C[e]]);
return g;
}
get propertiesToUpdate() {
const g = [], {
_drawingOptions: C
} = this;
for (const [i, e] of this.constructor.typesMap)
g.push([i, C[e]]);
return g;
}
_updateProperty(g, C, i) {
const e = this._drawingOptions, A = e[C], s = (l) => {
var a;
e.updateProperty(C, l);
const n = M(this, we).updateProperty(C, l);
n && ig(this, sC, Cm).call(this, n), (a = this.parent) == null || a.drawLayer.updateProperties(this._drawId, e.toSVGProperties());
};
this.addCommands({
cmd: s.bind(this, i),
undo: s.bind(this, A),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: !0,
type: g,
overwriteIfSameType: !0,
keepUndo: !0
});
}
_onResizing() {
var g;
(g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties(M(this, we).getPathResizingSVGProperties(ig(this, sC, XN).call(this)), {
bbox: ig(this, sC, $r).call(this)
}));
}
_onResized() {
var g;
(g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties(M(this, we).getPathResizedSVGProperties(ig(this, sC, XN).call(this)), {
bbox: ig(this, sC, $r).call(this)
}));
}
_onTranslating(g, C) {
var i;
(i = this.parent) == null || i.drawLayer.updateProperties(this._drawId, {
bbox: ig(this, sC, $r).call(this)
});
}
_onTranslated() {
var g;
(g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties(M(this, we).getPathTranslatedSVGProperties(ig(this, sC, XN).call(this), this.parentDimensions), {
bbox: ig(this, sC, $r).call(this)
}));
}
_onStartDragging() {
var g;
(g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, {
rootClass: {
moving: !0
}
});
}
_onStopDragging() {
var g;
(g = this.parent) == null || g.drawLayer.updateProperties(this._drawId, {
rootClass: {
moving: !1
}
});
}
commit() {
super.commit(), this.disableEditMode(), this.disableEditing();
}
disableEditing() {
super.disableEditing(), this.div.classList.toggle("disabled", !0);
}
enableEditing() {
super.enableEditing(), this.div.classList.toggle("disabled", !1);
}
getBaseTranslation() {
return [0, 0];
}
get isResizable() {
return !0;
}
onceAdded(g) {
this.annotationElementId || this.parent.addUndoableEditor(this), this._isDraggable = !0, M(this, h0) && ($(this, h0, !1), this.commit(), this.parent.setSelected(this), g && this.isOnScreen && this.div.focus());
}
remove() {
ig(this, sC, OS).call(this), super.remove();
}
rebuild() {
this.parent && (super.rebuild(), this.div !== null && (ig(this, sC, Im).call(this), ig(this, sC, Cm).call(this, M(this, we).box), this.isAttachedToDOM || this.parent.add(this)));
}
setParent(g) {
var i;
let C = !1;
this.parent && !g ? (this._uiManager.removeShouldRescale(this), ig(this, sC, OS).call(this)) : g && (this._uiManager.addShouldRescale(this), ig(this, sC, Im).call(this, g), C = !this.parent && ((i = this.div) == null ? void 0 : i.classList.contains("selectedEditor"))), super.setParent(g), C && this.select();
}
rotate() {
this.parent && this.parent.drawLayer.updateProperties(this._drawId, II._mergeSVGProperties({
bbox: ig(this, sC, $r).call(this)
}, M(this, we).updateRotation((this.parentRotation - this.rotation + 360) % 360)));
}
onScaleChanging() {
this.parent && ig(this, sC, Cm).call(this, M(this, we).updateParentDimensions(this.parentDimensions, this.parent.scale));
}
static onScaleChangingWhenDrawing() {
}
render() {
if (this.div)
return this.div;
let g, C;
this._isCopy && (g = this.x, C = this.y);
const i = super.render();
i.classList.add("draw");
const e = document.createElement("div");
i.append(e), e.setAttribute("aria-hidden", "true"), e.className = "internal";
const [A, s] = this.parentDimensions;
return this.setDims(this.width * A, this.height * s), this._uiManager.addShouldRescale(this), this.disableEditing(), this._isCopy && this._moveAfterPaste(g, C), i;
}
static createDrawerInstance(g, C, i, e, A) {
BC("Not implemented");
}
static startDrawing(g, C, i, e) {
var b;
const {
target: A,
offsetX: s,
offsetY: l,
pointerId: n,
pointerType: a
} = e;
if (M(II, Ka) && M(II, Ka) !== a)
return;
const {
viewport: {
rotation: d
}
} = g, {
width: o,
height: c
} = A.getBoundingClientRect(), r = $(II, Ec, new AbortController()), h = g.combinedSignal(r);
if (M(II, Da) || $(II, Da, n), M(II, Ka) ?? $(II, Ka, a), window.addEventListener("pointerup", (u) => {
var m;
M(II, Da) === u.pointerId ? this._endDraw(u) : (m = M(II, Fa)) == null || m.delete(u.pointerId);
}, {
signal: h
}), window.addEventListener("pointercancel", (u) => {
var m;
M(II, Da) === u.pointerId ? this._currentParent.endDrawingSession() : (m = M(II, Fa)) == null || m.delete(u.pointerId);
}, {
signal: h
}), window.addEventListener("pointerdown", (u) => {
M(II, Ka) === u.pointerType && ((M(II, Fa) || $(II, Fa, /* @__PURE__ */ new Set())).add(u.pointerId), M(II, Ft).isCancellable() && (M(II, Ft).removeLastElement(), M(II, Ft).isEmpty() ? this._currentParent.endDrawingSession(!0) : this._endDraw(null)));
}, {
capture: !0,
passive: !1,
signal: h
}), window.addEventListener("contextmenu", zA, {
signal: h
}), A.addEventListener("pointermove", this._drawMove.bind(this), {
signal: h
}), A.addEventListener("touchmove", (u) => {
u.timeStamp === M(II, _c) && ht(u);
}, {
signal: h
}), g.toggleDrawing(), (b = C._editorUndoBar) == null || b.hide(), M(II, Ft)) {
g.drawLayer.updateProperties(this._currentDrawId, M(II, Ft).startNew(s, l, o, c, d));
return;
}
C.updateUIForDefaultProperties(this), $(II, Ft, this.createDrawerInstance(s, l, o, c, d)), $(II, Pc, this.getDefaultDrawingOptions()), this._currentParent = g, {
id: this._currentDrawId
} = g.drawLayer.draw(this._mergeSVGProperties(M(II, Pc).toSVGProperties(), M(II, Ft).defaultSVGProperties), !0, !1);
}
static _drawMove(g) {
var A;
if ($(II, _c, -1), !M(II, Ft))
return;
const {
offsetX: C,
offsetY: i,
pointerId: e
} = g;
if (M(II, Da) === e) {
if (((A = M(II, Fa)) == null ? void 0 : A.size) >= 1) {
this._endDraw(g);
return;
}
this._currentParent.drawLayer.updateProperties(this._currentDrawId, M(II, Ft).add(C, i)), $(II, _c, g.timeStamp), ht(g);
}
}
static _cleanup(g) {
g && (this._currentDrawId = -1, this._currentParent = null, $(II, Ft, null), $(II, Pc, null), $(II, Ka, null), $(II, _c, NaN)), M(II, Ec) && (M(II, Ec).abort(), $(II, Ec, null), $(II, Da, NaN), $(II, Fa, null));
}
static _endDraw(g) {
const C = this._currentParent;
if (C) {
if (C.toggleDrawing(!0), this._cleanup(!1), (g == null ? void 0 : g.target) === C.div && C.drawLayer.updateProperties(this._currentDrawId, M(II, Ft).end(g.offsetX, g.offsetY)), this.supportMultipleDrawings) {
const i = M(II, Ft), e = this._currentDrawId, A = i.getLastElement();
C.addCommands({
cmd: () => {
C.drawLayer.updateProperties(e, i.setLastElement(A));
},
undo: () => {
C.drawLayer.updateProperties(e, i.removeLastElement());
},
mustExec: !1,
type: iC.DRAW_STEP
});
return;
}
this.endDrawing(!1);
}
}
static endDrawing(g) {
const C = this._currentParent;
if (!C)
return null;
if (C.toggleDrawing(!0), C.cleanUndoStack(iC.DRAW_STEP), !M(II, Ft).isEmpty()) {
const {
pageDimensions: [i, e],
scale: A
} = C, s = C.createAndAddNewEditor({
offsetX: 0,
offsetY: 0
}, !1, {
drawId: this._currentDrawId,
drawOutlines: M(II, Ft).getOutlines(i * A, e * A, A, this._INNER_MARGIN),
drawingOptions: M(II, Pc),
mustBeCommitted: !g
});
return this._cleanup(!0), s;
}
return C.drawLayer.remove(this._currentDrawId), this._cleanup(!0), null;
}
createDrawingOptions(g) {
}
static deserializeDraw(g, C, i, e, A, s) {
BC("Not implemented");
}
static async deserialize(g, C, i) {
var d, o;
const {
rawDims: {
pageWidth: e,
pageHeight: A,
pageX: s,
pageY: l
}
} = C.viewport, n = this.deserializeDraw(s, l, e, A, this._INNER_MARGIN, g), a = await super.deserialize(g, C, i);
return a.createDrawingOptions(g), ig(d = a, sC, jS).call(d, {
drawOutlines: n
}), ig(o = a, sC, Im).call(o), a.onScaleChanging(), a.rotate(), a;
}
serializeDraw(g) {
const [C, i] = this.pageTranslation, [e, A] = this.pageDimensions;
return M(this, we).serialize([C, i, e, A], g);
}
renderAnnotationElement(g) {
return g.updateEdited({
rect: this.getRect(0, 0)
}), null;
}
static canCreateNewEmptyEditor() {
return !1;
}
};
we = new WeakMap(), h0 = new WeakMap(), Ft = new WeakMap(), Ec = new WeakMap(), Pc = new WeakMap(), Da = new WeakMap(), Ka = new WeakMap(), Fa = new WeakMap(), _c = new WeakMap(), sC = new WeakSet(), jS = function({
drawOutlines: g,
drawId: C,
drawingOptions: i
}) {
$(this, we, g), this._drawingOptions || (this._drawingOptions = i), C >= 0 ? (this._drawId = C, this.parent.drawLayer.finalizeDraw(C, g.defaultProperties)) : this._drawId = ig(this, sC, QS).call(this, g, this.parent), ig(this, sC, Cm).call(this, g.box);
}, QS = function(g, C) {
const {
id: i
} = C.drawLayer.draw(II._mergeSVGProperties(this._drawingOptions.toSVGProperties(), g.defaultSVGProperties), !1, !1);
return i;
}, OS = function() {
this._drawId === null || !this.parent || (this.parent.drawLayer.remove(this._drawId), this._drawId = null, this._drawingOptions.reset());
}, Im = function(g = this.parent) {
if (!(this._drawId !== null && this.parent === g)) {
if (this._drawId !== null) {
this.parent.drawLayer.updateParent(this._drawId, g.drawLayer);
return;
}
this._drawingOptions.updateAll(), this._drawId = ig(this, sC, QS).call(this, M(this, we), g);
}
}, GIg = function([g, C, i, e]) {
const {
parentDimensions: [A, s],
rotation: l
} = this;
switch (l) {
case 90:
return [C, 1 - g, i * (s / A), e * (A / s)];
case 180:
return [1 - g, 1 - C, i, e];
case 270:
return [1 - C, g, i * (s / A), e * (A / s)];
default:
return [g, C, i, e];
}
}, XN = function() {
const {
x: g,
y: C,
width: i,
height: e,
parentDimensions: [A, s],
rotation: l
} = this;
switch (l) {
case 90:
return [1 - C, g, i * (A / s), e * (s / A)];
case 180:
return [1 - g, 1 - C, i, e];
case 270:
return [C, 1 - g, i * (A / s), e * (s / A)];
default:
return [g, C, i, e];
}
}, Cm = function(g) {
if ([this.x, this.y, this.width, this.height] = ig(this, sC, GIg).call(this, g), this.div) {
this.fixAndSetPosition();
const [C, i] = this.parentDimensions;
this.setDims(this.width * C, this.height * i);
}
this._onResized();
}, $r = function() {
const {
x: g,
y: C,
width: i,
height: e,
rotation: A,
parentRotation: s,
parentDimensions: [l, n]
} = this;
switch ((A * 4 + s) / 90) {
case 1:
return [1 - C - e, g, e, i];
case 2:
return [1 - g - i, 1 - C - e, i, e];
case 3:
return [C, 1 - g - i, e, i];
case 4:
return [g, C - i * (l / n), e * (n / l), i * (l / n)];
case 5:
return [1 - C, g, i * (l / n), e * (n / l)];
case 6:
return [1 - g - e * (n / l), 1 - C, e * (n / l), i * (l / n)];
case 7:
return [C - i * (l / n), 1 - g - e * (n / l), i * (l / n), e * (n / l)];
case 8:
return [g - i, C - e, i, e];
case 9:
return [1 - C, g - i, e, i];
case 10:
return [1 - g, 1 - C, i, e];
case 11:
return [C - e, 1 - g, e, i];
case 12:
return [g - e * (n / l), C, e * (n / l), i * (l / n)];
case 13:
return [1 - C - i * (l / n), g - e * (n / l), i * (l / n), e * (n / l)];
case 14:
return [1 - g, 1 - C - i * (l / n), e * (n / l), i * (l / n)];
case 15:
return [C, 1 - g, i * (l / n), e * (n / l)];
default:
return [g, C, i, e];
}
}, iI(II, "_currentDrawId", -1), iI(II, "_currentParent", null), tg(II, Ft, null), tg(II, Ec, null), tg(II, Pc, null), tg(II, Da, NaN), tg(II, Ka, null), tg(II, Fa, null), tg(II, _c, NaN), iI(II, "_INNER_MARGIN", 3);
let nV = II;
var Ns, kt, zt, qc, b0, Vi, qt, _e, $c, gd, Id, u0, SN;
class Mdg {
constructor(I, g, C, i, e, A) {
tg(this, u0);
tg(this, Ns, new Float64Array(6));
tg(this, kt);
tg(this, zt);
tg(this, qc);
tg(this, b0);
tg(this, Vi);
tg(this, qt, "");
tg(this, _e, 0);
tg(this, $c, new oG());
tg(this, gd);
tg(this, Id);
$(this, gd, C), $(this, Id, i), $(this, qc, e), $(this, b0, A), [I, g] = ig(this, u0, SN).call(this, I, g);
const s = $(this, kt, [NaN, NaN, NaN, NaN, I, g]);
$(this, Vi, [I, g]), $(this, zt, [{
line: s,
points: M(this, Vi)
}]), M(this, Ns).set(s, 0);
}
updateProperty(I, g) {
I === "stroke-width" && $(this, b0, g);
}
isEmpty() {
return !M(this, zt) || M(this, zt).length === 0;
}
isCancellable() {
return M(this, Vi).length <= 10;
}
add(I, g) {
[I, g] = ig(this, u0, SN).call(this, I, g);
const [C, i, e, A] = M(this, Ns).subarray(2, 6), s = I - e, l = g - A;
return Math.hypot(M(this, gd) * s, M(this, Id) * l) <= 2 ? null : (M(this, Vi).push(I, g), isNaN(C) ? (M(this, Ns).set([e, A, I, g], 2), M(this, kt).push(NaN, NaN, NaN, NaN, I, g), {
path: {
d: this.toSVGPath()
}
}) : (isNaN(M(this, Ns)[0]) && M(this, kt).splice(6, 6), M(this, Ns).set([C, i, e, A, I, g], 0), M(this, kt).push(...$g.createBezierPoints(C, i, e, A, I, g)), {
path: {
d: this.toSVGPath()
}
}));
}
end(I, g) {
const C = this.add(I, g);
return C || (M(this, Vi).length === 2 ? {
path: {
d: this.toSVGPath()
}
} : null);
}
startNew(I, g, C, i, e) {
$(this, gd, C), $(this, Id, i), $(this, qc, e), [I, g] = ig(this, u0, SN).call(this, I, g);
const A = $(this, kt, [NaN, NaN, NaN, NaN, I, g]);
$(this, Vi, [I, g]);
const s = M(this, zt).at(-1);
return s && (s.line = new Float32Array(s.line), s.points = new Float32Array(s.points)), M(this, zt).push({
line: A,
points: M(this, Vi)
}), M(this, Ns).set(A, 0), $(this, _e, 0), this.toSVGPath(), null;
}
getLastElement() {
return M(this, zt).at(-1);
}
setLastElement(I) {
return M(this, zt) ? (M(this, zt).push(I), $(this, kt, I.line), $(this, Vi, I.points), $(this, _e, 0), {
path: {
d: this.toSVGPath()
}
}) : M(this, $c).setLastElement(I);
}
removeLastElement() {
if (!M(this, zt))
return M(this, $c).removeLastElement();
M(this, zt).pop(), $(this, qt, "");
for (let I = 0, g = M(this, zt).length; I < g; I++) {
const {
line: C,
points: i
} = M(this, zt)[I];
$(this, kt, C), $(this, Vi, i), $(this, _e, 0), this.toSVGPath();
}
return {
path: {
d: M(this, qt)
}
};
}
toSVGPath() {
const I = $g.svgRound(M(this, kt)[4]), g = $g.svgRound(M(this, kt)[5]);
if (M(this, Vi).length === 2)
return $(this, qt, `${M(this, qt)} M ${I} ${g} Z`), M(this, qt);
if (M(this, Vi).length <= 6) {
const i = M(this, qt).lastIndexOf("M");
$(this, qt, `${M(this, qt).slice(0, i)} M ${I} ${g}`), $(this, _e, 6);
}
if (M(this, Vi).length === 4) {
const i = $g.svgRound(M(this, kt)[10]), e = $g.svgRound(M(this, kt)[11]);
return $(this, qt, `${M(this, qt)} L ${i} ${e}`), $(this, _e, 12), M(this, qt);
}
const C = [];
M(this, _e) === 0 && (C.push(`M ${I} ${g}`), $(this, _e, 6));
for (let i = M(this, _e), e = M(this, kt).length; i < e; i += 6) {
const [A, s, l, n, a, d] = M(this, kt).slice(i, i + 6).map($g.svgRound);
C.push(`C${A} ${s} ${l} ${n} ${a} ${d}`);
}
return $(this, qt, M(this, qt) + C.join(" ")), $(this, _e, M(this, kt).length), M(this, qt);
}
getOutlines(I, g, C, i) {
const e = M(this, zt).at(-1);
return e.line = new Float32Array(e.line), e.points = new Float32Array(e.points), M(this, $c).build(M(this, zt), I, g, C, M(this, qc), M(this, b0), i), $(this, Ns, null), $(this, kt, null), $(this, zt, null), $(this, qt, null), M(this, $c);
}
get defaultSVGProperties() {
return {
root: {
viewBox: "0 0 10000 10000"
},
rootClass: {
draw: !0
},
bbox: [0, 0, 1, 1]
};
}
}
Ns = new WeakMap(), kt = new WeakMap(), zt = new WeakMap(), qc = new WeakMap(), b0 = new WeakMap(), Vi = new WeakMap(), qt = new WeakMap(), _e = new WeakMap(), $c = new WeakMap(), gd = new WeakMap(), Id = new WeakMap(), u0 = new WeakSet(), SN = function(I, g) {
return $g._normalizePoint(I, g, M(this, gd), M(this, Id), M(this, qc));
};
var Mi, gG, IG, pe, Vs, Ms, m0, Z0, Cd, ii, hl, wIg, pIg, BIg;
class oG extends $g {
constructor() {
super(...arguments);
tg(this, ii);
tg(this, Mi);
tg(this, gG, 0);
tg(this, IG);
tg(this, pe);
tg(this, Vs);
tg(this, Ms);
tg(this, m0);
tg(this, Z0);
tg(this, Cd);
}
build(g, C, i, e, A, s, l) {
$(this, Vs, C), $(this, Ms, i), $(this, m0, e), $(this, Z0, A), $(this, Cd, s), $(this, IG, l ?? 0), $(this, pe, g), ig(this, ii, pIg).call(this);
}
get thickness() {
return M(this, Cd);
}
setLastElement(g) {
return M(this, pe).push(g), {
path: {
d: this.toSVGPath()
}
};
}
removeLastElement() {
return M(this, pe).pop(), {
path: {
d: this.toSVGPath()
}
};
}
toSVGPath() {
const g = [];
for (const {
line: C
} of M(this, pe)) {
if (g.push(`M${$g.svgRound(C[4])} ${$g.svgRound(C[5])}`), C.length === 6) {
g.push("Z");
continue;
}
if (C.length === 12 && isNaN(C[6])) {
g.push(`L${$g.svgRound(C[10])} ${$g.svgRound(C[11])}`);
continue;
}
for (let i = 6, e = C.length; i < e; i += 6) {
const [A, s, l, n, a, d] = C.subarray(i, i + 6).map($g.svgRound);
g.push(`C${A} ${s} ${l} ${n} ${a} ${d}`);
}
}
return g.join("");
}
serialize([g, C, i, e], A) {
const s = [], l = [], [n, a, d, o] = ig(this, ii, wIg).call(this);
let c, r, h, b, u, m, Z, p, Y;
switch (M(this, Z0)) {
case 0:
Y = $g._rescale, c = g, r = C + e, h = i, b = -e, u = g + n * i, m = C + (1 - a - o) * e, Z = g + (n + d) * i, p = C + (1 - a) * e;
break;
case 90:
Y = $g._rescaleAndSwap, c = g, r = C, h = i, b = e, u = g + a * i, m = C + n * e, Z = g + (a + o) * i, p = C + (n + d) * e;
break;
case 180:
Y = $g._rescale, c = g + i, r = C, h = -i, b = e, u = g + (1 - n - d) * i, m = C + a * e, Z = g + (1 - n) * i, p = C + (a + o) * e;
break;
case 270:
Y = $g._rescaleAndSwap, c = g + i, r = C + e, h = -i, b = -e, u = g + (1 - a - o) * i, m = C + (1 - n - d) * e, Z = g + (1 - a) * i, p = C + (1 - n) * e;
break;
}
for (const {
line: R,
points: X
} of M(this, pe))
s.push(Y(R, c, r, h, b, A ? new Array(R.length) : null)), l.push(Y(X, c, r, h, b, A ? new Array(X.length) : null));
return {
lines: s,
points: l,
rect: [u, m, Z, p]
};
}
static deserialize(g, C, i, e, A, {
paths: {
lines: s,
points: l
},
rotation: n,
thickness: a
}) {
const d = [];
let o, c, r, h, b;
switch (n) {
case 0:
b = $g._rescale, o = -g / i, c = C / e + 1, r = 1 / i, h = -1 / e;
break;
case 90:
b = $g._rescaleAndSwap, o = -C / e, c = -g / i, r = 1 / e, h = 1 / i;
break;
case 180:
b = $g._rescale, o = g / i + 1, c = -C / e, r = -1 / i, h = 1 / e;
break;
case 270:
b = $g._rescaleAndSwap, o = C / e + 1, c = g / i + 1, r = -1 / e, h = -1 / i;
break;
}
if (!s) {
s = [];
for (const m of l) {
const Z = m.length;
if (Z === 2) {
s.push(new Float32Array([NaN, NaN, NaN, NaN, m[0], m[1]]));
continue;
}
if (Z === 4) {
s.push(new Float32Array([NaN, NaN, NaN, NaN, m[0], m[1], NaN, NaN, NaN, NaN, m[2], m[3]]));
continue;
}
const p = new Float32Array(3 * (Z - 2));
s.push(p);
let [Y, R, X, H] = m.subarray(0, 4);
p.set([NaN, NaN, NaN, NaN, Y, R], 0);
for (let S = 4; S < Z; S += 2) {
const z = m[S], v = m[S + 1];
p.set($g.createBezierPoints(Y, R, X, H, z, v), (S - 2) * 3), [Y, R, X, H] = [X, H, z, v];
}
}
}
for (let m = 0, Z = s.length; m < Z; m++)
d.push({
line: b(s[m].map((p) => p ?? NaN), o, c, r, h),
points: b(l[m].map((p) => p ?? NaN), o, c, r, h)
});
const u = new this.prototype.constructor();
return u.build(d, i, e, 1, n, a, A), u;
}
get box() {
return M(this, Mi);
}
updateProperty(g, C) {
return g === "stroke-width" ? ig(this, ii, BIg).call(this, C) : null;
}
updateParentDimensions([g, C], i) {
const [e, A] = ig(this, ii, hl).call(this);
$(this, Vs, g), $(this, Ms, C), $(this, m0, i);
const [s, l] = ig(this, ii, hl).call(this), n = s - e, a = l - A, d = M(this, Mi);
return d[0] -= n, d[1] -= a, d[2] += 2 * n, d[3] += 2 * a, d;
}
updateRotation(g) {
return $(this, gG, g), {
path: {
transform: this.rotationTransform
}
};
}
get viewBox() {
return M(this, Mi).map($g.svgRound).join(" ");
}
get defaultProperties() {
const [g, C] = M(this, Mi);
return {
root: {
viewBox: this.viewBox
},
path: {
"transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`
}
};
}
get rotationTransform() {
const [, , g, C] = M(this, Mi);
let i = 0, e = 0, A = 0, s = 0, l = 0, n = 0;
switch (M(this, gG)) {
case 90:
e = C / g, A = -g / C, l = g;
break;
case 180:
i = -1, s = -1, l = g, n = C;
break;
case 270:
e = -C / g, A = g / C, n = C;
break;
default:
return "";
}
return `matrix(${i} ${e} ${A} ${s} ${$g.svgRound(l)} ${$g.svgRound(n)})`;
}
getPathResizingSVGProperties([g, C, i, e]) {
const [A, s] = ig(this, ii, hl).call(this), [l, n, a, d] = M(this, Mi);
if (Math.abs(a - A) <= $g.PRECISION || Math.abs(d - s) <= $g.PRECISION) {
const b = g + i / 2 - (l + a / 2), u = C + e / 2 - (n + d / 2);
return {
path: {
"transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`,
transform: `${this.rotationTransform} translate(${b} ${u})`
}
};
}
const o = (i - 2 * A) / (a - 2 * A), c = (e - 2 * s) / (d - 2 * s), r = a / i, h = d / e;
return {
path: {
"transform-origin": `${$g.svgRound(l)} ${$g.svgRound(n)}`,
transform: `${this.rotationTransform} scale(${r} ${h}) translate(${$g.svgRound(A)} ${$g.svgRound(s)}) scale(${o} ${c}) translate(${$g.svgRound(-A)} ${$g.svgRound(-s)})`
}
};
}
getPathResizedSVGProperties([g, C, i, e]) {
const [A, s] = ig(this, ii, hl).call(this), l = M(this, Mi), [n, a, d, o] = l;
if (l[0] = g, l[1] = C, l[2] = i, l[3] = e, Math.abs(d - A) <= $g.PRECISION || Math.abs(o - s) <= $g.PRECISION) {
const u = g + i / 2 - (n + d / 2), m = C + e / 2 - (a + o / 2);
for (const {
line: Z,
points: p
} of M(this, pe))
$g._translate(Z, u, m, Z), $g._translate(p, u, m, p);
return {
root: {
viewBox: this.viewBox
},
path: {
"transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`,
transform: this.rotationTransform || null,
d: this.toSVGPath()
}
};
}
const c = (i - 2 * A) / (d - 2 * A), r = (e - 2 * s) / (o - 2 * s), h = -c * (n + A) + g + A, b = -r * (a + s) + C + s;
if (c !== 1 || r !== 1 || h !== 0 || b !== 0)
for (const {
line: u,
points: m
} of M(this, pe))
$g._rescale(u, h, b, c, r, u), $g._rescale(m, h, b, c, r, m);
return {
root: {
viewBox: this.viewBox
},
path: {
"transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`,
transform: this.rotationTransform || null,
d: this.toSVGPath()
}
};
}
getPathTranslatedSVGProperties([g, C], i) {
const [e, A] = i, s = M(this, Mi), l = g - s[0], n = C - s[1];
if (M(this, Vs) === e && M(this, Ms) === A)
for (const {
line: a,
points: d
} of M(this, pe))
$g._translate(a, l, n, a), $g._translate(d, l, n, d);
else {
const a = M(this, Vs) / e, d = M(this, Ms) / A;
$(this, Vs, e), $(this, Ms, A);
for (const {
line: o,
points: c
} of M(this, pe))
$g._rescale(o, l, n, a, d, o), $g._rescale(c, l, n, a, d, c);
s[2] *= a, s[3] *= d;
}
return s[0] = g, s[1] = C, {
root: {
viewBox: this.viewBox
},
path: {
d: this.toSVGPath(),
"transform-origin": `${$g.svgRound(g)} ${$g.svgRound(C)}`
}
};
}
get defaultSVGProperties() {
const g = M(this, Mi);
return {
root: {
viewBox: this.viewBox
},
rootClass: {
draw: !0
},
path: {
d: this.toSVGPath(),
"transform-origin": `${$g.svgRound(g[0])} ${$g.svgRound(g[1])}`,
transform: this.rotationTransform || null
},
bbox: g
};
}
}
Mi = new WeakMap(), gG = new WeakMap(), IG = new WeakMap(), pe = new WeakMap(), Vs = new WeakMap(), Ms = new WeakMap(), m0 = new WeakMap(), Z0 = new WeakMap(), Cd = new WeakMap(), ii = new WeakSet(), hl = function(g = M(this, Cd)) {
const C = M(this, IG) + g / 2 * M(this, m0);
return M(this, Z0) % 180 === 0 ? [C / M(this, Vs), C / M(this, Ms)] : [C / M(this, Ms), C / M(this, Vs)];
}, wIg = function() {
const [g, C, i, e] = M(this, Mi), [A, s] = ig(this, ii, hl).call(this, 0);
return [g + A, C + s, i - 2 * A, e - 2 * s];
}, pIg = function() {
const g = $(this, Mi, new Float32Array([1 / 0, 1 / 0, -1 / 0, -1 / 0]));
for (const {
line: e
} of M(this, pe)) {
if (e.length <= 12) {
for (let l = 4, n = e.length; l < n; l += 6)
AI.pointBoundingBox(e[l], e[l + 1], g);
continue;
}
let A = e[4], s = e[5];
for (let l = 6, n = e.length; l < n; l += 6) {
const [a, d, o, c, r, h] = e.subarray(l, l + 6);
AI.bezierBoundingBox(A, s, a, d, o, c, r, h, g), A = r, s = h;
}
}
const [C, i] = ig(this, ii, hl).call(this);
g[0] = fi(g[0] - C, 0, 1), g[1] = fi(g[1] - i, 0, 1), g[2] = fi(g[2] + C, 0, 1), g[3] = fi(g[3] + i, 0, 1), g[2] -= g[0], g[3] -= g[1];
}, BIg = function(g) {
const [C, i] = ig(this, ii, hl).call(this);
$(this, Cd, g);
const [e, A] = ig(this, ii, hl).call(this), [s, l] = [e - C, A - i], n = M(this, Mi);
return n[0] -= s, n[1] -= l, n[2] += 2 * s, n[3] += 2 * l, n;
};
class IM extends ZIg {
constructor(I) {
super(), this._viewParameters = I, super.updateProperties({
fill: "none",
stroke: TC._defaultLineColor,
"stroke-opacity": 1,
"stroke-width": 1,
"stroke-linecap": "round",
"stroke-linejoin": "round",
"stroke-miterlimit": 10
});
}
updateSVGProperty(I, g) {
I === "stroke-width" && (g ?? (g = this["stroke-width"]), g *= this._viewParameters.realScale), super.updateSVGProperty(I, g);
}
clone() {
const I = new IM(this._viewParameters);
return I.updateAll(this), I;
}
}
var UV, WIg;
const nh = class nh extends nV {
constructor(g) {
super({
...g,
name: "inkEditor"
});
tg(this, UV);
this._willKeepAspectRatio = !0, this.defaultL10nId = "pdfjs-editor-ink-editor";
}
static initialize(g, C) {
TC.initialize(g, C), this._defaultDrawingOptions = new IM(C.viewParameters);
}
static getDefaultDrawingOptions(g) {
const C = this._defaultDrawingOptions.clone();
return C.updateProperties(g), C;
}
static get supportMultipleDrawings() {
return !0;
}
static get typesMap() {
return UI(this, "typesMap", /* @__PURE__ */ new Map([[iC.INK_THICKNESS, "stroke-width"], [iC.INK_COLOR, "stroke"], [iC.INK_OPACITY, "stroke-opacity"]]));
}
static createDrawerInstance(g, C, i, e, A) {
return new Mdg(g, C, i, e, A, this._defaultDrawingOptions["stroke-width"]);
}
static deserializeDraw(g, C, i, e, A, s) {
return oG.deserialize(g, C, i, e, A, s);
}
static async deserialize(g, C, i) {
let e = null;
if (g instanceof p9) {
const {
data: {
inkLists: s,
rect: l,
rotation: n,
id: a,
color: d,
opacity: o,
borderStyle: {
rawWidth: c
},
popupRef: r
},
parent: {
page: {
pageNumber: h
}
}
} = g;
e = g = {
annotationType: XI.INK,
color: Array.from(d),
thickness: c,
opacity: o,
paths: {
points: s
},
boxes: null,
pageIndex: h - 1,
rect: l.slice(0),
rotation: n,
id: a,
deleted: !1,
popupRef: r
};
}
const A = await super.deserialize(g, C, i);
return A.annotationElementId = g.id || null, A._initialData = e, A;
}
onScaleChanging() {
if (!this.parent)
return;
super.onScaleChanging();
const {
_drawId: g,
_drawingOptions: C,
parent: i
} = this;
C.updateSVGProperty("stroke-width"), i.drawLayer.updateProperties(g, C.toSVGProperties());
}
static onScaleChangingWhenDrawing() {
const g = this._currentParent;
g && (super.onScaleChangingWhenDrawing(), this._defaultDrawingOptions.updateSVGProperty("stroke-width"), g.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()));
}
createDrawingOptions({
color: g,
thickness: C,
opacity: i
}) {
this._drawingOptions = nh.getDefaultDrawingOptions({
stroke: AI.makeHexColor(...g),
"stroke-width": C,
"stroke-opacity": i
});
}
serialize(g = !1) {
if (this.isEmpty())
return null;
if (this.deleted)
return this.serializeDeleted();
const {
lines: C,
points: i,
rect: e
} = this.serializeDraw(g), {
_drawingOptions: {
stroke: A,
"stroke-opacity": s,
"stroke-width": l
}
} = this, n = {
annotationType: XI.INK,
color: TC._colorManager.convert(A),
opacity: s,
thickness: l,
paths: {
lines: C,
points: i
},
pageIndex: this.pageIndex,
rect: e,
rotation: this.rotation,
structTreeParentId: this._structTreeParentId
};
return g ? (n.isCopy = !0, n) : this.annotationElementId && !ig(this, UV, WIg).call(this, n) ? null : (n.id = this.annotationElementId, n);
}
renderAnnotationElement(g) {
const {
points: C,
rect: i
} = this.serializeDraw(!1);
return g.updateEdited({
rect: i,
thickness: this._drawingOptions["stroke-width"],
points: C
}), null;
}
};
UV = new WeakSet(), WIg = function(g) {
const {
color: C,
thickness: i,
opacity: e,
pageIndex: A
} = this._initialData;
return this._hasBeenMoved || this._hasBeenResized || g.color.some((s, l) => s !== C[l]) || g.thickness !== i || g.opacity !== e || g.pageIndex !== A;
}, iI(nh, "_type", "ink"), iI(nh, "_editorType", XI.INK), iI(nh, "_defaultDrawingOptions", null);
let US = nh;
class ES extends oG {
toSVGPath() {
let I = super.toSVGPath();
return I.endsWith("Z") || (I += "Z"), I;
}
}
const TY = 8, Du = 3;
var td, rC, PS, fA, yIg, YIg, _S, DN, NIg, VIg, MIg, qS, $S, RIg;
class Ol {
static extractContoursFromText(I, {
fontFamily: g,
fontStyle: C,
fontWeight: i
}, e, A, s, l) {
let n = new OffscreenCanvas(1, 1), a = n.getContext("2d", {
alpha: !1
});
const d = 200, o = a.font = `${C} ${i} ${d}px ${g}`, {
actualBoundingBoxLeft: c,
actualBoundingBoxRight: r,
actualBoundingBoxAscent: h,
actualBoundingBoxDescent: b,
fontBoundingBoxAscent: u,
fontBoundingBoxDescent: m,
width: Z
} = a.measureText(I), p = 1.5, Y = Math.ceil(Math.max(Math.abs(c) + Math.abs(r) || 0, Z) * p), R = Math.ceil(Math.max(Math.abs(h) + Math.abs(b) || d, Math.abs(u) + Math.abs(m) || d) * p);
n = new OffscreenCanvas(Y, R), a = n.getContext("2d", {
alpha: !0,
willReadFrequently: !0
}), a.font = o, a.filter = "grayscale(1)", a.fillStyle = "white", a.fillRect(0, 0, Y, R), a.fillStyle = "black", a.fillText(I, Y * (p - 1) / 2, R * (3 - p) / 2);
const X = ig(this, rC, qS).call(this, a.getImageData(0, 0, Y, R).data), H = ig(this, rC, MIg).call(this, X), S = ig(this, rC, $S).call(this, H), z = ig(this, rC, _S).call(this, X, Y, R, S);
return this.processDrawnLines({
lines: {
curves: z,
width: Y,
height: R
},
pageWidth: e,
pageHeight: A,
rotation: s,
innerMargin: l,
mustSmooth: !0,
areContours: !0
});
}
static process(I, g, C, i, e) {
const [A, s, l] = ig(this, rC, RIg).call(this, I), [n, a] = ig(this, rC, VIg).call(this, A, s, l, Math.hypot(s, l) * M(this, td).sigmaSFactor, M(this, td).sigmaR, M(this, td).kernelSize), d = ig(this, rC, $S).call(this, a), o = ig(this, rC, _S).call(this, n, s, l, d);
return this.processDrawnLines({
lines: {
curves: o,
width: s,
height: l
},
pageWidth: g,
pageHeight: C,
rotation: i,
innerMargin: e,
mustSmooth: !0,
areContours: !0
});
}
static processDrawnLines({
lines: I,
pageWidth: g,
pageHeight: C,
rotation: i,
innerMargin: e,
mustSmooth: A,
areContours: s
}) {
i % 180 !== 0 && ([g, C] = [C, g]);
const {
curves: l,
width: n,
height: a
} = I, d = I.thickness ?? 0, o = [], c = Math.min(g / n, C / a), r = c / g, h = c / C, b = [];
for (const {
points: m
} of l) {
const Z = A ? ig(this, rC, NIg).call(this, m) : m;
if (!Z)
continue;
b.push(Z);
const p = Z.length, Y = new Float32Array(p), R = new Float32Array(3 * (p === 2 ? 2 : p - 2));
if (o.push({
line: R,
points: Y
}), p === 2) {
Y[0] = Z[0] * r, Y[1] = Z[1] * h, R.set([NaN, NaN, NaN, NaN, Y[0], Y[1]], 0);
continue;
}
let [X, H, S, z] = Z;
X *= r, H *= h, S *= r, z *= h, Y.set([X, H, S, z], 0), R.set([NaN, NaN, NaN, NaN, X, H], 0);
for (let v = 4; v < p; v += 2) {
const K = Y[v] = Z[v] * r, V = Y[v + 1] = Z[v + 1] * h;
R.set($g.createBezierPoints(X, H, S, z, K, V), (v - 2) * 3), [X, H, S, z] = [S, z, K, V];
}
}
if (o.length === 0)
return null;
const u = s ? new ES() : new oG();
return u.build(o, g, C, 1, i, s ? 0 : d, e), {
outline: u,
newCurves: b,
areContours: s,
thickness: d,
width: n,
height: a
};
}
static async compressSignature({
outlines: I,
areContours: g,
thickness: C,
width: i,
height: e
}) {
let A = 1 / 0, s = -1 / 0, l = 0;
for (const Z of I) {
l += Z.length;
for (let p = 2, Y = Z.length; p < Y; p++) {
const R = Z[p] - Z[p - 2];
A = Math.min(A, R), s = Math.max(s, R);
}
}
let n;
A >= -128 && s <= 127 ? n = Int8Array : A >= -32768 && s <= 32767 ? n = Int16Array : n = Int32Array;
const a = I.length, d = TY + Du * a, o = new Uint32Array(d);
let c = 0;
o[c++] = d * Uint32Array.BYTES_PER_ELEMENT + (l - 2 * a) * n.BYTES_PER_ELEMENT, o[c++] = 0, o[c++] = i, o[c++] = e, o[c++] = g ? 0 : 1, o[c++] = Math.max(0, Math.floor(C ?? 0)), o[c++] = a, o[c++] = n.BYTES_PER_ELEMENT;
for (const Z of I)
o[c++] = Z.length - 2, o[c++] = Z[0], o[c++] = Z[1];
const r = new CompressionStream("deflate-raw"), h = r.writable.getWriter();
await h.ready, h.write(o);
const b = n.prototype.constructor;
for (const Z of I) {
const p = new b(Z.length - 2);
for (let Y = 2, R = Z.length; Y < R; Y++)
p[Y - 2] = Z[Y] - Z[Y - 2];
h.write(p);
}
h.close();
const u = await new Response(r.readable).arrayBuffer(), m = new Uint8Array(u);
return X$(m);
}
static async decompressSignature(I) {
try {
const g = qog(I), {
readable: C,
writable: i
} = new DecompressionStream("deflate-raw"), e = i.getWriter();
await e.ready, e.write(g).then(async () => {
await e.ready, await e.close();
}).catch(() => {
});
let A = null, s = 0;
for await (const Z of C)
A || (A = new Uint8Array(new Uint32Array(Z.buffer, 0, 4)[0])), A.set(Z, s), s += Z.length;
const l = new Uint32Array(A.buffer, 0, A.length >> 2), n = l[1];
if (n !== 0)
throw new Error(`Invalid version: ${n}`);
const a = l[2], d = l[3], o = l[4] === 0, c = l[5], r = l[6], h = l[7], b = [], u = (TY + Du * r) * Uint32Array.BYTES_PER_ELEMENT;
let m;
switch (h) {
case Int8Array.BYTES_PER_ELEMENT:
m = new Int8Array(A.buffer, u);
break;
case Int16Array.BYTES_PER_ELEMENT:
m = new Int16Array(A.buffer, u);
break;
case Int32Array.BYTES_PER_ELEMENT:
m = new Int32Array(A.buffer, u);
break;
}
s = 0;
for (let Z = 0; Z < r; Z++) {
const p = l[Du * Z + TY], Y = new Float32Array(p + 2);
b.push(Y);
for (let R = 0; R < Du - 1; R++)
Y[R] = l[Du * Z + TY + R + 1];
for (let R = 0; R < p; R++)
Y[R + 2] = Y[R] + m[s++];
}
return {
areContours: o,
thickness: c,
outlines: b,
width: a,
height: d
};
} catch (g) {
return DI(`decompressSignature: ${g}`), null;
}
}
}
td = new WeakMap(), rC = new WeakSet(), PS = function(I, g, C, i) {
return C -= I, i -= g, C === 0 ? i > 0 ? 0 : 4 : C === 1 ? i + 6 : 2 - i;
}, fA = new WeakMap(), yIg = function(I, g, C, i, e, A, s) {
const l = ig(this, rC, PS).call(this, C, i, e, A);
for (let n = 0; n < 8; n++) {
const a = (-n + l - s + 16) % 8, d = M(this, fA)[2 * a], o = M(this, fA)[2 * a + 1];
if (I[(C + d) * g + (i + o)] !== 0)
return a;
}
return -1;
}, YIg = function(I, g, C, i, e, A, s) {
const l = ig(this, rC, PS).call(this, C, i, e, A);
for (let n = 0; n < 8; n++) {
const a = (n + l + s + 16) % 8, d = M(this, fA)[2 * a], o = M(this, fA)[2 * a + 1];
if (I[(C + d) * g + (i + o)] !== 0)
return a;
}
return -1;
}, _S = function(I, g, C, i) {
const e = I.length, A = new Int32Array(e);
for (let a = 0; a < e; a++)
A[a] = I[a] <= i ? 1 : 0;
for (let a = 1; a < C - 1; a++)
A[a * g] = A[a * g + g - 1] = 0;
for (let a = 0; a < g; a++)
A[a] = A[g * C - 1 - a] = 0;
let s = 1, l;
const n = [];
for (let a = 1; a < C - 1; a++) {
l = 1;
for (let d = 1; d < g - 1; d++) {
const o = a * g + d, c = A[o];
if (c === 0)
continue;
let r = a, h = d;
if (c === 1 && A[o - 1] === 0)
s += 1, h -= 1;
else if (c >= 1 && A[o + 1] === 0)
s += 1, h += 1, c > 1 && (l = c);
else {
c !== 1 && (l = Math.abs(c));
continue;
}
const b = [d, a], u = h === d + 1, m = {
isHole: u,
points: b,
id: s,
parent: 0
};
n.push(m);
let Z;
for (const v of n)
if (v.id === l) {
Z = v;
break;
}
Z ? Z.isHole ? m.parent = u ? Z.parent : l : m.parent = u ? l : Z.parent : m.parent = u ? l : 0;
const p = ig(this, rC, yIg).call(this, A, g, a, d, r, h, 0);
if (p === -1) {
A[o] = -s, A[o] !== 1 && (l = Math.abs(A[o]));
continue;
}
let Y = M(this, fA)[2 * p], R = M(this, fA)[2 * p + 1];
const X = a + Y, H = d + R;
r = X, h = H;
let S = a, z = d;
for (; ; ) {
const v = ig(this, rC, YIg).call(this, A, g, S, z, r, h, 1);
Y = M(this, fA)[2 * v], R = M(this, fA)[2 * v + 1];
const K = S + Y, V = z + R;
b.push(V, K);
const N = S * g + z;
if (A[N + 1] === 0 ? A[N] = -s : A[N] === 1 && (A[N] = s), K === a && V === d && S === X && z === H) {
A[o] !== 1 && (l = Math.abs(A[o]));
break;
} else
r = S, h = z, S = K, z = V;
}
}
}
return n;
}, DN = function(I, g, C, i) {
if (C - g <= 4) {
for (let X = g; X < C - 2; X += 2)
i.push(I[X], I[X + 1]);
return;
}
const e = I[g], A = I[g + 1], s = I[C - 4] - e, l = I[C - 3] - A, n = Math.hypot(s, l), a = s / n, d = l / n, o = a * A - d * e, c = l / s, r = 1 / n, h = Math.atan(c), b = Math.cos(h), u = Math.sin(h), m = r * (Math.abs(b) + Math.abs(u)), Z = r * (1 - m + m ** 2), p = Math.max(Math.atan(Math.abs(u + b) * Z), Math.atan(Math.abs(u - b) * Z));
let Y = 0, R = g;
for (let X = g + 2; X < C - 2; X += 2) {
const H = Math.abs(o - a * I[X + 1] + d * I[X]);
H > Y && (R = X, Y = H);
}
Y > (n * p) ** 2 ? (ig(this, rC, DN).call(this, I, g, R + 2, i), ig(this, rC, DN).call(this, I, R, C, i)) : i.push(e, A);
}, NIg = function(I) {
const g = [], C = I.length;
return ig(this, rC, DN).call(this, I, 0, C, g), g.push(I[C - 2], I[C - 1]), g.length <= 4 ? null : g;
}, VIg = function(I, g, C, i, e, A) {
const s = new Float32Array(A ** 2), l = -2 * i ** 2, n = A >> 1;
for (let h = 0; h < A; h++) {
const b = (h - n) ** 2;
for (let u = 0; u < A; u++)
s[h * A + u] = Math.exp((b + (u - n) ** 2) / l);
}
const a = new Float32Array(256), d = -2 * e ** 2;
for (let h = 0; h < 256; h++)
a[h] = Math.exp(h ** 2 / d);
const o = I.length, c = new Uint8Array(o), r = new Uint32Array(256);
for (let h = 0; h < C; h++)
for (let b = 0; b < g; b++) {
const u = h * g + b, m = I[u];
let Z = 0, p = 0;
for (let R = 0; R < A; R++) {
const X = h + R - n;
if (!(X < 0 || X >= C))
for (let H = 0; H < A; H++) {
const S = b + H - n;
if (S < 0 || S >= g)
continue;
const z = I[X * g + S], v = s[R * A + H] * a[Math.abs(z - m)];
Z += z * v, p += v;
}
}
const Y = c[u] = Math.round(Z / p);
r[Y]++;
}
return [c, r];
}, MIg = function(I) {
const g = new Uint32Array(256);
for (const C of I)
g[C]++;
return g;
}, qS = function(I) {
const g = I.length, C = new Uint8ClampedArray(g >> 2);
let i = -1 / 0, e = 1 / 0;
for (let s = 0, l = C.length; s < l; s++) {
if (I[(s << 2) + 3] === 0) {
i = C[s] = 255;
continue;
}
const a = C[s] = I[s << 2];
a > i && (i = a), a < e && (e = a);
}
const A = 255 / (i - e);
for (let s = 0; s < g; s++)
C[s] = (C[s] - e) * A;
return C;
}, $S = function(I) {
let g, C = -1 / 0, i = -1 / 0;
const e = I.findIndex((l) => l !== 0);
let A = e, s = e;
for (g = e; g < 256; g++) {
const l = I[g];
l > C && (g - A > i && (i = g - A, s = g - 1), C = l, A = g);
}
for (g = s - 1; g >= 0 && !(I[g] > I[g + 1]); g--)
;
return g;
}, RIg = function(I) {
const g = I, {
width: C,
height: i
} = I, {
maxDim: e
} = M(this, td);
let A = C, s = i;
if (C > e || i > e) {
let o = C, c = i, r = Math.log2(Math.max(C, i) / e);
const h = Math.floor(r);
r = r === h ? h - 1 : h;
for (let u = 0; u < r; u++) {
A = o, s = c, A > e && (A = Math.ceil(A / 2)), s > e && (s = Math.ceil(s / 2));
const m = new OffscreenCanvas(A, s);
m.getContext("2d").drawImage(I, 0, 0, o, c, 0, 0, A, s), o = A, c = s, I !== g && I.close(), I = m.transferToImageBitmap();
}
const b = Math.min(e / A, e / s);
A = Math.round(A * b), s = Math.round(s * b);
}
const n = new OffscreenCanvas(A, s).getContext("2d", {
willReadFrequently: !0
});
n.filter = "grayscale(1)", n.drawImage(I, 0, 0, I.width, I.height, 0, 0, A, s);
const a = n.getImageData(0, 0, A, s).data;
return [ig(this, rC, qS).call(this, a), A, s];
}, tg(Ol, rC), tg(Ol, td, {
maxDim: 512,
sigmaSFactor: 0.02,
sigmaR: 25,
kernelSize: 16
}), tg(Ol, fA, new Int32Array([0, 1, -1, 1, -1, 0, -1, -1, 0, -1, 1, -1, 1, 0, 1, 1]));
class B9 extends ZIg {
constructor() {
super(), super.updateProperties({
fill: "CanvasText",
"stroke-width": 0
});
}
clone() {
const I = new B9();
return I.updateAll(this), I;
}
}
class W9 extends IM {
constructor(I) {
super(I), super.updateProperties({
stroke: "CanvasText",
"stroke-width": 1
});
}
clone() {
const I = new W9(this._viewParameters);
return I.updateAll(this), I;
}
}
var ka, Be, za, Ja;
const ne = class ne extends nV {
constructor(g) {
super({
...g,
mustBeCommitted: !0,
name: "signatureEditor"
});
tg(this, ka, !1);
tg(this, Be, null);
tg(this, za, null);
tg(this, Ja, null);
this._willKeepAspectRatio = !0, $(this, za, g.signatureData || null), $(this, Be, null), this.defaultL10nId = "pdfjs-editor-signature-editor1";
}
static initialize(g, C) {
TC.initialize(g, C), this._defaultDrawingOptions = new B9(), this._defaultDrawnSignatureOptions = new W9(C.viewParameters);
}
static getDefaultDrawingOptions(g) {
const C = this._defaultDrawingOptions.clone();
return C.updateProperties(g), C;
}
static get supportMultipleDrawings() {
return !1;
}
static get typesMap() {
return UI(this, "typesMap", /* @__PURE__ */ new Map());
}
static get isDrawer() {
return !1;
}
get telemetryFinalData() {
return {
type: "signature",
hasDescription: !!M(this, Be)
};
}
static computeTelemetryFinalData(g) {
const C = g.get("hasDescription");
return {
hasAltText: C.get(!0) ?? 0,
hasNoAltText: C.get(!1) ?? 0
};
}
get isResizable() {
return !0;
}
onScaleChanging() {
this._drawId !== null && super.onScaleChanging();
}
render() {
if (this.div)
return this.div;
let g, C;
const {
_isCopy: i
} = this;
if (i && (this._isCopy = !1, g = this.x, C = this.y), super.render(), this._drawId === null)
if (M(this, za)) {
const {
lines: e,
mustSmooth: A,
areContours: s,
description: l,
uuid: n,
heightInPage: a
} = M(this, za), {
rawDims: {
pageWidth: d,
pageHeight: o
},
rotation: c
} = this.parent.viewport, r = Ol.processDrawnLines({
lines: e,
pageWidth: d,
pageHeight: o,
rotation: c,
innerMargin: ne._INNER_MARGIN,
mustSmooth: A,
areContours: s
});
this.addSignature(r, a, l, n);
} else
this.div.setAttribute("data-l10n-args", JSON.stringify({
description: ""
})), this.div.hidden = !0, this._uiManager.getSignature(this);
return i && (this._isCopy = !0, this._moveAfterPaste(g, C)), this.div;
}
setUuid(g) {
$(this, Ja, g), this.addEditToolbar();
}
getUuid() {
return M(this, Ja);
}
get description() {
return M(this, Be);
}
set description(g) {
$(this, Be, g), super.addEditToolbar().then((C) => {
C == null || C.updateEditSignatureButton(g);
});
}
getSignaturePreview() {
const {
newCurves: g,
areContours: C,
thickness: i,
width: e,
height: A
} = M(this, za), s = Math.max(e, A), l = Ol.processDrawnLines({
lines: {
curves: g.map((n) => ({
points: n
})),
thickness: i,
width: e,
height: A
},
pageWidth: s,
pageHeight: s,
rotation: 0,
innerMargin: 0,
mustSmooth: !1,
areContours: C
});
return {
areContours: C,
outline: l.outline
};
}
async addEditToolbar() {
const g = await super.addEditToolbar();
return g ? (this._uiManager.signatureManager && M(this, Be) !== null && (await g.addEditSignatureButton(this._uiManager.signatureManager, M(this, Ja), M(this, Be)), g.show()), g) : null;
}
addSignature(g, C, i, e) {
const {
x: A,
y: s
} = this, {
outline: l
} = $(this, za, g);
$(this, ka, l instanceof ES), $(this, Be, i), this.div.setAttribute("data-l10n-args", JSON.stringify({
description: i
}));
let n;
M(this, ka) ? n = ne.getDefaultDrawingOptions() : (n = ne._defaultDrawnSignatureOptions.clone(), n.updateProperties({
"stroke-width": l.thickness
})), this._addOutlines({
drawOutlines: l,
drawingOptions: n
});
const [a, d] = this.parentDimensions, [, o] = this.pageDimensions;
let c = C / o;
c = c >= 1 ? 0.5 : c, this.width *= c / this.height, this.width >= 1 && (c *= 0.9 / this.width, this.width = 0.9), this.height = c, this.setDims(a * this.width, d * this.height), this.x = A, this.y = s, this.center(), this._onResized(), this.onScaleChanging(), this.rotate(), this._uiManager.addToAnnotationStorage(this), this.setUuid(e), this._reportTelemetry({
action: "pdfjs.signature.inserted",
data: {
hasBeenSaved: !!e,
hasDescription: !!i
}
}), this.div.hidden = !1;
}
getFromImage(g) {
const {
rawDims: {
pageWidth: C,
pageHeight: i
},
rotation: e
} = this.parent.viewport;
return Ol.process(g, C, i, e, ne._INNER_MARGIN);
}
getFromText(g, C) {
const {
rawDims: {
pageWidth: i,
pageHeight: e
},
rotation: A
} = this.parent.viewport;
return Ol.extractContoursFromText(g, C, i, e, A, ne._INNER_MARGIN);
}
getDrawnSignature(g) {
const {
rawDims: {
pageWidth: C,
pageHeight: i
},
rotation: e
} = this.parent.viewport;
return Ol.processDrawnLines({
lines: g,
pageWidth: C,
pageHeight: i,
rotation: e,
innerMargin: ne._INNER_MARGIN,
mustSmooth: !1,
areContours: !1
});
}
createDrawingOptions({
areContours: g,
thickness: C
}) {
g ? this._drawingOptions = ne.getDefaultDrawingOptions() : (this._drawingOptions = ne._defaultDrawnSignatureOptions.clone(), this._drawingOptions.updateProperties({
"stroke-width": C
}));
}
serialize(g = !1) {
if (this.isEmpty())
return null;
const {
lines: C,
points: i,
rect: e
} = this.serializeDraw(g), {
_drawingOptions: {
"stroke-width": A
}
} = this, s = {
annotationType: XI.SIGNATURE,
isSignature: !0,
areContours: M(this, ka),
color: [0, 0, 0],
thickness: M(this, ka) ? 0 : A,
pageIndex: this.pageIndex,
rect: e,
rotation: this.rotation,
structTreeParentId: this._structTreeParentId
};
return g ? (s.paths = {
lines: C,
points: i
}, s.uuid = M(this, Ja), s.isCopy = !0) : s.lines = C, M(this, Be) && (s.accessibilityData = {
type: "Figure",
alt: M(this, Be)
}), s;
}
static deserializeDraw(g, C, i, e, A, s) {
return s.areContours ? ES.deserialize(g, C, i, e, A, s) : oG.deserialize(g, C, i, e, A, s);
}
static async deserialize(g, C, i) {
var A;
const e = await super.deserialize(g, C, i);
return $(e, ka, g.areContours), $(e, Be, ((A = g.accessibilityData) == null ? void 0 : A.alt) || ""), $(e, Ja, g.uuid), e;
}
};
ka = new WeakMap(), Be = new WeakMap(), za = new WeakMap(), Ja = new WeakMap(), iI(ne, "_type", "signature"), iI(ne, "_editorType", XI.SIGNATURE), iI(ne, "_defaultDrawingOptions", null);
let gD = ne;
var kC, Jt, La, Ll, va, G0, vl, id, Rs, We, w0, lC, tm, im, KN, FN, kN, CD, zN, fIg;
class ID extends TC {
constructor(g) {
super({
...g,
name: "stampEditor"
});
tg(this, lC);
tg(this, kC, null);
tg(this, Jt, null);
tg(this, La, null);
tg(this, Ll, null);
tg(this, va, null);
tg(this, G0, "");
tg(this, vl, null);
tg(this, id, !1);
tg(this, Rs, null);
tg(this, We, !1);
tg(this, w0, !1);
$(this, Ll, g.bitmapUrl), $(this, va, g.bitmapFile), this.defaultL10nId = "pdfjs-editor-stamp-editor";
}
static initialize(g, C) {
TC.initialize(g, C);
}
static isHandlingMimeForPasting(g) {
return UX.includes(g);
}
static paste(g, C) {
C.pasteEditor(XI.STAMP, {
bitmapFile: g.getAsFile()
});
}
altTextFinish() {
this._uiManager.useNewAltTextFlow && (this.div.hidden = !1), super.altTextFinish();
}
get telemetryFinalData() {
var g;
return {
type: "stamp",
hasAltText: !!((g = this.altTextData) != null && g.altText)
};
}
static computeTelemetryFinalData(g) {
const C = g.get("hasAltText");
return {
hasAltText: C.get(!0) ?? 0,
hasNoAltText: C.get(!1) ?? 0
};
}
async mlGuessAltText(g = null, C = !0) {
if (this.hasAltTextData())
return null;
const {
mlManager: i
} = this._uiManager;
if (!i)
throw new Error("No ML.");
if (!await i.isEnabledFor("altText"))
throw new Error("ML isn't enabled for alt text.");
const {
data: e,
width: A,
height: s
} = g || this.copyCanvas(null, null, !0).imageData, l = await i.guess({
name: "altText",
request: {
data: e,
width: A,
height: s,
channels: e.length / (A * s)
}
});
if (!l)
throw new Error("No response from the AI service.");
if (l.error)
throw new Error("Error from the AI service.");
if (l.cancel)
return null;
if (!l.output)
throw new Error("No valid response from the AI service.");
const n = l.output;
return await this.setGuessedAltText(n), C && !this.hasAltTextData() && (this.altTextData = {
alt: n,
decorative: !1
}), n;
}
remove() {
var g;
M(this, Jt) && ($(this, kC, null), this._uiManager.imageManager.deleteId(M(this, Jt)), (g = M(this, vl)) == null || g.remove(), $(this, vl, null), M(this, Rs) && (clearTimeout(M(this, Rs)), $(this, Rs, null))), super.remove();
}
rebuild() {
if (!this.parent) {
M(this, Jt) && ig(this, lC, KN).call(this);
return;
}
super.rebuild(), this.div !== null && (M(this, Jt) && M(this, vl) === null && ig(this, lC, KN).call(this), this.isAttachedToDOM || this.parent.add(this));
}
onceAdded(g) {
this._isDraggable = !0, g && this.div.focus();
}
isEmpty() {
return !(M(this, La) || M(this, kC) || M(this, Ll) || M(this, va) || M(this, Jt) || M(this, id));
}
get isResizable() {
return !0;
}
render() {
if (this.div)
return this.div;
let g, C;
return this._isCopy && (g = this.x, C = this.y), super.render(), this.div.hidden = !0, this.addAltTextButton(), M(this, id) || (M(this, kC) ? ig(this, lC, FN).call(this) : ig(this, lC, KN).call(this)), this._isCopy && this._moveAfterPaste(g, C), this._uiManager.addShouldRescale(this), this.div;
}
setCanvas(g, C) {
const {
id: i,
bitmap: e
} = this._uiManager.imageManager.getFromCanvas(g, C);
C.remove(), i && this._uiManager.imageManager.isValidId(i) && ($(this, Jt, i), e && $(this, kC, e), $(this, id, !1), ig(this, lC, FN).call(this));
}
_onResized() {
this.onScaleChanging();
}
onScaleChanging() {
if (!this.parent)
return;
M(this, Rs) !== null && clearTimeout(M(this, Rs)), $(this, Rs, setTimeout(() => {
$(this, Rs, null), ig(this, lC, CD).call(this);
}, 200));
}
copyCanvas(g, C, i = !1) {
var c;
g || (g = 224);
const {
width: e,
height: A
} = M(this, kC), s = new In();
let l = M(this, kC), n = e, a = A, d = null;
if (C) {
if (e > C || A > C) {
const H = Math.min(C / e, C / A);
n = Math.floor(e * H), a = Math.floor(A * H);
}
d = document.createElement("canvas");
const r = d.width = Math.ceil(n * s.sx), h = d.height = Math.ceil(a * s.sy);
M(this, We) || (l = ig(this, lC, kN).call(this, r, h));
const b = d.getContext("2d");
b.filter = this._uiManager.hcmFilter;
let u = "white", m = "#cfcfd8";
this._uiManager.hcmFilter !== "none" ? m = "black" : (c = window.matchMedia) != null && c.call(window, "(prefers-color-scheme: dark)").matches && (u = "#8f8f9d", m = "#42414d");
const Z = 15, p = Z * s.sx, Y = Z * s.sy, R = new OffscreenCanvas(p * 2, Y * 2), X = R.getContext("2d");
X.fillStyle = u, X.fillRect(0, 0, p * 2, Y * 2), X.fillStyle = m, X.fillRect(0, 0, p, Y), X.fillRect(p, Y, p, Y), b.fillStyle = b.createPattern(R, "repeat"), b.fillRect(0, 0, r, h), b.drawImage(l, 0, 0, l.width, l.height, 0, 0, r, h);
}
let o = null;
if (i) {
let r, h;
if (s.symmetric && l.width < g && l.height < g)
r = l.width, h = l.height;
else if (l = M(this, kC), e > g || A > g) {
const m = Math.min(g / e, g / A);
r = Math.floor(e * m), h = Math.floor(A * m), M(this, We) || (l = ig(this, lC, kN).call(this, r, h));
}
const u = new OffscreenCanvas(r, h).getContext("2d", {
willReadFrequently: !0
});
u.drawImage(l, 0, 0, l.width, l.height, 0, 0, r, h), o = {
width: r,
height: h,
data: u.getImageData(0, 0, r, h).data
};
}
return {
canvas: d,
width: n,
height: a,
imageData: o
};
}
static async deserialize(g, C, i) {
var b;
let e = null, A = !1;
if (g instanceof Qgg) {
const {
data: {
rect: u,
rotation: m,
id: Z,
structParent: p,
popupRef: Y
},
container: R,
parent: {
page: {
pageNumber: X
}
},
canvas: H
} = g;
let S, z;
H ? (delete g.canvas, {
id: S,
bitmap: z
} = i.imageManager.getFromCanvas(R.id, H), H.remove()) : (A = !0, g._hasNoCanvas = !0);
const v = ((b = await C._structTree.getAriaAttributes(`${d9}${Z}`)) == null ? void 0 : b.get("aria-label")) || "";
e = g = {
annotationType: XI.STAMP,
bitmapId: S,
bitmap: z,
pageIndex: X - 1,
rect: u.slice(0),
rotation: m,
id: Z,
deleted: !1,
accessibilityData: {
decorative: !1,
altText: v
},
isSvg: !1,
structParent: p,
popupRef: Y
};
}
const s = await super.deserialize(g, C, i), {
rect: l,
bitmap: n,
bitmapUrl: a,
bitmapId: d,
isSvg: o,
accessibilityData: c
} = g;
A ? (i.addMissingCanvas(g.id, s), $(s, id, !0)) : d && i.imageManager.isValidId(d) ? ($(s, Jt, d), n && $(s, kC, n)) : $(s, Ll, a), $(s, We, o);
const [r, h] = s.pageDimensions;
return s.width = (l[2] - l[0]) / r, s.height = (l[3] - l[1]) / h, s.annotationElementId = g.id || null, c && (s.altTextData = c), s._initialData = e, $(s, w0, !!e), s;
}
serialize(g = !1, C = null) {
if (this.isEmpty())
return null;
if (this.deleted)
return this.serializeDeleted();
const i = {
annotationType: XI.STAMP,
bitmapId: M(this, Jt),
pageIndex: this.pageIndex,
rect: this.getRect(0, 0),
rotation: this.rotation,
isSvg: M(this, We),
structTreeParentId: this._structTreeParentId
};
if (g)
return i.bitmapUrl = ig(this, lC, zN).call(this, !0), i.accessibilityData = this.serializeAltText(!0), i.isCopy = !0, i;
const {
decorative: e,
altText: A
} = this.serializeAltText(!1);
if (!e && A && (i.accessibilityData = {
type: "Figure",
alt: A
}), this.annotationElementId) {
const l = ig(this, lC, fIg).call(this, i);
if (l.isSame)
return null;
l.isSameAltText ? delete i.accessibilityData : i.accessibilityData.structParent = this._initialData.structParent ?? -1;
}
if (i.id = this.annotationElementId, C === null)
return i;
C.stamps || (C.stamps = /* @__PURE__ */ new Map());
const s = M(this, We) ? (i.rect[2] - i.rect[0]) * (i.rect[3] - i.rect[1]) : null;
if (!C.stamps.has(M(this, Jt)))
C.stamps.set(M(this, Jt), {
area: s,
serialized: i
}), i.bitmap = ig(this, lC, zN).call(this, !1);
else if (M(this, We)) {
const l = C.stamps.get(M(this, Jt));
s > l.area && (l.area = s, l.serialized.bitmap.close(), l.serialized.bitmap = ig(this, lC, zN).call(this, !1));
}
return i;
}
renderAnnotationElement(g) {
return g.updateEdited({
rect: this.getRect(0, 0)
}), null;
}
}
kC = new WeakMap(), Jt = new WeakMap(), La = new WeakMap(), Ll = new WeakMap(), va = new WeakMap(), G0 = new WeakMap(), vl = new WeakMap(), id = new WeakMap(), Rs = new WeakMap(), We = new WeakMap(), w0 = new WeakMap(), lC = new WeakSet(), tm = function(g, C = !1) {
if (!g) {
this.remove();
return;
}
$(this, kC, g.bitmap), C || ($(this, Jt, g.id), $(this, We, g.isSvg)), g.file && $(this, G0, g.file.name), ig(this, lC, FN).call(this);
}, im = function() {
if ($(this, La, null), this._uiManager.enableWaiting(!1), !!M(this, vl)) {
if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && M(this, kC)) {
this._editToolbar.hide(), this._uiManager.editAltText(this, !0);
return;
}
if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && M(this, kC)) {
this._reportTelemetry({
action: "pdfjs.image.image_added",
data: {
alt_text_modal: !1,
alt_text_type: "empty"
}
});
try {
this.mlGuessAltText();
} catch {
}
}
this.div.focus();
}
}, KN = function() {
if (M(this, Jt)) {
this._uiManager.enableWaiting(!0), this._uiManager.imageManager.getFromId(M(this, Jt)).then((i) => ig(this, lC, tm).call(this, i, !0)).finally(() => ig(this, lC, im).call(this));
return;
}
if (M(this, Ll)) {
const i = M(this, Ll);
$(this, Ll, null), this._uiManager.enableWaiting(!0), $(this, La, this._uiManager.imageManager.getFromUrl(i).then((e) => ig(this, lC, tm).call(this, e)).finally(() => ig(this, lC, im).call(this)));
return;
}
if (M(this, va)) {
const i = M(this, va);
$(this, va, null), this._uiManager.enableWaiting(!0), $(this, La, this._uiManager.imageManager.getFromFile(i).then((e) => ig(this, lC, tm).call(this, e)).finally(() => ig(this, lC, im).call(this)));
return;
}
const g = document.createElement("input");
g.type = "file", g.accept = UX.join(",");
const C = this._uiManager._signal;
$(this, La, new Promise((i) => {
g.addEventListener("change", async () => {
if (!g.files || g.files.length === 0)
this.remove();
else {
this._uiManager.enableWaiting(!0);
const e = await this._uiManager.imageManager.getFromFile(g.files[0]);
this._reportTelemetry({
action: "pdfjs.image.image_selected",
data: {
alt_text_modal: this._uiManager.useNewAltTextFlow
}
}), ig(this, lC, tm).call(this, e);
}
i();
}, {
signal: C
}), g.addEventListener("cancel", () => {
this.remove(), i();
}, {
signal: C
});
}).finally(() => ig(this, lC, im).call(this))), g.click();
}, FN = function() {
var d;
const {
div: g
} = this;
let {
width: C,
height: i
} = M(this, kC);
const [e, A] = this.pageDimensions, s = 0.75;
if (this.width)
C = this.width * e, i = this.height * A;
else if (C > s * e || i > s * A) {
const o = Math.min(s * e / C, s * A / i);
C *= o, i *= o;
}
const [l, n] = this.parentDimensions;
this.setDims(C * l / e, i * n / A), this._uiManager.enableWaiting(!1);
const a = $(this, vl, document.createElement("canvas"));
a.setAttribute("role", "img"), this.addContainer(a), this.width = C / e, this.height = i / A, (d = this._initialOptions) != null && d.isCentered ? this.center() : this.fixAndSetPosition(), this._initialOptions = null, (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow || this.annotationElementId) && (g.hidden = !1), ig(this, lC, CD).call(this), M(this, w0) || (this.parent.addUndoableEditor(this), $(this, w0, !0)), this._reportTelemetry({
action: "inserted_image"
}), M(this, G0) && this.div.setAttribute("aria-description", M(this, G0));
}, kN = function(g, C) {
const {
width: i,
height: e
} = M(this, kC);
let A = i, s = e, l = M(this, kC);
for (; A > 2 * g || s > 2 * C; ) {
const n = A, a = s;
A > 2 * g && (A = A >= 16384 ? Math.floor(A / 2) - 1 : Math.ceil(A / 2)), s > 2 * C && (s = s >= 16384 ? Math.floor(s / 2) - 1 : Math.ceil(s / 2));
const d = new OffscreenCanvas(A, s);
d.getContext("2d").drawImage(l, 0, 0, n, a, 0, 0, A, s), l = d.transferToImageBitmap();
}
return l;
}, CD = function() {
const [g, C] = this.parentDimensions, {
width: i,
height: e
} = this, A = new In(), s = Math.ceil(i * g * A.sx), l = Math.ceil(e * C * A.sy), n = M(this, vl);
if (!n || n.width === s && n.height === l)
return;
n.width = s, n.height = l;
const a = M(this, We) ? M(this, kC) : ig(this, lC, kN).call(this, s, l), d = n.getContext("2d");
d.filter = this._uiManager.hcmFilter, d.drawImage(a, 0, 0, a.width, a.height, 0, 0, s, l);
}, zN = function(g) {
if (g) {
if (M(this, We)) {
const e = this._uiManager.imageManager.getSvgUrl(M(this, Jt));
if (e)
return e;
}
const C = document.createElement("canvas");
return {
width: C.width,
height: C.height
} = M(this, kC), C.getContext("2d").drawImage(M(this, kC), 0, 0), C.toDataURL();
}
if (M(this, We)) {
const [C, i] = this.pageDimensions, e = Math.round(this.width * C * Pa.PDF_TO_CSS_UNITS), A = Math.round(this.height * i * Pa.PDF_TO_CSS_UNITS), s = new OffscreenCanvas(e, A);
return s.getContext("2d").drawImage(M(this, kC), 0, 0, M(this, kC).width, M(this, kC).height, 0, 0, e, A), s.transferToImageBitmap();
}
return structuredClone(M(this, kC));
}, fIg = function(g) {
var s;
const {
pageIndex: C,
accessibilityData: {
altText: i
}
} = this._initialData, e = g.pageIndex === C, A = (((s = g.accessibilityData) == null ? void 0 : s.alt) || "") === i;
return {
isSame: !this._hasBeenMoved && !this._hasBeenResized && e && A,
isSameAltText: A
};
}, iI(ID, "_type", "stamp"), iI(ID, "_editorType", XI.STAMP);
var ed, p0, fs, Ta, Tl, qe, xa, B0, Ad, HA, xl, Gi, jl, sI, ja, vC, HIg, ds, iD, eD, JN;
const wA = class wA {
constructor({
uiManager: I,
pageIndex: g,
div: C,
structTreeLayer: i,
accessibilityManager: e,
annotationLayer: A,
drawLayer: s,
textLayer: l,
viewport: n,
l10n: a
}) {
tg(this, vC);
tg(this, ed);
tg(this, p0, !1);
tg(this, fs, null);
tg(this, Ta, null);
tg(this, Tl, null);
tg(this, qe, /* @__PURE__ */ new Map());
tg(this, xa, !1);
tg(this, B0, !1);
tg(this, Ad, !1);
tg(this, HA, null);
tg(this, xl, null);
tg(this, Gi, null);
tg(this, jl, null);
tg(this, sI);
const d = [...M(wA, ja).values()];
if (!wA._initialized) {
wA._initialized = !0;
for (const o of d)
o.initialize(a, I);
}
I.registerEditorTypes(d), $(this, sI, I), this.pageIndex = g, this.div = C, $(this, ed, e), $(this, fs, A), this.viewport = n, $(this, Gi, l), this.drawLayer = s, this._structTree = i, M(this, sI).addLayer(this);
}
get isEmpty() {
return M(this, qe).size === 0;
}
get isInvisible() {
return this.isEmpty && M(this, sI).getMode() === XI.NONE;
}
updateToolbar(I) {
M(this, sI).updateToolbar(I);
}
updateMode(I = M(this, sI).getMode()) {
switch (ig(this, vC, JN).call(this), I) {
case XI.NONE:
this.disableTextSelection(), this.togglePointerEvents(!1), this.toggleAnnotationLayerPointerEvents(!0), this.disableClick();
return;
case XI.INK:
this.disableTextSelection(), this.togglePointerEvents(!0), this.enableClick();
break;
case XI.HIGHLIGHT:
this.enableTextSelection(), this.togglePointerEvents(!1), this.disableClick();
break;
default:
this.disableTextSelection(), this.togglePointerEvents(!0), this.enableClick();
}
this.toggleAnnotationLayerPointerEvents(!1);
const {
classList: g
} = this.div;
for (const C of M(wA, ja).values())
g.toggle(`${C._type}Editing`, I === C._editorType);
this.div.hidden = !1;
}
hasTextLayer(I) {
var g;
return I === ((g = M(this, Gi)) == null ? void 0 : g.div);
}
setEditingState(I) {
M(this, sI).setEditingState(I);
}
addCommands(I) {
M(this, sI).addCommands(I);
}
cleanUndoStack(I) {
M(this, sI).cleanUndoStack(I);
}
toggleDrawing(I = !1) {
this.div.classList.toggle("drawing", !I);
}
togglePointerEvents(I = !1) {
this.div.classList.toggle("disabled", !I);
}
toggleAnnotationLayerPointerEvents(I = !1) {
var g;
(g = M(this, fs)) == null || g.div.classList.toggle("disabled", !I);
}
async enable() {
$(this, Ad, !0), this.div.tabIndex = 0, this.togglePointerEvents(!0);
const I = /* @__PURE__ */ new Set();
for (const C of M(this, qe).values())
C.enableEditing(), C.show(!0), C.annotationElementId && (M(this, sI).removeChangedExistingAnnotation(C), I.add(C.annotationElementId));
if (!M(this, fs)) {
$(this, Ad, !1);
return;
}
const g = M(this, fs).getEditableAnnotations();
for (const C of g) {
if (C.hide(), M(this, sI).isDeletedAnnotationElement(C.data.id) || I.has(C.data.id))
continue;
const i = await this.deserialize(C);
i && (this.addOrRebuild(i), i.enableEditing());
}
$(this, Ad, !1);
}
disable() {
var i;
$(this, B0, !0), this.div.tabIndex = -1, this.togglePointerEvents(!1);
const I = /* @__PURE__ */ new Map(), g = /* @__PURE__ */ new Map();
for (const e of M(this, qe).values())
if (e.disableEditing(), !!e.annotationElementId) {
if (e.serialize() !== null) {
I.set(e.annotationElementId, e);
continue;
} else
g.set(e.annotationElementId, e);
(i = this.getEditableAnnotation(e.annotationElementId)) == null || i.show(), e.remove();
}
if (M(this, fs)) {
const e = M(this, fs).getEditableAnnotations();
for (const A of e) {
const {
id: s
} = A.data;
if (M(this, sI).isDeletedAnnotationElement(s))
continue;
let l = g.get(s);
if (l) {
l.resetAnnotationElement(A), l.show(!1), A.show();
continue;
}
l = I.get(s), l && (M(this, sI).addChangedExistingAnnotation(l), l.renderAnnotationElement(A) && l.show(!1)), A.show();
}
}
ig(this, vC, JN).call(this), this.isEmpty && (this.div.hidden = !0);
const {
classList: C
} = this.div;
for (const e of M(wA, ja).values())
C.remove(`${e._type}Editing`);
this.disableTextSelection(), this.toggleAnnotationLayerPointerEvents(!0), $(this, B0, !1);
}
getEditableAnnotation(I) {
var g;
return ((g = M(this, fs)) == null ? void 0 : g.getEditableAnnotation(I)) || null;
}
setActiveEditor(I) {
M(this, sI).getActive() !== I && M(this, sI).setActiveEditor(I);
}
enableTextSelection() {
var I;
if (this.div.tabIndex = -1, (I = M(this, Gi)) != null && I.div && !M(this, jl)) {
$(this, jl, new AbortController());
const g = M(this, sI).combinedSignal(M(this, jl));
M(this, Gi).div.addEventListener("pointerdown", ig(this, vC, HIg).bind(this), {
signal: g
}), M(this, Gi).div.classList.add("highlighting");
}
}
disableTextSelection() {
var I;
this.div.tabIndex = 0, (I = M(this, Gi)) != null && I.div && M(this, jl) && (M(this, jl).abort(), $(this, jl, null), M(this, Gi).div.classList.remove("highlighting"));
}
enableClick() {
if (M(this, Ta))
return;
$(this, Ta, new AbortController());
const I = M(this, sI).combinedSignal(M(this, Ta));
this.div.addEventListener("pointerdown", this.pointerdown.bind(this), {
signal: I
});
const g = this.pointerup.bind(this);
this.div.addEventListener("pointerup", g, {
signal: I
}), this.div.addEventListener("pointercancel", g, {
signal: I
});
}
disableClick() {
var I;
(I = M(this, Ta)) == null || I.abort(), $(this, Ta, null);
}
attach(I) {
M(this, qe).set(I.id, I);
const {
annotationElementId: g
} = I;
g && M(this, sI).isDeletedAnnotationElement(g) && M(this, sI).removeDeletedAnnotationElement(I);
}
detach(I) {
var g;
M(this, qe).delete(I.id), (g = M(this, ed)) == null || g.removePointerInTextLayer(I.contentDiv), !M(this, B0) && I.annotationElementId && M(this, sI).addDeletedAnnotationElement(I);
}
remove(I) {
this.detach(I), M(this, sI).removeEditor(I), I.div.remove(), I.isAttachedToDOM = !1;
}
changeParent(I) {
var g;
I.parent !== this && (I.parent && I.annotationElementId && (M(this, sI).addDeletedAnnotationElement(I.annotationElementId), TC.deleteAnnotationElement(I), I.annotationElementId = null), this.attach(I), (g = I.parent) == null || g.detach(I), I.setParent(this), I.div && I.isAttachedToDOM && (I.div.remove(), this.div.append(I.div)));
}
add(I) {
if (!(I.parent === this && I.isAttachedToDOM)) {
if (this.changeParent(I), M(this, sI).addEditor(I), this.attach(I), !I.isAttachedToDOM) {
const g = I.render();
this.div.append(g), I.isAttachedToDOM = !0;
}
I.fixAndSetPosition(), I.onceAdded(!M(this, Ad)), M(this, sI).addToAnnotationStorage(I), I._reportTelemetry(I.telemetryInitialData);
}
}
moveEditorInDOM(I) {
var C;
if (!I.isAttachedToDOM)
return;
const {
activeElement: g
} = document;
I.div.contains(g) && !M(this, Tl) && (I._focusEventsAllowed = !1, $(this, Tl, setTimeout(() => {
$(this, Tl, null), I.div.contains(document.activeElement) ? I._focusEventsAllowed = !0 : (I.div.addEventListener("focusin", () => {
I._focusEventsAllowed = !0;
}, {
once: !0,
signal: M(this, sI)._signal
}), g.focus());
}, 0))), I._structTreeParentId = (C = M(this, ed)) == null ? void 0 : C.moveElementInDOM(this.div, I.div, I.contentDiv, !0);
}
addOrRebuild(I) {
I.needsToBeRebuilt() ? (I.parent || (I.parent = this), I.rebuild(), I.show()) : this.add(I);
}
addUndoableEditor(I) {
const g = () => I._uiManager.rebuild(I), C = () => {
I.remove();
};
this.addCommands({
cmd: g,
undo: C,
mustExec: !1
});
}
getNextId() {
return M(this, sI).getId();
}
combinedSignal(I) {
return M(this, sI).combinedSignal(I);
}
canCreateNewEmptyEditor() {
var I;
return (I = M(this, vC, ds)) == null ? void 0 : I.canCreateNewEmptyEditor();
}
async pasteEditor(I, g) {
M(this, sI).updateToolbar(I), await M(this, sI).updateMode(I);
const {
offsetX: C,
offsetY: i
} = ig(this, vC, eD).call(this), e = this.getNextId(), A = ig(this, vC, iD).call(this, {
parent: this,
id: e,
x: C,
y: i,
uiManager: M(this, sI),
isCentered: !0,
...g
});
A && this.add(A);
}
async deserialize(I) {
var g;
return await ((g = M(wA, ja).get(I.annotationType ?? I.annotationEditorType)) == null ? void 0 : g.deserialize(I, this, M(this, sI))) || null;
}
createAndAddNewEditor(I, g, C = {}) {
const i = this.getNextId(), e = ig(this, vC, iD).call(this, {
parent: this,
id: i,
x: I.offsetX,
y: I.offsetY,
uiManager: M(this, sI),
isCentered: g,
...C
});
return e && this.add(e), e;
}
addNewEditor(I = {}) {
this.createAndAddNewEditor(ig(this, vC, eD).call(this), !0, I);
}
setSelected(I) {
M(this, sI).setSelected(I);
}
toggleSelected(I) {
M(this, sI).toggleSelected(I);
}
unselect(I) {
M(this, sI).unselect(I);
}
pointerup(I) {
var i;
const {
isMac: g
} = Ai.platform;
if (I.button !== 0 || I.ctrlKey && g || I.target !== this.div || !M(this, xa) || ($(this, xa, !1), (i = M(this, vC, ds)) != null && i.isDrawer && M(this, vC, ds).supportMultipleDrawings))
return;
if (!M(this, p0)) {
$(this, p0, !0);
return;
}
const C = M(this, sI).getMode();
if (C === XI.STAMP || C === XI.SIGNATURE) {
M(this, sI).unselectAll();
return;
}
this.createAndAddNewEditor(I, !1);
}
pointerdown(I) {
var i;
if (M(this, sI).getMode() === XI.HIGHLIGHT && this.enableTextSelection(), M(this, xa)) {
$(this, xa, !1);
return;
}
const {
isMac: g
} = Ai.platform;
if (I.button !== 0 || I.ctrlKey && g || I.target !== this.div)
return;
if ($(this, xa, !0), (i = M(this, vC, ds)) != null && i.isDrawer) {
this.startDrawingSession(I);
return;
}
const C = M(this, sI).getActive();
$(this, p0, !C || C.isEmpty());
}
startDrawingSession(I) {
if (this.div.focus({
preventScroll: !0
}), M(this, HA)) {
M(this, vC, ds).startDrawing(this, M(this, sI), !1, I);
return;
}
M(this, sI).setCurrentDrawingSession(this), $(this, HA, new AbortController());
const g = M(this, sI).combinedSignal(M(this, HA));
this.div.addEventListener("blur", ({
relatedTarget: C
}) => {
C && !this.div.contains(C) && ($(this, xl, null), this.commitOrRemove());
}, {
signal: g
}), M(this, vC, ds).startDrawing(this, M(this, sI), !1, I);
}
pause(I) {
if (I) {
const {
activeElement: g
} = document;
this.div.contains(g) && $(this, xl, g);
return;
}
M(this, xl) && setTimeout(() => {
var g;
(g = M(this, xl)) == null || g.focus(), $(this, xl, null);
}, 0);
}
endDrawingSession(I = !1) {
return M(this, HA) ? (M(this, sI).setCurrentDrawingSession(null), M(this, HA).abort(), $(this, HA, null), $(this, xl, null), M(this, vC, ds).endDrawing(I)) : null;
}
findNewParent(I, g, C) {
const i = M(this, sI).findParent(g, C);
return i === null || i === this ? !1 : (i.changeParent(I), !0);
}
commitOrRemove() {
return M(this, HA) ? (this.endDrawingSession(), !0) : !1;
}
onScaleChanging() {
M(this, HA) && M(this, vC, ds).onScaleChangingWhenDrawing(this);
}
destroy() {
var I, g;
this.commitOrRemove(), ((I = M(this, sI).getActive()) == null ? void 0 : I.parent) === this && (M(this, sI).commitOrRemove(), M(this, sI).setActiveEditor(null)), M(this, Tl) && (clearTimeout(M(this, Tl)), $(this, Tl, null));
for (const C of M(this, qe).values())
(g = M(this, ed)) == null || g.removePointerInTextLayer(C.contentDiv), C.setParent(null), C.isAttachedToDOM = !1, C.div.remove();
this.div = null, M(this, qe).clear(), M(this, sI).removeLayer(this);
}
render({
viewport: I
}) {
this.viewport = I, cd(this.div, I);
for (const g of M(this, sI).getEditors(this.pageIndex))
this.add(g), g.rebuild();
this.updateMode();
}
update({
viewport: I
}) {
M(this, sI).commitOrRemove(), ig(this, vC, JN).call(this);
const g = this.viewport.rotation, C = I.rotation;
if (this.viewport = I, cd(this.div, {
rotation: C
}), g !== C)
for (const i of M(this, qe).values())
i.rotate(C);
}
get pageDimensions() {
const {
pageWidth: I,
pageHeight: g
} = this.viewport.rawDims;
return [I, g];
}
get scale() {
return M(this, sI).viewParameters.realScale;
}
};
ed = new WeakMap(), p0 = new WeakMap(), fs = new WeakMap(), Ta = new WeakMap(), Tl = new WeakMap(), qe = new WeakMap(), xa = new WeakMap(), B0 = new WeakMap(), Ad = new WeakMap(), HA = new WeakMap(), xl = new WeakMap(), Gi = new WeakMap(), jl = new WeakMap(), sI = new WeakMap(), ja = new WeakMap(), vC = new WeakSet(), HIg = function(I) {
M(this, sI).unselectAll();
const {
target: g
} = I;
if (g === M(this, Gi).div || (g.getAttribute("role") === "img" || g.classList.contains("endOfContent")) && M(this, Gi).div.contains(g)) {
const {
isMac: C
} = Ai.platform;
if (I.button !== 0 || I.ctrlKey && C)
return;
M(this, sI).showAllEditors("highlight", !0, !0), M(this, Gi).div.classList.add("free"), this.toggleDrawing(), lV.startHighlighting(this, M(this, sI).direction === "ltr", {
target: M(this, Gi).div,
x: I.x,
y: I.y
}), M(this, Gi).div.addEventListener("pointerup", () => {
M(this, Gi).div.classList.remove("free"), this.toggleDrawing(!0);
}, {
once: !0,
signal: M(this, sI)._signal
}), I.preventDefault();
}
}, ds = function() {
return M(wA, ja).get(M(this, sI).getMode());
}, iD = function(I) {
const g = M(this, vC, ds);
return g ? new g.prototype.constructor(I) : null;
}, eD = function() {
const {
x: I,
y: g,
width: C,
height: i
} = this.div.getBoundingClientRect(), e = Math.max(0, I), A = Math.max(0, g), s = Math.min(window.innerWidth, I + C), l = Math.min(window.innerHeight, g + i), n = (e + s) / 2 - I, a = (A + l) / 2 - g, [d, o] = this.viewport.rotation % 180 === 0 ? [n, a] : [a, n];
return {
offsetX: d,
offsetY: o
};
}, JN = function() {
for (const I of M(this, qe).values())
I.isEmpty() && I.remove();
}, iI(wA, "_initialized", !1), tg(wA, ja, new Map([DS, US, ID, lV, gD].map((I) => [I._editorType, I])));
let tD = wA;
var XA, Ri, sd, CG, EV, XIg, zs, sD, SIg, lD;
const pt = class pt {
constructor({
pageIndex: I
}) {
tg(this, zs);
tg(this, XA, null);
tg(this, Ri, /* @__PURE__ */ new Map());
tg(this, sd, /* @__PURE__ */ new Map());
this.pageIndex = I;
}
setParent(I) {
if (!M(this, XA)) {
$(this, XA, I);
return;
}
if (M(this, XA) !== I) {
if (M(this, Ri).size > 0)
for (const g of M(this, Ri).values())
g.remove(), I.append(g);
$(this, XA, I);
}
}
static get _svgFactory() {
return UI(this, "_svgFactory", new eV());
}
draw(I, g = !1, C = !1) {
const i = Wi(pt, CG)._++, e = ig(this, zs, sD).call(this), A = pt._svgFactory.createElement("defs");
e.append(A);
const s = pt._svgFactory.createElement("path");
A.append(s);
const l = `path_p${this.pageIndex}_${i}`;
s.setAttribute("id", l), s.setAttribute("vector-effect", "non-scaling-stroke"), g && M(this, sd).set(i, s);
const n = C ? ig(this, zs, SIg).call(this, A, l) : null, a = pt._svgFactory.createElement("use");
return e.append(a), a.setAttribute("href", `#${l}`), this.updateProperties(e, I), M(this, Ri).set(i, e), {
id: i,
clipPathId: `url(#${n})`
};
}
drawOutline(I, g) {
const C = Wi(pt, CG)._++, i = ig(this, zs, sD).call(this), e = pt._svgFactory.createElement("defs");
i.append(e);
const A = pt._svgFactory.createElement("path");
e.append(A);
const s = `path_p${this.pageIndex}_${C}`;
A.setAttribute("id", s), A.setAttribute("vector-effect", "non-scaling-stroke");
let l;
if (g) {
const d = pt._svgFactory.createElement("mask");
e.append(d), l = `mask_p${this.pageIndex}_${C}`, d.setAttribute("id", l), d.setAttribute("maskUnits", "objectBoundingBox");
const o = pt._svgFactory.createElement("rect");
d.append(o), o.setAttribute("width", "1"), o.setAttribute("height", "1"), o.setAttribute("fill", "white");
const c = pt._svgFactory.createElement("use");
d.append(c), c.setAttribute("href", `#${s}`), c.setAttribute("stroke", "none"), c.setAttribute("fill", "black"), c.setAttribute("fill-rule", "nonzero"), c.classList.add("mask");
}
const n = pt._svgFactory.createElement("use");
i.append(n), n.setAttribute("href", `#${s}`), l && n.setAttribute("mask", `url(#${l})`);
const a = n.cloneNode();
return i.append(a), n.classList.add("mainOutline"), a.classList.add("secondaryOutline"), this.updateProperties(i, I), M(this, Ri).set(C, i), C;
}
finalizeDraw(I, g) {
M(this, sd).delete(I), this.updateProperties(I, g);
}
updateProperties(I, g) {
var l;
if (!g)
return;
const {
root: C,
bbox: i,
rootClass: e,
path: A
} = g, s = typeof I == "number" ? M(this, Ri).get(I) : I;
if (s) {
if (C && ig(this, zs, lD).call(this, s, C), i && ig(l = pt, EV, XIg).call(l, s, i), e) {
const {
classList: n
} = s;
for (const [a, d] of Object.entries(e))
n.toggle(a, d);
}
if (A) {
const a = s.firstChild.firstChild;
ig(this, zs, lD).call(this, a, A);
}
}
}
updateParent(I, g) {
if (g === this)
return;
const C = M(this, Ri).get(I);
C && (M(g, XA).append(C), M(this, Ri).delete(I), M(g, Ri).set(I, C));
}
remove(I) {
M(this, sd).delete(I), M(this, XA) !== null && (M(this, Ri).get(I).remove(), M(this, Ri).delete(I));
}
destroy() {
$(this, XA, null);
for (const I of M(this, Ri).values())
I.remove();
M(this, Ri).clear(), M(this, sd).clear();
}
};
XA = new WeakMap(), Ri = new WeakMap(), sd = new WeakMap(), CG = new WeakMap(), EV = new WeakSet(), XIg = function(I, [g, C, i, e]) {
const {
style: A
} = I;
A.top = `${100 * C}%`, A.left = `${100 * g}%`, A.width = `${100 * i}%`, A.height = `${100 * e}%`;
}, zs = new WeakSet(), sD = function() {
const I = pt._svgFactory.create(1, 1, !0);
return M(this, XA).append(I), I.setAttribute("aria-hidden", !0), I;
}, SIg = function(I, g) {
const C = pt._svgFactory.createElement("clipPath");
I.append(C);
const i = `clip_${g}`;
C.setAttribute("id", i), C.setAttribute("clipPathUnits", "objectBoundingBox");
const e = pt._svgFactory.createElement("use");
return C.append(e), e.setAttribute("href", `#${g}`), e.classList.add("clip"), i;
}, lD = function(I, g) {
for (const [C, i] of Object.entries(g))
i === null ? I.removeAttribute(C) : I.setAttribute(C, i);
}, tg(pt, EV), tg(pt, CG, 0);
let AD = pt;
globalThis.pdfjsTestingUtils = {
HighlightOutliner: FS
};
pI.AbortException;
pI.AnnotationEditorLayer;
pI.AnnotationEditorParamsType;
pI.AnnotationEditorType;
pI.AnnotationEditorUIManager;
pI.AnnotationLayer;
pI.AnnotationMode;
pI.AnnotationType;
pI.ColorPicker;
pI.DOMSVGFactory;
pI.DrawLayer;
pI.FeatureTest;
var Rdg = pI.GlobalWorkerOptions;
pI.ImageKind;
pI.InvalidPDFException;
pI.MathClamp;
pI.OPS;
pI.OutputScale;
pI.PDFDataRangeTransport;
pI.PDFDateString;
pI.PDFWorker;
pI.PasswordResponses;
pI.PermissionFlag;
pI.PixelsPerInch;
pI.RenderingCancelledException;
pI.ResponseException;
pI.SignatureExtractor;
pI.SupportedImageMimeTypes;
pI.TextLayer;
pI.TouchManager;
pI.Util;
pI.VerbosityLevel;
pI.XfaLayer;
pI.build;
pI.createValidAbsoluteUrl;
pI.fetchData;
var fdg = pI.getDocument;
pI.getFilenameFromUrl;
pI.getPdfFilenameFromUrl;
pI.getUuid;
pI.getXfaPageViewport;
pI.isDataScheme;
pI.isPdfFile;
pI.isValidExplicitDest;
pI.noContextMenu;
pI.normalizeUnicode;
pI.setLayerDimensions;
pI.shadow;
pI.stopEvent;
pI.version;
const V0 = (t, I) => {
const g = t.__vccOpts || t;
for (const [C, i] of I)
g[C] = i;
return g;
}, Hdg = { class: "home_wrap" }, Xdg = ["id"], Sdg = {
__name: "PdfView",
props: {
data: Array
},
setup(t) {
Rdg.workerSrc = new URL("data:text/javascript;base64,LyoqCiAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQogKiBKYXZhU2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCiAqCiAqIENvcHlyaWdodCAyMDI0IE1vemlsbGEgRm91bmRhdGlvbgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKICogSmF2YVNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQogKi8KCi8qKioqKiovIC8vIFRoZSByZXF1aXJlIHNjb3BlCi8qKioqKiovIHZhciBfX3dlYnBhY2tfcmVxdWlyZV9fID0ge307Ci8qKioqKiovIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi8KLyoqKioqKi8gKCgpID0+IHsKLyoqKioqKi8gCS8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHMKLyoqKioqKi8gCV9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7Ci8qKioqKiovIAkJZm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgewovKioqKioqLyAJCQlpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHsKLyoqKioqKi8gCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7Ci8qKioqKiovIAkJCX0KLyoqKioqKi8gCQl9Ci8qKioqKiovIAl9OwovKioqKioqLyB9KSgpOwovKioqKioqLyAKLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCAqLwovKioqKioqLyAoKCkgPT4gewovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKQovKioqKioqLyB9KSgpOwovKioqKioqLyAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdmFyIF9fd2VicGFja19leHBvcnRzX18gPSBnbG9iYWxUaGlzLnBkZmpzV29ya2VyID0ge307CgovLyBFWFBPUlRTCl9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7CiAgV29ya2VyTWVzc2FnZUhhbmRsZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBXb3JrZXJNZXNzYWdlSGFuZGxlcikKfSk7Cgo7Ly8gLi9zcmMvc2hhcmVkL3V0aWwuanMKY29uc3QgaXNOb2RlSlMgPSB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYgcHJvY2VzcyArICIiID09PSAiW29iamVjdCBwcm9jZXNzXSIgJiYgIXByb2Nlc3MudmVyc2lvbnMubncgJiYgIShwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uICYmIHByb2Nlc3MudHlwZSAmJiBwcm9jZXNzLnR5cGUgIT09ICJicm93c2VyIik7CmNvbnN0IElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVggPSBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXTsKY29uc3QgTElORV9GQUNUT1IgPSAxLjM1Owpjb25zdCBMSU5FX0RFU0NFTlRfRkFDVE9SID0gMC4zNTsKY29uc3QgQkFTRUxJTkVfRkFDVE9SID0gTElORV9ERVNDRU5UX0ZBQ1RPUiAvIExJTkVfRkFDVE9SOwpjb25zdCBSZW5kZXJpbmdJbnRlbnRGbGFnID0gewogIEFOWTogMHgwMSwKICBESVNQTEFZOiAweDAyLAogIFBSSU5UOiAweDA0LAogIFNBVkU6IDB4MDgsCiAgQU5OT1RBVElPTlNfRk9STVM6IDB4MTAsCiAgQU5OT1RBVElPTlNfU1RPUkFHRTogMHgyMCwKICBBTk5PVEFUSU9OU19ESVNBQkxFOiAweDQwLAogIElTX0VESVRJTkc6IDB4ODAsCiAgT1BMSVNUOiAweDEwMAp9Owpjb25zdCBBbm5vdGF0aW9uTW9kZSA9IHsKICBESVNBQkxFOiAwLAogIEVOQUJMRTogMSwKICBFTkFCTEVfRk9STVM6IDIsCiAgRU5BQkxFX1NUT1JBR0U6IDMKfTsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclByZWZpeCA9ICJwZGZqc19pbnRlcm5hbF9lZGl0b3JfIjsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclR5cGUgPSB7CiAgRElTQUJMRTogLTEsCiAgTk9ORTogMCwKICBGUkVFVEVYVDogMywKICBISUdITElHSFQ6IDksCiAgU1RBTVA6IDEzLAogIElOSzogMTUsCiAgU0lHTkFUVVJFOiAxMDEKfTsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSB7CiAgUkVTSVpFOiAxLAogIENSRUFURTogMiwKICBGUkVFVEVYVF9TSVpFOiAxMSwKICBGUkVFVEVYVF9DT0xPUjogMTIsCiAgRlJFRVRFWFRfT1BBQ0lUWTogMTMsCiAgSU5LX0NPTE9SOiAyMSwKICBJTktfVEhJQ0tORVNTOiAyMiwKICBJTktfT1BBQ0lUWTogMjMsCiAgSElHSExJR0hUX0NPTE9SOiAzMSwKICBISUdITElHSFRfREVGQVVMVF9DT0xPUjogMzIsCiAgSElHSExJR0hUX1RISUNLTkVTUzogMzMsCiAgSElHSExJR0hUX0ZSRUU6IDM0LAogIEhJR0hMSUdIVF9TSE9XX0FMTDogMzUsCiAgRFJBV19TVEVQOiA0MQp9Owpjb25zdCBQZXJtaXNzaW9uRmxhZyA9IHsKICBQUklOVDogMHgwNCwKICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsCiAgQ09QWTogMHgxMCwKICBNT0RJRllfQU5OT1RBVElPTlM6IDB4MjAsCiAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsCiAgQ09QWV9GT1JfQUNDRVNTSUJJTElUWTogMHgyMDAsCiAgQVNTRU1CTEU6IDB4NDAwLAogIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAKfTsKY29uc3QgVGV4dFJlbmRlcmluZ01vZGUgPSB7CiAgRklMTDogMCwKICBTVFJPS0U6IDEsCiAgRklMTF9TVFJPS0U6IDIsCiAgSU5WSVNJQkxFOiAzLAogIEZJTExfQUREX1RPX1BBVEg6IDQsCiAgU1RST0tFX0FERF9UT19QQVRIOiA1LAogIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LAogIEFERF9UT19QQVRIOiA3LAogIEZJTExfU1RST0tFX01BU0s6IDMsCiAgQUREX1RPX1BBVEhfRkxBRzogNAp9Owpjb25zdCBJbWFnZUtpbmQgPSB7CiAgR1JBWVNDQUxFXzFCUFA6IDEsCiAgUkdCXzI0QlBQOiAyLAogIFJHQkFfMzJCUFA6IDMKfTsKY29uc3QgQW5ub3RhdGlvblR5cGUgPSB7CiAgVEVYVDogMSwKICBMSU5LOiAyLAogIEZSRUVURVhUOiAzLAogIExJTkU6IDQsCiAgU1FVQVJFOiA1LAogIENJUkNMRTogNiwKICBQT0xZR09OOiA3LAogIFBPTFlMSU5FOiA4LAogIEhJR0hMSUdIVDogOSwKICBVTkRFUkxJTkU6IDEwLAogIFNRVUlHR0xZOiAxMSwKICBTVFJJS0VPVVQ6IDEyLAogIFNUQU1QOiAxMywKICBDQVJFVDogMTQsCiAgSU5LOiAxNSwKICBQT1BVUDogMTYsCiAgRklMRUFUVEFDSE1FTlQ6IDE3LAogIFNPVU5EOiAxOCwKICBNT1ZJRTogMTksCiAgV0lER0VUOiAyMCwKICBTQ1JFRU46IDIxLAogIFBSSU5URVJNQVJLOiAyMiwKICBUUkFQTkVUOiAyMywKICBXQVRFUk1BUks6IDI0LAogIFRIUkVFRDogMjUsCiAgUkVEQUNUOiAyNgp9Owpjb25zdCBBbm5vdGF0aW9uUmVwbHlUeXBlID0gewogIEdST1VQOiAiR3JvdXAiLAogIFJFUExZOiAiUiIKfTsKY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7CiAgSU5WSVNJQkxFOiAweDAxLAogIEhJRERFTjogMHgwMiwKICBQUklOVDogMHgwNCwKICBOT1pPT006IDB4MDgsCiAgTk9ST1RBVEU6IDB4MTAsCiAgTk9WSUVXOiAweDIwLAogIFJFQURPTkxZOiAweDQwLAogIExPQ0tFRDogMHg4MCwKICBUT0dHTEVOT1ZJRVc6IDB4MTAwLAogIExPQ0tFRENPTlRFTlRTOiAweDIwMAp9Owpjb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0gewogIFJFQURPTkxZOiAweDAwMDAwMDEsCiAgUkVRVUlSRUQ6IDB4MDAwMDAwMiwKICBOT0VYUE9SVDogMHgwMDAwMDA0LAogIE1VTFRJTElORTogMHgwMDAxMDAwLAogIFBBU1NXT1JEOiAweDAwMDIwMDAsCiAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLAogIFJBRElPOiAweDAwMDgwMDAsCiAgUFVTSEJVVFRPTjogMHgwMDEwMDAwLAogIENPTUJPOiAweDAwMjAwMDAsCiAgRURJVDogMHgwMDQwMDAwLAogIFNPUlQ6IDB4MDA4MDAwMCwKICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsCiAgTVVMVElTRUxFQ1Q6IDB4MDIwMDAwMCwKICBET05PVFNQRUxMQ0hFQ0s6IDB4MDQwMDAwMCwKICBET05PVFNDUk9MTDogMHgwODAwMDAwLAogIENPTUI6IDB4MTAwMDAwMCwKICBSSUNIVEVYVDogMHgyMDAwMDAwLAogIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsCiAgQ09NTUlUT05TRUxDSEFOR0U6IDB4NDAwMDAwMAp9Owpjb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gewogIFNPTElEOiAxLAogIERBU0hFRDogMiwKICBCRVZFTEVEOiAzLAogIElOU0VUOiA0LAogIFVOREVSTElORTogNQp9Owpjb25zdCBBbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlID0gewogIEU6ICJNb3VzZSBFbnRlciIsCiAgWDogIk1vdXNlIEV4aXQiLAogIEQ6ICJNb3VzZSBEb3duIiwKICBVOiAiTW91c2UgVXAiLAogIEZvOiAiRm9jdXMiLAogIEJsOiAiQmx1ciIsCiAgUE86ICJQYWdlT3BlbiIsCiAgUEM6ICJQYWdlQ2xvc2UiLAogIFBWOiAiUGFnZVZpc2libGUiLAogIFBJOiAiUGFnZUludmlzaWJsZSIsCiAgSzogIktleXN0cm9rZSIsCiAgRjogIkZvcm1hdCIsCiAgVjogIlZhbGlkYXRlIiwKICBDOiAiQ2FsY3VsYXRlIgp9Owpjb25zdCBEb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IHsKICBXQzogIldpbGxDbG9zZSIsCiAgV1M6ICJXaWxsU2F2ZSIsCiAgRFM6ICJEaWRTYXZlIiwKICBXUDogIldpbGxQcmludCIsCiAgRFA6ICJEaWRQcmludCIKfTsKY29uc3QgUGFnZUFjdGlvbkV2ZW50VHlwZSA9IHsKICBPOiAiUGFnZU9wZW4iLAogIEM6ICJQYWdlQ2xvc2UiCn07CmNvbnN0IFZlcmJvc2l0eUxldmVsID0gewogIEVSUk9SUzogMCwKICBXQVJOSU5HUzogMSwKICBJTkZPUzogNQp9Owpjb25zdCBPUFMgPSB7CiAgZGVwZW5kZW5jeTogMSwKICBzZXRMaW5lV2lkdGg6IDIsCiAgc2V0TGluZUNhcDogMywKICBzZXRMaW5lSm9pbjogNCwKICBzZXRNaXRlckxpbWl0OiA1LAogIHNldERhc2g6IDYsCiAgc2V0UmVuZGVyaW5nSW50ZW50OiA3LAogIHNldEZsYXRuZXNzOiA4LAogIHNldEdTdGF0ZTogOSwKICBzYXZlOiAxMCwKICByZXN0b3JlOiAxMSwKICB0cmFuc2Zvcm06IDEyLAogIG1vdmVUbzogMTMsCiAgbGluZVRvOiAxNCwKICBjdXJ2ZVRvOiAxNSwKICBjdXJ2ZVRvMjogMTYsCiAgY3VydmVUbzM6IDE3LAogIGNsb3NlUGF0aDogMTgsCiAgcmVjdGFuZ2xlOiAxOSwKICBzdHJva2U6IDIwLAogIGNsb3NlU3Ryb2tlOiAyMSwKICBmaWxsOiAyMiwKICBlb0ZpbGw6IDIzLAogIGZpbGxTdHJva2U6IDI0LAogIGVvRmlsbFN0cm9rZTogMjUsCiAgY2xvc2VGaWxsU3Ryb2tlOiAyNiwKICBjbG9zZUVPRmlsbFN0cm9rZTogMjcsCiAgZW5kUGF0aDogMjgsCiAgY2xpcDogMjksCiAgZW9DbGlwOiAzMCwKICBiZWdpblRleHQ6IDMxLAogIGVuZFRleHQ6IDMyLAogIHNldENoYXJTcGFjaW5nOiAzMywKICBzZXRXb3JkU3BhY2luZzogMzQsCiAgc2V0SFNjYWxlOiAzNSwKICBzZXRMZWFkaW5nOiAzNiwKICBzZXRGb250OiAzNywKICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsCiAgc2V0VGV4dFJpc2U6IDM5LAogIG1vdmVUZXh0OiA0MCwKICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLAogIHNldFRleHRNYXRyaXg6IDQyLAogIG5leHRMaW5lOiA0MywKICBzaG93VGV4dDogNDQsCiAgc2hvd1NwYWNlZFRleHQ6IDQ1LAogIG5leHRMaW5lU2hvd1RleHQ6IDQ2LAogIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NywKICBzZXRDaGFyV2lkdGg6IDQ4LAogIHNldENoYXJXaWR0aEFuZEJvdW5kczogNDksCiAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsCiAgc2V0RmlsbENvbG9yU3BhY2U6IDUxLAogIHNldFN0cm9rZUNvbG9yOiA1MiwKICBzZXRTdHJva2VDb2xvck46IDUzLAogIHNldEZpbGxDb2xvcjogNTQsCiAgc2V0RmlsbENvbG9yTjogNTUsCiAgc2V0U3Ryb2tlR3JheTogNTYsCiAgc2V0RmlsbEdyYXk6IDU3LAogIHNldFN0cm9rZVJHQkNvbG9yOiA1OCwKICBzZXRGaWxsUkdCQ29sb3I6IDU5LAogIHNldFN0cm9rZUNNWUtDb2xvcjogNjAsCiAgc2V0RmlsbENNWUtDb2xvcjogNjEsCiAgc2hhZGluZ0ZpbGw6IDYyLAogIGJlZ2luSW5saW5lSW1hZ2U6IDYzLAogIGJlZ2luSW1hZ2VEYXRhOiA2NCwKICBlbmRJbmxpbmVJbWFnZTogNjUsCiAgcGFpbnRYT2JqZWN0OiA2NiwKICBtYXJrUG9pbnQ6IDY3LAogIG1hcmtQb2ludFByb3BzOiA2OCwKICBiZWdpbk1hcmtlZENvbnRlbnQ6IDY5LAogIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiA3MCwKICBlbmRNYXJrZWRDb250ZW50OiA3MSwKICBiZWdpbkNvbXBhdDogNzIsCiAgZW5kQ29tcGF0OiA3MywKICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LAogIHBhaW50Rm9ybVhPYmplY3RFbmQ6IDc1LAogIGJlZ2luR3JvdXA6IDc2LAogIGVuZEdyb3VwOiA3NywKICBiZWdpbkFubm90YXRpb246IDgwLAogIGVuZEFubm90YXRpb246IDgxLAogIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogODMsCiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IDg0LAogIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSwKICBwYWludElubGluZUltYWdlWE9iamVjdDogODYsCiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogODcsCiAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LAogIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDogODksCiAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiA5MCwKICBjb25zdHJ1Y3RQYXRoOiA5MSwKICBzZXRTdHJva2VUcmFuc3BhcmVudDogOTIsCiAgc2V0RmlsbFRyYW5zcGFyZW50OiA5Mwp9Owpjb25zdCBEcmF3T1BTID0gewogIG1vdmVUbzogMCwKICBsaW5lVG86IDEsCiAgY3VydmVUbzogMiwKICBjbG9zZVBhdGg6IDMKfTsKY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7CiAgTkVFRF9QQVNTV09SRDogMSwKICBJTkNPUlJFQ1RfUEFTU1dPUkQ6IDIKfTsKbGV0IHZlcmJvc2l0eSA9IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTOwpmdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbChsZXZlbCkgewogIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGxldmVsKSkgewogICAgdmVyYm9zaXR5ID0gbGV2ZWw7CiAgfQp9CmZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkgewogIHJldHVybiB2ZXJib3NpdHk7Cn0KZnVuY3Rpb24gaW5mbyhtc2cpIHsKICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLklORk9TKSB7CiAgICBjb25zb2xlLmxvZyhgSW5mbzogJHttc2d9YCk7CiAgfQp9CmZ1bmN0aW9uIHdhcm4obXNnKSB7CiAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUykgewogICAgY29uc29sZS5sb2coYFdhcm5pbmc6ICR7bXNnfWApOwogIH0KfQpmdW5jdGlvbiB1bnJlYWNoYWJsZShtc2cpIHsKICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKfQpmdW5jdGlvbiBhc3NlcnQoY29uZCwgbXNnKSB7CiAgaWYgKCFjb25kKSB7CiAgICB1bnJlYWNoYWJsZShtc2cpOwogIH0KfQpmdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKHVybCkgewogIHN3aXRjaCAodXJsPy5wcm90b2NvbCkgewogICAgY2FzZSAiaHR0cDoiOgogICAgY2FzZSAiaHR0cHM6IjoKICAgIGNhc2UgImZ0cDoiOgogICAgY2FzZSAibWFpbHRvOiI6CiAgICBjYXNlICJ0ZWw6IjoKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwodXJsLCBiYXNlVXJsID0gbnVsbCwgb3B0aW9ucyA9IG51bGwpIHsKICBpZiAoIXVybCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGlmIChvcHRpb25zICYmIHR5cGVvZiB1cmwgPT09ICJzdHJpbmciKSB7CiAgICBpZiAob3B0aW9ucy5hZGREZWZhdWx0UHJvdG9jb2wgJiYgdXJsLnN0YXJ0c1dpdGgoInd3dy4iKSkgewogICAgICBjb25zdCBkb3RzID0gdXJsLm1hdGNoKC9cLi9nKTsKICAgICAgaWYgKGRvdHM/Lmxlbmd0aCA+PSAyKSB7CiAgICAgICAgdXJsID0gYGh0dHA6Ly8ke3VybH1gOwogICAgICB9CiAgICB9CiAgICBpZiAob3B0aW9ucy50cnlDb252ZXJ0RW5jb2RpbmcpIHsKICAgICAgdHJ5IHsKICAgICAgICB1cmwgPSBzdHJpbmdUb1VURjhTdHJpbmcodXJsKTsKICAgICAgfSBjYXRjaCB7fQogICAgfQogIH0KICBjb25zdCBhYnNvbHV0ZVVybCA9IGJhc2VVcmwgPyBVUkwucGFyc2UodXJsLCBiYXNlVXJsKSA6IFVSTC5wYXJzZSh1cmwpOwogIHJldHVybiBfaXNWYWxpZFByb3RvY29sKGFic29sdXRlVXJsKSA/IGFic29sdXRlVXJsIDogbnVsbDsKfQpmdW5jdGlvbiBzaGFkb3cob2JqLCBwcm9wLCB2YWx1ZSwgbm9uU2VyaWFsaXphYmxlID0gZmFsc2UpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7CiAgICB2YWx1ZSwKICAgIGVudW1lcmFibGU6ICFub25TZXJpYWxpemFibGUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICB3cml0YWJsZTogZmFsc2UKICB9KTsKICByZXR1cm4gdmFsdWU7Cn0KY29uc3QgQmFzZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCkgewogIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSwgbmFtZSkgewogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgfQogIEJhc2VFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7CiAgQmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciA9IEJhc2VFeGNlcHRpb247CiAgcmV0dXJuIEJhc2VFeGNlcHRpb247Cn0oKTsKY2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2csIGNvZGUpIHsKICAgIHN1cGVyKG1zZywgIlBhc3N3b3JkRXhjZXB0aW9uIik7CiAgICB0aGlzLmNvZGUgPSBjb2RlOwogIH0KfQpjbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2csIGRldGFpbHMpIHsKICAgIHN1cGVyKG1zZywgIlVua25vd25FcnJvckV4Y2VwdGlvbiIpOwogICAgdGhpcy5kZXRhaWxzID0gZGV0YWlsczsKICB9Cn0KY2xhc3MgSW52YWxpZFBERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiSW52YWxpZFBERkV4Y2VwdGlvbiIpOwogIH0KfQpjbGFzcyBSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZywgc3RhdHVzLCBtaXNzaW5nKSB7CiAgICBzdXBlcihtc2csICJSZXNwb25zZUV4Y2VwdGlvbiIpOwogICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgICB0aGlzLm1pc3NpbmcgPSBtaXNzaW5nOwogIH0KfQpjbGFzcyBGb3JtYXRFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiRm9ybWF0RXJyb3IiKTsKICB9Cn0KY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIkFib3J0RXhjZXB0aW9uIik7CiAgfQp9CmZ1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoYnl0ZXMpIHsKICBpZiAodHlwZW9mIGJ5dGVzICE9PSAib2JqZWN0IiB8fCBieXRlcz8ubGVuZ3RoID09PSB1bmRlZmluZWQpIHsKICAgIHVucmVhY2hhYmxlKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7CiAgfQogIGNvbnN0IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKICBjb25zdCBNQVhfQVJHVU1FTlRfQ09VTlQgPSA4MTkyOwogIGlmIChsZW5ndGggPCBNQVhfQVJHVU1FTlRfQ09VTlQpIHsKICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGJ5dGVzKTsKICB9CiAgY29uc3Qgc3RyQnVmID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gTUFYX0FSR1VNRU5UX0NPVU5UKSB7CiAgICBjb25zdCBjaHVua0VuZCA9IE1hdGgubWluKGkgKyBNQVhfQVJHVU1FTlRfQ09VTlQsIGxlbmd0aCk7CiAgICBjb25zdCBjaHVuayA9IGJ5dGVzLnN1YmFycmF5KGksIGNodW5rRW5kKTsKICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICB9CiAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKfQpmdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikgewogIGlmICh0eXBlb2Ygc3RyICE9PSAic3RyaW5nIikgewogICAgdW5yZWFjaGFibGUoIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXMiKTsKICB9CiAgY29uc3QgbGVuZ3RoID0gc3RyLmxlbmd0aDsKICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgYnl0ZXNbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4ZmY7CiAgfQogIHJldHVybiBieXRlczsKfQpmdW5jdGlvbiBzdHJpbmczMih2YWx1ZSkgewogIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDI0ICYgMHhmZiwgdmFsdWUgPj4gMTYgJiAweGZmLCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKfQpmdW5jdGlvbiBvYmplY3RTaXplKG9iaikgewogIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aDsKfQpmdW5jdGlvbiBvYmplY3RGcm9tTWFwKG1hcCkgewogIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbWFwKSB7CiAgICBvYmpba2V5XSA9IHZhbHVlOwogIH0KICByZXR1cm4gb2JqOwp9CmZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKCkgewogIGNvbnN0IGJ1ZmZlcjggPSBuZXcgVWludDhBcnJheSg0KTsKICBidWZmZXI4WzBdID0gMTsKICBjb25zdCB2aWV3MzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyOC5idWZmZXIsIDAsIDEpOwogIHJldHVybiB2aWV3MzJbMF0gPT09IDE7Cn0KZnVuY3Rpb24gaXNFdmFsU3VwcG9ydGVkKCkgewogIHRyeSB7CiAgICBuZXcgRnVuY3Rpb24oIiIpOwogICAgcmV0dXJuIHRydWU7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmNsYXNzIEZlYXR1cmVUZXN0IHsKICBzdGF0aWMgZ2V0IGlzTGl0dGxlRW5kaWFuKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiaXNMaXR0bGVFbmRpYW4iLCBpc0xpdHRsZUVuZGlhbigpKTsKICB9CiAgc3RhdGljIGdldCBpc0V2YWxTdXBwb3J0ZWQoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc0V2YWxTdXBwb3J0ZWQiLCBpc0V2YWxTdXBwb3J0ZWQoKSk7CiAgfQogIHN0YXRpYyBnZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCIsIHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICJ1bmRlZmluZWQiKTsKICB9CiAgc3RhdGljIGdldCBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkIiwgdHlwZW9mIEltYWdlRGVjb2RlciAhPT0gInVuZGVmaW5lZCIpOwogIH0KICBzdGF0aWMgZ2V0IHBsYXRmb3JtKCkgewogICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBuYXZpZ2F0b3I/LnBsYXRmb3JtID09PSAic3RyaW5nIiAmJiB0eXBlb2YgbmF2aWdhdG9yPy51c2VyQWdlbnQgPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBwbGF0Zm9ybSwKICAgICAgICB1c2VyQWdlbnQKICAgICAgfSA9IG5hdmlnYXRvcjsKICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGxhdGZvcm0iLCB7CiAgICAgICAgaXNBbmRyb2lkOiB1c2VyQWdlbnQuaW5jbHVkZXMoIkFuZHJvaWQiKSwKICAgICAgICBpc0xpbnV4OiBwbGF0Zm9ybS5pbmNsdWRlcygiTGludXgiKSwKICAgICAgICBpc01hYzogcGxhdGZvcm0uaW5jbHVkZXMoIk1hYyIpLAogICAgICAgIGlzV2luZG93czogcGxhdGZvcm0uaW5jbHVkZXMoIldpbiIpLAogICAgICAgIGlzRmlyZWZveDogdXNlckFnZW50LmluY2x1ZGVzKCJGaXJlZm94IikKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJwbGF0Zm9ybSIsIHsKICAgICAgaXNBbmRyb2lkOiBmYWxzZSwKICAgICAgaXNMaW51eDogZmFsc2UsCiAgICAgIGlzTWFjOiBmYWxzZSwKICAgICAgaXNXaW5kb3dzOiBmYWxzZSwKICAgICAgaXNGaXJlZm94OiBmYWxzZQogICAgfSk7CiAgfQogIHN0YXRpYyBnZXQgaXNDU1NSb3VuZFN1cHBvcnRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzQ1NTUm91bmRTdXBwb3J0ZWQiLCBnbG9iYWxUaGlzLkNTUz8uc3VwcG9ydHM/Ligid2lkdGg6IHJvdW5kKDEuNXB4LCAxcHgpIikpOwogIH0KfQpjb25zdCBoZXhOdW1iZXJzID0gQXJyYXkuZnJvbShBcnJheSgyNTYpLmtleXMoKSwgbiA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAiMCIpKTsKY2xhc3MgVXRpbCB7CiAgc3RhdGljIG1ha2VIZXhDb2xvcihyLCBnLCBiKSB7CiAgICByZXR1cm4gYCMke2hleE51bWJlcnNbcl19JHtoZXhOdW1iZXJzW2ddfSR7aGV4TnVtYmVyc1tiXX1gOwogIH0KICBzdGF0aWMgdHJhbnNmb3JtKG0xLCBtMikgewogICAgcmV0dXJuIFttMVswXSAqIG0yWzBdICsgbTFbMl0gKiBtMlsxXSwgbTFbMV0gKiBtMlswXSArIG0xWzNdICogbTJbMV0sIG0xWzBdICogbTJbMl0gKyBtMVsyXSAqIG0yWzNdLCBtMVsxXSAqIG0yWzJdICsgbTFbM10gKiBtMlszXSwgbTFbMF0gKiBtMls0XSArIG0xWzJdICogbTJbNV0gKyBtMVs0XSwgbTFbMV0gKiBtMls0XSArIG0xWzNdICogbTJbNV0gKyBtMVs1XV07CiAgfQogIHN0YXRpYyBhcHBseVRyYW5zZm9ybShwLCBtKSB7CiAgICBjb25zdCB4dCA9IHBbMF0gKiBtWzBdICsgcFsxXSAqIG1bMl0gKyBtWzRdOwogICAgY29uc3QgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTsKICAgIHJldHVybiBbeHQsIHl0XTsKICB9CiAgc3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShwLCBtKSB7CiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTsKICAgIGNvbnN0IHh0ID0gKHBbMF0gKiBtWzNdIC0gcFsxXSAqIG1bMl0gKyBtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQ7CiAgICBjb25zdCB5dCA9ICgtcFswXSAqIG1bMV0gKyBwWzFdICogbVswXSArIG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZDsKICAgIHJldHVybiBbeHQsIHl0XTsKICB9CiAgc3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHIsIG0pIHsKICAgIGNvbnN0IHAxID0gdGhpcy5hcHBseVRyYW5zZm9ybShyLCBtKTsKICAgIGNvbnN0IHAyID0gdGhpcy5hcHBseVRyYW5zZm9ybShyLnNsaWNlKDIsIDQpLCBtKTsKICAgIGNvbnN0IHAzID0gdGhpcy5hcHBseVRyYW5zZm9ybShbclswXSwgclszXV0sIG0pOwogICAgY29uc3QgcDQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7CiAgICByZXR1cm4gW01hdGgubWluKHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5taW4ocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pLCBNYXRoLm1heChwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWF4KHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKV07CiAgfQogIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKG0pIHsKICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdOwogICAgcmV0dXJuIFttWzNdIC8gZCwgLW1bMV0gLyBkLCAtbVsyXSAvIGQsIG1bMF0gLyBkLCAobVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkLCAobVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkXTsKICB9CiAgc3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG0pIHsKICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTsKICAgIGNvbnN0IGEgPSBtWzBdICogdHJhbnNwb3NlWzBdICsgbVsxXSAqIHRyYW5zcG9zZVsyXTsKICAgIGNvbnN0IGIgPSBtWzBdICogdHJhbnNwb3NlWzFdICsgbVsxXSAqIHRyYW5zcG9zZVszXTsKICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTsKICAgIGNvbnN0IGQgPSBtWzJdICogdHJhbnNwb3NlWzFdICsgbVszXSAqIHRyYW5zcG9zZVszXTsKICAgIGNvbnN0IGZpcnN0ID0gKGEgKyBkKSAvIDI7CiAgICBjb25zdCBzZWNvbmQgPSBNYXRoLnNxcnQoKGEgKyBkKSAqKiAyIC0gNCAqIChhICogZCAtIGMgKiBiKSkgLyAyOwogICAgY29uc3Qgc3ggPSBmaXJzdCArIHNlY29uZCB8fCAxOwogICAgY29uc3Qgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxOwogICAgcmV0dXJuIFtNYXRoLnNxcnQoc3gpLCBNYXRoLnNxcnQoc3kpXTsKICB9CiAgc3RhdGljIG5vcm1hbGl6ZVJlY3QocmVjdCkgewogICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7CiAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHsKICAgICAgclswXSA9IHJlY3RbMl07CiAgICAgIHJbMl0gPSByZWN0WzBdOwogICAgfQogICAgaWYgKHJlY3RbMV0gPiByZWN0WzNdKSB7CiAgICAgIHJbMV0gPSByZWN0WzNdOwogICAgICByWzNdID0gcmVjdFsxXTsKICAgIH0KICAgIHJldHVybiByOwogIH0KICBzdGF0aWMgaW50ZXJzZWN0KHJlY3QxLCByZWN0MikgewogICAgY29uc3QgeExvdyA9IE1hdGgubWF4KE1hdGgubWluKHJlY3QxWzBdLCByZWN0MVsyXSksIE1hdGgubWluKHJlY3QyWzBdLCByZWN0MlsyXSkpOwogICAgY29uc3QgeEhpZ2ggPSBNYXRoLm1pbihNYXRoLm1heChyZWN0MVswXSwgcmVjdDFbMl0pLCBNYXRoLm1heChyZWN0MlswXSwgcmVjdDJbMl0pKTsKICAgIGlmICh4TG93ID4geEhpZ2gpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB5TG93ID0gTWF0aC5tYXgoTWF0aC5taW4ocmVjdDFbMV0sIHJlY3QxWzNdKSwgTWF0aC5taW4ocmVjdDJbMV0sIHJlY3QyWzNdKSk7CiAgICBjb25zdCB5SGlnaCA9IE1hdGgubWluKE1hdGgubWF4KHJlY3QxWzFdLCByZWN0MVszXSksIE1hdGgubWF4KHJlY3QyWzFdLCByZWN0MlszXSkpOwogICAgaWYgKHlMb3cgPiB5SGlnaCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBbeExvdywgeUxvdywgeEhpZ2gsIHlIaWdoXTsKICB9CiAgc3RhdGljIHBvaW50Qm91bmRpbmdCb3goeCwgeSwgbWluTWF4KSB7CiAgICBtaW5NYXhbMF0gPSBNYXRoLm1pbihtaW5NYXhbMF0sIHgpOwogICAgbWluTWF4WzFdID0gTWF0aC5taW4obWluTWF4WzFdLCB5KTsKICAgIG1pbk1heFsyXSA9IE1hdGgubWF4KG1pbk1heFsyXSwgeCk7CiAgICBtaW5NYXhbM10gPSBNYXRoLm1heChtaW5NYXhbM10sIHkpOwogIH0KICBzdGF0aWMgcmVjdEJvdW5kaW5nQm94KHgwLCB5MCwgeDEsIHkxLCBtaW5NYXgpIHsKICAgIG1pbk1heFswXSA9IE1hdGgubWluKG1pbk1heFswXSwgeDAsIHgxKTsKICAgIG1pbk1heFsxXSA9IE1hdGgubWluKG1pbk1heFsxXSwgeTAsIHkxKTsKICAgIG1pbk1heFsyXSA9IE1hdGgubWF4KG1pbk1heFsyXSwgeDAsIHgxKTsKICAgIG1pbk1heFszXSA9IE1hdGgubWF4KG1pbk1heFszXSwgeTAsIHkxKTsKICB9CiAgc3RhdGljICNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCB0LCBtaW5NYXgpIHsKICAgIGlmICh0IDw9IDAgfHwgdCA+PSAxKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG10ID0gMSAtIHQ7CiAgICBjb25zdCB0dCA9IHQgKiB0OwogICAgY29uc3QgdHR0ID0gdHQgKiB0OwogICAgY29uc3QgeCA9IG10ICogKG10ICogKG10ICogeDAgKyAzICogdCAqIHgxKSArIDMgKiB0dCAqIHgyKSArIHR0dCAqIHgzOwogICAgY29uc3QgeSA9IG10ICogKG10ICogKG10ICogeTAgKyAzICogdCAqIHkxKSArIDMgKiB0dCAqIHkyKSArIHR0dCAqIHkzOwogICAgbWluTWF4WzBdID0gTWF0aC5taW4obWluTWF4WzBdLCB4KTsKICAgIG1pbk1heFsxXSA9IE1hdGgubWluKG1pbk1heFsxXSwgeSk7CiAgICBtaW5NYXhbMl0gPSBNYXRoLm1heChtaW5NYXhbMl0sIHgpOwogICAgbWluTWF4WzNdID0gTWF0aC5tYXgobWluTWF4WzNdLCB5KTsKICB9CiAgc3RhdGljICNnZXRFeHRyZW11bSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIGEsIGIsIGMsIG1pbk1heCkgewogICAgaWYgKE1hdGguYWJzKGEpIDwgMWUtMTIpIHsKICAgICAgaWYgKE1hdGguYWJzKGIpID49IDFlLTEyKSB7CiAgICAgICAgdGhpcy4jZ2V0RXh0cmVtdW1PbkN1cnZlKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgLWMgLyBiLCBtaW5NYXgpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGRlbHRhID0gYiAqKiAyIC0gNCAqIGMgKiBhOwogICAgaWYgKGRlbHRhIDwgMCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzcXJ0RGVsdGEgPSBNYXRoLnNxcnQoZGVsdGEpOwogICAgY29uc3QgYTIgPSAyICogYTsKICAgIHRoaXMuI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsICgtYiArIHNxcnREZWx0YSkgLyBhMiwgbWluTWF4KTsKICAgIHRoaXMuI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsICgtYiAtIHNxcnREZWx0YSkgLyBhMiwgbWluTWF4KTsKICB9CiAgc3RhdGljIGJlemllckJvdW5kaW5nQm94KHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgbWluTWF4KSB7CiAgICBtaW5NYXhbMF0gPSBNYXRoLm1pbihtaW5NYXhbMF0sIHgwLCB4Myk7CiAgICBtaW5NYXhbMV0gPSBNYXRoLm1pbihtaW5NYXhbMV0sIHkwLCB5Myk7CiAgICBtaW5NYXhbMl0gPSBNYXRoLm1heChtaW5NYXhbMl0sIHgwLCB4Myk7CiAgICBtaW5NYXhbM10gPSBNYXRoLm1heChtaW5NYXhbM10sIHkwLCB5Myk7CiAgICB0aGlzLiNnZXRFeHRyZW11bSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIDMgKiAoLXgwICsgMyAqICh4MSAtIHgyKSArIHgzKSwgNiAqICh4MCAtIDIgKiB4MSArIHgyKSwgMyAqICh4MSAtIHgwKSwgbWluTWF4KTsKICAgIHRoaXMuI2dldEV4dHJlbXVtKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgMyAqICgteTAgKyAzICogKHkxIC0geTIpICsgeTMpLCA2ICogKHkwIC0gMiAqIHkxICsgeTIpLCAzICogKHkxIC0geTApLCBtaW5NYXgpOwogIH0KfQpjb25zdCBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZSA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDJkOCwgMHgyYzcsIDB4MmM2LCAweDJkOSwgMHgyZGQsIDB4MmRiLCAweDJkYSwgMHgyZGMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LCAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNhLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFlLCAweDIwMWMsIDB4MjAxZCwgMHgyMDE4LCAweDIwMTksIDB4MjAxYSwgMHgyMTIyLCAweGZiMDEsIDB4ZmIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCwgMHgxNzgsIDB4MTdkLCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN2UsIDAsIDB4MjBhY107CmZ1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHN0cikgewogIGlmIChzdHJbMF0gPj0gIlx4RUYiKSB7CiAgICBsZXQgZW5jb2Rpbmc7CiAgICBpZiAoc3RyWzBdID09PSAiXHhGRSIgJiYgc3RyWzFdID09PSAiXHhGRiIpIHsKICAgICAgZW5jb2RpbmcgPSAidXRmLTE2YmUiOwogICAgICBpZiAoc3RyLmxlbmd0aCAlIDIgPT09IDEpIHsKICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgLTEpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHN0clswXSA9PT0gIlx4RkYiICYmIHN0clsxXSA9PT0gIlx4RkUiKSB7CiAgICAgIGVuY29kaW5nID0gInV0Zi0xNmxlIjsKICAgICAgaWYgKHN0ci5sZW5ndGggJSAyID09PSAxKSB7CiAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJbMF0gPT09ICJceEVGIiAmJiBzdHJbMV0gPT09ICJceEJCIiAmJiBzdHJbMl0gPT09ICJceEJGIikgewogICAgICBlbmNvZGluZyA9ICJ1dGYtOCI7CiAgICB9CiAgICBpZiAoZW5jb2RpbmcpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nLCB7CiAgICAgICAgICBmYXRhbDogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmluZ1RvQnl0ZXMoc3RyKTsKICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKTsKICAgICAgICBpZiAoIWRlY29kZWQuaW5jbHVkZXMoIlx4MWIiKSkgewogICAgICAgICAgcmV0dXJuIGRlY29kZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZWNvZGVkLnJlcGxhY2VBbGwoL1x4MWJbXlx4MWJdKig/Olx4MWJ8JCkvZywgIiIpOwogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIHdhcm4oYHN0cmluZ1RvUERGU3RyaW5nOiAiJHtleH0iLmApOwogICAgICB9CiAgICB9CiAgfQogIGNvbnN0IHN0ckJ1ZiA9IFtdOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgaWYgKGNoYXJDb2RlID09PSAweDFiKSB7CiAgICAgIHdoaWxlICgrK2kgPCBpaSAmJiBzdHIuY2hhckNvZGVBdChpKSAhPT0gMHgxYikge30KICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25zdCBjb2RlID0gUERGU3RyaW5nVHJhbnNsYXRlVGFibGVbY2hhckNvZGVdOwogICAgc3RyQnVmLnB1c2goY29kZSA/IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkgOiBzdHIuY2hhckF0KGkpKTsKICB9CiAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKfQpmdW5jdGlvbiBzdHJpbmdUb1VURjhTdHJpbmcoc3RyKSB7CiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3RyKSk7Cn0KZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKHN0cikgewogIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7Cn0KZnVuY3Rpb24gaXNBcnJheUVxdWFsKGFycjEsIGFycjIpIHsKICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZvciAobGV0IGkgPSAwLCBpaSA9IGFycjEubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgaWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGRhdGUgPSBuZXcgRGF0ZSgpKSB7CiAgY29uc3QgYnVmZmVyID0gW2RhdGUuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLCAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCBkYXRlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpXTsKICByZXR1cm4gYnVmZmVyLmpvaW4oIiIpOwp9CmxldCBOb3JtYWxpemVSZWdleCA9IG51bGw7CmxldCBOb3JtYWxpemF0aW9uTWFwID0gbnVsbDsKZnVuY3Rpb24gbm9ybWFsaXplVW5pY29kZShzdHIpIHsKICBpZiAoIU5vcm1hbGl6ZVJlZ2V4KSB7CiAgICBOb3JtYWxpemVSZWdleCA9IC8oW1x1MDBhMFx1MDBiNVx1MDM3ZVx1MGViM1x1MjAwMC1cdTIwMGFcdTIwMmZcdTIxMjZcdWZiMDAtXHVmYjA0XHVmYjA2XHVmYjIwLVx1ZmIzNlx1ZmIzOC1cdWZiM2NcdWZiM2VcdWZiNDAtXHVmYjQxXHVmYjQzLVx1ZmI0NFx1ZmI0Ni1cdWZiYTFcdWZiYTQtXHVmYmE5XHVmYmFlLVx1ZmJiMVx1ZmJkMy1cdWZiZGNcdWZiZGUtXHVmYmU3XHVmYmVhLVx1ZmJmOFx1ZmJmYy1cdWZiZmRcdWZjMDAtXHVmYzVkXHVmYzY0LVx1ZmNmMVx1ZmNmNS1cdWZkM2RcdWZkODhcdWZkZjRcdWZkZmEtXHVmZGZiXHVmZTcxXHVmZTc3XHVmZTc5XHVmZTdiXHVmZTdkXSspfChcdWZiMDUrKS9ndTsKICAgIE5vcm1hbGl6YXRpb25NYXAgPSBuZXcgTWFwKFtbIu+shSIsICLFv3QiXV0pOwogIH0KICByZXR1cm4gc3RyLnJlcGxhY2VBbGwoTm9ybWFsaXplUmVnZXgsIChfLCBwMSwgcDIpID0+IHAxID8gcDEubm9ybWFsaXplKCJORktDIikgOiBOb3JtYWxpemF0aW9uTWFwLmdldChwMikpOwp9CmZ1bmN0aW9uIGdldFV1aWQoKSB7CiAgaWYgKHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gImZ1bmN0aW9uIikgewogICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7CiAgfQogIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KDMyKTsKICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ1Zik7CiAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoYnVmKTsKfQpjb25zdCBBbm5vdGF0aW9uUHJlZml4ID0gInBkZmpzX2ludGVybmFsX2lkXyI7CmZ1bmN0aW9uIF9pc1ZhbGlkRXhwbGljaXREZXN0KHZhbGlkUmVmLCB2YWxpZE5hbWUsIGRlc3QpIHsKICBpZiAoIUFycmF5LmlzQXJyYXkoZGVzdCkgfHwgZGVzdC5sZW5ndGggPCAyKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IFtwYWdlLCB6b29tLCAuLi5hcmdzXSA9IGRlc3Q7CiAgaWYgKCF2YWxpZFJlZihwYWdlKSAmJiAhTnVtYmVyLmlzSW50ZWdlcihwYWdlKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoIXZhbGlkTmFtZSh6b29tKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBhcmdzTGVuID0gYXJncy5sZW5ndGg7CiAgbGV0IGFsbG93TnVsbCA9IHRydWU7CiAgc3dpdGNoICh6b29tLm5hbWUpIHsKICAgIGNhc2UgIlhZWiI6CiAgICAgIGlmIChhcmdzTGVuIDwgMiB8fCBhcmdzTGVuID4gMykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgIkZpdCI6CiAgICBjYXNlICJGaXRCIjoKICAgICAgcmV0dXJuIGFyZ3NMZW4gPT09IDA7CiAgICBjYXNlICJGaXRIIjoKICAgIGNhc2UgIkZpdEJIIjoKICAgIGNhc2UgIkZpdFYiOgogICAgY2FzZSAiRml0QlYiOgogICAgICBpZiAoYXJnc0xlbiA+IDEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICJGaXRSIjoKICAgICAgaWYgKGFyZ3NMZW4gIT09IDQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgYWxsb3dOdWxsID0gZmFsc2U7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogIH0KICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7CiAgICBpZiAodHlwZW9mIGFyZyA9PT0gIm51bWJlciIgfHwgYWxsb3dOdWxsICYmIGFyZyA9PT0gbnVsbCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gTWF0aENsYW1wKHYsIG1pbiwgbWF4KSB7CiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHYsIG1pbiksIG1heCk7Cn0KZnVuY3Rpb24gdG9IZXhVdGlsKGFycikgewogIGlmIChVaW50OEFycmF5LnByb3RvdHlwZS50b0hleCkgewogICAgcmV0dXJuIGFyci50b0hleCgpOwogIH0KICByZXR1cm4gQXJyYXkuZnJvbShhcnIsIG51bSA9PiBoZXhOdW1iZXJzW251bV0pLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHRvQmFzZTY0VXRpbChhcnIpIHsKICBpZiAoVWludDhBcnJheS5wcm90b3R5cGUudG9CYXNlNjQpIHsKICAgIHJldHVybiBhcnIudG9CYXNlNjQoKTsKICB9CiAgcmV0dXJuIGJ0b2EoYnl0ZXNUb1N0cmluZyhhcnIpKTsKfQpmdW5jdGlvbiBmcm9tQmFzZTY0VXRpbChzdHIpIHsKICBpZiAoVWludDhBcnJheS5mcm9tQmFzZTY0KSB7CiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tQmFzZTY0KHN0cik7CiAgfQogIHJldHVybiBzdHJpbmdUb0J5dGVzKGF0b2Ioc3RyKSk7Cn0KaWYgKHR5cGVvZiBQcm9taXNlLnRyeSAhPT0gImZ1bmN0aW9uIikgewogIFByb21pc2UudHJ5ID0gZnVuY3Rpb24gKGZuLCAuLi5hcmdzKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7CiAgICAgIHJlc29sdmUoZm4oLi4uYXJncykpOwogICAgfSk7CiAgfTsKfQppZiAodHlwZW9mIE1hdGguc3VtUHJlY2lzZSAhPT0gImZ1bmN0aW9uIikgewogIE1hdGguc3VtUHJlY2lzZSA9IGZ1bmN0aW9uIChudW1iZXJzKSB7CiAgICByZXR1cm4gbnVtYmVycy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTsKICB9Owp9Cgo7Ly8gLi9zcmMvY29yZS9wcmltaXRpdmVzLmpzCgpjb25zdCBDSVJDVUxBUl9SRUYgPSBTeW1ib2woIkNJUkNVTEFSX1JFRiIpOwpjb25zdCBFT0YgPSBTeW1ib2woIkVPRiIpOwpsZXQgQ21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpsZXQgTmFtZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKbGV0IFJlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKZnVuY3Rpb24gY2xlYXJQcmltaXRpdmVDYWNoZXMoKSB7CiAgQ21kQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIE5hbWVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgUmVmQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwp9CmNsYXNzIE5hbWUgewogIGNvbnN0cnVjdG9yKG5hbWUpIHsKICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgfQogIHN0YXRpYyBnZXQobmFtZSkgewogICAgcmV0dXJuIE5hbWVDYWNoZVtuYW1lXSB8fD0gbmV3IE5hbWUobmFtZSk7CiAgfQp9CmNsYXNzIENtZCB7CiAgY29uc3RydWN0b3IoY21kKSB7CiAgICB0aGlzLmNtZCA9IGNtZDsKICB9CiAgc3RhdGljIGdldChjbWQpIHsKICAgIHJldHVybiBDbWRDYWNoZVtjbWRdIHx8PSBuZXcgQ21kKGNtZCk7CiAgfQp9CmNvbnN0IG5vblNlcmlhbGl6YWJsZSA9IGZ1bmN0aW9uIG5vblNlcmlhbGl6YWJsZUNsb3N1cmUoKSB7CiAgcmV0dXJuIG5vblNlcmlhbGl6YWJsZTsKfTsKY2xhc3MgRGljdCB7CiAgY29uc3RydWN0b3IoeHJlZiA9IG51bGwpIHsKICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLm9iaklkID0gbnVsbDsKICAgIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2U7CiAgICB0aGlzLl9fbm9uU2VyaWFsaXphYmxlX18gPSBub25TZXJpYWxpemFibGU7CiAgfQogIGFzc2lnblhyZWYobmV3WHJlZikgewogICAgdGhpcy54cmVmID0gbmV3WHJlZjsKICB9CiAgZ2V0IHNpemUoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLnNpemU7CiAgfQogIGdldChrZXkxLCBrZXkyLCBrZXkzKSB7CiAgICBsZXQgdmFsdWUgPSB0aGlzLl9tYXAuZ2V0KGtleTEpOwogICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkyKTsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXAuZ2V0KGtleTMpOwogICAgICB9CiAgICB9CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWYgJiYgdGhpcy54cmVmKSB7CiAgICAgIHJldHVybiB0aGlzLnhyZWYuZmV0Y2godmFsdWUsIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CiAgYXN5bmMgZ2V0QXN5bmMoa2V5MSwga2V5Miwga2V5MykgewogICAgbGV0IHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkxKTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTIgIT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuX21hcC5nZXQoa2V5Mik7CiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkzKTsKICAgICAgfQogICAgfQogICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIHRoaXMueHJlZikgewogICAgICByZXR1cm4gdGhpcy54cmVmLmZldGNoQXN5bmModmFsdWUsIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CiAgZ2V0QXJyYXkoa2V5MSwga2V5Miwga2V5MykgewogICAgbGV0IHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkxKTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTIgIT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuX21hcC5nZXQoa2V5Mik7CiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkzKTsKICAgICAgfQogICAgfQogICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIHRoaXMueHJlZikgewogICAgICB2YWx1ZSA9IHRoaXMueHJlZi5mZXRjaCh2YWx1ZSwgdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfQogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoKTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGlmICh2YWx1ZVtpXSBpbnN0YW5jZW9mIFJlZiAmJiB0aGlzLnhyZWYpIHsKICAgICAgICAgIHZhbHVlW2ldID0gdGhpcy54cmVmLmZldGNoKHZhbHVlW2ldLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQogIGdldFJhdyhrZXkpIHsKICAgIHJldHVybiB0aGlzLl9tYXAuZ2V0KGtleSk7CiAgfQogIGdldEtleXMoKSB7CiAgICByZXR1cm4gWy4uLnRoaXMuX21hcC5rZXlzKCldOwogIH0KICBnZXRSYXdWYWx1ZXMoKSB7CiAgICByZXR1cm4gWy4uLnRoaXMuX21hcC52YWx1ZXMoKV07CiAgfQogIHNldChrZXksIHZhbHVlKSB7CiAgICB0aGlzLl9tYXAuc2V0KGtleSwgdmFsdWUpOwogIH0KICBoYXMoa2V5KSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyhrZXkpOwogIH0KICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9tYXApIHsKICAgICAgeWllbGQgW2tleSwgdmFsdWUgaW5zdGFuY2VvZiBSZWYgJiYgdGhpcy54cmVmID8gdGhpcy54cmVmLmZldGNoKHZhbHVlLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbikgOiB2YWx1ZV07CiAgICB9CiAgfQogIHN0YXRpYyBnZXQgZW1wdHkoKSB7CiAgICBjb25zdCBlbXB0eURpY3QgPSBuZXcgRGljdChudWxsKTsKICAgIGVtcHR5RGljdC5zZXQgPSAoa2V5LCB2YWx1ZSkgPT4gewogICAgICB1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIGBzZXRgIG9uIHRoZSBlbXB0eSBkaWN0aW9uYXJ5LiIpOwogICAgfTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImVtcHR5IiwgZW1wdHlEaWN0KTsKICB9CiAgc3RhdGljIG1lcmdlKHsKICAgIHhyZWYsCiAgICBkaWN0QXJyYXksCiAgICBtZXJnZVN1YkRpY3RzID0gZmFsc2UKICB9KSB7CiAgICBjb25zdCBtZXJnZWREaWN0ID0gbmV3IERpY3QoeHJlZiksCiAgICAgIHByb3BlcnRpZXMgPSBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IGRpY3Qgb2YgZGljdEFycmF5KSB7CiAgICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGRpY3QuX21hcCkgewogICAgICAgIGxldCBwcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0KGtleSk7CiAgICAgICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHByb3BlcnR5ID0gW107CiAgICAgICAgICBwcm9wZXJ0aWVzLnNldChrZXksIHByb3BlcnR5KTsKICAgICAgICB9IGVsc2UgaWYgKCFtZXJnZVN1YkRpY3RzIHx8ICEodmFsdWUgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHByb3BlcnR5LnB1c2godmFsdWUpOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZXNdIG9mIHByb3BlcnRpZXMpIHsKICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDEgfHwgISh2YWx1ZXNbMF0gaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIG1lcmdlZERpY3QuX21hcC5zZXQobmFtZSwgdmFsdWVzWzBdKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBzdWJEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGZvciAoY29uc3QgZGljdCBvZiB2YWx1ZXMpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkaWN0Ll9tYXApIHsKICAgICAgICAgIGlmICghc3ViRGljdC5fbWFwLmhhcyhrZXkpKSB7CiAgICAgICAgICAgIHN1YkRpY3QuX21hcC5zZXQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdWJEaWN0LnNpemUgPiAwKSB7CiAgICAgICAgbWVyZ2VkRGljdC5fbWFwLnNldChuYW1lLCBzdWJEaWN0KTsKICAgICAgfQogICAgfQogICAgcHJvcGVydGllcy5jbGVhcigpOwogICAgcmV0dXJuIG1lcmdlZERpY3Quc2l6ZSA+IDAgPyBtZXJnZWREaWN0IDogRGljdC5lbXB0eTsKICB9CiAgY2xvbmUoKSB7CiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuZ2V0S2V5cygpKSB7CiAgICAgIGRpY3Quc2V0KGtleSwgdGhpcy5nZXRSYXcoa2V5KSk7CiAgICB9CiAgICByZXR1cm4gZGljdDsKICB9CiAgZGVsZXRlKGtleSkgewogICAgZGVsZXRlIHRoaXMuX21hcFtrZXldOwogIH0KfQpjbGFzcyBSZWYgewogIGNvbnN0cnVjdG9yKG51bSwgZ2VuKSB7CiAgICB0aGlzLm51bSA9IG51bTsKICAgIHRoaXMuZ2VuID0gZ2VuOwogIH0KICB0b1N0cmluZygpIHsKICAgIGlmICh0aGlzLmdlbiA9PT0gMCkgewogICAgICByZXR1cm4gYCR7dGhpcy5udW19UmA7CiAgICB9CiAgICByZXR1cm4gYCR7dGhpcy5udW19UiR7dGhpcy5nZW59YDsKICB9CiAgc3RhdGljIGZyb21TdHJpbmcoc3RyKSB7CiAgICBjb25zdCByZWYgPSBSZWZDYWNoZVtzdHJdOwogICAgaWYgKHJlZikgewogICAgICByZXR1cm4gcmVmOwogICAgfQogICAgY29uc3QgbSA9IC9eKFxkKylSKFxkKikkLy5leGVjKHN0cik7CiAgICBpZiAoIW0gfHwgbVsxXSA9PT0gIjAiKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIFJlZkNhY2hlW3N0cl0gPSBuZXcgUmVmKHBhcnNlSW50KG1bMV0pLCAhbVsyXSA/IDAgOiBwYXJzZUludChtWzJdKSk7CiAgfQogIHN0YXRpYyBnZXQobnVtLCBnZW4pIHsKICAgIGNvbnN0IGtleSA9IGdlbiA9PT0gMCA/IGAke251bX1SYCA6IGAke251bX1SJHtnZW59YDsKICAgIHJldHVybiBSZWZDYWNoZVtrZXldIHx8PSBuZXcgUmVmKG51bSwgZ2VuKTsKICB9Cn0KY2xhc3MgUmVmU2V0IHsKICBjb25zdHJ1Y3RvcihwYXJlbnQgPSBudWxsKSB7CiAgICB0aGlzLl9zZXQgPSBuZXcgU2V0KHBhcmVudD8uX3NldCk7CiAgfQogIGhhcyhyZWYpIHsKICAgIHJldHVybiB0aGlzLl9zZXQuaGFzKHJlZi50b1N0cmluZygpKTsKICB9CiAgcHV0KHJlZikgewogICAgdGhpcy5fc2V0LmFkZChyZWYudG9TdHJpbmcoKSk7CiAgfQogIHJlbW92ZShyZWYpIHsKICAgIHRoaXMuX3NldC5kZWxldGUocmVmLnRvU3RyaW5nKCkpOwogIH0KICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgIHJldHVybiB0aGlzLl9zZXQudmFsdWVzKCk7CiAgfQogIGNsZWFyKCkgewogICAgdGhpcy5fc2V0LmNsZWFyKCk7CiAgfQp9CmNsYXNzIFJlZlNldENhY2hlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKICB9CiAgZ2V0IHNpemUoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLnNpemU7CiAgfQogIGdldChyZWYpIHsKICAgIHJldHVybiB0aGlzLl9tYXAuZ2V0KHJlZi50b1N0cmluZygpKTsKICB9CiAgaGFzKHJlZikgewogICAgcmV0dXJuIHRoaXMuX21hcC5oYXMocmVmLnRvU3RyaW5nKCkpOwogIH0KICBwdXQocmVmLCBvYmopIHsKICAgIHRoaXMuX21hcC5zZXQocmVmLnRvU3RyaW5nKCksIG9iaik7CiAgfQogIHB1dEFsaWFzKHJlZiwgYWxpYXNSZWYpIHsKICAgIHRoaXMuX21hcC5zZXQocmVmLnRvU3RyaW5nKCksIHRoaXMuZ2V0KGFsaWFzUmVmKSk7CiAgfQogIFtTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgcmV0dXJuIHRoaXMuX21hcC52YWx1ZXMoKTsKICB9CiAgY2xlYXIoKSB7CiAgICB0aGlzLl9tYXAuY2xlYXIoKTsKICB9CiAgKnZhbHVlcygpIHsKICAgIHlpZWxkKiB0aGlzLl9tYXAudmFsdWVzKCk7CiAgfQogICppdGVtcygpIHsKICAgIGZvciAoY29uc3QgW3JlZiwgdmFsdWVdIG9mIHRoaXMuX21hcCkgewogICAgICB5aWVsZCBbUmVmLmZyb21TdHJpbmcocmVmKSwgdmFsdWVdOwogICAgfQogIH0KfQpmdW5jdGlvbiBpc05hbWUodiwgbmFtZSkgewogIHJldHVybiB2IGluc3RhbmNlb2YgTmFtZSAmJiAobmFtZSA9PT0gdW5kZWZpbmVkIHx8IHYubmFtZSA9PT0gbmFtZSk7Cn0KZnVuY3Rpb24gaXNDbWQodiwgY21kKSB7CiAgcmV0dXJuIHYgaW5zdGFuY2VvZiBDbWQgJiYgKGNtZCA9PT0gdW5kZWZpbmVkIHx8IHYuY21kID09PSBjbWQpOwp9CmZ1bmN0aW9uIGlzRGljdCh2LCB0eXBlKSB7CiAgcmV0dXJuIHYgaW5zdGFuY2VvZiBEaWN0ICYmICh0eXBlID09PSB1bmRlZmluZWQgfHwgaXNOYW1lKHYuZ2V0KCJUeXBlIiksIHR5cGUpKTsKfQpmdW5jdGlvbiBpc1JlZnNFcXVhbCh2MSwgdjIpIHsKICByZXR1cm4gdjEubnVtID09PSB2Mi5udW0gJiYgdjEuZ2VuID09PSB2Mi5nZW47Cn0KCjsvLyAuL3NyYy9jb3JlL2Jhc2Vfc3RyZWFtLmpzCgpjbGFzcyBCYXNlU3RyZWFtIHsKICBnZXQgbGVuZ3RoKCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IGdldHRlciBgbGVuZ3RoYCBhY2Nlc3NlZCIpOwogIH0KICBnZXQgaXNFbXB0eSgpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBnZXR0ZXIgYGlzRW1wdHlgIGFjY2Vzc2VkIik7CiAgfQogIGdldCBpc0RhdGFMb2FkZWQoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc0RhdGFMb2FkZWQiLCB0cnVlKTsKICB9CiAgZ2V0Qnl0ZSgpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVgIGNhbGxlZCIpOwogIH0KICBnZXRCeXRlcyhsZW5ndGgpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVzYCBjYWxsZWQiKTsKICB9CiAgYXN5bmMgZ2V0SW1hZ2VEYXRhKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMpIHsKICAgIHJldHVybiB0aGlzLmdldEJ5dGVzKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMpOwogIH0KICBhc3luYyBhc3luY0dldEJ5dGVzKCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgYXN5bmNHZXRCeXRlc2AgY2FsbGVkIik7CiAgfQogIGdldCBpc0FzeW5jKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBnZXQgaXNBc3luY0RlY29kZXIoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGdldCBjYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcigpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZ2V0VHJhbnNmZXJhYmxlSW1hZ2UoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcGVla0J5dGUoKSB7CiAgICBjb25zdCBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7CiAgICBpZiAocGVla2VkQnl0ZSAhPT0gLTEpIHsKICAgICAgdGhpcy5wb3MtLTsKICAgIH0KICAgIHJldHVybiBwZWVrZWRCeXRlOwogIH0KICBwZWVrQnl0ZXMobGVuZ3RoKSB7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoKTsKICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDsKICAgIHJldHVybiBieXRlczsKICB9CiAgZ2V0VWludDE2KCkgewogICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTsKICAgIGNvbnN0IGIxID0gdGhpcy5nZXRCeXRlKCk7CiAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7CiAgfQogIGdldEludDMyKCkgewogICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTsKICAgIGNvbnN0IGIxID0gdGhpcy5nZXRCeXRlKCk7CiAgICBjb25zdCBiMiA9IHRoaXMuZ2V0Qnl0ZSgpOwogICAgY29uc3QgYjMgPSB0aGlzLmdldEJ5dGUoKTsKICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzOwogIH0KICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0Qnl0ZVJhbmdlYCBjYWxsZWQiKTsKICB9CiAgZ2V0U3RyaW5nKGxlbmd0aCkgewogICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcodGhpcy5nZXRCeXRlcyhsZW5ndGgpKTsKICB9CiAgc2tpcChuKSB7CiAgICB0aGlzLnBvcyArPSBuIHx8IDE7CiAgfQogIHJlc2V0KCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgcmVzZXRgIGNhbGxlZCIpOwogIH0KICBtb3ZlU3RhcnQoKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBtb3ZlU3RhcnRgIGNhbGxlZCIpOwogIH0KICBtYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QgPSBudWxsKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBtYWtlU3ViU3RyZWFtYCBjYWxsZWQiKTsKICB9CiAgZ2V0QmFzZVN0cmVhbXMoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NvcmVfdXRpbHMuanMKCgoKY29uc3QgUERGX1ZFUlNJT05fUkVHRVhQID0gL15bMS05XVwuXGQkLzsKY29uc3QgTUFYX0lOVF8zMiA9IDIgKiogMzEgLSAxOwpjb25zdCBNSU5fSU5UXzMyID0gLSgyICoqIDMxKTsKZnVuY3Rpb24gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGluaXRpYWxpemVyKSB7CiAgbGV0IGxvb2t1cDsKICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgaWYgKGluaXRpYWxpemVyKSB7CiAgICAgIGxvb2t1cCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGluaXRpYWxpemVyKGxvb2t1cCk7CiAgICAgIGluaXRpYWxpemVyID0gbnVsbDsKICAgIH0KICAgIHJldHVybiBsb29rdXA7CiAgfTsKfQpjbGFzcyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKGJlZ2luLCBlbmQpIHsKICAgIHN1cGVyKGBNaXNzaW5nIGRhdGEgWyR7YmVnaW59LCAke2VuZH0pYCwgIk1pc3NpbmdEYXRhRXhjZXB0aW9uIik7CiAgICB0aGlzLmJlZ2luID0gYmVnaW47CiAgICB0aGlzLmVuZCA9IGVuZDsKICB9Cn0KY2xhc3MgUGFyc2VyRU9GRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJQYXJzZXJFT0ZFeGNlcHRpb24iKTsKICB9Cn0KY2xhc3MgWFJlZkVudHJ5RXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJYUmVmRW50cnlFeGNlcHRpb24iKTsKICB9Cn0KY2xhc3MgWFJlZlBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJYUmVmUGFyc2VFeGNlcHRpb24iKTsKICB9Cn0KZnVuY3Rpb24gYXJyYXlCdWZmZXJzVG9CeXRlcyhhcnIpIHsKICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoOwogIGlmIChsZW5ndGggPT09IDApIHsKICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKICB9CiAgaWYgKGxlbmd0aCA9PT0gMSkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGFyclswXSk7CiAgfQogIGxldCBkYXRhTGVuZ3RoID0gMDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBkYXRhTGVuZ3RoICs9IGFycltpXS5ieXRlTGVuZ3RoOwogIH0KICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YUxlbmd0aCk7CiAgbGV0IHBvcyA9IDA7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgY29uc3QgaXRlbSA9IG5ldyBVaW50OEFycmF5KGFycltpXSk7CiAgICBkYXRhLnNldChpdGVtLCBwb3MpOwogICAgcG9zICs9IGl0ZW0uYnl0ZUxlbmd0aDsKICB9CiAgcmV0dXJuIGRhdGE7Cn0KYXN5bmMgZnVuY3Rpb24gZmV0Y2hCaW5hcnlEYXRhKHVybCkgewogIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTsKICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBmaWxlICIke3VybH0iIHdpdGggIiR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0iLmApOwogIH0KICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7Cn0KZnVuY3Rpb24gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgZGljdCwKICBrZXksCiAgZ2V0QXJyYXkgPSBmYWxzZSwKICBzdG9wV2hlbkZvdW5kID0gdHJ1ZQp9KSB7CiAgbGV0IHZhbHVlczsKICBjb25zdCB2aXNpdGVkID0gbmV3IFJlZlNldCgpOwogIHdoaWxlIChkaWN0IGluc3RhbmNlb2YgRGljdCAmJiAhKGRpY3Qub2JqSWQgJiYgdmlzaXRlZC5oYXMoZGljdC5vYmpJZCkpKSB7CiAgICBpZiAoZGljdC5vYmpJZCkgewogICAgICB2aXNpdGVkLnB1dChkaWN0Lm9iaklkKTsKICAgIH0KICAgIGNvbnN0IHZhbHVlID0gZ2V0QXJyYXkgPyBkaWN0LmdldEFycmF5KGtleSkgOiBkaWN0LmdldChrZXkpOwogICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKHN0b3BXaGVuRm91bmQpIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KICAgICAgKHZhbHVlcyB8fD0gW10pLnB1c2godmFsdWUpOwogICAgfQogICAgZGljdCA9IGRpY3QuZ2V0KCJQYXJlbnQiKTsKICB9CiAgcmV0dXJuIHZhbHVlczsKfQpmdW5jdGlvbiBnZXRQYXJlbnRUb1VwZGF0ZShkaWN0LCByZWYsIHhyZWYpIHsKICBjb25zdCB2aXNpdGVkID0gbmV3IFJlZlNldCgpOwogIGNvbnN0IGZpcnN0RGljdCA9IGRpY3Q7CiAgY29uc3QgcmVzdWx0ID0gewogICAgZGljdDogbnVsbCwKICAgIHJlZjogbnVsbAogIH07CiAgd2hpbGUgKGRpY3QgaW5zdGFuY2VvZiBEaWN0ICYmICF2aXNpdGVkLmhhcyhyZWYpKSB7CiAgICB2aXNpdGVkLnB1dChyZWYpOwogICAgaWYgKGRpY3QuaGFzKCJUIikpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICByZWYgPSBkaWN0LmdldFJhdygiUGFyZW50Iik7CiAgICBpZiAoIShyZWYgaW5zdGFuY2VvZiBSZWYpKSB7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBkaWN0ID0geHJlZi5mZXRjaChyZWYpOwogIH0KICBpZiAoZGljdCBpbnN0YW5jZW9mIERpY3QgJiYgZGljdCAhPT0gZmlyc3REaWN0KSB7CiAgICByZXN1bHQuZGljdCA9IGRpY3Q7CiAgICByZXN1bHQucmVmID0gcmVmOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmNvbnN0IFJPTUFOX05VTUJFUl9NQVAgPSBbIiIsICJDIiwgIkNDIiwgIkNDQyIsICJDRCIsICJEIiwgIkRDIiwgIkRDQyIsICJEQ0NDIiwgIkNNIiwgIiIsICJYIiwgIlhYIiwgIlhYWCIsICJYTCIsICJMIiwgIkxYIiwgIkxYWCIsICJMWFhYIiwgIlhDIiwgIiIsICJJIiwgIklJIiwgIklJSSIsICJJViIsICJWIiwgIlZJIiwgIlZJSSIsICJWSUlJIiwgIklYIl07CmZ1bmN0aW9uIHRvUm9tYW5OdW1lcmFscyhudW1iZXIsIGxvd2VyQ2FzZSA9IGZhbHNlKSB7CiAgYXNzZXJ0KE51bWJlci5pc0ludGVnZXIobnVtYmVyKSAmJiBudW1iZXIgPiAwLCAiVGhlIG51bWJlciBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpOwogIGNvbnN0IHJvbWFuID0gIk0iLnJlcGVhdChudW1iZXIgLyAxMDAwIHwgMCkgKyBST01BTl9OVU1CRVJfTUFQW251bWJlciAlIDEwMDAgLyAxMDAgfCAwXSArIFJPTUFOX05VTUJFUl9NQVBbMTAgKyAobnVtYmVyICUgMTAwIC8gMTAgfCAwKV0gKyBST01BTl9OVU1CRVJfTUFQWzIwICsgbnVtYmVyICUgMTBdOwogIHJldHVybiBsb3dlckNhc2UgPyByb21hbi50b0xvd2VyQ2FzZSgpIDogcm9tYW47Cn0KZnVuY3Rpb24gbG9nMih4KSB7CiAgcmV0dXJuIHggPiAwID8gTWF0aC5jZWlsKE1hdGgubG9nMih4KSkgOiAwOwp9CmZ1bmN0aW9uIHJlYWRJbnQ4KGRhdGEsIG9mZnNldCkgewogIHJldHVybiBkYXRhW29mZnNldF0gPDwgMjQgPj4gMjQ7Cn0KZnVuY3Rpb24gcmVhZEludDE2KGRhdGEsIG9mZnNldCkgewogIHJldHVybiAoZGF0YVtvZmZzZXRdIDw8IDI0IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxNikgPj4gMTY7Cn0KZnVuY3Rpb24gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpIHsKICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDggfCBkYXRhW29mZnNldCArIDFdOwp9CmZ1bmN0aW9uIHJlYWRVaW50MzIoZGF0YSwgb2Zmc2V0KSB7CiAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2IHwgZGF0YVtvZmZzZXQgKyAyXSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAzXSkgPj4+IDA7Cn0KZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGNoKSB7CiAgcmV0dXJuIGNoID09PSAweDIwIHx8IGNoID09PSAweDA5IHx8IGNoID09PSAweDBkIHx8IGNoID09PSAweDBhOwp9CmZ1bmN0aW9uIGlzQm9vbGVhbkFycmF5KGFyciwgbGVuKSB7CiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSAmJiAobGVuID09PSBudWxsIHx8IGFyci5sZW5ndGggPT09IGxlbikgJiYgYXJyLmV2ZXJ5KHggPT4gdHlwZW9mIHggPT09ICJib29sZWFuIik7Cn0KZnVuY3Rpb24gaXNOdW1iZXJBcnJheShhcnIsIGxlbikgewogIGlmIChBcnJheS5pc0FycmF5KGFycikpIHsKICAgIHJldHVybiAobGVuID09PSBudWxsIHx8IGFyci5sZW5ndGggPT09IGxlbikgJiYgYXJyLmV2ZXJ5KHggPT4gdHlwZW9mIHggPT09ICJudW1iZXIiKTsKICB9CiAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnIpICYmICEoYXJyIGluc3RhbmNlb2YgQmlnSW50NjRBcnJheSB8fCBhcnIgaW5zdGFuY2VvZiBCaWdVaW50NjRBcnJheSkgJiYgKGxlbiA9PT0gbnVsbCB8fCBhcnIubGVuZ3RoID09PSBsZW4pOwp9CmZ1bmN0aW9uIGxvb2t1cE1hdHJpeChhcnIsIGZhbGxiYWNrKSB7CiAgcmV0dXJuIGlzTnVtYmVyQXJyYXkoYXJyLCA2KSA/IGFyciA6IGZhbGxiYWNrOwp9CmZ1bmN0aW9uIGxvb2t1cFJlY3QoYXJyLCBmYWxsYmFjaykgewogIHJldHVybiBpc051bWJlckFycmF5KGFyciwgNCkgPyBhcnIgOiBmYWxsYmFjazsKfQpmdW5jdGlvbiBsb29rdXBOb3JtYWxSZWN0KGFyciwgZmFsbGJhY2spIHsKICByZXR1cm4gaXNOdW1iZXJBcnJheShhcnIsIDQpID8gVXRpbC5ub3JtYWxpemVSZWN0KGFycikgOiBmYWxsYmFjazsKfQpmdW5jdGlvbiBwYXJzZVhGQVBhdGgocGF0aCkgewogIGNvbnN0IHBvc2l0aW9uUGF0dGVybiA9IC8oLispXFsoXGQrKVxdJC87CiAgcmV0dXJuIHBhdGguc3BsaXQoIi4iKS5tYXAoY29tcG9uZW50ID0+IHsKICAgIGNvbnN0IG0gPSBjb21wb25lbnQubWF0Y2gocG9zaXRpb25QYXR0ZXJuKTsKICAgIGlmIChtKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgbmFtZTogbVsxXSwKICAgICAgICBwb3M6IHBhcnNlSW50KG1bMl0sIDEwKQogICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgbmFtZTogY29tcG9uZW50LAogICAgICBwb3M6IDAKICAgIH07CiAgfSk7Cn0KZnVuY3Rpb24gZXNjYXBlUERGTmFtZShzdHIpIHsKICBjb25zdCBidWZmZXIgPSBbXTsKICBsZXQgc3RhcnQgPSAwOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7CiAgICBpZiAoY2hhciA8IDB4MjEgfHwgY2hhciA+IDB4N2UgfHwgY2hhciA9PT0gMHgyMyB8fCBjaGFyID09PSAweDI4IHx8IGNoYXIgPT09IDB4MjkgfHwgY2hhciA9PT0gMHgzYyB8fCBjaGFyID09PSAweDNlIHx8IGNoYXIgPT09IDB4NWIgfHwgY2hhciA9PT0gMHg1ZCB8fCBjaGFyID09PSAweDdiIHx8IGNoYXIgPT09IDB4N2QgfHwgY2hhciA9PT0gMHgyZiB8fCBjaGFyID09PSAweDI1KSB7CiAgICAgIGlmIChzdGFydCA8IGkpIHsKICAgICAgICBidWZmZXIucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7CiAgICAgIH0KICAgICAgYnVmZmVyLnB1c2goYCMke2NoYXIudG9TdHJpbmcoMTYpfWApOwogICAgICBzdGFydCA9IGkgKyAxOwogICAgfQogIH0KICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHN0cjsKICB9CiAgaWYgKHN0YXJ0IDwgc3RyLmxlbmd0aCkgewogICAgYnVmZmVyLnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgc3RyLmxlbmd0aCkpOwogIH0KICByZXR1cm4gYnVmZmVyLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2VBbGwoLyhbKClcXFxuXHJdKS9nLCBtYXRjaCA9PiB7CiAgICBpZiAobWF0Y2ggPT09ICJcbiIpIHsKICAgICAgcmV0dXJuICJcXG4iOwogICAgfSBlbHNlIGlmIChtYXRjaCA9PT0gIlxyIikgewogICAgICByZXR1cm4gIlxcciI7CiAgICB9CiAgICByZXR1cm4gYFxcJHttYXRjaH1gOwogIH0pOwp9CmZ1bmN0aW9uIF9jb2xsZWN0SlMoZW50cnksIHhyZWYsIGxpc3QsIHBhcmVudHMpIHsKICBpZiAoIWVudHJ5KSB7CiAgICByZXR1cm47CiAgfQogIGxldCBwYXJlbnQgPSBudWxsOwogIGlmIChlbnRyeSBpbnN0YW5jZW9mIFJlZikgewogICAgaWYgKHBhcmVudHMuaGFzKGVudHJ5KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBwYXJlbnQgPSBlbnRyeTsKICAgIHBhcmVudHMucHV0KHBhcmVudCk7CiAgICBlbnRyeSA9IHhyZWYuZmV0Y2goZW50cnkpOwogIH0KICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpIHsKICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbnRyeSkgewogICAgICBfY29sbGVjdEpTKGVsZW1lbnQsIHhyZWYsIGxpc3QsIHBhcmVudHMpOwogICAgfQogIH0gZWxzZSBpZiAoZW50cnkgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBpZiAoaXNOYW1lKGVudHJ5LmdldCgiUyIpLCAiSmF2YVNjcmlwdCIpKSB7CiAgICAgIGNvbnN0IGpzID0gZW50cnkuZ2V0KCJKUyIpOwogICAgICBsZXQgY29kZTsKICAgICAgaWYgKGpzIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGNvZGUgPSBqcy5nZXRTdHJpbmcoKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YganMgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY29kZSA9IGpzOwogICAgICB9CiAgICAgIGNvZGUgJiY9IHN0cmluZ1RvUERGU3RyaW5nKGNvZGUpLnJlcGxhY2VBbGwoIlx4MDAiLCAiIik7CiAgICAgIGlmIChjb2RlKSB7CiAgICAgICAgbGlzdC5wdXNoKGNvZGUpOwogICAgICB9CiAgICB9CiAgICBfY29sbGVjdEpTKGVudHJ5LmdldFJhdygiTmV4dCIpLCB4cmVmLCBsaXN0LCBwYXJlbnRzKTsKICB9CiAgaWYgKHBhcmVudCkgewogICAgcGFyZW50cy5yZW1vdmUocGFyZW50KTsKICB9Cn0KZnVuY3Rpb24gY29sbGVjdEFjdGlvbnMoeHJlZiwgZGljdCwgZXZlbnRUeXBlKSB7CiAgY29uc3QgYWN0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgY29uc3QgYWRkaXRpb25hbEFjdGlvbnNEaWN0cyA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgZGljdCwKICAgIGtleTogIkFBIiwKICAgIHN0b3BXaGVuRm91bmQ6IGZhbHNlCiAgfSk7CiAgaWYgKGFkZGl0aW9uYWxBY3Rpb25zRGljdHMpIHsKICAgIGZvciAobGV0IGkgPSBhZGRpdGlvbmFsQWN0aW9uc0RpY3RzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNvbnN0IGFkZGl0aW9uYWxBY3Rpb25zID0gYWRkaXRpb25hbEFjdGlvbnNEaWN0c1tpXTsKICAgICAgaWYgKCEoYWRkaXRpb25hbEFjdGlvbnMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFkZGl0aW9uYWxBY3Rpb25zLmdldEtleXMoKSkgewogICAgICAgIGNvbnN0IGFjdGlvbiA9IGV2ZW50VHlwZVtrZXldOwogICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYWN0aW9uRGljdCA9IGFkZGl0aW9uYWxBY3Rpb25zLmdldFJhdyhrZXkpOwogICAgICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgUmVmU2V0KCk7CiAgICAgICAgY29uc3QgbGlzdCA9IFtdOwogICAgICAgIF9jb2xsZWN0SlMoYWN0aW9uRGljdCwgeHJlZiwgbGlzdCwgcGFyZW50cyk7CiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgYWN0aW9uc1thY3Rpb25dID0gbGlzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGRpY3QuaGFzKCJBIikpIHsKICAgIGNvbnN0IGFjdGlvbkRpY3QgPSBkaWN0LmdldCgiQSIpOwogICAgY29uc3QgcGFyZW50cyA9IG5ldyBSZWZTZXQoKTsKICAgIGNvbnN0IGxpc3QgPSBbXTsKICAgIF9jb2xsZWN0SlMoYWN0aW9uRGljdCwgeHJlZiwgbGlzdCwgcGFyZW50cyk7CiAgICBpZiAobGlzdC5sZW5ndGggPiAwKSB7CiAgICAgIGFjdGlvbnMuQWN0aW9uID0gbGlzdDsKICAgIH0KICB9CiAgcmV0dXJuIG9iamVjdFNpemUoYWN0aW9ucykgPiAwID8gYWN0aW9ucyA6IG51bGw7Cn0KY29uc3QgWE1MRW50aXRpZXMgPSB7CiAgMHgzYzogIiZsdDsiLAogIDB4M2U6ICImZ3Q7IiwKICAweDI2OiAiJmFtcDsiLAogIDB4MjI6ICImcXVvdDsiLAogIDB4Mjc6ICImYXBvczsiCn07CmZ1bmN0aW9uKiBjb2RlUG9pbnRJdGVyKHN0cikgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBjaGFyID0gc3RyLmNvZGVQb2ludEF0KGkpOwogICAgaWYgKGNoYXIgPiAweGQ3ZmYgJiYgKGNoYXIgPCAweGUwMDAgfHwgY2hhciA+IDB4ZmZmZCkpIHsKICAgICAgaSsrOwogICAgfQogICAgeWllbGQgY2hhcjsKICB9Cn0KZnVuY3Rpb24gZW5jb2RlVG9YbWxTdHJpbmcoc3RyKSB7CiAgY29uc3QgYnVmZmVyID0gW107CiAgbGV0IHN0YXJ0ID0gMDsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jb2RlUG9pbnRBdChpKTsKICAgIGlmICgweDIwIDw9IGNoYXIgJiYgY2hhciA8PSAweDdlKSB7CiAgICAgIGNvbnN0IGVudGl0eSA9IFhNTEVudGl0aWVzW2NoYXJdOwogICAgICBpZiAoZW50aXR5KSB7CiAgICAgICAgaWYgKHN0YXJ0IDwgaSkgewogICAgICAgICAgYnVmZmVyLnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgaSkpOwogICAgICAgIH0KICAgICAgICBidWZmZXIucHVzaChlbnRpdHkpOwogICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChzdGFydCA8IGkpIHsKICAgICAgICBidWZmZXIucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7CiAgICAgIH0KICAgICAgYnVmZmVyLnB1c2goYCYjeCR7Y2hhci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX07YCk7CiAgICAgIGlmIChjaGFyID4gMHhkN2ZmICYmIChjaGFyIDwgMHhlMDAwIHx8IGNoYXIgPiAweGZmZmQpKSB7CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICB9CiAgfQogIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gc3RyOwogIH0KICBpZiAoc3RhcnQgPCBzdHIubGVuZ3RoKSB7CiAgICBidWZmZXIucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBzdHIubGVuZ3RoKSk7CiAgfQogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KZnVuY3Rpb24gdmFsaWRhdGVGb250TmFtZShmb250RmFtaWx5LCBtdXN0V2FybiA9IGZhbHNlKSB7CiAgY29uc3QgbSA9IC9eKCJ8JykuKigifCcpJC8uZXhlYyhmb250RmFtaWx5KTsKICBpZiAobSAmJiBtWzFdID09PSBtWzJdKSB7CiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYFteXFxcXF0ke21bMV19YCk7CiAgICBpZiAocmUudGVzdChmb250RmFtaWx5LnNsaWNlKDEsIC0xKSkpIHsKICAgICAgaWYgKG11c3RXYXJuKSB7CiAgICAgICAgd2FybihgRm9udEZhbWlseSBjb250YWlucyB1bmVzY2FwZWQgJHttWzFdfTogJHtmb250RmFtaWx5fS5gKTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoY29uc3QgaWRlbnQgb2YgZm9udEZhbWlseS5zcGxpdCgvWyBcdF0rLykpIHsKICAgICAgaWYgKC9eKFxkfCgtKFxkfC0pKSkvLnRlc3QoaWRlbnQpIHx8ICEvXltcdy1cXF0rJC8udGVzdChpZGVudCkpIHsKICAgICAgICBpZiAobXVzdFdhcm4pIHsKICAgICAgICAgIHdhcm4oYEZvbnRGYW1pbHkgY29udGFpbnMgaW52YWxpZCA8Y3VzdG9tLWlkZW50PjogJHtmb250RmFtaWx5fS5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIHZhbGlkYXRlQ1NTRm9udChjc3NGb250SW5mbykgewogIGNvbnN0IERFRkFVTFRfQ1NTX0ZPTlRfT0JMSVFVRSA9ICIxNCI7CiAgY29uc3QgREVGQVVMVF9DU1NfRk9OVF9XRUlHSFQgPSAiNDAwIjsKICBjb25zdCBDU1NfRk9OVF9XRUlHSFRfVkFMVUVTID0gbmV3IFNldChbIjEwMCIsICIyMDAiLCAiMzAwIiwgIjQwMCIsICI1MDAiLCAiNjAwIiwgIjcwMCIsICI4MDAiLCAiOTAwIiwgIjEwMDAiLCAibm9ybWFsIiwgImJvbGQiLCAiYm9sZGVyIiwgImxpZ2h0ZXIiXSk7CiAgY29uc3QgewogICAgZm9udEZhbWlseSwKICAgIGZvbnRXZWlnaHQsCiAgICBpdGFsaWNBbmdsZQogIH0gPSBjc3NGb250SW5mbzsKICBpZiAoIXZhbGlkYXRlRm9udE5hbWUoZm9udEZhbWlseSwgdHJ1ZSkpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgY29uc3Qgd2VpZ2h0ID0gZm9udFdlaWdodCA/IGZvbnRXZWlnaHQudG9TdHJpbmcoKSA6ICIiOwogIGNzc0ZvbnRJbmZvLmZvbnRXZWlnaHQgPSBDU1NfRk9OVF9XRUlHSFRfVkFMVUVTLmhhcyh3ZWlnaHQpID8gd2VpZ2h0IDogREVGQVVMVF9DU1NfRk9OVF9XRUlHSFQ7CiAgY29uc3QgYW5nbGUgPSBwYXJzZUZsb2F0KGl0YWxpY0FuZ2xlKTsKICBjc3NGb250SW5mby5pdGFsaWNBbmdsZSA9IGlzTmFOKGFuZ2xlKSB8fCBhbmdsZSA8IC05MCB8fCBhbmdsZSA+IDkwID8gREVGQVVMVF9DU1NfRk9OVF9PQkxJUVVFIDogaXRhbGljQW5nbGUudG9TdHJpbmcoKTsKICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiByZWNvdmVySnNVUkwoc3RyKSB7CiAgY29uc3QgVVJMX09QRU5fTUVUSE9EUyA9IFsiYXBwLmxhdW5jaFVSTCIsICJ3aW5kb3cub3BlbiIsICJ4ZmEuaG9zdC5nb3RvVVJMIl07CiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCJeXFxzKigiICsgVVJMX09QRU5fTUVUSE9EUy5qb2luKCJ8IikucmVwbGFjZUFsbCgiLiIsICJcXC4iKSArICIpXFwoKD86J3xcIikoW14nXCJdKikoPzonfFwiKSg/OixcXHMqKFxcdyspXFwpfFxcKSkiLCAiaSIpOwogIGNvbnN0IGpzVXJsID0gcmVnZXguZXhlYyhzdHIpOwogIGlmIChqc1VybD8uWzJdKSB7CiAgICByZXR1cm4gewogICAgICB1cmw6IGpzVXJsWzJdLAogICAgICBuZXdXaW5kb3c6IGpzVXJsWzFdID09PSAiYXBwLmxhdW5jaFVSTCIgJiYganNVcmxbM10gPT09ICJ0cnVlIgogICAgfTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KZnVuY3Rpb24gbnVtYmVyVG9TdHJpbmcodmFsdWUpIHsKICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwogIH0KICBjb25zdCByb3VuZGVkVmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlICogMTAwKTsKICBpZiAocm91bmRlZFZhbHVlICUgMTAwID09PSAwKSB7CiAgICByZXR1cm4gKHJvdW5kZWRWYWx1ZSAvIDEwMCkudG9TdHJpbmcoKTsKICB9CiAgaWYgKHJvdW5kZWRWYWx1ZSAlIDEwID09PSAwKSB7CiAgICByZXR1cm4gdmFsdWUudG9GaXhlZCgxKTsKICB9CiAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoMik7Cn0KZnVuY3Rpb24gZ2V0TmV3QW5ub3RhdGlvbnNNYXAoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICBpZiAoIWFubm90YXRpb25TdG9yYWdlKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgbmV3QW5ub3RhdGlvbnNCeVBhZ2UgPSBuZXcgTWFwKCk7CiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoQW5ub3RhdGlvbkVkaXRvclByZWZpeCkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBsZXQgYW5ub3RhdGlvbnMgPSBuZXdBbm5vdGF0aW9uc0J5UGFnZS5nZXQodmFsdWUucGFnZUluZGV4KTsKICAgIGlmICghYW5ub3RhdGlvbnMpIHsKICAgICAgYW5ub3RhdGlvbnMgPSBbXTsKICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2Uuc2V0KHZhbHVlLnBhZ2VJbmRleCwgYW5ub3RhdGlvbnMpOwogICAgfQogICAgYW5ub3RhdGlvbnMucHVzaCh2YWx1ZSk7CiAgfQogIHJldHVybiBuZXdBbm5vdGF0aW9uc0J5UGFnZS5zaXplID4gMCA/IG5ld0Fubm90YXRpb25zQnlQYWdlIDogbnVsbDsKfQpmdW5jdGlvbiBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHN0cikgewogIHJldHVybiBpc0FzY2lpKHN0cikgPyBzdHIgOiBzdHJpbmdUb1VURjE2U3RyaW5nKHN0ciwgdHJ1ZSk7Cn0KZnVuY3Rpb24gaXNBc2NpaShzdHIpIHsKICByZXR1cm4gL15bXHgwMC1ceDdGXSokLy50ZXN0KHN0cik7Cn0KZnVuY3Rpb24gc3RyaW5nVG9VVEYxNkhleFN0cmluZyhzdHIpIHsKICBjb25zdCBidWYgPSBbXTsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgYnVmLnB1c2goaGV4TnVtYmVyc1tjaGFyID4+IDggJiAweGZmXSwgaGV4TnVtYmVyc1tjaGFyICYgMHhmZl0pOwogIH0KICByZXR1cm4gYnVmLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHN0cmluZ1RvVVRGMTZTdHJpbmcoc3RyLCBiaWdFbmRpYW4gPSBmYWxzZSkgewogIGNvbnN0IGJ1ZiA9IFtdOwogIGlmIChiaWdFbmRpYW4pIHsKICAgIGJ1Zi5wdXNoKCJceEZFXHhGRiIpOwogIH0KICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgYnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyID4+IDggJiAweGZmKSwgU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyICYgMHhmZikpOwogIH0KICByZXR1cm4gYnVmLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGdldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uLCB3aWR0aCwgaGVpZ2h0KSB7CiAgc3dpdGNoIChyb3RhdGlvbikgewogICAgY2FzZSA5MDoKICAgICAgcmV0dXJuIFswLCAxLCAtMSwgMCwgd2lkdGgsIDBdOwogICAgY2FzZSAxODA6CiAgICAgIHJldHVybiBbLTEsIDAsIDAsIC0xLCB3aWR0aCwgaGVpZ2h0XTsKICAgIGNhc2UgMjcwOgogICAgICByZXR1cm4gWzAsIC0xLCAxLCAwLCAwLCBoZWlnaHRdOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHJvdGF0aW9uIik7CiAgfQp9CmZ1bmN0aW9uIGdldFNpemVJbkJ5dGVzKHgpIHsKICByZXR1cm4gTWF0aC5jZWlsKE1hdGguY2VpbChNYXRoLmxvZzIoMSArIHgpKSAvIDgpOwp9Cgo7Ly8gLi9leHRlcm5hbC9xY21zL3FjbXNfdXRpbHMuanMKY2xhc3MgUUNNUyB7CiAgc3RhdGljIF9tb2R1bGUgPSBudWxsOwogIHN0YXRpYyBfbXVzdEFkZEFscGhhID0gZmFsc2U7CiAgc3RhdGljIF9kZXN0QnVmZmVyID0gbnVsbDsKfQpmdW5jdGlvbiBjb3B5X3Jlc3VsdChwdHIsIGxlbikgewogIGNvbnN0IHsKICAgIF9tb2R1bGUsCiAgICBfbXVzdEFkZEFscGhhLAogICAgX2Rlc3RCdWZmZXIKICB9ID0gUUNNUzsKICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShfbW9kdWxlLm1lbW9yeS5idWZmZXIsIHB0ciwgbGVuKTsKICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gX2Rlc3RCdWZmZXIubGVuZ3RoKSB7CiAgICBfZGVzdEJ1ZmZlci5zZXQocmVzdWx0KTsKICAgIHJldHVybjsKICB9CiAgaWYgKF9tdXN0QWRkQWxwaGEpIHsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMywgaiArPSA0KSB7CiAgICAgIF9kZXN0QnVmZmVyW2pdID0gcmVzdWx0W2ldOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMV0gPSByZXN1bHRbaSArIDFdOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMl0gPSByZXN1bHRbaSArIDJdOwogICAgICBfZGVzdEJ1ZmZlcltqICsgM10gPSAyNTU7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMywgaiArPSA0KSB7CiAgICAgIF9kZXN0QnVmZmVyW2pdID0gcmVzdWx0W2ldOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMV0gPSByZXN1bHRbaSArIDFdOwogICAgICBfZGVzdEJ1ZmZlcltqICsgMl0gPSByZXN1bHRbaSArIDJdOwogICAgfQogIH0KfQpmdW5jdGlvbiBjb3B5X3JnYihwdHIpIHsKICBRQ01TLl9kZXN0QnVmZmVyLnNldChuZXcgVWludDhBcnJheShRQ01TLl9tb2R1bGUubWVtb3J5LmJ1ZmZlciwgcHRyLCAzKSk7Cn0KCjsvLyAuL2V4dGVybmFsL3FjbXMvcWNtcy5qcwoKbGV0IHdhc207CmNvbnN0IGNhY2hlZFRleHREZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJyA/IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7CiAgaWdub3JlQk9NOiB0cnVlLAogIGZhdGFsOiB0cnVlCn0pIDogewogIGRlY29kZTogKCkgPT4gewogICAgdGhyb3cgRXJyb3IoJ1RleHREZWNvZGVyIG5vdCBhdmFpbGFibGUnKTsKICB9Cn07CmlmICh0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnKSB7CiAgY2FjaGVkVGV4dERlY29kZXIuZGVjb2RlKCk7Cn0KOwpsZXQgY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPSBudWxsOwpmdW5jdGlvbiBnZXRVaW50OEFycmF5TWVtb3J5MCgpIHsKICBpZiAoY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPT09IG51bGwgfHwgY2FjaGVkVWludDhBcnJheU1lbW9yeTAuYnl0ZUxlbmd0aCA9PT0gMCkgewogICAgY2FjaGVkVWludDhBcnJheU1lbW9yeTAgPSBuZXcgVWludDhBcnJheSh3YXNtLm1lbW9yeS5idWZmZXIpOwogIH0KICByZXR1cm4gY2FjaGVkVWludDhBcnJheU1lbW9yeTA7Cn0KZnVuY3Rpb24gZ2V0U3RyaW5nRnJvbVdhc20wKHB0ciwgbGVuKSB7CiAgcHRyID0gcHRyID4+PiAwOwogIHJldHVybiBjYWNoZWRUZXh0RGVjb2Rlci5kZWNvZGUoZ2V0VWludDhBcnJheU1lbW9yeTAoKS5zdWJhcnJheShwdHIsIHB0ciArIGxlbikpOwp9CmxldCBXQVNNX1ZFQ1RPUl9MRU4gPSAwOwpmdW5jdGlvbiBwYXNzQXJyYXk4VG9XYXNtMChhcmcsIG1hbGxvYykgewogIGNvbnN0IHB0ciA9IG1hbGxvYyhhcmcubGVuZ3RoICogMSwgMSkgPj4+IDA7CiAgZ2V0VWludDhBcnJheU1lbW9yeTAoKS5zZXQoYXJnLCBwdHIgLyAxKTsKICBXQVNNX1ZFQ1RPUl9MRU4gPSBhcmcubGVuZ3RoOwogIHJldHVybiBwdHI7Cn0KZnVuY3Rpb24gcWNtc19jb252ZXJ0X2FycmF5KHRyYW5zZm9ybWVyLCBzcmMpIHsKICBjb25zdCBwdHIwID0gcGFzc0FycmF5OFRvV2FzbTAoc3JjLCB3YXNtLl9fd2JpbmRnZW5fbWFsbG9jKTsKICBjb25zdCBsZW4wID0gV0FTTV9WRUNUT1JfTEVOOwogIHdhc20ucWNtc19jb252ZXJ0X2FycmF5KHRyYW5zZm9ybWVyLCBwdHIwLCBsZW4wKTsKfQpmdW5jdGlvbiBxY21zX2NvbnZlcnRfb25lKHRyYW5zZm9ybWVyLCBzcmMpIHsKICB3YXNtLnFjbXNfY29udmVydF9vbmUodHJhbnNmb3JtZXIsIHNyYyk7Cn0KZnVuY3Rpb24gcWNtc19jb252ZXJ0X3RocmVlKHRyYW5zZm9ybWVyLCBzcmMxLCBzcmMyLCBzcmMzKSB7CiAgd2FzbS5xY21zX2NvbnZlcnRfdGhyZWUodHJhbnNmb3JtZXIsIHNyYzEsIHNyYzIsIHNyYzMpOwp9CmZ1bmN0aW9uIHFjbXNfY29udmVydF9mb3VyKHRyYW5zZm9ybWVyLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KSB7CiAgd2FzbS5xY21zX2NvbnZlcnRfZm91cih0cmFuc2Zvcm1lciwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Cn0KZnVuY3Rpb24gcWNtc190cmFuc2Zvcm1lcl9mcm9tX21lbW9yeShtZW0sIGluX3R5cGUsIGludGVudCkgewogIGNvbnN0IHB0cjAgPSBwYXNzQXJyYXk4VG9XYXNtMChtZW0sIHdhc20uX193YmluZGdlbl9tYWxsb2MpOwogIGNvbnN0IGxlbjAgPSBXQVNNX1ZFQ1RPUl9MRU47CiAgY29uc3QgcmV0ID0gd2FzbS5xY21zX3RyYW5zZm9ybWVyX2Zyb21fbWVtb3J5KHB0cjAsIGxlbjAsIGluX3R5cGUsIGludGVudCk7CiAgcmV0dXJuIHJldCA+Pj4gMDsKfQpmdW5jdGlvbiBxY21zX2Ryb3BfdHJhbnNmb3JtZXIodHJhbnNmb3JtZXIpIHsKICB3YXNtLnFjbXNfZHJvcF90cmFuc2Zvcm1lcih0cmFuc2Zvcm1lcik7Cn0KY29uc3QgRGF0YVR5cGUgPSBPYmplY3QuZnJlZXplKHsKICBSR0I4OiAwLAogICIwIjogIlJHQjgiLAogIFJHQkE4OiAxLAogICIxIjogIlJHQkE4IiwKICBCR1JBODogMiwKICAiMiI6ICJCR1JBOCIsCiAgR3JheTg6IDMsCiAgIjMiOiAiR3JheTgiLAogIEdyYXlBODogNCwKICAiNCI6ICJHcmF5QTgiLAogIENNWUs6IDUsCiAgIjUiOiAiQ01ZSyIKfSk7CmNvbnN0IEludGVudCA9IE9iamVjdC5mcmVlemUoewogIFBlcmNlcHR1YWw6IDAsCiAgIjAiOiAiUGVyY2VwdHVhbCIsCiAgUmVsYXRpdmVDb2xvcmltZXRyaWM6IDEsCiAgIjEiOiAiUmVsYXRpdmVDb2xvcmltZXRyaWMiLAogIFNhdHVyYXRpb246IDIsCiAgIjIiOiAiU2F0dXJhdGlvbiIsCiAgQWJzb2x1dGVDb2xvcmltZXRyaWM6IDMsCiAgIjMiOiAiQWJzb2x1dGVDb2xvcmltZXRyaWMiCn0pOwphc3luYyBmdW5jdGlvbiBfX3diZ19sb2FkKG1vZHVsZSwgaW1wb3J0cykgewogIGlmICh0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbicgJiYgbW9kdWxlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHsKICAgIGlmICh0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcobW9kdWxlLCBpbXBvcnRzKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChtb2R1bGUuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpICE9ICdhcHBsaWNhdGlvbi93YXNtJykgewogICAgICAgICAgY29uc29sZS53YXJuKCJgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmdgIGZhaWxlZCBiZWNhdXNlIHlvdXIgc2VydmVyIGRvZXMgbm90IHNlcnZlIFdhc20gd2l0aCBgYXBwbGljYXRpb24vd2FzbWAgTUlNRSB0eXBlLiBGYWxsaW5nIGJhY2sgdG8gYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlYCB3aGljaCBpcyBzbG93ZXIuIE9yaWdpbmFsIGVycm9yOlxuIiwgZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCBieXRlcyA9IGF3YWl0IG1vZHVsZS5hcnJheUJ1ZmZlcigpOwogICAgcmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJ5dGVzLCBpbXBvcnRzKTsKICB9IGVsc2UgewogICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShtb2R1bGUsIGltcG9ydHMpOwogICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2UpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBpbnN0YW5jZSwKICAgICAgICBtb2R1bGUKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gX193YmdfZ2V0X2ltcG9ydHMoKSB7CiAgY29uc3QgaW1wb3J0cyA9IHt9OwogIGltcG9ydHMud2JnID0ge307CiAgaW1wb3J0cy53YmcuX193YmdfY29weXJlc3VsdF9iMDhlZTdkMjczZjI5NWRkID0gZnVuY3Rpb24gKGFyZzAsIGFyZzEpIHsKICAgIGNvcHlfcmVzdWx0KGFyZzAgPj4+IDAsIGFyZzEgPj4+IDApOwogIH07CiAgaW1wb3J0cy53YmcuX193YmdfY29weXJnYl9kNjBjZTE3YmIwNWQ5YjY3ID0gZnVuY3Rpb24gKGFyZzApIHsKICAgIGNvcHlfcmdiKGFyZzAgPj4+IDApOwogIH07CiAgaW1wb3J0cy53YmcuX193YmluZGdlbl9pbml0X2V4dGVybnJlZl90YWJsZSA9IGZ1bmN0aW9uICgpIHsKICAgIGNvbnN0IHRhYmxlID0gd2FzbS5fX3diaW5kZ2VuX2V4cG9ydF8wOwogICAgY29uc3Qgb2Zmc2V0ID0gdGFibGUuZ3Jvdyg0KTsKICAgIHRhYmxlLnNldCgwLCB1bmRlZmluZWQpOwogICAgdGFibGUuc2V0KG9mZnNldCArIDAsIHVuZGVmaW5lZCk7CiAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMSwgbnVsbCk7CiAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMiwgdHJ1ZSk7CiAgICB0YWJsZS5zZXQob2Zmc2V0ICsgMywgZmFsc2UpOwogIH07CiAgaW1wb3J0cy53YmcuX193YmluZGdlbl90aHJvdyA9IGZ1bmN0aW9uIChhcmcwLCBhcmcxKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICB9OwogIHJldHVybiBpbXBvcnRzOwp9CmZ1bmN0aW9uIF9fd2JnX2luaXRfbWVtb3J5KGltcG9ydHMsIG1lbW9yeSkge30KZnVuY3Rpb24gX193YmdfZmluYWxpemVfaW5pdChpbnN0YW5jZSwgbW9kdWxlKSB7CiAgd2FzbSA9IGluc3RhbmNlLmV4cG9ydHM7CiAgX193YmdfaW5pdC5fX3diaW5kZ2VuX3dhc21fbW9kdWxlID0gbW9kdWxlOwogIGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwID0gbnVsbDsKICB3YXNtLl9fd2JpbmRnZW5fc3RhcnQoKTsKICByZXR1cm4gd2FzbTsKfQpmdW5jdGlvbiBpbml0U3luYyhtb2R1bGUpIHsKICBpZiAod2FzbSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gd2FzbTsKICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YobW9kdWxlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgewogICAgICAoewogICAgICAgIG1vZHVsZQogICAgICB9ID0gbW9kdWxlKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUud2FybigndXNpbmcgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzIGZvciBgaW5pdFN5bmMoKWA7IHBhc3MgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQnKTsKICAgIH0KICB9CiAgY29uc3QgaW1wb3J0cyA9IF9fd2JnX2dldF9pbXBvcnRzKCk7CiAgX193YmdfaW5pdF9tZW1vcnkoaW1wb3J0cyk7CiAgaWYgKCEobW9kdWxlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSkgewogICAgbW9kdWxlID0gbmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShtb2R1bGUpOwogIH0KICBjb25zdCBpbnN0YW5jZSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIGltcG9ydHMpOwogIHJldHVybiBfX3diZ19maW5hbGl6ZV9pbml0KGluc3RhbmNlLCBtb2R1bGUpOwp9CmFzeW5jIGZ1bmN0aW9uIF9fd2JnX2luaXQobW9kdWxlX29yX3BhdGgpIHsKICBpZiAod2FzbSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gd2FzbTsKICBpZiAodHlwZW9mIG1vZHVsZV9vcl9wYXRoICE9PSAndW5kZWZpbmVkJykgewogICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2R1bGVfb3JfcGF0aCkgPT09IE9iamVjdC5wcm90b3R5cGUpIHsKICAgICAgKHsKICAgICAgICBtb2R1bGVfb3JfcGF0aAogICAgICB9ID0gbW9kdWxlX29yX3BhdGgpOwogICAgfSBlbHNlIHsKICAgICAgY29uc29sZS53YXJuKCd1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbjsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCcpOwogICAgfQogIH0KICBpZiAodHlwZW9mIG1vZHVsZV9vcl9wYXRoID09PSAndW5kZWZpbmVkJykgewogICAgbW9kdWxlX29yX3BhdGggPSBuZXcgVVJMKCdxY21zX2JnLndhc20nLCBpbXBvcnQubWV0YS51cmwpOwogIH0KICBjb25zdCBpbXBvcnRzID0gX193YmdfZ2V0X2ltcG9ydHMoKTsKICBpZiAodHlwZW9mIG1vZHVsZV9vcl9wYXRoID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiBtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFJlcXVlc3QgfHwgdHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJyAmJiBtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFVSTCkgewogICAgbW9kdWxlX29yX3BhdGggPSBmZXRjaChtb2R1bGVfb3JfcGF0aCk7CiAgfQogIF9fd2JnX2luaXRfbWVtb3J5KGltcG9ydHMpOwogIGNvbnN0IHsKICAgIGluc3RhbmNlLAogICAgbW9kdWxlCiAgfSA9IGF3YWl0IF9fd2JnX2xvYWQoYXdhaXQgbW9kdWxlX29yX3BhdGgsIGltcG9ydHMpOwogIHJldHVybiBfX3diZ19maW5hbGl6ZV9pbml0KGluc3RhbmNlLCBtb2R1bGUpOwp9CgovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIGNvbnN0IHFjbXMgPSAoKC8qIHVudXNlZCBwdXJlIGV4cHJlc3Npb24gb3Igc3VwZXIgKi8gbnVsbCAmJiAoX193YmdfaW5pdCkpKTsKOy8vIC4vc3JjL2NvcmUvY29sb3JzcGFjZS5qcwoKCmZ1bmN0aW9uIHJlc2l6ZVJnYkltYWdlKHNyYywgZGVzdCwgdzEsIGgxLCB3MiwgaDIsIGFscGhhMDEpIHsKICBjb25zdCBDT01QT05FTlRTID0gMzsKICBhbHBoYTAxID0gYWxwaGEwMSAhPT0gMSA/IDAgOiBhbHBoYTAxOwogIGNvbnN0IHhSYXRpbyA9IHcxIC8gdzI7CiAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjsKICBsZXQgbmV3SW5kZXggPSAwLAogICAgb2xkSW5kZXg7CiAgY29uc3QgeFNjYWxlZCA9IG5ldyBVaW50MTZBcnJheSh3Mik7CiAgY29uc3QgdzFTY2FubGluZSA9IHcxICogQ09NUE9ORU5UUzsKICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgIHhTY2FsZWRbaV0gPSBNYXRoLmZsb29yKGkgKiB4UmF0aW8pICogQ09NUE9ORU5UUzsKICB9CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoMjsgaSsrKSB7CiAgICBjb25zdCBweSA9IE1hdGguZmxvb3IoaSAqIHlSYXRpbykgKiB3MVNjYW5saW5lOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB3MjsgaisrKSB7CiAgICAgIG9sZEluZGV4ID0gcHkgKyB4U2NhbGVkW2pdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBuZXdJbmRleCArPSBhbHBoYTAxOwogICAgfQogIH0KfQpmdW5jdGlvbiByZXNpemVSZ2JhSW1hZ2Uoc3JjLCBkZXN0LCB3MSwgaDEsIHcyLCBoMiwgYWxwaGEwMSkgewogIGNvbnN0IHhSYXRpbyA9IHcxIC8gdzI7CiAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjsKICBsZXQgbmV3SW5kZXggPSAwOwogIGNvbnN0IHhTY2FsZWQgPSBuZXcgVWludDE2QXJyYXkodzIpOwogIGlmIChhbHBoYTAxID09PSAxKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbyk7CiAgICB9CiAgICBjb25zdCBzcmMzMiA9IG5ldyBVaW50MzJBcnJheShzcmMuYnVmZmVyKTsKICAgIGNvbnN0IGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7CiAgICBjb25zdCByZ2JNYXNrID0gRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweDAwZmZmZmZmIDogMHhmZmZmZmYwMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaDI7IGkrKykgewogICAgICBjb25zdCBidWYgPSBzcmMzMi5zdWJhcnJheShNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzEpOwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHcyOyBqKyspIHsKICAgICAgICBkZXN0MzJbbmV3SW5kZXgrK10gfD0gYnVmW3hTY2FsZWRbal1dICYgcmdiTWFzazsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBjb25zdCBDT01QT05FTlRTID0gNDsKICAgIGNvbnN0IHcxU2NhbmxpbmUgPSB3MSAqIENPTVBPTkVOVFM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbykgKiBDT01QT05FTlRTOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoMjsgaSsrKSB7CiAgICAgIGNvbnN0IGJ1ZiA9IHNyYy5zdWJhcnJheShNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzFTY2FubGluZSk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdzI7IGorKykgewogICAgICAgIGNvbnN0IG9sZEluZGV4ID0geFNjYWxlZFtqXTsKICAgICAgICBkZXN0W25ld0luZGV4KytdID0gYnVmW29sZEluZGV4XTsKICAgICAgICBkZXN0W25ld0luZGV4KytdID0gYnVmW29sZEluZGV4ICsgMV07CiAgICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IGJ1ZltvbGRJbmRleCArIDJdOwogICAgICB9CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGNvcHlSZ2JhSW1hZ2Uoc3JjLCBkZXN0LCBhbHBoYTAxKSB7CiAgaWYgKGFscGhhMDEgPT09IDEpIHsKICAgIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIpOwogICAgY29uc3QgZGVzdDMyID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyKTsKICAgIGNvbnN0IHJnYk1hc2sgPSBGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4MDBmZmZmZmYgOiAweGZmZmZmZjAwOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjMzIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0MzJbaV0gfD0gc3JjMzJbaV0gJiByZ2JNYXNrOwogICAgfQogIH0gZWxzZSB7CiAgICBsZXQgaiA9IDA7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkgewogICAgICBkZXN0W2orK10gPSBzcmNbaV07CiAgICAgIGRlc3RbaisrXSA9IHNyY1tpICsgMV07CiAgICAgIGRlc3RbaisrXSA9IHNyY1tpICsgMl07CiAgICB9CiAgfQp9CmNsYXNzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKG5hbWUsIG51bUNvbXBzKSB7CiAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgdGhpcy5udW1Db21wcyA9IG51bUNvbXBzOwogIH0KICBnZXRSZ2Ioc3JjLCBzcmNPZmZzZXQpIHsKICAgIGNvbnN0IHJnYiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTsKICAgIHRoaXMuZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgcmdiLCAwKTsKICAgIHJldHVybiByZ2I7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JJdGVtIik7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JCdWZmZXIiKTsKICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICB1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0T3V0cHV0TGVuZ3RoIik7CiAgfQogIGlzUGFzc3Rocm91Z2goYml0cykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKICAgIHJldHVybiBDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIHRoaXMubnVtQ29tcHMpOwogIH0KICBmaWxsUmdiKGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGJwYywgY29tcHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IGNvdW50ID0gb3JpZ2luYWxXaWR0aCAqIG9yaWdpbmFsSGVpZ2h0OwogICAgbGV0IHJnYkJ1ZiA9IG51bGw7CiAgICBjb25zdCBudW1Db21wb25lbnRDb2xvcnMgPSAxIDw8IGJwYzsKICAgIGNvbnN0IG5lZWRzUmVzaXppbmcgPSBvcmlnaW5hbEhlaWdodCAhPT0gaGVpZ2h0IHx8IG9yaWdpbmFsV2lkdGggIT09IHdpZHRoOwogICAgaWYgKHRoaXMuaXNQYXNzdGhyb3VnaChicGMpKSB7CiAgICAgIHJnYkJ1ZiA9IGNvbXBzOwogICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBzID09PSAxICYmIGNvdW50ID4gbnVtQ29tcG9uZW50Q29sb3JzICYmIHRoaXMubmFtZSAhPT0gIkRldmljZUdyYXkiICYmIHRoaXMubmFtZSAhPT0gIkRldmljZVJHQiIpIHsKICAgICAgY29uc3QgYWxsQ29sb3JzID0gYnBjIDw9IDggPyBuZXcgVWludDhBcnJheShudW1Db21wb25lbnRDb2xvcnMpIDogbmV3IFVpbnQxNkFycmF5KG51bUNvbXBvbmVudENvbG9ycyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50Q29sb3JzOyBpKyspIHsKICAgICAgICBhbGxDb2xvcnNbaV0gPSBpOwogICAgICB9CiAgICAgIGNvbnN0IGNvbG9yTWFwID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG51bUNvbXBvbmVudENvbG9ycyAqIDMpOwogICAgICB0aGlzLmdldFJnYkJ1ZmZlcihhbGxDb2xvcnMsIDAsIG51bUNvbXBvbmVudENvbG9ycywgY29sb3JNYXAsIDAsIGJwYywgMCk7CiAgICAgIGlmICghbmVlZHNSZXNpemluZykgewogICAgICAgIGxldCBkZXN0UG9zID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICAgIGNvbnN0IGtleSA9IGNvbXBzW2ldICogMzsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGNvbG9yTWFwW2tleV07CiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAxXTsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGNvbG9yTWFwW2tleSArIDJdOwogICAgICAgICAgZGVzdFBvcyArPSBhbHBoYTAxOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZ2JCdWYgPSBuZXcgVWludDhBcnJheShjb3VudCAqIDMpOwogICAgICAgIGxldCByZ2JQb3MgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICAgY29uc3Qga2V5ID0gY29tcHNbaV0gKiAzOwogICAgICAgICAgcmdiQnVmW3JnYlBvcysrXSA9IGNvbG9yTWFwW2tleV07CiAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5ICsgMV07CiAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5ICsgMl07CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKCFuZWVkc1Jlc2l6aW5nKSB7CiAgICAgIHRoaXMuZ2V0UmdiQnVmZmVyKGNvbXBzLCAwLCB3aWR0aCAqIGFjdHVhbEhlaWdodCwgZGVzdCwgMCwgYnBjLCBhbHBoYTAxKTsKICAgIH0gZWxzZSB7CiAgICAgIHJnYkJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShjb3VudCAqIDMpOwogICAgICB0aGlzLmdldFJnYkJ1ZmZlcihjb21wcywgMCwgY291bnQsIHJnYkJ1ZiwgMCwgYnBjLCAwKTsKICAgIH0KICAgIGlmIChyZ2JCdWYpIHsKICAgICAgaWYgKG5lZWRzUmVzaXppbmcpIHsKICAgICAgICByZXNpemVSZ2JJbWFnZShyZ2JCdWYsIGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhbHBoYTAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgZGVzdFBvcyA9IDAsCiAgICAgICAgICByZ2JQb3MgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7IGkrKykgewogICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gcmdiQnVmW3JnYlBvcysrXTsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHJnYkJ1ZltyZ2JQb3MrK107CiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSByZ2JCdWZbcmdiUG9zKytdOwogICAgICAgICAgZGVzdFBvcyArPSBhbHBoYTAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnZXQgdXNlc1plcm9Ub09uZVJhbmdlKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidXNlc1plcm9Ub09uZVJhbmdlIiwgdHJ1ZSk7CiAgfQogIHN0YXRpYyBpc0RlZmF1bHREZWNvZGUoZGVjb2RlLCBudW1Db21wcykgewogICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY29kZSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAobnVtQ29tcHMgKiAyICE9PSBkZWNvZGUubGVuZ3RoKSB7CiAgICAgIHdhcm4oIlRoZSBkZWNvZGUgbWFwIGlzIG5vdCB0aGUgY29ycmVjdCBsZW5ndGgiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkZWNvZGUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBpZiAoZGVjb2RlW2ldICE9PSAwIHx8IGRlY29kZVtpICsgMV0gIT09IDEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBBbHRlcm5hdGVDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKG51bUNvbXBzLCBiYXNlLCB0aW50Rm4pIHsKICAgIHN1cGVyKCJBbHRlcm5hdGUiLCBudW1Db21wcyk7CiAgICB0aGlzLmJhc2UgPSBiYXNlOwogICAgdGhpcy50aW50Rm4gPSB0aW50Rm47CiAgICB0aGlzLnRtcEJ1ZiA9IG5ldyBGbG9hdDMyQXJyYXkoYmFzZS5udW1Db21wcyk7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIGNvbnN0IHRtcEJ1ZiA9IHRoaXMudG1wQnVmOwogICAgdGhpcy50aW50Rm4oc3JjLCBzcmNPZmZzZXQsIHRtcEJ1ZiwgMCk7CiAgICB0aGlzLmJhc2UuZ2V0UmdiSXRlbSh0bXBCdWYsIDAsIGRlc3QsIGRlc3RPZmZzZXQpOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBjb25zdCB0aW50Rm4gPSB0aGlzLnRpbnRGbjsKICAgIGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7CiAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgIGNvbnN0IGJhc2VOdW1Db21wcyA9IGJhc2UubnVtQ29tcHM7CiAgICBjb25zdCB1c2VzWmVyb1RvT25lUmFuZ2UgPSBiYXNlLnVzZXNaZXJvVG9PbmVSYW5nZTsKICAgIGNvbnN0IGlzUGFzc3Rocm91Z2ggPSAoYmFzZS5pc1Bhc3N0aHJvdWdoKDgpIHx8ICF1c2VzWmVyb1RvT25lUmFuZ2UpICYmIGFscGhhMDEgPT09IDA7CiAgICBsZXQgcG9zID0gaXNQYXNzdGhyb3VnaCA/IGRlc3RPZmZzZXQgOiAwOwogICAgY29uc3QgYmFzZUJ1ZiA9IGlzUGFzc3Rocm91Z2ggPyBkZXN0IDogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJhc2VOdW1Db21wcyAqIGNvdW50KTsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGNvbnN0IHNjYWxlZCA9IG5ldyBGbG9hdDMyQXJyYXkobnVtQ29tcHMpOwogICAgY29uc3QgdGludGVkID0gbmV3IEZsb2F0MzJBcnJheShiYXNlTnVtQ29tcHMpOwogICAgbGV0IGksIGo7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ29tcHM7IGorKykgewogICAgICAgIHNjYWxlZFtqXSA9IHNyY1tzcmNPZmZzZXQrK10gKiBzY2FsZTsKICAgICAgfQogICAgICB0aW50Rm4oc2NhbGVkLCAwLCB0aW50ZWQsIDApOwogICAgICBpZiAodXNlc1plcm9Ub09uZVJhbmdlKSB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IGJhc2VOdW1Db21wczsgaisrKSB7CiAgICAgICAgICBiYXNlQnVmW3BvcysrXSA9IHRpbnRlZFtqXSAqIDI1NTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmFzZS5nZXRSZ2JJdGVtKHRpbnRlZCwgMCwgYmFzZUJ1ZiwgcG9zKTsKICAgICAgICBwb3MgKz0gYmFzZU51bUNvbXBzOwogICAgICB9CiAgICB9CiAgICBpZiAoIWlzUGFzc3Rocm91Z2gpIHsKICAgICAgYmFzZS5nZXRSZ2JCdWZmZXIoYmFzZUJ1ZiwgMCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIDgsIGFscGhhMDEpOwogICAgfQogIH0KICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoICogdGhpcy5iYXNlLm51bUNvbXBzIC8gdGhpcy5udW1Db21wcywgYWxwaGEwMSk7CiAgfQp9CmNsYXNzIFBhdHRlcm5DUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKGJhc2VDUykgewogICAgc3VwZXIoIlBhdHRlcm4iLCBudWxsKTsKICAgIHRoaXMuYmFzZSA9IGJhc2VDUzsKICB9CiAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7CiAgICB1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm5DUy5pc0RlZmF1bHREZWNvZGUiKTsKICB9Cn0KY2xhc3MgSW5kZXhlZENTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgY29uc3RydWN0b3IoYmFzZSwgaGlnaFZhbCwgbG9va3VwKSB7CiAgICBzdXBlcigiSW5kZXhlZCIsIDEpOwogICAgdGhpcy5iYXNlID0gYmFzZTsKICAgIGNvbnN0IGxlbmd0aCA9IGJhc2UubnVtQ29tcHMgKiAoaGlnaFZhbCArIDEpOwogICAgdGhpcy5sb29rdXAgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogICAgaWYgKGxvb2t1cCBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgY29uc3QgYnl0ZXMgPSBsb29rdXAuZ2V0Qnl0ZXMobGVuZ3RoKTsKICAgICAgdGhpcy5sb29rdXAuc2V0KGJ5dGVzKTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGxvb2t1cCA9PT0gInN0cmluZyIpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgIHRoaXMubG9va3VwW2ldID0gbG9va3VwLmNoYXJDb2RlQXQoaSkgJiAweGZmOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEluZGV4ZWRDUyAtIHVucmVjb2duaXplZCBsb29rdXAgdGFibGU6ICR7bG9va3VwfWApOwogICAgfQogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBjb25zdCBudW1Db21wcyA9IHRoaXMuYmFzZS5udW1Db21wczsKICAgIGNvbnN0IHN0YXJ0ID0gc3JjW3NyY09mZnNldF0gKiBudW1Db21wczsKICAgIHRoaXMuYmFzZS5nZXRSZ2JCdWZmZXIodGhpcy5sb29rdXAsIHN0YXJ0LCAxLCBkZXN0LCBkZXN0T2Zmc2V0LCA4LCAwKTsKICB9CiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgY29uc3QgYmFzZSA9IHRoaXMuYmFzZTsKICAgIGNvbnN0IG51bUNvbXBzID0gYmFzZS5udW1Db21wczsKICAgIGNvbnN0IG91dHB1dERlbHRhID0gYmFzZS5nZXRPdXRwdXRMZW5ndGgobnVtQ29tcHMsIGFscGhhMDEpOwogICAgY29uc3QgbG9va3VwID0gdGhpcy5sb29rdXA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgY29uc3QgbG9va3VwUG9zID0gc3JjW3NyY09mZnNldCsrXSAqIG51bUNvbXBzOwogICAgICBiYXNlLmdldFJnYkJ1ZmZlcihsb29rdXAsIGxvb2t1cFBvcywgMSwgZGVzdCwgZGVzdE9mZnNldCwgOCwgYWxwaGEwMSk7CiAgICAgIGRlc3RPZmZzZXQgKz0gb3V0cHV0RGVsdGE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIHRoaXMuYmFzZS5nZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGggKiB0aGlzLmJhc2UubnVtQ29tcHMsIGFscGhhMDEpOwogIH0KICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKICAgIGlmICghQXJyYXkuaXNBcnJheShkZWNvZGVNYXApKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKGRlY29kZU1hcC5sZW5ndGggIT09IDIpIHsKICAgICAgd2FybigiRGVjb2RlIG1hcCBsZW5ndGggaXMgbm90IGNvcnJlY3QiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYnBjKSB8fCBicGMgPCAxKSB7CiAgICAgIHdhcm4oIkJpdHMgcGVyIGNvbXBvbmVudCBpcyBub3QgY29ycmVjdCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBkZWNvZGVNYXBbMF0gPT09IDAgJiYgZGVjb2RlTWFwWzFdID09PSAoMSA8PCBicGMpIC0gMTsKICB9Cn0KY2xhc3MgRGV2aWNlR3JheUNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcigiRGV2aWNlR3JheSIsIDEpOwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBjb25zdCBjID0gc3JjW3NyY09mZnNldF0gKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IGM7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IHNjYWxlID0gMjU1IC8gKCgxIDw8IGJpdHMpIC0gMSk7CiAgICBsZXQgaiA9IHNyY09mZnNldCwKICAgICAgcSA9IGRlc3RPZmZzZXQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgY29uc3QgYyA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIHEgKz0gYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpOwogIH0KfQpjbGFzcyBEZXZpY2VSZ2JDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoIkRldmljZVJHQiIsIDMpOwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gc3JjW3NyY09mZnNldF0gKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IHNyY1tzcmNPZmZzZXQgKyAxXSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gc3JjW3NyY09mZnNldCArIDJdICogMjU1OwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBpZiAoYml0cyA9PT0gOCAmJiBhbHBoYTAxID09PSAwKSB7CiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNPZmZzZXQsIHNyY09mZnNldCArIGNvdW50ICogMyksIGRlc3RPZmZzZXQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzY2FsZSA9IDI1NSAvICgoMSA8PCBiaXRzKSAtIDEpOwogICAgbGV0IGogPSBzcmNPZmZzZXQsCiAgICAgIHEgPSBkZXN0T2Zmc2V0OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIHEgKz0gYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpIC8gMyB8IDA7CiAgfQogIGlzUGFzc3Rocm91Z2goYml0cykgewogICAgcmV0dXJuIGJpdHMgPT09IDg7CiAgfQp9CmNsYXNzIERldmljZVJnYmFDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoIkRldmljZVJHQkEiLCA0KTsKICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBfYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoICogNDsKICB9CiAgaXNQYXNzdGhyb3VnaChiaXRzKSB7CiAgICByZXR1cm4gYml0cyA9PT0gODsKICB9CiAgZmlsbFJnYihkZXN0LCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgd2lkdGgsIGhlaWdodCwgYWN0dWFsSGVpZ2h0LCBicGMsIGNvbXBzLCBhbHBoYTAxKSB7CiAgICBpZiAob3JpZ2luYWxIZWlnaHQgIT09IGhlaWdodCB8fCBvcmlnaW5hbFdpZHRoICE9PSB3aWR0aCkgewogICAgICByZXNpemVSZ2JhSW1hZ2UoY29tcHMsIGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhbHBoYTAxKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvcHlSZ2JhSW1hZ2UoY29tcHMsIGRlc3QsIGFscGhhMDEpOwogICAgfQogIH0KfQpjbGFzcyBEZXZpY2VDbXlrQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKCJEZXZpY2VDTVlLIiwgNCk7CiAgfQogICN0b1JnYihzcmMsIHNyY09mZnNldCwgc3JjU2NhbGUsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIGNvbnN0IGMgPSBzcmNbc3JjT2Zmc2V0XSAqIHNyY1NjYWxlOwogICAgY29uc3QgbSA9IHNyY1tzcmNPZmZzZXQgKyAxXSAqIHNyY1NjYWxlOwogICAgY29uc3QgeSA9IHNyY1tzcmNPZmZzZXQgKyAyXSAqIHNyY1NjYWxlOwogICAgY29uc3QgayA9IHNyY1tzcmNPZmZzZXQgKyAzXSAqIHNyY1NjYWxlOwogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IDI1NSArIGMgKiAoLTQuMzg3MzMyMzg0NjA5OTg4ICogYyArIDU0LjQ4NjE1MTk0MTg5MTc2ICogbSArIDE4LjgyMjkwNTAyMTY1MzAyICogeSArIDIxMi4yNTY2MjQ1MTYzOTU4NSAqIGsgKyAtMjg1LjIzMzEwMjYxMzcwMDQpICsgbSAqICgxLjcxNDk3NjM0NzczNjIxMzQgKiBtIC0gNS42MDk2NzM2OTA0MDQ3MzE1ICogeSArIC0xNy44NzM4NzA4NjE0MTU0NDQgKiBrIC0gNS40OTcwMDY0MjcxOTYzNjYpICsgeSAqICgtMi41MjE3MzQwMTMxNjgzMDMzICogeSAtIDIxLjI0ODkyMzMzNzM1MzA3MyAqIGsgKyAxNy41MTE5MjcwODQxODEzKSArIGsgKiAoLTIxLjg2MTIyMTQ3NDYzNjA1ICogayAtIDE4OS40ODE4MDgzNTkyMjc0Nyk7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IDI1NSArIGMgKiAoOC44NDEwNDE0MjIwMzYxNDkgKiBjICsgNjAuMTE4MDI3MDQ1NTk3MzY2ICogbSArIDYuODcxNDI1NTkyMDQ5MDA3ICogeSArIDMxLjE1OTEwMDEzMDA1NTkyMiAqIGsgKyAtNzkuMjk3MDg0NDgxNjU0OCkgKyBtICogKC0xNS4zMTAzNjEzMDY5Njc4MTcgKiBtICsgMTcuNTc1MjUxMjYxMTA5NDgyICogeSArIDEzMS4zNTI1MDkxMjQ5Mzk3NiAqIGsgLSAxOTAuOTQ1MzMwMjU4ODk1MSkgKyB5ICogKDQuNDQ0MzM5MTAyODUyNzM5ICogeSArIDkuODYzMjg2MTQ5MzQwNSAqIGsgLSAyNC44Njc0MTU4MjU1NTg3OCkgKyBrICogKC0yMC43MzczMjU0NzExODEwMzQgKiBrIC0gMTg3LjgwNDUzNzA5NzE5NTc4KTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gMjU1ICsgYyAqICgwLjg4NDI1MjI0MzAwMDMyOTYgKiBjICsgOC4wNzg2Nzc1MDMxMTI5MjggKiBtICsgMzAuODk5NzgzMDk3MDM3MjkgKiB5IC0gMC4yMzg4MzIzODY4OTE3ODkzNCAqIGsgKyAtMTQuMTgzNTc2Nzk5NjczMjg2KSArIG0gKiAoMTAuNDk1OTMyNzM0MzIwNzIgKiBtICsgNjMuMDIzNzg0OTQ3NTQwNTIgKiB5ICsgNTAuNjA2OTU3NjU2MzYwNzM0ICogayAtIDExMi4yMzg4NDI1MzcxOTI0OCkgKyB5ICogKDAuMDMyOTYwNDExMTQ4NzMyMTcgKiB5ICsgMTE1LjYwMzg0NDQ5NjQ2NjQxICogayArIC0xOTMuNTgyMDkzNTY4NjE1MDUpICsgayAqICgtMjIuMzM4MTY4MDczMDk4ODYgKiBrIC0gMTgwLjEyNjEzOTc0NzA4MzY3KTsKICB9CiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgdGhpcy4jdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIDEsIGRlc3QsIGRlc3RPZmZzZXQpOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgc2NhbGUsIGRlc3QsIGRlc3RPZmZzZXQpOwogICAgICBzcmNPZmZzZXQgKz0gNDsKICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggLyA0ICogKDMgKyBhbHBoYTAxKSB8IDA7CiAgfQp9CmNsYXNzIENhbEdyYXlDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIGdhbW1hKSB7CiAgICBzdXBlcigiQ2FsR3JheSIsIDEpOwogICAgaWYgKCF3aGl0ZVBvaW50KSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbEdyYXkiKTsKICAgIH0KICAgIFt0aGlzLlhXLCB0aGlzLllXLCB0aGlzLlpXXSA9IHdoaXRlUG9pbnQ7CiAgICBbdGhpcy5YQiwgdGhpcy5ZQiwgdGhpcy5aQl0gPSBibGFja1BvaW50IHx8IFswLCAwLCAwXTsKICAgIHRoaXMuRyA9IGdhbW1hIHx8IDE7CiAgICBpZiAodGhpcy5YVyA8IDAgfHwgdGhpcy5aVyA8IDAgfHwgdGhpcy5ZVyAhPT0gMSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAke3RoaXMubmFtZX0sIG5vIGZhbGxiYWNrIGF2YWlsYWJsZWApOwogICAgfQogICAgaWYgKHRoaXMuWEIgPCAwIHx8IHRoaXMuWUIgPCAwIHx8IHRoaXMuWkIgPCAwKSB7CiAgICAgIGluZm8oYEludmFsaWQgQmxhY2tQb2ludCBmb3IgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTsKICAgICAgdGhpcy5YQiA9IHRoaXMuWUIgPSB0aGlzLlpCID0gMDsKICAgIH0KICAgIGlmICh0aGlzLlhCICE9PSAwIHx8IHRoaXMuWUIgIT09IDAgfHwgdGhpcy5aQiAhPT0gMCkgewogICAgICB3YXJuKGAke3RoaXMubmFtZX0sIEJsYWNrUG9pbnQ6IFhCOiAke3RoaXMuWEJ9LCBZQjogJHt0aGlzLllCfSwgYCArIGBaQjogJHt0aGlzLlpCfSwgb25seSBkZWZhdWx0IHZhbHVlcyBhcmUgc3VwcG9ydGVkLmApOwogICAgfQogICAgaWYgKHRoaXMuRyA8IDEpIHsKICAgICAgaW5mbyhgSW52YWxpZCBHYW1tYTogJHt0aGlzLkd9IGZvciAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApOwogICAgICB0aGlzLkcgPSAxOwogICAgfQogIH0KICAjdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKSB7CiAgICBjb25zdCBBID0gc3JjW3NyY09mZnNldF0gKiBzY2FsZTsKICAgIGNvbnN0IEFHID0gQSAqKiB0aGlzLkc7CiAgICBjb25zdCBMID0gdGhpcy5ZVyAqIEFHOwogICAgY29uc3QgdmFsID0gTWF0aC5tYXgoMjk1LjggKiBMICoqIDAuMzMzMzMzMzMzMzMzMzMzMyAtIDQwLjgsIDApOwogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHZhbDsKICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gdmFsOwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSB2YWw7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIHRoaXMuI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCAxKTsKICB9CiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgdGhpcy4jdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKTsKICAgICAgc3JjT2Zmc2V0ICs9IDE7CiAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKTsKICB9Cn0KY2xhc3MgQ2FsUkdCQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBzdGF0aWMgI0JSQURGT1JEX1NDQUxFX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzAuODk1MSwgMC4yNjY0LCAtMC4xNjE0LCAtMC43NTAyLCAxLjcxMzUsIDAuMDM2NywgMC4wMzg5LCAtMC4wNjg1LCAxLjAyOTZdKTsKICBzdGF0aWMgI0JSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbMC45ODY5OTI5LCAtMC4xNDcwNTQzLCAwLjE1OTk2MjcsIDAuNDMyMzA1MywgMC41MTgzNjAzLCAwLjA0OTI5MTIsIC0wLjAwODUyODcsIDAuMDQwMDQyOCwgMC45Njg0ODY3XSk7CiAgc3RhdGljICNTUkdCX0Q2NV9YWVpfVE9fUkdCX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzMuMjQwNDU0MiwgLTEuNTM3MTM4NSwgLTAuNDk4NTMxNCwgLTAuOTY5MjY2MCwgMS44NzYwMTA4LCAwLjA0MTU1NjAsIDAuMDU1NjQzNCwgLTAuMjA0MDI1OSwgMS4wNTcyMjUyXSk7CiAgc3RhdGljICNGTEFUX1dISVRFUE9JTlRfTUFUUklYID0gbmV3IEZsb2F0MzJBcnJheShbMSwgMSwgMV0pOwogIHN0YXRpYyAjdGVtcE5vcm1hbGl6ZU1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgc3RhdGljICN0ZW1wQ29udmVydE1hdHJpeDEgPSBuZXcgRmxvYXQzMkFycmF5KDMpOwogIHN0YXRpYyAjdGVtcENvbnZlcnRNYXRyaXgyID0gbmV3IEZsb2F0MzJBcnJheSgzKTsKICBzdGF0aWMgI0RFQ09ERV9MX0NPTlNUQU5UID0gKCg4ICsgMTYpIC8gMTE2KSAqKiAzIC8gOC4wOwogIGNvbnN0cnVjdG9yKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIGdhbW1hLCBtYXRyaXgpIHsKICAgIHN1cGVyKCJDYWxSR0IiLCAzKTsKICAgIGlmICghd2hpdGVQb2ludCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxSR0IiKTsKICAgIH0KICAgIGNvbnN0IFtYVywgWVcsIFpXXSA9IHRoaXMud2hpdGVQb2ludCA9IHdoaXRlUG9pbnQ7CiAgICBjb25zdCBbWEIsIFlCLCBaQl0gPSB0aGlzLmJsYWNrUG9pbnQgPSBibGFja1BvaW50IHx8IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgICBbdGhpcy5HUiwgdGhpcy5HRywgdGhpcy5HQl0gPSBnYW1tYSB8fCBuZXcgRmxvYXQzMkFycmF5KFsxLCAxLCAxXSk7CiAgICBbdGhpcy5NWEEsIHRoaXMuTVlBLCB0aGlzLk1aQSwgdGhpcy5NWEIsIHRoaXMuTVlCLCB0aGlzLk1aQiwgdGhpcy5NWEMsIHRoaXMuTVlDLCB0aGlzLk1aQ10gPSBtYXRyaXggfHwgbmV3IEZsb2F0MzJBcnJheShbMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMV0pOwogICAgaWYgKFhXIDwgMCB8fCBaVyA8IDAgfHwgWVcgIT09IDEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgJHt0aGlzLm5hbWV9LCBubyBmYWxsYmFjayBhdmFpbGFibGVgKTsKICAgIH0KICAgIGlmIChYQiA8IDAgfHwgWUIgPCAwIHx8IFpCIDwgMCkgewogICAgICBpbmZvKGBJbnZhbGlkIEJsYWNrUG9pbnQgZm9yICR7dGhpcy5uYW1lfSBbJHtYQn0sICR7WUJ9LCAke1pCfV0sIGAgKyAiZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuIik7CiAgICAgIHRoaXMuYmxhY2tQb2ludCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgICB9CiAgICBpZiAodGhpcy5HUiA8IDAgfHwgdGhpcy5HRyA8IDAgfHwgdGhpcy5HQiA8IDApIHsKICAgICAgaW5mbyhgSW52YWxpZCBHYW1tYSBbJHt0aGlzLkdSfSwgJHt0aGlzLkdHfSwgJHt0aGlzLkdCfV0gZm9yIGAgKyBgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTsKICAgICAgdGhpcy5HUiA9IHRoaXMuR0cgPSB0aGlzLkdCID0gMTsKICAgIH0KICB9CiAgI21hdHJpeFByb2R1Y3QoYSwgYiwgcmVzdWx0KSB7CiAgICByZXN1bHRbMF0gPSBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl07CiAgICByZXN1bHRbMV0gPSBhWzNdICogYlswXSArIGFbNF0gKiBiWzFdICsgYVs1XSAqIGJbMl07CiAgICByZXN1bHRbMl0gPSBhWzZdICogYlswXSArIGFbN10gKiBiWzFdICsgYVs4XSAqIGJbMl07CiAgfQogICN0b0ZsYXQoc291cmNlV2hpdGVQb2ludCwgTE1TLCByZXN1bHQpIHsKICAgIHJlc3VsdFswXSA9IExNU1swXSAqIDEgLyBzb3VyY2VXaGl0ZVBvaW50WzBdOwogICAgcmVzdWx0WzFdID0gTE1TWzFdICogMSAvIHNvdXJjZVdoaXRlUG9pbnRbMV07CiAgICByZXN1bHRbMl0gPSBMTVNbMl0gKiAxIC8gc291cmNlV2hpdGVQb2ludFsyXTsKICB9CiAgI3RvRDY1KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgcmVzdWx0KSB7CiAgICBjb25zdCBENjVYID0gMC45NTA0NzsKICAgIGNvbnN0IEQ2NVkgPSAxOwogICAgY29uc3QgRDY1WiA9IDEuMDg4ODM7CiAgICByZXN1bHRbMF0gPSBMTVNbMF0gKiBENjVYIC8gc291cmNlV2hpdGVQb2ludFswXTsKICAgIHJlc3VsdFsxXSA9IExNU1sxXSAqIEQ2NVkgLyBzb3VyY2VXaGl0ZVBvaW50WzFdOwogICAgcmVzdWx0WzJdID0gTE1TWzJdICogRDY1WiAvIHNvdXJjZVdoaXRlUG9pbnRbMl07CiAgfQogICNzUkdCVHJhbnNmZXJGdW5jdGlvbihjb2xvcikgewogICAgaWYgKGNvbG9yIDw9IDAuMDAzMTMwOCkgewogICAgICByZXR1cm4gTWF0aENsYW1wKDEyLjkyICogY29sb3IsIDAsIDEpOwogICAgfQogICAgaWYgKGNvbG9yID49IDAuOTk1NTQ1MjUpIHsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gTWF0aENsYW1wKCgxICsgMC4wNTUpICogY29sb3IgKiogKDEgLyAyLjQpIC0gMC4wNTUsIDAsIDEpOwogIH0KICAjZGVjb2RlTChMKSB7CiAgICBpZiAoTCA8IDApIHsKICAgICAgcmV0dXJuIC10aGlzLiNkZWNvZGVMKC1MKTsKICAgIH0KICAgIGlmIChMID4gOC4wKSB7CiAgICAgIHJldHVybiAoKEwgKyAxNikgLyAxMTYpICoqIDM7CiAgICB9CiAgICByZXR1cm4gTCAqIENhbFJHQkNTLiNERUNPREVfTF9DT05TVEFOVDsKICB9CiAgI2NvbXBlbnNhdGVCbGFja1BvaW50KHNvdXJjZUJsYWNrUG9pbnQsIFhZWl9GbGF0LCByZXN1bHQpIHsKICAgIGlmIChzb3VyY2VCbGFja1BvaW50WzBdID09PSAwICYmIHNvdXJjZUJsYWNrUG9pbnRbMV0gPT09IDAgJiYgc291cmNlQmxhY2tQb2ludFsyXSA9PT0gMCkgewogICAgICByZXN1bHRbMF0gPSBYWVpfRmxhdFswXTsKICAgICAgcmVzdWx0WzFdID0gWFlaX0ZsYXRbMV07CiAgICAgIHJlc3VsdFsyXSA9IFhZWl9GbGF0WzJdOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB6ZXJvRGVjb2RlTCA9IHRoaXMuI2RlY29kZUwoMCk7CiAgICBjb25zdCBYX0RTVCA9IHplcm9EZWNvZGVMOwogICAgY29uc3QgWF9TUkMgPSB0aGlzLiNkZWNvZGVMKHNvdXJjZUJsYWNrUG9pbnRbMF0pOwogICAgY29uc3QgWV9EU1QgPSB6ZXJvRGVjb2RlTDsKICAgIGNvbnN0IFlfU1JDID0gdGhpcy4jZGVjb2RlTChzb3VyY2VCbGFja1BvaW50WzFdKTsKICAgIGNvbnN0IFpfRFNUID0gemVyb0RlY29kZUw7CiAgICBjb25zdCBaX1NSQyA9IHRoaXMuI2RlY29kZUwoc291cmNlQmxhY2tQb2ludFsyXSk7CiAgICBjb25zdCBYX1NjYWxlID0gKDEgLSBYX0RTVCkgLyAoMSAtIFhfU1JDKTsKICAgIGNvbnN0IFhfT2Zmc2V0ID0gMSAtIFhfU2NhbGU7CiAgICBjb25zdCBZX1NjYWxlID0gKDEgLSBZX0RTVCkgLyAoMSAtIFlfU1JDKTsKICAgIGNvbnN0IFlfT2Zmc2V0ID0gMSAtIFlfU2NhbGU7CiAgICBjb25zdCBaX1NjYWxlID0gKDEgLSBaX0RTVCkgLyAoMSAtIFpfU1JDKTsKICAgIGNvbnN0IFpfT2Zmc2V0ID0gMSAtIFpfU2NhbGU7CiAgICByZXN1bHRbMF0gPSBYWVpfRmxhdFswXSAqIFhfU2NhbGUgKyBYX09mZnNldDsKICAgIHJlc3VsdFsxXSA9IFhZWl9GbGF0WzFdICogWV9TY2FsZSArIFlfT2Zmc2V0OwogICAgcmVzdWx0WzJdID0gWFlaX0ZsYXRbMl0gKiBaX1NjYWxlICsgWl9PZmZzZXQ7CiAgfQogICNub3JtYWxpemVXaGl0ZVBvaW50VG9GbGF0KHNvdXJjZVdoaXRlUG9pbnQsIFhZWl9JbiwgcmVzdWx0KSB7CiAgICBpZiAoc291cmNlV2hpdGVQb2ludFswXSA9PT0gMSAmJiBzb3VyY2VXaGl0ZVBvaW50WzJdID09PSAxKSB7CiAgICAgIHJlc3VsdFswXSA9IFhZWl9JblswXTsKICAgICAgcmVzdWx0WzFdID0gWFlaX0luWzFdOwogICAgICByZXN1bHRbMl0gPSBYWVpfSW5bMl07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IExNUyA9IHJlc3VsdDsKICAgIHRoaXMuI21hdHJpeFByb2R1Y3QoQ2FsUkdCQ1MuI0JSQURGT1JEX1NDQUxFX01BVFJJWCwgWFlaX0luLCBMTVMpOwogICAgY29uc3QgTE1TX0ZsYXQgPSBDYWxSR0JDUy4jdGVtcE5vcm1hbGl6ZU1hdHJpeDsKICAgIHRoaXMuI3RvRmxhdChzb3VyY2VXaGl0ZVBvaW50LCBMTVMsIExNU19GbGF0KTsKICAgIHRoaXMuI21hdHJpeFByb2R1Y3QoQ2FsUkdCQ1MuI0JSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYLCBMTVNfRmxhdCwgcmVzdWx0KTsKICB9CiAgI25vcm1hbGl6ZVdoaXRlUG9pbnRUb0Q2NShzb3VyY2VXaGl0ZVBvaW50LCBYWVpfSW4sIHJlc3VsdCkgewogICAgY29uc3QgTE1TID0gcmVzdWx0OwogICAgdGhpcy4jbWF0cml4UHJvZHVjdChDYWxSR0JDUy4jQlJBREZPUkRfU0NBTEVfTUFUUklYLCBYWVpfSW4sIExNUyk7CiAgICBjb25zdCBMTVNfRDY1ID0gQ2FsUkdCQ1MuI3RlbXBOb3JtYWxpemVNYXRyaXg7CiAgICB0aGlzLiN0b0Q2NShzb3VyY2VXaGl0ZVBvaW50LCBMTVMsIExNU19ENjUpOwogICAgdGhpcy4jbWF0cml4UHJvZHVjdChDYWxSR0JDUy4jQlJBREZPUkRfU0NBTEVfSU5WRVJTRV9NQVRSSVgsIExNU19ENjUsIHJlc3VsdCk7CiAgfQogICN0b1JnYihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpIHsKICAgIGNvbnN0IEEgPSBNYXRoQ2xhbXAoc3JjW3NyY09mZnNldF0gKiBzY2FsZSwgMCwgMSk7CiAgICBjb25zdCBCID0gTWF0aENsYW1wKHNyY1tzcmNPZmZzZXQgKyAxXSAqIHNjYWxlLCAwLCAxKTsKICAgIGNvbnN0IEMgPSBNYXRoQ2xhbXAoc3JjW3NyY09mZnNldCArIDJdICogc2NhbGUsIDAsIDEpOwogICAgY29uc3QgQUdSID0gQSA9PT0gMSA/IDEgOiBBICoqIHRoaXMuR1I7CiAgICBjb25zdCBCR0cgPSBCID09PSAxID8gMSA6IEIgKiogdGhpcy5HRzsKICAgIGNvbnN0IENHQiA9IEMgPT09IDEgPyAxIDogQyAqKiB0aGlzLkdCOwogICAgY29uc3QgWCA9IHRoaXMuTVhBICogQUdSICsgdGhpcy5NWEIgKiBCR0cgKyB0aGlzLk1YQyAqIENHQjsKICAgIGNvbnN0IFkgPSB0aGlzLk1ZQSAqIEFHUiArIHRoaXMuTVlCICogQkdHICsgdGhpcy5NWUMgKiBDR0I7CiAgICBjb25zdCBaID0gdGhpcy5NWkEgKiBBR1IgKyB0aGlzLk1aQiAqIEJHRyArIHRoaXMuTVpDICogQ0dCOwogICAgY29uc3QgWFlaID0gQ2FsUkdCQ1MuI3RlbXBDb252ZXJ0TWF0cml4MTsKICAgIFhZWlswXSA9IFg7CiAgICBYWVpbMV0gPSBZOwogICAgWFlaWzJdID0gWjsKICAgIGNvbnN0IFhZWl9GbGF0ID0gQ2FsUkdCQ1MuI3RlbXBDb252ZXJ0TWF0cml4MjsKICAgIHRoaXMuI25vcm1hbGl6ZVdoaXRlUG9pbnRUb0ZsYXQodGhpcy53aGl0ZVBvaW50LCBYWVosIFhZWl9GbGF0KTsKICAgIGNvbnN0IFhZWl9CbGFjayA9IENhbFJHQkNTLiN0ZW1wQ29udmVydE1hdHJpeDE7CiAgICB0aGlzLiNjb21wZW5zYXRlQmxhY2tQb2ludCh0aGlzLmJsYWNrUG9pbnQsIFhZWl9GbGF0LCBYWVpfQmxhY2spOwogICAgY29uc3QgWFlaX0Q2NSA9IENhbFJHQkNTLiN0ZW1wQ29udmVydE1hdHJpeDI7CiAgICB0aGlzLiNub3JtYWxpemVXaGl0ZVBvaW50VG9ENjUoQ2FsUkdCQ1MuI0ZMQVRfV0hJVEVQT0lOVF9NQVRSSVgsIFhZWl9CbGFjaywgWFlaX0Q2NSk7CiAgICBjb25zdCBTUkdCID0gQ2FsUkdCQ1MuI3RlbXBDb252ZXJ0TWF0cml4MTsKICAgIHRoaXMuI21hdHJpeFByb2R1Y3QoQ2FsUkdCQ1MuI1NSR0JfRDY1X1hZWl9UT19SR0JfTUFUUklYLCBYWVpfRDY1LCBTUkdCKTsKICAgIGRlc3RbZGVzdE9mZnNldF0gPSB0aGlzLiNzUkdCVHJhbnNmZXJGdW5jdGlvbihTUkdCWzBdKSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gdGhpcy4jc1JHQlRyYW5zZmVyRnVuY3Rpb24oU1JHQlsxXSkgKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IHRoaXMuI3NSR0JUcmFuc2ZlckZ1bmN0aW9uKFNSR0JbMl0pICogMjU1OwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgMSk7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IHNjYWxlID0gMSAvICgoMSA8PCBiaXRzKSAtIDEpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIHRoaXMuI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCBzY2FsZSk7CiAgICAgIHNyY09mZnNldCArPSAzOwogICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxOwogICAgfQogIH0KICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSkgLyAzIHwgMDsKICB9Cn0KY2xhc3MgTGFiQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSkgewogICAgc3VwZXIoIkxhYiIsIDMpOwogICAgaWYgKCF3aGl0ZVBvaW50KSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIExhYiIpOwogICAgfQogICAgW3RoaXMuWFcsIHRoaXMuWVcsIHRoaXMuWlddID0gd2hpdGVQb2ludDsKICAgIFt0aGlzLmFtaW4sIHRoaXMuYW1heCwgdGhpcy5ibWluLCB0aGlzLmJtYXhdID0gcmFuZ2UgfHwgWy0xMDAsIDEwMCwgLTEwMCwgMTAwXTsKICAgIFt0aGlzLlhCLCB0aGlzLllCLCB0aGlzLlpCXSA9IGJsYWNrUG9pbnQgfHwgWzAsIDAsIDBdOwogICAgaWYgKHRoaXMuWFcgPCAwIHx8IHRoaXMuWlcgPCAwIHx8IHRoaXMuWVcgIT09IDEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cywgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIik7CiAgICB9CiAgICBpZiAodGhpcy5YQiA8IDAgfHwgdGhpcy5ZQiA8IDAgfHwgdGhpcy5aQiA8IDApIHsKICAgICAgaW5mbygiSW52YWxpZCBCbGFja1BvaW50LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCIpOwogICAgICB0aGlzLlhCID0gdGhpcy5ZQiA9IHRoaXMuWkIgPSAwOwogICAgfQogICAgaWYgKHRoaXMuYW1pbiA+IHRoaXMuYW1heCB8fCB0aGlzLmJtaW4gPiB0aGlzLmJtYXgpIHsKICAgICAgaW5mbygiSW52YWxpZCBSYW5nZSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHRzIik7CiAgICAgIHRoaXMuYW1pbiA9IC0xMDA7CiAgICAgIHRoaXMuYW1heCA9IDEwMDsKICAgICAgdGhpcy5ibWluID0gLTEwMDsKICAgICAgdGhpcy5ibWF4ID0gMTAwOwogICAgfQogIH0KICAjZm5fZyh4KSB7CiAgICByZXR1cm4geCA+PSA2IC8gMjkgPyB4ICoqIDMgOiAxMDggLyA4NDEgKiAoeCAtIDQgLyAyOSk7CiAgfQogICNkZWNvZGUodmFsdWUsIGhpZ2gxLCBsb3cyLCBoaWdoMikgewogICAgcmV0dXJuIGxvdzIgKyB2YWx1ZSAqIChoaWdoMiAtIGxvdzIpIC8gaGlnaDE7CiAgfQogICN0b1JnYihzcmMsIHNyY09mZnNldCwgbWF4VmFsLCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBsZXQgTHMgPSBzcmNbc3JjT2Zmc2V0XTsKICAgIGxldCBhcyA9IHNyY1tzcmNPZmZzZXQgKyAxXTsKICAgIGxldCBicyA9IHNyY1tzcmNPZmZzZXQgKyAyXTsKICAgIGlmIChtYXhWYWwgIT09IGZhbHNlKSB7CiAgICAgIExzID0gdGhpcy4jZGVjb2RlKExzLCBtYXhWYWwsIDAsIDEwMCk7CiAgICAgIGFzID0gdGhpcy4jZGVjb2RlKGFzLCBtYXhWYWwsIHRoaXMuYW1pbiwgdGhpcy5hbWF4KTsKICAgICAgYnMgPSB0aGlzLiNkZWNvZGUoYnMsIG1heFZhbCwgdGhpcy5ibWluLCB0aGlzLmJtYXgpOwogICAgfQogICAgaWYgKGFzID4gdGhpcy5hbWF4KSB7CiAgICAgIGFzID0gdGhpcy5hbWF4OwogICAgfSBlbHNlIGlmIChhcyA8IHRoaXMuYW1pbikgewogICAgICBhcyA9IHRoaXMuYW1pbjsKICAgIH0KICAgIGlmIChicyA+IHRoaXMuYm1heCkgewogICAgICBicyA9IHRoaXMuYm1heDsKICAgIH0gZWxzZSBpZiAoYnMgPCB0aGlzLmJtaW4pIHsKICAgICAgYnMgPSB0aGlzLmJtaW47CiAgICB9CiAgICBjb25zdCBNID0gKExzICsgMTYpIC8gMTE2OwogICAgY29uc3QgTCA9IE0gKyBhcyAvIDUwMDsKICAgIGNvbnN0IE4gPSBNIC0gYnMgLyAyMDA7CiAgICBjb25zdCBYID0gdGhpcy5YVyAqIHRoaXMuI2ZuX2coTCk7CiAgICBjb25zdCBZID0gdGhpcy5ZVyAqIHRoaXMuI2ZuX2coTSk7CiAgICBjb25zdCBaID0gdGhpcy5aVyAqIHRoaXMuI2ZuX2coTik7CiAgICBsZXQgciwgZywgYjsKICAgIGlmICh0aGlzLlpXIDwgMSkgewogICAgICByID0gWCAqIDMuMTMzOSArIFkgKiAtMS42MTcgKyBaICogLTAuNDkwNjsKICAgICAgZyA9IFggKiAtMC45Nzg1ICsgWSAqIDEuOTE2ICsgWiAqIDAuMDMzMzsKICAgICAgYiA9IFggKiAwLjA3MiArIFkgKiAtMC4yMjkgKyBaICogMS40MDU3OwogICAgfSBlbHNlIHsKICAgICAgciA9IFggKiAzLjI0MDYgKyBZICogLTEuNTM3MiArIFogKiAtMC40OTg2OwogICAgICBnID0gWCAqIC0wLjk2ODkgKyBZICogMS44NzU4ICsgWiAqIDAuMDQxNTsKICAgICAgYiA9IFggKiAwLjA1NTcgKyBZICogLTAuMjA0ICsgWiAqIDEuMDU3OwogICAgfQogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IE1hdGguc3FydChyKSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gTWF0aC5zcXJ0KGcpICogMjU1OwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSBNYXRoLnNxcnQoYikgKiAyNTU7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIHRoaXMuI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCBmYWxzZSwgZGVzdCwgZGVzdE9mZnNldCk7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IG1heFZhbCA9ICgxIDw8IGJpdHMpIC0gMTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgbWF4VmFsLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICAgICAgc3JjT2Zmc2V0ICs9IDM7CiAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKSAvIDMgfCAwOwogIH0KICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBnZXQgdXNlc1plcm9Ub09uZVJhbmdlKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidXNlc1plcm9Ub09uZVJhbmdlIiwgZmFsc2UpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvaWNjX2NvbG9yc3BhY2UuanMKCgoKCmZ1bmN0aW9uIGZldGNoU3luYyh1cmwpIHsKICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICB4aHIub3BlbigiR0VUIiwgdXJsLCBmYWxzZSk7CiAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgeGhyLnNlbmQobnVsbCk7CiAgcmV0dXJuIHhoci5yZXNwb25zZTsKfQpjbGFzcyBJY2NDb2xvclNwYWNlIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgI3RyYW5zZm9ybWVyOwogICNjb252ZXJ0UGl4ZWw7CiAgc3RhdGljICN1c2VXYXNtID0gdHJ1ZTsKICBzdGF0aWMgI3dhc21VcmwgPSBudWxsOwogIHN0YXRpYyAjZmluYWxpemVyID0gbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHRyYW5zZm9ybWVyID0+IHsKICAgIHFjbXNfZHJvcF90cmFuc2Zvcm1lcih0cmFuc2Zvcm1lcik7CiAgfSk7CiAgY29uc3RydWN0b3IoaWNjUHJvZmlsZSwgbmFtZSwgbnVtQ29tcHMpIHsKICAgIGlmICghSWNjQ29sb3JTcGFjZS5pc1VzYWJsZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vIElDQyBjb2xvciBzcGFjZSBzdXBwb3J0Iik7CiAgICB9CiAgICBzdXBlcihuYW1lLCBudW1Db21wcyk7CiAgICBsZXQgaW5UeXBlOwogICAgc3dpdGNoIChudW1Db21wcykgewogICAgICBjYXNlIDE6CiAgICAgICAgaW5UeXBlID0gRGF0YVR5cGUuR3JheTg7CiAgICAgICAgdGhpcy4jY29udmVydFBpeGVsID0gKHNyYywgc3JjT2Zmc2V0KSA9PiBxY21zX2NvbnZlcnRfb25lKHRoaXMuI3RyYW5zZm9ybWVyLCBzcmNbc3JjT2Zmc2V0XSAqIDI1NSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBpblR5cGUgPSBEYXRhVHlwZS5SR0I4OwogICAgICAgIHRoaXMuI2NvbnZlcnRQaXhlbCA9IChzcmMsIHNyY09mZnNldCkgPT4gcWNtc19jb252ZXJ0X3RocmVlKHRoaXMuI3RyYW5zZm9ybWVyLCBzcmNbc3JjT2Zmc2V0XSAqIDI1NSwgc3JjW3NyY09mZnNldCArIDFdICogMjU1LCBzcmNbc3JjT2Zmc2V0ICsgMl0gKiAyNTUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDQ6CiAgICAgICAgaW5UeXBlID0gRGF0YVR5cGUuQ01ZSzsKICAgICAgICB0aGlzLiNjb252ZXJ0UGl4ZWwgPSAoc3JjLCBzcmNPZmZzZXQpID0+IHFjbXNfY29udmVydF9mb3VyKHRoaXMuI3RyYW5zZm9ybWVyLCBzcmNbc3JjT2Zmc2V0XSAqIDI1NSwgc3JjW3NyY09mZnNldCArIDFdICogMjU1LCBzcmNbc3JjT2Zmc2V0ICsgMl0gKiAyNTUsIHNyY1tzcmNPZmZzZXQgKyAzXSAqIDI1NSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBudW1iZXIgb2YgY29tcG9uZW50czogJHtudW1Db21wc31gKTsKICAgIH0KICAgIHRoaXMuI3RyYW5zZm9ybWVyID0gcWNtc190cmFuc2Zvcm1lcl9mcm9tX21lbW9yeShpY2NQcm9maWxlLCBpblR5cGUsIEludGVudC5QZXJjZXB0dWFsKTsKICAgIGlmICghdGhpcy4jdHJhbnNmb3JtZXIpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIElDQyBjb2xvciBzcGFjZSIpOwogICAgfQogICAgSWNjQ29sb3JTcGFjZS4jZmluYWxpemVyLnJlZ2lzdGVyKHRoaXMsIHRoaXMuI3RyYW5zZm9ybWVyKTsKICB9CiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgUUNNUy5fZGVzdEJ1ZmZlciA9IGRlc3Quc3ViYXJyYXkoZGVzdE9mZnNldCwgZGVzdE9mZnNldCArIDMpOwogICAgdGhpcy4jY29udmVydFBpeGVsKHNyYywgc3JjT2Zmc2V0KTsKICAgIFFDTVMuX2Rlc3RCdWZmZXIgPSBudWxsOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBzcmMgPSBzcmMuc3ViYXJyYXkoc3JjT2Zmc2V0LCBzcmNPZmZzZXQgKyBjb3VudCAqIHRoaXMubnVtQ29tcHMpOwogICAgaWYgKGJpdHMgIT09IDgpIHsKICAgICAgY29uc3Qgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBzcmNbaV0gKj0gc2NhbGU7CiAgICAgIH0KICAgIH0KICAgIFFDTVMuX211c3RBZGRBbHBoYSA9IGFscGhhMDEgJiYgZGVzdC5idWZmZXIgPT09IHNyYy5idWZmZXI7CiAgICBRQ01TLl9kZXN0QnVmZmVyID0gZGVzdC5zdWJhcnJheShkZXN0T2Zmc2V0LCBkZXN0T2Zmc2V0ICsgY291bnQgKiAoMyArIGFscGhhMDEpKTsKICAgIHFjbXNfY29udmVydF9hcnJheSh0aGlzLiN0cmFuc2Zvcm1lciwgc3JjKTsKICAgIFFDTVMuX211c3RBZGRBbHBoYSA9IGZhbHNlOwogICAgUUNNUy5fZGVzdEJ1ZmZlciA9IG51bGw7CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoIC8gdGhpcy5udW1Db21wcyAqICgzICsgYWxwaGEwMSkgfCAwOwogIH0KICBzdGF0aWMgc2V0T3B0aW9ucyh7CiAgICB1c2VXYXNtLAogICAgdXNlV29ya2VyRmV0Y2gsCiAgICB3YXNtVXJsCiAgfSkgewogICAgaWYgKCF1c2VXb3JrZXJGZXRjaCkgewogICAgICB0aGlzLiN1c2VXYXNtID0gZmFsc2U7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuI3VzZVdhc20gPSB1c2VXYXNtOwogICAgdGhpcy4jd2FzbVVybCA9IHdhc21Vcmw7CiAgfQogIHN0YXRpYyBnZXQgaXNVc2FibGUoKSB7CiAgICBsZXQgaXNVc2FibGUgPSBmYWxzZTsKICAgIGlmICh0aGlzLiN1c2VXYXNtKSB7CiAgICAgIGlmICh0aGlzLiN3YXNtVXJsKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMuX21vZHVsZSA9IFFDTVMuX21vZHVsZSA9IGluaXRTeW5jKHsKICAgICAgICAgICAgbW9kdWxlOiBmZXRjaFN5bmMoYCR7dGhpcy4jd2FzbVVybH1xY21zX2JnLndhc21gKQogICAgICAgICAgfSk7CiAgICAgICAgICBpc1VzYWJsZSA9ICEhdGhpcy5fbW9kdWxlOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHdhcm4oYElDQ0Jhc2VkIGNvbG9yIHNwYWNlOiAiJHtlfSIuYCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIk5vIElDQyBjb2xvciBzcGFjZSBzdXBwb3J0IGR1ZSB0byBtaXNzaW5nIGB3YXNtVXJsYCBBUEkgb3B0aW9uIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImlzVXNhYmxlIiwgaXNVc2FibGUpOwogIH0KfQpjbGFzcyBDbXlrSUNDQmFzZWRDUyBleHRlbmRzIEljY0NvbG9yU3BhY2UgewogIHN0YXRpYyAjaWNjVXJsOwogIGNvbnN0cnVjdG9yKCkgewogICAgY29uc3QgaWNjUHJvZmlsZSA9IG5ldyBVaW50OEFycmF5KGZldGNoU3luYyhgJHtDbXlrSUNDQmFzZWRDUy4jaWNjVXJsfUNHQVRTMDAxQ29tcGF0LXYyLW1pY3JvLmljY2ApKTsKICAgIHN1cGVyKGljY1Byb2ZpbGUsICJEZXZpY2VDTVlLIiwgNCk7CiAgfQogIHN0YXRpYyBzZXRPcHRpb25zKHsKICAgIGljY1VybAogIH0pIHsKICAgIHRoaXMuI2ljY1VybCA9IGljY1VybDsKICB9CiAgc3RhdGljIGdldCBpc1VzYWJsZSgpIHsKICAgIGxldCBpc1VzYWJsZSA9IGZhbHNlOwogICAgaWYgKEljY0NvbG9yU3BhY2UuaXNVc2FibGUpIHsKICAgICAgaWYgKHRoaXMuI2ljY1VybCkgewogICAgICAgIGlzVXNhYmxlID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3YXJuKCJObyBDTVlLIElDQyBwcm9maWxlIHN1cHBvcnQgZHVlIHRvIG1pc3NpbmcgYGljY1VybGAgQVBJIG9wdGlvbiIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc1VzYWJsZSIsIGlzVXNhYmxlKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3N0cmVhbS5qcwoKCmNsYXNzIFN0cmVhbSBleHRlbmRzIEJhc2VTdHJlYW0gewogIGNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5ieXRlcyA9IGFycmF5QnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGFycmF5QnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpOwogICAgdGhpcy5zdGFydCA9IHN0YXJ0IHx8IDA7CiAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7CiAgICB0aGlzLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIHx8IHRoaXMuYnl0ZXMubGVuZ3RoOwogICAgdGhpcy5kaWN0ID0gZGljdDsKICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLmVuZCAtIHRoaXMuc3RhcnQ7CiAgfQogIGdldCBpc0VtcHR5KCkgewogICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwOwogIH0KICBnZXRCeXRlKCkgewogICAgaWYgKHRoaXMucG9zID49IHRoaXMuZW5kKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMucG9zKytdOwogIH0KICBnZXRCeXRlcyhsZW5ndGgpIHsKICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlczsKICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOwogICAgY29uc3Qgc3RyRW5kID0gdGhpcy5lbmQ7CiAgICBpZiAoIWxlbmd0aCkgewogICAgICByZXR1cm4gYnl0ZXMuc3ViYXJyYXkocG9zLCBzdHJFbmQpOwogICAgfQogICAgbGV0IGVuZCA9IHBvcyArIGxlbmd0aDsKICAgIGlmIChlbmQgPiBzdHJFbmQpIHsKICAgICAgZW5kID0gc3RyRW5kOwogICAgfQogICAgdGhpcy5wb3MgPSBlbmQ7CiAgICByZXR1cm4gYnl0ZXMuc3ViYXJyYXkocG9zLCBlbmQpOwogIH0KICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkgewogICAgaWYgKGJlZ2luIDwgMCkgewogICAgICBiZWdpbiA9IDA7CiAgICB9CiAgICBpZiAoZW5kID4gdGhpcy5lbmQpIHsKICAgICAgZW5kID0gdGhpcy5lbmQ7CiAgICB9CiAgICByZXR1cm4gdGhpcy5ieXRlcy5zdWJhcnJheShiZWdpbiwgZW5kKTsKICB9CiAgcmVzZXQoKSB7CiAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7CiAgfQogIG1vdmVTdGFydCgpIHsKICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvczsKICB9CiAgbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0ID0gbnVsbCkgewogICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5ieXRlcy5idWZmZXIsIHN0YXJ0LCBsZW5ndGgsIGRpY3QpOwogIH0KfQpjbGFzcyBTdHJpbmdTdHJlYW0gZXh0ZW5kcyBTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0cikgewogICAgc3VwZXIoc3RyaW5nVG9CeXRlcyhzdHIpKTsKICB9Cn0KY2xhc3MgTnVsbFN0cmVhbSBleHRlbmRzIFN0cmVhbSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcihuZXcgVWludDhBcnJheSgwKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jaHVua2VkX3N0cmVhbS5qcwoKCgpjbGFzcyBDaHVua2VkU3RyZWFtIGV4dGVuZHMgU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihsZW5ndGgsIGNodW5rU2l6ZSwgbWFuYWdlcikgewogICAgc3VwZXIobmV3IFVpbnQ4QXJyYXkobGVuZ3RoKSwgMCwgbGVuZ3RoLCBudWxsKTsKICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplOwogICAgdGhpcy5fbG9hZGVkQ2h1bmtzID0gbmV3IFNldCgpOwogICAgdGhpcy5udW1DaHVua3MgPSBNYXRoLmNlaWwobGVuZ3RoIC8gY2h1bmtTaXplKTsKICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7CiAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IDA7CiAgICB0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rID0gLTE7CiAgfQogIGdldE1pc3NpbmdDaHVua3MoKSB7CiAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgIGZvciAobGV0IGNodW5rID0gMCwgbiA9IHRoaXMubnVtQ2h1bmtzOyBjaHVuayA8IG47ICsrY2h1bmspIHsKICAgICAgaWYgKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKSkgewogICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNodW5rczsKICB9CiAgZ2V0IG51bUNodW5rc0xvYWRlZCgpIHsKICAgIHJldHVybiB0aGlzLl9sb2FkZWRDaHVua3Muc2l6ZTsKICB9CiAgZ2V0IGlzRGF0YUxvYWRlZCgpIHsKICAgIHJldHVybiB0aGlzLm51bUNodW5rc0xvYWRlZCA9PT0gdGhpcy5udW1DaHVua3M7CiAgfQogIG9uUmVjZWl2ZURhdGEoYmVnaW4sIGNodW5rKSB7CiAgICBjb25zdCBjaHVua1NpemUgPSB0aGlzLmNodW5rU2l6ZTsKICAgIGlmIChiZWdpbiAlIGNodW5rU2l6ZSAhPT0gMCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYEJhZCBiZWdpbiBvZmZzZXQ6ICR7YmVnaW59YCk7CiAgICB9CiAgICBjb25zdCBlbmQgPSBiZWdpbiArIGNodW5rLmJ5dGVMZW5ndGg7CiAgICBpZiAoZW5kICUgY2h1bmtTaXplICE9PSAwICYmIGVuZCAhPT0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYWQgZW5kIG9mZnNldDogJHtlbmR9YCk7CiAgICB9CiAgICB0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShjaHVuayksIGJlZ2luKTsKICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKGJlZ2luIC8gY2h1bmtTaXplKTsKICAgIGNvbnN0IGVuZENodW5rID0gTWF0aC5mbG9vcigoZW5kIC0gMSkgLyBjaHVua1NpemUpICsgMTsKICAgIGZvciAobGV0IGN1ckNodW5rID0gYmVnaW5DaHVuazsgY3VyQ2h1bmsgPCBlbmRDaHVuazsgKytjdXJDaHVuaykgewogICAgICB0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGN1ckNodW5rKTsKICAgIH0KICB9CiAgb25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGRhdGEpIHsKICAgIGxldCBwb3NpdGlvbiA9IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoOwogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IocG9zaXRpb24gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICB0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShkYXRhKSwgcG9zaXRpb24pOwogICAgcG9zaXRpb24gKz0gZGF0YS5ieXRlTGVuZ3RoOwogICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBwb3NpdGlvbjsKICAgIGNvbnN0IGVuZENodW5rID0gcG9zaXRpb24gPj0gdGhpcy5lbmQgPyB0aGlzLm51bUNodW5rcyA6IE1hdGguZmxvb3IocG9zaXRpb24gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICBmb3IgKGxldCBjdXJDaHVuayA9IGJlZ2luQ2h1bms7IGN1ckNodW5rIDwgZW5kQ2h1bms7ICsrY3VyQ2h1bmspIHsKICAgICAgdGhpcy5fbG9hZGVkQ2h1bmtzLmFkZChjdXJDaHVuayk7CiAgICB9CiAgfQogIGVuc3VyZUJ5dGUocG9zKSB7CiAgICBpZiAocG9zIDwgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgY2h1bmsgPSBNYXRoLmZsb29yKHBvcyAvIHRoaXMuY2h1bmtTaXplKTsKICAgIGlmIChjaHVuayA+IHRoaXMubnVtQ2h1bmtzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChjaHVuayA9PT0gdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuaykgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgIHRocm93IG5ldyBNaXNzaW5nRGF0YUV4Y2VwdGlvbihwb3MsIHBvcyArIDEpOwogICAgfQogICAgdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuayA9IGNodW5rOwogIH0KICBlbnN1cmVSYW5nZShiZWdpbiwgZW5kKSB7CiAgICBpZiAoYmVnaW4gPj0gZW5kKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChlbmQgPD0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICBpZiAoYmVnaW5DaHVuayA+IHRoaXMubnVtQ2h1bmtzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGVuZENodW5rID0gTWF0aC5taW4oTWF0aC5mbG9vcigoZW5kIC0gMSkgLyB0aGlzLmNodW5rU2l6ZSkgKyAxLCB0aGlzLm51bUNodW5rcyk7CiAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKICAgICAgaWYgKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKSkgewogICAgICAgIHRocm93IG5ldyBNaXNzaW5nRGF0YUV4Y2VwdGlvbihiZWdpbiwgZW5kKTsKICAgICAgfQogICAgfQogIH0KICBuZXh0RW1wdHlDaHVuayhiZWdpbkNodW5rKSB7CiAgICBjb25zdCBudW1DaHVua3MgPSB0aGlzLm51bUNodW5rczsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ2h1bmtzOyArK2kpIHsKICAgICAgY29uc3QgY2h1bmsgPSAoYmVnaW5DaHVuayArIGkpICUgbnVtQ2h1bmtzOwogICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgICAgcmV0dXJuIGNodW5rOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaGFzQ2h1bmsoY2h1bmspIHsKICAgIHJldHVybiB0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGNodW5rKTsKICB9CiAgZ2V0Qnl0ZSgpIHsKICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOwogICAgaWYgKHBvcyA+PSB0aGlzLmVuZCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAocG9zID49IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CiAgICAgIHRoaXMuZW5zdXJlQnl0ZShwb3MpOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK107CiAgfQogIGdldEJ5dGVzKGxlbmd0aCkgewogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgcG9zID0gdGhpcy5wb3M7CiAgICBjb25zdCBzdHJFbmQgPSB0aGlzLmVuZDsKICAgIGlmICghbGVuZ3RoKSB7CiAgICAgIGlmIChzdHJFbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICAgIHRoaXMuZW5zdXJlUmFuZ2UocG9zLCBzdHJFbmQpOwogICAgICB9CiAgICAgIHJldHVybiBieXRlcy5zdWJhcnJheShwb3MsIHN0ckVuZCk7CiAgICB9CiAgICBsZXQgZW5kID0gcG9zICsgbGVuZ3RoOwogICAgaWYgKGVuZCA+IHN0ckVuZCkgewogICAgICBlbmQgPSBzdHJFbmQ7CiAgICB9CiAgICBpZiAoZW5kID4gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgdGhpcy5lbnN1cmVSYW5nZShwb3MsIGVuZCk7CiAgICB9CiAgICB0aGlzLnBvcyA9IGVuZDsKICAgIHJldHVybiBieXRlcy5zdWJhcnJheShwb3MsIGVuZCk7CiAgfQogIGdldEJ5dGVSYW5nZShiZWdpbiwgZW5kKSB7CiAgICBpZiAoYmVnaW4gPCAwKSB7CiAgICAgIGJlZ2luID0gMDsKICAgIH0KICAgIGlmIChlbmQgPiB0aGlzLmVuZCkgewogICAgICBlbmQgPSB0aGlzLmVuZDsKICAgIH0KICAgIGlmIChlbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICB0aGlzLmVuc3VyZVJhbmdlKGJlZ2luLCBlbmQpOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoYmVnaW4sIGVuZCk7CiAgfQogIG1ha2VTdWJTdHJlYW0oc3RhcnQsIGxlbmd0aCwgZGljdCA9IG51bGwpIHsKICAgIGlmIChsZW5ndGgpIHsKICAgICAgaWYgKHN0YXJ0ICsgbGVuZ3RoID4gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgICB0aGlzLmVuc3VyZVJhbmdlKHN0YXJ0LCBzdGFydCArIGxlbmd0aCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RhcnQgPj0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgdGhpcy5lbnN1cmVCeXRlKHN0YXJ0KTsKICAgIH0KICAgIGZ1bmN0aW9uIENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKSB7fQogICAgQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHRoaXMpOwogICAgQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUuZ2V0TWlzc2luZ0NodW5rcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgY29uc3QgY2h1bmtTaXplID0gdGhpcy5jaHVua1NpemU7CiAgICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSBNYXRoLmZsb29yKHRoaXMuc3RhcnQgLyBjaHVua1NpemUpOwogICAgICBjb25zdCBlbmRDaHVuayA9IE1hdGguZmxvb3IoKHRoaXMuZW5kIC0gMSkgLyBjaHVua1NpemUpICsgMTsKICAgICAgY29uc3QgbWlzc2luZ0NodW5rcyA9IFtdOwogICAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgICAgICBtaXNzaW5nQ2h1bmtzLnB1c2goY2h1bmspOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbWlzc2luZ0NodW5rczsKICAgIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGUsICJpc0RhdGFMb2FkZWQiLCB7CiAgICAgIGdldCgpIHsKICAgICAgICBpZiAodGhpcy5udW1DaHVua3NMb2FkZWQgPT09IHRoaXMubnVtQ2h1bmtzKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWlzc2luZ0NodW5rcygpLmxlbmd0aCA9PT0gMDsKICAgICAgfSwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKICAgIGNvbnN0IHN1YlN0cmVhbSA9IG5ldyBDaHVua2VkU3RyZWFtU3Vic3RyZWFtKCk7CiAgICBzdWJTdHJlYW0ucG9zID0gc3ViU3RyZWFtLnN0YXJ0ID0gc3RhcnQ7CiAgICBzdWJTdHJlYW0uZW5kID0gc3RhcnQgKyBsZW5ndGggfHwgdGhpcy5lbmQ7CiAgICBzdWJTdHJlYW0uZGljdCA9IGRpY3Q7CiAgICByZXR1cm4gc3ViU3RyZWFtOwogIH0KICBnZXRCYXNlU3RyZWFtcygpIHsKICAgIHJldHVybiBbdGhpc107CiAgfQp9CmNsYXNzIENodW5rZWRTdHJlYW1NYW5hZ2VyIHsKICBjb25zdHJ1Y3RvcihwZGZOZXR3b3JrU3RyZWFtLCBhcmdzKSB7CiAgICB0aGlzLmxlbmd0aCA9IGFyZ3MubGVuZ3RoOwogICAgdGhpcy5jaHVua1NpemUgPSBhcmdzLnJhbmdlQ2h1bmtTaXplOwogICAgdGhpcy5zdHJlYW0gPSBuZXcgQ2h1bmtlZFN0cmVhbSh0aGlzLmxlbmd0aCwgdGhpcy5jaHVua1NpemUsIHRoaXMpOwogICAgdGhpcy5wZGZOZXR3b3JrU3RyZWFtID0gcGRmTmV0d29ya1N0cmVhbTsKICAgIHRoaXMuZGlzYWJsZUF1dG9GZXRjaCA9IGFyZ3MuZGlzYWJsZUF1dG9GZXRjaDsKICAgIHRoaXMubXNnSGFuZGxlciA9IGFyZ3MubXNnSGFuZGxlcjsKICAgIHRoaXMuY3VyclJlcXVlc3RJZCA9IDA7CiAgICB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdCA9IG5ldyBNYXAoKTsKICAgIHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoID0gMDsKICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlOwogICAgdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogIH0KICBzZW5kUmVxdWVzdChiZWdpbiwgZW5kKSB7CiAgICBjb25zdCByYW5nZVJlYWRlciA9IHRoaXMucGRmTmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKTsKICAgIGlmICghcmFuZ2VSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKICAgICAgcmFuZ2VSZWFkZXIub25Qcm9ncmVzcyA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMpOwogICAgfQogICAgbGV0IGNodW5rcyA9IFtdLAogICAgICBsb2FkZWQgPSAwOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgY29uc3QgcmVhZENodW5rID0gKHsKICAgICAgICB2YWx1ZSwKICAgICAgICBkb25lCiAgICAgIH0pID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgICAgY29uc3QgY2h1bmtEYXRhID0gYXJyYXlCdWZmZXJzVG9CeXRlcyhjaHVua3MpOwogICAgICAgICAgICBjaHVua3MgPSBudWxsOwogICAgICAgICAgICByZXNvbHZlKGNodW5rRGF0YSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGxvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoOwogICAgICAgICAgaWYgKHJhbmdlUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkKSB7CiAgICAgICAgICAgIHRoaXMub25Qcm9ncmVzcyh7CiAgICAgICAgICAgICAgbG9hZGVkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgY2h1bmtzLnB1c2godmFsdWUpOwogICAgICAgICAgcmFuZ2VSZWFkZXIucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTsKICAgIH0pLnRoZW4oZGF0YSA9PiB7CiAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5vblJlY2VpdmVEYXRhKHsKICAgICAgICBjaHVuazogZGF0YSwKICAgICAgICBiZWdpbgogICAgICB9KTsKICAgIH0pOwogIH0KICByZXF1ZXN0QWxsQ2h1bmtzKG5vRmV0Y2ggPSBmYWxzZSkgewogICAgaWYgKCFub0ZldGNoKSB7CiAgICAgIGNvbnN0IG1pc3NpbmdDaHVua3MgPSB0aGlzLnN0cmVhbS5nZXRNaXNzaW5nQ2h1bmtzKCk7CiAgICAgIHRoaXMuX3JlcXVlc3RDaHVua3MobWlzc2luZ0NodW5rcyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5wcm9taXNlOwogIH0KICBfcmVxdWVzdENodW5rcyhjaHVua3MpIHsKICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuY3VyclJlcXVlc3RJZCsrOwogICAgY29uc3QgY2h1bmtzTmVlZGVkID0gbmV3IFNldCgpOwogICAgdGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0LnNldChyZXF1ZXN0SWQsIGNodW5rc05lZWRlZCk7CiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykgewogICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGNodW5rKSkgewogICAgICAgIGNodW5rc05lZWRlZC5hZGQoY2h1bmspOwogICAgICB9CiAgICB9CiAgICBpZiAoY2h1bmtzTmVlZGVkLnNpemUgPT09IDApIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgfQogICAgY29uc3QgY2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2FwYWJpbGl0eSk7CiAgICBjb25zdCBjaHVua3NUb1JlcXVlc3QgPSBbXTsKICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzTmVlZGVkKSB7CiAgICAgIGxldCByZXF1ZXN0SWRzID0gdGhpcy5fcmVxdWVzdHNCeUNodW5rLmdldChjaHVuayk7CiAgICAgIGlmICghcmVxdWVzdElkcykgewogICAgICAgIHJlcXVlc3RJZHMgPSBbXTsKICAgICAgICB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuc2V0KGNodW5rLCByZXF1ZXN0SWRzKTsKICAgICAgICBjaHVua3NUb1JlcXVlc3QucHVzaChjaHVuayk7CiAgICAgIH0KICAgICAgcmVxdWVzdElkcy5wdXNoKHJlcXVlc3RJZCk7CiAgICB9CiAgICBpZiAoY2h1bmtzVG9SZXF1ZXN0Lmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgZ3JvdXBlZENodW5rc1RvUmVxdWVzdCA9IHRoaXMuZ3JvdXBDaHVua3MoY2h1bmtzVG9SZXF1ZXN0KTsKICAgICAgZm9yIChjb25zdCBncm91cGVkQ2h1bmsgb2YgZ3JvdXBlZENodW5rc1RvUmVxdWVzdCkgewogICAgICAgIGNvbnN0IGJlZ2luID0gZ3JvdXBlZENodW5rLmJlZ2luQ2h1bmsgKiB0aGlzLmNodW5rU2l6ZTsKICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihncm91cGVkQ2h1bmsuZW5kQ2h1bmsgKiB0aGlzLmNodW5rU2l6ZSwgdGhpcy5sZW5ndGgpOwogICAgICAgIHRoaXMuc2VuZFJlcXVlc3QoYmVnaW4sIGVuZCkuY2F0Y2goY2FwYWJpbGl0eS5yZWplY3QpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKHJlYXNvbiA9PiB7CiAgICAgIGlmICh0aGlzLmFib3J0ZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGdldFN0cmVhbSgpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbTsKICB9CiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIGVuZCA9IE1hdGgubWluKGVuZCwgdGhpcy5sZW5ndGgpOwogICAgY29uc3QgYmVnaW5DaHVuayA9IHRoaXMuZ2V0QmVnaW5DaHVuayhiZWdpbik7CiAgICBjb25zdCBlbmRDaHVuayA9IHRoaXMuZ2V0RW5kQ2h1bmsoZW5kKTsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgZm9yIChsZXQgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7CiAgICAgIGNodW5rcy5wdXNoKGNodW5rKTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKGNodW5rcyk7CiAgfQogIHJlcXVlc3RSYW5nZXMocmFuZ2VzID0gW10pIHsKICAgIGNvbnN0IGNodW5rc1RvUmVxdWVzdCA9IFtdOwogICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHsKICAgICAgY29uc3QgYmVnaW5DaHVuayA9IHRoaXMuZ2V0QmVnaW5DaHVuayhyYW5nZS5iZWdpbik7CiAgICAgIGNvbnN0IGVuZENodW5rID0gdGhpcy5nZXRFbmRDaHVuayhyYW5nZS5lbmQpOwogICAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKICAgICAgICBpZiAoIWNodW5rc1RvUmVxdWVzdC5pbmNsdWRlcyhjaHVuaykpIHsKICAgICAgICAgIGNodW5rc1RvUmVxdWVzdC5wdXNoKGNodW5rKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNodW5rc1RvUmVxdWVzdC5zb3J0KChhLCBiKSA9PiBhIC0gYik7CiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyhjaHVua3NUb1JlcXVlc3QpOwogIH0KICBncm91cENodW5rcyhjaHVua3MpIHsKICAgIGNvbnN0IGdyb3VwZWRDaHVua3MgPSBbXTsKICAgIGxldCBiZWdpbkNodW5rID0gLTE7CiAgICBsZXQgcHJldkNodW5rID0gLTE7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBjaHVuayA9IGNodW5rc1tpXTsKICAgICAgaWYgKGJlZ2luQ2h1bmsgPCAwKSB7CiAgICAgICAgYmVnaW5DaHVuayA9IGNodW5rOwogICAgICB9CiAgICAgIGlmIChwcmV2Q2h1bmsgPj0gMCAmJiBwcmV2Q2h1bmsgKyAxICE9PSBjaHVuaykgewogICAgICAgIGdyb3VwZWRDaHVua3MucHVzaCh7CiAgICAgICAgICBiZWdpbkNodW5rLAogICAgICAgICAgZW5kQ2h1bms6IHByZXZDaHVuayArIDEKICAgICAgICB9KTsKICAgICAgICBiZWdpbkNodW5rID0gY2h1bms7CiAgICAgIH0KICAgICAgaWYgKGkgKyAxID09PSBjaHVua3MubGVuZ3RoKSB7CiAgICAgICAgZ3JvdXBlZENodW5rcy5wdXNoKHsKICAgICAgICAgIGJlZ2luQ2h1bmssCiAgICAgICAgICBlbmRDaHVuazogY2h1bmsgKyAxCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcHJldkNodW5rID0gY2h1bms7CiAgICB9CiAgICByZXR1cm4gZ3JvdXBlZENodW5rczsKICB9CiAgb25Qcm9ncmVzcyhhcmdzKSB7CiAgICB0aGlzLm1zZ0hhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLCB7CiAgICAgIGxvYWRlZDogdGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkICogdGhpcy5jaHVua1NpemUgKyBhcmdzLmxvYWRlZCwKICAgICAgdG90YWw6IHRoaXMubGVuZ3RoCiAgICB9KTsKICB9CiAgb25SZWNlaXZlRGF0YShhcmdzKSB7CiAgICBjb25zdCBjaHVuayA9IGFyZ3MuY2h1bms7CiAgICBjb25zdCBpc1Byb2dyZXNzaXZlID0gYXJncy5iZWdpbiA9PT0gdW5kZWZpbmVkOwogICAgY29uc3QgYmVnaW4gPSBpc1Byb2dyZXNzaXZlID8gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggOiBhcmdzLmJlZ2luOwogICAgY29uc3QgZW5kID0gYmVnaW4gKyBjaHVuay5ieXRlTGVuZ3RoOwogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICBjb25zdCBlbmRDaHVuayA9IGVuZCA8IHRoaXMubGVuZ3RoID8gTWF0aC5mbG9vcihlbmQgLyB0aGlzLmNodW5rU2l6ZSkgOiBNYXRoLmNlaWwoZW5kIC8gdGhpcy5jaHVua1NpemUpOwogICAgaWYgKGlzUHJvZ3Jlc3NpdmUpIHsKICAgICAgdGhpcy5zdHJlYW0ub25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGNodW5rKTsKICAgICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBlbmQ7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnN0cmVhbS5vblJlY2VpdmVEYXRhKGJlZ2luLCBjaHVuayk7CiAgICB9CiAgICBpZiAodGhpcy5zdHJlYW0uaXNEYXRhTG9hZGVkKSB7CiAgICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVzb2x2ZSh0aGlzLnN0cmVhbSk7CiAgICB9CiAgICBjb25zdCBsb2FkZWRSZXF1ZXN0cyA9IFtdOwogICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7CiAgICAgIGNvbnN0IHJlcXVlc3RJZHMgPSB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGN1ckNodW5rKTsKICAgICAgaWYgKCFyZXF1ZXN0SWRzKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdGhpcy5fcmVxdWVzdHNCeUNodW5rLmRlbGV0ZShjdXJDaHVuayk7CiAgICAgIGZvciAoY29uc3QgcmVxdWVzdElkIG9mIHJlcXVlc3RJZHMpIHsKICAgICAgICBjb25zdCBjaHVua3NOZWVkZWQgPSB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QuZ2V0KHJlcXVlc3RJZCk7CiAgICAgICAgaWYgKGNodW5rc05lZWRlZC5oYXMoY3VyQ2h1bmspKSB7CiAgICAgICAgICBjaHVua3NOZWVkZWQuZGVsZXRlKGN1ckNodW5rKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNodW5rc05lZWRlZC5zaXplID4gMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxvYWRlZFJlcXVlc3RzLnB1c2gocmVxdWVzdElkKTsKICAgICAgfQogICAgfQogICAgaWYgKCF0aGlzLmRpc2FibGVBdXRvRmV0Y2ggJiYgdGhpcy5fcmVxdWVzdHNCeUNodW5rLnNpemUgPT09IDApIHsKICAgICAgbGV0IG5leHRFbXB0eUNodW5rOwogICAgICBpZiAodGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkID09PSAxKSB7CiAgICAgICAgY29uc3QgbGFzdENodW5rID0gdGhpcy5zdHJlYW0ubnVtQ2h1bmtzIC0gMTsKICAgICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGxhc3RDaHVuaykpIHsKICAgICAgICAgIG5leHRFbXB0eUNodW5rID0gbGFzdENodW5rOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBuZXh0RW1wdHlDaHVuayA9IHRoaXMuc3RyZWFtLm5leHRFbXB0eUNodW5rKGVuZENodW5rKTsKICAgICAgfQogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihuZXh0RW1wdHlDaHVuaykpIHsKICAgICAgICB0aGlzLl9yZXF1ZXN0Q2h1bmtzKFtuZXh0RW1wdHlDaHVua10pOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHJlcXVlc3RJZCBvZiBsb2FkZWRSZXF1ZXN0cykgewogICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZ2V0KHJlcXVlc3RJZCk7CiAgICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmRlbGV0ZShyZXF1ZXN0SWQpOwogICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTsKICAgIH0KICAgIHRoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIsIHsKICAgICAgbG9hZGVkOiB0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQgKiB0aGlzLmNodW5rU2l6ZSwKICAgICAgdG90YWw6IHRoaXMubGVuZ3RoCiAgICB9KTsKICB9CiAgb25FcnJvcihlcnIpIHsKICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVqZWN0KGVycik7CiAgfQogIGdldEJlZ2luQ2h1bmsoYmVnaW4pIHsKICAgIHJldHVybiBNYXRoLmZsb29yKGJlZ2luIC8gdGhpcy5jaHVua1NpemUpOwogIH0KICBnZXRFbmRDaHVuayhlbmQpIHsKICAgIHJldHVybiBNYXRoLmZsb29yKChlbmQgLSAxKSAvIHRoaXMuY2h1bmtTaXplKSArIDE7CiAgfQogIGFib3J0KHJlYXNvbikgewogICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTsKICAgIHRoaXMucGRmTmV0d29ya1N0cmVhbT8uY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKTsKICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC52YWx1ZXMoKSkgewogICAgICBjYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL3NoYXJlZC9pbWFnZV91dGlscy5qcwoKZnVuY3Rpb24gY29udmVydFRvUkdCQShwYXJhbXMpIHsKICBzd2l0Y2ggKHBhcmFtcy5raW5kKSB7CiAgICBjYXNlIEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDoKICAgICAgcmV0dXJuIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHBhcmFtcyk7CiAgICBjYXNlIEltYWdlS2luZC5SR0JfMjRCUFA6CiAgICAgIHJldHVybiBjb252ZXJ0UkdCVG9SR0JBKHBhcmFtcyk7CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHsKICBzcmMsCiAgc3JjUG9zID0gMCwKICBkZXN0LAogIHdpZHRoLAogIGhlaWdodCwKICBub25CbGFja0NvbG9yID0gMHhmZmZmZmZmZiwKICBpbnZlcnNlRGVjb2RlID0gZmFsc2UKfSkgewogIGNvbnN0IGJsYWNrID0gRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweGZmMDAwMDAwIDogMHgwMDAwMDBmZjsKICBjb25zdCBbemVyb01hcHBpbmcsIG9uZU1hcHBpbmddID0gaW52ZXJzZURlY29kZSA/IFtub25CbGFja0NvbG9yLCBibGFja10gOiBbYmxhY2ssIG5vbkJsYWNrQ29sb3JdOwogIGNvbnN0IHdpZHRoSW5Tb3VyY2UgPSB3aWR0aCA+PiAzOwogIGNvbnN0IHdpZHRoUmVtYWluZGVyID0gd2lkdGggJiA3OwogIGNvbnN0IHNyY0xlbmd0aCA9IHNyYy5sZW5ndGg7CiAgZGVzdCA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7CiAgbGV0IGRlc3RQb3MgPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIGZvciAoY29uc3QgbWF4ID0gc3JjUG9zICsgd2lkdGhJblNvdXJjZTsgc3JjUG9zIDwgbWF4OyBzcmNQb3MrKykgewogICAgICBjb25zdCBlbGVtID0gc3JjUG9zIDwgc3JjTGVuZ3RoID8gc3JjW3NyY1Bvc10gOiAyNTU7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgfQogICAgaWYgKHdpZHRoUmVtYWluZGVyID09PSAwKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgZWxlbSA9IHNyY1BvcyA8IHNyY0xlbmd0aCA/IHNyY1tzcmNQb3MrK10gOiAyNTU7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHdpZHRoUmVtYWluZGVyOyBqKyspIHsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDEgPDwgNyAtIGogPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICB9CiAgfQogIHJldHVybiB7CiAgICBzcmNQb3MsCiAgICBkZXN0UG9zCiAgfTsKfQpmdW5jdGlvbiBjb252ZXJ0UkdCVG9SR0JBKHsKICBzcmMsCiAgc3JjUG9zID0gMCwKICBkZXN0LAogIGRlc3RQb3MgPSAwLAogIHdpZHRoLAogIGhlaWdodAp9KSB7CiAgbGV0IGkgPSAwOwogIGNvbnN0IGxlbiA9IHdpZHRoICogaGVpZ2h0ICogMzsKICBjb25zdCBsZW4zMiA9IGxlbiA+PiAyOwogIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIsIHNyY1BvcywgbGVuMzIpOwogIGlmIChGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikgewogICAgZm9yICg7IGkgPCBsZW4zMiAtIDI7IGkgKz0gMywgZGVzdFBvcyArPSA0KSB7CiAgICAgIGNvbnN0IHMxID0gc3JjMzJbaV07CiAgICAgIGNvbnN0IHMyID0gc3JjMzJbaSArIDFdOwogICAgICBjb25zdCBzMyA9IHNyYzMyW2kgKyAyXTsKICAgICAgZGVzdFtkZXN0UG9zXSA9IHMxIHwgMHhmZjAwMDAwMDsKICAgICAgZGVzdFtkZXN0UG9zICsgMV0gPSBzMSA+Pj4gMjQgfCBzMiA8PCA4IHwgMHhmZjAwMDAwMDsKICAgICAgZGVzdFtkZXN0UG9zICsgMl0gPSBzMiA+Pj4gMTYgfCBzMyA8PCAxNiB8IDB4ZmYwMDAwMDA7CiAgICAgIGRlc3RbZGVzdFBvcyArIDNdID0gczMgPj4+IDggfCAweGZmMDAwMDAwOwogICAgfQogICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyY1BvcyArIGxlbjsgaiA8IGpqOyBqICs9IDMpIHsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW2pdIHwgc3JjW2ogKyAxXSA8PCA4IHwgc3JjW2ogKyAyXSA8PCAxNiB8IDB4ZmYwMDAwMDA7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoOyBpIDwgbGVuMzIgLSAyOyBpICs9IDMsIGRlc3RQb3MgKz0gNCkgewogICAgICBjb25zdCBzMSA9IHNyYzMyW2ldOwogICAgICBjb25zdCBzMiA9IHNyYzMyW2kgKyAxXTsKICAgICAgY29uc3QgczMgPSBzcmMzMltpICsgMl07CiAgICAgIGRlc3RbZGVzdFBvc10gPSBzMSB8IDB4ZmY7CiAgICAgIGRlc3RbZGVzdFBvcyArIDFdID0gczEgPDwgMjQgfCBzMiA+Pj4gOCB8IDB4ZmY7CiAgICAgIGRlc3RbZGVzdFBvcyArIDJdID0gczIgPDwgMTYgfCBzMyA+Pj4gMTYgfCAweGZmOwogICAgICBkZXN0W2Rlc3RQb3MgKyAzXSA9IHMzIDw8IDggfCAweGZmOwogICAgfQogICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyY1BvcyArIGxlbjsgaiA8IGpqOyBqICs9IDMpIHsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW2pdIDw8IDI0IHwgc3JjW2ogKyAxXSA8PCAxNiB8IHNyY1tqICsgMl0gPDwgOCB8IDB4ZmY7CiAgICB9CiAgfQogIHJldHVybiB7CiAgICBzcmNQb3M6IHNyY1BvcyArIGxlbiwKICAgIGRlc3RQb3MKICB9Owp9CmZ1bmN0aW9uIGdyYXlUb1JHQkEoc3JjLCBkZXN0KSB7CiAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0W2ldID0gc3JjW2ldICogMHgxMDEwMSB8IDB4ZmYwMDAwMDA7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGRlc3RbaV0gPSBzcmNbaV0gKiAweDEwMTAxMDAgfCAweDAwMDAwMGZmOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvaW1hZ2VfcmVzaXplci5qcwoKCgpjb25zdCBNSU5fSU1BR0VfRElNID0gMjA0ODsKY29uc3QgTUFYX0lNQUdFX0RJTSA9IDY1NTM3Owpjb25zdCBNQVhfRVJST1IgPSAxMjg7CmNsYXNzIEltYWdlUmVzaXplciB7CiAgc3RhdGljICNnb29kU3F1YXJlTGVuZ3RoID0gTUlOX0lNQUdFX0RJTTsKICBzdGF0aWMgI2lzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkID0gRmVhdHVyZVRlc3QuaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQ7CiAgY29uc3RydWN0b3IoaW1nRGF0YSwgaXNNYXNrKSB7CiAgICB0aGlzLl9pbWdEYXRhID0gaW1nRGF0YTsKICAgIHRoaXMuX2lzTWFzayA9IGlzTWFzazsKICB9CiAgc3RhdGljIGdldCBjYW5Vc2VJbWFnZURlY29kZXIoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjYW5Vc2VJbWFnZURlY29kZXIiLCB0aGlzLiNpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA/IEltYWdlRGVjb2Rlci5pc1R5cGVTdXBwb3J0ZWQoImltYWdlL2JtcCIpIDogUHJvbWlzZS5yZXNvbHZlKGZhbHNlKSk7CiAgfQogIHN0YXRpYyBuZWVkc1RvQmVSZXNpemVkKHdpZHRoLCBoZWlnaHQpIHsKICAgIGlmICh3aWR0aCA8PSB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoICYmIGhlaWdodCA8PSB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgTUFYX0RJTQogICAgfSA9IHRoaXM7CiAgICBpZiAod2lkdGggPiBNQVhfRElNIHx8IGhlaWdodCA+IE1BWF9ESU0pIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdCBhcmVhID0gd2lkdGggKiBoZWlnaHQ7CiAgICBpZiAodGhpcy5faGFzTWF4QXJlYSkgewogICAgICByZXR1cm4gYXJlYSA+IHRoaXMuTUFYX0FSRUE7CiAgICB9CiAgICBpZiAoYXJlYSA8IHRoaXMuI2dvb2RTcXVhcmVMZW5ndGggKiogMikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy5fYXJlR29vZERpbXMod2lkdGgsIGhlaWdodCkpIHsKICAgICAgdGhpcy4jZ29vZFNxdWFyZUxlbmd0aCA9IE1hdGgubWF4KHRoaXMuI2dvb2RTcXVhcmVMZW5ndGgsIE1hdGguZmxvb3IoTWF0aC5zcXJ0KHdpZHRoICogaGVpZ2h0KSkpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoID0gdGhpcy5fZ3Vlc3NNYXgodGhpcy4jZ29vZFNxdWFyZUxlbmd0aCwgTUFYX0RJTSwgTUFYX0VSUk9SLCAwKTsKICAgIGNvbnN0IG1heEFyZWEgPSB0aGlzLk1BWF9BUkVBID0gdGhpcy4jZ29vZFNxdWFyZUxlbmd0aCAqKiAyOwogICAgcmV0dXJuIGFyZWEgPiBtYXhBcmVhOwogIH0KICBzdGF0aWMgZ2V0IE1BWF9ESU0oKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJNQVhfRElNIiwgdGhpcy5fZ3Vlc3NNYXgoTUlOX0lNQUdFX0RJTSwgTUFYX0lNQUdFX0RJTSwgMCwgMSkpOwogIH0KICBzdGF0aWMgZ2V0IE1BWF9BUkVBKCkgewogICAgdGhpcy5faGFzTWF4QXJlYSA9IHRydWU7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJNQVhfQVJFQSIsIHRoaXMuX2d1ZXNzTWF4KHRoaXMuI2dvb2RTcXVhcmVMZW5ndGgsIHRoaXMuTUFYX0RJTSwgTUFYX0VSUk9SLCAwKSAqKiAyKTsKICB9CiAgc3RhdGljIHNldCBNQVhfQVJFQShhcmVhKSB7CiAgICBpZiAoYXJlYSA+PSAwKSB7CiAgICAgIHRoaXMuX2hhc01heEFyZWEgPSB0cnVlOwogICAgICBzaGFkb3codGhpcywgIk1BWF9BUkVBIiwgYXJlYSk7CiAgICB9CiAgfQogIHN0YXRpYyBzZXRPcHRpb25zKHsKICAgIGNhbnZhc01heEFyZWFJbkJ5dGVzID0gLTEsCiAgICBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA9IGZhbHNlCiAgfSkgewogICAgaWYgKCF0aGlzLl9oYXNNYXhBcmVhKSB7CiAgICAgIHRoaXMuTUFYX0FSRUEgPSBjYW52YXNNYXhBcmVhSW5CeXRlcyA+PiAyOwogICAgfQogICAgdGhpcy4jaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPSBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICB9CiAgc3RhdGljIF9hcmVHb29kRGltcyh3aWR0aCwgaGVpZ2h0KSB7CiAgICB0cnkgewogICAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpOwogICAgICBjb25zdCBvcGFjaXR5ID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhWzNdOwogICAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gMTsKICAgICAgcmV0dXJuIG9wYWNpdHkgIT09IDA7CiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBzdGF0aWMgX2d1ZXNzTWF4KHN0YXJ0LCBlbmQsIHRvbGVyYW5jZSwgZGVmYXVsdEhlaWdodCkgewogICAgd2hpbGUgKHN0YXJ0ICsgdG9sZXJhbmNlICsgMSA8IGVuZCkgewogICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKChzdGFydCArIGVuZCkgLyAyKTsKICAgICAgY29uc3QgaGVpZ2h0ID0gZGVmYXVsdEhlaWdodCB8fCBtaWRkbGU7CiAgICAgIGlmICh0aGlzLl9hcmVHb29kRGltcyhtaWRkbGUsIGhlaWdodCkpIHsKICAgICAgICBzdGFydCA9IG1pZGRsZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbmQgPSBtaWRkbGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdGFydDsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZUltYWdlKGltZ0RhdGEsIGlzTWFzayA9IGZhbHNlKSB7CiAgICByZXR1cm4gbmV3IEltYWdlUmVzaXplcihpbWdEYXRhLCBpc01hc2spLl9jcmVhdGVJbWFnZSgpOwogIH0KICBhc3luYyBfY3JlYXRlSW1hZ2UoKSB7CiAgICBjb25zdCB7CiAgICAgIF9pbWdEYXRhOiBpbWdEYXRhCiAgICB9ID0gdGhpczsKICAgIGNvbnN0IHsKICAgICAgd2lkdGgsCiAgICAgIGhlaWdodAogICAgfSA9IGltZ0RhdGE7CiAgICBpZiAod2lkdGggKiBoZWlnaHQgKiA0ID4gTUFYX0lOVF8zMikgewogICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNyZXNjYWxlSW1hZ2VEYXRhKCk7CiAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9CiAgICBjb25zdCBkYXRhID0gdGhpcy5fZW5jb2RlQk1QKCk7CiAgICBsZXQgZGVjb2RlciwgaW1hZ2VQcm9taXNlOwogICAgaWYgKGF3YWl0IEltYWdlUmVzaXplci5jYW5Vc2VJbWFnZURlY29kZXIpIHsKICAgICAgZGVjb2RlciA9IG5ldyBJbWFnZURlY29kZXIoewogICAgICAgIGRhdGEsCiAgICAgICAgdHlwZTogImltYWdlL2JtcCIsCiAgICAgICAgcHJlZmVyQW5pbWF0aW9uOiBmYWxzZSwKICAgICAgICB0cmFuc2ZlcjogW2RhdGEuYnVmZmVyXQogICAgICB9KTsKICAgICAgaW1hZ2VQcm9taXNlID0gZGVjb2Rlci5kZWNvZGUoKS5jYXRjaChyZWFzb24gPT4gewogICAgICAgIHdhcm4oYEJNUCBpbWFnZSBkZWNvZGluZyBmYWlsZWQ6ICR7cmVhc29ufWApOwogICAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChuZXcgQmxvYihbdGhpcy5fZW5jb2RlQk1QKCkuYnVmZmVyXSwgewogICAgICAgICAgdHlwZTogImltYWdlL2JtcCIKICAgICAgICB9KSk7CiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gewogICAgICAgIGRlY29kZXIuY2xvc2UoKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBpbWFnZVByb21pc2UgPSBjcmVhdGVJbWFnZUJpdG1hcChuZXcgQmxvYihbZGF0YS5idWZmZXJdLCB7CiAgICAgICAgdHlwZTogImltYWdlL2JtcCIKICAgICAgfSkpOwogICAgfQogICAgY29uc3QgewogICAgICBNQVhfQVJFQSwKICAgICAgTUFYX0RJTQogICAgfSA9IEltYWdlUmVzaXplcjsKICAgIGNvbnN0IG1pbkZhY3RvciA9IE1hdGgubWF4KHdpZHRoIC8gTUFYX0RJTSwgaGVpZ2h0IC8gTUFYX0RJTSwgTWF0aC5zcXJ0KHdpZHRoICogaGVpZ2h0IC8gTUFYX0FSRUEpKTsKICAgIGNvbnN0IGZpcnN0RmFjdG9yID0gTWF0aC5tYXgobWluRmFjdG9yLCAyKTsKICAgIGNvbnN0IGZhY3RvciA9IE1hdGgucm91bmQoMTAgKiAobWluRmFjdG9yICsgMS4yNSkpIC8gMTAgLyBmaXJzdEZhY3RvcjsKICAgIGNvbnN0IE4gPSBNYXRoLmZsb29yKE1hdGgubG9nMihmYWN0b3IpKTsKICAgIGNvbnN0IHN0ZXBzID0gbmV3IEFycmF5KE4gKyAyKS5maWxsKDIpOwogICAgc3RlcHNbMF0gPSBmaXJzdEZhY3RvcjsKICAgIHN0ZXBzLnNwbGljZSgtMSwgMSwgZmFjdG9yIC8gKDEgPDwgTikpOwogICAgbGV0IG5ld1dpZHRoID0gd2lkdGg7CiAgICBsZXQgbmV3SGVpZ2h0ID0gaGVpZ2h0OwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW1hZ2VQcm9taXNlOwogICAgbGV0IGJpdG1hcCA9IHJlc3VsdC5pbWFnZSB8fCByZXN1bHQ7CiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHsKICAgICAgY29uc3QgcHJldldpZHRoID0gbmV3V2lkdGg7CiAgICAgIGNvbnN0IHByZXZIZWlnaHQgPSBuZXdIZWlnaHQ7CiAgICAgIG5ld1dpZHRoID0gTWF0aC5mbG9vcihuZXdXaWR0aCAvIHN0ZXApIC0gMTsKICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5mbG9vcihuZXdIZWlnaHQgLyBzdGVwKSAtIDE7CiAgICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3V2lkdGgsIG5ld0hlaWdodCk7CiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCwgcHJldldpZHRoLCBwcmV2SGVpZ2h0LCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKICAgICAgYml0bWFwLmNsb3NlKCk7CiAgICAgIGJpdG1hcCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTsKICAgIH0KICAgIGltZ0RhdGEuZGF0YSA9IG51bGw7CiAgICBpbWdEYXRhLmJpdG1hcCA9IGJpdG1hcDsKICAgIGltZ0RhdGEud2lkdGggPSBuZXdXaWR0aDsKICAgIGltZ0RhdGEuaGVpZ2h0ID0gbmV3SGVpZ2h0OwogICAgcmV0dXJuIGltZ0RhdGE7CiAgfQogICNyZXNjYWxlSW1hZ2VEYXRhKCkgewogICAgY29uc3QgewogICAgICBfaW1nRGF0YTogaW1nRGF0YQogICAgfSA9IHRoaXM7CiAgICBjb25zdCB7CiAgICAgIGRhdGEsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGtpbmQKICAgIH0gPSBpbWdEYXRhOwogICAgY29uc3QgcmdiYVNpemUgPSB3aWR0aCAqIGhlaWdodCAqIDQ7CiAgICBjb25zdCBLID0gTWF0aC5jZWlsKE1hdGgubG9nMihyZ2JhU2l6ZSAvIE1BWF9JTlRfMzIpKTsKICAgIGNvbnN0IG5ld1dpZHRoID0gd2lkdGggPj4gSzsKICAgIGNvbnN0IG5ld0hlaWdodCA9IGhlaWdodCA+PiBLOwogICAgbGV0IHJnYmFEYXRhOwogICAgbGV0IG1heEhlaWdodCA9IGhlaWdodDsKICAgIHRyeSB7CiAgICAgIHJnYmFEYXRhID0gbmV3IFVpbnQ4QXJyYXkocmdiYVNpemUpOwogICAgfSBjYXRjaCB7CiAgICAgIGxldCBuID0gTWF0aC5mbG9vcihNYXRoLmxvZzIocmdiYVNpemUgKyAxKSk7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJnYmFEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMiAqKiBuIC0gMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIG4gLT0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5mbG9vcigoMiAqKiBuIC0gMSkgLyAod2lkdGggKiA0KSk7CiAgICAgIGNvbnN0IG5ld1NpemUgPSB3aWR0aCAqIG1heEhlaWdodCAqIDQ7CiAgICAgIGlmIChuZXdTaXplIDwgcmdiYURhdGEubGVuZ3RoKSB7CiAgICAgICAgcmdiYURhdGEgPSBuZXcgVWludDhBcnJheShuZXdTaXplKTsKICAgICAgfQogICAgfQogICAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkocmdiYURhdGEuYnVmZmVyKTsKICAgIGNvbnN0IGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShuZXdXaWR0aCAqIG5ld0hlaWdodCk7CiAgICBsZXQgc3JjUG9zID0gMDsKICAgIGxldCBuZXdJbmRleCA9IDA7CiAgICBjb25zdCBzdGVwID0gTWF0aC5jZWlsKGhlaWdodCAvIG1heEhlaWdodCk7CiAgICBjb25zdCByZW1haW5kZXIgPSBoZWlnaHQgJSBtYXhIZWlnaHQgPT09IDAgPyBoZWlnaHQgOiBoZWlnaHQgJSBtYXhIZWlnaHQ7CiAgICBmb3IgKGxldCBrID0gMDsgayA8IHN0ZXA7IGsrKykgewogICAgICBjb25zdCBoID0gayA8IHN0ZXAgLSAxID8gbWF4SGVpZ2h0IDogcmVtYWluZGVyOwogICAgICAoewogICAgICAgIHNyY1BvcwogICAgICB9ID0gY29udmVydFRvUkdCQSh7CiAgICAgICAga2luZCwKICAgICAgICBzcmM6IGRhdGEsCiAgICAgICAgZGVzdDogc3JjMzIsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgIGludmVyc2VEZWNvZGU6IHRoaXMuX2lzTWFzaywKICAgICAgICBzcmNQb3MKICAgICAgfSkpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoID4+IEs7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgYnVmID0gc3JjMzIuc3ViYXJyYXkoKGkgPDwgSykgKiB3aWR0aCk7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdXaWR0aDsgaisrKSB7CiAgICAgICAgICBkZXN0MzJbbmV3SW5kZXgrK10gPSBidWZbaiA8PCBLXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChJbWFnZVJlc2l6ZXIubmVlZHNUb0JlUmVzaXplZChuZXdXaWR0aCwgbmV3SGVpZ2h0KSkgewogICAgICBpbWdEYXRhLmRhdGEgPSBkZXN0MzI7CiAgICAgIGltZ0RhdGEud2lkdGggPSBuZXdXaWR0aDsKICAgICAgaW1nRGF0YS5oZWlnaHQgPSBuZXdIZWlnaHQ7CiAgICAgIGltZ0RhdGEua2luZCA9IEltYWdlS2luZC5SR0JBXzMyQlBQOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3V2lkdGgsIG5ld0hlaWdodCk7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZQogICAgfSk7CiAgICBjdHgucHV0SW1hZ2VEYXRhKG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRlc3QzMi5idWZmZXIpLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KSwgMCwgMCk7CiAgICBpbWdEYXRhLmRhdGEgPSBudWxsOwogICAgaW1nRGF0YS5iaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICBpbWdEYXRhLndpZHRoID0gbmV3V2lkdGg7CiAgICBpbWdEYXRhLmhlaWdodCA9IG5ld0hlaWdodDsKICAgIHJldHVybiBpbWdEYXRhOwogIH0KICBfZW5jb2RlQk1QKCkgewogICAgY29uc3QgewogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBraW5kCiAgICB9ID0gdGhpcy5faW1nRGF0YTsKICAgIGxldCBkYXRhID0gdGhpcy5faW1nRGF0YS5kYXRhOwogICAgbGV0IGJpdFBlclBpeGVsOwogICAgbGV0IGNvbG9yVGFibGUgPSBuZXcgVWludDhBcnJheSgwKTsKICAgIGxldCBtYXNrVGFibGUgPSBjb2xvclRhYmxlOwogICAgbGV0IGNvbXByZXNzaW9uID0gMDsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDoKICAgICAgICB7CiAgICAgICAgICBiaXRQZXJQaXhlbCA9IDE7CiAgICAgICAgICBjb2xvclRhYmxlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5faXNNYXNrID8gWzI1NSwgMjU1LCAyNTUsIDI1NSwgMCwgMCwgMCwgMF0gOiBbMCwgMCwgMCwgMCwgMjU1LCAyNTUsIDI1NSwgMjU1XSk7CiAgICAgICAgICBjb25zdCByb3dMZW4gPSB3aWR0aCArIDcgPj4gMzsKICAgICAgICAgIGNvbnN0IHJvd1NpemUgPSByb3dMZW4gKyAzICYgLTQ7CiAgICAgICAgICBpZiAocm93TGVuICE9PSByb3dTaXplKSB7CiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDhBcnJheShyb3dTaXplICogaGVpZ2h0KTsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoZWlnaHQgKiByb3dMZW47IGkgPCBpaTsgaSArPSByb3dMZW4sIGsgKz0gcm93U2l6ZSkgewogICAgICAgICAgICAgIG5ld0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoaSwgaSArIHJvd0xlbiksIGspOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGEgPSBuZXdEYXRhOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIEltYWdlS2luZC5SR0JfMjRCUFA6CiAgICAgICAgewogICAgICAgICAgYml0UGVyUGl4ZWwgPSAyNDsKICAgICAgICAgIGlmICh3aWR0aCAmIDMpIHsKICAgICAgICAgICAgY29uc3Qgcm93TGVuID0gMyAqIHdpZHRoOwogICAgICAgICAgICBjb25zdCByb3dTaXplID0gcm93TGVuICsgMyAmIC00OwogICAgICAgICAgICBjb25zdCBleHRyYUxlbiA9IHJvd1NpemUgLSByb3dMZW47CiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDhBcnJheShyb3dTaXplICogaGVpZ2h0KTsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoZWlnaHQgKiByb3dMZW47IGkgPCBpaTsgaSArPSByb3dMZW4pIHsKICAgICAgICAgICAgICBjb25zdCByb3cgPSBkYXRhLnN1YmFycmF5KGksIGkgKyByb3dMZW4pOwogICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93TGVuOyBqICs9IDMpIHsKICAgICAgICAgICAgICAgIG5ld0RhdGFbaysrXSA9IHJvd1tqICsgMl07CiAgICAgICAgICAgICAgICBuZXdEYXRhW2srK10gPSByb3dbaiArIDFdOwogICAgICAgICAgICAgICAgbmV3RGF0YVtrKytdID0gcm93W2pdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBrICs9IGV4dHJhTGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGEgPSBuZXdEYXRhOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7CiAgICAgICAgICAgICAgY29uc3QgdG1wID0gZGF0YVtpXTsKICAgICAgICAgICAgICBkYXRhW2ldID0gZGF0YVtpICsgMl07CiAgICAgICAgICAgICAgZGF0YVtpICsgMl0gPSB0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBJbWFnZUtpbmQuUkdCQV8zMkJQUDoKICAgICAgICBiaXRQZXJQaXhlbCA9IDMyOwogICAgICAgIGNvbXByZXNzaW9uID0gMzsKICAgICAgICBtYXNrVGFibGUgPSBuZXcgVWludDhBcnJheSg0ICsgNCArIDQgKyA0ICsgNTIpOwogICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcobWFza1RhYmxlLmJ1ZmZlcik7CiAgICAgICAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMigwLCAweDAwMDAwMGZmLCB0cnVlKTsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDQsIDB4MDAwMGZmMDAsIHRydWUpOwogICAgICAgICAgdmlldy5zZXRVaW50MzIoOCwgMHgwMGZmMDAwMCwgdHJ1ZSk7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMigxMiwgMHhmZjAwMDAwMCwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDAsIDB4ZmYwMDAwMDAsIHRydWUpOwogICAgICAgICAgdmlldy5zZXRVaW50MzIoNCwgMHgwMGZmMDAwMCwgdHJ1ZSk7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMig4LCAweDAwMDBmZjAwLCB0cnVlKTsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDEyLCAweDAwMDAwMGZmLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdCIpOwogICAgfQogICAgbGV0IGkgPSAwOwogICAgY29uc3QgaGVhZGVyTGVuZ3RoID0gNDAgKyBtYXNrVGFibGUubGVuZ3RoOwogICAgY29uc3QgZmlsZUxlbmd0aCA9IDE0ICsgaGVhZGVyTGVuZ3RoICsgY29sb3JUYWJsZS5sZW5ndGggKyBkYXRhLmxlbmd0aDsKICAgIGNvbnN0IGJtcERhdGEgPSBuZXcgVWludDhBcnJheShmaWxlTGVuZ3RoKTsKICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYm1wRGF0YS5idWZmZXIpOwogICAgdmlldy5zZXRVaW50MTYoaSwgMHg0ZDQyLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDMyKGksIGZpbGVMZW5ndGgsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRVaW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQzMihpLCAxNCArIGhlYWRlckxlbmd0aCArIGNvbG9yVGFibGUubGVuZ3RoLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0VWludDMyKGksIGhlYWRlckxlbmd0aCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldEludDMyKGksIHdpZHRoLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0SW50MzIoaSwgLWhlaWdodCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQxNihpLCAxLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDE2KGksIGJpdFBlclBpeGVsLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDMyKGksIGNvbXByZXNzaW9uLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0VWludDMyKGksIDAsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRJbnQzMihpLCAwLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0SW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQzMihpLCBjb2xvclRhYmxlLmxlbmd0aCAvIDQsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRVaW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICBibXBEYXRhLnNldChtYXNrVGFibGUsIGkpOwogICAgaSArPSBtYXNrVGFibGUubGVuZ3RoOwogICAgYm1wRGF0YS5zZXQoY29sb3JUYWJsZSwgaSk7CiAgICBpICs9IGNvbG9yVGFibGUubGVuZ3RoOwogICAgYm1wRGF0YS5zZXQoZGF0YSwgaSk7CiAgICByZXR1cm4gYm1wRGF0YTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2RlY29kZV9zdHJlYW0uanMKCgpjb25zdCBlbXB0eUJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDApOwpjbGFzcyBEZWNvZGVTdHJlYW0gZXh0ZW5kcyBCYXNlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihtYXliZU1pbkJ1ZmZlckxlbmd0aCkgewogICAgc3VwZXIoKTsKICAgIHRoaXMuX3Jhd01pbkJ1ZmZlckxlbmd0aCA9IG1heWJlTWluQnVmZmVyTGVuZ3RoIHx8IDA7CiAgICB0aGlzLnBvcyA9IDA7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7CiAgICB0aGlzLmVvZiA9IGZhbHNlOwogICAgdGhpcy5idWZmZXIgPSBlbXB0eUJ1ZmZlcjsKICAgIHRoaXMubWluQnVmZmVyTGVuZ3RoID0gNTEyOwogICAgaWYgKG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7CiAgICAgIHdoaWxlICh0aGlzLm1pbkJ1ZmZlckxlbmd0aCA8IG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7CiAgICAgICAgdGhpcy5taW5CdWZmZXJMZW5ndGggKj0gMjsKICAgICAgfQogICAgfQogIH0KICBnZXQgaXNFbXB0eSgpIHsKICAgIHdoaWxlICghdGhpcy5lb2YgJiYgdGhpcy5idWZmZXJMZW5ndGggPT09IDApIHsKICAgICAgdGhpcy5yZWFkQmxvY2soKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmJ1ZmZlckxlbmd0aCA9PT0gMDsKICB9CiAgZW5zdXJlQnVmZmVyKHJlcXVlc3RlZCkgewogICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICBpZiAocmVxdWVzdGVkIDw9IGJ1ZmZlci5ieXRlTGVuZ3RoKSB7CiAgICAgIHJldHVybiBidWZmZXI7CiAgICB9CiAgICBsZXQgc2l6ZSA9IHRoaXMubWluQnVmZmVyTGVuZ3RoOwogICAgd2hpbGUgKHNpemUgPCByZXF1ZXN0ZWQpIHsKICAgICAgc2l6ZSAqPSAyOwogICAgfQogICAgY29uc3QgYnVmZmVyMiA9IG5ldyBVaW50OEFycmF5KHNpemUpOwogICAgYnVmZmVyMi5zZXQoYnVmZmVyKTsKICAgIHJldHVybiB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjI7CiAgfQogIGdldEJ5dGUoKSB7CiAgICBjb25zdCBwb3MgPSB0aGlzLnBvczsKICAgIHdoaWxlICh0aGlzLmJ1ZmZlckxlbmd0aCA8PSBwb3MpIHsKICAgICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrK107CiAgfQogIGdldEJ5dGVzKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMgPSBudWxsKSB7CiAgICBjb25zdCBwb3MgPSB0aGlzLnBvczsKICAgIGxldCBlbmQ7CiAgICBpZiAobGVuZ3RoKSB7CiAgICAgIHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIGxlbmd0aCk7CiAgICAgIGVuZCA9IHBvcyArIGxlbmd0aDsKICAgICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA8IGVuZCkgewogICAgICAgIHRoaXMucmVhZEJsb2NrKGRlY29kZXJPcHRpb25zKTsKICAgICAgfQogICAgICBjb25zdCBidWZFbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgICAgaWYgKGVuZCA+IGJ1ZkVuZCkgewogICAgICAgIGVuZCA9IGJ1ZkVuZDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd2hpbGUgKCF0aGlzLmVvZikgewogICAgICAgIHRoaXMucmVhZEJsb2NrKGRlY29kZXJPcHRpb25zKTsKICAgICAgfQogICAgICBlbmQgPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIH0KICAgIHRoaXMucG9zID0gZW5kOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyLnN1YmFycmF5KHBvcywgZW5kKTsKICB9CiAgYXN5bmMgZ2V0SW1hZ2VEYXRhKGxlbmd0aCwgZGVjb2Rlck9wdGlvbnMpIHsKICAgIGlmICghdGhpcy5jYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcikgewogICAgICBpZiAodGhpcy5pc0FzeW5jRGVjb2RlcikgewogICAgICAgIHJldHVybiB0aGlzLmRlY29kZUltYWdlKG51bGwsIGRlY29kZXJPcHRpb25zKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGRlY29kZXJPcHRpb25zKTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnN0cmVhbS5hc3luY0dldEJ5dGVzKCk7CiAgICByZXR1cm4gdGhpcy5kZWNvZGVJbWFnZShkYXRhLCBkZWNvZGVyT3B0aW9ucyk7CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5wb3MgPSAwOwogIH0KICBtYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QgPSBudWxsKSB7CiAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHsKICAgICAgd2hpbGUgKCF0aGlzLmVvZikgewogICAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOwogICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gZW5kICYmICF0aGlzLmVvZikgewogICAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU3RyZWFtKHRoaXMuYnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KTsKICB9CiAgZ2V0QmFzZVN0cmVhbXMoKSB7CiAgICByZXR1cm4gdGhpcy5zdHIgPyB0aGlzLnN0ci5nZXRCYXNlU3RyZWFtcygpIDogbnVsbDsKICB9Cn0KY2xhc3MgU3RyZWFtc1NlcXVlbmNlU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHJlYW1zLCBvbkVycm9yID0gbnVsbCkgewogICAgc3RyZWFtcyA9IHN0cmVhbXMuZmlsdGVyKHMgPT4gcyBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pOwogICAgbGV0IG1heWJlTGVuZ3RoID0gMDsKICAgIGZvciAoY29uc3Qgc3RyZWFtIG9mIHN0cmVhbXMpIHsKICAgICAgbWF5YmVMZW5ndGggKz0gc3RyZWFtIGluc3RhbmNlb2YgRGVjb2RlU3RyZWFtID8gc3RyZWFtLl9yYXdNaW5CdWZmZXJMZW5ndGggOiBzdHJlYW0ubGVuZ3RoOwogICAgfQogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHJlYW1zID0gc3RyZWFtczsKICAgIHRoaXMuX29uRXJyb3IgPSBvbkVycm9yOwogIH0KICByZWFkQmxvY2soKSB7CiAgICBjb25zdCBzdHJlYW1zID0gdGhpcy5zdHJlYW1zOwogICAgaWYgKHN0cmVhbXMubGVuZ3RoID09PSAwKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtcy5zaGlmdCgpOwogICAgbGV0IGNodW5rOwogICAgdHJ5IHsKICAgICAgY2h1bmsgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICBpZiAodGhpcy5fb25FcnJvcikgewogICAgICAgIHRoaXMuX29uRXJyb3IocmVhc29uLCBzdHJlYW0uZGljdD8ub2JqSWQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyByZWFzb247CiAgICB9CiAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGNvbnN0IG5ld0xlbmd0aCA9IGJ1ZmZlckxlbmd0aCArIGNodW5rLmxlbmd0aDsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKG5ld0xlbmd0aCk7CiAgICBidWZmZXIuc2V0KGNodW5rLCBidWZmZXJMZW5ndGgpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7CiAgfQogIGdldEJhc2VTdHJlYW1zKCkgewogICAgY29uc3QgYmFzZVN0cmVhbXNCdWYgPSBbXTsKICAgIGZvciAoY29uc3Qgc3RyZWFtIG9mIHRoaXMuc3RyZWFtcykgewogICAgICBjb25zdCBiYXNlU3RyZWFtcyA9IHN0cmVhbS5nZXRCYXNlU3RyZWFtcygpOwogICAgICBpZiAoYmFzZVN0cmVhbXMpIHsKICAgICAgICBiYXNlU3RyZWFtc0J1Zi5wdXNoKC4uLmJhc2VTdHJlYW1zKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJhc2VTdHJlYW1zQnVmLmxlbmd0aCA+IDAgPyBiYXNlU3RyZWFtc0J1ZiA6IG51bGw7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jb2xvcnNwYWNlX3V0aWxzLmpzCgoKCgoKY2xhc3MgQ29sb3JTcGFjZVV0aWxzIHsKICBzdGF0aWMgcGFyc2UoewogICAgY3MsCiAgICB4cmVmLAogICAgcmVzb3VyY2VzID0gbnVsbCwKICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLAogICAgYXN5bmNJZk5vdENhY2hlZCA9IGZhbHNlCiAgfSkgewogICAgY29uc3Qgb3B0aW9ucyA9IHsKICAgICAgeHJlZiwKICAgICAgcmVzb3VyY2VzLAogICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgIH07CiAgICBsZXQgY3NOYW1lLCBjc1JlZiwgcGFyc2VkQ1M7CiAgICBpZiAoY3MgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgY3NSZWYgPSBjczsKICAgICAgY29uc3QgY2FjaGVkQ1MgPSBnbG9iYWxDb2xvclNwYWNlQ2FjaGUuZ2V0QnlSZWYoY3NSZWYpIHx8IGxvY2FsQ29sb3JTcGFjZUNhY2hlLmdldEJ5UmVmKGNzUmVmKTsKICAgICAgaWYgKGNhY2hlZENTKSB7CiAgICAgICAgcmV0dXJuIGNhY2hlZENTOwogICAgICB9CiAgICAgIGNzID0geHJlZi5mZXRjaChjcyk7CiAgICB9CiAgICBpZiAoY3MgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIGNzTmFtZSA9IGNzLm5hbWU7CiAgICAgIGNvbnN0IGNhY2hlZENTID0gbG9jYWxDb2xvclNwYWNlQ2FjaGUuZ2V0QnlOYW1lKGNzTmFtZSk7CiAgICAgIGlmIChjYWNoZWRDUykgewogICAgICAgIHJldHVybiBjYWNoZWRDUzsKICAgICAgfQogICAgfQogICAgdHJ5IHsKICAgICAgcGFyc2VkQ1MgPSB0aGlzLiNwYXJzZShjcywgb3B0aW9ucyk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoYXN5bmNJZk5vdENhY2hlZCAmJiAhKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGV4KTsKICAgICAgfQogICAgICB0aHJvdyBleDsKICAgIH0KICAgIGlmIChjc05hbWUgfHwgY3NSZWYpIHsKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUuc2V0KGNzTmFtZSwgY3NSZWYsIHBhcnNlZENTKTsKICAgICAgaWYgKGNzUmVmKSB7CiAgICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLnNldChudWxsLCBjc1JlZiwgcGFyc2VkQ1MpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYXN5bmNJZk5vdENhY2hlZCA/IFByb21pc2UucmVzb2x2ZShwYXJzZWRDUykgOiBwYXJzZWRDUzsKICB9CiAgc3RhdGljICNzdWJQYXJzZShjcywgb3B0aW9ucykgewogICAgY29uc3QgewogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUKICAgIH0gPSBvcHRpb25zOwogICAgbGV0IGNzUmVmOwogICAgaWYgKGNzIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIGNzUmVmID0gY3M7CiAgICAgIGNvbnN0IGNhY2hlZENTID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLmdldEJ5UmVmKGNzUmVmKTsKICAgICAgaWYgKGNhY2hlZENTKSB7CiAgICAgICAgcmV0dXJuIGNhY2hlZENTOwogICAgICB9CiAgICB9CiAgICBjb25zdCBwYXJzZWRDUyA9IHRoaXMuI3BhcnNlKGNzLCBvcHRpb25zKTsKICAgIGlmIChjc1JlZikgewogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUuc2V0KG51bGwsIGNzUmVmLCBwYXJzZWRDUyk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VkQ1M7CiAgfQogIHN0YXRpYyAjcGFyc2UoY3MsIG9wdGlvbnMpIHsKICAgIGNvbnN0IHsKICAgICAgeHJlZiwKICAgICAgcmVzb3VyY2VzLAogICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZQogICAgfSA9IG9wdGlvbnM7CiAgICBjcyA9IHhyZWYuZmV0Y2hJZlJlZihjcyk7CiAgICBpZiAoY3MgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHN3aXRjaCAoY3MubmFtZSkgewogICAgICAgIGNhc2UgIkciOgogICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgogICAgICAgICAgcmV0dXJuIHRoaXMuZ3JheTsKICAgICAgICBjYXNlICJSR0IiOgogICAgICAgIGNhc2UgIkRldmljZVJHQiI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZ2I7CiAgICAgICAgY2FzZSAiRGV2aWNlUkdCQSI6CiAgICAgICAgICByZXR1cm4gdGhpcy5yZ2JhOwogICAgICAgIGNhc2UgIkNNWUsiOgogICAgICAgIGNhc2UgIkRldmljZUNNWUsiOgogICAgICAgICAgcmV0dXJuIHRoaXMuY215azsKICAgICAgICBjYXNlICJQYXR0ZXJuIjoKICAgICAgICAgIHJldHVybiBuZXcgUGF0dGVybkNTKG51bGwpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAocmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICBjb25zdCBjb2xvclNwYWNlcyA9IHJlc291cmNlcy5nZXQoIkNvbG9yU3BhY2UiKTsKICAgICAgICAgICAgaWYgKGNvbG9yU3BhY2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlc0NTID0gY29sb3JTcGFjZXMuZ2V0KGNzLm5hbWUpOwogICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNDUykgewogICAgICAgICAgICAgICAgaWYgKHJlc291cmNlc0NTIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jcGFyc2UocmVzb3VyY2VzQ1MsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3MgPSByZXNvdXJjZXNDUzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgd2FybihgVW5yZWNvZ25pemVkIENvbG9yU3BhY2U6ICR7Y3MubmFtZX1gKTsKICAgICAgICAgIHJldHVybiB0aGlzLmdyYXk7CiAgICAgIH0KICAgIH0KICAgIGlmIChBcnJheS5pc0FycmF5KGNzKSkgewogICAgICBjb25zdCBtb2RlID0geHJlZi5mZXRjaElmUmVmKGNzWzBdKS5uYW1lOwogICAgICBsZXQgcGFyYW1zLCBudW1Db21wcywgYmFzZUNTLCB3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYTsKICAgICAgc3dpdGNoIChtb2RlKSB7CiAgICAgICAgY2FzZSAiRyI6CiAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CiAgICAgICAgICByZXR1cm4gdGhpcy5ncmF5OwogICAgICAgIGNhc2UgIlJHQiI6CiAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKICAgICAgICAgIHJldHVybiB0aGlzLnJnYjsKICAgICAgICBjYXNlICJDTVlLIjoKICAgICAgICBjYXNlICJEZXZpY2VDTVlLIjoKICAgICAgICAgIHJldHVybiB0aGlzLmNteWs7CiAgICAgICAgY2FzZSAiQ2FsR3JheSI6CiAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOwogICAgICAgICAgd2hpdGVQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiV2hpdGVQb2ludCIpOwogICAgICAgICAgYmxhY2tQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiQmxhY2tQb2ludCIpOwogICAgICAgICAgZ2FtbWEgPSBwYXJhbXMuZ2V0KCJHYW1tYSIpOwogICAgICAgICAgcmV0dXJuIG5ldyBDYWxHcmF5Q1Mod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEpOwogICAgICAgIGNhc2UgIkNhbFJHQiI6CiAgICAgICAgICBwYXJhbXMgPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOwogICAgICAgICAgd2hpdGVQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiV2hpdGVQb2ludCIpOwogICAgICAgICAgYmxhY2tQb2ludCA9IHBhcmFtcy5nZXRBcnJheSgiQmxhY2tQb2ludCIpOwogICAgICAgICAgZ2FtbWEgPSBwYXJhbXMuZ2V0QXJyYXkoIkdhbW1hIik7CiAgICAgICAgICBjb25zdCBtYXRyaXggPSBwYXJhbXMuZ2V0QXJyYXkoIk1hdHJpeCIpOwogICAgICAgICAgcmV0dXJuIG5ldyBDYWxSR0JDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSwgbWF0cml4KTsKICAgICAgICBjYXNlICJJQ0NCYXNlZCI6CiAgICAgICAgICBjb25zdCBpc1JlZiA9IGNzWzFdIGluc3RhbmNlb2YgUmVmOwogICAgICAgICAgaWYgKGlzUmVmKSB7CiAgICAgICAgICAgIGNvbnN0IGNhY2hlZENTID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLmdldEJ5UmVmKGNzWzFdKTsKICAgICAgICAgICAgaWYgKGNhY2hlZENTKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENTOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzdHJlYW0gPSB4cmVmLmZldGNoSWZSZWYoY3NbMV0pOwogICAgICAgICAgY29uc3QgZGljdCA9IHN0cmVhbS5kaWN0OwogICAgICAgICAgbnVtQ29tcHMgPSBkaWN0LmdldCgiTiIpOwogICAgICAgICAgaWYgKEljY0NvbG9yU3BhY2UuaXNVc2FibGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBjb25zdCBpY2NDUyA9IG5ldyBJY2NDb2xvclNwYWNlKHN0cmVhbS5nZXRCeXRlcygpLCAiSUNDQmFzZWQiLCBudW1Db21wcyk7CiAgICAgICAgICAgICAgaWYgKGlzUmVmKSB7CiAgICAgICAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUuc2V0KG51bGwsIGNzWzFdLCBpY2NDUyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBpY2NDUzsKICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHdhcm4oYElDQ0Jhc2VkIGNvbG9yIHNwYWNlICgke2NzWzFdfSk6ICIke2V4fSIuYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGFsdFJhdyA9IGRpY3QuZ2V0UmF3KCJBbHRlcm5hdGUiKTsKICAgICAgICAgIGlmIChhbHRSYXcpIHsKICAgICAgICAgICAgY29uc3QgYWx0Q1MgPSB0aGlzLiNzdWJQYXJzZShhbHRSYXcsIG9wdGlvbnMpOwogICAgICAgICAgICBpZiAoYWx0Q1MubnVtQ29tcHMgPT09IG51bUNvbXBzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGFsdENTOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdhcm4oIklDQ0Jhc2VkIGNvbG9yIHNwYWNlOiBJZ25vcmluZyBpbmNvcnJlY3QgL0FsdGVybmF0ZSBlbnRyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChudW1Db21wcyA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5ncmF5OwogICAgICAgICAgfSBlbHNlIGlmIChudW1Db21wcyA9PT0gMykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZ2I7CiAgICAgICAgICB9IGVsc2UgaWYgKG51bUNvbXBzID09PSA0KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNteWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJQYXR0ZXJuIjoKICAgICAgICAgIGJhc2VDUyA9IGNzWzFdIHx8IG51bGw7CiAgICAgICAgICBpZiAoYmFzZUNTKSB7CiAgICAgICAgICAgIGJhc2VDUyA9IHRoaXMuI3N1YlBhcnNlKGJhc2VDUywgb3B0aW9ucyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmV3IFBhdHRlcm5DUyhiYXNlQ1MpOwogICAgICAgIGNhc2UgIkkiOgogICAgICAgIGNhc2UgIkluZGV4ZWQiOgogICAgICAgICAgYmFzZUNTID0gdGhpcy4jc3ViUGFyc2UoY3NbMV0sIG9wdGlvbnMpOwogICAgICAgICAgY29uc3QgaGlWYWwgPSBNYXRoQ2xhbXAoeHJlZi5mZXRjaElmUmVmKGNzWzJdKSwgMCwgMjU1KTsKICAgICAgICAgIGNvbnN0IGxvb2t1cCA9IHhyZWYuZmV0Y2hJZlJlZihjc1szXSk7CiAgICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWRDUyhiYXNlQ1MsIGhpVmFsLCBsb29rdXApOwogICAgICAgIGNhc2UgIlNlcGFyYXRpb24iOgogICAgICAgIGNhc2UgIkRldmljZU4iOgogICAgICAgICAgY29uc3QgbmFtZSA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CiAgICAgICAgICBudW1Db21wcyA9IEFycmF5LmlzQXJyYXkobmFtZSkgPyBuYW1lLmxlbmd0aCA6IDE7CiAgICAgICAgICBiYXNlQ1MgPSB0aGlzLiNzdWJQYXJzZShjc1syXSwgb3B0aW9ucyk7CiAgICAgICAgICBjb25zdCB0aW50Rm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKGNzWzNdKTsKICAgICAgICAgIHJldHVybiBuZXcgQWx0ZXJuYXRlQ1MobnVtQ29tcHMsIGJhc2VDUywgdGludEZuKTsKICAgICAgICBjYXNlICJMYWIiOgogICAgICAgICAgcGFyYW1zID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTsKICAgICAgICAgIGNvbnN0IHJhbmdlID0gcGFyYW1zLmdldEFycmF5KCJSYW5nZSIpOwogICAgICAgICAgcmV0dXJuIG5ldyBMYWJDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHdhcm4oYFVuaW1wbGVtZW50ZWQgQ29sb3JTcGFjZSBvYmplY3Q6ICR7bW9kZX1gKTsKICAgICAgICAgIHJldHVybiB0aGlzLmdyYXk7CiAgICAgIH0KICAgIH0KICAgIHdhcm4oYFVucmVjb2duaXplZCBDb2xvclNwYWNlIG9iamVjdDogJHtjc31gKTsKICAgIHJldHVybiB0aGlzLmdyYXk7CiAgfQogIHN0YXRpYyBnZXQgZ3JheSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImdyYXkiLCBuZXcgRGV2aWNlR3JheUNTKCkpOwogIH0KICBzdGF0aWMgZ2V0IHJnYigpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgInJnYiIsIG5ldyBEZXZpY2VSZ2JDUygpKTsKICB9CiAgc3RhdGljIGdldCByZ2JhKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicmdiYSIsIG5ldyBEZXZpY2VSZ2JhQ1MoKSk7CiAgfQogIHN0YXRpYyBnZXQgY215aygpIHsKICAgIGlmIChDbXlrSUNDQmFzZWRDUy5pc1VzYWJsZSkgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBzaGFkb3codGhpcywgImNteWsiLCBuZXcgQ215a0lDQ0Jhc2VkQ1MoKSk7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHdhcm4oIkNNWUsgZmFsbGJhY2s6IERldmljZUNNWUsiKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiY215ayIsIG5ldyBEZXZpY2VDbXlrQ1MoKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9qcGcuanMKCgoKCgpjbGFzcyBKcGVnRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIkpwZWdFcnJvciIpOwogIH0KfQpjbGFzcyBETkxNYXJrZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHNjYW5MaW5lcykgewogICAgc3VwZXIobWVzc2FnZSwgIkROTE1hcmtlckVycm9yIik7CiAgICB0aGlzLnNjYW5MaW5lcyA9IHNjYW5MaW5lczsKICB9Cn0KY2xhc3MgRU9JTWFya2VyRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIkVPSU1hcmtlckVycm9yIik7CiAgfQp9CmNvbnN0IGRjdFppZ1phZyA9IG5ldyBVaW50OEFycmF5KFswLCAxLCA4LCAxNiwgOSwgMiwgMywgMTAsIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsIDQsIDUsIDEyLCAxOSwgMjYsIDMzLCA0MCwgNDgsIDQxLCAzNCwgMjcsIDIwLCAxMywgNiwgNywgMTQsIDIxLCAyOCwgMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LCAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzXSk7CmNvbnN0IGRjdENvczEgPSA0MDE3Owpjb25zdCBkY3RTaW4xID0gNzk5Owpjb25zdCBkY3RDb3MzID0gMzQwNjsKY29uc3QgZGN0U2luMyA9IDIyNzY7CmNvbnN0IGRjdENvczYgPSAxNTY3Owpjb25zdCBkY3RTaW42ID0gMzc4NDsKY29uc3QgZGN0U3FydDIgPSA1NzkzOwpjb25zdCBkY3RTcXJ0MWQyID0gMjg5NjsKZnVuY3Rpb24gYnVpbGRIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMsIHZhbHVlcykgewogIGxldCBrID0gMCwKICAgIGksCiAgICBqLAogICAgbGVuZ3RoID0gMTY7CiAgd2hpbGUgKGxlbmd0aCA+IDAgJiYgIWNvZGVMZW5ndGhzW2xlbmd0aCAtIDFdKSB7CiAgICBsZW5ndGgtLTsKICB9CiAgY29uc3QgY29kZSA9IFt7CiAgICBjaGlsZHJlbjogW10sCiAgICBpbmRleDogMAogIH1dOwogIGxldCBwID0gY29kZVswXSwKICAgIHE7CiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBmb3IgKGogPSAwOyBqIDwgY29kZUxlbmd0aHNbaV07IGorKykgewogICAgICBwID0gY29kZS5wb3AoKTsKICAgICAgcC5jaGlsZHJlbltwLmluZGV4XSA9IHZhbHVlc1trXTsKICAgICAgd2hpbGUgKHAuaW5kZXggPiAwKSB7CiAgICAgICAgcCA9IGNvZGUucG9wKCk7CiAgICAgIH0KICAgICAgcC5pbmRleCsrOwogICAgICBjb2RlLnB1c2gocCk7CiAgICAgIHdoaWxlIChjb2RlLmxlbmd0aCA8PSBpKSB7CiAgICAgICAgY29kZS5wdXNoKHEgPSB7CiAgICAgICAgICBjaGlsZHJlbjogW10sCiAgICAgICAgICBpbmRleDogMAogICAgICAgIH0pOwogICAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSBxLmNoaWxkcmVuOwogICAgICAgIHAgPSBxOwogICAgICB9CiAgICAgIGsrKzsKICAgIH0KICAgIGlmIChpICsgMSA8IGxlbmd0aCkgewogICAgICBjb2RlLnB1c2gocSA9IHsKICAgICAgICBjaGlsZHJlbjogW10sCiAgICAgICAgaW5kZXg6IDAKICAgICAgfSk7CiAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSBxLmNoaWxkcmVuOwogICAgICBwID0gcTsKICAgIH0KICB9CiAgcmV0dXJuIGNvZGVbMF0uY2hpbGRyZW47Cn0KZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCByb3csIGNvbCkgewogIHJldHVybiA2NCAqICgoY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgKyAxKSAqIHJvdyArIGNvbCk7Cn0KZnVuY3Rpb24gZGVjb2RlU2NhbihkYXRhLCBvZmZzZXQsIGZyYW1lLCBjb21wb25lbnRzLCByZXNldEludGVydmFsLCBzcGVjdHJhbFN0YXJ0LCBzcGVjdHJhbEVuZCwgc3VjY2Vzc2l2ZVByZXYsIHN1Y2Nlc3NpdmUsIHBhcnNlRE5MTWFya2VyID0gZmFsc2UpIHsKICBjb25zdCBtY3VzUGVyTGluZSA9IGZyYW1lLm1jdXNQZXJMaW5lOwogIGNvbnN0IHByb2dyZXNzaXZlID0gZnJhbWUucHJvZ3Jlc3NpdmU7CiAgY29uc3Qgc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CiAgbGV0IGJpdHNEYXRhID0gMCwKICAgIGJpdHNDb3VudCA9IDA7CiAgZnVuY3Rpb24gcmVhZEJpdCgpIHsKICAgIGlmIChiaXRzQ291bnQgPiAwKSB7CiAgICAgIGJpdHNDb3VudC0tOwogICAgICByZXR1cm4gYml0c0RhdGEgPj4gYml0c0NvdW50ICYgMTsKICAgIH0KICAgIGJpdHNEYXRhID0gZGF0YVtvZmZzZXQrK107CiAgICBpZiAoYml0c0RhdGEgPT09IDB4ZmYpIHsKICAgICAgY29uc3QgbmV4dEJ5dGUgPSBkYXRhW29mZnNldCsrXTsKICAgICAgaWYgKG5leHRCeXRlKSB7CiAgICAgICAgaWYgKG5leHRCeXRlID09PSAweGRjICYmIHBhcnNlRE5MTWFya2VyKSB7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGNvbnN0IHNjYW5MaW5lcyA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgaWYgKHNjYW5MaW5lcyA+IDAgJiYgc2NhbkxpbmVzICE9PSBmcmFtZS5zY2FuTGluZXMpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEROTE1hcmtlckVycm9yKCJGb3VuZCBETkwgbWFya2VyICgweEZGREMpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIiwgc2NhbkxpbmVzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG5leHRCeXRlID09PSAweGQ5KSB7CiAgICAgICAgICBpZiAocGFyc2VETkxNYXJrZXIpIHsKICAgICAgICAgICAgY29uc3QgbWF5YmVTY2FuTGluZXMgPSBibG9ja1JvdyAqIChmcmFtZS5wcmVjaXNpb24gPT09IDggPyA4IDogMCk7CiAgICAgICAgICAgIGlmIChtYXliZVNjYW5MaW5lcyA+IDAgJiYgTWF0aC5yb3VuZChmcmFtZS5zY2FuTGluZXMgLyBtYXliZVNjYW5MaW5lcykgPj0gNSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSwgIiArICJwb3NzaWJseSBjYXVzZWQgYnkgaW5jb3JyZWN0IGBzY2FuTGluZXNgIHBhcmFtZXRlciIsIG1heWJlU2NhbkxpbmVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgbmV3IEVPSU1hcmtlckVycm9yKCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIik7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoYHVuZXhwZWN0ZWQgbWFya2VyICR7KGJpdHNEYXRhIDw8IDggfCBuZXh0Qnl0ZSkudG9TdHJpbmcoMTYpfWApOwogICAgICB9CiAgICB9CiAgICBiaXRzQ291bnQgPSA3OwogICAgcmV0dXJuIGJpdHNEYXRhID4+PiA3OwogIH0KICBmdW5jdGlvbiBkZWNvZGVIdWZmbWFuKHRyZWUpIHsKICAgIGxldCBub2RlID0gdHJlZTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIG5vZGUgPSBub2RlW3JlYWRCaXQoKV07CiAgICAgIHN3aXRjaCAodHlwZW9mIG5vZGUpIHsKICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgaHVmZm1hbiBzZXF1ZW5jZSIpOwogICAgfQogIH0KICBmdW5jdGlvbiByZWNlaXZlKGxlbmd0aCkgewogICAgbGV0IG4gPSAwOwogICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKICAgICAgbiA9IG4gPDwgMSB8IHJlYWRCaXQoKTsKICAgICAgbGVuZ3RoLS07CiAgICB9CiAgICByZXR1cm4gbjsKICB9CiAgZnVuY3Rpb24gcmVjZWl2ZUFuZEV4dGVuZChsZW5ndGgpIHsKICAgIGlmIChsZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHJlYWRCaXQoKSA9PT0gMSA/IDEgOiAtMTsKICAgIH0KICAgIGNvbnN0IG4gPSByZWNlaXZlKGxlbmd0aCk7CiAgICBpZiAobiA+PSAxIDw8IGxlbmd0aCAtIDEpIHsKICAgICAgcmV0dXJuIG47CiAgICB9CiAgICByZXR1cm4gbiArICgtMSA8PCBsZW5ndGgpICsgMTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlQmFzZWxpbmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgY29uc3QgdCA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDKTsKICAgIGNvbnN0IGRpZmYgPSB0ID09PSAwID8gMCA6IHJlY2VpdmVBbmRFeHRlbmQodCk7CiAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSA9IGNvbXBvbmVudC5wcmVkICs9IGRpZmY7CiAgICBsZXQgayA9IDE7CiAgICB3aGlsZSAoayA8IDY0KSB7CiAgICAgIGNvbnN0IHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOwogICAgICBjb25zdCBzID0gcnMgJiAxNSwKICAgICAgICByID0gcnMgPj4gNDsKICAgICAgaWYgKHMgPT09IDApIHsKICAgICAgICBpZiAociA8IDE1KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgayArPSAxNjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBrICs9IHI7CiAgICAgIGNvbnN0IHogPSBkY3RaaWdaYWdba107CiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocyk7CiAgICAgIGsrKzsKICAgIH0KICB9CiAgZnVuY3Rpb24gZGVjb2RlRENGaXJzdChjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CiAgICBjb25zdCB0ID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlREMpOwogICAgY29uc3QgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KSA8PCBzdWNjZXNzaXZlOwogICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gPSBjb21wb25lbnQucHJlZCArPSBkaWZmOwogIH0KICBmdW5jdGlvbiBkZWNvZGVEQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gfD0gcmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmU7CiAgfQogIGxldCBlb2JydW4gPSAwOwogIGZ1bmN0aW9uIGRlY29kZUFDRmlyc3QoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgaWYgKGVvYnJ1biA+IDApIHsKICAgICAgZW9icnVuLS07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBrID0gc3BlY3RyYWxTdGFydDsKICAgIGNvbnN0IGUgPSBzcGVjdHJhbEVuZDsKICAgIHdoaWxlIChrIDw9IGUpIHsKICAgICAgY29uc3QgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7CiAgICAgIGNvbnN0IHMgPSBycyAmIDE1LAogICAgICAgIHIgPSBycyA+PiA0OwogICAgICBpZiAocyA9PT0gMCkgewogICAgICAgIGlmIChyIDwgMTUpIHsKICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKSAtIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgayArPSAxNjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBrICs9IHI7CiAgICAgIGNvbnN0IHogPSBkY3RaaWdaYWdba107CiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocykgKiAoMSA8PCBzdWNjZXNzaXZlKTsKICAgICAgaysrOwogICAgfQogIH0KICBsZXQgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwLAogICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlOwogIGZ1bmN0aW9uIGRlY29kZUFDU3VjY2Vzc2l2ZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CiAgICBsZXQgayA9IHNwZWN0cmFsU3RhcnQ7CiAgICBjb25zdCBlID0gc3BlY3RyYWxFbmQ7CiAgICBsZXQgciA9IDA7CiAgICBsZXQgczsKICAgIGxldCByczsKICAgIHdoaWxlIChrIDw9IGUpIHsKICAgICAgY29uc3Qgb2Zmc2V0WiA9IGJsb2NrT2Zmc2V0ICsgZGN0WmlnWmFnW2tdOwogICAgICBjb25zdCBzaWduID0gY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA8IDAgPyAtMSA6IDE7CiAgICAgIHN3aXRjaCAoc3VjY2Vzc2l2ZUFDU3RhdGUpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTsKICAgICAgICAgIHMgPSBycyAmIDE1OwogICAgICAgICAgciA9IHJzID4+IDQ7CiAgICAgICAgICBpZiAocyA9PT0gMCkgewogICAgICAgICAgICBpZiAociA8IDE1KSB7CiAgICAgICAgICAgICAgZW9icnVuID0gcmVjZWl2ZShyKSArICgxIDw8IHIpOwogICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gNDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByID0gMTY7CiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAocyAhPT0gMSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgQUNuIGVuY29kaW5nIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlID0gcmVjZWl2ZUFuZEV4dGVuZChzKTsKICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSByID8gMiA6IDM7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIDE6CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgaWYgKGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0pIHsKICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSArPSBzaWduICogKHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHItLTsKICAgICAgICAgICAgaWYgKHIgPT09IDApIHsKICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSAyID8gMyA6IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CiAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdID0gc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlIDw8IHN1Y2Nlc3NpdmU7CiAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CiAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBrKys7CiAgICB9CiAgICBpZiAoc3VjY2Vzc2l2ZUFDU3RhdGUgPT09IDQpIHsKICAgICAgZW9icnVuLS07CiAgICAgIGlmIChlb2JydW4gPT09IDApIHsKICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7CiAgICAgIH0KICAgIH0KICB9CiAgbGV0IGJsb2NrUm93ID0gMDsKICBmdW5jdGlvbiBkZWNvZGVNY3UoY29tcG9uZW50LCBkZWNvZGUsIG1jdSwgcm93LCBjb2wpIHsKICAgIGNvbnN0IG1jdVJvdyA9IG1jdSAvIG1jdXNQZXJMaW5lIHwgMDsKICAgIGNvbnN0IG1jdUNvbCA9IG1jdSAlIG1jdXNQZXJMaW5lOwogICAgYmxvY2tSb3cgPSBtY3VSb3cgKiBjb21wb25lbnQudiArIHJvdzsKICAgIGNvbnN0IGJsb2NrQ29sID0gbWN1Q29sICogY29tcG9uZW50LmggKyBjb2w7CiAgICBjb25zdCBibG9ja09mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTsKICAgIGRlY29kZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGUsIG1jdSkgewogICAgYmxvY2tSb3cgPSBtY3UgLyBjb21wb25lbnQuYmxvY2tzUGVyTGluZSB8IDA7CiAgICBjb25zdCBibG9ja0NvbCA9IG1jdSAlIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lOwogICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7CiAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7CiAgfQogIGNvbnN0IGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDsKICBsZXQgY29tcG9uZW50LCBpLCBqLCBrLCBuOwogIGxldCBkZWNvZGVGbjsKICBpZiAocHJvZ3Jlc3NpdmUpIHsKICAgIGlmIChzcGVjdHJhbFN0YXJ0ID09PSAwKSB7CiAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVEQ0ZpcnN0IDogZGVjb2RlRENTdWNjZXNzaXZlOwogICAgfSBlbHNlIHsKICAgICAgZGVjb2RlRm4gPSBzdWNjZXNzaXZlUHJldiA9PT0gMCA/IGRlY29kZUFDRmlyc3QgOiBkZWNvZGVBQ1N1Y2Nlc3NpdmU7CiAgICB9CiAgfSBlbHNlIHsKICAgIGRlY29kZUZuID0gZGVjb2RlQmFzZWxpbmU7CiAgfQogIGxldCBtY3UgPSAwLAogICAgZmlsZU1hcmtlcjsKICBjb25zdCBtY3VFeHBlY3RlZCA9IGNvbXBvbmVudHNMZW5ndGggPT09IDEgPyBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckxpbmUgKiBjb21wb25lbnRzWzBdLmJsb2Nrc1BlckNvbHVtbiA6IG1jdXNQZXJMaW5lICogZnJhbWUubWN1c1BlckNvbHVtbjsKICBsZXQgaCwgdjsKICB3aGlsZSAobWN1IDw9IG1jdUV4cGVjdGVkKSB7CiAgICBjb25zdCBtY3VUb1JlYWQgPSByZXNldEludGVydmFsID8gTWF0aC5taW4obWN1RXhwZWN0ZWQgLSBtY3UsIHJlc2V0SW50ZXJ2YWwpIDogbWN1RXhwZWN0ZWQ7CiAgICBpZiAobWN1VG9SZWFkID4gMCkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSsrKSB7CiAgICAgICAgY29tcG9uZW50c1tpXS5wcmVkID0gMDsKICAgICAgfQogICAgICBlb2JydW4gPSAwOwogICAgICBpZiAoY29tcG9uZW50c0xlbmd0aCA9PT0gMSkgewogICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbMF07CiAgICAgICAgZm9yIChuID0gMDsgbiA8IG1jdVRvUmVhZDsgbisrKSB7CiAgICAgICAgICBkZWNvZGVCbG9jayhjb21wb25lbnQsIGRlY29kZUZuLCBtY3UpOwogICAgICAgICAgbWN1Kys7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAobiA9IDA7IG4gPCBtY3VUb1JlYWQ7IG4rKykgewogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudHNMZW5ndGg7IGkrKykgewogICAgICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzW2ldOwogICAgICAgICAgICBoID0gY29tcG9uZW50Lmg7CiAgICAgICAgICAgIHYgPSBjb21wb25lbnQudjsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHY7IGorKykgewogICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoOyBrKyspIHsKICAgICAgICAgICAgICAgIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZUZuLCBtY3UsIGosIGspOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbWN1Kys7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBiaXRzQ291bnQgPSAwOwogICAgZmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBvZmZzZXQpOwogICAgaWYgKCFmaWxlTWFya2VyKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGZpbGVNYXJrZXIuaW52YWxpZCkgewogICAgICBjb25zdCBwYXJ0aWFsTXNnID0gbWN1VG9SZWFkID4gMCA/ICJ1bmV4cGVjdGVkIiA6ICJleGNlc3NpdmUiOwogICAgICB3YXJuKGBkZWNvZGVTY2FuIC0gJHtwYXJ0aWFsTXNnfSBNQ1UgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICR7ZmlsZU1hcmtlci5pbnZhbGlkfWApOwogICAgICBvZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDsKICAgIH0KICAgIGlmIChmaWxlTWFya2VyLm1hcmtlciA+PSAweGZmZDAgJiYgZmlsZU1hcmtlci5tYXJrZXIgPD0gMHhmZmQ3KSB7CiAgICAgIG9mZnNldCArPSAyOwogICAgfSBlbHNlIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHJldHVybiBvZmZzZXQgLSBzdGFydE9mZnNldDsKfQpmdW5jdGlvbiBxdWFudGl6ZUFuZEludmVyc2UoY29tcG9uZW50LCBibG9ja0J1ZmZlck9mZnNldCwgcCkgewogIGNvbnN0IHF0ID0gY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlLAogICAgYmxvY2tEYXRhID0gY29tcG9uZW50LmJsb2NrRGF0YTsKICBsZXQgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3OwogIGxldCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDc7CiAgbGV0IHQ7CiAgaWYgKCFxdCkgewogICAgdGhyb3cgbmV3IEpwZWdFcnJvcigibWlzc2luZyByZXF1aXJlZCBRdWFudGl6YXRpb24gVGFibGUuIik7CiAgfQogIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IDY0OyByb3cgKz0gOCkgewogICAgcDAgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3ddOwogICAgcDEgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAxXTsKICAgIHAyID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgMl07CiAgICBwMyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDNdOwogICAgcDQgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA0XTsKICAgIHA1ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNV07CiAgICBwNiA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDZdOwogICAgcDcgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA3XTsKICAgIHAwICo9IHF0W3Jvd107CiAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkgewogICAgICB0ID0gZGN0U3FydDIgKiBwMCArIDUxMiA+PiAxMDsKICAgICAgcFtyb3ddID0gdDsKICAgICAgcFtyb3cgKyAxXSA9IHQ7CiAgICAgIHBbcm93ICsgMl0gPSB0OwogICAgICBwW3JvdyArIDNdID0gdDsKICAgICAgcFtyb3cgKyA0XSA9IHQ7CiAgICAgIHBbcm93ICsgNV0gPSB0OwogICAgICBwW3JvdyArIDZdID0gdDsKICAgICAgcFtyb3cgKyA3XSA9IHQ7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgcDEgKj0gcXRbcm93ICsgMV07CiAgICBwMiAqPSBxdFtyb3cgKyAyXTsKICAgIHAzICo9IHF0W3JvdyArIDNdOwogICAgcDQgKj0gcXRbcm93ICsgNF07CiAgICBwNSAqPSBxdFtyb3cgKyA1XTsKICAgIHA2ICo9IHF0W3JvdyArIDZdOwogICAgcDcgKj0gcXRbcm93ICsgN107CiAgICB2MCA9IGRjdFNxcnQyICogcDAgKyAxMjggPj4gODsKICAgIHYxID0gZGN0U3FydDIgKiBwNCArIDEyOCA+PiA4OwogICAgdjIgPSBwMjsKICAgIHYzID0gcDY7CiAgICB2NCA9IGRjdFNxcnQxZDIgKiAocDEgLSBwNykgKyAxMjggPj4gODsKICAgIHY3ID0gZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDEyOCA+PiA4OwogICAgdjUgPSBwMyA8PCA0OwogICAgdjYgPSBwNSA8PCA0OwogICAgdjAgPSB2MCArIHYxICsgMSA+PiAxOwogICAgdjEgPSB2MCAtIHYxOwogICAgdCA9IHYyICogZGN0U2luNiArIHYzICogZGN0Q29zNiArIDEyOCA+PiA4OwogICAgdjIgPSB2MiAqIGRjdENvczYgLSB2MyAqIGRjdFNpbjYgKyAxMjggPj4gODsKICAgIHYzID0gdDsKICAgIHY0ID0gdjQgKyB2NiArIDEgPj4gMTsKICAgIHY2ID0gdjQgLSB2NjsKICAgIHY3ID0gdjcgKyB2NSArIDEgPj4gMTsKICAgIHY1ID0gdjcgLSB2NTsKICAgIHYwID0gdjAgKyB2MyArIDEgPj4gMTsKICAgIHYzID0gdjAgLSB2MzsKICAgIHYxID0gdjEgKyB2MiArIDEgPj4gMTsKICAgIHYyID0gdjEgLSB2MjsKICAgIHQgPSB2NCAqIGRjdFNpbjMgKyB2NyAqIGRjdENvczMgKyAyMDQ4ID4+IDEyOwogICAgdjQgPSB2NCAqIGRjdENvczMgLSB2NyAqIGRjdFNpbjMgKyAyMDQ4ID4+IDEyOwogICAgdjcgPSB0OwogICAgdCA9IHY1ICogZGN0U2luMSArIHY2ICogZGN0Q29zMSArIDIwNDggPj4gMTI7CiAgICB2NSA9IHY1ICogZGN0Q29zMSAtIHY2ICogZGN0U2luMSArIDIwNDggPj4gMTI7CiAgICB2NiA9IHQ7CiAgICBwW3Jvd10gPSB2MCArIHY3OwogICAgcFtyb3cgKyA3XSA9IHYwIC0gdjc7CiAgICBwW3JvdyArIDFdID0gdjEgKyB2NjsKICAgIHBbcm93ICsgNl0gPSB2MSAtIHY2OwogICAgcFtyb3cgKyAyXSA9IHYyICsgdjU7CiAgICBwW3JvdyArIDVdID0gdjIgLSB2NTsKICAgIHBbcm93ICsgM10gPSB2MyArIHY0OwogICAgcFtyb3cgKyA0XSA9IHYzIC0gdjQ7CiAgfQogIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDg7ICsrY29sKSB7CiAgICBwMCA9IHBbY29sXTsKICAgIHAxID0gcFtjb2wgKyA4XTsKICAgIHAyID0gcFtjb2wgKyAxNl07CiAgICBwMyA9IHBbY29sICsgMjRdOwogICAgcDQgPSBwW2NvbCArIDMyXTsKICAgIHA1ID0gcFtjb2wgKyA0MF07CiAgICBwNiA9IHBbY29sICsgNDhdOwogICAgcDcgPSBwW2NvbCArIDU2XTsKICAgIGlmICgocDEgfCBwMiB8IHAzIHwgcDQgfCBwNSB8IHA2IHwgcDcpID09PSAwKSB7CiAgICAgIHQgPSBkY3RTcXJ0MiAqIHAwICsgODE5MiA+PiAxNDsKICAgICAgaWYgKHQgPCAtMjA0MCkgewogICAgICAgIHQgPSAwOwogICAgICB9IGVsc2UgaWYgKHQgPj0gMjAyNCkgewogICAgICAgIHQgPSAyNTU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdCA9IHQgKyAyMDU2ID4+IDQ7CiAgICAgIH0KICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHQ7CiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMTZdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDBdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gdDsKICAgICAgY29udGludWU7CiAgICB9CiAgICB2MCA9IGRjdFNxcnQyICogcDAgKyAyMDQ4ID4+IDEyOwogICAgdjEgPSBkY3RTcXJ0MiAqIHA0ICsgMjA0OCA+PiAxMjsKICAgIHYyID0gcDI7CiAgICB2MyA9IHA2OwogICAgdjQgPSBkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMjA0OCA+PiAxMjsKICAgIHY3ID0gZGN0U3FydDFkMiAqIChwMSArIHA3KSArIDIwNDggPj4gMTI7CiAgICB2NSA9IHAzOwogICAgdjYgPSBwNTsKICAgIHYwID0gKHYwICsgdjEgKyAxID4+IDEpICsgNDExMjsKICAgIHYxID0gdjAgLSB2MTsKICAgIHQgPSB2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAyMDQ4ID4+IDEyOwogICAgdjIgPSB2MiAqIGRjdENvczYgLSB2MyAqIGRjdFNpbjYgKyAyMDQ4ID4+IDEyOwogICAgdjMgPSB0OwogICAgdjQgPSB2NCArIHY2ICsgMSA+PiAxOwogICAgdjYgPSB2NCAtIHY2OwogICAgdjcgPSB2NyArIHY1ICsgMSA+PiAxOwogICAgdjUgPSB2NyAtIHY1OwogICAgdjAgPSB2MCArIHYzICsgMSA+PiAxOwogICAgdjMgPSB2MCAtIHYzOwogICAgdjEgPSB2MSArIHYyICsgMSA+PiAxOwogICAgdjIgPSB2MSAtIHYyOwogICAgdCA9IHY0ICogZGN0U2luMyArIHY3ICogZGN0Q29zMyArIDIwNDggPj4gMTI7CiAgICB2NCA9IHY0ICogZGN0Q29zMyAtIHY3ICogZGN0U2luMyArIDIwNDggPj4gMTI7CiAgICB2NyA9IHQ7CiAgICB0ID0gdjUgKiBkY3RTaW4xICsgdjYgKiBkY3RDb3MxICsgMjA0OCA+PiAxMjsKICAgIHY1ID0gdjUgKiBkY3RDb3MxIC0gdjYgKiBkY3RTaW4xICsgMjA0OCA+PiAxMjsKICAgIHY2ID0gdDsKICAgIHAwID0gdjAgKyB2NzsKICAgIHA3ID0gdjAgLSB2NzsKICAgIHAxID0gdjEgKyB2NjsKICAgIHA2ID0gdjEgLSB2NjsKICAgIHAyID0gdjIgKyB2NTsKICAgIHA1ID0gdjIgLSB2NTsKICAgIHAzID0gdjMgKyB2NDsKICAgIHA0ID0gdjMgLSB2NDsKICAgIGlmIChwMCA8IDE2KSB7CiAgICAgIHAwID0gMDsKICAgIH0gZWxzZSBpZiAocDAgPj0gNDA4MCkgewogICAgICBwMCA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHAwID4+PSA0OwogICAgfQogICAgaWYgKHAxIDwgMTYpIHsKICAgICAgcDEgPSAwOwogICAgfSBlbHNlIGlmIChwMSA+PSA0MDgwKSB7CiAgICAgIHAxID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDEgPj49IDQ7CiAgICB9CiAgICBpZiAocDIgPCAxNikgewogICAgICBwMiA9IDA7CiAgICB9IGVsc2UgaWYgKHAyID49IDQwODApIHsKICAgICAgcDIgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwMiA+Pj0gNDsKICAgIH0KICAgIGlmIChwMyA8IDE2KSB7CiAgICAgIHAzID0gMDsKICAgIH0gZWxzZSBpZiAocDMgPj0gNDA4MCkgewogICAgICBwMyA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHAzID4+PSA0OwogICAgfQogICAgaWYgKHA0IDwgMTYpIHsKICAgICAgcDQgPSAwOwogICAgfSBlbHNlIGlmIChwNCA+PSA0MDgwKSB7CiAgICAgIHA0ID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDQgPj49IDQ7CiAgICB9CiAgICBpZiAocDUgPCAxNikgewogICAgICBwNSA9IDA7CiAgICB9IGVsc2UgaWYgKHA1ID49IDQwODApIHsKICAgICAgcDUgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwNSA+Pj0gNDsKICAgIH0KICAgIGlmIChwNiA8IDE2KSB7CiAgICAgIHA2ID0gMDsKICAgIH0gZWxzZSBpZiAocDYgPj0gNDA4MCkgewogICAgICBwNiA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHA2ID4+PSA0OwogICAgfQogICAgaWYgKHA3IDwgMTYpIHsKICAgICAgcDcgPSAwOwogICAgfSBlbHNlIGlmIChwNyA+PSA0MDgwKSB7CiAgICAgIHA3ID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDcgPj49IDQ7CiAgICB9CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2xdID0gcDA7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA4XSA9IHAxOwogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMTZdID0gcDI7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAyNF0gPSBwMzsKICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDMyXSA9IHA0OwogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDBdID0gcDU7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0OF0gPSBwNjsKICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDU2XSA9IHA3OwogIH0KfQpmdW5jdGlvbiBidWlsZENvbXBvbmVudERhdGEoZnJhbWUsIGNvbXBvbmVudCkgewogIGNvbnN0IGJsb2Nrc1BlckxpbmUgPSBjb21wb25lbnQuYmxvY2tzUGVyTGluZTsKICBjb25zdCBibG9ja3NQZXJDb2x1bW4gPSBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uOwogIGNvbnN0IGNvbXB1dGF0aW9uQnVmZmVyID0gbmV3IEludDE2QXJyYXkoNjQpOwogIGZvciAobGV0IGJsb2NrUm93ID0gMDsgYmxvY2tSb3cgPCBibG9ja3NQZXJDb2x1bW47IGJsb2NrUm93KyspIHsKICAgIGZvciAobGV0IGJsb2NrQ29sID0gMDsgYmxvY2tDb2wgPCBibG9ja3NQZXJMaW5lOyBibG9ja0NvbCsrKSB7CiAgICAgIGNvbnN0IG9mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTsKICAgICAgcXVhbnRpemVBbmRJbnZlcnNlKGNvbXBvbmVudCwgb2Zmc2V0LCBjb21wdXRhdGlvbkJ1ZmZlcik7CiAgICB9CiAgfQogIHJldHVybiBjb21wb25lbnQuYmxvY2tEYXRhOwp9CmZ1bmN0aW9uIGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBjdXJyZW50UG9zLCBzdGFydFBvcyA9IGN1cnJlbnRQb3MpIHsKICBjb25zdCBtYXhQb3MgPSBkYXRhLmxlbmd0aCAtIDE7CiAgbGV0IG5ld1BvcyA9IHN0YXJ0UG9zIDwgY3VycmVudFBvcyA/IHN0YXJ0UG9zIDogY3VycmVudFBvczsKICBpZiAoY3VycmVudFBvcyA+PSBtYXhQb3MpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBjdXJyZW50TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBjdXJyZW50UG9zKTsKICBpZiAoY3VycmVudE1hcmtlciA+PSAweGZmYzAgJiYgY3VycmVudE1hcmtlciA8PSAweGZmZmUpIHsKICAgIHJldHVybiB7CiAgICAgIGludmFsaWQ6IG51bGwsCiAgICAgIG1hcmtlcjogY3VycmVudE1hcmtlciwKICAgICAgb2Zmc2V0OiBjdXJyZW50UG9zCiAgICB9OwogIH0KICBsZXQgbmV3TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBuZXdQb3MpOwogIHdoaWxlICghKG5ld01hcmtlciA+PSAweGZmYzAgJiYgbmV3TWFya2VyIDw9IDB4ZmZmZSkpIHsKICAgIGlmICgrK25ld1BvcyA+PSBtYXhQb3MpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBuZXdNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG5ld1Bvcyk7CiAgfQogIHJldHVybiB7CiAgICBpbnZhbGlkOiBjdXJyZW50TWFya2VyLnRvU3RyaW5nKDE2KSwKICAgIG1hcmtlcjogbmV3TWFya2VyLAogICAgb2Zmc2V0OiBuZXdQb3MKICB9Owp9CmZ1bmN0aW9uIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKSB7CiAgY29uc3QgbWN1c1BlckxpbmUgPSBNYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUgLyA4IC8gZnJhbWUubWF4SCk7CiAgY29uc3QgbWN1c1BlckNvbHVtbiA9IE1hdGguY2VpbChmcmFtZS5zY2FuTGluZXMgLyA4IC8gZnJhbWUubWF4Vik7CiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgZnJhbWUuY29tcG9uZW50cykgewogICAgY29uc3QgYmxvY2tzUGVyTGluZSA9IE1hdGguY2VpbChNYXRoLmNlaWwoZnJhbWUuc2FtcGxlc1BlckxpbmUgLyA4KSAqIGNvbXBvbmVudC5oIC8gZnJhbWUubWF4SCk7CiAgICBjb25zdCBibG9ja3NQZXJDb2x1bW4gPSBNYXRoLmNlaWwoTWF0aC5jZWlsKGZyYW1lLnNjYW5MaW5lcyAvIDgpICogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWKTsKICAgIGNvbnN0IGJsb2Nrc1BlckxpbmVGb3JNY3UgPSBtY3VzUGVyTGluZSAqIGNvbXBvbmVudC5oOwogICAgY29uc3QgYmxvY2tzUGVyQ29sdW1uRm9yTWN1ID0gbWN1c1BlckNvbHVtbiAqIGNvbXBvbmVudC52OwogICAgY29uc3QgYmxvY2tzQnVmZmVyU2l6ZSA9IDY0ICogYmxvY2tzUGVyQ29sdW1uRm9yTWN1ICogKGJsb2Nrc1BlckxpbmVGb3JNY3UgKyAxKTsKICAgIGNvbXBvbmVudC5ibG9ja0RhdGEgPSBuZXcgSW50MTZBcnJheShibG9ja3NCdWZmZXJTaXplKTsKICAgIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lID0gYmxvY2tzUGVyTGluZTsKICAgIGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW4gPSBibG9ja3NQZXJDb2x1bW47CiAgfQogIGZyYW1lLm1jdXNQZXJMaW5lID0gbWN1c1BlckxpbmU7CiAgZnJhbWUubWN1c1BlckNvbHVtbiA9IG1jdXNQZXJDb2x1bW47Cn0KZnVuY3Rpb24gcmVhZERhdGFCbG9jayhkYXRhLCBvZmZzZXQpIHsKICBjb25zdCBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgb2Zmc2V0ICs9IDI7CiAgbGV0IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aCAtIDI7CiAgY29uc3QgZmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBlbmRPZmZzZXQsIG9mZnNldCk7CiAgaWYgKGZpbGVNYXJrZXI/LmludmFsaWQpIHsKICAgIHdhcm4oInJlYWREYXRhQmxvY2sgLSBpbmNvcnJlY3QgbGVuZ3RoLCBjdXJyZW50IG1hcmtlciBpczogIiArIGZpbGVNYXJrZXIuaW52YWxpZCk7CiAgICBlbmRPZmZzZXQgPSBmaWxlTWFya2VyLm9mZnNldDsKICB9CiAgY29uc3QgYXJyYXkgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgZW5kT2Zmc2V0KTsKICByZXR1cm4gewogICAgYXBwRGF0YTogYXJyYXksCiAgICBvbGRPZmZzZXQ6IG9mZnNldCwKICAgIG5ld09mZnNldDogb2Zmc2V0ICsgYXJyYXkubGVuZ3RoCiAgfTsKfQpmdW5jdGlvbiBza2lwRGF0YShkYXRhLCBvZmZzZXQpIHsKICBjb25zdCBsZW5ndGggPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgb2Zmc2V0ICs9IDI7CiAgY29uc3QgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoIC0gMjsKICBjb25zdCBmaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGVuZE9mZnNldCwgb2Zmc2V0KTsKICBpZiAoZmlsZU1hcmtlcj8uaW52YWxpZCkgewogICAgcmV0dXJuIGZpbGVNYXJrZXIub2Zmc2V0OwogIH0KICByZXR1cm4gZW5kT2Zmc2V0Owp9CmNsYXNzIEpwZWdJbWFnZSB7CiAgY29uc3RydWN0b3IoewogICAgZGVjb2RlVHJhbnNmb3JtID0gbnVsbCwKICAgIGNvbG9yVHJhbnNmb3JtID0gLTEKICB9ID0ge30pIHsKICAgIHRoaXMuX2RlY29kZVRyYW5zZm9ybSA9IGRlY29kZVRyYW5zZm9ybTsKICAgIHRoaXMuX2NvbG9yVHJhbnNmb3JtID0gY29sb3JUcmFuc2Zvcm07CiAgfQogIHN0YXRpYyBjYW5Vc2VJbWFnZURlY29kZXIoZGF0YSwgY29sb3JUcmFuc2Zvcm0gPSAtMSkgewogICAgbGV0IGV4aWZPZmZzZXRzID0gbnVsbDsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgbGV0IG51bUNvbXBvbmVudHMgPSBudWxsOwogICAgbGV0IGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICBvZmZzZXQgKz0gMjsKICAgIGlmIChmaWxlTWFya2VyICE9PSAweGZmZDgpIHsKICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiU09JIG5vdCBmb3VuZCIpOwogICAgfQogICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgIG9mZnNldCArPSAyOwogICAgbWFya2VyTG9vcDogd2hpbGUgKGZpbGVNYXJrZXIgIT09IDB4ZmZkOSkgewogICAgICBzd2l0Y2ggKGZpbGVNYXJrZXIpIHsKICAgICAgICBjYXNlIDB4ZmZlMToKICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgYXBwRGF0YSwKICAgICAgICAgICAgb2xkT2Zmc2V0LAogICAgICAgICAgICBuZXdPZmZzZXQKICAgICAgICAgIH0gPSByZWFkRGF0YUJsb2NrKGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgPSBuZXdPZmZzZXQ7CiAgICAgICAgICBpZiAoYXBwRGF0YVswXSA9PT0gMHg0NSAmJiBhcHBEYXRhWzFdID09PSAweDc4ICYmIGFwcERhdGFbMl0gPT09IDB4NjkgJiYgYXBwRGF0YVszXSA9PT0gMHg2NiAmJiBhcHBEYXRhWzRdID09PSAwICYmIGFwcERhdGFbNV0gPT09IDApIHsKICAgICAgICAgICAgaWYgKGV4aWZPZmZzZXRzKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiRHVwbGljYXRlIEVYSUYtYmxvY2tzIGZvdW5kLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4aWZPZmZzZXRzID0gewogICAgICAgICAgICAgIGV4aWZTdGFydDogb2xkT2Zmc2V0ICsgNiwKICAgICAgICAgICAgICBleGlmRW5kOiBuZXdPZmZzZXQKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICAgIGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgMHhmZmMwOgogICAgICAgIGNhc2UgMHhmZmMxOgogICAgICAgIGNhc2UgMHhmZmMyOgogICAgICAgICAgbnVtQ29tcG9uZW50cyA9IGRhdGFbb2Zmc2V0ICsgKDIgKyAxICsgMiArIDIpXTsKICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CiAgICAgICAgY2FzZSAweGZmZmY6CiAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdICE9PSAweGZmKSB7CiAgICAgICAgICAgIG9mZnNldC0tOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgb2Zmc2V0ID0gc2tpcERhdGEoZGF0YSwgb2Zmc2V0KTsKICAgICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgb2Zmc2V0ICs9IDI7CiAgICB9CiAgICBpZiAobnVtQ29tcG9uZW50cyA9PT0gNCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChudW1Db21wb25lbnRzID09PSAzICYmIGNvbG9yVHJhbnNmb3JtID09PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIGV4aWZPZmZzZXRzIHx8IHt9OwogIH0KICBwYXJzZShkYXRhLCB7CiAgICBkbmxTY2FuTGluZXMgPSBudWxsCiAgfSA9IHt9KSB7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGxldCBqZmlmID0gbnVsbDsKICAgIGxldCBhZG9iZSA9IG51bGw7CiAgICBsZXQgZnJhbWUsIHJlc2V0SW50ZXJ2YWw7CiAgICBsZXQgbnVtU09TTWFya2VycyA9IDA7CiAgICBjb25zdCBxdWFudGl6YXRpb25UYWJsZXMgPSBbXTsKICAgIGNvbnN0IGh1ZmZtYW5UYWJsZXNBQyA9IFtdLAogICAgICBodWZmbWFuVGFibGVzREMgPSBbXTsKICAgIGxldCBmaWxlTWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogICAgb2Zmc2V0ICs9IDI7CiAgICBpZiAoZmlsZU1hcmtlciAhPT0gMHhmZmQ4KSB7CiAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIlNPSSBub3QgZm91bmQiKTsKICAgIH0KICAgIGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICBvZmZzZXQgKz0gMjsKICAgIG1hcmtlckxvb3A6IHdoaWxlIChmaWxlTWFya2VyICE9PSAweGZmZDkpIHsKICAgICAgbGV0IGksIGosIGw7CiAgICAgIHN3aXRjaCAoZmlsZU1hcmtlcikgewogICAgICAgIGNhc2UgMHhmZmUwOgogICAgICAgIGNhc2UgMHhmZmUxOgogICAgICAgIGNhc2UgMHhmZmUyOgogICAgICAgIGNhc2UgMHhmZmUzOgogICAgICAgIGNhc2UgMHhmZmU0OgogICAgICAgIGNhc2UgMHhmZmU1OgogICAgICAgIGNhc2UgMHhmZmU2OgogICAgICAgIGNhc2UgMHhmZmU3OgogICAgICAgIGNhc2UgMHhmZmU4OgogICAgICAgIGNhc2UgMHhmZmU5OgogICAgICAgIGNhc2UgMHhmZmVhOgogICAgICAgIGNhc2UgMHhmZmViOgogICAgICAgIGNhc2UgMHhmZmVjOgogICAgICAgIGNhc2UgMHhmZmVkOgogICAgICAgIGNhc2UgMHhmZmVlOgogICAgICAgIGNhc2UgMHhmZmVmOgogICAgICAgIGNhc2UgMHhmZmZlOgogICAgICAgICAgY29uc3QgewogICAgICAgICAgICBhcHBEYXRhLAogICAgICAgICAgICBuZXdPZmZzZXQKICAgICAgICAgIH0gPSByZWFkRGF0YUJsb2NrKGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgPSBuZXdPZmZzZXQ7CiAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmUwKSB7CiAgICAgICAgICAgIGlmIChhcHBEYXRhWzBdID09PSAweDRhICYmIGFwcERhdGFbMV0gPT09IDB4NDYgJiYgYXBwRGF0YVsyXSA9PT0gMHg0OSAmJiBhcHBEYXRhWzNdID09PSAweDQ2ICYmIGFwcERhdGFbNF0gPT09IDApIHsKICAgICAgICAgICAgICBqZmlmID0gewogICAgICAgICAgICAgICAgdmVyc2lvbjogewogICAgICAgICAgICAgICAgICBtYWpvcjogYXBwRGF0YVs1XSwKICAgICAgICAgICAgICAgICAgbWlub3I6IGFwcERhdGFbNl0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkZW5zaXR5VW5pdHM6IGFwcERhdGFbN10sCiAgICAgICAgICAgICAgICB4RGVuc2l0eTogYXBwRGF0YVs4XSA8PCA4IHwgYXBwRGF0YVs5XSwKICAgICAgICAgICAgICAgIHlEZW5zaXR5OiBhcHBEYXRhWzEwXSA8PCA4IHwgYXBwRGF0YVsxMV0sCiAgICAgICAgICAgICAgICB0aHVtYldpZHRoOiBhcHBEYXRhWzEyXSwKICAgICAgICAgICAgICAgIHRodW1iSGVpZ2h0OiBhcHBEYXRhWzEzXSwKICAgICAgICAgICAgICAgIHRodW1iRGF0YTogYXBwRGF0YS5zdWJhcnJheSgxNCwgMTQgKyAzICogYXBwRGF0YVsxMl0gKiBhcHBEYXRhWzEzXSkKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZmlsZU1hcmtlciA9PT0gMHhmZmVlKSB7CiAgICAgICAgICAgIGlmIChhcHBEYXRhWzBdID09PSAweDQxICYmIGFwcERhdGFbMV0gPT09IDB4NjQgJiYgYXBwRGF0YVsyXSA9PT0gMHg2ZiAmJiBhcHBEYXRhWzNdID09PSAweDYyICYmIGFwcERhdGFbNF0gPT09IDB4NjUpIHsKICAgICAgICAgICAgICBhZG9iZSA9IHsKICAgICAgICAgICAgICAgIHZlcnNpb246IGFwcERhdGFbNV0gPDwgOCB8IGFwcERhdGFbNl0sCiAgICAgICAgICAgICAgICBmbGFnczA6IGFwcERhdGFbN10gPDwgOCB8IGFwcERhdGFbOF0sCiAgICAgICAgICAgICAgICBmbGFnczE6IGFwcERhdGFbOV0gPDwgOCB8IGFwcERhdGFbMTBdLAogICAgICAgICAgICAgICAgdHJhbnNmb3JtQ29kZTogYXBwRGF0YVsxMV0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZkYjoKICAgICAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlc0xlbmd0aCA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGVzRW5kID0gcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoICsgb2Zmc2V0IC0gMjsKICAgICAgICAgIGxldCB6OwogICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHF1YW50aXphdGlvblRhYmxlc0VuZCkgewogICAgICAgICAgICBjb25zdCBxdWFudGl6YXRpb25UYWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFVpbnQxNkFycmF5KDY0KTsKICAgICAgICAgICAgaWYgKHF1YW50aXphdGlvblRhYmxlU3BlYyA+PiA0ID09PSAwKSB7CiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKICAgICAgICAgICAgICAgIHogPSBkY3RaaWdaYWdbal07CiAgICAgICAgICAgICAgICB0YWJsZURhdGFbel0gPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQgPT09IDEpIHsKICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgewogICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTsKICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJEUVQgLSBpbnZhbGlkIHRhYmxlIHNwZWMiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZXNbcXVhbnRpemF0aW9uVGFibGVTcGVjICYgMTVdID0gdGFibGVEYXRhOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGZmYzA6CiAgICAgICAgY2FzZSAweGZmYzE6CiAgICAgICAgY2FzZSAweGZmYzI6CiAgICAgICAgICBpZiAoZnJhbWUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiT25seSBzaW5nbGUgZnJhbWUgSlBFR3Mgc3VwcG9ydGVkIik7CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGZyYW1lID0ge307CiAgICAgICAgICBmcmFtZS5leHRlbmRlZCA9IGZpbGVNYXJrZXIgPT09IDB4ZmZjMTsKICAgICAgICAgIGZyYW1lLnByb2dyZXNzaXZlID0gZmlsZU1hcmtlciA9PT0gMHhmZmMyOwogICAgICAgICAgZnJhbWUucHJlY2lzaW9uID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICBjb25zdCBzb2ZTY2FuTGluZXMgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGZyYW1lLnNjYW5MaW5lcyA9IGRubFNjYW5MaW5lcyB8fCBzb2ZTY2FuTGluZXM7CiAgICAgICAgICBmcmFtZS5zYW1wbGVzUGVyTGluZSA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgZnJhbWUuY29tcG9uZW50cyA9IFtdOwogICAgICAgICAgZnJhbWUuY29tcG9uZW50SWRzID0ge307CiAgICAgICAgICBjb25zdCBjb21wb25lbnRzQ291bnQgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgIGxldCBtYXhIID0gMCwKICAgICAgICAgICAgbWF4ViA9IDA7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0NvdW50OyBpKyspIHsKICAgICAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBkYXRhW29mZnNldF07CiAgICAgICAgICAgIGNvbnN0IGggPSBkYXRhW29mZnNldCArIDFdID4+IDQ7CiAgICAgICAgICAgIGNvbnN0IHYgPSBkYXRhW29mZnNldCArIDFdICYgMTU7CiAgICAgICAgICAgIGlmIChtYXhIIDwgaCkgewogICAgICAgICAgICAgIG1heEggPSBoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtYXhWIDwgdikgewogICAgICAgICAgICAgIG1heFYgPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHFJZCA9IGRhdGFbb2Zmc2V0ICsgMl07CiAgICAgICAgICAgIGwgPSBmcmFtZS5jb21wb25lbnRzLnB1c2goewogICAgICAgICAgICAgIGgsCiAgICAgICAgICAgICAgdiwKICAgICAgICAgICAgICBxdWFudGl6YXRpb25JZDogcUlkLAogICAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlOiBudWxsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmcmFtZS5jb21wb25lbnRJZHNbY29tcG9uZW50SWRdID0gbCAtIDE7CiAgICAgICAgICAgIG9mZnNldCArPSAzOwogICAgICAgICAgfQogICAgICAgICAgZnJhbWUubWF4SCA9IG1heEg7CiAgICAgICAgICBmcmFtZS5tYXhWID0gbWF4VjsKICAgICAgICAgIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmM0OgogICAgICAgICAgY29uc3QgaHVmZm1hbkxlbmd0aCA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgZm9yIChpID0gMjsgaSA8IGh1ZmZtYW5MZW5ndGg7KSB7CiAgICAgICAgICAgIGNvbnN0IGh1ZmZtYW5UYWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29uc3QgY29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgICAgICAgIGxldCBjb2RlTGVuZ3RoU3VtID0gMDsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyssIG9mZnNldCsrKSB7CiAgICAgICAgICAgICAgY29kZUxlbmd0aFN1bSArPSBjb2RlTGVuZ3Roc1tqXSA9IGRhdGFbb2Zmc2V0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBodWZmbWFuVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbmd0aFN1bSk7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlTGVuZ3RoU3VtOyBqKyssIG9mZnNldCsrKSB7CiAgICAgICAgICAgICAgaHVmZm1hblZhbHVlc1tqXSA9IGRhdGFbb2Zmc2V0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpICs9IDE3ICsgY29kZUxlbmd0aFN1bTsKICAgICAgICAgICAgKGh1ZmZtYW5UYWJsZVNwZWMgPj4gNCA9PT0gMCA/IGh1ZmZtYW5UYWJsZXNEQyA6IGh1ZmZtYW5UYWJsZXNBQylbaHVmZm1hblRhYmxlU3BlYyAmIDE1XSA9IGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCBodWZmbWFuVmFsdWVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmRkOgogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICByZXNldEludGVydmFsID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZkYToKICAgICAgICAgIGNvbnN0IHBhcnNlRE5MTWFya2VyID0gKytudW1TT1NNYXJrZXJzID09PSAxICYmICFkbmxTY2FuTGluZXM7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGNvbnN0IHNlbGVjdG9yc0NvdW50ID0gZGF0YVtvZmZzZXQrK10sCiAgICAgICAgICAgIGNvbXBvbmVudHMgPSBbXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWxlY3RvcnNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEluZGV4ID0gZnJhbWUuY29tcG9uZW50SWRzW2luZGV4XTsKICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZnJhbWUuY29tcG9uZW50c1tjb21wb25lbnRJbmRleF07CiAgICAgICAgICAgIGNvbXBvbmVudC5pbmRleCA9IGluZGV4OwogICAgICAgICAgICBjb25zdCB0YWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDID0gaHVmZm1hblRhYmxlc0RDW3RhYmxlU3BlYyA+PiA0XTsKICAgICAgICAgICAgY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDID0gaHVmZm1hblRhYmxlc0FDW3RhYmxlU3BlYyAmIDE1XTsKICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzcGVjdHJhbFN0YXJ0ID0gZGF0YVtvZmZzZXQrK10sCiAgICAgICAgICAgIHNwZWN0cmFsRW5kID0gZGF0YVtvZmZzZXQrK10sCiAgICAgICAgICAgIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBwcm9jZXNzZWQgPSBkZWNvZGVTY2FuKGRhdGEsIG9mZnNldCwgZnJhbWUsIGNvbXBvbmVudHMsIHJlc2V0SW50ZXJ2YWwsIHNwZWN0cmFsU3RhcnQsIHNwZWN0cmFsRW5kLCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiA+PiA0LCBzdWNjZXNzaXZlQXBwcm94aW1hdGlvbiAmIDE1LCBwYXJzZUROTE1hcmtlcik7CiAgICAgICAgICAgIG9mZnNldCArPSBwcm9jZXNzZWQ7CiAgICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBETkxNYXJrZXJFcnJvcikgewogICAgICAgICAgICAgIHdhcm4oYCR7ZXgubWVzc2FnZX0gLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS5gKTsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShkYXRhLCB7CiAgICAgICAgICAgICAgICBkbmxTY2FuTGluZXM6IGV4LnNjYW5MaW5lcwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgRU9JTWFya2VyRXJyb3IpIHsKICAgICAgICAgICAgICB3YXJuKGAke2V4Lm1lc3NhZ2V9IC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLmApOwogICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZkYzoKICAgICAgICAgIG9mZnNldCArPSA0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGZmZmY6CiAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdICE9PSAweGZmKSB7CiAgICAgICAgICAgIG9mZnNldC0tOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGNvbnN0IG5leHRGaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIG9mZnNldCAtIDIsIG9mZnNldCAtIDMpOwogICAgICAgICAgaWYgKG5leHRGaWxlTWFya2VyPy5pbnZhbGlkKSB7CiAgICAgICAgICAgIHdhcm4oIkpwZWdJbWFnZS5wYXJzZSAtIHVuZXhwZWN0ZWQgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICIgKyBuZXh0RmlsZU1hcmtlci5pbnZhbGlkKTsKICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dEZpbGVNYXJrZXIub2Zmc2V0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghbmV4dEZpbGVNYXJrZXIgfHwgb2Zmc2V0ID49IGRhdGEubGVuZ3RoIC0gMSkgewogICAgICAgICAgICB3YXJuKCJKcGVnSW1hZ2UucGFyc2UgLSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGltYWdlIGRhdGEgIiArICJ3aXRob3V0IGZpbmRpbmcgYW4gRU9JIG1hcmtlciAoMHhGRkQ5KS4iKTsKICAgICAgICAgICAgYnJlYWsgbWFya2VyTG9vcDsKICAgICAgICAgIH0KICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIkpwZWdJbWFnZS5wYXJzZSAtIHVua25vd24gbWFya2VyOiAiICsgZmlsZU1hcmtlci50b1N0cmluZygxNikpOwogICAgICB9CiAgICAgIGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgIG9mZnNldCArPSAyOwogICAgfQogICAgaWYgKCFmcmFtZSkgewogICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJKcGVnSW1hZ2UucGFyc2UgLSBubyBmcmFtZSBkYXRhIGZvdW5kLiIpOwogICAgfQogICAgdGhpcy53aWR0aCA9IGZyYW1lLnNhbXBsZXNQZXJMaW5lOwogICAgdGhpcy5oZWlnaHQgPSBmcmFtZS5zY2FuTGluZXM7CiAgICB0aGlzLmpmaWYgPSBqZmlmOwogICAgdGhpcy5hZG9iZSA9IGFkb2JlOwogICAgdGhpcy5jb21wb25lbnRzID0gW107CiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBmcmFtZS5jb21wb25lbnRzKSB7CiAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlID0gcXVhbnRpemF0aW9uVGFibGVzW2NvbXBvbmVudC5xdWFudGl6YXRpb25JZF07CiAgICAgIGlmIChxdWFudGl6YXRpb25UYWJsZSkgewogICAgICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlOwogICAgICB9CiAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKHsKICAgICAgICBpbmRleDogY29tcG9uZW50LmluZGV4LAogICAgICAgIG91dHB1dDogYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpLAogICAgICAgIHNjYWxlWDogY29tcG9uZW50LmggLyBmcmFtZS5tYXhILAogICAgICAgIHNjYWxlWTogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWLAogICAgICAgIGJsb2Nrc1BlckxpbmU6IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lLAogICAgICAgIGJsb2Nrc1BlckNvbHVtbjogY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbgogICAgICB9KTsKICAgIH0KICAgIHRoaXMubnVtQ29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KICBfZ2V0TGluZWFyaXplZEJsb2NrRGF0YSh3aWR0aCwgaGVpZ2h0LCBpc1NvdXJjZVBERiA9IGZhbHNlKSB7CiAgICBjb25zdCBzY2FsZVggPSB0aGlzLndpZHRoIC8gd2lkdGgsCiAgICAgIHNjYWxlWSA9IHRoaXMuaGVpZ2h0IC8gaGVpZ2h0OwogICAgbGV0IGNvbXBvbmVudCwgY29tcG9uZW50U2NhbGVYLCBjb21wb25lbnRTY2FsZVksIGJsb2Nrc1BlclNjYW5saW5lOwogICAgbGV0IHgsIHksIGksIGosIGs7CiAgICBsZXQgaW5kZXg7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGxldCBvdXRwdXQ7CiAgICBjb25zdCBudW1Db21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmxlbmd0aDsKICAgIGNvbnN0IGRhdGFMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIG51bUNvbXBvbmVudHM7CiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGFMZW5ndGgpOwogICAgY29uc3QgeFNjYWxlQmxvY2tPZmZzZXQgPSBuZXcgVWludDMyQXJyYXkod2lkdGgpOwogICAgY29uc3QgbWFzazNMU0IgPSAweGZmZmZmZmY4OwogICAgbGV0IGxhc3RDb21wb25lbnRTY2FsZVg7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7CiAgICAgIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpXTsKICAgICAgY29tcG9uZW50U2NhbGVYID0gY29tcG9uZW50LnNjYWxlWCAqIHNjYWxlWDsKICAgICAgY29tcG9uZW50U2NhbGVZID0gY29tcG9uZW50LnNjYWxlWSAqIHNjYWxlWTsKICAgICAgb2Zmc2V0ID0gaTsKICAgICAgb3V0cHV0ID0gY29tcG9uZW50Lm91dHB1dDsKICAgICAgYmxvY2tzUGVyU2NhbmxpbmUgPSBjb21wb25lbnQuYmxvY2tzUGVyTGluZSArIDEgPDwgMzsKICAgICAgaWYgKGNvbXBvbmVudFNjYWxlWCAhPT0gbGFzdENvbXBvbmVudFNjYWxlWCkgewogICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICBqID0gMCB8IHggKiBjb21wb25lbnRTY2FsZVg7CiAgICAgICAgICB4U2NhbGVCbG9ja09mZnNldFt4XSA9IChqICYgbWFzazNMU0IpIDw8IDMgfCBqICYgNzsKICAgICAgICB9CiAgICAgICAgbGFzdENvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudFNjYWxlWDsKICAgICAgfQogICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICBqID0gMCB8IHkgKiBjb21wb25lbnRTY2FsZVk7CiAgICAgICAgaW5kZXggPSBibG9ja3NQZXJTY2FubGluZSAqIChqICYgbWFzazNMU0IpIHwgKGogJiA3KSA8PCAzOwogICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICBkYXRhW29mZnNldF0gPSBvdXRwdXRbaW5kZXggKyB4U2NhbGVCbG9ja09mZnNldFt4XV07CiAgICAgICAgICBvZmZzZXQgKz0gbnVtQ29tcG9uZW50czsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGxldCB0cmFuc2Zvcm0gPSB0aGlzLl9kZWNvZGVUcmFuc2Zvcm07CiAgICBpZiAoIWlzU291cmNlUERGICYmIG51bUNvbXBvbmVudHMgPT09IDQgJiYgIXRyYW5zZm9ybSkgewogICAgICB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShbLTI1NiwgMjU1LCAtMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1XSk7CiAgICB9CiAgICBpZiAodHJhbnNmb3JtKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOykgewogICAgICAgIGZvciAoaiA9IDAsIGsgPSAwOyBqIDwgbnVtQ29tcG9uZW50czsgaisrLCBpKyssIGsgKz0gMikgewogICAgICAgICAgZGF0YVtpXSA9IChkYXRhW2ldICogdHJhbnNmb3JtW2tdID4+IDgpICsgdHJhbnNmb3JtW2sgKyAxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICBnZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCkgewogICAgaWYgKHRoaXMuYWRvYmUpIHsKICAgICAgcmV0dXJuICEhdGhpcy5hZG9iZS50cmFuc2Zvcm1Db2RlOwogICAgfQogICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMykgewogICAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wb25lbnRzWzBdLmluZGV4ID09PSAweDUyICYmIHRoaXMuY29tcG9uZW50c1sxXS5pbmRleCA9PT0gMHg0NyAmJiB0aGlzLmNvbXBvbmVudHNbMl0uaW5kZXggPT09IDB4NDIpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDEpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIF9jb252ZXJ0WWNjVG9SZ2IoZGF0YSkgewogICAgbGV0IFksIENiLCBDcjsKICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgIFkgPSBkYXRhW2ldOwogICAgICBDYiA9IGRhdGFbaSArIDFdOwogICAgICBDciA9IGRhdGFbaSArIDJdOwogICAgICBkYXRhW2ldID0gWSAtIDE3OS40NTYgKyAxLjQwMiAqIENyOwogICAgICBkYXRhW2kgKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7CiAgICAgIGRhdGFbaSArIDJdID0gWSAtIDIyNi44MTYgKyAxLjc3MiAqIENiOwogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIF9jb252ZXJ0WWNjVG9SZ2JhKGRhdGEsIG91dCkgewogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzLCBqICs9IDQpIHsKICAgICAgY29uc3QgWSA9IGRhdGFbaV07CiAgICAgIGNvbnN0IENiID0gZGF0YVtpICsgMV07CiAgICAgIGNvbnN0IENyID0gZGF0YVtpICsgMl07CiAgICAgIG91dFtqXSA9IFkgLSAxNzkuNDU2ICsgMS40MDIgKiBDcjsKICAgICAgb3V0W2ogKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7CiAgICAgIG91dFtqICsgMl0gPSBZIC0gMjI2LjgxNiArIDEuNzcyICogQ2I7CiAgICAgIG91dFtqICsgM10gPSAyNTU7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBfY29udmVydFljY2tUb1JnYihkYXRhKSB7CiAgICB0aGlzLl9jb252ZXJ0WWNja1RvQ215ayhkYXRhKTsKICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q215a1RvUmdiKGRhdGEpOwogIH0KICBfY29udmVydFljY2tUb1JnYmEoZGF0YSkgewogICAgdGhpcy5fY29udmVydFljY2tUb0NteWsoZGF0YSk7CiAgICByZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYmEoZGF0YSk7CiAgfQogIF9jb252ZXJ0WWNja1RvQ215ayhkYXRhKSB7CiAgICBsZXQgWSwgQ2IsIENyOwogICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgWSA9IGRhdGFbaV07CiAgICAgIENiID0gZGF0YVtpICsgMV07CiAgICAgIENyID0gZGF0YVtpICsgMl07CiAgICAgIGRhdGFbaV0gPSA0MzQuNDU2IC0gWSAtIDEuNDAyICogQ3I7CiAgICAgIGRhdGFbaSArIDFdID0gMTE5LjU0MSAtIFkgKyAwLjM0NCAqIENiICsgMC43MTQgKiBDcjsKICAgICAgZGF0YVtpICsgMl0gPSA0ODEuODE2IC0gWSAtIDEuNzcyICogQ2I7CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgX2NvbnZlcnRDbXlrVG9SZ2IoZGF0YSkgewogICAgY29uc3QgY291bnQgPSBkYXRhLmxlbmd0aCAvIDQ7CiAgICBDb2xvclNwYWNlVXRpbHMuY215ay5nZXRSZ2JCdWZmZXIoZGF0YSwgMCwgY291bnQsIGRhdGEsIDAsIDgsIDApOwogICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgY291bnQgKiAzKTsKICB9CiAgX2NvbnZlcnRDbXlrVG9SZ2JhKGRhdGEpIHsKICAgIENvbG9yU3BhY2VVdGlscy5jbXlrLmdldFJnYkJ1ZmZlcihkYXRhLCAwLCBkYXRhLmxlbmd0aCAvIDQsIGRhdGEsIDAsIDgsIDEpOwogICAgaWYgKENvbG9yU3BhY2VVdGlscy5jbXlrIGluc3RhbmNlb2YgRGV2aWNlQ215a0NTKSB7CiAgICAgIGZvciAobGV0IGkgPSAzLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkgewogICAgICAgIGRhdGFbaV0gPSAyNTU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICBnZXREYXRhKHsKICAgIHdpZHRoLAogICAgaGVpZ2h0LAogICAgZm9yY2VSR0JBID0gZmFsc2UsCiAgICBmb3JjZVJHQiA9IGZhbHNlLAogICAgaXNTb3VyY2VQREYgPSBmYWxzZQogIH0pIHsKICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPiA0KSB7CiAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIlVuc3VwcG9ydGVkIGNvbG9yIG1vZGUiKTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHdpZHRoLCBoZWlnaHQsIGlzU291cmNlUERGKTsKICAgIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDEgJiYgKGZvcmNlUkdCQSB8fCBmb3JjZVJHQikpIHsKICAgICAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGggKiAoZm9yY2VSR0JBID8gNCA6IDMpOwogICAgICBjb25zdCByZ2JhRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShsZW4pOwogICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgaWYgKGZvcmNlUkdCQSkgewogICAgICAgIGdyYXlUb1JHQkEoZGF0YSwgbmV3IFVpbnQzMkFycmF5KHJnYmFEYXRhLmJ1ZmZlcikpOwogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoY29uc3QgZ3JheUNvbG9yIG9mIGRhdGEpIHsKICAgICAgICAgIHJnYmFEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKICAgICAgICAgIHJnYmFEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKICAgICAgICAgIHJnYmFEYXRhW29mZnNldCsrXSA9IGdyYXlDb2xvcjsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJnYmFEYXRhOwogICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDMgJiYgdGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHsKICAgICAgaWYgKGZvcmNlUkdCQSkgewogICAgICAgIGNvbnN0IHJnYmFEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEubGVuZ3RoIC8gMyAqIDQpOwogICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2JhKGRhdGEsIHJnYmFEYXRhKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fY29udmVydFljY1RvUmdiKGRhdGEpOwogICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBvbmVudHMgPT09IDQpIHsKICAgICAgaWYgKHRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKSB7CiAgICAgICAgaWYgKGZvcmNlUkdCQSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9SZ2JhKGRhdGEpOwogICAgICAgIH0KICAgICAgICBpZiAoZm9yY2VSR0IpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvUmdiKGRhdGEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydFljY2tUb0NteWsoZGF0YSk7CiAgICAgIH0gZWxzZSBpZiAoZm9yY2VSR0JBKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2JhKGRhdGEpOwogICAgICB9IGVsc2UgaWYgKGZvcmNlUkdCKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2IoZGF0YSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvanBlZ19zdHJlYW0uanMKCgoKCmNsYXNzIEpwZWdTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIHN0YXRpYyAjaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPSBGZWF0dXJlVGVzdC5pc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5kaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICB9CiAgc3RhdGljIGdldCBjYW5Vc2VJbWFnZURlY29kZXIoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjYW5Vc2VJbWFnZURlY29kZXIiLCB0aGlzLiNpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA/IEltYWdlRGVjb2Rlci5pc1R5cGVTdXBwb3J0ZWQoImltYWdlL2pwZWciKSA6IFByb21pc2UucmVzb2x2ZShmYWxzZSkpOwogIH0KICBzdGF0aWMgc2V0T3B0aW9ucyh7CiAgICBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA9IGZhbHNlCiAgfSkgewogICAgdGhpcy4jaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPSBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICB9CiAgZ2V0IGJ5dGVzKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYnl0ZXMiLCB0aGlzLnN0cmVhbS5nZXRCeXRlcyh0aGlzLm1heWJlTGVuZ3RoKSk7CiAgfQogIGVuc3VyZUJ1ZmZlcihyZXF1ZXN0ZWQpIHt9CiAgcmVhZEJsb2NrKCkgewogICAgdGhpcy5kZWNvZGVJbWFnZSgpOwogIH0KICBnZXQganBlZ09wdGlvbnMoKSB7CiAgICBjb25zdCBqcGVnT3B0aW9ucyA9IHsKICAgICAgZGVjb2RlVHJhbnNmb3JtOiB1bmRlZmluZWQsCiAgICAgIGNvbG9yVHJhbnNmb3JtOiB1bmRlZmluZWQKICAgIH07CiAgICBjb25zdCBkZWNvZGVBcnIgPSB0aGlzLmRpY3QuZ2V0QXJyYXkoIkQiLCAiRGVjb2RlIik7CiAgICBpZiAoKHRoaXMuZm9yY2VSR0JBIHx8IHRoaXMuZm9yY2VSR0IpICYmIEFycmF5LmlzQXJyYXkoZGVjb2RlQXJyKSkgewogICAgICBjb25zdCBiaXRzUGVyQ29tcG9uZW50ID0gdGhpcy5kaWN0LmdldCgiQlBDIiwgIkJpdHNQZXJDb21wb25lbnQiKSB8fCA4OwogICAgICBjb25zdCBkZWNvZGVBcnJMZW5ndGggPSBkZWNvZGVBcnIubGVuZ3RoOwogICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShkZWNvZGVBcnJMZW5ndGgpOwogICAgICBsZXQgdHJhbnNmb3JtTmVlZGVkID0gZmFsc2U7CiAgICAgIGNvbnN0IG1heFZhbHVlID0gKDEgPDwgYml0c1BlckNvbXBvbmVudCkgLSAxOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlY29kZUFyckxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgdHJhbnNmb3JtW2ldID0gKGRlY29kZUFycltpICsgMV0gLSBkZWNvZGVBcnJbaV0pICogMjU2IHwgMDsKICAgICAgICB0cmFuc2Zvcm1baSArIDFdID0gZGVjb2RlQXJyW2ldICogbWF4VmFsdWUgfCAwOwogICAgICAgIGlmICh0cmFuc2Zvcm1baV0gIT09IDI1NiB8fCB0cmFuc2Zvcm1baSArIDFdICE9PSAwKSB7CiAgICAgICAgICB0cmFuc2Zvcm1OZWVkZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodHJhbnNmb3JtTmVlZGVkKSB7CiAgICAgICAganBlZ09wdGlvbnMuZGVjb2RlVHJhbnNmb3JtID0gdHJhbnNmb3JtOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5wYXJhbXMgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGNvbG9yVHJhbnNmb3JtID0gdGhpcy5wYXJhbXMuZ2V0KCJDb2xvclRyYW5zZm9ybSIpOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihjb2xvclRyYW5zZm9ybSkpIHsKICAgICAgICBqcGVnT3B0aW9ucy5jb2xvclRyYW5zZm9ybSA9IGNvbG9yVHJhbnNmb3JtOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJqcGVnT3B0aW9ucyIsIGpwZWdPcHRpb25zKTsKICB9CiAgI3NraXBVc2VsZXNzQnl0ZXMoZGF0YSkgewogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGggLSAxOyBpIDwgaWk7IGkrKykgewogICAgICBpZiAoZGF0YVtpXSA9PT0gMHhmZiAmJiBkYXRhW2kgKyAxXSA9PT0gMHhkOCkgewogICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgZGF0YSA9IGRhdGEuc3ViYXJyYXkoaSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgZGVjb2RlSW1hZ2UoYnl0ZXMpIHsKICAgIGlmICh0aGlzLmVvZikgewogICAgICByZXR1cm4gdGhpcy5idWZmZXI7CiAgICB9CiAgICBieXRlcyA9IHRoaXMuI3NraXBVc2VsZXNzQnl0ZXMoYnl0ZXMgfHwgdGhpcy5ieXRlcyk7CiAgICBjb25zdCBqcGVnSW1hZ2UgPSBuZXcgSnBlZ0ltYWdlKHRoaXMuanBlZ09wdGlvbnMpOwogICAganBlZ0ltYWdlLnBhcnNlKGJ5dGVzKTsKICAgIGNvbnN0IGRhdGEgPSBqcGVnSW1hZ2UuZ2V0RGF0YSh7CiAgICAgIHdpZHRoOiB0aGlzLmRyYXdXaWR0aCwKICAgICAgaGVpZ2h0OiB0aGlzLmRyYXdIZWlnaHQsCiAgICAgIGZvcmNlUkdCQTogdGhpcy5mb3JjZVJHQkEsCiAgICAgIGZvcmNlUkdCOiB0aGlzLmZvcmNlUkdCLAogICAgICBpc1NvdXJjZVBERjogdHJ1ZQogICAgfSk7CiAgICB0aGlzLmJ1ZmZlciA9IGRhdGE7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgdGhpcy5lb2YgPSB0cnVlOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogIH0KICBnZXQgY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIoKSB7CiAgICByZXR1cm4gdGhpcy5zdHJlYW0uaXNBc3luYzsKICB9CiAgYXN5bmMgZ2V0VHJhbnNmZXJhYmxlSW1hZ2UoKSB7CiAgICBpZiAoIShhd2FpdCBKcGVnU3RyZWFtLmNhblVzZUltYWdlRGVjb2RlcikpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBqcGVnT3B0aW9ucyA9IHRoaXMuanBlZ09wdGlvbnM7CiAgICBpZiAoanBlZ09wdGlvbnMuZGVjb2RlVHJhbnNmb3JtKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IGRlY29kZXI7CiAgICB0cnkgewogICAgICBjb25zdCBieXRlcyA9IHRoaXMuY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIgJiYgKGF3YWl0IHRoaXMuc3RyZWFtLmFzeW5jR2V0Qnl0ZXMoKSkgfHwgdGhpcy5ieXRlczsKICAgICAgaWYgKCFieXRlcykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGxldCBkYXRhID0gdGhpcy4jc2tpcFVzZWxlc3NCeXRlcyhieXRlcyk7CiAgICAgIGNvbnN0IHVzZUltYWdlRGVjb2RlciA9IEpwZWdJbWFnZS5jYW5Vc2VJbWFnZURlY29kZXIoZGF0YSwganBlZ09wdGlvbnMuY29sb3JUcmFuc2Zvcm0pOwogICAgICBpZiAoIXVzZUltYWdlRGVjb2RlcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmICh1c2VJbWFnZURlY29kZXIuZXhpZlN0YXJ0KSB7CiAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoKTsKICAgICAgICBkYXRhLmZpbGwoMHgwMCwgdXNlSW1hZ2VEZWNvZGVyLmV4aWZTdGFydCwgdXNlSW1hZ2VEZWNvZGVyLmV4aWZFbmQpOwogICAgICB9CiAgICAgIGRlY29kZXIgPSBuZXcgSW1hZ2VEZWNvZGVyKHsKICAgICAgICBkYXRhLAogICAgICAgIHR5cGU6ICJpbWFnZS9qcGVnIiwKICAgICAgICBwcmVmZXJBbmltYXRpb246IGZhbHNlCiAgICAgIH0pOwogICAgICByZXR1cm4gKGF3YWl0IGRlY29kZXIuZGVjb2RlKCkpLmltYWdlOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYGdldFRyYW5zZmVyYWJsZUltYWdlIC0gZmFpbGVkOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGZpbmFsbHkgewogICAgICBkZWNvZGVyPy5jbG9zZSgpOwogICAgfQogIH0KfQoKOy8vIC4vZXh0ZXJuYWwvb3BlbmpwZWcvb3BlbmpwZWcuanMKdmFyIE9wZW5KUEVHID0gKCgpID0+IHsKICB2YXIgX3NjcmlwdE5hbWUgPSBpbXBvcnQubWV0YS51cmw7CiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChtb2R1bGVBcmcgPSB7fSkgewogICAgdmFyIG1vZHVsZVJ0bjsKICAgIHZhciBNb2R1bGUgPSBtb2R1bGVBcmc7CiAgICB2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0OwogICAgdmFyIHJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgIHJlYWR5UHJvbWlzZVJlamVjdCA9IHJlamVjdDsKICAgIH0pOwogICAgdmFyIEVOVklST05NRU5UX0lTX1dFQiA9IHRydWU7CiAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSID0gZmFsc2U7CiAgICB2YXIgbW9kdWxlT3ZlcnJpZGVzID0gT2JqZWN0LmFzc2lnbih7fSwgTW9kdWxlKTsKICAgIHZhciBhcmd1bWVudHNfID0gW107CiAgICB2YXIgdGhpc1Byb2dyYW0gPSAiLi90aGlzLnByb2dyYW0iOwogICAgdmFyIHF1aXRfID0gKHN0YXR1cywgdG9UaHJvdykgPT4gewogICAgICB0aHJvdyB0b1Rocm93OwogICAgfTsKICAgIHZhciBzY3JpcHREaXJlY3RvcnkgPSAiIjsKICAgIGZ1bmN0aW9uIGxvY2F0ZUZpbGUocGF0aCkgewogICAgICBpZiAoTW9kdWxlWyJsb2NhdGVGaWxlIl0pIHsKICAgICAgICByZXR1cm4gTW9kdWxlWyJsb2NhdGVGaWxlIl0ocGF0aCwgc2NyaXB0RGlyZWN0b3J5KTsKICAgICAgfQogICAgICByZXR1cm4gc2NyaXB0RGlyZWN0b3J5ICsgcGF0aDsKICAgIH0KICAgIHZhciByZWFkQXN5bmMsIHJlYWRCaW5hcnk7CiAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV0VCIHx8IEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfV09SS0VSKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2VsZi5sb2NhdGlvbi5ocmVmOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCAhPSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0KSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7CiAgICAgIH0KICAgICAgaWYgKF9zY3JpcHROYW1lKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdE5hbWU7CiAgICAgIH0KICAgICAgaWYgKHNjcmlwdERpcmVjdG9yeS5zdGFydHNXaXRoKCJibG9iOiIpKSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gIiI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gc2NyaXB0RGlyZWN0b3J5LnNsaWNlKDAsIHNjcmlwdERpcmVjdG9yeS5yZXBsYWNlKC9bPyNdLiovLCAiIikubGFzdEluZGV4T2YoIi8iKSArIDEpOwogICAgICB9CiAgICAgIHJlYWRBc3luYyA9IGFzeW5jIHVybCA9PiB7CiAgICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7CiAgICAgICAgICBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIgogICAgICAgIH0pOwogICAgICAgIGlmIChyZXNwb25zZS5vaykgewogICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyAiIDogIiArIHJlc3BvbnNlLnVybCk7CiAgICAgIH07CiAgICB9IGVsc2Uge30KICAgIHZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTsKICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpOwogICAgT2JqZWN0LmFzc2lnbihNb2R1bGUsIG1vZHVsZU92ZXJyaWRlcyk7CiAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgaWYgKE1vZHVsZVsiYXJndW1lbnRzIl0pIGFyZ3VtZW50c18gPSBNb2R1bGVbImFyZ3VtZW50cyJdOwogICAgaWYgKE1vZHVsZVsidGhpc1Byb2dyYW0iXSkgdGhpc1Byb2dyYW0gPSBNb2R1bGVbInRoaXNQcm9ncmFtIl07CiAgICB2YXIgd2FzbUJpbmFyeSA9IE1vZHVsZVsid2FzbUJpbmFyeSJdOwogICAgdmFyIHdhc21NZW1vcnk7CiAgICB2YXIgQUJPUlQgPSBmYWxzZTsKICAgIHZhciBFWElUU1RBVFVTOwogICAgdmFyIEhFQVA4LCBIRUFQVTgsIEhFQVAxNiwgSEVBUFUxNiwgSEVBUDMyLCBIRUFQVTMyLCBIRUFQRjMyLCBIRUFQNjQsIEhFQVBVNjQsIEhFQVBGNjQ7CiAgICB2YXIgcnVudGltZUluaXRpYWxpemVkID0gZmFsc2U7CiAgICBmdW5jdGlvbiB1cGRhdGVNZW1vcnlWaWV3cygpIHsKICAgICAgdmFyIGIgPSB3YXNtTWVtb3J5LmJ1ZmZlcjsKICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGIpOwogICAgICBNb2R1bGVbIkhFQVAxNiJdID0gSEVBUDE2ID0gbmV3IEludDE2QXJyYXkoYik7CiAgICAgIE1vZHVsZVsiSEVBUFU4Il0gPSBIRUFQVTggPSBuZXcgVWludDhBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQVTE2Il0gPSBIRUFQVTE2ID0gbmV3IFVpbnQxNkFycmF5KGIpOwogICAgICBNb2R1bGVbIkhFQVAzMiJdID0gSEVBUDMyID0gbmV3IEludDMyQXJyYXkoYik7CiAgICAgIE1vZHVsZVsiSEVBUFUzMiJdID0gSEVBUFUzMiA9IG5ldyBVaW50MzJBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQRjMyIl0gPSBIRUFQRjMyID0gbmV3IEZsb2F0MzJBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBIRUFQRjY0ID0gbmV3IEZsb2F0NjRBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQNjQiXSA9IEhFQVA2NCA9IG5ldyBCaWdJbnQ2NEFycmF5KGIpOwogICAgICBNb2R1bGVbIkhFQVBVNjQiXSA9IEhFQVBVNjQgPSBuZXcgQmlnVWludDY0QXJyYXkoYik7CiAgICB9CiAgICBmdW5jdGlvbiBwcmVSdW4oKSB7CiAgICAgIGlmIChNb2R1bGVbInByZVJ1biJdKSB7CiAgICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbInByZVJ1biJdID09ICJmdW5jdGlvbiIpIE1vZHVsZVsicHJlUnVuIl0gPSBbTW9kdWxlWyJwcmVSdW4iXV07CiAgICAgICAgd2hpbGUgKE1vZHVsZVsicHJlUnVuIl0ubGVuZ3RoKSB7CiAgICAgICAgICBhZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhvblByZVJ1bnMpOwogICAgfQogICAgZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKSB7CiAgICAgIHJ1bnRpbWVJbml0aWFsaXplZCA9IHRydWU7CiAgICAgIHdhc21FeHBvcnRzWyJ0Il0oKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikgTW9kdWxlWyJwb3N0UnVuIl0gPSBbTW9kdWxlWyJwb3N0UnVuIl1dOwogICAgICAgIHdoaWxlIChNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3Mob25Qb3N0UnVucyk7CiAgICB9CiAgICB2YXIgcnVuRGVwZW5kZW5jaWVzID0gMDsKICAgIHZhciBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCkgewogICAgICBydW5EZXBlbmRlbmNpZXMrKzsKICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0/LihydW5EZXBlbmRlbmNpZXMpOwogICAgfQogICAgZnVuY3Rpb24gcmVtb3ZlUnVuRGVwZW5kZW5jeShpZCkgewogICAgICBydW5EZXBlbmRlbmNpZXMtLTsKICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0/LihydW5EZXBlbmRlbmNpZXMpOwogICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID09IDApIHsKICAgICAgICBpZiAoZGVwZW5kZW5jaWVzRnVsZmlsbGVkKSB7CiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBkZXBlbmRlbmNpZXNGdWxmaWxsZWQ7CiAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFib3J0KHdoYXQpIHsKICAgICAgTW9kdWxlWyJvbkFib3J0Il0/Lih3aGF0KTsKICAgICAgd2hhdCA9ICJBYm9ydGVkKCIgKyB3aGF0ICsgIikiOwogICAgICBlcnIod2hhdCk7CiAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgd2hhdCArPSAiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7CiAgICAgIHZhciBlID0gbmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcih3aGF0KTsKICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICB0aHJvdyBlOwogICAgfQogICAgdmFyIHdhc21CaW5hcnlGaWxlOwogICAgZnVuY3Rpb24gZmluZFdhc21CaW5hcnkoKSB7CiAgICAgIGlmIChNb2R1bGVbImxvY2F0ZUZpbGUiXSkgewogICAgICAgIHJldHVybiBsb2NhdGVGaWxlKCJvcGVuanBlZy53YXNtIik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBVUkwoIm9wZW5qcGVnLndhc20iLCBpbXBvcnQubWV0YS51cmwpLmhyZWY7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRCaW5hcnlTeW5jKGZpbGUpIHsKICAgICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkgewogICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgfQogICAgICBpZiAocmVhZEJpbmFyeSkgewogICAgICAgIHJldHVybiByZWFkQmluYXJ5KGZpbGUpOwogICAgICB9CiAgICAgIHRocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCI7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBnZXRXYXNtQmluYXJ5KGJpbmFyeUZpbGUpIHsKICAgICAgaWYgKCF3YXNtQmluYXJ5KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IHJlYWRBc3luYyhiaW5hcnlGaWxlKTsKICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZXNwb25zZSk7CiAgICAgICAgfSBjYXRjaCB7fQogICAgICB9CiAgICAgIHJldHVybiBnZXRCaW5hcnlTeW5jKGJpbmFyeUZpbGUpOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihiaW5hcnlGaWxlLCBpbXBvcnRzKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGJpbmFyeSA9IGF3YWl0IGdldFdhc21CaW5hcnkoYmluYXJ5RmlsZSk7CiAgICAgICAgdmFyIGluc3RhbmNlID0gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbXBvcnRzKTsKICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgIGVycihgZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogJHtyZWFzb259YCk7CiAgICAgICAgYWJvcnQocmVhc29uKTsKICAgICAgfQogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYyhiaW5hcnksIGJpbmFyeUZpbGUsIGltcG9ydHMpIHsKICAgICAgaWYgKCFiaW5hcnkgJiYgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09ICJmdW5jdGlvbiIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdmFyIHJlc3BvbnNlID0gZmV0Y2goYmluYXJ5RmlsZSwgewogICAgICAgICAgICBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIgogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIgaW5zdGFudGlhdGlvblJlc3VsdCA9IGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlLCBpbXBvcnRzKTsKICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0aW9uUmVzdWx0OwogICAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgICAgZXJyKGB3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogJHtyZWFzb259YCk7CiAgICAgICAgICBlcnIoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKGJpbmFyeUZpbGUsIGltcG9ydHMpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0V2FzbUltcG9ydHMoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgYTogd2FzbUltcG9ydHMKICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVdhc20oKSB7CiAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgd2FzbUV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgIHdhc21NZW1vcnkgPSB3YXNtRXhwb3J0c1sicyJdOwogICAgICAgIHVwZGF0ZU1lbW9yeVZpZXdzKCk7CiAgICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeSgid2FzbS1pbnN0YW50aWF0ZSIpOwogICAgICAgIHJldHVybiB3YXNtRXhwb3J0czsKICAgICAgfQogICAgICBhZGRSdW5EZXBlbmRlbmN5KCJ3YXNtLWluc3RhbnRpYXRlIik7CiAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0aW9uUmVzdWx0KHJlc3VsdCkgewogICAgICAgIHJldHVybiByZWNlaXZlSW5zdGFuY2UocmVzdWx0WyJpbnN0YW5jZSJdKTsKICAgICAgfQogICAgICB2YXIgaW5mbyA9IGdldFdhc21JbXBvcnRzKCk7CiAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIE1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0oaW5mbywgKG1vZCwgaW5zdCkgPT4gewogICAgICAgICAgICByZWNlaXZlSW5zdGFuY2UobW9kLCBpbnN0KTsKICAgICAgICAgICAgcmVzb2x2ZShtb2QuZXhwb3J0cyk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICB3YXNtQmluYXJ5RmlsZSA/Pz0gZmluZFdhc21CaW5hcnkoKTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgaW5zdGFudGlhdGVBc3luYyh3YXNtQmluYXJ5LCB3YXNtQmluYXJ5RmlsZSwgaW5mbyk7CiAgICAgICAgdmFyIGV4cG9ydHMgPSByZWNlaXZlSW5zdGFudGlhdGlvblJlc3VsdChyZXN1bHQpOwogICAgICAgIHJldHVybiBleHBvcnRzOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmVhZHlQcm9taXNlUmVqZWN0KGUpOwogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTsKICAgICAgfQogICAgfQogICAgY2xhc3MgRXhpdFN0YXR1cyB7CiAgICAgIG5hbWUgPSAiRXhpdFN0YXR1cyI7CiAgICAgIGNvbnN0cnVjdG9yKHN0YXR1cykgewogICAgICAgIHRoaXMubWVzc2FnZSA9IGBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCR7c3RhdHVzfSlgOwogICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwogICAgICB9CiAgICB9CiAgICB2YXIgY2FsbFJ1bnRpbWVDYWxsYmFja3MgPSBjYWxsYmFja3MgPT4gewogICAgICB3aGlsZSAoY2FsbGJhY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICBjYWxsYmFja3Muc2hpZnQoKShNb2R1bGUpOwogICAgICB9CiAgICB9OwogICAgdmFyIG9uUG9zdFJ1bnMgPSBbXTsKICAgIHZhciBhZGRPblBvc3RSdW4gPSBjYiA9PiBvblBvc3RSdW5zLnVuc2hpZnQoY2IpOwogICAgdmFyIG9uUHJlUnVucyA9IFtdOwogICAgdmFyIGFkZE9uUHJlUnVuID0gY2IgPT4gb25QcmVSdW5zLnVuc2hpZnQoY2IpOwogICAgdmFyIG5vRXhpdFJ1bnRpbWUgPSBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSB8fCB0cnVlOwogICAgdmFyIF9fYWJvcnRfanMgPSAoKSA9PiBhYm9ydCgiIik7CiAgICB2YXIgcnVudGltZUtlZXBhbGl2ZUNvdW50ZXIgPSAwOwogICAgdmFyIF9fZW1zY3JpcHRlbl9ydW50aW1lX2tlZXBhbGl2ZV9jbGVhciA9ICgpID0+IHsKICAgICAgbm9FeGl0UnVudGltZSA9IGZhbHNlOwogICAgICBydW50aW1lS2VlcGFsaXZlQ291bnRlciA9IDA7CiAgICB9OwogICAgdmFyIHRpbWVycyA9IHt9OwogICAgdmFyIGhhbmRsZUV4Y2VwdGlvbiA9IGUgPT4gewogICAgICBpZiAoZSBpbnN0YW5jZW9mIEV4aXRTdGF0dXMgfHwgZSA9PSAidW53aW5kIikgewogICAgICAgIHJldHVybiBFWElUU1RBVFVTOwogICAgICB9CiAgICAgIHF1aXRfKDEsIGUpOwogICAgfTsKICAgIHZhciBrZWVwUnVudGltZUFsaXZlID0gKCkgPT4gbm9FeGl0UnVudGltZSB8fCBydW50aW1lS2VlcGFsaXZlQ291bnRlciA+IDA7CiAgICB2YXIgX3Byb2NfZXhpdCA9IGNvZGUgPT4gewogICAgICBFWElUU1RBVFVTID0gY29kZTsKICAgICAgaWYgKCFrZWVwUnVudGltZUFsaXZlKCkpIHsKICAgICAgICBNb2R1bGVbIm9uRXhpdCJdPy4oY29kZSk7CiAgICAgICAgQUJPUlQgPSB0cnVlOwogICAgICB9CiAgICAgIHF1aXRfKGNvZGUsIG5ldyBFeGl0U3RhdHVzKGNvZGUpKTsKICAgIH07CiAgICB2YXIgZXhpdEpTID0gKHN0YXR1cywgaW1wbGljaXQpID0+IHsKICAgICAgRVhJVFNUQVRVUyA9IHN0YXR1czsKICAgICAgX3Byb2NfZXhpdChzdGF0dXMpOwogICAgfTsKICAgIHZhciBfZXhpdCA9IGV4aXRKUzsKICAgIHZhciBtYXliZUV4aXQgPSAoKSA9PiB7CiAgICAgIGlmICgha2VlcFJ1bnRpbWVBbGl2ZSgpKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIF9leGl0KEVYSVRTVEFUVVMpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICB2YXIgY2FsbFVzZXJDYWxsYmFjayA9IGZ1bmMgPT4gewogICAgICBpZiAoQUJPUlQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBmdW5jKCk7CiAgICAgICAgbWF5YmVFeGl0KCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9ICgpID0+IHBlcmZvcm1hbmNlLm5vdygpOwogICAgdmFyIF9fc2V0aXRpbWVyX2pzID0gKHdoaWNoLCB0aW1lb3V0X21zKSA9PiB7CiAgICAgIGlmICh0aW1lcnNbd2hpY2hdKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyc1t3aGljaF0uaWQpOwogICAgICAgIGRlbGV0ZSB0aW1lcnNbd2hpY2hdOwogICAgICB9CiAgICAgIGlmICghdGltZW91dF9tcykgcmV0dXJuIDA7CiAgICAgIHZhciBpZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGRlbGV0ZSB0aW1lcnNbd2hpY2hdOwogICAgICAgIGNhbGxVc2VyQ2FsbGJhY2soKCkgPT4gX19lbXNjcmlwdGVuX3RpbWVvdXQod2hpY2gsIF9lbXNjcmlwdGVuX2dldF9ub3coKSkpOwogICAgICB9LCB0aW1lb3V0X21zKTsKICAgICAgdGltZXJzW3doaWNoXSA9IHsKICAgICAgICBpZCwKICAgICAgICB0aW1lb3V0X21zCiAgICAgIH07CiAgICAgIHJldHVybiAwOwogICAgfTsKICAgIGZ1bmN0aW9uIF9jb3B5X3BpeGVsc18xKGNvbXBHX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBHX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wRyA9IEhFQVAzMi5zdWJhcnJheShjb21wR19wdHIsIGNvbXBHX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGltYWdlRGF0YS5zZXQoY29tcEcpOwogICAgfQogICAgZnVuY3Rpb24gX2NvcHlfcGl4ZWxzXzMoY29tcFJfcHRyLCBjb21wR19wdHIsIGNvbXBCX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBSX3B0ciA+Pj0gMjsKICAgICAgY29tcEdfcHRyID4+PSAyOwogICAgICBjb21wQl9wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzICogMyk7CiAgICAgIGNvbnN0IGNvbXBSID0gSEVBUDMyLnN1YmFycmF5KGNvbXBSX3B0ciwgY29tcFJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQiA9IEhFQVAzMi5zdWJhcnJheShjb21wQl9wdHIsIGNvbXBCX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmJfcGl4ZWxzOyBpKyspIHsKICAgICAgICBpbWFnZURhdGFbMyAqIGldID0gY29tcFJbaV07CiAgICAgICAgaW1hZ2VEYXRhWzMgKiBpICsgMV0gPSBjb21wR1tpXTsKICAgICAgICBpbWFnZURhdGFbMyAqIGkgKyAyXSA9IGNvbXBCW2ldOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfY29weV9waXhlbHNfNChjb21wUl9wdHIsIGNvbXBHX3B0ciwgY29tcEJfcHRyLCBjb21wQV9wdHIsIG5iX3BpeGVscykgewogICAgICBjb21wUl9wdHIgPj49IDI7CiAgICAgIGNvbXBHX3B0ciA+Pj0gMjsKICAgICAgY29tcEJfcHRyID4+PSAyOwogICAgICBjb21wQV9wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzICogNCk7CiAgICAgIGNvbnN0IGNvbXBSID0gSEVBUDMyLnN1YmFycmF5KGNvbXBSX3B0ciwgY29tcFJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQiA9IEhFQVAzMi5zdWJhcnJheShjb21wQl9wdHIsIGNvbXBCX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGNvbnN0IGNvbXBBID0gSEVBUDMyLnN1YmFycmF5KGNvbXBBX3B0ciwgY29tcEFfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYl9waXhlbHM7IGkrKykgewogICAgICAgIGltYWdlRGF0YVs0ICogaV0gPSBjb21wUltpXTsKICAgICAgICBpbWFnZURhdGFbNCAqIGkgKyAxXSA9IGNvbXBHW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDJdID0gY29tcEJbaV07CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpICsgM10gPSBjb21wQVtpXTsKICAgICAgfQogICAgfQogICAgdmFyIGdldEhlYXBNYXggPSAoKSA9PiAyMTQ3NDgzNjQ4OwogICAgdmFyIGFsaWduTWVtb3J5ID0gKHNpemUsIGFsaWdubWVudCkgPT4gTWF0aC5jZWlsKHNpemUgLyBhbGlnbm1lbnQpICogYWxpZ25tZW50OwogICAgdmFyIGdyb3dNZW1vcnkgPSBzaXplID0+IHsKICAgICAgdmFyIGIgPSB3YXNtTWVtb3J5LmJ1ZmZlcjsKICAgICAgdmFyIHBhZ2VzID0gKHNpemUgLSBiLmJ5dGVMZW5ndGggKyA2NTUzNSkgLyA2NTUzNiB8IDA7CiAgICAgIHRyeSB7CiAgICAgICAgd2FzbU1lbW9yeS5ncm93KHBhZ2VzKTsKICAgICAgICB1cGRhdGVNZW1vcnlWaWV3cygpOwogICAgICAgIHJldHVybiAxOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfTsKICAgIHZhciBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCA9IHJlcXVlc3RlZFNpemUgPT4gewogICAgICB2YXIgb2xkU2l6ZSA9IEhFQVBVOC5sZW5ndGg7CiAgICAgIHJlcXVlc3RlZFNpemUgPj4+PSAwOwogICAgICB2YXIgbWF4SGVhcFNpemUgPSBnZXRIZWFwTWF4KCk7CiAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZm9yICh2YXIgY3V0RG93biA9IDE7IGN1dERvd24gPD0gNDsgY3V0RG93biAqPSAyKSB7CiAgICAgICAgdmFyIG92ZXJHcm93bkhlYXBTaXplID0gb2xkU2l6ZSAqICgxICsgLjIgLyBjdXREb3duKTsKICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnbk1lbW9yeShNYXRoLm1heChyZXF1ZXN0ZWRTaXplLCBvdmVyR3Jvd25IZWFwU2l6ZSksIDY1NTM2KSk7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZ3Jvd01lbW9yeShuZXdTaXplKTsKICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgdmFyIEVOViA9IHt9OwogICAgdmFyIGdldEV4ZWN1dGFibGVOYW1lID0gKCkgPT4gdGhpc1Byb2dyYW0gfHwgIi4vdGhpcy5wcm9ncmFtIjsKICAgIHZhciBnZXRFbnZTdHJpbmdzID0gKCkgPT4gewogICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgIHZhciBsYW5nID0gKHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgVVNFUjogIndlYl91c2VyIiwKICAgICAgICAgIExPR05BTUU6ICJ3ZWJfdXNlciIsCiAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICBQV0Q6ICIvIiwKICAgICAgICAgIEhPTUU6ICIvaG9tZS93ZWJfdXNlciIsCiAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgXzogZ2V0RXhlY3V0YWJsZU5hbWUoKQogICAgICAgIH07CiAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgIGlmIChFTlZbeF0gPT09IHVuZGVmaW5lZCkgZGVsZXRlIGVudlt4XTtlbHNlIGVudlt4XSA9IEVOVlt4XTsKICAgICAgICB9CiAgICAgICAgdmFyIHN0cmluZ3MgPSBbXTsKICAgICAgICBmb3IgKHZhciB4IGluIGVudikgewogICAgICAgICAgc3RyaW5ncy5wdXNoKGAke3h9PSR7ZW52W3hdfWApOwogICAgICAgIH0KICAgICAgICBnZXRFbnZTdHJpbmdzLnN0cmluZ3MgPSBzdHJpbmdzOwogICAgICB9CiAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICB9OwogICAgdmFyIHN0cmluZ1RvQXNjaWkgPSAoc3RyLCBidWZmZXIpID0+IHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICBIRUFQOFtidWZmZXIrK10gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgfQogICAgICBIRUFQOFtidWZmZXJdID0gMDsKICAgIH07CiAgICB2YXIgX2Vudmlyb25fZ2V0ID0gKF9fZW52aXJvbiwgZW52aXJvbl9idWYpID0+IHsKICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICBnZXRFbnZTdHJpbmdzKCkuZm9yRWFjaCgoc3RyaW5nLCBpKSA9PiB7CiAgICAgICAgdmFyIHB0ciA9IGVudmlyb25fYnVmICsgYnVmU2l6ZTsKICAgICAgICBIRUFQVTMyW19fZW52aXJvbiArIGkgKiA0ID4+IDJdID0gcHRyOwogICAgICAgIHN0cmluZ1RvQXNjaWkoc3RyaW5nLCBwdHIpOwogICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgIH0pOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICB2YXIgX2Vudmlyb25fc2l6ZXNfZ2V0ID0gKHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgPT4gewogICAgICB2YXIgc3RyaW5ncyA9IGdldEVudlN0cmluZ3MoKTsKICAgICAgSEVBUFUzMltwZW52aXJvbl9jb3VudCA+PiAyXSA9IHN0cmluZ3MubGVuZ3RoOwogICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgIHN0cmluZ3MuZm9yRWFjaChzdHJpbmcgPT4gYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMSk7CiAgICAgIEhFQVBVMzJbcGVudmlyb25fYnVmX3NpemUgPj4gMl0gPSBidWZTaXplOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICB2YXIgX2ZkX2Nsb3NlID0gZmQgPT4gNTI7CiAgICB2YXIgSU5UNTNfTUFYID0gOTAwNzE5OTI1NDc0MDk5MjsKICAgIHZhciBJTlQ1M19NSU4gPSAtOTAwNzE5OTI1NDc0MDk5MjsKICAgIHZhciBiaWdpbnRUb0k1M0NoZWNrZWQgPSBudW0gPT4gbnVtIDwgSU5UNTNfTUlOIHx8IG51bSA+IElOVDUzX01BWCA/IE5hTiA6IE51bWJlcihudW0pOwogICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldCwgd2hlbmNlLCBuZXdPZmZzZXQpIHsKICAgICAgb2Zmc2V0ID0gYmlnaW50VG9JNTNDaGVja2VkKG9mZnNldCk7CiAgICAgIHJldHVybiA3MDsKICAgIH0KICAgIHZhciBwcmludENoYXJCdWZmZXJzID0gW251bGwsIFtdLCBbXV07CiAgICB2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT0gInVuZGVmaW5lZCIgPyBuZXcgVGV4dERlY29kZXIoKSA6IHVuZGVmaW5lZDsKICAgIHZhciBVVEY4QXJyYXlUb1N0cmluZyA9IChoZWFwT3JBcnJheSwgaWR4ID0gMCwgbWF4Qnl0ZXNUb1JlYWQgPSBOYU4pID0+IHsKICAgICAgdmFyIGVuZElkeCA9IGlkeCArIG1heEJ5dGVzVG9SZWFkOwogICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICB3aGlsZSAoaGVhcE9yQXJyYXlbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKSArK2VuZFB0cjsKICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXBPckFycmF5LmJ1ZmZlciAmJiBVVEY4RGVjb2RlcikgewogICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcE9yQXJyYXkuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgfQogICAgICB2YXIgc3RyID0gIiI7CiAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHsKICAgICAgICB2YXIgdTAgPSBoZWFwT3JBcnJheVtpZHgrK107CiAgICAgICAgaWYgKCEodTAgJiAxMjgpKSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdmFyIHUxID0gaGVhcE9yQXJyYXlbaWR4KytdICYgNjM7CiAgICAgICAgaWYgKCh1MCAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgodTAgJiAzMSkgPDwgNiB8IHUxKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB2YXIgdTIgPSBoZWFwT3JBcnJheVtpZHgrK10gJiA2MzsKICAgICAgICBpZiAoKHUwICYgMjQwKSA9PSAyMjQpIHsKICAgICAgICAgIHUwID0gKHUwICYgMTUpIDw8IDEyIHwgdTEgPDwgNiB8IHUyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1MCA9ICh1MCAmIDcpIDw8IDE4IHwgdTEgPDwgMTIgfCB1MiA8PCA2IHwgaGVhcE9yQXJyYXlbaWR4KytdICYgNjM7CiAgICAgICAgfQogICAgICAgIGlmICh1MCA8IDY1NTM2KSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBjaCA9IHUwIC0gNjU1MzY7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NiB8IGNoID4+IDEwLCA1NjMyMCB8IGNoICYgMTAyMyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzdHI7CiAgICB9OwogICAgdmFyIHByaW50Q2hhciA9IChzdHJlYW0sIGN1cnIpID0+IHsKICAgICAgdmFyIGJ1ZmZlciA9IHByaW50Q2hhckJ1ZmZlcnNbc3RyZWFtXTsKICAgICAgaWYgKGN1cnIgPT09IDAgfHwgY3VyciA9PT0gMTApIHsKICAgICAgICAoc3RyZWFtID09PSAxID8gb3V0IDogZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIpKTsKICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXIucHVzaChjdXJyKTsKICAgICAgfQogICAgfTsKICAgIHZhciBVVEY4VG9TdHJpbmcgPSAocHRyLCBtYXhCeXRlc1RvUmVhZCkgPT4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgdmFyIF9mZF93cml0ZSA9IChmZCwgaW92LCBpb3ZjbnQsIHBudW0pID0+IHsKICAgICAgdmFyIG51bSA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKICAgICAgICB2YXIgcHRyID0gSEVBUFUzMltpb3YgPj4gMl07CiAgICAgICAgdmFyIGxlbiA9IEhFQVBVMzJbaW92ICsgNCA+PiAyXTsKICAgICAgICBpb3YgKz0gODsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgICBwcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgfQogICAgICAgIG51bSArPSBsZW47CiAgICAgIH0KICAgICAgSEVBUFUzMltwbnVtID4+IDJdID0gbnVtOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICBmdW5jdGlvbiBfZ3JheV90b19yZ2JhKGNvbXBHX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBHX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMgKiA0KTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5iX3BpeGVsczsgaSsrKSB7CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpXSA9IGltYWdlRGF0YVs0ICogaSArIDFdID0gaW1hZ2VEYXRhWzQgKiBpICsgMl0gPSBjb21wR1tpXTsKICAgICAgICBpbWFnZURhdGFbNCAqIGkgKyAzXSA9IDI1NTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gX2dyYXlhX3RvX3JnYmEoY29tcEdfcHRyLCBjb21wQV9wdHIsIG5iX3BpeGVscykgewogICAgICBjb21wR19wdHIgPj49IDI7CiAgICAgIGNvbXBBX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMgKiA0KTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQSA9IEhFQVAzMi5zdWJhcnJheShjb21wQV9wdHIsIGNvbXBBX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmJfcGl4ZWxzOyBpKyspIHsKICAgICAgICBpbWFnZURhdGFbNCAqIGldID0gaW1hZ2VEYXRhWzQgKiBpICsgMV0gPSBpbWFnZURhdGFbNCAqIGkgKyAyXSA9IGNvbXBHW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDNdID0gY29tcEFbaV07CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9qc1ByaW50V2FybmluZyhtZXNzYWdlX3B0cikgewogICAgICBjb25zdCBtZXNzYWdlID0gVVRGOFRvU3RyaW5nKG1lc3NhZ2VfcHRyKTsKICAgICAgKE1vZHVsZS53YXJuIHx8IGNvbnNvbGUud2FybikoYE9wZW5KUEVHOiAke21lc3NhZ2V9YCk7CiAgICB9CiAgICBmdW5jdGlvbiBfcmdiX3RvX3JnYmEoY29tcFJfcHRyLCBjb21wR19wdHIsIGNvbXBCX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBSX3B0ciA+Pj0gMjsKICAgICAgY29tcEdfcHRyID4+PSAyOwogICAgICBjb21wQl9wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzICogNCk7CiAgICAgIGNvbnN0IGNvbXBSID0gSEVBUDMyLnN1YmFycmF5KGNvbXBSX3B0ciwgY29tcFJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBIRUFQMzIuc3ViYXJyYXkoY29tcEdfcHRyLCBjb21wR19wdHIgKyBuYl9waXhlbHMpOwogICAgICBjb25zdCBjb21wQiA9IEhFQVAzMi5zdWJhcnJheShjb21wQl9wdHIsIGNvbXBCX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmJfcGl4ZWxzOyBpKyspIHsKICAgICAgICBpbWFnZURhdGFbNCAqIGldID0gY29tcFJbaV07CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpICsgMV0gPSBjb21wR1tpXTsKICAgICAgICBpbWFnZURhdGFbNCAqIGkgKyAyXSA9IGNvbXBCW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDNdID0gMjU1OwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfc3RvcmVFcnJvck1lc3NhZ2UobWVzc2FnZV9wdHIpIHsKICAgICAgY29uc3QgbWVzc2FnZSA9IFVURjhUb1N0cmluZyhtZXNzYWdlX3B0cik7CiAgICAgIGlmICghTW9kdWxlLmVycm9yTWVzc2FnZXMpIHsKICAgICAgICBNb2R1bGUuZXJyb3JNZXNzYWdlcyA9IG1lc3NhZ2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgTW9kdWxlLmVycm9yTWVzc2FnZXMgKz0gIlxuIiArIG1lc3NhZ2U7CiAgICAgIH0KICAgIH0KICAgIHZhciB3YXNtSW1wb3J0cyA9IHsKICAgICAgbDogX19hYm9ydF9qcywKICAgICAgazogX19lbXNjcmlwdGVuX3J1bnRpbWVfa2VlcGFsaXZlX2NsZWFyLAogICAgICBtOiBfX3NldGl0aW1lcl9qcywKICAgICAgZzogX2NvcHlfcGl4ZWxzXzEsCiAgICAgIGY6IF9jb3B5X3BpeGVsc18zLAogICAgICBlOiBfY29weV9waXhlbHNfNCwKICAgICAgbjogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgIHA6IF9lbnZpcm9uX2dldCwKICAgICAgcTogX2Vudmlyb25fc2l6ZXNfZ2V0LAogICAgICBiOiBfZmRfY2xvc2UsCiAgICAgIG86IF9mZF9zZWVrLAogICAgICBjOiBfZmRfd3JpdGUsCiAgICAgIHI6IF9ncmF5X3RvX3JnYmEsCiAgICAgIGk6IF9ncmF5YV90b19yZ2JhLAogICAgICBkOiBfanNQcmludFdhcm5pbmcsCiAgICAgIGo6IF9wcm9jX2V4aXQsCiAgICAgIGg6IF9yZ2JfdG9fcmdiYSwKICAgICAgYTogX3N0b3JlRXJyb3JNZXNzYWdlCiAgICB9OwogICAgdmFyIHdhc21FeHBvcnRzID0gYXdhaXQgY3JlYXRlV2FzbSgpOwogICAgdmFyIF9fX3dhc21fY2FsbF9jdG9ycyA9IHdhc21FeHBvcnRzWyJ0Il07CiAgICB2YXIgX21hbGxvYyA9IE1vZHVsZVsiX21hbGxvYyJdID0gd2FzbUV4cG9ydHNbInUiXTsKICAgIHZhciBfZnJlZSA9IE1vZHVsZVsiX2ZyZWUiXSA9IHdhc21FeHBvcnRzWyJ2Il07CiAgICB2YXIgX2pwMl9kZWNvZGUgPSBNb2R1bGVbIl9qcDJfZGVjb2RlIl0gPSB3YXNtRXhwb3J0c1sieCJdOwogICAgdmFyIF9fZW1zY3JpcHRlbl90aW1lb3V0ID0gd2FzbUV4cG9ydHNbInkiXTsKICAgIGZ1bmN0aW9uIHJ1bigpIHsKICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBydW47CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHByZVJ1bigpOwogICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bjsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZG9SdW4oKSB7CiAgICAgICAgTW9kdWxlWyJjYWxsZWRSdW4iXSA9IHRydWU7CiAgICAgICAgaWYgKEFCT1JUKSByZXR1cm47CiAgICAgICAgaW5pdFJ1bnRpbWUoKTsKICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlKE1vZHVsZSk7CiAgICAgICAgTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdPy4oKTsKICAgICAgICBwb3N0UnVuKCk7CiAgICAgIH0KICAgICAgaWYgKE1vZHVsZVsic2V0U3RhdHVzIl0pIHsKICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCJSdW5uaW5nLi4uIik7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IE1vZHVsZVsic2V0U3RhdHVzIl0oIiIpLCAxKTsKICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgfSwgMSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZG9SdW4oKTsKICAgICAgfQogICAgfQogICAgaWYgKE1vZHVsZVsicHJlSW5pdCJdKSB7CiAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il0gPT0gImZ1bmN0aW9uIikgTW9kdWxlWyJwcmVJbml0Il0gPSBbTW9kdWxlWyJwcmVJbml0Il1dOwogICAgICB3aGlsZSAoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoID4gMCkgewogICAgICAgIE1vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCk7CiAgICAgIH0KICAgIH0KICAgIHJ1bigpOwogICAgbW9kdWxlUnRuID0gcmVhZHlQcm9taXNlOwogICAgcmV0dXJuIG1vZHVsZVJ0bjsKICB9Owp9KSgpOwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIGNvbnN0IG9wZW5qcGVnID0gKE9wZW5KUEVHKTsKOy8vIC4vc3JjL2NvcmUvanB4LmpzCgoKCgpjbGFzcyBKcHhFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiSnB4RXJyb3IiKTsKICB9Cn0KY2xhc3MgSnB4SW1hZ2UgewogIHN0YXRpYyAjYnVmZmVyID0gbnVsbDsKICBzdGF0aWMgI2hhbmRsZXIgPSBudWxsOwogIHN0YXRpYyAjbW9kdWxlUHJvbWlzZSA9IG51bGw7CiAgc3RhdGljICN1c2VXYXNtID0gdHJ1ZTsKICBzdGF0aWMgI3VzZVdvcmtlckZldGNoID0gdHJ1ZTsKICBzdGF0aWMgI3dhc21VcmwgPSBudWxsOwogIHN0YXRpYyBzZXRPcHRpb25zKHsKICAgIGhhbmRsZXIsCiAgICB1c2VXYXNtLAogICAgdXNlV29ya2VyRmV0Y2gsCiAgICB3YXNtVXJsCiAgfSkgewogICAgdGhpcy4jdXNlV2FzbSA9IHVzZVdhc207CiAgICB0aGlzLiN1c2VXb3JrZXJGZXRjaCA9IHVzZVdvcmtlckZldGNoOwogICAgdGhpcy4jd2FzbVVybCA9IHdhc21Vcmw7CiAgICBpZiAoIXVzZVdvcmtlckZldGNoKSB7CiAgICAgIHRoaXMuI2hhbmRsZXIgPSBoYW5kbGVyOwogICAgfQogIH0KICBzdGF0aWMgYXN5bmMgI2dldEpzTW9kdWxlKGZhbGxiYWNrQ2FsbGJhY2spIHsKICAgIGNvbnN0IHBhdGggPSBgJHt0aGlzLiN3YXNtVXJsfW9wZW5qcGVnX25vd2FzbV9mYWxsYmFjay5qc2A7CiAgICBsZXQgaW5zdGFuY2UgPSBudWxsOwogICAgdHJ5IHsKICAgICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KAogICAgICAvKndlYnBhY2tJZ25vcmU6IHRydWUqLwogICAgICAvKkB2aXRlLWlnbm9yZSovCiAgICAgIHBhdGgpOwogICAgICBpbnN0YW5jZSA9IG1vZC5kZWZhdWx0KCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdhcm4oYEpweEltYWdlI2dldEpzTW9kdWxlOiAke2V9YCk7CiAgICB9CiAgICBmYWxsYmFja0NhbGxiYWNrKGluc3RhbmNlKTsKICB9CiAgc3RhdGljIGFzeW5jICNpbnN0YW50aWF0ZVdhc20oZmFsbGJhY2tDYWxsYmFjaywgaW1wb3J0cywgc3VjY2Vzc0NhbGxiYWNrKSB7CiAgICBjb25zdCBmaWxlbmFtZSA9ICJvcGVuanBlZy53YXNtIjsKICAgIHRyeSB7CiAgICAgIGlmICghdGhpcy4jYnVmZmVyKSB7CiAgICAgICAgaWYgKHRoaXMuI3VzZVdvcmtlckZldGNoKSB7CiAgICAgICAgICB0aGlzLiNidWZmZXIgPSBhd2FpdCBmZXRjaEJpbmFyeURhdGEoYCR7dGhpcy4jd2FzbVVybH0ke2ZpbGVuYW1lfWApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLiNidWZmZXIgPSBhd2FpdCB0aGlzLiNoYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiRmV0Y2hCaW5hcnlEYXRhIiwgewogICAgICAgICAgICB0eXBlOiAid2FzbUZhY3RvcnkiLAogICAgICAgICAgICBmaWxlbmFtZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh0aGlzLiNidWZmZXIsIGltcG9ydHMpOwogICAgICByZXR1cm4gc3VjY2Vzc0NhbGxiYWNrKHJlc3VsdHMuaW5zdGFuY2UpOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYEpweEltYWdlI2luc3RhbnRpYXRlV2FzbTogJHtyZWFzb259YCk7CiAgICAgIHRoaXMuI2dldEpzTW9kdWxlKGZhbGxiYWNrQ2FsbGJhY2spOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZmluYWxseSB7CiAgICAgIHRoaXMuI2hhbmRsZXIgPSBudWxsOwogICAgfQogIH0KICBzdGF0aWMgYXN5bmMgZGVjb2RlKGJ5dGVzLCB7CiAgICBudW1Db21wb25lbnRzID0gNCwKICAgIGlzSW5kZXhlZENvbG9ybWFwID0gZmFsc2UsCiAgICBzbWFza0luRGF0YSA9IGZhbHNlCiAgfSA9IHt9KSB7CiAgICBpZiAoIXRoaXMuI21vZHVsZVByb21pc2UpIHsKICAgICAgY29uc3QgewogICAgICAgIHByb21pc2UsCiAgICAgICAgcmVzb2x2ZQogICAgICB9ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VdOwogICAgICBpZiAoIXRoaXMuI3VzZVdhc20pIHsKICAgICAgICB0aGlzLiNnZXRKc01vZHVsZShyZXNvbHZlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwcm9taXNlcy5wdXNoKG9wZW5qcGVnKHsKICAgICAgICAgIHdhcm46IHdhcm4sCiAgICAgICAgICBpbnN0YW50aWF0ZVdhc206IHRoaXMuI2luc3RhbnRpYXRlV2FzbS5iaW5kKHRoaXMsIHJlc29sdmUpCiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIHRoaXMuI21vZHVsZVByb21pc2UgPSBQcm9taXNlLnJhY2UocHJvbWlzZXMpOwogICAgfQogICAgY29uc3QgbW9kdWxlID0gYXdhaXQgdGhpcy4jbW9kdWxlUHJvbWlzZTsKICAgIGlmICghbW9kdWxlKSB7CiAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3BlbkpQRUcgZmFpbGVkIHRvIGluaXRpYWxpemUiKTsKICAgIH0KICAgIGxldCBwdHI7CiAgICB0cnkgewogICAgICBjb25zdCBzaXplID0gYnl0ZXMubGVuZ3RoOwogICAgICBwdHIgPSBtb2R1bGUuX21hbGxvYyhzaXplKTsKICAgICAgbW9kdWxlLkhFQVBVOC5zZXQoYnl0ZXMsIHB0cik7CiAgICAgIGNvbnN0IHJldCA9IG1vZHVsZS5fanAyX2RlY29kZShwdHIsIHNpemUsIG51bUNvbXBvbmVudHMgPiAwID8gbnVtQ29tcG9uZW50cyA6IDAsICEhaXNJbmRleGVkQ29sb3JtYXAsICEhc21hc2tJbkRhdGEpOwogICAgICBpZiAocmV0KSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgZXJyb3JNZXNzYWdlcwogICAgICAgIH0gPSBtb2R1bGU7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHsKICAgICAgICAgIGRlbGV0ZSBtb2R1bGUuZXJyb3JNZXNzYWdlczsKICAgICAgICAgIHRocm93IG5ldyBKcHhFcnJvcihlcnJvck1lc3NhZ2VzKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJVbmtub3duIGVycm9yIik7CiAgICAgIH0KICAgICAgY29uc3QgewogICAgICAgIGltYWdlRGF0YQogICAgICB9ID0gbW9kdWxlOwogICAgICBtb2R1bGUuaW1hZ2VEYXRhID0gbnVsbDsKICAgICAgcmV0dXJuIGltYWdlRGF0YTsKICAgIH0gZmluYWxseSB7CiAgICAgIGlmIChwdHIpIHsKICAgICAgICBtb2R1bGUuX2ZyZWUocHRyKTsKICAgICAgfQogICAgfQogIH0KICBzdGF0aWMgY2xlYW51cCgpIHsKICAgIHRoaXMuI21vZHVsZVByb21pc2UgPSBudWxsOwogIH0KICBzdGF0aWMgcGFyc2VJbWFnZVByb3BlcnRpZXMoc3RyZWFtKSB7CiAgICBsZXQgbmV3Qnl0ZSA9IHN0cmVhbS5nZXRCeXRlKCk7CiAgICB3aGlsZSAobmV3Qnl0ZSA+PSAwKSB7CiAgICAgIGNvbnN0IG9sZEJ5dGUgPSBuZXdCeXRlOwogICAgICBuZXdCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgY29uc3QgY29kZSA9IG9sZEJ5dGUgPDwgOCB8IG5ld0J5dGU7CiAgICAgIGlmIChjb2RlID09PSAweGZmNTEpIHsKICAgICAgICBzdHJlYW0uc2tpcCg0KTsKICAgICAgICBjb25zdCBYc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgY29uc3QgWXNpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgIGNvbnN0IFhPc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgY29uc3QgWU9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBzdHJlYW0uc2tpcCgxNik7CiAgICAgICAgY29uc3QgQ3NpeiA9IHN0cmVhbS5nZXRVaW50MTYoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgd2lkdGg6IFhzaXogLSBYT3NpeiwKICAgICAgICAgIGhlaWdodDogWXNpeiAtIFlPc2l6LAogICAgICAgICAgYml0c1BlckNvbXBvbmVudDogOCwKICAgICAgICAgIGNvbXBvbmVudHNDb3VudDogQ3NpegogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBKcHhFcnJvcigiTm8gc2l6ZSBtYXJrZXIgZm91bmQgaW4gSlBYIHN0cmVhbSIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvYmluYXJ5X2NtYXAuanMKCmZ1bmN0aW9uIGhleFRvSW50KGEsIHNpemUpIHsKICBsZXQgbiA9IDA7CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc2l6ZTsgaSsrKSB7CiAgICBuID0gbiA8PCA4IHwgYVtpXTsKICB9CiAgcmV0dXJuIG4gPj4+IDA7Cn0KZnVuY3Rpb24gaGV4VG9TdHIoYSwgc2l6ZSkgewogIGlmIChzaXplID09PSAxKSB7CiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhWzBdLCBhWzFdKTsKICB9CiAgaWYgKHNpemUgPT09IDMpIHsKICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pOwogIH0KICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5hLnN1YmFycmF5KDAsIHNpemUgKyAxKSk7Cn0KZnVuY3Rpb24gYWRkSGV4KGEsIGIsIHNpemUpIHsKICBsZXQgYyA9IDA7CiAgZm9yIChsZXQgaSA9IHNpemU7IGkgPj0gMDsgaS0tKSB7CiAgICBjICs9IGFbaV0gKyBiW2ldOwogICAgYVtpXSA9IGMgJiAyNTU7CiAgICBjID4+PSA4OwogIH0KfQpmdW5jdGlvbiBpbmNIZXgoYSwgc2l6ZSkgewogIGxldCBjID0gMTsKICBmb3IgKGxldCBpID0gc2l6ZTsgaSA+PSAwICYmIGMgPiAwOyBpLS0pIHsKICAgIGMgKz0gYVtpXTsKICAgIGFbaV0gPSBjICYgMjU1OwogICAgYyA+Pj0gODsKICB9Cn0KY29uc3QgTUFYX05VTV9TSVpFID0gMTY7CmNvbnN0IE1BWF9FTkNPREVEX05VTV9TSVpFID0gMTk7CmNsYXNzIEJpbmFyeUNNYXBTdHJlYW0gewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIHRoaXMuYnVmZmVyID0gZGF0YTsKICAgIHRoaXMucG9zID0gMDsKICAgIHRoaXMuZW5kID0gZGF0YS5sZW5ndGg7CiAgICB0aGlzLnRtcEJ1ZiA9IG5ldyBVaW50OEFycmF5KE1BWF9FTkNPREVEX05VTV9TSVpFKTsKICB9CiAgcmVhZEJ5dGUoKSB7CiAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5lbmQpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zKytdOwogIH0KICByZWFkTnVtYmVyKCkgewogICAgbGV0IG4gPSAwOwogICAgbGV0IGxhc3Q7CiAgICBkbyB7CiAgICAgIGNvbnN0IGIgPSB0aGlzLnJlYWRCeXRlKCk7CiAgICAgIGlmIChiIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKICAgICAgfQogICAgICBsYXN0ID0gIShiICYgMHg4MCk7CiAgICAgIG4gPSBuIDw8IDcgfCBiICYgMHg3ZjsKICAgIH0gd2hpbGUgKCFsYXN0KTsKICAgIHJldHVybiBuOwogIH0KICByZWFkU2lnbmVkKCkgewogICAgY29uc3QgbiA9IHRoaXMucmVhZE51bWJlcigpOwogICAgcmV0dXJuIG4gJiAxID8gfihuID4+PiAxKSA6IG4gPj4+IDE7CiAgfQogIHJlYWRIZXgobnVtLCBzaXplKSB7CiAgICBudW0uc2V0KHRoaXMuYnVmZmVyLnN1YmFycmF5KHRoaXMucG9zLCB0aGlzLnBvcyArIHNpemUgKyAxKSk7CiAgICB0aGlzLnBvcyArPSBzaXplICsgMTsKICB9CiAgcmVhZEhleE51bWJlcihudW0sIHNpemUpIHsKICAgIGxldCBsYXN0OwogICAgY29uc3Qgc3RhY2sgPSB0aGlzLnRtcEJ1ZjsKICAgIGxldCBzcCA9IDA7CiAgICBkbyB7CiAgICAgIGNvbnN0IGIgPSB0aGlzLnJlYWRCeXRlKCk7CiAgICAgIGlmIChiIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKICAgICAgfQogICAgICBsYXN0ID0gIShiICYgMHg4MCk7CiAgICAgIHN0YWNrW3NwKytdID0gYiAmIDB4N2Y7CiAgICB9IHdoaWxlICghbGFzdCk7CiAgICBsZXQgaSA9IHNpemUsCiAgICAgIGJ1ZmZlciA9IDAsCiAgICAgIGJ1ZmZlclNpemUgPSAwOwogICAgd2hpbGUgKGkgPj0gMCkgewogICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IDggJiYgc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgIGJ1ZmZlciB8PSBzdGFja1stLXNwXSA8PCBidWZmZXJTaXplOwogICAgICAgIGJ1ZmZlclNpemUgKz0gNzsKICAgICAgfQogICAgICBudW1baV0gPSBidWZmZXIgJiAyNTU7CiAgICAgIGktLTsKICAgICAgYnVmZmVyID4+PSA4OwogICAgICBidWZmZXJTaXplIC09IDg7CiAgICB9CiAgfQogIHJlYWRIZXhTaWduZWQobnVtLCBzaXplKSB7CiAgICB0aGlzLnJlYWRIZXhOdW1iZXIobnVtLCBzaXplKTsKICAgIGNvbnN0IHNpZ24gPSBudW1bc2l6ZV0gJiAxID8gMjU1IDogMDsKICAgIGxldCBjID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNpemU7IGkrKykgewogICAgICBjID0gKGMgJiAxKSA8PCA4IHwgbnVtW2ldOwogICAgICBudW1baV0gPSBjID4+IDEgXiBzaWduOwogICAgfQogIH0KICByZWFkU3RyaW5nKCkgewogICAgY29uc3QgbGVuID0gdGhpcy5yZWFkTnVtYmVyKCksCiAgICAgIGJ1ZiA9IG5ldyBBcnJheShsZW4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBidWZbaV0gPSB0aGlzLnJlYWROdW1iZXIoKTsKICAgIH0KICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7CiAgfQp9CmNsYXNzIEJpbmFyeUNNYXBSZWFkZXIgewogIGFzeW5jIHByb2Nlc3MoZGF0YSwgY01hcCwgZXh0ZW5kKSB7CiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5Q01hcFN0cmVhbShkYXRhKTsKICAgIGNvbnN0IGhlYWRlciA9IHN0cmVhbS5yZWFkQnl0ZSgpOwogICAgY01hcC52ZXJ0aWNhbCA9ICEhKGhlYWRlciAmIDEpOwogICAgbGV0IHVzZUNNYXAgPSBudWxsOwogICAgY29uc3Qgc3RhcnQgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgZW5kID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKICAgIGNvbnN0IGNoYXIgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgY2hhckNvZGUgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgdG1wID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKICAgIGxldCBjb2RlOwogICAgbGV0IGI7CiAgICB3aGlsZSAoKGIgPSBzdHJlYW0ucmVhZEJ5dGUoKSkgPj0gMCkgewogICAgICBjb25zdCB0eXBlID0gYiA+PiA1OwogICAgICBpZiAodHlwZSA9PT0gNykgewogICAgICAgIHN3aXRjaCAoYiAmIDB4MWYpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgc3RyZWFtLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHVzZUNNYXAgPSBzdHJlYW0ucmVhZFN0cmluZygpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3Qgc2VxdWVuY2UgPSAhIShiICYgMHgxMCk7CiAgICAgIGNvbnN0IGRhdGFTaXplID0gYiAmIDE1OwogICAgICBpZiAoZGF0YVNpemUgKyAxID4gTUFYX05VTV9TSVpFKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3M6IEludmFsaWQgZGF0YVNpemUuIik7CiAgICAgIH0KICAgICAgY29uc3QgdWNzMkRhdGFTaXplID0gMTsKICAgICAgY29uc3Qgc3ViaXRlbXNDb3VudCA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBjTWFwLmFkZENvZGVzcGFjZVJhbmdlKGRhdGFTaXplICsgMSwgaGV4VG9JbnQoc3RhcnQsIGRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCBkYXRhU2l6ZSkpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShkYXRhU2l6ZSArIDEsIGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgICAgc3RyZWFtLnJlYWROdW1iZXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIGRhdGFTaXplKTsKICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgZGF0YVNpemUpLCBjb2RlKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGluY0hleChjaGFyLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcih0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoY2hhciwgdG1wLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkU2lnbmVkKCkgKyAoY29kZSArIDEpOwogICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChjaGFyLCBkYXRhU2l6ZSksIGNvZGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgY01hcC5tYXBDaWRSYW5nZShoZXhUb0ludChzdGFydCwgZGF0YVNpemUpLCBoZXhUb0ludChlbmQsIGRhdGFTaXplKSwgY29kZSk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgewogICAgICAgICAgICBpbmNIZXgoZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICAgIGFkZEhleChzdGFydCwgZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3RhcnQuc2V0KGVuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgICBjTWFwLm1hcENpZFJhbmdlKGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpLCBjb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgewogICAgICAgICAgICBpbmNIZXgoY2hhciwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgaWYgKCFzZXF1ZW5jZSkgewogICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKHRtcCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoY2hhciwgdG1wLCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluY0hleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleFNpZ25lZCh0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGNoYXJDb2RlLCB0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICBzdHJlYW0ucmVhZEhleChzdGFydCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgc3RyZWFtLnJlYWRIZXgoY2hhckNvZGUsIGRhdGFTaXplKTsKICAgICAgICAgIGNNYXAubWFwQmZSYW5nZShoZXhUb0ludChzdGFydCwgdWNzMkRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCB1Y3MyRGF0YVNpemUpLCBoZXhUb1N0cihjaGFyQ29kZSwgZGF0YVNpemUpKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGluY0hleChlbmQsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdGFydC5zZXQoZW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoaGV4VG9JbnQoc3RhcnQsIHVjczJEYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3MgLSB1bmtub3duIHR5cGU6ICR7dHlwZX1gKTsKICAgICAgfQogICAgfQogICAgaWYgKHVzZUNNYXApIHsKICAgICAgcmV0dXJuIGV4dGVuZCh1c2VDTWFwKTsKICAgIH0KICAgIHJldHVybiBjTWFwOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvYXNjaWlfODVfc3RyZWFtLmpzCgoKY2xhc3MgQXNjaWk4NVN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCkgewogICAgaWYgKG1heWJlTGVuZ3RoKSB7CiAgICAgIG1heWJlTGVuZ3RoICo9IDAuODsKICAgIH0KICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICB0aGlzLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoNSk7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGNvbnN0IFRJTERBX0NIQVIgPSAweDdlOwogICAgY29uc3QgWl9MT1dFUl9DSEFSID0gMHg3YTsKICAgIGNvbnN0IEVPRiA9IC0xOwogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICBsZXQgYyA9IHN0ci5nZXRCeXRlKCk7CiAgICB3aGlsZSAoaXNXaGl0ZVNwYWNlKGMpKSB7CiAgICAgIGMgPSBzdHIuZ2V0Qnl0ZSgpOwogICAgfQogICAgaWYgKGMgPT09IEVPRiB8fCBjID09PSBUSUxEQV9DSEFSKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBsZXQgYnVmZmVyLCBpOwogICAgaWYgKGMgPT09IFpfTE9XRVJfQ0hBUikgewogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyA0KTsKICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGggKyBpXSA9IDA7CiAgICAgIH0KICAgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gNDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dDsKICAgICAgaW5wdXRbMF0gPSBjOwogICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgKytpKSB7CiAgICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7CiAgICAgICAgd2hpbGUgKGlzV2hpdGVTcGFjZShjKSkgewogICAgICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7CiAgICAgICAgfQogICAgICAgIGlucHV0W2ldID0gYzsKICAgICAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBpIC0gMSk7CiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IGkgLSAxOwogICAgICBpZiAoaSA8IDUpIHsKICAgICAgICBmb3IgKDsgaSA8IDU7ICsraSkgewogICAgICAgICAgaW5wdXRbaV0gPSAweDIxICsgODQ7CiAgICAgICAgfQogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgdCA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICAgICB0ID0gdCAqIDg1ICsgKGlucHV0W2ldIC0gMHgyMSk7CiAgICAgIH0KICAgICAgZm9yIChpID0gMzsgaSA+PSAwOyAtLWkpIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSB0ICYgMHhmZjsKICAgICAgICB0ID4+PSA4OwogICAgICB9CiAgICB9CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9hc2NpaV9oZXhfc3RyZWFtLmpzCgpjbGFzcyBBc2NpaUhleFN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCkgewogICAgaWYgKG1heWJlTGVuZ3RoKSB7CiAgICAgIG1heWJlTGVuZ3RoICo9IDAuNTsKICAgIH0KICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICB0aGlzLmZpcnN0RGlnaXQgPSAtMTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgY29uc3QgVVBTVFJFQU1fQkxPQ0tfU0laRSA9IDgwMDA7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKFVQU1RSRUFNX0JMT0NLX1NJWkUpOwogICAgaWYgKCFieXRlcy5sZW5ndGgpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBtYXhEZWNvZGVMZW5ndGggPSBieXRlcy5sZW5ndGggKyAxID4+IDE7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIG1heERlY29kZUxlbmd0aCk7CiAgICBsZXQgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBsZXQgZmlyc3REaWdpdCA9IHRoaXMuZmlyc3REaWdpdDsKICAgIGZvciAoY29uc3QgY2ggb2YgYnl0ZXMpIHsKICAgICAgbGV0IGRpZ2l0OwogICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5KSB7CiAgICAgICAgZGlnaXQgPSBjaCAmIDB4MGY7CiAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHg0MSAmJiBjaCA8PSAweDQ2IHx8IGNoID49IDB4NjEgJiYgY2ggPD0gMHg2NikgewogICAgICAgIGRpZ2l0ID0gKGNoICYgMHgwZikgKyA5OwogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDNlKSB7CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChmaXJzdERpZ2l0IDwgMCkgewogICAgICAgIGZpcnN0RGlnaXQgPSBkaWdpdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gZmlyc3REaWdpdCA8PCA0IHwgZGlnaXQ7CiAgICAgICAgZmlyc3REaWdpdCA9IC0xOwogICAgICB9CiAgICB9CiAgICBpZiAoZmlyc3REaWdpdCA+PSAwICYmIHRoaXMuZW9mKSB7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBmaXJzdERpZ2l0IDw8IDQ7CiAgICAgIGZpcnN0RGlnaXQgPSAtMTsKICAgIH0KICAgIHRoaXMuZmlyc3REaWdpdCA9IGZpcnN0RGlnaXQ7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NjaXR0LmpzCgpjb25zdCBjY2l0dEVPTCA9IC0yOwpjb25zdCBjY2l0dEVPRiA9IC0xOwpjb25zdCB0d29EaW1QYXNzID0gMDsKY29uc3QgdHdvRGltSG9yaXogPSAxOwpjb25zdCB0d29EaW1WZXJ0MCA9IDI7CmNvbnN0IHR3b0RpbVZlcnRSMSA9IDM7CmNvbnN0IHR3b0RpbVZlcnRMMSA9IDQ7CmNvbnN0IHR3b0RpbVZlcnRSMiA9IDU7CmNvbnN0IHR3b0RpbVZlcnRMMiA9IDY7CmNvbnN0IHR3b0RpbVZlcnRSMyA9IDc7CmNvbnN0IHR3b0RpbVZlcnRMMyA9IDg7CmNvbnN0IHR3b0RpbVRhYmxlID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWzcsIHR3b0RpbVZlcnRMM10sIFs3LCB0d29EaW1WZXJ0UjNdLCBbNiwgdHdvRGltVmVydEwyXSwgWzYsIHR3b0RpbVZlcnRMMl0sIFs2LCB0d29EaW1WZXJ0UjJdLCBbNiwgdHdvRGltVmVydFIyXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXV07CmNvbnN0IHdoaXRlVGFibGUxID0gW1stMSwgLTFdLCBbMTIsIGNjaXR0RU9MXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTIsIDE5ODRdLCBbMTIsIDIwNDhdLCBbMTIsIDIxMTJdLCBbMTIsIDIxNzZdLCBbMTIsIDIyNDBdLCBbMTIsIDIzMDRdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTIsIDIzNjhdLCBbMTIsIDI0MzJdLCBbMTIsIDI0OTZdLCBbMTIsIDI1NjBdXTsKY29uc3Qgd2hpdGVUYWJsZTIgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFs4LCAyOV0sIFs4LCAyOV0sIFs4LCAzMF0sIFs4LCAzMF0sIFs4LCA0NV0sIFs4LCA0NV0sIFs4LCA0Nl0sIFs4LCA0Nl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sIFs4LCA0N10sIFs4LCA0N10sIFs4LCA0OF0sIFs4LCA0OF0sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs4LCAzM10sIFs4LCAzM10sIFs4LCAzNF0sIFs4LCAzNF0sIFs4LCAzNV0sIFs4LCAzNV0sIFs4LCAzNl0sIFs4LCAzNl0sIFs4LCAzN10sIFs4LCAzN10sIFs4LCAzOF0sIFs4LCAzOF0sIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sIFs4LCAzMV0sIFs4LCAzMV0sIFs4LCAzMl0sIFs4LCAzMl0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbOCwgNTNdLCBbOCwgNTNdLCBbOCwgNTRdLCBbOCwgNTRdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbOCwgMzldLCBbOCwgMzldLCBbOCwgNDBdLCBbOCwgNDBdLCBbOCwgNDFdLCBbOCwgNDFdLCBbOCwgNDJdLCBbOCwgNDJdLCBbOCwgNDNdLCBbOCwgNDNdLCBbOCwgNDRdLCBbOCwgNDRdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjhdLCBbNywgMjhdLCBbNywgMjhdLCBbNywgMjhdLCBbOCwgNjFdLCBbOCwgNjFdLCBbOCwgNjJdLCBbOCwgNjJdLCBbOCwgNjNdLCBbOCwgNjNdLCBbOCwgMF0sIFs4LCAwXSwgWzgsIDMyMF0sIFs4LCAzMjBdLCBbOCwgMzg0XSwgWzgsIDM4NF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sIFs4LCA1OV0sIFs4LCA1OV0sIFs4LCA2MF0sIFs4LCA2MF0sIFs5LCAxNDcyXSwgWzksIDE1MzZdLCBbOSwgMTYwMF0sIFs5LCAxNzI4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzgsIDQ5XSwgWzgsIDQ5XSwgWzgsIDUwXSwgWzgsIDUwXSwgWzgsIDUxXSwgWzgsIDUxXSwgWzgsIDUyXSwgWzgsIDUyXSwgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgWzgsIDU1XSwgWzgsIDU1XSwgWzgsIDU2XSwgWzgsIDU2XSwgWzgsIDU3XSwgWzgsIDU3XSwgWzgsIDU4XSwgWzgsIDU4XSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzgsIDQ0OF0sIFs4LCA0NDhdLCBbOCwgNTEyXSwgWzgsIDUxMl0sIFs5LCA3MDRdLCBbOSwgNzY4XSwgWzgsIDY0MF0sIFs4LCA2NDBdLCBbOCwgNTc2XSwgWzgsIDU3Nl0sIFs5LCA4MzJdLCBbOSwgODk2XSwgWzksIDk2MF0sIFs5LCAxMDI0XSwgWzksIDEwODhdLCBbOSwgMTE1Ml0sIFs5LCAxMjE2XSwgWzksIDEyODBdLCBbOSwgMTM0NF0sIFs5LCAxNDA4XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XV07CmNvbnN0IGJsYWNrVGFibGUxID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWzEyLCBjY2l0dEVPTF0sIFsxMiwgY2NpdHRFT0xdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzEyLCAxOTg0XSwgWzEyLCAxOTg0XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMTEyXSwgWzEyLCAyMTEyXSwgWzEyLCAyMTc2XSwgWzEyLCAyMTc2XSwgWzEyLCAyMjQwXSwgWzEyLCAyMjQwXSwgWzEyLCAyMzA0XSwgWzEyLCAyMzA0XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzEyLCAyMzY4XSwgWzEyLCAyMzY4XSwgWzEyLCAyNDMyXSwgWzEyLCAyNDMyXSwgWzEyLCAyNDk2XSwgWzEyLCAyNDk2XSwgWzEyLCAyNTYwXSwgWzEyLCAyNTYwXSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTIsIDUyXSwgWzEyLCA1Ml0sIFsxMywgNjQwXSwgWzEzLCA3MDRdLCBbMTMsIDc2OF0sIFsxMywgODMyXSwgWzEyLCA1NV0sIFsxMiwgNTVdLCBbMTIsIDU2XSwgWzEyLCA1Nl0sIFsxMywgMTI4MF0sIFsxMywgMTM0NF0sIFsxMywgMTQwOF0sIFsxMywgMTQ3Ml0sIFsxMiwgNTldLCBbMTIsIDU5XSwgWzEyLCA2MF0sIFsxMiwgNjBdLCBbMTMsIDE1MzZdLCBbMTMsIDE2MDBdLCBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzExLCAyNV0sIFsxMywgMTY2NF0sIFsxMywgMTcyOF0sIFsxMiwgMzIwXSwgWzEyLCAzMjBdLCBbMTIsIDM4NF0sIFsxMiwgMzg0XSwgWzEyLCA0NDhdLCBbMTIsIDQ0OF0sIFsxMywgNTEyXSwgWzEzLCA1NzZdLCBbMTIsIDUzXSwgWzEyLCA1M10sIFsxMiwgNTRdLCBbMTIsIDU0XSwgWzEzLCA4OTZdLCBbMTMsIDk2MF0sIFsxMywgMTAyNF0sIFsxMywgMTA4OF0sIFsxMywgMTE1Ml0sIFsxMywgMTIxNl0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XV07CmNvbnN0IGJsYWNrVGFibGUyID0gW1s4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFsxMSwgMjNdLCBbMTEsIDIzXSwgWzEyLCA1MF0sIFsxMiwgNTFdLCBbMTIsIDQ0XSwgWzEyLCA0NV0sIFsxMiwgNDZdLCBbMTIsIDQ3XSwgWzEyLCA1N10sIFsxMiwgNThdLCBbMTIsIDYxXSwgWzEyLCAyNTZdLCBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgWzEwLCAxN10sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIFsxMiwgNDhdLCBbMTIsIDQ5XSwgWzEyLCA2Ml0sIFsxMiwgNjNdLCBbMTIsIDMwXSwgWzEyLCAzMV0sIFsxMiwgMzJdLCBbMTIsIDMzXSwgWzEyLCA0MF0sIFsxMiwgNDFdLCBbMTEsIDIyXSwgWzExLCAyMl0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFsxMiwgMTI4XSwgWzEyLCAxOTJdLCBbMTIsIDI2XSwgWzEyLCAyN10sIFsxMiwgMjhdLCBbMTIsIDI5XSwgWzExLCAxOV0sIFsxMSwgMTldLCBbMTEsIDIwXSwgWzExLCAyMF0sIFsxMiwgMzRdLCBbMTIsIDM1XSwgWzEyLCAzNl0sIFsxMiwgMzddLCBbMTIsIDM4XSwgWzEyLCAzOV0sIFsxMSwgMjFdLCBbMTEsIDIxXSwgWzEyLCA0Ml0sIFsxMiwgNDNdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdXTsKY29uc3QgYmxhY2tUYWJsZTMgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFs2LCA5XSwgWzYsIDhdLCBbNSwgN10sIFs1LCA3XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl1dOwpjbGFzcyBDQ0lUVEZheERlY29kZXIgewogIGNvbnN0cnVjdG9yKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7CiAgICBpZiAodHlwZW9mIHNvdXJjZT8ubmV4dCAhPT0gImZ1bmN0aW9uIikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NDSVRURmF4RGVjb2RlciAtIGludmFsaWQgInNvdXJjZSIgcGFyYW1ldGVyLicpOwogICAgfQogICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICB0aGlzLmVvZiA9IGZhbHNlOwogICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuSyB8fCAwOwogICAgdGhpcy5lb2xpbmUgPSBvcHRpb25zLkVuZE9mTGluZSB8fCBmYWxzZTsKICAgIHRoaXMuYnl0ZUFsaWduID0gb3B0aW9ucy5FbmNvZGVkQnl0ZUFsaWduIHx8IGZhbHNlOwogICAgdGhpcy5jb2x1bW5zID0gb3B0aW9ucy5Db2x1bW5zIHx8IDE3Mjg7CiAgICB0aGlzLnJvd3MgPSBvcHRpb25zLlJvd3MgfHwgMDsKICAgIHRoaXMuZW9ibG9jayA9IG9wdGlvbnMuRW5kT2ZCbG9jayA/PyB0cnVlOwogICAgdGhpcy5ibGFjayA9IG9wdGlvbnMuQmxhY2tJczEgfHwgZmFsc2U7CiAgICB0aGlzLmNvZGluZ0xpbmUgPSBuZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zICsgMSk7CiAgICB0aGlzLnJlZkxpbmUgPSBuZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zICsgMik7CiAgICB0aGlzLmNvZGluZ0xpbmVbMF0gPSB0aGlzLmNvbHVtbnM7CiAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CiAgICB0aGlzLnJvdyA9IDA7CiAgICB0aGlzLm5leHRMaW5lMkQgPSB0aGlzLmVuY29kaW5nIDwgMDsKICAgIHRoaXMuaW5wdXRCaXRzID0gMDsKICAgIHRoaXMuaW5wdXRCdWYgPSAwOwogICAgdGhpcy5vdXRwdXRCaXRzID0gMDsKICAgIHRoaXMucm93c0RvbmUgPSBmYWxzZTsKICAgIGxldCBjb2RlMTsKICAgIHdoaWxlICgoY29kZTEgPSB0aGlzLl9sb29rQml0cygxMikpID09PSAwKSB7CiAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICB9CiAgICBpZiAoY29kZTEgPT09IDEpIHsKICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICB9CiAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKICAgICAgdGhpcy5uZXh0TGluZTJEID0gIXRoaXMuX2xvb2tCaXRzKDEpOwogICAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgfQogIH0KICByZWFkTmV4dENoYXIoKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgY29uc3QgcmVmTGluZSA9IHRoaXMucmVmTGluZTsKICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zOwogICAgbGV0IHJlZlBvcywgYmxhY2tQaXhlbHMsIGJpdHMsIGk7CiAgICBpZiAodGhpcy5vdXRwdXRCaXRzID09PSAwKSB7CiAgICAgIGlmICh0aGlzLnJvd3NEb25lKSB7CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICB9CiAgICAgIGlmICh0aGlzLmVvZikgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICB0aGlzLmVyciA9IGZhbHNlOwogICAgICBsZXQgY29kZTEsIGNvZGUyLCBjb2RlMzsKICAgICAgaWYgKHRoaXMubmV4dExpbmUyRCkgewogICAgICAgIGZvciAoaSA9IDA7IGNvZGluZ0xpbmVbaV0gPCBjb2x1bW5zOyArK2kpIHsKICAgICAgICAgIHJlZkxpbmVbaV0gPSBjb2RpbmdMaW5lW2ldOwogICAgICAgIH0KICAgICAgICByZWZMaW5lW2krK10gPSBjb2x1bW5zOwogICAgICAgIHJlZkxpbmVbaV0gPSBjb2x1bW5zOwogICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwOwogICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDsKICAgICAgICByZWZQb3MgPSAwOwogICAgICAgIGJsYWNrUGl4ZWxzID0gMDsKICAgICAgICB3aGlsZSAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICBjb2RlMSA9IHRoaXMuX2dldFR3b0RpbUNvZGUoKTsKICAgICAgICAgIHN3aXRjaCAoY29kZTEpIHsKICAgICAgICAgICAgY2FzZSB0d29EaW1QYXNzOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvcyArIDFdLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgaWYgKHJlZkxpbmVbcmVmUG9zICsgMV0gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltSG9yaXo6CiAgICAgICAgICAgICAgY29kZTEgPSBjb2RlMiA9IDA7CiAgICAgICAgICAgICAgaWYgKGJsYWNrUGl4ZWxzKSB7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0QmxhY2tDb2RlKCk7CiAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgIGNvZGUyICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CiAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgY29kZTIgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTEsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMiwgYmxhY2tQaXhlbHMgXiAxKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIzOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAzLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIyOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAyLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydFIxOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10gKyAxLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydDA6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSwgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgKytyZWZQb3M7CiAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMzoKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMywgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgaWYgKHJlZlBvcyA+IDApIHsKICAgICAgICAgICAgICAgICAgLS1yZWZQb3M7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydEwyOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVsc05lZyhyZWZMaW5lW3JlZlBvc10gLSAyLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAtLXJlZlBvczsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICsrcmVmUG9zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDE6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDEsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgIC0tcmVmUG9zOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIGNjaXR0RU9GOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2x1bW5zLCAwKTsKICAgICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaW5mbygiYmFkIDJkIGNvZGUiKTsKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CiAgICAgICAgICAgICAgdGhpcy5lcnIgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb2RpbmdMaW5lWzBdID0gMDsKICAgICAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CiAgICAgICAgYmxhY2tQaXhlbHMgPSAwOwogICAgICAgIHdoaWxlIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgIGNvZGUxID0gMDsKICAgICAgICAgIGlmIChibGFja1BpeGVscykgewogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CiAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLCBibGFja1BpeGVscyk7CiAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgZ290RU9MID0gZmFsc2U7CiAgICAgIGlmICh0aGlzLmJ5dGVBbGlnbikgewogICAgICAgIHRoaXMuaW5wdXRCaXRzICY9IH43OwogICAgICB9CiAgICAgIGlmICghdGhpcy5lb2Jsb2NrICYmIHRoaXMucm93ID09PSB0aGlzLnJvd3MgLSAxKSB7CiAgICAgICAgdGhpcy5yb3dzRG9uZSA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgICAgaWYgKHRoaXMuZW9saW5lKSB7CiAgICAgICAgICB3aGlsZSAoY29kZTEgIT09IGNjaXR0RU9GICYmIGNvZGUxICE9PSAxKSB7CiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3aGlsZSAoY29kZTEgPT09IDApIHsKICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjb2RlMSA9PT0gMSkgewogICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgICBnb3RFT0wgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAoY29kZTEgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5lb2YgJiYgdGhpcy5lbmNvZGluZyA+IDAgJiYgIXRoaXMucm93c0RvbmUpIHsKICAgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhdGhpcy5fbG9va0JpdHMoMSk7CiAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgfQogICAgICBpZiAodGhpcy5lb2Jsb2NrICYmIGdvdEVPTCAmJiB0aGlzLmJ5dGVBbGlnbikgewogICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOwogICAgICAgIGlmIChjb2RlMSA9PT0gMSkgewogICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7CiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+PSAwKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKICAgICAgICAgICAgICBpZiAoY29kZTEgIT09IDEpIHsKICAgICAgICAgICAgICAgIGluZm8oImJhZCBydGMgY29kZTogIiArIGNvZGUxKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTsKICAgICAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyICYmIHRoaXMuZW9saW5lKSB7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTMpOwogICAgICAgICAgaWYgKGNvZGUxID09PSBjY2l0dEVPRikgewogICAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb2RlMSA+PiAxID09PSAxKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CiAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgICAgICAgdGhpcy5uZXh0TGluZTJEID0gIShjb2RlMSAmIDEpOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lWzBdID4gMCA/IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgPSAwXSA6IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgPSAxXTsKICAgICAgdGhpcy5yb3crKzsKICAgIH0KICAgIGxldCBjOwogICAgaWYgKHRoaXMub3V0cHV0Qml0cyA+PSA4KSB7CiAgICAgIGMgPSB0aGlzLmNvZGluZ1BvcyAmIDEgPyAwIDogMHhmZjsKICAgICAgdGhpcy5vdXRwdXRCaXRzIC09IDg7CiAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDAgJiYgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAtIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgLSAxXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYml0cyA9IDg7CiAgICAgIGMgPSAwOwogICAgICBkbyB7CiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm91dHB1dEJpdHMgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ0ludmFsaWQgL0NDSVRURmF4RGVjb2RlIGRhdGEsICJvdXRwdXRCaXRzIiBtdXN0IGJlIGEgbnVtYmVyLicpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID4gYml0cykgewogICAgICAgICAgYyA8PD0gYml0czsKICAgICAgICAgIGlmICghKHRoaXMuY29kaW5nUG9zICYgMSkpIHsKICAgICAgICAgICAgYyB8PSAweGZmID4+IDggLSBiaXRzOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5vdXRwdXRCaXRzIC09IGJpdHM7CiAgICAgICAgICBiaXRzID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYyA8PD0gdGhpcy5vdXRwdXRCaXRzOwogICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgewogICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIHRoaXMub3V0cHV0Qml0czsKICAgICAgICAgIH0KICAgICAgICAgIGJpdHMgLT0gdGhpcy5vdXRwdXRCaXRzOwogICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gMDsKICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKICAgICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gLSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zIC0gMV07CiAgICAgICAgICB9IGVsc2UgaWYgKGJpdHMgPiAwKSB7CiAgICAgICAgICAgIGMgPDw9IGJpdHM7CiAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSB3aGlsZSAoYml0cyk7CiAgICB9CiAgICBpZiAodGhpcy5ibGFjaykgewogICAgICBjIF49IDB4ZmY7CiAgICB9CiAgICByZXR1cm4gYzsKICB9CiAgX2FkZFBpeGVscyhhMSwgYmxhY2tQaXhlbHMpIHsKICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CiAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7CiAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CiAgICAgICAgaW5mbygicm93IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKICAgICAgICBhMSA9IHRoaXMuY29sdW1uczsKICAgICAgfQogICAgICBpZiAoY29kaW5nUG9zICYgMSBeIGJsYWNrUGl4ZWxzKSB7CiAgICAgICAgKytjb2RpbmdQb3M7CiAgICAgIH0KICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CiAgICB9CiAgICB0aGlzLmNvZGluZ1BvcyA9IGNvZGluZ1BvczsKICB9CiAgX2FkZFBpeGVsc05lZyhhMSwgYmxhY2tQaXhlbHMpIHsKICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CiAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7CiAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CiAgICAgICAgaW5mbygicm93IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICAgIHRoaXMuZXJyID0gdHJ1ZTsKICAgICAgICBhMSA9IHRoaXMuY29sdW1uczsKICAgICAgfQogICAgICBpZiAoY29kaW5nUG9zICYgMSBeIGJsYWNrUGl4ZWxzKSB7CiAgICAgICAgKytjb2RpbmdQb3M7CiAgICAgIH0KICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CiAgICB9IGVsc2UgaWYgKGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3NdKSB7CiAgICAgIGlmIChhMSA8IDApIHsKICAgICAgICBpbmZvKCJpbnZhbGlkIGNvZGUiKTsKICAgICAgICB0aGlzLmVyciA9IHRydWU7CiAgICAgICAgYTEgPSAwOwogICAgICB9CiAgICAgIHdoaWxlIChjb2RpbmdQb3MgPiAwICYmIGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3MgLSAxXSkgewogICAgICAgIC0tY29kaW5nUG9zOwogICAgICB9CiAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExOwogICAgfQogICAgdGhpcy5jb2RpbmdQb3MgPSBjb2RpbmdQb3M7CiAgfQogIF9maW5kVGFibGVDb2RlKHN0YXJ0LCBlbmQsIHRhYmxlLCBsaW1pdCkgewogICAgY29uc3QgbGltaXRWYWx1ZSA9IGxpbWl0IHx8IDA7CiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHsKICAgICAgbGV0IGNvZGUgPSB0aGlzLl9sb29rQml0cyhpKTsKICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgcmV0dXJuIFt0cnVlLCAxLCBmYWxzZV07CiAgICAgIH0KICAgICAgaWYgKGkgPCBlbmQpIHsKICAgICAgICBjb2RlIDw8PSBlbmQgLSBpOwogICAgICB9CiAgICAgIGlmICghbGltaXRWYWx1ZSB8fCBjb2RlID49IGxpbWl0VmFsdWUpIHsKICAgICAgICBjb25zdCBwID0gdGFibGVbY29kZSAtIGxpbWl0VmFsdWVdOwogICAgICAgIGlmIChwWzBdID09PSBpKSB7CiAgICAgICAgICB0aGlzLl9lYXRCaXRzKGkpOwogICAgICAgICAgcmV0dXJuIFt0cnVlLCBwWzFdLCB0cnVlXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBbZmFsc2UsIDAsIGZhbHNlXTsKICB9CiAgX2dldFR3b0RpbUNvZGUoKSB7CiAgICBsZXQgY29kZSA9IDA7CiAgICBsZXQgcDsKICAgIGlmICh0aGlzLmVvYmxvY2spIHsKICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDcpOwogICAgICBwID0gdHdvRGltVGFibGVbY29kZV07CiAgICAgIGlmIChwPy5bMF0gPiAwKSB7CiAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTsKICAgICAgICByZXR1cm4gcFsxXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxLCA3LCB0d29EaW1UYWJsZSk7CiAgICAgIGlmIChyZXN1bHRbMF0gJiYgcmVzdWx0WzJdKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKICAgICAgfQogICAgfQogICAgaW5mbygiQmFkIHR3byBkaW0gY29kZSIpOwogICAgcmV0dXJuIGNjaXR0RU9GOwogIH0KICBfZ2V0V2hpdGVDb2RlKCkgewogICAgbGV0IGNvZGUgPSAwOwogICAgbGV0IHA7CiAgICBpZiAodGhpcy5lb2Jsb2NrKSB7CiAgICAgIGNvZGUgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgIGlmIChjb2RlID09PSBjY2l0dEVPRikgewogICAgICAgIHJldHVybiAxOwogICAgICB9CiAgICAgIHAgPSBjb2RlID4+IDUgPT09IDAgPyB3aGl0ZVRhYmxlMVtjb2RlXSA6IHdoaXRlVGFibGUyW2NvZGUgPj4gM107CiAgICAgIGlmIChwWzBdID4gMCkgewogICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7CiAgICAgICAgcmV0dXJuIHBbMV07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDksIHdoaXRlVGFibGUyKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMSwgMTIsIHdoaXRlVGFibGUxKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgIH0KICAgIGluZm8oImJhZCB3aGl0ZSBjb2RlIik7CiAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgcmV0dXJuIDE7CiAgfQogIF9nZXRCbGFja0NvZGUoKSB7CiAgICBsZXQgY29kZSwgcDsKICAgIGlmICh0aGlzLmVvYmxvY2spIHsKICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEzKTsKICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgICAgaWYgKGNvZGUgPj4gNyA9PT0gMCkgewogICAgICAgIHAgPSBibGFja1RhYmxlMVtjb2RlXTsKICAgICAgfSBlbHNlIGlmIChjb2RlID4+IDkgPT09IDAgJiYgY29kZSA+PiA3ICE9PSAwKSB7CiAgICAgICAgcCA9IGJsYWNrVGFibGUyWyhjb2RlID4+IDEpIC0gNjRdOwogICAgICB9IGVsc2UgewogICAgICAgIHAgPSBibGFja1RhYmxlM1tjb2RlID4+IDddOwogICAgICB9CiAgICAgIGlmIChwWzBdID4gMCkgewogICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7CiAgICAgICAgcmV0dXJuIHBbMV07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDIsIDYsIGJsYWNrVGFibGUzKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSg3LCAxMiwgYmxhY2tUYWJsZTIsIDY0KTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMCwgMTMsIGJsYWNrVGFibGUxKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgIH0KICAgIGluZm8oImJhZCBibGFjayBjb2RlIik7CiAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgcmV0dXJuIDE7CiAgfQogIF9sb29rQml0cyhuKSB7CiAgICBsZXQgYzsKICAgIHdoaWxlICh0aGlzLmlucHV0Qml0cyA8IG4pIHsKICAgICAgaWYgKChjID0gdGhpcy5zb3VyY2UubmV4dCgpKSA9PT0gLTEpIHsKICAgICAgICBpZiAodGhpcy5pbnB1dEJpdHMgPT09IDApIHsKICAgICAgICAgIHJldHVybiBjY2l0dEVPRjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRCdWYgPDwgbiAtIHRoaXMuaW5wdXRCaXRzICYgMHhmZmZmID4+IDE2IC0gbjsKICAgICAgfQogICAgICB0aGlzLmlucHV0QnVmID0gdGhpcy5pbnB1dEJ1ZiA8PCA4IHwgYzsKICAgICAgdGhpcy5pbnB1dEJpdHMgKz0gODsKICAgIH0KICAgIHJldHVybiB0aGlzLmlucHV0QnVmID4+IHRoaXMuaW5wdXRCaXRzIC0gbiAmIDB4ZmZmZiA+PiAxNiAtIG47CiAgfQogIF9lYXRCaXRzKG4pIHsKICAgIGlmICgodGhpcy5pbnB1dEJpdHMgLT0gbikgPCAwKSB7CiAgICAgIHRoaXMuaW5wdXRCaXRzID0gMDsKICAgIH0KICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NjaXR0X3N0cmVhbS5qcwoKCgpjbGFzcyBDQ0lUVEZheFN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCwgcGFyYW1zKSB7CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgaWYgKCEocGFyYW1zIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcGFyYW1zID0gRGljdC5lbXB0eTsKICAgIH0KICAgIGNvbnN0IHNvdXJjZSA9IHsKICAgICAgbmV4dCgpIHsKICAgICAgICByZXR1cm4gc3RyLmdldEJ5dGUoKTsKICAgICAgfQogICAgfTsKICAgIHRoaXMuY2NpdHRGYXhEZWNvZGVyID0gbmV3IENDSVRURmF4RGVjb2Rlcihzb3VyY2UsIHsKICAgICAgSzogcGFyYW1zLmdldCgiSyIpLAogICAgICBFbmRPZkxpbmU6IHBhcmFtcy5nZXQoIkVuZE9mTGluZSIpLAogICAgICBFbmNvZGVkQnl0ZUFsaWduOiBwYXJhbXMuZ2V0KCJFbmNvZGVkQnl0ZUFsaWduIiksCiAgICAgIENvbHVtbnM6IHBhcmFtcy5nZXQoIkNvbHVtbnMiKSwKICAgICAgUm93czogcGFyYW1zLmdldCgiUm93cyIpLAogICAgICBFbmRPZkJsb2NrOiBwYXJhbXMuZ2V0KCJFbmRPZkJsb2NrIiksCiAgICAgIEJsYWNrSXMxOiBwYXJhbXMuZ2V0KCJCbGFja0lzMSIpCiAgICB9KTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgd2hpbGUgKCF0aGlzLmVvZikgewogICAgICBjb25zdCBjID0gdGhpcy5jY2l0dEZheERlY29kZXIucmVhZE5leHRDaGFyKCk7CiAgICAgIGlmIChjID09PSAtMSkgewogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyAxKTsKICAgICAgdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK10gPSBjOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZmxhdGVfc3RyZWFtLmpzCgoKCmNvbnN0IGNvZGVMZW5Db2RlTWFwID0gbmV3IEludDMyQXJyYXkoWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdKTsKY29uc3QgbGVuZ3RoRGVjb2RlID0gbmV3IEludDMyQXJyYXkoWzB4MDAwMDMsIDB4MDAwMDQsIDB4MDAwMDUsIDB4MDAwMDYsIDB4MDAwMDcsIDB4MDAwMDgsIDB4MDAwMDksIDB4MDAwMGEsIDB4MTAwMGIsIDB4MTAwMGQsIDB4MTAwMGYsIDB4MTAwMTEsIDB4MjAwMTMsIDB4MjAwMTcsIDB4MjAwMWIsIDB4MjAwMWYsIDB4MzAwMjMsIDB4MzAwMmIsIDB4MzAwMzMsIDB4MzAwM2IsIDB4NDAwNDMsIDB4NDAwNTMsIDB4NDAwNjMsIDB4NDAwNzMsIDB4NTAwODMsIDB4NTAwYTMsIDB4NTAwYzMsIDB4NTAwZTMsIDB4MDAxMDIsIDB4MDAxMDIsIDB4MDAxMDJdKTsKY29uc3QgZGlzdERlY29kZSA9IG5ldyBJbnQzMkFycmF5KFsweDAwMDAxLCAweDAwMDAyLCAweDAwMDAzLCAweDAwMDA0LCAweDEwMDA1LCAweDEwMDA3LCAweDIwMDA5LCAweDIwMDBkLCAweDMwMDExLCAweDMwMDE5LCAweDQwMDIxLCAweDQwMDMxLCAweDUwMDQxLCAweDUwMDYxLCAweDYwMDgxLCAweDYwMGMxLCAweDcwMTAxLCAweDcwMTgxLCAweDgwMjAxLCAweDgwMzAxLCAweDkwNDAxLCAweDkwNjAxLCAweGEwODAxLCAweGEwYzAxLCAweGIxMDAxLCAweGIxODAxLCAweGMyMDAxLCAweGMzMDAxLCAweGQ0MDAxLCAweGQ2MDAxXSk7CmNvbnN0IGZpeGVkTGl0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMCwgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMCwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMCwgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MCwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMCwgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMCwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMCwgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOCwgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOCwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOCwgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OCwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOCwgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOCwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOCwgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNCwgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNCwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNCwgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NCwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNCwgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNCwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNCwgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjYywgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhYywgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlYywgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5YywgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkYywgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiYywgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmYywgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMiwgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMiwgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMiwgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MiwgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMiwgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMiwgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMiwgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYSwgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYSwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYSwgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YSwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYSwgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYSwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYSwgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNiwgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNiwgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNiwgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NiwgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNiwgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNiwgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNiwgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZSwgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZSwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZSwgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZSwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZSwgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZSwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZSwgMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMSwgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMSwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMSwgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MSwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMSwgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMSwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMSwgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOSwgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOSwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOSwgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OSwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOSwgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOSwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOSwgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNSwgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNSwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNSwgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NSwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNSwgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNSwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNSwgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjZCwgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhZCwgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlZCwgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5ZCwgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkZCwgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiZCwgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmZCwgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMywgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMywgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMywgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MywgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMywgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMywgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMywgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYiwgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYiwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYiwgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YiwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYiwgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYiwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYiwgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNywgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNywgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNywgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NywgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNywgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNywgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNywgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZiwgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZiwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZiwgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZiwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZiwgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZiwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZl0pLCA5XTsKY29uc3QgZml4ZWREaXN0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbMHg1MDAwMCwgMHg1MDAxMCwgMHg1MDAwOCwgMHg1MDAxOCwgMHg1MDAwNCwgMHg1MDAxNCwgMHg1MDAwYywgMHg1MDAxYywgMHg1MDAwMiwgMHg1MDAxMiwgMHg1MDAwYSwgMHg1MDAxYSwgMHg1MDAwNiwgMHg1MDAxNiwgMHg1MDAwZSwgMHgwMDAwMCwgMHg1MDAwMSwgMHg1MDAxMSwgMHg1MDAwOSwgMHg1MDAxOSwgMHg1MDAwNSwgMHg1MDAxNSwgMHg1MDAwZCwgMHg1MDAxZCwgMHg1MDAwMywgMHg1MDAxMywgMHg1MDAwYiwgMHg1MDAxYiwgMHg1MDAwNywgMHg1MDAxNywgMHg1MDAwZiwgMHgwMDAwMF0pLCA1XTsKY2xhc3MgRmxhdGVTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICBjb25zdCBjbWYgPSBzdHIuZ2V0Qnl0ZSgpOwogICAgY29uc3QgZmxnID0gc3RyLmdldEJ5dGUoKTsKICAgIGlmIChjbWYgPT09IC0xIHx8IGZsZyA9PT0gLTEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CiAgICB9CiAgICBpZiAoKGNtZiAmIDB4MGYpICE9PSAweDA4KSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWApOwogICAgfQogICAgaWYgKCgoY21mIDw8IDgpICsgZmxnKSAlIDMxICE9PSAwKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQmFkIEZDSEVDSyBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CiAgICB9CiAgICBpZiAoZmxnICYgMHgyMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEZESUNUIGJpdCBzZXQgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWApOwogICAgfQogICAgdGhpcy5jb2RlU2l6ZSA9IDA7CiAgICB0aGlzLmNvZGVCdWYgPSAwOwogIH0KICBhc3luYyBnZXRJbWFnZURhdGEobGVuZ3RoLCBfZGVjb2Rlck9wdGlvbnMpIHsKICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmFzeW5jR2V0Qnl0ZXMoKTsKICAgIHJldHVybiBkYXRhPy5zdWJhcnJheSgwLCBsZW5ndGgpIHx8IHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoKTsKICB9CiAgYXN5bmMgYXN5bmNHZXRCeXRlcygpIHsKICAgIHRoaXMuc3RyLnJlc2V0KCk7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKCk7CiAgICB0cnkgewogICAgICBjb25zdCB7CiAgICAgICAgcmVhZGFibGUsCiAgICAgICAgd3JpdGFibGUKICAgICAgfSA9IG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCJkZWZsYXRlIik7CiAgICAgIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpOwogICAgICBhd2FpdCB3cml0ZXIucmVhZHk7CiAgICAgIHdyaXRlci53cml0ZShieXRlcykudGhlbihhc3luYyAoKSA9PiB7CiAgICAgICAgYXdhaXQgd3JpdGVyLnJlYWR5OwogICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpOwogICAgICB9KS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgICBsZXQgdG90YWxMZW5ndGggPSAwOwogICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlYWRhYmxlKSB7CiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspOwogICAgICAgIHRvdGFsTGVuZ3RoICs9IGNodW5rLmJ5dGVMZW5ndGg7CiAgICAgIH0KICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKICAgICAgbGV0IG9mZnNldCA9IDA7CiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7CiAgICAgICAgZGF0YS5zZXQoY2h1bmssIG9mZnNldCk7CiAgICAgICAgb2Zmc2V0ICs9IGNodW5rLmJ5dGVMZW5ndGg7CiAgICAgIH0KICAgICAgcmV0dXJuIGRhdGE7CiAgICB9IGNhdGNoIHsKICAgICAgdGhpcy5zdHIgPSBuZXcgU3RyZWFtKGJ5dGVzLCAyLCBieXRlcy5sZW5ndGgsIHRoaXMuc3RyLmRpY3QpOwogICAgICB0aGlzLnJlc2V0KCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KICBnZXQgaXNBc3luYygpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBnZXRCaXRzKGJpdHMpIHsKICAgIGNvbnN0IHN0ciA9IHRoaXMuc3RyOwogICAgbGV0IGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTsKICAgIGxldCBjb2RlQnVmID0gdGhpcy5jb2RlQnVmOwogICAgbGV0IGI7CiAgICB3aGlsZSAoY29kZVNpemUgPCBiaXRzKSB7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICB9CiAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTsKICAgICAgY29kZVNpemUgKz0gODsKICAgIH0KICAgIGIgPSBjb2RlQnVmICYgKDEgPDwgYml0cykgLSAxOwogICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBiaXRzOwogICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC09IGJpdHM7CiAgICByZXR1cm4gYjsKICB9CiAgZ2V0Q29kZSh0YWJsZSkgewogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICBjb25zdCBjb2RlcyA9IHRhYmxlWzBdOwogICAgY29uc3QgbWF4TGVuID0gdGFibGVbMV07CiAgICBsZXQgY29kZVNpemUgPSB0aGlzLmNvZGVTaXplOwogICAgbGV0IGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7CiAgICBsZXQgYjsKICAgIHdoaWxlIChjb2RlU2l6ZSA8IG1heExlbikgewogICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjb2RlQnVmIHw9IGIgPDwgY29kZVNpemU7CiAgICAgIGNvZGVTaXplICs9IDg7CiAgICB9CiAgICBjb25zdCBjb2RlID0gY29kZXNbY29kZUJ1ZiAmICgxIDw8IG1heExlbikgLSAxXTsKICAgIGNvbnN0IGNvZGVMZW4gPSBjb2RlID4+IDE2OwogICAgY29uc3QgY29kZVZhbCA9IGNvZGUgJiAweGZmZmY7CiAgICBpZiAoY29kZUxlbiA8IDEgfHwgY29kZVNpemUgPCBjb2RlTGVuKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbSIpOwogICAgfQogICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBjb2RlTGVuOwogICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC0gY29kZUxlbjsKICAgIHJldHVybiBjb2RlVmFsOwogIH0KICBnZW5lcmF0ZUh1ZmZtYW5UYWJsZShsZW5ndGhzKSB7CiAgICBjb25zdCBuID0gbGVuZ3Rocy5sZW5ndGg7CiAgICBsZXQgbWF4TGVuID0gMDsKICAgIGxldCBpOwogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBpZiAobGVuZ3Roc1tpXSA+IG1heExlbikgewogICAgICAgIG1heExlbiA9IGxlbmd0aHNbaV07CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHNpemUgPSAxIDw8IG1heExlbjsKICAgIGNvbnN0IGNvZGVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7CiAgICBmb3IgKGxldCBsZW4gPSAxLCBjb2RlID0gMCwgc2tpcCA9IDI7IGxlbiA8PSBtYXhMZW47ICsrbGVuLCBjb2RlIDw8PSAxLCBza2lwIDw8PSAxKSB7CiAgICAgIGZvciAobGV0IHZhbCA9IDA7IHZhbCA8IG47ICsrdmFsKSB7CiAgICAgICAgaWYgKGxlbmd0aHNbdmFsXSA9PT0gbGVuKSB7CiAgICAgICAgICBsZXQgY29kZTIgPSAwOwogICAgICAgICAgbGV0IHQgPSBjb2RlOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgICAgIGNvZGUyID0gY29kZTIgPDwgMSB8IHQgJiAxOwogICAgICAgICAgICB0ID4+PSAxOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChpID0gY29kZTI7IGkgPCBzaXplOyBpICs9IHNraXApIHsKICAgICAgICAgICAgY29kZXNbaV0gPSBsZW4gPDwgMTYgfCB2YWw7CiAgICAgICAgICB9CiAgICAgICAgICArK2NvZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gW2NvZGVzLCBtYXhMZW5dOwogIH0KICAjZW5kc1N0cmVhbU9uRXJyb3IoZXJyKSB7CiAgICBpbmZvKGVycik7CiAgICB0aGlzLmVvZiA9IHRydWU7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGxldCBidWZmZXIsIGhkciwgbGVuOwogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICB0cnkgewogICAgICBoZHIgPSB0aGlzLmdldEJpdHMoMyk7CiAgICB9IGNhdGNoIChleCkgewogICAgICB0aGlzLiNlbmRzU3RyZWFtT25FcnJvcihleC5tZXNzYWdlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGhkciAmIDEpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgfQogICAgaGRyID4+PSAxOwogICAgaWYgKGhkciA9PT0gMCkgewogICAgICBsZXQgYjsKICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CiAgICAgICAgdGhpcy4jZW5kc1N0cmVhbU9uRXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCBibG9ja0xlbiA9IGI7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRoaXMuI2VuZHNTdHJlYW1PbkVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBibG9ja0xlbiB8PSBiIDw8IDg7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRoaXMuI2VuZHNTdHJlYW1PbkVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsZXQgY2hlY2sgPSBiOwogICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKICAgICAgICB0aGlzLiNlbmRzU3RyZWFtT25FcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY2hlY2sgfD0gYiA8PCA4OwogICAgICBpZiAoY2hlY2sgIT09ICh+YmxvY2tMZW4gJiAweGZmZmYpICYmIChibG9ja0xlbiAhPT0gMCB8fCBjaGVjayAhPT0gMCkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkJhZCB1bmNvbXByZXNzZWQgYmxvY2sgbGVuZ3RoIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICB9CiAgICAgIHRoaXMuY29kZUJ1ZiA9IDA7CiAgICAgIHRoaXMuY29kZVNpemUgPSAwOwogICAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aCwKICAgICAgICBlbmQgPSBidWZmZXJMZW5ndGggKyBibG9ja0xlbjsKICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoZW5kKTsKICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBlbmQ7CiAgICAgIGlmIChibG9ja0xlbiA9PT0gMCkgewogICAgICAgIGlmIChzdHIucGVla0J5dGUoKSA9PT0gLTEpIHsKICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYmxvY2sgPSBzdHIuZ2V0Qnl0ZXMoYmxvY2tMZW4pOwogICAgICAgIGJ1ZmZlci5zZXQoYmxvY2ssIGJ1ZmZlckxlbmd0aCk7CiAgICAgICAgaWYgKGJsb2NrLmxlbmd0aCA8IGJsb2NrTGVuKSB7CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBsaXRDb2RlVGFibGU7CiAgICBsZXQgZGlzdENvZGVUYWJsZTsKICAgIGlmIChoZHIgPT09IDEpIHsKICAgICAgbGl0Q29kZVRhYmxlID0gZml4ZWRMaXRDb2RlVGFiOwogICAgICBkaXN0Q29kZVRhYmxlID0gZml4ZWREaXN0Q29kZVRhYjsKICAgIH0gZWxzZSBpZiAoaGRyID09PSAyKSB7CiAgICAgIGNvbnN0IG51bUxpdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMjU3OwogICAgICBjb25zdCBudW1EaXN0Q29kZXMgPSB0aGlzLmdldEJpdHMoNSkgKyAxOwogICAgICBjb25zdCBudW1Db2RlTGVuQ29kZXMgPSB0aGlzLmdldEJpdHMoNCkgKyA0OwogICAgICBjb25zdCBjb2RlTGVuQ29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheShjb2RlTGVuQ29kZU1hcC5sZW5ndGgpOwogICAgICBsZXQgaTsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNvZGVMZW5Db2RlczsgKytpKSB7CiAgICAgICAgY29kZUxlbkNvZGVMZW5ndGhzW2NvZGVMZW5Db2RlTWFwW2ldXSA9IHRoaXMuZ2V0Qml0cygzKTsKICAgICAgfQogICAgICBjb25zdCBjb2RlTGVuQ29kZVRhYiA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbkNvZGVMZW5ndGhzKTsKICAgICAgbGVuID0gMDsKICAgICAgaSA9IDA7CiAgICAgIGNvbnN0IGNvZGVzID0gbnVtTGl0Q29kZXMgKyBudW1EaXN0Q29kZXM7CiAgICAgIGNvbnN0IGNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZXMpOwogICAgICBsZXQgYml0c0xlbmd0aCwgYml0c09mZnNldCwgd2hhdDsKICAgICAgd2hpbGUgKGkgPCBjb2RlcykgewogICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmdldENvZGUoY29kZUxlbkNvZGVUYWIpOwogICAgICAgIGlmIChjb2RlID09PSAxNikgewogICAgICAgICAgYml0c0xlbmd0aCA9IDI7CiAgICAgICAgICBiaXRzT2Zmc2V0ID0gMzsKICAgICAgICAgIHdoYXQgPSBsZW47CiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAxNykgewogICAgICAgICAgYml0c0xlbmd0aCA9IDM7CiAgICAgICAgICBiaXRzT2Zmc2V0ID0gMzsKICAgICAgICAgIHdoYXQgPSBsZW4gPSAwOwogICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMTgpIHsKICAgICAgICAgIGJpdHNMZW5ndGggPSA3OwogICAgICAgICAgYml0c09mZnNldCA9IDExOwogICAgICAgICAgd2hhdCA9IGxlbiA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSBsZW4gPSBjb2RlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCByZXBlYXRMZW5ndGggPSB0aGlzLmdldEJpdHMoYml0c0xlbmd0aCkgKyBiaXRzT2Zmc2V0OwogICAgICAgIHdoaWxlIChyZXBlYXRMZW5ndGgtLSA+IDApIHsKICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSB3aGF0OwogICAgICAgIH0KICAgICAgfQogICAgICBsaXRDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KDAsIG51bUxpdENvZGVzKSk7CiAgICAgIGRpc3RDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KG51bUxpdENvZGVzLCBjb2RlcykpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGJsb2NrIHR5cGUgaW4gZmxhdGUgc3RyZWFtIik7CiAgICB9CiAgICBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGxldCBsaW1pdCA9IGJ1ZmZlciA/IGJ1ZmZlci5sZW5ndGggOiAwOwogICAgbGV0IHBvcyA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgbGV0IGNvZGUxID0gdGhpcy5nZXRDb2RlKGxpdENvZGVUYWJsZSk7CiAgICAgIGlmIChjb2RlMSA8IDI1NikgewogICAgICAgIGlmIChwb3MgKyAxID49IGxpbWl0KSB7CiAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyAxKTsKICAgICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IGNvZGUxOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChjb2RlMSA9PT0gMjU2KSB7CiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBwb3M7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvZGUxIC09IDI1NzsKICAgICAgY29kZTEgPSBsZW5ndGhEZWNvZGVbY29kZTFdOwogICAgICBsZXQgY29kZTIgPSBjb2RlMSA+PiAxNjsKICAgICAgaWYgKGNvZGUyID4gMCkgewogICAgICAgIGNvZGUyID0gdGhpcy5nZXRCaXRzKGNvZGUyKTsKICAgICAgfQogICAgICBsZW4gPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7CiAgICAgIGNvZGUxID0gdGhpcy5nZXRDb2RlKGRpc3RDb2RlVGFibGUpOwogICAgICBjb2RlMSA9IGRpc3REZWNvZGVbY29kZTFdOwogICAgICBjb2RlMiA9IGNvZGUxID4+IDE2OwogICAgICBpZiAoY29kZTIgPiAwKSB7CiAgICAgICAgY29kZTIgPSB0aGlzLmdldEJpdHMoY29kZTIpOwogICAgICB9CiAgICAgIGNvbnN0IGRpc3QgPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7CiAgICAgIGlmIChwb3MgKyBsZW4gPj0gbGltaXQpIHsKICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyBsZW4pOwogICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDsKICAgICAgfQogICAgICBmb3IgKGxldCBrID0gMDsgayA8IGxlbjsgKytrLCArK3BvcykgewogICAgICAgIGJ1ZmZlcltwb3NdID0gYnVmZmVyW3BvcyAtIGRpc3RdOwogICAgICB9CiAgICB9CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9hcml0aG1ldGljX2RlY29kZXIuanMKY29uc3QgUWVUYWJsZSA9IFt7CiAgcWU6IDB4NTYwMSwKICBubXBzOiAxLAogIG5scHM6IDEsCiAgc3dpdGNoRmxhZzogMQp9LCB7CiAgcWU6IDB4MzQwMSwKICBubXBzOiAyLAogIG5scHM6IDYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MTgwMSwKICBubXBzOiAzLAogIG5scHM6IDksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MGFjMSwKICBubXBzOiA0LAogIG5scHM6IDEyLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDA1MjEsCiAgbm1wczogNSwKICBubHBzOiAyOSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMjIxLAogIG5tcHM6IDM4LAogIG5scHM6IDMzLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDU2MDEsCiAgbm1wczogNywKICBubHBzOiA2LAogIHN3aXRjaEZsYWc6IDEKfSwgewogIHFlOiAweDU0MDEsCiAgbm1wczogOCwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg0ODAxLAogIG5tcHM6IDksCiAgbmxwczogMTQsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MzgwMSwKICBubXBzOiAxMCwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgzMDAxLAogIG5tcHM6IDExLAogIG5scHM6IDE3LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDI0MDEsCiAgbm1wczogMTIsCiAgbmxwczogMTgsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MWMwMSwKICBubXBzOiAxMywKICBubHBzOiAyMCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxNjAxLAogIG5tcHM6IDI5LAogIG5scHM6IDIxLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDU2MDEsCiAgbm1wczogMTUsCiAgbmxwczogMTQsCiAgc3dpdGNoRmxhZzogMQp9LCB7CiAgcWU6IDB4NTQwMSwKICBubXBzOiAxNiwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg1MTAxLAogIG5tcHM6IDE3LAogIG5scHM6IDE1LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDQ4MDEsCiAgbm1wczogMTgsCiAgbmxwczogMTYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MzgwMSwKICBubXBzOiAxOSwKICBubHBzOiAxNywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgzNDAxLAogIG5tcHM6IDIwLAogIG5scHM6IDE4LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDMwMDEsCiAgbm1wczogMjEsCiAgbmxwczogMTksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MjgwMSwKICBubXBzOiAyMiwKICBubHBzOiAxOSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgyNDAxLAogIG5tcHM6IDIzLAogIG5scHM6IDIwLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDIyMDEsCiAgbm1wczogMjQsCiAgbmxwczogMjEsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MWMwMSwKICBubXBzOiAyNSwKICBubHBzOiAyMiwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxODAxLAogIG5tcHM6IDI2LAogIG5scHM6IDIzLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDE2MDEsCiAgbm1wczogMjcsCiAgbmxwczogMjQsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MTQwMSwKICBubXBzOiAyOCwKICBubHBzOiAyNSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxMjAxLAogIG5tcHM6IDI5LAogIG5scHM6IDI2LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDExMDEsCiAgbm1wczogMzAsCiAgbmxwczogMjcsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MGFjMSwKICBubXBzOiAzMSwKICBubHBzOiAyOCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwOWMxLAogIG5tcHM6IDMyLAogIG5scHM6IDI5LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDA4YTEsCiAgbm1wczogMzMsCiAgbmxwczogMzAsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDUyMSwKICBubXBzOiAzNCwKICBubHBzOiAzMSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwNDQxLAogIG5tcHM6IDM1LAogIG5scHM6IDMyLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAyYTEsCiAgbm1wczogMzYsCiAgbmxwczogMzMsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDIyMSwKICBubXBzOiAzNywKICBubHBzOiAzNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMTQxLAogIG5tcHM6IDM4LAogIG5scHM6IDM1LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAxMTEsCiAgbm1wczogMzksCiAgbmxwczogMzYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDA4NSwKICBubXBzOiA0MCwKICBubHBzOiAzNywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMDQ5LAogIG5tcHM6IDQxLAogIG5scHM6IDM4LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAwMjUsCiAgbm1wczogNDIsCiAgbmxwczogMzksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDAxNSwKICBubXBzOiA0MywKICBubHBzOiA0MCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMDA5LAogIG5tcHM6IDQ0LAogIG5scHM6IDQxLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAwMDUsCiAgbm1wczogNDUsCiAgbmxwczogNDIsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDAwMSwKICBubXBzOiA0NSwKICBubHBzOiA0MywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg1NjAxLAogIG5tcHM6IDQ2LAogIG5scHM6IDQ2LAogIHN3aXRjaEZsYWc6IDAKfV07CmNsYXNzIEFyaXRobWV0aWNEZWNvZGVyIHsKICBjb25zdHJ1Y3RvcihkYXRhLCBzdGFydCwgZW5kKSB7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgdGhpcy5icCA9IHN0YXJ0OwogICAgdGhpcy5kYXRhRW5kID0gZW5kOwogICAgdGhpcy5jaGlnaCA9IGRhdGFbc3RhcnRdOwogICAgdGhpcy5jbG93ID0gMDsKICAgIHRoaXMuYnl0ZUluKCk7CiAgICB0aGlzLmNoaWdoID0gdGhpcy5jaGlnaCA8PCA3ICYgMHhmZmZmIHwgdGhpcy5jbG93ID4+IDkgJiAweDdmOwogICAgdGhpcy5jbG93ID0gdGhpcy5jbG93IDw8IDcgJiAweGZmZmY7CiAgICB0aGlzLmN0IC09IDc7CiAgICB0aGlzLmEgPSAweDgwMDA7CiAgfQogIGJ5dGVJbigpIHsKICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CiAgICBsZXQgYnAgPSB0aGlzLmJwOwogICAgaWYgKGRhdGFbYnBdID09PSAweGZmKSB7CiAgICAgIGlmIChkYXRhW2JwICsgMV0gPiAweDhmKSB7CiAgICAgICAgdGhpcy5jbG93ICs9IDB4ZmYwMDsKICAgICAgICB0aGlzLmN0ID0gODsKICAgICAgfSBlbHNlIHsKICAgICAgICBicCsrOwogICAgICAgIHRoaXMuY2xvdyArPSBkYXRhW2JwXSA8PCA5OwogICAgICAgIHRoaXMuY3QgPSA3OwogICAgICAgIHRoaXMuYnAgPSBicDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYnArKzsKICAgICAgdGhpcy5jbG93ICs9IGJwIDwgdGhpcy5kYXRhRW5kID8gZGF0YVticF0gPDwgOCA6IDB4ZmYwMDsKICAgICAgdGhpcy5jdCA9IDg7CiAgICAgIHRoaXMuYnAgPSBicDsKICAgIH0KICAgIGlmICh0aGlzLmNsb3cgPiAweGZmZmYpIHsKICAgICAgdGhpcy5jaGlnaCArPSB0aGlzLmNsb3cgPj4gMTY7CiAgICAgIHRoaXMuY2xvdyAmPSAweGZmZmY7CiAgICB9CiAgfQogIHJlYWRCaXQoY29udGV4dHMsIHBvcykgewogICAgbGV0IGN4X2luZGV4ID0gY29udGV4dHNbcG9zXSA+PiAxLAogICAgICBjeF9tcHMgPSBjb250ZXh0c1twb3NdICYgMTsKICAgIGNvbnN0IHFlVGFibGVJY3ggPSBRZVRhYmxlW2N4X2luZGV4XTsKICAgIGNvbnN0IHFlSWN4ID0gcWVUYWJsZUljeC5xZTsKICAgIGxldCBkOwogICAgbGV0IGEgPSB0aGlzLmEgLSBxZUljeDsKICAgIGlmICh0aGlzLmNoaWdoIDwgcWVJY3gpIHsKICAgICAgaWYgKGEgPCBxZUljeCkgewogICAgICAgIGEgPSBxZUljeDsKICAgICAgICBkID0gY3hfbXBzOwogICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubXBzOwogICAgICB9IGVsc2UgewogICAgICAgIGEgPSBxZUljeDsKICAgICAgICBkID0gMSBeIGN4X21wczsKICAgICAgICBpZiAocWVUYWJsZUljeC5zd2l0Y2hGbGFnID09PSAxKSB7CiAgICAgICAgICBjeF9tcHMgPSBkOwogICAgICAgIH0KICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubmxwczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5jaGlnaCAtPSBxZUljeDsKICAgICAgaWYgKChhICYgMHg4MDAwKSAhPT0gMCkgewogICAgICAgIHRoaXMuYSA9IGE7CiAgICAgICAgcmV0dXJuIGN4X21wczsKICAgICAgfQogICAgICBpZiAoYSA8IHFlSWN4KSB7CiAgICAgICAgZCA9IDEgXiBjeF9tcHM7CiAgICAgICAgaWYgKHFlVGFibGVJY3guc3dpdGNoRmxhZyA9PT0gMSkgewogICAgICAgICAgY3hfbXBzID0gZDsKICAgICAgICB9CiAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5scHM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZCA9IGN4X21wczsKICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubm1wczsKICAgICAgfQogICAgfQogICAgZG8gewogICAgICBpZiAodGhpcy5jdCA9PT0gMCkgewogICAgICAgIHRoaXMuYnl0ZUluKCk7CiAgICAgIH0KICAgICAgYSA8PD0gMTsKICAgICAgdGhpcy5jaGlnaCA9IHRoaXMuY2hpZ2ggPDwgMSAmIDB4ZmZmZiB8IHRoaXMuY2xvdyA+PiAxNSAmIDE7CiAgICAgIHRoaXMuY2xvdyA9IHRoaXMuY2xvdyA8PCAxICYgMHhmZmZmOwogICAgICB0aGlzLmN0LS07CiAgICB9IHdoaWxlICgoYSAmIDB4ODAwMCkgPT09IDApOwogICAgdGhpcy5hID0gYTsKICAgIGNvbnRleHRzW3Bvc10gPSBjeF9pbmRleCA8PCAxIHwgY3hfbXBzOwogICAgcmV0dXJuIGQ7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9qYmlnMi5qcwoKCgoKY2xhc3MgSmJpZzJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiSmJpZzJFcnJvciIpOwogIH0KfQpjbGFzcyBDb250ZXh0Q2FjaGUgewogIGdldENvbnRleHRzKGlkKSB7CiAgICBpZiAoaWQgaW4gdGhpcykgewogICAgICByZXR1cm4gdGhpc1tpZF07CiAgICB9CiAgICByZXR1cm4gdGhpc1tpZF0gPSBuZXcgSW50OEFycmF5KDEgPDwgMTYpOwogIH0KfQpjbGFzcyBEZWNvZGluZ0NvbnRleHQgewogIGNvbnN0cnVjdG9yKGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CiAgICB0aGlzLmVuZCA9IGVuZDsKICB9CiAgZ2V0IGRlY29kZXIoKSB7CiAgICBjb25zdCBkZWNvZGVyID0gbmV3IEFyaXRobWV0aWNEZWNvZGVyKHRoaXMuZGF0YSwgdGhpcy5zdGFydCwgdGhpcy5lbmQpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZGVjb2RlciIsIGRlY29kZXIpOwogIH0KICBnZXQgY29udGV4dENhY2hlKCkgewogICAgY29uc3QgY2FjaGUgPSBuZXcgQ29udGV4dENhY2hlKCk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjb250ZXh0Q2FjaGUiLCBjYWNoZSk7CiAgfQp9CmZ1bmN0aW9uIGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBwcm9jZWR1cmUsIGRlY29kZXIpIHsKICBjb25zdCBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhwcm9jZWR1cmUpOwogIGxldCBwcmV2ID0gMTsKICBmdW5jdGlvbiByZWFkQml0cyhsZW5ndGgpIHsKICAgIGxldCB2ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTsKICAgICAgcHJldiA9IHByZXYgPCAyNTYgPyBwcmV2IDw8IDEgfCBiaXQgOiAocHJldiA8PCAxIHwgYml0KSAmIDUxMSB8IDI1NjsKICAgICAgdiA9IHYgPDwgMSB8IGJpdDsKICAgIH0KICAgIHJldHVybiB2ID4+PiAwOwogIH0KICBjb25zdCBzaWduID0gcmVhZEJpdHMoMSk7CiAgY29uc3QgdmFsdWUgPSByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMzIpICsgNDQzNiA6IHJlYWRCaXRzKDEyKSArIDM0MCA6IHJlYWRCaXRzKDgpICsgODQgOiByZWFkQml0cyg2KSArIDIwIDogcmVhZEJpdHMoNCkgKyA0IDogcmVhZEJpdHMoMik7CiAgbGV0IHNpZ25lZFZhbHVlOwogIGlmIChzaWduID09PSAwKSB7CiAgICBzaWduZWRWYWx1ZSA9IHZhbHVlOwogIH0gZWxzZSBpZiAodmFsdWUgPiAwKSB7CiAgICBzaWduZWRWYWx1ZSA9IC12YWx1ZTsKICB9CiAgaWYgKHNpZ25lZFZhbHVlID49IE1JTl9JTlRfMzIgJiYgc2lnbmVkVmFsdWUgPD0gTUFYX0lOVF8zMikgewogICAgcmV0dXJuIHNpZ25lZFZhbHVlOwogIH0KICByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2RlciwgY29kZUxlbmd0aCkgewogIGNvbnN0IGNvbnRleHRzID0gY29udGV4dENhY2hlLmdldENvbnRleHRzKCJJQUlEIik7CiAgbGV0IHByZXYgPSAxOwogIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZUxlbmd0aDsgaSsrKSB7CiAgICBjb25zdCBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHByZXYpOwogICAgcHJldiA9IHByZXYgPDwgMSB8IGJpdDsKICB9CiAgaWYgKGNvZGVMZW5ndGggPCAzMSkgewogICAgcmV0dXJuIHByZXYgJiAoMSA8PCBjb2RlTGVuZ3RoKSAtIDE7CiAgfQogIHJldHVybiBwcmV2ICYgMHg3ZmZmZmZmZjsKfQpjb25zdCBTZWdtZW50VHlwZXMgPSBbIlN5bWJvbERpY3Rpb25hcnkiLCBudWxsLCBudWxsLCBudWxsLCAiSW50ZXJtZWRpYXRlVGV4dFJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVUZXh0UmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYXR0ZXJuRGljdGlvbmFyeSIsIG51bGwsIG51bGwsIG51bGwsICJJbnRlcm1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24iLCAiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYWdlSW5mb3JtYXRpb24iLCAiRW5kT2ZQYWdlIiwgIkVuZE9mU3RyaXBlIiwgIkVuZE9mRmlsZSIsICJQcm9maWxlcyIsICJUYWJsZXMiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiRXh0ZW5zaW9uIl07CmNvbnN0IENvZGluZ1RlbXBsYXRlcyA9IFtbewogIHg6IC0xLAogIHk6IC0yCn0sIHsKICB4OiAwLAogIHk6IC0yCn0sIHsKICB4OiAxLAogIHk6IC0yCn0sIHsKICB4OiAtMiwKICB5OiAtMQp9LCB7CiAgeDogLTEsCiAgeTogLTEKfSwgewogIHg6IDAsCiAgeTogLTEKfSwgewogIHg6IDEsCiAgeTogLTEKfSwgewogIHg6IDIsCiAgeTogLTEKfSwgewogIHg6IC00LAogIHk6IDAKfSwgewogIHg6IC0zLAogIHk6IDAKfSwgewogIHg6IC0yLAogIHk6IDAKfSwgewogIHg6IC0xLAogIHk6IDAKfV0sIFt7CiAgeDogLTEsCiAgeTogLTIKfSwgewogIHg6IDAsCiAgeTogLTIKfSwgewogIHg6IDEsCiAgeTogLTIKfSwgewogIHg6IDIsCiAgeTogLTIKfSwgewogIHg6IC0yLAogIHk6IC0xCn0sIHsKICB4OiAtMSwKICB5OiAtMQp9LCB7CiAgeDogMCwKICB5OiAtMQp9LCB7CiAgeDogMSwKICB5OiAtMQp9LCB7CiAgeDogMiwKICB5OiAtMQp9LCB7CiAgeDogLTMsCiAgeTogMAp9LCB7CiAgeDogLTIsCiAgeTogMAp9LCB7CiAgeDogLTEsCiAgeTogMAp9XSwgW3sKICB4OiAtMSwKICB5OiAtMgp9LCB7CiAgeDogMCwKICB5OiAtMgp9LCB7CiAgeDogMSwKICB5OiAtMgp9LCB7CiAgeDogLTIsCiAgeTogLTEKfSwgewogIHg6IC0xLAogIHk6IC0xCn0sIHsKICB4OiAwLAogIHk6IC0xCn0sIHsKICB4OiAxLAogIHk6IC0xCn0sIHsKICB4OiAtMiwKICB5OiAwCn0sIHsKICB4OiAtMSwKICB5OiAwCn1dLCBbewogIHg6IC0zLAogIHk6IC0xCn0sIHsKICB4OiAtMiwKICB5OiAtMQp9LCB7CiAgeDogLTEsCiAgeTogLTEKfSwgewogIHg6IDAsCiAgeTogLTEKfSwgewogIHg6IDEsCiAgeTogLTEKfSwgewogIHg6IC00LAogIHk6IDAKfSwgewogIHg6IC0zLAogIHk6IDAKfSwgewogIHg6IC0yLAogIHk6IDAKfSwgewogIHg6IC0xLAogIHk6IDAKfV1dOwpjb25zdCBSZWZpbmVtZW50VGVtcGxhdGVzID0gW3sKICBjb2Rpbmc6IFt7CiAgICB4OiAwLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAxLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAtMSwKICAgIHk6IDAKICB9XSwKICByZWZlcmVuY2U6IFt7CiAgICB4OiAwLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAxLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAtMSwKICAgIHk6IDAKICB9LCB7CiAgICB4OiAwLAogICAgeTogMAogIH0sIHsKICAgIHg6IDEsCiAgICB5OiAwCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAxCiAgfSwgewogICAgeDogMCwKICAgIHk6IDEKICB9LCB7CiAgICB4OiAxLAogICAgeTogMQogIH1dCn0sIHsKICBjb2Rpbmc6IFt7CiAgICB4OiAtMSwKICAgIHk6IC0xCiAgfSwgewogICAgeDogMCwKICAgIHk6IC0xCiAgfSwgewogICAgeDogMSwKICAgIHk6IC0xCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAwCiAgfV0sCiAgcmVmZXJlbmNlOiBbewogICAgeDogMCwKICAgIHk6IC0xCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAwCiAgfSwgewogICAgeDogMCwKICAgIHk6IDAKICB9LCB7CiAgICB4OiAxLAogICAgeTogMAogIH0sIHsKICAgIHg6IDAsCiAgICB5OiAxCiAgfSwgewogICAgeDogMSwKICAgIHk6IDEKICB9XQp9XTsKY29uc3QgUmV1c2VkQ29udGV4dHMgPSBbMHg5YjI1LCAweDA3OTUsIDB4MDBlNSwgMHgwMTk1XTsKY29uc3QgUmVmaW5lbWVudFJldXNlZENvbnRleHRzID0gWzB4MDAyMCwgMHgwMDA4XTsKZnVuY3Rpb24gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCkgewogIGNvbnN0IGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKICBjb25zdCBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoIkdCIik7CiAgY29uc3QgYml0bWFwID0gW107CiAgbGV0IGNvbnRleHRMYWJlbCwgaSwgaiwgcGl4ZWwsIHJvdywgcm93MSwgcm93MjsKICBjb25zdCBPTERfUElYRUxfTUFTSyA9IDB4N2JmNzsKICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIHJvdyA9IGJpdG1hcFtpXSA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICAgIHJvdzEgPSBpIDwgMSA/IHJvdyA6IGJpdG1hcFtpIC0gMV07CiAgICByb3cyID0gaSA8IDIgPyByb3cgOiBiaXRtYXBbaSAtIDJdOwogICAgY29udGV4dExhYmVsID0gcm93MlswXSA8PCAxMyB8IHJvdzJbMV0gPDwgMTIgfCByb3cyWzJdIDw8IDExIHwgcm93MVswXSA8PCA3IHwgcm93MVsxXSA8PCA2IHwgcm93MVsyXSA8PCA1IHwgcm93MVszXSA8PCA0OwogICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKICAgICAgcm93W2pdID0gcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CiAgICAgIGNvbnRleHRMYWJlbCA9IChjb250ZXh0TGFiZWwgJiBPTERfUElYRUxfTUFTSykgPDwgMSB8IChqICsgMyA8IHdpZHRoID8gcm93MltqICsgM10gPDwgMTEgOiAwKSB8IChqICsgNCA8IHdpZHRoID8gcm93MVtqICsgNF0gPDwgNCA6IDApIHwgcGl4ZWw7CiAgICB9CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KZnVuY3Rpb24gZGVjb2RlQml0bWFwKG1tciwgd2lkdGgsIGhlaWdodCwgdGVtcGxhdGVJbmRleCwgcHJlZGljdGlvbiwgc2tpcCwgYXQsIGRlY29kaW5nQ29udGV4dCkgewogIGlmIChtbXIpIHsKICAgIGNvbnN0IGlucHV0ID0gbmV3IFJlYWRlcihkZWNvZGluZ0NvbnRleHQuZGF0YSwgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LCBkZWNvZGluZ0NvbnRleHQuZW5kKTsKICAgIHJldHVybiBkZWNvZGVNTVJCaXRtYXAoaW5wdXQsIHdpZHRoLCBoZWlnaHQsIGZhbHNlKTsKICB9CiAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDAgJiYgIXNraXAgJiYgIXByZWRpY3Rpb24gJiYgYXQubGVuZ3RoID09PSA0ICYmIGF0WzBdLnggPT09IDMgJiYgYXRbMF0ueSA9PT0gLTEgJiYgYXRbMV0ueCA9PT0gLTMgJiYgYXRbMV0ueSA9PT0gLTEgJiYgYXRbMl0ueCA9PT0gMiAmJiBhdFsyXS55ID09PSAtMiAmJiBhdFszXS54ID09PSAtMiAmJiBhdFszXS55ID09PSAtMikgewogICAgcmV0dXJuIGRlY29kZUJpdG1hcFRlbXBsYXRlMCh3aWR0aCwgaGVpZ2h0LCBkZWNvZGluZ0NvbnRleHQpOwogIH0KICBjb25zdCB1c2Vza2lwID0gISFza2lwOwogIGNvbnN0IHRlbXBsYXRlID0gQ29kaW5nVGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvbmNhdChhdCk7CiAgdGVtcGxhdGUuc29ydCgoYSwgYikgPT4gYS55IC0gYi55IHx8IGEueCAtIGIueCk7CiAgY29uc3QgdGVtcGxhdGVMZW5ndGggPSB0ZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgdGVtcGxhdGVYID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7CiAgY29uc3QgdGVtcGxhdGVZID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7CiAgY29uc3QgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMgPSBbXTsKICBsZXQgcmV1c2VNYXNrID0gMCwKICAgIG1pblggPSAwLAogICAgbWF4WCA9IDAsCiAgICBtaW5ZID0gMDsKICBsZXQgYywgazsKICBmb3IgKGsgPSAwOyBrIDwgdGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgdGVtcGxhdGVYW2tdID0gdGVtcGxhdGVba10ueDsKICAgIHRlbXBsYXRlWVtrXSA9IHRlbXBsYXRlW2tdLnk7CiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgdGVtcGxhdGVba10ueCk7CiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgdGVtcGxhdGVba10ueCk7CiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgdGVtcGxhdGVba10ueSk7CiAgICBpZiAoayA8IHRlbXBsYXRlTGVuZ3RoIC0gMSAmJiB0ZW1wbGF0ZVtrXS55ID09PSB0ZW1wbGF0ZVtrICsgMV0ueSAmJiB0ZW1wbGF0ZVtrXS54ID09PSB0ZW1wbGF0ZVtrICsgMV0ueCAtIDEpIHsKICAgICAgcmV1c2VNYXNrIHw9IDEgPDwgdGVtcGxhdGVMZW5ndGggLSAxIC0gazsKICAgIH0gZWxzZSB7CiAgICAgIGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzLnB1c2goayk7CiAgICB9CiAgfQogIGNvbnN0IGNoYW5naW5nRW50cmllc0xlbmd0aCA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzLmxlbmd0aDsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlWSA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlQml0ID0gbmV3IFVpbnQxNkFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7CiAgZm9yIChjID0gMDsgYyA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgYysrKSB7CiAgICBrID0gY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXNbY107CiAgICBjaGFuZ2luZ1RlbXBsYXRlWFtjXSA9IHRlbXBsYXRlW2tdLng7CiAgICBjaGFuZ2luZ1RlbXBsYXRlWVtjXSA9IHRlbXBsYXRlW2tdLnk7CiAgICBjaGFuZ2luZ1RlbXBsYXRlQml0W2NdID0gMSA8PCB0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrOwogIH0KICBjb25zdCBzYmJfbGVmdCA9IC1taW5YOwogIGNvbnN0IHNiYl90b3AgPSAtbWluWTsKICBjb25zdCBzYmJfcmlnaHQgPSB3aWR0aCAtIG1heFg7CiAgY29uc3QgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07CiAgbGV0IHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICBjb25zdCBiaXRtYXAgPSBbXTsKICBjb25zdCBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CiAgY29uc3QgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpOwogIGxldCBsdHAgPSAwLAogICAgaiwKICAgIGkwLAogICAgajAsCiAgICBjb250ZXh0TGFiZWwgPSAwLAogICAgYml0LAogICAgc2hpZnQ7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgaWYgKHByZWRpY3Rpb24pIHsKICAgICAgY29uc3Qgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTsKICAgICAgbHRwIF49IHNsdHA7CiAgICAgIGlmIChsdHApIHsKICAgICAgICBiaXRtYXAucHVzaChyb3cpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICB9CiAgICByb3cgPSBuZXcgVWludDhBcnJheShyb3cpOwogICAgYml0bWFwLnB1c2gocm93KTsKICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgIGlmICh1c2Vza2lwICYmIHNraXBbaV1bal0pIHsKICAgICAgICByb3dbal0gPSAwOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChqID49IHNiYl9sZWZ0ICYmIGogPCBzYmJfcmlnaHQgJiYgaSA+PSBzYmJfdG9wKSB7CiAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgJiByZXVzZU1hc2s7CiAgICAgICAgZm9yIChrID0gMDsgayA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgaysrKSB7CiAgICAgICAgICBpMCA9IGkgKyBjaGFuZ2luZ1RlbXBsYXRlWVtrXTsKICAgICAgICAgIGowID0gaiArIGNoYW5naW5nVGVtcGxhdGVYW2tdOwogICAgICAgICAgYml0ID0gYml0bWFwW2kwXVtqMF07CiAgICAgICAgICBpZiAoYml0KSB7CiAgICAgICAgICAgIGJpdCA9IGNoYW5naW5nVGVtcGxhdGVCaXRba107CiAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRleHRMYWJlbCA9IDA7CiAgICAgICAgc2hpZnQgPSB0ZW1wbGF0ZUxlbmd0aCAtIDE7CiAgICAgICAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyssIHNoaWZ0LS0pIHsKICAgICAgICAgIGowID0gaiArIHRlbXBsYXRlWFtrXTsKICAgICAgICAgIGlmIChqMCA+PSAwICYmIGowIDwgd2lkdGgpIHsKICAgICAgICAgICAgaTAgPSBpICsgdGVtcGxhdGVZW2tdOwogICAgICAgICAgICBpZiAoaTAgPj0gMCkgewogICAgICAgICAgICAgIGJpdCA9IGJpdG1hcFtpMF1bajBdOwogICAgICAgICAgICAgIGlmIChiaXQpIHsKICAgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQgPDwgc2hpZnQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOwogICAgICByb3dbal0gPSBwaXhlbDsKICAgIH0KICB9CiAgcmV0dXJuIGJpdG1hcDsKfQpmdW5jdGlvbiBkZWNvZGVSZWZpbmVtZW50KHdpZHRoLCBoZWlnaHQsIHRlbXBsYXRlSW5kZXgsIHJlZmVyZW5jZUJpdG1hcCwgb2Zmc2V0WCwgb2Zmc2V0WSwgcHJlZGljdGlvbiwgYXQsIGRlY29kaW5nQ29udGV4dCkgewogIGxldCBjb2RpbmdUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0uY29kaW5nOwogIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7CiAgICBjb2RpbmdUZW1wbGF0ZSA9IGNvZGluZ1RlbXBsYXRlLmNvbmNhdChbYXRbMF1dKTsKICB9CiAgY29uc3QgY29kaW5nVGVtcGxhdGVMZW5ndGggPSBjb2RpbmdUZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgY29kaW5nVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkoY29kaW5nVGVtcGxhdGVMZW5ndGgpOwogIGNvbnN0IGNvZGluZ1RlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTsKICBsZXQgazsKICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgY29kaW5nVGVtcGxhdGVYW2tdID0gY29kaW5nVGVtcGxhdGVba10ueDsKICAgIGNvZGluZ1RlbXBsYXRlWVtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLnk7CiAgfQogIGxldCByZWZlcmVuY2VUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0ucmVmZXJlbmNlOwogIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7CiAgICByZWZlcmVuY2VUZW1wbGF0ZSA9IHJlZmVyZW5jZVRlbXBsYXRlLmNvbmNhdChbYXRbMV1dKTsKICB9CiAgY29uc3QgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGggPSByZWZlcmVuY2VUZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgcmVmZXJlbmNlVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkocmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgpOwogIGNvbnN0IHJlZmVyZW5jZVRlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoKTsKICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgcmVmZXJlbmNlVGVtcGxhdGVYW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueDsKICAgIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSA9IHJlZmVyZW5jZVRlbXBsYXRlW2tdLnk7CiAgfQogIGNvbnN0IHJlZmVyZW5jZVdpZHRoID0gcmVmZXJlbmNlQml0bWFwWzBdLmxlbmd0aDsKICBjb25zdCByZWZlcmVuY2VIZWlnaHQgPSByZWZlcmVuY2VCaXRtYXAubGVuZ3RoOwogIGNvbnN0IHBzZXVkb1BpeGVsQ29udGV4dCA9IFJlZmluZW1lbnRSZXVzZWRDb250ZXh0c1t0ZW1wbGF0ZUluZGV4XTsKICBjb25zdCBiaXRtYXAgPSBbXTsKICBjb25zdCBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CiAgY29uc3QgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHUiIpOwogIGxldCBsdHAgPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIGlmIChwcmVkaWN0aW9uKSB7CiAgICAgIGNvbnN0IHNsdHAgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHBzZXVkb1BpeGVsQ29udGV4dCk7CiAgICAgIGx0cCBePSBzbHRwOwogICAgICBpZiAobHRwKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICB9CiAgICB9CiAgICBjb25zdCByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CiAgICBiaXRtYXAucHVzaChyb3cpOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgIGxldCBpMCwgajA7CiAgICAgIGxldCBjb250ZXh0TGFiZWwgPSAwOwogICAgICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgICAgIGkwID0gaSArIGNvZGluZ1RlbXBsYXRlWVtrXTsKICAgICAgICBqMCA9IGogKyBjb2RpbmdUZW1wbGF0ZVhba107CiAgICAgICAgaWYgKGkwIDwgMCB8fCBqMCA8IDAgfHwgajAgPj0gd2lkdGgpIHsKICAgICAgICAgIGNvbnRleHRMYWJlbCA8PD0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgfCBiaXRtYXBbaTBdW2owXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChrID0gMDsgayA8IHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoOyBrKyspIHsKICAgICAgICBpMCA9IGkgKyByZWZlcmVuY2VUZW1wbGF0ZVlba10gLSBvZmZzZXRZOwogICAgICAgIGowID0gaiArIHJlZmVyZW5jZVRlbXBsYXRlWFtrXSAtIG9mZnNldFg7CiAgICAgICAgaWYgKGkwIDwgMCB8fCBpMCA+PSByZWZlcmVuY2VIZWlnaHQgfHwgajAgPCAwIHx8IGowID49IHJlZmVyZW5jZVdpZHRoKSB7CiAgICAgICAgICBjb250ZXh0TGFiZWwgPDw9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnRleHRMYWJlbCA9IGNvbnRleHRMYWJlbCA8PCAxIHwgcmVmZXJlbmNlQml0bWFwW2kwXVtqMF07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOwogICAgICByb3dbal0gPSBwaXhlbDsKICAgIH0KICB9CiAgcmV0dXJuIGJpdG1hcDsKfQpmdW5jdGlvbiBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KGh1ZmZtYW4sIHJlZmluZW1lbnQsIHN5bWJvbHMsIG51bWJlck9mTmV3U3ltYm9scywgbnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIHRlbXBsYXRlSW5kZXgsIGF0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIGh1ZmZtYW5JbnB1dCkgewogIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHsKICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzeW1ib2wgcmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICBjb25zdCBuZXdTeW1ib2xzID0gW107CiAgbGV0IGN1cnJlbnRIZWlnaHQgPSAwOwogIGxldCBzeW1ib2xDb2RlTGVuZ3RoID0gbG9nMihzeW1ib2xzLmxlbmd0aCArIG51bWJlck9mTmV3U3ltYm9scyk7CiAgY29uc3QgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOwogIGNvbnN0IGNvbnRleHRDYWNoZSA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGU7CiAgbGV0IHRhYmxlQjEsIHN5bWJvbFdpZHRoczsKICBpZiAoaHVmZm1hbikgewogICAgdGFibGVCMSA9IGdldFN0YW5kYXJkVGFibGUoMSk7CiAgICBzeW1ib2xXaWR0aHMgPSBbXTsKICAgIHN5bWJvbENvZGVMZW5ndGggPSBNYXRoLm1heChzeW1ib2xDb2RlTGVuZ3RoLCAxKTsKICB9CiAgd2hpbGUgKG5ld1N5bWJvbHMubGVuZ3RoIDwgbnVtYmVyT2ZOZXdTeW1ib2xzKSB7CiAgICBjb25zdCBkZWx0YUhlaWdodCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFIZWlnaHQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBREgiLCBkZWNvZGVyKTsKICAgIGN1cnJlbnRIZWlnaHQgKz0gZGVsdGFIZWlnaHQ7CiAgICBsZXQgY3VycmVudFdpZHRoID0gMCwKICAgICAgdG90YWxXaWR0aCA9IDA7CiAgICBjb25zdCBmaXJzdFN5bWJvbCA9IGh1ZmZtYW4gPyBzeW1ib2xXaWR0aHMubGVuZ3RoIDogMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGNvbnN0IGRlbHRhV2lkdGggPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhV2lkdGguZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFciLCBkZWNvZGVyKTsKICAgICAgaWYgKGRlbHRhV2lkdGggPT09IG51bGwpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjdXJyZW50V2lkdGggKz0gZGVsdGFXaWR0aDsKICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50V2lkdGg7CiAgICAgIGxldCBiaXRtYXA7CiAgICAgIGlmIChyZWZpbmVtZW50KSB7CiAgICAgICAgY29uc3QgbnVtYmVyT2ZJbnN0YW5jZXMgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBQUkiLCBkZWNvZGVyKTsKICAgICAgICBpZiAobnVtYmVyT2ZJbnN0YW5jZXMgPiAxKSB7CiAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKGh1ZmZtYW4sIHJlZmluZW1lbnQsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgMCwgbnVtYmVyT2ZJbnN0YW5jZXMsIDEsIHN5bWJvbHMuY29uY2F0KG5ld1N5bWJvbHMpLCBzeW1ib2xDb2RlTGVuZ3RoLCAwLCAwLCAxLCAwLCBodWZmbWFuVGFibGVzLCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIDAsIGh1ZmZtYW5JbnB1dCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHN5bWJvbElkID0gZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIHN5bWJvbENvZGVMZW5ndGgpOwogICAgICAgICAgY29uc3QgcmR4ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWCIsIGRlY29kZXIpOwogICAgICAgICAgY29uc3QgcmR5ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWSIsIGRlY29kZXIpOwogICAgICAgICAgY29uc3Qgc3ltYm9sID0gc3ltYm9sSWQgPCBzeW1ib2xzLmxlbmd0aCA/IHN5bWJvbHNbc3ltYm9sSWRdIDogbmV3U3ltYm9sc1tzeW1ib2xJZCAtIHN5bWJvbHMubGVuZ3RoXTsKICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgc3ltYm9sLCByZHgsIHJkeSwgZmFsc2UsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7CiAgICAgIH0gZWxzZSBpZiAoaHVmZm1hbikgewogICAgICAgIHN5bWJvbFdpZHRocy5wdXNoKGN1cnJlbnRXaWR0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYml0bWFwID0gZGVjb2RlQml0bWFwKGZhbHNlLCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIHRlbXBsYXRlSW5kZXgsIGZhbHNlLCBudWxsLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKICAgICAgICBuZXdTeW1ib2xzLnB1c2goYml0bWFwKTsKICAgICAgfQogICAgfQogICAgaWYgKGh1ZmZtYW4gJiYgIXJlZmluZW1lbnQpIHsKICAgICAgY29uc3QgYml0bWFwU2l6ZSA9IGh1ZmZtYW5UYWJsZXMudGFibGVCaXRtYXBTaXplLmRlY29kZShodWZmbWFuSW5wdXQpOwogICAgICBodWZmbWFuSW5wdXQuYnl0ZUFsaWduKCk7CiAgICAgIGxldCBjb2xsZWN0aXZlQml0bWFwOwogICAgICBpZiAoYml0bWFwU2l6ZSA9PT0gMCkgewogICAgICAgIGNvbGxlY3RpdmVCaXRtYXAgPSByZWFkVW5jb21wcmVzc2VkQml0bWFwKGh1ZmZtYW5JbnB1dCwgdG90YWxXaWR0aCwgY3VycmVudEhlaWdodCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3Qgb3JpZ2luYWxFbmQgPSBodWZmbWFuSW5wdXQuZW5kOwogICAgICAgIGNvbnN0IGJpdG1hcEVuZCA9IGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiArIGJpdG1hcFNpemU7CiAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IGJpdG1hcEVuZDsKICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlTU1SQml0bWFwKGh1ZmZtYW5JbnB1dCwgdG90YWxXaWR0aCwgY3VycmVudEhlaWdodCwgZmFsc2UpOwogICAgICAgIGh1ZmZtYW5JbnB1dC5lbmQgPSBvcmlnaW5hbEVuZDsKICAgICAgICBodWZmbWFuSW5wdXQucG9zaXRpb24gPSBiaXRtYXBFbmQ7CiAgICAgIH0KICAgICAgY29uc3QgbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZCA9IHN5bWJvbFdpZHRocy5sZW5ndGg7CiAgICAgIGlmIChmaXJzdFN5bWJvbCA9PT0gbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZCAtIDEpIHsKICAgICAgICBuZXdTeW1ib2xzLnB1c2goY29sbGVjdGl2ZUJpdG1hcCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IGksCiAgICAgICAgICB5LAogICAgICAgICAgeE1pbiA9IDAsCiAgICAgICAgICB4TWF4LAogICAgICAgICAgYml0bWFwV2lkdGgsCiAgICAgICAgICBzeW1ib2xCaXRtYXA7CiAgICAgICAgZm9yIChpID0gZmlyc3RTeW1ib2w7IGkgPCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkOyBpKyspIHsKICAgICAgICAgIGJpdG1hcFdpZHRoID0gc3ltYm9sV2lkdGhzW2ldOwogICAgICAgICAgeE1heCA9IHhNaW4gKyBiaXRtYXBXaWR0aDsKICAgICAgICAgIHN5bWJvbEJpdG1hcCA9IFtdOwogICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGN1cnJlbnRIZWlnaHQ7IHkrKykgewogICAgICAgICAgICBzeW1ib2xCaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTsKICAgICAgICAgIH0KICAgICAgICAgIG5ld1N5bWJvbHMucHVzaChzeW1ib2xCaXRtYXApOwogICAgICAgICAgeE1pbiA9IHhNYXg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGNvbnN0IGV4cG9ydGVkU3ltYm9scyA9IFtdLAogICAgZmxhZ3MgPSBbXTsKICBsZXQgY3VycmVudEZsYWcgPSBmYWxzZSwKICAgIGksCiAgICBpaTsKICBjb25zdCB0b3RhbFN5bWJvbHNMZW5ndGggPSBzeW1ib2xzLmxlbmd0aCArIG51bWJlck9mTmV3U3ltYm9sczsKICB3aGlsZSAoZmxhZ3MubGVuZ3RoIDwgdG90YWxTeW1ib2xzTGVuZ3RoKSB7CiAgICBsZXQgcnVuTGVuZ3RoID0gaHVmZm1hbiA/IHRhYmxlQjEuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRVgiLCBkZWNvZGVyKTsKICAgIHdoaWxlIChydW5MZW5ndGgtLSkgewogICAgICBmbGFncy5wdXNoKGN1cnJlbnRGbGFnKTsKICAgIH0KICAgIGN1cnJlbnRGbGFnID0gIWN1cnJlbnRGbGFnOwogIH0KICBmb3IgKGkgPSAwLCBpaSA9IHN5bWJvbHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgaWYgKGZsYWdzW2ldKSB7CiAgICAgIGV4cG9ydGVkU3ltYm9scy5wdXNoKHN5bWJvbHNbaV0pOwogICAgfQogIH0KICBmb3IgKGxldCBqID0gMDsgaiA8IG51bWJlck9mTmV3U3ltYm9sczsgaSsrLCBqKyspIHsKICAgIGlmIChmbGFnc1tpXSkgewogICAgICBleHBvcnRlZFN5bWJvbHMucHVzaChuZXdTeW1ib2xzW2pdKTsKICAgIH0KICB9CiAgcmV0dXJuIGV4cG9ydGVkU3ltYm9sczsKfQpmdW5jdGlvbiBkZWNvZGVUZXh0UmVnaW9uKGh1ZmZtYW4sIHJlZmluZW1lbnQsIHdpZHRoLCBoZWlnaHQsIGRlZmF1bHRQaXhlbFZhbHVlLCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcywgc3RyaXBTaXplLCBpbnB1dFN5bWJvbHMsIHN5bWJvbENvZGVMZW5ndGgsIHRyYW5zcG9zZWQsIGRzT2Zmc2V0LCByZWZlcmVuY2VDb3JuZXIsIGNvbWJpbmF0aW9uT3BlcmF0b3IsIGh1ZmZtYW5UYWJsZXMsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgbG9nU3RyaXBTaXplLCBodWZmbWFuSW5wdXQpIHsKICBpZiAoaHVmZm1hbiAmJiByZWZpbmVtZW50KSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICBjb25zdCBiaXRtYXAgPSBbXTsKICBsZXQgaSwgcm93OwogIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOwogICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7CiAgICAgIHJvdy5maWxsKGRlZmF1bHRQaXhlbFZhbHVlKTsKICAgIH0KICAgIGJpdG1hcC5wdXNoKHJvdyk7CiAgfQogIGNvbnN0IGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKICBjb25zdCBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlOwogIGxldCBzdHJpcFQgPSBodWZmbWFuID8gLWh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiAtZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURUIiwgZGVjb2Rlcik7CiAgbGV0IGZpcnN0UyA9IDA7CiAgaSA9IDA7CiAgd2hpbGUgKGkgPCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcykgewogICAgY29uc3QgZGVsdGFUID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFQiLCBkZWNvZGVyKTsKICAgIHN0cmlwVCArPSBkZWx0YVQ7CiAgICBjb25zdCBkZWx0YUZpcnN0UyA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRmlyc3RTLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUZTIiwgZGVjb2Rlcik7CiAgICBmaXJzdFMgKz0gZGVsdGFGaXJzdFM7CiAgICBsZXQgY3VycmVudFMgPSBmaXJzdFM7CiAgICBkbyB7CiAgICAgIGxldCBjdXJyZW50VCA9IDA7CiAgICAgIGlmIChzdHJpcFNpemUgPiAxKSB7CiAgICAgICAgY3VycmVudFQgPSBodWZmbWFuID8gaHVmZm1hbklucHV0LnJlYWRCaXRzKGxvZ1N0cmlwU2l6ZSkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBSVQiLCBkZWNvZGVyKTsKICAgICAgfQogICAgICBjb25zdCB0ID0gc3RyaXBTaXplICogc3RyaXBUICsgY3VycmVudFQ7CiAgICAgIGNvbnN0IHN5bWJvbElkID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMuc3ltYm9sSURUYWJsZS5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTsKICAgICAgY29uc3QgYXBwbHlSZWZpbmVtZW50ID0gcmVmaW5lbWVudCAmJiAoaHVmZm1hbiA/IGh1ZmZtYW5JbnB1dC5yZWFkQml0KCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkkiLCBkZWNvZGVyKSk7CiAgICAgIGxldCBzeW1ib2xCaXRtYXAgPSBpbnB1dFN5bWJvbHNbc3ltYm9sSWRdOwogICAgICBsZXQgc3ltYm9sV2lkdGggPSBzeW1ib2xCaXRtYXBbMF0ubGVuZ3RoOwogICAgICBsZXQgc3ltYm9sSGVpZ2h0ID0gc3ltYm9sQml0bWFwLmxlbmd0aDsKICAgICAgaWYgKGFwcGx5UmVmaW5lbWVudCkgewogICAgICAgIGNvbnN0IHJkdyA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFciLCBkZWNvZGVyKTsKICAgICAgICBjb25zdCByZGggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRIIiwgZGVjb2Rlcik7CiAgICAgICAgY29uc3QgcmR4ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWCIsIGRlY29kZXIpOwogICAgICAgIGNvbnN0IHJkeSA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFkiLCBkZWNvZGVyKTsKICAgICAgICBzeW1ib2xXaWR0aCArPSByZHc7CiAgICAgICAgc3ltYm9sSGVpZ2h0ICs9IHJkaDsKICAgICAgICBzeW1ib2xCaXRtYXAgPSBkZWNvZGVSZWZpbmVtZW50KHN5bWJvbFdpZHRoLCBzeW1ib2xIZWlnaHQsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCBzeW1ib2xCaXRtYXAsIChyZHcgPj4gMSkgKyByZHgsIChyZGggPj4gMSkgKyByZHksIGZhbHNlLCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCk7CiAgICAgIH0KICAgICAgbGV0IGluY3JlbWVudCA9IDA7CiAgICAgIGlmICghdHJhbnNwb3NlZCkgewogICAgICAgIGlmIChyZWZlcmVuY2VDb3JuZXIgPiAxKSB7CiAgICAgICAgICBjdXJyZW50UyArPSBzeW1ib2xXaWR0aCAtIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluY3JlbWVudCA9IHN5bWJvbFdpZHRoIC0gMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIShyZWZlcmVuY2VDb3JuZXIgJiAxKSkgewogICAgICAgIGN1cnJlbnRTICs9IHN5bWJvbEhlaWdodCAtIDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5jcmVtZW50ID0gc3ltYm9sSGVpZ2h0IC0gMTsKICAgICAgfQogICAgICBjb25zdCBvZmZzZXRUID0gdCAtIChyZWZlcmVuY2VDb3JuZXIgJiAxID8gMCA6IHN5bWJvbEhlaWdodCAtIDEpOwogICAgICBjb25zdCBvZmZzZXRTID0gY3VycmVudFMgLSAocmVmZXJlbmNlQ29ybmVyICYgMiA/IHN5bWJvbFdpZHRoIC0gMSA6IDApOwogICAgICBsZXQgczIsIHQyLCBzeW1ib2xSb3c7CiAgICAgIGlmICh0cmFuc3Bvc2VkKSB7CiAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sSGVpZ2h0OyBzMisrKSB7CiAgICAgICAgICByb3cgPSBiaXRtYXBbb2Zmc2V0UyArIHMyXTsKICAgICAgICAgIGlmICghcm93KSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgc3ltYm9sUm93ID0gc3ltYm9sQml0bWFwW3MyXTsKICAgICAgICAgIGNvbnN0IG1heFdpZHRoID0gTWF0aC5taW4od2lkdGggLSBvZmZzZXRULCBzeW1ib2xXaWR0aCk7CiAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IG1heFdpZHRoOyB0MisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0VCArIHQyXSB8PSBzeW1ib2xSb3dbdDJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIGZvciAodDIgPSAwOyB0MiA8IG1heFdpZHRoOyB0MisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0VCArIHQyXSBePSBzeW1ib2xSb3dbdDJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAodDIgPSAwOyB0MiA8IHN5bWJvbEhlaWdodDsgdDIrKykgewogICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFQgKyB0Ml07CiAgICAgICAgICBpZiAoIXJvdykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFt0Ml07CiAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSB8PSBzeW1ib2xSb3dbczJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSBePSBzeW1ib2xSb3dbczJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGkrKzsKICAgICAgY29uc3QgZGVsdGFTID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVMuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFMiLCBkZWNvZGVyKTsKICAgICAgaWYgKGRlbHRhUyA9PT0gbnVsbCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGN1cnJlbnRTICs9IGluY3JlbWVudCArIGRlbHRhUyArIGRzT2Zmc2V0OwogICAgfSB3aGlsZSAodHJ1ZSk7CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KZnVuY3Rpb24gZGVjb2RlUGF0dGVybkRpY3Rpb25hcnkobW1yLCBwYXR0ZXJuV2lkdGgsIHBhdHRlcm5IZWlnaHQsIG1heFBhdHRlcm5JbmRleCwgdGVtcGxhdGUsIGRlY29kaW5nQ29udGV4dCkgewogIGNvbnN0IGF0ID0gW107CiAgaWYgKCFtbXIpIHsKICAgIGF0LnB1c2goewogICAgICB4OiAtcGF0dGVybldpZHRoLAogICAgICB5OiAwCiAgICB9KTsKICAgIGlmICh0ZW1wbGF0ZSA9PT0gMCkgewogICAgICBhdC5wdXNoKHsKICAgICAgICB4OiAtMywKICAgICAgICB5OiAtMQogICAgICB9LCB7CiAgICAgICAgeDogMiwKICAgICAgICB5OiAtMgogICAgICB9LCB7CiAgICAgICAgeDogLTIsCiAgICAgICAgeTogLTIKICAgICAgfSk7CiAgICB9CiAgfQogIGNvbnN0IGNvbGxlY3RpdmVXaWR0aCA9IChtYXhQYXR0ZXJuSW5kZXggKyAxKSAqIHBhdHRlcm5XaWR0aDsKICBjb25zdCBjb2xsZWN0aXZlQml0bWFwID0gZGVjb2RlQml0bWFwKG1tciwgY29sbGVjdGl2ZVdpZHRoLCBwYXR0ZXJuSGVpZ2h0LCB0ZW1wbGF0ZSwgZmFsc2UsIG51bGwsIGF0LCBkZWNvZGluZ0NvbnRleHQpOwogIGNvbnN0IHBhdHRlcm5zID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbWF4UGF0dGVybkluZGV4OyBpKyspIHsKICAgIGNvbnN0IHBhdHRlcm5CaXRtYXAgPSBbXTsKICAgIGNvbnN0IHhNaW4gPSBwYXR0ZXJuV2lkdGggKiBpOwogICAgY29uc3QgeE1heCA9IHhNaW4gKyBwYXR0ZXJuV2lkdGg7CiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHBhdHRlcm5IZWlnaHQ7IHkrKykgewogICAgICBwYXR0ZXJuQml0bWFwLnB1c2goY29sbGVjdGl2ZUJpdG1hcFt5XS5zdWJhcnJheSh4TWluLCB4TWF4KSk7CiAgICB9CiAgICBwYXR0ZXJucy5wdXNoKHBhdHRlcm5CaXRtYXApOwogIH0KICByZXR1cm4gcGF0dGVybnM7Cn0KZnVuY3Rpb24gZGVjb2RlSGFsZnRvbmVSZWdpb24obW1yLCBwYXR0ZXJucywgdGVtcGxhdGUsIHJlZ2lvbldpZHRoLCByZWdpb25IZWlnaHQsIGRlZmF1bHRQaXhlbFZhbHVlLCBlbmFibGVTa2lwLCBjb21iaW5hdGlvbk9wZXJhdG9yLCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIGdyaWRPZmZzZXRYLCBncmlkT2Zmc2V0WSwgZ3JpZFZlY3RvclgsIGdyaWRWZWN0b3JZLCBkZWNvZGluZ0NvbnRleHQpIHsKICBjb25zdCBza2lwID0gbnVsbDsKICBpZiAoZW5hYmxlU2tpcCkgewogICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNraXAgaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICBpZiAoY29tYmluYXRpb25PcGVyYXRvciAhPT0gMCkgewogICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICIke2NvbWJpbmF0aW9uT3BlcmF0b3J9IiBpcyBub3Qgc3VwcG9ydGVkIGluIGhhbGZ0b25lIHJlZ2lvbmApOwogIH0KICBjb25zdCByZWdpb25CaXRtYXAgPSBbXTsKICBsZXQgaSwgaiwgcm93OwogIGZvciAoaSA9IDA7IGkgPCByZWdpb25IZWlnaHQ7IGkrKykgewogICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkocmVnaW9uV2lkdGgpOwogICAgaWYgKGRlZmF1bHRQaXhlbFZhbHVlKSB7CiAgICAgIHJvdy5maWxsKGRlZmF1bHRQaXhlbFZhbHVlKTsKICAgIH0KICAgIHJlZ2lvbkJpdG1hcC5wdXNoKHJvdyk7CiAgfQogIGNvbnN0IG51bWJlck9mUGF0dGVybnMgPSBwYXR0ZXJucy5sZW5ndGg7CiAgY29uc3QgcGF0dGVybjAgPSBwYXR0ZXJuc1swXTsKICBjb25zdCBwYXR0ZXJuV2lkdGggPSBwYXR0ZXJuMFswXS5sZW5ndGgsCiAgICBwYXR0ZXJuSGVpZ2h0ID0gcGF0dGVybjAubGVuZ3RoOwogIGNvbnN0IGJpdHNQZXJWYWx1ZSA9IGxvZzIobnVtYmVyT2ZQYXR0ZXJucyk7CiAgY29uc3QgYXQgPSBbXTsKICBpZiAoIW1tcikgewogICAgYXQucHVzaCh7CiAgICAgIHg6IHRlbXBsYXRlIDw9IDEgPyAzIDogMiwKICAgICAgeTogLTEKICAgIH0pOwogICAgaWYgKHRlbXBsYXRlID09PSAwKSB7CiAgICAgIGF0LnB1c2goewogICAgICAgIHg6IC0zLAogICAgICAgIHk6IC0xCiAgICAgIH0sIHsKICAgICAgICB4OiAyLAogICAgICAgIHk6IC0yCiAgICAgIH0sIHsKICAgICAgICB4OiAtMiwKICAgICAgICB5OiAtMgogICAgICB9KTsKICAgIH0KICB9CiAgY29uc3QgZ3JheVNjYWxlQml0UGxhbmVzID0gW107CiAgbGV0IG1tcklucHV0LCBiaXRtYXA7CiAgaWYgKG1tcikgewogICAgbW1ySW5wdXQgPSBuZXcgUmVhZGVyKGRlY29kaW5nQ29udGV4dC5kYXRhLCBkZWNvZGluZ0NvbnRleHQuc3RhcnQsIGRlY29kaW5nQ29udGV4dC5lbmQpOwogIH0KICBmb3IgKGkgPSBiaXRzUGVyVmFsdWUgLSAxOyBpID49IDA7IGktLSkgewogICAgaWYgKG1tcikgewogICAgICBiaXRtYXAgPSBkZWNvZGVNTVJCaXRtYXAobW1ySW5wdXQsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBiaXRtYXAgPSBkZWNvZGVCaXRtYXAoZmFsc2UsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdGVtcGxhdGUsIGZhbHNlLCBza2lwLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKICAgIH0KICAgIGdyYXlTY2FsZUJpdFBsYW5lc1tpXSA9IGJpdG1hcDsKICB9CiAgbGV0IG1nLCBuZywgYml0LCBwYXR0ZXJuSW5kZXgsIHBhdHRlcm5CaXRtYXAsIHgsIHksIHBhdHRlcm5Sb3csIHJlZ2lvblJvdzsKICBmb3IgKG1nID0gMDsgbWcgPCBncmlkSGVpZ2h0OyBtZysrKSB7CiAgICBmb3IgKG5nID0gMDsgbmcgPCBncmlkV2lkdGg7IG5nKyspIHsKICAgICAgYml0ID0gMDsKICAgICAgcGF0dGVybkluZGV4ID0gMDsKICAgICAgZm9yIChqID0gYml0c1BlclZhbHVlIC0gMTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICBiaXQgXj0gZ3JheVNjYWxlQml0UGxhbmVzW2pdW21nXVtuZ107CiAgICAgICAgcGF0dGVybkluZGV4IHw9IGJpdCA8PCBqOwogICAgICB9CiAgICAgIHBhdHRlcm5CaXRtYXAgPSBwYXR0ZXJuc1twYXR0ZXJuSW5kZXhdOwogICAgICB4ID0gZ3JpZE9mZnNldFggKyBtZyAqIGdyaWRWZWN0b3JZICsgbmcgKiBncmlkVmVjdG9yWCA+PiA4OwogICAgICB5ID0gZ3JpZE9mZnNldFkgKyBtZyAqIGdyaWRWZWN0b3JYIC0gbmcgKiBncmlkVmVjdG9yWSA+PiA4OwogICAgICBpZiAoeCA+PSAwICYmIHggKyBwYXR0ZXJuV2lkdGggPD0gcmVnaW9uV2lkdGggJiYgeSA+PSAwICYmIHkgKyBwYXR0ZXJuSGVpZ2h0IDw9IHJlZ2lvbkhlaWdodCkgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFt5ICsgaV07CiAgICAgICAgICBwYXR0ZXJuUm93ID0gcGF0dGVybkJpdG1hcFtpXTsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXR0ZXJuV2lkdGg7IGorKykgewogICAgICAgICAgICByZWdpb25Sb3dbeCArIGpdIHw9IHBhdHRlcm5Sb3dbal07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGxldCByZWdpb25YLCByZWdpb25ZOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKICAgICAgICAgIHJlZ2lvblkgPSB5ICsgaTsKICAgICAgICAgIGlmIChyZWdpb25ZIDwgMCB8fCByZWdpb25ZID49IHJlZ2lvbkhlaWdodCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFtyZWdpb25ZXTsKICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7CiAgICAgICAgICAgIHJlZ2lvblggPSB4ICsgajsKICAgICAgICAgICAgaWYgKHJlZ2lvblggPj0gMCAmJiByZWdpb25YIDwgcmVnaW9uV2lkdGgpIHsKICAgICAgICAgICAgICByZWdpb25Sb3dbcmVnaW9uWF0gfD0gcGF0dGVyblJvd1tqXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcmVnaW9uQml0bWFwOwp9CmZ1bmN0aW9uIHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHN0YXJ0KSB7CiAgY29uc3Qgc2VnbWVudEhlYWRlciA9IHt9OwogIHNlZ21lbnRIZWFkZXIubnVtYmVyID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCk7CiAgY29uc3QgZmxhZ3MgPSBkYXRhW3N0YXJ0ICsgNF07CiAgY29uc3Qgc2VnbWVudFR5cGUgPSBmbGFncyAmIDB4M2Y7CiAgaWYgKCFTZWdtZW50VHlwZXNbc2VnbWVudFR5cGVdKSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBzZWdtZW50IHR5cGU6ICIgKyBzZWdtZW50VHlwZSk7CiAgfQogIHNlZ21lbnRIZWFkZXIudHlwZSA9IHNlZ21lbnRUeXBlOwogIHNlZ21lbnRIZWFkZXIudHlwZU5hbWUgPSBTZWdtZW50VHlwZXNbc2VnbWVudFR5cGVdOwogIHNlZ21lbnRIZWFkZXIuZGVmZXJyZWROb25SZXRhaW4gPSAhIShmbGFncyAmIDB4ODApOwogIGNvbnN0IHBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSA9ICEhKGZsYWdzICYgMHg0MCk7CiAgY29uc3QgcmVmZXJyZWRGbGFncyA9IGRhdGFbc3RhcnQgKyA1XTsKICBsZXQgcmVmZXJyZWRUb0NvdW50ID0gcmVmZXJyZWRGbGFncyA+PiA1ICYgNzsKICBjb25zdCByZXRhaW5CaXRzID0gW3JlZmVycmVkRmxhZ3MgJiAzMV07CiAgbGV0IHBvc2l0aW9uID0gc3RhcnQgKyA2OwogIGlmIChyZWZlcnJlZEZsYWdzID09PSA3KSB7CiAgICByZWZlcnJlZFRvQ291bnQgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uIC0gMSkgJiAweDFmZmZmZmZmOwogICAgcG9zaXRpb24gKz0gMzsKICAgIGxldCBieXRlcyA9IHJlZmVycmVkVG9Db3VudCArIDcgPj4gMzsKICAgIHJldGFpbkJpdHNbMF0gPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgd2hpbGUgKC0tYnl0ZXMgPiAwKSB7CiAgICAgIHJldGFpbkJpdHMucHVzaChkYXRhW3Bvc2l0aW9uKytdKTsKICAgIH0KICB9IGVsc2UgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDUgfHwgcmVmZXJyZWRGbGFncyA9PT0gNikgewogICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgcmVmZXJyZWQtdG8gZmxhZ3MiKTsKICB9CiAgc2VnbWVudEhlYWRlci5yZXRhaW5CaXRzID0gcmV0YWluQml0czsKICBsZXQgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gNDsKICBpZiAoc2VnbWVudEhlYWRlci5udW1iZXIgPD0gMjU2KSB7CiAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAxOwogIH0gZWxzZSBpZiAoc2VnbWVudEhlYWRlci5udW1iZXIgPD0gNjU1MzYpIHsKICAgIHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDI7CiAgfQogIGNvbnN0IHJlZmVycmVkVG8gPSBbXTsKICBsZXQgaSwgaWk7CiAgZm9yIChpID0gMDsgaSA8IHJlZmVycmVkVG9Db3VudDsgaSsrKSB7CiAgICBsZXQgbnVtYmVyOwogICAgaWYgKHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9PT0gMSkgewogICAgICBudW1iZXIgPSBkYXRhW3Bvc2l0aW9uXTsKICAgIH0gZWxzZSBpZiAocmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID09PSAyKSB7CiAgICAgIG51bWJlciA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgbnVtYmVyID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7CiAgICB9CiAgICByZWZlcnJlZFRvLnB1c2gobnVtYmVyKTsKICAgIHBvc2l0aW9uICs9IHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZTsKICB9CiAgc2VnbWVudEhlYWRlci5yZWZlcnJlZFRvID0gcmVmZXJyZWRUbzsKICBpZiAoIXBhZ2VBc3NvY2lhdGlvbkZpZWxkU2l6ZSkgewogICAgc2VnbWVudEhlYWRlci5wYWdlQXNzb2NpYXRpb24gPSBkYXRhW3Bvc2l0aW9uKytdOwogIH0gZWxzZSB7CiAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgcG9zaXRpb24gKz0gNDsKICB9CiAgc2VnbWVudEhlYWRlci5sZW5ndGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICBwb3NpdGlvbiArPSA0OwogIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikgewogICAgaWYgKHNlZ21lbnRUeXBlID09PSAzOCkgewogICAgICBjb25zdCBnZW5lcmljUmVnaW9uSW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOwogICAgICBjb25zdCBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbiArIFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoXTsKICAgICAgY29uc3QgZ2VuZXJpY1JlZ2lvbk1tciA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKICAgICAgY29uc3Qgc2VhcmNoUGF0dGVybkxlbmd0aCA9IDY7CiAgICAgIGNvbnN0IHNlYXJjaFBhdHRlcm4gPSBuZXcgVWludDhBcnJheShzZWFyY2hQYXR0ZXJuTGVuZ3RoKTsKICAgICAgaWYgKCFnZW5lcmljUmVnaW9uTW1yKSB7CiAgICAgICAgc2VhcmNoUGF0dGVyblswXSA9IDB4ZmY7CiAgICAgICAgc2VhcmNoUGF0dGVyblsxXSA9IDB4YWM7CiAgICAgIH0KICAgICAgc2VhcmNoUGF0dGVyblsyXSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+Pj4gMjQgJiAweGZmOwogICAgICBzZWFyY2hQYXR0ZXJuWzNdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+IDE2ICYgMHhmZjsKICAgICAgc2VhcmNoUGF0dGVybls0XSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiA4ICYgMHhmZjsKICAgICAgc2VhcmNoUGF0dGVybls1XSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCAmIDB4ZmY7CiAgICAgIGZvciAoaSA9IHBvc2l0aW9uLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGxldCBqID0gMDsKICAgICAgICB3aGlsZSAoaiA8IHNlYXJjaFBhdHRlcm5MZW5ndGggJiYgc2VhcmNoUGF0dGVybltqXSA9PT0gZGF0YVtpICsgal0pIHsKICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICAgICAgaWYgKGogPT09IHNlYXJjaFBhdHRlcm5MZW5ndGgpIHsKICAgICAgICAgIHNlZ21lbnRIZWFkZXIubGVuZ3RoID0gaSArIHNlYXJjaFBhdHRlcm5MZW5ndGg7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNlZ21lbnRIZWFkZXIubGVuZ3RoID09PSAweGZmZmZmZmZmKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNlZ21lbnQgZW5kIHdhcyBub3QgZm91bmQiKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgdW5rbm93biBzZWdtZW50IGxlbmd0aCIpOwogICAgfQogIH0KICBzZWdtZW50SGVhZGVyLmhlYWRlckVuZCA9IHBvc2l0aW9uOwogIHJldHVybiBzZWdtZW50SGVhZGVyOwp9CmZ1bmN0aW9uIHJlYWRTZWdtZW50cyhoZWFkZXIsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKICBjb25zdCBzZWdtZW50cyA9IFtdOwogIGxldCBwb3NpdGlvbiA9IHN0YXJ0OwogIHdoaWxlIChwb3NpdGlvbiA8IGVuZCkgewogICAgY29uc3Qgc2VnbWVudEhlYWRlciA9IHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHBvc2l0aW9uKTsKICAgIHBvc2l0aW9uID0gc2VnbWVudEhlYWRlci5oZWFkZXJFbmQ7CiAgICBjb25zdCBzZWdtZW50ID0gewogICAgICBoZWFkZXI6IHNlZ21lbnRIZWFkZXIsCiAgICAgIGRhdGEKICAgIH07CiAgICBpZiAoIWhlYWRlci5yYW5kb21BY2Nlc3MpIHsKICAgICAgc2VnbWVudC5zdGFydCA9IHBvc2l0aW9uOwogICAgICBwb3NpdGlvbiArPSBzZWdtZW50SGVhZGVyLmxlbmd0aDsKICAgICAgc2VnbWVudC5lbmQgPSBwb3NpdGlvbjsKICAgIH0KICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7CiAgICBpZiAoc2VnbWVudEhlYWRlci50eXBlID09PSA1MSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGhlYWRlci5yYW5kb21BY2Nlc3MpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgc2VnbWVudHNbaV0uc3RhcnQgPSBwb3NpdGlvbjsKICAgICAgcG9zaXRpb24gKz0gc2VnbWVudHNbaV0uaGVhZGVyLmxlbmd0aDsKICAgICAgc2VnbWVudHNbaV0uZW5kID0gcG9zaXRpb247CiAgICB9CiAgfQogIHJldHVybiBzZWdtZW50czsKfQpmdW5jdGlvbiByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHN0YXJ0KSB7CiAgcmV0dXJuIHsKICAgIHdpZHRoOiByZWFkVWludDMyKGRhdGEsIHN0YXJ0KSwKICAgIGhlaWdodDogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDQpLAogICAgeDogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDgpLAogICAgeTogcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDEyKSwKICAgIGNvbWJpbmF0aW9uT3BlcmF0b3I6IGRhdGFbc3RhcnQgKyAxNl0gJiA3CiAgfTsKfQpjb25zdCBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aCA9IDE3OwpmdW5jdGlvbiBwcm9jZXNzU2VnbWVudChzZWdtZW50LCB2aXNpdG9yKSB7CiAgY29uc3QgaGVhZGVyID0gc2VnbWVudC5oZWFkZXI7CiAgY29uc3QgZGF0YSA9IHNlZ21lbnQuZGF0YSwKICAgIGVuZCA9IHNlZ21lbnQuZW5kOwogIGxldCBwb3NpdGlvbiA9IHNlZ21lbnQuc3RhcnQ7CiAgbGV0IGFyZ3MsIGF0LCBpLCBhdExlbmd0aDsKICBzd2l0Y2ggKGhlYWRlci50eXBlKSB7CiAgICBjYXNlIDA6CiAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB7fTsKICAgICAgY29uc3QgZGljdGlvbmFyeUZsYWdzID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbiA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDEpOwogICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyKTsKICAgICAgZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiAyICYgMzsKICAgICAgZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA0ICYgMzsKICAgICAgZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gNiAmIDE7CiAgICAgIGRpY3Rpb25hcnkuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA3ICYgMTsKICAgICAgZGljdGlvbmFyeS5iaXRtYXBDb2RpbmdDb250ZXh0VXNlZCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDI1Nik7CiAgICAgIGRpY3Rpb25hcnkuYml0bWFwQ29kaW5nQ29udGV4dFJldGFpbmVkID0gISEoZGljdGlvbmFyeUZsYWdzICYgNTEyKTsKICAgICAgZGljdGlvbmFyeS50ZW1wbGF0ZSA9IGRpY3Rpb25hcnlGbGFncyA+PiAxMCAmIDM7CiAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlID0gZGljdGlvbmFyeUZsYWdzID4+IDEyICYgMTsKICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgaWYgKCFkaWN0aW9uYXJ5Lmh1ZmZtYW4pIHsKICAgICAgICBhdExlbmd0aCA9IGRpY3Rpb25hcnkudGVtcGxhdGUgPT09IDAgPyA0IDogMTsKICAgICAgICBhdCA9IFtdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7CiAgICAgICAgICBhdC5wdXNoKHsKICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLAogICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpCiAgICAgICAgICB9KTsKICAgICAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgICAgfQogICAgICAgIGRpY3Rpb25hcnkuYXQgPSBhdDsKICAgICAgfQogICAgICBpZiAoZGljdGlvbmFyeS5yZWZpbmVtZW50ICYmICFkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSkgewogICAgICAgIGF0ID0gW107CiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgYXQucHVzaCh7CiAgICAgICAgICAgIHg6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uKSwKICAgICAgICAgICAgeTogcmVhZEludDgoZGF0YSwgcG9zaXRpb24gKyAxKQogICAgICAgICAgfSk7CiAgICAgICAgICBwb3NpdGlvbiArPSAyOwogICAgICAgIH0KICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCA9IGF0OwogICAgICB9CiAgICAgIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgYXJncyA9IFtkaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSA2OgogICAgY2FzZSA3OgogICAgICBjb25zdCB0ZXh0UmVnaW9uID0ge307CiAgICAgIHRleHRSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKICAgICAgY29uc3QgdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSAyOwogICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW4gPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgMSk7CiAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudCA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiAyKTsKICAgICAgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemUgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDIgJiAzOwogICAgICB0ZXh0UmVnaW9uLnN0cmlwU2l6ZSA9IDEgPDwgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemU7CiAgICAgIHRleHRSZWdpb24ucmVmZXJlbmNlQ29ybmVyID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA0ICYgMzsKICAgICAgdGV4dFJlZ2lvbi50cmFuc3Bvc2VkID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDY0KTsKICAgICAgdGV4dFJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA3ICYgMzsKICAgICAgdGV4dFJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gOSAmIDE7CiAgICAgIHRleHRSZWdpb24uZHNPZmZzZXQgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzIDw8IDE3ID4+IDI3OwogICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMTUgJiAxOwogICAgICBpZiAodGV4dFJlZ2lvbi5odWZmbWFuKSB7CiAgICAgICAgY29uc3QgdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA9IHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24pOwogICAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRlMgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5EUyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMiAmIDM7CiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuRFQgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDQgJiAzOwogICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREVyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gNiAmIDM7CiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERIID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA4ICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFggPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDEwICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50RFkgPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDEyICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50U2l6ZVNlbGVjdG9yID0gISEodGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyAmIDB4NDAwMCk7CiAgICAgIH0KICAgICAgaWYgKHRleHRSZWdpb24ucmVmaW5lbWVudCAmJiAhdGV4dFJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUpIHsKICAgICAgICBhdCA9IFtdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgIGF0LnB1c2goewogICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksCiAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSkKICAgICAgICAgIH0pOwogICAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICB9CiAgICAgICAgdGV4dFJlZ2lvbi5yZWZpbmVtZW50QXQgPSBhdDsKICAgICAgfQogICAgICB0ZXh0UmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDQ7CiAgICAgIGFyZ3MgPSBbdGV4dFJlZ2lvbiwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOwogICAgICBicmVhazsKICAgIGNhc2UgMTY6CiAgICAgIGNvbnN0IHBhdHRlcm5EaWN0aW9uYXJ5ID0ge307CiAgICAgIGNvbnN0IHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgICBwYXR0ZXJuRGljdGlvbmFyeS5tbXIgPSAhIShwYXR0ZXJuRGljdGlvbmFyeUZsYWdzICYgMSk7CiAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5LnRlbXBsYXRlID0gcGF0dGVybkRpY3Rpb25hcnlGbGFncyA+PiAxICYgMzsKICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybldpZHRoID0gZGF0YVtwb3NpdGlvbisrXTsKICAgICAgcGF0dGVybkRpY3Rpb25hcnkucGF0dGVybkhlaWdodCA9IGRhdGFbcG9zaXRpb24rK107CiAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5Lm1heFBhdHRlcm5JbmRleCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSA0OwogICAgICBhcmdzID0gW3BhdHRlcm5EaWN0aW9uYXJ5LCBoZWFkZXIubnVtYmVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDIyOgogICAgY2FzZSAyMzoKICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb24gPSB7fTsKICAgICAgaGFsZnRvbmVSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKICAgICAgY29uc3QgaGFsZnRvbmVSZWdpb25GbGFncyA9IGRhdGFbcG9zaXRpb24rK107CiAgICAgIGhhbGZ0b25lUmVnaW9uLm1tciA9ICEhKGhhbGZ0b25lUmVnaW9uRmxhZ3MgJiAxKTsKICAgICAgaGFsZnRvbmVSZWdpb24udGVtcGxhdGUgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDEgJiAzOwogICAgICBoYWxmdG9uZVJlZ2lvbi5lbmFibGVTa2lwID0gISEoaGFsZnRvbmVSZWdpb25GbGFncyAmIDgpOwogICAgICBoYWxmdG9uZVJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yID0gaGFsZnRvbmVSZWdpb25GbGFncyA+PiA0ICYgNzsKICAgICAgaGFsZnRvbmVSZWdpb24uZGVmYXVsdFBpeGVsVmFsdWUgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDcgJiAxOwogICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkV2lkdGggPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZEhlaWdodCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSA0OwogICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZE9mZnNldFkgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKSAmIDB4ZmZmZmZmZmY7CiAgICAgIHBvc2l0aW9uICs9IDQ7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JYID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JZID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgIGFyZ3MgPSBbaGFsZnRvbmVSZWdpb24sIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM4OgogICAgY2FzZSAzOToKICAgICAgY29uc3QgZ2VuZXJpY1JlZ2lvbiA9IHt9OwogICAgICBnZW5lcmljUmVnaW9uLmluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGg7CiAgICAgIGNvbnN0IGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgICBnZW5lcmljUmVnaW9uLm1tciA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKICAgICAgZ2VuZXJpY1JlZ2lvbi50ZW1wbGF0ZSA9IGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPj4gMSAmIDM7CiAgICAgIGdlbmVyaWNSZWdpb24ucHJlZGljdGlvbiA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiA4KTsKICAgICAgaWYgKCFnZW5lcmljUmVnaW9uLm1tcikgewogICAgICAgIGF0TGVuZ3RoID0gZ2VuZXJpY1JlZ2lvbi50ZW1wbGF0ZSA9PT0gMCA/IDQgOiAxOwogICAgICAgIGF0ID0gW107CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0TGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGF0LnB1c2goewogICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksCiAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSkKICAgICAgICAgIH0pOwogICAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICB9CiAgICAgICAgZ2VuZXJpY1JlZ2lvbi5hdCA9IGF0OwogICAgICB9CiAgICAgIGFyZ3MgPSBbZ2VuZXJpY1JlZ2lvbiwgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSA0ODoKICAgICAgY29uc3QgcGFnZUluZm8gPSB7CiAgICAgICAgd2lkdGg6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pLAogICAgICAgIGhlaWdodDogcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDQpLAogICAgICAgIHJlc29sdXRpb25YOiByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgOCksCiAgICAgICAgcmVzb2x1dGlvblk6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyAxMikKICAgICAgfTsKICAgICAgaWYgKHBhZ2VJbmZvLmhlaWdodCA9PT0gMHhmZmZmZmZmZikgewogICAgICAgIGRlbGV0ZSBwYWdlSW5mby5oZWlnaHQ7CiAgICAgIH0KICAgICAgY29uc3QgcGFnZVNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24gKyAxNl07CiAgICAgIHJlYWRVaW50MTYoZGF0YSwgcG9zaXRpb24gKyAxNyk7CiAgICAgIHBhZ2VJbmZvLmxvc3NsZXNzID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDEpOwogICAgICBwYWdlSW5mby5yZWZpbmVtZW50ID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDIpOwogICAgICBwYWdlSW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSA9IHBhZ2VTZWdtZW50RmxhZ3MgPj4gMiAmIDE7CiAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSBwYWdlU2VnbWVudEZsYWdzID4+IDMgJiAzOwogICAgICBwYWdlSW5mby5yZXF1aXJlc0J1ZmZlciA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiAzMik7CiAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZSA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiA2NCk7CiAgICAgIGFyZ3MgPSBbcGFnZUluZm9dOwogICAgICBicmVhazsKICAgIGNhc2UgNDk6CiAgICAgIGJyZWFrOwogICAgY2FzZSA1MDoKICAgICAgYnJlYWs7CiAgICBjYXNlIDUxOgogICAgICBicmVhazsKICAgIGNhc2UgNTM6CiAgICAgIGFyZ3MgPSBbaGVhZGVyLm51bWJlciwgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSA2MjoKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc2VnbWVudCB0eXBlICR7aGVhZGVyLnR5cGVOYW1lfSgke2hlYWRlci50eXBlfSkgaXMgbm90IGltcGxlbWVudGVkYCk7CiAgfQogIGNvbnN0IGNhbGxiYWNrTmFtZSA9ICJvbiIgKyBoZWFkZXIudHlwZU5hbWU7CiAgaWYgKGNhbGxiYWNrTmFtZSBpbiB2aXNpdG9yKSB7CiAgICB2aXNpdG9yW2NhbGxiYWNrTmFtZV0uYXBwbHkodmlzaXRvciwgYXJncyk7CiAgfQp9CmZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50cyhzZWdtZW50cywgdmlzaXRvcikgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIHByb2Nlc3NTZWdtZW50KHNlZ21lbnRzW2ldLCB2aXNpdG9yKTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpIHsKICBjb25zdCB2aXNpdG9yID0gbmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yKCk7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2ldOwogICAgY29uc3Qgc2VnbWVudHMgPSByZWFkU2VnbWVudHMoe30sIGNodW5rLmRhdGEsIGNodW5rLnN0YXJ0LCBjaHVuay5lbmQpOwogICAgcHJvY2Vzc1NlZ21lbnRzKHNlZ21lbnRzLCB2aXNpdG9yKTsKICB9CiAgcmV0dXJuIHZpc2l0b3IuYnVmZmVyOwp9CmZ1bmN0aW9uIHBhcnNlSmJpZzIoZGF0YSkgewogIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBwYXJzZUpiaWcyIik7Cn0KY2xhc3MgU2ltcGxlU2VnbWVudFZpc2l0b3IgewogIG9uUGFnZUluZm9ybWF0aW9uKGluZm8pIHsKICAgIHRoaXMuY3VycmVudFBhZ2VJbmZvID0gaW5mbzsKICAgIGNvbnN0IHJvd1NpemUgPSBpbmZvLndpZHRoICsgNyA+PiAzOwogICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHJvd1NpemUgKiBpbmZvLmhlaWdodCk7CiAgICBpZiAoaW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSkgewogICAgICBidWZmZXIuZmlsbCgweGZmKTsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogIH0KICBkcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCkgewogICAgY29uc3QgcGFnZUluZm8gPSB0aGlzLmN1cnJlbnRQYWdlSW5mbzsKICAgIGNvbnN0IHdpZHRoID0gcmVnaW9uSW5mby53aWR0aCwKICAgICAgaGVpZ2h0ID0gcmVnaW9uSW5mby5oZWlnaHQ7CiAgICBjb25zdCByb3dTaXplID0gcGFnZUluZm8ud2lkdGggKyA3ID4+IDM7CiAgICBjb25zdCBjb21iaW5hdGlvbk9wZXJhdG9yID0gcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvck92ZXJyaWRlID8gcmVnaW9uSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yIDogcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvcjsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgY29uc3QgbWFzazAgPSAxMjggPj4gKHJlZ2lvbkluZm8ueCAmIDcpOwogICAgbGV0IG9mZnNldDAgPSByZWdpb25JbmZvLnkgKiByb3dTaXplICsgKHJlZ2lvbkluZm8ueCA+PiAzKTsKICAgIGxldCBpLCBqLCBtYXNrLCBvZmZzZXQ7CiAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgICAgICAgbWFzayA9IG1hc2swOwogICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgICAgICAgIGlmIChiaXRtYXBbaV1bal0pIHsKICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSB8PSBtYXNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hc2sgPj49IDE7CiAgICAgICAgICAgIGlmICghbWFzaykgewogICAgICAgICAgICAgIG1hc2sgPSAxMjg7CiAgICAgICAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG9mZnNldDAgKz0gcm93U2l6ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgICAgICAgIG1hc2sgPSBtYXNrMDsKICAgICAgICAgIG9mZnNldCA9IG9mZnNldDA7CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgewogICAgICAgICAgICBpZiAoYml0bWFwW2ldW2pdKSB7CiAgICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gXj0gbWFzazsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXNrID4+PSAxOwogICAgICAgICAgICBpZiAoIW1hc2spIHsKICAgICAgICAgICAgICBtYXNrID0gMTI4OwogICAgICAgICAgICAgIG9mZnNldCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQwICs9IHJvd1NpemU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAke2NvbWJpbmF0aW9uT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWRgKTsKICAgIH0KICB9CiAgb25JbW1lZGlhdGVHZW5lcmljUmVnaW9uKHJlZ2lvbiwgZGF0YSwgc3RhcnQsIGVuZCkgewogICAgY29uc3QgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvOwogICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKICAgIGNvbnN0IGJpdG1hcCA9IGRlY29kZUJpdG1hcChyZWdpb24ubW1yLCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLnRlbXBsYXRlLCByZWdpb24ucHJlZGljdGlvbiwgbnVsbCwgcmVnaW9uLmF0LCBkZWNvZGluZ0NvbnRleHQpOwogICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7CiAgfQogIG9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uKCkgewogICAgdGhpcy5vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24oLi4uYXJndW1lbnRzKTsKICB9CiAgb25TeW1ib2xEaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0OwogICAgaWYgKGRpY3Rpb25hcnkuaHVmZm1hbikgewogICAgICBodWZmbWFuVGFibGVzID0gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRTZWdtZW50cywgdGhpcy5jdXN0b21UYWJsZXMpOwogICAgICBodWZmbWFuSW5wdXQgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgfQogICAgbGV0IHN5bWJvbHMgPSB0aGlzLnN5bWJvbHM7CiAgICBpZiAoIXN5bWJvbHMpIHsKICAgICAgdGhpcy5zeW1ib2xzID0gc3ltYm9scyA9IHt9OwogICAgfQogICAgY29uc3QgaW5wdXRTeW1ib2xzID0gW107CiAgICBmb3IgKGNvbnN0IHJlZmVycmVkU2VnbWVudCBvZiByZWZlcnJlZFNlZ21lbnRzKSB7CiAgICAgIGNvbnN0IHJlZmVycmVkU3ltYm9scyA9IHN5bWJvbHNbcmVmZXJyZWRTZWdtZW50XTsKICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykgewogICAgICAgIGlucHV0U3ltYm9scy5wdXNoKC4uLnJlZmVycmVkU3ltYm9scyk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBzeW1ib2xzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVN5bWJvbERpY3Rpb25hcnkoZGljdGlvbmFyeS5odWZmbWFuLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnQsIGlucHV0U3ltYm9scywgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMsIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRpY3Rpb25hcnkuYXQsIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCBodWZmbWFuSW5wdXQpOwogIH0KICBvbkltbWVkaWF0ZVRleHRSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBjb25zdCByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CiAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0OwogICAgY29uc3Qgc3ltYm9scyA9IHRoaXMuc3ltYm9sczsKICAgIGNvbnN0IGlucHV0U3ltYm9scyA9IFtdOwogICAgZm9yIChjb25zdCByZWZlcnJlZFNlZ21lbnQgb2YgcmVmZXJyZWRTZWdtZW50cykgewogICAgICBjb25zdCByZWZlcnJlZFN5bWJvbHMgPSBzeW1ib2xzW3JlZmVycmVkU2VnbWVudF07CiAgICAgIGlmIChyZWZlcnJlZFN5bWJvbHMpIHsKICAgICAgICBpbnB1dFN5bWJvbHMucHVzaCguLi5yZWZlcnJlZFN5bWJvbHMpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBzeW1ib2xDb2RlTGVuZ3RoID0gbG9nMihpbnB1dFN5bWJvbHMubGVuZ3RoKTsKICAgIGlmIChyZWdpb24uaHVmZm1hbikgewogICAgICBodWZmbWFuSW5wdXQgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgICBodWZmbWFuVGFibGVzID0gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXMocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCB0aGlzLmN1c3RvbVRhYmxlcywgaW5wdXRTeW1ib2xzLmxlbmd0aCwgaHVmZm1hbklucHV0KTsKICAgIH0KICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBjb25zdCBiaXRtYXAgPSBkZWNvZGVUZXh0UmVnaW9uKHJlZ2lvbi5odWZmbWFuLCByZWdpb24ucmVmaW5lbWVudCwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSwgcmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzLCByZWdpb24uc3RyaXBTaXplLCBpbnB1dFN5bWJvbHMsIHN5bWJvbENvZGVMZW5ndGgsIHJlZ2lvbi50cmFuc3Bvc2VkLCByZWdpb24uZHNPZmZzZXQsIHJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIsIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLCBodWZmbWFuVGFibGVzLCByZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlLCByZWdpb24ucmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIHJlZ2lvbi5sb2dTdHJpcFNpemUsIGh1ZmZtYW5JbnB1dCk7CiAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKICB9CiAgb25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24oKSB7CiAgICB0aGlzLm9uSW1tZWRpYXRlVGV4dFJlZ2lvbiguLi5hcmd1bWVudHMpOwogIH0KICBvblBhdHRlcm5EaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBsZXQgcGF0dGVybnMgPSB0aGlzLnBhdHRlcm5zOwogICAgaWYgKCFwYXR0ZXJucykgewogICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnMgPSB7fTsKICAgIH0KICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBwYXR0ZXJuc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShkaWN0aW9uYXJ5Lm1tciwgZGljdGlvbmFyeS5wYXR0ZXJuV2lkdGgsIGRpY3Rpb25hcnkucGF0dGVybkhlaWdodCwgZGljdGlvbmFyeS5tYXhQYXR0ZXJuSW5kZXgsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRlY29kaW5nQ29udGV4dCk7CiAgfQogIG9uSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMucGF0dGVybnNbcmVmZXJyZWRTZWdtZW50c1swXV07CiAgICBjb25zdCByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CiAgICBjb25zdCBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgY29uc3QgYml0bWFwID0gZGVjb2RlSGFsZnRvbmVSZWdpb24ocmVnaW9uLm1tciwgcGF0dGVybnMsIHJlZ2lvbi50ZW1wbGF0ZSwgcmVnaW9uSW5mby53aWR0aCwgcmVnaW9uSW5mby5oZWlnaHQsIHJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSwgcmVnaW9uLmVuYWJsZVNraXAsIHJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yLCByZWdpb24uZ3JpZFdpZHRoLCByZWdpb24uZ3JpZEhlaWdodCwgcmVnaW9uLmdyaWRPZmZzZXRYLCByZWdpb24uZ3JpZE9mZnNldFksIHJlZ2lvbi5ncmlkVmVjdG9yWCwgcmVnaW9uLmdyaWRWZWN0b3JZLCBkZWNvZGluZ0NvbnRleHQpOwogICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7CiAgfQogIG9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbigpIHsKICAgIHRoaXMub25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiguLi5hcmd1bWVudHMpOwogIH0KICBvblRhYmxlcyhjdXJyZW50U2VnbWVudCwgZGF0YSwgc3RhcnQsIGVuZCkgewogICAgbGV0IGN1c3RvbVRhYmxlcyA9IHRoaXMuY3VzdG9tVGFibGVzOwogICAgaWYgKCFjdXN0b21UYWJsZXMpIHsKICAgICAgdGhpcy5jdXN0b21UYWJsZXMgPSBjdXN0b21UYWJsZXMgPSB7fTsKICAgIH0KICAgIGN1c3RvbVRhYmxlc1tjdXJyZW50U2VnbWVudF0gPSBkZWNvZGVUYWJsZXNTZWdtZW50KGRhdGEsIHN0YXJ0LCBlbmQpOwogIH0KfQpjbGFzcyBIdWZmbWFuTGluZSB7CiAgY29uc3RydWN0b3IobGluZURhdGEpIHsKICAgIGlmIChsaW5lRGF0YS5sZW5ndGggPT09IDIpIHsKICAgICAgdGhpcy5pc09PQiA9IHRydWU7CiAgICAgIHRoaXMucmFuZ2VMb3cgPSAwOwogICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzBdOwogICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gMDsKICAgICAgdGhpcy5wcmVmaXhDb2RlID0gbGluZURhdGFbMV07CiAgICAgIHRoaXMuaXNMb3dlclJhbmdlID0gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmlzT09CID0gZmFsc2U7CiAgICAgIHRoaXMucmFuZ2VMb3cgPSBsaW5lRGF0YVswXTsKICAgICAgdGhpcy5wcmVmaXhMZW5ndGggPSBsaW5lRGF0YVsxXTsKICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmVEYXRhWzJdOwogICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVszXTsKICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBsaW5lRGF0YVs0XSA9PT0gImxvd2VyIjsKICAgIH0KICB9Cn0KY2xhc3MgSHVmZm1hblRyZWVOb2RlIHsKICBjb25zdHJ1Y3RvcihsaW5lKSB7CiAgICB0aGlzLmNoaWxkcmVuID0gW107CiAgICBpZiAobGluZSkgewogICAgICB0aGlzLmlzTGVhZiA9IHRydWU7CiAgICAgIHRoaXMucmFuZ2VMZW5ndGggPSBsaW5lLnJhbmdlTGVuZ3RoOwogICAgICB0aGlzLnJhbmdlTG93ID0gbGluZS5yYW5nZUxvdzsKICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBsaW5lLmlzTG93ZXJSYW5nZTsKICAgICAgdGhpcy5pc09PQiA9IGxpbmUuaXNPT0I7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmlzTGVhZiA9IGZhbHNlOwogICAgfQogIH0KICBidWlsZFRyZWUobGluZSwgc2hpZnQpIHsKICAgIGNvbnN0IGJpdCA9IGxpbmUucHJlZml4Q29kZSA+PiBzaGlmdCAmIDE7CiAgICBpZiAoc2hpZnQgPD0gMCkgewogICAgICB0aGlzLmNoaWxkcmVuW2JpdF0gPSBuZXcgSHVmZm1hblRyZWVOb2RlKGxpbmUpOwogICAgfSBlbHNlIHsKICAgICAgbGV0IG5vZGUgPSB0aGlzLmNoaWxkcmVuW2JpdF07CiAgICAgIGlmICghbm9kZSkgewogICAgICAgIHRoaXMuY2hpbGRyZW5bYml0XSA9IG5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpOwogICAgICB9CiAgICAgIG5vZGUuYnVpbGRUcmVlKGxpbmUsIHNoaWZ0IC0gMSk7CiAgICB9CiAgfQogIGRlY29kZU5vZGUocmVhZGVyKSB7CiAgICBpZiAodGhpcy5pc0xlYWYpIHsKICAgICAgaWYgKHRoaXMuaXNPT0IpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBodE9mZnNldCA9IHJlYWRlci5yZWFkQml0cyh0aGlzLnJhbmdlTGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXMucmFuZ2VMb3cgKyAodGhpcy5pc0xvd2VyUmFuZ2UgPyAtaHRPZmZzZXQgOiBodE9mZnNldCk7CiAgICB9CiAgICBjb25zdCBub2RlID0gdGhpcy5jaGlsZHJlbltyZWFkZXIucmVhZEJpdCgpXTsKICAgIGlmICghbm9kZSkgewogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIGRhdGEiKTsKICAgIH0KICAgIHJldHVybiBub2RlLmRlY29kZU5vZGUocmVhZGVyKTsKICB9Cn0KY2xhc3MgSHVmZm1hblRhYmxlIHsKICBjb25zdHJ1Y3RvcihsaW5lcywgcHJlZml4Q29kZXNEb25lKSB7CiAgICBpZiAoIXByZWZpeENvZGVzRG9uZSkgewogICAgICB0aGlzLmFzc2lnblByZWZpeENvZGVzKGxpbmVzKTsKICAgIH0KICAgIHRoaXMucm9vdE5vZGUgPSBuZXcgSHVmZm1hblRyZWVOb2RlKG51bGwpOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07CiAgICAgIGlmIChsaW5lLnByZWZpeExlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnJvb3ROb2RlLmJ1aWxkVHJlZShsaW5lLCBsaW5lLnByZWZpeExlbmd0aCAtIDEpOwogICAgICB9CiAgICB9CiAgfQogIGRlY29kZShyZWFkZXIpIHsKICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLmRlY29kZU5vZGUocmVhZGVyKTsKICB9CiAgYXNzaWduUHJlZml4Q29kZXMobGluZXMpIHsKICAgIGNvbnN0IGxpbmVzTGVuZ3RoID0gbGluZXMubGVuZ3RoOwogICAgbGV0IHByZWZpeExlbmd0aE1heCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzTGVuZ3RoOyBpKyspIHsKICAgICAgcHJlZml4TGVuZ3RoTWF4ID0gTWF0aC5tYXgocHJlZml4TGVuZ3RoTWF4LCBsaW5lc1tpXS5wcmVmaXhMZW5ndGgpOwogICAgfQogICAgY29uc3QgaGlzdG9ncmFtID0gbmV3IFVpbnQzMkFycmF5KHByZWZpeExlbmd0aE1heCArIDEpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0xlbmd0aDsgaSsrKSB7CiAgICAgIGhpc3RvZ3JhbVtsaW5lc1tpXS5wcmVmaXhMZW5ndGhdKys7CiAgICB9CiAgICBsZXQgY3VycmVudExlbmd0aCA9IDEsCiAgICAgIGZpcnN0Q29kZSA9IDAsCiAgICAgIGN1cnJlbnRDb2RlLAogICAgICBjdXJyZW50VGVtcCwKICAgICAgbGluZTsKICAgIGhpc3RvZ3JhbVswXSA9IDA7CiAgICB3aGlsZSAoY3VycmVudExlbmd0aCA8PSBwcmVmaXhMZW5ndGhNYXgpIHsKICAgICAgZmlyc3RDb2RlID0gZmlyc3RDb2RlICsgaGlzdG9ncmFtW2N1cnJlbnRMZW5ndGggLSAxXSA8PCAxOwogICAgICBjdXJyZW50Q29kZSA9IGZpcnN0Q29kZTsKICAgICAgY3VycmVudFRlbXAgPSAwOwogICAgICB3aGlsZSAoY3VycmVudFRlbXAgPCBsaW5lc0xlbmd0aCkgewogICAgICAgIGxpbmUgPSBsaW5lc1tjdXJyZW50VGVtcF07CiAgICAgICAgaWYgKGxpbmUucHJlZml4TGVuZ3RoID09PSBjdXJyZW50TGVuZ3RoKSB7CiAgICAgICAgICBsaW5lLnByZWZpeENvZGUgPSBjdXJyZW50Q29kZTsKICAgICAgICAgIGN1cnJlbnRDb2RlKys7CiAgICAgICAgfQogICAgICAgIGN1cnJlbnRUZW1wKys7CiAgICAgIH0KICAgICAgY3VycmVudExlbmd0aCsrOwogICAgfQogIH0KfQpmdW5jdGlvbiBkZWNvZGVUYWJsZXNTZWdtZW50KGRhdGEsIHN0YXJ0LCBlbmQpIHsKICBjb25zdCBmbGFncyA9IGRhdGFbc3RhcnRdOwogIGNvbnN0IGxvd2VzdFZhbHVlID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIDEpICYgMHhmZmZmZmZmZjsKICBjb25zdCBoaWdoZXN0VmFsdWUgPSByZWFkVWludDMyKGRhdGEsIHN0YXJ0ICsgNSkgJiAweGZmZmZmZmZmOwogIGNvbnN0IHJlYWRlciA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQgKyA5LCBlbmQpOwogIGNvbnN0IHByZWZpeFNpemVCaXRzID0gKGZsYWdzID4+IDEgJiA3KSArIDE7CiAgY29uc3QgcmFuZ2VTaXplQml0cyA9IChmbGFncyA+PiA0ICYgNykgKyAxOwogIGNvbnN0IGxpbmVzID0gW107CiAgbGV0IHByZWZpeExlbmd0aCwKICAgIHJhbmdlTGVuZ3RoLAogICAgY3VycmVudFJhbmdlTG93ID0gbG93ZXN0VmFsdWU7CiAgZG8gewogICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKICAgIHJhbmdlTGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHJhbmdlU2l6ZUJpdHMpOwogICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2N1cnJlbnRSYW5nZUxvdywgcHJlZml4TGVuZ3RoLCByYW5nZUxlbmd0aCwgMF0pKTsKICAgIGN1cnJlbnRSYW5nZUxvdyArPSAxIDw8IHJhbmdlTGVuZ3RoOwogIH0gd2hpbGUgKGN1cnJlbnRSYW5nZUxvdyA8IGhpZ2hlc3RWYWx1ZSk7CiAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbbG93ZXN0VmFsdWUgLSAxLCBwcmVmaXhMZW5ndGgsIDMyLCAwLCAibG93ZXIiXSkpOwogIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CiAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2hpZ2hlc3RWYWx1ZSwgcHJlZml4TGVuZ3RoLCAzMiwgMF0pKTsKICBpZiAoZmxhZ3MgJiAxKSB7CiAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOwogICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW3ByZWZpeExlbmd0aCwgMF0pKTsKICB9CiAgcmV0dXJuIG5ldyBIdWZmbWFuVGFibGUobGluZXMsIGZhbHNlKTsKfQpjb25zdCBzdGFuZGFyZFRhYmxlc0NhY2hlID0ge307CmZ1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUobnVtYmVyKSB7CiAgbGV0IHRhYmxlID0gc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdOwogIGlmICh0YWJsZSkgewogICAgcmV0dXJuIHRhYmxlOwogIH0KICBsZXQgbGluZXM7CiAgc3dpdGNoIChudW1iZXIpIHsKICAgIGNhc2UgMToKICAgICAgbGluZXMgPSBbWzAsIDEsIDQsIDB4MF0sIFsxNiwgMiwgOCwgMHgyXSwgWzI3MiwgMywgMTYsIDB4Nl0sIFs2NTgwOCwgMywgMzIsIDB4N11dOwogICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgICAgbGluZXMgPSBbWzAsIDEsIDAsIDB4MF0sIFsxLCAyLCAwLCAweDJdLCBbMiwgMywgMCwgMHg2XSwgWzMsIDQsIDMsIDB4ZV0sIFsxMSwgNSwgNiwgMHgxZV0sIFs3NSwgNiwgMzIsIDB4M2VdLCBbNiwgMHgzZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgbGluZXMgPSBbWy0yNTYsIDgsIDgsIDB4ZmVdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDIsIDAsIDB4Ml0sIFsyLCAzLCAwLCAweDZdLCBbMywgNCwgMywgMHhlXSwgWzExLCA1LCA2LCAweDFlXSwgWy0yNTcsIDgsIDMyLCAweGZmLCAibG93ZXIiXSwgWzc1LCA3LCAzMiwgMHg3ZV0sIFs2LCAweDNlXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAwLCAweDZdLCBbNCwgNCwgMywgMHhlXSwgWzEyLCA1LCA2LCAweDFlXSwgWzc2LCA1LCAzMiwgMHgxZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgNToKICAgICAgbGluZXMgPSBbWy0yNTUsIDcsIDgsIDB4N2VdLCBbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAwLCAweDZdLCBbNCwgNCwgMywgMHhlXSwgWzEyLCA1LCA2LCAweDFlXSwgWy0yNTYsIDcsIDMyLCAweDdmLCAibG93ZXIiXSwgWzc2LCA2LCAzMiwgMHgzZV1dOwogICAgICBicmVhazsKICAgIGNhc2UgNjoKICAgICAgbGluZXMgPSBbWy0yMDQ4LCA1LCAxMCwgMHgxY10sIFstMTAyNCwgNCwgOSwgMHg4XSwgWy01MTIsIDQsIDgsIDB4OV0sIFstMjU2LCA0LCA3LCAweGFdLCBbLTEyOCwgNSwgNiwgMHgxZF0sIFstNjQsIDUsIDUsIDB4MWVdLCBbLTMyLCA0LCA1LCAweGJdLCBbMCwgMiwgNywgMHgwXSwgWzEyOCwgMywgNywgMHgyXSwgWzI1NiwgMywgOCwgMHgzXSwgWzUxMiwgNCwgOSwgMHhjXSwgWzEwMjQsIDQsIDEwLCAweGRdLCBbLTIwNDksIDYsIDMyLCAweDNlLCAibG93ZXIiXSwgWzIwNDgsIDYsIDMyLCAweDNmXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA3OgogICAgICBsaW5lcyA9IFtbLTEwMjQsIDQsIDksIDB4OF0sIFstNTEyLCAzLCA4LCAweDBdLCBbLTI1NiwgNCwgNywgMHg5XSwgWy0xMjgsIDUsIDYsIDB4MWFdLCBbLTY0LCA1LCA1LCAweDFiXSwgWy0zMiwgNCwgNSwgMHhhXSwgWzAsIDQsIDUsIDB4Yl0sIFszMiwgNSwgNSwgMHgxY10sIFs2NCwgNSwgNiwgMHgxZF0sIFsxMjgsIDQsIDcsIDB4Y10sIFsyNTYsIDMsIDgsIDB4MV0sIFs1MTIsIDMsIDksIDB4Ml0sIFsxMDI0LCAzLCAxMCwgMHgzXSwgWy0xMDI1LCA1LCAzMiwgMHgxZSwgImxvd2VyIl0sIFsyMDQ4LCA1LCAzMiwgMHgxZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgODoKICAgICAgbGluZXMgPSBbWy0xNSwgOCwgMywgMHhmY10sIFstNywgOSwgMSwgMHgxZmNdLCBbLTUsIDgsIDEsIDB4ZmRdLCBbLTMsIDksIDAsIDB4MWZkXSwgWy0yLCA3LCAwLCAweDdjXSwgWy0xLCA0LCAwLCAweGFdLCBbMCwgMiwgMSwgMHgwXSwgWzIsIDUsIDAsIDB4MWFdLCBbMywgNiwgMCwgMHgzYV0sIFs0LCAzLCA0LCAweDRdLCBbMjAsIDYsIDEsIDB4M2JdLCBbMjIsIDQsIDQsIDB4Yl0sIFszOCwgNCwgNSwgMHhjXSwgWzcwLCA1LCA2LCAweDFiXSwgWzEzNCwgNSwgNywgMHgxY10sIFsyNjIsIDYsIDcsIDB4M2NdLCBbMzkwLCA3LCA4LCAweDdkXSwgWzY0NiwgNiwgMTAsIDB4M2RdLCBbLTE2LCA5LCAzMiwgMHgxZmUsICJsb3dlciJdLCBbMTY3MCwgOSwgMzIsIDB4MWZmXSwgWzIsIDB4MV1dOwogICAgICBicmVhazsKICAgIGNhc2UgOToKICAgICAgbGluZXMgPSBbWy0zMSwgOCwgNCwgMHhmY10sIFstMTUsIDksIDIsIDB4MWZjXSwgWy0xMSwgOCwgMiwgMHhmZF0sIFstNywgOSwgMSwgMHgxZmRdLCBbLTUsIDcsIDEsIDB4N2NdLCBbLTMsIDQsIDEsIDB4YV0sIFstMSwgMywgMSwgMHgyXSwgWzEsIDMsIDEsIDB4M10sIFszLCA1LCAxLCAweDFhXSwgWzUsIDYsIDEsIDB4M2FdLCBbNywgMywgNSwgMHg0XSwgWzM5LCA2LCAyLCAweDNiXSwgWzQzLCA0LCA1LCAweGJdLCBbNzUsIDQsIDYsIDB4Y10sIFsxMzksIDUsIDcsIDB4MWJdLCBbMjY3LCA1LCA4LCAweDFjXSwgWzUyMywgNiwgOCwgMHgzY10sIFs3NzksIDcsIDksIDB4N2RdLCBbMTI5MSwgNiwgMTEsIDB4M2RdLCBbLTMyLCA5LCAzMiwgMHgxZmUsICJsb3dlciJdLCBbMzMzOSwgOSwgMzIsIDB4MWZmXSwgWzIsIDB4MF1dOwogICAgICBicmVhazsKICAgIGNhc2UgMTA6CiAgICAgIGxpbmVzID0gW1stMjEsIDcsIDQsIDB4N2FdLCBbLTUsIDgsIDAsIDB4ZmNdLCBbLTQsIDcsIDAsIDB4N2JdLCBbLTMsIDUsIDAsIDB4MThdLCBbLTIsIDIsIDIsIDB4MF0sIFsyLCA1LCAwLCAweDE5XSwgWzMsIDYsIDAsIDB4MzZdLCBbNCwgNywgMCwgMHg3Y10sIFs1LCA4LCAwLCAweGZkXSwgWzYsIDIsIDYsIDB4MV0sIFs3MCwgNSwgNSwgMHgxYV0sIFsxMDIsIDYsIDUsIDB4MzddLCBbMTM0LCA2LCA2LCAweDM4XSwgWzE5OCwgNiwgNywgMHgzOV0sIFszMjYsIDYsIDgsIDB4M2FdLCBbNTgyLCA2LCA5LCAweDNiXSwgWzEwOTQsIDYsIDEwLCAweDNjXSwgWzIxMTgsIDcsIDExLCAweDdkXSwgWy0yMiwgOCwgMzIsIDB4ZmUsICJsb3dlciJdLCBbNDE2NiwgOCwgMzIsIDB4ZmZdLCBbMiwgMHgyXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxMToKICAgICAgbGluZXMgPSBbWzEsIDEsIDAsIDB4MF0sIFsyLCAyLCAxLCAweDJdLCBbNCwgNCwgMCwgMHhjXSwgWzUsIDQsIDEsIDB4ZF0sIFs3LCA1LCAxLCAweDFjXSwgWzksIDUsIDIsIDB4MWRdLCBbMTMsIDYsIDIsIDB4M2NdLCBbMTcsIDcsIDIsIDB4N2FdLCBbMjEsIDcsIDMsIDB4N2JdLCBbMjksIDcsIDQsIDB4N2NdLCBbNDUsIDcsIDUsIDB4N2RdLCBbNzcsIDcsIDYsIDB4N2VdLCBbMTQxLCA3LCAzMiwgMHg3Zl1dOwogICAgICBicmVhazsKICAgIGNhc2UgMTI6CiAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDEsIDB4Nl0sIFs1LCA1LCAwLCAweDFjXSwgWzYsIDUsIDEsIDB4MWRdLCBbOCwgNiwgMSwgMHgzY10sIFsxMCwgNywgMCwgMHg3YV0sIFsxMSwgNywgMSwgMHg3Yl0sIFsxMywgNywgMiwgMHg3Y10sIFsxNywgNywgMywgMHg3ZF0sIFsyNSwgNywgNCwgMHg3ZV0sIFs0MSwgOCwgNSwgMHhmZV0sIFs3MywgOCwgMzIsIDB4ZmZdXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDEzOgogICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDMsIDAsIDB4NF0sIFszLCA0LCAwLCAweGNdLCBbNCwgNSwgMCwgMHgxY10sIFs1LCA0LCAxLCAweGRdLCBbNywgMywgMywgMHg1XSwgWzE1LCA2LCAxLCAweDNhXSwgWzE3LCA2LCAyLCAweDNiXSwgWzIxLCA2LCAzLCAweDNjXSwgWzI5LCA2LCA0LCAweDNkXSwgWzQ1LCA2LCA1LCAweDNlXSwgWzc3LCA3LCA2LCAweDdlXSwgWzE0MSwgNywgMzIsIDB4N2ZdXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDE0OgogICAgICBsaW5lcyA9IFtbLTIsIDMsIDAsIDB4NF0sIFstMSwgMywgMCwgMHg1XSwgWzAsIDEsIDAsIDB4MF0sIFsxLCAzLCAwLCAweDZdLCBbMiwgMywgMCwgMHg3XV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxNToKICAgICAgbGluZXMgPSBbWy0yNCwgNywgNCwgMHg3Y10sIFstOCwgNiwgMiwgMHgzY10sIFstNCwgNSwgMSwgMHgxY10sIFstMiwgNCwgMCwgMHhjXSwgWy0xLCAzLCAwLCAweDRdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDMsIDAsIDB4NV0sIFsyLCA0LCAwLCAweGRdLCBbMywgNSwgMSwgMHgxZF0sIFs1LCA2LCAyLCAweDNkXSwgWzksIDcsIDQsIDB4N2RdLCBbLTI1LCA3LCAzMiwgMHg3ZSwgImxvd2VyIl0sIFsyNSwgNywgMzIsIDB4N2ZdXTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc3RhbmRhcmQgdGFibGUgQi4ke251bWJlcn0gZG9lcyBub3QgZXhpc3RgKTsKICB9CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgbGluZXNbaV0gPSBuZXcgSHVmZm1hbkxpbmUobGluZXNbaV0pOwogIH0KICB0YWJsZSA9IG5ldyBIdWZmbWFuVGFibGUobGluZXMsIHRydWUpOwogIHN0YW5kYXJkVGFibGVzQ2FjaGVbbnVtYmVyXSA9IHRhYmxlOwogIHJldHVybiB0YWJsZTsKfQpjbGFzcyBSZWFkZXIgewogIGNvbnN0cnVjdG9yKGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CiAgICB0aGlzLmVuZCA9IGVuZDsKICAgIHRoaXMucG9zaXRpb24gPSBzdGFydDsKICAgIHRoaXMuc2hpZnQgPSAtMTsKICAgIHRoaXMuY3VycmVudEJ5dGUgPSAwOwogIH0KICByZWFkQml0KCkgewogICAgaWYgKHRoaXMuc2hpZnQgPCAwKSB7CiAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImVuZCBvZiBkYXRhIHdoaWxlIHJlYWRpbmcgYml0Iik7CiAgICAgIH0KICAgICAgdGhpcy5jdXJyZW50Qnl0ZSA9IHRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdOwogICAgICB0aGlzLnNoaWZ0ID0gNzsKICAgIH0KICAgIGNvbnN0IGJpdCA9IHRoaXMuY3VycmVudEJ5dGUgPj4gdGhpcy5zaGlmdCAmIDE7CiAgICB0aGlzLnNoaWZ0LS07CiAgICByZXR1cm4gYml0OwogIH0KICByZWFkQml0cyhudW1CaXRzKSB7CiAgICBsZXQgcmVzdWx0ID0gMCwKICAgICAgaTsKICAgIGZvciAoaSA9IG51bUJpdHMgLSAxOyBpID49IDA7IGktLSkgewogICAgICByZXN1bHQgfD0gdGhpcy5yZWFkQml0KCkgPDwgaTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGJ5dGVBbGlnbigpIHsKICAgIHRoaXMuc2hpZnQgPSAtMTsKICB9CiAgbmV4dCgpIHsKICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXTsKICB9Cn0KZnVuY3Rpb24gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpIHsKICBsZXQgY3VycmVudEluZGV4ID0gMDsKICBmb3IgKGxldCBpID0gMCwgaWkgPSByZWZlcnJlZFRvLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHRhYmxlID0gY3VzdG9tVGFibGVzW3JlZmVycmVkVG9baV1dOwogICAgaWYgKHRhYmxlKSB7CiAgICAgIGlmIChpbmRleCA9PT0gY3VycmVudEluZGV4KSB7CiAgICAgICAgcmV0dXJuIHRhYmxlOwogICAgICB9CiAgICAgIGN1cnJlbnRJbmRleCsrOwogICAgfQogIH0KICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiY2FuJ3QgZmluZCBjdXN0b20gSHVmZm1hbiB0YWJsZSIpOwp9CmZ1bmN0aW9uIGdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzKHRleHRSZWdpb24sIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcywgbnVtYmVyT2ZTeW1ib2xzLCByZWFkZXIpIHsKICBjb25zdCBjb2RlcyA9IFtdOwogIGZvciAobGV0IGkgPSAwOyBpIDw9IDM0OyBpKyspIHsKICAgIGNvbnN0IGNvZGVMZW5ndGggPSByZWFkZXIucmVhZEJpdHMoNCk7CiAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTsKICB9CiAgY29uc3QgcnVuQ29kZXNUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKICBjb2Rlcy5sZW5ndGggPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZTeW1ib2xzOykgewogICAgY29uc3QgY29kZUxlbmd0aCA9IHJ1bkNvZGVzVGFibGUuZGVjb2RlKHJlYWRlcik7CiAgICBpZiAoY29kZUxlbmd0aCA+PSAzMikgewogICAgICBsZXQgcmVwZWF0ZWRMZW5ndGgsIG51bWJlck9mUmVwZWF0cywgajsKICAgICAgc3dpdGNoIChjb2RlTGVuZ3RoKSB7CiAgICAgICAgY2FzZSAzMjoKICAgICAgICAgIGlmIChpID09PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJubyBwcmV2aW91cyB2YWx1ZSBpbiBzeW1ib2wgSUQgdGFibGUiKTsKICAgICAgICAgIH0KICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cygyKSArIDM7CiAgICAgICAgICByZXBlYXRlZExlbmd0aCA9IGNvZGVzW2kgLSAxXS5wcmVmaXhMZW5ndGg7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDMzOgogICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDMpICsgMzsKICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoNykgKyAxMTsKICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBjb2RlIGxlbmd0aCBpbiBzeW1ib2wgSUQgdGFibGUiKTsKICAgICAgfQogICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyT2ZSZXBlYXRzOyBqKyspIHsKICAgICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgcmVwZWF0ZWRMZW5ndGgsIDAsIDBdKSk7CiAgICAgICAgaSsrOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTsKICAgICAgaSsrOwogICAgfQogIH0KICByZWFkZXIuYnl0ZUFsaWduKCk7CiAgY29uc3Qgc3ltYm9sSURUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKICBsZXQgY3VzdG9tSW5kZXggPSAwLAogICAgdGFibGVGaXJzdFMsCiAgICB0YWJsZURlbHRhUywKICAgIHRhYmxlRGVsdGFUOwogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRlMpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgdGFibGVGaXJzdFMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkZTICsgNik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZUZpcnN0UyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgICAgY3VzdG9tSW5kZXgrKzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yIik7CiAgfQogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFMpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgdGFibGVEZWx0YVMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRTICsgOCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZURlbHRhUyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgICAgY3VzdG9tSW5kZXgrKzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERTIHNlbGVjdG9yIik7CiAgfQogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFQpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgdGFibGVEZWx0YVQgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRUICsgMTEpOwogICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgdGFibGVEZWx0YVQgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVCBzZWxlY3RvciIpOwogIH0KICBpZiAodGV4dFJlZ2lvbi5yZWZpbmVtZW50KSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICByZXR1cm4gewogICAgc3ltYm9sSURUYWJsZSwKICAgIHRhYmxlRmlyc3RTLAogICAgdGFibGVEZWx0YVMsCiAgICB0YWJsZURlbHRhVAogIH07Cn0KZnVuY3Rpb24gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKSB7CiAgbGV0IGN1c3RvbUluZGV4ID0gMCwKICAgIHRhYmxlRGVsdGFIZWlnaHQsCiAgICB0YWJsZURlbHRhV2lkdGg7CiAgc3dpdGNoIChkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IgKyA0KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6CiAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBESCBzZWxlY3RvciIpOwogIH0KICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgdGFibGVEZWx0YVdpZHRoID0gZ2V0U3RhbmRhcmRUYWJsZShkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yICsgMik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZURlbHRhV2lkdGggPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVyBzZWxlY3RvciIpOwogIH0KICBsZXQgdGFibGVCaXRtYXBTaXplLCB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlczsKICBpZiAoZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IpIHsKICAgIHRhYmxlQml0bWFwU2l6ZSA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgIGN1c3RvbUluZGV4Kys7CiAgfSBlbHNlIHsKICAgIHRhYmxlQml0bWFwU2l6ZSA9IGdldFN0YW5kYXJkVGFibGUoMSk7CiAgfQogIGlmIChkaWN0aW9uYXJ5LmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3IpIHsKICAgIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOwogIH0gZWxzZSB7CiAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldFN0YW5kYXJkVGFibGUoMSk7CiAgfQogIHJldHVybiB7CiAgICB0YWJsZURlbHRhSGVpZ2h0LAogICAgdGFibGVEZWx0YVdpZHRoLAogICAgdGFibGVCaXRtYXBTaXplLAogICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMKICB9Owp9CmZ1bmN0aW9uIHJlYWRVbmNvbXByZXNzZWRCaXRtYXAocmVhZGVyLCB3aWR0aCwgaGVpZ2h0KSB7CiAgY29uc3QgYml0bWFwID0gW107CiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOwogICAgYml0bWFwLnB1c2gocm93KTsKICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICByb3dbeF0gPSByZWFkZXIucmVhZEJpdCgpOwogICAgfQogICAgcmVhZGVyLmJ5dGVBbGlnbigpOwogIH0KICByZXR1cm4gYml0bWFwOwp9CmZ1bmN0aW9uIGRlY29kZU1NUkJpdG1hcChpbnB1dCwgd2lkdGgsIGhlaWdodCwgZW5kT2ZCbG9jaykgewogIGNvbnN0IHBhcmFtcyA9IHsKICAgIEs6IC0xLAogICAgQ29sdW1uczogd2lkdGgsCiAgICBSb3dzOiBoZWlnaHQsCiAgICBCbGFja0lzMTogdHJ1ZSwKICAgIEVuZE9mQmxvY2s6IGVuZE9mQmxvY2sKICB9OwogIGNvbnN0IGRlY29kZXIgPSBuZXcgQ0NJVFRGYXhEZWNvZGVyKGlucHV0LCBwYXJhbXMpOwogIGNvbnN0IGJpdG1hcCA9IFtdOwogIGxldCBjdXJyZW50Qnl0ZSwKICAgIGVvZiA9IGZhbHNlOwogIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgIGNvbnN0IHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICAgIGJpdG1hcC5wdXNoKHJvdyk7CiAgICBsZXQgc2hpZnQgPSAtMTsKICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICBpZiAoc2hpZnQgPCAwKSB7CiAgICAgICAgY3VycmVudEJ5dGUgPSBkZWNvZGVyLnJlYWROZXh0Q2hhcigpOwogICAgICAgIGlmIChjdXJyZW50Qnl0ZSA9PT0gLTEpIHsKICAgICAgICAgIGN1cnJlbnRCeXRlID0gMDsKICAgICAgICAgIGVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHNoaWZ0ID0gNzsKICAgICAgfQogICAgICByb3dbeF0gPSBjdXJyZW50Qnl0ZSA+PiBzaGlmdCAmIDE7CiAgICAgIHNoaWZ0LS07CiAgICB9CiAgfQogIGlmIChlbmRPZkJsb2NrICYmICFlb2YpIHsKICAgIGNvbnN0IGxvb2tGb3JFT0ZMaW1pdCA9IDU7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvb2tGb3JFT0ZMaW1pdDsgaSsrKSB7CiAgICAgIGlmIChkZWNvZGVyLnJlYWROZXh0Q2hhcigpID09PSAtMSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KY2xhc3MgSmJpZzJJbWFnZSB7CiAgcGFyc2VDaHVua3MoY2h1bmtzKSB7CiAgICByZXR1cm4gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpOwogIH0KICBwYXJzZShkYXRhKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogSmJpZzJJbWFnZS5wYXJzZSIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvamJpZzJfc3RyZWFtLmpzCgoKCgoKY2xhc3MgSmJpZzJTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcykgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLmRpY3QgPSBzdHJlYW0uZGljdDsKICAgIHRoaXMubWF5YmVMZW5ndGggPSBtYXliZUxlbmd0aDsKICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogIH0KICBnZXQgYnl0ZXMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJieXRlcyIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTsKICB9CiAgZW5zdXJlQnVmZmVyKHJlcXVlc3RlZCkge30KICByZWFkQmxvY2soKSB7CiAgICB0aGlzLmRlY29kZUltYWdlKCk7CiAgfQogIGRlY29kZUltYWdlKGJ5dGVzKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogICAgfQogICAgYnl0ZXMgfHw9IHRoaXMuYnl0ZXM7CiAgICBjb25zdCBqYmlnMkltYWdlID0gbmV3IEpiaWcySW1hZ2UoKTsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgaWYgKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBnbG9iYWxzU3RyZWFtID0gdGhpcy5wYXJhbXMuZ2V0KCJKQklHMkdsb2JhbHMiKTsKICAgICAgaWYgKGdsb2JhbHNTdHJlYW0gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgY29uc3QgZ2xvYmFscyA9IGdsb2JhbHNTdHJlYW0uZ2V0Qnl0ZXMoKTsKICAgICAgICBjaHVua3MucHVzaCh7CiAgICAgICAgICBkYXRhOiBnbG9iYWxzLAogICAgICAgICAgc3RhcnQ6IDAsCiAgICAgICAgICBlbmQ6IGdsb2JhbHMubGVuZ3RoCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGNodW5rcy5wdXNoKHsKICAgICAgZGF0YTogYnl0ZXMsCiAgICAgIHN0YXJ0OiAwLAogICAgICBlbmQ6IGJ5dGVzLmxlbmd0aAogICAgfSk7CiAgICBjb25zdCBkYXRhID0gamJpZzJJbWFnZS5wYXJzZUNodW5rcyhjaHVua3MpOwogICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHsKICAgICAgZGF0YVtpXSBePSAweGZmOwogICAgfQogICAgdGhpcy5idWZmZXIgPSBkYXRhOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBkYXRhTGVuZ3RoOwogICAgdGhpcy5lb2YgPSB0cnVlOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogIH0KICBnZXQgY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIoKSB7CiAgICByZXR1cm4gdGhpcy5zdHJlYW0uaXNBc3luYzsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2pweF9zdHJlYW0uanMKCgoKY2xhc3MgSnB4U3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5kaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICB9CiAgZ2V0IGJ5dGVzKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYnl0ZXMiLCB0aGlzLnN0cmVhbS5nZXRCeXRlcyh0aGlzLm1heWJlTGVuZ3RoKSk7CiAgfQogIGVuc3VyZUJ1ZmZlcihyZXF1ZXN0ZWQpIHt9CiAgcmVhZEJsb2NrKGRlY29kZXJPcHRpb25zKSB7CiAgICB1bnJlYWNoYWJsZSgiSnB4U3RyZWFtLnJlYWRCbG9jayIpOwogIH0KICBnZXQgaXNBc3luY0RlY29kZXIoKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgYXN5bmMgZGVjb2RlSW1hZ2UoYnl0ZXMsIGRlY29kZXJPcHRpb25zKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogICAgfQogICAgYnl0ZXMgfHw9IHRoaXMuYnl0ZXM7CiAgICB0aGlzLmJ1ZmZlciA9IGF3YWl0IEpweEltYWdlLmRlY29kZShieXRlcywgZGVjb2Rlck9wdGlvbnMpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7CiAgICB0aGlzLmVvZiA9IHRydWU7CiAgICByZXR1cm4gdGhpcy5idWZmZXI7CiAgfQogIGdldCBjYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcigpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbS5pc0FzeW5jOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvbHp3X3N0cmVhbS5qcwoKY2xhc3MgTFpXU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoLCBlYXJseUNoYW5nZSkgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHIgPSBzdHI7CiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKICAgIHRoaXMuY2FjaGVkRGF0YSA9IDA7CiAgICB0aGlzLmJpdHNDYWNoZWQgPSAwOwogICAgY29uc3QgbWF4THp3RGljdGlvbmFyeVNpemUgPSA0MDk2OwogICAgY29uc3QgbHp3U3RhdGUgPSB7CiAgICAgIGVhcmx5Q2hhbmdlLAogICAgICBjb2RlTGVuZ3RoOiA5LAogICAgICBuZXh0Q29kZTogMjU4LAogICAgICBkaWN0aW9uYXJ5VmFsdWVzOiBuZXcgVWludDhBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksCiAgICAgIGRpY3Rpb25hcnlMZW5ndGhzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAogICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzOiBuZXcgVWludDE2QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAogICAgICBjdXJyZW50U2VxdWVuY2U6IG5ldyBVaW50OEFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSwKICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoOiAwCiAgICB9OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkgewogICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5VmFsdWVzW2ldID0gaTsKICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeUxlbmd0aHNbaV0gPSAxOwogICAgfQogICAgdGhpcy5sendTdGF0ZSA9IGx6d1N0YXRlOwogIH0KICByZWFkQml0cyhuKSB7CiAgICBsZXQgYml0c0NhY2hlZCA9IHRoaXMuYml0c0NhY2hlZDsKICAgIGxldCBjYWNoZWREYXRhID0gdGhpcy5jYWNoZWREYXRhOwogICAgd2hpbGUgKGJpdHNDYWNoZWQgPCBuKSB7CiAgICAgIGNvbnN0IGMgPSB0aGlzLnN0ci5nZXRCeXRlKCk7CiAgICAgIGlmIChjID09PSAtMSkgewogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjYWNoZWREYXRhID0gY2FjaGVkRGF0YSA8PCA4IHwgYzsKICAgICAgYml0c0NhY2hlZCArPSA4OwogICAgfQogICAgdGhpcy5iaXRzQ2FjaGVkID0gYml0c0NhY2hlZCAtPSBuOwogICAgdGhpcy5jYWNoZWREYXRhID0gY2FjaGVkRGF0YTsKICAgIHRoaXMubGFzdENvZGUgPSBudWxsOwogICAgcmV0dXJuIGNhY2hlZERhdGEgPj4+IGJpdHNDYWNoZWQgJiAoMSA8PCBuKSAtIDE7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGNvbnN0IGJsb2NrU2l6ZSA9IDUxMiwKICAgICAgZGVjb2RlZFNpemVEZWx0YSA9IGJsb2NrU2l6ZTsKICAgIGxldCBlc3RpbWF0ZWREZWNvZGVkU2l6ZSA9IGJsb2NrU2l6ZSAqIDI7CiAgICBsZXQgaSwgaiwgcTsKICAgIGNvbnN0IGx6d1N0YXRlID0gdGhpcy5sendTdGF0ZTsKICAgIGlmICghbHp3U3RhdGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZWFybHlDaGFuZ2UgPSBsendTdGF0ZS5lYXJseUNoYW5nZTsKICAgIGxldCBuZXh0Q29kZSA9IGx6d1N0YXRlLm5leHRDb2RlOwogICAgY29uc3QgZGljdGlvbmFyeVZhbHVlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlWYWx1ZXM7CiAgICBjb25zdCBkaWN0aW9uYXJ5TGVuZ3RocyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlMZW5ndGhzOwogICAgY29uc3QgZGljdGlvbmFyeVByZXZDb2RlcyA9IGx6d1N0YXRlLmRpY3Rpb25hcnlQcmV2Q29kZXM7CiAgICBsZXQgY29kZUxlbmd0aCA9IGx6d1N0YXRlLmNvZGVMZW5ndGg7CiAgICBsZXQgcHJldkNvZGUgPSBsendTdGF0ZS5wcmV2Q29kZTsKICAgIGNvbnN0IGN1cnJlbnRTZXF1ZW5jZSA9IGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZTsKICAgIGxldCBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGg7CiAgICBsZXQgZGVjb2RlZExlbmd0aCA9IDA7CiAgICBsZXQgY3VycmVudEJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgbGV0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpOwogICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7CiAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLnJlYWRCaXRzKGNvZGVMZW5ndGgpOwogICAgICBjb25zdCBoYXNQcmV2ID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoID4gMDsKICAgICAgaWYgKGNvZGUgPCAyNTYpIHsKICAgICAgICBjdXJyZW50U2VxdWVuY2VbMF0gPSBjb2RlOwogICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IDE7CiAgICAgIH0gZWxzZSBpZiAoY29kZSA+PSAyNTgpIHsKICAgICAgICBpZiAoY29kZSA8IG5leHRDb2RlKSB7CiAgICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSBkaWN0aW9uYXJ5TGVuZ3Roc1tjb2RlXTsKICAgICAgICAgIGZvciAoaiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCAtIDEsIHEgPSBjb2RlOyBqID49IDA7IGotLSkgewogICAgICAgICAgICBjdXJyZW50U2VxdWVuY2Vbal0gPSBkaWN0aW9uYXJ5VmFsdWVzW3FdOwogICAgICAgICAgICBxID0gZGljdGlvbmFyeVByZXZDb2Rlc1txXTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFNlcXVlbmNlW2N1cnJlbnRTZXF1ZW5jZUxlbmd0aCsrXSA9IGN1cnJlbnRTZXF1ZW5jZVswXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMjU2KSB7CiAgICAgICAgY29kZUxlbmd0aCA9IDk7CiAgICAgICAgbmV4dENvZGUgPSAyNTg7CiAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gMDsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgZGVsZXRlIHRoaXMubHp3U3RhdGU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGhhc1ByZXYpIHsKICAgICAgICBkaWN0aW9uYXJ5UHJldkNvZGVzW25leHRDb2RlXSA9IHByZXZDb2RlOwogICAgICAgIGRpY3Rpb25hcnlMZW5ndGhzW25leHRDb2RlXSA9IGRpY3Rpb25hcnlMZW5ndGhzW3ByZXZDb2RlXSArIDE7CiAgICAgICAgZGljdGlvbmFyeVZhbHVlc1tuZXh0Q29kZV0gPSBjdXJyZW50U2VxdWVuY2VbMF07CiAgICAgICAgbmV4dENvZGUrKzsKICAgICAgICBjb2RlTGVuZ3RoID0gbmV4dENvZGUgKyBlYXJseUNoYW5nZSAmIG5leHRDb2RlICsgZWFybHlDaGFuZ2UgLSAxID8gY29kZUxlbmd0aCA6IE1hdGgubWluKE1hdGgubG9nKG5leHRDb2RlICsgZWFybHlDaGFuZ2UpIC8gMC42OTMxNDcxODA1NTk5NDUzICsgMSwgMTIpIHwgMDsKICAgICAgfQogICAgICBwcmV2Q29kZSA9IGNvZGU7CiAgICAgIGRlY29kZWRMZW5ndGggKz0gY3VycmVudFNlcXVlbmNlTGVuZ3RoOwogICAgICBpZiAoZXN0aW1hdGVkRGVjb2RlZFNpemUgPCBkZWNvZGVkTGVuZ3RoKSB7CiAgICAgICAgZG8gewogICAgICAgICAgZXN0aW1hdGVkRGVjb2RlZFNpemUgKz0gZGVjb2RlZFNpemVEZWx0YTsKICAgICAgICB9IHdoaWxlIChlc3RpbWF0ZWREZWNvZGVkU2l6ZSA8IGRlY29kZWRMZW5ndGgpOwogICAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgZXN0aW1hdGVkRGVjb2RlZFNpemUpOwogICAgICB9CiAgICAgIGZvciAoaiA9IDA7IGogPCBjdXJyZW50U2VxdWVuY2VMZW5ndGg7IGorKykgewogICAgICAgIGJ1ZmZlcltjdXJyZW50QnVmZmVyTGVuZ3RoKytdID0gY3VycmVudFNlcXVlbmNlW2pdOwogICAgICB9CiAgICB9CiAgICBsendTdGF0ZS5uZXh0Q29kZSA9IG5leHRDb2RlOwogICAgbHp3U3RhdGUuY29kZUxlbmd0aCA9IGNvZGVMZW5ndGg7CiAgICBsendTdGF0ZS5wcmV2Q29kZSA9IHByZXZDb2RlOwogICAgbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBjdXJyZW50QnVmZmVyTGVuZ3RoOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvcHJlZGljdG9yX3N0cmVhbS5qcwoKCgpjbGFzcyBQcmVkaWN0b3JTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgsIHBhcmFtcykgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgaWYgKCEocGFyYW1zIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIHN0cjsKICAgIH0KICAgIGNvbnN0IHByZWRpY3RvciA9IHRoaXMucHJlZGljdG9yID0gcGFyYW1zLmdldCgiUHJlZGljdG9yIikgfHwgMTsKICAgIGlmIChwcmVkaWN0b3IgPD0gMSkgewogICAgICByZXR1cm4gc3RyOwogICAgfQogICAgaWYgKHByZWRpY3RvciAhPT0gMiAmJiAocHJlZGljdG9yIDwgMTAgfHwgcHJlZGljdG9yID4gMTUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAke3ByZWRpY3Rvcn1gKTsKICAgIH0KICAgIHRoaXMucmVhZEJsb2NrID0gcHJlZGljdG9yID09PSAyID8gdGhpcy5yZWFkQmxvY2tUaWZmIDogdGhpcy5yZWFkQmxvY2tQbmc7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnMgPSBwYXJhbXMuZ2V0KCJDb2xvcnMiKSB8fCAxOwogICAgY29uc3QgYml0cyA9IHRoaXMuYml0cyA9IHBhcmFtcy5nZXQoIkJQQyIsICJCaXRzUGVyQ29tcG9uZW50IikgfHwgODsKICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMgPSBwYXJhbXMuZ2V0KCJDb2x1bW5zIikgfHwgMTsKICAgIHRoaXMucGl4Qnl0ZXMgPSBjb2xvcnMgKiBiaXRzICsgNyA+PiAzOwogICAgdGhpcy5yb3dCeXRlcyA9IGNvbHVtbnMgKiBjb2xvcnMgKiBiaXRzICsgNyA+PiAzOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHJlYWRCbG9ja1RpZmYoKSB7CiAgICBjb25zdCByb3dCeXRlcyA9IHRoaXMucm93Qnl0ZXM7CiAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIHJvd0J5dGVzKTsKICAgIGNvbnN0IGJpdHMgPSB0aGlzLmJpdHM7CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9yczsKICAgIGNvbnN0IHJhd0J5dGVzID0gdGhpcy5zdHIuZ2V0Qnl0ZXMocm93Qnl0ZXMpOwogICAgdGhpcy5lb2YgPSAhcmF3Qnl0ZXMubGVuZ3RoOwogICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBpbmJ1ZiA9IDAsCiAgICAgIG91dGJ1ZiA9IDA7CiAgICBsZXQgaW5iaXRzID0gMCwKICAgICAgb3V0Yml0cyA9IDA7CiAgICBsZXQgcG9zID0gYnVmZmVyTGVuZ3RoOwogICAgbGV0IGk7CiAgICBpZiAoYml0cyA9PT0gMSAmJiBjb2xvcnMgPT09IDEpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKICAgICAgICBsZXQgYyA9IHJhd0J5dGVzW2ldIF4gaW5idWY7CiAgICAgICAgYyBePSBjID4+IDE7CiAgICAgICAgYyBePSBjID4+IDI7CiAgICAgICAgYyBePSBjID4+IDQ7CiAgICAgICAgaW5idWYgPSAoYyAmIDEpIDw8IDc7CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IGM7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYml0cyA9PT0gOCkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyArK2kpIHsKICAgICAgICBidWZmZXJbcG9zKytdID0gcmF3Qnl0ZXNbaV07CiAgICAgIH0KICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgYnVmZmVyW3Bvc10gPSBidWZmZXJbcG9zIC0gY29sb3JzXSArIHJhd0J5dGVzW2ldOwogICAgICAgIHBvcysrOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGJpdHMgPT09IDE2KSB7CiAgICAgIGNvbnN0IGJ5dGVzUGVyUGl4ZWwgPSBjb2xvcnMgKiAyOwogICAgICBmb3IgKGkgPSAwOyBpIDwgYnl0ZXNQZXJQaXhlbDsgKytpKSB7CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHJhd0J5dGVzW2ldOwogICAgICB9CiAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7IGkgKz0gMikgewogICAgICAgIGNvbnN0IHN1bSA9ICgocmF3Qnl0ZXNbaV0gJiAweGZmKSA8PCA4KSArIChyYXdCeXRlc1tpICsgMV0gJiAweGZmKSArICgoYnVmZmVyW3BvcyAtIGJ5dGVzUGVyUGl4ZWxdICYgMHhmZikgPDwgOCkgKyAoYnVmZmVyW3BvcyAtIGJ5dGVzUGVyUGl4ZWwgKyAxXSAmIDB4ZmYpOwogICAgICAgIGJ1ZmZlcltwb3MrK10gPSBzdW0gPj4gOCAmIDB4ZmY7CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHN1bSAmIDB4ZmY7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGNvbXBBcnJheSA9IG5ldyBVaW50OEFycmF5KGNvbG9ycyArIDEpOwogICAgICBjb25zdCBiaXRNYXNrID0gKDEgPDwgYml0cykgLSAxOwogICAgICBsZXQgaiA9IDAsCiAgICAgICAgayA9IGJ1ZmZlckxlbmd0aDsKICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1uczsKICAgICAgZm9yIChpID0gMDsgaSA8IGNvbHVtbnM7ICsraSkgewogICAgICAgIGZvciAobGV0IGtrID0gMDsga2sgPCBjb2xvcnM7ICsra2spIHsKICAgICAgICAgIGlmIChpbmJpdHMgPCBiaXRzKSB7CiAgICAgICAgICAgIGluYnVmID0gaW5idWYgPDwgOCB8IHJhd0J5dGVzW2orK10gJiAweGZmOwogICAgICAgICAgICBpbmJpdHMgKz0gODsKICAgICAgICAgIH0KICAgICAgICAgIGNvbXBBcnJheVtra10gPSBjb21wQXJyYXlba2tdICsgKGluYnVmID4+IGluYml0cyAtIGJpdHMpICYgYml0TWFzazsKICAgICAgICAgIGluYml0cyAtPSBiaXRzOwogICAgICAgICAgb3V0YnVmID0gb3V0YnVmIDw8IGJpdHMgfCBjb21wQXJyYXlba2tdOwogICAgICAgICAgb3V0Yml0cyArPSBiaXRzOwogICAgICAgICAgaWYgKG91dGJpdHMgPj0gOCkgewogICAgICAgICAgICBidWZmZXJbaysrXSA9IG91dGJ1ZiA+PiBvdXRiaXRzIC0gOCAmIDB4ZmY7CiAgICAgICAgICAgIG91dGJpdHMgLT0gODsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG91dGJpdHMgPiAwKSB7CiAgICAgICAgYnVmZmVyW2srK10gPSAob3V0YnVmIDw8IDggLSBvdXRiaXRzKSArIChpbmJ1ZiAmICgxIDw8IDggLSBvdXRiaXRzKSAtIDEpOwogICAgICB9CiAgICB9CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlczsKICB9CiAgcmVhZEJsb2NrUG5nKCkgewogICAgY29uc3Qgcm93Qnl0ZXMgPSB0aGlzLnJvd0J5dGVzOwogICAgY29uc3QgcGl4Qnl0ZXMgPSB0aGlzLnBpeEJ5dGVzOwogICAgY29uc3QgcHJlZGljdG9yID0gdGhpcy5zdHIuZ2V0Qnl0ZSgpOwogICAgY29uc3QgcmF3Qnl0ZXMgPSB0aGlzLnN0ci5nZXRCeXRlcyhyb3dCeXRlcyk7CiAgICB0aGlzLmVvZiA9ICFyYXdCeXRlcy5sZW5ndGg7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyByb3dCeXRlcyk7CiAgICBsZXQgcHJldlJvdyA9IGJ1ZmZlci5zdWJhcnJheShidWZmZXJMZW5ndGggLSByb3dCeXRlcywgYnVmZmVyTGVuZ3RoKTsKICAgIGlmIChwcmV2Um93Lmxlbmd0aCA9PT0gMCkgewogICAgICBwcmV2Um93ID0gbmV3IFVpbnQ4QXJyYXkocm93Qnl0ZXMpOwogICAgfQogICAgbGV0IGksCiAgICAgIGogPSBidWZmZXJMZW5ndGgsCiAgICAgIHVwLAogICAgICBjOwogICAgc3dpdGNoIChwcmVkaWN0b3IpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaisrXSA9IHJhd0J5dGVzW2ldOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaisrXSA9IHJhd0J5dGVzW2ldOwogICAgICAgIH0KICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltqXSA9IGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdICsgcmF3Qnl0ZXNbaV0gJiAweGZmOwogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaisrXSA9IHByZXZSb3dbaV0gKyByYXdCeXRlc1tpXSAmIDB4ZmY7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeEJ5dGVzOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltqKytdID0gKHByZXZSb3dbaV0gPj4gMSkgKyByYXdCeXRlc1tpXTsKICAgICAgICB9CiAgICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbal0gPSAocHJldlJvd1tpXSArIGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdID4+IDEpICsgcmF3Qnl0ZXNbaV0gJiAweGZmOwogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSA0OgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7CiAgICAgICAgICB1cCA9IHByZXZSb3dbaV07CiAgICAgICAgICBjID0gcmF3Qnl0ZXNbaV07CiAgICAgICAgICBidWZmZXJbaisrXSA9IHVwICsgYzsKICAgICAgICB9CiAgICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICB1cCA9IHByZXZSb3dbaV07CiAgICAgICAgICBjb25zdCB1cExlZnQgPSBwcmV2Um93W2kgLSBwaXhCeXRlc107CiAgICAgICAgICBjb25zdCBsZWZ0ID0gYnVmZmVyW2ogLSBwaXhCeXRlc107CiAgICAgICAgICBjb25zdCBwID0gbGVmdCArIHVwIC0gdXBMZWZ0OwogICAgICAgICAgbGV0IHBhID0gcCAtIGxlZnQ7CiAgICAgICAgICBpZiAocGEgPCAwKSB7CiAgICAgICAgICAgIHBhID0gLXBhOwogICAgICAgICAgfQogICAgICAgICAgbGV0IHBiID0gcCAtIHVwOwogICAgICAgICAgaWYgKHBiIDwgMCkgewogICAgICAgICAgICBwYiA9IC1wYjsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBwYyA9IHAgLSB1cExlZnQ7CiAgICAgICAgICBpZiAocGMgPCAwKSB7CiAgICAgICAgICAgIHBjID0gLXBjOwogICAgICAgICAgfQogICAgICAgICAgYyA9IHJhd0J5dGVzW2ldOwogICAgICAgICAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKSB7CiAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gbGVmdCArIGM7CiAgICAgICAgICB9IGVsc2UgaWYgKHBiIDw9IHBjKSB7CiAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gdXAgKyBjOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVmZmVyW2orK10gPSB1cExlZnQgKyBjOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHByZWRpY3RvcjogJHtwcmVkaWN0b3J9YCk7CiAgICB9CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSByb3dCeXRlczsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3J1bl9sZW5ndGhfc3RyZWFtLmpzCgpjbGFzcyBSdW5MZW5ndGhTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGNvbnN0IHJlcGVhdEhlYWRlciA9IHRoaXMuc3RyLmdldEJ5dGVzKDIpOwogICAgaWYgKCFyZXBlYXRIZWFkZXIgfHwgcmVwZWF0SGVhZGVyLmxlbmd0aCA8IDIgfHwgcmVwZWF0SGVhZGVyWzBdID09PSAxMjgpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgYnVmZmVyOwogICAgbGV0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgbGV0IG4gPSByZXBlYXRIZWFkZXJbMF07CiAgICBpZiAobiA8IDEyOCkgewogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuICsgMSk7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSByZXBlYXRIZWFkZXJbMV07CiAgICAgIGlmIChuID4gMCkgewogICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc3RyLmdldEJ5dGVzKG4pOwogICAgICAgIGJ1ZmZlci5zZXQoc291cmNlLCBidWZmZXJMZW5ndGgpOwogICAgICAgIGJ1ZmZlckxlbmd0aCArPSBuOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBuID0gMjU3IC0gbjsKICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbiArIDEpOwogICAgICBidWZmZXIuZmlsbChyZXBlYXRIZWFkZXJbMV0sIGJ1ZmZlckxlbmd0aCwgYnVmZmVyTGVuZ3RoICsgbik7CiAgICAgIGJ1ZmZlckxlbmd0aCArPSBuOwogICAgfQogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9wYXJzZXIuanMKCgoKCgoKCgoKCgoKCgpjb25zdCBNQVhfTEVOR1RIX1RPX0NBQ0hFID0gMTAwMDsKZnVuY3Rpb24gZ2V0SW5saW5lSW1hZ2VDYWNoZUtleShieXRlcykgewogIGNvbnN0IHN0ckJ1ZiA9IFtdLAogICAgaWkgPSBieXRlcy5sZW5ndGg7CiAgbGV0IGkgPSAwOwogIHdoaWxlIChpIDwgaWkgLSAxKSB7CiAgICBzdHJCdWYucHVzaChieXRlc1tpKytdIDw8IDggfCBieXRlc1tpKytdKTsKICB9CiAgaWYgKGkgPCBpaSkgewogICAgc3RyQnVmLnB1c2goYnl0ZXNbaV0pOwogIH0KICByZXR1cm4gaWkgKyAiXyIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHN0ckJ1Zik7Cn0KY2xhc3MgUGFyc2VyIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBsZXhlciwKICAgIHhyZWYsCiAgICBhbGxvd1N0cmVhbXMgPSBmYWxzZSwKICAgIHJlY292ZXJ5TW9kZSA9IGZhbHNlCiAgfSkgewogICAgdGhpcy5sZXhlciA9IGxleGVyOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuYWxsb3dTdHJlYW1zID0gYWxsb3dTdHJlYW1zOwogICAgdGhpcy5yZWNvdmVyeU1vZGUgPSByZWNvdmVyeU1vZGU7CiAgICB0aGlzLmltYWdlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5faW1hZ2VJZCA9IDA7CiAgICB0aGlzLnJlZmlsbCgpOwogIH0KICByZWZpbGwoKSB7CiAgICB0aGlzLmJ1ZjEgPSB0aGlzLmxleGVyLmdldE9iaigpOwogICAgdGhpcy5idWYyID0gdGhpcy5sZXhlci5nZXRPYmooKTsKICB9CiAgc2hpZnQoKSB7CiAgICBpZiAodGhpcy5idWYyIGluc3RhbmNlb2YgQ21kICYmIHRoaXMuYnVmMi5jbWQgPT09ICJJRCIpIHsKICAgICAgdGhpcy5idWYxID0gdGhpcy5idWYyOwogICAgICB0aGlzLmJ1ZjIgPSBudWxsOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5idWYxID0gdGhpcy5idWYyOwogICAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpOwogICAgfQogIH0KICB0cnlTaGlmdCgpIHsKICAgIHRyeSB7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgZ2V0T2JqKGNpcGhlclRyYW5zZm9ybSA9IG51bGwpIHsKICAgIGNvbnN0IGJ1ZjEgPSB0aGlzLmJ1ZjE7CiAgICB0aGlzLnNoaWZ0KCk7CiAgICBpZiAoYnVmMSBpbnN0YW5jZW9mIENtZCkgewogICAgICBzd2l0Y2ggKGJ1ZjEuY21kKSB7CiAgICAgICAgY2FzZSAiQkkiOgogICAgICAgICAgcmV0dXJuIHRoaXMubWFrZUlubGluZUltYWdlKGNpcGhlclRyYW5zZm9ybSk7CiAgICAgICAgY2FzZSAiWyI6CiAgICAgICAgICBjb25zdCBhcnJheSA9IFtdOwogICAgICAgICAgd2hpbGUgKCFpc0NtZCh0aGlzLmJ1ZjEsICJdIikgJiYgdGhpcy5idWYxICE9PSBFT0YpIHsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmJ1ZjEgPT09IEVPRikgewogICAgICAgICAgICBpZiAodGhpcy5yZWNvdmVyeU1vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlckVPRkV4Y2VwdGlvbigiRW5kIG9mIGZpbGUgaW5zaWRlIGFycmF5LiIpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5zaGlmdCgpOwogICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgIGNhc2UgIjw8IjoKICAgICAgICAgIGNvbnN0IGRpY3QgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgICAgICAgd2hpbGUgKCFpc0NtZCh0aGlzLmJ1ZjEsICI+PiIpICYmIHRoaXMuYnVmMSAhPT0gRU9GKSB7CiAgICAgICAgICAgIGlmICghKHRoaXMuYnVmMSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgaW5mbygiTWFsZm9ybWVkIGRpY3Rpb25hcnk6IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3QiKTsKICAgICAgICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWYxLm5hbWU7CiAgICAgICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICAgICAgaWYgKHRoaXMuYnVmMSA9PT0gRU9GKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGljdC5zZXQoa2V5LCB0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmJ1ZjEgPT09IEVPRikgewogICAgICAgICAgICBpZiAodGhpcy5yZWNvdmVyeU1vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gZGljdDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VyRU9GRXhjZXB0aW9uKCJFbmQgb2YgZmlsZSBpbnNpZGUgZGljdGlvbmFyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc0NtZCh0aGlzLmJ1ZjIsICJzdHJlYW0iKSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5hbGxvd1N0cmVhbXMgPyB0aGlzLm1ha2VTdHJlYW0oZGljdCwgY2lwaGVyVHJhbnNmb3JtKSA6IGRpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgICByZXR1cm4gZGljdDsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGJ1ZjE7CiAgICAgIH0KICAgIH0KICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGJ1ZjEpKSB7CiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHRoaXMuYnVmMSkgJiYgaXNDbWQodGhpcy5idWYyLCAiUiIpKSB7CiAgICAgICAgY29uc3QgcmVmID0gUmVmLmdldChidWYxLCB0aGlzLmJ1ZjEpOwogICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgcmV0dXJuIHJlZjsKICAgICAgfQogICAgICByZXR1cm4gYnVmMTsKICAgIH0KICAgIGlmICh0eXBlb2YgYnVmMSA9PT0gInN0cmluZyIpIHsKICAgICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgewogICAgICAgIHJldHVybiBjaXBoZXJUcmFuc2Zvcm0uZGVjcnlwdFN0cmluZyhidWYxKTsKICAgICAgfQogICAgICByZXR1cm4gYnVmMTsKICAgIH0KICAgIHJldHVybiBidWYxOwogIH0KICBmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IEUgPSAweDQ1LAogICAgICBJID0gMHg0OSwKICAgICAgU1BBQ0UgPSAweDIwLAogICAgICBMRiA9IDB4YSwKICAgICAgQ1IgPSAweGQsCiAgICAgIE5VTCA9IDB4MDsKICAgIGNvbnN0IHsKICAgICAgICBrbm93bkNvbW1hbmRzCiAgICAgIH0gPSB0aGlzLmxleGVyLAogICAgICBzdGFydFBvcyA9IHN0cmVhbS5wb3MsCiAgICAgIG4gPSAxNTsKICAgIGxldCBzdGF0ZSA9IDAsCiAgICAgIGNoLAogICAgICBtYXliZUVJUG9zOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoc3RhdGUgPT09IDApIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDEpIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGNoID09PSBTUEFDRSB8fCBjaCA9PT0gTEYgfHwgY2ggPT09IENSKSB7CiAgICAgICAgICBtYXliZUVJUG9zID0gc3RyZWFtLnBvczsKICAgICAgICAgIGNvbnN0IGZvbGxvd2luZ0J5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhuKTsKICAgICAgICAgIGNvbnN0IGlpID0gZm9sbG93aW5nQnl0ZXMubGVuZ3RoOwogICAgICAgICAgaWYgKGlpID09PSAwKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgIGNoID0gZm9sbG93aW5nQnl0ZXNbaV07CiAgICAgICAgICAgIGlmIChjaCA9PT0gTlVMICYmIGZvbGxvd2luZ0J5dGVzW2kgKyAxXSAhPT0gTlVMKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IgJiYgKGNoIDwgU1BBQ0UgfHwgY2ggPiAweDdmKSkgewogICAgICAgICAgICAgIHN0YXRlID0gMDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlICE9PSAyKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFrbm93bkNvbW1hbmRzKSB7CiAgICAgICAgICAgIHdhcm4oImZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kIC0gYGxleGVyLmtub3duQ29tbWFuZHNgIGlzIHVuZGVmaW5lZC4iKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCB0bXBMZXhlciA9IG5ldyBMZXhlcihuZXcgU3RyZWFtKHN0cmVhbS5wZWVrQnl0ZXMoNSAqIG4pKSwga25vd25Db21tYW5kcyk7CiAgICAgICAgICB0bXBMZXhlci5faGV4U3RyaW5nV2FybiA9ICgpID0+IHt9OwogICAgICAgICAgbGV0IG51bUFyZ3MgPSAwOwogICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29uc3QgbmV4dE9iaiA9IHRtcExleGVyLmdldE9iaigpOwogICAgICAgICAgICBpZiAobmV4dE9iaiA9PT0gRU9GKSB7CiAgICAgICAgICAgICAgc3RhdGUgPSAwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0T2JqIGluc3RhbmNlb2YgQ21kKSB7CiAgICAgICAgICAgICAgY29uc3Qga25vd25Db21tYW5kID0ga25vd25Db21tYW5kc1tuZXh0T2JqLmNtZF07CiAgICAgICAgICAgICAgaWYgKCFrbm93bkNvbW1hbmQpIHsKICAgICAgICAgICAgICAgIHN0YXRlID0gMDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoa25vd25Db21tYW5kLnZhcmlhYmxlQXJncyA/IG51bUFyZ3MgPD0ga25vd25Db21tYW5kLm51bUFyZ3MgOiBudW1BcmdzID09PSBrbm93bkNvbW1hbmQubnVtQXJncykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG51bUFyZ3MgPSAwOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG51bUFyZ3MrKzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMikgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUgPSAwOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGNoID09PSAtMSkgewogICAgICB3YXJuKCJmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZDogIiArICJSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB3aXRob3V0IGZpbmRpbmcgYSB2YWxpZCBFSSBtYXJrZXIiKTsKICAgICAgaWYgKG1heWJlRUlQb3MpIHsKICAgICAgICB3YXJuKCcuLi4gdHJ5aW5nIHRvIHJlY292ZXIgYnkgdXNpbmcgdGhlIGxhc3QgIkVJIiBvY2N1cnJlbmNlLicpOwogICAgICAgIHN0cmVhbS5za2lwKC0oc3RyZWFtLnBvcyAtIG1heWJlRUlQb3MpKTsKICAgICAgfQogICAgfQogICAgbGV0IGVuZE9mZnNldCA9IDQ7CiAgICBzdHJlYW0uc2tpcCgtZW5kT2Zmc2V0KTsKICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICBzdHJlYW0uc2tpcChlbmRPZmZzZXQpOwogICAgaWYgKCFpc1doaXRlU3BhY2UoY2gpKSB7CiAgICAgIGVuZE9mZnNldC0tOwogICAgfQogICAgcmV0dXJuIHN0cmVhbS5wb3MgLSBlbmRPZmZzZXQgLSBzdGFydFBvczsKICB9CiAgZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBmb3VuZEVPSSA9IGZhbHNlLAogICAgICBiLAogICAgICBtYXJrZXJMZW5ndGg7CiAgICB3aGlsZSAoKGIgPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKGIgIT09IDB4ZmYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBzd2l0Y2ggKHN0cmVhbS5nZXRCeXRlKCkpIHsKICAgICAgICBjYXNlIDB4MDA6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmY6CiAgICAgICAgICBzdHJlYW0uc2tpcCgtMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZDk6CiAgICAgICAgICBmb3VuZEVPSSA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4YzA6CiAgICAgICAgY2FzZSAweGMxOgogICAgICAgIGNhc2UgMHhjMjoKICAgICAgICBjYXNlIDB4YzM6CiAgICAgICAgY2FzZSAweGM1OgogICAgICAgIGNhc2UgMHhjNjoKICAgICAgICBjYXNlIDB4Yzc6CiAgICAgICAgY2FzZSAweGM5OgogICAgICAgIGNhc2UgMHhjYToKICAgICAgICBjYXNlIDB4Y2I6CiAgICAgICAgY2FzZSAweGNkOgogICAgICAgIGNhc2UgMHhjZToKICAgICAgICBjYXNlIDB4Y2Y6CiAgICAgICAgY2FzZSAweGM0OgogICAgICAgIGNhc2UgMHhjYzoKICAgICAgICBjYXNlIDB4ZGE6CiAgICAgICAgY2FzZSAweGRiOgogICAgICAgIGNhc2UgMHhkYzoKICAgICAgICBjYXNlIDB4ZGQ6CiAgICAgICAgY2FzZSAweGRlOgogICAgICAgIGNhc2UgMHhkZjoKICAgICAgICBjYXNlIDB4ZTA6CiAgICAgICAgY2FzZSAweGUxOgogICAgICAgIGNhc2UgMHhlMjoKICAgICAgICBjYXNlIDB4ZTM6CiAgICAgICAgY2FzZSAweGU0OgogICAgICAgIGNhc2UgMHhlNToKICAgICAgICBjYXNlIDB4ZTY6CiAgICAgICAgY2FzZSAweGU3OgogICAgICAgIGNhc2UgMHhlODoKICAgICAgICBjYXNlIDB4ZTk6CiAgICAgICAgY2FzZSAweGVhOgogICAgICAgIGNhc2UgMHhlYjoKICAgICAgICBjYXNlIDB4ZWM6CiAgICAgICAgY2FzZSAweGVkOgogICAgICAgIGNhc2UgMHhlZToKICAgICAgICBjYXNlIDB4ZWY6CiAgICAgICAgY2FzZSAweGZlOgogICAgICAgICAgbWFya2VyTGVuZ3RoID0gc3RyZWFtLmdldFVpbnQxNigpOwogICAgICAgICAgaWYgKG1hcmtlckxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgc3RyZWFtLnNraXAobWFya2VyTGVuZ3RoIC0gMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0uc2tpcCgtMik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoZm91bmRFT0kpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0YXJ0UG9zOwogICAgaWYgKGIgPT09IC0xKSB7CiAgICAgIHdhcm4oIklubGluZSBEQ1REZWNvZGUgaW1hZ2Ugc3RyZWFtOiAiICsgIkVPSSBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKTsKICAgICAgc3RyZWFtLnNraXAoLWxlbmd0aCk7CiAgICAgIHJldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CiAgICB9CiAgICB0aGlzLmlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pOwogICAgcmV0dXJuIGxlbmd0aDsKICB9CiAgZmluZEFTQ0lJODVEZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKSB7CiAgICBjb25zdCBUSUxERSA9IDB4N2UsCiAgICAgIEdUID0gMHgzZTsKICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKGNoID09PSBUSUxERSkgewogICAgICAgIGNvbnN0IHRpbGRlUG9zID0gc3RyZWFtLnBvczsKICAgICAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpOwogICAgICAgIHdoaWxlIChpc1doaXRlU3BhY2UoY2gpKSB7CiAgICAgICAgICBzdHJlYW0uc2tpcCgpOwogICAgICAgICAgY2ggPSBzdHJlYW0ucGVla0J5dGUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNoID09PSBHVCkgewogICAgICAgICAgc3RyZWFtLnNraXAoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IHRpbGRlUG9zKSB7CiAgICAgICAgICBjb25zdCBtYXliZUVJID0gc3RyZWFtLnBlZWtCeXRlcygyKTsKICAgICAgICAgIGlmIChtYXliZUVJWzBdID09PSAweDQ1ICYmIG1heWJlRUlbMV0gPT09IDB4NDkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CiAgICBpZiAoY2ggPT09IC0xKSB7CiAgICAgIHdhcm4oIklubGluZSBBU0NJSTg1RGVjb2RlIGltYWdlIHN0cmVhbTogIiArICJFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7CiAgICAgIHN0cmVhbS5za2lwKC1sZW5ndGgpOwogICAgICByZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgfQogICAgdGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKTsKICAgIHJldHVybiBsZW5ndGg7CiAgfQogIGZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IEdUID0gMHgzZTsKICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKGNoID09PSBHVCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CiAgICBpZiAoY2ggPT09IC0xKSB7CiAgICAgIHdhcm4oIklubGluZSBBU0NJSUhleERlY29kZSBpbWFnZSBzdHJlYW06ICIgKyAiRU9EIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpOwogICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKICAgIH0KICAgIHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSk7CiAgICByZXR1cm4gbGVuZ3RoOwogIH0KICBpbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKSB7CiAgICBjb25zdCBFID0gMHg0NSwKICAgICAgSSA9IDB4NDk7CiAgICBsZXQgc3RhdGUgPSAwLAogICAgICBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKHN0YXRlID09PSAwKSB7CiAgICAgICAgc3RhdGUgPSBjaCA9PT0gRSA/IDEgOiAwOwogICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAxKSB7CiAgICAgICAgc3RhdGUgPSBjaCA9PT0gSSA/IDIgOiAwOwogICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAyKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgbWFrZUlubGluZUltYWdlKGNpcGhlclRyYW5zZm9ybSkgewogICAgY29uc3QgbGV4ZXIgPSB0aGlzLmxleGVyOwogICAgY29uc3Qgc3RyZWFtID0gbGV4ZXIuc3RyZWFtOwogICAgY29uc3QgZGljdE1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBsZXQgZGljdExlbmd0aDsKICAgIHdoaWxlICghaXNDbWQodGhpcy5idWYxLCAiSUQiKSAmJiB0aGlzLmJ1ZjEgIT09IEVPRikgewogICAgICBpZiAoISh0aGlzLmJ1ZjEgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRGljdGlvbmFyeSBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0Iik7CiAgICAgIH0KICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWYxLm5hbWU7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgaWYgKHRoaXMuYnVmMSA9PT0gRU9GKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGljdE1hcFtrZXldID0gdGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKTsKICAgIH0KICAgIGlmIChsZXhlci5iZWdpbklubGluZUltYWdlUG9zICE9PSAtMSkgewogICAgICBkaWN0TGVuZ3RoID0gc3RyZWFtLnBvcyAtIGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3M7CiAgICB9CiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihkaWN0TWFwLkYgfHwgZGljdE1hcC5GaWx0ZXIpOwogICAgbGV0IGZpbHRlck5hbWU7CiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyLm5hbWU7CiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkgewogICAgICBjb25zdCBmaWx0ZXJaZXJvID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZmlsdGVyWzBdKTsKICAgICAgaWYgKGZpbHRlclplcm8gaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlclplcm8ubmFtZTsKICAgICAgfQogICAgfQogICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zOwogICAgbGV0IGxlbmd0aDsKICAgIHN3aXRjaCAoZmlsdGVyTmFtZSkgewogICAgICBjYXNlICJEQ1QiOgogICAgICBjYXNlICJEQ1REZWNvZGUiOgogICAgICAgIGxlbmd0aCA9IHRoaXMuZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJBODUiOgogICAgICBjYXNlICJBU0NJSTg1RGVjb2RlIjoKICAgICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkFIeCI6CiAgICAgIGNhc2UgIkFTQ0lJSGV4RGVjb2RlIjoKICAgICAgICBsZW5ndGggPSB0aGlzLmZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGxlbmd0aCA9IHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKICAgIH0KICAgIGxldCBjYWNoZUtleTsKICAgIGlmIChsZW5ndGggPCBNQVhfTEVOR1RIX1RPX0NBQ0hFICYmIGRpY3RMZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGluaXRpYWxTdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOwogICAgICBzdHJlYW0ucG9zID0gbGV4ZXIuYmVnaW5JbmxpbmVJbWFnZVBvczsKICAgICAgY2FjaGVLZXkgPSBnZXRJbmxpbmVJbWFnZUNhY2hlS2V5KHN0cmVhbS5nZXRCeXRlcyhkaWN0TGVuZ3RoICsgbGVuZ3RoKSk7CiAgICAgIHN0cmVhbS5wb3MgPSBpbml0aWFsU3RyZWFtUG9zOwogICAgICBjb25zdCBjYWNoZUVudHJ5ID0gdGhpcy5pbWFnZUNhY2hlW2NhY2hlS2V5XTsKICAgICAgaWYgKGNhY2hlRW50cnkgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRoaXMuYnVmMiA9IENtZC5nZXQoIkVJIik7CiAgICAgICAgdGhpcy5zaGlmdCgpOwogICAgICAgIGNhY2hlRW50cnkucmVzZXQoKTsKICAgICAgICByZXR1cm4gY2FjaGVFbnRyeTsKICAgICAgfQogICAgfQogICAgY29uc3QgZGljdCA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICBmb3IgKGNvbnN0IGtleSBpbiBkaWN0TWFwKSB7CiAgICAgIGRpY3Quc2V0KGtleSwgZGljdE1hcFtrZXldKTsKICAgIH0KICAgIGxldCBpbWFnZVN0cmVhbSA9IHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0UG9zLCBsZW5ndGgsIGRpY3QpOwogICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgewogICAgICBpbWFnZVN0cmVhbSA9IGNpcGhlclRyYW5zZm9ybS5jcmVhdGVTdHJlYW0oaW1hZ2VTdHJlYW0sIGxlbmd0aCk7CiAgICB9CiAgICBpbWFnZVN0cmVhbSA9IHRoaXMuZmlsdGVyKGltYWdlU3RyZWFtLCBkaWN0LCBsZW5ndGgpOwogICAgaW1hZ2VTdHJlYW0uZGljdCA9IGRpY3Q7CiAgICBpZiAoY2FjaGVLZXkgIT09IHVuZGVmaW5lZCkgewogICAgICBpbWFnZVN0cmVhbS5jYWNoZUtleSA9IGBpbmxpbmVfaW1nXyR7Kyt0aGlzLl9pbWFnZUlkfWA7CiAgICAgIHRoaXMuaW1hZ2VDYWNoZVtjYWNoZUtleV0gPSBpbWFnZVN0cmVhbTsKICAgIH0KICAgIHRoaXMuYnVmMiA9IENtZC5nZXQoIkVJIik7CiAgICB0aGlzLnNoaWZ0KCk7CiAgICByZXR1cm4gaW1hZ2VTdHJlYW07CiAgfQogICNmaW5kU3RyZWFtTGVuZ3RoKHN0YXJ0UG9zKSB7CiAgICBjb25zdCB7CiAgICAgIHN0cmVhbQogICAgfSA9IHRoaXMubGV4ZXI7CiAgICBzdHJlYW0ucG9zID0gc3RhcnRQb3M7CiAgICBjb25zdCBTQ0FOX0JMT0NLX0xFTkdUSCA9IDIwNDg7CiAgICBjb25zdCBzaWduYXR1cmVMZW5ndGggPSAiZW5kc3RyZWFtIi5sZW5ndGg7CiAgICBjb25zdCBFTkRfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjUsIDB4NmUsIDB4NjRdKTsKICAgIGNvbnN0IGVuZExlbmd0aCA9IEVORF9TSUdOQVRVUkUubGVuZ3RoOwogICAgY29uc3QgUEFSVElBTF9TSUdOQVRVUkUgPSBbbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NzIsIDB4NjUsIDB4NjEsIDB4NmRdKSwgbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NjUsIDB4NjEsIDB4NmRdKSwgbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NzIsIDB4NjUsIDB4NjFdKV07CiAgICBjb25zdCBub3JtYWxMZW5ndGggPSBzaWduYXR1cmVMZW5ndGggLSBlbmRMZW5ndGg7CiAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IHN0cmVhbS5lbmQpIHsKICAgICAgY29uc3Qgc2NhbkJ5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhTQ0FOX0JMT0NLX0xFTkdUSCk7CiAgICAgIGNvbnN0IHNjYW5MZW5ndGggPSBzY2FuQnl0ZXMubGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoOwogICAgICBpZiAoc2Nhbkxlbmd0aCA8PSAwKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbGV0IHBvcyA9IDA7CiAgICAgIHdoaWxlIChwb3MgPCBzY2FuTGVuZ3RoKSB7CiAgICAgICAgbGV0IGogPSAwOwogICAgICAgIHdoaWxlIChqIDwgZW5kTGVuZ3RoICYmIHNjYW5CeXRlc1twb3MgKyBqXSA9PT0gRU5EX1NJR05BVFVSRVtqXSkgewogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBpZiAoaiA+PSBlbmRMZW5ndGgpIHsKICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIFBBUlRJQUxfU0lHTkFUVVJFKSB7CiAgICAgICAgICAgIGNvbnN0IHBhcnRMZW4gPSBwYXJ0Lmxlbmd0aDsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICB3aGlsZSAoayA8IHBhcnRMZW4gJiYgc2NhbkJ5dGVzW3BvcyArIGogKyBrXSA9PT0gcGFydFtrXSkgewogICAgICAgICAgICAgIGsrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoayA+PSBub3JtYWxMZW5ndGgpIHsKICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGsgPj0gcGFydExlbikgewogICAgICAgICAgICAgIGNvbnN0IGxhc3RCeXRlID0gc2NhbkJ5dGVzW3BvcyArIGogKyBrXTsKICAgICAgICAgICAgICBpZiAoaXNXaGl0ZVNwYWNlKGxhc3RCeXRlKSkgewogICAgICAgICAgICAgICAgaW5mbyhgRm91bmQgIiR7Ynl0ZXNUb1N0cmluZyhbLi4uRU5EX1NJR05BVFVSRSwgLi4ucGFydF0pfSIgd2hlbiBgICsgInNlYXJjaGluZyBmb3IgZW5kc3RyZWFtIGNvbW1hbmQuIik7CiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZm91bmQpIHsKICAgICAgICAgICAgc3RyZWFtLnBvcyArPSBwb3M7CiAgICAgICAgICAgIHJldHVybiBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvcysrOwogICAgICB9CiAgICAgIHN0cmVhbS5wb3MgKz0gc2Nhbkxlbmd0aDsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgbWFrZVN0cmVhbShkaWN0LCBjaXBoZXJUcmFuc2Zvcm0pIHsKICAgIGNvbnN0IGxleGVyID0gdGhpcy5sZXhlcjsKICAgIGxldCBzdHJlYW0gPSBsZXhlci5zdHJlYW07CiAgICBsZXhlci5za2lwVG9OZXh0TGluZSgpOwogICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zIC0gMTsKICAgIGxldCBsZW5ndGggPSBkaWN0LmdldCgiTGVuZ3RoIik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobGVuZ3RoKSkgewogICAgICBpbmZvKGBCYWQgbGVuZ3RoICIke2xlbmd0aCAmJiBsZW5ndGgudG9TdHJpbmcoKX0iIGluIHN0cmVhbS5gKTsKICAgICAgbGVuZ3RoID0gMDsKICAgIH0KICAgIHN0cmVhbS5wb3MgPSBzdGFydFBvcyArIGxlbmd0aDsKICAgIGxleGVyLm5leHRDaGFyKCk7CiAgICBpZiAodGhpcy50cnlTaGlmdCgpICYmIGlzQ21kKHRoaXMuYnVmMiwgImVuZHN0cmVhbSIpKSB7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgIH0gZWxzZSB7CiAgICAgIGxlbmd0aCA9IHRoaXMuI2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MpOwogICAgICBpZiAobGVuZ3RoIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTWlzc2luZyBlbmRzdHJlYW0gY29tbWFuZC4iKTsKICAgICAgfQogICAgICBsZXhlci5uZXh0Q2hhcigpOwogICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgIH0KICAgIHRoaXMuc2hpZnQoKTsKICAgIHN0cmVhbSA9IHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0UG9zLCBsZW5ndGgsIGRpY3QpOwogICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgewogICAgICBzdHJlYW0gPSBjaXBoZXJUcmFuc2Zvcm0uY3JlYXRlU3RyZWFtKHN0cmVhbSwgbGVuZ3RoKTsKICAgIH0KICAgIHN0cmVhbSA9IHRoaXMuZmlsdGVyKHN0cmVhbSwgZGljdCwgbGVuZ3RoKTsKICAgIHN0cmVhbS5kaWN0ID0gZGljdDsKICAgIHJldHVybiBzdHJlYW07CiAgfQogIGZpbHRlcihzdHJlYW0sIGRpY3QsIGxlbmd0aCkgewogICAgbGV0IGZpbHRlciA9IGRpY3QuZ2V0KCJGIiwgIkZpbHRlciIpOwogICAgbGV0IHBhcmFtcyA9IGRpY3QuZ2V0KCJEUCIsICJEZWNvZGVQYXJtcyIpOwogICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zKSkgewogICAgICAgIHdhcm4oIi9EZWNvZGVQYXJtcyBzaG91bGQgbm90IGJlIGFuIEFycmF5LCB3aGVuIC9GaWx0ZXIgaXMgYSBOYW1lLiIpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLm1ha2VGaWx0ZXIoc3RyZWFtLCBmaWx0ZXIubmFtZSwgbGVuZ3RoLCBwYXJhbXMpOwogICAgfQogICAgbGV0IG1heWJlTGVuZ3RoID0gbGVuZ3RoOwogICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkgewogICAgICBjb25zdCBmaWx0ZXJBcnJheSA9IGZpbHRlcjsKICAgICAgY29uc3QgcGFyYW1zQXJyYXkgPSBwYXJhbXM7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZpbHRlckFycmF5Lmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgICBmaWx0ZXIgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWx0ZXJBcnJheVtpXSk7CiAgICAgICAgaWYgKCEoZmlsdGVyIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQmFkIGZpbHRlciBuYW1lICIke2ZpbHRlcn0iYCk7CiAgICAgICAgfQogICAgICAgIHBhcmFtcyA9IG51bGw7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zQXJyYXkpICYmIGkgaW4gcGFyYW1zQXJyYXkpIHsKICAgICAgICAgIHBhcmFtcyA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHBhcmFtc0FycmF5W2ldKTsKICAgICAgICB9CiAgICAgICAgc3RyZWFtID0gdGhpcy5tYWtlRmlsdGVyKHN0cmVhbSwgZmlsdGVyLm5hbWUsIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgIG1heWJlTGVuZ3RoID0gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0cmVhbTsKICB9CiAgbWFrZUZpbHRlcihzdHJlYW0sIG5hbWUsIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIGlmIChtYXliZUxlbmd0aCA9PT0gMCkgewogICAgICB3YXJuKGBFbXB0eSAiJHtuYW1lfSIgc3RyZWFtLmApOwogICAgICByZXR1cm4gbmV3IE51bGxTdHJlYW0oKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgIGNhc2UgIkZsIjoKICAgICAgICBjYXNlICJGbGF0ZURlY29kZSI6CiAgICAgICAgICBpZiAocGFyYW1zKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZGljdG9yU3RyZWFtKG5ldyBGbGF0ZVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmV3IEZsYXRlU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOwogICAgICAgIGNhc2UgIkxaVyI6CiAgICAgICAgY2FzZSAiTFpXRGVjb2RlIjoKICAgICAgICAgIGxldCBlYXJseUNoYW5nZSA9IDE7CiAgICAgICAgICBpZiAocGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzKCJFYXJseUNoYW5nZSIpKSB7CiAgICAgICAgICAgICAgZWFybHlDaGFuZ2UgPSBwYXJhbXMuZ2V0KCJFYXJseUNoYW5nZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZGljdG9yU3RyZWFtKG5ldyBMWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBuZXcgTFpXU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGVhcmx5Q2hhbmdlKTsKICAgICAgICBjYXNlICJEQ1QiOgogICAgICAgIGNhc2UgIkRDVERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEpwZWdTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKICAgICAgICBjYXNlICJKUFgiOgogICAgICAgIGNhc2UgIkpQWERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEpweFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgIGNhc2UgIkE4NSI6CiAgICAgICAgY2FzZSAiQVNDSUk4NURlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEFzY2lpODVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCk7CiAgICAgICAgY2FzZSAiQUh4IjoKICAgICAgICBjYXNlICJBU0NJSUhleERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEFzY2lpSGV4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOwogICAgICAgIGNhc2UgIkNDRiI6CiAgICAgICAgY2FzZSAiQ0NJVFRGYXhEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBDQ0lUVEZheFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgIGNhc2UgIlJMIjoKICAgICAgICBjYXNlICJSdW5MZW5ndGhEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBSdW5MZW5ndGhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCk7CiAgICAgICAgY2FzZSAiSkJJRzJEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBKYmlnMlN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICB9CiAgICAgIHdhcm4oYEZpbHRlciAiJHtuYW1lfSIgaXMgbm90IHN1cHBvcnRlZC5gKTsKICAgICAgcmV0dXJuIHN0cmVhbTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgSW52YWxpZCBzdHJlYW06ICIke2V4fSJgKTsKICAgICAgcmV0dXJuIG5ldyBOdWxsU3RyZWFtKCk7CiAgICB9CiAgfQp9CmNvbnN0IHNwZWNpYWxDaGFycyA9IFsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTsKZnVuY3Rpb24gdG9IZXhEaWdpdChjaCkgewogIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHsKICAgIHJldHVybiBjaCAmIDB4MGY7CiAgfQogIGlmIChjaCA+PSAweDQxICYmIGNoIDw9IDB4NDYgfHwgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDY2KSB7CiAgICByZXR1cm4gKGNoICYgMHgwZikgKyA5OwogIH0KICByZXR1cm4gLTE7Cn0KY2xhc3MgTGV4ZXIgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwga25vd25Db21tYW5kcyA9IG51bGwpIHsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5uZXh0Q2hhcigpOwogICAgdGhpcy5zdHJCdWYgPSBbXTsKICAgIHRoaXMua25vd25Db21tYW5kcyA9IGtub3duQ29tbWFuZHM7CiAgICB0aGlzLl9oZXhTdHJpbmdOdW1XYXJuID0gMDsKICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IC0xOwogIH0KICBuZXh0Q2hhcigpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogIH0KICBwZWVrQ2hhcigpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbS5wZWVrQnl0ZSgpOwogIH0KICBnZXROdW1iZXIoKSB7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgbGV0IGVOb3RhdGlvbiA9IGZhbHNlOwogICAgbGV0IGRpdmlkZUJ5ID0gMDsKICAgIGxldCBzaWduID0gMTsKICAgIGlmIChjaCA9PT0gMHgyZCkgewogICAgICBzaWduID0gLTE7CiAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICBpZiAoY2ggPT09IDB4MmQpIHsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyYikgewogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgewogICAgICBkbyB7CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgIH0gd2hpbGUgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKTsKICAgIH0KICAgIGlmIChjaCA9PT0gMHgyZSkgewogICAgICBkaXZpZGVCeSA9IDEwOwogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIGlmIChjaCA8IDB4MzAgfHwgY2ggPiAweDM5KSB7CiAgICAgIGNvbnN0IG1zZyA9IGBJbnZhbGlkIG51bWJlcjogJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKX0gKGNoYXJDb2RlICR7Y2h9KWA7CiAgICAgIGlmIChpc1doaXRlU3BhY2UoY2gpIHx8IGNoID09PSAweDI4IHx8IGNoID09PSAweDNjIHx8IGNoID09PSAtMSkgewogICAgICAgIGluZm8oYExleGVyLmdldE51bWJlciAtICIke21zZ30iLmApOwogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihtc2cpOwogICAgfQogICAgbGV0IGJhc2VWYWx1ZSA9IGNoIC0gMHgzMDsKICAgIGxldCBwb3dlclZhbHVlID0gMDsKICAgIGxldCBwb3dlclZhbHVlU2lnbiA9IDE7CiAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwKSB7CiAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHsKICAgICAgICBjb25zdCBjdXJyZW50RGlnaXQgPSBjaCAtIDB4MzA7CiAgICAgICAgaWYgKGVOb3RhdGlvbikgewogICAgICAgICAgcG93ZXJWYWx1ZSA9IHBvd2VyVmFsdWUgKiAxMCArIGN1cnJlbnREaWdpdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpdmlkZUJ5ICE9PSAwKSB7CiAgICAgICAgICAgIGRpdmlkZUJ5ICo9IDEwOwogICAgICAgICAgfQogICAgICAgICAgYmFzZVZhbHVlID0gYmFzZVZhbHVlICogMTAgKyBjdXJyZW50RGlnaXQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDJlKSB7CiAgICAgICAgaWYgKGRpdmlkZUJ5ID09PSAwKSB7CiAgICAgICAgICBkaXZpZGVCeSA9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyZCkgewogICAgICAgIHdhcm4oIkJhZGx5IGZvcm1hdHRlZCBudW1iZXI6IG1pbnVzIHNpZ24gaW4gdGhlIG1pZGRsZSIpOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDQ1IHx8IGNoID09PSAweDY1KSB7CiAgICAgICAgY2ggPSB0aGlzLnBlZWtDaGFyKCk7CiAgICAgICAgaWYgKGNoID09PSAweDJiIHx8IGNoID09PSAweDJkKSB7CiAgICAgICAgICBwb3dlclZhbHVlU2lnbiA9IGNoID09PSAweDJkID8gLTEgOiAxOwogICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIH0gZWxzZSBpZiAoY2ggPCAweDMwIHx8IGNoID4gMHgzOSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVOb3RhdGlvbiA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChkaXZpZGVCeSAhPT0gMCkgewogICAgICBiYXNlVmFsdWUgLz0gZGl2aWRlQnk7CiAgICB9CiAgICBpZiAoZU5vdGF0aW9uKSB7CiAgICAgIGJhc2VWYWx1ZSAqPSAxMCAqKiAocG93ZXJWYWx1ZVNpZ24gKiBwb3dlclZhbHVlKTsKICAgIH0KICAgIHJldHVybiBzaWduICogYmFzZVZhbHVlOwogIH0KICBnZXRTdHJpbmcoKSB7CiAgICBsZXQgbnVtUGFyZW4gPSAxOwogICAgbGV0IGRvbmUgPSBmYWxzZTsKICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICBsZXQgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBsZXQgY2hhckJ1ZmZlcmVkID0gZmFsc2U7CiAgICAgIHN3aXRjaCAoY2ggfCAwKSB7CiAgICAgICAgY2FzZSAtMToKICAgICAgICAgIHdhcm4oIlVudGVybWluYXRlZCBzdHJpbmciKTsKICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDI4OgogICAgICAgICAgKytudW1QYXJlbjsKICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIoIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4Mjk6CiAgICAgICAgICBpZiAoLS1udW1QYXJlbiA9PT0gMCkgewogICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyQnVmLnB1c2goIikiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHg1YzoKICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICAgIHdhcm4oIlVudGVybWluYXRlZCBzdHJpbmciKTsKICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAweDZlOgogICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcbiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4NzI6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxyIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHg3NDoKICAgICAgICAgICAgICBzdHJCdWYucHVzaCgiXHQiKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAweDYyOgogICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcYiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4NjY6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxmIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHg1YzoKICAgICAgICAgICAgY2FzZSAweDI4OgogICAgICAgICAgICBjYXNlIDB4Mjk6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4MzA6CiAgICAgICAgICAgIGNhc2UgMHgzMToKICAgICAgICAgICAgY2FzZSAweDMyOgogICAgICAgICAgICBjYXNlIDB4MzM6CiAgICAgICAgICAgIGNhc2UgMHgzNDoKICAgICAgICAgICAgY2FzZSAweDM1OgogICAgICAgICAgICBjYXNlIDB4MzY6CiAgICAgICAgICAgIGNhc2UgMHgzNzoKICAgICAgICAgICAgICBsZXQgeCA9IGNoICYgMHgwZjsKICAgICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgICBjaGFyQnVmZmVyZWQgPSB0cnVlOwogICAgICAgICAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzcpIHsKICAgICAgICAgICAgICAgIHggPSAoeCA8PCAzKSArIChjaCAmIDB4MGYpOwogICAgICAgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM3KSB7CiAgICAgICAgICAgICAgICAgIGNoYXJCdWZmZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICB4ID0gKHggPDwgMykgKyAoY2ggJiAweDBmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh4KSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHgwZDoKICAgICAgICAgICAgICBpZiAodGhpcy5wZWVrQ2hhcigpID09PSAweDBhKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4MGE6CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChkb25lKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKCFjaGFyQnVmZmVyZWQpIHsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKICB9CiAgZ2V0TmFtZSgpIHsKICAgIGxldCBjaCwgcHJldmlvdXNDaDsKICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwICYmICFzcGVjaWFsQ2hhcnNbY2hdKSB7CiAgICAgIGlmIChjaCA9PT0gMHgyMykgewogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChzcGVjaWFsQ2hhcnNbY2hdKSB7CiAgICAgICAgICB3YXJuKCJMZXhlcl9nZXROYW1lOiAiICsgIk5VTUJFUiBTSUdOICgjKSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBoZXhhZGVjaW1hbCBudW1iZXIuIik7CiAgICAgICAgICBzdHJCdWYucHVzaCgiIyIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHggPSB0b0hleERpZ2l0KGNoKTsKICAgICAgICBpZiAoeCAhPT0gLTEpIHsKICAgICAgICAgIHByZXZpb3VzQ2ggPSBjaDsKICAgICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgY29uc3QgeDIgPSB0b0hleERpZ2l0KGNoKTsKICAgICAgICAgIGlmICh4MiA9PT0gLTEpIHsKICAgICAgICAgICAgd2FybihgTGV4ZXJfZ2V0TmFtZTogSWxsZWdhbCBkaWdpdCAoJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKX0pIGAgKyAiaW4gaGV4YWRlY2ltYWwgbnVtYmVyLiIpOwogICAgICAgICAgICBzdHJCdWYucHVzaCgiIyIsIFN0cmluZy5mcm9tQ2hhckNvZGUocHJldmlvdXNDaCkpOwogICAgICAgICAgICBpZiAoc3BlY2lhbENoYXJzW2NoXSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHggPDwgNCB8IHgyKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIjIiwgU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdHJCdWYubGVuZ3RoID4gMTI3KSB7CiAgICAgIHdhcm4oYE5hbWUgdG9rZW4gaXMgbG9uZ2VyIHRoYW4gYWxsb3dlZCBieSB0aGUgc3BlYzogJHtzdHJCdWYubGVuZ3RofWApOwogICAgfQogICAgcmV0dXJuIE5hbWUuZ2V0KHN0ckJ1Zi5qb2luKCIiKSk7CiAgfQogIF9oZXhTdHJpbmdXYXJuKGNoKSB7CiAgICBjb25zdCBNQVhfSEVYX1NUUklOR19OVU1fV0FSTiA9IDU7CiAgICBpZiAodGhpcy5faGV4U3RyaW5nTnVtV2FybisrID09PSBNQVhfSEVYX1NUUklOR19OVU1fV0FSTikgewogICAgICB3YXJuKCJnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBhZGRpdGlvbmFsIGludmFsaWQgY2hhcmFjdGVycy4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuX2hleFN0cmluZ051bVdhcm4gPiBNQVhfSEVYX1NUUklOR19OVU1fV0FSTikgewogICAgICByZXR1cm47CiAgICB9CiAgICB3YXJuKGBnZXRIZXhTdHJpbmcgLSBpZ25vcmluZyBpbnZhbGlkIGNoYXJhY3RlcjogJHtjaH1gKTsKICB9CiAgZ2V0SGV4U3RyaW5nKCkgewogICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CiAgICBzdHJCdWYubGVuZ3RoID0gMDsKICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CiAgICBsZXQgZmlyc3REaWdpdCA9IC0xLAogICAgICBkaWdpdCA9IC0xOwogICAgdGhpcy5faGV4U3RyaW5nTnVtV2FybiA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoY2ggPCAwKSB7CiAgICAgICAgd2FybigiVW50ZXJtaW5hdGVkIGhleCBzdHJpbmciKTsKICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgzZSkgewogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChzcGVjaWFsQ2hhcnNbY2hdID09PSAxKSB7CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGlnaXQgPSB0b0hleERpZ2l0KGNoKTsKICAgICAgICBpZiAoZGlnaXQgPT09IC0xKSB7CiAgICAgICAgICB0aGlzLl9oZXhTdHJpbmdXYXJuKGNoKTsKICAgICAgICB9IGVsc2UgaWYgKGZpcnN0RGlnaXQgPT09IC0xKSB7CiAgICAgICAgICBmaXJzdERpZ2l0ID0gZGlnaXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZmlyc3REaWdpdCA8PCA0IHwgZGlnaXQpKTsKICAgICAgICAgIGZpcnN0RGlnaXQgPSAtMTsKICAgICAgICB9CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChmaXJzdERpZ2l0ICE9PSAtMSkgewogICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGZpcnN0RGlnaXQgPDwgNCkpOwogICAgfQogICAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKICB9CiAgZ2V0T2JqKCkgewogICAgbGV0IGNvbW1lbnQgPSBmYWxzZTsKICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoY2ggPCAwKSB7CiAgICAgICAgcmV0dXJuIEVPRjsKICAgICAgfQogICAgICBpZiAoY29tbWVudCkgewogICAgICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgewogICAgICAgICAgY29tbWVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyNSkgewogICAgICAgIGNvbW1lbnQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKHNwZWNpYWxDaGFyc1tjaF0gIT09IDEpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIHN3aXRjaCAoY2ggfCAwKSB7CiAgICAgIGNhc2UgMHgzMDoKICAgICAgY2FzZSAweDMxOgogICAgICBjYXNlIDB4MzI6CiAgICAgIGNhc2UgMHgzMzoKICAgICAgY2FzZSAweDM0OgogICAgICBjYXNlIDB4MzU6CiAgICAgIGNhc2UgMHgzNjoKICAgICAgY2FzZSAweDM3OgogICAgICBjYXNlIDB4Mzg6CiAgICAgIGNhc2UgMHgzOToKICAgICAgY2FzZSAweDJiOgogICAgICBjYXNlIDB4MmQ6CiAgICAgIGNhc2UgMHgyZToKICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKTsKICAgICAgY2FzZSAweDI4OgogICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygpOwogICAgICBjYXNlIDB4MmY6CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgpOwogICAgICBjYXNlIDB4NWI6CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBDbWQuZ2V0KCJbIik7CiAgICAgIGNhc2UgMHg1ZDoKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgcmV0dXJuIENtZC5nZXQoIl0iKTsKICAgICAgY2FzZSAweDNjOgogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChjaCA9PT0gMHgzYykgewogICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgcmV0dXJuIENtZC5nZXQoIjw8Iik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmdldEhleFN0cmluZygpOwogICAgICBjYXNlIDB4M2U6CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgaWYgKGNoID09PSAweDNlKSB7CiAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICByZXR1cm4gQ21kLmdldCgiPj4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIENtZC5nZXQoIj4iKTsKICAgICAgY2FzZSAweDdiOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gQ21kLmdldCgieyIpOwogICAgICBjYXNlIDB4N2Q6CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBDbWQuZ2V0KCJ9Iik7CiAgICAgIGNhc2UgMHgyOToKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbGxlZ2FsIGNoYXJhY3RlcjogJHtjaH1gKTsKICAgIH0KICAgIGxldCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgIGlmIChjaCA8IDB4MjAgfHwgY2ggPiAweDdmKSB7CiAgICAgIGNvbnN0IG5leHRDaCA9IHRoaXMucGVla0NoYXIoKTsKICAgICAgaWYgKG5leHRDaCA+PSAweDIwICYmIG5leHRDaCA8PSAweDdmKSB7CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBDbWQuZ2V0KHN0cik7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGtub3duQ29tbWFuZHMgPSB0aGlzLmtub3duQ29tbWFuZHM7CiAgICBsZXQga25vd25Db21tYW5kRm91bmQgPSBrbm93bkNvbW1hbmRzPy5bc3RyXSAhPT0gdW5kZWZpbmVkOwogICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCAmJiAhc3BlY2lhbENoYXJzW2NoXSkgewogICAgICBjb25zdCBwb3NzaWJsZUNvbW1hbmQgPSBzdHIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgICAgaWYgKGtub3duQ29tbWFuZEZvdW5kICYmIGtub3duQ29tbWFuZHNbcG9zc2libGVDb21tYW5kXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDEyOCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogJHtzdHIubGVuZ3RofWApOwogICAgICB9CiAgICAgIHN0ciA9IHBvc3NpYmxlQ29tbWFuZDsKICAgICAga25vd25Db21tYW5kRm91bmQgPSBrbm93bkNvbW1hbmRzPy5bc3RyXSAhPT0gdW5kZWZpbmVkOwogICAgfQogICAgaWYgKHN0ciA9PT0gInRydWUiKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHN0ciA9PT0gImZhbHNlIikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoc3RyID09PSAibnVsbCIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoc3RyID09PSAiQkkiKSB7CiAgICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IHRoaXMuc3RyZWFtLnBvczsKICAgIH0KICAgIHJldHVybiBDbWQuZ2V0KHN0cik7CiAgfQogIHNraXBUb05leHRMaW5lKCkgewogICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKICAgIHdoaWxlIChjaCA+PSAwKSB7CiAgICAgIGlmIChjaCA9PT0gMHgwZCkgewogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChjaCA9PT0gMHgwYSkgewogICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgwYSkgewogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICB9Cn0KY2xhc3MgTGluZWFyaXphdGlvbiB7CiAgc3RhdGljIGNyZWF0ZShzdHJlYW0pIHsKICAgIGZ1bmN0aW9uIGdldEludChsaW5EaWN0LCBuYW1lLCBhbGxvd1plcm9WYWx1ZSA9IGZhbHNlKSB7CiAgICAgIGNvbnN0IG9iaiA9IGxpbkRpY3QuZ2V0KG5hbWUpOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopICYmIChhbGxvd1plcm9WYWx1ZSA/IG9iaiA+PSAwIDogb2JqID4gMCkpIHsKICAgICAgICByZXR1cm4gb2JqOwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICIke25hbWV9IiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gYCArICJkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRIaW50cyhsaW5EaWN0KSB7CiAgICAgIGNvbnN0IGhpbnRzID0gbGluRGljdC5nZXQoIkgiKTsKICAgICAgbGV0IGhpbnRzTGVuZ3RoOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShoaW50cykgJiYgKChoaW50c0xlbmd0aCA9IGhpbnRzLmxlbmd0aCkgPT09IDIgfHwgaGludHNMZW5ndGggPT09IDQpKSB7CiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGhpbnRzTGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICBjb25zdCBoaW50ID0gaGludHNbaW5kZXhdOwogICAgICAgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihoaW50KSAmJiBoaW50ID4gMCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIaW50ICgke2luZGV4fSkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLmApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaGludHM7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJIaW50IGFycmF5IGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKTsKICAgIH0KICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgIHhyZWY6IG51bGwKICAgIH0pOwogICAgY29uc3Qgb2JqMSA9IHBhcnNlci5nZXRPYmooKTsKICAgIGNvbnN0IG9iajIgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBjb25zdCBvYmozID0gcGFyc2VyLmdldE9iaigpOwogICAgY29uc3QgbGluRGljdCA9IHBhcnNlci5nZXRPYmooKTsKICAgIGxldCBvYmosIGxlbmd0aDsKICAgIGlmICghKE51bWJlci5pc0ludGVnZXIob2JqMSkgJiYgTnVtYmVyLmlzSW50ZWdlcihvYmoyKSAmJiBpc0NtZChvYmozLCAib2JqIikgJiYgbGluRGljdCBpbnN0YW5jZW9mIERpY3QgJiYgdHlwZW9mIChvYmogPSBsaW5EaWN0LmdldCgiTGluZWFyaXplZCIpKSA9PT0gIm51bWJlciIgJiYgb2JqID4gMCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgaWYgKChsZW5ndGggPSBnZXRJbnQobGluRGljdCwgIkwiKSkgIT09IHN0cmVhbS5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgIkwiIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5ICcgKyAiZG9lcyBub3QgZXF1YWwgdGhlIHN0cmVhbSBsZW5ndGguIik7CiAgICB9CiAgICByZXR1cm4gewogICAgICBsZW5ndGgsCiAgICAgIGhpbnRzOiBnZXRIaW50cyhsaW5EaWN0KSwKICAgICAgb2JqZWN0TnVtYmVyRmlyc3Q6IGdldEludChsaW5EaWN0LCAiTyIpLAogICAgICBlbmRGaXJzdDogZ2V0SW50KGxpbkRpY3QsICJFIiksCiAgICAgIG51bVBhZ2VzOiBnZXRJbnQobGluRGljdCwgIk4iKSwKICAgICAgbWFpblhSZWZFbnRyaWVzT2Zmc2V0OiBnZXRJbnQobGluRGljdCwgIlQiKSwKICAgICAgcGFnZUZpcnN0OiBsaW5EaWN0LmhhcygiUCIpID8gZ2V0SW50KGxpbkRpY3QsICJQIiwgdHJ1ZSkgOiAwCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY21hcC5qcwoKCgoKCgoKY29uc3QgQlVJTFRfSU5fQ01BUFMgPSBbIkFkb2JlLUdCMS1VQ1MyIiwgIkFkb2JlLUNOUzEtVUNTMiIsICJBZG9iZS1KYXBhbjEtVUNTMiIsICJBZG9iZS1Lb3JlYTEtVUNTMiIsICI3OC1FVUMtSCIsICI3OC1FVUMtViIsICI3OC1IIiwgIjc4LVJLU0otSCIsICI3OC1SS1NKLVYiLCAiNzgtViIsICI3OG1zLVJLU0otSCIsICI3OG1zLVJLU0otViIsICI4M3B2LVJLU0otSCIsICI5MG1zLVJLU0otSCIsICI5MG1zLVJLU0otViIsICI5MG1zcC1SS1NKLUgiLCAiOTBtc3AtUktTSi1WIiwgIjkwcHYtUktTSi1IIiwgIjkwcHYtUktTSi1WIiwgIkFkZC1IIiwgIkFkZC1SS1NKLUgiLCAiQWRkLVJLU0otViIsICJBZGQtViIsICJBZG9iZS1DTlMxLTAiLCAiQWRvYmUtQ05TMS0xIiwgIkFkb2JlLUNOUzEtMiIsICJBZG9iZS1DTlMxLTMiLCAiQWRvYmUtQ05TMS00IiwgIkFkb2JlLUNOUzEtNSIsICJBZG9iZS1DTlMxLTYiLCAiQWRvYmUtR0IxLTAiLCAiQWRvYmUtR0IxLTEiLCAiQWRvYmUtR0IxLTIiLCAiQWRvYmUtR0IxLTMiLCAiQWRvYmUtR0IxLTQiLCAiQWRvYmUtR0IxLTUiLCAiQWRvYmUtSmFwYW4xLTAiLCAiQWRvYmUtSmFwYW4xLTEiLCAiQWRvYmUtSmFwYW4xLTIiLCAiQWRvYmUtSmFwYW4xLTMiLCAiQWRvYmUtSmFwYW4xLTQiLCAiQWRvYmUtSmFwYW4xLTUiLCAiQWRvYmUtSmFwYW4xLTYiLCAiQWRvYmUtS29yZWExLTAiLCAiQWRvYmUtS29yZWExLTEiLCAiQWRvYmUtS29yZWExLTIiLCAiQjUtSCIsICJCNS1WIiwgIkI1cGMtSCIsICJCNXBjLVYiLCAiQ05TLUVVQy1IIiwgIkNOUy1FVUMtViIsICJDTlMxLUgiLCAiQ05TMS1WIiwgIkNOUzItSCIsICJDTlMyLVYiLCAiRVRISy1CNS1IIiwgIkVUSEstQjUtViIsICJFVGVuLUI1LUgiLCAiRVRlbi1CNS1WIiwgIkVUZW5tcy1CNS1IIiwgIkVUZW5tcy1CNS1WIiwgIkVVQy1IIiwgIkVVQy1WIiwgIkV4dC1IIiwgIkV4dC1SS1NKLUgiLCAiRXh0LVJLU0otViIsICJFeHQtViIsICJHQi1FVUMtSCIsICJHQi1FVUMtViIsICJHQi1IIiwgIkdCLVYiLCAiR0JLLUVVQy1IIiwgIkdCSy1FVUMtViIsICJHQksySy1IIiwgIkdCSzJLLVYiLCAiR0JLcC1FVUMtSCIsICJHQktwLUVVQy1WIiwgIkdCVC1FVUMtSCIsICJHQlQtRVVDLVYiLCAiR0JULUgiLCAiR0JULVYiLCAiR0JUcGMtRVVDLUgiLCAiR0JUcGMtRVVDLVYiLCAiR0JwYy1FVUMtSCIsICJHQnBjLUVVQy1WIiwgIkgiLCAiSEtkbGEtQjUtSCIsICJIS2RsYS1CNS1WIiwgIkhLZGxiLUI1LUgiLCAiSEtkbGItQjUtViIsICJIS2djY3MtQjUtSCIsICJIS2djY3MtQjUtViIsICJIS20zMTQtQjUtSCIsICJIS20zMTQtQjUtViIsICJIS200NzEtQjUtSCIsICJIS200NzEtQjUtViIsICJIS3Njcy1CNS1IIiwgIkhLc2NzLUI1LVYiLCAiSGFua2FrdSIsICJIaXJhZ2FuYSIsICJLU0MtRVVDLUgiLCAiS1NDLUVVQy1WIiwgIktTQy1IIiwgIktTQy1Kb2hhYi1IIiwgIktTQy1Kb2hhYi1WIiwgIktTQy1WIiwgIktTQ21zLVVIQy1IIiwgIktTQ21zLVVIQy1IVy1IIiwgIktTQ21zLVVIQy1IVy1WIiwgIktTQ21zLVVIQy1WIiwgIktTQ3BjLUVVQy1IIiwgIktTQ3BjLUVVQy1WIiwgIkthdGFrYW5hIiwgIk5XUC1IIiwgIk5XUC1WIiwgIlJLU0otSCIsICJSS1NKLVYiLCAiUm9tYW4iLCAiVW5pQ05TLVVDUzItSCIsICJVbmlDTlMtVUNTMi1WIiwgIlVuaUNOUy1VVEYxNi1IIiwgIlVuaUNOUy1VVEYxNi1WIiwgIlVuaUNOUy1VVEYzMi1IIiwgIlVuaUNOUy1VVEYzMi1WIiwgIlVuaUNOUy1VVEY4LUgiLCAiVW5pQ05TLVVURjgtViIsICJVbmlHQi1VQ1MyLUgiLCAiVW5pR0ItVUNTMi1WIiwgIlVuaUdCLVVURjE2LUgiLCAiVW5pR0ItVVRGMTYtViIsICJVbmlHQi1VVEYzMi1IIiwgIlVuaUdCLVVURjMyLVYiLCAiVW5pR0ItVVRGOC1IIiwgIlVuaUdCLVVURjgtViIsICJVbmlKSVMtVUNTMi1IIiwgIlVuaUpJUy1VQ1MyLUhXLUgiLCAiVW5pSklTLVVDUzItSFctViIsICJVbmlKSVMtVUNTMi1WIiwgIlVuaUpJUy1VVEYxNi1IIiwgIlVuaUpJUy1VVEYxNi1WIiwgIlVuaUpJUy1VVEYzMi1IIiwgIlVuaUpJUy1VVEYzMi1WIiwgIlVuaUpJUy1VVEY4LUgiLCAiVW5pSklTLVVURjgtViIsICJVbmlKSVMyMDA0LVVURjE2LUgiLCAiVW5pSklTMjAwNC1VVEYxNi1WIiwgIlVuaUpJUzIwMDQtVVRGMzItSCIsICJVbmlKSVMyMDA0LVVURjMyLVYiLCAiVW5pSklTMjAwNC1VVEY4LUgiLCAiVW5pSklTMjAwNC1VVEY4LVYiLCAiVW5pSklTUHJvLVVDUzItSFctViIsICJVbmlKSVNQcm8tVUNTMi1WIiwgIlVuaUpJU1Byby1VVEY4LVYiLCAiVW5pSklTWDAyMTMtVVRGMzItSCIsICJVbmlKSVNYMDIxMy1VVEYzMi1WIiwgIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1IIiwgIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1WIiwgIlVuaUtTLVVDUzItSCIsICJVbmlLUy1VQ1MyLVYiLCAiVW5pS1MtVVRGMTYtSCIsICJVbmlLUy1VVEYxNi1WIiwgIlVuaUtTLVVURjMyLUgiLCAiVW5pS1MtVVRGMzItViIsICJVbmlLUy1VVEY4LUgiLCAiVW5pS1MtVVRGOC1WIiwgIlYiLCAiV1AtU3ltYm9sIl07CmNvbnN0IE1BWF9NQVBfUkFOR0UgPSAyICoqIDI0IC0gMTsKY2xhc3MgQ01hcCB7CiAgY29uc3RydWN0b3IoYnVpbHRJbkNNYXAgPSBmYWxzZSkgewogICAgdGhpcy5jb2Rlc3BhY2VSYW5nZXMgPSBbW10sIFtdLCBbXSwgW11dOwogICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMgPSAwOwogICAgdGhpcy5fbWFwID0gW107CiAgICB0aGlzLm5hbWUgPSAiIjsKICAgIHRoaXMudmVydGljYWwgPSBmYWxzZTsKICAgIHRoaXMudXNlQ01hcCA9IG51bGw7CiAgICB0aGlzLmJ1aWx0SW5DTWFwID0gYnVpbHRJbkNNYXA7CiAgfQogIGFkZENvZGVzcGFjZVJhbmdlKG4sIGxvdywgaGlnaCkgewogICAgdGhpcy5jb2Rlc3BhY2VSYW5nZXNbbiAtIDFdLnB1c2gobG93LCBoaWdoKTsKICAgIHRoaXMubnVtQ29kZXNwYWNlUmFuZ2VzKys7CiAgfQogIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CiAgICBpZiAoaGlnaCAtIGxvdyA+IE1BWF9NQVBfUkFOR0UpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJtYXBDaWRSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTsKICAgIH0KICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewogICAgICB0aGlzLl9tYXBbbG93KytdID0gZHN0TG93Kys7CiAgICB9CiAgfQogIG1hcEJmUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKICAgIGlmIChoaWdoIC0gbG93ID4gTUFYX01BUF9SQU5HRSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7CiAgICB9CiAgICBjb25zdCBsYXN0Qnl0ZSA9IGRzdExvdy5sZW5ndGggLSAxOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgIHRoaXMuX21hcFtsb3crK10gPSBkc3RMb3c7CiAgICAgIGNvbnN0IG5leHRDaGFyQ29kZSA9IGRzdExvdy5jaGFyQ29kZUF0KGxhc3RCeXRlKSArIDE7CiAgICAgIGlmIChuZXh0Q2hhckNvZGUgPiAweGZmKSB7CiAgICAgICAgZHN0TG93ID0gZHN0TG93LnN1YnN0cmluZygwLCBsYXN0Qnl0ZSAtIDEpICsgU3RyaW5nLmZyb21DaGFyQ29kZShkc3RMb3cuY2hhckNvZGVBdChsYXN0Qnl0ZSAtIDEpICsgMSkgKyAiXHgwMCI7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZHN0TG93ID0gZHN0TG93LnN1YnN0cmluZygwLCBsYXN0Qnl0ZSkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSk7CiAgICB9CiAgfQogIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHsKICAgIGlmIChoaWdoIC0gbG93ID4gTUFYX01BUF9SQU5HRSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2VUb0FycmF5IC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpOwogICAgfQogICAgY29uc3QgaWkgPSBhcnJheS5sZW5ndGg7CiAgICBsZXQgaSA9IDA7CiAgICB3aGlsZSAobG93IDw9IGhpZ2ggJiYgaSA8IGlpKSB7CiAgICAgIHRoaXMuX21hcFtsb3ddID0gYXJyYXlbaSsrXTsKICAgICAgKytsb3c7CiAgICB9CiAgfQogIG1hcE9uZShzcmMsIGRzdCkgewogICAgdGhpcy5fbWFwW3NyY10gPSBkc3Q7CiAgfQogIGxvb2t1cChjb2RlKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdOwogIH0KICBjb250YWlucyhjb2RlKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdICE9PSB1bmRlZmluZWQ7CiAgfQogIGZvckVhY2goY2FsbGJhY2spIHsKICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKICAgIGNvbnN0IGxlbmd0aCA9IG1hcC5sZW5ndGg7CiAgICBpZiAobGVuZ3RoIDw9IDB4MTAwMDApIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIGlmIChtYXBbaV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY2FsbGJhY2soaSwgbWFwW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoY29uc3QgaSBpbiBtYXApIHsKICAgICAgICBjYWxsYmFjayhpLCBtYXBbaV0pOwogICAgICB9CiAgICB9CiAgfQogIGNoYXJDb2RlT2YodmFsdWUpIHsKICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKICAgIGlmIChtYXAubGVuZ3RoIDw9IDB4MTAwMDApIHsKICAgICAgcmV0dXJuIG1hcC5pbmRleE9mKHZhbHVlKTsKICAgIH0KICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gbWFwKSB7CiAgICAgIGlmIChtYXBbY2hhckNvZGVdID09PSB2YWx1ZSkgewogICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgZ2V0TWFwKCkgewogICAgcmV0dXJuIHRoaXMuX21hcDsKICB9CiAgcmVhZENoYXJDb2RlKHN0ciwgb2Zmc2V0LCBvdXQpIHsKICAgIGxldCBjID0gMDsKICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlcyA9IHRoaXMuY29kZXNwYWNlUmFuZ2VzOwogICAgZm9yIChsZXQgbiA9IDAsIG5uID0gY29kZXNwYWNlUmFuZ2VzLmxlbmd0aDsgbiA8IG5uOyBuKyspIHsKICAgICAgYyA9IChjIDw8IDggfCBzdHIuY2hhckNvZGVBdChvZmZzZXQgKyBuKSkgPj4+IDA7CiAgICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlID0gY29kZXNwYWNlUmFuZ2VzW25dOwogICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBjb2Rlc3BhY2VSYW5nZS5sZW5ndGg7IGsgPCBrazspIHsKICAgICAgICBjb25zdCBsb3cgPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGNvbnN0IGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGlmIChjID49IGxvdyAmJiBjIDw9IGhpZ2gpIHsKICAgICAgICAgIG91dC5jaGFyY29kZSA9IGM7CiAgICAgICAgICBvdXQubGVuZ3RoID0gbiArIDE7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBvdXQuY2hhcmNvZGUgPSAwOwogICAgb3V0Lmxlbmd0aCA9IDE7CiAgfQogIGdldENoYXJDb2RlTGVuZ3RoKGNoYXJDb2RlKSB7CiAgICBjb25zdCBjb2Rlc3BhY2VSYW5nZXMgPSB0aGlzLmNvZGVzcGFjZVJhbmdlczsKICAgIGZvciAobGV0IG4gPSAwLCBubiA9IGNvZGVzcGFjZVJhbmdlcy5sZW5ndGg7IG4gPCBubjsgbisrKSB7CiAgICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlID0gY29kZXNwYWNlUmFuZ2VzW25dOwogICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBjb2Rlc3BhY2VSYW5nZS5sZW5ndGg7IGsgPCBrazspIHsKICAgICAgICBjb25zdCBsb3cgPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGNvbnN0IGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGlmIChjaGFyQ29kZSA+PSBsb3cgJiYgY2hhckNvZGUgPD0gaGlnaCkgewogICAgICAgICAgcmV0dXJuIG4gKyAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDsKICB9CiAgZ2V0IGlzSWRlbnRpdHlDTWFwKCkgewogICAgaWYgKCEodGhpcy5uYW1lID09PSAiSWRlbnRpdHktSCIgfHwgdGhpcy5uYW1lID09PSAiSWRlbnRpdHktViIpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLl9tYXAubGVuZ3RoICE9PSAweDEwMDAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMHgxMDAwMDsgaSsrKSB7CiAgICAgIGlmICh0aGlzLl9tYXBbaV0gIT09IGkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBJZGVudGl0eUNNYXAgZXh0ZW5kcyBDTWFwIHsKICBjb25zdHJ1Y3Rvcih2ZXJ0aWNhbCwgbikgewogICAgc3VwZXIoKTsKICAgIHRoaXMudmVydGljYWwgPSB2ZXJ0aWNhbDsKICAgIHRoaXMuYWRkQ29kZXNwYWNlUmFuZ2UobiwgMCwgMHhmZmZmKTsKICB9CiAgbWFwQ2lkUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKICAgIHVucmVhY2hhYmxlKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkUmFuZ2UiKTsKICB9CiAgbWFwQmZSYW5nZShsb3csIGhpZ2gsIGRzdExvdykgewogICAgdW5yZWFjaGFibGUoInNob3VsZCBub3QgY2FsbCBtYXBCZlJhbmdlIik7CiAgfQogIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHsKICAgIHVucmVhY2hhYmxlKCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZVRvQXJyYXkiKTsKICB9CiAgbWFwT25lKHNyYywgZHN0KSB7CiAgICB1bnJlYWNoYWJsZSgic2hvdWxkIG5vdCBjYWxsIG1hcENpZE9uZSIpOwogIH0KICBsb29rdXAoY29kZSkgewogICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoY29kZSkgJiYgY29kZSA8PSAweGZmZmYgPyBjb2RlIDogdW5kZWZpbmVkOwogIH0KICBjb250YWlucyhjb2RlKSB7CiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihjb2RlKSAmJiBjb2RlIDw9IDB4ZmZmZjsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMHhmZmZmOyBpKyspIHsKICAgICAgY2FsbGJhY2soaSwgaSk7CiAgICB9CiAgfQogIGNoYXJDb2RlT2YodmFsdWUpIHsKICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA8PSAweGZmZmYgPyB2YWx1ZSA6IC0xOwogIH0KICBnZXRNYXAoKSB7CiAgICBjb25zdCBtYXAgPSBuZXcgQXJyYXkoMHgxMDAwMCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAweGZmZmY7IGkrKykgewogICAgICBtYXBbaV0gPSBpOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiAweDEwMDAwOwogIH0KICBnZXQgaXNJZGVudGl0eUNNYXAoKSB7CiAgICB1bnJlYWNoYWJsZSgic2hvdWxkIG5vdCBhY2Nlc3MgLmlzSWRlbnRpdHlDTWFwIik7CiAgfQp9CmZ1bmN0aW9uIHN0clRvSW50KHN0cikgewogIGxldCBhID0gMDsKICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgYSA9IGEgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KGkpOwogIH0KICByZXR1cm4gYSA+Pj4gMDsKfQpmdW5jdGlvbiBleHBlY3RTdHJpbmcob2JqKSB7CiAgaWYgKHR5cGVvZiBvYmogIT09ICJzdHJpbmciKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBzdHJpbmcuIik7CiAgfQp9CmZ1bmN0aW9uIGV4cGVjdEludChvYmopIHsKICBpZiAoIU51bWJlci5pc0ludGVnZXIob2JqKSkgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJNYWxmb3JtZWQgQ01hcDogZXhwZWN0ZWQgaW50LiIpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUJmQ2hhcihjTWFwLCBsZXhlcikgewogIHdoaWxlICh0cnVlKSB7CiAgICBsZXQgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAob2JqID09PSBFT0YpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaXNDbWQob2JqLCAiZW5kYmZjaGFyIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBzcmMgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IGRzdCA9IG9iajsKICAgIGNNYXAubWFwT25lKHNyYywgZHN0KTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc0NtZChvYmosICJlbmRiZnJhbmdlIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBsb3cgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IGhpZ2ggPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopIHx8IHR5cGVvZiBvYmogPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IGRzdExvdyA9IE51bWJlci5pc0ludGVnZXIob2JqKSA/IFN0cmluZy5mcm9tQ2hhckNvZGUob2JqKSA6IG9iajsKICAgICAgY01hcC5tYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTsKICAgIH0gZWxzZSBpZiAoaXNDbWQob2JqLCAiWyIpKSB7CiAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgICBjb25zdCBhcnJheSA9IFtdOwogICAgICB3aGlsZSAoIWlzQ21kKG9iaiwgIl0iKSAmJiBvYmogIT09IEVPRikgewogICAgICAgIGFycmF5LnB1c2gob2JqKTsKICAgICAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgICAgfQogICAgICBjTWFwLm1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpOwogICAgfSBlbHNlIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBiZiByYW5nZS4iKTsKfQpmdW5jdGlvbiBwYXJzZUNpZENoYXIoY01hcCwgbGV4ZXIpIHsKICB3aGlsZSAodHJ1ZSkgewogICAgbGV0IG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgaWYgKG9iaiA9PT0gRU9GKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGlzQ21kKG9iaiwgImVuZGNpZGNoYXIiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IHNyYyA9IHN0clRvSW50KG9iaik7CiAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGV4cGVjdEludChvYmopOwogICAgY29uc3QgZHN0ID0gb2JqOwogICAgY01hcC5tYXBPbmUoc3JjLCBkc3QpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUNpZFJhbmdlKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc0NtZChvYmosICJlbmRjaWRyYW5nZSIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGV4cGVjdFN0cmluZyhvYmopOwogICAgY29uc3QgbG93ID0gc3RyVG9JbnQob2JqKTsKICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBoaWdoID0gc3RyVG9JbnQob2JqKTsKICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgZXhwZWN0SW50KG9iaik7CiAgICBjb25zdCBkc3RMb3cgPSBvYmo7CiAgICBjTWFwLm1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VDb2Rlc3BhY2VSYW5nZShjTWFwLCBsZXhlcikgewogIHdoaWxlICh0cnVlKSB7CiAgICBsZXQgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAob2JqID09PSBFT0YpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaXNDbWQob2JqLCAiZW5kY29kZXNwYWNlcmFuZ2UiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodHlwZW9mIG9iaiAhPT0gInN0cmluZyIpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBsb3cgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAodHlwZW9mIG9iaiAhPT0gInN0cmluZyIpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBoaWdoID0gc3RyVG9JbnQob2JqKTsKICAgIGNNYXAuYWRkQ29kZXNwYWNlUmFuZ2Uob2JqLmxlbmd0aCwgbG93LCBoaWdoKTsKICB9CiAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIGNvZGVzcGFjZSByYW5nZS4iKTsKfQpmdW5jdGlvbiBwYXJzZVdNb2RlKGNNYXAsIGxleGVyKSB7CiAgY29uc3Qgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSkgewogICAgY01hcC52ZXJ0aWNhbCA9ICEhb2JqOwogIH0KfQpmdW5jdGlvbiBwYXJzZUNNYXBOYW1lKGNNYXAsIGxleGVyKSB7CiAgY29uc3Qgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgIGNNYXAubmFtZSA9IG9iai5uYW1lOwogIH0KfQphc3luYyBmdW5jdGlvbiBwYXJzZUNNYXAoY01hcCwgbGV4ZXIsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApIHsKICBsZXQgcHJldmlvdXMsIGVtYmVkZGVkVXNlQ01hcDsKICBvYmpMb29wOiB3aGlsZSAodHJ1ZSkgewogICAgdHJ5IHsKICAgICAgY29uc3Qgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICAgIGlmIChvYmogPT09IEVPRikgewogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBpZiAob2JqLm5hbWUgPT09ICJXTW9kZSIpIHsKICAgICAgICAgIHBhcnNlV01vZGUoY01hcCwgbGV4ZXIpOwogICAgICAgIH0gZWxzZSBpZiAob2JqLm5hbWUgPT09ICJDTWFwTmFtZSIpIHsKICAgICAgICAgIHBhcnNlQ01hcE5hbWUoY01hcCwgbGV4ZXIpOwogICAgICAgIH0KICAgICAgICBwcmV2aW91cyA9IG9iajsKICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDbWQpIHsKICAgICAgICBzd2l0Y2ggKG9iai5jbWQpIHsKICAgICAgICAgIGNhc2UgImVuZGNtYXAiOgogICAgICAgICAgICBicmVhayBvYmpMb29wOwogICAgICAgICAgY2FzZSAidXNlY21hcCI6CiAgICAgICAgICAgIGlmIChwcmV2aW91cyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICBlbWJlZGRlZFVzZUNNYXAgPSBwcmV2aW91cy5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYmVnaW5jb2Rlc3BhY2VyYW5nZSI6CiAgICAgICAgICAgIHBhcnNlQ29kZXNwYWNlUmFuZ2UoY01hcCwgbGV4ZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJlZ2luYmZjaGFyIjoKICAgICAgICAgICAgcGFyc2VCZkNoYXIoY01hcCwgbGV4ZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJlZ2luY2lkY2hhciI6CiAgICAgICAgICAgIHBhcnNlQ2lkQ2hhcihjTWFwLCBsZXhlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYmVnaW5iZnJhbmdlIjoKICAgICAgICAgICAgcGFyc2VCZlJhbmdlKGNNYXAsIGxleGVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJiZWdpbmNpZHJhbmdlIjoKICAgICAgICAgICAgcGFyc2VDaWRSYW5nZShjTWFwLCBsZXhlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKCJJbnZhbGlkIGNNYXAgZGF0YTogIiArIGV4KTsKICAgICAgY29udGludWU7CiAgICB9CiAgfQogIGlmICghdXNlQ01hcCAmJiBlbWJlZGRlZFVzZUNNYXApIHsKICAgIHVzZUNNYXAgPSBlbWJlZGRlZFVzZUNNYXA7CiAgfQogIGlmICh1c2VDTWFwKSB7CiAgICByZXR1cm4gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKTsKICB9CiAgcmV0dXJuIGNNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKSB7CiAgY01hcC51c2VDTWFwID0gYXdhaXQgY3JlYXRlQnVpbHRJbkNNYXAodXNlQ01hcCwgZmV0Y2hCdWlsdEluQ01hcCk7CiAgaWYgKGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID09PSAwKSB7CiAgICBjb25zdCB1c2VDb2Rlc3BhY2VSYW5nZXMgPSBjTWFwLnVzZUNNYXAuY29kZXNwYWNlUmFuZ2VzOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VDb2Rlc3BhY2VSYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgY01hcC5jb2Rlc3BhY2VSYW5nZXNbaV0gPSB1c2VDb2Rlc3BhY2VSYW5nZXNbaV0uc2xpY2UoKTsKICAgIH0KICAgIGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID0gY01hcC51c2VDTWFwLm51bUNvZGVzcGFjZVJhbmdlczsKICB9CiAgY01hcC51c2VDTWFwLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgIGlmICghY01hcC5jb250YWlucyhrZXkpKSB7CiAgICAgIGNNYXAubWFwT25lKGtleSwgdmFsdWUpOwogICAgfQogIH0pOwogIHJldHVybiBjTWFwOwp9CmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUJ1aWx0SW5DTWFwKG5hbWUsIGZldGNoQnVpbHRJbkNNYXApIHsKICBpZiAobmFtZSA9PT0gIklkZW50aXR5LUgiKSB7CiAgICByZXR1cm4gbmV3IElkZW50aXR5Q01hcChmYWxzZSwgMik7CiAgfSBlbHNlIGlmIChuYW1lID09PSAiSWRlbnRpdHktViIpIHsKICAgIHJldHVybiBuZXcgSWRlbnRpdHlDTWFwKHRydWUsIDIpOwogIH0KICBpZiAoIUJVSUxUX0lOX0NNQVBTLmluY2x1ZGVzKG5hbWUpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gQ01hcCBuYW1lOiAiICsgbmFtZSk7CiAgfQogIGlmICghZmV0Y2hCdWlsdEluQ01hcCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJCdWlsdC1pbiBDTWFwIHBhcmFtZXRlcnMgYXJlIG5vdCBwcm92aWRlZC4iKTsKICB9CiAgY29uc3QgewogICAgY01hcERhdGEsCiAgICBpc0NvbXByZXNzZWQKICB9ID0gYXdhaXQgZmV0Y2hCdWlsdEluQ01hcChuYW1lKTsKICBjb25zdCBjTWFwID0gbmV3IENNYXAodHJ1ZSk7CiAgaWYgKGlzQ29tcHJlc3NlZCkgewogICAgcmV0dXJuIG5ldyBCaW5hcnlDTWFwUmVhZGVyKCkucHJvY2VzcyhjTWFwRGF0YSwgY01hcCwgdXNlQ01hcCA9PiBleHRlbmRDTWFwKGNNYXAsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApKTsKICB9CiAgY29uc3QgbGV4ZXIgPSBuZXcgTGV4ZXIobmV3IFN0cmVhbShjTWFwRGF0YSkpOwogIHJldHVybiBwYXJzZUNNYXAoY01hcCwgbGV4ZXIsIGZldGNoQnVpbHRJbkNNYXAsIG51bGwpOwp9CmNsYXNzIENNYXBGYWN0b3J5IHsKICBzdGF0aWMgYXN5bmMgY3JlYXRlKHsKICAgIGVuY29kaW5nLAogICAgZmV0Y2hCdWlsdEluQ01hcCwKICAgIHVzZUNNYXAKICB9KSB7CiAgICBpZiAoZW5jb2RpbmcgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHJldHVybiBjcmVhdGVCdWlsdEluQ01hcChlbmNvZGluZy5uYW1lLCBmZXRjaEJ1aWx0SW5DTWFwKTsKICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIGNvbnN0IHBhcnNlZENNYXAgPSBhd2FpdCBwYXJzZUNNYXAobmV3IENNYXAoKSwgbmV3IExleGVyKGVuY29kaW5nKSwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCk7CiAgICAgIGlmIChwYXJzZWRDTWFwLmlzSWRlbnRpdHlDTWFwKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0SW5DTWFwKHBhcnNlZENNYXAubmFtZSwgZmV0Y2hCdWlsdEluQ01hcCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlZENNYXA7CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoIkVuY29kaW5nIHJlcXVpcmVkLiIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY2hhcnNldHMuanMKY29uc3QgSVNPQWRvYmVDaGFyc2V0ID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgInF1ZXN0aW9uZG93biIsICJncmF2ZSIsICJhY3V0ZSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAiZGllcmVzaXMiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIkFFIiwgIm9yZGZlbWluaW5lIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsICJvbmVzdXBlcmlvciIsICJsb2dpY2Fsbm90IiwgIm11IiwgInRyYWRlbWFyayIsICJFdGgiLCAib25laGFsZiIsICJwbHVzbWludXMiLCAiVGhvcm4iLCAib25lcXVhcnRlciIsICJkaXZpZGUiLCAiYnJva2VuYmFyIiwgImRlZ3JlZSIsICJ0aG9ybiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInR3b3N1cGVyaW9yIiwgInJlZ2lzdGVyZWQiLCAibWludXMiLCAiZXRoIiwgIm11bHRpcGx5IiwgInRocmVlc3VwZXJpb3IiLCAiY29weXJpZ2h0IiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBZGllcmVzaXMiLCAiQWdyYXZlIiwgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJOdGlsZGUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk9kaWVyZXNpcyIsICJPZ3JhdmUiLCAiT3RpbGRlIiwgIlNjYXJvbiIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIlVncmF2ZSIsICJZYWN1dGUiLCAiWWRpZXJlc2lzIiwgIlpjYXJvbiIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImFncmF2ZSIsICJhcmluZyIsICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJlZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJpZ3JhdmUiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib2dyYXZlIiwgIm90aWxkZSIsICJzY2Fyb24iLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ1Z3JhdmUiLCAieWFjdXRlIiwgInlkaWVyZXNpcyIsICJ6Y2Fyb24iXTsKY29uc3QgRXhwZXJ0Q2hhcnNldCA9IFsiLm5vdGRlZiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsICJBY3V0ZXNtYWxsIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiY29tbWFzdXBlcmlvciIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgInBlcmlvZHN1cGVyaW9yIiwgInF1ZXN0aW9uc21hbGwiLCAiYXN1cGVyaW9yIiwgImJzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgImVzdXBlcmlvciIsICJpc3VwZXJpb3IiLCAibHN1cGVyaW9yIiwgIm1zdXBlcmlvciIsICJuc3VwZXJpb3IiLCAib3N1cGVyaW9yIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgImZmIiwgImZpIiwgImZsIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCAicGFyZW5yaWdodGluZmVyaW9yIiwgIkNpcmN1bWZsZXhzbWFsbCIsICJoeXBoZW5zdXBlcmlvciIsICJHcmF2ZXNtYWxsIiwgIkFzbWFsbCIsICJCc21hbGwiLCAiQ3NtYWxsIiwgIkRzbWFsbCIsICJFc21hbGwiLCAiRnNtYWxsIiwgIkdzbWFsbCIsICJIc21hbGwiLCAiSXNtYWxsIiwgIkpzbWFsbCIsICJLc21hbGwiLCAiTHNtYWxsIiwgIk1zbWFsbCIsICJOc21hbGwiLCAiT3NtYWxsIiwgIlBzbWFsbCIsICJRc21hbGwiLCAiUnNtYWxsIiwgIlNzbWFsbCIsICJUc21hbGwiLCAiVXNtYWxsIiwgIlZzbWFsbCIsICJXc21hbGwiLCAiWHNtYWxsIiwgIllzbWFsbCIsICJac21hbGwiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgIlRpbGRlc21hbGwiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICJTY2Fyb25zbWFsbCIsICJaY2Fyb25zbWFsbCIsICJEaWVyZXNpc3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiQ2Fyb25zbWFsbCIsICJEb3RhY2NlbnRzbWFsbCIsICJNYWNyb25zbWFsbCIsICJmaWd1cmVkYXNoIiwgImh5cGhlbmluZmVyaW9yIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgInplcm9zdXBlcmlvciIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiLCAiQWdyYXZlc21hbGwiLCAiQWFjdXRlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkFFc21hbGwiLCAiQ2NlZGlsbGFzbWFsbCIsICJFZ3JhdmVzbWFsbCIsICJFYWN1dGVzbWFsbCIsICJFY2lyY3VtZmxleHNtYWxsIiwgIkVkaWVyZXNpc3NtYWxsIiwgIklncmF2ZXNtYWxsIiwgIklhY3V0ZXNtYWxsIiwgIkljaXJjdW1mbGV4c21hbGwiLCAiSWRpZXJlc2lzc21hbGwiLCAiRXRoc21hbGwiLCAiTnRpbGRlc21hbGwiLCAiT2dyYXZlc21hbGwiLCAiT2FjdXRlc21hbGwiLCAiT2NpcmN1bWZsZXhzbWFsbCIsICJPdGlsZGVzbWFsbCIsICJPZGllcmVzaXNzbWFsbCIsICJPRXNtYWxsIiwgIk9zbGFzaHNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVhY3V0ZXNtYWxsIiwgIlVjaXJjdW1mbGV4c21hbGwiLCAiVWRpZXJlc2lzc21hbGwiLCAiWWFjdXRlc21hbGwiLCAiVGhvcm5zbWFsbCIsICJZZGllcmVzaXNzbWFsbCJdOwpjb25zdCBFeHBlcnRTdWJzZXRDaGFyc2V0ID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImRvbGxhcm9sZHN0eWxlIiwgImRvbGxhcnN1cGVyaW9yIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiY29tbWFzdXBlcmlvciIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgInBlcmlvZHN1cGVyaW9yIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJoeXBoZW5zdXBlcmlvciIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiY2VudG9sZHN0eWxlIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuaW5mZXJpb3IiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgInplcm9zdXBlcmlvciIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiXTsKCjsvLyAuL3NyYy9jb3JlL2VuY29kaW5ncy5qcwpjb25zdCBFeHBlcnRFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICIiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgIiIsICJhc3VwZXJpb3IiLCAiYnN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgIiIsICIiLCAiIiwgImlzdXBlcmlvciIsICIiLCAiIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICIiLCAiIiwgInJzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgIiIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgIiIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbnN1cGVyaW9yIiwgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiZXhjbGFtZG93bnNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJMc2xhc2hzbWFsbCIsICIiLCAiIiwgIlNjYXJvbnNtYWxsIiwgIlpjYXJvbnNtYWxsIiwgIkRpZXJlc2lzc21hbGwiLCAiQnJldmVzbWFsbCIsICJDYXJvbnNtYWxsIiwgIiIsICJEb3RhY2NlbnRzbWFsbCIsICIiLCAiIiwgIk1hY3JvbnNtYWxsIiwgIiIsICIiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICIiLCAiIiwgIk9nb25la3NtYWxsIiwgIlJpbmdzbWFsbCIsICJDZWRpbGxhc21hbGwiLCAiIiwgIiIsICIiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgIiIsICIiLCAiemVyb3N1cGVyaW9yIiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsICJvbmVpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgIm5pbmVpbmZlcmlvciIsICJjZW50aW5mZXJpb3IiLCAiZG9sbGFyaW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiY29tbWFpbmZlcmlvciIsICJBZ3JhdmVzbWFsbCIsICJBYWN1dGVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkFyaW5nc21hbGwiLCAiQUVzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk90aWxkZXNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICJZYWN1dGVzbWFsbCIsICJUaG9ybnNtYWxsIiwgIllkaWVyZXNpc3NtYWxsIl07CmNvbnN0IE1hY0V4cGVydEVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbXNtYWxsIiwgIkh1bmdhcnVtbGF1dHNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsICJBY3V0ZXNtYWxsIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiIiwgInRocmVlcXVhcnRlcnNlbWRhc2giLCAiIiwgInF1ZXN0aW9uc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIkV0aHNtYWxsIiwgIiIsICIiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgImZmIiwgImZpIiwgImZsIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCAiIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuaW5mZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgIiIsICIiLCAiYXN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICIiLCAiIiwgIiIsICIiLCAiQWFjdXRlc21hbGwiLCAiQWdyYXZlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkNjZWRpbGxhc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWdyYXZlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsICJJYWN1dGVzbWFsbCIsICJJZ3JhdmVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIk50aWxkZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9ncmF2ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT2RpZXJlc2lzc21hbGwiLCAiT3RpbGRlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICIiLCAiZWlnaHRzdXBlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiU2Nhcm9uc21hbGwiLCAiIiwgImNlbnRpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICIiLCAiRGllcmVzaXNzbWFsbCIsICIiLCAiQ2Fyb25zbWFsbCIsICJvc3VwZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgIiIsICJjb21tYWluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgIllhY3V0ZXNtYWxsIiwgIiIsICJkb2xsYXJpbmZlcmlvciIsICIiLCAiIiwgIlRob3Juc21hbGwiLCAiIiwgIm5pbmVpbmZlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAiWmNhcm9uc21hbGwiLCAiQUVzbWFsbCIsICJPc2xhc2hzbWFsbCIsICJxdWVzdGlvbmRvd25zbWFsbCIsICJvbmVpbmZlcmlvciIsICJMc2xhc2hzbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJDZWRpbGxhc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJPRXNtYWxsIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuc3VwZXJpb3IiLCAiIiwgIiIsICIiLCAiIiwgImV4Y2xhbWRvd25zbWFsbCIsICIiLCAiWWRpZXJlc2lzc21hbGwiLCAiIiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvc3VwZXJpb3IiLCAiIiwgImVzdXBlcmlvciIsICJyc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgIiIsICIiLCAiaXN1cGVyaW9yIiwgInNzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJsc3VwZXJpb3IiLCAiT2dvbmVrc21hbGwiLCAiQnJldmVzbWFsbCIsICJNYWNyb25zbWFsbCIsICJic3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm1zdXBlcmlvciIsICJjb21tYXN1cGVyaW9yIiwgInBlcmlvZHN1cGVyaW9yIiwgIkRvdGFjY2VudHNtYWxsIiwgIlJpbmdzbWFsbCIsICIiLCAiIiwgIiIsICIiXTsKY29uc3QgTWFjUm9tYW5FbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICIiLCAiQWRpZXJlc2lzIiwgIkFyaW5nIiwgIkNjZWRpbGxhIiwgIkVhY3V0ZSIsICJOdGlsZGUiLCAiT2RpZXJlc2lzIiwgIlVkaWVyZXNpcyIsICJhYWN1dGUiLCAiYWdyYXZlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhdGlsZGUiLCAiYXJpbmciLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVncmF2ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiaWFjdXRlIiwgImlncmF2ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvZ3JhdmUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwgIm90aWxkZSIsICJ1YWN1dGUiLCAidWdyYXZlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJkYWdnZXIiLCAiZGVncmVlIiwgImNlbnQiLCAic3RlcmxpbmciLCAic2VjdGlvbiIsICJidWxsZXQiLCAicGFyYWdyYXBoIiwgImdlcm1hbmRibHMiLCAicmVnaXN0ZXJlZCIsICJjb3B5cmlnaHQiLCAidHJhZGVtYXJrIiwgImFjdXRlIiwgImRpZXJlc2lzIiwgIm5vdGVxdWFsIiwgIkFFIiwgIk9zbGFzaCIsICJpbmZpbml0eSIsICJwbHVzbWludXMiLCAibGVzc2VxdWFsIiwgImdyZWF0ZXJlcXVhbCIsICJ5ZW4iLCAibXUiLCAicGFydGlhbGRpZmYiLCAic3VtbWF0aW9uIiwgInByb2R1Y3QiLCAicGkiLCAiaW50ZWdyYWwiLCAib3JkZmVtaW5pbmUiLCAib3JkbWFzY3VsaW5lIiwgIk9tZWdhIiwgImFlIiwgIm9zbGFzaCIsICJxdWVzdGlvbmRvd24iLCAiZXhjbGFtZG93biIsICJsb2dpY2Fsbm90IiwgInJhZGljYWwiLCAiZmxvcmluIiwgImFwcHJveGVxdWFsIiwgIkRlbHRhIiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAic3BhY2UiLCAiQWdyYXZlIiwgIkF0aWxkZSIsICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJkaXZpZGUiLCAibG96ZW5nZSIsICJ5ZGllcmVzaXMiLCAiWWRpZXJlc2lzIiwgImZyYWN0aW9uIiwgImN1cnJlbmN5IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJwZXJ0aG91c2FuZCIsICJBY2lyY3VtZmxleCIsICJFY2lyY3VtZmxleCIsICJBYWN1dGUiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiYXBwbGUiLCAiT2dyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZ3JhdmUiLCAiZG90bGVzc2kiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIl07CmNvbnN0IFN0YW5kYXJkRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3RlcmlnaHQiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgInF1b3RlbGVmdCIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICIiLCAiZW5kYXNoIiwgImRhZ2dlciIsICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAiIiwgInBhcmFncmFwaCIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInF1b3RlZGJscmlnaHQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAicGVydGhvdXNhbmQiLCAiIiwgInF1ZXN0aW9uZG93biIsICIiLCAiZ3JhdmUiLCAiYWN1dGUiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgImRpZXJlc2lzIiwgIiIsICJyaW5nIiwgImNlZGlsbGEiLCAiIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJBRSIsICIiLCAib3JkZmVtaW5pbmUiLCAiIiwgIiIsICIiLCAiIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiYWUiLCAiIiwgIiIsICIiLCAiZG90bGVzc2kiLCAiIiwgIiIsICJsc2xhc2giLCAib3NsYXNoIiwgIm9lIiwgImdlcm1hbmRibHMiLCAiIiwgIiIsICIiLCAiIl07CmNvbnN0IFdpbkFuc2lFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJidWxsZXQiLCAiRXVybyIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAiZmxvcmluIiwgInF1b3RlZGJsYmFzZSIsICJlbGxpcHNpcyIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgImNpcmN1bWZsZXgiLCAicGVydGhvdXNhbmQiLCAiU2Nhcm9uIiwgImd1aWxzaW5nbGxlZnQiLCAiT0UiLCAiYnVsbGV0IiwgIlpjYXJvbiIsICJidWxsZXQiLCAiYnVsbGV0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgImJ1bGxldCIsICJlbmRhc2giLCAiZW1kYXNoIiwgInRpbGRlIiwgInRyYWRlbWFyayIsICJzY2Fyb24iLCAiZ3VpbHNpbmdscmlnaHQiLCAib2UiLCAiYnVsbGV0IiwgInpjYXJvbiIsICJZZGllcmVzaXMiLCAic3BhY2UiLCAiZXhjbGFtZG93biIsICJjZW50IiwgInN0ZXJsaW5nIiwgImN1cnJlbmN5IiwgInllbiIsICJicm9rZW5iYXIiLCAic2VjdGlvbiIsICJkaWVyZXNpcyIsICJjb3B5cmlnaHQiLCAib3JkZmVtaW5pbmUiLCAiZ3VpbGxlbW90bGVmdCIsICJsb2dpY2Fsbm90IiwgImh5cGhlbiIsICJyZWdpc3RlcmVkIiwgIm1hY3JvbiIsICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiYWN1dGUiLCAibXUiLCAicGFyYWdyYXBoIiwgInBlcmlvZGNlbnRlcmVkIiwgImNlZGlsbGEiLCAib25lc3VwZXJpb3IiLCAib3JkbWFzY3VsaW5lIiwgImd1aWxsZW1vdHJpZ2h0IiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93biIsICJBZ3JhdmUiLCAiQWFjdXRlIiwgIkFjaXJjdW1mbGV4IiwgIkF0aWxkZSIsICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQUUiLCAiQ2NlZGlsbGEiLCAiRWdyYXZlIiwgIkVhY3V0ZSIsICJFY2lyY3VtZmxleCIsICJFZGllcmVzaXMiLCAiSWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiRXRoIiwgIk50aWxkZSIsICJPZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk90aWxkZSIsICJPZGllcmVzaXMiLCAibXVsdGlwbHkiLCAiT3NsYXNoIiwgIlVncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIllhY3V0ZSIsICJUaG9ybiIsICJnZXJtYW5kYmxzIiwgImFncmF2ZSIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYXRpbGRlIiwgImFkaWVyZXNpcyIsICJhcmluZyIsICJhZSIsICJjY2VkaWxsYSIsICJlZ3JhdmUiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJldGgiLCAibnRpbGRlIiwgIm9ncmF2ZSIsICJvYWN1dGUiLCAib2NpcmN1bWZsZXgiLCAib3RpbGRlIiwgIm9kaWVyZXNpcyIsICJkaXZpZGUiLCAib3NsYXNoIiwgInVncmF2ZSIsICJ1YWN1dGUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgInlhY3V0ZSIsICJ0aG9ybiIsICJ5ZGllcmVzaXMiXTsKY29uc3QgU3ltYm9sU2V0RW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInVuaXZlcnNhbCIsICJudW1iZXJzaWduIiwgImV4aXN0ZW50aWFsIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInN1Y2h0aGF0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrbWF0aCIsICJwbHVzIiwgImNvbW1hIiwgIm1pbnVzIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiY29uZ3J1ZW50IiwgIkFscGhhIiwgIkJldGEiLCAiQ2hpIiwgIkRlbHRhIiwgIkVwc2lsb24iLCAiUGhpIiwgIkdhbW1hIiwgIkV0YSIsICJJb3RhIiwgInRoZXRhMSIsICJLYXBwYSIsICJMYW1iZGEiLCAiTXUiLCAiTnUiLCAiT21pY3JvbiIsICJQaSIsICJUaGV0YSIsICJSaG8iLCAiU2lnbWEiLCAiVGF1IiwgIlVwc2lsb24iLCAic2lnbWExIiwgIk9tZWdhIiwgIlhpIiwgIlBzaSIsICJaZXRhIiwgImJyYWNrZXRsZWZ0IiwgInRoZXJlZm9yZSIsICJicmFja2V0cmlnaHQiLCAicGVycGVuZGljdWxhciIsICJ1bmRlcnNjb3JlIiwgInJhZGljYWxleCIsICJhbHBoYSIsICJiZXRhIiwgImNoaSIsICJkZWx0YSIsICJlcHNpbG9uIiwgInBoaSIsICJnYW1tYSIsICJldGEiLCAiaW90YSIsICJwaGkxIiwgImthcHBhIiwgImxhbWJkYSIsICJtdSIsICJudSIsICJvbWljcm9uIiwgInBpIiwgInRoZXRhIiwgInJobyIsICJzaWdtYSIsICJ0YXUiLCAidXBzaWxvbiIsICJvbWVnYTEiLCAib21lZ2EiLCAieGkiLCAicHNpIiwgInpldGEiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgInNpbWlsYXIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiRXVybyIsICJVcHNpbG9uMSIsICJtaW51dGUiLCAibGVzc2VxdWFsIiwgImZyYWN0aW9uIiwgImluZmluaXR5IiwgImZsb3JpbiIsICJjbHViIiwgImRpYW1vbmQiLCAiaGVhcnQiLCAic3BhZGUiLCAiYXJyb3dib3RoIiwgImFycm93bGVmdCIsICJhcnJvd3VwIiwgImFycm93cmlnaHQiLCAiYXJyb3dkb3duIiwgImRlZ3JlZSIsICJwbHVzbWludXMiLCAic2Vjb25kIiwgImdyZWF0ZXJlcXVhbCIsICJtdWx0aXBseSIsICJwcm9wb3J0aW9uYWwiLCAicGFydGlhbGRpZmYiLCAiYnVsbGV0IiwgImRpdmlkZSIsICJub3RlcXVhbCIsICJlcXVpdmFsZW5jZSIsICJhcHByb3hlcXVhbCIsICJlbGxpcHNpcyIsICJhcnJvd3ZlcnRleCIsICJhcnJvd2hvcml6ZXgiLCAiY2FycmlhZ2VyZXR1cm4iLCAiYWxlcGgiLCAiSWZyYWt0dXIiLCAiUmZyYWt0dXIiLCAid2VpZXJzdHJhc3MiLCAiY2lyY2xlbXVsdGlwbHkiLCAiY2lyY2xlcGx1cyIsICJlbXB0eXNldCIsICJpbnRlcnNlY3Rpb24iLCAidW5pb24iLCAicHJvcGVyc3VwZXJzZXQiLCAicmVmbGV4c3VwZXJzZXQiLCAibm90c3Vic2V0IiwgInByb3BlcnN1YnNldCIsICJyZWZsZXhzdWJzZXQiLCAiZWxlbWVudCIsICJub3RlbGVtZW50IiwgImFuZ2xlIiwgImdyYWRpZW50IiwgInJlZ2lzdGVyc2VyaWYiLCAiY29weXJpZ2h0c2VyaWYiLCAidHJhZGVtYXJrc2VyaWYiLCAicHJvZHVjdCIsICJyYWRpY2FsIiwgImRvdG1hdGgiLCAibG9naWNhbG5vdCIsICJsb2dpY2FsYW5kIiwgImxvZ2ljYWxvciIsICJhcnJvd2RibGJvdGgiLCAiYXJyb3dkYmxsZWZ0IiwgImFycm93ZGJsdXAiLCAiYXJyb3dkYmxyaWdodCIsICJhcnJvd2RibGRvd24iLCAibG96ZW5nZSIsICJhbmdsZWxlZnQiLCAicmVnaXN0ZXJzYW5zIiwgImNvcHlyaWdodHNhbnMiLCAidHJhZGVtYXJrc2FucyIsICJzdW1tYXRpb24iLCAicGFyZW5sZWZ0dHAiLCAicGFyZW5sZWZ0ZXgiLCAicGFyZW5sZWZ0YnQiLCAiYnJhY2tldGxlZnR0cCIsICJicmFja2V0bGVmdGV4IiwgImJyYWNrZXRsZWZ0YnQiLCAiYnJhY2VsZWZ0dHAiLCAiYnJhY2VsZWZ0bWlkIiwgImJyYWNlbGVmdGJ0IiwgImJyYWNlZXgiLCAiIiwgImFuZ2xlcmlnaHQiLCAiaW50ZWdyYWwiLCAiaW50ZWdyYWx0cCIsICJpbnRlZ3JhbGV4IiwgImludGVncmFsYnQiLCAicGFyZW5yaWdodHRwIiwgInBhcmVucmlnaHRleCIsICJwYXJlbnJpZ2h0YnQiLCAiYnJhY2tldHJpZ2h0dHAiLCAiYnJhY2tldHJpZ2h0ZXgiLCAiYnJhY2tldHJpZ2h0YnQiLCAiYnJhY2VyaWdodHRwIiwgImJyYWNlcmlnaHRtaWQiLCAiYnJhY2VyaWdodGJ0IiwgIiJdOwpjb25zdCBaYXBmRGluZ2JhdHNFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJhMSIsICJhMiIsICJhMjAyIiwgImEzIiwgImE0IiwgImE1IiwgImExMTkiLCAiYTExOCIsICJhMTE3IiwgImExMSIsICJhMTIiLCAiYTEzIiwgImExNCIsICJhMTUiLCAiYTE2IiwgImExMDUiLCAiYTE3IiwgImExOCIsICJhMTkiLCAiYTIwIiwgImEyMSIsICJhMjIiLCAiYTIzIiwgImEyNCIsICJhMjUiLCAiYTI2IiwgImEyNyIsICJhMjgiLCAiYTYiLCAiYTciLCAiYTgiLCAiYTkiLCAiYTEwIiwgImEyOSIsICJhMzAiLCAiYTMxIiwgImEzMiIsICJhMzMiLCAiYTM0IiwgImEzNSIsICJhMzYiLCAiYTM3IiwgImEzOCIsICJhMzkiLCAiYTQwIiwgImE0MSIsICJhNDIiLCAiYTQzIiwgImE0NCIsICJhNDUiLCAiYTQ2IiwgImE0NyIsICJhNDgiLCAiYTQ5IiwgImE1MCIsICJhNTEiLCAiYTUyIiwgImE1MyIsICJhNTQiLCAiYTU1IiwgImE1NiIsICJhNTciLCAiYTU4IiwgImE1OSIsICJhNjAiLCAiYTYxIiwgImE2MiIsICJhNjMiLCAiYTY0IiwgImE2NSIsICJhNjYiLCAiYTY3IiwgImE2OCIsICJhNjkiLCAiYTcwIiwgImE3MSIsICJhNzIiLCAiYTczIiwgImE3NCIsICJhMjAzIiwgImE3NSIsICJhMjA0IiwgImE3NiIsICJhNzciLCAiYTc4IiwgImE3OSIsICJhODEiLCAiYTgyIiwgImE4MyIsICJhODQiLCAiYTk3IiwgImE5OCIsICJhOTkiLCAiYTEwMCIsICIiLCAiYTg5IiwgImE5MCIsICJhOTMiLCAiYTk0IiwgImE5MSIsICJhOTIiLCAiYTIwNSIsICJhODUiLCAiYTIwNiIsICJhODYiLCAiYTg3IiwgImE4OCIsICJhOTUiLCAiYTk2IiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJhMTAxIiwgImExMDIiLCAiYTEwMyIsICJhMTA0IiwgImExMDYiLCAiYTEwNyIsICJhMTA4IiwgImExMTIiLCAiYTExMSIsICJhMTEwIiwgImExMDkiLCAiYTEyMCIsICJhMTIxIiwgImExMjIiLCAiYTEyMyIsICJhMTI0IiwgImExMjUiLCAiYTEyNiIsICJhMTI3IiwgImExMjgiLCAiYTEyOSIsICJhMTMwIiwgImExMzEiLCAiYTEzMiIsICJhMTMzIiwgImExMzQiLCAiYTEzNSIsICJhMTM2IiwgImExMzciLCAiYTEzOCIsICJhMTM5IiwgImExNDAiLCAiYTE0MSIsICJhMTQyIiwgImExNDMiLCAiYTE0NCIsICJhMTQ1IiwgImExNDYiLCAiYTE0NyIsICJhMTQ4IiwgImExNDkiLCAiYTE1MCIsICJhMTUxIiwgImExNTIiLCAiYTE1MyIsICJhMTU0IiwgImExNTUiLCAiYTE1NiIsICJhMTU3IiwgImExNTgiLCAiYTE1OSIsICJhMTYwIiwgImExNjEiLCAiYTE2MyIsICJhMTY0IiwgImExOTYiLCAiYTE2NSIsICJhMTkyIiwgImExNjYiLCAiYTE2NyIsICJhMTY4IiwgImExNjkiLCAiYTE3MCIsICJhMTcxIiwgImExNzIiLCAiYTE3MyIsICJhMTYyIiwgImExNzQiLCAiYTE3NSIsICJhMTc2IiwgImExNzciLCAiYTE3OCIsICJhMTc5IiwgImExOTMiLCAiYTE4MCIsICJhMTk5IiwgImExODEiLCAiYTIwMCIsICJhMTgyIiwgIiIsICJhMjAxIiwgImExODMiLCAiYTE4NCIsICJhMTk3IiwgImExODUiLCAiYTE5NCIsICJhMTk4IiwgImExODYiLCAiYTE5NSIsICJhMTg3IiwgImExODgiLCAiYTE4OSIsICJhMTkwIiwgImExOTEiLCAiIl07CmZ1bmN0aW9uIGdldEVuY29kaW5nKGVuY29kaW5nTmFtZSkgewogIHN3aXRjaCAoZW5jb2RpbmdOYW1lKSB7CiAgICBjYXNlICJXaW5BbnNpRW5jb2RpbmciOgogICAgICByZXR1cm4gV2luQW5zaUVuY29kaW5nOwogICAgY2FzZSAiU3RhbmRhcmRFbmNvZGluZyI6CiAgICAgIHJldHVybiBTdGFuZGFyZEVuY29kaW5nOwogICAgY2FzZSAiTWFjUm9tYW5FbmNvZGluZyI6CiAgICAgIHJldHVybiBNYWNSb21hbkVuY29kaW5nOwogICAgY2FzZSAiU3ltYm9sU2V0RW5jb2RpbmciOgogICAgICByZXR1cm4gU3ltYm9sU2V0RW5jb2Rpbmc7CiAgICBjYXNlICJaYXBmRGluZ2JhdHNFbmNvZGluZyI6CiAgICAgIHJldHVybiBaYXBmRGluZ2JhdHNFbmNvZGluZzsKICAgIGNhc2UgIkV4cGVydEVuY29kaW5nIjoKICAgICAgcmV0dXJuIEV4cGVydEVuY29kaW5nOwogICAgY2FzZSAiTWFjRXhwZXJ0RW5jb2RpbmciOgogICAgICByZXR1cm4gTWFjRXhwZXJ0RW5jb2Rpbmc7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NmZl9wYXJzZXIuanMKCgoKCmNvbnN0IE1BWF9TVUJSX05FU1RJTkcgPSAxMDsKY29uc3QgQ0ZGU3RhbmRhcmRTdHJpbmdzID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgInF1ZXN0aW9uZG93biIsICJncmF2ZSIsICJhY3V0ZSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAiZGllcmVzaXMiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIkFFIiwgIm9yZGZlbWluaW5lIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsICJvbmVzdXBlcmlvciIsICJsb2dpY2Fsbm90IiwgIm11IiwgInRyYWRlbWFyayIsICJFdGgiLCAib25laGFsZiIsICJwbHVzbWludXMiLCAiVGhvcm4iLCAib25lcXVhcnRlciIsICJkaXZpZGUiLCAiYnJva2VuYmFyIiwgImRlZ3JlZSIsICJ0aG9ybiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInR3b3N1cGVyaW9yIiwgInJlZ2lzdGVyZWQiLCAibWludXMiLCAiZXRoIiwgIm11bHRpcGx5IiwgInRocmVlc3VwZXJpb3IiLCAiY29weXJpZ2h0IiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBZGllcmVzaXMiLCAiQWdyYXZlIiwgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJOdGlsZGUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk9kaWVyZXNpcyIsICJPZ3JhdmUiLCAiT3RpbGRlIiwgIlNjYXJvbiIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIlVncmF2ZSIsICJZYWN1dGUiLCAiWWRpZXJlc2lzIiwgIlpjYXJvbiIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImFncmF2ZSIsICJhcmluZyIsICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJlZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJpZ3JhdmUiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib2dyYXZlIiwgIm90aWxkZSIsICJzY2Fyb24iLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ1Z3JhdmUiLCAieWFjdXRlIiwgInlkaWVyZXNpcyIsICJ6Y2Fyb24iLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiemVyb29sZHN0eWxlIiwgIm9uZW9sZHN0eWxlIiwgInR3b29sZHN0eWxlIiwgInRocmVlb2xkc3R5bGUiLCAiZm91cm9sZHN0eWxlIiwgImZpdmVvbGRzdHlsZSIsICJzaXhvbGRzdHlsZSIsICJzZXZlbm9sZHN0eWxlIiwgImVpZ2h0b2xkc3R5bGUiLCAibmluZW9sZHN0eWxlIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuc3VwZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgImV4Y2xhbWRvd25zbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiTHNsYXNoc21hbGwiLCAiU2Nhcm9uc21hbGwiLCAiWmNhcm9uc21hbGwiLCAiRGllcmVzaXNzbWFsbCIsICJCcmV2ZXNtYWxsIiwgIkNhcm9uc21hbGwiLCAiRG90YWNjZW50c21hbGwiLCAiTWFjcm9uc21hbGwiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsICJvbmVpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgIm5pbmVpbmZlcmlvciIsICJjZW50aW5mZXJpb3IiLCAiZG9sbGFyaW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiY29tbWFpbmZlcmlvciIsICJBZ3JhdmVzbWFsbCIsICJBYWN1dGVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkFyaW5nc21hbGwiLCAiQUVzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk90aWxkZXNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICJZYWN1dGVzbWFsbCIsICJUaG9ybnNtYWxsIiwgIllkaWVyZXNpc3NtYWxsIiwgIjAwMS4wMDAiLCAiMDAxLjAwMSIsICIwMDEuMDAyIiwgIjAwMS4wMDMiLCAiQmxhY2siLCAiQm9sZCIsICJCb29rIiwgIkxpZ2h0IiwgIk1lZGl1bSIsICJSZWd1bGFyIiwgIlJvbWFuIiwgIlNlbWlib2xkIl07CmNvbnN0IE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUyA9IDM5MTsKY29uc3QgQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhID0gW251bGwsIHsKICBpZDogImhzdGVtIiwKICBtaW46IDIsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKICBzdGVtOiB0cnVlCn0sIG51bGwsIHsKICBpZDogInZzdGVtIiwKICBtaW46IDIsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKICBzdGVtOiB0cnVlCn0sIHsKICBpZDogInZtb3ZldG8iLAogIG1pbjogMSwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogInJsaW5ldG8iLAogIG1pbjogMiwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogImhsaW5ldG8iLAogIG1pbjogMSwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogInZsaW5ldG8iLAogIG1pbjogMSwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogInJyY3VydmV0byIsCiAgbWluOiA2LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgbnVsbCwgewogIGlkOiAiY2FsbHN1YnIiLAogIG1pbjogMSwKICB1bmRlZlN0YWNrOiB0cnVlCn0sIHsKICBpZDogInJldHVybiIsCiAgbWluOiAwLAogIHVuZGVmU3RhY2s6IHRydWUKfSwgbnVsbCwgbnVsbCwgewogIGlkOiAiZW5kY2hhciIsCiAgbWluOiAwLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUKfSwgbnVsbCwgbnVsbCwgbnVsbCwgewogIGlkOiAiaHN0ZW1obSIsCiAgbWluOiAyLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUsCiAgc3RlbTogdHJ1ZQp9LCB7CiAgaWQ6ICJoaW50bWFzayIsCiAgbWluOiAwLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUKfSwgewogIGlkOiAiY250cm1hc2siLAogIG1pbjogMCwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogInJtb3ZldG8iLAogIG1pbjogMiwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogImhtb3ZldG8iLAogIG1pbjogMSwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogInZzdGVtaG0iLAogIG1pbjogMiwKICBzdGFja0NsZWFyaW5nOiB0cnVlLAogIHN0ZW06IHRydWUKfSwgewogIGlkOiAicmN1cnZlbGluZSIsCiAgbWluOiA4LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAicmxpbmVjdXJ2ZSIsCiAgbWluOiA4LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAidnZjdXJ2ZXRvIiwKICBtaW46IDQsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJoaGN1cnZldG8iLAogIG1pbjogNCwKICByZXNldFN0YWNrOiB0cnVlCn0sIG51bGwsIHsKICBpZDogImNhbGxnc3ViciIsCiAgbWluOiAxLAogIHVuZGVmU3RhY2s6IHRydWUKfSwgewogIGlkOiAidmhjdXJ2ZXRvIiwKICBtaW46IDQsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJodmN1cnZldG8iLAogIG1pbjogNCwKICByZXNldFN0YWNrOiB0cnVlCn1dOwpjb25zdCBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGExMiA9IFtudWxsLCBudWxsLCBudWxsLCB7CiAgaWQ6ICJhbmQiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMQp9LCB7CiAgaWQ6ICJvciIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xCn0sIHsKICBpZDogIm5vdCIsCiAgbWluOiAxLAogIHN0YWNrRGVsdGE6IDAKfSwgbnVsbCwgbnVsbCwgbnVsbCwgewogIGlkOiAiYWJzIiwKICBtaW46IDEsCiAgc3RhY2tEZWx0YTogMAp9LCB7CiAgaWQ6ICJhZGQiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMSwKICBzdGFja0ZuKHN0YWNrLCBpbmRleCkgewogICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gKyBzdGFja1tpbmRleCAtIDFdOwogIH0KfSwgewogIGlkOiAic3ViIiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTEsCiAgc3RhY2tGbihzdGFjaywgaW5kZXgpIHsKICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdIC0gc3RhY2tbaW5kZXggLSAxXTsKICB9Cn0sIHsKICBpZDogImRpdiIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xLAogIHN0YWNrRm4oc3RhY2ssIGluZGV4KSB7CiAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAvIHN0YWNrW2luZGV4IC0gMV07CiAgfQp9LCBudWxsLCB7CiAgaWQ6ICJuZWciLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAwLAogIHN0YWNrRm4oc3RhY2ssIGluZGV4KSB7CiAgICBzdGFja1tpbmRleCAtIDFdID0gLXN0YWNrW2luZGV4IC0gMV07CiAgfQp9LCB7CiAgaWQ6ICJlcSIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xCn0sIG51bGwsIG51bGwsIHsKICBpZDogImRyb3AiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAtMQp9LCBudWxsLCB7CiAgaWQ6ICJwdXQiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMgp9LCB7CiAgaWQ6ICJnZXQiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAwCn0sIHsKICBpZDogImlmZWxzZSIsCiAgbWluOiA0LAogIHN0YWNrRGVsdGE6IC0zCn0sIHsKICBpZDogInJhbmRvbSIsCiAgbWluOiAwLAogIHN0YWNrRGVsdGE6IDEKfSwgewogIGlkOiAibXVsIiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTEsCiAgc3RhY2tGbihzdGFjaywgaW5kZXgpIHsKICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdICogc3RhY2tbaW5kZXggLSAxXTsKICB9Cn0sIG51bGwsIHsKICBpZDogInNxcnQiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAwCn0sIHsKICBpZDogImR1cCIsCiAgbWluOiAxLAogIHN0YWNrRGVsdGE6IDEKfSwgewogIGlkOiAiZXhjaCIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IDAKfSwgewogIGlkOiAiaW5kZXgiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAwCn0sIHsKICBpZDogInJvbGwiLAogIG1pbjogMywKICBzdGFja0RlbHRhOiAtMgp9LCBudWxsLCBudWxsLCBudWxsLCB7CiAgaWQ6ICJoZmxleCIsCiAgbWluOiA3LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAiZmxleCIsCiAgbWluOiAxMywKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogImhmbGV4MSIsCiAgbWluOiA5LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAiZmxleDEiLAogIG1pbjogMTEsCiAgcmVzZXRTdGFjazogdHJ1ZQp9XTsKY2xhc3MgQ0ZGUGFyc2VyIHsKICBjb25zdHJ1Y3RvcihmaWxlLCBwcm9wZXJ0aWVzLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgICB0aGlzLmJ5dGVzID0gZmlsZS5nZXRCeXRlcygpOwogICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKICAgIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCA9ICEhc2VhY0FuYWx5c2lzRW5hYmxlZDsKICB9CiAgcGFyc2UoKSB7CiAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzOwogICAgY29uc3QgY2ZmID0gbmV3IENGRigpOwogICAgdGhpcy5jZmYgPSBjZmY7CiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLnBhcnNlSGVhZGVyKCk7CiAgICBjb25zdCBuYW1lSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgoaGVhZGVyLmVuZFBvcyk7CiAgICBjb25zdCB0b3BEaWN0SW5kZXggPSB0aGlzLnBhcnNlSW5kZXgobmFtZUluZGV4LmVuZFBvcyk7CiAgICBjb25zdCBzdHJpbmdJbmRleCA9IHRoaXMucGFyc2VJbmRleCh0b3BEaWN0SW5kZXguZW5kUG9zKTsKICAgIGNvbnN0IGdsb2JhbFN1YnJJbmRleCA9IHRoaXMucGFyc2VJbmRleChzdHJpbmdJbmRleC5lbmRQb3MpOwogICAgY29uc3QgdG9wRGljdFBhcnNlZCA9IHRoaXMucGFyc2VEaWN0KHRvcERpY3RJbmRleC5vYmouZ2V0KDApKTsKICAgIGNvbnN0IHRvcERpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCwgdG9wRGljdFBhcnNlZCwgY2ZmLnN0cmluZ3MpOwogICAgY2ZmLmhlYWRlciA9IGhlYWRlci5vYmo7CiAgICBjZmYubmFtZXMgPSB0aGlzLnBhcnNlTmFtZUluZGV4KG5hbWVJbmRleC5vYmopOwogICAgY2ZmLnN0cmluZ3MgPSB0aGlzLnBhcnNlU3RyaW5nSW5kZXgoc3RyaW5nSW5kZXgub2JqKTsKICAgIGNmZi50b3BEaWN0ID0gdG9wRGljdDsKICAgIGNmZi5nbG9iYWxTdWJySW5kZXggPSBnbG9iYWxTdWJySW5kZXgub2JqOwogICAgdGhpcy5wYXJzZVByaXZhdGVEaWN0KGNmZi50b3BEaWN0KTsKICAgIGNmZi5pc0NJREZvbnQgPSB0b3BEaWN0Lmhhc05hbWUoIlJPUyIpOwogICAgY29uc3QgY2hhclN0cmluZ09mZnNldCA9IHRvcERpY3QuZ2V0QnlOYW1lKCJDaGFyU3RyaW5ncyIpOwogICAgY29uc3QgY2hhclN0cmluZ0luZGV4ID0gdGhpcy5wYXJzZUluZGV4KGNoYXJTdHJpbmdPZmZzZXQpLm9iajsKICAgIGNvbnN0IGZvbnRNYXRyaXggPSB0b3BEaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpOwogICAgaWYgKGZvbnRNYXRyaXgpIHsKICAgICAgcHJvcGVydGllcy5mb250TWF0cml4ID0gZm9udE1hdHJpeDsKICAgIH0KICAgIGNvbnN0IGZvbnRCQm94ID0gdG9wRGljdC5nZXRCeU5hbWUoIkZvbnRCQm94Iik7CiAgICBpZiAoZm9udEJCb3gpIHsKICAgICAgcHJvcGVydGllcy5hc2NlbnQgPSBNYXRoLm1heChmb250QkJveFszXSwgZm9udEJCb3hbMV0pOwogICAgICBwcm9wZXJ0aWVzLmRlc2NlbnQgPSBNYXRoLm1pbihmb250QkJveFsxXSwgZm9udEJCb3hbM10pOwogICAgICBwcm9wZXJ0aWVzLmFzY2VudFNjYWxlZCA9IHRydWU7CiAgICB9CiAgICBsZXQgY2hhcnNldCwgZW5jb2Rpbmc7CiAgICBpZiAoY2ZmLmlzQ0lERm9udCkgewogICAgICBjb25zdCBmZEFycmF5SW5kZXggPSB0aGlzLnBhcnNlSW5kZXgodG9wRGljdC5nZXRCeU5hbWUoIkZEQXJyYXkiKSkub2JqOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmZEFycmF5SW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgY29uc3QgZGljdFJhdyA9IGZkQXJyYXlJbmRleC5nZXQoaSk7CiAgICAgICAgY29uc3QgZm9udERpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCwgdGhpcy5wYXJzZURpY3QoZGljdFJhdyksIGNmZi5zdHJpbmdzKTsKICAgICAgICB0aGlzLnBhcnNlUHJpdmF0ZURpY3QoZm9udERpY3QpOwogICAgICAgIGNmZi5mZEFycmF5LnB1c2goZm9udERpY3QpOwogICAgICB9CiAgICAgIGVuY29kaW5nID0gbnVsbDsKICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyh0b3BEaWN0LmdldEJ5TmFtZSgiY2hhcnNldCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQsIGNmZi5zdHJpbmdzLCB0cnVlKTsKICAgICAgY2ZmLmZkU2VsZWN0ID0gdGhpcy5wYXJzZUZEU2VsZWN0KHRvcERpY3QuZ2V0QnlOYW1lKCJGRFNlbGVjdCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQpOwogICAgfSBlbHNlIHsKICAgICAgY2hhcnNldCA9IHRoaXMucGFyc2VDaGFyc2V0cyh0b3BEaWN0LmdldEJ5TmFtZSgiY2hhcnNldCIpLCBjaGFyU3RyaW5nSW5kZXguY291bnQsIGNmZi5zdHJpbmdzLCBmYWxzZSk7CiAgICAgIGVuY29kaW5nID0gdGhpcy5wYXJzZUVuY29kaW5nKHRvcERpY3QuZ2V0QnlOYW1lKCJFbmNvZGluZyIpLCBwcm9wZXJ0aWVzLCBjZmYuc3RyaW5ncywgY2hhcnNldC5jaGFyc2V0KTsKICAgIH0KICAgIGNmZi5jaGFyc2V0ID0gY2hhcnNldDsKICAgIGNmZi5lbmNvZGluZyA9IGVuY29kaW5nOwogICAgY29uc3QgY2hhclN0cmluZ3NBbmRTZWFjcyA9IHRoaXMucGFyc2VDaGFyU3RyaW5ncyh7CiAgICAgIGNoYXJTdHJpbmdzOiBjaGFyU3RyaW5nSW5kZXgsCiAgICAgIGxvY2FsU3VickluZGV4OiB0b3BEaWN0LnByaXZhdGVEaWN0LnN1YnJzSW5kZXgsCiAgICAgIGdsb2JhbFN1YnJJbmRleDogZ2xvYmFsU3VickluZGV4Lm9iaiwKICAgICAgZmRTZWxlY3Q6IGNmZi5mZFNlbGVjdCwKICAgICAgZmRBcnJheTogY2ZmLmZkQXJyYXksCiAgICAgIHByaXZhdGVEaWN0OiB0b3BEaWN0LnByaXZhdGVEaWN0CiAgICB9KTsKICAgIGNmZi5jaGFyU3RyaW5ncyA9IGNoYXJTdHJpbmdzQW5kU2VhY3MuY2hhclN0cmluZ3M7CiAgICBjZmYuc2VhY3MgPSBjaGFyU3RyaW5nc0FuZFNlYWNzLnNlYWNzOwogICAgY2ZmLndpZHRocyA9IGNoYXJTdHJpbmdzQW5kU2VhY3Mud2lkdGhzOwogICAgcmV0dXJuIGNmZjsKICB9CiAgcGFyc2VIZWFkZXIoKSB7CiAgICBsZXQgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgYnl0ZXNMZW5ndGggPSBieXRlcy5sZW5ndGg7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIHdoaWxlIChvZmZzZXQgPCBieXRlc0xlbmd0aCAmJiBieXRlc1tvZmZzZXRdICE9PSAxKSB7CiAgICAgICsrb2Zmc2V0OwogICAgfQogICAgaWYgKG9mZnNldCA+PSBieXRlc0xlbmd0aCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgQ0ZGIGhlYWRlciIpOwogICAgfQogICAgaWYgKG9mZnNldCAhPT0gMCkgewogICAgICBpbmZvKCJjZmYgZGF0YSBpcyBzaGlmdGVkIik7CiAgICAgIGJ5dGVzID0gYnl0ZXMuc3ViYXJyYXkob2Zmc2V0KTsKICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOwogICAgfQogICAgY29uc3QgbWFqb3IgPSBieXRlc1swXTsKICAgIGNvbnN0IG1pbm9yID0gYnl0ZXNbMV07CiAgICBjb25zdCBoZHJTaXplID0gYnl0ZXNbMl07CiAgICBjb25zdCBvZmZTaXplID0gYnl0ZXNbM107CiAgICBjb25zdCBoZWFkZXIgPSBuZXcgQ0ZGSGVhZGVyKG1ham9yLCBtaW5vciwgaGRyU2l6ZSwgb2ZmU2l6ZSk7CiAgICByZXR1cm4gewogICAgICBvYmo6IGhlYWRlciwKICAgICAgZW5kUG9zOiBoZHJTaXplCiAgICB9OwogIH0KICBwYXJzZURpY3QoZGljdCkgewogICAgbGV0IHBvcyA9IDA7CiAgICBmdW5jdGlvbiBwYXJzZU9wZXJhbmQoKSB7CiAgICAgIGxldCB2YWx1ZSA9IGRpY3RbcG9zKytdOwogICAgICBpZiAodmFsdWUgPT09IDMwKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXRPcGVyYW5kKCk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI4KSB7CiAgICAgICAgdmFsdWUgPSByZWFkSW50MTYoZGljdCwgcG9zKTsKICAgICAgICBwb3MgKz0gMjsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI5KSB7CiAgICAgICAgdmFsdWUgPSBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMzIgJiYgdmFsdWUgPD0gMjQ2KSB7CiAgICAgICAgcmV0dXJuIHZhbHVlIC0gMTM5OwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI0NyAmJiB2YWx1ZSA8PSAyNTApIHsKICAgICAgICByZXR1cm4gKHZhbHVlIC0gMjQ3KSAqIDI1NiArIGRpY3RbcG9zKytdICsgMTA4OwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI1MSAmJiB2YWx1ZSA8PSAyNTQpIHsKICAgICAgICByZXR1cm4gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGRpY3RbcG9zKytdIC0gMTA4OwogICAgICB9CiAgICAgIHdhcm4oJ0NGRlBhcnNlcl9wYXJzZURpY3Q6ICInICsgdmFsdWUgKyAnIiBpcyBhIHJlc2VydmVkIGNvbW1hbmQuJyk7CiAgICAgIHJldHVybiBOYU47CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZUZsb2F0T3BlcmFuZCgpIHsKICAgICAgbGV0IHN0ciA9ICIiOwogICAgICBjb25zdCBlb2YgPSAxNTsKICAgICAgY29uc3QgbG9va3VwID0gWyIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5IiwgIi4iLCAiRSIsICJFLSIsIG51bGwsICItIl07CiAgICAgIGNvbnN0IGxlbmd0aCA9IGRpY3QubGVuZ3RoOwogICAgICB3aGlsZSAocG9zIDwgbGVuZ3RoKSB7CiAgICAgICAgY29uc3QgYiA9IGRpY3RbcG9zKytdOwogICAgICAgIGNvbnN0IGIxID0gYiA+PiA0OwogICAgICAgIGNvbnN0IGIyID0gYiAmIDE1OwogICAgICAgIGlmIChiMSA9PT0gZW9mKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc3RyICs9IGxvb2t1cFtiMV07CiAgICAgICAgaWYgKGIyID09PSBlb2YpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHIgKz0gbG9va3VwW2IyXTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VGbG9hdChzdHIpOwogICAgfQogICAgbGV0IG9wZXJhbmRzID0gW107CiAgICBjb25zdCBlbnRyaWVzID0gW107CiAgICBwb3MgPSAwOwogICAgY29uc3QgZW5kID0gZGljdC5sZW5ndGg7CiAgICB3aGlsZSAocG9zIDwgZW5kKSB7CiAgICAgIGxldCBiID0gZGljdFtwb3NdOwogICAgICBpZiAoYiA8PSAyMSkgewogICAgICAgIGlmIChiID09PSAxMikgewogICAgICAgICAgYiA9IGIgPDwgOCB8IGRpY3RbKytwb3NdOwogICAgICAgIH0KICAgICAgICBlbnRyaWVzLnB1c2goW2IsIG9wZXJhbmRzXSk7CiAgICAgICAgb3BlcmFuZHMgPSBbXTsKICAgICAgICArK3BvczsKICAgICAgfSBlbHNlIHsKICAgICAgICBvcGVyYW5kcy5wdXNoKHBhcnNlT3BlcmFuZCgpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGVudHJpZXM7CiAgfQogIHBhcnNlSW5kZXgocG9zKSB7CiAgICBjb25zdCBjZmZJbmRleCA9IG5ldyBDRkZJbmRleCgpOwogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgY291bnQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgIGNvbnN0IG9mZnNldHMgPSBbXTsKICAgIGxldCBlbmQgPSBwb3M7CiAgICBsZXQgaSwgaWk7CiAgICBpZiAoY291bnQgIT09IDApIHsKICAgICAgY29uc3Qgb2Zmc2V0U2l6ZSA9IGJ5dGVzW3BvcysrXTsKICAgICAgY29uc3Qgc3RhcnRQb3MgPSBwb3MgKyAoY291bnQgKyAxKSAqIG9mZnNldFNpemUgLSAxOwogICAgICBmb3IgKGkgPSAwLCBpaSA9IGNvdW50ICsgMTsgaSA8IGlpOyArK2kpIHsKICAgICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG9mZnNldFNpemU7ICsraikgewogICAgICAgICAgb2Zmc2V0IDw8PSA4OwogICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzW3BvcysrXTsKICAgICAgICB9CiAgICAgICAgb2Zmc2V0cy5wdXNoKHN0YXJ0UG9zICsgb2Zmc2V0KTsKICAgICAgfQogICAgICBlbmQgPSBvZmZzZXRzW2NvdW50XTsKICAgIH0KICAgIGZvciAoaSA9IDAsIGlpID0gb2Zmc2V0cy5sZW5ndGggLSAxOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBvZmZzZXRTdGFydCA9IG9mZnNldHNbaV07CiAgICAgIGNvbnN0IG9mZnNldEVuZCA9IG9mZnNldHNbaSArIDFdOwogICAgICBjZmZJbmRleC5hZGQoYnl0ZXMuc3ViYXJyYXkob2Zmc2V0U3RhcnQsIG9mZnNldEVuZCkpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgb2JqOiBjZmZJbmRleCwKICAgICAgZW5kUG9zOiBlbmQKICAgIH07CiAgfQogIHBhcnNlTmFtZUluZGV4KGluZGV4KSB7CiAgICBjb25zdCBuYW1lcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CiAgICAgIGNvbnN0IG5hbWUgPSBpbmRleC5nZXQoaSk7CiAgICAgIG5hbWVzLnB1c2goYnl0ZXNUb1N0cmluZyhuYW1lKSk7CiAgICB9CiAgICByZXR1cm4gbmFtZXM7CiAgfQogIHBhcnNlU3RyaW5nSW5kZXgoaW5kZXgpIHsKICAgIGNvbnN0IHN0cmluZ3MgPSBuZXcgQ0ZGU3RyaW5ncygpOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5kZXguY291bnQ7IGkgPCBpaTsgKytpKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBpbmRleC5nZXQoaSk7CiAgICAgIHN0cmluZ3MuYWRkKGJ5dGVzVG9TdHJpbmcoZGF0YSkpOwogICAgfQogICAgcmV0dXJuIHN0cmluZ3M7CiAgfQogIGNyZWF0ZURpY3QoVHlwZSwgZGljdCwgc3RyaW5ncykgewogICAgY29uc3QgY2ZmRGljdCA9IG5ldyBUeXBlKHN0cmluZ3MpOwogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZGljdCkgewogICAgICBjZmZEaWN0LnNldEJ5S2V5KGtleSwgdmFsdWUpOwogICAgfQogICAgcmV0dXJuIGNmZkRpY3Q7CiAgfQogIHBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgZGF0YSwgbG9jYWxTdWJySW5kZXgsIGdsb2JhbFN1YnJJbmRleCkgewogICAgaWYgKCFkYXRhIHx8IHN0YXRlLmNhbGxEZXB0aCA+IE1BWF9TVUJSX05FU1RJTkcpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgbGV0IHN0YWNrU2l6ZSA9IHN0YXRlLnN0YWNrU2l6ZTsKICAgIGNvbnN0IHN0YWNrID0gc3RhdGUuc3RhY2s7CiAgICBsZXQgbGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxlbmd0aDspIHsKICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW2orK107CiAgICAgIGxldCB2YWxpZGF0aW9uQ29tbWFuZCA9IG51bGw7CiAgICAgIGlmICh2YWx1ZSA9PT0gMTIpIHsKICAgICAgICBjb25zdCBxID0gZGF0YVtqKytdOwogICAgICAgIGlmIChxID09PSAwKSB7CiAgICAgICAgICBkYXRhW2ogLSAyXSA9IDEzOTsKICAgICAgICAgIGRhdGFbaiAtIDFdID0gMjI7CiAgICAgICAgICBzdGFja1NpemUgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YTEyW3FdOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMjgpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gcmVhZEludDE2KGRhdGEsIGopOwogICAgICAgIGogKz0gMjsKICAgICAgICBzdGFja1NpemUrKzsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTQpIHsKICAgICAgICBpZiAoc3RhY2tTaXplID49IDQpIHsKICAgICAgICAgIHN0YWNrU2l6ZSAtPSA0OwogICAgICAgICAgaWYgKHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCkgewogICAgICAgICAgICBzdGF0ZS5zZWFjID0gc3RhY2suc2xpY2Uoc3RhY2tTaXplLCBzdGFja1NpemUgKyA0KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMzIgJiYgdmFsdWUgPD0gMjQ2KSB7CiAgICAgICAgc3RhY2tbc3RhY2tTaXplXSA9IHZhbHVlIC0gMTM5OwogICAgICAgIHN0YWNrU2l6ZSsrOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI0NyAmJiB2YWx1ZSA8PSAyNTQpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gdmFsdWUgPCAyNTEgPyAodmFsdWUgLSAyNDcgPDwgOCkgKyBkYXRhW2pdICsgMTA4IDogLSh2YWx1ZSAtIDI1MSA8PCA4KSAtIGRhdGFbal0gLSAxMDg7CiAgICAgICAgaisrOwogICAgICAgIHN0YWNrU2l6ZSsrOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyNTUpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gKGRhdGFbal0gPDwgMjQgfCBkYXRhW2ogKyAxXSA8PCAxNiB8IGRhdGFbaiArIDJdIDw8IDggfCBkYXRhW2ogKyAzXSkgLyA2NTUzNjsKICAgICAgICBqICs9IDQ7CiAgICAgICAgc3RhY2tTaXplKys7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDE5IHx8IHZhbHVlID09PSAyMCkgewogICAgICAgIHN0YXRlLmhpbnRzICs9IHN0YWNrU2l6ZSA+PiAxOwogICAgICAgIGlmIChzdGF0ZS5oaW50cyA9PT0gMCkgewogICAgICAgICAgZGF0YS5jb3B5V2l0aGluKGogLSAxLCBqLCAtMSk7CiAgICAgICAgICBqIC09IDE7CiAgICAgICAgICBsZW5ndGggLT0gMTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBqICs9IHN0YXRlLmhpbnRzICsgNyA+PiAzOwogICAgICAgIHN0YWNrU2l6ZSAlPSAyOwogICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTAgfHwgdmFsdWUgPT09IDI5KSB7CiAgICAgICAgY29uc3Qgc3VicnNJbmRleCA9IHZhbHVlID09PSAxMCA/IGxvY2FsU3VickluZGV4IDogZ2xvYmFsU3VickluZGV4OwogICAgICAgIGlmICghc3VicnNJbmRleCkgewogICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbdmFsdWVdOwogICAgICAgICAgd2FybigiTWlzc2luZyBzdWJyc0luZGV4IGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBsZXQgYmlhcyA9IDMyNzY4OwogICAgICAgIGlmIChzdWJyc0luZGV4LmNvdW50IDwgMTI0MCkgewogICAgICAgICAgYmlhcyA9IDEwNzsKICAgICAgICB9IGVsc2UgaWYgKHN1YnJzSW5kZXguY291bnQgPCAzMzkwMCkgewogICAgICAgICAgYmlhcyA9IDExMzE7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN1YnJOdW1iZXIgPSBzdGFja1stLXN0YWNrU2l6ZV0gKyBiaWFzOwogICAgICAgIGlmIChzdWJyTnVtYmVyIDwgMCB8fCBzdWJyTnVtYmVyID49IHN1YnJzSW5kZXguY291bnQgfHwgaXNOYU4oc3Vick51bWJlcikpIHsKICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgICAgIHdhcm4oIk91dCBvZiBib3VuZHMgc3VickluZGV4IGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBzdGF0ZS5zdGFja1NpemUgPSBzdGFja1NpemU7CiAgICAgICAgc3RhdGUuY2FsbERlcHRoKys7CiAgICAgICAgY29uc3QgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgc3VicnNJbmRleC5nZXQoc3Vick51bWJlciksIGxvY2FsU3VickluZGV4LCBnbG9iYWxTdWJySW5kZXgpOwogICAgICAgIGlmICghdmFsaWQpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc3RhdGUuY2FsbERlcHRoLS07CiAgICAgICAgc3RhY2tTaXplID0gc3RhdGUuc3RhY2tTaXplOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxMSkgewogICAgICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMCAmJiBqID09PSBkYXRhLmxlbmd0aCkgewogICAgICAgIGRhdGFbaiAtIDFdID0gMTQ7CiAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbMTRdOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSA5KSB7CiAgICAgICAgZGF0YS5jb3B5V2l0aGluKGogLSAxLCBqLCAtMSk7CiAgICAgICAgaiAtPSAxOwogICAgICAgIGxlbmd0aCAtPSAxOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgfQogICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQpIHsKICAgICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RlbSkgewogICAgICAgICAgc3RhdGUuaGludHMgKz0gc3RhY2tTaXplID4+IDE7CiAgICAgICAgICBpZiAodmFsdWUgPT09IDMgfHwgdmFsdWUgPT09IDIzKSB7CiAgICAgICAgICAgIHN0YXRlLmhhc1ZTdGVtcyA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhhc1ZTdGVtcyAmJiAodmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDE4KSkgewogICAgICAgICAgICB3YXJuKCJDRkYgc3RlbSBoaW50cyBhcmUgaW4gd3Jvbmcgb3JkZXIiKTsKICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSB2YWx1ZSA9PT0gMSA/IDMgOiAyMzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCJtaW4iIGluIHZhbGlkYXRpb25Db21tYW5kKSB7CiAgICAgICAgICBpZiAoIXN0YXRlLnVuZGVmU3RhY2sgJiYgc3RhY2tTaXplIDwgdmFsaWRhdGlvbkNvbW1hbmQubWluKSB7CiAgICAgICAgICAgIHdhcm4oIk5vdCBlbm91Z2ggcGFyYW1ldGVycyBmb3IgIiArIHZhbGlkYXRpb25Db21tYW5kLmlkICsgIjsgYWN0dWFsOiAiICsgc3RhY2tTaXplICsgIiwgZXhwZWN0ZWQ6ICIgKyB2YWxpZGF0aW9uQ29tbWFuZC5taW4pOwogICAgICAgICAgICBpZiAoc3RhY2tTaXplID09PSAwKSB7CiAgICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSAxNDsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgJiYgdmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tDbGVhcmluZykgewogICAgICAgICAgc3RhdGUuZmlyc3RTdGFja0NsZWFyaW5nID0gZmFsc2U7CiAgICAgICAgICBzdGFja1NpemUgLT0gdmFsaWRhdGlvbkNvbW1hbmQubWluOwogICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+PSAyICYmIHZhbGlkYXRpb25Db21tYW5kLnN0ZW0pIHsKICAgICAgICAgICAgc3RhY2tTaXplICU9IDI7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrU2l6ZSA+IDEpIHsKICAgICAgICAgICAgd2FybigiRm91bmQgdG9vIG1hbnkgcGFyYW1ldGVycyBmb3Igc3RhY2stY2xlYXJpbmcgY29tbWFuZCIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+IDApIHsKICAgICAgICAgICAgc3RhdGUud2lkdGggPSBzdGFja1tzdGFja1NpemUgLSAxXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCJzdGFja0RlbHRhIiBpbiB2YWxpZGF0aW9uQ29tbWFuZCkgewogICAgICAgICAgaWYgKCJzdGFja0ZuIiBpbiB2YWxpZGF0aW9uQ29tbWFuZCkgewogICAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0ZuKHN0YWNrLCBzdGFja1NpemUpOwogICAgICAgICAgfQogICAgICAgICAgc3RhY2tTaXplICs9IHZhbGlkYXRpb25Db21tYW5kLnN0YWNrRGVsdGE7CiAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0NsZWFyaW5nKSB7CiAgICAgICAgICBzdGFja1NpemUgPSAwOwogICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbkNvbW1hbmQucmVzZXRTdGFjaykgewogICAgICAgICAgc3RhY2tTaXplID0gMDsKICAgICAgICAgIHN0YXRlLnVuZGVmU3RhY2sgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25Db21tYW5kLnVuZGVmU3RhY2spIHsKICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7CiAgICAgICAgICBzdGF0ZS51bmRlZlN0YWNrID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLmZpcnN0U3RhY2tDbGVhcmluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGxlbmd0aCA8IGRhdGEubGVuZ3RoKSB7CiAgICAgIGRhdGEuZmlsbCgxNCwgbGVuZ3RoKTsKICAgIH0KICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBwYXJzZUNoYXJTdHJpbmdzKHsKICAgIGNoYXJTdHJpbmdzLAogICAgbG9jYWxTdWJySW5kZXgsCiAgICBnbG9iYWxTdWJySW5kZXgsCiAgICBmZFNlbGVjdCwKICAgIGZkQXJyYXksCiAgICBwcml2YXRlRGljdAogIH0pIHsKICAgIGNvbnN0IHNlYWNzID0gW107CiAgICBjb25zdCB3aWR0aHMgPSBbXTsKICAgIGNvbnN0IGNvdW50ID0gY2hhclN0cmluZ3MuY291bnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgY29uc3QgY2hhcnN0cmluZyA9IGNoYXJTdHJpbmdzLmdldChpKTsKICAgICAgY29uc3Qgc3RhdGUgPSB7CiAgICAgICAgY2FsbERlcHRoOiAwLAogICAgICAgIHN0YWNrU2l6ZTogMCwKICAgICAgICBzdGFjazogW10sCiAgICAgICAgdW5kZWZTdGFjazogdHJ1ZSwKICAgICAgICBoaW50czogMCwKICAgICAgICBmaXJzdFN0YWNrQ2xlYXJpbmc6IHRydWUsCiAgICAgICAgc2VhYzogbnVsbCwKICAgICAgICB3aWR0aDogbnVsbCwKICAgICAgICBoYXNWU3RlbXM6IGZhbHNlCiAgICAgIH07CiAgICAgIGxldCB2YWxpZCA9IHRydWU7CiAgICAgIGxldCBsb2NhbFN1YnJUb1VzZSA9IG51bGw7CiAgICAgIGxldCBwcml2YXRlRGljdFRvVXNlID0gcHJpdmF0ZURpY3Q7CiAgICAgIGlmIChmZFNlbGVjdCAmJiBmZEFycmF5Lmxlbmd0aCkgewogICAgICAgIGNvbnN0IGZkSW5kZXggPSBmZFNlbGVjdC5nZXRGREluZGV4KGkpOwogICAgICAgIGlmIChmZEluZGV4ID09PSAtMSkgewogICAgICAgICAgd2FybigiR2x5cGggaW5kZXggaXMgbm90IGluIGZkIHNlbGVjdC4iKTsKICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChmZEluZGV4ID49IGZkQXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICB3YXJuKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgcHJpdmF0ZURpY3RUb1VzZSA9IGZkQXJyYXlbZmRJbmRleF0ucHJpdmF0ZURpY3Q7CiAgICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IHByaXZhdGVEaWN0VG9Vc2Uuc3VicnNJbmRleDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobG9jYWxTdWJySW5kZXgpIHsKICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IGxvY2FsU3VickluZGV4OwogICAgICB9CiAgICAgIGlmICh2YWxpZCkgewogICAgICAgIHZhbGlkID0gdGhpcy5wYXJzZUNoYXJTdHJpbmcoc3RhdGUsIGNoYXJzdHJpbmcsIGxvY2FsU3ViclRvVXNlLCBnbG9iYWxTdWJySW5kZXgpOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS53aWR0aCAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IG5vbWluYWxXaWR0aCA9IHByaXZhdGVEaWN0VG9Vc2UuZ2V0QnlOYW1lKCJub21pbmFsV2lkdGhYIik7CiAgICAgICAgd2lkdGhzW2ldID0gbm9taW5hbFdpZHRoICsgc3RhdGUud2lkdGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gcHJpdmF0ZURpY3RUb1VzZS5nZXRCeU5hbWUoImRlZmF1bHRXaWR0aFgiKTsKICAgICAgICB3aWR0aHNbaV0gPSBkZWZhdWx0V2lkdGg7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLnNlYWMgIT09IG51bGwpIHsKICAgICAgICBzZWFjc1tpXSA9IHN0YXRlLnNlYWM7CiAgICAgIH0KICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgIGNoYXJTdHJpbmdzLnNldChpLCBuZXcgVWludDhBcnJheShbMTRdKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGNoYXJTdHJpbmdzLAogICAgICBzZWFjcywKICAgICAgd2lkdGhzCiAgICB9OwogIH0KICBlbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpIHsKICAgIGNvbnN0IHByaXZhdGVEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlByaXZhdGVEaWN0LCBbXSwgcGFyZW50RGljdC5zdHJpbmdzKTsKICAgIHBhcmVudERpY3Quc2V0QnlLZXkoMTgsIFswLCAwXSk7CiAgICBwYXJlbnREaWN0LnByaXZhdGVEaWN0ID0gcHJpdmF0ZURpY3Q7CiAgfQogIHBhcnNlUHJpdmF0ZURpY3QocGFyZW50RGljdCkgewogICAgaWYgKCFwYXJlbnREaWN0Lmhhc05hbWUoIlByaXZhdGUiKSkgewogICAgICB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHByaXZhdGVPZmZzZXQgPSBwYXJlbnREaWN0LmdldEJ5TmFtZSgiUHJpdmF0ZSIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KHByaXZhdGVPZmZzZXQpIHx8IHByaXZhdGVPZmZzZXQubGVuZ3RoICE9PSAyKSB7CiAgICAgIHBhcmVudERpY3QucmVtb3ZlQnlOYW1lKCJQcml2YXRlIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHNpemUgPSBwcml2YXRlT2Zmc2V0WzBdOwogICAgY29uc3Qgb2Zmc2V0ID0gcHJpdmF0ZU9mZnNldFsxXTsKICAgIGlmIChzaXplID09PSAwIHx8IG9mZnNldCA+PSB0aGlzLmJ5dGVzLmxlbmd0aCkgewogICAgICB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHByaXZhdGVEaWN0RW5kID0gb2Zmc2V0ICsgc2l6ZTsKICAgIGNvbnN0IGRpY3REYXRhID0gdGhpcy5ieXRlcy5zdWJhcnJheShvZmZzZXQsIHByaXZhdGVEaWN0RW5kKTsKICAgIGNvbnN0IGRpY3QgPSB0aGlzLnBhcnNlRGljdChkaWN0RGF0YSk7CiAgICBjb25zdCBwcml2YXRlRGljdCA9IHRoaXMuY3JlYXRlRGljdChDRkZQcml2YXRlRGljdCwgZGljdCwgcGFyZW50RGljdC5zdHJpbmdzKTsKICAgIHBhcmVudERpY3QucHJpdmF0ZURpY3QgPSBwcml2YXRlRGljdDsKICAgIGlmIChwcml2YXRlRGljdC5nZXRCeU5hbWUoIkV4cGFuc2lvbkZhY3RvciIpID09PSAwKSB7CiAgICAgIHByaXZhdGVEaWN0LnNldEJ5TmFtZSgiRXhwYW5zaW9uRmFjdG9yIiwgMC4wNik7CiAgICB9CiAgICBpZiAoIXByaXZhdGVEaWN0LmdldEJ5TmFtZSgiU3VicnMiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdWJyc09mZnNldCA9IHByaXZhdGVEaWN0LmdldEJ5TmFtZSgiU3VicnMiKTsKICAgIGNvbnN0IHJlbGF0aXZlT2Zmc2V0ID0gb2Zmc2V0ICsgc3VicnNPZmZzZXQ7CiAgICBpZiAoc3VicnNPZmZzZXQgPT09IDAgfHwgcmVsYXRpdmVPZmZzZXQgPj0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKICAgICAgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdWJyc0luZGV4ID0gdGhpcy5wYXJzZUluZGV4KHJlbGF0aXZlT2Zmc2V0KTsKICAgIHByaXZhdGVEaWN0LnN1YnJzSW5kZXggPSBzdWJyc0luZGV4Lm9iajsKICB9CiAgcGFyc2VDaGFyc2V0cyhwb3MsIGxlbmd0aCwgc3RyaW5ncywgY2lkKSB7CiAgICBpZiAocG9zID09PSAwKSB7CiAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldCh0cnVlLCBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLklTT19BRE9CRSwgSVNPQWRvYmVDaGFyc2V0KTsKICAgIH0gZWxzZSBpZiAocG9zID09PSAxKSB7CiAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldCh0cnVlLCBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLkVYUEVSVCwgRXhwZXJ0Q2hhcnNldCk7CiAgICB9IGVsc2UgaWYgKHBvcyA9PT0gMikgewogICAgICByZXR1cm4gbmV3IENGRkNoYXJzZXQodHJ1ZSwgQ0ZGQ2hhcnNldFByZWRlZmluZWRUeXBlcy5FWFBFUlRfU1VCU0VULCBFeHBlcnRTdWJzZXRDaGFyc2V0KTsKICAgIH0KICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlczsKICAgIGNvbnN0IHN0YXJ0ID0gcG9zOwogICAgY29uc3QgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgY29uc3QgY2hhcnNldCA9IFtjaWQgPyAwIDogIi5ub3RkZWYiXTsKICAgIGxldCBpZCwgY291bnQsIGk7CiAgICBsZW5ndGggLT0gMTsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlkID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CiAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQgOiBzdHJpbmdzLmdldChpZCkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIHdoaWxlIChjaGFyc2V0Lmxlbmd0aCA8PSBsZW5ndGgpIHsKICAgICAgICAgIGlkID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CiAgICAgICAgICBjb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICB3aGlsZSAoY2hhcnNldC5sZW5ndGggPD0gbGVuZ3RoKSB7CiAgICAgICAgICBpZCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOwogICAgICAgICAgY291bnQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGNoYXJzZXQgZm9ybWF0Iik7CiAgICB9CiAgICBjb25zdCBlbmQgPSBwb3M7CiAgICBjb25zdCByYXcgPSBieXRlcy5zdWJhcnJheShzdGFydCwgZW5kKTsKICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldChmYWxzZSwgZm9ybWF0LCBjaGFyc2V0LCByYXcpOwogIH0KICBwYXJzZUVuY29kaW5nKHBvcywgcHJvcGVydGllcywgc3RyaW5ncywgY2hhcnNldCkgewogICAgY29uc3QgZW5jb2RpbmcgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgbGV0IHByZWRlZmluZWQgPSBmYWxzZTsKICAgIGxldCBmb3JtYXQsIGksIGlpOwogICAgbGV0IHJhdyA9IG51bGw7CiAgICBmdW5jdGlvbiByZWFkU3VwcGxlbWVudCgpIHsKICAgICAgY29uc3Qgc3VwcGxlbWVudHNDb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgZm9yIChpID0gMDsgaSA8IHN1cHBsZW1lbnRzQ291bnQ7IGkrKykgewogICAgICAgIGNvbnN0IGNvZGUgPSBieXRlc1twb3MrK107CiAgICAgICAgY29uc3Qgc2lkID0gKGJ5dGVzW3BvcysrXSA8PCA4KSArIChieXRlc1twb3MrK10gJiAweGZmKTsKICAgICAgICBlbmNvZGluZ1tjb2RlXSA9IGNoYXJzZXQuaW5kZXhPZihzdHJpbmdzLmdldChzaWQpKTsKICAgICAgfQogICAgfQogICAgaWYgKHBvcyA9PT0gMCB8fCBwb3MgPT09IDEpIHsKICAgICAgcHJlZGVmaW5lZCA9IHRydWU7CiAgICAgIGZvcm1hdCA9IHBvczsKICAgICAgY29uc3QgYmFzZUVuY29kaW5nID0gcG9zID8gRXhwZXJ0RW5jb2RpbmcgOiBTdGFuZGFyZEVuY29kaW5nOwogICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzZXQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IGluZGV4ID0gYmFzZUVuY29kaW5nLmluZGV4T2YoY2hhcnNldFtpXSk7CiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgICAgZW5jb2RpbmdbaW5kZXhdID0gaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGRhdGFTdGFydCA9IHBvczsKICAgICAgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgICBzd2l0Y2ggKGZvcm1hdCAmIDB4N2YpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBjb25zdCBnbHlwaHNDb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gZ2x5cGhzQ291bnQ7IGkrKykgewogICAgICAgICAgICBlbmNvZGluZ1tieXRlc1twb3MrK11dID0gaTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIGNvbnN0IHJhbmdlc0NvdW50ID0gYnl0ZXNbcG9zKytdOwogICAgICAgICAgbGV0IGdpZCA9IDE7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzQ291bnQ7IGkrKykgewogICAgICAgICAgICBjb25zdCBzdGFydCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgICAgY29uc3QgbGVmdCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDw9IHN0YXJ0ICsgbGVmdDsgaisrKSB7CiAgICAgICAgICAgICAgZW5jb2Rpbmdbal0gPSBnaWQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBlbmNvZGluZyBmb3JtYXQ6ICR7Zm9ybWF0fSBpbiBDRkZgKTsKICAgICAgfQogICAgICBjb25zdCBkYXRhRW5kID0gcG9zOwogICAgICBpZiAoZm9ybWF0ICYgMHg4MCkgewogICAgICAgIGJ5dGVzW2RhdGFTdGFydF0gJj0gMHg3ZjsKICAgICAgICByZWFkU3VwcGxlbWVudCgpOwogICAgICB9CiAgICAgIHJhdyA9IGJ5dGVzLnN1YmFycmF5KGRhdGFTdGFydCwgZGF0YUVuZCk7CiAgICB9CiAgICBmb3JtYXQgJj0gMHg3ZjsKICAgIHJldHVybiBuZXcgQ0ZGRW5jb2RpbmcocHJlZGVmaW5lZCwgZm9ybWF0LCBlbmNvZGluZywgcmF3KTsKICB9CiAgcGFyc2VGRFNlbGVjdChwb3MsIGxlbmd0aCkgewogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgY29uc3QgZmRTZWxlY3QgPSBbXTsKICAgIGxldCBpOwogICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgY29uc3QgaWQgPSBieXRlc1twb3MrK107CiAgICAgICAgICBmZFNlbGVjdC5wdXNoKGlkKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBjb25zdCByYW5nZXNDb3VudCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZXNDb3VudDsgKytpKSB7CiAgICAgICAgICBsZXQgZmlyc3QgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGlmIChpID09PSAwICYmIGZpcnN0ICE9PSAwKSB7CiAgICAgICAgICAgIHdhcm4oInBhcnNlRkRTZWxlY3Q6IFRoZSBmaXJzdCByYW5nZSBtdXN0IGhhdmUgYSBmaXJzdCBHSUQgb2YgMCIgKyAiIC0tIHRyeWluZyB0byByZWNvdmVyLiIpOwogICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBmZEluZGV4ID0gYnl0ZXNbcG9zKytdOwogICAgICAgICAgY29uc3QgbmV4dCA9IGJ5dGVzW3Bvc10gPDwgOCB8IGJ5dGVzW3BvcyArIDFdOwogICAgICAgICAgZm9yIChsZXQgaiA9IGZpcnN0OyBqIDwgbmV4dDsgKytqKSB7CiAgICAgICAgICAgIGZkU2VsZWN0LnB1c2goZmRJbmRleCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvcyArPSAyOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgcGFyc2VGRFNlbGVjdDogVW5rbm93biBmb3JtYXQgIiR7Zm9ybWF0fSIuYCk7CiAgICB9CiAgICBpZiAoZmRTZWxlY3QubGVuZ3RoICE9PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJwYXJzZUZEU2VsZWN0OiBJbnZhbGlkIGZvbnQgZGF0YS4iKTsKICAgIH0KICAgIHJldHVybiBuZXcgQ0ZGRkRTZWxlY3QoZm9ybWF0LCBmZFNlbGVjdCk7CiAgfQp9CmNsYXNzIENGRiB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmhlYWRlciA9IG51bGw7CiAgICB0aGlzLm5hbWVzID0gW107CiAgICB0aGlzLnRvcERpY3QgPSBudWxsOwogICAgdGhpcy5zdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTsKICAgIHRoaXMuZ2xvYmFsU3VickluZGV4ID0gbnVsbDsKICAgIHRoaXMuZW5jb2RpbmcgPSBudWxsOwogICAgdGhpcy5jaGFyc2V0ID0gbnVsbDsKICAgIHRoaXMuY2hhclN0cmluZ3MgPSBudWxsOwogICAgdGhpcy5mZEFycmF5ID0gW107CiAgICB0aGlzLmZkU2VsZWN0ID0gbnVsbDsKICAgIHRoaXMuaXNDSURGb250ID0gZmFsc2U7CiAgfQogIGR1cGxpY2F0ZUZpcnN0R2x5cGgoKSB7CiAgICBpZiAodGhpcy5jaGFyU3RyaW5ncy5jb3VudCA+PSA2NTUzNSkgewogICAgICB3YXJuKCJOb3QgZW5vdWdoIHNwYWNlIGluIGNoYXJzdHJpbmdzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZ2x5cGhaZXJvID0gdGhpcy5jaGFyU3RyaW5ncy5nZXQoMCk7CiAgICB0aGlzLmNoYXJTdHJpbmdzLmFkZChnbHlwaFplcm8pOwogICAgaWYgKHRoaXMuaXNDSURGb250KSB7CiAgICAgIHRoaXMuZmRTZWxlY3QuZmRTZWxlY3QucHVzaCh0aGlzLmZkU2VsZWN0LmZkU2VsZWN0WzBdKTsKICAgIH0KICB9CiAgaGFzR2x5cGhJZChpZCkgewogICAgaWYgKGlkIDwgMCB8fCBpZCA+PSB0aGlzLmNoYXJTdHJpbmdzLmNvdW50KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IGdseXBoID0gdGhpcy5jaGFyU3RyaW5ncy5nZXQoaWQpOwogICAgcmV0dXJuIGdseXBoLmxlbmd0aCA+IDA7CiAgfQp9CmNsYXNzIENGRkhlYWRlciB7CiAgY29uc3RydWN0b3IobWFqb3IsIG1pbm9yLCBoZHJTaXplLCBvZmZTaXplKSB7CiAgICB0aGlzLm1ham9yID0gbWFqb3I7CiAgICB0aGlzLm1pbm9yID0gbWlub3I7CiAgICB0aGlzLmhkclNpemUgPSBoZHJTaXplOwogICAgdGhpcy5vZmZTaXplID0gb2ZmU2l6ZTsKICB9Cn0KY2xhc3MgQ0ZGU3RyaW5ncyB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLnN0cmluZ3MgPSBbXTsKICB9CiAgZ2V0KGluZGV4KSB7CiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1MgLSAxKSB7CiAgICAgIHJldHVybiBDRkZTdGFuZGFyZFN0cmluZ3NbaW5kZXhdOwogICAgfQogICAgaWYgKGluZGV4IC0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTIDw9IHRoaXMuc3RyaW5ncy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nc1tpbmRleCAtIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HU107CiAgICB9CiAgICByZXR1cm4gQ0ZGU3RhbmRhcmRTdHJpbmdzWzBdOwogIH0KICBnZXRTSUQoc3RyKSB7CiAgICBsZXQgaW5kZXggPSBDRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihzdHIpOwogICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgICBpbmRleCA9IHRoaXMuc3RyaW5ncy5pbmRleE9mKHN0cik7CiAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgIHJldHVybiBpbmRleCArIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUzsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgYWRkKHZhbHVlKSB7CiAgICB0aGlzLnN0cmluZ3MucHVzaCh2YWx1ZSk7CiAgfQogIGdldCBjb3VudCgpIHsKICAgIHJldHVybiB0aGlzLnN0cmluZ3MubGVuZ3RoOwogIH0KfQpjbGFzcyBDRkZJbmRleCB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLm9iamVjdHMgPSBbXTsKICAgIHRoaXMubGVuZ3RoID0gMDsKICB9CiAgYWRkKGRhdGEpIHsKICAgIHRoaXMubGVuZ3RoICs9IGRhdGEubGVuZ3RoOwogICAgdGhpcy5vYmplY3RzLnB1c2goZGF0YSk7CiAgfQogIHNldChpbmRleCwgZGF0YSkgewogICAgdGhpcy5sZW5ndGggKz0gZGF0YS5sZW5ndGggLSB0aGlzLm9iamVjdHNbaW5kZXhdLmxlbmd0aDsKICAgIHRoaXMub2JqZWN0c1tpbmRleF0gPSBkYXRhOwogIH0KICBnZXQoaW5kZXgpIHsKICAgIHJldHVybiB0aGlzLm9iamVjdHNbaW5kZXhdOwogIH0KICBnZXQgY291bnQoKSB7CiAgICByZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aDsKICB9Cn0KY2xhc3MgQ0ZGRGljdCB7CiAgY29uc3RydWN0b3IodGFibGVzLCBzdHJpbmdzKSB7CiAgICB0aGlzLmtleVRvTmFtZU1hcCA9IHRhYmxlcy5rZXlUb05hbWVNYXA7CiAgICB0aGlzLm5hbWVUb0tleU1hcCA9IHRhYmxlcy5uYW1lVG9LZXlNYXA7CiAgICB0aGlzLmRlZmF1bHRzID0gdGFibGVzLmRlZmF1bHRzOwogICAgdGhpcy50eXBlcyA9IHRhYmxlcy50eXBlczsKICAgIHRoaXMub3Bjb2RlcyA9IHRhYmxlcy5vcGNvZGVzOwogICAgdGhpcy5vcmRlciA9IHRhYmxlcy5vcmRlcjsKICAgIHRoaXMuc3RyaW5ncyA9IHN0cmluZ3M7CiAgICB0aGlzLnZhbHVlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgfQogIHNldEJ5S2V5KGtleSwgdmFsdWUpIHsKICAgIGlmICghKGtleSBpbiB0aGlzLmtleVRvTmFtZU1hcCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlKSB7CiAgICAgIGlmIChpc05hTih2YWwpKSB7CiAgICAgICAgd2FybihgSW52YWxpZCBDRkZEaWN0IHZhbHVlOiAiJHt2YWx1ZX0iIGZvciBrZXkgIiR7a2V5fSIuYCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVzW2tleV07CiAgICBpZiAodHlwZSA9PT0gIm51bSIgfHwgdHlwZSA9PT0gInNpZCIgfHwgdHlwZSA9PT0gIm9mZnNldCIpIHsKICAgICAgdmFsdWUgPSB2YWx1ZVswXTsKICAgIH0KICAgIHRoaXMudmFsdWVzW2tleV0gPSB2YWx1ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBzZXRCeU5hbWUobmFtZSwgdmFsdWUpIHsKICAgIGlmICghKG5hbWUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBkaWN0aW9uYXJ5IG5hbWUgIiR7bmFtZX0iYCk7CiAgICB9CiAgICB0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtuYW1lXV0gPSB2YWx1ZTsKICB9CiAgaGFzTmFtZShuYW1lKSB7CiAgICByZXR1cm4gdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV0gaW4gdGhpcy52YWx1ZXM7CiAgfQogIGdldEJ5TmFtZShuYW1lKSB7CiAgICBpZiAoIShuYW1lIGluIHRoaXMubmFtZVRvS2V5TWFwKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZGljdGlvbmFyeSBuYW1lICR7bmFtZX0iYCk7CiAgICB9CiAgICBjb25zdCBrZXkgPSB0aGlzLm5hbWVUb0tleU1hcFtuYW1lXTsKICAgIGlmICghKGtleSBpbiB0aGlzLnZhbHVlcykpIHsKICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdHNba2V5XTsKICAgIH0KICAgIHJldHVybiB0aGlzLnZhbHVlc1trZXldOwogIH0KICByZW1vdmVCeU5hbWUobmFtZSkgewogICAgZGVsZXRlIHRoaXMudmFsdWVzW3RoaXMubmFtZVRvS2V5TWFwW25hbWVdXTsKICB9CiAgc3RhdGljIGNyZWF0ZVRhYmxlcyhsYXlvdXQpIHsKICAgIGNvbnN0IHRhYmxlcyA9IHsKICAgICAga2V5VG9OYW1lTWFwOiB7fSwKICAgICAgbmFtZVRvS2V5TWFwOiB7fSwKICAgICAgZGVmYXVsdHM6IHt9LAogICAgICB0eXBlczoge30sCiAgICAgIG9wY29kZXM6IHt9LAogICAgICBvcmRlcjogW10KICAgIH07CiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxheW91dCkgewogICAgICBjb25zdCBrZXkgPSBBcnJheS5pc0FycmF5KGVudHJ5WzBdKSA/IChlbnRyeVswXVswXSA8PCA4KSArIGVudHJ5WzBdWzFdIDogZW50cnlbMF07CiAgICAgIHRhYmxlcy5rZXlUb05hbWVNYXBba2V5XSA9IGVudHJ5WzFdOwogICAgICB0YWJsZXMubmFtZVRvS2V5TWFwW2VudHJ5WzFdXSA9IGtleTsKICAgICAgdGFibGVzLnR5cGVzW2tleV0gPSBlbnRyeVsyXTsKICAgICAgdGFibGVzLmRlZmF1bHRzW2tleV0gPSBlbnRyeVszXTsKICAgICAgdGFibGVzLm9wY29kZXNba2V5XSA9IEFycmF5LmlzQXJyYXkoZW50cnlbMF0pID8gZW50cnlbMF0gOiBbZW50cnlbMF1dOwogICAgICB0YWJsZXMub3JkZXIucHVzaChrZXkpOwogICAgfQogICAgcmV0dXJuIHRhYmxlczsKICB9Cn0KY29uc3QgQ0ZGVG9wRGljdExheW91dCA9IFtbWzEyLCAzMF0sICJST1MiLCBbInNpZCIsICJzaWQiLCAibnVtIl0sIG51bGxdLCBbWzEyLCAyMF0sICJTeW50aGV0aWNCYXNlIiwgIm51bSIsIG51bGxdLCBbMCwgInZlcnNpb24iLCAic2lkIiwgbnVsbF0sIFsxLCAiTm90aWNlIiwgInNpZCIsIG51bGxdLCBbWzEyLCAwXSwgIkNvcHlyaWdodCIsICJzaWQiLCBudWxsXSwgWzIsICJGdWxsTmFtZSIsICJzaWQiLCBudWxsXSwgWzMsICJGYW1pbHlOYW1lIiwgInNpZCIsIG51bGxdLCBbNCwgIldlaWdodCIsICJzaWQiLCBudWxsXSwgW1sxMiwgMV0sICJpc0ZpeGVkUGl0Y2giLCAibnVtIiwgMF0sIFtbMTIsIDJdLCAiSXRhbGljQW5nbGUiLCAibnVtIiwgMF0sIFtbMTIsIDNdLCAiVW5kZXJsaW5lUG9zaXRpb24iLCAibnVtIiwgLTEwMF0sIFtbMTIsIDRdLCAiVW5kZXJsaW5lVGhpY2tuZXNzIiwgIm51bSIsIDUwXSwgW1sxMiwgNV0sICJQYWludFR5cGUiLCAibnVtIiwgMF0sIFtbMTIsIDZdLCAiQ2hhcnN0cmluZ1R5cGUiLCAibnVtIiwgMl0sIFtbMTIsIDddLCAiRm9udE1hdHJpeCIsIFsibnVtIiwgIm51bSIsICJudW0iLCAibnVtIiwgIm51bSIsICJudW0iXSwgWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF1dLCBbMTMsICJVbmlxdWVJRCIsICJudW0iLCBudWxsXSwgWzUsICJGb250QkJveCIsIFsibnVtIiwgIm51bSIsICJudW0iLCAibnVtIl0sIFswLCAwLCAwLCAwXV0sIFtbMTIsIDhdLCAiU3Ryb2tlV2lkdGgiLCAibnVtIiwgMF0sIFsxNCwgIlhVSUQiLCAiYXJyYXkiLCBudWxsXSwgWzE1LCAiY2hhcnNldCIsICJvZmZzZXQiLCAwXSwgWzE2LCAiRW5jb2RpbmciLCAib2Zmc2V0IiwgMF0sIFsxNywgIkNoYXJTdHJpbmdzIiwgIm9mZnNldCIsIDBdLCBbMTgsICJQcml2YXRlIiwgWyJvZmZzZXQiLCAib2Zmc2V0Il0sIG51bGxdLCBbWzEyLCAyMV0sICJQb3N0U2NyaXB0IiwgInNpZCIsIG51bGxdLCBbWzEyLCAyMl0sICJCYXNlRm9udE5hbWUiLCAic2lkIiwgbnVsbF0sIFtbMTIsIDIzXSwgIkJhc2VGb250QmxlbmQiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMzFdLCAiQ0lERm9udFZlcnNpb24iLCAibnVtIiwgMF0sIFtbMTIsIDMyXSwgIkNJREZvbnRSZXZpc2lvbiIsICJudW0iLCAwXSwgW1sxMiwgMzNdLCAiQ0lERm9udFR5cGUiLCAibnVtIiwgMF0sIFtbMTIsIDM0XSwgIkNJRENvdW50IiwgIm51bSIsIDg3MjBdLCBbWzEyLCAzNV0sICJVSURCYXNlIiwgIm51bSIsIG51bGxdLCBbWzEyLCAzN10sICJGRFNlbGVjdCIsICJvZmZzZXQiLCBudWxsXSwgW1sxMiwgMzZdLCAiRkRBcnJheSIsICJvZmZzZXQiLCBudWxsXSwgW1sxMiwgMzhdLCAiRm9udE5hbWUiLCAic2lkIiwgbnVsbF1dOwpjbGFzcyBDRkZUb3BEaWN0IGV4dGVuZHMgQ0ZGRGljdCB7CiAgc3RhdGljIGdldCB0YWJsZXMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ0YWJsZXMiLCB0aGlzLmNyZWF0ZVRhYmxlcyhDRkZUb3BEaWN0TGF5b3V0KSk7CiAgfQogIGNvbnN0cnVjdG9yKHN0cmluZ3MpIHsKICAgIHN1cGVyKENGRlRvcERpY3QudGFibGVzLCBzdHJpbmdzKTsKICAgIHRoaXMucHJpdmF0ZURpY3QgPSBudWxsOwogIH0KfQpjb25zdCBDRkZQcml2YXRlRGljdExheW91dCA9IFtbNiwgIkJsdWVWYWx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzcsICJPdGhlckJsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFs4LCAiRmFtaWx5Qmx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzksICJGYW1pbHlPdGhlckJsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDldLCAiQmx1ZVNjYWxlIiwgIm51bSIsIDAuMDM5NjI1XSwgW1sxMiwgMTBdLCAiQmx1ZVNoaWZ0IiwgIm51bSIsIDddLCBbWzEyLCAxMV0sICJCbHVlRnV6eiIsICJudW0iLCAxXSwgWzEwLCAiU3RkSFciLCAibnVtIiwgbnVsbF0sIFsxMSwgIlN0ZFZXIiwgIm51bSIsIG51bGxdLCBbWzEyLCAxMl0sICJTdGVtU25hcEgiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMTNdLCAiU3RlbVNuYXBWIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDE0XSwgIkZvcmNlQm9sZCIsICJudW0iLCAwXSwgW1sxMiwgMTddLCAiTGFuZ3VhZ2VHcm91cCIsICJudW0iLCAwXSwgW1sxMiwgMThdLCAiRXhwYW5zaW9uRmFjdG9yIiwgIm51bSIsIDAuMDZdLCBbWzEyLCAxOV0sICJpbml0aWFsUmFuZG9tU2VlZCIsICJudW0iLCAwXSwgWzIwLCAiZGVmYXVsdFdpZHRoWCIsICJudW0iLCAwXSwgWzIxLCAibm9taW5hbFdpZHRoWCIsICJudW0iLCAwXSwgWzE5LCAiU3VicnMiLCAib2Zmc2V0IiwgbnVsbF1dOwpjbGFzcyBDRkZQcml2YXRlRGljdCBleHRlbmRzIENGRkRpY3QgewogIHN0YXRpYyBnZXQgdGFibGVzKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidGFibGVzIiwgdGhpcy5jcmVhdGVUYWJsZXMoQ0ZGUHJpdmF0ZURpY3RMYXlvdXQpKTsKICB9CiAgY29uc3RydWN0b3Ioc3RyaW5ncykgewogICAgc3VwZXIoQ0ZGUHJpdmF0ZURpY3QudGFibGVzLCBzdHJpbmdzKTsKICAgIHRoaXMuc3VicnNJbmRleCA9IG51bGw7CiAgfQp9CmNvbnN0IENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMgPSB7CiAgSVNPX0FET0JFOiAwLAogIEVYUEVSVDogMSwKICBFWFBFUlRfU1VCU0VUOiAyCn07CmNsYXNzIENGRkNoYXJzZXQgewogIGNvbnN0cnVjdG9yKHByZWRlZmluZWQsIGZvcm1hdCwgY2hhcnNldCwgcmF3KSB7CiAgICB0aGlzLnByZWRlZmluZWQgPSBwcmVkZWZpbmVkOwogICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CiAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0OwogICAgdGhpcy5yYXcgPSByYXc7CiAgfQp9CmNsYXNzIENGRkVuY29kaW5nIHsKICBjb25zdHJ1Y3RvcihwcmVkZWZpbmVkLCBmb3JtYXQsIGVuY29kaW5nLCByYXcpIHsKICAgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7CiAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKICAgIHRoaXMucmF3ID0gcmF3OwogIH0KfQpjbGFzcyBDRkZGRFNlbGVjdCB7CiAgY29uc3RydWN0b3IoZm9ybWF0LCBmZFNlbGVjdCkgewogICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CiAgICB0aGlzLmZkU2VsZWN0ID0gZmRTZWxlY3Q7CiAgfQogIGdldEZESW5kZXgoZ2x5cGhJbmRleCkgewogICAgaWYgKGdseXBoSW5kZXggPCAwIHx8IGdseXBoSW5kZXggPj0gdGhpcy5mZFNlbGVjdC5sZW5ndGgpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIHRoaXMuZmRTZWxlY3RbZ2x5cGhJbmRleF07CiAgfQp9CmNsYXNzIENGRk9mZnNldFRyYWNrZXIgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5vZmZzZXRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB9CiAgaXNUcmFja2luZyhrZXkpIHsKICAgIHJldHVybiBrZXkgaW4gdGhpcy5vZmZzZXRzOwogIH0KICB0cmFjayhrZXksIGxvY2F0aW9uKSB7CiAgICBpZiAoa2V5IGluIHRoaXMub2Zmc2V0cykgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEFscmVhZHkgdHJhY2tpbmcgbG9jYXRpb24gb2YgJHtrZXl9YCk7CiAgICB9CiAgICB0aGlzLm9mZnNldHNba2V5XSA9IGxvY2F0aW9uOwogIH0KICBvZmZzZXQodmFsdWUpIHsKICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMub2Zmc2V0cykgewogICAgICB0aGlzLm9mZnNldHNba2V5XSArPSB2YWx1ZTsKICAgIH0KICB9CiAgc2V0RW50cnlMb2NhdGlvbihrZXksIHZhbHVlcywgb3V0cHV0KSB7CiAgICBpZiAoIShrZXkgaW4gdGhpcy5vZmZzZXRzKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYE5vdCB0cmFja2luZyBsb2NhdGlvbiBvZiAke2tleX1gKTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBvdXRwdXQuZGF0YTsKICAgIGNvbnN0IGRhdGFPZmZzZXQgPSB0aGlzLm9mZnNldHNba2V5XTsKICAgIGNvbnN0IHNpemUgPSA1OwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmFsdWVzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgY29uc3Qgb2Zmc2V0MCA9IGkgKiBzaXplICsgZGF0YU9mZnNldDsKICAgICAgY29uc3Qgb2Zmc2V0MSA9IG9mZnNldDAgKyAxOwogICAgICBjb25zdCBvZmZzZXQyID0gb2Zmc2V0MCArIDI7CiAgICAgIGNvbnN0IG9mZnNldDMgPSBvZmZzZXQwICsgMzsKICAgICAgY29uc3Qgb2Zmc2V0NCA9IG9mZnNldDAgKyA0OwogICAgICBpZiAoZGF0YVtvZmZzZXQwXSAhPT0gMHgxZCB8fCBkYXRhW29mZnNldDFdICE9PSAwIHx8IGRhdGFbb2Zmc2V0Ml0gIT09IDAgfHwgZGF0YVtvZmZzZXQzXSAhPT0gMCB8fCBkYXRhW29mZnNldDRdICE9PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJ3cml0aW5nIHRvIGFuIG9mZnNldCB0aGF0IGlzIG5vdCBlbXB0eSIpOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldOwogICAgICBkYXRhW29mZnNldDBdID0gMHgxZDsKICAgICAgZGF0YVtvZmZzZXQxXSA9IHZhbHVlID4+IDI0ICYgMHhmZjsKICAgICAgZGF0YVtvZmZzZXQyXSA9IHZhbHVlID4+IDE2ICYgMHhmZjsKICAgICAgZGF0YVtvZmZzZXQzXSA9IHZhbHVlID4+IDggJiAweGZmOwogICAgICBkYXRhW29mZnNldDRdID0gdmFsdWUgJiAweGZmOwogICAgfQogIH0KfQpjbGFzcyBDRkZDb21waWxlciB7CiAgY29uc3RydWN0b3IoY2ZmKSB7CiAgICB0aGlzLmNmZiA9IGNmZjsKICB9CiAgY29tcGlsZSgpIHsKICAgIGNvbnN0IGNmZiA9IHRoaXMuY2ZmOwogICAgY29uc3Qgb3V0cHV0ID0gewogICAgICBkYXRhOiBbXSwKICAgICAgbGVuZ3RoOiAwLAogICAgICBhZGQoZGF0YSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmRhdGEucHVzaCguLi5kYXRhKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoZGF0YSk7CiAgICAgICAgfQogICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuY29tcGlsZUhlYWRlcihjZmYuaGVhZGVyKTsKICAgIG91dHB1dC5hZGQoaGVhZGVyKTsKICAgIGNvbnN0IG5hbWVJbmRleCA9IHRoaXMuY29tcGlsZU5hbWVJbmRleChjZmYubmFtZXMpOwogICAgb3V0cHV0LmFkZChuYW1lSW5kZXgpOwogICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgaWYgKGNmZi50b3BEaWN0Lmhhc05hbWUoIkZvbnRNYXRyaXgiKSkgewogICAgICAgIGNvbnN0IGJhc2UgPSBjZmYudG9wRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTsKICAgICAgICBjZmYudG9wRGljdC5yZW1vdmVCeU5hbWUoIkZvbnRNYXRyaXgiKTsKICAgICAgICBmb3IgKGNvbnN0IHN1YkRpY3Qgb2YgY2ZmLmZkQXJyYXkpIHsKICAgICAgICAgIGxldCBtYXRyaXggPSBiYXNlLnNsaWNlKDApOwogICAgICAgICAgaWYgKHN1YkRpY3QuaGFzTmFtZSgiRm9udE1hdHJpeCIpKSB7CiAgICAgICAgICAgIG1hdHJpeCA9IFV0aWwudHJhbnNmb3JtKG1hdHJpeCwgc3ViRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKSk7CiAgICAgICAgICB9CiAgICAgICAgICBzdWJEaWN0LnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCB4dWlkID0gY2ZmLnRvcERpY3QuZ2V0QnlOYW1lKCJYVUlEIik7CiAgICBpZiAoeHVpZD8ubGVuZ3RoID4gMTYpIHsKICAgICAgY2ZmLnRvcERpY3QucmVtb3ZlQnlOYW1lKCJYVUlEIik7CiAgICB9CiAgICBjZmYudG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLCAwKTsKICAgIGxldCBjb21waWxlZCA9IHRoaXMuY29tcGlsZVRvcERpY3RzKFtjZmYudG9wRGljdF0sIG91dHB1dC5sZW5ndGgsIGNmZi5pc0NJREZvbnQpOwogICAgb3V0cHV0LmFkZChjb21waWxlZC5vdXRwdXQpOwogICAgY29uc3QgdG9wRGljdFRyYWNrZXIgPSBjb21waWxlZC50cmFja2Vyc1swXTsKICAgIGNvbnN0IHN0cmluZ0luZGV4ID0gdGhpcy5jb21waWxlU3RyaW5nSW5kZXgoY2ZmLnN0cmluZ3Muc3RyaW5ncyk7CiAgICBvdXRwdXQuYWRkKHN0cmluZ0luZGV4KTsKICAgIGNvbnN0IGdsb2JhbFN1YnJJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGNmZi5nbG9iYWxTdWJySW5kZXgpOwogICAgb3V0cHV0LmFkZChnbG9iYWxTdWJySW5kZXgpOwogICAgaWYgKGNmZi5lbmNvZGluZyAmJiBjZmYudG9wRGljdC5oYXNOYW1lKCJFbmNvZGluZyIpKSB7CiAgICAgIGlmIChjZmYuZW5jb2RpbmcucHJlZGVmaW5lZCkgewogICAgICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIkVuY29kaW5nIiwgW2NmZi5lbmNvZGluZy5mb3JtYXRdLCBvdXRwdXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGVuY29kaW5nID0gdGhpcy5jb21waWxlRW5jb2RpbmcoY2ZmLmVuY29kaW5nKTsKICAgICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJFbmNvZGluZyIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgICAgICBvdXRwdXQuYWRkKGVuY29kaW5nKTsKICAgICAgfQogICAgfQogICAgY29uc3QgY2hhcnNldCA9IHRoaXMuY29tcGlsZUNoYXJzZXQoY2ZmLmNoYXJzZXQsIGNmZi5jaGFyU3RyaW5ncy5jb3VudCwgY2ZmLnN0cmluZ3MsIGNmZi5pc0NJREZvbnQpOwogICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiY2hhcnNldCIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgIG91dHB1dC5hZGQoY2hhcnNldCk7CiAgICBjb25zdCBjaGFyU3RyaW5ncyA9IHRoaXMuY29tcGlsZUNoYXJTdHJpbmdzKGNmZi5jaGFyU3RyaW5ncyk7CiAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJDaGFyU3RyaW5ncyIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgIG91dHB1dC5hZGQoY2hhclN0cmluZ3MpOwogICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiRkRTZWxlY3QiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CiAgICAgIGNvbnN0IGZkU2VsZWN0ID0gdGhpcy5jb21waWxlRkRTZWxlY3QoY2ZmLmZkU2VsZWN0KTsKICAgICAgb3V0cHV0LmFkZChmZFNlbGVjdCk7CiAgICAgIGNvbXBpbGVkID0gdGhpcy5jb21waWxlVG9wRGljdHMoY2ZmLmZkQXJyYXksIG91dHB1dC5sZW5ndGgsIHRydWUpOwogICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJGREFycmF5IiwgW291dHB1dC5sZW5ndGhdLCBvdXRwdXQpOwogICAgICBvdXRwdXQuYWRkKGNvbXBpbGVkLm91dHB1dCk7CiAgICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlcnMgPSBjb21waWxlZC50cmFja2VyczsKICAgICAgdGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKGNmZi5mZEFycmF5LCBmb250RGljdFRyYWNrZXJzLCBvdXRwdXQpOwogICAgfQogICAgdGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKFtjZmYudG9wRGljdF0sIFt0b3BEaWN0VHJhY2tlcl0sIG91dHB1dCk7CiAgICBvdXRwdXQuYWRkKFswXSk7CiAgICByZXR1cm4gb3V0cHV0LmRhdGE7CiAgfQogIGVuY29kZU51bWJlcih2YWx1ZSkgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7CiAgICAgIHJldHVybiB0aGlzLmVuY29kZUludGVnZXIodmFsdWUpOwogICAgfQogICAgcmV0dXJuIHRoaXMuZW5jb2RlRmxvYXQodmFsdWUpOwogIH0KICBzdGF0aWMgZ2V0IEVuY29kZUZsb2F0UmVnRXhwKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiRW5jb2RlRmxvYXRSZWdFeHAiLCAvXC4oXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXGR7MCwyfSg/OmUoLispfCQpLyk7CiAgfQogIGVuY29kZUZsb2F0KG51bSkgewogICAgbGV0IHZhbHVlID0gbnVtLnRvU3RyaW5nKCk7CiAgICBjb25zdCBtID0gQ0ZGQ29tcGlsZXIuRW5jb2RlRmxvYXRSZWdFeHAuZXhlYyh2YWx1ZSk7CiAgICBpZiAobSkgewogICAgICBjb25zdCBlcHNpbG9uID0gcGFyc2VGbG9hdCgiMWUiICsgKChtWzJdID8gK21bMl0gOiAwKSArIG1bMV0ubGVuZ3RoKSk7CiAgICAgIHZhbHVlID0gKE1hdGgucm91bmQobnVtICogZXBzaWxvbikgLyBlcHNpbG9uKS50b1N0cmluZygpOwogICAgfQogICAgbGV0IG5pYmJsZXMgPSAiIjsKICAgIGxldCBpLCBpaTsKICAgIGZvciAoaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBhID0gdmFsdWVbaV07CiAgICAgIGlmIChhID09PSAiZSIpIHsKICAgICAgICBuaWJibGVzICs9IHZhbHVlWysraV0gPT09ICItIiA/ICJjIiA6ICJiIjsKICAgICAgfSBlbHNlIGlmIChhID09PSAiLiIpIHsKICAgICAgICBuaWJibGVzICs9ICJhIjsKICAgICAgfSBlbHNlIGlmIChhID09PSAiLSIpIHsKICAgICAgICBuaWJibGVzICs9ICJlIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuaWJibGVzICs9IGE7CiAgICAgIH0KICAgIH0KICAgIG5pYmJsZXMgKz0gbmliYmxlcy5sZW5ndGggJiAxID8gImYiIDogImZmIjsKICAgIGNvbnN0IG91dCA9IFszMF07CiAgICBmb3IgKGkgPSAwLCBpaSA9IG5pYmJsZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBvdXQucHVzaChwYXJzZUludChuaWJibGVzLnN1YnN0cmluZyhpLCBpICsgMiksIDE2KSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBlbmNvZGVJbnRlZ2VyKHZhbHVlKSB7CiAgICBsZXQgY29kZTsKICAgIGlmICh2YWx1ZSA+PSAtMTA3ICYmIHZhbHVlIDw9IDEwNykgewogICAgICBjb2RlID0gW3ZhbHVlICsgMTM5XTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMTA4ICYmIHZhbHVlIDw9IDExMzEpIHsKICAgICAgdmFsdWUgLT0gMTA4OwogICAgICBjb2RlID0gWyh2YWx1ZSA+PiA4KSArIDI0NywgdmFsdWUgJiAweGZmXTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gLTExMzEgJiYgdmFsdWUgPD0gLTEwOCkgewogICAgICB2YWx1ZSA9IC12YWx1ZSAtIDEwODsKICAgICAgY29kZSA9IFsodmFsdWUgPj4gOCkgKyAyNTEsIHZhbHVlICYgMHhmZl07CiAgICB9IGVsc2UgaWYgKHZhbHVlID49IC0zMjc2OCAmJiB2YWx1ZSA8PSAzMjc2NykgewogICAgICBjb2RlID0gWzB4MWMsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmZdOwogICAgfSBlbHNlIHsKICAgICAgY29kZSA9IFsweDFkLCB2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZl07CiAgICB9CiAgICByZXR1cm4gY29kZTsKICB9CiAgY29tcGlsZUhlYWRlcihoZWFkZXIpIHsKICAgIHJldHVybiBbaGVhZGVyLm1ham9yLCBoZWFkZXIubWlub3IsIDQsIGhlYWRlci5vZmZTaXplXTsKICB9CiAgY29tcGlsZU5hbWVJbmRleChuYW1lcykgewogICAgY29uc3QgbmFtZUluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5taW4obmFtZS5sZW5ndGgsIDEyNyk7CiAgICAgIGxldCBzYW5pdGl6ZWROYW1lID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKICAgICAgICBsZXQgY2hhciA9IG5hbWVbal07CiAgICAgICAgaWYgKGNoYXIgPCAiISIgfHwgY2hhciA+ICJ+IiB8fCBjaGFyID09PSAiWyIgfHwgY2hhciA9PT0gIl0iIHx8IGNoYXIgPT09ICIoIiB8fCBjaGFyID09PSAiKSIgfHwgY2hhciA9PT0gInsiIHx8IGNoYXIgPT09ICJ9IiB8fCBjaGFyID09PSAiPCIgfHwgY2hhciA9PT0gIj4iIHx8IGNoYXIgPT09ICIvIiB8fCBjaGFyID09PSAiJSIpIHsKICAgICAgICAgIGNoYXIgPSAiXyI7CiAgICAgICAgfQogICAgICAgIHNhbml0aXplZE5hbWVbal0gPSBjaGFyOwogICAgICB9CiAgICAgIHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZWROYW1lLmpvaW4oIiIpOwogICAgICBpZiAoc2FuaXRpemVkTmFtZSA9PT0gIiIpIHsKICAgICAgICBzYW5pdGl6ZWROYW1lID0gIkJhZF9Gb250X05hbWUiOwogICAgICB9CiAgICAgIG5hbWVJbmRleC5hZGQoc3RyaW5nVG9CeXRlcyhzYW5pdGl6ZWROYW1lKSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlSW5kZXgobmFtZUluZGV4KTsKICB9CiAgY29tcGlsZVRvcERpY3RzKGRpY3RzLCBsZW5ndGgsIHJlbW92ZUNpZEtleXMpIHsKICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlcnMgPSBbXTsKICAgIGxldCBmZEFycmF5SW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAoY29uc3QgZm9udERpY3Qgb2YgZGljdHMpIHsKICAgICAgaWYgKHJlbW92ZUNpZEtleXMpIHsKICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRWZXJzaW9uIik7CiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURGb250UmV2aXNpb24iKTsKICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRUeXBlIik7CiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURDb3VudCIpOwogICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZSgiVUlEQmFzZSIpOwogICAgICB9CiAgICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7CiAgICAgIGNvbnN0IGZvbnREaWN0RGF0YSA9IHRoaXMuY29tcGlsZURpY3QoZm9udERpY3QsIGZvbnREaWN0VHJhY2tlcik7CiAgICAgIGZvbnREaWN0VHJhY2tlcnMucHVzaChmb250RGljdFRyYWNrZXIpOwogICAgICBmZEFycmF5SW5kZXguYWRkKGZvbnREaWN0RGF0YSk7CiAgICAgIGZvbnREaWN0VHJhY2tlci5vZmZzZXQobGVuZ3RoKTsKICAgIH0KICAgIGZkQXJyYXlJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGZkQXJyYXlJbmRleCwgZm9udERpY3RUcmFja2Vycyk7CiAgICByZXR1cm4gewogICAgICB0cmFja2VyczogZm9udERpY3RUcmFja2VycywKICAgICAgb3V0cHV0OiBmZEFycmF5SW5kZXgKICAgIH07CiAgfQogIGNvbXBpbGVQcml2YXRlRGljdHMoZGljdHMsIHRyYWNrZXJzLCBvdXRwdXQpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRpY3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgY29uc3QgZm9udERpY3QgPSBkaWN0c1tpXTsKICAgICAgY29uc3QgcHJpdmF0ZURpY3QgPSBmb250RGljdC5wcml2YXRlRGljdDsKICAgICAgaWYgKCFwcml2YXRlRGljdCB8fCAhZm9udERpY3QuaGFzTmFtZSgiUHJpdmF0ZSIpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJUaGVyZSBtdXN0IGJlIGEgcHJpdmF0ZSBkaWN0aW9uYXJ5LiIpOwogICAgICB9CiAgICAgIGNvbnN0IHByaXZhdGVEaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7CiAgICAgIGNvbnN0IHByaXZhdGVEaWN0RGF0YSA9IHRoaXMuY29tcGlsZURpY3QocHJpdmF0ZURpY3QsIHByaXZhdGVEaWN0VHJhY2tlcik7CiAgICAgIGxldCBvdXRwdXRMZW5ndGggPSBvdXRwdXQubGVuZ3RoOwogICAgICBwcml2YXRlRGljdFRyYWNrZXIub2Zmc2V0KG91dHB1dExlbmd0aCk7CiAgICAgIGlmICghcHJpdmF0ZURpY3REYXRhLmxlbmd0aCkgewogICAgICAgIG91dHB1dExlbmd0aCA9IDA7CiAgICAgIH0KICAgICAgdHJhY2tlcnNbaV0uc2V0RW50cnlMb2NhdGlvbigiUHJpdmF0ZSIsIFtwcml2YXRlRGljdERhdGEubGVuZ3RoLCBvdXRwdXRMZW5ndGhdLCBvdXRwdXQpOwogICAgICBvdXRwdXQuYWRkKHByaXZhdGVEaWN0RGF0YSk7CiAgICAgIGlmIChwcml2YXRlRGljdC5zdWJyc0luZGV4ICYmIHByaXZhdGVEaWN0Lmhhc05hbWUoIlN1YnJzIikpIHsKICAgICAgICBjb25zdCBzdWJycyA9IHRoaXMuY29tcGlsZUluZGV4KHByaXZhdGVEaWN0LnN1YnJzSW5kZXgpOwogICAgICAgIHByaXZhdGVEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJTdWJycyIsIFtwcml2YXRlRGljdERhdGEubGVuZ3RoXSwgb3V0cHV0KTsKICAgICAgICBvdXRwdXQuYWRkKHN1YnJzKTsKICAgICAgfQogICAgfQogIH0KICBjb21waWxlRGljdChkaWN0LCBvZmZzZXRUcmFja2VyKSB7CiAgICBjb25zdCBvdXQgPSBbXTsKICAgIGZvciAoY29uc3Qga2V5IG9mIGRpY3Qub3JkZXIpIHsKICAgICAgaWYgKCEoa2V5IGluIGRpY3QudmFsdWVzKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCB2YWx1ZXMgPSBkaWN0LnZhbHVlc1trZXldOwogICAgICBsZXQgdHlwZXMgPSBkaWN0LnR5cGVzW2tleV07CiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlcykpIHsKICAgICAgICB0eXBlcyA9IFt0eXBlc107CiAgICAgIH0KICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHsKICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTsKICAgICAgfQogICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHR5cGVzLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKICAgICAgICBjb25zdCB0eXBlID0gdHlwZXNbal07CiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbal07CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlICJudW0iOgogICAgICAgICAgY2FzZSAic2lkIjoKICAgICAgICAgICAgb3V0LnB1c2goLi4udGhpcy5lbmNvZGVOdW1iZXIodmFsdWUpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJvZmZzZXQiOgogICAgICAgICAgICBjb25zdCBuYW1lID0gZGljdC5rZXlUb05hbWVNYXBba2V5XTsKICAgICAgICAgICAgaWYgKCFvZmZzZXRUcmFja2VyLmlzVHJhY2tpbmcobmFtZSkpIHsKICAgICAgICAgICAgICBvZmZzZXRUcmFja2VyLnRyYWNrKG5hbWUsIG91dC5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dC5wdXNoKDB4MWQsIDAsIDAsIDAsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImFycmF5IjoKICAgICAgICAgIGNhc2UgImRlbHRhIjoKICAgICAgICAgICAgb3V0LnB1c2goLi4udGhpcy5lbmNvZGVOdW1iZXIodmFsdWUpKTsKICAgICAgICAgICAgZm9yIChsZXQgayA9IDEsIGtrID0gdmFsdWVzLmxlbmd0aDsgayA8IGtrOyArK2spIHsKICAgICAgICAgICAgICBvdXQucHVzaCguLi50aGlzLmVuY29kZU51bWJlcih2YWx1ZXNba10pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgb2YgJHt0eXBlfWApOwogICAgICAgIH0KICAgICAgfQogICAgICBvdXQucHVzaCguLi5kaWN0Lm9wY29kZXNba2V5XSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBjb21waWxlU3RyaW5nSW5kZXgoc3RyaW5ncykgewogICAgY29uc3Qgc3RyaW5nSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAoY29uc3Qgc3RyaW5nIG9mIHN0cmluZ3MpIHsKICAgICAgc3RyaW5nSW5kZXguYWRkKHN0cmluZ1RvQnl0ZXMoc3RyaW5nKSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlSW5kZXgoc3RyaW5nSW5kZXgpOwogIH0KICBjb21waWxlQ2hhclN0cmluZ3MoY2hhclN0cmluZ3MpIHsKICAgIGNvbnN0IGNoYXJTdHJpbmdzSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhclN0cmluZ3MuY291bnQ7IGkrKykgewogICAgICBjb25zdCBnbHlwaCA9IGNoYXJTdHJpbmdzLmdldChpKTsKICAgICAgaWYgKGdseXBoLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKG5ldyBVaW50OEFycmF5KFsweDhiLCAweDBlXSkpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKGdseXBoKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmNvbXBpbGVJbmRleChjaGFyU3RyaW5nc0luZGV4KTsKICB9CiAgY29tcGlsZUNoYXJzZXQoY2hhcnNldCwgbnVtR2x5cGhzLCBzdHJpbmdzLCBpc0NJREZvbnQpIHsKICAgIGxldCBvdXQ7CiAgICBjb25zdCBudW1HbHlwaHNMZXNzTm90RGVmID0gbnVtR2x5cGhzIC0gMTsKICAgIGlmIChpc0NJREZvbnQpIHsKICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoWzIsIDAsIDAsIG51bUdseXBoc0xlc3NOb3REZWYgPj4gOCAmIDB4ZmYsIG51bUdseXBoc0xlc3NOb3REZWYgJiAweGZmXSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBsZW5ndGggPSAxICsgbnVtR2x5cGhzTGVzc05vdERlZiAqIDI7CiAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgICAgIG91dFswXSA9IDA7CiAgICAgIGxldCBjaGFyc2V0SW5kZXggPSAwOwogICAgICBjb25zdCBudW1DaGFyc2V0cyA9IGNoYXJzZXQuY2hhcnNldC5sZW5ndGg7CiAgICAgIGxldCB3YXJuZWQgPSBmYWxzZTsKICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICBsZXQgc2lkID0gMDsKICAgICAgICBpZiAoY2hhcnNldEluZGV4IDwgbnVtQ2hhcnNldHMpIHsKICAgICAgICAgIGNvbnN0IG5hbWUgPSBjaGFyc2V0LmNoYXJzZXRbY2hhcnNldEluZGV4KytdOwogICAgICAgICAgc2lkID0gc3RyaW5ncy5nZXRTSUQobmFtZSk7CiAgICAgICAgICBpZiAoc2lkID09PSAtMSkgewogICAgICAgICAgICBzaWQgPSAwOwogICAgICAgICAgICBpZiAoIXdhcm5lZCkgewogICAgICAgICAgICAgIHdhcm5lZCA9IHRydWU7CiAgICAgICAgICAgICAgd2FybihgQ291bGRuJ3QgZmluZCAke25hbWV9IGluIENGRiBzdHJpbmdzYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb3V0W2ldID0gc2lkID4+IDggJiAweGZmOwogICAgICAgIG91dFtpICsgMV0gPSBzaWQgJiAweGZmOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOwogIH0KICBjb21waWxlRW5jb2RpbmcoZW5jb2RpbmcpIHsKICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KGVuY29kaW5nLnJhdyk7CiAgfQogIGNvbXBpbGVGRFNlbGVjdChmZFNlbGVjdCkgewogICAgY29uc3QgZm9ybWF0ID0gZmRTZWxlY3QuZm9ybWF0OwogICAgbGV0IG91dCwgaTsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBvdXQgPSBuZXcgVWludDhBcnJheSgxICsgZmRTZWxlY3QuZmRTZWxlY3QubGVuZ3RoKTsKICAgICAgICBvdXRbMF0gPSBmb3JtYXQ7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGZkU2VsZWN0LmZkU2VsZWN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBvdXRbaSArIDFdID0gZmRTZWxlY3QuZmRTZWxlY3RbaV07CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgY29uc3Qgc3RhcnQgPSAwOwogICAgICAgIGxldCBsYXN0RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFswXTsKICAgICAgICBjb25zdCByYW5nZXMgPSBbZm9ybWF0LCAwLCAwLCBzdGFydCA+PiA4ICYgMHhmZiwgc3RhcnQgJiAweGZmLCBsYXN0RkRdOwogICAgICAgIGZvciAoaSA9IDE7IGkgPCBmZFNlbGVjdC5mZFNlbGVjdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgY3VycmVudEZEID0gZmRTZWxlY3QuZmRTZWxlY3RbaV07CiAgICAgICAgICBpZiAoY3VycmVudEZEICE9PSBsYXN0RkQpIHsKICAgICAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYsIGN1cnJlbnRGRCk7CiAgICAgICAgICAgIGxhc3RGRCA9IGN1cnJlbnRGRDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgbnVtUmFuZ2VzID0gKHJhbmdlcy5sZW5ndGggLSAzKSAvIDM7CiAgICAgICAgcmFuZ2VzWzFdID0gbnVtUmFuZ2VzID4+IDggJiAweGZmOwogICAgICAgIHJhbmdlc1syXSA9IG51bVJhbmdlcyAmIDB4ZmY7CiAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYpOwogICAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KHJhbmdlcyk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOwogIH0KICBjb21waWxlVHlwZWRBcnJheShkYXRhKSB7CiAgICByZXR1cm4gQXJyYXkuZnJvbShkYXRhKTsKICB9CiAgY29tcGlsZUluZGV4KGluZGV4LCB0cmFja2VycyA9IFtdKSB7CiAgICBjb25zdCBvYmplY3RzID0gaW5kZXgub2JqZWN0czsKICAgIGNvbnN0IGNvdW50ID0gb2JqZWN0cy5sZW5ndGg7CiAgICBpZiAoY291bnQgPT09IDApIHsKICAgICAgcmV0dXJuIFswLCAwXTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBbY291bnQgPj4gOCAmIDB4ZmYsIGNvdW50ICYgMHhmZl07CiAgICBsZXQgbGFzdE9mZnNldCA9IDEsCiAgICAgIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICBsYXN0T2Zmc2V0ICs9IG9iamVjdHNbaV0ubGVuZ3RoOwogICAgfQogICAgbGV0IG9mZnNldFNpemU7CiAgICBpZiAobGFzdE9mZnNldCA8IDB4MTAwKSB7CiAgICAgIG9mZnNldFNpemUgPSAxOwogICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMCkgewogICAgICBvZmZzZXRTaXplID0gMjsKICAgIH0gZWxzZSBpZiAobGFzdE9mZnNldCA8IDB4MTAwMDAwMCkgewogICAgICBvZmZzZXRTaXplID0gMzsKICAgIH0gZWxzZSB7CiAgICAgIG9mZnNldFNpemUgPSA0OwogICAgfQogICAgZGF0YS5wdXNoKG9mZnNldFNpemUpOwogICAgbGV0IHJlbGF0aXZlT2Zmc2V0ID0gMTsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCArIDE7IGkrKykgewogICAgICBpZiAob2Zmc2V0U2l6ZSA9PT0gMSkgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9IGVsc2UgaWYgKG9mZnNldFNpemUgPT09IDIpIHsKICAgICAgICBkYXRhLnB1c2gocmVsYXRpdmVPZmZzZXQgPj4gOCAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ICYgMHhmZik7CiAgICAgIH0gZWxzZSBpZiAob2Zmc2V0U2l6ZSA9PT0gMykgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9IGVsc2UgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+Pj4gMjQgJiAweGZmLCByZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9CiAgICAgIGlmIChvYmplY3RzW2ldKSB7CiAgICAgICAgcmVsYXRpdmVPZmZzZXQgKz0gb2JqZWN0c1tpXS5sZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGlmICh0cmFja2Vyc1tpXSkgewogICAgICAgIHRyYWNrZXJzW2ldLm9mZnNldChkYXRhLmxlbmd0aCk7CiAgICAgIH0KICAgICAgZGF0YS5wdXNoKC4uLm9iamVjdHNbaV0pOwogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9nbHlwaGxpc3QuanMKCmNvbnN0IGdldEdseXBoc1VuaWNvZGUgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkEgPSAweDAwNDE7CiAgdC5BRSA9IDB4MDBjNjsKICB0LkFFYWN1dGUgPSAweDAxZmM7CiAgdC5BRW1hY3JvbiA9IDB4MDFlMjsKICB0LkFFc21hbGwgPSAweGY3ZTY7CiAgdC5BYWN1dGUgPSAweDAwYzE7CiAgdC5BYWN1dGVzbWFsbCA9IDB4ZjdlMTsKICB0LkFicmV2ZSA9IDB4MDEwMjsKICB0LkFicmV2ZWFjdXRlID0gMHgxZWFlOwogIHQuQWJyZXZlY3lyaWxsaWMgPSAweDA0ZDA7CiAgdC5BYnJldmVkb3RiZWxvdyA9IDB4MWViNjsKICB0LkFicmV2ZWdyYXZlID0gMHgxZWIwOwogIHQuQWJyZXZlaG9va2Fib3ZlID0gMHgxZWIyOwogIHQuQWJyZXZldGlsZGUgPSAweDFlYjQ7CiAgdC5BY2Fyb24gPSAweDAxY2Q7CiAgdC5BY2lyY2xlID0gMHgyNGI2OwogIHQuQWNpcmN1bWZsZXggPSAweDAwYzI7CiAgdC5BY2lyY3VtZmxleGFjdXRlID0gMHgxZWE0OwogIHQuQWNpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVhYzsKICB0LkFjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYTY7CiAgdC5BY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVhODsKICB0LkFjaXJjdW1mbGV4c21hbGwgPSAweGY3ZTI7CiAgdC5BY2lyY3VtZmxleHRpbGRlID0gMHgxZWFhOwogIHQuQWN1dGUgPSAweGY2Yzk7CiAgdC5BY3V0ZXNtYWxsID0gMHhmN2I0OwogIHQuQWN5cmlsbGljID0gMHgwNDEwOwogIHQuQWRibGdyYXZlID0gMHgwMjAwOwogIHQuQWRpZXJlc2lzID0gMHgwMGM0OwogIHQuQWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZDI7CiAgdC5BZGllcmVzaXNtYWNyb24gPSAweDAxZGU7CiAgdC5BZGllcmVzaXNzbWFsbCA9IDB4ZjdlNDsKICB0LkFkb3RiZWxvdyA9IDB4MWVhMDsKICB0LkFkb3RtYWNyb24gPSAweDAxZTA7CiAgdC5BZ3JhdmUgPSAweDAwYzA7CiAgdC5BZ3JhdmVzbWFsbCA9IDB4ZjdlMDsKICB0LkFob29rYWJvdmUgPSAweDFlYTI7CiAgdC5BaWVjeXJpbGxpYyA9IDB4MDRkNDsKICB0LkFpbnZlcnRlZGJyZXZlID0gMHgwMjAyOwogIHQuQWxwaGEgPSAweDAzOTE7CiAgdC5BbHBoYXRvbm9zID0gMHgwMzg2OwogIHQuQW1hY3JvbiA9IDB4MDEwMDsKICB0LkFtb25vc3BhY2UgPSAweGZmMjE7CiAgdC5Bb2dvbmVrID0gMHgwMTA0OwogIHQuQXJpbmcgPSAweDAwYzU7CiAgdC5BcmluZ2FjdXRlID0gMHgwMWZhOwogIHQuQXJpbmdiZWxvdyA9IDB4MWUwMDsKICB0LkFyaW5nc21hbGwgPSAweGY3ZTU7CiAgdC5Bc21hbGwgPSAweGY3NjE7CiAgdC5BdGlsZGUgPSAweDAwYzM7CiAgdC5BdGlsZGVzbWFsbCA9IDB4ZjdlMzsKICB0LkF5YmFybWVuaWFuID0gMHgwNTMxOwogIHQuQiA9IDB4MDA0MjsKICB0LkJjaXJjbGUgPSAweDI0Yjc7CiAgdC5CZG90YWNjZW50ID0gMHgxZTAyOwogIHQuQmRvdGJlbG93ID0gMHgxZTA0OwogIHQuQmVjeXJpbGxpYyA9IDB4MDQxMTsKICB0LkJlbmFybWVuaWFuID0gMHgwNTMyOwogIHQuQmV0YSA9IDB4MDM5MjsKICB0LkJob29rID0gMHgwMTgxOwogIHQuQmxpbmViZWxvdyA9IDB4MWUwNjsKICB0LkJtb25vc3BhY2UgPSAweGZmMjI7CiAgdC5CcmV2ZXNtYWxsID0gMHhmNmY0OwogIHQuQnNtYWxsID0gMHhmNzYyOwogIHQuQnRvcGJhciA9IDB4MDE4MjsKICB0LkMgPSAweDAwNDM7CiAgdC5DYWFybWVuaWFuID0gMHgwNTNlOwogIHQuQ2FjdXRlID0gMHgwMTA2OwogIHQuQ2Fyb24gPSAweGY2Y2E7CiAgdC5DYXJvbnNtYWxsID0gMHhmNmY1OwogIHQuQ2Nhcm9uID0gMHgwMTBjOwogIHQuQ2NlZGlsbGEgPSAweDAwYzc7CiAgdC5DY2VkaWxsYWFjdXRlID0gMHgxZTA4OwogIHQuQ2NlZGlsbGFzbWFsbCA9IDB4ZjdlNzsKICB0LkNjaXJjbGUgPSAweDI0Yjg7CiAgdC5DY2lyY3VtZmxleCA9IDB4MDEwODsKICB0LkNkb3QgPSAweDAxMGE7CiAgdC5DZG90YWNjZW50ID0gMHgwMTBhOwogIHQuQ2VkaWxsYXNtYWxsID0gMHhmN2I4OwogIHQuQ2hhYXJtZW5pYW4gPSAweDA1NDk7CiAgdC5DaGVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiYzsKICB0LkNoZWN5cmlsbGljID0gMHgwNDI3OwogIHQuQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YmU7CiAgdC5DaGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiNjsKICB0LkNoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjQ7CiAgdC5DaGVoYXJtZW5pYW4gPSAweDA1NDM7CiAgdC5DaGVraGFrYXNzaWFuY3lyaWxsaWMgPSAweDA0Y2I7CiAgdC5DaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNGI4OwogIHQuQ2hpID0gMHgwM2E3OwogIHQuQ2hvb2sgPSAweDAxODc7CiAgdC5DaXJjdW1mbGV4c21hbGwgPSAweGY2ZjY7CiAgdC5DbW9ub3NwYWNlID0gMHhmZjIzOwogIHQuQ29hcm1lbmlhbiA9IDB4MDU1MTsKICB0LkNzbWFsbCA9IDB4Zjc2MzsKICB0LkQgPSAweDAwNDQ7CiAgdC5EWiA9IDB4MDFmMTsKICB0LkRaY2Fyb24gPSAweDAxYzQ7CiAgdC5EYWFybWVuaWFuID0gMHgwNTM0OwogIHQuRGFmcmljYW4gPSAweDAxODk7CiAgdC5EY2Fyb24gPSAweDAxMGU7CiAgdC5EY2VkaWxsYSA9IDB4MWUxMDsKICB0LkRjaXJjbGUgPSAweDI0Yjk7CiAgdC5EY2lyY3VtZmxleGJlbG93ID0gMHgxZTEyOwogIHQuRGNyb2F0ID0gMHgwMTEwOwogIHQuRGRvdGFjY2VudCA9IDB4MWUwYTsKICB0LkRkb3RiZWxvdyA9IDB4MWUwYzsKICB0LkRlY3lyaWxsaWMgPSAweDA0MTQ7CiAgdC5EZWljb3B0aWMgPSAweDAzZWU7CiAgdC5EZWx0YSA9IDB4MjIwNjsKICB0LkRlbHRhZ3JlZWsgPSAweDAzOTQ7CiAgdC5EaG9vayA9IDB4MDE4YTsKICB0LkRpZXJlc2lzID0gMHhmNmNiOwogIHQuRGllcmVzaXNBY3V0ZSA9IDB4ZjZjYzsKICB0LkRpZXJlc2lzR3JhdmUgPSAweGY2Y2Q7CiAgdC5EaWVyZXNpc3NtYWxsID0gMHhmN2E4OwogIHQuRGlnYW1tYWdyZWVrID0gMHgwM2RjOwogIHQuRGplY3lyaWxsaWMgPSAweDA0MDI7CiAgdC5EbGluZWJlbG93ID0gMHgxZTBlOwogIHQuRG1vbm9zcGFjZSA9IDB4ZmYyNDsKICB0LkRvdGFjY2VudHNtYWxsID0gMHhmNmY3OwogIHQuRHNsYXNoID0gMHgwMTEwOwogIHQuRHNtYWxsID0gMHhmNzY0OwogIHQuRHRvcGJhciA9IDB4MDE4YjsKICB0LkR6ID0gMHgwMWYyOwogIHQuRHpjYXJvbiA9IDB4MDFjNTsKICB0LkR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUwOwogIHQuRHplY3lyaWxsaWMgPSAweDA0MDU7CiAgdC5EemhlY3lyaWxsaWMgPSAweDA0MGY7CiAgdC5FID0gMHgwMDQ1OwogIHQuRWFjdXRlID0gMHgwMGM5OwogIHQuRWFjdXRlc21hbGwgPSAweGY3ZTk7CiAgdC5FYnJldmUgPSAweDAxMTQ7CiAgdC5FY2Fyb24gPSAweDAxMWE7CiAgdC5FY2VkaWxsYWJyZXZlID0gMHgxZTFjOwogIHQuRWNoYXJtZW5pYW4gPSAweDA1MzU7CiAgdC5FY2lyY2xlID0gMHgyNGJhOwogIHQuRWNpcmN1bWZsZXggPSAweDAwY2E7CiAgdC5FY2lyY3VtZmxleGFjdXRlID0gMHgxZWJlOwogIHQuRWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxODsKICB0LkVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzY7CiAgdC5FY2lyY3VtZmxleGdyYXZlID0gMHgxZWMwOwogIHQuRWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzI7CiAgdC5FY2lyY3VtZmxleHNtYWxsID0gMHhmN2VhOwogIHQuRWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVjNDsKICB0LkVjeXJpbGxpYyA9IDB4MDQwNDsKICB0LkVkYmxncmF2ZSA9IDB4MDIwNDsKICB0LkVkaWVyZXNpcyA9IDB4MDBjYjsKICB0LkVkaWVyZXNpc3NtYWxsID0gMHhmN2ViOwogIHQuRWRvdCA9IDB4MDExNjsKICB0LkVkb3RhY2NlbnQgPSAweDAxMTY7CiAgdC5FZG90YmVsb3cgPSAweDFlYjg7CiAgdC5FZmN5cmlsbGljID0gMHgwNDI0OwogIHQuRWdyYXZlID0gMHgwMGM4OwogIHQuRWdyYXZlc21hbGwgPSAweGY3ZTg7CiAgdC5FaGFybWVuaWFuID0gMHgwNTM3OwogIHQuRWhvb2thYm92ZSA9IDB4MWViYTsKICB0LkVpZ2h0cm9tYW4gPSAweDIxNjc7CiAgdC5FaW52ZXJ0ZWRicmV2ZSA9IDB4MDIwNjsKICB0LkVpb3RpZmllZGN5cmlsbGljID0gMHgwNDY0OwogIHQuRWxjeXJpbGxpYyA9IDB4MDQxYjsKICB0LkVsZXZlbnJvbWFuID0gMHgyMTZhOwogIHQuRW1hY3JvbiA9IDB4MDExMjsKICB0LkVtYWNyb25hY3V0ZSA9IDB4MWUxNjsKICB0LkVtYWNyb25ncmF2ZSA9IDB4MWUxNDsKICB0LkVtY3lyaWxsaWMgPSAweDA0MWM7CiAgdC5FbW9ub3NwYWNlID0gMHhmZjI1OwogIHQuRW5jeXJpbGxpYyA9IDB4MDQxZDsKICB0LkVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTI7CiAgdC5FbmcgPSAweDAxNGE7CiAgdC5FbmdoZWN5cmlsbGljID0gMHgwNGE0OwogIHQuRW5ob29rY3lyaWxsaWMgPSAweDA0Yzc7CiAgdC5Fb2dvbmVrID0gMHgwMTE4OwogIHQuRW9wZW4gPSAweDAxOTA7CiAgdC5FcHNpbG9uID0gMHgwMzk1OwogIHQuRXBzaWxvbnRvbm9zID0gMHgwMzg4OwogIHQuRXJjeXJpbGxpYyA9IDB4MDQyMDsKICB0LkVyZXZlcnNlZCA9IDB4MDE4ZTsKICB0LkVyZXZlcnNlZGN5cmlsbGljID0gMHgwNDJkOwogIHQuRXNjeXJpbGxpYyA9IDB4MDQyMTsKICB0LkVzZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWE7CiAgdC5Fc2ggPSAweDAxYTk7CiAgdC5Fc21hbGwgPSAweGY3NjU7CiAgdC5FdGEgPSAweDAzOTc7CiAgdC5FdGFybWVuaWFuID0gMHgwNTM4OwogIHQuRXRhdG9ub3MgPSAweDAzODk7CiAgdC5FdGggPSAweDAwZDA7CiAgdC5FdGhzbWFsbCA9IDB4ZjdmMDsKICB0LkV0aWxkZSA9IDB4MWViYzsKICB0LkV0aWxkZWJlbG93ID0gMHgxZTFhOwogIHQuRXVybyA9IDB4MjBhYzsKICB0LkV6aCA9IDB4MDFiNzsKICB0LkV6aGNhcm9uID0gMHgwMWVlOwogIHQuRXpocmV2ZXJzZWQgPSAweDAxYjg7CiAgdC5GID0gMHgwMDQ2OwogIHQuRmNpcmNsZSA9IDB4MjRiYjsKICB0LkZkb3RhY2NlbnQgPSAweDFlMWU7CiAgdC5GZWhhcm1lbmlhbiA9IDB4MDU1NjsKICB0LkZlaWNvcHRpYyA9IDB4MDNlNDsKICB0LkZob29rID0gMHgwMTkxOwogIHQuRml0YWN5cmlsbGljID0gMHgwNDcyOwogIHQuRml2ZXJvbWFuID0gMHgyMTY0OwogIHQuRm1vbm9zcGFjZSA9IDB4ZmYyNjsKICB0LkZvdXJyb21hbiA9IDB4MjE2MzsKICB0LkZzbWFsbCA9IDB4Zjc2NjsKICB0LkcgPSAweDAwNDc7CiAgdC5HQnNxdWFyZSA9IDB4MzM4NzsKICB0LkdhY3V0ZSA9IDB4MDFmNDsKICB0LkdhbW1hID0gMHgwMzkzOwogIHQuR2FtbWFhZnJpY2FuID0gMHgwMTk0OwogIHQuR2FuZ2lhY29wdGljID0gMHgwM2VhOwogIHQuR2JyZXZlID0gMHgwMTFlOwogIHQuR2Nhcm9uID0gMHgwMWU2OwogIHQuR2NlZGlsbGEgPSAweDAxMjI7CiAgdC5HY2lyY2xlID0gMHgyNGJjOwogIHQuR2NpcmN1bWZsZXggPSAweDAxMWM7CiAgdC5HY29tbWFhY2NlbnQgPSAweDAxMjI7CiAgdC5HZG90ID0gMHgwMTIwOwogIHQuR2RvdGFjY2VudCA9IDB4MDEyMDsKICB0LkdlY3lyaWxsaWMgPSAweDA0MTM7CiAgdC5HaGFkYXJtZW5pYW4gPSAweDA1NDI7CiAgdC5HaGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTQ7CiAgdC5HaGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MjsKICB0LkdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkwOwogIHQuR2hvb2sgPSAweDAxOTM7CiAgdC5HaW1hcm1lbmlhbiA9IDB4MDUzMzsKICB0LkdqZWN5cmlsbGljID0gMHgwNDAzOwogIHQuR21hY3JvbiA9IDB4MWUyMDsKICB0Lkdtb25vc3BhY2UgPSAweGZmMjc7CiAgdC5HcmF2ZSA9IDB4ZjZjZTsKICB0LkdyYXZlc21hbGwgPSAweGY3NjA7CiAgdC5Hc21hbGwgPSAweGY3Njc7CiAgdC5Hc21hbGxob29rID0gMHgwMjliOwogIHQuR3N0cm9rZSA9IDB4MDFlNDsKICB0LkggPSAweDAwNDg7CiAgdC5IMTg1MzMgPSAweDI1Y2Y7CiAgdC5IMTg1NDMgPSAweDI1YWE7CiAgdC5IMTg1NTEgPSAweDI1YWI7CiAgdC5IMjIwNzMgPSAweDI1YTE7CiAgdC5IUHNxdWFyZSA9IDB4MzNjYjsKICB0LkhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTg7CiAgdC5IYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGIyOwogIHQuSGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQyYTsKICB0LkhiYXIgPSAweDAxMjY7CiAgdC5IYnJldmViZWxvdyA9IDB4MWUyYTsKICB0LkhjZWRpbGxhID0gMHgxZTI4OwogIHQuSGNpcmNsZSA9IDB4MjRiZDsKICB0LkhjaXJjdW1mbGV4ID0gMHgwMTI0OwogIHQuSGRpZXJlc2lzID0gMHgxZTI2OwogIHQuSGRvdGFjY2VudCA9IDB4MWUyMjsKICB0Lkhkb3RiZWxvdyA9IDB4MWUyNDsKICB0Lkhtb25vc3BhY2UgPSAweGZmMjg7CiAgdC5Ib2FybWVuaWFuID0gMHgwNTQwOwogIHQuSG9yaWNvcHRpYyA9IDB4MDNlODsKICB0LkhzbWFsbCA9IDB4Zjc2ODsKICB0Lkh1bmdhcnVtbGF1dCA9IDB4ZjZjZjsKICB0Lkh1bmdhcnVtbGF1dHNtYWxsID0gMHhmNmY4OwogIHQuSHpzcXVhcmUgPSAweDMzOTA7CiAgdC5JID0gMHgwMDQ5OwogIHQuSUFjeXJpbGxpYyA9IDB4MDQyZjsKICB0LklKID0gMHgwMTMyOwogIHQuSVVjeXJpbGxpYyA9IDB4MDQyZTsKICB0LklhY3V0ZSA9IDB4MDBjZDsKICB0LklhY3V0ZXNtYWxsID0gMHhmN2VkOwogIHQuSWJyZXZlID0gMHgwMTJjOwogIHQuSWNhcm9uID0gMHgwMWNmOwogIHQuSWNpcmNsZSA9IDB4MjRiZTsKICB0LkljaXJjdW1mbGV4ID0gMHgwMGNlOwogIHQuSWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdlZTsKICB0LkljeXJpbGxpYyA9IDB4MDQwNjsKICB0LklkYmxncmF2ZSA9IDB4MDIwODsKICB0LklkaWVyZXNpcyA9IDB4MDBjZjsKICB0LklkaWVyZXNpc2FjdXRlID0gMHgxZTJlOwogIHQuSWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTQ7CiAgdC5JZGllcmVzaXNzbWFsbCA9IDB4ZjdlZjsKICB0Lklkb3QgPSAweDAxMzA7CiAgdC5JZG90YWNjZW50ID0gMHgwMTMwOwogIHQuSWRvdGJlbG93ID0gMHgxZWNhOwogIHQuSWVicmV2ZWN5cmlsbGljID0gMHgwNGQ2OwogIHQuSWVjeXJpbGxpYyA9IDB4MDQxNTsKICB0LklmcmFrdHVyID0gMHgyMTExOwogIHQuSWdyYXZlID0gMHgwMGNjOwogIHQuSWdyYXZlc21hbGwgPSAweGY3ZWM7CiAgdC5JaG9va2Fib3ZlID0gMHgxZWM4OwogIHQuSWljeXJpbGxpYyA9IDB4MDQxODsKICB0LklpbnZlcnRlZGJyZXZlID0gMHgwMjBhOwogIHQuSWlzaG9ydGN5cmlsbGljID0gMHgwNDE5OwogIHQuSW1hY3JvbiA9IDB4MDEyYTsKICB0LkltYWNyb25jeXJpbGxpYyA9IDB4MDRlMjsKICB0Lkltb25vc3BhY2UgPSAweGZmMjk7CiAgdC5Jbmlhcm1lbmlhbiA9IDB4MDUzYjsKICB0LklvY3lyaWxsaWMgPSAweDA0MDE7CiAgdC5Jb2dvbmVrID0gMHgwMTJlOwogIHQuSW90YSA9IDB4MDM5OTsKICB0LklvdGFhZnJpY2FuID0gMHgwMTk2OwogIHQuSW90YWRpZXJlc2lzID0gMHgwM2FhOwogIHQuSW90YXRvbm9zID0gMHgwMzhhOwogIHQuSXNtYWxsID0gMHhmNzY5OwogIHQuSXN0cm9rZSA9IDB4MDE5NzsKICB0Lkl0aWxkZSA9IDB4MDEyODsKICB0Lkl0aWxkZWJlbG93ID0gMHgxZTJjOwogIHQuSXpoaXRzYWN5cmlsbGljID0gMHgwNDc0OwogIHQuSXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0NzY7CiAgdC5KID0gMHgwMDRhOwogIHQuSmFhcm1lbmlhbiA9IDB4MDU0MTsKICB0LkpjaXJjbGUgPSAweDI0YmY7CiAgdC5KY2lyY3VtZmxleCA9IDB4MDEzNDsKICB0LkplY3lyaWxsaWMgPSAweDA0MDg7CiAgdC5KaGVoYXJtZW5pYW4gPSAweDA1NGI7CiAgdC5KbW9ub3NwYWNlID0gMHhmZjJhOwogIHQuSnNtYWxsID0gMHhmNzZhOwogIHQuSyA9IDB4MDA0YjsKICB0LktCc3F1YXJlID0gMHgzMzg1OwogIHQuS0tzcXVhcmUgPSAweDMzY2Q7CiAgdC5LYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMDsKICB0LkthY3V0ZSA9IDB4MWUzMDsKICB0LkthY3lyaWxsaWMgPSAweDA0MWE7CiAgdC5LYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDlhOwogIHQuS2Fob29rY3lyaWxsaWMgPSAweDA0YzM7CiAgdC5LYXBwYSA9IDB4MDM5YTsKICB0Lkthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWU7CiAgdC5LYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWM7CiAgdC5LY2Fyb24gPSAweDAxZTg7CiAgdC5LY2VkaWxsYSA9IDB4MDEzNjsKICB0LktjaXJjbGUgPSAweDI0YzA7CiAgdC5LY29tbWFhY2NlbnQgPSAweDAxMzY7CiAgdC5LZG90YmVsb3cgPSAweDFlMzI7CiAgdC5LZWhhcm1lbmlhbiA9IDB4MDU1NDsKICB0LktlbmFybWVuaWFuID0gMHgwNTNmOwogIHQuS2hhY3lyaWxsaWMgPSAweDA0MjU7CiAgdC5LaGVpY29wdGljID0gMHgwM2U2OwogIHQuS2hvb2sgPSAweDAxOTg7CiAgdC5LamVjeXJpbGxpYyA9IDB4MDQwYzsKICB0LktsaW5lYmVsb3cgPSAweDFlMzQ7CiAgdC5LbW9ub3NwYWNlID0gMHhmZjJiOwogIHQuS29wcGFjeXJpbGxpYyA9IDB4MDQ4MDsKICB0LktvcHBhZ3JlZWsgPSAweDAzZGU7CiAgdC5Lc2ljeXJpbGxpYyA9IDB4MDQ2ZTsKICB0LktzbWFsbCA9IDB4Zjc2YjsKICB0LkwgPSAweDAwNGM7CiAgdC5MSiA9IDB4MDFjNzsKICB0LkxMID0gMHhmNmJmOwogIHQuTGFjdXRlID0gMHgwMTM5OwogIHQuTGFtYmRhID0gMHgwMzliOwogIHQuTGNhcm9uID0gMHgwMTNkOwogIHQuTGNlZGlsbGEgPSAweDAxM2I7CiAgdC5MY2lyY2xlID0gMHgyNGMxOwogIHQuTGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUzYzsKICB0Lkxjb21tYWFjY2VudCA9IDB4MDEzYjsKICB0Lkxkb3QgPSAweDAxM2Y7CiAgdC5MZG90YWNjZW50ID0gMHgwMTNmOwogIHQuTGRvdGJlbG93ID0gMHgxZTM2OwogIHQuTGRvdGJlbG93bWFjcm9uID0gMHgxZTM4OwogIHQuTGl3bmFybWVuaWFuID0gMHgwNTNjOwogIHQuTGogPSAweDAxYzg7CiAgdC5MamVjeXJpbGxpYyA9IDB4MDQwOTsKICB0LkxsaW5lYmVsb3cgPSAweDFlM2E7CiAgdC5MbW9ub3NwYWNlID0gMHhmZjJjOwogIHQuTHNsYXNoID0gMHgwMTQxOwogIHQuTHNsYXNoc21hbGwgPSAweGY2Zjk7CiAgdC5Mc21hbGwgPSAweGY3NmM7CiAgdC5NID0gMHgwMDRkOwogIHQuTUJzcXVhcmUgPSAweDMzODY7CiAgdC5NYWNyb24gPSAweGY2ZDA7CiAgdC5NYWNyb25zbWFsbCA9IDB4ZjdhZjsKICB0Lk1hY3V0ZSA9IDB4MWUzZTsKICB0Lk1jaXJjbGUgPSAweDI0YzI7CiAgdC5NZG90YWNjZW50ID0gMHgxZTQwOwogIHQuTWRvdGJlbG93ID0gMHgxZTQyOwogIHQuTWVuYXJtZW5pYW4gPSAweDA1NDQ7CiAgdC5NbW9ub3NwYWNlID0gMHhmZjJkOwogIHQuTXNtYWxsID0gMHhmNzZkOwogIHQuTXR1cm5lZCA9IDB4MDE5YzsKICB0Lk11ID0gMHgwMzljOwogIHQuTiA9IDB4MDA0ZTsKICB0Lk5KID0gMHgwMWNhOwogIHQuTmFjdXRlID0gMHgwMTQzOwogIHQuTmNhcm9uID0gMHgwMTQ3OwogIHQuTmNlZGlsbGEgPSAweDAxNDU7CiAgdC5OY2lyY2xlID0gMHgyNGMzOwogIHQuTmNpcmN1bWZsZXhiZWxvdyA9IDB4MWU0YTsKICB0Lk5jb21tYWFjY2VudCA9IDB4MDE0NTsKICB0Lk5kb3RhY2NlbnQgPSAweDFlNDQ7CiAgdC5OZG90YmVsb3cgPSAweDFlNDY7CiAgdC5OaG9va2xlZnQgPSAweDAxOWQ7CiAgdC5OaW5lcm9tYW4gPSAweDIxNjg7CiAgdC5OaiA9IDB4MDFjYjsKICB0Lk5qZWN5cmlsbGljID0gMHgwNDBhOwogIHQuTmxpbmViZWxvdyA9IDB4MWU0ODsKICB0Lk5tb25vc3BhY2UgPSAweGZmMmU7CiAgdC5Ob3dhcm1lbmlhbiA9IDB4MDU0NjsKICB0Lk5zbWFsbCA9IDB4Zjc2ZTsKICB0Lk50aWxkZSA9IDB4MDBkMTsKICB0Lk50aWxkZXNtYWxsID0gMHhmN2YxOwogIHQuTnUgPSAweDAzOWQ7CiAgdC5PID0gMHgwMDRmOwogIHQuT0UgPSAweDAxNTI7CiAgdC5PRXNtYWxsID0gMHhmNmZhOwogIHQuT2FjdXRlID0gMHgwMGQzOwogIHQuT2FjdXRlc21hbGwgPSAweGY3ZjM7CiAgdC5PYmFycmVkY3lyaWxsaWMgPSAweDA0ZTg7CiAgdC5PYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYTsKICB0Lk9icmV2ZSA9IDB4MDE0ZTsKICB0Lk9jYXJvbiA9IDB4MDFkMTsKICB0Lk9jZW50ZXJlZHRpbGRlID0gMHgwMTlmOwogIHQuT2NpcmNsZSA9IDB4MjRjNDsKICB0Lk9jaXJjdW1mbGV4ID0gMHgwMGQ0OwogIHQuT2NpcmN1bWZsZXhhY3V0ZSA9IDB4MWVkMDsKICB0Lk9jaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlZDg7CiAgdC5PY2lyY3VtZmxleGdyYXZlID0gMHgxZWQyOwogIHQuT2NpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlZDQ7CiAgdC5PY2lyY3VtZmxleHNtYWxsID0gMHhmN2Y0OwogIHQuT2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNjsKICB0Lk9jeXJpbGxpYyA9IDB4MDQxZTsKICB0Lk9kYmxhY3V0ZSA9IDB4MDE1MDsKICB0Lk9kYmxncmF2ZSA9IDB4MDIwYzsKICB0Lk9kaWVyZXNpcyA9IDB4MDBkNjsKICB0Lk9kaWVyZXNpc2N5cmlsbGljID0gMHgwNGU2OwogIHQuT2RpZXJlc2lzc21hbGwgPSAweGY3ZjY7CiAgdC5PZG90YmVsb3cgPSAweDFlY2M7CiAgdC5PZ29uZWtzbWFsbCA9IDB4ZjZmYjsKICB0Lk9ncmF2ZSA9IDB4MDBkMjsKICB0Lk9ncmF2ZXNtYWxsID0gMHhmN2YyOwogIHQuT2hhcm1lbmlhbiA9IDB4MDU1NTsKICB0Lk9obSA9IDB4MjEyNjsKICB0Lk9ob29rYWJvdmUgPSAweDFlY2U7CiAgdC5PaG9ybiA9IDB4MDFhMDsKICB0Lk9ob3JuYWN1dGUgPSAweDFlZGE7CiAgdC5PaG9ybmRvdGJlbG93ID0gMHgxZWUyOwogIHQuT2hvcm5ncmF2ZSA9IDB4MWVkYzsKICB0Lk9ob3JuaG9va2Fib3ZlID0gMHgxZWRlOwogIHQuT2hvcm50aWxkZSA9IDB4MWVlMDsKICB0Lk9odW5nYXJ1bWxhdXQgPSAweDAxNTA7CiAgdC5PaSA9IDB4MDFhMjsKICB0Lk9pbnZlcnRlZGJyZXZlID0gMHgwMjBlOwogIHQuT21hY3JvbiA9IDB4MDE0YzsKICB0Lk9tYWNyb25hY3V0ZSA9IDB4MWU1MjsKICB0Lk9tYWNyb25ncmF2ZSA9IDB4MWU1MDsKICB0Lk9tZWdhID0gMHgyMTI2OwogIHQuT21lZ2FjeXJpbGxpYyA9IDB4MDQ2MDsKICB0Lk9tZWdhZ3JlZWsgPSAweDAzYTk7CiAgdC5PbWVnYXJvdW5kY3lyaWxsaWMgPSAweDA0N2E7CiAgdC5PbWVnYXRpdGxvY3lyaWxsaWMgPSAweDA0N2M7CiAgdC5PbWVnYXRvbm9zID0gMHgwMzhmOwogIHQuT21pY3JvbiA9IDB4MDM5ZjsKICB0Lk9taWNyb250b25vcyA9IDB4MDM4YzsKICB0Lk9tb25vc3BhY2UgPSAweGZmMmY7CiAgdC5PbmVyb21hbiA9IDB4MjE2MDsKICB0Lk9vZ29uZWsgPSAweDAxZWE7CiAgdC5Pb2dvbmVrbWFjcm9uID0gMHgwMWVjOwogIHQuT29wZW4gPSAweDAxODY7CiAgdC5Pc2xhc2ggPSAweDAwZDg7CiAgdC5Pc2xhc2hhY3V0ZSA9IDB4MDFmZTsKICB0Lk9zbGFzaHNtYWxsID0gMHhmN2Y4OwogIHQuT3NtYWxsID0gMHhmNzZmOwogIHQuT3N0cm9rZWFjdXRlID0gMHgwMWZlOwogIHQuT3RjeXJpbGxpYyA9IDB4MDQ3ZTsKICB0Lk90aWxkZSA9IDB4MDBkNTsKICB0Lk90aWxkZWFjdXRlID0gMHgxZTRjOwogIHQuT3RpbGRlZGllcmVzaXMgPSAweDFlNGU7CiAgdC5PdGlsZGVzbWFsbCA9IDB4ZjdmNTsKICB0LlAgPSAweDAwNTA7CiAgdC5QYWN1dGUgPSAweDFlNTQ7CiAgdC5QY2lyY2xlID0gMHgyNGM1OwogIHQuUGRvdGFjY2VudCA9IDB4MWU1NjsKICB0LlBlY3lyaWxsaWMgPSAweDA0MWY7CiAgdC5QZWhhcm1lbmlhbiA9IDB4MDU0YTsKICB0LlBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE2OwogIHQuUGhpID0gMHgwM2E2OwogIHQuUGhvb2sgPSAweDAxYTQ7CiAgdC5QaSA9IDB4MDNhMDsKICB0LlBpd3Jhcm1lbmlhbiA9IDB4MDU1MzsKICB0LlBtb25vc3BhY2UgPSAweGZmMzA7CiAgdC5Qc2kgPSAweDAzYTg7CiAgdC5Qc2ljeXJpbGxpYyA9IDB4MDQ3MDsKICB0LlBzbWFsbCA9IDB4Zjc3MDsKICB0LlEgPSAweDAwNTE7CiAgdC5RY2lyY2xlID0gMHgyNGM2OwogIHQuUW1vbm9zcGFjZSA9IDB4ZmYzMTsKICB0LlFzbWFsbCA9IDB4Zjc3MTsKICB0LlIgPSAweDAwNTI7CiAgdC5SYWFybWVuaWFuID0gMHgwNTRjOwogIHQuUmFjdXRlID0gMHgwMTU0OwogIHQuUmNhcm9uID0gMHgwMTU4OwogIHQuUmNlZGlsbGEgPSAweDAxNTY7CiAgdC5SY2lyY2xlID0gMHgyNGM3OwogIHQuUmNvbW1hYWNjZW50ID0gMHgwMTU2OwogIHQuUmRibGdyYXZlID0gMHgwMjEwOwogIHQuUmRvdGFjY2VudCA9IDB4MWU1ODsKICB0LlJkb3RiZWxvdyA9IDB4MWU1YTsKICB0LlJkb3RiZWxvd21hY3JvbiA9IDB4MWU1YzsKICB0LlJlaGFybWVuaWFuID0gMHgwNTUwOwogIHQuUmZyYWt0dXIgPSAweDIxMWM7CiAgdC5SaG8gPSAweDAzYTE7CiAgdC5SaW5nc21hbGwgPSAweGY2ZmM7CiAgdC5SaW52ZXJ0ZWRicmV2ZSA9IDB4MDIxMjsKICB0LlJsaW5lYmVsb3cgPSAweDFlNWU7CiAgdC5SbW9ub3NwYWNlID0gMHhmZjMyOwogIHQuUnNtYWxsID0gMHhmNzcyOwogIHQuUnNtYWxsaW52ZXJ0ZWQgPSAweDAyODE7CiAgdC5Sc21hbGxpbnZlcnRlZHN1cGVyaW9yID0gMHgwMmI2OwogIHQuUyA9IDB4MDA1MzsKICB0LlNGMDEwMDAwID0gMHgyNTBjOwogIHQuU0YwMjAwMDAgPSAweDI1MTQ7CiAgdC5TRjAzMDAwMCA9IDB4MjUxMDsKICB0LlNGMDQwMDAwID0gMHgyNTE4OwogIHQuU0YwNTAwMDAgPSAweDI1M2M7CiAgdC5TRjA2MDAwMCA9IDB4MjUyYzsKICB0LlNGMDcwMDAwID0gMHgyNTM0OwogIHQuU0YwODAwMDAgPSAweDI1MWM7CiAgdC5TRjA5MDAwMCA9IDB4MjUyNDsKICB0LlNGMTAwMDAwID0gMHgyNTAwOwogIHQuU0YxMTAwMDAgPSAweDI1MDI7CiAgdC5TRjE5MDAwMCA9IDB4MjU2MTsKICB0LlNGMjAwMDAwID0gMHgyNTYyOwogIHQuU0YyMTAwMDAgPSAweDI1NTY7CiAgdC5TRjIyMDAwMCA9IDB4MjU1NTsKICB0LlNGMjMwMDAwID0gMHgyNTYzOwogIHQuU0YyNDAwMDAgPSAweDI1NTE7CiAgdC5TRjI1MDAwMCA9IDB4MjU1NzsKICB0LlNGMjYwMDAwID0gMHgyNTVkOwogIHQuU0YyNzAwMDAgPSAweDI1NWM7CiAgdC5TRjI4MDAwMCA9IDB4MjU1YjsKICB0LlNGMzYwMDAwID0gMHgyNTVlOwogIHQuU0YzNzAwMDAgPSAweDI1NWY7CiAgdC5TRjM4MDAwMCA9IDB4MjU1YTsKICB0LlNGMzkwMDAwID0gMHgyNTU0OwogIHQuU0Y0MDAwMDAgPSAweDI1Njk7CiAgdC5TRjQxMDAwMCA9IDB4MjU2NjsKICB0LlNGNDIwMDAwID0gMHgyNTYwOwogIHQuU0Y0MzAwMDAgPSAweDI1NTA7CiAgdC5TRjQ0MDAwMCA9IDB4MjU2YzsKICB0LlNGNDUwMDAwID0gMHgyNTY3OwogIHQuU0Y0NjAwMDAgPSAweDI1Njg7CiAgdC5TRjQ3MDAwMCA9IDB4MjU2NDsKICB0LlNGNDgwMDAwID0gMHgyNTY1OwogIHQuU0Y0OTAwMDAgPSAweDI1NTk7CiAgdC5TRjUwMDAwMCA9IDB4MjU1ODsKICB0LlNGNTEwMDAwID0gMHgyNTUyOwogIHQuU0Y1MjAwMDAgPSAweDI1NTM7CiAgdC5TRjUzMDAwMCA9IDB4MjU2YjsKICB0LlNGNTQwMDAwID0gMHgyNTZhOwogIHQuU2FjdXRlID0gMHgwMTVhOwogIHQuU2FjdXRlZG90YWNjZW50ID0gMHgxZTY0OwogIHQuU2FtcGlncmVlayA9IDB4MDNlMDsKICB0LlNjYXJvbiA9IDB4MDE2MDsKICB0LlNjYXJvbmRvdGFjY2VudCA9IDB4MWU2NjsKICB0LlNjYXJvbnNtYWxsID0gMHhmNmZkOwogIHQuU2NlZGlsbGEgPSAweDAxNWU7CiAgdC5TY2h3YSA9IDB4MDE4ZjsKICB0LlNjaHdhY3lyaWxsaWMgPSAweDA0ZDg7CiAgdC5TY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGE7CiAgdC5TY2lyY2xlID0gMHgyNGM4OwogIHQuU2NpcmN1bWZsZXggPSAweDAxNWM7CiAgdC5TY29tbWFhY2NlbnQgPSAweDAyMTg7CiAgdC5TZG90YWNjZW50ID0gMHgxZTYwOwogIHQuU2RvdGJlbG93ID0gMHgxZTYyOwogIHQuU2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY4OwogIHQuU2VoYXJtZW5pYW4gPSAweDA1NGQ7CiAgdC5TZXZlbnJvbWFuID0gMHgyMTY2OwogIHQuU2hhYXJtZW5pYW4gPSAweDA1NDc7CiAgdC5TaGFjeXJpbGxpYyA9IDB4MDQyODsKICB0LlNoY2hhY3lyaWxsaWMgPSAweDA0Mjk7CiAgdC5TaGVpY29wdGljID0gMHgwM2UyOwogIHQuU2hoYWN5cmlsbGljID0gMHgwNGJhOwogIHQuU2hpbWFjb3B0aWMgPSAweDAzZWM7CiAgdC5TaWdtYSA9IDB4MDNhMzsKICB0LlNpeHJvbWFuID0gMHgyMTY1OwogIHQuU21vbm9zcGFjZSA9IDB4ZmYzMzsKICB0LlNvZnRzaWduY3lyaWxsaWMgPSAweDA0MmM7CiAgdC5Tc21hbGwgPSAweGY3NzM7CiAgdC5TdGlnbWFncmVlayA9IDB4MDNkYTsKICB0LlQgPSAweDAwNTQ7CiAgdC5UYXUgPSAweDAzYTQ7CiAgdC5UYmFyID0gMHgwMTY2OwogIHQuVGNhcm9uID0gMHgwMTY0OwogIHQuVGNlZGlsbGEgPSAweDAxNjI7CiAgdC5UY2lyY2xlID0gMHgyNGM5OwogIHQuVGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MDsKICB0LlRjb21tYWFjY2VudCA9IDB4MDE2MjsKICB0LlRkb3RhY2NlbnQgPSAweDFlNmE7CiAgdC5UZG90YmVsb3cgPSAweDFlNmM7CiAgdC5UZWN5cmlsbGljID0gMHgwNDIyOwogIHQuVGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYzsKICB0LlRlbnJvbWFuID0gMHgyMTY5OwogIHQuVGV0c2VjeXJpbGxpYyA9IDB4MDRiNDsKICB0LlRoZXRhID0gMHgwMzk4OwogIHQuVGhvb2sgPSAweDAxYWM7CiAgdC5UaG9ybiA9IDB4MDBkZTsKICB0LlRob3Juc21hbGwgPSAweGY3ZmU7CiAgdC5UaHJlZXJvbWFuID0gMHgyMTYyOwogIHQuVGlsZGVzbWFsbCA9IDB4ZjZmZTsKICB0LlRpd25hcm1lbmlhbiA9IDB4MDU0ZjsKICB0LlRsaW5lYmVsb3cgPSAweDFlNmU7CiAgdC5UbW9ub3NwYWNlID0gMHhmZjM0OwogIHQuVG9hcm1lbmlhbiA9IDB4MDUzOTsKICB0LlRvbmVmaXZlID0gMHgwMWJjOwogIHQuVG9uZXNpeCA9IDB4MDE4NDsKICB0LlRvbmV0d28gPSAweDAxYTc7CiAgdC5UcmV0cm9mbGV4aG9vayA9IDB4MDFhZTsKICB0LlRzZWN5cmlsbGljID0gMHgwNDI2OwogIHQuVHNoZWN5cmlsbGljID0gMHgwNDBiOwogIHQuVHNtYWxsID0gMHhmNzc0OwogIHQuVHdlbHZlcm9tYW4gPSAweDIxNmI7CiAgdC5Ud29yb21hbiA9IDB4MjE2MTsKICB0LlUgPSAweDAwNTU7CiAgdC5VYWN1dGUgPSAweDAwZGE7CiAgdC5VYWN1dGVzbWFsbCA9IDB4ZjdmYTsKICB0LlVicmV2ZSA9IDB4MDE2YzsKICB0LlVjYXJvbiA9IDB4MDFkMzsKICB0LlVjaXJjbGUgPSAweDI0Y2E7CiAgdC5VY2lyY3VtZmxleCA9IDB4MDBkYjsKICB0LlVjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzY7CiAgdC5VY2lyY3VtZmxleHNtYWxsID0gMHhmN2ZiOwogIHQuVWN5cmlsbGljID0gMHgwNDIzOwogIHQuVWRibGFjdXRlID0gMHgwMTcwOwogIHQuVWRibGdyYXZlID0gMHgwMjE0OwogIHQuVWRpZXJlc2lzID0gMHgwMGRjOwogIHQuVWRpZXJlc2lzYWN1dGUgPSAweDAxZDc7CiAgdC5VZGllcmVzaXNiZWxvdyA9IDB4MWU3MjsKICB0LlVkaWVyZXNpc2Nhcm9uID0gMHgwMWQ5OwogIHQuVWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjA7CiAgdC5VZGllcmVzaXNncmF2ZSA9IDB4MDFkYjsKICB0LlVkaWVyZXNpc21hY3JvbiA9IDB4MDFkNTsKICB0LlVkaWVyZXNpc3NtYWxsID0gMHhmN2ZjOwogIHQuVWRvdGJlbG93ID0gMHgxZWU0OwogIHQuVWdyYXZlID0gMHgwMGQ5OwogIHQuVWdyYXZlc21hbGwgPSAweGY3Zjk7CiAgdC5VaG9va2Fib3ZlID0gMHgxZWU2OwogIHQuVWhvcm4gPSAweDAxYWY7CiAgdC5VaG9ybmFjdXRlID0gMHgxZWU4OwogIHQuVWhvcm5kb3RiZWxvdyA9IDB4MWVmMDsKICB0LlVob3JuZ3JhdmUgPSAweDFlZWE7CiAgdC5VaG9ybmhvb2thYm92ZSA9IDB4MWVlYzsKICB0LlVob3JudGlsZGUgPSAweDFlZWU7CiAgdC5VaHVuZ2FydW1sYXV0ID0gMHgwMTcwOwogIHQuVWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYyOwogIHQuVWludmVydGVkYnJldmUgPSAweDAyMTY7CiAgdC5Va2N5cmlsbGljID0gMHgwNDc4OwogIHQuVW1hY3JvbiA9IDB4MDE2YTsKICB0LlVtYWNyb25jeXJpbGxpYyA9IDB4MDRlZTsKICB0LlVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YTsKICB0LlVtb25vc3BhY2UgPSAweGZmMzU7CiAgdC5Vb2dvbmVrID0gMHgwMTcyOwogIHQuVXBzaWxvbiA9IDB4MDNhNTsKICB0LlVwc2lsb24xID0gMHgwM2QyOwogIHQuVXBzaWxvbmFjdXRlaG9va3N5bWJvbGdyZWVrID0gMHgwM2QzOwogIHQuVXBzaWxvbmFmcmljYW4gPSAweDAxYjE7CiAgdC5VcHNpbG9uZGllcmVzaXMgPSAweDAzYWI7CiAgdC5VcHNpbG9uZGllcmVzaXNob29rc3ltYm9sZ3JlZWsgPSAweDAzZDQ7CiAgdC5VcHNpbG9uaG9va3N5bWJvbCA9IDB4MDNkMjsKICB0LlVwc2lsb250b25vcyA9IDB4MDM4ZTsKICB0LlVyaW5nID0gMHgwMTZlOwogIHQuVXNob3J0Y3lyaWxsaWMgPSAweDA0MGU7CiAgdC5Vc21hbGwgPSAweGY3NzU7CiAgdC5Vc3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZTsKICB0LlVzdHJhaWdodHN0cm9rZWN5cmlsbGljID0gMHgwNGIwOwogIHQuVXRpbGRlID0gMHgwMTY4OwogIHQuVXRpbGRlYWN1dGUgPSAweDFlNzg7CiAgdC5VdGlsZGViZWxvdyA9IDB4MWU3NDsKICB0LlYgPSAweDAwNTY7CiAgdC5WY2lyY2xlID0gMHgyNGNiOwogIHQuVmRvdGJlbG93ID0gMHgxZTdlOwogIHQuVmVjeXJpbGxpYyA9IDB4MDQxMjsKICB0LlZld2FybWVuaWFuID0gMHgwNTRlOwogIHQuVmhvb2sgPSAweDAxYjI7CiAgdC5WbW9ub3NwYWNlID0gMHhmZjM2OwogIHQuVm9hcm1lbmlhbiA9IDB4MDU0ODsKICB0LlZzbWFsbCA9IDB4Zjc3NjsKICB0LlZ0aWxkZSA9IDB4MWU3YzsKICB0LlcgPSAweDAwNTc7CiAgdC5XYWN1dGUgPSAweDFlODI7CiAgdC5XY2lyY2xlID0gMHgyNGNjOwogIHQuV2NpcmN1bWZsZXggPSAweDAxNzQ7CiAgdC5XZGllcmVzaXMgPSAweDFlODQ7CiAgdC5XZG90YWNjZW50ID0gMHgxZTg2OwogIHQuV2RvdGJlbG93ID0gMHgxZTg4OwogIHQuV2dyYXZlID0gMHgxZTgwOwogIHQuV21vbm9zcGFjZSA9IDB4ZmYzNzsKICB0LldzbWFsbCA9IDB4Zjc3NzsKICB0LlggPSAweDAwNTg7CiAgdC5YY2lyY2xlID0gMHgyNGNkOwogIHQuWGRpZXJlc2lzID0gMHgxZThjOwogIHQuWGRvdGFjY2VudCA9IDB4MWU4YTsKICB0LlhlaGFybWVuaWFuID0gMHgwNTNkOwogIHQuWGkgPSAweDAzOWU7CiAgdC5YbW9ub3NwYWNlID0gMHhmZjM4OwogIHQuWHNtYWxsID0gMHhmNzc4OwogIHQuWSA9IDB4MDA1OTsKICB0LllhY3V0ZSA9IDB4MDBkZDsKICB0LllhY3V0ZXNtYWxsID0gMHhmN2ZkOwogIHQuWWF0Y3lyaWxsaWMgPSAweDA0NjI7CiAgdC5ZY2lyY2xlID0gMHgyNGNlOwogIHQuWWNpcmN1bWZsZXggPSAweDAxNzY7CiAgdC5ZZGllcmVzaXMgPSAweDAxNzg7CiAgdC5ZZGllcmVzaXNzbWFsbCA9IDB4ZjdmZjsKICB0Lllkb3RhY2NlbnQgPSAweDFlOGU7CiAgdC5ZZG90YmVsb3cgPSAweDFlZjQ7CiAgdC5ZZXJpY3lyaWxsaWMgPSAweDA0MmI7CiAgdC5ZZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmODsKICB0LllncmF2ZSA9IDB4MWVmMjsKICB0Lllob29rID0gMHgwMWIzOwogIHQuWWhvb2thYm92ZSA9IDB4MWVmNjsKICB0LllpYXJtZW5pYW4gPSAweDA1NDU7CiAgdC5ZaWN5cmlsbGljID0gMHgwNDA3OwogIHQuWWl3bmFybWVuaWFuID0gMHgwNTUyOwogIHQuWW1vbm9zcGFjZSA9IDB4ZmYzOTsKICB0LllzbWFsbCA9IDB4Zjc3OTsKICB0Lll0aWxkZSA9IDB4MWVmODsKICB0Lll1c2JpZ2N5cmlsbGljID0gMHgwNDZhOwogIHQuWXVzYmlnaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2YzsKICB0Lll1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY2OwogIHQuWXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2ODsKICB0LlogPSAweDAwNWE7CiAgdC5aYWFybWVuaWFuID0gMHgwNTM2OwogIHQuWmFjdXRlID0gMHgwMTc5OwogIHQuWmNhcm9uID0gMHgwMTdkOwogIHQuWmNhcm9uc21hbGwgPSAweGY2ZmY7CiAgdC5aY2lyY2xlID0gMHgyNGNmOwogIHQuWmNpcmN1bWZsZXggPSAweDFlOTA7CiAgdC5aZG90ID0gMHgwMTdiOwogIHQuWmRvdGFjY2VudCA9IDB4MDE3YjsKICB0Llpkb3RiZWxvdyA9IDB4MWU5MjsKICB0LlplY3lyaWxsaWMgPSAweDA0MTc7CiAgdC5aZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk4OwogIHQuWmVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRlOwogIHQuWmV0YSA9IDB4MDM5NjsKICB0LlpoZWFybWVuaWFuID0gMHgwNTNhOwogIHQuWmhlYnJldmVjeXJpbGxpYyA9IDB4MDRjMTsKICB0LlpoZWN5cmlsbGljID0gMHgwNDE2OwogIHQuWmhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTY7CiAgdC5aaGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRjOwogIHQuWmxpbmViZWxvdyA9IDB4MWU5NDsKICB0Llptb25vc3BhY2UgPSAweGZmM2E7CiAgdC5ac21hbGwgPSAweGY3N2E7CiAgdC5ac3Ryb2tlID0gMHgwMWI1OwogIHQuYSA9IDB4MDA2MTsKICB0LmFhYmVuZ2FsaSA9IDB4MDk4NjsKICB0LmFhY3V0ZSA9IDB4MDBlMTsKICB0LmFhZGV2YSA9IDB4MDkwNjsKICB0LmFhZ3VqYXJhdGkgPSAweDBhODY7CiAgdC5hYWd1cm11a2hpID0gMHgwYTA2OwogIHQuYWFtYXRyYWd1cm11a2hpID0gMHgwYTNlOwogIHQuYWFydXNxdWFyZSA9IDB4MzMwMzsKICB0LmFhdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZTsKICB0LmFhdm93ZWxzaWduZGV2YSA9IDB4MDkzZTsKICB0LmFhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYmU7CiAgdC5hYmJyZXZpYXRpb25tYXJrYXJtZW5pYW4gPSAweDA1NWY7CiAgdC5hYmJyZXZpYXRpb25zaWduZGV2YSA9IDB4MDk3MDsKICB0LmFiZW5nYWxpID0gMHgwOTg1OwogIHQuYWJvcG9tb2ZvID0gMHgzMTFhOwogIHQuYWJyZXZlID0gMHgwMTAzOwogIHQuYWJyZXZlYWN1dGUgPSAweDFlYWY7CiAgdC5hYnJldmVjeXJpbGxpYyA9IDB4MDRkMTsKICB0LmFicmV2ZWRvdGJlbG93ID0gMHgxZWI3OwogIHQuYWJyZXZlZ3JhdmUgPSAweDFlYjE7CiAgdC5hYnJldmVob29rYWJvdmUgPSAweDFlYjM7CiAgdC5hYnJldmV0aWxkZSA9IDB4MWViNTsKICB0LmFjYXJvbiA9IDB4MDFjZTsKICB0LmFjaXJjbGUgPSAweDI0ZDA7CiAgdC5hY2lyY3VtZmxleCA9IDB4MDBlMjsKICB0LmFjaXJjdW1mbGV4YWN1dGUgPSAweDFlYTU7CiAgdC5hY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWFkOwogIHQuYWNpcmN1bWZsZXhncmF2ZSA9IDB4MWVhNzsKICB0LmFjaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWE5OwogIHQuYWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVhYjsKICB0LmFjdXRlID0gMHgwMGI0OwogIHQuYWN1dGViZWxvd2NtYiA9IDB4MDMxNzsKICB0LmFjdXRlY21iID0gMHgwMzAxOwogIHQuYWN1dGVjb21iID0gMHgwMzAxOwogIHQuYWN1dGVkZXZhID0gMHgwOTU0OwogIHQuYWN1dGVsb3dtb2QgPSAweDAyY2Y7CiAgdC5hY3V0ZXRvbmVjbWIgPSAweDAzNDE7CiAgdC5hY3lyaWxsaWMgPSAweDA0MzA7CiAgdC5hZGJsZ3JhdmUgPSAweDAyMDE7CiAgdC5hZGRha2d1cm11a2hpID0gMHgwYTcxOwogIHQuYWRldmEgPSAweDA5MDU7CiAgdC5hZGllcmVzaXMgPSAweDAwZTQ7CiAgdC5hZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkMzsKICB0LmFkaWVyZXNpc21hY3JvbiA9IDB4MDFkZjsKICB0LmFkb3RiZWxvdyA9IDB4MWVhMTsKICB0LmFkb3RtYWNyb24gPSAweDAxZTE7CiAgdC5hZSA9IDB4MDBlNjsKICB0LmFlYWN1dGUgPSAweDAxZmQ7CiAgdC5hZWtvcmVhbiA9IDB4MzE1MDsKICB0LmFlbWFjcm9uID0gMHgwMWUzOwogIHQuYWZpaTAwMjA4ID0gMHgyMDE1OwogIHQuYWZpaTA4OTQxID0gMHgyMGE0OwogIHQuYWZpaTEwMDE3ID0gMHgwNDEwOwogIHQuYWZpaTEwMDE4ID0gMHgwNDExOwogIHQuYWZpaTEwMDE5ID0gMHgwNDEyOwogIHQuYWZpaTEwMDIwID0gMHgwNDEzOwogIHQuYWZpaTEwMDIxID0gMHgwNDE0OwogIHQuYWZpaTEwMDIyID0gMHgwNDE1OwogIHQuYWZpaTEwMDIzID0gMHgwNDAxOwogIHQuYWZpaTEwMDI0ID0gMHgwNDE2OwogIHQuYWZpaTEwMDI1ID0gMHgwNDE3OwogIHQuYWZpaTEwMDI2ID0gMHgwNDE4OwogIHQuYWZpaTEwMDI3ID0gMHgwNDE5OwogIHQuYWZpaTEwMDI4ID0gMHgwNDFhOwogIHQuYWZpaTEwMDI5ID0gMHgwNDFiOwogIHQuYWZpaTEwMDMwID0gMHgwNDFjOwogIHQuYWZpaTEwMDMxID0gMHgwNDFkOwogIHQuYWZpaTEwMDMyID0gMHgwNDFlOwogIHQuYWZpaTEwMDMzID0gMHgwNDFmOwogIHQuYWZpaTEwMDM0ID0gMHgwNDIwOwogIHQuYWZpaTEwMDM1ID0gMHgwNDIxOwogIHQuYWZpaTEwMDM2ID0gMHgwNDIyOwogIHQuYWZpaTEwMDM3ID0gMHgwNDIzOwogIHQuYWZpaTEwMDM4ID0gMHgwNDI0OwogIHQuYWZpaTEwMDM5ID0gMHgwNDI1OwogIHQuYWZpaTEwMDQwID0gMHgwNDI2OwogIHQuYWZpaTEwMDQxID0gMHgwNDI3OwogIHQuYWZpaTEwMDQyID0gMHgwNDI4OwogIHQuYWZpaTEwMDQzID0gMHgwNDI5OwogIHQuYWZpaTEwMDQ0ID0gMHgwNDJhOwogIHQuYWZpaTEwMDQ1ID0gMHgwNDJiOwogIHQuYWZpaTEwMDQ2ID0gMHgwNDJjOwogIHQuYWZpaTEwMDQ3ID0gMHgwNDJkOwogIHQuYWZpaTEwMDQ4ID0gMHgwNDJlOwogIHQuYWZpaTEwMDQ5ID0gMHgwNDJmOwogIHQuYWZpaTEwMDUwID0gMHgwNDkwOwogIHQuYWZpaTEwMDUxID0gMHgwNDAyOwogIHQuYWZpaTEwMDUyID0gMHgwNDAzOwogIHQuYWZpaTEwMDUzID0gMHgwNDA0OwogIHQuYWZpaTEwMDU0ID0gMHgwNDA1OwogIHQuYWZpaTEwMDU1ID0gMHgwNDA2OwogIHQuYWZpaTEwMDU2ID0gMHgwNDA3OwogIHQuYWZpaTEwMDU3ID0gMHgwNDA4OwogIHQuYWZpaTEwMDU4ID0gMHgwNDA5OwogIHQuYWZpaTEwMDU5ID0gMHgwNDBhOwogIHQuYWZpaTEwMDYwID0gMHgwNDBiOwogIHQuYWZpaTEwMDYxID0gMHgwNDBjOwogIHQuYWZpaTEwMDYyID0gMHgwNDBlOwogIHQuYWZpaTEwMDYzID0gMHhmNmM0OwogIHQuYWZpaTEwMDY0ID0gMHhmNmM1OwogIHQuYWZpaTEwMDY1ID0gMHgwNDMwOwogIHQuYWZpaTEwMDY2ID0gMHgwNDMxOwogIHQuYWZpaTEwMDY3ID0gMHgwNDMyOwogIHQuYWZpaTEwMDY4ID0gMHgwNDMzOwogIHQuYWZpaTEwMDY5ID0gMHgwNDM0OwogIHQuYWZpaTEwMDcwID0gMHgwNDM1OwogIHQuYWZpaTEwMDcxID0gMHgwNDUxOwogIHQuYWZpaTEwMDcyID0gMHgwNDM2OwogIHQuYWZpaTEwMDczID0gMHgwNDM3OwogIHQuYWZpaTEwMDc0ID0gMHgwNDM4OwogIHQuYWZpaTEwMDc1ID0gMHgwNDM5OwogIHQuYWZpaTEwMDc2ID0gMHgwNDNhOwogIHQuYWZpaTEwMDc3ID0gMHgwNDNiOwogIHQuYWZpaTEwMDc4ID0gMHgwNDNjOwogIHQuYWZpaTEwMDc5ID0gMHgwNDNkOwogIHQuYWZpaTEwMDgwID0gMHgwNDNlOwogIHQuYWZpaTEwMDgxID0gMHgwNDNmOwogIHQuYWZpaTEwMDgyID0gMHgwNDQwOwogIHQuYWZpaTEwMDgzID0gMHgwNDQxOwogIHQuYWZpaTEwMDg0ID0gMHgwNDQyOwogIHQuYWZpaTEwMDg1ID0gMHgwNDQzOwogIHQuYWZpaTEwMDg2ID0gMHgwNDQ0OwogIHQuYWZpaTEwMDg3ID0gMHgwNDQ1OwogIHQuYWZpaTEwMDg4ID0gMHgwNDQ2OwogIHQuYWZpaTEwMDg5ID0gMHgwNDQ3OwogIHQuYWZpaTEwMDkwID0gMHgwNDQ4OwogIHQuYWZpaTEwMDkxID0gMHgwNDQ5OwogIHQuYWZpaTEwMDkyID0gMHgwNDRhOwogIHQuYWZpaTEwMDkzID0gMHgwNDRiOwogIHQuYWZpaTEwMDk0ID0gMHgwNDRjOwogIHQuYWZpaTEwMDk1ID0gMHgwNDRkOwogIHQuYWZpaTEwMDk2ID0gMHgwNDRlOwogIHQuYWZpaTEwMDk3ID0gMHgwNDRmOwogIHQuYWZpaTEwMDk4ID0gMHgwNDkxOwogIHQuYWZpaTEwMDk5ID0gMHgwNDUyOwogIHQuYWZpaTEwMTAwID0gMHgwNDUzOwogIHQuYWZpaTEwMTAxID0gMHgwNDU0OwogIHQuYWZpaTEwMTAyID0gMHgwNDU1OwogIHQuYWZpaTEwMTAzID0gMHgwNDU2OwogIHQuYWZpaTEwMTA0ID0gMHgwNDU3OwogIHQuYWZpaTEwMTA1ID0gMHgwNDU4OwogIHQuYWZpaTEwMTA2ID0gMHgwNDU5OwogIHQuYWZpaTEwMTA3ID0gMHgwNDVhOwogIHQuYWZpaTEwMTA4ID0gMHgwNDViOwogIHQuYWZpaTEwMTA5ID0gMHgwNDVjOwogIHQuYWZpaTEwMTEwID0gMHgwNDVlOwogIHQuYWZpaTEwMTQ1ID0gMHgwNDBmOwogIHQuYWZpaTEwMTQ2ID0gMHgwNDYyOwogIHQuYWZpaTEwMTQ3ID0gMHgwNDcyOwogIHQuYWZpaTEwMTQ4ID0gMHgwNDc0OwogIHQuYWZpaTEwMTkyID0gMHhmNmM2OwogIHQuYWZpaTEwMTkzID0gMHgwNDVmOwogIHQuYWZpaTEwMTk0ID0gMHgwNDYzOwogIHQuYWZpaTEwMTk1ID0gMHgwNDczOwogIHQuYWZpaTEwMTk2ID0gMHgwNDc1OwogIHQuYWZpaTEwODMxID0gMHhmNmM3OwogIHQuYWZpaTEwODMyID0gMHhmNmM4OwogIHQuYWZpaTEwODQ2ID0gMHgwNGQ5OwogIHQuYWZpaTI5OSA9IDB4MjAwZTsKICB0LmFmaWkzMDAgPSAweDIwMGY7CiAgdC5hZmlpMzAxID0gMHgyMDBkOwogIHQuYWZpaTU3MzgxID0gMHgwNjZhOwogIHQuYWZpaTU3Mzg4ID0gMHgwNjBjOwogIHQuYWZpaTU3MzkyID0gMHgwNjYwOwogIHQuYWZpaTU3MzkzID0gMHgwNjYxOwogIHQuYWZpaTU3Mzk0ID0gMHgwNjYyOwogIHQuYWZpaTU3Mzk1ID0gMHgwNjYzOwogIHQuYWZpaTU3Mzk2ID0gMHgwNjY0OwogIHQuYWZpaTU3Mzk3ID0gMHgwNjY1OwogIHQuYWZpaTU3Mzk4ID0gMHgwNjY2OwogIHQuYWZpaTU3Mzk5ID0gMHgwNjY3OwogIHQuYWZpaTU3NDAwID0gMHgwNjY4OwogIHQuYWZpaTU3NDAxID0gMHgwNjY5OwogIHQuYWZpaTU3NDAzID0gMHgwNjFiOwogIHQuYWZpaTU3NDA3ID0gMHgwNjFmOwogIHQuYWZpaTU3NDA5ID0gMHgwNjIxOwogIHQuYWZpaTU3NDEwID0gMHgwNjIyOwogIHQuYWZpaTU3NDExID0gMHgwNjIzOwogIHQuYWZpaTU3NDEyID0gMHgwNjI0OwogIHQuYWZpaTU3NDEzID0gMHgwNjI1OwogIHQuYWZpaTU3NDE0ID0gMHgwNjI2OwogIHQuYWZpaTU3NDE1ID0gMHgwNjI3OwogIHQuYWZpaTU3NDE2ID0gMHgwNjI4OwogIHQuYWZpaTU3NDE3ID0gMHgwNjI5OwogIHQuYWZpaTU3NDE4ID0gMHgwNjJhOwogIHQuYWZpaTU3NDE5ID0gMHgwNjJiOwogIHQuYWZpaTU3NDIwID0gMHgwNjJjOwogIHQuYWZpaTU3NDIxID0gMHgwNjJkOwogIHQuYWZpaTU3NDIyID0gMHgwNjJlOwogIHQuYWZpaTU3NDIzID0gMHgwNjJmOwogIHQuYWZpaTU3NDI0ID0gMHgwNjMwOwogIHQuYWZpaTU3NDI1ID0gMHgwNjMxOwogIHQuYWZpaTU3NDI2ID0gMHgwNjMyOwogIHQuYWZpaTU3NDI3ID0gMHgwNjMzOwogIHQuYWZpaTU3NDI4ID0gMHgwNjM0OwogIHQuYWZpaTU3NDI5ID0gMHgwNjM1OwogIHQuYWZpaTU3NDMwID0gMHgwNjM2OwogIHQuYWZpaTU3NDMxID0gMHgwNjM3OwogIHQuYWZpaTU3NDMyID0gMHgwNjM4OwogIHQuYWZpaTU3NDMzID0gMHgwNjM5OwogIHQuYWZpaTU3NDM0ID0gMHgwNjNhOwogIHQuYWZpaTU3NDQwID0gMHgwNjQwOwogIHQuYWZpaTU3NDQxID0gMHgwNjQxOwogIHQuYWZpaTU3NDQyID0gMHgwNjQyOwogIHQuYWZpaTU3NDQzID0gMHgwNjQzOwogIHQuYWZpaTU3NDQ0ID0gMHgwNjQ0OwogIHQuYWZpaTU3NDQ1ID0gMHgwNjQ1OwogIHQuYWZpaTU3NDQ2ID0gMHgwNjQ2OwogIHQuYWZpaTU3NDQ4ID0gMHgwNjQ4OwogIHQuYWZpaTU3NDQ5ID0gMHgwNjQ5OwogIHQuYWZpaTU3NDUwID0gMHgwNjRhOwogIHQuYWZpaTU3NDUxID0gMHgwNjRiOwogIHQuYWZpaTU3NDUyID0gMHgwNjRjOwogIHQuYWZpaTU3NDUzID0gMHgwNjRkOwogIHQuYWZpaTU3NDU0ID0gMHgwNjRlOwogIHQuYWZpaTU3NDU1ID0gMHgwNjRmOwogIHQuYWZpaTU3NDU2ID0gMHgwNjUwOwogIHQuYWZpaTU3NDU3ID0gMHgwNjUxOwogIHQuYWZpaTU3NDU4ID0gMHgwNjUyOwogIHQuYWZpaTU3NDcwID0gMHgwNjQ3OwogIHQuYWZpaTU3NTA1ID0gMHgwNmE0OwogIHQuYWZpaTU3NTA2ID0gMHgwNjdlOwogIHQuYWZpaTU3NTA3ID0gMHgwNjg2OwogIHQuYWZpaTU3NTA4ID0gMHgwNjk4OwogIHQuYWZpaTU3NTA5ID0gMHgwNmFmOwogIHQuYWZpaTU3NTExID0gMHgwNjc5OwogIHQuYWZpaTU3NTEyID0gMHgwNjg4OwogIHQuYWZpaTU3NTEzID0gMHgwNjkxOwogIHQuYWZpaTU3NTE0ID0gMHgwNmJhOwogIHQuYWZpaTU3NTE5ID0gMHgwNmQyOwogIHQuYWZpaTU3NTM0ID0gMHgwNmQ1OwogIHQuYWZpaTU3NjM2ID0gMHgyMGFhOwogIHQuYWZpaTU3NjQ1ID0gMHgwNWJlOwogIHQuYWZpaTU3NjU4ID0gMHgwNWMzOwogIHQuYWZpaTU3NjY0ID0gMHgwNWQwOwogIHQuYWZpaTU3NjY1ID0gMHgwNWQxOwogIHQuYWZpaTU3NjY2ID0gMHgwNWQyOwogIHQuYWZpaTU3NjY3ID0gMHgwNWQzOwogIHQuYWZpaTU3NjY4ID0gMHgwNWQ0OwogIHQuYWZpaTU3NjY5ID0gMHgwNWQ1OwogIHQuYWZpaTU3NjcwID0gMHgwNWQ2OwogIHQuYWZpaTU3NjcxID0gMHgwNWQ3OwogIHQuYWZpaTU3NjcyID0gMHgwNWQ4OwogIHQuYWZpaTU3NjczID0gMHgwNWQ5OwogIHQuYWZpaTU3Njc0ID0gMHgwNWRhOwogIHQuYWZpaTU3Njc1ID0gMHgwNWRiOwogIHQuYWZpaTU3Njc2ID0gMHgwNWRjOwogIHQuYWZpaTU3Njc3ID0gMHgwNWRkOwogIHQuYWZpaTU3Njc4ID0gMHgwNWRlOwogIHQuYWZpaTU3Njc5ID0gMHgwNWRmOwogIHQuYWZpaTU3NjgwID0gMHgwNWUwOwogIHQuYWZpaTU3NjgxID0gMHgwNWUxOwogIHQuYWZpaTU3NjgyID0gMHgwNWUyOwogIHQuYWZpaTU3NjgzID0gMHgwNWUzOwogIHQuYWZpaTU3Njg0ID0gMHgwNWU0OwogIHQuYWZpaTU3Njg1ID0gMHgwNWU1OwogIHQuYWZpaTU3Njg2ID0gMHgwNWU2OwogIHQuYWZpaTU3Njg3ID0gMHgwNWU3OwogIHQuYWZpaTU3Njg4ID0gMHgwNWU4OwogIHQuYWZpaTU3Njg5ID0gMHgwNWU5OwogIHQuYWZpaTU3NjkwID0gMHgwNWVhOwogIHQuYWZpaTU3Njk0ID0gMHhmYjJhOwogIHQuYWZpaTU3Njk1ID0gMHhmYjJiOwogIHQuYWZpaTU3NzAwID0gMHhmYjRiOwogIHQuYWZpaTU3NzA1ID0gMHhmYjFmOwogIHQuYWZpaTU3NzE2ID0gMHgwNWYwOwogIHQuYWZpaTU3NzE3ID0gMHgwNWYxOwogIHQuYWZpaTU3NzE4ID0gMHgwNWYyOwogIHQuYWZpaTU3NzIzID0gMHhmYjM1OwogIHQuYWZpaTU3NzkzID0gMHgwNWI0OwogIHQuYWZpaTU3Nzk0ID0gMHgwNWI1OwogIHQuYWZpaTU3Nzk1ID0gMHgwNWI2OwogIHQuYWZpaTU3Nzk2ID0gMHgwNWJiOwogIHQuYWZpaTU3Nzk3ID0gMHgwNWI4OwogIHQuYWZpaTU3Nzk4ID0gMHgwNWI3OwogIHQuYWZpaTU3Nzk5ID0gMHgwNWIwOwogIHQuYWZpaTU3ODAwID0gMHgwNWIyOwogIHQuYWZpaTU3ODAxID0gMHgwNWIxOwogIHQuYWZpaTU3ODAyID0gMHgwNWIzOwogIHQuYWZpaTU3ODAzID0gMHgwNWMyOwogIHQuYWZpaTU3ODA0ID0gMHgwNWMxOwogIHQuYWZpaTU3ODA2ID0gMHgwNWI5OwogIHQuYWZpaTU3ODA3ID0gMHgwNWJjOwogIHQuYWZpaTU3ODM5ID0gMHgwNWJkOwogIHQuYWZpaTU3ODQxID0gMHgwNWJmOwogIHQuYWZpaTU3ODQyID0gMHgwNWMwOwogIHQuYWZpaTU3OTI5ID0gMHgwMmJjOwogIHQuYWZpaTYxMjQ4ID0gMHgyMTA1OwogIHQuYWZpaTYxMjg5ID0gMHgyMTEzOwogIHQuYWZpaTYxMzUyID0gMHgyMTE2OwogIHQuYWZpaTYxNTczID0gMHgyMDJjOwogIHQuYWZpaTYxNTc0ID0gMHgyMDJkOwogIHQuYWZpaTYxNTc1ID0gMHgyMDJlOwogIHQuYWZpaTYxNjY0ID0gMHgyMDBjOwogIHQuYWZpaTYzMTY3ID0gMHgwNjZkOwogIHQuYWZpaTY0OTM3ID0gMHgwMmJkOwogIHQuYWdyYXZlID0gMHgwMGUwOwogIHQuYWd1amFyYXRpID0gMHgwYTg1OwogIHQuYWd1cm11a2hpID0gMHgwYTA1OwogIHQuYWhpcmFnYW5hID0gMHgzMDQyOwogIHQuYWhvb2thYm92ZSA9IDB4MWVhMzsKICB0LmFpYmVuZ2FsaSA9IDB4MDk5MDsKICB0LmFpYm9wb21vZm8gPSAweDMxMWU7CiAgdC5haWRldmEgPSAweDA5MTA7CiAgdC5haWVjeXJpbGxpYyA9IDB4MDRkNTsKICB0LmFpZ3VqYXJhdGkgPSAweDBhOTA7CiAgdC5haWd1cm11a2hpID0gMHgwYTEwOwogIHQuYWltYXRyYWd1cm11a2hpID0gMHgwYTQ4OwogIHQuYWluYXJhYmljID0gMHgwNjM5OwogIHQuYWluZmluYWxhcmFiaWMgPSAweGZlY2E7CiAgdC5haW5pbml0aWFsYXJhYmljID0gMHhmZWNiOwogIHQuYWlubWVkaWFsYXJhYmljID0gMHhmZWNjOwogIHQuYWludmVydGVkYnJldmUgPSAweDAyMDM7CiAgdC5haXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzg7CiAgdC5haXZvd2Vsc2lnbmRldmEgPSAweDA5NDg7CiAgdC5haXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM4OwogIHQuYWthdGFrYW5hID0gMHgzMGEyOwogIHQuYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjcxOwogIHQuYWtvcmVhbiA9IDB4MzE0ZjsKICB0LmFsZWYgPSAweDA1ZDA7CiAgdC5hbGVmYXJhYmljID0gMHgwNjI3OwogIHQuYWxlZmRhZ2VzaGhlYnJldyA9IDB4ZmIzMDsKICB0LmFsZWZmaW5hbGFyYWJpYyA9IDB4ZmU4ZTsKICB0LmFsZWZoYW16YWFib3ZlYXJhYmljID0gMHgwNjIzOwogIHQuYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4NDsKICB0LmFsZWZoYW16YWJlbG93YXJhYmljID0gMHgwNjI1OwogIHQuYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYyA9IDB4ZmU4ODsKICB0LmFsZWZoZWJyZXcgPSAweDA1ZDA7CiAgdC5hbGVmbGFtZWRoZWJyZXcgPSAweGZiNGY7CiAgdC5hbGVmbWFkZGFhYm92ZWFyYWJpYyA9IDB4MDYyMjsKICB0LmFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODI7CiAgdC5hbGVmbWFrc3VyYWFyYWJpYyA9IDB4MDY0OTsKICB0LmFsZWZtYWtzdXJhZmluYWxhcmFiaWMgPSAweGZlZjA7CiAgdC5hbGVmbWFrc3VyYWluaXRpYWxhcmFiaWMgPSAweGZlZjM7CiAgdC5hbGVmbWFrc3VyYW1lZGlhbGFyYWJpYyA9IDB4ZmVmNDsKICB0LmFsZWZwYXRhaGhlYnJldyA9IDB4ZmIyZTsKICB0LmFsZWZxYW1hdHNoZWJyZXcgPSAweGZiMmY7CiAgdC5hbGVwaCA9IDB4MjEzNTsKICB0LmFsbGVxdWFsID0gMHgyMjRjOwogIHQuYWxwaGEgPSAweDAzYjE7CiAgdC5hbHBoYXRvbm9zID0gMHgwM2FjOwogIHQuYW1hY3JvbiA9IDB4MDEwMTsKICB0LmFtb25vc3BhY2UgPSAweGZmNDE7CiAgdC5hbXBlcnNhbmQgPSAweDAwMjY7CiAgdC5hbXBlcnNhbmRtb25vc3BhY2UgPSAweGZmMDY7CiAgdC5hbXBlcnNhbmRzbWFsbCA9IDB4ZjcyNjsKICB0LmFtc3F1YXJlID0gMHgzM2MyOwogIHQuYW5ib3BvbW9mbyA9IDB4MzEyMjsKICB0LmFuZ2JvcG9tb2ZvID0gMHgzMTI0OwogIHQuYW5nYnJhY2tldGxlZnQgPSAweDMwMDg7CiAgdC5hbmdicmFja2V0cmlnaHQgPSAweDMwMDk7CiAgdC5hbmdraGFua2h1dGhhaSA9IDB4MGU1YTsKICB0LmFuZ2xlID0gMHgyMjIwOwogIHQuYW5nbGVicmFja2V0bGVmdCA9IDB4MzAwODsKICB0LmFuZ2xlYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzZjsKICB0LmFuZ2xlYnJhY2tldHJpZ2h0ID0gMHgzMDA5OwogIHQuYW5nbGVicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0MDsKICB0LmFuZ2xlbGVmdCA9IDB4MjMyOTsKICB0LmFuZ2xlcmlnaHQgPSAweDIzMmE7CiAgdC5hbmdzdHJvbSA9IDB4MjEyYjsKICB0LmFub3RlbGVpYSA9IDB4MDM4NzsKICB0LmFudWRhdHRhZGV2YSA9IDB4MDk1MjsKICB0LmFudXN2YXJhYmVuZ2FsaSA9IDB4MDk4MjsKICB0LmFudXN2YXJhZGV2YSA9IDB4MDkwMjsKICB0LmFudXN2YXJhZ3VqYXJhdGkgPSAweDBhODI7CiAgdC5hb2dvbmVrID0gMHgwMTA1OwogIHQuYXBhYXRvc3F1YXJlID0gMHgzMzAwOwogIHQuYXBhcmVuID0gMHgyNDljOwogIHQuYXBvc3Ryb3BoZWFybWVuaWFuID0gMHgwNTVhOwogIHQuYXBvc3Ryb3BoZW1vZCA9IDB4MDJiYzsKICB0LmFwcGxlID0gMHhmOGZmOwogIHQuYXBwcm9hY2hlcyA9IDB4MjI1MDsKICB0LmFwcHJveGVxdWFsID0gMHgyMjQ4OwogIHQuYXBwcm94ZXF1YWxvcmltYWdlID0gMHgyMjUyOwogIHQuYXBwcm94aW1hdGVseWVxdWFsID0gMHgyMjQ1OwogIHQuYXJhZWFla29yZWFuID0gMHgzMThlOwogIHQuYXJhZWFrb3JlYW4gPSAweDMxOGQ7CiAgdC5hcmMgPSAweDIzMTI7CiAgdC5hcmlnaHRoYWxmcmluZyA9IDB4MWU5YTsKICB0LmFyaW5nID0gMHgwMGU1OwogIHQuYXJpbmdhY3V0ZSA9IDB4MDFmYjsKICB0LmFyaW5nYmVsb3cgPSAweDFlMDE7CiAgdC5hcnJvd2JvdGggPSAweDIxOTQ7CiAgdC5hcnJvd2Rhc2hkb3duID0gMHgyMWUzOwogIHQuYXJyb3dkYXNobGVmdCA9IDB4MjFlMDsKICB0LmFycm93ZGFzaHJpZ2h0ID0gMHgyMWUyOwogIHQuYXJyb3dkYXNodXAgPSAweDIxZTE7CiAgdC5hcnJvd2RibGJvdGggPSAweDIxZDQ7CiAgdC5hcnJvd2RibGRvd24gPSAweDIxZDM7CiAgdC5hcnJvd2RibGxlZnQgPSAweDIxZDA7CiAgdC5hcnJvd2RibHJpZ2h0ID0gMHgyMWQyOwogIHQuYXJyb3dkYmx1cCA9IDB4MjFkMTsKICB0LmFycm93ZG93biA9IDB4MjE5MzsKICB0LmFycm93ZG93bmxlZnQgPSAweDIxOTk7CiAgdC5hcnJvd2Rvd25yaWdodCA9IDB4MjE5ODsKICB0LmFycm93ZG93bndoaXRlID0gMHgyMWU5OwogIHQuYXJyb3doZWFkZG93bm1vZCA9IDB4MDJjNTsKICB0LmFycm93aGVhZGxlZnRtb2QgPSAweDAyYzI7CiAgdC5hcnJvd2hlYWRyaWdodG1vZCA9IDB4MDJjMzsKICB0LmFycm93aGVhZHVwbW9kID0gMHgwMmM0OwogIHQuYXJyb3dob3JpemV4ID0gMHhmOGU3OwogIHQuYXJyb3dsZWZ0ID0gMHgyMTkwOwogIHQuYXJyb3dsZWZ0ZGJsID0gMHgyMWQwOwogIHQuYXJyb3dsZWZ0ZGJsc3Ryb2tlID0gMHgyMWNkOwogIHQuYXJyb3dsZWZ0b3ZlcnJpZ2h0ID0gMHgyMWM2OwogIHQuYXJyb3dsZWZ0d2hpdGUgPSAweDIxZTY7CiAgdC5hcnJvd3JpZ2h0ID0gMHgyMTkyOwogIHQuYXJyb3dyaWdodGRibHN0cm9rZSA9IDB4MjFjZjsKICB0LmFycm93cmlnaHRoZWF2eSA9IDB4Mjc5ZTsKICB0LmFycm93cmlnaHRvdmVybGVmdCA9IDB4MjFjNDsKICB0LmFycm93cmlnaHR3aGl0ZSA9IDB4MjFlODsKICB0LmFycm93dGFibGVmdCA9IDB4MjFlNDsKICB0LmFycm93dGFicmlnaHQgPSAweDIxZTU7CiAgdC5hcnJvd3VwID0gMHgyMTkxOwogIHQuYXJyb3d1cGRuID0gMHgyMTk1OwogIHQuYXJyb3d1cGRuYnNlID0gMHgyMWE4OwogIHQuYXJyb3d1cGRvd25iYXNlID0gMHgyMWE4OwogIHQuYXJyb3d1cGxlZnQgPSAweDIxOTY7CiAgdC5hcnJvd3VwbGVmdG9mZG93biA9IDB4MjFjNTsKICB0LmFycm93dXByaWdodCA9IDB4MjE5NzsKICB0LmFycm93dXB3aGl0ZSA9IDB4MjFlNzsKICB0LmFycm93dmVydGV4ID0gMHhmOGU2OwogIHQuYXNjaWljaXJjdW0gPSAweDAwNWU7CiAgdC5hc2NpaWNpcmN1bW1vbm9zcGFjZSA9IDB4ZmYzZTsKICB0LmFzY2lpdGlsZGUgPSAweDAwN2U7CiAgdC5hc2NpaXRpbGRlbW9ub3NwYWNlID0gMHhmZjVlOwogIHQuYXNjcmlwdCA9IDB4MDI1MTsKICB0LmFzY3JpcHR0dXJuZWQgPSAweDAyNTI7CiAgdC5hc21hbGxoaXJhZ2FuYSA9IDB4MzA0MTsKICB0LmFzbWFsbGthdGFrYW5hID0gMHgzMGExOwogIHQuYXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjc7CiAgdC5hc3RlcmlzayA9IDB4MDAyYTsKICB0LmFzdGVyaXNrYWx0b25lYXJhYmljID0gMHgwNjZkOwogIHQuYXN0ZXJpc2thcmFiaWMgPSAweDA2NmQ7CiAgdC5hc3Rlcmlza21hdGggPSAweDIyMTc7CiAgdC5hc3Rlcmlza21vbm9zcGFjZSA9IDB4ZmYwYTsKICB0LmFzdGVyaXNrc21hbGwgPSAweGZlNjE7CiAgdC5hc3RlcmlzbSA9IDB4MjA0MjsKICB0LmFzdXBlcmlvciA9IDB4ZjZlOTsKICB0LmFzeW1wdG90aWNhbGx5ZXF1YWwgPSAweDIyNDM7CiAgdC5hdCA9IDB4MDA0MDsKICB0LmF0aWxkZSA9IDB4MDBlMzsKICB0LmF0bW9ub3NwYWNlID0gMHhmZjIwOwogIHQuYXRzbWFsbCA9IDB4ZmU2YjsKICB0LmF0dXJuZWQgPSAweDAyNTA7CiAgdC5hdWJlbmdhbGkgPSAweDA5OTQ7CiAgdC5hdWJvcG9tb2ZvID0gMHgzMTIwOwogIHQuYXVkZXZhID0gMHgwOTE0OwogIHQuYXVndWphcmF0aSA9IDB4MGE5NDsKICB0LmF1Z3VybXVraGkgPSAweDBhMTQ7CiAgdC5hdWxlbmd0aG1hcmtiZW5nYWxpID0gMHgwOWQ3OwogIHQuYXVtYXRyYWd1cm11a2hpID0gMHgwYTRjOwogIHQuYXV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWNjOwogIHQuYXV2b3dlbHNpZ25kZXZhID0gMHgwOTRjOwogIHQuYXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjYzsKICB0LmF2YWdyYWhhZGV2YSA9IDB4MDkzZDsKICB0LmF5YmFybWVuaWFuID0gMHgwNTYxOwogIHQuYXlpbiA9IDB4MDVlMjsKICB0LmF5aW5hbHRvbmVoZWJyZXcgPSAweGZiMjA7CiAgdC5heWluaGVicmV3ID0gMHgwNWUyOwogIHQuYiA9IDB4MDA2MjsKICB0LmJhYmVuZ2FsaSA9IDB4MDlhYzsKICB0LmJhY2tzbGFzaCA9IDB4MDA1YzsKICB0LmJhY2tzbGFzaG1vbm9zcGFjZSA9IDB4ZmYzYzsKICB0LmJhZGV2YSA9IDB4MDkyYzsKICB0LmJhZ3VqYXJhdGkgPSAweDBhYWM7CiAgdC5iYWd1cm11a2hpID0gMHgwYTJjOwogIHQuYmFoaXJhZ2FuYSA9IDB4MzA3MDsKICB0LmJhaHR0aGFpID0gMHgwZTNmOwogIHQuYmFrYXRha2FuYSA9IDB4MzBkMDsKICB0LmJhciA9IDB4MDA3YzsKICB0LmJhcm1vbm9zcGFjZSA9IDB4ZmY1YzsKICB0LmJib3BvbW9mbyA9IDB4MzEwNTsKICB0LmJjaXJjbGUgPSAweDI0ZDE7CiAgdC5iZG90YWNjZW50ID0gMHgxZTAzOwogIHQuYmRvdGJlbG93ID0gMHgxZTA1OwogIHQuYmVhbWVkc2l4dGVlbnRobm90ZXMgPSAweDI2NmM7CiAgdC5iZWNhdXNlID0gMHgyMjM1OwogIHQuYmVjeXJpbGxpYyA9IDB4MDQzMTsKICB0LmJlaGFyYWJpYyA9IDB4MDYyODsKICB0LmJlaGZpbmFsYXJhYmljID0gMHhmZTkwOwogIHQuYmVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5MTsKICB0LmJlaGlyYWdhbmEgPSAweDMwNzk7CiAgdC5iZWhtZWRpYWxhcmFiaWMgPSAweGZlOTI7CiAgdC5iZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmM5ZjsKICB0LmJlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwODsKICB0LmJlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM2ZDsKICB0LmJla2F0YWthbmEgPSAweDMwZDk7CiAgdC5iZW5hcm1lbmlhbiA9IDB4MDU2MjsKICB0LmJldCA9IDB4MDVkMTsKICB0LmJldGEgPSAweDAzYjI7CiAgdC5iZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDA7CiAgdC5iZXRkYWdlc2ggPSAweGZiMzE7CiAgdC5iZXRkYWdlc2hoZWJyZXcgPSAweGZiMzE7CiAgdC5iZXRoZWJyZXcgPSAweDA1ZDE7CiAgdC5iZXRyYWZlaGVicmV3ID0gMHhmYjRjOwogIHQuYmhhYmVuZ2FsaSA9IDB4MDlhZDsKICB0LmJoYWRldmEgPSAweDA5MmQ7CiAgdC5iaGFndWphcmF0aSA9IDB4MGFhZDsKICB0LmJoYWd1cm11a2hpID0gMHgwYTJkOwogIHQuYmhvb2sgPSAweDAyNTM7CiAgdC5iaWhpcmFnYW5hID0gMHgzMDczOwogIHQuYmlrYXRha2FuYSA9IDB4MzBkMzsKICB0LmJpbGFiaWFsY2xpY2sgPSAweDAyOTg7CiAgdC5iaW5kaWd1cm11a2hpID0gMHgwYTAyOwogIHQuYmlydXNxdWFyZSA9IDB4MzMzMTsKICB0LmJsYWNrY2lyY2xlID0gMHgyNWNmOwogIHQuYmxhY2tkaWFtb25kID0gMHgyNWM2OwogIHQuYmxhY2tkb3ducG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViYzsKICB0LmJsYWNrbGVmdHBvaW50aW5ncG9pbnRlciA9IDB4MjVjNDsKICB0LmJsYWNrbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzA7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdCA9IDB4MzAxMDsKICB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2I7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTE7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzYzsKICB0LmJsYWNrbG93ZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTM7CiAgdC5ibGFja2xvd2VycmlnaHR0cmlhbmdsZSA9IDB4MjVlMjsKICB0LmJsYWNrcmVjdGFuZ2xlID0gMHgyNWFjOwogIHQuYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlciA9IDB4MjViYTsKICB0LmJsYWNrcmlnaHRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWI2OwogIHQuYmxhY2tzbWFsbHNxdWFyZSA9IDB4MjVhYTsKICB0LmJsYWNrc21pbGluZ2ZhY2UgPSAweDI2M2I7CiAgdC5ibGFja3NxdWFyZSA9IDB4MjVhMDsKICB0LmJsYWNrc3RhciA9IDB4MjYwNTsKICB0LmJsYWNrdXBwZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTQ7CiAgdC5ibGFja3VwcGVycmlnaHR0cmlhbmdsZSA9IDB4MjVlNTsKICB0LmJsYWNrdXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjQ7CiAgdC5ibGFja3VwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMjsKICB0LmJsYW5rID0gMHgyNDIzOwogIHQuYmxpbmViZWxvdyA9IDB4MWUwNzsKICB0LmJsb2NrID0gMHgyNTg4OwogIHQuYm1vbm9zcGFjZSA9IDB4ZmY0MjsKICB0LmJvYmFpbWFpdGhhaSA9IDB4MGUxYTsKICB0LmJvaGlyYWdhbmEgPSAweDMwN2M7CiAgdC5ib2thdGFrYW5hID0gMHgzMGRjOwogIHQuYnBhcmVuID0gMHgyNDlkOwogIHQuYnFzcXVhcmUgPSAweDMzYzM7CiAgdC5icmFjZWV4ID0gMHhmOGY0OwogIHQuYnJhY2VsZWZ0ID0gMHgwMDdiOwogIHQuYnJhY2VsZWZ0YnQgPSAweGY4ZjM7CiAgdC5icmFjZWxlZnRtaWQgPSAweGY4ZjI7CiAgdC5icmFjZWxlZnRtb25vc3BhY2UgPSAweGZmNWI7CiAgdC5icmFjZWxlZnRzbWFsbCA9IDB4ZmU1YjsKICB0LmJyYWNlbGVmdHRwID0gMHhmOGYxOwogIHQuYnJhY2VsZWZ0dmVydGljYWwgPSAweGZlMzc7CiAgdC5icmFjZXJpZ2h0ID0gMHgwMDdkOwogIHQuYnJhY2VyaWdodGJ0ID0gMHhmOGZlOwogIHQuYnJhY2VyaWdodG1pZCA9IDB4ZjhmZDsKICB0LmJyYWNlcmlnaHRtb25vc3BhY2UgPSAweGZmNWQ7CiAgdC5icmFjZXJpZ2h0c21hbGwgPSAweGZlNWM7CiAgdC5icmFjZXJpZ2h0dHAgPSAweGY4ZmM7CiAgdC5icmFjZXJpZ2h0dmVydGljYWwgPSAweGZlMzg7CiAgdC5icmFja2V0bGVmdCA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0YnQgPSAweGY4ZjA7CiAgdC5icmFja2V0bGVmdGV4ID0gMHhmOGVmOwogIHQuYnJhY2tldGxlZnRtb25vc3BhY2UgPSAweGZmM2I7CiAgdC5icmFja2V0bGVmdHRwID0gMHhmOGVlOwogIHQuYnJhY2tldHJpZ2h0ID0gMHgwMDVkOwogIHQuYnJhY2tldHJpZ2h0YnQgPSAweGY4ZmI7CiAgdC5icmFja2V0cmlnaHRleCA9IDB4ZjhmYTsKICB0LmJyYWNrZXRyaWdodG1vbm9zcGFjZSA9IDB4ZmYzZDsKICB0LmJyYWNrZXRyaWdodHRwID0gMHhmOGY5OwogIHQuYnJldmUgPSAweDAyZDg7CiAgdC5icmV2ZWJlbG93Y21iID0gMHgwMzJlOwogIHQuYnJldmVjbWIgPSAweDAzMDY7CiAgdC5icmV2ZWludmVydGVkYmVsb3djbWIgPSAweDAzMmY7CiAgdC5icmV2ZWludmVydGVkY21iID0gMHgwMzExOwogIHQuYnJldmVpbnZlcnRlZGRvdWJsZWNtYiA9IDB4MDM2MTsKICB0LmJyaWRnZWJlbG93Y21iID0gMHgwMzJhOwogIHQuYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMzYTsKICB0LmJyb2tlbmJhciA9IDB4MDBhNjsKICB0LmJzdHJva2UgPSAweDAxODA7CiAgdC5ic3VwZXJpb3IgPSAweGY2ZWE7CiAgdC5idG9wYmFyID0gMHgwMTgzOwogIHQuYnVoaXJhZ2FuYSA9IDB4MzA3NjsKICB0LmJ1a2F0YWthbmEgPSAweDMwZDY7CiAgdC5idWxsZXQgPSAweDIwMjI7CiAgdC5idWxsZXRpbnZlcnNlID0gMHgyNWQ4OwogIHQuYnVsbGV0b3BlcmF0b3IgPSAweDIyMTk7CiAgdC5idWxsc2V5ZSA9IDB4MjVjZTsKICB0LmMgPSAweDAwNjM7CiAgdC5jYWFybWVuaWFuID0gMHgwNTZlOwogIHQuY2FiZW5nYWxpID0gMHgwOTlhOwogIHQuY2FjdXRlID0gMHgwMTA3OwogIHQuY2FkZXZhID0gMHgwOTFhOwogIHQuY2FndWphcmF0aSA9IDB4MGE5YTsKICB0LmNhZ3VybXVraGkgPSAweDBhMWE7CiAgdC5jYWxzcXVhcmUgPSAweDMzODg7CiAgdC5jYW5kcmFiaW5kdWJlbmdhbGkgPSAweDA5ODE7CiAgdC5jYW5kcmFiaW5kdWNtYiA9IDB4MDMxMDsKICB0LmNhbmRyYWJpbmR1ZGV2YSA9IDB4MDkwMTsKICB0LmNhbmRyYWJpbmR1Z3VqYXJhdGkgPSAweDBhODE7CiAgdC5jYXBzbG9jayA9IDB4MjFlYTsKICB0LmNhcmVvZiA9IDB4MjEwNTsKICB0LmNhcm9uID0gMHgwMmM3OwogIHQuY2Fyb25iZWxvd2NtYiA9IDB4MDMyYzsKICB0LmNhcm9uY21iID0gMHgwMzBjOwogIHQuY2FycmlhZ2VyZXR1cm4gPSAweDIxYjU7CiAgdC5jYm9wb21vZm8gPSAweDMxMTg7CiAgdC5jY2Fyb24gPSAweDAxMGQ7CiAgdC5jY2VkaWxsYSA9IDB4MDBlNzsKICB0LmNjZWRpbGxhYWN1dGUgPSAweDFlMDk7CiAgdC5jY2lyY2xlID0gMHgyNGQyOwogIHQuY2NpcmN1bWZsZXggPSAweDAxMDk7CiAgdC5jY3VybCA9IDB4MDI1NTsKICB0LmNkb3QgPSAweDAxMGI7CiAgdC5jZG90YWNjZW50ID0gMHgwMTBiOwogIHQuY2RzcXVhcmUgPSAweDMzYzU7CiAgdC5jZWRpbGxhID0gMHgwMGI4OwogIHQuY2VkaWxsYWNtYiA9IDB4MDMyNzsKICB0LmNlbnQgPSAweDAwYTI7CiAgdC5jZW50aWdyYWRlID0gMHgyMTAzOwogIHQuY2VudGluZmVyaW9yID0gMHhmNmRmOwogIHQuY2VudG1vbm9zcGFjZSA9IDB4ZmZlMDsKICB0LmNlbnRvbGRzdHlsZSA9IDB4ZjdhMjsKICB0LmNlbnRzdXBlcmlvciA9IDB4ZjZlMDsKICB0LmNoYWFybWVuaWFuID0gMHgwNTc5OwogIHQuY2hhYmVuZ2FsaSA9IDB4MDk5YjsKICB0LmNoYWRldmEgPSAweDA5MWI7CiAgdC5jaGFndWphcmF0aSA9IDB4MGE5YjsKICB0LmNoYWd1cm11a2hpID0gMHgwYTFiOwogIHQuY2hib3BvbW9mbyA9IDB4MzExNDsKICB0LmNoZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJkOwogIHQuY2hlY2ttYXJrID0gMHgyNzEzOwogIHQuY2hlY3lyaWxsaWMgPSAweDA0NDc7CiAgdC5jaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiZjsKICB0LmNoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGI3OwogIHQuY2hlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmNTsKICB0LmNoZWhhcm1lbmlhbiA9IDB4MDU3MzsKICB0LmNoZWtoYWthc3NpYW5jeXJpbGxpYyA9IDB4MDRjYzsKICB0LmNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0Yjk7CiAgdC5jaGkgPSAweDAzYzc7CiAgdC5jaGlldWNoYWNpcmNsZWtvcmVhbiA9IDB4MzI3NzsKICB0LmNoaWV1Y2hhcGFyZW5rb3JlYW4gPSAweDMyMTc7CiAgdC5jaGlldWNoY2lyY2xla29yZWFuID0gMHgzMjY5OwogIHQuY2hpZXVjaGtvcmVhbiA9IDB4MzE0YTsKICB0LmNoaWV1Y2hwYXJlbmtvcmVhbiA9IDB4MzIwOTsKICB0LmNob2NoYW5ndGhhaSA9IDB4MGUwYTsKICB0LmNob2NoYW50aGFpID0gMHgwZTA4OwogIHQuY2hvY2hpbmd0aGFpID0gMHgwZTA5OwogIHQuY2hvY2hvZXRoYWkgPSAweDBlMGM7CiAgdC5jaG9vayA9IDB4MDE4ODsKICB0LmNpZXVjYWNpcmNsZWtvcmVhbiA9IDB4MzI3NjsKICB0LmNpZXVjYXBhcmVua29yZWFuID0gMHgzMjE2OwogIHQuY2lldWNjaXJjbGVrb3JlYW4gPSAweDMyNjg7CiAgdC5jaWV1Y2tvcmVhbiA9IDB4MzE0ODsKICB0LmNpZXVjcGFyZW5rb3JlYW4gPSAweDMyMDg7CiAgdC5jaWV1Y3VwYXJlbmtvcmVhbiA9IDB4MzIxYzsKICB0LmNpcmNsZSA9IDB4MjVjYjsKICB0LmNpcmNsZWNvcHlydCA9IDB4MDBhOTsKICB0LmNpcmNsZW11bHRpcGx5ID0gMHgyMjk3OwogIHQuY2lyY2xlb3QgPSAweDIyOTk7CiAgdC5jaXJjbGVwbHVzID0gMHgyMjk1OwogIHQuY2lyY2xlcG9zdGFsbWFyayA9IDB4MzAzNjsKICB0LmNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrID0gMHgyNWQwOwogIHQuY2lyY2xld2l0aHJpZ2h0aGFsZmJsYWNrID0gMHgyNWQxOwogIHQuY2lyY3VtZmxleCA9IDB4MDJjNjsKICB0LmNpcmN1bWZsZXhiZWxvd2NtYiA9IDB4MDMyZDsKICB0LmNpcmN1bWZsZXhjbWIgPSAweDAzMDI7CiAgdC5jbGVhciA9IDB4MjMyNzsKICB0LmNsaWNrYWx2ZW9sYXIgPSAweDAxYzI7CiAgdC5jbGlja2RlbnRhbCA9IDB4MDFjMDsKICB0LmNsaWNrbGF0ZXJhbCA9IDB4MDFjMTsKICB0LmNsaWNrcmV0cm9mbGV4ID0gMHgwMWMzOwogIHQuY2x1YiA9IDB4MjY2MzsKICB0LmNsdWJzdWl0YmxhY2sgPSAweDI2NjM7CiAgdC5jbHVic3VpdHdoaXRlID0gMHgyNjY3OwogIHQuY21jdWJlZHNxdWFyZSA9IDB4MzNhNDsKICB0LmNtb25vc3BhY2UgPSAweGZmNDM7CiAgdC5jbXNxdWFyZWRzcXVhcmUgPSAweDMzYTA7CiAgdC5jb2FybWVuaWFuID0gMHgwNTgxOwogIHQuY29sb24gPSAweDAwM2E7CiAgdC5jb2xvbm1vbmV0YXJ5ID0gMHgyMGExOwogIHQuY29sb25tb25vc3BhY2UgPSAweGZmMWE7CiAgdC5jb2xvbnNpZ24gPSAweDIwYTE7CiAgdC5jb2xvbnNtYWxsID0gMHhmZTU1OwogIHQuY29sb250cmlhbmd1bGFyaGFsZm1vZCA9IDB4MDJkMTsKICB0LmNvbG9udHJpYW5ndWxhcm1vZCA9IDB4MDJkMDsKICB0LmNvbW1hID0gMHgwMDJjOwogIHQuY29tbWFhYm92ZWNtYiA9IDB4MDMxMzsKICB0LmNvbW1hYWJvdmVyaWdodGNtYiA9IDB4MDMxNTsKICB0LmNvbW1hYWNjZW50ID0gMHhmNmMzOwogIHQuY29tbWFhcmFiaWMgPSAweDA2MGM7CiAgdC5jb21tYWFybWVuaWFuID0gMHgwNTVkOwogIHQuY29tbWFpbmZlcmlvciA9IDB4ZjZlMTsKICB0LmNvbW1hbW9ub3NwYWNlID0gMHhmZjBjOwogIHQuY29tbWFyZXZlcnNlZGFib3ZlY21iID0gMHgwMzE0OwogIHQuY29tbWFyZXZlcnNlZG1vZCA9IDB4MDJiZDsKICB0LmNvbW1hc21hbGwgPSAweGZlNTA7CiAgdC5jb21tYXN1cGVyaW9yID0gMHhmNmUyOwogIHQuY29tbWF0dXJuZWRhYm92ZWNtYiA9IDB4MDMxMjsKICB0LmNvbW1hdHVybmVkbW9kID0gMHgwMmJiOwogIHQuY29tcGFzcyA9IDB4MjYzYzsKICB0LmNvbmdydWVudCA9IDB4MjI0NTsKICB0LmNvbnRvdXJpbnRlZ3JhbCA9IDB4MjIyZTsKICB0LmNvbnRyb2wgPSAweDIzMDM7CiAgdC5jb250cm9sQUNLID0gMHgwMDA2OwogIHQuY29udHJvbEJFTCA9IDB4MDAwNzsKICB0LmNvbnRyb2xCUyA9IDB4MDAwODsKICB0LmNvbnRyb2xDQU4gPSAweDAwMTg7CiAgdC5jb250cm9sQ1IgPSAweDAwMGQ7CiAgdC5jb250cm9sREMxID0gMHgwMDExOwogIHQuY29udHJvbERDMiA9IDB4MDAxMjsKICB0LmNvbnRyb2xEQzMgPSAweDAwMTM7CiAgdC5jb250cm9sREM0ID0gMHgwMDE0OwogIHQuY29udHJvbERFTCA9IDB4MDA3ZjsKICB0LmNvbnRyb2xETEUgPSAweDAwMTA7CiAgdC5jb250cm9sRU0gPSAweDAwMTk7CiAgdC5jb250cm9sRU5RID0gMHgwMDA1OwogIHQuY29udHJvbEVPVCA9IDB4MDAwNDsKICB0LmNvbnRyb2xFU0MgPSAweDAwMWI7CiAgdC5jb250cm9sRVRCID0gMHgwMDE3OwogIHQuY29udHJvbEVUWCA9IDB4MDAwMzsKICB0LmNvbnRyb2xGRiA9IDB4MDAwYzsKICB0LmNvbnRyb2xGUyA9IDB4MDAxYzsKICB0LmNvbnRyb2xHUyA9IDB4MDAxZDsKICB0LmNvbnRyb2xIVCA9IDB4MDAwOTsKICB0LmNvbnRyb2xMRiA9IDB4MDAwYTsKICB0LmNvbnRyb2xOQUsgPSAweDAwMTU7CiAgdC5jb250cm9sTlVMTCA9IDB4MDAwMDsKICB0LmNvbnRyb2xSUyA9IDB4MDAxZTsKICB0LmNvbnRyb2xTSSA9IDB4MDAwZjsKICB0LmNvbnRyb2xTTyA9IDB4MDAwZTsKICB0LmNvbnRyb2xTT1QgPSAweDAwMDI7CiAgdC5jb250cm9sU1RYID0gMHgwMDAxOwogIHQuY29udHJvbFNVQiA9IDB4MDAxYTsKICB0LmNvbnRyb2xTWU4gPSAweDAwMTY7CiAgdC5jb250cm9sVVMgPSAweDAwMWY7CiAgdC5jb250cm9sVlQgPSAweDAwMGI7CiAgdC5jb3B5cmlnaHQgPSAweDAwYTk7CiAgdC5jb3B5cmlnaHRzYW5zID0gMHhmOGU5OwogIHQuY29weXJpZ2h0c2VyaWYgPSAweGY2ZDk7CiAgdC5jb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwYzsKICB0LmNvcm5lcmJyYWNrZXRsZWZ0aGFsZndpZHRoID0gMHhmZjYyOwogIHQuY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MTsKICB0LmNvcm5lcmJyYWNrZXRyaWdodCA9IDB4MzAwZDsKICB0LmNvcm5lcmJyYWNrZXRyaWdodGhhbGZ3aWR0aCA9IDB4ZmY2MzsKICB0LmNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQyOwogIHQuY29ycG9yYXRpb25zcXVhcmUgPSAweDMzN2Y7CiAgdC5jb3NxdWFyZSA9IDB4MzNjNzsKICB0LmNvdmVya2dzcXVhcmUgPSAweDMzYzY7CiAgdC5jcGFyZW4gPSAweDI0OWU7CiAgdC5jcnV6ZWlybyA9IDB4MjBhMjsKICB0LmNzdHJldGNoZWQgPSAweDAyOTc7CiAgdC5jdXJseWFuZCA9IDB4MjJjZjsKICB0LmN1cmx5b3IgPSAweDIyY2U7CiAgdC5jdXJyZW5jeSA9IDB4MDBhNDsKICB0LmN5ckJyZXZlID0gMHhmNmQxOwogIHQuY3lyRmxleCA9IDB4ZjZkMjsKICB0LmN5cmJyZXZlID0gMHhmNmQ0OwogIHQuY3lyZmxleCA9IDB4ZjZkNTsKICB0LmQgPSAweDAwNjQ7CiAgdC5kYWFybWVuaWFuID0gMHgwNTY0OwogIHQuZGFiZW5nYWxpID0gMHgwOWE2OwogIHQuZGFkYXJhYmljID0gMHgwNjM2OwogIHQuZGFkZXZhID0gMHgwOTI2OwogIHQuZGFkZmluYWxhcmFiaWMgPSAweGZlYmU7CiAgdC5kYWRpbml0aWFsYXJhYmljID0gMHhmZWJmOwogIHQuZGFkbWVkaWFsYXJhYmljID0gMHhmZWMwOwogIHQuZGFnZXNoID0gMHgwNWJjOwogIHQuZGFnZXNoaGVicmV3ID0gMHgwNWJjOwogIHQuZGFnZ2VyID0gMHgyMDIwOwogIHQuZGFnZ2VyZGJsID0gMHgyMDIxOwogIHQuZGFndWphcmF0aSA9IDB4MGFhNjsKICB0LmRhZ3VybXVraGkgPSAweDBhMjY7CiAgdC5kYWhpcmFnYW5hID0gMHgzMDYwOwogIHQuZGFrYXRha2FuYSA9IDB4MzBjMDsKICB0LmRhbGFyYWJpYyA9IDB4MDYyZjsKICB0LmRhbGV0ID0gMHgwNWQzOwogIHQuZGFsZXRkYWdlc2ggPSAweGZiMzM7CiAgdC5kYWxldGRhZ2VzaGhlYnJldyA9IDB4ZmIzMzsKICB0LmRhbGV0aGVicmV3ID0gMHgwNWQzOwogIHQuZGFsZmluYWxhcmFiaWMgPSAweGZlYWE7CiAgdC5kYW1tYWFyYWJpYyA9IDB4MDY0ZjsKICB0LmRhbW1hbG93YXJhYmljID0gMHgwNjRmOwogIHQuZGFtbWF0YW5hbHRvbmVhcmFiaWMgPSAweDA2NGM7CiAgdC5kYW1tYXRhbmFyYWJpYyA9IDB4MDY0YzsKICB0LmRhbmRhID0gMHgwOTY0OwogIHQuZGFyZ2FoZWJyZXcgPSAweDA1YTc7CiAgdC5kYXJnYWxlZnRoZWJyZXcgPSAweDA1YTc7CiAgdC5kYXNpYXBuZXVtYXRhY3lyaWxsaWNjbWIgPSAweDA0ODU7CiAgdC5kYmxHcmF2ZSA9IDB4ZjZkMzsKICB0LmRibGFuZ2xlYnJhY2tldGxlZnQgPSAweDMwMGE7CiAgdC5kYmxhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2Q7CiAgdC5kYmxhbmdsZWJyYWNrZXRyaWdodCA9IDB4MzAwYjsKICB0LmRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2U7CiAgdC5kYmxhcmNoaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMyYjsKICB0LmRibGFycm93bGVmdCA9IDB4MjFkNDsKICB0LmRibGFycm93cmlnaHQgPSAweDIxZDI7CiAgdC5kYmxkYW5kYSA9IDB4MDk2NTsKICB0LmRibGdyYXZlID0gMHhmNmQ2OwogIHQuZGJsZ3JhdmVjbWIgPSAweDAzMGY7CiAgdC5kYmxpbnRlZ3JhbCA9IDB4MjIyYzsKICB0LmRibGxvd2xpbmUgPSAweDIwMTc7CiAgdC5kYmxsb3dsaW5lY21iID0gMHgwMzMzOwogIHQuZGJsb3ZlcmxpbmVjbWIgPSAweDAzM2Y7CiAgdC5kYmxwcmltZW1vZCA9IDB4MDJiYTsKICB0LmRibHZlcnRpY2FsYmFyID0gMHgyMDE2OwogIHQuZGJsdmVydGljYWxsaW5lYWJvdmVjbWIgPSAweDAzMGU7CiAgdC5kYm9wb21vZm8gPSAweDMxMDk7CiAgdC5kYnNxdWFyZSA9IDB4MzNjODsKICB0LmRjYXJvbiA9IDB4MDEwZjsKICB0LmRjZWRpbGxhID0gMHgxZTExOwogIHQuZGNpcmNsZSA9IDB4MjRkMzsKICB0LmRjaXJjdW1mbGV4YmVsb3cgPSAweDFlMTM7CiAgdC5kY3JvYXQgPSAweDAxMTE7CiAgdC5kZGFiZW5nYWxpID0gMHgwOWExOwogIHQuZGRhZGV2YSA9IDB4MDkyMTsKICB0LmRkYWd1amFyYXRpID0gMHgwYWExOwogIHQuZGRhZ3VybXVraGkgPSAweDBhMjE7CiAgdC5kZGFsYXJhYmljID0gMHgwNjg4OwogIHQuZGRhbGZpbmFsYXJhYmljID0gMHhmYjg5OwogIHQuZGRkaGFkZXZhID0gMHgwOTVjOwogIHQuZGRoYWJlbmdhbGkgPSAweDA5YTI7CiAgdC5kZGhhZGV2YSA9IDB4MDkyMjsKICB0LmRkaGFndWphcmF0aSA9IDB4MGFhMjsKICB0LmRkaGFndXJtdWtoaSA9IDB4MGEyMjsKICB0LmRkb3RhY2NlbnQgPSAweDFlMGI7CiAgdC5kZG90YmVsb3cgPSAweDFlMGQ7CiAgdC5kZWNpbWFsc2VwYXJhdG9yYXJhYmljID0gMHgwNjZiOwogIHQuZGVjaW1hbHNlcGFyYXRvcnBlcnNpYW4gPSAweDA2NmI7CiAgdC5kZWN5cmlsbGljID0gMHgwNDM0OwogIHQuZGVncmVlID0gMHgwMGIwOwogIHQuZGVoaWhlYnJldyA9IDB4MDVhZDsKICB0LmRlaGlyYWdhbmEgPSAweDMwNjc7CiAgdC5kZWljb3B0aWMgPSAweDAzZWY7CiAgdC5kZWthdGFrYW5hID0gMHgzMGM3OwogIHQuZGVsZXRlbGVmdCA9IDB4MjMyYjsKICB0LmRlbGV0ZXJpZ2h0ID0gMHgyMzI2OwogIHQuZGVsdGEgPSAweDAzYjQ7CiAgdC5kZWx0YXR1cm5lZCA9IDB4MDE4ZDsKICB0LmRlbm9taW5hdG9ybWludXNvbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY4OwogIHQuZGV6aCA9IDB4MDJhNDsKICB0LmRoYWJlbmdhbGkgPSAweDA5YTc7CiAgdC5kaGFkZXZhID0gMHgwOTI3OwogIHQuZGhhZ3VqYXJhdGkgPSAweDBhYTc7CiAgdC5kaGFndXJtdWtoaSA9IDB4MGEyNzsKICB0LmRob29rID0gMHgwMjU3OwogIHQuZGlhbHl0aWthdG9ub3MgPSAweDAzODU7CiAgdC5kaWFseXRpa2F0b25vc2NtYiA9IDB4MDM0NDsKICB0LmRpYW1vbmQgPSAweDI2NjY7CiAgdC5kaWFtb25kc3VpdHdoaXRlID0gMHgyNjYyOwogIHQuZGllcmVzaXMgPSAweDAwYTg7CiAgdC5kaWVyZXNpc2FjdXRlID0gMHhmNmQ3OwogIHQuZGllcmVzaXNiZWxvd2NtYiA9IDB4MDMyNDsKICB0LmRpZXJlc2lzY21iID0gMHgwMzA4OwogIHQuZGllcmVzaXNncmF2ZSA9IDB4ZjZkODsKICB0LmRpZXJlc2lzdG9ub3MgPSAweDAzODU7CiAgdC5kaWhpcmFnYW5hID0gMHgzMDYyOwogIHQuZGlrYXRha2FuYSA9IDB4MzBjMjsKICB0LmRpdHRvbWFyayA9IDB4MzAwMzsKICB0LmRpdmlkZSA9IDB4MDBmNzsKICB0LmRpdmlkZXMgPSAweDIyMjM7CiAgdC5kaXZpc2lvbnNsYXNoID0gMHgyMjE1OwogIHQuZGplY3lyaWxsaWMgPSAweDA0NTI7CiAgdC5ka3NoYWRlID0gMHgyNTkzOwogIHQuZGxpbmViZWxvdyA9IDB4MWUwZjsKICB0LmRsc3F1YXJlID0gMHgzMzk3OwogIHQuZG1hY3JvbiA9IDB4MDExMTsKICB0LmRtb25vc3BhY2UgPSAweGZmNDQ7CiAgdC5kbmJsb2NrID0gMHgyNTg0OwogIHQuZG9jaGFkYXRoYWkgPSAweDBlMGU7CiAgdC5kb2Rla3RoYWkgPSAweDBlMTQ7CiAgdC5kb2hpcmFnYW5hID0gMHgzMDY5OwogIHQuZG9rYXRha2FuYSA9IDB4MzBjOTsKICB0LmRvbGxhciA9IDB4MDAyNDsKICB0LmRvbGxhcmluZmVyaW9yID0gMHhmNmUzOwogIHQuZG9sbGFybW9ub3NwYWNlID0gMHhmZjA0OwogIHQuZG9sbGFyb2xkc3R5bGUgPSAweGY3MjQ7CiAgdC5kb2xsYXJzbWFsbCA9IDB4ZmU2OTsKICB0LmRvbGxhcnN1cGVyaW9yID0gMHhmNmU0OwogIHQuZG9uZyA9IDB4MjBhYjsKICB0LmRvcnVzcXVhcmUgPSAweDMzMjY7CiAgdC5kb3RhY2NlbnQgPSAweDAyZDk7CiAgdC5kb3RhY2NlbnRjbWIgPSAweDAzMDc7CiAgdC5kb3RiZWxvd2NtYiA9IDB4MDMyMzsKICB0LmRvdGJlbG93Y29tYiA9IDB4MDMyMzsKICB0LmRvdGthdGFrYW5hID0gMHgzMGZiOwogIHQuZG90bGVzc2kgPSAweDAxMzE7CiAgdC5kb3RsZXNzaiA9IDB4ZjZiZTsKICB0LmRvdGxlc3Nqc3Ryb2tlaG9vayA9IDB4MDI4NDsKICB0LmRvdG1hdGggPSAweDIyYzU7CiAgdC5kb3R0ZWRjaXJjbGUgPSAweDI1Y2M7CiAgdC5kb3VibGV5b2RwYXRhaCA9IDB4ZmIxZjsKICB0LmRvdWJsZXlvZHBhdGFoaGVicmV3ID0gMHhmYjFmOwogIHQuZG93bnRhY2tiZWxvd2NtYiA9IDB4MDMxZTsKICB0LmRvd250YWNrbW9kID0gMHgwMmQ1OwogIHQuZHBhcmVuID0gMHgyNDlmOwogIHQuZHN1cGVyaW9yID0gMHhmNmViOwogIHQuZHRhaWwgPSAweDAyNTY7CiAgdC5kdG9wYmFyID0gMHgwMThjOwogIHQuZHVoaXJhZ2FuYSA9IDB4MzA2NTsKICB0LmR1a2F0YWthbmEgPSAweDMwYzU7CiAgdC5keiA9IDB4MDFmMzsKICB0LmR6YWx0b25lID0gMHgwMmEzOwogIHQuZHpjYXJvbiA9IDB4MDFjNjsKICB0LmR6Y3VybCA9IDB4MDJhNTsKICB0LmR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUxOwogIHQuZHplY3lyaWxsaWMgPSAweDA0NTU7CiAgdC5kemhlY3lyaWxsaWMgPSAweDA0NWY7CiAgdC5lID0gMHgwMDY1OwogIHQuZWFjdXRlID0gMHgwMGU5OwogIHQuZWFydGggPSAweDI2NDE7CiAgdC5lYmVuZ2FsaSA9IDB4MDk4ZjsKICB0LmVib3BvbW9mbyA9IDB4MzExYzsKICB0LmVicmV2ZSA9IDB4MDExNTsKICB0LmVjYW5kcmFkZXZhID0gMHgwOTBkOwogIHQuZWNhbmRyYWd1amFyYXRpID0gMHgwYThkOwogIHQuZWNhbmRyYXZvd2Vsc2lnbmRldmEgPSAweDA5NDU7CiAgdC5lY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzU7CiAgdC5lY2Fyb24gPSAweDAxMWI7CiAgdC5lY2VkaWxsYWJyZXZlID0gMHgxZTFkOwogIHQuZWNoYXJtZW5pYW4gPSAweDA1NjU7CiAgdC5lY2h5aXduYXJtZW5pYW4gPSAweDA1ODc7CiAgdC5lY2lyY2xlID0gMHgyNGQ0OwogIHQuZWNpcmN1bWZsZXggPSAweDAwZWE7CiAgdC5lY2lyY3VtZmxleGFjdXRlID0gMHgxZWJmOwogIHQuZWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxOTsKICB0LmVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzc7CiAgdC5lY2lyY3VtZmxleGdyYXZlID0gMHgxZWMxOwogIHQuZWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzM7CiAgdC5lY2lyY3VtZmxleHRpbGRlID0gMHgxZWM1OwogIHQuZWN5cmlsbGljID0gMHgwNDU0OwogIHQuZWRibGdyYXZlID0gMHgwMjA1OwogIHQuZWRldmEgPSAweDA5MGY7CiAgdC5lZGllcmVzaXMgPSAweDAwZWI7CiAgdC5lZG90ID0gMHgwMTE3OwogIHQuZWRvdGFjY2VudCA9IDB4MDExNzsKICB0LmVkb3RiZWxvdyA9IDB4MWViOTsKICB0LmVlZ3VybXVraGkgPSAweDBhMGY7CiAgdC5lZW1hdHJhZ3VybXVraGkgPSAweDBhNDc7CiAgdC5lZmN5cmlsbGljID0gMHgwNDQ0OwogIHQuZWdyYXZlID0gMHgwMGU4OwogIHQuZWd1amFyYXRpID0gMHgwYThmOwogIHQuZWhhcm1lbmlhbiA9IDB4MDU2NzsKICB0LmVoYm9wb21vZm8gPSAweDMxMWQ7CiAgdC5laGlyYWdhbmEgPSAweDMwNDg7CiAgdC5laG9va2Fib3ZlID0gMHgxZWJiOwogIHQuZWlib3BvbW9mbyA9IDB4MzExZjsKICB0LmVpZ2h0ID0gMHgwMDM4OwogIHQuZWlnaHRhcmFiaWMgPSAweDA2Njg7CiAgdC5laWdodGJlbmdhbGkgPSAweDA5ZWU7CiAgdC5laWdodGNpcmNsZSA9IDB4MjQ2NzsKICB0LmVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MTsKICB0LmVpZ2h0ZGV2YSA9IDB4MDk2ZTsKICB0LmVpZ2h0ZWVuY2lyY2xlID0gMHgyNDcxOwogIHQuZWlnaHRlZW5wYXJlbiA9IDB4MjQ4NTsKICB0LmVpZ2h0ZWVucGVyaW9kID0gMHgyNDk5OwogIHQuZWlnaHRndWphcmF0aSA9IDB4MGFlZTsKICB0LmVpZ2h0Z3VybXVraGkgPSAweDBhNmU7CiAgdC5laWdodGhhY2thcmFiaWMgPSAweDA2Njg7CiAgdC5laWdodGhhbmd6aG91ID0gMHgzMDI4OwogIHQuZWlnaHRobm90ZWJlYW1lZCA9IDB4MjY2YjsKICB0LmVpZ2h0aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNzsKICB0LmVpZ2h0aW5mZXJpb3IgPSAweDIwODg7CiAgdC5laWdodG1vbm9zcGFjZSA9IDB4ZmYxODsKICB0LmVpZ2h0b2xkc3R5bGUgPSAweGY3Mzg7CiAgdC5laWdodHBhcmVuID0gMHgyNDdiOwogIHQuZWlnaHRwZXJpb2QgPSAweDI0OGY7CiAgdC5laWdodHBlcnNpYW4gPSAweDA2Zjg7CiAgdC5laWdodHJvbWFuID0gMHgyMTc3OwogIHQuZWlnaHRzdXBlcmlvciA9IDB4MjA3ODsKICB0LmVpZ2h0dGhhaSA9IDB4MGU1ODsKICB0LmVpbnZlcnRlZGJyZXZlID0gMHgwMjA3OwogIHQuZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0NjU7CiAgdC5la2F0YWthbmEgPSAweDMwYTg7CiAgdC5la2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzQ7CiAgdC5la29ua2FyZ3VybXVraGkgPSAweDBhNzQ7CiAgdC5la29yZWFuID0gMHgzMTU0OwogIHQuZWxjeXJpbGxpYyA9IDB4MDQzYjsKICB0LmVsZW1lbnQgPSAweDIyMDg7CiAgdC5lbGV2ZW5jaXJjbGUgPSAweDI0NmE7CiAgdC5lbGV2ZW5wYXJlbiA9IDB4MjQ3ZTsKICB0LmVsZXZlbnBlcmlvZCA9IDB4MjQ5MjsKICB0LmVsZXZlbnJvbWFuID0gMHgyMTdhOwogIHQuZWxsaXBzaXMgPSAweDIwMjY7CiAgdC5lbGxpcHNpc3ZlcnRpY2FsID0gMHgyMmVlOwogIHQuZW1hY3JvbiA9IDB4MDExMzsKICB0LmVtYWNyb25hY3V0ZSA9IDB4MWUxNzsKICB0LmVtYWNyb25ncmF2ZSA9IDB4MWUxNTsKICB0LmVtY3lyaWxsaWMgPSAweDA0M2M7CiAgdC5lbWRhc2ggPSAweDIwMTQ7CiAgdC5lbWRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMTsKICB0LmVtb25vc3BhY2UgPSAweGZmNDU7CiAgdC5lbXBoYXNpc21hcmthcm1lbmlhbiA9IDB4MDU1YjsKICB0LmVtcHR5c2V0ID0gMHgyMjA1OwogIHQuZW5ib3BvbW9mbyA9IDB4MzEyMzsKICB0LmVuY3lyaWxsaWMgPSAweDA0M2Q7CiAgdC5lbmRhc2ggPSAweDIwMTM7CiAgdC5lbmRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMjsKICB0LmVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTM7CiAgdC5lbmcgPSAweDAxNGI7CiAgdC5lbmdib3BvbW9mbyA9IDB4MzEyNTsKICB0LmVuZ2hlY3lyaWxsaWMgPSAweDA0YTU7CiAgdC5lbmhvb2tjeXJpbGxpYyA9IDB4MDRjODsKICB0LmVuc3BhY2UgPSAweDIwMDI7CiAgdC5lb2dvbmVrID0gMHgwMTE5OwogIHQuZW9rb3JlYW4gPSAweDMxNTM7CiAgdC5lb3BlbiA9IDB4MDI1YjsKICB0LmVvcGVuY2xvc2VkID0gMHgwMjlhOwogIHQuZW9wZW5yZXZlcnNlZCA9IDB4MDI1YzsKICB0LmVvcGVucmV2ZXJzZWRjbG9zZWQgPSAweDAyNWU7CiAgdC5lb3BlbnJldmVyc2VkaG9vayA9IDB4MDI1ZDsKICB0LmVwYXJlbiA9IDB4MjRhMDsKICB0LmVwc2lsb24gPSAweDAzYjU7CiAgdC5lcHNpbG9udG9ub3MgPSAweDAzYWQ7CiAgdC5lcXVhbCA9IDB4MDAzZDsKICB0LmVxdWFsbW9ub3NwYWNlID0gMHhmZjFkOwogIHQuZXF1YWxzbWFsbCA9IDB4ZmU2NjsKICB0LmVxdWFsc3VwZXJpb3IgPSAweDIwN2M7CiAgdC5lcXVpdmFsZW5jZSA9IDB4MjI2MTsKICB0LmVyYm9wb21vZm8gPSAweDMxMjY7CiAgdC5lcmN5cmlsbGljID0gMHgwNDQwOwogIHQuZXJldmVyc2VkID0gMHgwMjU4OwogIHQuZXJldmVyc2VkY3lyaWxsaWMgPSAweDA0NGQ7CiAgdC5lc2N5cmlsbGljID0gMHgwNDQxOwogIHQuZXNkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYjsKICB0LmVzaCA9IDB4MDI4MzsKICB0LmVzaGN1cmwgPSAweDAyODY7CiAgdC5lc2hvcnRkZXZhID0gMHgwOTBlOwogIHQuZXNob3J0dm93ZWxzaWduZGV2YSA9IDB4MDk0NjsKICB0LmVzaHJldmVyc2VkbG9vcCA9IDB4MDFhYTsKICB0LmVzaHNxdWF0cmV2ZXJzZWQgPSAweDAyODU7CiAgdC5lc21hbGxoaXJhZ2FuYSA9IDB4MzA0NzsKICB0LmVzbWFsbGthdGFrYW5hID0gMHgzMGE3OwogIHQuZXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmE7CiAgdC5lc3RpbWF0ZWQgPSAweDIxMmU7CiAgdC5lc3VwZXJpb3IgPSAweGY2ZWM7CiAgdC5ldGEgPSAweDAzYjc7CiAgdC5ldGFybWVuaWFuID0gMHgwNTY4OwogIHQuZXRhdG9ub3MgPSAweDAzYWU7CiAgdC5ldGggPSAweDAwZjA7CiAgdC5ldGlsZGUgPSAweDFlYmQ7CiAgdC5ldGlsZGViZWxvdyA9IDB4MWUxYjsKICB0LmV0bmFodGFmb3VraGhlYnJldyA9IDB4MDU5MTsKICB0LmV0bmFodGFmb3VraGxlZnRoZWJyZXcgPSAweDA1OTE7CiAgdC5ldG5haHRhaGVicmV3ID0gMHgwNTkxOwogIHQuZXRuYWh0YWxlZnRoZWJyZXcgPSAweDA1OTE7CiAgdC5ldHVybmVkID0gMHgwMWRkOwogIHQuZXVrb3JlYW4gPSAweDMxNjE7CiAgdC5ldXJvID0gMHgyMGFjOwogIHQuZXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzc7CiAgdC5ldm93ZWxzaWduZGV2YSA9IDB4MDk0NzsKICB0LmV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjNzsKICB0LmV4Y2xhbSA9IDB4MDAyMTsKICB0LmV4Y2xhbWFybWVuaWFuID0gMHgwNTVjOwogIHQuZXhjbGFtZGJsID0gMHgyMDNjOwogIHQuZXhjbGFtZG93biA9IDB4MDBhMTsKICB0LmV4Y2xhbWRvd25zbWFsbCA9IDB4ZjdhMTsKICB0LmV4Y2xhbW1vbm9zcGFjZSA9IDB4ZmYwMTsKICB0LmV4Y2xhbXNtYWxsID0gMHhmNzIxOwogIHQuZXhpc3RlbnRpYWwgPSAweDIyMDM7CiAgdC5lemggPSAweDAyOTI7CiAgdC5lemhjYXJvbiA9IDB4MDFlZjsKICB0LmV6aGN1cmwgPSAweDAyOTM7CiAgdC5lemhyZXZlcnNlZCA9IDB4MDFiOTsKICB0LmV6aHRhaWwgPSAweDAxYmE7CiAgdC5mID0gMHgwMDY2OwogIHQuZmFkZXZhID0gMHgwOTVlOwogIHQuZmFndXJtdWtoaSA9IDB4MGE1ZTsKICB0LmZhaHJlbmhlaXQgPSAweDIxMDk7CiAgdC5mYXRoYWFyYWJpYyA9IDB4MDY0ZTsKICB0LmZhdGhhbG93YXJhYmljID0gMHgwNjRlOwogIHQuZmF0aGF0YW5hcmFiaWMgPSAweDA2NGI7CiAgdC5mYm9wb21vZm8gPSAweDMxMDg7CiAgdC5mY2lyY2xlID0gMHgyNGQ1OwogIHQuZmRvdGFjY2VudCA9IDB4MWUxZjsKICB0LmZlaGFyYWJpYyA9IDB4MDY0MTsKICB0LmZlaGFybWVuaWFuID0gMHgwNTg2OwogIHQuZmVoZmluYWxhcmFiaWMgPSAweGZlZDI7CiAgdC5mZWhpbml0aWFsYXJhYmljID0gMHhmZWQzOwogIHQuZmVobWVkaWFsYXJhYmljID0gMHhmZWQ0OwogIHQuZmVpY29wdGljID0gMHgwM2U1OwogIHQuZmVtYWxlID0gMHgyNjQwOwogIHQuZmYgPSAweGZiMDA7CiAgdC5mX2YgPSAweGZiMDA7CiAgdC5mZmkgPSAweGZiMDM7CiAgdC5mX2ZfaSA9IDB4ZmIwMzsKICB0LmZmbCA9IDB4ZmIwNDsKICB0LmZfZl9sID0gMHhmYjA0OwogIHQuZmkgPSAweGZiMDE7CiAgdC5mX2kgPSAweGZiMDE7CiAgdC5maWZ0ZWVuY2lyY2xlID0gMHgyNDZlOwogIHQuZmlmdGVlbnBhcmVuID0gMHgyNDgyOwogIHQuZmlmdGVlbnBlcmlvZCA9IDB4MjQ5NjsKICB0LmZpZ3VyZWRhc2ggPSAweDIwMTI7CiAgdC5maWxsZWRib3ggPSAweDI1YTA7CiAgdC5maWxsZWRyZWN0ID0gMHgyNWFjOwogIHQuZmluYWxrYWYgPSAweDA1ZGE7CiAgdC5maW5hbGthZmRhZ2VzaCA9IDB4ZmIzYTsKICB0LmZpbmFsa2FmZGFnZXNoaGVicmV3ID0gMHhmYjNhOwogIHQuZmluYWxrYWZoZWJyZXcgPSAweDA1ZGE7CiAgdC5maW5hbG1lbSA9IDB4MDVkZDsKICB0LmZpbmFsbWVtaGVicmV3ID0gMHgwNWRkOwogIHQuZmluYWxudW4gPSAweDA1ZGY7CiAgdC5maW5hbG51bmhlYnJldyA9IDB4MDVkZjsKICB0LmZpbmFscGUgPSAweDA1ZTM7CiAgdC5maW5hbHBlaGVicmV3ID0gMHgwNWUzOwogIHQuZmluYWx0c2FkaSA9IDB4MDVlNTsKICB0LmZpbmFsdHNhZGloZWJyZXcgPSAweDA1ZTU7CiAgdC5maXJzdHRvbmVjaGluZXNlID0gMHgwMmM5OwogIHQuZmlzaGV5ZSA9IDB4MjVjOTsKICB0LmZpdGFjeXJpbGxpYyA9IDB4MDQ3MzsKICB0LmZpdmUgPSAweDAwMzU7CiAgdC5maXZlYXJhYmljID0gMHgwNjY1OwogIHQuZml2ZWJlbmdhbGkgPSAweDA5ZWI7CiAgdC5maXZlY2lyY2xlID0gMHgyNDY0OwogIHQuZml2ZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGU7CiAgdC5maXZlZGV2YSA9IDB4MDk2YjsKICB0LmZpdmVlaWdodGhzID0gMHgyMTVkOwogIHQuZml2ZWd1amFyYXRpID0gMHgwYWViOwogIHQuZml2ZWd1cm11a2hpID0gMHgwYTZiOwogIHQuZml2ZWhhY2thcmFiaWMgPSAweDA2NjU7CiAgdC5maXZlaGFuZ3pob3UgPSAweDMwMjU7CiAgdC5maXZlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNDsKICB0LmZpdmVpbmZlcmlvciA9IDB4MjA4NTsKICB0LmZpdmVtb25vc3BhY2UgPSAweGZmMTU7CiAgdC5maXZlb2xkc3R5bGUgPSAweGY3MzU7CiAgdC5maXZlcGFyZW4gPSAweDI0Nzg7CiAgdC5maXZlcGVyaW9kID0gMHgyNDhjOwogIHQuZml2ZXBlcnNpYW4gPSAweDA2ZjU7CiAgdC5maXZlcm9tYW4gPSAweDIxNzQ7CiAgdC5maXZlc3VwZXJpb3IgPSAweDIwNzU7CiAgdC5maXZldGhhaSA9IDB4MGU1NTsKICB0LmZsID0gMHhmYjAyOwogIHQuZl9sID0gMHhmYjAyOwogIHQuZmxvcmluID0gMHgwMTkyOwogIHQuZm1vbm9zcGFjZSA9IDB4ZmY0NjsKICB0LmZtc3F1YXJlID0gMHgzMzk5OwogIHQuZm9mYW50aGFpID0gMHgwZTFmOwogIHQuZm9mYXRoYWkgPSAweDBlMWQ7CiAgdC5mb25nbWFudGhhaSA9IDB4MGU0ZjsKICB0LmZvcmFsbCA9IDB4MjIwMDsKICB0LmZvdXIgPSAweDAwMzQ7CiAgdC5mb3VyYXJhYmljID0gMHgwNjY0OwogIHQuZm91cmJlbmdhbGkgPSAweDA5ZWE7CiAgdC5mb3VyY2lyY2xlID0gMHgyNDYzOwogIHQuZm91cmNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGQ7CiAgdC5mb3VyZGV2YSA9IDB4MDk2YTsKICB0LmZvdXJndWphcmF0aSA9IDB4MGFlYTsKICB0LmZvdXJndXJtdWtoaSA9IDB4MGE2YTsKICB0LmZvdXJoYWNrYXJhYmljID0gMHgwNjY0OwogIHQuZm91cmhhbmd6aG91ID0gMHgzMDI0OwogIHQuZm91cmlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjM7CiAgdC5mb3VyaW5mZXJpb3IgPSAweDIwODQ7CiAgdC5mb3VybW9ub3NwYWNlID0gMHhmZjE0OwogIHQuZm91cm51bWVyYXRvcmJlbmdhbGkgPSAweDA5Zjc7CiAgdC5mb3Vyb2xkc3R5bGUgPSAweGY3MzQ7CiAgdC5mb3VycGFyZW4gPSAweDI0Nzc7CiAgdC5mb3VycGVyaW9kID0gMHgyNDhiOwogIHQuZm91cnBlcnNpYW4gPSAweDA2ZjQ7CiAgdC5mb3Vycm9tYW4gPSAweDIxNzM7CiAgdC5mb3Vyc3VwZXJpb3IgPSAweDIwNzQ7CiAgdC5mb3VydGVlbmNpcmNsZSA9IDB4MjQ2ZDsKICB0LmZvdXJ0ZWVucGFyZW4gPSAweDI0ODE7CiAgdC5mb3VydGVlbnBlcmlvZCA9IDB4MjQ5NTsKICB0LmZvdXJ0aGFpID0gMHgwZTU0OwogIHQuZm91cnRodG9uZWNoaW5lc2UgPSAweDAyY2I7CiAgdC5mcGFyZW4gPSAweDI0YTE7CiAgdC5mcmFjdGlvbiA9IDB4MjA0NDsKICB0LmZyYW5jID0gMHgyMGEzOwogIHQuZyA9IDB4MDA2NzsKICB0LmdhYmVuZ2FsaSA9IDB4MDk5NzsKICB0LmdhY3V0ZSA9IDB4MDFmNTsKICB0LmdhZGV2YSA9IDB4MDkxNzsKICB0LmdhZmFyYWJpYyA9IDB4MDZhZjsKICB0LmdhZmZpbmFsYXJhYmljID0gMHhmYjkzOwogIHQuZ2FmaW5pdGlhbGFyYWJpYyA9IDB4ZmI5NDsKICB0LmdhZm1lZGlhbGFyYWJpYyA9IDB4ZmI5NTsKICB0LmdhZ3VqYXJhdGkgPSAweDBhOTc7CiAgdC5nYWd1cm11a2hpID0gMHgwYTE3OwogIHQuZ2FoaXJhZ2FuYSA9IDB4MzA0YzsKICB0Lmdha2F0YWthbmEgPSAweDMwYWM7CiAgdC5nYW1tYSA9IDB4MDNiMzsKICB0LmdhbW1hbGF0aW5zbWFsbCA9IDB4MDI2MzsKICB0LmdhbW1hc3VwZXJpb3IgPSAweDAyZTA7CiAgdC5nYW5naWFjb3B0aWMgPSAweDAzZWI7CiAgdC5nYm9wb21vZm8gPSAweDMxMGQ7CiAgdC5nYnJldmUgPSAweDAxMWY7CiAgdC5nY2Fyb24gPSAweDAxZTc7CiAgdC5nY2VkaWxsYSA9IDB4MDEyMzsKICB0LmdjaXJjbGUgPSAweDI0ZDY7CiAgdC5nY2lyY3VtZmxleCA9IDB4MDExZDsKICB0Lmdjb21tYWFjY2VudCA9IDB4MDEyMzsKICB0Lmdkb3QgPSAweDAxMjE7CiAgdC5nZG90YWNjZW50ID0gMHgwMTIxOwogIHQuZ2VjeXJpbGxpYyA9IDB4MDQzMzsKICB0LmdlaGlyYWdhbmEgPSAweDMwNTI7CiAgdC5nZWthdGFrYW5hID0gMHgzMGIyOwogIHQuZ2VvbWV0cmljYWxseWVxdWFsID0gMHgyMjUxOwogIHQuZ2VyZXNoYWNjZW50aGVicmV3ID0gMHgwNTljOwogIHQuZ2VyZXNoaGVicmV3ID0gMHgwNWYzOwogIHQuZ2VyZXNobXVxZGFtaGVicmV3ID0gMHgwNTlkOwogIHQuZ2VybWFuZGJscyA9IDB4MDBkZjsKICB0LmdlcnNoYXlpbWFjY2VudGhlYnJldyA9IDB4MDU5ZTsKICB0LmdlcnNoYXlpbWhlYnJldyA9IDB4MDVmNDsKICB0LmdldGFtYXJrID0gMHgzMDEzOwogIHQuZ2hhYmVuZ2FsaSA9IDB4MDk5ODsKICB0LmdoYWRhcm1lbmlhbiA9IDB4MDU3MjsKICB0LmdoYWRldmEgPSAweDA5MTg7CiAgdC5naGFndWphcmF0aSA9IDB4MGE5ODsKICB0LmdoYWd1cm11a2hpID0gMHgwYTE4OwogIHQuZ2hhaW5hcmFiaWMgPSAweDA2M2E7CiAgdC5naGFpbmZpbmFsYXJhYmljID0gMHhmZWNlOwogIHQuZ2hhaW5pbml0aWFsYXJhYmljID0gMHhmZWNmOwogIHQuZ2hhaW5tZWRpYWxhcmFiaWMgPSAweGZlZDA7CiAgdC5naGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTU7CiAgdC5naGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MzsKICB0LmdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkxOwogIHQuZ2hoYWRldmEgPSAweDA5NWE7CiAgdC5naGhhZ3VybXVraGkgPSAweDBhNWE7CiAgdC5naG9vayA9IDB4MDI2MDsKICB0LmdoenNxdWFyZSA9IDB4MzM5MzsKICB0LmdpaGlyYWdhbmEgPSAweDMwNGU7CiAgdC5naWthdGFrYW5hID0gMHgzMGFlOwogIHQuZ2ltYXJtZW5pYW4gPSAweDA1NjM7CiAgdC5naW1lbCA9IDB4MDVkMjsKICB0LmdpbWVsZGFnZXNoID0gMHhmYjMyOwogIHQuZ2ltZWxkYWdlc2hoZWJyZXcgPSAweGZiMzI7CiAgdC5naW1lbGhlYnJldyA9IDB4MDVkMjsKICB0LmdqZWN5cmlsbGljID0gMHgwNDUzOwogIHQuZ2xvdHRhbGludmVydGVkc3Ryb2tlID0gMHgwMWJlOwogIHQuZ2xvdHRhbHN0b3AgPSAweDAyOTQ7CiAgdC5nbG90dGFsc3RvcGludmVydGVkID0gMHgwMjk2OwogIHQuZ2xvdHRhbHN0b3Btb2QgPSAweDAyYzA7CiAgdC5nbG90dGFsc3RvcHJldmVyc2VkID0gMHgwMjk1OwogIHQuZ2xvdHRhbHN0b3ByZXZlcnNlZG1vZCA9IDB4MDJjMTsKICB0Lmdsb3R0YWxzdG9wcmV2ZXJzZWRzdXBlcmlvciA9IDB4MDJlNDsKICB0Lmdsb3R0YWxzdG9wc3Ryb2tlID0gMHgwMmExOwogIHQuZ2xvdHRhbHN0b3BzdHJva2VyZXZlcnNlZCA9IDB4MDJhMjsKICB0LmdtYWNyb24gPSAweDFlMjE7CiAgdC5nbW9ub3NwYWNlID0gMHhmZjQ3OwogIHQuZ29oaXJhZ2FuYSA9IDB4MzA1NDsKICB0Lmdva2F0YWthbmEgPSAweDMwYjQ7CiAgdC5ncGFyZW4gPSAweDI0YTI7CiAgdC5ncGFzcXVhcmUgPSAweDMzYWM7CiAgdC5ncmFkaWVudCA9IDB4MjIwNzsKICB0LmdyYXZlID0gMHgwMDYwOwogIHQuZ3JhdmViZWxvd2NtYiA9IDB4MDMxNjsKICB0LmdyYXZlY21iID0gMHgwMzAwOwogIHQuZ3JhdmVjb21iID0gMHgwMzAwOwogIHQuZ3JhdmVkZXZhID0gMHgwOTUzOwogIHQuZ3JhdmVsb3dtb2QgPSAweDAyY2U7CiAgdC5ncmF2ZW1vbm9zcGFjZSA9IDB4ZmY0MDsKICB0LmdyYXZldG9uZWNtYiA9IDB4MDM0MDsKICB0LmdyZWF0ZXIgPSAweDAwM2U7CiAgdC5ncmVhdGVyZXF1YWwgPSAweDIyNjU7CiAgdC5ncmVhdGVyZXF1YWxvcmxlc3MgPSAweDIyZGI7CiAgdC5ncmVhdGVybW9ub3NwYWNlID0gMHhmZjFlOwogIHQuZ3JlYXRlcm9yZXF1aXZhbGVudCA9IDB4MjI3MzsKICB0LmdyZWF0ZXJvcmxlc3MgPSAweDIyNzc7CiAgdC5ncmVhdGVyb3ZlcmVxdWFsID0gMHgyMjY3OwogIHQuZ3JlYXRlcnNtYWxsID0gMHhmZTY1OwogIHQuZ3NjcmlwdCA9IDB4MDI2MTsKICB0LmdzdHJva2UgPSAweDAxZTU7CiAgdC5ndWhpcmFnYW5hID0gMHgzMDUwOwogIHQuZ3VpbGxlbW90bGVmdCA9IDB4MDBhYjsKICB0Lmd1aWxsZW1vdHJpZ2h0ID0gMHgwMGJiOwogIHQuZ3VpbHNpbmdsbGVmdCA9IDB4MjAzOTsKICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMHgyMDNhOwogIHQuZ3VrYXRha2FuYSA9IDB4MzBiMDsKICB0Lmd1cmFtdXNxdWFyZSA9IDB4MzMxODsKICB0Lmd5c3F1YXJlID0gMHgzM2M5OwogIHQuaCA9IDB4MDA2ODsKICB0LmhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTk7CiAgdC5oYWFsdG9uZWFyYWJpYyA9IDB4MDZjMTsKICB0LmhhYmVuZ2FsaSA9IDB4MDliOTsKICB0LmhhZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YjM7CiAgdC5oYWRldmEgPSAweDA5Mzk7CiAgdC5oYWd1amFyYXRpID0gMHgwYWI5OwogIHQuaGFndXJtdWtoaSA9IDB4MGEzOTsKICB0LmhhaGFyYWJpYyA9IDB4MDYyZDsKICB0LmhhaGZpbmFsYXJhYmljID0gMHhmZWEyOwogIHQuaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVhMzsKICB0LmhhaGlyYWdhbmEgPSAweDMwNmY7CiAgdC5oYWhtZWRpYWxhcmFiaWMgPSAweGZlYTQ7CiAgdC5oYWl0dXNxdWFyZSA9IDB4MzMyYTsKICB0Lmhha2F0YWthbmEgPSAweDMwY2Y7CiAgdC5oYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhhOwogIHQuaGFsYW50Z3VybXVraGkgPSAweDBhNGQ7CiAgdC5oYW16YWFyYWJpYyA9IDB4MDYyMTsKICB0LmhhbXphbG93YXJhYmljID0gMHgwNjIxOwogIHQuaGFuZ3VsZmlsbGVyID0gMHgzMTY0OwogIHQuaGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQ0YTsKICB0LmhhcnBvb25sZWZ0YmFyYnVwID0gMHgyMWJjOwogIHQuaGFycG9vbnJpZ2h0YmFyYnVwID0gMHgyMWMwOwogIHQuaGFzcXVhcmUgPSAweDMzY2E7CiAgdC5oYXRhZnBhdGFoID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDE2ID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDIzID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDJmID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaGhlYnJldyA9IDB4MDViMjsKICB0LmhhdGFmcGF0YWhuYXJyb3doZWJyZXcgPSAweDA1YjI7CiAgdC5oYXRhZnBhdGFocXVhcnRlcmhlYnJldyA9IDB4MDViMjsKICB0LmhhdGFmcGF0YWh3aWRlaGVicmV3ID0gMHgwNWIyOwogIHQuaGF0YWZxYW1hdHMgPSAweDA1YjM7CiAgdC5oYXRhZnFhbWF0czFiID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHMyOCA9IDB4MDViMzsKICB0LmhhdGFmcWFtYXRzMzQgPSAweDA1YjM7CiAgdC5oYXRhZnFhbWF0c2hlYnJldyA9IDB4MDViMzsKICB0LmhhdGFmcWFtYXRzbmFycm93aGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHNxdWFydGVyaGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHN3aWRlaGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZzZWdvbCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wxNyA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wyNCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wzMCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2xoZWJyZXcgPSAweDA1YjE7CiAgdC5oYXRhZnNlZ29sbmFycm93aGVicmV3ID0gMHgwNWIxOwogIHQuaGF0YWZzZWdvbHF1YXJ0ZXJoZWJyZXcgPSAweDA1YjE7CiAgdC5oYXRhZnNlZ29sd2lkZWhlYnJldyA9IDB4MDViMTsKICB0LmhiYXIgPSAweDAxMjc7CiAgdC5oYm9wb21vZm8gPSAweDMxMGY7CiAgdC5oYnJldmViZWxvdyA9IDB4MWUyYjsKICB0LmhjZWRpbGxhID0gMHgxZTI5OwogIHQuaGNpcmNsZSA9IDB4MjRkNzsKICB0LmhjaXJjdW1mbGV4ID0gMHgwMTI1OwogIHQuaGRpZXJlc2lzID0gMHgxZTI3OwogIHQuaGRvdGFjY2VudCA9IDB4MWUyMzsKICB0Lmhkb3RiZWxvdyA9IDB4MWUyNTsKICB0LmhlID0gMHgwNWQ0OwogIHQuaGVhcnQgPSAweDI2NjU7CiAgdC5oZWFydHN1aXRibGFjayA9IDB4MjY2NTsKICB0LmhlYXJ0c3VpdHdoaXRlID0gMHgyNjYxOwogIHQuaGVkYWdlc2ggPSAweGZiMzQ7CiAgdC5oZWRhZ2VzaGhlYnJldyA9IDB4ZmIzNDsKICB0LmhlaGFsdG9uZWFyYWJpYyA9IDB4MDZjMTsKICB0LmhlaGFyYWJpYyA9IDB4MDY0NzsKICB0LmhlaGVicmV3ID0gMHgwNWQ0OwogIHQuaGVoZmluYWxhbHRvbmVhcmFiaWMgPSAweGZiYTc7CiAgdC5oZWhmaW5hbGFsdHR3b2FyYWJpYyA9IDB4ZmVlYTsKICB0LmhlaGZpbmFsYXJhYmljID0gMHhmZWVhOwogIHQuaGVoaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmYmE1OwogIHQuaGVoaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmYmE0OwogIHQuaGVoaW5pdGlhbGFsdG9uZWFyYWJpYyA9IDB4ZmJhODsKICB0LmhlaGluaXRpYWxhcmFiaWMgPSAweGZlZWI7CiAgdC5oZWhpcmFnYW5hID0gMHgzMDc4OwogIHQuaGVobWVkaWFsYWx0b25lYXJhYmljID0gMHhmYmE5OwogIHQuaGVobWVkaWFsYXJhYmljID0gMHhmZWVjOwogIHQuaGVpc2VpZXJhc3F1YXJlID0gMHgzMzdiOwogIHQuaGVrYXRha2FuYSA9IDB4MzBkODsKICB0Lmhla2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGQ7CiAgdC5oZWt1dGFhcnVzcXVhcmUgPSAweDMzMzY7CiAgdC5oZW5naG9vayA9IDB4MDI2NzsKICB0LmhlcnV0dXNxdWFyZSA9IDB4MzMzOTsKICB0LmhldCA9IDB4MDVkNzsKICB0LmhldGhlYnJldyA9IDB4MDVkNzsKICB0Lmhob29rID0gMHgwMjY2OwogIHQuaGhvb2tzdXBlcmlvciA9IDB4MDJiMTsKICB0LmhpZXVoYWNpcmNsZWtvcmVhbiA9IDB4MzI3YjsKICB0LmhpZXVoYXBhcmVua29yZWFuID0gMHgzMjFiOwogIHQuaGlldWhjaXJjbGVrb3JlYW4gPSAweDMyNmQ7CiAgdC5oaWV1aGtvcmVhbiA9IDB4MzE0ZTsKICB0LmhpZXVocGFyZW5rb3JlYW4gPSAweDMyMGQ7CiAgdC5oaWhpcmFnYW5hID0gMHgzMDcyOwogIHQuaGlrYXRha2FuYSA9IDB4MzBkMjsKICB0Lmhpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGI7CiAgdC5oaXJpcSA9IDB4MDViNDsKICB0LmhpcmlxMTQgPSAweDA1YjQ7CiAgdC5oaXJpcTIxID0gMHgwNWI0OwogIHQuaGlyaXEyZCA9IDB4MDViNDsKICB0LmhpcmlxaGVicmV3ID0gMHgwNWI0OwogIHQuaGlyaXFuYXJyb3doZWJyZXcgPSAweDA1YjQ7CiAgdC5oaXJpcXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjQ7CiAgdC5oaXJpcXdpZGVoZWJyZXcgPSAweDA1YjQ7CiAgdC5obGluZWJlbG93ID0gMHgxZTk2OwogIHQuaG1vbm9zcGFjZSA9IDB4ZmY0ODsKICB0LmhvYXJtZW5pYW4gPSAweDA1NzA7CiAgdC5ob2hpcHRoYWkgPSAweDBlMmI7CiAgdC5ob2hpcmFnYW5hID0gMHgzMDdiOwogIHQuaG9rYXRha2FuYSA9IDB4MzBkYjsKICB0Lmhva2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGU7CiAgdC5ob2xhbSA9IDB4MDViOTsKICB0LmhvbGFtMTkgPSAweDA1Yjk7CiAgdC5ob2xhbTI2ID0gMHgwNWI5OwogIHQuaG9sYW0zMiA9IDB4MDViOTsKICB0LmhvbGFtaGVicmV3ID0gMHgwNWI5OwogIHQuaG9sYW1uYXJyb3doZWJyZXcgPSAweDA1Yjk7CiAgdC5ob2xhbXF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjk7CiAgdC5ob2xhbXdpZGVoZWJyZXcgPSAweDA1Yjk7CiAgdC5ob25va2h1a3RoYWkgPSAweDBlMmU7CiAgdC5ob29rYWJvdmVjb21iID0gMHgwMzA5OwogIHQuaG9va2NtYiA9IDB4MDMwOTsKICB0Lmhvb2twYWxhdGFsaXplZGJlbG93Y21iID0gMHgwMzIxOwogIHQuaG9va3JldHJvZmxleGJlbG93Y21iID0gMHgwMzIyOwogIHQuaG9vbnNxdWFyZSA9IDB4MzM0MjsKICB0Lmhvcmljb3B0aWMgPSAweDAzZTk7CiAgdC5ob3Jpem9udGFsYmFyID0gMHgyMDE1OwogIHQuaG9ybmNtYiA9IDB4MDMxYjsKICB0LmhvdHNwcmluZ3MgPSAweDI2Njg7CiAgdC5ob3VzZSA9IDB4MjMwMjsKICB0LmhwYXJlbiA9IDB4MjRhMzsKICB0LmhzdXBlcmlvciA9IDB4MDJiMDsKICB0Lmh0dXJuZWQgPSAweDAyNjU7CiAgdC5odWhpcmFnYW5hID0gMHgzMDc1OwogIHQuaHVpaXRvc3F1YXJlID0gMHgzMzMzOwogIHQuaHVrYXRha2FuYSA9IDB4MzBkNTsKICB0Lmh1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGM7CiAgdC5odW5nYXJ1bWxhdXQgPSAweDAyZGQ7CiAgdC5odW5nYXJ1bWxhdXRjbWIgPSAweDAzMGI7CiAgdC5odiA9IDB4MDE5NTsKICB0Lmh5cGhlbiA9IDB4MDAyZDsKICB0Lmh5cGhlbmluZmVyaW9yID0gMHhmNmU1OwogIHQuaHlwaGVubW9ub3NwYWNlID0gMHhmZjBkOwogIHQuaHlwaGVuc21hbGwgPSAweGZlNjM7CiAgdC5oeXBoZW5zdXBlcmlvciA9IDB4ZjZlNjsKICB0Lmh5cGhlbnR3byA9IDB4MjAxMDsKICB0LmkgPSAweDAwNjk7CiAgdC5pYWN1dGUgPSAweDAwZWQ7CiAgdC5pYWN5cmlsbGljID0gMHgwNDRmOwogIHQuaWJlbmdhbGkgPSAweDA5ODc7CiAgdC5pYm9wb21vZm8gPSAweDMxMjc7CiAgdC5pYnJldmUgPSAweDAxMmQ7CiAgdC5pY2Fyb24gPSAweDAxZDA7CiAgdC5pY2lyY2xlID0gMHgyNGQ4OwogIHQuaWNpcmN1bWZsZXggPSAweDAwZWU7CiAgdC5pY3lyaWxsaWMgPSAweDA0NTY7CiAgdC5pZGJsZ3JhdmUgPSAweDAyMDk7CiAgdC5pZGVvZ3JhcGhlYXJ0aGNpcmNsZSA9IDB4MzI4ZjsKICB0LmlkZW9ncmFwaGZpcmVjaXJjbGUgPSAweDMyOGI7CiAgdC5pZGVvZ3JhcGhpY2FsbGlhbmNlcGFyZW4gPSAweDMyM2Y7CiAgdC5pZGVvZ3JhcGhpY2NhbGxwYXJlbiA9IDB4MzIzYTsKICB0LmlkZW9ncmFwaGljY2VudHJlY2lyY2xlID0gMHgzMmE1OwogIHQuaWRlb2dyYXBoaWNjbG9zZSA9IDB4MzAwNjsKICB0LmlkZW9ncmFwaGljY29tbWEgPSAweDMwMDE7CiAgdC5pZGVvZ3JhcGhpY2NvbW1hbGVmdCA9IDB4ZmY2NDsKICB0LmlkZW9ncmFwaGljY29uZ3JhdHVsYXRpb25wYXJlbiA9IDB4MzIzNzsKICB0LmlkZW9ncmFwaGljY29ycmVjdGNpcmNsZSA9IDB4MzJhMzsKICB0LmlkZW9ncmFwaGljZWFydGhwYXJlbiA9IDB4MzIyZjsKICB0LmlkZW9ncmFwaGljZW50ZXJwcmlzZXBhcmVuID0gMHgzMjNkOwogIHQuaWRlb2dyYXBoaWNleGNlbGxlbnRjaXJjbGUgPSAweDMyOWQ7CiAgdC5pZGVvZ3JhcGhpY2Zlc3RpdmFscGFyZW4gPSAweDMyNDA7CiAgdC5pZGVvZ3JhcGhpY2ZpbmFuY2lhbGNpcmNsZSA9IDB4MzI5NjsKICB0LmlkZW9ncmFwaGljZmluYW5jaWFscGFyZW4gPSAweDMyMzY7CiAgdC5pZGVvZ3JhcGhpY2ZpcmVwYXJlbiA9IDB4MzIyYjsKICB0LmlkZW9ncmFwaGljaGF2ZXBhcmVuID0gMHgzMjMyOwogIHQuaWRlb2dyYXBoaWNoaWdoY2lyY2xlID0gMHgzMmE0OwogIHQuaWRlb2dyYXBoaWNpdGVyYXRpb25tYXJrID0gMHgzMDA1OwogIHQuaWRlb2dyYXBoaWNsYWJvcmNpcmNsZSA9IDB4MzI5ODsKICB0LmlkZW9ncmFwaGljbGFib3JwYXJlbiA9IDB4MzIzODsKICB0LmlkZW9ncmFwaGljbGVmdGNpcmNsZSA9IDB4MzJhNzsKICB0LmlkZW9ncmFwaGljbG93Y2lyY2xlID0gMHgzMmE2OwogIHQuaWRlb2dyYXBoaWNtZWRpY2luZWNpcmNsZSA9IDB4MzJhOTsKICB0LmlkZW9ncmFwaGljbWV0YWxwYXJlbiA9IDB4MzIyZTsKICB0LmlkZW9ncmFwaGljbW9vbnBhcmVuID0gMHgzMjJhOwogIHQuaWRlb2dyYXBoaWNuYW1lcGFyZW4gPSAweDMyMzQ7CiAgdC5pZGVvZ3JhcGhpY3BlcmlvZCA9IDB4MzAwMjsKICB0LmlkZW9ncmFwaGljcHJpbnRjaXJjbGUgPSAweDMyOWU7CiAgdC5pZGVvZ3JhcGhpY3JlYWNocGFyZW4gPSAweDMyNDM7CiAgdC5pZGVvZ3JhcGhpY3JlcHJlc2VudHBhcmVuID0gMHgzMjM5OwogIHQuaWRlb2dyYXBoaWNyZXNvdXJjZXBhcmVuID0gMHgzMjNlOwogIHQuaWRlb2dyYXBoaWNyaWdodGNpcmNsZSA9IDB4MzJhODsKICB0LmlkZW9ncmFwaGljc2VjcmV0Y2lyY2xlID0gMHgzMjk5OwogIHQuaWRlb2dyYXBoaWNzZWxmcGFyZW4gPSAweDMyNDI7CiAgdC5pZGVvZ3JhcGhpY3NvY2lldHlwYXJlbiA9IDB4MzIzMzsKICB0LmlkZW9ncmFwaGljc3BhY2UgPSAweDMwMDA7CiAgdC5pZGVvZ3JhcGhpY3NwZWNpYWxwYXJlbiA9IDB4MzIzNTsKICB0LmlkZW9ncmFwaGljc3RvY2twYXJlbiA9IDB4MzIzMTsKICB0LmlkZW9ncmFwaGljc3R1ZHlwYXJlbiA9IDB4MzIzYjsKICB0LmlkZW9ncmFwaGljc3VucGFyZW4gPSAweDMyMzA7CiAgdC5pZGVvZ3JhcGhpY3N1cGVydmlzZXBhcmVuID0gMHgzMjNjOwogIHQuaWRlb2dyYXBoaWN3YXRlcnBhcmVuID0gMHgzMjJjOwogIHQuaWRlb2dyYXBoaWN3b29kcGFyZW4gPSAweDMyMmQ7CiAgdC5pZGVvZ3JhcGhpY3plcm8gPSAweDMwMDc7CiAgdC5pZGVvZ3JhcGhtZXRhbGNpcmNsZSA9IDB4MzI4ZTsKICB0LmlkZW9ncmFwaG1vb25jaXJjbGUgPSAweDMyOGE7CiAgdC5pZGVvZ3JhcGhuYW1lY2lyY2xlID0gMHgzMjk0OwogIHQuaWRlb2dyYXBoc3VuY2lyY2xlID0gMHgzMjkwOwogIHQuaWRlb2dyYXBod2F0ZXJjaXJjbGUgPSAweDMyOGM7CiAgdC5pZGVvZ3JhcGh3b29kY2lyY2xlID0gMHgzMjhkOwogIHQuaWRldmEgPSAweDA5MDc7CiAgdC5pZGllcmVzaXMgPSAweDAwZWY7CiAgdC5pZGllcmVzaXNhY3V0ZSA9IDB4MWUyZjsKICB0LmlkaWVyZXNpc2N5cmlsbGljID0gMHgwNGU1OwogIHQuaWRvdGJlbG93ID0gMHgxZWNiOwogIHQuaWVicmV2ZWN5cmlsbGljID0gMHgwNGQ3OwogIHQuaWVjeXJpbGxpYyA9IDB4MDQzNTsKICB0LmlldW5nYWNpcmNsZWtvcmVhbiA9IDB4MzI3NTsKICB0LmlldW5nYXBhcmVua29yZWFuID0gMHgzMjE1OwogIHQuaWV1bmdjaXJjbGVrb3JlYW4gPSAweDMyNjc7CiAgdC5pZXVuZ2tvcmVhbiA9IDB4MzE0NzsKICB0LmlldW5ncGFyZW5rb3JlYW4gPSAweDMyMDc7CiAgdC5pZ3JhdmUgPSAweDAwZWM7CiAgdC5pZ3VqYXJhdGkgPSAweDBhODc7CiAgdC5pZ3VybXVraGkgPSAweDBhMDc7CiAgdC5paGlyYWdhbmEgPSAweDMwNDQ7CiAgdC5paG9va2Fib3ZlID0gMHgxZWM5OwogIHQuaWliZW5nYWxpID0gMHgwOTg4OwogIHQuaWljeXJpbGxpYyA9IDB4MDQzODsKICB0LmlpZGV2YSA9IDB4MDkwODsKICB0LmlpZ3VqYXJhdGkgPSAweDBhODg7CiAgdC5paWd1cm11a2hpID0gMHgwYTA4OwogIHQuaWltYXRyYWd1cm11a2hpID0gMHgwYTQwOwogIHQuaWludmVydGVkYnJldmUgPSAweDAyMGI7CiAgdC5paXNob3J0Y3lyaWxsaWMgPSAweDA0Mzk7CiAgdC5paXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzA7CiAgdC5paXZvd2Vsc2lnbmRldmEgPSAweDA5NDA7CiAgdC5paXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMwOwogIHQuaWogPSAweDAxMzM7CiAgdC5pa2F0YWthbmEgPSAweDMwYTQ7CiAgdC5pa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzI7CiAgdC5pa29yZWFuID0gMHgzMTYzOwogIHQuaWxkZSA9IDB4MDJkYzsKICB0LmlsdXloZWJyZXcgPSAweDA1YWM7CiAgdC5pbWFjcm9uID0gMHgwMTJiOwogIHQuaW1hY3JvbmN5cmlsbGljID0gMHgwNGUzOwogIHQuaW1hZ2VvcmFwcHJveGltYXRlbHllcXVhbCA9IDB4MjI1MzsKICB0LmltYXRyYWd1cm11a2hpID0gMHgwYTNmOwogIHQuaW1vbm9zcGFjZSA9IDB4ZmY0OTsKICB0LmluY3JlbWVudCA9IDB4MjIwNjsKICB0LmluZmluaXR5ID0gMHgyMjFlOwogIHQuaW5pYXJtZW5pYW4gPSAweDA1NmI7CiAgdC5pbnRlZ3JhbCA9IDB4MjIyYjsKICB0LmludGVncmFsYm90dG9tID0gMHgyMzIxOwogIHQuaW50ZWdyYWxidCA9IDB4MjMyMTsKICB0LmludGVncmFsZXggPSAweGY4ZjU7CiAgdC5pbnRlZ3JhbHRvcCA9IDB4MjMyMDsKICB0LmludGVncmFsdHAgPSAweDIzMjA7CiAgdC5pbnRlcnNlY3Rpb24gPSAweDIyMjk7CiAgdC5pbnRpc3F1YXJlID0gMHgzMzA1OwogIHQuaW52YnVsbGV0ID0gMHgyNWQ4OwogIHQuaW52Y2lyY2xlID0gMHgyNWQ5OwogIHQuaW52c21pbGVmYWNlID0gMHgyNjNiOwogIHQuaW9jeXJpbGxpYyA9IDB4MDQ1MTsKICB0LmlvZ29uZWsgPSAweDAxMmY7CiAgdC5pb3RhID0gMHgwM2I5OwogIHQuaW90YWRpZXJlc2lzID0gMHgwM2NhOwogIHQuaW90YWRpZXJlc2lzdG9ub3MgPSAweDAzOTA7CiAgdC5pb3RhbGF0aW4gPSAweDAyNjk7CiAgdC5pb3RhdG9ub3MgPSAweDAzYWY7CiAgdC5pcGFyZW4gPSAweDI0YTQ7CiAgdC5pcmlndXJtdWtoaSA9IDB4MGE3MjsKICB0LmlzbWFsbGhpcmFnYW5hID0gMHgzMDQzOwogIHQuaXNtYWxsa2F0YWthbmEgPSAweDMwYTM7CiAgdC5pc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ODsKICB0Lmlzc2hhcmJlbmdhbGkgPSAweDA5ZmE7CiAgdC5pc3Ryb2tlID0gMHgwMjY4OwogIHQuaXN1cGVyaW9yID0gMHhmNmVkOwogIHQuaXRlcmF0aW9uaGlyYWdhbmEgPSAweDMwOWQ7CiAgdC5pdGVyYXRpb25rYXRha2FuYSA9IDB4MzBmZDsKICB0Lml0aWxkZSA9IDB4MDEyOTsKICB0Lml0aWxkZWJlbG93ID0gMHgxZTJkOwogIHQuaXVib3BvbW9mbyA9IDB4MzEyOTsKICB0Lml1Y3lyaWxsaWMgPSAweDA0NGU7CiAgdC5pdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZjsKICB0Lml2b3dlbHNpZ25kZXZhID0gMHgwOTNmOwogIHQuaXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWJmOwogIHQuaXpoaXRzYWN5cmlsbGljID0gMHgwNDc1OwogIHQuaXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0Nzc7CiAgdC5qID0gMHgwMDZhOwogIHQuamFhcm1lbmlhbiA9IDB4MDU3MTsKICB0LmphYmVuZ2FsaSA9IDB4MDk5YzsKICB0LmphZGV2YSA9IDB4MDkxYzsKICB0LmphZ3VqYXJhdGkgPSAweDBhOWM7CiAgdC5qYWd1cm11a2hpID0gMHgwYTFjOwogIHQuamJvcG9tb2ZvID0gMHgzMTEwOwogIHQuamNhcm9uID0gMHgwMWYwOwogIHQuamNpcmNsZSA9IDB4MjRkOTsKICB0LmpjaXJjdW1mbGV4ID0gMHgwMTM1OwogIHQuamNyb3NzZWR0YWlsID0gMHgwMjlkOwogIHQuamRvdGxlc3NzdHJva2UgPSAweDAyNWY7CiAgdC5qZWN5cmlsbGljID0gMHgwNDU4OwogIHQuamVlbWFyYWJpYyA9IDB4MDYyYzsKICB0LmplZW1maW5hbGFyYWJpYyA9IDB4ZmU5ZTsKICB0LmplZW1pbml0aWFsYXJhYmljID0gMHhmZTlmOwogIHQuamVlbW1lZGlhbGFyYWJpYyA9IDB4ZmVhMDsKICB0LmplaGFyYWJpYyA9IDB4MDY5ODsKICB0LmplaGZpbmFsYXJhYmljID0gMHhmYjhiOwogIHQuamhhYmVuZ2FsaSA9IDB4MDk5ZDsKICB0LmpoYWRldmEgPSAweDA5MWQ7CiAgdC5qaGFndWphcmF0aSA9IDB4MGE5ZDsKICB0LmpoYWd1cm11a2hpID0gMHgwYTFkOwogIHQuamhlaGFybWVuaWFuID0gMHgwNTdiOwogIHQuamlzID0gMHgzMDA0OwogIHQuam1vbm9zcGFjZSA9IDB4ZmY0YTsKICB0LmpwYXJlbiA9IDB4MjRhNTsKICB0LmpzdXBlcmlvciA9IDB4MDJiMjsKICB0LmsgPSAweDAwNmI7CiAgdC5rYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMTsKICB0LmthYmVuZ2FsaSA9IDB4MDk5NTsKICB0LmthY3V0ZSA9IDB4MWUzMTsKICB0LmthY3lyaWxsaWMgPSAweDA0M2E7CiAgdC5rYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDliOwogIHQua2FkZXZhID0gMHgwOTE1OwogIHQua2FmID0gMHgwNWRiOwogIHQua2FmYXJhYmljID0gMHgwNjQzOwogIHQua2FmZGFnZXNoID0gMHhmYjNiOwogIHQua2FmZGFnZXNoaGVicmV3ID0gMHhmYjNiOwogIHQua2FmZmluYWxhcmFiaWMgPSAweGZlZGE7CiAgdC5rYWZoZWJyZXcgPSAweDA1ZGI7CiAgdC5rYWZpbml0aWFsYXJhYmljID0gMHhmZWRiOwogIHQua2FmbWVkaWFsYXJhYmljID0gMHhmZWRjOwogIHQua2FmcmFmZWhlYnJldyA9IDB4ZmI0ZDsKICB0LmthZ3VqYXJhdGkgPSAweDBhOTU7CiAgdC5rYWd1cm11a2hpID0gMHgwYTE1OwogIHQua2FoaXJhZ2FuYSA9IDB4MzA0YjsKICB0LmthaG9va2N5cmlsbGljID0gMHgwNGM0OwogIHQua2FrYXRha2FuYSA9IDB4MzBhYjsKICB0Lmtha2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzY7CiAgdC5rYXBwYSA9IDB4MDNiYTsKICB0LmthcHBhc3ltYm9sZ3JlZWsgPSAweDAzZjA7CiAgdC5rYXB5ZW91bm1pZXVta29yZWFuID0gMHgzMTcxOwogIHQua2FweWVvdW5waGlldXBoa29yZWFuID0gMHgzMTg0OwogIHQua2FweWVvdW5waWV1cGtvcmVhbiA9IDB4MzE3ODsKICB0LmthcHllb3Vuc3NhbmdwaWV1cGtvcmVhbiA9IDB4MzE3OTsKICB0Lmthcm9yaWlzcXVhcmUgPSAweDMzMGQ7CiAgdC5rYXNoaWRhYXV0b2FyYWJpYyA9IDB4MDY0MDsKICB0Lmthc2hpZGFhdXRvbm9zaWRlYmVhcmluZ2FyYWJpYyA9IDB4MDY0MDsKICB0Lmthc21hbGxrYXRha2FuYSA9IDB4MzBmNTsKICB0Lmthc3F1YXJlID0gMHgzMzg0OwogIHQua2FzcmFhcmFiaWMgPSAweDA2NTA7CiAgdC5rYXNyYXRhbmFyYWJpYyA9IDB4MDY0ZDsKICB0Lmthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWY7CiAgdC5rYXRhaGlyYXByb2xvbmdtYXJraGFsZndpZHRoID0gMHhmZjcwOwogIHQua2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNDlkOwogIHQua2JvcG9tb2ZvID0gMHgzMTBlOwogIHQua2NhbHNxdWFyZSA9IDB4MzM4OTsKICB0LmtjYXJvbiA9IDB4MDFlOTsKICB0LmtjZWRpbGxhID0gMHgwMTM3OwogIHQua2NpcmNsZSA9IDB4MjRkYTsKICB0Lmtjb21tYWFjY2VudCA9IDB4MDEzNzsKICB0Lmtkb3RiZWxvdyA9IDB4MWUzMzsKICB0LmtlaGFybWVuaWFuID0gMHgwNTg0OwogIHQua2VoaXJhZ2FuYSA9IDB4MzA1MTsKICB0Lmtla2F0YWthbmEgPSAweDMwYjE7CiAgdC5rZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc5OwogIHQua2VuYXJtZW5pYW4gPSAweDA1NmY7CiAgdC5rZXNtYWxsa2F0YWthbmEgPSAweDMwZjY7CiAgdC5rZ3JlZW5sYW5kaWMgPSAweDAxMzg7CiAgdC5raGFiZW5nYWxpID0gMHgwOTk2OwogIHQua2hhY3lyaWxsaWMgPSAweDA0NDU7CiAgdC5raGFkZXZhID0gMHgwOTE2OwogIHQua2hhZ3VqYXJhdGkgPSAweDBhOTY7CiAgdC5raGFndXJtdWtoaSA9IDB4MGExNjsKICB0LmtoYWhhcmFiaWMgPSAweDA2MmU7CiAgdC5raGFoZmluYWxhcmFiaWMgPSAweGZlYTY7CiAgdC5raGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVhNzsKICB0LmtoYWhtZWRpYWxhcmFiaWMgPSAweGZlYTg7CiAgdC5raGVpY29wdGljID0gMHgwM2U3OwogIHQua2hoYWRldmEgPSAweDA5NTk7CiAgdC5raGhhZ3VybXVraGkgPSAweDBhNTk7CiAgdC5raGlldWtoYWNpcmNsZWtvcmVhbiA9IDB4MzI3ODsKICB0LmtoaWV1a2hhcGFyZW5rb3JlYW4gPSAweDMyMTg7CiAgdC5raGlldWtoY2lyY2xla29yZWFuID0gMHgzMjZhOwogIHQua2hpZXVraGtvcmVhbiA9IDB4MzE0YjsKICB0LmtoaWV1a2hwYXJlbmtvcmVhbiA9IDB4MzIwYTsKICB0Lmtob2toYWl0aGFpID0gMHgwZTAyOwogIHQua2hva2hvbnRoYWkgPSAweDBlMDU7CiAgdC5raG9raHVhdHRoYWkgPSAweDBlMDM7CiAgdC5raG9raHdhaXRoYWkgPSAweDBlMDQ7CiAgdC5raG9tdXR0aGFpID0gMHgwZTViOwogIHQua2hvb2sgPSAweDAxOTk7CiAgdC5raG9yYWtoYW5ndGhhaSA9IDB4MGUwNjsKICB0LmtoenNxdWFyZSA9IDB4MzM5MTsKICB0LmtpaGlyYWdhbmEgPSAweDMwNGQ7CiAgdC5raWthdGFrYW5hID0gMHgzMGFkOwogIHQua2lrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NzsKICB0Lmtpcm9ndXJhbXVzcXVhcmUgPSAweDMzMTU7CiAgdC5raXJvbWVldG9ydXNxdWFyZSA9IDB4MzMxNjsKICB0Lmtpcm9zcXVhcmUgPSAweDMzMTQ7CiAgdC5raXllb2thY2lyY2xla29yZWFuID0gMHgzMjZlOwogIHQua2l5ZW9rYXBhcmVua29yZWFuID0gMHgzMjBlOwogIHQua2l5ZW9rY2lyY2xla29yZWFuID0gMHgzMjYwOwogIHQua2l5ZW9ra29yZWFuID0gMHgzMTMxOwogIHQua2l5ZW9rcGFyZW5rb3JlYW4gPSAweDMyMDA7CiAgdC5raXllb2tzaW9za29yZWFuID0gMHgzMTMzOwogIHQua2plY3lyaWxsaWMgPSAweDA0NWM7CiAgdC5rbGluZWJlbG93ID0gMHgxZTM1OwogIHQua2xzcXVhcmUgPSAweDMzOTg7CiAgdC5rbWN1YmVkc3F1YXJlID0gMHgzM2E2OwogIHQua21vbm9zcGFjZSA9IDB4ZmY0YjsKICB0Lmttc3F1YXJlZHNxdWFyZSA9IDB4MzNhMjsKICB0LmtvaGlyYWdhbmEgPSAweDMwNTM7CiAgdC5rb2htc3F1YXJlID0gMHgzM2MwOwogIHQua29rYWl0aGFpID0gMHgwZTAxOwogIHQua29rYXRha2FuYSA9IDB4MzBiMzsKICB0Lmtva2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2E7CiAgdC5rb29wb3NxdWFyZSA9IDB4MzMxZTsKICB0LmtvcHBhY3lyaWxsaWMgPSAweDA0ODE7CiAgdC5rb3JlYW5zdGFuZGFyZHN5bWJvbCA9IDB4MzI3ZjsKICB0Lmtvcm9uaXNjbWIgPSAweDAzNDM7CiAgdC5rcGFyZW4gPSAweDI0YTY7CiAgdC5rcGFzcXVhcmUgPSAweDMzYWE7CiAgdC5rc2ljeXJpbGxpYyA9IDB4MDQ2ZjsKICB0Lmt0c3F1YXJlID0gMHgzM2NmOwogIHQua3R1cm5lZCA9IDB4MDI5ZTsKICB0Lmt1aGlyYWdhbmEgPSAweDMwNGY7CiAgdC5rdWthdGFrYW5hID0gMHgzMGFmOwogIHQua3VrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ODsKICB0Lmt2c3F1YXJlID0gMHgzM2I4OwogIHQua3dzcXVhcmUgPSAweDMzYmU7CiAgdC5sID0gMHgwMDZjOwogIHQubGFiZW5nYWxpID0gMHgwOWIyOwogIHQubGFjdXRlID0gMHgwMTNhOwogIHQubGFkZXZhID0gMHgwOTMyOwogIHQubGFndWphcmF0aSA9IDB4MGFiMjsKICB0LmxhZ3VybXVraGkgPSAweDBhMzI7CiAgdC5sYWtraGFuZ3lhb3RoYWkgPSAweDBlNDU7CiAgdC5sYW1hbGVmZmluYWxhcmFiaWMgPSAweGZlZmM7CiAgdC5sYW1hbGVmaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmZWY4OwogIHQubGFtYWxlZmhhbXphYWJvdmVpc29sYXRlZGFyYWJpYyA9IDB4ZmVmNzsKICB0LmxhbWFsZWZoYW16YWJlbG93ZmluYWxhcmFiaWMgPSAweGZlZmE7CiAgdC5sYW1hbGVmaGFtemFiZWxvd2lzb2xhdGVkYXJhYmljID0gMHhmZWY5OwogIHQubGFtYWxlZmlzb2xhdGVkYXJhYmljID0gMHhmZWZiOwogIHQubGFtYWxlZm1hZGRhYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmVmNjsKICB0LmxhbWFsZWZtYWRkYWFib3ZlaXNvbGF0ZWRhcmFiaWMgPSAweGZlZjU7CiAgdC5sYW1hcmFiaWMgPSAweDA2NDQ7CiAgdC5sYW1iZGEgPSAweDAzYmI7CiAgdC5sYW1iZGFzdHJva2UgPSAweDAxOWI7CiAgdC5sYW1lZCA9IDB4MDVkYzsKICB0LmxhbWVkZGFnZXNoID0gMHhmYjNjOwogIHQubGFtZWRkYWdlc2hoZWJyZXcgPSAweGZiM2M7CiAgdC5sYW1lZGhlYnJldyA9IDB4MDVkYzsKICB0LmxhbWZpbmFsYXJhYmljID0gMHhmZWRlOwogIHQubGFtaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNjYTsKICB0LmxhbWluaXRpYWxhcmFiaWMgPSAweGZlZGY7CiAgdC5sYW1qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNjOTsKICB0LmxhbWtoYWhpbml0aWFsYXJhYmljID0gMHhmY2NiOwogIHQubGFtbGFtaGVoaXNvbGF0ZWRhcmFiaWMgPSAweGZkZjI7CiAgdC5sYW1tZWRpYWxhcmFiaWMgPSAweGZlZTA7CiAgdC5sYW1tZWVtaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmQ4ODsKICB0LmxhbW1lZW1pbml0aWFsYXJhYmljID0gMHhmY2NjOwogIHQubGFyZ2VjaXJjbGUgPSAweDI1ZWY7CiAgdC5sYmFyID0gMHgwMTlhOwogIHQubGJlbHQgPSAweDAyNmM7CiAgdC5sYm9wb21vZm8gPSAweDMxMGM7CiAgdC5sY2Fyb24gPSAweDAxM2U7CiAgdC5sY2VkaWxsYSA9IDB4MDEzYzsKICB0LmxjaXJjbGUgPSAweDI0ZGI7CiAgdC5sY2lyY3VtZmxleGJlbG93ID0gMHgxZTNkOwogIHQubGNvbW1hYWNjZW50ID0gMHgwMTNjOwogIHQubGRvdCA9IDB4MDE0MDsKICB0Lmxkb3RhY2NlbnQgPSAweDAxNDA7CiAgdC5sZG90YmVsb3cgPSAweDFlMzc7CiAgdC5sZG90YmVsb3dtYWNyb24gPSAweDFlMzk7CiAgdC5sZWZ0YW5nbGVhYm92ZWNtYiA9IDB4MDMxYTsKICB0LmxlZnR0YWNrYmVsb3djbWIgPSAweDAzMTg7CiAgdC5sZXNzID0gMHgwMDNjOwogIHQubGVzc2VxdWFsID0gMHgyMjY0OwogIHQubGVzc2VxdWFsb3JncmVhdGVyID0gMHgyMmRhOwogIHQubGVzc21vbm9zcGFjZSA9IDB4ZmYxYzsKICB0Lmxlc3NvcmVxdWl2YWxlbnQgPSAweDIyNzI7CiAgdC5sZXNzb3JncmVhdGVyID0gMHgyMjc2OwogIHQubGVzc292ZXJlcXVhbCA9IDB4MjI2NjsKICB0Lmxlc3NzbWFsbCA9IDB4ZmU2NDsKICB0LmxlemggPSAweDAyNmU7CiAgdC5sZmJsb2NrID0gMHgyNThjOwogIHQubGhvb2tyZXRyb2ZsZXggPSAweDAyNmQ7CiAgdC5saXJhID0gMHgyMGE0OwogIHQubGl3bmFybWVuaWFuID0gMHgwNTZjOwogIHQubGogPSAweDAxYzk7CiAgdC5samVjeXJpbGxpYyA9IDB4MDQ1OTsKICB0LmxsID0gMHhmNmMwOwogIHQubGxhZGV2YSA9IDB4MDkzMzsKICB0LmxsYWd1amFyYXRpID0gMHgwYWIzOwogIHQubGxpbmViZWxvdyA9IDB4MWUzYjsKICB0LmxsbGFkZXZhID0gMHgwOTM0OwogIHQubGx2b2NhbGljYmVuZ2FsaSA9IDB4MDllMTsKICB0Lmxsdm9jYWxpY2RldmEgPSAweDA5NjE7CiAgdC5sbHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWUzOwogIHQubGx2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk2MzsKICB0LmxtaWRkbGV0aWxkZSA9IDB4MDI2YjsKICB0Lmxtb25vc3BhY2UgPSAweGZmNGM7CiAgdC5sbXNxdWFyZSA9IDB4MzNkMDsKICB0LmxvY2h1bGF0aGFpID0gMHgwZTJjOwogIHQubG9naWNhbGFuZCA9IDB4MjIyNzsKICB0LmxvZ2ljYWxub3QgPSAweDAwYWM7CiAgdC5sb2dpY2Fsbm90cmV2ZXJzZWQgPSAweDIzMTA7CiAgdC5sb2dpY2Fsb3IgPSAweDIyMjg7CiAgdC5sb2xpbmd0aGFpID0gMHgwZTI1OwogIHQubG9uZ3MgPSAweDAxN2Y7CiAgdC5sb3dsaW5lY2VudGVybGluZSA9IDB4ZmU0ZTsKICB0Lmxvd2xpbmVjbWIgPSAweDAzMzI7CiAgdC5sb3dsaW5lZGFzaGVkID0gMHhmZTRkOwogIHQubG96ZW5nZSA9IDB4MjVjYTsKICB0LmxwYXJlbiA9IDB4MjRhNzsKICB0LmxzbGFzaCA9IDB4MDE0MjsKICB0LmxzcXVhcmUgPSAweDIxMTM7CiAgdC5sc3VwZXJpb3IgPSAweGY2ZWU7CiAgdC5sdHNoYWRlID0gMHgyNTkxOwogIHQubHV0aGFpID0gMHgwZTI2OwogIHQubHZvY2FsaWNiZW5nYWxpID0gMHgwOThjOwogIHQubHZvY2FsaWNkZXZhID0gMHgwOTBjOwogIHQubHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWUyOwogIHQubHZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTYyOwogIHQubHhzcXVhcmUgPSAweDMzZDM7CiAgdC5tID0gMHgwMDZkOwogIHQubWFiZW5nYWxpID0gMHgwOWFlOwogIHQubWFjcm9uID0gMHgwMGFmOwogIHQubWFjcm9uYmVsb3djbWIgPSAweDAzMzE7CiAgdC5tYWNyb25jbWIgPSAweDAzMDQ7CiAgdC5tYWNyb25sb3dtb2QgPSAweDAyY2Q7CiAgdC5tYWNyb25tb25vc3BhY2UgPSAweGZmZTM7CiAgdC5tYWN1dGUgPSAweDFlM2Y7CiAgdC5tYWRldmEgPSAweDA5MmU7CiAgdC5tYWd1amFyYXRpID0gMHgwYWFlOwogIHQubWFndXJtdWtoaSA9IDB4MGEyZTsKICB0Lm1haGFwYWtoaGVicmV3ID0gMHgwNWE0OwogIHQubWFoYXBha2hsZWZ0aGVicmV3ID0gMHgwNWE0OwogIHQubWFoaXJhZ2FuYSA9IDB4MzA3ZTsKICB0Lm1haWNoYXR0YXdhbG93bGVmdHRoYWkgPSAweGY4OTU7CiAgdC5tYWljaGF0dGF3YWxvd3JpZ2h0dGhhaSA9IDB4Zjg5NDsKICB0Lm1haWNoYXR0YXdhdGhhaSA9IDB4MGU0YjsKICB0Lm1haWNoYXR0YXdhdXBwZXJsZWZ0dGhhaSA9IDB4Zjg5MzsKICB0Lm1haWVrbG93bGVmdHRoYWkgPSAweGY4OGM7CiAgdC5tYWlla2xvd3JpZ2h0dGhhaSA9IDB4Zjg4YjsKICB0Lm1haWVrdGhhaSA9IDB4MGU0ODsKICB0Lm1haWVrdXBwZXJsZWZ0dGhhaSA9IDB4Zjg4YTsKICB0Lm1haWhhbmFrYXRsZWZ0dGhhaSA9IDB4Zjg4NDsKICB0Lm1haWhhbmFrYXR0aGFpID0gMHgwZTMxOwogIHQubWFpdGFpa2h1bGVmdHRoYWkgPSAweGY4ODk7CiAgdC5tYWl0YWlraHV0aGFpID0gMHgwZTQ3OwogIHQubWFpdGhvbG93bGVmdHRoYWkgPSAweGY4OGY7CiAgdC5tYWl0aG9sb3dyaWdodHRoYWkgPSAweGY4OGU7CiAgdC5tYWl0aG90aGFpID0gMHgwZTQ5OwogIHQubWFpdGhvdXBwZXJsZWZ0dGhhaSA9IDB4Zjg4ZDsKICB0Lm1haXRyaWxvd2xlZnR0aGFpID0gMHhmODkyOwogIHQubWFpdHJpbG93cmlnaHR0aGFpID0gMHhmODkxOwogIHQubWFpdHJpdGhhaSA9IDB4MGU0YTsKICB0Lm1haXRyaXVwcGVybGVmdHRoYWkgPSAweGY4OTA7CiAgdC5tYWl5YW1va3RoYWkgPSAweDBlNDY7CiAgdC5tYWthdGFrYW5hID0gMHgzMGRlOwogIHQubWFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ZjsKICB0Lm1hbGUgPSAweDI2NDI7CiAgdC5tYW5zeW9uc3F1YXJlID0gMHgzMzQ3OwogIHQubWFxYWZoZWJyZXcgPSAweDA1YmU7CiAgdC5tYXJzID0gMHgyNjQyOwogIHQubWFzb3JhY2lyY2xlaGVicmV3ID0gMHgwNWFmOwogIHQubWFzcXVhcmUgPSAweDMzODM7CiAgdC5tYm9wb21vZm8gPSAweDMxMDc7CiAgdC5tYnNxdWFyZSA9IDB4MzNkNDsKICB0Lm1jaXJjbGUgPSAweDI0ZGM7CiAgdC5tY3ViZWRzcXVhcmUgPSAweDMzYTU7CiAgdC5tZG90YWNjZW50ID0gMHgxZTQxOwogIHQubWRvdGJlbG93ID0gMHgxZTQzOwogIHQubWVlbWFyYWJpYyA9IDB4MDY0NTsKICB0Lm1lZW1maW5hbGFyYWJpYyA9IDB4ZmVlMjsKICB0Lm1lZW1pbml0aWFsYXJhYmljID0gMHhmZWUzOwogIHQubWVlbW1lZGlhbGFyYWJpYyA9IDB4ZmVlNDsKICB0Lm1lZW1tZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMTsKICB0Lm1lZW1tZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNDg7CiAgdC5tZWV0b3J1c3F1YXJlID0gMHgzMzRkOwogIHQubWVoaXJhZ2FuYSA9IDB4MzA4MTsKICB0Lm1laXppZXJhc3F1YXJlID0gMHgzMzdlOwogIHQubWVrYXRha2FuYSA9IDB4MzBlMTsKICB0Lm1la2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTI7CiAgdC5tZW0gPSAweDA1ZGU7CiAgdC5tZW1kYWdlc2ggPSAweGZiM2U7CiAgdC5tZW1kYWdlc2hoZWJyZXcgPSAweGZiM2U7CiAgdC5tZW1oZWJyZXcgPSAweDA1ZGU7CiAgdC5tZW5hcm1lbmlhbiA9IDB4MDU3NDsKICB0Lm1lcmtoYWhlYnJldyA9IDB4MDVhNTsKICB0Lm1lcmtoYWtlZnVsYWhlYnJldyA9IDB4MDVhNjsKICB0Lm1lcmtoYWtlZnVsYWxlZnRoZWJyZXcgPSAweDA1YTY7CiAgdC5tZXJraGFsZWZ0aGVicmV3ID0gMHgwNWE1OwogIHQubWhvb2sgPSAweDAyNzE7CiAgdC5taHpzcXVhcmUgPSAweDMzOTI7CiAgdC5taWRkbGVkb3RrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2NTsKICB0Lm1pZGRvdCA9IDB4MDBiNzsKICB0Lm1pZXVtYWNpcmNsZWtvcmVhbiA9IDB4MzI3MjsKICB0Lm1pZXVtYXBhcmVua29yZWFuID0gMHgzMjEyOwogIHQubWlldW1jaXJjbGVrb3JlYW4gPSAweDMyNjQ7CiAgdC5taWV1bWtvcmVhbiA9IDB4MzE0MTsKICB0Lm1pZXVtcGFuc2lvc2tvcmVhbiA9IDB4MzE3MDsKICB0Lm1pZXVtcGFyZW5rb3JlYW4gPSAweDMyMDQ7CiAgdC5taWV1bXBpZXVwa29yZWFuID0gMHgzMTZlOwogIHQubWlldW1zaW9za29yZWFuID0gMHgzMTZmOwogIHQubWloaXJhZ2FuYSA9IDB4MzA3ZjsKICB0Lm1pa2F0YWthbmEgPSAweDMwZGY7CiAgdC5taWthdGFrYW5haGFsZndpZHRoID0gMHhmZjkwOwogIHQubWludXMgPSAweDIyMTI7CiAgdC5taW51c2JlbG93Y21iID0gMHgwMzIwOwogIHQubWludXNjaXJjbGUgPSAweDIyOTY7CiAgdC5taW51c21vZCA9IDB4MDJkNzsKICB0Lm1pbnVzcGx1cyA9IDB4MjIxMzsKICB0Lm1pbnV0ZSA9IDB4MjAzMjsKICB0Lm1pcmliYWFydXNxdWFyZSA9IDB4MzM0YTsKICB0Lm1pcmlzcXVhcmUgPSAweDMzNDk7CiAgdC5tbG9uZ2xlZ3R1cm5lZCA9IDB4MDI3MDsKICB0Lm1sc3F1YXJlID0gMHgzMzk2OwogIHQubW1jdWJlZHNxdWFyZSA9IDB4MzNhMzsKICB0Lm1tb25vc3BhY2UgPSAweGZmNGQ7CiAgdC5tbXNxdWFyZWRzcXVhcmUgPSAweDMzOWY7CiAgdC5tb2hpcmFnYW5hID0gMHgzMDgyOwogIHQubW9obXNxdWFyZSA9IDB4MzNjMTsKICB0Lm1va2F0YWthbmEgPSAweDMwZTI7CiAgdC5tb2thdGFrYW5haGFsZndpZHRoID0gMHhmZjkzOwogIHQubW9sc3F1YXJlID0gMHgzM2Q2OwogIHQubW9tYXRoYWkgPSAweDBlMjE7CiAgdC5tb3ZlcnNzcXVhcmUgPSAweDMzYTc7CiAgdC5tb3ZlcnNzcXVhcmVkc3F1YXJlID0gMHgzM2E4OwogIHQubXBhcmVuID0gMHgyNGE4OwogIHQubXBhc3F1YXJlID0gMHgzM2FiOwogIHQubXNzcXVhcmUgPSAweDMzYjM7CiAgdC5tc3VwZXJpb3IgPSAweGY2ZWY7CiAgdC5tdHVybmVkID0gMHgwMjZmOwogIHQubXUgPSAweDAwYjU7CiAgdC5tdTEgPSAweDAwYjU7CiAgdC5tdWFzcXVhcmUgPSAweDMzODI7CiAgdC5tdWNoZ3JlYXRlciA9IDB4MjI2YjsKICB0Lm11Y2hsZXNzID0gMHgyMjZhOwogIHQubXVmc3F1YXJlID0gMHgzMzhjOwogIHQubXVncmVlayA9IDB4MDNiYzsKICB0Lm11Z3NxdWFyZSA9IDB4MzM4ZDsKICB0Lm11aGlyYWdhbmEgPSAweDMwODA7CiAgdC5tdWthdGFrYW5hID0gMHgzMGUwOwogIHQubXVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5MTsKICB0Lm11bHNxdWFyZSA9IDB4MzM5NTsKICB0Lm11bHRpcGx5ID0gMHgwMGQ3OwogIHQubXVtc3F1YXJlID0gMHgzMzliOwogIHQubXVuYWhoZWJyZXcgPSAweDA1YTM7CiAgdC5tdW5haGxlZnRoZWJyZXcgPSAweDA1YTM7CiAgdC5tdXNpY2Fsbm90ZSA9IDB4MjY2YTsKICB0Lm11c2ljYWxub3RlZGJsID0gMHgyNjZiOwogIHQubXVzaWNmbGF0c2lnbiA9IDB4MjY2ZDsKICB0Lm11c2ljc2hhcnBzaWduID0gMHgyNjZmOwogIHQubXVzc3F1YXJlID0gMHgzM2IyOwogIHQubXV2c3F1YXJlID0gMHgzM2I2OwogIHQubXV3c3F1YXJlID0gMHgzM2JjOwogIHQubXZtZWdhc3F1YXJlID0gMHgzM2I5OwogIHQubXZzcXVhcmUgPSAweDMzYjc7CiAgdC5td21lZ2FzcXVhcmUgPSAweDMzYmY7CiAgdC5td3NxdWFyZSA9IDB4MzNiZDsKICB0Lm4gPSAweDAwNmU7CiAgdC5uYWJlbmdhbGkgPSAweDA5YTg7CiAgdC5uYWJsYSA9IDB4MjIwNzsKICB0Lm5hY3V0ZSA9IDB4MDE0NDsKICB0Lm5hZGV2YSA9IDB4MDkyODsKICB0Lm5hZ3VqYXJhdGkgPSAweDBhYTg7CiAgdC5uYWd1cm11a2hpID0gMHgwYTI4OwogIHQubmFoaXJhZ2FuYSA9IDB4MzA2YTsKICB0Lm5ha2F0YWthbmEgPSAweDMwY2E7CiAgdC5uYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg1OwogIHQubmFwb3N0cm9waGUgPSAweDAxNDk7CiAgdC5uYXNxdWFyZSA9IDB4MzM4MTsKICB0Lm5ib3BvbW9mbyA9IDB4MzEwYjsKICB0Lm5ic3BhY2UgPSAweDAwYTA7CiAgdC5uY2Fyb24gPSAweDAxNDg7CiAgdC5uY2VkaWxsYSA9IDB4MDE0NjsKICB0Lm5jaXJjbGUgPSAweDI0ZGQ7CiAgdC5uY2lyY3VtZmxleGJlbG93ID0gMHgxZTRiOwogIHQubmNvbW1hYWNjZW50ID0gMHgwMTQ2OwogIHQubmRvdGFjY2VudCA9IDB4MWU0NTsKICB0Lm5kb3RiZWxvdyA9IDB4MWU0NzsKICB0Lm5laGlyYWdhbmEgPSAweDMwNmQ7CiAgdC5uZWthdGFrYW5hID0gMHgzMGNkOwogIHQubmVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ODsKICB0Lm5ld3NoZXFlbHNpZ24gPSAweDIwYWE7CiAgdC5uZnNxdWFyZSA9IDB4MzM4YjsKICB0Lm5nYWJlbmdhbGkgPSAweDA5OTk7CiAgdC5uZ2FkZXZhID0gMHgwOTE5OwogIHQubmdhZ3VqYXJhdGkgPSAweDBhOTk7CiAgdC5uZ2FndXJtdWtoaSA9IDB4MGExOTsKICB0Lm5nb25ndXRoYWkgPSAweDBlMDc7CiAgdC5uaGlyYWdhbmEgPSAweDMwOTM7CiAgdC5uaG9va2xlZnQgPSAweDAyNzI7CiAgdC5uaG9va3JldHJvZmxleCA9IDB4MDI3MzsKICB0Lm5pZXVuYWNpcmNsZWtvcmVhbiA9IDB4MzI2ZjsKICB0Lm5pZXVuYXBhcmVua29yZWFuID0gMHgzMjBmOwogIHQubmlldW5jaWV1Y2tvcmVhbiA9IDB4MzEzNTsKICB0Lm5pZXVuY2lyY2xla29yZWFuID0gMHgzMjYxOwogIHQubmlldW5oaWV1aGtvcmVhbiA9IDB4MzEzNjsKICB0Lm5pZXVua29yZWFuID0gMHgzMTM0OwogIHQubmlldW5wYW5zaW9za29yZWFuID0gMHgzMTY4OwogIHQubmlldW5wYXJlbmtvcmVhbiA9IDB4MzIwMTsKICB0Lm5pZXVuc2lvc2tvcmVhbiA9IDB4MzE2NzsKICB0Lm5pZXVudGlrZXV0a29yZWFuID0gMHgzMTY2OwogIHQubmloaXJhZ2FuYSA9IDB4MzA2YjsKICB0Lm5pa2F0YWthbmEgPSAweDMwY2I7CiAgdC5uaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg2OwogIHQubmlraGFoaXRsZWZ0dGhhaSA9IDB4Zjg5OTsKICB0Lm5pa2hhaGl0dGhhaSA9IDB4MGU0ZDsKICB0Lm5pbmUgPSAweDAwMzk7CiAgdC5uaW5lYXJhYmljID0gMHgwNjY5OwogIHQubmluZWJlbmdhbGkgPSAweDA5ZWY7CiAgdC5uaW5lY2lyY2xlID0gMHgyNDY4OwogIHQubmluZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OTI7CiAgdC5uaW5lZGV2YSA9IDB4MDk2ZjsKICB0Lm5pbmVndWphcmF0aSA9IDB4MGFlZjsKICB0Lm5pbmVndXJtdWtoaSA9IDB4MGE2ZjsKICB0Lm5pbmVoYWNrYXJhYmljID0gMHgwNjY5OwogIHQubmluZWhhbmd6aG91ID0gMHgzMDI5OwogIHQubmluZWlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjg7CiAgdC5uaW5laW5mZXJpb3IgPSAweDIwODk7CiAgdC5uaW5lbW9ub3NwYWNlID0gMHhmZjE5OwogIHQubmluZW9sZHN0eWxlID0gMHhmNzM5OwogIHQubmluZXBhcmVuID0gMHgyNDdjOwogIHQubmluZXBlcmlvZCA9IDB4MjQ5MDsKICB0Lm5pbmVwZXJzaWFuID0gMHgwNmY5OwogIHQubmluZXJvbWFuID0gMHgyMTc4OwogIHQubmluZXN1cGVyaW9yID0gMHgyMDc5OwogIHQubmluZXRlZW5jaXJjbGUgPSAweDI0NzI7CiAgdC5uaW5ldGVlbnBhcmVuID0gMHgyNDg2OwogIHQubmluZXRlZW5wZXJpb2QgPSAweDI0OWE7CiAgdC5uaW5ldGhhaSA9IDB4MGU1OTsKICB0Lm5qID0gMHgwMWNjOwogIHQubmplY3lyaWxsaWMgPSAweDA0NWE7CiAgdC5ua2F0YWthbmEgPSAweDMwZjM7CiAgdC5ua2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWQ7CiAgdC5ubGVncmlnaHRsb25nID0gMHgwMTllOwogIHQubmxpbmViZWxvdyA9IDB4MWU0OTsKICB0Lm5tb25vc3BhY2UgPSAweGZmNGU7CiAgdC5ubXNxdWFyZSA9IDB4MzM5YTsKICB0Lm5uYWJlbmdhbGkgPSAweDA5YTM7CiAgdC5ubmFkZXZhID0gMHgwOTIzOwogIHQubm5hZ3VqYXJhdGkgPSAweDBhYTM7CiAgdC5ubmFndXJtdWtoaSA9IDB4MGEyMzsKICB0Lm5ubmFkZXZhID0gMHgwOTI5OwogIHQubm9oaXJhZ2FuYSA9IDB4MzA2ZTsKICB0Lm5va2F0YWthbmEgPSAweDMwY2U7CiAgdC5ub2thdGFrYW5haGFsZndpZHRoID0gMHhmZjg5OwogIHQubm9uYnJlYWtpbmdzcGFjZSA9IDB4MDBhMDsKICB0Lm5vbmVudGhhaSA9IDB4MGUxMzsKICB0Lm5vbnV0aGFpID0gMHgwZTE5OwogIHQubm9vbmFyYWJpYyA9IDB4MDY0NjsKICB0Lm5vb25maW5hbGFyYWJpYyA9IDB4ZmVlNjsKICB0Lm5vb25naHVubmFhcmFiaWMgPSAweDA2YmE7CiAgdC5ub29uZ2h1bm5hZmluYWxhcmFiaWMgPSAweGZiOWY7CiAgdC5ub29uaW5pdGlhbGFyYWJpYyA9IDB4ZmVlNzsKICB0Lm5vb25qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMjsKICB0Lm5vb25qZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNGI7CiAgdC5ub29ubWVkaWFsYXJhYmljID0gMHhmZWU4OwogIHQubm9vbm1lZW1pbml0aWFsYXJhYmljID0gMHhmY2Q1OwogIHQubm9vbm1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM0ZTsKICB0Lm5vb25ub29uZmluYWxhcmFiaWMgPSAweGZjOGQ7CiAgdC5ub3Rjb250YWlucyA9IDB4MjIwYzsKICB0Lm5vdGVsZW1lbnQgPSAweDIyMDk7CiAgdC5ub3RlbGVtZW50b2YgPSAweDIyMDk7CiAgdC5ub3RlcXVhbCA9IDB4MjI2MDsKICB0Lm5vdGdyZWF0ZXIgPSAweDIyNmY7CiAgdC5ub3RncmVhdGVybm9yZXF1YWwgPSAweDIyNzE7CiAgdC5ub3RncmVhdGVybm9ybGVzcyA9IDB4MjI3OTsKICB0Lm5vdGlkZW50aWNhbCA9IDB4MjI2MjsKICB0Lm5vdGxlc3MgPSAweDIyNmU7CiAgdC5ub3RsZXNzbm9yZXF1YWwgPSAweDIyNzA7CiAgdC5ub3RwYXJhbGxlbCA9IDB4MjIyNjsKICB0Lm5vdHByZWNlZGVzID0gMHgyMjgwOwogIHQubm90c3Vic2V0ID0gMHgyMjg0OwogIHQubm90c3VjY2VlZHMgPSAweDIyODE7CiAgdC5ub3RzdXBlcnNldCA9IDB4MjI4NTsKICB0Lm5vd2FybWVuaWFuID0gMHgwNTc2OwogIHQubnBhcmVuID0gMHgyNGE5OwogIHQubnNzcXVhcmUgPSAweDMzYjE7CiAgdC5uc3VwZXJpb3IgPSAweDIwN2Y7CiAgdC5udGlsZGUgPSAweDAwZjE7CiAgdC5udSA9IDB4MDNiZDsKICB0Lm51aGlyYWdhbmEgPSAweDMwNmM7CiAgdC5udWthdGFrYW5hID0gMHgzMGNjOwogIHQubnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NzsKICB0Lm51a3RhYmVuZ2FsaSA9IDB4MDliYzsKICB0Lm51a3RhZGV2YSA9IDB4MDkzYzsKICB0Lm51a3RhZ3VqYXJhdGkgPSAweDBhYmM7CiAgdC5udWt0YWd1cm11a2hpID0gMHgwYTNjOwogIHQubnVtYmVyc2lnbiA9IDB4MDAyMzsKICB0Lm51bWJlcnNpZ25tb25vc3BhY2UgPSAweGZmMDM7CiAgdC5udW1iZXJzaWduc21hbGwgPSAweGZlNWY7CiAgdC5udW1lcmFsc2lnbmdyZWVrID0gMHgwMzc0OwogIHQubnVtZXJhbHNpZ25sb3dlcmdyZWVrID0gMHgwMzc1OwogIHQubnVtZXJvID0gMHgyMTE2OwogIHQubnVuID0gMHgwNWUwOwogIHQubnVuZGFnZXNoID0gMHhmYjQwOwogIHQubnVuZGFnZXNoaGVicmV3ID0gMHhmYjQwOwogIHQubnVuaGVicmV3ID0gMHgwNWUwOwogIHQubnZzcXVhcmUgPSAweDMzYjU7CiAgdC5ud3NxdWFyZSA9IDB4MzNiYjsKICB0Lm55YWJlbmdhbGkgPSAweDA5OWU7CiAgdC5ueWFkZXZhID0gMHgwOTFlOwogIHQubnlhZ3VqYXJhdGkgPSAweDBhOWU7CiAgdC5ueWFndXJtdWtoaSA9IDB4MGExZTsKICB0Lm8gPSAweDAwNmY7CiAgdC5vYWN1dGUgPSAweDAwZjM7CiAgdC5vYW5ndGhhaSA9IDB4MGUyZDsKICB0Lm9iYXJyZWQgPSAweDAyNzU7CiAgdC5vYmFycmVkY3lyaWxsaWMgPSAweDA0ZTk7CiAgdC5vYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYjsKICB0Lm9iZW5nYWxpID0gMHgwOTkzOwogIHQub2JvcG9tb2ZvID0gMHgzMTFiOwogIHQub2JyZXZlID0gMHgwMTRmOwogIHQub2NhbmRyYWRldmEgPSAweDA5MTE7CiAgdC5vY2FuZHJhZ3VqYXJhdGkgPSAweDBhOTE7CiAgdC5vY2FuZHJhdm93ZWxzaWduZGV2YSA9IDB4MDk0OTsKICB0Lm9jYW5kcmF2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjOTsKICB0Lm9jYXJvbiA9IDB4MDFkMjsKICB0Lm9jaXJjbGUgPSAweDI0ZGU7CiAgdC5vY2lyY3VtZmxleCA9IDB4MDBmNDsKICB0Lm9jaXJjdW1mbGV4YWN1dGUgPSAweDFlZDE7CiAgdC5vY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWQ5OwogIHQub2NpcmN1bWZsZXhncmF2ZSA9IDB4MWVkMzsKICB0Lm9jaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWQ1OwogIHQub2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNzsKICB0Lm9jeXJpbGxpYyA9IDB4MDQzZTsKICB0Lm9kYmxhY3V0ZSA9IDB4MDE1MTsKICB0Lm9kYmxncmF2ZSA9IDB4MDIwZDsKICB0Lm9kZXZhID0gMHgwOTEzOwogIHQub2RpZXJlc2lzID0gMHgwMGY2OwogIHQub2RpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTc7CiAgdC5vZG90YmVsb3cgPSAweDFlY2Q7CiAgdC5vZSA9IDB4MDE1MzsKICB0Lm9la29yZWFuID0gMHgzMTVhOwogIHQub2dvbmVrID0gMHgwMmRiOwogIHQub2dvbmVrY21iID0gMHgwMzI4OwogIHQub2dyYXZlID0gMHgwMGYyOwogIHQub2d1amFyYXRpID0gMHgwYTkzOwogIHQub2hhcm1lbmlhbiA9IDB4MDU4NTsKICB0Lm9oaXJhZ2FuYSA9IDB4MzA0YTsKICB0Lm9ob29rYWJvdmUgPSAweDFlY2Y7CiAgdC5vaG9ybiA9IDB4MDFhMTsKICB0Lm9ob3JuYWN1dGUgPSAweDFlZGI7CiAgdC5vaG9ybmRvdGJlbG93ID0gMHgxZWUzOwogIHQub2hvcm5ncmF2ZSA9IDB4MWVkZDsKICB0Lm9ob3JuaG9va2Fib3ZlID0gMHgxZWRmOwogIHQub2hvcm50aWxkZSA9IDB4MWVlMTsKICB0Lm9odW5nYXJ1bWxhdXQgPSAweDAxNTE7CiAgdC5vaSA9IDB4MDFhMzsKICB0Lm9pbnZlcnRlZGJyZXZlID0gMHgwMjBmOwogIHQub2thdGFrYW5hID0gMHgzMGFhOwogIHQub2thdGFrYW5haGFsZndpZHRoID0gMHhmZjc1OwogIHQub2tvcmVhbiA9IDB4MzE1NzsKICB0Lm9sZWhlYnJldyA9IDB4MDVhYjsKICB0Lm9tYWNyb24gPSAweDAxNGQ7CiAgdC5vbWFjcm9uYWN1dGUgPSAweDFlNTM7CiAgdC5vbWFjcm9uZ3JhdmUgPSAweDFlNTE7CiAgdC5vbWRldmEgPSAweDA5NTA7CiAgdC5vbWVnYSA9IDB4MDNjOTsKICB0Lm9tZWdhMSA9IDB4MDNkNjsKICB0Lm9tZWdhY3lyaWxsaWMgPSAweDA0NjE7CiAgdC5vbWVnYWxhdGluY2xvc2VkID0gMHgwMjc3OwogIHQub21lZ2Fyb3VuZGN5cmlsbGljID0gMHgwNDdiOwogIHQub21lZ2F0aXRsb2N5cmlsbGljID0gMHgwNDdkOwogIHQub21lZ2F0b25vcyA9IDB4MDNjZTsKICB0Lm9tZ3VqYXJhdGkgPSAweDBhZDA7CiAgdC5vbWljcm9uID0gMHgwM2JmOwogIHQub21pY3JvbnRvbm9zID0gMHgwM2NjOwogIHQub21vbm9zcGFjZSA9IDB4ZmY0ZjsKICB0Lm9uZSA9IDB4MDAzMTsKICB0Lm9uZWFyYWJpYyA9IDB4MDY2MTsKICB0Lm9uZWJlbmdhbGkgPSAweDA5ZTc7CiAgdC5vbmVjaXJjbGUgPSAweDI0NjA7CiAgdC5vbmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhhOwogIHQub25lZGV2YSA9IDB4MDk2NzsKICB0Lm9uZWRvdGVubGVhZGVyID0gMHgyMDI0OwogIHQub25lZWlnaHRoID0gMHgyMTViOwogIHQub25lZml0dGVkID0gMHhmNmRjOwogIHQub25lZ3VqYXJhdGkgPSAweDBhZTc7CiAgdC5vbmVndXJtdWtoaSA9IDB4MGE2NzsKICB0Lm9uZWhhY2thcmFiaWMgPSAweDA2NjE7CiAgdC5vbmVoYWxmID0gMHgwMGJkOwogIHQub25laGFuZ3pob3UgPSAweDMwMjE7CiAgdC5vbmVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIwOwogIHQub25laW5mZXJpb3IgPSAweDIwODE7CiAgdC5vbmVtb25vc3BhY2UgPSAweGZmMTE7CiAgdC5vbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY0OwogIHQub25lb2xkc3R5bGUgPSAweGY3MzE7CiAgdC5vbmVwYXJlbiA9IDB4MjQ3NDsKICB0Lm9uZXBlcmlvZCA9IDB4MjQ4ODsKICB0Lm9uZXBlcnNpYW4gPSAweDA2ZjE7CiAgdC5vbmVxdWFydGVyID0gMHgwMGJjOwogIHQub25lcm9tYW4gPSAweDIxNzA7CiAgdC5vbmVzdXBlcmlvciA9IDB4MDBiOTsKICB0Lm9uZXRoYWkgPSAweDBlNTE7CiAgdC5vbmV0aGlyZCA9IDB4MjE1MzsKICB0Lm9vZ29uZWsgPSAweDAxZWI7CiAgdC5vb2dvbmVrbWFjcm9uID0gMHgwMWVkOwogIHQub29ndXJtdWtoaSA9IDB4MGExMzsKICB0Lm9vbWF0cmFndXJtdWtoaSA9IDB4MGE0YjsKICB0Lm9vcGVuID0gMHgwMjU0OwogIHQub3BhcmVuID0gMHgyNGFhOwogIHQub3BlbmJ1bGxldCA9IDB4MjVlNjsKICB0Lm9wdGlvbiA9IDB4MjMyNTsKICB0Lm9yZGZlbWluaW5lID0gMHgwMGFhOwogIHQub3JkbWFzY3VsaW5lID0gMHgwMGJhOwogIHQub3J0aG9nb25hbCA9IDB4MjIxZjsKICB0Lm9zaG9ydGRldmEgPSAweDA5MTI7CiAgdC5vc2hvcnR2b3dlbHNpZ25kZXZhID0gMHgwOTRhOwogIHQub3NsYXNoID0gMHgwMGY4OwogIHQub3NsYXNoYWN1dGUgPSAweDAxZmY7CiAgdC5vc21hbGxoaXJhZ2FuYSA9IDB4MzA0OTsKICB0Lm9zbWFsbGthdGFrYW5hID0gMHgzMGE5OwogIHQub3NtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmI7CiAgdC5vc3Ryb2tlYWN1dGUgPSAweDAxZmY7CiAgdC5vc3VwZXJpb3IgPSAweGY2ZjA7CiAgdC5vdGN5cmlsbGljID0gMHgwNDdmOwogIHQub3RpbGRlID0gMHgwMGY1OwogIHQub3RpbGRlYWN1dGUgPSAweDFlNGQ7CiAgdC5vdGlsZGVkaWVyZXNpcyA9IDB4MWU0ZjsKICB0Lm91Ym9wb21vZm8gPSAweDMxMjE7CiAgdC5vdmVybGluZSA9IDB4MjAzZTsKICB0Lm92ZXJsaW5lY2VudGVybGluZSA9IDB4ZmU0YTsKICB0Lm92ZXJsaW5lY21iID0gMHgwMzA1OwogIHQub3ZlcmxpbmVkYXNoZWQgPSAweGZlNDk7CiAgdC5vdmVybGluZWRibHdhdnkgPSAweGZlNGM7CiAgdC5vdmVybGluZXdhdnkgPSAweGZlNGI7CiAgdC5vdmVyc2NvcmUgPSAweDAwYWY7CiAgdC5vdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljYjsKICB0Lm92b3dlbHNpZ25kZXZhID0gMHgwOTRiOwogIHQub3Zvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWNiOwogIHQucCA9IDB4MDA3MDsKICB0LnBhYW1wc3NxdWFyZSA9IDB4MzM4MDsKICB0LnBhYXNlbnRvc3F1YXJlID0gMHgzMzJiOwogIHQucGFiZW5nYWxpID0gMHgwOWFhOwogIHQucGFjdXRlID0gMHgxZTU1OwogIHQucGFkZXZhID0gMHgwOTJhOwogIHQucGFnZWRvd24gPSAweDIxZGY7CiAgdC5wYWdldXAgPSAweDIxZGU7CiAgdC5wYWd1amFyYXRpID0gMHgwYWFhOwogIHQucGFndXJtdWtoaSA9IDB4MGEyYTsKICB0LnBhaGlyYWdhbmEgPSAweDMwNzE7CiAgdC5wYWl5YW5ub2l0aGFpID0gMHgwZTJmOwogIHQucGFrYXRha2FuYSA9IDB4MzBkMTsKICB0LnBhbGF0YWxpemF0aW9uY3lyaWxsaWNjbWIgPSAweDA0ODQ7CiAgdC5wYWxvY2hrYWN5cmlsbGljID0gMHgwNGMwOwogIHQucGFuc2lvc2tvcmVhbiA9IDB4MzE3ZjsKICB0LnBhcmFncmFwaCA9IDB4MDBiNjsKICB0LnBhcmFsbGVsID0gMHgyMjI1OwogIHQucGFyZW5sZWZ0ID0gMHgwMDI4OwogIHQucGFyZW5sZWZ0YWx0b25lYXJhYmljID0gMHhmZDNlOwogIHQucGFyZW5sZWZ0YnQgPSAweGY4ZWQ7CiAgdC5wYXJlbmxlZnRleCA9IDB4ZjhlYzsKICB0LnBhcmVubGVmdGluZmVyaW9yID0gMHgyMDhkOwogIHQucGFyZW5sZWZ0bW9ub3NwYWNlID0gMHhmZjA4OwogIHQucGFyZW5sZWZ0c21hbGwgPSAweGZlNTk7CiAgdC5wYXJlbmxlZnRzdXBlcmlvciA9IDB4MjA3ZDsKICB0LnBhcmVubGVmdHRwID0gMHhmOGViOwogIHQucGFyZW5sZWZ0dmVydGljYWwgPSAweGZlMzU7CiAgdC5wYXJlbnJpZ2h0ID0gMHgwMDI5OwogIHQucGFyZW5yaWdodGFsdG9uZWFyYWJpYyA9IDB4ZmQzZjsKICB0LnBhcmVucmlnaHRidCA9IDB4ZjhmODsKICB0LnBhcmVucmlnaHRleCA9IDB4ZjhmNzsKICB0LnBhcmVucmlnaHRpbmZlcmlvciA9IDB4MjA4ZTsKICB0LnBhcmVucmlnaHRtb25vc3BhY2UgPSAweGZmMDk7CiAgdC5wYXJlbnJpZ2h0c21hbGwgPSAweGZlNWE7CiAgdC5wYXJlbnJpZ2h0c3VwZXJpb3IgPSAweDIwN2U7CiAgdC5wYXJlbnJpZ2h0dHAgPSAweGY4ZjY7CiAgdC5wYXJlbnJpZ2h0dmVydGljYWwgPSAweGZlMzY7CiAgdC5wYXJ0aWFsZGlmZiA9IDB4MjIwMjsKICB0LnBhc2VxaGVicmV3ID0gMHgwNWMwOwogIHQucGFzaHRhaGVicmV3ID0gMHgwNTk5OwogIHQucGFzcXVhcmUgPSAweDMzYTk7CiAgdC5wYXRhaCA9IDB4MDViNzsKICB0LnBhdGFoMTEgPSAweDA1Yjc7CiAgdC5wYXRhaDFkID0gMHgwNWI3OwogIHQucGF0YWgyYSA9IDB4MDViNzsKICB0LnBhdGFoaGVicmV3ID0gMHgwNWI3OwogIHQucGF0YWhuYXJyb3doZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXRhaHF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXRhaHdpZGVoZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXplcmhlYnJldyA9IDB4MDVhMTsKICB0LnBib3BvbW9mbyA9IDB4MzEwNjsKICB0LnBjaXJjbGUgPSAweDI0ZGY7CiAgdC5wZG90YWNjZW50ID0gMHgxZTU3OwogIHQucGUgPSAweDA1ZTQ7CiAgdC5wZWN5cmlsbGljID0gMHgwNDNmOwogIHQucGVkYWdlc2ggPSAweGZiNDQ7CiAgdC5wZWRhZ2VzaGhlYnJldyA9IDB4ZmI0NDsKICB0LnBlZXppc3F1YXJlID0gMHgzMzNiOwogIHQucGVmaW5hbGRhZ2VzaGhlYnJldyA9IDB4ZmI0MzsKICB0LnBlaGFyYWJpYyA9IDB4MDY3ZTsKICB0LnBlaGFybWVuaWFuID0gMHgwNTdhOwogIHQucGVoZWJyZXcgPSAweDA1ZTQ7CiAgdC5wZWhmaW5hbGFyYWJpYyA9IDB4ZmI1NzsKICB0LnBlaGluaXRpYWxhcmFiaWMgPSAweGZiNTg7CiAgdC5wZWhpcmFnYW5hID0gMHgzMDdhOwogIHQucGVobWVkaWFsYXJhYmljID0gMHhmYjU5OwogIHQucGVrYXRha2FuYSA9IDB4MzBkYTsKICB0LnBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE3OwogIHQucGVyYWZlaGVicmV3ID0gMHhmYjRlOwogIHQucGVyY2VudCA9IDB4MDAyNTsKICB0LnBlcmNlbnRhcmFiaWMgPSAweDA2NmE7CiAgdC5wZXJjZW50bW9ub3NwYWNlID0gMHhmZjA1OwogIHQucGVyY2VudHNtYWxsID0gMHhmZTZhOwogIHQucGVyaW9kID0gMHgwMDJlOwogIHQucGVyaW9kYXJtZW5pYW4gPSAweDA1ODk7CiAgdC5wZXJpb2RjZW50ZXJlZCA9IDB4MDBiNzsKICB0LnBlcmlvZGhhbGZ3aWR0aCA9IDB4ZmY2MTsKICB0LnBlcmlvZGluZmVyaW9yID0gMHhmNmU3OwogIHQucGVyaW9kbW9ub3NwYWNlID0gMHhmZjBlOwogIHQucGVyaW9kc21hbGwgPSAweGZlNTI7CiAgdC5wZXJpb2RzdXBlcmlvciA9IDB4ZjZlODsKICB0LnBlcmlzcG9tZW5pZ3JlZWtjbWIgPSAweDAzNDI7CiAgdC5wZXJwZW5kaWN1bGFyID0gMHgyMmE1OwogIHQucGVydGhvdXNhbmQgPSAweDIwMzA7CiAgdC5wZXNldGEgPSAweDIwYTc7CiAgdC5wZnNxdWFyZSA9IDB4MzM4YTsKICB0LnBoYWJlbmdhbGkgPSAweDA5YWI7CiAgdC5waGFkZXZhID0gMHgwOTJiOwogIHQucGhhZ3VqYXJhdGkgPSAweDBhYWI7CiAgdC5waGFndXJtdWtoaSA9IDB4MGEyYjsKICB0LnBoaSA9IDB4MDNjNjsKICB0LnBoaTEgPSAweDAzZDU7CiAgdC5waGlldXBoYWNpcmNsZWtvcmVhbiA9IDB4MzI3YTsKICB0LnBoaWV1cGhhcGFyZW5rb3JlYW4gPSAweDMyMWE7CiAgdC5waGlldXBoY2lyY2xla29yZWFuID0gMHgzMjZjOwogIHQucGhpZXVwaGtvcmVhbiA9IDB4MzE0ZDsKICB0LnBoaWV1cGhwYXJlbmtvcmVhbiA9IDB4MzIwYzsKICB0LnBoaWxhdGluID0gMHgwMjc4OwogIHQucGhpbnRodXRoYWkgPSAweDBlM2E7CiAgdC5waGlzeW1ib2xncmVlayA9IDB4MDNkNTsKICB0LnBob29rID0gMHgwMWE1OwogIHQucGhvcGhhbnRoYWkgPSAweDBlMWU7CiAgdC5waG9waHVuZ3RoYWkgPSAweDBlMWM7CiAgdC5waG9zYW1waGFvdGhhaSA9IDB4MGUyMDsKICB0LnBpID0gMHgwM2MwOwogIHQucGlldXBhY2lyY2xla29yZWFuID0gMHgzMjczOwogIHQucGlldXBhcGFyZW5rb3JlYW4gPSAweDMyMTM7CiAgdC5waWV1cGNpZXVja29yZWFuID0gMHgzMTc2OwogIHQucGlldXBjaXJjbGVrb3JlYW4gPSAweDMyNjU7CiAgdC5waWV1cGtpeWVva2tvcmVhbiA9IDB4MzE3MjsKICB0LnBpZXVwa29yZWFuID0gMHgzMTQyOwogIHQucGlldXBwYXJlbmtvcmVhbiA9IDB4MzIwNTsKICB0LnBpZXVwc2lvc2tpeWVva2tvcmVhbiA9IDB4MzE3NDsKICB0LnBpZXVwc2lvc2tvcmVhbiA9IDB4MzE0NDsKICB0LnBpZXVwc2lvc3Rpa2V1dGtvcmVhbiA9IDB4MzE3NTsKICB0LnBpZXVwdGhpZXV0aGtvcmVhbiA9IDB4MzE3NzsKICB0LnBpZXVwdGlrZXV0a29yZWFuID0gMHgzMTczOwogIHQucGloaXJhZ2FuYSA9IDB4MzA3NDsKICB0LnBpa2F0YWthbmEgPSAweDMwZDQ7CiAgdC5waXN5bWJvbGdyZWVrID0gMHgwM2Q2OwogIHQucGl3cmFybWVuaWFuID0gMHgwNTgzOwogIHQucGxhbmNrb3ZlcjJwaSA9IDB4MjEwZjsKICB0LnBsYW5ja292ZXIycGkxID0gMHgyMTBmOwogIHQucGx1cyA9IDB4MDAyYjsKICB0LnBsdXNiZWxvd2NtYiA9IDB4MDMxZjsKICB0LnBsdXNjaXJjbGUgPSAweDIyOTU7CiAgdC5wbHVzbWludXMgPSAweDAwYjE7CiAgdC5wbHVzbW9kID0gMHgwMmQ2OwogIHQucGx1c21vbm9zcGFjZSA9IDB4ZmYwYjsKICB0LnBsdXNzbWFsbCA9IDB4ZmU2MjsKICB0LnBsdXNzdXBlcmlvciA9IDB4MjA3YTsKICB0LnBtb25vc3BhY2UgPSAweGZmNTA7CiAgdC5wbXNxdWFyZSA9IDB4MzNkODsKICB0LnBvaGlyYWdhbmEgPSAweDMwN2Q7CiAgdC5wb2ludGluZ2luZGV4ZG93bndoaXRlID0gMHgyNjFmOwogIHQucG9pbnRpbmdpbmRleGxlZnR3aGl0ZSA9IDB4MjYxYzsKICB0LnBvaW50aW5naW5kZXhyaWdodHdoaXRlID0gMHgyNjFlOwogIHQucG9pbnRpbmdpbmRleHVwd2hpdGUgPSAweDI2MWQ7CiAgdC5wb2thdGFrYW5hID0gMHgzMGRkOwogIHQucG9wbGF0aGFpID0gMHgwZTFiOwogIHQucG9zdGFsbWFyayA9IDB4MzAxMjsKICB0LnBvc3RhbG1hcmtmYWNlID0gMHgzMDIwOwogIHQucHBhcmVuID0gMHgyNGFiOwogIHQucHJlY2VkZXMgPSAweDIyN2E7CiAgdC5wcmVzY3JpcHRpb24gPSAweDIxMWU7CiAgdC5wcmltZW1vZCA9IDB4MDJiOTsKICB0LnByaW1lcmV2ZXJzZWQgPSAweDIwMzU7CiAgdC5wcm9kdWN0ID0gMHgyMjBmOwogIHQucHJvamVjdGl2ZSA9IDB4MjMwNTsKICB0LnByb2xvbmdlZGthbmEgPSAweDMwZmM7CiAgdC5wcm9wZWxsb3IgPSAweDIzMTg7CiAgdC5wcm9wZXJzdWJzZXQgPSAweDIyODI7CiAgdC5wcm9wZXJzdXBlcnNldCA9IDB4MjI4MzsKICB0LnByb3BvcnRpb24gPSAweDIyMzc7CiAgdC5wcm9wb3J0aW9uYWwgPSAweDIyMWQ7CiAgdC5wc2kgPSAweDAzYzg7CiAgdC5wc2ljeXJpbGxpYyA9IDB4MDQ3MTsKICB0LnBzaWxpcG5ldW1hdGFjeXJpbGxpY2NtYiA9IDB4MDQ4NjsKICB0LnBzc3F1YXJlID0gMHgzM2IwOwogIHQucHVoaXJhZ2FuYSA9IDB4MzA3NzsKICB0LnB1a2F0YWthbmEgPSAweDMwZDc7CiAgdC5wdnNxdWFyZSA9IDB4MzNiNDsKICB0LnB3c3F1YXJlID0gMHgzM2JhOwogIHQucSA9IDB4MDA3MTsKICB0LnFhZGV2YSA9IDB4MDk1ODsKICB0LnFhZG1haGVicmV3ID0gMHgwNWE4OwogIHQucWFmYXJhYmljID0gMHgwNjQyOwogIHQucWFmZmluYWxhcmFiaWMgPSAweGZlZDY7CiAgdC5xYWZpbml0aWFsYXJhYmljID0gMHhmZWQ3OwogIHQucWFmbWVkaWFsYXJhYmljID0gMHhmZWQ4OwogIHQucWFtYXRzID0gMHgwNWI4OwogIHQucWFtYXRzMTAgPSAweDA1Yjg7CiAgdC5xYW1hdHMxYSA9IDB4MDViODsKICB0LnFhbWF0czFjID0gMHgwNWI4OwogIHQucWFtYXRzMjcgPSAweDA1Yjg7CiAgdC5xYW1hdHMyOSA9IDB4MDViODsKICB0LnFhbWF0czMzID0gMHgwNWI4OwogIHQucWFtYXRzZGUgPSAweDA1Yjg7CiAgdC5xYW1hdHNoZWJyZXcgPSAweDA1Yjg7CiAgdC5xYW1hdHNuYXJyb3doZWJyZXcgPSAweDA1Yjg7CiAgdC5xYW1hdHNxYXRhbmhlYnJldyA9IDB4MDViODsKICB0LnFhbWF0c3FhdGFubmFycm93aGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcWF0YW5xdWFydGVyaGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcWF0YW53aWRlaGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcXVhcnRlcmhlYnJldyA9IDB4MDViODsKICB0LnFhbWF0c3dpZGVoZWJyZXcgPSAweDA1Yjg7CiAgdC5xYXJuZXlwYXJhaGVicmV3ID0gMHgwNTlmOwogIHQucWJvcG9tb2ZvID0gMHgzMTExOwogIHQucWNpcmNsZSA9IDB4MjRlMDsKICB0LnFob29rID0gMHgwMmEwOwogIHQucW1vbm9zcGFjZSA9IDB4ZmY1MTsKICB0LnFvZiA9IDB4MDVlNzsKICB0LnFvZmRhZ2VzaCA9IDB4ZmI0NzsKICB0LnFvZmRhZ2VzaGhlYnJldyA9IDB4ZmI0NzsKICB0LnFvZmhlYnJldyA9IDB4MDVlNzsKICB0LnFwYXJlbiA9IDB4MjRhYzsKICB0LnF1YXJ0ZXJub3RlID0gMHgyNjY5OwogIHQucXVidXRzID0gMHgwNWJiOwogIHQucXVidXRzMTggPSAweDA1YmI7CiAgdC5xdWJ1dHMyNSA9IDB4MDViYjsKICB0LnF1YnV0czMxID0gMHgwNWJiOwogIHQucXVidXRzaGVicmV3ID0gMHgwNWJiOwogIHQucXVidXRzbmFycm93aGVicmV3ID0gMHgwNWJiOwogIHQucXVidXRzcXVhcnRlcmhlYnJldyA9IDB4MDViYjsKICB0LnF1YnV0c3dpZGVoZWJyZXcgPSAweDA1YmI7CiAgdC5xdWVzdGlvbiA9IDB4MDAzZjsKICB0LnF1ZXN0aW9uYXJhYmljID0gMHgwNjFmOwogIHQucXVlc3Rpb25hcm1lbmlhbiA9IDB4MDU1ZTsKICB0LnF1ZXN0aW9uZG93biA9IDB4MDBiZjsKICB0LnF1ZXN0aW9uZG93bnNtYWxsID0gMHhmN2JmOwogIHQucXVlc3Rpb25ncmVlayA9IDB4MDM3ZTsKICB0LnF1ZXN0aW9ubW9ub3NwYWNlID0gMHhmZjFmOwogIHQucXVlc3Rpb25zbWFsbCA9IDB4ZjczZjsKICB0LnF1b3RlZGJsID0gMHgwMDIyOwogIHQucXVvdGVkYmxiYXNlID0gMHgyMDFlOwogIHQucXVvdGVkYmxsZWZ0ID0gMHgyMDFjOwogIHQucXVvdGVkYmxtb25vc3BhY2UgPSAweGZmMDI7CiAgdC5xdW90ZWRibHByaW1lID0gMHgzMDFlOwogIHQucXVvdGVkYmxwcmltZXJldmVyc2VkID0gMHgzMDFkOwogIHQucXVvdGVkYmxyaWdodCA9IDB4MjAxZDsKICB0LnF1b3RlbGVmdCA9IDB4MjAxODsKICB0LnF1b3RlbGVmdHJldmVyc2VkID0gMHgyMDFiOwogIHQucXVvdGVyZXZlcnNlZCA9IDB4MjAxYjsKICB0LnF1b3RlcmlnaHQgPSAweDIwMTk7CiAgdC5xdW90ZXJpZ2h0biA9IDB4MDE0OTsKICB0LnF1b3Rlc2luZ2xiYXNlID0gMHgyMDFhOwogIHQucXVvdGVzaW5nbGUgPSAweDAwMjc7CiAgdC5xdW90ZXNpbmdsZW1vbm9zcGFjZSA9IDB4ZmYwNzsKICB0LnIgPSAweDAwNzI7CiAgdC5yYWFybWVuaWFuID0gMHgwNTdjOwogIHQucmFiZW5nYWxpID0gMHgwOWIwOwogIHQucmFjdXRlID0gMHgwMTU1OwogIHQucmFkZXZhID0gMHgwOTMwOwogIHQucmFkaWNhbCA9IDB4MjIxYTsKICB0LnJhZGljYWxleCA9IDB4ZjhlNTsKICB0LnJhZG92ZXJzc3F1YXJlID0gMHgzM2FlOwogIHQucmFkb3ZlcnNzcXVhcmVkc3F1YXJlID0gMHgzM2FmOwogIHQucmFkc3F1YXJlID0gMHgzM2FkOwogIHQucmFmZSA9IDB4MDViZjsKICB0LnJhZmVoZWJyZXcgPSAweDA1YmY7CiAgdC5yYWd1amFyYXRpID0gMHgwYWIwOwogIHQucmFndXJtdWtoaSA9IDB4MGEzMDsKICB0LnJhaGlyYWdhbmEgPSAweDMwODk7CiAgdC5yYWthdGFrYW5hID0gMHgzMGU5OwogIHQucmFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NzsKICB0LnJhbG93ZXJkaWFnb25hbGJlbmdhbGkgPSAweDA5ZjE7CiAgdC5yYW1pZGRsZWRpYWdvbmFsYmVuZ2FsaSA9IDB4MDlmMDsKICB0LnJhbXNob3JuID0gMHgwMjY0OwogIHQucmF0aW8gPSAweDIyMzY7CiAgdC5yYm9wb21vZm8gPSAweDMxMTY7CiAgdC5yY2Fyb24gPSAweDAxNTk7CiAgdC5yY2VkaWxsYSA9IDB4MDE1NzsKICB0LnJjaXJjbGUgPSAweDI0ZTE7CiAgdC5yY29tbWFhY2NlbnQgPSAweDAxNTc7CiAgdC5yZGJsZ3JhdmUgPSAweDAyMTE7CiAgdC5yZG90YWNjZW50ID0gMHgxZTU5OwogIHQucmRvdGJlbG93ID0gMHgxZTViOwogIHQucmRvdGJlbG93bWFjcm9uID0gMHgxZTVkOwogIHQucmVmZXJlbmNlbWFyayA9IDB4MjAzYjsKICB0LnJlZmxleHN1YnNldCA9IDB4MjI4NjsKICB0LnJlZmxleHN1cGVyc2V0ID0gMHgyMjg3OwogIHQucmVnaXN0ZXJlZCA9IDB4MDBhZTsKICB0LnJlZ2lzdGVyc2FucyA9IDB4ZjhlODsKICB0LnJlZ2lzdGVyc2VyaWYgPSAweGY2ZGE7CiAgdC5yZWhhcmFiaWMgPSAweDA2MzE7CiAgdC5yZWhhcm1lbmlhbiA9IDB4MDU4MDsKICB0LnJlaGZpbmFsYXJhYmljID0gMHhmZWFlOwogIHQucmVoaXJhZ2FuYSA9IDB4MzA4YzsKICB0LnJla2F0YWthbmEgPSAweDMwZWM7CiAgdC5yZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjlhOwogIHQucmVzaCA9IDB4MDVlODsKICB0LnJlc2hkYWdlc2hoZWJyZXcgPSAweGZiNDg7CiAgdC5yZXNoaGVicmV3ID0gMHgwNWU4OwogIHQucmV2ZXJzZWR0aWxkZSA9IDB4MjIzZDsKICB0LnJldmlhaGVicmV3ID0gMHgwNTk3OwogIHQucmV2aWFtdWdyYXNoaGVicmV3ID0gMHgwNTk3OwogIHQucmV2bG9naWNhbG5vdCA9IDB4MjMxMDsKICB0LnJmaXNoaG9vayA9IDB4MDI3ZTsKICB0LnJmaXNoaG9va3JldmVyc2VkID0gMHgwMjdmOwogIHQucmhhYmVuZ2FsaSA9IDB4MDlkZDsKICB0LnJoYWRldmEgPSAweDA5NWQ7CiAgdC5yaG8gPSAweDAzYzE7CiAgdC5yaG9vayA9IDB4MDI3ZDsKICB0LnJob29rdHVybmVkID0gMHgwMjdiOwogIHQucmhvb2t0dXJuZWRzdXBlcmlvciA9IDB4MDJiNTsKICB0LnJob3N5bWJvbGdyZWVrID0gMHgwM2YxOwogIHQucmhvdGljaG9va21vZCA9IDB4MDJkZTsKICB0LnJpZXVsYWNpcmNsZWtvcmVhbiA9IDB4MzI3MTsKICB0LnJpZXVsYXBhcmVua29yZWFuID0gMHgzMjExOwogIHQucmlldWxjaXJjbGVrb3JlYW4gPSAweDMyNjM7CiAgdC5yaWV1bGhpZXVoa29yZWFuID0gMHgzMTQwOwogIHQucmlldWxraXllb2trb3JlYW4gPSAweDMxM2E7CiAgdC5yaWV1bGtpeWVva3Npb3Nrb3JlYW4gPSAweDMxNjk7CiAgdC5yaWV1bGtvcmVhbiA9IDB4MzEzOTsKICB0LnJpZXVsbWlldW1rb3JlYW4gPSAweDMxM2I7CiAgdC5yaWV1bHBhbnNpb3Nrb3JlYW4gPSAweDMxNmM7CiAgdC5yaWV1bHBhcmVua29yZWFuID0gMHgzMjAzOwogIHQucmlldWxwaGlldXBoa29yZWFuID0gMHgzMTNmOwogIHQucmlldWxwaWV1cGtvcmVhbiA9IDB4MzEzYzsKICB0LnJpZXVscGlldXBzaW9za29yZWFuID0gMHgzMTZiOwogIHQucmlldWxzaW9za29yZWFuID0gMHgzMTNkOwogIHQucmlldWx0aGlldXRoa29yZWFuID0gMHgzMTNlOwogIHQucmlldWx0aWtldXRrb3JlYW4gPSAweDMxNmE7CiAgdC5yaWV1bHllb3JpbmhpZXVoa29yZWFuID0gMHgzMTZkOwogIHQucmlnaHRhbmdsZSA9IDB4MjIxZjsKICB0LnJpZ2h0dGFja2JlbG93Y21iID0gMHgwMzE5OwogIHQucmlnaHR0cmlhbmdsZSA9IDB4MjJiZjsKICB0LnJpaGlyYWdhbmEgPSAweDMwOGE7CiAgdC5yaWthdGFrYW5hID0gMHgzMGVhOwogIHQucmlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5ODsKICB0LnJpbmcgPSAweDAyZGE7CiAgdC5yaW5nYmVsb3djbWIgPSAweDAzMjU7CiAgdC5yaW5nY21iID0gMHgwMzBhOwogIHQucmluZ2hhbGZsZWZ0ID0gMHgwMmJmOwogIHQucmluZ2hhbGZsZWZ0YXJtZW5pYW4gPSAweDA1NTk7CiAgdC5yaW5naGFsZmxlZnRiZWxvd2NtYiA9IDB4MDMxYzsKICB0LnJpbmdoYWxmbGVmdGNlbnRlcmVkID0gMHgwMmQzOwogIHQucmluZ2hhbGZyaWdodCA9IDB4MDJiZTsKICB0LnJpbmdoYWxmcmlnaHRiZWxvd2NtYiA9IDB4MDMzOTsKICB0LnJpbmdoYWxmcmlnaHRjZW50ZXJlZCA9IDB4MDJkMjsKICB0LnJpbnZlcnRlZGJyZXZlID0gMHgwMjEzOwogIHQucml0dG9ydXNxdWFyZSA9IDB4MzM1MTsKICB0LnJsaW5lYmVsb3cgPSAweDFlNWY7CiAgdC5ybG9uZ2xlZyA9IDB4MDI3YzsKICB0LnJsb25nbGVndHVybmVkID0gMHgwMjdhOwogIHQucm1vbm9zcGFjZSA9IDB4ZmY1MjsKICB0LnJvaGlyYWdhbmEgPSAweDMwOGQ7CiAgdC5yb2thdGFrYW5hID0gMHgzMGVkOwogIHQucm9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YjsKICB0LnJvcnVhdGhhaSA9IDB4MGUyMzsKICB0LnJwYXJlbiA9IDB4MjRhZDsKICB0LnJyYWJlbmdhbGkgPSAweDA5ZGM7CiAgdC5ycmFkZXZhID0gMHgwOTMxOwogIHQucnJhZ3VybXVraGkgPSAweDBhNWM7CiAgdC5ycmVoYXJhYmljID0gMHgwNjkxOwogIHQucnJlaGZpbmFsYXJhYmljID0gMHhmYjhkOwogIHQucnJ2b2NhbGljYmVuZ2FsaSA9IDB4MDllMDsKICB0LnJydm9jYWxpY2RldmEgPSAweDA5NjA7CiAgdC5ycnZvY2FsaWNndWphcmF0aSA9IDB4MGFlMDsKICB0LnJydm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzQ7CiAgdC5ycnZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTQ0OwogIHQucnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzQ7CiAgdC5yc3VwZXJpb3IgPSAweGY2ZjE7CiAgdC5ydGJsb2NrID0gMHgyNTkwOwogIHQucnR1cm5lZCA9IDB4MDI3OTsKICB0LnJ0dXJuZWRzdXBlcmlvciA9IDB4MDJiNDsKICB0LnJ1aGlyYWdhbmEgPSAweDMwOGI7CiAgdC5ydWthdGFrYW5hID0gMHgzMGViOwogIHQucnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5OTsKICB0LnJ1cGVlbWFya2JlbmdhbGkgPSAweDA5ZjI7CiAgdC5ydXBlZXNpZ25iZW5nYWxpID0gMHgwOWYzOwogIHQucnVwaWFoID0gMHhmNmRkOwogIHQucnV0aGFpID0gMHgwZTI0OwogIHQucnZvY2FsaWNiZW5nYWxpID0gMHgwOThiOwogIHQucnZvY2FsaWNkZXZhID0gMHgwOTBiOwogIHQucnZvY2FsaWNndWphcmF0aSA9IDB4MGE4YjsKICB0LnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMzsKICB0LnJ2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk0MzsKICB0LnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzM7CiAgdC5zID0gMHgwMDczOwogIHQuc2FiZW5nYWxpID0gMHgwOWI4OwogIHQuc2FjdXRlID0gMHgwMTViOwogIHQuc2FjdXRlZG90YWNjZW50ID0gMHgxZTY1OwogIHQuc2FkYXJhYmljID0gMHgwNjM1OwogIHQuc2FkZXZhID0gMHgwOTM4OwogIHQuc2FkZmluYWxhcmFiaWMgPSAweGZlYmE7CiAgdC5zYWRpbml0aWFsYXJhYmljID0gMHhmZWJiOwogIHQuc2FkbWVkaWFsYXJhYmljID0gMHhmZWJjOwogIHQuc2FndWphcmF0aSA9IDB4MGFiODsKICB0LnNhZ3VybXVraGkgPSAweDBhMzg7CiAgdC5zYWhpcmFnYW5hID0gMHgzMDU1OwogIHQuc2FrYXRha2FuYSA9IDB4MzBiNTsKICB0LnNha2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2I7CiAgdC5zYWxsYWxsYWhvdWFsYXloZXdhc2FsbGFtYXJhYmljID0gMHhmZGZhOwogIHQuc2FtZWtoID0gMHgwNWUxOwogIHQuc2FtZWtoZGFnZXNoID0gMHhmYjQxOwogIHQuc2FtZWtoZGFnZXNoaGVicmV3ID0gMHhmYjQxOwogIHQuc2FtZWtoaGVicmV3ID0gMHgwNWUxOwogIHQuc2FyYWFhdGhhaSA9IDB4MGUzMjsKICB0LnNhcmFhZXRoYWkgPSAweDBlNDE7CiAgdC5zYXJhYWltYWltYWxhaXRoYWkgPSAweDBlNDQ7CiAgdC5zYXJhYWltYWltdWFudGhhaSA9IDB4MGU0MzsKICB0LnNhcmFhbXRoYWkgPSAweDBlMzM7CiAgdC5zYXJhYXRoYWkgPSAweDBlMzA7CiAgdC5zYXJhZXRoYWkgPSAweDBlNDA7CiAgdC5zYXJhaWlsZWZ0dGhhaSA9IDB4Zjg4NjsKICB0LnNhcmFpaXRoYWkgPSAweDBlMzU7CiAgdC5zYXJhaWxlZnR0aGFpID0gMHhmODg1OwogIHQuc2FyYWl0aGFpID0gMHgwZTM0OwogIHQuc2FyYW90aGFpID0gMHgwZTQyOwogIHQuc2FyYXVlZWxlZnR0aGFpID0gMHhmODg4OwogIHQuc2FyYXVlZXRoYWkgPSAweDBlMzc7CiAgdC5zYXJhdWVsZWZ0dGhhaSA9IDB4Zjg4NzsKICB0LnNhcmF1ZXRoYWkgPSAweDBlMzY7CiAgdC5zYXJhdXRoYWkgPSAweDBlMzg7CiAgdC5zYXJhdXV0aGFpID0gMHgwZTM5OwogIHQuc2JvcG9tb2ZvID0gMHgzMTE5OwogIHQuc2Nhcm9uID0gMHgwMTYxOwogIHQuc2Nhcm9uZG90YWNjZW50ID0gMHgxZTY3OwogIHQuc2NlZGlsbGEgPSAweDAxNWY7CiAgdC5zY2h3YSA9IDB4MDI1OTsKICB0LnNjaHdhY3lyaWxsaWMgPSAweDA0ZDk7CiAgdC5zY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGI7CiAgdC5zY2h3YWhvb2sgPSAweDAyNWE7CiAgdC5zY2lyY2xlID0gMHgyNGUyOwogIHQuc2NpcmN1bWZsZXggPSAweDAxNWQ7CiAgdC5zY29tbWFhY2NlbnQgPSAweDAyMTk7CiAgdC5zZG90YWNjZW50ID0gMHgxZTYxOwogIHQuc2RvdGJlbG93ID0gMHgxZTYzOwogIHQuc2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY5OwogIHQuc2VhZ3VsbGJlbG93Y21iID0gMHgwMzNjOwogIHQuc2Vjb25kID0gMHgyMDMzOwogIHQuc2Vjb25kdG9uZWNoaW5lc2UgPSAweDAyY2E7CiAgdC5zZWN0aW9uID0gMHgwMGE3OwogIHQuc2VlbmFyYWJpYyA9IDB4MDYzMzsKICB0LnNlZW5maW5hbGFyYWJpYyA9IDB4ZmViMjsKICB0LnNlZW5pbml0aWFsYXJhYmljID0gMHhmZWIzOwogIHQuc2Vlbm1lZGlhbGFyYWJpYyA9IDB4ZmViNDsKICB0LnNlZ29sID0gMHgwNWI2OwogIHQuc2Vnb2wxMyA9IDB4MDViNjsKICB0LnNlZ29sMWYgPSAweDA1YjY7CiAgdC5zZWdvbDJjID0gMHgwNWI2OwogIHQuc2Vnb2xoZWJyZXcgPSAweDA1YjY7CiAgdC5zZWdvbG5hcnJvd2hlYnJldyA9IDB4MDViNjsKICB0LnNlZ29scXVhcnRlcmhlYnJldyA9IDB4MDViNjsKICB0LnNlZ29sdGFoZWJyZXcgPSAweDA1OTI7CiAgdC5zZWdvbHdpZGVoZWJyZXcgPSAweDA1YjY7CiAgdC5zZWhhcm1lbmlhbiA9IDB4MDU3ZDsKICB0LnNlaGlyYWdhbmEgPSAweDMwNWI7CiAgdC5zZWthdGFrYW5hID0gMHgzMGJiOwogIHQuc2VrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZTsKICB0LnNlbWljb2xvbiA9IDB4MDAzYjsKICB0LnNlbWljb2xvbmFyYWJpYyA9IDB4MDYxYjsKICB0LnNlbWljb2xvbm1vbm9zcGFjZSA9IDB4ZmYxYjsKICB0LnNlbWljb2xvbnNtYWxsID0gMHhmZTU0OwogIHQuc2VtaXZvaWNlZG1hcmtrYW5hID0gMHgzMDljOwogIHQuc2VtaXZvaWNlZG1hcmtrYW5haGFsZndpZHRoID0gMHhmZjlmOwogIHQuc2VudGlzcXVhcmUgPSAweDMzMjI7CiAgdC5zZW50b3NxdWFyZSA9IDB4MzMyMzsKICB0LnNldmVuID0gMHgwMDM3OwogIHQuc2V2ZW5hcmFiaWMgPSAweDA2Njc7CiAgdC5zZXZlbmJlbmdhbGkgPSAweDA5ZWQ7CiAgdC5zZXZlbmNpcmNsZSA9IDB4MjQ2NjsKICB0LnNldmVuY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MDsKICB0LnNldmVuZGV2YSA9IDB4MDk2ZDsKICB0LnNldmVuZWlnaHRocyA9IDB4MjE1ZTsKICB0LnNldmVuZ3VqYXJhdGkgPSAweDBhZWQ7CiAgdC5zZXZlbmd1cm11a2hpID0gMHgwYTZkOwogIHQuc2V2ZW5oYWNrYXJhYmljID0gMHgwNjY3OwogIHQuc2V2ZW5oYW5nemhvdSA9IDB4MzAyNzsKICB0LnNldmVuaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNjsKICB0LnNldmVuaW5mZXJpb3IgPSAweDIwODc7CiAgdC5zZXZlbm1vbm9zcGFjZSA9IDB4ZmYxNzsKICB0LnNldmVub2xkc3R5bGUgPSAweGY3Mzc7CiAgdC5zZXZlbnBhcmVuID0gMHgyNDdhOwogIHQuc2V2ZW5wZXJpb2QgPSAweDI0OGU7CiAgdC5zZXZlbnBlcnNpYW4gPSAweDA2Zjc7CiAgdC5zZXZlbnJvbWFuID0gMHgyMTc2OwogIHQuc2V2ZW5zdXBlcmlvciA9IDB4MjA3NzsKICB0LnNldmVudGVlbmNpcmNsZSA9IDB4MjQ3MDsKICB0LnNldmVudGVlbnBhcmVuID0gMHgyNDg0OwogIHQuc2V2ZW50ZWVucGVyaW9kID0gMHgyNDk4OwogIHQuc2V2ZW50aGFpID0gMHgwZTU3OwogIHQuc2Z0aHlwaGVuID0gMHgwMGFkOwogIHQuc2hhYXJtZW5pYW4gPSAweDA1Nzc7CiAgdC5zaGFiZW5nYWxpID0gMHgwOWI2OwogIHQuc2hhY3lyaWxsaWMgPSAweDA0NDg7CiAgdC5zaGFkZGFhcmFiaWMgPSAweDA2NTE7CiAgdC5zaGFkZGFkYW1tYWFyYWJpYyA9IDB4ZmM2MTsKICB0LnNoYWRkYWRhbW1hdGFuYXJhYmljID0gMHhmYzVlOwogIHQuc2hhZGRhZmF0aGFhcmFiaWMgPSAweGZjNjA7CiAgdC5zaGFkZGFrYXNyYWFyYWJpYyA9IDB4ZmM2MjsKICB0LnNoYWRkYWthc3JhdGFuYXJhYmljID0gMHhmYzVmOwogIHQuc2hhZGUgPSAweDI1OTI7CiAgdC5zaGFkZWRhcmsgPSAweDI1OTM7CiAgdC5zaGFkZWxpZ2h0ID0gMHgyNTkxOwogIHQuc2hhZGVtZWRpdW0gPSAweDI1OTI7CiAgdC5zaGFkZXZhID0gMHgwOTM2OwogIHQuc2hhZ3VqYXJhdGkgPSAweDBhYjY7CiAgdC5zaGFndXJtdWtoaSA9IDB4MGEzNjsKICB0LnNoYWxzaGVsZXRoZWJyZXcgPSAweDA1OTM7CiAgdC5zaGJvcG9tb2ZvID0gMHgzMTE1OwogIHQuc2hjaGFjeXJpbGxpYyA9IDB4MDQ0OTsKICB0LnNoZWVuYXJhYmljID0gMHgwNjM0OwogIHQuc2hlZW5maW5hbGFyYWJpYyA9IDB4ZmViNjsKICB0LnNoZWVuaW5pdGlhbGFyYWJpYyA9IDB4ZmViNzsKICB0LnNoZWVubWVkaWFsYXJhYmljID0gMHhmZWI4OwogIHQuc2hlaWNvcHRpYyA9IDB4MDNlMzsKICB0LnNoZXFlbCA9IDB4MjBhYTsKICB0LnNoZXFlbGhlYnJldyA9IDB4MjBhYTsKICB0LnNoZXZhID0gMHgwNWIwOwogIHQuc2hldmExMTUgPSAweDA1YjA7CiAgdC5zaGV2YTE1ID0gMHgwNWIwOwogIHQuc2hldmEyMiA9IDB4MDViMDsKICB0LnNoZXZhMmUgPSAweDA1YjA7CiAgdC5zaGV2YWhlYnJldyA9IDB4MDViMDsKICB0LnNoZXZhbmFycm93aGVicmV3ID0gMHgwNWIwOwogIHQuc2hldmFxdWFydGVyaGVicmV3ID0gMHgwNWIwOwogIHQuc2hldmF3aWRlaGVicmV3ID0gMHgwNWIwOwogIHQuc2hoYWN5cmlsbGljID0gMHgwNGJiOwogIHQuc2hpbWFjb3B0aWMgPSAweDAzZWQ7CiAgdC5zaGluID0gMHgwNWU5OwogIHQuc2hpbmRhZ2VzaCA9IDB4ZmI0OTsKICB0LnNoaW5kYWdlc2hoZWJyZXcgPSAweGZiNDk7CiAgdC5zaGluZGFnZXNoc2hpbmRvdCA9IDB4ZmIyYzsKICB0LnNoaW5kYWdlc2hzaGluZG90aGVicmV3ID0gMHhmYjJjOwogIHQuc2hpbmRhZ2VzaHNpbmRvdCA9IDB4ZmIyZDsKICB0LnNoaW5kYWdlc2hzaW5kb3RoZWJyZXcgPSAweGZiMmQ7CiAgdC5zaGluZG90aGVicmV3ID0gMHgwNWMxOwogIHQuc2hpbmhlYnJldyA9IDB4MDVlOTsKICB0LnNoaW5zaGluZG90ID0gMHhmYjJhOwogIHQuc2hpbnNoaW5kb3RoZWJyZXcgPSAweGZiMmE7CiAgdC5zaGluc2luZG90ID0gMHhmYjJiOwogIHQuc2hpbnNpbmRvdGhlYnJldyA9IDB4ZmIyYjsKICB0LnNob29rID0gMHgwMjgyOwogIHQuc2lnbWEgPSAweDAzYzM7CiAgdC5zaWdtYTEgPSAweDAzYzI7CiAgdC5zaWdtYWZpbmFsID0gMHgwM2MyOwogIHQuc2lnbWFsdW5hdGVzeW1ib2xncmVlayA9IDB4MDNmMjsKICB0LnNpaGlyYWdhbmEgPSAweDMwNTc7CiAgdC5zaWthdGFrYW5hID0gMHgzMGI3OwogIHQuc2lrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YzsKICB0LnNpbHVxaGVicmV3ID0gMHgwNWJkOwogIHQuc2lsdXFsZWZ0aGVicmV3ID0gMHgwNWJkOwogIHQuc2ltaWxhciA9IDB4MjIzYzsKICB0LnNpbmRvdGhlYnJldyA9IDB4MDVjMjsKICB0LnNpb3NhY2lyY2xla29yZWFuID0gMHgzMjc0OwogIHQuc2lvc2FwYXJlbmtvcmVhbiA9IDB4MzIxNDsKICB0LnNpb3NjaWV1Y2tvcmVhbiA9IDB4MzE3ZTsKICB0LnNpb3NjaXJjbGVrb3JlYW4gPSAweDMyNjY7CiAgdC5zaW9za2l5ZW9ra29yZWFuID0gMHgzMTdhOwogIHQuc2lvc2tvcmVhbiA9IDB4MzE0NTsKICB0LnNpb3NuaWV1bmtvcmVhbiA9IDB4MzE3YjsKICB0LnNpb3NwYXJlbmtvcmVhbiA9IDB4MzIwNjsKICB0LnNpb3NwaWV1cGtvcmVhbiA9IDB4MzE3ZDsKICB0LnNpb3N0aWtldXRrb3JlYW4gPSAweDMxN2M7CiAgdC5zaXggPSAweDAwMzY7CiAgdC5zaXhhcmFiaWMgPSAweDA2NjY7CiAgdC5zaXhiZW5nYWxpID0gMHgwOWVjOwogIHQuc2l4Y2lyY2xlID0gMHgyNDY1OwogIHQuc2l4Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4ZjsKICB0LnNpeGRldmEgPSAweDA5NmM7CiAgdC5zaXhndWphcmF0aSA9IDB4MGFlYzsKICB0LnNpeGd1cm11a2hpID0gMHgwYTZjOwogIHQuc2l4aGFja2FyYWJpYyA9IDB4MDY2NjsKICB0LnNpeGhhbmd6aG91ID0gMHgzMDI2OwogIHQuc2l4aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNTsKICB0LnNpeGluZmVyaW9yID0gMHgyMDg2OwogIHQuc2l4bW9ub3NwYWNlID0gMHhmZjE2OwogIHQuc2l4b2xkc3R5bGUgPSAweGY3MzY7CiAgdC5zaXhwYXJlbiA9IDB4MjQ3OTsKICB0LnNpeHBlcmlvZCA9IDB4MjQ4ZDsKICB0LnNpeHBlcnNpYW4gPSAweDA2ZjY7CiAgdC5zaXhyb21hbiA9IDB4MjE3NTsKICB0LnNpeHN1cGVyaW9yID0gMHgyMDc2OwogIHQuc2l4dGVlbmNpcmNsZSA9IDB4MjQ2ZjsKICB0LnNpeHRlZW5jdXJyZW5jeWRlbm9taW5hdG9yYmVuZ2FsaSA9IDB4MDlmOTsKICB0LnNpeHRlZW5wYXJlbiA9IDB4MjQ4MzsKICB0LnNpeHRlZW5wZXJpb2QgPSAweDI0OTc7CiAgdC5zaXh0aGFpID0gMHgwZTU2OwogIHQuc2xhc2ggPSAweDAwMmY7CiAgdC5zbGFzaG1vbm9zcGFjZSA9IDB4ZmYwZjsKICB0LnNsb25nID0gMHgwMTdmOwogIHQuc2xvbmdkb3RhY2NlbnQgPSAweDFlOWI7CiAgdC5zbWlsZWZhY2UgPSAweDI2M2E7CiAgdC5zbW9ub3NwYWNlID0gMHhmZjUzOwogIHQuc29mcGFzdXFoZWJyZXcgPSAweDA1YzM7CiAgdC5zb2Z0aHlwaGVuID0gMHgwMGFkOwogIHQuc29mdHNpZ25jeXJpbGxpYyA9IDB4MDQ0YzsKICB0LnNvaGlyYWdhbmEgPSAweDMwNWQ7CiAgdC5zb2thdGFrYW5hID0gMHgzMGJkOwogIHQuc29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZjsKICB0LnNvbGlkdXNsb25nb3ZlcmxheWNtYiA9IDB4MDMzODsKICB0LnNvbGlkdXNzaG9ydG92ZXJsYXljbWIgPSAweDAzMzc7CiAgdC5zb3J1c2l0aGFpID0gMHgwZTI5OwogIHQuc29zYWxhdGhhaSA9IDB4MGUyODsKICB0LnNvc290aGFpID0gMHgwZTBiOwogIHQuc29zdWF0aGFpID0gMHgwZTJhOwogIHQuc3BhY2UgPSAweDAwMjA7CiAgdC5zcGFjZWhhY2thcmFiaWMgPSAweDAwMjA7CiAgdC5zcGFkZSA9IDB4MjY2MDsKICB0LnNwYWRlc3VpdGJsYWNrID0gMHgyNjYwOwogIHQuc3BhZGVzdWl0d2hpdGUgPSAweDI2NjQ7CiAgdC5zcGFyZW4gPSAweDI0YWU7CiAgdC5zcXVhcmViZWxvd2NtYiA9IDB4MDMzYjsKICB0LnNxdWFyZWNjID0gMHgzM2M0OwogIHQuc3F1YXJlY20gPSAweDMzOWQ7CiAgdC5zcXVhcmVkaWFnb25hbGNyb3NzaGF0Y2hmaWxsID0gMHgyNWE5OwogIHQuc3F1YXJlaG9yaXpvbnRhbGZpbGwgPSAweDI1YTQ7CiAgdC5zcXVhcmVrZyA9IDB4MzM4ZjsKICB0LnNxdWFyZWttID0gMHgzMzllOwogIHQuc3F1YXJla21jYXBpdGFsID0gMHgzM2NlOwogIHQuc3F1YXJlbG4gPSAweDMzZDE7CiAgdC5zcXVhcmVsb2cgPSAweDMzZDI7CiAgdC5zcXVhcmVtZyA9IDB4MzM4ZTsKICB0LnNxdWFyZW1pbCA9IDB4MzNkNTsKICB0LnNxdWFyZW1tID0gMHgzMzljOwogIHQuc3F1YXJlbXNxdWFyZWQgPSAweDMzYTE7CiAgdC5zcXVhcmVvcnRob2dvbmFsY3Jvc3NoYXRjaGZpbGwgPSAweDI1YTY7CiAgdC5zcXVhcmV1cHBlcmxlZnR0b2xvd2VycmlnaHRmaWxsID0gMHgyNWE3OwogIHQuc3F1YXJldXBwZXJyaWdodHRvbG93ZXJsZWZ0ZmlsbCA9IDB4MjVhODsKICB0LnNxdWFyZXZlcnRpY2FsZmlsbCA9IDB4MjVhNTsKICB0LnNxdWFyZXdoaXRld2l0aHNtYWxsYmxhY2sgPSAweDI1YTM7CiAgdC5zcnNxdWFyZSA9IDB4MzNkYjsKICB0LnNzYWJlbmdhbGkgPSAweDA5Yjc7CiAgdC5zc2FkZXZhID0gMHgwOTM3OwogIHQuc3NhZ3VqYXJhdGkgPSAweDBhYjc7CiAgdC5zc2FuZ2NpZXVja29yZWFuID0gMHgzMTQ5OwogIHQuc3NhbmdoaWV1aGtvcmVhbiA9IDB4MzE4NTsKICB0LnNzYW5naWV1bmdrb3JlYW4gPSAweDMxODA7CiAgdC5zc2FuZ2tpeWVva2tvcmVhbiA9IDB4MzEzMjsKICB0LnNzYW5nbmlldW5rb3JlYW4gPSAweDMxNjU7CiAgdC5zc2FuZ3BpZXVwa29yZWFuID0gMHgzMTQzOwogIHQuc3NhbmdzaW9za29yZWFuID0gMHgzMTQ2OwogIHQuc3Nhbmd0aWtldXRrb3JlYW4gPSAweDMxMzg7CiAgdC5zc3VwZXJpb3IgPSAweGY2ZjI7CiAgdC5zdGVybGluZyA9IDB4MDBhMzsKICB0LnN0ZXJsaW5nbW9ub3NwYWNlID0gMHhmZmUxOwogIHQuc3Ryb2tlbG9uZ292ZXJsYXljbWIgPSAweDAzMzY7CiAgdC5zdHJva2VzaG9ydG92ZXJsYXljbWIgPSAweDAzMzU7CiAgdC5zdWJzZXQgPSAweDIyODI7CiAgdC5zdWJzZXRub3RlcXVhbCA9IDB4MjI4YTsKICB0LnN1YnNldG9yZXF1YWwgPSAweDIyODY7CiAgdC5zdWNjZWVkcyA9IDB4MjI3YjsKICB0LnN1Y2h0aGF0ID0gMHgyMjBiOwogIHQuc3VoaXJhZ2FuYSA9IDB4MzA1OTsKICB0LnN1a2F0YWthbmEgPSAweDMwYjk7CiAgdC5zdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjdkOwogIHQuc3VrdW5hcmFiaWMgPSAweDA2NTI7CiAgdC5zdW1tYXRpb24gPSAweDIyMTE7CiAgdC5zdW4gPSAweDI2M2M7CiAgdC5zdXBlcnNldCA9IDB4MjI4MzsKICB0LnN1cGVyc2V0bm90ZXF1YWwgPSAweDIyOGI7CiAgdC5zdXBlcnNldG9yZXF1YWwgPSAweDIyODc7CiAgdC5zdnNxdWFyZSA9IDB4MzNkYzsKICB0LnN5b3V3YWVyYXNxdWFyZSA9IDB4MzM3YzsKICB0LnQgPSAweDAwNzQ7CiAgdC50YWJlbmdhbGkgPSAweDA5YTQ7CiAgdC50YWNrZG93biA9IDB4MjJhNDsKICB0LnRhY2tsZWZ0ID0gMHgyMmEzOwogIHQudGFkZXZhID0gMHgwOTI0OwogIHQudGFndWphcmF0aSA9IDB4MGFhNDsKICB0LnRhZ3VybXVraGkgPSAweDBhMjQ7CiAgdC50YWhhcmFiaWMgPSAweDA2Mzc7CiAgdC50YWhmaW5hbGFyYWJpYyA9IDB4ZmVjMjsKICB0LnRhaGluaXRpYWxhcmFiaWMgPSAweGZlYzM7CiAgdC50YWhpcmFnYW5hID0gMHgzMDVmOwogIHQudGFobWVkaWFsYXJhYmljID0gMHhmZWM0OwogIHQudGFpc3lvdWVyYXNxdWFyZSA9IDB4MzM3ZDsKICB0LnRha2F0YWthbmEgPSAweDMwYmY7CiAgdC50YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgwOwogIHQudGF0d2VlbGFyYWJpYyA9IDB4MDY0MDsKICB0LnRhdSA9IDB4MDNjNDsKICB0LnRhdiA9IDB4MDVlYTsKICB0LnRhdmRhZ2VzID0gMHhmYjRhOwogIHQudGF2ZGFnZXNoID0gMHhmYjRhOwogIHQudGF2ZGFnZXNoaGVicmV3ID0gMHhmYjRhOwogIHQudGF2aGVicmV3ID0gMHgwNWVhOwogIHQudGJhciA9IDB4MDE2NzsKICB0LnRib3BvbW9mbyA9IDB4MzEwYTsKICB0LnRjYXJvbiA9IDB4MDE2NTsKICB0LnRjY3VybCA9IDB4MDJhODsKICB0LnRjZWRpbGxhID0gMHgwMTYzOwogIHQudGNoZWhhcmFiaWMgPSAweDA2ODY7CiAgdC50Y2hlaGZpbmFsYXJhYmljID0gMHhmYjdiOwogIHQudGNoZWhpbml0aWFsYXJhYmljID0gMHhmYjdjOwogIHQudGNoZWhtZWRpYWxhcmFiaWMgPSAweGZiN2Q7CiAgdC50Y2lyY2xlID0gMHgyNGUzOwogIHQudGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MTsKICB0LnRjb21tYWFjY2VudCA9IDB4MDE2MzsKICB0LnRkaWVyZXNpcyA9IDB4MWU5NzsKICB0LnRkb3RhY2NlbnQgPSAweDFlNmI7CiAgdC50ZG90YmVsb3cgPSAweDFlNmQ7CiAgdC50ZWN5cmlsbGljID0gMHgwNDQyOwogIHQudGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhZDsKICB0LnRlaGFyYWJpYyA9IDB4MDYyYTsKICB0LnRlaGZpbmFsYXJhYmljID0gMHhmZTk2OwogIHQudGVoaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNhMjsKICB0LnRlaGhhaGlzb2xhdGVkYXJhYmljID0gMHhmYzBjOwogIHQudGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5NzsKICB0LnRlaGlyYWdhbmEgPSAweDMwNjY7CiAgdC50ZWhqZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNhMTsKICB0LnRlaGplZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwYjsKICB0LnRlaG1hcmJ1dGFhcmFiaWMgPSAweDA2Mjk7CiAgdC50ZWhtYXJidXRhZmluYWxhcmFiaWMgPSAweGZlOTQ7CiAgdC50ZWhtZWRpYWxhcmFiaWMgPSAweGZlOTg7CiAgdC50ZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNhNDsKICB0LnRlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwZTsKICB0LnRlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM3MzsKICB0LnRla2F0YWthbmEgPSAweDMwYzY7CiAgdC50ZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgzOwogIHQudGVsZXBob25lID0gMHgyMTIxOwogIHQudGVsZXBob25lYmxhY2sgPSAweDI2MGU7CiAgdC50ZWxpc2hhZ2Vkb2xhaGVicmV3ID0gMHgwNWEwOwogIHQudGVsaXNoYXFldGFuYWhlYnJldyA9IDB4MDVhOTsKICB0LnRlbmNpcmNsZSA9IDB4MjQ2OTsKICB0LnRlbmlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjk7CiAgdC50ZW5wYXJlbiA9IDB4MjQ3ZDsKICB0LnRlbnBlcmlvZCA9IDB4MjQ5MTsKICB0LnRlbnJvbWFuID0gMHgyMTc5OwogIHQudGVzaCA9IDB4MDJhNzsKICB0LnRldCA9IDB4MDVkODsKICB0LnRldGRhZ2VzaCA9IDB4ZmIzODsKICB0LnRldGRhZ2VzaGhlYnJldyA9IDB4ZmIzODsKICB0LnRldGhlYnJldyA9IDB4MDVkODsKICB0LnRldHNlY3lyaWxsaWMgPSAweDA0YjU7CiAgdC50ZXZpcmhlYnJldyA9IDB4MDU5YjsKICB0LnRldmlybGVmdGhlYnJldyA9IDB4MDU5YjsKICB0LnRoYWJlbmdhbGkgPSAweDA5YTU7CiAgdC50aGFkZXZhID0gMHgwOTI1OwogIHQudGhhZ3VqYXJhdGkgPSAweDBhYTU7CiAgdC50aGFndXJtdWtoaSA9IDB4MGEyNTsKICB0LnRoYWxhcmFiaWMgPSAweDA2MzA7CiAgdC50aGFsZmluYWxhcmFiaWMgPSAweGZlYWM7CiAgdC50aGFudGhha2hhdGxvd2xlZnR0aGFpID0gMHhmODk4OwogIHQudGhhbnRoYWtoYXRsb3dyaWdodHRoYWkgPSAweGY4OTc7CiAgdC50aGFudGhha2hhdHRoYWkgPSAweDBlNGM7CiAgdC50aGFudGhha2hhdHVwcGVybGVmdHRoYWkgPSAweGY4OTY7CiAgdC50aGVoYXJhYmljID0gMHgwNjJiOwogIHQudGhlaGZpbmFsYXJhYmljID0gMHhmZTlhOwogIHQudGhlaGluaXRpYWxhcmFiaWMgPSAweGZlOWI7CiAgdC50aGVobWVkaWFsYXJhYmljID0gMHhmZTljOwogIHQudGhlcmVleGlzdHMgPSAweDIyMDM7CiAgdC50aGVyZWZvcmUgPSAweDIyMzQ7CiAgdC50aGV0YSA9IDB4MDNiODsKICB0LnRoZXRhMSA9IDB4MDNkMTsKICB0LnRoZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDE7CiAgdC50aGlldXRoYWNpcmNsZWtvcmVhbiA9IDB4MzI3OTsKICB0LnRoaWV1dGhhcGFyZW5rb3JlYW4gPSAweDMyMTk7CiAgdC50aGlldXRoY2lyY2xla29yZWFuID0gMHgzMjZiOwogIHQudGhpZXV0aGtvcmVhbiA9IDB4MzE0YzsKICB0LnRoaWV1dGhwYXJlbmtvcmVhbiA9IDB4MzIwYjsKICB0LnRoaXJ0ZWVuY2lyY2xlID0gMHgyNDZjOwogIHQudGhpcnRlZW5wYXJlbiA9IDB4MjQ4MDsKICB0LnRoaXJ0ZWVucGVyaW9kID0gMHgyNDk0OwogIHQudGhvbmFuZ21vbnRob3RoYWkgPSAweDBlMTE7CiAgdC50aG9vayA9IDB4MDFhZDsKICB0LnRob3BodXRoYW90aGFpID0gMHgwZTEyOwogIHQudGhvcm4gPSAweDAwZmU7CiAgdC50aG90aGFoYW50aGFpID0gMHgwZTE3OwogIHQudGhvdGhhbnRoYWkgPSAweDBlMTA7CiAgdC50aG90aG9uZ3RoYWkgPSAweDBlMTg7CiAgdC50aG90aHVuZ3RoYWkgPSAweDBlMTY7CiAgdC50aG91c2FuZGN5cmlsbGljID0gMHgwNDgyOwogIHQudGhvdXNhbmRzc2VwYXJhdG9yYXJhYmljID0gMHgwNjZjOwogIHQudGhvdXNhbmRzc2VwYXJhdG9ycGVyc2lhbiA9IDB4MDY2YzsKICB0LnRocmVlID0gMHgwMDMzOwogIHQudGhyZWVhcmFiaWMgPSAweDA2NjM7CiAgdC50aHJlZWJlbmdhbGkgPSAweDA5ZTk7CiAgdC50aHJlZWNpcmNsZSA9IDB4MjQ2MjsKICB0LnRocmVlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4YzsKICB0LnRocmVlZGV2YSA9IDB4MDk2OTsKICB0LnRocmVlZWlnaHRocyA9IDB4MjE1YzsKICB0LnRocmVlZ3VqYXJhdGkgPSAweDBhZTk7CiAgdC50aHJlZWd1cm11a2hpID0gMHgwYTY5OwogIHQudGhyZWVoYWNrYXJhYmljID0gMHgwNjYzOwogIHQudGhyZWVoYW5nemhvdSA9IDB4MzAyMzsKICB0LnRocmVlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMjsKICB0LnRocmVlaW5mZXJpb3IgPSAweDIwODM7CiAgdC50aHJlZW1vbm9zcGFjZSA9IDB4ZmYxMzsKICB0LnRocmVlbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNjsKICB0LnRocmVlb2xkc3R5bGUgPSAweGY3MzM7CiAgdC50aHJlZXBhcmVuID0gMHgyNDc2OwogIHQudGhyZWVwZXJpb2QgPSAweDI0OGE7CiAgdC50aHJlZXBlcnNpYW4gPSAweDA2ZjM7CiAgdC50aHJlZXF1YXJ0ZXJzID0gMHgwMGJlOwogIHQudGhyZWVxdWFydGVyc2VtZGFzaCA9IDB4ZjZkZTsKICB0LnRocmVlcm9tYW4gPSAweDIxNzI7CiAgdC50aHJlZXN1cGVyaW9yID0gMHgwMGIzOwogIHQudGhyZWV0aGFpID0gMHgwZTUzOwogIHQudGh6c3F1YXJlID0gMHgzMzk0OwogIHQudGloaXJhZ2FuYSA9IDB4MzA2MTsKICB0LnRpa2F0YWthbmEgPSAweDMwYzE7CiAgdC50aWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgxOwogIHQudGlrZXV0YWNpcmNsZWtvcmVhbiA9IDB4MzI3MDsKICB0LnRpa2V1dGFwYXJlbmtvcmVhbiA9IDB4MzIxMDsKICB0LnRpa2V1dGNpcmNsZWtvcmVhbiA9IDB4MzI2MjsKICB0LnRpa2V1dGtvcmVhbiA9IDB4MzEzNzsKICB0LnRpa2V1dHBhcmVua29yZWFuID0gMHgzMjAyOwogIHQudGlsZGUgPSAweDAyZGM7CiAgdC50aWxkZWJlbG93Y21iID0gMHgwMzMwOwogIHQudGlsZGVjbWIgPSAweDAzMDM7CiAgdC50aWxkZWNvbWIgPSAweDAzMDM7CiAgdC50aWxkZWRvdWJsZWNtYiA9IDB4MDM2MDsKICB0LnRpbGRlb3BlcmF0b3IgPSAweDIyM2M7CiAgdC50aWxkZW92ZXJsYXljbWIgPSAweDAzMzQ7CiAgdC50aWxkZXZlcnRpY2FsY21iID0gMHgwMzNlOwogIHQudGltZXNjaXJjbGUgPSAweDIyOTc7CiAgdC50aXBlaGFoZWJyZXcgPSAweDA1OTY7CiAgdC50aXBlaGFsZWZ0aGVicmV3ID0gMHgwNTk2OwogIHQudGlwcGlndXJtdWtoaSA9IDB4MGE3MDsKICB0LnRpdGxvY3lyaWxsaWNjbWIgPSAweDA0ODM7CiAgdC50aXduYXJtZW5pYW4gPSAweDA1N2Y7CiAgdC50bGluZWJlbG93ID0gMHgxZTZmOwogIHQudG1vbm9zcGFjZSA9IDB4ZmY1NDsKICB0LnRvYXJtZW5pYW4gPSAweDA1Njk7CiAgdC50b2hpcmFnYW5hID0gMHgzMDY4OwogIHQudG9rYXRha2FuYSA9IDB4MzBjODsKICB0LnRva2F0YWthbmFoYWxmd2lkdGggPSAweGZmODQ7CiAgdC50b25lYmFyZXh0cmFoaWdobW9kID0gMHgwMmU1OwogIHQudG9uZWJhcmV4dHJhbG93bW9kID0gMHgwMmU5OwogIHQudG9uZWJhcmhpZ2htb2QgPSAweDAyZTY7CiAgdC50b25lYmFybG93bW9kID0gMHgwMmU4OwogIHQudG9uZWJhcm1pZG1vZCA9IDB4MDJlNzsKICB0LnRvbmVmaXZlID0gMHgwMWJkOwogIHQudG9uZXNpeCA9IDB4MDE4NTsKICB0LnRvbmV0d28gPSAweDAxYTg7CiAgdC50b25vcyA9IDB4MDM4NDsKICB0LnRvbnNxdWFyZSA9IDB4MzMyNzsKICB0LnRvcGF0YWt0aGFpID0gMHgwZTBmOwogIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0ID0gMHgzMDE0OwogIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0c21hbGwgPSAweGZlNWQ7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzOTsKICB0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQgPSAweDMwMTU7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0c21hbGwgPSAweGZlNWU7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2E7CiAgdC50b3Rhb3RoYWkgPSAweDBlMTU7CiAgdC50cGFsYXRhbGhvb2sgPSAweDAxYWI7CiAgdC50cGFyZW4gPSAweDI0YWY7CiAgdC50cmFkZW1hcmsgPSAweDIxMjI7CiAgdC50cmFkZW1hcmtzYW5zID0gMHhmOGVhOwogIHQudHJhZGVtYXJrc2VyaWYgPSAweGY2ZGI7CiAgdC50cmV0cm9mbGV4aG9vayA9IDB4MDI4ODsKICB0LnRyaWFnZG4gPSAweDI1YmM7CiAgdC50cmlhZ2xmID0gMHgyNWM0OwogIHQudHJpYWdydCA9IDB4MjViYTsKICB0LnRyaWFndXAgPSAweDI1YjI7CiAgdC50cyA9IDB4MDJhNjsKICB0LnRzYWRpID0gMHgwNWU2OwogIHQudHNhZGlkYWdlc2ggPSAweGZiNDY7CiAgdC50c2FkaWRhZ2VzaGhlYnJldyA9IDB4ZmI0NjsKICB0LnRzYWRpaGVicmV3ID0gMHgwNWU2OwogIHQudHNlY3lyaWxsaWMgPSAweDA0NDY7CiAgdC50c2VyZSA9IDB4MDViNTsKICB0LnRzZXJlMTIgPSAweDA1YjU7CiAgdC50c2VyZTFlID0gMHgwNWI1OwogIHQudHNlcmUyYiA9IDB4MDViNTsKICB0LnRzZXJlaGVicmV3ID0gMHgwNWI1OwogIHQudHNlcmVuYXJyb3doZWJyZXcgPSAweDA1YjU7CiAgdC50c2VyZXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjU7CiAgdC50c2VyZXdpZGVoZWJyZXcgPSAweDA1YjU7CiAgdC50c2hlY3lyaWxsaWMgPSAweDA0NWI7CiAgdC50c3VwZXJpb3IgPSAweGY2ZjM7CiAgdC50dGFiZW5nYWxpID0gMHgwOTlmOwogIHQudHRhZGV2YSA9IDB4MDkxZjsKICB0LnR0YWd1amFyYXRpID0gMHgwYTlmOwogIHQudHRhZ3VybXVraGkgPSAweDBhMWY7CiAgdC50dGVoYXJhYmljID0gMHgwNjc5OwogIHQudHRlaGZpbmFsYXJhYmljID0gMHhmYjY3OwogIHQudHRlaGluaXRpYWxhcmFiaWMgPSAweGZiNjg7CiAgdC50dGVobWVkaWFsYXJhYmljID0gMHhmYjY5OwogIHQudHRoYWJlbmdhbGkgPSAweDA5YTA7CiAgdC50dGhhZGV2YSA9IDB4MDkyMDsKICB0LnR0aGFndWphcmF0aSA9IDB4MGFhMDsKICB0LnR0aGFndXJtdWtoaSA9IDB4MGEyMDsKICB0LnR0dXJuZWQgPSAweDAyODc7CiAgdC50dWhpcmFnYW5hID0gMHgzMDY0OwogIHQudHVrYXRha2FuYSA9IDB4MzBjNDsKICB0LnR1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmODI7CiAgdC50dXNtYWxsaGlyYWdhbmEgPSAweDMwNjM7CiAgdC50dXNtYWxsa2F0YWthbmEgPSAweDMwYzM7CiAgdC50dXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmY7CiAgdC50d2VsdmVjaXJjbGUgPSAweDI0NmI7CiAgdC50d2VsdmVwYXJlbiA9IDB4MjQ3ZjsKICB0LnR3ZWx2ZXBlcmlvZCA9IDB4MjQ5MzsKICB0LnR3ZWx2ZXJvbWFuID0gMHgyMTdiOwogIHQudHdlbnR5Y2lyY2xlID0gMHgyNDczOwogIHQudHdlbnR5aGFuZ3pob3UgPSAweDUzNDQ7CiAgdC50d2VudHlwYXJlbiA9IDB4MjQ4NzsKICB0LnR3ZW50eXBlcmlvZCA9IDB4MjQ5YjsKICB0LnR3byA9IDB4MDAzMjsKICB0LnR3b2FyYWJpYyA9IDB4MDY2MjsKICB0LnR3b2JlbmdhbGkgPSAweDA5ZTg7CiAgdC50d29jaXJjbGUgPSAweDI0NjE7CiAgdC50d29jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhiOwogIHQudHdvZGV2YSA9IDB4MDk2ODsKICB0LnR3b2RvdGVubGVhZGVyID0gMHgyMDI1OwogIHQudHdvZG90bGVhZGVyID0gMHgyMDI1OwogIHQudHdvZG90bGVhZGVydmVydGljYWwgPSAweGZlMzA7CiAgdC50d29ndWphcmF0aSA9IDB4MGFlODsKICB0LnR3b2d1cm11a2hpID0gMHgwYTY4OwogIHQudHdvaGFja2FyYWJpYyA9IDB4MDY2MjsKICB0LnR3b2hhbmd6aG91ID0gMHgzMDIyOwogIHQudHdvaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMTsKICB0LnR3b2luZmVyaW9yID0gMHgyMDgyOwogIHQudHdvbW9ub3NwYWNlID0gMHhmZjEyOwogIHQudHdvbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNTsKICB0LnR3b29sZHN0eWxlID0gMHhmNzMyOwogIHQudHdvcGFyZW4gPSAweDI0NzU7CiAgdC50d29wZXJpb2QgPSAweDI0ODk7CiAgdC50d29wZXJzaWFuID0gMHgwNmYyOwogIHQudHdvcm9tYW4gPSAweDIxNzE7CiAgdC50d29zdHJva2UgPSAweDAxYmI7CiAgdC50d29zdXBlcmlvciA9IDB4MDBiMjsKICB0LnR3b3RoYWkgPSAweDBlNTI7CiAgdC50d290aGlyZHMgPSAweDIxNTQ7CiAgdC51ID0gMHgwMDc1OwogIHQudWFjdXRlID0gMHgwMGZhOwogIHQudWJhciA9IDB4MDI4OTsKICB0LnViZW5nYWxpID0gMHgwOTg5OwogIHQudWJvcG9tb2ZvID0gMHgzMTI4OwogIHQudWJyZXZlID0gMHgwMTZkOwogIHQudWNhcm9uID0gMHgwMWQ0OwogIHQudWNpcmNsZSA9IDB4MjRlNDsKICB0LnVjaXJjdW1mbGV4ID0gMHgwMGZiOwogIHQudWNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3NzsKICB0LnVjeXJpbGxpYyA9IDB4MDQ0MzsKICB0LnVkYXR0YWRldmEgPSAweDA5NTE7CiAgdC51ZGJsYWN1dGUgPSAweDAxNzE7CiAgdC51ZGJsZ3JhdmUgPSAweDAyMTU7CiAgdC51ZGV2YSA9IDB4MDkwOTsKICB0LnVkaWVyZXNpcyA9IDB4MDBmYzsKICB0LnVkaWVyZXNpc2FjdXRlID0gMHgwMWQ4OwogIHQudWRpZXJlc2lzYmVsb3cgPSAweDFlNzM7CiAgdC51ZGllcmVzaXNjYXJvbiA9IDB4MDFkYTsKICB0LnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGYxOwogIHQudWRpZXJlc2lzZ3JhdmUgPSAweDAxZGM7CiAgdC51ZGllcmVzaXNtYWNyb24gPSAweDAxZDY7CiAgdC51ZG90YmVsb3cgPSAweDFlZTU7CiAgdC51Z3JhdmUgPSAweDAwZjk7CiAgdC51Z3VqYXJhdGkgPSAweDBhODk7CiAgdC51Z3VybXVraGkgPSAweDBhMDk7CiAgdC51aGlyYWdhbmEgPSAweDMwNDY7CiAgdC51aG9va2Fib3ZlID0gMHgxZWU3OwogIHQudWhvcm4gPSAweDAxYjA7CiAgdC51aG9ybmFjdXRlID0gMHgxZWU5OwogIHQudWhvcm5kb3RiZWxvdyA9IDB4MWVmMTsKICB0LnVob3JuZ3JhdmUgPSAweDFlZWI7CiAgdC51aG9ybmhvb2thYm92ZSA9IDB4MWVlZDsKICB0LnVob3JudGlsZGUgPSAweDFlZWY7CiAgdC51aHVuZ2FydW1sYXV0ID0gMHgwMTcxOwogIHQudWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYzOwogIHQudWludmVydGVkYnJldmUgPSAweDAyMTc7CiAgdC51a2F0YWthbmEgPSAweDMwYTY7CiAgdC51a2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzM7CiAgdC51a2N5cmlsbGljID0gMHgwNDc5OwogIHQudWtvcmVhbiA9IDB4MzE1YzsKICB0LnVtYWNyb24gPSAweDAxNmI7CiAgdC51bWFjcm9uY3lyaWxsaWMgPSAweDA0ZWY7CiAgdC51bWFjcm9uZGllcmVzaXMgPSAweDFlN2I7CiAgdC51bWF0cmFndXJtdWtoaSA9IDB4MGE0MTsKICB0LnVtb25vc3BhY2UgPSAweGZmNTU7CiAgdC51bmRlcnNjb3JlID0gMHgwMDVmOwogIHQudW5kZXJzY29yZWRibCA9IDB4MjAxNzsKICB0LnVuZGVyc2NvcmVtb25vc3BhY2UgPSAweGZmM2Y7CiAgdC51bmRlcnNjb3JldmVydGljYWwgPSAweGZlMzM7CiAgdC51bmRlcnNjb3Jld2F2eSA9IDB4ZmU0ZjsKICB0LnVuaW9uID0gMHgyMjJhOwogIHQudW5pdmVyc2FsID0gMHgyMjAwOwogIHQudW9nb25layA9IDB4MDE3MzsKICB0LnVwYXJlbiA9IDB4MjRiMDsKICB0LnVwYmxvY2sgPSAweDI1ODA7CiAgdC51cHBlcmRvdGhlYnJldyA9IDB4MDVjNDsKICB0LnVwc2lsb24gPSAweDAzYzU7CiAgdC51cHNpbG9uZGllcmVzaXMgPSAweDAzY2I7CiAgdC51cHNpbG9uZGllcmVzaXN0b25vcyA9IDB4MDNiMDsKICB0LnVwc2lsb25sYXRpbiA9IDB4MDI4YTsKICB0LnVwc2lsb250b25vcyA9IDB4MDNjZDsKICB0LnVwdGFja2JlbG93Y21iID0gMHgwMzFkOwogIHQudXB0YWNrbW9kID0gMHgwMmQ0OwogIHQudXJhZ3VybXVraGkgPSAweDBhNzM7CiAgdC51cmluZyA9IDB4MDE2ZjsKICB0LnVzaG9ydGN5cmlsbGljID0gMHgwNDVlOwogIHQudXNtYWxsaGlyYWdhbmEgPSAweDMwNDU7CiAgdC51c21hbGxrYXRha2FuYSA9IDB4MzBhNTsKICB0LnVzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjY5OwogIHQudXN0cmFpZ2h0Y3lyaWxsaWMgPSAweDA0YWY7CiAgdC51c3RyYWlnaHRzdHJva2VjeXJpbGxpYyA9IDB4MDRiMTsKICB0LnV0aWxkZSA9IDB4MDE2OTsKICB0LnV0aWxkZWFjdXRlID0gMHgxZTc5OwogIHQudXRpbGRlYmVsb3cgPSAweDFlNzU7CiAgdC51dWJlbmdhbGkgPSAweDA5OGE7CiAgdC51dWRldmEgPSAweDA5MGE7CiAgdC51dWd1amFyYXRpID0gMHgwYThhOwogIHQudXVndXJtdWtoaSA9IDB4MGEwYTsKICB0LnV1bWF0cmFndXJtdWtoaSA9IDB4MGE0MjsKICB0LnV1dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMjsKICB0LnV1dm93ZWxzaWduZGV2YSA9IDB4MDk0MjsKICB0LnV1dm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzI7CiAgdC51dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMTsKICB0LnV2b3dlbHNpZ25kZXZhID0gMHgwOTQxOwogIHQudXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMxOwogIHQudiA9IDB4MDA3NjsKICB0LnZhZGV2YSA9IDB4MDkzNTsKICB0LnZhZ3VqYXJhdGkgPSAweDBhYjU7CiAgdC52YWd1cm11a2hpID0gMHgwYTM1OwogIHQudmFrYXRha2FuYSA9IDB4MzBmNzsKICB0LnZhdiA9IDB4MDVkNTsKICB0LnZhdmRhZ2VzaCA9IDB4ZmIzNTsKICB0LnZhdmRhZ2VzaDY1ID0gMHhmYjM1OwogIHQudmF2ZGFnZXNoaGVicmV3ID0gMHhmYjM1OwogIHQudmF2aGVicmV3ID0gMHgwNWQ1OwogIHQudmF2aG9sYW0gPSAweGZiNGI7CiAgdC52YXZob2xhbWhlYnJldyA9IDB4ZmI0YjsKICB0LnZhdnZhdmhlYnJldyA9IDB4MDVmMDsKICB0LnZhdnlvZGhlYnJldyA9IDB4MDVmMTsKICB0LnZjaXJjbGUgPSAweDI0ZTU7CiAgdC52ZG90YmVsb3cgPSAweDFlN2Y7CiAgdC52ZWN5cmlsbGljID0gMHgwNDMyOwogIHQudmVoYXJhYmljID0gMHgwNmE0OwogIHQudmVoZmluYWxhcmFiaWMgPSAweGZiNmI7CiAgdC52ZWhpbml0aWFsYXJhYmljID0gMHhmYjZjOwogIHQudmVobWVkaWFsYXJhYmljID0gMHhmYjZkOwogIHQudmVrYXRha2FuYSA9IDB4MzBmOTsKICB0LnZlbnVzID0gMHgyNjQwOwogIHQudmVydGljYWxiYXIgPSAweDAwN2M7CiAgdC52ZXJ0aWNhbGxpbmVhYm92ZWNtYiA9IDB4MDMwZDsKICB0LnZlcnRpY2FsbGluZWJlbG93Y21iID0gMHgwMzI5OwogIHQudmVydGljYWxsaW5lbG93bW9kID0gMHgwMmNjOwogIHQudmVydGljYWxsaW5lbW9kID0gMHgwMmM4OwogIHQudmV3YXJtZW5pYW4gPSAweDA1N2U7CiAgdC52aG9vayA9IDB4MDI4YjsKICB0LnZpa2F0YWthbmEgPSAweDMwZjg7CiAgdC52aXJhbWFiZW5nYWxpID0gMHgwOWNkOwogIHQudmlyYW1hZGV2YSA9IDB4MDk0ZDsKICB0LnZpcmFtYWd1amFyYXRpID0gMHgwYWNkOwogIHQudmlzYXJnYWJlbmdhbGkgPSAweDA5ODM7CiAgdC52aXNhcmdhZGV2YSA9IDB4MDkwMzsKICB0LnZpc2FyZ2FndWphcmF0aSA9IDB4MGE4MzsKICB0LnZtb25vc3BhY2UgPSAweGZmNTY7CiAgdC52b2FybWVuaWFuID0gMHgwNTc4OwogIHQudm9pY2VkaXRlcmF0aW9uaGlyYWdhbmEgPSAweDMwOWU7CiAgdC52b2ljZWRpdGVyYXRpb25rYXRha2FuYSA9IDB4MzBmZTsKICB0LnZvaWNlZG1hcmtrYW5hID0gMHgzMDliOwogIHQudm9pY2VkbWFya2thbmFoYWxmd2lkdGggPSAweGZmOWU7CiAgdC52b2thdGFrYW5hID0gMHgzMGZhOwogIHQudnBhcmVuID0gMHgyNGIxOwogIHQudnRpbGRlID0gMHgxZTdkOwogIHQudnR1cm5lZCA9IDB4MDI4YzsKICB0LnZ1aGlyYWdhbmEgPSAweDMwOTQ7CiAgdC52dWthdGFrYW5hID0gMHgzMGY0OwogIHQudyA9IDB4MDA3NzsKICB0LndhY3V0ZSA9IDB4MWU4MzsKICB0LndhZWtvcmVhbiA9IDB4MzE1OTsKICB0LndhaGlyYWdhbmEgPSAweDMwOGY7CiAgdC53YWthdGFrYW5hID0gMHgzMGVmOwogIHQud2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YzsKICB0Lndha29yZWFuID0gMHgzMTU4OwogIHQud2FzbWFsbGhpcmFnYW5hID0gMHgzMDhlOwogIHQud2FzbWFsbGthdGFrYW5hID0gMHgzMGVlOwogIHQud2F0dG9zcXVhcmUgPSAweDMzNTc7CiAgdC53YXZlZGFzaCA9IDB4MzAxYzsKICB0Lndhdnl1bmRlcnNjb3JldmVydGljYWwgPSAweGZlMzQ7CiAgdC53YXdhcmFiaWMgPSAweDA2NDg7CiAgdC53YXdmaW5hbGFyYWJpYyA9IDB4ZmVlZTsKICB0Lndhd2hhbXphYWJvdmVhcmFiaWMgPSAweDA2MjQ7CiAgdC53YXdoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODY7CiAgdC53YnNxdWFyZSA9IDB4MzNkZDsKICB0LndjaXJjbGUgPSAweDI0ZTY7CiAgdC53Y2lyY3VtZmxleCA9IDB4MDE3NTsKICB0LndkaWVyZXNpcyA9IDB4MWU4NTsKICB0Lndkb3RhY2NlbnQgPSAweDFlODc7CiAgdC53ZG90YmVsb3cgPSAweDFlODk7CiAgdC53ZWhpcmFnYW5hID0gMHgzMDkxOwogIHQud2VpZXJzdHJhc3MgPSAweDIxMTg7CiAgdC53ZWthdGFrYW5hID0gMHgzMGYxOwogIHQud2Vrb3JlYW4gPSAweDMxNWU7CiAgdC53ZW9rb3JlYW4gPSAweDMxNWQ7CiAgdC53Z3JhdmUgPSAweDFlODE7CiAgdC53aGl0ZWJ1bGxldCA9IDB4MjVlNjsKICB0LndoaXRlY2lyY2xlID0gMHgyNWNiOwogIHQud2hpdGVjaXJjbGVpbnZlcnNlID0gMHgyNWQ5OwogIHQud2hpdGVjb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwZTsKICB0LndoaXRlY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MzsKICB0LndoaXRlY29ybmVyYnJhY2tldHJpZ2h0ID0gMHgzMDBmOwogIHQud2hpdGVjb3JuZXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0NDsKICB0LndoaXRlZGlhbW9uZCA9IDB4MjVjNzsKICB0LndoaXRlZGlhbW9uZGNvbnRhaW5pbmdibGFja3NtYWxsZGlhbW9uZCA9IDB4MjVjODsKICB0LndoaXRlZG93bnBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViZjsKICB0LndoaXRlZG93bnBvaW50aW5ndHJpYW5nbGUgPSAweDI1YmQ7CiAgdC53aGl0ZWxlZnRwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YzM7CiAgdC53aGl0ZWxlZnRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWMxOwogIHQud2hpdGVsZW50aWN1bGFyYnJhY2tldGxlZnQgPSAweDMwMTY7CiAgdC53aGl0ZWxlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTc7CiAgdC53aGl0ZXJpZ2h0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWI5OwogIHQud2hpdGVyaWdodHBvaW50aW5ndHJpYW5nbGUgPSAweDI1Yjc7CiAgdC53aGl0ZXNtYWxsc3F1YXJlID0gMHgyNWFiOwogIHQud2hpdGVzbWlsaW5nZmFjZSA9IDB4MjYzYTsKICB0LndoaXRlc3F1YXJlID0gMHgyNWExOwogIHQud2hpdGVzdGFyID0gMHgyNjA2OwogIHQud2hpdGV0ZWxlcGhvbmUgPSAweDI2MGY7CiAgdC53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0bGVmdCA9IDB4MzAxODsKICB0LndoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodCA9IDB4MzAxOTsKICB0LndoaXRldXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjU7CiAgdC53aGl0ZXVwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMzsKICB0LndpaGlyYWdhbmEgPSAweDMwOTA7CiAgdC53aWthdGFrYW5hID0gMHgzMGYwOwogIHQud2lrb3JlYW4gPSAweDMxNWY7CiAgdC53bW9ub3NwYWNlID0gMHhmZjU3OwogIHQud29oaXJhZ2FuYSA9IDB4MzA5MjsKICB0Lndva2F0YWthbmEgPSAweDMwZjI7CiAgdC53b2thdGFrYW5haGFsZndpZHRoID0gMHhmZjY2OwogIHQud29uID0gMHgyMGE5OwogIHQud29ubW9ub3NwYWNlID0gMHhmZmU2OwogIHQud293YWVudGhhaSA9IDB4MGUyNzsKICB0LndwYXJlbiA9IDB4MjRiMjsKICB0LndyaW5nID0gMHgxZTk4OwogIHQud3N1cGVyaW9yID0gMHgwMmI3OwogIHQud3R1cm5lZCA9IDB4MDI4ZDsKICB0Lnd5bm4gPSAweDAxYmY7CiAgdC54ID0gMHgwMDc4OwogIHQueGFib3ZlY21iID0gMHgwMzNkOwogIHQueGJvcG9tb2ZvID0gMHgzMTEyOwogIHQueGNpcmNsZSA9IDB4MjRlNzsKICB0LnhkaWVyZXNpcyA9IDB4MWU4ZDsKICB0Lnhkb3RhY2NlbnQgPSAweDFlOGI7CiAgdC54ZWhhcm1lbmlhbiA9IDB4MDU2ZDsKICB0LnhpID0gMHgwM2JlOwogIHQueG1vbm9zcGFjZSA9IDB4ZmY1ODsKICB0LnhwYXJlbiA9IDB4MjRiMzsKICB0LnhzdXBlcmlvciA9IDB4MDJlMzsKICB0LnkgPSAweDAwNzk7CiAgdC55YWFkb3NxdWFyZSA9IDB4MzM0ZTsKICB0LnlhYmVuZ2FsaSA9IDB4MDlhZjsKICB0LnlhY3V0ZSA9IDB4MDBmZDsKICB0LnlhZGV2YSA9IDB4MDkyZjsKICB0LnlhZWtvcmVhbiA9IDB4MzE1MjsKICB0LnlhZ3VqYXJhdGkgPSAweDBhYWY7CiAgdC55YWd1cm11a2hpID0gMHgwYTJmOwogIHQueWFoaXJhZ2FuYSA9IDB4MzA4NDsKICB0Lnlha2F0YWthbmEgPSAweDMwZTQ7CiAgdC55YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk0OwogIHQueWFrb3JlYW4gPSAweDMxNTE7CiAgdC55YW1ha2thbnRoYWkgPSAweDBlNGU7CiAgdC55YXNtYWxsaGlyYWdhbmEgPSAweDMwODM7CiAgdC55YXNtYWxsa2F0YWthbmEgPSAweDMwZTM7CiAgdC55YXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmM7CiAgdC55YXRjeXJpbGxpYyA9IDB4MDQ2MzsKICB0LnljaXJjbGUgPSAweDI0ZTg7CiAgdC55Y2lyY3VtZmxleCA9IDB4MDE3NzsKICB0LnlkaWVyZXNpcyA9IDB4MDBmZjsKICB0Lnlkb3RhY2NlbnQgPSAweDFlOGY7CiAgdC55ZG90YmVsb3cgPSAweDFlZjU7CiAgdC55ZWhhcmFiaWMgPSAweDA2NGE7CiAgdC55ZWhiYXJyZWVhcmFiaWMgPSAweDA2ZDI7CiAgdC55ZWhiYXJyZWVmaW5hbGFyYWJpYyA9IDB4ZmJhZjsKICB0LnllaGZpbmFsYXJhYmljID0gMHhmZWYyOwogIHQueWVoaGFtemFhYm92ZWFyYWJpYyA9IDB4MDYyNjsKICB0LnllaGhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4YTsKICB0LnllaGhhbXphYWJvdmVpbml0aWFsYXJhYmljID0gMHhmZThiOwogIHQueWVoaGFtemFhYm92ZW1lZGlhbGFyYWJpYyA9IDB4ZmU4YzsKICB0LnllaGluaXRpYWxhcmFiaWMgPSAweGZlZjM7CiAgdC55ZWhtZWRpYWxhcmFiaWMgPSAweGZlZjQ7CiAgdC55ZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkZDsKICB0LnllaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM1ODsKICB0LnllaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM5NDsKICB0LnllaHRocmVlZG90c2JlbG93YXJhYmljID0gMHgwNmQxOwogIHQueWVrb3JlYW4gPSAweDMxNTY7CiAgdC55ZW4gPSAweDAwYTU7CiAgdC55ZW5tb25vc3BhY2UgPSAweGZmZTU7CiAgdC55ZW9rb3JlYW4gPSAweDMxNTU7CiAgdC55ZW9yaW5oaWV1aGtvcmVhbiA9IDB4MzE4NjsKICB0LnllcmFoYmVueW9tb2hlYnJldyA9IDB4MDVhYTsKICB0LnllcmFoYmVueW9tb2xlZnRoZWJyZXcgPSAweDA1YWE7CiAgdC55ZXJpY3lyaWxsaWMgPSAweDA0NGI7CiAgdC55ZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmOTsKICB0Lnllc2lldW5na29yZWFuID0gMHgzMTgxOwogIHQueWVzaWV1bmdwYW5zaW9za29yZWFuID0gMHgzMTgzOwogIHQueWVzaWV1bmdzaW9za29yZWFuID0gMHgzMTgyOwogIHQueWV0aXZoZWJyZXcgPSAweDA1OWE7CiAgdC55Z3JhdmUgPSAweDFlZjM7CiAgdC55aG9vayA9IDB4MDFiNDsKICB0Lnlob29rYWJvdmUgPSAweDFlZjc7CiAgdC55aWFybWVuaWFuID0gMHgwNTc1OwogIHQueWljeXJpbGxpYyA9IDB4MDQ1NzsKICB0Lnlpa29yZWFuID0gMHgzMTYyOwogIHQueWlueWFuZyA9IDB4MjYyZjsKICB0Lnlpd25hcm1lbmlhbiA9IDB4MDU4MjsKICB0Lnltb25vc3BhY2UgPSAweGZmNTk7CiAgdC55b2QgPSAweDA1ZDk7CiAgdC55b2RkYWdlc2ggPSAweGZiMzk7CiAgdC55b2RkYWdlc2hoZWJyZXcgPSAweGZiMzk7CiAgdC55b2RoZWJyZXcgPSAweDA1ZDk7CiAgdC55b2R5b2RoZWJyZXcgPSAweDA1ZjI7CiAgdC55b2R5b2RwYXRhaGhlYnJldyA9IDB4ZmIxZjsKICB0LnlvaGlyYWdhbmEgPSAweDMwODg7CiAgdC55b2lrb3JlYW4gPSAweDMxODk7CiAgdC55b2thdGFrYW5hID0gMHgzMGU4OwogIHQueW9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NjsKICB0Lnlva29yZWFuID0gMHgzMTViOwogIHQueW9zbWFsbGhpcmFnYW5hID0gMHgzMDg3OwogIHQueW9zbWFsbGthdGFrYW5hID0gMHgzMGU3OwogIHQueW9zbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjZlOwogIHQueW90Z3JlZWsgPSAweDAzZjM7CiAgdC55b3lhZWtvcmVhbiA9IDB4MzE4ODsKICB0LnlveWFrb3JlYW4gPSAweDMxODc7CiAgdC55b3lha3RoYWkgPSAweDBlMjI7CiAgdC55b3lpbmd0aGFpID0gMHgwZTBkOwogIHQueXBhcmVuID0gMHgyNGI0OwogIHQueXBvZ2VncmFtbWVuaSA9IDB4MDM3YTsKICB0Lnlwb2dlZ3JhbW1lbmlncmVla2NtYiA9IDB4MDM0NTsKICB0LnlyID0gMHgwMWE2OwogIHQueXJpbmcgPSAweDFlOTk7CiAgdC55c3VwZXJpb3IgPSAweDAyYjg7CiAgdC55dGlsZGUgPSAweDFlZjk7CiAgdC55dHVybmVkID0gMHgwMjhlOwogIHQueXVoaXJhZ2FuYSA9IDB4MzA4NjsKICB0Lnl1aWtvcmVhbiA9IDB4MzE4YzsKICB0Lnl1a2F0YWthbmEgPSAweDMwZTY7CiAgdC55dWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk1OwogIHQueXVrb3JlYW4gPSAweDMxNjA7CiAgdC55dXNiaWdjeXJpbGxpYyA9IDB4MDQ2YjsKICB0Lnl1c2JpZ2lvdGlmaWVkY3lyaWxsaWMgPSAweDA0NmQ7CiAgdC55dXNsaXR0bGVjeXJpbGxpYyA9IDB4MDQ2NzsKICB0Lnl1c2xpdHRsZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0Njk7CiAgdC55dXNtYWxsaGlyYWdhbmEgPSAweDMwODU7CiAgdC55dXNtYWxsa2F0YWthbmEgPSAweDMwZTU7CiAgdC55dXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmQ7CiAgdC55dXlla29yZWFuID0gMHgzMThiOwogIHQueXV5ZW9rb3JlYW4gPSAweDMxOGE7CiAgdC55eWFiZW5nYWxpID0gMHgwOWRmOwogIHQueXlhZGV2YSA9IDB4MDk1ZjsKICB0LnogPSAweDAwN2E7CiAgdC56YWFybWVuaWFuID0gMHgwNTY2OwogIHQuemFjdXRlID0gMHgwMTdhOwogIHQuemFkZXZhID0gMHgwOTViOwogIHQuemFndXJtdWtoaSA9IDB4MGE1YjsKICB0LnphaGFyYWJpYyA9IDB4MDYzODsKICB0LnphaGZpbmFsYXJhYmljID0gMHhmZWM2OwogIHQuemFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVjNzsKICB0LnphaGlyYWdhbmEgPSAweDMwNTY7CiAgdC56YWhtZWRpYWxhcmFiaWMgPSAweGZlYzg7CiAgdC56YWluYXJhYmljID0gMHgwNjMyOwogIHQuemFpbmZpbmFsYXJhYmljID0gMHhmZWIwOwogIHQuemFrYXRha2FuYSA9IDB4MzBiNjsKICB0LnphcWVmZ2Fkb2xoZWJyZXcgPSAweDA1OTU7CiAgdC56YXFlZnFhdGFuaGVicmV3ID0gMHgwNTk0OwogIHQuemFycWFoZWJyZXcgPSAweDA1OTg7CiAgdC56YXlpbiA9IDB4MDVkNjsKICB0LnpheWluZGFnZXNoID0gMHhmYjM2OwogIHQuemF5aW5kYWdlc2hoZWJyZXcgPSAweGZiMzY7CiAgdC56YXlpbmhlYnJldyA9IDB4MDVkNjsKICB0Lnpib3BvbW9mbyA9IDB4MzExNzsKICB0LnpjYXJvbiA9IDB4MDE3ZTsKICB0LnpjaXJjbGUgPSAweDI0ZTk7CiAgdC56Y2lyY3VtZmxleCA9IDB4MWU5MTsKICB0LnpjdXJsID0gMHgwMjkxOwogIHQuemRvdCA9IDB4MDE3YzsKICB0Lnpkb3RhY2NlbnQgPSAweDAxN2M7CiAgdC56ZG90YmVsb3cgPSAweDFlOTM7CiAgdC56ZWN5cmlsbGljID0gMHgwNDM3OwogIHQuemVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDQ5OTsKICB0LnplZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZjsKICB0LnplaGlyYWdhbmEgPSAweDMwNWM7CiAgdC56ZWthdGFrYW5hID0gMHgzMGJjOwogIHQuemVybyA9IDB4MDAzMDsKICB0Lnplcm9hcmFiaWMgPSAweDA2NjA7CiAgdC56ZXJvYmVuZ2FsaSA9IDB4MDllNjsKICB0Lnplcm9kZXZhID0gMHgwOTY2OwogIHQuemVyb2d1amFyYXRpID0gMHgwYWU2OwogIHQuemVyb2d1cm11a2hpID0gMHgwYTY2OwogIHQuemVyb2hhY2thcmFiaWMgPSAweDA2NjA7CiAgdC56ZXJvaW5mZXJpb3IgPSAweDIwODA7CiAgdC56ZXJvbW9ub3NwYWNlID0gMHhmZjEwOwogIHQuemVyb29sZHN0eWxlID0gMHhmNzMwOwogIHQuemVyb3BlcnNpYW4gPSAweDA2ZjA7CiAgdC56ZXJvc3VwZXJpb3IgPSAweDIwNzA7CiAgdC56ZXJvdGhhaSA9IDB4MGU1MDsKICB0Lnplcm93aWR0aGpvaW5lciA9IDB4ZmVmZjsKICB0Lnplcm93aWR0aG5vbmpvaW5lciA9IDB4MjAwYzsKICB0Lnplcm93aWR0aHNwYWNlID0gMHgyMDBiOwogIHQuemV0YSA9IDB4MDNiNjsKICB0LnpoYm9wb21vZm8gPSAweDMxMTM7CiAgdC56aGVhcm1lbmlhbiA9IDB4MDU2YTsKICB0LnpoZWJyZXZlY3lyaWxsaWMgPSAweDA0YzI7CiAgdC56aGVjeXJpbGxpYyA9IDB4MDQzNjsKICB0LnpoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk3OwogIHQuemhlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZDsKICB0LnppaGlyYWdhbmEgPSAweDMwNTg7CiAgdC56aWthdGFrYW5hID0gMHgzMGI4OwogIHQuemlub3JoZWJyZXcgPSAweDA1YWU7CiAgdC56bGluZWJlbG93ID0gMHgxZTk1OwogIHQuem1vbm9zcGFjZSA9IDB4ZmY1YTsKICB0LnpvaGlyYWdhbmEgPSAweDMwNWU7CiAgdC56b2thdGFrYW5hID0gMHgzMGJlOwogIHQuenBhcmVuID0gMHgyNGI1OwogIHQuenJldHJvZmxleGhvb2sgPSAweDAyOTA7CiAgdC56c3Ryb2tlID0gMHgwMWI2OwogIHQuenVoaXJhZ2FuYSA9IDB4MzA1YTsKICB0Lnp1a2F0YWthbmEgPSAweDMwYmE7CiAgdFsiLm5vdGRlZiJdID0gMHgwMDAwOwogIHQuYW5nYnJhY2tldGxlZnRiaWcgPSAweDIzMjk7CiAgdC5hbmdicmFja2V0bGVmdEJpZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRsZWZ0YmlnZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRsZWZ0QmlnZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRyaWdodEJpZyA9IDB4MjMyYTsKICB0LmFuZ2JyYWNrZXRyaWdodGJpZyA9IDB4MjMyYTsKICB0LmFuZ2JyYWNrZXRyaWdodEJpZ2cgPSAweDIzMmE7CiAgdC5hbmdicmFja2V0cmlnaHRiaWdnID0gMHgyMzJhOwogIHQuYXJyb3dob29rbGVmdCA9IDB4MjFhYTsKICB0LmFycm93aG9va3JpZ2h0ID0gMHgyMWE5OwogIHQuYXJyb3dsZWZ0dG9waGFsZiA9IDB4MjFiYzsKICB0LmFycm93bGVmdGJvdGhhbGYgPSAweDIxYmQ7CiAgdC5hcnJvd25vcnRoZWFzdCA9IDB4MjE5NzsKICB0LmFycm93bm9ydGh3ZXN0ID0gMHgyMTk2OwogIHQuYXJyb3dyaWdodHRvcGhhbGYgPSAweDIxYzA7CiAgdC5hcnJvd3JpZ2h0Ym90aGFsZiA9IDB4MjFjMTsKICB0LmFycm93c291dGhlYXN0ID0gMHgyMTk4OwogIHQuYXJyb3dzb3V0aHdlc3QgPSAweDIxOTk7CiAgdC5iYWNrc2xhc2hiaWcgPSAweDIyMTY7CiAgdC5iYWNrc2xhc2hCaWcgPSAweDIyMTY7CiAgdC5iYWNrc2xhc2hCaWdnID0gMHgyMjE2OwogIHQuYmFja3NsYXNoYmlnZyA9IDB4MjIxNjsKICB0LmJhcmRibCA9IDB4MjAxNjsKICB0LmJyYWNlaHRpcGRvd25sZWZ0ID0gMHhmZTM3OwogIHQuYnJhY2VodGlwZG93bnJpZ2h0ID0gMHhmZTM3OwogIHQuYnJhY2VodGlwdXBsZWZ0ID0gMHhmZTM4OwogIHQuYnJhY2VodGlwdXByaWdodCA9IDB4ZmUzODsKICB0LmJyYWNlbGVmdEJpZyA9IDB4MDA3YjsKICB0LmJyYWNlbGVmdGJpZyA9IDB4MDA3YjsKICB0LmJyYWNlbGVmdGJpZ2cgPSAweDAwN2I7CiAgdC5icmFjZWxlZnRCaWdnID0gMHgwMDdiOwogIHQuYnJhY2VyaWdodEJpZyA9IDB4MDA3ZDsKICB0LmJyYWNlcmlnaHRiaWcgPSAweDAwN2Q7CiAgdC5icmFjZXJpZ2h0YmlnZyA9IDB4MDA3ZDsKICB0LmJyYWNlcmlnaHRCaWdnID0gMHgwMDdkOwogIHQuYnJhY2tldGxlZnRiaWcgPSAweDAwNWI7CiAgdC5icmFja2V0bGVmdEJpZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0YmlnZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0QmlnZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRyaWdodEJpZyA9IDB4MDA1ZDsKICB0LmJyYWNrZXRyaWdodGJpZyA9IDB4MDA1ZDsKICB0LmJyYWNrZXRyaWdodGJpZ2cgPSAweDAwNWQ7CiAgdC5icmFja2V0cmlnaHRCaWdnID0gMHgwMDVkOwogIHQuY2VpbGluZ2xlZnRiaWcgPSAweDIzMDg7CiAgdC5jZWlsaW5nbGVmdEJpZyA9IDB4MjMwODsKICB0LmNlaWxpbmdsZWZ0QmlnZyA9IDB4MjMwODsKICB0LmNlaWxpbmdsZWZ0YmlnZyA9IDB4MjMwODsKICB0LmNlaWxpbmdyaWdodGJpZyA9IDB4MjMwOTsKICB0LmNlaWxpbmdyaWdodEJpZyA9IDB4MjMwOTsKICB0LmNlaWxpbmdyaWdodGJpZ2cgPSAweDIzMDk7CiAgdC5jZWlsaW5ncmlnaHRCaWdnID0gMHgyMzA5OwogIHQuY2lyY2xlZG90ZGlzcGxheSA9IDB4MjI5OTsKICB0LmNpcmNsZWRvdHRleHQgPSAweDIyOTk7CiAgdC5jaXJjbGVtdWx0aXBseWRpc3BsYXkgPSAweDIyOTc7CiAgdC5jaXJjbGVtdWx0aXBseXRleHQgPSAweDIyOTc7CiAgdC5jaXJjbGVwbHVzZGlzcGxheSA9IDB4MjI5NTsKICB0LmNpcmNsZXBsdXN0ZXh0ID0gMHgyMjk1OwogIHQuY29udGludGVncmFsZGlzcGxheSA9IDB4MjIyZTsKICB0LmNvbnRpbnRlZ3JhbHRleHQgPSAweDIyMmU7CiAgdC5jb3Byb2R1Y3RkaXNwbGF5ID0gMHgyMjEwOwogIHQuY29wcm9kdWN0dGV4dCA9IDB4MjIxMDsKICB0LmZsb29ybGVmdEJpZyA9IDB4MjMwYTsKICB0LmZsb29ybGVmdGJpZyA9IDB4MjMwYTsKICB0LmZsb29ybGVmdGJpZ2cgPSAweDIzMGE7CiAgdC5mbG9vcmxlZnRCaWdnID0gMHgyMzBhOwogIHQuZmxvb3JyaWdodGJpZyA9IDB4MjMwYjsKICB0LmZsb29ycmlnaHRCaWcgPSAweDIzMGI7CiAgdC5mbG9vcnJpZ2h0QmlnZyA9IDB4MjMwYjsKICB0LmZsb29ycmlnaHRiaWdnID0gMHgyMzBiOwogIHQuaGF0d2lkZSA9IDB4MDMwMjsKICB0LmhhdHdpZGVyID0gMHgwMzAyOwogIHQuaGF0d2lkZXN0ID0gMHgwMzAyOwogIHQuaW50ZXJjYWwgPSAweDFkNDA7CiAgdC5pbnRlZ3JhbGRpc3BsYXkgPSAweDIyMmI7CiAgdC5pbnRlZ3JhbHRleHQgPSAweDIyMmI7CiAgdC5pbnRlcnNlY3Rpb25kaXNwbGF5ID0gMHgyMmMyOwogIHQuaW50ZXJzZWN0aW9udGV4dCA9IDB4MjJjMjsKICB0LmxvZ2ljYWxhbmRkaXNwbGF5ID0gMHgyMjI3OwogIHQubG9naWNhbGFuZHRleHQgPSAweDIyMjc7CiAgdC5sb2dpY2Fsb3JkaXNwbGF5ID0gMHgyMjI4OwogIHQubG9naWNhbG9ydGV4dCA9IDB4MjIyODsKICB0LnBhcmVubGVmdEJpZyA9IDB4MDAyODsKICB0LnBhcmVubGVmdGJpZyA9IDB4MDAyODsKICB0LnBhcmVubGVmdEJpZ2cgPSAweDAwMjg7CiAgdC5wYXJlbmxlZnRiaWdnID0gMHgwMDI4OwogIHQucGFyZW5yaWdodEJpZyA9IDB4MDAyOTsKICB0LnBhcmVucmlnaHRiaWcgPSAweDAwMjk7CiAgdC5wYXJlbnJpZ2h0QmlnZyA9IDB4MDAyOTsKICB0LnBhcmVucmlnaHRiaWdnID0gMHgwMDI5OwogIHQucHJpbWUgPSAweDIwMzI7CiAgdC5wcm9kdWN0ZGlzcGxheSA9IDB4MjIwZjsKICB0LnByb2R1Y3R0ZXh0ID0gMHgyMjBmOwogIHQucmFkaWNhbGJpZyA9IDB4MjIxYTsKICB0LnJhZGljYWxCaWcgPSAweDIyMWE7CiAgdC5yYWRpY2FsQmlnZyA9IDB4MjIxYTsKICB0LnJhZGljYWxiaWdnID0gMHgyMjFhOwogIHQucmFkaWNhbGJ0ID0gMHgyMjFhOwogIHQucmFkaWNhbHRwID0gMHgyMjFhOwogIHQucmFkaWNhbHZlcnRleCA9IDB4MjIxYTsKICB0LnNsYXNoYmlnID0gMHgwMDJmOwogIHQuc2xhc2hCaWcgPSAweDAwMmY7CiAgdC5zbGFzaEJpZ2cgPSAweDAwMmY7CiAgdC5zbGFzaGJpZ2cgPSAweDAwMmY7CiAgdC5zdW1tYXRpb25kaXNwbGF5ID0gMHgyMjExOwogIHQuc3VtbWF0aW9udGV4dCA9IDB4MjIxMTsKICB0LnRpbGRld2lkZSA9IDB4MDJkYzsKICB0LnRpbGRld2lkZXIgPSAweDAyZGM7CiAgdC50aWxkZXdpZGVzdCA9IDB4MDJkYzsKICB0LnVuaW9uZGlzcGxheSA9IDB4MjJjMzsKICB0LnVuaW9ubXVsdGlkaXNwbGF5ID0gMHgyMjhlOwogIHQudW5pb25tdWx0aXRleHQgPSAweDIyOGU7CiAgdC51bmlvbnNxZGlzcGxheSA9IDB4MjI5NDsKICB0LnVuaW9uc3F0ZXh0ID0gMHgyMjk0OwogIHQudW5pb250ZXh0ID0gMHgyMmMzOwogIHQudmV4dGVuZGRvdWJsZSA9IDB4MjIyNTsKICB0LnZleHRlbmRzaW5nbGUgPSAweDIyMjM7Cn0pOwpjb25zdCBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGUgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LnNwYWNlID0gMHgwMDIwOwogIHQuYTEgPSAweDI3MDE7CiAgdC5hMiA9IDB4MjcwMjsKICB0LmEyMDIgPSAweDI3MDM7CiAgdC5hMyA9IDB4MjcwNDsKICB0LmE0ID0gMHgyNjBlOwogIHQuYTUgPSAweDI3MDY7CiAgdC5hMTE5ID0gMHgyNzA3OwogIHQuYTExOCA9IDB4MjcwODsKICB0LmExMTcgPSAweDI3MDk7CiAgdC5hMTEgPSAweDI2MWI7CiAgdC5hMTIgPSAweDI2MWU7CiAgdC5hMTMgPSAweDI3MGM7CiAgdC5hMTQgPSAweDI3MGQ7CiAgdC5hMTUgPSAweDI3MGU7CiAgdC5hMTYgPSAweDI3MGY7CiAgdC5hMTA1ID0gMHgyNzEwOwogIHQuYTE3ID0gMHgyNzExOwogIHQuYTE4ID0gMHgyNzEyOwogIHQuYTE5ID0gMHgyNzEzOwogIHQuYTIwID0gMHgyNzE0OwogIHQuYTIxID0gMHgyNzE1OwogIHQuYTIyID0gMHgyNzE2OwogIHQuYTIzID0gMHgyNzE3OwogIHQuYTI0ID0gMHgyNzE4OwogIHQuYTI1ID0gMHgyNzE5OwogIHQuYTI2ID0gMHgyNzFhOwogIHQuYTI3ID0gMHgyNzFiOwogIHQuYTI4ID0gMHgyNzFjOwogIHQuYTYgPSAweDI3MWQ7CiAgdC5hNyA9IDB4MjcxZTsKICB0LmE4ID0gMHgyNzFmOwogIHQuYTkgPSAweDI3MjA7CiAgdC5hMTAgPSAweDI3MjE7CiAgdC5hMjkgPSAweDI3MjI7CiAgdC5hMzAgPSAweDI3MjM7CiAgdC5hMzEgPSAweDI3MjQ7CiAgdC5hMzIgPSAweDI3MjU7CiAgdC5hMzMgPSAweDI3MjY7CiAgdC5hMzQgPSAweDI3Mjc7CiAgdC5hMzUgPSAweDI2MDU7CiAgdC5hMzYgPSAweDI3Mjk7CiAgdC5hMzcgPSAweDI3MmE7CiAgdC5hMzggPSAweDI3MmI7CiAgdC5hMzkgPSAweDI3MmM7CiAgdC5hNDAgPSAweDI3MmQ7CiAgdC5hNDEgPSAweDI3MmU7CiAgdC5hNDIgPSAweDI3MmY7CiAgdC5hNDMgPSAweDI3MzA7CiAgdC5hNDQgPSAweDI3MzE7CiAgdC5hNDUgPSAweDI3MzI7CiAgdC5hNDYgPSAweDI3MzM7CiAgdC5hNDcgPSAweDI3MzQ7CiAgdC5hNDggPSAweDI3MzU7CiAgdC5hNDkgPSAweDI3MzY7CiAgdC5hNTAgPSAweDI3Mzc7CiAgdC5hNTEgPSAweDI3Mzg7CiAgdC5hNTIgPSAweDI3Mzk7CiAgdC5hNTMgPSAweDI3M2E7CiAgdC5hNTQgPSAweDI3M2I7CiAgdC5hNTUgPSAweDI3M2M7CiAgdC5hNTYgPSAweDI3M2Q7CiAgdC5hNTcgPSAweDI3M2U7CiAgdC5hNTggPSAweDI3M2Y7CiAgdC5hNTkgPSAweDI3NDA7CiAgdC5hNjAgPSAweDI3NDE7CiAgdC5hNjEgPSAweDI3NDI7CiAgdC5hNjIgPSAweDI3NDM7CiAgdC5hNjMgPSAweDI3NDQ7CiAgdC5hNjQgPSAweDI3NDU7CiAgdC5hNjUgPSAweDI3NDY7CiAgdC5hNjYgPSAweDI3NDc7CiAgdC5hNjcgPSAweDI3NDg7CiAgdC5hNjggPSAweDI3NDk7CiAgdC5hNjkgPSAweDI3NGE7CiAgdC5hNzAgPSAweDI3NGI7CiAgdC5hNzEgPSAweDI1Y2Y7CiAgdC5hNzIgPSAweDI3NGQ7CiAgdC5hNzMgPSAweDI1YTA7CiAgdC5hNzQgPSAweDI3NGY7CiAgdC5hMjAzID0gMHgyNzUwOwogIHQuYTc1ID0gMHgyNzUxOwogIHQuYTIwNCA9IDB4Mjc1MjsKICB0LmE3NiA9IDB4MjViMjsKICB0LmE3NyA9IDB4MjViYzsKICB0LmE3OCA9IDB4MjVjNjsKICB0LmE3OSA9IDB4Mjc1NjsKICB0LmE4MSA9IDB4MjVkNzsKICB0LmE4MiA9IDB4Mjc1ODsKICB0LmE4MyA9IDB4Mjc1OTsKICB0LmE4NCA9IDB4Mjc1YTsKICB0LmE5NyA9IDB4Mjc1YjsKICB0LmE5OCA9IDB4Mjc1YzsKICB0LmE5OSA9IDB4Mjc1ZDsKICB0LmExMDAgPSAweDI3NWU7CiAgdC5hMTAxID0gMHgyNzYxOwogIHQuYTEwMiA9IDB4Mjc2MjsKICB0LmExMDMgPSAweDI3NjM7CiAgdC5hMTA0ID0gMHgyNzY0OwogIHQuYTEwNiA9IDB4Mjc2NTsKICB0LmExMDcgPSAweDI3NjY7CiAgdC5hMTA4ID0gMHgyNzY3OwogIHQuYTExMiA9IDB4MjY2MzsKICB0LmExMTEgPSAweDI2NjY7CiAgdC5hMTEwID0gMHgyNjY1OwogIHQuYTEwOSA9IDB4MjY2MDsKICB0LmExMjAgPSAweDI0NjA7CiAgdC5hMTIxID0gMHgyNDYxOwogIHQuYTEyMiA9IDB4MjQ2MjsKICB0LmExMjMgPSAweDI0NjM7CiAgdC5hMTI0ID0gMHgyNDY0OwogIHQuYTEyNSA9IDB4MjQ2NTsKICB0LmExMjYgPSAweDI0NjY7CiAgdC5hMTI3ID0gMHgyNDY3OwogIHQuYTEyOCA9IDB4MjQ2ODsKICB0LmExMjkgPSAweDI0Njk7CiAgdC5hMTMwID0gMHgyNzc2OwogIHQuYTEzMSA9IDB4Mjc3NzsKICB0LmExMzIgPSAweDI3Nzg7CiAgdC5hMTMzID0gMHgyNzc5OwogIHQuYTEzNCA9IDB4Mjc3YTsKICB0LmExMzUgPSAweDI3N2I7CiAgdC5hMTM2ID0gMHgyNzdjOwogIHQuYTEzNyA9IDB4Mjc3ZDsKICB0LmExMzggPSAweDI3N2U7CiAgdC5hMTM5ID0gMHgyNzdmOwogIHQuYTE0MCA9IDB4Mjc4MDsKICB0LmExNDEgPSAweDI3ODE7CiAgdC5hMTQyID0gMHgyNzgyOwogIHQuYTE0MyA9IDB4Mjc4MzsKICB0LmExNDQgPSAweDI3ODQ7CiAgdC5hMTQ1ID0gMHgyNzg1OwogIHQuYTE0NiA9IDB4Mjc4NjsKICB0LmExNDcgPSAweDI3ODc7CiAgdC5hMTQ4ID0gMHgyNzg4OwogIHQuYTE0OSA9IDB4Mjc4OTsKICB0LmExNTAgPSAweDI3OGE7CiAgdC5hMTUxID0gMHgyNzhiOwogIHQuYTE1MiA9IDB4Mjc4YzsKICB0LmExNTMgPSAweDI3OGQ7CiAgdC5hMTU0ID0gMHgyNzhlOwogIHQuYTE1NSA9IDB4Mjc4ZjsKICB0LmExNTYgPSAweDI3OTA7CiAgdC5hMTU3ID0gMHgyNzkxOwogIHQuYTE1OCA9IDB4Mjc5MjsKICB0LmExNTkgPSAweDI3OTM7CiAgdC5hMTYwID0gMHgyNzk0OwogIHQuYTE2MSA9IDB4MjE5MjsKICB0LmExNjMgPSAweDIxOTQ7CiAgdC5hMTY0ID0gMHgyMTk1OwogIHQuYTE5NiA9IDB4Mjc5ODsKICB0LmExNjUgPSAweDI3OTk7CiAgdC5hMTkyID0gMHgyNzlhOwogIHQuYTE2NiA9IDB4Mjc5YjsKICB0LmExNjcgPSAweDI3OWM7CiAgdC5hMTY4ID0gMHgyNzlkOwogIHQuYTE2OSA9IDB4Mjc5ZTsKICB0LmExNzAgPSAweDI3OWY7CiAgdC5hMTcxID0gMHgyN2EwOwogIHQuYTE3MiA9IDB4MjdhMTsKICB0LmExNzMgPSAweDI3YTI7CiAgdC5hMTYyID0gMHgyN2EzOwogIHQuYTE3NCA9IDB4MjdhNDsKICB0LmExNzUgPSAweDI3YTU7CiAgdC5hMTc2ID0gMHgyN2E2OwogIHQuYTE3NyA9IDB4MjdhNzsKICB0LmExNzggPSAweDI3YTg7CiAgdC5hMTc5ID0gMHgyN2E5OwogIHQuYTE5MyA9IDB4MjdhYTsKICB0LmExODAgPSAweDI3YWI7CiAgdC5hMTk5ID0gMHgyN2FjOwogIHQuYTE4MSA9IDB4MjdhZDsKICB0LmEyMDAgPSAweDI3YWU7CiAgdC5hMTgyID0gMHgyN2FmOwogIHQuYTIwMSA9IDB4MjdiMTsKICB0LmExODMgPSAweDI3YjI7CiAgdC5hMTg0ID0gMHgyN2IzOwogIHQuYTE5NyA9IDB4MjdiNDsKICB0LmExODUgPSAweDI3YjU7CiAgdC5hMTk0ID0gMHgyN2I2OwogIHQuYTE5OCA9IDB4MjdiNzsKICB0LmExODYgPSAweDI3Yjg7CiAgdC5hMTk1ID0gMHgyN2I5OwogIHQuYTE4NyA9IDB4MjdiYTsKICB0LmExODggPSAweDI3YmI7CiAgdC5hMTg5ID0gMHgyN2JjOwogIHQuYTE5MCA9IDB4MjdiZDsKICB0LmExOTEgPSAweDI3YmU7CiAgdC5hODkgPSAweDI3Njg7CiAgdC5hOTAgPSAweDI3Njk7CiAgdC5hOTMgPSAweDI3NmE7CiAgdC5hOTQgPSAweDI3NmI7CiAgdC5hOTEgPSAweDI3NmM7CiAgdC5hOTIgPSAweDI3NmQ7CiAgdC5hMjA1ID0gMHgyNzZlOwogIHQuYTg1ID0gMHgyNzZmOwogIHQuYTIwNiA9IDB4Mjc3MDsKICB0LmE4NiA9IDB4Mjc3MTsKICB0LmE4NyA9IDB4Mjc3MjsKICB0LmE4OCA9IDB4Mjc3MzsKICB0LmE5NSA9IDB4Mjc3NDsKICB0LmE5NiA9IDB4Mjc3NTsKICB0WyIubm90ZGVmIl0gPSAweDAwMDA7Cn0pOwoKOy8vIC4vc3JjL2NvcmUvdW5pY29kZS5qcwoKY29uc3QgZ2V0U3BlY2lhbFBVQVN5bWJvbHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WzYzNzIxXSA9IDB4MDBhOTsKICB0WzYzMTkzXSA9IDB4MDBhOTsKICB0WzYzNzIwXSA9IDB4MDBhZTsKICB0WzYzMTk0XSA9IDB4MDBhZTsKICB0WzYzNzIyXSA9IDB4MjEyMjsKICB0WzYzMTk1XSA9IDB4MjEyMjsKICB0WzYzNzI5XSA9IDB4MjNhNzsKICB0WzYzNzMwXSA9IDB4MjNhODsKICB0WzYzNzMxXSA9IDB4MjNhOTsKICB0WzYzNzQwXSA9IDB4MjNhYjsKICB0WzYzNzQxXSA9IDB4MjNhYzsKICB0WzYzNzQyXSA9IDB4MjNhZDsKICB0WzYzNzI2XSA9IDB4MjNhMTsKICB0WzYzNzI3XSA9IDB4MjNhMjsKICB0WzYzNzI4XSA9IDB4MjNhMzsKICB0WzYzNzM3XSA9IDB4MjNhNDsKICB0WzYzNzM4XSA9IDB4MjNhNTsKICB0WzYzNzM5XSA9IDB4MjNhNjsKICB0WzYzNzIzXSA9IDB4MjM5YjsKICB0WzYzNzI0XSA9IDB4MjM5YzsKICB0WzYzNzI1XSA9IDB4MjM5ZDsKICB0WzYzNzM0XSA9IDB4MjM5ZTsKICB0WzYzNzM1XSA9IDB4MjM5ZjsKICB0WzYzNzM2XSA9IDB4MjNhMDsKfSk7CmZ1bmN0aW9uIG1hcFNwZWNpYWxVbmljb2RlVmFsdWVzKGNvZGUpIHsKICBpZiAoY29kZSA+PSAweGZmZjAgJiYgY29kZSA8PSAweGZmZmYpIHsKICAgIHJldHVybiAwOwogIH0gZWxzZSBpZiAoY29kZSA+PSAweGY2MDAgJiYgY29kZSA8PSAweGY4ZmYpIHsKICAgIHJldHVybiBnZXRTcGVjaWFsUFVBU3ltYm9scygpW2NvZGVdIHx8IGNvZGU7CiAgfSBlbHNlIGlmIChjb2RlID09PSAweDAwYWQpIHsKICAgIHJldHVybiAweDAwMmQ7CiAgfQogIHJldHVybiBjb2RlOwp9CmZ1bmN0aW9uIGdldFVuaWNvZGVGb3JHbHlwaChuYW1lLCBnbHlwaHNVbmljb2RlTWFwKSB7CiAgbGV0IHVuaWNvZGUgPSBnbHlwaHNVbmljb2RlTWFwW25hbWVdOwogIGlmICh1bmljb2RlICE9PSB1bmRlZmluZWQpIHsKICAgIHJldHVybiB1bmljb2RlOwogIH0KICBpZiAoIW5hbWUpIHsKICAgIHJldHVybiAtMTsKICB9CiAgaWYgKG5hbWVbMF0gPT09ICJ1IikgewogICAgY29uc3QgbmFtZUxlbiA9IG5hbWUubGVuZ3RoOwogICAgbGV0IGhleFN0cjsKICAgIGlmIChuYW1lTGVuID09PSA3ICYmIG5hbWVbMV0gPT09ICJuIiAmJiBuYW1lWzJdID09PSAiaSIpIHsKICAgICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMyk7CiAgICB9IGVsc2UgaWYgKG5hbWVMZW4gPj0gNSAmJiBuYW1lTGVuIDw9IDcpIHsKICAgICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAoaGV4U3RyID09PSBoZXhTdHIudG9VcHBlckNhc2UoKSkgewogICAgICB1bmljb2RlID0gcGFyc2VJbnQoaGV4U3RyLCAxNik7CiAgICAgIGlmICh1bmljb2RlID49IDApIHsKICAgICAgICByZXR1cm4gdW5pY29kZTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gLTE7Cn0KY29uc3QgVW5pY29kZVJhbmdlcyA9IFtbMHgwMDAwLCAweDAwN2ZdLCBbMHgwMDgwLCAweDAwZmZdLCBbMHgwMTAwLCAweDAxN2ZdLCBbMHgwMTgwLCAweDAyNGZdLCBbMHgwMjUwLCAweDAyYWYsIDB4MWQwMCwgMHgxZDdmLCAweDFkODAsIDB4MWRiZl0sIFsweDAyYjAsIDB4MDJmZiwgMHhhNzAwLCAweGE3MWZdLCBbMHgwMzAwLCAweDAzNmYsIDB4MWRjMCwgMHgxZGZmXSwgWzB4MDM3MCwgMHgwM2ZmXSwgWzB4MmM4MCwgMHgyY2ZmXSwgWzB4MDQwMCwgMHgwNGZmLCAweDA1MDAsIDB4MDUyZiwgMHgyZGUwLCAweDJkZmYsIDB4YTY0MCwgMHhhNjlmXSwgWzB4MDUzMCwgMHgwNThmXSwgWzB4MDU5MCwgMHgwNWZmXSwgWzB4YTUwMCwgMHhhNjNmXSwgWzB4MDYwMCwgMHgwNmZmLCAweDA3NTAsIDB4MDc3Zl0sIFsweDA3YzAsIDB4MDdmZl0sIFsweDA5MDAsIDB4MDk3Zl0sIFsweDA5ODAsIDB4MDlmZl0sIFsweDBhMDAsIDB4MGE3Zl0sIFsweDBhODAsIDB4MGFmZl0sIFsweDBiMDAsIDB4MGI3Zl0sIFsweDBiODAsIDB4MGJmZl0sIFsweDBjMDAsIDB4MGM3Zl0sIFsweDBjODAsIDB4MGNmZl0sIFsweDBkMDAsIDB4MGQ3Zl0sIFsweDBlMDAsIDB4MGU3Zl0sIFsweDBlODAsIDB4MGVmZl0sIFsweDEwYTAsIDB4MTBmZiwgMHgyZDAwLCAweDJkMmZdLCBbMHgxYjAwLCAweDFiN2ZdLCBbMHgxMTAwLCAweDExZmZdLCBbMHgxZTAwLCAweDFlZmYsIDB4MmM2MCwgMHgyYzdmLCAweGE3MjAsIDB4YTdmZl0sIFsweDFmMDAsIDB4MWZmZl0sIFsweDIwMDAsIDB4MjA2ZiwgMHgyZTAwLCAweDJlN2ZdLCBbMHgyMDcwLCAweDIwOWZdLCBbMHgyMGEwLCAweDIwY2ZdLCBbMHgyMGQwLCAweDIwZmZdLCBbMHgyMTAwLCAweDIxNGZdLCBbMHgyMTUwLCAweDIxOGZdLCBbMHgyMTkwLCAweDIxZmYsIDB4MjdmMCwgMHgyN2ZmLCAweDI5MDAsIDB4Mjk3ZiwgMHgyYjAwLCAweDJiZmZdLCBbMHgyMjAwLCAweDIyZmYsIDB4MmEwMCwgMHgyYWZmLCAweDI3YzAsIDB4MjdlZiwgMHgyOTgwLCAweDI5ZmZdLCBbMHgyMzAwLCAweDIzZmZdLCBbMHgyNDAwLCAweDI0M2ZdLCBbMHgyNDQwLCAweDI0NWZdLCBbMHgyNDYwLCAweDI0ZmZdLCBbMHgyNTAwLCAweDI1N2ZdLCBbMHgyNTgwLCAweDI1OWZdLCBbMHgyNWEwLCAweDI1ZmZdLCBbMHgyNjAwLCAweDI2ZmZdLCBbMHgyNzAwLCAweDI3YmZdLCBbMHgzMDAwLCAweDMwM2ZdLCBbMHgzMDQwLCAweDMwOWZdLCBbMHgzMGEwLCAweDMwZmYsIDB4MzFmMCwgMHgzMWZmXSwgWzB4MzEwMCwgMHgzMTJmLCAweDMxYTAsIDB4MzFiZl0sIFsweDMxMzAsIDB4MzE4Zl0sIFsweGE4NDAsIDB4YTg3Zl0sIFsweDMyMDAsIDB4MzJmZl0sIFsweDMzMDAsIDB4MzNmZl0sIFsweGFjMDAsIDB4ZDdhZl0sIFsweGQ4MDAsIDB4ZGZmZl0sIFsweDEwOTAwLCAweDEwOTFmXSwgWzB4NGUwMCwgMHg5ZmZmLCAweDJlODAsIDB4MmVmZiwgMHgyZjAwLCAweDJmZGYsIDB4MmZmMCwgMHgyZmZmLCAweDM0MDAsIDB4NGRiZiwgMHgyMDAwMCwgMHgyYTZkZiwgMHgzMTkwLCAweDMxOWZdLCBbMHhlMDAwLCAweGY4ZmZdLCBbMHgzMWMwLCAweDMxZWYsIDB4ZjkwMCwgMHhmYWZmLCAweDJmODAwLCAweDJmYTFmXSwgWzB4ZmIwMCwgMHhmYjRmXSwgWzB4ZmI1MCwgMHhmZGZmXSwgWzB4ZmUyMCwgMHhmZTJmXSwgWzB4ZmUxMCwgMHhmZTFmXSwgWzB4ZmU1MCwgMHhmZTZmXSwgWzB4ZmU3MCwgMHhmZWZmXSwgWzB4ZmYwMCwgMHhmZmVmXSwgWzB4ZmZmMCwgMHhmZmZmXSwgWzB4MGYwMCwgMHgwZmZmXSwgWzB4MDcwMCwgMHgwNzRmXSwgWzB4MDc4MCwgMHgwN2JmXSwgWzB4MGQ4MCwgMHgwZGZmXSwgWzB4MTAwMCwgMHgxMDlmXSwgWzB4MTIwMCwgMHgxMzdmLCAweDEzODAsIDB4MTM5ZiwgMHgyZDgwLCAweDJkZGZdLCBbMHgxM2EwLCAweDEzZmZdLCBbMHgxNDAwLCAweDE2N2ZdLCBbMHgxNjgwLCAweDE2OWZdLCBbMHgxNmEwLCAweDE2ZmZdLCBbMHgxNzgwLCAweDE3ZmZdLCBbMHgxODAwLCAweDE4YWZdLCBbMHgyODAwLCAweDI4ZmZdLCBbMHhhMDAwLCAweGE0OGZdLCBbMHgxNzAwLCAweDE3MWYsIDB4MTcyMCwgMHgxNzNmLCAweDE3NDAsIDB4MTc1ZiwgMHgxNzYwLCAweDE3N2ZdLCBbMHgxMDMwMCwgMHgxMDMyZl0sIFsweDEwMzMwLCAweDEwMzRmXSwgWzB4MTA0MDAsIDB4MTA0NGZdLCBbMHgxZDAwMCwgMHgxZDBmZiwgMHgxZDEwMCwgMHgxZDFmZiwgMHgxZDIwMCwgMHgxZDI0Zl0sIFsweDFkNDAwLCAweDFkN2ZmXSwgWzB4ZmYwMDAsIDB4ZmZmZmRdLCBbMHhmZTAwLCAweGZlMGYsIDB4ZTAxMDAsIDB4ZTAxZWZdLCBbMHhlMDAwMCwgMHhlMDA3Zl0sIFsweDE5MDAsIDB4MTk0Zl0sIFsweDE5NTAsIDB4MTk3Zl0sIFsweDE5ODAsIDB4MTlkZl0sIFsweDFhMDAsIDB4MWExZl0sIFsweDJjMDAsIDB4MmM1Zl0sIFsweDJkMzAsIDB4MmQ3Zl0sIFsweDRkYzAsIDB4NGRmZl0sIFsweGE4MDAsIDB4YTgyZl0sIFsweDEwMDAwLCAweDEwMDdmLCAweDEwMDgwLCAweDEwMGZmLCAweDEwMTAwLCAweDEwMTNmXSwgWzB4MTAxNDAsIDB4MTAxOGZdLCBbMHgxMDM4MCwgMHgxMDM5Zl0sIFsweDEwM2EwLCAweDEwM2RmXSwgWzB4MTA0NTAsIDB4MTA0N2ZdLCBbMHgxMDQ4MCwgMHgxMDRhZl0sIFsweDEwODAwLCAweDEwODNmXSwgWzB4MTBhMDAsIDB4MTBhNWZdLCBbMHgxZDMwMCwgMHgxZDM1Zl0sIFsweDEyMDAwLCAweDEyM2ZmLCAweDEyNDAwLCAweDEyNDdmXSwgWzB4MWQzNjAsIDB4MWQzN2ZdLCBbMHgxYjgwLCAweDFiYmZdLCBbMHgxYzAwLCAweDFjNGZdLCBbMHgxYzUwLCAweDFjN2ZdLCBbMHhhODgwLCAweGE4ZGZdLCBbMHhhOTAwLCAweGE5MmZdLCBbMHhhOTMwLCAweGE5NWZdLCBbMHhhYTAwLCAweGFhNWZdLCBbMHgxMDE5MCwgMHgxMDFjZl0sIFsweDEwMWQwLCAweDEwMWZmXSwgWzB4MTAyYTAsIDB4MTAyZGYsIDB4MTAyODAsIDB4MTAyOWYsIDB4MTA5MjAsIDB4MTA5M2ZdLCBbMHgxZjAzMCwgMHgxZjA5ZiwgMHgxZjAwMCwgMHgxZjAyZl1dOwpmdW5jdGlvbiBnZXRVbmljb2RlUmFuZ2VGb3IodmFsdWUsIGxhc3RQb3NpdGlvbiA9IC0xKSB7CiAgaWYgKGxhc3RQb3NpdGlvbiAhPT0gLTEpIHsKICAgIGNvbnN0IHJhbmdlID0gVW5pY29kZVJhbmdlc1tsYXN0UG9zaXRpb25dOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcmFuZ2UubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBpZiAodmFsdWUgPj0gcmFuZ2VbaV0gJiYgdmFsdWUgPD0gcmFuZ2VbaSArIDFdKSB7CiAgICAgICAgcmV0dXJuIGxhc3RQb3NpdGlvbjsKICAgICAgfQogICAgfQogIH0KICBmb3IgKGxldCBpID0gMCwgaWkgPSBVbmljb2RlUmFuZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHJhbmdlID0gVW5pY29kZVJhbmdlc1tpXTsKICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJhbmdlLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHsKICAgICAgaWYgKHZhbHVlID49IHJhbmdlW2pdICYmIHZhbHVlIDw9IHJhbmdlW2ogKyAxXSkgewogICAgICAgIHJldHVybiBpOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiAtMTsKfQpjb25zdCBTcGVjaWFsQ2hhclJlZ0V4cCA9IG5ldyBSZWdFeHAoIl4oXFxzKXwoXFxwe01ufSl8KFxccHtDZn0pJCIsICJ1Iik7CmNvbnN0IENhdGVnb3J5Q2FjaGUgPSBuZXcgTWFwKCk7CmZ1bmN0aW9uIGdldENoYXJVbmljb2RlQ2F0ZWdvcnkoY2hhcikgewogIGNvbnN0IGNhY2hlZENhdGVnb3J5ID0gQ2F0ZWdvcnlDYWNoZS5nZXQoY2hhcik7CiAgaWYgKGNhY2hlZENhdGVnb3J5KSB7CiAgICByZXR1cm4gY2FjaGVkQ2F0ZWdvcnk7CiAgfQogIGNvbnN0IGdyb3VwcyA9IGNoYXIubWF0Y2goU3BlY2lhbENoYXJSZWdFeHApOwogIGNvbnN0IGNhdGVnb3J5ID0gewogICAgaXNXaGl0ZXNwYWNlOiAhIWdyb3Vwcz8uWzFdLAogICAgaXNaZXJvV2lkdGhEaWFjcml0aWM6ICEhZ3JvdXBzPy5bMl0sCiAgICBpc0ludmlzaWJsZUZvcm1hdE1hcms6ICEhZ3JvdXBzPy5bM10KICB9OwogIENhdGVnb3J5Q2FjaGUuc2V0KGNoYXIsIGNhdGVnb3J5KTsKICByZXR1cm4gY2F0ZWdvcnk7Cn0KZnVuY3Rpb24gY2xlYXJVbmljb2RlQ2FjaGVzKCkgewogIENhdGVnb3J5Q2FjaGUuY2xlYXIoKTsKfQoKOy8vIC4vc3JjL2NvcmUvZm9udHNfdXRpbHMuanMKCgoKCgpjb25zdCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQgPSB0cnVlOwpjb25zdCBGb250RmxhZ3MgPSB7CiAgRml4ZWRQaXRjaDogMSwKICBTZXJpZjogMiwKICBTeW1ib2xpYzogNCwKICBTY3JpcHQ6IDgsCiAgTm9uc3ltYm9saWM6IDMyLAogIEl0YWxpYzogNjQsCiAgQWxsQ2FwOiA2NTUzNiwKICBTbWFsbENhcDogMTMxMDcyLAogIEZvcmNlQm9sZDogMjYyMTQ0Cn07CmNvbnN0IE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZyA9IFsiLm5vdGRlZiIsICIubnVsbCIsICJub25tYXJraW5ncmV0dXJuIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXNpbmdsZSIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLCAiZ3JhdmUiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgIkFkaWVyZXNpcyIsICJBcmluZyIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiTnRpbGRlIiwgIk9kaWVyZXNpcyIsICJVZGllcmVzaXMiLCAiYWFjdXRlIiwgImFncmF2ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYXRpbGRlIiwgImFyaW5nIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlZ3JhdmUiLCAiZWNpcmN1bWZsZXgiLCAiZWRpZXJlc2lzIiwgImlhY3V0ZSIsICJpZ3JhdmUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwgIm50aWxkZSIsICJvYWN1dGUiLCAib2dyYXZlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvdGlsZGUiLCAidWFjdXRlIiwgInVncmF2ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAiZGFnZ2VyIiwgImRlZ3JlZSIsICJjZW50IiwgInN0ZXJsaW5nIiwgInNlY3Rpb24iLCAiYnVsbGV0IiwgInBhcmFncmFwaCIsICJnZXJtYW5kYmxzIiwgInJlZ2lzdGVyZWQiLCAiY29weXJpZ2h0IiwgInRyYWRlbWFyayIsICJhY3V0ZSIsICJkaWVyZXNpcyIsICJub3RlcXVhbCIsICJBRSIsICJPc2xhc2giLCAiaW5maW5pdHkiLCAicGx1c21pbnVzIiwgImxlc3NlcXVhbCIsICJncmVhdGVyZXF1YWwiLCAieWVuIiwgIm11IiwgInBhcnRpYWxkaWZmIiwgInN1bW1hdGlvbiIsICJwcm9kdWN0IiwgInBpIiwgImludGVncmFsIiwgIm9yZGZlbWluaW5lIiwgIm9yZG1hc2N1bGluZSIsICJPbWVnYSIsICJhZSIsICJvc2xhc2giLCAicXVlc3Rpb25kb3duIiwgImV4Y2xhbWRvd24iLCAibG9naWNhbG5vdCIsICJyYWRpY2FsIiwgImZsb3JpbiIsICJhcHByb3hlcXVhbCIsICJEZWx0YSIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgIm5vbmJyZWFraW5nc3BhY2UiLCAiQWdyYXZlIiwgIkF0aWxkZSIsICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJkaXZpZGUiLCAibG96ZW5nZSIsICJ5ZGllcmVzaXMiLCAiWWRpZXJlc2lzIiwgImZyYWN0aW9uIiwgImN1cnJlbmN5IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJwZXJ0aG91c2FuZCIsICJBY2lyY3VtZmxleCIsICJFY2lyY3VtZmxleCIsICJBYWN1dGUiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiYXBwbGUiLCAiT2dyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZ3JhdmUiLCAiZG90bGVzc2kiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgIkxzbGFzaCIsICJsc2xhc2giLCAiU2Nhcm9uIiwgInNjYXJvbiIsICJaY2Fyb24iLCAiemNhcm9uIiwgImJyb2tlbmJhciIsICJFdGgiLCAiZXRoIiwgIllhY3V0ZSIsICJ5YWN1dGUiLCAiVGhvcm4iLCAidGhvcm4iLCAibWludXMiLCAibXVsdGlwbHkiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJvbmVoYWxmIiwgIm9uZXF1YXJ0ZXIiLCAidGhyZWVxdWFydGVycyIsICJmcmFuYyIsICJHYnJldmUiLCAiZ2JyZXZlIiwgIklkb3RhY2NlbnQiLCAiU2NlZGlsbGEiLCAic2NlZGlsbGEiLCAiQ2FjdXRlIiwgImNhY3V0ZSIsICJDY2Fyb24iLCAiY2Nhcm9uIiwgImRjcm9hdCJdOwpmdW5jdGlvbiByZWNvdmVyR2x5cGhOYW1lKG5hbWUsIGdseXBoc1VuaWNvZGVNYXApIHsKICBpZiAoZ2x5cGhzVW5pY29kZU1hcFtuYW1lXSAhPT0gdW5kZWZpbmVkKSB7CiAgICByZXR1cm4gbmFtZTsKICB9CiAgY29uc3QgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChuYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgIGZvciAoY29uc3Qga2V5IGluIGdseXBoc1VuaWNvZGVNYXApIHsKICAgICAgaWYgKGdseXBoc1VuaWNvZGVNYXBba2V5XSA9PT0gdW5pY29kZSkgewogICAgICAgIHJldHVybiBrZXk7CiAgICAgIH0KICAgIH0KICB9CiAgaW5mbygiVW5hYmxlIHRvIHJlY292ZXIgYSBzdGFuZGFyZCBnbHlwaCBuYW1lIGZvcjogIiArIG5hbWUpOwogIHJldHVybiBuYW1lOwp9CmZ1bmN0aW9uIHR5cGUxRm9udEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcsIGdseXBoTmFtZXMpIHsKICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgbGV0IGdseXBoSWQsIGNoYXJDb2RlLCBiYXNlRW5jb2Rpbmc7CiAgY29uc3QgaXNTeW1ib2xpY0ZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgRm9udEZsYWdzLlN5bWJvbGljKTsKICBpZiAocHJvcGVydGllcy5pc0ludGVybmFsRm9udCkgewogICAgYmFzZUVuY29kaW5nID0gYnVpbHRJbkVuY29kaW5nOwogICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgYmFzZUVuY29kaW5nLmxlbmd0aDsgY2hhckNvZGUrKykgewogICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGJhc2VFbmNvZGluZ1tjaGFyQ29kZV0pOwogICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkID49IDAgPyBnbHlwaElkIDogMDsKICAgIH0KICB9IGVsc2UgaWYgKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSkgewogICAgYmFzZUVuY29kaW5nID0gZ2V0RW5jb2RpbmcocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lKTsKICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IGJhc2VFbmNvZGluZy5sZW5ndGg7IGNoYXJDb2RlKyspIHsKICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihiYXNlRW5jb2RpbmdbY2hhckNvZGVdKTsKICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZCA+PSAwID8gZ2x5cGhJZCA6IDA7CiAgICB9CiAgfSBlbHNlIGlmIChpc1N5bWJvbGljRm9udCkgewogICAgZm9yIChjaGFyQ29kZSBpbiBidWlsdEluRW5jb2RpbmcpIHsKICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gYnVpbHRJbkVuY29kaW5nW2NoYXJDb2RlXTsKICAgIH0KICB9IGVsc2UgewogICAgYmFzZUVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZzsKICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IGJhc2VFbmNvZGluZy5sZW5ndGg7IGNoYXJDb2RlKyspIHsKICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihiYXNlRW5jb2RpbmdbY2hhckNvZGVdKTsKICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZCA+PSAwID8gZ2x5cGhJZCA6IDA7CiAgICB9CiAgfQogIGNvbnN0IGRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlczsKICBsZXQgZ2x5cGhzVW5pY29kZU1hcDsKICBpZiAoZGlmZmVyZW5jZXMpIHsKICAgIGZvciAoY2hhckNvZGUgaW4gZGlmZmVyZW5jZXMpIHsKICAgICAgY29uc3QgZ2x5cGhOYW1lID0gZGlmZmVyZW5jZXNbY2hhckNvZGVdOwogICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGdseXBoTmFtZSk7CiAgICAgIGlmIChnbHlwaElkID09PSAtMSkgewogICAgICAgIGlmICghZ2x5cGhzVW5pY29kZU1hcCkgewogICAgICAgICAgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RhbmRhcmRHbHlwaE5hbWUgPSByZWNvdmVyR2x5cGhOYW1lKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICAgICAgaWYgKHN0YW5kYXJkR2x5cGhOYW1lICE9PSBnbHlwaE5hbWUpIHsKICAgICAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2Yoc3RhbmRhcmRHbHlwaE5hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkID49IDAgPyBnbHlwaElkIDogMDsKICAgIH0KICB9CiAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkOwp9CmZ1bmN0aW9uIG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpIHsKICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKC9bLF9dL2csICItIikucmVwbGFjZUFsbCgvXHMvZywgIiIpOwp9CmNvbnN0IGdldFZlcnRpY2FsUHJlc2VudGF0aW9uRm9ybSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeSh0ID0+IHsKICB0WzB4MjAxM10gPSAweGZlMzI7CiAgdFsweDIwMTRdID0gMHhmZTMxOwogIHRbMHgyMDI1XSA9IDB4ZmUzMDsKICB0WzB4MjAyNl0gPSAweGZlMTk7CiAgdFsweDMwMDFdID0gMHhmZTExOwogIHRbMHgzMDAyXSA9IDB4ZmUxMjsKICB0WzB4MzAwOF0gPSAweGZlM2Y7CiAgdFsweDMwMDldID0gMHhmZTQwOwogIHRbMHgzMDBhXSA9IDB4ZmUzZDsKICB0WzB4MzAwYl0gPSAweGZlM2U7CiAgdFsweDMwMGNdID0gMHhmZTQxOwogIHRbMHgzMDBkXSA9IDB4ZmU0MjsKICB0WzB4MzAwZV0gPSAweGZlNDM7CiAgdFsweDMwMGZdID0gMHhmZTQ0OwogIHRbMHgzMDEwXSA9IDB4ZmUzYjsKICB0WzB4MzAxMV0gPSAweGZlM2M7CiAgdFsweDMwMTRdID0gMHhmZTM5OwogIHRbMHgzMDE1XSA9IDB4ZmUzYTsKICB0WzB4MzAxNl0gPSAweGZlMTc7CiAgdFsweDMwMTddID0gMHhmZTE4OwogIHRbMHhmZTRmXSA9IDB4ZmUzNDsKICB0WzB4ZmYwMV0gPSAweGZlMTU7CiAgdFsweGZmMDhdID0gMHhmZTM1OwogIHRbMHhmZjA5XSA9IDB4ZmUzNjsKICB0WzB4ZmYwY10gPSAweGZlMTA7CiAgdFsweGZmMWFdID0gMHhmZTEzOwogIHRbMHhmZjFiXSA9IDB4ZmUxNDsKICB0WzB4ZmYxZl0gPSAweGZlMTY7CiAgdFsweGZmM2JdID0gMHhmZTQ3OwogIHRbMHhmZjNkXSA9IDB4ZmU0ODsKICB0WzB4ZmYzZl0gPSAweGZlMzM7CiAgdFsweGZmNWJdID0gMHhmZTM3OwogIHRbMHhmZjVkXSA9IDB4ZmUzODsKfSk7Cgo7Ly8gLi9zcmMvY29yZS9zdGFuZGFyZF9mb250cy5qcwoKCmNvbnN0IGdldFN0ZEZvbnRNYXAgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WyJUaW1lcy1Sb21hbiJdID0gIlRpbWVzLVJvbWFuIjsKICB0LkhlbHZldGljYSA9ICJIZWx2ZXRpY2EiOwogIHQuQ291cmllciA9ICJDb3VyaWVyIjsKICB0LlN5bWJvbCA9ICJTeW1ib2wiOwogIHRbIlRpbWVzLUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJDb3VyaWVyLUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOwogIHQuWmFwZkRpbmdiYXRzID0gIlphcGZEaW5nYmF0cyI7CiAgdFsiVGltZXMtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHRbIlRpbWVzLUJvbGRJdGFsaWMiXSA9ICJUaW1lcy1Cb2xkSXRhbGljIjsKICB0WyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0LkFyaWFsTmFycm93ID0gIkhlbHZldGljYSI7CiAgdFsiQXJpYWxOYXJyb3ctQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJBcmlhbE5hcnJvdy1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJBcmlhbE5hcnJvdy1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdC5BcmlhbEJsYWNrID0gIkhlbHZldGljYSI7CiAgdFsiQXJpYWxCbGFjay1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsQmxhY2stQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWxCbGFjay1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQmxhY2siXSA9ICJIZWx2ZXRpY2EiOwogIHRbIkFyaWFsLUJsYWNrLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQXJpYWwtQmxhY2stQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQmxhY2stSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQXJpYWwgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbC1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0LkFyaWFsTVQgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbC1Cb2xkSXRhbGljTVQiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsLUJvbGRNVCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJBcmlhbC1JdGFsaWNNVCJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJBcmlhbC1Cb2xkSXRhbGljTVQtQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQm9sZE1ULUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQXJpYWwtSXRhbGljTVQtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQXJpYWxVbmljb2RlTVMgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbFVuaWNvZGVNUy1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsVW5pY29kZU1TLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsVW5pY29kZU1TLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJDb3VyaWVyLUJvbGRJdGFsaWMiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0WyJDb3VyaWVyLUl0YWxpYyJdID0gIkNvdXJpZXItT2JsaXF1ZSI7CiAgdC5Db3VyaWVyTmV3ID0gIkNvdXJpZXIiOwogIHRbIkNvdXJpZXJOZXctQm9sZCJdID0gIkNvdXJpZXItQm9sZCI7CiAgdFsiQ291cmllck5ldy1Cb2xkSXRhbGljIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CiAgdFsiQ291cmllck5ldy1JdGFsaWMiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHRbIkNvdXJpZXJOZXdQUy1Cb2xkSXRhbGljTVQiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0WyJDb3VyaWVyTmV3UFMtQm9sZE1UIl0gPSAiQ291cmllci1Cb2xkIjsKICB0WyJDb3VyaWVyTmV3UFMtSXRhbGljTVQiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHQuQ291cmllck5ld1BTTVQgPSAiQ291cmllciI7CiAgdFsiSGVsdmV0aWNhLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkhlbHZldGljYS1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiSGVsdmV0aWNhTFRTdGQtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJTeW1ib2wtQm9sZCJdID0gIlN5bWJvbCI7CiAgdFsiU3ltYm9sLUJvbGRJdGFsaWMiXSA9ICJTeW1ib2wiOwogIHRbIlN5bWJvbC1JdGFsaWMiXSA9ICJTeW1ib2wiOwogIHQuVGltZXNOZXdSb21hbiA9ICJUaW1lcy1Sb21hbiI7CiAgdFsiVGltZXNOZXdSb21hbi1Cb2xkIl0gPSAiVGltZXMtQm9sZCI7CiAgdFsiVGltZXNOZXdSb21hbi1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CiAgdFsiVGltZXNOZXdSb21hbi1JdGFsaWMiXSA9ICJUaW1lcy1JdGFsaWMiOwogIHQuVGltZXNOZXdSb21hblBTID0gIlRpbWVzLVJvbWFuIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZCJdID0gIlRpbWVzLUJvbGQiOwogIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CiAgdFsiVGltZXNOZXdSb21hblBTLUJvbGRJdGFsaWNNVCJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOwogIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkTVQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtSXRhbGljTVQiXSA9ICJUaW1lcy1JdGFsaWMiOwogIHQuVGltZXNOZXdSb21hblBTTVQgPSAiVGltZXMtUm9tYW4iOwogIHRbIlRpbWVzTmV3Um9tYW5QU01ULUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CiAgdFsiVGltZXNOZXdSb21hblBTTVQtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKfSk7CmNvbnN0IGdldEZvbnROYW1lVG9GaWxlTWFwID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdC5Db3VyaWVyID0gIkZveGl0Rml4ZWQucGZiIjsKICB0WyJDb3VyaWVyLUJvbGQiXSA9ICJGb3hpdEZpeGVkQm9sZC5wZmIiOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9ICJGb3hpdEZpeGVkQm9sZEl0YWxpYy5wZmIiOwogIHRbIkNvdXJpZXItT2JsaXF1ZSJdID0gIkZveGl0Rml4ZWRJdGFsaWMucGZiIjsKICB0LkhlbHZldGljYSA9ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiI7CiAgdFsiSGVsdmV0aWNhLUJvbGQiXSA9ICJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiI7CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYiOwogIHRbIkhlbHZldGljYS1PYmxpcXVlIl0gPSAiTGliZXJhdGlvblNhbnMtSXRhbGljLnR0ZiI7CiAgdFsiVGltZXMtUm9tYW4iXSA9ICJGb3hpdFNlcmlmLnBmYiI7CiAgdFsiVGltZXMtQm9sZCJdID0gIkZveGl0U2VyaWZCb2xkLnBmYiI7CiAgdFsiVGltZXMtQm9sZEl0YWxpYyJdID0gIkZveGl0U2VyaWZCb2xkSXRhbGljLnBmYiI7CiAgdFsiVGltZXMtSXRhbGljIl0gPSAiRm94aXRTZXJpZkl0YWxpYy5wZmIiOwogIHQuU3ltYm9sID0gIkZveGl0U3ltYm9sLnBmYiI7CiAgdC5aYXBmRGluZ2JhdHMgPSAiRm94aXREaW5nYmF0cy5wZmIiOwogIHRbIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiXSA9ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiI7CiAgdFsiTGliZXJhdGlvblNhbnMtQm9sZCJdID0gIkxpYmVyYXRpb25TYW5zLUJvbGQudHRmIjsKICB0WyJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiXSA9ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMudHRmIjsKICB0WyJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIl0gPSAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYiOwp9KTsKY29uc3QgZ2V0Tm9uU3RkRm9udE1hcCA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHQuQ2FsaWJyaSA9ICJIZWx2ZXRpY2EiOwogIHRbIkNhbGlicmktQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJDYWxpYnJpLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkNhbGlicmktSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQ2VudHVyeUdvdGhpYyA9ICJIZWx2ZXRpY2EiOwogIHRbIkNlbnR1cnlHb3RoaWMtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJDZW50dXJ5R290aGljLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkNlbnR1cnlHb3RoaWMtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQ29taWNTYW5zTVMgPSAiQ29taWMgU2FucyBNUyI7CiAgdFsiQ29taWNTYW5zTVMtQm9sZCJdID0gIkNvbWljIFNhbnMgTVMtQm9sZCI7CiAgdFsiQ29taWNTYW5zTVMtQm9sZEl0YWxpYyJdID0gIkNvbWljIFNhbnMgTVMtQm9sZEl0YWxpYyI7CiAgdFsiQ29taWNTYW5zTVMtSXRhbGljIl0gPSAiQ29taWMgU2FucyBNUy1JdGFsaWMiOwogIHQuR2lsbFNhbnNNVCA9ICJIZWx2ZXRpY2EiOwogIHRbIkdpbGxTYW5zTVQtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJHaWxsU2Fuc01ULUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkdpbGxTYW5zTVQtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuSW1wYWN0ID0gIkhlbHZldGljYSI7CiAgdFsiSXRjU3ltYm9sLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiSXRjU3ltYm9sLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkl0Y1N5bWJvbC1Cb29rIl0gPSAiSGVsdmV0aWNhIjsKICB0WyJJdGNTeW1ib2wtQm9va0l0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJJdGNTeW1ib2wtTWVkaXVtIl0gPSAiSGVsdmV0aWNhIjsKICB0WyJJdGNTeW1ib2wtTWVkaXVtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuTHVjaWRhQ29uc29sZSA9ICJDb3VyaWVyIjsKICB0WyJMdWNpZGFDb25zb2xlLUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOwogIHRbIkx1Y2lkYUNvbnNvbGUtQm9sZEl0YWxpYyJdID0gIkNvdXJpZXItQm9sZE9ibGlxdWUiOwogIHRbIkx1Y2lkYUNvbnNvbGUtSXRhbGljIl0gPSAiQ291cmllci1PYmxpcXVlIjsKICB0WyJMdWNpZGFTYW5zLURlbWkiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiTVMtR290aGljIl0gPSAiTVMgR290aGljIjsKICB0WyJNUy1Hb3RoaWMtQm9sZCJdID0gIk1TIEdvdGhpYy1Cb2xkIjsKICB0WyJNUy1Hb3RoaWMtQm9sZEl0YWxpYyJdID0gIk1TIEdvdGhpYy1Cb2xkSXRhbGljIjsKICB0WyJNUy1Hb3RoaWMtSXRhbGljIl0gPSAiTVMgR290aGljLUl0YWxpYyI7CiAgdFsiTVMtTWluY2hvIl0gPSAiTVMgTWluY2hvIjsKICB0WyJNUy1NaW5jaG8tQm9sZCJdID0gIk1TIE1pbmNoby1Cb2xkIjsKICB0WyJNUy1NaW5jaG8tQm9sZEl0YWxpYyJdID0gIk1TIE1pbmNoby1Cb2xkSXRhbGljIjsKICB0WyJNUy1NaW5jaG8tSXRhbGljIl0gPSAiTVMgTWluY2hvLUl0YWxpYyI7CiAgdFsiTVMtUEdvdGhpYyJdID0gIk1TIFBHb3RoaWMiOwogIHRbIk1TLVBHb3RoaWMtQm9sZCJdID0gIk1TIFBHb3RoaWMtQm9sZCI7CiAgdFsiTVMtUEdvdGhpYy1Cb2xkSXRhbGljIl0gPSAiTVMgUEdvdGhpYy1Cb2xkSXRhbGljIjsKICB0WyJNUy1QR290aGljLUl0YWxpYyJdID0gIk1TIFBHb3RoaWMtSXRhbGljIjsKICB0WyJNUy1QTWluY2hvIl0gPSAiTVMgUE1pbmNobyI7CiAgdFsiTVMtUE1pbmNoby1Cb2xkIl0gPSAiTVMgUE1pbmNoby1Cb2xkIjsKICB0WyJNUy1QTWluY2hvLUJvbGRJdGFsaWMiXSA9ICJNUyBQTWluY2hvLUJvbGRJdGFsaWMiOwogIHRbIk1TLVBNaW5jaG8tSXRhbGljIl0gPSAiTVMgUE1pbmNoby1JdGFsaWMiOwogIHQuTnVwdGlhbFNjcmlwdCA9ICJUaW1lcy1JdGFsaWMiOwogIHQuU2Vnb2VVSVN5bWJvbCA9ICJIZWx2ZXRpY2EiOwp9KTsKY29uc3QgZ2V0U2VyaWZGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHRbIkFkb2JlIEplbnNvbiJdID0gdHJ1ZTsKICB0WyJBZG9iZSBUZXh0Il0gPSB0cnVlOwogIHQuQWxiZXJ0dXMgPSB0cnVlOwogIHQuQWxkdXMgPSB0cnVlOwogIHQuQWxleGFuZHJpYSA9IHRydWU7CiAgdC5BbGdlcmlhbiA9IHRydWU7CiAgdFsiQW1lcmljYW4gVHlwZXdyaXRlciJdID0gdHJ1ZTsKICB0LkFudGlxdWEgPSB0cnVlOwogIHQuQXBleCA9IHRydWU7CiAgdC5Bcm5vID0gdHJ1ZTsKICB0LkFzdGVyID0gdHJ1ZTsKICB0LkF1cm9yYSA9IHRydWU7CiAgdC5CYXNrZXJ2aWxsZSA9IHRydWU7CiAgdC5CZWxsID0gdHJ1ZTsKICB0LkJlbWJvID0gdHJ1ZTsKICB0WyJCZW1ibyBTY2hvb2xib29rIl0gPSB0cnVlOwogIHQuQmVuZ3VpYXQgPSB0cnVlOwogIHRbIkJlcmtlbGV5IE9sZCBTdHlsZSJdID0gdHJ1ZTsKICB0WyJCZXJuaGFyZCBNb2Rlcm4iXSA9IHRydWU7CiAgdFsiQmVydGhvbGQgQ2l0eSJdID0gdHJ1ZTsKICB0LkJvZG9uaSA9IHRydWU7CiAgdFsiQmF1ZXIgQm9kb25pIl0gPSB0cnVlOwogIHRbIkJvb2sgQW50aXF1YSJdID0gdHJ1ZTsKICB0LkJvb2ttYW4gPSB0cnVlOwogIHRbIkJvcmRlYXV4IFJvbWFuIl0gPSB0cnVlOwogIHRbIkNhbGlmb3JuaWFuIEZCIl0gPSB0cnVlOwogIHQuQ2FsaXN0byA9IHRydWU7CiAgdC5DYWx2ZXJ0ID0gdHJ1ZTsKICB0LkNhcGl0YWxzID0gdHJ1ZTsKICB0LkNhbWJyaWEgPSB0cnVlOwogIHQuQ2FydGllciA9IHRydWU7CiAgdC5DYXNsb24gPSB0cnVlOwogIHQuQ2F0dWxsID0gdHJ1ZTsKICB0LkNlbnRhdXIgPSB0cnVlOwogIHRbIkNlbnR1cnkgT2xkIFN0eWxlIl0gPSB0cnVlOwogIHRbIkNlbnR1cnkgU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0LkNoYXBhcnJhbCA9IHRydWU7CiAgdFsiQ2hhcmlzIFNJTCJdID0gdHJ1ZTsKICB0LkNoZWx0ZW5oYW0gPSB0cnVlOwogIHRbIkNob2xsYSBTbGFiIl0gPSB0cnVlOwogIHQuQ2xhcmVuZG9uID0gdHJ1ZTsKICB0LkNsZWFyZmFjZSA9IHRydWU7CiAgdC5Db2NoaW4gPSB0cnVlOwogIHQuQ29sb25uYSA9IHRydWU7CiAgdFsiQ29tcHV0ZXIgTW9kZXJuIl0gPSB0cnVlOwogIHRbIkNvbmNyZXRlIFJvbWFuIl0gPSB0cnVlOwogIHQuQ29uc3RhbnRpYSA9IHRydWU7CiAgdFsiQ29vcGVyIEJsYWNrIl0gPSB0cnVlOwogIHQuQ29yb25hID0gdHJ1ZTsKICB0LkVjb3R5cGUgPSB0cnVlOwogIHQuRWd5cHRpZW5uZSA9IHRydWU7CiAgdC5FbGVwaGFudCA9IHRydWU7CiAgdC5FeGNlbHNpb3IgPSB0cnVlOwogIHQuRmFpcmZpZWxkID0gdHJ1ZTsKICB0WyJGRiBTY2FsYSJdID0gdHJ1ZTsKICB0LkZvbGthcmQgPSB0cnVlOwogIHQuRm9vdGxpZ2h0ID0gdHJ1ZTsKICB0LkZyZWVTZXJpZiA9IHRydWU7CiAgdFsiRnJpeiBRdWFkcmF0YSJdID0gdHJ1ZTsKICB0LkdhcmFtb25kID0gdHJ1ZTsKICB0LkdlbnRpdW0gPSB0cnVlOwogIHQuR2VvcmdpYSA9IHRydWU7CiAgdC5HbG91Y2VzdGVyID0gdHJ1ZTsKICB0WyJHb3VkeSBPbGQgU3R5bGUiXSA9IHRydWU7CiAgdFsiR291ZHkgU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0WyJHb3VkeSBQcm8gRm9udCJdID0gdHJ1ZTsKICB0LkdyYW5qb24gPSB0cnVlOwogIHRbIkd1YXJkaWFuIEVneXB0aWFuIl0gPSB0cnVlOwogIHQuSGVhdGhlciA9IHRydWU7CiAgdC5IZXJjdWxlcyA9IHRydWU7CiAgdFsiSGlnaCBUb3dlciBUZXh0Il0gPSB0cnVlOwogIHQuSGlyb3NoaWdlID0gdHJ1ZTsKICB0WyJIb2VmbGVyIFRleHQiXSA9IHRydWU7CiAgdFsiSHVtYW5hIFNlcmlmIl0gPSB0cnVlOwogIHQuSW1wcmludCA9IHRydWU7CiAgdFsiSW9uaWMgTm8uIDUiXSA9IHRydWU7CiAgdC5KYW5zb24gPSB0cnVlOwogIHQuSm9hbm5hID0gdHJ1ZTsKICB0LktvcmlubmEgPSB0cnVlOwogIHQuTGV4aWNvbiA9IHRydWU7CiAgdC5MaWJlcmF0aW9uU2VyaWYgPSB0cnVlOwogIHRbIkxpYmVyYXRpb24gU2VyaWYiXSA9IHRydWU7CiAgdFsiTGludXggTGliZXJ0aW5lIl0gPSB0cnVlOwogIHQuTGl0ZXJhdHVybmF5YSA9IHRydWU7CiAgdC5MdWNpZGEgPSB0cnVlOwogIHRbIkx1Y2lkYSBCcmlnaHQiXSA9IHRydWU7CiAgdC5NZWxpb3IgPSB0cnVlOwogIHQuTWVtcGhpcyA9IHRydWU7CiAgdC5NaWxsZXIgPSB0cnVlOwogIHQuTWluaW9uID0gdHJ1ZTsKICB0Lk1vZGVybiA9IHRydWU7CiAgdFsiTW9uYSBMaXNhIl0gPSB0cnVlOwogIHRbIk1ycyBFYXZlcyJdID0gdHJ1ZTsKICB0WyJNUyBTZXJpZiJdID0gdHJ1ZTsKICB0WyJNdXNlbyBTbGFiIl0gPSB0cnVlOwogIHRbIk5ldyBZb3JrIl0gPSB0cnVlOwogIHRbIk5pbWJ1cyBSb21hbiJdID0gdHJ1ZTsKICB0WyJOUFMgUmF3bGluc29uIFJvYWR3YXkiXSA9IHRydWU7CiAgdC5OdXB0aWFsU2NyaXB0ID0gdHJ1ZTsKICB0LlBhbGF0aW5vID0gdHJ1ZTsKICB0LlBlcnBldHVhID0gdHJ1ZTsKICB0LlBsYW50aW4gPSB0cnVlOwogIHRbIlBsYW50aW4gU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0LlBsYXliaWxsID0gdHJ1ZTsKICB0WyJQb29yIFJpY2hhcmQiXSA9IHRydWU7CiAgdFsiUmF3bGluc29uIFJvYWR3YXkiXSA9IHRydWU7CiAgdC5SZW5hdWx0ID0gdHJ1ZTsKICB0LlJlcXVpZW0gPSB0cnVlOwogIHQuUm9ja3dlbGwgPSB0cnVlOwogIHQuUm9tYW4gPSB0cnVlOwogIHRbIlJvdGlzIFNlcmlmIl0gPSB0cnVlOwogIHQuU2Fib24gPSB0cnVlOwogIHQuU2NhbGEgPSB0cnVlOwogIHQuU2VhZ3VsbCA9IHRydWU7CiAgdC5TaXN0aW5hID0gdHJ1ZTsKICB0LlNvdXZlbmlyID0gdHJ1ZTsKICB0LlNUSVggPSB0cnVlOwogIHRbIlN0b25lIEluZm9ybWFsIl0gPSB0cnVlOwogIHRbIlN0b25lIFNlcmlmIl0gPSB0cnVlOwogIHQuU3lsZmFlbiA9IHRydWU7CiAgdC5UaW1lcyA9IHRydWU7CiAgdC5UcmFqYW4gPSB0cnVlOwogIHRbIlRyaW5pdMOpIl0gPSB0cnVlOwogIHRbIlRydW1wIE1lZGlhZXZhbCJdID0gdHJ1ZTsKICB0LlV0b3BpYSA9IHRydWU7CiAgdFsiVmFsZSBUeXBlIl0gPSB0cnVlOwogIHRbIkJpdHN0cmVhbSBWZXJhIl0gPSB0cnVlOwogIHRbIlZlcmEgU2VyaWYiXSA9IHRydWU7CiAgdC5WZXJzYWlsbGVzID0gdHJ1ZTsKICB0LldhbnRlZCA9IHRydWU7CiAgdC5XZWlzcyA9IHRydWU7CiAgdFsiV2lkZSBMYXRpbiJdID0gdHJ1ZTsKICB0LldpbmRzb3IgPSB0cnVlOwogIHQuWElUUyA9IHRydWU7Cn0pOwpjb25zdCBnZXRTeW1ib2xzRm9udHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkRpbmdiYXRzID0gdHJ1ZTsKICB0LlN5bWJvbCA9IHRydWU7CiAgdC5aYXBmRGluZ2JhdHMgPSB0cnVlOwogIHQuV2luZ2RpbmdzID0gdHJ1ZTsKICB0WyJXaW5nZGluZ3MtQm9sZCJdID0gdHJ1ZTsKICB0WyJXaW5nZGluZ3MtUmVndWxhciJdID0gdHJ1ZTsKfSk7CmNvbnN0IGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHRbMl0gPSAxMDsKICB0WzNdID0gMzI7CiAgdFs0XSA9IDMzOwogIHRbNV0gPSAzNDsKICB0WzZdID0gMzU7CiAgdFs3XSA9IDM2OwogIHRbOF0gPSAzNzsKICB0WzldID0gMzg7CiAgdFsxMF0gPSAzOTsKICB0WzExXSA9IDQwOwogIHRbMTJdID0gNDE7CiAgdFsxM10gPSA0MjsKICB0WzE0XSA9IDQzOwogIHRbMTVdID0gNDQ7CiAgdFsxNl0gPSA0NTsKICB0WzE3XSA9IDQ2OwogIHRbMThdID0gNDc7CiAgdFsxOV0gPSA0ODsKICB0WzIwXSA9IDQ5OwogIHRbMjFdID0gNTA7CiAgdFsyMl0gPSA1MTsKICB0WzIzXSA9IDUyOwogIHRbMjRdID0gNTM7CiAgdFsyNV0gPSA1NDsKICB0WzI2XSA9IDU1OwogIHRbMjddID0gNTY7CiAgdFsyOF0gPSA1NzsKICB0WzI5XSA9IDU4OwogIHRbMzBdID0gODk0OwogIHRbMzFdID0gNjA7CiAgdFszMl0gPSA2MTsKICB0WzMzXSA9IDYyOwogIHRbMzRdID0gNjM7CiAgdFszNV0gPSA2NDsKICB0WzM2XSA9IDY1OwogIHRbMzddID0gNjY7CiAgdFszOF0gPSA2NzsKICB0WzM5XSA9IDY4OwogIHRbNDBdID0gNjk7CiAgdFs0MV0gPSA3MDsKICB0WzQyXSA9IDcxOwogIHRbNDNdID0gNzI7CiAgdFs0NF0gPSA3MzsKICB0WzQ1XSA9IDc0OwogIHRbNDZdID0gNzU7CiAgdFs0N10gPSA3NjsKICB0WzQ4XSA9IDc3OwogIHRbNDldID0gNzg7CiAgdFs1MF0gPSA3OTsKICB0WzUxXSA9IDgwOwogIHRbNTJdID0gODE7CiAgdFs1M10gPSA4MjsKICB0WzU0XSA9IDgzOwogIHRbNTVdID0gODQ7CiAgdFs1Nl0gPSA4NTsKICB0WzU3XSA9IDg2OwogIHRbNThdID0gODc7CiAgdFs1OV0gPSA4ODsKICB0WzYwXSA9IDg5OwogIHRbNjFdID0gOTA7CiAgdFs2Ml0gPSA5MTsKICB0WzYzXSA9IDkyOwogIHRbNjRdID0gOTM7CiAgdFs2NV0gPSA5NDsKICB0WzY2XSA9IDk1OwogIHRbNjddID0gOTY7CiAgdFs2OF0gPSA5NzsKICB0WzY5XSA9IDk4OwogIHRbNzBdID0gOTk7CiAgdFs3MV0gPSAxMDA7CiAgdFs3Ml0gPSAxMDE7CiAgdFs3M10gPSAxMDI7CiAgdFs3NF0gPSAxMDM7CiAgdFs3NV0gPSAxMDQ7CiAgdFs3Nl0gPSAxMDU7CiAgdFs3N10gPSAxMDY7CiAgdFs3OF0gPSAxMDc7CiAgdFs3OV0gPSAxMDg7CiAgdFs4MF0gPSAxMDk7CiAgdFs4MV0gPSAxMTA7CiAgdFs4Ml0gPSAxMTE7CiAgdFs4M10gPSAxMTI7CiAgdFs4NF0gPSAxMTM7CiAgdFs4NV0gPSAxMTQ7CiAgdFs4Nl0gPSAxMTU7CiAgdFs4N10gPSAxMTY7CiAgdFs4OF0gPSAxMTc7CiAgdFs4OV0gPSAxMTg7CiAgdFs5MF0gPSAxMTk7CiAgdFs5MV0gPSAxMjA7CiAgdFs5Ml0gPSAxMjE7CiAgdFs5M10gPSAxMjI7CiAgdFs5NF0gPSAxMjM7CiAgdFs5NV0gPSAxMjQ7CiAgdFs5Nl0gPSAxMjU7CiAgdFs5N10gPSAxMjY7CiAgdFs5OF0gPSAxOTY7CiAgdFs5OV0gPSAxOTc7CiAgdFsxMDBdID0gMTk5OwogIHRbMTAxXSA9IDIwMTsKICB0WzEwMl0gPSAyMDk7CiAgdFsxMDNdID0gMjE0OwogIHRbMTA0XSA9IDIyMDsKICB0WzEwNV0gPSAyMjU7CiAgdFsxMDZdID0gMjI0OwogIHRbMTA3XSA9IDIyNjsKICB0WzEwOF0gPSAyMjg7CiAgdFsxMDldID0gMjI3OwogIHRbMTEwXSA9IDIyOTsKICB0WzExMV0gPSAyMzE7CiAgdFsxMTJdID0gMjMzOwogIHRbMTEzXSA9IDIzMjsKICB0WzExNF0gPSAyMzQ7CiAgdFsxMTVdID0gMjM1OwogIHRbMTE2XSA9IDIzNzsKICB0WzExN10gPSAyMzY7CiAgdFsxMThdID0gMjM4OwogIHRbMTE5XSA9IDIzOTsKICB0WzEyMF0gPSAyNDE7CiAgdFsxMjFdID0gMjQzOwogIHRbMTIyXSA9IDI0MjsKICB0WzEyM10gPSAyNDQ7CiAgdFsxMjRdID0gMjQ2OwogIHRbMTI1XSA9IDI0NTsKICB0WzEyNl0gPSAyNTA7CiAgdFsxMjddID0gMjQ5OwogIHRbMTI4XSA9IDI1MTsKICB0WzEyOV0gPSAyNTI7CiAgdFsxMzBdID0gODIyNDsKICB0WzEzMV0gPSAxNzY7CiAgdFsxMzJdID0gMTYyOwogIHRbMTMzXSA9IDE2MzsKICB0WzEzNF0gPSAxNjc7CiAgdFsxMzVdID0gODIyNjsKICB0WzEzNl0gPSAxODI7CiAgdFsxMzddID0gMjIzOwogIHRbMTM4XSA9IDE3NDsKICB0WzEzOV0gPSAxNjk7CiAgdFsxNDBdID0gODQ4MjsKICB0WzE0MV0gPSAxODA7CiAgdFsxNDJdID0gMTY4OwogIHRbMTQzXSA9IDg4MDA7CiAgdFsxNDRdID0gMTk4OwogIHRbMTQ1XSA9IDIxNjsKICB0WzE0Nl0gPSA4NzM0OwogIHRbMTQ3XSA9IDE3NzsKICB0WzE0OF0gPSA4ODA0OwogIHRbMTQ5XSA9IDg4MDU7CiAgdFsxNTBdID0gMTY1OwogIHRbMTUxXSA9IDE4MTsKICB0WzE1Ml0gPSA4NzA2OwogIHRbMTUzXSA9IDg3MjE7CiAgdFsxNTRdID0gODcxOTsKICB0WzE1Nl0gPSA4NzQ3OwogIHRbMTU3XSA9IDE3MDsKICB0WzE1OF0gPSAxODY7CiAgdFsxNTldID0gODQ4NjsKICB0WzE2MF0gPSAyMzA7CiAgdFsxNjFdID0gMjQ4OwogIHRbMTYyXSA9IDE5MTsKICB0WzE2M10gPSAxNjE7CiAgdFsxNjRdID0gMTcyOwogIHRbMTY1XSA9IDg3MzA7CiAgdFsxNjZdID0gNDAyOwogIHRbMTY3XSA9IDg3NzY7CiAgdFsxNjhdID0gODcxMDsKICB0WzE2OV0gPSAxNzE7CiAgdFsxNzBdID0gMTg3OwogIHRbMTcxXSA9IDgyMzA7CiAgdFsxNzldID0gODIyMDsKICB0WzE4MF0gPSA4MjIxOwogIHRbMTgxXSA9IDgyMTY7CiAgdFsxODJdID0gODIxNzsKICB0WzIwMF0gPSAxOTM7CiAgdFsyMDNdID0gMjA1OwogIHRbMjA3XSA9IDIxMTsKICB0WzIxMF0gPSAyMTg7CiAgdFsyMjNdID0gNzExOwogIHRbMjI0XSA9IDMyMTsKICB0WzIyNV0gPSAzMjI7CiAgdFsyMjZdID0gMzUyOwogIHRbMjI3XSA9IDM1MzsKICB0WzIyOF0gPSAzODE7CiAgdFsyMjldID0gMzgyOwogIHRbMjMzXSA9IDIyMTsKICB0WzIzNF0gPSAyNTM7CiAgdFsyNTJdID0gMjYzOwogIHRbMjUzXSA9IDI2ODsKICB0WzI1NF0gPSAyNjk7CiAgdFsyNThdID0gMjU4OwogIHRbMjYwXSA9IDI2MDsKICB0WzI2MV0gPSAyNjE7CiAgdFsyNjVdID0gMjgwOwogIHRbMjY2XSA9IDI4MTsKICB0WzI2N10gPSAyODI7CiAgdFsyNjhdID0gMjgzOwogIHRbMjY5XSA9IDMxMzsKICB0WzI3NV0gPSAzMjM7CiAgdFsyNzZdID0gMzI0OwogIHRbMjc4XSA9IDMyODsKICB0WzI4M10gPSAzNDQ7CiAgdFsyODRdID0gMzQ1OwogIHRbMjg1XSA9IDM0NjsKICB0WzI4Nl0gPSAzNDc7CiAgdFsyOTJdID0gMzY3OwogIHRbMjk1XSA9IDM3NzsKICB0WzI5Nl0gPSAzNzg7CiAgdFsyOThdID0gMzgwOwogIHRbMzA1XSA9IDk2MzsKICB0WzMwNl0gPSA5NjQ7CiAgdFszMDddID0gOTY2OwogIHRbMzA4XSA9IDgyMTU7CiAgdFszMDldID0gODI1MjsKICB0WzMxMF0gPSA4MzE5OwogIHRbMzExXSA9IDgzNTk7CiAgdFszMTJdID0gODU5MjsKICB0WzMxM10gPSA4NTkzOwogIHRbMzM3XSA9IDk1NTI7CiAgdFs0OTNdID0gMTAzOTsKICB0WzQ5NF0gPSAxMDQwOwogIHRbNTcwXSA9IDEwNDA7CiAgdFs1NzFdID0gMTA0MTsKICB0WzU3Ml0gPSAxMDQyOwogIHRbNTczXSA9IDEwNDM7CiAgdFs1NzRdID0gMTA0NDsKICB0WzU3NV0gPSAxMDQ1OwogIHRbNTc2XSA9IDEwNDY7CiAgdFs1NzddID0gMTA0NzsKICB0WzU3OF0gPSAxMDQ4OwogIHRbNTc5XSA9IDEwNDk7CiAgdFs1ODBdID0gMTA1MDsKICB0WzU4MV0gPSAxMDUxOwogIHRbNTgyXSA9IDEwNTI7CiAgdFs1ODNdID0gMTA1MzsKICB0WzU4NF0gPSAxMDU0OwogIHRbNTg1XSA9IDEwNTU7CiAgdFs1ODZdID0gMTA1NjsKICB0WzU4N10gPSAxMDU3OwogIHRbNTg4XSA9IDEwNTg7CiAgdFs1ODldID0gMTA1OTsKICB0WzU5MF0gPSAxMDYwOwogIHRbNTkxXSA9IDEwNjE7CiAgdFs1OTJdID0gMTA2MjsKICB0WzU5M10gPSAxMDYzOwogIHRbNTk0XSA9IDEwNjQ7CiAgdFs1OTVdID0gMTA2NTsKICB0WzU5Nl0gPSAxMDY2OwogIHRbNTk3XSA9IDEwNjc7CiAgdFs1OThdID0gMTA2ODsKICB0WzU5OV0gPSAxMDY5OwogIHRbNjAwXSA9IDEwNzA7CiAgdFs2NzJdID0gMTQ4ODsKICB0WzY3M10gPSAxNDg5OwogIHRbNjc0XSA9IDE0OTA7CiAgdFs2NzVdID0gMTQ5MTsKICB0WzY3Nl0gPSAxNDkyOwogIHRbNjc3XSA9IDE0OTM7CiAgdFs2NzhdID0gMTQ5NDsKICB0WzY3OV0gPSAxNDk1OwogIHRbNjgwXSA9IDE0OTY7CiAgdFs2ODFdID0gMTQ5NzsKICB0WzY4Ml0gPSAxNDk4OwogIHRbNjgzXSA9IDE0OTk7CiAgdFs2ODRdID0gMTUwMDsKICB0WzY4NV0gPSAxNTAxOwogIHRbNjg2XSA9IDE1MDI7CiAgdFs2ODddID0gMTUwMzsKICB0WzY4OF0gPSAxNTA0OwogIHRbNjg5XSA9IDE1MDU7CiAgdFs2OTBdID0gMTUwNjsKICB0WzY5MV0gPSAxNTA3OwogIHRbNjkyXSA9IDE1MDg7CiAgdFs2OTNdID0gMTUwOTsKICB0WzY5NF0gPSAxNTEwOwogIHRbNjk1XSA9IDE1MTE7CiAgdFs2OTZdID0gMTUxMjsKICB0WzY5N10gPSAxNTEzOwogIHRbNjk4XSA9IDE1MTQ7CiAgdFs3MDVdID0gMTUyNDsKICB0WzcwNl0gPSA4MzYyOwogIHRbNzEwXSA9IDY0Mjg4OwogIHRbNzExXSA9IDY0Mjk4OwogIHRbNzU5XSA9IDE2MTc7CiAgdFs3NjFdID0gMTc3NjsKICB0Wzc2M10gPSAxNzc4OwogIHRbNzc1XSA9IDE2NTI7CiAgdFs3NzddID0gMTc2NDsKICB0Wzc3OF0gPSAxNzgwOwogIHRbNzc5XSA9IDE3ODE7CiAgdFs3ODBdID0gMTc4MjsKICB0Wzc4Ml0gPSA3NzE7CiAgdFs3ODNdID0gNjQ3MjY7CiAgdFs3ODZdID0gODM2MzsKICB0Wzc4OF0gPSA4NTMyOwogIHRbNzkwXSA9IDc2ODsKICB0Wzc5MV0gPSA3Njk7CiAgdFs3OTJdID0gNzY4OwogIHRbNzk1XSA9IDgwMzsKICB0Wzc5N10gPSA2NDMzNjsKICB0Wzc5OF0gPSA2NDMzNzsKICB0Wzc5OV0gPSA2NDM0MjsKICB0WzgwMF0gPSA2NDM0MzsKICB0WzgwMV0gPSA2NDM0NDsKICB0WzgwMl0gPSA2NDM0NTsKICB0WzgwM10gPSA2NDM2MjsKICB0WzgwNF0gPSA2NDM2MzsKICB0WzgwNV0gPSA2NDM2NDsKICB0WzI0MjRdID0gNzgyMTsKICB0WzI0MjVdID0gNzgyMjsKICB0WzI0MjZdID0gNzgyMzsKICB0WzI0MjddID0gNzgyNDsKICB0WzI0MjhdID0gNzgyNTsKICB0WzI0MjldID0gNzgyNjsKICB0WzI0MzBdID0gNzgyNzsKICB0WzI0MzNdID0gNzY4MjsKICB0WzI2NzhdID0gODA0NTsKICB0WzI2NzldID0gODA0NjsKICB0WzI4MzBdID0gMTU1MjsKICB0WzI4MzhdID0gNjg2OwogIHRbMjg0MF0gPSA3NTE7CiAgdFsyODQyXSA9IDc1MzsKICB0WzI4NDNdID0gNzU0OwogIHRbMjg0NF0gPSA3NTU7CiAgdFsyODQ2XSA9IDc1NzsKICB0WzI4NTZdID0gNzY3OwogIHRbMjg1N10gPSA4NDg7CiAgdFsyODU4XSA9IDg0OTsKICB0WzI4NjJdID0gODUzOwogIHRbMjg2M10gPSA4NTQ7CiAgdFsyODY0XSA9IDg1NTsKICB0WzI4NjVdID0gODYxOwogIHRbMjg2Nl0gPSA4NjI7CiAgdFsyOTA2XSA9IDc0NjA7CiAgdFsyOTA4XSA9IDc0NjI7CiAgdFsyOTA5XSA9IDc0NjM7CiAgdFsyOTEwXSA9IDc0NjQ7CiAgdFsyOTEyXSA9IDc0NjY7CiAgdFsyOTEzXSA9IDc0Njc7CiAgdFsyOTE0XSA9IDc0Njg7CiAgdFsyOTE2XSA9IDc0NzA7CiAgdFsyOTE3XSA9IDc0NzE7CiAgdFsyOTE4XSA9IDc0NzI7CiAgdFsyOTIwXSA9IDc0NzQ7CiAgdFsyOTIxXSA9IDc0NzU7CiAgdFsyOTIyXSA9IDc0NzY7CiAgdFsyOTI0XSA9IDc0Nzg7CiAgdFsyOTI1XSA9IDc0Nzk7CiAgdFsyOTI2XSA9IDc0ODA7CiAgdFsyOTI4XSA9IDc0ODI7CiAgdFsyOTI5XSA9IDc0ODM7CiAgdFsyOTMwXSA9IDc0ODQ7CiAgdFsyOTMyXSA9IDc0ODY7CiAgdFsyOTMzXSA9IDc0ODc7CiAgdFsyOTM0XSA9IDc0ODg7CiAgdFsyOTM2XSA9IDc0OTA7CiAgdFsyOTM3XSA9IDc0OTE7CiAgdFsyOTM4XSA9IDc0OTI7CiAgdFsyOTQwXSA9IDc0OTQ7CiAgdFsyOTQxXSA9IDc0OTU7CiAgdFsyOTQyXSA9IDc0OTY7CiAgdFsyOTQ0XSA9IDc0OTg7CiAgdFsyOTQ2XSA9IDc1MDA7CiAgdFsyOTQ4XSA9IDc1MDI7CiAgdFsyOTUwXSA9IDc1MDQ7CiAgdFsyOTUxXSA9IDc1MDU7CiAgdFsyOTUyXSA9IDc1MDY7CiAgdFsyOTU0XSA9IDc1MDg7CiAgdFsyOTU1XSA9IDc1MDk7CiAgdFsyOTU2XSA9IDc1MTA7CiAgdFsyOTU4XSA9IDc1MTI7CiAgdFsyOTU5XSA9IDc1MTM7CiAgdFsyOTYwXSA9IDc1MTQ7CiAgdFsyOTYyXSA9IDc1MTY7CiAgdFsyOTYzXSA9IDc1MTc7CiAgdFsyOTY0XSA9IDc1MTg7CiAgdFsyOTY2XSA9IDc1MjA7CiAgdFsyOTY3XSA9IDc1MjE7CiAgdFsyOTY4XSA9IDc1MjI7CiAgdFsyOTcwXSA9IDc1MjQ7CiAgdFsyOTcxXSA9IDc1MjU7CiAgdFsyOTcyXSA9IDc1MjY7CiAgdFsyOTc0XSA9IDc1Mjg7CiAgdFsyOTc1XSA9IDc1Mjk7CiAgdFsyOTc2XSA9IDc1MzA7CiAgdFsyOTc4XSA9IDE1Mzc7CiAgdFsyOTc5XSA9IDE1Mzg7CiAgdFsyOTgwXSA9IDE1Mzk7CiAgdFsyOTgyXSA9IDE1NDk7CiAgdFsyOTgzXSA9IDE1NTE7CiAgdFsyOTg0XSA9IDE1NTI7CiAgdFsyOTg2XSA9IDE1NTQ7CiAgdFsyOTg3XSA9IDE1NTU7CiAgdFsyOTg4XSA9IDE1NTY7CiAgdFsyOTkwXSA9IDE2MjM7CiAgdFsyOTkxXSA9IDE2MjQ7CiAgdFsyOTk1XSA9IDE3NzU7CiAgdFsyOTk5XSA9IDE3OTE7CiAgdFszMDAyXSA9IDY0MjkwOwogIHRbMzAwM10gPSA2NDI5MTsKICB0WzMwMDRdID0gNjQyOTI7CiAgdFszMDA2XSA9IDY0Mjk0OwogIHRbMzAwN10gPSA2NDI5NTsKICB0WzMwMDhdID0gNjQyOTY7CiAgdFszMDExXSA9IDE5MDA7CiAgdFszMDE0XSA9IDgyMjM7CiAgdFszMDE1XSA9IDgyNDQ7CiAgdFszMDE3XSA9IDc1MzI7CiAgdFszMDE4XSA9IDc1MzM7CiAgdFszMDE5XSA9IDc1MzQ7CiAgdFszMDc1XSA9IDc1OTA7CiAgdFszMDc2XSA9IDc1OTE7CiAgdFszMDc5XSA9IDc1OTQ7CiAgdFszMDgwXSA9IDc1OTU7CiAgdFszMDgzXSA9IDc1OTg7CiAgdFszMDg0XSA9IDc1OTk7CiAgdFszMDg3XSA9IDc2MDI7CiAgdFszMDg4XSA9IDc2MDM7CiAgdFszMDkxXSA9IDc2MDY7CiAgdFszMDkyXSA9IDc2MDc7CiAgdFszMDk1XSA9IDc2MTA7CiAgdFszMDk2XSA9IDc2MTE7CiAgdFszMDk5XSA9IDc2MTQ7CiAgdFszMTAwXSA9IDc2MTU7CiAgdFszMTAzXSA9IDc2MTg7CiAgdFszMTA0XSA9IDc2MTk7CiAgdFszMTA3XSA9IDgzMzc7CiAgdFszMTA4XSA9IDgzMzg7CiAgdFszMTE2XSA9IDE4ODQ7CiAgdFszMTE5XSA9IDE4ODU7CiAgdFszMTIwXSA9IDE4ODU7CiAgdFszMTIzXSA9IDE4ODY7CiAgdFszMTI0XSA9IDE4ODY7CiAgdFszMTI3XSA9IDE4ODc7CiAgdFszMTI4XSA9IDE4ODc7CiAgdFszMTMxXSA9IDE4ODg7CiAgdFszMTMyXSA9IDE4ODg7CiAgdFszMTM1XSA9IDE4ODk7CiAgdFszMTM2XSA9IDE4ODk7CiAgdFszMTM5XSA9IDE4OTA7CiAgdFszMTQwXSA9IDE4OTA7CiAgdFszMTQzXSA9IDE4OTE7CiAgdFszMTQ0XSA9IDE4OTE7CiAgdFszMTQ3XSA9IDE4OTI7CiAgdFszMTQ4XSA9IDE4OTI7CiAgdFszMTUzXSA9IDU4MDsKICB0WzMxNTRdID0gNTgxOwogIHRbMzE1N10gPSA1ODQ7CiAgdFszMTU4XSA9IDU4NTsKICB0WzMxNjFdID0gNTg4OwogIHRbMzE2Ml0gPSA1ODk7CiAgdFszMTY1XSA9IDg5MTsKICB0WzMxNjZdID0gODkyOwogIHRbMzE2OV0gPSAxMjc0OwogIHRbMzE3MF0gPSAxMjc1OwogIHRbMzE3M10gPSAxMjc4OwogIHRbMzE3NF0gPSAxMjc5OwogIHRbMzE4MV0gPSA3NjIyOwogIHRbMzE4Ml0gPSA3NjIzOwogIHRbMzI4Ml0gPSAxMTc5OTsKICB0WzMzMTZdID0gNTc4OwogIHRbMzM3OV0gPSA0Mjc4NTsKICB0WzMzOTNdID0gMTE1OTsKICB0WzM0MTZdID0gODM3NzsKfSk7CmNvbnN0IGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjayA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHRbMjI3XSA9IDMyMjsKICB0WzI2NF0gPSAyNjE7CiAgdFsyOTFdID0gMzQ2Owp9KTsKY29uc3QgZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdFsxXSA9IDMyOwogIHRbNF0gPSA2NTsKICB0WzVdID0gMTkyOwogIHRbNl0gPSAxOTM7CiAgdFs5XSA9IDE5NjsKICB0WzE3XSA9IDY2OwogIHRbMThdID0gNjc7CiAgdFsyMV0gPSAyNjg7CiAgdFsyNF0gPSA2ODsKICB0WzI4XSA9IDY5OwogIHRbMjldID0gMjAwOwogIHRbMzBdID0gMjAxOwogIHRbMzJdID0gMjgyOwogIHRbMzhdID0gNzA7CiAgdFszOV0gPSA3MTsKICB0WzQ0XSA9IDcyOwogIHRbNDddID0gNzM7CiAgdFs0OF0gPSAyMDQ7CiAgdFs0OV0gPSAyMDU7CiAgdFs1OF0gPSA3NDsKICB0WzYwXSA9IDc1OwogIHRbNjJdID0gNzY7CiAgdFs2OF0gPSA3NzsKICB0WzY5XSA9IDc4OwogIHRbNzVdID0gNzk7CiAgdFs3Nl0gPSAyMTA7CiAgdFs4MF0gPSAyMTQ7CiAgdFs4N10gPSA4MDsKICB0Wzg5XSA9IDgxOwogIHRbOTBdID0gODI7CiAgdFs5Ml0gPSAzNDQ7CiAgdFs5NF0gPSA4MzsKICB0Wzk3XSA9IDM1MjsKICB0WzEwMF0gPSA4NDsKICB0WzEwNF0gPSA4NTsKICB0WzEwOV0gPSAyMjA7CiAgdFsxMTVdID0gODY7CiAgdFsxMTZdID0gODc7CiAgdFsxMjFdID0gODg7CiAgdFsxMjJdID0gODk7CiAgdFsxMjRdID0gMjIxOwogIHRbMTI3XSA9IDkwOwogIHRbMTI5XSA9IDM4MTsKICB0WzI1OF0gPSA5NzsKICB0WzI1OV0gPSAyMjQ7CiAgdFsyNjBdID0gMjI1OwogIHRbMjYzXSA9IDIyODsKICB0WzI2OF0gPSAyNjE7CiAgdFsyNzFdID0gOTg7CiAgdFsyNzJdID0gOTk7CiAgdFsyNzNdID0gMjYzOwogIHRbMjc1XSA9IDI2OTsKICB0WzI4Ml0gPSAxMDA7CiAgdFsyODZdID0gMTAxOwogIHRbMjg3XSA9IDIzMjsKICB0WzI4OF0gPSAyMzM7CiAgdFsyOTBdID0gMjgzOwogIHRbMjk1XSA9IDI4MTsKICB0WzI5Nl0gPSAxMDI7CiAgdFszMzZdID0gMTAzOwogIHRbMzQ2XSA9IDEwNDsKICB0WzM0OV0gPSAxMDU7CiAgdFszNTBdID0gMjM2OwogIHRbMzUxXSA9IDIzNzsKICB0WzM2MV0gPSAxMDY7CiAgdFszNjRdID0gMTA3OwogIHRbMzY3XSA9IDEwODsKICB0WzM3MV0gPSAzMjI7CiAgdFszNzNdID0gMTA5OwogIHRbMzc0XSA9IDExMDsKICB0WzM4MV0gPSAxMTE7CiAgdFszODJdID0gMjQyOwogIHRbMzgzXSA9IDI0MzsKICB0WzM4Nl0gPSAyNDY7CiAgdFszOTNdID0gMTEyOwogIHRbMzk1XSA9IDExMzsKICB0WzM5Nl0gPSAxMTQ7CiAgdFszOThdID0gMzQ1OwogIHRbNDAwXSA9IDExNTsKICB0WzQwMV0gPSAzNDc7CiAgdFs0MDNdID0gMzUzOwogIHRbNDEwXSA9IDExNjsKICB0WzQzN10gPSAxMTc7CiAgdFs0NDJdID0gMjUyOwogIHRbNDQ4XSA9IDExODsKICB0WzQ0OV0gPSAxMTk7CiAgdFs0NTRdID0gMTIwOwogIHRbNDU1XSA9IDEyMTsKICB0WzQ1N10gPSAyNTM7CiAgdFs0NjBdID0gMTIyOwogIHRbNDYyXSA9IDM4MjsKICB0WzQ2M10gPSAzODA7CiAgdFs4NTNdID0gNDQ7CiAgdFs4NTVdID0gNTg7CiAgdFs4NTZdID0gNDY7CiAgdFs4NzZdID0gNDc7CiAgdFs4NzhdID0gNDU7CiAgdFs4ODJdID0gNDU7CiAgdFs4OTRdID0gNDA7CiAgdFs4OTVdID0gNDE7CiAgdFs4OTZdID0gOTE7CiAgdFs4OTddID0gOTM7CiAgdFs5MjNdID0gNjQ7CiAgdFs5NDBdID0gMTYzOwogIHRbMTAwNF0gPSA0ODsKICB0WzEwMDVdID0gNDk7CiAgdFsxMDA2XSA9IDUwOwogIHRbMTAwN10gPSA1MTsKICB0WzEwMDhdID0gNTI7CiAgdFsxMDA5XSA9IDUzOwogIHRbMTAxMF0gPSA1NDsKICB0WzEwMTFdID0gNTU7CiAgdFsxMDEyXSA9IDU2OwogIHRbMTAxM10gPSA1NzsKICB0WzEwODFdID0gMzc7CiAgdFsxMDg1XSA9IDQzOwogIHRbMTA4Nl0gPSA0NTsKfSk7CmZ1bmN0aW9uIGdldFN0YW5kYXJkRm9udE5hbWUobmFtZSkgewogIGNvbnN0IGZvbnROYW1lID0gbm9ybWFsaXplRm9udE5hbWUobmFtZSk7CiAgY29uc3Qgc3RkRm9udE1hcCA9IGdldFN0ZEZvbnRNYXAoKTsKICByZXR1cm4gc3RkRm9udE1hcFtmb250TmFtZV07Cn0KZnVuY3Rpb24gaXNLbm93bkZvbnROYW1lKG5hbWUpIHsKICBjb25zdCBmb250TmFtZSA9IG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpOwogIHJldHVybiAhIShnZXRTdGRGb250TWFwKClbZm9udE5hbWVdIHx8IGdldE5vblN0ZEZvbnRNYXAoKVtmb250TmFtZV0gfHwgZ2V0U2VyaWZGb250cygpW2ZvbnROYW1lXSB8fCBnZXRTeW1ib2xzRm9udHMoKVtmb250TmFtZV0pOwp9Cgo7Ly8gLi9zcmMvY29yZS90b191bmljb2RlX21hcC5qcwoKY2xhc3MgVG9Vbmljb2RlTWFwIHsKICBjb25zdHJ1Y3RvcihjbWFwID0gW10pIHsKICAgIHRoaXMuX21hcCA9IGNtYXA7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiB0aGlzLl9tYXApIHsKICAgICAgY2FsbGJhY2soY2hhckNvZGUsIHRoaXMuX21hcFtjaGFyQ29kZV0uY29kZVBvaW50QXQoMCkpOwogICAgfQogIH0KICBoYXMoaSkgewogICAgcmV0dXJuIHRoaXMuX21hcFtpXSAhPT0gdW5kZWZpbmVkOwogIH0KICBnZXQoaSkgewogICAgcmV0dXJuIHRoaXMuX21hcFtpXTsKICB9CiAgY2hhckNvZGVPZih2YWx1ZSkgewogICAgY29uc3QgbWFwID0gdGhpcy5fbWFwOwogICAgaWYgKG1hcC5sZW5ndGggPD0gMHgxMDAwMCkgewogICAgICByZXR1cm4gbWFwLmluZGV4T2YodmFsdWUpOwogICAgfQogICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBtYXApIHsKICAgICAgaWYgKG1hcFtjaGFyQ29kZV0gPT09IHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGNoYXJDb2RlIHwgMDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwogIH0KICBhbWVuZChtYXApIHsKICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gbWFwKSB7CiAgICAgIHRoaXMuX21hcFtjaGFyQ29kZV0gPSBtYXBbY2hhckNvZGVdOwogICAgfQogIH0KfQpjbGFzcyBJZGVudGl0eVRvVW5pY29kZU1hcCB7CiAgY29uc3RydWN0b3IoZmlyc3RDaGFyLCBsYXN0Q2hhcikgewogICAgdGhpcy5maXJzdENoYXIgPSBmaXJzdENoYXI7CiAgICB0aGlzLmxhc3RDaGFyID0gbGFzdENoYXI7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhciArIDEgLSB0aGlzLmZpcnN0Q2hhcjsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgZm9yIChsZXQgaSA9IHRoaXMuZmlyc3RDaGFyLCBpaSA9IHRoaXMubGFzdENoYXI7IGkgPD0gaWk7IGkrKykgewogICAgICBjYWxsYmFjayhpLCBpKTsKICAgIH0KICB9CiAgaGFzKGkpIHsKICAgIHJldHVybiB0aGlzLmZpcnN0Q2hhciA8PSBpICYmIGkgPD0gdGhpcy5sYXN0Q2hhcjsKICB9CiAgZ2V0KGkpIHsKICAgIGlmICh0aGlzLmZpcnN0Q2hhciA8PSBpICYmIGkgPD0gdGhpcy5sYXN0Q2hhcikgewogICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShpKTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIGNoYXJDb2RlT2YodikgewogICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodikgJiYgdiA+PSB0aGlzLmZpcnN0Q2hhciAmJiB2IDw9IHRoaXMubGFzdENoYXIgPyB2IDogLTE7CiAgfQogIGFtZW5kKG1hcCkgewogICAgdW5yZWFjaGFibGUoIlNob3VsZCBub3QgY2FsbCBhbWVuZCgpIik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jZmZfZm9udC5qcwoKCgpjbGFzcyBDRkZGb250IHsKICBjb25zdHJ1Y3RvcihmaWxlLCBwcm9wZXJ0aWVzKSB7CiAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwogICAgY29uc3QgcGFyc2VyID0gbmV3IENGRlBhcnNlcihmaWxlLCBwcm9wZXJ0aWVzLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOwogICAgdGhpcy5jZmYgPSBwYXJzZXIucGFyc2UoKTsKICAgIHRoaXMuY2ZmLmR1cGxpY2F0ZUZpcnN0R2x5cGgoKTsKICAgIGNvbnN0IGNvbXBpbGVyID0gbmV3IENGRkNvbXBpbGVyKHRoaXMuY2ZmKTsKICAgIHRoaXMuc2VhY3MgPSB0aGlzLmNmZi5zZWFjczsKICAgIHRyeSB7CiAgICAgIHRoaXMuZGF0YSA9IGNvbXBpbGVyLmNvbXBpbGUoKTsKICAgIH0gY2F0Y2ggewogICAgICB3YXJuKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIgKyBwcm9wZXJ0aWVzLmxvYWRlZE5hbWUpOwogICAgICB0aGlzLmRhdGEgPSBmaWxlOwogICAgfQogICAgdGhpcy5fY3JlYXRlQnVpbHRJbkVuY29kaW5nKCk7CiAgfQogIGdldCBudW1HbHlwaHMoKSB7CiAgICByZXR1cm4gdGhpcy5jZmYuY2hhclN0cmluZ3MuY291bnQ7CiAgfQogIGdldENoYXJzZXQoKSB7CiAgICByZXR1cm4gdGhpcy5jZmYuY2hhcnNldC5jaGFyc2V0OwogIH0KICBnZXRHbHlwaE1hcHBpbmcoKSB7CiAgICBjb25zdCBjZmYgPSB0aGlzLmNmZjsKICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7CiAgICBjb25zdCB7CiAgICAgIGNpZFRvR2lkTWFwLAogICAgICBjTWFwCiAgICB9ID0gcHJvcGVydGllczsKICAgIGNvbnN0IGNoYXJzZXRzID0gY2ZmLmNoYXJzZXQuY2hhcnNldDsKICAgIGxldCBjaGFyQ29kZVRvR2x5cGhJZDsKICAgIGxldCBnbHlwaElkOwogICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlKSB7CiAgICAgIGxldCBpbnZDaWRUb0dpZE1hcDsKICAgICAgaWYgKGNpZFRvR2lkTWFwPy5sZW5ndGggPiAwKSB7CiAgICAgICAgaW52Q2lkVG9HaWRNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNpZFRvR2lkTWFwLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGdpZCA9IGNpZFRvR2lkTWFwW2ldOwogICAgICAgICAgaWYgKGdpZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGludkNpZFRvR2lkTWFwW2dpZF0gPSBpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGxldCBjaGFyQ29kZTsKICAgICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgICBmb3IgKGdseXBoSWQgPSAwOyBnbHlwaElkIDwgY2hhcnNldHMubGVuZ3RoOyBnbHlwaElkKyspIHsKICAgICAgICAgIGNvbnN0IGNpZCA9IGNoYXJzZXRzW2dseXBoSWRdOwogICAgICAgICAgY2hhckNvZGUgPSBjTWFwLmNoYXJDb2RlT2YoY2lkKTsKICAgICAgICAgIGlmIChpbnZDaWRUb0dpZE1hcD8uW2NoYXJDb2RlXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGNoYXJDb2RlID0gaW52Q2lkVG9HaWRNYXBbY2hhckNvZGVdOwogICAgICAgICAgfQogICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNmZi5jaGFyU3RyaW5ncy5jb3VudDsgZ2x5cGhJZCsrKSB7CiAgICAgICAgICBjaGFyQ29kZSA9IGNNYXAuY2hhckNvZGVPZihnbHlwaElkKTsKICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKICAgIH0KICAgIGxldCBlbmNvZGluZyA9IGNmZi5lbmNvZGluZyA/IGNmZi5lbmNvZGluZy5lbmNvZGluZyA6IG51bGw7CiAgICBpZiAocHJvcGVydGllcy5pc0ludGVybmFsRm9udCkgewogICAgICBlbmNvZGluZyA9IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nOwogICAgfQogICAgY2hhckNvZGVUb0dseXBoSWQgPSB0eXBlMUZvbnRHbHlwaE1hcHBpbmcocHJvcGVydGllcywgZW5jb2RpbmcsIGNoYXJzZXRzKTsKICAgIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKICB9CiAgaGFzR2x5cGhJZChpZCkgewogICAgcmV0dXJuIHRoaXMuY2ZmLmhhc0dseXBoSWQoaWQpOwogIH0KICBfY3JlYXRlQnVpbHRJbkVuY29kaW5nKCkgewogICAgY29uc3QgewogICAgICBjaGFyc2V0LAogICAgICBlbmNvZGluZwogICAgfSA9IHRoaXMuY2ZmOwogICAgaWYgKCFjaGFyc2V0IHx8ICFlbmNvZGluZykgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBjaGFyc2V0cyA9IGNoYXJzZXQuY2hhcnNldCwKICAgICAgZW5jb2RpbmdzID0gZW5jb2RpbmcuZW5jb2Rpbmc7CiAgICBjb25zdCBtYXAgPSBbXTsKICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZW5jb2RpbmdzKSB7CiAgICAgIGNvbnN0IGdseXBoSWQgPSBlbmNvZGluZ3NbY2hhckNvZGVdOwogICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7CiAgICAgICAgY29uc3QgZ2x5cGhOYW1lID0gY2hhcnNldHNbZ2x5cGhJZF07CiAgICAgICAgaWYgKGdseXBoTmFtZSkgewogICAgICAgICAgbWFwW2NoYXJDb2RlXSA9IGdseXBoTmFtZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXAubGVuZ3RoID4gMCkgewogICAgICB0aGlzLnByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nID0gbWFwOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZm9udF9yZW5kZXJlci5qcwoKCgoKCgpmdW5jdGlvbiBnZXRGbG9hdDIxNChkYXRhLCBvZmZzZXQpIHsKICByZXR1cm4gcmVhZEludDE2KGRhdGEsIG9mZnNldCkgLyAxNjM4NDsKfQpmdW5jdGlvbiBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycykgewogIGNvbnN0IG51bVN1YnJzID0gc3VicnMubGVuZ3RoOwogIGxldCBiaWFzID0gMzI3Njg7CiAgaWYgKG51bVN1YnJzIDwgMTI0MCkgewogICAgYmlhcyA9IDEwNzsKICB9IGVsc2UgaWYgKG51bVN1YnJzIDwgMzM5MDApIHsKICAgIGJpYXMgPSAxMTMxOwogIH0KICByZXR1cm4gYmlhczsKfQpmdW5jdGlvbiBwYXJzZUNtYXAoZGF0YSwgc3RhcnQsIGVuZCkgewogIGNvbnN0IG9mZnNldCA9IHJlYWRVaW50MTYoZGF0YSwgc3RhcnQgKyAyKSA9PT0gMSA/IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyA4KSA6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyAxNik7CiAgY29uc3QgZm9ybWF0ID0gcmVhZFVpbnQxNihkYXRhLCBzdGFydCArIG9mZnNldCk7CiAgbGV0IHJhbmdlcywgcCwgaTsKICBpZiAoZm9ybWF0ID09PSA0KSB7CiAgICByZWFkVWludDE2KGRhdGEsIHN0YXJ0ICsgb2Zmc2V0ICsgMik7CiAgICBjb25zdCBzZWdDb3VudCA9IHJlYWRVaW50MTYoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyA2KSA+PiAxOwogICAgcCA9IHN0YXJ0ICsgb2Zmc2V0ICsgMTQ7CiAgICByYW5nZXMgPSBbXTsKICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHsKICAgICAgcmFuZ2VzW2ldID0gewogICAgICAgIGVuZDogcmVhZFVpbnQxNihkYXRhLCBwKQogICAgICB9OwogICAgfQogICAgcCArPSAyOwogICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikgewogICAgICByYW5nZXNbaV0uc3RhcnQgPSByZWFkVWludDE2KGRhdGEsIHApOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IHNlZ0NvdW50OyBpKyssIHAgKz0gMikgewogICAgICByYW5nZXNbaV0uaWREZWx0YSA9IHJlYWRVaW50MTYoZGF0YSwgcCk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7CiAgICAgIGxldCBpZE9mZnNldCA9IHJlYWRVaW50MTYoZGF0YSwgcCk7CiAgICAgIGlmIChpZE9mZnNldCA9PT0gMCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHJhbmdlc1tpXS5pZHMgPSBbXTsKICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gcmFuZ2VzW2ldLmVuZCAtIHJhbmdlc1tpXS5zdGFydCArIDE7IGogPCBqajsgaisrKSB7CiAgICAgICAgcmFuZ2VzW2ldLmlkc1tqXSA9IHJlYWRVaW50MTYoZGF0YSwgcCArIGlkT2Zmc2V0KTsKICAgICAgICBpZE9mZnNldCArPSAyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmFuZ2VzOwogIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAxMikgewogICAgY29uc3QgZ3JvdXBzID0gcmVhZFVpbnQzMihkYXRhLCBzdGFydCArIG9mZnNldCArIDEyKTsKICAgIHAgPSBzdGFydCArIG9mZnNldCArIDE2OwogICAgcmFuZ2VzID0gW107CiAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzOyBpKyspIHsKICAgICAgc3RhcnQgPSByZWFkVWludDMyKGRhdGEsIHApOwogICAgICByYW5nZXMucHVzaCh7CiAgICAgICAgc3RhcnQsCiAgICAgICAgZW5kOiByZWFkVWludDMyKGRhdGEsIHAgKyA0KSwKICAgICAgICBpZERlbHRhOiByZWFkVWludDMyKGRhdGEsIHAgKyA4KSAtIHN0YXJ0CiAgICAgIH0pOwogICAgICBwICs9IDEyOwogICAgfQogICAgcmV0dXJuIHJhbmdlczsKICB9CiAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGB1bnN1cHBvcnRlZCBjbWFwOiAke2Zvcm1hdH1gKTsKfQpmdW5jdGlvbiBwYXJzZUNmZihkYXRhLCBzdGFydCwgZW5kLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogIGNvbnN0IHBhcnNlciA9IG5ldyBDRkZQYXJzZXIobmV3IFN0cmVhbShkYXRhLCBzdGFydCwgZW5kIC0gc3RhcnQpLCBwcm9wZXJ0aWVzLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICBjb25zdCBjZmYgPSBwYXJzZXIucGFyc2UoKTsKICByZXR1cm4gewogICAgZ2x5cGhzOiBjZmYuY2hhclN0cmluZ3Mub2JqZWN0cywKICAgIHN1YnJzOiBjZmYudG9wRGljdC5wcml2YXRlRGljdD8uc3VicnNJbmRleD8ub2JqZWN0cywKICAgIGdzdWJyczogY2ZmLmdsb2JhbFN1YnJJbmRleD8ub2JqZWN0cywKICAgIGlzQ0ZGQ0lERm9udDogY2ZmLmlzQ0lERm9udCwKICAgIGZkU2VsZWN0OiBjZmYuZmRTZWxlY3QsCiAgICBmZEFycmF5OiBjZmYuZmRBcnJheQogIH07Cn0KZnVuY3Rpb24gcGFyc2VHbHlmVGFibGUoZ2x5ZiwgbG9jYSwgaXNHbHlwaExvY2F0aW9uc0xvbmcpIHsKICBsZXQgaXRlbVNpemUsIGl0ZW1EZWNvZGU7CiAgaWYgKGlzR2x5cGhMb2NhdGlvbnNMb25nKSB7CiAgICBpdGVtU2l6ZSA9IDQ7CiAgICBpdGVtRGVjb2RlID0gcmVhZFVpbnQzMjsKICB9IGVsc2UgewogICAgaXRlbVNpemUgPSAyOwogICAgaXRlbURlY29kZSA9IChkYXRhLCBvZmZzZXQpID0+IDIgKiByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgfQogIGNvbnN0IGdseXBocyA9IFtdOwogIGxldCBzdGFydE9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYSwgMCk7CiAgZm9yIChsZXQgaiA9IGl0ZW1TaXplOyBqIDwgbG9jYS5sZW5ndGg7IGogKz0gaXRlbVNpemUpIHsKICAgIGNvbnN0IGVuZE9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYSwgaik7CiAgICBnbHlwaHMucHVzaChnbHlmLnN1YmFycmF5KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpKTsKICAgIHN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0OwogIH0KICByZXR1cm4gZ2x5cGhzOwp9CmZ1bmN0aW9uIGxvb2t1cENtYXAocmFuZ2VzLCB1bmljb2RlKSB7CiAgY29uc3QgY29kZSA9IHVuaWNvZGUuY29kZVBvaW50QXQoMCk7CiAgbGV0IGdpZCA9IDAsCiAgICBsID0gMCwKICAgIHIgPSByYW5nZXMubGVuZ3RoIC0gMTsKICB3aGlsZSAobCA8IHIpIHsKICAgIGNvbnN0IGMgPSBsICsgciArIDEgPj4gMTsKICAgIGlmIChjb2RlIDwgcmFuZ2VzW2NdLnN0YXJ0KSB7CiAgICAgIHIgPSBjIC0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGwgPSBjOwogICAgfQogIH0KICBpZiAocmFuZ2VzW2xdLnN0YXJ0IDw9IGNvZGUgJiYgY29kZSA8PSByYW5nZXNbbF0uZW5kKSB7CiAgICBnaWQgPSByYW5nZXNbbF0uaWREZWx0YSArIChyYW5nZXNbbF0uaWRzID8gcmFuZ2VzW2xdLmlkc1tjb2RlIC0gcmFuZ2VzW2xdLnN0YXJ0XSA6IGNvZGUpICYgMHhmZmZmOwogIH0KICByZXR1cm4gewogICAgY2hhckNvZGU6IGNvZGUsCiAgICBnbHlwaElkOiBnaWQKICB9Owp9CmZ1bmN0aW9uIGNvbXBpbGVHbHlmKGNvZGUsIGNtZHMsIGZvbnQpIHsKICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkgewogICAgaWYgKGZpcnN0UG9pbnQpIHsKICAgICAgY21kcy5hZGQoIkwiLCBmaXJzdFBvaW50KTsKICAgIH0KICAgIGZpcnN0UG9pbnQgPSBbeCwgeV07CiAgICBjbWRzLmFkZCgiTSIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIGxpbmVUbyh4LCB5KSB7CiAgICBjbWRzLmFkZCgiTCIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIHF1YWRyYXRpY0N1cnZlVG8oeGEsIHlhLCB4LCB5KSB7CiAgICBjbWRzLmFkZCgiUSIsIFt4YSwgeWEsIHgsIHldKTsKICB9CiAgbGV0IGkgPSAwOwogIGNvbnN0IG51bWJlck9mQ29udG91cnMgPSByZWFkSW50MTYoY29kZSwgaSk7CiAgbGV0IGZsYWdzOwogIGxldCBmaXJzdFBvaW50ID0gbnVsbDsKICBsZXQgeCA9IDAsCiAgICB5ID0gMDsKICBpICs9IDEwOwogIGlmIChudW1iZXJPZkNvbnRvdXJzIDwgMCkgewogICAgZG8gewogICAgICBmbGFncyA9IHJlYWRVaW50MTYoY29kZSwgaSk7CiAgICAgIGNvbnN0IGdseXBoSW5kZXggPSByZWFkVWludDE2KGNvZGUsIGkgKyAyKTsKICAgICAgaSArPSA0OwogICAgICBsZXQgYXJnMSwgYXJnMjsKICAgICAgaWYgKGZsYWdzICYgMHgwMSkgewogICAgICAgIGlmIChmbGFncyAmIDB4MDIpIHsKICAgICAgICAgIGFyZzEgPSByZWFkSW50MTYoY29kZSwgaSk7CiAgICAgICAgICBhcmcyID0gcmVhZEludDE2KGNvZGUsIGkgKyAyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXJnMSA9IHJlYWRVaW50MTYoY29kZSwgaSk7CiAgICAgICAgICBhcmcyID0gcmVhZFVpbnQxNihjb2RlLCBpICsgMik7CiAgICAgICAgfQogICAgICAgIGkgKz0gNDsKICAgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4MDIpIHsKICAgICAgICBhcmcxID0gcmVhZEludDgoY29kZSwgaSsrKTsKICAgICAgICBhcmcyID0gcmVhZEludDgoY29kZSwgaSsrKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcmcxID0gY29kZVtpKytdOwogICAgICAgIGFyZzIgPSBjb2RlW2krK107CiAgICAgIH0KICAgICAgaWYgKGZsYWdzICYgMHgwMikgewogICAgICAgIHggPSBhcmcxOwogICAgICAgIHkgPSBhcmcyOwogICAgICB9IGVsc2UgewogICAgICAgIHggPSAwOwogICAgICAgIHkgPSAwOwogICAgICB9CiAgICAgIGxldCBzY2FsZVggPSAxLAogICAgICAgIHNjYWxlWSA9IDEsCiAgICAgICAgc2NhbGUwMSA9IDAsCiAgICAgICAgc2NhbGUxMCA9IDA7CiAgICAgIGlmIChmbGFncyAmIDB4MDgpIHsKICAgICAgICBzY2FsZVggPSBzY2FsZVkgPSBnZXRGbG9hdDIxNChjb2RlLCBpKTsKICAgICAgICBpICs9IDI7CiAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDQwKSB7CiAgICAgICAgc2NhbGVYID0gZ2V0RmxvYXQyMTQoY29kZSwgaSk7CiAgICAgICAgc2NhbGVZID0gZ2V0RmxvYXQyMTQoY29kZSwgaSArIDIpOwogICAgICAgIGkgKz0gNDsKICAgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4ODApIHsKICAgICAgICBzY2FsZVggPSBnZXRGbG9hdDIxNChjb2RlLCBpKTsKICAgICAgICBzY2FsZTAxID0gZ2V0RmxvYXQyMTQoY29kZSwgaSArIDIpOwogICAgICAgIHNjYWxlMTAgPSBnZXRGbG9hdDIxNChjb2RlLCBpICsgNCk7CiAgICAgICAgc2NhbGVZID0gZ2V0RmxvYXQyMTQoY29kZSwgaSArIDYpOwogICAgICAgIGkgKz0gODsKICAgICAgfQogICAgICBjb25zdCBzdWJnbHlwaCA9IGZvbnQuZ2x5cGhzW2dseXBoSW5kZXhdOwogICAgICBpZiAoc3ViZ2x5cGgpIHsKICAgICAgICBjbWRzLnNhdmUoKTsKICAgICAgICBjbWRzLnRyYW5zZm9ybShbc2NhbGVYLCBzY2FsZTAxLCBzY2FsZTEwLCBzY2FsZVksIHgsIHldKTsKICAgICAgICBpZiAoIShmbGFncyAmIDB4MDIpKSB7fQogICAgICAgIGNvbXBpbGVHbHlmKHN1YmdseXBoLCBjbWRzLCBmb250KTsKICAgICAgICBjbWRzLnJlc3RvcmUoKTsKICAgICAgfQogICAgfSB3aGlsZSAoZmxhZ3MgJiAweDIwKTsKICB9IGVsc2UgewogICAgY29uc3QgZW5kUHRzT2ZDb250b3VycyA9IFtdOwogICAgbGV0IGosIGpqOwogICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mQ29udG91cnM7IGorKykgewogICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2gocmVhZFVpbnQxNihjb2RlLCBpKSk7CiAgICAgIGkgKz0gMjsKICAgIH0KICAgIGNvbnN0IGluc3RydWN0aW9uTGVuZ3RoID0gcmVhZFVpbnQxNihjb2RlLCBpKTsKICAgIGkgKz0gMiArIGluc3RydWN0aW9uTGVuZ3RoOwogICAgY29uc3QgbnVtYmVyT2ZQb2ludHMgPSBlbmRQdHNPZkNvbnRvdXJzLmF0KC0xKSArIDE7CiAgICBjb25zdCBwb2ludHMgPSBbXTsKICAgIHdoaWxlIChwb2ludHMubGVuZ3RoIDwgbnVtYmVyT2ZQb2ludHMpIHsKICAgICAgZmxhZ3MgPSBjb2RlW2krK107CiAgICAgIGxldCByZXBlYXQgPSAxOwogICAgICBpZiAoZmxhZ3MgJiAweDA4KSB7CiAgICAgICAgcmVwZWF0ICs9IGNvZGVbaSsrXTsKICAgICAgfQogICAgICB3aGlsZSAocmVwZWF0LS0gPiAwKSB7CiAgICAgICAgcG9pbnRzLnB1c2goewogICAgICAgICAgZmxhZ3MKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHsKICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDEyKSB7CiAgICAgICAgY2FzZSAweDAwOgogICAgICAgICAgeCArPSByZWFkSW50MTYoY29kZSwgaSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDI6CiAgICAgICAgICB4IC09IGNvZGVbaSsrXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMjoKICAgICAgICAgIHggKz0gY29kZVtpKytdOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcG9pbnRzW2pdLnggPSB4OwogICAgfQogICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHsKICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDI0KSB7CiAgICAgICAgY2FzZSAweDAwOgogICAgICAgICAgeSArPSByZWFkSW50MTYoY29kZSwgaSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDQ6CiAgICAgICAgICB5IC09IGNvZGVbaSsrXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyNDoKICAgICAgICAgIHkgKz0gY29kZVtpKytdOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcG9pbnRzW2pdLnkgPSB5OwogICAgfQogICAgbGV0IHN0YXJ0UG9pbnQgPSAwOwogICAgZm9yIChpID0gMDsgaSA8IG51bWJlck9mQ29udG91cnM7IGkrKykgewogICAgICBjb25zdCBlbmRQb2ludCA9IGVuZFB0c09mQ29udG91cnNbaV07CiAgICAgIGNvbnN0IGNvbnRvdXIgPSBwb2ludHMuc2xpY2Uoc3RhcnRQb2ludCwgZW5kUG9pbnQgKyAxKTsKICAgICAgaWYgKGNvbnRvdXJbMF0uZmxhZ3MgJiAxKSB7CiAgICAgICAgY29udG91ci5wdXNoKGNvbnRvdXJbMF0pOwogICAgICB9IGVsc2UgaWYgKGNvbnRvdXIuYXQoLTEpLmZsYWdzICYgMSkgewogICAgICAgIGNvbnRvdXIudW5zaGlmdChjb250b3VyLmF0KC0xKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgcCA9IHsKICAgICAgICAgIGZsYWdzOiAxLAogICAgICAgICAgeDogKGNvbnRvdXJbMF0ueCArIGNvbnRvdXIuYXQoLTEpLngpIC8gMiwKICAgICAgICAgIHk6IChjb250b3VyWzBdLnkgKyBjb250b3VyLmF0KC0xKS55KSAvIDIKICAgICAgICB9OwogICAgICAgIGNvbnRvdXIudW5zaGlmdChwKTsKICAgICAgICBjb250b3VyLnB1c2gocCk7CiAgICAgIH0KICAgICAgbW92ZVRvKGNvbnRvdXJbMF0ueCwgY29udG91clswXS55KTsKICAgICAgZm9yIChqID0gMSwgamogPSBjb250b3VyLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBpZiAoY29udG91cltqXS5mbGFncyAmIDEpIHsKICAgICAgICAgIGxpbmVUbyhjb250b3VyW2pdLngsIGNvbnRvdXJbal0ueSk7CiAgICAgICAgfSBlbHNlIGlmIChjb250b3VyW2ogKyAxXS5mbGFncyAmIDEpIHsKICAgICAgICAgIHF1YWRyYXRpY0N1cnZlVG8oY29udG91cltqXS54LCBjb250b3VyW2pdLnksIGNvbnRvdXJbaiArIDFdLngsIGNvbnRvdXJbaiArIDFdLnkpOwogICAgICAgICAgaisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBxdWFkcmF0aWNDdXJ2ZVRvKGNvbnRvdXJbal0ueCwgY29udG91cltqXS55LCAoY29udG91cltqXS54ICsgY29udG91cltqICsgMV0ueCkgLyAyLCAoY29udG91cltqXS55ICsgY29udG91cltqICsgMV0ueSkgLyAyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhcnRQb2ludCA9IGVuZFBvaW50ICsgMTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gY29tcGlsZUNoYXJTdHJpbmcoY2hhclN0cmluZ0NvZGUsIGNtZHMsIGZvbnQsIGdseXBoSWQpIHsKICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkgewogICAgaWYgKGZpcnN0UG9pbnQpIHsKICAgICAgY21kcy5hZGQoIkwiLCBmaXJzdFBvaW50KTsKICAgIH0KICAgIGZpcnN0UG9pbnQgPSBbeCwgeV07CiAgICBjbWRzLmFkZCgiTSIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIGxpbmVUbyh4LCB5KSB7CiAgICBjbWRzLmFkZCgiTCIsIFt4LCB5XSk7CiAgfQogIGZ1bmN0aW9uIGJlemllckN1cnZlVG8oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHsKICAgIGNtZHMuYWRkKCJDIiwgW3gxLCB5MSwgeDIsIHkyLCB4LCB5XSk7CiAgfQogIGNvbnN0IHN0YWNrID0gW107CiAgbGV0IHggPSAwLAogICAgeSA9IDA7CiAgbGV0IHN0ZW1zID0gMDsKICBsZXQgZmlyc3RQb2ludCA9IG51bGw7CiAgZnVuY3Rpb24gcGFyc2UoY29kZSkgewogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBjb2RlLmxlbmd0aCkgewogICAgICBsZXQgc3RhY2tDbGVhbiA9IGZhbHNlOwogICAgICBsZXQgdiA9IGNvZGVbaSsrXTsKICAgICAgbGV0IHhhLCB4YiwgeWEsIHliLCB5MSwgeTIsIHkzLCBuLCBzdWJyQ29kZTsKICAgICAgc3dpdGNoICh2KSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CiAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICB5ICs9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbW92ZVRvKHgsIHkpOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBsaW5lVG8oeCwgeSk7CiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzoKICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBsaW5lVG8oeCwgeSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDg6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMDoKICAgICAgICAgIG4gPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN1YnJDb2RlID0gbnVsbDsKICAgICAgICAgIGlmIChmb250LmlzQ0ZGQ0lERm9udCkgewogICAgICAgICAgICBjb25zdCBmZEluZGV4ID0gZm9udC5mZFNlbGVjdC5nZXRGREluZGV4KGdseXBoSWQpOwogICAgICAgICAgICBpZiAoZmRJbmRleCA+PSAwICYmIGZkSW5kZXggPCBmb250LmZkQXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgY29uc3QgZm9udERpY3QgPSBmb250LmZkQXJyYXlbZmRJbmRleF07CiAgICAgICAgICAgICAgbGV0IHN1YnJzOwogICAgICAgICAgICAgIGlmIChmb250RGljdC5wcml2YXRlRGljdD8uc3VicnNJbmRleCkgewogICAgICAgICAgICAgICAgc3VicnMgPSBmb250RGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzdWJycykgewogICAgICAgICAgICAgICAgbiArPSBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycyk7CiAgICAgICAgICAgICAgICBzdWJyQ29kZSA9IHN1YnJzW25dOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3YXJuKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3VickNvZGUgPSBmb250LnN1YnJzW24gKyBmb250LnN1YnJzQmlhc107CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VickNvZGUpIHsKICAgICAgICAgICAgcGFyc2Uoc3VickNvZGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMToKICAgICAgICAgIHJldHVybjsKICAgICAgICBjYXNlIDEyOgogICAgICAgICAgdiA9IGNvZGVbaSsrXTsKICAgICAgICAgIHN3aXRjaCAodikgewogICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeTEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHksIHhiLCB5MSwgeCwgeTEpOwogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHksIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHkxID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeTIgPSB5MSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHkyLCB4LCB5Mik7CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5MyA9IHkyICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHkyLCB4YiwgeTMsIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgIGNvbnN0IHgwID0geCwKICAgICAgICAgICAgICAgIHkwID0geTsKICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGI7CiAgICAgICAgICAgICAgeSA9IHliOwogICAgICAgICAgICAgIGlmIChNYXRoLmFicyh4IC0geDApID4gTWF0aC5hYnMoeSAtIHkwKSkgewogICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgdW5rbm93biBvcGVyYXRvcjogMTIgJHt2fWApOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNDoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPj0gNCkgewogICAgICAgICAgICBjb25zdCBhY2hhciA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICBjb25zdCBiY2hhciA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICB5ID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHggPSBzdGFjay5wb3AoKTsKICAgICAgICAgICAgY21kcy5zYXZlKCk7CiAgICAgICAgICAgIGNtZHMudHJhbnNsYXRlKHgsIHkpOwogICAgICAgICAgICBsZXQgY21hcCA9IGxvb2t1cENtYXAoZm9udC5jbWFwLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW1N0YW5kYXJkRW5jb2RpbmdbYWNoYXJdXSkpOwogICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWRzLCBmb250LCBjbWFwLmdseXBoSWQpOwogICAgICAgICAgICBjbWRzLnJlc3RvcmUoKTsKICAgICAgICAgICAgY21hcCA9IGxvb2t1cENtYXAoZm9udC5jbWFwLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW1N0YW5kYXJkRW5jb2RpbmdbYmNoYXJdXSkpOwogICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWRzLCBmb250LCBjbWFwLmdseXBoSWQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2UgMTg6CiAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOToKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgaSArPSBzdGVtcyArIDcgPj4gMzsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMDoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgaSArPSBzdGVtcyArIDcgPj4gMzsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMToKICAgICAgICAgIHkgKz0gc3RhY2sucG9wKCk7CiAgICAgICAgICB4ICs9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbW92ZVRvKHgsIHkpOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDIyOgogICAgICAgICAgeCArPSBzdGFjay5wb3AoKTsKICAgICAgICAgIG1vdmVUbyh4LCB5KTsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMzoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI0OgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgIGxpbmVUbyh4LCB5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjU6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gNikgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjY6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHg7CiAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeCA9IHhiOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjc6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikgewogICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YSA9IHk7CiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeSA9IHliOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjg6CiAgICAgICAgICBzdGFjay5wdXNoKHJlYWRJbnQxNihjb2RlLCBpKSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI5OgogICAgICAgICAgbiA9IHN0YWNrLnBvcCgpICsgZm9udC5nc3VicnNCaWFzOwogICAgICAgICAgc3VickNvZGUgPSBmb250LmdzdWJyc1tuXTsKICAgICAgICAgIGlmIChzdWJyQ29kZSkgewogICAgICAgICAgICBwYXJzZShzdWJyQ29kZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDMwOgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeGEgPSB4OwogICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWEgPSB5OwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzMToKICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHlhID0geTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHhhID0geDsKICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAodiA8IDMyKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgdW5rbm93biBvcGVyYXRvcjogJHt2fWApOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHYgPCAyNDcpIHsKICAgICAgICAgICAgc3RhY2sucHVzaCh2IC0gMTM5KTsKICAgICAgICAgIH0gZWxzZSBpZiAodiA8IDI1MSkgewogICAgICAgICAgICBzdGFjay5wdXNoKCh2IC0gMjQ3KSAqIDI1NiArIGNvZGVbaSsrXSArIDEwOCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHYgPCAyNTUpIHsKICAgICAgICAgICAgc3RhY2sucHVzaCgtKHYgLSAyNTEpICogMjU2IC0gY29kZVtpKytdIC0gMTA4KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNiB8IGNvZGVbaSArIDJdIDw8IDggfCBjb2RlW2kgKyAzXSkgLyA2NTUzNik7CiAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChzdGFja0NsZWFuKSB7CiAgICAgICAgc3RhY2subGVuZ3RoID0gMDsKICAgICAgfQogICAgfQogIH0KICBwYXJzZShjaGFyU3RyaW5nQ29kZSk7Cn0KY29uc3QgTk9PUCA9ICIiOwpjbGFzcyBDb21tYW5kcyB7CiAgY21kcyA9IFtdOwogIHRyYW5zZm9ybVN0YWNrID0gW107CiAgY3VycmVudFRyYW5zZm9ybSA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKICBhZGQoY21kLCBhcmdzKSB7CiAgICBpZiAoYXJncykgewogICAgICBjb25zdCBbYSwgYiwgYywgZCwgZSwgZl0gPSB0aGlzLmN1cnJlbnRUcmFuc2Zvcm07CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGFyZ3MubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICAgIGNvbnN0IHggPSBhcmdzW2ldOwogICAgICAgIGNvbnN0IHkgPSBhcmdzW2kgKyAxXTsKICAgICAgICBhcmdzW2ldID0gYSAqIHggKyBjICogeSArIGU7CiAgICAgICAgYXJnc1tpICsgMV0gPSBiICogeCArIGQgKiB5ICsgZjsKICAgICAgfQogICAgICB0aGlzLmNtZHMucHVzaChgJHtjbWR9JHthcmdzLmpvaW4oIiAiKX1gKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuY21kcy5wdXNoKGNtZCk7CiAgICB9CiAgfQogIHRyYW5zZm9ybSh0cmFuc2YpIHsKICAgIHRoaXMuY3VycmVudFRyYW5zZm9ybSA9IFV0aWwudHJhbnNmb3JtKHRoaXMuY3VycmVudFRyYW5zZm9ybSwgdHJhbnNmKTsKICB9CiAgdHJhbnNsYXRlKHgsIHkpIHsKICAgIHRoaXMudHJhbnNmb3JtKFsxLCAwLCAwLCAxLCB4LCB5XSk7CiAgfQogIHNhdmUoKSB7CiAgICB0aGlzLnRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy5jdXJyZW50VHJhbnNmb3JtLnNsaWNlKCkpOwogIH0KICByZXN0b3JlKCkgewogICAgdGhpcy5jdXJyZW50VHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm1TdGFjay5wb3AoKSB8fCBbMSwgMCwgMCwgMSwgMCwgMF07CiAgfQogIGdldFNWRygpIHsKICAgIHJldHVybiB0aGlzLmNtZHMuam9pbigiIik7CiAgfQp9CmNsYXNzIENvbXBpbGVkRm9udCB7CiAgY29uc3RydWN0b3IoZm9udE1hdHJpeCkgewogICAgdGhpcy5mb250TWF0cml4ID0gZm9udE1hdHJpeDsKICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB9CiAgZ2V0UGF0aEpzKHVuaWNvZGUpIHsKICAgIGNvbnN0IHsKICAgICAgY2hhckNvZGUsCiAgICAgIGdseXBoSWQKICAgIH0gPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7CiAgICBsZXQgZm4gPSB0aGlzLmNvbXBpbGVkR2x5cGhzW2dseXBoSWRdLAogICAgICBjb21waWxlRXg7CiAgICBpZiAoZm4gPT09IHVuZGVmaW5lZCkgewogICAgICB0cnkgewogICAgICAgIGZuID0gdGhpcy5jb21waWxlR2x5cGgodGhpcy5nbHlwaHNbZ2x5cGhJZF0sIGdseXBoSWQpOwogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIGZuID0gTk9PUDsKICAgICAgICBjb21waWxlRXggPSBleDsKICAgICAgfQogICAgICB0aGlzLmNvbXBpbGVkR2x5cGhzW2dseXBoSWRdID0gZm47CiAgICB9CiAgICB0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID8/PSBnbHlwaElkOwogICAgaWYgKGNvbXBpbGVFeCkgewogICAgICB0aHJvdyBjb21waWxlRXg7CiAgICB9CiAgICByZXR1cm4gZm47CiAgfQogIGNvbXBpbGVHbHlwaChjb2RlLCBnbHlwaElkKSB7CiAgICBpZiAoIWNvZGU/Lmxlbmd0aCB8fCBjb2RlWzBdID09PSAxNCkgewogICAgICByZXR1cm4gTk9PUDsKICAgIH0KICAgIGxldCBmb250TWF0cml4ID0gdGhpcy5mb250TWF0cml4OwogICAgaWYgKHRoaXMuaXNDRkZDSURGb250KSB7CiAgICAgIGNvbnN0IGZkSW5kZXggPSB0aGlzLmZkU2VsZWN0LmdldEZESW5kZXgoZ2x5cGhJZCk7CiAgICAgIGlmIChmZEluZGV4ID49IDAgJiYgZmRJbmRleCA8IHRoaXMuZmRBcnJheS5sZW5ndGgpIHsKICAgICAgICBjb25zdCBmb250RGljdCA9IHRoaXMuZmRBcnJheVtmZEluZGV4XTsKICAgICAgICBmb250TWF0cml4ID0gZm9udERpY3QuZ2V0QnlOYW1lKCJGb250TWF0cml4IikgfHwgRk9OVF9JREVOVElUWV9NQVRSSVg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguIik7CiAgICAgIH0KICAgIH0KICAgIGFzc2VydChpc051bWJlckFycmF5KGZvbnRNYXRyaXgsIDYpLCAiRXhwZWN0ZWQgYSB2YWxpZCBmb250TWF0cml4LiIpOwogICAgY29uc3QgY21kcyA9IG5ldyBDb21tYW5kcygpOwogICAgY21kcy50cmFuc2Zvcm0oZm9udE1hdHJpeC5zbGljZSgpKTsKICAgIHRoaXMuY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzLCBnbHlwaElkKTsKICAgIGNtZHMuYWRkKCJaIik7CiAgICByZXR1cm4gY21kcy5nZXRTVkcoKTsKICB9CiAgY29tcGlsZUdseXBoSW1wbCgpIHsKICAgIHVucmVhY2hhYmxlKCJDaGlsZHJlbiBjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcy4iKTsKICB9CiAgaGFzQnVpbHRQYXRoKHVuaWNvZGUpIHsKICAgIGNvbnN0IHsKICAgICAgY2hhckNvZGUsCiAgICAgIGdseXBoSWQKICAgIH0gPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7CiAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tnbHlwaElkXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gIT09IHVuZGVmaW5lZDsKICB9Cn0KY2xhc3MgVHJ1ZVR5cGVDb21waWxlZCBleHRlbmRzIENvbXBpbGVkRm9udCB7CiAgY29uc3RydWN0b3IoZ2x5cGhzLCBjbWFwLCBmb250TWF0cml4KSB7CiAgICBzdXBlcihmb250TWF0cml4IHx8IFswLjAwMDQ4OCwgMCwgMCwgMC4wMDA0ODgsIDAsIDBdKTsKICAgIHRoaXMuZ2x5cGhzID0gZ2x5cGhzOwogICAgdGhpcy5jbWFwID0gY21hcDsKICB9CiAgY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzKSB7CiAgICBjb21waWxlR2x5Zihjb2RlLCBjbWRzLCB0aGlzKTsKICB9Cn0KY2xhc3MgVHlwZTJDb21waWxlZCBleHRlbmRzIENvbXBpbGVkRm9udCB7CiAgY29uc3RydWN0b3IoY2ZmSW5mbywgY21hcCwgZm9udE1hdHJpeCkgewogICAgc3VwZXIoZm9udE1hdHJpeCB8fCBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXSk7CiAgICB0aGlzLmdseXBocyA9IGNmZkluZm8uZ2x5cGhzOwogICAgdGhpcy5nc3VicnMgPSBjZmZJbmZvLmdzdWJycyB8fCBbXTsKICAgIHRoaXMuc3VicnMgPSBjZmZJbmZvLnN1YnJzIHx8IFtdOwogICAgdGhpcy5jbWFwID0gY21hcDsKICAgIHRoaXMuZ2x5cGhOYW1lTWFwID0gZ2V0R2x5cGhzVW5pY29kZSgpOwogICAgdGhpcy5nc3VicnNCaWFzID0gZ2V0U3Vicm91dGluZUJpYXModGhpcy5nc3VicnMpOwogICAgdGhpcy5zdWJyc0JpYXMgPSBnZXRTdWJyb3V0aW5lQmlhcyh0aGlzLnN1YnJzKTsKICAgIHRoaXMuaXNDRkZDSURGb250ID0gY2ZmSW5mby5pc0NGRkNJREZvbnQ7CiAgICB0aGlzLmZkU2VsZWN0ID0gY2ZmSW5mby5mZFNlbGVjdDsKICAgIHRoaXMuZmRBcnJheSA9IGNmZkluZm8uZmRBcnJheTsKICB9CiAgY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzLCBnbHlwaElkKSB7CiAgICBjb21waWxlQ2hhclN0cmluZyhjb2RlLCBjbWRzLCB0aGlzLCBnbHlwaElkKTsKICB9Cn0KY2xhc3MgRm9udFJlbmRlcmVyRmFjdG9yeSB7CiAgc3RhdGljIGNyZWF0ZShmb250LCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZm9udC5kYXRhKTsKICAgIGxldCBjbWFwLCBnbHlmLCBsb2NhLCBjZmYsIGluZGV4VG9Mb2NGb3JtYXQsIHVuaXRzUGVyRW07CiAgICBjb25zdCBudW1UYWJsZXMgPSByZWFkVWludDE2KGRhdGEsIDQpOwogICAgZm9yIChsZXQgaSA9IDAsIHAgPSAxMjsgaSA8IG51bVRhYmxlczsgaSsrLCBwICs9IDE2KSB7CiAgICAgIGNvbnN0IHRhZyA9IGJ5dGVzVG9TdHJpbmcoZGF0YS5zdWJhcnJheShwLCBwICsgNCkpOwogICAgICBjb25zdCBvZmZzZXQgPSByZWFkVWludDMyKGRhdGEsIHAgKyA4KTsKICAgICAgY29uc3QgbGVuZ3RoID0gcmVhZFVpbnQzMihkYXRhLCBwICsgMTIpOwogICAgICBzd2l0Y2ggKHRhZykgewogICAgICAgIGNhc2UgImNtYXAiOgogICAgICAgICAgY21hcCA9IHBhcnNlQ21hcChkYXRhLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnbHlmIjoKICAgICAgICAgIGdseWYgPSBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxvY2EiOgogICAgICAgICAgbG9jYSA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiaGVhZCI6CiAgICAgICAgICB1bml0c1BlckVtID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQgKyAxOCk7CiAgICAgICAgICBpbmRleFRvTG9jRm9ybWF0ID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQgKyA1MCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJDRkYgIjoKICAgICAgICAgIGNmZiA9IHBhcnNlQ2ZmKGRhdGEsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoZ2x5ZikgewogICAgICBjb25zdCBmb250TWF0cml4ID0gIXVuaXRzUGVyRW0gPyBmb250LmZvbnRNYXRyaXggOiBbMSAvIHVuaXRzUGVyRW0sIDAsIDAsIDEgLyB1bml0c1BlckVtLCAwLCAwXTsKICAgICAgcmV0dXJuIG5ldyBUcnVlVHlwZUNvbXBpbGVkKHBhcnNlR2x5ZlRhYmxlKGdseWYsIGxvY2EsIGluZGV4VG9Mb2NGb3JtYXQpLCBjbWFwLCBmb250TWF0cml4KTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZTJDb21waWxlZChjZmYsIGNtYXAsIGZvbnQuZm9udE1hdHJpeCk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9tZXRyaWNzLmpzCgpjb25zdCBnZXRNZXRyaWNzID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdC5Db3VyaWVyID0gNjAwOwogIHRbIkNvdXJpZXItQm9sZCJdID0gNjAwOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9IDYwMDsKICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9IDYwMDsKICB0LkhlbHZldGljYSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogICAgdC5zcGFjZSA9IDI3ODsKICAgIHQuZXhjbGFtID0gMjc4OwogICAgdC5xdW90ZWRibCA9IDM1NTsKICAgIHQubnVtYmVyc2lnbiA9IDU1NjsKICAgIHQuZG9sbGFyID0gNTU2OwogICAgdC5wZXJjZW50ID0gODg5OwogICAgdC5hbXBlcnNhbmQgPSA2Njc7CiAgICB0LnF1b3RlcmlnaHQgPSAyMjI7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2sgPSAzODk7CiAgICB0LnBsdXMgPSA1ODQ7CiAgICB0LmNvbW1hID0gMjc4OwogICAgdC5oeXBoZW4gPSAzMzM7CiAgICB0LnBlcmlvZCA9IDI3ODsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1NTY7CiAgICB0Lm9uZSA9IDU1NjsKICAgIHQudHdvID0gNTU2OwogICAgdC50aHJlZSA9IDU1NjsKICAgIHQuZm91ciA9IDU1NjsKICAgIHQuZml2ZSA9IDU1NjsKICAgIHQuc2l4ID0gNTU2OwogICAgdC5zZXZlbiA9IDU1NjsKICAgIHQuZWlnaHQgPSA1NTY7CiAgICB0Lm5pbmUgPSA1NTY7CiAgICB0LmNvbG9uID0gMjc4OwogICAgdC5zZW1pY29sb24gPSAyNzg7CiAgICB0Lmxlc3MgPSA1ODQ7CiAgICB0LmVxdWFsID0gNTg0OwogICAgdC5ncmVhdGVyID0gNTg0OwogICAgdC5xdWVzdGlvbiA9IDU1NjsKICAgIHQuYXQgPSAxMDE1OwogICAgdC5BID0gNjY3OwogICAgdC5CID0gNjY3OwogICAgdC5DID0gNzIyOwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzc4OwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMjc4OwogICAgdC5KID0gNTAwOwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNTU2OwogICAgdC5NID0gODMzOwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzc4OwogICAgdC5QID0gNjY3OwogICAgdC5RID0gNzc4OwogICAgdC5SID0gNzIyOwogICAgdC5TID0gNjY3OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gOTQ0OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjY3OwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDI3ODsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAyNzg7CiAgICB0LmFzY2lpY2lyY3VtID0gNDY5OwogICAgdC51bmRlcnNjb3JlID0gNTU2OwogICAgdC5xdW90ZWxlZnQgPSAyMjI7CiAgICB0LmEgPSA1NTY7CiAgICB0LmIgPSA1NTY7CiAgICB0LmMgPSA1MDA7CiAgICB0LmQgPSA1NTY7CiAgICB0LmUgPSA1NTY7CiAgICB0LmYgPSAyNzg7CiAgICB0LmcgPSA1NTY7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyMjI7CiAgICB0LmogPSAyMjI7CiAgICB0LmsgPSA1MDA7CiAgICB0LmwgPSAyMjI7CiAgICB0Lm0gPSA4MzM7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1NTY7CiAgICB0LnAgPSA1NTY7CiAgICB0LnEgPSA1NTY7CiAgICB0LnIgPSAzMzM7CiAgICB0LnMgPSA1MDA7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA1MDA7CiAgICB0LncgPSA3MjI7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA1MDA7CiAgICB0LnogPSA1MDA7CiAgICB0LmJyYWNlbGVmdCA9IDMzNDsKICAgIHQuYmFyID0gMjYwOwogICAgdC5icmFjZXJpZ2h0ID0gMzM0OwogICAgdC5hc2NpaXRpbGRlID0gNTg0OwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTU2OwogICAgdC5zdGVybGluZyA9IDU1NjsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDU1NjsKICAgIHQuZmxvcmluID0gNTU2OwogICAgdC5zZWN0aW9uID0gNTU2OwogICAgdC5jdXJyZW5jeSA9IDU1NjsKICAgIHQucXVvdGVzaW5nbGUgPSAxOTE7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTAwOwogICAgdC5mbCA9IDUwMDsKICAgIHQuZW5kYXNoID0gNTU2OwogICAgdC5kYWdnZXIgPSA1NTY7CiAgICB0LmRhZ2dlcmRibCA9IDU1NjsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7CiAgICB0LnBhcmFncmFwaCA9IDUzNzsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDIyMjsKICAgIHQucXVvdGVkYmxiYXNlID0gMzMzOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gMzMzOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzcwOwogICAgdC5Mc2xhc2ggPSA1NTY7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CiAgICB0LmFlID0gODg5OwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjIyOwogICAgdC5vc2xhc2ggPSA2MTE7CiAgICB0Lm9lID0gOTQ0OwogICAgdC5nZXJtYW5kYmxzID0gNjExOwogICAgdC5JZGllcmVzaXMgPSAyNzg7CiAgICB0LmVhY3V0ZSA9IDU1NjsKICAgIHQuYWJyZXZlID0gNTU2OwogICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5lY2Fyb24gPSA1NTY7CiAgICB0LllkaWVyZXNpcyA9IDY2NzsKICAgIHQuZGl2aWRlID0gNTg0OwogICAgdC5ZYWN1dGUgPSA2Njc7CiAgICB0LkFjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hYWN1dGUgPSA1NTY7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1MDA7CiAgICB0LnNjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1NTY7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDU1NjsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3Mzc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDUwMDsKICAgIHQuYXJpbmcgPSA1NTY7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjIyOwogICAgdC5hZ3JhdmUgPSA1NTY7CiAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1NTY7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDUwMDsKICAgIHQuc2NlZGlsbGEgPSA1MDA7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ3MTsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuQW1hY3JvbiA9IDY2NzsKICAgIHQucmNhcm9uID0gMzMzOwogICAgdC5jY2VkaWxsYSA9IDUwMDsKICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKICAgIHQuVGhvcm4gPSA2Njc7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNjY3OwogICAgdC5kY2Fyb24gPSA2NDM7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNTU2OwogICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDY2NzsKICAgIHQuQWJyZXZlID0gNjY3OwogICAgdC5tdWx0aXBseSA9IDU4NDsKICAgIHQudWFjdXRlID0gNTU2OwogICAgdC5UY2Fyb24gPSA2MTE7CiAgICB0LnBhcnRpYWxkaWZmID0gNDc2OwogICAgdC55ZGllcmVzaXMgPSA1MDA7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1NTY7CiAgICB0LmVkaWVyZXNpcyA9IDU1NjsKICAgIHQuY2FjdXRlID0gNTAwOwogICAgdC5uYWN1dGUgPSA1NTY7CiAgICB0LnVtYWNyb24gPSA1NTY7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMjc4OwogICAgdC5wbHVzbWludXMgPSA1ODQ7CiAgICB0LmJyb2tlbmJhciA9IDI2MDsKICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMjc4OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gMzMzOwogICAgdC5vbWFjcm9uID0gNTU2OwogICAgdC5aYWN1dGUgPSA2MTE7CiAgICB0LlpjYXJvbiA9IDYxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyMjI7CiAgICB0LnRjYXJvbiA9IDMxNzsKICAgIHQuZW9nb25layA9IDU1NjsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNjY3OwogICAgdC5BZGllcmVzaXMgPSA2Njc7CiAgICB0LmVncmF2ZSA9IDU1NjsKICAgIHQuemFjdXRlID0gNTAwOwogICAgdC5pb2dvbmVrID0gMjIyOwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDU1NjsKICAgIHQuYW1hY3JvbiA9IDU1NjsKICAgIHQuc2FjdXRlID0gNTAwOwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDU1NjsKICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA1NTY7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDU1NjsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNTU2OwogICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OwogICAgdC5TY2VkaWxsYSA9IDY2NzsKICAgIHQubGNhcm9uID0gMjk5OwogICAgdC5LY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0LkxhY3V0ZSA9IDU1NjsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKICAgIHQuSWdyYXZlID0gMjc4OwogICAgdC5JbWFjcm9uID0gMjc4OwogICAgdC5MY2Fyb24gPSA1NTY7CiAgICB0Lm9uZWhhbGYgPSA4MzQ7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA1NTY7CiAgICB0Lm50aWxkZSA9IDU1NjsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNTU2OwogICAgdC5nYnJldmUgPSA1NTY7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CiAgICB0LlNjYXJvbiA9IDY2NzsKICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDU1NjsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA1NTY7CiAgICB0LnJhZGljYWwgPSA0NTM7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gMzMzOwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDU1NjsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LkF0aWxkZSA9IDY2NzsKICAgIHQuQW9nb25layA9IDY2NzsKICAgIHQuQXJpbmcgPSA2Njc7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDUwMDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMjc4OwogICAgdC5rY29tbWFhY2NlbnQgPSA1MDA7CiAgICB0Lm1pbnVzID0gNTg0OwogICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKICAgIHQubmNhcm9uID0gNTU2OwogICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CiAgICB0Lm9kaWVyZXNpcyA9IDU1NjsKICAgIHQudWRpZXJlc2lzID0gNTU2OwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5ldGggPSA1NTY7CiAgICB0LnpjYXJvbiA9IDUwMDsKICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDU1NjsKICB9KTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjc4OwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNDc0OwogICAgdC5udW1iZXJzaWduID0gNTU2OwogICAgdC5kb2xsYXIgPSA1NTY7CiAgICB0LnBlcmNlbnQgPSA4ODk7CiAgICB0LmFtcGVyc2FuZCA9IDcyMjsKICAgIHQucXVvdGVyaWdodCA9IDI3ODsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDM4OTsKICAgIHQucGx1cyA9IDU4NDsKICAgIHQuY29tbWEgPSAyNzg7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjc4OwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDU1NjsKICAgIHQub25lID0gNTU2OwogICAgdC50d28gPSA1NTY7CiAgICB0LnRocmVlID0gNTU2OwogICAgdC5mb3VyID0gNTU2OwogICAgdC5maXZlID0gNTU2OwogICAgdC5zaXggPSA1NTY7CiAgICB0LnNldmVuID0gNTU2OwogICAgdC5laWdodCA9IDU1NjsKICAgIHQubmluZSA9IDU1NjsKICAgIHQuY29sb24gPSAzMzM7CiAgICB0LnNlbWljb2xvbiA9IDMzMzsKICAgIHQubGVzcyA9IDU4NDsKICAgIHQuZXF1YWwgPSA1ODQ7CiAgICB0LmdyZWF0ZXIgPSA1ODQ7CiAgICB0LnF1ZXN0aW9uID0gNjExOwogICAgdC5hdCA9IDk3NTsKICAgIHQuQSA9IDcyMjsKICAgIHQuQiA9IDcyMjsKICAgIHQuQyA9IDcyMjsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDY2NzsKICAgIHQuRiA9IDYxMTsKICAgIHQuRyA9IDc3ODsKICAgIHQuSCA9IDcyMjsKICAgIHQuSSA9IDI3ODsKICAgIHQuSiA9IDU1NjsKICAgIHQuSyA9IDcyMjsKICAgIHQuTCA9IDYxMTsKICAgIHQuTSA9IDgzMzsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDc3ODsKICAgIHQuUCA9IDY2NzsKICAgIHQuUSA9IDc3ODsKICAgIHQuUiA9IDcyMjsKICAgIHQuUyA9IDY2NzsKICAgIHQuVCA9IDYxMTsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDY2NzsKICAgIHQuVyA9IDk0NDsKICAgIHQuWCA9IDY2NzsKICAgIHQuWSA9IDY2NzsKICAgIHQuWiA9IDYxMTsKICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CiAgICB0LmJhY2tzbGFzaCA9IDI3ODsKICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOwogICAgdC5hc2NpaWNpcmN1bSA9IDU4NDsKICAgIHQudW5kZXJzY29yZSA9IDU1NjsKICAgIHQucXVvdGVsZWZ0ID0gMjc4OwogICAgdC5hID0gNTU2OwogICAgdC5iID0gNjExOwogICAgdC5jID0gNTU2OwogICAgdC5kID0gNjExOwogICAgdC5lID0gNTU2OwogICAgdC5mID0gMzMzOwogICAgdC5nID0gNjExOwogICAgdC5oID0gNjExOwogICAgdC5pID0gMjc4OwogICAgdC5qID0gMjc4OwogICAgdC5rID0gNTU2OwogICAgdC5sID0gMjc4OwogICAgdC5tID0gODg5OwogICAgdC5uID0gNjExOwogICAgdC5vID0gNjExOwogICAgdC5wID0gNjExOwogICAgdC5xID0gNjExOwogICAgdC5yID0gMzg5OwogICAgdC5zID0gNTU2OwogICAgdC50ID0gMzMzOwogICAgdC51ID0gNjExOwogICAgdC52ID0gNTU2OwogICAgdC53ID0gNzc4OwogICAgdC54ID0gNTU2OwogICAgdC55ID0gNTU2OwogICAgdC56ID0gNTAwOwogICAgdC5icmFjZWxlZnQgPSAzODk7CiAgICB0LmJhciA9IDI4MDsKICAgIHQuYnJhY2VyaWdodCA9IDM4OTsKICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKICAgIHQuZXhjbGFtZG93biA9IDMzMzsKICAgIHQuY2VudCA9IDU1NjsKICAgIHQuc3RlcmxpbmcgPSA1NTY7CiAgICB0LmZyYWN0aW9uID0gMTY3OwogICAgdC55ZW4gPSA1NTY7CiAgICB0LmZsb3JpbiA9IDU1NjsKICAgIHQuc2VjdGlvbiA9IDU1NjsKICAgIHQuY3VycmVuY3kgPSA1NTY7CiAgICB0LnF1b3Rlc2luZ2xlID0gMjM4OwogICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7CiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1NTY7CiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOwogICAgdC5maSA9IDYxMTsKICAgIHQuZmwgPSA2MTE7CiAgICB0LmVuZGFzaCA9IDU1NjsKICAgIHQuZGFnZ2VyID0gNTU2OwogICAgdC5kYWdnZXJkYmwgPSA1NTY7CiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjc4OwogICAgdC5wYXJhZ3JhcGggPSA1NTY7CiAgICB0LmJ1bGxldCA9IDM1MDsKICAgIHQucXVvdGVzaW5nbGJhc2UgPSAyNzg7CiAgICB0LnF1b3RlZGJsYmFzZSA9IDUwMDsKICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1NTY7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOwogICAgdC5xdWVzdGlvbmRvd24gPSA2MTE7CiAgICB0LmdyYXZlID0gMzMzOwogICAgdC5hY3V0ZSA9IDMzMzsKICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKICAgIHQudGlsZGUgPSAzMzM7CiAgICB0Lm1hY3JvbiA9IDMzMzsKICAgIHQuYnJldmUgPSAzMzM7CiAgICB0LmRvdGFjY2VudCA9IDMzMzsKICAgIHQuZGllcmVzaXMgPSAzMzM7CiAgICB0LnJpbmcgPSAzMzM7CiAgICB0LmNlZGlsbGEgPSAzMzM7CiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKICAgIHQub2dvbmVrID0gMzMzOwogICAgdC5jYXJvbiA9IDMzMzsKICAgIHQuZW1kYXNoID0gMTAwMDsKICAgIHQuQUUgPSAxMDAwOwogICAgdC5vcmRmZW1pbmluZSA9IDM3MDsKICAgIHQuTHNsYXNoID0gNjExOwogICAgdC5Pc2xhc2ggPSA3Nzg7CiAgICB0Lk9FID0gMTAwMDsKICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OwogICAgdC5hZSA9IDg4OTsKICAgIHQuZG90bGVzc2kgPSAyNzg7CiAgICB0LmxzbGFzaCA9IDI3ODsKICAgIHQub3NsYXNoID0gNjExOwogICAgdC5vZSA9IDk0NDsKICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKICAgIHQuSWRpZXJlc2lzID0gMjc4OwogICAgdC5lYWN1dGUgPSA1NTY7CiAgICB0LmFicmV2ZSA9IDU1NjsKICAgIHQudWh1bmdhcnVtbGF1dCA9IDYxMTsKICAgIHQuZWNhcm9uID0gNTU2OwogICAgdC5ZZGllcmVzaXMgPSA2Njc7CiAgICB0LmRpdmlkZSA9IDU4NDsKICAgIHQuWWFjdXRlID0gNjY3OwogICAgdC5BY2lyY3VtZmxleCA9IDcyMjsKICAgIHQuYWFjdXRlID0gNTU2OwogICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKICAgIHQueWFjdXRlID0gNTU2OwogICAgdC5zY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LmVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5VcmluZyA9IDcyMjsKICAgIHQuVWRpZXJlc2lzID0gNzIyOwogICAgdC5hb2dvbmVrID0gNTU2OwogICAgdC5VYWN1dGUgPSA3MjI7CiAgICB0LnVvZ29uZWsgPSA2MTE7CiAgICB0LkVkaWVyZXNpcyA9IDY2NzsKICAgIHQuRGNyb2F0ID0gNzIyOwogICAgdC5jb21tYWFjY2VudCA9IDI1MDsKICAgIHQuY29weXJpZ2h0ID0gNzM3OwogICAgdC5FbWFjcm9uID0gNjY3OwogICAgdC5jY2Fyb24gPSA1NTY7CiAgICB0LmFyaW5nID0gNTU2OwogICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LmxhY3V0ZSA9IDI3ODsKICAgIHQuYWdyYXZlID0gNTU2OwogICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkNhY3V0ZSA9IDcyMjsKICAgIHQuYXRpbGRlID0gNTU2OwogICAgdC5FZG90YWNjZW50ID0gNjY3OwogICAgdC5zY2Fyb24gPSA1NTY7CiAgICB0LnNjZWRpbGxhID0gNTU2OwogICAgdC5pYWN1dGUgPSAyNzg7CiAgICB0LmxvemVuZ2UgPSA0OTQ7CiAgICB0LlJjYXJvbiA9IDcyMjsKICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OwogICAgdC51Y2lyY3VtZmxleCA9IDYxMTsKICAgIHQuYWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LkFtYWNyb24gPSA3MjI7CiAgICB0LnJjYXJvbiA9IDM4OTsKICAgIHQuY2NlZGlsbGEgPSA1NTY7CiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CiAgICB0LlRob3JuID0gNjY3OwogICAgdC5PbWFjcm9uID0gNzc4OwogICAgdC5SYWN1dGUgPSA3MjI7CiAgICB0LlNhY3V0ZSA9IDY2NzsKICAgIHQuZGNhcm9uID0gNzQzOwogICAgdC5VbWFjcm9uID0gNzIyOwogICAgdC51cmluZyA9IDYxMTsKICAgIHQudGhyZWVzdXBlcmlvciA9IDMzMzsKICAgIHQuT2dyYXZlID0gNzc4OwogICAgdC5BZ3JhdmUgPSA3MjI7CiAgICB0LkFicmV2ZSA9IDcyMjsKICAgIHQubXVsdGlwbHkgPSA1ODQ7CiAgICB0LnVhY3V0ZSA9IDYxMTsKICAgIHQuVGNhcm9uID0gNjExOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQueWRpZXJlc2lzID0gNTU2OwogICAgdC5OYWN1dGUgPSA3MjI7CiAgICB0LmljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWRpZXJlc2lzID0gNTU2OwogICAgdC5lZGllcmVzaXMgPSA1NTY7CiAgICB0LmNhY3V0ZSA9IDU1NjsKICAgIHQubmFjdXRlID0gNjExOwogICAgdC51bWFjcm9uID0gNjExOwogICAgdC5OY2Fyb24gPSA3MjI7CiAgICB0LklhY3V0ZSA9IDI3ODsKICAgIHQucGx1c21pbnVzID0gNTg0OwogICAgdC5icm9rZW5iYXIgPSAyODA7CiAgICB0LnJlZ2lzdGVyZWQgPSA3Mzc7CiAgICB0LkdicmV2ZSA9IDc3ODsKICAgIHQuSWRvdGFjY2VudCA9IDI3ODsKICAgIHQuc3VtbWF0aW9uID0gNjAwOwogICAgdC5FZ3JhdmUgPSA2Njc7CiAgICB0LnJhY3V0ZSA9IDM4OTsKICAgIHQub21hY3JvbiA9IDYxMTsKICAgIHQuWmFjdXRlID0gNjExOwogICAgdC5aY2Fyb24gPSA2MTE7CiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKICAgIHQuRXRoID0gNzIyOwogICAgdC5DY2VkaWxsYSA9IDcyMjsKICAgIHQubGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC50Y2Fyb24gPSAzODk7CiAgICB0LmVvZ29uZWsgPSA1NTY7CiAgICB0LlVvZ29uZWsgPSA3MjI7CiAgICB0LkFhY3V0ZSA9IDcyMjsKICAgIHQuQWRpZXJlc2lzID0gNzIyOwogICAgdC5lZ3JhdmUgPSA1NTY7CiAgICB0LnphY3V0ZSA9IDUwMDsKICAgIHQuaW9nb25layA9IDI3ODsKICAgIHQuT2FjdXRlID0gNzc4OwogICAgdC5vYWN1dGUgPSA2MTE7CiAgICB0LmFtYWNyb24gPSA1NTY7CiAgICB0LnNhY3V0ZSA9IDU1NjsKICAgIHQuaWRpZXJlc2lzID0gMjc4OwogICAgdC5PY2lyY3VtZmxleCA9IDc3ODsKICAgIHQuVWdyYXZlID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQudGhvcm4gPSA2MTE7CiAgICB0LnR3b3N1cGVyaW9yID0gMzMzOwogICAgdC5PZGllcmVzaXMgPSA3Nzg7CiAgICB0Lm11ID0gNjExOwogICAgdC5pZ3JhdmUgPSAyNzg7CiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA2MTE7CiAgICB0LkVvZ29uZWsgPSA2Njc7CiAgICB0LmRjcm9hdCA9IDYxMTsKICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKICAgIHQuU2NlZGlsbGEgPSA2Njc7CiAgICB0LmxjYXJvbiA9IDQwMDsKICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MYWN1dGUgPSA2MTE7CiAgICB0LnRyYWRlbWFyayA9IDEwMDA7CiAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CiAgICB0LklncmF2ZSA9IDI3ODsKICAgIHQuSW1hY3JvbiA9IDI3ODsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gODM0OwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNjExOwogICAgdC5udGlsZGUgPSA2MTE7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDY2NzsKICAgIHQuZW1hY3JvbiA9IDU1NjsKICAgIHQuZ2JyZXZlID0gNjExOwogICAgdC5vbmVxdWFydGVyID0gODM0OwogICAgdC5TY2Fyb24gPSA2Njc7CiAgICB0LlNjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA2MTE7CiAgICB0LkNjYXJvbiA9IDcyMjsKICAgIHQudWdyYXZlID0gNjExOwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA2MTE7CiAgICB0LlJjb21tYWFjY2VudCA9IDcyMjsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA3MjI7CiAgICB0LkFvZ29uZWsgPSA3MjI7CiAgICB0LkFyaW5nID0gNzIyOwogICAgdC5PdGlsZGUgPSA3Nzg7CiAgICB0Lnpkb3RhY2NlbnQgPSA1MDA7CiAgICB0LkVjYXJvbiA9IDY2NzsKICAgIHQuSW9nb25layA9IDI3ODsKICAgIHQua2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5taW51cyA9IDU4NDsKICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CiAgICB0Lm5jYXJvbiA9IDYxMTsKICAgIHQudGNvbW1hYWNjZW50ID0gMzMzOwogICAgdC5sb2dpY2Fsbm90ID0gNTg0OwogICAgdC5vZGllcmVzaXMgPSA2MTE7CiAgICB0LnVkaWVyZXNpcyA9IDYxMTsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuZXRoID0gNjExOwogICAgdC56Y2Fyb24gPSA1MDA7CiAgICB0Lm5jb21tYWFjY2VudCA9IDYxMTsKICAgIHQub25lc3VwZXJpb3IgPSAzMzM7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1NTY7CiAgfSk7CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNzg7CiAgICB0LmV4Y2xhbSA9IDMzMzsKICAgIHQucXVvdGVkYmwgPSA0NzQ7CiAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CiAgICB0LmRvbGxhciA9IDU1NjsKICAgIHQucGVyY2VudCA9IDg4OTsKICAgIHQuYW1wZXJzYW5kID0gNzIyOwogICAgdC5xdW90ZXJpZ2h0ID0gMjc4OwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gMzg5OwogICAgdC5wbHVzID0gNTg0OwogICAgdC5jb21tYSA9IDI3ODsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNzg7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTU2OwogICAgdC5vbmUgPSA1NTY7CiAgICB0LnR3byA9IDU1NjsKICAgIHQudGhyZWUgPSA1NTY7CiAgICB0LmZvdXIgPSA1NTY7CiAgICB0LmZpdmUgPSA1NTY7CiAgICB0LnNpeCA9IDU1NjsKICAgIHQuc2V2ZW4gPSA1NTY7CiAgICB0LmVpZ2h0ID0gNTU2OwogICAgdC5uaW5lID0gNTU2OwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNTg0OwogICAgdC5lcXVhbCA9IDU4NDsKICAgIHQuZ3JlYXRlciA9IDU4NDsKICAgIHQucXVlc3Rpb24gPSA2MTE7CiAgICB0LmF0ID0gOTc1OwogICAgdC5BID0gNzIyOwogICAgdC5CID0gNzIyOwogICAgdC5DID0gNzIyOwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzc4OwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMjc4OwogICAgdC5KID0gNTU2OwogICAgdC5LID0gNzIyOwogICAgdC5MID0gNjExOwogICAgdC5NID0gODMzOwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzc4OwogICAgdC5QID0gNjY3OwogICAgdC5RID0gNzc4OwogICAgdC5SID0gNzIyOwogICAgdC5TID0gNjY3OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gOTQ0OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjY3OwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTg0OwogICAgdC51bmRlcnNjb3JlID0gNTU2OwogICAgdC5xdW90ZWxlZnQgPSAyNzg7CiAgICB0LmEgPSA1NTY7CiAgICB0LmIgPSA2MTE7CiAgICB0LmMgPSA1NTY7CiAgICB0LmQgPSA2MTE7CiAgICB0LmUgPSA1NTY7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA2MTE7CiAgICB0LmggPSA2MTE7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA1NTY7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA4ODk7CiAgICB0Lm4gPSA2MTE7CiAgICB0Lm8gPSA2MTE7CiAgICB0LnAgPSA2MTE7CiAgICB0LnEgPSA2MTE7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSA1NTY7CiAgICB0LnQgPSAzMzM7CiAgICB0LnUgPSA2MTE7CiAgICB0LnYgPSA1NTY7CiAgICB0LncgPSA3Nzg7CiAgICB0LnggPSA1NTY7CiAgICB0LnkgPSA1NTY7CiAgICB0LnogPSA1MDA7CiAgICB0LmJyYWNlbGVmdCA9IDM4OTsKICAgIHQuYmFyID0gMjgwOwogICAgdC5icmFjZXJpZ2h0ID0gMzg5OwogICAgdC5hc2NpaXRpbGRlID0gNTg0OwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTU2OwogICAgdC5zdGVybGluZyA9IDU1NjsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDU1NjsKICAgIHQuZmxvcmluID0gNTU2OwogICAgdC5zZWN0aW9uID0gNTU2OwogICAgdC5jdXJyZW5jeSA9IDU1NjsKICAgIHQucXVvdGVzaW5nbGUgPSAyMzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNjExOwogICAgdC5mbCA9IDYxMTsKICAgIHQuZW5kYXNoID0gNTU2OwogICAgdC5kYWdnZXIgPSA1NTY7CiAgICB0LmRhZ2dlcmRibCA9IDU1NjsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7CiAgICB0LnBhcmFncmFwaCA9IDU1NjsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDI3ODsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzcwOwogICAgdC5Mc2xhc2ggPSA2MTE7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CiAgICB0LmFlID0gODg5OwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjc4OwogICAgdC5vc2xhc2ggPSA2MTE7CiAgICB0Lm9lID0gOTQ0OwogICAgdC5nZXJtYW5kYmxzID0gNjExOwogICAgdC5JZGllcmVzaXMgPSAyNzg7CiAgICB0LmVhY3V0ZSA9IDU1NjsKICAgIHQuYWJyZXZlID0gNTU2OwogICAgdC51aHVuZ2FydW1sYXV0ID0gNjExOwogICAgdC5lY2Fyb24gPSA1NTY7CiAgICB0LllkaWVyZXNpcyA9IDY2NzsKICAgIHQuZGl2aWRlID0gNTg0OwogICAgdC5ZYWN1dGUgPSA2Njc7CiAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOwogICAgdC5hYWN1dGUgPSA1NTY7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1NTY7CiAgICB0LnNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1NTY7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDYxMTsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3Mzc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDU1NjsKICAgIHQuYXJpbmcgPSA1NTY7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjc4OwogICAgdC5hZ3JhdmUgPSA1NTY7CiAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1NTY7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDU1NjsKICAgIHQuc2NlZGlsbGEgPSA1NTY7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ5NDsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNjExOwogICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuQW1hY3JvbiA9IDcyMjsKICAgIHQucmNhcm9uID0gMzg5OwogICAgdC5jY2VkaWxsYSA9IDU1NjsKICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKICAgIHQuVGhvcm4gPSA2Njc7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNjY3OwogICAgdC5kY2Fyb24gPSA3NDM7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNjExOwogICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDcyMjsKICAgIHQuQWJyZXZlID0gNzIyOwogICAgdC5tdWx0aXBseSA9IDU4NDsKICAgIHQudWFjdXRlID0gNjExOwogICAgdC5UY2Fyb24gPSA2MTE7CiAgICB0LnBhcnRpYWxkaWZmID0gNDk0OwogICAgdC55ZGllcmVzaXMgPSA1NTY7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1NTY7CiAgICB0LmVkaWVyZXNpcyA9IDU1NjsKICAgIHQuY2FjdXRlID0gNTU2OwogICAgdC5uYWN1dGUgPSA2MTE7CiAgICB0LnVtYWNyb24gPSA2MTE7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMjc4OwogICAgdC5wbHVzbWludXMgPSA1ODQ7CiAgICB0LmJyb2tlbmJhciA9IDI4MDsKICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMjc4OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gMzg5OwogICAgdC5vbWFjcm9uID0gNjExOwogICAgdC5aYWN1dGUgPSA2MTE7CiAgICB0LlpjYXJvbiA9IDYxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LnRjYXJvbiA9IDM4OTsKICAgIHQuZW9nb25layA9IDU1NjsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNzIyOwogICAgdC5BZGllcmVzaXMgPSA3MjI7CiAgICB0LmVncmF2ZSA9IDU1NjsKICAgIHQuemFjdXRlID0gNTAwOwogICAgdC5pb2dvbmVrID0gMjc4OwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDYxMTsKICAgIHQuYW1hY3JvbiA9IDU1NjsKICAgIHQuc2FjdXRlID0gNTU2OwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDYxMTsKICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA2MTE7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDYxMTsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNjExOwogICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OwogICAgdC5TY2VkaWxsYSA9IDY2NzsKICAgIHQubGNhcm9uID0gNDAwOwogICAgdC5LY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LkxhY3V0ZSA9IDYxMTsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKICAgIHQuSWdyYXZlID0gMjc4OwogICAgdC5JbWFjcm9uID0gMjc4OwogICAgdC5MY2Fyb24gPSA2MTE7CiAgICB0Lm9uZWhhbGYgPSA4MzQ7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA2MTE7CiAgICB0Lm50aWxkZSA9IDYxMTsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNTU2OwogICAgdC5nYnJldmUgPSA2MTE7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CiAgICB0LlNjYXJvbiA9IDY2NzsKICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDYxMTsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA2MTE7CiAgICB0LnJhZGljYWwgPSA1NDk7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gMzg5OwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDYxMTsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkF0aWxkZSA9IDcyMjsKICAgIHQuQW9nb25layA9IDcyMjsKICAgIHQuQXJpbmcgPSA3MjI7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDUwMDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMjc4OwogICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm1pbnVzID0gNTg0OwogICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKICAgIHQubmNhcm9uID0gNjExOwogICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CiAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CiAgICB0Lm9kaWVyZXNpcyA9IDYxMTsKICAgIHQudWRpZXJlc2lzID0gNjExOwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNjExOwogICAgdC5ldGggPSA2MTE7CiAgICB0LnpjYXJvbiA9IDUwMDsKICAgIHQubmNvbW1hYWNjZW50ID0gNjExOwogICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDU1NjsKICB9KTsKICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjc4OwogICAgdC5leGNsYW0gPSAyNzg7CiAgICB0LnF1b3RlZGJsID0gMzU1OwogICAgdC5udW1iZXJzaWduID0gNTU2OwogICAgdC5kb2xsYXIgPSA1NTY7CiAgICB0LnBlcmNlbnQgPSA4ODk7CiAgICB0LmFtcGVyc2FuZCA9IDY2NzsKICAgIHQucXVvdGVyaWdodCA9IDIyMjsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDM4OTsKICAgIHQucGx1cyA9IDU4NDsKICAgIHQuY29tbWEgPSAyNzg7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjc4OwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDU1NjsKICAgIHQub25lID0gNTU2OwogICAgdC50d28gPSA1NTY7CiAgICB0LnRocmVlID0gNTU2OwogICAgdC5mb3VyID0gNTU2OwogICAgdC5maXZlID0gNTU2OwogICAgdC5zaXggPSA1NTY7CiAgICB0LnNldmVuID0gNTU2OwogICAgdC5laWdodCA9IDU1NjsKICAgIHQubmluZSA9IDU1NjsKICAgIHQuY29sb24gPSAyNzg7CiAgICB0LnNlbWljb2xvbiA9IDI3ODsKICAgIHQubGVzcyA9IDU4NDsKICAgIHQuZXF1YWwgPSA1ODQ7CiAgICB0LmdyZWF0ZXIgPSA1ODQ7CiAgICB0LnF1ZXN0aW9uID0gNTU2OwogICAgdC5hdCA9IDEwMTU7CiAgICB0LkEgPSA2Njc7CiAgICB0LkIgPSA2Njc7CiAgICB0LkMgPSA3MjI7CiAgICB0LkQgPSA3MjI7CiAgICB0LkUgPSA2Njc7CiAgICB0LkYgPSA2MTE7CiAgICB0LkcgPSA3Nzg7CiAgICB0LkggPSA3MjI7CiAgICB0LkkgPSAyNzg7CiAgICB0LkogPSA1MDA7CiAgICB0LksgPSA2Njc7CiAgICB0LkwgPSA1NTY7CiAgICB0Lk0gPSA4MzM7CiAgICB0Lk4gPSA3MjI7CiAgICB0Lk8gPSA3Nzg7CiAgICB0LlAgPSA2Njc7CiAgICB0LlEgPSA3Nzg7CiAgICB0LlIgPSA3MjI7CiAgICB0LlMgPSA2Njc7CiAgICB0LlQgPSA2MTE7CiAgICB0LlUgPSA3MjI7CiAgICB0LlYgPSA2Njc7CiAgICB0LlcgPSA5NDQ7CiAgICB0LlggPSA2Njc7CiAgICB0LlkgPSA2Njc7CiAgICB0LlogPSA2MTE7CiAgICB0LmJyYWNrZXRsZWZ0ID0gMjc4OwogICAgdC5iYWNrc2xhc2ggPSAyNzg7CiAgICB0LmJyYWNrZXRyaWdodCA9IDI3ODsKICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7CiAgICB0LnVuZGVyc2NvcmUgPSA1NTY7CiAgICB0LnF1b3RlbGVmdCA9IDIyMjsKICAgIHQuYSA9IDU1NjsKICAgIHQuYiA9IDU1NjsKICAgIHQuYyA9IDUwMDsKICAgIHQuZCA9IDU1NjsKICAgIHQuZSA9IDU1NjsKICAgIHQuZiA9IDI3ODsKICAgIHQuZyA9IDU1NjsKICAgIHQuaCA9IDU1NjsKICAgIHQuaSA9IDIyMjsKICAgIHQuaiA9IDIyMjsKICAgIHQuayA9IDUwMDsKICAgIHQubCA9IDIyMjsKICAgIHQubSA9IDgzMzsKICAgIHQubiA9IDU1NjsKICAgIHQubyA9IDU1NjsKICAgIHQucCA9IDU1NjsKICAgIHQucSA9IDU1NjsKICAgIHQuciA9IDMzMzsKICAgIHQucyA9IDUwMDsKICAgIHQudCA9IDI3ODsKICAgIHQudSA9IDU1NjsKICAgIHQudiA9IDUwMDsKICAgIHQudyA9IDcyMjsKICAgIHQueCA9IDUwMDsKICAgIHQueSA9IDUwMDsKICAgIHQueiA9IDUwMDsKICAgIHQuYnJhY2VsZWZ0ID0gMzM0OwogICAgdC5iYXIgPSAyNjA7CiAgICB0LmJyYWNlcmlnaHQgPSAzMzQ7CiAgICB0LmFzY2lpdGlsZGUgPSA1ODQ7CiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CiAgICB0LmNlbnQgPSA1NTY7CiAgICB0LnN0ZXJsaW5nID0gNTU2OwogICAgdC5mcmFjdGlvbiA9IDE2NzsKICAgIHQueWVuID0gNTU2OwogICAgdC5mbG9yaW4gPSA1NTY7CiAgICB0LnNlY3Rpb24gPSA1NTY7CiAgICB0LmN1cnJlbmN5ID0gNTU2OwogICAgdC5xdW90ZXNpbmdsZSA9IDE5MTsKICAgIHQucXVvdGVkYmxsZWZ0ID0gMzMzOwogICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTU2OwogICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOwogICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKICAgIHQuZmkgPSA1MDA7CiAgICB0LmZsID0gNTAwOwogICAgdC5lbmRhc2ggPSA1NTY7CiAgICB0LmRhZ2dlciA9IDU1NjsKICAgIHQuZGFnZ2VyZGJsID0gNTU2OwogICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKICAgIHQucGFyYWdyYXBoID0gNTM3OwogICAgdC5idWxsZXQgPSAzNTA7CiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjIyOwogICAgdC5xdW90ZWRibGJhc2UgPSAzMzM7CiAgICB0LnF1b3RlZGJscmlnaHQgPSAzMzM7CiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OwogICAgdC5lbGxpcHNpcyA9IDEwMDA7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNjExOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDEwMDA7CiAgICB0LkFFID0gMTAwMDsKICAgIHQub3JkZmVtaW5pbmUgPSAzNzA7CiAgICB0LkxzbGFzaCA9IDU1NjsKICAgIHQuT3NsYXNoID0gNzc4OwogICAgdC5PRSA9IDEwMDA7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDM2NTsKICAgIHQuYWUgPSA4ODk7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyMjI7CiAgICB0Lm9zbGFzaCA9IDYxMTsKICAgIHQub2UgPSA5NDQ7CiAgICB0Lmdlcm1hbmRibHMgPSA2MTE7CiAgICB0LklkaWVyZXNpcyA9IDI3ODsKICAgIHQuZWFjdXRlID0gNTU2OwogICAgdC5hYnJldmUgPSA1NTY7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7CiAgICB0LmVjYXJvbiA9IDU1NjsKICAgIHQuWWRpZXJlc2lzID0gNjY3OwogICAgdC5kaXZpZGUgPSA1ODQ7CiAgICB0LllhY3V0ZSA9IDY2NzsKICAgIHQuQWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFhY3V0ZSA9IDU1NjsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDUwMDsKICAgIHQuc2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5lY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDU1NjsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTU2OwogICAgdC5FZGllcmVzaXMgPSA2Njc7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDczNzsKICAgIHQuRW1hY3JvbiA9IDY2NzsKICAgIHQuY2Nhcm9uID0gNTAwOwogICAgdC5hcmluZyA9IDU1NjsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyMjI7CiAgICB0LmFncmF2ZSA9IDU1NjsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA3MjI7CiAgICB0LmF0aWxkZSA9IDU1NjsKICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKICAgIHQuc2Nhcm9uID0gNTAwOwogICAgdC5zY2VkaWxsYSA9IDUwMDsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA3MjI7CiAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODsKICAgIHQudWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5BbWFjcm9uID0gNjY3OwogICAgdC5yY2Fyb24gPSAzMzM7CiAgICB0LmNjZWRpbGxhID0gNTAwOwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDY2NzsKICAgIHQuT21hY3JvbiA9IDc3ODsKICAgIHQuUmFjdXRlID0gNzIyOwogICAgdC5TYWN1dGUgPSA2Njc7CiAgICB0LmRjYXJvbiA9IDY0MzsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1NTY7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9ncmF2ZSA9IDc3ODsKICAgIHQuQWdyYXZlID0gNjY3OwogICAgdC5BYnJldmUgPSA2Njc7CiAgICB0Lm11bHRpcGx5ID0gNTg0OwogICAgdC51YWN1dGUgPSA1NTY7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDUwMDsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFkaWVyZXNpcyA9IDU1NjsKICAgIHQuZWRpZXJlc2lzID0gNTU2OwogICAgdC5jYWN1dGUgPSA1MDA7CiAgICB0Lm5hY3V0ZSA9IDU1NjsKICAgIHQudW1hY3JvbiA9IDU1NjsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAyNzg7CiAgICB0LnBsdXNtaW51cyA9IDU4NDsKICAgIHQuYnJva2VuYmFyID0gMjYwOwogICAgdC5yZWdpc3RlcmVkID0gNzM3OwogICAgdC5HYnJldmUgPSA3Nzg7CiAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjY3OwogICAgdC5yYWN1dGUgPSAzMzM7CiAgICB0Lm9tYWNyb24gPSA1NTY7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA3MjI7CiAgICB0Lmxjb21tYWFjY2VudCA9IDIyMjsKICAgIHQudGNhcm9uID0gMzE3OwogICAgdC5lb2dvbmVrID0gNTU2OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA2Njc7CiAgICB0LkFkaWVyZXNpcyA9IDY2NzsKICAgIHQuZWdyYXZlID0gNTU2OwogICAgdC56YWN1dGUgPSA1MDA7CiAgICB0LmlvZ29uZWsgPSAyMjI7CiAgICB0Lk9hY3V0ZSA9IDc3ODsKICAgIHQub2FjdXRlID0gNTU2OwogICAgdC5hbWFjcm9uID0gNTU2OwogICAgdC5zYWN1dGUgPSA1MDA7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTU2OwogICAgdC50d29zdXBlcmlvciA9IDMzMzsKICAgIHQuT2RpZXJlc2lzID0gNzc4OwogICAgdC5tdSA9IDU1NjsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5Fb2dvbmVrID0gNjY3OwogICAgdC5kY3JvYXQgPSA1NTY7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA4MzQ7CiAgICB0LlNjZWRpbGxhID0gNjY3OwogICAgdC5sY2Fyb24gPSAyOTk7CiAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGFjdXRlID0gNTU2OwogICAgdC50cmFkZW1hcmsgPSAxMDAwOwogICAgdC5lZG90YWNjZW50ID0gNTU2OwogICAgdC5JZ3JhdmUgPSAyNzg7CiAgICB0LkltYWNyb24gPSAyNzg7CiAgICB0LkxjYXJvbiA9IDU1NjsKICAgIHQub25laGFsZiA9IDgzNDsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5vY2lyY3VtZmxleCA9IDU1NjsKICAgIHQubnRpbGRlID0gNTU2OwogICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOwogICAgdC5FYWN1dGUgPSA2Njc7CiAgICB0LmVtYWNyb24gPSA1NTY7CiAgICB0LmdicmV2ZSA9IDU1NjsKICAgIHQub25lcXVhcnRlciA9IDgzNDsKICAgIHQuU2Nhcm9uID0gNjY3OwogICAgdC5TY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7CiAgICB0LmRlZ3JlZSA9IDQwMDsKICAgIHQub2dyYXZlID0gNTU2OwogICAgdC5DY2Fyb24gPSA3MjI7CiAgICB0LnVncmF2ZSA9IDU1NjsKICAgIHQucmFkaWNhbCA9IDQ1MzsKICAgIHQuRGNhcm9uID0gNzIyOwogICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7CiAgICB0Lk50aWxkZSA9IDcyMjsKICAgIHQub3RpbGRlID0gNTU2OwogICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0Lkxjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuQXRpbGRlID0gNjY3OwogICAgdC5Bb2dvbmVrID0gNjY3OwogICAgdC5BcmluZyA9IDY2NzsKICAgIHQuT3RpbGRlID0gNzc4OwogICAgdC56ZG90YWNjZW50ID0gNTAwOwogICAgdC5FY2Fyb24gPSA2Njc7CiAgICB0LklvZ29uZWsgPSAyNzg7CiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDsKICAgIHQubWludXMgPSA1ODQ7CiAgICB0LkljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5uY2Fyb24gPSA1NTY7CiAgICB0LnRjb21tYWFjY2VudCA9IDI3ODsKICAgIHQubG9naWNhbG5vdCA9IDU4NDsKICAgIHQub2RpZXJlc2lzID0gNTU2OwogICAgdC51ZGllcmVzaXMgPSA1NTY7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5nY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LmV0aCA9IDU1NjsKICAgIHQuemNhcm9uID0gNTAwOwogICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm9uZXN1cGVyaW9yID0gMzMzOwogICAgdC5pbWFjcm9uID0gMjc4OwogICAgdC5FdXJvID0gNTU2OwogIH0pOwogIHQuU3ltYm9sID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnVuaXZlcnNhbCA9IDcxMzsKICAgIHQubnVtYmVyc2lnbiA9IDUwMDsKICAgIHQuZXhpc3RlbnRpYWwgPSA1NDk7CiAgICB0LnBlcmNlbnQgPSA4MzM7CiAgICB0LmFtcGVyc2FuZCA9IDc3ODsKICAgIHQuc3VjaHRoYXQgPSA0Mzk7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2ttYXRoID0gNTAwOwogICAgdC5wbHVzID0gNTQ5OwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQubWludXMgPSA1NDk7CiAgICB0LnBlcmlvZCA9IDI1MDsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1MDA7CiAgICB0Lm9uZSA9IDUwMDsKICAgIHQudHdvID0gNTAwOwogICAgdC50aHJlZSA9IDUwMDsKICAgIHQuZm91ciA9IDUwMDsKICAgIHQuZml2ZSA9IDUwMDsKICAgIHQuc2l4ID0gNTAwOwogICAgdC5zZXZlbiA9IDUwMDsKICAgIHQuZWlnaHQgPSA1MDA7CiAgICB0Lm5pbmUgPSA1MDA7CiAgICB0LmNvbG9uID0gMjc4OwogICAgdC5zZW1pY29sb24gPSAyNzg7CiAgICB0Lmxlc3MgPSA1NDk7CiAgICB0LmVxdWFsID0gNTQ5OwogICAgdC5ncmVhdGVyID0gNTQ5OwogICAgdC5xdWVzdGlvbiA9IDQ0NDsKICAgIHQuY29uZ3J1ZW50ID0gNTQ5OwogICAgdC5BbHBoYSA9IDcyMjsKICAgIHQuQmV0YSA9IDY2NzsKICAgIHQuQ2hpID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQuRXBzaWxvbiA9IDYxMTsKICAgIHQuUGhpID0gNzYzOwogICAgdC5HYW1tYSA9IDYwMzsKICAgIHQuRXRhID0gNzIyOwogICAgdC5Jb3RhID0gMzMzOwogICAgdC50aGV0YTEgPSA2MzE7CiAgICB0LkthcHBhID0gNzIyOwogICAgdC5MYW1iZGEgPSA2ODY7CiAgICB0Lk11ID0gODg5OwogICAgdC5OdSA9IDcyMjsKICAgIHQuT21pY3JvbiA9IDcyMjsKICAgIHQuUGkgPSA3Njg7CiAgICB0LlRoZXRhID0gNzQxOwogICAgdC5SaG8gPSA1NTY7CiAgICB0LlNpZ21hID0gNTkyOwogICAgdC5UYXUgPSA2MTE7CiAgICB0LlVwc2lsb24gPSA2OTA7CiAgICB0LnNpZ21hMSA9IDQzOTsKICAgIHQuT21lZ2EgPSA3Njg7CiAgICB0LlhpID0gNjQ1OwogICAgdC5Qc2kgPSA3OTU7CiAgICB0LlpldGEgPSA2MTE7CiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOwogICAgdC50aGVyZWZvcmUgPSA4NjM7CiAgICB0LmJyYWNrZXRyaWdodCA9IDMzMzsKICAgIHQucGVycGVuZGljdWxhciA9IDY1ODsKICAgIHQudW5kZXJzY29yZSA9IDUwMDsKICAgIHQucmFkaWNhbGV4ID0gNTAwOwogICAgdC5hbHBoYSA9IDYzMTsKICAgIHQuYmV0YSA9IDU0OTsKICAgIHQuY2hpID0gNTQ5OwogICAgdC5kZWx0YSA9IDQ5NDsKICAgIHQuZXBzaWxvbiA9IDQzOTsKICAgIHQucGhpID0gNTIxOwogICAgdC5nYW1tYSA9IDQxMTsKICAgIHQuZXRhID0gNjAzOwogICAgdC5pb3RhID0gMzI5OwogICAgdC5waGkxID0gNjAzOwogICAgdC5rYXBwYSA9IDU0OTsKICAgIHQubGFtYmRhID0gNTQ5OwogICAgdC5tdSA9IDU3NjsKICAgIHQubnUgPSA1MjE7CiAgICB0Lm9taWNyb24gPSA1NDk7CiAgICB0LnBpID0gNTQ5OwogICAgdC50aGV0YSA9IDUyMTsKICAgIHQucmhvID0gNTQ5OwogICAgdC5zaWdtYSA9IDYwMzsKICAgIHQudGF1ID0gNDM5OwogICAgdC51cHNpbG9uID0gNTc2OwogICAgdC5vbWVnYTEgPSA3MTM7CiAgICB0Lm9tZWdhID0gNjg2OwogICAgdC54aSA9IDQ5MzsKICAgIHQucHNpID0gNjg2OwogICAgdC56ZXRhID0gNDk0OwogICAgdC5icmFjZWxlZnQgPSA0ODA7CiAgICB0LmJhciA9IDIwMDsKICAgIHQuYnJhY2VyaWdodCA9IDQ4MDsKICAgIHQuc2ltaWxhciA9IDU0OTsKICAgIHQuRXVybyA9IDc1MDsKICAgIHQuVXBzaWxvbjEgPSA2MjA7CiAgICB0Lm1pbnV0ZSA9IDI0NzsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5mcmFjdGlvbiA9IDE2NzsKICAgIHQuaW5maW5pdHkgPSA3MTM7CiAgICB0LmZsb3JpbiA9IDUwMDsKICAgIHQuY2x1YiA9IDc1MzsKICAgIHQuZGlhbW9uZCA9IDc1MzsKICAgIHQuaGVhcnQgPSA3NTM7CiAgICB0LnNwYWRlID0gNzUzOwogICAgdC5hcnJvd2JvdGggPSAxMDQyOwogICAgdC5hcnJvd2xlZnQgPSA5ODc7CiAgICB0LmFycm93dXAgPSA2MDM7CiAgICB0LmFycm93cmlnaHQgPSA5ODc7CiAgICB0LmFycm93ZG93biA9IDYwMzsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5wbHVzbWludXMgPSA1NDk7CiAgICB0LnNlY29uZCA9IDQxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5tdWx0aXBseSA9IDU0OTsKICAgIHQucHJvcG9ydGlvbmFsID0gNzEzOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQuYnVsbGV0ID0gNDYwOwogICAgdC5kaXZpZGUgPSA1NDk7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5lcXVpdmFsZW5jZSA9IDU0OTsKICAgIHQuYXBwcm94ZXF1YWwgPSA1NDk7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQuYXJyb3d2ZXJ0ZXggPSA2MDM7CiAgICB0LmFycm93aG9yaXpleCA9IDEwMDA7CiAgICB0LmNhcnJpYWdlcmV0dXJuID0gNjU4OwogICAgdC5hbGVwaCA9IDgyMzsKICAgIHQuSWZyYWt0dXIgPSA2ODY7CiAgICB0LlJmcmFrdHVyID0gNzk1OwogICAgdC53ZWllcnN0cmFzcyA9IDk4NzsKICAgIHQuY2lyY2xlbXVsdGlwbHkgPSA3Njg7CiAgICB0LmNpcmNsZXBsdXMgPSA3Njg7CiAgICB0LmVtcHR5c2V0ID0gODIzOwogICAgdC5pbnRlcnNlY3Rpb24gPSA3Njg7CiAgICB0LnVuaW9uID0gNzY4OwogICAgdC5wcm9wZXJzdXBlcnNldCA9IDcxMzsKICAgIHQucmVmbGV4c3VwZXJzZXQgPSA3MTM7CiAgICB0Lm5vdHN1YnNldCA9IDcxMzsKICAgIHQucHJvcGVyc3Vic2V0ID0gNzEzOwogICAgdC5yZWZsZXhzdWJzZXQgPSA3MTM7CiAgICB0LmVsZW1lbnQgPSA3MTM7CiAgICB0Lm5vdGVsZW1lbnQgPSA3MTM7CiAgICB0LmFuZ2xlID0gNzY4OwogICAgdC5ncmFkaWVudCA9IDcxMzsKICAgIHQucmVnaXN0ZXJzZXJpZiA9IDc5MDsKICAgIHQuY29weXJpZ2h0c2VyaWYgPSA3OTA7CiAgICB0LnRyYWRlbWFya3NlcmlmID0gODkwOwogICAgdC5wcm9kdWN0ID0gODIzOwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5kb3RtYXRoID0gMjUwOwogICAgdC5sb2dpY2Fsbm90ID0gNzEzOwogICAgdC5sb2dpY2FsYW5kID0gNjAzOwogICAgdC5sb2dpY2Fsb3IgPSA2MDM7CiAgICB0LmFycm93ZGJsYm90aCA9IDEwNDI7CiAgICB0LmFycm93ZGJsbGVmdCA9IDk4NzsKICAgIHQuYXJyb3dkYmx1cCA9IDYwMzsKICAgIHQuYXJyb3dkYmxyaWdodCA9IDk4NzsKICAgIHQuYXJyb3dkYmxkb3duID0gNjAzOwogICAgdC5sb3plbmdlID0gNDk0OwogICAgdC5hbmdsZWxlZnQgPSAzMjk7CiAgICB0LnJlZ2lzdGVyc2FucyA9IDc5MDsKICAgIHQuY29weXJpZ2h0c2FucyA9IDc5MDsKICAgIHQudHJhZGVtYXJrc2FucyA9IDc4NjsKICAgIHQuc3VtbWF0aW9uID0gNzEzOwogICAgdC5wYXJlbmxlZnR0cCA9IDM4NDsKICAgIHQucGFyZW5sZWZ0ZXggPSAzODQ7CiAgICB0LnBhcmVubGVmdGJ0ID0gMzg0OwogICAgdC5icmFja2V0bGVmdHRwID0gMzg0OwogICAgdC5icmFja2V0bGVmdGV4ID0gMzg0OwogICAgdC5icmFja2V0bGVmdGJ0ID0gMzg0OwogICAgdC5icmFjZWxlZnR0cCA9IDQ5NDsKICAgIHQuYnJhY2VsZWZ0bWlkID0gNDk0OwogICAgdC5icmFjZWxlZnRidCA9IDQ5NDsKICAgIHQuYnJhY2VleCA9IDQ5NDsKICAgIHQuYW5nbGVyaWdodCA9IDMyOTsKICAgIHQuaW50ZWdyYWwgPSAyNzQ7CiAgICB0LmludGVncmFsdHAgPSA2ODY7CiAgICB0LmludGVncmFsZXggPSA2ODY7CiAgICB0LmludGVncmFsYnQgPSA2ODY7CiAgICB0LnBhcmVucmlnaHR0cCA9IDM4NDsKICAgIHQucGFyZW5yaWdodGV4ID0gMzg0OwogICAgdC5wYXJlbnJpZ2h0YnQgPSAzODQ7CiAgICB0LmJyYWNrZXRyaWdodHRwID0gMzg0OwogICAgdC5icmFja2V0cmlnaHRleCA9IDM4NDsKICAgIHQuYnJhY2tldHJpZ2h0YnQgPSAzODQ7CiAgICB0LmJyYWNlcmlnaHR0cCA9IDQ5NDsKICAgIHQuYnJhY2VyaWdodG1pZCA9IDQ5NDsKICAgIHQuYnJhY2VyaWdodGJ0ID0gNDk0OwogICAgdC5hcHBsZSA9IDc5MDsKICB9KTsKICB0WyJUaW1lcy1Sb21hbiJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNDA4OwogICAgdC5udW1iZXJzaWduID0gNTAwOwogICAgdC5kb2xsYXIgPSA1MDA7CiAgICB0LnBlcmNlbnQgPSA4MzM7CiAgICB0LmFtcGVyc2FuZCA9IDc3ODsKICAgIHQucXVvdGVyaWdodCA9IDMzMzsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDUwMDsKICAgIHQucGx1cyA9IDU2NDsKICAgIHQuY29tbWEgPSAyNTA7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjUwOwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDUwMDsKICAgIHQub25lID0gNTAwOwogICAgdC50d28gPSA1MDA7CiAgICB0LnRocmVlID0gNTAwOwogICAgdC5mb3VyID0gNTAwOwogICAgdC5maXZlID0gNTAwOwogICAgdC5zaXggPSA1MDA7CiAgICB0LnNldmVuID0gNTAwOwogICAgdC5laWdodCA9IDUwMDsKICAgIHQubmluZSA9IDUwMDsKICAgIHQuY29sb24gPSAyNzg7CiAgICB0LnNlbWljb2xvbiA9IDI3ODsKICAgIHQubGVzcyA9IDU2NDsKICAgIHQuZXF1YWwgPSA1NjQ7CiAgICB0LmdyZWF0ZXIgPSA1NjQ7CiAgICB0LnF1ZXN0aW9uID0gNDQ0OwogICAgdC5hdCA9IDkyMTsKICAgIHQuQSA9IDcyMjsKICAgIHQuQiA9IDY2NzsKICAgIHQuQyA9IDY2NzsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDYxMTsKICAgIHQuRiA9IDU1NjsKICAgIHQuRyA9IDcyMjsKICAgIHQuSCA9IDcyMjsKICAgIHQuSSA9IDMzMzsKICAgIHQuSiA9IDM4OTsKICAgIHQuSyA9IDcyMjsKICAgIHQuTCA9IDYxMTsKICAgIHQuTSA9IDg4OTsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDcyMjsKICAgIHQuUCA9IDU1NjsKICAgIHQuUSA9IDcyMjsKICAgIHQuUiA9IDY2NzsKICAgIHQuUyA9IDU1NjsKICAgIHQuVCA9IDYxMTsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDcyMjsKICAgIHQuVyA9IDk0NDsKICAgIHQuWCA9IDcyMjsKICAgIHQuWSA9IDcyMjsKICAgIHQuWiA9IDYxMTsKICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CiAgICB0LmJhY2tzbGFzaCA9IDI3ODsKICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOwogICAgdC5hc2NpaWNpcmN1bSA9IDQ2OTsKICAgIHQudW5kZXJzY29yZSA9IDUwMDsKICAgIHQucXVvdGVsZWZ0ID0gMzMzOwogICAgdC5hID0gNDQ0OwogICAgdC5iID0gNTAwOwogICAgdC5jID0gNDQ0OwogICAgdC5kID0gNTAwOwogICAgdC5lID0gNDQ0OwogICAgdC5mID0gMzMzOwogICAgdC5nID0gNTAwOwogICAgdC5oID0gNTAwOwogICAgdC5pID0gMjc4OwogICAgdC5qID0gMjc4OwogICAgdC5rID0gNTAwOwogICAgdC5sID0gMjc4OwogICAgdC5tID0gNzc4OwogICAgdC5uID0gNTAwOwogICAgdC5vID0gNTAwOwogICAgdC5wID0gNTAwOwogICAgdC5xID0gNTAwOwogICAgdC5yID0gMzMzOwogICAgdC5zID0gMzg5OwogICAgdC50ID0gMjc4OwogICAgdC51ID0gNTAwOwogICAgdC52ID0gNTAwOwogICAgdC53ID0gNzIyOwogICAgdC54ID0gNTAwOwogICAgdC55ID0gNTAwOwogICAgdC56ID0gNDQ0OwogICAgdC5icmFjZWxlZnQgPSA0ODA7CiAgICB0LmJhciA9IDIwMDsKICAgIHQuYnJhY2VyaWdodCA9IDQ4MDsKICAgIHQuYXNjaWl0aWxkZSA9IDU0MTsKICAgIHQuZXhjbGFtZG93biA9IDMzMzsKICAgIHQuY2VudCA9IDUwMDsKICAgIHQuc3RlcmxpbmcgPSA1MDA7CiAgICB0LmZyYWN0aW9uID0gMTY3OwogICAgdC55ZW4gPSA1MDA7CiAgICB0LmZsb3JpbiA9IDUwMDsKICAgIHQuc2VjdGlvbiA9IDUwMDsKICAgIHQuY3VycmVuY3kgPSA1MDA7CiAgICB0LnF1b3Rlc2luZ2xlID0gMTgwOwogICAgdC5xdW90ZWRibGxlZnQgPSA0NDQ7CiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1MDA7CiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOwogICAgdC5maSA9IDU1NjsKICAgIHQuZmwgPSA1NTY7CiAgICB0LmVuZGFzaCA9IDUwMDsKICAgIHQuZGFnZ2VyID0gNTAwOwogICAgdC5kYWdnZXJkYmwgPSA1MDA7CiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwOwogICAgdC5wYXJhZ3JhcGggPSA0NTM7CiAgICB0LmJ1bGxldCA9IDM1MDsKICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7CiAgICB0LnF1b3RlZGJsYmFzZSA9IDQ0NDsKICAgIHQucXVvdGVkYmxyaWdodCA9IDQ0NDsKICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOwogICAgdC5xdWVzdGlvbmRvd24gPSA0NDQ7CiAgICB0LmdyYXZlID0gMzMzOwogICAgdC5hY3V0ZSA9IDMzMzsKICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKICAgIHQudGlsZGUgPSAzMzM7CiAgICB0Lm1hY3JvbiA9IDMzMzsKICAgIHQuYnJldmUgPSAzMzM7CiAgICB0LmRvdGFjY2VudCA9IDMzMzsKICAgIHQuZGllcmVzaXMgPSAzMzM7CiAgICB0LnJpbmcgPSAzMzM7CiAgICB0LmNlZGlsbGEgPSAzMzM7CiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKICAgIHQub2dvbmVrID0gMzMzOwogICAgdC5jYXJvbiA9IDMzMzsKICAgIHQuZW1kYXNoID0gMTAwMDsKICAgIHQuQUUgPSA4ODk7CiAgICB0Lm9yZGZlbWluaW5lID0gMjc2OwogICAgdC5Mc2xhc2ggPSA2MTE7CiAgICB0Lk9zbGFzaCA9IDcyMjsKICAgIHQuT0UgPSA4ODk7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDsKICAgIHQuYWUgPSA2Njc7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA3MjI7CiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CiAgICB0LklkaWVyZXNpcyA9IDMzMzsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA0NDQ7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNzIyOwogICAgdC5kaXZpZGUgPSA1NjQ7CiAgICB0LllhY3V0ZSA9IDcyMjsKICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LmFhY3V0ZSA9IDQ0NDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDUwMDsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDQ0NDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTAwOwogICAgdC5FZGllcmVzaXMgPSA2MTE7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc2MDsKICAgIHQuRW1hY3JvbiA9IDYxMTsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDQ0NDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDQ0NDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA2Njc7CiAgICB0LmF0aWxkZSA9IDQ0NDsKICAgIHQuRWRvdGFjY2VudCA9IDYxMTsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA2Njc7CiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LmFjaXJjdW1mbGV4ID0gNDQ0OwogICAgdC5BbWFjcm9uID0gNzIyOwogICAgdC5yY2Fyb24gPSAzMzM7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDU1NjsKICAgIHQuT21hY3JvbiA9IDcyMjsKICAgIHQuUmFjdXRlID0gNjY3OwogICAgdC5TYWN1dGUgPSA1NTY7CiAgICB0LmRjYXJvbiA9IDU4ODsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1MDA7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDcyMjsKICAgIHQuQWdyYXZlID0gNzIyOwogICAgdC5BYnJldmUgPSA3MjI7CiAgICB0Lm11bHRpcGx5ID0gNTY0OwogICAgdC51YWN1dGUgPSA1MDA7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDUwMDsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFkaWVyZXNpcyA9IDQ0NDsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDUwMDsKICAgIHQudW1hY3JvbiA9IDUwMDsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAzMzM7CiAgICB0LnBsdXNtaW51cyA9IDU2NDsKICAgIHQuYnJva2VuYmFyID0gMjAwOwogICAgdC5yZWdpc3RlcmVkID0gNzYwOwogICAgdC5HYnJldmUgPSA3MjI7CiAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjExOwogICAgdC5yYWN1dGUgPSAzMzM7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA2Njc7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzI2OwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA3MjI7CiAgICB0LkFkaWVyZXNpcyA9IDcyMjsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSA0NDQ7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDcyMjsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNDQ0OwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTAwOwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzIyOwogICAgdC5tdSA9IDUwMDsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjExOwogICAgdC5kY3JvYXQgPSA1MDA7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTU2OwogICAgdC5sY2Fyb24gPSAzNDQ7CiAgICB0Lktjb21tYWFjY2VudCA9IDcyMjsKICAgIHQuTGFjdXRlID0gNjExOwogICAgdC50cmFkZW1hcmsgPSA5ODA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDMzMzsKICAgIHQuSW1hY3JvbiA9IDMzMzsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1MDA7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDYxMTsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1NTY7CiAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTAwOwogICAgdC5yYWRpY2FsID0gNDUzOwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDMzMzsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA3MjI7CiAgICB0LkFvZ29uZWsgPSA3MjI7CiAgICB0LkFyaW5nID0gNzIyOwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LkVjYXJvbiA9IDYxMTsKICAgIHQuSW9nb25layA9IDMzMzsKICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5taW51cyA9IDU2NDsKICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7CiAgICB0Lm5jYXJvbiA9IDUwMDsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNTY0OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDUwMDsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSA0NDQ7CiAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdFsiVGltZXMtQm9sZCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNTU1OwogICAgdC5udW1iZXJzaWduID0gNTAwOwogICAgdC5kb2xsYXIgPSA1MDA7CiAgICB0LnBlcmNlbnQgPSAxMDAwOwogICAgdC5hbXBlcnNhbmQgPSA4MzM7CiAgICB0LnF1b3RlcmlnaHQgPSAzMzM7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2sgPSA1MDA7CiAgICB0LnBsdXMgPSA1NzA7CiAgICB0LmNvbW1hID0gMjUwOwogICAgdC5oeXBoZW4gPSAzMzM7CiAgICB0LnBlcmlvZCA9IDI1MDsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1MDA7CiAgICB0Lm9uZSA9IDUwMDsKICAgIHQudHdvID0gNTAwOwogICAgdC50aHJlZSA9IDUwMDsKICAgIHQuZm91ciA9IDUwMDsKICAgIHQuZml2ZSA9IDUwMDsKICAgIHQuc2l4ID0gNTAwOwogICAgdC5zZXZlbiA9IDUwMDsKICAgIHQuZWlnaHQgPSA1MDA7CiAgICB0Lm5pbmUgPSA1MDA7CiAgICB0LmNvbG9uID0gMzMzOwogICAgdC5zZW1pY29sb24gPSAzMzM7CiAgICB0Lmxlc3MgPSA1NzA7CiAgICB0LmVxdWFsID0gNTcwOwogICAgdC5ncmVhdGVyID0gNTcwOwogICAgdC5xdWVzdGlvbiA9IDUwMDsKICAgIHQuYXQgPSA5MzA7CiAgICB0LkEgPSA3MjI7CiAgICB0LkIgPSA2Njc7CiAgICB0LkMgPSA3MjI7CiAgICB0LkQgPSA3MjI7CiAgICB0LkUgPSA2Njc7CiAgICB0LkYgPSA2MTE7CiAgICB0LkcgPSA3Nzg7CiAgICB0LkggPSA3Nzg7CiAgICB0LkkgPSAzODk7CiAgICB0LkogPSA1MDA7CiAgICB0LksgPSA3Nzg7CiAgICB0LkwgPSA2Njc7CiAgICB0Lk0gPSA5NDQ7CiAgICB0Lk4gPSA3MjI7CiAgICB0Lk8gPSA3Nzg7CiAgICB0LlAgPSA2MTE7CiAgICB0LlEgPSA3Nzg7CiAgICB0LlIgPSA3MjI7CiAgICB0LlMgPSA1NTY7CiAgICB0LlQgPSA2Njc7CiAgICB0LlUgPSA3MjI7CiAgICB0LlYgPSA3MjI7CiAgICB0LlcgPSAxMDAwOwogICAgdC5YID0gNzIyOwogICAgdC5ZID0gNzIyOwogICAgdC5aID0gNjY3OwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTgxOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1NTY7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1NTY7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAzMzM7CiAgICB0LmsgPSA1NTY7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA4MzM7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1NTY7CiAgICB0LnEgPSA1NTY7CiAgICB0LnIgPSA0NDQ7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAzMzM7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA1MDA7CiAgICB0LncgPSA3MjI7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA1MDA7CiAgICB0LnogPSA0NDQ7CiAgICB0LmJyYWNlbGVmdCA9IDM5NDsKICAgIHQuYmFyID0gMjIwOwogICAgdC5icmFjZXJpZ2h0ID0gMzk0OwogICAgdC5hc2NpaXRpbGRlID0gNTIwOwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTU2OwogICAgdC5mbCA9IDU1NjsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDU0MDsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDUwMDsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzAwOwogICAgdC5Mc2xhc2ggPSA2Njc7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzMzA7CiAgICB0LmFlID0gNzIyOwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjc4OwogICAgdC5vc2xhc2ggPSA1MDA7CiAgICB0Lm9lID0gNzIyOwogICAgdC5nZXJtYW5kYmxzID0gNTU2OwogICAgdC5JZGllcmVzaXMgPSAzODk7CiAgICB0LmVhY3V0ZSA9IDQ0NDsKICAgIHQuYWJyZXZlID0gNTAwOwogICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5lY2Fyb24gPSA0NDQ7CiAgICB0LllkaWVyZXNpcyA9IDcyMjsKICAgIHQuZGl2aWRlID0gNTcwOwogICAgdC5ZYWN1dGUgPSA3MjI7CiAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOwogICAgdC5hYWN1dGUgPSA1MDA7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1MDA7CiAgICB0LnNjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuZWNpcmN1bWZsZXggPSA0NDQ7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1MDA7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDU1NjsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3NDc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDQ0NDsKICAgIHQuYXJpbmcgPSA1MDA7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjc4OwogICAgdC5hZ3JhdmUgPSA1MDA7CiAgICB0LlRjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1MDA7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDM4OTsKICAgIHQuc2NlZGlsbGEgPSAzODk7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ5NDsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5hY2lyY3VtZmxleCA9IDUwMDsKICAgIHQuQW1hY3JvbiA9IDcyMjsKICAgIHQucmNhcm9uID0gNDQ0OwogICAgdC5jY2VkaWxsYSA9IDQ0NDsKICAgIHQuWmRvdGFjY2VudCA9IDY2NzsKICAgIHQuVGhvcm4gPSA2MTE7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNTU2OwogICAgdC5kY2Fyb24gPSA2NzI7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNTU2OwogICAgdC50aHJlZXN1cGVyaW9yID0gMzAwOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDcyMjsKICAgIHQuQWJyZXZlID0gNzIyOwogICAgdC5tdWx0aXBseSA9IDU3MDsKICAgIHQudWFjdXRlID0gNTU2OwogICAgdC5UY2Fyb24gPSA2Njc7CiAgICB0LnBhcnRpYWxkaWZmID0gNDk0OwogICAgdC55ZGllcmVzaXMgPSA1MDA7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1MDA7CiAgICB0LmVkaWVyZXNpcyA9IDQ0NDsKICAgIHQuY2FjdXRlID0gNDQ0OwogICAgdC5uYWN1dGUgPSA1NTY7CiAgICB0LnVtYWNyb24gPSA1NTY7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMzg5OwogICAgdC5wbHVzbWludXMgPSA1NzA7CiAgICB0LmJyb2tlbmJhciA9IDIyMDsKICAgIHQucmVnaXN0ZXJlZCA9IDc0NzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMzg5OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gNDQ0OwogICAgdC5vbWFjcm9uID0gNTAwOwogICAgdC5aYWN1dGUgPSA2Njc7CiAgICB0LlpjYXJvbiA9IDY2NzsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LnRjYXJvbiA9IDQxNjsKICAgIHQuZW9nb25layA9IDQ0NDsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNzIyOwogICAgdC5BZGllcmVzaXMgPSA3MjI7CiAgICB0LmVncmF2ZSA9IDQ0NDsKICAgIHQuemFjdXRlID0gNDQ0OwogICAgdC5pb2dvbmVrID0gMjc4OwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDUwMDsKICAgIHQuYW1hY3JvbiA9IDUwMDsKICAgIHQuc2FjdXRlID0gMzg5OwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDU1NjsKICAgIHQudHdvc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA1NTY7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDUwMDsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNTU2OwogICAgdC50aHJlZXF1YXJ0ZXJzID0gNzUwOwogICAgdC5TY2VkaWxsYSA9IDU1NjsKICAgIHQubGNhcm9uID0gMzk0OwogICAgdC5LY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LkxhY3V0ZSA9IDY2NzsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDQ0NDsKICAgIHQuSWdyYXZlID0gMzg5OwogICAgdC5JbWFjcm9uID0gMzg5OwogICAgdC5MY2Fyb24gPSA2Njc7CiAgICB0Lm9uZWhhbGYgPSA3NTA7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA1MDA7CiAgICB0Lm50aWxkZSA9IDU1NjsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNDQ0OwogICAgdC5nYnJldmUgPSA1MDA7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7CiAgICB0LlNjYXJvbiA9IDU1NjsKICAgIHQuU2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDUwMDsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA1NTY7CiAgICB0LnJhZGljYWwgPSA1NDk7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gNDQ0OwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDUwMDsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0LkF0aWxkZSA9IDcyMjsKICAgIHQuQW9nb25layA9IDcyMjsKICAgIHQuQXJpbmcgPSA3MjI7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDQ0NDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMzg5OwogICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm1pbnVzID0gNTcwOwogICAgdC5JY2lyY3VtZmxleCA9IDM4OTsKICAgIHQubmNhcm9uID0gNTU2OwogICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CiAgICB0LmxvZ2ljYWxub3QgPSA1NzA7CiAgICB0Lm9kaWVyZXNpcyA9IDUwMDsKICAgIHQudWRpZXJlc2lzID0gNTU2OwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5ldGggPSA1MDA7CiAgICB0LnpjYXJvbiA9IDQ0NDsKICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5vbmVzdXBlcmlvciA9IDMwMDsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDUwMDsKICB9KTsKICB0WyJUaW1lcy1Cb2xkSXRhbGljIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNTA7CiAgICB0LmV4Y2xhbSA9IDM4OTsKICAgIHQucXVvdGVkYmwgPSA1NTU7CiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CiAgICB0LmRvbGxhciA9IDUwMDsKICAgIHQucGVyY2VudCA9IDgzMzsKICAgIHQuYW1wZXJzYW5kID0gNzc4OwogICAgdC5xdW90ZXJpZ2h0ID0gMzMzOwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gNTAwOwogICAgdC5wbHVzID0gNTcwOwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNTA7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTAwOwogICAgdC5vbmUgPSA1MDA7CiAgICB0LnR3byA9IDUwMDsKICAgIHQudGhyZWUgPSA1MDA7CiAgICB0LmZvdXIgPSA1MDA7CiAgICB0LmZpdmUgPSA1MDA7CiAgICB0LnNpeCA9IDUwMDsKICAgIHQuc2V2ZW4gPSA1MDA7CiAgICB0LmVpZ2h0ID0gNTAwOwogICAgdC5uaW5lID0gNTAwOwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNTcwOwogICAgdC5lcXVhbCA9IDU3MDsKICAgIHQuZ3JlYXRlciA9IDU3MDsKICAgIHQucXVlc3Rpb24gPSA1MDA7CiAgICB0LmF0ID0gODMyOwogICAgdC5BID0gNjY3OwogICAgdC5CID0gNjY3OwogICAgdC5DID0gNjY3OwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjY3OwogICAgdC5HID0gNzIyOwogICAgdC5IID0gNzc4OwogICAgdC5JID0gMzg5OwogICAgdC5KID0gNTAwOwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNjExOwogICAgdC5NID0gODg5OwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzIyOwogICAgdC5QID0gNjExOwogICAgdC5RID0gNzIyOwogICAgdC5SID0gNjY3OwogICAgdC5TID0gNTU2OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gODg5OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjExOwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTcwOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1MDA7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1MDA7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA1MDA7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA3Nzg7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1MDA7CiAgICB0LnEgPSA1MDA7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA0NDQ7CiAgICB0LncgPSA2Njc7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA0NDQ7CiAgICB0LnogPSAzODk7CiAgICB0LmJyYWNlbGVmdCA9IDM0ODsKICAgIHQuYmFyID0gMjIwOwogICAgdC5icmFjZXJpZ2h0ID0gMzQ4OwogICAgdC5hc2NpaXRpbGRlID0gNTcwOwogICAgdC5leGNsYW1kb3duID0gMzg5OwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTU2OwogICAgdC5mbCA9IDU1NjsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDUwMDsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDUwMDsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDk0NDsKICAgIHQub3JkZmVtaW5pbmUgPSAyNjY7CiAgICB0LkxzbGFzaCA9IDYxMTsKICAgIHQuT3NsYXNoID0gNzIyOwogICAgdC5PRSA9IDk0NDsKICAgIHQub3JkbWFzY3VsaW5lID0gMzAwOwogICAgdC5hZSA9IDcyMjsKICAgIHQuZG90bGVzc2kgPSAyNzg7CiAgICB0LmxzbGFzaCA9IDI3ODsKICAgIHQub3NsYXNoID0gNTAwOwogICAgdC5vZSA9IDcyMjsKICAgIHQuZ2VybWFuZGJscyA9IDUwMDsKICAgIHQuSWRpZXJlc2lzID0gMzg5OwogICAgdC5lYWN1dGUgPSA0NDQ7CiAgICB0LmFicmV2ZSA9IDUwMDsKICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjsKICAgIHQuZWNhcm9uID0gNDQ0OwogICAgdC5ZZGllcmVzaXMgPSA2MTE7CiAgICB0LmRpdmlkZSA9IDU3MDsKICAgIHQuWWFjdXRlID0gNjExOwogICAgdC5BY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWFjdXRlID0gNTAwOwogICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKICAgIHQueWFjdXRlID0gNDQ0OwogICAgdC5zY29tbWFhY2NlbnQgPSAzODk7CiAgICB0LmVjaXJjdW1mbGV4ID0gNDQ0OwogICAgdC5VcmluZyA9IDcyMjsKICAgIHQuVWRpZXJlc2lzID0gNzIyOwogICAgdC5hb2dvbmVrID0gNTAwOwogICAgdC5VYWN1dGUgPSA3MjI7CiAgICB0LnVvZ29uZWsgPSA1NTY7CiAgICB0LkVkaWVyZXNpcyA9IDY2NzsKICAgIHQuRGNyb2F0ID0gNzIyOwogICAgdC5jb21tYWFjY2VudCA9IDI1MDsKICAgIHQuY29weXJpZ2h0ID0gNzQ3OwogICAgdC5FbWFjcm9uID0gNjY3OwogICAgdC5jY2Fyb24gPSA0NDQ7CiAgICB0LmFyaW5nID0gNTAwOwogICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LmxhY3V0ZSA9IDI3ODsKICAgIHQuYWdyYXZlID0gNTAwOwogICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkNhY3V0ZSA9IDY2NzsKICAgIHQuYXRpbGRlID0gNTAwOwogICAgdC5FZG90YWNjZW50ID0gNjY3OwogICAgdC5zY2Fyb24gPSAzODk7CiAgICB0LnNjZWRpbGxhID0gMzg5OwogICAgdC5pYWN1dGUgPSAyNzg7CiAgICB0LmxvemVuZ2UgPSA0OTQ7CiAgICB0LlJjYXJvbiA9IDY2NzsKICAgIHQuR2NvbW1hYWNjZW50ID0gNzIyOwogICAgdC51Y2lyY3VtZmxleCA9IDU1NjsKICAgIHQuYWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LkFtYWNyb24gPSA2Njc7CiAgICB0LnJjYXJvbiA9IDM4OTsKICAgIHQuY2NlZGlsbGEgPSA0NDQ7CiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CiAgICB0LlRob3JuID0gNjExOwogICAgdC5PbWFjcm9uID0gNzIyOwogICAgdC5SYWN1dGUgPSA2Njc7CiAgICB0LlNhY3V0ZSA9IDU1NjsKICAgIHQuZGNhcm9uID0gNjA4OwogICAgdC5VbWFjcm9uID0gNzIyOwogICAgdC51cmluZyA9IDU1NjsKICAgIHQudGhyZWVzdXBlcmlvciA9IDMwMDsKICAgIHQuT2dyYXZlID0gNzIyOwogICAgdC5BZ3JhdmUgPSA2Njc7CiAgICB0LkFicmV2ZSA9IDY2NzsKICAgIHQubXVsdGlwbHkgPSA1NzA7CiAgICB0LnVhY3V0ZSA9IDU1NjsKICAgIHQuVGNhcm9uID0gNjExOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQueWRpZXJlc2lzID0gNDQ0OwogICAgdC5OYWN1dGUgPSA3MjI7CiAgICB0LmljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWRpZXJlc2lzID0gNTAwOwogICAgdC5lZGllcmVzaXMgPSA0NDQ7CiAgICB0LmNhY3V0ZSA9IDQ0NDsKICAgIHQubmFjdXRlID0gNTU2OwogICAgdC51bWFjcm9uID0gNTU2OwogICAgdC5OY2Fyb24gPSA3MjI7CiAgICB0LklhY3V0ZSA9IDM4OTsKICAgIHQucGx1c21pbnVzID0gNTcwOwogICAgdC5icm9rZW5iYXIgPSAyMjA7CiAgICB0LnJlZ2lzdGVyZWQgPSA3NDc7CiAgICB0LkdicmV2ZSA9IDcyMjsKICAgIHQuSWRvdGFjY2VudCA9IDM4OTsKICAgIHQuc3VtbWF0aW9uID0gNjAwOwogICAgdC5FZ3JhdmUgPSA2Njc7CiAgICB0LnJhY3V0ZSA9IDM4OTsKICAgIHQub21hY3JvbiA9IDUwMDsKICAgIHQuWmFjdXRlID0gNjExOwogICAgdC5aY2Fyb24gPSA2MTE7CiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKICAgIHQuRXRoID0gNzIyOwogICAgdC5DY2VkaWxsYSA9IDY2NzsKICAgIHQubGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC50Y2Fyb24gPSAzNjY7CiAgICB0LmVvZ29uZWsgPSA0NDQ7CiAgICB0LlVvZ29uZWsgPSA3MjI7CiAgICB0LkFhY3V0ZSA9IDY2NzsKICAgIHQuQWRpZXJlc2lzID0gNjY3OwogICAgdC5lZ3JhdmUgPSA0NDQ7CiAgICB0LnphY3V0ZSA9IDM4OTsKICAgIHQuaW9nb25layA9IDI3ODsKICAgIHQuT2FjdXRlID0gNzIyOwogICAgdC5vYWN1dGUgPSA1MDA7CiAgICB0LmFtYWNyb24gPSA1MDA7CiAgICB0LnNhY3V0ZSA9IDM4OTsKICAgIHQuaWRpZXJlc2lzID0gMjc4OwogICAgdC5PY2lyY3VtZmxleCA9IDcyMjsKICAgIHQuVWdyYXZlID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQudGhvcm4gPSA1MDA7CiAgICB0LnR3b3N1cGVyaW9yID0gMzAwOwogICAgdC5PZGllcmVzaXMgPSA3MjI7CiAgICB0Lm11ID0gNTc2OwogICAgdC5pZ3JhdmUgPSAyNzg7CiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LkVvZ29uZWsgPSA2Njc7CiAgICB0LmRjcm9hdCA9IDUwMDsKICAgIHQudGhyZWVxdWFydGVycyA9IDc1MDsKICAgIHQuU2NlZGlsbGEgPSA1NTY7CiAgICB0LmxjYXJvbiA9IDM4MjsKICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5MYWN1dGUgPSA2MTE7CiAgICB0LnRyYWRlbWFyayA9IDEwMDA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDM4OTsKICAgIHQuSW1hY3JvbiA9IDM4OTsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1NTY7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDY2NzsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1NTY7CiAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTU2OwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA2Njc7CiAgICB0LkFvZ29uZWsgPSA2Njc7CiAgICB0LkFyaW5nID0gNjY3OwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSAzODk7CiAgICB0LkVjYXJvbiA9IDY2NzsKICAgIHQuSW9nb25layA9IDM4OTsKICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5taW51cyA9IDYwNjsKICAgIHQuSWNpcmN1bWZsZXggPSAzODk7CiAgICB0Lm5jYXJvbiA9IDU1NjsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNjA2OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDU1NjsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSAzODk7CiAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdFsiVGltZXMtSXRhbGljIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNTA7CiAgICB0LmV4Y2xhbSA9IDMzMzsKICAgIHQucXVvdGVkYmwgPSA0MjA7CiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CiAgICB0LmRvbGxhciA9IDUwMDsKICAgIHQucGVyY2VudCA9IDgzMzsKICAgIHQuYW1wZXJzYW5kID0gNzc4OwogICAgdC5xdW90ZXJpZ2h0ID0gMzMzOwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gNTAwOwogICAgdC5wbHVzID0gNjc1OwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNTA7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTAwOwogICAgdC5vbmUgPSA1MDA7CiAgICB0LnR3byA9IDUwMDsKICAgIHQudGhyZWUgPSA1MDA7CiAgICB0LmZvdXIgPSA1MDA7CiAgICB0LmZpdmUgPSA1MDA7CiAgICB0LnNpeCA9IDUwMDsKICAgIHQuc2V2ZW4gPSA1MDA7CiAgICB0LmVpZ2h0ID0gNTAwOwogICAgdC5uaW5lID0gNTAwOwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNjc1OwogICAgdC5lcXVhbCA9IDY3NTsKICAgIHQuZ3JlYXRlciA9IDY3NTsKICAgIHQucXVlc3Rpb24gPSA1MDA7CiAgICB0LmF0ID0gOTIwOwogICAgdC5BID0gNjExOwogICAgdC5CID0gNjExOwogICAgdC5DID0gNjY3OwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjExOwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzIyOwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMzMzOwogICAgdC5KID0gNDQ0OwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNTU2OwogICAgdC5NID0gODMzOwogICAgdC5OID0gNjY3OwogICAgdC5PID0gNzIyOwogICAgdC5QID0gNjExOwogICAgdC5RID0gNzIyOwogICAgdC5SID0gNjExOwogICAgdC5TID0gNTAwOwogICAgdC5UID0gNTU2OwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjExOwogICAgdC5XID0gODMzOwogICAgdC5YID0gNjExOwogICAgdC5ZID0gNTU2OwogICAgdC5aID0gNTU2OwogICAgdC5icmFja2V0bGVmdCA9IDM4OTsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzODk7CiAgICB0LmFzY2lpY2lyY3VtID0gNDIyOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1MDA7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1MDA7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAyNzg7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1MDA7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA0NDQ7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA3MjI7CiAgICB0Lm4gPSA1MDA7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1MDA7CiAgICB0LnEgPSA1MDA7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1MDA7CiAgICB0LnYgPSA0NDQ7CiAgICB0LncgPSA2Njc7CiAgICB0LnggPSA0NDQ7CiAgICB0LnkgPSA0NDQ7CiAgICB0LnogPSAzODk7CiAgICB0LmJyYWNlbGVmdCA9IDQwMDsKICAgIHQuYmFyID0gMjc1OwogICAgdC5icmFjZXJpZ2h0ID0gNDAwOwogICAgdC5hc2NpaXRpbGRlID0gNTQxOwogICAgdC5leGNsYW1kb3duID0gMzg5OwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyMTQ7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDU1NjsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTAwOwogICAgdC5mbCA9IDUwMDsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDUyMzsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTU2OwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTU2OwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKICAgIHQuZWxsaXBzaXMgPSA4ODk7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNTAwOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDg4OTsKICAgIHQuQUUgPSA4ODk7CiAgICB0Lm9yZGZlbWluaW5lID0gMjc2OwogICAgdC5Mc2xhc2ggPSA1NTY7CiAgICB0Lk9zbGFzaCA9IDcyMjsKICAgIHQuT0UgPSA5NDQ7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDsKICAgIHQuYWUgPSA2Njc7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA2Njc7CiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CiAgICB0LklkaWVyZXNpcyA9IDMzMzsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA1MDA7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNTU2OwogICAgdC5kaXZpZGUgPSA2NzU7CiAgICB0LllhY3V0ZSA9IDU1NjsKICAgIHQuQWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFhY3V0ZSA9IDUwMDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDQ0NDsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDUwMDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTAwOwogICAgdC5FZGllcmVzaXMgPSA2MTE7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc2MDsKICAgIHQuRW1hY3JvbiA9IDYxMTsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDUwMDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNjY3OwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDUwMDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5DYWN1dGUgPSA2Njc7CiAgICB0LmF0aWxkZSA9IDUwMDsKICAgIHQuRWRvdGFjY2VudCA9IDYxMTsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA2MTE7CiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTAwOwogICAgdC5BbWFjcm9uID0gNjExOwogICAgdC5yY2Fyb24gPSAzODk7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNTU2OwogICAgdC5UaG9ybiA9IDYxMTsKICAgIHQuT21hY3JvbiA9IDcyMjsKICAgIHQuUmFjdXRlID0gNjExOwogICAgdC5TYWN1dGUgPSA1MDA7CiAgICB0LmRjYXJvbiA9IDU0NDsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1MDA7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDcyMjsKICAgIHQuQWdyYXZlID0gNjExOwogICAgdC5BYnJldmUgPSA2MTE7CiAgICB0Lm11bHRpcGx5ID0gNjc1OwogICAgdC51YWN1dGUgPSA1MDA7CiAgICB0LlRjYXJvbiA9IDU1NjsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDQ0NDsKICAgIHQuTmFjdXRlID0gNjY3OwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFkaWVyZXNpcyA9IDUwMDsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDUwMDsKICAgIHQudW1hY3JvbiA9IDUwMDsKICAgIHQuTmNhcm9uID0gNjY3OwogICAgdC5JYWN1dGUgPSAzMzM7CiAgICB0LnBsdXNtaW51cyA9IDY3NTsKICAgIHQuYnJva2VuYmFyID0gMjc1OwogICAgdC5yZWdpc3RlcmVkID0gNzYwOwogICAgdC5HYnJldmUgPSA3MjI7CiAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjExOwogICAgdC5yYWN1dGUgPSAzODk7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDU1NjsKICAgIHQuWmNhcm9uID0gNTU2OwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA2Njc7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzAwOwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA2MTE7CiAgICB0LkFkaWVyZXNpcyA9IDYxMTsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSAzODk7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDcyMjsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNTAwOwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTAwOwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzIyOwogICAgdC5tdSA9IDUwMDsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjExOwogICAgdC5kY3JvYXQgPSA1MDA7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTAwOwogICAgdC5sY2Fyb24gPSAzMDA7CiAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGFjdXRlID0gNTU2OwogICAgdC50cmFkZW1hcmsgPSA5ODA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDMzMzsKICAgIHQuSW1hY3JvbiA9IDMzMzsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1MDA7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDYxMTsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1MDA7CiAgICB0LlNjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTAwOwogICAgdC5yYWRpY2FsID0gNDUzOwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNjY3OwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuTGNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5BdGlsZGUgPSA2MTE7CiAgICB0LkFvZ29uZWsgPSA2MTE7CiAgICB0LkFyaW5nID0gNjExOwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSAzODk7CiAgICB0LkVjYXJvbiA9IDYxMTsKICAgIHQuSW9nb25layA9IDMzMzsKICAgIHQua2NvbW1hYWNjZW50ID0gNDQ0OwogICAgdC5taW51cyA9IDY3NTsKICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7CiAgICB0Lm5jYXJvbiA9IDUwMDsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNjc1OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDUwMDsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSAzODk7CiAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdC5aYXBmRGluZ2JhdHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNzg7CiAgICB0LmExID0gOTc0OwogICAgdC5hMiA9IDk2MTsKICAgIHQuYTIwMiA9IDk3NDsKICAgIHQuYTMgPSA5ODA7CiAgICB0LmE0ID0gNzE5OwogICAgdC5hNSA9IDc4OTsKICAgIHQuYTExOSA9IDc5MDsKICAgIHQuYTExOCA9IDc5MTsKICAgIHQuYTExNyA9IDY5MDsKICAgIHQuYTExID0gOTYwOwogICAgdC5hMTIgPSA5Mzk7CiAgICB0LmExMyA9IDU0OTsKICAgIHQuYTE0ID0gODU1OwogICAgdC5hMTUgPSA5MTE7CiAgICB0LmExNiA9IDkzMzsKICAgIHQuYTEwNSA9IDkxMTsKICAgIHQuYTE3ID0gOTQ1OwogICAgdC5hMTggPSA5NzQ7CiAgICB0LmExOSA9IDc1NTsKICAgIHQuYTIwID0gODQ2OwogICAgdC5hMjEgPSA3NjI7CiAgICB0LmEyMiA9IDc2MTsKICAgIHQuYTIzID0gNTcxOwogICAgdC5hMjQgPSA2Nzc7CiAgICB0LmEyNSA9IDc2MzsKICAgIHQuYTI2ID0gNzYwOwogICAgdC5hMjcgPSA3NTk7CiAgICB0LmEyOCA9IDc1NDsKICAgIHQuYTYgPSA0OTQ7CiAgICB0LmE3ID0gNTUyOwogICAgdC5hOCA9IDUzNzsKICAgIHQuYTkgPSA1Nzc7CiAgICB0LmExMCA9IDY5MjsKICAgIHQuYTI5ID0gNzg2OwogICAgdC5hMzAgPSA3ODg7CiAgICB0LmEzMSA9IDc4ODsKICAgIHQuYTMyID0gNzkwOwogICAgdC5hMzMgPSA3OTM7CiAgICB0LmEzNCA9IDc5NDsKICAgIHQuYTM1ID0gODE2OwogICAgdC5hMzYgPSA4MjM7CiAgICB0LmEzNyA9IDc4OTsKICAgIHQuYTM4ID0gODQxOwogICAgdC5hMzkgPSA4MjM7CiAgICB0LmE0MCA9IDgzMzsKICAgIHQuYTQxID0gODE2OwogICAgdC5hNDIgPSA4MzE7CiAgICB0LmE0MyA9IDkyMzsKICAgIHQuYTQ0ID0gNzQ0OwogICAgdC5hNDUgPSA3MjM7CiAgICB0LmE0NiA9IDc0OTsKICAgIHQuYTQ3ID0gNzkwOwogICAgdC5hNDggPSA3OTI7CiAgICB0LmE0OSA9IDY5NTsKICAgIHQuYTUwID0gNzc2OwogICAgdC5hNTEgPSA3Njg7CiAgICB0LmE1MiA9IDc5MjsKICAgIHQuYTUzID0gNzU5OwogICAgdC5hNTQgPSA3MDc7CiAgICB0LmE1NSA9IDcwODsKICAgIHQuYTU2ID0gNjgyOwogICAgdC5hNTcgPSA3MDE7CiAgICB0LmE1OCA9IDgyNjsKICAgIHQuYTU5ID0gODE1OwogICAgdC5hNjAgPSA3ODk7CiAgICB0LmE2MSA9IDc4OTsKICAgIHQuYTYyID0gNzA3OwogICAgdC5hNjMgPSA2ODc7CiAgICB0LmE2NCA9IDY5NjsKICAgIHQuYTY1ID0gNjg5OwogICAgdC5hNjYgPSA3ODY7CiAgICB0LmE2NyA9IDc4NzsKICAgIHQuYTY4ID0gNzEzOwogICAgdC5hNjkgPSA3OTE7CiAgICB0LmE3MCA9IDc4NTsKICAgIHQuYTcxID0gNzkxOwogICAgdC5hNzIgPSA4NzM7CiAgICB0LmE3MyA9IDc2MTsKICAgIHQuYTc0ID0gNzYyOwogICAgdC5hMjAzID0gNzYyOwogICAgdC5hNzUgPSA3NTk7CiAgICB0LmEyMDQgPSA3NTk7CiAgICB0LmE3NiA9IDg5MjsKICAgIHQuYTc3ID0gODkyOwogICAgdC5hNzggPSA3ODg7CiAgICB0LmE3OSA9IDc4NDsKICAgIHQuYTgxID0gNDM4OwogICAgdC5hODIgPSAxMzg7CiAgICB0LmE4MyA9IDI3NzsKICAgIHQuYTg0ID0gNDE1OwogICAgdC5hOTcgPSAzOTI7CiAgICB0LmE5OCA9IDM5MjsKICAgIHQuYTk5ID0gNjY4OwogICAgdC5hMTAwID0gNjY4OwogICAgdC5hODkgPSAzOTA7CiAgICB0LmE5MCA9IDM5MDsKICAgIHQuYTkzID0gMzE3OwogICAgdC5hOTQgPSAzMTc7CiAgICB0LmE5MSA9IDI3NjsKICAgIHQuYTkyID0gMjc2OwogICAgdC5hMjA1ID0gNTA5OwogICAgdC5hODUgPSA1MDk7CiAgICB0LmEyMDYgPSA0MTA7CiAgICB0LmE4NiA9IDQxMDsKICAgIHQuYTg3ID0gMjM0OwogICAgdC5hODggPSAyMzQ7CiAgICB0LmE5NSA9IDMzNDsKICAgIHQuYTk2ID0gMzM0OwogICAgdC5hMTAxID0gNzMyOwogICAgdC5hMTAyID0gNTQ0OwogICAgdC5hMTAzID0gNTQ0OwogICAgdC5hMTA0ID0gOTEwOwogICAgdC5hMTA2ID0gNjY3OwogICAgdC5hMTA3ID0gNzYwOwogICAgdC5hMTA4ID0gNzYwOwogICAgdC5hMTEyID0gNzc2OwogICAgdC5hMTExID0gNTk1OwogICAgdC5hMTEwID0gNjk0OwogICAgdC5hMTA5ID0gNjI2OwogICAgdC5hMTIwID0gNzg4OwogICAgdC5hMTIxID0gNzg4OwogICAgdC5hMTIyID0gNzg4OwogICAgdC5hMTIzID0gNzg4OwogICAgdC5hMTI0ID0gNzg4OwogICAgdC5hMTI1ID0gNzg4OwogICAgdC5hMTI2ID0gNzg4OwogICAgdC5hMTI3ID0gNzg4OwogICAgdC5hMTI4ID0gNzg4OwogICAgdC5hMTI5ID0gNzg4OwogICAgdC5hMTMwID0gNzg4OwogICAgdC5hMTMxID0gNzg4OwogICAgdC5hMTMyID0gNzg4OwogICAgdC5hMTMzID0gNzg4OwogICAgdC5hMTM0ID0gNzg4OwogICAgdC5hMTM1ID0gNzg4OwogICAgdC5hMTM2ID0gNzg4OwogICAgdC5hMTM3ID0gNzg4OwogICAgdC5hMTM4ID0gNzg4OwogICAgdC5hMTM5ID0gNzg4OwogICAgdC5hMTQwID0gNzg4OwogICAgdC5hMTQxID0gNzg4OwogICAgdC5hMTQyID0gNzg4OwogICAgdC5hMTQzID0gNzg4OwogICAgdC5hMTQ0ID0gNzg4OwogICAgdC5hMTQ1ID0gNzg4OwogICAgdC5hMTQ2ID0gNzg4OwogICAgdC5hMTQ3ID0gNzg4OwogICAgdC5hMTQ4ID0gNzg4OwogICAgdC5hMTQ5ID0gNzg4OwogICAgdC5hMTUwID0gNzg4OwogICAgdC5hMTUxID0gNzg4OwogICAgdC5hMTUyID0gNzg4OwogICAgdC5hMTUzID0gNzg4OwogICAgdC5hMTU0ID0gNzg4OwogICAgdC5hMTU1ID0gNzg4OwogICAgdC5hMTU2ID0gNzg4OwogICAgdC5hMTU3ID0gNzg4OwogICAgdC5hMTU4ID0gNzg4OwogICAgdC5hMTU5ID0gNzg4OwogICAgdC5hMTYwID0gODk0OwogICAgdC5hMTYxID0gODM4OwogICAgdC5hMTYzID0gMTAxNjsKICAgIHQuYTE2NCA9IDQ1ODsKICAgIHQuYTE5NiA9IDc0ODsKICAgIHQuYTE2NSA9IDkyNDsKICAgIHQuYTE5MiA9IDc0ODsKICAgIHQuYTE2NiA9IDkxODsKICAgIHQuYTE2NyA9IDkyNzsKICAgIHQuYTE2OCA9IDkyODsKICAgIHQuYTE2OSA9IDkyODsKICAgIHQuYTE3MCA9IDgzNDsKICAgIHQuYTE3MSA9IDg3MzsKICAgIHQuYTE3MiA9IDgyODsKICAgIHQuYTE3MyA9IDkyNDsKICAgIHQuYTE2MiA9IDkyNDsKICAgIHQuYTE3NCA9IDkxNzsKICAgIHQuYTE3NSA9IDkzMDsKICAgIHQuYTE3NiA9IDkzMTsKICAgIHQuYTE3NyA9IDQ2MzsKICAgIHQuYTE3OCA9IDg4MzsKICAgIHQuYTE3OSA9IDgzNjsKICAgIHQuYTE5MyA9IDgzNjsKICAgIHQuYTE4MCA9IDg2NzsKICAgIHQuYTE5OSA9IDg2NzsKICAgIHQuYTE4MSA9IDY5NjsKICAgIHQuYTIwMCA9IDY5NjsKICAgIHQuYTE4MiA9IDg3NDsKICAgIHQuYTIwMSA9IDg3NDsKICAgIHQuYTE4MyA9IDc2MDsKICAgIHQuYTE4NCA9IDk0NjsKICAgIHQuYTE5NyA9IDc3MTsKICAgIHQuYTE4NSA9IDg2NTsKICAgIHQuYTE5NCA9IDc3MTsKICAgIHQuYTE5OCA9IDg4ODsKICAgIHQuYTE4NiA9IDk2NzsKICAgIHQuYTE5NSA9IDg4ODsKICAgIHQuYTE4NyA9IDgzMTsKICAgIHQuYTE4OCA9IDg3MzsKICAgIHQuYTE4OSA9IDkyNzsKICAgIHQuYTE5MCA9IDk3MDsKICAgIHQuYTE5MSA9IDkxODsKICB9KTsKfSk7CmNvbnN0IGdldEZvbnRCYXNpY01ldHJpY3MgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkNvdXJpZXIgPSB7CiAgICBhc2NlbnQ6IDYyOSwKICAgIGRlc2NlbnQ6IC0xNTcsCiAgICBjYXBIZWlnaHQ6IDU2MiwKICAgIHhIZWlnaHQ6IC00MjYKICB9OwogIHRbIkNvdXJpZXItQm9sZCJdID0gewogICAgYXNjZW50OiA2MjksCiAgICBkZXNjZW50OiAtMTU3LAogICAgY2FwSGVpZ2h0OiA1NjIsCiAgICB4SGVpZ2h0OiA0MzkKICB9OwogIHRbIkNvdXJpZXItT2JsaXF1ZSJdID0gewogICAgYXNjZW50OiA2MjksCiAgICBkZXNjZW50OiAtMTU3LAogICAgY2FwSGVpZ2h0OiA1NjIsCiAgICB4SGVpZ2h0OiA0MjYKICB9OwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9IHsKICAgIGFzY2VudDogNjI5LAogICAgZGVzY2VudDogLTE1NywKICAgIGNhcEhlaWdodDogNTYyLAogICAgeEhlaWdodDogNDI2CiAgfTsKICB0LkhlbHZldGljYSA9IHsKICAgIGFzY2VudDogNzE4LAogICAgZGVzY2VudDogLTIwNywKICAgIGNhcEhlaWdodDogNzE4LAogICAgeEhlaWdodDogNTIzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gewogICAgYXNjZW50OiA3MTgsCiAgICBkZXNjZW50OiAtMjA3LAogICAgY2FwSGVpZ2h0OiA3MTgsCiAgICB4SGVpZ2h0OiA1MzIKICB9OwogIHRbIkhlbHZldGljYS1PYmxpcXVlIl0gPSB7CiAgICBhc2NlbnQ6IDcxOCwKICAgIGRlc2NlbnQ6IC0yMDcsCiAgICBjYXBIZWlnaHQ6IDcxOCwKICAgIHhIZWlnaHQ6IDUyMwogIH07CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSB7CiAgICBhc2NlbnQ6IDcxOCwKICAgIGRlc2NlbnQ6IC0yMDcsCiAgICBjYXBIZWlnaHQ6IDcxOCwKICAgIHhIZWlnaHQ6IDUzMgogIH07CiAgdFsiVGltZXMtUm9tYW4iXSA9IHsKICAgIGFzY2VudDogNjgzLAogICAgZGVzY2VudDogLTIxNywKICAgIGNhcEhlaWdodDogNjYyLAogICAgeEhlaWdodDogNDUwCiAgfTsKICB0WyJUaW1lcy1Cb2xkIl0gPSB7CiAgICBhc2NlbnQ6IDY4MywKICAgIGRlc2NlbnQ6IC0yMTcsCiAgICBjYXBIZWlnaHQ6IDY3NiwKICAgIHhIZWlnaHQ6IDQ2MQogIH07CiAgdFsiVGltZXMtSXRhbGljIl0gPSB7CiAgICBhc2NlbnQ6IDY4MywKICAgIGRlc2NlbnQ6IC0yMTcsCiAgICBjYXBIZWlnaHQ6IDY1MywKICAgIHhIZWlnaHQ6IDQ0MQogIH07CiAgdFsiVGltZXMtQm9sZEl0YWxpYyJdID0gewogICAgYXNjZW50OiA2ODMsCiAgICBkZXNjZW50OiAtMjE3LAogICAgY2FwSGVpZ2h0OiA2NjksCiAgICB4SGVpZ2h0OiA0NjIKICB9OwogIHQuU3ltYm9sID0gewogICAgYXNjZW50OiBNYXRoLk5hTiwKICAgIGRlc2NlbnQ6IE1hdGguTmFOLAogICAgY2FwSGVpZ2h0OiBNYXRoLk5hTiwKICAgIHhIZWlnaHQ6IE1hdGguTmFOCiAgfTsKICB0LlphcGZEaW5nYmF0cyA9IHsKICAgIGFzY2VudDogTWF0aC5OYU4sCiAgICBkZXNjZW50OiBNYXRoLk5hTiwKICAgIGNhcEhlaWdodDogTWF0aC5OYU4sCiAgICB4SGVpZ2h0OiBNYXRoLk5hTgogIH07Cn0pOwoKOy8vIC4vc3JjL2NvcmUvZ2x5Zi5qcwpjb25zdCBPTl9DVVJWRV9QT0lOVCA9IDEgPDwgMDsKY29uc3QgWF9TSE9SVF9WRUNUT1IgPSAxIDw8IDE7CmNvbnN0IFlfU0hPUlRfVkVDVE9SID0gMSA8PCAyOwpjb25zdCBSRVBFQVRfRkxBRyA9IDEgPDwgMzsKY29uc3QgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SID0gMSA8PCA0Owpjb25zdCBZX0lTX1NBTUVfT1JfUE9TSVRJVkVfWV9TSE9SVF9WRUNUT1IgPSAxIDw8IDU7CmNvbnN0IE9WRVJMQVBfU0lNUExFID0gMSA8PCA2Owpjb25zdCBBUkdfMV9BTkRfMl9BUkVfV09SRFMgPSAxIDw8IDA7CmNvbnN0IEFSR1NfQVJFX1hZX1ZBTFVFUyA9IDEgPDwgMTsKY29uc3QgV0VfSEFWRV9BX1NDQUxFID0gMSA8PCAzOwpjb25zdCBNT1JFX0NPTVBPTkVOVFMgPSAxIDw8IDU7CmNvbnN0IFdFX0hBVkVfQU5fWF9BTkRfWV9TQ0FMRSA9IDEgPDwgNjsKY29uc3QgV0VfSEFWRV9BX1RXT19CWV9UV08gPSAxIDw8IDc7CmNvbnN0IFdFX0hBVkVfSU5TVFJVQ1RJT05TID0gMSA8PCA4OwpjbGFzcyBHbHlmVGFibGUgewogIGNvbnN0cnVjdG9yKHsKICAgIGdseWZUYWJsZSwKICAgIGlzR2x5cGhMb2NhdGlvbnNMb25nLAogICAgbG9jYVRhYmxlLAogICAgbnVtR2x5cGhzCiAgfSkgewogICAgdGhpcy5nbHlwaHMgPSBbXTsKICAgIGNvbnN0IGxvY2EgPSBuZXcgRGF0YVZpZXcobG9jYVRhYmxlLmJ1ZmZlciwgbG9jYVRhYmxlLmJ5dGVPZmZzZXQsIGxvY2FUYWJsZS5ieXRlTGVuZ3RoKTsKICAgIGNvbnN0IGdseWYgPSBuZXcgRGF0YVZpZXcoZ2x5ZlRhYmxlLmJ1ZmZlciwgZ2x5ZlRhYmxlLmJ5dGVPZmZzZXQsIGdseWZUYWJsZS5ieXRlTGVuZ3RoKTsKICAgIGNvbnN0IG9mZnNldFNpemUgPSBpc0dseXBoTG9jYXRpb25zTG9uZyA/IDQgOiAyOwogICAgbGV0IHByZXYgPSBpc0dseXBoTG9jYXRpb25zTG9uZyA/IGxvY2EuZ2V0VWludDMyKDApIDogMiAqIGxvY2EuZ2V0VWludDE2KDApOwogICAgbGV0IHBvcyA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CiAgICAgIHBvcyArPSBvZmZzZXRTaXplOwogICAgICBjb25zdCBuZXh0ID0gaXNHbHlwaExvY2F0aW9uc0xvbmcgPyBsb2NhLmdldFVpbnQzMihwb3MpIDogMiAqIGxvY2EuZ2V0VWludDE2KHBvcyk7CiAgICAgIGlmIChuZXh0ID09PSBwcmV2KSB7CiAgICAgICAgdGhpcy5nbHlwaHMucHVzaChuZXcgR2x5cGgoe30pKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBnbHlwaCA9IEdseXBoLnBhcnNlKHByZXYsIGdseWYpOwogICAgICB0aGlzLmdseXBocy5wdXNoKGdseXBoKTsKICAgICAgcHJldiA9IG5leHQ7CiAgICB9CiAgfQogIGdldFNpemUoKSB7CiAgICByZXR1cm4gTWF0aC5zdW1QcmVjaXNlKHRoaXMuZ2x5cGhzLm1hcChnID0+IGcuZ2V0U2l6ZSgpICsgMyAmIH4zKSk7CiAgfQogIHdyaXRlKCkgewogICAgY29uc3QgdG90YWxTaXplID0gdGhpcy5nZXRTaXplKCk7CiAgICBjb25zdCBnbHlmVGFibGUgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKHRvdGFsU2l6ZSkpOwogICAgY29uc3QgaXNMb2NhdGlvbkxvbmcgPSB0b3RhbFNpemUgPiAweDFmZmZlOwogICAgY29uc3Qgb2Zmc2V0U2l6ZSA9IGlzTG9jYXRpb25Mb25nID8gNCA6IDI7CiAgICBjb25zdCBsb2NhVGFibGUgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKCh0aGlzLmdseXBocy5sZW5ndGggKyAxKSAqIG9mZnNldFNpemUpKTsKICAgIGlmIChpc0xvY2F0aW9uTG9uZykgewogICAgICBsb2NhVGFibGUuc2V0VWludDMyKDAsIDApOwogICAgfSBlbHNlIHsKICAgICAgbG9jYVRhYmxlLnNldFVpbnQxNigwLCAwKTsKICAgIH0KICAgIGxldCBwb3MgPSAwOwogICAgbGV0IGxvY2FJbmRleCA9IDA7CiAgICBmb3IgKGNvbnN0IGdseXBoIG9mIHRoaXMuZ2x5cGhzKSB7CiAgICAgIHBvcyArPSBnbHlwaC53cml0ZShwb3MsIGdseWZUYWJsZSk7CiAgICAgIHBvcyA9IHBvcyArIDMgJiB+MzsKICAgICAgbG9jYUluZGV4ICs9IG9mZnNldFNpemU7CiAgICAgIGlmIChpc0xvY2F0aW9uTG9uZykgewogICAgICAgIGxvY2FUYWJsZS5zZXRVaW50MzIobG9jYUluZGV4LCBwb3MpOwogICAgICB9IGVsc2UgewogICAgICAgIGxvY2FUYWJsZS5zZXRVaW50MTYobG9jYUluZGV4LCBwb3MgPj4gMSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGlzTG9jYXRpb25Mb25nLAogICAgICBsb2NhOiBuZXcgVWludDhBcnJheShsb2NhVGFibGUuYnVmZmVyKSwKICAgICAgZ2x5ZjogbmV3IFVpbnQ4QXJyYXkoZ2x5ZlRhYmxlLmJ1ZmZlcikKICAgIH07CiAgfQogIHNjYWxlKGZhY3RvcnMpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgdGhpcy5nbHlwaHNbaV0uc2NhbGUoZmFjdG9yc1tpXSk7CiAgICB9CiAgfQp9CmNsYXNzIEdseXBoIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBoZWFkZXIgPSBudWxsLAogICAgc2ltcGxlID0gbnVsbCwKICAgIGNvbXBvc2l0ZXMgPSBudWxsCiAgfSkgewogICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CiAgICB0aGlzLnNpbXBsZSA9IHNpbXBsZTsKICAgIHRoaXMuY29tcG9zaXRlcyA9IGNvbXBvc2l0ZXM7CiAgfQogIHN0YXRpYyBwYXJzZShwb3MsIGdseWYpIHsKICAgIGNvbnN0IFtyZWFkLCBoZWFkZXJdID0gR2x5cGhIZWFkZXIucGFyc2UocG9zLCBnbHlmKTsKICAgIHBvcyArPSByZWFkOwogICAgaWYgKGhlYWRlci5udW1iZXJPZkNvbnRvdXJzIDwgMCkgewogICAgICBjb25zdCBjb21wb3NpdGVzID0gW107CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgY29uc3QgW24sIGNvbXBvc2l0ZV0gPSBDb21wb3NpdGVHbHlwaC5wYXJzZShwb3MsIGdseWYpOwogICAgICAgIHBvcyArPSBuOwogICAgICAgIGNvbXBvc2l0ZXMucHVzaChjb21wb3NpdGUpOwogICAgICAgIGlmICghKGNvbXBvc2l0ZS5mbGFncyAmIE1PUkVfQ09NUE9ORU5UUykpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmV3IEdseXBoKHsKICAgICAgICBoZWFkZXIsCiAgICAgICAgY29tcG9zaXRlcwogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IHNpbXBsZSA9IFNpbXBsZUdseXBoLnBhcnNlKHBvcywgZ2x5ZiwgaGVhZGVyLm51bWJlck9mQ29udG91cnMpOwogICAgcmV0dXJuIG5ldyBHbHlwaCh7CiAgICAgIGhlYWRlciwKICAgICAgc2ltcGxlCiAgICB9KTsKICB9CiAgZ2V0U2l6ZSgpIHsKICAgIGlmICghdGhpcy5oZWFkZXIpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBjb25zdCBzaXplID0gdGhpcy5zaW1wbGUgPyB0aGlzLnNpbXBsZS5nZXRTaXplKCkgOiBNYXRoLnN1bVByZWNpc2UodGhpcy5jb21wb3NpdGVzLm1hcChjID0+IGMuZ2V0U2l6ZSgpKSk7CiAgICByZXR1cm4gdGhpcy5oZWFkZXIuZ2V0U2l6ZSgpICsgc2l6ZTsKICB9CiAgd3JpdGUocG9zLCBidWYpIHsKICAgIGlmICghdGhpcy5oZWFkZXIpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBjb25zdCBzcG9zID0gcG9zOwogICAgcG9zICs9IHRoaXMuaGVhZGVyLndyaXRlKHBvcywgYnVmKTsKICAgIGlmICh0aGlzLnNpbXBsZSkgewogICAgICBwb3MgKz0gdGhpcy5zaW1wbGUud3JpdGUocG9zLCBidWYpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjb21wb3NpdGUgb2YgdGhpcy5jb21wb3NpdGVzKSB7CiAgICAgICAgcG9zICs9IGNvbXBvc2l0ZS53cml0ZShwb3MsIGJ1Zik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwb3MgLSBzcG9zOwogIH0KICBzY2FsZShmYWN0b3IpIHsKICAgIGlmICghdGhpcy5oZWFkZXIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgeE1pZGRsZSA9ICh0aGlzLmhlYWRlci54TWluICsgdGhpcy5oZWFkZXIueE1heCkgLyAyOwogICAgdGhpcy5oZWFkZXIuc2NhbGUoeE1pZGRsZSwgZmFjdG9yKTsKICAgIGlmICh0aGlzLnNpbXBsZSkgewogICAgICB0aGlzLnNpbXBsZS5zY2FsZSh4TWlkZGxlLCBmYWN0b3IpOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjb21wb3NpdGUgb2YgdGhpcy5jb21wb3NpdGVzKSB7CiAgICAgICAgY29tcG9zaXRlLnNjYWxlKHhNaWRkbGUsIGZhY3Rvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KY2xhc3MgR2x5cGhIZWFkZXIgewogIGNvbnN0cnVjdG9yKHsKICAgIG51bWJlck9mQ29udG91cnMsCiAgICB4TWluLAogICAgeU1pbiwKICAgIHhNYXgsCiAgICB5TWF4CiAgfSkgewogICAgdGhpcy5udW1iZXJPZkNvbnRvdXJzID0gbnVtYmVyT2ZDb250b3VyczsKICAgIHRoaXMueE1pbiA9IHhNaW47CiAgICB0aGlzLnlNaW4gPSB5TWluOwogICAgdGhpcy54TWF4ID0geE1heDsKICAgIHRoaXMueU1heCA9IHlNYXg7CiAgfQogIHN0YXRpYyBwYXJzZShwb3MsIGdseWYpIHsKICAgIHJldHVybiBbMTAsIG5ldyBHbHlwaEhlYWRlcih7CiAgICAgIG51bWJlck9mQ29udG91cnM6IGdseWYuZ2V0SW50MTYocG9zKSwKICAgICAgeE1pbjogZ2x5Zi5nZXRJbnQxNihwb3MgKyAyKSwKICAgICAgeU1pbjogZ2x5Zi5nZXRJbnQxNihwb3MgKyA0KSwKICAgICAgeE1heDogZ2x5Zi5nZXRJbnQxNihwb3MgKyA2KSwKICAgICAgeU1heDogZ2x5Zi5nZXRJbnQxNihwb3MgKyA4KQogICAgfSldOwogIH0KICBnZXRTaXplKCkgewogICAgcmV0dXJuIDEwOwogIH0KICB3cml0ZShwb3MsIGJ1ZikgewogICAgYnVmLnNldEludDE2KHBvcywgdGhpcy5udW1iZXJPZkNvbnRvdXJzKTsKICAgIGJ1Zi5zZXRJbnQxNihwb3MgKyAyLCB0aGlzLnhNaW4pOwogICAgYnVmLnNldEludDE2KHBvcyArIDQsIHRoaXMueU1pbik7CiAgICBidWYuc2V0SW50MTYocG9zICsgNiwgdGhpcy54TWF4KTsKICAgIGJ1Zi5zZXRJbnQxNihwb3MgKyA4LCB0aGlzLnlNYXgpOwogICAgcmV0dXJuIDEwOwogIH0KICBzY2FsZSh4LCBmYWN0b3IpIHsKICAgIHRoaXMueE1pbiA9IE1hdGgucm91bmQoeCArICh0aGlzLnhNaW4gLSB4KSAqIGZhY3Rvcik7CiAgICB0aGlzLnhNYXggPSBNYXRoLnJvdW5kKHggKyAodGhpcy54TWF4IC0geCkgKiBmYWN0b3IpOwogIH0KfQpjbGFzcyBDb250b3VyIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBmbGFncywKICAgIHhDb29yZGluYXRlcywKICAgIHlDb29yZGluYXRlcwogIH0pIHsKICAgIHRoaXMueENvb3JkaW5hdGVzID0geENvb3JkaW5hdGVzOwogICAgdGhpcy55Q29vcmRpbmF0ZXMgPSB5Q29vcmRpbmF0ZXM7CiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7CiAgfQp9CmNsYXNzIFNpbXBsZUdseXBoIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBjb250b3VycywKICAgIGluc3RydWN0aW9ucwogIH0pIHsKICAgIHRoaXMuY29udG91cnMgPSBjb250b3VyczsKICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zOwogIH0KICBzdGF0aWMgcGFyc2UocG9zLCBnbHlmLCBudW1iZXJPZkNvbnRvdXJzKSB7CiAgICBjb25zdCBlbmRQdHNPZkNvbnRvdXJzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mQ29udG91cnM7IGkrKykgewogICAgICBjb25zdCBlbmRQdCA9IGdseWYuZ2V0VWludDE2KHBvcyk7CiAgICAgIHBvcyArPSAyOwogICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2goZW5kUHQpOwogICAgfQogICAgY29uc3QgbnVtYmVyT2ZQdCA9IGVuZFB0c09mQ29udG91cnNbbnVtYmVyT2ZDb250b3VycyAtIDFdICsgMTsKICAgIGNvbnN0IGluc3RydWN0aW9uTGVuZ3RoID0gZ2x5Zi5nZXRVaW50MTYocG9zKTsKICAgIHBvcyArPSAyOwogICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gbmV3IFVpbnQ4QXJyYXkoZ2x5Zikuc2xpY2UocG9zLCBwb3MgKyBpbnN0cnVjdGlvbkxlbmd0aCk7CiAgICBwb3MgKz0gaW5zdHJ1Y3Rpb25MZW5ndGg7CiAgICBjb25zdCBmbGFncyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZlB0OyBwb3MrKywgaSsrKSB7CiAgICAgIGxldCBmbGFnID0gZ2x5Zi5nZXRVaW50OChwb3MpOwogICAgICBmbGFncy5wdXNoKGZsYWcpOwogICAgICBpZiAoZmxhZyAmIFJFUEVBVF9GTEFHKSB7CiAgICAgICAgY29uc3QgY291bnQgPSBnbHlmLmdldFVpbnQ4KCsrcG9zKTsKICAgICAgICBmbGFnIF49IFJFUEVBVF9GTEFHOwogICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgY291bnQ7IG0rKykgewogICAgICAgICAgZmxhZ3MucHVzaChmbGFnKTsKICAgICAgICB9CiAgICAgICAgaSArPSBjb3VudDsKICAgICAgfQogICAgfQogICAgY29uc3QgYWxsWENvb3JkaW5hdGVzID0gW107CiAgICBsZXQgeENvb3JkaW5hdGVzID0gW107CiAgICBsZXQgeUNvb3JkaW5hdGVzID0gW107CiAgICBsZXQgcG9pbnRGbGFncyA9IFtdOwogICAgY29uc3QgY29udG91cnMgPSBbXTsKICAgIGxldCBlbmRQdHNPZkNvbnRvdXJzSW5kZXggPSAwOwogICAgbGV0IGxhc3RDb29yZGluYXRlID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZQdDsgaSsrKSB7CiAgICAgIGNvbnN0IGZsYWcgPSBmbGFnc1tpXTsKICAgICAgaWYgKGZsYWcgJiBYX1NIT1JUX1ZFQ1RPUikgewogICAgICAgIGNvbnN0IHggPSBnbHlmLmdldFVpbnQ4KHBvcysrKTsKICAgICAgICBsYXN0Q29vcmRpbmF0ZSArPSBmbGFnICYgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SID8geCA6IC14OwogICAgICAgIHhDb29yZGluYXRlcy5wdXNoKGxhc3RDb29yZGluYXRlKTsKICAgICAgfSBlbHNlIGlmIChmbGFnICYgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SKSB7CiAgICAgICAgeENvb3JkaW5hdGVzLnB1c2gobGFzdENvb3JkaW5hdGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGxhc3RDb29yZGluYXRlICs9IGdseWYuZ2V0SW50MTYocG9zKTsKICAgICAgICBwb3MgKz0gMjsKICAgICAgICB4Q29vcmRpbmF0ZXMucHVzaChsYXN0Q29vcmRpbmF0ZSk7CiAgICAgIH0KICAgICAgaWYgKGVuZFB0c09mQ29udG91cnNbZW5kUHRzT2ZDb250b3Vyc0luZGV4XSA9PT0gaSkgewogICAgICAgIGVuZFB0c09mQ29udG91cnNJbmRleCsrOwogICAgICAgIGFsbFhDb29yZGluYXRlcy5wdXNoKHhDb29yZGluYXRlcyk7CiAgICAgICAgeENvb3JkaW5hdGVzID0gW107CiAgICAgIH0KICAgIH0KICAgIGxhc3RDb29yZGluYXRlID0gMDsKICAgIGVuZFB0c09mQ29udG91cnNJbmRleCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mUHQ7IGkrKykgewogICAgICBjb25zdCBmbGFnID0gZmxhZ3NbaV07CiAgICAgIGlmIChmbGFnICYgWV9TSE9SVF9WRUNUT1IpIHsKICAgICAgICBjb25zdCB5ID0gZ2x5Zi5nZXRVaW50OChwb3MrKyk7CiAgICAgICAgbGFzdENvb3JkaW5hdGUgKz0gZmxhZyAmIFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUiA/IHkgOiAteTsKICAgICAgICB5Q29vcmRpbmF0ZXMucHVzaChsYXN0Q29vcmRpbmF0ZSk7CiAgICAgIH0gZWxzZSBpZiAoZmxhZyAmIFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUikgewogICAgICAgIHlDb29yZGluYXRlcy5wdXNoKGxhc3RDb29yZGluYXRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsYXN0Q29vcmRpbmF0ZSArPSBnbHlmLmdldEludDE2KHBvcyk7CiAgICAgICAgcG9zICs9IDI7CiAgICAgICAgeUNvb3JkaW5hdGVzLnB1c2gobGFzdENvb3JkaW5hdGUpOwogICAgICB9CiAgICAgIHBvaW50RmxhZ3MucHVzaChmbGFnICYgT05fQ1VSVkVfUE9JTlQgfCBmbGFnICYgT1ZFUkxBUF9TSU1QTEUpOwogICAgICBpZiAoZW5kUHRzT2ZDb250b3Vyc1tlbmRQdHNPZkNvbnRvdXJzSW5kZXhdID09PSBpKSB7CiAgICAgICAgeENvb3JkaW5hdGVzID0gYWxsWENvb3JkaW5hdGVzW2VuZFB0c09mQ29udG91cnNJbmRleF07CiAgICAgICAgZW5kUHRzT2ZDb250b3Vyc0luZGV4Kys7CiAgICAgICAgY29udG91cnMucHVzaChuZXcgQ29udG91cih7CiAgICAgICAgICBmbGFnczogcG9pbnRGbGFncywKICAgICAgICAgIHhDb29yZGluYXRlcywKICAgICAgICAgIHlDb29yZGluYXRlcwogICAgICAgIH0pKTsKICAgICAgICB5Q29vcmRpbmF0ZXMgPSBbXTsKICAgICAgICBwb2ludEZsYWdzID0gW107CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU2ltcGxlR2x5cGgoewogICAgICBjb250b3VycywKICAgICAgaW5zdHJ1Y3Rpb25zCiAgICB9KTsKICB9CiAgZ2V0U2l6ZSgpIHsKICAgIGxldCBzaXplID0gdGhpcy5jb250b3Vycy5sZW5ndGggKiAyICsgMiArIHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aDsKICAgIGxldCBsYXN0WCA9IDA7CiAgICBsZXQgbGFzdFkgPSAwOwogICAgZm9yIChjb25zdCBjb250b3VyIG9mIHRoaXMuY29udG91cnMpIHsKICAgICAgc2l6ZSArPSBjb250b3VyLmZsYWdzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY29udG91ci54Q29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IHggPSBjb250b3VyLnhDb29yZGluYXRlc1tpXTsKICAgICAgICBjb25zdCB5ID0gY29udG91ci55Q29vcmRpbmF0ZXNbaV07CiAgICAgICAgbGV0IGFicyA9IE1hdGguYWJzKHggLSBsYXN0WCk7CiAgICAgICAgaWYgKGFicyA+IDI1NSkgewogICAgICAgICAgc2l6ZSArPSAyOwogICAgICAgIH0gZWxzZSBpZiAoYWJzID4gMCkgewogICAgICAgICAgc2l6ZSArPSAxOwogICAgICAgIH0KICAgICAgICBsYXN0WCA9IHg7CiAgICAgICAgYWJzID0gTWF0aC5hYnMoeSAtIGxhc3RZKTsKICAgICAgICBpZiAoYWJzID4gMjU1KSB7CiAgICAgICAgICBzaXplICs9IDI7CiAgICAgICAgfSBlbHNlIGlmIChhYnMgPiAwKSB7CiAgICAgICAgICBzaXplICs9IDE7CiAgICAgICAgfQogICAgICAgIGxhc3RZID0geTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNpemU7CiAgfQogIHdyaXRlKHBvcywgYnVmKSB7CiAgICBjb25zdCBzcG9zID0gcG9zOwogICAgY29uc3QgeENvb3JkaW5hdGVzID0gW107CiAgICBjb25zdCB5Q29vcmRpbmF0ZXMgPSBbXTsKICAgIGNvbnN0IGZsYWdzID0gW107CiAgICBsZXQgbGFzdFggPSAwOwogICAgbGV0IGxhc3RZID0gMDsKICAgIGZvciAoY29uc3QgY29udG91ciBvZiB0aGlzLmNvbnRvdXJzKSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNvbnRvdXIueENvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBsZXQgZmxhZyA9IGNvbnRvdXIuZmxhZ3NbaV07CiAgICAgICAgY29uc3QgeCA9IGNvbnRvdXIueENvb3JkaW5hdGVzW2ldOwogICAgICAgIGxldCBkZWx0YSA9IHggLSBsYXN0WDsKICAgICAgICBpZiAoZGVsdGEgPT09IDApIHsKICAgICAgICAgIGZsYWcgfD0gWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SOwogICAgICAgICAgeENvb3JkaW5hdGVzLnB1c2goMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGFicyA9IE1hdGguYWJzKGRlbHRhKTsKICAgICAgICAgIGlmIChhYnMgPD0gMjU1KSB7CiAgICAgICAgICAgIGZsYWcgfD0gZGVsdGEgPj0gMCA/IFhfU0hPUlRfVkVDVE9SIHwgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SIDogWF9TSE9SVF9WRUNUT1I7CiAgICAgICAgICAgIHhDb29yZGluYXRlcy5wdXNoKGFicyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB4Q29vcmRpbmF0ZXMucHVzaChkZWx0YSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxhc3RYID0geDsKICAgICAgICBjb25zdCB5ID0gY29udG91ci55Q29vcmRpbmF0ZXNbaV07CiAgICAgICAgZGVsdGEgPSB5IC0gbGFzdFk7CiAgICAgICAgaWYgKGRlbHRhID09PSAwKSB7CiAgICAgICAgICBmbGFnIHw9IFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUjsKICAgICAgICAgIHlDb29yZGluYXRlcy5wdXNoKDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBhYnMgPSBNYXRoLmFicyhkZWx0YSk7CiAgICAgICAgICBpZiAoYWJzIDw9IDI1NSkgewogICAgICAgICAgICBmbGFnIHw9IGRlbHRhID49IDAgPyBZX1NIT1JUX1ZFQ1RPUiB8IFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUiA6IFlfU0hPUlRfVkVDVE9SOwogICAgICAgICAgICB5Q29vcmRpbmF0ZXMucHVzaChhYnMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgeUNvb3JkaW5hdGVzLnB1c2goZGVsdGEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsYXN0WSA9IHk7CiAgICAgICAgZmxhZ3MucHVzaChmbGFnKTsKICAgICAgfQogICAgICBidWYuc2V0VWludDE2KHBvcywgeENvb3JkaW5hdGVzLmxlbmd0aCAtIDEpOwogICAgICBwb3MgKz0gMjsKICAgIH0KICAgIGJ1Zi5zZXRVaW50MTYocG9zLCB0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpOwogICAgcG9zICs9IDI7CiAgICBpZiAodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKSB7CiAgICAgIG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIDAsIGJ1Zi5idWZmZXIuYnl0ZUxlbmd0aCkuc2V0KHRoaXMuaW5zdHJ1Y3Rpb25zLCBwb3MpOwogICAgICBwb3MgKz0gdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoOwogICAgfQogICAgZm9yIChjb25zdCBmbGFnIG9mIGZsYWdzKSB7CiAgICAgIGJ1Zi5zZXRVaW50OChwb3MrKywgZmxhZyk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB4Q29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCB4ID0geENvb3JkaW5hdGVzW2ldOwogICAgICBjb25zdCBmbGFnID0gZmxhZ3NbaV07CiAgICAgIGlmIChmbGFnICYgWF9TSE9SVF9WRUNUT1IpIHsKICAgICAgICBidWYuc2V0VWludDgocG9zKyssIHgpOwogICAgICB9IGVsc2UgaWYgKCEoZmxhZyAmIFhfSVNfU0FNRV9PUl9QT1NJVElWRV9YX1NIT1JUX1ZFQ1RPUikpIHsKICAgICAgICBidWYuc2V0SW50MTYocG9zLCB4KTsKICAgICAgICBwb3MgKz0gMjsKICAgICAgfQogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0geUNvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgeSA9IHlDb29yZGluYXRlc1tpXTsKICAgICAgY29uc3QgZmxhZyA9IGZsYWdzW2ldOwogICAgICBpZiAoZmxhZyAmIFlfU0hPUlRfVkVDVE9SKSB7CiAgICAgICAgYnVmLnNldFVpbnQ4KHBvcysrLCB5KTsKICAgICAgfSBlbHNlIGlmICghKGZsYWcgJiBZX0lTX1NBTUVfT1JfUE9TSVRJVkVfWV9TSE9SVF9WRUNUT1IpKSB7CiAgICAgICAgYnVmLnNldEludDE2KHBvcywgeSk7CiAgICAgICAgcG9zICs9IDI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwb3MgLSBzcG9zOwogIH0KICBzY2FsZSh4LCBmYWN0b3IpIHsKICAgIGZvciAoY29uc3QgY29udG91ciBvZiB0aGlzLmNvbnRvdXJzKSB7CiAgICAgIGlmIChjb250b3VyLnhDb29yZGluYXRlcy5sZW5ndGggPT09IDApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb250b3VyLnhDb29yZGluYXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29udG91ci54Q29vcmRpbmF0ZXNbaV0gPSBNYXRoLnJvdW5kKHggKyAoY29udG91ci54Q29vcmRpbmF0ZXNbaV0gLSB4KSAqIGZhY3Rvcik7CiAgICAgIH0KICAgIH0KICB9Cn0KY2xhc3MgQ29tcG9zaXRlR2x5cGggewogIGNvbnN0cnVjdG9yKHsKICAgIGZsYWdzLAogICAgZ2x5cGhJbmRleCwKICAgIGFyZ3VtZW50MSwKICAgIGFyZ3VtZW50MiwKICAgIHRyYW5zZiwKICAgIGluc3RydWN0aW9ucwogIH0pIHsKICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKICAgIHRoaXMuZ2x5cGhJbmRleCA9IGdseXBoSW5kZXg7CiAgICB0aGlzLmFyZ3VtZW50MSA9IGFyZ3VtZW50MTsKICAgIHRoaXMuYXJndW1lbnQyID0gYXJndW1lbnQyOwogICAgdGhpcy50cmFuc2YgPSB0cmFuc2Y7CiAgICB0aGlzLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uczsKICB9CiAgc3RhdGljIHBhcnNlKHBvcywgZ2x5ZikgewogICAgY29uc3Qgc3BvcyA9IHBvczsKICAgIGNvbnN0IHRyYW5zZiA9IFtdOwogICAgbGV0IGZsYWdzID0gZ2x5Zi5nZXRVaW50MTYocG9zKTsKICAgIGNvbnN0IGdseXBoSW5kZXggPSBnbHlmLmdldFVpbnQxNihwb3MgKyAyKTsKICAgIHBvcyArPSA0OwogICAgbGV0IGFyZ3VtZW50MSwgYXJndW1lbnQyOwogICAgaWYgKGZsYWdzICYgQVJHXzFfQU5EXzJfQVJFX1dPUkRTKSB7CiAgICAgIGlmIChmbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUykgewogICAgICAgIGFyZ3VtZW50MSA9IGdseWYuZ2V0SW50MTYocG9zKTsKICAgICAgICBhcmd1bWVudDIgPSBnbHlmLmdldEludDE2KHBvcyArIDIpOwogICAgICB9IGVsc2UgewogICAgICAgIGFyZ3VtZW50MSA9IGdseWYuZ2V0VWludDE2KHBvcyk7CiAgICAgICAgYXJndW1lbnQyID0gZ2x5Zi5nZXRVaW50MTYocG9zICsgMik7CiAgICAgIH0KICAgICAgcG9zICs9IDQ7CiAgICAgIGZsYWdzIF49IEFSR18xX0FORF8yX0FSRV9XT1JEUzsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChmbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUykgewogICAgICAgIGFyZ3VtZW50MSA9IGdseWYuZ2V0SW50OChwb3MpOwogICAgICAgIGFyZ3VtZW50MiA9IGdseWYuZ2V0SW50OChwb3MgKyAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcmd1bWVudDEgPSBnbHlmLmdldFVpbnQ4KHBvcyk7CiAgICAgICAgYXJndW1lbnQyID0gZ2x5Zi5nZXRVaW50OChwb3MgKyAxKTsKICAgICAgfQogICAgICBwb3MgKz0gMjsKICAgIH0KICAgIGlmIChmbGFncyAmIFdFX0hBVkVfQV9TQ0FMRSkgewogICAgICB0cmFuc2YucHVzaChnbHlmLmdldFVpbnQxNihwb3MpKTsKICAgICAgcG9zICs9IDI7CiAgICB9IGVsc2UgaWYgKGZsYWdzICYgV0VfSEFWRV9BTl9YX0FORF9ZX1NDQUxFKSB7CiAgICAgIHRyYW5zZi5wdXNoKGdseWYuZ2V0VWludDE2KHBvcyksIGdseWYuZ2V0VWludDE2KHBvcyArIDIpKTsKICAgICAgcG9zICs9IDQ7CiAgICB9IGVsc2UgaWYgKGZsYWdzICYgV0VfSEFWRV9BX1RXT19CWV9UV08pIHsKICAgICAgdHJhbnNmLnB1c2goZ2x5Zi5nZXRVaW50MTYocG9zKSwgZ2x5Zi5nZXRVaW50MTYocG9zICsgMiksIGdseWYuZ2V0VWludDE2KHBvcyArIDQpLCBnbHlmLmdldFVpbnQxNihwb3MgKyA2KSk7CiAgICAgIHBvcyArPSA4OwogICAgfQogICAgbGV0IGluc3RydWN0aW9ucyA9IG51bGw7CiAgICBpZiAoZmxhZ3MgJiBXRV9IQVZFX0lOU1RSVUNUSU9OUykgewogICAgICBjb25zdCBpbnN0cnVjdGlvbkxlbmd0aCA9IGdseWYuZ2V0VWludDE2KHBvcyk7CiAgICAgIHBvcyArPSAyOwogICAgICBpbnN0cnVjdGlvbnMgPSBuZXcgVWludDhBcnJheShnbHlmKS5zbGljZShwb3MsIHBvcyArIGluc3RydWN0aW9uTGVuZ3RoKTsKICAgICAgcG9zICs9IGluc3RydWN0aW9uTGVuZ3RoOwogICAgfQogICAgcmV0dXJuIFtwb3MgLSBzcG9zLCBuZXcgQ29tcG9zaXRlR2x5cGgoewogICAgICBmbGFncywKICAgICAgZ2x5cGhJbmRleCwKICAgICAgYXJndW1lbnQxLAogICAgICBhcmd1bWVudDIsCiAgICAgIHRyYW5zZiwKICAgICAgaW5zdHJ1Y3Rpb25zCiAgICB9KV07CiAgfQogIGdldFNpemUoKSB7CiAgICBsZXQgc2l6ZSA9IDIgKyAyICsgdGhpcy50cmFuc2YubGVuZ3RoICogMjsKICAgIGlmICh0aGlzLmZsYWdzICYgV0VfSEFWRV9JTlNUUlVDVElPTlMpIHsKICAgICAgc2l6ZSArPSAyICsgdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoOwogICAgfQogICAgc2l6ZSArPSAyOwogICAgaWYgKHRoaXMuZmxhZ3MgJiAyKSB7CiAgICAgIGlmICghKHRoaXMuYXJndW1lbnQxID49IC0xMjggJiYgdGhpcy5hcmd1bWVudDEgPD0gMTI3ICYmIHRoaXMuYXJndW1lbnQyID49IC0xMjggJiYgdGhpcy5hcmd1bWVudDIgPD0gMTI3KSkgewogICAgICAgIHNpemUgKz0gMjsKICAgICAgfQogICAgfSBlbHNlIGlmICghKHRoaXMuYXJndW1lbnQxID49IDAgJiYgdGhpcy5hcmd1bWVudDEgPD0gMjU1ICYmIHRoaXMuYXJndW1lbnQyID49IDAgJiYgdGhpcy5hcmd1bWVudDIgPD0gMjU1KSkgewogICAgICBzaXplICs9IDI7CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKICB9CiAgd3JpdGUocG9zLCBidWYpIHsKICAgIGNvbnN0IHNwb3MgPSBwb3M7CiAgICBpZiAodGhpcy5mbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUykgewogICAgICBpZiAoISh0aGlzLmFyZ3VtZW50MSA+PSAtMTI4ICYmIHRoaXMuYXJndW1lbnQxIDw9IDEyNyAmJiB0aGlzLmFyZ3VtZW50MiA+PSAtMTI4ICYmIHRoaXMuYXJndW1lbnQyIDw9IDEyNykpIHsKICAgICAgICB0aGlzLmZsYWdzIHw9IEFSR18xX0FORF8yX0FSRV9XT1JEUzsKICAgICAgfQogICAgfSBlbHNlIGlmICghKHRoaXMuYXJndW1lbnQxID49IDAgJiYgdGhpcy5hcmd1bWVudDEgPD0gMjU1ICYmIHRoaXMuYXJndW1lbnQyID49IDAgJiYgdGhpcy5hcmd1bWVudDIgPD0gMjU1KSkgewogICAgICB0aGlzLmZsYWdzIHw9IEFSR18xX0FORF8yX0FSRV9XT1JEUzsKICAgIH0KICAgIGJ1Zi5zZXRVaW50MTYocG9zLCB0aGlzLmZsYWdzKTsKICAgIGJ1Zi5zZXRVaW50MTYocG9zICsgMiwgdGhpcy5nbHlwaEluZGV4KTsKICAgIHBvcyArPSA0OwogICAgaWYgKHRoaXMuZmxhZ3MgJiBBUkdfMV9BTkRfMl9BUkVfV09SRFMpIHsKICAgICAgaWYgKHRoaXMuZmxhZ3MgJiBBUkdTX0FSRV9YWV9WQUxVRVMpIHsKICAgICAgICBidWYuc2V0SW50MTYocG9zLCB0aGlzLmFyZ3VtZW50MSk7CiAgICAgICAgYnVmLnNldEludDE2KHBvcyArIDIsIHRoaXMuYXJndW1lbnQyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWYuc2V0VWludDE2KHBvcywgdGhpcy5hcmd1bWVudDEpOwogICAgICAgIGJ1Zi5zZXRVaW50MTYocG9zICsgMiwgdGhpcy5hcmd1bWVudDIpOwogICAgICB9CiAgICAgIHBvcyArPSA0OwogICAgfSBlbHNlIHsKICAgICAgYnVmLnNldFVpbnQ4KHBvcywgdGhpcy5hcmd1bWVudDEpOwogICAgICBidWYuc2V0VWludDgocG9zICsgMSwgdGhpcy5hcmd1bWVudDIpOwogICAgICBwb3MgKz0gMjsKICAgIH0KICAgIGlmICh0aGlzLmZsYWdzICYgV0VfSEFWRV9JTlNUUlVDVElPTlMpIHsKICAgICAgYnVmLnNldFVpbnQxNihwb3MsIHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCk7CiAgICAgIHBvcyArPSAyOwogICAgICBpZiAodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgMCwgYnVmLmJ1ZmZlci5ieXRlTGVuZ3RoKS5zZXQodGhpcy5pbnN0cnVjdGlvbnMsIHBvcyk7CiAgICAgICAgcG9zICs9IHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBvcyAtIHNwb3M7CiAgfQogIHNjYWxlKHgsIGZhY3Rvcikge30KfQoKOy8vIC4vc3JjL2NvcmUvb3BlbnR5cGVfZmlsZV9idWlsZGVyLmpzCgoKZnVuY3Rpb24gd3JpdGVJbnQxNihkZXN0LCBvZmZzZXQsIG51bSkgewogIGRlc3Rbb2Zmc2V0XSA9IG51bSA+PiA4ICYgMHhmZjsKICBkZXN0W29mZnNldCArIDFdID0gbnVtICYgMHhmZjsKfQpmdW5jdGlvbiB3cml0ZUludDMyKGRlc3QsIG9mZnNldCwgbnVtKSB7CiAgZGVzdFtvZmZzZXRdID0gbnVtID4+IDI0ICYgMHhmZjsKICBkZXN0W29mZnNldCArIDFdID0gbnVtID4+IDE2ICYgMHhmZjsKICBkZXN0W29mZnNldCArIDJdID0gbnVtID4+IDggJiAweGZmOwogIGRlc3Rbb2Zmc2V0ICsgM10gPSBudW0gJiAweGZmOwp9CmZ1bmN0aW9uIHdyaXRlRGF0YShkZXN0LCBvZmZzZXQsIGRhdGEpIHsKICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgIGRlc3Quc2V0KGRhdGEsIG9mZnNldCk7CiAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0W29mZnNldCsrXSA9IGRhdGEuY2hhckNvZGVBdChpKSAmIDB4ZmY7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAoY29uc3QgbnVtIG9mIGRhdGEpIHsKICAgICAgZGVzdFtvZmZzZXQrK10gPSBudW0gJiAweGZmOwogICAgfQogIH0KfQpjb25zdCBPVEZfSEVBREVSX1NJWkUgPSAxMjsKY29uc3QgT1RGX1RBQkxFX0VOVFJZX1NJWkUgPSAxNjsKY2xhc3MgT3BlblR5cGVGaWxlQnVpbGRlciB7CiAgY29uc3RydWN0b3Ioc2ZudCkgewogICAgdGhpcy5zZm50ID0gc2ZudDsKICAgIHRoaXMudGFibGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB9CiAgc3RhdGljIGdldFNlYXJjaFBhcmFtcyhlbnRyaWVzQ291bnQsIGVudHJ5U2l6ZSkgewogICAgbGV0IG1heFBvd2VyMiA9IDEsCiAgICAgIGxvZzIgPSAwOwogICAgd2hpbGUgKChtYXhQb3dlcjIgXiBlbnRyaWVzQ291bnQpID4gbWF4UG93ZXIyKSB7CiAgICAgIG1heFBvd2VyMiA8PD0gMTsKICAgICAgbG9nMisrOwogICAgfQogICAgY29uc3Qgc2VhcmNoUmFuZ2UgPSBtYXhQb3dlcjIgKiBlbnRyeVNpemU7CiAgICByZXR1cm4gewogICAgICByYW5nZTogc2VhcmNoUmFuZ2UsCiAgICAgIGVudHJ5OiBsb2cyLAogICAgICByYW5nZVNoaWZ0OiBlbnRyeVNpemUgKiBlbnRyaWVzQ291bnQgLSBzZWFyY2hSYW5nZQogICAgfTsKICB9CiAgdG9BcnJheSgpIHsKICAgIGxldCBzZm50ID0gdGhpcy5zZm50OwogICAgY29uc3QgdGFibGVzID0gdGhpcy50YWJsZXM7CiAgICBjb25zdCB0YWJsZXNOYW1lcyA9IE9iamVjdC5rZXlzKHRhYmxlcyk7CiAgICB0YWJsZXNOYW1lcy5zb3J0KCk7CiAgICBjb25zdCBudW1UYWJsZXMgPSB0YWJsZXNOYW1lcy5sZW5ndGg7CiAgICBsZXQgaSwgaiwgamosIHRhYmxlLCB0YWJsZU5hbWU7CiAgICBsZXQgb2Zmc2V0ID0gT1RGX0hFQURFUl9TSVpFICsgbnVtVGFibGVzICogT1RGX1RBQkxFX0VOVFJZX1NJWkU7CiAgICBjb25zdCB0YWJsZU9mZnNldHMgPSBbb2Zmc2V0XTsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgewogICAgICB0YWJsZSA9IHRhYmxlc1t0YWJsZXNOYW1lc1tpXV07CiAgICAgIGNvbnN0IHBhZGRlZExlbmd0aCA9ICh0YWJsZS5sZW5ndGggKyAzICYgfjMpID4+PiAwOwogICAgICBvZmZzZXQgKz0gcGFkZGVkTGVuZ3RoOwogICAgICB0YWJsZU9mZnNldHMucHVzaChvZmZzZXQpOwogICAgfQogICAgY29uc3QgZmlsZSA9IG5ldyBVaW50OEFycmF5KG9mZnNldCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKICAgICAgdGFibGUgPSB0YWJsZXNbdGFibGVzTmFtZXNbaV1dOwogICAgICB3cml0ZURhdGEoZmlsZSwgdGFibGVPZmZzZXRzW2ldLCB0YWJsZSk7CiAgICB9CiAgICBpZiAoc2ZudCA9PT0gInRydWUiKSB7CiAgICAgIHNmbnQgPSBzdHJpbmczMigweDAwMDEwMDAwKTsKICAgIH0KICAgIGZpbGVbMF0gPSBzZm50LmNoYXJDb2RlQXQoMCkgJiAweGZmOwogICAgZmlsZVsxXSA9IHNmbnQuY2hhckNvZGVBdCgxKSAmIDB4ZmY7CiAgICBmaWxlWzJdID0gc2ZudC5jaGFyQ29kZUF0KDIpICYgMHhmZjsKICAgIGZpbGVbM10gPSBzZm50LmNoYXJDb2RlQXQoMykgJiAweGZmOwogICAgd3JpdGVJbnQxNihmaWxlLCA0LCBudW1UYWJsZXMpOwogICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gT3BlblR5cGVGaWxlQnVpbGRlci5nZXRTZWFyY2hQYXJhbXMobnVtVGFibGVzLCAxNik7CiAgICB3cml0ZUludDE2KGZpbGUsIDYsIHNlYXJjaFBhcmFtcy5yYW5nZSk7CiAgICB3cml0ZUludDE2KGZpbGUsIDgsIHNlYXJjaFBhcmFtcy5lbnRyeSk7CiAgICB3cml0ZUludDE2KGZpbGUsIDEwLCBzZWFyY2hQYXJhbXMucmFuZ2VTaGlmdCk7CiAgICBvZmZzZXQgPSBPVEZfSEVBREVSX1NJWkU7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKICAgICAgdGFibGVOYW1lID0gdGFibGVzTmFtZXNbaV07CiAgICAgIGZpbGVbb2Zmc2V0XSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDApICYgMHhmZjsKICAgICAgZmlsZVtvZmZzZXQgKyAxXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDEpICYgMHhmZjsKICAgICAgZmlsZVtvZmZzZXQgKyAyXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDIpICYgMHhmZjsKICAgICAgZmlsZVtvZmZzZXQgKyAzXSA9IHRhYmxlTmFtZS5jaGFyQ29kZUF0KDMpICYgMHhmZjsKICAgICAgbGV0IGNoZWNrc3VtID0gMDsKICAgICAgZm9yIChqID0gdGFibGVPZmZzZXRzW2ldLCBqaiA9IHRhYmxlT2Zmc2V0c1tpICsgMV07IGogPCBqajsgaiArPSA0KSB7CiAgICAgICAgY29uc3QgcXVhZCA9IHJlYWRVaW50MzIoZmlsZSwgaik7CiAgICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSArIHF1YWQgPj4+IDA7CiAgICAgIH0KICAgICAgd3JpdGVJbnQzMihmaWxlLCBvZmZzZXQgKyA0LCBjaGVja3N1bSk7CiAgICAgIHdyaXRlSW50MzIoZmlsZSwgb2Zmc2V0ICsgOCwgdGFibGVPZmZzZXRzW2ldKTsKICAgICAgd3JpdGVJbnQzMihmaWxlLCBvZmZzZXQgKyAxMiwgdGFibGVzW3RhYmxlTmFtZV0ubGVuZ3RoKTsKICAgICAgb2Zmc2V0ICs9IE9URl9UQUJMRV9FTlRSWV9TSVpFOwogICAgfQogICAgcmV0dXJuIGZpbGU7CiAgfQogIGFkZFRhYmxlKHRhZywgZGF0YSkgewogICAgaWYgKHRhZyBpbiB0aGlzLnRhYmxlcykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRhYmxlICIgKyB0YWcgKyAiIGFscmVhZHkgZXhpc3RzIik7CiAgICB9CiAgICB0aGlzLnRhYmxlc1t0YWddID0gZGF0YTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3R5cGUxX3BhcnNlci5qcwoKCgoKY29uc3QgSElOVElOR19FTkFCTEVEID0gZmFsc2U7CmNvbnN0IENPTU1BTkRfTUFQID0gewogIGhzdGVtOiBbMV0sCiAgdnN0ZW06IFszXSwKICB2bW92ZXRvOiBbNF0sCiAgcmxpbmV0bzogWzVdLAogIGhsaW5ldG86IFs2XSwKICB2bGluZXRvOiBbN10sCiAgcnJjdXJ2ZXRvOiBbOF0sCiAgY2FsbHN1YnI6IFsxMF0sCiAgZmxleDogWzEyLCAzNV0sCiAgZHJvcDogWzEyLCAxOF0sCiAgZW5kY2hhcjogWzE0XSwKICBybW92ZXRvOiBbMjFdLAogIGhtb3ZldG86IFsyMl0sCiAgdmhjdXJ2ZXRvOiBbMzBdLAogIGh2Y3VydmV0bzogWzMxXQp9OwpjbGFzcyBUeXBlMUNoYXJTdHJpbmcgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy53aWR0aCA9IDA7CiAgICB0aGlzLmxzYiA9IDA7CiAgICB0aGlzLmZsZXhpbmcgPSBmYWxzZTsKICAgIHRoaXMub3V0cHV0ID0gW107CiAgICB0aGlzLnN0YWNrID0gW107CiAgfQogIGNvbnZlcnQoZW5jb2RlZCwgc3VicnMsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKICAgIGNvbnN0IGNvdW50ID0gZW5jb2RlZC5sZW5ndGg7CiAgICBsZXQgZXJyb3IgPSBmYWxzZTsKICAgIGxldCB3eCwgc2J4LCBzdWJyTnVtYmVyOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGxldCB2YWx1ZSA9IGVuY29kZWRbaV07CiAgICAgIGlmICh2YWx1ZSA8IDMyKSB7CiAgICAgICAgaWYgKHZhbHVlID09PSAxMikgewogICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgKyBlbmNvZGVkWysraV07CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLmhzdGVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CiAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC52c3RlbSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBpZiAodGhpcy5mbGV4aW5nKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMSkgewogICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGR5ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCwgZHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bW92ZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5ybGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC5obGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg2LCBDT01NQU5EX01BUC5ycmN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3Vick51bWJlciA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmICghc3VicnNbc3Vick51bWJlcl0pIHsKICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmNvbnZlcnQoc3VicnNbc3Vick51bWJlcl0sIHN1YnJzLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHd4ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgc2J4ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgdGhpcy5sc2IgPSBzYng7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSB3eDsKICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHd4LCBzYngpOwogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaG1vdmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgdGhpcy5vdXRwdXQucHVzaChDT01NQU5EX01BUC5lbmRjaGFyWzBdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICBpZiAodGhpcy5mbGV4aW5nKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnJtb3ZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDEsIENPTU1BTkRfTUFQLmhtb3ZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC52aGN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC5odmN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMDoKICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMToKICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnZzdGVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDI6CiAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CiAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5oc3RlbSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyA2OgogICAgICAgICAgICBpZiAoc2VhY0FuYWx5c2lzRW5hYmxlZCkgewogICAgICAgICAgICAgIGNvbnN0IGFzYiA9IHRoaXMuc3RhY2suYXQoLTUpOwogICAgICAgICAgICAgIHRoaXMuc2VhYyA9IHRoaXMuc3RhY2suc3BsaWNlKC00LCA0KTsKICAgICAgICAgICAgICB0aGlzLnNlYWNbMF0gKz0gdGhpcy5sc2IgLSBhc2I7CiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDAsIENPTU1BTkRfTUFQLmVuZGNoYXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC5lbmRjaGFyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgNzoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgNCkgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICB3eCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGNvbnN0IHNieSA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHNieCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHRoaXMubHNiID0gc2J4OwogICAgICAgICAgICB0aGlzLndpZHRoID0gd3g7CiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh3eCwgc2J4LCBzYnkpOwogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMywgQ09NTUFORF9NQVAucm1vdmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxMjoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBudW0yID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgY29uc3QgbnVtMSA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChudW0xIC8gbnVtMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxNjoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJyTnVtYmVyID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgY29uc3QgbnVtQXJncyA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmIChzdWJyTnVtYmVyID09PSAwICYmIG51bUFyZ3MgPT09IDMpIHsKICAgICAgICAgICAgICBjb25zdCBmbGV4QXJncyA9IHRoaXMuc3RhY2suc3BsaWNlKC0xNywgMTcpOwogICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChmbGV4QXJnc1syXSArIGZsZXhBcmdzWzBdLCBmbGV4QXJnc1szXSArIGZsZXhBcmdzWzFdLCBmbGV4QXJnc1s0XSwgZmxleEFyZ3NbNV0sIGZsZXhBcmdzWzZdLCBmbGV4QXJnc1s3XSwgZmxleEFyZ3NbOF0sIGZsZXhBcmdzWzldLCBmbGV4QXJnc1sxMF0sIGZsZXhBcmdzWzExXSwgZmxleEFyZ3NbMTJdLCBmbGV4QXJnc1sxM10sIGZsZXhBcmdzWzE0XSk7CiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDEzLCBDT01NQU5EX01BUC5mbGV4LCB0cnVlKTsKICAgICAgICAgICAgICB0aGlzLmZsZXhpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZmxleEFyZ3NbMTVdLCBmbGV4QXJnc1sxNl0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnJOdW1iZXIgPT09IDEgJiYgbnVtQXJncyA9PT0gMCkgewogICAgICAgICAgICAgIHRoaXMuZmxleGluZyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDE3OgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMzM6CiAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3YXJuKCdVbmtub3duIHR5cGUgMSBjaGFyc3RyaW5nIGNvbW1hbmQgb2YgIicgKyB2YWx1ZSArICciJyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAyNDYpIHsKICAgICAgICB2YWx1ZSAtPSAxMzk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMjUwKSB7CiAgICAgICAgdmFsdWUgPSAodmFsdWUgLSAyNDcpICogMjU2ICsgZW5jb2RlZFsrK2ldICsgMTA4OwogICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI1NCkgewogICAgICAgIHZhbHVlID0gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGVuY29kZWRbKytpXSAtIDEwODsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAyNCB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAxNiB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCA4IHwgKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDA7CiAgICAgIH0KICAgICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBlcnJvcjsKICB9CiAgZXhlY3V0ZUNvbW1hbmQoaG93TWFueUFyZ3MsIGNvbW1hbmQsIGtlZXBTdGFjaykgewogICAgY29uc3Qgc3RhY2tMZW5ndGggPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgIGlmIChob3dNYW55QXJncyA+IHN0YWNrTGVuZ3RoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY29uc3Qgc3RhcnQgPSBzdGFja0xlbmd0aCAtIGhvd01hbnlBcmdzOwogICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhY2tMZW5ndGg7IGkrKykgewogICAgICBsZXQgdmFsdWUgPSB0aGlzLnN0YWNrW2ldOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKICAgICAgICB0aGlzLm91dHB1dC5wdXNoKDI4LCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IDY1NTM2ICogdmFsdWUgfCAwOwogICAgICAgIHRoaXMub3V0cHV0LnB1c2goMjU1LCB2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CiAgICAgIH0KICAgIH0KICAgIHRoaXMub3V0cHV0LnB1c2goLi4uY29tbWFuZCk7CiAgICBpZiAoa2VlcFN0YWNrKSB7CiAgICAgIHRoaXMuc3RhY2suc3BsaWNlKHN0YXJ0LCBob3dNYW55QXJncyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmNvbnN0IEVFWEVDX0VOQ1JZUFRfS0VZID0gNTU2NjU7CmNvbnN0IENIQVJfU1RSU19FTkNSWVBUX0tFWSA9IDQzMzA7CmZ1bmN0aW9uIGlzSGV4RGlnaXQoY29kZSkgewogIHJldHVybiBjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcgfHwgY29kZSA+PSA2NSAmJiBjb2RlIDw9IDcwIHx8IGNvZGUgPj0gOTcgJiYgY29kZSA8PSAxMDI7Cn0KZnVuY3Rpb24gZGVjcnlwdChkYXRhLCBrZXksIGRpc2NhcmROdW1iZXIpIHsKICBpZiAoZGlzY2FyZE51bWJlciA+PSBkYXRhLmxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogIH0KICBjb25zdCBjMSA9IDUyODQ1LAogICAgYzIgPSAyMjcxOTsKICBsZXQgciA9IGtleSB8IDAsCiAgICBpLAogICAgajsKICBmb3IgKGkgPSAwOyBpIDwgZGlzY2FyZE51bWJlcjsgaSsrKSB7CiAgICByID0gKGRhdGFbaV0gKyByKSAqIGMxICsgYzIgJiAoMSA8PCAxNikgLSAxOwogIH0KICBjb25zdCBjb3VudCA9IGRhdGEubGVuZ3RoIC0gZGlzY2FyZE51bWJlcjsKICBjb25zdCBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShjb3VudCk7CiAgZm9yIChpID0gZGlzY2FyZE51bWJlciwgaiA9IDA7IGogPCBjb3VudDsgaSsrLCBqKyspIHsKICAgIGNvbnN0IHZhbHVlID0gZGF0YVtpXTsKICAgIGRlY3J5cHRlZFtqXSA9IHZhbHVlIF4gciA+PiA4OwogICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CiAgfQogIHJldHVybiBkZWNyeXB0ZWQ7Cn0KZnVuY3Rpb24gZGVjcnlwdEFzY2lpKGRhdGEsIGtleSwgZGlzY2FyZE51bWJlcikgewogIGNvbnN0IGMxID0gNTI4NDUsCiAgICBjMiA9IDIyNzE5OwogIGxldCByID0ga2V5IHwgMDsKICBjb25zdCBjb3VudCA9IGRhdGEubGVuZ3RoLAogICAgbWF5YmVMZW5ndGggPSBjb3VudCA+Pj4gMTsKICBjb25zdCBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShtYXliZUxlbmd0aCk7CiAgbGV0IGksIGo7CiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICBjb25zdCBkaWdpdDEgPSBkYXRhW2ldOwogICAgaWYgKCFpc0hleERpZ2l0KGRpZ2l0MSkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpKys7CiAgICBsZXQgZGlnaXQyOwogICAgd2hpbGUgKGkgPCBjb3VudCAmJiAhaXNIZXhEaWdpdChkaWdpdDIgPSBkYXRhW2ldKSkgewogICAgICBpKys7CiAgICB9CiAgICBpZiAoaSA8IGNvdW50KSB7CiAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQoU3RyaW5nLmZyb21DaGFyQ29kZShkaWdpdDEsIGRpZ2l0MiksIDE2KTsKICAgICAgZGVjcnlwdGVkW2orK10gPSB2YWx1ZSBeIHIgPj4gODsKICAgICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CiAgICB9CiAgfQogIHJldHVybiBkZWNyeXB0ZWQuc2xpY2UoZGlzY2FyZE51bWJlciwgaik7Cn0KZnVuY3Rpb24gaXNTcGVjaWFsKGMpIHsKICByZXR1cm4gYyA9PT0gMHgyZiB8fCBjID09PSAweDViIHx8IGMgPT09IDB4NWQgfHwgYyA9PT0gMHg3YiB8fCBjID09PSAweDdkIHx8IGMgPT09IDB4MjggfHwgYyA9PT0gMHgyOTsKfQpjbGFzcyBUeXBlMVBhcnNlciB7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBlbmNyeXB0ZWQsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKICAgIGlmIChlbmNyeXB0ZWQpIHsKICAgICAgY29uc3QgZGF0YSA9IHN0cmVhbS5nZXRCeXRlcygpOwogICAgICBjb25zdCBpc0JpbmFyeSA9ICEoKGlzSGV4RGlnaXQoZGF0YVswXSkgfHwgaXNXaGl0ZVNwYWNlKGRhdGFbMF0pKSAmJiBpc0hleERpZ2l0KGRhdGFbMV0pICYmIGlzSGV4RGlnaXQoZGF0YVsyXSkgJiYgaXNIZXhEaWdpdChkYXRhWzNdKSAmJiBpc0hleERpZ2l0KGRhdGFbNF0pICYmIGlzSGV4RGlnaXQoZGF0YVs1XSkgJiYgaXNIZXhEaWdpdChkYXRhWzZdKSAmJiBpc0hleERpZ2l0KGRhdGFbN10pKTsKICAgICAgc3RyZWFtID0gbmV3IFN0cmVhbShpc0JpbmFyeSA/IGRlY3J5cHQoZGF0YSwgRUVYRUNfRU5DUllQVF9LRVksIDQpIDogZGVjcnlwdEFzY2lpKGRhdGEsIEVFWEVDX0VOQ1JZUFRfS0VZLCA0KSk7CiAgICB9CiAgICB0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQgPSAhIXNlYWNBbmFseXNpc0VuYWJsZWQ7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMubmV4dENoYXIoKTsKICB9CiAgcmVhZE51bWJlckFycmF5KCkgewogICAgdGhpcy5nZXRUb2tlbigpOwogICAgY29uc3QgYXJyYXkgPSBbXTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICBpZiAodG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09ICJdIiB8fCB0b2tlbiA9PT0gIn0iKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgYXJyYXkucHVzaChwYXJzZUZsb2F0KHRva2VuIHx8IDApKTsKICAgIH0KICAgIHJldHVybiBhcnJheTsKICB9CiAgcmVhZE51bWJlcigpIHsKICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgcmV0dXJuIHBhcnNlRmxvYXQodG9rZW4gfHwgMCk7CiAgfQogIHJlYWRJbnQoKSB7CiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgIHJldHVybiBwYXJzZUludCh0b2tlbiB8fCAwLCAxMCkgfCAwOwogIH0KICByZWFkQm9vbGVhbigpIHsKICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgcmV0dXJuIHRva2VuID09PSAidHJ1ZSIgPyAxIDogMDsKICB9CiAgbmV4dENoYXIoKSB7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50Q2hhciA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKICB9CiAgcHJldkNoYXIoKSB7CiAgICB0aGlzLnN0cmVhbS5za2lwKC0yKTsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogIH0KICBnZXRUb2tlbigpIHsKICAgIGxldCBjb21tZW50ID0gZmFsc2U7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKGNoID09PSAtMSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChjb21tZW50KSB7CiAgICAgICAgaWYgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKSB7CiAgICAgICAgICBjb21tZW50ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDI1KSB7CiAgICAgICAgY29tbWVudCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoIWlzV2hpdGVTcGFjZShjaCkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIGlmIChpc1NwZWNpYWwoY2gpKSB7CiAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgfQogICAgbGV0IHRva2VuID0gIiI7CiAgICBkbyB7CiAgICAgIHRva2VuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0gd2hpbGUgKGNoID49IDAgJiYgIWlzV2hpdGVTcGFjZShjaCkgJiYgIWlzU3BlY2lhbChjaCkpOwogICAgcmV0dXJuIHRva2VuOwogIH0KICByZWFkQ2hhclN0cmluZ3MoYnl0ZXMsIGxlbklWKSB7CiAgICBpZiAobGVuSVYgPT09IC0xKSB7CiAgICAgIHJldHVybiBieXRlczsKICAgIH0KICAgIHJldHVybiBkZWNyeXB0KGJ5dGVzLCBDSEFSX1NUUlNfRU5DUllQVF9LRVksIGxlbklWKTsKICB9CiAgZXh0cmFjdEZvbnRQcm9ncmFtKHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOwogICAgY29uc3Qgc3VicnMgPSBbXSwKICAgICAgY2hhcnN0cmluZ3MgPSBbXTsKICAgIGNvbnN0IHByaXZhdGVEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHByaXZhdGVEYXRhLmxlbklWID0gNDsKICAgIGNvbnN0IHByb2dyYW0gPSB7CiAgICAgIHN1YnJzOiBbXSwKICAgICAgY2hhcnN0cmluZ3M6IFtdLAogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgcHJpdmF0ZURhdGEKICAgICAgfQogICAgfTsKICAgIGxldCB0b2tlbiwgbGVuZ3RoLCBkYXRhLCBsZW5JVjsKICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmdldFRva2VuKCkpICE9PSBudWxsKSB7CiAgICAgIGlmICh0b2tlbiAhPT0gIi8iKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICBjYXNlICJDaGFyU3RyaW5ncyI6CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsIHx8IHRva2VuID09PSAiZW5kIikgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0b2tlbiAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZ2x5cGggPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMucmVhZEludCgpOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGRhdGEgPSBsZW5ndGggPiAwID8gc3RyZWFtLmdldEJ5dGVzKGxlbmd0aCkgOiBuZXcgVWludDhBcnJheSgwKTsKICAgICAgICAgICAgbGVuSVYgPSBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSB0aGlzLnJlYWRDaGFyU3RyaW5ncyhkYXRhLCBsZW5JVik7CiAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gIm5vYWNjZXNzIikgewogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gIi8iKSB7CiAgICAgICAgICAgICAgdGhpcy5wcmV2Q2hhcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNoYXJzdHJpbmdzLnB1c2goewogICAgICAgICAgICAgIGdseXBoLAogICAgICAgICAgICAgIGVuY29kZWQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJTdWJycyI6CiAgICAgICAgICB0aGlzLnJlYWRJbnQoKTsKICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgIHdoaWxlICh0aGlzLmdldFRva2VuKCkgPT09ICJkdXAiKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWFkSW50KCk7CiAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMucmVhZEludCgpOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGRhdGEgPSBsZW5ndGggPiAwID8gc3RyZWFtLmdldEJ5dGVzKGxlbmd0aCkgOiBuZXcgVWludDhBcnJheSgwKTsKICAgICAgICAgICAgbGVuSVYgPSBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSB0aGlzLnJlYWRDaGFyU3RyaW5ncyhkYXRhLCBsZW5JVik7CiAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gIm5vYWNjZXNzIikgewogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJyc1tpbmRleF0gPSBlbmNvZGVkOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQmx1ZVZhbHVlcyI6CiAgICAgICAgY2FzZSAiT3RoZXJCbHVlcyI6CiAgICAgICAgY2FzZSAiRmFtaWx5Qmx1ZXMiOgogICAgICAgIGNhc2UgIkZhbWlseU90aGVyQmx1ZXMiOgogICAgICAgICAgY29uc3QgYmx1ZUFycmF5ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIGlmIChibHVlQXJyYXkubGVuZ3RoID4gMCAmJiBibHVlQXJyYXkubGVuZ3RoICUgMiA9PT0gMCAmJiBISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IGJsdWVBcnJheTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlN0ZW1TbmFwSCI6CiAgICAgICAgY2FzZSAiU3RlbVNuYXBWIjoKICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiU3RkSFciOgogICAgICAgIGNhc2UgIlN0ZFZXIjoKICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpWzBdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQmx1ZVNoaWZ0IjoKICAgICAgICBjYXNlICJsZW5JViI6CiAgICAgICAgY2FzZSAiQmx1ZUZ1enoiOgogICAgICAgIGNhc2UgIkJsdWVTY2FsZSI6CiAgICAgICAgY2FzZSAiTGFuZ3VhZ2VHcm91cCI6CiAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gdGhpcy5yZWFkTnVtYmVyKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJFeHBhbnNpb25GYWN0b3IiOgogICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZE51bWJlcigpIHx8IDAuMDY7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJGb3JjZUJvbGQiOgogICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZEJvb2xlYW4oKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHsKICAgICAgZW5jb2RlZCwKICAgICAgZ2x5cGgKICAgIH0gb2YgY2hhcnN0cmluZ3MpIHsKICAgICAgY29uc3QgY2hhclN0cmluZyA9IG5ldyBUeXBlMUNoYXJTdHJpbmcoKTsKICAgICAgY29uc3QgZXJyb3IgPSBjaGFyU3RyaW5nLmNvbnZlcnQoZW5jb2RlZCwgc3VicnMsIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCk7CiAgICAgIGxldCBvdXRwdXQgPSBjaGFyU3RyaW5nLm91dHB1dDsKICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgb3V0cHV0ID0gWzE0XTsKICAgICAgfQogICAgICBjb25zdCBjaGFyU3RyaW5nT2JqZWN0ID0gewogICAgICAgIGdseXBoTmFtZTogZ2x5cGgsCiAgICAgICAgY2hhcnN0cmluZzogb3V0cHV0LAogICAgICAgIHdpZHRoOiBjaGFyU3RyaW5nLndpZHRoLAogICAgICAgIGxzYjogY2hhclN0cmluZy5sc2IsCiAgICAgICAgc2VhYzogY2hhclN0cmluZy5zZWFjCiAgICAgIH07CiAgICAgIGlmIChnbHlwaCA9PT0gIi5ub3RkZWYiKSB7CiAgICAgICAgcHJvZ3JhbS5jaGFyc3RyaW5ncy51bnNoaWZ0KGNoYXJTdHJpbmdPYmplY3QpOwogICAgICB9IGVsc2UgewogICAgICAgIHByb2dyYW0uY2hhcnN0cmluZ3MucHVzaChjaGFyU3RyaW5nT2JqZWN0KTsKICAgICAgfQogICAgICBpZiAocHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpIHsKICAgICAgICBjb25zdCBpbmRleCA9IHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nLmluZGV4T2YoZ2x5cGgpOwogICAgICAgIGlmIChpbmRleCA+IC0xICYmIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9PT0gdW5kZWZpbmVkICYmIGluZGV4ID49IHByb3BlcnRpZXMuZmlyc3RDaGFyICYmIGluZGV4IDw9IHByb3BlcnRpZXMubGFzdENoYXIpIHsKICAgICAgICAgIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9IGNoYXJTdHJpbmcud2lkdGg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcHJvZ3JhbTsKICB9CiAgZXh0cmFjdEZvbnRIZWFkZXIocHJvcGVydGllcykgewogICAgbGV0IHRva2VuOwogICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKSkgIT09IG51bGwpIHsKICAgICAgaWYgKHRva2VuICE9PSAiLyIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgIGNhc2UgIkZvbnRNYXRyaXgiOgogICAgICAgICAgY29uc3QgbWF0cml4ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIHByb3BlcnRpZXMuZm9udE1hdHJpeCA9IG1hdHJpeDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVuY29kaW5nIjoKICAgICAgICAgIGNvbnN0IGVuY29kaW5nQXJnID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgbGV0IGVuY29kaW5nOwogICAgICAgICAgaWYgKCEvXlxkKyQvLnRlc3QoZW5jb2RpbmdBcmcpKSB7CiAgICAgICAgICAgIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcoZW5jb2RpbmdBcmcpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBbXTsKICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHBhcnNlSW50KGVuY29kaW5nQXJnLCAxMCkgfCAwOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CiAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgICAgd2hpbGUgKHRva2VuICE9PSAiZHVwIiAmJiB0b2tlbiAhPT0gImRlZiIpIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHRva2VuID09PSAiZGVmIikgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWFkSW50KCk7CiAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgIGNvbnN0IGdseXBoID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgIGVuY29kaW5nW2luZGV4XSA9IGdseXBoOwogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcgPSBlbmNvZGluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkZvbnRCQm94IjoKICAgICAgICAgIGNvbnN0IGZvbnRCQm94ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIHByb3BlcnRpZXMuYXNjZW50ID0gTWF0aC5tYXgoZm9udEJCb3hbM10sIGZvbnRCQm94WzFdKTsKICAgICAgICAgIHByb3BlcnRpZXMuZGVzY2VudCA9IE1hdGgubWluKGZvbnRCQm94WzFdLCBmb250QkJveFszXSk7CiAgICAgICAgICBwcm9wZXJ0aWVzLmFzY2VudFNjYWxlZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvdHlwZTFfZm9udC5qcwoKCgoKCgpmdW5jdGlvbiBmaW5kQmxvY2soc3RyZWFtQnl0ZXMsIHNpZ25hdHVyZSwgc3RhcnRJbmRleCkgewogIGNvbnN0IHN0cmVhbUJ5dGVzTGVuZ3RoID0gc3RyZWFtQnl0ZXMubGVuZ3RoOwogIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CiAgY29uc3Qgc2Nhbkxlbmd0aCA9IHN0cmVhbUJ5dGVzTGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoOwogIGxldCBpID0gc3RhcnRJbmRleCwKICAgIGZvdW5kID0gZmFsc2U7CiAgd2hpbGUgKGkgPCBzY2FuTGVuZ3RoKSB7CiAgICBsZXQgaiA9IDA7CiAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzdHJlYW1CeXRlc1tpICsgal0gPT09IHNpZ25hdHVyZVtqXSkgewogICAgICBqKys7CiAgICB9CiAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKICAgICAgaSArPSBqOwogICAgICB3aGlsZSAoaSA8IHN0cmVhbUJ5dGVzTGVuZ3RoICYmIGlzV2hpdGVTcGFjZShzdHJlYW1CeXRlc1tpXSkpIHsKICAgICAgICBpKys7CiAgICAgIH0KICAgICAgZm91bmQgPSB0cnVlOwogICAgICBicmVhazsKICAgIH0KICAgIGkrKzsKICB9CiAgcmV0dXJuIHsKICAgIGZvdW5kLAogICAgbGVuZ3RoOiBpCiAgfTsKfQpmdW5jdGlvbiBnZXRIZWFkZXJCbG9jayhzdHJlYW0sIHN1Z2dlc3RlZExlbmd0aCkgewogIGNvbnN0IEVFWEVDX1NJR05BVFVSRSA9IFsweDY1LCAweDY1LCAweDc4LCAweDY1LCAweDYzXTsKICBjb25zdCBzdHJlYW1TdGFydFBvcyA9IHN0cmVhbS5wb3M7CiAgbGV0IGhlYWRlckJ5dGVzLCBoZWFkZXJCeXRlc0xlbmd0aCwgYmxvY2s7CiAgdHJ5IHsKICAgIGhlYWRlckJ5dGVzID0gc3RyZWFtLmdldEJ5dGVzKHN1Z2dlc3RlZExlbmd0aCk7CiAgICBoZWFkZXJCeXRlc0xlbmd0aCA9IGhlYWRlckJ5dGVzLmxlbmd0aDsKICB9IGNhdGNoIHt9CiAgaWYgKGhlYWRlckJ5dGVzTGVuZ3RoID09PSBzdWdnZXN0ZWRMZW5ndGgpIHsKICAgIGJsb2NrID0gZmluZEJsb2NrKGhlYWRlckJ5dGVzLCBFRVhFQ19TSUdOQVRVUkUsIHN1Z2dlc3RlZExlbmd0aCAtIDIgKiBFRVhFQ19TSUdOQVRVUkUubGVuZ3RoKTsKICAgIGlmIChibG9jay5mb3VuZCAmJiBibG9jay5sZW5ndGggPT09IHN1Z2dlc3RlZExlbmd0aCkgewogICAgICByZXR1cm4gewogICAgICAgIHN0cmVhbTogbmV3IFN0cmVhbShoZWFkZXJCeXRlcyksCiAgICAgICAgbGVuZ3RoOiBzdWdnZXN0ZWRMZW5ndGgKICAgICAgfTsKICAgIH0KICB9CiAgd2FybignSW52YWxpZCAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICBzdHJlYW0ucG9zID0gc3RyZWFtU3RhcnRQb3M7CiAgY29uc3QgU0NBTl9CTE9DS19MRU5HVEggPSAyMDQ4OwogIGxldCBhY3R1YWxMZW5ndGg7CiAgd2hpbGUgKHRydWUpIHsKICAgIGNvbnN0IHNjYW5CeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMoU0NBTl9CTE9DS19MRU5HVEgpOwogICAgYmxvY2sgPSBmaW5kQmxvY2soc2NhbkJ5dGVzLCBFRVhFQ19TSUdOQVRVUkUsIDApOwogICAgaWYgKGJsb2NrLmxlbmd0aCA9PT0gMCkgewogICAgICBicmVhazsKICAgIH0KICAgIHN0cmVhbS5wb3MgKz0gYmxvY2subGVuZ3RoOwogICAgaWYgKGJsb2NrLmZvdW5kKSB7CiAgICAgIGFjdHVhbExlbmd0aCA9IHN0cmVhbS5wb3MgLSBzdHJlYW1TdGFydFBvczsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHN0cmVhbS5wb3MgPSBzdHJlYW1TdGFydFBvczsKICBpZiAoYWN0dWFsTGVuZ3RoKSB7CiAgICByZXR1cm4gewogICAgICBzdHJlYW06IG5ldyBTdHJlYW0oc3RyZWFtLmdldEJ5dGVzKGFjdHVhbExlbmd0aCkpLAogICAgICBsZW5ndGg6IGFjdHVhbExlbmd0aAogICAgfTsKICB9CiAgd2FybignVW5hYmxlIHRvIHJlY292ZXIgIkxlbmd0aDEiIHByb3BlcnR5IGluIFR5cGUxIGZvbnQgLS0gdXNpbmcgYXMgaXMuJyk7CiAgcmV0dXJuIHsKICAgIHN0cmVhbTogbmV3IFN0cmVhbShzdHJlYW0uZ2V0Qnl0ZXMoc3VnZ2VzdGVkTGVuZ3RoKSksCiAgICBsZW5ndGg6IHN1Z2dlc3RlZExlbmd0aAogIH07Cn0KZnVuY3Rpb24gZ2V0RWV4ZWNCbG9jayhzdHJlYW0sIHN1Z2dlc3RlZExlbmd0aCkgewogIGNvbnN0IGVleGVjQnl0ZXMgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKICBpZiAoZWV4ZWNCeXRlcy5sZW5ndGggPT09IDApIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiZ2V0RWV4ZWNCbG9jayAtIG5vIGZvbnQgcHJvZ3JhbSBmb3VuZC4iKTsKICB9CiAgcmV0dXJuIHsKICAgIHN0cmVhbTogbmV3IFN0cmVhbShlZXhlY0J5dGVzKSwKICAgIGxlbmd0aDogZWV4ZWNCeXRlcy5sZW5ndGgKICB9Owp9CmNsYXNzIFR5cGUxRm9udCB7CiAgY29uc3RydWN0b3IobmFtZSwgZmlsZSwgcHJvcGVydGllcykgewogICAgY29uc3QgUEZCX0hFQURFUl9TSVpFID0gNjsKICAgIGxldCBoZWFkZXJCbG9ja0xlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoMTsKICAgIGxldCBlZXhlY0Jsb2NrTGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGgyOwogICAgbGV0IHBmYkhlYWRlciA9IGZpbGUucGVla0J5dGVzKFBGQl9IRUFERVJfU0laRSk7CiAgICBjb25zdCBwZmJIZWFkZXJQcmVzZW50ID0gcGZiSGVhZGVyWzBdID09PSAweDgwICYmIHBmYkhlYWRlclsxXSA9PT0gMHgwMTsKICAgIGlmIChwZmJIZWFkZXJQcmVzZW50KSB7CiAgICAgIGZpbGUuc2tpcChQRkJfSEVBREVSX1NJWkUpOwogICAgICBoZWFkZXJCbG9ja0xlbmd0aCA9IHBmYkhlYWRlcls1XSA8PCAyNCB8IHBmYkhlYWRlcls0XSA8PCAxNiB8IHBmYkhlYWRlclszXSA8PCA4IHwgcGZiSGVhZGVyWzJdOwogICAgfQogICAgY29uc3QgaGVhZGVyQmxvY2sgPSBnZXRIZWFkZXJCbG9jayhmaWxlLCBoZWFkZXJCbG9ja0xlbmd0aCk7CiAgICBjb25zdCBoZWFkZXJCbG9ja1BhcnNlciA9IG5ldyBUeXBlMVBhcnNlcihoZWFkZXJCbG9jay5zdHJlYW0sIGZhbHNlLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOwogICAgaGVhZGVyQmxvY2tQYXJzZXIuZXh0cmFjdEZvbnRIZWFkZXIocHJvcGVydGllcyk7CiAgICBpZiAocGZiSGVhZGVyUHJlc2VudCkgewogICAgICBwZmJIZWFkZXIgPSBmaWxlLmdldEJ5dGVzKFBGQl9IRUFERVJfU0laRSk7CiAgICAgIGVleGVjQmxvY2tMZW5ndGggPSBwZmJIZWFkZXJbNV0gPDwgMjQgfCBwZmJIZWFkZXJbNF0gPDwgMTYgfCBwZmJIZWFkZXJbM10gPDwgOCB8IHBmYkhlYWRlclsyXTsKICAgIH0KICAgIGNvbnN0IGVleGVjQmxvY2sgPSBnZXRFZXhlY0Jsb2NrKGZpbGUsIGVleGVjQmxvY2tMZW5ndGgpOwogICAgY29uc3QgZWV4ZWNCbG9ja1BhcnNlciA9IG5ldyBUeXBlMVBhcnNlcihlZXhlY0Jsb2NrLnN0cmVhbSwgdHJ1ZSwgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgIGNvbnN0IGRhdGEgPSBlZXhlY0Jsb2NrUGFyc2VyLmV4dHJhY3RGb250UHJvZ3JhbShwcm9wZXJ0aWVzKTsKICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEucHJvcGVydGllcykgewogICAgICBwcm9wZXJ0aWVzW2tleV0gPSBkYXRhLnByb3BlcnRpZXNba2V5XTsKICAgIH0KICAgIGNvbnN0IGNoYXJzdHJpbmdzID0gZGF0YS5jaGFyc3RyaW5nczsKICAgIGNvbnN0IHR5cGUyQ2hhcnN0cmluZ3MgPSB0aGlzLmdldFR5cGUyQ2hhcnN0cmluZ3MoY2hhcnN0cmluZ3MpOwogICAgY29uc3Qgc3VicnMgPSB0aGlzLmdldFR5cGUyU3VicnMoZGF0YS5zdWJycyk7CiAgICB0aGlzLmNoYXJzdHJpbmdzID0gY2hhcnN0cmluZ3M7CiAgICB0aGlzLmRhdGEgPSB0aGlzLndyYXAobmFtZSwgdHlwZTJDaGFyc3RyaW5ncywgdGhpcy5jaGFyc3RyaW5ncywgc3VicnMsIHByb3BlcnRpZXMpOwogICAgdGhpcy5zZWFjcyA9IHRoaXMuZ2V0U2VhY3MoZGF0YS5jaGFyc3RyaW5ncyk7CiAgfQogIGdldCBudW1HbHlwaHMoKSB7CiAgICByZXR1cm4gdGhpcy5jaGFyc3RyaW5ncy5sZW5ndGggKyAxOwogIH0KICBnZXRDaGFyc2V0KCkgewogICAgY29uc3QgY2hhcnNldCA9IFsiLm5vdGRlZiJdOwogICAgZm9yIChjb25zdCB7CiAgICAgIGdseXBoTmFtZQogICAgfSBvZiB0aGlzLmNoYXJzdHJpbmdzKSB7CiAgICAgIGNoYXJzZXQucHVzaChnbHlwaE5hbWUpOwogICAgfQogICAgcmV0dXJuIGNoYXJzZXQ7CiAgfQogIGdldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKSB7CiAgICBjb25zdCBjaGFyc3RyaW5ncyA9IHRoaXMuY2hhcnN0cmluZ3M7CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBmb3IgKGxldCBnbHlwaElkID0gMCwgY2hhcnN0cmluZ3NMZW4gPSBjaGFyc3RyaW5ncy5sZW5ndGg7IGdseXBoSWQgPCBjaGFyc3RyaW5nc0xlbjsgZ2x5cGhJZCsrKSB7CiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBwcm9wZXJ0aWVzLmNNYXAuY2hhckNvZGVPZihnbHlwaElkKTsKICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkICsgMTsKICAgICAgfQogICAgICByZXR1cm4gY2hhckNvZGVUb0dseXBoSWQ7CiAgICB9CiAgICBjb25zdCBnbHlwaE5hbWVzID0gWyIubm90ZGVmIl07CiAgICBsZXQgYnVpbHRJbkVuY29kaW5nLCBnbHlwaElkOwogICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzdHJpbmdzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7CiAgICAgIGdseXBoTmFtZXMucHVzaChjaGFyc3RyaW5nc1tnbHlwaElkXS5nbHlwaE5hbWUpOwogICAgfQogICAgY29uc3QgZW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZzsKICAgIGlmIChlbmNvZGluZykgewogICAgICBidWlsdEluRW5jb2RpbmcgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIGVuY29kaW5nKSB7CiAgICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihlbmNvZGluZ1tjaGFyQ29kZV0pOwogICAgICAgIGlmIChnbHlwaElkID49IDApIHsKICAgICAgICAgIGJ1aWx0SW5FbmNvZGluZ1tjaGFyQ29kZV0gPSBnbHlwaElkOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHR5cGUxRm9udEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcsIGdseXBoTmFtZXMpOwogIH0KICBoYXNHbHlwaElkKGlkKSB7CiAgICBpZiAoaWQgPCAwIHx8IGlkID49IHRoaXMubnVtR2x5cGhzKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChpZCA9PT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGNvbnN0IGdseXBoID0gdGhpcy5jaGFyc3RyaW5nc1tpZCAtIDFdOwogICAgcmV0dXJuIGdseXBoLmNoYXJzdHJpbmcubGVuZ3RoID4gMDsKICB9CiAgZ2V0U2VhY3MoY2hhcnN0cmluZ3MpIHsKICAgIGNvbnN0IHNlYWNNYXAgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNoYXJzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgY2hhcnN0cmluZyA9IGNoYXJzdHJpbmdzW2ldOwogICAgICBpZiAoY2hhcnN0cmluZy5zZWFjKSB7CiAgICAgICAgc2VhY01hcFtpICsgMV0gPSBjaGFyc3RyaW5nLnNlYWM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzZWFjTWFwOwogIH0KICBnZXRUeXBlMkNoYXJzdHJpbmdzKHR5cGUxQ2hhcnN0cmluZ3MpIHsKICAgIGNvbnN0IHR5cGUyQ2hhcnN0cmluZ3MgPSBbXTsKICAgIGZvciAoY29uc3QgdHlwZTFDaGFyc3RyaW5nIG9mIHR5cGUxQ2hhcnN0cmluZ3MpIHsKICAgICAgdHlwZTJDaGFyc3RyaW5ncy5wdXNoKHR5cGUxQ2hhcnN0cmluZy5jaGFyc3RyaW5nKTsKICAgIH0KICAgIHJldHVybiB0eXBlMkNoYXJzdHJpbmdzOwogIH0KICBnZXRUeXBlMlN1YnJzKHR5cGUxU3VicnMpIHsKICAgIGxldCBiaWFzID0gMDsKICAgIGNvbnN0IGNvdW50ID0gdHlwZTFTdWJycy5sZW5ndGg7CiAgICBpZiAoY291bnQgPCAxMTMzKSB7CiAgICAgIGJpYXMgPSAxMDc7CiAgICB9IGVsc2UgaWYgKGNvdW50IDwgMzM3NjkpIHsKICAgICAgYmlhcyA9IDExMzE7CiAgICB9IGVsc2UgewogICAgICBiaWFzID0gMzI3Njg7CiAgICB9CiAgICBjb25zdCB0eXBlMlN1YnJzID0gW107CiAgICBsZXQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBiaWFzOyBpKyspIHsKICAgICAgdHlwZTJTdWJycy5wdXNoKFsweDBiXSk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICB0eXBlMlN1YnJzLnB1c2godHlwZTFTdWJyc1tpXSk7CiAgICB9CiAgICByZXR1cm4gdHlwZTJTdWJyczsKICB9CiAgd3JhcChuYW1lLCBnbHlwaHMsIGNoYXJzdHJpbmdzLCBzdWJycywgcHJvcGVydGllcykgewogICAgY29uc3QgY2ZmID0gbmV3IENGRigpOwogICAgY2ZmLmhlYWRlciA9IG5ldyBDRkZIZWFkZXIoMSwgMCwgNCwgNCk7CiAgICBjZmYubmFtZXMgPSBbbmFtZV07CiAgICBjb25zdCB0b3BEaWN0ID0gbmV3IENGRlRvcERpY3QoKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJ2ZXJzaW9uIiwgMzkxKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJOb3RpY2UiLCAzOTIpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIkZ1bGxOYW1lIiwgMzkzKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJGYW1pbHlOYW1lIiwgMzk0KTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJXZWlnaHQiLCAzOTUpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIkVuY29kaW5nIiwgbnVsbCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsIHByb3BlcnRpZXMuZm9udE1hdHJpeCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRm9udEJCb3giLCBwcm9wZXJ0aWVzLmJib3gpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLCBudWxsKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJDaGFyU3RyaW5ncyIsIG51bGwpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIlByaXZhdGUiLCBudWxsKTsKICAgIGNmZi50b3BEaWN0ID0gdG9wRGljdDsKICAgIGNvbnN0IHN0cmluZ3MgPSBuZXcgQ0ZGU3RyaW5ncygpOwogICAgc3RyaW5ncy5hZGQoIlZlcnNpb24gMC4xMSIpOwogICAgc3RyaW5ncy5hZGQoIlNlZSBvcmlnaW5hbCBub3RpY2UiKTsKICAgIHN0cmluZ3MuYWRkKG5hbWUpOwogICAgc3RyaW5ncy5hZGQobmFtZSk7CiAgICBzdHJpbmdzLmFkZCgiTWVkaXVtIik7CiAgICBjZmYuc3RyaW5ncyA9IHN0cmluZ3M7CiAgICBjZmYuZ2xvYmFsU3VickluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBjb25zdCBjb3VudCA9IGdseXBocy5sZW5ndGg7CiAgICBjb25zdCBjaGFyc2V0QXJyYXkgPSBbIi5ub3RkZWYiXTsKICAgIGxldCBpLCBpaTsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGNoYXJzdHJpbmdzW2ldLmdseXBoTmFtZTsKICAgICAgY29uc3QgaW5kZXggPSBDRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihnbHlwaE5hbWUpOwogICAgICBpZiAoaW5kZXggPT09IC0xKSB7CiAgICAgICAgc3RyaW5ncy5hZGQoZ2x5cGhOYW1lKTsKICAgICAgfQogICAgICBjaGFyc2V0QXJyYXkucHVzaChnbHlwaE5hbWUpOwogICAgfQogICAgY2ZmLmNoYXJzZXQgPSBuZXcgQ0ZGQ2hhcnNldChmYWxzZSwgMCwgY2hhcnNldEFycmF5KTsKICAgIGNvbnN0IGNoYXJTdHJpbmdzSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKFsweDhiLCAweDBlXSk7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChnbHlwaHNbaV0pOwogICAgfQogICAgY2ZmLmNoYXJTdHJpbmdzID0gY2hhclN0cmluZ3NJbmRleDsKICAgIGNvbnN0IHByaXZhdGVEaWN0ID0gbmV3IENGRlByaXZhdGVEaWN0KCk7CiAgICBwcml2YXRlRGljdC5zZXRCeU5hbWUoIlN1YnJzIiwgbnVsbCk7CiAgICBjb25zdCBmaWVsZHMgPSBbIkJsdWVWYWx1ZXMiLCAiT3RoZXJCbHVlcyIsICJGYW1pbHlCbHVlcyIsICJGYW1pbHlPdGhlckJsdWVzIiwgIlN0ZW1TbmFwSCIsICJTdGVtU25hcFYiLCAiQmx1ZVNoaWZ0IiwgIkJsdWVGdXp6IiwgIkJsdWVTY2FsZSIsICJMYW5ndWFnZUdyb3VwIiwgIkV4cGFuc2lvbkZhY3RvciIsICJGb3JjZUJvbGQiLCAiU3RkSFciLCAiU3RkVlciXTsKICAgIGZvciAoaSA9IDAsIGlpID0gZmllbGRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHNbaV07CiAgICAgIGlmICghKGZpZWxkIGluIHByb3BlcnRpZXMucHJpdmF0ZURhdGEpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdmFsdWUgPSBwcm9wZXJ0aWVzLnByaXZhdGVEYXRhW2ZpZWxkXTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgZm9yIChsZXQgaiA9IHZhbHVlLmxlbmd0aCAtIDE7IGogPiAwOyBqLS0pIHsKICAgICAgICAgIHZhbHVlW2pdIC09IHZhbHVlW2ogLSAxXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHJpdmF0ZURpY3Quc2V0QnlOYW1lKGZpZWxkLCB2YWx1ZSk7CiAgICB9CiAgICBjZmYudG9wRGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0OwogICAgY29uc3Qgc3VickluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBmb3IgKGkgPSAwLCBpaSA9IHN1YnJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgc3VickluZGV4LmFkZChzdWJyc1tpXSk7CiAgICB9CiAgICBwcml2YXRlRGljdC5zdWJyc0luZGV4ID0gc3VickluZGV4OwogICAgY29uc3QgY29tcGlsZXIgPSBuZXcgQ0ZGQ29tcGlsZXIoY2ZmKTsKICAgIHJldHVybiBjb21waWxlci5jb21waWxlKCk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9mb250cy5qcwoKCgoKCgoKCgoKCgoKCgoKCmNvbnN0IFBSSVZBVEVfVVNFX0FSRUFTID0gW1sweGUwMDAsIDB4ZjhmZl0sIFsweDEwMDAwMCwgMHgxMGZmZmRdXTsKY29uc3QgUERGX0dMWVBIX1NQQUNFX1VOSVRTID0gMTAwMDsKY29uc3QgRVhQT1JUX0RBVEFfUFJPUEVSVElFUyA9IFsiYXNjZW50IiwgImJib3giLCAiYmxhY2siLCAiYm9sZCIsICJjaGFyUHJvY09wZXJhdG9yTGlzdCIsICJjc3NGb250SW5mbyIsICJkYXRhIiwgImRlZmF1bHRWTWV0cmljcyIsICJkZWZhdWx0V2lkdGgiLCAiZGVzY2VudCIsICJkaXNhYmxlRm9udEZhY2UiLCAiZmFsbGJhY2tOYW1lIiwgImZvbnRFeHRyYVByb3BlcnRpZXMiLCAiZm9udE1hdHJpeCIsICJpc0ludmFsaWRQREZqc0ZvbnQiLCAiaXNUeXBlM0ZvbnQiLCAiaXRhbGljIiwgImxvYWRlZE5hbWUiLCAibWltZXR5cGUiLCAibWlzc2luZ0ZpbGUiLCAibmFtZSIsICJyZW1lYXN1cmUiLCAic3lzdGVtRm9udEluZm8iLCAidmVydGljYWwiXTsKY29uc3QgRVhQT1JUX0RBVEFfRVhUUkFfUFJPUEVSVElFUyA9IFsiY01hcCIsICJjb21wb3NpdGUiLCAiZGVmYXVsdEVuY29kaW5nIiwgImRpZmZlcmVuY2VzIiwgImlzTW9ub3NwYWNlIiwgImlzU2VyaWZGb250IiwgImlzU3ltYm9saWNGb250IiwgInNlYWNNYXAiLCAic3VidHlwZSIsICJ0b0ZvbnRDaGFyIiwgInRvVW5pY29kZSIsICJ0eXBlIiwgInZtZXRyaWNzIiwgIndpZHRocyJdOwpmdW5jdGlvbiBhZGp1c3RXaWR0aHMocHJvcGVydGllcykgewogIGlmICghcHJvcGVydGllcy5mb250TWF0cml4KSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmZvbnRNYXRyaXhbMF0gPT09IEZPTlRfSURFTlRJVFlfTUFUUklYWzBdKSB7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHNjYWxlID0gMC4wMDEgLyBwcm9wZXJ0aWVzLmZvbnRNYXRyaXhbMF07CiAgY29uc3QgZ2x5cGhzV2lkdGhzID0gcHJvcGVydGllcy53aWR0aHM7CiAgZm9yIChjb25zdCBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHsKICAgIGdseXBoc1dpZHRoc1tnbHlwaF0gKj0gc2NhbGU7CiAgfQogIHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoICo9IHNjYWxlOwp9CmZ1bmN0aW9uIGFkanVzdFRydWVUeXBlVG9Vbmljb2RlKHByb3BlcnRpZXMsIGlzU3ltYm9saWNGb250LCBuYW1lUmVjb3JkcykgewogIGlmIChwcm9wZXJ0aWVzLmlzSW50ZXJuYWxGb250KSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSB7CiAgICByZXR1cm47CiAgfQogIGlmICghaXNTeW1ib2xpY0ZvbnQpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKG5hbWVSZWNvcmRzLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcgPT09IFdpbkFuc2lFbmNvZGluZykgewogICAgcmV0dXJuOwogIH0KICBmb3IgKGNvbnN0IHIgb2YgbmFtZVJlY29yZHMpIHsKICAgIGlmICghaXNXaW5OYW1lUmVjb3JkKHIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICB9CiAgY29uc3QgZW5jb2RpbmcgPSBXaW5BbnNpRW5jb2Rpbmc7CiAgY29uc3QgdG9Vbmljb2RlID0gW10sCiAgICBnbHlwaHNVbmljb2RlTWFwID0gZ2V0R2x5cGhzVW5pY29kZSgpOwogIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZW5jb2RpbmcpIHsKICAgIGNvbnN0IGdseXBoTmFtZSA9IGVuY29kaW5nW2NoYXJDb2RlXTsKICAgIGlmIChnbHlwaE5hbWUgPT09ICIiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgdW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXTsKICAgIGlmICh1bmljb2RlID09PSB1bmRlZmluZWQpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICB0b1VuaWNvZGVbY2hhckNvZGVdID0gU3RyaW5nLmZyb21DaGFyQ29kZSh1bmljb2RlKTsKICB9CiAgaWYgKHRvVW5pY29kZS5sZW5ndGggPiAwKSB7CiAgICBwcm9wZXJ0aWVzLnRvVW5pY29kZS5hbWVuZCh0b1VuaWNvZGUpOwogIH0KfQpmdW5jdGlvbiBhZGp1c3RUeXBlMVRvVW5pY29kZShwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcpIHsKICBpZiAocHJvcGVydGllcy5pc0ludGVybmFsRm9udCkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCkgewogICAgcmV0dXJuOwogIH0KICBpZiAoYnVpbHRJbkVuY29kaW5nID09PSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZykgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCB0b1VuaWNvZGUgPSBbXSwKICAgIGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBidWlsdEluRW5jb2RpbmcpIHsKICAgIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKSB7CiAgICAgIGlmIChwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgfHwgcHJvcGVydGllcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICB9CiAgICBjb25zdCBnbHlwaE5hbWUgPSBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdOwogICAgY29uc3QgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CiAgICAgIHRvVW5pY29kZVtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOwogICAgfQogIH0KICBpZiAodG9Vbmljb2RlLmxlbmd0aCA+IDApIHsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlLmFtZW5kKHRvVW5pY29kZSk7CiAgfQp9CmZ1bmN0aW9uIGFtZW5kRmFsbGJhY2tUb1VuaWNvZGUocHJvcGVydGllcykgewogIGlmICghcHJvcGVydGllcy5mYWxsYmFja1RvVW5pY29kZSkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCB0b1VuaWNvZGUgPSBbXTsKICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGUpIHsKICAgIGlmIChwcm9wZXJ0aWVzLnRvVW5pY29kZS5oYXMoY2hhckNvZGUpKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgdG9Vbmljb2RlW2NoYXJDb2RlXSA9IHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGVbY2hhckNvZGVdOwogIH0KICBpZiAodG9Vbmljb2RlLmxlbmd0aCA+IDApIHsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlLmFtZW5kKHRvVW5pY29kZSk7CiAgfQp9CmNsYXNzIGZvbnRzX0dseXBoIHsKICBjb25zdHJ1Y3RvcihvcmlnaW5hbENoYXJDb2RlLCBmb250Q2hhciwgdW5pY29kZSwgYWNjZW50LCB3aWR0aCwgdm1ldHJpYywgb3BlcmF0b3JMaXN0SWQsIGlzU3BhY2UsIGlzSW5Gb250KSB7CiAgICB0aGlzLm9yaWdpbmFsQ2hhckNvZGUgPSBvcmlnaW5hbENoYXJDb2RlOwogICAgdGhpcy5mb250Q2hhciA9IGZvbnRDaGFyOwogICAgdGhpcy51bmljb2RlID0gdW5pY29kZTsKICAgIHRoaXMuYWNjZW50ID0gYWNjZW50OwogICAgdGhpcy53aWR0aCA9IHdpZHRoOwogICAgdGhpcy52bWV0cmljID0gdm1ldHJpYzsKICAgIHRoaXMub3BlcmF0b3JMaXN0SWQgPSBvcGVyYXRvckxpc3RJZDsKICAgIHRoaXMuaXNTcGFjZSA9IGlzU3BhY2U7CiAgICB0aGlzLmlzSW5Gb250ID0gaXNJbkZvbnQ7CiAgfQogIGdldCBjYXRlZ29yeSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImNhdGVnb3J5IiwgZ2V0Q2hhclVuaWNvZGVDYXRlZ29yeSh0aGlzLnVuaWNvZGUpLCB0cnVlKTsKICB9Cn0KZnVuY3Rpb24gaW50MTYoYjAsIGIxKSB7CiAgcmV0dXJuIChiMCA8PCA4KSArIGIxOwp9CmZ1bmN0aW9uIHdyaXRlU2lnbmVkSW50MTYoYnl0ZXMsIGluZGV4LCB2YWx1ZSkgewogIGJ5dGVzW2luZGV4ICsgMV0gPSB2YWx1ZTsKICBieXRlc1tpbmRleF0gPSB2YWx1ZSA+Pj4gODsKfQpmdW5jdGlvbiBzaWduZWRJbnQxNihiMCwgYjEpIHsKICBjb25zdCB2YWx1ZSA9IChiMCA8PCA4KSArIGIxOwogIHJldHVybiB2YWx1ZSAmIDEgPDwgMTUgPyB2YWx1ZSAtIDB4MTAwMDAgOiB2YWx1ZTsKfQpmdW5jdGlvbiB3cml0ZVVpbnQzMihieXRlcywgaW5kZXgsIHZhbHVlKSB7CiAgYnl0ZXNbaW5kZXggKyAzXSA9IHZhbHVlICYgMHhmZjsKICBieXRlc1tpbmRleCArIDJdID0gdmFsdWUgPj4+IDg7CiAgYnl0ZXNbaW5kZXggKyAxXSA9IHZhbHVlID4+PiAxNjsKICBieXRlc1tpbmRleF0gPSB2YWx1ZSA+Pj4gMjQ7Cn0KZnVuY3Rpb24gaW50MzIoYjAsIGIxLCBiMiwgYjMpIHsKICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMzsKfQpmdW5jdGlvbiBzdHJpbmcxNih2YWx1ZSkgewogIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOwp9CmZ1bmN0aW9uIHNhZmVTdHJpbmcxNih2YWx1ZSkgewogIGlmICh2YWx1ZSA+IDB4N2ZmZikgewogICAgdmFsdWUgPSAweDdmZmY7CiAgfSBlbHNlIGlmICh2YWx1ZSA8IC0weDgwMDApIHsKICAgIHZhbHVlID0gLTB4ODAwMDsKICB9CiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7Cn0KZnVuY3Rpb24gaXNUcnVlVHlwZUZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIHJldHVybiByZWFkVWludDMyKGhlYWRlciwgMCkgPT09IDB4MDAwMTAwMDAgfHwgYnl0ZXNUb1N0cmluZyhoZWFkZXIpID09PSAidHJ1ZSI7Cn0KZnVuY3Rpb24gaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZpbGUpIHsKICBjb25zdCBoZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyg0KTsKICByZXR1cm4gYnl0ZXNUb1N0cmluZyhoZWFkZXIpID09PSAidHRjZiI7Cn0KZnVuY3Rpb24gaXNPcGVuVHlwZUZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIHJldHVybiBieXRlc1RvU3RyaW5nKGhlYWRlcikgPT09ICJPVFRPIjsKfQpmdW5jdGlvbiBpc1R5cGUxRmlsZShmaWxlKSB7CiAgY29uc3QgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoMik7CiAgaWYgKGhlYWRlclswXSA9PT0gMHgyNSAmJiBoZWFkZXJbMV0gPT09IDB4MjEpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAoaGVhZGVyWzBdID09PSAweDgwICYmIGhlYWRlclsxXSA9PT0gMHgwMSkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBpc0NGRkZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIGlmIChoZWFkZXJbMF0gPj0gMSAmJiBoZWFkZXJbM10gPj0gMSAmJiBoZWFkZXJbM10gPD0gNCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIHJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBnZXRGb250RmlsZVR5cGUoZmlsZSwgewogIHR5cGUsCiAgc3VidHlwZSwKICBjb21wb3NpdGUKfSkgewogIGxldCBmaWxlVHlwZSwgZmlsZVN1YnR5cGU7CiAgaWYgKGlzVHJ1ZVR5cGVGaWxlKGZpbGUpIHx8IGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmaWxlKSkgewogICAgZmlsZVR5cGUgPSBjb21wb3NpdGUgPyAiQ0lERm9udFR5cGUyIiA6ICJUcnVlVHlwZSI7CiAgfSBlbHNlIGlmIChpc09wZW5UeXBlRmlsZShmaWxlKSkgewogICAgZmlsZVR5cGUgPSBjb21wb3NpdGUgPyAiQ0lERm9udFR5cGUyIiA6ICJPcGVuVHlwZSI7CiAgfSBlbHNlIGlmIChpc1R5cGUxRmlsZShmaWxlKSkgewogICAgaWYgKGNvbXBvc2l0ZSkgewogICAgICBmaWxlVHlwZSA9ICJDSURGb250VHlwZTAiOwogICAgfSBlbHNlIHsKICAgICAgZmlsZVR5cGUgPSB0eXBlID09PSAiTU1UeXBlMSIgPyAiTU1UeXBlMSIgOiAiVHlwZTEiOwogICAgfQogIH0gZWxzZSBpZiAoaXNDRkZGaWxlKGZpbGUpKSB7CiAgICBpZiAoY29tcG9zaXRlKSB7CiAgICAgIGZpbGVUeXBlID0gIkNJREZvbnRUeXBlMCI7CiAgICAgIGZpbGVTdWJ0eXBlID0gIkNJREZvbnRUeXBlMEMiOwogICAgfSBlbHNlIHsKICAgICAgZmlsZVR5cGUgPSB0eXBlID09PSAiTU1UeXBlMSIgPyAiTU1UeXBlMSIgOiAiVHlwZTEiOwogICAgICBmaWxlU3VidHlwZSA9ICJUeXBlMUMiOwogICAgfQogIH0gZWxzZSB7CiAgICB3YXJuKCJnZXRGb250RmlsZVR5cGU6IFVuYWJsZSB0byBkZXRlY3QgY29ycmVjdCBmb250IGZpbGUgVHlwZS9TdWJ0eXBlLiIpOwogICAgZmlsZVR5cGUgPSB0eXBlOwogICAgZmlsZVN1YnR5cGUgPSBzdWJ0eXBlOwogIH0KICByZXR1cm4gW2ZpbGVUeXBlLCBmaWxlU3VidHlwZV07Cn0KZnVuY3Rpb24gYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChtYXAsIGdseXBoTWFwKSB7CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBnbHlwaE1hcCkgewogICAgbWFwWytjaGFyQ29kZV0gPSBnbHlwaE1hcFtjaGFyQ29kZV07CiAgfQp9CmZ1bmN0aW9uIGJ1aWxkVG9Gb250Q2hhcihlbmNvZGluZywgZ2x5cGhzVW5pY29kZU1hcCwgZGlmZmVyZW5jZXMpIHsKICBjb25zdCB0b0ZvbnRDaGFyID0gW107CiAgbGV0IHVuaWNvZGU7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gZW5jb2RpbmcubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChlbmNvZGluZ1tpXSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgICAgdG9Gb250Q2hhcltpXSA9IHVuaWNvZGU7CiAgICB9CiAgfQogIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZGlmZmVyZW5jZXMpIHsKICAgIHVuaWNvZGUgPSBnZXRVbmljb2RlRm9yR2x5cGgoZGlmZmVyZW5jZXNbY2hhckNvZGVdLCBnbHlwaHNVbmljb2RlTWFwKTsKICAgIGlmICh1bmljb2RlICE9PSAtMSkgewogICAgICB0b0ZvbnRDaGFyWytjaGFyQ29kZV0gPSB1bmljb2RlOwogICAgfQogIH0KICByZXR1cm4gdG9Gb250Q2hhcjsKfQpmdW5jdGlvbiBpc01hY05hbWVSZWNvcmQocikgewogIHJldHVybiByLnBsYXRmb3JtID09PSAxICYmIHIuZW5jb2RpbmcgPT09IDAgJiYgci5sYW5ndWFnZSA9PT0gMDsKfQpmdW5jdGlvbiBpc1dpbk5hbWVSZWNvcmQocikgewogIHJldHVybiByLnBsYXRmb3JtID09PSAzICYmIHIuZW5jb2RpbmcgPT09IDEgJiYgci5sYW5ndWFnZSA9PT0gMHg0MDk7Cn0KZnVuY3Rpb24gY29udmVydENpZFN0cmluZyhjaGFyQ29kZSwgY2lkLCBzaG91bGRUaHJvdyA9IGZhbHNlKSB7CiAgc3dpdGNoIChjaWQubGVuZ3RoKSB7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBjaWQuY2hhckNvZGVBdCgwKTsKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIGNpZC5jaGFyQ29kZUF0KDApIDw8IDggfCBjaWQuY2hhckNvZGVBdCgxKTsKICB9CiAgY29uc3QgbXNnID0gYFVuc3VwcG9ydGVkIENJRCBzdHJpbmcgKGNoYXJDb2RlICR7Y2hhckNvZGV9KTogIiR7Y2lkfSIuYDsKICBpZiAoc2hvdWxkVGhyb3cpIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihtc2cpOwogIH0KICB3YXJuKG1zZyk7CiAgcmV0dXJuIGNpZDsKfQpmdW5jdGlvbiBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgbmV3R2x5cGhaZXJvSWQsIHRvVW5pY29kZSkgewogIGNvbnN0IG5ld01hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgY29uc3QgdG9Vbmljb2RlRXh0cmFNYXAgPSBuZXcgTWFwKCk7CiAgY29uc3QgdG9Gb250Q2hhciA9IFtdOwogIGNvbnN0IHVzZWRHbHlwaElkcyA9IG5ldyBTZXQoKTsKICBsZXQgcHJpdmF0ZVVzZUFyZWFJbmRleCA9IDA7CiAgY29uc3QgcHJpdmF0ZVVzZU9mZmV0U3RhcnQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVswXTsKICBsZXQgbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA9IHByaXZhdGVVc2VPZmZldFN0YXJ0OwogIGxldCBwcml2YXRlVXNlT2ZmZXRFbmQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVsxXTsKICBjb25zdCBpc0luUHJpdmF0ZUFyZWEgPSBjb2RlID0+IFBSSVZBVEVfVVNFX0FSRUFTWzBdWzBdIDw9IGNvZGUgJiYgY29kZSA8PSBQUklWQVRFX1VTRV9BUkVBU1swXVsxXSB8fCBQUklWQVRFX1VTRV9BUkVBU1sxXVswXSA8PSBjb2RlICYmIGNvZGUgPD0gUFJJVkFURV9VU0VfQVJFQVNbMV1bMV07CiAgbGV0IExJR0FUVVJFX1RPX1VOSUNPREUgPSBudWxsOwogIGZvciAoY29uc3Qgb3JpZ2luYWxDaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkgewogICAgbGV0IGdseXBoSWQgPSBjaGFyQ29kZVRvR2x5cGhJZFtvcmlnaW5hbENoYXJDb2RlXTsKICAgIGlmICghaGFzR2x5cGgoZ2x5cGhJZCkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAobmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA+IHByaXZhdGVVc2VPZmZldEVuZCkgewogICAgICBwcml2YXRlVXNlQXJlYUluZGV4Kys7CiAgICAgIGlmIChwcml2YXRlVXNlQXJlYUluZGV4ID49IFBSSVZBVEVfVVNFX0FSRUFTLmxlbmd0aCkgewogICAgICAgIHdhcm4oIlJhbiBvdXQgb2Ygc3BhY2UgaW4gZm9udCBwcml2YXRlIHVzZSBhcmVhLiIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVswXTsKICAgICAgcHJpdmF0ZVVzZU9mZmV0RW5kID0gUFJJVkFURV9VU0VfQVJFQVNbcHJpdmF0ZVVzZUFyZWFJbmRleF1bMV07CiAgICB9CiAgICBjb25zdCBmb250Q2hhckNvZGUgPSBuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlKys7CiAgICBpZiAoZ2x5cGhJZCA9PT0gMCkgewogICAgICBnbHlwaElkID0gbmV3R2x5cGhaZXJvSWQ7CiAgICB9CiAgICBsZXQgdW5pY29kZSA9IHRvVW5pY29kZS5nZXQob3JpZ2luYWxDaGFyQ29kZSk7CiAgICBpZiAodHlwZW9mIHVuaWNvZGUgPT09ICJzdHJpbmciKSB7CiAgICAgIGlmICh1bmljb2RlLmxlbmd0aCA9PT0gMSkgewogICAgICAgIHVuaWNvZGUgPSB1bmljb2RlLmNvZGVQb2ludEF0KDApOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghTElHQVRVUkVfVE9fVU5JQ09ERSkgewogICAgICAgICAgTElHQVRVUkVfVE9fVU5JQ09ERSA9IG5ldyBNYXAoKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAweGZiMDA7IGkgPD0gMHhmYjRmOyBpKyspIHsKICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSkubm9ybWFsaXplKCJORktEIik7CiAgICAgICAgICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICBMSUdBVFVSRV9UT19VTklDT0RFLnNldChub3JtYWxpemVkLCBpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1bmljb2RlID0gTElHQVRVUkVfVE9fVU5JQ09ERS5nZXQodW5pY29kZSkgfHwgdW5pY29kZS5jb2RlUG9pbnRBdCgwKTsKICAgICAgfQogICAgfQogICAgaWYgKHVuaWNvZGUgJiYgIWlzSW5Qcml2YXRlQXJlYSh1bmljb2RlKSAmJiAhdXNlZEdseXBoSWRzLmhhcyhnbHlwaElkKSkgewogICAgICB0b1VuaWNvZGVFeHRyYU1hcC5zZXQodW5pY29kZSwgZ2x5cGhJZCk7CiAgICAgIHVzZWRHbHlwaElkcy5hZGQoZ2x5cGhJZCk7CiAgICB9CiAgICBuZXdNYXBbZm9udENoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICB0b0ZvbnRDaGFyW29yaWdpbmFsQ2hhckNvZGVdID0gZm9udENoYXJDb2RlOwogIH0KICByZXR1cm4gewogICAgdG9Gb250Q2hhciwKICAgIGNoYXJDb2RlVG9HbHlwaElkOiBuZXdNYXAsCiAgICB0b1VuaWNvZGVFeHRyYU1hcCwKICAgIG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUKICB9Owp9CmZ1bmN0aW9uIGdldFJhbmdlcyhnbHlwaHMsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpIHsKICBjb25zdCBjb2RlcyA9IFtdOwogIGZvciAoY29uc3QgY2hhckNvZGUgaW4gZ2x5cGhzKSB7CiAgICBpZiAoZ2x5cGhzW2NoYXJDb2RlXSA+PSBudW1HbHlwaHMpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb2Rlcy5wdXNoKHsKICAgICAgZm9udENoYXJDb2RlOiBjaGFyQ29kZSB8IDAsCiAgICAgIGdseXBoSWQ6IGdseXBoc1tjaGFyQ29kZV0KICAgIH0pOwogIH0KICBpZiAodG9Vbmljb2RlRXh0cmFNYXApIHsKICAgIGZvciAoY29uc3QgW3VuaWNvZGUsIGdseXBoSWRdIG9mIHRvVW5pY29kZUV4dHJhTWFwKSB7CiAgICAgIGlmIChnbHlwaElkID49IG51bUdseXBocykgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvZGVzLnB1c2goewogICAgICAgIGZvbnRDaGFyQ29kZTogdW5pY29kZSwKICAgICAgICBnbHlwaElkCiAgICAgIH0pOwogICAgfQogIH0KICBpZiAoY29kZXMubGVuZ3RoID09PSAwKSB7CiAgICBjb2Rlcy5wdXNoKHsKICAgICAgZm9udENoYXJDb2RlOiAwLAogICAgICBnbHlwaElkOiAwCiAgICB9KTsKICB9CiAgY29kZXMuc29ydCgoYSwgYikgPT4gYS5mb250Q2hhckNvZGUgLSBiLmZvbnRDaGFyQ29kZSk7CiAgY29uc3QgcmFuZ2VzID0gW107CiAgY29uc3QgbGVuZ3RoID0gY29kZXMubGVuZ3RoOwogIGZvciAobGV0IG4gPSAwOyBuIDwgbGVuZ3RoOykgewogICAgY29uc3Qgc3RhcnQgPSBjb2Rlc1tuXS5mb250Q2hhckNvZGU7CiAgICBjb25zdCBjb2RlSW5kaWNlcyA9IFtjb2Rlc1tuXS5nbHlwaElkXTsKICAgICsrbjsKICAgIGxldCBlbmQgPSBzdGFydDsKICAgIHdoaWxlIChuIDwgbGVuZ3RoICYmIGVuZCArIDEgPT09IGNvZGVzW25dLmZvbnRDaGFyQ29kZSkgewogICAgICBjb2RlSW5kaWNlcy5wdXNoKGNvZGVzW25dLmdseXBoSWQpOwogICAgICArK2VuZDsKICAgICAgKytuOwogICAgICBpZiAoZW5kID09PSAweGZmZmYpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmFuZ2VzLnB1c2goW3N0YXJ0LCBlbmQsIGNvZGVJbmRpY2VzXSk7CiAgfQogIHJldHVybiByYW5nZXM7Cn0KZnVuY3Rpb24gY3JlYXRlQ21hcFRhYmxlKGdseXBocywgdG9Vbmljb2RlRXh0cmFNYXAsIG51bUdseXBocykgewogIGNvbnN0IHJhbmdlcyA9IGdldFJhbmdlcyhnbHlwaHMsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpOwogIGNvbnN0IG51bVRhYmxlcyA9IHJhbmdlcy5hdCgtMSlbMV0gPiAweGZmZmYgPyAyIDogMTsKICBsZXQgY21hcCA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNihudW1UYWJsZXMpICsgIlx4MDBceDAzIiArICJceDAwXHgwMSIgKyBzdHJpbmczMig0ICsgbnVtVGFibGVzICogOCk7CiAgbGV0IGksIGlpLCBqLCBqajsKICBmb3IgKGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgIGlmIChyYW5nZXNbaV1bMF0gPD0gMHhmZmZmKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBjb25zdCBibXBMZW5ndGggPSBpICsgMTsKICBpZiAocmFuZ2VzW2ldWzBdIDwgMHhmZmZmICYmIHJhbmdlc1tpXVsxXSA9PT0gMHhmZmZmKSB7CiAgICByYW5nZXNbaV1bMV0gPSAweGZmZmU7CiAgfQogIGNvbnN0IHRyYWlsaW5nUmFuZ2VzQ291bnQgPSByYW5nZXNbaV1bMV0gPCAweGZmZmYgPyAxIDogMDsKICBjb25zdCBzZWdDb3VudCA9IGJtcExlbmd0aCArIHRyYWlsaW5nUmFuZ2VzQ291bnQ7CiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gT3BlblR5cGVGaWxlQnVpbGRlci5nZXRTZWFyY2hQYXJhbXMoc2VnQ291bnQsIDIpOwogIGxldCBzdGFydENvdW50ID0gIiI7CiAgbGV0IGVuZENvdW50ID0gIiI7CiAgbGV0IGlkRGVsdGFzID0gIiI7CiAgbGV0IGlkUmFuZ2VPZmZzZXRzID0gIiI7CiAgbGV0IGdseXBoc0lkcyA9ICIiOwogIGxldCBiaWFzID0gMDsKICBsZXQgcmFuZ2UsIHN0YXJ0LCBlbmQsIGNvZGVzOwogIGZvciAoaSA9IDAsIGlpID0gYm1wTGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgcmFuZ2UgPSByYW5nZXNbaV07CiAgICBzdGFydCA9IHJhbmdlWzBdOwogICAgZW5kID0gcmFuZ2VbMV07CiAgICBzdGFydENvdW50ICs9IHN0cmluZzE2KHN0YXJ0KTsKICAgIGVuZENvdW50ICs9IHN0cmluZzE2KGVuZCk7CiAgICBjb2RlcyA9IHJhbmdlWzJdOwogICAgbGV0IGNvbnRpZ3VvdXMgPSB0cnVlOwogICAgZm9yIChqID0gMSwgamogPSBjb2Rlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CiAgICAgIGlmIChjb2Rlc1tqXSAhPT0gY29kZXNbaiAtIDFdICsgMSkgewogICAgICAgIGNvbnRpZ3VvdXMgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKCFjb250aWd1b3VzKSB7CiAgICAgIGNvbnN0IG9mZnNldCA9IChzZWdDb3VudCAtIGkpICogMiArIGJpYXMgKiAyOwogICAgICBiaWFzICs9IGVuZCAtIHN0YXJ0ICsgMTsKICAgICAgaWREZWx0YXMgKz0gc3RyaW5nMTYoMCk7CiAgICAgIGlkUmFuZ2VPZmZzZXRzICs9IHN0cmluZzE2KG9mZnNldCk7CiAgICAgIGZvciAoaiA9IDAsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikgewogICAgICAgIGdseXBoc0lkcyArPSBzdHJpbmcxNihjb2Rlc1tqXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0YXJ0Q29kZSA9IGNvZGVzWzBdOwogICAgICBpZERlbHRhcyArPSBzdHJpbmcxNihzdGFydENvZGUgLSBzdGFydCAmIDB4ZmZmZik7CiAgICAgIGlkUmFuZ2VPZmZzZXRzICs9IHN0cmluZzE2KDApOwogICAgfQogIH0KICBpZiAodHJhaWxpbmdSYW5nZXNDb3VudCA+IDApIHsKICAgIGVuZENvdW50ICs9ICJceEZGXHhGRiI7CiAgICBzdGFydENvdW50ICs9ICJceEZGXHhGRiI7CiAgICBpZERlbHRhcyArPSAiXHgwMFx4MDEiOwogICAgaWRSYW5nZU9mZnNldHMgKz0gIlx4MDBceDAwIjsKICB9CiAgY29uc3QgZm9ybWF0MzE0ID0gIlx4MDBceDAwIiArIHN0cmluZzE2KDIgKiBzZWdDb3VudCkgKyBzdHJpbmcxNihzZWFyY2hQYXJhbXMucmFuZ2UpICsgc3RyaW5nMTYoc2VhcmNoUGFyYW1zLmVudHJ5KSArIHN0cmluZzE2KHNlYXJjaFBhcmFtcy5yYW5nZVNoaWZ0KSArIGVuZENvdW50ICsgIlx4MDBceDAwIiArIHN0YXJ0Q291bnQgKyBpZERlbHRhcyArIGlkUmFuZ2VPZmZzZXRzICsgZ2x5cGhzSWRzOwogIGxldCBmb3JtYXQzMTAxMiA9ICIiOwogIGxldCBoZWFkZXIzMTAxMiA9ICIiOwogIGlmIChudW1UYWJsZXMgPiAxKSB7CiAgICBjbWFwICs9ICJceDAwXHgwMyIgKyAiXHgwMFx4MEEiICsgc3RyaW5nMzIoNCArIG51bVRhYmxlcyAqIDggKyA0ICsgZm9ybWF0MzE0Lmxlbmd0aCk7CiAgICBmb3JtYXQzMTAxMiA9ICIiOwogICAgZm9yIChpID0gMCwgaWkgPSByYW5nZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICByYW5nZSA9IHJhbmdlc1tpXTsKICAgICAgc3RhcnQgPSByYW5nZVswXTsKICAgICAgY29kZXMgPSByYW5nZVsyXTsKICAgICAgbGV0IGNvZGUgPSBjb2Rlc1swXTsKICAgICAgZm9yIChqID0gMSwgamogPSBjb2Rlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CiAgICAgICAgaWYgKGNvZGVzW2pdICE9PSBjb2Rlc1tqIC0gMV0gKyAxKSB7CiAgICAgICAgICBlbmQgPSByYW5nZVswXSArIGogLSAxOwogICAgICAgICAgZm9ybWF0MzEwMTIgKz0gc3RyaW5nMzIoc3RhcnQpICsgc3RyaW5nMzIoZW5kKSArIHN0cmluZzMyKGNvZGUpOwogICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwogICAgICAgICAgY29kZSA9IGNvZGVzW2pdOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3JtYXQzMTAxMiArPSBzdHJpbmczMihzdGFydCkgKyBzdHJpbmczMihyYW5nZVsxXSkgKyBzdHJpbmczMihjb2RlKTsKICAgIH0KICAgIGhlYWRlcjMxMDEyID0gIlx4MDBceDBDIiArICJceDAwXHgwMCIgKyBzdHJpbmczMihmb3JtYXQzMTAxMi5sZW5ndGggKyAxNikgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyBzdHJpbmczMihmb3JtYXQzMTAxMi5sZW5ndGggLyAxMik7CiAgfQogIHJldHVybiBjbWFwICsgIlx4MDBceDA0IiArIHN0cmluZzE2KGZvcm1hdDMxNC5sZW5ndGggKyA0KSArIGZvcm1hdDMxNCArIGhlYWRlcjMxMDEyICsgZm9ybWF0MzEwMTI7Cn0KZnVuY3Rpb24gdmFsaWRhdGVPUzJUYWJsZShvczIsIGZpbGUpIHsKICBmaWxlLnBvcyA9IChmaWxlLnN0YXJ0IHx8IDApICsgb3MyLm9mZnNldDsKICBjb25zdCB2ZXJzaW9uID0gZmlsZS5nZXRVaW50MTYoKTsKICBmaWxlLnNraXAoNjApOwogIGNvbnN0IHNlbGVjdGlvbiA9IGZpbGUuZ2V0VWludDE2KCk7CiAgaWYgKHZlcnNpb24gPCA0ICYmIHNlbGVjdGlvbiAmIDB4MDMwMCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBmaXJzdENoYXIgPSBmaWxlLmdldFVpbnQxNigpOwogIGNvbnN0IGxhc3RDaGFyID0gZmlsZS5nZXRVaW50MTYoKTsKICBpZiAoZmlyc3RDaGFyID4gbGFzdENoYXIpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgZmlsZS5za2lwKDYpOwogIGNvbnN0IHVzV2luQXNjZW50ID0gZmlsZS5nZXRVaW50MTYoKTsKICBpZiAodXNXaW5Bc2NlbnQgPT09IDApIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgb3MyLmRhdGFbOF0gPSBvczIuZGF0YVs5XSA9IDA7CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgY2hhcnN0cmluZ3MsIG92ZXJyaWRlKSB7CiAgb3ZlcnJpZGUgfHw9IHsKICAgIHVuaXRzUGVyRW06IDAsCiAgICB5TWF4OiAwLAogICAgeU1pbjogMCwKICAgIGFzY2VudDogMCwKICAgIGRlc2NlbnQ6IDAKICB9OwogIGxldCB1bFVuaWNvZGVSYW5nZTEgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTIgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTMgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTQgPSAwOwogIGxldCBmaXJzdENoYXJJbmRleCA9IG51bGw7CiAgbGV0IGxhc3RDaGFySW5kZXggPSAwOwogIGxldCBwb3NpdGlvbiA9IC0xOwogIGlmIChjaGFyc3RyaW5ncykgewogICAgZm9yIChsZXQgY29kZSBpbiBjaGFyc3RyaW5ncykgewogICAgICBjb2RlIHw9IDA7CiAgICAgIGlmIChmaXJzdENoYXJJbmRleCA+IGNvZGUgfHwgIWZpcnN0Q2hhckluZGV4KSB7CiAgICAgICAgZmlyc3RDaGFySW5kZXggPSBjb2RlOwogICAgICB9CiAgICAgIGlmIChsYXN0Q2hhckluZGV4IDwgY29kZSkgewogICAgICAgIGxhc3RDaGFySW5kZXggPSBjb2RlOwogICAgICB9CiAgICAgIHBvc2l0aW9uID0gZ2V0VW5pY29kZVJhbmdlRm9yKGNvZGUsIHBvc2l0aW9uKTsKICAgICAgaWYgKHBvc2l0aW9uIDwgMzIpIHsKICAgICAgICB1bFVuaWNvZGVSYW5nZTEgfD0gMSA8PCBwb3NpdGlvbjsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDY0KSB7CiAgICAgICAgdWxVbmljb2RlUmFuZ2UyIHw9IDEgPDwgcG9zaXRpb24gLSAzMjsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDk2KSB7CiAgICAgICAgdWxVbmljb2RlUmFuZ2UzIHw9IDEgPDwgcG9zaXRpb24gLSA2NDsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDEyMykgewogICAgICAgIHVsVW5pY29kZVJhbmdlNCB8PSAxIDw8IHBvc2l0aW9uIC0gOTY7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmljb2RlIHJhbmdlcyBCaXRzID4gMTIzIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UiKTsKICAgICAgfQogICAgfQogICAgaWYgKGxhc3RDaGFySW5kZXggPiAweGZmZmYpIHsKICAgICAgbGFzdENoYXJJbmRleCA9IDB4ZmZmZjsKICAgIH0KICB9IGVsc2UgewogICAgZmlyc3RDaGFySW5kZXggPSAwOwogICAgbGFzdENoYXJJbmRleCA9IDI1NTsKICB9CiAgY29uc3QgYmJveCA9IHByb3BlcnRpZXMuYmJveCB8fCBbMCwgMCwgMCwgMF07CiAgY29uc3QgdW5pdHNQZXJFbSA9IG92ZXJyaWRlLnVuaXRzUGVyRW0gfHwgKHByb3BlcnRpZXMuZm9udE1hdHJpeCA/IDEgLyBNYXRoLm1heCguLi5wcm9wZXJ0aWVzLmZvbnRNYXRyaXguc2xpY2UoMCwgNCkubWFwKE1hdGguYWJzKSkgOiAxMDAwKTsKICBjb25zdCBzY2FsZSA9IHByb3BlcnRpZXMuYXNjZW50U2NhbGVkID8gMS4wIDogdW5pdHNQZXJFbSAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICBjb25zdCB0eXBvQXNjZW50ID0gb3ZlcnJpZGUuYXNjZW50IHx8IE1hdGgucm91bmQoc2NhbGUgKiAocHJvcGVydGllcy5hc2NlbnQgfHwgYmJveFszXSkpOwogIGxldCB0eXBvRGVzY2VudCA9IG92ZXJyaWRlLmRlc2NlbnQgfHwgTWF0aC5yb3VuZChzY2FsZSAqIChwcm9wZXJ0aWVzLmRlc2NlbnQgfHwgYmJveFsxXSkpOwogIGlmICh0eXBvRGVzY2VudCA+IDAgJiYgcHJvcGVydGllcy5kZXNjZW50ID4gMCAmJiBiYm94WzFdIDwgMCkgewogICAgdHlwb0Rlc2NlbnQgPSAtdHlwb0Rlc2NlbnQ7CiAgfQogIGNvbnN0IHdpbkFzY2VudCA9IG92ZXJyaWRlLnlNYXggfHwgdHlwb0FzY2VudDsKICBjb25zdCB3aW5EZXNjZW50ID0gLW92ZXJyaWRlLnlNaW4gfHwgLXR5cG9EZXNjZW50OwogIHJldHVybiAiXHgwMFx4MDMiICsgIlx4MDJceDI0IiArICJceDAxXHhGNCIgKyAiXHgwMFx4MDUiICsgIlx4MDBceDAwIiArICJceDAyXHg4QSIgKyAiXHgwMlx4QkIiICsgIlx4MDBceDAwIiArICJceDAwXHg4QyIgKyAiXHgwMlx4OEEiICsgIlx4MDJceEJCIiArICJceDAwXHgwMCIgKyAiXHgwMVx4REYiICsgIlx4MDBceDMxIiArICJceDAxXHgwMiIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwNiIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHByb3BlcnRpZXMuZml4ZWRQaXRjaCA/IDB4MDkgOiAweDAwKSArICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiICsgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2UxKSArIHN0cmluZzMyKHVsVW5pY29kZVJhbmdlMikgKyBzdHJpbmczMih1bFVuaWNvZGVSYW5nZTMpICsgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2U0KSArICJceDJBXHgzMlx4MzFceDJBIiArIHN0cmluZzE2KHByb3BlcnRpZXMuaXRhbGljQW5nbGUgPyAxIDogMCkgKyBzdHJpbmcxNihmaXJzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmZpcnN0Q2hhcikgKyBzdHJpbmcxNihsYXN0Q2hhckluZGV4IHx8IHByb3BlcnRpZXMubGFzdENoYXIpICsgc3RyaW5nMTYodHlwb0FzY2VudCkgKyBzdHJpbmcxNih0eXBvRGVzY2VudCkgKyAiXHgwMFx4NjQiICsgc3RyaW5nMTYod2luQXNjZW50KSArIHN0cmluZzE2KHdpbkRlc2NlbnQpICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgc3RyaW5nMTYocHJvcGVydGllcy54SGVpZ2h0KSArIHN0cmluZzE2KHByb3BlcnRpZXMuY2FwSGVpZ2h0KSArIHN0cmluZzE2KDApICsgc3RyaW5nMTYoZmlyc3RDaGFySW5kZXggfHwgcHJvcGVydGllcy5maXJzdENoYXIpICsgIlx4MDBceDAzIjsKfQpmdW5jdGlvbiBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykgewogIGNvbnN0IGFuZ2xlID0gTWF0aC5mbG9vcihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlICogMiAqKiAxNik7CiAgcmV0dXJuICJceDAwXHgwM1x4MDBceDAwIiArIHN0cmluZzMyKGFuZ2xlKSArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgc3RyaW5nMzIocHJvcGVydGllcy5maXhlZFBpdGNoID8gMSA6IDApICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiOwp9CmZ1bmN0aW9uIGNyZWF0ZVBvc3RzY3JpcHROYW1lKG5hbWUpIHsKICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKC9bXlx4MjEtXHg3RV18W1tcXSgpe308Pi8lXS9nLCAiIikuc2xpY2UoMCwgNjMpOwp9CmZ1bmN0aW9uIGNyZWF0ZU5hbWVUYWJsZShuYW1lLCBwcm90bykgewogIGlmICghcHJvdG8pIHsKICAgIHByb3RvID0gW1tdLCBbXV07CiAgfQogIGNvbnN0IHN0cmluZ3MgPSBbcHJvdG9bMF1bMF0gfHwgIk9yaWdpbmFsIGxpY2VuY2UiLCBwcm90b1swXVsxXSB8fCBuYW1lLCBwcm90b1swXVsyXSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzNdIHx8ICJ1bmlxdWVJRCIsIHByb3RvWzBdWzRdIHx8IG5hbWUsIHByb3RvWzBdWzVdIHx8ICJWZXJzaW9uIDAuMTEiLCBwcm90b1swXVs2XSB8fCBjcmVhdGVQb3N0c2NyaXB0TmFtZShuYW1lKSwgcHJvdG9bMF1bN10gfHwgIlVua25vd24iLCBwcm90b1swXVs4XSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzldIHx8ICJVbmtub3duIl07CiAgY29uc3Qgc3RyaW5nc1VuaWNvZGUgPSBbXTsKICBsZXQgaSwgaWksIGosIGpqLCBzdHI7CiAgZm9yIChpID0gMCwgaWkgPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIHN0ciA9IHByb3RvWzFdW2ldIHx8IHN0cmluZ3NbaV07CiAgICBjb25zdCBzdHJCdWZVbmljb2RlID0gW107CiAgICBmb3IgKGogPSAwLCBqaiA9IHN0ci5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIHN0ckJ1ZlVuaWNvZGUucHVzaChzdHJpbmcxNihzdHIuY2hhckNvZGVBdChqKSkpOwogICAgfQogICAgc3RyaW5nc1VuaWNvZGUucHVzaChzdHJCdWZVbmljb2RlLmpvaW4oIiIpKTsKICB9CiAgY29uc3QgbmFtZXMgPSBbc3RyaW5ncywgc3RyaW5nc1VuaWNvZGVdOwogIGNvbnN0IHBsYXRmb3JtcyA9IFsiXHgwMFx4MDEiLCAiXHgwMFx4MDMiXTsKICBjb25zdCBlbmNvZGluZ3MgPSBbIlx4MDBceDAwIiwgIlx4MDBceDAxIl07CiAgY29uc3QgbGFuZ3VhZ2VzID0gWyJceDAwXHgwMCIsICJceDA0XHgwOSJdOwogIGNvbnN0IG5hbWVzUmVjb3JkQ291bnQgPSBzdHJpbmdzLmxlbmd0aCAqIHBsYXRmb3Jtcy5sZW5ndGg7CiAgbGV0IG5hbWVUYWJsZSA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNihuYW1lc1JlY29yZENvdW50KSArIHN0cmluZzE2KG5hbWVzUmVjb3JkQ291bnQgKiAxMiArIDYpOwogIGxldCBzdHJPZmZzZXQgPSAwOwogIGZvciAoaSA9IDAsIGlpID0gcGxhdGZvcm1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHN0cnMgPSBuYW1lc1tpXTsKICAgIGZvciAoaiA9IDAsIGpqID0gc3Rycy5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIHN0ciA9IHN0cnNbal07CiAgICAgIGNvbnN0IG5hbWVSZWNvcmQgPSBwbGF0Zm9ybXNbaV0gKyBlbmNvZGluZ3NbaV0gKyBsYW5ndWFnZXNbaV0gKyBzdHJpbmcxNihqKSArIHN0cmluZzE2KHN0ci5sZW5ndGgpICsgc3RyaW5nMTYoc3RyT2Zmc2V0KTsKICAgICAgbmFtZVRhYmxlICs9IG5hbWVSZWNvcmQ7CiAgICAgIHN0ck9mZnNldCArPSBzdHIubGVuZ3RoOwogICAgfQogIH0KICBuYW1lVGFibGUgKz0gc3RyaW5ncy5qb2luKCIiKSArIHN0cmluZ3NVbmljb2RlLmpvaW4oIiIpOwogIHJldHVybiBuYW1lVGFibGU7Cn0KY2xhc3MgRm9udCB7CiAgY29uc3RydWN0b3IobmFtZSwgZmlsZSwgcHJvcGVydGllcywgZXZhbHVhdG9yT3B0aW9ucykgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMucHNOYW1lID0gbnVsbDsKICAgIHRoaXMubWltZXR5cGUgPSBudWxsOwogICAgdGhpcy5kaXNhYmxlRm9udEZhY2UgPSBldmFsdWF0b3JPcHRpb25zLmRpc2FibGVGb250RmFjZTsKICAgIHRoaXMuZm9udEV4dHJhUHJvcGVydGllcyA9IGV2YWx1YXRvck9wdGlvbnMuZm9udEV4dHJhUHJvcGVydGllczsKICAgIHRoaXMubG9hZGVkTmFtZSA9IHByb3BlcnRpZXMubG9hZGVkTmFtZTsKICAgIHRoaXMuaXNUeXBlM0ZvbnQgPSBwcm9wZXJ0aWVzLmlzVHlwZTNGb250OwogICAgdGhpcy5taXNzaW5nRmlsZSA9IGZhbHNlOwogICAgdGhpcy5jc3NGb250SW5mbyA9IHByb3BlcnRpZXMuY3NzRm9udEluZm87CiAgICB0aGlzLl9jaGFyc0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRoaXMuX2dseXBoQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IGlzU2VyaWZGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TZXJpZik7CiAgICBpZiAoIWlzU2VyaWZGb250ICYmICFwcm9wZXJ0aWVzLmlzU2ltdWxhdGVkRmxhZ3MpIHsKICAgICAgY29uc3QgYmFzZU5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoL1ssX10vZywgIi0iKS5zcGxpdCgiLSIsIDEpWzBdLAogICAgICAgIHNlcmlmRm9udHMgPSBnZXRTZXJpZkZvbnRzKCk7CiAgICAgIGZvciAoY29uc3QgbmFtZVBhcnQgb2YgYmFzZU5hbWUuc3BsaXQoIisiKSkgewogICAgICAgIGlmIChzZXJpZkZvbnRzW25hbWVQYXJ0XSkgewogICAgICAgICAgaXNTZXJpZkZvbnQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLmlzU2VyaWZGb250ID0gaXNTZXJpZkZvbnQ7CiAgICB0aGlzLmlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CiAgICB0aGlzLmlzTW9ub3NwYWNlID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5GaXhlZFBpdGNoKTsKICAgIGxldCB7CiAgICAgIHR5cGUsCiAgICAgIHN1YnR5cGUKICAgIH0gPSBwcm9wZXJ0aWVzOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CiAgICB0aGlzLnN5c3RlbUZvbnRJbmZvID0gcHJvcGVydGllcy5zeXN0ZW1Gb250SW5mbzsKICAgIGNvbnN0IG1hdGNoZXMgPSBuYW1lLm1hdGNoKC9eSW52YWxpZFBERmpzRm9udF8oLiopX1xkKyQvKTsKICAgIHRoaXMuaXNJbnZhbGlkUERGanNGb250ID0gISFtYXRjaGVzOwogICAgaWYgKHRoaXMuaXNJbnZhbGlkUERGanNGb250KSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gbWF0Y2hlc1sxXTsKICAgIH0gZWxzZSBpZiAodGhpcy5pc01vbm9zcGFjZSkgewogICAgICB0aGlzLmZhbGxiYWNrTmFtZSA9ICJtb25vc3BhY2UiOwogICAgfSBlbHNlIGlmICh0aGlzLmlzU2VyaWZGb250KSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gInNlcmlmIjsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gInNhbnMtc2VyaWYiOwogICAgfQogICAgaWYgKHRoaXMuc3lzdGVtRm9udEluZm8/Lmd1ZXNzRmFsbGJhY2spIHsKICAgICAgdGhpcy5zeXN0ZW1Gb250SW5mby5ndWVzc0ZhbGxiYWNrID0gZmFsc2U7CiAgICAgIHRoaXMuc3lzdGVtRm9udEluZm8uY3NzICs9IGAsJHt0aGlzLmZhbGxiYWNrTmFtZX1gOwogICAgfQogICAgdGhpcy5kaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOwogICAgdGhpcy5kZWZhdWx0V2lkdGggPSBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aDsKICAgIHRoaXMuY29tcG9zaXRlID0gcHJvcGVydGllcy5jb21wb3NpdGU7CiAgICB0aGlzLmNNYXAgPSBwcm9wZXJ0aWVzLmNNYXA7CiAgICB0aGlzLmNhcEhlaWdodCA9IHByb3BlcnRpZXMuY2FwSGVpZ2h0IC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOwogICAgdGhpcy5hc2NlbnQgPSBwcm9wZXJ0aWVzLmFzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICAgIHRoaXMuZGVzY2VudCA9IHByb3BlcnRpZXMuZGVzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICAgIHRoaXMubGluZUhlaWdodCA9IHRoaXMuYXNjZW50IC0gdGhpcy5kZXNjZW50OwogICAgdGhpcy5mb250TWF0cml4ID0gcHJvcGVydGllcy5mb250TWF0cml4OwogICAgdGhpcy5iYm94ID0gcHJvcGVydGllcy5iYm94OwogICAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZzsKICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CiAgICB0aGlzLnRvRm9udENoYXIgPSBbXTsKICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09ICJUeXBlMyIpIHsKICAgICAgZm9yIChsZXQgY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykgewogICAgICAgIHRoaXMudG9Gb250Q2hhcltjaGFyQ29kZV0gPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJDb2RlXSB8fCBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZ1tjaGFyQ29kZV07CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5jaWRFbmNvZGluZyA9IHByb3BlcnRpZXMuY2lkRW5jb2RpbmcgfHwgIiI7CiAgICB0aGlzLnZlcnRpY2FsID0gISFwcm9wZXJ0aWVzLnZlcnRpY2FsOwogICAgaWYgKHRoaXMudmVydGljYWwpIHsKICAgICAgdGhpcy52bWV0cmljcyA9IHByb3BlcnRpZXMudm1ldHJpY3M7CiAgICAgIHRoaXMuZGVmYXVsdFZNZXRyaWNzID0gcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3M7CiAgICB9CiAgICBpZiAoIWZpbGUgfHwgZmlsZS5pc0VtcHR5KSB7CiAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgd2FybignRm9udCBmaWxlIGlzIGVtcHR5IGluICInICsgbmFtZSArICciICgnICsgdGhpcy5sb2FkZWROYW1lICsgIikiKTsKICAgICAgfQogICAgICB0aGlzLmZhbGxiYWNrVG9TeXN0ZW1Gb250KHByb3BlcnRpZXMpOwogICAgICByZXR1cm47CiAgICB9CiAgICBbdHlwZSwgc3VidHlwZV0gPSBnZXRGb250RmlsZVR5cGUoZmlsZSwgcHJvcGVydGllcyk7CiAgICBpZiAodHlwZSAhPT0gdGhpcy50eXBlIHx8IHN1YnR5cGUgIT09IHRoaXMuc3VidHlwZSkgewogICAgICBpbmZvKCJJbmNvbnNpc3RlbnQgZm9udCBmaWxlIFR5cGUvU3ViVHlwZSwgZXhwZWN0ZWQ6ICIgKyBgJHt0aGlzLnR5cGV9LyR7dGhpcy5zdWJ0eXBlfSBidXQgZm91bmQ6ICR7dHlwZX0vJHtzdWJ0eXBlfS5gKTsKICAgIH0KICAgIGxldCBkYXRhOwogICAgdHJ5IHsKICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSAiTU1UeXBlMSI6CiAgICAgICAgICBpbmZvKCJNTVR5cGUxIGZvbnQgKCIgKyBuYW1lICsgIiksIGZhbGxpbmcgYmFjayB0byBUeXBlMS4iKTsKICAgICAgICBjYXNlICJUeXBlMSI6CiAgICAgICAgY2FzZSAiQ0lERm9udFR5cGUwIjoKICAgICAgICAgIHRoaXMubWltZXR5cGUgPSAiZm9udC9vcGVudHlwZSI7CiAgICAgICAgICBjb25zdCBjZmYgPSBzdWJ0eXBlID09PSAiVHlwZTFDIiB8fCBzdWJ0eXBlID09PSAiQ0lERm9udFR5cGUwQyIgPyBuZXcgQ0ZGRm9udChmaWxlLCBwcm9wZXJ0aWVzKSA6IG5ldyBUeXBlMUZvbnQobmFtZSwgZmlsZSwgcHJvcGVydGllcyk7CiAgICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7CiAgICAgICAgICBkYXRhID0gdGhpcy5jb252ZXJ0KG5hbWUsIGNmZiwgcHJvcGVydGllcyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJPcGVuVHlwZSI6CiAgICAgICAgY2FzZSAiVHJ1ZVR5cGUiOgogICAgICAgIGNhc2UgIkNJREZvbnRUeXBlMiI6CiAgICAgICAgICB0aGlzLm1pbWV0eXBlID0gImZvbnQvb3BlbnR5cGUiOwogICAgICAgICAgZGF0YSA9IHRoaXMuY2hlY2tBbmRSZXBhaXIobmFtZSwgZmlsZSwgcHJvcGVydGllcyk7CiAgICAgICAgICBpZiAodGhpcy5pc09wZW5UeXBlKSB7CiAgICAgICAgICAgIGFkanVzdFdpZHRocyhwcm9wZXJ0aWVzKTsKICAgICAgICAgICAgdHlwZSA9ICJPcGVuVHlwZSI7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBGb250ICR7dHlwZX0gaXMgbm90IHN1cHBvcnRlZGApOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdhcm4oZSk7CiAgICAgIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQocHJvcGVydGllcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGFtZW5kRmFsbGJhY2tUb1VuaWNvZGUocHJvcGVydGllcyk7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CiAgICB0aGlzLmZvbnRNYXRyaXggPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXg7CiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOwogICAgdGhpcy5kZWZhdWx0V2lkdGggPSBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aDsKICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CiAgICB0aGlzLnNlYWNNYXAgPSBwcm9wZXJ0aWVzLnNlYWNNYXA7CiAgfQogIGdldCByZW5kZXJlcigpIHsKICAgIGNvbnN0IHJlbmRlcmVyID0gRm9udFJlbmRlcmVyRmFjdG9yeS5jcmVhdGUodGhpcywgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgInJlbmRlcmVyIiwgcmVuZGVyZXIpOwogIH0KICBleHBvcnREYXRhKCkgewogICAgY29uc3QgZXhwb3J0RGF0YVByb3BzID0gdGhpcy5mb250RXh0cmFQcm9wZXJ0aWVzID8gWy4uLkVYUE9SVF9EQVRBX1BST1BFUlRJRVMsIC4uLkVYUE9SVF9EQVRBX0VYVFJBX1BST1BFUlRJRVNdIDogRVhQT1JUX0RBVEFfUFJPUEVSVElFUzsKICAgIGNvbnN0IGRhdGEgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZm9yIChjb25zdCBwcm9wIG9mIGV4cG9ydERhdGFQcm9wcykgewogICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcHJvcF07CiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGF0YVtwcm9wXSA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgZmFsbGJhY2tUb1N5c3RlbUZvbnQocHJvcGVydGllcykgewogICAgdGhpcy5taXNzaW5nRmlsZSA9IHRydWU7CiAgICBjb25zdCB7CiAgICAgIG5hbWUsCiAgICAgIHR5cGUKICAgIH0gPSB0aGlzOwogICAgbGV0IGZvbnROYW1lID0gbm9ybWFsaXplRm9udE5hbWUobmFtZSk7CiAgICBjb25zdCBzdGRGb250TWFwID0gZ2V0U3RkRm9udE1hcCgpLAogICAgICBub25TdGRGb250TWFwID0gZ2V0Tm9uU3RkRm9udE1hcCgpOwogICAgY29uc3QgaXNTdGFuZGFyZEZvbnQgPSAhIXN0ZEZvbnRNYXBbZm9udE5hbWVdOwogICAgY29uc3QgaXNNYXBwZWRUb1N0YW5kYXJkRm9udCA9ICEhKG5vblN0ZEZvbnRNYXBbZm9udE5hbWVdICYmIHN0ZEZvbnRNYXBbbm9uU3RkRm9udE1hcFtmb250TmFtZV1dKTsKICAgIGZvbnROYW1lID0gc3RkRm9udE1hcFtmb250TmFtZV0gfHwgbm9uU3RkRm9udE1hcFtmb250TmFtZV0gfHwgZm9udE5hbWU7CiAgICBjb25zdCBmb250QmFzaWNNZXRyaWNzTWFwID0gZ2V0Rm9udEJhc2ljTWV0cmljcygpOwogICAgY29uc3QgbWV0cmljcyA9IGZvbnRCYXNpY01ldHJpY3NNYXBbZm9udE5hbWVdOwogICAgaWYgKG1ldHJpY3MpIHsKICAgICAgaWYgKGlzTmFOKHRoaXMuYXNjZW50KSkgewogICAgICAgIHRoaXMuYXNjZW50ID0gbWV0cmljcy5hc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgICAgaWYgKGlzTmFOKHRoaXMuZGVzY2VudCkpIHsKICAgICAgICB0aGlzLmRlc2NlbnQgPSBtZXRyaWNzLmRlc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgICAgaWYgKGlzTmFOKHRoaXMuY2FwSGVpZ2h0KSkgewogICAgICAgIHRoaXMuY2FwSGVpZ2h0ID0gbWV0cmljcy5jYXBIZWlnaHQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuYm9sZCA9IC9ib2xkL2dpLnRlc3QoZm9udE5hbWUpOwogICAgdGhpcy5pdGFsaWMgPSAvb2JsaXF1ZXxpdGFsaWMvZ2kudGVzdChmb250TmFtZSk7CiAgICB0aGlzLmJsYWNrID0gL0JsYWNrL2cudGVzdChuYW1lKTsKICAgIGNvbnN0IGlzTmFycm93ID0gL05hcnJvdy9nLnRlc3QobmFtZSk7CiAgICB0aGlzLnJlbWVhc3VyZSA9ICghaXNTdGFuZGFyZEZvbnQgfHwgaXNOYXJyb3cpICYmIE9iamVjdC5rZXlzKHRoaXMud2lkdGhzKS5sZW5ndGggPiAwOwogICAgaWYgKChpc1N0YW5kYXJkRm9udCB8fCBpc01hcHBlZFRvU3RhbmRhcmRGb250KSAmJiB0eXBlID09PSAiQ0lERm9udFR5cGUyIiAmJiB0aGlzLmNpZEVuY29kaW5nLnN0YXJ0c1dpdGgoIklkZW50aXR5LSIpKSB7CiAgICAgIGNvbnN0IGNpZFRvR2lkTWFwID0gcHJvcGVydGllcy5jaWRUb0dpZE1hcDsKICAgICAgY29uc3QgbWFwID0gW107CiAgICAgIGFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAobWFwLCBnZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMoKSk7CiAgICAgIGlmICgvQXJpYWwtP0JsYWNrL2kudGVzdChuYW1lKSkgewogICAgICAgIGFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAobWFwLCBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2soKSk7CiAgICAgIH0gZWxzZSBpZiAoL0NhbGlicmkvaS50ZXN0KG5hbWUpKSB7CiAgICAgICAgYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChtYXAsIGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSgpKTsKICAgICAgfQogICAgICBpZiAoY2lkVG9HaWRNYXApIHsKICAgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIG1hcCkgewogICAgICAgICAgY29uc3QgY2lkID0gbWFwW2NoYXJDb2RlXTsKICAgICAgICAgIGlmIChjaWRUb0dpZE1hcFtjaWRdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBjaWRUb0dpZE1hcFtjaWRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY2lkVG9HaWRNYXAubGVuZ3RoICE9PSB0aGlzLnRvVW5pY29kZS5sZW5ndGggJiYgcHJvcGVydGllcy5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCAmJiB0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSB7CiAgICAgICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSB7CiAgICAgICAgICAgIGNvbnN0IGNpZCA9IG1hcFtjaGFyQ29kZV07CiAgICAgICAgICAgIGlmIChjaWRUb0dpZE1hcFtjaWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IHVuaWNvZGVDaGFyQ29kZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghKHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApKSB7CiAgICAgICAgdGhpcy50b1VuaWNvZGUuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIHVuaWNvZGVDaGFyQ29kZSkgewogICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSB1bmljb2RlQ2hhckNvZGU7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbWFwOwogICAgICB0aGlzLnRvVW5pY29kZSA9IG5ldyBUb1VuaWNvZGVNYXAobWFwKTsKICAgIH0gZWxzZSBpZiAoL1N5bWJvbC9pLnRlc3QoZm9udE5hbWUpKSB7CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcihTeW1ib2xTZXRFbmNvZGluZywgZ2V0R2x5cGhzVW5pY29kZSgpLCB0aGlzLmRpZmZlcmVuY2VzKTsKICAgIH0gZWxzZSBpZiAoL0RpbmdiYXRzL2kudGVzdChmb250TmFtZSkpIHsKICAgICAgdGhpcy50b0ZvbnRDaGFyID0gYnVpbGRUb0ZvbnRDaGFyKFphcGZEaW5nYmF0c0VuY29kaW5nLCBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGUoKSwgdGhpcy5kaWZmZXJlbmNlcyk7CiAgICB9IGVsc2UgaWYgKGlzU3RhbmRhcmRGb250IHx8IGlzTWFwcGVkVG9TdGFuZGFyZEZvbnQpIHsKICAgICAgY29uc3QgbWFwID0gYnVpbGRUb0ZvbnRDaGFyKHRoaXMuZGVmYXVsdEVuY29kaW5nLCBnZXRHbHlwaHNVbmljb2RlKCksIHRoaXMuZGlmZmVyZW5jZXMpOwogICAgICBpZiAodHlwZSA9PT0gIkNJREZvbnRUeXBlMiIgJiYgIXRoaXMuY2lkRW5jb2Rpbmcuc3RhcnRzV2l0aCgiSWRlbnRpdHktIikgJiYgISh0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSkgewogICAgICAgIHRoaXMudG9Vbmljb2RlLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCB1bmljb2RlQ2hhckNvZGUpIHsKICAgICAgICAgIG1hcFsrY2hhckNvZGVdID0gdW5pY29kZUNoYXJDb2RlOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG1hcDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7CiAgICAgIGNvbnN0IG1hcCA9IFtdOwogICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSA9PiB7CiAgICAgICAgaWYgKCF0aGlzLmNvbXBvc2l0ZSkgewogICAgICAgICAgY29uc3QgZ2x5cGhOYW1lID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gfHwgdGhpcy5kZWZhdWx0RW5jb2RpbmdbY2hhckNvZGVdOwogICAgICAgICAgY29uc3QgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgICAgICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CiAgICAgICAgICAgIHVuaWNvZGVDaGFyQ29kZSA9IHVuaWNvZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG1hcFsrY2hhckNvZGVdID0gdW5pY29kZUNoYXJDb2RlOwogICAgICB9KTsKICAgICAgaWYgKHRoaXMuY29tcG9zaXRlICYmIHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApIHsKICAgICAgICBpZiAoL1RhaG9tYXxWZXJkYW5hL2kudGVzdChuYW1lKSkgewogICAgICAgICAgYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChtYXAsIGdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cygpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbWFwOwogICAgfQogICAgYW1lbmRGYWxsYmFja1RvVW5pY29kZShwcm9wZXJ0aWVzKTsKICAgIHRoaXMubG9hZGVkTmFtZSA9IGZvbnROYW1lLnNwbGl0KCItIiwgMSlbMF07CiAgfQogIGNoZWNrQW5kUmVwYWlyKG5hbWUsIGZvbnQsIHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IFZBTElEX1RBQkxFUyA9IFsiT1MvMiIsICJjbWFwIiwgImhlYWQiLCAiaGhlYSIsICJobXR4IiwgIm1heHAiLCAibmFtZSIsICJwb3N0IiwgImxvY2EiLCAiZ2x5ZiIsICJmcGdtIiwgInByZXAiLCAiY3Z0ICIsICJDRkYgIl07CiAgICBmdW5jdGlvbiByZWFkVGFibGVzKGZpbGUsIG51bVRhYmxlcykgewogICAgICBjb25zdCB0YWJsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICB0YWJsZXNbIk9TLzIiXSA9IG51bGw7CiAgICAgIHRhYmxlcy5jbWFwID0gbnVsbDsKICAgICAgdGFibGVzLmhlYWQgPSBudWxsOwogICAgICB0YWJsZXMuaGhlYSA9IG51bGw7CiAgICAgIHRhYmxlcy5obXR4ID0gbnVsbDsKICAgICAgdGFibGVzLm1heHAgPSBudWxsOwogICAgICB0YWJsZXMubmFtZSA9IG51bGw7CiAgICAgIHRhYmxlcy5wb3N0ID0gbnVsbDsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgewogICAgICAgIGNvbnN0IHRhYmxlID0gcmVhZFRhYmxlRW50cnkoZmlsZSk7CiAgICAgICAgaWYgKCFWQUxJRF9UQUJMRVMuaW5jbHVkZXModGFibGUudGFnKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0YWJsZS5sZW5ndGggPT09IDApIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0YWJsZXNbdGFibGUudGFnXSA9IHRhYmxlOwogICAgICB9CiAgICAgIHJldHVybiB0YWJsZXM7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkVGFibGVFbnRyeShmaWxlKSB7CiAgICAgIGNvbnN0IHRhZyA9IGZpbGUuZ2V0U3RyaW5nKDQpOwogICAgICBjb25zdCBjaGVja3N1bSA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgY29uc3Qgb2Zmc2V0ID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICBjb25zdCBsZW5ndGggPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CiAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBmaWxlLnBvczsKICAgICAgZmlsZS5wb3MgPSBmaWxlLnN0YXJ0IHx8IDA7CiAgICAgIGZpbGUuc2tpcChvZmZzZXQpOwogICAgICBjb25zdCBkYXRhID0gZmlsZS5nZXRCeXRlcyhsZW5ndGgpOwogICAgICBmaWxlLnBvcyA9IHByZXZpb3VzUG9zaXRpb247CiAgICAgIGlmICh0YWcgPT09ICJoZWFkIikgewogICAgICAgIGRhdGFbOF0gPSBkYXRhWzldID0gZGF0YVsxMF0gPSBkYXRhWzExXSA9IDA7CiAgICAgICAgZGF0YVsxN10gfD0gMHgyMDsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHRhZywKICAgICAgICBjaGVja3N1bSwKICAgICAgICBsZW5ndGgsCiAgICAgICAgb2Zmc2V0LAogICAgICAgIGRhdGEKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRPcGVuVHlwZUhlYWRlcih0dGYpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB2ZXJzaW9uOiB0dGYuZ2V0U3RyaW5nKDQpLAogICAgICAgIG51bVRhYmxlczogdHRmLmdldFVpbnQxNigpLAogICAgICAgIHNlYXJjaFJhbmdlOiB0dGYuZ2V0VWludDE2KCksCiAgICAgICAgZW50cnlTZWxlY3RvcjogdHRmLmdldFVpbnQxNigpLAogICAgICAgIHJhbmdlU2hpZnQ6IHR0Zi5nZXRVaW50MTYoKQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkhlYWRlcih0dGMpIHsKICAgICAgY29uc3QgdHRjVGFnID0gdHRjLmdldFN0cmluZyg0KTsKICAgICAgYXNzZXJ0KHR0Y1RhZyA9PT0gInR0Y2YiLCAiTXVzdCBiZSBhIFRydWVUeXBlIENvbGxlY3Rpb24gZm9udC4iKTsKICAgICAgY29uc3QgbWFqb3JWZXJzaW9uID0gdHRjLmdldFVpbnQxNigpOwogICAgICBjb25zdCBtaW5vclZlcnNpb24gPSB0dGMuZ2V0VWludDE2KCk7CiAgICAgIGNvbnN0IG51bUZvbnRzID0gdHRjLmdldEludDMyKCkgPj4+IDA7CiAgICAgIGNvbnN0IG9mZnNldFRhYmxlID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtRm9udHM7IGkrKykgewogICAgICAgIG9mZnNldFRhYmxlLnB1c2godHRjLmdldEludDMyKCkgPj4+IDApOwogICAgICB9CiAgICAgIGNvbnN0IGhlYWRlciA9IHsKICAgICAgICB0dGNUYWcsCiAgICAgICAgbWFqb3JWZXJzaW9uLAogICAgICAgIG1pbm9yVmVyc2lvbiwKICAgICAgICBudW1Gb250cywKICAgICAgICBvZmZzZXRUYWJsZQogICAgICB9OwogICAgICBzd2l0Y2ggKG1ham9yVmVyc2lvbikgewogICAgICAgIGNhc2UgMToKICAgICAgICAgIHJldHVybiBoZWFkZXI7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgaGVhZGVyLmRzaWdUYWcgPSB0dGMuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICAgIGhlYWRlci5kc2lnTGVuZ3RoID0gdHRjLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgICBoZWFkZXIuZHNpZ09mZnNldCA9IHR0Yy5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgcmV0dXJuIGhlYWRlcjsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBtYWpvclZlcnNpb246ICR7bWFqb3JWZXJzaW9ufS5gKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhKHR0YywgZm9udE5hbWUpIHsKICAgICAgY29uc3QgewogICAgICAgIG51bUZvbnRzLAogICAgICAgIG9mZnNldFRhYmxlCiAgICAgIH0gPSByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyKHR0Yyk7CiAgICAgIGNvbnN0IGZvbnROYW1lUGFydHMgPSBmb250TmFtZS5zcGxpdCgiKyIpOwogICAgICBsZXQgZmFsbGJhY2tEYXRhOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUZvbnRzOyBpKyspIHsKICAgICAgICB0dGMucG9zID0gKHR0Yy5zdGFydCB8fCAwKSArIG9mZnNldFRhYmxlW2ldOwogICAgICAgIGNvbnN0IHBvdGVudGlhbEhlYWRlciA9IHJlYWRPcGVuVHlwZUhlYWRlcih0dGMpOwogICAgICAgIGNvbnN0IHBvdGVudGlhbFRhYmxlcyA9IHJlYWRUYWJsZXModHRjLCBwb3RlbnRpYWxIZWFkZXIubnVtVGFibGVzKTsKICAgICAgICBpZiAoIXBvdGVudGlhbFRhYmxlcy5uYW1lKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ1RydWVUeXBlIENvbGxlY3Rpb24gZm9udCBtdXN0IGNvbnRhaW4gYSAibmFtZSIgdGFibGUuJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IFtuYW1lVGFibGVdID0gcmVhZE5hbWVUYWJsZShwb3RlbnRpYWxUYWJsZXMubmFtZSk7CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gbmFtZVRhYmxlLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCBrayA9IG5hbWVUYWJsZVtqXS5sZW5ndGg7IGsgPCBrazsgaysrKSB7CiAgICAgICAgICAgIGNvbnN0IG5hbWVFbnRyeSA9IG5hbWVUYWJsZVtqXVtrXT8ucmVwbGFjZUFsbCgvXHMvZywgIiIpOwogICAgICAgICAgICBpZiAoIW5hbWVFbnRyeSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuYW1lRW50cnkgPT09IGZvbnROYW1lKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGhlYWRlcjogcG90ZW50aWFsSGVhZGVyLAogICAgICAgICAgICAgICAgdGFibGVzOiBwb3RlbnRpYWxUYWJsZXMKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb250TmFtZVBhcnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgZm9udE5hbWVQYXJ0cykgewogICAgICAgICAgICAgIGlmIChuYW1lRW50cnkgPT09IHBhcnQpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgbmFtZTogcGFydCwKICAgICAgICAgICAgICAgICAgaGVhZGVyOiBwb3RlbnRpYWxIZWFkZXIsCiAgICAgICAgICAgICAgICAgIHRhYmxlczogcG90ZW50aWFsVGFibGVzCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZmFsbGJhY2tEYXRhKSB7CiAgICAgICAgd2FybihgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBkb2VzIG5vdCBjb250YWluICIke2ZvbnROYW1lfSIgZm9udCwgYCArIGBmYWxsaW5nIGJhY2sgdG8gIiR7ZmFsbGJhY2tEYXRhLm5hbWV9IiBmb250IGluc3RlYWQuYCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGhlYWRlcjogZmFsbGJhY2tEYXRhLmhlYWRlciwKICAgICAgICAgIHRhYmxlczogZmFsbGJhY2tEYXRhLnRhYmxlcwogICAgICAgIH07CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBUcnVlVHlwZSBDb2xsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gIiR7Zm9udE5hbWV9IiBmb250LmApOwogICAgfQogICAgZnVuY3Rpb24gcmVhZENtYXBUYWJsZShjbWFwLCBmaWxlLCBpc1N5bWJvbGljRm9udCwgaGFzRW5jb2RpbmcpIHsKICAgICAgaWYgKCFjbWFwKSB7CiAgICAgICAgd2FybigiTm8gY21hcCB0YWJsZSBhdmFpbGFibGUuIik7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBsYXRmb3JtSWQ6IC0xLAogICAgICAgICAgZW5jb2RpbmdJZDogLTEsCiAgICAgICAgICBtYXBwaW5nczogW10sCiAgICAgICAgICBoYXNTaG9ydENtYXA6IGZhbHNlCiAgICAgICAgfTsKICAgICAgfQogICAgICBsZXQgc2VnbWVudDsKICAgICAgbGV0IHN0YXJ0ID0gKGZpbGUuc3RhcnQgfHwgMCkgKyBjbWFwLm9mZnNldDsKICAgICAgZmlsZS5wb3MgPSBzdGFydDsKICAgICAgZmlsZS5za2lwKDIpOwogICAgICBjb25zdCBudW1UYWJsZXMgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICBsZXQgcG90ZW50aWFsVGFibGU7CiAgICAgIGxldCBjYW5CcmVhayA9IGZhbHNlOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7CiAgICAgICAgY29uc3QgcGxhdGZvcm1JZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgY29uc3QgZW5jb2RpbmdJZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgIGxldCB1c2VUYWJsZSA9IGZhbHNlOwogICAgICAgIGlmIChwb3RlbnRpYWxUYWJsZT8ucGxhdGZvcm1JZCA9PT0gcGxhdGZvcm1JZCAmJiBwb3RlbnRpYWxUYWJsZT8uZW5jb2RpbmdJZCA9PT0gZW5jb2RpbmdJZCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChwbGF0Zm9ybUlkID09PSAwICYmIChlbmNvZGluZ0lkID09PSAwIHx8IGVuY29kaW5nSWQgPT09IDEgfHwgZW5jb2RpbmdJZCA9PT0gMykpIHsKICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKHBsYXRmb3JtSWQgPT09IDEgJiYgZW5jb2RpbmdJZCA9PT0gMCkgewogICAgICAgICAgdXNlVGFibGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAocGxhdGZvcm1JZCA9PT0gMyAmJiBlbmNvZGluZ0lkID09PSAxICYmIChoYXNFbmNvZGluZyB8fCAhcG90ZW50aWFsVGFibGUpKSB7CiAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7CiAgICAgICAgICBpZiAoIWlzU3ltYm9saWNGb250KSB7CiAgICAgICAgICAgIGNhbkJyZWFrID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGlzU3ltYm9saWNGb250ICYmIHBsYXRmb3JtSWQgPT09IDMgJiYgZW5jb2RpbmdJZCA9PT0gMCkgewogICAgICAgICAgdXNlVGFibGUgPSB0cnVlOwogICAgICAgICAgbGV0IGNvcnJlY3RseVNvcnRlZCA9IHRydWU7CiAgICAgICAgICBpZiAoaSA8IG51bVRhYmxlcyAtIDEpIHsKICAgICAgICAgICAgY29uc3QgbmV4dEJ5dGVzID0gZmlsZS5wZWVrQnl0ZXMoMiksCiAgICAgICAgICAgICAgbmV4dFBsYXRmb3JtSWQgPSBpbnQxNihuZXh0Qnl0ZXNbMF0sIG5leHRCeXRlc1sxXSk7CiAgICAgICAgICAgIGlmIChuZXh0UGxhdGZvcm1JZCA8IHBsYXRmb3JtSWQpIHsKICAgICAgICAgICAgICBjb3JyZWN0bHlTb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvcnJlY3RseVNvcnRlZCkgewogICAgICAgICAgICBjYW5CcmVhayA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh1c2VUYWJsZSkgewogICAgICAgICAgcG90ZW50aWFsVGFibGUgPSB7CiAgICAgICAgICAgIHBsYXRmb3JtSWQsCiAgICAgICAgICAgIGVuY29kaW5nSWQsCiAgICAgICAgICAgIG9mZnNldAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgaWYgKGNhbkJyZWFrKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHBvdGVudGlhbFRhYmxlKSB7CiAgICAgICAgZmlsZS5wb3MgPSBzdGFydCArIHBvdGVudGlhbFRhYmxlLm9mZnNldDsKICAgICAgfQogICAgICBpZiAoIXBvdGVudGlhbFRhYmxlIHx8IGZpbGUucGVla0J5dGUoKSA9PT0gLTEpIHsKICAgICAgICB3YXJuKCJDb3VsZCBub3QgZmluZCBhIHByZWZlcnJlZCBjbWFwIHRhYmxlLiIpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSwKICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLAogICAgICAgICAgbWFwcGluZ3M6IFtdLAogICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0KICAgICAgY29uc3QgZm9ybWF0ID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgbGV0IGhhc1Nob3J0Q21hcCA9IGZhbHNlOwogICAgICBjb25zdCBtYXBwaW5ncyA9IFtdOwogICAgICBsZXQgaiwgZ2x5cGhJZDsKICAgICAgaWYgKGZvcm1hdCA9PT0gMCkgewogICAgICAgIGZpbGUuc2tpcCgyICsgMik7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CiAgICAgICAgICBjb25zdCBpbmRleCA9IGZpbGUuZ2V0Qnl0ZSgpOwogICAgICAgICAgaWYgKCFpbmRleCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICBjaGFyQ29kZTogaiwKICAgICAgICAgICAgZ2x5cGhJZDogaW5kZXgKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBoYXNTaG9ydENtYXAgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMikgewogICAgICAgIGZpbGUuc2tpcCgyICsgMik7CiAgICAgICAgY29uc3Qgc3ViSGVhZGVyS2V5cyA9IFtdOwogICAgICAgIGxldCBtYXhTdWJIZWFkZXJLZXkgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgICAgIGNvbnN0IHN1YkhlYWRlcktleSA9IGZpbGUuZ2V0VWludDE2KCkgPj4gMzsKICAgICAgICAgIHN1YkhlYWRlcktleXMucHVzaChzdWJIZWFkZXJLZXkpOwogICAgICAgICAgbWF4U3ViSGVhZGVyS2V5ID0gTWF0aC5tYXgoc3ViSGVhZGVyS2V5LCBtYXhTdWJIZWFkZXJLZXkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdWJIZWFkZXJzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbWF4U3ViSGVhZGVyS2V5OyBpKyspIHsKICAgICAgICAgIHN1YkhlYWRlcnMucHVzaCh7CiAgICAgICAgICAgIGZpcnN0Q29kZTogZmlsZS5nZXRVaW50MTYoKSwKICAgICAgICAgICAgZW50cnlDb3VudDogZmlsZS5nZXRVaW50MTYoKSwKICAgICAgICAgICAgaWREZWx0YTogc2lnbmVkSW50MTYoZmlsZS5nZXRCeXRlKCksIGZpbGUuZ2V0Qnl0ZSgpKSwKICAgICAgICAgICAgaWRSYW5nZVBvczogZmlsZS5wb3MgKyBmaWxlLmdldFVpbnQxNigpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgICAgaWYgKHN1YkhlYWRlcktleXNbaV0gPT09IDApIHsKICAgICAgICAgICAgZmlsZS5wb3MgPSBzdWJIZWFkZXJzWzBdLmlkUmFuZ2VQb3MgKyAyICogaTsKICAgICAgICAgICAgZ2x5cGhJZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICAgIGNoYXJDb2RlOiBpLAogICAgICAgICAgICAgIGdseXBoSWQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBzID0gc3ViSGVhZGVyc1tzdWJIZWFkZXJLZXlzW2ldXTsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMuZW50cnlDb3VudDsgaisrKSB7CiAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSAoaSA8PCA4KSArIGogKyBzLmZpcnN0Q29kZTsKICAgICAgICAgICAgICBmaWxlLnBvcyA9IHMuaWRSYW5nZVBvcyArIDIgKiBqOwogICAgICAgICAgICAgIGdseXBoSWQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgICAgICAgIGlmIChnbHlwaElkICE9PSAwKSB7CiAgICAgICAgICAgICAgICBnbHlwaElkID0gKGdseXBoSWQgKyBzLmlkRGVsdGEpICUgNjU1MzY7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICAgICAgY2hhckNvZGUsCiAgICAgICAgICAgICAgICBnbHlwaElkCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSA0KSB7CiAgICAgICAgZmlsZS5za2lwKDIgKyAyKTsKICAgICAgICBjb25zdCBzZWdDb3VudCA9IGZpbGUuZ2V0VWludDE2KCkgPj4gMTsKICAgICAgICBmaWxlLnNraXAoNik7CiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBbXTsKICAgICAgICBsZXQgc2VnSW5kZXg7CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnRzLnB1c2goewogICAgICAgICAgICBlbmQ6IGZpbGUuZ2V0VWludDE2KCkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBmaWxlLnNraXAoMik7CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnRzW3NlZ0luZGV4XS5zdGFydCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgfQogICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CiAgICAgICAgICBzZWdtZW50c1tzZWdJbmRleF0uZGVsdGEgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgIH0KICAgICAgICBsZXQgb2Zmc2V0c0NvdW50ID0gMCwKICAgICAgICAgIG9mZnNldEluZGV4OwogICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CiAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdOwogICAgICAgICAgY29uc3QgcmFuZ2VPZmZzZXQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgICAgaWYgKCFyYW5nZU9mZnNldCkgewogICAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gLTE7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgb2Zmc2V0SW5kZXggPSAocmFuZ2VPZmZzZXQgPj4gMSkgLSAoc2VnQ291bnQgLSBzZWdJbmRleCk7CiAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gb2Zmc2V0SW5kZXg7CiAgICAgICAgICBvZmZzZXRzQ291bnQgPSBNYXRoLm1heChvZmZzZXRzQ291bnQsIG9mZnNldEluZGV4ICsgc2VnbWVudC5lbmQgLSBzZWdtZW50LnN0YXJ0ICsgMSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9mZnNldHMgPSBbXTsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgb2Zmc2V0c0NvdW50OyBqKyspIHsKICAgICAgICAgIG9mZnNldHMucHVzaChmaWxlLmdldFVpbnQxNigpKTsKICAgICAgICB9CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnQgPSBzZWdtZW50c1tzZWdJbmRleF07CiAgICAgICAgICBzdGFydCA9IHNlZ21lbnQuc3RhcnQ7CiAgICAgICAgICBjb25zdCBlbmQgPSBzZWdtZW50LmVuZDsKICAgICAgICAgIGNvbnN0IGRlbHRhID0gc2VnbWVudC5kZWx0YTsKICAgICAgICAgIG9mZnNldEluZGV4ID0gc2VnbWVudC5vZmZzZXRJbmRleDsKICAgICAgICAgIGZvciAoaiA9IHN0YXJ0OyBqIDw9IGVuZDsgaisrKSB7CiAgICAgICAgICAgIGlmIChqID09PSAweGZmZmYpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbHlwaElkID0gb2Zmc2V0SW5kZXggPCAwID8gaiA6IG9mZnNldHNbb2Zmc2V0SW5kZXggKyBqIC0gc3RhcnRdOwogICAgICAgICAgICBnbHlwaElkID0gZ2x5cGhJZCArIGRlbHRhICYgMHhmZmZmOwogICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgICBjaGFyQ29kZTogaiwKICAgICAgICAgICAgICBnbHlwaElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDYpIHsKICAgICAgICBmaWxlLnNraXAoMiArIDIpOwogICAgICAgIGNvbnN0IGZpcnN0Q29kZSA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgY29uc3QgZW50cnlDb3VudCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IGVudHJ5Q291bnQ7IGorKykgewogICAgICAgICAgZ2x5cGhJZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGZpcnN0Q29kZSArIGo7CiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgY2hhckNvZGUsCiAgICAgICAgICAgIGdseXBoSWQKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDEyKSB7CiAgICAgICAgZmlsZS5za2lwKDIgKyA0ICsgNCk7CiAgICAgICAgY29uc3Qgbkdyb3VwcyA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbkdyb3VwczsgaisrKSB7CiAgICAgICAgICBjb25zdCBzdGFydENoYXJDb2RlID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgY29uc3QgZW5kQ2hhckNvZGUgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgICBsZXQgZ2x5cGhDb2RlID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgZm9yIChsZXQgY2hhckNvZGUgPSBzdGFydENoYXJDb2RlOyBjaGFyQ29kZSA8PSBlbmRDaGFyQ29kZTsgY2hhckNvZGUrKykgewogICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgICBjaGFyQ29kZSwKICAgICAgICAgICAgICBnbHlwaElkOiBnbHlwaENvZGUrKwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigiY21hcCB0YWJsZSBoYXMgdW5zdXBwb3J0ZWQgZm9ybWF0OiAiICsgZm9ybWF0KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgcGxhdGZvcm1JZDogLTEsCiAgICAgICAgICBlbmNvZGluZ0lkOiAtMSwKICAgICAgICAgIG1hcHBpbmdzOiBbXSwKICAgICAgICAgIGhhc1Nob3J0Q21hcDogZmFsc2UKICAgICAgICB9OwogICAgICB9CiAgICAgIG1hcHBpbmdzLnNvcnQoKGEsIGIpID0+IGEuY2hhckNvZGUgLSBiLmNoYXJDb2RlKTsKICAgICAgY29uc3QgZmluYWxNYXBwaW5ncyA9IFtdLAogICAgICAgIHNlZW5DaGFyQ29kZXMgPSBuZXcgU2V0KCk7CiAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHBpbmdzKSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgY2hhckNvZGUKICAgICAgICB9ID0gbWFwOwogICAgICAgIGlmIChzZWVuQ2hhckNvZGVzLmhhcyhjaGFyQ29kZSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBzZWVuQ2hhckNvZGVzLmFkZChjaGFyQ29kZSk7CiAgICAgICAgZmluYWxNYXBwaW5ncy5wdXNoKG1hcCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBwbGF0Zm9ybUlkOiBwb3RlbnRpYWxUYWJsZS5wbGF0Zm9ybUlkLAogICAgICAgIGVuY29kaW5nSWQ6IHBvdGVudGlhbFRhYmxlLmVuY29kaW5nSWQsCiAgICAgICAgbWFwcGluZ3M6IGZpbmFsTWFwcGluZ3MsCiAgICAgICAgaGFzU2hvcnRDbWFwCiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBzYW5pdGl6ZU1ldHJpY3MoZmlsZSwgaGVhZGVyLCBtZXRyaWNzLCBoZWFkVGFibGUsIG51bUdseXBocywgZHVwRmlyc3RFbnRyeSkgewogICAgICBpZiAoIWhlYWRlcikgewogICAgICAgIGlmIChtZXRyaWNzKSB7CiAgICAgICAgICBtZXRyaWNzLmRhdGEgPSBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZmlsZS5wb3MgPSAoZmlsZS5zdGFydCB8fCAwKSArIGhlYWRlci5vZmZzZXQ7CiAgICAgIGZpbGUucG9zICs9IDQ7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGNvbnN0IGNhcmV0T2Zmc2V0ID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgZmlsZS5wb3MgKz0gODsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgbGV0IG51bU9mTWV0cmljcyA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgIGlmIChjYXJldE9mZnNldCAhPT0gMCkgewogICAgICAgIGNvbnN0IG1hY1N0eWxlID0gaW50MTYoaGVhZFRhYmxlLmRhdGFbNDRdLCBoZWFkVGFibGUuZGF0YVs0NV0pOwogICAgICAgIGlmICghKG1hY1N0eWxlICYgMikpIHsKICAgICAgICAgIGhlYWRlci5kYXRhWzIyXSA9IDA7CiAgICAgICAgICBoZWFkZXIuZGF0YVsyM10gPSAwOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobnVtT2ZNZXRyaWNzID4gbnVtR2x5cGhzKSB7CiAgICAgICAgaW5mbyhgVGhlIG51bU9mTWV0cmljcyAoJHtudW1PZk1ldHJpY3N9KSBzaG91bGQgbm90IGJlIGAgKyBgZ3JlYXRlciB0aGFuIHRoZSBudW1HbHlwaHMgKCR7bnVtR2x5cGhzfSkuYCk7CiAgICAgICAgbnVtT2ZNZXRyaWNzID0gbnVtR2x5cGhzOwogICAgICAgIGhlYWRlci5kYXRhWzM0XSA9IChudW1PZk1ldHJpY3MgJiAweGZmMDApID4+IDg7CiAgICAgICAgaGVhZGVyLmRhdGFbMzVdID0gbnVtT2ZNZXRyaWNzICYgMHgwMGZmOwogICAgICB9CiAgICAgIGNvbnN0IG51bU9mU2lkZWJlYXJpbmdzID0gbnVtR2x5cGhzIC0gbnVtT2ZNZXRyaWNzOwogICAgICBjb25zdCBudW1NaXNzaW5nID0gbnVtT2ZTaWRlYmVhcmluZ3MgLSAobWV0cmljcy5sZW5ndGggLSBudW1PZk1ldHJpY3MgKiA0ID4+IDEpOwogICAgICBpZiAobnVtTWlzc2luZyA+IDApIHsKICAgICAgICBjb25zdCBlbnRyaWVzID0gbmV3IFVpbnQ4QXJyYXkobWV0cmljcy5sZW5ndGggKyBudW1NaXNzaW5nICogMik7CiAgICAgICAgZW50cmllcy5zZXQobWV0cmljcy5kYXRhKTsKICAgICAgICBpZiAoZHVwRmlyc3RFbnRyeSkgewogICAgICAgICAgZW50cmllc1ttZXRyaWNzLmxlbmd0aF0gPSBtZXRyaWNzLmRhdGFbMl07CiAgICAgICAgICBlbnRyaWVzW21ldHJpY3MubGVuZ3RoICsgMV0gPSBtZXRyaWNzLmRhdGFbM107CiAgICAgICAgfQogICAgICAgIG1ldHJpY3MuZGF0YSA9IGVudHJpZXM7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNhbml0aXplR2x5cGgoc291cmNlLCBzb3VyY2VTdGFydCwgc291cmNlRW5kLCBkZXN0LCBkZXN0U3RhcnQsIGhpbnRzVmFsaWQpIHsKICAgICAgY29uc3QgZ2x5cGhQcm9maWxlID0gewogICAgICAgIGxlbmd0aDogMCwKICAgICAgICBzaXplT2ZJbnN0cnVjdGlvbnM6IDAKICAgICAgfTsKICAgICAgaWYgKHNvdXJjZVN0YXJ0IDwgMCB8fCBzb3VyY2VTdGFydCA+PSBzb3VyY2UubGVuZ3RoIHx8IHNvdXJjZUVuZCA+IHNvdXJjZS5sZW5ndGggfHwgc291cmNlRW5kIC0gc291cmNlU3RhcnQgPD0gMTIpIHsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGNvbnN0IGdseWYgPSBzb3VyY2Uuc3ViYXJyYXkoc291cmNlU3RhcnQsIHNvdXJjZUVuZCk7CiAgICAgIGNvbnN0IHhNaW4gPSBzaWduZWRJbnQxNihnbHlmWzJdLCBnbHlmWzNdKTsKICAgICAgY29uc3QgeU1pbiA9IHNpZ25lZEludDE2KGdseWZbNF0sIGdseWZbNV0pOwogICAgICBjb25zdCB4TWF4ID0gc2lnbmVkSW50MTYoZ2x5Zls2XSwgZ2x5Zls3XSk7CiAgICAgIGNvbnN0IHlNYXggPSBzaWduZWRJbnQxNihnbHlmWzhdLCBnbHlmWzldKTsKICAgICAgaWYgKHhNaW4gPiB4TWF4KSB7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihnbHlmLCAyLCB4TWF4KTsKICAgICAgICB3cml0ZVNpZ25lZEludDE2KGdseWYsIDYsIHhNaW4pOwogICAgICB9CiAgICAgIGlmICh5TWluID4geU1heCkgewogICAgICAgIHdyaXRlU2lnbmVkSW50MTYoZ2x5ZiwgNCwgeU1heCk7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihnbHlmLCA4LCB5TWluKTsKICAgICAgfQogICAgICBjb25zdCBjb250b3Vyc0NvdW50ID0gc2lnbmVkSW50MTYoZ2x5ZlswXSwgZ2x5ZlsxXSk7CiAgICAgIGlmIChjb250b3Vyc0NvdW50IDwgMCkgewogICAgICAgIGlmIChjb250b3Vyc0NvdW50IDwgLTEpIHsKICAgICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICAgICAgfQogICAgICAgIGRlc3Quc2V0KGdseWYsIGRlc3RTdGFydCk7CiAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseWYubGVuZ3RoOwogICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICAgIH0KICAgICAgbGV0IGksCiAgICAgICAgaiA9IDEwLAogICAgICAgIGZsYWdzQ291bnQgPSAwOwogICAgICBmb3IgKGkgPSAwOyBpIDwgY29udG91cnNDb3VudDsgaSsrKSB7CiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSBnbHlmW2pdIDw8IDggfCBnbHlmW2ogKyAxXTsKICAgICAgICBmbGFnc0NvdW50ID0gZW5kUG9pbnQgKyAxOwogICAgICAgIGogKz0gMjsKICAgICAgfQogICAgICBjb25zdCBpbnN0cnVjdGlvbnNTdGFydCA9IGo7CiAgICAgIGNvbnN0IGluc3RydWN0aW9uc0xlbmd0aCA9IGdseWZbal0gPDwgOCB8IGdseWZbaiArIDFdOwogICAgICBnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zTGVuZ3RoOwogICAgICBqICs9IDIgKyBpbnN0cnVjdGlvbnNMZW5ndGg7CiAgICAgIGNvbnN0IGluc3RydWN0aW9uc0VuZCA9IGo7CiAgICAgIGxldCBjb29yZGluYXRlc0xlbmd0aCA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBmbGFnc0NvdW50OyBpKyspIHsKICAgICAgICBjb25zdCBmbGFnID0gZ2x5ZltqKytdOwogICAgICAgIGlmIChmbGFnICYgMHhjMCkgewogICAgICAgICAgZ2x5ZltqIC0gMV0gPSBmbGFnICYgMHgzZjsKICAgICAgICB9CiAgICAgICAgbGV0IHhMZW5ndGggPSAyOwogICAgICAgIGlmIChmbGFnICYgMikgewogICAgICAgICAgeExlbmd0aCA9IDE7CiAgICAgICAgfSBlbHNlIGlmIChmbGFnICYgMTYpIHsKICAgICAgICAgIHhMZW5ndGggPSAwOwogICAgICAgIH0KICAgICAgICBsZXQgeUxlbmd0aCA9IDI7CiAgICAgICAgaWYgKGZsYWcgJiA0KSB7CiAgICAgICAgICB5TGVuZ3RoID0gMTsKICAgICAgICB9IGVsc2UgaWYgKGZsYWcgJiAzMikgewogICAgICAgICAgeUxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHh5TGVuZ3RoID0geExlbmd0aCArIHlMZW5ndGg7CiAgICAgICAgY29vcmRpbmF0ZXNMZW5ndGggKz0geHlMZW5ndGg7CiAgICAgICAgaWYgKGZsYWcgJiA4KSB7CiAgICAgICAgICBjb25zdCByZXBlYXQgPSBnbHlmW2orK107CiAgICAgICAgICBpZiAocmVwZWF0ID09PSAwKSB7CiAgICAgICAgICAgIGdseWZbaiAtIDFdIF49IDg7CiAgICAgICAgICB9CiAgICAgICAgICBpICs9IHJlcGVhdDsKICAgICAgICAgIGNvb3JkaW5hdGVzTGVuZ3RoICs9IHJlcGVhdCAqIHh5TGVuZ3RoOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY29vcmRpbmF0ZXNMZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGxldCBnbHlwaERhdGFMZW5ndGggPSBqICsgY29vcmRpbmF0ZXNMZW5ndGg7CiAgICAgIGlmIChnbHlwaERhdGFMZW5ndGggPiBnbHlmLmxlbmd0aCkgewogICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICAgIH0KICAgICAgaWYgKCFoaW50c1ZhbGlkICYmIGluc3RydWN0aW9uc0xlbmd0aCA+IDApIHsKICAgICAgICBkZXN0LnNldChnbHlmLnN1YmFycmF5KDAsIGluc3RydWN0aW9uc1N0YXJ0KSwgZGVzdFN0YXJ0KTsKICAgICAgICBkZXN0LnNldChbMCwgMF0sIGRlc3RTdGFydCArIGluc3RydWN0aW9uc1N0YXJ0KTsKICAgICAgICBkZXN0LnNldChnbHlmLnN1YmFycmF5KGluc3RydWN0aW9uc0VuZCwgZ2x5cGhEYXRhTGVuZ3RoKSwgZGVzdFN0YXJ0ICsgaW5zdHJ1Y3Rpb25zU3RhcnQgKyAyKTsKICAgICAgICBnbHlwaERhdGFMZW5ndGggLT0gaW5zdHJ1Y3Rpb25zTGVuZ3RoOwogICAgICAgIGlmIChnbHlmLmxlbmd0aCAtIGdseXBoRGF0YUxlbmd0aCA+IDMpIHsKICAgICAgICAgIGdseXBoRGF0YUxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aCArIDMgJiB+MzsKICAgICAgICB9CiAgICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseXBoRGF0YUxlbmd0aDsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGlmIChnbHlmLmxlbmd0aCAtIGdseXBoRGF0YUxlbmd0aCA+IDMpIHsKICAgICAgICBnbHlwaERhdGFMZW5ndGggPSBnbHlwaERhdGFMZW5ndGggKyAzICYgfjM7CiAgICAgICAgZGVzdC5zZXQoZ2x5Zi5zdWJhcnJheSgwLCBnbHlwaERhdGFMZW5ndGgpLCBkZXN0U3RhcnQpOwogICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlwaERhdGFMZW5ndGg7CiAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKICAgICAgfQogICAgICBkZXN0LnNldChnbHlmLCBkZXN0U3RhcnQpOwogICAgICBnbHlwaFByb2ZpbGUubGVuZ3RoID0gZ2x5Zi5sZW5ndGg7CiAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICB9CiAgICBmdW5jdGlvbiBzYW5pdGl6ZUhlYWQoaGVhZCwgbnVtR2x5cGhzLCBsb2NhTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBoZWFkLmRhdGE7CiAgICAgIGNvbnN0IHZlcnNpb24gPSBpbnQzMihkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKICAgICAgaWYgKHZlcnNpb24gPj4gMTYgIT09IDEpIHsKICAgICAgICBpbmZvKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIHZlcnNpb24gaW4gaGVhZCB0YWJsZTogIiArIHZlcnNpb24pOwogICAgICAgIGRhdGFbMF0gPSAwOwogICAgICAgIGRhdGFbMV0gPSAxOwogICAgICAgIGRhdGFbMl0gPSAwOwogICAgICAgIGRhdGFbM10gPSAwOwogICAgICB9CiAgICAgIGNvbnN0IGluZGV4VG9Mb2NGb3JtYXQgPSBpbnQxNihkYXRhWzUwXSwgZGF0YVs1MV0pOwogICAgICBpZiAoaW5kZXhUb0xvY0Zvcm1hdCA8IDAgfHwgaW5kZXhUb0xvY0Zvcm1hdCA+IDEpIHsKICAgICAgICBpbmZvKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIGluZGV4VG9Mb2NGb3JtYXQgaW4gaGVhZCB0YWJsZTogIiArIGluZGV4VG9Mb2NGb3JtYXQpOwogICAgICAgIGNvbnN0IG51bUdseXBoc1BsdXNPbmUgPSBudW1HbHlwaHMgKyAxOwogICAgICAgIGlmIChsb2NhTGVuZ3RoID09PSBudW1HbHlwaHNQbHVzT25lIDw8IDEpIHsKICAgICAgICAgIGRhdGFbNTBdID0gMDsKICAgICAgICAgIGRhdGFbNTFdID0gMDsKICAgICAgICB9IGVsc2UgaWYgKGxvY2FMZW5ndGggPT09IG51bUdseXBoc1BsdXNPbmUgPDwgMikgewogICAgICAgICAgZGF0YVs1MF0gPSAwOwogICAgICAgICAgZGF0YVs1MV0gPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkNvdWxkIG5vdCBmaXggaW5kZXhUb0xvY0Zvcm1hdDogIiArIGluZGV4VG9Mb2NGb3JtYXQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc2FuaXRpemVHbHlwaExvY2F0aW9ucyhsb2NhLCBnbHlmLCBudW1HbHlwaHMsIGlzR2x5cGhMb2NhdGlvbnNMb25nLCBoaW50c1ZhbGlkLCBkdXBGaXJzdEVudHJ5LCBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpIHsKICAgICAgbGV0IGl0ZW1TaXplLCBpdGVtRGVjb2RlLCBpdGVtRW5jb2RlOwogICAgICBpZiAoaXNHbHlwaExvY2F0aW9uc0xvbmcpIHsKICAgICAgICBpdGVtU2l6ZSA9IDQ7CiAgICAgICAgaXRlbURlY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlTG9uZyhkYXRhLCBvZmZzZXQpIHsKICAgICAgICAgIHJldHVybiBkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2IHwgZGF0YVtvZmZzZXQgKyAyXSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAzXTsKICAgICAgICB9OwogICAgICAgIGl0ZW1FbmNvZGUgPSBmdW5jdGlvbiBmb250SXRlbUVuY29kZUxvbmcoZGF0YSwgb2Zmc2V0LCB2YWx1ZSkgewogICAgICAgICAgZGF0YVtvZmZzZXRdID0gdmFsdWUgPj4+IDI0ICYgMHhmZjsKICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+PiAxNiAmIDB4ZmY7CiAgICAgICAgICBkYXRhW29mZnNldCArIDJdID0gdmFsdWUgPj4gOCAmIDB4ZmY7CiAgICAgICAgICBkYXRhW29mZnNldCArIDNdID0gdmFsdWUgJiAweGZmOwogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXRlbVNpemUgPSAyOwogICAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZShkYXRhLCBvZmZzZXQpIHsKICAgICAgICAgIHJldHVybiBkYXRhW29mZnNldF0gPDwgOSB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTsKICAgICAgICB9OwogICAgICAgIGl0ZW1FbmNvZGUgPSBmdW5jdGlvbiBmb250SXRlbUVuY29kZShkYXRhLCBvZmZzZXQsIHZhbHVlKSB7CiAgICAgICAgICBkYXRhW29mZnNldF0gPSB2YWx1ZSA+PiA5ICYgMHhmZjsKICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZSA+PiAxICYgMHhmZjsKICAgICAgICB9OwogICAgICB9CiAgICAgIGNvbnN0IG51bUdseXBoc091dCA9IGR1cEZpcnN0RW50cnkgPyBudW1HbHlwaHMgKyAxIDogbnVtR2x5cGhzOwogICAgICBjb25zdCBsb2NhRGF0YVNpemUgPSBpdGVtU2l6ZSAqICgxICsgbnVtR2x5cGhzT3V0KTsKICAgICAgY29uc3QgbG9jYURhdGEgPSBuZXcgVWludDhBcnJheShsb2NhRGF0YVNpemUpOwogICAgICBsb2NhRGF0YS5zZXQobG9jYS5kYXRhLnN1YmFycmF5KDAsIGxvY2FEYXRhU2l6ZSkpOwogICAgICBsb2NhLmRhdGEgPSBsb2NhRGF0YTsKICAgICAgY29uc3Qgb2xkR2x5ZkRhdGEgPSBnbHlmLmRhdGE7CiAgICAgIGNvbnN0IG9sZEdseWZEYXRhTGVuZ3RoID0gb2xkR2x5ZkRhdGEubGVuZ3RoOwogICAgICBjb25zdCBuZXdHbHlmRGF0YSA9IG5ldyBVaW50OEFycmF5KG9sZEdseWZEYXRhTGVuZ3RoKTsKICAgICAgbGV0IGksIGo7CiAgICAgIGNvbnN0IGxvY2FFbnRyaWVzID0gW107CiAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbnVtR2x5cGhzICsgMTsgaSsrLCBqICs9IGl0ZW1TaXplKSB7CiAgICAgICAgbGV0IG9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYURhdGEsIGopOwogICAgICAgIGlmIChvZmZzZXQgPiBvbGRHbHlmRGF0YUxlbmd0aCkgewogICAgICAgICAgb2Zmc2V0ID0gb2xkR2x5ZkRhdGFMZW5ndGg7CiAgICAgICAgfQogICAgICAgIGxvY2FFbnRyaWVzLnB1c2goewogICAgICAgICAgaW5kZXg6IGksCiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBlbmRPZmZzZXQ6IDAKICAgICAgICB9KTsKICAgICAgfQogICAgICBsb2NhRW50cmllcy5zb3J0KChhLCBiKSA9PiBhLm9mZnNldCAtIGIub2Zmc2V0KTsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CiAgICAgICAgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0ID0gbG9jYUVudHJpZXNbaSArIDFdLm9mZnNldDsKICAgICAgfQogICAgICBsb2NhRW50cmllcy5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIG9mZnNldCwKICAgICAgICAgIGVuZE9mZnNldAogICAgICAgIH0gPSBsb2NhRW50cmllc1tpXTsKICAgICAgICBpZiAob2Zmc2V0ICE9PSAwIHx8IGVuZE9mZnNldCAhPT0gMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5leHRPZmZzZXQgPSBsb2NhRW50cmllc1tpICsgMV0ub2Zmc2V0OwogICAgICAgIGlmIChuZXh0T2Zmc2V0ID09PSAwKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0ID0gbmV4dE9mZnNldDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjb25zdCBsYXN0ID0gbG9jYUVudHJpZXMuYXQoLTIpOwogICAgICBpZiAobGFzdC5vZmZzZXQgIT09IDAgJiYgbGFzdC5lbmRPZmZzZXQgPT09IDApIHsKICAgICAgICBsYXN0LmVuZE9mZnNldCA9IG9sZEdseWZEYXRhTGVuZ3RoOwogICAgICB9CiAgICAgIGNvbnN0IG1pc3NpbmdHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBsZXQgd3JpdGVPZmZzZXQgPSAwOwogICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCAwLCB3cml0ZU9mZnNldCk7CiAgICAgIGZvciAoaSA9IDAsIGogPSBpdGVtU2l6ZTsgaSA8IG51bUdseXBoczsgaSsrLCBqICs9IGl0ZW1TaXplKSB7CiAgICAgICAgY29uc3QgZ2x5cGhQcm9maWxlID0gc2FuaXRpemVHbHlwaChvbGRHbHlmRGF0YSwgbG9jYUVudHJpZXNbaV0ub2Zmc2V0LCBsb2NhRW50cmllc1tpXS5lbmRPZmZzZXQsIG5ld0dseWZEYXRhLCB3cml0ZU9mZnNldCwgaGludHNWYWxpZCk7CiAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gZ2x5cGhQcm9maWxlLmxlbmd0aDsKICAgICAgICBpZiAobmV3TGVuZ3RoID09PSAwKSB7CiAgICAgICAgICBtaXNzaW5nR2x5cGhzW2ldID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGdseXBoUHJvZmlsZS5zaXplT2ZJbnN0cnVjdGlvbnMgPiBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpIHsKICAgICAgICAgIG1heFNpemVPZkluc3RydWN0aW9ucyA9IGdseXBoUHJvZmlsZS5zaXplT2ZJbnN0cnVjdGlvbnM7CiAgICAgICAgfQogICAgICAgIHdyaXRlT2Zmc2V0ICs9IG5ld0xlbmd0aDsKICAgICAgICBpdGVtRW5jb2RlKGxvY2FEYXRhLCBqLCB3cml0ZU9mZnNldCk7CiAgICAgIH0KICAgICAgaWYgKHdyaXRlT2Zmc2V0ID09PSAwKSB7CiAgICAgICAgY29uc3Qgc2ltcGxlR2x5cGggPSBuZXcgVWludDhBcnJheShbMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNDksIDBdKTsKICAgICAgICBmb3IgKGkgPSAwLCBqID0gaXRlbVNpemU7IGkgPCBudW1HbHlwaHNPdXQ7IGkrKywgaiArPSBpdGVtU2l6ZSkgewogICAgICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgaiwgc2ltcGxlR2x5cGgubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgZ2x5Zi5kYXRhID0gc2ltcGxlR2x5cGg7CiAgICAgIH0gZWxzZSBpZiAoZHVwRmlyc3RFbnRyeSkgewogICAgICAgIGNvbnN0IGZpcnN0RW50cnlMZW5ndGggPSBpdGVtRGVjb2RlKGxvY2FEYXRhLCBpdGVtU2l6ZSk7CiAgICAgICAgaWYgKG5ld0dseWZEYXRhLmxlbmd0aCA+IGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCkgewogICAgICAgICAgZ2x5Zi5kYXRhID0gbmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgZmlyc3RFbnRyeUxlbmd0aCArIHdyaXRlT2Zmc2V0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZ2x5Zi5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZmlyc3RFbnRyeUxlbmd0aCArIHdyaXRlT2Zmc2V0KTsKICAgICAgICAgIGdseWYuZGF0YS5zZXQobmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgd3JpdGVPZmZzZXQpKTsKICAgICAgICB9CiAgICAgICAgZ2x5Zi5kYXRhLnNldChuZXdHbHlmRGF0YS5zdWJhcnJheSgwLCBmaXJzdEVudHJ5TGVuZ3RoKSwgd3JpdGVPZmZzZXQpOwogICAgICAgIGl0ZW1FbmNvZGUobG9jYS5kYXRhLCBsb2NhRGF0YS5sZW5ndGggLSBpdGVtU2l6ZSwgd3JpdGVPZmZzZXQgKyBmaXJzdEVudHJ5TGVuZ3RoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnbHlmLmRhdGEgPSBuZXdHbHlmRGF0YS5zdWJhcnJheSgwLCB3cml0ZU9mZnNldCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBtaXNzaW5nR2x5cGhzLAogICAgICAgIG1heFNpemVPZkluc3RydWN0aW9ucwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcmVhZFBvc3RTY3JpcHRUYWJsZShwb3N0LCBwcm9wZXJ0aWVzT2JqLCBtYXhwTnVtR2x5cGhzKSB7CiAgICAgIGNvbnN0IHN0YXJ0ID0gKGZvbnQuc3RhcnQgfHwgMCkgKyBwb3N0Lm9mZnNldDsKICAgICAgZm9udC5wb3MgPSBzdGFydDsKICAgICAgY29uc3QgbGVuZ3RoID0gcG9zdC5sZW5ndGgsCiAgICAgICAgZW5kID0gc3RhcnQgKyBsZW5ndGg7CiAgICAgIGNvbnN0IHZlcnNpb24gPSBmb250LmdldEludDMyKCk7CiAgICAgIGZvbnQuc2tpcCgyOCk7CiAgICAgIGxldCBnbHlwaE5hbWVzOwogICAgICBsZXQgdmFsaWQgPSB0cnVlOwogICAgICBsZXQgaTsKICAgICAgc3dpdGNoICh2ZXJzaW9uKSB7CiAgICAgICAgY2FzZSAweDAwMDEwMDAwOgogICAgICAgICAgZ2x5cGhOYW1lcyA9IE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAyMDAwMDoKICAgICAgICAgIGNvbnN0IG51bUdseXBocyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgICAgICBpZiAobnVtR2x5cGhzICE9PSBtYXhwTnVtR2x5cGhzKSB7CiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZ2x5cGhOYW1lSW5kZXhlcyA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUdseXBoczsgKytpKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZm9udC5nZXRVaW50MTYoKTsKICAgICAgICAgICAgaWYgKGluZGV4ID49IDMyNzY4KSB7CiAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbHlwaE5hbWVJbmRleGVzLnB1c2goaW5kZXgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGN1c3RvbU5hbWVzID0gW10sCiAgICAgICAgICAgIHN0ckJ1ZiA9IFtdOwogICAgICAgICAgd2hpbGUgKGZvbnQucG9zIDwgZW5kKSB7CiAgICAgICAgICAgIGNvbnN0IHN0cmluZ0xlbmd0aCA9IGZvbnQuZ2V0Qnl0ZSgpOwogICAgICAgICAgICBzdHJCdWYubGVuZ3RoID0gc3RyaW5nTGVuZ3RoOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nTGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBzdHJCdWZbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2V0Qnl0ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXN0b21OYW1lcy5wdXNoKHN0ckJ1Zi5qb2luKCIiKSk7CiAgICAgICAgICB9CiAgICAgICAgICBnbHlwaE5hbWVzID0gW107CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtR2x5cGhzOyArK2kpIHsKICAgICAgICAgICAgY29uc3QgaiA9IGdseXBoTmFtZUluZGV4ZXNbaV07CiAgICAgICAgICAgIGlmIChqIDwgMjU4KSB7CiAgICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKE1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZ1tqXSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKGN1c3RvbU5hbWVzW2ogLSAyNThdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAzMDAwMDoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB3YXJuKCJVbmtub3duL3Vuc3VwcG9ydGVkIHBvc3QgdGFibGUgdmVyc2lvbiAiICsgdmVyc2lvbik7CiAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgaWYgKHByb3BlcnRpZXNPYmouZGVmYXVsdEVuY29kaW5nKSB7CiAgICAgICAgICAgIGdseXBoTmFtZXMgPSBwcm9wZXJ0aWVzT2JqLmRlZmF1bHRFbmNvZGluZzsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHByb3BlcnRpZXNPYmouZ2x5cGhOYW1lcyA9IGdseXBoTmFtZXM7CiAgICAgIHJldHVybiB2YWxpZDsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWROYW1lVGFibGUobmFtZVRhYmxlKSB7CiAgICAgIGNvbnN0IHN0YXJ0ID0gKGZvbnQuc3RhcnQgfHwgMCkgKyBuYW1lVGFibGUub2Zmc2V0OwogICAgICBmb250LnBvcyA9IHN0YXJ0OwogICAgICBjb25zdCBuYW1lcyA9IFtbXSwgW11dLAogICAgICAgIHJlY29yZHMgPSBbXTsKICAgICAgY29uc3QgbGVuZ3RoID0gbmFtZVRhYmxlLmxlbmd0aCwKICAgICAgICBlbmQgPSBzdGFydCArIGxlbmd0aDsKICAgICAgY29uc3QgZm9ybWF0ID0gZm9udC5nZXRVaW50MTYoKTsKICAgICAgY29uc3QgRk9STUFUXzBfSEVBREVSX0xFTkdUSCA9IDY7CiAgICAgIGlmIChmb3JtYXQgIT09IDAgfHwgbGVuZ3RoIDwgRk9STUFUXzBfSEVBREVSX0xFTkdUSCkgewogICAgICAgIHJldHVybiBbbmFtZXMsIHJlY29yZHNdOwogICAgICB9CiAgICAgIGNvbnN0IG51bVJlY29yZHMgPSBmb250LmdldFVpbnQxNigpOwogICAgICBjb25zdCBzdHJpbmdzU3RhcnQgPSBmb250LmdldFVpbnQxNigpOwogICAgICBjb25zdCBOQU1FX1JFQ09SRF9MRU5HVEggPSAxMjsKICAgICAgbGV0IGksIGlpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVjb3JkcyAmJiBmb250LnBvcyArIE5BTUVfUkVDT1JEX0xFTkdUSCA8PSBlbmQ7IGkrKykgewogICAgICAgIGNvbnN0IHIgPSB7CiAgICAgICAgICBwbGF0Zm9ybTogZm9udC5nZXRVaW50MTYoKSwKICAgICAgICAgIGVuY29kaW5nOiBmb250LmdldFVpbnQxNigpLAogICAgICAgICAgbGFuZ3VhZ2U6IGZvbnQuZ2V0VWludDE2KCksCiAgICAgICAgICBuYW1lOiBmb250LmdldFVpbnQxNigpLAogICAgICAgICAgbGVuZ3RoOiBmb250LmdldFVpbnQxNigpLAogICAgICAgICAgb2Zmc2V0OiBmb250LmdldFVpbnQxNigpCiAgICAgICAgfTsKICAgICAgICBpZiAoaXNNYWNOYW1lUmVjb3JkKHIpIHx8IGlzV2luTmFtZVJlY29yZChyKSkgewogICAgICAgICAgcmVjb3Jkcy5wdXNoKHIpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGkgPSAwLCBpaSA9IHJlY29yZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IHJlY29yZCA9IHJlY29yZHNbaV07CiAgICAgICAgaWYgKHJlY29yZC5sZW5ndGggPD0gMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBvcyA9IHN0YXJ0ICsgc3RyaW5nc1N0YXJ0ICsgcmVjb3JkLm9mZnNldDsKICAgICAgICBpZiAocG9zICsgcmVjb3JkLmxlbmd0aCA+IGVuZCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvbnQucG9zID0gcG9zOwogICAgICAgIGNvbnN0IG5hbWVJbmRleCA9IHJlY29yZC5uYW1lOwogICAgICAgIGlmIChyZWNvcmQuZW5jb2RpbmcpIHsKICAgICAgICAgIGxldCBzdHIgPSAiIjsKICAgICAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJlY29yZC5sZW5ndGg7IGogPCBqajsgaiArPSAyKSB7CiAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2V0VWludDE2KCkpOwogICAgICAgICAgfQogICAgICAgICAgbmFtZXNbMV1bbmFtZUluZGV4XSA9IHN0cjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmFtZXNbMF1bbmFtZUluZGV4XSA9IGZvbnQuZ2V0U3RyaW5nKHJlY29yZC5sZW5ndGgpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gW25hbWVzLCByZWNvcmRzXTsKICAgIH0KICAgIGNvbnN0IFRUT3BzU3RhY2tEZWx0YXMgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTIsIC0yLCAtMiwgLTIsIDAsIDAsIC0yLCAtNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAtMSwgMCwgLTEsIC0xLCAtMSwgLTEsIDEsIC0xLCAtOTk5LCAwLCAxLCAwLCAtMSwgLTIsIDAsIC0xLCAtMiwgLTEsIC0xLCAwLCAtMSwgLTEsIDAsIDAsIC05OTksIC05OTksIC0xLCAtMSwgLTEsIC0xLCAtMiwgLTk5OSwgLTIsIC0yLCAtOTk5LCAwLCAtMiwgLTIsIDAsIDAsIC0yLCAwLCAtMiwgMCwgMCwgMCwgLTIsIC0xLCAtMSwgMSwgMSwgMCwgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIC0xLCAwLCAtMSwgLTEsIDAsIC05OTksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0yLCAtOTk5LCAtOTk5LCAtOTk5LCAtOTk5LCAtOTk5LCAtMSwgLTEsIC0yLCAtMiwgMCwgMCwgMCwgMCwgLTEsIC0xLCAtOTk5LCAtMiwgLTIsIDAsIDAsIC0xLCAtMiwgLTIsIDAsIDAsIDAsIC0xLCAtMSwgLTEsIC0yXTsKICAgIGZ1bmN0aW9uIHNhbml0aXplVFRQcm9ncmFtKHRhYmxlLCB0dENvbnRleHQpIHsKICAgICAgbGV0IGRhdGEgPSB0YWJsZS5kYXRhOwogICAgICBsZXQgaSA9IDAsCiAgICAgICAgaiwKICAgICAgICBuLAogICAgICAgIGIsCiAgICAgICAgZnVuY0lkLAogICAgICAgIHBjLAogICAgICAgIGxhc3RFbmRmID0gMCwKICAgICAgICBsYXN0RGVmZiA9IDA7CiAgICAgIGNvbnN0IHN0YWNrID0gW107CiAgICAgIGNvbnN0IGNhbGxzdGFjayA9IFtdOwogICAgICBjb25zdCBmdW5jdGlvbnNDYWxsZWQgPSBbXTsKICAgICAgbGV0IHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHR0Q29udGV4dC50b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnM7CiAgICAgIGxldCBpbkZERUYgPSBmYWxzZSwKICAgICAgICBpZkxldmVsID0gMCwKICAgICAgICBpbkVMU0UgPSAwOwogICAgICBmb3IgKGxldCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7KSB7CiAgICAgICAgY29uc3Qgb3AgPSBkYXRhW2krK107CiAgICAgICAgaWYgKG9wID09PSAweDQwKSB7CiAgICAgICAgICBuID0gZGF0YVtpKytdOwogICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKICAgICAgICAgICAgaSArPSBuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgIHN0YWNrLnB1c2goZGF0YVtpKytdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4NDEpIHsKICAgICAgICAgIG4gPSBkYXRhW2krK107CiAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgewogICAgICAgICAgICBpICs9IG4gKiAyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgIGIgPSBkYXRhW2krK107CiAgICAgICAgICAgICAgc3RhY2sucHVzaChiIDw8IDggfCBkYXRhW2krK10pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgob3AgJiAweGY4KSA9PT0gMHhiMCkgewogICAgICAgICAgbiA9IG9wIC0gMHhiMCArIDE7CiAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgewogICAgICAgICAgICBpICs9IG47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgICAgc3RhY2sucHVzaChkYXRhW2krK10pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICgob3AgJiAweGY4KSA9PT0gMHhiOCkgewogICAgICAgICAgbiA9IG9wIC0gMHhiOCArIDE7CiAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgewogICAgICAgICAgICBpICs9IG4gKiAyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgIGIgPSBkYXRhW2krK107CiAgICAgICAgICAgICAgc3RhY2sucHVzaChzaWduZWRJbnQxNihiLCBkYXRhW2krK10pKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MmIgJiYgIXRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucykgewogICAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkgewogICAgICAgICAgICBmdW5jSWQgPSBzdGFjay5hdCgtMSk7CiAgICAgICAgICAgIGlmIChpc05hTihmdW5jSWQpKSB7CiAgICAgICAgICAgICAgaW5mbygiVFQ6IENBTEwgZW1wdHkgc3RhY2sgKG9yIGludmFsaWQgZW50cnkpLiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2Z1bmNJZF0gPSB0cnVlOwogICAgICAgICAgICAgIGlmIChmdW5jSWQgaW4gdHRDb250ZXh0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGFja0xlbmd0aCA9IHN0YWNrLmxlbmd0aCArIHR0Q29udGV4dC5mdW5jdGlvbnNTdGFja0RlbHRhc1tmdW5jSWRdOwogICAgICAgICAgICAgICAgaWYgKG5ld1N0YWNrTGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgICAgICB3YXJuKCJUVDogQ0FMTCBpbnZhbGlkIGZ1bmN0aW9ucyBzdGFjayBkZWx0YS4iKTsKICAgICAgICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RhY2subGVuZ3RoID0gbmV3U3RhY2tMZW5ndGg7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmdW5jSWQgaW4gdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWQgJiYgIWZ1bmN0aW9uc0NhbGxlZC5pbmNsdWRlcyhmdW5jSWQpKSB7CiAgICAgICAgICAgICAgICBjYWxsc3RhY2sucHVzaCh7CiAgICAgICAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgIHN0YWNrVG9wOiBzdGFjay5sZW5ndGggLSAxCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uc0NhbGxlZC5wdXNoKGZ1bmNJZCk7CiAgICAgICAgICAgICAgICBwYyA9IHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkW2Z1bmNJZF07CiAgICAgICAgICAgICAgICBpZiAoIXBjKSB7CiAgICAgICAgICAgICAgICAgIHdhcm4oIlRUOiBDQUxMIG5vbi1leGlzdGVudCBmdW5jdGlvbiIpOwogICAgICAgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkYXRhID0gcGMuZGF0YTsKICAgICAgICAgICAgICAgIGkgPSBwYy5pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MmMgJiYgIXRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucykgewogICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKICAgICAgICAgICAgd2FybigiVFQ6IG5lc3RlZCBGREVGcyBub3QgYWxsb3dlZCIpOwogICAgICAgICAgICB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgaW5GREVGID0gdHJ1ZTsKICAgICAgICAgIGxhc3REZWZmID0gaTsKICAgICAgICAgIGZ1bmNJZCA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbZnVuY0lkXSA9IHsKICAgICAgICAgICAgZGF0YSwKICAgICAgICAgICAgaQogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJkKSB7CiAgICAgICAgICBpZiAoaW5GREVGKSB7CiAgICAgICAgICAgIGluRkRFRiA9IGZhbHNlOwogICAgICAgICAgICBsYXN0RW5kZiA9IGk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYyA9IGNhbGxzdGFjay5wb3AoKTsKICAgICAgICAgICAgaWYgKCFwYykgewogICAgICAgICAgICAgIHdhcm4oIlRUOiBFTkRGIGJhZCBzdGFjayIpOwogICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmNJZCA9IGZ1bmN0aW9uc0NhbGxlZC5wb3AoKTsKICAgICAgICAgICAgZGF0YSA9IHBjLmRhdGE7CiAgICAgICAgICAgIGkgPSBwYy5pOwogICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXNbZnVuY0lkXSA9IHN0YWNrLmxlbmd0aCAtIHBjLnN0YWNrVG9wOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4ODkpIHsKICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CiAgICAgICAgICAgIHdhcm4oIlRUOiBuZXN0ZWQgSURFRnMgbm90IGFsbG93ZWQiKTsKICAgICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGluRkRFRiA9IHRydWU7CiAgICAgICAgICBsYXN0RGVmZiA9IGk7CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg1OCkgewogICAgICAgICAgKytpZkxldmVsOwogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MWIpIHsKICAgICAgICAgIGluRUxTRSA9IGlmTGV2ZWw7CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg1OSkgewogICAgICAgICAgaWYgKGluRUxTRSA9PT0gaWZMZXZlbCkgewogICAgICAgICAgICBpbkVMU0UgPSAwOwogICAgICAgICAgfQogICAgICAgICAgLS1pZkxldmVsOwogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4MWMpIHsKICAgICAgICAgIGlmICghaW5GREVGICYmICFpbkVMU0UpIHsKICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RhY2suYXQoLTEpOwogICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgIGkgKz0gb2Zmc2V0IC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWluRkRFRiAmJiAhaW5FTFNFKSB7CiAgICAgICAgICBsZXQgc3RhY2tEZWx0YSA9IDA7CiAgICAgICAgICBpZiAob3AgPD0gMHg4ZSkgewogICAgICAgICAgICBzdGFja0RlbHRhID0gVFRPcHNTdGFja0RlbHRhc1tvcF07CiAgICAgICAgICB9IGVsc2UgaWYgKG9wID49IDB4YzAgJiYgb3AgPD0gMHhkZikgewogICAgICAgICAgICBzdGFja0RlbHRhID0gLTE7CiAgICAgICAgICB9IGVsc2UgaWYgKG9wID49IDB4ZTApIHsKICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC0yOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wID49IDB4NzEgJiYgb3AgPD0gMHg3NSkgewogICAgICAgICAgICBuID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmICghaXNOYU4obikpIHsKICAgICAgICAgICAgICBzdGFja0RlbHRhID0gLW4gKiAyOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3RhY2tEZWx0YSA8IDAgJiYgc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgICAgc3RhY2tEZWx0YSsrOwogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKHN0YWNrRGVsdGEgPiAwKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goTmFOKTsKICAgICAgICAgICAgc3RhY2tEZWx0YS0tOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB0dENvbnRleHQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zOwogICAgICBjb25zdCBjb250ZW50ID0gW2RhdGFdOwogICAgICBpZiAoaSA+IGRhdGEubGVuZ3RoKSB7CiAgICAgICAgY29udGVudC5wdXNoKG5ldyBVaW50OEFycmF5KGkgLSBkYXRhLmxlbmd0aCkpOwogICAgICB9CiAgICAgIGlmIChsYXN0RGVmZiA+IGxhc3RFbmRmKSB7CiAgICAgICAgd2FybigiVFQ6IGNvbXBsZW1lbnRpbmcgYSBtaXNzaW5nIGZ1bmN0aW9uIHRhaWwiKTsKICAgICAgICBjb250ZW50LnB1c2gobmV3IFVpbnQ4QXJyYXkoWzB4MjIsIDB4MmRdKSk7CiAgICAgIH0KICAgICAgZm9sZFRUVGFibGUodGFibGUsIGNvbnRlbnQpOwogICAgfQogICAgZnVuY3Rpb24gY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKSB7CiAgICAgIGlmICh0dENvbnRleHQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZC5sZW5ndGggPiBtYXhGdW5jdGlvbkRlZnMpIHsKICAgICAgICB3YXJuKCJUVDogbW9yZSBmdW5jdGlvbnMgZGVmaW5lZCB0aGFuIGV4cGVjdGVkIik7CiAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gdHRDb250ZXh0LmZ1bmN0aW9uc1VzZWQubGVuZ3RoOyBqIDwgamo7IGorKykgewogICAgICAgIGlmIChqID4gbWF4RnVuY3Rpb25EZWZzKSB7CiAgICAgICAgICB3YXJuKCJUVDogaW52YWxpZCBmdW5jdGlvbiBpZDogIiArIGopOwogICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2pdICYmICF0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZFtqXSkgewogICAgICAgICAgd2FybigiVFQ6IHVuZGVmaW5lZCBmdW5jdGlvbjogIiArIGopOwogICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGZvbGRUVFRhYmxlKHRhYmxlLCBjb250ZW50KSB7CiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IDEpIHsKICAgICAgICBsZXQgbmV3TGVuZ3RoID0gMDsKICAgICAgICBsZXQgaiwgamo7CiAgICAgICAgZm9yIChqID0gMCwgamogPSBjb250ZW50Lmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIG5ld0xlbmd0aCArPSBjb250ZW50W2pdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgbmV3TGVuZ3RoID0gbmV3TGVuZ3RoICsgMyAmIH4zOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KG5ld0xlbmd0aCk7CiAgICAgICAgbGV0IHBvcyA9IDA7CiAgICAgICAgZm9yIChqID0gMCwgamogPSBjb250ZW50Lmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIHJlc3VsdC5zZXQoY29udGVudFtqXSwgcG9zKTsKICAgICAgICAgIHBvcyArPSBjb250ZW50W2pdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdGFibGUuZGF0YSA9IHJlc3VsdDsKICAgICAgICB0YWJsZS5sZW5ndGggPSBuZXdMZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNhbml0aXplVFRQcm9ncmFtcyhmcGdtLCBwcmVwLCBjdnQsIG1heEZ1bmN0aW9uRGVmcykgewogICAgICBjb25zdCB0dENvbnRleHQgPSB7CiAgICAgICAgZnVuY3Rpb25zRGVmaW5lZDogW10sCiAgICAgICAgZnVuY3Rpb25zVXNlZDogW10sCiAgICAgICAgZnVuY3Rpb25zU3RhY2tEZWx0YXM6IFtdLAogICAgICAgIHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczogZmFsc2UsCiAgICAgICAgaGludHNWYWxpZDogdHJ1ZQogICAgICB9OwogICAgICBpZiAoZnBnbSkgewogICAgICAgIHNhbml0aXplVFRQcm9ncmFtKGZwZ20sIHR0Q29udGV4dCk7CiAgICAgIH0KICAgICAgaWYgKHByZXApIHsKICAgICAgICBzYW5pdGl6ZVRUUHJvZ3JhbShwcmVwLCB0dENvbnRleHQpOwogICAgICB9CiAgICAgIGlmIChmcGdtKSB7CiAgICAgICAgY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKTsKICAgICAgfQogICAgICBpZiAoY3Z0ICYmIGN2dC5sZW5ndGggJiAxKSB7CiAgICAgICAgY29uc3QgY3Z0RGF0YSA9IG5ldyBVaW50OEFycmF5KGN2dC5sZW5ndGggKyAxKTsKICAgICAgICBjdnREYXRhLnNldChjdnQuZGF0YSk7CiAgICAgICAgY3Z0LmRhdGEgPSBjdnREYXRhOwogICAgICB9CiAgICAgIHJldHVybiB0dENvbnRleHQuaGludHNWYWxpZDsKICAgIH0KICAgIGZvbnQgPSBuZXcgU3RyZWFtKG5ldyBVaW50OEFycmF5KGZvbnQuZ2V0Qnl0ZXMoKSkpOwogICAgbGV0IGhlYWRlciwgdGFibGVzOwogICAgaWYgKGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmb250KSkgewogICAgICBjb25zdCB0dGNEYXRhID0gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkRhdGEoZm9udCwgdGhpcy5uYW1lKTsKICAgICAgaGVhZGVyID0gdHRjRGF0YS5oZWFkZXI7CiAgICAgIHRhYmxlcyA9IHR0Y0RhdGEudGFibGVzOwogICAgfSBlbHNlIHsKICAgICAgaGVhZGVyID0gcmVhZE9wZW5UeXBlSGVhZGVyKGZvbnQpOwogICAgICB0YWJsZXMgPSByZWFkVGFibGVzKGZvbnQsIGhlYWRlci5udW1UYWJsZXMpOwogICAgfQogICAgbGV0IGNmZiwgY2ZmRmlsZTsKICAgIGNvbnN0IGlzVHJ1ZVR5cGUgPSAhdGFibGVzWyJDRkYgIl07CiAgICBpZiAoIWlzVHJ1ZVR5cGUpIHsKICAgICAgY29uc3QgaXNDb21wb3NpdGUgPSBwcm9wZXJ0aWVzLmNvbXBvc2l0ZSAmJiAocHJvcGVydGllcy5jaWRUb0dpZE1hcD8ubGVuZ3RoID4gMCB8fCAhKHByb3BlcnRpZXMuY01hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkpOwogICAgICBpZiAoaGVhZGVyLnZlcnNpb24gPT09ICJPVFRPIiAmJiAhaXNDb21wb3NpdGUgfHwgIXRhYmxlcy5oZWFkIHx8ICF0YWJsZXMuaGhlYSB8fCAhdGFibGVzLm1heHAgfHwgIXRhYmxlcy5wb3N0KSB7CiAgICAgICAgY2ZmRmlsZSA9IG5ldyBTdHJlYW0odGFibGVzWyJDRkYgIl0uZGF0YSk7CiAgICAgICAgY2ZmID0gbmV3IENGRkZvbnQoY2ZmRmlsZSwgcHJvcGVydGllcyk7CiAgICAgICAgYWRqdXN0V2lkdGhzKHByb3BlcnRpZXMpOwogICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnQobmFtZSwgY2ZmLCBwcm9wZXJ0aWVzKTsKICAgICAgfQogICAgICBkZWxldGUgdGFibGVzLmdseWY7CiAgICAgIGRlbGV0ZSB0YWJsZXMubG9jYTsKICAgICAgZGVsZXRlIHRhYmxlcy5mcGdtOwogICAgICBkZWxldGUgdGFibGVzLnByZXA7CiAgICAgIGRlbGV0ZSB0YWJsZXNbImN2dCAiXTsKICAgICAgdGhpcy5pc09wZW5UeXBlID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghdGFibGVzLmxvY2EpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJsb2NhIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKICAgICAgfQogICAgICBpZiAoIXRhYmxlcy5nbHlmKSB7CiAgICAgICAgd2FybignUmVxdWlyZWQgImdseWYiIHRhYmxlIGlzIG5vdCBmb3VuZCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICAgICAgICB0YWJsZXMuZ2x5ZiA9IHsKICAgICAgICAgIHRhZzogImdseWYiLAogICAgICAgICAgZGF0YTogbmV3IFVpbnQ4QXJyYXkoMCkKICAgICAgICB9OwogICAgICB9CiAgICAgIHRoaXMuaXNPcGVuVHlwZSA9IGZhbHNlOwogICAgfQogICAgaWYgKCF0YWJsZXMubWF4cCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJtYXhwIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKICAgIH0KICAgIGZvbnQucG9zID0gKGZvbnQuc3RhcnQgfHwgMCkgKyB0YWJsZXMubWF4cC5vZmZzZXQ7CiAgICBsZXQgdmVyc2lvbiA9IGZvbnQuZ2V0SW50MzIoKTsKICAgIGNvbnN0IG51bUdseXBocyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICBpZiAodmVyc2lvbiAhPT0gMHgwMDAxMDAwMCAmJiB2ZXJzaW9uICE9PSAweDAwMDA1MDAwKSB7CiAgICAgIGlmICh0YWJsZXMubWF4cC5sZW5ndGggPT09IDYpIHsKICAgICAgICB2ZXJzaW9uID0gMHgwMDA1MDAwOwogICAgICB9IGVsc2UgaWYgKHRhYmxlcy5tYXhwLmxlbmd0aCA+PSAzMikgewogICAgICAgIHZlcnNpb24gPSAweDAwMDEwMDAwOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgIm1heHAiIHRhYmxlIGhhcyBhIHdyb25nIHZlcnNpb24gbnVtYmVyYCk7CiAgICAgIH0KICAgICAgd3JpdGVVaW50MzIodGFibGVzLm1heHAuZGF0YSwgMCwgdmVyc2lvbik7CiAgICB9CiAgICBpZiAocHJvcGVydGllcy5zY2FsZUZhY3RvcnM/Lmxlbmd0aCA9PT0gbnVtR2x5cGhzICYmIGlzVHJ1ZVR5cGUpIHsKICAgICAgY29uc3QgewogICAgICAgIHNjYWxlRmFjdG9ycwogICAgICB9ID0gcHJvcGVydGllczsKICAgICAgY29uc3QgaXNHbHlwaExvY2F0aW9uc0xvbmcgPSBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzUwXSwgdGFibGVzLmhlYWQuZGF0YVs1MV0pOwogICAgICBjb25zdCBnbHlwaHMgPSBuZXcgR2x5ZlRhYmxlKHsKICAgICAgICBnbHlmVGFibGU6IHRhYmxlcy5nbHlmLmRhdGEsCiAgICAgICAgaXNHbHlwaExvY2F0aW9uc0xvbmcsCiAgICAgICAgbG9jYVRhYmxlOiB0YWJsZXMubG9jYS5kYXRhLAogICAgICAgIG51bUdseXBocwogICAgICB9KTsKICAgICAgZ2x5cGhzLnNjYWxlKHNjYWxlRmFjdG9ycyk7CiAgICAgIGNvbnN0IHsKICAgICAgICBnbHlmLAogICAgICAgIGxvY2EsCiAgICAgICAgaXNMb2NhdGlvbkxvbmcKICAgICAgfSA9IGdseXBocy53cml0ZSgpOwogICAgICB0YWJsZXMuZ2x5Zi5kYXRhID0gZ2x5ZjsKICAgICAgdGFibGVzLmxvY2EuZGF0YSA9IGxvY2E7CiAgICAgIGlmIChpc0xvY2F0aW9uTG9uZyAhPT0gISFpc0dseXBoTG9jYXRpb25zTG9uZykgewogICAgICAgIHRhYmxlcy5oZWFkLmRhdGFbNTBdID0gMDsKICAgICAgICB0YWJsZXMuaGVhZC5kYXRhWzUxXSA9IGlzTG9jYXRpb25Mb25nID8gMSA6IDA7CiAgICAgIH0KICAgICAgY29uc3QgbWV0cmljcyA9IHRhYmxlcy5obXR4LmRhdGE7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBpKyspIHsKICAgICAgICBjb25zdCBqID0gNCAqIGk7CiAgICAgICAgY29uc3QgYWR2YW5jZVdpZHRoID0gTWF0aC5yb3VuZChzY2FsZUZhY3RvcnNbaV0gKiBpbnQxNihtZXRyaWNzW2pdLCBtZXRyaWNzW2ogKyAxXSkpOwogICAgICAgIG1ldHJpY3Nbal0gPSBhZHZhbmNlV2lkdGggPj4gOCAmIDB4ZmY7CiAgICAgICAgbWV0cmljc1tqICsgMV0gPSBhZHZhbmNlV2lkdGggJiAweGZmOwogICAgICAgIGNvbnN0IGxzYiA9IE1hdGgucm91bmQoc2NhbGVGYWN0b3JzW2ldICogc2lnbmVkSW50MTYobWV0cmljc1tqICsgMl0sIG1ldHJpY3NbaiArIDNdKSk7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihtZXRyaWNzLCBqICsgMiwgbHNiKTsKICAgICAgfQogICAgfQogICAgbGV0IG51bUdseXBoc091dCA9IG51bUdseXBocyArIDE7CiAgICBsZXQgZHVwRmlyc3RFbnRyeSA9IHRydWU7CiAgICBpZiAobnVtR2x5cGhzT3V0ID4gMHhmZmZmKSB7CiAgICAgIGR1cEZpcnN0RW50cnkgPSBmYWxzZTsKICAgICAgbnVtR2x5cGhzT3V0ID0gbnVtR2x5cGhzOwogICAgICB3YXJuKCJOb3QgZW5vdWdoIHNwYWNlIGluIGdseWZzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC4iKTsKICAgIH0KICAgIGxldCBtYXhGdW5jdGlvbkRlZnMgPSAwOwogICAgbGV0IG1heFNpemVPZkluc3RydWN0aW9ucyA9IDA7CiAgICBpZiAodmVyc2lvbiA+PSAweDAwMDEwMDAwICYmIHRhYmxlcy5tYXhwLmxlbmd0aCA+PSAzMikgewogICAgICBmb250LnBvcyArPSA4OwogICAgICBjb25zdCBtYXhab25lcyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgIGlmIChtYXhab25lcyA+IDIpIHsKICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzE0XSA9IDA7CiAgICAgICAgdGFibGVzLm1heHAuZGF0YVsxNV0gPSAyOwogICAgICB9CiAgICAgIGZvbnQucG9zICs9IDQ7CiAgICAgIG1heEZ1bmN0aW9uRGVmcyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgIGZvbnQucG9zICs9IDQ7CiAgICAgIG1heFNpemVPZkluc3RydWN0aW9ucyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICB9CiAgICB0YWJsZXMubWF4cC5kYXRhWzRdID0gbnVtR2x5cGhzT3V0ID4+IDg7CiAgICB0YWJsZXMubWF4cC5kYXRhWzVdID0gbnVtR2x5cGhzT3V0ICYgMjU1OwogICAgY29uc3QgaGludHNWYWxpZCA9IHNhbml0aXplVFRQcm9ncmFtcyh0YWJsZXMuZnBnbSwgdGFibGVzLnByZXAsIHRhYmxlc1siY3Z0ICJdLCBtYXhGdW5jdGlvbkRlZnMpOwogICAgaWYgKCFoaW50c1ZhbGlkKSB7CiAgICAgIGRlbGV0ZSB0YWJsZXMuZnBnbTsKICAgICAgZGVsZXRlIHRhYmxlcy5wcmVwOwogICAgICBkZWxldGUgdGFibGVzWyJjdnQgIl07CiAgICB9CiAgICBzYW5pdGl6ZU1ldHJpY3MoZm9udCwgdGFibGVzLmhoZWEsIHRhYmxlcy5obXR4LCB0YWJsZXMuaGVhZCwgbnVtR2x5cGhzT3V0LCBkdXBGaXJzdEVudHJ5KTsKICAgIGlmICghdGFibGVzLmhlYWQpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCAiaGVhZCIgdGFibGUgaXMgbm90IGZvdW5kJyk7CiAgICB9CiAgICBzYW5pdGl6ZUhlYWQodGFibGVzLmhlYWQsIG51bUdseXBocywgaXNUcnVlVHlwZSA/IHRhYmxlcy5sb2NhLmxlbmd0aCA6IDApOwogICAgbGV0IG1pc3NpbmdHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKGlzVHJ1ZVR5cGUpIHsKICAgICAgY29uc3QgaXNHbHlwaExvY2F0aW9uc0xvbmcgPSBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzUwXSwgdGFibGVzLmhlYWQuZGF0YVs1MV0pOwogICAgICBjb25zdCBnbHlwaHNJbmZvID0gc2FuaXRpemVHbHlwaExvY2F0aW9ucyh0YWJsZXMubG9jYSwgdGFibGVzLmdseWYsIG51bUdseXBocywgaXNHbHlwaExvY2F0aW9uc0xvbmcsIGhpbnRzVmFsaWQsIGR1cEZpcnN0RW50cnksIG1heFNpemVPZkluc3RydWN0aW9ucyk7CiAgICAgIG1pc3NpbmdHbHlwaHMgPSBnbHlwaHNJbmZvLm1pc3NpbmdHbHlwaHM7CiAgICAgIGlmICh2ZXJzaW9uID49IDB4MDAwMTAwMDAgJiYgdGFibGVzLm1heHAubGVuZ3RoID49IDMyKSB7CiAgICAgICAgdGFibGVzLm1heHAuZGF0YVsyNl0gPSBnbHlwaHNJbmZvLm1heFNpemVPZkluc3RydWN0aW9ucyA+PiA4OwogICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMjddID0gZ2x5cGhzSW5mby5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgJiAyNTU7CiAgICAgIH0KICAgIH0KICAgIGlmICghdGFibGVzLmhoZWEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCAiaGhlYSIgdGFibGUgaXMgbm90IGZvdW5kJyk7CiAgICB9CiAgICBpZiAodGFibGVzLmhoZWEuZGF0YVsxMF0gPT09IDAgJiYgdGFibGVzLmhoZWEuZGF0YVsxMV0gPT09IDApIHsKICAgICAgdGFibGVzLmhoZWEuZGF0YVsxMF0gPSAweGZmOwogICAgICB0YWJsZXMuaGhlYS5kYXRhWzExXSA9IDB4ZmY7CiAgICB9CiAgICBjb25zdCBtZXRyaWNzT3ZlcnJpZGUgPSB7CiAgICAgIHVuaXRzUGVyRW06IGludDE2KHRhYmxlcy5oZWFkLmRhdGFbMThdLCB0YWJsZXMuaGVhZC5kYXRhWzE5XSksCiAgICAgIHlNYXg6IHNpZ25lZEludDE2KHRhYmxlcy5oZWFkLmRhdGFbNDJdLCB0YWJsZXMuaGVhZC5kYXRhWzQzXSksCiAgICAgIHlNaW46IHNpZ25lZEludDE2KHRhYmxlcy5oZWFkLmRhdGFbMzhdLCB0YWJsZXMuaGVhZC5kYXRhWzM5XSksCiAgICAgIGFzY2VudDogc2lnbmVkSW50MTYodGFibGVzLmhoZWEuZGF0YVs0XSwgdGFibGVzLmhoZWEuZGF0YVs1XSksCiAgICAgIGRlc2NlbnQ6IHNpZ25lZEludDE2KHRhYmxlcy5oaGVhLmRhdGFbNl0sIHRhYmxlcy5oaGVhLmRhdGFbN10pLAogICAgICBsaW5lR2FwOiBzaWduZWRJbnQxNih0YWJsZXMuaGhlYS5kYXRhWzhdLCB0YWJsZXMuaGhlYS5kYXRhWzldKQogICAgfTsKICAgIHRoaXMuYXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmFzY2VudCAvIG1ldHJpY3NPdmVycmlkZS51bml0c1BlckVtOwogICAgdGhpcy5kZXNjZW50ID0gbWV0cmljc092ZXJyaWRlLmRlc2NlbnQgLyBtZXRyaWNzT3ZlcnJpZGUudW5pdHNQZXJFbTsKICAgIHRoaXMubGluZUdhcCA9IG1ldHJpY3NPdmVycmlkZS5saW5lR2FwIC8gbWV0cmljc092ZXJyaWRlLnVuaXRzUGVyRW07CiAgICBpZiAodGhpcy5jc3NGb250SW5mbz8ubGluZUhlaWdodCkgewogICAgICB0aGlzLmxpbmVIZWlnaHQgPSB0aGlzLmNzc0ZvbnRJbmZvLm1ldHJpY3MubGluZUhlaWdodDsKICAgICAgdGhpcy5saW5lR2FwID0gdGhpcy5jc3NGb250SW5mby5tZXRyaWNzLmxpbmVHYXA7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmxpbmVIZWlnaHQgPSB0aGlzLmFzY2VudCAtIHRoaXMuZGVzY2VudCArIHRoaXMubGluZUdhcDsKICAgIH0KICAgIGlmICh0YWJsZXMucG9zdCkgewogICAgICByZWFkUG9zdFNjcmlwdFRhYmxlKHRhYmxlcy5wb3N0LCBwcm9wZXJ0aWVzLCBudW1HbHlwaHMpOwogICAgfQogICAgdGFibGVzLnBvc3QgPSB7CiAgICAgIHRhZzogInBvc3QiLAogICAgICBkYXRhOiBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykKICAgIH07CiAgICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmdW5jdGlvbiBoYXNHbHlwaChnbHlwaElkKSB7CiAgICAgIHJldHVybiAhbWlzc2luZ0dseXBoc1tnbHlwaElkXTsKICAgIH0KICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICBjb25zdCBjaWRUb0dpZE1hcCA9IHByb3BlcnRpZXMuY2lkVG9HaWRNYXAgfHwgW107CiAgICAgIGNvbnN0IGlzQ2lkVG9HaWRNYXBFbXB0eSA9IGNpZFRvR2lkTWFwLmxlbmd0aCA9PT0gMDsKICAgICAgcHJvcGVydGllcy5jTWFwLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCBjaWQpIHsKICAgICAgICBpZiAodHlwZW9mIGNpZCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGNpZCA9IGNvbnZlcnRDaWRTdHJpbmcoY2hhckNvZGUsIGNpZCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOwogICAgICAgIH0KICAgICAgICBsZXQgZ2x5cGhJZCA9IC0xOwogICAgICAgIGlmIChpc0NpZFRvR2lkTWFwRW1wdHkpIHsKICAgICAgICAgIGdseXBoSWQgPSBjaWQ7CiAgICAgICAgfSBlbHNlIGlmIChjaWRUb0dpZE1hcFtjaWRdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGdseXBoSWQgPSBjaWRUb0dpZE1hcFtjaWRdOwogICAgICAgIH0KICAgICAgICBpZiAoZ2x5cGhJZCA+PSAwICYmIGdseXBoSWQgPCBudW1HbHlwaHMgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHsKICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGNtYXBUYWJsZSA9IHJlYWRDbWFwVGFibGUodGFibGVzLmNtYXAsIGZvbnQsIHRoaXMuaXNTeW1ib2xpY0ZvbnQsIHByb3BlcnRpZXMuaGFzRW5jb2RpbmcpOwogICAgICBjb25zdCBjbWFwUGxhdGZvcm1JZCA9IGNtYXBUYWJsZS5wbGF0Zm9ybUlkOwogICAgICBjb25zdCBjbWFwRW5jb2RpbmdJZCA9IGNtYXBUYWJsZS5lbmNvZGluZ0lkOwogICAgICBjb25zdCBjbWFwTWFwcGluZ3MgPSBjbWFwVGFibGUubWFwcGluZ3M7CiAgICAgIGxldCBiYXNlRW5jb2RpbmcgPSBbXSwKICAgICAgICBmb3JjZVBvc3RUYWJsZSA9IGZhbHNlOwogICAgICBpZiAocHJvcGVydGllcy5oYXNFbmNvZGluZyAmJiAocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lID09PSAiTWFjUm9tYW5FbmNvZGluZyIgfHwgcHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lID09PSAiV2luQW5zaUVuY29kaW5nIikpIHsKICAgICAgICBiYXNlRW5jb2RpbmcgPSBnZXRFbmNvZGluZyhwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpOwogICAgICB9CiAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nICYmICF0aGlzLmlzU3ltYm9saWNGb250ICYmIChjbWFwUGxhdGZvcm1JZCA9PT0gMyAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMSB8fCBjbWFwUGxhdGZvcm1JZCA9PT0gMSAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMCkpIHsKICAgICAgICBjb25zdCBnbHlwaHNVbmljb2RlTWFwID0gZ2V0R2x5cGhzVW5pY29kZSgpOwogICAgICAgIGZvciAobGV0IGNoYXJDb2RlID0gMDsgY2hhckNvZGUgPCAyNTY7IGNoYXJDb2RlKyspIHsKICAgICAgICAgIGxldCBnbHlwaE5hbWU7CiAgICAgICAgICBpZiAodGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBnbHlwaE5hbWUgPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJDb2RlXTsKICAgICAgICAgIH0gZWxzZSBpZiAoYmFzZUVuY29kaW5nLmxlbmd0aCAmJiBiYXNlRW5jb2RpbmdbY2hhckNvZGVdICE9PSAiIikgewogICAgICAgICAgICBnbHlwaE5hbWUgPSBiYXNlRW5jb2RpbmdbY2hhckNvZGVdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2x5cGhOYW1lID0gU3RhbmRhcmRFbmNvZGluZ1tjaGFyQ29kZV07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWdseXBoTmFtZSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0YW5kYXJkR2x5cGhOYW1lID0gcmVjb3ZlckdseXBoTmFtZShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgICAgICAgbGV0IHVuaWNvZGVPckNoYXJDb2RlOwogICAgICAgICAgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAxKSB7CiAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtzdGFuZGFyZEdseXBoTmFtZV07CiAgICAgICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAxICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSB7CiAgICAgICAgICAgIHVuaWNvZGVPckNoYXJDb2RlID0gTWFjUm9tYW5FbmNvZGluZy5pbmRleE9mKHN0YW5kYXJkR2x5cGhOYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1bmljb2RlT3JDaGFyQ29kZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5nbHlwaE5hbWVzICYmIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgJiYgISh0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSkgewogICAgICAgICAgICAgIGNvbnN0IHVuaWNvZGUgPSB0aGlzLnRvVW5pY29kZS5nZXQoY2hhckNvZGUpOwogICAgICAgICAgICAgIGlmICh1bmljb2RlKSB7CiAgICAgICAgICAgICAgICB1bmljb2RlT3JDaGFyQ29kZSA9IHVuaWNvZGUuY29kZVBvaW50QXQoMCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh1bmljb2RlT3JDaGFyQ29kZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBjbWFwTWFwcGluZ3MpIHsKICAgICAgICAgICAgaWYgKG1hcHBpbmcuY2hhckNvZGUgIT09IHVuaWNvZGVPckNoYXJDb2RlKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gbWFwcGluZy5nbHlwaElkOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY21hcFBsYXRmb3JtSWQgPT09IDApIHsKICAgICAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgY21hcE1hcHBpbmdzKSB7CiAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFttYXBwaW5nLmNoYXJDb2RlXSA9IG1hcHBpbmcuZ2x5cGhJZDsKICAgICAgICB9CiAgICAgICAgZm9yY2VQb3N0VGFibGUgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNtYXBFbmNvZGluZ0lkID09PSAwKSB7CiAgICAgICAgZm9yIChjb25zdCBtYXBwaW5nIG9mIGNtYXBNYXBwaW5ncykgewogICAgICAgICAgbGV0IGNoYXJDb2RlID0gbWFwcGluZy5jaGFyQ29kZTsKICAgICAgICAgIGlmIChjaGFyQ29kZSA+PSAweGYwMDAgJiYgY2hhckNvZGUgPD0gMHhmMGZmKSB7CiAgICAgICAgICAgIGNoYXJDb2RlICY9IDB4ZmY7CiAgICAgICAgICB9CiAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBtYXBwaW5nLmdseXBoSWQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBjbWFwTWFwcGluZ3MpIHsKICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW21hcHBpbmcuY2hhckNvZGVdID0gbWFwcGluZy5nbHlwaElkOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocHJvcGVydGllcy5nbHlwaE5hbWVzICYmIChiYXNlRW5jb2RpbmcubGVuZ3RoIHx8IHRoaXMuZGlmZmVyZW5jZXMubGVuZ3RoKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKICAgICAgICAgIGlmICghZm9yY2VQb3N0VGFibGUgJiYgY2hhckNvZGVUb0dseXBoSWRbaV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGdseXBoTmFtZSA9IHRoaXMuZGlmZmVyZW5jZXNbaV0gfHwgYmFzZUVuY29kaW5nW2ldOwogICAgICAgICAgaWYgKCFnbHlwaE5hbWUpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBnbHlwaElkID0gcHJvcGVydGllcy5nbHlwaE5hbWVzLmluZGV4T2YoZ2x5cGhOYW1lKTsKICAgICAgICAgIGlmIChnbHlwaElkID4gMCAmJiBoYXNHbHlwaChnbHlwaElkKSkgewogICAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtpXSA9IGdseXBoSWQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoY2hhckNvZGVUb0dseXBoSWQubGVuZ3RoID09PSAwKSB7CiAgICAgIGNoYXJDb2RlVG9HbHlwaElkWzBdID0gMDsKICAgIH0KICAgIGxldCBnbHlwaFplcm9JZCA9IG51bUdseXBoc091dCAtIDE7CiAgICBpZiAoIWR1cEZpcnN0RW50cnkpIHsKICAgICAgZ2x5cGhaZXJvSWQgPSAwOwogICAgfQogICAgaWYgKCFwcm9wZXJ0aWVzLmNzc0ZvbnRJbmZvKSB7CiAgICAgIGNvbnN0IG5ld01hcHBpbmcgPSBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgZ2x5cGhaZXJvSWQsIHRoaXMudG9Vbmljb2RlKTsKICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbmV3TWFwcGluZy50b0ZvbnRDaGFyOwogICAgICB0YWJsZXMuY21hcCA9IHsKICAgICAgICB0YWc6ICJjbWFwIiwKICAgICAgICBkYXRhOiBjcmVhdGVDbWFwVGFibGUobmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbmV3TWFwcGluZy50b1VuaWNvZGVFeHRyYU1hcCwgbnVtR2x5cGhzT3V0KQogICAgICB9OwogICAgICBpZiAoIXRhYmxlc1siT1MvMiJdIHx8ICF2YWxpZGF0ZU9TMlRhYmxlKHRhYmxlc1siT1MvMiJdLCBmb250KSkgewogICAgICAgIHRhYmxlc1siT1MvMiJdID0gewogICAgICAgICAgdGFnOiAiT1MvMiIsCiAgICAgICAgICBkYXRhOiBjcmVhdGVPUzJUYWJsZShwcm9wZXJ0aWVzLCBuZXdNYXBwaW5nLmNoYXJDb2RlVG9HbHlwaElkLCBtZXRyaWNzT3ZlcnJpZGUpCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgaWYgKCFpc1RydWVUeXBlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY2ZmRmlsZSA9IG5ldyBTdHJlYW0odGFibGVzWyJDRkYgIl0uZGF0YSk7CiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IENGRlBhcnNlcihjZmZGaWxlLCBwcm9wZXJ0aWVzLCBTRUFDX0FOQUxZU0lTX0VOQUJMRUQpOwogICAgICAgIGNmZiA9IHBhcnNlci5wYXJzZSgpOwogICAgICAgIGNmZi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7CiAgICAgICAgY29uc3QgY29tcGlsZXIgPSBuZXcgQ0ZGQ29tcGlsZXIoY2ZmKTsKICAgICAgICB0YWJsZXNbIkNGRiAiXS5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpOwogICAgICB9IGNhdGNoIHsKICAgICAgICB3YXJuKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIgKyBwcm9wZXJ0aWVzLmxvYWRlZE5hbWUpOwogICAgICB9CiAgICB9CiAgICBpZiAoIXRhYmxlcy5uYW1lKSB7CiAgICAgIHRhYmxlcy5uYW1lID0gewogICAgICAgIHRhZzogIm5hbWUiLAogICAgICAgIGRhdGE6IGNyZWF0ZU5hbWVUYWJsZSh0aGlzLm5hbWUpCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBjb25zdCBbbmFtZVByb3RvdHlwZSwgbmFtZVJlY29yZHNdID0gcmVhZE5hbWVUYWJsZSh0YWJsZXMubmFtZSk7CiAgICAgIHRhYmxlcy5uYW1lLmRhdGEgPSBjcmVhdGVOYW1lVGFibGUobmFtZSwgbmFtZVByb3RvdHlwZSk7CiAgICAgIHRoaXMucHNOYW1lID0gbmFtZVByb3RvdHlwZVswXVs2XSB8fCBudWxsOwogICAgICBpZiAoIXByb3BlcnRpZXMuY29tcG9zaXRlKSB7CiAgICAgICAgYWRqdXN0VHJ1ZVR5cGVUb1VuaWNvZGUocHJvcGVydGllcywgdGhpcy5pc1N5bWJvbGljRm9udCwgbmFtZVJlY29yZHMpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBidWlsZGVyID0gbmV3IE9wZW5UeXBlRmlsZUJ1aWxkZXIoaGVhZGVyLnZlcnNpb24pOwogICAgZm9yIChjb25zdCB0YWJsZVRhZyBpbiB0YWJsZXMpIHsKICAgICAgYnVpbGRlci5hZGRUYWJsZSh0YWJsZVRhZywgdGFibGVzW3RhYmxlVGFnXS5kYXRhKTsKICAgIH0KICAgIHJldHVybiBidWlsZGVyLnRvQXJyYXkoKTsKICB9CiAgY29udmVydChmb250TmFtZSwgZm9udCwgcHJvcGVydGllcykgewogICAgcHJvcGVydGllcy5maXhlZFBpdGNoID0gZmFsc2U7CiAgICBpZiAocHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpIHsKICAgICAgYWRqdXN0VHlwZTFUb1VuaWNvZGUocHJvcGVydGllcywgcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpOwogICAgfQogICAgbGV0IGdseXBoWmVyb0lkID0gMTsKICAgIGlmIChmb250IGluc3RhbmNlb2YgQ0ZGRm9udCkgewogICAgICBnbHlwaFplcm9JZCA9IGZvbnQubnVtR2x5cGhzIC0gMTsKICAgIH0KICAgIGNvbnN0IG1hcHBpbmcgPSBmb250LmdldEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzKTsKICAgIGxldCBuZXdNYXBwaW5nID0gbnVsbDsKICAgIGxldCBuZXdDaGFyQ29kZVRvR2x5cGhJZCA9IG1hcHBpbmc7CiAgICBsZXQgdG9Vbmljb2RlRXh0cmFNYXAgPSBudWxsOwogICAgaWYgKCFwcm9wZXJ0aWVzLmNzc0ZvbnRJbmZvKSB7CiAgICAgIG5ld01hcHBpbmcgPSBhZGp1c3RNYXBwaW5nKG1hcHBpbmcsIGZvbnQuaGFzR2x5cGhJZC5iaW5kKGZvbnQpLCBnbHlwaFplcm9JZCwgdGhpcy50b1VuaWNvZGUpOwogICAgICB0aGlzLnRvRm9udENoYXIgPSBuZXdNYXBwaW5nLnRvRm9udENoYXI7CiAgICAgIG5ld0NoYXJDb2RlVG9HbHlwaElkID0gbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZDsKICAgICAgdG9Vbmljb2RlRXh0cmFNYXAgPSBuZXdNYXBwaW5nLnRvVW5pY29kZUV4dHJhTWFwOwogICAgfQogICAgY29uc3QgbnVtR2x5cGhzID0gZm9udC5udW1HbHlwaHM7CiAgICBmdW5jdGlvbiBnZXRDaGFyQ29kZXMoY2hhckNvZGVUb0dseXBoSWQsIGdseXBoSWQpIHsKICAgICAgbGV0IGNoYXJDb2RlcyA9IG51bGw7CiAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHsKICAgICAgICBpZiAoZ2x5cGhJZCA9PT0gY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdKSB7CiAgICAgICAgICAoY2hhckNvZGVzIHx8PSBbXSkucHVzaChjaGFyQ29kZSB8IDApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gY2hhckNvZGVzOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGdseXBoSWQpIHsKICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkgewogICAgICAgIGlmIChnbHlwaElkID09PSBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0pIHsKICAgICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CiAgICAgICAgfQogICAgICB9CiAgICAgIG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWRbbmV3TWFwcGluZy5uZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgIHJldHVybiBuZXdNYXBwaW5nLm5leHRBdmFpbGFibGVGb250Q2hhckNvZGUrKzsKICAgIH0KICAgIGNvbnN0IHNlYWNzID0gZm9udC5zZWFjczsKICAgIGlmIChuZXdNYXBwaW5nICYmIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCAmJiBzZWFjcz8ubGVuZ3RoKSB7CiAgICAgIGNvbnN0IG1hdHJpeCA9IHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDsKICAgICAgY29uc3QgY2hhcnNldCA9IGZvbnQuZ2V0Q2hhcnNldCgpOwogICAgICBjb25zdCBzZWFjTWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZm9yIChsZXQgZ2x5cGhJZCBpbiBzZWFjcykgewogICAgICAgIGdseXBoSWQgfD0gMDsKICAgICAgICBjb25zdCBzZWFjID0gc2VhY3NbZ2x5cGhJZF07CiAgICAgICAgY29uc3QgYmFzZUdseXBoTmFtZSA9IFN0YW5kYXJkRW5jb2Rpbmdbc2VhY1syXV07CiAgICAgICAgY29uc3QgYWNjZW50R2x5cGhOYW1lID0gU3RhbmRhcmRFbmNvZGluZ1tzZWFjWzNdXTsKICAgICAgICBjb25zdCBiYXNlR2x5cGhJZCA9IGNoYXJzZXQuaW5kZXhPZihiYXNlR2x5cGhOYW1lKTsKICAgICAgICBjb25zdCBhY2NlbnRHbHlwaElkID0gY2hhcnNldC5pbmRleE9mKGFjY2VudEdseXBoTmFtZSk7CiAgICAgICAgaWYgKGJhc2VHbHlwaElkIDwgMCB8fCBhY2NlbnRHbHlwaElkIDwgMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFjY2VudE9mZnNldCA9IHsKICAgICAgICAgIHg6IHNlYWNbMF0gKiBtYXRyaXhbMF0gKyBzZWFjWzFdICogbWF0cml4WzJdICsgbWF0cml4WzRdLAogICAgICAgICAgeTogc2VhY1swXSAqIG1hdHJpeFsxXSArIHNlYWNbMV0gKiBtYXRyaXhbM10gKyBtYXRyaXhbNV0KICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYXJDb2RlcyA9IGdldENoYXJDb2RlcyhtYXBwaW5nLCBnbHlwaElkKTsKICAgICAgICBpZiAoIWNoYXJDb2RlcykgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgb2YgY2hhckNvZGVzKSB7CiAgICAgICAgICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQ7CiAgICAgICAgICBjb25zdCBiYXNlRm9udENoYXJDb2RlID0gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGJhc2VHbHlwaElkKTsKICAgICAgICAgIGNvbnN0IGFjY2VudEZvbnRDaGFyQ29kZSA9IGNyZWF0ZUNoYXJDb2RlKGNoYXJDb2RlVG9HbHlwaElkLCBhY2NlbnRHbHlwaElkKTsKICAgICAgICAgIHNlYWNNYXBbY2hhckNvZGVdID0gewogICAgICAgICAgICBiYXNlRm9udENoYXJDb2RlLAogICAgICAgICAgICBhY2NlbnRGb250Q2hhckNvZGUsCiAgICAgICAgICAgIGFjY2VudE9mZnNldAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHJvcGVydGllcy5zZWFjTWFwID0gc2VhY01hcDsKICAgIH0KICAgIGNvbnN0IHVuaXRzUGVyRW0gPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXggPyAxIC8gTWF0aC5tYXgoLi4ucHJvcGVydGllcy5mb250TWF0cml4LnNsaWNlKDAsIDQpLm1hcChNYXRoLmFicykpIDogMTAwMDsKICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgT3BlblR5cGVGaWxlQnVpbGRlcigiXHg0Rlx4NTRceDU0XHg0RiIpOwogICAgYnVpbGRlci5hZGRUYWJsZSgiQ0ZGICIsIGZvbnQuZGF0YSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJPUy8yIiwgY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3Q2hhckNvZGVUb0dseXBoSWQpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImNtYXAiLCBjcmVhdGVDbWFwVGFibGUobmV3Q2hhckNvZGVUb0dseXBoSWQsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImhlYWQiLCAiXHgwMFx4MDFceDAwXHgwMCIgKyAiXHgwMFx4MDBceDEwXHgwMCIgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAiXHg1Rlx4MEZceDNDXHhGNSIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHVuaXRzUGVyRW0pICsgIlx4MDBceDAwXHgwMFx4MDBceDllXHgwYlx4N2VceDI3IiArICJceDAwXHgwMFx4MDBceDAwXHg5ZVx4MGJceDdlXHgyNyIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuZGVzY2VudCkgKyAiXHgwRlx4RkYiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuYXNjZW50KSArIHN0cmluZzE2KHByb3BlcnRpZXMuaXRhbGljQW5nbGUgPyAyIDogMCkgKyAiXHgwMFx4MTEiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImhoZWEiLCAiXHgwMFx4MDFceDAwXHgwMCIgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5hc2NlbnQpICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuZGVzY2VudCkgKyAiXHgwMFx4MDAiICsgIlx4RkZceEZGIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmNhcEhlaWdodCkgKyBzYWZlU3RyaW5nMTYoTWF0aC50YW4ocHJvcGVydGllcy5pdGFsaWNBbmdsZSkgKiBwcm9wZXJ0aWVzLnhIZWlnaHQpICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgc3RyaW5nMTYobnVtR2x5cGhzKSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJobXR4IiwgZnVuY3Rpb24gZm9udEZpZWxkc0htdHgoKSB7CiAgICAgIGNvbnN0IGNoYXJzdHJpbmdzID0gZm9udC5jaGFyc3RyaW5nczsKICAgICAgY29uc3QgY2ZmV2lkdGhzID0gZm9udC5jZmYgPyBmb250LmNmZi53aWR0aHMgOiBudWxsOwogICAgICBsZXQgaG10eCA9ICJceDAwXHgwMFx4MDBceDAwIjsKICAgICAgZm9yIChsZXQgaSA9IDEsIGlpID0gbnVtR2x5cGhzOyBpIDwgaWk7IGkrKykgewogICAgICAgIGxldCB3aWR0aCA9IDA7CiAgICAgICAgaWYgKGNoYXJzdHJpbmdzKSB7CiAgICAgICAgICBjb25zdCBjaGFyc3RyaW5nID0gY2hhcnN0cmluZ3NbaSAtIDFdOwogICAgICAgICAgd2lkdGggPSAid2lkdGgiIGluIGNoYXJzdHJpbmcgPyBjaGFyc3RyaW5nLndpZHRoIDogMDsKICAgICAgICB9IGVsc2UgaWYgKGNmZldpZHRocykgewogICAgICAgICAgd2lkdGggPSBNYXRoLmNlaWwoY2ZmV2lkdGhzW2ldIHx8IDApOwogICAgICAgIH0KICAgICAgICBobXR4ICs9IHN0cmluZzE2KHdpZHRoKSArIHN0cmluZzE2KDApOwogICAgICB9CiAgICAgIHJldHVybiBobXR4OwogICAgfSgpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoIm1heHAiLCAiXHgwMFx4MDBceDUwXHgwMCIgKyBzdHJpbmcxNihudW1HbHlwaHMpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoIm5hbWUiLCBjcmVhdGVOYW1lVGFibGUoZm9udE5hbWUpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoInBvc3QiLCBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykpOwogICAgcmV0dXJuIGJ1aWxkZXIudG9BcnJheSgpOwogIH0KICBnZXQgX3NwYWNlV2lkdGgoKSB7CiAgICBjb25zdCBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzID0gWyJzcGFjZSIsICJtaW51cyIsICJvbmUiLCAiaSIsICJJIl07CiAgICBsZXQgd2lkdGg7CiAgICBmb3IgKGNvbnN0IGdseXBoTmFtZSBvZiBwb3NzaWJsZVNwYWNlUmVwbGFjZW1lbnRzKSB7CiAgICAgIGlmIChnbHlwaE5hbWUgaW4gdGhpcy53aWR0aHMpIHsKICAgICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2dseXBoTmFtZV07CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICAgICAgY29uc3QgZ2x5cGhVbmljb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtnbHlwaE5hbWVdOwogICAgICBsZXQgY2hhcmNvZGUgPSAwOwogICAgICBpZiAodGhpcy5jb21wb3NpdGUgJiYgdGhpcy5jTWFwLmNvbnRhaW5zKGdseXBoVW5pY29kZSkpIHsKICAgICAgICBjaGFyY29kZSA9IHRoaXMuY01hcC5sb29rdXAoZ2x5cGhVbmljb2RlKTsKICAgICAgICBpZiAodHlwZW9mIGNoYXJjb2RlID09PSAic3RyaW5nIikgewogICAgICAgICAgY2hhcmNvZGUgPSBjb252ZXJ0Q2lkU3RyaW5nKGdseXBoVW5pY29kZSwgY2hhcmNvZGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWNoYXJjb2RlICYmIHRoaXMudG9Vbmljb2RlKSB7CiAgICAgICAgY2hhcmNvZGUgPSB0aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGdseXBoVW5pY29kZSk7CiAgICAgIH0KICAgICAgaWYgKGNoYXJjb2RlIDw9IDApIHsKICAgICAgICBjaGFyY29kZSA9IGdseXBoVW5pY29kZTsKICAgICAgfQogICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2NoYXJjb2RlXTsKICAgICAgaWYgKHdpZHRoKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIl9zcGFjZVdpZHRoIiwgd2lkdGggfHwgdGhpcy5kZWZhdWx0V2lkdGgpOwogIH0KICBfY2hhclRvR2x5cGgoY2hhcmNvZGUsIGlzU3BhY2UgPSBmYWxzZSkgewogICAgbGV0IGdseXBoID0gdGhpcy5fZ2x5cGhDYWNoZVtjaGFyY29kZV07CiAgICBpZiAoZ2x5cGg/LmlzU3BhY2UgPT09IGlzU3BhY2UpIHsKICAgICAgcmV0dXJuIGdseXBoOwogICAgfQogICAgbGV0IGZvbnRDaGFyQ29kZSwgd2lkdGgsIG9wZXJhdG9yTGlzdElkOwogICAgbGV0IHdpZHRoQ29kZSA9IGNoYXJjb2RlOwogICAgaWYgKHRoaXMuY01hcD8uY29udGFpbnMoY2hhcmNvZGUpKSB7CiAgICAgIHdpZHRoQ29kZSA9IHRoaXMuY01hcC5sb29rdXAoY2hhcmNvZGUpOwogICAgICBpZiAodHlwZW9mIHdpZHRoQ29kZSA9PT0gInN0cmluZyIpIHsKICAgICAgICB3aWR0aENvZGUgPSBjb252ZXJ0Q2lkU3RyaW5nKGNoYXJjb2RlLCB3aWR0aENvZGUpOwogICAgICB9CiAgICB9CiAgICB3aWR0aCA9IHRoaXMud2lkdGhzW3dpZHRoQ29kZV07CiAgICBpZiAodHlwZW9mIHdpZHRoICE9PSAibnVtYmVyIikgewogICAgICB3aWR0aCA9IHRoaXMuZGVmYXVsdFdpZHRoOwogICAgfQogICAgY29uc3Qgdm1ldHJpYyA9IHRoaXMudm1ldHJpY3M/Llt3aWR0aENvZGVdOwogICAgbGV0IHVuaWNvZGUgPSB0aGlzLnRvVW5pY29kZS5nZXQoY2hhcmNvZGUpIHx8IGNoYXJjb2RlOwogICAgaWYgKHR5cGVvZiB1bmljb2RlID09PSAibnVtYmVyIikgewogICAgICB1bmljb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSh1bmljb2RlKTsKICAgIH0KICAgIGxldCBpc0luRm9udCA9IHRoaXMudG9Gb250Q2hhcltjaGFyY29kZV0gIT09IHVuZGVmaW5lZDsKICAgIGZvbnRDaGFyQ29kZSA9IHRoaXMudG9Gb250Q2hhcltjaGFyY29kZV0gfHwgY2hhcmNvZGU7CiAgICBpZiAodGhpcy5taXNzaW5nRmlsZSkgewogICAgICBjb25zdCBnbHlwaE5hbWUgPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJjb2RlXSB8fCB0aGlzLmRlZmF1bHRFbmNvZGluZ1tjaGFyY29kZV07CiAgICAgIGlmICgoZ2x5cGhOYW1lID09PSAiLm5vdGRlZiIgfHwgZ2x5cGhOYW1lID09PSAiIikgJiYgdGhpcy50eXBlID09PSAiVHlwZTEiKSB7CiAgICAgICAgZm9udENoYXJDb2RlID0gMHgyMDsKICAgICAgICBpZiAoZ2x5cGhOYW1lID09PSAiIikgewogICAgICAgICAgd2lkdGggfHw9IHRoaXMuX3NwYWNlV2lkdGg7CiAgICAgICAgICB1bmljb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZShmb250Q2hhckNvZGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb250Q2hhckNvZGUgPSBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyhmb250Q2hhckNvZGUpOwogICAgfQogICAgaWYgKHRoaXMuaXNUeXBlM0ZvbnQpIHsKICAgICAgb3BlcmF0b3JMaXN0SWQgPSBmb250Q2hhckNvZGU7CiAgICB9CiAgICBsZXQgYWNjZW50ID0gbnVsbDsKICAgIGlmICh0aGlzLnNlYWNNYXA/LltjaGFyY29kZV0pIHsKICAgICAgaXNJbkZvbnQgPSB0cnVlOwogICAgICBjb25zdCBzZWFjID0gdGhpcy5zZWFjTWFwW2NoYXJjb2RlXTsKICAgICAgZm9udENoYXJDb2RlID0gc2VhYy5iYXNlRm9udENoYXJDb2RlOwogICAgICBhY2NlbnQgPSB7CiAgICAgICAgZm9udENoYXI6IFN0cmluZy5mcm9tQ29kZVBvaW50KHNlYWMuYWNjZW50Rm9udENoYXJDb2RlKSwKICAgICAgICBvZmZzZXQ6IHNlYWMuYWNjZW50T2Zmc2V0CiAgICAgIH07CiAgICB9CiAgICBsZXQgZm9udENoYXIgPSAiIjsKICAgIGlmICh0eXBlb2YgZm9udENoYXJDb2RlID09PSAibnVtYmVyIikgewogICAgICBpZiAoZm9udENoYXJDb2RlIDw9IDB4MTBmZmZmKSB7CiAgICAgICAgZm9udENoYXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChmb250Q2hhckNvZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oYGNoYXJUb0dseXBoIC0gaW52YWxpZCBmb250Q2hhckNvZGU6ICR7Zm9udENoYXJDb2RlfWApOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5taXNzaW5nRmlsZSAmJiB0aGlzLnZlcnRpY2FsICYmIGZvbnRDaGFyLmxlbmd0aCA9PT0gMSkgewogICAgICBjb25zdCB2ZXJ0aWNhbCA9IGdldFZlcnRpY2FsUHJlc2VudGF0aW9uRm9ybSgpW2ZvbnRDaGFyLmNoYXJDb2RlQXQoMCldOwogICAgICBpZiAodmVydGljYWwpIHsKICAgICAgICBmb250Q2hhciA9IHVuaWNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZlcnRpY2FsKTsKICAgICAgfQogICAgfQogICAgZ2x5cGggPSBuZXcgZm9udHNfR2x5cGgoY2hhcmNvZGUsIGZvbnRDaGFyLCB1bmljb2RlLCBhY2NlbnQsIHdpZHRoLCB2bWV0cmljLCBvcGVyYXRvckxpc3RJZCwgaXNTcGFjZSwgaXNJbkZvbnQpOwogICAgcmV0dXJuIHRoaXMuX2dseXBoQ2FjaGVbY2hhcmNvZGVdID0gZ2x5cGg7CiAgfQogIGNoYXJzVG9HbHlwaHMoY2hhcnMpIHsKICAgIGxldCBnbHlwaHMgPSB0aGlzLl9jaGFyc0NhY2hlW2NoYXJzXTsKICAgIGlmIChnbHlwaHMpIHsKICAgICAgcmV0dXJuIGdseXBoczsKICAgIH0KICAgIGdseXBocyA9IFtdOwogICAgaWYgKHRoaXMuY01hcCkgewogICAgICBjb25zdCBjID0gT2JqZWN0LmNyZWF0ZShudWxsKSwKICAgICAgICBpaSA9IGNoYXJzLmxlbmd0aDsKICAgICAgbGV0IGkgPSAwOwogICAgICB3aGlsZSAoaSA8IGlpKSB7CiAgICAgICAgdGhpcy5jTWFwLnJlYWRDaGFyQ29kZShjaGFycywgaSwgYyk7CiAgICAgICAgY29uc3QgewogICAgICAgICAgY2hhcmNvZGUsCiAgICAgICAgICBsZW5ndGgKICAgICAgICB9ID0gYzsKICAgICAgICBpICs9IGxlbmd0aDsKICAgICAgICBjb25zdCBnbHlwaCA9IHRoaXMuX2NoYXJUb0dseXBoKGNoYXJjb2RlLCBsZW5ndGggPT09IDEgJiYgY2hhcnMuY2hhckNvZGVBdChpIC0gMSkgPT09IDB4MjApOwogICAgICAgIGdseXBocy5wdXNoKGdseXBoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY2hhcnMubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICAgIGNvbnN0IGNoYXJjb2RlID0gY2hhcnMuY2hhckNvZGVBdChpKTsKICAgICAgICBjb25zdCBnbHlwaCA9IHRoaXMuX2NoYXJUb0dseXBoKGNoYXJjb2RlLCBjaGFyY29kZSA9PT0gMHgyMCk7CiAgICAgICAgZ2x5cGhzLnB1c2goZ2x5cGgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5fY2hhcnNDYWNoZVtjaGFyc10gPSBnbHlwaHM7CiAgfQogIGdldENoYXJQb3NpdGlvbnMoY2hhcnMpIHsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IFtdOwogICAgaWYgKHRoaXMuY01hcCkgewogICAgICBjb25zdCBjID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgbGV0IGkgPSAwOwogICAgICB3aGlsZSAoaSA8IGNoYXJzLmxlbmd0aCkgewogICAgICAgIHRoaXMuY01hcC5yZWFkQ2hhckNvZGUoY2hhcnMsIGksIGMpOwogICAgICAgIGNvbnN0IGxlbmd0aCA9IGMubGVuZ3RoOwogICAgICAgIHBvc2l0aW9ucy5wdXNoKFtpLCBpICsgbGVuZ3RoXSk7CiAgICAgICAgaSArPSBsZW5ndGg7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgICBwb3NpdGlvbnMucHVzaChbaSwgaSArIDFdKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBvc2l0aW9uczsKICB9CiAgZ2V0IGdseXBoQ2FjaGVWYWx1ZXMoKSB7CiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9nbHlwaENhY2hlKTsKICB9CiAgZW5jb2RlU3RyaW5nKHN0cikgewogICAgY29uc3QgYnVmZmVycyA9IFtdOwogICAgY29uc3QgY3VycmVudEJ1ZiA9IFtdOwogICAgY29uc3QgaGFzQ3VycmVudEJ1ZkVycm9ycyA9ICgpID0+IGJ1ZmZlcnMubGVuZ3RoICUgMiA9PT0gMTsKICAgIGNvbnN0IGdldENoYXJDb2RlID0gdGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCA/IHVuaWNvZGUgPT4gdGhpcy50b1VuaWNvZGUuY2hhckNvZGVPZih1bmljb2RlKSA6IHVuaWNvZGUgPT4gdGhpcy50b1VuaWNvZGUuY2hhckNvZGVPZihTdHJpbmcuZnJvbUNvZGVQb2ludCh1bmljb2RlKSk7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCB1bmljb2RlID0gc3RyLmNvZGVQb2ludEF0KGkpOwogICAgICBpZiAodW5pY29kZSA+IDB4ZDdmZiAmJiAodW5pY29kZSA8IDB4ZTAwMCB8fCB1bmljb2RlID4gMHhmZmZkKSkgewogICAgICAgIGkrKzsKICAgICAgfQogICAgICBpZiAodGhpcy50b1VuaWNvZGUpIHsKICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGdldENoYXJDb2RlKHVuaWNvZGUpOwogICAgICAgIGlmIChjaGFyQ29kZSAhPT0gLTEpIHsKICAgICAgICAgIGlmIChoYXNDdXJyZW50QnVmRXJyb3JzKCkpIHsKICAgICAgICAgICAgYnVmZmVycy5wdXNoKGN1cnJlbnRCdWYuam9pbigiIikpOwogICAgICAgICAgICBjdXJyZW50QnVmLmxlbmd0aCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBjaGFyQ29kZUxlbmd0aCA9IHRoaXMuY01hcCA/IHRoaXMuY01hcC5nZXRDaGFyQ29kZUxlbmd0aChjaGFyQ29kZSkgOiAxOwogICAgICAgICAgZm9yIChsZXQgaiA9IGNoYXJDb2RlTGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICAgICAgY3VycmVudEJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUgPj4gOCAqIGogJiAweGZmKSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFoYXNDdXJyZW50QnVmRXJyb3JzKCkpIHsKICAgICAgICBidWZmZXJzLnB1c2goY3VycmVudEJ1Zi5qb2luKCIiKSk7CiAgICAgICAgY3VycmVudEJ1Zi5sZW5ndGggPSAwOwogICAgICB9CiAgICAgIGN1cnJlbnRCdWYucHVzaChTdHJpbmcuZnJvbUNvZGVQb2ludCh1bmljb2RlKSk7CiAgICB9CiAgICBidWZmZXJzLnB1c2goY3VycmVudEJ1Zi5qb2luKCIiKSk7CiAgICByZXR1cm4gYnVmZmVyczsKICB9Cn0KY2xhc3MgRXJyb3JGb250IHsKICBjb25zdHJ1Y3RvcihlcnJvcikgewogICAgdGhpcy5lcnJvciA9IGVycm9yOwogICAgdGhpcy5sb2FkZWROYW1lID0gImdfZm9udF9lcnJvciI7CiAgICB0aGlzLm1pc3NpbmdGaWxlID0gdHJ1ZTsKICB9CiAgY2hhcnNUb0dseXBocygpIHsKICAgIHJldHVybiBbXTsKICB9CiAgZW5jb2RlU3RyaW5nKGNoYXJzKSB7CiAgICByZXR1cm4gW2NoYXJzXTsKICB9CiAgZXhwb3J0RGF0YSgpIHsKICAgIHJldHVybiB7CiAgICAgIGVycm9yOiB0aGlzLmVycm9yCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvcGF0dGVybi5qcwoKCgoKY29uc3QgU2hhZGluZ1R5cGUgPSB7CiAgRlVOQ1RJT05fQkFTRUQ6IDEsCiAgQVhJQUw6IDIsCiAgUkFESUFMOiAzLAogIEZSRUVfRk9STV9NRVNIOiA0LAogIExBVFRJQ0VfRk9STV9NRVNIOiA1LAogIENPT05TX1BBVENIX01FU0g6IDYsCiAgVEVOU09SX1BBVENIX01FU0g6IDcKfTsKY2xhc3MgUGF0dGVybiB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB1bnJlYWNoYWJsZSgiQ2Fubm90IGluaXRpYWxpemUgUGF0dGVybi4iKTsKICB9CiAgc3RhdGljIHBhcnNlU2hhZGluZyhzaGFkaW5nLCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgewogICAgY29uc3QgZGljdCA9IHNoYWRpbmcgaW5zdGFuY2VvZiBCYXNlU3RyZWFtID8gc2hhZGluZy5kaWN0IDogc2hhZGluZzsKICAgIGNvbnN0IHR5cGUgPSBkaWN0LmdldCgiU2hhZGluZ1R5cGUiKTsKICAgIHRyeSB7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQVhJQUw6CiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5SQURJQUw6CiAgICAgICAgICByZXR1cm4gbmV3IFJhZGlhbEF4aWFsU2hhZGluZyhkaWN0LCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5GUkVFX0ZPUk1fTUVTSDoKICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLkxBVFRJQ0VfRk9STV9NRVNIOgogICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQ09PTlNfUEFUQ0hfTUVTSDoKICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLlRFTlNPUl9QQVRDSF9NRVNIOgogICAgICAgICAgcmV0dXJuIG5ldyBNZXNoU2hhZGluZyhzaGFkaW5nLCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5zdXBwb3J0ZWQgU2hhZGluZ1R5cGU6ICIgKyB0eXBlKTsKICAgICAgfQogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGV4KTsKICAgICAgcmV0dXJuIG5ldyBEdW1teVNoYWRpbmcoKTsKICAgIH0KICB9Cn0KY2xhc3MgQmFzZVNoYWRpbmcgewogIHN0YXRpYyBTTUFMTF9OVU1CRVIgPSAxZS02OwogIGdldElSKCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0SVJgIGNhbGxlZC4iKTsKICB9Cn0KY2xhc3MgUmFkaWFsQXhpYWxTaGFkaW5nIGV4dGVuZHMgQmFzZVNoYWRpbmcgewogIGNvbnN0cnVjdG9yKGRpY3QsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5zaGFkaW5nVHlwZSA9IGRpY3QuZ2V0KCJTaGFkaW5nVHlwZSIpOwogICAgbGV0IGNvb3Jkc0xlbiA9IDA7CiAgICBpZiAodGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuQVhJQUwpIHsKICAgICAgY29vcmRzTGVuID0gNDsKICAgIH0gZWxzZSBpZiAodGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuUkFESUFMKSB7CiAgICAgIGNvb3Jkc0xlbiA9IDY7CiAgICB9CiAgICB0aGlzLmNvb3Jkc0FyciA9IGRpY3QuZ2V0QXJyYXkoIkNvb3JkcyIpOwogICAgaWYgKCFpc051bWJlckFycmF5KHRoaXMuY29vcmRzQXJyLCBjb29yZHNMZW4pKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiUmFkaWFsQXhpYWxTaGFkaW5nOiBJbnZhbGlkIC9Db29yZHMgYXJyYXkuIik7CiAgICB9CiAgICBjb25zdCBjcyA9IENvbG9yU3BhY2VVdGlscy5wYXJzZSh7CiAgICAgIGNzOiBkaWN0LmdldFJhdygiQ1MiKSB8fCBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpLAogICAgICB4cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgfSk7CiAgICB0aGlzLmJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkJCb3giKSwgbnVsbCk7CiAgICBsZXQgdDAgPSAwLjAsCiAgICAgIHQxID0gMS4wOwogICAgY29uc3QgZG9tYWluQXJyID0gZGljdC5nZXRBcnJheSgiRG9tYWluIik7CiAgICBpZiAoaXNOdW1iZXJBcnJheShkb21haW5BcnIsIDIpKSB7CiAgICAgIFt0MCwgdDFdID0gZG9tYWluQXJyOwogICAgfQogICAgbGV0IGV4dGVuZFN0YXJ0ID0gZmFsc2UsCiAgICAgIGV4dGVuZEVuZCA9IGZhbHNlOwogICAgY29uc3QgZXh0ZW5kQXJyID0gZGljdC5nZXRBcnJheSgiRXh0ZW5kIik7CiAgICBpZiAoaXNCb29sZWFuQXJyYXkoZXh0ZW5kQXJyLCAyKSkgewogICAgICBbZXh0ZW5kU3RhcnQsIGV4dGVuZEVuZF0gPSBleHRlbmRBcnI7CiAgICB9CiAgICBpZiAodGhpcy5zaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuUkFESUFMICYmICghZXh0ZW5kU3RhcnQgfHwgIWV4dGVuZEVuZCkpIHsKICAgICAgY29uc3QgW3gxLCB5MSwgcjEsIHgyLCB5MiwgcjJdID0gdGhpcy5jb29yZHNBcnI7CiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5oeXBvdCh4MSAtIHgyLCB5MSAtIHkyKTsKICAgICAgaWYgKHIxIDw9IHIyICsgZGlzdGFuY2UgJiYgcjIgPD0gcjEgKyBkaXN0YW5jZSkgewogICAgICAgIHdhcm4oIlVuc3VwcG9ydGVkIHJhZGlhbCBncmFkaWVudC4iKTsKICAgICAgfQogICAgfQogICAgdGhpcy5leHRlbmRTdGFydCA9IGV4dGVuZFN0YXJ0OwogICAgdGhpcy5leHRlbmRFbmQgPSBleHRlbmRFbmQ7CiAgICBjb25zdCBmbk9iaiA9IGRpY3QuZ2V0UmF3KCJGdW5jdGlvbiIpOwogICAgY29uc3QgZm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKGZuT2JqLCB0cnVlKTsKICAgIGNvbnN0IE5VTUJFUl9PRl9TQU1QTEVTID0gODQwOwogICAgY29uc3Qgc3RlcCA9ICh0MSAtIHQwKSAvIE5VTUJFUl9PRl9TQU1QTEVTOwogICAgY29uc3QgY29sb3JTdG9wcyA9IHRoaXMuY29sb3JTdG9wcyA9IFtdOwogICAgaWYgKHQwID49IHQxIHx8IHN0ZXAgPD0gMCkgewogICAgICBpbmZvKCJCYWQgc2hhZGluZyBkb21haW4uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNvbG9yID0gbmV3IEZsb2F0MzJBcnJheShjcy5udW1Db21wcyksCiAgICAgIHJhdGlvID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgIGxldCByZ2JDb2xvcjsKICAgIGxldCBpQmFzZSA9IDA7CiAgICByYXRpb1swXSA9IHQwOwogICAgZm4ocmF0aW8sIDAsIGNvbG9yLCAwKTsKICAgIGxldCByZ2JCYXNlID0gY3MuZ2V0UmdiKGNvbG9yLCAwKTsKICAgIGNvbnN0IGNzc0NvbG9yQmFzZSA9IFV0aWwubWFrZUhleENvbG9yKHJnYkJhc2VbMF0sIHJnYkJhc2VbMV0sIHJnYkJhc2VbMl0pOwogICAgY29sb3JTdG9wcy5wdXNoKFswLCBjc3NDb2xvckJhc2VdKTsKICAgIGxldCBpUHJldiA9IDE7CiAgICByYXRpb1swXSA9IHQwICsgc3RlcDsKICAgIGZuKHJhdGlvLCAwLCBjb2xvciwgMCk7CiAgICBsZXQgcmdiUHJldiA9IGNzLmdldFJnYihjb2xvciwgMCk7CiAgICBsZXQgbWF4U2xvcGVSID0gcmdiUHJldlswXSAtIHJnYkJhc2VbMF0gKyAxOwogICAgbGV0IG1heFNsb3BlRyA9IHJnYlByZXZbMV0gLSByZ2JCYXNlWzFdICsgMTsKICAgIGxldCBtYXhTbG9wZUIgPSByZ2JQcmV2WzJdIC0gcmdiQmFzZVsyXSArIDE7CiAgICBsZXQgbWluU2xvcGVSID0gcmdiUHJldlswXSAtIHJnYkJhc2VbMF0gLSAxOwogICAgbGV0IG1pblNsb3BlRyA9IHJnYlByZXZbMV0gLSByZ2JCYXNlWzFdIC0gMTsKICAgIGxldCBtaW5TbG9wZUIgPSByZ2JQcmV2WzJdIC0gcmdiQmFzZVsyXSAtIDE7CiAgICBmb3IgKGxldCBpID0gMjsgaSA8IE5VTUJFUl9PRl9TQU1QTEVTOyBpKyspIHsKICAgICAgcmF0aW9bMF0gPSB0MCArIGkgKiBzdGVwOwogICAgICBmbihyYXRpbywgMCwgY29sb3IsIDApOwogICAgICByZ2JDb2xvciA9IGNzLmdldFJnYihjb2xvciwgMCk7CiAgICAgIGNvbnN0IHJ1biA9IGkgLSBpQmFzZTsKICAgICAgbWF4U2xvcGVSID0gTWF0aC5taW4obWF4U2xvcGVSLCAocmdiQ29sb3JbMF0gLSByZ2JCYXNlWzBdICsgMSkgLyBydW4pOwogICAgICBtYXhTbG9wZUcgPSBNYXRoLm1pbihtYXhTbG9wZUcsIChyZ2JDb2xvclsxXSAtIHJnYkJhc2VbMV0gKyAxKSAvIHJ1bik7CiAgICAgIG1heFNsb3BlQiA9IE1hdGgubWluKG1heFNsb3BlQiwgKHJnYkNvbG9yWzJdIC0gcmdiQmFzZVsyXSArIDEpIC8gcnVuKTsKICAgICAgbWluU2xvcGVSID0gTWF0aC5tYXgobWluU2xvcGVSLCAocmdiQ29sb3JbMF0gLSByZ2JCYXNlWzBdIC0gMSkgLyBydW4pOwogICAgICBtaW5TbG9wZUcgPSBNYXRoLm1heChtaW5TbG9wZUcsIChyZ2JDb2xvclsxXSAtIHJnYkJhc2VbMV0gLSAxKSAvIHJ1bik7CiAgICAgIG1pblNsb3BlQiA9IE1hdGgubWF4KG1pblNsb3BlQiwgKHJnYkNvbG9yWzJdIC0gcmdiQmFzZVsyXSAtIDEpIC8gcnVuKTsKICAgICAgY29uc3Qgc2xvcGVzRXhpc3QgPSBtaW5TbG9wZVIgPD0gbWF4U2xvcGVSICYmIG1pblNsb3BlRyA8PSBtYXhTbG9wZUcgJiYgbWluU2xvcGVCIDw9IG1heFNsb3BlQjsKICAgICAgaWYgKCFzbG9wZXNFeGlzdCkgewogICAgICAgIGNvbnN0IGNzc0NvbG9yID0gVXRpbC5tYWtlSGV4Q29sb3IocmdiUHJldlswXSwgcmdiUHJldlsxXSwgcmdiUHJldlsyXSk7CiAgICAgICAgY29sb3JTdG9wcy5wdXNoKFtpUHJldiAvIE5VTUJFUl9PRl9TQU1QTEVTLCBjc3NDb2xvcl0pOwogICAgICAgIG1heFNsb3BlUiA9IHJnYkNvbG9yWzBdIC0gcmdiUHJldlswXSArIDE7CiAgICAgICAgbWF4U2xvcGVHID0gcmdiQ29sb3JbMV0gLSByZ2JQcmV2WzFdICsgMTsKICAgICAgICBtYXhTbG9wZUIgPSByZ2JDb2xvclsyXSAtIHJnYlByZXZbMl0gKyAxOwogICAgICAgIG1pblNsb3BlUiA9IHJnYkNvbG9yWzBdIC0gcmdiUHJldlswXSAtIDE7CiAgICAgICAgbWluU2xvcGVHID0gcmdiQ29sb3JbMV0gLSByZ2JQcmV2WzFdIC0gMTsKICAgICAgICBtaW5TbG9wZUIgPSByZ2JDb2xvclsyXSAtIHJnYlByZXZbMl0gLSAxOwogICAgICAgIGlCYXNlID0gaVByZXY7CiAgICAgICAgcmdiQmFzZSA9IHJnYlByZXY7CiAgICAgIH0KICAgICAgaVByZXYgPSBpOwogICAgICByZ2JQcmV2ID0gcmdiQ29sb3I7CiAgICB9CiAgICBjb25zdCBjc3NDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKHJnYlByZXZbMF0sIHJnYlByZXZbMV0sIHJnYlByZXZbMl0pOwogICAgY29sb3JTdG9wcy5wdXNoKFsxLCBjc3NDb2xvcl0pOwogICAgbGV0IGJhY2tncm91bmQgPSAidHJhbnNwYXJlbnQiOwogICAgaWYgKGRpY3QuaGFzKCJCYWNrZ3JvdW5kIikpIHsKICAgICAgcmdiQ29sb3IgPSBjcy5nZXRSZ2IoZGljdC5nZXQoIkJhY2tncm91bmQiKSwgMCk7CiAgICAgIGJhY2tncm91bmQgPSBVdGlsLm1ha2VIZXhDb2xvcihyZ2JDb2xvclswXSwgcmdiQ29sb3JbMV0sIHJnYkNvbG9yWzJdKTsKICAgIH0KICAgIGlmICghZXh0ZW5kU3RhcnQpIHsKICAgICAgY29sb3JTdG9wcy51bnNoaWZ0KFswLCBiYWNrZ3JvdW5kXSk7CiAgICAgIGNvbG9yU3RvcHNbMV1bMF0gKz0gQmFzZVNoYWRpbmcuU01BTExfTlVNQkVSOwogICAgfQogICAgaWYgKCFleHRlbmRFbmQpIHsKICAgICAgY29sb3JTdG9wcy5hdCgtMSlbMF0gLT0gQmFzZVNoYWRpbmcuU01BTExfTlVNQkVSOwogICAgICBjb2xvclN0b3BzLnB1c2goWzEsIGJhY2tncm91bmRdKTsKICAgIH0KICAgIHRoaXMuY29sb3JTdG9wcyA9IGNvbG9yU3RvcHM7CiAgfQogIGdldElSKCkgewogICAgY29uc3QgewogICAgICBjb29yZHNBcnIsCiAgICAgIHNoYWRpbmdUeXBlCiAgICB9ID0gdGhpczsKICAgIGxldCB0eXBlLCBwMCwgcDEsIHIwLCByMTsKICAgIGlmIChzaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuQVhJQUwpIHsKICAgICAgcDAgPSBbY29vcmRzQXJyWzBdLCBjb29yZHNBcnJbMV1dOwogICAgICBwMSA9IFtjb29yZHNBcnJbMl0sIGNvb3Jkc0FyclszXV07CiAgICAgIHIwID0gbnVsbDsKICAgICAgcjEgPSBudWxsOwogICAgICB0eXBlID0gImF4aWFsIjsKICAgIH0gZWxzZSBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCkgewogICAgICBwMCA9IFtjb29yZHNBcnJbMF0sIGNvb3Jkc0FyclsxXV07CiAgICAgIHAxID0gW2Nvb3Jkc0FyclszXSwgY29vcmRzQXJyWzRdXTsKICAgICAgcjAgPSBjb29yZHNBcnJbMl07CiAgICAgIHIxID0gY29vcmRzQXJyWzVdOwogICAgICB0eXBlID0gInJhZGlhbCI7CiAgICB9IGVsc2UgewogICAgICB1bnJlYWNoYWJsZShgZ2V0UGF0dGVybiB0eXBlIHVua25vd246ICR7c2hhZGluZ1R5cGV9YCk7CiAgICB9CiAgICByZXR1cm4gWyJSYWRpYWxBeGlhbCIsIHR5cGUsIHRoaXMuYmJveCwgdGhpcy5jb2xvclN0b3BzLCBwMCwgcDEsIHIwLCByMV07CiAgfQp9CmNsYXNzIE1lc2hTdHJlYW1SZWFkZXIgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgY29udGV4dCkgewogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwogICAgdGhpcy5idWZmZXIgPSAwOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOwogICAgY29uc3QgbnVtQ29tcHMgPSBjb250ZXh0Lm51bUNvbXBzOwogICAgdGhpcy50bXBDb21wc0J1ZiA9IG5ldyBGbG9hdDMyQXJyYXkobnVtQ29tcHMpOwogICAgY29uc3QgY3NOdW1Db21wcyA9IGNvbnRleHQuY29sb3JTcGFjZS5udW1Db21wczsKICAgIHRoaXMudG1wQ3NDb21wc0J1ZiA9IGNvbnRleHQuY29sb3JGbiA/IG5ldyBGbG9hdDMyQXJyYXkoY3NOdW1Db21wcykgOiB0aGlzLnRtcENvbXBzQnVmOwogIH0KICBnZXQgaGFzRGF0YSgpIHsKICAgIGlmICh0aGlzLnN0cmVhbS5lbmQpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLnBvcyA8IHRoaXMuc3RyZWFtLmVuZDsKICAgIH0KICAgIGlmICh0aGlzLmJ1ZmZlckxlbmd0aCA+IDApIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdCBuZXh0Qnl0ZSA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKICAgIGlmIChuZXh0Qnl0ZSA8IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdGhpcy5idWZmZXIgPSBuZXh0Qnl0ZTsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gODsKICAgIHJldHVybiB0cnVlOwogIH0KICByZWFkQml0cyhuKSB7CiAgICBjb25zdCB7CiAgICAgIHN0cmVhbQogICAgfSA9IHRoaXM7CiAgICBsZXQgewogICAgICBidWZmZXIsCiAgICAgIGJ1ZmZlckxlbmd0aAogICAgfSA9IHRoaXM7CiAgICBpZiAobiA9PT0gMzIpIHsKICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgfQogICAgICBidWZmZXIgPSBidWZmZXIgPDwgMjQgfCBzdHJlYW0uZ2V0Qnl0ZSgpIDw8IDE2IHwgc3RyZWFtLmdldEJ5dGUoKSA8PCA4IHwgc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgY29uc3QgbmV4dEJ5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICB0aGlzLmJ1ZmZlciA9IG5leHRCeXRlICYgKDEgPDwgYnVmZmVyTGVuZ3RoKSAtIDE7CiAgICAgIHJldHVybiAoYnVmZmVyIDw8IDggLSBidWZmZXJMZW5ndGggfCAobmV4dEJ5dGUgJiAweGZmKSA+PiBidWZmZXJMZW5ndGgpID4+PiAwOwogICAgfQogICAgaWYgKG4gPT09IDggJiYgYnVmZmVyTGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgfQogICAgd2hpbGUgKGJ1ZmZlckxlbmd0aCA8IG4pIHsKICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IDggfCBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICBidWZmZXJMZW5ndGggKz0gODsKICAgIH0KICAgIGJ1ZmZlckxlbmd0aCAtPSBuOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlciAmICgxIDw8IGJ1ZmZlckxlbmd0aCkgLSAxOwogICAgcmV0dXJuIGJ1ZmZlciA+PiBidWZmZXJMZW5ndGg7CiAgfQogIGFsaWduKCkgewogICAgdGhpcy5idWZmZXIgPSAwOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOwogIH0KICByZWFkRmxhZygpIHsKICAgIHJldHVybiB0aGlzLnJlYWRCaXRzKHRoaXMuY29udGV4dC5iaXRzUGVyRmxhZyk7CiAgfQogIHJlYWRDb29yZGluYXRlKCkgewogICAgY29uc3QgewogICAgICBiaXRzUGVyQ29vcmRpbmF0ZSwKICAgICAgZGVjb2RlCiAgICB9ID0gdGhpcy5jb250ZXh0OwogICAgY29uc3QgeGkgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb29yZGluYXRlKTsKICAgIGNvbnN0IHlpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29vcmRpbmF0ZSk7CiAgICBjb25zdCBzY2FsZSA9IGJpdHNQZXJDb29yZGluYXRlIDwgMzIgPyAxIC8gKCgxIDw8IGJpdHNQZXJDb29yZGluYXRlKSAtIDEpIDogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsKICAgIHJldHVybiBbeGkgKiBzY2FsZSAqIChkZWNvZGVbMV0gLSBkZWNvZGVbMF0pICsgZGVjb2RlWzBdLCB5aSAqIHNjYWxlICogKGRlY29kZVszXSAtIGRlY29kZVsyXSkgKyBkZWNvZGVbMl1dOwogIH0KICByZWFkQ29tcG9uZW50cygpIHsKICAgIGNvbnN0IHsKICAgICAgYml0c1BlckNvbXBvbmVudCwKICAgICAgY29sb3JGbiwKICAgICAgY29sb3JTcGFjZSwKICAgICAgZGVjb2RlLAogICAgICBudW1Db21wcwogICAgfSA9IHRoaXMuY29udGV4dDsKICAgIGNvbnN0IHNjYWxlID0gYml0c1BlckNvbXBvbmVudCA8IDMyID8gMSAvICgoMSA8PCBiaXRzUGVyQ29tcG9uZW50KSAtIDEpIDogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsKICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLnRtcENvbXBzQnVmOwogICAgZm9yIChsZXQgaSA9IDAsIGogPSA0OyBpIDwgbnVtQ29tcHM7IGkrKywgaiArPSAyKSB7CiAgICAgIGNvbnN0IGNpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29tcG9uZW50KTsKICAgICAgY29tcG9uZW50c1tpXSA9IGNpICogc2NhbGUgKiAoZGVjb2RlW2ogKyAxXSAtIGRlY29kZVtqXSkgKyBkZWNvZGVbal07CiAgICB9CiAgICBjb25zdCBjb2xvciA9IHRoaXMudG1wQ3NDb21wc0J1ZjsKICAgIGNvbG9yRm4/Lihjb21wb25lbnRzLCAwLCBjb2xvciwgMCk7CiAgICByZXR1cm4gY29sb3JTcGFjZS5nZXRSZ2IoY29sb3IsIDApOwogIH0KfQpsZXQgYkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKZnVuY3Rpb24gYnVpbGRCKGNvdW50KSB7CiAgY29uc3QgbHV0ID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgY29uc3QgdCA9IGkgLyBjb3VudCwKICAgICAgdF8gPSAxIC0gdDsKICAgIGx1dC5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoW3RfICoqIDMsIDMgKiB0ICogdF8gKiogMiwgMyAqIHQgKiogMiAqIHRfLCB0ICoqIDNdKSk7CiAgfQogIHJldHVybiBsdXQ7Cn0KZnVuY3Rpb24gZ2V0Qihjb3VudCkgewogIHJldHVybiBiQ2FjaGVbY291bnRdIHx8PSBidWlsZEIoY291bnQpOwp9CmZ1bmN0aW9uIGNsZWFyUGF0dGVybkNhY2hlcygpIHsKICBiQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwp9CmNsYXNzIE1lc2hTaGFkaW5nIGV4dGVuZHMgQmFzZVNoYWRpbmcgewogIHN0YXRpYyBNSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCA9IDM7CiAgc3RhdGljIE1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UID0gMjA7CiAgc3RhdGljIFRSSUFOR0xFX0RFTlNJVFkgPSAyMDsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBzdXBlcigpOwogICAgaWYgKCEoc3RyZWFtIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJNZXNoIGRhdGEgaXMgbm90IGEgc3RyZWFtIik7CiAgICB9CiAgICBjb25zdCBkaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLnNoYWRpbmdUeXBlID0gZGljdC5nZXQoIlNoYWRpbmdUeXBlIik7CiAgICB0aGlzLmJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkJCb3giKSwgbnVsbCk7CiAgICBjb25zdCBjcyA9IENvbG9yU3BhY2VVdGlscy5wYXJzZSh7CiAgICAgIGNzOiBkaWN0LmdldFJhdygiQ1MiKSB8fCBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpLAogICAgICB4cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgfSk7CiAgICB0aGlzLmJhY2tncm91bmQgPSBkaWN0LmhhcygiQmFja2dyb3VuZCIpID8gY3MuZ2V0UmdiKGRpY3QuZ2V0KCJCYWNrZ3JvdW5kIiksIDApIDogbnVsbDsKICAgIGNvbnN0IGZuT2JqID0gZGljdC5nZXRSYXcoIkZ1bmN0aW9uIik7CiAgICBjb25zdCBmbiA9IGZuT2JqID8gcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZShmbk9iaiwgdHJ1ZSkgOiBudWxsOwogICAgdGhpcy5jb29yZHMgPSBbXTsKICAgIHRoaXMuY29sb3JzID0gW107CiAgICB0aGlzLmZpZ3VyZXMgPSBbXTsKICAgIGNvbnN0IGRlY29kZUNvbnRleHQgPSB7CiAgICAgIGJpdHNQZXJDb29yZGluYXRlOiBkaWN0LmdldCgiQml0c1BlckNvb3JkaW5hdGUiKSwKICAgICAgYml0c1BlckNvbXBvbmVudDogZGljdC5nZXQoIkJpdHNQZXJDb21wb25lbnQiKSwKICAgICAgYml0c1BlckZsYWc6IGRpY3QuZ2V0KCJCaXRzUGVyRmxhZyIpLAogICAgICBkZWNvZGU6IGRpY3QuZ2V0QXJyYXkoIkRlY29kZSIpLAogICAgICBjb2xvckZuOiBmbiwKICAgICAgY29sb3JTcGFjZTogY3MsCiAgICAgIG51bUNvbXBzOiBmbiA/IDEgOiBjcy5udW1Db21wcwogICAgfTsKICAgIGNvbnN0IHJlYWRlciA9IG5ldyBNZXNoU3RyZWFtUmVhZGVyKHN0cmVhbSwgZGVjb2RlQ29udGV4dCk7CiAgICBsZXQgcGF0Y2hNZXNoID0gZmFsc2U7CiAgICBzd2l0Y2ggKHRoaXMuc2hhZGluZ1R5cGUpIHsKICAgICAgY2FzZSBTaGFkaW5nVHlwZS5GUkVFX0ZPUk1fTUVTSDoKICAgICAgICB0aGlzLl9kZWNvZGVUeXBlNFNoYWRpbmcocmVhZGVyKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTaGFkaW5nVHlwZS5MQVRUSUNFX0ZPUk1fTUVTSDoKICAgICAgICBjb25zdCB2ZXJ0aWNlc1BlclJvdyA9IGRpY3QuZ2V0KCJWZXJ0aWNlc1BlclJvdyIpIHwgMDsKICAgICAgICBpZiAodmVydGljZXNQZXJSb3cgPCAyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgVmVydGljZXNQZXJSb3ciKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZGVjb2RlVHlwZTVTaGFkaW5nKHJlYWRlciwgdmVydGljZXNQZXJSb3cpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFNoYWRpbmdUeXBlLkNPT05TX1BBVENIX01FU0g6CiAgICAgICAgdGhpcy5fZGVjb2RlVHlwZTZTaGFkaW5nKHJlYWRlcik7CiAgICAgICAgcGF0Y2hNZXNoID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTaGFkaW5nVHlwZS5URU5TT1JfUEFUQ0hfTUVTSDoKICAgICAgICB0aGlzLl9kZWNvZGVUeXBlN1NoYWRpbmcocmVhZGVyKTsKICAgICAgICBwYXRjaE1lc2ggPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHVucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBtZXNoIHR5cGUuIik7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGF0Y2hNZXNoKSB7CiAgICAgIHRoaXMuX3VwZGF0ZUJvdW5kcygpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLmZpZ3VyZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIHRoaXMuX2J1aWxkRmlndXJlRnJvbVBhdGNoKGkpOwogICAgICB9CiAgICB9CiAgICB0aGlzLl91cGRhdGVCb3VuZHMoKTsKICAgIHRoaXMuX3BhY2tEYXRhKCk7CiAgfQogIF9kZWNvZGVUeXBlNFNoYWRpbmcocmVhZGVyKSB7CiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmNvb3JkczsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuY29sb3JzOwogICAgY29uc3Qgb3BlcmF0b3JzID0gW107CiAgICBjb25zdCBwcyA9IFtdOwogICAgbGV0IHZlcnRpY2VzTGVmdCA9IDA7CiAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKICAgICAgY29uc3QgZiA9IHJlYWRlci5yZWFkRmxhZygpOwogICAgICBjb25zdCBjb29yZCA9IHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpOwogICAgICBjb25zdCBjb2xvciA9IHJlYWRlci5yZWFkQ29tcG9uZW50cygpOwogICAgICBpZiAodmVydGljZXNMZWZ0ID09PSAwKSB7CiAgICAgICAgaWYgKCEoMCA8PSBmICYmIGYgPD0gMikpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNCBmbGFnIik7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoZikgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAzOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgcHMucHVzaChwcy5hdCgtMiksIHBzLmF0KC0xKSk7CiAgICAgICAgICAgIHZlcnRpY2VzTGVmdCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBwcy5wdXNoKHBzLmF0KC0zKSwgcHMuYXQoLTEpKTsKICAgICAgICAgICAgdmVydGljZXNMZWZ0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG9wZXJhdG9ycy5wdXNoKGYpOwogICAgICB9CiAgICAgIHBzLnB1c2goY29vcmRzLmxlbmd0aCk7CiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTsKICAgICAgY29sb3JzLnB1c2goY29sb3IpOwogICAgICB2ZXJ0aWNlc0xlZnQtLTsKICAgICAgcmVhZGVyLmFsaWduKCk7CiAgICB9CiAgICB0aGlzLmZpZ3VyZXMucHVzaCh7CiAgICAgIHR5cGU6ICJ0cmlhbmdsZXMiLAogICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgY29sb3JzOiBuZXcgSW50MzJBcnJheShwcykKICAgIH0pOwogIH0KICBfZGVjb2RlVHlwZTVTaGFkaW5nKHJlYWRlciwgdmVydGljZXNQZXJSb3cpIHsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwcyA9IFtdOwogICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7CiAgICAgIGNvbnN0IGNvb3JkID0gcmVhZGVyLnJlYWRDb29yZGluYXRlKCk7CiAgICAgIGNvbnN0IGNvbG9yID0gcmVhZGVyLnJlYWRDb21wb25lbnRzKCk7CiAgICAgIHBzLnB1c2goY29vcmRzLmxlbmd0aCk7CiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTsKICAgICAgY29sb3JzLnB1c2goY29sb3IpOwogICAgfQogICAgdGhpcy5maWd1cmVzLnB1c2goewogICAgICB0eXBlOiAibGF0dGljZSIsCiAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAogICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgdmVydGljZXNQZXJSb3cKICAgIH0pOwogIH0KICBfZGVjb2RlVHlwZTZTaGFkaW5nKHJlYWRlcikgewogICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHM7CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9yczsKICAgIGNvbnN0IHBzID0gbmV3IEludDMyQXJyYXkoMTYpOwogICAgY29uc3QgY3MgPSBuZXcgSW50MzJBcnJheSg0KTsKICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkgewogICAgICBjb25zdCBmID0gcmVhZGVyLnJlYWRGbGFnKCk7CiAgICAgIGlmICghKDAgPD0gZiAmJiBmIDw9IDMpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU2IGZsYWciKTsKICAgICAgfQogICAgICBjb25zdCBwaSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGYgIT09IDAgPyA4IDogMTI7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29vcmRzLnB1c2gocmVhZGVyLnJlYWRDb29yZGluYXRlKCkpOwogICAgICB9CiAgICAgIGNvbnN0IGNpID0gY29sb3JzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZiAhPT0gMCA/IDIgOiA0OyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbG9ycy5wdXNoKHJlYWRlci5yZWFkQ29tcG9uZW50cygpKTsKICAgICAgfQogICAgICBsZXQgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKICAgICAgc3dpdGNoIChmKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgcHNbMTJdID0gcGkgKyAzOwogICAgICAgICAgcHNbMTNdID0gcGkgKyA0OwogICAgICAgICAgcHNbMTRdID0gcGkgKyA1OwogICAgICAgICAgcHNbMTVdID0gcGkgKyA2OwogICAgICAgICAgcHNbOF0gPSBwaSArIDI7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1s0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzddID0gcGkgKyA4OwogICAgICAgICAgcHNbMF0gPSBwaTsKICAgICAgICAgIHBzWzFdID0gcGkgKyAxMTsKICAgICAgICAgIHBzWzJdID0gcGkgKyAxMDsKICAgICAgICAgIHBzWzNdID0gcGkgKyA5OwogICAgICAgICAgY3NbMl0gPSBjaSArIDE7CiAgICAgICAgICBjc1szXSA9IGNpICsgMjsKICAgICAgICAgIGNzWzBdID0gY2k7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHRtcDEgPSBwc1sxMl07CiAgICAgICAgICB0bXAyID0gcHNbMTNdOwogICAgICAgICAgdG1wMyA9IHBzWzE0XTsKICAgICAgICAgIHRtcDQgPSBwc1sxNV07CiAgICAgICAgICBwc1sxMl0gPSB0bXA0OwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSB0bXAzOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbN10gPSBwaSArIDQ7CiAgICAgICAgICBwc1swXSA9IHRtcDE7CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICB0bXAxID0gY3NbMl07CiAgICAgICAgICB0bXAyID0gY3NbM107CiAgICAgICAgICBjc1syXSA9IHRtcDI7CiAgICAgICAgICBjc1szXSA9IGNpOwogICAgICAgICAgY3NbMF0gPSB0bXAxOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICB0bXAxID0gcHNbMTVdOwogICAgICAgICAgdG1wMiA9IHBzWzExXTsKICAgICAgICAgIHBzWzEyXSA9IHBzWzNdOwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSBwc1s3XTsKICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzRdID0gdG1wMjsKICAgICAgICAgIHBzWzddID0gcGkgKyA0OwogICAgICAgICAgcHNbMF0gPSB0bXAxOwogICAgICAgICAgcHNbMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1syXSA9IHBpICsgNjsKICAgICAgICAgIHBzWzNdID0gcGkgKyA1OwogICAgICAgICAgdG1wMSA9IGNzWzNdOwogICAgICAgICAgY3NbMl0gPSBjc1sxXTsKICAgICAgICAgIGNzWzNdID0gY2k7CiAgICAgICAgICBjc1swXSA9IHRtcDE7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHBzWzEyXSA9IHBzWzBdOwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSBwc1sxXTsKICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzRdID0gcHNbMl07CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gcHNbM107CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICBjc1syXSA9IGNzWzBdOwogICAgICAgICAgY3NbM10gPSBjaTsKICAgICAgICAgIGNzWzBdID0gY3NbMV07CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHBzWzVdID0gY29vcmRzLmxlbmd0aDsKICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1swXV1bMF0gLSBjb29yZHNbcHNbMTVdXVswXSArIDYgKiAoY29vcmRzW3BzWzRdXVswXSArIGNvb3Jkc1twc1sxXV1bMF0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVswXSArIGNvb3Jkc1twc1szXV1bMF0pICsgMyAqIChjb29yZHNbcHNbMTNdXVswXSArIGNvb3Jkc1twc1s3XV1bMF0pKSAvIDksICgtNCAqIGNvb3Jkc1twc1swXV1bMV0gLSBjb29yZHNbcHNbMTVdXVsxXSArIDYgKiAoY29vcmRzW3BzWzRdXVsxXSArIGNvb3Jkc1twc1sxXV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVsxXSArIGNvb3Jkc1twc1szXV1bMV0pICsgMyAqIChjb29yZHNbcHNbMTNdXVsxXSArIGNvb3Jkc1twc1s3XV1bMV0pKSAvIDldKTsKICAgICAgcHNbNl0gPSBjb29yZHMubGVuZ3RoOwogICAgICBjb29yZHMucHVzaChbKC00ICogY29vcmRzW3BzWzNdXVswXSAtIGNvb3Jkc1twc1sxMl1dWzBdICsgNiAqIChjb29yZHNbcHNbMl1dWzBdICsgY29vcmRzW3BzWzddXVswXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMF0gKyBjb29yZHNbcHNbMTRdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzNdXVsxXSAtIGNvb3Jkc1twc1sxMl1dWzFdICsgNiAqIChjb29yZHNbcHNbMl1dWzFdICsgY29vcmRzW3BzWzddXVsxXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMV0gKyBjb29yZHNbcHNbMTVdXVsxXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMV0gKyBjb29yZHNbcHNbMTRdXVsxXSkpIC8gOV0pOwogICAgICBwc1s5XSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgIGNvb3Jkcy5wdXNoKFsoLTQgKiBjb29yZHNbcHNbMTJdXVswXSAtIGNvb3Jkc1twc1szXV1bMF0gKyA2ICogKGNvb3Jkc1twc1s4XV1bMF0gKyBjb29yZHNbcHNbMTNdXVswXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgKyAzICogKGNvb3Jkc1twc1sxMV1dWzBdICsgY29vcmRzW3BzWzFdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzEyXV1bMV0gLSBjb29yZHNbcHNbM11dWzFdICsgNiAqIChjb29yZHNbcHNbOF1dWzFdICsgY29vcmRzW3BzWzEzXV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMF1dWzFdICsgY29vcmRzW3BzWzE1XV1bMV0pICsgMyAqIChjb29yZHNbcHNbMTFdXVsxXSArIGNvb3Jkc1twc1sxXV1bMV0pKSAvIDldKTsKICAgICAgcHNbMTBdID0gY29vcmRzLmxlbmd0aDsKICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1sxNV1dWzBdIC0gY29vcmRzW3BzWzBdXVswXSArIDYgKiAoY29vcmRzW3BzWzExXV1bMF0gKyBjb29yZHNbcHNbMTRdXVswXSkgLSAyICogKGNvb3Jkc1twc1sxMl1dWzBdICsgY29vcmRzW3BzWzNdXVswXSkgKyAzICogKGNvb3Jkc1twc1syXV1bMF0gKyBjb29yZHNbcHNbOF1dWzBdKSkgLyA5LCAoLTQgKiBjb29yZHNbcHNbMTVdXVsxXSAtIGNvb3Jkc1twc1swXV1bMV0gKyA2ICogKGNvb3Jkc1twc1sxMV1dWzFdICsgY29vcmRzW3BzWzE0XV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVsxXSArIGNvb3Jkc1twc1szXV1bMV0pICsgMyAqIChjb29yZHNbcHNbMl1dWzFdICsgY29vcmRzW3BzWzhdXVsxXSkpIC8gOV0pOwogICAgICB0aGlzLmZpZ3VyZXMucHVzaCh7CiAgICAgICAgdHlwZTogInBhdGNoIiwKICAgICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KGNzKQogICAgICB9KTsKICAgIH0KICB9CiAgX2RlY29kZVR5cGU3U2hhZGluZyhyZWFkZXIpIHsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwcyA9IG5ldyBJbnQzMkFycmF5KDE2KTsKICAgIGNvbnN0IGNzID0gbmV3IEludDMyQXJyYXkoNCk7CiAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKICAgICAgY29uc3QgZiA9IHJlYWRlci5yZWFkRmxhZygpOwogICAgICBpZiAoISgwIDw9IGYgJiYgZiA8PSAzKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNyBmbGFnIik7CiAgICAgIH0KICAgICAgY29uc3QgcGkgPSBjb29yZHMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmICE9PSAwID8gMTIgOiAxNjsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb29yZHMucHVzaChyZWFkZXIucmVhZENvb3JkaW5hdGUoKSk7CiAgICAgIH0KICAgICAgY29uc3QgY2kgPSBjb2xvcnMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmICE9PSAwID8gMiA6IDQ7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29sb3JzLnB1c2gocmVhZGVyLnJlYWRDb21wb25lbnRzKCkpOwogICAgICB9CiAgICAgIGxldCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwogICAgICBzd2l0Y2ggKGYpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBwc1sxMl0gPSBwaSArIDM7CiAgICAgICAgICBwc1sxM10gPSBwaSArIDQ7CiAgICAgICAgICBwc1sxNF0gPSBwaSArIDU7CiAgICAgICAgICBwc1sxNV0gPSBwaSArIDY7CiAgICAgICAgICBwc1s4XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzldID0gcGkgKyAxMzsKICAgICAgICAgIHBzWzEwXSA9IHBpICsgMTQ7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1s0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzVdID0gcGkgKyAxMjsKICAgICAgICAgIHBzWzZdID0gcGkgKyAxNTsKICAgICAgICAgIHBzWzddID0gcGkgKyA4OwogICAgICAgICAgcHNbMF0gPSBwaTsKICAgICAgICAgIHBzWzFdID0gcGkgKyAxMTsKICAgICAgICAgIHBzWzJdID0gcGkgKyAxMDsKICAgICAgICAgIHBzWzNdID0gcGkgKyA5OwogICAgICAgICAgY3NbMl0gPSBjaSArIDE7CiAgICAgICAgICBjc1szXSA9IGNpICsgMjsKICAgICAgICAgIGNzWzBdID0gY2k7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHRtcDEgPSBwc1sxMl07CiAgICAgICAgICB0bXAyID0gcHNbMTNdOwogICAgICAgICAgdG1wMyA9IHBzWzE0XTsKICAgICAgICAgIHRtcDQgPSBwc1sxNV07CiAgICAgICAgICBwc1sxMl0gPSB0bXA0OwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSB0bXAzOwogICAgICAgICAgcHNbOV0gPSBwaSArIDk7CiAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gdG1wMTsKICAgICAgICAgIHBzWzFdID0gcGkgKyA3OwogICAgICAgICAgcHNbMl0gPSBwaSArIDY7CiAgICAgICAgICBwc1szXSA9IHBpICsgNTsKICAgICAgICAgIHRtcDEgPSBjc1syXTsKICAgICAgICAgIHRtcDIgPSBjc1szXTsKICAgICAgICAgIGNzWzJdID0gdG1wMjsKICAgICAgICAgIGNzWzNdID0gY2k7CiAgICAgICAgICBjc1swXSA9IHRtcDE7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHRtcDEgPSBwc1sxNV07CiAgICAgICAgICB0bXAyID0gcHNbMTFdOwogICAgICAgICAgcHNbMTJdID0gcHNbM107CiAgICAgICAgICBwc1sxM10gPSBwaSArIDA7CiAgICAgICAgICBwc1sxNF0gPSBwaSArIDE7CiAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CiAgICAgICAgICBwc1s4XSA9IHBzWzddOwogICAgICAgICAgcHNbOV0gPSBwaSArIDk7CiAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gdG1wMTsKICAgICAgICAgIHBzWzFdID0gcGkgKyA3OwogICAgICAgICAgcHNbMl0gPSBwaSArIDY7CiAgICAgICAgICBwc1szXSA9IHBpICsgNTsKICAgICAgICAgIHRtcDEgPSBjc1szXTsKICAgICAgICAgIGNzWzJdID0gY3NbMV07CiAgICAgICAgICBjc1szXSA9IGNpOwogICAgICAgICAgY3NbMF0gPSB0bXAxOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICBwc1sxMl0gPSBwc1swXTsKICAgICAgICAgIHBzWzEzXSA9IHBpICsgMDsKICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzhdID0gcHNbMV07CiAgICAgICAgICBwc1s5XSA9IHBpICsgOTsKICAgICAgICAgIHBzWzEwXSA9IHBpICsgMTA7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDM7CiAgICAgICAgICBwc1s0XSA9IHBzWzJdOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gcHNbM107CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICBjc1syXSA9IGNzWzBdOwogICAgICAgICAgY3NbM10gPSBjaTsKICAgICAgICAgIGNzWzBdID0gY3NbMV07CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRoaXMuZmlndXJlcy5wdXNoKHsKICAgICAgICB0eXBlOiAicGF0Y2giLAogICAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAogICAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkoY3MpCiAgICAgIH0pOwogICAgfQogIH0KICBfYnVpbGRGaWd1cmVGcm9tUGF0Y2goaW5kZXgpIHsKICAgIGNvbnN0IGZpZ3VyZSA9IHRoaXMuZmlndXJlc1tpbmRleF07CiAgICBhc3NlcnQoZmlndXJlLnR5cGUgPT09ICJwYXRjaCIsICJVbmV4cGVjdGVkIHBhdGNoIG1lc2ggZmlndXJlIik7CiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmNvb3JkcywKICAgICAgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwaSA9IGZpZ3VyZS5jb29yZHM7CiAgICBjb25zdCBjaSA9IGZpZ3VyZS5jb2xvcnM7CiAgICBjb25zdCBmaWd1cmVNaW5YID0gTWF0aC5taW4oY29vcmRzW3BpWzBdXVswXSwgY29vcmRzW3BpWzNdXVswXSwgY29vcmRzW3BpWzEyXV1bMF0sIGNvb3Jkc1twaVsxNV1dWzBdKTsKICAgIGNvbnN0IGZpZ3VyZU1pblkgPSBNYXRoLm1pbihjb29yZHNbcGlbMF1dWzFdLCBjb29yZHNbcGlbM11dWzFdLCBjb29yZHNbcGlbMTJdXVsxXSwgY29vcmRzW3BpWzE1XV1bMV0pOwogICAgY29uc3QgZmlndXJlTWF4WCA9IE1hdGgubWF4KGNvb3Jkc1twaVswXV1bMF0sIGNvb3Jkc1twaVszXV1bMF0sIGNvb3Jkc1twaVsxMl1dWzBdLCBjb29yZHNbcGlbMTVdXVswXSk7CiAgICBjb25zdCBmaWd1cmVNYXhZID0gTWF0aC5tYXgoY29vcmRzW3BpWzBdXVsxXSwgY29vcmRzW3BpWzNdXVsxXSwgY29vcmRzW3BpWzEyXV1bMV0sIGNvb3Jkc1twaVsxNV1dWzFdKTsKICAgIGxldCBzcGxpdFhCeSA9IE1hdGguY2VpbCgoZmlndXJlTWF4WCAtIGZpZ3VyZU1pblgpICogTWVzaFNoYWRpbmcuVFJJQU5HTEVfREVOU0lUWSAvICh0aGlzLmJvdW5kc1syXSAtIHRoaXMuYm91bmRzWzBdKSk7CiAgICBzcGxpdFhCeSA9IE1hdGhDbGFtcChzcGxpdFhCeSwgTWVzaFNoYWRpbmcuTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIE1lc2hTaGFkaW5nLk1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UKTsKICAgIGxldCBzcGxpdFlCeSA9IE1hdGguY2VpbCgoZmlndXJlTWF4WSAtIGZpZ3VyZU1pblkpICogTWVzaFNoYWRpbmcuVFJJQU5HTEVfREVOU0lUWSAvICh0aGlzLmJvdW5kc1szXSAtIHRoaXMuYm91bmRzWzFdKSk7CiAgICBzcGxpdFlCeSA9IE1hdGhDbGFtcChzcGxpdFlCeSwgTWVzaFNoYWRpbmcuTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIE1lc2hTaGFkaW5nLk1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5UKTsKICAgIGNvbnN0IHZlcnRpY2VzUGVyUm93ID0gc3BsaXRYQnkgKyAxOwogICAgY29uc3QgZmlndXJlQ29vcmRzID0gbmV3IEludDMyQXJyYXkoKHNwbGl0WUJ5ICsgMSkgKiB2ZXJ0aWNlc1BlclJvdyk7CiAgICBjb25zdCBmaWd1cmVDb2xvcnMgPSBuZXcgSW50MzJBcnJheSgoc3BsaXRZQnkgKyAxKSAqIHZlcnRpY2VzUGVyUm93KTsKICAgIGxldCBrID0gMDsKICAgIGNvbnN0IGNsID0gbmV3IFVpbnQ4QXJyYXkoMyksCiAgICAgIGNyID0gbmV3IFVpbnQ4QXJyYXkoMyk7CiAgICBjb25zdCBjMCA9IGNvbG9yc1tjaVswXV0sCiAgICAgIGMxID0gY29sb3JzW2NpWzFdXSwKICAgICAgYzIgPSBjb2xvcnNbY2lbMl1dLAogICAgICBjMyA9IGNvbG9yc1tjaVszXV07CiAgICBjb25zdCBiUm93ID0gZ2V0QihzcGxpdFlCeSksCiAgICAgIGJDb2wgPSBnZXRCKHNwbGl0WEJ5KTsKICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSBzcGxpdFlCeTsgcm93KyspIHsKICAgICAgY2xbMF0gPSAoYzBbMF0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzJbMF0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOwogICAgICBjbFsxXSA9IChjMFsxXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjMlsxXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CiAgICAgIGNsWzJdID0gKGMwWzJdICogKHNwbGl0WUJ5IC0gcm93KSArIGMyWzJdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKICAgICAgY3JbMF0gPSAoYzFbMF0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzNbMF0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOwogICAgICBjclsxXSA9IChjMVsxXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjM1sxXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CiAgICAgIGNyWzJdID0gKGMxWzJdICogKHNwbGl0WUJ5IC0gcm93KSArIGMzWzJdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDw9IHNwbGl0WEJ5OyBjb2wrKywgaysrKSB7CiAgICAgICAgaWYgKChyb3cgPT09IDAgfHwgcm93ID09PSBzcGxpdFlCeSkgJiYgKGNvbCA9PT0gMCB8fCBjb2wgPT09IHNwbGl0WEJ5KSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCB4ID0gMCwKICAgICAgICAgIHkgPSAwOwogICAgICAgIGxldCBxID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAzOyBpKyspIHsKICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDw9IDM7IGorKywgcSsrKSB7CiAgICAgICAgICAgIGNvbnN0IG0gPSBiUm93W3Jvd11baV0gKiBiQ29sW2NvbF1bal07CiAgICAgICAgICAgIHggKz0gY29vcmRzW3BpW3FdXVswXSAqIG07CiAgICAgICAgICAgIHkgKz0gY29vcmRzW3BpW3FdXVsxXSAqIG07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpZ3VyZUNvb3Jkc1trXSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgICAgY29vcmRzLnB1c2goW3gsIHldKTsKICAgICAgICBmaWd1cmVDb2xvcnNba10gPSBjb2xvcnMubGVuZ3RoOwogICAgICAgIGNvbnN0IG5ld0NvbG9yID0gbmV3IFVpbnQ4QXJyYXkoMyk7CiAgICAgICAgbmV3Q29sb3JbMF0gPSAoY2xbMF0gKiAoc3BsaXRYQnkgLSBjb2wpICsgY3JbMF0gKiBjb2wpIC8gc3BsaXRYQnkgfCAwOwogICAgICAgIG5ld0NvbG9yWzFdID0gKGNsWzFdICogKHNwbGl0WEJ5IC0gY29sKSArIGNyWzFdICogY29sKSAvIHNwbGl0WEJ5IHwgMDsKICAgICAgICBuZXdDb2xvclsyXSA9IChjbFsyXSAqIChzcGxpdFhCeSAtIGNvbCkgKyBjclsyXSAqIGNvbCkgLyBzcGxpdFhCeSB8IDA7CiAgICAgICAgY29sb3JzLnB1c2gobmV3Q29sb3IpOwogICAgICB9CiAgICB9CiAgICBmaWd1cmVDb29yZHNbMF0gPSBwaVswXTsKICAgIGZpZ3VyZUNvbG9yc1swXSA9IGNpWzBdOwogICAgZmlndXJlQ29vcmRzW3NwbGl0WEJ5XSA9IHBpWzNdOwogICAgZmlndXJlQ29sb3JzW3NwbGl0WEJ5XSA9IGNpWzFdOwogICAgZmlndXJlQ29vcmRzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnldID0gcGlbMTJdOwogICAgZmlndXJlQ29sb3JzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnldID0gY2lbMl07CiAgICBmaWd1cmVDb29yZHNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeSArIHNwbGl0WEJ5XSA9IHBpWzE1XTsKICAgIGZpZ3VyZUNvbG9yc1t2ZXJ0aWNlc1BlclJvdyAqIHNwbGl0WUJ5ICsgc3BsaXRYQnldID0gY2lbM107CiAgICB0aGlzLmZpZ3VyZXNbaW5kZXhdID0gewogICAgICB0eXBlOiAibGF0dGljZSIsCiAgICAgIGNvb3JkczogZmlndXJlQ29vcmRzLAogICAgICBjb2xvcnM6IGZpZ3VyZUNvbG9ycywKICAgICAgdmVydGljZXNQZXJSb3cKICAgIH07CiAgfQogIF91cGRhdGVCb3VuZHMoKSB7CiAgICBsZXQgbWluWCA9IHRoaXMuY29vcmRzWzBdWzBdLAogICAgICBtaW5ZID0gdGhpcy5jb29yZHNbMF1bMV0sCiAgICAgIG1heFggPSBtaW5YLAogICAgICBtYXhZID0gbWluWTsKICAgIGZvciAobGV0IGkgPSAxLCBpaSA9IHRoaXMuY29vcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgeCA9IHRoaXMuY29vcmRzW2ldWzBdLAogICAgICAgIHkgPSB0aGlzLmNvb3Jkc1tpXVsxXTsKICAgICAgbWluWCA9IG1pblggPiB4ID8geCA6IG1pblg7CiAgICAgIG1pblkgPSBtaW5ZID4geSA/IHkgOiBtaW5ZOwogICAgICBtYXhYID0gbWF4WCA8IHggPyB4IDogbWF4WDsKICAgICAgbWF4WSA9IG1heFkgPCB5ID8geSA6IG1heFk7CiAgICB9CiAgICB0aGlzLmJvdW5kcyA9IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTsKICB9CiAgX3BhY2tEYXRhKCkgewogICAgbGV0IGksIGlpLCBqLCBqajsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29vcmRzUGFja2VkID0gbmV3IEZsb2F0MzJBcnJheShjb29yZHMubGVuZ3RoICogMik7CiAgICBmb3IgKGkgPSAwLCBqID0gMCwgaWkgPSBjb29yZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCB4eSA9IGNvb3Jkc1tpXTsKICAgICAgY29vcmRzUGFja2VkW2orK10gPSB4eVswXTsKICAgICAgY29vcmRzUGFja2VkW2orK10gPSB4eVsxXTsKICAgIH0KICAgIHRoaXMuY29vcmRzID0gY29vcmRzUGFja2VkOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBjb2xvcnNQYWNrZWQgPSBuZXcgVWludDhBcnJheShjb2xvcnMubGVuZ3RoICogMyk7CiAgICBmb3IgKGkgPSAwLCBqID0gMCwgaWkgPSBjb2xvcnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBjID0gY29sb3JzW2ldOwogICAgICBjb2xvcnNQYWNrZWRbaisrXSA9IGNbMF07CiAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1sxXTsKICAgICAgY29sb3JzUGFja2VkW2orK10gPSBjWzJdOwogICAgfQogICAgdGhpcy5jb2xvcnMgPSBjb2xvcnNQYWNrZWQ7CiAgICBjb25zdCBmaWd1cmVzID0gdGhpcy5maWd1cmVzOwogICAgZm9yIChpID0gMCwgaWkgPSBmaWd1cmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgZmlndXJlID0gZmlndXJlc1tpXSwKICAgICAgICBwcyA9IGZpZ3VyZS5jb29yZHMsCiAgICAgICAgY3MgPSBmaWd1cmUuY29sb3JzOwogICAgICBmb3IgKGogPSAwLCBqaiA9IHBzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBwc1tqXSAqPSAyOwogICAgICAgIGNzW2pdICo9IDM7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0SVIoKSB7CiAgICBjb25zdCB7CiAgICAgIGJvdW5kcwogICAgfSA9IHRoaXM7CiAgICBpZiAoYm91bmRzWzJdIC0gYm91bmRzWzBdID09PSAwIHx8IGJvdW5kc1szXSAtIGJvdW5kc1sxXSA9PT0gMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgTWVzaFNoYWRpbmcgYm91bmRzOiBbJHtib3VuZHN9XS5gKTsKICAgIH0KICAgIHJldHVybiBbIk1lc2giLCB0aGlzLnNoYWRpbmdUeXBlLCB0aGlzLmNvb3JkcywgdGhpcy5jb2xvcnMsIHRoaXMuZmlndXJlcywgYm91bmRzLCB0aGlzLmJib3gsIHRoaXMuYmFja2dyb3VuZF07CiAgfQp9CmNsYXNzIER1bW15U2hhZGluZyBleHRlbmRzIEJhc2VTaGFkaW5nIHsKICBnZXRJUigpIHsKICAgIHJldHVybiBbIkR1bW15Il07CiAgfQp9CmZ1bmN0aW9uIGdldFRpbGluZ1BhdHRlcm5JUihvcGVyYXRvckxpc3QsIGRpY3QsIGNvbG9yKSB7CiAgY29uc3QgbWF0cml4ID0gbG9va3VwTWF0cml4KGRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpLCBJREVOVElUWV9NQVRSSVgpOwogIGNvbnN0IGJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkJCb3giKSwgbnVsbCk7CiAgaWYgKCFiYm94IHx8IGJib3hbMl0gLSBiYm94WzBdID09PSAwIHx8IGJib3hbM10gLSBiYm94WzFdID09PSAwKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZ2V0VGlsaW5nUGF0dGVybklSIC9CQm94IGFycmF5LmApOwogIH0KICBjb25zdCB4c3RlcCA9IGRpY3QuZ2V0KCJYU3RlcCIpOwogIGlmICh0eXBlb2YgeHN0ZXAgIT09ICJudW1iZXIiKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZ2V0VGlsaW5nUGF0dGVybklSIC9YU3RlcCB2YWx1ZS5gKTsKICB9CiAgY29uc3QgeXN0ZXAgPSBkaWN0LmdldCgiWVN0ZXAiKTsKICBpZiAodHlwZW9mIHlzdGVwICE9PSAibnVtYmVyIikgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvWVN0ZXAgdmFsdWUuYCk7CiAgfQogIGNvbnN0IHBhaW50VHlwZSA9IGRpY3QuZ2V0KCJQYWludFR5cGUiKTsKICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFpbnRUeXBlKSkgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvUGFpbnRUeXBlIHZhbHVlLmApOwogIH0KICBjb25zdCB0aWxpbmdUeXBlID0gZGljdC5nZXQoIlRpbGluZ1R5cGUiKTsKICBpZiAoIU51bWJlci5pc0ludGVnZXIodGlsaW5nVHlwZSkpIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBnZXRUaWxpbmdQYXR0ZXJuSVIgL1RpbGluZ1R5cGUgdmFsdWUuYCk7CiAgfQogIHJldHVybiBbIlRpbGluZ1BhdHRlcm4iLCBjb2xvciwgb3BlcmF0b3JMaXN0LCBtYXRyaXgsIGJib3gsIHhzdGVwLCB5c3RlcCwgcGFpbnRUeXBlLCB0aWxpbmdUeXBlXTsKfQoKOy8vIC4vc3JjL2NvcmUvY2FsaWJyaV9mYWN0b3JzLmpzCmNvbnN0IENhbGlicmlCb2xkRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDAuOTc4MDEsIDAuOTI0ODIsIDAuODk1NTIsIDAuOTExMzMsIDAuODE5ODgsIDAuOTc1NjYsIDAuOTgxNTIsIDAuOTM1NDgsIDAuOTM1NDgsIDEuMjc5OCwgMC44NTI4NCwgMC45Mjc5NCwgMSwgMC45NjEzNCwgMS41NDY1NywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC44Mjg0NSwgMC44Mjg0NSwgMC44NTI4NCwgMC44NTI4NCwgMC44NTI4NCwgMC43NTg1OSwgMC45MjEzOCwgMC44MzkwOCwgMC43NzYyLCAwLjczMjkzLCAwLjg3Mjg5LCAwLjczMTMzLCAwLjc1MTQsIDAuODE5MjEsIDAuODczNTYsIDAuOTU5NTgsIDAuNTk1MjYsIDAuNzU3MjcsIDAuNjkyMjUsIDEuMDQ5MjQsIDAuOTEyMSwgMC44Njk0MywgMC43OTc5NSwgMC44ODE5OCwgMC43Nzk1OCwgMC43MDg2NCwgMC44MTA1NSwgMC45MDM5OSwgMC44ODY1MywgMC45NjAxNywgMC44MjU3NywgMC43Nzg5MiwgMC43ODI1NywgMC45NzUwNywgMS41NDY1NywgMC45NzUwNywgMC44NTI4NCwgMC44OTU1MiwgMC45MDE3NiwgMC44ODc2MiwgMC44Nzg1LCAwLjc1MjQxLCAwLjg3ODUsIDAuOTA1MTgsIDAuOTUwMTUsIDAuNzc2MTgsIDAuODc4NSwgMC44ODQwMSwgMC45MTkxNiwgMC44NjMwNCwgMC44ODQwMSwgMC45MTQ4OCwgMC44Nzg1LCAwLjg4MDEsIDAuODc4NSwgMC44Nzg1LCAwLjkxMzQzLCAwLjcxNzMsIDEuMDQxMDYsIDAuODc4NSwgMC44NTA3NSwgMC45NTc5NCwgMC44MjYxNiwgMC44NTE2MiwgMC43OTQ5MiwgMC44ODMzMSwgMS42OTgwOCwgMC44ODMzMSwgMC44NTI4NCwgMC45NzgwMSwgMC44OTU1MiwgMC45MTEzMywgMC44OTU1MiwgMC45MTEzMywgMS43ODAxLCAwLjg5NTUyLCAxLjI0NDg3LCAxLjEzMjU0LCAxLjEyNDAxLCAwLjk2ODM5LCAwLjg1Mjg0LCAwLjY4Nzg3LCAwLjcwNjQ1LCAwLjg1NTkyLCAwLjkwNzQ3LCAxLjAxNDY2LCAxLjAwODgsIDAuOTAzMjMsIDEsIDEuMDc0NjMsIDEsIDAuOTEwNTYsIDAuNzU4MDYsIDEuMTkxMTgsIDAuOTY4MzksIDAuNzg4NjQsIDAuODI4NDUsIDAuODQxMzMsIDAuNzU4NTksIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuNzc1MzksIDAuNzMyOTMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuOTU5NTgsIDAuOTU5NTgsIDAuOTU5NTgsIDAuOTU5NTgsIDAuODg1MDYsIDAuOTEyMSwgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44NTI4NCwgMC44NzUwOCwgMC45MDM5OSwgMC45MDM5OSwgMC45MDM5OSwgMC45MDM5OSwgMC43Nzg5MiwgMC43OTc5NSwgMC45MDgwNywgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44NzE1LCAwLjc1MjQxLCAwLjkwNTE4LCAwLjkwNTE4LCAwLjkwNTE4LCAwLjkwNTE4LCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg3ODUsIDAuODc4NSwgMC44ODAxLCAwLjg4MDEsIDAuODgwMSwgMC44ODAxLCAwLjg4MDEsIDAuOTA3NDcsIDAuODkwNDksIDAuODc4NSwgMC44Nzg1LCAwLjg3ODUsIDAuODc4NSwgMC44NTE2MiwgMC44Nzg1LCAwLjg1MTYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjg3Mjg5LCAwLjgzMDE2LCAwLjg4NTA2LCAwLjkzMTI1LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjgxOTIxLCAwLjc3NjE4LCAwLjgxOTIxLCAwLjc3NjE4LCAwLjgxOTIxLCAwLjc3NjE4LCAxLCAxLCAwLjg3MzU2LCAwLjg3ODUsIDAuOTEwNzUsIDAuODk2MDgsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuNzYyMjksIDAuOTAxNjcsIDAuNTk1MjYsIDAuOTE5MTYsIDEsIDEsIDAuODYzMDQsIDAuNjkyMjUsIDAuODg0MDEsIDEsIDEsIDAuNzA0MjQsIDAuNzk0NjgsIDAuOTE5MjYsIDAuODgxNzUsIDAuNzA4MjMsIDAuOTQ5MDMsIDAuOTEyMSwgMC44Nzg1LCAxLCAxLCAwLjkxMjEsIDAuODc4NSwgMC44NzgwMiwgMC44ODY1NiwgMC44Nzg1LCAwLjg2OTQzLCAwLjg4MDEsIDAuODY5NDMsIDAuODgwMSwgMC44Njk0MywgMC44ODAxLCAwLjg3NDAyLCAwLjg5MjkxLCAwLjc3OTU4LCAwLjkxMzQzLCAxLCAxLCAwLjc3OTU4LCAwLjkxMzQzLCAwLjcwODY0LCAwLjcxNzMsIDAuNzA4NjQsIDAuNzE3MywgMC43MDg2NCwgMC43MTczLCAwLjcwODY0LCAwLjcxNzMsIDEsIDEsIDAuODEwNTUsIDAuNzU4NDEsIDAuODEwNTUsIDEuMDY0NTIsIDAuOTAzOTksIDAuODc4NSwgMC45MDM5OSwgMC44Nzg1LCAwLjkwMzk5LCAwLjg3ODUsIDAuOTAzOTksIDAuODc4NSwgMC45MDM5OSwgMC44Nzg1LCAwLjkwMzk5LCAwLjg3ODUsIDAuOTYwMTcsIDAuOTU3OTQsIDAuNzc4OTIsIDAuODUxNjIsIDAuNzc4OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuOTI5NywgMC41Njg5MiwgMC44MzkwOCwgMC44ODc2MiwgMC43NzUzOSwgMC44NzE1LCAwLjg3NTA4LCAwLjg5MDQ5LCAxLCAxLCAwLjgxMDU1LCAxLjA0MTA2LCAxLjIwNTI4LCAxLjIwNTI4LCAxLCAxLjE1NTQzLCAwLjcwNjc0LCAwLjk4Mzg3LCAwLjk0NzIxLCAxLjMzNDMxLCAxLjQ1ODk0LCAwLjk1MTYxLCAxLjA2MzAzLCAwLjgzOTA4LCAwLjgwMzUyLCAwLjU3MTg0LCAwLjY5NjUsIDAuNTYyODksIDAuODIwMDEsIDAuNTYwMjksIDAuODEyMzUsIDEuMDI5ODgsIDAuODM5MDgsIDAuNzc2MiwgMC42ODE1NiwgMC44MDM2NywgMC43MzEzMywgMC43ODI1NywgMC44NzM1NiwgMC44Njk0MywgMC45NTk1OCwgMC43NTcyNywgMC44OTAxOSwgMS4wNDkyNCwgMC45MTIxLCAwLjc2NDgsIDAuODY5NDMsIDAuODczNTYsIDAuNzk3OTUsIDAuNzgyNzUsIDAuODEwNTUsIDAuNzc4OTIsIDAuOTc2MiwgMC44MjU3NywgMC45OTgxOSwgMC44NDg5NiwgMC45NTk1OCwgMC43Nzg5MiwgMC45NjEwOCwgMS4wMTQwNywgMC44OTA0OSwgMS4wMjk4OCwgMC45NDIxMSwgMC45NjEwOCwgMC44OTM2LCAwLjg0MDIxLCAwLjg3ODQyLCAwLjk2Mzk5LCAwLjc5MTA5LCAwLjg5MDQ5LCAxLjAwODEzLCAxLjAyOTg4LCAwLjg2MDc3LCAwLjg3NDQ1LCAwLjkyMDk5LCAwLjg0NzIzLCAwLjg2NTEzLCAwLjg4MDEsIDAuNzU2MzgsIDAuODU3MTQsIDAuNzgyMTYsIDAuNzk1ODYsIDAuODc5NjUsIDAuOTQyMTEsIDAuOTc3NDcsIDAuNzgyODcsIDAuOTc5MjYsIDAuODQ5NzEsIDEuMDI5ODgsIDAuOTQyMTEsIDAuODgwMSwgMC45NDIxMSwgMC44NDk3MSwgMC43MzEzMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDI2NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDUxOCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDU0OCwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NjAxNywgMC45NTc5NCwgMC45NjAxNywgMC45NTc5NCwgMC45NjAxNywgMC45NTc5NCwgMC43Nzg5MiwgMC44NTE2MiwgMSwgMSwgMC44OTU1MiwgMC45MDUyNywgMSwgMC45MDM2MywgMC45Mjc5NCwgMC45Mjc5NCwgMC45Mjc5NCwgMC45Mjc5NCwgMC44NzAxMiwgMC44NzAxMiwgMC44NzAxMiwgMC44OTU1MiwgMC44OTU1MiwgMS40MjI1OSwgMC43MTE0MywgMS4wNjE1MiwgMSwgMSwgMS4wMzM3MiwgMS4wMzM3MiwgMC45NzE3MSwgMS40OTU2LCAyLjI4MDcsIDAuOTM4MzUsIDAuODM0MDYsIDAuOTExMzMsIDAuODQxMDcsIDAuOTExMzMsIDEsIDEsIDEsIDAuNzIwMjEsIDEsIDEuMjMxMDgsIDAuODM0ODksIDAuODg1MjUsIDAuODg1MjUsIDAuODE0OTksIDAuOTA1MjcsIDEuODEwNTUsIDAuOTA1MjcsIDEuODEwNTUsIDEuMzEwMDYsIDEuNTM3MTEsIDAuOTQ0MzQsIDEuMDg2OTYsIDEsIDAuOTUwMTgsIDAuNzcxOTIsIDAuODUyODQsIDAuOTA3NDcsIDEuMTc1MzQsIDAuNjk4MjUsIDAuOTcxNiwgMS4zNzA3NywgMC45MDc0NywgMC45MDc0NywgMC44NTM1NiwgMC45MDc0NywgMC45MDc0NywgMS40NDk0NywgMC44NTI4NCwgMC44OTQxLCAwLjg5NDEsIDAuNzA1NzIsIDAuOCwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4wODAwNCwgMC45MTAyNywgMSwgMSwgMSwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDcyNywgMC45MDcyNywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IENhbGlicmlCb2xkTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIyMDcsCiAgbGluZUdhcDogMC4yMjA3Cn07CmNvbnN0IENhbGlicmlCb2xkSXRhbGljRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDAuOTc4MDEsIDAuOTI0ODIsIDAuODk1NTIsIDAuOTExMzMsIDAuODE5ODgsIDAuOTc1NjYsIDAuOTgxNTIsIDAuOTM1NDgsIDAuOTM1NDgsIDEuMjc5OCwgMC44NTI4NCwgMC45Mjc5NCwgMSwgMC45NjEzNCwgMS41NjIzOSwgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC44Mjg0NSwgMC44Mjg0NSwgMC44NTI4NCwgMC44NTI4NCwgMC44NTI4NCwgMC43NTg1OSwgMC45MjEzOCwgMC44MzkwOCwgMC43NzYyLCAwLjcxODA1LCAwLjg3Mjg5LCAwLjczMTMzLCAwLjc1MTQsIDAuODE5MjEsIDAuODczNTYsIDAuOTU5NTgsIDAuNTk1MjYsIDAuNzU3MjcsIDAuNjkyMjUsIDEuMDQ5MjQsIDAuOTA4NzIsIDAuODU5MzgsIDAuNzk3OTUsIDAuODcwNjgsIDAuNzc5NTgsIDAuNjk3NjYsIDAuODEwNTUsIDAuOTAzOTksIDAuODg2NTMsIDAuOTYwNjgsIDAuODI1NzcsIDAuNzc4OTIsIDAuNzgyNTcsIDAuOTc1MDcsIDEuNTI5LCAwLjk3NTA3LCAwLjg1Mjg0LCAwLjg5NTUyLCAwLjkwMTc2LCAwLjk0OTA4LCAwLjg2NDExLCAwLjc0MDEyLCAwLjg2NDExLCAwLjg4MzIzLCAwLjk1MDE1LCAwLjg2NDExLCAwLjg2MzMxLCAwLjg4NDAxLCAwLjkxOTE2LCAwLjg2MzA0LCAwLjg4NDAxLCAwLjkwMzksIDAuODYzMzEsIDAuODYzMzEsIDAuODY0MTEsIDAuODY0MTEsIDAuOTA0NjQsIDAuNzA4NTIsIDEuMDQxMDYsIDAuODYzMzEsIDAuODQzNzIsIDAuOTU3OTQsIDAuODI2MTYsIDAuODQ1NDgsIDAuNzk0OTIsIDAuODgzMzEsIDEuNjk4MDgsIDAuODgzMzEsIDAuODUyODQsIDAuOTc4MDEsIDAuODk1NTIsIDAuOTExMzMsIDAuODk1NTIsIDAuOTExMzMsIDEuNzgwMSwgMC44OTU1MiwgMS4yNDQ4NywgMS4xMzI1NCwgMS4xOTEyOSwgMC45NjgzOSwgMC44NTI4NCwgMC42ODc4NywgMC43MDY0NSwgMC44NTU5MiwgMC45MDc0NywgMS4wMTQ2NiwgMS4wMDg4LCAwLjkwMzIzLCAxLCAxLjA3NDYzLCAxLCAwLjkxMDU2LCAwLjc1ODA2LCAxLjE5MTE4LCAwLjk2ODM5LCAwLjc4ODY0LCAwLjgyODQ1LCAwLjg0MTMzLCAwLjc1ODU5LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjc3NTM5LCAwLjcxODA1LCAwLjczMTMzLCAwLjczMTMzLCAwLjczMTMzLCAwLjczMTMzLCAwLjk1OTU4LCAwLjk1OTU4LCAwLjk1OTU4LCAwLjk1OTU4LCAwLjg4NTA2LCAwLjkwODcyLCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1OTM4LCAwLjg1Mjg0LCAwLjg3MDY4LCAwLjkwMzk5LCAwLjkwMzk5LCAwLjkwMzk5LCAwLjkwMzk5LCAwLjc3ODkyLCAwLjc5Nzk1LCAwLjkwODA3LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjk0OTA4LCAwLjg1ODg3LCAwLjc0MDEyLCAwLjg4MzIzLCAwLjg4MzIzLCAwLjg4MzIzLCAwLjg4MzIzLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg3ODUsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuOTA3NDcsIDAuODkwNDksIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODYzMzEsIDAuODQ1NDgsIDAuODY0MTEsIDAuODQ1NDgsIDAuODM5MDgsIDAuOTQ5MDgsIDAuODM5MDgsIDAuOTQ5MDgsIDAuODM5MDgsIDAuOTQ5MDgsIDAuNzE4MDUsIDAuNzQwMTIsIDAuNzE4MDUsIDAuNzQwMTIsIDAuNzE4MDUsIDAuNzQwMTIsIDAuNzE4MDUsIDAuNzQwMTIsIDAuODcyODksIDAuNzk1MzgsIDAuODg1MDYsIDAuOTI3MjYsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuNzMxMzMsIDAuODgzMjMsIDAuODE5MjEsIDAuODY0MTEsIDAuODE5MjEsIDAuODY0MTEsIDAuODE5MjEsIDAuODY0MTEsIDEsIDEsIDAuODczNTYsIDAuODYzMzEsIDAuOTEwNzUsIDAuODc3NywgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC45NTk1OCwgMC44ODQwMSwgMC43NjQ2NywgMC45MDE2NywgMC41OTUyNiwgMC45MTkxNiwgMSwgMSwgMC44NjMwNCwgMC42OTIyNSwgMC44ODQwMSwgMSwgMSwgMC43MDQyNCwgMC43NzMxMiwgMC45MTkyNiwgMC44ODE3NSwgMC43MDgyMywgMC45NDkwMywgMC45MDg3MiwgMC44NjMzMSwgMSwgMSwgMC45MDg3MiwgMC44NjMzMSwgMC44NjkwNiwgMC44ODExNiwgMC44NjMzMSwgMC44NTkzOCwgMC44NjMzMSwgMC44NTkzOCwgMC44NjMzMSwgMC44NTkzOCwgMC44NjMzMSwgMC44NzQwMiwgMC44NjU0OSwgMC43Nzk1OCwgMC45MDQ2NCwgMSwgMSwgMC43Nzk1OCwgMC45MDQ2NCwgMC42OTc2NiwgMC43MDg1MiwgMC42OTc2NiwgMC43MDg1MiwgMC42OTc2NiwgMC43MDg1MiwgMC42OTc2NiwgMC43MDg1MiwgMSwgMSwgMC44MTA1NSwgMC43NTg0MSwgMC44MTA1NSwgMS4wNjQ1MiwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45MDM5OSwgMC44NjMzMSwgMC45NjA2OCwgMC45NTc5NCwgMC43Nzg5MiwgMC44NDU0OCwgMC43Nzg5MiwgMC43ODI1NywgMC43OTQ5MiwgMC43ODI1NywgMC43OTQ5MiwgMC43ODI1NywgMC43OTQ5MiwgMC45Mjk3LCAwLjU2ODkyLCAwLjgzOTA4LCAwLjk0OTA4LCAwLjc3NTM5LCAwLjg1ODg3LCAwLjg3MDY4LCAwLjg5MDQ5LCAxLCAxLCAwLjgxMDU1LCAxLjA0MTA2LCAxLjIwNTI4LCAxLjIwNTI4LCAxLCAxLjE1NTQzLCAwLjcwMDg4LCAwLjk4Mzg3LCAwLjk0NzIxLCAxLjMzNDMxLCAxLjQ1ODk0LCAwLjk1MTYxLCAxLjQ4Mzg3LCAwLjgzOTA4LCAwLjgwMzUyLCAwLjU3MTE4LCAwLjY5NjUsIDAuNTYzNDcsIDAuNzkxNzksIDAuNTU4NTMsIDAuODAzNDYsIDEuMDI5ODgsIDAuODM5MDgsIDAuNzc2MiwgMC42NzE3NCwgMC44NjAzNiwgMC43MzEzMywgMC43ODI1NywgMC44NzM1NiwgMC44NjQ0MSwgMC45NTk1OCwgMC43NTcyNywgMC44OTAxOSwgMS4wNDkyNCwgMC45MDg3MiwgMC43NDg4OSwgMC44NTkzOCwgMC44Nzg5MSwgMC43OTc5NSwgMC43OTU3LCAwLjgxMDU1LCAwLjc3ODkyLCAwLjk3NDQ3LCAwLjgyNTc3LCAwLjk3NDY2LCAwLjg3MTc5LCAwLjk1OTU4LCAwLjc3ODkyLCAwLjk0MjUyLCAwLjk1NjEyLCAwLjg3NTMsIDEuMDI5ODgsIDAuOTI3MzMsIDAuOTQyNTIsIDAuODc0MTEsIDAuODQwMjEsIDAuODcyOCwgMC45NTYxMiwgMC43NDA4MSwgMC44NzUzLCAxLjAyMTg5LCAxLjAyOTg4LCAwLjg0ODE0LCAwLjg3NDQ1LCAwLjkxODIyLCAwLjg0NzIzLCAwLjg1NjY4LCAwLjg2MzMxLCAwLjgxMzQ0LCAwLjg3NTgxLCAwLjc2NDIyLCAwLjgyMDQ2LCAwLjk2MDU3LCAwLjkyNzMzLCAwLjk5Mzc1LCAwLjc4MDIyLCAwLjk1NDUyLCAwLjg2MDE1LCAxLjAyOTg4LCAwLjkyNzMzLCAwLjg2MzMxLCAwLjkyNzMzLCAwLjg2MDE1LCAwLjczMTMzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjkwNjMxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjg4MzIzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjg1MTc0LCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk2MDY4LCAwLjk1Nzk0LCAwLjk2MDY4LCAwLjk1Nzk0LCAwLjk2MDY4LCAwLjk1Nzk0LCAwLjc3ODkyLCAwLjg0NTQ4LCAxLCAxLCAwLjg5NTUyLCAwLjkwNTI3LCAxLCAwLjkwMzYzLCAwLjkyNzk0LCAwLjkyNzk0LCAwLjkyNzk0LCAwLjg5ODA3LCAwLjg3MDEyLCAwLjg3MDEyLCAwLjg3MDEyLCAwLjg5NTUyLCAwLjg5NTUyLCAxLjQyMjU5LCAwLjcxMDk0LCAxLjA2MTUyLCAxLCAxLCAxLjAzMzcyLCAxLjAzMzcyLCAwLjk3MTcxLCAxLjQ5NTYsIDIuMjgwNywgMC45Mjk3MiwgMC44MzQwNiwgMC45MTEzMywgMC44MzMyNiwgMC45MTEzMywgMSwgMSwgMSwgMC43MjAyMSwgMSwgMS4yMzEwOCwgMC44MzQ4OSwgMC44ODUyNSwgMC44ODUyNSwgMC44MTQ5OSwgMC45MDYxNiwgMS44MTA1NSwgMC45MDUyNywgMS44MTA1NSwgMS4zMTA3LCAxLjUzNzExLCAwLjk0NDM0LCAxLjA4Njk2LCAxLCAwLjk1MDE4LCAwLjc3MTkyLCAwLjg1Mjg0LCAwLjkwNzQ3LCAxLjE3NTM0LCAwLjY5ODI1LCAwLjk3MTYsIDEuMzcwNzcsIDAuOTA3NDcsIDAuOTA3NDcsIDAuODUzNTYsIDAuOTA3NDcsIDAuOTA3NDcsIDEuNDQ5NDcsIDAuODUyODQsIDAuODk0MSwgMC44OTQxLCAwLjcwNTcyLCAwLjgsIDAuNzA1NzIsIDAuNzA1NzIsIDAuNzA1NzIsIDAuNzA1NzIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMDgwMDQsIDAuOTEwMjcsIDEsIDEsIDEsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTA3MjcsIDAuOTA3MjcsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBDYWxpYnJpQm9sZEl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yMjA3LAogIGxpbmVHYXA6IDAuMjIwNwp9Owpjb25zdCBDYWxpYnJpSXRhbGljRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDEuMTcyMjMsIDEuMTI5MywgMC44OTU1MiwgMC45MTEzMywgMC44MDM5NSwgMS4wMjI2OSwgMS4xNTYwMSwgMC45MTA1NiwgMC45MTA1NiwgMS4yNzk4LCAwLjg1Mjg0LCAwLjg5ODA3LCAxLCAwLjkwODYxLCAxLjM5NTQzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjk2MzA5LCAwLjk2MzA5LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjgzMzE5LCAwLjg4MDcxLCAwLjg2NzUsIDAuODE1NTIsIDAuNzIzNDYsIDAuODUxOTMsIDAuNzMyMDYsIDAuNzUyMiwgMC44MTEwNSwgMC44NjI3NSwgMC45MDY4NSwgMC42Mzc3LCAwLjc3ODkyLCAwLjc1NTkzLCAxLjAyNjM4LCAwLjg5MjQ5LCAwLjg0MTE4LCAwLjc3NDUyLCAwLjg1Mzc0LCAwLjc1MTg2LCAwLjY3Nzg5LCAwLjc5Nzc2LCAwLjg4ODQ0LCAwLjg1MDY2LCAwLjk0MzA5LCAwLjc3ODE4LCAwLjczMDYsIDAuNzY2NTksIDEuMTAzNjksIDEuMzgzMTMsIDEuMTAzNjksIDEuMDYxMzksIDAuODk1NTIsIDAuODczOSwgMC45MjQ1LCAwLjkyNDUsIDAuODMyMDMsIDAuOTI0NSwgMC44NTg2NSwgMS4wOTg0MiwgMC45MjQ1LCAwLjkyNDUsIDEuMDMyOTcsIDEuMDc2OTIsIDAuOTA5MTgsIDEuMDMyOTcsIDAuOTQ5NTksIDAuOTI0NSwgMC45MjI3NCwgMC45MjQ1LCAwLjkyNDUsIDEuMDI5MzMsIDAuNzc4MzIsIDEuMjA1NjIsIDAuOTI0NSwgMC44OTE2LCAwLjk4OTg2LCAwLjg2NjIxLCAwLjg5NDUzLCAwLjc5MDA0LCAwLjk0MTUyLCAxLjc3MjU2LCAwLjk0MTUyLCAwLjg1Mjg0LCAwLjk3ODAxLCAwLjg5NTUyLCAwLjkxMTMzLCAwLjg5NTUyLCAwLjkxMTMzLCAxLjkxNzI5LCAwLjg5NTUyLCAxLjE3ODg5LCAxLjEzMjU0LCAxLjE2MzU5LCAwLjkyMDk4LCAwLjg1Mjg0LCAwLjY4Nzg3LCAwLjcxMzUzLCAwLjg0NzM3LCAwLjkwNzQ3LCAxLjAwODgsIDEuMDA0NCwgMC44NzY4MywgMSwgMS4wOTA5MSwgMSwgMC45MjIyOSwgMC43MzksIDEuMTU2NDIsIDAuOTIwOTgsIDAuNzYyODgsIDAuODA1MDQsIDAuODA5NzIsIDAuNzU4NTksIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuNzYzMTgsIDAuNzIzNDYsIDAuNzMyMDYsIDAuNzMyMDYsIDAuNzMyMDYsIDAuNzMyMDYsIDAuOTA2ODUsIDAuOTA2ODUsIDAuOTA2ODUsIDAuOTA2ODUsIDAuODY0NzcsIDAuODkyNDksIDAuODQxMTgsIDAuODQxMTgsIDAuODQxMTgsIDAuODQxMTgsIDAuODQxMTgsIDAuODUyODQsIDAuODQ1NTcsIDAuODg4NDQsIDAuODg4NDQsIDAuODg4NDQsIDAuODg4NDQsIDAuNzMwNiwgMC43NzQ1MiwgMC44NjMzMSwgMC45MjQ1LCAwLjkyNDUsIDAuOTI0NSwgMC45MjQ1LCAwLjkyNDUsIDAuOTI0NSwgMC44NDg0MywgMC44MzIwMywgMC44NTg2NSwgMC44NTg2NSwgMC44NTg2NSwgMC44NTg2NSwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC45NDQ2OSwgMC45MjQ1LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkyMjc0LCAwLjkwNzQ3LCAwLjg2NjUxLCAwLjkyNDUsIDAuOTI0NSwgMC45MjQ1LCAwLjkyNDUsIDAuODk0NTMsIDAuOTI0NSwgMC44OTQ1MywgMC44Njc1LCAwLjkyNDUsIDAuODY3NSwgMC45MjQ1LCAwLjg2NzUsIDAuOTI0NSwgMC43MjM0NiwgMC44MzIwMywgMC43MjM0NiwgMC44MzIwMywgMC43MjM0NiwgMC44MzIwMywgMC43MjM0NiwgMC44MzIwMywgMC44NTE5MywgMC44ODc1LCAwLjg2NDc3LCAwLjk5MDM0LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjczMjA2LCAwLjg1ODY1LCAwLjgxMTA1LCAwLjkyNDUsIDAuODExMDUsIDAuOTI0NSwgMC44MTEwNSwgMC45MjQ1LCAxLCAxLCAwLjg2Mjc1LCAwLjkyNDUsIDAuOTA4NzIsIDAuOTM1OTEsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDEuMDMyOTcsIDAuOTA2ODUsIDAuODI2MDEsIDAuNzc4OTYsIDEuMDU2MTEsIDAuNjM3NywgMS4wNzY5MiwgMSwgMSwgMC45MDkxOCwgMC43NTU5MywgMS4wMzI5NywgMSwgMSwgMC43NjAzMiwgMC45Mzc1LCAwLjk4MTU2LCAwLjkzNDA3LCAwLjc3MjYxLCAxLjExNDI5LCAwLjg5MjQ5LCAwLjkyNDUsIDEsIDEsIDAuODkyNDksIDAuOTI0NSwgMC45MjUzNCwgMC44NjY5OCwgMC45MjQ1LCAwLjg0MTE4LCAwLjkyMjc0LCAwLjg0MTE4LCAwLjkyMjc0LCAwLjg0MTE4LCAwLjkyMjc0LCAwLjg2NjcsIDAuODYyOTEsIDAuNzUxODYsIDEuMDI5MzMsIDEsIDEsIDAuNzUxODYsIDEuMDI5MzMsIDAuNjc3ODksIDAuNzc4MzIsIDAuNjc3ODksIDAuNzc4MzIsIDAuNjc3ODksIDAuNzc4MzIsIDAuNjc3ODksIDAuNzc4MzIsIDEsIDEsIDAuNzk3NzYsIDAuOTc2NTUsIDAuNzk3NzYsIDEuMjMwMjMsIDAuODg4NDQsIDAuOTI0NSwgMC44ODg0NCwgMC45MjQ1LCAwLjg4ODQ0LCAwLjkyNDUsIDAuODg4NDQsIDAuOTI0NSwgMC44ODg0NCwgMC45MjQ1LCAwLjg4ODQ0LCAwLjkyNDUsIDAuOTQzMDksIDAuOTg5ODYsIDAuNzMwNiwgMC44OTQ1MywgMC43MzA2LCAwLjc2NjU5LCAwLjc5MDA0LCAwLjc2NjU5LCAwLjc5MDA0LCAwLjc2NjU5LCAwLjc5MDA0LCAxLjA5MjMxLCAwLjU0ODczLCAwLjg2NzUsIDAuOTI0NSwgMC43NjMxOCwgMC44NDg0MywgMC44NDU1NywgMC44NjY1MSwgMSwgMSwgMC43OTc3NiwgMS4yMDU2MiwgMS4xODYyMiwgMS4xODYyMiwgMSwgMS4xNDM3LCAwLjY3MDA5LCAwLjk2MzM0LCAwLjkzNjk1LCAxLjM1MTkxLCAxLjQwOTA5LCAwLjk1MTYxLCAxLjQ4Mzg3LCAwLjg2NzUsIDAuOTA4NjEsIDAuNjE5MiwgMC43MzYzLCAwLjY0ODI0LCAwLjgyNDExLCAwLjU2MzIxLCAwLjg1Njk2LCAxLjIzNTE2LCAwLjg2NzUsIDAuODE1NTIsIDAuNzI4NiwgMC44NDEzNCwgMC43MzIwNiwgMC43NjY1OSwgMC44NjI3NSwgMC44NDM2OSwgMC45MDY4NSwgMC43Nzg5MiwgMC44NTg3MSwgMS4wMjYzOCwgMC44OTI0OSwgMC43NTgyOCwgMC44NDExOCwgMC44NTk4NCwgMC43NzQ1MiwgMC43NjQ2NiwgMC43OTc3NiwgMC43MzA2LCAwLjkwNzgyLCAwLjc3ODE4LCAwLjkwMywgMC44NzI5MSwgMC45MDY4NSwgMC43MzA2LCAwLjk5MDU4LCAxLjAzNjY3LCAwLjk0NjM1LCAxLjIzNTE2LCAwLjk4NDksIDAuOTkwNTgsIDAuOTIzOTMsIDAuODkxNiwgMC45NDIsIDEuMDM2NjcsIDAuNzUwMjYsIDAuOTQ2MzUsIDEuMDI5NywgMS4yMzUxNiwgMC45MDkxOCwgMC45NDA0OCwgMC45ODIxNywgMC44OTc0NiwgMC44NDE1MywgMC45MjI3NCwgMC44MjUwNywgMC44ODgzMiwgMC44NDQzOCwgMC44ODE3OCwgMS4wMzUyNSwgMC45ODQ5LCAxLjAwMjI1LCAwLjc4MDg2LCAwLjk3MjQ4LCAwLjg5NDA0LCAxLjIzNTE2LCAwLjk4NDksIDAuOTIyNzQsIDAuOTg0OSwgMC44OTQwNCwgMC43MzIwNiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44OTY5MywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44NTg2NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDkzMywgMSwgMSwgMSwgMSwgMSwgMSwgMC45NDMwOSwgMC45ODk4NiwgMC45NDMwOSwgMC45ODk4NiwgMC45NDMwOSwgMC45ODk4NiwgMC43MzA2LCAwLjg5NDUzLCAxLCAxLCAwLjg5NTUyLCAwLjkwNTI3LCAxLCAwLjkwMTg2LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjI1NjYsIDEuMjU2NiwgMS4yNTY2LCAwLjg5NTUyLCAwLjg5NTUyLCAxLjQyMjU5LCAwLjY4OTk0LCAxLjAzODA5LCAxLCAxLCAxLjAxNzYsIDEuMDE3NiwgMS4xMTUyMywgMS40OTU2LCAyLjAxNDYyLCAwLjk3ODU4LCAwLjgyNjE2LCAwLjkxMTMzLCAwLjgzNDM3LCAwLjkxMTMzLCAxLCAxLCAxLCAwLjcwNTA4LCAxLCAxLjIzMTA4LCAwLjc5ODAxLCAwLjg0NDI2LCAwLjg0NDI2LCAwLjc3NCwgMC45MDU3MiwgMS44MTA1NSwgMC45MDc0OSwgMS44MTA1NSwgMS4yODgwOSwgMS41NTQ2OSwgMC45NDQzNCwgMS4wNzgwNiwgMSwgMC45NzA5NCwgMC43NTg5LCAwLjg1Mjg0LCAwLjkwNzQ3LCAxLjE5NjU4LCAwLjY5ODI1LCAwLjk3NjIyLCAxLjMzNTEyLCAwLjkwNzQ3LCAwLjkwNzQ3LCAwLjg1Mjg0LCAwLjkwNzQ3LCAwLjkwNzQ3LCAxLjQ0OTQ3LCAwLjg1Mjg0LCAwLjg5NDEsIDAuODk0MSwgMC43MDU3MiwgMC44LCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjAzMzYsIDAuOTEwMjcsIDEsIDEsIDEsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDU4NTksIDEuMDU4NTksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBDYWxpYnJpSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIyMDcsCiAgbGluZUdhcDogMC4yMjA3Cn07CmNvbnN0IENhbGlicmlSZWd1bGFyRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDEuMTcyMjMsIDEuMTI5MywgMC44OTU1MiwgMC45MTEzMywgMC44MDM5NSwgMS4wMjI2OSwgMS4xNTYwMSwgMC45MTA1NiwgMC45MTA1NiwgMS4yNzk4LCAwLjg1Mjg0LCAwLjg5ODA3LCAxLCAwLjkwODYxLCAxLjM5MDE2LCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjk2MzA5LCAwLjk2MzA5LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjgzMzE5LCAwLjg4MDcxLCAwLjg2NzUsIDAuODE1NTIsIDAuNzM4MzQsIDAuODUxOTMsIDAuNzMyMDYsIDAuNzUyMiwgMC44MTEwNSwgMC44NjI3NSwgMC45MDY4NSwgMC42Mzc3LCAwLjc3ODkyLCAwLjc1NTkzLCAxLjAyNjM4LCAwLjg5Mzg1LCAwLjg1MTIyLCAwLjc3NDUyLCAwLjg2NTAzLCAwLjc1MTg2LCAwLjY4ODg3LCAwLjc5Nzc2LCAwLjg4ODQ0LCAwLjg1MDY2LCAwLjk0MjU4LCAwLjc3ODE4LCAwLjczMDYsIDAuNzY2NTksIDEuMTAzNjksIDEuMzkwMTYsIDEuMTAzNjksIDEuMDYxMzksIDAuODk1NTIsIDAuODczOSwgMC44NjEyOCwgMC45NDQ2OSwgMC44NDU3LCAwLjk0NDY5LCAwLjg5NDY0LCAxLjA5ODQyLCAwLjg0NjM2LCAwLjk0NDY5LCAxLjAzMjk3LCAxLjA3NjkyLCAwLjkwOTE4LCAxLjAzMjk3LCAwLjk1ODk3LCAwLjk0NDY5LCAwLjk0ODIsIDAuOTQ0NjksIDAuOTQ0NjksIDEuMDQ2OTIsIDAuNzgyMjMsIDEuMjA1NjIsIDAuOTQ0NjksIDAuOTAzMzIsIDAuOTg5ODYsIDAuODY2MjEsIDAuOTA1MjcsIDAuNzkwMDQsIDAuOTQxNTIsIDEuNzcyNTYsIDAuOTQxNTIsIDAuODUyODQsIDAuOTc4MDEsIDAuODk1NTIsIDAuOTExMzMsIDAuODk1NTIsIDAuOTExMzMsIDEuOTE3MjksIDAuODk1NTIsIDEuMTc4ODksIDEuMTMyNTQsIDEuMDg3MDcsIDAuOTIwOTgsIDAuODUyODQsIDAuNjg3ODcsIDAuNzEzNTMsIDAuODQ3MzcsIDAuOTA3NDcsIDEuMDA4OCwgMS4wMDQ0LCAwLjg3NjgzLCAxLCAxLjA5MDkxLCAxLCAwLjkyMjI5LCAwLjczOSwgMS4xNTY0MiwgMC45MjA5OCwgMC43NjI4OCwgMC44MDUwNCwgMC44MDk3MiwgMC43NTg1OSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC43NjMxOCwgMC43MzgzNCwgMC43MzIwNiwgMC43MzIwNiwgMC43MzIwNiwgMC43MzIwNiwgMC45MDY4NSwgMC45MDY4NSwgMC45MDY4NSwgMC45MDY4NSwgMC44NjQ3NywgMC44OTM4NSwgMC44NTEyMiwgMC44NTEyMiwgMC44NTEyMiwgMC44NTEyMiwgMC44NTEyMiwgMC44NTI4NCwgMC44NTMxMSwgMC44ODg0NCwgMC44ODg0NCwgMC44ODg0NCwgMC44ODg0NCwgMC43MzA2LCAwLjc3NDUyLCAwLjg2MzMxLCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2MTI4LCAwLjg2OTMsIDAuODQ1NywgMC44OTQ2NCwgMC44OTQ2NCwgMC44OTQ2NCwgMC44OTQ2NCwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC44MjYwMSwgMC45NDQ2OSwgMC45NDQ2OSwgMC45NDgyLCAwLjk0ODIsIDAuOTQ4MiwgMC45NDgyLCAwLjk0ODIsIDAuOTA3NDcsIDAuODY2NTEsIDAuOTQ0NjksIDAuOTQ0NjksIDAuOTQ0NjksIDAuOTQ0NjksIDAuOTA1MjcsIDAuOTQ0NjksIDAuOTA1MjcsIDAuODY3NSwgMC44NjEyOCwgMC44Njc1LCAwLjg2MTI4LCAwLjg2NzUsIDAuODYxMjgsIDAuNzM4MzQsIDAuODQ1NywgMC43MzgzNCwgMC44NDU3LCAwLjczODM0LCAwLjg0NTcsIDAuNzM4MzQsIDAuODQ1NywgMC44NTE5MywgMC45MjQ1NCwgMC44NjQ3NywgMC45OTIxLCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjczMjA2LCAwLjg5NDY0LCAwLjgxMTA1LCAwLjg0NjM2LCAwLjgxMTA1LCAwLjg0NjM2LCAwLjgxMTA1LCAwLjg0NjM2LCAxLCAxLCAwLjg2Mjc1LCAwLjk0NDY5LCAwLjkwODcyLCAwLjk1Nzg2LCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAxLjAzMjk3LCAwLjkwNjg1LCAwLjgyNjAxLCAwLjc3NzQxLCAxLjA1NjExLCAwLjYzNzcsIDEuMDc2OTIsIDEsIDEsIDAuOTA5MTgsIDAuNzU1OTMsIDEuMDMyOTcsIDEsIDEsIDAuNzYwMzIsIDAuOTA0NTIsIDAuOTgxNTYsIDEuMTE4NDIsIDAuNzcyNjEsIDEuMTE0MjksIDAuODkzODUsIDAuOTQ0NjksIDEsIDEsIDAuODkzODUsIDAuOTQ0NjksIDAuOTU4NzcsIDAuODY5MDEsIDAuOTQ0NjksIDAuODUxMjIsIDAuOTQ4MiwgMC44NTEyMiwgMC45NDgyLCAwLjg1MTIyLCAwLjk0ODIsIDAuODY2NywgMC45MDAxNiwgMC43NTE4NiwgMS4wNDY5MiwgMSwgMSwgMC43NTE4NiwgMS4wNDY5MiwgMC42ODg4NywgMC43ODIyMywgMC42ODg4NywgMC43ODIyMywgMC42ODg4NywgMC43ODIyMywgMC42ODg4NywgMC43ODIyMywgMSwgMSwgMC43OTc3NiwgMC45MjE4OCwgMC43OTc3NiwgMS4yMzAyMywgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC44ODg0NCwgMC45NDQ2OSwgMC45NDI1OCwgMC45ODk4NiwgMC43MzA2LCAwLjkwNTI3LCAwLjczMDYsIDAuNzY2NTksIDAuNzkwMDQsIDAuNzY2NTksIDAuNzkwMDQsIDAuNzY2NTksIDAuNzkwMDQsIDEuMDkyMzEsIDAuNTQ4NzMsIDAuODY3NSwgMC44NjEyOCwgMC43NjMxOCwgMC44NjkzLCAwLjg1MzExLCAwLjg2NjUxLCAxLCAxLCAwLjc5Nzc2LCAxLjIwNTYyLCAxLjE4NjIyLCAxLjE4NjIyLCAxLCAxLjE0MzcsIDAuNjc3NDIsIDAuOTYzMzQsIDAuOTM2OTUsIDEuMzUxOTEsIDEuNDA5MDksIDAuOTUxNjEsIDEuNDgzODcsIDAuODY2ODYsIDAuOTA4NjEsIDAuNjIyNjcsIDAuNzQzNTksIDAuNjU2NDksIDAuODU0OTgsIDAuNTY5NjMsIDAuODgyNTQsIDEuMjM1MTYsIDAuODY3NSwgMC44MTU1MiwgMC43NTQ0MywgMC44NDUwMywgMC43MzIwNiwgMC43NjY1OSwgMC44NjI3NSwgMC44NTEyMiwgMC45MDY4NSwgMC43Nzg5MiwgMC44NTc0NiwgMS4wMjYzOCwgMC44OTM4NSwgMC43NTY1NywgMC44NTEyMiwgMC44NjI3NSwgMC43NzQ1MiwgMC43NDE3MSwgMC43OTc3NiwgMC43MzA2LCAwLjk1MTY1LCAwLjc3ODE4LCAwLjg5NzcyLCAwLjg4ODMxLCAwLjkwNjg1LCAwLjczMDYsIDAuOTgxNDIsIDEuMDIxOTEsIDAuOTY1NzYsIDEuMjM1MTYsIDAuOTkwMTgsIDAuOTgxNDIsIDAuOTIzNiwgMC44OTI1OCwgMC45NDAzNSwgMS4wMjE5MSwgMC43ODg0OCwgMC45NjU3NiwgMC45NTYxLCAxLjIzNTE2LCAwLjkwOTE4LCAwLjkyNTc4LCAwLjk1NDI0LCAwLjg5NzQ2LCAwLjgzOTY5LCAwLjk0ODIsIDAuODAxMTMsIDAuODk0NDIsIDAuODUyMDgsIDAuODYxNTUsIDAuOTgwMjIsIDAuOTkwMTgsIDEuMDA0NTIsIDAuODEyMDksIDAuOTkyNDcsIDAuODkxODEsIDEuMjM1MTYsIDAuOTkwMTgsIDAuOTQ4MiwgMC45OTAxOCwgMC44OTE4MSwgMC43MzIwNiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44ODg0NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44OTQ2NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45Njc2NiwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NDI1OCwgMC45ODk4NiwgMC45NDI1OCwgMC45ODk4NiwgMC45NDI1OCwgMC45ODk4NiwgMC43MzA2LCAwLjkwNTI3LCAxLCAxLCAwLjg5NTUyLCAwLjkwNTI3LCAxLCAwLjkwMTg2LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjEyMzA4LCAxLjI1NjYsIDEuMjU2NiwgMS4yNTY2LCAwLjg5NTUyLCAwLjg5NTUyLCAxLjQyMjU5LCAwLjY5MDQzLCAxLjAzODA5LCAxLCAxLCAxLjAxNzYsIDEuMDE3NiwgMS4xMTUyMywgMS40OTU2LCAyLjAxNDYyLCAwLjk5MzMxLCAwLjgyNjE2LCAwLjkxMTMzLCAwLjg0Mjg2LCAwLjkxMTMzLCAxLCAxLCAxLCAwLjcwNTA4LCAxLCAxLjIzMTA4LCAwLjc5ODAxLCAwLjg0NDI2LCAwLjg0NDI2LCAwLjc3NCwgMC45MDUyNywgMS44MTA1NSwgMC45MDUyNywgMS44MTA1NSwgMS4yODgwOSwgMS41NTQ2OSwgMC45NDQzNCwgMS4wNzgwNiwgMSwgMC45NzA5NCwgMC43NTg5LCAwLjg1Mjg0LCAwLjkwNzQ3LCAxLjE5NjU4LCAwLjY5ODI1LCAwLjk3NjIyLCAxLjMzNTEyLCAwLjkwNzQ3LCAwLjkwNzQ3LCAwLjg1MzU2LCAwLjkwNzQ3LCAwLjkwNzQ3LCAxLjQ0OTQ3LCAwLjg1Mjg0LCAwLjg5NDEsIDAuODk0MSwgMC43MDU3MiwgMC44LCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjAzMzYsIDAuOTEwMjcsIDEsIDEsIDEsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDU4NTksIDEuMDU4NTksIDEsIDEsIDEsIDEuMDcxODUsIDAuOTk0MTMsIDAuOTYzMzQsIDEuMDgwNjUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBDYWxpYnJpUmVndWxhck1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yMjA3LAogIGxpbmVHYXA6IDAuMjIwNwp9OwoKOy8vIC4vc3JjL2NvcmUvaGVsdmV0aWNhX2ZhY3RvcnMuanMKY29uc3QgSGVsdmV0aWNhQm9sZEZhY3RvcnMgPSBbMC43NjExNiwgMSwgMSwgMS4wMDA2LCAwLjk5OTk4LCAwLjk5OTc0LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTgyLCAwLjk5OTc3LCAxLjAwMDg3LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTU5LCAxLjAwMDAzLCAxLjAwMDYsIDAuOTk5OTgsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTk4LCAxLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDI2LCAwLjk5OTksIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3NywgMS4wMDAyNiwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAwMSwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAxNiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk5OCwgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDAzLCAwLjk5OTczLCAwLjk5OTk4LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTgyLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTU5LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTU5LCAxLjAwMDc3LCAwLjk5OTU5LCAxLjAwMDAzLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDc3LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI1LCAwLjk5OTY4LCAwLjk5OTczLCAxLjAwMDAzLCAxLjAwMDI1LCAwLjYwMjk5LCAxLjAwMDI0LCAxLjA2NDA5LCAxLCAxLCAwLjk5OTk4LCAxLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5OTgsIDEsIDAuOTk5MzYsIDAuOTk5NzMsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMjYsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAwMywgMS4wMDAyMiwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjA2NDA5LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAxLjAzMzc0LCAwLjk5OTc3LCAxLjAwMDI2LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNDIsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3MywgMC45OTk3MywgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwMjYsIDEuMDM4MjgsIDEuMDAwMjYsIDAuOTk5OTksIDEuMDAwMjYsIDEuMDAwNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTkzLCAwLjk5OTgsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5NTksIDAuOTk5NzcsIDAuOTk5NTksIDAuOTk5NzcsIDAuOTk5NTksIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5OTgsIDEuMDAwMjYsIDAuODEyMSwgMS4wMDAyNiwgMC45OTk5OCwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAxLjAwMDM0LCAwLjk5OTc3LCAxLCAwLjk5OTk3LCAxLjAwMDI2LCAxLjAwMDc4LCAxLjAwMDM2LCAwLjk5OTczLCAxLjAwMDEzLCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5ODgsIDAuODUxNDgsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwNiwgMC45OTk3NywgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk3NywgMS4wMDA2OSwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDAwMSwgMC45OTk4NCwgMS4wMDAyNiwgMS4wMDAwMSwgMS4wMDAyNCwgMS4wMDAwMSwgMC45OTk5LCAxLCAxLjAwMDYsIDEuMDAwMDEsIDEuMDAwNDEsIDAuOTk5NjIsIDEuMDAwMjYsIDEuMDAwNiwgMC45OTk5NSwgMS4wMDA0MSwgMC45OTk0MiwgMC45OTk3MywgMC45OTkyNywgMS4wMDA4MiwgMC45OTkwMiwgMS4wMDAyNiwgMS4wMDA4NywgMS4wMDA2LCAxLjAwMDY5LCAwLjk5OTczLCAwLjk5ODY3LCAwLjk5OTczLCAwLjk5OTMsIDEuMDAwMjYsIDEuMDAwNDksIDEuMDAwNTYsIDEsIDAuOTk5ODgsIDAuOTk5MzUsIDAuOTk5OTUsIDAuOTk5NTQsIDEuMDAwNTUsIDAuOTk5NDUsIDEuMDAwMzIsIDEuMDAwNiwgMC45OTk5NSwgMS4wMDAyNiwgMC45OTk5NSwgMS4wMDAzMiwgMS4wMDAwMSwgMS4wMDAwOCwgMC45OTk3MSwgMS4wMDAxOSwgMC45OTk0LCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNDQsIDAuOTk5NzMsIDEuMDAwMjMsIDEuMDAwNDcsIDEsIDAuOTk5NDIsIDAuOTk1NjEsIDAuOTk5ODksIDEuMDAwMzUsIDAuOTk5NzcsIDEuMDAwMzUsIDAuOTk5NzcsIDEuMDAwMTksIDAuOTk5NDQsIDEuMDAwMDEsIDEuMDAwMjEsIDAuOTk5MjYsIDEuMDAwMzUsIDEuMDAwMzUsIDAuOTk5NDIsIDEuMDAwNDgsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMzUsIDEuMDAwMDEsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5ODksIDEuMDAwNTcsIDEuMDAwMDEsIDAuOTk5MzYsIDEuMDAwNTIsIDEuMDAwMTIsIDAuOTk5OTYsIDEuMDAwNDMsIDEsIDEuMDAwMzUsIDAuOTk5NCwgMC45OTk3NiwgMS4wMDAzNSwgMC45OTk3MywgMS4wMDA1MiwgMS4wMDA0MSwgMS4wMDExOSwgMS4wMDAzNywgMC45OTk3MywgMS4wMDAwMiwgMC45OTk4NiwgMS4wMDA0MSwgMS4wMDA0MSwgMC45OTkwMiwgMC45OTk2LCAxLjAwMDM0LCAwLjk5OTk5LCAxLjAwMDI2LCAwLjk5OTk5LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDUyLCAwLjk5OTczLCAxLCAwLjk5OTczLCAxLjAwMDQxLCAxLjAwMDc1LCAwLjk5OTQsIDEuMDAwMywgMC45OTk5OSwgMSwgMS4wMDA0MSwgMC45OTk1NSwgMSwgMC45OTkxNSwgMC45OTk3MywgMC45OTk3MywgMS4wMDAyNiwgMS4wMDExOSwgMC45OTk1NSwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTExLCAxLjAwMDYsIDEuMDAwMjYsIDAuOTk5NzIsIDEuMDAwMjYsIDAuOTk5MDIsIDEuMDAwNDEsIDAuOTk5NzMsIDAuOTk5OTksIDEsIDEsIDEuMDAwMzgsIDEuMDAwNSwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAwMSwgMC45OTk3MywgMSwgMSwgMC45OTk3MywgMSwgMSwgMC45OTk1NSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTcyLCAxLCAxLCAxLjAwMTA2LCAwLjk5OTk5LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk5LCAwLjk5OTk4LCAxLjY2NDc1LCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDIzLCAwLjk5OTczLCAwLjk5OTcxLCAxLjAwMDQ3LCAxLjAwMDIzLCAxLCAwLjk5OTkxLCAwLjk5OTg0LCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5OTcyLCAxLCAxLjIwOTg1LCAxLjM5NzEzLCAxLjAwMDAzLCAxLjAwMDMxLCAxLjAwMDE1LCAxLCAwLjk5NTYxLCAxLjAwMDI3LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTE1LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTk5LCAxLjAwMDAzLCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQxMTQ0LCAxLjYsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDA1NzksIDEuNDA1NzksIDEuMzY2MjUsIDAuOTk5OTksIDEsIDAuOTk4NjEsIDAuOTk4NjEsIDEsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDAuOTk5NzIsIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDEuNDA0ODMsIDEsIDAuOTk5NzcsIDEuMDAwNTQsIDEsIDEsIDAuOTk5NTMsIDAuOTk5NjIsIDEuMDAwNDIsIDAuOTk5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IEhlbHZldGljYUJvbGRNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMiwKICBsaW5lR2FwOiAwLjIKfTsKY29uc3QgSGVsdmV0aWNhQm9sZEl0YWxpY0ZhY3RvcnMgPSBbMC43NjExNiwgMSwgMSwgMS4wMDA2LCAwLjk5OTk4LCAwLjk5OTc0LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTgyLCAwLjk5OTc3LCAxLjAwMDg3LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTU5LCAxLjAwMDAzLCAxLjAwMDYsIDAuOTk5OTgsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTk4LCAxLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDI2LCAwLjk5OTksIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3NywgMS4wMDAyNiwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAwMSwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAxNiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk5OCwgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDAzLCAwLjk5OTczLCAwLjk5OTk4LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTgyLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTU5LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTU5LCAxLjAwMDc3LCAwLjk5OTU5LCAxLjAwMDAzLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDc3LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI1LCAwLjk5OTY4LCAwLjk5OTczLCAxLjAwMDAzLCAxLjAwMDI1LCAwLjYwMjk5LCAxLjAwMDI0LCAxLjA2NDA5LCAxLCAxLCAwLjk5OTk4LCAxLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5OTgsIDEsIDAuOTk5MzYsIDAuOTk5NzMsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMjYsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAwMywgMS4wMDAyMiwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjA2NDA5LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAxLjAwNDQsIDAuOTk5NzcsIDEuMDAwMjYsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MSwgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMS4wMTAxMSwgMS4wMDAyNiwgMC45OTk5OSwgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTMsIDAuOTk5OCwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMSwgMS4wMDAxNiwgMC45OTk3NywgMC45OTk1OSwgMC45OTk3NywgMC45OTk1OSwgMC45OTk3NywgMC45OTk1OSwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk5OCwgMS4wMDAyNiwgMC44MTIxLCAxLjAwMDI2LCAwLjk5OTk4LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAxLjAwMDE2LCAxLjAwMDIyLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5NzMsIDEsIDAuOTk5ODIsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NzcsIDEsIDEsIDEuMDAwMjYsIDAuOTk5NjksIDAuOTk5NzIsIDAuOTk5ODEsIDAuOTk5OCwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDIyLCAwLjkxMTU1LCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDYsIDAuOTk5NzcsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5NzcsIDAuOTk5NjYsIDEuMDAwMjIsIDEuMDAwMzIsIDEuMDAwMDEsIDAuOTk5NDQsIDEuMDAwMjYsIDEuMDAwMDEsIDAuOTk5NjgsIDEuMDAwMDEsIDEuMDAwNDcsIDEsIDEuMDAwNiwgMS4wMDAwMSwgMC45OTk4MSwgMS4wMDEwMSwgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTQ4LCAwLjk5OTgxLCAxLjAwMDY0LCAwLjk5OTczLCAwLjk5OTQyLCAxLjAwMTAxLCAxLjAwMDYxLCAxLjAwMDI2LCAxLjAwMDY5LCAxLjAwMDYsIDEuMDAwMTQsIDAuOTk5NzMsIDEuMDEzMjIsIDAuOTk5NzMsIDEuMDAwNjUsIDEuMDAwMjYsIDEuMDAwMTIsIDAuOTk5MjMsIDEsIDEuMDAwNjQsIDEuMDAwNzYsIDAuOTk5NDgsIDEuMDAwNTUsIDEuMDAwNjMsIDEuMDAwMDcsIDAuOTk5NDMsIDEuMDAwNiwgMC45OTk0OCwgMS4wMDAyNiwgMC45OTk0OCwgMC45OTk0MywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyOSwgMS4wMDAzOCwgMS4wMDAzNSwgMS4wMDAwMSwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzgsIDEuMDAwMDEsIDEuMDAwNTcsIDAuOTk5ODksIDAuOTk5NjcsIDAuOTk5NjQsIDAuOTk5NjcsIDAuOTk5NzcsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMzgsIDAuOTk5NzcsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwNjYsIDAuOTk5NjcsIDAuOTk5NjcsIDEuMDAwNDEsIDAuOTk5OTgsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDAuOTk5NjcsIDEuMDAwMDEsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NjQsIDEuMDAwMzEsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5OTksIDEsIDEuMDAwMjMsIDEsIDEsIDAuOTk5OTksIDEuMDAwMzUsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5OTksIDEuMDAwNTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NTUsIDAuOTk5NSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAzMiwgMC45OTk4OSwgMS4wMDAzNCwgMC45OTk5OSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45OTk3MywgMC40NTk5OCwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk4MiwgMC45OTk5NCwgMC45OTk5NiwgMSwgMS4wMDA0MiwgMS4wMDA0NCwgMS4wMDAyOSwgMS4wMDAyMywgMC45OTk3MywgMC45OTk3MywgMS4wMDAyNiwgMC45OTk0OSwgMS4wMDAwMiwgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAzMiwgMC45ODY4NSwgMC45OTk3MywgMS4wMDAyNiwgMSwgMSwgMC45OTk2NiwgMS4wMDA0NCwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAwMSwgMC45OTk3MywgMSwgMSwgMC45OTk3MywgMSwgMSwgMC45OTk1NSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTcyLCAxLCAxLCAxLjAwMTA2LCAwLjk5OTk5LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk5LCAwLjk5OTk4LCAxLjY2NDc1LCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAwLjk5OTcxLCAwLjk5OTc4LCAxLCAxLCAwLjk5OTkxLCAwLjk5OTg0LCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDk4LCAxLCAxLCAxLCAxLjAwMDQ5LCAxLCAxLCAwLjk5OTcyLCAxLCAxLjIwOTg1LCAxLjM5NzEzLCAxLjAwMDAzLCAxLjAwMDMxLCAxLjAwMDE1LCAxLCAwLjk5NTYxLCAxLjAwMDI3LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTE1LCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTk5LCAxLjAwMDAzLCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQxMTQ0LCAxLjYsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDA1NzksIDEuNDA1NzksIDEuMzY2MjUsIDAuOTk5OTksIDEsIDAuOTk4NjEsIDAuOTk4NjEsIDEsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDAuOTk5NzIsIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDEuNDA0ODMsIDEsIDAuOTk5NzcsIDEuMDAwNTQsIDEsIDEsIDAuOTk5NTMsIDAuOTk5NjIsIDEuMDAwNDIsIDAuOTk5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IEhlbHZldGljYUJvbGRJdGFsaWNNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMzUsCiAgbGluZUdhcDogMC4yCn07CmNvbnN0IEhlbHZldGljYUl0YWxpY0ZhY3RvcnMgPSBbMC43NjExNiwgMSwgMSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDEuMDAwMDEsIDEuMDAwNDMsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NTksIDEuMDAwMDMsIDEuMDAwNiwgMC45OTk5OCwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMSwgMS4wMDAwMywgMS4wMDAwMywgMS4wMDAwMywgMC45OTk3MywgMC45OTk4NywgMS4wMDAwMSwgMS4wMDAwMSwgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDA2LCAxLCAxLjAwMDAxLCAwLjk5OTczLCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDAxLCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDE2LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTQ5LCAwLjk5OTczLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5MjQsIDAuOTk5MjQsIDEsIDAuOTk5MjQsIDAuOTk5OTksIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5OTgsIDEsIDEuMDAwNiwgMC45OTk3MywgMSwgMC45OTk3NywgMSwgMSwgMSwgMS4wMDAwNSwgMS4wMDA5LCAxLjAwMDA1LCAxLjAwMDAzLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDksIDAuOTk5NzMsIDAuOTk5OTgsIDEuMDAwMjUsIDAuOTk5NjgsIDAuOTk5NzMsIDEuMDAwMDMsIDEuMDAwMjUsIDAuNjAyOTksIDEuMDAwMjQsIDEuMDY0MDksIDEsIDEsIDAuOTk5OTgsIDEsIDAuOTk5OCwgMS4wMDA2LCAwLjk5OTk4LCAxLCAwLjk5OTM2LCAwLjk5OTczLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMDMsIDEuMDAwMjIsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wNjQwOSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMSwgMC45OTk3MywgMSwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMS4wMjg4LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5MjQsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTQ2LCAxLjAwMDM0LCAxLCAwLjk5OTI0LCAxLjAwMDAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAxLjA2MzExLCAwLjk5OTczLCAxLjAwMDI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDQxLCAwLjk5OTgsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMC44OTU0NywgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwNTQsIDAuOTk5NzcsIDEuMDAwODQsIDEuMDAwMDcsIDAuOTk5NzMsIDEuMDAwMTMsIDAuOTk5MjQsIDEuMDAwMDEsIDEuMDAwMDEsIDAuOTk5NDUsIDAuOTEyMjEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwNiwgMS4wMDAwMSwgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk3NywgMC45OTkzMywgMS4wMDAyMiwgMS4wMDA1NCwgMS4wMDAwMSwgMS4wMDA2NSwgMS4wMDAyNiwgMS4wMDAwMSwgMS4wMDAxLCAxLjAwMDAxLCAxLjAwMDUyLCAxLCAxLjAwMDYsIDEuMDAwMDEsIDAuOTk5NDUsIDAuOTk4OTcsIDAuOTk5NjgsIDAuOTk5MjQsIDEuMDAwMzYsIDAuOTk5NDUsIDAuOTk5NDksIDEsIDEuMDAwNiwgMC45OTg5NywgMC45OTkxOCwgMC45OTk2OCwgMC45OTkxMSwgMC45OTkyNCwgMSwgMC45OTk2MiwgMS4wMTQ4NywgMSwgMS4wMDA1LCAwLjk5OTczLCAxLjAwMDEyLCAxLjAwMDQzLCAxLCAwLjk5OTk1LCAwLjk5OTk0LCAxLjAwMDM2LCAwLjk5OTQ3LCAxLjAwMDE5LCAxLjAwMDYzLCAxLjAwMDI1LCAwLjk5OTI0LCAxLjAwMDM2LCAwLjk5OTczLCAxLjAwMDM2LCAxLjAwMDI1LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI3LCAxLjAwMDEsIDEuMDAwNjgsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLCAxLjAwMDA4LCAwLjk5OTU3LCAwLjk5OTcyLCAwLjk5OTQsIDAuOTk5NTQsIDAuOTk5NzUsIDEuMDAwNTEsIDEuMDAwMDEsIDEuMDAwMTksIDEuMDAwMDEsIDEuMDAwMSwgMC45OTk4NiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAzOCwgMC45OTk1NCwgMC45OTk1NCwgMC45OTk0LCAxLjAwMDY2LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDU0LCAxLjAwMDAxLCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc1LCAxLjAwMDEsIDEuMDAwMDEsIDAuOTk5OTMsIDAuOTk5NSwgMC45OTk1NSwgMS4wMDAxNiwgMC45OTk3OCwgMC45OTk3NCwgMS4wMDAxOSwgMS4wMDAyMiwgMC45OTk1NSwgMS4wMDA1MywgMC45OTk3MywgMS4wMDA4OSwgMS4wMDAwNSwgMC45OTk2NywgMS4wMDA0OCwgMC45OTk3MywgMS4wMDAwMiwgMS4wMDAzNCwgMC45OTk3MywgMC45OTk3MywgMC45OTk2NCwgMS4wMDAwNiwgMS4wMDA2NiwgMC45OTk0NywgMC45OTk3MywgMC45ODg5NCwgMC45OTk3MywgMSwgMC40NDg5OCwgMSwgMC45OTk0NiwgMSwgMS4wMDAzOSwgMS4wMDA4MiwgMC45OTk5MSwgMC45OTk5MSwgMC45OTk4NSwgMS4wMDAyMiwgMS4wMDAyMywgMS4wMDA2MSwgMS4wMDAwNiwgMC45OTk2NiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDAxOSwgMS4wMDA4LCAxLCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTgzLCAxLjAwMDQ0LCAwLjk5OTczLCAwLjk5OTY0LCAwLjk4MzMyLCAxLCAwLjk5OTczLCAxLCAxLCAwLjk5OTYyLCAwLjk5ODk1LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLCAxLCAwLjk5OTczLCAxLCAxLCAwLjk5OTU1LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTcyLCAxLCAxLCAxLjAwMjY3LCAwLjk5OTk5LCAwLjk5OTk4LCAwLjk5OTk4LCAxLCAwLjk5OTk4LCAxLjY2NDc1LCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDIzLCAwLjk5OTczLCAxLjAwNDIzLCAwLjk5OTI1LCAwLjk5OTk5LCAxLCAwLjk5OTkxLCAwLjk5OTg0LCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDQ5LCAxLCAxLjAwMjQ1LCAxLCAxLCAxLCAxLCAwLjk2MzI5LCAxLCAxLjIwOTg1LCAxLjM5NzEzLCAxLjAwMDAzLCAwLjgyNTQsIDEuMDAwMTUsIDEsIDEuMDAwMzUsIDEuMDAwMjcsIDEuMDAwMzEsIDEuMDAwMzEsIDEuMDAwMDMsIDEuMDAwMzEsIDEuMDAwMzEsIDAuOTk5OTksIDEuMDAwMDMsIDAuOTk5OTksIDAuOTk5OTksIDEuNDExNDQsIDEuNiwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MDU3OSwgMS40MDU3OSwgMS4zNjYyNSwgMC45OTk5OSwgMSwgMC45OTg2MSwgMC45OTg2MSwgMSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45NTMxNywgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMS40MDQ4MywgMSwgMC45OTk3NywgMS4wMDA1NCwgMSwgMSwgMC45OTk1MywgMC45OTk2MiwgMS4wMDA0MiwgMC45OTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgSGVsdmV0aWNhSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjM1LAogIGxpbmVHYXA6IDAuMgp9Owpjb25zdCBIZWx2ZXRpY2FSZWd1bGFyRmFjdG9ycyA9IFswLjc2MTE2LCAxLCAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMS4wMDAwMSwgMS4wMDA0MywgMC45OTk5OCwgMC45OTk5OCwgMC45OTk1OSwgMS4wMDAwMywgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDAzLCAwLjk5OTczLCAwLjk5OTg3LCAxLjAwMDAxLCAxLjAwMDAxLCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDYsIDEsIDEuMDAwMDEsIDAuOTk5NzMsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMDEsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMTYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NDksIDAuOTk5NzMsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTkyNCwgMC45OTkyNCwgMSwgMC45OTkyNCwgMC45OTk5OSwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk5OCwgMSwgMS4wMDA2LCAwLjk5OTczLCAxLCAwLjk5OTc3LCAxLCAxLCAxLCAxLjAwMDA1LCAxLjAwMDksIDEuMDAwMDUsIDEuMDAwMDMsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwOSwgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNSwgMC45OTk2OCwgMC45OTk3MywgMS4wMDAwMywgMS4wMDAyNSwgMC42MDI5OSwgMS4wMDAyNCwgMS4wNjQwOSwgMSwgMSwgMC45OTk5OCwgMSwgMC45OTk4LCAxLjAwMDYsIDAuOTk5OTgsIDEsIDAuOTk5MzYsIDAuOTk5NzMsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMjYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAwMywgMS4wMDAyMiwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMSwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjA2NDA5LCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAxLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLjA0NTk2LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5MjQsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDE5LCAxLjAwMDM0LCAxLCAwLjk5OTI0LCAxLjAwMDAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAyNTcyLCAwLjk5OTczLCAxLjAwMDA1LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTk5LCAwLjk5OTgsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMC44NDUzMywgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5MjgsIDEsIDAuOTk5NzcsIDEuMDAwMTMsIDEuMDAwNTUsIDAuOTk5NDcsIDAuOTk5NDUsIDAuOTk5NDEsIDAuOTk5MjQsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNCwgMC45MTYyMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDA2LCAxLjAwMDAxLCAxLjAwMDA1LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDE1LCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDI2LCAxLjAwMDAxLCAxLjAwMDE5LCAxLjAwMDAxLCAwLjk5OTQ2LCAxLCAxLjAwMDYsIDEuMDAwMDEsIDAuOTk5NzgsIDEuMDAwNDUsIDAuOTk5NzMsIDAuOTk5MjQsIDEuMDAwMjMsIDAuOTk5NzgsIDAuOTk5NjYsIDEsIDEuMDAwNjUsIDEuMDAwNDUsIDEuMDAwMTksIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5MjQsIDEsIDEsIDAuOTY0OTksIDEsIDEuMDAwNTUsIDAuOTk5NzMsIDEuMDAwMDgsIDEuMDAwMjcsIDEsIDAuOTk5NywgMC45OTk5NSwgMS4wMDAyMywgMC45OTkzMywgMS4wMDAxOSwgMS4wMDAxNSwgMS4wMDAzMSwgMC45OTkyNCwgMS4wMDAyMywgMC45OTk3MywgMS4wMDAyMywgMS4wMDAzMSwgMS4wMDAwMSwgMC45OTkyOCwgMS4wMDAyOSwgMS4wMDA5MiwgMS4wMDAzNSwgMS4wMDAwMSwgMS4wMDA2LCAxLjAwMDYsIDEsIDAuOTk5ODgsIDAuOTk5NzUsIDEsIDEuMDAwODIsIDAuOTk1NjEsIDAuOTk5NiwgMS4wMDAzNSwgMS4wMDAwMSwgMC45OTk2MiwgMS4wMDAwMSwgMS4wMDA5MiwgMC45OTk2NCwgMS4wMDAwMSwgMC45OTk2MywgMC45OTk5OSwgMS4wMDAzNSwgMS4wMDAzNSwgMS4wMDA4MiwgMC45OTk2MiwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAzNSwgMS4wMDAwMSwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk2LCAwLjk5OTY3LCAxLjAwMDAxLCAxLjAwMDM0LCAxLjAwMDc0LCAxLjAwMDU0LCAxLjAwMDUzLCAxLjAwMDYzLCAwLjk5OTcxLCAwLjk5OTYyLCAxLjAwMDM1LCAwLjk5OTc1LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDQzLCAwLjk5OTUzLCAxLjAwMDcsIDAuOTk5MTUsIDAuOTk5NzMsIDEuMDAwMDgsIDAuOTk4OTIsIDEuMDAwNzMsIDEuMDAwNzMsIDEuMDAxMTQsIDAuOTk5MTUsIDEuMDAwNzMsIDAuOTk5NTUsIDAuOTk5NzMsIDEuMDAwOTIsIDAuOTk5NzMsIDEsIDAuOTk5OTgsIDEsIDEuMDAwMywgMSwgMS4wMDA0MywgMS4wMDAwMSwgMC45OTk2OSwgMS4wMDAzLCAxLCAxLjAwMDM1LCAxLjAwMDAxLCAwLjk5OTUsIDEsIDEuMDAwOTIsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNywgMC45OTk1LCAxLCAwLjk5OTI0LCAxLjAwMDYsIDAuOTk5MjQsIDAuOTk5NzIsIDEuMDAwNjIsIDAuOTk5NzMsIDEuMDAxMTQsIDEuMDAwNzMsIDEsIDAuOTk5NTUsIDEsIDEsIDEuMDAwNDcsIDAuOTk5NjgsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMDEsIDEsIDEsIDEsIDAuOTk5NzMsIDEsIDEsIDAuOTk5NTUsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzIsIDEsIDEsIDEuMDAyNjcsIDAuOTk5OTksIDAuOTk5OTgsIDAuOTk5OTgsIDEsIDAuOTk5OTgsIDEuNjY0NzUsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwMjMsIDAuOTk5NzMsIDAuOTk5NzEsIDAuOTk5MjUsIDEuMDAwMjMsIDEsIDAuOTk5OTEsIDAuOTk5ODQsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTYzMjksIDEsIDEuMjA5ODUsIDEuMzk3MTMsIDEuMDAwMDMsIDAuODI1NCwgMS4wMDAxNSwgMSwgMS4wMDAzNSwgMS4wMDAyNywgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTkxNSwgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTk5OSwgMS4wMDAwMywgMC45OTk5OSwgMC45OTk5OSwgMS40MTE0NCwgMS42LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQwNTc5LCAxLjQwNTc5LCAxLjM2NjI1LCAwLjk5OTk5LCAxLCAwLjk5ODYxLCAwLjk5ODYxLCAxLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk1MzE3LCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQwNDgzLCAxLCAwLjk5OTc3LCAxLjAwMDU0LCAxLCAxLCAwLjk5OTUzLCAwLjk5OTYyLCAxLjAwMDQyLCAwLjk5OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBIZWx2ZXRpY2FSZWd1bGFyTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIsCiAgbGluZUdhcDogMC4yCn07Cgo7Ly8gLi9zcmMvY29yZS9saWJlcmF0aW9uc2Fuc193aWR0aHMuanMKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzID0gWzM2NSwgMCwgMzMzLCAyNzgsIDMzMywgNDc0LCA1NTYsIDU1NiwgODg5LCA3MjIsIDIzOCwgMzMzLCAzMzMsIDM4OSwgNTg0LCAyNzgsIDMzMywgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMzMzLCAzMzMsIDU4NCwgNTg0LCA1ODQsIDYxMSwgOTc1LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjExLCA3NzgsIDcyMiwgMjc4LCA1NTYsIDcyMiwgNjExLCA4MzMsIDcyMiwgNzc4LCA2NjcsIDc3OCwgNzIyLCA2NjcsIDYxMSwgNzIyLCA2NjcsIDk0NCwgNjY3LCA2NjcsIDYxMSwgMzMzLCAyNzgsIDMzMywgNTg0LCA1NTYsIDMzMywgNTU2LCA2MTEsIDU1NiwgNjExLCA1NTYsIDMzMywgNjExLCA2MTEsIDI3OCwgMjc4LCA1NTYsIDI3OCwgODg5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDM4OSwgNTU2LCAzMzMsIDYxMSwgNTU2LCA3NzgsIDU1NiwgNTU2LCA1MDAsIDM4OSwgMjgwLCAzODksIDU4NCwgMzMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI4MCwgNTU2LCAzMzMsIDczNywgMzcwLCA1NTYsIDU4NCwgNzM3LCA1NTIsIDQwMCwgNTQ5LCAzMzMsIDMzMywgMzMzLCA1NzYsIDU1NiwgMjc4LCAzMzMsIDMzMywgMzY1LCA1NTYsIDgzNCwgODM0LCA4MzQsIDYxMSwgNzIyLCA3MjIsIDcyMiwgNzIyLCA3MjIsIDcyMiwgMTAwMCwgNzIyLCA2NjcsIDY2NywgNjY3LCA2NjcsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzIyLCA3MjIsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNzc4LCA1ODQsIDc3OCwgNzIyLCA3MjIsIDcyMiwgNzIyLCA2NjcsIDY2NywgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA4ODksIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTQ5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTU2LCA2MTEsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNzE5LCA3MjIsIDYxMSwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDc4NSwgNTU2LCA1NTYsIDI3OCwgNzIyLCA1NTYsIDU1NiwgNjExLCAyNzgsIDYxMSwgMjc4LCA2MTEsIDM4NSwgNjExLCA0NzksIDYxMSwgMjc4LCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MDgsIDcyMywgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCAxMDAwLCA5NDQsIDcyMiwgMzg5LCA3MjIsIDM4OSwgNzIyLCAzODksIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2MTEsIDMzMywgNjExLCA0NzksIDYxMSwgMzMzLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA5NDQsIDc3OCwgNjY3LCA1NTYsIDY2NywgNjExLCA1MDAsIDYxMSwgNTAwLCA2MTEsIDUwMCwgMjc4LCA1NTYsIDcyMiwgNTU2LCAxMDAwLCA4ODksIDc3OCwgNjExLCA2NjcsIDU1NiwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgNDY1LCA3MjIsIDMzMywgODUzLCA5MDYsIDQ3NCwgODI1LCA5MjcsIDgzOCwgMjc4LCA3MjIsIDcyMiwgNjAxLCA3MTksIDY2NywgNjExLCA3MjIsIDc3OCwgMjc4LCA3MjIsIDY2NywgODMzLCA3MjIsIDY0NCwgNzc4LCA3MjIsIDY2NywgNjAwLCA2MTEsIDY2NywgODIxLCA2NjcsIDgwOSwgODAyLCAyNzgsIDY2NywgNjE1LCA0NTEsIDYxMSwgMjc4LCA1ODIsIDYxNSwgNjEwLCA1NTYsIDYwNiwgNDc1LCA0NjAsIDYxMSwgNTQxLCAyNzgsIDU1OCwgNTU2LCA2MTIsIDU1NiwgNDQ1LCA2MTEsIDc2NiwgNjE5LCA1MjAsIDY4NCwgNDQ2LCA1ODIsIDcxNSwgNTc2LCA3NTMsIDg0NSwgMjc4LCA1ODIsIDYxMSwgNTgyLCA4NDUsIDY2NywgNjY5LCA4ODUsIDU2NywgNzExLCA2NjcsIDI3OCwgMjc2LCA1NTYsIDEwOTQsIDEwNjIsIDg3NSwgNjEwLCA3MjIsIDYyMiwgNzE5LCA3MjIsIDcxOSwgNzIyLCA1NjcsIDcxMiwgNjY3LCA5MDQsIDYyNiwgNzE5LCA3MTksIDYxMCwgNzAyLCA4MzMsIDcyMiwgNzc4LCA3MTksIDY2NywgNzIyLCA2MTEsIDYyMiwgODU0LCA2NjcsIDczMCwgNzAzLCAxMDA1LCAxMDE5LCA4NzAsIDk3OSwgNzE5LCA3MTEsIDEwMzEsIDcxOSwgNTU2LCA2MTgsIDYxNSwgNDE3LCA2MzUsIDU1NiwgNzA5LCA0OTcsIDYxNSwgNjE1LCA1MDAsIDYzNSwgNzQwLCA2MDQsIDYxMSwgNjA0LCA2MTEsIDU1NiwgNDkwLCA1NTYsIDg3NSwgNTU2LCA2MTUsIDU4MSwgODMzLCA4NDQsIDcyOSwgODU0LCA2MTUsIDU1MiwgODU0LCA1ODMsIDU1NiwgNTU2LCA2MTEsIDQxNywgNTUyLCA1NTYsIDI3OCwgMjgxLCAyNzgsIDk2OSwgOTA2LCA2MTEsIDUwMCwgNjE1LCA1NTYsIDYwNCwgNzc4LCA2MTEsIDQ4NywgNDQ3LCA5NDQsIDc3OCwgOTQ0LCA3NzgsIDk0NCwgNzc4LCA2NjcsIDU1NiwgMzMzLCAzMzMsIDU1NiwgMTAwMCwgMTAwMCwgNTUyLCAyNzgsIDI3OCwgMjc4LCAyNzgsIDUwMCwgNTAwLCA1MDAsIDU1NiwgNTU2LCAzNTAsIDEwMDAsIDEwMDAsIDI0MCwgNDc5LCAzMzMsIDMzMywgNjA0LCAzMzMsIDE2NywgMzk2LCA1NTYsIDU1NiwgMTA5NCwgNTU2LCA4ODUsIDQ4OSwgMTExNSwgMTAwMCwgNzY4LCA2MDAsIDgzNCwgODM0LCA4MzQsIDgzNCwgMTAwMCwgNTAwLCAxMDAwLCA1MDAsIDEwMDAsIDUwMCwgNTAwLCA0OTQsIDYxMiwgODIzLCA3MTMsIDU4NCwgNTQ5LCA3MTMsIDk3OSwgNzIyLCAyNzQsIDU0OSwgNTQ5LCA1ODMsIDU0OSwgNTQ5LCA2MDQsIDU4NCwgNjA0LCA2MDQsIDcwOCwgNjI1LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MjksIDYwNCwgNjA0LCAzNTQsIDM1NCwgMTAwMCwgOTkwLCA5OTAsIDk5MCwgOTkwLCA0OTQsIDYwNCwgNjA0LCA2MDQsIDYwNCwgMzU0LCAxMDIxLCAxMDUyLCA5MTcsIDc1MCwgNzUwLCA1MzEsIDY1NiwgNTk0LCA1MTAsIDUwMCwgNzUwLCA3NTAsIDYxMSwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMjIyLCAyMjIsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzXTsKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZyA9IFstMSwgLTEsIC0xLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsIDI1OCwgMjU5LCAyNjAsIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsIDI2NywgMjY4LCAyNjksIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LCAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLCAyODEsIDI4MiwgMjgzLCAyODQsIDI4NSwgMjg2LCAyODcsIDI4OCwgMjg5LCAyOTAsIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsIDI5NywgMjk4LCAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgMzA0LCAzMDUsIDMwNiwgMzA3LCAzMDgsIDMwOSwgMzEwLCAzMTEsIDMxMiwgMzEzLCAzMTQsIDMxNSwgMzE2LCAzMTcsIDMxOCwgMzE5LCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAzMjYsIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLCAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLCAzNTMsIDM1NCwgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsIDM2MywgMzY0LCAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLCAzNzEsIDM3MiwgMzczLCAzNzQsIDM3NSwgMzc2LCAzNzcsIDM3OCwgMzc5LCAzODAsIDM4MSwgMzgyLCAzODMsIDQwMiwgNTA2LCA1MDcsIDUwOCwgNTA5LCA1MTAsIDUxMSwgNTM2LCA1MzcsIDUzOCwgNTM5LCA3MTAsIDcxMSwgNzEzLCA3MjgsIDcyOSwgNzMwLCA3MzEsIDczMiwgNzMzLCA5MDAsIDkwMSwgOTAyLCA5MDMsIDkwNCwgOTA1LCA5MDYsIDkwOCwgOTEwLCA5MTEsIDkxMiwgOTEzLCA5MTQsIDkxNSwgOTE2LCA5MTcsIDkxOCwgOTE5LCA5MjAsIDkyMSwgOTIyLCA5MjMsIDkyNCwgOTI1LCA5MjYsIDkyNywgOTI4LCA5MjksIDkzMSwgOTMyLCA5MzMsIDkzNCwgOTM1LCA5MzYsIDkzNywgOTM4LCA5MzksIDk0MCwgOTQxLCA5NDIsIDk0MywgOTQ0LCA5NDUsIDk0NiwgOTQ3LCA5NDgsIDk0OSwgOTUwLCA5NTEsIDk1MiwgOTUzLCA5NTQsIDk1NSwgOTU2LCA5NTcsIDk1OCwgOTU5LCA5NjAsIDk2MSwgOTYyLCA5NjMsIDk2NCwgOTY1LCA5NjYsIDk2NywgOTY4LCA5NjksIDk3MCwgOTcxLCA5NzIsIDk3MywgOTc0LCAxMDI0LCAxMDI1LCAxMDI2LCAxMDI3LCAxMDI4LCAxMDI5LCAxMDMwLCAxMDMxLCAxMDMyLCAxMDMzLCAxMDM0LCAxMDM1LCAxMDM2LCAxMDM3LCAxMDM4LCAxMDM5LCAxMDQwLCAxMDQxLCAxMDQyLCAxMDQzLCAxMDQ0LCAxMDQ1LCAxMDQ2LCAxMDQ3LCAxMDQ4LCAxMDQ5LCAxMDUwLCAxMDUxLCAxMDUyLCAxMDUzLCAxMDU0LCAxMDU1LCAxMDU2LCAxMDU3LCAxMDU4LCAxMDU5LCAxMDYwLCAxMDYxLCAxMDYyLCAxMDYzLCAxMDY0LCAxMDY1LCAxMDY2LCAxMDY3LCAxMDY4LCAxMDY5LCAxMDcwLCAxMDcxLCAxMDcyLCAxMDczLCAxMDc0LCAxMDc1LCAxMDc2LCAxMDc3LCAxMDc4LCAxMDc5LCAxMDgwLCAxMDgxLCAxMDgyLCAxMDgzLCAxMDg0LCAxMDg1LCAxMDg2LCAxMDg3LCAxMDg4LCAxMDg5LCAxMDkwLCAxMDkxLCAxMDkyLCAxMDkzLCAxMDk0LCAxMDk1LCAxMDk2LCAxMDk3LCAxMDk4LCAxMDk5LCAxMTAwLCAxMTAxLCAxMTAyLCAxMTAzLCAxMTA0LCAxMTA1LCAxMTA2LCAxMTA3LCAxMTA4LCAxMTA5LCAxMTEwLCAxMTExLCAxMTEyLCAxMTEzLCAxMTE0LCAxMTE1LCAxMTE2LCAxMTE3LCAxMTE4LCAxMTE5LCAxMTM4LCAxMTM5LCAxMTY4LCAxMTY5LCA3ODA4LCA3ODA5LCA3ODEwLCA3ODExLCA3ODEyLCA3ODEzLCA3OTIyLCA3OTIzLCA4MjA4LCA4MjA5LCA4MjExLCA4MjEyLCA4MjEzLCA4MjE1LCA4MjE2LCA4MjE3LCA4MjE4LCA4MjE5LCA4MjIwLCA4MjIxLCA4MjIyLCA4MjI0LCA4MjI1LCA4MjI2LCA4MjMwLCA4MjQwLCA4MjQyLCA4MjQzLCA4MjQ5LCA4MjUwLCA4MjUyLCA4MjU0LCA4MjYwLCA4MzE5LCA4MzU1LCA4MzU2LCA4MzU5LCA4MzY0LCA4NDUzLCA4NDY3LCA4NDcwLCA4NDgyLCA4NDg2LCA4NDk0LCA4NTM5LCA4NTQwLCA4NTQxLCA4NTQyLCA4NTkyLCA4NTkzLCA4NTk0LCA4NTk1LCA4NTk2LCA4NTk3LCA4NjE2LCA4NzA2LCA4NzEwLCA4NzE5LCA4NzIxLCA4NzIyLCA4NzMwLCA4NzM0LCA4NzM1LCA4NzQ1LCA4NzQ3LCA4Nzc2LCA4ODAwLCA4ODAxLCA4ODA0LCA4ODA1LCA4OTYyLCA4OTc2LCA4OTkyLCA4OTkzLCA5NDcyLCA5NDc0LCA5NDg0LCA5NDg4LCA5NDkyLCA5NDk2LCA5NTAwLCA5NTA4LCA5NTE2LCA5NTI0LCA5NTMyLCA5NTUyLCA5NTUzLCA5NTU0LCA5NTU1LCA5NTU2LCA5NTU3LCA5NTU4LCA5NTU5LCA5NTYwLCA5NTYxLCA5NTYyLCA5NTYzLCA5NTY0LCA5NTY1LCA5NTY2LCA5NTY3LCA5NTY4LCA5NTY5LCA5NTcwLCA5NTcxLCA5NTcyLCA5NTczLCA5NTc0LCA5NTc1LCA5NTc2LCA5NTc3LCA5NTc4LCA5NTc5LCA5NTgwLCA5NjAwLCA5NjA0LCA5NjA4LCA5NjEyLCA5NjE2LCA5NjE3LCA5NjE4LCA5NjE5LCA5NjMyLCA5NjMzLCA5NjQyLCA5NjQzLCA5NjQ0LCA5NjUwLCA5NjU4LCA5NjYwLCA5NjY4LCA5Njc0LCA5Njc1LCA5Njc5LCA5Njg4LCA5Njg5LCA5NzAyLCA5Nzg2LCA5Nzg3LCA5Nzg4LCA5NzkyLCA5Nzk0LCA5ODI0LCA5ODI3LCA5ODI5LCA5ODMwLCA5ODM0LCA5ODM1LCA5ODM2LCA2MTQ0MSwgNjE0NDIsIDYxNDQ1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdOwpjb25zdCBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMgPSBbMzY1LCAwLCAzMzMsIDI3OCwgMzMzLCA0NzQsIDU1NiwgNTU2LCA4ODksIDcyMiwgMjM4LCAzMzMsIDMzMywgMzg5LCA1ODQsIDI3OCwgMzMzLCAyNzgsIDI3OCwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAzMzMsIDMzMywgNTg0LCA1ODQsIDU4NCwgNjExLCA5NzUsIDcyMiwgNzIyLCA3MjIsIDcyMiwgNjY3LCA2MTEsIDc3OCwgNzIyLCAyNzgsIDU1NiwgNzIyLCA2MTEsIDgzMywgNzIyLCA3NzgsIDY2NywgNzc4LCA3MjIsIDY2NywgNjExLCA3MjIsIDY2NywgOTQ0LCA2NjcsIDY2NywgNjExLCAzMzMsIDI3OCwgMzMzLCA1ODQsIDU1NiwgMzMzLCA1NTYsIDYxMSwgNTU2LCA2MTEsIDU1NiwgMzMzLCA2MTEsIDYxMSwgMjc4LCAyNzgsIDU1NiwgMjc4LCA4ODksIDYxMSwgNjExLCA2MTEsIDYxMSwgMzg5LCA1NTYsIDMzMywgNjExLCA1NTYsIDc3OCwgNTU2LCA1NTYsIDUwMCwgMzg5LCAyODAsIDM4OSwgNTg0LCAzMzMsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjgwLCA1NTYsIDMzMywgNzM3LCAzNzAsIDU1NiwgNTg0LCA3MzcsIDU1MiwgNDAwLCA1NDksIDMzMywgMzMzLCAzMzMsIDU3NiwgNTU2LCAyNzgsIDMzMywgMzMzLCAzNjUsIDU1NiwgODM0LCA4MzQsIDgzNCwgNjExLCA3MjIsIDcyMiwgNzIyLCA3MjIsIDcyMiwgNzIyLCAxMDAwLCA3MjIsIDY2NywgNjY3LCA2NjcsIDY2NywgMjc4LCAyNzgsIDI3OCwgMjc4LCA3MjIsIDcyMiwgNzc4LCA3NzgsIDc3OCwgNzc4LCA3NzgsIDU4NCwgNzc4LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjY3LCA2MTEsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDg4OSwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNjExLCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA1NDksIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA1NTYsIDYxMSwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA3NDAsIDcyMiwgNjExLCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzgyLCA1NTYsIDU1NiwgMjc4LCA3MjIsIDU1NiwgNTU2LCA2MTEsIDI3OCwgNjExLCAyNzgsIDYxMSwgMzk2LCA2MTEsIDQ3OSwgNjExLCAyNzgsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcwOCwgNzIzLCA2MTEsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDEwMDAsIDk0NCwgNzIyLCAzODksIDcyMiwgMzg5LCA3MjIsIDM4OSwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDYxMSwgMzMzLCA2MTEsIDQ3OSwgNjExLCAzMzMsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDk0NCwgNzc4LCA2NjcsIDU1NiwgNjY3LCA2MTEsIDUwMCwgNjExLCA1MDAsIDYxMSwgNTAwLCAyNzgsIDU1NiwgNzIyLCA1NTYsIDEwMDAsIDg4OSwgNzc4LCA2MTEsIDY2NywgNTU2LCA2MTEsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDcyMiwgMzMzLCA4NTQsIDkwNiwgNDczLCA4NDQsIDkzMCwgODQ3LCAyNzgsIDcyMiwgNzIyLCA2MTAsIDY3MSwgNjY3LCA2MTEsIDcyMiwgNzc4LCAyNzgsIDcyMiwgNjY3LCA4MzMsIDcyMiwgNjU3LCA3NzgsIDcxOCwgNjY3LCA1OTAsIDYxMSwgNjY3LCA4MjIsIDY2NywgODI5LCA3ODEsIDI3OCwgNjY3LCA2MjAsIDQ3OSwgNjExLCAyNzgsIDU5MSwgNjIwLCA2MjEsIDU1NiwgNjEwLCA0NzksIDQ5MiwgNjExLCA1NTgsIDI3OCwgNTY2LCA1NTYsIDYwMywgNTU2LCA0NTAsIDYxMSwgNzEyLCA2MDUsIDUzMiwgNjY0LCA0MDksIDU5MSwgNzA0LCA1NzgsIDc3MywgODM0LCAyNzgsIDU5MSwgNjExLCA1OTEsIDgzNCwgNjY3LCA2NjcsIDg4NiwgNjE0LCA3MTksIDY2NywgMjc4LCAyNzgsIDU1NiwgMTA5NCwgMTA0MiwgODU0LCA2MjIsIDcxOSwgNjc3LCA3MTksIDcyMiwgNzA4LCA3MjIsIDYxNCwgNzIyLCA2NjcsIDkyNywgNjQzLCA3MTksIDcxOSwgNjE1LCA2ODcsIDgzMywgNzIyLCA3NzgsIDcxOSwgNjY3LCA3MjIsIDYxMSwgNjc3LCA3ODEsIDY2NywgNzI5LCA3MDgsIDk3OSwgOTg5LCA4NTQsIDEwMDAsIDcwOCwgNzE5LCAxMDQyLCA3MjksIDU1NiwgNjE5LCA2MDQsIDUzNCwgNjE4LCA1NTYsIDczNiwgNTEwLCA2MTEsIDYxMSwgNTA3LCA2MjIsIDc0MCwgNjA0LCA2MTEsIDYxMSwgNjExLCA1NTYsIDg4OSwgNTU2LCA4ODUsIDU1NiwgNjQ2LCA1ODMsIDg4OSwgOTM1LCA3MDcsIDg1NCwgNTk0LCA1NTIsIDg2NSwgNTg5LCA1NTYsIDU1NiwgNjExLCA0NjksIDU2MywgNTU2LCAyNzgsIDI3OCwgMjc4LCA5NjksIDkwNiwgNjExLCA1MDcsIDYxOSwgNTU2LCA2MTEsIDc3OCwgNjExLCA1NzUsIDQ2NywgOTQ0LCA3NzgsIDk0NCwgNzc4LCA5NDQsIDc3OCwgNjY3LCA1NTYsIDMzMywgMzMzLCA1NTYsIDEwMDAsIDEwMDAsIDU1MiwgMjc4LCAyNzgsIDI3OCwgMjc4LCA1MDAsIDUwMCwgNTAwLCA1NTYsIDU1NiwgMzUwLCAxMDAwLCAxMDAwLCAyNDAsIDQ3OSwgMzMzLCAzMzMsIDYwNCwgMzMzLCAxNjcsIDM5NiwgNTU2LCA1NTYsIDExMDQsIDU1NiwgODg1LCA1MTYsIDExNDYsIDEwMDAsIDc2OCwgNjAwLCA4MzQsIDgzNCwgODM0LCA4MzQsIDk5OSwgNTAwLCAxMDAwLCA1MDAsIDEwMDAsIDUwMCwgNTAwLCA0OTQsIDYxMiwgODIzLCA3MTMsIDU4NCwgNTQ5LCA3MTMsIDk3OSwgNzIyLCAyNzQsIDU0OSwgNTQ5LCA1ODMsIDU0OSwgNTQ5LCA2MDQsIDU4NCwgNjA0LCA2MDQsIDcwOCwgNjI1LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MjksIDYwNCwgNjA0LCAzNTQsIDM1NCwgMTAwMCwgOTkwLCA5OTAsIDk5MCwgOTkwLCA0OTQsIDYwNCwgNjA0LCA2MDQsIDYwNCwgMzU0LCAxMDIxLCAxMDUyLCA5MTcsIDc1MCwgNzUwLCA1MzEsIDY1NiwgNTk0LCA1MTAsIDUwMCwgNzUwLCA3NTAsIDYxMSwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMjIyLCAyMjIsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzXTsKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZyA9IFstMSwgLTEsIC0xLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsIDI1OCwgMjU5LCAyNjAsIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsIDI2NywgMjY4LCAyNjksIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LCAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLCAyODEsIDI4MiwgMjgzLCAyODQsIDI4NSwgMjg2LCAyODcsIDI4OCwgMjg5LCAyOTAsIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsIDI5NywgMjk4LCAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgMzA0LCAzMDUsIDMwNiwgMzA3LCAzMDgsIDMwOSwgMzEwLCAzMTEsIDMxMiwgMzEzLCAzMTQsIDMxNSwgMzE2LCAzMTcsIDMxOCwgMzE5LCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAzMjYsIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLCAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLCAzNTMsIDM1NCwgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsIDM2MywgMzY0LCAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLCAzNzEsIDM3MiwgMzczLCAzNzQsIDM3NSwgMzc2LCAzNzcsIDM3OCwgMzc5LCAzODAsIDM4MSwgMzgyLCAzODMsIDQwMiwgNTA2LCA1MDcsIDUwOCwgNTA5LCA1MTAsIDUxMSwgNTM2LCA1MzcsIDUzOCwgNTM5LCA3MTAsIDcxMSwgNzEzLCA3MjgsIDcyOSwgNzMwLCA3MzEsIDczMiwgNzMzLCA5MDAsIDkwMSwgOTAyLCA5MDMsIDkwNCwgOTA1LCA5MDYsIDkwOCwgOTEwLCA5MTEsIDkxMiwgOTEzLCA5MTQsIDkxNSwgOTE2LCA5MTcsIDkxOCwgOTE5LCA5MjAsIDkyMSwgOTIyLCA5MjMsIDkyNCwgOTI1LCA5MjYsIDkyNywgOTI4LCA5MjksIDkzMSwgOTMyLCA5MzMsIDkzNCwgOTM1LCA5MzYsIDkzNywgOTM4LCA5MzksIDk0MCwgOTQxLCA5NDIsIDk0MywgOTQ0LCA5NDUsIDk0NiwgOTQ3LCA5NDgsIDk0OSwgOTUwLCA5NTEsIDk1MiwgOTUzLCA5NTQsIDk1NSwgOTU2LCA5NTcsIDk1OCwgOTU5LCA5NjAsIDk2MSwgOTYyLCA5NjMsIDk2NCwgOTY1LCA5NjYsIDk2NywgOTY4LCA5NjksIDk3MCwgOTcxLCA5NzIsIDk3MywgOTc0LCAxMDI0LCAxMDI1LCAxMDI2LCAxMDI3LCAxMDI4LCAxMDI5LCAxMDMwLCAxMDMxLCAxMDMyLCAxMDMzLCAxMDM0LCAxMDM1LCAxMDM2LCAxMDM3LCAxMDM4LCAxMDM5LCAxMDQwLCAxMDQxLCAxMDQyLCAxMDQzLCAxMDQ0LCAxMDQ1LCAxMDQ2LCAxMDQ3LCAxMDQ4LCAxMDQ5LCAxMDUwLCAxMDUxLCAxMDUyLCAxMDUzLCAxMDU0LCAxMDU1LCAxMDU2LCAxMDU3LCAxMDU4LCAxMDU5LCAxMDYwLCAxMDYxLCAxMDYyLCAxMDYzLCAxMDY0LCAxMDY1LCAxMDY2LCAxMDY3LCAxMDY4LCAxMDY5LCAxMDcwLCAxMDcxLCAxMDcyLCAxMDczLCAxMDc0LCAxMDc1LCAxMDc2LCAxMDc3LCAxMDc4LCAxMDc5LCAxMDgwLCAxMDgxLCAxMDgyLCAxMDgzLCAxMDg0LCAxMDg1LCAxMDg2LCAxMDg3LCAxMDg4LCAxMDg5LCAxMDkwLCAxMDkxLCAxMDkyLCAxMDkzLCAxMDk0LCAxMDk1LCAxMDk2LCAxMDk3LCAxMDk4LCAxMDk5LCAxMTAwLCAxMTAxLCAxMTAyLCAxMTAzLCAxMTA0LCAxMTA1LCAxMTA2LCAxMTA3LCAxMTA4LCAxMTA5LCAxMTEwLCAxMTExLCAxMTEyLCAxMTEzLCAxMTE0LCAxMTE1LCAxMTE2LCAxMTE3LCAxMTE4LCAxMTE5LCAxMTM4LCAxMTM5LCAxMTY4LCAxMTY5LCA3ODA4LCA3ODA5LCA3ODEwLCA3ODExLCA3ODEyLCA3ODEzLCA3OTIyLCA3OTIzLCA4MjA4LCA4MjA5LCA4MjExLCA4MjEyLCA4MjEzLCA4MjE1LCA4MjE2LCA4MjE3LCA4MjE4LCA4MjE5LCA4MjIwLCA4MjIxLCA4MjIyLCA4MjI0LCA4MjI1LCA4MjI2LCA4MjMwLCA4MjQwLCA4MjQyLCA4MjQzLCA4MjQ5LCA4MjUwLCA4MjUyLCA4MjU0LCA4MjYwLCA4MzE5LCA4MzU1LCA4MzU2LCA4MzU5LCA4MzY0LCA4NDUzLCA4NDY3LCA4NDcwLCA4NDgyLCA4NDg2LCA4NDk0LCA4NTM5LCA4NTQwLCA4NTQxLCA4NTQyLCA4NTkyLCA4NTkzLCA4NTk0LCA4NTk1LCA4NTk2LCA4NTk3LCA4NjE2LCA4NzA2LCA4NzEwLCA4NzE5LCA4NzIxLCA4NzIyLCA4NzMwLCA4NzM0LCA4NzM1LCA4NzQ1LCA4NzQ3LCA4Nzc2LCA4ODAwLCA4ODAxLCA4ODA0LCA4ODA1LCA4OTYyLCA4OTc2LCA4OTkyLCA4OTkzLCA5NDcyLCA5NDc0LCA5NDg0LCA5NDg4LCA5NDkyLCA5NDk2LCA5NTAwLCA5NTA4LCA5NTE2LCA5NTI0LCA5NTMyLCA5NTUyLCA5NTUzLCA5NTU0LCA5NTU1LCA5NTU2LCA5NTU3LCA5NTU4LCA5NTU5LCA5NTYwLCA5NTYxLCA5NTYyLCA5NTYzLCA5NTY0LCA5NTY1LCA5NTY2LCA5NTY3LCA5NTY4LCA5NTY5LCA5NTcwLCA5NTcxLCA5NTcyLCA5NTczLCA5NTc0LCA5NTc1LCA5NTc2LCA5NTc3LCA5NTc4LCA5NTc5LCA5NTgwLCA5NjAwLCA5NjA0LCA5NjA4LCA5NjEyLCA5NjE2LCA5NjE3LCA5NjE4LCA5NjE5LCA5NjMyLCA5NjMzLCA5NjQyLCA5NjQzLCA5NjQ0LCA5NjUwLCA5NjU4LCA5NjYwLCA5NjY4LCA5Njc0LCA5Njc1LCA5Njc5LCA5Njg4LCA5Njg5LCA5NzAyLCA5Nzg2LCA5Nzg3LCA5Nzg4LCA5NzkyLCA5Nzk0LCA5ODI0LCA5ODI3LCA5ODI5LCA5ODMwLCA5ODM0LCA5ODM1LCA5ODM2LCA2MTQ0MSwgNjE0NDIsIDYxNDQ1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdOwpjb25zdCBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocyA9IFszNjUsIDAsIDMzMywgMjc4LCAyNzgsIDM1NSwgNTU2LCA1NTYsIDg4OSwgNjY3LCAxOTEsIDMzMywgMzMzLCAzODksIDU4NCwgMjc4LCAzMzMsIDI3OCwgMjc4LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI3OCwgMjc4LCA1ODQsIDU4NCwgNTg0LCA1NTYsIDEwMTUsIDY2NywgNjY3LCA3MjIsIDcyMiwgNjY3LCA2MTEsIDc3OCwgNzIyLCAyNzgsIDUwMCwgNjY3LCA1NTYsIDgzMywgNzIyLCA3NzgsIDY2NywgNzc4LCA3MjIsIDY2NywgNjExLCA3MjIsIDY2NywgOTQ0LCA2NjcsIDY2NywgNjExLCAyNzgsIDI3OCwgMjc4LCA0NjksIDU1NiwgMzMzLCA1NTYsIDU1NiwgNTAwLCA1NTYsIDU1NiwgMjc4LCA1NTYsIDU1NiwgMjIyLCAyMjIsIDUwMCwgMjIyLCA4MzMsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMzMzLCA1MDAsIDI3OCwgNTU2LCA1MDAsIDcyMiwgNTAwLCA1MDAsIDUwMCwgMzM0LCAyNjAsIDMzNCwgNTg0LCAzMzMsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjYwLCA1NTYsIDMzMywgNzM3LCAzNzAsIDU1NiwgNTg0LCA3MzcsIDU1MiwgNDAwLCA1NDksIDMzMywgMzMzLCAzMzMsIDU3NiwgNTM3LCAyNzgsIDMzMywgMzMzLCAzNjUsIDU1NiwgODM0LCA4MzQsIDgzNCwgNjExLCA2NjcsIDY2NywgNjY3LCA2NjcsIDY2NywgNjY3LCAxMDAwLCA3MjIsIDY2NywgNjY3LCA2NjcsIDY2NywgMjc4LCAyNzgsIDI3OCwgMjc4LCA3MjIsIDcyMiwgNzc4LCA3NzgsIDc3OCwgNzc4LCA3NzgsIDU4NCwgNzc4LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjY3LCA2MTEsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDg4OSwgNTAwLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NDksIDYxMSwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1MDAsIDU1NiwgNTAwLCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3MjIsIDUwMCwgNzIyLCA1MDAsIDcyMiwgNTAwLCA3MjIsIDUwMCwgNzIyLCA2MjUsIDcyMiwgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjIyLCAyNzgsIDI3OCwgNzMzLCA0NDQsIDUwMCwgMjIyLCA2NjcsIDUwMCwgNTAwLCA1NTYsIDIyMiwgNTU2LCAyMjIsIDU1NiwgMjgxLCA1NTYsIDQwMCwgNTU2LCAyMjIsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDYxNSwgNzIzLCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDEwMDAsIDk0NCwgNzIyLCAzMzMsIDcyMiwgMzMzLCA3MjIsIDMzMywgNjY3LCA1MDAsIDY2NywgNTAwLCA2NjcsIDUwMCwgNjY3LCA1MDAsIDYxMSwgMjc4LCA2MTEsIDM1NCwgNjExLCAyNzgsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDk0NCwgNzIyLCA2NjcsIDUwMCwgNjY3LCA2MTEsIDUwMCwgNjExLCA1MDAsIDYxMSwgNTAwLCAyMjIsIDU1NiwgNjY3LCA1NTYsIDEwMDAsIDg4OSwgNzc4LCA2MTEsIDY2NywgNTAwLCA2MTEsIDI3OCwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDY2NywgMjc4LCA3ODksIDg0NiwgMzg5LCA3OTQsIDg2NSwgNzc1LCAyMjIsIDY2NywgNjY3LCA1NzAsIDY3MSwgNjY3LCA2MTEsIDcyMiwgNzc4LCAyNzgsIDY2NywgNjY3LCA4MzMsIDcyMiwgNjQ4LCA3NzgsIDcyNSwgNjY3LCA2MDAsIDYxMSwgNjY3LCA4MzcsIDY2NywgODMxLCA3NjEsIDI3OCwgNjY3LCA1NzAsIDQzOSwgNTU1LCAyMjIsIDU1MCwgNTcwLCA1NzEsIDUwMCwgNTU2LCA0MzksIDQ2MywgNTU1LCA1NDIsIDIyMiwgNTAwLCA0OTIsIDU0OCwgNTAwLCA0NDcsIDU1NiwgNjcwLCA1NzMsIDQ4NiwgNjAzLCAzNzQsIDU1MCwgNjUyLCA1NDYsIDcyOCwgNzc5LCAyMjIsIDU1MCwgNTU2LCA1NTAsIDc3OSwgNjY3LCA2NjcsIDg0MywgNTQ0LCA3MDgsIDY2NywgMjc4LCAyNzgsIDUwMCwgMTA2NiwgOTgyLCA4NDQsIDU4OSwgNzE1LCA2MzksIDcyNCwgNjY3LCA2NTEsIDY2NywgNTQ0LCA3MDQsIDY2NywgOTE3LCA2MTQsIDcxNSwgNzE1LCA1ODksIDY4NiwgODMzLCA3MjIsIDc3OCwgNzI1LCA2NjcsIDcyMiwgNjExLCA2MzksIDc5NSwgNjY3LCA3MjcsIDY3MywgOTIwLCA5MjMsIDgwNSwgODg2LCA2NTEsIDY5NCwgMTAyMiwgNjgyLCA1NTYsIDU2MiwgNTIyLCA0OTMsIDU1MywgNTU2LCA2ODgsIDQ2NSwgNTU2LCA1NTYsIDQ3MiwgNTY0LCA2ODYsIDU1MCwgNTU2LCA1NTYsIDU1NiwgNTAwLCA4MzMsIDUwMCwgODM1LCA1MDAsIDU3MiwgNTE4LCA4MzAsIDg1MSwgNjIxLCA3MzYsIDUyNiwgNDkyLCA3NTIsIDUzNCwgNTU2LCA1NTYsIDU1NiwgMzc4LCA0OTYsIDUwMCwgMjIyLCAyMjIsIDIyMiwgOTEwLCA4MjgsIDU1NiwgNDcyLCA1NjUsIDUwMCwgNTU2LCA3NzgsIDU1NiwgNDkyLCAzMzksIDk0NCwgNzIyLCA5NDQsIDcyMiwgOTQ0LCA3MjIsIDY2NywgNTAwLCAzMzMsIDMzMywgNTU2LCAxMDAwLCAxMDAwLCA1NTIsIDIyMiwgMjIyLCAyMjIsIDIyMiwgMzMzLCAzMzMsIDMzMywgNTU2LCA1NTYsIDM1MCwgMTAwMCwgMTAwMCwgMTg4LCAzNTQsIDMzMywgMzMzLCA1MDAsIDMzMywgMTY3LCAzNjUsIDU1NiwgNTU2LCAxMDk0LCA1NTYsIDg4NSwgMzIzLCAxMDgzLCAxMDAwLCA3NjgsIDYwMCwgODM0LCA4MzQsIDgzNCwgODM0LCAxMDAwLCA1MDAsIDk5OCwgNTAwLCAxMDAwLCA1MDAsIDUwMCwgNDk0LCA2MTIsIDgyMywgNzEzLCA1ODQsIDU0OSwgNzEzLCA5NzksIDcxOSwgMjc0LCA1NDksIDU0OSwgNTg0LCA1NDksIDU0OSwgNjA0LCA1ODQsIDYwNCwgNjA0LCA3MDgsIDYyNSwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzI5LCA2MDQsIDYwNCwgMzU0LCAzNTQsIDEwMDAsIDk5MCwgOTkwLCA5OTAsIDk5MCwgNDk0LCA2MDQsIDYwNCwgNjA0LCA2MDQsIDM1NCwgMTAyMSwgMTA1MiwgOTE3LCA3NTAsIDc1MCwgNTMxLCA2NTYsIDU5NCwgNTEwLCA1MDAsIDc1MCwgNzUwLCA1MDAsIDUwMCwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDIyMiwgMjIyLCAyOTQsIDI5NCwgMzI0LCAzMjQsIDMxNiwgMzI4LCAzOTgsIDI4NV07CmNvbnN0IExpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZyA9IFstMSwgLTEsIC0xLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsIDE5MiwgMTkzLCAxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLCAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2LCAyNTcsIDI1OCwgMjU5LCAyNjAsIDI2MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsIDI2NywgMjY4LCAyNjksIDI3MCwgMjcxLCAyNzIsIDI3MywgMjc0LCAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLCAyODEsIDI4MiwgMjgzLCAyODQsIDI4NSwgMjg2LCAyODcsIDI4OCwgMjg5LCAyOTAsIDI5MSwgMjkyLCAyOTMsIDI5NCwgMjk1LCAyOTYsIDI5NywgMjk4LCAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgMzA0LCAzMDUsIDMwNiwgMzA3LCAzMDgsIDMwOSwgMzEwLCAzMTEsIDMxMiwgMzEzLCAzMTQsIDMxNSwgMzE2LCAzMTcsIDMxOCwgMzE5LCAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAzMjYsIDMyNywgMzI4LCAzMjksIDMzMCwgMzMxLCAzMzIsIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwgMzQwLCAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLCAzNTMsIDM1NCwgMzU1LCAzNTYsIDM1NywgMzU4LCAzNTksIDM2MCwgMzYxLCAzNjIsIDM2MywgMzY0LCAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLCAzNzEsIDM3MiwgMzczLCAzNzQsIDM3NSwgMzc2LCAzNzcsIDM3OCwgMzc5LCAzODAsIDM4MSwgMzgyLCAzODMsIDQwMiwgNTA2LCA1MDcsIDUwOCwgNTA5LCA1MTAsIDUxMSwgNTM2LCA1MzcsIDUzOCwgNTM5LCA3MTAsIDcxMSwgNzEzLCA3MjgsIDcyOSwgNzMwLCA3MzEsIDczMiwgNzMzLCA5MDAsIDkwMSwgOTAyLCA5MDMsIDkwNCwgOTA1LCA5MDYsIDkwOCwgOTEwLCA5MTEsIDkxMiwgOTEzLCA5MTQsIDkxNSwgOTE2LCA5MTcsIDkxOCwgOTE5LCA5MjAsIDkyMSwgOTIyLCA5MjMsIDkyNCwgOTI1LCA5MjYsIDkyNywgOTI4LCA5MjksIDkzMSwgOTMyLCA5MzMsIDkzNCwgOTM1LCA5MzYsIDkzNywgOTM4LCA5MzksIDk0MCwgOTQxLCA5NDIsIDk0MywgOTQ0LCA5NDUsIDk0NiwgOTQ3LCA5NDgsIDk0OSwgOTUwLCA5NTEsIDk1MiwgOTUzLCA5NTQsIDk1NSwgOTU2LCA5NTcsIDk1OCwgOTU5LCA5NjAsIDk2MSwgOTYyLCA5NjMsIDk2NCwgOTY1LCA5NjYsIDk2NywgOTY4LCA5NjksIDk3MCwgOTcxLCA5NzIsIDk3MywgOTc0LCAxMDI0LCAxMDI1LCAxMDI2LCAxMDI3LCAxMDI4LCAxMDI5LCAxMDMwLCAxMDMxLCAxMDMyLCAxMDMzLCAxMDM0LCAxMDM1LCAxMDM2LCAxMDM3LCAxMDM4LCAxMDM5LCAxMDQwLCAxMDQxLCAxMDQyLCAxMDQzLCAxMDQ0LCAxMDQ1LCAxMDQ2LCAxMDQ3LCAxMDQ4LCAxMDQ5LCAxMDUwLCAxMDUxLCAxMDUyLCAxMDUzLCAxMDU0LCAxMDU1LCAxMDU2LCAxMDU3LCAxMDU4LCAxMDU5LCAxMDYwLCAxMDYxLCAxMDYyLCAxMDYzLCAxMDY0LCAxMDY1LCAxMDY2LCAxMDY3LCAxMDY4LCAxMDY5LCAxMDcwLCAxMDcxLCAxMDcyLCAxMDczLCAxMDc0LCAxMDc1LCAxMDc2LCAxMDc3LCAxMDc4LCAxMDc5LCAxMDgwLCAxMDgxLCAxMDgyLCAxMDgzLCAxMDg0LCAxMDg1LCAxMDg2LCAxMDg3LCAxMDg4LCAxMDg5LCAxMDkwLCAxMDkxLCAxMDkyLCAxMDkzLCAxMDk0LCAxMDk1LCAxMDk2LCAxMDk3LCAxMDk4LCAxMDk5LCAxMTAwLCAxMTAxLCAxMTAyLCAxMTAzLCAxMTA0LCAxMTA1LCAxMTA2LCAxMTA3LCAxMTA4LCAxMTA5LCAxMTEwLCAxMTExLCAxMTEyLCAxMTEzLCAxMTE0LCAxMTE1LCAxMTE2LCAxMTE3LCAxMTE4LCAxMTE5LCAxMTM4LCAxMTM5LCAxMTY4LCAxMTY5LCA3ODA4LCA3ODA5LCA3ODEwLCA3ODExLCA3ODEyLCA3ODEzLCA3OTIyLCA3OTIzLCA4MjA4LCA4MjA5LCA4MjExLCA4MjEyLCA4MjEzLCA4MjE1LCA4MjE2LCA4MjE3LCA4MjE4LCA4MjE5LCA4MjIwLCA4MjIxLCA4MjIyLCA4MjI0LCA4MjI1LCA4MjI2LCA4MjMwLCA4MjQwLCA4MjQyLCA4MjQzLCA4MjQ5LCA4MjUwLCA4MjUyLCA4MjU0LCA4MjYwLCA4MzE5LCA4MzU1LCA4MzU2LCA4MzU5LCA4MzY0LCA4NDUzLCA4NDY3LCA4NDcwLCA4NDgyLCA4NDg2LCA4NDk0LCA4NTM5LCA4NTQwLCA4NTQxLCA4NTQyLCA4NTkyLCA4NTkzLCA4NTk0LCA4NTk1LCA4NTk2LCA4NTk3LCA4NjE2LCA4NzA2LCA4NzEwLCA4NzE5LCA4NzIxLCA4NzIyLCA4NzMwLCA4NzM0LCA4NzM1LCA4NzQ1LCA4NzQ3LCA4Nzc2LCA4ODAwLCA4ODAxLCA4ODA0LCA4ODA1LCA4OTYyLCA4OTc2LCA4OTkyLCA4OTkzLCA5NDcyLCA5NDc0LCA5NDg0LCA5NDg4LCA5NDkyLCA5NDk2LCA5NTAwLCA5NTA4LCA5NTE2LCA5NTI0LCA5NTMyLCA5NTUyLCA5NTUzLCA5NTU0LCA5NTU1LCA5NTU2LCA5NTU3LCA5NTU4LCA5NTU5LCA5NTYwLCA5NTYxLCA5NTYyLCA5NTYzLCA5NTY0LCA5NTY1LCA5NTY2LCA5NTY3LCA5NTY4LCA5NTY5LCA5NTcwLCA5NTcxLCA5NTcyLCA5NTczLCA5NTc0LCA5NTc1LCA5NTc2LCA5NTc3LCA5NTc4LCA5NTc5LCA5NTgwLCA5NjAwLCA5NjA0LCA5NjA4LCA5NjEyLCA5NjE2LCA5NjE3LCA5NjE4LCA5NjE5LCA5NjMyLCA5NjMzLCA5NjQyLCA5NjQzLCA5NjQ0LCA5NjUwLCA5NjU4LCA5NjYwLCA5NjY4LCA5Njc0LCA5Njc1LCA5Njc5LCA5Njg4LCA5Njg5LCA5NzAyLCA5Nzg2LCA5Nzg3LCA5Nzg4LCA5NzkyLCA5Nzk0LCA5ODI0LCA5ODI3LCA5ODI5LCA5ODMwLCA5ODM0LCA5ODM1LCA5ODM2LCA2MTQ0MSwgNjE0NDIsIDYxNDQ1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdOwpjb25zdCBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMgPSBbMzY1LCAwLCAzMzMsIDI3OCwgMjc4LCAzNTUsIDU1NiwgNTU2LCA4ODksIDY2NywgMTkxLCAzMzMsIDMzMywgMzg5LCA1ODQsIDI3OCwgMzMzLCAyNzgsIDI3OCwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgNTg0LCA1ODQsIDU4NCwgNTU2LCAxMDE1LCA2NjcsIDY2NywgNzIyLCA3MjIsIDY2NywgNjExLCA3NzgsIDcyMiwgMjc4LCA1MDAsIDY2NywgNTU2LCA4MzMsIDcyMiwgNzc4LCA2NjcsIDc3OCwgNzIyLCA2NjcsIDYxMSwgNzIyLCA2NjcsIDk0NCwgNjY3LCA2NjcsIDYxMSwgMjc4LCAyNzgsIDI3OCwgNDY5LCA1NTYsIDMzMywgNTU2LCA1NTYsIDUwMCwgNTU2LCA1NTYsIDI3OCwgNTU2LCA1NTYsIDIyMiwgMjIyLCA1MDAsIDIyMiwgODMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDMzMywgNTAwLCAyNzgsIDU1NiwgNTAwLCA3MjIsIDUwMCwgNTAwLCA1MDAsIDMzNCwgMjYwLCAzMzQsIDU4NCwgMzMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI2MCwgNTU2LCAzMzMsIDczNywgMzcwLCA1NTYsIDU4NCwgNzM3LCA1NTIsIDQwMCwgNTQ5LCAzMzMsIDMzMywgMzMzLCA1NzYsIDUzNywgMjc4LCAzMzMsIDMzMywgMzY1LCA1NTYsIDgzNCwgODM0LCA4MzQsIDYxMSwgNjY3LCA2NjcsIDY2NywgNjY3LCA2NjcsIDY2NywgMTAwMCwgNzIyLCA2NjcsIDY2NywgNjY3LCA2NjcsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzIyLCA3MjIsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNzc4LCA1ODQsIDc3OCwgNzIyLCA3MjIsIDcyMiwgNzIyLCA2NjcsIDY2NywgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA4ODksIDUwMCwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTQ5LCA2MTEsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTAwLCA1NTYsIDUwMCwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNzIyLCA1MDAsIDcyMiwgNTAwLCA3MjIsIDUwMCwgNzIyLCA1MDAsIDcyMiwgNjE1LCA3MjIsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDIyMiwgMjc4LCAyNzgsIDczNSwgNDQ0LCA1MDAsIDIyMiwgNjY3LCA1MDAsIDUwMCwgNTU2LCAyMjIsIDU1NiwgMjIyLCA1NTYsIDI5MiwgNTU2LCAzMzQsIDU1NiwgMjIyLCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA2MDQsIDcyMywgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCAxMDAwLCA5NDQsIDcyMiwgMzMzLCA3MjIsIDMzMywgNzIyLCAzMzMsIDY2NywgNTAwLCA2NjcsIDUwMCwgNjY3LCA1MDAsIDY2NywgNTAwLCA2MTEsIDI3OCwgNjExLCAzNzUsIDYxMSwgMjc4LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA5NDQsIDcyMiwgNjY3LCA1MDAsIDY2NywgNjExLCA1MDAsIDYxMSwgNTAwLCA2MTEsIDUwMCwgMjIyLCA1NTYsIDY2NywgNTU2LCAxMDAwLCA4ODksIDc3OCwgNjExLCA2NjcsIDUwMCwgNjExLCAyNzgsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCA2NjcsIDI3OCwgNzg0LCA4MzgsIDM4NCwgNzc0LCA4NTUsIDc1MiwgMjIyLCA2NjcsIDY2NywgNTUxLCA2NjgsIDY2NywgNjExLCA3MjIsIDc3OCwgMjc4LCA2NjcsIDY2OCwgODMzLCA3MjIsIDY1MCwgNzc4LCA3MjIsIDY2NywgNjE4LCA2MTEsIDY2NywgNzk4LCA2NjcsIDgzNSwgNzQ4LCAyNzgsIDY2NywgNTc4LCA0NDYsIDU1NiwgMjIyLCA1NDcsIDU3OCwgNTc1LCA1MDAsIDU1NywgNDQ2LCA0NDEsIDU1NiwgNTU2LCAyMjIsIDUwMCwgNTAwLCA1NzYsIDUwMCwgNDQ4LCA1NTYsIDY5MCwgNTY5LCA0ODIsIDYxNywgMzk1LCA1NDcsIDY0OCwgNTI1LCA3MTMsIDc4MSwgMjIyLCA1NDcsIDU1NiwgNTQ3LCA3ODEsIDY2NywgNjY3LCA4NjUsIDU0MiwgNzE5LCA2NjcsIDI3OCwgMjc4LCA1MDAsIDEwNTcsIDEwMTAsIDg1NCwgNTgzLCA3MjIsIDYzNSwgNzE5LCA2NjcsIDY1NiwgNjY3LCA1NDIsIDY3NywgNjY3LCA5MjMsIDYwNCwgNzE5LCA3MTksIDU4MywgNjU2LCA4MzMsIDcyMiwgNzc4LCA3MTksIDY2NywgNzIyLCA2MTEsIDYzNSwgNzYwLCA2NjcsIDc0MCwgNjY3LCA5MTcsIDkzOCwgNzkyLCA4ODUsIDY1NiwgNzE5LCAxMDEwLCA3MjIsIDU1NiwgNTczLCA1MzEsIDM2NSwgNTgzLCA1NTYsIDY2OSwgNDU4LCA1NTksIDU1OSwgNDM4LCA1ODMsIDY4OCwgNTUyLCA1NTYsIDU0MiwgNTU2LCA1MDAsIDQ1OCwgNTAwLCA4MjMsIDUwMCwgNTczLCA1MjEsIDgwMiwgODIzLCA2MjUsIDcxOSwgNTIxLCA1MTAsIDc1MCwgNTQyLCA1NTYsIDU1NiwgNTU2LCAzNjUsIDUxMCwgNTAwLCAyMjIsIDI3OCwgMjIyLCA5MDYsIDgxMiwgNTU2LCA0MzgsIDU1OSwgNTAwLCA1NTIsIDc3OCwgNTU2LCA0ODksIDQxMSwgOTQ0LCA3MjIsIDk0NCwgNzIyLCA5NDQsIDcyMiwgNjY3LCA1MDAsIDMzMywgMzMzLCA1NTYsIDEwMDAsIDEwMDAsIDU1MiwgMjIyLCAyMjIsIDIyMiwgMjIyLCAzMzMsIDMzMywgMzMzLCA1NTYsIDU1NiwgMzUwLCAxMDAwLCAxMDAwLCAxODgsIDM1NCwgMzMzLCAzMzMsIDUwMCwgMzMzLCAxNjcsIDM2NSwgNTU2LCA1NTYsIDEwOTQsIDU1NiwgODg1LCAzMjMsIDEwNzMsIDEwMDAsIDc2OCwgNjAwLCA4MzQsIDgzNCwgODM0LCA4MzQsIDEwMDAsIDUwMCwgMTAwMCwgNTAwLCAxMDAwLCA1MDAsIDUwMCwgNDk0LCA2MTIsIDgyMywgNzEzLCA1ODQsIDU0OSwgNzEzLCA5NzksIDcxOSwgMjc0LCA1NDksIDU0OSwgNTgzLCA1NDksIDU0OSwgNjA0LCA1ODQsIDYwNCwgNjA0LCA3MDgsIDYyNSwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzI5LCA2MDQsIDYwNCwgMzU0LCAzNTQsIDEwMDAsIDk5MCwgOTkwLCA5OTAsIDk5MCwgNDk0LCA2MDQsIDYwNCwgNjA0LCA2MDQsIDM1NCwgMTAyMSwgMTA1MiwgOTE3LCA3NTAsIDc1MCwgNTMxLCA2NTYsIDU5NCwgNTEwLCA1MDAsIDc1MCwgNzUwLCA1MDAsIDUwMCwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDIyMiwgMjIyLCAyOTQsIDI5NCwgMzI0LCAzMjQsIDMxNiwgMzI4LCAzOTgsIDI4NV07CmNvbnN0IExpYmVyYXRpb25TYW5zUmVndWxhck1hcHBpbmcgPSBbLTEsIC0xLCAtMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LCAyNTgsIDI1OSwgMjYwLCAyNjEsIDI2MiwgMjYzLCAyNjQsIDI2NSwgMjY2LCAyNjcsIDI2OCwgMjY5LCAyNzAsIDI3MSwgMjcyLCAyNzMsIDI3NCwgMjc1LCAyNzYsIDI3NywgMjc4LCAyNzksIDI4MCwgMjgxLCAyODIsIDI4MywgMjg0LCAyODUsIDI4NiwgMjg3LCAyODgsIDI4OSwgMjkwLCAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LCAyOTcsIDI5OCwgMjk5LCAzMDAsIDMwMSwgMzAyLCAzMDMsIDMwNCwgMzA1LCAzMDYsIDMwNywgMzA4LCAzMDksIDMxMCwgMzExLCAzMTIsIDMxMywgMzE0LCAzMTUsIDMxNiwgMzE3LCAzMTgsIDMxOSwgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgMzI2LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwgMzMyLCAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NiwgMzQ3LCAzNDgsIDM0OSwgMzUwLCAzNTEsIDM1MiwgMzUzLCAzNTQsIDM1NSwgMzU2LCAzNTcsIDM1OCwgMzU5LCAzNjAsIDM2MSwgMzYyLCAzNjMsIDM2NCwgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwgMzcxLCAzNzIsIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgsIDM3OSwgMzgwLCAzODEsIDM4MiwgMzgzLCA0MDIsIDUwNiwgNTA3LCA1MDgsIDUwOSwgNTEwLCA1MTEsIDUzNiwgNTM3LCA1MzgsIDUzOSwgNzEwLCA3MTEsIDcxMywgNzI4LCA3MjksIDczMCwgNzMxLCA3MzIsIDczMywgOTAwLCA5MDEsIDkwMiwgOTAzLCA5MDQsIDkwNSwgOTA2LCA5MDgsIDkxMCwgOTExLCA5MTIsIDkxMywgOTE0LCA5MTUsIDkxNiwgOTE3LCA5MTgsIDkxOSwgOTIwLCA5MjEsIDkyMiwgOTIzLCA5MjQsIDkyNSwgOTI2LCA5MjcsIDkyOCwgOTI5LCA5MzEsIDkzMiwgOTMzLCA5MzQsIDkzNSwgOTM2LCA5MzcsIDkzOCwgOTM5LCA5NDAsIDk0MSwgOTQyLCA5NDMsIDk0NCwgOTQ1LCA5NDYsIDk0NywgOTQ4LCA5NDksIDk1MCwgOTUxLCA5NTIsIDk1MywgOTU0LCA5NTUsIDk1NiwgOTU3LCA5NTgsIDk1OSwgOTYwLCA5NjEsIDk2MiwgOTYzLCA5NjQsIDk2NSwgOTY2LCA5NjcsIDk2OCwgOTY5LCA5NzAsIDk3MSwgOTcyLCA5NzMsIDk3NCwgMTAyNCwgMTAyNSwgMTAyNiwgMTAyNywgMTAyOCwgMTAyOSwgMTAzMCwgMTAzMSwgMTAzMiwgMTAzMywgMTAzNCwgMTAzNSwgMTAzNiwgMTAzNywgMTAzOCwgMTAzOSwgMTA0MCwgMTA0MSwgMTA0MiwgMTA0MywgMTA0NCwgMTA0NSwgMTA0NiwgMTA0NywgMTA0OCwgMTA0OSwgMTA1MCwgMTA1MSwgMTA1MiwgMTA1MywgMTA1NCwgMTA1NSwgMTA1NiwgMTA1NywgMTA1OCwgMTA1OSwgMTA2MCwgMTA2MSwgMTA2MiwgMTA2MywgMTA2NCwgMTA2NSwgMTA2NiwgMTA2NywgMTA2OCwgMTA2OSwgMTA3MCwgMTA3MSwgMTA3MiwgMTA3MywgMTA3NCwgMTA3NSwgMTA3NiwgMTA3NywgMTA3OCwgMTA3OSwgMTA4MCwgMTA4MSwgMTA4MiwgMTA4MywgMTA4NCwgMTA4NSwgMTA4NiwgMTA4NywgMTA4OCwgMTA4OSwgMTA5MCwgMTA5MSwgMTA5MiwgMTA5MywgMTA5NCwgMTA5NSwgMTA5NiwgMTA5NywgMTA5OCwgMTA5OSwgMTEwMCwgMTEwMSwgMTEwMiwgMTEwMywgMTEwNCwgMTEwNSwgMTEwNiwgMTEwNywgMTEwOCwgMTEwOSwgMTExMCwgMTExMSwgMTExMiwgMTExMywgMTExNCwgMTExNSwgMTExNiwgMTExNywgMTExOCwgMTExOSwgMTEzOCwgMTEzOSwgMTE2OCwgMTE2OSwgNzgwOCwgNzgwOSwgNzgxMCwgNzgxMSwgNzgxMiwgNzgxMywgNzkyMiwgNzkyMywgODIwOCwgODIwOSwgODIxMSwgODIxMiwgODIxMywgODIxNSwgODIxNiwgODIxNywgODIxOCwgODIxOSwgODIyMCwgODIyMSwgODIyMiwgODIyNCwgODIyNSwgODIyNiwgODIzMCwgODI0MCwgODI0MiwgODI0MywgODI0OSwgODI1MCwgODI1MiwgODI1NCwgODI2MCwgODMxOSwgODM1NSwgODM1NiwgODM1OSwgODM2NCwgODQ1MywgODQ2NywgODQ3MCwgODQ4MiwgODQ4NiwgODQ5NCwgODUzOSwgODU0MCwgODU0MSwgODU0MiwgODU5MiwgODU5MywgODU5NCwgODU5NSwgODU5NiwgODU5NywgODYxNiwgODcwNiwgODcxMCwgODcxOSwgODcyMSwgODcyMiwgODczMCwgODczNCwgODczNSwgODc0NSwgODc0NywgODc3NiwgODgwMCwgODgwMSwgODgwNCwgODgwNSwgODk2MiwgODk3NiwgODk5MiwgODk5MywgOTQ3MiwgOTQ3NCwgOTQ4NCwgOTQ4OCwgOTQ5MiwgOTQ5NiwgOTUwMCwgOTUwOCwgOTUxNiwgOTUyNCwgOTUzMiwgOTU1MiwgOTU1MywgOTU1NCwgOTU1NSwgOTU1NiwgOTU1NywgOTU1OCwgOTU1OSwgOTU2MCwgOTU2MSwgOTU2MiwgOTU2MywgOTU2NCwgOTU2NSwgOTU2NiwgOTU2NywgOTU2OCwgOTU2OSwgOTU3MCwgOTU3MSwgOTU3MiwgOTU3MywgOTU3NCwgOTU3NSwgOTU3NiwgOTU3NywgOTU3OCwgOTU3OSwgOTU4MCwgOTYwMCwgOTYwNCwgOTYwOCwgOTYxMiwgOTYxNiwgOTYxNywgOTYxOCwgOTYxOSwgOTYzMiwgOTYzMywgOTY0MiwgOTY0MywgOTY0NCwgOTY1MCwgOTY1OCwgOTY2MCwgOTY2OCwgOTY3NCwgOTY3NSwgOTY3OSwgOTY4OCwgOTY4OSwgOTcwMiwgOTc4NiwgOTc4NywgOTc4OCwgOTc5MiwgOTc5NCwgOTgyNCwgOTgyNywgOTgyOSwgOTgzMCwgOTgzNCwgOTgzNSwgOTgzNiwgNjE0NDEsIDYxNDQyLCA2MTQ0NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xXTsKCjsvLyAuL3NyYy9jb3JlL215cmlhZHByb19mYWN0b3JzLmpzCmNvbnN0IE15cmlhZFByb0JvbGRGYWN0b3JzID0gWzEuMzY4OTgsIDEsIDEsIDAuNzI3MDYsIDAuODA0NzksIDAuODM3MzQsIDAuOTg4OTQsIDAuOTk3OTMsIDAuOTg5NywgMC45Mzg4NCwgMC44NjIwOSwgMC45NDI5MiwgMC45NDI5MiwgMS4xNjY2MSwgMS4wMjA1OCwgMC45MzU4MiwgMC45NjY5NCwgMC45MzU4MiwgMS4xOTEzNywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC43ODA3NiwgMC43ODA3NiwgMS4wMjA1OCwgMS4wMjA1OCwgMS4wMjA1OCwgMC43Mjg1MSwgMC43ODk2NiwgMC45MDgzOCwgMC44MzYzNywgMC44MjM5MSwgMC45NjM3NiwgMC44MDA2MSwgMC44NjI3NSwgMC44NzY4LCAwLjk1NDA3LCAxLjAyNTgsIDAuNzM5MDEsIDAuODUwMjIsIDAuODM2NTUsIDEuMDE1NiwgMC45NTU0NiwgMC45MjE3OSwgMC44NzEwNywgMC45MjE3OSwgMC44MjExNCwgMC44MDk2LCAwLjg5NzEzLCAwLjk0NDM4LCAwLjk1MzUzLCAwLjk0MDgzLCAwLjkxOTA1LCAwLjkwNDA2LCAwLjk0NDYsIDAuOTQyOTIsIDEuMTg3NzcsIDAuOTQyOTIsIDEuMDIwNTgsIDAuODk5MDMsIDAuOTAwODgsIDAuOTQ5MzgsIDAuOTc4OTgsIDAuODEwOTMsIDAuOTc1NzEsIDAuOTQ5MzgsIDEuMDI0LCAwLjk1NzcsIDAuOTU5MzMsIDAuOTg2MjEsIDEuMDQ3NCwgMC45NzQ1NSwgMC45ODk4MSwgMC45NjcyLCAwLjk1OTMzLCAwLjk0NDYsIDAuOTc4OTgsIDAuOTc0MDcsIDAuOTc2NDYsIDAuNzgwMzYsIDEuMTAyMDgsIDAuOTU0NDIsIDAuOTUyOTgsIDAuOTc1NzksIDAuOTMzMiwgMC45NDAzOSwgMC45MzgsIDAuODA2ODcsIDEuMDExNDksIDAuODA2ODcsIDEuMDIwNTgsIDAuODA0NzksIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDEuMDExNDksIDEuMDA4NzIsIDAuOTAwODgsIDAuOTE4ODIsIDEuMDIxMywgMC44MzYxLCAxLjAyMDU4LCAwLjYyMjk1LCAwLjU0MzI0LCAwLjg5MDIyLCAxLjA4NTk1LCAxLCAxLCAwLjkwMDg4LCAxLCAwLjk3NDU1LCAwLjkzNTgyLCAwLjkwMDg4LCAxLCAxLjA1Njg2LCAwLjgzNjEsIDAuOTk2NDIsIDAuOTk2NDIsIDAuOTk2NDIsIDAuNzI4NTEsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuODY4LCAwLjgyMzkxLCAwLjgwMDYxLCAwLjgwMDYxLCAwLjgwMDYxLCAwLjgwMDYxLCAxLjAyNTgsIDEuMDI1OCwgMS4wMjU4LCAxLjAyNTgsIDAuOTc0ODQsIDAuOTU1NDYsIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDEuMDIwNTgsIDAuOTIxNzksIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTA0MDYsIDAuODY5NTgsIDAuOTgyMjUsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTAzMSwgMC44MTA5MywgMC45NDkzOCwgMC45NDkzOCwgMC45NDkzOCwgMC45NDkzOCwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45Mzk2OSwgMC45NTkzMywgMC45NDQ2LCAwLjk0NDYsIDAuOTQ0NiwgMC45NDQ2LCAwLjk0NDYsIDEuMDg1OTUsIDAuOTQ0NiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NDAzOSwgMC45Nzg5OCwgMC45NDAzOSwgMC45MDgzOCwgMC45NDkzOCwgMC45MDgzOCwgMC45NDkzOCwgMC45MDgzOCwgMC45NDkzOCwgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC45NjM3NiwgMC44NDMxMywgMC45NzQ4NCwgMC45NzU3MSwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44NzY4LCAwLjk1NzcsIDAuODc2OCwgMC45NTc3LCAwLjg3NjgsIDAuOTU3NywgMSwgMSwgMC45NTQwNywgMC45NTkzMywgMC45NzA2OSwgMC45NTkzMywgMS4wMjU4LCAwLjk4NjIxLCAxLjAyNTgsIDAuOTg2MjEsIDEuMDI1OCwgMC45ODYyMSwgMS4wMjU4LCAwLjk4NjIxLCAxLjAyNTgsIDAuOTg2MjEsIDAuODg3LCAxLjAxNTkxLCAwLjczOTAxLCAxLjA0NzQsIDEsIDEsIDAuOTc0NTUsIDAuODM2NTUsIDAuOTg5ODEsIDEsIDEsIDAuODM2NTUsIDAuNzM5NzcsIDAuODM2NTUsIDAuNzM5MDMsIDAuODQ2MzgsIDEuMDMzLCAwLjk1NTQ2LCAwLjk1OTMzLCAxLCAxLCAwLjk1NTQ2LCAwLjk1OTMzLCAwLjgyNzEsIDAuOTU0MTcsIDAuOTU5MzMsIDAuOTIxNzksIDAuOTQ0NiwgMC45MjE3OSwgMC45NDQ2LCAwLjkyMTc5LCAwLjk0NDYsIDAuOTM2LCAwLjkxOTY0LCAwLjgyMTE0LCAwLjk3NjQ2LCAxLCAxLCAwLjgyMTE0LCAwLjk3NjQ2LCAwLjgwOTYsIDAuNzgwMzYsIDAuODA5NiwgMC43ODAzNiwgMSwgMSwgMC44MDk2LCAwLjc4MDM2LCAxLCAxLCAwLjg5NzEzLCAwLjc3NDUyLCAwLjg5NzEzLCAxLjEwMjA4LCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0MDgzLCAwLjk3NTc5LCAwLjkwNDA2LCAwLjk0MDM5LCAwLjkwNDA2LCAwLjk0NDYsIDAuOTM4LCAwLjk0NDYsIDAuOTM4LCAwLjk0NDYsIDAuOTM4LCAxLCAwLjk5NzkzLCAwLjkwODM4LCAwLjk0OTM4LCAwLjg2OCwgMC45MDMxLCAwLjkyMTc5LCAwLjk0NDYsIDEsIDEsIDAuODk3MTMsIDEuMTAyMDgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTA5ODksIDAuOTM1OCwgMC45MTk0NSwgMC44MzE4MSwgMC43NTI2MSwgMC44Nzk5MiwgMC44Mjk3NiwgMC45NjAzNCwgMC44MzY4OSwgMC45NzI2OCwgMS4wMDc4LCAwLjkwODM4LCAwLjgzNjM3LCAwLjgwMTksIDAuOTAxNTcsIDAuODAwNjEsIDAuOTQ0NiwgMC45NTQwNywgMC45MjQzNiwgMS4wMjU4LCAwLjg1MDIyLCAwLjk3MTUzLCAxLjAxNTYsIDAuOTU1NDYsIDAuODkxOTIsIDAuOTIxNzksIDAuOTIzNjEsIDAuODcxMDcsIDAuOTYzMTgsIDAuODk3MTMsIDAuOTM3MDQsIDAuOTU2MzgsIDAuOTE5MDUsIDAuOTE3MDksIDAuOTI3OTYsIDEuMDI1OCwgMC45MzcwNCwgMC45NDgzNiwgMS4wMzczLCAwLjk1OTMzLCAxLjAwNzgsIDAuOTU4NzEsIDAuOTQ4MzYsIDAuOTYxNzQsIDAuOTI2MDEsIDAuOTQ5OCwgMC45ODYwNywgMC45NTc3NiwgMC45NTkzMywgMS4wNTQ1MywgMS4wMDc4LCAwLjk4Mjc1LCAwLjkzMTQsIDAuOTU2MTcsIDAuOTE3MDEsIDEuMDU5OTMsIDAuOTQ0NiwgMC43ODM2NywgMC45NTUzLCAxLCAwLjg2ODMyLCAxLjAxMjgsIDAuOTU4NzEsIDAuOTkzOTQsIDAuODc1NDgsIDAuOTYzNjEsIDAuODY3NzQsIDEuMDA3OCwgMC45NTg3MSwgMC45NDQ2LCAwLjk1ODcxLCAwLjg2Nzc0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk0MDgzLCAwLjk3NTc5LCAwLjk0MDgzLCAwLjk3NTc5LCAwLjk0MDgzLCAwLjk3NTc5LCAwLjkwNDA2LCAwLjk0MDM5LCAwLjk2Njk0LCAxLCAwLjg5OTAzLCAxLCAxLCAxLCAwLjkzNTgyLCAwLjkzNTgyLCAwLjkzNTgyLCAxLCAwLjkwOCwgMC45MDgsIDAuOTE4LCAwLjk0MjE5LCAwLjk0MjE5LCAwLjk2NTQ0LCAxLCAxLjI4NSwgMSwgMSwgMC44MTA3OSwgMC44MTA3OSwgMSwgMSwgMC43NDg1NCwgMSwgMSwgMSwgMSwgMC45OTc5MywgMSwgMSwgMSwgMC42NSwgMSwgMS4zNjE0NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4xNzE3MywgMSwgMC44MDUzNSwgMC43NjE2OSwgMS4wMjA1OCwgMS4wNzMyLCAxLjA1NDg2LCAxLCAxLCAxLjMwNjkyLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjE2MTYxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgTXlyaWFkUHJvQm9sZE1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yLAogIGxpbmVHYXA6IDAuMgp9Owpjb25zdCBNeXJpYWRQcm9Cb2xkSXRhbGljRmFjdG9ycyA9IFsxLjM2ODk4LCAxLCAxLCAwLjY2MjI3LCAwLjgwNzc5LCAwLjgxNjI1LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3NzMzLCAwLjkyMjIyLCAwLjgzMjY2LCAwLjk0MjkyLCAwLjk0MjkyLCAxLjE2MTQ4LCAxLjAyMDU4LCAwLjkzNTgyLCAwLjk2Njk0LCAwLjkzNTgyLCAxLjE3MzM3LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjc4MDc2LCAwLjc4MDc2LCAxLjAyMDU4LCAxLjAyMDU4LCAxLjAyMDU4LCAwLjcxNTQxLCAwLjc2ODEzLCAwLjg1NTc2LCAwLjgwNTkxLCAwLjgwNzI5LCAwLjk0Mjk5LCAwLjc3NTEyLCAwLjgzNjU1LCAwLjg2NTIzLCAwLjkyMjIyLCAwLjk4NjIxLCAwLjcxNzQzLCAwLjgxNjk4LCAwLjc5NzI2LCAwLjk4NTU4LCAwLjkyMjIyLCAwLjkwNjM3LCAwLjgzODA5LCAwLjkwNjM3LCAwLjgwNzI5LCAwLjc2NDYzLCAwLjg2Mjc1LCAwLjkwNjk5LCAwLjkxNjA1LCAwLjkxNTQsIDAuODUzMDgsIDAuODU0NTgsIDAuOTA1MzEsIDAuOTQyOTIsIDEuMjEyOTYsIDAuOTQyOTIsIDEuMDIwNTgsIDAuODk5MDMsIDEuMTg2MTYsIDAuOTk2MTMsIDAuOTE2NzcsIDAuNzgyMTYsIDAuOTE2NzcsIDAuOTAwODMsIDAuOTg3OTYsIDAuOTEzNSwgMC45MjE2OCwgMC45NTM4MSwgMC45ODk4MSwgMC45NTI5OCwgMC45NTM4MSwgMC45MzQ1OSwgMC45MjE2OCwgMC45MTUxMywgMC45MjAwNCwgMC45MTY3NywgMC45NTA3NywgMC43NDgsIDEuMDQ1MDIsIDAuOTE2NzcsIDAuOTIwNjEsIDAuOTQyMzYsIDAuODk1NDQsIDAuODkzNjQsIDAuOSwgMC44MDY4NywgMC44NTc4LCAwLjgwNjg3LCAxLjAyMDU4LCAwLjgwNzc5LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjk3Mjc2LCAwLjg1NzgsIDAuOTk5NzMsIDEuMTg2MTYsIDAuOTEzMzksIDEuMDgwNzQsIDAuODI4OTEsIDEuMDIwNTgsIDAuNTU1MDksIDAuNzE1MjYsIDAuODkwMjIsIDEuMDg1OTUsIDEsIDEsIDEuMTg2MTYsIDEsIDAuOTY3MzYsIDAuOTM1ODIsIDEuMTg2MTYsIDEsIDEuMDQ4NjQsIDAuODI3MTEsIDAuOTkwNDMsIDAuOTkwNDMsIDAuOTkwNDMsIDAuNzE1NDEsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODU1NzYsIDAuODQ1LCAwLjgwNzI5LCAwLjc3NTEyLCAwLjc3NTEyLCAwLjc3NTEyLCAwLjc3NTEyLCAwLjk4NjIxLCAwLjk4NjIxLCAwLjk4NjIxLCAwLjk4NjIxLCAwLjk1OTYxLCAwLjkyMjIyLCAwLjkwNjM3LCAwLjkwNjM3LCAwLjkwNjM3LCAwLjkwNjM3LCAwLjkwNjM3LCAxLjAyMDU4LCAwLjkwMjUxLCAwLjkwNjk5LCAwLjkwNjk5LCAwLjkwNjk5LCAwLjkwNjk5LCAwLjg1NDU4LCAwLjgzNjU5LCAwLjk0OTUxLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjk5NjEzLCAwLjg1ODExLCAwLjc4MjE2LCAwLjkwMDgzLCAwLjkwMDgzLCAwLjkwMDgzLCAwLjkwMDgzLCAwLjk1MzgxLCAwLjk1MzgxLCAwLjk1MzgxLCAwLjk1MzgxLCAwLjkxMzUsIDAuOTIxNjgsIDAuOTE1MTMsIDAuOTE1MTMsIDAuOTE1MTMsIDAuOTE1MTMsIDAuOTE1MTMsIDEuMDg1OTUsIDAuOTE2NzcsIDAuOTE2NzcsIDAuOTE2NzcsIDAuOTE2NzcsIDAuOTE2NzcsIDAuODkzNjQsIDAuOTIzMzIsIDAuODkzNjQsIDAuODU1NzYsIDAuOTk2MTMsIDAuODU1NzYsIDAuOTk2MTMsIDAuODU1NzYsIDAuOTk2MTMsIDAuODA3MjksIDAuNzgyMTYsIDAuODA3MjksIDAuNzgyMTYsIDAuODA3MjksIDAuNzgyMTYsIDAuODA3MjksIDAuNzgyMTYsIDAuOTQyOTksIDAuNzY3ODMsIDAuOTU5NjEsIDAuOTE2NzcsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuNzc1MTIsIDAuOTAwODMsIDAuODY1MjMsIDAuOTEzNSwgMC44NjUyMywgMC45MTM1LCAwLjg2NTIzLCAwLjkxMzUsIDEsIDEsIDAuOTIyMjIsIDAuOTIxNjgsIDAuOTIyMjIsIDAuOTIxNjgsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuOTg2MjEsIDAuOTUzODEsIDAuODYwMzYsIDAuOTcwOTYsIDAuNzE3NDMsIDAuOTg5ODEsIDEsIDEsIDAuOTUyOTgsIDAuNzk3MjYsIDAuOTUzODEsIDEsIDEsIDAuNzk3MjYsIDAuNjg5NCwgMC43OTcyNiwgMC43NDMyMSwgMC44MTY5MSwgMS4wMDA2LCAwLjkyMjIyLCAwLjkyMTY4LCAxLCAxLCAwLjkyMjIyLCAwLjkyMTY4LCAwLjc5NDY0LCAwLjkyMDk4LCAwLjkyMTY4LCAwLjkwNjM3LCAwLjkxNTEzLCAwLjkwNjM3LCAwLjkxNTEzLCAwLjkwNjM3LCAwLjkxNTEzLCAwLjkwOSwgMC44NzUxNCwgMC44MDcyOSwgMC45NTA3NywgMSwgMSwgMC44MDcyOSwgMC45NTA3NywgMC43NjQ2MywgMC43NDgsIDAuNzY0NjMsIDAuNzQ4LCAxLCAxLCAwLjc2NDYzLCAwLjc0OCwgMSwgMSwgMC44NjI3NSwgMC43MjY1MSwgMC44NjI3NSwgMS4wNDUwMiwgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MDY5OSwgMC45MTY3NywgMC45MTU0LCAwLjk0MjM2LCAwLjg1NDU4LCAwLjg5MzY0LCAwLjg1NDU4LCAwLjkwNTMxLCAwLjksIDAuOTA1MzEsIDAuOSwgMC45MDUzMSwgMC45LCAxLCAwLjk3Mjc2LCAwLjg1NTc2LCAwLjk5NjEzLCAwLjg0NSwgMC44NTgxMSwgMC45MDI1MSwgMC45MTY3NywgMSwgMSwgMC44NjI3NSwgMS4wNDUwMiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4xODYxNiwgMS4wMDg5OSwgMS4zMDYyOCwgMC44NTU3NiwgMC44MDE3OCwgMC42Njg2MiwgMC43OTI3LCAwLjY5MzIzLCAwLjg4MTI3LCAwLjcyNDU5LCAwLjg5NzExLCAwLjk1MzgxLCAwLjg1NTc2LCAwLjgwNTkxLCAwLjc4MDUsIDAuOTQ3MjksIDAuNzc1MTIsIDAuOTA1MzEsIDAuOTIyMjIsIDAuOTA2MzcsIDAuOTg2MjEsIDAuODE2OTgsIDAuOTI2NTUsIDAuOTg1NTgsIDAuOTIyMjIsIDAuODUzNTksIDAuOTA2MzcsIDAuOTA5NzYsIDAuODM4MDksIDAuOTQ1MjMsIDAuODYyNzUsIDAuODM1MDksIDAuOTMxNTcsIDAuODUzMDgsIDAuODMzOTIsIDAuOTIzNDYsIDAuOTg2MjEsIDAuODM1MDksIDAuOTI4ODYsIDAuOTEzMjQsIDAuOTIxNjgsIDAuOTUzODEsIDAuOTA2NDYsIDAuOTI4ODYsIDAuOTA1NTcsIDAuODY4NDcsIDAuOTAyNzYsIDAuOTEzMjQsIDAuODY4NDIsIDAuOTIxNjgsIDAuOTk1MzEsIDAuOTUzODEsIDAuOTIyNCwgMC44NTQwOCwgMC45MjY5OSwgMC44Njg0NywgMS4wMDUxLCAwLjkxNTEzLCAwLjgwNDg3LCAwLjkzNDgxLCAxLCAwLjg4MTU5LCAxLjA1MjE0LCAwLjkwNjQ2LCAwLjk3MzU1LCAwLjgxNTM5LCAwLjg5Mzk4LCAwLjg1OTIzLCAwLjk1MzgxLCAwLjkwNjQ2LCAwLjkxNTEzLCAwLjkwNjQ2LCAwLjg1OTIzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjkxNTQsIDAuOTQyMzYsIDAuOTE1NCwgMC45NDIzNiwgMC45MTU0LCAwLjk0MjM2LCAwLjg1NDU4LCAwLjg5MzY0LCAwLjk2Njk0LCAxLCAwLjg5OTAzLCAxLCAxLCAxLCAwLjkxNzgyLCAwLjkxNzgyLCAwLjkxNzgyLCAxLCAwLjg5NiwgMC44OTYsIDAuODk2LCAwLjkzMzIsIDAuOTMzMiwgMC45NTk3MywgMSwgMS4yNiwgMSwgMSwgMC44MDQ3OSwgMC44MDE3OCwgMSwgMSwgMC44NTYzMywgMSwgMSwgMSwgMSwgMC45NzI3NiwgMSwgMSwgMSwgMC42OTgsIDEsIDEuMzYxNDUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMTQ1NDIsIDEsIDAuNzkxOTksIDAuNzg2OTQsIDEuMDIwNTgsIDEuMDM0OTMsIDEuMDU0ODYsIDEsIDEsIDEuMjMwMjYsIDEuMDg1OTUsIDEuMDg1OTUsIDEsIDEuMDg1OTUsIDEuMDg1OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMjAwMDYsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBNeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIsCiAgbGluZUdhcDogMC4yCn07CmNvbnN0IE15cmlhZFByb0l0YWxpY0ZhY3RvcnMgPSBbMS4zNjg5OCwgMSwgMSwgMC42NTUwNywgMC44NDk0MywgMC44NTYzOSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44NjkzNiwgMC44ODMwNywgMC44Njk0OCwgMC44NTI4MywgMC44NTI4MywgMS4wNjM4MywgMS4wMjA1OCwgMC43NTk0NSwgMC45MjE5LCAwLjc1OTQ1LCAxLjE3MzM3LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjc1OTQ1LCAwLjc1OTQ1LCAxLjAyMDU4LCAxLjAyMDU4LCAxLjAyMDU4LCAwLjY5MDQ2LCAwLjcwOTI2LCAwLjg1MTU4LCAwLjc3ODEyLCAwLjc2ODUyLCAwLjg5NTkxLCAwLjcwNDY2LCAwLjc2MTI1LCAwLjgwMDk0LCAwLjg2ODIyLCAwLjgzODY0LCAwLjcyOCwgMC43NzIxMiwgMC43OTQ3NSwgMC45MzYzNywgMC44NzUxNCwgMC44NTg4LCAwLjc2MDEzLCAwLjg1ODgsIDAuNzI0MjEsIDAuNjk4NjYsIDAuNzc1OTgsIDAuODU5OTEsIDAuODA4MTEsIDAuODc4MzIsIDAuNzgxMTIsIDAuNzc1MTIsIDAuODU2MiwgMS4wMjIyLCAxLjE4NDE3LCAxLjAyMjIsIDEuMjcwMTQsIDAuODk5MDMsIDEuMTUwMTIsIDAuOTM4NTksIDAuOTQzOTksIDAuODQ2LCAwLjk0Mzk5LCAwLjgxNDUzLCAxLjAxODYsIDAuOTQyMTksIDAuOTYwMTcsIDEuMDMwNzUsIDEuMDIxNzUsIDAuOTEyLCAxLjAzMDc1LCAwLjk2OTk4LCAwLjk2MDE3LCAwLjkzODU5LCAwLjk0Mzk5LCAwLjk0Mzk5LCAwLjk1NDkzLCAwLjc0NiwgMS4xMjY1OCwgMC45NDU3OCwgMC45MSwgMC45NzksIDAuODgyLCAwLjg4MiwgMC44MywgMC44NTAzNCwgMC44MzUzNywgMC44NTAzNCwgMS4wMjA1OCwgMC43MDg2OSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44MzUzNywgMC45MDA4MywgMS4xNTAxMiwgMC45MTYxLCAwLjk0NTY1LCAwLjczNTQxLCAxLjAyMDU4LCAwLjUzNjA5LCAwLjY5MzUzLCAwLjc5NTE5LCAxLjA4NTk1LCAxLCAxLCAxLjE1MDEyLCAxLCAwLjkxOTc0LCAwLjc1OTQ1LCAxLjE1MDEyLCAxLCAwLjk0NDYsIDAuNzMzNjEsIDAuOTAwNSwgMC45MDA1LCAwLjkwMDUsIDAuNjI4NjQsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuODUxNTgsIDAuNzczLCAwLjc2ODUyLCAwLjcwNDY2LCAwLjcwNDY2LCAwLjcwNDY2LCAwLjcwNDY2LCAwLjgzODY0LCAwLjgzODY0LCAwLjgzODY0LCAwLjgzODY0LCAwLjkwNTYxLCAwLjg3NTE0LCAwLjg1ODgsIDAuODU4OCwgMC44NTg4LCAwLjg1ODgsIDAuODU4OCwgMS4wMjA1OCwgMC44NTc1MSwgMC44NTk5MSwgMC44NTk5MSwgMC44NTk5MSwgMC44NTk5MSwgMC43NzUxMiwgMC43NjAxMywgMC44ODA3NSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC44MDc1LCAwLjg0NiwgMC44MTQ1MywgMC44MTQ1MywgMC44MTQ1MywgMC44MTQ1MywgMC44MjQyNCwgMC44MjQyNCwgMC44MjQyNCwgMC44MjQyNCwgMC45Mjc4LCAwLjk2MDE3LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAxLjA4NTk1LCAwLjg1NjIsIDAuOTQ1NzgsIDAuOTQ1NzgsIDAuOTQ1NzgsIDAuOTQ1NzgsIDAuODgyLCAwLjk0NTc4LCAwLjg4MiwgMC44NTE1OCwgMC45Mzg1OSwgMC44NTE1OCwgMC45Mzg1OSwgMC44NTE1OCwgMC45Mzg1OSwgMC43Njg1MiwgMC44NDYsIDAuNzY4NTIsIDAuODQ2LCAwLjc2ODUyLCAwLjg0NiwgMC43Njg1MiwgMC44NDYsIDAuODk1OTEsIDAuODU0NCwgMC45MDU2MSwgMC45NDM5OSwgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC43MDQ2NiwgMC44MTQ1MywgMC44MDA5NCwgMC45NDIxOSwgMC44MDA5NCwgMC45NDIxOSwgMC44MDA5NCwgMC45NDIxOSwgMSwgMSwgMC44NjgyMiwgMC45NjAxNywgMC44NjgyMiwgMC45NjAxNywgMC44Mzg2NCwgMC44MjQyNCwgMC44Mzg2NCwgMC44MjQyNCwgMC44Mzg2NCwgMC44MjQyNCwgMC44Mzg2NCwgMS4wMzA3NSwgMC44Mzg2NCwgMC44MjQyNCwgMC44MTQwMiwgMS4wMjczOCwgMC43MjgsIDEuMDIxNzUsIDEsIDEsIDAuOTEyLCAwLjc5NDc1LCAxLjAzMDc1LCAxLCAxLCAwLjc5NDc1LCAwLjgzOTExLCAwLjc5NDc1LCAwLjY2MjY2LCAwLjgwNTUzLCAxLjA2Njc2LCAwLjg3NTE0LCAwLjk2MDE3LCAxLCAxLCAwLjg3NTE0LCAwLjk2MDE3LCAwLjg2ODY1LCAwLjg3Mzk2LCAwLjk2MDE3LCAwLjg1ODgsIDAuOTM4NTksIDAuODU4OCwgMC45Mzg1OSwgMC44NTg4LCAwLjkzODU5LCAwLjg2NywgMC44NDc1OSwgMC43MjQyMSwgMC45NTQ5MywgMSwgMSwgMC43MjQyMSwgMC45NTQ5MywgMC42OTg2NiwgMC43NDYsIDAuNjk4NjYsIDAuNzQ2LCAxLCAxLCAwLjY5ODY2LCAwLjc0NiwgMSwgMSwgMC43NzU5OCwgMC44ODQxNywgMC43NzU5OCwgMS4xMjY1OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NTk5MSwgMC45NDU3OCwgMC44NzgzMiwgMC45NzksIDAuNzc1MTIsIDAuODgyLCAwLjc3NTEyLCAwLjg1NjIsIDAuODMsIDAuODU2MiwgMC44MywgMC44NTYyLCAwLjgzLCAxLCAwLjg4NDY1LCAwLjg1MTU4LCAwLjkzODU5LCAwLjc3MywgMC44MDc1LCAwLjg1NzUxLCAwLjg1NjIsIDEsIDEsIDAuNzc1OTgsIDEuMTI2NTgsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUzMTMsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMTUwMTIsIDEuMDgxMDYsIDEuMDM5MDEsIDAuODUxNTgsIDAuNzcwMjUsIDAuNjIyNjQsIDAuNzY0NiwgMC42NTM1MSwgMC44NjAyNiwgMC42OTQ2MSwgMC44OTk0NywgMS4wMzA3NSwgMC44NTE1OCwgMC43NzgxMiwgMC43NjQ0OSwgMC44ODgzNiwgMC43MDQ2NiwgMC44NTYyLCAwLjg2ODIyLCAwLjg1ODgsIDAuODM4NjQsIDAuNzcyMTIsIDAuODUzMDgsIDAuOTM2MzcsIDAuODc1MTQsIDAuODIzNTIsIDAuODU4OCwgMC44NTcwMSwgMC43NjAxMywgMC44OTA1OCwgMC43NzU5OCwgMC44MTU2LCAwLjgyNTY1LCAwLjc4MTEyLCAwLjc3ODk5LCAwLjg5Mzg2LCAwLjgzODY0LCAwLjgxNTYsIDAuOTQ4NiwgMC45MjM4OCwgMC45NjE4NiwgMS4wMzA3NSwgMC45MTEyMywgMC45NDg2LCAwLjkzMjk4LCAwLjg3OCwgMC45Mzk0MiwgMC45MjM4OCwgMC44NDU5NiwgMC45NjE4NiwgMC45NTExOSwgMS4wMzA3NSwgMC45MjIsIDAuODg3ODcsIDAuOTU4MjksIDAuODgsIDAuOTM1NTksIDAuOTM4NTksIDAuNzg4MTUsIDAuOTM3NTgsIDEsIDAuODkyMTcsIDEuMDM3MzcsIDAuOTExMjMsIDAuOTM5NjksIDAuNzc0ODcsIDAuODU3NjksIDAuODY3OTksIDEuMDMwNzUsIDAuOTExMjMsIDAuOTM4NTksIDAuOTExMjMsIDAuODY3OTksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODc4MzIsIDAuOTc5LCAwLjg3ODMyLCAwLjk3OSwgMC44NzgzMiwgMC45NzksIDAuNzc1MTIsIDAuODgyLCAwLjkyMTksIDEsIDAuODk5MDMsIDEsIDEsIDEsIDAuODczMjEsIDAuODczMjEsIDAuODczMjEsIDEsIDEuMDI3LCAxLjAyNywgMS4wMjcsIDAuODY4NDcsIDAuODY4NDcsIDAuNzkxMjEsIDEsIDEuMTI0LCAxLCAxLCAwLjczNTcyLCAwLjczNTcyLCAxLCAxLCAwLjg1MDM0LCAxLCAxLCAxLCAxLCAwLjg4NDY1LCAxLCAxLCAxLCAwLjY2OSwgMSwgMS4zNjE0NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNDgyOCwgMSwgMC43NDk0OCwgMC43NTE4NywgMS4wMjA1OCwgMC45ODM5MSwgMS4wMjExOSwgMSwgMSwgMS4wNjIzMywgMS4wODU5NSwgMS4wODU5NSwgMSwgMS4wODU5NSwgMS4wODU5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNTIzMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IE15cmlhZFByb0l0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yLAogIGxpbmVHYXA6IDAuMgp9Owpjb25zdCBNeXJpYWRQcm9SZWd1bGFyRmFjdG9ycyA9IFsxLjM2ODk4LCAxLCAxLCAwLjc2MzA1LCAwLjgyNzg0LCAwLjk0OTM1LCAwLjg5MzY0LCAwLjkyMjQxLCAwLjg5MDczLCAwLjkwNzA2LCAwLjk4NDcyLCAwLjg1MjgzLCAwLjg1MjgzLCAxLjA2NjQsIDEuMDIwNTgsIDAuNzQ1MDUsIDAuOTIxOSwgMC43NDUwNSwgMS4yMzQ1NiwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC43NDUwNSwgMC43NDUwNSwgMS4wMjA1OCwgMS4wMjA1OCwgMS4wMjA1OCwgMC43MzAwMiwgMC43MjYwMSwgMC45MTc1NSwgMC44MTI2LCAwLjgwMzE0LCAwLjkyMjIyLCAwLjczNzY0LCAwLjc5NzI2LCAwLjgzMDUxLCAwLjkwMjg0LCAwLjg2MDIzLCAwLjc0LCAwLjgxMjYsIDAuODQ4NjksIDAuOTY1MTgsIDAuOTExMTUsIDAuODg1OCwgMC43OTc2MSwgMC44ODU4LCAwLjc0NDk4LCAwLjczOTE0LCAwLjgxMzYzLCAwLjg5NTkxLCAwLjgzNjU5LCAwLjg5NjMzLCAwLjg1NjA4LCAwLjgxMTEsIDAuOTA1MzEsIDEuMDIyMiwgMS4yMjczNiwgMS4wMjIyLCAxLjI3MDE0LCAwLjg5OTAzLCAwLjkwMDg4LCAwLjg2NjY3LCAxLjAyMzEsIDAuODk2LCAxLjAxNDExLCAwLjkwMDgzLCAxLjA1MDk5LCAxLjAwNTEyLCAwLjk5NzkzLCAxLjA1MzI2LCAxLjA5Mzc3LCAwLjkzOCwgMS4wNjIyNiwgMS4wMDExOSwgMC45OTc5MywgMC45ODcxNCwgMS4wMjMxLCAxLjAxMjMxLCAwLjk4MTk2LCAwLjc5MiwgMS4xOTEzNywgMC45OTA3NCwgMC45NjIsIDEuMDE5MTUsIDAuOTI2LCAwLjk0MiwgMC44NTYsIDAuODUwMzQsIDAuOTIwMDYsIDAuODUwMzQsIDEuMDIwNTgsIDAuNjkwNjcsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIwMDYsIDAuOTMzMiwgMC45MDA4OCwgMC45MTg4MiwgMC45MzQ4NCwgMC43NTMzOSwgMS4wMjA1OCwgMC41Njg2NiwgMC41NDMyNCwgMC43OTUxOSwgMS4wODU5NSwgMSwgMSwgMC45MDA4OCwgMSwgMC45NTMyNSwgMC43NDUwNSwgMC45MDA4OCwgMSwgMC45NzE5OCwgMC43NTMzOSwgMC45MTAwOSwgMC45MTAwOSwgMC45MTAwOSwgMC42NjQ2NiwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC45MTc1NSwgMC43ODgsIDAuODAzMTQsIDAuNzM3NjQsIDAuNzM3NjQsIDAuNzM3NjQsIDAuNzM3NjQsIDAuODYwMjMsIDAuODYwMjMsIDAuODYwMjMsIDAuODYwMjMsIDAuOTI5MTUsIDAuOTExMTUsIDAuODg1OCwgMC44ODU4LCAwLjg4NTgsIDAuODg1OCwgMC44ODU4LCAxLjAyMDU4LCAwLjg4NTgsIDAuODk1OTEsIDAuODk1OTEsIDAuODk1OTEsIDAuODk1OTEsIDAuODExMSwgMC43OTYxMSwgMC44OTcxMywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjY2NywgMC44NjkzNiwgMC44OTYsIDAuOTAwODMsIDAuOTAwODMsIDAuOTAwODMsIDAuOTAwODMsIDAuODQyMjQsIDAuODQyMjQsIDAuODQyMjQsIDAuODQyMjQsIDAuOTcyNzYsIDAuOTk3OTMsIDAuOTg3MTQsIDAuOTg3MTQsIDAuOTg3MTQsIDAuOTg3MTQsIDAuOTg3MTQsIDEuMDg1OTUsIDAuODk4NzYsIDAuOTkwNzQsIDAuOTkwNzQsIDAuOTkwNzQsIDAuOTkwNzQsIDAuOTQyLCAxLjAyMzEsIDAuOTQyLCAwLjkxNzU1LCAwLjg2NjY3LCAwLjkxNzU1LCAwLjg2NjY3LCAwLjkxNzU1LCAwLjg2NjY3LCAwLjgwMzE0LCAwLjg5NiwgMC44MDMxNCwgMC44OTYsIDAuODAzMTQsIDAuODk2LCAwLjgwMzE0LCAwLjg5NiwgMC45MjIyMiwgMC45MzM3MiwgMC45MjkxNSwgMS4wMTQxMSwgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC43Mzc2NCwgMC45MDA4MywgMC44MzA1MSwgMS4wMDUxMiwgMC44MzA1MSwgMS4wMDUxMiwgMC44MzA1MSwgMS4wMDUxMiwgMSwgMSwgMC45MDI4NCwgMC45OTc5MywgMC45MDk3NiwgMC45OTc5MywgMC44NjAyMywgMC44NDIyNCwgMC44NjAyMywgMC44NDIyNCwgMC44NjAyMywgMC44NDIyNCwgMC44NjAyMywgMS4wNTMyNiwgMC44NjAyMywgMC44NDIyNCwgMC44Mjg3MywgMS4wNzQ2OSwgMC43NCwgMS4wOTM3NywgMSwgMSwgMC45MzgsIDAuODQ4NjksIDEuMDYyMjYsIDEsIDEsIDAuODQ4NjksIDAuODM3MDQsIDAuODQ4NjksIDAuODE0NDEsIDAuODU1ODgsIDEuMDg5MjcsIDAuOTExMTUsIDAuOTk3OTMsIDEsIDEsIDAuOTExMTUsIDAuOTk3OTMsIDAuOTE4ODcsIDAuOTA5OTEsIDAuOTk3OTMsIDAuODg1OCwgMC45ODcxNCwgMC44ODU4LCAwLjk4NzE0LCAwLjg4NTgsIDAuOTg3MTQsIDAuODk0LCAwLjkxNDM0LCAwLjc0NDk4LCAwLjk4MTk2LCAxLCAxLCAwLjc0NDk4LCAwLjk4MTk2LCAwLjczOTE0LCAwLjc5MiwgMC43MzkxNCwgMC43OTIsIDEsIDEsIDAuNzM5MTQsIDAuNzkyLCAxLCAxLCAwLjgxMzYzLCAwLjkwNCwgMC44MTM2MywgMS4xOTEzNywgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTU5MSwgMC45OTA3NCwgMC44OTYzMywgMS4wMTkxNSwgMC44MTExLCAwLjk0MiwgMC44MTExLCAwLjkwNTMxLCAwLjg1NiwgMC45MDUzMSwgMC44NTYsIDAuOTA1MzEsIDAuODU2LCAxLCAwLjkyMjQxLCAwLjkxNzU1LCAwLjg2NjY3LCAwLjc4OCwgMC44NjkzNiwgMC44ODU4LCAwLjg5ODc2LCAxLCAxLCAwLjgxMzYzLCAxLjE5MTM3LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMzg4LCAxLjAzOTAxLCAwLjkyMTM4LCAwLjc4MTA1LCAwLjcxNTQsIDAuODYxNjksIDAuODA1MTMsIDAuOTQwMDcsIDAuODI1MjgsIDAuOTg2MTIsIDEuMDYyMjYsIDAuOTE3NTUsIDAuODEyNiwgMC44MTg4NCwgMC45MjgxOSwgMC43Mzc2NCwgMC45MDUzMSwgMC45MDI4NCwgMC44ODU4LCAwLjg2MDIzLCAwLjgxMjYsIDAuOTExNzIsIDAuOTY1MTgsIDAuOTExMTUsIDAuODMwODksIDAuODg1OCwgMC44Nzc5MSwgMC43OTc2MSwgMC44OTI5NywgMC44MTM2MywgMC44ODE1NywgMC44OTk5MiwgMC44NTYwOCwgMC44MTk5MiwgMC45NDMwNywgMC44NjAyMywgMC44ODE1NywgMC45NTMwOCwgMC45ODY5OSwgMC45OTc5MywgMS4wNjIyNiwgMC45NTgxNywgMC45NTMwOCwgMC45NzM1OCwgMC45MjgsIDAuOTgwODgsIDAuOTg2OTksIDAuOTI3NjEsIDAuOTk3OTMsIDAuOTYwMTcsIDEuMDYyMjYsIDAuOTg2LCAwLjk0NCwgMC45NTk3OCwgMC45MzgsIDAuOTY3MDUsIDAuOTg3MTQsIDAuODA0NDIsIDAuOTg5NzIsIDEsIDAuODk3NjIsIDEuMDQ1NTIsIDAuOTU4MTcsIDAuOTkwMDcsIDAuODcwNjQsIDAuOTE4NzksIDAuODg4ODgsIDEuMDYyMjYsIDAuOTU4MTcsIDAuOTg3MTQsIDAuOTU4MTcsIDAuODg4ODgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODk2MzMsIDEuMDE5MTUsIDAuODk2MzMsIDEuMDE5MTUsIDAuODk2MzMsIDEuMDE5MTUsIDAuODExMSwgMC45NDIsIDAuOTIxOSwgMSwgMC44OTkwMywgMSwgMSwgMSwgMC45MzE3MywgMC45MzE3MywgMC45MzE3MywgMSwgMS4wNjMwNCwgMS4wNjMwNCwgMS4wNjkwNCwgMC44OTkwMywgMC44OTkwMywgMC44MDU0OSwgMSwgMS4xNTYsIDEsIDEsIDAuNzY1NzUsIDAuNzY1NzUsIDEsIDEsIDAuNzI0NTgsIDEsIDEsIDEsIDEsIDAuOTIyNDEsIDEsIDEsIDEsIDAuNjE5LCAxLCAxLjM2MTQ1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA3MjU3LCAxLCAwLjc0NzA1LCAwLjcxMTE5LCAxLjAyMDU4LCAxLjAyNCwgMS4wMjExOSwgMSwgMSwgMS4xNTM2LCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA1NjM4LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgTXlyaWFkUHJvUmVndWxhck1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yLAogIGxpbmVHYXA6IDAuMgp9OwoKOy8vIC4vc3JjL2NvcmUvc2Vnb2V1aV9mYWN0b3JzLmpzCmNvbnN0IFNlZ29ldWlCb2xkRmFjdG9ycyA9IFsxLjc2NzM4LCAxLCAxLCAwLjk5Mjk3LCAwLjk4MjQsIDEuMDQwMTYsIDEuMDY0OTcsIDEuMDM0MjQsIDAuOTc1MjksIDEuMTc2NDcsIDEuMjMyMDMsIDEuMTA4NSwgMS4xMDg1LCAxLjE2OTM5LCAxLjIxMDcsIDAuOTc1NCwgMS4yMTQwOCwgMC45NzU0LCAxLjU5NTc4LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLjAzNDI0LCAwLjgxMzc4LCAwLjgxMzc4LCAxLjIxMDcsIDEuMjEwNywgMS4yMTA3LCAwLjcxNzAzLCAwLjk3ODQ3LCAwLjk3MzYzLCAwLjg4Nzc2LCAwLjg2NDEsIDEuMDIwOTYsIDAuNzk3OTUsIDAuODUxMzIsIDAuOTE0LCAxLjA2MDg1LCAxLjE0MDYsIDAuODAwNywgMC44OTg1OCwgMC44MzY5MywgMS4xNDg4OSwgMS4wOTM5OCwgMC45NzQ4OSwgMC45MjA5NCwgMC45NzQ4OSwgMC45MDM5OSwgMC44NDA0MSwgMC45NTkyMywgMS4wMDEzNSwgMSwgMS4wNjQ2NywgMC45ODI0MywgMC45MDk5NiwgMC45OTM2MSwgMS4xMDg1LCAxLjU2OTQyLCAxLjEwODUsIDEuMjEwNywgMC43NDYyNywgMC45NDI4MiwgMC45Njc1MiwgMS4wMTUxOSwgMC44NjMwNCwgMS4wMTM1OSwgMC45NzI3OCwgMS4xNTEwMywgMS4wMTM1OSwgMC45ODU2MSwgMS4wMjI4NSwgMS4wMjI4NSwgMS4wMDUyNywgMS4wMjI4NSwgMS4wMzAyLCAwLjk5MDQxLCAxLjAwMDgsIDEuMDE1MTksIDEuMDEzNTksIDEuMDIyNTgsIDAuNzkxMDQsIDEuMTY4NjIsIDAuOTkwNDEsIDAuOTc0NTQsIDEuMDI1MTEsIDAuOTkyOTgsIDAuOTY3NTIsIDAuOTU4MDEsIDAuOTQ4NTYsIDEuMTY1NzksIDAuOTQ4NTYsIDEuMjEwNywgMC45ODI0LCAxLjAzNDI0LCAxLjAzNDI0LCAxLCAxLjAzNDI0LCAxLjE2NTc5LCAwLjg3MjcsIDEuMzg3MSwgMS4xODYyMiwgMS4xMDgxOCwgMS4wNDQ3OCwgMS4yMTA3LCAxLjE4NjIyLCAwLjc1MTU1LCAwLjk0OTk0LCAxLjI4ODI2LCAxLjIxNDA4LCAxLjIxNDA4LCAwLjkxMDU2LCAxLCAwLjkxNTcyLCAwLjk3NTQsIDAuNjQ2NjMsIDEuMTgzMjgsIDEuMjQ4NjYsIDEuMDQ0NzgsIDEuMTQxNjksIDEuMTU3NDksIDEuMTczODksIDAuNzE3MDMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTczNjMsIDAuOTM1MDYsIDAuODY0MSwgMC43OTc5NSwgMC43OTc5NSwgMC43OTc5NSwgMC43OTc5NSwgMS4xNDA2LCAxLjE0MDYsIDEuMTQwNiwgMS4xNDA2LCAxLjAyMDk2LCAxLjA5Mzk4LCAwLjk3NDI2LCAwLjk3NDI2LCAwLjk3NDI2LCAwLjk3NDI2LCAwLjk3NDI2LCAxLjIxMDcsIDAuOTc0ODksIDEuMDAxMzUsIDEuMDAxMzUsIDEuMDAxMzUsIDEuMDAxMzUsIDAuOTA5OTYsIDAuOTIwOTQsIDEuMDI3OTgsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTY3NTIsIDAuOTMxMzYsIDAuODYzMDQsIDAuOTcyNzgsIDAuOTcyNzgsIDAuOTcyNzgsIDAuOTcyNzgsIDEuMDIyODUsIDEuMDIyODUsIDEuMDIyODUsIDEuMDIyODUsIDAuOTcxMjIsIDAuOTkwNDEsIDEsIDEsIDEsIDEsIDEsIDEuMjg4MjYsIDEuMDAwOCwgMC45OTA0MSwgMC45OTA0MSwgMC45OTA0MSwgMC45OTA0MSwgMC45Njc1MiwgMS4wMTUxOSwgMC45Njc1MiwgMC45NzM2MywgMC45Njc1MiwgMC45NzM2MywgMC45Njc1MiwgMC45NzM2MywgMC45Njc1MiwgMC44NjQxLCAwLjg2MzA0LCAwLjg2NDEsIDAuODYzMDQsIDAuODY0MSwgMC44NjMwNCwgMC44NjQxLCAwLjg2MzA0LCAxLjAyMDk2LCAxLjAzMDU3LCAxLjAyMDk2LCAxLjAzNTE3LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjc5Nzk1LCAwLjk3Mjc4LCAwLjkxNCwgMS4wMTM1OSwgMC45MTQsIDEuMDEzNTksIDAuOTE0LCAxLjAxMzU5LCAxLCAxLCAxLjA2MDg1LCAwLjk4NTYxLCAxLjA2MDg1LCAxLjAwODc5LCAxLjE0MDYsIDEuMDIyODUsIDEuMTQwNiwgMS4wMjI4NSwgMS4xNDA2LCAxLjAyMjg1LCAxLjE0MDYsIDEuMDIyODUsIDEuMTQwNiwgMS4wMjI4NSwgMC45NzEzOCwgMS4wODY5MiwgMC44MDA3LCAxLjAyMjg1LCAxLCAxLCAxLjAwNTI3LCAwLjgzNjkzLCAxLjAyMjg1LCAxLCAxLCAwLjgzNjkzLCAwLjk0NTUsIDAuODM2OTMsIDAuOTA0MTgsIDAuODM2OTMsIDEuMTMwMDUsIDEuMDkzOTgsIDAuOTkwNDEsIDEsIDEsIDEuMDkzOTgsIDAuOTkwNDEsIDAuOTY2OTIsIDEuMDkyNTEsIDAuOTkwNDEsIDAuOTc0ODksIDEuMDAwOCwgMC45NzQ4OSwgMS4wMDA4LCAwLjk3NDg5LCAxLjAwMDgsIDAuOTM5OTQsIDAuOTc5MzEsIDAuOTAzOTksIDEuMDIyNTgsIDEsIDEsIDAuOTAzOTksIDEuMDIyNTgsIDAuODQwNDEsIDAuNzkxMDQsIDAuODQwNDEsIDAuNzkxMDQsIDAuODQwNDEsIDAuNzkxMDQsIDAuODQwNDEsIDAuNzkxMDQsIDEsIDEsIDAuOTU5MjMsIDEuMDcwMzQsIDAuOTU5MjMsIDEuMTY4NjIsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDAxMzUsIDAuOTkwNDEsIDEuMDY0NjcsIDEuMDI1MTEsIDAuOTA5OTYsIDAuOTY3NTIsIDAuOTA5OTYsIDAuOTkzNjEsIDAuOTU4MDEsIDAuOTkzNjEsIDAuOTU4MDEsIDAuOTkzNjEsIDAuOTU4MDEsIDEuMDc3MzMsIDEuMDM0MjQsIDAuOTczNjMsIDAuOTY3NTIsIDAuOTM1MDYsIDAuOTMxMzYsIDAuOTc0ODksIDEuMDAwOCwgMSwgMSwgMC45NTkyMywgMS4xNjg2MiwgMS4xNTEwMywgMS4xNTEwMywgMS4wMTE3MywgMS4wMzk1OSwgMC43NTk1MywgMC44MTM3OCwgMC43OTkxMiwgMS4xNTEwMywgMS4yMTk5NCwgMC45NTE2MSwgMC44NzgxNSwgMS4wMTE0OSwgMC44MTUyNSwgMC43Njc2LCAwLjk4MTY3LCAxLjAxMTM0LCAxLjAyNTQ2LCAwLjg0MDk3LCAxLjAzMDg5LCAxLjE4MTAyLCAwLjk3MzYzLCAwLjg4Nzc2LCAwLjg1MTM0LCAwLjk3ODI2LCAwLjc5Nzk1LCAwLjk5MzYxLCAxLjA2MDg1LCAwLjk3NDg5LCAxLjE0MDYsIDAuODk4NTgsIDEuMDM4OCwgMS4xNDg4OSwgMS4wOTM5OCwgMC44NjAzOSwgMC45NzQ4OSwgMS4wNTk1LCAwLjkyMDk0LCAwLjk0NzkzLCAwLjk1OTIzLCAwLjkwOTk2LCAwLjk5MzQ2LCAwLjk4MjQzLCAxLjAyMTEyLCAwLjk1NDkzLCAxLjE0MDYsIDAuOTA5OTYsIDEuMDM1NzQsIDEuMDI1OTcsIDEuMDAwOCwgMS4xODEwMiwgMS4wNjYyOCwgMS4wMzU3NCwgMS4wMTkyLCAxLjAxOTMyLCAxLjAwODg2LCAwLjk3NTMxLCAxLjAxMDYsIDEuMDAwOCwgMS4xMzE4OSwgMS4xODEwMiwgMS4wMjI3NywgMC45ODY4MywgMS4wMDE2LCAwLjk5NTYxLCAxLjA3MjM3LCAxLjAwMDgsIDAuOTA0MzQsIDAuOTk5MjEsIDAuOTM4MDMsIDAuODk2NSwgMS4yMzA4NSwgMS4wNjYyOCwgMS4wNDk4MywgMC45NjI2OCwgMS4wNDk5LCAwLjk4NDM5LCAxLjE4MTAyLCAxLjA2NjI4LCAxLjAwMDgsIDEuMDY2MjgsIDAuOTg0MzksIDAuNzk3OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDk0NjYsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTcyNzgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDIwNjUsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDY0NjcsIDEuMDI1MTEsIDEuMDY0NjcsIDEuMDI1MTEsIDEuMDY0NjcsIDEuMDI1MTEsIDAuOTA5OTYsIDAuOTY3NTIsIDEsIDEuMjE0MDgsIDAuODk5MDMsIDEsIDEsIDAuNzUxNTUsIDEuMDQzOTQsIDEuMDQzOTQsIDEuMDQzOTQsIDEuMDQzOTQsIDAuOTg2MzMsIDAuOTg2MzMsIDAuOTg2MzMsIDAuNzMwNDcsIDAuNzMwNDcsIDEuMjA2NDIsIDAuOTEyMTEsIDEuMjU2MzUsIDEuMjIyLCAxLjAyOTU2LCAxLjAzMzcyLCAxLjAzMzcyLCAwLjk2MDM5LCAxLjI0NjMzLCAxLCAxLjEyNDU0LCAwLjkzNTAzLCAxLjAzNDI0LCAxLjE5Njg3LCAxLjAzNDI0LCAxLCAxLCAxLCAwLjc3MSwgMSwgMSwgMS4xNTc0OSwgMS4xNTc0OSwgMS4xNTc0OSwgMS4xMDk0OCwgMC44NjI3OSwgMC45NDQzNCwgMC44NjI3OSwgMC45NDQzNCwgMC44NjE4MiwgMSwgMSwgMS4xNjg5NywgMSwgMC45NjA4NSwgMC45MDEzNywgMS4yMTA3LCAxLjE4NDE2LCAxLjEzOTczLCAwLjY5ODI1LCAwLjk3MTYsIDIuMTAzMzksIDEuMjkwMDQsIDEuMjkwMDQsIDEuMjExNzIsIDEuMjkwMDQsIDEuMjkwMDQsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuNDI2MDMsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDEuMTg4NzQsIDEuNDI2MDMsIDEsIDEuNDI2MDMsIDEuNDI2MDMsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMjg4NiwgMS4wNDMxNSwgMS4xNTI5NiwgMS4zNDE2MywgMSwgMSwgMSwgMS4wOTE5MywgMS4wOTE5MywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IFNlZ29ldWlCb2xkTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjMzMDA4LAogIGxpbmVHYXA6IDAKfTsKY29uc3QgU2Vnb2V1aUJvbGRJdGFsaWNGYWN0b3JzID0gWzEuNzY3MzgsIDEsIDEsIDAuOTg5NDYsIDEuMDM5NTksIDEuMDQwMTYsIDEuMDI4MDksIDEuMDM2LCAwLjk3NjM5LCAxLjEwOTUzLCAxLjIzMjAzLCAxLjExMTQ0LCAxLjExMTQ0LCAxLjE2OTM5LCAxLjIxMjM3LCAwLjk3NTQsIDEuMjEyNjEsIDAuOTc1NCwgMS41OTc1NCwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDAuODEzNzgsIDAuODEzNzgsIDEuMjEyMzcsIDEuMjEyMzcsIDEuMjEyMzcsIDAuNzM1NDEsIDAuOTc4NDcsIDAuOTczNjMsIDAuODk3MjMsIDAuODc4OTcsIDEuMDQyNiwgMC43OTQyOSwgMC44NTI5MiwgMC45MTE0OSwgMS4wNTgxNSwgMS4xNDA2LCAwLjc5NjMxLCAwLjkwMTI4LCAwLjgzODUzLCAxLjA0Mzk2LCAxLjEwNjE1LCAwLjk3NTUyLCAwLjk0NDM2LCAwLjk3NTUyLCAwLjg4NjQxLCAwLjgwNTI3LCAwLjk2MDgzLCAxLjAwMTM1LCAxLCAxLjA2Nzc3LCAwLjk4MTcsIDAuOTExNDIsIDAuOTkzNjEsIDEuMTExNDQsIDEuNTcyOTMsIDEuMTExNDQsIDEuMjEyMzcsIDAuNzQ2MjcsIDEuMzE4MTgsIDEuMDY1ODUsIDAuOTcwNDIsIDAuODMwNTUsIDAuOTcwNDIsIDAuOTM1MDMsIDEuMTI2MSwgMC45NzA0MiwgMC45NzkyMiwgMS4xNDIzNiwgMC45NDU1MiwgMS4wMTA1NCwgMS4xNDIzNiwgMS4wMjQ3MSwgMC45NzkyMiwgMC45NDE2NSwgMC45NzA0MiwgMC45NzA0MiwgMS4wMjc2LCAwLjc4OTI5LCAxLjEyNjEsIDAuOTc5MjIsIDAuOTU4NzQsIDEuMDIxOTcsIDAuOTg1MDcsIDAuOTY3NTIsIDAuOTcxNjgsIDAuOTUxMDcsIDEuMTY1NzksIDAuOTUxMDcsIDEuMjEyMzcsIDEuMDM5NTksIDEuMDM2LCAxLjAzNiwgMSwgMS4wMzYsIDEuMTY1NzksIDAuODczNTcsIDEuMzE4MTgsIDEuMTg3NTQsIDEuMjY3ODEsIDEuMDUzNTYsIDEuMjEyMzcsIDEuMTg2MjIsIDAuNzk0ODcsIDAuOTQ5OTQsIDEuMjkwMDQsIDEuMjQwNDcsIDEuMjQwNDcsIDEuMzE4MTgsIDEsIDAuOTE0ODQsIDAuOTc1NCwgMS4zMTgxOCwgMS4xMzQ5LCAxLjI0ODY2LCAxLjA1MzU2LCAxLjEzOTM0LCAxLjE1NTc0LCAxLjE3Mzg5LCAwLjczNTQxLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk0Mzg1LCAwLjg3ODk3LCAwLjc5NDI5LCAwLjc5NDI5LCAwLjc5NDI5LCAwLjc5NDI5LCAxLjE0MDYsIDEuMTQwNiwgMS4xNDA2LCAxLjE0MDYsIDEuMDQyNiwgMS4xMDYxNSwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMS4yMTIzNywgMC45NzU1MiwgMS4wMDEzNSwgMS4wMDEzNSwgMS4wMDEzNSwgMS4wMDEzNSwgMC45MTE0MiwgMC45NDQzNiwgMC45ODcyMSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMC45NjcwNSwgMC44MzA1NSwgMC45MzUwMywgMC45MzUwMywgMC45MzUwMywgMC45MzUwMywgMS4xNDIzNiwgMS4xNDIzNiwgMS4xNDIzNiwgMS4xNDIzNiwgMC45MzEyNSwgMC45NzkyMiwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMS4yOTAwNCwgMC45NDE2NSwgMC45NzkyMiwgMC45NzkyMiwgMC45NzkyMiwgMC45NzkyMiwgMC45Njc1MiwgMC45NzA0MiwgMC45Njc1MiwgMC45NzM2MywgMS4wNjU4NSwgMC45NzM2MywgMS4wNjU4NSwgMC45NzM2MywgMS4wNjU4NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMS4wNDI2LCAxLjAwMzMsIDEuMDQyNiwgMC45NzA0MiwgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC45MTE0OSwgMC45NzA0MiwgMC45MTE0OSwgMC45NzA0MiwgMC45MTE0OSwgMC45NzA0MiwgMSwgMSwgMS4wNTgxNSwgMC45NzkyMiwgMS4wNTgxNSwgMC45NzkyMiwgMS4xNDA2LCAxLjE0MjM2LCAxLjE0MDYsIDEuMTQyMzYsIDEuMTQwNiwgMS4xNDIzNiwgMS4xNDA2LCAxLjE0MjM2LCAxLjE0MDYsIDEuMTQyMzYsIDAuOTc0NDEsIDEuMDQzMDIsIDAuNzk2MzEsIDEuMDE1ODIsIDEsIDEsIDEuMDEwNTQsIDAuODM4NTMsIDEuMTQyMzYsIDEsIDEsIDAuODM4NTMsIDEuMDkxMjUsIDAuODM4NTMsIDAuOTA0MTgsIDAuODM4NTMsIDEuMTk1MDgsIDEuMTA2MTUsIDAuOTc5MjIsIDEsIDEsIDEuMTA2MTUsIDAuOTc5MjIsIDEuMDEwMzQsIDEuMTA0NjYsIDAuOTc5MjIsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTE2MDIsIDAuOTE5ODEsIDAuODg2NDEsIDEuMDI3NiwgMSwgMSwgMC44ODY0MSwgMS4wMjc2LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAxLCAxLCAwLjk2MDgzLCAxLjA1NDAzLCAwLjk1OTIzLCAxLjE2ODYyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjA2Nzc3LCAxLjAyMTk3LCAwLjkxMTQyLCAwLjk2NzUyLCAwLjkxMTQyLCAwLjk5MzYxLCAwLjk3MTY4LCAwLjk5MzYxLCAwLjk3MTY4LCAwLjk5MzYxLCAwLjk3MTY4LCAxLjIzMTk5LCAxLjAzNiwgMC45NzM2MywgMS4wNjU4NSwgMC45NDM4NSwgMC45NjcwNSwgMC45NzU1MiwgMC45NDE2NSwgMSwgMSwgMC45NjA4MywgMS4xMjYxLCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAwLjk1MTYxLCAxLjI3MTI2LCAxLjAwODExLCAwLjgzMjg0LCAwLjc3NzAyLCAwLjk5MTM3LCAwLjk1MjUzLCAxLjAzNDcsIDAuODYxNDIsIDEuMDcyMDUsIDEuMTQyMzYsIDAuOTczNjMsIDAuODk3MjMsIDAuODY4NjksIDEuMDk4MTgsIDAuNzk0MjksIDAuOTkzNjEsIDEuMDU4MTUsIDAuOTc1NTIsIDEuMTQwNiwgMC45MDEyOCwgMS4wNjY2MiwgMS4wNDM5NiwgMS4xMDYxNSwgMC44NDkxOCwgMC45NzU1MiwgMS4wNDY5NCwgMC45NDQzNiwgMC45ODAxNSwgMC45NjA4MywgMC45MTE0MiwgMS4wMDM1NiwgMC45ODE3LCAxLjAxOTQ1LCAwLjk4OTk5LCAxLjE0MDYsIDAuOTExNDIsIDEuMDQ5NjEsIDAuOTg5OCwgMS4wMDYzOSwgMS4xNDIzNiwgMS4wNzUxNCwgMS4wNDk2MSwgMC45OTYwNywgMS4wMjg5NywgMS4wMDgsIDAuOTg5OCwgMC45NTEzNCwgMS4wMDYzOSwgMS4xMTEyMSwgMS4xNDIzNiwgMS4wMDUxOCwgMC45Nzk4MSwgMS4wMjE4NiwgMSwgMS4wODU3OCwgMC45NDE2NSwgMC45OTMxNCwgMC45ODM4NywgMC45MzAyOCwgMC45MzM3NywgMS4zNTEyNSwgMS4wNzUxNCwgMS4xMDY4NywgMC45MzQ5MSwgMS4wNDIzMiwgMS4wMDM1MSwgMS4xNDIzNiwgMS4wNzUxNCwgMC45NDE2NSwgMS4wNzUxNCwgMS4wMDM1MSwgMC43OTQyOSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wOTA5NywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MzUwMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NjYwOSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNjc3NywgMS4wMjE5NywgMS4wNjc3NywgMS4wMjE5NywgMS4wNjc3NywgMS4wMjE5NywgMC45MTE0MiwgMC45Njc1MiwgMSwgMS4yMTI2MSwgMC44OTkwMywgMSwgMSwgMC43NTE1NSwgMS4wNDc0NSwgMS4wNDc0NSwgMS4wNDc0NSwgMS4wNDM5NCwgMC45ODYzMywgMC45ODYzMywgMC45ODYzMywgMC43Mjk1OSwgMC43Mjk1OSwgMS4yMDUwMiwgMC45MTQwNiwgMS4yNjUxNCwgMS4yMjIsIDEuMDI5NTYsIDEuMDMzNzIsIDEuMDMzNzIsIDAuOTYwMzksIDEuMjQ2MzMsIDEsIDEuMDkxMjUsIDAuOTMzMjcsIDEuMDMzMzYsIDEuMTY1NDEsIDEuMDM2LCAxLCAxLCAxLCAwLjc3MSwgMSwgMSwgMS4xNTU3NCwgMS4xNTU3NCwgMS4xNTU3NCwgMS4xNTU3NCwgMC44NjM2NCwgMC45NDQzNCwgMC44NjI3OSwgMC45NDQzNCwgMC44NjIyNCwgMSwgMSwgMS4xNjc5OCwgMSwgMC45NjA4NSwgMC45MDA2OCwgMS4yMTIzNywgMS4xODQxNiwgMS4xMzkwNCwgMC42OTgyNSwgMC45NzE2LCAyLjEwMzM5LCAxLjI5MDA0LCAxLjI5MDA0LCAxLjIxMzM5LCAxLjI5MDA0LCAxLjI5MDA0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjQyNjAzLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAxLjE4Nzc1LCAxLjQyNjAzLCAxLCAxLjQyNjAzLCAxLjQyNjAzLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjI4ODYsIDEuMDQzMTUsIDEuMTUyOTYsIDEuMzQxNjMsIDEsIDEsIDEsIDEuMTMyNjksIDEuMTMyNjksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBTZWdvZXVpQm9sZEl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4zMzAwOCwKICBsaW5lR2FwOiAwCn07CmNvbnN0IFNlZ29ldWlJdGFsaWNGYWN0b3JzID0gWzEuNzY3MzgsIDEsIDEsIDAuOTg5NDYsIDEuMTQ3NjMsIDEuMDUzNjUsIDEuMDYyMzQsIDAuOTY5MjcsIDAuOTI1ODYsIDEuMTUzNzMsIDEuMTg0MTQsIDAuOTEzNDksIDAuOTEzNDksIDEuMDc0MDMsIDEuMTczMDgsIDAuNzgzODMsIDEuMjAwODgsIDAuNzgzODMsIDEuNDI1MzEsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuNzgzODMsIDAuNzgzODMsIDEuMTczMDgsIDEuMTczMDgsIDEuMTczMDgsIDAuNzczNDksIDAuOTQ1NjUsIDAuOTQ3MjksIDAuODU5NDQsIDAuODg1MDYsIDAuOTg1OCwgMC43NDgxNywgMC44MDAxNiwgMC44ODQ0OSwgMC45ODAzOSwgMC45NTc4MiwgMC42OTIzOCwgMC44OTg5OCwgMC44MzIzMSwgMC45ODE4MywgMS4wMzk4OSwgMC45NjkyNCwgMC44NjIzNywgMC45NjkyNCwgMC44MDU5NSwgMC43NDUyNCwgMC44NjA5MSwgMC45NTQwMiwgMC45NDE0MywgMC45ODQ0OCwgMC44ODU4LCAwLjgzMDg5LCAwLjkzMjg1LCAxLjA5NDksIDEuMzkwMTYsIDEuMDk0OSwgMS40NTk5NCwgMC43NDYyNywgMS4wNDgzOSwgMC45NzQ1NCwgMC45NzQ1NCwgMC44NzIwNywgMC45NzQ1NCwgMC44NzUzMywgMS4wNjE1MSwgMC45NzQ1NCwgMS4wMDE3NiwgMS4xNjQ4NCwgMS4wODEzMiwgMC45ODA0NywgMS4xNjQ4NCwgMS4wMjk4OSwgMS4wMTA1NCwgMC45NjIyNSwgMC45NzQ1NCwgMC45NzQ1NCwgMS4wNjU5OCwgMC43OTAwNCwgMS4xNjM0NCwgMS4wMDM1MSwgMC45NDYyOSwgMC45OTczLCAwLjkxMDE2LCAwLjk2Nzc3LCAwLjkwNDMsIDAuOTEwODIsIDAuOTI0ODEsIDAuOTEwODIsIDEuMTczMDgsIDAuOTU3NDgsIDAuOTY5MjcsIDAuOTY5MjcsIDEsIDAuOTY5MjcsIDAuOTI0ODEsIDAuODA1OTcsIDEuMDQ4MzksIDEuMjMzOTMsIDEuMTc4MSwgMC45MjQ1LCAxLjE3MzA4LCAxLjIwODA4LCAwLjYzMjE4LCAwLjk0MjYxLCAxLjI0ODIyLCAxLjA5OTcxLCAxLjA5OTcxLCAxLjA0ODM5LCAxLCAwLjg1MjczLCAwLjc4MDMyLCAxLjA0ODM5LCAxLjA5OTcxLCAxLjIyMzI2LCAwLjkyNDUsIDEuMDk4MzYsIDEuMTM1MjUsIDEuMTUyMjIsIDAuNzA0MjQsIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuOTQ3MjksIDAuODU0OTgsIDAuODg1MDYsIDAuNzQ4MTcsIDAuNzQ4MTcsIDAuNzQ4MTcsIDAuNzQ4MTcsIDAuOTU3ODIsIDAuOTU3ODIsIDAuOTU3ODIsIDAuOTU3ODIsIDAuOTg1OCwgMS4wMzk4OSwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMS4xNzMwOCwgMC45NjkyNCwgMC45NTQwMiwgMC45NTQwMiwgMC45NTQwMiwgMC45NTQwMiwgMC44MzA4OSwgMC44NjIzNywgMC44ODQwOSwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45NzQ1NCwgMC45MjkxNiwgMC44NzIwNywgMC44NzUzMywgMC44NzUzMywgMC44NzUzMywgMC44NzUzMywgMC45MzE0NiwgMC45MzE0NiwgMC45MzE0NiwgMC45MzE0NiwgMC45Mzg1NCwgMS4wMTA1NCwgMC45NjIyNSwgMC45NjIyNSwgMC45NjIyNSwgMC45NjIyNSwgMC45NjIyNSwgMS4yNDgyMiwgMC44NzYxLCAxLjAwMzUxLCAxLjAwMzUxLCAxLjAwMzUxLCAxLjAwMzUxLCAwLjk2Nzc3LCAwLjk3NDU0LCAwLjk2Nzc3LCAwLjk0NzI5LCAwLjk3NDU0LCAwLjk0NzI5LCAwLjk3NDU0LCAwLjk0NzI5LCAwLjk3NDU0LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjg4NTA2LCAwLjg3MjA3LCAwLjk4NTgsIDAuOTUzOTEsIDAuOTg1OCwgMC45NzQ1NCwgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC43NDgxNywgMC44NzUzMywgMC44ODQ0OSwgMC45NzQ1NCwgMC44ODQ0OSwgMC45NzQ1NCwgMC44ODQ0OSwgMC45NzQ1NCwgMSwgMSwgMC45ODAzOSwgMS4wMDE3NiwgMC45ODAzOSwgMS4wMDE3NiwgMC45NTc4MiwgMC45MzE0NiwgMC45NTc4MiwgMC45MzE0NiwgMC45NTc4MiwgMC45MzE0NiwgMC45NTc4MiwgMS4xNjQ4NCwgMC45NTc4MiwgMC45MzE0NiwgMC44NDQyMSwgMS4xMjc2MSwgMC42OTIzOCwgMS4wODEzMiwgMSwgMSwgMC45ODA0NywgMC44MzIzMSwgMS4xNjQ4NCwgMSwgMSwgMC44NDcyMywgMS4wNDg2MSwgMC44NDcyMywgMC43ODc1NSwgMC44MzIzMSwgMS4yMzczNiwgMS4wMzk4OSwgMS4wMTA1NCwgMSwgMSwgMS4wMzk4OSwgMS4wMTA1NCwgMC45ODU3LCAxLjAzODQ5LCAxLjAxMDU0LCAwLjk2OTI0LCAwLjk2MjI1LCAwLjk2OTI0LCAwLjk2MjI1LCAwLjk2OTI0LCAwLjk2MjI1LCAwLjkyMzgzLCAwLjkwMTcxLCAwLjgwNTk1LCAxLjA2NTk4LCAxLCAxLCAwLjgwNTk1LCAxLjA2NTk4LCAwLjc0NTI0LCAwLjc5MDA0LCAwLjc0NTI0LCAwLjc5MDA0LCAwLjc0NTI0LCAwLjc5MDA0LCAwLjc0NTI0LCAwLjc5MDA0LCAxLCAxLCAwLjg2MDkxLCAxLjAyNzU5LCAwLjg1NzcxLCAxLjE2MzQ0LCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk1NDAyLCAxLjAwMzUxLCAwLjk4NDQ4LCAwLjk5NzMsIDAuODMwODksIDAuOTY3NzcsIDAuODMwODksIDAuOTMyODUsIDAuOTA0MywgMC45MzI4NSwgMC45MDQzLCAwLjkzMjg1LCAwLjkwNDMsIDEuMzE4NjgsIDAuOTY5MjcsIDAuOTQ3MjksIDAuOTc0NTQsIDAuODU0OTgsIDAuOTI5MTYsIDAuOTY5MjQsIDAuODc2MSwgMSwgMSwgMC44NjA5MSwgMS4xNjM0NCwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMS4wNDgzOSwgMC44MTk2NSwgMC44MTk2NSwgMC45NDcyOSwgMC43ODAzMiwgMC43MTAyMiwgMC45MDg4MywgMC44NDE3MSwgMC45OTg3NywgMC43NzU5NiwgMS4wNTczNCwgMS4yLCAwLjk0NzI5LCAwLjg1OTQ0LCAwLjgyNzkxLCAwLjk2MDcsIDAuNzQ4MTcsIDAuOTMyODUsIDAuOTgwMzksIDAuOTY5MjQsIDAuOTU3ODIsIDAuODk4OTgsIDAuOTgzMTYsIDAuOTgxODMsIDEuMDM5ODksIDAuNzg2MTQsIDAuOTY5MjQsIDAuOTc2NDIsIDAuODYyMzcsIDAuODYwNzUsIDAuODYwOTEsIDAuODMwODksIDAuOTAwODIsIDAuODg1OCwgMC45NzI5NiwgMS4wMTI4NCwgMC45NTc4MiwgMC44MzA4OSwgMS4wOTc2LCAxLjA0LCAxLjAzMzQyLCAxLjIsIDEuMDY3NSwgMS4wOTc2LCAwLjk4MjA1LCAxLjAzODA5LCAxLjA1MDk3LCAxLjA0LCAwLjk1MzY0LCAxLjAzMzQyLCAxLjA1NDAxLCAxLjIsIDEuMDIxNDgsIDEuMDExOSwgMS4wNDcyNCwgMS4wMTI3LCAxLjAyNzMyLCAwLjk2MjI1LCAwLjg5NjUsIDAuOTc3ODMsIDAuOTM1NzQsIDAuOTQ4MTgsIDEuMzA2NzksIDEuMDY3NSwgMS4xMTgyNiwgMC45OTgyMSwgMS4wNTU3LCAxLjAzMjYsIDEuMiwgMS4wNjc1LCAwLjk2MjI1LCAxLjA2NzUsIDEuMDMyNiwgMC43NDgxNywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wMzc1NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44NzUzMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45ODcwNSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45ODQ0OCwgMC45OTczLCAwLjk4NDQ4LCAwLjk5NzMsIDAuOTg0NDgsIDAuOTk3MywgMC44MzA4OSwgMC45Njc3NywgMSwgMS4yMDA4OCwgMC44OTkwMywgMSwgMSwgMC43NTE1NSwgMC45NDk0NSwgMC45NDk0NSwgMC45NDk0NSwgMC45NDk0NSwgMS4xMjMxNywgMS4xMjMxNywgMS4xMjMxNywgMC42NzYwMywgMC42NzYwMywgMS4xNTYyMSwgMC43MzU4NCwgMS4yMTE5MSwgMS4yMjEzNSwgMS4wNjQ4MywgMC45NDg2OCwgMC45NDg2OCwgMC45NTk5NiwgMS4yNDYzMywgMSwgMS4wNzQ5NywgMC44NzcwOSwgMC45NjkyNywgMS4wMTQ3MywgMC45NjkyNywgMSwgMSwgMSwgMC43NzI5NSwgMSwgMSwgMS4wOTgzNiwgMS4wOTgzNiwgMS4wOTgzNiwgMS4wMTUyMiwgMC44NjMyMSwgMC45NDQzNCwgMC44NjQ5LCAwLjk0NDM0LCAwLjg2MTgyLCAxLCAxLCAxLjA4MywgMSwgMC45MTU3OCwgMC44NjQzOCwgMS4xNzMwOCwgMS4xODQxNiwgMS4xNDU4OSwgMC42OTgyNSwgMC45NzYyMiwgMS45Njc5MSwgMS4yNDgyMiwgMS4yNDgyMiwgMS4xNzMwOCwgMS4yNDgyMiwgMS4yNDgyMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS40MjYwMywgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMC44NzAyNSwgMC44NzAyNSwgMC44NzAyNSwgMC44NzAyNSwgMS4xNzk4NCwgMS40MjYwMywgMSwgMS40MjYwMywgMS40MjYwMywgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4yODg2LCAxLjA0MzE1LCAxLjE1Mjk2LCAxLjM0MTYzLCAxLCAxLCAxLCAxLjEwNzQyLCAxLjEwNzQyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgU2Vnb2V1aUl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4zMzAwOCwKICBsaW5lR2FwOiAwCn07CmNvbnN0IFNlZ29ldWlSZWd1bGFyRmFjdG9ycyA9IFsxLjc2NzM4LCAxLCAxLCAwLjk4NTk0LCAxLjAyMjg1LCAxLjEwNDU0LCAxLjA2MjM0LCAwLjk2OTI3LCAwLjkyMDM3LCAxLjE5OTg1LCAxLjIwNDYsIDAuOTA2MTYsIDAuOTA2MTYsIDEuMDcxNTIsIDEuMTcxNCwgMC43ODAzMiwgMS4yMDA4OCwgMC43ODAzMiwgMS40MDI0NiwgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC43ODAzMiwgMC43ODAzMiwgMS4xNzE0LCAxLjE3MTQsIDEuMTcxNCwgMC44MDU5NywgMC45NDA4NCwgMC45NjcwNiwgMC44NTk0NCwgMC44NTczNCwgMC45NzA5MywgMC43NTg0MiwgMC43OTkzNiwgMC44ODE5OCwgMC45ODMxLCAwLjk1NzgyLCAwLjcxMzg3LCAwLjg2OTY5LCAwLjg0NjM2LCAxLjA3Nzk2LCAxLjAzNTg0LCAwLjk2OTI0LCAwLjgzOTY4LCAwLjk2OTI0LCAwLjgyODI2LCAwLjc5NjQ5LCAwLjg1NzcxLCAwLjk1MTMyLCAwLjkzMTE5LCAwLjk4OTY1LCAwLjg4NDMzLCAwLjgyODcsIDAuOTMzNjUsIDEuMDg2MTIsIDEuMzYzOCwgMS4wODYxMiwgMS40NTc4NiwgMC43NDYyNywgMC44MDQ5OSwgMC45MTQ4NCwgMS4wNTcwNywgMC45MjM4MywgMS4wNTg4MiwgMC45NDAzLCAxLjEyNjU0LCAxLjA1ODgyLCAxLjAxNzU2LCAxLjA5MDExLCAxLjA5MDExLCAwLjk5NDE0LCAxLjA5MDExLCAxLjAzNCwgMS4wMTc1NiwgMS4wNTM1NiwgMS4wNTcwNywgMS4wNTg4MiwgMS4wNDM5OSwgMC44NDg2MywgMS4yMTk2OCwgMS4wMTc1NiwgMC45NTgwMSwgMS4wMDA2OCwgMC45MTc5NywgMC45Njc3NywgMC45MDQzLCAwLjkwMzUxLCAwLjkyMTA1LCAwLjkwMzUxLCAxLjE3MTQsIDAuODUzMzcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTk5MTIsIDAuOTY5MjcsIDAuOTIxMDUsIDAuODA1OTcsIDEuMjQzNCwgMS4yMDgwOCwgMS4wNTkzNywgMC45MDk1NywgMS4xNzE0LCAxLjIwODA4LCAwLjc1MTU1LCAwLjk0MjYxLCAxLjI0NjQ0LCAxLjA5OTcxLCAxLjA5OTcxLCAwLjg0NzUxLCAxLCAwLjg1MjczLCAwLjc4MDMyLCAwLjYxNTg0LCAxLjA1NDI1LCAxLjE3OTE0LCAwLjkwOTU3LCAxLjA4NjY1LCAxLjExNTkzLCAxLjE0MTY5LCAwLjczMzgxLCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjg2MDM1LCAwLjg1NzM0LCAwLjc1ODQyLCAwLjc1ODQyLCAwLjc1ODQyLCAwLjc1ODQyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk3MDkzLCAxLjAzNTg0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAxLjE3MTQsIDAuOTY5MjQsIDAuOTUxMzIsIDAuOTUxMzIsIDAuOTUxMzIsIDAuOTUxMzIsIDAuODI4NywgMC44Mzk2OCwgMC44OTA0OSwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MzU3NSwgMC45MjM4MywgMC45NDAzLCAwLjk0MDMsIDAuOTQwMywgMC45NDAzLCAwLjg3MTcsIDAuODcxNywgMC44NzE3LCAwLjg3MTcsIDEuMDA1MjcsIDEuMDE3NTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMjQ2NDQsIDAuOTU5MjMsIDEuMDE3NTYsIDEuMDE3NTYsIDEuMDE3NTYsIDEuMDE3NTYsIDAuOTY3NzcsIDEuMDU3MDcsIDAuOTY3NzcsIDAuOTY3MDYsIDAuOTE0ODQsIDAuOTY3MDYsIDAuOTE0ODQsIDAuOTY3MDYsIDAuOTE0ODQsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuOTcwOTMsIDEuMDk2OSwgMC45NzA5MywgMS4wNTg4MiwgMC43NTg0MiwgMC45NDAzLCAwLjc1ODQyLCAwLjk0MDMsIDAuNzU4NDIsIDAuOTQwMywgMC43NTg0MiwgMC45NDAzLCAwLjc1ODQyLCAwLjk0MDMsIDAuODgxOTgsIDEuMDU4ODIsIDAuODgxOTgsIDEuMDU4ODIsIDAuODgxOTgsIDEuMDU4ODIsIDEsIDEsIDAuOTgzMSwgMS4wMTc1NiwgMC45ODMxLCAxLjAxNzU2LCAwLjk1NzgyLCAwLjg3MTcsIDAuOTU3ODIsIDAuODcxNywgMC45NTc4MiwgMC44NzE3LCAwLjk1NzgyLCAxLjA5MDExLCAwLjk1NzgyLCAwLjg3MTcsIDAuODQ3ODQsIDEuMTE1NTEsIDAuNzEzODcsIDEuMDkwMTEsIDEsIDEsIDAuOTk0MTQsIDAuODQ2MzYsIDEuMDkwMTEsIDEsIDEsIDAuODQ2MzYsIDEuMDUzNiwgMC44NDYzNiwgMC45NDI5OCwgMC44NDYzNiwgMS4yMzI5NywgMS4wMzU4NCwgMS4wMTc1NiwgMSwgMSwgMS4wMzU4NCwgMS4wMTc1NiwgMS4wMDMyMywgMS4wMzQ0NCwgMS4wMTc1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45MzA2NiwgMC45ODI5MywgMC44MjgyNiwgMS4wNDM5OSwgMSwgMSwgMC44MjgyNiwgMS4wNDM5OSwgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMSwgMSwgMC44NTc3MSwgMS4xNzMxOCwgMC44NTc3MSwgMS4yMTk2OCwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45ODk2NSwgMS4wMDA2OCwgMC44Mjg3LCAwLjk2Nzc3LCAwLjgyODcsIDAuOTMzNjUsIDAuOTA0MywgMC45MzM2NSwgMC45MDQzLCAwLjkzMzY1LCAwLjkwNDMsIDEuMDg1NzEsIDAuOTY5MjcsIDAuOTY3MDYsIDAuOTE0ODQsIDAuODYwMzUsIDAuOTM1NzUsIDAuOTY5MjQsIDAuOTU5MjMsIDEsIDEsIDAuODU3NzEsIDEuMjE5NjgsIDEuMTE0MzcsIDEuMTE0MzcsIDAuOTMxMDksIDAuOTEyMDIsIDAuNjA0MTEsIDAuODQxNjQsIDAuNTU1NzIsIDEuMDExNzMsIDAuOTczNjEsIDAuODE4MTgsIDAuODE4MTgsIDAuOTY2MzUsIDAuNzgwMzIsIDAuNzI3MjcsIDAuOTIzNjYsIDAuOTg2MDEsIDEuMDM0MDUsIDAuNzc5NjgsIDEuMDk3OTksIDEuMiwgMC45NjcwNiwgMC44NTk0NCwgMC44NTYzOCwgMC45NjQ5MSwgMC43NTg0MiwgMC45MzM2NSwgMC45ODMxLCAwLjk2OTI0LCAwLjk1NzgyLCAwLjg2OTY5LCAwLjk0MTUyLCAxLjA3Nzk2LCAxLjAzNTg0LCAwLjc4NDM3LCAwLjk2OTI0LCAwLjk4NzE1LCAwLjgzOTY4LCAwLjgzNDkxLCAwLjg1NzcxLCAwLjgyODcsIDAuOTQ0OTIsIDAuODg0MzMsIDAuOTI4NywgMS4wMDk4LCAwLjk1NzgyLCAwLjgyODcsIDEuMDYyNSwgMC45ODI0OCwgMS4wMzQyNCwgMS4yLCAxLjAxMDcxLCAxLjA2MjUsIDAuOTUyNDYsIDEuMDM4MDksIDEuMDQ5MTIsIDAuOTgyNDgsIDEuMDAyMjEsIDEuMDM0MjQsIDEuMDU0NDMsIDEuMiwgMS4wNDc4NSwgMC45OTYwOSwgMS4wMDE2OSwgMS4wNTE3NiwgMC45OTM0NiwgMS4wNTM1NiwgMC45MDg3LCAxLjAzMDA0LCAwLjk1NTQyLCAwLjkzMTE3LCAxLjIzMzYyLCAxLjAxMDcxLCAxLjA3ODMxLCAxLjAyNTEyLCAxLjA1MjA1LCAxLjAzNTAyLCAxLjIsIDEuMDEwNzEsIDEuMDUzNTYsIDEuMDEwNzEsIDEuMDM1MDIsIDAuNzU4NDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDM3MTksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTQwMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNDAyMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45ODk2NSwgMS4wMDA2OCwgMC45ODk2NSwgMS4wMDA2OCwgMC45ODk2NSwgMS4wMDA2OCwgMC44Mjg3LCAwLjk2Nzc3LCAxLCAxLjIwMDg4LCAwLjg5OTAzLCAxLCAxLCAwLjc1MTU1LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjEzMTk2LCAxLjEzMTk2LCAxLjEzMTk2LCAwLjY3NDI4LCAwLjY3NDI4LCAxLjE2MDM5LCAwLjczMjkxLCAxLjIwOTk2LCAxLjIyMTM1LCAxLjA2NDgzLCAwLjk0ODY4LCAwLjk0ODY4LCAwLjk1OTk2LCAxLjI0NjMzLCAxLCAxLjA3NDk3LCAwLjg3Nzk2LCAwLjk2OTI3LCAxLjAxNTE4LCAwLjk2OTI3LCAxLCAxLCAxLCAwLjc3Mjk1LCAxLCAxLCAxLjEwNTM5LCAxLjEwNTM5LCAxLjExMzU4LCAxLjA2OTY3LCAwLjg2Mjc5LCAwLjk0NDM0LCAwLjg2Mjc5LCAwLjk0NDM0LCAwLjg2MTgyLCAxLCAxLCAxLjA4MywgMSwgMC45MTU3OCwgMC44NjUwNywgMS4xNzE0LCAxLjE4NDE2LCAxLjE0NTg5LCAwLjY5ODI1LCAwLjk3NjIyLCAxLjk2OTcsIDEuMjQ4MjIsIDEuMjQ4MjIsIDEuMTcyMzgsIDEuMjQ4MjIsIDEuMjQ4MjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuNDI2MDMsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDEuMTgwODMsIDEuNDI2MDMsIDEsIDEuNDI2MDMsIDEuNDI2MDMsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMjg4NiwgMS4wNDMxNSwgMS4xNTI5NiwgMS4zNDE2MywgMSwgMSwgMSwgMS4xMDkzOCwgMS4xMDkzOCwgMSwgMSwgMSwgMS4wNTQyNSwgMS4wOTk3MSwgMS4wOTk3MSwgMS4wOTk3MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IFNlZ29ldWlSZWd1bGFyTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjMzMDA4LAogIGxpbmVHYXA6IDAKfTsKCjsvLyAuL3NyYy9jb3JlL3hmYV9mb250cy5qcwoKCgoKCgoKCmNvbnN0IGdldFhGQUZvbnRNYXAgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WyJNeXJpYWRQcm8tUmVndWxhciJdID0gdFsiUGRmSlMtRmFsbGJhY2stUmVndWxhciJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLAogICAgZmFjdG9yczogTXlyaWFkUHJvUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IE15cmlhZFByb1JlZ3VsYXJNZXRyaWNzCiAgfTsKICB0WyJNeXJpYWRQcm8tQm9sZCJdID0gdFsiUGRmSlMtRmFsbGJhY2stQm9sZCJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGQiLAogICAgZmFjdG9yczogTXlyaWFkUHJvQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IE15cmlhZFByb0JvbGRNZXRyaWNzCiAgfTsKICB0WyJNeXJpYWRQcm8tSXQiXSA9IHRbIk15cmlhZFByby1JdGFsaWMiXSA9IHRbIlBkZkpTLUZhbGxiYWNrLUl0YWxpYyJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsCiAgICBmYWN0b3JzOiBNeXJpYWRQcm9JdGFsaWNGYWN0b3JzLAogICAgYmFzZVdpZHRoczogTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nLAogICAgbWV0cmljczogTXlyaWFkUHJvSXRhbGljTWV0cmljcwogIH07CiAgdFsiTXlyaWFkUHJvLUJvbGRJdCJdID0gdFsiTXlyaWFkUHJvLUJvbGRJdGFsaWMiXSA9IHRbIlBkZkpTLUZhbGxiYWNrLUJvbGRJdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIiwKICAgIGZhY3RvcnM6IE15cmlhZFByb0JvbGRJdGFsaWNGYWN0b3JzLAogICAgYmFzZVdpZHRoczogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IExpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBNeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljcwogIH07CiAgdC5BcmlhbE1UID0gdC5BcmlhbCA9IHRbIkFyaWFsLVJlZ3VsYXIiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nCiAgfTsKICB0WyJBcmlhbC1Cb2xkTVQiXSA9IHRbIkFyaWFsLUJvbGQiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zQm9sZFdpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0JvbGRNYXBwaW5nCiAgfTsKICB0WyJBcmlhbC1JdGFsaWNNVCJdID0gdFsiQXJpYWwtSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtSXRhbGljIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IExpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZwogIH07CiAgdFsiQXJpYWwtQm9sZEl0YWxpY01UIl0gPSB0WyJBcmlhbC1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZwogIH07CiAgdFsiQ2FsaWJyaS1SZWd1bGFyIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtUmVndWxhciIsCiAgICBmYWN0b3JzOiBDYWxpYnJpUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlSZWd1bGFyTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1Cb2xkIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZCIsCiAgICBmYWN0b3JzOiBDYWxpYnJpQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlCb2xkTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1JdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiLAogICAgZmFjdG9yczogQ2FsaWJyaUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBDYWxpYnJpSXRhbGljTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBmYWN0b3JzOiBDYWxpYnJpQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlCb2xkSXRhbGljTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1SZWd1bGFyIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtUmVndWxhciIsCiAgICBmYWN0b3JzOiBTZWdvZXVpUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlSZWd1bGFyTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1Cb2xkIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZCIsCiAgICBmYWN0b3JzOiBTZWdvZXVpQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlCb2xkTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1JdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiLAogICAgZmFjdG9yczogU2Vnb2V1aUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBTZWdvZXVpSXRhbGljTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBmYWN0b3JzOiBTZWdvZXVpQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlCb2xkSXRhbGljTWV0cmljcwogIH07CiAgdFsiSGVsdmV0aWNhLVJlZ3VsYXIiXSA9IHQuSGVsdmV0aWNhID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLAogICAgZmFjdG9yczogSGVsdmV0aWNhUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYVJlZ3VsYXJNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGQiLAogICAgZmFjdG9yczogSGVsdmV0aWNhQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYUJvbGRNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtSXRhbGljIiwKICAgIGZhY3RvcnM6IEhlbHZldGljYUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBIZWx2ZXRpY2FJdGFsaWNNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZEl0YWxpYyJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMiLAogICAgZmFjdG9yczogSGVsdmV0aWNhQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYUJvbGRJdGFsaWNNZXRyaWNzCiAgfTsKfSk7CmZ1bmN0aW9uIGdldFhmYUZvbnROYW1lKG5hbWUpIHsKICBjb25zdCBmb250TmFtZSA9IG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpOwogIGNvbnN0IGZvbnRNYXAgPSBnZXRYRkFGb250TWFwKCk7CiAgcmV0dXJuIGZvbnRNYXBbZm9udE5hbWVdOwp9CmZ1bmN0aW9uIGdldFhmYUZvbnRXaWR0aHMobmFtZSkgewogIGNvbnN0IGluZm8gPSBnZXRYZmFGb250TmFtZShuYW1lKTsKICBpZiAoIWluZm8pIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCB7CiAgICBiYXNlV2lkdGhzLAogICAgYmFzZU1hcHBpbmcsCiAgICBmYWN0b3JzCiAgfSA9IGluZm87CiAgY29uc3QgcmVzY2FsZWRCYXNlV2lkdGhzID0gIWZhY3RvcnMgPyBiYXNlV2lkdGhzIDogYmFzZVdpZHRocy5tYXAoKHcsIGkpID0+IHcgKiBmYWN0b3JzW2ldKTsKICBsZXQgY3VycmVudENvZGUgPSAtMjsKICBsZXQgY3VycmVudEFycmF5OwogIGNvbnN0IG5ld1dpZHRocyA9IFtdOwogIGZvciAoY29uc3QgW3VuaWNvZGUsIGdseXBoSW5kZXhdIG9mIGJhc2VNYXBwaW5nLm1hcCgoY2hhclVuaWNvZGUsIGluZGV4KSA9PiBbY2hhclVuaWNvZGUsIGluZGV4XSkuc29ydCgoW3VuaWNvZGUxXSwgW3VuaWNvZGUyXSkgPT4gdW5pY29kZTEgLSB1bmljb2RlMikpIHsKICAgIGlmICh1bmljb2RlID09PSAtMSkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICh1bmljb2RlID09PSBjdXJyZW50Q29kZSArIDEpIHsKICAgICAgY3VycmVudEFycmF5LnB1c2gocmVzY2FsZWRCYXNlV2lkdGhzW2dseXBoSW5kZXhdKTsKICAgICAgY3VycmVudENvZGUgKz0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnRDb2RlID0gdW5pY29kZTsKICAgICAgY3VycmVudEFycmF5ID0gW3Jlc2NhbGVkQmFzZVdpZHRoc1tnbHlwaEluZGV4XV07CiAgICAgIG5ld1dpZHRocy5wdXNoKHVuaWNvZGUsIGN1cnJlbnRBcnJheSk7CiAgICB9CiAgfQogIHJldHVybiBuZXdXaWR0aHM7Cn0KZnVuY3Rpb24gZ2V0WGZhRm9udERpY3QobmFtZSkgewogIGNvbnN0IHdpZHRocyA9IGdldFhmYUZvbnRXaWR0aHMobmFtZSk7CiAgY29uc3QgZGljdCA9IG5ldyBEaWN0KG51bGwpOwogIGRpY3Quc2V0KCJCYXNlRm9udCIsIE5hbWUuZ2V0KG5hbWUpKTsKICBkaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGb250IikpOwogIGRpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkNJREZvbnRUeXBlMiIpKTsKICBkaWN0LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiSWRlbnRpdHktSCIpKTsKICBkaWN0LnNldCgiQ0lEVG9HSURNYXAiLCBOYW1lLmdldCgiSWRlbnRpdHkiKSk7CiAgZGljdC5zZXQoIlciLCB3aWR0aHMpOwogIGRpY3Quc2V0KCJGaXJzdENoYXIiLCB3aWR0aHNbMF0pOwogIGRpY3Quc2V0KCJMYXN0Q2hhciIsIHdpZHRocy5hdCgtMikgKyB3aWR0aHMuYXQoLTEpLmxlbmd0aCAtIDEpOwogIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgRGljdChudWxsKTsKICBkaWN0LnNldCgiRm9udERlc2NyaXB0b3IiLCBkZXNjcmlwdG9yKTsKICBjb25zdCBzeXN0ZW1JbmZvID0gbmV3IERpY3QobnVsbCk7CiAgc3lzdGVtSW5mby5zZXQoIk9yZGVyaW5nIiwgIklkZW50aXR5Iik7CiAgc3lzdGVtSW5mby5zZXQoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CiAgc3lzdGVtSW5mby5zZXQoIlN1cHBsZW1lbnQiLCAwKTsKICBkaWN0LnNldCgiQ0lEU3lzdGVtSW5mbyIsIHN5c3RlbUluZm8pOwogIHJldHVybiBkaWN0Owp9Cgo7Ly8gLi9zcmMvY29yZS9wc19wYXJzZXIuanMKCgoKY2xhc3MgUG9zdFNjcmlwdFBhcnNlciB7CiAgY29uc3RydWN0b3IobGV4ZXIpIHsKICAgIHRoaXMubGV4ZXIgPSBsZXhlcjsKICAgIHRoaXMub3BlcmF0b3JzID0gW107CiAgICB0aGlzLnRva2VuID0gbnVsbDsKICAgIHRoaXMucHJldiA9IG51bGw7CiAgfQogIG5leHRUb2tlbigpIHsKICAgIHRoaXMucHJldiA9IHRoaXMudG9rZW47CiAgICB0aGlzLnRva2VuID0gdGhpcy5sZXhlci5nZXRUb2tlbigpOwogIH0KICBhY2NlcHQodHlwZSkgewogICAgaWYgKHRoaXMudG9rZW4udHlwZSA9PT0gdHlwZSkgewogICAgICB0aGlzLm5leHRUb2tlbigpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgZXhwZWN0KHR5cGUpIHsKICAgIGlmICh0aGlzLmFjY2VwdCh0eXBlKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5leHBlY3RlZCBzeW1ib2w6IGZvdW5kICR7dGhpcy50b2tlbi50eXBlfSBleHBlY3RlZCAke3R5cGV9LmApOwogIH0KICBwYXJzZSgpIHsKICAgIHRoaXMubmV4dFRva2VuKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpOwogICAgdGhpcy5wYXJzZUJsb2NrKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOwogICAgcmV0dXJuIHRoaXMub3BlcmF0b3JzOwogIH0KICBwYXJzZUJsb2NrKCkgewogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLk5VTUJFUikpIHsKICAgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuT1BFUkFUT1IpKSB7CiAgICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSkpIHsKICAgICAgICB0aGlzLnBhcnNlQ29uZGl0aW9uKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQogIHBhcnNlQ29uZGl0aW9uKCkgewogICAgY29uc3QgY29uZGl0aW9uTG9jYXRpb24gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CiAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKG51bGwsIG51bGwpOwogICAgdGhpcy5wYXJzZUJsb2NrKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOwogICAgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLklGKSkgewogICAgICB0aGlzLm9wZXJhdG9yc1tjb25kaXRpb25Mb2NhdGlvbl0gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uICsgMV0gPSAianoiOwogICAgfSBlbHNlIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpKSB7CiAgICAgIGNvbnN0IGp1bXBMb2NhdGlvbiA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaChudWxsLCBudWxsKTsKICAgICAgY29uc3QgZW5kT2ZUcnVlID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOwogICAgICB0aGlzLnBhcnNlQmxvY2soKTsKICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTsKICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuSUZFTFNFKTsKICAgICAgdGhpcy5vcGVyYXRvcnNbanVtcExvY2F0aW9uXSA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKICAgICAgdGhpcy5vcGVyYXRvcnNbanVtcExvY2F0aW9uICsgMV0gPSAiaiI7CiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uXSA9IGVuZE9mVHJ1ZTsKICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb24gKyAxXSA9ICJqeiI7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlBTIEZ1bmN0aW9uOiBlcnJvciBwYXJzaW5nIGNvbmRpdGlvbmFsLiIpOwogICAgfQogIH0KfQpjb25zdCBQb3N0U2NyaXB0VG9rZW5UeXBlcyA9IHsKICBMQlJBQ0U6IDAsCiAgUkJSQUNFOiAxLAogIE5VTUJFUjogMiwKICBPUEVSQVRPUjogMywKICBJRjogNCwKICBJRkVMU0U6IDUKfTsKY2xhc3MgUG9zdFNjcmlwdFRva2VuIHsKICBzdGF0aWMgZ2V0IG9wQ2FjaGUoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJvcENhY2hlIiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7CiAgfQogIGNvbnN0cnVjdG9yKHR5cGUsIHZhbHVlKSB7CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogIH0KICBzdGF0aWMgZ2V0T3BlcmF0b3Iob3ApIHsKICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4ub3BDYWNoZVtvcF0gfHw9IG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuT1BFUkFUT1IsIG9wKTsKICB9CiAgc3RhdGljIGdldCBMQlJBQ0UoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJMQlJBQ0UiLCBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSwgInsiKSk7CiAgfQogIHN0YXRpYyBnZXQgUkJSQUNFKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiUkJSQUNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UsICJ9IikpOwogIH0KICBzdGF0aWMgZ2V0IElGKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiSUYiLCBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLklGLCAiSUYiKSk7CiAgfQogIHN0YXRpYyBnZXQgSUZFTFNFKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiSUZFTFNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5JRkVMU0UsICJJRkVMU0UiKSk7CiAgfQp9CmNsYXNzIFBvc3RTY3JpcHRMZXhlciB7CiAgY29uc3RydWN0b3Ioc3RyZWFtKSB7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMubmV4dENoYXIoKTsKICAgIHRoaXMuc3RyQnVmID0gW107CiAgfQogIG5leHRDaGFyKCkgewogICAgcmV0dXJuIHRoaXMuY3VycmVudENoYXIgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CiAgfQogIGdldFRva2VuKCkgewogICAgbGV0IGNvbW1lbnQgPSBmYWxzZTsKICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoY2ggPCAwKSB7CiAgICAgICAgcmV0dXJuIEVPRjsKICAgICAgfQogICAgICBpZiAoY29tbWVudCkgewogICAgICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgewogICAgICAgICAgY29tbWVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyNSkgewogICAgICAgIGNvbW1lbnQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKCFpc1doaXRlU3BhY2UoY2gpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICB9CiAgICBzd2l0Y2ggKGNoIHwgMCkgewogICAgICBjYXNlIDB4MzA6CiAgICAgIGNhc2UgMHgzMToKICAgICAgY2FzZSAweDMyOgogICAgICBjYXNlIDB4MzM6CiAgICAgIGNhc2UgMHgzNDoKICAgICAgY2FzZSAweDM1OgogICAgICBjYXNlIDB4MzY6CiAgICAgIGNhc2UgMHgzNzoKICAgICAgY2FzZSAweDM4OgogICAgICBjYXNlIDB4Mzk6CiAgICAgIGNhc2UgMHgyYjoKICAgICAgY2FzZSAweDJkOgogICAgICBjYXNlIDB4MmU6CiAgICAgICAgcmV0dXJuIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuTlVNQkVSLCB0aGlzLmdldE51bWJlcigpKTsKICAgICAgY2FzZSAweDdiOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLkxCUkFDRTsKICAgICAgY2FzZSAweDdkOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLlJCUkFDRTsKICAgIH0KICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICBzdHJCdWZbMF0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiYgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg1YSB8fCBjaCA+PSAweDYxICYmIGNoIDw9IDB4N2EpKSB7CiAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgIH0KICAgIGNvbnN0IHN0ciA9IHN0ckJ1Zi5qb2luKCIiKTsKICAgIHN3aXRjaCAoc3RyLnRvTG93ZXJDYXNlKCkpIHsKICAgICAgY2FzZSAiaWYiOgogICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUY7CiAgICAgIGNhc2UgImlmZWxzZSI6CiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5JRkVMU0U7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5nZXRPcGVyYXRvcihzdHIpOwogICAgfQogIH0KICBnZXROdW1iZXIoKSB7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CiAgICBzdHJCdWYubGVuZ3RoID0gMDsKICAgIHN0ckJ1ZlswXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkgewogICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5IHx8IGNoID09PSAweDJkIHx8IGNoID09PSAweDJlKSB7CiAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQoc3RyQnVmLmpvaW4oIiIpKTsKICAgIGlmIChpc05hTih2YWx1ZSkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGZsb2F0aW5nIHBvaW50IG51bWJlcjogJHt2YWx1ZX1gKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2ltYWdlX3V0aWxzLmpzCgoKY2xhc3MgQmFzZUxvY2FsQ2FjaGUgewogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHRoaXMuX29ubHlSZWZzID0gb3B0aW9ucz8ub25seVJlZnMgPT09IHRydWU7CiAgICBpZiAoIXRoaXMuX29ubHlSZWZzKSB7CiAgICAgIHRoaXMuX25hbWVSZWZNYXAgPSBuZXcgTWFwKCk7CiAgICAgIHRoaXMuX2ltYWdlTWFwID0gbmV3IE1hcCgpOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogIH0KICBnZXRCeU5hbWUobmFtZSkgewogICAgaWYgKHRoaXMuX29ubHlSZWZzKSB7CiAgICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgYGdldEJ5TmFtZWAgbWV0aG9kLiIpOwogICAgfQogICAgY29uc3QgcmVmID0gdGhpcy5fbmFtZVJlZk1hcC5nZXQobmFtZSk7CiAgICBpZiAocmVmKSB7CiAgICAgIHJldHVybiB0aGlzLmdldEJ5UmVmKHJlZik7CiAgICB9CiAgICByZXR1cm4gdGhpcy5faW1hZ2VNYXAuZ2V0KG5hbWUpIHx8IG51bGw7CiAgfQogIGdldEJ5UmVmKHJlZikgewogICAgcmV0dXJuIHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KHJlZikgfHwgbnVsbDsKICB9CiAgc2V0KG5hbWUsIHJlZiwgZGF0YSkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgc2V0YCBjYWxsZWQuIik7CiAgfQp9CmNsYXNzIExvY2FsSW1hZ2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBzZXQobmFtZSwgcmVmID0gbnVsbCwgZGF0YSkgewogICAgaWYgKHR5cGVvZiBuYW1lICE9PSAic3RyaW5nIikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsSW1hZ2VDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAocmVmKSB7CiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7CiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZU1hcC5oYXMobmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VNYXAuc2V0KG5hbWUsIGRhdGEpOwogIH0KfQpjbGFzcyBMb2NhbENvbG9yU3BhY2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBzZXQobmFtZSA9IG51bGwsIHJlZiA9IG51bGwsIGRhdGEpIHsKICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gInN0cmluZyIgJiYgIXJlZikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhbmQvb3IgInJlZiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAocmVmKSB7CiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChuYW1lICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTsKICAgICAgfQogICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VNYXAuaGFzKG5hbWUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2ltYWdlTWFwLnNldChuYW1lLCBkYXRhKTsKICB9Cn0KY2xhc3MgTG9jYWxGdW5jdGlvbkNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgewogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHN1cGVyKHsKICAgICAgb25seVJlZnM6IHRydWUKICAgIH0pOwogIH0KICBzZXQobmFtZSA9IG51bGwsIHJlZiwgZGF0YSkgewogICAgaWYgKCFyZWYpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbEZ1bmN0aW9uQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogIH0KfQpjbGFzcyBMb2NhbEdTdGF0ZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgewogIHNldChuYW1lLCByZWYgPSBudWxsLCBkYXRhKSB7CiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxHU3RhdGVDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAocmVmKSB7CiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7CiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZU1hcC5oYXMobmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VNYXAuc2V0KG5hbWUsIGRhdGEpOwogIH0KfQpjbGFzcyBMb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICBzdXBlcih7CiAgICAgIG9ubHlSZWZzOiB0cnVlCiAgICB9KTsKICB9CiAgc2V0KG5hbWUgPSBudWxsLCByZWYsIGRhdGEpIHsKICAgIGlmICghcmVmKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogIH0KfQpjbGFzcyBSZWdpb25hbEltYWdlQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZSB7CiAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgc3VwZXIoewogICAgICBvbmx5UmVmczogdHJ1ZQogICAgfSk7CiAgfQogIHNldChuYW1lID0gbnVsbCwgcmVmLCBkYXRhKSB7CiAgICBpZiAoIXJlZikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQgLSBleHBlY3RlZCAicmVmIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgfQp9CmNsYXNzIEdsb2JhbENvbG9yU3BhY2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICBzdXBlcih7CiAgICAgIG9ubHlSZWZzOiB0cnVlCiAgICB9KTsKICB9CiAgc2V0KG5hbWUgPSBudWxsLCByZWYsIGRhdGEpIHsKICAgIGlmICghcmVmKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignR2xvYmFsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJyZWYiIGFyZ3VtZW50LicpOwogICAgfQogICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKICB9CiAgY2xlYXIoKSB7CiAgICB0aGlzLl9pbWFnZUNhY2hlLmNsZWFyKCk7CiAgfQp9CmNsYXNzIEdsb2JhbEltYWdlQ2FjaGUgewogIHN0YXRpYyBOVU1fUEFHRVNfVEhSRVNIT0xEID0gMjsKICBzdGF0aWMgTUlOX0lNQUdFU19UT19DQUNIRSA9IDEwOwogIHN0YXRpYyBNQVhfQllURV9TSVpFID0gNWU3OwogICNkZWNvZGVGYWlsZWRTZXQgPSBuZXcgUmVmU2V0KCk7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLl9yZWZDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgdGhpcy5faW1hZ2VDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogIH0KICBnZXQgI2J5dGVTaXplKCkgewogICAgbGV0IGJ5dGVTaXplID0gMDsKICAgIGZvciAoY29uc3QgaW1hZ2VEYXRhIG9mIHRoaXMuX2ltYWdlQ2FjaGUpIHsKICAgICAgYnl0ZVNpemUgKz0gaW1hZ2VEYXRhLmJ5dGVTaXplOwogICAgfQogICAgcmV0dXJuIGJ5dGVTaXplOwogIH0KICBnZXQgI2NhY2hlTGltaXRSZWFjaGVkKCkgewogICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuc2l6ZSA8IEdsb2JhbEltYWdlQ2FjaGUuTUlOX0lNQUdFU19UT19DQUNIRSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy4jYnl0ZVNpemUgPCBHbG9iYWxJbWFnZUNhY2hlLk1BWF9CWVRFX1NJWkUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIHNob3VsZENhY2hlKHJlZiwgcGFnZUluZGV4KSB7CiAgICBsZXQgcGFnZUluZGV4U2V0ID0gdGhpcy5fcmVmQ2FjaGUuZ2V0KHJlZik7CiAgICBpZiAoIXBhZ2VJbmRleFNldCkgewogICAgICBwYWdlSW5kZXhTZXQgPSBuZXcgU2V0KCk7CiAgICAgIHRoaXMuX3JlZkNhY2hlLnB1dChyZWYsIHBhZ2VJbmRleFNldCk7CiAgICB9CiAgICBwYWdlSW5kZXhTZXQuYWRkKHBhZ2VJbmRleCk7CiAgICBpZiAocGFnZUluZGV4U2V0LnNpemUgPCBHbG9iYWxJbWFnZUNhY2hlLk5VTV9QQUdFU19USFJFU0hPTEQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpICYmIHRoaXMuI2NhY2hlTGltaXRSZWFjaGVkKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBhZGREZWNvZGVGYWlsZWQocmVmKSB7CiAgICB0aGlzLiNkZWNvZGVGYWlsZWRTZXQucHV0KHJlZik7CiAgfQogIGhhc0RlY29kZUZhaWxlZChyZWYpIHsKICAgIHJldHVybiB0aGlzLiNkZWNvZGVGYWlsZWRTZXQuaGFzKHJlZik7CiAgfQogIGFkZEJ5dGVTaXplKHJlZiwgYnl0ZVNpemUpIHsKICAgIGNvbnN0IGltYWdlRGF0YSA9IHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KHJlZik7CiAgICBpZiAoIWltYWdlRGF0YSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW1hZ2VEYXRhLmJ5dGVTaXplKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGltYWdlRGF0YS5ieXRlU2l6ZSA9IGJ5dGVTaXplOwogIH0KICBnZXREYXRhKHJlZiwgcGFnZUluZGV4KSB7CiAgICBjb25zdCBwYWdlSW5kZXhTZXQgPSB0aGlzLl9yZWZDYWNoZS5nZXQocmVmKTsKICAgIGlmICghcGFnZUluZGV4U2V0KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHBhZ2VJbmRleFNldC5zaXplIDwgR2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKTsKICAgIGlmICghaW1hZ2VEYXRhKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcGFnZUluZGV4U2V0LmFkZChwYWdlSW5kZXgpOwogICAgcmV0dXJuIGltYWdlRGF0YTsKICB9CiAgc2V0RGF0YShyZWYsIGRhdGEpIHsKICAgIGlmICghdGhpcy5fcmVmQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdHbG9iYWxJbWFnZUNhY2hlLnNldERhdGEgLSBleHBlY3RlZCAic2hvdWxkQ2FjaGUiIHRvIGhhdmUgYmVlbiBjYWxsZWQuJyk7CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy4jY2FjaGVMaW1pdFJlYWNoZWQpIHsKICAgICAgd2FybigiR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gY2FjaGUgbGltaXQgcmVhY2hlZC4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKICB9CiAgY2xlYXIob25seURhdGEgPSBmYWxzZSkgewogICAgaWYgKCFvbmx5RGF0YSkgewogICAgICB0aGlzLiNkZWNvZGVGYWlsZWRTZXQuY2xlYXIoKTsKICAgICAgdGhpcy5fcmVmQ2FjaGUuY2xlYXIoKTsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUuY2xlYXIoKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2Z1bmN0aW9uLmpzCgoKCgoKCmNsYXNzIFBERkZ1bmN0aW9uRmFjdG9yeSB7CiAgY29uc3RydWN0b3IoewogICAgeHJlZiwKICAgIGlzRXZhbFN1cHBvcnRlZCA9IHRydWUKICB9KSB7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5pc0V2YWxTdXBwb3J0ZWQgPSBpc0V2YWxTdXBwb3J0ZWQgIT09IGZhbHNlOwogIH0KICBjcmVhdGUoZm4sIHBhcnNlQXJyYXkgPSBmYWxzZSkgewogICAgbGV0IGZuUmVmLCBwYXJzZWRGbjsKICAgIGlmIChmbiBpbnN0YW5jZW9mIFJlZikgewogICAgICBmblJlZiA9IGZuOwogICAgfSBlbHNlIGlmIChmbiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgZm5SZWYgPSBmbi5vYmpJZDsKICAgIH0gZWxzZSBpZiAoZm4gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIGZuUmVmID0gZm4uZGljdD8ub2JqSWQ7CiAgICB9CiAgICBpZiAoZm5SZWYpIHsKICAgICAgY29uc3QgY2FjaGVkRm4gPSB0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUuZ2V0QnlSZWYoZm5SZWYpOwogICAgICBpZiAoY2FjaGVkRm4pIHsKICAgICAgICByZXR1cm4gY2FjaGVkRm47CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGZuT2JqID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZm4pOwogICAgaWYgKEFycmF5LmlzQXJyYXkoZm5PYmopKSB7CiAgICAgIGlmICghcGFyc2VBcnJheSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignUERGRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZSAtIGV4cGVjdGVkICJwYXJzZUFycmF5IiBhcmd1bWVudC4nKTsKICAgICAgfQogICAgICBwYXJzZWRGbiA9IFBERkZ1bmN0aW9uLnBhcnNlQXJyYXkodGhpcywgZm5PYmopOwogICAgfSBlbHNlIHsKICAgICAgcGFyc2VkRm4gPSBQREZGdW5jdGlvbi5wYXJzZSh0aGlzLCBmbk9iaik7CiAgICB9CiAgICBpZiAoZm5SZWYpIHsKICAgICAgdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlLnNldChudWxsLCBmblJlZiwgcGFyc2VkRm4pOwogICAgfQogICAgcmV0dXJuIHBhcnNlZEZuOwogIH0KICBnZXQgX2xvY2FsRnVuY3Rpb25DYWNoZSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9sb2NhbEZ1bmN0aW9uQ2FjaGUiLCBuZXcgTG9jYWxGdW5jdGlvbkNhY2hlKCkpOwogIH0KfQpmdW5jdGlvbiB0b051bWJlckFycmF5KGFycikgewogIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaWYgKCFpc051bWJlckFycmF5KGFyciwgbnVsbCkpIHsKICAgIHJldHVybiBhcnIubWFwKHggPT4gK3gpOwogIH0KICByZXR1cm4gYXJyOwp9CmNsYXNzIFBERkZ1bmN0aW9uIHsKICBzdGF0aWMgZ2V0U2FtcGxlQXJyYXkoc2l6ZSwgb3V0cHV0U2l6ZSwgYnBzLCBzdHJlYW0pIHsKICAgIGxldCBpLCBpaTsKICAgIGxldCBsZW5ndGggPSAxOwogICAgZm9yIChpID0gMCwgaWkgPSBzaXplLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgbGVuZ3RoICo9IHNpemVbaV07CiAgICB9CiAgICBsZW5ndGggKj0gb3V0cHV0U2l6ZTsKICAgIGNvbnN0IGFycmF5ID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICBsZXQgY29kZVNpemUgPSAwOwogICAgbGV0IGNvZGVCdWYgPSAwOwogICAgY29uc3Qgc2FtcGxlTXVsID0gMS4wIC8gKDIuMCAqKiBicHMgLSAxKTsKICAgIGNvbnN0IHN0ckJ5dGVzID0gc3RyZWFtLmdldEJ5dGVzKChsZW5ndGggKiBicHMgKyA3KSAvIDgpOwogICAgbGV0IHN0cklkeCA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgd2hpbGUgKGNvZGVTaXplIDwgYnBzKSB7CiAgICAgICAgY29kZUJ1ZiA8PD0gODsKICAgICAgICBjb2RlQnVmIHw9IHN0ckJ5dGVzW3N0cklkeCsrXTsKICAgICAgICBjb2RlU2l6ZSArPSA4OwogICAgICB9CiAgICAgIGNvZGVTaXplIC09IGJwczsKICAgICAgYXJyYXlbaV0gPSAoY29kZUJ1ZiA+PiBjb2RlU2l6ZSkgKiBzYW1wbGVNdWw7CiAgICAgIGNvZGVCdWYgJj0gKDEgPDwgY29kZVNpemUpIC0gMTsKICAgIH0KICAgIHJldHVybiBhcnJheTsKICB9CiAgc3RhdGljIHBhcnNlKGZhY3RvcnksIGZuKSB7CiAgICBjb25zdCBkaWN0ID0gZm4uZGljdCB8fCBmbjsKICAgIGNvbnN0IHR5cGVOdW0gPSBkaWN0LmdldCgiRnVuY3Rpb25UeXBlIik7CiAgICBzd2l0Y2ggKHR5cGVOdW0pIHsKICAgICAgY2FzZSAwOgogICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFNhbXBsZWQoZmFjdG9yeSwgZm4sIGRpY3QpOwogICAgICBjYXNlIDE6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RJbnRlcnBvbGF0ZWQoZmFjdG9yeSwgZGljdCk7CiAgICAgIGNhc2UgMzoKICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RTdGljaGVkKGZhY3RvcnksIGRpY3QpOwogICAgICBjYXNlIDQ6CiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0UG9zdFNjcmlwdChmYWN0b3J5LCBmbiwgZGljdCk7CiAgICB9CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZSBvZiBmdW5jdGlvbiIpOwogIH0KICBzdGF0aWMgcGFyc2VBcnJheShmYWN0b3J5LCBmbk9iaikgewogICAgY29uc3QgewogICAgICB4cmVmCiAgICB9ID0gZmFjdG9yeTsKICAgIGNvbnN0IGZuQXJyYXkgPSBbXTsKICAgIGZvciAoY29uc3QgZm4gb2YgZm5PYmopIHsKICAgICAgZm5BcnJheS5wdXNoKHRoaXMucGFyc2UoZmFjdG9yeSwgeHJlZi5mZXRjaElmUmVmKGZuKSkpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uIChzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmbkFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBmbkFycmF5W2ldKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0ICsgaSk7CiAgICAgIH0KICAgIH07CiAgfQogIHN0YXRpYyBjb25zdHJ1Y3RTYW1wbGVkKGZhY3RvcnksIGZuLCBkaWN0KSB7CiAgICBmdW5jdGlvbiB0b011bHRpQXJyYXkoYXJyKSB7CiAgICAgIGNvbnN0IGlucHV0TGVuZ3RoID0gYXJyLmxlbmd0aDsKICAgICAgY29uc3Qgb3V0ID0gW107CiAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRMZW5ndGg7IGkgKz0gMikgewogICAgICAgIG91dFtpbmRleCsrXSA9IFthcnJbaV0sIGFycltpICsgMV1dOwogICAgICB9CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZSh4LCB4bWluLCB4bWF4LCB5bWluLCB5bWF4KSB7CiAgICAgIHJldHVybiB5bWluICsgKHggLSB4bWluKSAqICgoeW1heCAtIHltaW4pIC8gKHhtYXggLSB4bWluKSk7CiAgICB9CiAgICBsZXQgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CiAgICBsZXQgcmFuZ2UgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIlJhbmdlIikpOwogICAgaWYgKCFkb21haW4gfHwgIXJhbmdlKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gZG9tYWluIG9yIHJhbmdlIik7CiAgICB9CiAgICBjb25zdCBpbnB1dFNpemUgPSBkb21haW4ubGVuZ3RoIC8gMjsKICAgIGNvbnN0IG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggLyAyOwogICAgZG9tYWluID0gdG9NdWx0aUFycmF5KGRvbWFpbik7CiAgICByYW5nZSA9IHRvTXVsdGlBcnJheShyYW5nZSk7CiAgICBjb25zdCBzaXplID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJTaXplIikpOwogICAgY29uc3QgYnBzID0gZGljdC5nZXQoIkJpdHNQZXJTYW1wbGUiKTsKICAgIGNvbnN0IG9yZGVyID0gZGljdC5nZXQoIk9yZGVyIikgfHwgMTsKICAgIGlmIChvcmRlciAhPT0gMSkgewogICAgICBpbmZvKCJObyBzdXBwb3J0IGZvciBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhdGlvbjogIiArIG9yZGVyKTsKICAgIH0KICAgIGxldCBlbmNvZGUgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkVuY29kZSIpKTsKICAgIGlmICghZW5jb2RlKSB7CiAgICAgIGVuY29kZSA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0U2l6ZTsgKytpKSB7CiAgICAgICAgZW5jb2RlLnB1c2goWzAsIHNpemVbaV0gLSAxXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVuY29kZSA9IHRvTXVsdGlBcnJheShlbmNvZGUpOwogICAgfQogICAgbGV0IGRlY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRGVjb2RlIikpOwogICAgZGVjb2RlID0gIWRlY29kZSA/IHJhbmdlIDogdG9NdWx0aUFycmF5KGRlY29kZSk7CiAgICBjb25zdCBzYW1wbGVzID0gdGhpcy5nZXRTYW1wbGVBcnJheShzaXplLCBvdXRwdXRTaXplLCBicHMsIGZuKTsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTYW1wbGVkRm4oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgY29uc3QgY3ViZVZlcnRpY2VzID0gMSA8PCBpbnB1dFNpemU7CiAgICAgIGNvbnN0IGN1YmVOID0gbmV3IEZsb2F0NjRBcnJheShjdWJlVmVydGljZXMpLmZpbGwoMSk7CiAgICAgIGNvbnN0IGN1YmVWZXJ0ZXggPSBuZXcgVWludDMyQXJyYXkoY3ViZVZlcnRpY2VzKTsKICAgICAgbGV0IGksIGo7CiAgICAgIGxldCBrID0gb3V0cHV0U2l6ZSwKICAgICAgICBwb3MgPSAxOwogICAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXRTaXplOyArK2kpIHsKICAgICAgICBjb25zdCBkb21haW5fMmkgPSBkb21haW5baV1bMF07CiAgICAgICAgY29uc3QgZG9tYWluXzJpXzEgPSBkb21haW5baV1bMV07CiAgICAgICAgY29uc3QgeGkgPSBNYXRoQ2xhbXAoc3JjW3NyY09mZnNldCArIGldLCBkb21haW5fMmksIGRvbWFpbl8yaV8xKTsKICAgICAgICBsZXQgZSA9IGludGVycG9sYXRlKHhpLCBkb21haW5fMmksIGRvbWFpbl8yaV8xLCBlbmNvZGVbaV1bMF0sIGVuY29kZVtpXVsxXSk7CiAgICAgICAgY29uc3Qgc2l6ZV9pID0gc2l6ZVtpXTsKICAgICAgICBlID0gTWF0aENsYW1wKGUsIDAsIHNpemVfaSAtIDEpOwogICAgICAgIGNvbnN0IGUwID0gZSA8IHNpemVfaSAtIDEgPyBNYXRoLmZsb29yKGUpIDogZSAtIDE7CiAgICAgICAgY29uc3QgbjAgPSBlMCArIDEgLSBlOwogICAgICAgIGNvbnN0IG4xID0gZSAtIGUwOwogICAgICAgIGNvbnN0IG9mZnNldDAgPSBlMCAqIGs7CiAgICAgICAgY29uc3Qgb2Zmc2V0MSA9IG9mZnNldDAgKyBrOwogICAgICAgIGZvciAoaiA9IDA7IGogPCBjdWJlVmVydGljZXM7IGorKykgewogICAgICAgICAgaWYgKGogJiBwb3MpIHsKICAgICAgICAgICAgY3ViZU5bal0gKj0gbjE7CiAgICAgICAgICAgIGN1YmVWZXJ0ZXhbal0gKz0gb2Zmc2V0MTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN1YmVOW2pdICo9IG4wOwogICAgICAgICAgICBjdWJlVmVydGV4W2pdICs9IG9mZnNldDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGsgKj0gc2l6ZV9pOwogICAgICAgIHBvcyA8PD0gMTsKICAgICAgfQogICAgICBmb3IgKGogPSAwOyBqIDwgb3V0cHV0U2l6ZTsgKytqKSB7CiAgICAgICAgbGV0IHJqID0gMDsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3ViZVZlcnRpY2VzOyBpKyspIHsKICAgICAgICAgIHJqICs9IHNhbXBsZXNbY3ViZVZlcnRleFtpXSArIGpdICogY3ViZU5baV07CiAgICAgICAgfQogICAgICAgIHJqID0gaW50ZXJwb2xhdGUocmosIDAsIDEsIGRlY29kZVtqXVswXSwgZGVjb2RlW2pdWzFdKTsKICAgICAgICBkZXN0W2Rlc3RPZmZzZXQgKyBqXSA9IE1hdGhDbGFtcChyaiwgcmFuZ2Vbal1bMF0sIHJhbmdlW2pdWzFdKTsKICAgICAgfQogICAgfTsKICB9CiAgc3RhdGljIGNvbnN0cnVjdEludGVycG9sYXRlZChmYWN0b3J5LCBkaWN0KSB7CiAgICBjb25zdCBjMCA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiQzAiKSkgfHwgWzBdOwogICAgY29uc3QgYzEgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkMxIikpIHx8IFsxXTsKICAgIGNvbnN0IG4gPSBkaWN0LmdldCgiTiIpOwogICAgY29uc3QgZGlmZiA9IFtdOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYzAubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBkaWZmLnB1c2goYzFbaV0gLSBjMFtpXSk7CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBkaWZmLmxlbmd0aDsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGbihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBjb25zdCB4ID0gbiA9PT0gMSA/IHNyY1tzcmNPZmZzZXRdIDogc3JjW3NyY09mZnNldF0gKiogbjsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgewogICAgICAgIGRlc3RbZGVzdE9mZnNldCArIGpdID0gYzBbal0gKyB4ICogZGlmZltqXTsKICAgICAgfQogICAgfTsKICB9CiAgc3RhdGljIGNvbnN0cnVjdFN0aWNoZWQoZmFjdG9yeSwgZGljdCkgewogICAgY29uc3QgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CiAgICBpZiAoIWRvbWFpbikgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk5vIGRvbWFpbiIpOwogICAgfQogICAgY29uc3QgaW5wdXRTaXplID0gZG9tYWluLmxlbmd0aCAvIDI7CiAgICBpZiAoaW5wdXRTaXplICE9PSAxKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGRvbWFpbiBmb3Igc3RpY2hlZCBmdW5jdGlvbiIpOwogICAgfQogICAgY29uc3QgewogICAgICB4cmVmCiAgICB9ID0gZmFjdG9yeTsKICAgIGNvbnN0IGZucyA9IFtdOwogICAgZm9yIChjb25zdCBmbiBvZiBkaWN0LmdldCgiRnVuY3Rpb25zIikpIHsKICAgICAgZm5zLnB1c2godGhpcy5wYXJzZShmYWN0b3J5LCB4cmVmLmZldGNoSWZSZWYoZm4pKSk7CiAgICB9CiAgICBjb25zdCBib3VuZHMgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkJvdW5kcyIpKTsKICAgIGNvbnN0IGVuY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRW5jb2RlIikpOwogICAgY29uc3QgdG1wQnVmID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRm4oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgY29uc3QgdiA9IE1hdGhDbGFtcChzcmNbc3JjT2Zmc2V0XSwgZG9tYWluWzBdLCBkb21haW5bMV0pOwogICAgICBjb25zdCBsZW5ndGggPSBib3VuZHMubGVuZ3RoOwogICAgICBsZXQgaTsKICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKHYgPCBib3VuZHNbaV0pIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgZG1pbiA9IGRvbWFpblswXTsKICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgZG1pbiA9IGJvdW5kc1tpIC0gMV07CiAgICAgIH0KICAgICAgbGV0IGRtYXggPSBkb21haW5bMV07CiAgICAgIGlmIChpIDwgYm91bmRzLmxlbmd0aCkgewogICAgICAgIGRtYXggPSBib3VuZHNbaV07CiAgICAgIH0KICAgICAgY29uc3Qgcm1pbiA9IGVuY29kZVsyICogaV07CiAgICAgIGNvbnN0IHJtYXggPSBlbmNvZGVbMiAqIGkgKyAxXTsKICAgICAgdG1wQnVmWzBdID0gZG1pbiA9PT0gZG1heCA/IHJtaW4gOiBybWluICsgKHYgLSBkbWluKSAqIChybWF4IC0gcm1pbikgLyAoZG1heCAtIGRtaW4pOwogICAgICBmbnNbaV0odG1wQnVmLCAwLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICAgIH07CiAgfQogIHN0YXRpYyBjb25zdHJ1Y3RQb3N0U2NyaXB0KGZhY3RvcnksIGZuLCBkaWN0KSB7CiAgICBjb25zdCBkb21haW4gPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpKTsKICAgIGNvbnN0IHJhbmdlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJSYW5nZSIpKTsKICAgIGlmICghZG9tYWluKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gZG9tYWluLiIpOwogICAgfQogICAgaWYgKCFyYW5nZSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk5vIHJhbmdlLiIpOwogICAgfQogICAgY29uc3QgbGV4ZXIgPSBuZXcgUG9zdFNjcmlwdExleGVyKGZuKTsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQb3N0U2NyaXB0UGFyc2VyKGxleGVyKTsKICAgIGNvbnN0IGNvZGUgPSBwYXJzZXIucGFyc2UoKTsKICAgIGlmIChmYWN0b3J5LmlzRXZhbFN1cHBvcnRlZCAmJiBGZWF0dXJlVGVzdC5pc0V2YWxTdXBwb3J0ZWQpIHsKICAgICAgY29uc3QgY29tcGlsZWQgPSBuZXcgUG9zdFNjcmlwdENvbXBpbGVyKCkuY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKTsKICAgICAgaWYgKGNvbXBpbGVkKSB7CiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbigic3JjIiwgInNyY09mZnNldCIsICJkZXN0IiwgImRlc3RPZmZzZXQiLCBjb21waWxlZCk7CiAgICAgIH0KICAgIH0KICAgIGluZm8oIlVuYWJsZSB0byBjb21waWxlIFBTIGZ1bmN0aW9uIik7CiAgICBjb25zdCBudW1PdXRwdXRzID0gcmFuZ2UubGVuZ3RoID4+IDE7CiAgICBjb25zdCBudW1JbnB1dHMgPSBkb21haW4ubGVuZ3RoID4+IDE7CiAgICBjb25zdCBldmFsdWF0b3IgPSBuZXcgUG9zdFNjcmlwdEV2YWx1YXRvcihjb2RlKTsKICAgIGNvbnN0IGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IE1BWF9DQUNIRV9TSVpFID0gMjA0OCAqIDQ7CiAgICBsZXQgY2FjaGVfYXZhaWxhYmxlID0gTUFYX0NBQ0hFX1NJWkU7CiAgICBjb25zdCB0bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUlucHV0cyk7CiAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0UG9zdFNjcmlwdEZuKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICAgIGxldCBpLCB2YWx1ZTsKICAgICAgbGV0IGtleSA9ICIiOwogICAgICBjb25zdCBpbnB1dCA9IHRtcEJ1ZjsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bUlucHV0czsgaSsrKSB7CiAgICAgICAgdmFsdWUgPSBzcmNbc3JjT2Zmc2V0ICsgaV07CiAgICAgICAgaW5wdXRbaV0gPSB2YWx1ZTsKICAgICAgICBrZXkgKz0gdmFsdWUgKyAiXyI7CiAgICAgIH0KICAgICAgY29uc3QgY2FjaGVkVmFsdWUgPSBjYWNoZVtrZXldOwogICAgICBpZiAoY2FjaGVkVmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGRlc3Quc2V0KGNhY2hlZFZhbHVlLCBkZXN0T2Zmc2V0KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShudW1PdXRwdXRzKTsKICAgICAgY29uc3Qgc3RhY2sgPSBldmFsdWF0b3IuZXhlY3V0ZShpbnB1dCk7CiAgICAgIGNvbnN0IHN0YWNrSW5kZXggPSBzdGFjay5sZW5ndGggLSBudW1PdXRwdXRzOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtT3V0cHV0czsgaSsrKSB7CiAgICAgICAgdmFsdWUgPSBzdGFja1tzdGFja0luZGV4ICsgaV07CiAgICAgICAgbGV0IGJvdW5kID0gcmFuZ2VbaSAqIDJdOwogICAgICAgIGlmICh2YWx1ZSA8IGJvdW5kKSB7CiAgICAgICAgICB2YWx1ZSA9IGJvdW5kOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBib3VuZCA9IHJhbmdlW2kgKiAyICsgMV07CiAgICAgICAgICBpZiAodmFsdWUgPiBib3VuZCkgewogICAgICAgICAgICB2YWx1ZSA9IGJvdW5kOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvdXRwdXRbaV0gPSB2YWx1ZTsKICAgICAgfQogICAgICBpZiAoY2FjaGVfYXZhaWxhYmxlID4gMCkgewogICAgICAgIGNhY2hlX2F2YWlsYWJsZS0tOwogICAgICAgIGNhY2hlW2tleV0gPSBvdXRwdXQ7CiAgICAgIH0KICAgICAgZGVzdC5zZXQob3V0cHV0LCBkZXN0T2Zmc2V0KTsKICAgIH07CiAgfQp9CmZ1bmN0aW9uIGlzUERGRnVuY3Rpb24odikgewogIGxldCBmbkRpY3Q7CiAgaWYgKHYgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBmbkRpY3QgPSB2OwogIH0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgIGZuRGljdCA9IHYuZGljdDsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gZm5EaWN0LmhhcygiRnVuY3Rpb25UeXBlIik7Cn0KY2xhc3MgUG9zdFNjcmlwdFN0YWNrIHsKICBzdGF0aWMgTUFYX1NUQUNLX1NJWkUgPSAxMDA7CiAgY29uc3RydWN0b3IoaW5pdGlhbFN0YWNrKSB7CiAgICB0aGlzLnN0YWNrID0gaW5pdGlhbFN0YWNrID8gQXJyYXkuZnJvbShpbml0aWFsU3RhY2spIDogW107CiAgfQogIHB1c2godmFsdWUpIHsKICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA+PSBQb3N0U2NyaXB0U3RhY2suTUFYX1NUQUNLX1NJWkUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIG92ZXJmbG93LiIpOwogICAgfQogICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKICB9CiAgcG9wKCkgewogICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDw9IDApIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIHVuZGVyZmxvdy4iKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnN0YWNrLnBvcCgpOwogIH0KICBjb3B5KG4pIHsKICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCArIG4gPj0gUG9zdFNjcmlwdFN0YWNrLk1BWF9TVEFDS19TSVpFKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayBvdmVyZmxvdy4iKTsKICAgIH0KICAgIGNvbnN0IHN0YWNrID0gdGhpcy5zdGFjazsKICAgIGZvciAobGV0IGkgPSBzdGFjay5sZW5ndGggLSBuLCBqID0gbiAtIDE7IGogPj0gMDsgai0tLCBpKyspIHsKICAgICAgc3RhY2sucHVzaChzdGFja1tpXSk7CiAgICB9CiAgfQogIGluZGV4KG4pIHsKICAgIHRoaXMucHVzaCh0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbiAtIDFdKTsKICB9CiAgcm9sbChuLCBwKSB7CiAgICBjb25zdCBzdGFjayA9IHRoaXMuc3RhY2s7CiAgICBjb25zdCBsID0gc3RhY2subGVuZ3RoIC0gbjsKICAgIGNvbnN0IHIgPSBzdGFjay5sZW5ndGggLSAxOwogICAgY29uc3QgYyA9IGwgKyAocCAtIE1hdGguZmxvb3IocCAvIG4pICogbik7CiAgICBmb3IgKGxldCBpID0gbCwgaiA9IHI7IGkgPCBqOyBpKyssIGotLSkgewogICAgICBjb25zdCB0ID0gc3RhY2tbaV07CiAgICAgIHN0YWNrW2ldID0gc3RhY2tbal07CiAgICAgIHN0YWNrW2pdID0gdDsKICAgIH0KICAgIGZvciAobGV0IGkgPSBsLCBqID0gYyAtIDE7IGkgPCBqOyBpKyssIGotLSkgewogICAgICBjb25zdCB0ID0gc3RhY2tbaV07CiAgICAgIHN0YWNrW2ldID0gc3RhY2tbal07CiAgICAgIHN0YWNrW2pdID0gdDsKICAgIH0KICAgIGZvciAobGV0IGkgPSBjLCBqID0gcjsgaSA8IGo7IGkrKywgai0tKSB7CiAgICAgIGNvbnN0IHQgPSBzdGFja1tpXTsKICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKICAgICAgc3RhY2tbal0gPSB0OwogICAgfQogIH0KfQpjbGFzcyBQb3N0U2NyaXB0RXZhbHVhdG9yIHsKICBjb25zdHJ1Y3RvcihvcGVyYXRvcnMpIHsKICAgIHRoaXMub3BlcmF0b3JzID0gb3BlcmF0b3JzOwogIH0KICBleGVjdXRlKGluaXRpYWxTdGFjaykgewogICAgY29uc3Qgc3RhY2sgPSBuZXcgUG9zdFNjcmlwdFN0YWNrKGluaXRpYWxTdGFjayk7CiAgICBsZXQgY291bnRlciA9IDA7CiAgICBjb25zdCBvcGVyYXRvcnMgPSB0aGlzLm9wZXJhdG9yczsKICAgIGNvbnN0IGxlbmd0aCA9IG9wZXJhdG9ycy5sZW5ndGg7CiAgICBsZXQgb3BlcmF0b3IsIGEsIGI7CiAgICB3aGlsZSAoY291bnRlciA8IGxlbmd0aCkgewogICAgICBvcGVyYXRvciA9IG9wZXJhdG9yc1tjb3VudGVyKytdOwogICAgICBpZiAodHlwZW9mIG9wZXJhdG9yID09PSAibnVtYmVyIikgewogICAgICAgIHN0YWNrLnB1c2gob3BlcmF0b3IpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgICAgICBjYXNlICJqeiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAoIWEpIHsKICAgICAgICAgICAgY291bnRlciA9IGI7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJqIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGNvdW50ZXIgPSBhOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYWJzIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5hYnMoYSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYWRkIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSArIGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYW5kIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iICYmIHR5cGVvZiBiID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhICYmIGIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhICYgYik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJhdGFuIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBNYXRoLmF0YW4yKGEsIGIpIC8gTWF0aC5QSSAqIDE4MDsKICAgICAgICAgIGlmIChhIDwgMCkgewogICAgICAgICAgICBhICs9IDM2MDsKICAgICAgICAgIH0KICAgICAgICAgIHN0YWNrLnB1c2goYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJiaXRzaGlmdCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAoYSA+IDApIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhIDw8IGIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhID4+IGIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiY2VpbGluZyI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGguY2VpbChhKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjb3B5IjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLmNvcHkoYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjb3MiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLmNvcyhhICUgMzYwIC8gMTgwICogTWF0aC5QSSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiY3ZpIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKSB8IDA7CiAgICAgICAgICBzdGFjay5wdXNoKGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiY3ZyIjoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRpdiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgLyBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImR1cCI6CiAgICAgICAgICBzdGFjay5jb3B5KDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZXEiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhID09PSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImV4Y2giOgogICAgICAgICAgc3RhY2sucm9sbCgyLCAxKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImV4cCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgKiogYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJmYWxzZSI6CiAgICAgICAgICBzdGFjay5wdXNoKGZhbHNlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImZsb29yIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5mbG9vcihhKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnZSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPj0gYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJndCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPiBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImlkaXYiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhIC8gYiB8IDApOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiaW5kZXgiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2suaW5kZXgoYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJsZSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPD0gYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJsbiI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGgubG9nKGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxvZyI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGgubG9nMTAoYSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibHQiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhIDwgYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtb2QiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhICUgYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtdWwiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhICogYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJuZSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgIT09IGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibmVnIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goLWEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibm90IjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goIWEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaCh+YSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJvciI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAodHlwZW9mIGEgPT09ICJib29sZWFuIiAmJiB0eXBlb2YgYiA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8fCBiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8IGIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicG9wIjoKICAgICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicm9sbCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5yb2xsKGEsIGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicm91bmQiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLnJvdW5kKGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInNpbiI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGguc2luKGEgJSAzNjAgLyAxODAgKiBNYXRoLlBJKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJzcXJ0IjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5zcXJ0KGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInN1YiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgLSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRydWUiOgogICAgICAgICAgc3RhY2sucHVzaCh0cnVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRydW5jYXRlIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBhIDwgMCA/IE1hdGguY2VpbChhKSA6IE1hdGguZmxvb3IoYSk7CiAgICAgICAgICBzdGFjay5wdXNoKGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAieG9yIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iICYmIHR5cGVvZiBiID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhICE9PSBiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSBeIGIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBvcGVyYXRvciAke29wZXJhdG9yfWApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3RhY2suc3RhY2s7CiAgfQp9CmNsYXNzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKHR5cGUpIHsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHVucmVhY2hhYmxlKCJhYnN0cmFjdCBtZXRob2QiKTsKICB9Cn0KY2xhc3MgQXN0QXJndW1lbnQgZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihpbmRleCwgbWluLCBtYXgpIHsKICAgIHN1cGVyKCJhcmdzIik7CiAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICB0aGlzLm1pbiA9IG1pbjsKICAgIHRoaXMubWF4ID0gbWF4OwogIH0KICB2aXNpdCh2aXNpdG9yKSB7CiAgICB2aXNpdG9yLnZpc2l0QXJndW1lbnQodGhpcyk7CiAgfQp9CmNsYXNzIEFzdExpdGVyYWwgZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihudW1iZXIpIHsKICAgIHN1cGVyKCJsaXRlcmFsIik7CiAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKICAgIHRoaXMubWluID0gbnVtYmVyOwogICAgdGhpcy5tYXggPSBudW1iZXI7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHZpc2l0b3IudmlzaXRMaXRlcmFsKHRoaXMpOwogIH0KfQpjbGFzcyBBc3RCaW5hcnlPcGVyYXRpb24gZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihvcCwgYXJnMSwgYXJnMiwgbWluLCBtYXgpIHsKICAgIHN1cGVyKCJiaW5hcnkiKTsKICAgIHRoaXMub3AgPSBvcDsKICAgIHRoaXMuYXJnMSA9IGFyZzE7CiAgICB0aGlzLmFyZzIgPSBhcmcyOwogICAgdGhpcy5taW4gPSBtaW47CiAgICB0aGlzLm1heCA9IG1heDsKICB9CiAgdmlzaXQodmlzaXRvcikgewogICAgdmlzaXRvci52aXNpdEJpbmFyeU9wZXJhdGlvbih0aGlzKTsKICB9Cn0KY2xhc3MgQXN0TWluIGV4dGVuZHMgQXN0Tm9kZSB7CiAgY29uc3RydWN0b3IoYXJnLCBtYXgpIHsKICAgIHN1cGVyKCJtYXgiKTsKICAgIHRoaXMuYXJnID0gYXJnOwogICAgdGhpcy5taW4gPSBhcmcubWluOwogICAgdGhpcy5tYXggPSBtYXg7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHZpc2l0b3IudmlzaXRNaW4odGhpcyk7CiAgfQp9CmNsYXNzIEFzdFZhcmlhYmxlIGV4dGVuZHMgQXN0Tm9kZSB7CiAgY29uc3RydWN0b3IoaW5kZXgsIG1pbiwgbWF4KSB7CiAgICBzdXBlcigidmFyIik7CiAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICB0aGlzLm1pbiA9IG1pbjsKICAgIHRoaXMubWF4ID0gbWF4OwogIH0KICB2aXNpdCh2aXNpdG9yKSB7CiAgICB2aXNpdG9yLnZpc2l0VmFyaWFibGUodGhpcyk7CiAgfQp9CmNsYXNzIEFzdFZhcmlhYmxlRGVmaW5pdGlvbiBleHRlbmRzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKHZhcmlhYmxlLCBhcmcpIHsKICAgIHN1cGVyKCJkZWZpbml0aW9uIik7CiAgICB0aGlzLnZhcmlhYmxlID0gdmFyaWFibGU7CiAgICB0aGlzLmFyZyA9IGFyZzsKICB9CiAgdmlzaXQodmlzaXRvcikgewogICAgdmlzaXRvci52aXNpdFZhcmlhYmxlRGVmaW5pdGlvbih0aGlzKTsKICB9Cn0KY2xhc3MgRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMucGFydHMgPSBbXTsKICB9CiAgdmlzaXRBcmd1bWVudChhcmcpIHsKICAgIHRoaXMucGFydHMucHVzaCgiTWF0aC5tYXgoIiwgYXJnLm1pbiwgIiwgTWF0aC5taW4oIiwgYXJnLm1heCwgIiwgc3JjW3NyY09mZnNldCArICIsIGFyZy5pbmRleCwgIl0pKSIpOwogIH0KICB2aXNpdFZhcmlhYmxlKHZhcmlhYmxlKSB7CiAgICB0aGlzLnBhcnRzLnB1c2goInYiLCB2YXJpYWJsZS5pbmRleCk7CiAgfQogIHZpc2l0TGl0ZXJhbChsaXRlcmFsKSB7CiAgICB0aGlzLnBhcnRzLnB1c2gobGl0ZXJhbC5udW1iZXIpOwogIH0KICB2aXNpdEJpbmFyeU9wZXJhdGlvbihvcGVyYXRpb24pIHsKICAgIHRoaXMucGFydHMucHVzaCgiKCIpOwogICAgb3BlcmF0aW9uLmFyZzEudmlzaXQodGhpcyk7CiAgICB0aGlzLnBhcnRzLnB1c2goIiAiLCBvcGVyYXRpb24ub3AsICIgIik7CiAgICBvcGVyYXRpb24uYXJnMi52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiKSIpOwogIH0KICB2aXNpdFZhcmlhYmxlRGVmaW5pdGlvbihkZWZpbml0aW9uKSB7CiAgICB0aGlzLnBhcnRzLnB1c2goInZhciAiKTsKICAgIGRlZmluaXRpb24udmFyaWFibGUudmlzaXQodGhpcyk7CiAgICB0aGlzLnBhcnRzLnB1c2goIiA9ICIpOwogICAgZGVmaW5pdGlvbi5hcmcudmlzaXQodGhpcyk7CiAgICB0aGlzLnBhcnRzLnB1c2goIjsiKTsKICB9CiAgdmlzaXRNaW4obWF4KSB7CiAgICB0aGlzLnBhcnRzLnB1c2goIk1hdGgubWluKCIpOwogICAgbWF4LmFyZy52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiLCAiLCBtYXgubWF4LCAiKSIpOwogIH0KICB0b1N0cmluZygpIHsKICAgIHJldHVybiB0aGlzLnBhcnRzLmpvaW4oIiIpOwogIH0KfQpmdW5jdGlvbiBidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSB7CiAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIubnVtYmVyID09PSAwKSB7CiAgICByZXR1cm4gbnVtMTsKICB9CiAgaWYgKG51bTEudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTEubnVtYmVyID09PSAwKSB7CiAgICByZXR1cm4gbnVtMjsKICB9CiAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTEudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwobnVtMS5udW1iZXIgKyBudW0yLm51bWJlcik7CiAgfQogIHJldHVybiBuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCIrIiwgbnVtMSwgbnVtMiwgbnVtMS5taW4gKyBudW0yLm1pbiwgbnVtMS5tYXggKyBudW0yLm1heCk7Cn0KZnVuY3Rpb24gYnVpbGRNdWxPcGVyYXRpb24obnVtMSwgbnVtMikgewogIGlmIChudW0yLnR5cGUgPT09ICJsaXRlcmFsIikgewogICAgaWYgKG51bTIubnVtYmVyID09PSAwKSB7CiAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbCgwKTsKICAgIH0gZWxzZSBpZiAobnVtMi5udW1iZXIgPT09IDEpIHsKICAgICAgcmV0dXJuIG51bTE7CiAgICB9IGVsc2UgaWYgKG51bTEudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChudW0xLm51bWJlciAqIG51bTIubnVtYmVyKTsKICAgIH0KICB9CiAgaWYgKG51bTEudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICBpZiAobnVtMS5udW1iZXIgPT09IDApIHsKICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKDApOwogICAgfSBlbHNlIGlmIChudW0xLm51bWJlciA9PT0gMSkgewogICAgICByZXR1cm4gbnVtMjsKICAgIH0KICB9CiAgY29uc3QgbWluID0gTWF0aC5taW4obnVtMS5taW4gKiBudW0yLm1pbiwgbnVtMS5taW4gKiBudW0yLm1heCwgbnVtMS5tYXggKiBudW0yLm1pbiwgbnVtMS5tYXggKiBudW0yLm1heCk7CiAgY29uc3QgbWF4ID0gTWF0aC5tYXgobnVtMS5taW4gKiBudW0yLm1pbiwgbnVtMS5taW4gKiBudW0yLm1heCwgbnVtMS5tYXggKiBudW0yLm1pbiwgbnVtMS5tYXggKiBudW0yLm1heCk7CiAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oIioiLCBudW0xLCBudW0yLCBtaW4sIG1heCk7Cn0KZnVuY3Rpb24gYnVpbGRTdWJPcGVyYXRpb24obnVtMSwgbnVtMikgewogIGlmIChudW0yLnR5cGUgPT09ICJsaXRlcmFsIikgewogICAgaWYgKG51bTIubnVtYmVyID09PSAwKSB7CiAgICAgIHJldHVybiBudW0xOwogICAgfSBlbHNlIGlmIChudW0xLnR5cGUgPT09ICJsaXRlcmFsIikgewogICAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwobnVtMS5udW1iZXIgLSBudW0yLm51bWJlcik7CiAgICB9CiAgfQogIGlmIChudW0yLnR5cGUgPT09ICJiaW5hcnkiICYmIG51bTIub3AgPT09ICItIiAmJiBudW0xLnR5cGUgPT09ICJsaXRlcmFsIiAmJiBudW0xLm51bWJlciA9PT0gMSAmJiBudW0yLmFyZzEudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTIuYXJnMS5udW1iZXIgPT09IDEpIHsKICAgIHJldHVybiBudW0yLmFyZzI7CiAgfQogIHJldHVybiBuZXcgQXN0QmluYXJ5T3BlcmF0aW9uKCItIiwgbnVtMSwgbnVtMiwgbnVtMS5taW4gLSBudW0yLm1heCwgbnVtMS5tYXggLSBudW0yLm1pbik7Cn0KZnVuY3Rpb24gYnVpbGRNaW5PcGVyYXRpb24obnVtMSwgbWF4KSB7CiAgaWYgKG51bTEubWluID49IG1heCkgewogICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG1heCk7CiAgfSBlbHNlIGlmIChudW0xLm1heCA8PSBtYXgpIHsKICAgIHJldHVybiBudW0xOwogIH0KICByZXR1cm4gbmV3IEFzdE1pbihudW0xLCBtYXgpOwp9CmNsYXNzIFBvc3RTY3JpcHRDb21waWxlciB7CiAgY29tcGlsZShjb2RlLCBkb21haW4sIHJhbmdlKSB7CiAgICBjb25zdCBzdGFjayA9IFtdOwogICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gW107CiAgICBjb25zdCBpbnB1dFNpemUgPSBkb21haW4ubGVuZ3RoID4+IDEsCiAgICAgIG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggPj4gMTsKICAgIGxldCBsYXN0UmVnaXN0ZXIgPSAwOwogICAgbGV0IG4sIGo7CiAgICBsZXQgbnVtMSwgbnVtMiwgYXN0MSwgYXN0MiwgdG1wVmFyLCBpdGVtOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFNpemU7IGkrKykgewogICAgICBzdGFjay5wdXNoKG5ldyBBc3RBcmd1bWVudChpLCBkb21haW5baSAqIDJdLCBkb21haW5baSAqIDIgKyAxXSkpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY29kZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGl0ZW0gPSBjb2RlW2ldOwogICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICJudW1iZXIiKSB7CiAgICAgICAgc3RhY2sucHVzaChuZXcgQXN0TGl0ZXJhbChpdGVtKSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgc3dpdGNoIChpdGVtKSB7CiAgICAgICAgY2FzZSAiYWRkIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChidWlsZEFkZE9wZXJhdGlvbihudW0xLCBudW0yKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjdnIiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtdWwiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTXVsT3BlcmF0aW9uKG51bTEsIG51bTIpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInN1YiI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIG51bTIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIG51bTEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYnVpbGRTdWJPcGVyYXRpb24obnVtMSwgbnVtMikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZXhjaCI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGFzdDEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGFzdDIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYXN0MSwgYXN0Mik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJwb3AiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImluZGV4IjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgaWYgKG51bTEudHlwZSAhPT0gImxpdGVyYWwiKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbiA9IG51bTEubnVtYmVyOwogICAgICAgICAgaWYgKG4gPCAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8IHN0YWNrLmxlbmd0aCA8IG4pIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBhc3QxID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gbiAtIDFdOwogICAgICAgICAgaWYgKGFzdDEudHlwZSA9PT0gImxpdGVyYWwiIHx8IGFzdDEudHlwZSA9PT0gInZhciIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB0bXBWYXIgPSBuZXcgQXN0VmFyaWFibGUobGFzdFJlZ2lzdGVyKyssIGFzdDEubWluLCBhc3QxLm1heCk7CiAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSBuIC0gMV0gPSB0bXBWYXI7CiAgICAgICAgICBzdGFjay5wdXNoKHRtcFZhcik7CiAgICAgICAgICBpbnN0cnVjdGlvbnMucHVzaChuZXcgQXN0VmFyaWFibGVEZWZpbml0aW9uKHRtcFZhciwgYXN0MSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZHVwIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVvZiBjb2RlW2kgKyAxXSA9PT0gIm51bWJlciIgJiYgY29kZVtpICsgMl0gPT09ICJndCIgJiYgY29kZVtpICsgM10gPT09IGkgKyA3ICYmIGNvZGVbaSArIDRdID09PSAianoiICYmIGNvZGVbaSArIDVdID09PSAicG9wIiAmJiBjb2RlW2kgKyA2XSA9PT0gY29kZVtpICsgMV0pIHsKICAgICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkTWluT3BlcmF0aW9uKG51bTEsIGNvZGVbaSArIDFdKSk7CiAgICAgICAgICAgIGkgKz0gNjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBhc3QxID0gc3RhY2suYXQoLTEpOwogICAgICAgICAgaWYgKGFzdDEudHlwZSA9PT0gImxpdGVyYWwiIHx8IGFzdDEudHlwZSA9PT0gInZhciIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhc3QxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB0bXBWYXIgPSBuZXcgQXN0VmFyaWFibGUobGFzdFJlZ2lzdGVyKyssIGFzdDEubWluLCBhc3QxLm1heCk7CiAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9IHRtcFZhcjsKICAgICAgICAgIHN0YWNrLnB1c2godG1wVmFyKTsKICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24odG1wVmFyLCBhc3QxKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyb2xsIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgaWYgKG51bTIudHlwZSAhPT0gImxpdGVyYWwiIHx8IG51bTEudHlwZSAhPT0gImxpdGVyYWwiKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaiA9IG51bTIubnVtYmVyOwogICAgICAgICAgbiA9IG51bTEubnVtYmVyOwogICAgICAgICAgaWYgKG4gPD0gMCB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihqKSB8fCBzdGFjay5sZW5ndGggPCBuKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaiA9IChqICUgbiArIG4pICUgbjsKICAgICAgICAgIGlmIChqID09PSAwKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgc3RhY2sucHVzaCguLi5zdGFjay5zcGxpY2Uoc3RhY2subGVuZ3RoIC0gbiwgbiAtIGopKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKHN0YWNrLmxlbmd0aCAhPT0gb3V0cHV0U2l6ZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHsKICAgICAgY29uc3Qgc3RhdGVtZW50QnVpbGRlciA9IG5ldyBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IoKTsKICAgICAgaW5zdHJ1Y3Rpb24udmlzaXQoc3RhdGVtZW50QnVpbGRlcik7CiAgICAgIHJlc3VsdC5wdXNoKHN0YXRlbWVudEJ1aWxkZXIudG9TdHJpbmcoKSk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdGFjay5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGV4cHIgPSBzdGFja1tpXSwKICAgICAgICBzdGF0ZW1lbnRCdWlsZGVyID0gbmV3IEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcigpOwogICAgICBleHByLnZpc2l0KHN0YXRlbWVudEJ1aWxkZXIpOwogICAgICBjb25zdCBtaW4gPSByYW5nZVtpICogMl0sCiAgICAgICAgbWF4ID0gcmFuZ2VbaSAqIDIgKyAxXTsKICAgICAgY29uc3Qgb3V0ID0gW3N0YXRlbWVudEJ1aWxkZXIudG9TdHJpbmcoKV07CiAgICAgIGlmIChtaW4gPiBleHByLm1pbikgewogICAgICAgIG91dC51bnNoaWZ0KCJNYXRoLm1heCgiLCBtaW4sICIsICIpOwogICAgICAgIG91dC5wdXNoKCIpIik7CiAgICAgIH0KICAgICAgaWYgKG1heCA8IGV4cHIubWF4KSB7CiAgICAgICAgb3V0LnVuc2hpZnQoIk1hdGgubWluKCIsIG1heCwgIiwgIik7CiAgICAgICAgb3V0LnB1c2goIikiKTsKICAgICAgfQogICAgICBvdXQudW5zaGlmdCgiZGVzdFtkZXN0T2Zmc2V0ICsgIiwgaSwgIl0gPSAiKTsKICAgICAgb3V0LnB1c2goIjsiKTsKICAgICAgcmVzdWx0LnB1c2gob3V0LmpvaW4oIiIpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQuam9pbigiXG4iKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2JpZGkuanMKCmNvbnN0IGJhc2VUeXBlcyA9IFsiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiUyIsICJCIiwgIlMiLCAiV1MiLCAiQiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCIiwgIkIiLCAiQiIsICJTIiwgIldTIiwgIk9OIiwgIk9OIiwgIkVUIiwgIkVUIiwgIkVUIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkVTIiwgIkNTIiwgIkVTIiwgIkNTIiwgIkNTIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkNTIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJDUyIsICJPTiIsICJFVCIsICJFVCIsICJFVCIsICJFVCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIk9OIiwgIk9OIiwgIkJOIiwgIk9OIiwgIk9OIiwgIkVUIiwgIkVUIiwgIkVOIiwgIkVOIiwgIk9OIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiRU4iLCAiTCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiXTsKY29uc3QgYXJhYmljVHlwZXMgPSBbIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIk9OIiwgIk9OIiwgIkFMIiwgIkVUIiwgIkVUIiwgIkFMIiwgIkNTIiwgIkFMIiwgIk9OIiwgIk9OIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkFOIiwgIkVUIiwgIkFOIiwgIkFOIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQU4iLCAiT04iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiTlNNIiwgIk5TTSIsICJPTiIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQUwiLCAiQUwiLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiXTsKZnVuY3Rpb24gaXNPZGQoaSkgewogIHJldHVybiAoaSAmIDEpICE9PSAwOwp9CmZ1bmN0aW9uIGlzRXZlbihpKSB7CiAgcmV0dXJuIChpICYgMSkgPT09IDA7Cn0KZnVuY3Rpb24gZmluZFVuZXF1YWwoYXJyLCBzdGFydCwgdmFsdWUpIHsKICBsZXQgaiwgamo7CiAgZm9yIChqID0gc3RhcnQsIGpqID0gYXJyLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKICAgIGlmIChhcnJbal0gIT09IHZhbHVlKSB7CiAgICAgIHJldHVybiBqOwogICAgfQogIH0KICByZXR1cm4gajsKfQpmdW5jdGlvbiByZXZlcnNlVmFsdWVzKGFyciwgc3RhcnQsIGVuZCkgewogIGZvciAobGV0IGkgPSBzdGFydCwgaiA9IGVuZCAtIDE7IGkgPCBqOyArK2ksIC0taikgewogICAgY29uc3QgdGVtcCA9IGFycltpXTsKICAgIGFycltpXSA9IGFycltqXTsKICAgIGFycltqXSA9IHRlbXA7CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZUJpZGlUZXh0KHN0ciwgaXNMVFIsIHZlcnRpY2FsID0gZmFsc2UpIHsKICBsZXQgZGlyID0gImx0ciI7CiAgaWYgKHZlcnRpY2FsKSB7CiAgICBkaXIgPSAidHRiIjsKICB9IGVsc2UgaWYgKCFpc0xUUikgewogICAgZGlyID0gInJ0bCI7CiAgfQogIHJldHVybiB7CiAgICBzdHIsCiAgICBkaXIKICB9Owp9CmNvbnN0IGNoYXJzID0gW107CmNvbnN0IHR5cGVzID0gW107CmZ1bmN0aW9uIGJpZGkoc3RyLCBzdGFydExldmVsID0gLTEsIHZlcnRpY2FsID0gZmFsc2UpIHsKICBsZXQgaXNMVFIgPSB0cnVlOwogIGNvbnN0IHN0ckxlbmd0aCA9IHN0ci5sZW5ndGg7CiAgaWYgKHN0ckxlbmd0aCA9PT0gMCB8fCB2ZXJ0aWNhbCkgewogICAgcmV0dXJuIGNyZWF0ZUJpZGlUZXh0KHN0ciwgaXNMVFIsIHZlcnRpY2FsKTsKICB9CiAgY2hhcnMubGVuZ3RoID0gc3RyTGVuZ3RoOwogIHR5cGVzLmxlbmd0aCA9IHN0ckxlbmd0aDsKICBsZXQgbnVtQmlkaSA9IDA7CiAgbGV0IGksIGlpOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgY2hhcnNbaV0gPSBzdHIuY2hhckF0KGkpOwogICAgY29uc3QgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgIGxldCBjaGFyVHlwZSA9ICJMIjsKICAgIGlmIChjaGFyQ29kZSA8PSAweDAwZmYpIHsKICAgICAgY2hhclR5cGUgPSBiYXNlVHlwZXNbY2hhckNvZGVdOwogICAgfSBlbHNlIGlmICgweDA1OTAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgwNWY0KSB7CiAgICAgIGNoYXJUeXBlID0gIlIiOwogICAgfSBlbHNlIGlmICgweDA2MDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgwNmZmKSB7CiAgICAgIGNoYXJUeXBlID0gYXJhYmljVHlwZXNbY2hhckNvZGUgJiAweGZmXTsKICAgICAgaWYgKCFjaGFyVHlwZSkgewogICAgICAgIHdhcm4oIkJpZGk6IGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgIiArIGNoYXJDb2RlLnRvU3RyaW5nKDE2KSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoMHgwNzAwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MDhhYyB8fCAweGZiNTAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHhmZGZmIHx8IDB4ZmU3MCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweGZlZmYpIHsKICAgICAgY2hhclR5cGUgPSAiQUwiOwogICAgfQogICAgaWYgKGNoYXJUeXBlID09PSAiUiIgfHwgY2hhclR5cGUgPT09ICJBTCIgfHwgY2hhclR5cGUgPT09ICJBTiIpIHsKICAgICAgbnVtQmlkaSsrOwogICAgfQogICAgdHlwZXNbaV0gPSBjaGFyVHlwZTsKICB9CiAgaWYgKG51bUJpZGkgPT09IDApIHsKICAgIGlzTFRSID0gdHJ1ZTsKICAgIHJldHVybiBjcmVhdGVCaWRpVGV4dChzdHIsIGlzTFRSKTsKICB9CiAgaWYgKHN0YXJ0TGV2ZWwgPT09IC0xKSB7CiAgICBpZiAobnVtQmlkaSAvIHN0ckxlbmd0aCA8IDAuMyAmJiBzdHJMZW5ndGggPiA0KSB7CiAgICAgIGlzTFRSID0gdHJ1ZTsKICAgICAgc3RhcnRMZXZlbCA9IDA7CiAgICB9IGVsc2UgewogICAgICBpc0xUUiA9IGZhbHNlOwogICAgICBzdGFydExldmVsID0gMTsKICAgIH0KICB9CiAgY29uc3QgbGV2ZWxzID0gW107CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICBsZXZlbHNbaV0gPSBzdGFydExldmVsOwogIH0KICBjb25zdCBlID0gaXNPZGQoc3RhcnRMZXZlbCkgPyAiUiIgOiAiTCI7CiAgY29uc3Qgc29yID0gZTsKICBjb25zdCBlb3IgPSBzb3I7CiAgbGV0IGxhc3RUeXBlID0gc29yOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiTlNNIikgewogICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlOwogICAgfSBlbHNlIHsKICAgICAgbGFzdFR5cGUgPSB0eXBlc1tpXTsKICAgIH0KICB9CiAgbGFzdFR5cGUgPSBzb3I7CiAgbGV0IHQ7CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICB0ID0gdHlwZXNbaV07CiAgICBpZiAodCA9PT0gIkVOIikgewogICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlID09PSAiQUwiID8gIkFOIiA6ICJFTiI7CiAgICB9IGVsc2UgaWYgKHQgPT09ICJSIiB8fCB0ID09PSAiTCIgfHwgdCA9PT0gIkFMIikgewogICAgICBsYXN0VHlwZSA9IHQ7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKHQgPT09ICJBTCIpIHsKICAgICAgdHlwZXNbaV0gPSAiUiI7CiAgICB9CiAgfQogIGZvciAoaSA9IDE7IGkgPCBzdHJMZW5ndGggLSAxOyArK2kpIHsKICAgIGlmICh0eXBlc1tpXSA9PT0gIkVTIiAmJiB0eXBlc1tpIC0gMV0gPT09ICJFTiIgJiYgdHlwZXNbaSArIDFdID09PSAiRU4iKSB7CiAgICAgIHR5cGVzW2ldID0gIkVOIjsKICAgIH0KICAgIGlmICh0eXBlc1tpXSA9PT0gIkNTIiAmJiAodHlwZXNbaSAtIDFdID09PSAiRU4iIHx8IHR5cGVzW2kgLSAxXSA9PT0gIkFOIikgJiYgdHlwZXNbaSArIDFdID09PSB0eXBlc1tpIC0gMV0pIHsKICAgICAgdHlwZXNbaV0gPSB0eXBlc1tpIC0gMV07CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiRU4iKSB7CiAgICAgIGZvciAobGV0IGogPSBpIC0gMTsgaiA+PSAwOyAtLWopIHsKICAgICAgICBpZiAodHlwZXNbal0gIT09ICJFVCIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlc1tqXSA9ICJFTiI7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgc3RyTGVuZ3RoOyArK2opIHsKICAgICAgICBpZiAodHlwZXNbal0gIT09ICJFVCIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlc1tqXSA9ICJFTiI7CiAgICAgIH0KICAgIH0KICB9CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICB0ID0gdHlwZXNbaV07CiAgICBpZiAodCA9PT0gIldTIiB8fCB0ID09PSAiRVMiIHx8IHQgPT09ICJFVCIgfHwgdCA9PT0gIkNTIikgewogICAgICB0eXBlc1tpXSA9ICJPTiI7CiAgICB9CiAgfQogIGxhc3RUeXBlID0gc29yOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKHQgPT09ICJFTiIpIHsKICAgICAgdHlwZXNbaV0gPSBsYXN0VHlwZSA9PT0gIkwiID8gIkwiIDogIkVOIjsKICAgIH0gZWxzZSBpZiAodCA9PT0gIlIiIHx8IHQgPT09ICJMIikgewogICAgICBsYXN0VHlwZSA9IHQ7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiT04iKSB7CiAgICAgIGNvbnN0IGVuZCA9IGZpbmRVbmVxdWFsKHR5cGVzLCBpICsgMSwgIk9OIik7CiAgICAgIGxldCBiZWZvcmUgPSBzb3I7CiAgICAgIGlmIChpID4gMCkgewogICAgICAgIGJlZm9yZSA9IHR5cGVzW2kgLSAxXTsKICAgICAgfQogICAgICBsZXQgYWZ0ZXIgPSBlb3I7CiAgICAgIGlmIChlbmQgKyAxIDwgc3RyTGVuZ3RoKSB7CiAgICAgICAgYWZ0ZXIgPSB0eXBlc1tlbmQgKyAxXTsKICAgICAgfQogICAgICBpZiAoYmVmb3JlICE9PSAiTCIpIHsKICAgICAgICBiZWZvcmUgPSAiUiI7CiAgICAgIH0KICAgICAgaWYgKGFmdGVyICE9PSAiTCIpIHsKICAgICAgICBhZnRlciA9ICJSIjsKICAgICAgfQogICAgICBpZiAoYmVmb3JlID09PSBhZnRlcikgewogICAgICAgIHR5cGVzLmZpbGwoYmVmb3JlLCBpLCBlbmQpOwogICAgICB9CiAgICAgIGkgPSBlbmQgLSAxOwogICAgfQogIH0KICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKICAgIGlmICh0eXBlc1tpXSA9PT0gIk9OIikgewogICAgICB0eXBlc1tpXSA9IGU7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKGlzRXZlbihsZXZlbHNbaV0pKSB7CiAgICAgIGlmICh0ID09PSAiUiIpIHsKICAgICAgICBsZXZlbHNbaV0gKz0gMTsKICAgICAgfSBlbHNlIGlmICh0ID09PSAiQU4iIHx8IHQgPT09ICJFTiIpIHsKICAgICAgICBsZXZlbHNbaV0gKz0gMjsKICAgICAgfQogICAgfSBlbHNlIGlmICh0ID09PSAiTCIgfHwgdCA9PT0gIkFOIiB8fCB0ID09PSAiRU4iKSB7CiAgICAgIGxldmVsc1tpXSArPSAxOwogICAgfQogIH0KICBsZXQgaGlnaGVzdExldmVsID0gLTE7CiAgbGV0IGxvd2VzdE9kZExldmVsID0gOTk7CiAgbGV0IGxldmVsOwogIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgIGxldmVsID0gbGV2ZWxzW2ldOwogICAgaWYgKGhpZ2hlc3RMZXZlbCA8IGxldmVsKSB7CiAgICAgIGhpZ2hlc3RMZXZlbCA9IGxldmVsOwogICAgfQogICAgaWYgKGxvd2VzdE9kZExldmVsID4gbGV2ZWwgJiYgaXNPZGQobGV2ZWwpKSB7CiAgICAgIGxvd2VzdE9kZExldmVsID0gbGV2ZWw7CiAgICB9CiAgfQogIGZvciAobGV2ZWwgPSBoaWdoZXN0TGV2ZWw7IGxldmVsID49IGxvd2VzdE9kZExldmVsOyAtLWxldmVsKSB7CiAgICBsZXQgc3RhcnQgPSAtMTsKICAgIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgaWYgKGxldmVsc1tpXSA8IGxldmVsKSB7CiAgICAgICAgaWYgKHN0YXJ0ID49IDApIHsKICAgICAgICAgIHJldmVyc2VWYWx1ZXMoY2hhcnMsIHN0YXJ0LCBpKTsKICAgICAgICAgIHN0YXJ0ID0gLTE7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgIHN0YXJ0ID0gaTsKICAgICAgfQogICAgfQogICAgaWYgKHN0YXJ0ID49IDApIHsKICAgICAgcmV2ZXJzZVZhbHVlcyhjaGFycywgc3RhcnQsIGxldmVscy5sZW5ndGgpOwogICAgfQogIH0KICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgIGNvbnN0IGNoID0gY2hhcnNbaV07CiAgICBpZiAoY2ggPT09ICI8IiB8fCBjaCA9PT0gIj4iKSB7CiAgICAgIGNoYXJzW2ldID0gIiI7CiAgICB9CiAgfQogIHJldHVybiBjcmVhdGVCaWRpVGV4dChjaGFycy5qb2luKCIiKSwgaXNMVFIpOwp9Cgo7Ly8gLi9zcmMvY29yZS9mb250X3N1YnN0aXR1dGlvbnMuanMKCgoKY29uc3QgTk9STUFMID0gewogIHN0eWxlOiAibm9ybWFsIiwKICB3ZWlnaHQ6ICJub3JtYWwiCn07CmNvbnN0IEJPTEQgPSB7CiAgc3R5bGU6ICJub3JtYWwiLAogIHdlaWdodDogImJvbGQiCn07CmNvbnN0IElUQUxJQyA9IHsKICBzdHlsZTogIml0YWxpYyIsCiAgd2VpZ2h0OiAibm9ybWFsIgp9Owpjb25zdCBCT0xESVRBTElDID0gewogIHN0eWxlOiAiaXRhbGljIiwKICB3ZWlnaHQ6ICJib2xkIgp9Owpjb25zdCBzdWJzdGl0dXRpb25NYXAgPSBuZXcgTWFwKFtbIlRpbWVzLVJvbWFuIiwgewogIGxvY2FsOiBbIlRpbWVzIE5ldyBSb21hbiIsICJUaW1lcy1Sb21hbiIsICJUaW1lcyIsICJMaWJlcmF0aW9uIFNlcmlmIiwgIk5pbWJ1cyBSb21hbiIsICJOaW1idXMgUm9tYW4gTCIsICJUaW5vcyIsICJUaG9ybmRhbGUiLCAiVGVYIEd5cmUgVGVybWVzIiwgIkZyZWVTZXJpZiIsICJMaW51eCBMaWJlcnRpbmUgTyIsICJMaWJlcnRpbnVzIFNlcmlmIiwgIkRlamFWdSBTZXJpZiIsICJCaXRzdHJlYW0gVmVyYSBTZXJpZiIsICJVYnVudHUiXSwKICBzdHlsZTogTk9STUFMLAogIHVsdGltYXRlOiAic2VyaWYiCn1dLCBbIlRpbWVzLUJvbGQiLCB7CiAgYWxpYXM6ICJUaW1lcy1Sb21hbiIsCiAgc3R5bGU6IEJPTEQsCiAgdWx0aW1hdGU6ICJzZXJpZiIKfV0sIFsiVGltZXMtSXRhbGljIiwgewogIGFsaWFzOiAiVGltZXMtUm9tYW4iLAogIHN0eWxlOiBJVEFMSUMsCiAgdWx0aW1hdGU6ICJzZXJpZiIKfV0sIFsiVGltZXMtQm9sZEl0YWxpYyIsIHsKICBhbGlhczogIlRpbWVzLVJvbWFuIiwKICBzdHlsZTogQk9MRElUQUxJQywKICB1bHRpbWF0ZTogInNlcmlmIgp9XSwgWyJIZWx2ZXRpY2EiLCB7CiAgbG9jYWw6IFsiSGVsdmV0aWNhIiwgIkhlbHZldGljYSBOZXVlIiwgIkFyaWFsIiwgIkFyaWFsIE5vdmEiLCAiTGliZXJhdGlvbiBTYW5zIiwgIkFyaW1vIiwgIk5pbWJ1cyBTYW5zIiwgIk5pbWJ1cyBTYW5zIEwiLCAiQTAzMCIsICJUZVggR3lyZSBIZXJvcyIsICJGcmVlU2FucyIsICJEZWphVnUgU2FucyIsICJBbGJhbnkiLCAiQml0c3RyZWFtIFZlcmEgU2FucyIsICJBcmlhbCBVbmljb2RlIE1TIiwgIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgIkFwcGxlIFN5bWJvbHMiLCAiQ2FudGFyZWxsIl0sCiAgcGF0aDogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIudHRmIiwKICBzdHlsZTogTk9STUFMLAogIHVsdGltYXRlOiAic2Fucy1zZXJpZiIKfV0sIFsiSGVsdmV0aWNhLUJvbGQiLCB7CiAgYWxpYXM6ICJIZWx2ZXRpY2EiLAogIHBhdGg6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiIsCiAgc3R5bGU6IEJPTEQsCiAgdWx0aW1hdGU6ICJzYW5zLXNlcmlmIgp9XSwgWyJIZWx2ZXRpY2EtT2JsaXF1ZSIsIHsKICBhbGlhczogIkhlbHZldGljYSIsCiAgcGF0aDogIkxpYmVyYXRpb25TYW5zLUl0YWxpYy50dGYiLAogIHN0eWxlOiBJVEFMSUMsCiAgdWx0aW1hdGU6ICJzYW5zLXNlcmlmIgp9XSwgWyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLCB7CiAgYWxpYXM6ICJIZWx2ZXRpY2EiLAogIHBhdGg6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljLnR0ZiIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgdWx0aW1hdGU6ICJzYW5zLXNlcmlmIgp9XSwgWyJDb3VyaWVyIiwgewogIGxvY2FsOiBbIkNvdXJpZXIiLCAiQ291cmllciBOZXciLCAiTGliZXJhdGlvbiBNb25vIiwgIk5pbWJ1cyBNb25vIiwgIk5pbWJ1cyBNb25vIEwiLCAiQ291c2luZSIsICJDdW1iZXJsYW5kIiwgIlRlWCBHeXJlIEN1cnNvciIsICJGcmVlTW9ubyIsICJMaW51eCBMaWJlcnRpbmUgTW9ubyBPIiwgIkxpYmVydGludXMgTW9ubyJdLAogIHN0eWxlOiBOT1JNQUwsCiAgdWx0aW1hdGU6ICJtb25vc3BhY2UiCn1dLCBbIkNvdXJpZXItQm9sZCIsIHsKICBhbGlhczogIkNvdXJpZXIiLAogIHN0eWxlOiBCT0xELAogIHVsdGltYXRlOiAibW9ub3NwYWNlIgp9XSwgWyJDb3VyaWVyLU9ibGlxdWUiLCB7CiAgYWxpYXM6ICJDb3VyaWVyIiwKICBzdHlsZTogSVRBTElDLAogIHVsdGltYXRlOiAibW9ub3NwYWNlIgp9XSwgWyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgewogIGFsaWFzOiAiQ291cmllciIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgdWx0aW1hdGU6ICJtb25vc3BhY2UiCn1dLCBbIkFyaWFsQmxhY2siLCB7CiAgbG9jYWw6IFsiQXJpYWwgQmxhY2siXSwKICBzdHlsZTogewogICAgc3R5bGU6ICJub3JtYWwiLAogICAgd2VpZ2h0OiAiOTAwIgogIH0sCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZCIKfV0sIFsiQXJpYWxCbGFjay1Cb2xkIiwgewogIGFsaWFzOiAiQXJpYWxCbGFjayIKfV0sIFsiQXJpYWxCbGFjay1JdGFsaWMiLCB7CiAgYWxpYXM6ICJBcmlhbEJsYWNrIiwKICBzdHlsZTogewogICAgc3R5bGU6ICJpdGFsaWMiLAogICAgd2VpZ2h0OiAiOTAwIgogIH0sCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiCn1dLCBbIkFyaWFsQmxhY2stQm9sZEl0YWxpYyIsIHsKICBhbGlhczogIkFyaWFsQmxhY2stSXRhbGljIgp9XSwgWyJBcmlhbE5hcnJvdyIsIHsKICBsb2NhbDogWyJBcmlhbCBOYXJyb3ciLCAiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyIsICJIZWx2ZXRpY2EgQ29uZGVuc2VkIiwgIk5pbWJ1cyBTYW5zIE5hcnJvdyIsICJUZVggR3lyZSBIZXJvcyBDbiJdLAogIHN0eWxlOiBOT1JNQUwsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EiCn1dLCBbIkFyaWFsTmFycm93LUJvbGQiLCB7CiAgYWxpYXM6ICJBcmlhbE5hcnJvdyIsCiAgc3R5bGU6IEJPTEQsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZCIKfV0sIFsiQXJpYWxOYXJyb3ctSXRhbGljIiwgewogIGFsaWFzOiAiQXJpYWxOYXJyb3ciLAogIHN0eWxlOiBJVEFMSUMsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtT2JsaXF1ZSIKfV0sIFsiQXJpYWxOYXJyb3ctQm9sZEl0YWxpYyIsIHsKICBhbGlhczogIkFyaWFsTmFycm93IiwKICBzdHlsZTogQk9MRElUQUxJQywKICBmYWxsYmFjazogIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIKfV0sIFsiQ2FsaWJyaSIsIHsKICBsb2NhbDogWyJDYWxpYnJpIiwgIkNhcmxpdG8iXSwKICBzdHlsZTogTk9STUFMLAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhIgp9XSwgWyJDYWxpYnJpLUJvbGQiLCB7CiAgYWxpYXM6ICJDYWxpYnJpIiwKICBzdHlsZTogQk9MRCwKICBmYWxsYmFjazogIkhlbHZldGljYS1Cb2xkIgp9XSwgWyJDYWxpYnJpLUl0YWxpYyIsIHsKICBhbGlhczogIkNhbGlicmkiLAogIHN0eWxlOiBJVEFMSUMsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtT2JsaXF1ZSIKfV0sIFsiQ2FsaWJyaS1Cb2xkSXRhbGljIiwgewogIGFsaWFzOiAiQ2FsaWJyaSIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiCn1dLCBbIldpbmdkaW5ncyIsIHsKICBsb2NhbDogWyJXaW5nZGluZ3MiLCAiVVJXIERpbmdiYXRzIl0sCiAgc3R5bGU6IE5PUk1BTAp9XSwgWyJXaW5nZGluZ3MtUmVndWxhciIsIHsKICBhbGlhczogIldpbmdkaW5ncyIKfV0sIFsiV2luZ2RpbmdzLUJvbGQiLCB7CiAgYWxpYXM6ICJXaW5nZGluZ3MiCn1dXSk7CmNvbnN0IGZvbnRBbGlhc2VzID0gbmV3IE1hcChbWyJBcmlhbC1CbGFjayIsICJBcmlhbEJsYWNrIl1dKTsKZnVuY3Rpb24gZ2V0U3R5bGVUb0FwcGVuZChzdHlsZSkgewogIHN3aXRjaCAoc3R5bGUpIHsKICAgIGNhc2UgQk9MRDoKICAgICAgcmV0dXJuICJCb2xkIjsKICAgIGNhc2UgSVRBTElDOgogICAgICByZXR1cm4gIkl0YWxpYyI7CiAgICBjYXNlIEJPTERJVEFMSUM6CiAgICAgIHJldHVybiAiQm9sZCBJdGFsaWMiOwogICAgZGVmYXVsdDoKICAgICAgaWYgKHN0eWxlPy53ZWlnaHQgPT09ICJib2xkIikgewogICAgICAgIHJldHVybiAiQm9sZCI7CiAgICAgIH0KICAgICAgaWYgKHN0eWxlPy5zdHlsZSA9PT0gIml0YWxpYyIpIHsKICAgICAgICByZXR1cm4gIkl0YWxpYyI7CiAgICAgIH0KICB9CiAgcmV0dXJuICIiOwp9CmZ1bmN0aW9uIGdldEZhbWlseU5hbWUoc3RyKSB7CiAgY29uc3Qga2V5d29yZHMgPSBuZXcgU2V0KFsidGhpbiIsICJleHRyYWxpZ2h0IiwgInVsdHJhbGlnaHQiLCAiZGVtaWxpZ2h0IiwgInNlbWlsaWdodCIsICJsaWdodCIsICJib29rIiwgInJlZ3VsYXIiLCAibm9ybWFsIiwgIm1lZGl1bSIsICJkZW1pYm9sZCIsICJzZW1pYm9sZCIsICJib2xkIiwgImV4dHJhYm9sZCIsICJ1bHRyYWJvbGQiLCAiYmxhY2siLCAiaGVhdnkiLCAiZXh0cmFibGFjayIsICJ1bHRyYWJsYWNrIiwgInJvbWFuIiwgIml0YWxpYyIsICJvYmxpcXVlIiwgInVsdHJhY29uZGVuc2VkIiwgImV4dHJhY29uZGVuc2VkIiwgImNvbmRlbnNlZCIsICJzZW1pY29uZGVuc2VkIiwgIm5vcm1hbCIsICJzZW1pZXhwYW5kZWQiLCAiZXhwYW5kZWQiLCAiZXh0cmFleHBhbmRlZCIsICJ1bHRyYWV4cGFuZGVkIiwgImJvbGRpdGFsaWMiXSk7CiAgcmV0dXJuIHN0ci5zcGxpdCgvWy0gLCtdKy9nKS5maWx0ZXIodG9rID0+ICFrZXl3b3Jkcy5oYXModG9rLnRvTG93ZXJDYXNlKCkpKS5qb2luKCIgIik7Cn0KZnVuY3Rpb24gZ2VuZXJhdGVGb250KHsKICBhbGlhcywKICBsb2NhbCwKICBwYXRoLAogIGZhbGxiYWNrLAogIHN0eWxlLAogIHVsdGltYXRlCn0sIHNyYywgbG9jYWxGb250UGF0aCwgdXNlRmFsbGJhY2sgPSB0cnVlLCB1c2VQYXRoID0gdHJ1ZSwgYXBwZW5kID0gIiIpIHsKICBjb25zdCByZXN1bHQgPSB7CiAgICBzdHlsZTogbnVsbCwKICAgIHVsdGltYXRlOiBudWxsCiAgfTsKICBpZiAobG9jYWwpIHsKICAgIGNvbnN0IGV4dHJhID0gYXBwZW5kID8gYCAke2FwcGVuZH1gIDogIiI7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbG9jYWwpIHsKICAgICAgc3JjLnB1c2goYGxvY2FsKCR7bmFtZX0ke2V4dHJhfSlgKTsKICAgIH0KICB9CiAgaWYgKGFsaWFzKSB7CiAgICBjb25zdCBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25NYXAuZ2V0KGFsaWFzKTsKICAgIGNvbnN0IGFsaWFzQXBwZW5kID0gYXBwZW5kIHx8IGdldFN0eWxlVG9BcHBlbmQoc3R5bGUpOwogICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIGdlbmVyYXRlRm9udChzdWJzdGl0dXRpb24sIHNyYywgbG9jYWxGb250UGF0aCwgdXNlRmFsbGJhY2sgJiYgIWZhbGxiYWNrLCB1c2VQYXRoICYmICFwYXRoLCBhbGlhc0FwcGVuZCkpOwogIH0KICBpZiAoc3R5bGUpIHsKICAgIHJlc3VsdC5zdHlsZSA9IHN0eWxlOwogIH0KICBpZiAodWx0aW1hdGUpIHsKICAgIHJlc3VsdC51bHRpbWF0ZSA9IHVsdGltYXRlOwogIH0KICBpZiAodXNlRmFsbGJhY2sgJiYgZmFsbGJhY2spIHsKICAgIGNvbnN0IGZhbGxiYWNrSW5mbyA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoZmFsbGJhY2spOwogICAgY29uc3QgewogICAgICB1bHRpbWF0ZTogZmFsbGJhY2tVbHRpbWF0ZQogICAgfSA9IGdlbmVyYXRlRm9udChmYWxsYmFja0luZm8sIHNyYywgbG9jYWxGb250UGF0aCwgdXNlRmFsbGJhY2ssIHVzZVBhdGggJiYgIXBhdGgsIGFwcGVuZCk7CiAgICByZXN1bHQudWx0aW1hdGUgfHw9IGZhbGxiYWNrVWx0aW1hdGU7CiAgfQogIGlmICh1c2VQYXRoICYmIHBhdGggJiYgbG9jYWxGb250UGF0aCkgewogICAgc3JjLnB1c2goYHVybCgke2xvY2FsRm9udFBhdGh9JHtwYXRofSlgKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQpmdW5jdGlvbiBnZXRGb250U3Vic3RpdHV0aW9uKHN5c3RlbUZvbnRDYWNoZSwgaWRGYWN0b3J5LCBsb2NhbEZvbnRQYXRoLCBiYXNlRm9udE5hbWUsIHN0YW5kYXJkRm9udE5hbWUsIHR5cGUpIHsKICBpZiAoYmFzZUZvbnROYW1lLnN0YXJ0c1dpdGgoIkludmFsaWRQREZqc0ZvbnRfIikpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAoKHR5cGUgPT09ICJUcnVlVHlwZSIgfHwgdHlwZSA9PT0gIlR5cGUxIikgJiYgL15bQS1aXXs2fVwrLy50ZXN0KGJhc2VGb250TmFtZSkpIHsKICAgIGJhc2VGb250TmFtZSA9IGJhc2VGb250TmFtZS5zbGljZSg3KTsKICB9CiAgYmFzZUZvbnROYW1lID0gbm9ybWFsaXplRm9udE5hbWUoYmFzZUZvbnROYW1lKTsKICBjb25zdCBrZXkgPSBiYXNlRm9udE5hbWU7CiAgbGV0IHN1YnN0aXR1dGlvbkluZm8gPSBzeXN0ZW1Gb250Q2FjaGUuZ2V0KGtleSk7CiAgaWYgKHN1YnN0aXR1dGlvbkluZm8pIHsKICAgIHJldHVybiBzdWJzdGl0dXRpb25JbmZvOwogIH0KICBsZXQgc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uTWFwLmdldChiYXNlRm9udE5hbWUpOwogIGlmICghc3Vic3RpdHV0aW9uKSB7CiAgICBmb3IgKGNvbnN0IFthbGlhcywgc3Vic3RdIG9mIGZvbnRBbGlhc2VzKSB7CiAgICAgIGlmIChiYXNlRm9udE5hbWUuc3RhcnRzV2l0aChhbGlhcykpIHsKICAgICAgICBiYXNlRm9udE5hbWUgPSBgJHtzdWJzdH0ke2Jhc2VGb250TmFtZS5zdWJzdHJpbmcoYWxpYXMubGVuZ3RoKX1gOwogICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoYmFzZUZvbnROYW1lKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KICBsZXQgbXVzdEFkZEJhc2VGb250ID0gZmFsc2U7CiAgaWYgKCFzdWJzdGl0dXRpb24pIHsKICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoc3RhbmRhcmRGb250TmFtZSk7CiAgICBtdXN0QWRkQmFzZUZvbnQgPSB0cnVlOwogIH0KICBjb25zdCBsb2FkZWROYW1lID0gYCR7aWRGYWN0b3J5LmdldERvY0lkKCl9X3Mke2lkRmFjdG9yeS5jcmVhdGVGb250SWQoKX1gOwogIGlmICghc3Vic3RpdHV0aW9uKSB7CiAgICBpZiAoIXZhbGlkYXRlRm9udE5hbWUoYmFzZUZvbnROYW1lKSkgewogICAgICB3YXJuKGBDYW5ub3Qgc3Vic3RpdHV0ZSB0aGUgZm9udCBiZWNhdXNlIG9mIGl0cyBuYW1lOiAke2Jhc2VGb250TmFtZX1gKTsKICAgICAgc3lzdGVtRm9udENhY2hlLnNldChrZXksIG51bGwpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGJvbGQgPSAvYm9sZC9naS50ZXN0KGJhc2VGb250TmFtZSk7CiAgICBjb25zdCBpdGFsaWMgPSAvb2JsaXF1ZXxpdGFsaWMvZ2kudGVzdChiYXNlRm9udE5hbWUpOwogICAgY29uc3Qgc3R5bGUgPSBib2xkICYmIGl0YWxpYyAmJiBCT0xESVRBTElDIHx8IGJvbGQgJiYgQk9MRCB8fCBpdGFsaWMgJiYgSVRBTElDIHx8IE5PUk1BTDsKICAgIHN1YnN0aXR1dGlvbkluZm8gPSB7CiAgICAgIGNzczogYCIke2dldEZhbWlseU5hbWUoYmFzZUZvbnROYW1lKX0iLCR7bG9hZGVkTmFtZX1gLAogICAgICBndWVzc0ZhbGxiYWNrOiB0cnVlLAogICAgICBsb2FkZWROYW1lLAogICAgICBiYXNlRm9udE5hbWUsCiAgICAgIHNyYzogYGxvY2FsKCR7YmFzZUZvbnROYW1lfSlgLAogICAgICBzdHlsZQogICAgfTsKICAgIHN5c3RlbUZvbnRDYWNoZS5zZXQoa2V5LCBzdWJzdGl0dXRpb25JbmZvKTsKICAgIHJldHVybiBzdWJzdGl0dXRpb25JbmZvOwogIH0KICBjb25zdCBzcmMgPSBbXTsKICBpZiAobXVzdEFkZEJhc2VGb250ICYmIHZhbGlkYXRlRm9udE5hbWUoYmFzZUZvbnROYW1lKSkgewogICAgc3JjLnB1c2goYGxvY2FsKCR7YmFzZUZvbnROYW1lfSlgKTsKICB9CiAgY29uc3QgewogICAgc3R5bGUsCiAgICB1bHRpbWF0ZQogIH0gPSBnZW5lcmF0ZUZvbnQoc3Vic3RpdHV0aW9uLCBzcmMsIGxvY2FsRm9udFBhdGgpOwogIGNvbnN0IGd1ZXNzRmFsbGJhY2sgPSB1bHRpbWF0ZSA9PT0gbnVsbDsKICBjb25zdCBmYWxsYmFjayA9IGd1ZXNzRmFsbGJhY2sgPyAiIiA6IGAsJHt1bHRpbWF0ZX1gOwogIHN1YnN0aXR1dGlvbkluZm8gPSB7CiAgICBjc3M6IGAiJHtnZXRGYW1pbHlOYW1lKGJhc2VGb250TmFtZSl9Iiwke2xvYWRlZE5hbWV9JHtmYWxsYmFja31gLAogICAgZ3Vlc3NGYWxsYmFjaywKICAgIGxvYWRlZE5hbWUsCiAgICBiYXNlRm9udE5hbWUsCiAgICBzcmM6IHNyYy5qb2luKCIsIiksCiAgICBzdHlsZQogIH07CiAgc3lzdGVtRm9udENhY2hlLnNldChrZXksIHN1YnN0aXR1dGlvbkluZm8pOwogIHJldHVybiBzdWJzdGl0dXRpb25JbmZvOwp9Cgo7Ly8gLi9zcmMvc2hhcmVkL211cm11cmhhc2gzLmpzCmNvbnN0IFNFRUQgPSAweGMzZDJlMWYwOwpjb25zdCBNQVNLX0hJR0ggPSAweGZmZmYwMDAwOwpjb25zdCBNQVNLX0xPVyA9IDB4ZmZmZjsKY2xhc3MgTXVybXVySGFzaDNfNjQgewogIGNvbnN0cnVjdG9yKHNlZWQpIHsKICAgIHRoaXMuaDEgPSBzZWVkID8gc2VlZCAmIDB4ZmZmZmZmZmYgOiBTRUVEOwogICAgdGhpcy5oMiA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7CiAgfQogIHVwZGF0ZShpbnB1dCkgewogICAgbGV0IGRhdGEsIGxlbmd0aDsKICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICJzdHJpbmciKSB7CiAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGggKiAyKTsKICAgICAgbGVuZ3RoID0gMDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5wdXQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkpOwogICAgICAgIGlmIChjb2RlIDw9IDB4ZmYpIHsKICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlID4+PiA4OwogICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlICYgMHhmZjsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0KSkgewogICAgICBkYXRhID0gaW5wdXQuc2xpY2UoKTsKICAgICAgbGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGEgZm9ybWF0LCBtdXN0IGJlIGEgc3RyaW5nIG9yIFR5cGVkQXJyYXkuIik7CiAgICB9CiAgICBjb25zdCBibG9ja0NvdW50cyA9IGxlbmd0aCA+PiAyOwogICAgY29uc3QgdGFpbExlbmd0aCA9IGxlbmd0aCAtIGJsb2NrQ291bnRzICogNDsKICAgIGNvbnN0IGRhdGFVaW50MzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIsIDAsIGJsb2NrQ291bnRzKTsKICAgIGxldCBrMSA9IDAsCiAgICAgIGsyID0gMDsKICAgIGxldCBoMSA9IHRoaXMuaDEsCiAgICAgIGgyID0gdGhpcy5oMjsKICAgIGNvbnN0IEMxID0gMHhjYzllMmQ1MSwKICAgICAgQzIgPSAweDFiODczNTkzOwogICAgY29uc3QgQzFfTE9XID0gQzEgJiBNQVNLX0xPVywKICAgICAgQzJfTE9XID0gQzIgJiBNQVNLX0xPVzsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tDb3VudHM7IGkrKykgewogICAgICBpZiAoaSAmIDEpIHsKICAgICAgICBrMSA9IGRhdGFVaW50MzJbaV07CiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVzsKICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3OwogICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7CiAgICAgICAgaDEgXj0gazE7CiAgICAgICAgaDEgPSBoMSA8PCAxMyB8IGgxID4+PiAxOTsKICAgICAgICBoMSA9IGgxICogNSArIDB4ZTY1NDZiNjQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgazIgPSBkYXRhVWludDMyW2ldOwogICAgICAgIGsyID0gazIgKiBDMSAmIE1BU0tfSElHSCB8IGsyICogQzFfTE9XICYgTUFTS19MT1c7CiAgICAgICAgazIgPSBrMiA8PCAxNSB8IGsyID4+PiAxNzsKICAgICAgICBrMiA9IGsyICogQzIgJiBNQVNLX0hJR0ggfCBrMiAqIEMyX0xPVyAmIE1BU0tfTE9XOwogICAgICAgIGgyIF49IGsyOwogICAgICAgIGgyID0gaDIgPDwgMTMgfCBoMiA+Pj4gMTk7CiAgICAgICAgaDIgPSBoMiAqIDUgKyAweGU2NTQ2YjY0OwogICAgICB9CiAgICB9CiAgICBrMSA9IDA7CiAgICBzd2l0Y2ggKHRhaWxMZW5ndGgpIHsKICAgICAgY2FzZSAzOgogICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0ICsgMl0gPDwgMTY7CiAgICAgIGNhc2UgMjoKICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDFdIDw8IDg7CiAgICAgIGNhc2UgMToKICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNF07CiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVzsKICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3OwogICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7CiAgICAgICAgaWYgKGJsb2NrQ291bnRzICYgMSkgewogICAgICAgICAgaDEgXj0gazE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGgyIF49IGsxOwogICAgICAgIH0KICAgIH0KICAgIHRoaXMuaDEgPSBoMTsKICAgIHRoaXMuaDIgPSBoMjsKICB9CiAgaGV4ZGlnZXN0KCkgewogICAgbGV0IGgxID0gdGhpcy5oMSwKICAgICAgaDIgPSB0aGlzLmgyOwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICBoMSA9IGgxICogMHhlZDU1OGNjZCAmIE1BU0tfSElHSCB8IGgxICogMHg4Y2NkICYgTUFTS19MT1c7CiAgICBoMiA9IGgyICogMHhmZjUxYWZkNyAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhhZmQ3ZWQ1NSAmIE1BU0tfSElHSCkgPj4+IDE2OwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICBoMSA9IGgxICogMHgxYTg1ZWM1MyAmIE1BU0tfSElHSCB8IGgxICogMHhlYzUzICYgTUFTS19MT1c7CiAgICBoMiA9IGgyICogMHhjNGNlYjlmZSAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhiOWZlMWE4NSAmIE1BU0tfSElHSCkgPj4+IDE2OwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICByZXR1cm4gKGgxID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgIjAiKSArIChoMiA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsICIwIik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9vcGVyYXRvcl9saXN0LmpzCgpmdW5jdGlvbiBhZGRTdGF0ZShwYXJlbnRTdGF0ZSwgcGF0dGVybiwgY2hlY2tGbiwgaXRlcmF0ZUZuLCBwcm9jZXNzRm4pIHsKICBsZXQgc3RhdGUgPSBwYXJlbnRTdGF0ZTsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBwYXR0ZXJuLmxlbmd0aCAtIDE7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBpdGVtID0gcGF0dGVybltpXTsKICAgIHN0YXRlID0gc3RhdGVbaXRlbV0gfHw9IFtdOwogIH0KICBzdGF0ZVtwYXR0ZXJuLmF0KC0xKV0gPSB7CiAgICBjaGVja0ZuLAogICAgaXRlcmF0ZUZuLAogICAgcHJvY2Vzc0ZuCiAgfTsKfQpjb25zdCBJbml0aWFsU3RhdGUgPSBbXTsKYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbT1BTLnNhdmUsIE9QUy50cmFuc2Zvcm0sIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdCwgT1BTLnJlc3RvcmVdLCBudWxsLCBmdW5jdGlvbiBpdGVyYXRlSW5saW5lSW1hZ2VHcm91cChjb250ZXh0LCBpKSB7CiAgY29uc3QgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheTsKICBjb25zdCBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDM7CiAgY29uc3QgcG9zID0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CiAgc3dpdGNoIChwb3MpIHsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5zYXZlOwogICAgY2FzZSAxOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnRyYW5zZm9ybTsKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5wYWludElubGluZUltYWdlWE9iamVjdDsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5yZXN0b3JlOwogIH0KICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOwp9LCBmdW5jdGlvbiBmb3VuZElubGluZUltYWdlR3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IE1JTl9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSyA9IDEwOwogIGNvbnN0IE1BWF9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSyA9IDIwMDsKICBjb25zdCBNQVhfV0lEVEggPSAxMDAwOwogIGNvbnN0IElNQUdFX1BBRERJTkcgPSAxOwogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBjdXJyID0gY29udGV4dC5pQ3VycjsKICBjb25zdCBpRmlyc3RTYXZlID0gY3VyciAtIDM7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0UElJWE8gPSBjdXJyIC0gMTsKICBjb25zdCBjb3VudCA9IE1hdGgubWluKE1hdGguZmxvb3IoKGkgLSBpRmlyc3RTYXZlKSAvIDQpLCBNQVhfSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0spOwogIGlmIChjb3VudCA8IE1JTl9JTUFHRVNfSU5fSU5MSU5FX0lNQUdFU19CTE9DSykgewogICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICB9CiAgbGV0IG1heFggPSAwOwogIGNvbnN0IG1hcCA9IFtdOwogIGxldCBtYXhMaW5lSGVpZ2h0ID0gMDsKICBsZXQgY3VycmVudFggPSBJTUFHRV9QQURESU5HLAogICAgY3VycmVudFkgPSBJTUFHRV9QQURESU5HOwogIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKykgewogICAgY29uc3QgdHJhbnNmb3JtID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybSArIChxIDw8IDIpXTsKICAgIGNvbnN0IGltZyA9IGFyZ3NBcnJheVtpRmlyc3RQSUlYTyArIChxIDw8IDIpXVswXTsKICAgIGlmIChjdXJyZW50WCArIGltZy53aWR0aCA+IE1BWF9XSURUSCkgewogICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY3VycmVudFgpOwogICAgICBjdXJyZW50WSArPSBtYXhMaW5lSGVpZ2h0ICsgMiAqIElNQUdFX1BBRERJTkc7CiAgICAgIGN1cnJlbnRYID0gMDsKICAgICAgbWF4TGluZUhlaWdodCA9IDA7CiAgICB9CiAgICBtYXAucHVzaCh7CiAgICAgIHRyYW5zZm9ybSwKICAgICAgeDogY3VycmVudFgsCiAgICAgIHk6IGN1cnJlbnRZLAogICAgICB3OiBpbWcud2lkdGgsCiAgICAgIGg6IGltZy5oZWlnaHQKICAgIH0pOwogICAgY3VycmVudFggKz0gaW1nLndpZHRoICsgMiAqIElNQUdFX1BBRERJTkc7CiAgICBtYXhMaW5lSGVpZ2h0ID0gTWF0aC5tYXgobWF4TGluZUhlaWdodCwgaW1nLmhlaWdodCk7CiAgfQogIGNvbnN0IGltZ1dpZHRoID0gTWF0aC5tYXgobWF4WCwgY3VycmVudFgpICsgSU1BR0VfUEFERElORzsKICBjb25zdCBpbWdIZWlnaHQgPSBjdXJyZW50WSArIG1heExpbmVIZWlnaHQgKyBJTUFHRV9QQURESU5HOwogIGNvbnN0IGltZ0RhdGEgPSBuZXcgVWludDhBcnJheShpbWdXaWR0aCAqIGltZ0hlaWdodCAqIDQpOwogIGNvbnN0IGltZ1Jvd1NpemUgPSBpbWdXaWR0aCA8PCAyOwogIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKykgewogICAgY29uc3QgZGF0YSA9IGFyZ3NBcnJheVtpRmlyc3RQSUlYTyArIChxIDw8IDIpXVswXS5kYXRhOwogICAgY29uc3Qgcm93U2l6ZSA9IG1hcFtxXS53IDw8IDI7CiAgICBsZXQgZGF0YU9mZnNldCA9IDA7CiAgICBsZXQgb2Zmc2V0ID0gbWFwW3FdLnggKyBtYXBbcV0ueSAqIGltZ1dpZHRoIDw8IDI7CiAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KDAsIHJvd1NpemUpLCBvZmZzZXQgLSBpbWdSb3dTaXplKTsKICAgIGZvciAobGV0IGsgPSAwLCBrayA9IG1hcFtxXS5oOyBrIDwga2s7IGsrKykgewogICAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KGRhdGFPZmZzZXQsIGRhdGFPZmZzZXQgKyByb3dTaXplKSwgb2Zmc2V0KTsKICAgICAgZGF0YU9mZnNldCArPSByb3dTaXplOwogICAgICBvZmZzZXQgKz0gaW1nUm93U2l6ZTsKICAgIH0KICAgIGltZ0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoZGF0YU9mZnNldCAtIHJvd1NpemUsIGRhdGFPZmZzZXQpLCBvZmZzZXQpOwogICAgd2hpbGUgKG9mZnNldCA+PSAwKSB7CiAgICAgIGRhdGFbb2Zmc2V0IC0gNF0gPSBkYXRhW29mZnNldF07CiAgICAgIGRhdGFbb2Zmc2V0IC0gM10gPSBkYXRhW29mZnNldCArIDFdOwogICAgICBkYXRhW29mZnNldCAtIDJdID0gZGF0YVtvZmZzZXQgKyAyXTsKICAgICAgZGF0YVtvZmZzZXQgLSAxXSA9IGRhdGFbb2Zmc2V0ICsgM107CiAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZV0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSA0XTsKICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgMV0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAzXTsKICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgMl0gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAyXTsKICAgICAgZGF0YVtvZmZzZXQgKyByb3dTaXplICsgM10gPSBkYXRhW29mZnNldCArIHJvd1NpemUgLSAxXTsKICAgICAgb2Zmc2V0IC09IGltZ1Jvd1NpemU7CiAgICB9CiAgfQogIGNvbnN0IGltZyA9IHsKICAgIHdpZHRoOiBpbWdXaWR0aCwKICAgIGhlaWdodDogaW1nSGVpZ2h0CiAgfTsKICBpZiAoY29udGV4dC5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhpbWdXaWR0aCwgaW1nSGVpZ2h0KTsKICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgY3R4LnB1dEltYWdlRGF0YShuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheShpbWdEYXRhLmJ1ZmZlciksIGltZ1dpZHRoLCBpbWdIZWlnaHQpLCAwLCAwKTsKICAgIGltZy5iaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICBpbWcuZGF0YSA9IG51bGw7CiAgfSBlbHNlIHsKICAgIGltZy5raW5kID0gSW1hZ2VLaW5kLlJHQkFfMzJCUFA7CiAgICBpbWcuZGF0YSA9IGltZ0RhdGE7CiAgfQogIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXApOwogIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbaW1nLCBtYXBdKTsKICByZXR1cm4gaUZpcnN0U2F2ZSArIDE7Cn0pOwphZGRTdGF0ZShJbml0aWFsU3RhdGUsIFtPUFMuc2F2ZSwgT1BTLnRyYW5zZm9ybSwgT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCwgT1BTLnJlc3RvcmVdLCBudWxsLCBmdW5jdGlvbiBpdGVyYXRlSW1hZ2VNYXNrR3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXk7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzOwogIGNvbnN0IHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA0OwogIHN3aXRjaCAocG9zKSB7CiAgICBjYXNlIDA6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2F2ZTsKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy50cmFuc2Zvcm07CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OwogICAgY2FzZSAzOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnJlc3RvcmU7CiAgfQogIHRocm93IG5ldyBFcnJvcihgaXRlcmF0ZUltYWdlTWFza0dyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOwp9LCBmdW5jdGlvbiBmb3VuZEltYWdlTWFza0dyb3VwKGNvbnRleHQsIGkpIHsKICBjb25zdCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLID0gMTA7CiAgY29uc3QgTUFYX0lNQUdFU19JTl9NQVNLU19CTE9DSyA9IDEwMDsKICBjb25zdCBNQVhfU0FNRV9JTUFHRVNfSU5fTUFTS1NfQkxPQ0sgPSAxMDAwOwogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBjdXJyID0gY29udGV4dC5pQ3VycjsKICBjb25zdCBpRmlyc3RTYXZlID0gY3VyciAtIDM7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0UElNWE8gPSBjdXJyIC0gMTsKICBsZXQgY291bnQgPSBNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KTsKICBpZiAoY291bnQgPCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLKSB7CiAgICByZXR1cm4gaSAtIChpIC0gaUZpcnN0U2F2ZSkgJSA0OwogIH0KICBsZXQgaXNTYW1lSW1hZ2UgPSBmYWxzZTsKICBsZXQgaVRyYW5zZm9ybSwgdHJhbnNmb3JtQXJnczsKICBjb25zdCBmaXJzdFBJTVhPQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RQSU1YT11bMF07CiAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF0sCiAgICBmaXJzdFRyYW5zZm9ybUFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsxXSwKICAgIGZpcnN0VHJhbnNmb3JtQXJnMiA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzJdLAogICAgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CiAgaWYgKGZpcnN0VHJhbnNmb3JtQXJnMSA9PT0gZmlyc3RUcmFuc2Zvcm1BcmcyKSB7CiAgICBpc1NhbWVJbWFnZSA9IHRydWU7CiAgICBpVHJhbnNmb3JtID0gaUZpcnN0VHJhbnNmb3JtICsgNDsKICAgIGxldCBpUElNWE8gPSBpRmlyc3RQSU1YTyArIDQ7CiAgICBmb3IgKGxldCBxID0gMTsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCwgaVBJTVhPICs9IDQpIHsKICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpVHJhbnNmb3JtXTsKICAgICAgaWYgKGFyZ3NBcnJheVtpUElNWE9dWzBdICE9PSBmaXJzdFBJTVhPQXJnMCB8fCB0cmFuc2Zvcm1BcmdzWzBdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzAgfHwgdHJhbnNmb3JtQXJnc1sxXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcxIHx8IHRyYW5zZm9ybUFyZ3NbMl0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMiB8fCB0cmFuc2Zvcm1BcmdzWzNdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzMpIHsKICAgICAgICBpZiAocSA8IE1JTl9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spIHsKICAgICAgICAgIGlzU2FtZUltYWdlID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvdW50ID0gcTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGlzU2FtZUltYWdlKSB7CiAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCBNQVhfU0FNRV9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spOwogICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDIpOwogICAgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybTsKICAgIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKywgaVRyYW5zZm9ybSArPSA0KSB7CiAgICAgIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaVRyYW5zZm9ybV07CiAgICAgIHBvc2l0aW9uc1txIDw8IDFdID0gdHJhbnNmb3JtQXJnc1s0XTsKICAgICAgcG9zaXRpb25zWyhxIDw8IDEpICsgMV0gPSB0cmFuc2Zvcm1BcmdzWzVdOwogICAgfQogICAgZm5BcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0KTsKICAgIGFyZ3NBcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBbZmlyc3RQSU1YT0FyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMCwgZmlyc3RUcmFuc2Zvcm1BcmcxLCBmaXJzdFRyYW5zZm9ybUFyZzIsIGZpcnN0VHJhbnNmb3JtQXJnMywgcG9zaXRpb25zXSk7CiAgfSBlbHNlIHsKICAgIGNvdW50ID0gTWF0aC5taW4oY291bnQsIE1BWF9JTUFHRVNfSU5fTUFTS1NfQkxPQ0spOwogICAgY29uc3QgaW1hZ2VzID0gW107CiAgICBmb3IgKGxldCBxID0gMDsgcSA8IGNvdW50OyBxKyspIHsKICAgICAgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm0gKyAocSA8PCAyKV07CiAgICAgIGNvbnN0IG1hc2tQYXJhbXMgPSBhcmdzQXJyYXlbaUZpcnN0UElNWE8gKyAocSA8PCAyKV1bMF07CiAgICAgIGltYWdlcy5wdXNoKHsKICAgICAgICBkYXRhOiBtYXNrUGFyYW1zLmRhdGEsCiAgICAgICAgd2lkdGg6IG1hc2tQYXJhbXMud2lkdGgsCiAgICAgICAgaGVpZ2h0OiBtYXNrUGFyYW1zLmhlaWdodCwKICAgICAgICBpbnRlcnBvbGF0ZTogbWFza1BhcmFtcy5pbnRlcnBvbGF0ZSwKICAgICAgICBjb3VudDogbWFza1BhcmFtcy5jb3VudCwKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybUFyZ3MKICAgICAgfSk7CiAgICB9CiAgICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIE9QUy5wYWludEltYWdlTWFza1hPYmplY3RHcm91cCk7CiAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW2ltYWdlc10pOwogIH0KICByZXR1cm4gaUZpcnN0U2F2ZSArIDE7Cn0pOwphZGRTdGF0ZShJbml0aWFsU3RhdGUsIFtPUFMuc2F2ZSwgT1BTLnRyYW5zZm9ybSwgT1BTLnBhaW50SW1hZ2VYT2JqZWN0LCBPUFMucmVzdG9yZV0sIGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgY29uc3QgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY29udGV4dC5pQ3VyciAtIDI7CiAgcmV0dXJuIGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzFdID09PSAwICYmIGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzJdID09PSAwOwp9LCBmdW5jdGlvbiBpdGVyYXRlSW1hZ2VHcm91cChjb250ZXh0LCBpKSB7CiAgY29uc3QgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheSwKICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OwogIGNvbnN0IGlGaXJzdFNhdmUgPSBjb250ZXh0LmlDdXJyIC0gMzsKICBjb25zdCBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICBzd2l0Y2ggKHBvcykgewogICAgY2FzZSAwOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnNhdmU7CiAgICBjYXNlIDE6CiAgICAgIGlmIChmbkFycmF5W2ldICE9PSBPUFMudHJhbnNmb3JtKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGlGaXJzdFRyYW5zZm9ybSA9IGNvbnRleHQuaUN1cnIgLSAyOwogICAgICBjb25zdCBmaXJzdFRyYW5zZm9ybUFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVswXTsKICAgICAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CiAgICAgIGlmIChhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMCB8fCBhcmdzQXJyYXlbaV1bMV0gIT09IDAgfHwgYXJnc0FycmF5W2ldWzJdICE9PSAwIHx8IGFyZ3NBcnJheVtpXVszXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmczKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSAyOgogICAgICBpZiAoZm5BcnJheVtpXSAhPT0gT1BTLnBhaW50SW1hZ2VYT2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGlGaXJzdFBJWE8gPSBjb250ZXh0LmlDdXJyIC0gMTsKICAgICAgY29uc3QgZmlyc3RQSVhPQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RQSVhPXVswXTsKICAgICAgaWYgKGFyZ3NBcnJheVtpXVswXSAhPT0gZmlyc3RQSVhPQXJnMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5yZXN0b3JlOwogIH0KICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7cG9zfWApOwp9LCBmdW5jdGlvbiAoY29udGV4dCwgaSkgewogIGNvbnN0IE1JTl9JTUFHRVNfSU5fQkxPQ0sgPSAzOwogIGNvbnN0IE1BWF9JTUFHRVNfSU5fQkxPQ0sgPSAxMDAwOwogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBjdXJyID0gY29udGV4dC5pQ3VycjsKICBjb25zdCBpRmlyc3RTYXZlID0gY3VyciAtIDM7CiAgY29uc3QgaUZpcnN0VHJhbnNmb3JtID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0UElYTyA9IGN1cnIgLSAxOwogIGNvbnN0IGZpcnN0UElYT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElYT11bMF07CiAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF07CiAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmczID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bM107CiAgY29uc3QgY291bnQgPSBNYXRoLm1pbihNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KSwgTUFYX0lNQUdFU19JTl9CTE9DSyk7CiAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9CTE9DSykgewogICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICB9CiAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDIpOwogIGxldCBpVHJhbnNmb3JtID0gaUZpcnN0VHJhbnNmb3JtOwogIGZvciAobGV0IHEgPSAwOyBxIDwgY291bnQ7IHErKywgaVRyYW5zZm9ybSArPSA0KSB7CiAgICBjb25zdCB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lUcmFuc2Zvcm1dOwogICAgcG9zaXRpb25zW3EgPDwgMV0gPSB0cmFuc2Zvcm1BcmdzWzRdOwogICAgcG9zaXRpb25zWyhxIDw8IDEpICsgMV0gPSB0cmFuc2Zvcm1BcmdzWzVdOwogIH0KICBjb25zdCBhcmdzID0gW2ZpcnN0UElYT0FyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMCwgZmlyc3RUcmFuc2Zvcm1BcmczLCBwb3NpdGlvbnNdOwogIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KTsKICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgYXJncyk7CiAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOwp9KTsKYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbT1BTLmJlZ2luVGV4dCwgT1BTLnNldEZvbnQsIE9QUy5zZXRUZXh0TWF0cml4LCBPUFMuc2hvd1RleHQsIE9QUy5lbmRUZXh0XSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZVNob3dUZXh0R3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDQ7CiAgY29uc3QgcG9zID0gKGkgLSBpRmlyc3RTYXZlKSAlIDU7CiAgc3dpdGNoIChwb3MpIHsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5iZWdpblRleHQ7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2V0Rm9udDsKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5zZXRUZXh0TWF0cml4OwogICAgY2FzZSAzOgogICAgICBpZiAoZm5BcnJheVtpXSAhPT0gT1BTLnNob3dUZXh0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGlGaXJzdFNldEZvbnQgPSBjb250ZXh0LmlDdXJyIC0gMzsKICAgICAgY29uc3QgZmlyc3RTZXRGb250QXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVswXTsKICAgICAgY29uc3QgZmlyc3RTZXRGb250QXJnMSA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVsxXTsKICAgICAgaWYgKGFyZ3NBcnJheVtpXVswXSAhPT0gZmlyc3RTZXRGb250QXJnMCB8fCBhcmdzQXJyYXlbaV1bMV0gIT09IGZpcnN0U2V0Rm9udEFyZzEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIDQ6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuZW5kVGV4dDsKICB9CiAgdGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlU2hvd1RleHRHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTsKfSwgZnVuY3Rpb24gKGNvbnRleHQsIGkpIHsKICBjb25zdCBNSU5fQ0hBUlNfSU5fQkxPQ0sgPSAzOwogIGNvbnN0IE1BWF9DSEFSU19JTl9CTE9DSyA9IDEwMDA7CiAgY29uc3QgZm5BcnJheSA9IGNvbnRleHQuZm5BcnJheSwKICAgIGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OwogIGNvbnN0IGN1cnIgPSBjb250ZXh0LmlDdXJyOwogIGNvbnN0IGlGaXJzdEJlZ2luVGV4dCA9IGN1cnIgLSA0OwogIGNvbnN0IGlGaXJzdFNldEZvbnQgPSBjdXJyIC0gMzsKICBjb25zdCBpRmlyc3RTZXRUZXh0TWF0cml4ID0gY3VyciAtIDI7CiAgY29uc3QgaUZpcnN0U2hvd1RleHQgPSBjdXJyIC0gMTsKICBjb25zdCBpRmlyc3RFbmRUZXh0ID0gY3VycjsKICBjb25zdCBmaXJzdFNldEZvbnRBcmcwID0gYXJnc0FycmF5W2lGaXJzdFNldEZvbnRdWzBdOwogIGNvbnN0IGZpcnN0U2V0Rm9udEFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMV07CiAgbGV0IGNvdW50ID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSAtIGlGaXJzdEJlZ2luVGV4dCkgLyA1KSwgTUFYX0NIQVJTX0lOX0JMT0NLKTsKICBpZiAoY291bnQgPCBNSU5fQ0hBUlNfSU5fQkxPQ0spIHsKICAgIHJldHVybiBpIC0gKGkgLSBpRmlyc3RCZWdpblRleHQpICUgNTsKICB9CiAgbGV0IGlGaXJzdCA9IGlGaXJzdEJlZ2luVGV4dDsKICBpZiAoaUZpcnN0QmVnaW5UZXh0ID49IDQgJiYgZm5BcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XSA9PT0gZm5BcnJheVtpRmlyc3RTZXRGb250XSAmJiBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDNdID09PSBmbkFycmF5W2lGaXJzdFNldFRleHRNYXRyaXhdICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMl0gPT09IGZuQXJyYXlbaUZpcnN0U2hvd1RleHRdICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gMV0gPT09IGZuQXJyYXlbaUZpcnN0RW5kVGV4dF0gJiYgYXJnc0FycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDRdWzBdID09PSBmaXJzdFNldEZvbnRBcmcwICYmIGFyZ3NBcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XVsxXSA9PT0gZmlyc3RTZXRGb250QXJnMSkgewogICAgY291bnQrKzsKICAgIGlGaXJzdCAtPSA1OwogIH0KICBsZXQgaUVuZFRleHQgPSBpRmlyc3QgKyA0OwogIGZvciAobGV0IHEgPSAxOyBxIDwgY291bnQ7IHErKykgewogICAgZm5BcnJheS5zcGxpY2UoaUVuZFRleHQsIDMpOwogICAgYXJnc0FycmF5LnNwbGljZShpRW5kVGV4dCwgMyk7CiAgICBpRW5kVGV4dCArPSAyOwogIH0KICByZXR1cm4gaUVuZFRleHQgKyAxOwp9KTsKY2xhc3MgTnVsbE9wdGltaXplciB7CiAgY29uc3RydWN0b3IocXVldWUpIHsKICAgIHRoaXMucXVldWUgPSBxdWV1ZTsKICB9CiAgX29wdGltaXplKCkge30KICBwdXNoKGZuLCBhcmdzKSB7CiAgICB0aGlzLnF1ZXVlLmZuQXJyYXkucHVzaChmbik7CiAgICB0aGlzLnF1ZXVlLmFyZ3NBcnJheS5wdXNoKGFyZ3MpOwogICAgdGhpcy5fb3B0aW1pemUoKTsKICB9CiAgZmx1c2goKSB7fQogIHJlc2V0KCkge30KfQpjbGFzcyBRdWV1ZU9wdGltaXplciBleHRlbmRzIE51bGxPcHRpbWl6ZXIgewogIGNvbnN0cnVjdG9yKHF1ZXVlKSB7CiAgICBzdXBlcihxdWV1ZSk7CiAgICB0aGlzLnN0YXRlID0gbnVsbDsKICAgIHRoaXMuY29udGV4dCA9IHsKICAgICAgaUN1cnI6IDAsCiAgICAgIGZuQXJyYXk6IHF1ZXVlLmZuQXJyYXksCiAgICAgIGFyZ3NBcnJheTogcXVldWUuYXJnc0FycmF5LAogICAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDogZmFsc2UKICAgIH07CiAgICB0aGlzLm1hdGNoID0gbnVsbDsKICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IDA7CiAgfQogIHNldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCh2YWx1ZSkgewogICAgdGhpcy5jb250ZXh0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gdmFsdWU7CiAgfQogIF9vcHRpbWl6ZSgpIHsKICAgIGNvbnN0IGZuQXJyYXkgPSB0aGlzLnF1ZXVlLmZuQXJyYXk7CiAgICBsZXQgaSA9IHRoaXMubGFzdFByb2Nlc3NlZCwKICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDsKICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7CiAgICBsZXQgbWF0Y2ggPSB0aGlzLm1hdGNoOwogICAgaWYgKCFzdGF0ZSAmJiAhbWF0Y2ggJiYgaSArIDEgPT09IGlpICYmICFJbml0aWFsU3RhdGVbZm5BcnJheVtpXV0pIHsKICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gaWk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CiAgICB3aGlsZSAoaSA8IGlpKSB7CiAgICAgIGlmIChtYXRjaCkgewogICAgICAgIGNvbnN0IGl0ZXJhdGUgPSAoMCwgbWF0Y2guaXRlcmF0ZUZuKShjb250ZXh0LCBpKTsKICAgICAgICBpZiAoaXRlcmF0ZSkgewogICAgICAgICAgaSsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGkgPSAoMCwgbWF0Y2gucHJvY2Vzc0ZuKShjb250ZXh0LCBpICsgMSk7CiAgICAgICAgaWkgPSBmbkFycmF5Lmxlbmd0aDsKICAgICAgICBtYXRjaCA9IG51bGw7CiAgICAgICAgc3RhdGUgPSBudWxsOwogICAgICAgIGlmIChpID49IGlpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGUgPSAoc3RhdGUgfHwgSW5pdGlhbFN0YXRlKVtmbkFycmF5W2ldXTsKICAgICAgaWYgKCFzdGF0ZSB8fCBBcnJheS5pc0FycmF5KHN0YXRlKSkgewogICAgICAgIGkrKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb250ZXh0LmlDdXJyID0gaTsKICAgICAgaSsrOwogICAgICBpZiAoc3RhdGUuY2hlY2tGbiAmJiAhKDAsIHN0YXRlLmNoZWNrRm4pKGNvbnRleHQpKSB7CiAgICAgICAgc3RhdGUgPSBudWxsOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG1hdGNoID0gc3RhdGU7CiAgICAgIHN0YXRlID0gbnVsbDsKICAgIH0KICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKICAgIHRoaXMubWF0Y2ggPSBtYXRjaDsKICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IGk7CiAgfQogIGZsdXNoKCkgewogICAgd2hpbGUgKHRoaXMubWF0Y2gpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5xdWV1ZS5mbkFycmF5Lmxlbmd0aDsKICAgICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gKDAsIHRoaXMubWF0Y2gucHJvY2Vzc0ZuKSh0aGlzLmNvbnRleHQsIGxlbmd0aCk7CiAgICAgIHRoaXMubWF0Y2ggPSBudWxsOwogICAgICB0aGlzLnN0YXRlID0gbnVsbDsKICAgICAgdGhpcy5fb3B0aW1pemUoKTsKICAgIH0KICB9CiAgcmVzZXQoKSB7CiAgICB0aGlzLnN0YXRlID0gbnVsbDsKICAgIHRoaXMubWF0Y2ggPSBudWxsOwogICAgdGhpcy5sYXN0UHJvY2Vzc2VkID0gMDsKICB9Cn0KY2xhc3MgT3BlcmF0b3JMaXN0IHsKICBzdGF0aWMgQ0hVTktfU0laRSA9IDEwMDA7CiAgc3RhdGljIENIVU5LX1NJWkVfQUJPVVQgPSB0aGlzLkNIVU5LX1NJWkUgLSA1OwogIGNvbnN0cnVjdG9yKGludGVudCA9IDAsIHN0cmVhbVNpbmspIHsKICAgIHRoaXMuX3N0cmVhbVNpbmsgPSBzdHJlYW1TaW5rOwogICAgdGhpcy5mbkFycmF5ID0gW107CiAgICB0aGlzLmFyZ3NBcnJheSA9IFtdOwogICAgdGhpcy5vcHRpbWl6ZXIgPSBzdHJlYW1TaW5rICYmICEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5PUExJU1QpID8gbmV3IFF1ZXVlT3B0aW1pemVyKHRoaXMpIDogbmV3IE51bGxPcHRpbWl6ZXIodGhpcyk7CiAgICB0aGlzLmRlcGVuZGVuY2llcyA9IG5ldyBTZXQoKTsKICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDsKICAgIHRoaXMud2VpZ2h0ID0gMDsKICAgIHRoaXMuX3Jlc29sdmVkID0gc3RyZWFtU2luayA/IG51bGwgOiBQcm9taXNlLnJlc29sdmUoKTsKICB9CiAgc2V0IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKHZhbHVlKSB7CiAgICB0aGlzLm9wdGltaXplci5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9IHZhbHVlOwogIH0KICBnZXQgbGVuZ3RoKCkgewogICAgcmV0dXJuIHRoaXMuYXJnc0FycmF5Lmxlbmd0aDsKICB9CiAgZ2V0IHJlYWR5KCkgewogICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkIHx8IHRoaXMuX3N0cmVhbVNpbmsucmVhZHk7CiAgfQogIGdldCB0b3RhbExlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLl90b3RhbExlbmd0aCArIHRoaXMubGVuZ3RoOwogIH0KICBhZGRPcChmbiwgYXJncykgewogICAgdGhpcy5vcHRpbWl6ZXIucHVzaChmbiwgYXJncyk7CiAgICB0aGlzLndlaWdodCsrOwogICAgaWYgKHRoaXMuX3N0cmVhbVNpbmspIHsKICAgICAgaWYgKHRoaXMud2VpZ2h0ID49IE9wZXJhdG9yTGlzdC5DSFVOS19TSVpFKSB7CiAgICAgICAgdGhpcy5mbHVzaCgpOwogICAgICB9IGVsc2UgaWYgKHRoaXMud2VpZ2h0ID49IE9wZXJhdG9yTGlzdC5DSFVOS19TSVpFX0FCT1VUICYmIChmbiA9PT0gT1BTLnJlc3RvcmUgfHwgZm4gPT09IE9QUy5lbmRUZXh0KSkgewogICAgICAgIHRoaXMuZmx1c2goKTsKICAgICAgfQogICAgfQogIH0KICBhZGRJbWFnZU9wcyhmbiwgYXJncywgb3B0aW9uYWxDb250ZW50LCBoYXNNYXNrID0gZmFsc2UpIHsKICAgIGlmIChoYXNNYXNrKSB7CiAgICAgIHRoaXMuYWRkT3AoT1BTLnNhdmUpOwogICAgICB0aGlzLmFkZE9wKE9QUy5zZXRHU3RhdGUsIFtbWyJTTWFzayIsIGZhbHNlXV1dKTsKICAgIH0KICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG9wdGlvbmFsQ29udGVudF0pOwogICAgfQogICAgdGhpcy5hZGRPcChmbiwgYXJncyk7CiAgICBpZiAob3B0aW9uYWxDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgdGhpcy5hZGRPcChPUFMuZW5kTWFya2VkQ29udGVudCwgW10pOwogICAgfQogICAgaWYgKGhhc01hc2spIHsKICAgICAgdGhpcy5hZGRPcChPUFMucmVzdG9yZSk7CiAgICB9CiAgfQogIGFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSkgewogICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmRlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CiAgICB0aGlzLmFkZE9wKE9QUy5kZXBlbmRlbmN5LCBbZGVwZW5kZW5jeV0pOwogIH0KICBhZGREZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKSB7CiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgZGVwZW5kZW5jaWVzKSB7CiAgICAgIHRoaXMuYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5KTsKICAgIH0KICB9CiAgYWRkT3BMaXN0KG9wTGlzdCkgewogICAgaWYgKCEob3BMaXN0IGluc3RhbmNlb2YgT3BlcmF0b3JMaXN0KSkgewogICAgICB3YXJuKCdhZGRPcExpc3QgLSBpZ25vcmluZyBpbnZhbGlkICJvcExpc3QiIHBhcmFtZXRlci4nKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG9wTGlzdC5kZXBlbmRlbmNpZXMpIHsKICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gb3BMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgdGhpcy5hZGRPcChvcExpc3QuZm5BcnJheVtpXSwgb3BMaXN0LmFyZ3NBcnJheVtpXSk7CiAgICB9CiAgfQogIGdldElSKCkgewogICAgcmV0dXJuIHsKICAgICAgZm5BcnJheTogdGhpcy5mbkFycmF5LAogICAgICBhcmdzQXJyYXk6IHRoaXMuYXJnc0FycmF5LAogICAgICBsZW5ndGg6IHRoaXMubGVuZ3RoCiAgICB9OwogIH0KICBnZXQgX3RyYW5zZmVycygpIHsKICAgIGNvbnN0IHRyYW5zZmVycyA9IFtdOwogICAgY29uc3QgewogICAgICBmbkFycmF5LAogICAgICBhcmdzQXJyYXksCiAgICAgIGxlbmd0aAogICAgfSA9IHRoaXM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHN3aXRjaCAoZm5BcnJheVtpXSkgewogICAgICAgIGNhc2UgT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OgogICAgICAgIGNhc2UgT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6CiAgICAgICAgY2FzZSBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OgogICAgICAgICAgY29uc3QgYXJnID0gYXJnc0FycmF5W2ldWzBdOwogICAgICAgICAgaWYgKCFhcmcuY2FjaGVkICYmIGFyZy5kYXRhPy5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewogICAgICAgICAgICB0cmFuc2ZlcnMucHVzaChhcmcuZGF0YS5idWZmZXIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPUFMuY29uc3RydWN0UGF0aDoKICAgICAgICAgIGNvbnN0IFssIFtkYXRhXSwgbWluTWF4XSA9IGFyZ3NBcnJheVtpXTsKICAgICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICAgIHRyYW5zZmVycy5wdXNoKGRhdGEuYnVmZmVyLCBtaW5NYXguYnVmZmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJhbnNmZXJzOwogIH0KICBmbHVzaChsYXN0Q2h1bmsgPSBmYWxzZSwgc2VwYXJhdGVBbm5vdHMgPSBudWxsKSB7CiAgICB0aGlzLm9wdGltaXplci5mbHVzaCgpOwogICAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICB0aGlzLl90b3RhbExlbmd0aCArPSBsZW5ndGg7CiAgICB0aGlzLl9zdHJlYW1TaW5rLmVucXVldWUoewogICAgICBmbkFycmF5OiB0aGlzLmZuQXJyYXksCiAgICAgIGFyZ3NBcnJheTogdGhpcy5hcmdzQXJyYXksCiAgICAgIGxhc3RDaHVuaywKICAgICAgc2VwYXJhdGVBbm5vdHMsCiAgICAgIGxlbmd0aAogICAgfSwgMSwgdGhpcy5fdHJhbnNmZXJzKTsKICAgIHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7CiAgICB0aGlzLmZuQXJyYXkubGVuZ3RoID0gMDsKICAgIHRoaXMuYXJnc0FycmF5Lmxlbmd0aCA9IDA7CiAgICB0aGlzLndlaWdodCA9IDA7CiAgICB0aGlzLm9wdGltaXplci5yZXNldCgpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvaW1hZ2UuanMKCgoKCgoKCgoKCmZ1bmN0aW9uIHJlc2l6ZUltYWdlTWFzayhzcmMsIGJwYywgdzEsIGgxLCB3MiwgaDIpIHsKICBjb25zdCBsZW5ndGggPSB3MiAqIGgyOwogIGxldCBkZXN0OwogIGlmIChicGMgPD0gOCkgewogICAgZGVzdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgfSBlbHNlIGlmIChicGMgPD0gMTYpIHsKICAgIGRlc3QgPSBuZXcgVWludDE2QXJyYXkobGVuZ3RoKTsKICB9IGVsc2UgewogICAgZGVzdCA9IG5ldyBVaW50MzJBcnJheShsZW5ndGgpOwogIH0KICBjb25zdCB4UmF0aW8gPSB3MSAvIHcyOwogIGNvbnN0IHlSYXRpbyA9IGgxIC8gaDI7CiAgbGV0IGksCiAgICBqLAogICAgcHksCiAgICBuZXdJbmRleCA9IDAsCiAgICBvbGRJbmRleDsKICBjb25zdCB4U2NhbGVkID0gbmV3IFVpbnQxNkFycmF5KHcyKTsKICBjb25zdCB3MVNjYW5saW5lID0gdzE7CiAgZm9yIChpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgIHhTY2FsZWRbaV0gPSBNYXRoLmZsb29yKGkgKiB4UmF0aW8pOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgaDI7IGkrKykgewogICAgcHkgPSBNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzFTY2FubGluZTsKICAgIGZvciAoaiA9IDA7IGogPCB3MjsgaisrKSB7CiAgICAgIG9sZEluZGV4ID0gcHkgKyB4U2NhbGVkW2pdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4XTsKICAgIH0KICB9CiAgcmV0dXJuIGRlc3Q7Cn0KY2xhc3MgUERGSW1hZ2UgewogIGNvbnN0cnVjdG9yKHsKICAgIHhyZWYsCiAgICByZXMsCiAgICBpbWFnZSwKICAgIGlzSW5saW5lID0gZmFsc2UsCiAgICBzbWFzayA9IG51bGwsCiAgICBtYXNrID0gbnVsbCwKICAgIGlzTWFzayA9IGZhbHNlLAogICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICB0aGlzLmltYWdlID0gaW1hZ2U7CiAgICBjb25zdCBkaWN0ID0gaW1hZ2UuZGljdDsKICAgIGNvbnN0IGZpbHRlciA9IGRpY3QuZ2V0KCJGIiwgIkZpbHRlciIpOwogICAgbGV0IGZpbHRlck5hbWU7CiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyLm5hbWU7CiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkgewogICAgICBjb25zdCBmaWx0ZXJaZXJvID0geHJlZi5mZXRjaElmUmVmKGZpbHRlclswXSk7CiAgICAgIGlmIChmaWx0ZXJaZXJvIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIGZpbHRlck5hbWUgPSBmaWx0ZXJaZXJvLm5hbWU7CiAgICAgIH0KICAgIH0KICAgIHN3aXRjaCAoZmlsdGVyTmFtZSkgewogICAgICBjYXNlICJKUFhEZWNvZGUiOgogICAgICAgICh7CiAgICAgICAgICB3aWR0aDogaW1hZ2Uud2lkdGgsCiAgICAgICAgICBoZWlnaHQ6IGltYWdlLmhlaWdodCwKICAgICAgICAgIGNvbXBvbmVudHNDb3VudDogaW1hZ2UubnVtQ29tcHMsCiAgICAgICAgICBiaXRzUGVyQ29tcG9uZW50OiBpbWFnZS5iaXRzUGVyQ29tcG9uZW50CiAgICAgICAgfSA9IEpweEltYWdlLnBhcnNlSW1hZ2VQcm9wZXJ0aWVzKGltYWdlLnN0cmVhbSkpOwogICAgICAgIGltYWdlLnN0cmVhbS5yZXNldCgpOwogICAgICAgIHRoaXMuanB4RGVjb2Rlck9wdGlvbnMgPSB7CiAgICAgICAgICBudW1Db21wb25lbnRzOiAwLAogICAgICAgICAgaXNJbmRleGVkQ29sb3JtYXA6IGZhbHNlLAogICAgICAgICAgc21hc2tJbkRhdGE6IGRpY3QuaGFzKCJTTWFza0luRGF0YSIpCiAgICAgICAgfTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiSkJJRzJEZWNvZGUiOgogICAgICAgIGltYWdlLmJpdHNQZXJDb21wb25lbnQgPSAxOwogICAgICAgIGltYWdlLm51bUNvbXBzID0gMTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGxldCB3aWR0aCA9IGRpY3QuZ2V0KCJXIiwgIldpZHRoIik7CiAgICBsZXQgaGVpZ2h0ID0gZGljdC5nZXQoIkgiLCAiSGVpZ2h0Iik7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbWFnZS53aWR0aCkgJiYgaW1hZ2Uud2lkdGggPiAwICYmIE51bWJlci5pc0ludGVnZXIoaW1hZ2UuaGVpZ2h0KSAmJiBpbWFnZS5oZWlnaHQgPiAwICYmIChpbWFnZS53aWR0aCAhPT0gd2lkdGggfHwgaW1hZ2UuaGVpZ2h0ICE9PSBoZWlnaHQpKSB7CiAgICAgIHdhcm4oIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YSwgIiArICJyYXRoZXIgdGhhbiB0aGUgaW1hZ2UgZGljdGlvbmFyeS4iKTsKICAgICAgd2lkdGggPSBpbWFnZS53aWR0aDsKICAgICAgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0OwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgdmFsaWRXaWR0aCA9IHR5cGVvZiB3aWR0aCA9PT0gIm51bWJlciIgJiYgd2lkdGggPiAwLAogICAgICAgIHZhbGlkSGVpZ2h0ID0gdHlwZW9mIGhlaWdodCA9PT0gIm51bWJlciIgJiYgaGVpZ2h0ID4gMDsKICAgICAgaWYgKCF2YWxpZFdpZHRoIHx8ICF2YWxpZEhlaWdodCkgewogICAgICAgIGlmICghaW1hZ2UuZmFsbGJhY2tEaW1zKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgaW1hZ2Ugd2lkdGg6ICR7d2lkdGh9IG9yIGhlaWdodDogJHtoZWlnaHR9YCk7CiAgICAgICAgfQogICAgICAgIHdhcm4oIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgcGFyZW50IGltYWdlLCBmb3IgU01hc2svTWFzayBkYXRhLiIpOwogICAgICAgIGlmICghdmFsaWRXaWR0aCkgewogICAgICAgICAgd2lkdGggPSBpbWFnZS5mYWxsYmFja0RpbXMud2lkdGg7CiAgICAgICAgfQogICAgICAgIGlmICghdmFsaWRIZWlnaHQpIHsKICAgICAgICAgIGhlaWdodCA9IGltYWdlLmZhbGxiYWNrRGltcy5oZWlnaHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLndpZHRoID0gd2lkdGg7CiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKICAgIHRoaXMuaW50ZXJwb2xhdGUgPSBkaWN0LmdldCgiSSIsICJJbnRlcnBvbGF0ZSIpOwogICAgdGhpcy5pbWFnZU1hc2sgPSBkaWN0LmdldCgiSU0iLCAiSW1hZ2VNYXNrIikgfHwgZmFsc2U7CiAgICB0aGlzLm1hdHRlID0gZGljdC5nZXQoIk1hdHRlIikgfHwgZmFsc2U7CiAgICBsZXQgYml0c1BlckNvbXBvbmVudCA9IGltYWdlLmJpdHNQZXJDb21wb25lbnQ7CiAgICBpZiAoIWJpdHNQZXJDb21wb25lbnQpIHsKICAgICAgYml0c1BlckNvbXBvbmVudCA9IGRpY3QuZ2V0KCJCUEMiLCAiQml0c1BlckNvbXBvbmVudCIpOwogICAgICBpZiAoIWJpdHNQZXJDb21wb25lbnQpIHsKICAgICAgICBpZiAodGhpcy5pbWFnZU1hc2spIHsKICAgICAgICAgIGJpdHNQZXJDb21wb25lbnQgPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEJpdHMgcGVyIGNvbXBvbmVudCBtaXNzaW5nIGluIGltYWdlOiAke3RoaXMuaW1hZ2VNYXNrfWApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5icGMgPSBiaXRzUGVyQ29tcG9uZW50OwogICAgaWYgKCF0aGlzLmltYWdlTWFzaykgewogICAgICBsZXQgY29sb3JTcGFjZSA9IGRpY3QuZ2V0UmF3KCJDUyIpIHx8IGRpY3QuZ2V0UmF3KCJDb2xvclNwYWNlIik7CiAgICAgIGNvbnN0IGhhc0NvbG9yU3BhY2UgPSAhIWNvbG9yU3BhY2U7CiAgICAgIGlmICghaGFzQ29sb3JTcGFjZSkgewogICAgICAgIGlmICh0aGlzLmpweERlY29kZXJPcHRpb25zKSB7CiAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoIkRldmljZVJHQkEiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3dpdGNoIChpbWFnZS5udW1Db21wcykgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VHcmF5Iik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoIkRldmljZVJHQiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VDTVlLIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbWFnZXMgd2l0aCAke2ltYWdlLm51bUNvbXBzfSBjb2xvciBjb21wb25lbnRzIG5vdCBzdXBwb3J0ZWQuYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuanB4RGVjb2Rlck9wdGlvbnM/LnNtYXNrSW5EYXRhKSB7CiAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VSR0JBIik7CiAgICAgIH0KICAgICAgdGhpcy5jb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLnBhcnNlKHsKICAgICAgICBjczogY29sb3JTcGFjZSwKICAgICAgICB4cmVmLAogICAgICAgIHJlc291cmNlczogaXNJbmxpbmUgPyByZXMgOiBudWxsLAogICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgfSk7CiAgICAgIHRoaXMubnVtQ29tcHMgPSB0aGlzLmNvbG9yU3BhY2UubnVtQ29tcHM7CiAgICAgIGlmICh0aGlzLmpweERlY29kZXJPcHRpb25zKSB7CiAgICAgICAgdGhpcy5qcHhEZWNvZGVyT3B0aW9ucy5udW1Db21wb25lbnRzID0gaGFzQ29sb3JTcGFjZSA/IHRoaXMubnVtQ29tcHMgOiAwOwogICAgICAgIHRoaXMuanB4RGVjb2Rlck9wdGlvbnMuaXNJbmRleGVkQ29sb3JtYXAgPSB0aGlzLmNvbG9yU3BhY2UubmFtZSA9PT0gIkluZGV4ZWQiOwogICAgICB9CiAgICB9CiAgICB0aGlzLmRlY29kZSA9IGRpY3QuZ2V0QXJyYXkoIkQiLCAiRGVjb2RlIik7CiAgICB0aGlzLm5lZWRzRGVjb2RlID0gZmFsc2U7CiAgICBpZiAodGhpcy5kZWNvZGUgJiYgKHRoaXMuY29sb3JTcGFjZSAmJiAhdGhpcy5jb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwgYml0c1BlckNvbXBvbmVudCkgfHwgaXNNYXNrICYmICFDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwgMSkpKSB7CiAgICAgIHRoaXMubmVlZHNEZWNvZGUgPSB0cnVlOwogICAgICBjb25zdCBtYXggPSAoMSA8PCBiaXRzUGVyQ29tcG9uZW50KSAtIDE7CiAgICAgIHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzID0gW107CiAgICAgIHRoaXMuZGVjb2RlQWRkZW5kcyA9IFtdOwogICAgICBjb25zdCBpc0luZGV4ZWQgPSB0aGlzLmNvbG9yU3BhY2U/Lm5hbWUgPT09ICJJbmRleGVkIjsKICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSAwOyBpIDwgdGhpcy5kZWNvZGUubGVuZ3RoOyBpICs9IDIsICsraikgewogICAgICAgIGNvbnN0IGRtaW4gPSB0aGlzLmRlY29kZVtpXTsKICAgICAgICBjb25zdCBkbWF4ID0gdGhpcy5kZWNvZGVbaSArIDFdOwogICAgICAgIHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzW2pdID0gaXNJbmRleGVkID8gKGRtYXggLSBkbWluKSAvIG1heCA6IGRtYXggLSBkbWluOwogICAgICAgIHRoaXMuZGVjb2RlQWRkZW5kc1tqXSA9IGlzSW5kZXhlZCA/IGRtaW4gOiBtYXggKiBkbWluOwogICAgICB9CiAgICB9CiAgICBpZiAoc21hc2spIHsKICAgICAgc21hc2suZmFsbGJhY2tEaW1zID8/PSB7CiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0CiAgICAgIH07CiAgICAgIHRoaXMuc21hc2sgPSBuZXcgUERGSW1hZ2UoewogICAgICAgIHhyZWYsCiAgICAgICAgcmVzLAogICAgICAgIGltYWdlOiBzbWFzaywKICAgICAgICBpc0lubGluZSwKICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChtYXNrKSB7CiAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGNvbnN0IG1hc2tEaWN0ID0gbWFzay5kaWN0LAogICAgICAgICAgaW1hZ2VNYXNrID0gbWFza0RpY3QuZ2V0KCJJTSIsICJJbWFnZU1hc2siKTsKICAgICAgICBpZiAoIWltYWdlTWFzaykgewogICAgICAgICAgd2FybigiSWdub3JpbmcgL01hc2sgaW4gaW1hZ2Ugd2l0aG91dCAvSW1hZ2VNYXNrLiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXNrLmZhbGxiYWNrRGltcyA/Pz0gewogICAgICAgICAgICB3aWR0aCwKICAgICAgICAgICAgaGVpZ2h0CiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5tYXNrID0gbmV3IFBERkltYWdlKHsKICAgICAgICAgICAgeHJlZiwKICAgICAgICAgICAgcmVzLAogICAgICAgICAgICBpbWFnZTogbWFzaywKICAgICAgICAgICAgaXNJbmxpbmUsCiAgICAgICAgICAgIGlzTWFzazogdHJ1ZSwKICAgICAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5tYXNrID0gbWFzazsKICAgICAgfQogICAgfQogIH0KICBzdGF0aWMgYXN5bmMgYnVpbGRJbWFnZSh7CiAgICB4cmVmLAogICAgcmVzLAogICAgaW1hZ2UsCiAgICBpc0lubGluZSA9IGZhbHNlLAogICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZTsKICAgIGxldCBzbWFza0RhdGEgPSBudWxsOwogICAgbGV0IG1hc2tEYXRhID0gbnVsbDsKICAgIGNvbnN0IHNtYXNrID0gaW1hZ2UuZGljdC5nZXQoIlNNYXNrIik7CiAgICBjb25zdCBtYXNrID0gaW1hZ2UuZGljdC5nZXQoIk1hc2siKTsKICAgIGlmIChzbWFzaykgewogICAgICBpZiAoc21hc2sgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgc21hc2tEYXRhID0gc21hc2s7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigiVW5zdXBwb3J0ZWQgL1NNYXNrIGZvcm1hdC4iKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChtYXNrKSB7CiAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgQmFzZVN0cmVhbSB8fCBBcnJheS5pc0FycmF5KG1hc2spKSB7CiAgICAgICAgbWFza0RhdGEgPSBtYXNrOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIlVuc3VwcG9ydGVkIC9NYXNrIGZvcm1hdC4iKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBQREZJbWFnZSh7CiAgICAgIHhyZWYsCiAgICAgIHJlcywKICAgICAgaW1hZ2U6IGltYWdlRGF0YSwKICAgICAgaXNJbmxpbmUsCiAgICAgIHNtYXNrOiBzbWFza0RhdGEsCiAgICAgIG1hc2s6IG1hc2tEYXRhLAogICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgIH0pOwogIH0KICBzdGF0aWMgY3JlYXRlUmF3TWFzayh7CiAgICBpbWdBcnJheSwKICAgIHdpZHRoLAogICAgaGVpZ2h0LAogICAgaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW0sCiAgICBpbnZlcnNlRGVjb2RlLAogICAgaW50ZXJwb2xhdGUKICB9KSB7CiAgICBjb25zdCBjb21wdXRlZExlbmd0aCA9ICh3aWR0aCArIDcgPj4gMykgKiBoZWlnaHQ7CiAgICBjb25zdCBhY3R1YWxMZW5ndGggPSBpbWdBcnJheS5ieXRlTGVuZ3RoOwogICAgY29uc3QgaGF2ZUZ1bGxEYXRhID0gY29tcHV0ZWRMZW5ndGggPT09IGFjdHVhbExlbmd0aDsKICAgIGxldCBkYXRhLCBpOwogICAgaWYgKGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtICYmICghaW52ZXJzZURlY29kZSB8fCBoYXZlRnVsbERhdGEpKSB7CiAgICAgIGRhdGEgPSBpbWdBcnJheTsKICAgIH0gZWxzZSBpZiAoIWludmVyc2VEZWNvZGUpIHsKICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGltZ0FycmF5KTsKICAgIH0gZWxzZSB7CiAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShjb21wdXRlZExlbmd0aCk7CiAgICAgIGRhdGEuc2V0KGltZ0FycmF5KTsKICAgICAgZGF0YS5maWxsKDB4ZmYsIGFjdHVhbExlbmd0aCk7CiAgICB9CiAgICBpZiAoaW52ZXJzZURlY29kZSkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgYWN0dWFsTGVuZ3RoOyBpKyspIHsKICAgICAgICBkYXRhW2ldIF49IDB4ZmY7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRhdGEsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGludGVycG9sYXRlCiAgICB9OwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlTWFzayh7CiAgICBpbWdBcnJheSwKICAgIHdpZHRoLAogICAgaGVpZ2h0LAogICAgaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW0sCiAgICBpbnZlcnNlRGVjb2RlLAogICAgaW50ZXJwb2xhdGUsCiAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9IGZhbHNlCiAgfSkgewogICAgY29uc3QgaXNTaW5nbGVPcGFxdWVQaXhlbCA9IHdpZHRoID09PSAxICYmIGhlaWdodCA9PT0gMSAmJiBpbnZlcnNlRGVjb2RlID09PSAoaW1nQXJyYXkubGVuZ3RoID09PSAwIHx8ICEhKGltZ0FycmF5WzBdICYgMTI4KSk7CiAgICBpZiAoaXNTaW5nbGVPcGFxdWVQaXhlbCkgewogICAgICByZXR1cm4gewogICAgICAgIGlzU2luZ2xlT3BhcXVlUGl4ZWwKICAgICAgfTsKICAgIH0KICAgIGlmIChpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgICBpZiAoSW1hZ2VSZXNpemVyLm5lZWRzVG9CZVJlc2l6ZWQod2lkdGgsIGhlaWdodCkpIHsKICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7CiAgICAgICAgY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEoewogICAgICAgICAgc3JjOiBpbWdBcnJheSwKICAgICAgICAgIGRlc3Q6IGRhdGEsCiAgICAgICAgICB3aWR0aCwKICAgICAgICAgIGhlaWdodCwKICAgICAgICAgIG5vbkJsYWNrQ29sb3I6IDAsCiAgICAgICAgICBpbnZlcnNlRGVjb2RlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIEltYWdlUmVzaXplci5jcmVhdGVJbWFnZSh7CiAgICAgICAgICBraW5kOiBJbWFnZUtpbmQuUkdCQV8zMkJQUCwKICAgICAgICAgIGRhdGEsCiAgICAgICAgICB3aWR0aCwKICAgICAgICAgIGhlaWdodCwKICAgICAgICAgIGludGVycG9sYXRlCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNvbnN0IGltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpOwogICAgICBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQSh7CiAgICAgICAgc3JjOiBpbWdBcnJheSwKICAgICAgICBkZXN0OiBpbWdEYXRhLmRhdGEsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIG5vbkJsYWNrQ29sb3I6IDAsCiAgICAgICAgaW52ZXJzZURlY29kZQogICAgICB9KTsKICAgICAgY3R4LnB1dEltYWdlRGF0YShpbWdEYXRhLCAwLCAwKTsKICAgICAgY29uc3QgYml0bWFwID0gY2FudmFzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpOwogICAgICByZXR1cm4gewogICAgICAgIGRhdGE6IG51bGwsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIGludGVycG9sYXRlLAogICAgICAgIGJpdG1hcAogICAgICB9OwogICAgfQogICAgcmV0dXJuIHRoaXMuY3JlYXRlUmF3TWFzayh7CiAgICAgIGltZ0FycmF5LAogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBpbnZlcnNlRGVjb2RlLAogICAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbSwKICAgICAgaW50ZXJwb2xhdGUKICAgIH0pOwogIH0KICBnZXQgZHJhd1dpZHRoKCkgewogICAgcmV0dXJuIE1hdGgubWF4KHRoaXMud2lkdGgsIHRoaXMuc21hc2s/LndpZHRoIHx8IDAsIHRoaXMubWFzaz8ud2lkdGggfHwgMCk7CiAgfQogIGdldCBkcmF3SGVpZ2h0KCkgewogICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuaGVpZ2h0LCB0aGlzLnNtYXNrPy5oZWlnaHQgfHwgMCwgdGhpcy5tYXNrPy5oZWlnaHQgfHwgMCk7CiAgfQogIGRlY29kZUJ1ZmZlcihidWZmZXIpIHsKICAgIGNvbnN0IGJwYyA9IHRoaXMuYnBjOwogICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOwogICAgY29uc3QgZGVjb2RlQWRkZW5kcyA9IHRoaXMuZGVjb2RlQWRkZW5kczsKICAgIGNvbnN0IGRlY29kZUNvZWZmaWNpZW50cyA9IHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzOwogICAgY29uc3QgbWF4ID0gKDEgPDwgYnBjKSAtIDE7CiAgICBsZXQgaSwgaWk7CiAgICBpZiAoYnBjID09PSAxKSB7CiAgICAgIGZvciAoaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBidWZmZXJbaV0gPSArIWJ1ZmZlcltpXTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgaW5kZXggPSAwOwogICAgZm9yIChpID0gMCwgaWkgPSB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29tcHM7IGorKykgewogICAgICAgIGJ1ZmZlcltpbmRleF0gPSBNYXRoQ2xhbXAoZGVjb2RlQWRkZW5kc1tqXSArIGJ1ZmZlcltpbmRleF0gKiBkZWNvZGVDb2VmZmljaWVudHNbal0sIDAsIG1heCk7CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgfQogIH0KICBnZXRDb21wb25lbnRzKGJ1ZmZlcikgewogICAgY29uc3QgYnBjID0gdGhpcy5icGM7CiAgICBpZiAoYnBjID09PSA4KSB7CiAgICAgIHJldHVybiBidWZmZXI7CiAgICB9CiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGg7CiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodDsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGNvbnN0IGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogbnVtQ29tcHM7CiAgICBsZXQgYnVmZmVyUG9zID0gMDsKICAgIGxldCBvdXRwdXQ7CiAgICBpZiAoYnBjIDw9IDgpIHsKICAgICAgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKICAgIH0gZWxzZSBpZiAoYnBjIDw9IDE2KSB7CiAgICAgIG91dHB1dCA9IG5ldyBVaW50MTZBcnJheShsZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgb3V0cHV0ID0gbmV3IFVpbnQzMkFycmF5KGxlbmd0aCk7CiAgICB9CiAgICBjb25zdCByb3dDb21wcyA9IHdpZHRoICogbnVtQ29tcHM7CiAgICBjb25zdCBtYXggPSAoMSA8PCBicGMpIC0gMTsKICAgIGxldCBpID0gMCwKICAgICAgaWksCiAgICAgIGJ1ZjsKICAgIGlmIChicGMgPT09IDEpIHsKICAgICAgbGV0IG1hc2ssIGxvb3AxRW5kLCBsb29wMkVuZDsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgewogICAgICAgIGxvb3AxRW5kID0gaSArIChyb3dDb21wcyAmIH43KTsKICAgICAgICBsb29wMkVuZCA9IGkgKyByb3dDb21wczsKICAgICAgICB3aGlsZSAoaSA8IGxvb3AxRW5kKSB7CiAgICAgICAgICBidWYgPSBidWZmZXJbYnVmZmVyUG9zKytdOwogICAgICAgICAgb3V0cHV0W2ldID0gYnVmID4+IDcgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyAxXSA9IGJ1ZiA+PiA2ICYgMTsKICAgICAgICAgIG91dHB1dFtpICsgMl0gPSBidWYgPj4gNSAmIDE7CiAgICAgICAgICBvdXRwdXRbaSArIDNdID0gYnVmID4+IDQgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyA0XSA9IGJ1ZiA+PiAzICYgMTsKICAgICAgICAgIG91dHB1dFtpICsgNV0gPSBidWYgPj4gMiAmIDE7CiAgICAgICAgICBvdXRwdXRbaSArIDZdID0gYnVmID4+IDEgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyA3XSA9IGJ1ZiAmIDE7CiAgICAgICAgICBpICs9IDg7CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgbG9vcDJFbmQpIHsKICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcltidWZmZXJQb3MrK107CiAgICAgICAgICBtYXNrID0gMTI4OwogICAgICAgICAgd2hpbGUgKGkgPCBsb29wMkVuZCkgewogICAgICAgICAgICBvdXRwdXRbaSsrXSA9ICshIShidWYgJiBtYXNrKTsKICAgICAgICAgICAgbWFzayA+Pj0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCBiaXRzID0gMDsKICAgICAgYnVmID0gMDsKICAgICAgZm9yIChpID0gMCwgaWkgPSBsZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgaWYgKGkgJSByb3dDb21wcyA9PT0gMCkgewogICAgICAgICAgYnVmID0gMDsKICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoYml0cyA8IGJwYykgewogICAgICAgICAgYnVmID0gYnVmIDw8IDggfCBidWZmZXJbYnVmZmVyUG9zKytdOwogICAgICAgICAgYml0cyArPSA4OwogICAgICAgIH0KICAgICAgICBjb25zdCByZW1haW5pbmdCaXRzID0gYml0cyAtIGJwYzsKICAgICAgICBsZXQgdmFsdWUgPSBidWYgPj4gcmVtYWluaW5nQml0czsKICAgICAgICBpZiAodmFsdWUgPCAwKSB7CiAgICAgICAgICB2YWx1ZSA9IDA7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkgewogICAgICAgICAgdmFsdWUgPSBtYXg7CiAgICAgICAgfQogICAgICAgIG91dHB1dFtpXSA9IHZhbHVlOwogICAgICAgIGJ1ZiAmPSAoMSA8PCByZW1haW5pbmdCaXRzKSAtIDE7CiAgICAgICAgYml0cyA9IHJlbWFpbmluZ0JpdHM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQogIGFzeW5jIGZpbGxPcGFjaXR5KHJnYmFCdWYsIHdpZHRoLCBoZWlnaHQsIGFjdHVhbEhlaWdodCwgaW1hZ2UpIHsKICAgIGNvbnN0IHNtYXNrID0gdGhpcy5zbWFzazsKICAgIGNvbnN0IG1hc2sgPSB0aGlzLm1hc2s7CiAgICBsZXQgYWxwaGFCdWYsIHN3LCBzaCwgaSwgaWksIGo7CiAgICBpZiAoc21hc2spIHsKICAgICAgc3cgPSBzbWFzay53aWR0aDsKICAgICAgc2ggPSBzbWFzay5oZWlnaHQ7CiAgICAgIGFscGhhQnVmID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN3ICogc2gpOwogICAgICBhd2FpdCBzbWFzay5maWxsR3JheUJ1ZmZlcihhbHBoYUJ1Zik7CiAgICAgIGlmIChzdyAhPT0gd2lkdGggfHwgc2ggIT09IGhlaWdodCkgewogICAgICAgIGFscGhhQnVmID0gcmVzaXplSW1hZ2VNYXNrKGFscGhhQnVmLCBzbWFzay5icGMsIHN3LCBzaCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobWFzaykgewogICAgICBpZiAobWFzayBpbnN0YW5jZW9mIFBERkltYWdlKSB7CiAgICAgICAgc3cgPSBtYXNrLndpZHRoOwogICAgICAgIHNoID0gbWFzay5oZWlnaHQ7CiAgICAgICAgYWxwaGFCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3cgKiBzaCk7CiAgICAgICAgbWFzay5udW1Db21wcyA9IDE7CiAgICAgICAgYXdhaXQgbWFzay5maWxsR3JheUJ1ZmZlcihhbHBoYUJ1Zik7CiAgICAgICAgZm9yIChpID0gMCwgaWkgPSBzdyAqIHNoOyBpIDwgaWk7ICsraSkgewogICAgICAgICAgYWxwaGFCdWZbaV0gPSAyNTUgLSBhbHBoYUJ1ZltpXTsKICAgICAgICB9CiAgICAgICAgaWYgKHN3ICE9PSB3aWR0aCB8fCBzaCAhPT0gaGVpZ2h0KSB7CiAgICAgICAgICBhbHBoYUJ1ZiA9IHJlc2l6ZUltYWdlTWFzayhhbHBoYUJ1ZiwgbWFzay5icGMsIHN3LCBzaCwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWFzaykpIHsKICAgICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCk7CiAgICAgICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOwogICAgICAgIGZvciAoaSA9IDAsIGlpID0gd2lkdGggKiBoZWlnaHQ7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgICBsZXQgb3BhY2l0eSA9IDA7CiAgICAgICAgICBjb25zdCBpbWFnZU9mZnNldCA9IGkgKiBudW1Db21wczsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1Db21wczsgKytqKSB7CiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gaW1hZ2VbaW1hZ2VPZmZzZXQgKyBqXTsKICAgICAgICAgICAgY29uc3QgbWFza09mZnNldCA9IGogKiAyOwogICAgICAgICAgICBpZiAoY29sb3IgPCBtYXNrW21hc2tPZmZzZXRdIHx8IGNvbG9yID4gbWFza1ttYXNrT2Zmc2V0ICsgMV0pIHsKICAgICAgICAgICAgICBvcGFjaXR5ID0gMjU1OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBhbHBoYUJ1ZltpXSA9IG9wYWNpdHk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5rbm93biBtYXNrIGZvcm1hdC4iKTsKICAgICAgfQogICAgfQogICAgaWYgKGFscGhhQnVmKSB7CiAgICAgIGZvciAoaSA9IDAsIGogPSAzLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7ICsraSwgaiArPSA0KSB7CiAgICAgICAgcmdiYUJ1ZltqXSA9IGFscGhhQnVmW2ldOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGkgPSAwLCBqID0gMywgaWkgPSB3aWR0aCAqIGFjdHVhbEhlaWdodDsgaSA8IGlpOyArK2ksIGogKz0gNCkgewogICAgICAgIHJnYmFCdWZbal0gPSAyNTU7CiAgICAgIH0KICAgIH0KICB9CiAgdW5kb1ByZWJsZW5kKGJ1ZmZlciwgd2lkdGgsIGhlaWdodCkgewogICAgY29uc3QgbWF0dGUgPSB0aGlzLnNtYXNrPy5tYXR0ZTsKICAgIGlmICghbWF0dGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbWF0dGVSZ2IgPSB0aGlzLmNvbG9yU3BhY2UuZ2V0UmdiKG1hdHRlLCAwKTsKICAgIGNvbnN0IG1hdHRlUiA9IG1hdHRlUmdiWzBdOwogICAgY29uc3QgbWF0dGVHID0gbWF0dGVSZ2JbMV07CiAgICBjb25zdCBtYXR0ZUIgPSBtYXR0ZVJnYlsyXTsKICAgIGNvbnN0IGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogNDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgY29uc3QgYWxwaGEgPSBidWZmZXJbaSArIDNdOwogICAgICBpZiAoYWxwaGEgPT09IDApIHsKICAgICAgICBidWZmZXJbaV0gPSAyNTU7CiAgICAgICAgYnVmZmVyW2kgKyAxXSA9IDI1NTsKICAgICAgICBidWZmZXJbaSArIDJdID0gMjU1OwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGsgPSAyNTUgLyBhbHBoYTsKICAgICAgYnVmZmVyW2ldID0gKGJ1ZmZlcltpXSAtIG1hdHRlUikgKiBrICsgbWF0dGVSOwogICAgICBidWZmZXJbaSArIDFdID0gKGJ1ZmZlcltpICsgMV0gLSBtYXR0ZUcpICogayArIG1hdHRlRzsKICAgICAgYnVmZmVyW2kgKyAyXSA9IChidWZmZXJbaSArIDJdIC0gbWF0dGVCKSAqIGsgKyBtYXR0ZUI7CiAgICB9CiAgfQogIGFzeW5jIGNyZWF0ZUltYWdlRGF0YShmb3JjZVJHQkEgPSBmYWxzZSwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSBmYWxzZSkgewogICAgY29uc3QgZHJhd1dpZHRoID0gdGhpcy5kcmF3V2lkdGg7CiAgICBjb25zdCBkcmF3SGVpZ2h0ID0gdGhpcy5kcmF3SGVpZ2h0OwogICAgY29uc3QgaW1nRGF0YSA9IHsKICAgICAgd2lkdGg6IGRyYXdXaWR0aCwKICAgICAgaGVpZ2h0OiBkcmF3SGVpZ2h0LAogICAgICBpbnRlcnBvbGF0ZTogdGhpcy5pbnRlcnBvbGF0ZSwKICAgICAga2luZDogMCwKICAgICAgZGF0YTogbnVsbAogICAgfTsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGNvbnN0IG9yaWdpbmFsV2lkdGggPSB0aGlzLndpZHRoOwogICAgY29uc3Qgb3JpZ2luYWxIZWlnaHQgPSB0aGlzLmhlaWdodDsKICAgIGNvbnN0IGJwYyA9IHRoaXMuYnBjOwogICAgY29uc3Qgcm93Qnl0ZXMgPSBvcmlnaW5hbFdpZHRoICogbnVtQ29tcHMgKiBicGMgKyA3ID4+IDM7CiAgICBjb25zdCBtdXN0QmVSZXNpemVkID0gaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgJiYgSW1hZ2VSZXNpemVyLm5lZWRzVG9CZVJlc2l6ZWQoZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTsKICAgIGlmICghdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrICYmIHRoaXMuY29sb3JTcGFjZS5uYW1lID09PSAiRGV2aWNlUkdCQSIpIHsKICAgICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQkFfMzJCUFA7CiAgICAgIGNvbnN0IGltZ0FycmF5ID0gaW1nRGF0YS5kYXRhID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogb3JpZ2luYWxXaWR0aCAqIDQsIHt9KTsKICAgICAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgICAgaWYgKCFtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVCaXRtYXAoSW1hZ2VLaW5kLlJHQkFfMzJCUFAsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgaW1nQXJyYXkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKGltZ0RhdGEsIGZhbHNlKTsKICAgICAgfQogICAgICByZXR1cm4gaW1nRGF0YTsKICAgIH0KICAgIGlmICghZm9yY2VSR0JBKSB7CiAgICAgIGxldCBraW5kOwogICAgICBpZiAodGhpcy5jb2xvclNwYWNlLm5hbWUgPT09ICJEZXZpY2VHcmF5IiAmJiBicGMgPT09IDEpIHsKICAgICAgICBraW5kID0gSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOwogICAgICB9IGVsc2UgaWYgKHRoaXMuY29sb3JTcGFjZS5uYW1lID09PSAiRGV2aWNlUkdCIiAmJiBicGMgPT09IDggJiYgIXRoaXMubmVlZHNEZWNvZGUpIHsKICAgICAgICBraW5kID0gSW1hZ2VLaW5kLlJHQl8yNEJQUDsKICAgICAgfQogICAgICBpZiAoa2luZCAmJiAhdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrICYmIGRyYXdXaWR0aCA9PT0gb3JpZ2luYWxXaWR0aCAmJiBkcmF3SGVpZ2h0ID09PSBvcmlnaW5hbEhlaWdodCkgewogICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgdGhpcy4jZ2V0SW1hZ2Uob3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQpOwogICAgICAgIGlmIChpbWFnZSkgewogICAgICAgICAgcmV0dXJuIGltYWdlOwogICAgICAgIH0KICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMsIHt9KTsKICAgICAgICBpZiAoaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgICAgICAgIGlmIChtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgICAgIHJldHVybiBJbWFnZVJlc2l6ZXIuY3JlYXRlSW1hZ2UoewogICAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgICAga2luZCwKICAgICAgICAgICAgICB3aWR0aDogZHJhd1dpZHRoLAogICAgICAgICAgICAgIGhlaWdodDogZHJhd0hlaWdodCwKICAgICAgICAgICAgICBpbnRlcnBvbGF0ZTogdGhpcy5pbnRlcnBvbGF0ZQogICAgICAgICAgICB9LCB0aGlzLm5lZWRzRGVjb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUJpdG1hcChraW5kLCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgZGF0YSk7CiAgICAgICAgfQogICAgICAgIGltZ0RhdGEua2luZCA9IGtpbmQ7CiAgICAgICAgaW1nRGF0YS5kYXRhID0gZGF0YTsKICAgICAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgewogICAgICAgICAgYXNzZXJ0KGtpbmQgPT09IEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCwgIlBERkltYWdlLmNyZWF0ZUltYWdlRGF0YTogVGhlIGltYWdlIG11c3QgYmUgZ3JheXNjYWxlLiIpOwogICAgICAgICAgY29uc3QgYnVmZmVyID0gaW1nRGF0YS5kYXRhOwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgYnVmZmVyW2ldIF49IDB4ZmY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbWdEYXRhOwogICAgICB9CiAgICAgIGlmICh0aGlzLmltYWdlIGluc3RhbmNlb2YgSnBlZ1N0cmVhbSAmJiAhdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrICYmICF0aGlzLm5lZWRzRGVjb2RlKSB7CiAgICAgICAgbGV0IGltYWdlTGVuZ3RoID0gb3JpZ2luYWxIZWlnaHQgKiByb3dCeXRlczsKICAgICAgICBpZiAoaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgJiYgIW11c3RCZVJlc2l6ZWQpIHsKICAgICAgICAgIGxldCBpc0hhbmRsZWQgPSBmYWxzZTsKICAgICAgICAgIHN3aXRjaCAodGhpcy5jb2xvclNwYWNlLm5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CiAgICAgICAgICAgICAgaW1hZ2VMZW5ndGggKj0gNDsKICAgICAgICAgICAgICBpc0hhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJEZXZpY2VSR0IiOgogICAgICAgICAgICAgIGltYWdlTGVuZ3RoID0gaW1hZ2VMZW5ndGggLyAzICogNDsKICAgICAgICAgICAgICBpc0hhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJEZXZpY2VDTVlLIjoKICAgICAgICAgICAgICBpc0hhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzSGFuZGxlZCkgewogICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuI2dldEltYWdlKGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7CiAgICAgICAgICAgIGlmIChpbWFnZSkgewogICAgICAgICAgICAgIHJldHVybiBpbWFnZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByZ2JhID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKGltYWdlTGVuZ3RoLCB7CiAgICAgICAgICAgICAgZHJhd1dpZHRoLAogICAgICAgICAgICAgIGRyYXdIZWlnaHQsCiAgICAgICAgICAgICAgZm9yY2VSR0JBOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVCaXRtYXAoSW1hZ2VLaW5kLlJHQkFfMzJCUFAsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgcmdiYSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN3aXRjaCAodGhpcy5jb2xvclNwYWNlLm5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CiAgICAgICAgICAgICAgaW1hZ2VMZW5ndGggKj0gMzsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKICAgICAgICAgICAgY2FzZSAiRGV2aWNlQ01ZSyI6CiAgICAgICAgICAgICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQl8yNEJQUDsKICAgICAgICAgICAgICBpbWdEYXRhLmRhdGEgPSBhd2FpdCB0aGlzLmdldEltYWdlQnl0ZXMoaW1hZ2VMZW5ndGgsIHsKICAgICAgICAgICAgICAgIGRyYXdXaWR0aCwKICAgICAgICAgICAgICAgIGRyYXdIZWlnaHQsCiAgICAgICAgICAgICAgICBmb3JjZVJHQjogdHJ1ZQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGlmIChtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKGltZ0RhdGEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gaW1nRGF0YTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGltZ0FycmF5ID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXMsIHsKICAgICAgaW50ZXJuYWw6IHRydWUKICAgIH0pOwogICAgY29uc3QgYWN0dWFsSGVpZ2h0ID0gMCB8IGltZ0FycmF5Lmxlbmd0aCAvIHJvd0J5dGVzICogZHJhd0hlaWdodCAvIG9yaWdpbmFsSGVpZ2h0OwogICAgY29uc3QgY29tcHMgPSB0aGlzLmdldENvbXBvbmVudHMoaW1nQXJyYXkpOwogICAgbGV0IGFscGhhMDEsIG1heWJlVW5kb1ByZWJsZW5kOwogICAgbGV0IGNhbnZhcywgY3R4LCBjYW52YXNJbWdEYXRhLCBkYXRhOwogICAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkICYmICFtdXN0QmVSZXNpemVkKSB7CiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTsKICAgICAgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNhbnZhc0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7CiAgICAgIGRhdGEgPSBjYW52YXNJbWdEYXRhLmRhdGE7CiAgICB9CiAgICBpbWdEYXRhLmtpbmQgPSBJbWFnZUtpbmQuUkdCQV8zMkJQUDsKICAgIGlmICghZm9yY2VSR0JBICYmICF0aGlzLnNtYXNrICYmICF0aGlzLm1hc2spIHsKICAgICAgaWYgKCFpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCB8fCBtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQl8yNEJQUDsKICAgICAgICBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRyYXdXaWR0aCAqIGRyYXdIZWlnaHQgKiAzKTsKICAgICAgICBhbHBoYTAxID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBhcnIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIpOwogICAgICAgIGFyci5maWxsKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8gMHhmZjAwMDAwMCA6IDB4MDAwMDAwZmYpOwogICAgICAgIGFscGhhMDEgPSAxOwogICAgICB9CiAgICAgIG1heWJlVW5kb1ByZWJsZW5kID0gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAoIWlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIHx8IG11c3RCZVJlc2l6ZWQpIHsKICAgICAgICBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRyYXdXaWR0aCAqIGRyYXdIZWlnaHQgKiA0KTsKICAgICAgfQogICAgICBhbHBoYTAxID0gMTsKICAgICAgbWF5YmVVbmRvUHJlYmxlbmQgPSB0cnVlOwogICAgICBhd2FpdCB0aGlzLmZpbGxPcGFjaXR5KGRhdGEsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgYWN0dWFsSGVpZ2h0LCBjb21wcyk7CiAgICB9CiAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgewogICAgICB0aGlzLmRlY29kZUJ1ZmZlcihjb21wcyk7CiAgICB9CiAgICB0aGlzLmNvbG9yU3BhY2UuZmlsbFJnYihkYXRhLCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGJwYywgY29tcHMsIGFscGhhMDEpOwogICAgaWYgKG1heWJlVW5kb1ByZWJsZW5kKSB7CiAgICAgIHRoaXMudW5kb1ByZWJsZW5kKGRhdGEsIGRyYXdXaWR0aCwgYWN0dWFsSGVpZ2h0KTsKICAgIH0KICAgIGlmIChpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCAmJiAhbXVzdEJlUmVzaXplZCkgewogICAgICBjdHgucHV0SW1hZ2VEYXRhKGNhbnZhc0ltZ0RhdGEsIDAsIDApOwogICAgICBjb25zdCBiaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgZGF0YTogbnVsbCwKICAgICAgICB3aWR0aDogZHJhd1dpZHRoLAogICAgICAgIGhlaWdodDogZHJhd0hlaWdodCwKICAgICAgICBiaXRtYXAsCiAgICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUKICAgICAgfTsKICAgIH0KICAgIGltZ0RhdGEuZGF0YSA9IGRhdGE7CiAgICBpZiAobXVzdEJlUmVzaXplZCkgewogICAgICByZXR1cm4gSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKGltZ0RhdGEpOwogICAgfQogICAgcmV0dXJuIGltZ0RhdGE7CiAgfQogIGFzeW5jIGZpbGxHcmF5QnVmZmVyKGJ1ZmZlcikgewogICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOwogICAgaWYgKG51bUNvbXBzICE9PSAxKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgUmVhZGluZyBncmF5IHNjYWxlIGZyb20gYSBjb2xvciBpbWFnZTogJHtudW1Db21wc31gKTsKICAgIH0KICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aDsKICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0OwogICAgY29uc3QgYnBjID0gdGhpcy5icGM7CiAgICBjb25zdCByb3dCeXRlcyA9IHdpZHRoICogbnVtQ29tcHMgKiBicGMgKyA3ID4+IDM7CiAgICBjb25zdCBpbWdBcnJheSA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2VCeXRlcyhoZWlnaHQgKiByb3dCeXRlcywgewogICAgICBpbnRlcm5hbDogdHJ1ZQogICAgfSk7CiAgICBjb25zdCBjb21wcyA9IHRoaXMuZ2V0Q29tcG9uZW50cyhpbWdBcnJheSk7CiAgICBsZXQgaSwgbGVuZ3RoOwogICAgaWYgKGJwYyA9PT0gMSkgewogICAgICBsZW5ndGggPSB3aWR0aCAqIGhlaWdodDsKICAgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltpXSA9IGNvbXBzW2ldIC0gMSAmIDI1NTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSAtY29tcHNbaV0gJiAyNTU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLm5lZWRzRGVjb2RlKSB7CiAgICAgIHRoaXMuZGVjb2RlQnVmZmVyKGNvbXBzKTsKICAgIH0KICAgIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0OwogICAgY29uc3Qgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYnBjKSAtIDEpOwogICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIGJ1ZmZlcltpXSA9IHNjYWxlICogY29tcHNbaV07CiAgICB9CiAgfQogIGNyZWF0ZUJpdG1hcChraW5kLCB3aWR0aCwgaGVpZ2h0LCBzcmMpIHsKICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGxldCBpbWdEYXRhOwogICAgaWYgKGtpbmQgPT09IEltYWdlS2luZC5SR0JBXzMyQlBQKSB7CiAgICAgIGltZ0RhdGEgPSBuZXcgSW1hZ2VEYXRhKHNyYywgd2lkdGgsIGhlaWdodCk7CiAgICB9IGVsc2UgewogICAgICBpbWdEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29udmVydFRvUkdCQSh7CiAgICAgICAga2luZCwKICAgICAgICBzcmMsCiAgICAgICAgZGVzdDogbmV3IFVpbnQzMkFycmF5KGltZ0RhdGEuZGF0YS5idWZmZXIpLAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBpbnZlcnNlRGVjb2RlOiB0aGlzLm5lZWRzRGVjb2RlCiAgICAgIH0pOwogICAgfQogICAgY3R4LnB1dEltYWdlRGF0YShpbWdEYXRhLCAwLCAwKTsKICAgIGNvbnN0IGJpdG1hcCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTsKICAgIHJldHVybiB7CiAgICAgIGRhdGE6IG51bGwsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGJpdG1hcCwKICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUKICAgIH07CiAgfQogIGFzeW5jICNnZXRJbWFnZSh3aWR0aCwgaGVpZ2h0KSB7CiAgICBjb25zdCBiaXRtYXAgPSBhd2FpdCB0aGlzLmltYWdlLmdldFRyYW5zZmVyYWJsZUltYWdlKCk7CiAgICBpZiAoIWJpdG1hcCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRhdGE6IG51bGwsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGJpdG1hcCwKICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUKICAgIH07CiAgfQogIGFzeW5jIGdldEltYWdlQnl0ZXMobGVuZ3RoLCB7CiAgICBkcmF3V2lkdGgsCiAgICBkcmF3SGVpZ2h0LAogICAgZm9yY2VSR0JBID0gZmFsc2UsCiAgICBmb3JjZVJHQiA9IGZhbHNlLAogICAgaW50ZXJuYWwgPSBmYWxzZQogIH0pIHsKICAgIHRoaXMuaW1hZ2UucmVzZXQoKTsKICAgIHRoaXMuaW1hZ2UuZHJhd1dpZHRoID0gZHJhd1dpZHRoIHx8IHRoaXMud2lkdGg7CiAgICB0aGlzLmltYWdlLmRyYXdIZWlnaHQgPSBkcmF3SGVpZ2h0IHx8IHRoaXMuaGVpZ2h0OwogICAgdGhpcy5pbWFnZS5mb3JjZVJHQkEgPSAhIWZvcmNlUkdCQTsKICAgIHRoaXMuaW1hZ2UuZm9yY2VSR0IgPSAhIWZvcmNlUkdCOwogICAgY29uc3QgaW1hZ2VCeXRlcyA9IGF3YWl0IHRoaXMuaW1hZ2UuZ2V0SW1hZ2VEYXRhKGxlbmd0aCwgdGhpcy5qcHhEZWNvZGVyT3B0aW9ucyk7CiAgICBpZiAoaW50ZXJuYWwgfHwgdGhpcy5pbWFnZSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSkgewogICAgICByZXR1cm4gaW1hZ2VCeXRlczsKICAgIH0KICAgIGFzc2VydChpbWFnZUJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSwgJ1BERkltYWdlLmdldEltYWdlQnl0ZXM6IFVuc3VwcG9ydGVkICJpbWFnZUJ5dGVzIiB0eXBlLicpOwogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGltYWdlQnl0ZXMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZXZhbHVhdG9yLmpzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNvbnN0IERlZmF1bHRQYXJ0aWFsRXZhbHVhdG9yT3B0aW9ucyA9IE9iamVjdC5mcmVlemUoewogIG1heEltYWdlU2l6ZTogLTEsCiAgZGlzYWJsZUZvbnRGYWNlOiBmYWxzZSwKICBpZ25vcmVFcnJvcnM6IGZhbHNlLAogIGlzRXZhbFN1cHBvcnRlZDogdHJ1ZSwKICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDogZmFsc2UsCiAgaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQ6IGZhbHNlLAogIGNhbnZhc01heEFyZWFJbkJ5dGVzOiAtMSwKICBmb250RXh0cmFQcm9wZXJ0aWVzOiBmYWxzZSwKICB1c2VTeXN0ZW1Gb250czogdHJ1ZSwKICB1c2VXYXNtOiB0cnVlLAogIHVzZVdvcmtlckZldGNoOiB0cnVlLAogIGNNYXBVcmw6IG51bGwsCiAgaWNjVXJsOiBudWxsLAogIHN0YW5kYXJkRm9udERhdGFVcmw6IG51bGwsCiAgd2FzbVVybDogbnVsbAp9KTsKY29uc3QgUGF0dGVyblR5cGUgPSB7CiAgVElMSU5HOiAxLAogIFNIQURJTkc6IDIKfTsKY29uc3QgVEVYVF9DSFVOS19CQVRDSF9TSVpFID0gMTA7CmNvbnN0IGRlZmVycmVkID0gUHJvbWlzZS5yZXNvbHZlKCk7CmZ1bmN0aW9uIG5vcm1hbGl6ZUJsZW5kTW9kZSh2YWx1ZSwgcGFyc2luZ0FycmF5ID0gZmFsc2UpIHsKICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlKSB7CiAgICAgIGNvbnN0IG1heWJlQk0gPSBub3JtYWxpemVCbGVuZE1vZGUodmFsLCB0cnVlKTsKICAgICAgaWYgKG1heWJlQk0pIHsKICAgICAgICByZXR1cm4gbWF5YmVCTTsKICAgICAgfQogICAgfQogICAgd2FybihgVW5zdXBwb3J0ZWQgYmxlbmQgbW9kZSBBcnJheTogJHt2YWx1ZX1gKTsKICAgIHJldHVybiAic291cmNlLW92ZXIiOwogIH0KICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICBpZiAocGFyc2luZ0FycmF5KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuICJzb3VyY2Utb3ZlciI7CiAgfQogIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgY2FzZSAiTm9ybWFsIjoKICAgIGNhc2UgIkNvbXBhdGlibGUiOgogICAgICByZXR1cm4gInNvdXJjZS1vdmVyIjsKICAgIGNhc2UgIk11bHRpcGx5IjoKICAgICAgcmV0dXJuICJtdWx0aXBseSI7CiAgICBjYXNlICJTY3JlZW4iOgogICAgICByZXR1cm4gInNjcmVlbiI7CiAgICBjYXNlICJPdmVybGF5IjoKICAgICAgcmV0dXJuICJvdmVybGF5IjsKICAgIGNhc2UgIkRhcmtlbiI6CiAgICAgIHJldHVybiAiZGFya2VuIjsKICAgIGNhc2UgIkxpZ2h0ZW4iOgogICAgICByZXR1cm4gImxpZ2h0ZW4iOwogICAgY2FzZSAiQ29sb3JEb2RnZSI6CiAgICAgIHJldHVybiAiY29sb3ItZG9kZ2UiOwogICAgY2FzZSAiQ29sb3JCdXJuIjoKICAgICAgcmV0dXJuICJjb2xvci1idXJuIjsKICAgIGNhc2UgIkhhcmRMaWdodCI6CiAgICAgIHJldHVybiAiaGFyZC1saWdodCI7CiAgICBjYXNlICJTb2Z0TGlnaHQiOgogICAgICByZXR1cm4gInNvZnQtbGlnaHQiOwogICAgY2FzZSAiRGlmZmVyZW5jZSI6CiAgICAgIHJldHVybiAiZGlmZmVyZW5jZSI7CiAgICBjYXNlICJFeGNsdXNpb24iOgogICAgICByZXR1cm4gImV4Y2x1c2lvbiI7CiAgICBjYXNlICJIdWUiOgogICAgICByZXR1cm4gImh1ZSI7CiAgICBjYXNlICJTYXR1cmF0aW9uIjoKICAgICAgcmV0dXJuICJzYXR1cmF0aW9uIjsKICAgIGNhc2UgIkNvbG9yIjoKICAgICAgcmV0dXJuICJjb2xvciI7CiAgICBjYXNlICJMdW1pbm9zaXR5IjoKICAgICAgcmV0dXJuICJsdW1pbm9zaXR5IjsKICB9CiAgaWYgKHBhcnNpbmdBcnJheSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHdhcm4oYFVuc3VwcG9ydGVkIGJsZW5kIG1vZGU6ICR7dmFsdWUubmFtZX1gKTsKICByZXR1cm4gInNvdXJjZS1vdmVyIjsKfQpmdW5jdGlvbiBhZGRMb2NhbGx5Q2FjaGVkSW1hZ2VPcHMob3BMaXN0LCBkYXRhKSB7CiAgaWYgKGRhdGEub2JqSWQpIHsKICAgIG9wTGlzdC5hZGREZXBlbmRlbmN5KGRhdGEub2JqSWQpOwogIH0KICBvcExpc3QuYWRkSW1hZ2VPcHMoZGF0YS5mbiwgZGF0YS5hcmdzLCBkYXRhLm9wdGlvbmFsQ29udGVudCwgZGF0YS5oYXNNYXNrKTsKICBpZiAoZGF0YS5mbiA9PT0gT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCAmJiBkYXRhLmFyZ3NbMF0/LmNvdW50ID4gMCkgewogICAgZGF0YS5hcmdzWzBdLmNvdW50Kys7CiAgfQp9CmNsYXNzIFRpbWVTbG90TWFuYWdlciB7CiAgc3RhdGljIFRJTUVfU0xPVF9EVVJBVElPTl9NUyA9IDIwOwogIHN0YXRpYyBDSEVDS19USU1FX0VWRVJZID0gMTAwOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5yZXNldCgpOwogIH0KICBjaGVjaygpIHsKICAgIGlmICgrK3RoaXMuY2hlY2tlZCA8IFRpbWVTbG90TWFuYWdlci5DSEVDS19USU1FX0VWRVJZKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXMuY2hlY2tlZCA9IDA7CiAgICByZXR1cm4gdGhpcy5lbmRUaW1lIDw9IERhdGUubm93KCk7CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5lbmRUaW1lID0gRGF0ZS5ub3coKSArIFRpbWVTbG90TWFuYWdlci5USU1FX1NMT1RfRFVSQVRJT05fTVM7CiAgICB0aGlzLmNoZWNrZWQgPSAwOwogIH0KfQpjbGFzcyBQYXJ0aWFsRXZhbHVhdG9yIHsKICBjb25zdHJ1Y3Rvcih7CiAgICB4cmVmLAogICAgaGFuZGxlciwKICAgIHBhZ2VJbmRleCwKICAgIGlkRmFjdG9yeSwKICAgIGZvbnRDYWNoZSwKICAgIGJ1aWx0SW5DTWFwQ2FjaGUsCiAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICBnbG9iYWxJbWFnZUNhY2hlLAogICAgc3lzdGVtRm9udENhY2hlLAogICAgb3B0aW9ucyA9IG51bGwKICB9KSB7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OwogICAgdGhpcy5pZEZhY3RvcnkgPSBpZEZhY3Rvcnk7CiAgICB0aGlzLmZvbnRDYWNoZSA9IGZvbnRDYWNoZTsKICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IGJ1aWx0SW5DTWFwQ2FjaGU7CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSA9IHN0YW5kYXJkRm9udERhdGFDYWNoZTsKICAgIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOwogICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlID0gZ2xvYmFsSW1hZ2VDYWNoZTsKICAgIHRoaXMuc3lzdGVtRm9udENhY2hlID0gc3lzdGVtRm9udENhY2hlOwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnM7CiAgICB0aGlzLnR5cGUzRm9udFJlZnMgPSBudWxsOwogICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlID0gbmV3IFJlZ2lvbmFsSW1hZ2VDYWNoZSgpOwogICAgdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kID0gdGhpcy5mZXRjaEJ1aWx0SW5DTWFwLmJpbmQodGhpcyk7CiAgfQogIGdldCBfcGRmRnVuY3Rpb25GYWN0b3J5KCkgewogICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IFBERkZ1bmN0aW9uRmFjdG9yeSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaXNFdmFsU3VwcG9ydGVkOiB0aGlzLm9wdGlvbnMuaXNFdmFsU3VwcG9ydGVkCiAgICB9KTsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9wZGZGdW5jdGlvbkZhY3RvcnkiLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogIH0KICBnZXQgcGFyc2luZ1R5cGUzRm9udCgpIHsKICAgIHJldHVybiAhIXRoaXMudHlwZTNGb250UmVmczsKICB9CiAgY2xvbmUobmV3T3B0aW9ucyA9IG51bGwpIHsKICAgIGNvbnN0IG5ld0V2YWx1YXRvciA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBuZXdFdmFsdWF0b3Iub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5vcHRpb25zLCBuZXdPcHRpb25zKTsKICAgIHJldHVybiBuZXdFdmFsdWF0b3I7CiAgfQogIGhhc0JsZW5kTW9kZXMocmVzb3VyY2VzLCBub25CbGVuZE1vZGVzU2V0KSB7CiAgICBpZiAoIShyZXNvdXJjZXMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAocmVzb3VyY2VzLm9iaklkICYmIG5vbkJsZW5kTW9kZXNTZXQuaGFzKHJlc291cmNlcy5vYmpJZCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IFJlZlNldChub25CbGVuZE1vZGVzU2V0KTsKICAgIGlmIChyZXNvdXJjZXMub2JqSWQpIHsKICAgICAgcHJvY2Vzc2VkLnB1dChyZXNvdXJjZXMub2JqSWQpOwogICAgfQogICAgY29uc3Qgbm9kZXMgPSBbcmVzb3VyY2VzXSwKICAgICAgeHJlZiA9IHRoaXMueHJlZjsKICAgIHdoaWxlIChub2Rlcy5sZW5ndGgpIHsKICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLnNoaWZ0KCk7CiAgICAgIGNvbnN0IGdyYXBoaWNTdGF0ZXMgPSBub2RlLmdldCgiRXh0R1N0YXRlIik7CiAgICAgIGlmIChncmFwaGljU3RhdGVzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGZvciAobGV0IGdyYXBoaWNTdGF0ZSBvZiBncmFwaGljU3RhdGVzLmdldFJhd1ZhbHVlcygpKSB7CiAgICAgICAgICBpZiAoZ3JhcGhpY1N0YXRlIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKGdyYXBoaWNTdGF0ZSkpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGdyYXBoaWNTdGF0ZSA9IHhyZWYuZmV0Y2goZ3JhcGhpY1N0YXRlKTsKICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgICBwcm9jZXNzZWQucHV0KGdyYXBoaWNTdGF0ZSk7CiAgICAgICAgICAgICAgaW5mbyhgaGFzQmxlbmRNb2RlcyAtIGlnbm9yaW5nIEV4dEdTdGF0ZTogIiR7ZXh9Ii5gKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKCEoZ3JhcGhpY1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZ3JhcGhpY1N0YXRlLm9iaklkKSB7CiAgICAgICAgICAgIHByb2Nlc3NlZC5wdXQoZ3JhcGhpY1N0YXRlLm9iaklkKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGJtID0gZ3JhcGhpY1N0YXRlLmdldCgiQk0iKTsKICAgICAgICAgIGlmIChibSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgaWYgKGJtLm5hbWUgIT09ICJOb3JtYWwiKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYm0gIT09IHVuZGVmaW5lZCAmJiBBcnJheS5pc0FycmF5KGJtKSkgewogICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYm0pIHsKICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5hbWUgJiYgZWxlbWVudC5uYW1lICE9PSAiTm9ybWFsIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHhPYmplY3RzID0gbm9kZS5nZXQoIlhPYmplY3QiKTsKICAgICAgaWYgKCEoeE9iamVjdHMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IHhPYmplY3Qgb2YgeE9iamVjdHMuZ2V0UmF3VmFsdWVzKCkpIHsKICAgICAgICBpZiAoeE9iamVjdCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgaWYgKHByb2Nlc3NlZC5oYXMoeE9iamVjdCkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB4T2JqZWN0ID0geHJlZi5mZXRjaCh4T2JqZWN0KTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIHByb2Nlc3NlZC5wdXQoeE9iamVjdCk7CiAgICAgICAgICAgIGluZm8oYGhhc0JsZW5kTW9kZXMgLSBpZ25vcmluZyBYT2JqZWN0OiAiJHtleH0iLmApOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEoeE9iamVjdCBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHhPYmplY3QuZGljdC5vYmpJZCkgewogICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4T2JqZWN0LmRpY3Qub2JqSWQpOwogICAgICAgIH0KICAgICAgICBjb25zdCB4UmVzb3VyY2VzID0geE9iamVjdC5kaWN0LmdldCgiUmVzb3VyY2VzIik7CiAgICAgICAgaWYgKCEoeFJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHhSZXNvdXJjZXMub2JqSWQgJiYgcHJvY2Vzc2VkLmhhcyh4UmVzb3VyY2VzLm9iaklkKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIG5vZGVzLnB1c2goeFJlc291cmNlcyk7CiAgICAgICAgaWYgKHhSZXNvdXJjZXMub2JqSWQpIHsKICAgICAgICAgIHByb2Nlc3NlZC5wdXQoeFJlc291cmNlcy5vYmpJZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHJlZiBvZiBwcm9jZXNzZWQpIHsKICAgICAgbm9uQmxlbmRNb2Rlc1NldC5wdXQocmVmKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZmV0Y2hCdWlsdEluQ01hcChuYW1lKSB7CiAgICBjb25zdCBjYWNoZWREYXRhID0gdGhpcy5idWlsdEluQ01hcENhY2hlLmdldChuYW1lKTsKICAgIGlmIChjYWNoZWREYXRhKSB7CiAgICAgIHJldHVybiBjYWNoZWREYXRhOwogICAgfQogICAgbGV0IGRhdGE7CiAgICBpZiAodGhpcy5vcHRpb25zLnVzZVdvcmtlckZldGNoKSB7CiAgICAgIGRhdGEgPSB7CiAgICAgICAgY01hcERhdGE6IGF3YWl0IGZldGNoQmluYXJ5RGF0YShgJHt0aGlzLm9wdGlvbnMuY01hcFVybH0ke25hbWV9LmJjbWFwYCksCiAgICAgICAgaXNDb21wcmVzc2VkOiB0cnVlCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBkYXRhID0gYXdhaXQgdGhpcy5oYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiRmV0Y2hCaW5hcnlEYXRhIiwgewogICAgICAgIHR5cGU6ICJjTWFwUmVhZGVyRmFjdG9yeSIsCiAgICAgICAgbmFtZQogICAgICB9KTsKICAgIH0KICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZS5zZXQobmFtZSwgZGF0YSk7CiAgICByZXR1cm4gZGF0YTsKICB9CiAgYXN5bmMgZmV0Y2hTdGFuZGFyZEZvbnREYXRhKG5hbWUpIHsKICAgIGNvbnN0IGNhY2hlZERhdGEgPSB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5nZXQobmFtZSk7CiAgICBpZiAoY2FjaGVkRGF0YSkgewogICAgICByZXR1cm4gbmV3IFN0cmVhbShjYWNoZWREYXRhKTsKICAgIH0KICAgIGlmICh0aGlzLm9wdGlvbnMudXNlU3lzdGVtRm9udHMgJiYgbmFtZSAhPT0gIlN5bWJvbCIgJiYgbmFtZSAhPT0gIlphcGZEaW5nYmF0cyIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBzdGFuZGFyZEZvbnROYW1lVG9GaWxlTmFtZSA9IGdldEZvbnROYW1lVG9GaWxlTWFwKCksCiAgICAgIGZpbGVuYW1lID0gc3RhbmRhcmRGb250TmFtZVRvRmlsZU5hbWVbbmFtZV07CiAgICBsZXQgZGF0YTsKICAgIHRyeSB7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlV29ya2VyRmV0Y2gpIHsKICAgICAgICBkYXRhID0gYXdhaXQgZmV0Y2hCaW5hcnlEYXRhKGAke3RoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsfSR7ZmlsZW5hbWV9YCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuaGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkZldGNoQmluYXJ5RGF0YSIsIHsKICAgICAgICAgIHR5cGU6ICJzdGFuZGFyZEZvbnREYXRhRmFjdG9yeSIsCiAgICAgICAgICBmaWxlbmFtZQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICB3YXJuKGV4KTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5zZXQobmFtZSwgZGF0YSk7CiAgICByZXR1cm4gbmV3IFN0cmVhbShkYXRhKTsKICB9CiAgYXN5bmMgYnVpbGRGb3JtWE9iamVjdChyZXNvdXJjZXMsIHhvYmosIHNtYXNrLCBvcGVyYXRvckxpc3QsIHRhc2ssIGluaXRpYWxTdGF0ZSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIGNvbnN0IGRpY3QgPSB4b2JqLmRpY3Q7CiAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoZGljdC5nZXRBcnJheSgiTWF0cml4IiksIG51bGwpOwogICAgY29uc3QgYmJveCA9IGxvb2t1cE5vcm1hbFJlY3QoZGljdC5nZXRBcnJheSgiQkJveCIpLCBudWxsKTsKICAgIGxldCBvcHRpb25hbENvbnRlbnQsIGdyb3VwT3B0aW9uczsKICAgIGlmIChkaWN0LmhhcygiT0MiKSkgewogICAgICBvcHRpb25hbENvbnRlbnQgPSBhd2FpdCB0aGlzLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGRpY3QuZ2V0KCJPQyIpLCByZXNvdXJjZXMpOwogICAgfQogICAgaWYgKG9wdGlvbmFsQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBvcHRpb25hbENvbnRlbnRdKTsKICAgIH0KICAgIGNvbnN0IGdyb3VwID0gZGljdC5nZXQoIkdyb3VwIik7CiAgICBpZiAoZ3JvdXApIHsKICAgICAgZ3JvdXBPcHRpb25zID0gewogICAgICAgIG1hdHJpeCwKICAgICAgICBiYm94LAogICAgICAgIHNtYXNrLAogICAgICAgIGlzb2xhdGVkOiBmYWxzZSwKICAgICAgICBrbm9ja291dDogZmFsc2UKICAgICAgfTsKICAgICAgY29uc3QgZ3JvdXBTdWJ0eXBlID0gZ3JvdXAuZ2V0KCJTIik7CiAgICAgIGxldCBjb2xvclNwYWNlID0gbnVsbDsKICAgICAgaWYgKGlzTmFtZShncm91cFN1YnR5cGUsICJUcmFuc3BhcmVuY3kiKSkgewogICAgICAgIGdyb3VwT3B0aW9ucy5pc29sYXRlZCA9IGdyb3VwLmdldCgiSSIpIHx8IGZhbHNlOwogICAgICAgIGdyb3VwT3B0aW9ucy5rbm9ja291dCA9IGdyb3VwLmdldCgiSyIpIHx8IGZhbHNlOwogICAgICAgIGlmIChncm91cC5oYXMoIkNTIikpIHsKICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5fZ2V0Q29sb3JTcGFjZShncm91cC5nZXRSYXcoIkNTIiksIHJlc291cmNlcywgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgICAgICAgY29sb3JTcGFjZSA9IGNzIGluc3RhbmNlb2YgQ29sb3JTcGFjZSA/IGNzIDogYXdhaXQgdGhpcy5faGFuZGxlQ29sb3JTcGFjZShjcyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzbWFzaz8uYmFja2Ryb3ApIHsKICAgICAgICBjb2xvclNwYWNlIHx8PSBDb2xvclNwYWNlVXRpbHMucmdiOwogICAgICAgIHNtYXNrLmJhY2tkcm9wID0gY29sb3JTcGFjZS5nZXRSZ2Ioc21hc2suYmFja2Ryb3AsIDApOwogICAgICB9CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5Hcm91cCwgW2dyb3VwT3B0aW9uc10pOwogICAgfQogICAgY29uc3QgYXJncyA9IGdyb3VwID8gW21hdHJpeCwgbnVsbF0gOiBbbWF0cml4LCBiYm94XTsKICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luLCBhcmdzKTsKICAgIGF3YWl0IHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgc3RyZWFtOiB4b2JqLAogICAgICB0YXNrLAogICAgICByZXNvdXJjZXM6IGRpY3QuZ2V0KCJSZXNvdXJjZXMiKSB8fCByZXNvdXJjZXMsCiAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgaW5pdGlhbFN0YXRlCiAgICB9KTsKICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucGFpbnRGb3JtWE9iamVjdEVuZCwgW10pOwogICAgaWYgKGdyb3VwKSB7CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuZW5kR3JvdXAsIFtncm91cE9wdGlvbnNdKTsKICAgIH0KICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTsKICAgIH0KICB9CiAgX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhLCBjYWNoZUdsb2JhbGx5ID0gZmFsc2UpIHsKICAgIGNvbnN0IHRyYW5zZmVycyA9IGltZ0RhdGEgPyBbaW1nRGF0YS5iaXRtYXAgfHwgaW1nRGF0YS5kYXRhLmJ1ZmZlcl0gOiBudWxsOwogICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCB8fCBjYWNoZUdsb2JhbGx5KSB7CiAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIiwgW29iaklkLCAiSW1hZ2UiLCBpbWdEYXRhXSwgdHJhbnNmZXJzKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZCgib2JqIiwgW29iaklkLCB0aGlzLnBhZ2VJbmRleCwgIkltYWdlIiwgaW1nRGF0YV0sIHRyYW5zZmVycyk7CiAgfQogIGFzeW5jIGJ1aWxkUGFpbnRJbWFnZVhPYmplY3QoewogICAgcmVzb3VyY2VzLAogICAgaW1hZ2UsCiAgICBpc0lubGluZSA9IGZhbHNlLAogICAgb3BlcmF0b3JMaXN0LAogICAgY2FjaGVLZXksCiAgICBsb2NhbEltYWdlQ2FjaGUsCiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogIH0pIHsKICAgIGNvbnN0IGRpY3QgPSBpbWFnZS5kaWN0OwogICAgY29uc3QgaW1hZ2VSZWYgPSBkaWN0Lm9iaklkOwogICAgY29uc3QgdyA9IGRpY3QuZ2V0KCJXIiwgIldpZHRoIik7CiAgICBjb25zdCBoID0gZGljdC5nZXQoIkgiLCAiSGVpZ2h0Iik7CiAgICBpZiAoISh3ICYmIHR5cGVvZiB3ID09PSAibnVtYmVyIikgfHwgIShoICYmIHR5cGVvZiBoID09PSAibnVtYmVyIikpIHsKICAgICAgd2FybigiSW1hZ2UgZGltZW5zaW9ucyBhcmUgbWlzc2luZywgb3Igbm90IG51bWJlcnMuIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG1heEltYWdlU2l6ZSA9IHRoaXMub3B0aW9ucy5tYXhJbWFnZVNpemU7CiAgICBpZiAobWF4SW1hZ2VTaXplICE9PSAtMSAmJiB3ICogaCA+IG1heEltYWdlU2l6ZSkgewogICAgICBjb25zdCBtc2cgPSAiSW1hZ2UgZXhjZWVkZWQgbWF4aW11bSBhbGxvd2VkIHNpemUgYW5kIHdhcyByZW1vdmVkLiI7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2Fybihtc2cpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKICAgIH0KICAgIGxldCBvcHRpb25hbENvbnRlbnQ7CiAgICBpZiAoZGljdC5oYXMoIk9DIikpIHsKICAgICAgb3B0aW9uYWxDb250ZW50ID0gYXdhaXQgdGhpcy5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhkaWN0LmdldCgiT0MiKSwgcmVzb3VyY2VzKTsKICAgIH0KICAgIGNvbnN0IGltYWdlTWFzayA9IGRpY3QuZ2V0KCJJTSIsICJJbWFnZU1hc2siKSB8fCBmYWxzZTsKICAgIGxldCBpbWdEYXRhLCBmbiwgYXJnczsKICAgIGlmIChpbWFnZU1hc2spIHsKICAgICAgY29uc3QgaW50ZXJwb2xhdGUgPSBkaWN0LmdldCgiSSIsICJJbnRlcnBvbGF0ZSIpOwogICAgICBjb25zdCBiaXRTdHJpZGVMZW5ndGggPSB3ICsgNyA+PiAzOwogICAgICBjb25zdCBpbWdBcnJheSA9IGltYWdlLmdldEJ5dGVzKGJpdFN0cmlkZUxlbmd0aCAqIGgpOwogICAgICBjb25zdCBkZWNvZGUgPSBkaWN0LmdldEFycmF5KCJEIiwgIkRlY29kZSIpOwogICAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgICAgaW1nRGF0YSA9IFBERkltYWdlLmNyZWF0ZVJhd01hc2soewogICAgICAgICAgaW1nQXJyYXksCiAgICAgICAgICB3aWR0aDogdywKICAgICAgICAgIGhlaWdodDogaCwKICAgICAgICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOiBpbWFnZSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSwKICAgICAgICAgIGludmVyc2VEZWNvZGU6IGRlY29kZT8uWzBdID4gMCwKICAgICAgICAgIGludGVycG9sYXRlCiAgICAgICAgfSk7CiAgICAgICAgaW1nRGF0YS5jYWNoZWQgPSAhIWNhY2hlS2V5OwogICAgICAgIGZuID0gT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDsKICAgICAgICBhcmdzID0gW2ltZ0RhdGFdOwogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhmbiwgYXJncywgb3B0aW9uYWxDb250ZW50KTsKICAgICAgICBpZiAoY2FjaGVLZXkpIHsKICAgICAgICAgIGNvbnN0IGNhY2hlRGF0YSA9IHsKICAgICAgICAgICAgZm4sCiAgICAgICAgICAgIGFyZ3MsCiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudAogICAgICAgICAgfTsKICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICAgICAgaWYgKGltYWdlUmVmKSB7CiAgICAgICAgICAgIHRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCwgaW1hZ2VSZWYsIGNhY2hlRGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpbWdEYXRhID0gYXdhaXQgUERGSW1hZ2UuY3JlYXRlTWFzayh7CiAgICAgICAgaW1nQXJyYXksCiAgICAgICAgd2lkdGg6IHcsCiAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOiBpbWFnZSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSwKICAgICAgICBpbnZlcnNlRGVjb2RlOiBkZWNvZGU/LlswXSA+IDAsCiAgICAgICAgaW50ZXJwb2xhdGUsCiAgICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IHRoaXMub3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZAogICAgICB9KTsKICAgICAgaWYgKGltZ0RhdGEuaXNTaW5nbGVPcGFxdWVQaXhlbCkgewogICAgICAgIGZuID0gT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzazsKICAgICAgICBhcmdzID0gW107CiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZEltYWdlT3BzKGZuLCBhcmdzLCBvcHRpb25hbENvbnRlbnQpOwogICAgICAgIGlmIChjYWNoZUtleSkgewogICAgICAgICAgY29uc3QgY2FjaGVEYXRhID0gewogICAgICAgICAgICBmbiwKICAgICAgICAgICAgYXJncywKICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50CiAgICAgICAgICB9OwogICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLnNldChjYWNoZUtleSwgaW1hZ2VSZWYsIGNhY2hlRGF0YSk7CiAgICAgICAgICBpZiAoaW1hZ2VSZWYpIHsKICAgICAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG9iaklkID0gYG1hc2tfJHt0aGlzLmlkRmFjdG9yeS5jcmVhdGVPYmpJZCgpfWA7CiAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KG9iaklkKTsKICAgICAgaW1nRGF0YS5kYXRhTGVuID0gaW1nRGF0YS5iaXRtYXAgPyBpbWdEYXRhLndpZHRoICogaW1nRGF0YS5oZWlnaHQgKiA0IDogaW1nRGF0YS5kYXRhLmxlbmd0aDsKICAgICAgdGhpcy5fc2VuZEltZ0RhdGEob2JqSWQsIGltZ0RhdGEpOwogICAgICBmbiA9IE9QUy5wYWludEltYWdlTWFza1hPYmplY3Q7CiAgICAgIGFyZ3MgPSBbewogICAgICAgIGRhdGE6IG9iaklkLAogICAgICAgIHdpZHRoOiBpbWdEYXRhLndpZHRoLAogICAgICAgIGhlaWdodDogaW1nRGF0YS5oZWlnaHQsCiAgICAgICAgaW50ZXJwb2xhdGU6IGltZ0RhdGEuaW50ZXJwb2xhdGUsCiAgICAgICAgY291bnQ6IDEKICAgICAgfV07CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhmbiwgYXJncywgb3B0aW9uYWxDb250ZW50KTsKICAgICAgaWYgKGNhY2hlS2V5KSB7CiAgICAgICAgY29uc3QgY2FjaGVEYXRhID0gewogICAgICAgICAgb2JqSWQsCiAgICAgICAgICBmbiwKICAgICAgICAgIGFyZ3MsCiAgICAgICAgICBvcHRpb25hbENvbnRlbnQKICAgICAgICB9OwogICAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICAgIGlmIChpbWFnZVJlZikgewogICAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgU01BTExfSU1BR0VfRElNRU5TSU9OUyA9IDIwMDsKICAgIGNvbnN0IGhhc01hc2sgPSBkaWN0LmhhcygiU01hc2siKSB8fCBkaWN0LmhhcygiTWFzayIpOwogICAgaWYgKGlzSW5saW5lICYmIHcgKyBoIDwgU01BTExfSU1BR0VfRElNRU5TSU9OUyAmJiAhaGFzTWFzaykgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IGltYWdlT2JqID0gbmV3IFBERkltYWdlKHsKICAgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgICAgIHJlczogcmVzb3VyY2VzLAogICAgICAgICAgaW1hZ2UsCiAgICAgICAgICBpc0lubGluZSwKICAgICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOiB0aGlzLmdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgfSk7CiAgICAgICAgaW1nRGF0YSA9IGF3YWl0IGltYWdlT2JqLmNyZWF0ZUltYWdlRGF0YSh0cnVlLCBmYWxzZSk7CiAgICAgICAgb3BlcmF0b3JMaXN0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOwogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhPUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QsIFtpbWdEYXRhXSwgb3B0aW9uYWxDb250ZW50KTsKICAgICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICAgY29uc3QgbXNnID0gYFVuYWJsZSB0byBkZWNvZGUgaW5saW5lIGltYWdlOiAiJHtyZWFzb259Ii5gOwogICAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CiAgICAgICAgfQogICAgICAgIHdhcm4obXNnKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgb2JqSWQgPSBgaW1nXyR7dGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gLAogICAgICBjYWNoZUdsb2JhbGx5ID0gZmFsc2U7CiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgIG9iaklkID0gYCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fdHlwZTNfJHtvYmpJZH1gOwogICAgfSBlbHNlIGlmIChjYWNoZUtleSAmJiBpbWFnZVJlZikgewogICAgICBjYWNoZUdsb2JhbGx5ID0gdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNob3VsZENhY2hlKGltYWdlUmVmLCB0aGlzLnBhZ2VJbmRleCk7CiAgICAgIGlmIChjYWNoZUdsb2JhbGx5KSB7CiAgICAgICAgYXNzZXJ0KCFpc0lubGluZSwgIkNhbm5vdCBjYWNoZSBhbiBpbmxpbmUgaW1hZ2UgZ2xvYmFsbHkuIik7CiAgICAgICAgb2JqSWQgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV8ke29iaklkfWA7CiAgICAgIH0KICAgIH0KICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KG9iaklkKTsKICAgIGZuID0gT1BTLnBhaW50SW1hZ2VYT2JqZWN0OwogICAgYXJncyA9IFtvYmpJZCwgdywgaF07CiAgICBvcGVyYXRvckxpc3QuYWRkSW1hZ2VPcHMoZm4sIGFyZ3MsIG9wdGlvbmFsQ29udGVudCwgaGFzTWFzayk7CiAgICBpZiAoY2FjaGVHbG9iYWxseSkgewogICAgICBpZiAodGhpcy5nbG9iYWxJbWFnZUNhY2hlLmhhc0RlY29kZUZhaWxlZChpbWFnZVJlZikpIHsKICAgICAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YShpbWFnZVJlZiwgewogICAgICAgICAgb2JqSWQsCiAgICAgICAgICBmbiwKICAgICAgICAgIGFyZ3MsCiAgICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgICBoYXNNYXNrLAogICAgICAgICAgYnl0ZVNpemU6IDAKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgbnVsbCwgY2FjaGVHbG9iYWxseSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh3ICogaCA+IDI1MDAwMCB8fCBoYXNNYXNrKSB7CiAgICAgICAgY29uc3QgbG9jYWxMZW5ndGggPSBhd2FpdCB0aGlzLmhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJjb21tb25vYmoiLCBbb2JqSWQsICJDb3B5TG9jYWxJbWFnZSIsIHsKICAgICAgICAgIGltYWdlUmVmCiAgICAgICAgfV0pOwogICAgICAgIGlmIChsb2NhbExlbmd0aCkgewogICAgICAgICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNldERhdGEoaW1hZ2VSZWYsIHsKICAgICAgICAgICAgb2JqSWQsCiAgICAgICAgICAgIGZuLAogICAgICAgICAgICBhcmdzLAogICAgICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgICAgIGhhc01hc2ssCiAgICAgICAgICAgIGJ5dGVTaXplOiAwCiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGRCeXRlU2l6ZShpbWFnZVJlZiwgbG9jYWxMZW5ndGgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgUERGSW1hZ2UuYnVpbGRJbWFnZSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgcmVzOiByZXNvdXJjZXMsCiAgICAgIGltYWdlLAogICAgICBpc0lubGluZSwKICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICB9KS50aGVuKGFzeW5jIGltYWdlT2JqID0+IHsKICAgICAgaW1nRGF0YSA9IGF3YWl0IGltYWdlT2JqLmNyZWF0ZUltYWdlRGF0YShmYWxzZSwgdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTsKICAgICAgaW1nRGF0YS5kYXRhTGVuID0gaW1nRGF0YS5iaXRtYXAgPyBpbWdEYXRhLndpZHRoICogaW1nRGF0YS5oZWlnaHQgKiA0IDogaW1nRGF0YS5kYXRhLmxlbmd0aDsKICAgICAgaW1nRGF0YS5yZWYgPSBpbWFnZVJlZjsKICAgICAgaWYgKGNhY2hlR2xvYmFsbHkpIHsKICAgICAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuYWRkQnl0ZVNpemUoaW1hZ2VSZWYsIGltZ0RhdGEuZGF0YUxlbik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhLCBjYWNoZUdsb2JhbGx5KTsKICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CiAgICAgIHdhcm4oYFVuYWJsZSB0byBkZWNvZGUgaW1hZ2UgIiR7b2JqSWR9IjogIiR7cmVhc29ufSIuYCk7CiAgICAgIGlmIChpbWFnZVJlZikgewogICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGREZWNvZGVGYWlsZWQoaW1hZ2VSZWYpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgbnVsbCwgY2FjaGVHbG9iYWxseSk7CiAgICB9KTsKICAgIGlmIChjYWNoZUtleSkgewogICAgICBjb25zdCBjYWNoZURhdGEgPSB7CiAgICAgICAgb2JqSWQsCiAgICAgICAgZm4sCiAgICAgICAgYXJncywKICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgaGFzTWFzawogICAgICB9OwogICAgICBsb2NhbEltYWdlQ2FjaGUuc2V0KGNhY2hlS2V5LCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgaWYgKGltYWdlUmVmKSB7CiAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICBpZiAoY2FjaGVHbG9iYWxseSkgewogICAgICAgICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNldERhdGEoaW1hZ2VSZWYsIHsKICAgICAgICAgICAgb2JqSWQsCiAgICAgICAgICAgIGZuLAogICAgICAgICAgICBhcmdzLAogICAgICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgICAgIGhhc01hc2ssCiAgICAgICAgICAgIGJ5dGVTaXplOiAwCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaGFuZGxlU01hc2soc21hc2ssIHJlc291cmNlcywgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBjb25zdCBzbWFza0NvbnRlbnQgPSBzbWFzay5nZXQoIkciKTsKICAgIGNvbnN0IHNtYXNrT3B0aW9ucyA9IHsKICAgICAgc3VidHlwZTogc21hc2suZ2V0KCJTIikubmFtZSwKICAgICAgYmFja2Ryb3A6IHNtYXNrLmdldCgiQkMiKQogICAgfTsKICAgIGNvbnN0IHRyYW5zZmVyT2JqID0gc21hc2suZ2V0KCJUUiIpOwogICAgaWYgKGlzUERGRnVuY3Rpb24odHJhbnNmZXJPYmopKSB7CiAgICAgIGNvbnN0IHRyYW5zZmVyRm4gPSB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKHRyYW5zZmVyT2JqKTsKICAgICAgY29uc3QgdHJhbnNmZXJNYXAgPSBuZXcgVWludDhBcnJheSgyNTYpOwogICAgICBjb25zdCB0bXAgPSBuZXcgRmxvYXQzMkFycmF5KDEpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAgICAgICAgdG1wWzBdID0gaSAvIDI1NTsKICAgICAgICB0cmFuc2ZlckZuKHRtcCwgMCwgdG1wLCAwKTsKICAgICAgICB0cmFuc2Zlck1hcFtpXSA9IHRtcFswXSAqIDI1NSB8IDA7CiAgICAgIH0KICAgICAgc21hc2tPcHRpb25zLnRyYW5zZmVyTWFwID0gdHJhbnNmZXJNYXA7CiAgICB9CiAgICByZXR1cm4gdGhpcy5idWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgc21hc2tDb250ZW50LCBzbWFza09wdGlvbnMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKHsKICAgICAgbmV3UGF0aDogdHJ1ZQogICAgfSksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKICB9CiAgaGFuZGxlVHJhbnNmZXJGdW5jdGlvbih0cikgewogICAgbGV0IHRyYW5zZmVyQXJyYXk7CiAgICBpZiAoQXJyYXkuaXNBcnJheSh0cikpIHsKICAgICAgdHJhbnNmZXJBcnJheSA9IHRyOwogICAgfSBlbHNlIGlmIChpc1BERkZ1bmN0aW9uKHRyKSkgewogICAgICB0cmFuc2ZlckFycmF5ID0gW3RyXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgdHJhbnNmZXJNYXBzID0gW107CiAgICBsZXQgbnVtRm5zID0gMCwKICAgICAgbnVtRWZmZWN0ZnVsRm5zID0gMDsKICAgIGZvciAoY29uc3QgZW50cnkgb2YgdHJhbnNmZXJBcnJheSkgewogICAgICBjb25zdCB0cmFuc2Zlck9iaiA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGVudHJ5KTsKICAgICAgbnVtRm5zKys7CiAgICAgIGlmIChpc05hbWUodHJhbnNmZXJPYmosICJJZGVudGl0eSIpKSB7CiAgICAgICAgdHJhbnNmZXJNYXBzLnB1c2gobnVsbCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoIWlzUERGRnVuY3Rpb24odHJhbnNmZXJPYmopKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgdHJhbnNmZXJGbiA9IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUodHJhbnNmZXJPYmopOwogICAgICBjb25zdCB0cmFuc2Zlck1hcCA9IG5ldyBVaW50OEFycmF5KDI1NiksCiAgICAgICAgdG1wID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAyNTY7IGorKykgewogICAgICAgIHRtcFswXSA9IGogLyAyNTU7CiAgICAgICAgdHJhbnNmZXJGbih0bXAsIDAsIHRtcCwgMCk7CiAgICAgICAgdHJhbnNmZXJNYXBbal0gPSB0bXBbMF0gKiAyNTUgfCAwOwogICAgICB9CiAgICAgIHRyYW5zZmVyTWFwcy5wdXNoKHRyYW5zZmVyTWFwKTsKICAgICAgbnVtRWZmZWN0ZnVsRm5zKys7CiAgICB9CiAgICBpZiAoIShudW1GbnMgPT09IDEgfHwgbnVtRm5zID09PSA0KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChudW1FZmZlY3RmdWxGbnMgPT09IDApIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gdHJhbnNmZXJNYXBzOwogIH0KICBoYW5kbGVUaWxpbmdUeXBlKGZuLCBjb2xvciwgcmVzb3VyY2VzLCBwYXR0ZXJuLCBwYXR0ZXJuRGljdCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBsb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSkgewogICAgY29uc3QgdGlsaW5nT3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpOwogICAgY29uc3QgcGF0dGVyblJlc291cmNlcyA9IERpY3QubWVyZ2UoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGRpY3RBcnJheTogW3BhdHRlcm5EaWN0LmdldCgiUmVzb3VyY2VzIiksIHJlc291cmNlc10KICAgIH0pOwogICAgcmV0dXJuIHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgc3RyZWFtOiBwYXR0ZXJuLAogICAgICB0YXNrLAogICAgICByZXNvdXJjZXM6IHBhdHRlcm5SZXNvdXJjZXMsCiAgICAgIG9wZXJhdG9yTGlzdDogdGlsaW5nT3BMaXN0CiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0SVIgPSB0aWxpbmdPcExpc3QuZ2V0SVIoKTsKICAgICAgY29uc3QgdGlsaW5nUGF0dGVybklSID0gZ2V0VGlsaW5nUGF0dGVybklSKG9wZXJhdG9yTGlzdElSLCBwYXR0ZXJuRGljdCwgY29sb3IpOwogICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jaWVzKHRpbGluZ09wTGlzdC5kZXBlbmRlbmNpZXMpOwogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIHRpbGluZ1BhdHRlcm5JUik7CiAgICAgIGlmIChwYXR0ZXJuRGljdC5vYmpJZCkgewogICAgICAgIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLnNldChudWxsLCBwYXR0ZXJuRGljdC5vYmpJZCwgewogICAgICAgICAgb3BlcmF0b3JMaXN0SVIsCiAgICAgICAgICBkaWN0OiBwYXR0ZXJuRGljdAogICAgICAgIH0pOwogICAgICB9CiAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB3YXJuKGBoYW5kbGVUaWxpbmdUeXBlIC0gaWdub3JpbmcgcGF0dGVybjogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRocm93IHJlYXNvbjsKICAgIH0pOwogIH0KICBhc3luYyBoYW5kbGVTZXRGb250KHJlc291cmNlcywgZm9udEFyZ3MsIGZvbnRSZWYsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGUsIGZhbGxiYWNrRm9udERpY3QgPSBudWxsLCBjc3NGb250SW5mbyA9IG51bGwpIHsKICAgIGNvbnN0IGZvbnROYW1lID0gZm9udEFyZ3M/LlswXSBpbnN0YW5jZW9mIE5hbWUgPyBmb250QXJnc1swXS5uYW1lIDogbnVsbDsKICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBhd2FpdCB0aGlzLmxvYWRGb250KGZvbnROYW1lLCBmb250UmVmLCByZXNvdXJjZXMsIHRhc2ssIGZhbGxiYWNrRm9udERpY3QsIGNzc0ZvbnRJbmZvKTsKICAgIGlmICh0cmFuc2xhdGVkLmZvbnQuaXNUeXBlM0ZvbnQpIHsKICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY2llcyh0cmFuc2xhdGVkLnR5cGUzRGVwZW5kZW5jaWVzKTsKICAgIH0KICAgIHN0YXRlLmZvbnQgPSB0cmFuc2xhdGVkLmZvbnQ7CiAgICB0cmFuc2xhdGVkLnNlbmQodGhpcy5oYW5kbGVyKTsKICAgIHJldHVybiB0cmFuc2xhdGVkLmxvYWRlZE5hbWU7CiAgfQogIGhhbmRsZVRleHQoY2hhcnMsIHN0YXRlKSB7CiAgICBjb25zdCBmb250ID0gc3RhdGUuZm9udDsKICAgIGNvbnN0IGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7CiAgICBpZiAoZm9udC5kYXRhKSB7CiAgICAgIGNvbnN0IGlzQWRkVG9QYXRoU2V0ID0gISEoc3RhdGUudGV4dFJlbmRlcmluZ01vZGUgJiBUZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKTsKICAgICAgaWYgKGlzQWRkVG9QYXRoU2V0IHx8IHN0YXRlLmZpbGxDb2xvclNwYWNlLm5hbWUgPT09ICJQYXR0ZXJuIiB8fCBmb250LmRpc2FibGVGb250RmFjZSkgewogICAgICAgIFBhcnRpYWxFdmFsdWF0b3IuYnVpbGRGb250UGF0aHMoZm9udCwgZ2x5cGhzLCB0aGlzLmhhbmRsZXIsIHRoaXMub3B0aW9ucyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBnbHlwaHM7CiAgfQogIGVuc3VyZVN0YXRlRm9udChzdGF0ZSkgewogICAgaWYgKHN0YXRlLmZvbnQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVhc29uID0gbmV3IEZvcm1hdEVycm9yKCJNaXNzaW5nIHNldEZvbnQgKFRmKSBvcGVyYXRvciBiZWZvcmUgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3IuIik7CiAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICB3YXJuKGBlbnN1cmVTdGF0ZUZvbnQ6ICIke3JlYXNvbn0iLmApOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aHJvdyByZWFzb247CiAgfQogIGFzeW5jIHNldEdTdGF0ZSh7CiAgICByZXNvdXJjZXMsCiAgICBnU3RhdGUsCiAgICBvcGVyYXRvckxpc3QsCiAgICBjYWNoZUtleSwKICAgIHRhc2ssCiAgICBzdGF0ZU1hbmFnZXIsCiAgICBsb2NhbEdTdGF0ZUNhY2hlLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICBjb25zdCBnU3RhdGVSZWYgPSBnU3RhdGUub2JqSWQ7CiAgICBsZXQgaXNTaW1wbGVHU3RhdGUgPSB0cnVlOwogICAgY29uc3QgZ1N0YXRlT2JqID0gW107CiAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpOwogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZ1N0YXRlKSB7CiAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgY2FzZSAiVHlwZSI6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJMVyI6CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAibnVtYmVyIikgewogICAgICAgICAgICB3YXJuKGBJbnZhbGlkIExXIChsaW5lIHdpZHRoKTogJHt2YWx1ZX1gKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBNYXRoLmFicyh2YWx1ZSldKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkxDIjoKICAgICAgICBjYXNlICJMSiI6CiAgICAgICAgY2FzZSAiTUwiOgogICAgICAgIGNhc2UgIkQiOgogICAgICAgIGNhc2UgIlJJIjoKICAgICAgICBjYXNlICJGTCI6CiAgICAgICAgY2FzZSAiQ0EiOgogICAgICAgIGNhc2UgImNhIjoKICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIHZhbHVlXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJGb250IjoKICAgICAgICAgIGlzU2ltcGxlR1N0YXRlID0gZmFsc2U7CiAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHRoaXMuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIG51bGwsIHZhbHVlWzBdLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZSkudGhlbihmdW5jdGlvbiAobG9hZGVkTmFtZSkgewogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShsb2FkZWROYW1lKTsKICAgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgW2xvYWRlZE5hbWUsIHZhbHVlWzFdXV0pOwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQk0iOgogICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgbm9ybWFsaXplQmxlbmRNb2RlKHZhbHVlKV0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiU01hc2siOgogICAgICAgICAgaWYgKGlzTmFtZSh2YWx1ZSwgIk5vbmUiKSkgewogICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBmYWxzZV0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgaXNTaW1wbGVHU3RhdGUgPSBmYWxzZTsKICAgICAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoKSA9PiB0aGlzLmhhbmRsZVNNYXNrKHZhbHVlLCByZXNvdXJjZXMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkpOwogICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cnVlXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3YXJuKCJVbnN1cHBvcnRlZCBTTWFzayB0eXBlIik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJUUiI6CiAgICAgICAgICBjb25zdCB0cmFuc2Zlck1hcHMgPSB0aGlzLmhhbmRsZVRyYW5zZmVyRnVuY3Rpb24odmFsdWUpOwogICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgdHJhbnNmZXJNYXBzXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJPUCI6CiAgICAgICAgY2FzZSAib3AiOgogICAgICAgIGNhc2UgIk9QTSI6CiAgICAgICAgY2FzZSAiQkciOgogICAgICAgIGNhc2UgIkJHMiI6CiAgICAgICAgY2FzZSAiVUNSIjoKICAgICAgICBjYXNlICJVQ1IyIjoKICAgICAgICBjYXNlICJUUjIiOgogICAgICAgIGNhc2UgIkhUIjoKICAgICAgICBjYXNlICJTTSI6CiAgICAgICAgY2FzZSAiU0EiOgogICAgICAgIGNhc2UgIkFJUyI6CiAgICAgICAgY2FzZSAiVEsiOgogICAgICAgICAgaW5mbygiZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAiICsga2V5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpbmZvKCJVbmtub3duIGdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgIiArIGtleSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgYXdhaXQgcHJvbWlzZTsKICAgIGlmIChnU3RhdGVPYmoubGVuZ3RoID4gMCkgewogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldEdTdGF0ZSwgW2dTdGF0ZU9ial0pOwogICAgfQogICAgaWYgKGlzU2ltcGxlR1N0YXRlKSB7CiAgICAgIGxvY2FsR1N0YXRlQ2FjaGUuc2V0KGNhY2hlS2V5LCBnU3RhdGVSZWYsIGdTdGF0ZU9iaik7CiAgICB9CiAgfQogIGxvYWRGb250KGZvbnROYW1lLCBmb250LCByZXNvdXJjZXMsIHRhc2ssIGZhbGxiYWNrRm9udERpY3QgPSBudWxsLCBjc3NGb250SW5mbyA9IG51bGwpIHsKICAgIGNvbnN0IGVycm9yRm9udCA9IGFzeW5jICgpID0+IG5ldyBUcmFuc2xhdGVkRm9udCh7CiAgICAgIGxvYWRlZE5hbWU6ICJnX2ZvbnRfZXJyb3IiLAogICAgICBmb250OiBuZXcgRXJyb3JGb250KGBGb250ICIke2ZvbnROYW1lfSIgaXMgbm90IGF2YWlsYWJsZS5gKSwKICAgICAgZGljdDogZm9udAogICAgfSk7CiAgICBsZXQgZm9udFJlZjsKICAgIGlmIChmb250KSB7CiAgICAgIGlmIChmb250IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgZm9udFJlZiA9IGZvbnQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGZvbnRSZXMgPSByZXNvdXJjZXMuZ2V0KCJGb250Iik7CiAgICAgIGlmIChmb250UmVzKSB7CiAgICAgICAgZm9udFJlZiA9IGZvbnRSZXMuZ2V0UmF3KGZvbnROYW1lKTsKICAgICAgfQogICAgfQogICAgaWYgKGZvbnRSZWYpIHsKICAgICAgaWYgKHRoaXMudHlwZTNGb250UmVmcz8uaGFzKGZvbnRSZWYpKSB7CiAgICAgICAgcmV0dXJuIGVycm9yRm9udCgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmZvbnRDYWNoZS5oYXMoZm9udFJlZikpIHsKICAgICAgICByZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGZvbnRSZWYpOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgZm9udCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZvbnRSZWYpOwogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIHdhcm4oYGxvYWRGb250IC0gbG9va3VwIGZhaWxlZDogIiR7ZXh9Ii5gKTsKICAgICAgfQogICAgfQogICAgaWYgKCEoZm9udCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyAmJiAhdGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgICAgd2FybihgRm9udCAiJHtmb250TmFtZX0iIGlzIG5vdCBhdmFpbGFibGUuYCk7CiAgICAgICAgcmV0dXJuIGVycm9yRm9udCgpOwogICAgICB9CiAgICAgIHdhcm4oYEZvbnQgIiR7Zm9udE5hbWV9IiBpcyBub3QgYXZhaWxhYmxlIC0tIGF0dGVtcHRpbmcgdG8gZmFsbGJhY2sgdG8gYSBkZWZhdWx0IGZvbnQuYCk7CiAgICAgIGZvbnQgPSBmYWxsYmFja0ZvbnREaWN0IHx8IFBhcnRpYWxFdmFsdWF0b3IuZmFsbGJhY2tGb250RGljdDsKICAgIH0KICAgIGlmIChmb250LmNhY2hlS2V5ICYmIHRoaXMuZm9udENhY2hlLmhhcyhmb250LmNhY2hlS2V5KSkgewogICAgICByZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGZvbnQuY2FjaGVLZXkpOwogICAgfQogICAgY29uc3QgewogICAgICBwcm9taXNlLAogICAgICByZXNvbHZlCiAgICB9ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICBsZXQgcHJlRXZhbHVhdGVkRm9udDsKICAgIHRyeSB7CiAgICAgIHByZUV2YWx1YXRlZEZvbnQgPSB0aGlzLnByZUV2YWx1YXRlRm9udChmb250KTsKICAgICAgcHJlRXZhbHVhdGVkRm9udC5jc3NGb250SW5mbyA9IGNzc0ZvbnRJbmZvOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYGxvYWRGb250IC0gcHJlRXZhbHVhdGVGb250IGZhaWxlZDogIiR7cmVhc29ufSIuYCk7CiAgICAgIHJldHVybiBlcnJvckZvbnQoKTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgZGVzY3JpcHRvciwKICAgICAgaGFzaAogICAgfSA9IHByZUV2YWx1YXRlZEZvbnQ7CiAgICBjb25zdCBmb250UmVmSXNSZWYgPSBmb250UmVmIGluc3RhbmNlb2YgUmVmOwogICAgbGV0IGZvbnRJRDsKICAgIGlmIChoYXNoICYmIGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGZvbnRBbGlhc2VzID0gZGVzY3JpcHRvci5mb250QWxpYXNlcyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgaWYgKGZvbnRBbGlhc2VzW2hhc2hdKSB7CiAgICAgICAgY29uc3QgYWxpYXNGb250UmVmID0gZm9udEFsaWFzZXNbaGFzaF0uYWxpYXNSZWY7CiAgICAgICAgaWYgKGZvbnRSZWZJc1JlZiAmJiBhbGlhc0ZvbnRSZWYgJiYgdGhpcy5mb250Q2FjaGUuaGFzKGFsaWFzRm9udFJlZikpIHsKICAgICAgICAgIHRoaXMuZm9udENhY2hlLnB1dEFsaWFzKGZvbnRSZWYsIGFsaWFzRm9udFJlZik7CiAgICAgICAgICByZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGZvbnRSZWYpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb250QWxpYXNlc1toYXNoXSA9IHsKICAgICAgICAgIGZvbnRJRDogdGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCkKICAgICAgICB9OwogICAgICB9CiAgICAgIGlmIChmb250UmVmSXNSZWYpIHsKICAgICAgICBmb250QWxpYXNlc1toYXNoXS5hbGlhc1JlZiA9IGZvbnRSZWY7CiAgICAgIH0KICAgICAgZm9udElEID0gZm9udEFsaWFzZXNbaGFzaF0uZm9udElEOwogICAgfSBlbHNlIHsKICAgICAgZm9udElEID0gdGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCk7CiAgICB9CiAgICBhc3NlcnQoZm9udElEPy5zdGFydHNXaXRoKCJmIiksICdUaGUgImZvbnRJRCIgbXVzdCBiZSAoY29ycmVjdGx5KSBkZWZpbmVkLicpOwogICAgaWYgKGZvbnRSZWZJc1JlZikgewogICAgICB0aGlzLmZvbnRDYWNoZS5wdXQoZm9udFJlZiwgcHJvbWlzZSk7CiAgICB9IGVsc2UgewogICAgICBmb250LmNhY2hlS2V5ID0gYGNhY2hlS2V5XyR7Zm9udElEfWA7CiAgICAgIHRoaXMuZm9udENhY2hlLnB1dChmb250LmNhY2hlS2V5LCBwcm9taXNlKTsKICAgIH0KICAgIGZvbnQubG9hZGVkTmFtZSA9IGAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9XyR7Zm9udElEfWA7CiAgICB0aGlzLnRyYW5zbGF0ZUZvbnQocHJlRXZhbHVhdGVkRm9udCkudGhlbihhc3luYyB0cmFuc2xhdGVkRm9udCA9PiB7CiAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBuZXcgVHJhbnNsYXRlZEZvbnQoewogICAgICAgIGxvYWRlZE5hbWU6IGZvbnQubG9hZGVkTmFtZSwKICAgICAgICBmb250OiB0cmFuc2xhdGVkRm9udCwKICAgICAgICBkaWN0OiBmb250CiAgICAgIH0pOwogICAgICBpZiAodHJhbnNsYXRlZEZvbnQuaXNUeXBlM0ZvbnQpIHsKICAgICAgICB0cnkgewogICAgICAgICAgYXdhaXQgdHJhbnNsYXRlZC5sb2FkVHlwZTNEYXRhKHRoaXMsIHJlc291cmNlcywgdGFzayk7CiAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFR5cGUzIGZvbnQgbG9hZCBlcnJvcjogJHtyZWFzb259YCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc29sdmUodHJhbnNsYXRlZCk7CiAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICB3YXJuKGBsb2FkRm9udCAtIHRyYW5zbGF0ZUZvbnQgZmFpbGVkOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmVzb2x2ZShuZXcgVHJhbnNsYXRlZEZvbnQoewogICAgICAgIGxvYWRlZE5hbWU6IGZvbnQubG9hZGVkTmFtZSwKICAgICAgICBmb250OiBuZXcgRXJyb3JGb250KHJlYXNvbj8ubWVzc2FnZSksCiAgICAgICAgZGljdDogZm9udAogICAgICB9KSk7CiAgICB9KTsKICAgIHJldHVybiBwcm9taXNlOwogIH0KICBidWlsZFBhdGgoZm4sIGFyZ3MsIHN0YXRlKSB7CiAgICBjb25zdCB7CiAgICAgIHBhdGhNaW5NYXg6IG1pbk1heCwKICAgICAgcGF0aEJ1ZmZlcgogICAgfSA9IHN0YXRlOwogICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgY2FzZSBPUFMucmVjdGFuZ2xlOgogICAgICAgIHsKICAgICAgICAgIGNvbnN0IHggPSBzdGF0ZS5jdXJyZW50UG9pbnRYID0gYXJnc1swXTsKICAgICAgICAgIGNvbnN0IHkgPSBzdGF0ZS5jdXJyZW50UG9pbnRZID0gYXJnc1sxXTsKICAgICAgICAgIGNvbnN0IHdpZHRoID0gYXJnc1syXTsKICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGFyZ3NbM107CiAgICAgICAgICBjb25zdCB4dyA9IHggKyB3aWR0aDsKICAgICAgICAgIGNvbnN0IHloID0geSArIGhlaWdodDsKICAgICAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHsKICAgICAgICAgICAgcGF0aEJ1ZmZlci5wdXNoKERyYXdPUFMubW92ZVRvLCB4LCB5LCBEcmF3T1BTLmxpbmVUbywgeHcsIHloLCBEcmF3T1BTLmNsb3NlUGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5tb3ZlVG8sIHgsIHksIERyYXdPUFMubGluZVRvLCB4dywgeSwgRHJhd09QUy5saW5lVG8sIHh3LCB5aCwgRHJhd09QUy5saW5lVG8sIHgsIHloLCBEcmF3T1BTLmNsb3NlUGF0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBVdGlsLnJlY3RCb3VuZGluZ0JveCh4LCB5LCB4dywgeWgsIG1pbk1heCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgT1BTLm1vdmVUbzoKICAgICAgICB7CiAgICAgICAgICBjb25zdCB4ID0gc3RhdGUuY3VycmVudFBvaW50WCA9IGFyZ3NbMF07CiAgICAgICAgICBjb25zdCB5ID0gc3RhdGUuY3VycmVudFBvaW50WSA9IGFyZ3NbMV07CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5tb3ZlVG8sIHgsIHkpOwogICAgICAgICAgVXRpbC5wb2ludEJvdW5kaW5nQm94KHgsIHksIG1pbk1heCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgT1BTLmxpbmVUbzoKICAgICAgICB7CiAgICAgICAgICBjb25zdCB4ID0gc3RhdGUuY3VycmVudFBvaW50WCA9IGFyZ3NbMF07CiAgICAgICAgICBjb25zdCB5ID0gc3RhdGUuY3VycmVudFBvaW50WSA9IGFyZ3NbMV07CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5saW5lVG8sIHgsIHkpOwogICAgICAgICAgVXRpbC5wb2ludEJvdW5kaW5nQm94KHgsIHksIG1pbk1heCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgT1BTLmN1cnZlVG86CiAgICAgICAgewogICAgICAgICAgY29uc3Qgc3RhcnRYID0gc3RhdGUuY3VycmVudFBvaW50WDsKICAgICAgICAgIGNvbnN0IHN0YXJ0WSA9IHN0YXRlLmN1cnJlbnRQb2ludFk7CiAgICAgICAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTIsIHgsIHldID0gYXJnczsKICAgICAgICAgIHN0YXRlLmN1cnJlbnRQb2ludFggPSB4OwogICAgICAgICAgc3RhdGUuY3VycmVudFBvaW50WSA9IHk7CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5jdXJ2ZVRvLCB4MSwgeTEsIHgyLCB5MiwgeCwgeSk7CiAgICAgICAgICBVdGlsLmJlemllckJvdW5kaW5nQm94KHN0YXJ0WCwgc3RhcnRZLCB4MSwgeTEsIHgyLCB5MiwgeCwgeSwgbWluTWF4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBPUFMuY3VydmVUbzI6CiAgICAgICAgewogICAgICAgICAgY29uc3Qgc3RhcnRYID0gc3RhdGUuY3VycmVudFBvaW50WDsKICAgICAgICAgIGNvbnN0IHN0YXJ0WSA9IHN0YXRlLmN1cnJlbnRQb2ludFk7CiAgICAgICAgICBjb25zdCBbeDEsIHkxLCB4LCB5XSA9IGFyZ3M7CiAgICAgICAgICBzdGF0ZS5jdXJyZW50UG9pbnRYID0geDsKICAgICAgICAgIHN0YXRlLmN1cnJlbnRQb2ludFkgPSB5OwogICAgICAgICAgcGF0aEJ1ZmZlci5wdXNoKERyYXdPUFMuY3VydmVUbywgc3RhcnRYLCBzdGFydFksIHgxLCB5MSwgeCwgeSk7CiAgICAgICAgICBVdGlsLmJlemllckJvdW5kaW5nQm94KHN0YXJ0WCwgc3RhcnRZLCBzdGFydFgsIHN0YXJ0WSwgeDEsIHkxLCB4LCB5LCBtaW5NYXgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIE9QUy5jdXJ2ZVRvMzoKICAgICAgICB7CiAgICAgICAgICBjb25zdCBzdGFydFggPSBzdGF0ZS5jdXJyZW50UG9pbnRYOwogICAgICAgICAgY29uc3Qgc3RhcnRZID0gc3RhdGUuY3VycmVudFBvaW50WTsKICAgICAgICAgIGNvbnN0IFt4MSwgeTEsIHgsIHldID0gYXJnczsKICAgICAgICAgIHN0YXRlLmN1cnJlbnRQb2ludFggPSB4OwogICAgICAgICAgc3RhdGUuY3VycmVudFBvaW50WSA9IHk7CiAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5jdXJ2ZVRvLCB4MSwgeTEsIHgsIHksIHgsIHkpOwogICAgICAgICAgVXRpbC5iZXppZXJCb3VuZGluZ0JveChzdGFydFgsIHN0YXJ0WSwgeDEsIHkxLCB4LCB5LCB4LCB5LCBtaW5NYXgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIE9QUy5jbG9zZVBhdGg6CiAgICAgICAgcGF0aEJ1ZmZlci5wdXNoKERyYXdPUFMuY2xvc2VQYXRoKTsKICAgICAgICBicmVhazsKICAgIH0KICB9CiAgX2dldENvbG9yU3BhY2UoY3MsIHJlc291cmNlcywgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIHJldHVybiBDb2xvclNwYWNlVXRpbHMucGFyc2UoewogICAgICBjcywKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgYXN5bmNJZk5vdENhY2hlZDogdHJ1ZQogICAgfSk7CiAgfQogIGFzeW5jIF9oYW5kbGVDb2xvclNwYWNlKGNzUHJvbWlzZSkgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIGF3YWl0IGNzUHJvbWlzZTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB3YXJuKGBfaGFuZGxlQ29sb3JTcGFjZSAtIGlnbm9yaW5nIENvbG9yU3BhY2U6ICIke2V4fSIuYCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhyb3cgZXg7CiAgICB9CiAgfQogIHBhcnNlU2hhZGluZyh7CiAgICBzaGFkaW5nLAogICAgcmVzb3VyY2VzLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsCiAgICBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUKICB9KSB7CiAgICBsZXQgaWQgPSBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUuZ2V0KHNoYWRpbmcpOwogICAgaWYgKGlkKSB7CiAgICAgIHJldHVybiBpZDsKICAgIH0KICAgIGxldCBwYXR0ZXJuSVI7CiAgICB0cnkgewogICAgICBjb25zdCBzaGFkaW5nRmlsbCA9IFBhdHRlcm4ucGFyc2VTaGFkaW5nKHNoYWRpbmcsIHRoaXMueHJlZiwgcmVzb3VyY2VzLCB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgIHBhdHRlcm5JUiA9IHNoYWRpbmdGaWxsLmdldElSKCk7CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB3YXJuKGBwYXJzZVNoYWRpbmcgLSBpZ25vcmluZyBzaGFkaW5nOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUuc2V0KHNoYWRpbmcsIG51bGwpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHRocm93IHJlYXNvbjsKICAgIH0KICAgIGlkID0gYHBhdHRlcm5fJHt0aGlzLmlkRmFjdG9yeS5jcmVhdGVPYmpJZCgpfWA7CiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgIGlkID0gYCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fdHlwZTNfJHtpZH1gOwogICAgfQogICAgbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlLnNldChzaGFkaW5nLCBpZCk7CiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbaWQsICJQYXR0ZXJuIiwgcGF0dGVybklSXSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmhhbmRsZXIuc2VuZCgib2JqIiwgW2lkLCB0aGlzLnBhZ2VJbmRleCwgIlBhdHRlcm4iLCBwYXR0ZXJuSVJdKTsKICAgIH0KICAgIHJldHVybiBpZDsKICB9CiAgaGFuZGxlQ29sb3JOKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUsIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSkgewogICAgY29uc3QgcGF0dGVybk5hbWUgPSBhcmdzLnBvcCgpOwogICAgaWYgKHBhdHRlcm5OYW1lIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBjb25zdCByYXdQYXR0ZXJuID0gcGF0dGVybnMuZ2V0UmF3KHBhdHRlcm5OYW1lLm5hbWUpOwogICAgICBjb25zdCBsb2NhbFRpbGluZ1BhdHRlcm4gPSByYXdQYXR0ZXJuIGluc3RhbmNlb2YgUmVmICYmIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLmdldEJ5UmVmKHJhd1BhdHRlcm4pOwogICAgICBpZiAobG9jYWxUaWxpbmdQYXR0ZXJuKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IGNvbG9yID0gY3MuYmFzZSA/IGNzLmJhc2UuZ2V0UmdiKGFyZ3MsIDApIDogbnVsbDsKICAgICAgICAgIGNvbnN0IHRpbGluZ1BhdHRlcm5JUiA9IGdldFRpbGluZ1BhdHRlcm5JUihsb2NhbFRpbGluZ1BhdHRlcm4ub3BlcmF0b3JMaXN0SVIsIGxvY2FsVGlsaW5nUGF0dGVybi5kaWN0LCBjb2xvcik7CiAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIHRpbGluZ1BhdHRlcm5JUik7CiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0gY2F0Y2gge30KICAgICAgfQogICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy54cmVmLmZldGNoSWZSZWYocmF3UGF0dGVybik7CiAgICAgIGlmIChwYXR0ZXJuKSB7CiAgICAgICAgY29uc3QgZGljdCA9IHBhdHRlcm4gaW5zdGFuY2VvZiBCYXNlU3RyZWFtID8gcGF0dGVybi5kaWN0IDogcGF0dGVybjsKICAgICAgICBjb25zdCB0eXBlTnVtID0gZGljdC5nZXQoIlBhdHRlcm5UeXBlIik7CiAgICAgICAgaWYgKHR5cGVOdW0gPT09IFBhdHRlcm5UeXBlLlRJTElORykgewogICAgICAgICAgY29uc3QgY29sb3IgPSBjcy5iYXNlID8gY3MuYmFzZS5nZXRSZ2IoYXJncywgMCkgOiBudWxsOwogICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlVGlsaW5nVHlwZShmbiwgY29sb3IsIHJlc291cmNlcywgcGF0dGVybiwgZGljdCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBsb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlTnVtID09PSBQYXR0ZXJuVHlwZS5TSEFESU5HKSB7CiAgICAgICAgICBjb25zdCBzaGFkaW5nID0gZGljdC5nZXQoIlNoYWRpbmciKTsKICAgICAgICAgIGNvbnN0IG9iaklkID0gdGhpcy5wYXJzZVNoYWRpbmcoewogICAgICAgICAgICBzaGFkaW5nLAogICAgICAgICAgICByZXNvdXJjZXMsCiAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgICBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKG9iaklkKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IGxvb2t1cE1hdHJpeChkaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgbnVsbCk7CiAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChmbiwgWyJTaGFkaW5nIiwgb2JqSWQsIG1hdHJpeF0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbmtub3duIFBhdHRlcm5UeXBlOiAke3R5cGVOdW19YCk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBQYXR0ZXJuTmFtZTogJHtwYXR0ZXJuTmFtZX1gKTsKICB9CiAgX3BhcnNlVmlzaWJpbGl0eUV4cHJlc3Npb24oYXJyYXksIG5lc3RpbmdDb3VudGVyLCBjdXJyZW50UmVzdWx0KSB7CiAgICBjb25zdCBNQVhfTkVTVElORyA9IDEwOwogICAgaWYgKCsrbmVzdGluZ0NvdW50ZXIgPiBNQVhfTkVTVElORykgewogICAgICB3YXJuKCJWaXNpYmlsaXR5IGV4cHJlc3Npb24gaXMgdG9vIGRlZXBseSBuZXN0ZWQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgY29uc3Qgb3BlcmF0b3IgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihhcnJheVswXSk7CiAgICBpZiAobGVuZ3RoIDwgMiB8fCAhKG9wZXJhdG9yIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgd2FybigiSW52YWxpZCB2aXNpYmlsaXR5IGV4cHJlc3Npb24iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3dpdGNoIChvcGVyYXRvci5uYW1lKSB7CiAgICAgIGNhc2UgIkFuZCI6CiAgICAgIGNhc2UgIk9yIjoKICAgICAgY2FzZSAiTm90IjoKICAgICAgICBjdXJyZW50UmVzdWx0LnB1c2gob3BlcmF0b3IubmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgd2FybihgSW52YWxpZCBvcGVyYXRvciAke29wZXJhdG9yLm5hbWV9IGluIHZpc2liaWxpdHkgZXhwcmVzc2lvbmApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgcmF3ID0gYXJyYXlbaV07CiAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHJhdyk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHsKICAgICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSBbXTsKICAgICAgICBjdXJyZW50UmVzdWx0LnB1c2gobmVzdGVkUmVzdWx0KTsKICAgICAgICB0aGlzLl9wYXJzZVZpc2liaWxpdHlFeHByZXNzaW9uKG9iamVjdCwgbmVzdGluZ0NvdW50ZXIsIG5lc3RlZFJlc3VsdCk7CiAgICAgIH0gZWxzZSBpZiAocmF3IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgY3VycmVudFJlc3VsdC5wdXNoKHJhdy50b1N0cmluZygpKTsKICAgICAgfQogICAgfQogIH0KICBhc3luYyBwYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhjb250ZW50UHJvcGVydGllcywgcmVzb3VyY2VzKSB7CiAgICBsZXQgb3B0aW9uYWxDb250ZW50OwogICAgaWYgKGNvbnRlbnRQcm9wZXJ0aWVzIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBjb25zdCBwcm9wZXJ0aWVzID0gcmVzb3VyY2VzLmdldCgiUHJvcGVydGllcyIpOwogICAgICBvcHRpb25hbENvbnRlbnQgPSBwcm9wZXJ0aWVzLmdldChjb250ZW50UHJvcGVydGllcy5uYW1lKTsKICAgIH0gZWxzZSBpZiAoY29udGVudFByb3BlcnRpZXMgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGNvbnRlbnRQcm9wZXJ0aWVzOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJPcHRpb25hbCBjb250ZW50IHByb3BlcnRpZXMgbWFsZm9ybWVkLiIpOwogICAgfQogICAgY29uc3Qgb3B0aW9uYWxDb250ZW50VHlwZSA9IG9wdGlvbmFsQ29udGVudC5nZXQoIlR5cGUiKT8ubmFtZTsKICAgIGlmIChvcHRpb25hbENvbnRlbnRUeXBlID09PSAiT0NHIikgewogICAgICByZXR1cm4gewogICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCiAgICAgICAgaWQ6IG9wdGlvbmFsQ29udGVudC5vYmpJZAogICAgICB9OwogICAgfSBlbHNlIGlmIChvcHRpb25hbENvbnRlbnRUeXBlID09PSAiT0NNRCIpIHsKICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IG9wdGlvbmFsQ29udGVudC5nZXQoIlZFIik7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cHJlc3Npb24pKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgdGhpcy5fcGFyc2VWaXNpYmlsaXR5RXhwcmVzc2lvbihleHByZXNzaW9uLCAwLCByZXN1bHQpOwogICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdHlwZTogIk9DTUQiLAogICAgICAgICAgICBleHByZXNzaW9uOiByZXN1bHQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IG9wdGlvbmFsQ29udGVudEdyb3VwcyA9IG9wdGlvbmFsQ29udGVudC5nZXQoIk9DR3MiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uYWxDb250ZW50R3JvdXBzKSB8fCBvcHRpb25hbENvbnRlbnRHcm91cHMgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgY29uc3QgZ3JvdXBJZHMgPSBbXTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25hbENvbnRlbnRHcm91cHMpKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IG9jZyBvZiBvcHRpb25hbENvbnRlbnRHcm91cHMpIHsKICAgICAgICAgICAgZ3JvdXBJZHMucHVzaChvY2cudG9TdHJpbmcoKSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGdyb3VwSWRzLnB1c2gob3B0aW9uYWxDb250ZW50R3JvdXBzLm9iaklkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCiAgICAgICAgICBpZHM6IGdyb3VwSWRzLAogICAgICAgICAgcG9saWN5OiBvcHRpb25hbENvbnRlbnQuZ2V0KCJQIikgaW5zdGFuY2VvZiBOYW1lID8gb3B0aW9uYWxDb250ZW50LmdldCgiUCIpLm5hbWUgOiBudWxsLAogICAgICAgICAgZXhwcmVzc2lvbjogbnVsbAogICAgICAgIH07CiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWxDb250ZW50R3JvdXBzIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6IG9wdGlvbmFsQ29udGVudFR5cGUsCiAgICAgICAgICBpZDogb3B0aW9uYWxDb250ZW50R3JvdXBzLnRvU3RyaW5nKCkKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZ2V0T3BlcmF0b3JMaXN0KHsKICAgIHN0cmVhbSwKICAgIHRhc2ssCiAgICByZXNvdXJjZXMsCiAgICBvcGVyYXRvckxpc3QsCiAgICBpbml0aWFsU3RhdGUgPSBudWxsLAogICAgZmFsbGJhY2tGb250RGljdCA9IG51bGwKICB9KSB7CiAgICByZXNvdXJjZXMgfHw9IERpY3QuZW1wdHk7CiAgICBpbml0aWFsU3RhdGUgfHw9IG5ldyBFdmFsU3RhdGUoKTsKICAgIGlmICghb3BlcmF0b3JMaXN0KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0T3BlcmF0b3JMaXN0OiBtaXNzaW5nICJvcGVyYXRvckxpc3QiIHBhcmFtZXRlcicpOwogICAgfQogICAgY29uc3Qgc2VsZiA9IHRoaXM7CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOwogICAgY29uc3QgbG9jYWxJbWFnZUNhY2hlID0gbmV3IExvY2FsSW1hZ2VDYWNoZSgpOwogICAgY29uc3QgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBuZXcgTG9jYWxDb2xvclNwYWNlQ2FjaGUoKTsKICAgIGNvbnN0IGxvY2FsR1N0YXRlQ2FjaGUgPSBuZXcgTG9jYWxHU3RhdGVDYWNoZSgpOwogICAgY29uc3QgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUgPSBuZXcgTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUoKTsKICAgIGNvbnN0IGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSA9IG5ldyBNYXAoKTsKICAgIGNvbnN0IHhvYmpzID0gcmVzb3VyY2VzLmdldCgiWE9iamVjdCIpIHx8IERpY3QuZW1wdHk7CiAgICBjb25zdCBwYXR0ZXJucyA9IHJlc291cmNlcy5nZXQoIlBhdHRlcm4iKSB8fCBEaWN0LmVtcHR5OwogICAgY29uc3Qgc3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcihpbml0aWFsU3RhdGUpOwogICAgY29uc3QgcHJlcHJvY2Vzc29yID0gbmV3IEV2YWx1YXRvclByZXByb2Nlc3NvcihzdHJlYW0sIHhyZWYsIHN0YXRlTWFuYWdlcik7CiAgICBjb25zdCB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7CiAgICBmdW5jdGlvbiBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKGFyZ3VtZW50KSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHByZXByb2Nlc3Nvci5zYXZlZFN0YXRlc0RlcHRoOyBpIDwgaWk7IGkrKykgewogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucmVzdG9yZSwgW10pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkgewogICAgICAgIFByb21pc2UuYWxsKFtwcm9taXNlLCBvcGVyYXRvckxpc3QucmVhZHldKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7CiAgICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgICByZWplY3QoZXgpOwogICAgICAgICAgfQogICAgICAgIH0sIHJlamVjdCk7CiAgICAgIH07CiAgICAgIHRhc2suZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICB0aW1lU2xvdE1hbmFnZXIucmVzZXQoKTsKICAgICAgY29uc3Qgb3BlcmF0aW9uID0ge307CiAgICAgIGxldCBzdG9wLCBpLCBpaSwgY3MsIG5hbWUsIGlzVmFsaWROYW1lOwogICAgICB3aGlsZSAoIShzdG9wID0gdGltZVNsb3RNYW5hZ2VyLmNoZWNrKCkpKSB7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBudWxsOwogICAgICAgIGlmICghcHJlcHJvY2Vzc29yLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGxldCBhcmdzID0gb3BlcmF0aW9uLmFyZ3M7CiAgICAgICAgbGV0IGZuID0gb3BlcmF0aW9uLmZuOwogICAgICAgIHN3aXRjaCAoZm4gfCAwKSB7CiAgICAgICAgICBjYXNlIE9QUy5wYWludFhPYmplY3Q6CiAgICAgICAgICAgIGlzVmFsaWROYW1lID0gYXJnc1swXSBpbnN0YW5jZW9mIE5hbWU7CiAgICAgICAgICAgIG5hbWUgPSBhcmdzWzBdLm5hbWU7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkTmFtZSkgewogICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlOYW1lKG5hbWUpOwogICAgICAgICAgICAgIGlmIChsb2NhbEltYWdlKSB7CiAgICAgICAgICAgICAgICBhZGRMb2NhbGx5Q2FjaGVkSW1hZ2VPcHMob3BlcmF0b3JMaXN0LCBsb2NhbEltYWdlKTsKICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVYT2JqZWN0LCByZWplY3RYT2JqZWN0KSB7CiAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbGV0IHhvYmogPSB4b2Jqcy5nZXRSYXcobmFtZSk7CiAgICAgICAgICAgICAgaWYgKHhvYmogaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlSZWYoeG9iaikgfHwgc2VsZi5fcmVnaW9uYWxJbWFnZUNhY2hlLmdldEJ5UmVmKHhvYmopOwogICAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHsKICAgICAgICAgICAgICAgICAgYWRkTG9jYWxseUNhY2hlZEltYWdlT3BzKG9wZXJhdG9yTGlzdCwgbG9jYWxJbWFnZSk7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbEltYWdlID0gc2VsZi5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoeG9iaiwgc2VsZi5wYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGdsb2JhbEltYWdlKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KGdsb2JhbEltYWdlLm9iaklkKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZEltYWdlT3BzKGdsb2JhbEltYWdlLmZuLCBnbG9iYWxJbWFnZS5hcmdzLCBnbG9iYWxJbWFnZS5vcHRpb25hbENvbnRlbnQsIGdsb2JhbEltYWdlLmhhc01hc2spOwogICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB4b2JqID0geHJlZi5mZXRjaCh4b2JqKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCEoeG9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB4b2JqLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CiAgICAgICAgICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGhhdmUgYSBOYW1lIHN1YnR5cGUiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHR5cGUubmFtZSA9PT0gIkZvcm0iKSB7CiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc2F2ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5idWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgeG9iaiwgbnVsbCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIuc3RhdGUuY2xvbmUoewogICAgICAgICAgICAgICAgICBuZXdQYXRoOiB0cnVlCiAgICAgICAgICAgICAgICB9KSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIucmVzdG9yZSgpOwogICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLm5hbWUgPT09ICJJbWFnZSIpIHsKICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRQYWludEltYWdlWE9iamVjdCh7CiAgICAgICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICAgICAgaW1hZ2U6IHhvYmosCiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgICAgICAgICAgICAgY2FjaGVLZXk6IG5hbWUsCiAgICAgICAgICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZSwKICAgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5uYW1lID09PSAiUFMiKSB7CiAgICAgICAgICAgICAgICBpbmZvKCJJZ25vcmVkIFhPYmplY3Qgc3VidHlwZSBQUyIpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVuaGFuZGxlZCBYT2JqZWN0IHN1YnR5cGUgJHt0eXBlLm5hbWV9YCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgICAgICAgIHdhcm4oYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIFhPYmplY3Q6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuc2V0Rm9udDoKICAgICAgICAgICAgY29uc3QgZm9udFNpemUgPSBhcmdzWzFdOwogICAgICAgICAgICBuZXh0KHNlbGYuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIGFyZ3MsIG51bGwsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLnN0YXRlLCBmYWxsYmFja0ZvbnREaWN0KS50aGVuKGZ1bmN0aW9uIChsb2FkZWROYW1lKSB7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY3kobG9hZGVkTmFtZSk7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5zZXRGb250LCBbbG9hZGVkTmFtZSwgZm9udFNpemVdKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlIE9QUy5lbmRJbmxpbmVJbWFnZToKICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBhcmdzWzBdLmNhY2hlS2V5OwogICAgICAgICAgICBpZiAoY2FjaGVLZXkpIHsKICAgICAgICAgICAgICBjb25zdCBsb2NhbEltYWdlID0gbG9jYWxJbWFnZUNhY2hlLmdldEJ5TmFtZShjYWNoZUtleSk7CiAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHsKICAgICAgICAgICAgICAgIGFkZExvY2FsbHlDYWNoZWRJbWFnZU9wcyhvcGVyYXRvckxpc3QsIGxvY2FsSW1hZ2UpOwogICAgICAgICAgICAgICAgYXJncyA9IG51bGw7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dChzZWxmLmJ1aWxkUGFpbnRJbWFnZVhPYmplY3QoewogICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICBpbWFnZTogYXJnc1swXSwKICAgICAgICAgICAgICBpc0lubGluZTogdHJ1ZSwKICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsCiAgICAgICAgICAgICAgY2FjaGVLZXksCiAgICAgICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3NbMF0gPSBzZWxmLmhhbmRsZVRleHQoYXJnc1swXSwgc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zaG93U3BhY2VkVGV4dDoKICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgewogICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY29tYmluZWRHbHlwaHMgPSBbXSwKICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlTWFuYWdlci5zdGF0ZTsKICAgICAgICAgICAgZm9yIChjb25zdCBhcnJJdGVtIG9mIGFyZ3NbMF0pIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyckl0ZW0gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICBjb21iaW5lZEdseXBocy5wdXNoKC4uLnNlbGYuaGFuZGxlVGV4dChhcnJJdGVtLCBzdGF0ZSkpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyckl0ZW0gPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgICBjb21iaW5lZEdseXBocy5wdXNoKGFyckl0ZW0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzWzBdID0gY29tYmluZWRHbHlwaHM7CiAgICAgICAgICAgIGZuID0gT1BTLnNob3dUZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lU2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMubmV4dExpbmUpOwogICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgIGZuID0gT1BTLnNob3dUZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OgogICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLm5leHRMaW5lKTsKICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5zZXRXb3JkU3BhY2luZywgW2FyZ3Muc2hpZnQoKV0pOwogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldENoYXJTcGFjaW5nLCBbYXJncy5zaGlmdCgpXSk7CiAgICAgICAgICAgIGFyZ3NbMF0gPSBzZWxmLmhhbmRsZVRleHQoYXJnc1swXSwgc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2hvd1RleHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dFJlbmRlcmluZ01vZGU6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS50ZXh0UmVuZGVyaW5nTW9kZSA9IGFyZ3NbMF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yU3BhY2U6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjb25zdCBmaWxsQ1MgPSBzZWxmLl9nZXRDb2xvclNwYWNlKGFyZ3NbMF0sIHJlc291cmNlcywgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgICAgICAgICAgIGlmIChmaWxsQ1MgaW5zdGFuY2VvZiBDb2xvclNwYWNlKSB7CiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBmaWxsQ1M7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbmV4dChzZWxmLl9oYW5kbGVDb2xvclNwYWNlKGZpbGxDUykudGhlbihjb2xvclNwYWNlID0+IHsKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2UgfHwgQ29sb3JTcGFjZVV0aWxzLmdyYXk7CiAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ29sb3JTcGFjZToKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0IHN0cm9rZUNTID0gc2VsZi5fZ2V0Q29sb3JTcGFjZShhcmdzWzBdLCByZXNvdXJjZXMsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKICAgICAgICAgICAgICBpZiAoc3Ryb2tlQ1MgaW5zdGFuY2VvZiBDb2xvclNwYWNlKSB7CiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IHN0cm9rZUNTOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG5leHQoc2VsZi5faGFuZGxlQ29sb3JTcGFjZShzdHJva2VDUykudGhlbihjb2xvclNwYWNlID0+IHsKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gY29sb3JTcGFjZSB8fCBDb2xvclNwYWNlVXRpbHMuZ3JheTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3I6CiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlOwogICAgICAgICAgICBhcmdzID0gY3MuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ29sb3I6CiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U7CiAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OgogICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBDb2xvclNwYWNlVXRpbHMuZ3JheTsKICAgICAgICAgICAgYXJncyA9IENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUdyYXk6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLmdyYXk7CiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlVXRpbHMuZ3JheS5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDTVlLQ29sb3I6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IENvbG9yU3BhY2VVdGlscy5jbXlrOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZVV0aWxzLmNteWsuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOgogICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IENvbG9yU3BhY2VVdGlscy5jbXlrOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZVV0aWxzLmNteWsuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsUkdCQ29sb3I6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IENvbG9yU3BhY2VVdGlscy5yZ2I7CiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlVXRpbHMucmdiLmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VSR0JDb2xvcjoKICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBDb2xvclNwYWNlVXRpbHMucmdiOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZVV0aWxzLnJnYi5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yTjoKICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUucGF0dGVybkZpbGxDb2xvclNwYWNlOwogICAgICAgICAgICBpZiAoIWNzKSB7CiAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyQXJyYXkoYXJncywgbnVsbCkpIHsKICAgICAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlVXRpbHMuZ3JheS5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYXJncyA9IFtdOwogICAgICAgICAgICAgIGZuID0gT1BTLnNldEZpbGxUcmFuc3BhcmVudDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gIlBhdHRlcm4iKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZUNvbG9yTihvcGVyYXRvckxpc3QsIE9QUy5zZXRGaWxsQ29sb3JOLCBhcmdzLCBjcywgcGF0dGVybnMsIHJlc291cmNlcywgdGFzaywgbG9jYWxDb2xvclNwYWNlQ2FjaGUsIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLCBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUpKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yTjoKICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUucGF0dGVyblN0cm9rZUNvbG9yU3BhY2U7CiAgICAgICAgICAgIGlmICghY3MpIHsKICAgICAgICAgICAgICBpZiAoaXNOdW1iZXJBcnJheShhcmdzLCBudWxsKSkgewogICAgICAgICAgICAgICAgYXJncyA9IENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGFyZ3MgPSBbXTsKICAgICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VUcmFuc3BhcmVudDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gIlBhdHRlcm4iKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZUNvbG9yTihvcGVyYXRvckxpc3QsIE9QUy5zZXRTdHJva2VDb2xvck4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUsIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSkpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzID0gY3MuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zaGFkaW5nRmlsbDoKICAgICAgICAgICAgbGV0IHNoYWRpbmc7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgY29uc3Qgc2hhZGluZ1JlcyA9IHJlc291cmNlcy5nZXQoIlNoYWRpbmciKTsKICAgICAgICAgICAgICBpZiAoIXNoYWRpbmdSZXMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gc2hhZGluZyByZXNvdXJjZSBmb3VuZCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzaGFkaW5nID0gc2hhZGluZ1Jlcy5nZXQoYXJnc1swXS5uYW1lKTsKICAgICAgICAgICAgICBpZiAoIXNoYWRpbmcpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gc2hhZGluZyBvYmplY3QgZm91bmQiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBTaGFkaW5nOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcGF0dGVybklkID0gc2VsZi5wYXJzZVNoYWRpbmcoewogICAgICAgICAgICAgIHNoYWRpbmcsCiAgICAgICAgICAgICAgcmVzb3VyY2VzLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgICAgIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKCFwYXR0ZXJuSWQpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzID0gW3BhdHRlcm5JZF07CiAgICAgICAgICAgIGZuID0gT1BTLnNoYWRpbmdGaWxsOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEdTdGF0ZToKICAgICAgICAgICAgaXNWYWxpZE5hbWUgPSBhcmdzWzBdIGluc3RhbmNlb2YgTmFtZTsKICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKICAgICAgICAgICAgaWYgKGlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgY29uc3QgbG9jYWxHU3RhdGVPYmogPSBsb2NhbEdTdGF0ZUNhY2hlLmdldEJ5TmFtZShuYW1lKTsKICAgICAgICAgICAgICBpZiAobG9jYWxHU3RhdGVPYmopIHsKICAgICAgICAgICAgICAgIGlmIChsb2NhbEdTdGF0ZU9iai5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuc2V0R1N0YXRlLCBbbG9jYWxHU3RhdGVPYmpdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSkgewogICAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgZXh0R1N0YXRlID0gcmVzb3VyY2VzLmdldCgiRXh0R1N0YXRlIik7CiAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CiAgICAgICAgICAgICAgaWYgKCEoZ1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNlbGYuc2V0R1N0YXRlKHsKICAgICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICAgIGdTdGF0ZSwKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBuYW1lLAogICAgICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlciwKICAgICAgICAgICAgICAgIGxvY2FsR1N0YXRlQ2FjaGUsCiAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgd2FybihgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhyb3cgcmVhc29uOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNhc2UgT1BTLnNldExpbmVXaWR0aDoKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0IFt0aGlja25lc3NdID0gYXJnczsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaWNrbmVzcyAhPT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgIHdhcm4oYEludmFsaWQgc2V0TGluZVdpZHRoOiAke3RoaWNrbmVzc31gKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhcmdzWzBdID0gTWF0aC5hYnModGhpY2tuZXNzKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBPUFMubW92ZVRvOgogICAgICAgICAgY2FzZSBPUFMubGluZVRvOgogICAgICAgICAgY2FzZSBPUFMuY3VydmVUbzoKICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8yOgogICAgICAgICAgY2FzZSBPUFMuY3VydmVUbzM6CiAgICAgICAgICBjYXNlIE9QUy5jbG9zZVBhdGg6CiAgICAgICAgICBjYXNlIE9QUy5yZWN0YW5nbGU6CiAgICAgICAgICAgIHNlbGYuYnVpbGRQYXRoKGZuLCBhcmdzLCBzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNhc2UgT1BTLnN0cm9rZToKICAgICAgICAgIGNhc2UgT1BTLmNsb3NlU3Ryb2tlOgogICAgICAgICAgY2FzZSBPUFMuZmlsbDoKICAgICAgICAgIGNhc2UgT1BTLmVvRmlsbDoKICAgICAgICAgIGNhc2UgT1BTLmZpbGxTdHJva2U6CiAgICAgICAgICBjYXNlIE9QUy5lb0ZpbGxTdHJva2U6CiAgICAgICAgICBjYXNlIE9QUy5jbG9zZUZpbGxTdHJva2U6CiAgICAgICAgICBjYXNlIE9QUy5jbG9zZUVPRmlsbFN0cm9rZToKICAgICAgICAgIGNhc2UgT1BTLmVuZFBhdGg6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICBzdGF0ZTogewogICAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLAogICAgICAgICAgICAgICAgICBwYXRoTWluTWF4CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSA9IHN0YXRlTWFuYWdlcjsKICAgICAgICAgICAgICBpZiAoZm4gPT09IE9QUy5jbG9zZVN0cm9rZSB8fCBmbiA9PT0gT1BTLmNsb3NlRmlsbFN0cm9rZSB8fCBmbiA9PT0gT1BTLmNsb3NlRU9GaWxsU3Ryb2tlKSB7CiAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLnB1c2goRHJhd09QUy5jbG9zZVBhdGgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAocGF0aEJ1ZmZlci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuY29uc3RydWN0UGF0aCwgW2ZuLCBbbnVsbF0sIG51bGxdKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5jb25zdHJ1Y3RQYXRoLCBbZm4sIFtuZXcgRmxvYXQzMkFycmF5KHBhdGhCdWZmZXIpXSwgcGF0aE1pbk1heC5zbGljZSgpXSk7CiAgICAgICAgICAgICAgICBwYXRoQnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICBwYXRoTWluTWF4LnNldChbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV0sIDApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSBPUFMubWFya1BvaW50OgogICAgICAgICAgY2FzZSBPUFMubWFya1BvaW50UHJvcHM6CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbkNvbXBhdDoKICAgICAgICAgIGNhc2UgT1BTLmVuZENvbXBhdDoKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wczoKICAgICAgICAgICAgaWYgKCEoYXJnc1swXSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgd2FybihgRXhwZWN0ZWQgbmFtZSBmb3IgYmVnaW5NYXJrZWRDb250ZW50UHJvcHMgYXJnMD0ke2FyZ3NbMF19YCk7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG51bGxdKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJnc1swXS5uYW1lID09PSAiT0MiKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGFyZ3NbMV0sIHJlc291cmNlcykudGhlbihkYXRhID0+IHsKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBkYXRhXSk7CiAgICAgICAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBudWxsXSk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3MgPSBbYXJnc1swXS5uYW1lLCBhcmdzWzFdIGluc3RhbmNlb2YgRGljdCA/IGFyZ3NbMV0uZ2V0KCJNQ0lEIikgOiBudWxsXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbk1hcmtlZENvbnRlbnQ6CiAgICAgICAgICBjYXNlIE9QUy5lbmRNYXJrZWRDb250ZW50OgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaWYgKGFyZ3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGFyZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaSA8IGlpKSB7CiAgICAgICAgICAgICAgICB3YXJuKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBvcGVyYXRvcjogIiArIGZuKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIGFyZ3MpOwogICAgICB9CiAgICAgIGlmIChzdG9wKSB7CiAgICAgICAgbmV4dChkZWZlcnJlZCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTsKICAgICAgcmVzb2x2ZSgpOwogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2FybihgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgZXJyb3JzIGR1cmluZyAiJHt0YXNrLm5hbWV9IiBgICsgYHRhc2s6ICIke3JlYXNvbn0iLmApOwogICAgICAgIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGdldFRleHRDb250ZW50KHsKICAgIHN0cmVhbSwKICAgIHRhc2ssCiAgICByZXNvdXJjZXMsCiAgICBzdGF0ZU1hbmFnZXIgPSBudWxsLAogICAgaW5jbHVkZU1hcmtlZENvbnRlbnQgPSBmYWxzZSwKICAgIHNpbmssCiAgICBzZWVuU3R5bGVzID0gbmV3IFNldCgpLAogICAgdmlld0JveCwKICAgIGxhbmcgPSBudWxsLAogICAgbWFya2VkQ29udGVudERhdGEgPSBudWxsLAogICAgZGlzYWJsZU5vcm1hbGl6YXRpb24gPSBmYWxzZSwKICAgIGtlZXBXaGl0ZVNwYWNlID0gZmFsc2UKICB9KSB7CiAgICByZXNvdXJjZXMgfHw9IERpY3QuZW1wdHk7CiAgICBzdGF0ZU1hbmFnZXIgfHw9IG5ldyBTdGF0ZU1hbmFnZXIobmV3IFRleHRTdGF0ZSgpKTsKICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICBtYXJrZWRDb250ZW50RGF0YSB8fD0gewogICAgICAgIGxldmVsOiAwCiAgICAgIH07CiAgICB9CiAgICBjb25zdCB0ZXh0Q29udGVudCA9IHsKICAgICAgaXRlbXM6IFtdLAogICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgIGxhbmcKICAgIH07CiAgICBjb25zdCB0ZXh0Q29udGVudEl0ZW0gPSB7CiAgICAgIGluaXRpYWxpemVkOiBmYWxzZSwKICAgICAgc3RyOiBbXSwKICAgICAgdG90YWxXaWR0aDogMCwKICAgICAgdG90YWxIZWlnaHQ6IDAsCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIHZlcnRpY2FsOiBmYWxzZSwKICAgICAgcHJldlRyYW5zZm9ybTogbnVsbCwKICAgICAgdGV4dEFkdmFuY2VTY2FsZTogMCwKICAgICAgc3BhY2VJbkZsb3dNaW46IDAsCiAgICAgIHNwYWNlSW5GbG93TWF4OiAwLAogICAgICB0cmFja2luZ1NwYWNlTWluOiBJbmZpbml0eSwKICAgICAgbmVnYXRpdmVTcGFjZU1heDogLUluZmluaXR5LAogICAgICBub3RBU3BhY2U6IC1JbmZpbml0eSwKICAgICAgdHJhbnNmb3JtOiBudWxsLAogICAgICBmb250TmFtZTogbnVsbCwKICAgICAgaGFzRU9MOiBmYWxzZQogICAgfTsKICAgIGNvbnN0IHR3b0xhc3RDaGFycyA9IFsiICIsICIgIl07CiAgICBsZXQgdHdvTGFzdENoYXJzUG9zID0gMDsKICAgIGZ1bmN0aW9uIHNhdmVMYXN0Q2hhcihjaGFyKSB7CiAgICAgIGNvbnN0IG5leHRQb3MgPSAodHdvTGFzdENoYXJzUG9zICsgMSkgJSAyOwogICAgICBjb25zdCByZXQgPSB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSAhPT0gIiAiICYmIHR3b0xhc3RDaGFyc1tuZXh0UG9zXSA9PT0gIiAiOwogICAgICB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSA9IGNoYXI7CiAgICAgIHR3b0xhc3RDaGFyc1BvcyA9IG5leHRQb3M7CiAgICAgIHJldHVybiAha2VlcFdoaXRlU3BhY2UgJiYgcmV0OwogICAgfQogICAgZnVuY3Rpb24gc2hvdWxkQWRkV2hpdGVwc2FjZSgpIHsKICAgICAgcmV0dXJuICFrZWVwV2hpdGVTcGFjZSAmJiB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSAhPT0gIiAiICYmIHR3b0xhc3RDaGFyc1sodHdvTGFzdENoYXJzUG9zICsgMSkgJSAyXSA9PT0gIiAiOwogICAgfQogICAgZnVuY3Rpb24gcmVzZXRMYXN0Q2hhcnMoKSB7CiAgICAgIHR3b0xhc3RDaGFyc1swXSA9IHR3b0xhc3RDaGFyc1sxXSA9ICIgIjsKICAgICAgdHdvTGFzdENoYXJzUG9zID0gMDsKICAgIH0KICAgIGNvbnN0IFRSQUNLSU5HX1NQQUNFX0ZBQ1RPUiA9IDAuMTAyOwogICAgY29uc3QgTk9UX0FfU1BBQ0VfRkFDVE9SID0gMC4wMzsKICAgIGNvbnN0IE5FR0FUSVZFX1NQQUNFX0ZBQ1RPUiA9IC0wLjI7CiAgICBjb25zdCBTUEFDRV9JTl9GTE9XX01JTl9GQUNUT1IgPSAwLjEwMjsKICAgIGNvbnN0IFNQQUNFX0lOX0ZMT1dfTUFYX0ZBQ1RPUiA9IDAuNjsKICAgIGNvbnN0IFZFUlRJQ0FMX1NISUZUX1JBVElPID0gMC4yNTsKICAgIGNvbnN0IHNlbGYgPSB0aGlzOwogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGNvbnN0IHNob3dTcGFjZWRUZXh0QnVmZmVyID0gW107CiAgICBsZXQgeG9ianMgPSBudWxsOwogICAgY29uc3QgZW1wdHlYT2JqZWN0Q2FjaGUgPSBuZXcgTG9jYWxJbWFnZUNhY2hlKCk7CiAgICBjb25zdCBlbXB0eUdTdGF0ZUNhY2hlID0gbmV3IExvY2FsR1N0YXRlQ2FjaGUoKTsKICAgIGNvbnN0IHByZXByb2Nlc3NvciA9IG5ldyBFdmFsdWF0b3JQcmVwcm9jZXNzb3Ioc3RyZWFtLCB4cmVmLCBzdGF0ZU1hbmFnZXIpOwogICAgbGV0IHRleHRTdGF0ZTsKICAgIGZ1bmN0aW9uIHB1c2hXaGl0ZXNwYWNlKHsKICAgICAgd2lkdGggPSAwLAogICAgICBoZWlnaHQgPSAwLAogICAgICB0cmFuc2Zvcm0gPSB0ZXh0Q29udGVudEl0ZW0ucHJldlRyYW5zZm9ybSwKICAgICAgZm9udE5hbWUgPSB0ZXh0Q29udGVudEl0ZW0uZm9udE5hbWUKICAgIH0pIHsKICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCh7CiAgICAgICAgc3RyOiAiICIsCiAgICAgICAgZGlyOiAibHRyIiwKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgdHJhbnNmb3JtLAogICAgICAgIGZvbnROYW1lLAogICAgICAgIGhhc0VPTDogZmFsc2UKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRDdXJyZW50VGV4dFRyYW5zZm9ybSgpIHsKICAgICAgY29uc3QgZm9udCA9IHRleHRTdGF0ZS5mb250OwogICAgICBjb25zdCB0c20gPSBbdGV4dFN0YXRlLmZvbnRTaXplICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDAsIDAsIHRleHRTdGF0ZS5mb250U2l6ZSwgMCwgdGV4dFN0YXRlLnRleHRSaXNlXTsKICAgICAgaWYgKGZvbnQuaXNUeXBlM0ZvbnQgJiYgKHRleHRTdGF0ZS5mb250U2l6ZSA8PSAxIHx8IGZvbnQuaXNDaGFyQkJveCkgJiYgIWlzQXJyYXlFcXVhbCh0ZXh0U3RhdGUuZm9udE1hdHJpeCwgRk9OVF9JREVOVElUWV9NQVRSSVgpKSB7CiAgICAgICAgY29uc3QgZ2x5cGhIZWlnaHQgPSBmb250LmJib3hbM10gLSBmb250LmJib3hbMV07CiAgICAgICAgaWYgKGdseXBoSGVpZ2h0ID4gMCkgewogICAgICAgICAgdHNtWzNdICo9IGdseXBoSGVpZ2h0ICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbM107CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBVdGlsLnRyYW5zZm9ybSh0ZXh0U3RhdGUuY3RtLCBVdGlsLnRyYW5zZm9ybSh0ZXh0U3RhdGUudGV4dE1hdHJpeCwgdHNtKSk7CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVUZXh0Q29udGVudEl0ZW0oKSB7CiAgICAgIGlmICh0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKICAgICAgICByZXR1cm4gdGV4dENvbnRlbnRJdGVtOwogICAgICB9CiAgICAgIGNvbnN0IHsKICAgICAgICBmb250LAogICAgICAgIGxvYWRlZE5hbWUKICAgICAgfSA9IHRleHRTdGF0ZTsKICAgICAgaWYgKCFzZWVuU3R5bGVzLmhhcyhsb2FkZWROYW1lKSkgewogICAgICAgIHNlZW5TdHlsZXMuYWRkKGxvYWRlZE5hbWUpOwogICAgICAgIHRleHRDb250ZW50LnN0eWxlc1tsb2FkZWROYW1lXSA9IHsKICAgICAgICAgIGZvbnRGYW1pbHk6IGZvbnQuZmFsbGJhY2tOYW1lLAogICAgICAgICAgYXNjZW50OiBmb250LmFzY2VudCwKICAgICAgICAgIGRlc2NlbnQ6IGZvbnQuZGVzY2VudCwKICAgICAgICAgIHZlcnRpY2FsOiBmb250LnZlcnRpY2FsCiAgICAgICAgfTsKICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMgJiYgZm9udC5zeXN0ZW1Gb250SW5mbykgewogICAgICAgICAgY29uc3Qgc3R5bGUgPSB0ZXh0Q29udGVudC5zdHlsZXNbbG9hZGVkTmFtZV07CiAgICAgICAgICBzdHlsZS5mb250U3Vic3RpdHV0aW9uID0gZm9udC5zeXN0ZW1Gb250SW5mby5jc3M7CiAgICAgICAgICBzdHlsZS5mb250U3Vic3RpdHV0aW9uTG9hZGVkTmFtZSA9IGZvbnQuc3lzdGVtRm9udEluZm8ubG9hZGVkTmFtZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGV4dENvbnRlbnRJdGVtLmZvbnROYW1lID0gbG9hZGVkTmFtZTsKICAgICAgY29uc3QgdHJtID0gdGV4dENvbnRlbnRJdGVtLnRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgIGlmICghZm9udC52ZXJ0aWNhbCkgewogICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCA9IHRleHRDb250ZW50SXRlbS50b3RhbFdpZHRoID0gMDsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ID0gTWF0aC5oeXBvdCh0cm1bMl0sIHRybVszXSk7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsID0gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsV2lkdGggPSBNYXRoLmh5cG90KHRybVswXSwgdHJtWzFdKTsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ID0gMDsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0udmVydGljYWwgPSB0cnVlOwogICAgICB9CiAgICAgIGNvbnN0IHNjYWxlTGluZVggPSBNYXRoLmh5cG90KHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeFswXSwgdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzFdKTsKICAgICAgY29uc3Qgc2NhbGVDdG1YID0gTWF0aC5oeXBvdCh0ZXh0U3RhdGUuY3RtWzBdLCB0ZXh0U3RhdGUuY3RtWzFdKTsKICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUgPSBzY2FsZUN0bVggKiBzY2FsZUxpbmVYOwogICAgICBjb25zdCB7CiAgICAgICAgZm9udFNpemUKICAgICAgfSA9IHRleHRTdGF0ZTsKICAgICAgdGV4dENvbnRlbnRJdGVtLnRyYWNraW5nU3BhY2VNaW4gPSBmb250U2l6ZSAqIFRSQUNLSU5HX1NQQUNFX0ZBQ1RPUjsKICAgICAgdGV4dENvbnRlbnRJdGVtLm5vdEFTcGFjZSA9IGZvbnRTaXplICogTk9UX0FfU1BBQ0VfRkFDVE9SOwogICAgICB0ZXh0Q29udGVudEl0ZW0ubmVnYXRpdmVTcGFjZU1heCA9IGZvbnRTaXplICogTkVHQVRJVkVfU1BBQ0VfRkFDVE9SOwogICAgICB0ZXh0Q29udGVudEl0ZW0uc3BhY2VJbkZsb3dNaW4gPSBmb250U2l6ZSAqIFNQQUNFX0lOX0ZMT1dfTUlOX0ZBQ1RPUjsKICAgICAgdGV4dENvbnRlbnRJdGVtLnNwYWNlSW5GbG93TWF4ID0gZm9udFNpemUgKiBTUEFDRV9JTl9GTE9XX01BWF9GQUNUT1I7CiAgICAgIHRleHRDb250ZW50SXRlbS5oYXNFT0wgPSBmYWxzZTsKICAgICAgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRleHRDb250ZW50SXRlbTsKICAgIH0KICAgIGZ1bmN0aW9uIHVwZGF0ZUFkdmFuY2VTY2FsZSgpIHsKICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgc2NhbGVMaW5lWCA9IE1hdGguaHlwb3QodGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzBdLCB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXhbMV0pOwogICAgICBjb25zdCBzY2FsZUN0bVggPSBNYXRoLmh5cG90KHRleHRTdGF0ZS5jdG1bMF0sIHRleHRTdGF0ZS5jdG1bMV0pOwogICAgICBjb25zdCBzY2FsZUZhY3RvciA9IHNjYWxlQ3RtWCAqIHNjYWxlTGluZVg7CiAgICAgIGlmIChzY2FsZUZhY3RvciA9PT0gdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0udG90YWxXaWR0aCArPSB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKiB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIHRleHRDb250ZW50SXRlbS50b3RhbEhlaWdodCArPSB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICogdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCA9IDA7CiAgICAgIH0KICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUgPSBzY2FsZUZhY3RvcjsKICAgIH0KICAgIGZ1bmN0aW9uIHJ1bkJpZGlUcmFuc2Zvcm0odGV4dENodW5rKSB7CiAgICAgIGxldCB0ZXh0ID0gdGV4dENodW5rLnN0ci5qb2luKCIiKTsKICAgICAgaWYgKCFkaXNhYmxlTm9ybWFsaXphdGlvbikgewogICAgICAgIHRleHQgPSBub3JtYWxpemVVbmljb2RlKHRleHQpOwogICAgICB9CiAgICAgIGNvbnN0IGJpZGlSZXN1bHQgPSBiaWRpKHRleHQsIC0xLCB0ZXh0Q2h1bmsudmVydGljYWwpOwogICAgICByZXR1cm4gewogICAgICAgIHN0cjogYmlkaVJlc3VsdC5zdHIsCiAgICAgICAgZGlyOiBiaWRpUmVzdWx0LmRpciwKICAgICAgICB3aWR0aDogTWF0aC5hYnModGV4dENodW5rLnRvdGFsV2lkdGgpLAogICAgICAgIGhlaWdodDogTWF0aC5hYnModGV4dENodW5rLnRvdGFsSGVpZ2h0KSwKICAgICAgICB0cmFuc2Zvcm06IHRleHRDaHVuay50cmFuc2Zvcm0sCiAgICAgICAgZm9udE5hbWU6IHRleHRDaHVuay5mb250TmFtZSwKICAgICAgICBoYXNFT0w6IHRleHRDaHVuay5oYXNFT0wKICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVNldEZvbnQoZm9udE5hbWUsIGZvbnRSZWYpIHsKICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IGF3YWl0IHNlbGYubG9hZEZvbnQoZm9udE5hbWUsIGZvbnRSZWYsIHJlc291cmNlcywgdGFzayk7CiAgICAgIHRleHRTdGF0ZS5sb2FkZWROYW1lID0gdHJhbnNsYXRlZC5sb2FkZWROYW1lOwogICAgICB0ZXh0U3RhdGUuZm9udCA9IHRyYW5zbGF0ZWQuZm9udDsKICAgICAgdGV4dFN0YXRlLmZvbnRNYXRyaXggPSB0cmFuc2xhdGVkLmZvbnQuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDsKICAgIH0KICAgIGZ1bmN0aW9uIGFwcGx5SW52ZXJzZVJvdGF0aW9uKHgsIHksIG1hdHJpeCkgewogICAgICBjb25zdCBzY2FsZSA9IE1hdGguaHlwb3QobWF0cml4WzBdLCBtYXRyaXhbMV0pOwogICAgICByZXR1cm4gWyhtYXRyaXhbMF0gKiB4ICsgbWF0cml4WzFdICogeSkgLyBzY2FsZSwgKG1hdHJpeFsyXSAqIHggKyBtYXRyaXhbM10gKiB5KSAvIHNjYWxlXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBhcmVXaXRoTGFzdFBvc2l0aW9uKGdseXBoV2lkdGgpIHsKICAgICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgIGxldCBwb3NYID0gY3VycmVudFRyYW5zZm9ybVs0XTsKICAgICAgbGV0IHBvc1kgPSBjdXJyZW50VHJhbnNmb3JtWzVdOwogICAgICBpZiAodGV4dFN0YXRlLmZvbnQ/LnZlcnRpY2FsKSB7CiAgICAgICAgaWYgKHBvc1ggPCB2aWV3Qm94WzBdIHx8IHBvc1ggPiB2aWV3Qm94WzJdIHx8IHBvc1kgKyBnbHlwaFdpZHRoIDwgdmlld0JveFsxXSB8fCBwb3NZID4gdmlld0JveFszXSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwb3NYICsgZ2x5cGhXaWR0aCA8IHZpZXdCb3hbMF0gfHwgcG9zWCA+IHZpZXdCb3hbMl0gfHwgcG9zWSA8IHZpZXdCb3hbMV0gfHwgcG9zWSA+IHZpZXdCb3hbM10pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCF0ZXh0U3RhdGUuZm9udCB8fCAhdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0pIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbGFzdFBvc1ggPSB0ZXh0Q29udGVudEl0ZW0ucHJldlRyYW5zZm9ybVs0XTsKICAgICAgbGV0IGxhc3RQb3NZID0gdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm1bNV07CiAgICAgIGlmIChsYXN0UG9zWCA9PT0gcG9zWCAmJiBsYXN0UG9zWSA9PT0gcG9zWSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCByb3RhdGUgPSAtMTsKICAgICAgaWYgKGN1cnJlbnRUcmFuc2Zvcm1bMF0gJiYgY3VycmVudFRyYW5zZm9ybVsxXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzJdID09PSAwKSB7CiAgICAgICAgcm90YXRlID0gY3VycmVudFRyYW5zZm9ybVswXSA+IDAgPyAwIDogMTgwOwogICAgICB9IGVsc2UgaWYgKGN1cnJlbnRUcmFuc2Zvcm1bMV0gJiYgY3VycmVudFRyYW5zZm9ybVswXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzNdID09PSAwKSB7CiAgICAgICAgcm90YXRlID0gY3VycmVudFRyYW5zZm9ybVsxXSA+IDAgPyA5MCA6IDI3MDsKICAgICAgfQogICAgICBzd2l0Y2ggKHJvdGF0ZSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgOTA6CiAgICAgICAgICBbcG9zWCwgcG9zWV0gPSBbcG9zWSwgcG9zWF07CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFtsYXN0UG9zWSwgbGFzdFBvc1hdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICBbcG9zWCwgcG9zWSwgbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFstcG9zWCwgLXBvc1ksIC1sYXN0UG9zWCwgLWxhc3RQb3NZXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjcwOgogICAgICAgICAgW3Bvc1gsIHBvc1ldID0gWy1wb3NZLCAtcG9zWF07CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFstbGFzdFBvc1ksIC1sYXN0UG9zWF07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgW3Bvc1gsIHBvc1ldID0gYXBwbHlJbnZlcnNlUm90YXRpb24ocG9zWCwgcG9zWSwgY3VycmVudFRyYW5zZm9ybSk7CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IGFwcGx5SW52ZXJzZVJvdGF0aW9uKGxhc3RQb3NYLCBsYXN0UG9zWSwgdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0pOwogICAgICB9CiAgICAgIGlmICh0ZXh0U3RhdGUuZm9udC52ZXJ0aWNhbCkgewogICAgICAgIGNvbnN0IGFkdmFuY2VZID0gKGxhc3RQb3NZIC0gcG9zWSkgLyB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgICBjb25zdCBhZHZhbmNlWCA9IHBvc1ggLSBsYXN0UG9zWDsKICAgICAgICBjb25zdCB0ZXh0T3JpZW50YXRpb24gPSBNYXRoLnNpZ24odGV4dENvbnRlbnRJdGVtLmhlaWdodCk7CiAgICAgICAgaWYgKGFkdmFuY2VZIDwgdGV4dE9yaWVudGF0aW9uICogdGV4dENvbnRlbnRJdGVtLm5lZ2F0aXZlU3BhY2VNYXgpIHsKICAgICAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWCkgPiAwLjUgKiB0ZXh0Q29udGVudEl0ZW0ud2lkdGgpIHsKICAgICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKE1hdGguYWJzKGFkdmFuY2VYKSA+IHRleHRDb250ZW50SXRlbS53aWR0aCkgewogICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGFkdmFuY2VZIDw9IHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5ub3RBU3BhY2UpIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgfQogICAgICAgIGlmIChhZHZhbmNlWSA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0udHJhY2tpbmdTcGFjZU1pbikgewogICAgICAgICAgaWYgKHNob3VsZEFkZFdoaXRlcHNhY2UoKSkgewogICAgICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICBwdXNoV2hpdGVzcGFjZSh7CiAgICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhhZHZhbmNlWSkKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICs9IGFkdmFuY2VZOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIWFkZEZha2VTcGFjZXMoYWR2YW5jZVksIHRleHRDb250ZW50SXRlbS5wcmV2VHJhbnNmb3JtLCB0ZXh0T3JpZW50YXRpb24pKSB7CiAgICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLnN0ci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgICAgICAgIGhlaWdodDogTWF0aC5hYnMoYWR2YW5jZVkpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPSBhZHZhbmNlWTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKE1hdGguYWJzKGFkdmFuY2VYKSA+IHRleHRDb250ZW50SXRlbS53aWR0aCAqIFZFUlRJQ0FMX1NISUZUX1JBVElPKSB7CiAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBjb25zdCBhZHZhbmNlWCA9IChwb3NYIC0gbGFzdFBvc1gpIC8gdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgIGNvbnN0IGFkdmFuY2VZID0gcG9zWSAtIGxhc3RQb3NZOwogICAgICBjb25zdCB0ZXh0T3JpZW50YXRpb24gPSBNYXRoLnNpZ24odGV4dENvbnRlbnRJdGVtLndpZHRoKTsKICAgICAgaWYgKGFkdmFuY2VYIDwgdGV4dE9yaWVudGF0aW9uICogdGV4dENvbnRlbnRJdGVtLm5lZ2F0aXZlU3BhY2VNYXgpIHsKICAgICAgICBpZiAoTWF0aC5hYnMoYWR2YW5jZVkpID4gMC41ICogdGV4dENvbnRlbnRJdGVtLmhlaWdodCkgewogICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWSkgPiB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0KSB7CiAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGFkdmFuY2VYIDw9IHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5ub3RBU3BhY2UpIHsKICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICB9CiAgICAgIGlmIChhZHZhbmNlWCA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0udHJhY2tpbmdTcGFjZU1pbikgewogICAgICAgIGlmIChzaG91bGRBZGRXaGl0ZXBzYWNlKCkpIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgICAgICB3aWR0aDogTWF0aC5hYnMoYWR2YW5jZVgpCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoICs9IGFkdmFuY2VYOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghYWRkRmFrZVNwYWNlcyhhZHZhbmNlWCwgdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0sIHRleHRPcmllbnRhdGlvbikpIHsKICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLnN0ci5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgICBwdXNoV2hpdGVzcGFjZSh7CiAgICAgICAgICAgIHdpZHRoOiBNYXRoLmFicyhhZHZhbmNlWCkKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKz0gYWR2YW5jZVg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWSkgPiB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICogVkVSVElDQUxfU0hJRlRfUkFUSU8pIHsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYnVpbGRUZXh0Q29udGVudEl0ZW0oewogICAgICBjaGFycywKICAgICAgZXh0cmFTcGFjaW5nCiAgICB9KSB7CiAgICAgIGNvbnN0IGZvbnQgPSB0ZXh0U3RhdGUuZm9udDsKICAgICAgaWYgKCFjaGFycykgewogICAgICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gdGV4dFN0YXRlLmNoYXJTcGFjaW5nICsgZXh0cmFTcGFjaW5nOwogICAgICAgIGlmIChjaGFyU3BhY2luZykgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KGNoYXJTcGFjaW5nICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwgLWNoYXJTcGFjaW5nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGtlZXBXaGl0ZVNwYWNlKSB7CiAgICAgICAgICBjb21wYXJlV2l0aExhc3RQb3NpdGlvbigwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7CiAgICAgIGNvbnN0IHNjYWxlID0gdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF0gKiB0ZXh0U3RhdGUuZm9udFNpemU7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGdseXBocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgZ2x5cGggPSBnbHlwaHNbaV07CiAgICAgICAgY29uc3QgewogICAgICAgICAgY2F0ZWdvcnkKICAgICAgICB9ID0gZ2x5cGg7CiAgICAgICAgaWYgKGNhdGVnb3J5LmlzSW52aXNpYmxlRm9ybWF0TWFyaykgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCBjaGFyU3BhY2luZyA9IHRleHRTdGF0ZS5jaGFyU3BhY2luZyArIChpICsgMSA9PT0gaWkgPyBleHRyYVNwYWNpbmcgOiAwKTsKICAgICAgICBsZXQgZ2x5cGhXaWR0aCA9IGdseXBoLndpZHRoOwogICAgICAgIGlmIChmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICBnbHlwaFdpZHRoID0gZ2x5cGgudm1ldHJpYyA/IGdseXBoLnZtZXRyaWNbMF0gOiAtZ2x5cGhXaWR0aDsKICAgICAgICB9CiAgICAgICAgbGV0IHNjYWxlZERpbSA9IGdseXBoV2lkdGggKiBzY2FsZTsKICAgICAgICBpZiAoIWtlZXBXaGl0ZVNwYWNlICYmIGNhdGVnb3J5LmlzV2hpdGVzcGFjZSkgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIGNoYXJTcGFjaW5nICs9IHNjYWxlZERpbSArIHRleHRTdGF0ZS53b3JkU3BhY2luZzsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoY2hhclNwYWNpbmcgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZSwgMCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGFyU3BhY2luZyArPSAtc2NhbGVkRGltICsgdGV4dFN0YXRlLndvcmRTcGFjaW5nOwogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCAtY2hhclNwYWNpbmcpOwogICAgICAgICAgfQogICAgICAgICAgc2F2ZUxhc3RDaGFyKCIgIik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFjYXRlZ29yeS5pc1plcm9XaWR0aERpYWNyaXRpYyAmJiAhY29tcGFyZVdpdGhMYXN0UG9zaXRpb24oc2NhbGVkRGltKSkgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KHNjYWxlZERpbSAqIHRleHRTdGF0ZS50ZXh0SFNjYWxlLCAwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KDAsIHNjYWxlZERpbSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdGV4dENodW5rID0gZW5zdXJlVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgaWYgKGNhdGVnb3J5LmlzWmVyb1dpZHRoRGlhY3JpdGljKSB7CiAgICAgICAgICBzY2FsZWREaW0gPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKICAgICAgICAgIHNjYWxlZERpbSAqPSB0ZXh0U3RhdGUudGV4dEhTY2FsZTsKICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KHNjYWxlZERpbSwgMCk7CiAgICAgICAgICB0ZXh0Q2h1bmsud2lkdGggKz0gc2NhbGVkRGltOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCBzY2FsZWREaW0pOwogICAgICAgICAgc2NhbGVkRGltID0gTWF0aC5hYnMoc2NhbGVkRGltKTsKICAgICAgICAgIHRleHRDaHVuay5oZWlnaHQgKz0gc2NhbGVkRGltOwogICAgICAgIH0KICAgICAgICBpZiAoc2NhbGVkRGltKSB7CiAgICAgICAgICB0ZXh0Q2h1bmsucHJldlRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdseXBoVW5pY29kZSA9IGdseXBoLnVuaWNvZGU7CiAgICAgICAgaWYgKHNhdmVMYXN0Q2hhcihnbHlwaFVuaWNvZGUpKSB7CiAgICAgICAgICB0ZXh0Q2h1bmsuc3RyLnB1c2goIiAiKTsKICAgICAgICB9CiAgICAgICAgdGV4dENodW5rLnN0ci5wdXNoKGdseXBoVW5pY29kZSk7CiAgICAgICAgaWYgKGNoYXJTcGFjaW5nKSB7CiAgICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoY2hhclNwYWNpbmcgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZSwgMCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCAtY2hhclNwYWNpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYXBwZW5kRU9MKCkgewogICAgICByZXNldExhc3RDaGFycygpOwogICAgICBpZiAodGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhhc0VPTCA9IHRydWU7CiAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKHsKICAgICAgICAgIHN0cjogIiIsCiAgICAgICAgICBkaXI6ICJsdHIiLAogICAgICAgICAgd2lkdGg6IDAsCiAgICAgICAgICBoZWlnaHQ6IDAsCiAgICAgICAgICB0cmFuc2Zvcm06IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCksCiAgICAgICAgICBmb250TmFtZTogdGV4dFN0YXRlLmxvYWRlZE5hbWUsCiAgICAgICAgICBoYXNFT0w6IHRydWUKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWRkRmFrZVNwYWNlcyh3aWR0aCwgdHJhbnNmLCB0ZXh0T3JpZW50YXRpb24pIHsKICAgICAgaWYgKHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5zcGFjZUluRmxvd01pbiA8PSB3aWR0aCAmJiB3aWR0aCA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0uc3BhY2VJbkZsb3dNYXgpIHsKICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7CiAgICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICAgICAgdGV4dENvbnRlbnRJdGVtLnN0ci5wdXNoKCIgIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBmb250TmFtZSA9IHRleHRDb250ZW50SXRlbS5mb250TmFtZTsKICAgICAgbGV0IGhlaWdodCA9IDA7CiAgICAgIGlmICh0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHsKICAgICAgICBoZWlnaHQgPSB3aWR0aDsKICAgICAgICB3aWR0aCA9IDA7CiAgICAgIH0KICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgIHdpZHRoOiBNYXRoLmFicyh3aWR0aCksCiAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhoZWlnaHQpLAogICAgICAgIHRyYW5zZm9ybTogdHJhbnNmIHx8IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCksCiAgICAgICAgZm9udE5hbWUKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gZmx1c2hUZXh0Q29udGVudEl0ZW0oKSB7CiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkIHx8ICF0ZXh0Q29udGVudEl0ZW0uc3RyKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsKSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRvdGFsV2lkdGggKz0gdGV4dENvbnRlbnRJdGVtLndpZHRoICogdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ICs9IHRleHRDb250ZW50SXRlbS5oZWlnaHQgKiB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgfQogICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKHJ1bkJpZGlUcmFuc2Zvcm0odGV4dENvbnRlbnRJdGVtKSk7CiAgICAgIHRleHRDb250ZW50SXRlbS5pbml0aWFsaXplZCA9IGZhbHNlOwogICAgICB0ZXh0Q29udGVudEl0ZW0uc3RyLmxlbmd0aCA9IDA7CiAgICB9CiAgICBmdW5jdGlvbiBlbnF1ZXVlQ2h1bmsoYmF0Y2ggPSBmYWxzZSkgewogICAgICBjb25zdCBsZW5ndGggPSB0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGg7CiAgICAgIGlmIChsZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGJhdGNoICYmIGxlbmd0aCA8IFRFWFRfQ0hVTktfQkFUQ0hfU0laRSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBzaW5rLmVucXVldWUodGV4dENvbnRlbnQsIGxlbmd0aCk7CiAgICAgIHRleHRDb250ZW50Lml0ZW1zID0gW107CiAgICAgIHRleHRDb250ZW50LnN0eWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB9CiAgICBjb25zdCB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkgewogICAgICAgIGVucXVldWVDaHVuayh0cnVlKTsKICAgICAgICBQcm9taXNlLmFsbChbcHJvbWlzZSwgc2luay5yZWFkeV0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIHJlamVjdChleCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgfTsKICAgICAgdGFzay5lbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgIHRpbWVTbG90TWFuYWdlci5yZXNldCgpOwogICAgICBjb25zdCBvcGVyYXRpb24gPSB7fTsKICAgICAgbGV0IHN0b3AsCiAgICAgICAgbmFtZSwKICAgICAgICBpc1ZhbGlkTmFtZSwKICAgICAgICBhcmdzID0gW107CiAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHsKICAgICAgICBhcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBhcmdzOwogICAgICAgIGlmICghcHJlcHJvY2Vzc29yLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSB0ZXh0U3RhdGU7CiAgICAgICAgdGV4dFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlOwogICAgICAgIGNvbnN0IGZuID0gb3BlcmF0aW9uLmZuOwogICAgICAgIGFyZ3MgPSBvcGVyYXRpb24uYXJnczsKICAgICAgICBzd2l0Y2ggKGZuIHwgMCkgewogICAgICAgICAgY2FzZSBPUFMuc2V0Rm9udDoKICAgICAgICAgICAgY29uc3QgZm9udE5hbWVBcmcgPSBhcmdzWzBdLm5hbWUsCiAgICAgICAgICAgICAgZm9udFNpemVBcmcgPSBhcmdzWzFdOwogICAgICAgICAgICBpZiAodGV4dFN0YXRlLmZvbnQgJiYgZm9udE5hbWVBcmcgPT09IHRleHRTdGF0ZS5mb250TmFtZSAmJiBmb250U2l6ZUFyZyA9PT0gdGV4dFN0YXRlLmZvbnRTaXplKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnROYW1lID0gZm9udE5hbWVBcmc7CiAgICAgICAgICAgIHRleHRTdGF0ZS5mb250U2l6ZSA9IGZvbnRTaXplQXJnOwogICAgICAgICAgICBuZXh0KGhhbmRsZVNldEZvbnQoZm9udE5hbWVBcmcsIG51bGwpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dFJpc2U6CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0UmlzZSA9IGFyZ3NbMF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0SFNjYWxlOgogICAgICAgICAgICB0ZXh0U3RhdGUudGV4dEhTY2FsZSA9IGFyZ3NbMF0gLyAxMDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0TGVhZGluZzoKICAgICAgICAgICAgdGV4dFN0YXRlLmxlYWRpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLm1vdmVUZXh0OgogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSk7CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TWF0cml4ID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0TGVhZGluZ01vdmVUZXh0OgogICAgICAgICAgICB0ZXh0U3RhdGUubGVhZGluZyA9IC1hcmdzWzFdOwogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSk7CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TWF0cml4ID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmU6CiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFRleHRNYXRyaXg6CiAgICAgICAgICAgIHRleHRTdGF0ZS5zZXRUZXh0TWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOwogICAgICAgICAgICB0ZXh0U3RhdGUuc2V0VGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7CiAgICAgICAgICAgIHVwZGF0ZUFkdmFuY2VTY2FsZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldENoYXJTcGFjaW5nOgogICAgICAgICAgICB0ZXh0U3RhdGUuY2hhclNwYWNpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFdvcmRTcGFjaW5nOgogICAgICAgICAgICB0ZXh0U3RhdGUud29yZFNwYWNpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLmJlZ2luVGV4dDoKICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSBJREVOVElUWV9NQVRSSVguc2xpY2UoKTsKICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4ID0gSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1NwYWNlZFRleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHNwYWNlRmFjdG9yID0gKHRleHRTdGF0ZS5mb250LnZlcnRpY2FsID8gMSA6IC0xKSAqIHRleHRTdGF0ZS5mb250U2l6ZSAvIDEwMDA7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXJnc1swXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50c1tpXTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICBzaG93U3BhY2VkVGV4dEJ1ZmZlci5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09ICJudW1iZXIiICYmIGl0ZW0gIT09IDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IHNob3dTcGFjZWRUZXh0QnVmZmVyLmpvaW4oIiIpOwogICAgICAgICAgICAgICAgc2hvd1NwYWNlZFRleHRCdWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICAgICAgY2hhcnM6IHN0ciwKICAgICAgICAgICAgICAgICAgZXh0cmFTcGFjaW5nOiBpdGVtICogc3BhY2VGYWN0b3IKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2hvd1NwYWNlZFRleHRCdWZmZXIubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGNvbnN0IHN0ciA9IHNob3dTcGFjZWRUZXh0QnVmZmVyLmpvaW4oIiIpOwogICAgICAgICAgICAgIHNob3dTcGFjZWRUZXh0QnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgYnVpbGRUZXh0Q29udGVudEl0ZW0oewogICAgICAgICAgICAgICAgY2hhcnM6IHN0ciwKICAgICAgICAgICAgICAgIGV4dHJhU3BhY2luZzogMAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICBjaGFyczogYXJnc1swXSwKICAgICAgICAgICAgICBleHRyYVNwYWNpbmc6IDAKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTaG93VGV4dDoKICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgewogICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGV4dFN0YXRlLmNhcnJpYWdlUmV0dXJuKCk7CiAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICBjaGFyczogYXJnc1swXSwKICAgICAgICAgICAgICBleHRyYVNwYWNpbmc6IDAKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRleHRTdGF0ZS53b3JkU3BhY2luZyA9IGFyZ3NbMF07CiAgICAgICAgICAgIHRleHRTdGF0ZS5jaGFyU3BhY2luZyA9IGFyZ3NbMV07CiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOwogICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbSh7CiAgICAgICAgICAgICAgY2hhcnM6IGFyZ3NbMl0sCiAgICAgICAgICAgICAgZXh0cmFTcGFjaW5nOiAwCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnBhaW50WE9iamVjdDoKICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgeG9ianMgPz89IHJlc291cmNlcy5nZXQoIlhPYmplY3QiKSB8fCBEaWN0LmVtcHR5OwogICAgICAgICAgICBpc1ZhbGlkTmFtZSA9IGFyZ3NbMF0gaW5zdGFuY2VvZiBOYW1lOwogICAgICAgICAgICBuYW1lID0gYXJnc1swXS5uYW1lOwogICAgICAgICAgICBpZiAoaXNWYWxpZE5hbWUgJiYgZW1wdHlYT2JqZWN0Q2FjaGUuZ2V0QnlOYW1lKG5hbWUpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpIHsKICAgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3QgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsZXQgeG9iaiA9IHhvYmpzLmdldFJhdyhuYW1lKTsKICAgICAgICAgICAgICBpZiAoeG9iaiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgaWYgKGVtcHR5WE9iamVjdENhY2hlLmdldEJ5UmVmKHhvYmopKSB7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbEltYWdlID0gc2VsZi5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoeG9iaiwgc2VsZi5wYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGdsb2JhbEltYWdlKSB7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHhvYmogPSB4cmVmLmZldGNoKHhvYmopOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoISh4b2JqIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgYmUgYSBzdHJlYW0iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHhvYmouZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgICAgICAgICBpZiAoISh0eXBlIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodHlwZS5uYW1lICE9PSAiRm9ybSIpIHsKICAgICAgICAgICAgICAgIGVtcHR5WE9iamVjdENhY2hlLnNldChuYW1lLCB4b2JqLmRpY3Qub2JqSWQsIHRydWUpOwogICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKCk7CiAgICAgICAgICAgICAgY29uc3QgeE9ialN0YXRlTWFuYWdlciA9IG5ldyBTdGF0ZU1hbmFnZXIoY3VycmVudFN0YXRlKTsKICAgICAgICAgICAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoeG9iai5kaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgbnVsbCk7CiAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgewogICAgICAgICAgICAgICAgeE9ialN0YXRlTWFuYWdlci50cmFuc2Zvcm0obWF0cml4KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZW5xdWV1ZUNodW5rKCk7CiAgICAgICAgICAgICAgY29uc3Qgc2lua1dyYXBwZXIgPSB7CiAgICAgICAgICAgICAgICBlbnF1ZXVlSW52b2tlZDogZmFsc2UsCiAgICAgICAgICAgICAgICBlbnF1ZXVlKGNodW5rLCBzaXplKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuZW5xdWV1ZUludm9rZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICBzaW5rLmVucXVldWUoY2h1bmssIHNpemUpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldCBkZXNpcmVkU2l6ZSgpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbmsuZGVzaXJlZFNpemU7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0IHJlYWR5KCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHNlbGYuZ2V0VGV4dENvbnRlbnQoewogICAgICAgICAgICAgICAgc3RyZWFtOiB4b2JqLAogICAgICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgICAgIHJlc291cmNlczogeG9iai5kaWN0LmdldCgiUmVzb3VyY2VzIikgfHwgcmVzb3VyY2VzLAogICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyOiB4T2JqU3RhdGVNYW5hZ2VyLAogICAgICAgICAgICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICAgICAgICAgICAgICBzaW5rOiBzaW5rV3JhcHBlciwKICAgICAgICAgICAgICAgIHNlZW5TdHlsZXMsCiAgICAgICAgICAgICAgICB2aWV3Qm94LAogICAgICAgICAgICAgICAgbGFuZywKICAgICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLAogICAgICAgICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24sCiAgICAgICAgICAgICAgICBrZWVwV2hpdGVTcGFjZQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCFzaW5rV3JhcHBlci5lbnF1ZXVlSW52b2tlZCkgewogICAgICAgICAgICAgICAgICBlbXB0eVhPYmplY3RDYWNoZS5zZXQobmFtZSwgeG9iai5kaWN0Lm9iaklkLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgICAgICAgIHdhcm4oYGdldFRleHRDb250ZW50IC0gaWdub3JpbmcgWE9iamVjdDogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlIE9QUy5zZXRHU3RhdGU6CiAgICAgICAgICAgIGlzVmFsaWROYW1lID0gYXJnc1swXSBpbnN0YW5jZW9mIE5hbWU7CiAgICAgICAgICAgIG5hbWUgPSBhcmdzWzBdLm5hbWU7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkTmFtZSAmJiBlbXB0eUdTdGF0ZUNhY2hlLmdldEJ5TmFtZShuYW1lKSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSkgewogICAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgZXh0R1N0YXRlID0gcmVzb3VyY2VzLmdldCgiRXh0R1N0YXRlIik7CiAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CiAgICAgICAgICAgICAgaWYgKCEoZ1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZUZvbnQgPSBnU3RhdGUuZ2V0KCJGb250Iik7CiAgICAgICAgICAgICAgaWYgKCFnU3RhdGVGb250KSB7CiAgICAgICAgICAgICAgICBlbXB0eUdTdGF0ZUNhY2hlLnNldChuYW1lLCBnU3RhdGUub2JqSWQsIHRydWUpOwogICAgICAgICAgICAgICAgcmVzb2x2ZUdTdGF0ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICAgIHRleHRTdGF0ZS5mb250TmFtZSA9IG51bGw7CiAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnRTaXplID0gZ1N0YXRlRm9udFsxXTsKICAgICAgICAgICAgICBoYW5kbGVTZXRGb250KG51bGwsIGdTdGF0ZUZvbnRbMF0pLnRoZW4ocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgd2FybihgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuYmVnaW5NYXJrZWRDb250ZW50OgogICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICBpZiAoaW5jbHVkZU1hcmtlZENvbnRlbnQpIHsKICAgICAgICAgICAgICBtYXJrZWRDb250ZW50RGF0YS5sZXZlbCsrOwogICAgICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTogImJlZ2luTWFya2VkQ29udGVudCIsCiAgICAgICAgICAgICAgICB0YWc6IGFyZ3NbMF0gaW5zdGFuY2VvZiBOYW1lID8gYXJnc1swXS5uYW1lIDogbnVsbAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLmxldmVsKys7CiAgICAgICAgICAgICAgbGV0IG1jaWQgPSBudWxsOwogICAgICAgICAgICAgIGlmIChhcmdzWzFdIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICAgICAgbWNpZCA9IGFyZ3NbMV0uZ2V0KCJNQ0lEIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTogImJlZ2luTWFya2VkQ29udGVudFByb3BzIiwKICAgICAgICAgICAgICAgIGlkOiBOdW1iZXIuaXNJbnRlZ2VyKG1jaWQpID8gYCR7c2VsZi5pZEZhY3RvcnkuZ2V0UGFnZU9iaklkKCl9X21jJHttY2lkfWAgOiBudWxsLAogICAgICAgICAgICAgICAgdGFnOiBhcmdzWzBdIGluc3RhbmNlb2YgTmFtZSA/IGFyZ3NbMF0ubmFtZSA6IG51bGwKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLmVuZE1hcmtlZENvbnRlbnQ6CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICAgICAgICAgIGlmIChtYXJrZWRDb250ZW50RGF0YS5sZXZlbCA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLmxldmVsLS07CiAgICAgICAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZW5kTWFya2VkQ29udGVudCIKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnJlc3RvcmU6CiAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXRlICYmIChwcmV2aW91c1N0YXRlLmZvbnQgIT09IHRleHRTdGF0ZS5mb250IHx8IHByZXZpb3VzU3RhdGUuZm9udFNpemUgIT09IHRleHRTdGF0ZS5mb250U2l6ZSB8fCBwcmV2aW91c1N0YXRlLmZvbnROYW1lICE9PSB0ZXh0U3RhdGUuZm9udE5hbWUpKSB7CiAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRleHRDb250ZW50Lml0ZW1zLmxlbmd0aCA+PSBzaW5rLmRlc2lyZWRTaXplKSB7CiAgICAgICAgICBzdG9wID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc3RvcCkgewogICAgICAgIG5leHQoZGVmZXJyZWQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICBlbnF1ZXVlQ2h1bmsoKTsKICAgICAgcmVzb2x2ZSgpOwogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2FybihgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nICIke3Rhc2submFtZX0iIGAgKyBgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICBlbnF1ZXVlQ2h1bmsoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGFzeW5jIGV4dHJhY3REYXRhU3RydWN0dXJlcyhkaWN0LCBwcm9wZXJ0aWVzKSB7CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOwogICAgbGV0IGNpZFRvR2lkQnl0ZXM7CiAgICBjb25zdCB0b1VuaWNvZGVQcm9taXNlID0gdGhpcy5yZWFkVG9Vbmljb2RlKHByb3BlcnRpZXMudG9Vbmljb2RlKTsKICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICBjb25zdCBjaWRTeXN0ZW1JbmZvID0gZGljdC5nZXQoIkNJRFN5c3RlbUluZm8iKTsKICAgICAgaWYgKGNpZFN5c3RlbUluZm8gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvID0gewogICAgICAgICAgcmVnaXN0cnk6IHN0cmluZ1RvUERGU3RyaW5nKGNpZFN5c3RlbUluZm8uZ2V0KCJSZWdpc3RyeSIpKSwKICAgICAgICAgIG9yZGVyaW5nOiBzdHJpbmdUb1BERlN0cmluZyhjaWRTeXN0ZW1JbmZvLmdldCgiT3JkZXJpbmciKSksCiAgICAgICAgICBzdXBwbGVtZW50OiBjaWRTeXN0ZW1JbmZvLmdldCgiU3VwcGxlbWVudCIpCiAgICAgICAgfTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIGNvbnN0IGNpZFRvR2lkTWFwID0gZGljdC5nZXQoIkNJRFRvR0lETWFwIik7CiAgICAgICAgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgICAgY2lkVG9HaWRCeXRlcyA9IGNpZFRvR2lkTWFwLmdldEJ5dGVzKCk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgfQogICAgICAgIHdhcm4oYGV4dHJhY3REYXRhU3RydWN0dXJlcyAtIGlnbm9yaW5nIENJRFRvR0lETWFwIGRhdGE6ICIke2V4fSIuYCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRpZmZlcmVuY2VzID0gW107CiAgICBsZXQgYmFzZUVuY29kaW5nTmFtZSA9IG51bGw7CiAgICBsZXQgZW5jb2Rpbmc7CiAgICBpZiAoZGljdC5oYXMoIkVuY29kaW5nIikpIHsKICAgICAgZW5jb2RpbmcgPSBkaWN0LmdldCgiRW5jb2RpbmciKTsKICAgICAgaWYgKGVuY29kaW5nIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBlbmNvZGluZy5nZXQoIkJhc2VFbmNvZGluZyIpOwogICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBiYXNlRW5jb2RpbmdOYW1lIGluc3RhbmNlb2YgTmFtZSA/IGJhc2VFbmNvZGluZ05hbWUubmFtZSA6IG51bGw7CiAgICAgICAgaWYgKGVuY29kaW5nLmhhcygiRGlmZmVyZW5jZXMiKSkgewogICAgICAgICAgY29uc3QgZGlmZkVuY29kaW5nID0gZW5jb2RpbmcuZ2V0KCJEaWZmZXJlbmNlcyIpOwogICAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZGlmZkVuY29kaW5nKSB7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB4cmVmLmZldGNoSWZSZWYoZW50cnkpOwogICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgaW5kZXggPSBkYXRhOwogICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgICAgZGlmZmVyZW5jZXNbaW5kZXgrK10gPSBkYXRhLm5hbWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGVudHJ5IGluICdEaWZmZXJlbmNlcycgYXJyYXk6ICR7ZGF0YX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gZW5jb2RpbmcubmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBtc2cgPSAiRW5jb2RpbmcgaXMgbm90IGEgTmFtZSBub3IgYSBEaWN0IjsKICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihtc2cpOwogICAgICAgIH0KICAgICAgICB3YXJuKG1zZyk7CiAgICAgIH0KICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgIT09ICJNYWNSb21hbkVuY29kaW5nIiAmJiBiYXNlRW5jb2RpbmdOYW1lICE9PSAiTWFjRXhwZXJ0RW5jb2RpbmciICYmIGJhc2VFbmNvZGluZ05hbWUgIT09ICJXaW5BbnNpRW5jb2RpbmciKSB7CiAgICAgICAgYmFzZUVuY29kaW5nTmFtZSA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG5vbkVtYmVkZGVkRm9udCA9ICFwcm9wZXJ0aWVzLmZpbGUgfHwgcHJvcGVydGllcy5pc0ludGVybmFsRm9udCwKICAgICAgaXNTeW1ib2xzRm9udE5hbWUgPSBnZXRTeW1ib2xzRm9udHMoKVtwcm9wZXJ0aWVzLm5hbWVdOwogICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgJiYgbm9uRW1iZWRkZWRGb250ICYmIGlzU3ltYm9sc0ZvbnROYW1lKSB7CiAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBudWxsOwogICAgfQogICAgaWYgKGJhc2VFbmNvZGluZ05hbWUpIHsKICAgICAgcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcgPSBnZXRFbmNvZGluZyhiYXNlRW5jb2RpbmdOYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CiAgICAgIGNvbnN0IGlzTm9uc3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5Ob25zeW1ib2xpYyk7CiAgICAgIGVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZzsKICAgICAgaWYgKHByb3BlcnRpZXMudHlwZSA9PT0gIlRydWVUeXBlIiAmJiAhaXNOb25zeW1ib2xpY0ZvbnQpIHsKICAgICAgICBlbmNvZGluZyA9IFdpbkFuc2lFbmNvZGluZzsKICAgICAgfQogICAgICBpZiAoaXNTeW1ib2xpY0ZvbnQgfHwgaXNTeW1ib2xzRm9udE5hbWUpIHsKICAgICAgICBlbmNvZGluZyA9IE1hY1JvbWFuRW5jb2Rpbmc7CiAgICAgICAgaWYgKG5vbkVtYmVkZGVkRm9udCkgewogICAgICAgICAgaWYgKC9TeW1ib2wvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBTeW1ib2xTZXRFbmNvZGluZzsKICAgICAgICAgIH0gZWxzZSBpZiAoL0RpbmdiYXRzL2kudGVzdChwcm9wZXJ0aWVzLm5hbWUpKSB7CiAgICAgICAgICAgIGVuY29kaW5nID0gWmFwZkRpbmdiYXRzRW5jb2Rpbmc7CiAgICAgICAgICB9IGVsc2UgaWYgKC9XaW5nZGluZ3MvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBXaW5BbnNpRW5jb2Rpbmc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7CiAgICB9CiAgICBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzID0gZGlmZmVyZW5jZXM7CiAgICBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPSBiYXNlRW5jb2RpbmdOYW1lOwogICAgcHJvcGVydGllcy5oYXNFbmNvZGluZyA9ICEhYmFzZUVuY29kaW5nTmFtZSB8fCBkaWZmZXJlbmNlcy5sZW5ndGggPiAwOwogICAgcHJvcGVydGllcy5kaWN0ID0gZGljdDsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gYXdhaXQgdG9Vbmljb2RlUHJvbWlzZTsKICAgIGNvbnN0IGJ1aWx0VG9Vbmljb2RlID0gYXdhaXQgdGhpcy5idWlsZFRvVW5pY29kZShwcm9wZXJ0aWVzKTsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gYnVpbHRUb1VuaWNvZGU7CiAgICBpZiAoY2lkVG9HaWRCeXRlcykgewogICAgICBwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwID0gdGhpcy5yZWFkQ2lkVG9HaWRNYXAoY2lkVG9HaWRCeXRlcywgYnVpbHRUb1VuaWNvZGUpOwogICAgfQogICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgfQogIF9zaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMsIGZvcmNlR2x5cGhzID0gZmFsc2UpIHsKICAgIGFzc2VydCghcHJvcGVydGllcy5jb21wb3NpdGUsICJNdXN0IGJlIGEgc2ltcGxlIGZvbnQuIik7CiAgICBjb25zdCB0b1VuaWNvZGUgPSBbXTsKICAgIGNvbnN0IGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmcuc2xpY2UoKTsKICAgIGNvbnN0IGJhc2VFbmNvZGluZ05hbWUgPSBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWU7CiAgICBjb25zdCBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CiAgICBmb3IgKGNvbnN0IGNoYXJjb2RlIGluIGRpZmZlcmVuY2VzKSB7CiAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGRpZmZlcmVuY2VzW2NoYXJjb2RlXTsKICAgICAgaWYgKGdseXBoTmFtZSA9PT0gIi5ub3RkZWYiKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZW5jb2RpbmdbY2hhcmNvZGVdID0gZ2x5cGhOYW1lOwogICAgfQogICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICAgIGZvciAoY29uc3QgY2hhcmNvZGUgaW4gZW5jb2RpbmcpIHsKICAgICAgbGV0IGdseXBoTmFtZSA9IGVuY29kaW5nW2NoYXJjb2RlXTsKICAgICAgaWYgKGdseXBoTmFtZSA9PT0gIiIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgdW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXTsKICAgICAgaWYgKHVuaWNvZGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCBjb2RlID0gMDsKICAgICAgc3dpdGNoIChnbHlwaE5hbWVbMF0pIHsKICAgICAgICBjYXNlICJHIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSAzKSB7CiAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSA1KSB7CiAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJDIjoKICAgICAgICBjYXNlICJjIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID49IDMgJiYgZ2x5cGhOYW1lLmxlbmd0aCA8PSA0KSB7CiAgICAgICAgICAgIGNvbnN0IGNvZGVTdHIgPSBnbHlwaE5hbWUuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICBpZiAoZm9yY2VHbHlwaHMpIHsKICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoY29kZVN0ciwgMTYpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvZGUgPSArY29kZVN0cjsKICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihjb2RlKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlSW50KGNvZGVTdHIsIDE2KSkpIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAidSI6CiAgICAgICAgICB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICAgICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgICAgICAgICAgY29kZSA9IHVuaWNvZGU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgc3dpdGNoIChnbHlwaE5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiZl9oIjoKICAgICAgICAgICAgY2FzZSAiZl90IjoKICAgICAgICAgICAgY2FzZSAiVF9oIjoKICAgICAgICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gZ2x5cGhOYW1lLnJlcGxhY2VBbGwoIl8iLCAiIik7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoY29kZSA+IDAgJiYgY29kZSA8PSAweDEwZmZmZiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7CiAgICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgJiYgY29kZSA9PT0gK2NoYXJjb2RlKSB7CiAgICAgICAgICBjb25zdCBiYXNlRW5jb2RpbmcgPSBnZXRFbmNvZGluZyhiYXNlRW5jb2RpbmdOYW1lKTsKICAgICAgICAgIGlmIChiYXNlRW5jb2RpbmcgJiYgKGdseXBoTmFtZSA9IGJhc2VFbmNvZGluZ1tjaGFyY29kZV0pKSB7CiAgICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b1VuaWNvZGU7CiAgfQogIGFzeW5jIGJ1aWxkVG9Vbmljb2RlKHByb3BlcnRpZXMpIHsKICAgIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgPSBwcm9wZXJ0aWVzLnRvVW5pY29kZT8ubGVuZ3RoID4gMDsKICAgIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7CiAgICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUgJiYgcHJvcGVydGllcy5oYXNFbmNvZGluZykgewogICAgICAgIHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGUgPSB0aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMpOwogICAgICB9CiAgICAgIHJldHVybiBwcm9wZXJ0aWVzLnRvVW5pY29kZTsKICAgIH0KICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAodGhpcy5fc2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzKSk7CiAgICB9CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUgJiYgKHByb3BlcnRpZXMuY01hcC5idWlsdEluQ01hcCAmJiAhKHByb3BlcnRpZXMuY01hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkgfHwgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvPy5yZWdpc3RyeSA9PT0gIkFkb2JlIiAmJiAocHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nID09PSAiR0IxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJDTlMxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJKYXBhbjEiIHx8IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gIktvcmVhMSIpKSkgewogICAgICBjb25zdCB7CiAgICAgICAgcmVnaXN0cnksCiAgICAgICAgb3JkZXJpbmcKICAgICAgfSA9IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mbzsKICAgICAgY29uc3QgdWNzMkNNYXBOYW1lID0gTmFtZS5nZXQoYCR7cmVnaXN0cnl9LSR7b3JkZXJpbmd9LVVDUzJgKTsKICAgICAgY29uc3QgdWNzMkNNYXAgPSBhd2FpdCBDTWFwRmFjdG9yeS5jcmVhdGUoewogICAgICAgIGVuY29kaW5nOiB1Y3MyQ01hcE5hbWUsCiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgIHVzZUNNYXA6IG51bGwKICAgICAgfSk7CiAgICAgIGNvbnN0IHRvVW5pY29kZSA9IFtdLAogICAgICAgIGJ1ZiA9IFtdOwogICAgICBwcm9wZXJ0aWVzLmNNYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhcmNvZGUsIGNpZCkgewogICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOwogICAgICAgIH0KICAgICAgICBjb25zdCB1Y3MyID0gdWNzMkNNYXAubG9va3VwKGNpZCk7CiAgICAgICAgaWYgKHVjczIpIHsKICAgICAgICAgIGJ1Zi5sZW5ndGggPSAwOwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdWNzMi5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgICAgIGJ1Zi5wdXNoKCh1Y3MyLmNoYXJDb2RlQXQoaSkgPDwgOCkgKyB1Y3MyLmNoYXJDb2RlQXQoaSArIDEpKTsKICAgICAgICAgIH0KICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAodG9Vbmljb2RlKTsKICAgIH0KICAgIHJldHVybiBuZXcgSWRlbnRpdHlUb1VuaWNvZGVNYXAocHJvcGVydGllcy5maXJzdENoYXIsIHByb3BlcnRpZXMubGFzdENoYXIpOwogIH0KICBhc3luYyByZWFkVG9Vbmljb2RlKGNtYXBPYmopIHsKICAgIGlmICghY21hcE9iaikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChjbWFwT2JqIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBjb25zdCBjbWFwID0gYXdhaXQgQ01hcEZhY3RvcnkuY3JlYXRlKHsKICAgICAgICBlbmNvZGluZzogY21hcE9iaiwKICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsCiAgICAgICAgdXNlQ01hcDogbnVsbAogICAgICB9KTsKICAgICAgaWYgKGNtYXAgaW5zdGFuY2VvZiBJZGVudGl0eUNNYXApIHsKICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5VG9Vbmljb2RlTWFwKDAsIDB4ZmZmZik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAoY21hcC5nZXRNYXAoKSk7CiAgICB9CiAgICBpZiAoY21hcE9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBjbWFwID0gYXdhaXQgQ01hcEZhY3RvcnkuY3JlYXRlKHsKICAgICAgICAgIGVuY29kaW5nOiBjbWFwT2JqLAogICAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgICAgdXNlQ01hcDogbnVsbAogICAgICAgIH0pOwogICAgICAgIGlmIChjbWFwIGluc3RhbmNlb2YgSWRlbnRpdHlDTWFwKSB7CiAgICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5VG9Vbmljb2RlTWFwKDAsIDB4ZmZmZik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hcCA9IG5ldyBBcnJheShjbWFwLmxlbmd0aCk7CiAgICAgICAgY21hcC5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdG9rZW4pIHsKICAgICAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIG1hcFtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludCh0b2tlbik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b2tlbi5sZW5ndGggJSAyICE9PSAwKSB7CiAgICAgICAgICAgIHRva2VuID0gIlx1MDAwMCIgKyB0b2tlbjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0ciA9IFtdOwogICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB0b2tlbi5sZW5ndGg7IGsgKz0gMikgewogICAgICAgICAgICBjb25zdCB3MSA9IHRva2VuLmNoYXJDb2RlQXQoaykgPDwgOCB8IHRva2VuLmNoYXJDb2RlQXQoayArIDEpOwogICAgICAgICAgICBpZiAoKHcxICYgMHhmODAwKSAhPT0gMHhkODAwKSB7CiAgICAgICAgICAgICAgc3RyLnB1c2godzEpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGsgKz0gMjsKICAgICAgICAgICAgY29uc3QgdzIgPSB0b2tlbi5jaGFyQ29kZUF0KGspIDw8IDggfCB0b2tlbi5jaGFyQ29kZUF0KGsgKyAxKTsKICAgICAgICAgICAgc3RyLnB1c2goKCh3MSAmIDB4M2ZmKSA8PCAxMCkgKyAodzIgJiAweDNmZikgKyAweDEwMDAwKTsKICAgICAgICAgIH0KICAgICAgICAgIG1hcFtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5zdHIpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBuZXcgVG9Vbmljb2RlTWFwKG1hcCk7CiAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICB3YXJuKGByZWFkVG9Vbmljb2RlIC0gaWdub3JpbmcgVG9Vbmljb2RlIGRhdGE6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHJlYWRDaWRUb0dpZE1hcChnbHlwaHNEYXRhLCB0b1VuaWNvZGUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgZm9yIChsZXQgaiA9IDAsIGpqID0gZ2x5cGhzRGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIGNvbnN0IGdseXBoSUQgPSBnbHlwaHNEYXRhW2orK10gPDwgOCB8IGdseXBoc0RhdGFbal07CiAgICAgIGNvbnN0IGNvZGUgPSBqID4+IDE7CiAgICAgIGlmIChnbHlwaElEID09PSAwICYmICF0b1VuaWNvZGUuaGFzKGNvZGUpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcmVzdWx0W2NvZGVdID0gZ2x5cGhJRDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGV4dHJhY3RXaWR0aHMoZGljdCwgZGVzY3JpcHRvciwgcHJvcGVydGllcykgewogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGxldCBnbHlwaHNXaWR0aHMgPSBbXTsKICAgIGxldCBkZWZhdWx0V2lkdGggPSAwOwogICAgY29uc3QgZ2x5cGhzVk1ldHJpY3MgPSBbXTsKICAgIGxldCBkZWZhdWx0Vk1ldHJpY3M7CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgY29uc3QgZHcgPSBkaWN0LmdldCgiRFciKTsKICAgICAgZGVmYXVsdFdpZHRoID0gdHlwZW9mIGR3ID09PSAibnVtYmVyIiA/IE1hdGguY2VpbChkdykgOiAxMDAwOwogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiVyIpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheSh3aWR0aHMpKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gd2lkdGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGxldCBzdGFydCA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaSsrXSk7CiAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc3RhcnQpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaV0pOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29kZSkpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvZGUpIHsKICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IHhyZWYuZmV0Y2hJZlJlZihjKTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgZ2x5cGhzV2lkdGhzW3N0YXJ0XSA9IHdpZHRoOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5pc0ludGVnZXIoY29kZSkpIHsKICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzWysraV0pOwogICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoICE9PSAibnVtYmVyIikgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobGV0IGogPSBzdGFydDsgaiA8PSBjb2RlOyBqKyspIHsKICAgICAgICAgICAgICBnbHlwaHNXaWR0aHNbal0gPSB3aWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwcm9wZXJ0aWVzLnZlcnRpY2FsKSB7CiAgICAgICAgY29uc3QgZHcyID0gZGljdC5nZXRBcnJheSgiRFcyIik7CiAgICAgICAgbGV0IHZtZXRyaWNzID0gaXNOdW1iZXJBcnJheShkdzIsIDIpID8gZHcyIDogWzg4MCwgLTEwMDBdOwogICAgICAgIGRlZmF1bHRWTWV0cmljcyA9IFt2bWV0cmljc1sxXSwgZGVmYXVsdFdpZHRoICogMC41LCB2bWV0cmljc1swXV07CiAgICAgICAgdm1ldHJpY3MgPSBkaWN0LmdldCgiVzIiKTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2bWV0cmljcykpIHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZtZXRyaWNzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgbGV0IHN0YXJ0ID0geHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzW2krK10pOwogICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc3RhcnQpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1tpXSk7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvZGUpKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gY29kZS5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgICAgICAgICBjb25zdCB2bWV0cmljID0gW3hyZWYuZmV0Y2hJZlJlZihjb2RlW2orK10pLCB4cmVmLmZldGNoSWZSZWYoY29kZVtqKytdKSwgeHJlZi5mZXRjaElmUmVmKGNvZGVbal0pXTsKICAgICAgICAgICAgICAgIGlmIChpc051bWJlckFycmF5KHZtZXRyaWMsIG51bGwpKSB7CiAgICAgICAgICAgICAgICAgIGdseXBoc1ZNZXRyaWNzW3N0YXJ0XSA9IHZtZXRyaWM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7CiAgICAgICAgICAgICAgY29uc3Qgdm1ldHJpYyA9IFt4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbKytpXSksIHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1srK2ldKSwgeHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzWysraV0pXTsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyQXJyYXkodm1ldHJpYywgbnVsbCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPD0gY29kZTsgaisrKSB7CiAgICAgICAgICAgICAgICBnbHlwaHNWTWV0cmljc1tqXSA9IHZtZXRyaWM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIik7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHdpZHRocykpIHsKICAgICAgICBsZXQgaiA9IHByb3BlcnRpZXMuZmlyc3RDaGFyOwogICAgICAgIGZvciAoY29uc3QgdyBvZiB3aWR0aHMpIHsKICAgICAgICAgIGNvbnN0IHdpZHRoID0geHJlZi5mZXRjaElmUmVmKHcpOwogICAgICAgICAgaWYgKHR5cGVvZiB3aWR0aCA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgZ2x5cGhzV2lkdGhzW2pdID0gd2lkdGg7CiAgICAgICAgICB9CiAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1pc3NpbmdXaWR0aCA9IGRlc2NyaXB0b3IuZ2V0KCJNaXNzaW5nV2lkdGgiKTsKICAgICAgICBkZWZhdWx0V2lkdGggPSB0eXBlb2YgbWlzc2luZ1dpZHRoID09PSAibnVtYmVyIiA/IG1pc3NpbmdXaWR0aCA6IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYmFzZUZvbnROYW1lID0gZGljdC5nZXQoIkJhc2VGb250Iik7CiAgICAgICAgaWYgKGJhc2VGb250TmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUubmFtZSk7CiAgICAgICAgICBnbHlwaHNXaWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBwcm9wZXJ0aWVzKTsKICAgICAgICAgIGRlZmF1bHRXaWR0aCA9IG1ldHJpY3MuZGVmYXVsdFdpZHRoOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgbGV0IGlzTW9ub3NwYWNlID0gdHJ1ZTsKICAgIGxldCBmaXJzdFdpZHRoID0gZGVmYXVsdFdpZHRoOwogICAgZm9yIChjb25zdCBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHsKICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IGdseXBoc1dpZHRoc1tnbHlwaF07CiAgICAgIGlmICghZ2x5cGhXaWR0aCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghZmlyc3RXaWR0aCkgewogICAgICAgIGZpcnN0V2lkdGggPSBnbHlwaFdpZHRoOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChmaXJzdFdpZHRoICE9PSBnbHlwaFdpZHRoKSB7CiAgICAgICAgaXNNb25vc3BhY2UgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGlzTW9ub3NwYWNlKSB7CiAgICAgIHByb3BlcnRpZXMuZmxhZ3MgfD0gRm9udEZsYWdzLkZpeGVkUGl0Y2g7CiAgICB9IGVsc2UgewogICAgICBwcm9wZXJ0aWVzLmZsYWdzICY9IH5Gb250RmxhZ3MuRml4ZWRQaXRjaDsKICAgIH0KICAgIHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoID0gZGVmYXVsdFdpZHRoOwogICAgcHJvcGVydGllcy53aWR0aHMgPSBnbHlwaHNXaWR0aHM7CiAgICBwcm9wZXJ0aWVzLmRlZmF1bHRWTWV0cmljcyA9IGRlZmF1bHRWTWV0cmljczsKICAgIHByb3BlcnRpZXMudm1ldHJpY3MgPSBnbHlwaHNWTWV0cmljczsKICB9CiAgaXNTZXJpZkZvbnQoYmFzZUZvbnROYW1lKSB7CiAgICBjb25zdCBmb250TmFtZVdvU3R5bGUgPSBiYXNlRm9udE5hbWUuc3BsaXQoIi0iLCAxKVswXTsKICAgIHJldHVybiBmb250TmFtZVdvU3R5bGUgaW4gZ2V0U2VyaWZGb250cygpIHx8IC9zZXJpZi9naS50ZXN0KGZvbnROYW1lV29TdHlsZSk7CiAgfQogIGdldEJhc2VGb250TWV0cmljcyhuYW1lKSB7CiAgICBsZXQgZGVmYXVsdFdpZHRoID0gMDsKICAgIGxldCB3aWR0aHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IG1vbm9zcGFjZSA9IGZhbHNlOwogICAgY29uc3Qgc3RkRm9udE1hcCA9IGdldFN0ZEZvbnRNYXAoKTsKICAgIGxldCBsb29rdXBOYW1lID0gc3RkRm9udE1hcFtuYW1lXSB8fCBuYW1lOwogICAgY29uc3QgTWV0cmljcyA9IGdldE1ldHJpY3MoKTsKICAgIGlmICghKGxvb2t1cE5hbWUgaW4gTWV0cmljcykpIHsKICAgICAgbG9va3VwTmFtZSA9IHRoaXMuaXNTZXJpZkZvbnQobmFtZSkgPyAiVGltZXMtUm9tYW4iIDogIkhlbHZldGljYSI7CiAgICB9CiAgICBjb25zdCBnbHlwaFdpZHRocyA9IE1ldHJpY3NbbG9va3VwTmFtZV07CiAgICBpZiAodHlwZW9mIGdseXBoV2lkdGhzID09PSAibnVtYmVyIikgewogICAgICBkZWZhdWx0V2lkdGggPSBnbHlwaFdpZHRoczsKICAgICAgbW9ub3NwYWNlID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHdpZHRocyA9IGdseXBoV2lkdGhzKCk7CiAgICB9CiAgICByZXR1cm4gewogICAgICBkZWZhdWx0V2lkdGgsCiAgICAgIG1vbm9zcGFjZSwKICAgICAgd2lkdGhzCiAgICB9OwogIH0KICBidWlsZENoYXJDb2RlVG9XaWR0aCh3aWR0aHNCeUdseXBoTmFtZSwgcHJvcGVydGllcykgewogICAgY29uc3Qgd2lkdGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IGRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlczsKICAgIGNvbnN0IGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmc7CiAgICBmb3IgKGxldCBjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgMjU2OyBjaGFyQ29kZSsrKSB7CiAgICAgIGlmIChjaGFyQ29kZSBpbiBkaWZmZXJlbmNlcyAmJiB3aWR0aHNCeUdseXBoTmFtZVtkaWZmZXJlbmNlc1tjaGFyQ29kZV1dKSB7CiAgICAgICAgd2lkdGhzW2NoYXJDb2RlXSA9IHdpZHRoc0J5R2x5cGhOYW1lW2RpZmZlcmVuY2VzW2NoYXJDb2RlXV07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGNoYXJDb2RlIGluIGVuY29kaW5nICYmIHdpZHRoc0J5R2x5cGhOYW1lW2VuY29kaW5nW2NoYXJDb2RlXV0pIHsKICAgICAgICB3aWR0aHNbY2hhckNvZGVdID0gd2lkdGhzQnlHbHlwaE5hbWVbZW5jb2RpbmdbY2hhckNvZGVdXTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHdpZHRoczsKICB9CiAgcHJlRXZhbHVhdGVGb250KGRpY3QpIHsKICAgIGNvbnN0IGJhc2VEaWN0ID0gZGljdDsKICAgIGxldCB0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBTdWJ0eXBlIik7CiAgICB9CiAgICBsZXQgY29tcG9zaXRlID0gZmFsc2U7CiAgICBsZXQgaGFzaDsKICAgIGlmICh0eXBlLm5hbWUgPT09ICJUeXBlMCIpIHsKICAgICAgY29uc3QgZGYgPSBkaWN0LmdldCgiRGVzY2VuZGFudEZvbnRzIik7CiAgICAgIGlmICghZGYpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkRlc2NlbmRhbnQgZm9udHMgYXJlIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgfQogICAgICBkaWN0ID0gQXJyYXkuaXNBcnJheShkZikgPyB0aGlzLnhyZWYuZmV0Y2hJZlJlZihkZlswXSkgOiBkZjsKICAgICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJEZXNjZW5kYW50IGZvbnQgaXMgbm90IGEgZGljdGlvbmFyeS4iKTsKICAgICAgfQogICAgICB0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpOwogICAgICB9CiAgICAgIGNvbXBvc2l0ZSA9IHRydWU7CiAgICB9CiAgICBsZXQgZmlyc3RDaGFyID0gZGljdC5nZXQoIkZpcnN0Q2hhciIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0Q2hhcikpIHsKICAgICAgZmlyc3RDaGFyID0gMDsKICAgIH0KICAgIGxldCBsYXN0Q2hhciA9IGRpY3QuZ2V0KCJMYXN0Q2hhciIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGxhc3RDaGFyKSkgewogICAgICBsYXN0Q2hhciA9IGNvbXBvc2l0ZSA/IDB4ZmZmZiA6IDB4ZmY7CiAgICB9CiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGljdC5nZXQoIkZvbnREZXNjcmlwdG9yIik7CiAgICBjb25zdCB0b1VuaWNvZGUgPSBkaWN0LmdldCgiVG9Vbmljb2RlIikgfHwgYmFzZURpY3QuZ2V0KCJUb1VuaWNvZGUiKTsKICAgIGlmIChkZXNjcmlwdG9yKSB7CiAgICAgIGhhc2ggPSBuZXcgTXVybXVySGFzaDNfNjQoKTsKICAgICAgY29uc3QgZW5jb2RpbmcgPSBiYXNlRGljdC5nZXRSYXcoIkVuY29kaW5nIik7CiAgICAgIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBoYXNoLnVwZGF0ZShlbmNvZGluZy5uYW1lKTsKICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGhhc2gudXBkYXRlKGVuY29kaW5nLnRvU3RyaW5nKCkpOwogICAgICB9IGVsc2UgaWYgKGVuY29kaW5nIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW5jb2RpbmcuZ2V0UmF3VmFsdWVzKCkpIHsKICAgICAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgaGFzaC51cGRhdGUoZW50cnkubmFtZSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIGhhc2gudXBkYXRlKGVudHJ5LnRvU3RyaW5nKCkpOwogICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkgewogICAgICAgICAgICBjb25zdCBkaWZmTGVuZ3RoID0gZW50cnkubGVuZ3RoLAogICAgICAgICAgICAgIGRpZmZCdWYgPSBuZXcgQXJyYXkoZGlmZkxlbmd0aCk7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGlmZkxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgY29uc3QgZGlmZkVudHJ5ID0gZW50cnlbal07CiAgICAgICAgICAgICAgaWYgKGRpZmZFbnRyeSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICAgIGRpZmZCdWZbal0gPSBkaWZmRW50cnkubmFtZTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkaWZmRW50cnkgPT09ICJudW1iZXIiIHx8IGRpZmZFbnRyeSBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgZGlmZkJ1ZltqXSA9IGRpZmZFbnRyeS50b1N0cmluZygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBoYXNoLnVwZGF0ZShkaWZmQnVmLmpvaW4oKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhc2gudXBkYXRlKGAke2ZpcnN0Q2hhcn0tJHtsYXN0Q2hhcn1gKTsKICAgICAgaWYgKHRvVW5pY29kZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICBjb25zdCBzdHJlYW0gPSB0b1VuaWNvZGUuc3RyIHx8IHRvVW5pY29kZTsKICAgICAgICBjb25zdCB1aW50OGFycmF5ID0gc3RyZWFtLmJ1ZmZlciA/IG5ldyBVaW50OEFycmF5KHN0cmVhbS5idWZmZXIuYnVmZmVyLCAwLCBzdHJlYW0uYnVmZmVyTGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KHN0cmVhbS5ieXRlcy5idWZmZXIsIHN0cmVhbS5zdGFydCwgc3RyZWFtLmVuZCAtIHN0cmVhbS5zdGFydCk7CiAgICAgICAgaGFzaC51cGRhdGUodWludDhhcnJheSk7CiAgICAgIH0gZWxzZSBpZiAodG9Vbmljb2RlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIGhhc2gudXBkYXRlKHRvVW5pY29kZS5uYW1lKTsKICAgICAgfQogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIikgfHwgYmFzZURpY3QuZ2V0KCJXaWR0aHMiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2lkdGhzKSkgewogICAgICAgIGNvbnN0IHdpZHRoc0J1ZiA9IFtdOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2Ygd2lkdGhzKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAibnVtYmVyIiB8fCBlbnRyeSBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICB3aWR0aHNCdWYucHVzaChlbnRyeS50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaGFzaC51cGRhdGUod2lkdGhzQnVmLmpvaW4oKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbXBvc2l0ZSkgewogICAgICAgIGhhc2gudXBkYXRlKCJjb21wb3NpdGVGb250Iik7CiAgICAgICAgY29uc3QgY29tcG9zaXRlV2lkdGhzID0gZGljdC5nZXQoIlciKSB8fCBiYXNlRGljdC5nZXQoIlciKTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb21wb3NpdGVXaWR0aHMpKSB7CiAgICAgICAgICBjb25zdCB3aWR0aHNCdWYgPSBbXTsKICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY29tcG9zaXRlV2lkdGhzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICJudW1iZXIiIHx8IGVudHJ5IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgICAgd2lkdGhzQnVmLnB1c2goZW50cnkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpIHsKICAgICAgICAgICAgICBjb25zdCBzdWJXaWR0aHNCdWYgPSBbXTsKICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZW50cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gIm51bWJlciIgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgICBzdWJXaWR0aHNCdWYucHVzaChlbGVtZW50LnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB3aWR0aHNCdWYucHVzaChgWyR7c3ViV2lkdGhzQnVmLmpvaW4oKX1dYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGhhc2gudXBkYXRlKHdpZHRoc0J1Zi5qb2luKCkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBjaWRUb0dpZE1hcCA9IGRpY3QuZ2V0UmF3KCJDSURUb0dJRE1hcCIpIHx8IGJhc2VEaWN0LmdldFJhdygiQ0lEVG9HSURNYXAiKTsKICAgICAgICBpZiAoY2lkVG9HaWRNYXAgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICBoYXNoLnVwZGF0ZShjaWRUb0dpZE1hcC5uYW1lKTsKICAgICAgICB9IGVsc2UgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICBoYXNoLnVwZGF0ZShjaWRUb0dpZE1hcC50b1N0cmluZygpKTsKICAgICAgICB9IGVsc2UgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgICAgaGFzaC51cGRhdGUoY2lkVG9HaWRNYXAucGVla0J5dGVzKCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgZGVzY3JpcHRvciwKICAgICAgZGljdCwKICAgICAgYmFzZURpY3QsCiAgICAgIGNvbXBvc2l0ZSwKICAgICAgdHlwZTogdHlwZS5uYW1lLAogICAgICBmaXJzdENoYXIsCiAgICAgIGxhc3RDaGFyLAogICAgICB0b1VuaWNvZGUsCiAgICAgIGhhc2g6IGhhc2ggPyBoYXNoLmhleGRpZ2VzdCgpIDogIiIKICAgIH07CiAgfQogIGFzeW5jIHRyYW5zbGF0ZUZvbnQoewogICAgZGVzY3JpcHRvciwKICAgIGRpY3QsCiAgICBiYXNlRGljdCwKICAgIGNvbXBvc2l0ZSwKICAgIHR5cGUsCiAgICBmaXJzdENoYXIsCiAgICBsYXN0Q2hhciwKICAgIHRvVW5pY29kZSwKICAgIGNzc0ZvbnRJbmZvCiAgfSkgewogICAgY29uc3QgaXNUeXBlM0ZvbnQgPSB0eXBlID09PSAiVHlwZTMiOwogICAgaWYgKCFkZXNjcmlwdG9yKSB7CiAgICAgIGlmIChpc1R5cGUzRm9udCkgewogICAgICAgIGNvbnN0IGJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkZvbnRCQm94IiksIFswLCAwLCAwLCAwXSk7CiAgICAgICAgZGVzY3JpcHRvciA9IG5ldyBEaWN0KG51bGwpOwogICAgICAgIGRlc2NyaXB0b3Iuc2V0KCJGb250TmFtZSIsIE5hbWUuZ2V0KHR5cGUpKTsKICAgICAgICBkZXNjcmlwdG9yLnNldCgiRm9udEJCb3giLCBiYm94KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgYmFzZUZvbnROYW1lID0gZGljdC5nZXQoIkJhc2VGb250Iik7CiAgICAgICAgaWYgKCEoYmFzZUZvbnROYW1lIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFzZSBmb250IGlzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9CiAgICAgICAgYmFzZUZvbnROYW1lID0gYmFzZUZvbnROYW1lLm5hbWUucmVwbGFjZUFsbCgvWyxfXS9nLCAiLSIpOwogICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUpOwogICAgICAgIGNvbnN0IGZvbnROYW1lV29TdHlsZSA9IGJhc2VGb250TmFtZS5zcGxpdCgiLSIsIDEpWzBdOwogICAgICAgIGNvbnN0IGZsYWdzID0gKHRoaXMuaXNTZXJpZkZvbnQoZm9udE5hbWVXb1N0eWxlKSA/IEZvbnRGbGFncy5TZXJpZiA6IDApIHwgKG1ldHJpY3MubW9ub3NwYWNlID8gRm9udEZsYWdzLkZpeGVkUGl0Y2ggOiAwKSB8IChnZXRTeW1ib2xzRm9udHMoKVtmb250TmFtZVdvU3R5bGVdID8gRm9udEZsYWdzLlN5bWJvbGljIDogRm9udEZsYWdzLk5vbnN5bWJvbGljKTsKICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gewogICAgICAgICAgdHlwZSwKICAgICAgICAgIG5hbWU6IGJhc2VGb250TmFtZSwKICAgICAgICAgIGxvYWRlZE5hbWU6IGJhc2VEaWN0LmxvYWRlZE5hbWUsCiAgICAgICAgICBzeXN0ZW1Gb250SW5mbzogbnVsbCwKICAgICAgICAgIHdpZHRoczogbWV0cmljcy53aWR0aHMsCiAgICAgICAgICBkZWZhdWx0V2lkdGg6IG1ldHJpY3MuZGVmYXVsdFdpZHRoLAogICAgICAgICAgaXNTaW11bGF0ZWRGbGFnczogdHJ1ZSwKICAgICAgICAgIGZsYWdzLAogICAgICAgICAgZmlyc3RDaGFyLAogICAgICAgICAgbGFzdENoYXIsCiAgICAgICAgICB0b1VuaWNvZGUsCiAgICAgICAgICB4SGVpZ2h0OiAwLAogICAgICAgICAgY2FwSGVpZ2h0OiAwLAogICAgICAgICAgaXRhbGljQW5nbGU6IDAsCiAgICAgICAgICBpc1R5cGUzRm9udAogICAgICAgIH07CiAgICAgICAgY29uc3Qgd2lkdGhzID0gZGljdC5nZXQoIldpZHRocyIpOwogICAgICAgIGNvbnN0IHN0YW5kYXJkRm9udE5hbWUgPSBnZXRTdGFuZGFyZEZvbnROYW1lKGJhc2VGb250TmFtZSk7CiAgICAgICAgbGV0IGZpbGUgPSBudWxsOwogICAgICAgIGlmIChzdGFuZGFyZEZvbnROYW1lKSB7CiAgICAgICAgICBmaWxlID0gYXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoc3RhbmRhcmRGb250TmFtZSk7CiAgICAgICAgICBwcm9wZXJ0aWVzLmlzSW50ZXJuYWxGb250ID0gISFmaWxlOwogICAgICAgIH0KICAgICAgICBpZiAoIXByb3BlcnRpZXMuaXNJbnRlcm5hbEZvbnQgJiYgdGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzKSB7CiAgICAgICAgICBwcm9wZXJ0aWVzLnN5c3RlbUZvbnRJbmZvID0gZ2V0Rm9udFN1YnN0aXR1dGlvbih0aGlzLnN5c3RlbUZvbnRDYWNoZSwgdGhpcy5pZEZhY3RvcnksIHRoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsLCBiYXNlRm9udE5hbWUsIHN0YW5kYXJkRm9udE5hbWUsIHR5cGUpOwogICAgICAgIH0KICAgICAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgcHJvcGVydGllcyk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2lkdGhzKSkgewogICAgICAgICAgY29uc3QgZ2x5cGhXaWR0aHMgPSBbXTsKICAgICAgICAgIGxldCBqID0gZmlyc3RDaGFyOwogICAgICAgICAgZm9yIChjb25zdCB3IG9mIHdpZHRocykgewogICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHcpOwogICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgIGdseXBoV2lkdGhzW2pdID0gd2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaisrOwogICAgICAgICAgfQogICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSBnbHlwaFdpZHRoczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBuZXdQcm9wZXJ0aWVzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBGb250KGJhc2VGb250TmFtZSwgZmlsZSwgbmV3UHJvcGVydGllcywgdGhpcy5vcHRpb25zKTsKICAgICAgfQogICAgfQogICAgbGV0IGZvbnROYW1lID0gZGVzY3JpcHRvci5nZXQoIkZvbnROYW1lIik7CiAgICBsZXQgYmFzZUZvbnQgPSBkaWN0LmdldCgiQmFzZUZvbnQiKTsKICAgIGlmICh0eXBlb2YgZm9udE5hbWUgPT09ICJzdHJpbmciKSB7CiAgICAgIGZvbnROYW1lID0gTmFtZS5nZXQoZm9udE5hbWUpOwogICAgfQogICAgaWYgKHR5cGVvZiBiYXNlRm9udCA9PT0gInN0cmluZyIpIHsKICAgICAgYmFzZUZvbnQgPSBOYW1lLmdldChiYXNlRm9udCk7CiAgICB9CiAgICBjb25zdCBmb250TmFtZVN0ciA9IGZvbnROYW1lPy5uYW1lOwogICAgY29uc3QgYmFzZUZvbnRTdHIgPSBiYXNlRm9udD8ubmFtZTsKICAgIGlmICghaXNUeXBlM0ZvbnQgJiYgZm9udE5hbWVTdHIgIT09IGJhc2VGb250U3RyKSB7CiAgICAgIGluZm8oYFRoZSBGb250RGVzY3JpcHRvcidzIEZvbnROYW1lIGlzICIke2ZvbnROYW1lU3RyfSIgYnV0IGAgKyBgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBGb250J3MgQmFzZUZvbnQgIiR7YmFzZUZvbnRTdHJ9Ii5gKTsKICAgICAgaWYgKGZvbnROYW1lU3RyICYmIGJhc2VGb250U3RyICYmIChiYXNlRm9udFN0ci5zdGFydHNXaXRoKGZvbnROYW1lU3RyKSB8fCAhaXNLbm93bkZvbnROYW1lKGZvbnROYW1lU3RyKSAmJiBpc0tub3duRm9udE5hbWUoYmFzZUZvbnRTdHIpKSkgewogICAgICAgIGZvbnROYW1lID0gbnVsbDsKICAgICAgfQogICAgfQogICAgZm9udE5hbWUgfHw9IGJhc2VGb250OwogICAgaWYgKCEoZm9udE5hbWUgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBuYW1lIik7CiAgICB9CiAgICBsZXQgZm9udEZpbGUsIHN1YnR5cGUsIGxlbmd0aDEsIGxlbmd0aDIsIGxlbmd0aDM7CiAgICB0cnkgewogICAgICBmb250RmlsZSA9IGRlc2NyaXB0b3IuZ2V0KCJGb250RmlsZSIsICJGb250RmlsZTIiLCAiRm9udEZpbGUzIik7CiAgICAgIGlmIChmb250RmlsZSkgewogICAgICAgIGlmICghKGZvbnRGaWxlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRm9udEZpbGUgc2hvdWxkIGJlIGEgc3RyZWFtIik7CiAgICAgICAgfSBlbHNlIGlmIChmb250RmlsZS5pc0VtcHR5KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkZvbnRGaWxlIGlzIGVtcHR5Iik7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGB0cmFuc2xhdGVGb250IC0gZmV0Y2hpbmcgIiR7Zm9udE5hbWUubmFtZX0iIGZvbnQgZmlsZTogIiR7ZXh9Ii5gKTsKICAgICAgZm9udEZpbGUgPSBudWxsOwogICAgfQogICAgbGV0IGlzSW50ZXJuYWxGb250ID0gZmFsc2U7CiAgICBsZXQgZ2x5cGhTY2FsZUZhY3RvcnMgPSBudWxsOwogICAgbGV0IHN5c3RlbUZvbnRJbmZvID0gbnVsbDsKICAgIGlmIChmb250RmlsZSkgewogICAgICBpZiAoZm9udEZpbGUuZGljdCkgewogICAgICAgIGNvbnN0IHN1YnR5cGVFbnRyeSA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CiAgICAgICAgaWYgKHN1YnR5cGVFbnRyeSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIHN1YnR5cGUgPSBzdWJ0eXBlRW50cnkubmFtZTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoMSA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgxIik7CiAgICAgICAgbGVuZ3RoMiA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgyIik7CiAgICAgICAgbGVuZ3RoMyA9IGZvbnRGaWxlLmRpY3QuZ2V0KCJMZW5ndGgzIik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY3NzRm9udEluZm8pIHsKICAgICAgY29uc3Qgc3RhbmRhcmRGb250TmFtZSA9IGdldFhmYUZvbnROYW1lKGZvbnROYW1lLm5hbWUpOwogICAgICBpZiAoc3RhbmRhcmRGb250TmFtZSkgewogICAgICAgIGNzc0ZvbnRJbmZvLmZvbnRGYW1pbHkgPSBgJHtjc3NGb250SW5mby5mb250RmFtaWx5fS1QZGZKUy1YRkFgOwogICAgICAgIGNzc0ZvbnRJbmZvLm1ldHJpY3MgPSBzdGFuZGFyZEZvbnROYW1lLm1ldHJpY3MgfHwgbnVsbDsKICAgICAgICBnbHlwaFNjYWxlRmFjdG9ycyA9IHN0YW5kYXJkRm9udE5hbWUuZmFjdG9ycyB8fCBudWxsOwogICAgICAgIGZvbnRGaWxlID0gYXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoc3RhbmRhcmRGb250TmFtZS5uYW1lKTsKICAgICAgICBpc0ludGVybmFsRm9udCA9ICEhZm9udEZpbGU7CiAgICAgICAgYmFzZURpY3QgPSBkaWN0ID0gZ2V0WGZhRm9udERpY3QoZm9udE5hbWUubmFtZSk7CiAgICAgICAgY29tcG9zaXRlID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIGlmICghaXNUeXBlM0ZvbnQpIHsKICAgICAgY29uc3Qgc3RhbmRhcmRGb250TmFtZSA9IGdldFN0YW5kYXJkRm9udE5hbWUoZm9udE5hbWUubmFtZSk7CiAgICAgIGlmIChzdGFuZGFyZEZvbnROYW1lKSB7CiAgICAgICAgZm9udEZpbGUgPSBhd2FpdCB0aGlzLmZldGNoU3RhbmRhcmRGb250RGF0YShzdGFuZGFyZEZvbnROYW1lKTsKICAgICAgICBpc0ludGVybmFsRm9udCA9ICEhZm9udEZpbGU7CiAgICAgIH0KICAgICAgaWYgKCFpc0ludGVybmFsRm9udCAmJiB0aGlzLm9wdGlvbnMudXNlU3lzdGVtRm9udHMpIHsKICAgICAgICBzeXN0ZW1Gb250SW5mbyA9IGdldEZvbnRTdWJzdGl0dXRpb24odGhpcy5zeXN0ZW1Gb250Q2FjaGUsIHRoaXMuaWRGYWN0b3J5LCB0aGlzLm9wdGlvbnMuc3RhbmRhcmRGb250RGF0YVVybCwgZm9udE5hbWUubmFtZSwgc3RhbmRhcmRGb250TmFtZSwgdHlwZSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGZvbnRNYXRyaXggPSBsb29rdXBNYXRyaXgoZGljdC5nZXRBcnJheSgiRm9udE1hdHJpeCIpLCBGT05UX0lERU5USVRZX01BVFJJWCk7CiAgICBjb25zdCBiYm94ID0gbG9va3VwTm9ybWFsUmVjdChkZXNjcmlwdG9yLmdldEFycmF5KCJGb250QkJveCIpIHx8IGRpY3QuZ2V0QXJyYXkoIkZvbnRCQm94IiksIHVuZGVmaW5lZCk7CiAgICBsZXQgYXNjZW50ID0gZGVzY3JpcHRvci5nZXQoIkFzY2VudCIpOwogICAgaWYgKHR5cGVvZiBhc2NlbnQgIT09ICJudW1iZXIiKSB7CiAgICAgIGFzY2VudCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGxldCBkZXNjZW50ID0gZGVzY3JpcHRvci5nZXQoIkRlc2NlbnQiKTsKICAgIGlmICh0eXBlb2YgZGVzY2VudCAhPT0gIm51bWJlciIpIHsKICAgICAgZGVzY2VudCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGxldCB4SGVpZ2h0ID0gZGVzY3JpcHRvci5nZXQoIlhIZWlnaHQiKTsKICAgIGlmICh0eXBlb2YgeEhlaWdodCAhPT0gIm51bWJlciIpIHsKICAgICAgeEhlaWdodCA9IDA7CiAgICB9CiAgICBsZXQgY2FwSGVpZ2h0ID0gZGVzY3JpcHRvci5nZXQoIkNhcEhlaWdodCIpOwogICAgaWYgKHR5cGVvZiBjYXBIZWlnaHQgIT09ICJudW1iZXIiKSB7CiAgICAgIGNhcEhlaWdodCA9IDA7CiAgICB9CiAgICBsZXQgZmxhZ3MgPSBkZXNjcmlwdG9yLmdldCgiRmxhZ3MiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmbGFncykpIHsKICAgICAgZmxhZ3MgPSAwOwogICAgfQogICAgbGV0IGl0YWxpY0FuZ2xlID0gZGVzY3JpcHRvci5nZXQoIkl0YWxpY0FuZ2xlIik7CiAgICBpZiAodHlwZW9mIGl0YWxpY0FuZ2xlICE9PSAibnVtYmVyIikgewogICAgICBpdGFsaWNBbmdsZSA9IDA7CiAgICB9CiAgICBjb25zdCBwcm9wZXJ0aWVzID0gewogICAgICB0eXBlLAogICAgICBuYW1lOiBmb250TmFtZS5uYW1lLAogICAgICBzdWJ0eXBlLAogICAgICBmaWxlOiBmb250RmlsZSwKICAgICAgbGVuZ3RoMSwKICAgICAgbGVuZ3RoMiwKICAgICAgbGVuZ3RoMywKICAgICAgaXNJbnRlcm5hbEZvbnQsCiAgICAgIGxvYWRlZE5hbWU6IGJhc2VEaWN0LmxvYWRlZE5hbWUsCiAgICAgIGNvbXBvc2l0ZSwKICAgICAgZml4ZWRQaXRjaDogZmFsc2UsCiAgICAgIGZvbnRNYXRyaXgsCiAgICAgIGZpcnN0Q2hhciwKICAgICAgbGFzdENoYXIsCiAgICAgIHRvVW5pY29kZSwKICAgICAgYmJveCwKICAgICAgYXNjZW50LAogICAgICBkZXNjZW50LAogICAgICB4SGVpZ2h0LAogICAgICBjYXBIZWlnaHQsCiAgICAgIGZsYWdzLAogICAgICBpdGFsaWNBbmdsZSwKICAgICAgaXNUeXBlM0ZvbnQsCiAgICAgIGNzc0ZvbnRJbmZvLAogICAgICBzY2FsZUZhY3RvcnM6IGdseXBoU2NhbGVGYWN0b3JzLAogICAgICBzeXN0ZW1Gb250SW5mbwogICAgfTsKICAgIGlmIChjb21wb3NpdGUpIHsKICAgICAgY29uc3QgY2lkRW5jb2RpbmcgPSBiYXNlRGljdC5nZXQoIkVuY29kaW5nIik7CiAgICAgIGlmIChjaWRFbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBwcm9wZXJ0aWVzLmNpZEVuY29kaW5nID0gY2lkRW5jb2RpbmcubmFtZTsKICAgICAgfQogICAgICBjb25zdCBjTWFwID0gYXdhaXQgQ01hcEZhY3RvcnkuY3JlYXRlKHsKICAgICAgICBlbmNvZGluZzogY2lkRW5jb2RpbmcsCiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgIHVzZUNNYXA6IG51bGwKICAgICAgfSk7CiAgICAgIHByb3BlcnRpZXMuY01hcCA9IGNNYXA7CiAgICAgIHByb3BlcnRpZXMudmVydGljYWwgPSBwcm9wZXJ0aWVzLmNNYXAudmVydGljYWw7CiAgICB9CiAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgcHJvcGVydGllcyk7CiAgICB0aGlzLmV4dHJhY3RXaWR0aHMoZGljdCwgZGVzY3JpcHRvciwgbmV3UHJvcGVydGllcyk7CiAgICByZXR1cm4gbmV3IEZvbnQoZm9udE5hbWUubmFtZSwgZm9udEZpbGUsIG5ld1Byb3BlcnRpZXMsIHRoaXMub3B0aW9ucyk7CiAgfQogIHN0YXRpYyBidWlsZEZvbnRQYXRocyhmb250LCBnbHlwaHMsIGhhbmRsZXIsIGV2YWx1YXRvck9wdGlvbnMpIHsKICAgIGZ1bmN0aW9uIGJ1aWxkUGF0aChmb250Q2hhcikgewogICAgICBjb25zdCBnbHlwaE5hbWUgPSBgJHtmb250LmxvYWRlZE5hbWV9X3BhdGhfJHtmb250Q2hhcn1gOwogICAgICB0cnkgewogICAgICAgIGlmIChmb250LnJlbmRlcmVyLmhhc0J1aWx0UGF0aChmb250Q2hhcikpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbZ2x5cGhOYW1lLCAiRm9udFBhdGgiLCBmb250LnJlbmRlcmVyLmdldFBhdGhKcyhmb250Q2hhcildKTsKICAgICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICAgaWYgKGV2YWx1YXRvck9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICB3YXJuKGBidWlsZEZvbnRQYXRocyAtIGlnbm9yaW5nICR7Z2x5cGhOYW1lfSBnbHlwaDogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHsKICAgICAgYnVpbGRQYXRoKGdseXBoLmZvbnRDaGFyKTsKICAgICAgY29uc3QgYWNjZW50ID0gZ2x5cGguYWNjZW50OwogICAgICBpZiAoYWNjZW50Py5mb250Q2hhcikgewogICAgICAgIGJ1aWxkUGF0aChhY2NlbnQuZm9udENoYXIpOwogICAgICB9CiAgICB9CiAgfQogIHN0YXRpYyBnZXQgZmFsbGJhY2tGb250RGljdCgpIHsKICAgIGNvbnN0IGRpY3QgPSBuZXcgRGljdCgpOwogICAgZGljdC5zZXQoIkJhc2VGb250IiwgTmFtZS5nZXQoIkhlbHZldGljYSIpKTsKICAgIGRpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTsKICAgIGRpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTsKICAgIGRpY3Quc2V0KCJFbmNvZGluZyIsIE5hbWUuZ2V0KCJXaW5BbnNpRW5jb2RpbmciKSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmYWxsYmFja0ZvbnREaWN0IiwgZGljdCk7CiAgfQp9CmNsYXNzIFRyYW5zbGF0ZWRGb250IHsKICAjc2VudCA9IGZhbHNlOwogICN0eXBlM0xvYWRlZCA9IG51bGw7CiAgY29uc3RydWN0b3IoewogICAgbG9hZGVkTmFtZSwKICAgIGZvbnQsCiAgICBkaWN0CiAgfSkgewogICAgdGhpcy5sb2FkZWROYW1lID0gbG9hZGVkTmFtZTsKICAgIHRoaXMuZm9udCA9IGZvbnQ7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgdGhpcy50eXBlM0RlcGVuZGVuY2llcyA9IGZvbnQuaXNUeXBlM0ZvbnQgPyBuZXcgU2V0KCkgOiBudWxsOwogIH0KICBzZW5kKGhhbmRsZXIpIHsKICAgIGlmICh0aGlzLiNzZW50KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuI3NlbnQgPSB0cnVlOwogICAgaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbdGhpcy5sb2FkZWROYW1lLCAiRm9udCIsIHRoaXMuZm9udC5leHBvcnREYXRhKCldKTsKICB9CiAgZmFsbGJhY2soaGFuZGxlciwgZXZhbHVhdG9yT3B0aW9ucykgewogICAgaWYgKCF0aGlzLmZvbnQuZGF0YSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmZvbnQuZGlzYWJsZUZvbnRGYWNlID0gdHJ1ZTsKICAgIFBhcnRpYWxFdmFsdWF0b3IuYnVpbGRGb250UGF0aHModGhpcy5mb250LCB0aGlzLmZvbnQuZ2x5cGhDYWNoZVZhbHVlcywgaGFuZGxlciwgZXZhbHVhdG9yT3B0aW9ucyk7CiAgfQogIGxvYWRUeXBlM0RhdGEoZXZhbHVhdG9yLCByZXNvdXJjZXMsIHRhc2spIHsKICAgIGlmICh0aGlzLiN0eXBlM0xvYWRlZCkgewogICAgICByZXR1cm4gdGhpcy4jdHlwZTNMb2FkZWQ7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIGZvbnQsCiAgICAgIHR5cGUzRGVwZW5kZW5jaWVzCiAgICB9ID0gdGhpczsKICAgIGFzc2VydChmb250LmlzVHlwZTNGb250LCAiTXVzdCBiZSBhIFR5cGUzIGZvbnQuIik7CiAgICBjb25zdCB0eXBlM0V2YWx1YXRvciA9IGV2YWx1YXRvci5jbG9uZSh7CiAgICAgIGlnbm9yZUVycm9yczogZmFsc2UKICAgIH0pOwogICAgY29uc3QgdHlwZTNGb250UmVmcyA9IG5ldyBSZWZTZXQoZXZhbHVhdG9yLnR5cGUzRm9udFJlZnMpOwogICAgaWYgKHRoaXMuZGljdC5vYmpJZCAmJiAhdHlwZTNGb250UmVmcy5oYXModGhpcy5kaWN0Lm9iaklkKSkgewogICAgICB0eXBlM0ZvbnRSZWZzLnB1dCh0aGlzLmRpY3Qub2JqSWQpOwogICAgfQogICAgdHlwZTNFdmFsdWF0b3IudHlwZTNGb250UmVmcyA9IHR5cGUzRm9udFJlZnM7CiAgICBsZXQgbG9hZENoYXJQcm9jc1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgIGNvbnN0IGNoYXJQcm9jcyA9IHRoaXMuZGljdC5nZXQoIkNoYXJQcm9jcyIpOwogICAgY29uc3QgZm9udFJlc291cmNlcyA9IHRoaXMuZGljdC5nZXQoIlJlc291cmNlcyIpIHx8IHJlc291cmNlczsKICAgIGNvbnN0IGNoYXJQcm9jT3BlcmF0b3JMaXN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IGZvbnRCQm94ID0gVXRpbC5ub3JtYWxpemVSZWN0KGZvbnQuYmJveCB8fCBbMCwgMCwgMCwgMF0pLAogICAgICB3aWR0aCA9IGZvbnRCQm94WzJdIC0gZm9udEJCb3hbMF0sCiAgICAgIGhlaWdodCA9IGZvbnRCQm94WzNdIC0gZm9udEJCb3hbMV07CiAgICBjb25zdCBmb250QkJveFNpemUgPSBNYXRoLmh5cG90KHdpZHRoLCBoZWlnaHQpOwogICAgZm9yIChjb25zdCBrZXkgb2YgY2hhclByb2NzLmdldEtleXMoKSkgewogICAgICBsb2FkQ2hhclByb2NzUHJvbWlzZSA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oKCkgPT4gewogICAgICAgIGNvbnN0IGdseXBoU3RyZWFtID0gY2hhclByb2NzLmdldChrZXkpOwogICAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoKTsKICAgICAgICByZXR1cm4gdHlwZTNFdmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgICAgIHN0cmVhbTogZ2x5cGhTdHJlYW0sCiAgICAgICAgICB0YXNrLAogICAgICAgICAgcmVzb3VyY2VzOiBmb250UmVzb3VyY2VzLAogICAgICAgICAgb3BlcmF0b3JMaXN0CiAgICAgICAgfSkudGhlbigoKSA9PiB7CiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yTGlzdC5mbkFycmF5WzBdKSB7CiAgICAgICAgICAgIGNhc2UgT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kczoKICAgICAgICAgICAgICB0aGlzLiNyZW1vdmVUeXBlM0NvbG9yT3BlcmF0b3JzKG9wZXJhdG9yTGlzdCwgZm9udEJCb3hTaXplKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBPUFMuc2V0Q2hhcldpZHRoOgogICAgICAgICAgICAgIGlmICghZm9udEJCb3hTaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLiNndWVzc1R5cGUzRm9udEJCb3gob3BlcmF0b3JMaXN0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjaGFyUHJvY09wZXJhdG9yTGlzdFtrZXldID0gb3BlcmF0b3JMaXN0LmdldElSKCk7CiAgICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb3BlcmF0b3JMaXN0LmRlcGVuZGVuY2llcykgewogICAgICAgICAgICB0eXBlM0RlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7CiAgICAgICAgICB9CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgd2FybihgVHlwZTMgZm9udCByZXNvdXJjZSAiJHtrZXl9IiBpcyBub3QgYXZhaWxhYmxlLmApOwogICAgICAgICAgY29uc3QgZHVtbXlPcGVyYXRvckxpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7CiAgICAgICAgICBjaGFyUHJvY09wZXJhdG9yTGlzdFtrZXldID0gZHVtbXlPcGVyYXRvckxpc3QuZ2V0SVIoKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICB0aGlzLiN0eXBlM0xvYWRlZCA9IGxvYWRDaGFyUHJvY3NQcm9taXNlLnRoZW4oKCkgPT4gewogICAgICBmb250LmNoYXJQcm9jT3BlcmF0b3JMaXN0ID0gY2hhclByb2NPcGVyYXRvckxpc3Q7CiAgICAgIGlmICh0aGlzLl9iYm94KSB7CiAgICAgICAgZm9udC5pc0NoYXJCQm94ID0gdHJ1ZTsKICAgICAgICBmb250LmJib3ggPSB0aGlzLl9iYm94OwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0aGlzLiN0eXBlM0xvYWRlZDsKICB9CiAgI3JlbW92ZVR5cGUzQ29sb3JPcGVyYXRvcnMob3BlcmF0b3JMaXN0LCBmb250QkJveFNpemUgPSBOYU4pIHsKICAgIGNvbnN0IGNoYXJCQm94ID0gVXRpbC5ub3JtYWxpemVSZWN0KG9wZXJhdG9yTGlzdC5hcmdzQXJyYXlbMF0uc2xpY2UoMikpLAogICAgICB3aWR0aCA9IGNoYXJCQm94WzJdIC0gY2hhckJCb3hbMF0sCiAgICAgIGhlaWdodCA9IGNoYXJCQm94WzNdIC0gY2hhckJCb3hbMV07CiAgICBjb25zdCBjaGFyQkJveFNpemUgPSBNYXRoLmh5cG90KHdpZHRoLCBoZWlnaHQpOwogICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkgewogICAgICBvcGVyYXRvckxpc3QuZm5BcnJheS5zcGxpY2UoMCwgMSk7CiAgICAgIG9wZXJhdG9yTGlzdC5hcmdzQXJyYXkuc3BsaWNlKDAsIDEpOwogICAgfSBlbHNlIGlmIChmb250QkJveFNpemUgPT09IDAgfHwgTWF0aC5yb3VuZChjaGFyQkJveFNpemUgLyBmb250QkJveFNpemUpID49IDEwKSB7CiAgICAgIHRoaXMuX2Jib3ggPz89IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTsKICAgICAgVXRpbC5yZWN0Qm91bmRpbmdCb3goLi4uY2hhckJCb3gsIHRoaXMuX2Jib3gpOwogICAgfQogICAgbGV0IGkgPSAwLAogICAgICBpaSA9IG9wZXJhdG9yTGlzdC5sZW5ndGg7CiAgICB3aGlsZSAoaSA8IGlpKSB7CiAgICAgIHN3aXRjaCAob3BlcmF0b3JMaXN0LmZuQXJyYXlbaV0pIHsKICAgICAgICBjYXNlIE9QUy5zZXRDaGFyV2lkdGhBbmRCb3VuZHM6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDb2xvclNwYWNlOgogICAgICAgIGNhc2UgT1BTLnNldEZpbGxDb2xvclNwYWNlOgogICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yOgogICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yTjoKICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3I6CiAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yTjoKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VHcmF5OgogICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OgogICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZVJHQkNvbG9yOgogICAgICAgIGNhc2UgT1BTLnNldEZpbGxSR0JDb2xvcjoKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDTVlLQ29sb3I6CiAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENNWUtDb2xvcjoKICAgICAgICBjYXNlIE9QUy5zaGFkaW5nRmlsbDoKICAgICAgICBjYXNlIE9QUy5zZXRSZW5kZXJpbmdJbnRlbnQ6CiAgICAgICAgICBvcGVyYXRvckxpc3QuZm5BcnJheS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICBvcGVyYXRvckxpc3QuYXJnc0FycmF5LnNwbGljZShpLCAxKTsKICAgICAgICAgIGlpLS07CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIE9QUy5zZXRHU3RhdGU6CiAgICAgICAgICBjb25zdCBbZ1N0YXRlT2JqXSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXlbaV07CiAgICAgICAgICBsZXQgaiA9IDAsCiAgICAgICAgICAgIGpqID0gZ1N0YXRlT2JqLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChqIDwgamopIHsKICAgICAgICAgICAgY29uc3QgW2dTdGF0ZUtleV0gPSBnU3RhdGVPYmpbal07CiAgICAgICAgICAgIHN3aXRjaCAoZ1N0YXRlS2V5KSB7CiAgICAgICAgICAgICAgY2FzZSAiVFIiOgogICAgICAgICAgICAgIGNhc2UgIlRSMiI6CiAgICAgICAgICAgICAgY2FzZSAiSFQiOgogICAgICAgICAgICAgIGNhc2UgIkJHIjoKICAgICAgICAgICAgICBjYXNlICJCRzIiOgogICAgICAgICAgICAgIGNhc2UgIlVDUiI6CiAgICAgICAgICAgICAgY2FzZSAiVUNSMiI6CiAgICAgICAgICAgICAgICBnU3RhdGVPYmouc3BsaWNlKGosIDEpOwogICAgICAgICAgICAgICAgamotLTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGorKzsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGkrKzsKICAgIH0KICB9CiAgI2d1ZXNzVHlwZTNGb250QkJveChvcGVyYXRvckxpc3QpIHsKICAgIGxldCBpID0gMTsKICAgIGNvbnN0IGlpID0gb3BlcmF0b3JMaXN0Lmxlbmd0aDsKICAgIHdoaWxlIChpIDwgaWkpIHsKICAgICAgc3dpdGNoIChvcGVyYXRvckxpc3QuZm5BcnJheVtpXSkgewogICAgICAgIGNhc2UgT1BTLmNvbnN0cnVjdFBhdGg6CiAgICAgICAgICBjb25zdCBtaW5NYXggPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5W2ldWzJdOwogICAgICAgICAgdGhpcy5fYmJveCA/Pz0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldOwogICAgICAgICAgVXRpbC5yZWN0Qm91bmRpbmdCb3goLi4ubWluTWF4LCB0aGlzLl9iYm94KTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGkrKzsKICAgIH0KICB9Cn0KY2xhc3MgU3RhdGVNYW5hZ2VyIHsKICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhdGUgPSBuZXcgRXZhbFN0YXRlKCkpIHsKICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7CiAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTsKICB9CiAgc2F2ZSgpIHsKICAgIGNvbnN0IG9sZCA9IHRoaXMuc3RhdGU7CiAgICB0aGlzLnN0YXRlU3RhY2sucHVzaCh0aGlzLnN0YXRlKTsKICAgIHRoaXMuc3RhdGUgPSBvbGQuY2xvbmUoKTsKICB9CiAgcmVzdG9yZSgpIHsKICAgIGNvbnN0IHByZXYgPSB0aGlzLnN0YXRlU3RhY2sucG9wKCk7CiAgICBpZiAocHJldikgewogICAgICB0aGlzLnN0YXRlID0gcHJldjsKICAgIH0KICB9CiAgdHJhbnNmb3JtKGFyZ3MpIHsKICAgIHRoaXMuc3RhdGUuY3RtID0gVXRpbC50cmFuc2Zvcm0odGhpcy5zdGF0ZS5jdG0sIGFyZ3MpOwogIH0KfQpjbGFzcyBUZXh0U3RhdGUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5jdG0gPSBuZXcgRmxvYXQzMkFycmF5KElERU5USVRZX01BVFJJWCk7CiAgICB0aGlzLmZvbnROYW1lID0gbnVsbDsKICAgIHRoaXMuZm9udFNpemUgPSAwOwogICAgdGhpcy5sb2FkZWROYW1lID0gbnVsbDsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLmZvbnRNYXRyaXggPSBGT05UX0lERU5USVRZX01BVFJJWDsKICAgIHRoaXMudGV4dE1hdHJpeCA9IElERU5USVRZX01BVFJJWC5zbGljZSgpOwogICAgdGhpcy50ZXh0TGluZU1hdHJpeCA9IElERU5USVRZX01BVFJJWC5zbGljZSgpOwogICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7CiAgICB0aGlzLndvcmRTcGFjaW5nID0gMDsKICAgIHRoaXMubGVhZGluZyA9IDA7CiAgICB0aGlzLnRleHRIU2NhbGUgPSAxOwogICAgdGhpcy50ZXh0UmlzZSA9IDA7CiAgfQogIHNldFRleHRNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikgewogICAgY29uc3QgbSA9IHRoaXMudGV4dE1hdHJpeDsKICAgIG1bMF0gPSBhOwogICAgbVsxXSA9IGI7CiAgICBtWzJdID0gYzsKICAgIG1bM10gPSBkOwogICAgbVs0XSA9IGU7CiAgICBtWzVdID0gZjsKICB9CiAgc2V0VGV4dExpbmVNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikgewogICAgY29uc3QgbSA9IHRoaXMudGV4dExpbmVNYXRyaXg7CiAgICBtWzBdID0gYTsKICAgIG1bMV0gPSBiOwogICAgbVsyXSA9IGM7CiAgICBtWzNdID0gZDsKICAgIG1bNF0gPSBlOwogICAgbVs1XSA9IGY7CiAgfQogIHRyYW5zbGF0ZVRleHRNYXRyaXgoeCwgeSkgewogICAgY29uc3QgbSA9IHRoaXMudGV4dE1hdHJpeDsKICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTsKICAgIG1bNV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTsKICB9CiAgdHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoeCwgeSkgewogICAgY29uc3QgbSA9IHRoaXMudGV4dExpbmVNYXRyaXg7CiAgICBtWzRdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07CiAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07CiAgfQogIGNhcnJpYWdlUmV0dXJuKCkgewogICAgdGhpcy50cmFuc2xhdGVUZXh0TGluZU1hdHJpeCgwLCAtdGhpcy5sZWFkaW5nKTsKICAgIHRoaXMudGV4dE1hdHJpeCA9IHRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKTsKICB9CiAgY2xvbmUoKSB7CiAgICBjb25zdCBjbG9uZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBjbG9uZS50ZXh0TWF0cml4ID0gdGhpcy50ZXh0TWF0cml4LnNsaWNlKCk7CiAgICBjbG9uZS50ZXh0TGluZU1hdHJpeCA9IHRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKTsKICAgIGNsb25lLmZvbnRNYXRyaXggPSB0aGlzLmZvbnRNYXRyaXguc2xpY2UoKTsKICAgIHJldHVybiBjbG9uZTsKICB9Cn0KY2xhc3MgRXZhbFN0YXRlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuY3RtID0gbmV3IEZsb2F0MzJBcnJheShJREVOVElUWV9NQVRSSVgpOwogICAgdGhpcy5mb250ID0gbnVsbDsKICAgIHRoaXMudGV4dFJlbmRlcmluZ01vZGUgPSBUZXh0UmVuZGVyaW5nTW9kZS5GSUxMOwogICAgdGhpcy5fZmlsbENvbG9yU3BhY2UgPSB0aGlzLl9zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLmdyYXk7CiAgICB0aGlzLnBhdHRlcm5GaWxsQ29sb3JTcGFjZSA9IG51bGw7CiAgICB0aGlzLnBhdHRlcm5TdHJva2VDb2xvclNwYWNlID0gbnVsbDsKICAgIHRoaXMuY3VycmVudFBvaW50WCA9IHRoaXMuY3VycmVudFBvaW50WSA9IDA7CiAgICB0aGlzLnBhdGhNaW5NYXggPSBuZXcgRmxvYXQzMkFycmF5KFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XSk7CiAgICB0aGlzLnBhdGhCdWZmZXIgPSBbXTsKICB9CiAgZ2V0IGZpbGxDb2xvclNwYWNlKCkgewogICAgcmV0dXJuIHRoaXMuX2ZpbGxDb2xvclNwYWNlOwogIH0KICBzZXQgZmlsbENvbG9yU3BhY2UoY29sb3JTcGFjZSkgewogICAgdGhpcy5fZmlsbENvbG9yU3BhY2UgPSB0aGlzLnBhdHRlcm5GaWxsQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7CiAgfQogIGdldCBzdHJva2VDb2xvclNwYWNlKCkgewogICAgcmV0dXJuIHRoaXMuX3N0cm9rZUNvbG9yU3BhY2U7CiAgfQogIHNldCBzdHJva2VDb2xvclNwYWNlKGNvbG9yU3BhY2UpIHsKICAgIHRoaXMuX3N0cm9rZUNvbG9yU3BhY2UgPSB0aGlzLnBhdHRlcm5TdHJva2VDb2xvclNwYWNlID0gY29sb3JTcGFjZTsKICB9CiAgY2xvbmUoewogICAgbmV3UGF0aCA9IGZhbHNlCiAgfSA9IHt9KSB7CiAgICBjb25zdCBjbG9uZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBpZiAobmV3UGF0aCkgewogICAgICBjbG9uZS5wYXRoQnVmZmVyID0gW107CiAgICAgIGNsb25lLnBhdGhNaW5NYXggPSBuZXcgRmxvYXQzMkFycmF5KFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XSk7CiAgICB9CiAgICByZXR1cm4gY2xvbmU7CiAgfQp9CmNsYXNzIEV2YWx1YXRvclByZXByb2Nlc3NvciB7CiAgc3RhdGljIGdldCBvcE1hcCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIm9wTWFwIiwgT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB7CiAgICAgIHc6IHsKICAgICAgICBpZDogT1BTLnNldExpbmVXaWR0aCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgSjogewogICAgICAgIGlkOiBPUFMuc2V0TGluZUNhcCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgajogewogICAgICAgIGlkOiBPUFMuc2V0TGluZUpvaW4sCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIE06IHsKICAgICAgICBpZDogT1BTLnNldE1pdGVyTGltaXQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGQ6IHsKICAgICAgICBpZDogT1BTLnNldERhc2gsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHJpOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRSZW5kZXJpbmdJbnRlbnQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGk6IHsKICAgICAgICBpZDogT1BTLnNldEZsYXRuZXNzLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBnczogewogICAgICAgIGlkOiBPUFMuc2V0R1N0YXRlLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBxOiB7CiAgICAgICAgaWQ6IE9QUy5zYXZlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBROiB7CiAgICAgICAgaWQ6IE9QUy5yZXN0b3JlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBjbTogewogICAgICAgIGlkOiBPUFMudHJhbnNmb3JtLAogICAgICAgIG51bUFyZ3M6IDYsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBtOiB7CiAgICAgICAgaWQ6IE9QUy5tb3ZlVG8sCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGw6IHsKICAgICAgICBpZDogT1BTLmxpbmVUbywKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgYzogewogICAgICAgIGlkOiBPUFMuY3VydmVUbywKICAgICAgICBudW1BcmdzOiA2LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgdjogewogICAgICAgIGlkOiBPUFMuY3VydmVUbzIsCiAgICAgICAgbnVtQXJnczogNCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHk6IHsKICAgICAgICBpZDogT1BTLmN1cnZlVG8zLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBoOiB7CiAgICAgICAgaWQ6IE9QUy5jbG9zZVBhdGgsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHJlOiB7CiAgICAgICAgaWQ6IE9QUy5yZWN0YW5nbGUsCiAgICAgICAgbnVtQXJnczogNCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFM6IHsKICAgICAgICBpZDogT1BTLnN0cm9rZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgczogewogICAgICAgIGlkOiBPUFMuY2xvc2VTdHJva2UsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGY6IHsKICAgICAgICBpZDogT1BTLmZpbGwsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEY6IHsKICAgICAgICBpZDogT1BTLmZpbGwsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgICJmKiI6IHsKICAgICAgICBpZDogT1BTLmVvRmlsbCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQjogewogICAgICAgIGlkOiBPUFMuZmlsbFN0cm9rZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgIkIqIjogewogICAgICAgIGlkOiBPUFMuZW9GaWxsU3Ryb2tlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBiOiB7CiAgICAgICAgaWQ6IE9QUy5jbG9zZUZpbGxTdHJva2UsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgICJiKiI6IHsKICAgICAgICBpZDogT1BTLmNsb3NlRU9GaWxsU3Ryb2tlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBuOiB7CiAgICAgICAgaWQ6IE9QUy5lbmRQYXRoLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBXOiB7CiAgICAgICAgaWQ6IE9QUy5jbGlwLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICAiVyoiOiB7CiAgICAgICAgaWQ6IE9QUy5lb0NsaXAsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEJUOiB7CiAgICAgICAgaWQ6IE9QUy5iZWdpblRleHQsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEVUOiB7CiAgICAgICAgaWQ6IE9QUy5lbmRUZXh0LAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUYzogewogICAgICAgIGlkOiBPUFMuc2V0Q2hhclNwYWNpbmcsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFR3OiB7CiAgICAgICAgaWQ6IE9QUy5zZXRXb3JkU3BhY2luZywKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVHo6IHsKICAgICAgICBpZDogT1BTLnNldEhTY2FsZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVEw6IHsKICAgICAgICBpZDogT1BTLnNldExlYWRpbmcsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRmOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRGb250LAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUcjogewogICAgICAgIGlkOiBPUFMuc2V0VGV4dFJlbmRlcmluZ01vZGUsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRzOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRUZXh0UmlzZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVGQ6IHsKICAgICAgICBpZDogT1BTLm1vdmVUZXh0LAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBURDogewogICAgICAgIGlkOiBPUFMuc2V0TGVhZGluZ01vdmVUZXh0LAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUbTogewogICAgICAgIGlkOiBPUFMuc2V0VGV4dE1hdHJpeCwKICAgICAgICBudW1BcmdzOiA2LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgIlQqIjogewogICAgICAgIGlkOiBPUFMubmV4dExpbmUsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRqOiB7CiAgICAgICAgaWQ6IE9QUy5zaG93VGV4dCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVEo6IHsKICAgICAgICBpZDogT1BTLnNob3dTcGFjZWRUZXh0LAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICAiJyI6IHsKICAgICAgICBpZDogT1BTLm5leHRMaW5lU2hvd1RleHQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgICciJzogewogICAgICAgIGlkOiBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQsCiAgICAgICAgbnVtQXJnczogMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGQwOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRDaGFyV2lkdGgsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGQxOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRDaGFyV2lkdGhBbmRCb3VuZHMsCiAgICAgICAgbnVtQXJnczogNiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIENTOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRTdHJva2VDb2xvclNwYWNlLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBjczogewogICAgICAgIGlkOiBPUFMuc2V0RmlsbENvbG9yU3BhY2UsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFNDOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRTdHJva2VDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQogICAgICB9LAogICAgICBTQ046IHsKICAgICAgICBpZDogT1BTLnNldFN0cm9rZUNvbG9yTiwKICAgICAgICBudW1BcmdzOiAzMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IHRydWUKICAgICAgfSwKICAgICAgc2M6IHsKICAgICAgICBpZDogT1BTLnNldEZpbGxDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQogICAgICB9LAogICAgICBzY246IHsKICAgICAgICBpZDogT1BTLnNldEZpbGxDb2xvck4sCiAgICAgICAgbnVtQXJnczogMzMsCiAgICAgICAgdmFyaWFibGVBcmdzOiB0cnVlCiAgICAgIH0sCiAgICAgIEc6IHsKICAgICAgICBpZDogT1BTLnNldFN0cm9rZUdyYXksCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGc6IHsKICAgICAgICBpZDogT1BTLnNldEZpbGxHcmF5LAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBSRzogewogICAgICAgIGlkOiBPUFMuc2V0U3Ryb2tlUkdCQ29sb3IsCiAgICAgICAgbnVtQXJnczogMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHJnOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRGaWxsUkdCQ29sb3IsCiAgICAgICAgbnVtQXJnczogMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEs6IHsKICAgICAgICBpZDogT1BTLnNldFN0cm9rZUNNWUtDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgazogewogICAgICAgIGlkOiBPUFMuc2V0RmlsbENNWUtDb2xvciwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgc2g6IHsKICAgICAgICBpZDogT1BTLnNoYWRpbmdGaWxsLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBCSTogewogICAgICAgIGlkOiBPUFMuYmVnaW5JbmxpbmVJbWFnZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgSUQ6IHsKICAgICAgICBpZDogT1BTLmJlZ2luSW1hZ2VEYXRhLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBFSTogewogICAgICAgIGlkOiBPUFMuZW5kSW5saW5lSW1hZ2UsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIERvOiB7CiAgICAgICAgaWQ6IE9QUy5wYWludFhPYmplY3QsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIE1QOiB7CiAgICAgICAgaWQ6IE9QUy5tYXJrUG9pbnQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIERQOiB7CiAgICAgICAgaWQ6IE9QUy5tYXJrUG9pbnRQcm9wcywKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQk1DOiB7CiAgICAgICAgaWQ6IE9QUy5iZWdpbk1hcmtlZENvbnRlbnQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEJEQzogewogICAgICAgIGlkOiBPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEVNQzogewogICAgICAgIGlkOiBPUFMuZW5kTWFya2VkQ29udGVudCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQlg6IHsKICAgICAgICBpZDogT1BTLmJlZ2luQ29tcGF0LAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBFWDogewogICAgICAgIGlkOiBPUFMuZW5kQ29tcGF0LAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBCTTogbnVsbCwKICAgICAgQkQ6IG51bGwsCiAgICAgIHRydWU6IG51bGwsCiAgICAgIGZhOiBudWxsLAogICAgICBmYWw6IG51bGwsCiAgICAgIGZhbHM6IG51bGwsCiAgICAgIGZhbHNlOiBudWxsLAogICAgICBudTogbnVsbCwKICAgICAgbnVsOiBudWxsLAogICAgICBudWxsOiBudWxsCiAgICB9KSk7CiAgfQogIHN0YXRpYyBNQVhfSU5WQUxJRF9QQVRIX09QUyA9IDEwOwogIGNvbnN0cnVjdG9yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcigpKSB7CiAgICB0aGlzLnBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSwgRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwKSwKICAgICAgeHJlZgogICAgfSk7CiAgICB0aGlzLnN0YXRlTWFuYWdlciA9IHN0YXRlTWFuYWdlcjsKICAgIHRoaXMubm9uUHJvY2Vzc2VkQXJncyA9IFtdOwogICAgdGhpcy5faXNQYXRoT3AgPSBmYWxzZTsKICAgIHRoaXMuX251bUludmFsaWRQYXRoT1BTID0gMDsKICB9CiAgZ2V0IHNhdmVkU3RhdGVzRGVwdGgoKSB7CiAgICByZXR1cm4gdGhpcy5zdGF0ZU1hbmFnZXIuc3RhdGVTdGFjay5sZW5ndGg7CiAgfQogIHJlYWQob3BlcmF0aW9uKSB7CiAgICBsZXQgYXJncyA9IG9wZXJhdGlvbi5hcmdzOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgY29uc3Qgb2JqID0gdGhpcy5wYXJzZXIuZ2V0T2JqKCk7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDbWQpIHsKICAgICAgICBjb25zdCBjbWQgPSBvYmouY21kOwogICAgICAgIGNvbnN0IG9wU3BlYyA9IEV2YWx1YXRvclByZXByb2Nlc3Nvci5vcE1hcFtjbWRdOwogICAgICAgIGlmICghb3BTcGVjKSB7CiAgICAgICAgICB3YXJuKGBVbmtub3duIGNvbW1hbmQgIiR7Y21kfSIuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZm4gPSBvcFNwZWMuaWQ7CiAgICAgICAgY29uc3QgbnVtQXJncyA9IG9wU3BlYy5udW1BcmdzOwogICAgICAgIGxldCBhcmdzTGVuZ3RoID0gYXJncyAhPT0gbnVsbCA/IGFyZ3MubGVuZ3RoIDogMDsKICAgICAgICBpZiAoIXRoaXMuX2lzUGF0aE9wKSB7CiAgICAgICAgICB0aGlzLl9udW1JbnZhbGlkUGF0aE9QUyA9IDA7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2lzUGF0aE9wID0gZm4gPj0gT1BTLm1vdmVUbyAmJiBmbiA8PSBPUFMuZW5kUGF0aDsKICAgICAgICBpZiAoIW9wU3BlYy52YXJpYWJsZUFyZ3MpIHsKICAgICAgICAgIGlmIChhcmdzTGVuZ3RoICE9PSBudW1BcmdzKSB7CiAgICAgICAgICAgIGNvbnN0IG5vblByb2Nlc3NlZEFyZ3MgPSB0aGlzLm5vblByb2Nlc3NlZEFyZ3M7CiAgICAgICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoID4gbnVtQXJncykgewogICAgICAgICAgICAgIG5vblByb2Nlc3NlZEFyZ3MucHVzaChhcmdzLnNoaWZ0KCkpOwogICAgICAgICAgICAgIGFyZ3NMZW5ndGgtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoYXJnc0xlbmd0aCA8IG51bUFyZ3MgJiYgbm9uUHJvY2Vzc2VkQXJncy5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgICBpZiAoYXJncyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgYXJncyA9IFtdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhcmdzLnVuc2hpZnQobm9uUHJvY2Vzc2VkQXJncy5wb3AoKSk7CiAgICAgICAgICAgICAgYXJnc0xlbmd0aCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYXJnc0xlbmd0aCA8IG51bUFyZ3MpIHsKICAgICAgICAgICAgY29uc3QgcGFydGlhbE1zZyA9IGBjb21tYW5kICR7Y21kfTogZXhwZWN0ZWQgJHtudW1BcmdzfSBhcmdzLCBgICsgYGJ1dCByZWNlaXZlZCAke2FyZ3NMZW5ndGh9IGFyZ3MuYDsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzUGF0aE9wICYmICsrdGhpcy5fbnVtSW52YWxpZFBhdGhPUFMgPiBFdmFsdWF0b3JQcmVwcm9jZXNzb3IuTUFYX0lOVkFMSURfUEFUSF9PUFMpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgJHtwYXJ0aWFsTXNnfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdhcm4oYFNraXBwaW5nICR7cGFydGlhbE1zZ31gKTsKICAgICAgICAgICAgaWYgKGFyZ3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChhcmdzTGVuZ3RoID4gbnVtQXJncykgewogICAgICAgICAgaW5mbyhgQ29tbWFuZCAke2NtZH06IGV4cGVjdGVkIFswLCAke251bUFyZ3N9XSBhcmdzLCBgICsgYGJ1dCByZWNlaXZlZCAke2FyZ3NMZW5ndGh9IGFyZ3MuYCk7CiAgICAgICAgfQogICAgICAgIHRoaXMucHJlcHJvY2Vzc0NvbW1hbmQoZm4sIGFyZ3MpOwogICAgICAgIG9wZXJhdGlvbi5mbiA9IGZuOwogICAgICAgIG9wZXJhdGlvbi5hcmdzID0gYXJnczsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAob2JqID09PSBFT0YpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKG9iaiAhPT0gbnVsbCkgewogICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7CiAgICAgICAgICBhcmdzID0gW107CiAgICAgICAgfQogICAgICAgIGFyZ3MucHVzaChvYmopOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDMzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBwcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncykgewogICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgY2FzZSBPUFMuc2F2ZToKICAgICAgICB0aGlzLnN0YXRlTWFuYWdlci5zYXZlKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT1BTLnJlc3RvcmU6CiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIucmVzdG9yZSgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE9QUy50cmFuc2Zvcm06CiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIudHJhbnNmb3JtKGFyZ3MpOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZGVmYXVsdF9hcHBlYXJhbmNlLmpzCgoKCgoKCgoKY2xhc3MgRGVmYXVsdEFwcGVhcmFuY2VFdmFsdWF0b3IgZXh0ZW5kcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3IgewogIGNvbnN0cnVjdG9yKHN0cikgewogICAgc3VwZXIobmV3IFN0cmluZ1N0cmVhbShzdHIpKTsKICB9CiAgcGFyc2UoKSB7CiAgICBjb25zdCBvcGVyYXRpb24gPSB7CiAgICAgIGZuOiAwLAogICAgICBhcmdzOiBbXQogICAgfTsKICAgIGNvbnN0IHJlc3VsdCA9IHsKICAgICAgZm9udFNpemU6IDAsCiAgICAgIGZvbnROYW1lOiAiIiwKICAgICAgZm9udENvbG9yOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMykKICAgIH07CiAgICB0cnkgewogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIG9wZXJhdGlvbi5hcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgaWYgKCF0aGlzLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNhdmVkU3RhdGVzRGVwdGggIT09IDApIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB7CiAgICAgICAgICBmbiwKICAgICAgICAgIGFyZ3MKICAgICAgICB9ID0gb3BlcmF0aW9uOwogICAgICAgIHN3aXRjaCAoZm4gfCAwKSB7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGb250OgogICAgICAgICAgICBjb25zdCBbZm9udE5hbWUsIGZvbnRTaXplXSA9IGFyZ3M7CiAgICAgICAgICAgIGlmIChmb250TmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICByZXN1bHQuZm9udE5hbWUgPSBmb250TmFtZS5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9udFNpemUgPT09ICJudW1iZXIiICYmIGZvbnRTaXplID4gMCkgewogICAgICAgICAgICAgIHJlc3VsdC5mb250U2l6ZSA9IGZvbnRTaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbFJHQkNvbG9yOgogICAgICAgICAgICBDb2xvclNwYWNlVXRpbHMucmdiLmdldFJnYkl0ZW0oYXJncywgMCwgcmVzdWx0LmZvbnRDb2xvciwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbEdyYXk6CiAgICAgICAgICAgIENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYkl0ZW0oYXJncywgMCwgcmVzdWx0LmZvbnRDb2xvciwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENNWUtDb2xvcjoKICAgICAgICAgICAgQ29sb3JTcGFjZVV0aWxzLmNteWsuZ2V0UmdiSXRlbShhcmdzLCAwLCByZXN1bHQuZm9udENvbG9yLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgd2FybihgcGFyc2VEZWZhdWx0QXBwZWFyYW5jZSAtIGlnbm9yaW5nIGVycm9yczogIiR7cmVhc29ufSIuYCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQpmdW5jdGlvbiBwYXJzZURlZmF1bHRBcHBlYXJhbmNlKHN0cikgewogIHJldHVybiBuZXcgRGVmYXVsdEFwcGVhcmFuY2VFdmFsdWF0b3Ioc3RyKS5wYXJzZSgpOwp9CmNsYXNzIEFwcGVhcmFuY2VTdHJlYW1FdmFsdWF0b3IgZXh0ZW5kcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3IgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgZXZhbHVhdG9yT3B0aW9ucywgeHJlZiwgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBzdXBlcihzdHJlYW0pOwogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLmV2YWx1YXRvck9wdGlvbnMgPSBldmFsdWF0b3JPcHRpb25zOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlID0gZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOwogICAgdGhpcy5yZXNvdXJjZXMgPSBzdHJlYW0uZGljdD8uZ2V0KCJSZXNvdXJjZXMiKTsKICB9CiAgcGFyc2UoKSB7CiAgICBjb25zdCBvcGVyYXRpb24gPSB7CiAgICAgIGZuOiAwLAogICAgICBhcmdzOiBbXQogICAgfTsKICAgIGxldCByZXN1bHQgPSB7CiAgICAgIHNjYWxlRmFjdG9yOiAxLAogICAgICBmb250U2l6ZTogMCwKICAgICAgZm9udE5hbWU6ICIiLAogICAgICBmb250Q29sb3I6IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKSwKICAgICAgZmlsbENvbG9yU3BhY2U6IENvbG9yU3BhY2VVdGlscy5ncmF5CiAgICB9OwogICAgbGV0IGJyZWFrTG9vcCA9IGZhbHNlOwogICAgY29uc3Qgc3RhY2sgPSBbXTsKICAgIHRyeSB7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MubGVuZ3RoID0gMDsKICAgICAgICBpZiAoYnJlYWtMb29wIHx8ICF0aGlzLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsKICAgICAgICAgIGZuLAogICAgICAgICAgYXJncwogICAgICAgIH0gPSBvcGVyYXRpb247CiAgICAgICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgICAgIGNhc2UgT1BTLnNhdmU6CiAgICAgICAgICAgIHN0YWNrLnB1c2goewogICAgICAgICAgICAgIHNjYWxlRmFjdG9yOiByZXN1bHQuc2NhbGVGYWN0b3IsCiAgICAgICAgICAgICAgZm9udFNpemU6IHJlc3VsdC5mb250U2l6ZSwKICAgICAgICAgICAgICBmb250TmFtZTogcmVzdWx0LmZvbnROYW1lLAogICAgICAgICAgICAgIGZvbnRDb2xvcjogcmVzdWx0LmZvbnRDb2xvci5zbGljZSgpLAogICAgICAgICAgICAgIGZpbGxDb2xvclNwYWNlOiByZXN1bHQuZmlsbENvbG9yU3BhY2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMucmVzdG9yZToKICAgICAgICAgICAgcmVzdWx0ID0gc3RhY2sucG9wKCkgfHwgcmVzdWx0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFRleHRNYXRyaXg6CiAgICAgICAgICAgIHJlc3VsdC5zY2FsZUZhY3RvciAqPSBNYXRoLmh5cG90KGFyZ3NbMF0sIGFyZ3NbMV0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZvbnQ6CiAgICAgICAgICAgIGNvbnN0IFtmb250TmFtZSwgZm9udFNpemVdID0gYXJnczsKICAgICAgICAgICAgaWYgKGZvbnROYW1lIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICAgIHJlc3VsdC5mb250TmFtZSA9IGZvbnROYW1lLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBmb250U2l6ZSA9PT0gIm51bWJlciIgJiYgZm9udFNpemUgPiAwKSB7CiAgICAgICAgICAgICAgcmVzdWx0LmZvbnRTaXplID0gZm9udFNpemUgKiByZXN1bHQuc2NhbGVGYWN0b3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3JTcGFjZToKICAgICAgICAgICAgcmVzdWx0LmZpbGxDb2xvclNwYWNlID0gQ29sb3JTcGFjZVV0aWxzLnBhcnNlKHsKICAgICAgICAgICAgICBjczogYXJnc1swXSwKICAgICAgICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgICAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcywKICAgICAgICAgICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlOiB0aGlzLl9sb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3I6CiAgICAgICAgICAgIGNvbnN0IGNzID0gcmVzdWx0LmZpbGxDb2xvclNwYWNlOwogICAgICAgICAgICBjcy5nZXRSZ2JJdGVtKGFyZ3MsIDAsIHJlc3VsdC5mb250Q29sb3IsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxSR0JDb2xvcjoKICAgICAgICAgICAgQ29sb3JTcGFjZVV0aWxzLnJnYi5nZXRSZ2JJdGVtKGFyZ3MsIDAsIHJlc3VsdC5mb250Q29sb3IsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OgogICAgICAgICAgICBDb2xvclNwYWNlVXRpbHMuZ3JheS5nZXRSZ2JJdGVtKGFyZ3MsIDAsIHJlc3VsdC5mb250Q29sb3IsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDTVlLQ29sb3I6CiAgICAgICAgICAgIENvbG9yU3BhY2VVdGlscy5jbXlrLmdldFJnYkl0ZW0oYXJncywgMCwgcmVzdWx0LmZvbnRDb2xvciwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1RleHQ6CiAgICAgICAgICBjYXNlIE9QUy5zaG93U3BhY2VkVGV4dDoKICAgICAgICAgIGNhc2UgT1BTLm5leHRMaW5lU2hvd1RleHQ6CiAgICAgICAgICBjYXNlIE9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDoKICAgICAgICAgICAgYnJlYWtMb29wID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgd2FybihgcGFyc2VBcHBlYXJhbmNlU3RyZWFtIC0gaWdub3JpbmcgZXJyb3JzOiAiJHtyZWFzb259Ii5gKTsKICAgIH0KICAgIHRoaXMuc3RyZWFtLnJlc2V0KCk7CiAgICBkZWxldGUgcmVzdWx0LnNjYWxlRmFjdG9yOwogICAgZGVsZXRlIHJlc3VsdC5maWxsQ29sb3JTcGFjZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGdldCBfbG9jYWxDb2xvclNwYWNlQ2FjaGUoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJfbG9jYWxDb2xvclNwYWNlQ2FjaGUiLCBuZXcgTG9jYWxDb2xvclNwYWNlQ2FjaGUoKSk7CiAgfQogIGdldCBfcGRmRnVuY3Rpb25GYWN0b3J5KCkgewogICAgY29uc3QgcGRmRnVuY3Rpb25GYWN0b3J5ID0gbmV3IFBERkZ1bmN0aW9uRmFjdG9yeSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaXNFdmFsU3VwcG9ydGVkOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMuaXNFdmFsU3VwcG9ydGVkCiAgICB9KTsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9wZGZGdW5jdGlvbkZhY3RvcnkiLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUFwcGVhcmFuY2VTdHJlYW0oc3RyZWFtLCBldmFsdWF0b3JPcHRpb25zLCB4cmVmLCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUpIHsKICByZXR1cm4gbmV3IEFwcGVhcmFuY2VTdHJlYW1FdmFsdWF0b3Ioc3RyZWFtLCBldmFsdWF0b3JPcHRpb25zLCB4cmVmLCBnbG9iYWxDb2xvclNwYWNlQ2FjaGUpLnBhcnNlKCk7Cn0KZnVuY3Rpb24gZ2V0UGRmQ29sb3IoY29sb3IsIGlzRmlsbCkgewogIGlmIChjb2xvclswXSA9PT0gY29sb3JbMV0gJiYgY29sb3JbMV0gPT09IGNvbG9yWzJdKSB7CiAgICBjb25zdCBncmF5ID0gY29sb3JbMF0gLyAyNTU7CiAgICByZXR1cm4gYCR7bnVtYmVyVG9TdHJpbmcoZ3JheSl9ICR7aXNGaWxsID8gImciIDogIkcifWA7CiAgfQogIHJldHVybiBBcnJheS5mcm9tKGNvbG9yLCBjID0+IG51bWJlclRvU3RyaW5nKGMgLyAyNTUpKS5qb2luKCIgIikgKyBgICR7aXNGaWxsID8gInJnIiA6ICJSRyJ9YDsKfQpmdW5jdGlvbiBjcmVhdGVEZWZhdWx0QXBwZWFyYW5jZSh7CiAgZm9udFNpemUsCiAgZm9udE5hbWUsCiAgZm9udENvbG9yCn0pIHsKICByZXR1cm4gYC8ke2VzY2FwZVBERk5hbWUoZm9udE5hbWUpfSAke2ZvbnRTaXplfSBUZiAke2dldFBkZkNvbG9yKGZvbnRDb2xvciwgdHJ1ZSl9YDsKfQpjbGFzcyBGYWtlVW5pY29kZUZvbnQgewogIGNvbnN0cnVjdG9yKHhyZWYsIGZvbnRGYW1pbHkpIHsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLndpZHRocyA9IG51bGw7CiAgICB0aGlzLmZpcnN0Q2hhciA9IEluZmluaXR5OwogICAgdGhpcy5sYXN0Q2hhciA9IC1JbmZpbml0eTsKICAgIHRoaXMuZm9udEZhbWlseSA9IGZvbnRGYW1pbHk7CiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpOwogICAgdGhpcy5jdHhNZWFzdXJlID0gY2FudmFzLmdldENvbnRleHQoIjJkIiwgewogICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUKICAgIH0pOwogICAgaWYgKCFGYWtlVW5pY29kZUZvbnQuX2ZvbnROYW1lSWQpIHsKICAgICAgRmFrZVVuaWNvZGVGb250Ll9mb250TmFtZUlkID0gMTsKICAgIH0KICAgIHRoaXMuZm9udE5hbWUgPSBOYW1lLmdldChgSW52YWxpZFBERmpzRm9udF8ke2ZvbnRGYW1pbHl9XyR7RmFrZVVuaWNvZGVGb250Ll9mb250TmFtZUlkKyt9YCk7CiAgfQogIGdldCBmb250RGVzY3JpcHRvclJlZigpIHsKICAgIGlmICghRmFrZVVuaWNvZGVGb250Ll9mb250RGVzY3JpcHRvclJlZikgewogICAgICBjb25zdCBmb250RGVzY3JpcHRvciA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICAgIGZvbnREZXNjcmlwdG9yLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGb250RGVzY3JpcHRvciIpKTsKICAgICAgZm9udERlc2NyaXB0b3Iuc2V0KCJGb250TmFtZSIsIHRoaXMuZm9udE5hbWUpOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkZvbnRGYW1pbHkiLCAiTXlyaWFkUHJvIFJlZ3VsYXIiKTsKICAgICAgZm9udERlc2NyaXB0b3Iuc2V0KCJGb250QkJveCIsIFswLCAwLCAwLCAwXSk7CiAgICAgIGZvbnREZXNjcmlwdG9yLnNldCgiRm9udFN0cmV0Y2giLCBOYW1lLmdldCgiTm9ybWFsIikpOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkZvbnRXZWlnaHQiLCA0MDApOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkl0YWxpY0FuZ2xlIiwgMCk7CiAgICAgIEZha2VVbmljb2RlRm9udC5fZm9udERlc2NyaXB0b3JSZWYgPSB0aGlzLnhyZWYuZ2V0TmV3UGVyc2lzdGVudFJlZihmb250RGVzY3JpcHRvcik7CiAgICB9CiAgICByZXR1cm4gRmFrZVVuaWNvZGVGb250Ll9mb250RGVzY3JpcHRvclJlZjsKICB9CiAgZ2V0IGRlc2NlbmRhbnRGb250UmVmKCkgewogICAgY29uc3QgZGVzY2VuZGFudEZvbnQgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJCYXNlRm9udCIsIHRoaXMuZm9udE5hbWUpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkZvbnQiKSk7CiAgICBkZXNjZW5kYW50Rm9udC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiQ0lERm9udFR5cGUwIikpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJDSURUb0dJRE1hcCIsIE5hbWUuZ2V0KCJJZGVudGl0eSIpKTsKICAgIGRlc2NlbmRhbnRGb250LnNldCgiRmlyc3RDaGFyIiwgdGhpcy5maXJzdENoYXIpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJMYXN0Q2hhciIsIHRoaXMubGFzdENoYXIpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJGb250RGVzY3JpcHRvciIsIHRoaXMuZm9udERlc2NyaXB0b3JSZWYpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJEVyIsIDEwMDApOwogICAgY29uc3Qgd2lkdGhzID0gW107CiAgICBjb25zdCBjaGFycyA9IFsuLi50aGlzLndpZHRocy5lbnRyaWVzKCldLnNvcnQoKTsKICAgIGxldCBjdXJyZW50Q2hhciA9IG51bGw7CiAgICBsZXQgY3VycmVudFdpZHRocyA9IG51bGw7CiAgICBmb3IgKGNvbnN0IFtjaGFyLCB3aWR0aF0gb2YgY2hhcnMpIHsKICAgICAgaWYgKCFjdXJyZW50Q2hhcikgewogICAgICAgIGN1cnJlbnRDaGFyID0gY2hhcjsKICAgICAgICBjdXJyZW50V2lkdGhzID0gW3dpZHRoXTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoY2hhciA9PT0gY3VycmVudENoYXIgKyBjdXJyZW50V2lkdGhzLmxlbmd0aCkgewogICAgICAgIGN1cnJlbnRXaWR0aHMucHVzaCh3aWR0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2lkdGhzLnB1c2goY3VycmVudENoYXIsIGN1cnJlbnRXaWR0aHMpOwogICAgICAgIGN1cnJlbnRDaGFyID0gY2hhcjsKICAgICAgICBjdXJyZW50V2lkdGhzID0gW3dpZHRoXTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRDaGFyKSB7CiAgICAgIHdpZHRocy5wdXNoKGN1cnJlbnRDaGFyLCBjdXJyZW50V2lkdGhzKTsKICAgIH0KICAgIGRlc2NlbmRhbnRGb250LnNldCgiVyIsIHdpZHRocyk7CiAgICBjb25zdCBjaWRTeXN0ZW1JbmZvID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGNpZFN5c3RlbUluZm8uc2V0KCJPcmRlcmluZyIsICJJZGVudGl0eSIpOwogICAgY2lkU3lzdGVtSW5mby5zZXQoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CiAgICBjaWRTeXN0ZW1JbmZvLnNldCgiU3VwcGxlbWVudCIsIDApOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJDSURTeXN0ZW1JbmZvIiwgY2lkU3lzdGVtSW5mbyk7CiAgICByZXR1cm4gdGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYoZGVzY2VuZGFudEZvbnQpOwogIH0KICBnZXQgYmFzZUZvbnRSZWYoKSB7CiAgICBjb25zdCBiYXNlRm9udCA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICBiYXNlRm9udC5zZXQoIkJhc2VGb250IiwgdGhpcy5mb250TmFtZSk7CiAgICBiYXNlRm9udC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRm9udCIpKTsKICAgIGJhc2VGb250LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJUeXBlMCIpKTsKICAgIGJhc2VGb250LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiSWRlbnRpdHktSCIpKTsKICAgIGJhc2VGb250LnNldCgiRGVzY2VuZGFudEZvbnRzIiwgW3RoaXMuZGVzY2VuZGFudEZvbnRSZWZdKTsKICAgIGJhc2VGb250LnNldCgiVG9Vbmljb2RlIiwgTmFtZS5nZXQoIklkZW50aXR5LUgiKSk7CiAgICByZXR1cm4gdGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYoYmFzZUZvbnQpOwogIH0KICBnZXQgcmVzb3VyY2VzKCkgewogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGNvbnN0IGZvbnQgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgZm9udC5zZXQodGhpcy5mb250TmFtZS5uYW1lLCB0aGlzLmJhc2VGb250UmVmKTsKICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIHJldHVybiByZXNvdXJjZXM7CiAgfQogIF9jcmVhdGVDb250ZXh0KCkgewogICAgdGhpcy53aWR0aHMgPSBuZXcgTWFwKCk7CiAgICB0aGlzLmN0eE1lYXN1cmUuZm9udCA9IGAxMDAwcHggJHt0aGlzLmZvbnRGYW1pbHl9YDsKICAgIHJldHVybiB0aGlzLmN0eE1lYXN1cmU7CiAgfQogIGNyZWF0ZUZvbnRSZXNvdXJjZXModGV4dCkgewogICAgY29uc3QgY3R4ID0gdGhpcy5fY3JlYXRlQ29udGV4dCgpOwogICAgZm9yIChjb25zdCBsaW5lIG9mIHRleHQuc3BsaXQoL1xyXG4/fFxuLykpIHsKICAgICAgZm9yIChjb25zdCBjaGFyIG9mIGxpbmUuc3BsaXQoIiIpKSB7CiAgICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTsKICAgICAgICBpZiAodGhpcy53aWR0aHMuaGFzKGNvZGUpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWV0cmljcyA9IGN0eC5tZWFzdXJlVGV4dChjaGFyKTsKICAgICAgICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChtZXRyaWNzLndpZHRoKTsKICAgICAgICB0aGlzLndpZHRocy5zZXQoY29kZSwgd2lkdGgpOwogICAgICAgIHRoaXMuZmlyc3RDaGFyID0gTWF0aC5taW4oY29kZSwgdGhpcy5maXJzdENoYXIpOwogICAgICAgIHRoaXMubGFzdENoYXIgPSBNYXRoLm1heChjb2RlLCB0aGlzLmxhc3RDaGFyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzOwogIH0KICBzdGF0aWMgZ2V0Rmlyc3RQb3NpdGlvbkluZm8ocmVjdCwgcm90YXRpb24sIGZvbnRTaXplKSB7CiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gcmVjdDsKICAgIGxldCB3ID0geDIgLSB4MTsKICAgIGxldCBoID0geTIgLSB5MTsKICAgIGlmIChyb3RhdGlvbiAlIDE4MCAhPT0gMCkgewogICAgICBbdywgaF0gPSBbaCwgd107CiAgICB9CiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gTElORV9GQUNUT1IgKiBmb250U2l6ZTsKICAgIGNvbnN0IGxpbmVEZXNjZW50ID0gTElORV9ERVNDRU5UX0ZBQ1RPUiAqIGZvbnRTaXplOwogICAgcmV0dXJuIHsKICAgICAgY29vcmRzOiBbMCwgaCArIGxpbmVEZXNjZW50IC0gbGluZUhlaWdodF0sCiAgICAgIGJib3g6IFswLCAwLCB3LCBoXSwKICAgICAgbWF0cml4OiByb3RhdGlvbiAhPT0gMCA/IGdldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uLCBoLCBsaW5lSGVpZ2h0KSA6IHVuZGVmaW5lZAogICAgfTsKICB9CiAgY3JlYXRlQXBwZWFyYW5jZSh0ZXh0LCByZWN0LCByb3RhdGlvbiwgZm9udFNpemUsIGJnQ29sb3IsIHN0cm9rZUFscGhhKSB7CiAgICBjb25zdCBjdHggPSB0aGlzLl9jcmVhdGVDb250ZXh0KCk7CiAgICBjb25zdCBsaW5lcyA9IFtdOwogICAgbGV0IG1heFdpZHRoID0gLUluZmluaXR5OwogICAgZm9yIChjb25zdCBsaW5lIG9mIHRleHQuc3BsaXQoL1xyXG4/fFxuLykpIHsKICAgICAgbGluZXMucHVzaChsaW5lKTsKICAgICAgY29uc3QgbGluZVdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGxpbmUpLndpZHRoOwogICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBsaW5lV2lkdGgpOwogICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgY29kZVBvaW50SXRlcihsaW5lKSkgewogICAgICAgIGNvbnN0IGNoYXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlKTsKICAgICAgICBsZXQgd2lkdGggPSB0aGlzLndpZHRocy5nZXQoY29kZSk7CiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQoY2hhcik7CiAgICAgICAgICB3aWR0aCA9IE1hdGguY2VpbChtZXRyaWNzLndpZHRoKTsKICAgICAgICAgIHRoaXMud2lkdGhzLnNldChjb2RlLCB3aWR0aCk7CiAgICAgICAgICB0aGlzLmZpcnN0Q2hhciA9IE1hdGgubWluKGNvZGUsIHRoaXMuZmlyc3RDaGFyKTsKICAgICAgICAgIHRoaXMubGFzdENoYXIgPSBNYXRoLm1heChjb2RlLCB0aGlzLmxhc3RDaGFyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1heFdpZHRoICo9IGZvbnRTaXplIC8gMTAwMDsKICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSByZWN0OwogICAgbGV0IHcgPSB4MiAtIHgxOwogICAgbGV0IGggPSB5MiAtIHkxOwogICAgaWYgKHJvdGF0aW9uICUgMTgwICE9PSAwKSB7CiAgICAgIFt3LCBoXSA9IFtoLCB3XTsKICAgIH0KICAgIGxldCBoc2NhbGUgPSAxOwogICAgaWYgKG1heFdpZHRoID4gdykgewogICAgICBoc2NhbGUgPSB3IC8gbWF4V2lkdGg7CiAgICB9CiAgICBsZXQgdnNjYWxlID0gMTsKICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBMSU5FX0ZBQ1RPUiAqIGZvbnRTaXplOwogICAgY29uc3QgbGluZURlc2NlbnQgPSBMSU5FX0RFU0NFTlRfRkFDVE9SICogZm9udFNpemU7CiAgICBjb25zdCBtYXhIZWlnaHQgPSBsaW5lSGVpZ2h0ICogbGluZXMubGVuZ3RoOwogICAgaWYgKG1heEhlaWdodCA+IGgpIHsKICAgICAgdnNjYWxlID0gaCAvIG1heEhlaWdodDsKICAgIH0KICAgIGNvbnN0IGZzY2FsZSA9IE1hdGgubWluKGhzY2FsZSwgdnNjYWxlKTsKICAgIGNvbnN0IG5ld0ZvbnRTaXplID0gZm9udFNpemUgKiBmc2NhbGU7CiAgICBjb25zdCBidWZmZXIgPSBbInEiLCBgMCAwICR7bnVtYmVyVG9TdHJpbmcodyl9ICR7bnVtYmVyVG9TdHJpbmcoaCl9IHJlIFcgbmAsIGBCVGAsIGAxIDAgMCAxIDAgJHtudW1iZXJUb1N0cmluZyhoICsgbGluZURlc2NlbnQpfSBUbSAwIFRjICR7Z2V0UGRmQ29sb3IoYmdDb2xvciwgdHJ1ZSl9YCwgYC8ke3RoaXMuZm9udE5hbWUubmFtZX0gJHtudW1iZXJUb1N0cmluZyhuZXdGb250U2l6ZSl9IFRmYF07CiAgICBjb25zdCB7CiAgICAgIHJlc291cmNlcwogICAgfSA9IHRoaXM7CiAgICBzdHJva2VBbHBoYSA9IHR5cGVvZiBzdHJva2VBbHBoYSA9PT0gIm51bWJlciIgJiYgc3Ryb2tlQWxwaGEgPj0gMCAmJiBzdHJva2VBbHBoYSA8PSAxID8gc3Ryb2tlQWxwaGEgOiAxOwogICAgaWYgKHN0cm9rZUFscGhhICE9PSAxKSB7CiAgICAgIGJ1ZmZlci5wdXNoKCIvUjAgZ3MiKTsKICAgICAgY29uc3QgZXh0R1N0YXRlID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgICAgY29uc3QgcjAgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgICByMC5zZXQoImNhIiwgc3Ryb2tlQWxwaGEpOwogICAgICByMC5zZXQoIkNBIiwgc3Ryb2tlQWxwaGEpOwogICAgICByMC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRXh0R1N0YXRlIikpOwogICAgICBleHRHU3RhdGUuc2V0KCJSMCIsIHIwKTsKICAgICAgcmVzb3VyY2VzLnNldCgiRXh0R1N0YXRlIiwgZXh0R1N0YXRlKTsKICAgIH0KICAgIGNvbnN0IHZTaGlmdCA9IG51bWJlclRvU3RyaW5nKGxpbmVIZWlnaHQpOwogICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAwIC0ke3ZTaGlmdH0gVGQgPCR7c3RyaW5nVG9VVEYxNkhleFN0cmluZyhsaW5lKX0+IFRqYCk7CiAgICB9CiAgICBidWZmZXIucHVzaCgiRVQiLCAiUSIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiWE9iamVjdCIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiQkJveCIsIFswLCAwLCB3LCBoXSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIGlmIChyb3RhdGlvbikgewogICAgICBjb25zdCBtYXRyaXggPSBnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbiwgdywgaCk7CiAgICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTWF0cml4IiwgbWF0cml4KTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybiBhcDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL25hbWVfbnVtYmVyX3RyZWUuanMKCgpjbGFzcyBOYW1lT3JOdW1iZXJUcmVlIHsKICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmLCB0eXBlKSB7CiAgICB0aGlzLnJvb3QgPSByb290OwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuX3R5cGUgPSB0eXBlOwogIH0KICBnZXRBbGwoKSB7CiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICBpZiAoIXRoaXMucm9vdCkgewogICAgICByZXR1cm4gbWFwOwogICAgfQogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBSZWZTZXQoKTsKICAgIHByb2Nlc3NlZC5wdXQodGhpcy5yb290KTsKICAgIGNvbnN0IHF1ZXVlID0gW3RoaXMucm9vdF07CiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBvYmogPSB4cmVmLmZldGNoSWZSZWYocXVldWUuc2hpZnQoKSk7CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG9iai5oYXMoIktpZHMiKSkgewogICAgICAgIGNvbnN0IGtpZHMgPSBvYmouZ2V0KCJLaWRzIik7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgICAgaWYgKHByb2Nlc3NlZC5oYXMoa2lkKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYER1cGxpY2F0ZSBlbnRyeSBpbiAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTsKICAgICAgICAgIH0KICAgICAgICAgIHF1ZXVlLnB1c2goa2lkKTsKICAgICAgICAgIHByb2Nlc3NlZC5wdXQoa2lkKTsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgZW50cmllcyA9IG9iai5nZXQodGhpcy5fdHlwZSk7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGVudHJpZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICAgIG1hcC5zZXQoeHJlZi5mZXRjaElmUmVmKGVudHJpZXNbaV0pLCB4cmVmLmZldGNoSWZSZWYoZW50cmllc1tpICsgMV0pKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgZ2V0UmF3KGtleSkgewogICAgaWYgKCF0aGlzLnJvb3QpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOwogICAgbGV0IGtpZHNPckVudHJpZXMgPSB4cmVmLmZldGNoSWZSZWYodGhpcy5yb290KTsKICAgIGxldCBsb29wQ291bnQgPSAwOwogICAgY29uc3QgTUFYX0xFVkVMUyA9IDEwOwogICAgd2hpbGUgKGtpZHNPckVudHJpZXMuaGFzKCJLaWRzIikpIHsKICAgICAgaWYgKCsrbG9vcENvdW50ID4gTUFYX0xFVkVMUykgewogICAgICAgIHdhcm4oYFNlYXJjaCBkZXB0aCBsaW1pdCByZWFjaGVkIGZvciAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBraWRzID0ga2lkc09yRW50cmllcy5nZXQoIktpZHMiKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgbGV0IGwgPSAwLAogICAgICAgIHIgPSBraWRzLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChsIDw9IHIpIHsKICAgICAgICBjb25zdCBtID0gbCArIHIgPj4gMTsKICAgICAgICBjb25zdCBraWQgPSB4cmVmLmZldGNoSWZSZWYoa2lkc1ttXSk7CiAgICAgICAgY29uc3QgbGltaXRzID0ga2lkLmdldCgiTGltaXRzIik7CiAgICAgICAgaWYgKGtleSA8IHhyZWYuZmV0Y2hJZlJlZihsaW1pdHNbMF0pKSB7CiAgICAgICAgICByID0gbSAtIDE7CiAgICAgICAgfSBlbHNlIGlmIChrZXkgPiB4cmVmLmZldGNoSWZSZWYobGltaXRzWzFdKSkgewogICAgICAgICAgbCA9IG0gKyAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBraWRzT3JFbnRyaWVzID0ga2lkOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChsID4gcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBjb25zdCBlbnRyaWVzID0ga2lkc09yRW50cmllcy5nZXQodGhpcy5fdHlwZSk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgewogICAgICBsZXQgbCA9IDAsCiAgICAgICAgciA9IGVudHJpZXMubGVuZ3RoIC0gMjsKICAgICAgd2hpbGUgKGwgPD0gcikgewogICAgICAgIGNvbnN0IHRtcCA9IGwgKyByID4+IDEsCiAgICAgICAgICBtID0gdG1wICsgKHRtcCAmIDEpOwogICAgICAgIGNvbnN0IGN1cnJlbnRLZXkgPSB4cmVmLmZldGNoSWZSZWYoZW50cmllc1ttXSk7CiAgICAgICAgaWYgKGtleSA8IGN1cnJlbnRLZXkpIHsKICAgICAgICAgIHIgPSBtIC0gMjsKICAgICAgICB9IGVsc2UgaWYgKGtleSA+IGN1cnJlbnRLZXkpIHsKICAgICAgICAgIGwgPSBtICsgMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGVudHJpZXNbbSArIDFdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldChrZXkpIHsKICAgIHJldHVybiB0aGlzLnhyZWYuZmV0Y2hJZlJlZih0aGlzLmdldFJhdyhrZXkpKTsKICB9Cn0KY2xhc3MgTmFtZVRyZWUgZXh0ZW5kcyBOYW1lT3JOdW1iZXJUcmVlIHsKICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmKSB7CiAgICBzdXBlcihyb290LCB4cmVmLCAiTmFtZXMiKTsKICB9Cn0KY2xhc3MgTnVtYmVyVHJlZSBleHRlbmRzIE5hbWVPck51bWJlclRyZWUgewogIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYpIHsKICAgIHN1cGVyKHJvb3QsIHhyZWYsICJOdW1zIik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jbGVhbnVwX2hlbHBlci5qcwoKCgoKZnVuY3Rpb24gY2xlYXJHbG9iYWxDYWNoZXMoKSB7CiAgY2xlYXJQYXR0ZXJuQ2FjaGVzKCk7CiAgY2xlYXJQcmltaXRpdmVDYWNoZXMoKTsKICBjbGVhclVuaWNvZGVDYWNoZXMoKTsKICBKcHhJbWFnZS5jbGVhbnVwKCk7Cn0KCjsvLyAuL3NyYy9jb3JlL2ZpbGVfc3BlYy5qcwoKCgpmdW5jdGlvbiBwaWNrUGxhdGZvcm1JdGVtKGRpY3QpIHsKICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAoZGljdC5oYXMoIlVGIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiVUYiKTsKICB9IGVsc2UgaWYgKGRpY3QuaGFzKCJGIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiRiIpOwogIH0gZWxzZSBpZiAoZGljdC5oYXMoIlVuaXgiKSkgewogICAgcmV0dXJuIGRpY3QuZ2V0KCJVbml4Iik7CiAgfSBlbHNlIGlmIChkaWN0LmhhcygiTWFjIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiTWFjIik7CiAgfSBlbHNlIGlmIChkaWN0LmhhcygiRE9TIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiRE9TIik7CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIHN0cmlwUGF0aChzdHIpIHsKICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGFzdEluZGV4T2YoIi8iKSArIDEpOwp9CmNsYXNzIEZpbGVTcGVjIHsKICAjY29udGVudEF2YWlsYWJsZSA9IGZhbHNlOwogIGNvbnN0cnVjdG9yKHJvb3QsIHhyZWYsIHNraXBDb250ZW50ID0gZmFsc2UpIHsKICAgIGlmICghKHJvb3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5yb290ID0gcm9vdDsKICAgIGlmIChyb290LmhhcygiRlMiKSkgewogICAgICB0aGlzLmZzID0gcm9vdC5nZXQoIkZTIik7CiAgICB9CiAgICBpZiAocm9vdC5oYXMoIlJGIikpIHsKICAgICAgd2FybigiUmVsYXRlZCBmaWxlIHNwZWNpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICB9CiAgICBpZiAoIXNraXBDb250ZW50KSB7CiAgICAgIGlmIChyb290LmhhcygiRUYiKSkgewogICAgICAgIHRoaXMuI2NvbnRlbnRBdmFpbGFibGUgPSB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIk5vbi1lbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0IGZpbGVuYW1lKCkgewogICAgbGV0IGZpbGVuYW1lID0gIiI7CiAgICBjb25zdCBpdGVtID0gcGlja1BsYXRmb3JtSXRlbSh0aGlzLnJvb3QpOwogICAgaWYgKGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICJzdHJpbmciKSB7CiAgICAgIGZpbGVuYW1lID0gc3RyaW5nVG9QREZTdHJpbmcoaXRlbSkucmVwbGFjZUFsbCgiXFxcXCIsICJcXCIpLnJlcGxhY2VBbGwoIlxcLyIsICIvIikucmVwbGFjZUFsbCgiXFwiLCAiLyIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZmlsZW5hbWUiLCBmaWxlbmFtZSB8fCAidW5uYW1lZCIpOwogIH0KICBnZXQgY29udGVudCgpIHsKICAgIGlmICghdGhpcy4jY29udGVudEF2YWlsYWJsZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRoaXMuX2NvbnRlbnRSZWYgfHw9IHBpY2tQbGF0Zm9ybUl0ZW0odGhpcy5yb290Py5nZXQoIkVGIikpOwogICAgbGV0IGNvbnRlbnQgPSBudWxsOwogICAgaWYgKHRoaXMuX2NvbnRlbnRSZWYpIHsKICAgICAgY29uc3QgZmlsZU9iaiA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHRoaXMuX2NvbnRlbnRSZWYpOwogICAgICBpZiAoZmlsZU9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICBjb250ZW50ID0gZmlsZU9iai5nZXRCeXRlcygpOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIkVtYmVkZGVkIGZpbGUgc3BlY2lmaWNhdGlvbiBwb2ludHMgdG8gbm9uLWV4aXN0aW5nL2ludmFsaWQgY29udGVudCIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB3YXJuKCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudCIpOwogICAgfQogICAgcmV0dXJuIGNvbnRlbnQ7CiAgfQogIGdldCBkZXNjcmlwdGlvbigpIHsKICAgIGxldCBkZXNjcmlwdGlvbiA9ICIiOwogICAgY29uc3QgZGVzYyA9IHRoaXMucm9vdD8uZ2V0KCJEZXNjIik7CiAgICBpZiAoZGVzYyAmJiB0eXBlb2YgZGVzYyA9PT0gInN0cmluZyIpIHsKICAgICAgZGVzY3JpcHRpb24gPSBzdHJpbmdUb1BERlN0cmluZyhkZXNjKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOwogIH0KICBnZXQgc2VyaWFsaXphYmxlKCkgewogICAgcmV0dXJuIHsKICAgICAgcmF3RmlsZW5hbWU6IHRoaXMuZmlsZW5hbWUsCiAgICAgIGZpbGVuYW1lOiBzdHJpcFBhdGgodGhpcy5maWxlbmFtZSksCiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCwKICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24KICAgIH07CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94bWxfcGFyc2VyLmpzCgpjb25zdCBYTUxQYXJzZXJFcnJvckNvZGUgPSB7CiAgTm9FcnJvcjogMCwKICBFbmRPZkRvY3VtZW50OiAtMSwKICBVbnRlcm1pbmF0ZWRDZGF0OiAtMiwKICBVbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbjogLTMsCiAgVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uOiAtNCwKICBVbnRlcm1pbmF0ZWRDb21tZW50OiAtNSwKICBNYWxmb3JtZWRFbGVtZW50OiAtNiwKICBPdXRPZk1lbW9yeTogLTcsCiAgVW50ZXJtaW5hdGVkQXR0cmlidXRlVmFsdWU6IC04LAogIFVudGVybWluYXRlZEVsZW1lbnQ6IC05LAogIEVsZW1lbnROZXZlckJlZ3VuOiAtMTAKfTsKZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKHMsIGluZGV4KSB7CiAgY29uc3QgY2ggPSBzW2luZGV4XTsKICByZXR1cm4gY2ggPT09ICIgIiB8fCBjaCA9PT0gIlxuIiB8fCBjaCA9PT0gIlxyIiB8fCBjaCA9PT0gIlx0IjsKfQpmdW5jdGlvbiBpc1doaXRlc3BhY2VTdHJpbmcocykgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgaWYgKCFpc1doaXRlc3BhY2UocywgaSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQpjbGFzcyBYTUxQYXJzZXJCYXNlIHsKICBfcmVzb2x2ZUVudGl0aWVzKHMpIHsKICAgIHJldHVybiBzLnJlcGxhY2VBbGwoLyYoW147XSspOy9nLCAoYWxsLCBlbnRpdHkpID0+IHsKICAgICAgaWYgKGVudGl0eS5zdWJzdHJpbmcoMCwgMikgPT09ICIjeCIpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygyKSwgMTYpKTsKICAgICAgfSBlbHNlIGlmIChlbnRpdHkuc3Vic3RyaW5nKDAsIDEpID09PSAiIyIpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygxKSwgMTApKTsKICAgICAgfQogICAgICBzd2l0Y2ggKGVudGl0eSkgewogICAgICAgIGNhc2UgImx0IjoKICAgICAgICAgIHJldHVybiAiPCI7CiAgICAgICAgY2FzZSAiZ3QiOgogICAgICAgICAgcmV0dXJuICI+IjsKICAgICAgICBjYXNlICJhbXAiOgogICAgICAgICAgcmV0dXJuICImIjsKICAgICAgICBjYXNlICJxdW90IjoKICAgICAgICAgIHJldHVybiAnIic7CiAgICAgICAgY2FzZSAiYXBvcyI6CiAgICAgICAgICByZXR1cm4gIiciOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLm9uUmVzb2x2ZUVudGl0eShlbnRpdHkpOwogICAgfSk7CiAgfQogIF9wYXJzZUNvbnRlbnQocywgc3RhcnQpIHsKICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXTsKICAgIGxldCBwb3MgPSBzdGFydDsKICAgIGZ1bmN0aW9uIHNraXBXcygpIHsKICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShzLCBwb3MpKSB7CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgIH0KICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPiIgJiYgc1twb3NdICE9PSAiLyIpIHsKICAgICAgKytwb3M7CiAgICB9CiAgICBjb25zdCBuYW1lID0gcy5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CiAgICBza2lwV3MoKTsKICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICIvIiAmJiBzW3Bvc10gIT09ICI/IikgewogICAgICBza2lwV3MoKTsKICAgICAgbGV0IGF0dHJOYW1lID0gIiIsCiAgICAgICAgYXR0clZhbHVlID0gIiI7CiAgICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPSIpIHsKICAgICAgICBhdHRyTmFtZSArPSBzW3Bvc107CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgICAgc2tpcFdzKCk7CiAgICAgIGlmIChzW3Bvc10gIT09ICI9IikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgICsrcG9zOwogICAgICBza2lwV3MoKTsKICAgICAgY29uc3QgYXR0ckVuZENoYXIgPSBzW3Bvc107CiAgICAgIGlmIChhdHRyRW5kQ2hhciAhPT0gJyInICYmIGF0dHJFbmRDaGFyICE9PSAiJyIpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBhdHRyRW5kSW5kZXggPSBzLmluZGV4T2YoYXR0ckVuZENoYXIsICsrcG9zKTsKICAgICAgaWYgKGF0dHJFbmRJbmRleCA8IDApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBhdHRyVmFsdWUgPSBzLnN1YnN0cmluZyhwb3MsIGF0dHJFbmRJbmRleCk7CiAgICAgIGF0dHJpYnV0ZXMucHVzaCh7CiAgICAgICAgbmFtZTogYXR0ck5hbWUsCiAgICAgICAgdmFsdWU6IHRoaXMuX3Jlc29sdmVFbnRpdGllcyhhdHRyVmFsdWUpCiAgICAgIH0pOwogICAgICBwb3MgPSBhdHRyRW5kSW5kZXggKyAxOwogICAgICBza2lwV3MoKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIG5hbWUsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIHBhcnNlZDogcG9zIC0gc3RhcnQKICAgIH07CiAgfQogIF9wYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihzLCBzdGFydCkgewogICAgbGV0IHBvcyA9IHN0YXJ0OwogICAgZnVuY3Rpb24gc2tpcFdzKCkgewogICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgaXNXaGl0ZXNwYWNlKHMsIHBvcykpIHsKICAgICAgICArK3BvczsKICAgICAgfQogICAgfQogICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmICFpc1doaXRlc3BhY2UocywgcG9zKSAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICI/IiAmJiBzW3Bvc10gIT09ICIvIikgewogICAgICArK3BvczsKICAgIH0KICAgIGNvbnN0IG5hbWUgPSBzLnN1YnN0cmluZyhzdGFydCwgcG9zKTsKICAgIHNraXBXcygpOwogICAgY29uc3QgYXR0clN0YXJ0ID0gcG9zOwogICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIChzW3Bvc10gIT09ICI/IiB8fCBzW3BvcyArIDFdICE9PSAiPiIpKSB7CiAgICAgICsrcG9zOwogICAgfQogICAgY29uc3QgdmFsdWUgPSBzLnN1YnN0cmluZyhhdHRyU3RhcnQsIHBvcyk7CiAgICByZXR1cm4gewogICAgICBuYW1lLAogICAgICB2YWx1ZSwKICAgICAgcGFyc2VkOiBwb3MgLSBzdGFydAogICAgfTsKICB9CiAgcGFyc2VYbWwocykgewogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBzLmxlbmd0aCkgewogICAgICBjb25zdCBjaCA9IHNbaV07CiAgICAgIGxldCBqID0gaTsKICAgICAgaWYgKGNoID09PSAiPCIpIHsKICAgICAgICArK2o7CiAgICAgICAgY29uc3QgY2gyID0gc1tqXTsKICAgICAgICBsZXQgcTsKICAgICAgICBzd2l0Y2ggKGNoMikgewogICAgICAgICAgY2FzZSAiLyI6CiAgICAgICAgICAgICsrajsKICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGopOwogICAgICAgICAgICBpZiAocSA8IDApIHsKICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZEVsZW1lbnQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uRW5kRWxlbWVudChzLnN1YnN0cmluZyhqLCBxKSk7CiAgICAgICAgICAgIGogPSBxICsgMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICI/IjoKICAgICAgICAgICAgKytqOwogICAgICAgICAgICBjb25zdCBwaSA9IHRoaXMuX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHMsIGopOwogICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIHBpLnBhcnNlZCwgaiArIHBpLnBhcnNlZCArIDIpICE9PSAiPz4iKSB7CiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbik7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMub25QaShwaS5uYW1lLCBwaS52YWx1ZSk7CiAgICAgICAgICAgIGogKz0gcGkucGFyc2VkICsgMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICIhIjoKICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyAxLCBqICsgMykgPT09ICItLSIpIHsKICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCItLT4iLCBqICsgMyk7CiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENvbW1lbnQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLm9uQ29tbWVudChzLnN1YnN0cmluZyhqICsgMywgcSkpOwogICAgICAgICAgICAgIGogPSBxICsgMzsKICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgMSwgaiArIDgpID09PSAiW0NEQVRBWyIpIHsKICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCJdXT4iLCBqICsgOCk7CiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENkYXQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLm9uQ2RhdGEocy5zdWJzdHJpbmcoaiArIDgsIHEpKTsKICAgICAgICAgICAgICBqID0gcSArIDM7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zdWJzdHJpbmcoaiArIDEsIGogKyA4KSA9PT0gIkRPQ1RZUEUiKSB7CiAgICAgICAgICAgICAgY29uc3QgcTIgPSBzLmluZGV4T2YoIlsiLCBqICsgOCk7CiAgICAgICAgICAgICAgbGV0IGNvbXBsZXhEb2N0eXBlID0gZmFsc2U7CiAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGogKyA4KTsKICAgICAgICAgICAgICBpZiAocSA8IDApIHsKICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHEyID4gMCAmJiBxID4gcTIpIHsKICAgICAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoIl0+IiwgaiArIDgpOwogICAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29tcGxleERvY3R5cGUgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBkb2N0eXBlQ29udGVudCA9IHMuc3Vic3RyaW5nKGogKyA4LCBxICsgKGNvbXBsZXhEb2N0eXBlID8gMSA6IDApKTsKICAgICAgICAgICAgICB0aGlzLm9uRG9jdHlwZShkb2N0eXBlQ29udGVudCk7CiAgICAgICAgICAgICAgaiA9IHEgKyAoY29tcGxleERvY3R5cGUgPyAyIDogMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5NYWxmb3JtZWRFbGVtZW50KTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fcGFyc2VDb250ZW50KHMsIGopOwogICAgICAgICAgICBpZiAoY29udGVudCA9PT0gbnVsbCkgewogICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuTWFsZm9ybWVkRWxlbWVudCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBpc0Nsb3NlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIGNvbnRlbnQucGFyc2VkLCBqICsgY29udGVudC5wYXJzZWQgKyAyKSA9PT0gIi8+IikgewogICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgY29udGVudC5wYXJzZWQsIGogKyBjb250ZW50LnBhcnNlZCArIDEpICE9PSAiPiIpIHsKICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZEVsZW1lbnQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uQmVnaW5FbGVtZW50KGNvbnRlbnQubmFtZSwgY29udGVudC5hdHRyaWJ1dGVzLCBpc0Nsb3NlZCk7CiAgICAgICAgICAgIGogKz0gY29udGVudC5wYXJzZWQgKyAoaXNDbG9zZWQgPyAyIDogMSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoaiA8IHMubGVuZ3RoICYmIHNbal0gIT09ICI8IikgewogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBjb25zdCB0ZXh0ID0gcy5zdWJzdHJpbmcoaSwgaik7CiAgICAgICAgdGhpcy5vblRleHQodGhpcy5fcmVzb2x2ZUVudGl0aWVzKHRleHQpKTsKICAgICAgfQogICAgICBpID0gajsKICAgIH0KICB9CiAgb25SZXNvbHZlRW50aXR5KG5hbWUpIHsKICAgIHJldHVybiBgJiR7bmFtZX07YDsKICB9CiAgb25QaShuYW1lLCB2YWx1ZSkge30KICBvbkNvbW1lbnQodGV4dCkge30KICBvbkNkYXRhKHRleHQpIHt9CiAgb25Eb2N0eXBlKGRvY3R5cGVDb250ZW50KSB7fQogIG9uVGV4dCh0ZXh0KSB7fQogIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHt9CiAgb25FbmRFbGVtZW50KG5hbWUpIHt9CiAgb25FcnJvcihjb2RlKSB7fQp9CmNsYXNzIFNpbXBsZURPTU5vZGUgewogIGNvbnN0cnVjdG9yKG5vZGVOYW1lLCBub2RlVmFsdWUpIHsKICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKICAgIHRoaXMubm9kZVZhbHVlID0gbm9kZVZhbHVlOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJwYXJlbnROb2RlIiwgewogICAgICB2YWx1ZTogbnVsbCwKICAgICAgd3JpdGFibGU6IHRydWUKICAgIH0pOwogIH0KICBnZXQgZmlyc3RDaGlsZCgpIHsKICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM/LlswXTsKICB9CiAgZ2V0IG5leHRTaWJsaW5nKCkgewogICAgY29uc3QgY2hpbGROb2RlcyA9IHRoaXMucGFyZW50Tm9kZS5jaGlsZE5vZGVzOwogICAgaWYgKCFjaGlsZE5vZGVzKSB7CiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICBjb25zdCBpbmRleCA9IGNoaWxkTm9kZXMuaW5kZXhPZih0aGlzKTsKICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiBjaGlsZE5vZGVzW2luZGV4ICsgMV07CiAgfQogIGdldCB0ZXh0Q29udGVudCgpIHsKICAgIGlmICghdGhpcy5jaGlsZE5vZGVzKSB7CiAgICAgIHJldHVybiB0aGlzLm5vZGVWYWx1ZSB8fCAiIjsKICAgIH0KICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXMubWFwKGNoaWxkID0+IGNoaWxkLnRleHRDb250ZW50KS5qb2luKCIiKTsKICB9CiAgZ2V0IGNoaWxkcmVuKCkgewogICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlcyB8fCBbXTsKICB9CiAgaGFzQ2hpbGROb2RlcygpIHsKICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM/Lmxlbmd0aCA+IDA7CiAgfQogIHNlYXJjaE5vZGUocGF0aHMsIHBvcykgewogICAgaWYgKHBvcyA+PSBwYXRocy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjb25zdCBjb21wb25lbnQgPSBwYXRoc1twb3NdOwogICAgaWYgKGNvbXBvbmVudC5uYW1lLnN0YXJ0c1dpdGgoIiMiKSAmJiBwb3MgPCBwYXRocy5sZW5ndGggLSAxKSB7CiAgICAgIHJldHVybiB0aGlzLnNlYXJjaE5vZGUocGF0aHMsIHBvcyArIDEpOwogICAgfQogICAgY29uc3Qgc3RhY2sgPSBbXTsKICAgIGxldCBub2RlID0gdGhpczsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChjb21wb25lbnQubmFtZSA9PT0gbm9kZS5ub2RlTmFtZSkgewogICAgICAgIGlmIChjb21wb25lbnQucG9zID09PSAwKSB7CiAgICAgICAgICBjb25zdCByZXMgPSBub2RlLnNlYXJjaE5vZGUocGF0aHMsIHBvcyArIDEpOwogICAgICAgICAgaWYgKHJlcyAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgW3BhcmVudF0gPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGxldCBzaWJsaW5nUG9zID0gMDsKICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgcGFyZW50LmNoaWxkTm9kZXMpIHsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lID09PSBjaGlsZC5ub2RlTmFtZSkgewogICAgICAgICAgICAgIGlmIChzaWJsaW5nUG9zID09PSBjb21wb25lbnQucG9zKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2VhcmNoTm9kZShwYXRocywgcG9zICsgMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNpYmxpbmdQb3MrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5vZGUuc2VhcmNoTm9kZShwYXRocywgcG9zICsgMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChub2RlLmNoaWxkTm9kZXM/Lmxlbmd0aCA+IDApIHsKICAgICAgICBzdGFjay5wdXNoKFtub2RlLCAwXSk7CiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1swXTsKICAgICAgfSBlbHNlIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBjb25zdCBbcGFyZW50LCBjdXJyZW50UG9zXSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgY29uc3QgbmV3UG9zID0gY3VycmVudFBvcyArIDE7CiAgICAgICAgICBpZiAobmV3UG9zIDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goW3BhcmVudCwgbmV3UG9zXSk7CiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQuY2hpbGROb2Rlc1tuZXdQb3NdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGR1bXAoYnVmZmVyKSB7CiAgICBpZiAodGhpcy5ub2RlTmFtZSA9PT0gIiN0ZXh0IikgewogICAgICBidWZmZXIucHVzaChlbmNvZGVUb1htbFN0cmluZyh0aGlzLm5vZGVWYWx1ZSkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBidWZmZXIucHVzaChgPCR7dGhpcy5ub2RlTmFtZX1gKTsKICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMpIHsKICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgdGhpcy5hdHRyaWJ1dGVzKSB7CiAgICAgICAgYnVmZmVyLnB1c2goYCAke2F0dHJpYnV0ZS5uYW1lfT0iJHtlbmNvZGVUb1htbFN0cmluZyhhdHRyaWJ1dGUudmFsdWUpfSJgKTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMuaGFzQ2hpbGROb2RlcygpKSB7CiAgICAgIGJ1ZmZlci5wdXNoKCI+Iik7CiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZE5vZGVzKSB7CiAgICAgICAgY2hpbGQuZHVtcChidWZmZXIpOwogICAgICB9CiAgICAgIGJ1ZmZlci5wdXNoKGA8LyR7dGhpcy5ub2RlTmFtZX0+YCk7CiAgICB9IGVsc2UgaWYgKHRoaXMubm9kZVZhbHVlKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGA+JHtlbmNvZGVUb1htbFN0cmluZyh0aGlzLm5vZGVWYWx1ZSl9PC8ke3RoaXMubm9kZU5hbWV9PmApOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyLnB1c2goIi8+Iik7CiAgICB9CiAgfQp9CmNsYXNzIFNpbXBsZVhNTFBhcnNlciBleHRlbmRzIFhNTFBhcnNlckJhc2UgewogIGNvbnN0cnVjdG9yKHsKICAgIGhhc0F0dHJpYnV0ZXMgPSBmYWxzZSwKICAgIGxvd2VyQ2FzZU5hbWUgPSBmYWxzZQogIH0pIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQgPSBudWxsOwogICAgdGhpcy5fc3RhY2sgPSBudWxsOwogICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CiAgICB0aGlzLl9oYXNBdHRyaWJ1dGVzID0gaGFzQXR0cmlidXRlczsKICAgIHRoaXMuX2xvd2VyQ2FzZU5hbWUgPSBsb3dlckNhc2VOYW1lOwogIH0KICBwYXJzZUZyb21TdHJpbmcoZGF0YSkgewogICAgdGhpcy5fY3VycmVudEZyYWdtZW50ID0gW107CiAgICB0aGlzLl9zdGFjayA9IFtdOwogICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CiAgICB0aGlzLnBhcnNlWG1sKGRhdGEpOwogICAgaWYgKHRoaXMuX2Vycm9yQ29kZSAhPT0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3IpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IFtkb2N1bWVudEVsZW1lbnRdID0gdGhpcy5fY3VycmVudEZyYWdtZW50OwogICAgaWYgKCFkb2N1bWVudEVsZW1lbnQpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRvY3VtZW50RWxlbWVudAogICAgfTsKICB9CiAgb25UZXh0KHRleHQpIHsKICAgIGlmIChpc1doaXRlc3BhY2VTdHJpbmcodGV4dCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsIHRleHQpOwogICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CiAgfQogIG9uQ2RhdGEodGV4dCkgewogICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsIHRleHQpOwogICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CiAgfQogIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHsKICAgIGlmICh0aGlzLl9sb3dlckNhc2VOYW1lKSB7CiAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICB9CiAgICBjb25zdCBub2RlID0gbmV3IFNpbXBsZURPTU5vZGUobmFtZSk7CiAgICBub2RlLmNoaWxkTm9kZXMgPSBbXTsKICAgIGlmICh0aGlzLl9oYXNBdHRyaWJ1dGVzKSB7CiAgICAgIG5vZGUuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CiAgICB9CiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaChub2RlKTsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX3N0YWNrLnB1c2godGhpcy5fY3VycmVudEZyYWdtZW50KTsKICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IG5vZGUuY2hpbGROb2RlczsKICB9CiAgb25FbmRFbGVtZW50KG5hbWUpIHsKICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IHRoaXMuX3N0YWNrLnBvcCgpIHx8IFtdOwogICAgY29uc3QgbGFzdEVsZW1lbnQgPSB0aGlzLl9jdXJyZW50RnJhZ21lbnQuYXQoLTEpOwogICAgaWYgKCFsYXN0RWxlbWVudCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIGxhc3RFbGVtZW50LmNoaWxkTm9kZXMpIHsKICAgICAgY2hpbGROb2RlLnBhcmVudE5vZGUgPSBsYXN0RWxlbWVudDsKICAgIH0KICAgIHJldHVybiBsYXN0RWxlbWVudDsKICB9CiAgb25FcnJvcihjb2RlKSB7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBjb2RlOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvbWV0YWRhdGFfcGFyc2VyLmpzCgpjbGFzcyBNZXRhZGF0YVBhcnNlciB7CiAgY29uc3RydWN0b3IoZGF0YSkgewogICAgZGF0YSA9IHRoaXMuX3JlcGFpcihkYXRhKTsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBTaW1wbGVYTUxQYXJzZXIoewogICAgICBsb3dlckNhc2VOYW1lOiB0cnVlCiAgICB9KTsKICAgIGNvbnN0IHhtbERvY3VtZW50ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhkYXRhKTsKICAgIHRoaXMuX21ldGFkYXRhTWFwID0gbmV3IE1hcCgpOwogICAgdGhpcy5fZGF0YSA9IGRhdGE7CiAgICBpZiAoeG1sRG9jdW1lbnQpIHsKICAgICAgdGhpcy5fcGFyc2UoeG1sRG9jdW1lbnQpOwogICAgfQogIH0KICBfcmVwYWlyKGRhdGEpIHsKICAgIHJldHVybiBkYXRhLnJlcGxhY2UoL15bXjxdKy8sICIiKS5yZXBsYWNlQWxsKC8+XFwzNzZcXDM3NyhbXjxdKykvZywgZnVuY3Rpb24gKGFsbCwgY29kZXMpIHsKICAgICAgY29uc3QgYnl0ZXMgPSBjb2Rlcy5yZXBsYWNlQWxsKC9cXChbMC0zXSkoWzAtN10pKFswLTddKS9nLCBmdW5jdGlvbiAoY29kZSwgZDEsIGQyLCBkMykgewogICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGQxICogNjQgKyBkMiAqIDggKyBkMyAqIDEpOwogICAgICB9KS5yZXBsYWNlQWxsKC8mKGFtcHxhcG9zfGd0fGx0fHF1b3QpOy9nLCBmdW5jdGlvbiAoc3RyLCBuYW1lKSB7CiAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICBjYXNlICJhbXAiOgogICAgICAgICAgICByZXR1cm4gIiYiOwogICAgICAgICAgY2FzZSAiYXBvcyI6CiAgICAgICAgICAgIHJldHVybiAiJyI7CiAgICAgICAgICBjYXNlICJndCI6CiAgICAgICAgICAgIHJldHVybiAiPiI7CiAgICAgICAgICBjYXNlICJsdCI6CiAgICAgICAgICAgIHJldHVybiAiPCI7CiAgICAgICAgICBjYXNlICJxdW90IjoKICAgICAgICAgICAgcmV0dXJuICciJzsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBfcmVwYWlyOiAke25hbWV9IGlzbid0IGRlZmluZWQuYCk7CiAgICAgIH0pOwogICAgICBjb25zdCBjaGFyQnVmID0gWyI+Il07CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJ5dGVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICBjb25zdCBjb2RlID0gYnl0ZXMuY2hhckNvZGVBdChpKSAqIDI1NiArIGJ5dGVzLmNoYXJDb2RlQXQoaSArIDEpOwogICAgICAgIGlmIChjb2RlID49IDMyICYmIGNvZGUgPCAxMjcgJiYgY29kZSAhPT0gNjAgJiYgY29kZSAhPT0gNjIgJiYgY29kZSAhPT0gMzgpIHsKICAgICAgICAgIGNoYXJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2hhckJ1Zi5wdXNoKCImI3giICsgKDB4MTAwMDAgKyBjb2RlKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpICsgIjsiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGNoYXJCdWYuam9pbigiIik7CiAgICB9KTsKICB9CiAgX2dldFNlcXVlbmNlKGVudHJ5KSB7CiAgICBjb25zdCBuYW1lID0gZW50cnkubm9kZU5hbWU7CiAgICBpZiAobmFtZSAhPT0gInJkZjpiYWciICYmIG5hbWUgIT09ICJyZGY6c2VxIiAmJiBuYW1lICE9PSAicmRmOmFsdCIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gZW50cnkuY2hpbGROb2Rlcy5maWx0ZXIobm9kZSA9PiBub2RlLm5vZGVOYW1lID09PSAicmRmOmxpIik7CiAgfQogIF9wYXJzZUFycmF5KGVudHJ5KSB7CiAgICBpZiAoIWVudHJ5Lmhhc0NoaWxkTm9kZXMoKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBbc2VxTm9kZV0gPSBlbnRyeS5jaGlsZE5vZGVzOwogICAgY29uc3Qgc2VxdWVuY2UgPSB0aGlzLl9nZXRTZXF1ZW5jZShzZXFOb2RlKSB8fCBbXTsKICAgIHRoaXMuX21ldGFkYXRhTWFwLnNldChlbnRyeS5ub2RlTmFtZSwgc2VxdWVuY2UubWFwKG5vZGUgPT4gbm9kZS50ZXh0Q29udGVudC50cmltKCkpKTsKICB9CiAgX3BhcnNlKHhtbERvY3VtZW50KSB7CiAgICBsZXQgcmRmID0geG1sRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgaWYgKHJkZi5ub2RlTmFtZSAhPT0gInJkZjpyZGYiKSB7CiAgICAgIHJkZiA9IHJkZi5maXJzdENoaWxkOwogICAgICB3aGlsZSAocmRmICYmIHJkZi5ub2RlTmFtZSAhPT0gInJkZjpyZGYiKSB7CiAgICAgICAgcmRmID0gcmRmLm5leHRTaWJsaW5nOwogICAgICB9CiAgICB9CiAgICBpZiAoIXJkZiB8fCByZGYubm9kZU5hbWUgIT09ICJyZGY6cmRmIiB8fCAhcmRmLmhhc0NoaWxkTm9kZXMoKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGRlc2Mgb2YgcmRmLmNoaWxkTm9kZXMpIHsKICAgICAgaWYgKGRlc2Mubm9kZU5hbWUgIT09ICJyZGY6ZGVzY3JpcHRpb24iKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBkZXNjLmNoaWxkTm9kZXMpIHsKICAgICAgICBjb25zdCBuYW1lID0gZW50cnkubm9kZU5hbWU7CiAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICBjYXNlICIjdGV4dCI6CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY2FzZSAiZGM6Y3JlYXRvciI6CiAgICAgICAgICBjYXNlICJkYzpzdWJqZWN0IjoKICAgICAgICAgICAgdGhpcy5fcGFyc2VBcnJheShlbnRyeSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0aGlzLl9tZXRhZGF0YU1hcC5zZXQobmFtZSwgZW50cnkudGV4dENvbnRlbnQudHJpbSgpKTsKICAgICAgfQogICAgfQogIH0KICBnZXQgc2VyaWFsaXphYmxlKCkgewogICAgcmV0dXJuIHsKICAgICAgcGFyc2VkRGF0YTogdGhpcy5fbWV0YWRhdGFNYXAsCiAgICAgIHJhd0RhdGE6IHRoaXMuX2RhdGEKICAgIH07CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9zdHJ1Y3RfdHJlZS5qcwoKCgoKY29uc3QgTUFYX0RFUFRIID0gNDA7CmNvbnN0IFN0cnVjdEVsZW1lbnRUeXBlID0gewogIFBBR0VfQ09OVEVOVDogMSwKICBTVFJFQU1fQ09OVEVOVDogMiwKICBPQkpFQ1Q6IDMsCiAgQU5OT1RBVElPTjogNCwKICBFTEVNRU5UOiA1Cn07CmNsYXNzIFN0cnVjdFRyZWVSb290IHsKICBjb25zdHJ1Y3Rvcih4cmVmLCByb290RGljdCwgcm9vdFJlZikgewogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuZGljdCA9IHJvb3REaWN0OwogICAgdGhpcy5yZWYgPSByb290UmVmIGluc3RhbmNlb2YgUmVmID8gcm9vdFJlZiA6IG51bGw7CiAgICB0aGlzLnJvbGVNYXAgPSBuZXcgTWFwKCk7CiAgICB0aGlzLnN0cnVjdFBhcmVudElkcyA9IG51bGw7CiAgfQogIGluaXQoKSB7CiAgICB0aGlzLnJlYWRSb2xlTWFwKCk7CiAgfQogICNhZGRJZFRvUGFnZShwYWdlUmVmLCBpZCwgdHlwZSkgewogICAgaWYgKCEocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikgfHwgaWQgPCAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuc3RydWN0UGFyZW50SWRzIHx8PSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIGxldCBpZHMgPSB0aGlzLnN0cnVjdFBhcmVudElkcy5nZXQocGFnZVJlZik7CiAgICBpZiAoIWlkcykgewogICAgICBpZHMgPSBbXTsKICAgICAgdGhpcy5zdHJ1Y3RQYXJlbnRJZHMucHV0KHBhZ2VSZWYsIGlkcyk7CiAgICB9CiAgICBpZHMucHVzaChbaWQsIHR5cGVdKTsKICB9CiAgYWRkQW5ub3RhdGlvbklkVG9QYWdlKHBhZ2VSZWYsIGlkKSB7CiAgICB0aGlzLiNhZGRJZFRvUGFnZShwYWdlUmVmLCBpZCwgU3RydWN0RWxlbWVudFR5cGUuQU5OT1RBVElPTik7CiAgfQogIHJlYWRSb2xlTWFwKCkgewogICAgY29uc3Qgcm9sZU1hcERpY3QgPSB0aGlzLmRpY3QuZ2V0KCJSb2xlTWFwIik7CiAgICBpZiAoIShyb2xlTWFwRGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJvbGVNYXBEaWN0KSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICB0aGlzLnJvbGVNYXAuc2V0KGtleSwgdmFsdWUubmFtZSk7CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIGFzeW5jIGNhbkNyZWF0ZVN0cnVjdHVyZVRyZWUoewogICAgY2F0YWxvZ1JlZiwKICAgIHBkZk1hbmFnZXIsCiAgICBuZXdBbm5vdGF0aW9uc0J5UGFnZQogIH0pIHsKICAgIGlmICghKGNhdGFsb2dSZWYgaW5zdGFuY2VvZiBSZWYpKSB7CiAgICAgIHdhcm4oIkNhbm5vdCBzYXZlIHRoZSBzdHJ1Y3QgdHJlZTogbm8gY2F0YWxvZyByZWZlcmVuY2UuIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGxldCBuZXh0S2V5ID0gMDsKICAgIGxldCBoYXNOb3RoaW5nVG9VcGRhdGUgPSB0cnVlOwogICAgZm9yIChjb25zdCBbcGFnZUluZGV4LCBlbGVtZW50c10gb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UpIHsKICAgICAgY29uc3QgewogICAgICAgIHJlZjogcGFnZVJlZgogICAgICB9ID0gYXdhaXQgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCk7CiAgICAgIGlmICghKHBhZ2VSZWYgaW5zdGFuY2VvZiBSZWYpKSB7CiAgICAgICAgd2FybihgQ2Fubm90IHNhdmUgdGhlIHN0cnVjdCB0cmVlOiBwYWdlICR7cGFnZUluZGV4fSBoYXMgbm8gcmVmLmApOwogICAgICAgIGhhc05vdGhpbmdUb1VwZGF0ZSA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuYWNjZXNzaWJpbGl0eURhdGE/LnR5cGUpIHsKICAgICAgICAgIGVsZW1lbnQucGFyZW50VHJlZUlkID0gbmV4dEtleSsrOwogICAgICAgICAgaGFzTm90aGluZ1RvVXBkYXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaGFzTm90aGluZ1RvVXBkYXRlKSB7CiAgICAgIGZvciAoY29uc3QgZWxlbWVudHMgb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UudmFsdWVzKCkpIHsKICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHsKICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LnBhcmVudFRyZWVJZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgeHJlZiwKICAgIGNhdGFsb2dSZWYsCiAgICBwZGZNYW5hZ2VyLAogICAgY2hhbmdlcwogIH0pIHsKICAgIGNvbnN0IHJvb3QgPSBwZGZNYW5hZ2VyLmNhdGFsb2cuY2xvbmVEaWN0KCk7CiAgICBjb25zdCBjYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgY2FjaGUucHV0KGNhdGFsb2dSZWYsIHJvb3QpOwogICAgY29uc3Qgc3RydWN0VHJlZVJvb3RSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgcm9vdC5zZXQoIlN0cnVjdFRyZWVSb290Iiwgc3RydWN0VHJlZVJvb3RSZWYpOwogICAgY29uc3Qgc3RydWN0VHJlZVJvb3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIHN0cnVjdFRyZWVSb290LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJTdHJ1Y3RUcmVlUm9vdCIpKTsKICAgIGNvbnN0IHBhcmVudFRyZWVSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgc3RydWN0VHJlZVJvb3Quc2V0KCJQYXJlbnRUcmVlIiwgcGFyZW50VHJlZVJlZik7CiAgICBjb25zdCBraWRzID0gW107CiAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIksiLCBraWRzKTsKICAgIGNhY2hlLnB1dChzdHJ1Y3RUcmVlUm9vdFJlZiwgc3RydWN0VHJlZVJvb3QpOwogICAgY29uc3QgcGFyZW50VHJlZSA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgbnVtcyA9IFtdOwogICAgcGFyZW50VHJlZS5zZXQoIk51bXMiLCBudW1zKTsKICAgIGNvbnN0IG5leHRLZXkgPSBhd2FpdCB0aGlzLiN3cml0ZUtpZHMoewogICAgICBuZXdBbm5vdGF0aW9uc0J5UGFnZSwKICAgICAgc3RydWN0VHJlZVJvb3RSZWYsCiAgICAgIHN0cnVjdFRyZWVSb290OiBudWxsLAogICAgICBraWRzLAogICAgICBudW1zLAogICAgICB4cmVmLAogICAgICBwZGZNYW5hZ2VyLAogICAgICBjaGFuZ2VzLAogICAgICBjYWNoZQogICAgfSk7CiAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIlBhcmVudFRyZWVOZXh0S2V5IiwgbmV4dEtleSk7CiAgICBjYWNoZS5wdXQocGFyZW50VHJlZVJlZiwgcGFyZW50VHJlZSk7CiAgICBmb3IgKGNvbnN0IFtyZWYsIG9ial0gb2YgY2FjaGUuaXRlbXMoKSkgewogICAgICBjaGFuZ2VzLnB1dChyZWYsIHsKICAgICAgICBkYXRhOiBvYmoKICAgICAgfSk7CiAgICB9CiAgfQogIGFzeW5jIGNhblVwZGF0ZVN0cnVjdFRyZWUoewogICAgcGRmTWFuYWdlciwKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlCiAgfSkgewogICAgaWYgKCF0aGlzLnJlZikgewogICAgICB3YXJuKCJDYW5ub3QgdXBkYXRlIHRoZSBzdHJ1Y3QgdHJlZTogbm8gcm9vdCByZWZlcmVuY2UuIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGxldCBuZXh0S2V5ID0gdGhpcy5kaWN0LmdldCgiUGFyZW50VHJlZU5leHRLZXkiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihuZXh0S2V5KSB8fCBuZXh0S2V5IDwgMCkgewogICAgICB3YXJuKCJDYW5ub3QgdXBkYXRlIHRoZSBzdHJ1Y3QgdHJlZTogaW52YWxpZCBuZXh0IGtleS4iKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgcGFyZW50VHJlZSA9IHRoaXMuZGljdC5nZXQoIlBhcmVudFRyZWUiKTsKICAgIGlmICghKHBhcmVudFRyZWUgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICB3YXJuKCJDYW5ub3QgdXBkYXRlIHRoZSBzdHJ1Y3QgdHJlZTogUGFyZW50VHJlZSBpc24ndCBhIGRpY3QuIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IG51bXMgPSBwYXJlbnRUcmVlLmdldCgiTnVtcyIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KG51bXMpKSB7CiAgICAgIHdhcm4oIkNhbm5vdCB1cGRhdGUgdGhlIHN0cnVjdCB0cmVlOiBudW1zIGlzbid0IGFuIGFycmF5LiIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjb25zdCBudW1iZXJUcmVlID0gbmV3IE51bWJlclRyZWUocGFyZW50VHJlZSwgdGhpcy54cmVmKTsKICAgIGZvciAoY29uc3QgcGFnZUluZGV4IG9mIG5ld0Fubm90YXRpb25zQnlQYWdlLmtleXMoKSkgewogICAgICBjb25zdCB7CiAgICAgICAgcGFnZURpY3QKICAgICAgfSA9IGF3YWl0IHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpOwogICAgICBpZiAoIXBhZ2VEaWN0LmhhcygiU3RydWN0UGFyZW50cyIpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaWQgPSBwYWdlRGljdC5nZXQoIlN0cnVjdFBhcmVudHMiKTsKICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlkKSB8fCAhQXJyYXkuaXNBcnJheShudW1iZXJUcmVlLmdldChpZCkpKSB7CiAgICAgICAgd2FybihgQ2Fubm90IHNhdmUgdGhlIHN0cnVjdCB0cmVlOiBwYWdlICR7cGFnZUluZGV4fSBoYXMgYSB3cm9uZyBpZC5gKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGxldCBoYXNOb3RoaW5nVG9VcGRhdGUgPSB0cnVlOwogICAgZm9yIChjb25zdCBbcGFnZUluZGV4LCBlbGVtZW50c10gb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UpIHsKICAgICAgY29uc3QgewogICAgICAgIHBhZ2VEaWN0CiAgICAgIH0gPSBhd2FpdCBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KTsKICAgICAgU3RydWN0VHJlZVJvb3QuI2NvbGxlY3RQYXJlbnRzKHsKICAgICAgICBlbGVtZW50cywKICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgICAgcGFnZURpY3QsCiAgICAgICAgbnVtYmVyVHJlZQogICAgICB9KTsKICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgICAgaWYgKGVsZW1lbnQuYWNjZXNzaWJpbGl0eURhdGE/LnR5cGUpIHsKICAgICAgICAgIGlmICghKGVsZW1lbnQuYWNjZXNzaWJpbGl0eURhdGEuc3RydWN0UGFyZW50ID49IDApKSB7CiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50VHJlZUlkID0gbmV4dEtleSsrOwogICAgICAgICAgfQogICAgICAgICAgaGFzTm90aGluZ1RvVXBkYXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoaGFzTm90aGluZ1RvVXBkYXRlKSB7CiAgICAgIGZvciAoY29uc3QgZWxlbWVudHMgb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UudmFsdWVzKCkpIHsKICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHsKICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LnBhcmVudFRyZWVJZDsKICAgICAgICAgIGRlbGV0ZSBlbGVtZW50LnN0cnVjdFRyZWVQYXJlbnQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBhc3luYyB1cGRhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgcGRmTWFuYWdlciwKICAgIGNoYW5nZXMKICB9KSB7CiAgICBjb25zdCB7CiAgICAgIHJlZjogc3RydWN0VHJlZVJvb3RSZWYsCiAgICAgIHhyZWYKICAgIH0gPSB0aGlzOwogICAgY29uc3Qgc3RydWN0VHJlZVJvb3QgPSB0aGlzLmRpY3QuY2xvbmUoKTsKICAgIGNvbnN0IGNhY2hlID0gbmV3IFJlZlNldENhY2hlKCk7CiAgICBjYWNoZS5wdXQoc3RydWN0VHJlZVJvb3RSZWYsIHN0cnVjdFRyZWVSb290KTsKICAgIGxldCBwYXJlbnRUcmVlUmVmID0gc3RydWN0VHJlZVJvb3QuZ2V0UmF3KCJQYXJlbnRUcmVlIik7CiAgICBsZXQgcGFyZW50VHJlZTsKICAgIGlmIChwYXJlbnRUcmVlUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHBhcmVudFRyZWUgPSB4cmVmLmZldGNoKHBhcmVudFRyZWVSZWYpOwogICAgfSBlbHNlIHsKICAgICAgcGFyZW50VHJlZSA9IHBhcmVudFRyZWVSZWY7CiAgICAgIHBhcmVudFRyZWVSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIlBhcmVudFRyZWUiLCBwYXJlbnRUcmVlUmVmKTsKICAgIH0KICAgIHBhcmVudFRyZWUgPSBwYXJlbnRUcmVlLmNsb25lKCk7CiAgICBjYWNoZS5wdXQocGFyZW50VHJlZVJlZiwgcGFyZW50VHJlZSk7CiAgICBsZXQgbnVtcyA9IHBhcmVudFRyZWUuZ2V0UmF3KCJOdW1zIik7CiAgICBsZXQgbnVtc1JlZiA9IG51bGw7CiAgICBpZiAobnVtcyBpbnN0YW5jZW9mIFJlZikgewogICAgICBudW1zUmVmID0gbnVtczsKICAgICAgbnVtcyA9IHhyZWYuZmV0Y2gobnVtc1JlZik7CiAgICB9CiAgICBudW1zID0gbnVtcy5zbGljZSgpOwogICAgaWYgKCFudW1zUmVmKSB7CiAgICAgIHBhcmVudFRyZWUuc2V0KCJOdW1zIiwgbnVtcyk7CiAgICB9CiAgICBjb25zdCBuZXdOZXh0S2V5ID0gYXdhaXQgU3RydWN0VHJlZVJvb3QuI3dyaXRlS2lkcyh7CiAgICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgICBzdHJ1Y3RUcmVlUm9vdFJlZiwKICAgICAgc3RydWN0VHJlZVJvb3Q6IHRoaXMsCiAgICAgIGtpZHM6IG51bGwsCiAgICAgIG51bXMsCiAgICAgIHhyZWYsCiAgICAgIHBkZk1hbmFnZXIsCiAgICAgIGNoYW5nZXMsCiAgICAgIGNhY2hlCiAgICB9KTsKICAgIGlmIChuZXdOZXh0S2V5ID09PSAtMSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIlBhcmVudFRyZWVOZXh0S2V5IiwgbmV3TmV4dEtleSk7CiAgICBpZiAobnVtc1JlZikgewogICAgICBjYWNoZS5wdXQobnVtc1JlZiwgbnVtcyk7CiAgICB9CiAgICBmb3IgKGNvbnN0IFtyZWYsIG9ial0gb2YgY2FjaGUuaXRlbXMoKSkgewogICAgICBjaGFuZ2VzLnB1dChyZWYsIHsKICAgICAgICBkYXRhOiBvYmoKICAgICAgfSk7CiAgICB9CiAgfQogIHN0YXRpYyBhc3luYyAjd3JpdGVLaWRzKHsKICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLAogICAgc3RydWN0VHJlZVJvb3RSZWYsCiAgICBzdHJ1Y3RUcmVlUm9vdCwKICAgIGtpZHMsCiAgICBudW1zLAogICAgeHJlZiwKICAgIHBkZk1hbmFnZXIsCiAgICBjaGFuZ2VzLAogICAgY2FjaGUKICB9KSB7CiAgICBjb25zdCBvYmpyID0gTmFtZS5nZXQoIk9CSlIiKTsKICAgIGxldCBuZXh0S2V5ID0gLTE7CiAgICBsZXQgc3RydWN0VHJlZVBhZ2VPYmpzOwogICAgZm9yIChjb25zdCBbcGFnZUluZGV4LCBlbGVtZW50c10gb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UpIHsKICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpOwogICAgICBjb25zdCB7CiAgICAgICAgcmVmOiBwYWdlUmVmCiAgICAgIH0gPSBwYWdlOwogICAgICBjb25zdCBpc1BhZ2VSZWYgPSBwYWdlUmVmIGluc3RhbmNlb2YgUmVmOwogICAgICBmb3IgKGNvbnN0IHsKICAgICAgICBhY2Nlc3NpYmlsaXR5RGF0YSwKICAgICAgICByZWYsCiAgICAgICAgcGFyZW50VHJlZUlkLAogICAgICAgIHN0cnVjdFRyZWVQYXJlbnQKICAgICAgfSBvZiBlbGVtZW50cykgewogICAgICAgIGlmICghYWNjZXNzaWJpbGl0eURhdGE/LnR5cGUpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB7CiAgICAgICAgICBzdHJ1Y3RQYXJlbnQKICAgICAgICB9ID0gYWNjZXNzaWJpbGl0eURhdGE7CiAgICAgICAgaWYgKHN0cnVjdFRyZWVSb290ICYmIE51bWJlci5pc0ludGVnZXIoc3RydWN0UGFyZW50KSAmJiBzdHJ1Y3RQYXJlbnQgPj0gMCkgewogICAgICAgICAgbGV0IG9ianMgPSAoc3RydWN0VHJlZVBhZ2VPYmpzIHx8PSBuZXcgTWFwKCkpLmdldChwYWdlSW5kZXgpOwogICAgICAgICAgaWYgKG9ianMgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb25zdCBzdHJ1Y3RUcmVlUGFnZSA9IG5ldyBTdHJ1Y3RUcmVlUGFnZShzdHJ1Y3RUcmVlUm9vdCwgcGFnZS5wYWdlRGljdCk7CiAgICAgICAgICAgIG9ianMgPSBzdHJ1Y3RUcmVlUGFnZS5jb2xsZWN0T2JqZWN0cyhwYWdlUmVmKTsKICAgICAgICAgICAgc3RydWN0VHJlZVBhZ2VPYmpzLnNldChwYWdlSW5kZXgsIG9ianMpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgb2JqUmVmID0gb2Jqcz8uZ2V0KHN0cnVjdFBhcmVudCk7CiAgICAgICAgICBpZiAob2JqUmVmKSB7CiAgICAgICAgICAgIGNvbnN0IHRhZ0RpY3QgPSB4cmVmLmZldGNoKG9ialJlZikuY2xvbmUoKTsKICAgICAgICAgICAgU3RydWN0VHJlZVJvb3QuI3dyaXRlUHJvcGVydGllcyh0YWdEaWN0LCBhY2Nlc3NpYmlsaXR5RGF0YSk7CiAgICAgICAgICAgIGNoYW5nZXMucHV0KG9ialJlZiwgewogICAgICAgICAgICAgIGRhdGE6IHRhZ0RpY3QKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXh0S2V5ID0gTWF0aC5tYXgobmV4dEtleSwgcGFyZW50VHJlZUlkKTsKICAgICAgICBjb25zdCB0YWdSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgIGNvbnN0IHRhZ0RpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgICBTdHJ1Y3RUcmVlUm9vdC4jd3JpdGVQcm9wZXJ0aWVzKHRhZ0RpY3QsIGFjY2Vzc2liaWxpdHlEYXRhKTsKICAgICAgICBhd2FpdCB0aGlzLiN1cGRhdGVQYXJlbnRUYWcoewogICAgICAgICAgc3RydWN0VHJlZVBhcmVudCwKICAgICAgICAgIHRhZ0RpY3QsCiAgICAgICAgICBuZXdUYWdSZWY6IHRhZ1JlZiwKICAgICAgICAgIHN0cnVjdFRyZWVSb290UmVmLAogICAgICAgICAgZmFsbGJhY2tLaWRzOiBraWRzLAogICAgICAgICAgeHJlZiwKICAgICAgICAgIGNhY2hlCiAgICAgICAgfSk7CiAgICAgICAgY29uc3Qgb2JqRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICAgIHRhZ0RpY3Quc2V0KCJLIiwgb2JqRGljdCk7CiAgICAgICAgb2JqRGljdC5zZXQoIlR5cGUiLCBvYmpyKTsKICAgICAgICBpZiAoaXNQYWdlUmVmKSB7CiAgICAgICAgICBvYmpEaWN0LnNldCgiUGciLCBwYWdlUmVmKTsKICAgICAgICB9CiAgICAgICAgb2JqRGljdC5zZXQoIk9iaiIsIHJlZik7CiAgICAgICAgY2FjaGUucHV0KHRhZ1JlZiwgdGFnRGljdCk7CiAgICAgICAgbnVtcy5wdXNoKHBhcmVudFRyZWVJZCwgdGFnUmVmKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5leHRLZXkgKyAxOwogIH0KICBzdGF0aWMgI3dyaXRlUHJvcGVydGllcyh0YWdEaWN0LCB7CiAgICB0eXBlLAogICAgdGl0bGUsCiAgICBsYW5nLAogICAgYWx0LAogICAgZXhwYW5kZWQsCiAgICBhY3R1YWxUZXh0CiAgfSkgewogICAgdGFnRGljdC5zZXQoIlMiLCBOYW1lLmdldCh0eXBlKSk7CiAgICBpZiAodGl0bGUpIHsKICAgICAgdGFnRGljdC5zZXQoIlQiLCBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHRpdGxlKSk7CiAgICB9CiAgICBpZiAobGFuZykgewogICAgICB0YWdEaWN0LnNldCgiTGFuZyIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUobGFuZykpOwogICAgfQogICAgaWYgKGFsdCkgewogICAgICB0YWdEaWN0LnNldCgiQWx0Iiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRShhbHQpKTsKICAgIH0KICAgIGlmIChleHBhbmRlZCkgewogICAgICB0YWdEaWN0LnNldCgiRSIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUoZXhwYW5kZWQpKTsKICAgIH0KICAgIGlmIChhY3R1YWxUZXh0KSB7CiAgICAgIHRhZ0RpY3Quc2V0KCJBY3R1YWxUZXh0Iiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRShhY3R1YWxUZXh0KSk7CiAgICB9CiAgfQogIHN0YXRpYyAjY29sbGVjdFBhcmVudHMoewogICAgZWxlbWVudHMsCiAgICB4cmVmLAogICAgcGFnZURpY3QsCiAgICBudW1iZXJUcmVlCiAgfSkgewogICAgY29uc3QgaWRUb0VsZW1lbnRzID0gbmV3IE1hcCgpOwogICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgIGlmIChlbGVtZW50LnN0cnVjdFRyZWVQYXJlbnRJZCkgewogICAgICAgIGNvbnN0IGlkID0gcGFyc2VJbnQoZWxlbWVudC5zdHJ1Y3RUcmVlUGFyZW50SWQuc3BsaXQoIl9tYyIpWzFdLCAxMCk7CiAgICAgICAgbGV0IGVsZW1zID0gaWRUb0VsZW1lbnRzLmdldChpZCk7CiAgICAgICAgaWYgKCFlbGVtcykgewogICAgICAgICAgZWxlbXMgPSBbXTsKICAgICAgICAgIGlkVG9FbGVtZW50cy5zZXQoaWQsIGVsZW1zKTsKICAgICAgICB9CiAgICAgICAgZWxlbXMucHVzaChlbGVtZW50KTsKICAgICAgfQogICAgfQogICAgY29uc3QgaWQgPSBwYWdlRGljdC5nZXQoIlN0cnVjdFBhcmVudHMiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpZCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGFyZW50QXJyYXkgPSBudW1iZXJUcmVlLmdldChpZCk7CiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gKGtpZCwgcGFnZUtpZCwga2lkUmVmKSA9PiB7CiAgICAgIGNvbnN0IGVsZW1zID0gaWRUb0VsZW1lbnRzLmdldChraWQpOwogICAgICBpZiAoZWxlbXMpIHsKICAgICAgICBjb25zdCBwYXJlbnRSZWYgPSBwYWdlS2lkLmdldFJhdygiUCIpOwogICAgICAgIGNvbnN0IHBhcmVudERpY3QgPSB4cmVmLmZldGNoSWZSZWYocGFyZW50UmVmKTsKICAgICAgICBpZiAocGFyZW50UmVmIGluc3RhbmNlb2YgUmVmICYmIHBhcmVudERpY3QgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7CiAgICAgICAgICAgIHJlZjoga2lkUmVmLAogICAgICAgICAgICBkaWN0OiBwYWdlS2lkCiAgICAgICAgICB9OwogICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1zKSB7CiAgICAgICAgICAgIGVsZW1lbnQuc3RydWN0VHJlZVBhcmVudCA9IHBhcmFtczsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICAgIGZvciAoY29uc3Qga2lkUmVmIG9mIHBhcmVudEFycmF5KSB7CiAgICAgIGlmICghKGtpZFJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBwYWdlS2lkID0geHJlZi5mZXRjaChraWRSZWYpOwogICAgICBjb25zdCBrID0gcGFnZUtpZC5nZXQoIksiKTsKICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaykpIHsKICAgICAgICB1cGRhdGVFbGVtZW50KGssIHBhZ2VLaWQsIGtpZFJlZik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGspKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yIChsZXQga2lkIG9mIGspIHsKICAgICAgICBraWQgPSB4cmVmLmZldGNoSWZSZWYoa2lkKTsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihraWQpICYmIHVwZGF0ZUVsZW1lbnQoa2lkLCBwYWdlS2lkLCBraWRSZWYpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCEoa2lkIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzTmFtZShraWQuZ2V0KCJUeXBlIiksICJNQ1IiKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1jaWQgPSBraWQuZ2V0KCJNQ0lEIik7CiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIobWNpZCkgJiYgdXBkYXRlRWxlbWVudChtY2lkLCBwYWdlS2lkLCBraWRSZWYpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIGFzeW5jICN1cGRhdGVQYXJlbnRUYWcoewogICAgc3RydWN0VHJlZVBhcmVudCwKICAgIHRhZ0RpY3QsCiAgICBuZXdUYWdSZWYsCiAgICBzdHJ1Y3RUcmVlUm9vdFJlZiwKICAgIGZhbGxiYWNrS2lkcywKICAgIHhyZWYsCiAgICBjYWNoZQogIH0pIHsKICAgIGxldCByZWYgPSBudWxsOwogICAgbGV0IHBhcmVudFJlZjsKICAgIGlmIChzdHJ1Y3RUcmVlUGFyZW50KSB7CiAgICAgICh7CiAgICAgICAgcmVmCiAgICAgIH0gPSBzdHJ1Y3RUcmVlUGFyZW50KTsKICAgICAgcGFyZW50UmVmID0gc3RydWN0VHJlZVBhcmVudC5kaWN0LmdldFJhdygiUCIpIHx8IHN0cnVjdFRyZWVSb290UmVmOwogICAgfSBlbHNlIHsKICAgICAgcGFyZW50UmVmID0gc3RydWN0VHJlZVJvb3RSZWY7CiAgICB9CiAgICB0YWdEaWN0LnNldCgiUCIsIHBhcmVudFJlZik7CiAgICBjb25zdCBwYXJlbnREaWN0ID0geHJlZi5mZXRjaElmUmVmKHBhcmVudFJlZik7CiAgICBpZiAoIXBhcmVudERpY3QpIHsKICAgICAgZmFsbGJhY2tLaWRzLnB1c2gobmV3VGFnUmVmKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGNhY2hlZFBhcmVudERpY3QgPSBjYWNoZS5nZXQocGFyZW50UmVmKTsKICAgIGlmICghY2FjaGVkUGFyZW50RGljdCkgewogICAgICBjYWNoZWRQYXJlbnREaWN0ID0gcGFyZW50RGljdC5jbG9uZSgpOwogICAgICBjYWNoZS5wdXQocGFyZW50UmVmLCBjYWNoZWRQYXJlbnREaWN0KTsKICAgIH0KICAgIGNvbnN0IHBhcmVudEtpZHNSYXcgPSBjYWNoZWRQYXJlbnREaWN0LmdldFJhdygiSyIpOwogICAgbGV0IGNhY2hlZFBhcmVudEtpZHMgPSBwYXJlbnRLaWRzUmF3IGluc3RhbmNlb2YgUmVmID8gY2FjaGUuZ2V0KHBhcmVudEtpZHNSYXcpIDogbnVsbDsKICAgIGlmICghY2FjaGVkUGFyZW50S2lkcykgewogICAgICBjYWNoZWRQYXJlbnRLaWRzID0geHJlZi5mZXRjaElmUmVmKHBhcmVudEtpZHNSYXcpOwogICAgICBjYWNoZWRQYXJlbnRLaWRzID0gQXJyYXkuaXNBcnJheShjYWNoZWRQYXJlbnRLaWRzKSA/IGNhY2hlZFBhcmVudEtpZHMuc2xpY2UoKSA6IFtwYXJlbnRLaWRzUmF3XTsKICAgICAgY29uc3QgcGFyZW50S2lkc1JlZiA9IHhyZWYuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgIGNhY2hlZFBhcmVudERpY3Quc2V0KCJLIiwgcGFyZW50S2lkc1JlZik7CiAgICAgIGNhY2hlLnB1dChwYXJlbnRLaWRzUmVmLCBjYWNoZWRQYXJlbnRLaWRzKTsKICAgIH0KICAgIGNvbnN0IGluZGV4ID0gY2FjaGVkUGFyZW50S2lkcy5pbmRleE9mKHJlZik7CiAgICBjYWNoZWRQYXJlbnRLaWRzLnNwbGljZShpbmRleCA+PSAwID8gaW5kZXggKyAxIDogY2FjaGVkUGFyZW50S2lkcy5sZW5ndGgsIDAsIG5ld1RhZ1JlZik7CiAgfQp9CmNsYXNzIFN0cnVjdEVsZW1lbnROb2RlIHsKICBjb25zdHJ1Y3Rvcih0cmVlLCBkaWN0KSB7CiAgICB0aGlzLnRyZWUgPSB0cmVlOwogICAgdGhpcy54cmVmID0gdHJlZS54cmVmOwogICAgdGhpcy5kaWN0ID0gZGljdDsKICAgIHRoaXMua2lkcyA9IFtdOwogICAgdGhpcy5wYXJzZUtpZHMoKTsKICB9CiAgZ2V0IHJvbGUoKSB7CiAgICBjb25zdCBuYW1lT2JqID0gdGhpcy5kaWN0LmdldCgiUyIpOwogICAgY29uc3QgbmFtZSA9IG5hbWVPYmogaW5zdGFuY2VvZiBOYW1lID8gbmFtZU9iai5uYW1lIDogIiI7CiAgICBjb25zdCB7CiAgICAgIHJvb3QKICAgIH0gPSB0aGlzLnRyZWU7CiAgICByZXR1cm4gcm9vdC5yb2xlTWFwLmdldChuYW1lKSA/PyBuYW1lOwogIH0KICBwYXJzZUtpZHMoKSB7CiAgICBsZXQgcGFnZU9iaklkID0gbnVsbDsKICAgIGNvbnN0IG9ialJlZiA9IHRoaXMuZGljdC5nZXRSYXcoIlBnIik7CiAgICBpZiAob2JqUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHBhZ2VPYmpJZCA9IG9ialJlZi50b1N0cmluZygpOwogICAgfQogICAgY29uc3Qga2lkcyA9IHRoaXMuZGljdC5nZXQoIksiKTsKICAgIGlmIChBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgIGZvciAoY29uc3Qga2lkIG9mIGtpZHMpIHsKICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wYXJzZUtpZChwYWdlT2JqSWQsIHRoaXMueHJlZi5mZXRjaElmUmVmKGtpZCkpOwogICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICB0aGlzLmtpZHMucHVzaChlbGVtZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBhcnNlS2lkKHBhZ2VPYmpJZCwga2lkcyk7CiAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgdGhpcy5raWRzLnB1c2goZWxlbWVudCk7CiAgICAgIH0KICAgIH0KICB9CiAgcGFyc2VLaWQocGFnZU9iaklkLCBraWQpIHsKICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGtpZCkpIHsKICAgICAgaWYgKHRoaXMudHJlZS5wYWdlRGljdC5vYmpJZCAhPT0gcGFnZU9iaklkKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RFbGVtZW50KHsKICAgICAgICB0eXBlOiBTdHJ1Y3RFbGVtZW50VHlwZS5QQUdFX0NPTlRFTlQsCiAgICAgICAgbWNpZDoga2lkLAogICAgICAgIHBhZ2VPYmpJZAogICAgICB9KTsKICAgIH0KICAgIGlmICghKGtpZCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgcGFnZVJlZiA9IGtpZC5nZXRSYXcoIlBnIik7CiAgICBpZiAocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikgewogICAgICBwYWdlT2JqSWQgPSBwYWdlUmVmLnRvU3RyaW5nKCk7CiAgICB9CiAgICBjb25zdCB0eXBlID0ga2lkLmdldCgiVHlwZSIpIGluc3RhbmNlb2YgTmFtZSA/IGtpZC5nZXQoIlR5cGUiKS5uYW1lIDogbnVsbDsKICAgIGlmICh0eXBlID09PSAiTUNSIikgewogICAgICBpZiAodGhpcy50cmVlLnBhZ2VEaWN0Lm9iaklkICE9PSBwYWdlT2JqSWQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBraWRSZWYgPSBraWQuZ2V0UmF3KCJTdG0iKTsKICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RFbGVtZW50KHsKICAgICAgICB0eXBlOiBTdHJ1Y3RFbGVtZW50VHlwZS5TVFJFQU1fQ09OVEVOVCwKICAgICAgICByZWZPYmpJZDoga2lkUmVmIGluc3RhbmNlb2YgUmVmID8ga2lkUmVmLnRvU3RyaW5nKCkgOiBudWxsLAogICAgICAgIHBhZ2VPYmpJZCwKICAgICAgICBtY2lkOiBraWQuZ2V0KCJNQ0lEIikKICAgICAgfSk7CiAgICB9CiAgICBpZiAodHlwZSA9PT0gIk9CSlIiKSB7CiAgICAgIGlmICh0aGlzLnRyZWUucGFnZURpY3Qub2JqSWQgIT09IHBhZ2VPYmpJZCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGtpZFJlZiA9IGtpZC5nZXRSYXcoIk9iaiIpOwogICAgICByZXR1cm4gbmV3IFN0cnVjdEVsZW1lbnQoewogICAgICAgIHR5cGU6IFN0cnVjdEVsZW1lbnRUeXBlLk9CSkVDVCwKICAgICAgICByZWZPYmpJZDoga2lkUmVmIGluc3RhbmNlb2YgUmVmID8ga2lkUmVmLnRvU3RyaW5nKCkgOiBudWxsLAogICAgICAgIHBhZ2VPYmpJZAogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBuZXcgU3RydWN0RWxlbWVudCh7CiAgICAgIHR5cGU6IFN0cnVjdEVsZW1lbnRUeXBlLkVMRU1FTlQsCiAgICAgIGRpY3Q6IGtpZAogICAgfSk7CiAgfQp9CmNsYXNzIFN0cnVjdEVsZW1lbnQgewogIGNvbnN0cnVjdG9yKHsKICAgIHR5cGUsCiAgICBkaWN0ID0gbnVsbCwKICAgIG1jaWQgPSBudWxsLAogICAgcGFnZU9iaklkID0gbnVsbCwKICAgIHJlZk9iaklkID0gbnVsbAogIH0pIHsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgdGhpcy5tY2lkID0gbWNpZDsKICAgIHRoaXMucGFnZU9iaklkID0gcGFnZU9iaklkOwogICAgdGhpcy5yZWZPYmpJZCA9IHJlZk9iaklkOwogICAgdGhpcy5wYXJlbnROb2RlID0gbnVsbDsKICB9Cn0KY2xhc3MgU3RydWN0VHJlZVBhZ2UgewogIGNvbnN0cnVjdG9yKHN0cnVjdFRyZWVSb290LCBwYWdlRGljdCkgewogICAgdGhpcy5yb290ID0gc3RydWN0VHJlZVJvb3Q7CiAgICB0aGlzLnhyZWYgPSBzdHJ1Y3RUcmVlUm9vdD8ueHJlZiA/PyBudWxsOwogICAgdGhpcy5yb290RGljdCA9IHN0cnVjdFRyZWVSb290Py5kaWN0ID8/IG51bGw7CiAgICB0aGlzLnBhZ2VEaWN0ID0gcGFnZURpY3Q7CiAgICB0aGlzLm5vZGVzID0gW107CiAgfQogIGNvbGxlY3RPYmplY3RzKHBhZ2VSZWYpIHsKICAgIGlmICghdGhpcy5yb290IHx8ICF0aGlzLnJvb3REaWN0IHx8ICEocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwYXJlbnRUcmVlID0gdGhpcy5yb290RGljdC5nZXQoIlBhcmVudFRyZWUiKTsKICAgIGlmICghcGFyZW50VHJlZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGlkcyA9IHRoaXMucm9vdC5zdHJ1Y3RQYXJlbnRJZHM/LmdldChwYWdlUmVmKTsKICAgIGlmICghaWRzKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgbWFwID0gbmV3IE1hcCgpOwogICAgY29uc3QgbnVtYmVyVHJlZSA9IG5ldyBOdW1iZXJUcmVlKHBhcmVudFRyZWUsIHRoaXMueHJlZik7CiAgICBmb3IgKGNvbnN0IFtlbGVtSWRdIG9mIGlkcykgewogICAgICBjb25zdCBvYmogPSBudW1iZXJUcmVlLmdldFJhdyhlbGVtSWQpOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgbWFwLnNldChlbGVtSWQsIG9iaik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQogIHBhcnNlKHBhZ2VSZWYpIHsKICAgIGlmICghdGhpcy5yb290IHx8ICF0aGlzLnJvb3REaWN0IHx8ICEocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGFyZW50VHJlZSA9IHRoaXMucm9vdERpY3QuZ2V0KCJQYXJlbnRUcmVlIik7CiAgICBpZiAoIXBhcmVudFRyZWUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgaWQgPSB0aGlzLnBhZ2VEaWN0LmdldCgiU3RydWN0UGFyZW50cyIpOwogICAgY29uc3QgaWRzID0gdGhpcy5yb290LnN0cnVjdFBhcmVudElkcz8uZ2V0KHBhZ2VSZWYpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlkKSAmJiAhaWRzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTsKICAgIGNvbnN0IG51bWJlclRyZWUgPSBuZXcgTnVtYmVyVHJlZShwYXJlbnRUcmVlLCB0aGlzLnhyZWYpOwogICAgaWYgKE51bWJlci5pc0ludGVnZXIoaWQpKSB7CiAgICAgIGNvbnN0IHBhcmVudEFycmF5ID0gbnVtYmVyVHJlZS5nZXQoaWQpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJlbnRBcnJheSkpIHsKICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiBwYXJlbnRBcnJheSkgewogICAgICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICB0aGlzLmFkZE5vZGUodGhpcy54cmVmLmZldGNoKHJlZiksIG1hcCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIWlkcykgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IFtlbGVtSWQsIHR5cGVdIG9mIGlkcykgewogICAgICBjb25zdCBvYmogPSBudW1iZXJUcmVlLmdldChlbGVtSWQpOwogICAgICBpZiAob2JqKSB7CiAgICAgICAgY29uc3QgZWxlbSA9IHRoaXMuYWRkTm9kZSh0aGlzLnhyZWYuZmV0Y2hJZlJlZihvYmopLCBtYXApOwogICAgICAgIGlmIChlbGVtPy5raWRzPy5sZW5ndGggPT09IDEgJiYgZWxlbS5raWRzWzBdLnR5cGUgPT09IFN0cnVjdEVsZW1lbnRUeXBlLk9CSkVDVCkgewogICAgICAgICAgZWxlbS5raWRzWzBdLnR5cGUgPSB0eXBlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBhZGROb2RlKGRpY3QsIG1hcCwgbGV2ZWwgPSAwKSB7CiAgICBpZiAobGV2ZWwgPiBNQVhfREVQVEgpIHsKICAgICAgd2FybigiU3RydWN0VHJlZSBNQVhfREVQVEggcmVhY2hlZC4iKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAobWFwLmhhcyhkaWN0KSkgewogICAgICByZXR1cm4gbWFwLmdldChkaWN0KTsKICAgIH0KICAgIGNvbnN0IGVsZW1lbnQgPSBuZXcgU3RydWN0RWxlbWVudE5vZGUodGhpcywgZGljdCk7CiAgICBtYXAuc2V0KGRpY3QsIGVsZW1lbnQpOwogICAgY29uc3QgcGFyZW50ID0gZGljdC5nZXQoIlAiKTsKICAgIGlmICghcGFyZW50IHx8IGlzTmFtZShwYXJlbnQuZ2V0KCJUeXBlIiksICJTdHJ1Y3RUcmVlUm9vdCIpKSB7CiAgICAgIGlmICghdGhpcy5hZGRUb3BMZXZlbE5vZGUoZGljdCwgZWxlbWVudCkpIHsKICAgICAgICBtYXAuZGVsZXRlKGRpY3QpOwogICAgICB9CiAgICAgIHJldHVybiBlbGVtZW50OwogICAgfQogICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuYWRkTm9kZShwYXJlbnQsIG1hcCwgbGV2ZWwgKyAxKTsKICAgIGlmICghcGFyZW50Tm9kZSkgewogICAgICByZXR1cm4gZWxlbWVudDsKICAgIH0KICAgIGxldCBzYXZlID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IGtpZCBvZiBwYXJlbnROb2RlLmtpZHMpIHsKICAgICAgaWYgKGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5FTEVNRU5UICYmIGtpZC5kaWN0ID09PSBkaWN0KSB7CiAgICAgICAga2lkLnBhcmVudE5vZGUgPSBlbGVtZW50OwogICAgICAgIHNhdmUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAoIXNhdmUpIHsKICAgICAgbWFwLmRlbGV0ZShkaWN0KTsKICAgIH0KICAgIHJldHVybiBlbGVtZW50OwogIH0KICBhZGRUb3BMZXZlbE5vZGUoZGljdCwgZWxlbWVudCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5yb290RGljdC5nZXQoIksiKTsKICAgIGlmICghb2JqKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGlmIChvYmoub2JqSWQgIT09IGRpY3Qub2JqSWQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdGhpcy5ub2Rlc1swXSA9IGVsZW1lbnQ7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKCFBcnJheS5pc0FycmF5KG9iaikpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBsZXQgc2F2ZSA9IGZhbHNlOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3Qga2lkUmVmID0gb2JqW2ldOwogICAgICBpZiAoa2lkUmVmPy50b1N0cmluZygpID09PSBkaWN0Lm9iaklkKSB7CiAgICAgICAgdGhpcy5ub2Rlc1tpXSA9IGVsZW1lbnQ7CiAgICAgICAgc2F2ZSA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzYXZlOwogIH0KICBnZXQgc2VyaWFsaXphYmxlKCkgewogICAgZnVuY3Rpb24gbm9kZVRvU2VyaWFsaXphYmxlKG5vZGUsIHBhcmVudCwgbGV2ZWwgPSAwKSB7CiAgICAgIGlmIChsZXZlbCA+IE1BWF9ERVBUSCkgewogICAgICAgIHdhcm4oIlN0cnVjdFRyZWUgdG9vIGRlZXAgdG8gYmUgZnVsbHkgc2VyaWFsaXplZC4iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgb2JqLnJvbGUgPSBub2RlLnJvbGU7CiAgICAgIG9iai5jaGlsZHJlbiA9IFtdOwogICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChvYmopOwogICAgICBsZXQgYWx0ID0gbm9kZS5kaWN0LmdldCgiQWx0Iik7CiAgICAgIGlmICh0eXBlb2YgYWx0ICE9PSAic3RyaW5nIikgewogICAgICAgIGFsdCA9IG5vZGUuZGljdC5nZXQoIkFjdHVhbFRleHQiKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGFsdCA9PT0gInN0cmluZyIpIHsKICAgICAgICBvYmouYWx0ID0gc3RyaW5nVG9QREZTdHJpbmcoYWx0KTsKICAgICAgfQogICAgICBjb25zdCBhID0gbm9kZS5kaWN0LmdldCgiQSIpOwogICAgICBpZiAoYSBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjb25zdCBiYm94ID0gbG9va3VwTm9ybWFsUmVjdChhLmdldEFycmF5KCJCQm94IiksIG51bGwpOwogICAgICAgIGlmIChiYm94KSB7CiAgICAgICAgICBvYmouYmJveCA9IGJib3g7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHdpZHRoID0gYS5nZXQoIldpZHRoIik7CiAgICAgICAgICBjb25zdCBoZWlnaHQgPSBhLmdldCgiSGVpZ2h0Iik7CiAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIiAmJiB3aWR0aCA+IDAgJiYgdHlwZW9mIGhlaWdodCA9PT0gIm51bWJlciIgJiYgaGVpZ2h0ID4gMCkgewogICAgICAgICAgICBvYmouYmJveCA9IFswLCAwLCB3aWR0aCwgaGVpZ2h0XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgbGFuZyA9IG5vZGUuZGljdC5nZXQoIkxhbmciKTsKICAgICAgaWYgKHR5cGVvZiBsYW5nID09PSAic3RyaW5nIikgewogICAgICAgIG9iai5sYW5nID0gc3RyaW5nVG9QREZTdHJpbmcobGFuZyk7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBraWQgb2Ygbm9kZS5raWRzKSB7CiAgICAgICAgY29uc3Qga2lkRWxlbWVudCA9IGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5FTEVNRU5UID8ga2lkLnBhcmVudE5vZGUgOiBudWxsOwogICAgICAgIGlmIChraWRFbGVtZW50KSB7CiAgICAgICAgICBub2RlVG9TZXJpYWxpemFibGUoa2lkRWxlbWVudCwgb2JqLCBsZXZlbCArIDEpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBlbHNlIGlmIChraWQudHlwZSA9PT0gU3RydWN0RWxlbWVudFR5cGUuUEFHRV9DT05URU5UIHx8IGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5TVFJFQU1fQ09OVEVOVCkgewogICAgICAgICAgb2JqLmNoaWxkcmVuLnB1c2goewogICAgICAgICAgICB0eXBlOiAiY29udGVudCIsCiAgICAgICAgICAgIGlkOiBgcCR7a2lkLnBhZ2VPYmpJZH1fbWMke2tpZC5tY2lkfWAKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAoa2lkLnR5cGUgPT09IFN0cnVjdEVsZW1lbnRUeXBlLk9CSkVDVCkgewogICAgICAgICAgb2JqLmNoaWxkcmVuLnB1c2goewogICAgICAgICAgICB0eXBlOiAib2JqZWN0IiwKICAgICAgICAgICAgaWQ6IGtpZC5yZWZPYmpJZAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmIChraWQudHlwZSA9PT0gU3RydWN0RWxlbWVudFR5cGUuQU5OT1RBVElPTikgewogICAgICAgICAgb2JqLmNoaWxkcmVuLnB1c2goewogICAgICAgICAgICB0eXBlOiAiYW5ub3RhdGlvbiIsCiAgICAgICAgICAgIGlkOiBgJHtBbm5vdGF0aW9uUHJlZml4fSR7a2lkLnJlZk9iaklkfWAKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3Qgcm9vdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICByb290LmNoaWxkcmVuID0gW107CiAgICByb290LnJvbGUgPSAiUm9vdCI7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMubm9kZXMpIHsKICAgICAgaWYgKCFjaGlsZCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG5vZGVUb1NlcmlhbGl6YWJsZShjaGlsZCwgcm9vdCk7CiAgICB9CiAgICByZXR1cm4gcm9vdDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NhdGFsb2cuanMKCgoKCgoKCgoKCgpjb25zdCBpc1JlZiA9IHYgPT4gdiBpbnN0YW5jZW9mIFJlZjsKY29uc3QgaXNWYWxpZEV4cGxpY2l0RGVzdCA9IF9pc1ZhbGlkRXhwbGljaXREZXN0LmJpbmQobnVsbCwgaXNSZWYsIGlzTmFtZSk7CmZ1bmN0aW9uIGZldGNoRGVzdChkZXN0KSB7CiAgaWYgKGRlc3QgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBkZXN0ID0gZGVzdC5nZXQoIkQiKTsKICB9CiAgcmV0dXJuIGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkgPyBkZXN0IDogbnVsbDsKfQpmdW5jdGlvbiBmZXRjaFJlbW90ZURlc3QoYWN0aW9uKSB7CiAgbGV0IGRlc3QgPSBhY3Rpb24uZ2V0KCJEIik7CiAgaWYgKGRlc3QpIHsKICAgIGlmIChkZXN0IGluc3RhbmNlb2YgTmFtZSkgewogICAgICBkZXN0ID0gZGVzdC5uYW1lOwogICAgfQogICAgaWYgKHR5cGVvZiBkZXN0ID09PSAic3RyaW5nIikgewogICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZGVzdCk7CiAgICB9IGVsc2UgaWYgKGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkpIHsKICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRlc3QpOwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQpjbGFzcyBDYXRhbG9nIHsKICBjb25zdHJ1Y3RvcihwZGZNYW5hZ2VyLCB4cmVmKSB7CiAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuX2NhdERpY3QgPSB4cmVmLmdldENhdGFsb2dPYmooKTsKICAgIGlmICghKHRoaXMuX2NhdERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkNhdGFsb2cgb2JqZWN0IGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7CiAgICB9CiAgICB0aGlzLnRvcGxldmVsUGFnZXNEaWN0OwogICAgdGhpcy5fYWN0dWFsTnVtUGFnZXMgPSBudWxsOwogICAgdGhpcy5mb250Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IG5ldyBNYXAoKTsKICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlID0gbmV3IE1hcCgpOwogICAgdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUgPSBuZXcgR2xvYmFsQ29sb3JTcGFjZUNhY2hlKCk7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUgPSBuZXcgR2xvYmFsSW1hZ2VDYWNoZSgpOwogICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMucGFnZUluZGV4Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMucGFnZURpY3RDYWNoZSA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgdGhpcy5ub25CbGVuZE1vZGVzU2V0ID0gbmV3IFJlZlNldCgpOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUgPSBuZXcgTWFwKCk7CiAgfQogIGNsb25lRGljdCgpIHsKICAgIHJldHVybiB0aGlzLl9jYXREaWN0LmNsb25lKCk7CiAgfQogIGdldCB2ZXJzaW9uKCkgewogICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJWZXJzaW9uIik7CiAgICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgaWYgKFBERl9WRVJTSU9OX1JFR0VYUC50ZXN0KHZlcnNpb24ubmFtZSkpIHsKICAgICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2ZXJzaW9uIiwgdmVyc2lvbi5uYW1lKTsKICAgICAgfQogICAgICB3YXJuKGBJbnZhbGlkIFBERiBjYXRhbG9nIHZlcnNpb246ICR7dmVyc2lvbi5uYW1lfWApOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmVyc2lvbiIsIG51bGwpOwogIH0KICBnZXQgbGFuZygpIHsKICAgIGNvbnN0IGxhbmcgPSB0aGlzLl9jYXREaWN0LmdldCgiTGFuZyIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibGFuZyIsIGxhbmcgJiYgdHlwZW9mIGxhbmcgPT09ICJzdHJpbmciID8gc3RyaW5nVG9QREZTdHJpbmcobGFuZykgOiBudWxsKTsKICB9CiAgZ2V0IG5lZWRzUmVuZGVyaW5nKCkgewogICAgY29uc3QgbmVlZHNSZW5kZXJpbmcgPSB0aGlzLl9jYXREaWN0LmdldCgiTmVlZHNSZW5kZXJpbmciKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgIm5lZWRzUmVuZGVyaW5nIiwgdHlwZW9mIG5lZWRzUmVuZGVyaW5nID09PSAiYm9vbGVhbiIgPyBuZWVkc1JlbmRlcmluZyA6IGZhbHNlKTsKICB9CiAgZ2V0IGNvbGxlY3Rpb24oKSB7CiAgICBsZXQgY29sbGVjdGlvbiA9IG51bGw7CiAgICB0cnkgewogICAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiQ29sbGVjdGlvbiIpOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouc2l6ZSA+IDApIHsKICAgICAgICBjb2xsZWN0aW9uID0gb2JqOwogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIGluZm8oIkNhbm5vdCBmZXRjaCBDb2xsZWN0aW9uIGVudHJ5OyBhc3N1bWluZyBubyBjb2xsZWN0aW9uIGlzIHByZXNlbnQuIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjb2xsZWN0aW9uIiwgY29sbGVjdGlvbik7CiAgfQogIGdldCBhY3JvRm9ybSgpIHsKICAgIGxldCBhY3JvRm9ybSA9IG51bGw7CiAgICB0cnkgewogICAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiQWNyb0Zvcm0iKTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERpY3QgJiYgb2JqLnNpemUgPiAwKSB7CiAgICAgICAgYWNyb0Zvcm0gPSBvYmo7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgaW5mbygiQ2Fubm90IGZldGNoIEFjcm9Gb3JtIGVudHJ5OyBhc3N1bWluZyBubyBmb3JtcyBhcmUgcHJlc2VudC4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImFjcm9Gb3JtIiwgYWNyb0Zvcm0pOwogIH0KICBnZXQgYWNyb0Zvcm1SZWYoKSB7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJBY3JvRm9ybSIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYWNyb0Zvcm1SZWYiLCB2YWx1ZSBpbnN0YW5jZW9mIFJlZiA/IHZhbHVlIDogbnVsbCk7CiAgfQogIGdldCBtZXRhZGF0YSgpIHsKICAgIGNvbnN0IHN0cmVhbVJlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJNZXRhZGF0YSIpOwogICAgaWYgKCEoc3RyZWFtUmVmIGluc3RhbmNlb2YgUmVmKSkgewogICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJtZXRhZGF0YSIsIG51bGwpOwogICAgfQogICAgbGV0IG1ldGFkYXRhID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMueHJlZi5mZXRjaChzdHJlYW1SZWYsICF0aGlzLnhyZWYuZW5jcnlwdD8uZW5jcnlwdE1ldGFkYXRhKTsKICAgICAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gJiYgc3RyZWFtLmRpY3QgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgY29uc3QgdHlwZSA9IHN0cmVhbS5kaWN0LmdldCgiVHlwZSIpOwogICAgICAgIGNvbnN0IHN1YnR5cGUgPSBzdHJlYW0uZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgICBpZiAoaXNOYW1lKHR5cGUsICJNZXRhZGF0YSIpICYmIGlzTmFtZShzdWJ0eXBlLCAiWE1MIikpIHsKICAgICAgICAgIGNvbnN0IGRhdGEgPSBzdHJpbmdUb1VURjhTdHJpbmcoc3RyZWFtLmdldFN0cmluZygpKTsKICAgICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICAgIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhUGFyc2VyKGRhdGEpLnNlcmlhbGl6YWJsZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgaW5mbyhgU2tpcHBpbmcgaW52YWxpZCBNZXRhZGF0YTogIiR7ZXh9Ii5gKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIm1ldGFkYXRhIiwgbWV0YWRhdGEpOwogIH0KICBnZXQgbWFya0luZm8oKSB7CiAgICBsZXQgbWFya0luZm8gPSBudWxsOwogICAgdHJ5IHsKICAgICAgbWFya0luZm8gPSB0aGlzLl9yZWFkTWFya0luZm8oKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybigiVW5hYmxlIHRvIHJlYWQgbWFyayBpbmZvLiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibWFya0luZm8iLCBtYXJrSW5mbyk7CiAgfQogIF9yZWFkTWFya0luZm8oKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTWFya0luZm8iKTsKICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgbWFya0luZm8gPSB7CiAgICAgIE1hcmtlZDogZmFsc2UsCiAgICAgIFVzZXJQcm9wZXJ0aWVzOiBmYWxzZSwKICAgICAgU3VzcGVjdHM6IGZhbHNlCiAgICB9OwogICAgZm9yIChjb25zdCBrZXkgaW4gbWFya0luZm8pIHsKICAgICAgY29uc3QgdmFsdWUgPSBvYmouZ2V0KGtleSk7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJib29sZWFuIikgewogICAgICAgIG1hcmtJbmZvW2tleV0gPSB2YWx1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hcmtJbmZvOwogIH0KICBnZXQgc3RydWN0VHJlZVJvb3QoKSB7CiAgICBsZXQgc3RydWN0VHJlZSA9IG51bGw7CiAgICB0cnkgewogICAgICBzdHJ1Y3RUcmVlID0gdGhpcy4jcmVhZFN0cnVjdFRyZWVSb290KCk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIHdhcm4oIlVuYWJsZSByZWFkIHRvIHN0cnVjdFRyZWVSb290IGluZm8uIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJzdHJ1Y3RUcmVlUm9vdCIsIHN0cnVjdFRyZWUpOwogIH0KICAjcmVhZFN0cnVjdFRyZWVSb290KCkgewogICAgY29uc3QgcmF3T2JqID0gdGhpcy5fY2F0RGljdC5nZXRSYXcoIlN0cnVjdFRyZWVSb290Iik7CiAgICBjb25zdCBvYmogPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihyYXdPYmopOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCByb290ID0gbmV3IFN0cnVjdFRyZWVSb290KHRoaXMueHJlZiwgb2JqLCByYXdPYmopOwogICAgcm9vdC5pbml0KCk7CiAgICByZXR1cm4gcm9vdDsKICB9CiAgZ2V0IHRvcGxldmVsUGFnZXNEaWN0KCkgewogICAgY29uc3QgcGFnZXNPYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZXMiKTsKICAgIGlmICghKHBhZ2VzT2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHRvcC1sZXZlbCBwYWdlcyBkaWN0aW9uYXJ5LiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidG9wbGV2ZWxQYWdlc0RpY3QiLCBwYWdlc09iaik7CiAgfQogIGdldCBkb2N1bWVudE91dGxpbmUoKSB7CiAgICBsZXQgb2JqID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIG9iaiA9IHRoaXMuX3JlYWREb2N1bWVudE91dGxpbmUoKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybigiVW5hYmxlIHRvIHJlYWQgZG9jdW1lbnQgb3V0bGluZS4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImRvY3VtZW50T3V0bGluZSIsIG9iaik7CiAgfQogIF9yZWFkRG9jdW1lbnRPdXRsaW5lKCkgewogICAgbGV0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPdXRsaW5lcyIpOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBvYmogPSBvYmouZ2V0UmF3KCJGaXJzdCIpOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmVmKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHJvb3QgPSB7CiAgICAgIGl0ZW1zOiBbXQogICAgfTsKICAgIGNvbnN0IHF1ZXVlID0gW3sKICAgICAgb2JqLAogICAgICBwYXJlbnQ6IHJvb3QKICAgIH1dOwogICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IFJlZlNldCgpOwogICAgcHJvY2Vzc2VkLnB1dChvYmopOwogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKICAgICAgYmxhY2tDb2xvciA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTsKICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGkgPSBxdWV1ZS5zaGlmdCgpOwogICAgICBjb25zdCBvdXRsaW5lRGljdCA9IHhyZWYuZmV0Y2hJZlJlZihpLm9iaik7CiAgICAgIGlmIChvdXRsaW5lRGljdCA9PT0gbnVsbCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghb3V0bGluZURpY3QuaGFzKCJUaXRsZSIpKSB7CiAgICAgICAgd2FybigiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuIik7CiAgICAgIH0KICAgICAgY29uc3QgZGF0YSA9IHsKICAgICAgICB1cmw6IG51bGwsCiAgICAgICAgZGVzdDogbnVsbCwKICAgICAgICBhY3Rpb246IG51bGwKICAgICAgfTsKICAgICAgQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKICAgICAgICBkZXN0RGljdDogb3V0bGluZURpY3QsCiAgICAgICAgcmVzdWx0T2JqOiBkYXRhLAogICAgICAgIGRvY0Jhc2VVcmw6IHRoaXMuYmFzZVVybCwKICAgICAgICBkb2NBdHRhY2htZW50czogdGhpcy5hdHRhY2htZW50cwogICAgICB9KTsKICAgICAgY29uc3QgdGl0bGUgPSBvdXRsaW5lRGljdC5nZXQoIlRpdGxlIik7CiAgICAgIGNvbnN0IGZsYWdzID0gb3V0bGluZURpY3QuZ2V0KCJGIikgfHwgMDsKICAgICAgY29uc3QgY29sb3IgPSBvdXRsaW5lRGljdC5nZXRBcnJheSgiQyIpOwogICAgICBjb25zdCBjb3VudCA9IG91dGxpbmVEaWN0LmdldCgiQ291bnQiKTsKICAgICAgbGV0IHJnYkNvbG9yID0gYmxhY2tDb2xvcjsKICAgICAgaWYgKGlzTnVtYmVyQXJyYXkoY29sb3IsIDMpICYmIChjb2xvclswXSAhPT0gMCB8fCBjb2xvclsxXSAhPT0gMCB8fCBjb2xvclsyXSAhPT0gMCkpIHsKICAgICAgICByZ2JDb2xvciA9IENvbG9yU3BhY2VVdGlscy5yZ2IuZ2V0UmdiKGNvbG9yLCAwKTsKICAgICAgfQogICAgICBjb25zdCBvdXRsaW5lSXRlbSA9IHsKICAgICAgICBhY3Rpb246IGRhdGEuYWN0aW9uLAogICAgICAgIGF0dGFjaG1lbnQ6IGRhdGEuYXR0YWNobWVudCwKICAgICAgICBkZXN0OiBkYXRhLmRlc3QsCiAgICAgICAgdXJsOiBkYXRhLnVybCwKICAgICAgICB1bnNhZmVVcmw6IGRhdGEudW5zYWZlVXJsLAogICAgICAgIG5ld1dpbmRvdzogZGF0YS5uZXdXaW5kb3csCiAgICAgICAgc2V0T0NHU3RhdGU6IGRhdGEuc2V0T0NHU3RhdGUsCiAgICAgICAgdGl0bGU6IHR5cGVvZiB0aXRsZSA9PT0gInN0cmluZyIgPyBzdHJpbmdUb1BERlN0cmluZyh0aXRsZSkgOiAiIiwKICAgICAgICBjb2xvcjogcmdiQ29sb3IsCiAgICAgICAgY291bnQ6IE51bWJlci5pc0ludGVnZXIoY291bnQpID8gY291bnQgOiB1bmRlZmluZWQsCiAgICAgICAgYm9sZDogISEoZmxhZ3MgJiAyKSwKICAgICAgICBpdGFsaWM6ICEhKGZsYWdzICYgMSksCiAgICAgICAgaXRlbXM6IFtdCiAgICAgIH07CiAgICAgIGkucGFyZW50Lml0ZW1zLnB1c2gob3V0bGluZUl0ZW0pOwogICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoIkZpcnN0Iik7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZWYgJiYgIXByb2Nlc3NlZC5oYXMob2JqKSkgewogICAgICAgIHF1ZXVlLnB1c2goewogICAgICAgICAgb2JqLAogICAgICAgICAgcGFyZW50OiBvdXRsaW5lSXRlbQogICAgICAgIH0pOwogICAgICAgIHByb2Nlc3NlZC5wdXQob2JqKTsKICAgICAgfQogICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoIk5leHQiKTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZiAmJiAhcHJvY2Vzc2VkLmhhcyhvYmopKSB7CiAgICAgICAgcXVldWUucHVzaCh7CiAgICAgICAgICBvYmosCiAgICAgICAgICBwYXJlbnQ6IGkucGFyZW50CiAgICAgICAgfSk7CiAgICAgICAgcHJvY2Vzc2VkLnB1dChvYmopOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcm9vdC5pdGVtcy5sZW5ndGggPiAwID8gcm9vdC5pdGVtcyA6IG51bGw7CiAgfQogIGdldCBwZXJtaXNzaW9ucygpIHsKICAgIGxldCBwZXJtaXNzaW9ucyA9IG51bGw7CiAgICB0cnkgewogICAgICBwZXJtaXNzaW9ucyA9IHRoaXMuX3JlYWRQZXJtaXNzaW9ucygpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKCJVbmFibGUgdG8gcmVhZCBwZXJtaXNzaW9ucy4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInBlcm1pc3Npb25zIiwgcGVybWlzc2lvbnMpOwogIH0KICBfcmVhZFBlcm1pc3Npb25zKCkgewogICAgY29uc3QgZW5jcnlwdCA9IHRoaXMueHJlZi50cmFpbGVyLmdldCgiRW5jcnlwdCIpOwogICAgaWYgKCEoZW5jcnlwdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IGZsYWdzID0gZW5jcnlwdC5nZXQoIlAiKTsKICAgIGlmICh0eXBlb2YgZmxhZ3MgIT09ICJudW1iZXIiKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZmxhZ3MgKz0gMiAqKiAzMjsKICAgIGNvbnN0IHBlcm1pc3Npb25zID0gW107CiAgICBmb3IgKGNvbnN0IGtleSBpbiBQZXJtaXNzaW9uRmxhZykgewogICAgICBjb25zdCB2YWx1ZSA9IFBlcm1pc3Npb25GbGFnW2tleV07CiAgICAgIGlmIChmbGFncyAmIHZhbHVlKSB7CiAgICAgICAgcGVybWlzc2lvbnMucHVzaCh2YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwZXJtaXNzaW9uczsKICB9CiAgZ2V0IG9wdGlvbmFsQ29udGVudENvbmZpZygpIHsKICAgIGxldCBjb25maWcgPSBudWxsOwogICAgdHJ5IHsKICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPQ1Byb3BlcnRpZXMiKTsKICAgICAgaWYgKCFwcm9wZXJ0aWVzKSB7CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgbnVsbCk7CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IHByb3BlcnRpZXMuZ2V0KCJEIik7CiAgICAgIGlmICghZGVmYXVsdENvbmZpZykgewogICAgICAgIHJldHVybiBzaGFkb3codGhpcywgIm9wdGlvbmFsQ29udGVudENvbmZpZyIsIG51bGwpOwogICAgICB9CiAgICAgIGNvbnN0IGdyb3Vwc0RhdGEgPSBwcm9wZXJ0aWVzLmdldCgiT0NHcyIpOwogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZ3JvdXBzRGF0YSkpIHsKICAgICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJvcHRpb25hbENvbnRlbnRDb25maWciLCBudWxsKTsKICAgICAgfQogICAgICBjb25zdCBncm91cFJlZkNhY2hlID0gbmV3IFJlZlNldENhY2hlKCk7CiAgICAgIGZvciAoY29uc3QgZ3JvdXBSZWYgb2YgZ3JvdXBzRGF0YSkgewogICAgICAgIGlmICghKGdyb3VwUmVmIGluc3RhbmNlb2YgUmVmKSB8fCBncm91cFJlZkNhY2hlLmhhcyhncm91cFJlZikpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBncm91cFJlZkNhY2hlLnB1dChncm91cFJlZiwgdGhpcy4jcmVhZE9wdGlvbmFsQ29udGVudEdyb3VwKGdyb3VwUmVmKSk7CiAgICAgIH0KICAgICAgY29uZmlnID0gdGhpcy4jcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhkZWZhdWx0Q29uZmlnLCBncm91cFJlZkNhY2hlKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgVW5hYmxlIHRvIHJlYWQgb3B0aW9uYWwgY29udGVudCBjb25maWc6ICR7ZXh9YCk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJvcHRpb25hbENvbnRlbnRDb25maWciLCBjb25maWcpOwogIH0KICAjcmVhZE9wdGlvbmFsQ29udGVudEdyb3VwKGdyb3VwUmVmKSB7CiAgICBjb25zdCBncm91cCA9IHRoaXMueHJlZi5mZXRjaChncm91cFJlZik7CiAgICBjb25zdCBvYmogPSB7CiAgICAgIGlkOiBncm91cFJlZi50b1N0cmluZygpLAogICAgICBuYW1lOiBudWxsLAogICAgICBpbnRlbnQ6IG51bGwsCiAgICAgIHVzYWdlOiB7CiAgICAgICAgcHJpbnQ6IG51bGwsCiAgICAgICAgdmlldzogbnVsbAogICAgICB9LAogICAgICByYkdyb3VwczogW10KICAgIH07CiAgICBjb25zdCBuYW1lID0gZ3JvdXAuZ2V0KCJOYW1lIik7CiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICJzdHJpbmciKSB7CiAgICAgIG9iai5uYW1lID0gc3RyaW5nVG9QREZTdHJpbmcobmFtZSk7CiAgICB9CiAgICBsZXQgaW50ZW50ID0gZ3JvdXAuZ2V0QXJyYXkoIkludGVudCIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KGludGVudCkpIHsKICAgICAgaW50ZW50ID0gW2ludGVudF07CiAgICB9CiAgICBpZiAoaW50ZW50LmV2ZXJ5KGkgPT4gaSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgIG9iai5pbnRlbnQgPSBpbnRlbnQubWFwKGkgPT4gaS5uYW1lKTsKICAgIH0KICAgIGNvbnN0IHVzYWdlID0gZ3JvdXAuZ2V0KCJVc2FnZSIpOwogICAgaWYgKCEodXNhZ2UgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm4gb2JqOwogICAgfQogICAgY29uc3QgdXNhZ2VPYmogPSBvYmoudXNhZ2U7CiAgICBjb25zdCBwcmludCA9IHVzYWdlLmdldCgiUHJpbnQiKTsKICAgIGlmIChwcmludCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3QgcHJpbnRTdGF0ZSA9IHByaW50LmdldCgiUHJpbnRTdGF0ZSIpOwogICAgICBpZiAocHJpbnRTdGF0ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBzd2l0Y2ggKHByaW50U3RhdGUubmFtZSkgewogICAgICAgICAgY2FzZSAiT04iOgogICAgICAgICAgY2FzZSAiT0ZGIjoKICAgICAgICAgICAgdXNhZ2VPYmoucHJpbnQgPSB7CiAgICAgICAgICAgICAgcHJpbnRTdGF0ZTogcHJpbnRTdGF0ZS5uYW1lCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCB2aWV3ID0gdXNhZ2UuZ2V0KCJWaWV3Iik7CiAgICBpZiAodmlldyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3Qgdmlld1N0YXRlID0gdmlldy5nZXQoIlZpZXdTdGF0ZSIpOwogICAgICBpZiAodmlld1N0YXRlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIHN3aXRjaCAodmlld1N0YXRlLm5hbWUpIHsKICAgICAgICAgIGNhc2UgIk9OIjoKICAgICAgICAgIGNhc2UgIk9GRiI6CiAgICAgICAgICAgIHVzYWdlT2JqLnZpZXcgPSB7CiAgICAgICAgICAgICAgdmlld1N0YXRlOiB2aWV3U3RhdGUubmFtZQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG9iajsKICB9CiAgI3JlYWRPcHRpb25hbENvbnRlbnRDb25maWcoY29uZmlnLCBncm91cFJlZkNhY2hlKSB7CiAgICBmdW5jdGlvbiBwYXJzZU9uT2ZmKHJlZnMpIHsKICAgICAgY29uc3Qgb25QYXJzZWQgPSBbXTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVmcykpIHsKICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlZnMpIHsKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiBncm91cFJlZkNhY2hlLmhhcyh2YWx1ZSkpIHsKICAgICAgICAgICAgb25QYXJzZWQucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG9uUGFyc2VkOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VPcmRlcihyZWZzLCBuZXN0ZWRMZXZlbHMgPSAwKSB7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZWZzKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IG9yZGVyID0gW107CiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVmcykgewogICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiBncm91cFJlZkNhY2hlLmhhcyh2YWx1ZSkpIHsKICAgICAgICAgIHBhcnNlZE9yZGVyUmVmcy5wdXQodmFsdWUpOwogICAgICAgICAgb3JkZXIucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBuZXN0ZWRPcmRlciA9IHBhcnNlTmVzdGVkT3JkZXIodmFsdWUsIG5lc3RlZExldmVscyk7CiAgICAgICAgaWYgKG5lc3RlZE9yZGVyKSB7CiAgICAgICAgICBvcmRlci5wdXNoKG5lc3RlZE9yZGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG5lc3RlZExldmVscyA+IDApIHsKICAgICAgICByZXR1cm4gb3JkZXI7CiAgICAgIH0KICAgICAgY29uc3QgaGlkZGVuR3JvdXBzID0gW107CiAgICAgIGZvciAoY29uc3QgW2dyb3VwUmVmXSBvZiBncm91cFJlZkNhY2hlLml0ZW1zKCkpIHsKICAgICAgICBpZiAocGFyc2VkT3JkZXJSZWZzLmhhcyhncm91cFJlZikpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBoaWRkZW5Hcm91cHMucHVzaChncm91cFJlZi50b1N0cmluZygpKTsKICAgICAgfQogICAgICBpZiAoaGlkZGVuR3JvdXBzLmxlbmd0aCkgewogICAgICAgIG9yZGVyLnB1c2goewogICAgICAgICAgbmFtZTogbnVsbCwKICAgICAgICAgIG9yZGVyOiBoaWRkZW5Hcm91cHMKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gb3JkZXI7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZU5lc3RlZE9yZGVyKHJlZiwgbmVzdGVkTGV2ZWxzKSB7CiAgICAgIGlmICgrK25lc3RlZExldmVscyA+IE1BWF9ORVNURURfTEVWRUxTKSB7CiAgICAgICAgd2FybigicGFyc2VOZXN0ZWRPcmRlciAtIHJlYWNoZWQgTUFYX05FU1RFRF9MRVZFTFMuIik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgdmFsdWUgPSB4cmVmLmZldGNoSWZSZWYocmVmKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IG5lc3RlZE5hbWUgPSB4cmVmLmZldGNoSWZSZWYodmFsdWVbMF0pOwogICAgICBpZiAodHlwZW9mIG5lc3RlZE5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgbmVzdGVkT3JkZXIgPSBwYXJzZU9yZGVyKHZhbHVlLnNsaWNlKDEpLCBuZXN0ZWRMZXZlbHMpOwogICAgICBpZiAoIW5lc3RlZE9yZGVyPy5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIG5hbWU6IHN0cmluZ1RvUERGU3RyaW5nKG5lc3RlZE5hbWUpLAogICAgICAgIG9yZGVyOiBuZXN0ZWRPcmRlcgogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VSQkdyb3VwcyhyYkdyb3VwcykgewogICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmJHcm91cHMpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmJHcm91cHMpIHsKICAgICAgICBjb25zdCByYkdyb3VwID0geHJlZi5mZXRjaElmUmVmKHZhbHVlKTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmJHcm91cCkgfHwgIXJiR3JvdXAubGVuZ3RoKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGFyc2VkUmJHcm91cCA9IG5ldyBTZXQoKTsKICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiByYkdyb3VwKSB7CiAgICAgICAgICBpZiAocmVmIGluc3RhbmNlb2YgUmVmICYmIGdyb3VwUmVmQ2FjaGUuaGFzKHJlZikgJiYgIXBhcnNlZFJiR3JvdXAuaGFzKHJlZi50b1N0cmluZygpKSkgewogICAgICAgICAgICBwYXJzZWRSYkdyb3VwLmFkZChyZWYudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIGdyb3VwUmVmQ2FjaGUuZ2V0KHJlZikucmJHcm91cHMucHVzaChwYXJzZWRSYkdyb3VwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWYsCiAgICAgIHBhcnNlZE9yZGVyUmVmcyA9IG5ldyBSZWZTZXQoKSwKICAgICAgTUFYX05FU1RFRF9MRVZFTFMgPSAxMDsKICAgIHBhcnNlUkJHcm91cHMoY29uZmlnLmdldCgiUkJHcm91cHMiKSk7CiAgICByZXR1cm4gewogICAgICBuYW1lOiB0eXBlb2YgY29uZmlnLmdldCgiTmFtZSIpID09PSAic3RyaW5nIiA/IHN0cmluZ1RvUERGU3RyaW5nKGNvbmZpZy5nZXQoIk5hbWUiKSkgOiBudWxsLAogICAgICBjcmVhdG9yOiB0eXBlb2YgY29uZmlnLmdldCgiQ3JlYXRvciIpID09PSAic3RyaW5nIiA/IHN0cmluZ1RvUERGU3RyaW5nKGNvbmZpZy5nZXQoIkNyZWF0b3IiKSkgOiBudWxsLAogICAgICBiYXNlU3RhdGU6IGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpIGluc3RhbmNlb2YgTmFtZSA/IGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpLm5hbWUgOiBudWxsLAogICAgICBvbjogcGFyc2VPbk9mZihjb25maWcuZ2V0KCJPTiIpKSwKICAgICAgb2ZmOiBwYXJzZU9uT2ZmKGNvbmZpZy5nZXQoIk9GRiIpKSwKICAgICAgb3JkZXI6IHBhcnNlT3JkZXIoY29uZmlnLmdldCgiT3JkZXIiKSksCiAgICAgIGdyb3VwczogWy4uLmdyb3VwUmVmQ2FjaGVdCiAgICB9OwogIH0KICBzZXRBY3R1YWxOdW1QYWdlcyhudW0gPSBudWxsKSB7CiAgICB0aGlzLl9hY3R1YWxOdW1QYWdlcyA9IG51bTsKICB9CiAgZ2V0IGhhc0FjdHVhbE51bVBhZ2VzKCkgewogICAgcmV0dXJuIHRoaXMuX2FjdHVhbE51bVBhZ2VzICE9PSBudWxsOwogIH0KICBnZXQgX3BhZ2VzQ291bnQoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLnRvcGxldmVsUGFnZXNEaWN0LmdldCgiQ291bnQiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiUGFnZSBjb3VudCBpbiB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeSBpcyBub3QgYW4gaW50ZWdlci4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIl9wYWdlc0NvdW50Iiwgb2JqKTsKICB9CiAgZ2V0IG51bVBhZ2VzKCkgewogICAgcmV0dXJuIHRoaXMuaGFzQWN0dWFsTnVtUGFnZXMgPyB0aGlzLl9hY3R1YWxOdW1QYWdlcyA6IHRoaXMuX3BhZ2VzQ291bnQ7CiAgfQogIGdldCBkZXN0aW5hdGlvbnMoKSB7CiAgICBjb25zdCByYXdEZXN0cyA9IHRoaXMuI3JlYWREZXN0cygpLAogICAgICBkZXN0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmb3IgKGNvbnN0IG9iaiBvZiByYXdEZXN0cykgewogICAgICBpZiAob2JqIGluc3RhbmNlb2YgTmFtZVRyZWUpIHsKICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmouZ2V0QWxsKCkpIHsKICAgICAgICAgIGNvbnN0IGRlc3QgPSBmZXRjaERlc3QodmFsdWUpOwogICAgICAgICAgaWYgKGRlc3QpIHsKICAgICAgICAgICAgZGVzdHNbc3RyaW5nVG9QREZTdHJpbmcoa2V5KV0gPSBkZXN0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqKSB7CiAgICAgICAgICBjb25zdCBkZXN0ID0gZmV0Y2hEZXN0KHZhbHVlKTsKICAgICAgICAgIGlmIChkZXN0KSB7CiAgICAgICAgICAgIGRlc3RzW2tleV0gfHw9IGRlc3Q7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJkZXN0aW5hdGlvbnMiLCBkZXN0cyk7CiAgfQogIGdldERlc3RpbmF0aW9uKGlkKSB7CiAgICBjb25zdCByYXdEZXN0cyA9IHRoaXMuI3JlYWREZXN0cygpOwogICAgZm9yIChjb25zdCBvYmogb2YgcmF3RGVzdHMpIHsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVUcmVlIHx8IG9iaiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjb25zdCBkZXN0ID0gZmV0Y2hEZXN0KG9iai5nZXQoaWQpKTsKICAgICAgICBpZiAoZGVzdCkgewogICAgICAgICAgcmV0dXJuIGRlc3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAocmF3RGVzdHNbMF0gaW5zdGFuY2VvZiBOYW1lVHJlZSkgewogICAgICBjb25zdCBkZXN0ID0gdGhpcy5kZXN0aW5hdGlvbnNbaWRdOwogICAgICBpZiAoZGVzdCkgewogICAgICAgIHdhcm4oYEZvdW5kICIke2lkfSIgYXQgYW4gaW5jb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBOYW1lVHJlZS5gKTsKICAgICAgICByZXR1cm4gZGVzdDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogICNyZWFkRGVzdHMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTsKICAgIGNvbnN0IHJhd0Rlc3RzID0gW107CiAgICBpZiAob2JqPy5oYXMoIkRlc3RzIikpIHsKICAgICAgcmF3RGVzdHMucHVzaChuZXcgTmFtZVRyZWUob2JqLmdldFJhdygiRGVzdHMiKSwgdGhpcy54cmVmKSk7CiAgICB9CiAgICBpZiAodGhpcy5fY2F0RGljdC5oYXMoIkRlc3RzIikpIHsKICAgICAgcmF3RGVzdHMucHVzaCh0aGlzLl9jYXREaWN0LmdldCgiRGVzdHMiKSk7CiAgICB9CiAgICByZXR1cm4gcmF3RGVzdHM7CiAgfQogIGdldCBwYWdlTGFiZWxzKCkgewogICAgbGV0IG9iaiA9IG51bGw7CiAgICB0cnkgewogICAgICBvYmogPSB0aGlzLl9yZWFkUGFnZUxhYmVscygpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKCJVbmFibGUgdG8gcmVhZCBwYWdlIGxhYmVscy4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInBhZ2VMYWJlbHMiLCBvYmopOwogIH0KICBfcmVhZFBhZ2VMYWJlbHMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldFJhdygiUGFnZUxhYmVscyIpOwogICAgaWYgKCFvYmopIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwYWdlTGFiZWxzID0gbmV3IEFycmF5KHRoaXMubnVtUGFnZXMpOwogICAgbGV0IHN0eWxlID0gbnVsbCwKICAgICAgcHJlZml4ID0gIiI7CiAgICBjb25zdCBudW1iZXJUcmVlID0gbmV3IE51bWJlclRyZWUob2JqLCB0aGlzLnhyZWYpOwogICAgY29uc3QgbnVtcyA9IG51bWJlclRyZWUuZ2V0QWxsKCk7CiAgICBsZXQgY3VycmVudExhYmVsID0gIiIsCiAgICAgIGN1cnJlbnRJbmRleCA9IDE7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLm51bVBhZ2VzOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBsYWJlbERpY3QgPSBudW1zLmdldChpKTsKICAgICAgaWYgKGxhYmVsRGljdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgaWYgKCEobGFiZWxEaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiUGFnZUxhYmVsIGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIGlmIChsYWJlbERpY3QuaGFzKCJUeXBlIikgJiYgIWlzTmFtZShsYWJlbERpY3QuZ2V0KCJUeXBlIiksICJQYWdlTGFiZWwiKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHR5cGUgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIGlmIChsYWJlbERpY3QuaGFzKCJTIikpIHsKICAgICAgICAgIGNvbnN0IHMgPSBsYWJlbERpY3QuZ2V0KCJTIik7CiAgICAgICAgICBpZiAoIShzIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHN0eWxlIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGUgPSBzLm5hbWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0eWxlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlAiKSkgewogICAgICAgICAgY29uc3QgcCA9IGxhYmVsRGljdC5nZXQoIlAiKTsKICAgICAgICAgIGlmICh0eXBlb2YgcCAhPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHByZWZpeCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHByZWZpeCA9IHN0cmluZ1RvUERGU3RyaW5nKHApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmVmaXggPSAiIjsKICAgICAgICB9CiAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlN0IikpIHsKICAgICAgICAgIGNvbnN0IHN0ID0gbGFiZWxEaWN0LmdldCgiU3QiKTsKICAgICAgICAgIGlmICghKE51bWJlci5pc0ludGVnZXIoc3QpICYmIHN0ID49IDEpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBzdGFydCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGN1cnJlbnRJbmRleCA9IHN0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50SW5kZXggPSAxOwogICAgICAgIH0KICAgICAgfQogICAgICBzd2l0Y2ggKHN0eWxlKSB7CiAgICAgICAgY2FzZSAiRCI6CiAgICAgICAgICBjdXJyZW50TGFiZWwgPSBjdXJyZW50SW5kZXg7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJSIjoKICAgICAgICBjYXNlICJyIjoKICAgICAgICAgIGN1cnJlbnRMYWJlbCA9IHRvUm9tYW5OdW1lcmFscyhjdXJyZW50SW5kZXgsIHN0eWxlID09PSAiciIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQSI6CiAgICAgICAgY2FzZSAiYSI6CiAgICAgICAgICBjb25zdCBMSU1JVCA9IDI2OwogICAgICAgICAgY29uc3QgQV9VUFBFUl9DQVNFID0gMHg0MSwKICAgICAgICAgICAgQV9MT1dFUl9DQVNFID0gMHg2MTsKICAgICAgICAgIGNvbnN0IGJhc2VDaGFyQ29kZSA9IHN0eWxlID09PSAiYSIgPyBBX0xPV0VSX0NBU0UgOiBBX1VQUEVSX0NBU0U7CiAgICAgICAgICBjb25zdCBsZXR0ZXJJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7CiAgICAgICAgICBjb25zdCBjaGFyYWN0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJhc2VDaGFyQ29kZSArIGxldHRlckluZGV4ICUgTElNSVQpOwogICAgICAgICAgY3VycmVudExhYmVsID0gY2hhcmFjdGVyLnJlcGVhdChNYXRoLmZsb29yKGxldHRlckluZGV4IC8gTElNSVQpICsgMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKHN0eWxlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBzdHlsZSAiJHtzdHlsZX0iIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LmApOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudExhYmVsID0gIiI7CiAgICAgIH0KICAgICAgcGFnZUxhYmVsc1tpXSA9IHByZWZpeCArIGN1cnJlbnRMYWJlbDsKICAgICAgY3VycmVudEluZGV4Kys7CiAgICB9CiAgICByZXR1cm4gcGFnZUxhYmVsczsKICB9CiAgZ2V0IHBhZ2VMYXlvdXQoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZUxheW91dCIpOwogICAgbGV0IHBhZ2VMYXlvdXQgPSAiIjsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKICAgICAgICBjYXNlICJTaW5nbGVQYWdlIjoKICAgICAgICBjYXNlICJPbmVDb2x1bW4iOgogICAgICAgIGNhc2UgIlR3b0NvbHVtbkxlZnQiOgogICAgICAgIGNhc2UgIlR3b0NvbHVtblJpZ2h0IjoKICAgICAgICBjYXNlICJUd29QYWdlTGVmdCI6CiAgICAgICAgY2FzZSAiVHdvUGFnZVJpZ2h0IjoKICAgICAgICAgIHBhZ2VMYXlvdXQgPSBvYmoubmFtZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGFnZUxheW91dCIsIHBhZ2VMYXlvdXQpOwogIH0KICBnZXQgcGFnZU1vZGUoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZU1vZGUiKTsKICAgIGxldCBwYWdlTW9kZSA9ICJVc2VOb25lIjsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKICAgICAgICBjYXNlICJVc2VOb25lIjoKICAgICAgICBjYXNlICJVc2VPdXRsaW5lcyI6CiAgICAgICAgY2FzZSAiVXNlVGh1bWJzIjoKICAgICAgICBjYXNlICJGdWxsU2NyZWVuIjoKICAgICAgICBjYXNlICJVc2VPQyI6CiAgICAgICAgY2FzZSAiVXNlQXR0YWNobWVudHMiOgogICAgICAgICAgcGFnZU1vZGUgPSBvYmoubmFtZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGFnZU1vZGUiLCBwYWdlTW9kZSk7CiAgfQogIGdldCB2aWV3ZXJQcmVmZXJlbmNlcygpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJWaWV3ZXJQcmVmZXJlbmNlcyIpOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmlld2VyUHJlZmVyZW5jZXMiLCBudWxsKTsKICAgIH0KICAgIGxldCBwcmVmcyA9IG51bGw7CiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmopIHsKICAgICAgbGV0IHByZWZWYWx1ZTsKICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICBjYXNlICJIaWRlVG9vbGJhciI6CiAgICAgICAgY2FzZSAiSGlkZU1lbnViYXIiOgogICAgICAgIGNhc2UgIkhpZGVXaW5kb3dVSSI6CiAgICAgICAgY2FzZSAiRml0V2luZG93IjoKICAgICAgICBjYXNlICJDZW50ZXJXaW5kb3ciOgogICAgICAgIGNhc2UgIkRpc3BsYXlEb2NUaXRsZSI6CiAgICAgICAgY2FzZSAiUGlja1RyYXlCeVBERlNpemUiOgogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiTm9uRnVsbFNjcmVlblBhZ2VNb2RlIjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CiAgICAgICAgICAgICAgY2FzZSAiVXNlTm9uZSI6CiAgICAgICAgICAgICAgY2FzZSAiVXNlT3V0bGluZXMiOgogICAgICAgICAgICAgIGNhc2UgIlVzZVRodW1icyI6CiAgICAgICAgICAgICAgY2FzZSAiVXNlT0MiOgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiVXNlTm9uZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkRpcmVjdGlvbiI6CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgICAgICAgICAgIGNhc2UgIkwyUiI6CiAgICAgICAgICAgICAgY2FzZSAiUjJMIjoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIkwyUiI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlZpZXdBcmVhIjoKICAgICAgICBjYXNlICJWaWV3Q2xpcCI6CiAgICAgICAgY2FzZSAiUHJpbnRBcmVhIjoKICAgICAgICBjYXNlICJQcmludENsaXAiOgogICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKICAgICAgICAgICAgICBjYXNlICJNZWRpYUJveCI6CiAgICAgICAgICAgICAgY2FzZSAiQ3JvcEJveCI6CiAgICAgICAgICAgICAgY2FzZSAiQmxlZWRCb3giOgogICAgICAgICAgICAgIGNhc2UgIlRyaW1Cb3giOgogICAgICAgICAgICAgIGNhc2UgIkFydEJveCI6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJDcm9wQm94IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUHJpbnRTY2FsaW5nIjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CiAgICAgICAgICAgICAgY2FzZSAiTm9uZSI6CiAgICAgICAgICAgICAgY2FzZSAiQXBwRGVmYXVsdCI6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJBcHBEZWZhdWx0IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiRHVwbGV4IjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CiAgICAgICAgICAgICAgY2FzZSAiU2ltcGxleCI6CiAgICAgICAgICAgICAgY2FzZSAiRHVwbGV4RmxpcFNob3J0RWRnZSI6CiAgICAgICAgICAgICAgY2FzZSAiRHVwbGV4RmxpcExvbmdFZGdlIjoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIk5vbmUiOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJQcmludFBhZ2VSYW5nZSI6CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoICUgMiA9PT0gMCkgewogICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsdWUuZXZlcnkoKHBhZ2UsIGksIGFycikgPT4gTnVtYmVyLmlzSW50ZWdlcihwYWdlKSAmJiBwYWdlID4gMCAmJiAoaSA9PT0gMCB8fCBwYWdlID49IGFycltpIC0gMV0pICYmIHBhZ2UgPD0gdGhpcy5udW1QYWdlcyk7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkKSB7CiAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIk51bUNvcGllcyI6CiAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPiAwKSB7CiAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHdhcm4oYElnbm9yaW5nIG5vbi1zdGFuZGFyZCBrZXkgaW4gVmlld2VyUHJlZmVyZW5jZXM6ICR7a2V5fS5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChwcmVmVmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHdhcm4oYEJhZCB2YWx1ZSwgZm9yIGtleSAiJHtrZXl9IiwgaW4gVmlld2VyUHJlZmVyZW5jZXM6ICR7dmFsdWV9LmApOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghcHJlZnMpIHsKICAgICAgICBwcmVmcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIH0KICAgICAgcHJlZnNba2V5XSA9IHByZWZWYWx1ZTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInZpZXdlclByZWZlcmVuY2VzIiwgcHJlZnMpOwogIH0KICBnZXQgb3BlbkFjdGlvbigpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPcGVuQWN0aW9uIik7CiAgICBjb25zdCBvcGVuQWN0aW9uID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGRlc3REaWN0ID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgICAgZGVzdERpY3Quc2V0KCJBIiwgb2JqKTsKICAgICAgY29uc3QgcmVzdWx0T2JqID0gewogICAgICAgIHVybDogbnVsbCwKICAgICAgICBkZXN0OiBudWxsLAogICAgICAgIGFjdGlvbjogbnVsbAogICAgICB9OwogICAgICBDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoewogICAgICAgIGRlc3REaWN0LAogICAgICAgIHJlc3VsdE9iagogICAgICB9KTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0T2JqLmRlc3QpKSB7CiAgICAgICAgb3BlbkFjdGlvbi5kZXN0ID0gcmVzdWx0T2JqLmRlc3Q7CiAgICAgIH0gZWxzZSBpZiAocmVzdWx0T2JqLmFjdGlvbikgewogICAgICAgIG9wZW5BY3Rpb24uYWN0aW9uID0gcmVzdWx0T2JqLmFjdGlvbjsKICAgICAgfQogICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHsKICAgICAgb3BlbkFjdGlvbi5kZXN0ID0gb2JqOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAib3BlbkFjdGlvbiIsIG9iamVjdFNpemUob3BlbkFjdGlvbikgPiAwID8gb3BlbkFjdGlvbiA6IG51bGwpOwogIH0KICBnZXQgYXR0YWNobWVudHMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTsKICAgIGxldCBhdHRhY2htZW50cyA9IG51bGw7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouaGFzKCJFbWJlZGRlZEZpbGVzIikpIHsKICAgICAgY29uc3QgbmFtZVRyZWUgPSBuZXcgTmFtZVRyZWUob2JqLmdldFJhdygiRW1iZWRkZWRGaWxlcyIpLCB0aGlzLnhyZWYpOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuYW1lVHJlZS5nZXRBbGwoKSkgewogICAgICAgIGNvbnN0IGZzID0gbmV3IEZpbGVTcGVjKHZhbHVlLCB0aGlzLnhyZWYpOwogICAgICAgIGlmICghYXR0YWNobWVudHMpIHsKICAgICAgICAgIGF0dGFjaG1lbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB9CiAgICAgICAgYXR0YWNobWVudHNbc3RyaW5nVG9QREZTdHJpbmcoa2V5KV0gPSBmcy5zZXJpYWxpemFibGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImF0dGFjaG1lbnRzIiwgYXR0YWNobWVudHMpOwogIH0KICBnZXQgeGZhSW1hZ2VzKCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7CiAgICBsZXQgeGZhSW1hZ2VzID0gbnVsbDsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0ICYmIG9iai5oYXMoIlhGQUltYWdlcyIpKSB7CiAgICAgIGNvbnN0IG5hbWVUcmVlID0gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoIlhGQUltYWdlcyIpLCB0aGlzLnhyZWYpOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuYW1lVHJlZS5nZXRBbGwoKSkgewogICAgICAgIGlmICgheGZhSW1hZ2VzKSB7CiAgICAgICAgICB4ZmFJbWFnZXMgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgICAgIH0KICAgICAgICB4ZmFJbWFnZXMuc2V0KHN0cmluZ1RvUERGU3RyaW5nKGtleSksIHZhbHVlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAieGZhSW1hZ2VzIiwgeGZhSW1hZ2VzKTsKICB9CiAgX2NvbGxlY3RKYXZhU2NyaXB0KCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7CiAgICBsZXQgamF2YVNjcmlwdCA9IG51bGw7CiAgICBmdW5jdGlvbiBhcHBlbmRJZkphdmFTY3JpcHREaWN0KG5hbWUsIGpzRGljdCkgewogICAgICBpZiAoIShqc0RpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWlzTmFtZShqc0RpY3QuZ2V0KCJTIiksICJKYXZhU2NyaXB0IikpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGpzID0ganNEaWN0LmdldCgiSlMiKTsKICAgICAgaWYgKGpzIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGpzID0ganMuZ2V0U3RyaW5nKCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGpzICE9PSAic3RyaW5nIikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBqcyA9IHN0cmluZ1RvUERGU3RyaW5nKGpzKS5yZXBsYWNlQWxsKCJceDAwIiwgIiIpOwogICAgICBpZiAoanMpIHsKICAgICAgICAoamF2YVNjcmlwdCB8fD0gbmV3IE1hcCgpKS5zZXQobmFtZSwganMpOwogICAgICB9CiAgICB9CiAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouaGFzKCJKYXZhU2NyaXB0IikpIHsKICAgICAgY29uc3QgbmFtZVRyZWUgPSBuZXcgTmFtZVRyZWUob2JqLmdldFJhdygiSmF2YVNjcmlwdCIpLCB0aGlzLnhyZWYpOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuYW1lVHJlZS5nZXRBbGwoKSkgewogICAgICAgIGFwcGVuZElmSmF2YVNjcmlwdERpY3Qoc3RyaW5nVG9QREZTdHJpbmcoa2V5KSwgdmFsdWUpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBvcGVuQWN0aW9uID0gdGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKTsKICAgIGlmIChvcGVuQWN0aW9uKSB7CiAgICAgIGFwcGVuZElmSmF2YVNjcmlwdERpY3QoIk9wZW5BY3Rpb24iLCBvcGVuQWN0aW9uKTsKICAgIH0KICAgIHJldHVybiBqYXZhU2NyaXB0OwogIH0KICBnZXQganNBY3Rpb25zKCkgewogICAgY29uc3QgamF2YVNjcmlwdCA9IHRoaXMuX2NvbGxlY3RKYXZhU2NyaXB0KCk7CiAgICBsZXQgYWN0aW9ucyA9IGNvbGxlY3RBY3Rpb25zKHRoaXMueHJlZiwgdGhpcy5fY2F0RGljdCwgRG9jdW1lbnRBY3Rpb25FdmVudFR5cGUpOwogICAgaWYgKGphdmFTY3JpcHQpIHsKICAgICAgYWN0aW9ucyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIGphdmFTY3JpcHQpIHsKICAgICAgICBpZiAoa2V5IGluIGFjdGlvbnMpIHsKICAgICAgICAgIGFjdGlvbnNba2V5XS5wdXNoKHZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFjdGlvbnNba2V5XSA9IFt2YWxdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAianNBY3Rpb25zIiwgYWN0aW9ucyk7CiAgfQogIGFzeW5jIGNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQgPSBmYWxzZSkgewogICAgY2xlYXJHbG9iYWxDYWNoZXMoKTsKICAgIHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLmNsZWFyKCk7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuY2xlYXIobWFudWFsbHlUcmlnZ2VyZWQpOwogICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUuY2xlYXIoKTsKICAgIHRoaXMucGFnZUluZGV4Q2FjaGUuY2xlYXIoKTsKICAgIHRoaXMucGFnZURpY3RDYWNoZS5jbGVhcigpOwogICAgdGhpcy5ub25CbGVuZE1vZGVzU2V0LmNsZWFyKCk7CiAgICBmb3IgKGNvbnN0IHsKICAgICAgZGljdAogICAgfSBvZiBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmZvbnRDYWNoZSkpIHsKICAgICAgZGVsZXRlIGRpY3QuY2FjaGVLZXk7CiAgICB9CiAgICB0aGlzLmZvbnRDYWNoZS5jbGVhcigpOwogICAgdGhpcy5idWlsdEluQ01hcENhY2hlLmNsZWFyKCk7CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5jbGVhcigpOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUuY2xlYXIoKTsKICB9CiAgYXN5bmMgZ2V0UGFnZURpY3QocGFnZUluZGV4KSB7CiAgICBjb25zdCBub2Rlc1RvVmlzaXQgPSBbdGhpcy50b3BsZXZlbFBhZ2VzRGljdF07CiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgUmVmU2V0KCk7CiAgICBjb25zdCBwYWdlc1JlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlcyIpOwogICAgaWYgKHBhZ2VzUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHZpc2l0ZWROb2Rlcy5wdXQocGFnZXNSZWYpOwogICAgfQogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKICAgICAgcGFnZUtpZHNDb3VudENhY2hlID0gdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUsCiAgICAgIHBhZ2VJbmRleENhY2hlID0gdGhpcy5wYWdlSW5kZXhDYWNoZSwKICAgICAgcGFnZURpY3RDYWNoZSA9IHRoaXMucGFnZURpY3RDYWNoZTsKICAgIGxldCBjdXJyZW50UGFnZUluZGV4ID0gMDsKICAgIHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpOwogICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBjb25zdCBjb3VudCA9IHBhZ2VLaWRzQ291bnRDYWNoZS5nZXQoY3VycmVudE5vZGUpOwogICAgICAgIGlmIChjb3VudCA+PSAwICYmIGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8PSBwYWdlSW5kZXgpIHsKICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZpc2l0ZWROb2Rlcy5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlBhZ2VzIHRyZWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwogICAgICAgIH0KICAgICAgICB2aXNpdGVkTm9kZXMucHV0KGN1cnJlbnROb2RlKTsKICAgICAgICBjb25zdCBvYmogPSBhd2FpdCAocGFnZURpY3RDYWNoZS5nZXQoY3VycmVudE5vZGUpIHx8IHhyZWYuZmV0Y2hBc3luYyhjdXJyZW50Tm9kZSkpOwogICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICBsZXQgdHlwZSA9IG9iai5nZXRSYXcoIlR5cGUiKTsKICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNOYW1lKHR5cGUsICJQYWdlIikgfHwgIW9iai5oYXMoIktpZHMiKSkgewogICAgICAgICAgICBpZiAoIXBhZ2VLaWRzQ291bnRDYWNoZS5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICAgICAgcGFnZUtpZHNDb3VudENhY2hlLnB1dChjdXJyZW50Tm9kZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFwYWdlSW5kZXhDYWNoZS5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICAgICAgcGFnZUluZGV4Q2FjaGUucHV0KGN1cnJlbnROb2RlLCBjdXJyZW50UGFnZUluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3VycmVudFBhZ2VJbmRleCA9PT0gcGFnZUluZGV4KSB7CiAgICAgICAgICAgICAgcmV0dXJuIFtvYmosIGN1cnJlbnROb2RlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50UGFnZUluZGV4Kys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChvYmopOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlBhZ2UgZGljdGlvbmFyeSBraWQgcmVmZXJlbmNlIHBvaW50cyB0byB3cm9uZyB0eXBlIG9mIG9iamVjdC4iKTsKICAgICAgfQogICAgICBjb25zdCB7CiAgICAgICAgb2JqSWQKICAgICAgfSA9IGN1cnJlbnROb2RlOwogICAgICBsZXQgY291bnQgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIkNvdW50Iik7CiAgICAgIGlmIChjb3VudCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGNvdW50ID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGNvdW50KTsKICAgICAgfQogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihjb3VudCkgJiYgY291bnQgPj0gMCkgewogICAgICAgIGlmIChvYmpJZCAmJiAhcGFnZUtpZHNDb3VudENhY2hlLmhhcyhvYmpJZCkpIHsKICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZS5wdXQob2JqSWQsIGNvdW50KTsKICAgICAgICB9CiAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8PSBwYWdlSW5kZXgpIHsKICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGV0IGtpZHMgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIktpZHMiKTsKICAgICAgaWYgKGtpZHMgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBraWRzID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGtpZHMpOwogICAgICB9CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkgewogICAgICAgIGxldCB0eXBlID0gY3VycmVudE5vZGUuZ2V0UmF3KCJUeXBlIik7CiAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChpc05hbWUodHlwZSwgIlBhZ2UiKSB8fCAhY3VycmVudE5vZGUuaGFzKCJLaWRzIikpIHsKICAgICAgICAgIGlmIChjdXJyZW50UGFnZUluZGV4ID09PSBwYWdlSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIFtjdXJyZW50Tm9kZSwgbnVsbF07CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50UGFnZUluZGV4Kys7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpOwogICAgICB9CiAgICAgIGZvciAobGV0IGxhc3QgPSBraWRzLmxlbmd0aCAtIDE7IGxhc3QgPj0gMDsgbGFzdC0tKSB7CiAgICAgICAgY29uc3QgbGFzdEtpZCA9IGtpZHNbbGFzdF07CiAgICAgICAgbm9kZXNUb1Zpc2l0LnB1c2gobGFzdEtpZCk7CiAgICAgICAgaWYgKGN1cnJlbnROb2RlID09PSB0aGlzLnRvcGxldmVsUGFnZXNEaWN0ICYmIGxhc3RLaWQgaW5zdGFuY2VvZiBSZWYgJiYgIXBhZ2VEaWN0Q2FjaGUuaGFzKGxhc3RLaWQpKSB7CiAgICAgICAgICBwYWdlRGljdENhY2hlLnB1dChsYXN0S2lkLCB4cmVmLmZldGNoQXN5bmMobGFzdEtpZCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKGBQYWdlIGluZGV4ICR7cGFnZUluZGV4fSBub3QgZm91bmQuYCk7CiAgfQogIGFzeW5jIGdldEFsbFBhZ2VEaWN0cyhyZWNvdmVyeU1vZGUgPSBmYWxzZSkgewogICAgY29uc3QgewogICAgICBpZ25vcmVFcnJvcnMKICAgIH0gPSB0aGlzLnBkZk1hbmFnZXIuZXZhbHVhdG9yT3B0aW9uczsKICAgIGNvbnN0IHF1ZXVlID0gW3sKICAgICAgY3VycmVudE5vZGU6IHRoaXMudG9wbGV2ZWxQYWdlc0RpY3QsCiAgICAgIHBvc0luS2lkczogMAogICAgfV07CiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgUmVmU2V0KCk7CiAgICBjb25zdCBwYWdlc1JlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlcyIpOwogICAgaWYgKHBhZ2VzUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHZpc2l0ZWROb2Rlcy5wdXQocGFnZXNSZWYpOwogICAgfQogICAgY29uc3QgbWFwID0gbmV3IE1hcCgpLAogICAgICB4cmVmID0gdGhpcy54cmVmLAogICAgICBwYWdlSW5kZXhDYWNoZSA9IHRoaXMucGFnZUluZGV4Q2FjaGU7CiAgICBsZXQgcGFnZUluZGV4ID0gMDsKICAgIGZ1bmN0aW9uIGFkZFBhZ2VEaWN0KHBhZ2VEaWN0LCBwYWdlUmVmKSB7CiAgICAgIGlmIChwYWdlUmVmICYmICFwYWdlSW5kZXhDYWNoZS5oYXMocGFnZVJlZikpIHsKICAgICAgICBwYWdlSW5kZXhDYWNoZS5wdXQocGFnZVJlZiwgcGFnZUluZGV4KTsKICAgICAgfQogICAgICBtYXAuc2V0KHBhZ2VJbmRleCsrLCBbcGFnZURpY3QsIHBhZ2VSZWZdKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZFBhZ2VFcnJvcihlcnJvcikgewogICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBYUmVmRW50cnlFeGNlcHRpb24gJiYgIXJlY292ZXJ5TW9kZSkgewogICAgICAgIHRocm93IGVycm9yOwogICAgICB9CiAgICAgIGlmIChyZWNvdmVyeU1vZGUgJiYgaWdub3JlRXJyb3JzICYmIHBhZ2VJbmRleCA9PT0gMCkgewogICAgICAgIHdhcm4oYGdldEFsbFBhZ2VEaWN0cyAtIFNraXBwaW5nIGludmFsaWQgZmlyc3QgcGFnZTogIiR7ZXJyb3J9Ii5gKTsKICAgICAgICBlcnJvciA9IERpY3QuZW1wdHk7CiAgICAgIH0KICAgICAgbWFwLnNldChwYWdlSW5kZXgrKywgW2Vycm9yLCBudWxsXSk7CiAgICB9CiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBxdWV1ZS5hdCgtMSk7CiAgICAgIGNvbnN0IHsKICAgICAgICBjdXJyZW50Tm9kZSwKICAgICAgICBwb3NJbktpZHMKICAgICAgfSA9IHF1ZXVlSXRlbTsKICAgICAgbGV0IGtpZHMgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIktpZHMiKTsKICAgICAgaWYgKGtpZHMgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICB0cnkgewogICAgICAgICAga2lkcyA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyhraWRzKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgYWRkUGFnZUVycm9yKGV4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgICBhZGRQYWdlRXJyb3IobmV3IEZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAocG9zSW5LaWRzID49IGtpZHMubGVuZ3RoKSB7CiAgICAgICAgcXVldWUucG9wKCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3Qga2lkT2JqID0ga2lkc1twb3NJbktpZHNdOwogICAgICBsZXQgb2JqOwogICAgICBpZiAoa2lkT2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgaWYgKHZpc2l0ZWROb2Rlcy5oYXMoa2lkT2JqKSkgewogICAgICAgICAgYWRkUGFnZUVycm9yKG5ldyBGb3JtYXRFcnJvcigiUGFnZXMgdHJlZSBjb250YWlucyBjaXJjdWxhciByZWZlcmVuY2UuIikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHZpc2l0ZWROb2Rlcy5wdXQoa2lkT2JqKTsKICAgICAgICB0cnkgewogICAgICAgICAgb2JqID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGtpZE9iaik7CiAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgIGFkZFBhZ2VFcnJvcihleCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb2JqID0ga2lkT2JqOwogICAgICB9CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgYWRkUGFnZUVycm9yKG5ldyBGb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZCByZWZlcmVuY2UgcG9pbnRzIHRvIHdyb25nIHR5cGUgb2Ygb2JqZWN0LiIpKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBsZXQgdHlwZSA9IG9iai5nZXRSYXcoIlR5cGUiKTsKICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdHlwZSA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyh0eXBlKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgYWRkUGFnZUVycm9yKGV4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNOYW1lKHR5cGUsICJQYWdlIikgfHwgIW9iai5oYXMoIktpZHMiKSkgewogICAgICAgIGFkZFBhZ2VEaWN0KG9iaiwga2lkT2JqIGluc3RhbmNlb2YgUmVmID8ga2lkT2JqIDogbnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcXVldWUucHVzaCh7CiAgICAgICAgICBjdXJyZW50Tm9kZTogb2JqLAogICAgICAgICAgcG9zSW5LaWRzOiAwCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcXVldWVJdGVtLnBvc0luS2lkcysrOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgZ2V0UGFnZUluZGV4KHBhZ2VSZWYpIHsKICAgIGNvbnN0IGNhY2hlZFBhZ2VJbmRleCA9IHRoaXMucGFnZUluZGV4Q2FjaGUuZ2V0KHBhZ2VSZWYpOwogICAgaWYgKGNhY2hlZFBhZ2VJbmRleCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FjaGVkUGFnZUluZGV4KTsKICAgIH0KICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CiAgICBmdW5jdGlvbiBwYWdlc0JlZm9yZVJlZihraWRSZWYpIHsKICAgICAgbGV0IHRvdGFsID0gMCwKICAgICAgICBwYXJlbnRSZWY7CiAgICAgIHJldHVybiB4cmVmLmZldGNoQXN5bmMoa2lkUmVmKS50aGVuKGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgaWYgKGlzUmVmc0VxdWFsKGtpZFJlZiwgcGFnZVJlZikgJiYgIWlzRGljdChub2RlLCAiUGFnZSIpICYmICEobm9kZSBpbnN0YW5jZW9mIERpY3QgJiYgIW5vZGUuaGFzKCJUeXBlIikgJiYgbm9kZS5oYXMoIkNvbnRlbnRzIikpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlRoZSByZWZlcmVuY2UgZG9lcyBub3QgcG9pbnQgdG8gYSAvUGFnZSBkaWN0aW9uYXJ5LiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKICAgICAgICB9CiAgICAgICAgcGFyZW50UmVmID0gbm9kZS5nZXRSYXcoIlBhcmVudCIpOwogICAgICAgIHJldHVybiBub2RlLmdldEFzeW5jKCJQYXJlbnQiKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAocGFyZW50KSB7CiAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYXJlbnQgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJlbnQuZ2V0QXN5bmMoIktpZHMiKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAoa2lkcykgewogICAgICAgIGlmICgha2lkcykgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGtpZFByb21pc2VzID0gW107CiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7CiAgICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgICAgaWYgKCEoa2lkIGluc3RhbmNlb2YgUmVmKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIktpZCBtdXN0IGJlIGEgcmVmZXJlbmNlLiIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzUmVmc0VxdWFsKGtpZCwga2lkUmVmKSkgewogICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAga2lkUHJvbWlzZXMucHVzaCh4cmVmLmZldGNoQXN5bmMoa2lkKS50aGVuKGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIktpZCBub2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvYmouaGFzKCJDb3VudCIpKSB7CiAgICAgICAgICAgICAgdG90YWwgKz0gb2JqLmdldCgiQ291bnQiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0b3RhbCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiS2lkIHJlZmVyZW5jZSBub3QgZm91bmQgaW4gcGFyZW50J3Mga2lkcy4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGtpZFByb21pc2VzKS50aGVuKCgpID0+IFt0b3RhbCwgcGFyZW50UmVmXSk7CiAgICAgIH0pOwogICAgfQogICAgbGV0IHRvdGFsID0gMDsKICAgIGNvbnN0IG5leHQgPSByZWYgPT4gcGFnZXNCZWZvcmVSZWYocmVmKS50aGVuKGFyZ3MgPT4gewogICAgICBpZiAoIWFyZ3MpIHsKICAgICAgICB0aGlzLnBhZ2VJbmRleENhY2hlLnB1dChwYWdlUmVmLCB0b3RhbCk7CiAgICAgICAgcmV0dXJuIHRvdGFsOwogICAgICB9CiAgICAgIGNvbnN0IFtjb3VudCwgcGFyZW50UmVmXSA9IGFyZ3M7CiAgICAgIHRvdGFsICs9IGNvdW50OwogICAgICByZXR1cm4gbmV4dChwYXJlbnRSZWYpOwogICAgfSk7CiAgICByZXR1cm4gbmV4dChwYWdlUmVmKTsKICB9CiAgZ2V0IGJhc2VVcmwoKSB7CiAgICBjb25zdCB1cmkgPSB0aGlzLl9jYXREaWN0LmdldCgiVVJJIik7CiAgICBpZiAodXJpIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBiYXNlID0gdXJpLmdldCgiQmFzZSIpOwogICAgICBpZiAodHlwZW9mIGJhc2UgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsKGJhc2UsIG51bGwsIHsKICAgICAgICAgIHRyeUNvbnZlcnRFbmNvZGluZzogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIGlmIChhYnNvbHV0ZVVybCkgewogICAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYmFzZVVybCIsIGFic29sdXRlVXJsLmhyZWYpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYmFzZVVybCIsIHRoaXMucGRmTWFuYWdlci5kb2NCYXNlVXJsKTsKICB9CiAgc3RhdGljIHBhcnNlRGVzdERpY3Rpb25hcnkoewogICAgZGVzdERpY3QsCiAgICByZXN1bHRPYmosCiAgICBkb2NCYXNlVXJsID0gbnVsbCwKICAgIGRvY0F0dGFjaG1lbnRzID0gbnVsbAogIH0pIHsKICAgIGlmICghKGRlc3REaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgd2FybigicGFyc2VEZXN0RGljdGlvbmFyeTogYGRlc3REaWN0YCBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGFjdGlvbiA9IGRlc3REaWN0LmdldCgiQSIpLAogICAgICB1cmwsCiAgICAgIGRlc3Q7CiAgICBpZiAoIShhY3Rpb24gaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICBpZiAoZGVzdERpY3QuaGFzKCJEZXN0IikpIHsKICAgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkRlc3QiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkFBIik7CiAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgIGlmIChhY3Rpb24uaGFzKCJEIikpIHsKICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uLmdldCgiRCIpOwogICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaGFzKCJVIikpIHsKICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uLmdldCgiVSIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3QgYWN0aW9uVHlwZSA9IGFjdGlvbi5nZXQoIlMiKTsKICAgICAgaWYgKCEoYWN0aW9uVHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgd2FybigicGFyc2VEZXN0RGljdGlvbmFyeTogSW52YWxpZCB0eXBlIGluIEFjdGlvbiBkaWN0aW9uYXJ5LiIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBhY3Rpb25OYW1lID0gYWN0aW9uVHlwZS5uYW1lOwogICAgICBzd2l0Y2ggKGFjdGlvbk5hbWUpIHsKICAgICAgICBjYXNlICJSZXNldEZvcm0iOgogICAgICAgICAgY29uc3QgZmxhZ3MgPSBhY3Rpb24uZ2V0KCJGbGFncyIpOwogICAgICAgICAgY29uc3QgaW5jbHVkZSA9ICgodHlwZW9mIGZsYWdzID09PSAibnVtYmVyIiA/IGZsYWdzIDogMCkgJiAxKSA9PT0gMDsKICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IFtdOwogICAgICAgICAgY29uc3QgcmVmcyA9IFtdOwogICAgICAgICAgZm9yIChjb25zdCBvYmogb2YgYWN0aW9uLmdldCgiRmllbGRzIikgfHwgW10pIHsKICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgIHJlZnMucHVzaChvYmoudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICBmaWVsZHMucHVzaChzdHJpbmdUb1BERlN0cmluZyhvYmopKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0T2JqLnJlc2V0Rm9ybSA9IHsKICAgICAgICAgICAgZmllbGRzLAogICAgICAgICAgICByZWZzLAogICAgICAgICAgICBpbmNsdWRlCiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiVVJJIjoKICAgICAgICAgIHVybCA9IGFjdGlvbi5nZXQoIlVSSSIpOwogICAgICAgICAgaWYgKHVybCBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgdXJsID0gIi8iICsgdXJsLm5hbWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJHb1RvIjoKICAgICAgICAgIGRlc3QgPSBhY3Rpb24uZ2V0KCJEIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJMYXVuY2giOgogICAgICAgIGNhc2UgIkdvVG9SIjoKICAgICAgICAgIGNvbnN0IHVybERpY3QgPSBhY3Rpb24uZ2V0KCJGIik7CiAgICAgICAgICBpZiAodXJsRGljdCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgY29uc3QgZnMgPSBuZXcgRmlsZVNwZWModXJsRGljdCwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICByYXdGaWxlbmFtZQogICAgICAgICAgICB9ID0gZnMuc2VyaWFsaXphYmxlOwogICAgICAgICAgICB1cmwgPSByYXdGaWxlbmFtZTsKICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVybERpY3QgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIHVybCA9IHVybERpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCByZW1vdGVEZXN0ID0gZmV0Y2hSZW1vdGVEZXN0KGFjdGlvbik7CiAgICAgICAgICBpZiAocmVtb3RlRGVzdCAmJiB0eXBlb2YgdXJsID09PSAic3RyaW5nIikgewogICAgICAgICAgICB1cmwgPSB1cmwuc3BsaXQoIiMiLCAxKVswXSArICIjIiArIHJlbW90ZURlc3Q7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBuZXdXaW5kb3cgPSBhY3Rpb24uZ2V0KCJOZXdXaW5kb3ciKTsKICAgICAgICAgIGlmICh0eXBlb2YgbmV3V2luZG93ID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgcmVzdWx0T2JqLm5ld1dpbmRvdyA9IG5ld1dpbmRvdzsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkdvVG9FIjoKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGFjdGlvbi5nZXQoIlQiKTsKICAgICAgICAgIGxldCBhdHRhY2htZW50OwogICAgICAgICAgaWYgKGRvY0F0dGFjaG1lbnRzICYmIHRhcmdldCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gdGFyZ2V0LmdldCgiUiIpOwogICAgICAgICAgICBjb25zdCBuYW1lID0gdGFyZ2V0LmdldCgiTiIpOwogICAgICAgICAgICBpZiAoaXNOYW1lKHJlbGF0aW9uc2hpcCwgIkMiKSAmJiB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICBhdHRhY2htZW50ID0gZG9jQXR0YWNobWVudHNbc3RyaW5nVG9QREZTdHJpbmcobmFtZSldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYXR0YWNobWVudCkgewogICAgICAgICAgICByZXN1bHRPYmouYXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7CiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnREZXN0ID0gZmV0Y2hSZW1vdGVEZXN0KGFjdGlvbik7CiAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzdCkgewogICAgICAgICAgICAgIHJlc3VsdE9iai5hdHRhY2htZW50RGVzdCA9IGF0dGFjaG1lbnREZXN0OwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3YXJuKGBwYXJzZURlc3REaWN0aW9uYXJ5IC0gdW5pbXBsZW1lbnRlZCAiR29Ub0UiIGFjdGlvbi5gKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIk5hbWVkIjoKICAgICAgICAgIGNvbnN0IG5hbWVkQWN0aW9uID0gYWN0aW9uLmdldCgiTiIpOwogICAgICAgICAgaWYgKG5hbWVkQWN0aW9uIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICByZXN1bHRPYmouYWN0aW9uID0gbmFtZWRBY3Rpb24ubmFtZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlNldE9DR1N0YXRlIjoKICAgICAgICAgIGNvbnN0IHN0YXRlID0gYWN0aW9uLmdldCgiU3RhdGUiKTsKICAgICAgICAgIGNvbnN0IHByZXNlcnZlUkIgPSBhY3Rpb24uZ2V0KCJQcmVzZXJ2ZVJCIik7CiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RhdGUpIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0YXRlQXJyID0gW107CiAgICAgICAgICBmb3IgKGNvbnN0IGVsZW0gb2Ygc3RhdGUpIHsKICAgICAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChlbGVtLm5hbWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgIk9OIjoKICAgICAgICAgICAgICAgIGNhc2UgIk9GRiI6CiAgICAgICAgICAgICAgICBjYXNlICJUb2dnbGUiOgogICAgICAgICAgICAgICAgICBzdGF0ZUFyci5wdXNoKGVsZW0ubmFtZSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgICAgc3RhdGVBcnIucHVzaChlbGVtLnRvU3RyaW5nKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3RhdGVBcnIubGVuZ3RoICE9PSBzdGF0ZS5sZW5ndGgpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHRPYmouc2V0T0NHU3RhdGUgPSB7CiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZUFyciwKICAgICAgICAgICAgcHJlc2VydmVSQjogdHlwZW9mIHByZXNlcnZlUkIgPT09ICJib29sZWFuIiA/IHByZXNlcnZlUkIgOiB0cnVlCiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiSmF2YVNjcmlwdCI6CiAgICAgICAgICBjb25zdCBqc0FjdGlvbiA9IGFjdGlvbi5nZXQoIkpTIik7CiAgICAgICAgICBsZXQganM7CiAgICAgICAgICBpZiAoanNBY3Rpb24gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgICAgIGpzID0ganNBY3Rpb24uZ2V0U3RyaW5nKCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBqc0FjdGlvbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAganMgPSBqc0FjdGlvbjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGpzVVJMID0ganMgJiYgcmVjb3ZlckpzVVJMKHN0cmluZ1RvUERGU3RyaW5nKGpzKSk7CiAgICAgICAgICBpZiAoanNVUkwpIHsKICAgICAgICAgICAgdXJsID0ganNVUkwudXJsOwogICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0ganNVUkwubmV3V2luZG93OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKGFjdGlvbk5hbWUgPT09ICJKYXZhU2NyaXB0IiB8fCBhY3Rpb25OYW1lID09PSAiU3VibWl0Rm9ybSIpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB3YXJuKGBwYXJzZURlc3REaWN0aW9uYXJ5IC0gdW5zdXBwb3J0ZWQgYWN0aW9uOiAiJHthY3Rpb25OYW1lfSIuYCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBlbHNlIGlmIChkZXN0RGljdC5oYXMoIkRlc3QiKSkgewogICAgICBkZXN0ID0gZGVzdERpY3QuZ2V0KCJEZXN0Iik7CiAgICB9CiAgICBpZiAodHlwZW9mIHVybCA9PT0gInN0cmluZyIpIHsKICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgZG9jQmFzZVVybCwgewogICAgICAgIGFkZERlZmF1bHRQcm90b2NvbDogdHJ1ZSwKICAgICAgICB0cnlDb252ZXJ0RW5jb2Rpbmc6IHRydWUKICAgICAgfSk7CiAgICAgIGlmIChhYnNvbHV0ZVVybCkgewogICAgICAgIHJlc3VsdE9iai51cmwgPSBhYnNvbHV0ZVVybC5ocmVmOwogICAgICB9CiAgICAgIHJlc3VsdE9iai51bnNhZmVVcmwgPSB1cmw7CiAgICB9CiAgICBpZiAoZGVzdCkgewogICAgICBpZiAoZGVzdCBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBkZXN0ID0gZGVzdC5uYW1lOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXN1bHRPYmouZGVzdCA9IHN0cmluZ1RvUERGU3RyaW5nKGRlc3QpOwogICAgICB9IGVsc2UgaWYgKGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkpIHsKICAgICAgICByZXN1bHRPYmouZGVzdCA9IGRlc3Q7CiAgICAgIH0KICAgIH0KICB9Cn0KCjsvLyAuL3NyYy9jb3JlL29iamVjdF9sb2FkZXIuanMKCgoKCmZ1bmN0aW9uIG1heUhhdmVDaGlsZHJlbih2YWx1ZSkgewogIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFJlZiB8fCB2YWx1ZSBpbnN0YW5jZW9mIERpY3QgfHwgdmFsdWUgaW5zdGFuY2VvZiBCYXNlU3RyZWFtIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpOwp9CmZ1bmN0aW9uIGFkZENoaWxkcmVuKG5vZGUsIG5vZGVzVG9WaXNpdCkgewogIGlmIChub2RlIGluc3RhbmNlb2YgRGljdCkgewogICAgbm9kZSA9IG5vZGUuZ2V0UmF3VmFsdWVzKCk7CiAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgbm9kZSA9IG5vZGUuZGljdC5nZXRSYXdWYWx1ZXMoKTsKICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUpKSB7CiAgICByZXR1cm47CiAgfQogIGZvciAoY29uc3QgcmF3VmFsdWUgb2Ygbm9kZSkgewogICAgaWYgKG1heUhhdmVDaGlsZHJlbihyYXdWYWx1ZSkpIHsKICAgICAgbm9kZXNUb1Zpc2l0LnB1c2gocmF3VmFsdWUpOwogICAgfQogIH0KfQpjbGFzcyBPYmplY3RMb2FkZXIgewogIGNvbnN0cnVjdG9yKGRpY3QsIGtleXMsIHhyZWYpIHsKICAgIHRoaXMuZGljdCA9IGRpY3Q7CiAgICB0aGlzLmtleXMgPSBrZXlzOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMucmVmU2V0ID0gbnVsbDsKICB9CiAgYXN5bmMgbG9hZCgpIHsKICAgIGlmICh0aGlzLnhyZWYuc3RyZWFtLmlzRGF0YUxvYWRlZCkgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgY29uc3QgewogICAgICBrZXlzLAogICAgICBkaWN0CiAgICB9ID0gdGhpczsKICAgIHRoaXMucmVmU2V0ID0gbmV3IFJlZlNldCgpOwogICAgY29uc3Qgbm9kZXNUb1Zpc2l0ID0gW107CiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7CiAgICAgIGNvbnN0IHJhd1ZhbHVlID0gZGljdC5nZXRSYXcoa2V5KTsKICAgICAgaWYgKHJhd1ZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChyYXdWYWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzLl93YWxrKG5vZGVzVG9WaXNpdCk7CiAgfQogIGFzeW5jIF93YWxrKG5vZGVzVG9WaXNpdCkgewogICAgY29uc3Qgbm9kZXNUb1JldmlzaXQgPSBbXTsKICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0cyA9IFtdOwogICAgd2hpbGUgKG5vZGVzVG9WaXNpdC5sZW5ndGgpIHsKICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpOwogICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBpZiAodGhpcy5yZWZTZXQuaGFzKGN1cnJlbnROb2RlKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLnJlZlNldC5wdXQoY3VycmVudE5vZGUpOwogICAgICAgICAgY3VycmVudE5vZGUgPSB0aGlzLnhyZWYuZmV0Y2goY3VycmVudE5vZGUpOwogICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICBpZiAoIShleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSkgewogICAgICAgICAgICB3YXJuKGBPYmplY3RMb2FkZXIuX3dhbGsgLSByZXF1ZXN0aW5nIGFsbCBkYXRhOiAiJHtleH0iLmApOwogICAgICAgICAgICB0aGlzLnJlZlNldCA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICBtYW5hZ2VyCiAgICAgICAgICAgIH0gPSB0aGlzLnhyZWYuc3RyZWFtOwogICAgICAgICAgICByZXR1cm4gbWFuYWdlci5yZXF1ZXN0QWxsQ2h1bmtzKCk7CiAgICAgICAgICB9CiAgICAgICAgICBub2Rlc1RvUmV2aXNpdC5wdXNoKGN1cnJlbnROb2RlKTsKICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsKICAgICAgICAgICAgYmVnaW46IGV4LmJlZ2luLAogICAgICAgICAgICBlbmQ6IGV4LmVuZAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICBjb25zdCBiYXNlU3RyZWFtcyA9IGN1cnJlbnROb2RlLmdldEJhc2VTdHJlYW1zKCk7CiAgICAgICAgaWYgKGJhc2VTdHJlYW1zKSB7CiAgICAgICAgICBsZXQgZm91bmRNaXNzaW5nRGF0YSA9IGZhbHNlOwogICAgICAgICAgZm9yIChjb25zdCBzdHJlYW0gb2YgYmFzZVN0cmVhbXMpIHsKICAgICAgICAgICAgaWYgKHN0cmVhbS5pc0RhdGFMb2FkZWQpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3VuZE1pc3NpbmdEYXRhID0gdHJ1ZTsKICAgICAgICAgICAgcGVuZGluZ1JlcXVlc3RzLnB1c2goewogICAgICAgICAgICAgIGJlZ2luOiBzdHJlYW0uc3RhcnQsCiAgICAgICAgICAgICAgZW5kOiBzdHJlYW0uZW5kCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGZvdW5kTWlzc2luZ0RhdGEpIHsKICAgICAgICAgICAgbm9kZXNUb1JldmlzaXQucHVzaChjdXJyZW50Tm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGFkZENoaWxkcmVuKGN1cnJlbnROb2RlLCBub2Rlc1RvVmlzaXQpOwogICAgfQogICAgaWYgKHBlbmRpbmdSZXF1ZXN0cy5sZW5ndGgpIHsKICAgICAgYXdhaXQgdGhpcy54cmVmLnN0cmVhbS5tYW5hZ2VyLnJlcXVlc3RSYW5nZXMocGVuZGluZ1JlcXVlc3RzKTsKICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzVG9SZXZpc2l0KSB7CiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIHRoaXMucmVmU2V0LnJlbW92ZShub2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3dhbGsobm9kZXNUb1JldmlzaXQpOwogICAgfQogICAgdGhpcy5yZWZTZXQgPSBudWxsOwogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9zeW1ib2xfdXRpbHMuanMKY29uc3QgJGFjY2VwdFdoaXRlc3BhY2UgPSBTeW1ib2woKTsKY29uc3QgJGFkZEhUTUwgPSBTeW1ib2woKTsKY29uc3QgJGFwcGVuZENoaWxkID0gU3ltYm9sKCk7CmNvbnN0ICRjaGlsZHJlblRvSFRNTCA9IFN5bWJvbCgpOwpjb25zdCAkY2xlYW4gPSBTeW1ib2woKTsKY29uc3QgJGNsZWFuUGFnZSA9IFN5bWJvbCgpOwpjb25zdCAkY2xlYW51cCA9IFN5bWJvbCgpOwpjb25zdCAkY2xvbmUgPSBTeW1ib2woKTsKY29uc3QgJGNvbnN1bWVkID0gU3ltYm9sKCk7CmNvbnN0ICRjb250ZW50ID0gU3ltYm9sKCJjb250ZW50Iik7CmNvbnN0ICRkYXRhID0gU3ltYm9sKCJkYXRhIik7CmNvbnN0ICRkdW1wID0gU3ltYm9sKCk7CmNvbnN0ICRleHRyYSA9IFN5bWJvbCgiZXh0cmEiKTsKY29uc3QgJGZpbmFsaXplID0gU3ltYm9sKCk7CmNvbnN0ICRmbHVzaEhUTUwgPSBTeW1ib2woKTsKY29uc3QgJGdldEF0dHJpYnV0ZUl0ID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRBdHRyaWJ1dGVzID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRBdmFpbGFibGVTcGFjZSA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0Q2hpbGRyZW5CeUNsYXNzID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRDaGlsZHJlbkJ5TmFtZSA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0Q2hpbGRyZW5CeU5hbWVJdCA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0RGF0YVZhbHVlID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRFeHRyYSA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXQgPSBTeW1ib2woKTsKY29uc3QgJGdldENoaWxkcmVuID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRDb250YWluZWRDaGlsZHJlbiA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0TmV4dFBhZ2UgPSBTeW1ib2woKTsKY29uc3QgJGdldFN1YmZvcm1QYXJlbnQgPSBTeW1ib2woKTsKY29uc3QgJGdldFBhcmVudCA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0VGVtcGxhdGVSb290ID0gU3ltYm9sKCk7CmNvbnN0ICRnbG9iYWxEYXRhID0gU3ltYm9sKCk7CmNvbnN0ICRoYXNTZXR0YWJsZVZhbHVlID0gU3ltYm9sKCk7CmNvbnN0ICRpZHMgPSBTeW1ib2woKTsKY29uc3QgJGluZGV4T2YgPSBTeW1ib2woKTsKY29uc3QgJGluc2VydEF0ID0gU3ltYm9sKCk7CmNvbnN0ICRpc0NEQVRBWG1sID0gU3ltYm9sKCk7CmNvbnN0ICRpc0JpbmRhYmxlID0gU3ltYm9sKCk7CmNvbnN0ICRpc0RhdGFWYWx1ZSA9IFN5bWJvbCgpOwpjb25zdCAkaXNEZXNjZW5kZW50ID0gU3ltYm9sKCk7CmNvbnN0ICRpc05zQWdub3N0aWMgPSBTeW1ib2woKTsKY29uc3QgJGlzU3BsaXR0YWJsZSA9IFN5bWJvbCgpOwpjb25zdCAkaXNUaGVyZU1vcmVXaWR0aCA9IFN5bWJvbCgpOwpjb25zdCAkaXNUcmFuc3BhcmVudCA9IFN5bWJvbCgpOwpjb25zdCAkaXNVc2FibGUgPSBTeW1ib2woKTsKY29uc3QgJGxhc3RBdHRyaWJ1dGUgPSBTeW1ib2woKTsKY29uc3QgJG5hbWVzcGFjZUlkID0gU3ltYm9sKCJuYW1lc3BhY2VJZCIpOwpjb25zdCAkbm9kZU5hbWUgPSBTeW1ib2woIm5vZGVOYW1lIik7CmNvbnN0ICRuc0F0dHJpYnV0ZXMgPSBTeW1ib2woKTsKY29uc3QgJG9uQ2hpbGQgPSBTeW1ib2woKTsKY29uc3QgJG9uQ2hpbGRDaGVjayA9IFN5bWJvbCgpOwpjb25zdCAkb25UZXh0ID0gU3ltYm9sKCk7CmNvbnN0ICRwdXNoR2x5cGhzID0gU3ltYm9sKCk7CmNvbnN0ICRwb3BQYXJhID0gU3ltYm9sKCk7CmNvbnN0ICRwdXNoUGFyYSA9IFN5bWJvbCgpOwpjb25zdCAkcmVtb3ZlQ2hpbGQgPSBTeW1ib2woKTsKY29uc3QgJHJvb3QgPSBTeW1ib2woInJvb3QiKTsKY29uc3QgJHJlc29sdmVQcm90b3R5cGVzID0gU3ltYm9sKCk7CmNvbnN0ICRzZWFyY2hOb2RlID0gU3ltYm9sKCk7CmNvbnN0ICRzZXRJZCA9IFN5bWJvbCgpOwpjb25zdCAkc2V0U2V0QXR0cmlidXRlcyA9IFN5bWJvbCgpOwpjb25zdCAkc2V0VmFsdWUgPSBTeW1ib2woKTsKY29uc3QgJHRhYkluZGV4ID0gU3ltYm9sKCk7CmNvbnN0ICR0ZXh0ID0gU3ltYm9sKCk7CmNvbnN0ICR0b1BhZ2VzID0gU3ltYm9sKCk7CmNvbnN0ICR0b0hUTUwgPSBTeW1ib2woKTsKY29uc3QgJHRvU3RyaW5nID0gU3ltYm9sKCk7CmNvbnN0ICR0b1N0eWxlID0gU3ltYm9sKCk7CmNvbnN0ICR1aWQgPSBTeW1ib2woInVpZCIpOwoKOy8vIC4vc3JjL2NvcmUveGZhL25hbWVzcGFjZXMuanMKY29uc3QgJGJ1aWxkWEZBT2JqZWN0ID0gU3ltYm9sKCk7CmNvbnN0IE5hbWVzcGFjZUlkcyA9IHsKICBjb25maWc6IHsKICAgIGlkOiAwLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGNpLyIpCiAgfSwKICBjb25uZWN0aW9uU2V0OiB7CiAgICBpZDogMSwKICAgIGNoZWNrOiBucyA9PiBucy5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1jb25uZWN0aW9uLXNldC8iKQogIH0sCiAgZGF0YXNldHM6IHsKICAgIGlkOiAyLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvIikKICB9LAogIGZvcm06IHsKICAgIGlkOiAzLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWZvcm0vIikKICB9LAogIGxvY2FsZVNldDogewogICAgaWQ6IDQsCiAgICBjaGVjazogbnMgPT4gbnMuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtbG9jYWxlLXNldC8iKQogIH0sCiAgcGRmOiB7CiAgICBpZDogNSwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwL3BkZi8iCiAgfSwKICBzaWduYXR1cmU6IHsKICAgIGlkOiA2LAogICAgY2hlY2s6IG5zID0+IG5zID09PSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKICB9LAogIHNvdXJjZVNldDogewogICAgaWQ6IDcsCiAgICBjaGVjazogbnMgPT4gbnMuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtc291cmNlLXNldC8iKQogIH0sCiAgc3R5bGVzaGVldDogewogICAgaWQ6IDgsCiAgICBjaGVjazogbnMgPT4gbnMgPT09ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCiAgfSwKICB0ZW1wbGF0ZTogewogICAgaWQ6IDksCiAgICBjaGVjazogbnMgPT4gbnMuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtdGVtcGxhdGUvIikKICB9LAogIHhkYzogewogICAgaWQ6IDEwLAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGRjLyIpCiAgfSwKICB4ZHA6IHsKICAgIGlkOiAxMSwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwLyIKICB9LAogIHhmZGY6IHsKICAgIGlkOiAxMiwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veGZkZi8iCiAgfSwKICB4aHRtbDogewogICAgaWQ6IDEzLAogICAgY2hlY2s6IG5zID0+IG5zID09PSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKICB9LAogIHhtcG1ldGE6IHsKICAgIGlkOiAxNCwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly9ucy5hZG9iZS5jb20veG1wbWV0YS8iCiAgfQp9OwoKOy8vIC4vc3JjL2NvcmUveGZhL3V0aWxzLmpzCgpjb25zdCBkaW1Db252ZXJ0ZXJzID0gewogIHB0OiB4ID0+IHgsCiAgY206IHggPT4geCAvIDIuNTQgKiA3MiwKICBtbTogeCA9PiB4IC8gKDEwICogMi41NCkgKiA3MiwKICBpbjogeCA9PiB4ICogNzIsCiAgcHg6IHggPT4geAp9Owpjb25zdCBtZWFzdXJlbWVudFBhdHRlcm4gPSAvKFsrLV0/XGQrXC4/XGQqKSguKikvOwpmdW5jdGlvbiBzdHJpcFF1b3RlcyhzdHIpIHsKICBpZiAoc3RyLnN0YXJ0c1dpdGgoIiciKSB8fCBzdHIuc3RhcnRzV2l0aCgnIicpKSB7CiAgICByZXR1cm4gc3RyLnNsaWNlKDEsIC0xKTsKICB9CiAgcmV0dXJuIHN0cjsKfQpmdW5jdGlvbiBnZXRJbnRlZ2VyKHsKICBkYXRhLAogIGRlZmF1bHRWYWx1ZSwKICB2YWxpZGF0ZQp9KSB7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogIH0KICBkYXRhID0gZGF0YS50cmltKCk7CiAgY29uc3QgbiA9IHBhcnNlSW50KGRhdGEsIDEwKTsKICBpZiAoIWlzTmFOKG4pICYmIHZhbGlkYXRlKG4pKSB7CiAgICByZXR1cm4gbjsKICB9CiAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKfQpmdW5jdGlvbiBnZXRGbG9hdCh7CiAgZGF0YSwKICBkZWZhdWx0VmFsdWUsCiAgdmFsaWRhdGUKfSkgewogIGlmICghZGF0YSkgewogICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKICB9CiAgZGF0YSA9IGRhdGEudHJpbSgpOwogIGNvbnN0IG4gPSBwYXJzZUZsb2F0KGRhdGEpOwogIGlmICghaXNOYU4obikgJiYgdmFsaWRhdGUobikpIHsKICAgIHJldHVybiBuOwogIH0KICByZXR1cm4gZGVmYXVsdFZhbHVlOwp9CmZ1bmN0aW9uIGdldEtleXdvcmQoewogIGRhdGEsCiAgZGVmYXVsdFZhbHVlLAogIHZhbGlkYXRlCn0pIHsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CiAgfQogIGRhdGEgPSBkYXRhLnRyaW0oKTsKICBpZiAodmFsaWRhdGUoZGF0YSkpIHsKICAgIHJldHVybiBkYXRhOwogIH0KICByZXR1cm4gZGVmYXVsdFZhbHVlOwp9CmZ1bmN0aW9uIGdldFN0cmluZ09wdGlvbihkYXRhLCBvcHRpb25zKSB7CiAgcmV0dXJuIGdldEtleXdvcmQoewogICAgZGF0YSwKICAgIGRlZmF1bHRWYWx1ZTogb3B0aW9uc1swXSwKICAgIHZhbGlkYXRlOiBrID0+IG9wdGlvbnMuaW5jbHVkZXMoaykKICB9KTsKfQpmdW5jdGlvbiBnZXRNZWFzdXJlbWVudChzdHIsIGRlZiA9ICIwIikgewogIGRlZiB8fD0gIjAiOwogIGlmICghc3RyKSB7CiAgICByZXR1cm4gZ2V0TWVhc3VyZW1lbnQoZGVmKTsKICB9CiAgY29uc3QgbWF0Y2ggPSBzdHIudHJpbSgpLm1hdGNoKG1lYXN1cmVtZW50UGF0dGVybik7CiAgaWYgKCFtYXRjaCkgewogICAgcmV0dXJuIGdldE1lYXN1cmVtZW50KGRlZik7CiAgfQogIGNvbnN0IFssIHZhbHVlU3RyLCB1bml0XSA9IG1hdGNoOwogIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZVN0cik7CiAgaWYgKGlzTmFOKHZhbHVlKSkgewogICAgcmV0dXJuIGdldE1lYXN1cmVtZW50KGRlZik7CiAgfQogIGlmICh2YWx1ZSA9PT0gMCkgewogICAgcmV0dXJuIDA7CiAgfQogIGNvbnN0IGNvbnYgPSBkaW1Db252ZXJ0ZXJzW3VuaXRdOwogIGlmIChjb252KSB7CiAgICByZXR1cm4gY29udih2YWx1ZSk7CiAgfQogIHJldHVybiB2YWx1ZTsKfQpmdW5jdGlvbiBnZXRSYXRpbyhkYXRhKSB7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gewogICAgICBudW06IDEsCiAgICAgIGRlbjogMQogICAgfTsKICB9CiAgY29uc3QgcmF0aW8gPSBkYXRhLnNwbGl0KCI6IiwgMikubWFwKHggPT4gcGFyc2VGbG9hdCh4LnRyaW0oKSkpLmZpbHRlcih4ID0+ICFpc05hTih4KSk7CiAgaWYgKHJhdGlvLmxlbmd0aCA9PT0gMSkgewogICAgcmF0aW8ucHVzaCgxKTsKICB9CiAgaWYgKHJhdGlvLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHsKICAgICAgbnVtOiAxLAogICAgICBkZW46IDEKICAgIH07CiAgfQogIGNvbnN0IFtudW0sIGRlbl0gPSByYXRpbzsKICByZXR1cm4gewogICAgbnVtLAogICAgZGVuCiAgfTsKfQpmdW5jdGlvbiBnZXRSZWxldmFudChkYXRhKSB7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gW107CiAgfQogIHJldHVybiBkYXRhLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKGUgPT4gKHsKICAgIGV4Y2x1ZGVkOiBlWzBdID09PSAiLSIsCiAgICB2aWV3bmFtZTogZS5zdWJzdHJpbmcoMSkKICB9KSk7Cn0KZnVuY3Rpb24gZ2V0Q29sb3IoZGF0YSwgZGVmID0gWzAsIDAsIDBdKSB7CiAgbGV0IFtyLCBnLCBiXSA9IGRlZjsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiB7CiAgICAgIHIsCiAgICAgIGcsCiAgICAgIGIKICAgIH07CiAgfQogIGNvbnN0IGNvbG9yID0gZGF0YS5zcGxpdCgiLCIsIDMpLm1hcChjID0+IE1hdGhDbGFtcChwYXJzZUludChjLnRyaW0oKSwgMTApLCAwLCAyNTUpKS5tYXAoYyA9PiBpc05hTihjKSA/IDAgOiBjKTsKICBpZiAoY29sb3IubGVuZ3RoIDwgMykgewogICAgcmV0dXJuIHsKICAgICAgciwKICAgICAgZywKICAgICAgYgogICAgfTsKICB9CiAgW3IsIGcsIGJdID0gY29sb3I7CiAgcmV0dXJuIHsKICAgIHIsCiAgICBnLAogICAgYgogIH07Cn0KZnVuY3Rpb24gZ2V0QkJveChkYXRhKSB7CiAgY29uc3QgZGVmID0gLTE7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gewogICAgICB4OiBkZWYsCiAgICAgIHk6IGRlZiwKICAgICAgd2lkdGg6IGRlZiwKICAgICAgaGVpZ2h0OiBkZWYKICAgIH07CiAgfQogIGNvbnN0IGJib3ggPSBkYXRhLnNwbGl0KCIsIiwgNCkubWFwKG0gPT4gZ2V0TWVhc3VyZW1lbnQobS50cmltKCksICItMSIpKTsKICBpZiAoYmJveC5sZW5ndGggPCA0IHx8IGJib3hbMl0gPCAwIHx8IGJib3hbM10gPCAwKSB7CiAgICByZXR1cm4gewogICAgICB4OiBkZWYsCiAgICAgIHk6IGRlZiwKICAgICAgd2lkdGg6IGRlZiwKICAgICAgaGVpZ2h0OiBkZWYKICAgIH07CiAgfQogIGNvbnN0IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSA9IGJib3g7CiAgcmV0dXJuIHsKICAgIHgsCiAgICB5LAogICAgd2lkdGgsCiAgICBoZWlnaHQKICB9Owp9CmNsYXNzIEhUTUxSZXN1bHQgewogIHN0YXRpYyBnZXQgRkFJTFVSRSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIkZBSUxVUkUiLCBuZXcgSFRNTFJlc3VsdChmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwogIH0KICBzdGF0aWMgZ2V0IEVNUFRZKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiRU1QVFkiLCBuZXcgSFRNTFJlc3VsdCh0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7CiAgfQogIGNvbnN0cnVjdG9yKHN1Y2Nlc3MsIGh0bWwsIGJib3gsIGJyZWFrTm9kZSkgewogICAgdGhpcy5zdWNjZXNzID0gc3VjY2VzczsKICAgIHRoaXMuaHRtbCA9IGh0bWw7CiAgICB0aGlzLmJib3ggPSBiYm94OwogICAgdGhpcy5icmVha05vZGUgPSBicmVha05vZGU7CiAgfQogIGlzQnJlYWsoKSB7CiAgICByZXR1cm4gISF0aGlzLmJyZWFrTm9kZTsKICB9CiAgc3RhdGljIGJyZWFrTm9kZShub2RlKSB7CiAgICByZXR1cm4gbmV3IEhUTUxSZXN1bHQoZmFsc2UsIG51bGwsIG51bGwsIG5vZGUpOwogIH0KICBzdGF0aWMgc3VjY2VzcyhodG1sLCBiYm94ID0gbnVsbCkgewogICAgcmV0dXJuIG5ldyBIVE1MUmVzdWx0KHRydWUsIGh0bWwsIGJib3gsIG51bGwpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2ZvbnRzLmpzCgoKCmNsYXNzIEZvbnRGaW5kZXIgewogIGNvbnN0cnVjdG9yKHBkZkZvbnRzKSB7CiAgICB0aGlzLmZvbnRzID0gbmV3IE1hcCgpOwogICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTsKICAgIHRoaXMud2FybmVkID0gbmV3IFNldCgpOwogICAgdGhpcy5kZWZhdWx0Rm9udCA9IG51bGw7CiAgICB0aGlzLmFkZChwZGZGb250cyk7CiAgfQogIGFkZChwZGZGb250cywgcmVhbGx5TWlzc2luZ0ZvbnRzID0gbnVsbCkgewogICAgZm9yIChjb25zdCBwZGZGb250IG9mIHBkZkZvbnRzKSB7CiAgICAgIHRoaXMuYWRkUGRmRm9udChwZGZGb250KTsKICAgIH0KICAgIGZvciAoY29uc3QgcGRmRm9udCBvZiB0aGlzLmZvbnRzLnZhbHVlcygpKSB7CiAgICAgIGlmICghcGRmRm9udC5yZWd1bGFyKSB7CiAgICAgICAgcGRmRm9udC5yZWd1bGFyID0gcGRmRm9udC5pdGFsaWMgfHwgcGRmRm9udC5ib2xkIHx8IHBkZkZvbnQuYm9sZGl0YWxpYzsKICAgICAgfQogICAgfQogICAgaWYgKCFyZWFsbHlNaXNzaW5nRm9udHMgfHwgcmVhbGx5TWlzc2luZ0ZvbnRzLnNpemUgPT09IDApIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbXlyaWFkID0gdGhpcy5mb250cy5nZXQoIlBkZkpTLUZhbGxiYWNrLVBkZkpTLVhGQSIpOwogICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIHJlYWxseU1pc3NpbmdGb250cykgewogICAgICB0aGlzLmZvbnRzLnNldChtaXNzaW5nLCBteXJpYWQpOwogICAgfQogIH0KICBhZGRQZGZGb250KHBkZkZvbnQpIHsKICAgIGNvbnN0IGNzc0ZvbnRJbmZvID0gcGRmRm9udC5jc3NGb250SW5mbzsKICAgIGNvbnN0IG5hbWUgPSBjc3NGb250SW5mby5mb250RmFtaWx5OwogICAgbGV0IGZvbnQgPSB0aGlzLmZvbnRzLmdldChuYW1lKTsKICAgIGlmICghZm9udCkgewogICAgICBmb250ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgdGhpcy5mb250cy5zZXQobmFtZSwgZm9udCk7CiAgICAgIGlmICghdGhpcy5kZWZhdWx0Rm9udCkgewogICAgICAgIHRoaXMuZGVmYXVsdEZvbnQgPSBmb250OwogICAgICB9CiAgICB9CiAgICBsZXQgcHJvcGVydHkgPSAiIjsKICAgIGNvbnN0IGZvbnRXZWlnaHQgPSBwYXJzZUZsb2F0KGNzc0ZvbnRJbmZvLmZvbnRXZWlnaHQpOwogICAgaWYgKHBhcnNlRmxvYXQoY3NzRm9udEluZm8uaXRhbGljQW5nbGUpICE9PSAwKSB7CiAgICAgIHByb3BlcnR5ID0gZm9udFdlaWdodCA+PSA3MDAgPyAiYm9sZGl0YWxpYyIgOiAiaXRhbGljIjsKICAgIH0gZWxzZSBpZiAoZm9udFdlaWdodCA+PSA3MDApIHsKICAgICAgcHJvcGVydHkgPSAiYm9sZCI7CiAgICB9CiAgICBpZiAoIXByb3BlcnR5KSB7CiAgICAgIGlmIChwZGZGb250Lm5hbWUuaW5jbHVkZXMoIkJvbGQiKSB8fCBwZGZGb250LnBzTmFtZT8uaW5jbHVkZXMoIkJvbGQiKSkgewogICAgICAgIHByb3BlcnR5ID0gImJvbGQiOwogICAgICB9CiAgICAgIGlmIChwZGZGb250Lm5hbWUuaW5jbHVkZXMoIkl0YWxpYyIpIHx8IHBkZkZvbnQubmFtZS5lbmRzV2l0aCgiSXQiKSB8fCBwZGZGb250LnBzTmFtZT8uaW5jbHVkZXMoIkl0YWxpYyIpIHx8IHBkZkZvbnQucHNOYW1lPy5lbmRzV2l0aCgiSXQiKSkgewogICAgICAgIHByb3BlcnR5ICs9ICJpdGFsaWMiOwogICAgICB9CiAgICB9CiAgICBpZiAoIXByb3BlcnR5KSB7CiAgICAgIHByb3BlcnR5ID0gInJlZ3VsYXIiOwogICAgfQogICAgZm9udFtwcm9wZXJ0eV0gPSBwZGZGb250OwogIH0KICBnZXREZWZhdWx0KCkgewogICAgcmV0dXJuIHRoaXMuZGVmYXVsdEZvbnQ7CiAgfQogIGZpbmQoZm9udE5hbWUsIG11c3RXYXJuID0gdHJ1ZSkgewogICAgbGV0IGZvbnQgPSB0aGlzLmZvbnRzLmdldChmb250TmFtZSkgfHwgdGhpcy5jYWNoZS5nZXQoZm9udE5hbWUpOwogICAgaWYgKGZvbnQpIHsKICAgICAgcmV0dXJuIGZvbnQ7CiAgICB9CiAgICBjb25zdCBwYXR0ZXJuID0gLyx8LXxffCB8Ym9sZGl0YWxpY3xib2xkfGl0YWxpY3xyZWd1bGFyfGl0L2dpOwogICAgbGV0IG5hbWUgPSBmb250TmFtZS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKTsKICAgIGZvbnQgPSB0aGlzLmZvbnRzLmdldChuYW1lKTsKICAgIGlmIChmb250KSB7CiAgICAgIHRoaXMuY2FjaGUuc2V0KGZvbnROYW1lLCBmb250KTsKICAgICAgcmV0dXJuIGZvbnQ7CiAgICB9CiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgbWF5YmUgPSBbXTsKICAgIGZvciAoY29uc3QgW2ZhbWlseSwgcGRmRm9udF0gb2YgdGhpcy5mb250cy5lbnRyaWVzKCkpIHsKICAgICAgaWYgKGZhbWlseS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICBtYXliZS5wdXNoKHBkZkZvbnQpOwogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID09PSAwKSB7CiAgICAgIGZvciAoY29uc3QgWywgcGRmRm9udF0gb2YgdGhpcy5mb250cy5lbnRyaWVzKCkpIHsKICAgICAgICBpZiAocGRmRm9udC5yZWd1bGFyLm5hbWU/LnJlcGxhY2VBbGwocGF0dGVybiwgIiIpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChuYW1lKSkgewogICAgICAgICAgbWF5YmUucHVzaChwZGZGb250KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXliZS5sZW5ndGggPT09IDApIHsKICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgvcHNtdHxtdC9naSwgIiIpOwogICAgICBmb3IgKGNvbnN0IFtmYW1pbHksIHBkZkZvbnRdIG9mIHRoaXMuZm9udHMuZW50cmllcygpKSB7CiAgICAgICAgaWYgKGZhbWlseS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICAgIG1heWJlLnB1c2gocGRmRm9udCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID09PSAwKSB7CiAgICAgIGZvciAoY29uc3QgcGRmRm9udCBvZiB0aGlzLmZvbnRzLnZhbHVlcygpKSB7CiAgICAgICAgaWYgKHBkZkZvbnQucmVndWxhci5uYW1lPy5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICAgIG1heWJlLnB1c2gocGRmRm9udCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID49IDEpIHsKICAgICAgaWYgKG1heWJlLmxlbmd0aCAhPT0gMSAmJiBtdXN0V2FybikgewogICAgICAgIHdhcm4oYFhGQSAtIFRvbyBtYW55IGNob2ljZXMgdG8gZ3Vlc3MgdGhlIGNvcnJlY3QgZm9udDogJHtmb250TmFtZX1gKTsKICAgICAgfQogICAgICB0aGlzLmNhY2hlLnNldChmb250TmFtZSwgbWF5YmVbMF0pOwogICAgICByZXR1cm4gbWF5YmVbMF07CiAgICB9CiAgICBpZiAobXVzdFdhcm4gJiYgIXRoaXMud2FybmVkLmhhcyhmb250TmFtZSkpIHsKICAgICAgdGhpcy53YXJuZWQuYWRkKGZvbnROYW1lKTsKICAgICAgd2FybihgWEZBIC0gQ2Fubm90IGZpbmQgdGhlIGZvbnQ6ICR7Zm9udE5hbWV9YCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZnVuY3Rpb24gc2VsZWN0Rm9udCh4ZmFGb250LCB0eXBlZmFjZSkgewogIGlmICh4ZmFGb250LnBvc3R1cmUgPT09ICJpdGFsaWMiKSB7CiAgICBpZiAoeGZhRm9udC53ZWlnaHQgPT09ICJib2xkIikgewogICAgICByZXR1cm4gdHlwZWZhY2UuYm9sZGl0YWxpYzsKICAgIH0KICAgIHJldHVybiB0eXBlZmFjZS5pdGFsaWM7CiAgfSBlbHNlIGlmICh4ZmFGb250LndlaWdodCA9PT0gImJvbGQiKSB7CiAgICByZXR1cm4gdHlwZWZhY2UuYm9sZDsKICB9CiAgcmV0dXJuIHR5cGVmYWNlLnJlZ3VsYXI7Cn0KZnVuY3Rpb24gZm9udHNfZ2V0TWV0cmljcyh4ZmFGb250LCByZWFsID0gZmFsc2UpIHsKICBsZXQgcGRmRm9udCA9IG51bGw7CiAgaWYgKHhmYUZvbnQpIHsKICAgIGNvbnN0IG5hbWUgPSBzdHJpcFF1b3Rlcyh4ZmFGb250LnR5cGVmYWNlKTsKICAgIGNvbnN0IHR5cGVmYWNlID0geGZhRm9udFskZ2xvYmFsRGF0YV0uZm9udEZpbmRlci5maW5kKG5hbWUpOwogICAgcGRmRm9udCA9IHNlbGVjdEZvbnQoeGZhRm9udCwgdHlwZWZhY2UpOwogIH0KICBpZiAoIXBkZkZvbnQpIHsKICAgIHJldHVybiB7CiAgICAgIGxpbmVIZWlnaHQ6IDEyLAogICAgICBsaW5lR2FwOiAyLAogICAgICBsaW5lTm9HYXA6IDEwCiAgICB9OwogIH0KICBjb25zdCBzaXplID0geGZhRm9udC5zaXplIHx8IDEwOwogIGNvbnN0IGxpbmVIZWlnaHQgPSBwZGZGb250LmxpbmVIZWlnaHQgPyBNYXRoLm1heChyZWFsID8gMCA6IDEuMiwgcGRmRm9udC5saW5lSGVpZ2h0KSA6IDEuMjsKICBjb25zdCBsaW5lR2FwID0gcGRmRm9udC5saW5lR2FwID09PSB1bmRlZmluZWQgPyAwLjIgOiBwZGZGb250LmxpbmVHYXA7CiAgcmV0dXJuIHsKICAgIGxpbmVIZWlnaHQ6IGxpbmVIZWlnaHQgKiBzaXplLAogICAgbGluZUdhcDogbGluZUdhcCAqIHNpemUsCiAgICBsaW5lTm9HYXA6IE1hdGgubWF4KDEsIGxpbmVIZWlnaHQgLSBsaW5lR2FwKSAqIHNpemUKICB9Owp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvdGV4dC5qcwoKY29uc3QgV0lEVEhfRkFDVE9SID0gMS4wMjsKY2xhc3MgRm9udEluZm8gewogIGNvbnN0cnVjdG9yKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlcikgewogICAgdGhpcy5saW5lSGVpZ2h0ID0gbGluZUhlaWdodDsKICAgIHRoaXMucGFyYU1hcmdpbiA9IG1hcmdpbiB8fCB7CiAgICAgIHRvcDogMCwKICAgICAgYm90dG9tOiAwLAogICAgICBsZWZ0OiAwLAogICAgICByaWdodDogMAogICAgfTsKICAgIGlmICgheGZhRm9udCkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy54ZmFGb250ID0gewogICAgICB0eXBlZmFjZTogeGZhRm9udC50eXBlZmFjZSwKICAgICAgcG9zdHVyZTogeGZhRm9udC5wb3N0dXJlLAogICAgICB3ZWlnaHQ6IHhmYUZvbnQud2VpZ2h0LAogICAgICBzaXplOiB4ZmFGb250LnNpemUsCiAgICAgIGxldHRlclNwYWNpbmc6IHhmYUZvbnQubGV0dGVyU3BhY2luZwogICAgfTsKICAgIGNvbnN0IHR5cGVmYWNlID0gZm9udEZpbmRlci5maW5kKHhmYUZvbnQudHlwZWZhY2UpOwogICAgaWYgKCF0eXBlZmFjZSkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5wZGZGb250ID0gc2VsZWN0Rm9udCh4ZmFGb250LCB0eXBlZmFjZSk7CiAgICBpZiAoIXRoaXMucGRmRm9udCkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgIH0KICB9CiAgZGVmYXVsdEZvbnQoZm9udEZpbmRlcikgewogICAgY29uc3QgZm9udCA9IGZvbnRGaW5kZXIuZmluZCgiSGVsdmV0aWNhIiwgZmFsc2UpIHx8IGZvbnRGaW5kZXIuZmluZCgiTXlyaWFkIFBybyIsIGZhbHNlKSB8fCBmb250RmluZGVyLmZpbmQoIkFyaWFsIiwgZmFsc2UpIHx8IGZvbnRGaW5kZXIuZ2V0RGVmYXVsdCgpOwogICAgaWYgKGZvbnQ/LnJlZ3VsYXIpIHsKICAgICAgY29uc3QgcGRmRm9udCA9IGZvbnQucmVndWxhcjsKICAgICAgY29uc3QgaW5mbyA9IHBkZkZvbnQuY3NzRm9udEluZm87CiAgICAgIGNvbnN0IHhmYUZvbnQgPSB7CiAgICAgICAgdHlwZWZhY2U6IGluZm8uZm9udEZhbWlseSwKICAgICAgICBwb3N0dXJlOiAibm9ybWFsIiwKICAgICAgICB3ZWlnaHQ6ICJub3JtYWwiLAogICAgICAgIHNpemU6IDEwLAogICAgICAgIGxldHRlclNwYWNpbmc6IDAKICAgICAgfTsKICAgICAgcmV0dXJuIFtwZGZGb250LCB4ZmFGb250XTsKICAgIH0KICAgIGNvbnN0IHhmYUZvbnQgPSB7CiAgICAgIHR5cGVmYWNlOiAiQ291cmllciIsCiAgICAgIHBvc3R1cmU6ICJub3JtYWwiLAogICAgICB3ZWlnaHQ6ICJub3JtYWwiLAogICAgICBzaXplOiAxMCwKICAgICAgbGV0dGVyU3BhY2luZzogMAogICAgfTsKICAgIHJldHVybiBbbnVsbCwgeGZhRm9udF07CiAgfQp9CmNsYXNzIEZvbnRTZWxlY3RvciB7CiAgY29uc3RydWN0b3IoZGVmYXVsdFhmYUZvbnQsIGRlZmF1bHRQYXJhTWFyZ2luLCBkZWZhdWx0TGluZUhlaWdodCwgZm9udEZpbmRlcikgewogICAgdGhpcy5mb250RmluZGVyID0gZm9udEZpbmRlcjsKICAgIHRoaXMuc3RhY2sgPSBbbmV3IEZvbnRJbmZvKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRGaW5kZXIpXTsKICB9CiAgcHVzaERhdGEoeGZhRm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0KSB7CiAgICBjb25zdCBsYXN0Rm9udCA9IHRoaXMuc3RhY2suYXQoLTEpOwogICAgZm9yIChjb25zdCBuYW1lIG9mIFsidHlwZWZhY2UiLCAicG9zdHVyZSIsICJ3ZWlnaHQiLCAic2l6ZSIsICJsZXR0ZXJTcGFjaW5nIl0pIHsKICAgICAgaWYgKCF4ZmFGb250W25hbWVdKSB7CiAgICAgICAgeGZhRm9udFtuYW1lXSA9IGxhc3RGb250LnhmYUZvbnRbbmFtZV07CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBbInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCJdKSB7CiAgICAgIGlmIChpc05hTihtYXJnaW5bbmFtZV0pKSB7CiAgICAgICAgbWFyZ2luW25hbWVdID0gbGFzdEZvbnQucGFyYU1hcmdpbltuYW1lXTsKICAgICAgfQogICAgfQogICAgY29uc3QgZm9udEluZm8gPSBuZXcgRm9udEluZm8oeGZhRm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0IHx8IGxhc3RGb250LmxpbmVIZWlnaHQsIHRoaXMuZm9udEZpbmRlcik7CiAgICBpZiAoIWZvbnRJbmZvLnBkZkZvbnQpIHsKICAgICAgZm9udEluZm8ucGRmRm9udCA9IGxhc3RGb250LnBkZkZvbnQ7CiAgICB9CiAgICB0aGlzLnN0YWNrLnB1c2goZm9udEluZm8pOwogIH0KICBwb3BGb250KCkgewogICAgdGhpcy5zdGFjay5wb3AoKTsKICB9CiAgdG9wRm9udCgpIHsKICAgIHJldHVybiB0aGlzLnN0YWNrLmF0KC0xKTsKICB9Cn0KY2xhc3MgVGV4dE1lYXN1cmUgewogIGNvbnN0cnVjdG9yKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRzKSB7CiAgICB0aGlzLmdseXBocyA9IFtdOwogICAgdGhpcy5mb250U2VsZWN0b3IgPSBuZXcgRm9udFNlbGVjdG9yKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRzKTsKICAgIHRoaXMuZXh0cmFIZWlnaHQgPSAwOwogIH0KICBwdXNoRGF0YSh4ZmFGb250LCBtYXJnaW4sIGxpbmVIZWlnaHQpIHsKICAgIHRoaXMuZm9udFNlbGVjdG9yLnB1c2hEYXRhKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCk7CiAgfQogIHBvcEZvbnQoeGZhRm9udCkgewogICAgcmV0dXJuIHRoaXMuZm9udFNlbGVjdG9yLnBvcEZvbnQoKTsKICB9CiAgYWRkUGFyYSgpIHsKICAgIGNvbnN0IGxhc3RGb250ID0gdGhpcy5mb250U2VsZWN0b3IudG9wRm9udCgpOwogICAgdGhpcy5leHRyYUhlaWdodCArPSBsYXN0Rm9udC5wYXJhTWFyZ2luLnRvcCArIGxhc3RGb250LnBhcmFNYXJnaW4uYm90dG9tOwogIH0KICBhZGRTdHJpbmcoc3RyKSB7CiAgICBpZiAoIXN0cikgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBsYXN0Rm9udCA9IHRoaXMuZm9udFNlbGVjdG9yLnRvcEZvbnQoKTsKICAgIGNvbnN0IGZvbnRTaXplID0gbGFzdEZvbnQueGZhRm9udC5zaXplOwogICAgaWYgKGxhc3RGb250LnBkZkZvbnQpIHsKICAgICAgY29uc3QgbGV0dGVyU3BhY2luZyA9IGxhc3RGb250LnhmYUZvbnQubGV0dGVyU3BhY2luZzsKICAgICAgY29uc3QgcGRmRm9udCA9IGxhc3RGb250LnBkZkZvbnQ7CiAgICAgIGNvbnN0IGZvbnRMaW5lSGVpZ2h0ID0gcGRmRm9udC5saW5lSGVpZ2h0IHx8IDEuMjsKICAgICAgY29uc3QgbGluZUhlaWdodCA9IGxhc3RGb250LmxpbmVIZWlnaHQgfHwgTWF0aC5tYXgoMS4yLCBmb250TGluZUhlaWdodCkgKiBmb250U2l6ZTsKICAgICAgY29uc3QgbGluZUdhcCA9IHBkZkZvbnQubGluZUdhcCA9PT0gdW5kZWZpbmVkID8gMC4yIDogcGRmRm9udC5saW5lR2FwOwogICAgICBjb25zdCBub0dhcCA9IGZvbnRMaW5lSGVpZ2h0IC0gbGluZUdhcDsKICAgICAgY29uc3QgZmlyc3RMaW5lSGVpZ2h0ID0gTWF0aC5tYXgoMSwgbm9HYXApICogZm9udFNpemU7CiAgICAgIGNvbnN0IHNjYWxlID0gZm9udFNpemUgLyAxMDAwOwogICAgICBjb25zdCBmYWxsYmFja1dpZHRoID0gcGRmRm9udC5kZWZhdWx0V2lkdGggfHwgcGRmRm9udC5jaGFyc1RvR2x5cGhzKCIgIilbMF0ud2lkdGg7CiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBzdHIuc3BsaXQoL1tcdTIwMjlcbl0vKSkgewogICAgICAgIGNvbnN0IGVuY29kZWRMaW5lID0gcGRmRm9udC5lbmNvZGVTdHJpbmcobGluZSkuam9pbigiIik7CiAgICAgICAgY29uc3QgZ2x5cGhzID0gcGRmRm9udC5jaGFyc1RvR2x5cGhzKGVuY29kZWRMaW5lKTsKICAgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykgewogICAgICAgICAgY29uc3Qgd2lkdGggPSBnbHlwaC53aWR0aCB8fCBmYWxsYmFja1dpZHRoOwogICAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbd2lkdGggKiBzY2FsZSArIGxldHRlclNwYWNpbmcsIGxpbmVIZWlnaHQsIGZpcnN0TGluZUhlaWdodCwgZ2x5cGgudW5pY29kZSwgZmFsc2VdKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbMCwgMCwgMCwgIlxuIiwgdHJ1ZV0pOwogICAgICB9CiAgICAgIHRoaXMuZ2x5cGhzLnBvcCgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyLnNwbGl0KC9bXHUyMDI5XG5dLykpIHsKICAgICAgZm9yIChjb25zdCBjaGFyIG9mIGxpbmUuc3BsaXQoIiIpKSB7CiAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbZm9udFNpemUsIDEuMiAqIGZvbnRTaXplLCBmb250U2l6ZSwgY2hhciwgZmFsc2VdKTsKICAgICAgfQogICAgICB0aGlzLmdseXBocy5wdXNoKFswLCAwLCAwLCAiXG4iLCB0cnVlXSk7CiAgICB9CiAgICB0aGlzLmdseXBocy5wb3AoKTsKICB9CiAgY29tcHV0ZShtYXhXaWR0aCkgewogICAgbGV0IGxhc3RTcGFjZVBvcyA9IC0xLAogICAgICBsYXN0U3BhY2VXaWR0aCA9IDAsCiAgICAgIHdpZHRoID0gMCwKICAgICAgaGVpZ2h0ID0gMCwKICAgICAgY3VycmVudExpbmVXaWR0aCA9IDAsCiAgICAgIGN1cnJlbnRMaW5lSGVpZ2h0ID0gMDsKICAgIGxldCBpc0Jyb2tlbiA9IGZhbHNlOwogICAgbGV0IGlzRmlyc3RMaW5lID0gdHJ1ZTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgW2dseXBoV2lkdGgsIGxpbmVIZWlnaHQsIGZpcnN0TGluZUhlaWdodCwgY2hhciwgaXNFT0xdID0gdGhpcy5nbHlwaHNbaV07CiAgICAgIGNvbnN0IGlzU3BhY2UgPSBjaGFyID09PSAiICI7CiAgICAgIGNvbnN0IGdseXBoSGVpZ2h0ID0gaXNGaXJzdExpbmUgPyBmaXJzdExpbmVIZWlnaHQgOiBsaW5lSGVpZ2h0OwogICAgICBpZiAoaXNFT0wpIHsKICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdXJyZW50TGluZVdpZHRoKTsKICAgICAgICBjdXJyZW50TGluZVdpZHRoID0gMDsKICAgICAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQ7CiAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTsKICAgICAgICBsYXN0U3BhY2VXaWR0aCA9IDA7CiAgICAgICAgaXNGaXJzdExpbmUgPSBmYWxzZTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaXNTcGFjZSkgewogICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoICsgZ2x5cGhXaWR0aCA+IG1heFdpZHRoKSB7CiAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdXJyZW50TGluZVdpZHRoKTsKICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGggPSAwOwogICAgICAgICAgaGVpZ2h0ICs9IGN1cnJlbnRMaW5lSGVpZ2h0OwogICAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOwogICAgICAgICAgbGFzdFNwYWNlV2lkdGggPSAwOwogICAgICAgICAgaXNCcm9rZW4gPSB0cnVlOwogICAgICAgICAgaXNGaXJzdExpbmUgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBNYXRoLm1heChnbHlwaEhlaWdodCwgY3VycmVudExpbmVIZWlnaHQpOwogICAgICAgICAgbGFzdFNwYWNlV2lkdGggPSBjdXJyZW50TGluZVdpZHRoOwogICAgICAgICAgY3VycmVudExpbmVXaWR0aCArPSBnbHlwaFdpZHRoOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gaTsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGggKyBnbHlwaFdpZHRoID4gbWF4V2lkdGgpIHsKICAgICAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQ7CiAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICBpZiAobGFzdFNwYWNlUG9zICE9PSAtMSkgewogICAgICAgICAgaSA9IGxhc3RTcGFjZVBvczsKICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGxhc3RTcGFjZVdpZHRoKTsKICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGggPSAwOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gLTE7CiAgICAgICAgICBsYXN0U3BhY2VXaWR0aCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGN1cnJlbnRMaW5lV2lkdGgpOwogICAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IGdseXBoV2lkdGg7CiAgICAgICAgfQogICAgICAgIGlzQnJva2VuID0gdHJ1ZTsKICAgICAgICBpc0ZpcnN0TGluZSA9IGZhbHNlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGN1cnJlbnRMaW5lV2lkdGggKz0gZ2x5cGhXaWR0aDsKICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBNYXRoLm1heChnbHlwaEhlaWdodCwgY3VycmVudExpbmVIZWlnaHQpOwogICAgfQogICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY3VycmVudExpbmVXaWR0aCk7CiAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQgKyB0aGlzLmV4dHJhSGVpZ2h0OwogICAgcmV0dXJuIHsKICAgICAgd2lkdGg6IFdJRFRIX0ZBQ1RPUiAqIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGlzQnJva2VuCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL3NvbS5qcwoKCmNvbnN0IG5hbWVQYXR0ZXJuID0gL15bXi5bXSsvOwpjb25zdCBpbmRleFBhdHRlcm4gPSAvXlteXF1dKy87CmNvbnN0IG9wZXJhdG9ycyA9IHsKICBkb3Q6IDAsCiAgZG90RG90OiAxLAogIGRvdEhhc2g6IDIsCiAgZG90QnJhY2tldDogMywKICBkb3RQYXJlbjogNAp9Owpjb25zdCBzaG9ydGN1dHMgPSBuZXcgTWFwKFtbIiRkYXRhIiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3QuZGF0YXNldHMgPyByb290LmRhdGFzZXRzLmRhdGEgOiByb290XSwgWyIkcmVjb3JkIiwgKHJvb3QsIGN1cnJlbnQpID0+IChyb290LmRhdGFzZXRzID8gcm9vdC5kYXRhc2V0cy5kYXRhIDogcm9vdClbJGdldENoaWxkcmVuXSgpWzBdXSwgWyIkdGVtcGxhdGUiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC50ZW1wbGF0ZV0sIFsiJGNvbm5lY3Rpb25TZXQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5jb25uZWN0aW9uU2V0XSwgWyIkZm9ybSIsIChyb290LCBjdXJyZW50KSA9PiByb290LmZvcm1dLCBbIiRsYXlvdXQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5sYXlvdXRdLCBbIiRob3N0IiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3QuaG9zdF0sIFsiJGRhdGFXaW5kb3ciLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5kYXRhV2luZG93XSwgWyIkZXZlbnQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5ldmVudF0sIFsiISIsIChyb290LCBjdXJyZW50KSA9PiByb290LmRhdGFzZXRzXSwgWyIkeGZhIiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3RdLCBbInhmYSIsIChyb290LCBjdXJyZW50KSA9PiByb290XSwgWyIkIiwgKHJvb3QsIGN1cnJlbnQpID0+IGN1cnJlbnRdXSk7CmNvbnN0IHNvbUNhY2hlID0gbmV3IFdlYWtNYXAoKTsKZnVuY3Rpb24gcGFyc2VJbmRleChpbmRleCkgewogIGluZGV4ID0gaW5kZXgudHJpbSgpOwogIGlmIChpbmRleCA9PT0gIioiKSB7CiAgICByZXR1cm4gSW5maW5pdHk7CiAgfQogIHJldHVybiBwYXJzZUludChpbmRleCwgMTApIHx8IDA7Cn0KZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHIsIGRvdERvdEFsbG93ZWQsIG5vRXhwciA9IHRydWUpIHsKICBsZXQgbWF0Y2ggPSBleHByLm1hdGNoKG5hbWVQYXR0ZXJuKTsKICBpZiAoIW1hdGNoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgbGV0IFtuYW1lXSA9IG1hdGNoOwogIGNvbnN0IHBhcnNlZCA9IFt7CiAgICBuYW1lLAogICAgY2FjaGVOYW1lOiAiLiIgKyBuYW1lLAogICAgaW5kZXg6IDAsCiAgICBqczogbnVsbCwKICAgIGZvcm1DYWxjOiBudWxsLAogICAgb3BlcmF0b3I6IG9wZXJhdG9ycy5kb3QKICB9XTsKICBsZXQgcG9zID0gbmFtZS5sZW5ndGg7CiAgd2hpbGUgKHBvcyA8IGV4cHIubGVuZ3RoKSB7CiAgICBjb25zdCBzcG9zID0gcG9zOwogICAgY29uc3QgY2hhciA9IGV4cHIuY2hhckF0KHBvcysrKTsKICAgIGlmIChjaGFyID09PSAiWyIpIHsKICAgICAgbWF0Y2ggPSBleHByLnNsaWNlKHBvcykubWF0Y2goaW5kZXhQYXR0ZXJuKTsKICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgIHdhcm4oIlhGQSAtIEludmFsaWQgaW5kZXggaW4gU09NIGV4cHJlc3Npb24iKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBwYXJzZWQuYXQoLTEpLmluZGV4ID0gcGFyc2VJbmRleChtYXRjaFswXSk7CiAgICAgIHBvcyArPSBtYXRjaFswXS5sZW5ndGggKyAxOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGxldCBvcGVyYXRvcjsKICAgIHN3aXRjaCAoZXhwci5jaGFyQXQocG9zKSkgewogICAgICBjYXNlICIuIjoKICAgICAgICBpZiAoIWRvdERvdEFsbG93ZWQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBwb3MrKzsKICAgICAgICBvcGVyYXRvciA9IG9wZXJhdG9ycy5kb3REb3Q7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIiMiOgogICAgICAgIHBvcysrOwogICAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzLmRvdEhhc2g7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIlsiOgogICAgICAgIGlmIChub0V4cHIpIHsKICAgICAgICAgIHdhcm4oIlhGQSAtIFNPTSBleHByZXNzaW9uIGNvbnRhaW5zIGEgRm9ybUNhbGMgc3ViZXhwcmVzc2lvbiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGZvciBub3cuIik7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgb3BlcmF0b3IgPSBvcGVyYXRvcnMuZG90QnJhY2tldDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiKCI6CiAgICAgICAgaWYgKG5vRXhwcikgewogICAgICAgICAgd2FybigiWEZBIC0gU09NIGV4cHJlc3Npb24gY29udGFpbnMgYSBKYXZhU2NyaXB0IHN1YmV4cHJlc3Npb24gd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBmb3Igbm93LiIpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzLmRvdFBhcmVuOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzLmRvdDsKICAgICAgICBicmVhazsKICAgIH0KICAgIG1hdGNoID0gZXhwci5zbGljZShwb3MpLm1hdGNoKG5hbWVQYXR0ZXJuKTsKICAgIGlmICghbWF0Y2gpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBbbmFtZV0gPSBtYXRjaDsKICAgIHBvcyArPSBuYW1lLmxlbmd0aDsKICAgIHBhcnNlZC5wdXNoKHsKICAgICAgbmFtZSwKICAgICAgY2FjaGVOYW1lOiBleHByLnNsaWNlKHNwb3MsIHBvcyksCiAgICAgIG9wZXJhdG9yLAogICAgICBpbmRleDogMCwKICAgICAganM6IG51bGwsCiAgICAgIGZvcm1DYWxjOiBudWxsCiAgICB9KTsKICB9CiAgcmV0dXJuIHBhcnNlZDsKfQpmdW5jdGlvbiBzZWFyY2hOb2RlKHJvb3QsIGNvbnRhaW5lciwgZXhwciwgZG90RG90QWxsb3dlZCA9IHRydWUsIHVzZUNhY2hlID0gdHJ1ZSkgewogIGNvbnN0IHBhcnNlZCA9IHBhcnNlRXhwcmVzc2lvbihleHByLCBkb3REb3RBbGxvd2VkKTsKICBpZiAoIXBhcnNlZCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IGZuID0gc2hvcnRjdXRzLmdldChwYXJzZWRbMF0ubmFtZSk7CiAgbGV0IGkgPSAwOwogIGxldCBpc1F1YWxpZmllZDsKICBpZiAoZm4pIHsKICAgIGlzUXVhbGlmaWVkID0gdHJ1ZTsKICAgIHJvb3QgPSBbZm4ocm9vdCwgY29udGFpbmVyKV07CiAgICBpID0gMTsKICB9IGVsc2UgewogICAgaXNRdWFsaWZpZWQgPSBjb250YWluZXIgPT09IG51bGw7CiAgICByb290ID0gW2NvbnRhaW5lciB8fCByb290XTsKICB9CiAgZm9yIChsZXQgaWkgPSBwYXJzZWQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgewogICAgICBuYW1lLAogICAgICBjYWNoZU5hbWUsCiAgICAgIG9wZXJhdG9yLAogICAgICBpbmRleAogICAgfSA9IHBhcnNlZFtpXTsKICAgIGNvbnN0IG5vZGVzID0gW107CiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygcm9vdCkgewogICAgICBpZiAoIW5vZGUuaXNYRkFPYmplY3QpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgY2hpbGRyZW4sIGNhY2hlZDsKICAgICAgaWYgKHVzZUNhY2hlKSB7CiAgICAgICAgY2FjaGVkID0gc29tQ2FjaGUuZ2V0KG5vZGUpOwogICAgICAgIGlmICghY2FjaGVkKSB7CiAgICAgICAgICBjYWNoZWQgPSBuZXcgTWFwKCk7CiAgICAgICAgICBzb21DYWNoZS5zZXQobm9kZSwgY2FjaGVkKTsKICAgICAgICB9CiAgICAgICAgY2hpbGRyZW4gPSBjYWNoZWQuZ2V0KGNhY2hlTmFtZSk7CiAgICAgIH0KICAgICAgaWYgKCFjaGlsZHJlbikgewogICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgICAgICAgIGNhc2Ugb3BlcmF0b3JzLmRvdDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlWyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgZmFsc2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2Ugb3BlcmF0b3JzLmRvdERvdDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlWyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBvcGVyYXRvcnMuZG90SGFzaDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlWyRnZXRDaGlsZHJlbkJ5Q2xhc3NdKG5hbWUpOwogICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmlzWEZBT2JqZWN0QXJyYXkgPyBjaGlsZHJlbi5jaGlsZHJlbiA6IFtjaGlsZHJlbl07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh1c2VDYWNoZSkgewogICAgICAgICAgY2FjaGVkLnNldChjYWNoZU5hbWUsIGNoaWxkcmVuKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuKTsKICAgICAgfQogICAgfQogICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCAmJiAhaXNRdWFsaWZpZWQgJiYgaSA9PT0gMCkgewogICAgICBjb25zdCBwYXJlbnQgPSBjb250YWluZXJbJGdldFBhcmVudF0oKTsKICAgICAgY29udGFpbmVyID0gcGFyZW50OwogICAgICBpZiAoIWNvbnRhaW5lcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGkgPSAtMTsKICAgICAgcm9vdCA9IFtjb250YWluZXJdOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIHJvb3QgPSBpc0Zpbml0ZShpbmRleCkgPyBub2Rlcy5maWx0ZXIobm9kZSA9PiBpbmRleCA8IG5vZGUubGVuZ3RoKS5tYXAobm9kZSA9PiBub2RlW2luZGV4XSkgOiBub2Rlcy5mbGF0KCk7CiAgfQogIGlmIChyb290Lmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiByb290Owp9CmZ1bmN0aW9uIGNyZWF0ZURhdGFOb2RlKHJvb3QsIGNvbnRhaW5lciwgZXhwcikgewogIGNvbnN0IHBhcnNlZCA9IHBhcnNlRXhwcmVzc2lvbihleHByKTsKICBpZiAoIXBhcnNlZCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGlmIChwYXJzZWQuc29tZSh4ID0+IHgub3BlcmF0b3IgPT09IG9wZXJhdG9ycy5kb3REb3QpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgZm4gPSBzaG9ydGN1dHMuZ2V0KHBhcnNlZFswXS5uYW1lKTsKICBsZXQgaSA9IDA7CiAgaWYgKGZuKSB7CiAgICByb290ID0gZm4ocm9vdCwgY29udGFpbmVyKTsKICAgIGkgPSAxOwogIH0gZWxzZSB7CiAgICByb290ID0gY29udGFpbmVyIHx8IHJvb3Q7CiAgfQogIGZvciAobGV0IGlpID0gcGFyc2VkLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHsKICAgICAgbmFtZSwKICAgICAgb3BlcmF0b3IsCiAgICAgIGluZGV4CiAgICB9ID0gcGFyc2VkW2ldOwogICAgaWYgKCFpc0Zpbml0ZShpbmRleCkpIHsKICAgICAgcGFyc2VkW2ldLmluZGV4ID0gMDsKICAgICAgcmV0dXJuIHJvb3QuY3JlYXRlTm9kZXMocGFyc2VkLnNsaWNlKGkpKTsKICAgIH0KICAgIGxldCBjaGlsZHJlbjsKICAgIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgICAgY2FzZSBvcGVyYXRvcnMuZG90OgogICAgICAgIGNoaWxkcmVuID0gcm9vdFskZ2V0Q2hpbGRyZW5CeU5hbWVdKG5hbWUsIGZhbHNlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBvcGVyYXRvcnMuZG90RG90OgogICAgICAgIGNoaWxkcmVuID0gcm9vdFskZ2V0Q2hpbGRyZW5CeU5hbWVdKG5hbWUsIHRydWUpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIG9wZXJhdG9ycy5kb3RIYXNoOgogICAgICAgIGNoaWxkcmVuID0gcm9vdFskZ2V0Q2hpbGRyZW5CeUNsYXNzXShuYW1lKTsKICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmlzWEZBT2JqZWN0QXJyYXkgPyBjaGlsZHJlbi5jaGlsZHJlbiA6IFtjaGlsZHJlbl07CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiByb290LmNyZWF0ZU5vZGVzKHBhcnNlZC5zbGljZShpKSk7CiAgICB9CiAgICBpZiAoaW5kZXggPCBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpbmRleF07CiAgICAgIGlmICghY2hpbGQuaXNYRkFPYmplY3QpIHsKICAgICAgICB3YXJuKGBYRkEgLSBDYW5ub3QgY3JlYXRlIGEgbm9kZS5gKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByb290ID0gY2hpbGQ7CiAgICB9IGVsc2UgewogICAgICBwYXJzZWRbaV0uaW5kZXggPSBpbmRleCAtIGNoaWxkcmVuLmxlbmd0aDsKICAgICAgcmV0dXJuIHJvb3QuY3JlYXRlTm9kZXMocGFyc2VkLnNsaWNlKGkpKTsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS94ZmFfb2JqZWN0LmpzCgoKCgoKCmNvbnN0IF9hcHBseVByb3RvdHlwZSA9IFN5bWJvbCgpOwpjb25zdCBfYXR0cmlidXRlcyA9IFN5bWJvbCgpOwpjb25zdCBfYXR0cmlidXRlTmFtZXMgPSBTeW1ib2woKTsKY29uc3QgX2NoaWxkcmVuID0gU3ltYm9sKCJfY2hpbGRyZW4iKTsKY29uc3QgX2Nsb25lQXR0cmlidXRlID0gU3ltYm9sKCk7CmNvbnN0IF9kYXRhVmFsdWUgPSBTeW1ib2woKTsKY29uc3QgX2RlZmF1bHRWYWx1ZSA9IFN5bWJvbCgpOwpjb25zdCBfZmlsdGVyZWRDaGlsZHJlbkdlbmVyYXRvciA9IFN5bWJvbCgpOwpjb25zdCBfZ2V0UHJvdG90eXBlID0gU3ltYm9sKCk7CmNvbnN0IF9nZXRVbnNldEF0dHJpYnV0ZXMgPSBTeW1ib2woKTsKY29uc3QgX2hhc0NoaWxkcmVuID0gU3ltYm9sKCk7CmNvbnN0IF9tYXggPSBTeW1ib2woKTsKY29uc3QgX29wdGlvbnMgPSBTeW1ib2woKTsKY29uc3QgX3BhcmVudCA9IFN5bWJvbCgicGFyZW50Iik7CmNvbnN0IF9yZXNvbHZlUHJvdG90eXBlc0hlbHBlciA9IFN5bWJvbCgpOwpjb25zdCBfc2V0QXR0cmlidXRlcyA9IFN5bWJvbCgpOwpjb25zdCBfdmFsaWRhdG9yID0gU3ltYm9sKCk7CmxldCB1aWQgPSAwOwpjb25zdCBOU19EQVRBU0VUUyA9IE5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZDsKY2xhc3MgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lLCBoYXNDaGlsZHJlbiA9IGZhbHNlKSB7CiAgICB0aGlzWyRuYW1lc3BhY2VJZF0gPSBuc0lkOwogICAgdGhpc1skbm9kZU5hbWVdID0gbmFtZTsKICAgIHRoaXNbX2hhc0NoaWxkcmVuXSA9IGhhc0NoaWxkcmVuOwogICAgdGhpc1tfcGFyZW50XSA9IG51bGw7CiAgICB0aGlzW19jaGlsZHJlbl0gPSBbXTsKICAgIHRoaXNbJHVpZF0gPSBgJHtuYW1lfSR7dWlkKyt9YDsKICAgIHRoaXNbJGdsb2JhbERhdGFdID0gbnVsbDsKICB9CiAgZ2V0IGlzWEZBT2JqZWN0KCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGdldCBpc1hGQU9iamVjdEFycmF5KCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjcmVhdGVOb2RlcyhwYXRoKSB7CiAgICBsZXQgcm9vdCA9IHRoaXMsCiAgICAgIG5vZGUgPSBudWxsOwogICAgZm9yIChjb25zdCB7CiAgICAgIG5hbWUsCiAgICAgIGluZGV4CiAgICB9IG9mIHBhdGgpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaXNGaW5pdGUoaW5kZXgpID8gaW5kZXggOiAwOyBpIDw9IGlpOyBpKyspIHsKICAgICAgICBjb25zdCBuc0lkID0gcm9vdFskbmFtZXNwYWNlSWRdID09PSBOU19EQVRBU0VUUyA/IC0xIDogcm9vdFskbmFtZXNwYWNlSWRdOwogICAgICAgIG5vZGUgPSBuZXcgWG1sT2JqZWN0KG5zSWQsIG5hbWUpOwogICAgICAgIHJvb3RbJGFwcGVuZENoaWxkXShub2RlKTsKICAgICAgfQogICAgICByb290ID0gbm9kZTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KICBbJG9uQ2hpbGRdKGNoaWxkKSB7CiAgICBpZiAoIXRoaXNbX2hhc0NoaWxkcmVuXSB8fCAhdGhpc1skb25DaGlsZENoZWNrXShjaGlsZCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgbmFtZSA9IGNoaWxkWyRub2RlTmFtZV07CiAgICBjb25zdCBub2RlID0gdGhpc1tuYW1lXTsKICAgIGlmIChub2RlIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgaWYgKG5vZGUucHVzaChjaGlsZCkpIHsKICAgICAgICB0aGlzWyRhcHBlbmRDaGlsZF0oY2hpbGQpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAobm9kZSAhPT0gbnVsbCkgewogICAgICAgIHRoaXNbJHJlbW92ZUNoaWxkXShub2RlKTsKICAgICAgfQogICAgICB0aGlzW25hbWVdID0gY2hpbGQ7CiAgICAgIHRoaXNbJGFwcGVuZENoaWxkXShjaGlsZCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgbGV0IGlkID0gIiI7CiAgICBpZiAodGhpcy5pZCkgewogICAgICBpZCA9IGAgKGlkOiAke3RoaXMuaWR9KWA7CiAgICB9IGVsc2UgaWYgKHRoaXMubmFtZSkgewogICAgICBpZCA9IGAgKG5hbWU6ICR7dGhpcy5uYW1lfSAke3RoaXMuaC52YWx1ZX0pYDsKICAgIH0KICAgIHdhcm4oYFhGQSAtIG5vZGUgIiR7dGhpc1skbm9kZU5hbWVdfSIke2lkfSBoYXMgYWxyZWFkeSBlbm91Z2ggIiR7bmFtZX0iIWApOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJG9uQ2hpbGRDaGVja10oY2hpbGQpIHsKICAgIHJldHVybiB0aGlzLmhhc093blByb3BlcnR5KGNoaWxkWyRub2RlTmFtZV0pICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IHRoaXNbJG5hbWVzcGFjZUlkXTsKICB9CiAgWyRpc05zQWdub3N0aWNdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGlzQ0RBVEFYbWxdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJHBvcFBhcmFdKCkgewogICAgaWYgKHRoaXMucGFyYSkgewogICAgICB0aGlzWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5wYXJhU3RhY2sucG9wKCk7CiAgICB9CiAgfQogIFskcHVzaFBhcmFdKCkgewogICAgdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ucGFyYVN0YWNrLnB1c2godGhpcy5wYXJhKTsKICB9CiAgWyRzZXRJZF0oaWRzKSB7CiAgICBpZiAodGhpcy5pZCAmJiB0aGlzWyRuYW1lc3BhY2VJZF0gPT09IE5hbWVzcGFjZUlkcy50ZW1wbGF0ZS5pZCkgewogICAgICBpZHMuc2V0KHRoaXMuaWQsIHRoaXMpOwogICAgfQogIH0KICBbJGdldFRlbXBsYXRlUm9vdF0oKSB7CiAgICByZXR1cm4gdGhpc1skZ2xvYmFsRGF0YV0udGVtcGxhdGU7CiAgfQogIFskaXNTcGxpdHRhYmxlXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRpc1RoZXJlTW9yZVdpZHRoXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRhcHBlbmRDaGlsZF0oY2hpbGQpIHsKICAgIGNoaWxkW19wYXJlbnRdID0gdGhpczsKICAgIHRoaXNbX2NoaWxkcmVuXS5wdXNoKGNoaWxkKTsKICAgIGlmICghY2hpbGRbJGdsb2JhbERhdGFdICYmIHRoaXNbJGdsb2JhbERhdGFdKSB7CiAgICAgIGNoaWxkWyRnbG9iYWxEYXRhXSA9IHRoaXNbJGdsb2JhbERhdGFdOwogICAgfQogIH0KICBbJHJlbW92ZUNoaWxkXShjaGlsZCkgewogICAgY29uc3QgaSA9IHRoaXNbX2NoaWxkcmVuXS5pbmRleE9mKGNoaWxkKTsKICAgIHRoaXNbX2NoaWxkcmVuXS5zcGxpY2UoaSwgMSk7CiAgfQogIFskaGFzU2V0dGFibGVWYWx1ZV0oKSB7CiAgICByZXR1cm4gdGhpcy5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKTsKICB9CiAgWyRzZXRWYWx1ZV0oXykge30KICBbJG9uVGV4dF0oXykge30KICBbJGZpbmFsaXplXSgpIHt9CiAgWyRjbGVhbl0oYnVpbGRlcikgewogICAgZGVsZXRlIHRoaXNbX2hhc0NoaWxkcmVuXTsKICAgIGlmICh0aGlzWyRjbGVhbnVwXSkgewogICAgICBidWlsZGVyLmNsZWFuKHRoaXNbJGNsZWFudXBdKTsKICAgICAgZGVsZXRlIHRoaXNbJGNsZWFudXBdOwogICAgfQogIH0KICBbJGluZGV4T2ZdKGNoaWxkKSB7CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmluZGV4T2YoY2hpbGQpOwogIH0KICBbJGluc2VydEF0XShpLCBjaGlsZCkgewogICAgY2hpbGRbX3BhcmVudF0gPSB0aGlzOwogICAgdGhpc1tfY2hpbGRyZW5dLnNwbGljZShpLCAwLCBjaGlsZCk7CiAgICBpZiAoIWNoaWxkWyRnbG9iYWxEYXRhXSAmJiB0aGlzWyRnbG9iYWxEYXRhXSkgewogICAgICBjaGlsZFskZ2xvYmFsRGF0YV0gPSB0aGlzWyRnbG9iYWxEYXRhXTsKICAgIH0KICB9CiAgWyRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiAhdGhpcy5uYW1lOwogIH0KICBbJGxhc3RBdHRyaWJ1dGVdKCkgewogICAgcmV0dXJuICIiOwogIH0KICBbJHRleHRdKCkgewogICAgaWYgKHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdOwogICAgfQogICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXS5tYXAoYyA9PiBjWyR0ZXh0XSgpKS5qb2luKCIiKTsKICB9CiAgZ2V0IFtfYXR0cmlidXRlTmFtZXNdKCkgewogICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICBpZiAoIXByb3RvLl9hdHRyaWJ1dGVzKSB7CiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBwcm90by5fYXR0cmlidXRlcyA9IG5ldyBTZXQoKTsKICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgICAgaWYgKHRoaXNbbmFtZV0gPT09IG51bGwgfHwgdGhpc1tuYW1lXSBpbnN0YW5jZW9mIFhGQU9iamVjdCB8fCB0aGlzW25hbWVdIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBhdHRyaWJ1dGVzLmFkZChuYW1lKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBfYXR0cmlidXRlTmFtZXMsIHByb3RvLl9hdHRyaWJ1dGVzKTsKICB9CiAgWyRpc0Rlc2NlbmRlbnRdKHBhcmVudCkgewogICAgbGV0IG5vZGUgPSB0aGlzOwogICAgd2hpbGUgKG5vZGUpIHsKICAgICAgaWYgKG5vZGUgPT09IHBhcmVudCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIG5vZGUgPSBub2RlWyRnZXRQYXJlbnRdKCk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskZ2V0UGFyZW50XSgpIHsKICAgIHJldHVybiB0aGlzW19wYXJlbnRdOwogIH0KICBbJGdldFN1YmZvcm1QYXJlbnRdKCkgewogICAgcmV0dXJuIHRoaXNbJGdldFBhcmVudF0oKTsKICB9CiAgWyRnZXRDaGlsZHJlbl0obmFtZSA9IG51bGwpIHsKICAgIGlmICghbmFtZSkgewogICAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dOwogICAgfQogICAgcmV0dXJuIHRoaXNbbmFtZV07CiAgfQogIFskZHVtcF0oKSB7CiAgICBjb25zdCBkdW1wZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKHRoaXNbJGNvbnRlbnRdKSB7CiAgICAgIGR1bXBlZC4kY29udGVudCA9IHRoaXNbJGNvbnRlbnRdOwogICAgfQogICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXTsKICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgICAgZHVtcGVkW25hbWVdID0gdmFsdWVbJGR1bXBdKCk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBYRkFPYmplY3RBcnJheSkgewogICAgICAgIGlmICghdmFsdWUuaXNFbXB0eSgpKSB7CiAgICAgICAgICBkdW1wZWRbbmFtZV0gPSB2YWx1ZS5kdW1wKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGR1bXBlZFtuYW1lXSA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZHVtcGVkOwogIH0KICBbJHRvU3R5bGVdKCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIFskdG9IVE1MXSgpIHsKICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogIH0KICAqWyRnZXRDb250YWluZWRDaGlsZHJlbl0oKSB7CiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpc1skZ2V0Q2hpbGRyZW5dKCkpIHsKICAgICAgeWllbGQgbm9kZTsKICAgIH0KICB9CiAgKltfZmlsdGVyZWRDaGlsZHJlbkdlbmVyYXRvcl0oZmlsdGVyLCBpbmNsdWRlKSB7CiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpc1skZ2V0Q29udGFpbmVkQ2hpbGRyZW5dKCkpIHsKICAgICAgaWYgKCFmaWx0ZXIgfHwgaW5jbHVkZSA9PT0gZmlsdGVyLmhhcyhub2RlWyRub2RlTmFtZV0pKSB7CiAgICAgICAgY29uc3QgYXZhaWxhYmxlU3BhY2UgPSB0aGlzWyRnZXRBdmFpbGFibGVTcGFjZV0oKTsKICAgICAgICBjb25zdCByZXMgPSBub2RlWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICAgICAgICBpZiAoIXJlcy5zdWNjZXNzKSB7CiAgICAgICAgICB0aGlzWyRleHRyYV0uZmFpbGluZ05vZGUgPSBub2RlOwogICAgICAgIH0KICAgICAgICB5aWVsZCByZXM7CiAgICAgIH0KICAgIH0KICB9CiAgWyRmbHVzaEhUTUxdKCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIFskYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgdGhpc1skZXh0cmFdLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgfQogIFskZ2V0QXZhaWxhYmxlU3BhY2VdKCkge30KICBbJGNoaWxkcmVuVG9IVE1MXSh7CiAgICBmaWx0ZXIgPSBudWxsLAogICAgaW5jbHVkZSA9IHRydWUKICB9KSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXS5nZW5lcmF0b3IpIHsKICAgICAgdGhpc1skZXh0cmFdLmdlbmVyYXRvciA9IHRoaXNbX2ZpbHRlcmVkQ2hpbGRyZW5HZW5lcmF0b3JdKGZpbHRlciwgaW5jbHVkZSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBhdmFpbGFibGVTcGFjZSA9IHRoaXNbJGdldEF2YWlsYWJsZVNwYWNlXSgpOwogICAgICBjb25zdCByZXMgPSB0aGlzWyRleHRyYV0uZmFpbGluZ05vZGVbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpOwogICAgICBpZiAoIXJlcy5zdWNjZXNzKSB7CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfQogICAgICBpZiAocmVzLmh0bWwpIHsKICAgICAgICB0aGlzWyRhZGRIVE1MXShyZXMuaHRtbCwgcmVzLmJib3gpOwogICAgICB9CiAgICAgIGRlbGV0ZSB0aGlzWyRleHRyYV0uZmFpbGluZ05vZGU7CiAgICB9CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBjb25zdCBnZW4gPSB0aGlzWyRleHRyYV0uZ2VuZXJhdG9yLm5leHQoKTsKICAgICAgaWYgKGdlbi5kb25lKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY29uc3QgcmVzID0gZ2VuLnZhbHVlOwogICAgICBpZiAoIXJlcy5zdWNjZXNzKSB7CiAgICAgICAgcmV0dXJuIHJlczsKICAgICAgfQogICAgICBpZiAocmVzLmh0bWwpIHsKICAgICAgICB0aGlzWyRhZGRIVE1MXShyZXMuaHRtbCwgcmVzLmJib3gpOwogICAgICB9CiAgICB9CiAgICB0aGlzWyRleHRyYV0uZ2VuZXJhdG9yID0gbnVsbDsKICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogIH0KICBbJHNldFNldEF0dHJpYnV0ZXNdKGF0dHJpYnV0ZXMpIHsKICAgIHRoaXNbX3NldEF0dHJpYnV0ZXNdID0gbmV3IFNldChPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSk7CiAgfQogIFtfZ2V0VW5zZXRBdHRyaWJ1dGVzXShwcm90b0F0dHJpYnV0ZXMpIHsKICAgIGNvbnN0IGFsbEF0dHIgPSB0aGlzW19hdHRyaWJ1dGVOYW1lc107CiAgICBjb25zdCBzZXRBdHRyID0gdGhpc1tfc2V0QXR0cmlidXRlc107CiAgICByZXR1cm4gWy4uLnByb3RvQXR0cmlidXRlc10uZmlsdGVyKHggPT4gYWxsQXR0ci5oYXMoeCkgJiYgIXNldEF0dHIuaGFzKHgpKTsKICB9CiAgWyRyZXNvbHZlUHJvdG90eXBlc10oaWRzLCBhbmNlc3RvcnMgPSBuZXcgU2V0KCkpIHsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfY2hpbGRyZW5dKSB7CiAgICAgIGNoaWxkW19yZXNvbHZlUHJvdG90eXBlc0hlbHBlcl0oaWRzLCBhbmNlc3RvcnMpOwogICAgfQogIH0KICBbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycykgewogICAgY29uc3QgcHJvdG8gPSB0aGlzW19nZXRQcm90b3R5cGVdKGlkcywgYW5jZXN0b3JzKTsKICAgIGlmIChwcm90bykgewogICAgICB0aGlzW19hcHBseVByb3RvdHlwZV0ocHJvdG8sIGlkcywgYW5jZXN0b3JzKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXNbJHJlc29sdmVQcm90b3R5cGVzXShpZHMsIGFuY2VzdG9ycyk7CiAgICB9CiAgfQogIFtfZ2V0UHJvdG90eXBlXShpZHMsIGFuY2VzdG9ycykgewogICAgY29uc3QgewogICAgICB1c2UsCiAgICAgIHVzZWhyZWYKICAgIH0gPSB0aGlzOwogICAgaWYgKCF1c2UgJiYgIXVzZWhyZWYpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgcHJvdG8gPSBudWxsOwogICAgbGV0IHNvbUV4cHJlc3Npb24gPSBudWxsOwogICAgbGV0IGlkID0gbnVsbDsKICAgIGxldCByZWYgPSB1c2U7CiAgICBpZiAodXNlaHJlZikgewogICAgICByZWYgPSB1c2VocmVmOwogICAgICBpZiAodXNlaHJlZi5zdGFydHNXaXRoKCIjc29tKCIpICYmIHVzZWhyZWYuZW5kc1dpdGgoIikiKSkgewogICAgICAgIHNvbUV4cHJlc3Npb24gPSB1c2VocmVmLnNsaWNlKCIjc29tKCIubGVuZ3RoLCAtMSk7CiAgICAgIH0gZWxzZSBpZiAodXNlaHJlZi5zdGFydHNXaXRoKCIuI3NvbSgiKSAmJiB1c2VocmVmLmVuZHNXaXRoKCIpIikpIHsKICAgICAgICBzb21FeHByZXNzaW9uID0gdXNlaHJlZi5zbGljZSgiLiNzb20oIi5sZW5ndGgsIC0xKTsKICAgICAgfSBlbHNlIGlmICh1c2VocmVmLnN0YXJ0c1dpdGgoIiMiKSkgewogICAgICAgIGlkID0gdXNlaHJlZi5zbGljZSgxKTsKICAgICAgfSBlbHNlIGlmICh1c2VocmVmLnN0YXJ0c1dpdGgoIi4jIikpIHsKICAgICAgICBpZCA9IHVzZWhyZWYuc2xpY2UoMik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodXNlLnN0YXJ0c1dpdGgoIiMiKSkgewogICAgICBpZCA9IHVzZS5zbGljZSgxKTsKICAgIH0gZWxzZSB7CiAgICAgIHNvbUV4cHJlc3Npb24gPSB1c2U7CiAgICB9CiAgICB0aGlzLnVzZSA9IHRoaXMudXNlaHJlZiA9ICIiOwogICAgaWYgKGlkKSB7CiAgICAgIHByb3RvID0gaWRzLmdldChpZCk7CiAgICB9IGVsc2UgewogICAgICBwcm90byA9IHNlYXJjaE5vZGUoaWRzLmdldCgkcm9vdCksIHRoaXMsIHNvbUV4cHJlc3Npb24sIHRydWUsIGZhbHNlKTsKICAgICAgaWYgKHByb3RvKSB7CiAgICAgICAgcHJvdG8gPSBwcm90b1swXTsKICAgICAgfQogICAgfQogICAgaWYgKCFwcm90bykgewogICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHByb3RvdHlwZSByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAocHJvdG9bJG5vZGVOYW1lXSAhPT0gdGhpc1skbm9kZU5hbWVdKSB7CiAgICAgIHdhcm4oYFhGQSAtIEluY29tcGF0aWJsZSBwcm90b3R5cGU6ICR7cHJvdG9bJG5vZGVOYW1lXX0gIT09ICR7dGhpc1skbm9kZU5hbWVdfS5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoYW5jZXN0b3JzLmhhcyhwcm90bykpIHsKICAgICAgd2FybihgWEZBIC0gQ3ljbGUgZGV0ZWN0ZWQgaW4gcHJvdG90eXBlcyB1c2UuYCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgYW5jZXN0b3JzLmFkZChwcm90byk7CiAgICBjb25zdCBwcm90b1Byb3RvID0gcHJvdG9bX2dldFByb3RvdHlwZV0oaWRzLCBhbmNlc3RvcnMpOwogICAgaWYgKHByb3RvUHJvdG8pIHsKICAgICAgcHJvdG9bX2FwcGx5UHJvdG90eXBlXShwcm90b1Byb3RvLCBpZHMsIGFuY2VzdG9ycyk7CiAgICB9CiAgICBwcm90b1skcmVzb2x2ZVByb3RvdHlwZXNdKGlkcywgYW5jZXN0b3JzKTsKICAgIGFuY2VzdG9ycy5kZWxldGUocHJvdG8pOwogICAgcmV0dXJuIHByb3RvOwogIH0KICBbX2FwcGx5UHJvdG90eXBlXShwcm90bywgaWRzLCBhbmNlc3RvcnMpIHsKICAgIGlmIChhbmNlc3RvcnMuaGFzKHByb3RvKSkgewogICAgICB3YXJuKGBYRkEgLSBDeWNsZSBkZXRlY3RlZCBpbiBwcm90b3R5cGVzIHVzZS5gKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCF0aGlzWyRjb250ZW50XSAmJiBwcm90b1skY29udGVudF0pIHsKICAgICAgdGhpc1skY29udGVudF0gPSBwcm90b1skY29udGVudF07CiAgICB9CiAgICBjb25zdCBuZXdBbmNlc3RvcnMgPSBuZXcgU2V0KGFuY2VzdG9ycyk7CiAgICBuZXdBbmNlc3RvcnMuYWRkKHByb3RvKTsKICAgIGZvciAoY29uc3QgdW5zZXRBdHRyTmFtZSBvZiB0aGlzW19nZXRVbnNldEF0dHJpYnV0ZXNdKHByb3RvW19zZXRBdHRyaWJ1dGVzXSkpIHsKICAgICAgdGhpc1t1bnNldEF0dHJOYW1lXSA9IHByb3RvW3Vuc2V0QXR0ck5hbWVdOwogICAgICBpZiAodGhpc1tfc2V0QXR0cmlidXRlc10pIHsKICAgICAgICB0aGlzW19zZXRBdHRyaWJ1dGVzXS5hZGQodW5zZXRBdHRyTmFtZSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBpZiAodGhpc1tfYXR0cmlidXRlTmFtZXNdLmhhcyhuYW1lKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXTsKICAgICAgY29uc3QgcHJvdG9WYWx1ZSA9IHByb3RvW25hbWVdOwogICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBYRkFPYmplY3RBcnJheSkgewogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdmFsdWVbX2NoaWxkcmVuXSkgewogICAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSB2YWx1ZVtfY2hpbGRyZW5dLmxlbmd0aCwgaWkgPSBwcm90b1ZhbHVlW19jaGlsZHJlbl0ubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgY29uc3QgY2hpbGQgPSBwcm90b1tfY2hpbGRyZW5dW2ldWyRjbG9uZV0oKTsKICAgICAgICAgIGlmICh2YWx1ZS5wdXNoKGNoaWxkKSkgewogICAgICAgICAgICBjaGlsZFtfcGFyZW50XSA9IHRoaXM7CiAgICAgICAgICAgIHRoaXNbX2NoaWxkcmVuXS5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgdmFsdWVbJHJlc29sdmVQcm90b3R5cGVzXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgaWYgKHByb3RvVmFsdWUpIHsKICAgICAgICAgIHZhbHVlW19hcHBseVByb3RvdHlwZV0ocHJvdG9WYWx1ZSwgaWRzLCBhbmNlc3RvcnMpOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAocHJvdG9WYWx1ZSAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IGNoaWxkID0gcHJvdG9WYWx1ZVskY2xvbmVdKCk7CiAgICAgICAgY2hpbGRbX3BhcmVudF0gPSB0aGlzOwogICAgICAgIHRoaXNbbmFtZV0gPSBjaGlsZDsKICAgICAgICB0aGlzW19jaGlsZHJlbl0ucHVzaChjaGlsZCk7CiAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIFtfY2xvbmVBdHRyaWJ1dGVdKG9iaikgewogICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgewogICAgICByZXR1cm4gb2JqLm1hcCh4ID0+IFhGQU9iamVjdFtfY2xvbmVBdHRyaWJ1dGVdKHgpKTsKICAgIH0KICAgIGlmICh0eXBlb2Ygb2JqID09PSAib2JqZWN0IiAmJiBvYmogIT09IG51bGwpIHsKICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9iaik7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KICBbJGNsb25lXSgpIHsKICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpOwogICAgZm9yIChjb25zdCAkc3ltYm9sIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGhpcykpIHsKICAgICAgdHJ5IHsKICAgICAgICBjbG9uZVskc3ltYm9sXSA9IHRoaXNbJHN5bWJvbF07CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHNoYWRvdyhjbG9uZSwgJHN5bWJvbCwgdGhpc1skc3ltYm9sXSk7CiAgICAgIH0KICAgIH0KICAgIGNsb25lWyR1aWRdID0gYCR7Y2xvbmVbJG5vZGVOYW1lXX0ke3VpZCsrfWA7CiAgICBjbG9uZVtfY2hpbGRyZW5dID0gW107CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKHRoaXNbX2F0dHJpYnV0ZU5hbWVzXS5oYXMobmFtZSkpIHsKICAgICAgICBjbG9uZVtuYW1lXSA9IFhGQU9iamVjdFtfY2xvbmVBdHRyaWJ1dGVdKHRoaXNbbmFtZV0pOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXTsKICAgICAgY2xvbmVbbmFtZV0gPSB2YWx1ZSBpbnN0YW5jZW9mIFhGQU9iamVjdEFycmF5ID8gbmV3IFhGQU9iamVjdEFycmF5KHZhbHVlW19tYXhdKSA6IG51bGw7CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBjb25zdCBuYW1lID0gY2hpbGRbJG5vZGVOYW1lXTsKICAgICAgY29uc3QgY2xvbmVkQ2hpbGQgPSBjaGlsZFskY2xvbmVdKCk7CiAgICAgIGNsb25lW19jaGlsZHJlbl0ucHVzaChjbG9uZWRDaGlsZCk7CiAgICAgIGNsb25lZENoaWxkW19wYXJlbnRdID0gY2xvbmU7CiAgICAgIGlmIChjbG9uZVtuYW1lXSA9PT0gbnVsbCkgewogICAgICAgIGNsb25lW25hbWVdID0gY2xvbmVkQ2hpbGQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xvbmVbbmFtZV1bX2NoaWxkcmVuXS5wdXNoKGNsb25lZENoaWxkKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNsb25lOwogIH0KICBbJGdldENoaWxkcmVuXShuYW1lID0gbnVsbCkgewogICAgaWYgKCFuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl07CiAgICB9CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmZpbHRlcihjID0+IGNbJG5vZGVOYW1lXSA9PT0gbmFtZSk7CiAgfQogIFskZ2V0Q2hpbGRyZW5CeUNsYXNzXShuYW1lKSB7CiAgICByZXR1cm4gdGhpc1tuYW1lXTsKICB9CiAgWyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIGZpcnN0ID0gdHJ1ZSkgewogICAgcmV0dXJuIEFycmF5LmZyb20odGhpc1skZ2V0Q2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIGZpcnN0KSk7CiAgfQogICpbJGdldENoaWxkcmVuQnlOYW1lSXRdKG5hbWUsIGFsbFRyYW5zcGFyZW50LCBmaXJzdCA9IHRydWUpIHsKICAgIGlmIChuYW1lID09PSAicGFyZW50IikgewogICAgICB5aWVsZCB0aGlzW19wYXJlbnRdOwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBpZiAoY2hpbGRbJG5vZGVOYW1lXSA9PT0gbmFtZSkgewogICAgICAgIHlpZWxkIGNoaWxkOwogICAgICB9CiAgICAgIGlmIChjaGlsZC5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgeWllbGQgY2hpbGQ7CiAgICAgIH0KICAgICAgaWYgKGFsbFRyYW5zcGFyZW50IHx8IGNoaWxkWyRpc1RyYW5zcGFyZW50XSgpKSB7CiAgICAgICAgeWllbGQqIGNoaWxkWyRnZXRDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCwgZmFsc2UpOwogICAgICB9CiAgICB9CiAgICBpZiAoZmlyc3QgJiYgdGhpc1tfYXR0cmlidXRlTmFtZXNdLmhhcyhuYW1lKSkgewogICAgICB5aWVsZCBuZXcgWEZBQXR0cmlidXRlKHRoaXMsIG5hbWUsIHRoaXNbbmFtZV0pOwogICAgfQogIH0KfQpjbGFzcyBYRkFPYmplY3RBcnJheSB7CiAgY29uc3RydWN0b3IobWF4ID0gSW5maW5pdHkpIHsKICAgIHRoaXNbX21heF0gPSBtYXg7CiAgICB0aGlzW19jaGlsZHJlbl0gPSBbXTsKICB9CiAgZ2V0IGlzWEZBT2JqZWN0KCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBnZXQgaXNYRkFPYmplY3RBcnJheSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBwdXNoKGNoaWxkKSB7CiAgICBjb25zdCBsZW4gPSB0aGlzW19jaGlsZHJlbl0ubGVuZ3RoOwogICAgaWYgKGxlbiA8PSB0aGlzW19tYXhdKSB7CiAgICAgIHRoaXNbX2NoaWxkcmVuXS5wdXNoKGNoaWxkKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB3YXJuKGBYRkEgLSBub2RlICIke2NoaWxkWyRub2RlTmFtZV19IiBhY2NlcHRzIG5vIG1vcmUgdGhhbiAke3RoaXNbX21heF19IGNoaWxkcmVuYCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlzRW1wdHkoKSB7CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMDsKICB9CiAgZHVtcCgpIHsKICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl0ubGVuZ3RoID09PSAxID8gdGhpc1tfY2hpbGRyZW5dWzBdWyRkdW1wXSgpIDogdGhpc1tfY2hpbGRyZW5dLm1hcCh4ID0+IHhbJGR1bXBdKCkpOwogIH0KICBbJGNsb25lXSgpIHsKICAgIGNvbnN0IGNsb25lID0gbmV3IFhGQU9iamVjdEFycmF5KHRoaXNbX21heF0pOwogICAgY2xvbmVbX2NoaWxkcmVuXSA9IHRoaXNbX2NoaWxkcmVuXS5tYXAoYyA9PiBjWyRjbG9uZV0oKSk7CiAgICByZXR1cm4gY2xvbmU7CiAgfQogIGdldCBjaGlsZHJlbigpIHsKICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl07CiAgfQogIGNsZWFyKCkgewogICAgdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9IDA7CiAgfQp9CmNsYXNzIFhGQUF0dHJpYnV0ZSB7CiAgY29uc3RydWN0b3Iobm9kZSwgbmFtZSwgdmFsdWUpIHsKICAgIHRoaXNbX3BhcmVudF0gPSBub2RlOwogICAgdGhpc1skbm9kZU5hbWVdID0gbmFtZTsKICAgIHRoaXNbJGNvbnRlbnRdID0gdmFsdWU7CiAgICB0aGlzWyRjb25zdW1lZF0gPSBmYWxzZTsKICAgIHRoaXNbJHVpZF0gPSBgYXR0cmlidXRlJHt1aWQrK31gOwogIH0KICBbJGdldFBhcmVudF0oKSB7CiAgICByZXR1cm4gdGhpc1tfcGFyZW50XTsKICB9CiAgWyRpc0RhdGFWYWx1ZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRnZXREYXRhVmFsdWVdKCkgewogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdLnRyaW0oKTsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIHZhbHVlID0gdmFsdWUudmFsdWUgfHwgIiI7CiAgICB0aGlzWyRjb250ZW50XSA9IHZhbHVlLnRvU3RyaW5nKCk7CiAgfQogIFskdGV4dF0oKSB7CiAgICByZXR1cm4gdGhpc1skY29udGVudF07CiAgfQogIFskaXNEZXNjZW5kZW50XShwYXJlbnQpIHsKICAgIHJldHVybiB0aGlzW19wYXJlbnRdID09PSBwYXJlbnQgfHwgdGhpc1tfcGFyZW50XVskaXNEZXNjZW5kZW50XShwYXJlbnQpOwogIH0KfQpjbGFzcyBYbWxPYmplY3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUsIGF0dHJpYnV0ZXMgPSB7fSkgewogICAgc3VwZXIobnNJZCwgbmFtZSk7CiAgICB0aGlzWyRjb250ZW50XSA9ICIiOwogICAgdGhpc1tfZGF0YVZhbHVlXSA9IG51bGw7CiAgICBpZiAobmFtZSAhPT0gIiN0ZXh0IikgewogICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICAgIHRoaXNbX2F0dHJpYnV0ZXNdID0gbWFwOwogICAgICBmb3IgKGNvbnN0IFthdHRyTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7CiAgICAgICAgbWFwLnNldChhdHRyTmFtZSwgbmV3IFhGQUF0dHJpYnV0ZSh0aGlzLCBhdHRyTmFtZSwgdmFsdWUpKTsKICAgICAgfQogICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eSgkbnNBdHRyaWJ1dGVzKSkgewogICAgICAgIGNvbnN0IGRhdGFOb2RlID0gYXR0cmlidXRlc1skbnNBdHRyaWJ1dGVzXS54ZmEuZGF0YU5vZGU7CiAgICAgICAgaWYgKGRhdGFOb2RlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGlmIChkYXRhTm9kZSA9PT0gImRhdGFHcm91cCIpIHsKICAgICAgICAgICAgdGhpc1tfZGF0YVZhbHVlXSA9IGZhbHNlOwogICAgICAgICAgfSBlbHNlIGlmIChkYXRhTm9kZSA9PT0gImRhdGFWYWx1ZSIpIHsKICAgICAgICAgICAgdGhpc1tfZGF0YVZhbHVlXSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzWyRjb25zdW1lZF0gPSBmYWxzZTsKICB9CiAgWyR0b1N0cmluZ10oYnVmKSB7CiAgICBjb25zdCB0YWdOYW1lID0gdGhpc1skbm9kZU5hbWVdOwogICAgaWYgKHRhZ05hbWUgPT09ICIjdGV4dCIpIHsKICAgICAgYnVmLnB1c2goZW5jb2RlVG9YbWxTdHJpbmcodGhpc1skY29udGVudF0pKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdXRmOFRhZ05hbWUgPSB1dGY4U3RyaW5nVG9TdHJpbmcodGFnTmFtZSk7CiAgICBjb25zdCBwcmVmaXggPSB0aGlzWyRuYW1lc3BhY2VJZF0gPT09IE5TX0RBVEFTRVRTID8gInhmYToiIDogIiI7CiAgICBidWYucHVzaChgPCR7cHJlZml4fSR7dXRmOFRhZ05hbWV9YCk7CiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdGhpc1tfYXR0cmlidXRlc10uZW50cmllcygpKSB7CiAgICAgIGNvbnN0IHV0ZjhOYW1lID0gdXRmOFN0cmluZ1RvU3RyaW5nKG5hbWUpOwogICAgICBidWYucHVzaChgICR7dXRmOE5hbWV9PSIke2VuY29kZVRvWG1sU3RyaW5nKHZhbHVlWyRjb250ZW50XSl9ImApOwogICAgfQogICAgaWYgKHRoaXNbX2RhdGFWYWx1ZV0gIT09IG51bGwpIHsKICAgICAgaWYgKHRoaXNbX2RhdGFWYWx1ZV0pIHsKICAgICAgICBidWYucHVzaChgIHhmYTpkYXRhTm9kZT0iZGF0YVZhbHVlImApOwogICAgICB9IGVsc2UgewogICAgICAgIGJ1Zi5wdXNoKGAgeGZhOmRhdGFOb2RlPSJkYXRhR3JvdXAiYCk7CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhpc1skY29udGVudF0gJiYgdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMCkgewogICAgICBidWYucHVzaCgiLz4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYnVmLnB1c2goIj4iKTsKICAgIGlmICh0aGlzWyRjb250ZW50XSkgewogICAgICBpZiAodHlwZW9mIHRoaXNbJGNvbnRlbnRdID09PSAic3RyaW5nIikgewogICAgICAgIGJ1Zi5wdXNoKGVuY29kZVRvWG1sU3RyaW5nKHRoaXNbJGNvbnRlbnRdKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpc1skY29udGVudF1bJHRvU3RyaW5nXShidWYpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICAgIGNoaWxkWyR0b1N0cmluZ10oYnVmKTsKICAgICAgfQogICAgfQogICAgYnVmLnB1c2goYDwvJHtwcmVmaXh9JHt1dGY4VGFnTmFtZX0+YCk7CiAgfQogIFskb25DaGlsZF0oY2hpbGQpIHsKICAgIGlmICh0aGlzWyRjb250ZW50XSkgewogICAgICBjb25zdCBub2RlID0gbmV3IFhtbE9iamVjdCh0aGlzWyRuYW1lc3BhY2VJZF0sICIjdGV4dCIpOwogICAgICB0aGlzWyRhcHBlbmRDaGlsZF0obm9kZSk7CiAgICAgIG5vZGVbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF07CiAgICAgIHRoaXNbJGNvbnRlbnRdID0gIiI7CiAgICB9CiAgICB0aGlzWyRhcHBlbmRDaGlsZF0oY2hpbGQpOwogICAgcmV0dXJuIHRydWU7CiAgfQogIFskb25UZXh0XShzdHIpIHsKICAgIHRoaXNbJGNvbnRlbnRdICs9IHN0cjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBpZiAodGhpc1skY29udGVudF0gJiYgdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3Qgbm9kZSA9IG5ldyBYbWxPYmplY3QodGhpc1skbmFtZXNwYWNlSWRdLCAiI3RleHQiKTsKICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICBub2RlWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdOwogICAgICBkZWxldGUgdGhpc1skY29udGVudF07CiAgICB9CiAgfQogIFskdG9IVE1MXSgpIHsKICAgIGlmICh0aGlzWyRub2RlTmFtZV0gPT09ICIjdGV4dCIpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogIiN0ZXh0IiwKICAgICAgICB2YWx1ZTogdGhpc1skY29udGVudF0KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICB9CiAgWyRnZXRDaGlsZHJlbl0obmFtZSA9IG51bGwpIHsKICAgIGlmICghbmFtZSkgewogICAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dOwogICAgfQogICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXS5maWx0ZXIoYyA9PiBjWyRub2RlTmFtZV0gPT09IG5hbWUpOwogIH0KICBbJGdldEF0dHJpYnV0ZXNdKCkgewogICAgcmV0dXJuIHRoaXNbX2F0dHJpYnV0ZXNdOwogIH0KICBbJGdldENoaWxkcmVuQnlDbGFzc10obmFtZSkgewogICAgY29uc3QgdmFsdWUgPSB0aGlzW19hdHRyaWJ1dGVzXS5nZXQobmFtZSk7CiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gdGhpc1skZ2V0Q2hpbGRyZW5dKG5hbWUpOwogIH0KICAqWyRnZXRDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCkgewogICAgY29uc3QgdmFsdWUgPSB0aGlzW19hdHRyaWJ1dGVzXS5nZXQobmFtZSk7CiAgICBpZiAodmFsdWUpIHsKICAgICAgeWllbGQgdmFsdWU7CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBpZiAoY2hpbGRbJG5vZGVOYW1lXSA9PT0gbmFtZSkgewogICAgICAgIHlpZWxkIGNoaWxkOwogICAgICB9CiAgICAgIGlmIChhbGxUcmFuc3BhcmVudCkgewogICAgICAgIHlpZWxkKiBjaGlsZFskZ2V0Q2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQpOwogICAgICB9CiAgICB9CiAgfQogICpbJGdldEF0dHJpYnV0ZUl0XShuYW1lLCBza2lwQ29uc3VtZWQpIHsKICAgIGNvbnN0IHZhbHVlID0gdGhpc1tfYXR0cmlidXRlc10uZ2V0KG5hbWUpOwogICAgaWYgKHZhbHVlICYmICghc2tpcENvbnN1bWVkIHx8ICF2YWx1ZVskY29uc3VtZWRdKSkgewogICAgICB5aWVsZCB2YWx1ZTsKICAgIH0KICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfY2hpbGRyZW5dKSB7CiAgICAgIHlpZWxkKiBjaGlsZFskZ2V0QXR0cmlidXRlSXRdKG5hbWUsIHNraXBDb25zdW1lZCk7CiAgICB9CiAgfQogICpbJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCwgc2tpcENvbnN1bWVkKSB7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBpZiAoY2hpbGRbJG5vZGVOYW1lXSA9PT0gbmFtZSAmJiAoIXNraXBDb25zdW1lZCB8fCAhY2hpbGRbJGNvbnN1bWVkXSkpIHsKICAgICAgICB5aWVsZCBjaGlsZDsKICAgICAgfQogICAgICBpZiAoYWxsVHJhbnNwYXJlbnQpIHsKICAgICAgICB5aWVsZCogY2hpbGRbJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCwgc2tpcENvbnN1bWVkKTsKICAgICAgfQogICAgfQogIH0KICBbJGlzRGF0YVZhbHVlXSgpIHsKICAgIGlmICh0aGlzW19kYXRhVmFsdWVdID09PSBudWxsKSB7CiAgICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl0ubGVuZ3RoID09PSAwIHx8IHRoaXNbX2NoaWxkcmVuXVswXVskbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMueGh0bWwuaWQ7CiAgICB9CiAgICByZXR1cm4gdGhpc1tfZGF0YVZhbHVlXTsKICB9CiAgWyRnZXREYXRhVmFsdWVdKCkgewogICAgaWYgKHRoaXNbX2RhdGFWYWx1ZV0gPT09IG51bGwpIHsKICAgICAgaWYgKHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gdGhpc1skY29udGVudF0udHJpbSgpOwogICAgICB9CiAgICAgIGlmICh0aGlzW19jaGlsZHJlbl1bMF1bJG5hbWVzcGFjZUlkXSA9PT0gTmFtZXNwYWNlSWRzLnhodG1sLmlkKSB7CiAgICAgICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXVswXVskdGV4dF0oKS50cmltKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gdGhpc1skY29udGVudF0udHJpbSgpOwogIH0KICBbJHNldFZhbHVlXSh2YWx1ZSkgewogICAgdmFsdWUgPSB2YWx1ZS52YWx1ZSB8fCAiIjsKICAgIHRoaXNbJGNvbnRlbnRdID0gdmFsdWUudG9TdHJpbmcoKTsKICB9CiAgWyRkdW1wXShoYXNOUyA9IGZhbHNlKSB7CiAgICBjb25zdCBkdW1wZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKGhhc05TKSB7CiAgICAgIGR1bXBlZC4kbnMgPSB0aGlzWyRuYW1lc3BhY2VJZF07CiAgICB9CiAgICBpZiAodGhpc1skY29udGVudF0pIHsKICAgICAgZHVtcGVkLiRjb250ZW50ID0gdGhpc1skY29udGVudF07CiAgICB9CiAgICBkdW1wZWQuJG5hbWUgPSB0aGlzWyRub2RlTmFtZV07CiAgICBkdW1wZWQuY2hpbGRyZW4gPSBbXTsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfY2hpbGRyZW5dKSB7CiAgICAgIGR1bXBlZC5jaGlsZHJlbi5wdXNoKGNoaWxkWyRkdW1wXShoYXNOUykpOwogICAgfQogICAgZHVtcGVkLmF0dHJpYnV0ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHRoaXNbX2F0dHJpYnV0ZXNdKSB7CiAgICAgIGR1bXBlZC5hdHRyaWJ1dGVzW25hbWVdID0gdmFsdWVbJGNvbnRlbnRdOwogICAgfQogICAgcmV0dXJuIGR1bXBlZDsKICB9Cn0KY2xhc3MgQ29udGVudE9iamVjdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IobnNJZCwgbmFtZSkgewogICAgc3VwZXIobnNJZCwgbmFtZSk7CiAgICB0aGlzWyRjb250ZW50XSA9ICIiOwogIH0KICBbJG9uVGV4dF0odGV4dCkgewogICAgdGhpc1skY29udGVudF0gKz0gdGV4dDsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7fQp9CmNsYXNzIE9wdGlvbk9iamVjdCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUsIG9wdGlvbnMpIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUpOwogICAgdGhpc1tfb3B0aW9uc10gPSBvcHRpb25zOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gZ2V0S2V5d29yZCh7CiAgICAgIGRhdGE6IHRoaXNbJGNvbnRlbnRdLAogICAgICBkZWZhdWx0VmFsdWU6IHRoaXNbX29wdGlvbnNdWzBdLAogICAgICB2YWxpZGF0ZTogayA9PiB0aGlzW19vcHRpb25zXS5pbmNsdWRlcyhrKQogICAgfSk7CiAgfQogIFskY2xlYW5dKGJ1aWxkZXIpIHsKICAgIHN1cGVyWyRjbGVhbl0oYnVpbGRlcik7CiAgICBkZWxldGUgdGhpc1tfb3B0aW9uc107CiAgfQp9CmNsYXNzIFN0cmluZ09iamVjdCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgfQp9CmNsYXNzIEludGVnZXJPYmplY3QgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lLCBkZWZhdWx0VmFsdWUsIHZhbGlkYXRvcikgewogICAgc3VwZXIobnNJZCwgbmFtZSk7CiAgICB0aGlzW19kZWZhdWx0VmFsdWVdID0gZGVmYXVsdFZhbHVlOwogICAgdGhpc1tfdmFsaWRhdG9yXSA9IHZhbGlkYXRvcjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiB0aGlzWyRjb250ZW50XSwKICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzW19kZWZhdWx0VmFsdWVdLAogICAgICB2YWxpZGF0ZTogdGhpc1tfdmFsaWRhdG9yXQogICAgfSk7CiAgfQogIFskY2xlYW5dKGJ1aWxkZXIpIHsKICAgIHN1cGVyWyRjbGVhbl0oYnVpbGRlcik7CiAgICBkZWxldGUgdGhpc1tfZGVmYXVsdFZhbHVlXTsKICAgIGRlbGV0ZSB0aGlzW192YWxpZGF0b3JdOwogIH0KfQpjbGFzcyBPcHRpb24wMSBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUpIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUsIDAsIG4gPT4gbiA9PT0gMSk7CiAgfQp9CmNsYXNzIE9wdGlvbjEwIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IobnNJZCwgbmFtZSkgewogICAgc3VwZXIobnNJZCwgbmFtZSwgMSwgbiA9PiBuID09PSAwKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9odG1sX3V0aWxzLmpzCgoKCgoKCmZ1bmN0aW9uIG1lYXN1cmVUb1N0cmluZyhtKSB7CiAgaWYgKHR5cGVvZiBtID09PSAic3RyaW5nIikgewogICAgcmV0dXJuICIwcHgiOwogIH0KICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihtKSA/IGAke219cHhgIDogYCR7bS50b0ZpeGVkKDIpfXB4YDsKfQpjb25zdCBjb252ZXJ0ZXJzID0gewogIGFuY2hvclR5cGUobm9kZSwgc3R5bGUpIHsKICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubGF5b3V0ICYmIHBhcmVudC5sYXlvdXQgIT09ICJwb3NpdGlvbiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCEoInRyYW5zZm9ybSIgaW4gc3R5bGUpKSB7CiAgICAgIHN0eWxlLnRyYW5zZm9ybSA9ICIiOwogICAgfQogICAgc3dpdGNoIChub2RlLmFuY2hvclR5cGUpIHsKICAgICAgY2FzZSAiYm90dG9tQ2VudGVyIjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtNTAlLCAtMTAwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJib3R0b21MZWZ0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgwLC0xMDAlKSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImJvdHRvbVJpZ2h0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtMTAwJSwtMTAwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJtaWRkbGVDZW50ZXIiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC01MCUsLTUwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJtaWRkbGVMZWZ0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgwLC01MCUpIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibWlkZGxlUmlnaHQiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC0xMDAlLC01MCUpIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidG9wQ2VudGVyIjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtNTAlLDApIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidG9wUmlnaHQiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC0xMDAlLDApIjsKICAgICAgICBicmVhazsKICAgIH0KICB9LAogIGRpbWVuc2lvbnMobm9kZSwgc3R5bGUpIHsKICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBsZXQgd2lkdGggPSBub2RlLnc7CiAgICBjb25zdCBoZWlnaHQgPSBub2RlLmg7CiAgICBpZiAocGFyZW50LmxheW91dD8uaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIGNvbnN0IGV4dHJhID0gcGFyZW50WyRleHRyYV07CiAgICAgIGNvbnN0IGNvbFNwYW4gPSBub2RlLmNvbFNwYW47CiAgICAgIGxldCB3OwogICAgICBpZiAoY29sU3BhbiA9PT0gLTEpIHsKICAgICAgICB3ID0gTWF0aC5zdW1QcmVjaXNlKGV4dHJhLmNvbHVtbldpZHRocy5zbGljZShleHRyYS5jdXJyZW50Q29sdW1uKSk7CiAgICAgICAgZXh0cmEuY3VycmVudENvbHVtbiA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdyA9IE1hdGguc3VtUHJlY2lzZShleHRyYS5jb2x1bW5XaWR0aHMuc2xpY2UoZXh0cmEuY3VycmVudENvbHVtbiwgZXh0cmEuY3VycmVudENvbHVtbiArIGNvbFNwYW4pKTsKICAgICAgICBleHRyYS5jdXJyZW50Q29sdW1uID0gKGV4dHJhLmN1cnJlbnRDb2x1bW4gKyBub2RlLmNvbFNwYW4pICUgZXh0cmEuY29sdW1uV2lkdGhzLmxlbmd0aDsKICAgICAgfQogICAgICBpZiAoIWlzTmFOKHcpKSB7CiAgICAgICAgd2lkdGggPSBub2RlLncgPSB3OwogICAgICB9CiAgICB9CiAgICBzdHlsZS53aWR0aCA9IHdpZHRoICE9PSAiIiA/IG1lYXN1cmVUb1N0cmluZyh3aWR0aCkgOiAiYXV0byI7CiAgICBzdHlsZS5oZWlnaHQgPSBoZWlnaHQgIT09ICIiID8gbWVhc3VyZVRvU3RyaW5nKGhlaWdodCkgOiAiYXV0byI7CiAgfSwKICBwb3NpdGlvbihub2RlLCBzdHlsZSkgewogICAgY29uc3QgcGFyZW50ID0gbm9kZVskZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQ/LmxheW91dCAmJiBwYXJlbnQubGF5b3V0ICE9PSAicG9zaXRpb24iKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHN0eWxlLmxlZnQgPSBtZWFzdXJlVG9TdHJpbmcobm9kZS54KTsKICAgIHN0eWxlLnRvcCA9IG1lYXN1cmVUb1N0cmluZyhub2RlLnkpOwogIH0sCiAgcm90YXRlKG5vZGUsIHN0eWxlKSB7CiAgICBpZiAobm9kZS5yb3RhdGUpIHsKICAgICAgaWYgKCEoInRyYW5zZm9ybSIgaW4gc3R5bGUpKSB7CiAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gIiI7CiAgICAgIH0KICAgICAgc3R5bGUudHJhbnNmb3JtICs9IGByb3RhdGUoLSR7bm9kZS5yb3RhdGV9ZGVnKWA7CiAgICAgIHN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9ICJ0b3AgbGVmdCI7CiAgICB9CiAgfSwKICBwcmVzZW5jZShub2RlLCBzdHlsZSkgewogICAgc3dpdGNoIChub2RlLnByZXNlbmNlKSB7CiAgICAgIGNhc2UgImludmlzaWJsZSI6CiAgICAgICAgc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJoaWRkZW4iOgogICAgICBjYXNlICJpbmFjdGl2ZSI6CiAgICAgICAgc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICBicmVhazsKICAgIH0KICB9LAogIGhBbGlnbihub2RlLCBzdHlsZSkgewogICAgaWYgKG5vZGVbJG5vZGVOYW1lXSA9PT0gInBhcmEiKSB7CiAgICAgIHN3aXRjaCAobm9kZS5oQWxpZ24pIHsKICAgICAgICBjYXNlICJqdXN0aWZ5QWxsIjoKICAgICAgICAgIHN0eWxlLnRleHRBbGlnbiA9ICJqdXN0aWZ5LWFsbCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyYWRpeCI6CiAgICAgICAgICBzdHlsZS50ZXh0QWxpZ24gPSAibGVmdCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgc3R5bGUudGV4dEFsaWduID0gbm9kZS5oQWxpZ247CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN3aXRjaCAobm9kZS5oQWxpZ24pIHsKICAgICAgICBjYXNlICJsZWZ0IjoKICAgICAgICAgIHN0eWxlLmFsaWduU2VsZiA9ICJzdGFydCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjZW50ZXIiOgogICAgICAgICAgc3R5bGUuYWxpZ25TZWxmID0gImNlbnRlciI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgICBzdHlsZS5hbGlnblNlbGYgPSAiZW5kIjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfSwKICBtYXJnaW4obm9kZSwgc3R5bGUpIHsKICAgIGlmIChub2RlLm1hcmdpbikgewogICAgICBzdHlsZS5tYXJnaW4gPSBub2RlLm1hcmdpblskdG9TdHlsZV0oKS5tYXJnaW47CiAgICB9CiAgfQp9OwpmdW5jdGlvbiBzZXRNaW5NYXhEaW1lbnNpb25zKG5vZGUsIHN0eWxlKSB7CiAgY29uc3QgcGFyZW50ID0gbm9kZVskZ2V0U3ViZm9ybVBhcmVudF0oKTsKICBpZiAocGFyZW50LmxheW91dCA9PT0gInBvc2l0aW9uIikgewogICAgaWYgKG5vZGUubWluVyA+IDApIHsKICAgICAgc3R5bGUubWluV2lkdGggPSBtZWFzdXJlVG9TdHJpbmcobm9kZS5taW5XKTsKICAgIH0KICAgIGlmIChub2RlLm1heFcgPiAwKSB7CiAgICAgIHN0eWxlLm1heFdpZHRoID0gbWVhc3VyZVRvU3RyaW5nKG5vZGUubWF4Vyk7CiAgICB9CiAgICBpZiAobm9kZS5taW5IID4gMCkgewogICAgICBzdHlsZS5taW5IZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcobm9kZS5taW5IKTsKICAgIH0KICAgIGlmIChub2RlLm1heEggPiAwKSB7CiAgICAgIHN0eWxlLm1heEhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhub2RlLm1heEgpOwogICAgfQogIH0KfQpmdW5jdGlvbiBsYXlvdXRUZXh0KHRleHQsIHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlciwgd2lkdGgpIHsKICBjb25zdCBtZWFzdXJlID0gbmV3IFRleHRNZWFzdXJlKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlcik7CiAgaWYgKHR5cGVvZiB0ZXh0ID09PSAic3RyaW5nIikgewogICAgbWVhc3VyZS5hZGRTdHJpbmcodGV4dCk7CiAgfSBlbHNlIHsKICAgIHRleHRbJHB1c2hHbHlwaHNdKG1lYXN1cmUpOwogIH0KICByZXR1cm4gbWVhc3VyZS5jb21wdXRlKHdpZHRoKTsKfQpmdW5jdGlvbiBsYXlvdXROb2RlKG5vZGUsIGF2YWlsYWJsZVNwYWNlKSB7CiAgbGV0IGhlaWdodCA9IG51bGw7CiAgbGV0IHdpZHRoID0gbnVsbDsKICBsZXQgaXNCcm9rZW4gPSBmYWxzZTsKICBpZiAoKCFub2RlLncgfHwgIW5vZGUuaCkgJiYgbm9kZS52YWx1ZSkgewogICAgbGV0IG1hcmdpbkggPSAwOwogICAgbGV0IG1hcmdpblYgPSAwOwogICAgaWYgKG5vZGUubWFyZ2luKSB7CiAgICAgIG1hcmdpbkggPSBub2RlLm1hcmdpbi5sZWZ0SW5zZXQgKyBub2RlLm1hcmdpbi5yaWdodEluc2V0OwogICAgICBtYXJnaW5WID0gbm9kZS5tYXJnaW4udG9wSW5zZXQgKyBub2RlLm1hcmdpbi5ib3R0b21JbnNldDsKICAgIH0KICAgIGxldCBsaW5lSGVpZ2h0ID0gbnVsbDsKICAgIGxldCBtYXJnaW4gPSBudWxsOwogICAgaWYgKG5vZGUucGFyYSkgewogICAgICBtYXJnaW4gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBsaW5lSGVpZ2h0ID0gbm9kZS5wYXJhLmxpbmVIZWlnaHQgPT09ICIiID8gbnVsbCA6IG5vZGUucGFyYS5saW5lSGVpZ2h0OwogICAgICBtYXJnaW4udG9wID0gbm9kZS5wYXJhLnNwYWNlQWJvdmUgPT09ICIiID8gMCA6IG5vZGUucGFyYS5zcGFjZUFib3ZlOwogICAgICBtYXJnaW4uYm90dG9tID0gbm9kZS5wYXJhLnNwYWNlQmVsb3cgPT09ICIiID8gMCA6IG5vZGUucGFyYS5zcGFjZUJlbG93OwogICAgICBtYXJnaW4ubGVmdCA9IG5vZGUucGFyYS5tYXJnaW5MZWZ0ID09PSAiIiA/IDAgOiBub2RlLnBhcmEubWFyZ2luTGVmdDsKICAgICAgbWFyZ2luLnJpZ2h0ID0gbm9kZS5wYXJhLm1hcmdpblJpZ2h0ID09PSAiIiA/IDAgOiBub2RlLnBhcmEubWFyZ2luUmlnaHQ7CiAgICB9CiAgICBsZXQgZm9udCA9IG5vZGUuZm9udDsKICAgIGlmICghZm9udCkgewogICAgICBjb25zdCByb290ID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpOwogICAgICBsZXQgcGFyZW50ID0gbm9kZVskZ2V0UGFyZW50XSgpOwogICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudCAhPT0gcm9vdCkgewogICAgICAgIGlmIChwYXJlbnQuZm9udCkgewogICAgICAgICAgZm9udCA9IHBhcmVudC5mb250OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHBhcmVudCA9IHBhcmVudFskZ2V0UGFyZW50XSgpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBtYXhXaWR0aCA9IChub2RlLncgfHwgYXZhaWxhYmxlU3BhY2Uud2lkdGgpIC0gbWFyZ2luSDsKICAgIGNvbnN0IGZvbnRGaW5kZXIgPSBub2RlWyRnbG9iYWxEYXRhXS5mb250RmluZGVyOwogICAgaWYgKG5vZGUudmFsdWUuZXhEYXRhICYmIG5vZGUudmFsdWUuZXhEYXRhWyRjb250ZW50XSAmJiBub2RlLnZhbHVlLmV4RGF0YS5jb250ZW50VHlwZSA9PT0gInRleHQvaHRtbCIpIHsKICAgICAgY29uc3QgcmVzID0gbGF5b3V0VGV4dChub2RlLnZhbHVlLmV4RGF0YVskY29udGVudF0sIGZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlciwgbWF4V2lkdGgpOwogICAgICB3aWR0aCA9IHJlcy53aWR0aDsKICAgICAgaGVpZ2h0ID0gcmVzLmhlaWdodDsKICAgICAgaXNCcm9rZW4gPSByZXMuaXNCcm9rZW47CiAgICB9IGVsc2UgewogICAgICBjb25zdCB0ZXh0ID0gbm9kZS52YWx1ZVskdGV4dF0oKTsKICAgICAgaWYgKHRleHQpIHsKICAgICAgICBjb25zdCByZXMgPSBsYXlvdXRUZXh0KHRleHQsIGZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlciwgbWF4V2lkdGgpOwogICAgICAgIHdpZHRoID0gcmVzLndpZHRoOwogICAgICAgIGhlaWdodCA9IHJlcy5oZWlnaHQ7CiAgICAgICAgaXNCcm9rZW4gPSByZXMuaXNCcm9rZW47CiAgICAgIH0KICAgIH0KICAgIGlmICh3aWR0aCAhPT0gbnVsbCAmJiAhbm9kZS53KSB7CiAgICAgIHdpZHRoICs9IG1hcmdpbkg7CiAgICB9CiAgICBpZiAoaGVpZ2h0ICE9PSBudWxsICYmICFub2RlLmgpIHsKICAgICAgaGVpZ2h0ICs9IG1hcmdpblY7CiAgICB9CiAgfQogIHJldHVybiB7CiAgICB3OiB3aWR0aCwKICAgIGg6IGhlaWdodCwKICAgIGlzQnJva2VuCiAgfTsKfQpmdW5jdGlvbiBjb21wdXRlQmJveChub2RlLCBodG1sLCBhdmFpbGFibGVTcGFjZSkgewogIGxldCBiYm94OwogIGlmIChub2RlLncgIT09ICIiICYmIG5vZGUuaCAhPT0gIiIpIHsKICAgIGJib3ggPSBbbm9kZS54LCBub2RlLnksIG5vZGUudywgbm9kZS5oXTsKICB9IGVsc2UgewogICAgaWYgKCFhdmFpbGFibGVTcGFjZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGxldCB3aWR0aCA9IG5vZGUudzsKICAgIGlmICh3aWR0aCA9PT0gIiIpIHsKICAgICAgaWYgKG5vZGUubWF4VyA9PT0gMCkgewogICAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICAgICAgd2lkdGggPSBwYXJlbnQubGF5b3V0ID09PSAicG9zaXRpb24iICYmIHBhcmVudC53ICE9PSAiIiA/IDAgOiBub2RlLm1pblc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2lkdGggPSBNYXRoLm1pbihub2RlLm1heFcsIGF2YWlsYWJsZVNwYWNlLndpZHRoKTsKICAgICAgfQogICAgICBodG1sLmF0dHJpYnV0ZXMuc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcod2lkdGgpOwogICAgfQogICAgbGV0IGhlaWdodCA9IG5vZGUuaDsKICAgIGlmIChoZWlnaHQgPT09ICIiKSB7CiAgICAgIGlmIChub2RlLm1heEggPT09IDApIHsKICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgICAgIGhlaWdodCA9IHBhcmVudC5sYXlvdXQgPT09ICJwb3NpdGlvbiIgJiYgcGFyZW50LmggIT09ICIiID8gMCA6IG5vZGUubWluSDsKICAgICAgfSBlbHNlIHsKICAgICAgICBoZWlnaHQgPSBNYXRoLm1pbihub2RlLm1heEgsIGF2YWlsYWJsZVNwYWNlLmhlaWdodCk7CiAgICAgIH0KICAgICAgaHRtbC5hdHRyaWJ1dGVzLnN0eWxlLmhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhoZWlnaHQpOwogICAgfQogICAgYmJveCA9IFtub2RlLngsIG5vZGUueSwgd2lkdGgsIGhlaWdodF07CiAgfQogIHJldHVybiBiYm94Owp9CmZ1bmN0aW9uIGZpeERpbWVuc2lvbnMobm9kZSkgewogIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgaWYgKHBhcmVudC5sYXlvdXQ/LmluY2x1ZGVzKCJyb3ciKSkgewogICAgY29uc3QgZXh0cmEgPSBwYXJlbnRbJGV4dHJhXTsKICAgIGNvbnN0IGNvbFNwYW4gPSBub2RlLmNvbFNwYW47CiAgICBsZXQgd2lkdGg7CiAgICBpZiAoY29sU3BhbiA9PT0gLTEpIHsKICAgICAgd2lkdGggPSBNYXRoLnN1bVByZWNpc2UoZXh0cmEuY29sdW1uV2lkdGhzLnNsaWNlKGV4dHJhLmN1cnJlbnRDb2x1bW4pKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpZHRoID0gTWF0aC5zdW1QcmVjaXNlKGV4dHJhLmNvbHVtbldpZHRocy5zbGljZShleHRyYS5jdXJyZW50Q29sdW1uLCBleHRyYS5jdXJyZW50Q29sdW1uICsgY29sU3BhbikpOwogICAgfQogICAgaWYgKCFpc05hTih3aWR0aCkpIHsKICAgICAgbm9kZS53ID0gd2lkdGg7CiAgICB9CiAgfQogIGlmIChwYXJlbnQubGF5b3V0ICYmIHBhcmVudC5sYXlvdXQgIT09ICJwb3NpdGlvbiIpIHsKICAgIG5vZGUueCA9IG5vZGUueSA9IDA7CiAgfQogIGlmIChub2RlLmxheW91dCA9PT0gInRhYmxlIikgewogICAgaWYgKG5vZGUudyA9PT0gIiIgJiYgQXJyYXkuaXNBcnJheShub2RlLmNvbHVtbldpZHRocykpIHsKICAgICAgbm9kZS53ID0gTWF0aC5zdW1QcmVjaXNlKG5vZGUuY29sdW1uV2lkdGhzKTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gbGF5b3V0Q2xhc3Mobm9kZSkgewogIHN3aXRjaCAobm9kZS5sYXlvdXQpIHsKICAgIGNhc2UgInBvc2l0aW9uIjoKICAgICAgcmV0dXJuICJ4ZmFQb3NpdGlvbiI7CiAgICBjYXNlICJsci10YiI6CiAgICAgIHJldHVybiAieGZhTHJUYiI7CiAgICBjYXNlICJybC1yb3ciOgogICAgICByZXR1cm4gInhmYVJsUm93IjsKICAgIGNhc2UgInJsLXRiIjoKICAgICAgcmV0dXJuICJ4ZmFSbFRiIjsKICAgIGNhc2UgInJvdyI6CiAgICAgIHJldHVybiAieGZhUm93IjsKICAgIGNhc2UgInRhYmxlIjoKICAgICAgcmV0dXJuICJ4ZmFUYWJsZSI7CiAgICBjYXNlICJ0YiI6CiAgICAgIHJldHVybiAieGZhVGIiOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuICJ4ZmFQb3NpdGlvbiI7CiAgfQp9CmZ1bmN0aW9uIHRvU3R5bGUobm9kZSwgLi4ubmFtZXMpIHsKICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7CiAgICBjb25zdCB2YWx1ZSA9IG5vZGVbbmFtZV07CiAgICBpZiAodmFsdWUgPT09IG51bGwpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAoY29udmVydGVycy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICBjb252ZXJ0ZXJzW25hbWVdKG5vZGUsIHN0eWxlKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBYRkFPYmplY3QpIHsKICAgICAgY29uc3QgbmV3U3R5bGUgPSB2YWx1ZVskdG9TdHlsZV0oKTsKICAgICAgaWYgKG5ld1N0eWxlKSB7CiAgICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgbmV3U3R5bGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oYChERUJVRykgLSBYRkEgLSBzdHlsZSBmb3IgJHtuYW1lfSBub3QgaW1wbGVtZW50ZWQgeWV0YCk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHN0eWxlOwp9CmZ1bmN0aW9uIGNyZWF0ZVdyYXBwZXIobm9kZSwgaHRtbCkgewogIGNvbnN0IHsKICAgIGF0dHJpYnV0ZXMKICB9ID0gaHRtbDsKICBjb25zdCB7CiAgICBzdHlsZQogIH0gPSBhdHRyaWJ1dGVzOwogIGNvbnN0IHdyYXBwZXIgPSB7CiAgICBuYW1lOiAiZGl2IiwKICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgY2xhc3M6IFsieGZhV3JhcHBlciJdLAogICAgICBzdHlsZTogT2JqZWN0LmNyZWF0ZShudWxsKQogICAgfSwKICAgIGNoaWxkcmVuOiBbXQogIH07CiAgYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFXcmFwcGVkIik7CiAgaWYgKG5vZGUuYm9yZGVyKSB7CiAgICBjb25zdCB7CiAgICAgIHdpZHRocywKICAgICAgaW5zZXRzCiAgICB9ID0gbm9kZS5ib3JkZXJbJGV4dHJhXTsKICAgIGxldCB3aWR0aCwgaGVpZ2h0OwogICAgbGV0IHRvcCA9IGluc2V0c1swXTsKICAgIGxldCBsZWZ0ID0gaW5zZXRzWzNdOwogICAgY29uc3QgaW5zZXRzSCA9IGluc2V0c1swXSArIGluc2V0c1syXTsKICAgIGNvbnN0IGluc2V0c1cgPSBpbnNldHNbMV0gKyBpbnNldHNbM107CiAgICBzd2l0Y2ggKG5vZGUuYm9yZGVyLmhhbmQpIHsKICAgICAgY2FzZSAiZXZlbiI6CiAgICAgICAgdG9wIC09IHdpZHRoc1swXSAvIDI7CiAgICAgICAgbGVmdCAtPSB3aWR0aHNbM10gLyAyOwogICAgICAgIHdpZHRoID0gYGNhbGMoMTAwJSArICR7KHdpZHRoc1sxXSArIHdpZHRoc1szXSkgLyAyIC0gaW5zZXRzV31weClgOwogICAgICAgIGhlaWdodCA9IGBjYWxjKDEwMCUgKyAkeyh3aWR0aHNbMF0gKyB3aWR0aHNbMl0pIC8gMiAtIGluc2V0c0h9cHgpYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgdG9wIC09IHdpZHRoc1swXTsKICAgICAgICBsZWZ0IC09IHdpZHRoc1szXTsKICAgICAgICB3aWR0aCA9IGBjYWxjKDEwMCUgKyAke3dpZHRoc1sxXSArIHdpZHRoc1szXSAtIGluc2V0c1d9cHgpYDsKICAgICAgICBoZWlnaHQgPSBgY2FsYygxMDAlICsgJHt3aWR0aHNbMF0gKyB3aWR0aHNbMl0gLSBpbnNldHNIfXB4KWA7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICB3aWR0aCA9IGluc2V0c1cgPyBgY2FsYygxMDAlIC0gJHtpbnNldHNXfXB4KWAgOiAiMTAwJSI7CiAgICAgICAgaGVpZ2h0ID0gaW5zZXRzSCA/IGBjYWxjKDEwMCUgLSAke2luc2V0c0h9cHgpYCA6ICIxMDAlIjsKICAgICAgICBicmVhazsKICAgIH0KICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbInhmYUJvcmRlciJdOwogICAgaWYgKGlzUHJpbnRPbmx5KG5vZGUuYm9yZGVyKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgY29uc3QgYm9yZGVyID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBjbGFzc05hbWVzLAogICAgICAgIHN0eWxlOiB7CiAgICAgICAgICB0b3A6IGAke3RvcH1weGAsCiAgICAgICAgICBsZWZ0OiBgJHtsZWZ0fXB4YCwKICAgICAgICAgIHdpZHRoLAogICAgICAgICAgaGVpZ2h0CiAgICAgICAgfQogICAgICB9LAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgICBmb3IgKGNvbnN0IGtleSBvZiBbImJvcmRlciIsICJib3JkZXJXaWR0aCIsICJib3JkZXJDb2xvciIsICJib3JkZXJSYWRpdXMiLCAiYm9yZGVyU3R5bGUiXSkgewogICAgICBpZiAoc3R5bGVba2V5XSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgYm9yZGVyLmF0dHJpYnV0ZXMuc3R5bGVba2V5XSA9IHN0eWxlW2tleV07CiAgICAgICAgZGVsZXRlIHN0eWxlW2tleV07CiAgICAgIH0KICAgIH0KICAgIHdyYXBwZXIuY2hpbGRyZW4ucHVzaChib3JkZXIsIGh0bWwpOwogIH0gZWxzZSB7CiAgICB3cmFwcGVyLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgfQogIGZvciAoY29uc3Qga2V5IG9mIFsiYmFja2dyb3VuZCIsICJiYWNrZ3JvdW5kQ2xpcCIsICJ0b3AiLCAibGVmdCIsICJ3aWR0aCIsICJoZWlnaHQiLCAibWluV2lkdGgiLCAibWluSGVpZ2h0IiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJ0cmFuc2Zvcm0iLCAidHJhbnNmb3JtT3JpZ2luIiwgInZpc2liaWxpdHkiXSkgewogICAgaWYgKHN0eWxlW2tleV0gIT09IHVuZGVmaW5lZCkgewogICAgICB3cmFwcGVyLmF0dHJpYnV0ZXMuc3R5bGVba2V5XSA9IHN0eWxlW2tleV07CiAgICAgIGRlbGV0ZSBzdHlsZVtrZXldOwogICAgfQogIH0KICB3cmFwcGVyLmF0dHJpYnV0ZXMuc3R5bGUucG9zaXRpb24gPSBzdHlsZS5wb3NpdGlvbiA9PT0gImFic29sdXRlIiA/ICJhYnNvbHV0ZSIgOiAicmVsYXRpdmUiOwogIGRlbGV0ZSBzdHlsZS5wb3NpdGlvbjsKICBpZiAoc3R5bGUuYWxpZ25TZWxmKSB7CiAgICB3cmFwcGVyLmF0dHJpYnV0ZXMuc3R5bGUuYWxpZ25TZWxmID0gc3R5bGUuYWxpZ25TZWxmOwogICAgZGVsZXRlIHN0eWxlLmFsaWduU2VsZjsKICB9CiAgcmV0dXJuIHdyYXBwZXI7Cn0KZnVuY3Rpb24gZml4VGV4dEluZGVudChzdHlsZXMpIHsKICBjb25zdCBpbmRlbnQgPSBnZXRNZWFzdXJlbWVudChzdHlsZXMudGV4dEluZGVudCwgIjBweCIpOwogIGlmIChpbmRlbnQgPj0gMCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCBhbGlnbiA9IHN0eWxlcy50ZXh0QWxpZ24gPT09ICJyaWdodCIgPyAicmlnaHQiIDogImxlZnQiOwogIGNvbnN0IG5hbWUgPSAicGFkZGluZyIgKyAoYWxpZ24gPT09ICJsZWZ0IiA/ICJMZWZ0IiA6ICJSaWdodCIpOwogIGNvbnN0IHBhZGRpbmcgPSBnZXRNZWFzdXJlbWVudChzdHlsZXNbbmFtZV0sICIwcHgiKTsKICBzdHlsZXNbbmFtZV0gPSBgJHtwYWRkaW5nIC0gaW5kZW50fXB4YDsKfQpmdW5jdGlvbiBzZXRBY2Nlc3Mobm9kZSwgY2xhc3NOYW1lcykgewogIHN3aXRjaCAobm9kZS5hY2Nlc3MpIHsKICAgIGNhc2UgIm5vbkludGVyYWN0aXZlIjoKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFOb25JbnRlcmFjdGl2ZSIpOwogICAgICBicmVhazsKICAgIGNhc2UgInJlYWRPbmx5IjoKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFSZWFkT25seSIpOwogICAgICBicmVhazsKICAgIGNhc2UgInByb3RlY3RlZCI6CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhRGlzYWJsZWQiKTsKICAgICAgYnJlYWs7CiAgfQp9CmZ1bmN0aW9uIGlzUHJpbnRPbmx5KG5vZGUpIHsKICByZXR1cm4gbm9kZS5yZWxldmFudC5sZW5ndGggPiAwICYmICFub2RlLnJlbGV2YW50WzBdLmV4Y2x1ZGVkICYmIG5vZGUucmVsZXZhbnRbMF0udmlld25hbWUgPT09ICJwcmludCI7Cn0KZnVuY3Rpb24gZ2V0Q3VycmVudFBhcmEobm9kZSkgewogIGNvbnN0IHN0YWNrID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ucGFyYVN0YWNrOwogIHJldHVybiBzdGFjay5sZW5ndGggPyBzdGFjay5hdCgtMSkgOiBudWxsOwp9CmZ1bmN0aW9uIHNldFBhcmEobm9kZSwgbm9kZVN0eWxlLCB2YWx1ZSkgewogIGlmICh2YWx1ZS5hdHRyaWJ1dGVzLmNsYXNzPy5pbmNsdWRlcygieGZhUmljaCIpKSB7CiAgICBpZiAobm9kZVN0eWxlKSB7CiAgICAgIGlmIChub2RlLmggPT09ICIiKSB7CiAgICAgICAgbm9kZVN0eWxlLmhlaWdodCA9ICJhdXRvIjsKICAgICAgfQogICAgICBpZiAobm9kZS53ID09PSAiIikgewogICAgICAgIG5vZGVTdHlsZS53aWR0aCA9ICJhdXRvIjsKICAgICAgfQogICAgfQogICAgY29uc3QgcGFyYSA9IGdldEN1cnJlbnRQYXJhKG5vZGUpOwogICAgaWYgKHBhcmEpIHsKICAgICAgY29uc3QgdmFsdWVTdHlsZSA9IHZhbHVlLmF0dHJpYnV0ZXMuc3R5bGU7CiAgICAgIHZhbHVlU3R5bGUuZGlzcGxheSA9ICJmbGV4IjsKICAgICAgdmFsdWVTdHlsZS5mbGV4RGlyZWN0aW9uID0gImNvbHVtbiI7CiAgICAgIHN3aXRjaCAocGFyYS52QWxpZ24pIHsKICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgICAgdmFsdWVTdHlsZS5qdXN0aWZ5Q29udGVudCA9ICJzdGFydCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJib3R0b20iOgogICAgICAgICAgdmFsdWVTdHlsZS5qdXN0aWZ5Q29udGVudCA9ICJlbmQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWlkZGxlIjoKICAgICAgICAgIHZhbHVlU3R5bGUuanVzdGlmeUNvbnRlbnQgPSAiY2VudGVyIjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNvbnN0IHBhcmFTdHlsZSA9IHBhcmFbJHRvU3R5bGVdKCk7CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhwYXJhU3R5bGUpKSB7CiAgICAgICAgaWYgKCEoa2V5IGluIHZhbHVlU3R5bGUpKSB7CiAgICAgICAgICB2YWx1ZVN0eWxlW2tleV0gPSB2YWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CmZ1bmN0aW9uIHNldEZvbnRGYW1pbHkoeGZhRm9udCwgbm9kZSwgZm9udEZpbmRlciwgc3R5bGUpIHsKICBpZiAoIWZvbnRGaW5kZXIpIHsKICAgIGRlbGV0ZSBzdHlsZS5mb250RmFtaWx5OwogICAgcmV0dXJuOwogIH0KICBjb25zdCBuYW1lID0gc3RyaXBRdW90ZXMoeGZhRm9udC50eXBlZmFjZSk7CiAgc3R5bGUuZm9udEZhbWlseSA9IGAiJHtuYW1lfSJgOwogIGNvbnN0IHR5cGVmYWNlID0gZm9udEZpbmRlci5maW5kKG5hbWUpOwogIGlmICh0eXBlZmFjZSkgewogICAgY29uc3QgewogICAgICBmb250RmFtaWx5CiAgICB9ID0gdHlwZWZhY2UucmVndWxhci5jc3NGb250SW5mbzsKICAgIGlmIChmb250RmFtaWx5ICE9PSBuYW1lKSB7CiAgICAgIHN0eWxlLmZvbnRGYW1pbHkgPSBgIiR7Zm9udEZhbWlseX0iYDsKICAgIH0KICAgIGNvbnN0IHBhcmEgPSBnZXRDdXJyZW50UGFyYShub2RlKTsKICAgIGlmIChwYXJhICYmIHBhcmEubGluZUhlaWdodCAhPT0gIiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHN0eWxlLmxpbmVIZWlnaHQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGRmRm9udCA9IHNlbGVjdEZvbnQoeGZhRm9udCwgdHlwZWZhY2UpOwogICAgaWYgKHBkZkZvbnQpIHsKICAgICAgc3R5bGUubGluZUhlaWdodCA9IE1hdGgubWF4KDEuMiwgcGRmRm9udC5saW5lSGVpZ2h0KTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gZml4VVJMKHN0cikgewogIGNvbnN0IGFic29sdXRlVXJsID0gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybChzdHIsIG51bGwsIHsKICAgIGFkZERlZmF1bHRQcm90b2NvbDogdHJ1ZSwKICAgIHRyeUNvbnZlcnRFbmNvZGluZzogdHJ1ZQogIH0pOwogIHJldHVybiBhYnNvbHV0ZVVybCA/IGFic29sdXRlVXJsLmhyZWYgOiBudWxsOwp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvbGF5b3V0LmpzCgoKCmZ1bmN0aW9uIGNyZWF0ZUxpbmUobm9kZSwgY2hpbGRyZW4pIHsKICByZXR1cm4gewogICAgbmFtZTogImRpdiIsCiAgICBhdHRyaWJ1dGVzOiB7CiAgICAgIGNsYXNzOiBbbm9kZS5sYXlvdXQgPT09ICJsci10YiIgPyAieGZhTHIiIDogInhmYVJsIl0KICAgIH0sCiAgICBjaGlsZHJlbgogIH07Cn0KZnVuY3Rpb24gZmx1c2hIVE1MKG5vZGUpIHsKICBpZiAoIW5vZGVbJGV4dHJhXSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IGF0dHJpYnV0ZXMgPSBub2RlWyRleHRyYV0uYXR0cmlidXRlczsKICBjb25zdCBodG1sID0gewogICAgbmFtZTogImRpdiIsCiAgICBhdHRyaWJ1dGVzLAogICAgY2hpbGRyZW46IG5vZGVbJGV4dHJhXS5jaGlsZHJlbgogIH07CiAgaWYgKG5vZGVbJGV4dHJhXS5mYWlsaW5nTm9kZSkgewogICAgY29uc3QgaHRtbEZyb21GYWlsaW5nID0gbm9kZVskZXh0cmFdLmZhaWxpbmdOb2RlWyRmbHVzaEhUTUxdKCk7CiAgICBpZiAoaHRtbEZyb21GYWlsaW5nKSB7CiAgICAgIGlmIChub2RlLmxheW91dC5lbmRzV2l0aCgiLXRiIikpIHsKICAgICAgICBodG1sLmNoaWxkcmVuLnB1c2goY3JlYXRlTGluZShub2RlLCBbaHRtbEZyb21GYWlsaW5nXSkpOwogICAgICB9IGVsc2UgewogICAgICAgIGh0bWwuY2hpbGRyZW4ucHVzaChodG1sRnJvbUZhaWxpbmcpOwogICAgICB9CiAgICB9CiAgfQogIGlmIChodG1sLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBodG1sOwp9CmZ1bmN0aW9uIGFkZEhUTUwobm9kZSwgaHRtbCwgYmJveCkgewogIGNvbnN0IGV4dHJhID0gbm9kZVskZXh0cmFdOwogIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gZXh0cmEuYXZhaWxhYmxlU3BhY2U7CiAgY29uc3QgW3gsIHksIHcsIGhdID0gYmJveDsKICBzd2l0Y2ggKG5vZGUubGF5b3V0KSB7CiAgICBjYXNlICJwb3NpdGlvbiI6CiAgICAgIHsKICAgICAgICBleHRyYS53aWR0aCA9IE1hdGgubWF4KGV4dHJhLndpZHRoLCB4ICsgdyk7CiAgICAgICAgZXh0cmEuaGVpZ2h0ID0gTWF0aC5tYXgoZXh0cmEuaGVpZ2h0LCB5ICsgaCk7CiAgICAgICAgZXh0cmEuY2hpbGRyZW4ucHVzaChodG1sKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAibHItdGIiOgogICAgY2FzZSAicmwtdGIiOgogICAgICBpZiAoIWV4dHJhLmxpbmUgfHwgZXh0cmEuYXR0ZW1wdCA9PT0gMSkgewogICAgICAgIGV4dHJhLmxpbmUgPSBjcmVhdGVMaW5lKG5vZGUsIFtdKTsKICAgICAgICBleHRyYS5jaGlsZHJlbi5wdXNoKGV4dHJhLmxpbmUpOwogICAgICAgIGV4dHJhLm51bWJlckluTGluZSA9IDA7CiAgICAgIH0KICAgICAgZXh0cmEubnVtYmVySW5MaW5lICs9IDE7CiAgICAgIGV4dHJhLmxpbmUuY2hpbGRyZW4ucHVzaChodG1sKTsKICAgICAgaWYgKGV4dHJhLmF0dGVtcHQgPT09IDApIHsKICAgICAgICBleHRyYS5jdXJyZW50V2lkdGggKz0gdzsKICAgICAgICBleHRyYS5oZWlnaHQgPSBNYXRoLm1heChleHRyYS5oZWlnaHQsIGV4dHJhLnByZXZIZWlnaHQgKyBoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBleHRyYS5jdXJyZW50V2lkdGggPSB3OwogICAgICAgIGV4dHJhLnByZXZIZWlnaHQgPSBleHRyYS5oZWlnaHQ7CiAgICAgICAgZXh0cmEuaGVpZ2h0ICs9IGg7CiAgICAgICAgZXh0cmEuYXR0ZW1wdCA9IDA7CiAgICAgIH0KICAgICAgZXh0cmEud2lkdGggPSBNYXRoLm1heChleHRyYS53aWR0aCwgZXh0cmEuY3VycmVudFdpZHRoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJybC1yb3ciOgogICAgY2FzZSAicm93IjoKICAgICAgewogICAgICAgIGV4dHJhLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgICAgZXh0cmEud2lkdGggKz0gdzsKICAgICAgICBleHRyYS5oZWlnaHQgPSBNYXRoLm1heChleHRyYS5oZWlnaHQsIGgpOwogICAgICAgIGNvbnN0IGhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhleHRyYS5oZWlnaHQpOwogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZXh0cmEuY2hpbGRyZW4pIHsKICAgICAgICAgIGNoaWxkLmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAidGFibGUiOgogICAgICB7CiAgICAgICAgZXh0cmEud2lkdGggPSBNYXRoQ2xhbXAodywgZXh0cmEud2lkdGgsIGF2YWlsYWJsZVNwYWNlLndpZHRoKTsKICAgICAgICBleHRyYS5oZWlnaHQgKz0gaDsKICAgICAgICBleHRyYS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICBjYXNlICJ0YiI6CiAgICAgIHsKICAgICAgICBleHRyYS53aWR0aCA9IE1hdGhDbGFtcCh3LCBleHRyYS53aWR0aCwgYXZhaWxhYmxlU3BhY2Uud2lkdGgpOwogICAgICAgIGV4dHJhLmhlaWdodCArPSBoOwogICAgICAgIGV4dHJhLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICB9Cn0KZnVuY3Rpb24gZ2V0QXZhaWxhYmxlU3BhY2Uobm9kZSkgewogIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gbm9kZVskZXh0cmFdLmF2YWlsYWJsZVNwYWNlOwogIGNvbnN0IG1hcmdpblYgPSBub2RlLm1hcmdpbiA/IG5vZGUubWFyZ2luLnRvcEluc2V0ICsgbm9kZS5tYXJnaW4uYm90dG9tSW5zZXQgOiAwOwogIGNvbnN0IG1hcmdpbkggPSBub2RlLm1hcmdpbiA/IG5vZGUubWFyZ2luLmxlZnRJbnNldCArIG5vZGUubWFyZ2luLnJpZ2h0SW5zZXQgOiAwOwogIHN3aXRjaCAobm9kZS5sYXlvdXQpIHsKICAgIGNhc2UgImxyLXRiIjoKICAgIGNhc2UgInJsLXRiIjoKICAgICAgaWYgKG5vZGVbJGV4dHJhXS5hdHRlbXB0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHdpZHRoOiBhdmFpbGFibGVTcGFjZS53aWR0aCAtIG1hcmdpbkggLSBub2RlWyRleHRyYV0uY3VycmVudFdpZHRoLAogICAgICAgICAgaGVpZ2h0OiBhdmFpbGFibGVTcGFjZS5oZWlnaHQgLSBtYXJnaW5WIC0gbm9kZVskZXh0cmFdLnByZXZIZWlnaHQKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgd2lkdGg6IGF2YWlsYWJsZVNwYWNlLndpZHRoIC0gbWFyZ2luSCwKICAgICAgICBoZWlnaHQ6IGF2YWlsYWJsZVNwYWNlLmhlaWdodCAtIG1hcmdpblYgLSBub2RlWyRleHRyYV0uaGVpZ2h0CiAgICAgIH07CiAgICBjYXNlICJybC1yb3ciOgogICAgY2FzZSAicm93IjoKICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLnN1bVByZWNpc2Uobm9kZVskZXh0cmFdLmNvbHVtbldpZHRocy5zbGljZShub2RlWyRleHRyYV0uY3VycmVudENvbHVtbikpOwogICAgICByZXR1cm4gewogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodDogYXZhaWxhYmxlU3BhY2UuaGVpZ2h0IC0gbWFyZ2luSAogICAgICB9OwogICAgY2FzZSAidGFibGUiOgogICAgY2FzZSAidGIiOgogICAgICByZXR1cm4gewogICAgICAgIHdpZHRoOiBhdmFpbGFibGVTcGFjZS53aWR0aCAtIG1hcmdpbkgsCiAgICAgICAgaGVpZ2h0OiBhdmFpbGFibGVTcGFjZS5oZWlnaHQgLSBtYXJnaW5WIC0gbm9kZVskZXh0cmFdLmhlaWdodAogICAgICB9OwogICAgY2FzZSAicG9zaXRpb24iOgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGF2YWlsYWJsZVNwYWNlOwogIH0KfQpmdW5jdGlvbiBnZXRUcmFuc2Zvcm1lZEJCb3gobm9kZSkgewogIGxldCB3ID0gbm9kZS53ID09PSAiIiA/IE5hTiA6IG5vZGUudzsKICBsZXQgaCA9IG5vZGUuaCA9PT0gIiIgPyBOYU4gOiBub2RlLmg7CiAgbGV0IFtjZW50ZXJYLCBjZW50ZXJZXSA9IFswLCAwXTsKICBzd2l0Y2ggKG5vZGUuYW5jaG9yVHlwZSB8fCAiIikgewogICAgY2FzZSAiYm90dG9tQ2VudGVyIjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3cgLyAyLCBoXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJib3R0b21MZWZ0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gWzAsIGhdOwogICAgICBicmVhazsKICAgIGNhc2UgImJvdHRvbVJpZ2h0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3csIGhdOwogICAgICBicmVhazsKICAgIGNhc2UgIm1pZGRsZUNlbnRlciI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFt3IC8gMiwgaCAvIDJdOwogICAgICBicmVhazsKICAgIGNhc2UgIm1pZGRsZUxlZnQiOgogICAgICBbY2VudGVyWCwgY2VudGVyWV0gPSBbMCwgaCAvIDJdOwogICAgICBicmVhazsKICAgIGNhc2UgIm1pZGRsZVJpZ2h0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3csIGggLyAyXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJ0b3BDZW50ZXIiOgogICAgICBbY2VudGVyWCwgY2VudGVyWV0gPSBbdyAvIDIsIDBdOwogICAgICBicmVhazsKICAgIGNhc2UgInRvcFJpZ2h0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3csIDBdOwogICAgICBicmVhazsKICB9CiAgbGV0IHgsIHk7CiAgc3dpdGNoIChub2RlLnJvdGF0ZSB8fCAwKSB7CiAgICBjYXNlIDA6CiAgICAgIFt4LCB5XSA9IFstY2VudGVyWCwgLWNlbnRlclldOwogICAgICBicmVhazsKICAgIGNhc2UgOTA6CiAgICAgIFt4LCB5XSA9IFstY2VudGVyWSwgY2VudGVyWF07CiAgICAgIFt3LCBoXSA9IFtoLCAtd107CiAgICAgIGJyZWFrOwogICAgY2FzZSAxODA6CiAgICAgIFt4LCB5XSA9IFtjZW50ZXJYLCBjZW50ZXJZXTsKICAgICAgW3csIGhdID0gWy13LCAtaF07CiAgICAgIGJyZWFrOwogICAgY2FzZSAyNzA6CiAgICAgIFt4LCB5XSA9IFtjZW50ZXJZLCAtY2VudGVyWF07CiAgICAgIFt3LCBoXSA9IFstaCwgd107CiAgICAgIGJyZWFrOwogIH0KICByZXR1cm4gW25vZGUueCArIHggKyBNYXRoLm1pbigwLCB3KSwgbm9kZS55ICsgeSArIE1hdGgubWluKDAsIGgpLCBNYXRoLmFicyh3KSwgTWF0aC5hYnMoaCldOwp9CmZ1bmN0aW9uIGNoZWNrRGltZW5zaW9ucyhub2RlLCBzcGFjZSkgewogIGlmIChub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSA9PT0gbnVsbCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGlmIChub2RlLncgPT09IDAgfHwgbm9kZS5oID09PSAwKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgY29uc3QgRVJST1IgPSAyOwogIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgY29uc3QgYXR0ZW1wdCA9IHBhcmVudFskZXh0cmFdPy5hdHRlbXB0IHx8IDA7CiAgY29uc3QgWywgeSwgdywgaF0gPSBnZXRUcmFuc2Zvcm1lZEJCb3gobm9kZSk7CiAgc3dpdGNoIChwYXJlbnQubGF5b3V0KSB7CiAgICBjYXNlICJsci10YiI6CiAgICBjYXNlICJybC10YiI6CiAgICAgIGlmIChhdHRlbXB0ID09PSAwKSB7CiAgICAgICAgaWYgKCFub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICAgIGlmIChub2RlLmggIT09ICIiICYmIE1hdGgucm91bmQoaCAtIHNwYWNlLmhlaWdodCkgPiBFUlJPUikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobm9kZS53ICE9PSAiIikgewogICAgICAgICAgICBpZiAoTWF0aC5yb3VuZCh3IC0gc3BhY2Uud2lkdGgpIDw9IEVSUk9SKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmVudFskZXh0cmFdLm51bWJlckluTGluZSA9PT0gMCkgewogICAgICAgICAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3BhY2Uud2lkdGggPiBFUlJPUjsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUudyAhPT0gIiIpIHsKICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHcgLSBzcGFjZS53aWR0aCkgPD0gRVJST1I7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzcGFjZS53aWR0aCA+IEVSUk9SOwogICAgICB9CiAgICAgIGlmIChub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobm9kZS5oICE9PSAiIiAmJiBNYXRoLnJvdW5kKGggLSBzcGFjZS5oZWlnaHQpID4gRVJST1IpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKG5vZGUudyA9PT0gIiIgfHwgTWF0aC5yb3VuZCh3IC0gc3BhY2Uud2lkdGgpIDw9IEVSUk9SKSB7CiAgICAgICAgcmV0dXJuIHNwYWNlLmhlaWdodCA+IEVSUk9SOwogICAgICB9CiAgICAgIGlmIChwYXJlbnRbJGlzVGhlcmVNb3JlV2lkdGhdKCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHNwYWNlLmhlaWdodCA+IEVSUk9SOwogICAgY2FzZSAidGFibGUiOgogICAgY2FzZSAidGIiOgogICAgICBpZiAobm9kZVskZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKG5vZGUuaCAhPT0gIiIgJiYgIW5vZGVbJGlzU3BsaXR0YWJsZV0oKSkgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGggLSBzcGFjZS5oZWlnaHQpIDw9IEVSUk9SOwogICAgICB9CiAgICAgIGlmIChub2RlLncgPT09ICIiIHx8IE1hdGgucm91bmQodyAtIHNwYWNlLndpZHRoKSA8PSBFUlJPUikgewogICAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgICAgfQogICAgICBpZiAocGFyZW50WyRpc1RoZXJlTW9yZVdpZHRoXSgpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgIGNhc2UgInBvc2l0aW9uIjoKICAgICAgaWYgKG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChub2RlLmggPT09ICIiIHx8IE1hdGgucm91bmQoaCArIHkgLSBzcGFjZS5oZWlnaHQpIDw9IEVSUk9SKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgY29uc3QgYXJlYSA9IG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLmN1cnJlbnRDb250ZW50QXJlYTsKICAgICAgcmV0dXJuIGggKyB5ID4gYXJlYS5oOwogICAgY2FzZSAicmwtcm93IjoKICAgIGNhc2UgInJvdyI6CiAgICAgIGlmIChub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobm9kZS5oICE9PSAiIikgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGggLSBzcGFjZS5oZWlnaHQpIDw9IEVSUk9SOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHRydWU7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvdGVtcGxhdGUuanMKCgoKCgoKCgoKCmNvbnN0IFRFTVBMQVRFX05TX0lEID0gTmFtZXNwYWNlSWRzLnRlbXBsYXRlLmlkOwpjb25zdCBTVkdfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciOwpjb25zdCBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUID0gMjsKY29uc3QgTUFYX0VNUFRZX1BBR0VTID0gMzsKY29uc3QgREVGQVVMVF9UQUJfSU5ERVggPSA1MDAwOwpjb25zdCBIRUFESU5HX1BBVFRFUk4gPSAvXkgoXGQrKSQvOwpjb25zdCBNSU1FUyA9IG5ldyBTZXQoWyJpbWFnZS9naWYiLCAiaW1hZ2UvanBlZyIsICJpbWFnZS9qcGciLCAiaW1hZ2UvcGpwZWciLCAiaW1hZ2UvcG5nIiwgImltYWdlL2FwbmciLCAiaW1hZ2UveC1wbmciLCAiaW1hZ2UvYm1wIiwgImltYWdlL3gtbXMtYm1wIiwgImltYWdlL3RpZmYiLCAiaW1hZ2UvdGlmIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSJdKTsKY29uc3QgSU1BR0VTX0hFQURFUlMgPSBbW1sweDQyLCAweDRkXSwgImltYWdlL2JtcCJdLCBbWzB4ZmYsIDB4ZDgsIDB4ZmZdLCAiaW1hZ2UvanBlZyJdLCBbWzB4NDksIDB4NDksIDB4MmEsIDB4MDBdLCAiaW1hZ2UvdGlmZiJdLCBbWzB4NGQsIDB4NGQsIDB4MDAsIDB4MmFdLCAiaW1hZ2UvdGlmZiJdLCBbWzB4NDcsIDB4NDksIDB4NDYsIDB4MzgsIDB4MzksIDB4NjFdLCAiaW1hZ2UvZ2lmIl0sIFtbMHg4OSwgMHg1MCwgMHg0ZSwgMHg0NywgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYV0sICJpbWFnZS9wbmciXV07CmZ1bmN0aW9uIGdldEJvcmRlckRpbXMobm9kZSkgewogIGlmICghbm9kZSB8fCAhbm9kZS5ib3JkZXIpIHsKICAgIHJldHVybiB7CiAgICAgIHc6IDAsCiAgICAgIGg6IDAKICAgIH07CiAgfQogIGNvbnN0IGJvcmRlckV4dHJhID0gbm9kZS5ib3JkZXJbJGdldEV4dHJhXSgpOwogIGlmICghYm9yZGVyRXh0cmEpIHsKICAgIHJldHVybiB7CiAgICAgIHc6IDAsCiAgICAgIGg6IDAKICAgIH07CiAgfQogIHJldHVybiB7CiAgICB3OiBib3JkZXJFeHRyYS53aWR0aHNbMF0gKyBib3JkZXJFeHRyYS53aWR0aHNbMl0gKyBib3JkZXJFeHRyYS5pbnNldHNbMF0gKyBib3JkZXJFeHRyYS5pbnNldHNbMl0sCiAgICBoOiBib3JkZXJFeHRyYS53aWR0aHNbMV0gKyBib3JkZXJFeHRyYS53aWR0aHNbM10gKyBib3JkZXJFeHRyYS5pbnNldHNbMV0gKyBib3JkZXJFeHRyYS5pbnNldHNbM10KICB9Owp9CmZ1bmN0aW9uIGhhc01hcmdpbihub2RlKSB7CiAgcmV0dXJuIG5vZGUubWFyZ2luICYmIChub2RlLm1hcmdpbi50b3BJbnNldCB8fCBub2RlLm1hcmdpbi5yaWdodEluc2V0IHx8IG5vZGUubWFyZ2luLmJvdHRvbUluc2V0IHx8IG5vZGUubWFyZ2luLmxlZnRJbnNldCk7Cn0KZnVuY3Rpb24gX3NldFZhbHVlKHRlbXBsYXRlTm9kZSwgdmFsdWUpIHsKICBpZiAoIXRlbXBsYXRlTm9kZS52YWx1ZSkgewogICAgY29uc3Qgbm9kZVZhbHVlID0gbmV3IFZhbHVlKHt9KTsKICAgIHRlbXBsYXRlTm9kZVskYXBwZW5kQ2hpbGRdKG5vZGVWYWx1ZSk7CiAgICB0ZW1wbGF0ZU5vZGUudmFsdWUgPSBub2RlVmFsdWU7CiAgfQogIHRlbXBsYXRlTm9kZS52YWx1ZVskc2V0VmFsdWVdKHZhbHVlKTsKfQpmdW5jdGlvbiogZ2V0Q29udGFpbmVkQ2hpbGRyZW4obm9kZSkgewogIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZVskZ2V0Q2hpbGRyZW5dKCkpIHsKICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFN1YmZvcm1TZXQpIHsKICAgICAgeWllbGQqIGNoaWxkWyRnZXRDb250YWluZWRDaGlsZHJlbl0oKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICB5aWVsZCBjaGlsZDsKICB9Cn0KZnVuY3Rpb24gaXNSZXF1aXJlZChub2RlKSB7CiAgcmV0dXJuIG5vZGUudmFsaWRhdGU/Lm51bGxUZXN0ID09PSAiZXJyb3IiOwp9CmZ1bmN0aW9uIHNldFRhYkluZGV4KG5vZGUpIHsKICB3aGlsZSAobm9kZSkgewogICAgaWYgKCFub2RlLnRyYXZlcnNhbCkgewogICAgICBub2RlWyR0YWJJbmRleF0gPSBub2RlWyRnZXRQYXJlbnRdKClbJHRhYkluZGV4XTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG5vZGVbJHRhYkluZGV4XSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgbmV4dCA9IG51bGw7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUudHJhdmVyc2FsWyRnZXRDaGlsZHJlbl0oKSkgewogICAgICBpZiAoY2hpbGQub3BlcmF0aW9uID09PSAibmV4dCIpIHsKICAgICAgICBuZXh0ID0gY2hpbGQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghbmV4dCB8fCAhbmV4dC5yZWYpIHsKICAgICAgbm9kZVskdGFiSW5kZXhdID0gbm9kZVskZ2V0UGFyZW50XSgpWyR0YWJJbmRleF07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJvb3QgPSBub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgICBub2RlWyR0YWJJbmRleF0gPSArK3Jvb3RbJHRhYkluZGV4XTsKICAgIGNvbnN0IHJlZiA9IHJvb3RbJHNlYXJjaE5vZGVdKG5leHQucmVmLCBub2RlKTsKICAgIGlmICghcmVmKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG5vZGUgPSByZWZbMF07CiAgfQp9CmZ1bmN0aW9uIGFwcGx5QXNzaXN0KG9iaiwgYXR0cmlidXRlcykgewogIGNvbnN0IGFzc2lzdCA9IG9iai5hc3Npc3Q7CiAgaWYgKGFzc2lzdCkgewogICAgY29uc3QgYXNzaXN0VGl0bGUgPSBhc3Npc3RbJHRvSFRNTF0oKTsKICAgIGlmIChhc3Npc3RUaXRsZSkgewogICAgICBhdHRyaWJ1dGVzLnRpdGxlID0gYXNzaXN0VGl0bGU7CiAgICB9CiAgICBjb25zdCByb2xlID0gYXNzaXN0LnJvbGU7CiAgICBjb25zdCBtYXRjaCA9IHJvbGUubWF0Y2goSEVBRElOR19QQVRURVJOKTsKICAgIGlmIChtYXRjaCkgewogICAgICBjb25zdCBhcmlhUm9sZSA9ICJoZWFkaW5nIjsKICAgICAgY29uc3QgYXJpYUxldmVsID0gbWF0Y2hbMV07CiAgICAgIGF0dHJpYnV0ZXMucm9sZSA9IGFyaWFSb2xlOwogICAgICBhdHRyaWJ1dGVzWyJhcmlhLWxldmVsIl0gPSBhcmlhTGV2ZWw7CiAgICB9CiAgfQogIGlmIChvYmoubGF5b3V0ID09PSAidGFibGUiKSB7CiAgICBhdHRyaWJ1dGVzLnJvbGUgPSAidGFibGUiOwogIH0gZWxzZSBpZiAob2JqLmxheW91dCA9PT0gInJvdyIpIHsKICAgIGF0dHJpYnV0ZXMucm9sZSA9ICJyb3ciOwogIH0gZWxzZSB7CiAgICBjb25zdCBwYXJlbnQgPSBvYmpbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQubGF5b3V0ID09PSAicm93IikgewogICAgICBhdHRyaWJ1dGVzLnJvbGUgPSBwYXJlbnQuYXNzaXN0Py5yb2xlID09PSAiVEgiID8gImNvbHVtbmhlYWRlciIgOiAiY2VsbCI7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGFyaWFMYWJlbChvYmopIHsKICBpZiAoIW9iai5hc3Npc3QpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBhc3Npc3QgPSBvYmouYXNzaXN0OwogIGlmIChhc3Npc3Quc3BlYWsgJiYgYXNzaXN0LnNwZWFrWyRjb250ZW50XSAhPT0gIiIpIHsKICAgIHJldHVybiBhc3Npc3Quc3BlYWtbJGNvbnRlbnRdOwogIH0KICBpZiAoYXNzaXN0LnRvb2xUaXApIHsKICAgIHJldHVybiBhc3Npc3QudG9vbFRpcFskY29udGVudF07CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIHZhbHVlVG9IdG1sKHZhbHVlKSB7CiAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICBuYW1lOiAiZGl2IiwKICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgY2xhc3M6IFsieGZhUmljaCJdLAogICAgICBzdHlsZTogT2JqZWN0LmNyZWF0ZShudWxsKQogICAgfSwKICAgIGNoaWxkcmVuOiBbewogICAgICBuYW1lOiAic3BhbiIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBzdHlsZTogT2JqZWN0LmNyZWF0ZShudWxsKQogICAgICB9LAogICAgICB2YWx1ZQogICAgfV0KICB9KTsKfQpmdW5jdGlvbiBzZXRGaXJzdFVuc3BsaXR0YWJsZShub2RlKSB7CiAgY29uc3Qgcm9vdCA9IG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKTsKICBpZiAocm9vdFskZXh0cmFdLmZpcnN0VW5zcGxpdHRhYmxlID09PSBudWxsKSB7CiAgICByb290WyRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGUgPSBub2RlOwogICAgcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IHRydWU7CiAgfQp9CmZ1bmN0aW9uIHVuc2V0Rmlyc3RVbnNwbGl0dGFibGUobm9kZSkgewogIGNvbnN0IHJvb3QgPSBub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgaWYgKHJvb3RbJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSA9PT0gbm9kZSkgewogICAgcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IGZhbHNlOwogIH0KfQpmdW5jdGlvbiBoYW5kbGVCcmVhayhub2RlKSB7CiAgaWYgKG5vZGVbJGV4dHJhXSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBub2RlWyRleHRyYV0gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGlmIChub2RlLnRhcmdldFR5cGUgPT09ICJhdXRvIikgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCByb290ID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpOwogIGxldCB0YXJnZXQgPSBudWxsOwogIGlmIChub2RlLnRhcmdldCkgewogICAgdGFyZ2V0ID0gcm9vdFskc2VhcmNoTm9kZV0obm9kZS50YXJnZXQsIG5vZGVbJGdldFBhcmVudF0oKSk7CiAgICBpZiAoIXRhcmdldCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0YXJnZXQgPSB0YXJnZXRbMF07CiAgfQogIGNvbnN0IHsKICAgIGN1cnJlbnRQYWdlQXJlYSwKICAgIGN1cnJlbnRDb250ZW50QXJlYQogIH0gPSByb290WyRleHRyYV07CiAgaWYgKG5vZGUudGFyZ2V0VHlwZSA9PT0gInBhZ2VBcmVhIikgewogICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgUGFnZUFyZWEpKSB7CiAgICAgIHRhcmdldCA9IG51bGw7CiAgICB9CiAgICBpZiAobm9kZS5zdGFydE5ldykgewogICAgICBub2RlWyRleHRyYV0udGFyZ2V0ID0gdGFyZ2V0IHx8IGN1cnJlbnRQYWdlQXJlYTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGN1cnJlbnRQYWdlQXJlYSkgewogICAgICBub2RlWyRleHRyYV0udGFyZ2V0ID0gdGFyZ2V0OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgQ29udGVudEFyZWEpKSB7CiAgICB0YXJnZXQgPSBudWxsOwogIH0KICBjb25zdCBwYWdlQXJlYSA9IHRhcmdldCAmJiB0YXJnZXRbJGdldFBhcmVudF0oKTsKICBsZXQgaW5kZXg7CiAgbGV0IG5leHRQYWdlQXJlYSA9IHBhZ2VBcmVhOwogIGlmIChub2RlLnN0YXJ0TmV3KSB7CiAgICBpZiAodGFyZ2V0KSB7CiAgICAgIGNvbnN0IGNvbnRlbnRBcmVhcyA9IHBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuOwogICAgICBjb25zdCBpbmRleEZvckN1cnJlbnQgPSBjb250ZW50QXJlYXMuaW5kZXhPZihjdXJyZW50Q29udGVudEFyZWEpOwogICAgICBjb25zdCBpbmRleEZvclRhcmdldCA9IGNvbnRlbnRBcmVhcy5pbmRleE9mKHRhcmdldCk7CiAgICAgIGlmIChpbmRleEZvckN1cnJlbnQgIT09IC0xICYmIGluZGV4Rm9yQ3VycmVudCA8IGluZGV4Rm9yVGFyZ2V0KSB7CiAgICAgICAgbmV4dFBhZ2VBcmVhID0gbnVsbDsKICAgICAgfQogICAgICBpbmRleCA9IGluZGV4Rm9yVGFyZ2V0IC0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGluZGV4ID0gY3VycmVudFBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YoY3VycmVudENvbnRlbnRBcmVhKTsKICAgIH0KICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGN1cnJlbnRDb250ZW50QXJlYSkgewogICAgY29uc3QgY29udGVudEFyZWFzID0gcGFnZUFyZWEuY29udGVudEFyZWEuY2hpbGRyZW47CiAgICBpbmRleCA9IGNvbnRlbnRBcmVhcy5pbmRleE9mKHRhcmdldCkgLSAxOwogICAgbmV4dFBhZ2VBcmVhID0gcGFnZUFyZWEgPT09IGN1cnJlbnRQYWdlQXJlYSA/IG51bGwgOiBwYWdlQXJlYTsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBub2RlWyRleHRyYV0udGFyZ2V0ID0gbmV4dFBhZ2VBcmVhOwogIG5vZGVbJGV4dHJhXS5pbmRleCA9IGluZGV4OwogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIGhhbmRsZU92ZXJmbG93KG5vZGUsIGV4dHJhTm9kZSwgc3BhY2UpIHsKICBjb25zdCByb290ID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpOwogIGNvbnN0IHNhdmVkID0gcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZTsKICBjb25zdCBzYXZlZE1ldGhvZCA9IGV4dHJhTm9kZVskZ2V0U3ViZm9ybVBhcmVudF07CiAgZXh0cmFOb2RlWyRnZXRTdWJmb3JtUGFyZW50XSA9ICgpID0+IG5vZGU7CiAgcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IHRydWU7CiAgY29uc3QgcmVzID0gZXh0cmFOb2RlWyR0b0hUTUxdKHNwYWNlKTsKICBub2RlWyRhZGRIVE1MXShyZXMuaHRtbCwgcmVzLmJib3gpOwogIHJvb3RbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSBzYXZlZDsKICBleHRyYU5vZGVbJGdldFN1YmZvcm1QYXJlbnRdID0gc2F2ZWRNZXRob2Q7Cn0KY2xhc3MgQXBwZWFyYW5jZUZpbHRlciBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJhcHBlYXJhbmNlRmlsdGVyIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBBcmMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYXJjIiwgdHJ1ZSk7CiAgICB0aGlzLmNpcmN1bGFyID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY2lyY3VsYXIsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmhhbmQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oYW5kLCBbImV2ZW4iLCAibGVmdCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5zdGFydEFuZ2xlID0gZ2V0RmxvYXQoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnN0YXJ0QW5nbGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLnN3ZWVwQW5nbGUgPSBnZXRGbG9hdCh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc3dlZXBBbmdsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAzNjAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZWRnZSA9IG51bGw7CiAgICB0aGlzLmZpbGwgPSBudWxsOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBjb25zdCBlZGdlID0gdGhpcy5lZGdlIHx8IG5ldyBFZGdlKHt9KTsKICAgIGNvbnN0IGVkZ2VTdHlsZSA9IGVkZ2VbJHRvU3R5bGVdKCk7CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBpZiAodGhpcy5maWxsPy5wcmVzZW5jZSA9PT0gInZpc2libGUiKSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHRoaXMuZmlsbFskdG9TdHlsZV0oKSk7CiAgICB9IGVsc2UgewogICAgICBzdHlsZS5maWxsID0gInRyYW5zcGFyZW50IjsKICAgIH0KICAgIHN0eWxlLnN0cm9rZVdpZHRoID0gbWVhc3VyZVRvU3RyaW5nKGVkZ2UucHJlc2VuY2UgPT09ICJ2aXNpYmxlIiA/IGVkZ2UudGhpY2tuZXNzIDogMCk7CiAgICBzdHlsZS5zdHJva2UgPSBlZGdlU3R5bGUuY29sb3I7CiAgICBsZXQgYXJjOwogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgeG1sbnM6IFNWR19OUywKICAgICAgc3R5bGU6IHsKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjEwMCUiLAogICAgICAgIG92ZXJmbG93OiAidmlzaWJsZSIKICAgICAgfQogICAgfTsKICAgIGlmICh0aGlzLnN3ZWVwQW5nbGUgPT09IDM2MCkgewogICAgICBhcmMgPSB7CiAgICAgICAgbmFtZTogImVsbGlwc2UiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgICAgICBjeDogIjUwJSIsCiAgICAgICAgICBjeTogIjUwJSIsCiAgICAgICAgICByeDogIjUwJSIsCiAgICAgICAgICByeTogIjUwJSIsCiAgICAgICAgICBzdHlsZQogICAgICAgIH0KICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0YXJ0QW5nbGUgPSB0aGlzLnN0YXJ0QW5nbGUgKiBNYXRoLlBJIC8gMTgwOwogICAgICBjb25zdCBzd2VlcEFuZ2xlID0gdGhpcy5zd2VlcEFuZ2xlICogTWF0aC5QSSAvIDE4MDsKICAgICAgY29uc3QgbGFyZ2VBcmMgPSB0aGlzLnN3ZWVwQW5nbGUgPiAxODAgPyAxIDogMDsKICAgICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IFs1MCAqICgxICsgTWF0aC5jb3Moc3RhcnRBbmdsZSkpLCA1MCAqICgxIC0gTWF0aC5zaW4oc3RhcnRBbmdsZSkpLCA1MCAqICgxICsgTWF0aC5jb3Moc3RhcnRBbmdsZSArIHN3ZWVwQW5nbGUpKSwgNTAgKiAoMSAtIE1hdGguc2luKHN0YXJ0QW5nbGUgKyBzd2VlcEFuZ2xlKSldOwogICAgICBhcmMgPSB7CiAgICAgICAgbmFtZTogInBhdGgiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgICAgICBkOiBgTSAke3gxfSAke3kxfSBBIDUwIDUwIDAgJHtsYXJnZUFyY30gMCAke3gyfSAke3kyfWAsCiAgICAgICAgICB2ZWN0b3JFZmZlY3Q6ICJub24tc2NhbGluZy1zdHJva2UiLAogICAgICAgICAgc3R5bGUKICAgICAgICB9CiAgICAgIH07CiAgICAgIE9iamVjdC5hc3NpZ24oYXR0cmlidXRlcywgewogICAgICAgIHZpZXdCb3g6ICIwIDAgMTAwIDEwMCIsCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbzogIm5vbmUiCiAgICAgIH0pOwogICAgfQogICAgY29uc3Qgc3ZnID0gewogICAgICBuYW1lOiAic3ZnIiwKICAgICAgY2hpbGRyZW46IFthcmNdLAogICAgICBhdHRyaWJ1dGVzCiAgICB9OwogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBpZiAoaGFzTWFyZ2luKHBhcmVudCkpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogImRpdiIsCiAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgc3R5bGU6IHsKICAgICAgICAgICAgZGlzcGxheTogImlubGluZSIsCiAgICAgICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgICAgIGhlaWdodDogIjEwMCUiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjaGlsZHJlbjogW3N2Z10KICAgICAgfSk7CiAgICB9CiAgICBzdmcuYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHN2Zyk7CiAgfQp9CmNsYXNzIEFyZWEgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYXJlYSIsIHRydWUpOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmFyZWEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZHJhdyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leE9iamVjdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leGNsR3JvdXAgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmllbGQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtU2V0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogICpbJGdldENvbnRhaW5lZENoaWxkcmVuXSgpIHsKICAgIHlpZWxkKiBnZXRDb250YWluZWRDaGlsZHJlbih0aGlzKTsKICB9CiAgWyRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgY29uc3QgW3gsIHksIHcsIGhdID0gYmJveDsKICAgIHRoaXNbJGV4dHJhXS53aWR0aCA9IE1hdGgubWF4KHRoaXNbJGV4dHJhXS53aWR0aCwgeCArIHcpOwogICAgdGhpc1skZXh0cmFdLmhlaWdodCA9IE1hdGgubWF4KHRoaXNbJGV4dHJhXS5oZWlnaHQsIHkgKyBoKTsKICAgIHRoaXNbJGV4dHJhXS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogIH0KICBbJGdldEF2YWlsYWJsZVNwYWNlXSgpIHsKICAgIHJldHVybiB0aGlzWyRleHRyYV0uYXZhaWxhYmxlU3BhY2U7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJwb3NpdGlvbiIpOwogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgc3R5bGUsCiAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICBjbGFzczogWyJ4ZmFBcmVhIl0KICAgIH07CiAgICBpZiAoaXNQcmludE9ubHkodGhpcykpIHsKICAgICAgYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFQcmludE9ubHkiKTsKICAgIH0KICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgY2hpbGRyZW4sCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIGF2YWlsYWJsZVNwYWNlCiAgICB9OwogICAgY29uc3QgcmVzdWx0ID0gdGhpc1skY2hpbGRyZW5Ub0hUTUxdKHsKICAgICAgZmlsdGVyOiBuZXcgU2V0KFsiYXJlYSIsICJkcmF3IiwgImZpZWxkIiwgImV4Y2xHcm91cCIsICJzdWJmb3JtIiwgInN1YmZvcm1TZXQiXSksCiAgICAgIGluY2x1ZGU6IHRydWUKICAgIH0pOwogICAgaWYgKCFyZXN1bHQuc3VjY2VzcykgewogICAgICBpZiAocmVzdWx0LmlzQnJlYWsoKSkgewogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgIH0KICAgIHN0eWxlLndpZHRoID0gbWVhc3VyZVRvU3RyaW5nKHRoaXNbJGV4dHJhXS53aWR0aCk7CiAgICBzdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcodGhpc1skZXh0cmFdLmhlaWdodCk7CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlcywKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICBjb25zdCBiYm94ID0gW3RoaXMueCwgdGhpcy55LCB0aGlzWyRleHRyYV0ud2lkdGgsIHRoaXNbJGV4dHJhXS5oZWlnaHRdOwogICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoaHRtbCwgYmJveCk7CiAgfQp9CmNsYXNzIEFzc2lzdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJhc3Npc3QiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5yb2xlID0gYXR0cmlidXRlcy5yb2xlIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuc3BlYWsgPSBudWxsOwogICAgdGhpcy50b29sVGlwID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKCkgewogICAgcmV0dXJuIHRoaXMudG9vbFRpcD8uWyRjb250ZW50XSB8fCBudWxsOwogIH0KfQpjbGFzcyBCYXJjb2RlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJhcmNvZGUiLCB0cnVlKTsKICAgIHRoaXMuY2hhckVuY29kaW5nID0gZ2V0S2V5d29yZCh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY2hhckVuY29kaW5nID8gYXR0cmlidXRlcy5jaGFyRW5jb2RpbmcudG9Mb3dlckNhc2UoKSA6ICIiLAogICAgICBkZWZhdWx0VmFsdWU6ICIiLAogICAgICB2YWxpZGF0ZTogayA9PiBbInV0Zi04IiwgImJpZy1maXZlIiwgImZvbnRzcGVjaWZpYyIsICJnYmsiLCAiZ2ItMTgwMzAiLCAiZ2ItMjMxMiIsICJrc2MtNTYwMSIsICJub25lIiwgInNoaWZ0LWppcyIsICJ1Y3MtMiIsICJ1dGYtMTYiXS5pbmNsdWRlcyhrKSB8fCBrLm1hdGNoKC9pc28tODg1OS1cZHsyfS8pCiAgICB9KTsKICAgIHRoaXMuY2hlY2tzdW0gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5jaGVja3N1bSwgWyJub25lIiwgIjFtb2QxMCIsICIxbW9kMTBfMW1vZDExIiwgIjJtb2QxMCIsICJhdXRvIl0pOwogICAgdGhpcy5kYXRhQ29sdW1uQ291bnQgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5kYXRhQ29sdW1uQ291bnQsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmRhdGFMZW5ndGggPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5kYXRhTGVuZ3RoLAogICAgICBkZWZhdWx0VmFsdWU6IC0xLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5kYXRhUHJlcCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmRhdGFQcmVwLCBbIm5vbmUiLCAiZmxhdGVDb21wcmVzcyJdKTsKICAgIHRoaXMuZGF0YVJvd0NvdW50ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZGF0YVJvd0NvdW50LAogICAgICBkZWZhdWx0VmFsdWU6IC0xLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5lbmRDaGFyID0gYXR0cmlidXRlcy5lbmRDaGFyIHx8ICIiOwogICAgdGhpcy5lcnJvckNvcnJlY3Rpb25MZXZlbCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmVycm9yQ29ycmVjdGlvbkxldmVsLAogICAgICBkZWZhdWx0VmFsdWU6IC0xLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAgJiYgeCA8PSA4CiAgICB9KTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5tb2R1bGVIZWlnaHQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1vZHVsZUhlaWdodCwgIjVtbSIpOwogICAgdGhpcy5tb2R1bGVXaWR0aCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubW9kdWxlV2lkdGgsICIwLjI1bW0iKTsKICAgIHRoaXMucHJpbnRDaGVja0RpZ2l0ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucHJpbnRDaGVja0RpZ2l0LAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5yb3dDb2x1bW5SYXRpbyA9IGdldFJhdGlvKGF0dHJpYnV0ZXMucm93Q29sdW1uUmF0aW8pOwogICAgdGhpcy5zdGFydENoYXIgPSBhdHRyaWJ1dGVzLnN0YXJ0Q2hhciB8fCAiIjsKICAgIHRoaXMudGV4dExvY2F0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudGV4dExvY2F0aW9uLCBbImJlbG93IiwgImFib3ZlIiwgImFib3ZlRW1iZWRkZWQiLCAiYmVsb3dFbWJlZGRlZCIsICJub25lIl0pOwogICAgdGhpcy50cnVuY2F0ZSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnRydW5jYXRlLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSA/IGF0dHJpYnV0ZXMudHlwZS50b0xvd2VyQ2FzZSgpIDogIiIsIFsiYXp0ZWMiLCAiY29kYWJhciIsICJjb2RlMm9mNWluZHVzdHJpYWwiLCAiY29kZTJvZjVpbnRlcmxlYXZlZCIsICJjb2RlMm9mNW1hdHJpeCIsICJjb2RlMm9mNXN0YW5kYXJkIiwgImNvZGUzb2Y5IiwgImNvZGUzb2Y5ZXh0ZW5kZWQiLCAiY29kZTExIiwgImNvZGU0OSIsICJjb2RlOTMiLCAiY29kZTEyOCIsICJjb2RlMTI4YSIsICJjb2RlMTI4YiIsICJjb2RlMTI4YyIsICJjb2RlMTI4c3NjYyIsICJkYXRhbWF0cml4IiwgImVhbjgiLCAiZWFuOGFkZDIiLCAiZWFuOGFkZDUiLCAiZWFuMTMiLCAiZWFuMTNhZGQyIiwgImVhbjEzYWRkNSIsICJlYW4xM3B3Y2QiLCAiZmltIiwgImxvZ21hcnMiLCAibWF4aWNvZGUiLCAibXNpIiwgInBkZjQxNyIsICJwZGY0MTdtYWNybyIsICJwbGVzc2V5IiwgInBvc3RhdXNjdXN0MiIsICJwb3N0YXVzY3VzdDMiLCAicG9zdGF1c3JlcGx5cGFpZCIsICJwb3N0YXVzc3RhbmRhcmQiLCAicG9zdHVrcm00c2NjIiwgInBvc3R1c2RwYmMiLCAicG9zdHVzaW1iIiwgInBvc3R1c3N0YW5kYXJkIiwgInBvc3R1czV6aXAiLCAicXJjb2RlIiwgInJmaWQiLCAicnNzMTQiLCAicnNzMTRleHBhbmRlZCIsICJyc3MxNGxpbWl0ZWQiLCAicnNzMTRzdGFja2VkIiwgInJzczE0c3RhY2tlZG9tbmkiLCAicnNzMTR0cnVuY2F0ZWQiLCAidGVsZXBlbiIsICJ1Y2MxMjgiLCAidWNjMTI4cmFuZG9tIiwgInVjYzEyOHNzY2MiLCAidXBjYSIsICJ1cGNhYWRkMiIsICJ1cGNhYWRkNSIsICJ1cGNhcHdjZCIsICJ1cGNlIiwgInVwY2VhZGQyIiwgInVwY2VhZGQ1IiwgInVwY2VhbjIiLCAidXBjZWFuNSIsICJ1cHNtYXhpY29kZSJdKTsKICAgIHRoaXMudXBzTW9kZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnVwc01vZGUsIFsidXNDYXJyaWVyIiwgImludGVybmF0aW9uYWxDYXJyaWVyIiwgInNlY3VyZVN5bWJvbCIsICJzdGFuZGFyZFN5bWJvbCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLndpZGVOYXJyb3dSYXRpbyA9IGdldFJhdGlvKGF0dHJpYnV0ZXMud2lkZU5hcnJvd1JhdGlvKTsKICAgIHRoaXMuZW5jcnlwdCA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQp9CmNsYXNzIEJpbmQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYmluZCIsIHRydWUpOwogICAgdGhpcy5tYXRjaCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm1hdGNoLCBbIm9uY2UiLCAiZGF0YVJlZiIsICJnbG9iYWwiLCAibm9uZSJdKTsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnBpY3R1cmUgPSBudWxsOwogIH0KfQpjbGFzcyBCaW5kSXRlbXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYmluZEl0ZW1zIik7CiAgICB0aGlzLmNvbm5lY3Rpb24gPSBhdHRyaWJ1dGVzLmNvbm5lY3Rpb24gfHwgIiI7CiAgICB0aGlzLmxhYmVsUmVmID0gYXR0cmlidXRlcy5sYWJlbFJlZiB8fCAiIjsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnZhbHVlUmVmID0gYXR0cmlidXRlcy52YWx1ZVJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgQm9va2VuZCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJib29rZW5kIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZGVyID0gYXR0cmlidXRlcy5sZWFkZXIgfHwgIiI7CiAgICB0aGlzLnRyYWlsZXIgPSBhdHRyaWJ1dGVzLnRyYWlsZXIgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBCb29sZWFuRWxlbWVudCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJvb2xlYW4iKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gdmFsdWVUb0h0bWwodGhpc1skY29udGVudF0gPT09IDEgPyAiMSIgOiAiMCIpOwogIH0KfQpjbGFzcyBCb3JkZXIgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYm9yZGVyIiwgdHJ1ZSk7CiAgICB0aGlzLmJyZWFrID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYnJlYWssIFsiY2xvc2UiLCAib3BlbiJdKTsKICAgIHRoaXMuaGFuZCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhhbmQsIFsiZXZlbiIsICJsZWZ0IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29ybmVyID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5lZGdlID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5maWxsID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9CiAgWyRnZXRFeHRyYV0oKSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICBjb25zdCBlZGdlcyA9IHRoaXMuZWRnZS5jaGlsZHJlbi5zbGljZSgpOwogICAgICBpZiAoZWRnZXMubGVuZ3RoIDwgNCkgewogICAgICAgIGNvbnN0IGRlZmF1bHRFZGdlID0gZWRnZXMuYXQoLTEpIHx8IG5ldyBFZGdlKHt9KTsKICAgICAgICBmb3IgKGxldCBpID0gZWRnZXMubGVuZ3RoOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICBlZGdlcy5wdXNoKGRlZmF1bHRFZGdlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgd2lkdGhzID0gZWRnZXMubWFwKGVkZ2UgPT4gZWRnZS50aGlja25lc3MpOwogICAgICBjb25zdCBpbnNldHMgPSBbMCwgMCwgMCwgMF07CiAgICAgIGlmICh0aGlzLm1hcmdpbikgewogICAgICAgIGluc2V0c1swXSA9IHRoaXMubWFyZ2luLnRvcEluc2V0OwogICAgICAgIGluc2V0c1sxXSA9IHRoaXMubWFyZ2luLnJpZ2h0SW5zZXQ7CiAgICAgICAgaW5zZXRzWzJdID0gdGhpcy5tYXJnaW4uYm90dG9tSW5zZXQ7CiAgICAgICAgaW5zZXRzWzNdID0gdGhpcy5tYXJnaW4ubGVmdEluc2V0OwogICAgICB9CiAgICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgICB3aWR0aHMsCiAgICAgICAgaW5zZXRzLAogICAgICAgIGVkZ2VzCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gdGhpc1skZXh0cmFdOwogIH0KICBbJHRvU3R5bGVdKCkgewogICAgY29uc3QgewogICAgICBlZGdlcwogICAgfSA9IHRoaXNbJGdldEV4dHJhXSgpOwogICAgY29uc3QgZWRnZVN0eWxlcyA9IGVkZ2VzLm1hcChub2RlID0+IHsKICAgICAgY29uc3Qgc3R5bGUgPSBub2RlWyR0b1N0eWxlXSgpOwogICAgICBzdHlsZS5jb2xvciB8fD0gIiMwMDAwMDAiOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9KTsKICAgIGNvbnN0IHN0eWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmICh0aGlzLm1hcmdpbikgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB0aGlzLm1hcmdpblskdG9TdHlsZV0oKSk7CiAgICB9CiAgICBpZiAodGhpcy5maWxsPy5wcmVzZW5jZSA9PT0gInZpc2libGUiKSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHRoaXMuZmlsbFskdG9TdHlsZV0oKSk7CiAgICB9CiAgICBpZiAodGhpcy5jb3JuZXIuY2hpbGRyZW4uc29tZShub2RlID0+IG5vZGUucmFkaXVzICE9PSAwKSkgewogICAgICBjb25zdCBjb3JuZXJTdHlsZXMgPSB0aGlzLmNvcm5lci5jaGlsZHJlbi5tYXAobm9kZSA9PiBub2RlWyR0b1N0eWxlXSgpKTsKICAgICAgaWYgKGNvcm5lclN0eWxlcy5sZW5ndGggPT09IDIgfHwgY29ybmVyU3R5bGVzLmxlbmd0aCA9PT0gMykgewogICAgICAgIGNvbnN0IGxhc3QgPSBjb3JuZXJTdHlsZXMuYXQoLTEpOwogICAgICAgIGZvciAobGV0IGkgPSBjb3JuZXJTdHlsZXMubGVuZ3RoOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICBjb3JuZXJTdHlsZXMucHVzaChsYXN0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3R5bGUuYm9yZGVyUmFkaXVzID0gY29ybmVyU3R5bGVzLm1hcChzID0+IHMucmFkaXVzKS5qb2luKCIgIik7CiAgICB9CiAgICBzd2l0Y2ggKHRoaXMucHJlc2VuY2UpIHsKICAgICAgY2FzZSAiaW52aXNpYmxlIjoKICAgICAgY2FzZSAiaGlkZGVuIjoKICAgICAgICBzdHlsZS5ib3JkZXJTdHlsZSA9ICIiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJpbmFjdGl2ZSI6CiAgICAgICAgc3R5bGUuYm9yZGVyU3R5bGUgPSAibm9uZSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgc3R5bGUuYm9yZGVyU3R5bGUgPSBlZGdlU3R5bGVzLm1hcChzID0+IHMuc3R5bGUpLmpvaW4oIiAiKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHN0eWxlLmJvcmRlcldpZHRoID0gZWRnZVN0eWxlcy5tYXAocyA9PiBzLndpZHRoKS5qb2luKCIgIik7CiAgICBzdHlsZS5ib3JkZXJDb2xvciA9IGVkZ2VTdHlsZXMubWFwKHMgPT4gcy5jb2xvcikuam9pbigiICIpOwogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBCcmVhayBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJicmVhayIsIHRydWUpOwogICAgdGhpcy5hZnRlciA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFmdGVyLCBbImF1dG8iLCAiY29udGVudEFyZWEiLCAicGFnZUFyZWEiLCAicGFnZUV2ZW4iLCAicGFnZU9kZCJdKTsKICAgIHRoaXMuYWZ0ZXJUYXJnZXQgPSBhdHRyaWJ1dGVzLmFmdGVyVGFyZ2V0IHx8ICIiOwogICAgdGhpcy5iZWZvcmUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5iZWZvcmUsIFsiYXV0byIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSIsICJwYWdlRXZlbiIsICJwYWdlT2RkIl0pOwogICAgdGhpcy5iZWZvcmVUYXJnZXQgPSBhdHRyaWJ1dGVzLmJlZm9yZVRhcmdldCB8fCAiIjsKICAgIHRoaXMuYm9va2VuZExlYWRlciA9IGF0dHJpYnV0ZXMuYm9va2VuZExlYWRlciB8fCAiIjsKICAgIHRoaXMuYm9va2VuZFRyYWlsZXIgPSBhdHRyaWJ1dGVzLmJvb2tlbmRUcmFpbGVyIHx8ICIiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm92ZXJmbG93TGVhZGVyID0gYXR0cmlidXRlcy5vdmVyZmxvd0xlYWRlciB8fCAiIjsKICAgIHRoaXMub3ZlcmZsb3dUYXJnZXQgPSBhdHRyaWJ1dGVzLm92ZXJmbG93VGFyZ2V0IHx8ICIiOwogICAgdGhpcy5vdmVyZmxvd1RyYWlsZXIgPSBhdHRyaWJ1dGVzLm92ZXJmbG93VHJhaWxlciB8fCAiIjsKICAgIHRoaXMuc3RhcnROZXcgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5zdGFydE5ldywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQp9CmNsYXNzIEJyZWFrQWZ0ZXIgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYnJlYWtBZnRlciIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxlYWRlciA9IGF0dHJpYnV0ZXMubGVhZGVyIHx8ICIiOwogICAgdGhpcy5zdGFydE5ldyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnN0YXJ0TmV3LAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy50YXJnZXQgPSBhdHRyaWJ1dGVzLnRhcmdldCB8fCAiIjsKICAgIHRoaXMudGFyZ2V0VHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnRhcmdldFR5cGUsIFsiYXV0byIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSJdKTsKICAgIHRoaXMudHJhaWxlciA9IGF0dHJpYnV0ZXMudHJhaWxlciB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnNjcmlwdCA9IG51bGw7CiAgfQp9CmNsYXNzIEJyZWFrQmVmb3JlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJyZWFrQmVmb3JlIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZGVyID0gYXR0cmlidXRlcy5sZWFkZXIgfHwgIiI7CiAgICB0aGlzLnN0YXJ0TmV3ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc3RhcnROZXcsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnRhcmdldCA9IGF0dHJpYnV0ZXMudGFyZ2V0IHx8ICIiOwogICAgdGhpcy50YXJnZXRUeXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudGFyZ2V0VHlwZSwgWyJhdXRvIiwgImNvbnRlbnRBcmVhIiwgInBhZ2VBcmVhIl0pOwogICAgdGhpcy50cmFpbGVyID0gYXR0cmlidXRlcy50cmFpbGVyIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuc2NyaXB0ID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICB0aGlzWyRleHRyYV0gPSB7fTsKICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgfQp9CmNsYXNzIEJ1dHRvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJidXR0b24iLCB0cnVlKTsKICAgIHRoaXMuaGlnaGxpZ2h0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaGlnaGxpZ2h0LCBbImludmVydGVkIiwgIm5vbmUiLCAib3V0bGluZSIsICJwdXNoIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdyYW5kcGEgPSBwYXJlbnRbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGh0bWxCdXR0b24gPSB7CiAgICAgIG5hbWU6ICJidXR0b24iLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgaWQ6IHRoaXNbJHVpZF0sCiAgICAgICAgY2xhc3M6IFsieGZhQnV0dG9uIl0sCiAgICAgICAgc3R5bGU6IHt9CiAgICAgIH0sCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZ3JhbmRwYS5ldmVudC5jaGlsZHJlbikgewogICAgICBpZiAoZXZlbnQuYWN0aXZpdHkgIT09ICJjbGljayIgfHwgIWV2ZW50LnNjcmlwdCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGpzVVJMID0gcmVjb3ZlckpzVVJMKGV2ZW50LnNjcmlwdFskY29udGVudF0pOwogICAgICBpZiAoIWpzVVJMKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaHJlZiA9IGZpeFVSTChqc1VSTC51cmwpOwogICAgICBpZiAoIWhyZWYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBodG1sQnV0dG9uLmNoaWxkcmVuLnB1c2goewogICAgICAgIG5hbWU6ICJhIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBpZDogImxpbmsiICsgdGhpc1skdWlkXSwKICAgICAgICAgIGhyZWYsCiAgICAgICAgICBuZXdXaW5kb3c6IGpzVVJMLm5ld1dpbmRvdywKICAgICAgICAgIGNsYXNzOiBbInhmYUxpbmsiXSwKICAgICAgICAgIHN0eWxlOiB7fQogICAgICAgIH0sCiAgICAgICAgY2hpbGRyZW46IFtdCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhodG1sQnV0dG9uKTsKICB9Cn0KY2xhc3MgQ2FsY3VsYXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNhbGN1bGF0ZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm92ZXJyaWRlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMub3ZlcnJpZGUsIFsiZGlzYWJsZWQiLCAiZXJyb3IiLCAiaWdub3JlIiwgIndhcm5pbmciXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tZXNzYWdlID0gbnVsbDsKICAgIHRoaXMuc2NyaXB0ID0gbnVsbDsKICB9Cn0KY2xhc3MgQ2FwdGlvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjYXB0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucGxhY2VtZW50ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucGxhY2VtZW50LCBbImxlZnQiLCAiYm90dG9tIiwgImlubGluZSIsICJyaWdodCIsICJ0b3AiXSk7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZXNlcnZlID0gTWF0aC5jZWlsKGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMucmVzZXJ2ZSkpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgICB0aGlzLnBhcmEgPSBudWxsOwogICAgdGhpcy52YWx1ZSA9IG51bGw7CiAgfQogIFskc2V0VmFsdWVdKHZhbHVlKSB7CiAgICBfc2V0VmFsdWUodGhpcywgdmFsdWUpOwogIH0KICBbJGdldEV4dHJhXShhdmFpbGFibGVTcGFjZSkgewogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgbGV0IHsKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQKICAgICAgfSA9IGF2YWlsYWJsZVNwYWNlOwogICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7CiAgICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgIGNhc2UgImlubGluZSI6CiAgICAgICAgICB3aWR0aCA9IHRoaXMucmVzZXJ2ZSA8PSAwID8gd2lkdGggOiB0aGlzLnJlc2VydmU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICBoZWlnaHQgPSB0aGlzLnJlc2VydmUgPD0gMCA/IGhlaWdodCA6IHRoaXMucmVzZXJ2ZTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRoaXNbJGV4dHJhXSA9IGxheW91dE5vZGUodGhpcywgewogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodAogICAgICB9KTsKICAgIH0KICAgIHJldHVybiB0aGlzWyRleHRyYV07CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgaWYgKCF0aGlzLnZhbHVlKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgdGhpc1skcHVzaFBhcmFdKCk7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWVbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpLmh0bWw7CiAgICBpZiAoIXZhbHVlKSB7CiAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgY29uc3Qgc2F2ZWRSZXNlcnZlID0gdGhpcy5yZXNlcnZlOwogICAgaWYgKHRoaXMucmVzZXJ2ZSA8PSAwKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICB3LAogICAgICAgIGgKICAgICAgfSA9IHRoaXNbJGdldEV4dHJhXShhdmFpbGFibGVTcGFjZSk7CiAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHsKICAgICAgICBjYXNlICJsZWZ0IjoKICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICAgIHRoaXMucmVzZXJ2ZSA9IHc7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICB0aGlzLnJlc2VydmUgPSBoOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICBuYW1lOiAiI3RleHQiLAogICAgICAgIHZhbHVlCiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgY2hpbGRyZW4ucHVzaCh2YWx1ZSk7CiAgICB9CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImZvbnQiLCAibWFyZ2luIiwgInZpc2liaWxpdHkiKTsKICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHsKICAgICAgY2FzZSAibGVmdCI6CiAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICBpZiAodGhpcy5yZXNlcnZlID4gMCkgewogICAgICAgICAgc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5yZXNlcnZlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInRvcCI6CiAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgaWYgKHRoaXMucmVzZXJ2ZSA+IDApIHsKICAgICAgICAgIHN0eWxlLmhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLnJlc2VydmUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICAgIHNldFBhcmEodGhpcywgbnVsbCwgdmFsdWUpOwogICAgdGhpc1skcG9wUGFyYV0oKTsKICAgIHRoaXMucmVzZXJ2ZSA9IHNhdmVkUmVzZXJ2ZTsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHN0eWxlLAogICAgICAgIGNsYXNzOiBbInhmYUNhcHRpb24iXQogICAgICB9LAogICAgICBjaGlsZHJlbgogICAgfSk7CiAgfQp9CmNsYXNzIENlcnRpZmljYXRlIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNlcnRpZmljYXRlIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIENlcnRpZmljYXRlcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjZXJ0aWZpY2F0ZXMiLCB0cnVlKTsKICAgIHRoaXMuY3JlZGVudGlhbFNlcnZlclBvbGljeSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXJsID0gYXR0cmlidXRlcy51cmwgfHwgIiI7CiAgICB0aGlzLnVybFBvbGljeSA9IGF0dHJpYnV0ZXMudXJsUG9saWN5IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZW5jcnlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmlzc3VlcnMgPSBudWxsOwogICAgdGhpcy5rZXlVc2FnZSA9IG51bGw7CiAgICB0aGlzLm9pZHMgPSBudWxsOwogICAgdGhpcy5zaWduaW5nID0gbnVsbDsKICAgIHRoaXMuc3ViamVjdEROcyA9IG51bGw7CiAgfQp9CmNsYXNzIENoZWNrQnV0dG9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNoZWNrQnV0dG9uIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubWFyayA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm1hcmssIFsiZGVmYXVsdCIsICJjaGVjayIsICJjaXJjbGUiLCAiY3Jvc3MiLCAiZGlhbW9uZCIsICJzcXVhcmUiLCAic3RhciJdKTsKICAgIHRoaXMuc2hhcGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zaGFwZSwgWyJzcXVhcmUiLCAicm91bmQiXSk7CiAgICB0aGlzLnNpemUgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnNpemUsICIxMHB0Iik7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSgibWFyZ2luIik7CiAgICBjb25zdCBzaXplID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMuc2l6ZSk7CiAgICBzdHlsZS53aWR0aCA9IHN0eWxlLmhlaWdodCA9IHNpemU7CiAgICBsZXQgdHlwZTsKICAgIGxldCBjbGFzc05hbWU7CiAgICBsZXQgZ3JvdXBJZDsKICAgIGNvbnN0IGZpZWxkID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBpdGVtcyA9IGZpZWxkLml0ZW1zLmNoaWxkcmVuLmxlbmd0aCAmJiBmaWVsZC5pdGVtcy5jaGlsZHJlblswXVskdG9IVE1MXSgpLmh0bWwgfHwgW107CiAgICBjb25zdCBleHBvcnRlZFZhbHVlID0gewogICAgICBvbjogKGl0ZW1zWzBdICE9PSB1bmRlZmluZWQgPyBpdGVtc1swXSA6ICJvbiIpLnRvU3RyaW5nKCksCiAgICAgIG9mZjogKGl0ZW1zWzFdICE9PSB1bmRlZmluZWQgPyBpdGVtc1sxXSA6ICJvZmYiKS50b1N0cmluZygpCiAgICB9OwogICAgY29uc3QgdmFsdWUgPSBmaWVsZC52YWx1ZT8uWyR0ZXh0XSgpIHx8ICJvZmYiOwogICAgY29uc3QgY2hlY2tlZCA9IHZhbHVlID09PSBleHBvcnRlZFZhbHVlLm9uIHx8IHVuZGVmaW5lZDsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGZpZWxkWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgY29uc3QgZmllbGRJZCA9IGZpZWxkWyR1aWRdOwogICAgbGV0IGRhdGFJZDsKICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFeGNsR3JvdXApIHsKICAgICAgZ3JvdXBJZCA9IGNvbnRhaW5lclskdWlkXTsKICAgICAgdHlwZSA9ICJyYWRpbyI7CiAgICAgIGNsYXNzTmFtZSA9ICJ4ZmFSYWRpbyI7CiAgICAgIGRhdGFJZCA9IGNvbnRhaW5lclskZGF0YV0/LlskdWlkXSB8fCBjb250YWluZXJbJHVpZF07CiAgICB9IGVsc2UgewogICAgICB0eXBlID0gImNoZWNrYm94IjsKICAgICAgY2xhc3NOYW1lID0gInhmYUNoZWNrYm94IjsKICAgICAgZGF0YUlkID0gZmllbGRbJGRhdGFdPy5bJHVpZF0gfHwgZmllbGRbJHVpZF07CiAgICB9CiAgICBjb25zdCBpbnB1dCA9IHsKICAgICAgbmFtZTogImlucHV0IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbY2xhc3NOYW1lXSwKICAgICAgICBzdHlsZSwKICAgICAgICBmaWVsZElkLAogICAgICAgIGRhdGFJZCwKICAgICAgICB0eXBlLAogICAgICAgIGNoZWNrZWQsCiAgICAgICAgeGZhT246IGV4cG9ydGVkVmFsdWUub24sCiAgICAgICAgeGZhT2ZmOiBleHBvcnRlZFZhbHVlLm9mZiwKICAgICAgICAiYXJpYS1sYWJlbCI6IGFyaWFMYWJlbChmaWVsZCksCiAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICB9CiAgICB9OwogICAgaWYgKGdyb3VwSWQpIHsKICAgICAgaW5wdXQuYXR0cmlidXRlcy5uYW1lID0gZ3JvdXBJZDsKICAgIH0KICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBpbnB1dC5hdHRyaWJ1dGVzWyJhcmlhLXJlcXVpcmVkIl0gPSB0cnVlOwogICAgICBpbnB1dC5hdHRyaWJ1dGVzLnJlcXVpcmVkID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAibGFiZWwiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhTGFiZWwiXQogICAgICB9LAogICAgICBjaGlsZHJlbjogW2lucHV0XQogICAgfSk7CiAgfQp9CmNsYXNzIENob2ljZUxpc3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY2hvaWNlTGlzdCIsIHRydWUpOwogICAgdGhpcy5jb21taXRPbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmNvbW1pdE9uLCBbInNlbGVjdCIsICJleGl0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5vcGVuLCBbInVzZXJDb250cm9sIiwgImFsd2F5cyIsICJtdWx0aVNlbGVjdCIsICJvbkVudHJ5Il0pOwogICAgdGhpcy50ZXh0RW50cnkgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy50ZXh0RW50cnksCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAiYm9yZGVyIiwgIm1hcmdpbiIpOwogICAgY29uc3QgdWkgPSB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBmaWVsZCA9IHVpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBmb250U2l6ZSA9IGZpZWxkLmZvbnQ/LnNpemUgfHwgMTA7CiAgICBjb25zdCBvcHRpb25TdHlsZSA9IHsKICAgICAgZm9udFNpemU6IGBjYWxjKCR7Zm9udFNpemV9cHggKiB2YXIoLS10b3RhbC1zY2FsZS1mYWN0b3IpKWAKICAgIH07CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgaWYgKGZpZWxkLml0ZW1zLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgaXRlbXMgPSBmaWVsZC5pdGVtczsKICAgICAgbGV0IGRpc3BsYXllZEluZGV4ID0gMDsKICAgICAgbGV0IHNhdmVJbmRleCA9IDA7CiAgICAgIGlmIChpdGVtcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHsKICAgICAgICBkaXNwbGF5ZWRJbmRleCA9IGl0ZW1zLmNoaWxkcmVuWzBdLnNhdmU7CiAgICAgICAgc2F2ZUluZGV4ID0gMSAtIGRpc3BsYXllZEluZGV4OwogICAgICB9CiAgICAgIGNvbnN0IGRpc3BsYXllZCA9IGl0ZW1zLmNoaWxkcmVuW2Rpc3BsYXllZEluZGV4XVskdG9IVE1MXSgpLmh0bWw7CiAgICAgIGNvbnN0IHZhbHVlcyA9IGl0ZW1zLmNoaWxkcmVuW3NhdmVJbmRleF1bJHRvSFRNTF0oKS5odG1sOwogICAgICBsZXQgc2VsZWN0ZWQgPSBmYWxzZTsKICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC52YWx1ZT8uWyR0ZXh0XSgpIHx8ICIiOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkaXNwbGF5ZWQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IG9wdGlvbiA9IHsKICAgICAgICAgIG5hbWU6ICJvcHRpb24iLAogICAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgICB2YWx1ZTogdmFsdWVzW2ldIHx8IGRpc3BsYXllZFtpXSwKICAgICAgICAgICAgc3R5bGU6IG9wdGlvblN0eWxlCiAgICAgICAgICB9LAogICAgICAgICAgdmFsdWU6IGRpc3BsYXllZFtpXQogICAgICAgIH07CiAgICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gdmFsdWUpIHsKICAgICAgICAgIG9wdGlvbi5hdHRyaWJ1dGVzLnNlbGVjdGVkID0gc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBjaGlsZHJlbi5wdXNoKG9wdGlvbik7CiAgICAgIH0KICAgICAgaWYgKCFzZWxlY3RlZCkgewogICAgICAgIGNoaWxkcmVuLnNwbGljZSgwLCAwLCB7CiAgICAgICAgICBuYW1lOiAib3B0aW9uIiwKICAgICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgICAgaGlkZGVuOiB0cnVlLAogICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlOiAiICIKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgY29uc3Qgc2VsZWN0QXR0cmlidXRlcyA9IHsKICAgICAgY2xhc3M6IFsieGZhU2VsZWN0Il0sCiAgICAgIGZpZWxkSWQ6IGZpZWxkWyR1aWRdLAogICAgICBkYXRhSWQ6IGZpZWxkWyRkYXRhXT8uWyR1aWRdIHx8IGZpZWxkWyR1aWRdLAogICAgICBzdHlsZSwKICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAiYXJpYS1yZXF1aXJlZCI6IGZhbHNlCiAgICB9OwogICAgaWYgKGlzUmVxdWlyZWQoZmllbGQpKSB7CiAgICAgIHNlbGVjdEF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIHNlbGVjdEF0dHJpYnV0ZXMucmVxdWlyZWQgPSB0cnVlOwogICAgfQogICAgaWYgKHRoaXMub3BlbiA9PT0gIm11bHRpU2VsZWN0IikgewogICAgICBzZWxlY3RBdHRyaWJ1dGVzLm11bHRpcGxlID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAibGFiZWwiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhTGFiZWwiXQogICAgICB9LAogICAgICBjaGlsZHJlbjogW3sKICAgICAgICBuYW1lOiAic2VsZWN0IiwKICAgICAgICBjaGlsZHJlbiwKICAgICAgICBhdHRyaWJ1dGVzOiBzZWxlY3RBdHRyaWJ1dGVzCiAgICAgIH1dCiAgICB9KTsKICB9Cn0KY2xhc3MgQ29sb3IgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29sb3IiLCB0cnVlKTsKICAgIHRoaXMuY1NwYWNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuY1NwYWNlLCBbIlNSR0IiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnZhbHVlID0gYXR0cmlidXRlcy52YWx1ZSA/IGdldENvbG9yKGF0dHJpYnV0ZXMudmFsdWUpIDogIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskaGFzU2V0dGFibGVWYWx1ZV0oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICByZXR1cm4gdGhpcy52YWx1ZSA/IFV0aWwubWFrZUhleENvbG9yKHRoaXMudmFsdWUuciwgdGhpcy52YWx1ZS5nLCB0aGlzLnZhbHVlLmIpIDogbnVsbDsKICB9Cn0KY2xhc3MgQ29tYiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjb21iIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubnVtYmVyT2ZDZWxscyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm51bWJlck9mQ2VsbHMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIENvbm5lY3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29ubmVjdCIsIHRydWUpOwogICAgdGhpcy5jb25uZWN0aW9uID0gYXR0cmlidXRlcy5jb25uZWN0aW9uIHx8ICIiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy51c2FnZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnVzYWdlLCBbImV4cG9ydEFuZEltcG9ydCIsICJleHBvcnRPbmx5IiwgImltcG9ydE9ubHkiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICB9Cn0KY2xhc3MgQ29udGVudEFyZWEgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29udGVudEFyZWEiLCB0cnVlKTsKICAgIHRoaXMuaCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuaCk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmVsZXZhbnQgPSBnZXRSZWxldmFudChhdHRyaWJ1dGVzLnJlbGV2YW50KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLncgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLncpOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3QgbGVmdCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLngpOwogICAgY29uc3QgdG9wID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMueSk7CiAgICBjb25zdCBzdHlsZSA9IHsKICAgICAgbGVmdCwKICAgICAgdG9wLAogICAgICB3aWR0aDogbWVhc3VyZVRvU3RyaW5nKHRoaXMudyksCiAgICAgIGhlaWdodDogbWVhc3VyZVRvU3RyaW5nKHRoaXMuaCkKICAgIH07CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFDb250ZW50YXJlYSJdOwogICAgaWYgKGlzUHJpbnRPbmx5KHRoaXMpKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhUHJpbnRPbmx5Iik7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGNoaWxkcmVuOiBbXSwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHN0eWxlLAogICAgICAgIGNsYXNzOiBjbGFzc05hbWVzLAogICAgICAgIGlkOiB0aGlzWyR1aWRdCiAgICAgIH0KICAgIH0pOwogIH0KfQpjbGFzcyBDb3JuZXIgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY29ybmVyIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMuaW52ZXJ0ZWQgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5pbnZlcnRlZCwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuam9pbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmpvaW4sIFsic3F1YXJlIiwgInJvdW5kIl0pOwogICAgdGhpcy5wcmVzZW5jZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnByZXNlbmNlLCBbInZpc2libGUiLCAiaGlkZGVuIiwgImluYWN0aXZlIiwgImludmlzaWJsZSJdKTsKICAgIHRoaXMucmFkaXVzID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5yYWRpdXMpOwogICAgdGhpcy5zdHJva2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zdHJva2UsIFsic29saWQiLCAiZGFzaERvdCIsICJkYXNoRG90RG90IiwgImRhc2hlZCIsICJkb3R0ZWQiLCAiZW1ib3NzZWQiLCAiZXRjaGVkIiwgImxvd2VyZWQiLCAicmFpc2VkIl0pOwogICAgdGhpcy50aGlja25lc3MgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnRoaWNrbmVzcywgIjAuNXB0Iik7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgInZpc2liaWxpdHkiKTsKICAgIHN0eWxlLnJhZGl1cyA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLmpvaW4gPT09ICJzcXVhcmUiID8gMCA6IHRoaXMucmFkaXVzKTsKICAgIHJldHVybiBzdHlsZTsKICB9Cn0KY2xhc3MgRGF0ZUVsZW1lbnQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRhdGUiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBkYXRlID0gdGhpc1skY29udGVudF0udHJpbSgpOwogICAgdGhpc1skY29udGVudF0gPSBkYXRlID8gbmV3IERhdGUoZGF0ZSkgOiBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHJldHVybiB2YWx1ZVRvSHRtbCh0aGlzWyRjb250ZW50XSA/IHRoaXNbJGNvbnRlbnRdLnRvU3RyaW5nKCkgOiAiIik7CiAgfQp9CmNsYXNzIERhdGVUaW1lIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkYXRlVGltZSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IGRhdGUgPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICB0aGlzWyRjb250ZW50XSA9IGRhdGUgPyBuZXcgRGF0ZShkYXRlKSA6IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbnRlbnRdID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgRGF0ZVRpbWVFZGl0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRhdGVUaW1lRWRpdCIsIHRydWUpOwogICAgdGhpcy5oU2Nyb2xsUG9saWN5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaFNjcm9sbFBvbGljeSwgWyJhdXRvIiwgIm9mZiIsICJvbiJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5waWNrZXIgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5waWNrZXIsIFsiaG9zdCIsICJub25lIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuY29tYiA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJib3JkZXIiLCAiZm9udCIsICJtYXJnaW4iKTsKICAgIGNvbnN0IGZpZWxkID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiaW5wdXQiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgIGZpZWxkSWQ6IGZpZWxkWyR1aWRdLAogICAgICAgIGRhdGFJZDogZmllbGRbJGRhdGFdPy5bJHVpZF0gfHwgZmllbGRbJHVpZF0sCiAgICAgICAgY2xhc3M6IFsieGZhVGV4dGZpZWxkIl0sCiAgICAgICAgc3R5bGUsCiAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICJhcmlhLXJlcXVpcmVkIjogZmFsc2UKICAgICAgfQogICAgfTsKICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImxhYmVsIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbInhmYUxhYmVsIl0KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtodG1sXQogICAgfSk7CiAgfQp9CmNsYXNzIERlY2ltYWwgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRlY2ltYWwiKTsKICAgIHRoaXMuZnJhY0RpZ2l0cyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmZyYWNEaWdpdHMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMiwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZERpZ2l0cyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmxlYWREaWdpdHMsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBudW1iZXIgPSBwYXJzZUZsb2F0KHRoaXNbJGNvbnRlbnRdLnRyaW0oKSk7CiAgICB0aGlzWyRjb250ZW50XSA9IGlzTmFOKG51bWJlcikgPyBudWxsIDogbnVtYmVyOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHJldHVybiB2YWx1ZVRvSHRtbCh0aGlzWyRjb250ZW50XSAhPT0gbnVsbCA/IHRoaXNbJGNvbnRlbnRdLnRvU3RyaW5nKCkgOiAiIik7CiAgfQp9CmNsYXNzIERlZmF1bHRVaSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkZWZhdWx0VWkiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9Cn0KY2xhc3MgRGVzYyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkZXNjIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBEaWdlc3RNZXRob2QgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZGlnZXN0TWV0aG9kIiwgWyIiLCAiU0hBMSIsICJTSEEyNTYiLCAiU0hBNTEyIiwgIlJJUEVNRDE2MCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgRGlnZXN0TWV0aG9kcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkaWdlc3RNZXRob2RzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5kaWdlc3RNZXRob2QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRHJhdyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkcmF3IiwgdHJ1ZSk7CiAgICB0aGlzLmFuY2hvclR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hbmNob3JUeXBlLCBbInRvcExlZnQiLCAiYm90dG9tQ2VudGVyIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAibWlkZGxlQ2VudGVyIiwgIm1pZGRsZUxlZnQiLCAibWlkZGxlUmlnaHQiLCAidG9wQ2VudGVyIiwgInRvcFJpZ2h0Il0pOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5oID0gYXR0cmlidXRlcy5oID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5oKSA6ICIiOwogICAgdGhpcy5oQWxpZ24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oQWxpZ24sIFsibGVmdCIsICJjZW50ZXIiLCAianVzdGlmeSIsICJqdXN0aWZ5QWxsIiwgInJhZGl4IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxvY2FsZSA9IGF0dHJpYnV0ZXMubG9jYWxlIHx8ICIiOwogICAgdGhpcy5tYXhIID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhILCAiMHB0Iik7CiAgICB0aGlzLm1heFcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1heFcsICIwcHQiKTsKICAgIHRoaXMubWluSCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWluSCwgIjBwdCIpOwogICAgdGhpcy5taW5XID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5XLCAiMHB0Iik7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy5yb3RhdGUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5yb3RhdGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCAlIDkwID09PSAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLncgPSBhdHRyaWJ1dGVzLncgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLncpIDogIiI7CiAgICB0aGlzLnggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLngsICIwcHQiKTsKICAgIHRoaXMueSA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMueSwgIjBwdCIpOwogICAgdGhpcy5hc3Npc3QgPSBudWxsOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jYXB0aW9uID0gbnVsbDsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmZvbnQgPSBudWxsOwogICAgdGhpcy5rZWVwID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMucGFyYSA9IG51bGw7CiAgICB0aGlzLnRyYXZlcnNhbCA9IG51bGw7CiAgICB0aGlzLnVpID0gbnVsbDsKICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgdGhpcy5zZXRQcm9wZXJ0eSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICBbJHNldFZhbHVlXSh2YWx1ZSkgewogICAgX3NldFZhbHVlKHRoaXMsIHZhbHVlKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBzZXRUYWJJbmRleCh0aGlzKTsKICAgIGlmICh0aGlzLnByZXNlbmNlID09PSAiaGlkZGVuIiB8fCB0aGlzLnByZXNlbmNlID09PSAiaW5hY3RpdmUiKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgZml4RGltZW5zaW9ucyh0aGlzKTsKICAgIHRoaXNbJHB1c2hQYXJhXSgpOwogICAgY29uc3Qgc2F2ZWRXID0gdGhpcy53OwogICAgY29uc3Qgc2F2ZWRIID0gdGhpcy5oOwogICAgY29uc3QgewogICAgICB3LAogICAgICBoLAogICAgICBpc0Jyb2tlbgogICAgfSA9IGxheW91dE5vZGUodGhpcywgYXZhaWxhYmxlU3BhY2UpOwogICAgaWYgKHcgJiYgdGhpcy53ID09PSAiIikgewogICAgICBpZiAoaXNCcm9rZW4gJiYgdGhpc1skZ2V0U3ViZm9ybVBhcmVudF0oKVskaXNUaGVyZU1vcmVXaWR0aF0oKSkgewogICAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgICAgfQogICAgICB0aGlzLncgPSB3OwogICAgfQogICAgaWYgKGggJiYgdGhpcy5oID09PSAiIikgewogICAgICB0aGlzLmggPSBoOwogICAgfQogICAgc2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7CiAgICBpZiAoIWNoZWNrRGltZW5zaW9ucyh0aGlzLCBhdmFpbGFibGVTcGFjZSkpIHsKICAgICAgdGhpcy53ID0gc2F2ZWRXOwogICAgICB0aGlzLmggPSBzYXZlZEg7CiAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICB1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJmb250IiwgImhBbGlnbiIsICJkaW1lbnNpb25zIiwgInBvc2l0aW9uIiwgInByZXNlbmNlIiwgInJvdGF0ZSIsICJhbmNob3JUeXBlIiwgImJvcmRlciIsICJtYXJnaW4iKTsKICAgIHNldE1pbk1heERpbWVuc2lvbnModGhpcywgc3R5bGUpOwogICAgaWYgKHN0eWxlLm1hcmdpbikgewogICAgICBzdHlsZS5wYWRkaW5nID0gc3R5bGUubWFyZ2luOwogICAgICBkZWxldGUgc3R5bGUubWFyZ2luOwogICAgfQogICAgY29uc3QgY2xhc3NOYW1lcyA9IFsieGZhRHJhdyJdOwogICAgaWYgKHRoaXMuZm9udCkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYUZvbnQiKTsKICAgIH0KICAgIGlmIChpc1ByaW50T25seSh0aGlzKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgc3R5bGUsCiAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICBjbGFzczogY2xhc3NOYW1lcwogICAgfTsKICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgY29uc3QgaHRtbCA9IHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGFwcGx5QXNzaXN0KHRoaXMsIGF0dHJpYnV0ZXMpOwogICAgY29uc3QgYmJveCA9IGNvbXB1dGVCYm94KHRoaXMsIGh0bWwsIGF2YWlsYWJsZVNwYWNlKTsKICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWVbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpLmh0bWwgOiBudWxsOwogICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgIHRoaXMudyA9IHNhdmVkVzsKICAgICAgdGhpcy5oID0gc2F2ZWRIOwogICAgICB0aGlzWyRwb3BQYXJhXSgpOwogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogICAgfQogICAgaHRtbC5jaGlsZHJlbi5wdXNoKHZhbHVlKTsKICAgIHNldFBhcmEodGhpcywgc3R5bGUsIHZhbHVlKTsKICAgIHRoaXMudyA9IHNhdmVkVzsKICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogIH0KfQpjbGFzcyBFZGdlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVkZ2UiLCB0cnVlKTsKICAgIHRoaXMuY2FwID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuY2FwLCBbInNxdWFyZSIsICJidXR0IiwgInJvdW5kIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5zdHJva2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zdHJva2UsIFsic29saWQiLCAiZGFzaERvdCIsICJkYXNoRG90RG90IiwgImRhc2hlZCIsICJkb3R0ZWQiLCAiZW1ib3NzZWQiLCAiZXRjaGVkIiwgImxvd2VyZWQiLCAicmFpc2VkIl0pOwogICAgdGhpcy50aGlja25lc3MgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnRoaWNrbmVzcywgIjAuNXB0Iik7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgInZpc2liaWxpdHkiKTsKICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHsKICAgICAgbGluZWNhcDogdGhpcy5jYXAsCiAgICAgIHdpZHRoOiBtZWFzdXJlVG9TdHJpbmcodGhpcy50aGlja25lc3MpLAogICAgICBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3JbJHRvU3R5bGVdKCkgOiAiIzAwMDAwMCIsCiAgICAgIHN0eWxlOiAiIgogICAgfSk7CiAgICBpZiAodGhpcy5wcmVzZW5jZSAhPT0gInZpc2libGUiKSB7CiAgICAgIHN0eWxlLnN0eWxlID0gIm5vbmUiOwogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoICh0aGlzLnN0cm9rZSkgewogICAgICAgIGNhc2UgInNvbGlkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gInNvbGlkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hEb3QiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZGFzaGVkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hEb3REb3QiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZGFzaGVkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hlZCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJkYXNoZWQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZG90dGVkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gImRvdHRlZCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJlbWJvc3NlZCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJyaWRnZSI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJldGNoZWQiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZ3Jvb3ZlIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxvd2VyZWQiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiaW5zZXQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicmFpc2VkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gIm91dHNldCI7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBFbmNvZGluZyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJlbmNvZGluZyIsIFsiYWRiZS54NTA5LnJzYV9zaGExIiwgImFkYmUucGtjczcuZGV0YWNoZWQiLCAiYWRiZS5wa2NzNy5zaGExIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBFbmNvZGluZ3MgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZW5jb2RpbmdzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lbmNvZGluZyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBFbmNyeXB0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHQiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY2VydGlmaWNhdGUgPSBudWxsOwogIH0KfQpjbGFzcyBFbmNyeXB0RGF0YSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJlbmNyeXB0RGF0YSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZXJhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9wZXJhdGlvbiwgWyJlbmNyeXB0IiwgImRlY3J5cHQiXSk7CiAgICB0aGlzLnRhcmdldCA9IGF0dHJpYnV0ZXMudGFyZ2V0IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKICAgIHRoaXMubWFuaWZlc3QgPSBudWxsOwogIH0KfQpjbGFzcyBFbmNyeXB0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHRpb24iLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25NZXRob2QgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZW5jcnlwdGlvbk1ldGhvZCIsIFsiIiwgIkFFUzI1Ni1DQkMiLCAiVFJJUExFREVTLUNCQyIsICJBRVMxMjgtQ0JDIiwgIkFFUzE5Mi1DQkMiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25NZXRob2RzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHRpb25NZXRob2RzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lbmNyeXB0aW9uTWV0aG9kID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEV2ZW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImV2ZW50IiwgdHJ1ZSk7CiAgICB0aGlzLmFjdGl2aXR5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYWN0aXZpdHksIFsiY2xpY2siLCAiY2hhbmdlIiwgImRvY0Nsb3NlIiwgImRvY1JlYWR5IiwgImVudGVyIiwgImV4aXQiLCAiZnVsbCIsICJpbmRleENoYW5nZSIsICJpbml0aWFsaXplIiwgIm1vdXNlRG93biIsICJtb3VzZUVudGVyIiwgIm1vdXNlRXhpdCIsICJtb3VzZVVwIiwgInBvc3RFeGVjdXRlIiwgInBvc3RPcGVuIiwgInBvc3RQcmludCIsICJwb3N0U2F2ZSIsICJwb3N0U2lnbiIsICJwb3N0U3VibWl0IiwgInByZUV4ZWN1dGUiLCAicHJlT3BlbiIsICJwcmVQcmludCIsICJwcmVTYXZlIiwgInByZVNpZ24iLCAicHJlU3VibWl0IiwgInJlYWR5IiwgInZhbGlkYXRpb25TdGF0ZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5saXN0ZW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5saXN0ZW4sIFsicmVmT25seSIsICJyZWZBbmREZXNjZW5kZW50cyJdKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0RGF0YSA9IG51bGw7CiAgICB0aGlzLmV4ZWN1dGUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogICAgdGhpcy5zaWduRGF0YSA9IG51bGw7CiAgICB0aGlzLnN1Ym1pdCA9IG51bGw7CiAgfQp9CmNsYXNzIEV4RGF0YSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXhEYXRhIik7CiAgICB0aGlzLmNvbnRlbnRUeXBlID0gYXR0cmlidXRlcy5jb250ZW50VHlwZSB8fCAiIjsKICAgIHRoaXMuaHJlZiA9IGF0dHJpYnV0ZXMuaHJlZiB8fCAiIjsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5tYXhMZW5ndGggPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5tYXhMZW5ndGgsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gLTEKICAgIH0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5yaWQgPSBhdHRyaWJ1dGVzLnJpZCB8fCAiIjsKICAgIHRoaXMudHJhbnNmZXJFbmNvZGluZyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnRyYW5zZmVyRW5jb2RpbmcsIFsibm9uZSIsICJiYXNlNjQiLCAicGFja2FnZSJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskaXNDREFUQVhtbF0oKSB7CiAgICByZXR1cm4gdGhpcy5jb250ZW50VHlwZSA9PT0gInRleHQvaHRtbCI7CiAgfQogIFskb25DaGlsZF0oY2hpbGQpIHsKICAgIGlmICh0aGlzLmNvbnRlbnRUeXBlID09PSAidGV4dC9odG1sIiAmJiBjaGlsZFskbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMueGh0bWwuaWQpIHsKICAgICAgdGhpc1skY29udGVudF0gPSBjaGlsZDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5jb250ZW50VHlwZSA9PT0gInRleHQveG1sIikgewogICAgICB0aGlzWyRjb250ZW50XSA9IGNoaWxkOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBpZiAodGhpcy5jb250ZW50VHlwZSAhPT0gInRleHQvaHRtbCIgfHwgIXRoaXNbJGNvbnRlbnRdKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICB9Cn0KY2xhc3MgRXhPYmplY3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXhPYmplY3QiLCB0cnVlKTsKICAgIHRoaXMuYXJjaGl2ZSA9IGF0dHJpYnV0ZXMuYXJjaGl2ZSB8fCAiIjsKICAgIHRoaXMuY2xhc3NJZCA9IGF0dHJpYnV0ZXMuY2xhc3NJZCB8fCAiIjsKICAgIHRoaXMuY29kZUJhc2UgPSBhdHRyaWJ1dGVzLmNvZGVCYXNlIHx8ICIiOwogICAgdGhpcy5jb2RlVHlwZSA9IGF0dHJpYnV0ZXMuY29kZVR5cGUgfHwgIiI7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leE9iamVjdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBFeGNsR3JvdXAgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXhjbEdyb3VwIiwgdHJ1ZSk7CiAgICB0aGlzLmFjY2VzcyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFjY2VzcywgWyJvcGVuIiwgIm5vbkludGVyYWN0aXZlIiwgInByb3RlY3RlZCIsICJyZWFkT25seSJdKTsKICAgIHRoaXMuYWNjZXNzS2V5ID0gYXR0cmlidXRlcy5hY2Nlc3NLZXkgfHwgIiI7CiAgICB0aGlzLmFuY2hvclR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hbmNob3JUeXBlLCBbInRvcExlZnQiLCAiYm90dG9tQ2VudGVyIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAibWlkZGxlQ2VudGVyIiwgIm1pZGRsZUxlZnQiLCAibWlkZGxlUmlnaHQiLCAidG9wQ2VudGVyIiwgInRvcFJpZ2h0Il0pOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5oID0gYXR0cmlidXRlcy5oID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5oKSA6ICIiOwogICAgdGhpcy5oQWxpZ24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oQWxpZ24sIFsibGVmdCIsICJjZW50ZXIiLCAianVzdGlmeSIsICJqdXN0aWZ5QWxsIiwgInJhZGl4IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxheW91dCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmxheW91dCwgWyJwb3NpdGlvbiIsICJsci10YiIsICJybC1yb3ciLCAicmwtdGIiLCAicm93IiwgInRhYmxlIiwgInRiIl0pOwogICAgdGhpcy5tYXhIID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhILCAiMHB0Iik7CiAgICB0aGlzLm1heFcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1heFcsICIwcHQiKTsKICAgIHRoaXMubWluSCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWluSCwgIjBwdCIpOwogICAgdGhpcy5taW5XID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5XLCAiMHB0Iik7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudyA9IGF0dHJpYnV0ZXMudyA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMudykgOiAiIjsKICAgIHRoaXMueCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMueCwgIjBwdCIpOwogICAgdGhpcy55ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy55LCAiMHB0Iik7CiAgICB0aGlzLmFzc2lzdCA9IG51bGw7CiAgICB0aGlzLmJpbmQgPSBudWxsOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jYWxjdWxhdGUgPSBudWxsOwogICAgdGhpcy5jYXB0aW9uID0gbnVsbDsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgICB0aGlzLnBhcmEgPSBudWxsOwogICAgdGhpcy50cmF2ZXJzYWwgPSBudWxsOwogICAgdGhpcy52YWxpZGF0ZSA9IG51bGw7CiAgICB0aGlzLmNvbm5lY3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXZlbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmllbGQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2V0UHJvcGVydHkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRpc0JpbmRhYmxlXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJGhhc1NldHRhYmxlVmFsdWVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskc2V0VmFsdWVdKHZhbHVlKSB7CiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGQuY2hpbGRyZW4pIHsKICAgICAgaWYgKCFmaWVsZC52YWx1ZSkgewogICAgICAgIGNvbnN0IG5vZGVWYWx1ZSA9IG5ldyBWYWx1ZSh7fSk7CiAgICAgICAgZmllbGRbJGFwcGVuZENoaWxkXShub2RlVmFsdWUpOwogICAgICAgIGZpZWxkLnZhbHVlID0gbm9kZVZhbHVlOwogICAgICB9CiAgICAgIGZpZWxkLnZhbHVlWyRzZXRWYWx1ZV0odmFsdWUpOwogICAgfQogIH0KICBbJGlzVGhlcmVNb3JlV2lkdGhdKCkgewogICAgcmV0dXJuIHRoaXMubGF5b3V0LmVuZHNXaXRoKCItdGIiKSAmJiB0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gMCAmJiB0aGlzWyRleHRyYV0ubnVtYmVySW5MaW5lID4gMCB8fCB0aGlzWyRnZXRQYXJlbnRdKClbJGlzVGhlcmVNb3JlV2lkdGhdKCk7CiAgfQogIFskaXNTcGxpdHRhYmxlXSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBpZiAoIXBhcmVudFskaXNTcGxpdHRhYmxlXSgpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzWyRleHRyYV0uX2lzU3BsaXR0YWJsZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiB0aGlzWyRleHRyYV0uX2lzU3BsaXR0YWJsZTsKICAgIH0KICAgIGlmICh0aGlzLmxheW91dCA9PT0gInBvc2l0aW9uIiB8fCB0aGlzLmxheW91dC5pbmNsdWRlcygicm93IikpIHsKICAgICAgdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHBhcmVudC5sYXlvdXQ/LmVuZHNXaXRoKCItdGIiKSAmJiBwYXJlbnRbJGV4dHJhXS5udW1iZXJJbkxpbmUgIT09IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgPSB0cnVlOwogICAgcmV0dXJuIHRydWU7CiAgfQogIFskZmx1c2hIVE1MXSgpIHsKICAgIHJldHVybiBmbHVzaEhUTUwodGhpcyk7CiAgfQogIFskYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgYWRkSFRNTCh0aGlzLCBodG1sLCBiYm94KTsKICB9CiAgWyRnZXRBdmFpbGFibGVTcGFjZV0oKSB7CiAgICByZXR1cm4gZ2V0QXZhaWxhYmxlU3BhY2UodGhpcyk7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgc2V0VGFiSW5kZXgodGhpcyk7CiAgICBpZiAodGhpcy5wcmVzZW5jZSA9PT0gImhpZGRlbiIgfHwgdGhpcy5wcmVzZW5jZSA9PT0gImluYWN0aXZlIiB8fCB0aGlzLmggPT09IDAgfHwgdGhpcy53ID09PSAwKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgZml4RGltZW5zaW9ucyh0aGlzKTsKICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gewogICAgICBpZDogdGhpc1skdWlkXSwKICAgICAgY2xhc3M6IFtdCiAgICB9OwogICAgc2V0QWNjZXNzKHRoaXMsIGF0dHJpYnV0ZXMuY2xhc3MpOwogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgdGhpc1skZXh0cmFdID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIE9iamVjdC5hc3NpZ24odGhpc1skZXh0cmFdLCB7CiAgICAgIGNoaWxkcmVuLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBhdHRlbXB0OiAwLAogICAgICBsaW5lOiBudWxsLAogICAgICBudW1iZXJJbkxpbmU6IDAsCiAgICAgIGF2YWlsYWJsZVNwYWNlOiB7CiAgICAgICAgd2lkdGg6IE1hdGgubWluKHRoaXMudyB8fCBJbmZpbml0eSwgYXZhaWxhYmxlU3BhY2Uud2lkdGgpLAogICAgICAgIGhlaWdodDogTWF0aC5taW4odGhpcy5oIHx8IEluZmluaXR5LCBhdmFpbGFibGVTcGFjZS5oZWlnaHQpCiAgICAgIH0sCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIHByZXZIZWlnaHQ6IDAsCiAgICAgIGN1cnJlbnRXaWR0aDogMAogICAgfSk7CiAgICBjb25zdCBpc1NwbGl0dGFibGUgPSB0aGlzWyRpc1NwbGl0dGFibGVdKCk7CiAgICBpZiAoIWlzU3BsaXR0YWJsZSkgewogICAgICBzZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIH0KICAgIGlmICghY2hlY2tEaW1lbnNpb25zKHRoaXMsIGF2YWlsYWJsZVNwYWNlKSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgY29uc3QgZmlsdGVyID0gbmV3IFNldChbImZpZWxkIl0pOwogICAgaWYgKHRoaXMubGF5b3V0LmluY2x1ZGVzKCJyb3ciKSkgewogICAgICBjb25zdCBjb2x1bW5XaWR0aHMgPSB0aGlzWyRnZXRTdWJmb3JtUGFyZW50XSgpLmNvbHVtbldpZHRoczsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sdW1uV2lkdGhzKSAmJiBjb2x1bW5XaWR0aHMubGVuZ3RoID4gMCkgewogICAgICAgIHRoaXNbJGV4dHJhXS5jb2x1bW5XaWR0aHMgPSBjb2x1bW5XaWR0aHM7CiAgICAgICAgdGhpc1skZXh0cmFdLmN1cnJlbnRDb2x1bW4gPSAwOwogICAgICB9CiAgICB9CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImFuY2hvclR5cGUiLCAiZGltZW5zaW9ucyIsICJwb3NpdGlvbiIsICJwcmVzZW5jZSIsICJib3JkZXIiLCAibWFyZ2luIiwgImhBbGlnbiIpOwogICAgY29uc3QgY2xhc3NOYW1lcyA9IFsieGZhRXhjbGdyb3VwIl07CiAgICBjb25zdCBjbCA9IGxheW91dENsYXNzKHRoaXMpOwogICAgaWYgKGNsKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaChjbCk7CiAgICB9CiAgICBpZiAoaXNQcmludE9ubHkodGhpcykpIHsKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFQcmludE9ubHkiKTsKICAgIH0KICAgIGF0dHJpYnV0ZXMuc3R5bGUgPSBzdHlsZTsKICAgIGF0dHJpYnV0ZXMuY2xhc3MgPSBjbGFzc05hbWVzOwogICAgaWYgKHRoaXMubmFtZSkgewogICAgICBhdHRyaWJ1dGVzLnhmYU5hbWUgPSB0aGlzLm5hbWU7CiAgICB9CiAgICB0aGlzWyRwdXNoUGFyYV0oKTsKICAgIGNvbnN0IGlzTHJUYiA9IHRoaXMubGF5b3V0ID09PSAibHItdGIiIHx8IHRoaXMubGF5b3V0ID09PSAicmwtdGIiOwogICAgY29uc3QgbWF4UnVuID0gaXNMclRiID8gTUFYX0FUVEVNUFRTX0ZPUl9MUlRCX0xBWU9VVCA6IDE7CiAgICBmb3IgKDsgdGhpc1skZXh0cmFdLmF0dGVtcHQgPCBtYXhSdW47IHRoaXNbJGV4dHJhXS5hdHRlbXB0KyspIHsKICAgICAgaWYgKGlzTHJUYiAmJiB0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gTUFYX0FUVEVNUFRTX0ZPUl9MUlRCX0xBWU9VVCAtIDEpIHsKICAgICAgICB0aGlzWyRleHRyYV0ubnVtYmVySW5MaW5lID0gMDsKICAgICAgfQogICAgICBjb25zdCByZXN1bHQgPSB0aGlzWyRjaGlsZHJlblRvSFRNTF0oewogICAgICAgIGZpbHRlciwKICAgICAgICBpbmNsdWRlOiB0cnVlCiAgICAgIH0pOwogICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAocmVzdWx0LmlzQnJlYWsoKSkgewogICAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBpZiAoaXNMclRiICYmIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSAwICYmIHRoaXNbJGV4dHJhXS5udW1iZXJJbkxpbmUgPT09IDAgJiYgIXRoaXNbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID0gbWF4UnVuOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICB0aGlzWyRwb3BQYXJhXSgpOwogICAgaWYgKCFpc1NwbGl0dGFibGUpIHsKICAgICAgdW5zZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIH0KICAgIGlmICh0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gbWF4UnVuKSB7CiAgICAgIGlmICghaXNTcGxpdHRhYmxlKSB7CiAgICAgICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgICAgfQogICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgbGV0IG1hcmdpbkggPSAwOwogICAgbGV0IG1hcmdpblYgPSAwOwogICAgaWYgKHRoaXMubWFyZ2luKSB7CiAgICAgIG1hcmdpbkggPSB0aGlzLm1hcmdpbi5sZWZ0SW5zZXQgKyB0aGlzLm1hcmdpbi5yaWdodEluc2V0OwogICAgICBtYXJnaW5WID0gdGhpcy5tYXJnaW4udG9wSW5zZXQgKyB0aGlzLm1hcmdpbi5ib3R0b21JbnNldDsKICAgIH0KICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgodGhpc1skZXh0cmFdLndpZHRoICsgbWFyZ2luSCwgdGhpcy53IHx8IDApOwogICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgodGhpc1skZXh0cmFdLmhlaWdodCArIG1hcmdpblYsIHRoaXMuaCB8fCAwKTsKICAgIGNvbnN0IGJib3ggPSBbdGhpcy54LCB0aGlzLnksIHdpZHRoLCBoZWlnaHRdOwogICAgaWYgKHRoaXMudyA9PT0gIiIpIHsKICAgICAgc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcod2lkdGgpOwogICAgfQogICAgaWYgKHRoaXMuaCA9PT0gIiIpIHsKICAgICAgc3R5bGUuaGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKGhlaWdodCk7CiAgICB9CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlcywKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICBhcHBseUFzc2lzdCh0aGlzLCBhdHRyaWJ1dGVzKTsKICAgIGRlbGV0ZSB0aGlzWyRleHRyYV07CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogIH0KfQpjbGFzcyBFeGVjdXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImV4ZWN1dGUiKTsKICAgIHRoaXMuY29ubmVjdGlvbiA9IGF0dHJpYnV0ZXMuY29ubmVjdGlvbiB8fCAiIjsKICAgIHRoaXMuZXhlY3V0ZVR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5leGVjdXRlVHlwZSwgWyJpbXBvcnQiLCAicmVtZXJnZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5ydW5BdCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnJ1bkF0LCBbImNsaWVudCIsICJib3RoIiwgInNlcnZlciJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEV4dHJhcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJleHRyYXMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9vbGVhbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGVUaW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlY2ltYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhEYXRhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4dHJhcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBGaWVsZCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmaWVsZCIsIHRydWUpOwogICAgdGhpcy5hY2Nlc3MgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hY2Nlc3MsIFsib3BlbiIsICJub25JbnRlcmFjdGl2ZSIsICJwcm90ZWN0ZWQiLCAicmVhZE9ubHkiXSk7CiAgICB0aGlzLmFjY2Vzc0tleSA9IGF0dHJpYnV0ZXMuYWNjZXNzS2V5IHx8ICIiOwogICAgdGhpcy5hbmNob3JUeXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYW5jaG9yVHlwZSwgWyJ0b3BMZWZ0IiwgImJvdHRvbUNlbnRlciIsICJib3R0b21MZWZ0IiwgImJvdHRvbVJpZ2h0IiwgIm1pZGRsZUNlbnRlciIsICJtaWRkbGVMZWZ0IiwgIm1pZGRsZVJpZ2h0IiwgInRvcENlbnRlciIsICJ0b3BSaWdodCJdKTsKICAgIHRoaXMuY29sU3BhbiA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmNvbFNwYW4sCiAgICAgIGRlZmF1bHRWYWx1ZTogMSwKICAgICAgdmFsaWRhdGU6IG4gPT4gbiA+PSAxIHx8IG4gPT09IC0xCiAgICB9KTsKICAgIHRoaXMuaCA9IGF0dHJpYnV0ZXMuaCA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuaCkgOiAiIjsKICAgIHRoaXMuaEFsaWduID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaEFsaWduLCBbImxlZnQiLCAiY2VudGVyIiwgImp1c3RpZnkiLCAianVzdGlmeUFsbCIsICJyYWRpeCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sb2NhbGUgPSBhdHRyaWJ1dGVzLmxvY2FsZSB8fCAiIjsKICAgIHRoaXMubWF4SCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWF4SCwgIjBwdCIpOwogICAgdGhpcy5tYXhXID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhXLCAiMHB0Iik7CiAgICB0aGlzLm1pbkggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1pbkgsICIwcHQiKTsKICAgIHRoaXMubWluVyA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWluVywgIjBwdCIpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5wcmVzZW5jZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnByZXNlbmNlLCBbInZpc2libGUiLCAiaGlkZGVuIiwgImluYWN0aXZlIiwgImludmlzaWJsZSJdKTsKICAgIHRoaXMucmVsZXZhbnQgPSBnZXRSZWxldmFudChhdHRyaWJ1dGVzLnJlbGV2YW50KTsKICAgIHRoaXMucm90YXRlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucm90YXRlLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggJSA5MCA9PT0gMAogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy53ID0gYXR0cmlidXRlcy53ID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy53KSA6ICIiOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuYXNzaXN0ID0gbnVsbDsKICAgIHRoaXMuYmluZCA9IG51bGw7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmNhbGN1bGF0ZSA9IG51bGw7CiAgICB0aGlzLmNhcHRpb24gPSBudWxsOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLmZvcm1hdCA9IG51bGw7CiAgICB0aGlzLml0ZW1zID0gbmV3IFhGQU9iamVjdEFycmF5KDIpOwogICAgdGhpcy5rZWVwID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMucGFyYSA9IG51bGw7CiAgICB0aGlzLnRyYXZlcnNhbCA9IG51bGw7CiAgICB0aGlzLnVpID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGUgPSBudWxsOwogICAgdGhpcy52YWx1ZSA9IG51bGw7CiAgICB0aGlzLmJpbmRJdGVtcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb25uZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV2ZW50ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNldFByb3BlcnR5ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogIFskaXNCaW5kYWJsZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIF9zZXRWYWx1ZSh0aGlzLCB2YWx1ZSk7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgc2V0VGFiSW5kZXgodGhpcyk7CiAgICBpZiAoIXRoaXMudWkpIHsKICAgICAgdGhpcy51aSA9IG5ldyBVaSh7fSk7CiAgICAgIHRoaXMudWlbJGdsb2JhbERhdGFdID0gdGhpc1skZ2xvYmFsRGF0YV07CiAgICAgIHRoaXNbJGFwcGVuZENoaWxkXSh0aGlzLnVpKTsKICAgICAgbGV0IG5vZGU7CiAgICAgIHN3aXRjaCAodGhpcy5pdGVtcy5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBub2RlID0gbmV3IFRleHRFZGl0KHt9KTsKICAgICAgICAgIHRoaXMudWkudGV4dEVkaXQgPSBub2RlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgbm9kZSA9IG5ldyBDaGVja0J1dHRvbih7fSk7CiAgICAgICAgICB0aGlzLnVpLmNoZWNrQnV0dG9uID0gbm9kZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIG5vZGUgPSBuZXcgQ2hvaWNlTGlzdCh7fSk7CiAgICAgICAgICB0aGlzLnVpLmNob2ljZUxpc3QgPSBub2RlOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGhpcy51aVskYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgfQogICAgaWYgKCF0aGlzLnVpIHx8IHRoaXMucHJlc2VuY2UgPT09ICJoaWRkZW4iIHx8IHRoaXMucHJlc2VuY2UgPT09ICJpbmFjdGl2ZSIgfHwgdGhpcy5oID09PSAwIHx8IHRoaXMudyA9PT0gMCkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICh0aGlzLmNhcHRpb24pIHsKICAgICAgZGVsZXRlIHRoaXMuY2FwdGlvblskZXh0cmFdOwogICAgfQogICAgdGhpc1skcHVzaFBhcmFdKCk7CiAgICBjb25zdCBjYXB0aW9uID0gdGhpcy5jYXB0aW9uID8gdGhpcy5jYXB0aW9uWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKS5odG1sIDogbnVsbDsKICAgIGNvbnN0IHNhdmVkVyA9IHRoaXMudzsKICAgIGNvbnN0IHNhdmVkSCA9IHRoaXMuaDsKICAgIGxldCBtYXJnaW5IID0gMDsKICAgIGxldCBtYXJnaW5WID0gMDsKICAgIGlmICh0aGlzLm1hcmdpbikgewogICAgICBtYXJnaW5IID0gdGhpcy5tYXJnaW4ubGVmdEluc2V0ICsgdGhpcy5tYXJnaW4ucmlnaHRJbnNldDsKICAgICAgbWFyZ2luViA9IHRoaXMubWFyZ2luLnRvcEluc2V0ICsgdGhpcy5tYXJnaW4uYm90dG9tSW5zZXQ7CiAgICB9CiAgICBsZXQgYm9yZGVyRGltcyA9IG51bGw7CiAgICBpZiAodGhpcy53ID09PSAiIiB8fCB0aGlzLmggPT09ICIiKSB7CiAgICAgIGxldCB3aWR0aCA9IG51bGw7CiAgICAgIGxldCBoZWlnaHQgPSBudWxsOwogICAgICBsZXQgdWlXID0gMDsKICAgICAgbGV0IHVpSCA9IDA7CiAgICAgIGlmICh0aGlzLnVpLmNoZWNrQnV0dG9uKSB7CiAgICAgICAgdWlXID0gdWlIID0gdGhpcy51aS5jaGVja0J1dHRvbi5zaXplOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIHcsCiAgICAgICAgICBoCiAgICAgICAgfSA9IGxheW91dE5vZGUodGhpcywgYXZhaWxhYmxlU3BhY2UpOwogICAgICAgIGlmICh3ICE9PSBudWxsKSB7CiAgICAgICAgICB1aVcgPSB3OwogICAgICAgICAgdWlIID0gaDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdWlIID0gZm9udHNfZ2V0TWV0cmljcyh0aGlzLmZvbnQsIHRydWUpLmxpbmVOb0dhcDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYm9yZGVyRGltcyA9IGdldEJvcmRlckRpbXModGhpcy51aVskZ2V0RXh0cmFdKCkpOwogICAgICB1aVcgKz0gYm9yZGVyRGltcy53OwogICAgICB1aUggKz0gYm9yZGVyRGltcy5oOwogICAgICBpZiAodGhpcy5jYXB0aW9uKSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgdywKICAgICAgICAgIGgsCiAgICAgICAgICBpc0Jyb2tlbgogICAgICAgIH0gPSB0aGlzLmNhcHRpb25bJGdldEV4dHJhXShhdmFpbGFibGVTcGFjZSk7CiAgICAgICAgaWYgKGlzQnJva2VuICYmIHRoaXNbJGdldFN1YmZvcm1QYXJlbnRdKClbJGlzVGhlcmVNb3JlV2lkdGhdKCkpIHsKICAgICAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgICAgIH0KICAgICAgICB3aWR0aCA9IHc7CiAgICAgICAgaGVpZ2h0ID0gaDsKICAgICAgICBzd2l0Y2ggKHRoaXMuY2FwdGlvbi5wbGFjZW1lbnQpIHsKICAgICAgICAgIGNhc2UgImxlZnQiOgogICAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICAgICAgd2lkdGggKz0gdWlXOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInRvcCI6CiAgICAgICAgICBjYXNlICJib3R0b20iOgogICAgICAgICAgICBoZWlnaHQgKz0gdWlIOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2lkdGggPSB1aVc7CiAgICAgICAgaGVpZ2h0ID0gdWlIOwogICAgICB9CiAgICAgIGlmICh3aWR0aCAmJiB0aGlzLncgPT09ICIiKSB7CiAgICAgICAgd2lkdGggKz0gbWFyZ2luSDsKICAgICAgICB0aGlzLncgPSBNYXRoLm1pbih0aGlzLm1heFcgPD0gMCA/IEluZmluaXR5IDogdGhpcy5tYXhXLCB0aGlzLm1pblcgKyAxIDwgd2lkdGggPyB3aWR0aCA6IHRoaXMubWluVyk7CiAgICAgIH0KICAgICAgaWYgKGhlaWdodCAmJiB0aGlzLmggPT09ICIiKSB7CiAgICAgICAgaGVpZ2h0ICs9IG1hcmdpblY7CiAgICAgICAgdGhpcy5oID0gTWF0aC5taW4odGhpcy5tYXhIIDw9IDAgPyBJbmZpbml0eSA6IHRoaXMubWF4SCwgdGhpcy5taW5IICsgMSA8IGhlaWdodCA/IGhlaWdodCA6IHRoaXMubWluSCk7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICBmaXhEaW1lbnNpb25zKHRoaXMpOwogICAgc2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7CiAgICBpZiAoIWNoZWNrRGltZW5zaW9ucyh0aGlzLCBhdmFpbGFibGVTcGFjZSkpIHsKICAgICAgdGhpcy53ID0gc2F2ZWRXOwogICAgICB0aGlzLmggPSBzYXZlZEg7CiAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICB1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJmb250IiwgImRpbWVuc2lvbnMiLCAicG9zaXRpb24iLCAicm90YXRlIiwgImFuY2hvclR5cGUiLCAicHJlc2VuY2UiLCAibWFyZ2luIiwgImhBbGlnbiIpOwogICAgc2V0TWluTWF4RGltZW5zaW9ucyh0aGlzLCBzdHlsZSk7CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFGaWVsZCJdOwogICAgaWYgKHRoaXMuZm9udCkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYUZvbnQiKTsKICAgIH0KICAgIGlmIChpc1ByaW50T25seSh0aGlzKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgc3R5bGUsCiAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICBjbGFzczogY2xhc3NOYW1lcwogICAgfTsKICAgIGlmIChzdHlsZS5tYXJnaW4pIHsKICAgICAgc3R5bGUucGFkZGluZyA9IHN0eWxlLm1hcmdpbjsKICAgICAgZGVsZXRlIHN0eWxlLm1hcmdpbjsKICAgIH0KICAgIHNldEFjY2Vzcyh0aGlzLCBjbGFzc05hbWVzKTsKICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIGNvbnN0IGh0bWwgPSB7CiAgICAgIG5hbWU6ICJkaXYiLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBjaGlsZHJlbgogICAgfTsKICAgIGFwcGx5QXNzaXN0KHRoaXMsIGF0dHJpYnV0ZXMpOwogICAgY29uc3QgYm9yZGVyU3R5bGUgPSB0aGlzLmJvcmRlciA/IHRoaXMuYm9yZGVyWyR0b1N0eWxlXSgpIDogbnVsbDsKICAgIGNvbnN0IGJib3ggPSBjb21wdXRlQmJveCh0aGlzLCBodG1sLCBhdmFpbGFibGVTcGFjZSk7CiAgICBjb25zdCB1aSA9IHRoaXMudWlbJHRvSFRNTF0oKS5odG1sOwogICAgaWYgKCF1aSkgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCBib3JkZXJTdHlsZSk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY3JlYXRlV3JhcHBlcih0aGlzLCBodG1sKSwgYmJveCk7CiAgICB9CiAgICBpZiAodGhpc1skdGFiSW5kZXhdKSB7CiAgICAgIGlmICh1aS5jaGlsZHJlbj8uWzBdKSB7CiAgICAgICAgdWkuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy50YWJpbmRleCA9IHRoaXNbJHRhYkluZGV4XTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1aS5hdHRyaWJ1dGVzLnRhYmluZGV4ID0gdGhpc1skdGFiSW5kZXhdOwogICAgICB9CiAgICB9CiAgICBpZiAoIXVpLmF0dHJpYnV0ZXMuc3R5bGUpIHsKICAgICAgdWkuYXR0cmlidXRlcy5zdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB9CiAgICBsZXQgYUVsZW1lbnQgPSBudWxsOwogICAgaWYgKHRoaXMudWkuYnV0dG9uKSB7CiAgICAgIGlmICh1aS5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHsKICAgICAgICBbYUVsZW1lbnRdID0gdWkuY2hpbGRyZW4uc3BsaWNlKDAsIDEpOwogICAgICB9CiAgICAgIE9iamVjdC5hc3NpZ24odWkuYXR0cmlidXRlcy5zdHlsZSwgYm9yZGVyU3R5bGUpOwogICAgfSBlbHNlIHsKICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgYm9yZGVyU3R5bGUpOwogICAgfQogICAgY2hpbGRyZW4ucHVzaCh1aSk7CiAgICBpZiAodGhpcy52YWx1ZSkgewogICAgICBpZiAodGhpcy51aS5pbWFnZUVkaXQpIHsKICAgICAgICB1aS5jaGlsZHJlbi5wdXNoKHRoaXMudmFsdWVbJHRvSFRNTF0oKS5odG1sKTsKICAgICAgfSBlbHNlIGlmICghdGhpcy51aS5idXR0b24pIHsKICAgICAgICBsZXQgdmFsdWUgPSAiIjsKICAgICAgICBpZiAodGhpcy52YWx1ZS5leERhdGEpIHsKICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZS5leERhdGFbJHRleHRdKCk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlLnRleHQpIHsKICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZS50ZXh0WyRnZXRFeHRyYV0oKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgaHRtbFZhbHVlID0gdGhpcy52YWx1ZVskdG9IVE1MXSgpLmh0bWw7CiAgICAgICAgICBpZiAoaHRtbFZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgICAgIHZhbHVlID0gaHRtbFZhbHVlLmNoaWxkcmVuWzBdLnZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhpcy51aS50ZXh0RWRpdCAmJiB0aGlzLnZhbHVlLnRleHQ/Lm1heENoYXJzKSB7CiAgICAgICAgICB1aS5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLm1heExlbmd0aCA9IHRoaXMudmFsdWUudGV4dC5tYXhDaGFyczsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICBpZiAodGhpcy51aS5udW1lcmljRWRpdCkgewogICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpOwogICAgICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/ICIiIDogdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1aS5jaGlsZHJlblswXS5uYW1lID09PSAidGV4dGFyZWEiKSB7CiAgICAgICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhpcy51aS5pbWFnZUVkaXQgJiYgdWkuY2hpbGRyZW4/LlswXSAmJiB0aGlzLmgpIHsKICAgICAgYm9yZGVyRGltcyA9IGJvcmRlckRpbXMgfHwgZ2V0Qm9yZGVyRGltcyh0aGlzLnVpWyRnZXRFeHRyYV0oKSk7CiAgICAgIGxldCBjYXB0aW9uSGVpZ2h0ID0gMDsKICAgICAgaWYgKHRoaXMuY2FwdGlvbiAmJiBbInRvcCIsICJib3R0b20iXS5pbmNsdWRlcyh0aGlzLmNhcHRpb24ucGxhY2VtZW50KSkgewogICAgICAgIGNhcHRpb25IZWlnaHQgPSB0aGlzLmNhcHRpb24ucmVzZXJ2ZTsKICAgICAgICBpZiAoY2FwdGlvbkhlaWdodCA8PSAwKSB7CiAgICAgICAgICBjYXB0aW9uSGVpZ2h0ID0gdGhpcy5jYXB0aW9uWyRnZXRFeHRyYV0oYXZhaWxhYmxlU3BhY2UpLmg7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGhpcy5oIC0gY2FwdGlvbkhlaWdodCAtIG1hcmdpblYgLSBib3JkZXJEaW1zLmg7CiAgICAgICAgdWkuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy5zdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcoaW5wdXRIZWlnaHQpOwogICAgICB9IGVsc2UgewogICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CiAgICB9CiAgICBpZiAoYUVsZW1lbnQpIHsKICAgICAgdWkuY2hpbGRyZW4ucHVzaChhRWxlbWVudCk7CiAgICB9CiAgICBpZiAoIWNhcHRpb24pIHsKICAgICAgaWYgKHVpLmF0dHJpYnV0ZXMuY2xhc3MpIHsKICAgICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYUxlZnQiKTsKICAgICAgfQogICAgICB0aGlzLncgPSBzYXZlZFc7CiAgICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhjcmVhdGVXcmFwcGVyKHRoaXMsIGh0bWwpLCBiYm94KTsKICAgIH0KICAgIGlmICh0aGlzLnVpLmJ1dHRvbikgewogICAgICBpZiAoc3R5bGUucGFkZGluZykgewogICAgICAgIGRlbGV0ZSBzdHlsZS5wYWRkaW5nOwogICAgICB9CiAgICAgIGlmIChjYXB0aW9uLm5hbWUgPT09ICJkaXYiKSB7CiAgICAgICAgY2FwdGlvbi5uYW1lID0gInNwYW4iOwogICAgICB9CiAgICAgIHVpLmNoaWxkcmVuLnB1c2goY2FwdGlvbik7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoaHRtbCwgYmJveCk7CiAgICB9IGVsc2UgaWYgKHRoaXMudWkuY2hlY2tCdXR0b24pIHsKICAgICAgY2FwdGlvbi5hdHRyaWJ1dGVzLmNsYXNzWzBdID0gInhmYUNhcHRpb25Gb3JDaGVja0J1dHRvbiI7CiAgICB9CiAgICBpZiAoIXVpLmF0dHJpYnV0ZXMuY2xhc3MpIHsKICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcyA9IFtdOwogICAgfQogICAgdWkuY2hpbGRyZW4uc3BsaWNlKDAsIDAsIGNhcHRpb24pOwogICAgc3dpdGNoICh0aGlzLmNhcHRpb24ucGxhY2VtZW50KSB7CiAgICAgIGNhc2UgImxlZnQiOgogICAgICAgIHVpLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhTGVmdCIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFSaWdodCIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ0b3AiOgogICAgICAgIHVpLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhVG9wIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFCb3R0b20iKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYUxlZnQiKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHRoaXMudyA9IHNhdmVkVzsKICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY3JlYXRlV3JhcHBlcih0aGlzLCBodG1sKSwgYmJveCk7CiAgfQp9CmNsYXNzIEZpbGwgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZmlsbCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5saW5lYXIgPSBudWxsOwogICAgdGhpcy5wYXR0ZXJuID0gbnVsbDsKICAgIHRoaXMucmFkaWFsID0gbnVsbDsKICAgIHRoaXMuc29saWQgPSBudWxsOwogICAgdGhpcy5zdGlwcGxlID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdyYW5kcGEgPSBwYXJlbnRbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdncmFuZHBhID0gZ3JhbmRwYVskZ2V0UGFyZW50XSgpOwogICAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IHByb3BOYW1lID0gImNvbG9yIjsKICAgIGxldCBhbHRQcm9wTmFtZSA9IHByb3BOYW1lOwogICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJvcmRlcikgewogICAgICBwcm9wTmFtZSA9ICJiYWNrZ3JvdW5kLWNvbG9yIjsKICAgICAgYWx0UHJvcE5hbWUgPSAiYmFja2dyb3VuZCI7CiAgICAgIGlmIChnZ3JhbmRwYSBpbnN0YW5jZW9mIFVpKSB7CiAgICAgICAgc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIndoaXRlIjsKICAgICAgfQogICAgfQogICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBBcmMpIHsKICAgICAgcHJvcE5hbWUgPSBhbHRQcm9wTmFtZSA9ICJmaWxsIjsKICAgICAgc3R5bGUuZmlsbCA9ICJ3aGl0ZSI7CiAgICB9CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKG5hbWUgPT09ICJleHRyYXMiIHx8IG5hbWUgPT09ICJjb2xvciIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBYRkFPYmplY3QpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgY29sb3IgPSBvYmpbJHRvU3R5bGVdKHRoaXMuY29sb3IpOwogICAgICBpZiAoY29sb3IpIHsKICAgICAgICBzdHlsZVtjb2xvci5zdGFydHNXaXRoKCIjIikgPyBwcm9wTmFtZSA6IGFsdFByb3BOYW1lXSA9IGNvbG9yOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KICAgIGlmICh0aGlzLmNvbG9yPy52YWx1ZSkgewogICAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3JbJHRvU3R5bGVdKCk7CiAgICAgIHN0eWxlW2NvbG9yLnN0YXJ0c1dpdGgoIiMiKSA/IHByb3BOYW1lIDogYWx0UHJvcE5hbWVdID0gY29sb3I7CiAgICB9CiAgICByZXR1cm4gc3R5bGU7CiAgfQp9CmNsYXNzIEZpbHRlciBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmaWx0ZXIiLCB0cnVlKTsKICAgIHRoaXMuYWRkUmV2b2NhdGlvbkluZm8gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hZGRSZXZvY2F0aW9uSW5mbywgWyIiLCAicmVxdWlyZWQiLCAib3B0aW9uYWwiLCAibm9uZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudmVyc2lvbiA9IGdldEludGVnZXIoewogICAgICBkYXRhOiB0aGlzLnZlcnNpb24sCiAgICAgIGRlZmF1bHRWYWx1ZTogNSwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAxICYmIHggPD0gNQogICAgfSk7CiAgICB0aGlzLmFwcGVhcmFuY2VGaWx0ZXIgPSBudWxsOwogICAgdGhpcy5jZXJ0aWZpY2F0ZXMgPSBudWxsOwogICAgdGhpcy5kaWdlc3RNZXRob2RzID0gbnVsbDsKICAgIHRoaXMuZW5jb2RpbmdzID0gbnVsbDsKICAgIHRoaXMuZW5jcnlwdGlvbk1ldGhvZHMgPSBudWxsOwogICAgdGhpcy5oYW5kbGVyID0gbnVsbDsKICAgIHRoaXMubG9ja0RvY3VtZW50ID0gbnVsbDsKICAgIHRoaXMubWRwID0gbnVsbDsKICAgIHRoaXMucmVhc29ucyA9IG51bGw7CiAgICB0aGlzLnRpbWVTdGFtcCA9IG51bGw7CiAgfQp9CmNsYXNzIEZsb2F0IGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmbG9hdCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IG51bWJlciA9IHBhcnNlRmxvYXQodGhpc1skY29udGVudF0udHJpbSgpKTsKICAgIHRoaXNbJGNvbnRlbnRdID0gaXNOYU4obnVtYmVyKSA/IG51bGwgOiBudW1iZXI7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbnRlbnRdICE9PSBudWxsID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgdGVtcGxhdGVfRm9udCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmb250IiwgdHJ1ZSk7CiAgICB0aGlzLmJhc2VsaW5lU2hpZnQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmJhc2VsaW5lU2hpZnQpOwogICAgdGhpcy5mb250SG9yaXpvbnRhbFNjYWxlID0gZ2V0RmxvYXQoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmZvbnRIb3Jpem9udGFsU2NhbGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMTAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5mb250VmVydGljYWxTY2FsZSA9IGdldEZsb2F0KHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5mb250VmVydGljYWxTY2FsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAxMDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMua2VybmluZ01vZGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5rZXJuaW5nTW9kZSwgWyJub25lIiwgInBhaXIiXSk7CiAgICB0aGlzLmxldHRlclNwYWNpbmcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmxldHRlclNwYWNpbmcsICIwIik7CiAgICB0aGlzLmxpbmVUaHJvdWdoID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubGluZVRocm91Z2gsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMSB8fCB4ID09PSAyCiAgICB9KTsKICAgIHRoaXMubGluZVRocm91Z2hQZXJpb2QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5saW5lVGhyb3VnaFBlcmlvZCwgWyJhbGwiLCAid29yZCJdKTsKICAgIHRoaXMub3ZlcmxpbmUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5vdmVybGluZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxIHx8IHggPT09IDIKICAgIH0pOwogICAgdGhpcy5vdmVybGluZVBlcmlvZCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm92ZXJsaW5lUGVyaW9kLCBbImFsbCIsICJ3b3JkIl0pOwogICAgdGhpcy5wb3N0dXJlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucG9zdHVyZSwgWyJub3JtYWwiLCAiaXRhbGljIl0pOwogICAgdGhpcy5zaXplID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5zaXplLCAiMTBwdCIpOwogICAgdGhpcy50eXBlZmFjZSA9IGF0dHJpYnV0ZXMudHlwZWZhY2UgfHwgIkNvdXJpZXIiOwogICAgdGhpcy51bmRlcmxpbmUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy51bmRlcmxpbmUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMSB8fCB4ID09PSAyCiAgICB9KTsKICAgIHRoaXMudW5kZXJsaW5lUGVyaW9kID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudW5kZXJsaW5lUGVyaW9kLCBbImFsbCIsICJ3b3JkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMud2VpZ2h0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMud2VpZ2h0LCBbIm5vcm1hbCIsICJib2xkIl0pOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5maWxsID0gbnVsbDsKICB9CiAgWyRjbGVhbl0oYnVpbGRlcikgewogICAgc3VwZXJbJGNsZWFuXShidWlsZGVyKTsKICAgIHRoaXNbJGdsb2JhbERhdGFdLnVzZWRUeXBlZmFjZXMuYWRkKHRoaXMudHlwZWZhY2UpOwogIH0KICBbJHRvU3R5bGVdKCkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJmaWxsIik7CiAgICBjb25zdCBjb2xvciA9IHN0eWxlLmNvbG9yOwogICAgaWYgKGNvbG9yKSB7CiAgICAgIGlmIChjb2xvciA9PT0gIiMwMDAwMDAiKSB7CiAgICAgICAgZGVsZXRlIHN0eWxlLmNvbG9yOwogICAgICB9IGVsc2UgaWYgKCFjb2xvci5zdGFydHNXaXRoKCIjIikpIHsKICAgICAgICBzdHlsZS5iYWNrZ3JvdW5kID0gY29sb3I7CiAgICAgICAgc3R5bGUuYmFja2dyb3VuZENsaXAgPSAidGV4dCI7CiAgICAgICAgc3R5bGUuY29sb3IgPSAidHJhbnNwYXJlbnQiOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5iYXNlbGluZVNoaWZ0KSB7CiAgICAgIHN0eWxlLnZlcnRpY2FsQWxpZ24gPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5iYXNlbGluZVNoaWZ0KTsKICAgIH0KICAgIHN0eWxlLmZvbnRLZXJuaW5nID0gdGhpcy5rZXJuaW5nTW9kZSA9PT0gIm5vbmUiID8gIm5vbmUiIDogIm5vcm1hbCI7CiAgICBzdHlsZS5sZXR0ZXJTcGFjaW5nID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubGV0dGVyU3BhY2luZyk7CiAgICBpZiAodGhpcy5saW5lVGhyb3VnaCAhPT0gMCkgewogICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICJsaW5lLXRocm91Z2giOwogICAgICBpZiAodGhpcy5saW5lVGhyb3VnaCA9PT0gMikgewogICAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uU3R5bGUgPSAiZG91YmxlIjsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMub3ZlcmxpbmUgIT09IDApIHsKICAgICAgc3R5bGUudGV4dERlY29yYXRpb24gPSAib3ZlcmxpbmUiOwogICAgICBpZiAodGhpcy5vdmVybGluZSA9PT0gMikgewogICAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uU3R5bGUgPSAiZG91YmxlIjsKICAgICAgfQogICAgfQogICAgc3R5bGUuZm9udFN0eWxlID0gdGhpcy5wb3N0dXJlOwogICAgc3R5bGUuZm9udFNpemUgPSBtZWFzdXJlVG9TdHJpbmcoMC45OSAqIHRoaXMuc2l6ZSk7CiAgICBzZXRGb250RmFtaWx5KHRoaXMsIHRoaXMsIHRoaXNbJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIsIHN0eWxlKTsKICAgIGlmICh0aGlzLnVuZGVybGluZSAhPT0gMCkgewogICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICJ1bmRlcmxpbmUiOwogICAgICBpZiAodGhpcy51bmRlcmxpbmUgPT09IDIpIHsKICAgICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvblN0eWxlID0gImRvdWJsZSI7CiAgICAgIH0KICAgIH0KICAgIHN0eWxlLmZvbnRXZWlnaHQgPSB0aGlzLndlaWdodDsKICAgIHJldHVybiBzdHlsZTsKICB9Cn0KY2xhc3MgRm9ybWF0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImZvcm1hdCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICB9Cn0KY2xhc3MgSGFuZGxlciBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJoYW5kbGVyIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBIeXBoZW5hdGlvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJoeXBoZW5hdGlvbiIpOwogICAgdGhpcy5leGNsdWRlQWxsQ2FwcyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmV4Y2x1ZGVBbGxDYXBzLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5leGNsdWRlSW5pdGlhbENhcCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmV4Y2x1ZGVJbml0aWFsQ2FwLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5oeXBoZW5hdGUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5oeXBoZW5hdGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucHVzaENoYXJhY3RlckNvdW50ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucHVzaENoYXJhY3RlckNvdW50LAogICAgICBkZWZhdWx0VmFsdWU6IDMsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLnJlbWFpbkNoYXJhY3RlckNvdW50ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucmVtYWluQ2hhcmFjdGVyQ291bnQsCiAgICAgIGRlZmF1bHRWYWx1ZTogMywKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLndvcmRDaGFyYWN0ZXJDb3VudCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLndvcmRDaGFyYWN0ZXJDb3VudCwKICAgICAgZGVmYXVsdFZhbHVlOiA3LAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogIH0KfQpjbGFzcyBJbWFnZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJpbWFnZSIpOwogICAgdGhpcy5hc3BlY3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hc3BlY3QsIFsiZml0IiwgImFjdHVhbCIsICJoZWlnaHQiLCAibm9uZSIsICJ3aWR0aCJdKTsKICAgIHRoaXMuY29udGVudFR5cGUgPSBhdHRyaWJ1dGVzLmNvbnRlbnRUeXBlIHx8ICIiOwogICAgdGhpcy5ocmVmID0gYXR0cmlidXRlcy5ocmVmIHx8ICIiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnRyYW5zZmVyRW5jb2RpbmcgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50cmFuc2ZlckVuY29kaW5nLCBbImJhc2U2NCIsICJub25lIiwgInBhY2thZ2UiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBpZiAodGhpcy5jb250ZW50VHlwZSAmJiAhTUlNRVMuaGFzKHRoaXMuY29udGVudFR5cGUudG9Mb3dlckNhc2UoKSkpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBsZXQgYnVmZmVyID0gdGhpc1skZ2xvYmFsRGF0YV0uaW1hZ2VzICYmIHRoaXNbJGdsb2JhbERhdGFdLmltYWdlcy5nZXQodGhpcy5ocmVmKTsKICAgIGlmICghYnVmZmVyICYmICh0aGlzLmhyZWYgfHwgIXRoaXNbJGNvbnRlbnRdKSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICghYnVmZmVyICYmIHRoaXMudHJhbnNmZXJFbmNvZGluZyA9PT0gImJhc2U2NCIpIHsKICAgICAgYnVmZmVyID0gZnJvbUJhc2U2NFV0aWwodGhpc1skY29udGVudF0pOwogICAgfQogICAgaWYgKCFidWZmZXIpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBpZiAoIXRoaXMuY29udGVudFR5cGUpIHsKICAgICAgZm9yIChjb25zdCBbaGVhZGVyLCB0eXBlXSBvZiBJTUFHRVNfSEVBREVSUykgewogICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gaGVhZGVyLmxlbmd0aCAmJiBoZWFkZXIuZXZlcnkoKHgsIGkpID0+IHggPT09IGJ1ZmZlcltpXSkpIHsKICAgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSB0eXBlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5jb250ZW50VHlwZSkgewogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgICB9CiAgICB9CiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsKICAgICAgdHlwZTogdGhpcy5jb250ZW50VHlwZQogICAgfSk7CiAgICBsZXQgc3R5bGU7CiAgICBzd2l0Y2ggKHRoaXMuYXNwZWN0KSB7CiAgICAgIGNhc2UgImZpdCI6CiAgICAgIGNhc2UgImFjdHVhbCI6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImhlaWdodCI6CiAgICAgICAgc3R5bGUgPSB7CiAgICAgICAgICBoZWlnaHQ6ICIxMDAlIiwKICAgICAgICAgIG9iamVjdEZpdDogImZpbGwiCiAgICAgICAgfTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibm9uZSI6CiAgICAgICAgc3R5bGUgPSB7CiAgICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgICAgaGVpZ2h0OiAiMTAwJSIsCiAgICAgICAgICBvYmplY3RGaXQ6ICJmaWxsIgogICAgICAgIH07CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIndpZHRoIjoKICAgICAgICBzdHlsZSA9IHsKICAgICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgICBvYmplY3RGaXQ6ICJmaWxsIgogICAgICAgIH07CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImltZyIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFJbWFnZSJdLAogICAgICAgIHN0eWxlLAogICAgICAgIHNyYzogVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKSwKICAgICAgICBhbHQ6IHBhcmVudCA/IGFyaWFMYWJlbChwYXJlbnRbJGdldFBhcmVudF0oKSkgOiBudWxsCiAgICAgIH0KICAgIH0pOwogIH0KfQpjbGFzcyBJbWFnZUVkaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaW1hZ2VFZGl0IiwgdHJ1ZSk7CiAgICB0aGlzLmRhdGEgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5kYXRhLCBbImxpbmsiLCAiZW1iZWQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgaWYgKHRoaXMuZGF0YSA9PT0gImVtYmVkIikgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBjaGlsZHJlbjogW10sCiAgICAgICAgYXR0cmlidXRlczoge30KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICB9Cn0KY2xhc3MgSW50ZWdlciBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaW50ZWdlciIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IG51bWJlciA9IHBhcnNlSW50KHRoaXNbJGNvbnRlbnRdLnRyaW0oKSwgMTApOwogICAgdGhpc1skY29udGVudF0gPSBpc05hTihudW1iZXIpID8gbnVsbCA6IG51bWJlcjsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gdmFsdWVUb0h0bWwodGhpc1skY29udGVudF0gIT09IG51bGwgPyB0aGlzWyRjb250ZW50XS50b1N0cmluZygpIDogIiIpOwogIH0KfQpjbGFzcyBJc3N1ZXJzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImlzc3VlcnMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEl0ZW1zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIml0ZW1zIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy5zYXZlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc2F2ZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBjb25zdCBvdXRwdXQgPSBbXTsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1skZ2V0Q2hpbGRyZW5dKCkpIHsKICAgICAgb3V0cHV0LnB1c2goY2hpbGRbJHRleHRdKCkpOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhvdXRwdXQpOwogIH0KfQpjbGFzcyBLZWVwIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImtlZXAiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgY29uc3Qgb3B0aW9ucyA9IFsibm9uZSIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSJdOwogICAgdGhpcy5pbnRhY3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5pbnRhY3QsIG9wdGlvbnMpOwogICAgdGhpcy5uZXh0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmV4dCwgb3B0aW9ucyk7CiAgICB0aGlzLnByZXZpb3VzID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJldmlvdXMsIG9wdGlvbnMpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9Cn0KY2xhc3MgS2V5VXNhZ2UgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAia2V5VXNhZ2UiKTsKICAgIGNvbnN0IG9wdGlvbnMgPSBbIiIsICJ5ZXMiLCAibm8iXTsKICAgIHRoaXMuY3JsU2lnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmNybFNpZ24sIG9wdGlvbnMpOwogICAgdGhpcy5kYXRhRW5jaXBoZXJtZW50ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZGF0YUVuY2lwaGVybWVudCwgb3B0aW9ucyk7CiAgICB0aGlzLmRlY2lwaGVyT25seSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmRlY2lwaGVyT25seSwgb3B0aW9ucyk7CiAgICB0aGlzLmRpZ2l0YWxTaWduYXR1cmUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5kaWdpdGFsU2lnbmF0dXJlLCBvcHRpb25zKTsKICAgIHRoaXMuZW5jaXBoZXJPbmx5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZW5jaXBoZXJPbmx5LCBvcHRpb25zKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5rZXlBZ3JlZW1lbnQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5rZXlBZ3JlZW1lbnQsIG9wdGlvbnMpOwogICAgdGhpcy5rZXlDZXJ0U2lnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmtleUNlcnRTaWduLCBvcHRpb25zKTsKICAgIHRoaXMua2V5RW5jaXBoZXJtZW50ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMua2V5RW5jaXBoZXJtZW50LCBvcHRpb25zKTsKICAgIHRoaXMubm9uUmVwdWRpYXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5ub25SZXB1ZGlhdGlvbiwgb3B0aW9ucyk7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgTGluZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJsaW5lIiwgdHJ1ZSk7CiAgICB0aGlzLmhhbmQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oYW5kLCBbImV2ZW4iLCAibGVmdCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5zbG9wZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnNsb3BlLCBbIlxcIiwgIi8iXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lZGdlID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKCkgewogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBlZGdlID0gdGhpcy5lZGdlIHx8IG5ldyBFZGdlKHt9KTsKICAgIGNvbnN0IGVkZ2VTdHlsZSA9IGVkZ2VbJHRvU3R5bGVdKCk7CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBjb25zdCB0aGlja25lc3MgPSBlZGdlLnByZXNlbmNlID09PSAidmlzaWJsZSIgPyBlZGdlLnRoaWNrbmVzcyA6IDA7CiAgICBzdHlsZS5zdHJva2VXaWR0aCA9IG1lYXN1cmVUb1N0cmluZyh0aGlja25lc3MpOwogICAgc3R5bGUuc3Ryb2tlID0gZWRnZVN0eWxlLmNvbG9yOwogICAgbGV0IHgxLCB5MSwgeDIsIHkyOwogICAgbGV0IHdpZHRoID0gIjEwMCUiOwogICAgbGV0IGhlaWdodCA9ICIxMDAlIjsKICAgIGlmIChwYXJlbnQudyA8PSB0aGlja25lc3MpIHsKICAgICAgW3gxLCB5MSwgeDIsIHkyXSA9IFsiNTAlIiwgMCwgIjUwJSIsICIxMDAlIl07CiAgICAgIHdpZHRoID0gc3R5bGUuc3Ryb2tlV2lkdGg7CiAgICB9IGVsc2UgaWYgKHBhcmVudC5oIDw9IHRoaWNrbmVzcykgewogICAgICBbeDEsIHkxLCB4MiwgeTJdID0gWzAsICI1MCUiLCAiMTAwJSIsICI1MCUiXTsKICAgICAgaGVpZ2h0ID0gc3R5bGUuc3Ryb2tlV2lkdGg7CiAgICB9IGVsc2UgaWYgKHRoaXMuc2xvcGUgPT09ICJcXCIpIHsKICAgICAgW3gxLCB5MSwgeDIsIHkyXSA9IFswLCAwLCAiMTAwJSIsICIxMDAlIl07CiAgICB9IGVsc2UgewogICAgICBbeDEsIHkxLCB4MiwgeTJdID0gWzAsICIxMDAlIiwgIjEwMCUiLCAwXTsKICAgIH0KICAgIGNvbnN0IGxpbmUgPSB7CiAgICAgIG5hbWU6ICJsaW5lIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgICAgeDEsCiAgICAgICAgeTEsCiAgICAgICAgeDIsCiAgICAgICAgeTIsCiAgICAgICAgc3R5bGUKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN2ZyA9IHsKICAgICAgbmFtZTogInN2ZyIsCiAgICAgIGNoaWxkcmVuOiBbbGluZV0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICB4bWxuczogU1ZHX05TLAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBzdHlsZTogewogICAgICAgICAgb3ZlcmZsb3c6ICJ2aXNpYmxlIgogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGlmIChoYXNNYXJnaW4ocGFyZW50KSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICBkaXNwbGF5OiAiaW5saW5lIiwKICAgICAgICAgICAgd2lkdGg6ICIxMDAlIiwKICAgICAgICAgICAgaGVpZ2h0OiAiMTAwJSIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBbc3ZnXQogICAgICB9KTsKICAgIH0KICAgIHN2Zy5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3Moc3ZnKTsKICB9Cn0KY2xhc3MgTGluZWFyIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImxpbmVhciIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbInRvUmlnaHQiLCAidG9Cb3R0b20iLCAidG9MZWZ0IiwgInRvVG9wIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJHRvU3R5bGVdKHN0YXJ0Q29sb3IpIHsKICAgIHN0YXJ0Q29sb3IgPSBzdGFydENvbG9yID8gc3RhcnRDb2xvclskdG9TdHlsZV0oKSA6ICIjRkZGRkZGIjsKICAgIGNvbnN0IHRyYW5zZiA9IHRoaXMudHlwZS5yZXBsYWNlKC8oW1JCTFRdKS8sICIgJDEiKS50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgZW5kQ29sb3IgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvclskdG9TdHlsZV0oKSA6ICIjMDAwMDAwIjsKICAgIHJldHVybiBgbGluZWFyLWdyYWRpZW50KCR7dHJhbnNmfSwgJHtzdGFydENvbG9yfSwgJHtlbmRDb2xvcn0pYDsKICB9Cn0KY2xhc3MgTG9ja0RvY3VtZW50IGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJsb2NrRG9jdW1lbnQiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSBnZXRTdHJpbmdPcHRpb24odGhpc1skY29udGVudF0sIFsiYXV0byIsICIwIiwgIjEiXSk7CiAgfQp9CmNsYXNzIE1hbmlmZXN0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1hbmlmZXN0IiwgdHJ1ZSk7CiAgICB0aGlzLmFjdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFjdGlvbiwgWyJpbmNsdWRlIiwgImFsbCIsICJleGNsdWRlIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5yZWYgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTWFyZ2luIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1hcmdpbiIsIHRydWUpOwogICAgdGhpcy5ib3R0b21JbnNldCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuYm90dG9tSW5zZXQsICIwIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVmdEluc2V0ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5sZWZ0SW5zZXQsICIwIik7CiAgICB0aGlzLnJpZ2h0SW5zZXQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnJpZ2h0SW5zZXQsICIwIik7CiAgICB0aGlzLnRvcEluc2V0ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy50b3BJbnNldCwgIjAiKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICByZXR1cm4gewogICAgICBtYXJnaW46IG1lYXN1cmVUb1N0cmluZyh0aGlzLnRvcEluc2V0KSArICIgIiArIG1lYXN1cmVUb1N0cmluZyh0aGlzLnJpZ2h0SW5zZXQpICsgIiAiICsgbWVhc3VyZVRvU3RyaW5nKHRoaXMuYm90dG9tSW5zZXQpICsgIiAiICsgbWVhc3VyZVRvU3RyaW5nKHRoaXMubGVmdEluc2V0KQogICAgfTsKICB9Cn0KY2xhc3MgTWRwIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1kcCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnBlcm1pc3Npb25zID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucGVybWlzc2lvbnMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMiwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMSB8fCB4ID09PSAzCiAgICB9KTsKICAgIHRoaXMuc2lnbmF0dXJlVHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnNpZ25hdHVyZVR5cGUsIFsiZmlsbGVyIiwgImF1dGhvciJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIE1lZGl1bSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJtZWRpdW0iKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5pbWFnaW5nQkJveCA9IGdldEJCb3goYXR0cmlidXRlcy5pbWFnaW5nQkJveCk7CiAgICB0aGlzLmxvbmcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmxvbmcpOwogICAgdGhpcy5vcmllbnRhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9yaWVudGF0aW9uLCBbInBvcnRyYWl0IiwgImxhbmRzY2FwZSJdKTsKICAgIHRoaXMuc2hvcnQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnNob3J0KTsKICAgIHRoaXMuc3RvY2sgPSBhdHRyaWJ1dGVzLnN0b2NrIHx8ICIiOwogICAgdGhpcy50cmF5SW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50cmF5SW4sIFsiYXV0byIsICJkZWxlZ2F0ZSIsICJwYWdlRnJvbnQiXSk7CiAgICB0aGlzLnRyYXlPdXQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50cmF5T3V0LCBbImF1dG8iLCAiZGVsZWdhdGUiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBNZXNzYWdlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1lc3NhZ2UiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudGV4dCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBOdW1lcmljRWRpdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJudW1lcmljRWRpdCIsIHRydWUpOwogICAgdGhpcy5oU2Nyb2xsUG9saWN5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaFNjcm9sbFBvbGljeSwgWyJhdXRvIiwgIm9mZiIsICJvbiJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuY29tYiA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJib3JkZXIiLCAiZm9udCIsICJtYXJnaW4iKTsKICAgIGNvbnN0IGZpZWxkID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiaW5wdXQiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgIGZpZWxkSWQ6IGZpZWxkWyR1aWRdLAogICAgICAgIGRhdGFJZDogZmllbGRbJGRhdGFdPy5bJHVpZF0gfHwgZmllbGRbJHVpZF0sCiAgICAgICAgY2xhc3M6IFsieGZhVGV4dGZpZWxkIl0sCiAgICAgICAgc3R5bGUsCiAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICJhcmlhLXJlcXVpcmVkIjogZmFsc2UKICAgICAgfQogICAgfTsKICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImxhYmVsIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbInhmYUxhYmVsIl0KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtodG1sXQogICAgfSk7CiAgfQp9CmNsYXNzIE9jY3VyIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm9jY3VyIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMuaW5pdGlhbCA9IGF0dHJpYnV0ZXMuaW5pdGlhbCAhPT0gIiIgPyBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5pbml0aWFsLAogICAgICBkZWZhdWx0VmFsdWU6ICIiLAogICAgICB2YWxpZGF0ZTogeCA9PiB0cnVlCiAgICB9KSA6ICIiOwogICAgdGhpcy5tYXggPSBhdHRyaWJ1dGVzLm1heCAhPT0gIiIgPyBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5tYXgsCiAgICAgIGRlZmF1bHRWYWx1ZTogMSwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSkgOiAiIjsKICAgIHRoaXMubWluID0gYXR0cmlidXRlcy5taW4gIT09ICIiID8gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubWluLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pIDogIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJGNsZWFuXSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IG9yaWdpbmFsTWluID0gdGhpcy5taW47CiAgICBpZiAodGhpcy5taW4gPT09ICIiKSB7CiAgICAgIHRoaXMubWluID0gcGFyZW50IGluc3RhbmNlb2YgUGFnZUFyZWEgfHwgcGFyZW50IGluc3RhbmNlb2YgUGFnZVNldCA/IDAgOiAxOwogICAgfQogICAgaWYgKHRoaXMubWF4ID09PSAiIikgewogICAgICBpZiAob3JpZ2luYWxNaW4gPT09ICIiKSB7CiAgICAgICAgdGhpcy5tYXggPSBwYXJlbnQgaW5zdGFuY2VvZiBQYWdlQXJlYSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBQYWdlU2V0ID8gLTEgOiAxOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMubWF4ID0gdGhpcy5taW47CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzLm1heCAhPT0gLTEgJiYgdGhpcy5tYXggPCB0aGlzLm1pbikgewogICAgICB0aGlzLm1heCA9IHRoaXMubWluOwogICAgfQogICAgaWYgKHRoaXMuaW5pdGlhbCA9PT0gIiIpIHsKICAgICAgdGhpcy5pbml0aWFsID0gcGFyZW50IGluc3RhbmNlb2YgVGVtcGxhdGUgPyAxIDogdGhpcy5taW47CiAgICB9CiAgfQp9CmNsYXNzIE9pZCBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJvaWQiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgT2lkcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJvaWRzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5vaWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgT3ZlcmZsb3cgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAib3ZlcmZsb3ciKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sZWFkZXIgPSBhdHRyaWJ1dGVzLmxlYWRlciB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnRyYWlsZXIgPSBhdHRyaWJ1dGVzLnRyYWlsZXIgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGdldEV4dHJhXSgpIHsKICAgIGlmICghdGhpc1skZXh0cmFdKSB7CiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgICAgY29uc3Qgcm9vdCA9IHRoaXNbJGdldFRlbXBsYXRlUm9vdF0oKTsKICAgICAgY29uc3QgdGFyZ2V0ID0gcm9vdFskc2VhcmNoTm9kZV0odGhpcy50YXJnZXQsIHBhcmVudCk7CiAgICAgIGNvbnN0IGxlYWRlciA9IHJvb3RbJHNlYXJjaE5vZGVdKHRoaXMubGVhZGVyLCBwYXJlbnQpOwogICAgICBjb25zdCB0cmFpbGVyID0gcm9vdFskc2VhcmNoTm9kZV0odGhpcy50cmFpbGVyLCBwYXJlbnQpOwogICAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgICAgdGFyZ2V0OiB0YXJnZXQ/LlswXSB8fCBudWxsLAogICAgICAgIGxlYWRlcjogbGVhZGVyPy5bMF0gfHwgbnVsbCwKICAgICAgICB0cmFpbGVyOiB0cmFpbGVyPy5bMF0gfHwgbnVsbCwKICAgICAgICBhZGRMZWFkZXI6IGZhbHNlLAogICAgICAgIGFkZFRyYWlsZXI6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gdGhpc1skZXh0cmFdOwogIH0KfQpjbGFzcyBQYWdlQXJlYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwYWdlQXJlYSIsIHRydWUpOwogICAgdGhpcy5ibGFua09yTm90QmxhbmsgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5ibGFua09yTm90QmxhbmssIFsiYW55IiwgImJsYW5rIiwgIm5vdEJsYW5rIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmluaXRpYWxOdW1iZXIgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5pbml0aWFsTnVtYmVyLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5udW1iZXJlZCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm51bWJlcmVkLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pOwogICAgdGhpcy5vZGRPckV2ZW4gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5vZGRPckV2ZW4sIFsiYW55IiwgImV2ZW4iLCAib2RkIl0pOwogICAgdGhpcy5wYWdlUG9zaXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wYWdlUG9zaXRpb24sIFsiYW55IiwgImZpcnN0IiwgImxhc3QiLCAib25seSIsICJyZXN0Il0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1lZGl1bSA9IG51bGw7CiAgICB0aGlzLm9jY3VyID0gbnVsbDsKICAgIHRoaXMuYXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb250ZW50QXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kcmF3ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4Y2xHcm91cCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWVsZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogIFskaXNVc2FibGVdKCkgewogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgdGhpc1skZXh0cmFdID0gewogICAgICAgIG51bWJlck9mVXNlOiAwCiAgICAgIH07CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuICF0aGlzLm9jY3VyIHx8IHRoaXMub2NjdXIubWF4ID09PSAtMSB8fCB0aGlzWyRleHRyYV0ubnVtYmVyT2ZVc2UgPCB0aGlzLm9jY3VyLm1heDsKICB9CiAgWyRjbGVhblBhZ2VdKCkgewogICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICB9CiAgWyRnZXROZXh0UGFnZV0oKSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgICAgbnVtYmVyT2ZVc2U6IDAKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQucmVsYXRpb24gPT09ICJvcmRlcmVkT2NjdXJyZW5jZSIpIHsKICAgICAgaWYgKHRoaXNbJGlzVXNhYmxlXSgpKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLm51bWJlck9mVXNlICs9IDE7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwYXJlbnRbJGdldE5leHRQYWdlXSgpOwogIH0KICBbJGdldEF2YWlsYWJsZVNwYWNlXSgpIHsKICAgIHJldHVybiB0aGlzWyRleHRyYV0uc3BhY2UgfHwgewogICAgICB3aWR0aDogMCwKICAgICAgaGVpZ2h0OiAwCiAgICB9OwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgICAgbnVtYmVyT2ZVc2U6IDEKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICB0aGlzWyRleHRyYV0uY2hpbGRyZW4gPSBjaGlsZHJlbjsKICAgIGNvbnN0IHN0eWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmICh0aGlzLm1lZGl1bSAmJiB0aGlzLm1lZGl1bS5zaG9ydCAmJiB0aGlzLm1lZGl1bS5sb25nKSB7CiAgICAgIHN0eWxlLndpZHRoID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubWVkaXVtLnNob3J0KTsKICAgICAgc3R5bGUuaGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubWVkaXVtLmxvbmcpOwogICAgICB0aGlzWyRleHRyYV0uc3BhY2UgPSB7CiAgICAgICAgd2lkdGg6IHRoaXMubWVkaXVtLnNob3J0LAogICAgICAgIGhlaWdodDogdGhpcy5tZWRpdW0ubG9uZwogICAgICB9OwogICAgICBpZiAodGhpcy5tZWRpdW0ub3JpZW50YXRpb24gPT09ICJsYW5kc2NhcGUiKSB7CiAgICAgICAgY29uc3QgeCA9IHN0eWxlLndpZHRoOwogICAgICAgIHN0eWxlLndpZHRoID0gc3R5bGUuaGVpZ2h0OwogICAgICAgIHN0eWxlLmhlaWdodCA9IHg7CiAgICAgICAgdGhpc1skZXh0cmFdLnNwYWNlID0gewogICAgICAgICAgd2lkdGg6IHRoaXMubWVkaXVtLmxvbmcsCiAgICAgICAgICBoZWlnaHQ6IHRoaXMubWVkaXVtLnNob3J0CiAgICAgICAgfTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd2FybigiWEZBIC0gTm8gbWVkaXVtIHNwZWNpZmllZCBpbiBwYWdlQXJlYTogcGxlYXNlIGZpbGUgYSBidWcuIik7CiAgICB9CiAgICB0aGlzWyRjaGlsZHJlblRvSFRNTF0oewogICAgICBmaWx0ZXI6IG5ldyBTZXQoWyJhcmVhIiwgImRyYXciLCAiZmllbGQiLCAic3ViZm9ybSJdKSwKICAgICAgaW5jbHVkZTogdHJ1ZQogICAgfSk7CiAgICB0aGlzWyRjaGlsZHJlblRvSFRNTF0oewogICAgICBmaWx0ZXI6IG5ldyBTZXQoWyJjb250ZW50QXJlYSJdKSwKICAgICAgaW5jbHVkZTogdHJ1ZQogICAgfSk7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGNoaWxkcmVuLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhUGFnZSJdLAogICAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICAgIHN0eWxlLAogICAgICAgIHhmYU5hbWU6IHRoaXMubmFtZQogICAgICB9CiAgICB9KTsKICB9Cn0KY2xhc3MgUGFnZVNldCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwYWdlU2V0IiwgdHJ1ZSk7CiAgICB0aGlzLmR1cGxleEltcG9zaXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5kdXBsZXhJbXBvc2l0aW9uLCBbImxvbmdFZGdlIiwgInNob3J0RWRnZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5yZWxhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnJlbGF0aW9uLCBbIm9yZGVyZWRPY2N1cnJlbmNlIiwgImR1cGxleFBhZ2luYXRlZCIsICJzaW1wbGV4UGFnaW5hdGVkIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMub2NjdXIgPSBudWxsOwogICAgdGhpcy5wYWdlQXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYWdlU2V0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogIFskY2xlYW5QYWdlXSgpIHsKICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuKSB7CiAgICAgIHBhZ2VbJGNsZWFuUGFnZV0oKTsKICAgIH0KICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VTZXQuY2hpbGRyZW4pIHsKICAgICAgcGFnZVskY2xlYW5QYWdlXSgpOwogICAgfQogIH0KICBbJGlzVXNhYmxlXSgpIHsKICAgIHJldHVybiAhdGhpcy5vY2N1ciB8fCB0aGlzLm9jY3VyLm1heCA9PT0gLTEgfHwgdGhpc1skZXh0cmFdLm51bWJlck9mVXNlIDwgdGhpcy5vY2N1ci5tYXg7CiAgfQogIFskZ2V0TmV4dFBhZ2VdKCkgewogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgdGhpc1skZXh0cmFdID0gewogICAgICAgIG51bWJlck9mVXNlOiAxLAogICAgICAgIHBhZ2VJbmRleDogLTEsCiAgICAgICAgcGFnZVNldEluZGV4OiAtMQogICAgICB9OwogICAgfQogICAgaWYgKHRoaXMucmVsYXRpb24gPT09ICJvcmRlcmVkT2NjdXJyZW5jZSIpIHsKICAgICAgaWYgKHRoaXNbJGV4dHJhXS5wYWdlSW5kZXggKyAxIDwgdGhpcy5wYWdlQXJlYS5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICB0aGlzWyRleHRyYV0ucGFnZUluZGV4ICs9IDE7CiAgICAgICAgY29uc3QgcGFnZUFyZWEgPSB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuW3RoaXNbJGV4dHJhXS5wYWdlSW5kZXhdOwogICAgICAgIHJldHVybiBwYWdlQXJlYVskZ2V0TmV4dFBhZ2VdKCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXNbJGV4dHJhXS5wYWdlU2V0SW5kZXggKyAxIDwgdGhpcy5wYWdlU2V0LmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHRoaXNbJGV4dHJhXS5wYWdlU2V0SW5kZXggKz0gMTsKICAgICAgICByZXR1cm4gdGhpcy5wYWdlU2V0LmNoaWxkcmVuW3RoaXNbJGV4dHJhXS5wYWdlU2V0SW5kZXhdWyRnZXROZXh0UGFnZV0oKTsKICAgICAgfQogICAgICBpZiAodGhpc1skaXNVc2FibGVdKCkpIHsKICAgICAgICB0aGlzWyRleHRyYV0ubnVtYmVyT2ZVc2UgKz0gMTsKICAgICAgICB0aGlzWyRleHRyYV0ucGFnZUluZGV4ID0gLTE7CiAgICAgICAgdGhpc1skZXh0cmFdLnBhZ2VTZXRJbmRleCA9IC0xOwogICAgICAgIHJldHVybiB0aGlzWyRnZXROZXh0UGFnZV0oKTsKICAgICAgfQogICAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBQYWdlU2V0KSB7CiAgICAgICAgcmV0dXJuIHBhcmVudFskZ2V0TmV4dFBhZ2VdKCk7CiAgICAgIH0KICAgICAgdGhpc1skY2xlYW5QYWdlXSgpOwogICAgICByZXR1cm4gdGhpc1skZ2V0TmV4dFBhZ2VdKCk7CiAgICB9CiAgICBjb25zdCBwYWdlTnVtYmVyID0gdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ucGFnZU51bWJlcjsKICAgIGNvbnN0IHBhcml0eSA9IHBhZ2VOdW1iZXIgJSAyID09PSAwID8gImV2ZW4iIDogIm9kZCI7CiAgICBjb25zdCBwb3NpdGlvbiA9IHBhZ2VOdW1iZXIgPT09IDAgPyAiZmlyc3QiIDogInJlc3QiOwogICAgbGV0IHBhZ2UgPSB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuLmZpbmQocCA9PiBwLm9kZE9yRXZlbiA9PT0gcGFyaXR5ICYmIHAucGFnZVBvc2l0aW9uID09PSBwb3NpdGlvbik7CiAgICBpZiAocGFnZSkgewogICAgICByZXR1cm4gcGFnZTsKICAgIH0KICAgIHBhZ2UgPSB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuLmZpbmQocCA9PiBwLm9kZE9yRXZlbiA9PT0gImFueSIgJiYgcC5wYWdlUG9zaXRpb24gPT09IHBvc2l0aW9uKTsKICAgIGlmIChwYWdlKSB7CiAgICAgIHJldHVybiBwYWdlOwogICAgfQogICAgcGFnZSA9IHRoaXMucGFnZUFyZWEuY2hpbGRyZW4uZmluZChwID0+IHAub2RkT3JFdmVuID09PSAiYW55IiAmJiBwLnBhZ2VQb3NpdGlvbiA9PT0gImFueSIpOwogICAgaWYgKHBhZ2UpIHsKICAgICAgcmV0dXJuIHBhZ2U7CiAgICB9CiAgICByZXR1cm4gdGhpcy5wYWdlQXJlYS5jaGlsZHJlblswXTsKICB9Cn0KY2xhc3MgUGFyYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwYXJhIiwgdHJ1ZSk7CiAgICB0aGlzLmhBbGlnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhBbGlnbiwgWyJsZWZ0IiwgImNlbnRlciIsICJqdXN0aWZ5IiwgImp1c3RpZnlBbGwiLCAicmFkaXgiLCAicmlnaHQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGluZUhlaWdodCA9IGF0dHJpYnV0ZXMubGluZUhlaWdodCA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubGluZUhlaWdodCwgIjBwdCIpIDogIiI7CiAgICB0aGlzLm1hcmdpbkxlZnQgPSBhdHRyaWJ1dGVzLm1hcmdpbkxlZnQgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1hcmdpbkxlZnQsICIwcHQiKSA6ICIiOwogICAgdGhpcy5tYXJnaW5SaWdodCA9IGF0dHJpYnV0ZXMubWFyZ2luUmlnaHQgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1hcmdpblJpZ2h0LCAiMHB0IikgOiAiIjsKICAgIHRoaXMub3JwaGFucyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm9ycGhhbnMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMucHJlc2VydmUgPSBhdHRyaWJ1dGVzLnByZXNlcnZlIHx8ICIiOwogICAgdGhpcy5yYWRpeE9mZnNldCA9IGF0dHJpYnV0ZXMucmFkaXhPZmZzZXQgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnJhZGl4T2Zmc2V0LCAiMHB0IikgOiAiIjsKICAgIHRoaXMuc3BhY2VBYm92ZSA9IGF0dHJpYnV0ZXMuc3BhY2VBYm92ZSA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuc3BhY2VBYm92ZSwgIjBwdCIpIDogIiI7CiAgICB0aGlzLnNwYWNlQmVsb3cgPSBhdHRyaWJ1dGVzLnNwYWNlQmVsb3cgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnNwYWNlQmVsb3csICIwcHQiKSA6ICIiOwogICAgdGhpcy50YWJEZWZhdWx0ID0gYXR0cmlidXRlcy50YWJEZWZhdWx0ID8gZ2V0TWVhc3VyZW1lbnQodGhpcy50YWJEZWZhdWx0KSA6ICIiOwogICAgdGhpcy50YWJTdG9wcyA9IChhdHRyaWJ1dGVzLnRhYlN0b3BzIHx8ICIiKS50cmltKCkuc3BsaXQoL1xzKy8pLm1hcCgoeCwgaSkgPT4gaSAlIDIgPT09IDEgPyBnZXRNZWFzdXJlbWVudCh4KSA6IHgpOwogICAgdGhpcy50ZXh0SW5kZW50ID0gYXR0cmlidXRlcy50ZXh0SW5kZW50ID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy50ZXh0SW5kZW50LCAiMHB0IikgOiAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnZBbGlnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnZBbGlnbiwgWyJ0b3AiLCAiYm90dG9tIiwgIm1pZGRsZSJdKTsKICAgIHRoaXMud2lkb3dzID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMud2lkb3dzLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmh5cGhlbmF0aW9uID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAiaEFsaWduIik7CiAgICBpZiAodGhpcy5tYXJnaW5MZWZ0ICE9PSAiIikgewogICAgICBzdHlsZS5wYWRkaW5nTGVmdCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLm1hcmdpbkxlZnQpOwogICAgfQogICAgaWYgKHRoaXMubWFyZ2luUmlnaHQgIT09ICIiKSB7CiAgICAgIHN0eWxlLnBhZGRpbmdSaWdodCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLm1hcmdpblJpZ2h0KTsKICAgIH0KICAgIGlmICh0aGlzLnNwYWNlQWJvdmUgIT09ICIiKSB7CiAgICAgIHN0eWxlLnBhZGRpbmdUb3AgPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5zcGFjZUFib3ZlKTsKICAgIH0KICAgIGlmICh0aGlzLnNwYWNlQmVsb3cgIT09ICIiKSB7CiAgICAgIHN0eWxlLnBhZGRpbmdCb3R0b20gPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5zcGFjZUJlbG93KTsKICAgIH0KICAgIGlmICh0aGlzLnRleHRJbmRlbnQgIT09ICIiKSB7CiAgICAgIHN0eWxlLnRleHRJbmRlbnQgPSBtZWFzdXJlVG9TdHJpbmcodGhpcy50ZXh0SW5kZW50KTsKICAgICAgZml4VGV4dEluZGVudChzdHlsZSk7CiAgICB9CiAgICBpZiAodGhpcy5saW5lSGVpZ2h0ID4gMCkgewogICAgICBzdHlsZS5saW5lSGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubGluZUhlaWdodCk7CiAgICB9CiAgICBpZiAodGhpcy50YWJEZWZhdWx0ICE9PSAiIikgewogICAgICBzdHlsZS50YWJTaXplID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMudGFiRGVmYXVsdCk7CiAgICB9CiAgICBpZiAodGhpcy50YWJTdG9wcy5sZW5ndGggPiAwKSB7fQogICAgaWYgKHRoaXMuaHlwaGVuYXRhdGlvbikgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB0aGlzLmh5cGhlbmF0YXRpb25bJHRvU3R5bGVdKCkpOwogICAgfQogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBQYXNzd29yZEVkaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicGFzc3dvcmRFZGl0IiwgdHJ1ZSk7CiAgICB0aGlzLmhTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oU2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnBhc3N3b3JkQ2hhciA9IGF0dHJpYnV0ZXMucGFzc3dvcmRDaGFyIHx8ICIqIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQp9CmNsYXNzIHRlbXBsYXRlX1BhdHRlcm4gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicGF0dGVybiIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbImNyb3NzSGF0Y2giLCAiY3Jvc3NEaWFnb25hbCIsICJkaWFnb25hbExlZnQiLCAiZGlhZ29uYWxSaWdodCIsICJob3Jpem9udGFsIiwgInZlcnRpY2FsIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJHRvU3R5bGVdKHN0YXJ0Q29sb3IpIHsKICAgIHN0YXJ0Q29sb3IgPSBzdGFydENvbG9yID8gc3RhcnRDb2xvclskdG9TdHlsZV0oKSA6ICIjRkZGRkZGIjsKICAgIGNvbnN0IGVuZENvbG9yID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3JbJHRvU3R5bGVdKCkgOiAiIzAwMDAwMCI7CiAgICBjb25zdCB3aWR0aCA9IDU7CiAgICBjb25zdCBjbWQgPSAicmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCI7CiAgICBjb25zdCBjb2xvcnMgPSBgJHtzdGFydENvbG9yfSwke3N0YXJ0Q29sb3J9ICR7d2lkdGh9cHgsJHtlbmRDb2xvcn0gJHt3aWR0aH1weCwke2VuZENvbG9yfSAkezIgKiB3aWR0aH1weGA7CiAgICBzd2l0Y2ggKHRoaXMudHlwZSkgewogICAgICBjYXNlICJjcm9zc0hhdGNoIjoKICAgICAgICByZXR1cm4gYCR7Y21kfSh0byB0b3AsJHtjb2xvcnN9KSAke2NtZH0odG8gcmlnaHQsJHtjb2xvcnN9KWA7CiAgICAgIGNhc2UgImNyb3NzRGlhZ29uYWwiOgogICAgICAgIHJldHVybiBgJHtjbWR9KDQ1ZGVnLCR7Y29sb3JzfSkgJHtjbWR9KC00NWRlZywke2NvbG9yc30pYDsKICAgICAgY2FzZSAiZGlhZ29uYWxMZWZ0IjoKICAgICAgICByZXR1cm4gYCR7Y21kfSg0NWRlZywke2NvbG9yc30pYDsKICAgICAgY2FzZSAiZGlhZ29uYWxSaWdodCI6CiAgICAgICAgcmV0dXJuIGAke2NtZH0oLTQ1ZGVnLCR7Y29sb3JzfSlgOwogICAgICBjYXNlICJob3Jpem9udGFsIjoKICAgICAgICByZXR1cm4gYCR7Y21kfSh0byB0b3AsJHtjb2xvcnN9KWA7CiAgICAgIGNhc2UgInZlcnRpY2FsIjoKICAgICAgICByZXR1cm4gYCR7Y21kfSh0byByaWdodCwke2NvbG9yc30pYDsKICAgIH0KICAgIHJldHVybiAiIjsKICB9Cn0KY2xhc3MgUGljdHVyZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwaWN0dXJlIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFByb3RvIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInByb3RvIiwgdHJ1ZSk7CiAgICB0aGlzLmFwcGVhcmFuY2VGaWx0ZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYXJjID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmFyZWEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYXNzaXN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJhcmNvZGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYmluZEl0ZW1zID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJvb2tlbmQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYm9vbGVhbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5ib3JkZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWsgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWtBZnRlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5icmVha0JlZm9yZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5idXR0b24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2FsY3VsYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNhcHRpb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2VydGlmaWNhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2VydGlmaWNhdGVzID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNoZWNrQnV0dG9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNob2ljZUxpc3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29sb3IgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29tYiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb25uZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNvbnRlbnRBcmVhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNvcm5lciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGVUaW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGVUaW1lRWRpdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlZmF1bHRVaSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZXNjID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRpZ2VzdE1ldGhvZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kaWdlc3RNZXRob2RzID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRyYXcgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZWRnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNvZGluZyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNvZGluZ3MgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZW5jcnlwdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNyeXB0RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNyeXB0aW9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmVuY3J5cHRpb25NZXRob2QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZW5jcnlwdGlvbk1ldGhvZHMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXZlbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhEYXRhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4T2JqZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4Y2xHcm91cCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leGVjdXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4dHJhcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWVsZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWxsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZpbHRlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mb250ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZvcm1hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5oYW5kbGVyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmh5cGhlbmF0aW9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlRWRpdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmlzc3VlcnMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaXRlbXMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMua2VlcCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5rZXlVc2FnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5saW5lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmxpbmVhciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5sb2NrRG9jdW1lbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWFuaWZlc3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWFyZ2luID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm1kcCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5tZWRpdW0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWVzc2FnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5udW1lcmljRWRpdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5vY2N1ciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5vaWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMub2lkcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5vdmVyZmxvdyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYWdlQXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYWdlU2V0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBhcmEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGFzc3dvcmRFZGl0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBhdHRlcm4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGljdHVyZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5yYWRpYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucmVhc29uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnJlYXNvbnMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucmVjdGFuZ2xlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnJlZiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zY3JpcHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2V0UHJvcGVydHkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2lnbkRhdGEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2lnbmF0dXJlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNpZ25pbmcgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc29saWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3BlYWsgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3RpcHBsZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm1TZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViamVjdEROID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmplY3RETnMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3VibWl0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGV4dEVkaXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50aW1lU3RhbXAgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudG9vbFRpcCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50cmF2ZXJzYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudHJhdmVyc2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudWkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudmFsaWRhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudmFsdWUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudmFyaWFibGVzID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIFJhZGlhbCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJyYWRpYWwiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJ0b0VkZ2UiLCAidG9DZW50ZXIiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oc3RhcnRDb2xvcikgewogICAgc3RhcnRDb2xvciA9IHN0YXJ0Q29sb3IgPyBzdGFydENvbG9yWyR0b1N0eWxlXSgpIDogIiNGRkZGRkYiOwogICAgY29uc3QgZW5kQ29sb3IgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvclskdG9TdHlsZV0oKSA6ICIjMDAwMDAwIjsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMudHlwZSA9PT0gInRvRWRnZSIgPyBgJHtzdGFydENvbG9yfSwke2VuZENvbG9yfWAgOiBgJHtlbmRDb2xvcn0sJHtzdGFydENvbG9yfWA7CiAgICByZXR1cm4gYHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgY2VudGVyLCAke2NvbG9yc30pYDsKICB9Cn0KY2xhc3MgUmVhc29uIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInJlYXNvbiIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBSZWFzb25zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInJlYXNvbnMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnJlYXNvbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBSZWN0YW5nbGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicmVjdGFuZ2xlIiwgdHJ1ZSk7CiAgICB0aGlzLmhhbmQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oYW5kLCBbImV2ZW4iLCAibGVmdCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29ybmVyID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5lZGdlID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogICAgdGhpcy5maWxsID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKCkgewogICAgY29uc3QgZWRnZSA9IHRoaXMuZWRnZS5jaGlsZHJlbi5sZW5ndGggPyB0aGlzLmVkZ2UuY2hpbGRyZW5bMF0gOiBuZXcgRWRnZSh7fSk7CiAgICBjb25zdCBlZGdlU3R5bGUgPSBlZGdlWyR0b1N0eWxlXSgpOwogICAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKHRoaXMuZmlsbD8ucHJlc2VuY2UgPT09ICJ2aXNpYmxlIikgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB0aGlzLmZpbGxbJHRvU3R5bGVdKCkpOwogICAgfSBlbHNlIHsKICAgICAgc3R5bGUuZmlsbCA9ICJ0cmFuc3BhcmVudCI7CiAgICB9CiAgICBzdHlsZS5zdHJva2VXaWR0aCA9IG1lYXN1cmVUb1N0cmluZyhlZGdlLnByZXNlbmNlID09PSAidmlzaWJsZSIgPyBlZGdlLnRoaWNrbmVzcyA6IDApOwogICAgc3R5bGUuc3Ryb2tlID0gZWRnZVN0eWxlLmNvbG9yOwogICAgY29uc3QgY29ybmVyID0gdGhpcy5jb3JuZXIuY2hpbGRyZW4ubGVuZ3RoID8gdGhpcy5jb3JuZXIuY2hpbGRyZW5bMF0gOiBuZXcgQ29ybmVyKHt9KTsKICAgIGNvbnN0IGNvcm5lclN0eWxlID0gY29ybmVyWyR0b1N0eWxlXSgpOwogICAgY29uc3QgcmVjdCA9IHsKICAgICAgbmFtZTogInJlY3QiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgeG1sbnM6IFNWR19OUywKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjEwMCUiLAogICAgICAgIHg6IDAsCiAgICAgICAgeTogMCwKICAgICAgICByeDogY29ybmVyU3R5bGUucmFkaXVzLAogICAgICAgIHJ5OiBjb3JuZXJTdHlsZS5yYWRpdXMsCiAgICAgICAgc3R5bGUKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN2ZyA9IHsKICAgICAgbmFtZTogInN2ZyIsCiAgICAgIGNoaWxkcmVuOiBbcmVjdF0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICB4bWxuczogU1ZHX05TLAogICAgICAgIHN0eWxlOiB7CiAgICAgICAgICBvdmVyZmxvdzogInZpc2libGUiCiAgICAgICAgfSwKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjEwMCUiCiAgICAgIH0KICAgIH07CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKClbJGdldFBhcmVudF0oKTsKICAgIGlmIChoYXNNYXJnaW4ocGFyZW50KSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICBkaXNwbGF5OiAiaW5saW5lIiwKICAgICAgICAgICAgd2lkdGg6ICIxMDAlIiwKICAgICAgICAgICAgaGVpZ2h0OiAiMTAwJSIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBbc3ZnXQogICAgICB9KTsKICAgIH0KICAgIHN2Zy5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3Moc3ZnKTsKICB9Cn0KY2xhc3MgUmVmRWxlbWVudCBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJyZWYiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgU2NyaXB0IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNjcmlwdCIpOwogICAgdGhpcy5iaW5kaW5nID0gYXR0cmlidXRlcy5iaW5kaW5nIHx8ICIiOwogICAgdGhpcy5jb250ZW50VHlwZSA9IGF0dHJpYnV0ZXMuY29udGVudFR5cGUgfHwgIiI7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucnVuQXQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5ydW5BdCwgWyJjbGllbnQiLCAiYm90aCIsICJzZXJ2ZXIiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBTZXRQcm9wZXJ0eSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzZXRQcm9wZXJ0eSIpOwogICAgdGhpcy5jb25uZWN0aW9uID0gYXR0cmlidXRlcy5jb25uZWN0aW9uIHx8ICIiOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgfQp9CmNsYXNzIFNpZ25EYXRhIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNpZ25EYXRhIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMub3BlcmF0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMub3BlcmF0aW9uLCBbInNpZ24iLCAiY2xlYXIiLCAidmVyaWZ5Il0pOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5maWx0ZXIgPSBudWxsOwogICAgdGhpcy5tYW5pZmVzdCA9IG51bGw7CiAgfQp9CmNsYXNzIFNpZ25hdHVyZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzaWduYXR1cmUiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJQREYxLjMiLCAiUERGMS42Il0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKICAgIHRoaXMubWFuaWZlc3QgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KfQpjbGFzcyBTaWduaW5nIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNpZ25pbmciLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIFNvbGlkIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNvbGlkIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oc3RhcnRDb2xvcikgewogICAgcmV0dXJuIHN0YXJ0Q29sb3IgPyBzdGFydENvbG9yWyR0b1N0eWxlXSgpIDogIiNGRkZGRkYiOwogIH0KfQpjbGFzcyBTcGVhayBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzcGVhayIpOwogICAgdGhpcy5kaXNhYmxlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZGlzYWJsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5wcmlvcml0eSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnByaW9yaXR5LCBbImN1c3RvbSIsICJjYXB0aW9uIiwgIm5hbWUiLCAidG9vbFRpcCJdKTsKICAgIHRoaXMucmlkID0gYXR0cmlidXRlcy5yaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBTdGlwcGxlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInN0aXBwbGUiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5yYXRlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMucmF0ZSwKICAgICAgZGVmYXVsdFZhbHVlOiA1MCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwICYmIHggPD0gMTAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNvbG9yID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXShiZ0NvbG9yKSB7CiAgICBjb25zdCBhbHBoYSA9IHRoaXMucmF0ZSAvIDEwMDsKICAgIHJldHVybiBVdGlsLm1ha2VIZXhDb2xvcihNYXRoLnJvdW5kKGJnQ29sb3IudmFsdWUuciAqICgxIC0gYWxwaGEpICsgdGhpcy52YWx1ZS5yICogYWxwaGEpLCBNYXRoLnJvdW5kKGJnQ29sb3IudmFsdWUuZyAqICgxIC0gYWxwaGEpICsgdGhpcy52YWx1ZS5nICogYWxwaGEpLCBNYXRoLnJvdW5kKGJnQ29sb3IudmFsdWUuYiAqICgxIC0gYWxwaGEpICsgdGhpcy52YWx1ZS5iICogYWxwaGEpKTsKICB9Cn0KY2xhc3MgU3ViZm9ybSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzdWJmb3JtIiwgdHJ1ZSk7CiAgICB0aGlzLmFjY2VzcyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFjY2VzcywgWyJvcGVuIiwgIm5vbkludGVyYWN0aXZlIiwgInByb3RlY3RlZCIsICJyZWFkT25seSJdKTsKICAgIHRoaXMuYWxsb3dNYWNybyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmFsbG93TWFjcm8sCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmFuY2hvclR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hbmNob3JUeXBlLCBbInRvcExlZnQiLCAiYm90dG9tQ2VudGVyIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAibWlkZGxlQ2VudGVyIiwgIm1pZGRsZUxlZnQiLCAibWlkZGxlUmlnaHQiLCAidG9wQ2VudGVyIiwgInRvcFJpZ2h0Il0pOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5jb2x1bW5XaWR0aHMgPSAoYXR0cmlidXRlcy5jb2x1bW5XaWR0aHMgfHwgIiIpLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKHggPT4geCA9PT0gIi0xIiA/IC0xIDogZ2V0TWVhc3VyZW1lbnQoeCkpOwogICAgdGhpcy5oID0gYXR0cmlidXRlcy5oID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5oKSA6ICIiOwogICAgdGhpcy5oQWxpZ24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oQWxpZ24sIFsibGVmdCIsICJjZW50ZXIiLCAianVzdGlmeSIsICJqdXN0aWZ5QWxsIiwgInJhZGl4IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxheW91dCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmxheW91dCwgWyJwb3NpdGlvbiIsICJsci10YiIsICJybC1yb3ciLCAicmwtdGIiLCAicm93IiwgInRhYmxlIiwgInRiIl0pOwogICAgdGhpcy5sb2NhbGUgPSBhdHRyaWJ1dGVzLmxvY2FsZSB8fCAiIjsKICAgIHRoaXMubWF4SCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWF4SCwgIjBwdCIpOwogICAgdGhpcy5tYXhXID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhXLCAiMHB0Iik7CiAgICB0aGlzLm1lcmdlTW9kZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm1lcmdlTW9kZSwgWyJjb25zdW1lRGF0YSIsICJtYXRjaFRlbXBsYXRlIl0pOwogICAgdGhpcy5taW5IID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5ILCAiMHB0Iik7CiAgICB0aGlzLm1pblcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1pblcsICIwcHQiKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnJlc3RvcmVTdGF0ZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnJlc3RvcmVTdGF0ZSwgWyJtYW51YWwiLCAiYXV0byJdKTsKICAgIHRoaXMuc2NvcGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zY29wZSwgWyJuYW1lIiwgIm5vbmUiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy53ID0gYXR0cmlidXRlcy53ID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy53KSA6ICIiOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuYXNzaXN0ID0gbnVsbDsKICAgIHRoaXMuYmluZCA9IG51bGw7CiAgICB0aGlzLmJvb2tlbmQgPSBudWxsOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5icmVhayA9IG51bGw7CiAgICB0aGlzLmNhbGN1bGF0ZSA9IG51bGw7CiAgICB0aGlzLmRlc2MgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5rZWVwID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMub2NjdXIgPSBudWxsOwogICAgdGhpcy5vdmVyZmxvdyA9IG51bGw7CiAgICB0aGlzLnBhZ2VTZXQgPSBudWxsOwogICAgdGhpcy5wYXJhID0gbnVsbDsKICAgIHRoaXMudHJhdmVyc2FsID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGUgPSBudWxsOwogICAgdGhpcy52YXJpYWJsZXMgPSBudWxsOwogICAgdGhpcy5hcmVhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJyZWFrQWZ0ZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWtCZWZvcmUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29ubmVjdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kcmF3ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV2ZW50ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4T2JqZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4Y2xHcm91cCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWVsZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wcm90byA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zZXRQcm9wZXJ0eSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm1TZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRnZXRTdWJmb3JtUGFyZW50XSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTdWJmb3JtU2V0KSB7CiAgICAgIHJldHVybiBwYXJlbnRbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICB9CiAgICByZXR1cm4gcGFyZW50OwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskaXNUaGVyZU1vcmVXaWR0aF0oKSB7CiAgICByZXR1cm4gdGhpcy5sYXlvdXQuZW5kc1dpdGgoIi10YiIpICYmIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSAwICYmIHRoaXNbJGV4dHJhXS5udW1iZXJJbkxpbmUgPiAwIHx8IHRoaXNbJGdldFBhcmVudF0oKVskaXNUaGVyZU1vcmVXaWR0aF0oKTsKICB9CiAgKlskZ2V0Q29udGFpbmVkQ2hpbGRyZW5dKCkgewogICAgeWllbGQqIGdldENvbnRhaW5lZENoaWxkcmVuKHRoaXMpOwogIH0KICBbJGZsdXNoSFRNTF0oKSB7CiAgICByZXR1cm4gZmx1c2hIVE1MKHRoaXMpOwogIH0KICBbJGFkZEhUTUxdKGh0bWwsIGJib3gpIHsKICAgIGFkZEhUTUwodGhpcywgaHRtbCwgYmJveCk7CiAgfQogIFskZ2V0QXZhaWxhYmxlU3BhY2VdKCkgewogICAgcmV0dXJuIGdldEF2YWlsYWJsZVNwYWNlKHRoaXMpOwogIH0KICBbJGlzU3BsaXR0YWJsZV0oKSB7CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgaWYgKCFwYXJlbnRbJGlzU3BsaXR0YWJsZV0oKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgIT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGU7CiAgICB9CiAgICBpZiAodGhpcy5sYXlvdXQgPT09ICJwb3NpdGlvbiIgfHwgdGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIHRoaXNbJGV4dHJhXS5faXNTcGxpdHRhYmxlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLmtlZXAgJiYgdGhpcy5rZWVwLmludGFjdCAhPT0gIm5vbmUiKSB7CiAgICAgIHRoaXNbJGV4dHJhXS5faXNTcGxpdHRhYmxlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChwYXJlbnQubGF5b3V0Py5lbmRzV2l0aCgiLXRiIikgJiYgcGFyZW50WyRleHRyYV0ubnVtYmVySW5MaW5lICE9PSAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXNbJGV4dHJhXS5faXNTcGxpdHRhYmxlID0gdHJ1ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHNldFRhYkluZGV4KHRoaXMpOwogICAgaWYgKHRoaXMuYnJlYWspIHsKICAgICAgaWYgKHRoaXMuYnJlYWsuYWZ0ZXIgIT09ICJhdXRvIiB8fCB0aGlzLmJyZWFrLmFmdGVyVGFyZ2V0ICE9PSAiIikgewogICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgQnJlYWtBZnRlcih7CiAgICAgICAgICB0YXJnZXRUeXBlOiB0aGlzLmJyZWFrLmFmdGVyLAogICAgICAgICAgdGFyZ2V0OiB0aGlzLmJyZWFrLmFmdGVyVGFyZ2V0LAogICAgICAgICAgc3RhcnROZXc6IHRoaXMuYnJlYWsuc3RhcnROZXcudG9TdHJpbmcoKQogICAgICAgIH0pOwogICAgICAgIG5vZGVbJGdsb2JhbERhdGFdID0gdGhpc1skZ2xvYmFsRGF0YV07CiAgICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICAgIHRoaXMuYnJlYWtBZnRlci5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmJyZWFrLmJlZm9yZSAhPT0gImF1dG8iIHx8IHRoaXMuYnJlYWsuYmVmb3JlVGFyZ2V0ICE9PSAiIikgewogICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgQnJlYWtCZWZvcmUoewogICAgICAgICAgdGFyZ2V0VHlwZTogdGhpcy5icmVhay5iZWZvcmUsCiAgICAgICAgICB0YXJnZXQ6IHRoaXMuYnJlYWsuYmVmb3JlVGFyZ2V0LAogICAgICAgICAgc3RhcnROZXc6IHRoaXMuYnJlYWsuc3RhcnROZXcudG9TdHJpbmcoKQogICAgICAgIH0pOwogICAgICAgIG5vZGVbJGdsb2JhbERhdGFdID0gdGhpc1skZ2xvYmFsRGF0YV07CiAgICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICAgIHRoaXMuYnJlYWtCZWZvcmUucHVzaChub2RlKTsKICAgICAgfQogICAgICBpZiAodGhpcy5icmVhay5vdmVyZmxvd1RhcmdldCAhPT0gIiIpIHsKICAgICAgICBjb25zdCBub2RlID0gbmV3IE92ZXJmbG93KHsKICAgICAgICAgIHRhcmdldDogdGhpcy5icmVhay5vdmVyZmxvd1RhcmdldCwKICAgICAgICAgIGxlYWRlcjogdGhpcy5icmVhay5vdmVyZmxvd0xlYWRlciwKICAgICAgICAgIHRyYWlsZXI6IHRoaXMuYnJlYWsub3ZlcmZsb3dUcmFpbGVyCiAgICAgICAgfSk7CiAgICAgICAgbm9kZVskZ2xvYmFsRGF0YV0gPSB0aGlzWyRnbG9iYWxEYXRhXTsKICAgICAgICB0aGlzWyRhcHBlbmRDaGlsZF0obm9kZSk7CiAgICAgICAgdGhpcy5vdmVyZmxvdy5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIHRoaXNbJHJlbW92ZUNoaWxkXSh0aGlzLmJyZWFrKTsKICAgICAgdGhpcy5icmVhayA9IG51bGw7CiAgICB9CiAgICBpZiAodGhpcy5wcmVzZW5jZSA9PT0gImhpZGRlbiIgfHwgdGhpcy5wcmVzZW5jZSA9PT0gImluYWN0aXZlIikgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICh0aGlzLmJyZWFrQmVmb3JlLmNoaWxkcmVuLmxlbmd0aCA+IDEgfHwgdGhpcy5icmVha0FmdGVyLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgd2FybigiWEZBIC0gU2V2ZXJhbCBicmVha0JlZm9yZSBvciBicmVha0FmdGVyIGluIHN1YmZvcm1zOiBwbGVhc2UgZmlsZSBhIGJ1Zy4iKTsKICAgIH0KICAgIGlmICh0aGlzLmJyZWFrQmVmb3JlLmNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7CiAgICAgIGNvbnN0IGJyZWFrQmVmb3JlID0gdGhpcy5icmVha0JlZm9yZS5jaGlsZHJlblswXTsKICAgICAgaWYgKGhhbmRsZUJyZWFrKGJyZWFrQmVmb3JlKSkgewogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LmJyZWFrTm9kZShicmVha0JlZm9yZSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzWyRleHRyYV0/LmFmdGVyQnJlYWtBZnRlcikgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGZpeERpbWVuc2lvbnModGhpcyk7CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgaWQ6IHRoaXNbJHVpZF0sCiAgICAgIGNsYXNzOiBbXQogICAgfTsKICAgIHNldEFjY2Vzcyh0aGlzLCBhdHRyaWJ1dGVzLmNsYXNzKTsKICAgIGlmICghdGhpc1skZXh0cmFdKSB7CiAgICAgIHRoaXNbJGV4dHJhXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB9CiAgICBPYmplY3QuYXNzaWduKHRoaXNbJGV4dHJhXSwgewogICAgICBjaGlsZHJlbiwKICAgICAgbGluZTogbnVsbCwKICAgICAgYXR0cmlidXRlcywKICAgICAgYXR0ZW1wdDogMCwKICAgICAgbnVtYmVySW5MaW5lOiAwLAogICAgICBhdmFpbGFibGVTcGFjZTogewogICAgICAgIHdpZHRoOiBNYXRoLm1pbih0aGlzLncgfHwgSW5maW5pdHksIGF2YWlsYWJsZVNwYWNlLndpZHRoKSwKICAgICAgICBoZWlnaHQ6IE1hdGgubWluKHRoaXMuaCB8fCBJbmZpbml0eSwgYXZhaWxhYmxlU3BhY2UuaGVpZ2h0KQogICAgICB9LAogICAgICB3aWR0aDogMCwKICAgICAgaGVpZ2h0OiAwLAogICAgICBwcmV2SGVpZ2h0OiAwLAogICAgICBjdXJyZW50V2lkdGg6IDAKICAgIH0pOwogICAgY29uc3Qgcm9vdCA9IHRoaXNbJGdldFRlbXBsYXRlUm9vdF0oKTsKICAgIGNvbnN0IHNhdmVkTm9MYXlvdXRGYWlsdXJlID0gcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZTsKICAgIGNvbnN0IGlzU3BsaXR0YWJsZSA9IHRoaXNbJGlzU3BsaXR0YWJsZV0oKTsKICAgIGlmICghaXNTcGxpdHRhYmxlKSB7CiAgICAgIHNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgfQogICAgaWYgKCFjaGVja0RpbWVuc2lvbnModGhpcywgYXZhaWxhYmxlU3BhY2UpKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICBjb25zdCBmaWx0ZXIgPSBuZXcgU2V0KFsiYXJlYSIsICJkcmF3IiwgImV4Y2xHcm91cCIsICJmaWVsZCIsICJzdWJmb3JtIiwgInN1YmZvcm1TZXQiXSk7CiAgICBpZiAodGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IHRoaXNbJGdldFN1YmZvcm1QYXJlbnRdKCkuY29sdW1uV2lkdGhzOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5XaWR0aHMpICYmIGNvbHVtbldpZHRocy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLmNvbHVtbldpZHRocyA9IGNvbHVtbldpZHRoczsKICAgICAgICB0aGlzWyRleHRyYV0uY3VycmVudENvbHVtbiA9IDA7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAiYW5jaG9yVHlwZSIsICJkaW1lbnNpb25zIiwgInBvc2l0aW9uIiwgInByZXNlbmNlIiwgImJvcmRlciIsICJtYXJnaW4iLCAiaEFsaWduIik7CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFTdWJmb3JtIl07CiAgICBjb25zdCBjbCA9IGxheW91dENsYXNzKHRoaXMpOwogICAgaWYgKGNsKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaChjbCk7CiAgICB9CiAgICBhdHRyaWJ1dGVzLnN0eWxlID0gc3R5bGU7CiAgICBhdHRyaWJ1dGVzLmNsYXNzID0gY2xhc3NOYW1lczsKICAgIGlmICh0aGlzLm5hbWUpIHsKICAgICAgYXR0cmlidXRlcy54ZmFOYW1lID0gdGhpcy5uYW1lOwogICAgfQogICAgaWYgKHRoaXMub3ZlcmZsb3cpIHsKICAgICAgY29uc3Qgb3ZlcmZsb3dFeHRyYSA9IHRoaXMub3ZlcmZsb3dbJGdldEV4dHJhXSgpOwogICAgICBpZiAob3ZlcmZsb3dFeHRyYS5hZGRMZWFkZXIpIHsKICAgICAgICBvdmVyZmxvd0V4dHJhLmFkZExlYWRlciA9IGZhbHNlOwogICAgICAgIGhhbmRsZU92ZXJmbG93KHRoaXMsIG92ZXJmbG93RXh0cmEubGVhZGVyLCBhdmFpbGFibGVTcGFjZSk7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbJHB1c2hQYXJhXSgpOwogICAgY29uc3QgaXNMclRiID0gdGhpcy5sYXlvdXQgPT09ICJsci10YiIgfHwgdGhpcy5sYXlvdXQgPT09ICJybC10YiI7CiAgICBjb25zdCBtYXhSdW4gPSBpc0xyVGIgPyBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUIDogMTsKICAgIGZvciAoOyB0aGlzWyRleHRyYV0uYXR0ZW1wdCA8IG1heFJ1bjsgdGhpc1skZXh0cmFdLmF0dGVtcHQrKykgewogICAgICBpZiAoaXNMclRiICYmIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUIC0gMSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5udW1iZXJJbkxpbmUgPSAwOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNbJGNoaWxkcmVuVG9IVE1MXSh7CiAgICAgICAgZmlsdGVyLAogICAgICAgIGluY2x1ZGU6IHRydWUKICAgICAgfSk7CiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChyZXN1bHQuaXNCcmVhaygpKSB7CiAgICAgICAgdGhpc1skcG9wUGFyYV0oKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIGlmIChpc0xyVGIgJiYgdGhpc1skZXh0cmFdLmF0dGVtcHQgPT09IDAgJiYgdGhpc1skZXh0cmFdLm51bWJlckluTGluZSA9PT0gMCAmJiAhcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID0gbWF4UnVuOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICB0aGlzWyRwb3BQYXJhXSgpOwogICAgaWYgKCFpc1NwbGl0dGFibGUpIHsKICAgICAgdW5zZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIH0KICAgIHJvb3RbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSBzYXZlZE5vTGF5b3V0RmFpbHVyZTsKICAgIGlmICh0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gbWF4UnVuKSB7CiAgICAgIGlmICh0aGlzLm92ZXJmbG93KSB7CiAgICAgICAgdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ub3ZlcmZsb3dOb2RlID0gdGhpcy5vdmVyZmxvdzsKICAgICAgfQogICAgICBpZiAoIWlzU3BsaXR0YWJsZSkgewogICAgICAgIGRlbGV0ZSB0aGlzWyRleHRyYV07CiAgICAgIH0KICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgIH0KICAgIGlmICh0aGlzLm92ZXJmbG93KSB7CiAgICAgIGNvbnN0IG92ZXJmbG93RXh0cmEgPSB0aGlzLm92ZXJmbG93WyRnZXRFeHRyYV0oKTsKICAgICAgaWYgKG92ZXJmbG93RXh0cmEuYWRkVHJhaWxlcikgewogICAgICAgIG92ZXJmbG93RXh0cmEuYWRkVHJhaWxlciA9IGZhbHNlOwogICAgICAgIGhhbmRsZU92ZXJmbG93KHRoaXMsIG92ZXJmbG93RXh0cmEudHJhaWxlciwgYXZhaWxhYmxlU3BhY2UpOwogICAgICB9CiAgICB9CiAgICBsZXQgbWFyZ2luSCA9IDA7CiAgICBsZXQgbWFyZ2luViA9IDA7CiAgICBpZiAodGhpcy5tYXJnaW4pIHsKICAgICAgbWFyZ2luSCA9IHRoaXMubWFyZ2luLmxlZnRJbnNldCArIHRoaXMubWFyZ2luLnJpZ2h0SW5zZXQ7CiAgICAgIG1hcmdpblYgPSB0aGlzLm1hcmdpbi50b3BJbnNldCArIHRoaXMubWFyZ2luLmJvdHRvbUluc2V0OwogICAgfQogICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCh0aGlzWyRleHRyYV0ud2lkdGggKyBtYXJnaW5ILCB0aGlzLncgfHwgMCk7CiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCh0aGlzWyRleHRyYV0uaGVpZ2h0ICsgbWFyZ2luViwgdGhpcy5oIHx8IDApOwogICAgY29uc3QgYmJveCA9IFt0aGlzLngsIHRoaXMueSwgd2lkdGgsIGhlaWdodF07CiAgICBpZiAodGhpcy53ID09PSAiIikgewogICAgICBzdHlsZS53aWR0aCA9IG1lYXN1cmVUb1N0cmluZyh3aWR0aCk7CiAgICB9CiAgICBpZiAodGhpcy5oID09PSAiIikgewogICAgICBzdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcoaGVpZ2h0KTsKICAgIH0KICAgIGlmICgoc3R5bGUud2lkdGggPT09ICIwcHgiIHx8IHN0eWxlLmhlaWdodCA9PT0gIjBweCIpICYmIGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGNvbnN0IGh0bWwgPSB7CiAgICAgIG5hbWU6ICJkaXYiLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBjaGlsZHJlbgogICAgfTsKICAgIGFwcGx5QXNzaXN0KHRoaXMsIGF0dHJpYnV0ZXMpOwogICAgY29uc3QgcmVzdWx0ID0gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogICAgaWYgKHRoaXMuYnJlYWtBZnRlci5jaGlsZHJlbi5sZW5ndGggPj0gMSkgewogICAgICBjb25zdCBicmVha0FmdGVyID0gdGhpcy5icmVha0FmdGVyLmNoaWxkcmVuWzBdOwogICAgICBpZiAoaGFuZGxlQnJlYWsoYnJlYWtBZnRlcikpIHsKICAgICAgICB0aGlzWyRleHRyYV0uYWZ0ZXJCcmVha0FmdGVyID0gcmVzdWx0OwogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LmJyZWFrTm9kZShicmVha0FmdGVyKTsKICAgICAgfQogICAgfQogICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CmNsYXNzIFN1YmZvcm1TZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic3ViZm9ybVNldCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJlbGF0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucmVsYXRpb24sIFsib3JkZXJlZCIsICJjaG9pY2UiLCAidW5vcmRlcmVkIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9va2VuZCA9IG51bGw7CiAgICB0aGlzLmJyZWFrID0gbnVsbDsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm9jY3VyID0gbnVsbDsKICAgIHRoaXMub3ZlcmZsb3cgPSBudWxsOwogICAgdGhpcy5icmVha0FmdGVyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJyZWFrQmVmb3JlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybVNldCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICAqWyRnZXRDb250YWluZWRDaGlsZHJlbl0oKSB7CiAgICB5aWVsZCogZ2V0Q29udGFpbmVkQ2hpbGRyZW4odGhpcyk7CiAgfQogIFskZ2V0U3ViZm9ybVBhcmVudF0oKSB7CiAgICBsZXQgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpOwogICAgd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgU3ViZm9ybSkpIHsKICAgICAgcGFyZW50ID0gcGFyZW50WyRnZXRQYXJlbnRdKCk7CiAgICB9CiAgICByZXR1cm4gcGFyZW50OwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQp9CmNsYXNzIFN1YmplY3RETiBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic3ViamVjdEROIik7CiAgICB0aGlzLmRlbGltaXRlciA9IGF0dHJpYnV0ZXMuZGVsaW1pdGVyIHx8ICIsIjsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IG5ldyBNYXAodGhpc1skY29udGVudF0uc3BsaXQodGhpcy5kZWxpbWl0ZXIpLm1hcChrdiA9PiB7CiAgICAgIGt2ID0ga3Yuc3BsaXQoIj0iLCAyKTsKICAgICAga3ZbMF0gPSBrdlswXS50cmltKCk7CiAgICAgIHJldHVybiBrdjsKICAgIH0pKTsKICB9Cn0KY2xhc3MgU3ViamVjdEROcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzdWJqZWN0RE5zIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5zdWJqZWN0RE4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgU3VibWl0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInN1Ym1pdCIsIHRydWUpOwogICAgdGhpcy5lbWJlZFBERiA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmVtYmVkUERGLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5mb3JtYXQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5mb3JtYXQsIFsieGRwIiwgImZvcm1kYXRhIiwgInBkZiIsICJ1cmxlbmNvZGVkIiwgInhmZCIsICJ4bWwiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnRleHRFbmNvZGluZyA9IGdldEtleXdvcmQoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnRleHRFbmNvZGluZyA/IGF0dHJpYnV0ZXMudGV4dEVuY29kaW5nLnRvTG93ZXJDYXNlKCkgOiAiIiwKICAgICAgZGVmYXVsdFZhbHVlOiAiIiwKICAgICAgdmFsaWRhdGU6IGsgPT4gWyJ1dGYtOCIsICJiaWctZml2ZSIsICJmb250c3BlY2lmaWMiLCAiZ2JrIiwgImdiLTE4MDMwIiwgImdiLTIzMTIiLCAia3NjLTU2MDEiLCAibm9uZSIsICJzaGlmdC1qaXMiLCAidWNzLTIiLCAidXRmLTE2Il0uaW5jbHVkZXMoaykgfHwgay5tYXRjaCgvaXNvLTg4NTktXGR7Mn0vKQogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy54ZHBDb250ZW50ID0gYXR0cmlidXRlcy54ZHBDb250ZW50IHx8ICIiOwogICAgdGhpcy5lbmNyeXB0ID0gbnVsbDsKICAgIHRoaXMuZW5jcnlwdERhdGEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2lnbkRhdGEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgVGVtcGxhdGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGVtcGxhdGUiLCB0cnVlKTsKICAgIHRoaXMuYmFzZVByb2ZpbGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5iYXNlUHJvZmlsZSwgWyJmdWxsIiwgImludGVyYWN0aXZlRm9ybXMiXSk7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLnN1YmZvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBpZiAodGhpcy5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgICB3YXJuKCJYRkEgLSBObyBzdWJmb3JtcyBpbiB0ZW1wbGF0ZSBub2RlLiIpOwogICAgfQogICAgaWYgKHRoaXMuc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGggPj0gMikgewogICAgICB3YXJuKCJYRkEgLSBTZXZlcmFsIHN1YmZvcm1zIGluIHRlbXBsYXRlIG5vZGU6IHBsZWFzZSBmaWxlIGEgYnVnLiIpOwogICAgfQogICAgdGhpc1skdGFiSW5kZXhdID0gREVGQVVMVF9UQUJfSU5ERVg7CiAgfQogIFskaXNTcGxpdHRhYmxlXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJHNlYXJjaE5vZGVdKGV4cHIsIGNvbnRhaW5lcikgewogICAgaWYgKGV4cHIuc3RhcnRzV2l0aCgiIyIpKSB7CiAgICAgIHJldHVybiBbdGhpc1skaWRzXS5nZXQoZXhwci5zbGljZSgxKSldOwogICAgfQogICAgcmV0dXJuIHNlYXJjaE5vZGUodGhpcywgY29udGFpbmVyLCBleHByLCB0cnVlLCB0cnVlKTsKICB9CiAgKlskdG9QYWdlc10oKSB7CiAgICBpZiAoIXRoaXMuc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogImRpdiIsCiAgICAgICAgY2hpbGRyZW46IFtdCiAgICAgIH0pOwogICAgfQogICAgdGhpc1skZXh0cmFdID0gewogICAgICBvdmVyZmxvd05vZGU6IG51bGwsCiAgICAgIGZpcnN0VW5zcGxpdHRhYmxlOiBudWxsLAogICAgICBjdXJyZW50Q29udGVudEFyZWE6IG51bGwsCiAgICAgIGN1cnJlbnRQYWdlQXJlYTogbnVsbCwKICAgICAgbm9MYXlvdXRGYWlsdXJlOiBmYWxzZSwKICAgICAgcGFnZU51bWJlcjogMSwKICAgICAgcGFnZVBvc2l0aW9uOiAiZmlyc3QiLAogICAgICBvZGRPckV2ZW46ICJvZGQiLAogICAgICBibGFua09yTm90Qmxhbms6ICJub25CbGFuayIsCiAgICAgIHBhcmFTdGFjazogW10KICAgIH07CiAgICBjb25zdCByb290ID0gdGhpcy5zdWJmb3JtLmNoaWxkcmVuWzBdOwogICAgcm9vdC5wYWdlU2V0WyRjbGVhblBhZ2VdKCk7CiAgICBjb25zdCBwYWdlQXJlYXMgPSByb290LnBhZ2VTZXQucGFnZUFyZWEuY2hpbGRyZW47CiAgICBjb25zdCBtYWluSHRtbCA9IHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGxldCBwYWdlQXJlYSA9IG51bGw7CiAgICBsZXQgYnJlYWtCZWZvcmUgPSBudWxsOwogICAgbGV0IGJyZWFrQmVmb3JlVGFyZ2V0ID0gbnVsbDsKICAgIGlmIChyb290LmJyZWFrQmVmb3JlLmNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7CiAgICAgIGJyZWFrQmVmb3JlID0gcm9vdC5icmVha0JlZm9yZS5jaGlsZHJlblswXTsKICAgICAgYnJlYWtCZWZvcmVUYXJnZXQgPSBicmVha0JlZm9yZS50YXJnZXQ7CiAgICB9IGVsc2UgaWYgKHJvb3Quc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGggPj0gMSAmJiByb290LnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoID49IDEpIHsKICAgICAgYnJlYWtCZWZvcmUgPSByb290LnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWtCZWZvcmUuY2hpbGRyZW5bMF07CiAgICAgIGJyZWFrQmVmb3JlVGFyZ2V0ID0gYnJlYWtCZWZvcmUudGFyZ2V0OwogICAgfSBlbHNlIGlmIChyb290LmJyZWFrPy5iZWZvcmVUYXJnZXQpIHsKICAgICAgYnJlYWtCZWZvcmUgPSByb290LmJyZWFrOwogICAgICBicmVha0JlZm9yZVRhcmdldCA9IGJyZWFrQmVmb3JlLmJlZm9yZVRhcmdldDsKICAgIH0gZWxzZSBpZiAocm9vdC5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aCA+PSAxICYmIHJvb3Quc3ViZm9ybS5jaGlsZHJlblswXS5icmVhaz8uYmVmb3JlVGFyZ2V0KSB7CiAgICAgIGJyZWFrQmVmb3JlID0gcm9vdC5zdWJmb3JtLmNoaWxkcmVuWzBdLmJyZWFrOwogICAgICBicmVha0JlZm9yZVRhcmdldCA9IGJyZWFrQmVmb3JlLmJlZm9yZVRhcmdldDsKICAgIH0KICAgIGlmIChicmVha0JlZm9yZSkgewogICAgICBjb25zdCB0YXJnZXQgPSB0aGlzWyRzZWFyY2hOb2RlXShicmVha0JlZm9yZVRhcmdldCwgYnJlYWtCZWZvcmVbJGdldFBhcmVudF0oKSk7CiAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQYWdlQXJlYSkgewogICAgICAgIHBhZ2VBcmVhID0gdGFyZ2V0OwogICAgICAgIGJyZWFrQmVmb3JlWyRleHRyYV0gPSB7fTsKICAgICAgfQogICAgfQogICAgaWYgKCFwYWdlQXJlYSkgewogICAgICBwYWdlQXJlYSA9IHBhZ2VBcmVhc1swXTsKICAgIH0KICAgIHBhZ2VBcmVhWyRleHRyYV0gPSB7CiAgICAgIG51bWJlck9mVXNlOiAxCiAgICB9OwogICAgY29uc3QgcGFnZUFyZWFQYXJlbnQgPSBwYWdlQXJlYVskZ2V0UGFyZW50XSgpOwogICAgcGFnZUFyZWFQYXJlbnRbJGV4dHJhXSA9IHsKICAgICAgbnVtYmVyT2ZVc2U6IDEsCiAgICAgIHBhZ2VJbmRleDogcGFnZUFyZWFQYXJlbnQucGFnZUFyZWEuY2hpbGRyZW4uaW5kZXhPZihwYWdlQXJlYSksCiAgICAgIHBhZ2VTZXRJbmRleDogMAogICAgfTsKICAgIGxldCB0YXJnZXRQYWdlQXJlYTsKICAgIGxldCBsZWFkZXIgPSBudWxsOwogICAgbGV0IHRyYWlsZXIgPSBudWxsOwogICAgbGV0IGhhc1NvbWV0aGluZyA9IHRydWU7CiAgICBsZXQgaGFzU29tZXRoaW5nQ291bnRlciA9IDA7CiAgICBsZXQgc3RhcnRJbmRleCA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoIWhhc1NvbWV0aGluZykgewogICAgICAgIG1haW5IdG1sLmNoaWxkcmVuLnBvcCgpOwogICAgICAgIGlmICgrK2hhc1NvbWV0aGluZ0NvdW50ZXIgPT09IE1BWF9FTVBUWV9QQUdFUykgewogICAgICAgICAgd2FybigiWEZBIC0gU29tZXRoaW5nIGdvZXMgd3Jvbmc6IHBsZWFzZSBmaWxlIGEgYnVnLiIpOwogICAgICAgICAgcmV0dXJuIG1haW5IdG1sOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBoYXNTb21ldGhpbmdDb3VudGVyID0gMDsKICAgICAgfQogICAgICB0YXJnZXRQYWdlQXJlYSA9IG51bGw7CiAgICAgIHRoaXNbJGV4dHJhXS5jdXJyZW50UGFnZUFyZWEgPSBwYWdlQXJlYTsKICAgICAgY29uc3QgcGFnZSA9IHBhZ2VBcmVhWyR0b0hUTUxdKCkuaHRtbDsKICAgICAgbWFpbkh0bWwuY2hpbGRyZW4ucHVzaChwYWdlKTsKICAgICAgaWYgKGxlYWRlcikgewogICAgICAgIHRoaXNbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSB0cnVlOwogICAgICAgIHBhZ2UuY2hpbGRyZW4ucHVzaChsZWFkZXJbJHRvSFRNTF0ocGFnZUFyZWFbJGV4dHJhXS5zcGFjZSkuaHRtbCk7CiAgICAgICAgbGVhZGVyID0gbnVsbDsKICAgICAgfQogICAgICBpZiAodHJhaWxlcikgewogICAgICAgIHRoaXNbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSB0cnVlOwogICAgICAgIHBhZ2UuY2hpbGRyZW4ucHVzaCh0cmFpbGVyWyR0b0hUTUxdKHBhZ2VBcmVhWyRleHRyYV0uc3BhY2UpLmh0bWwpOwogICAgICAgIHRyYWlsZXIgPSBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGNvbnRlbnRBcmVhcyA9IHBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuOwogICAgICBjb25zdCBodG1sQ29udGVudEFyZWFzID0gcGFnZS5jaGlsZHJlbi5maWx0ZXIobm9kZSA9PiBub2RlLmF0dHJpYnV0ZXMuY2xhc3MuaW5jbHVkZXMoInhmYUNvbnRlbnRhcmVhIikpOwogICAgICBoYXNTb21ldGhpbmcgPSBmYWxzZTsKICAgICAgdGhpc1skZXh0cmFdLmZpcnN0VW5zcGxpdHRhYmxlID0gbnVsbDsKICAgICAgdGhpc1skZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IGZhbHNlOwogICAgICBjb25zdCBmbHVzaCA9IGluZGV4ID0+IHsKICAgICAgICBjb25zdCBodG1sID0gcm9vdFskZmx1c2hIVE1MXSgpOwogICAgICAgIGlmIChodG1sKSB7CiAgICAgICAgICBoYXNTb21ldGhpbmcgfHw9IGh0bWwuY2hpbGRyZW4/Lmxlbmd0aCA+IDA7CiAgICAgICAgICBodG1sQ29udGVudEFyZWFzW2luZGV4XS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXgsIGlpID0gY29udGVudEFyZWFzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb25zdCBjb250ZW50QXJlYSA9IHRoaXNbJGV4dHJhXS5jdXJyZW50Q29udGVudEFyZWEgPSBjb250ZW50QXJlYXNbaV07CiAgICAgICAgY29uc3Qgc3BhY2UgPSB7CiAgICAgICAgICB3aWR0aDogY29udGVudEFyZWEudywKICAgICAgICAgIGhlaWdodDogY29udGVudEFyZWEuaAogICAgICAgIH07CiAgICAgICAgc3RhcnRJbmRleCA9IDA7CiAgICAgICAgaWYgKGxlYWRlcikgewogICAgICAgICAgaHRtbENvbnRlbnRBcmVhc1tpXS5jaGlsZHJlbi5wdXNoKGxlYWRlclskdG9IVE1MXShzcGFjZSkuaHRtbCk7CiAgICAgICAgICBsZWFkZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodHJhaWxlcikgewogICAgICAgICAgaHRtbENvbnRlbnRBcmVhc1tpXS5jaGlsZHJlbi5wdXNoKHRyYWlsZXJbJHRvSFRNTF0oc3BhY2UpLmh0bWwpOwogICAgICAgICAgdHJhaWxlciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGh0bWwgPSByb290WyR0b0hUTUxdKHNwYWNlKTsKICAgICAgICBpZiAoaHRtbC5zdWNjZXNzKSB7CiAgICAgICAgICBpZiAoaHRtbC5odG1sKSB7CiAgICAgICAgICAgIGhhc1NvbWV0aGluZyB8fD0gaHRtbC5odG1sLmNoaWxkcmVuPy5sZW5ndGggPiAwOwogICAgICAgICAgICBodG1sQ29udGVudEFyZWFzW2ldLmNoaWxkcmVuLnB1c2goaHRtbC5odG1sKTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1NvbWV0aGluZyAmJiBtYWluSHRtbC5jaGlsZHJlbi5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIG1haW5IdG1sLmNoaWxkcmVuLnBvcCgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG1haW5IdG1sOwogICAgICAgIH0KICAgICAgICBpZiAoaHRtbC5pc0JyZWFrKCkpIHsKICAgICAgICAgIGNvbnN0IG5vZGUgPSBodG1sLmJyZWFrTm9kZTsKICAgICAgICAgIGZsdXNoKGkpOwogICAgICAgICAgaWYgKG5vZGUudGFyZ2V0VHlwZSA9PT0gImF1dG8iKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUubGVhZGVyKSB7CiAgICAgICAgICAgIGxlYWRlciA9IHRoaXNbJHNlYXJjaE5vZGVdKG5vZGUubGVhZGVyLCBub2RlWyRnZXRQYXJlbnRdKCkpOwogICAgICAgICAgICBsZWFkZXIgPSBsZWFkZXIgPyBsZWFkZXJbMF0gOiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUudHJhaWxlcikgewogICAgICAgICAgICB0cmFpbGVyID0gdGhpc1skc2VhcmNoTm9kZV0obm9kZS50cmFpbGVyLCBub2RlWyRnZXRQYXJlbnRdKCkpOwogICAgICAgICAgICB0cmFpbGVyID0gdHJhaWxlciA/IHRyYWlsZXJbMF0gOiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUudGFyZ2V0VHlwZSA9PT0gInBhZ2VBcmVhIikgewogICAgICAgICAgICB0YXJnZXRQYWdlQXJlYSA9IG5vZGVbJGV4dHJhXS50YXJnZXQ7CiAgICAgICAgICAgIGkgPSBJbmZpbml0eTsKICAgICAgICAgIH0gZWxzZSBpZiAoIW5vZGVbJGV4dHJhXS50YXJnZXQpIHsKICAgICAgICAgICAgaSA9IG5vZGVbJGV4dHJhXS5pbmRleDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRhcmdldFBhZ2VBcmVhID0gbm9kZVskZXh0cmFdLnRhcmdldDsKICAgICAgICAgICAgc3RhcnRJbmRleCA9IG5vZGVbJGV4dHJhXS5pbmRleCArIDE7CiAgICAgICAgICAgIGkgPSBJbmZpbml0eTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodGhpc1skZXh0cmFdLm92ZXJmbG93Tm9kZSkgewogICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXNbJGV4dHJhXS5vdmVyZmxvd05vZGU7CiAgICAgICAgICB0aGlzWyRleHRyYV0ub3ZlcmZsb3dOb2RlID0gbnVsbDsKICAgICAgICAgIGNvbnN0IG92ZXJmbG93RXh0cmEgPSBub2RlWyRnZXRFeHRyYV0oKTsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IG92ZXJmbG93RXh0cmEudGFyZ2V0OwogICAgICAgICAgb3ZlcmZsb3dFeHRyYS5hZGRMZWFkZXIgPSBvdmVyZmxvd0V4dHJhLmxlYWRlciAhPT0gbnVsbDsKICAgICAgICAgIG92ZXJmbG93RXh0cmEuYWRkVHJhaWxlciA9IG92ZXJmbG93RXh0cmEudHJhaWxlciAhPT0gbnVsbDsKICAgICAgICAgIGZsdXNoKGkpOwogICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gaTsKICAgICAgICAgIGkgPSBJbmZpbml0eTsKICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQYWdlQXJlYSkgewogICAgICAgICAgICB0YXJnZXRQYWdlQXJlYSA9IHRhcmdldDsKICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ29udGVudEFyZWEpIHsKICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjb250ZW50QXJlYXMuaW5kZXhPZih0YXJnZXQpOwogICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgICAgaWYgKGluZGV4ID4gY3VycmVudEluZGV4KSB7CiAgICAgICAgICAgICAgICBpID0gaW5kZXggLSAxOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRhcmdldFBhZ2VBcmVhID0gdGFyZ2V0WyRnZXRQYXJlbnRdKCk7CiAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IHRhcmdldFBhZ2VBcmVhLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YodGFyZ2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZsdXNoKGkpOwogICAgICB9CiAgICAgIHRoaXNbJGV4dHJhXS5wYWdlTnVtYmVyICs9IDE7CiAgICAgIGlmICh0YXJnZXRQYWdlQXJlYSkgewogICAgICAgIGlmICh0YXJnZXRQYWdlQXJlYVskaXNVc2FibGVdKCkpIHsKICAgICAgICAgIHRhcmdldFBhZ2VBcmVhWyRleHRyYV0ubnVtYmVyT2ZVc2UgKz0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0UGFnZUFyZWEgPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgICBwYWdlQXJlYSA9IHRhcmdldFBhZ2VBcmVhIHx8IHBhZ2VBcmVhWyRnZXROZXh0UGFnZV0oKTsKICAgICAgeWllbGQgbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgVGV4dCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGV4dCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm1heENoYXJzID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubWF4Q2hhcnMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmlkID0gYXR0cmlidXRlcy5yaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskb25DaGlsZF0oY2hpbGQpIHsKICAgIGlmIChjaGlsZFskbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMueGh0bWwuaWQpIHsKICAgICAgdGhpc1skY29udGVudF0gPSBjaGlsZDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIGNvbnRlbnQgaW4gVGV4dDogJHtjaGlsZFskbm9kZU5hbWVdfS5gKTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRvblRleHRdKHN0cikgewogICAgaWYgKHRoaXNbJGNvbnRlbnRdIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN1cGVyWyRvblRleHRdKHN0cik7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgaWYgKHR5cGVvZiB0aGlzWyRjb250ZW50XSA9PT0gInN0cmluZyIpIHsKICAgICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS5yZXBsYWNlQWxsKCJcclxuIiwgIlxuIik7CiAgICB9CiAgfQogIFskZ2V0RXh0cmFdKCkgewogICAgaWYgKHR5cGVvZiB0aGlzWyRjb250ZW50XSA9PT0gInN0cmluZyIpIHsKICAgICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdLnNwbGl0KC9bXHUyMDI5XHUyMDI4XG5dLykuZmlsdGVyKGxpbmUgPT4gISFsaW5lKS5qb2luKCJcbiIpOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdWyR0ZXh0XSgpOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGlmICh0eXBlb2YgdGhpc1skY29udGVudF0gPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IGh0bWwgPSB2YWx1ZVRvSHRtbCh0aGlzWyRjb250ZW50XSkuaHRtbDsKICAgICAgaWYgKHRoaXNbJGNvbnRlbnRdLmluY2x1ZGVzKCJcdTIwMjkiKSkgewogICAgICAgIGh0bWwubmFtZSA9ICJkaXYiOwogICAgICAgIGh0bWwuY2hpbGRyZW4gPSBbXTsKICAgICAgICB0aGlzWyRjb250ZW50XS5zcGxpdCgiXHUyMDI5IikubWFwKHBhcmEgPT4gcGFyYS5zcGxpdCgvW1x1MjAyOFxuXS8pLmZsYXRNYXAobGluZSA9PiBbewogICAgICAgICAgbmFtZTogInNwYW4iLAogICAgICAgICAgdmFsdWU6IGxpbmUKICAgICAgICB9LCB7CiAgICAgICAgICBuYW1lOiAiYnIiCiAgICAgICAgfV0pKS5mb3JFYWNoKGxpbmVzID0+IHsKICAgICAgICAgIGh0bWwuY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIG5hbWU6ICJwIiwKICAgICAgICAgICAgY2hpbGRyZW46IGxpbmVzCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICgvW1x1MjAyOFxuXS8udGVzdCh0aGlzWyRjb250ZW50XSkpIHsKICAgICAgICBodG1sLm5hbWUgPSAiZGl2IjsKICAgICAgICBodG1sLmNoaWxkcmVuID0gW107CiAgICAgICAgdGhpc1skY29udGVudF0uc3BsaXQoL1tcdTIwMjhcbl0vKS5mb3JFYWNoKGxpbmUgPT4gewogICAgICAgICAgaHRtbC5jaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgbmFtZTogInNwYW4iLAogICAgICAgICAgICB2YWx1ZTogbGluZQogICAgICAgICAgfSwgewogICAgICAgICAgICBuYW1lOiAiYnIiCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGh0bWwpOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICB9Cn0KY2xhc3MgVGV4dEVkaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGV4dEVkaXQiLCB0cnVlKTsKICAgIHRoaXMuYWxsb3dSaWNoVGV4dCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmFsbG93UmljaFRleHQsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmhTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oU2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm11bHRpTGluZSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm11bHRpTGluZSwKICAgICAgZGVmYXVsdFZhbHVlOiAiIiwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMCB8fCB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnZTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy52U2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jb21iID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImJvcmRlciIsICJmb250IiwgIm1hcmdpbiIpOwogICAgbGV0IGh0bWw7CiAgICBjb25zdCBmaWVsZCA9IHRoaXNbJGdldFBhcmVudF0oKVskZ2V0UGFyZW50XSgpOwogICAgaWYgKHRoaXMubXVsdGlMaW5lID09PSAiIikgewogICAgICB0aGlzLm11bHRpTGluZSA9IGZpZWxkIGluc3RhbmNlb2YgRHJhdyA/IDEgOiAwOwogICAgfQogICAgaWYgKHRoaXMubXVsdGlMaW5lID09PSAxKSB7CiAgICAgIGh0bWwgPSB7CiAgICAgICAgbmFtZTogInRleHRhcmVhIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBkYXRhSWQ6IGZpZWxkWyRkYXRhXT8uWyR1aWRdIHx8IGZpZWxkWyR1aWRdLAogICAgICAgICAgZmllbGRJZDogZmllbGRbJHVpZF0sCiAgICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICAgIHN0eWxlLAogICAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICAgIH0KICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGh0bWwgPSB7CiAgICAgICAgbmFtZTogImlucHV0IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICBkYXRhSWQ6IGZpZWxkWyRkYXRhXT8uWyR1aWRdIHx8IGZpZWxkWyR1aWRdLAogICAgICAgICAgZmllbGRJZDogZmllbGRbJHVpZF0sCiAgICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICAgIHN0eWxlLAogICAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImxhYmVsIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbInhmYUxhYmVsIl0KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtodG1sXQogICAgfSk7CiAgfQp9CmNsYXNzIFRpbWUgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGltZSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IGRhdGUgPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICB0aGlzWyRjb250ZW50XSA9IGRhdGUgPyBuZXcgRGF0ZShkYXRlKSA6IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbnRlbnRdID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgVGltZVN0YW1wIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInRpbWVTdGFtcCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnNlcnZlciA9IGF0dHJpYnV0ZXMuc2VydmVyIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFRvb2xUaXAgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidG9vbFRpcCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnJpZCA9IGF0dHJpYnV0ZXMucmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgVHJhdmVyc2FsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInRyYXZlcnNhbCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy50cmF2ZXJzZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBUcmF2ZXJzZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ0cmF2ZXJzZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZXJhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9wZXJhdGlvbiwgWyJuZXh0IiwgImJhY2siLCAiZG93biIsICJmaXJzdCIsICJsZWZ0IiwgInJpZ2h0IiwgInVwIl0pOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLnNjcmlwdCA9IG51bGw7CiAgfQogIGdldCBuYW1lKCkgewogICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uOwogIH0KICBbJGlzVHJhbnNwYXJlbnRdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQpjbGFzcyBVaSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ1aSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICAgIHRoaXMuYmFyY29kZSA9IG51bGw7CiAgICB0aGlzLmJ1dHRvbiA9IG51bGw7CiAgICB0aGlzLmNoZWNrQnV0dG9uID0gbnVsbDsKICAgIHRoaXMuY2hvaWNlTGlzdCA9IG51bGw7CiAgICB0aGlzLmRhdGVUaW1lRWRpdCA9IG51bGw7CiAgICB0aGlzLmRlZmF1bHRVaSA9IG51bGw7CiAgICB0aGlzLmltYWdlRWRpdCA9IG51bGw7CiAgICB0aGlzLm51bWVyaWNFZGl0ID0gbnVsbDsKICAgIHRoaXMucGFzc3dvcmRFZGl0ID0gbnVsbDsKICAgIHRoaXMuc2lnbmF0dXJlID0gbnVsbDsKICAgIHRoaXMudGV4dEVkaXQgPSBudWxsOwogIH0KICBbJGdldEV4dHJhXSgpIHsKICAgIGlmICh0aGlzWyRleHRyYV0gPT09IHVuZGVmaW5lZCkgewogICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgICBpZiAobmFtZSA9PT0gImV4dHJhcyIgfHwgbmFtZSA9PT0gInBpY3R1cmUiKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb2JqID0gdGhpc1tuYW1lXTsKICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBYRkFPYmplY3QpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhpc1skZXh0cmFdID0gb2JqOwogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgICAgdGhpc1skZXh0cmFdID0gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzWyRleHRyYV07CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgb2JqID0gdGhpc1skZ2V0RXh0cmFdKCk7CiAgICBpZiAob2JqKSB7CiAgICAgIHJldHVybiBvYmpbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgfQp9CmNsYXNzIFZhbGlkYXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInZhbGlkYXRlIiwgdHJ1ZSk7CiAgICB0aGlzLmZvcm1hdFRlc3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5mb3JtYXRUZXN0LCBbIndhcm5pbmciLCAiZGlzYWJsZWQiLCAiZXJyb3IiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubnVsbFRlc3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5udWxsVGVzdCwgWyJkaXNhYmxlZCIsICJlcnJvciIsICJ3YXJuaW5nIl0pOwogICAgdGhpcy5zY3JpcHRUZXN0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuc2NyaXB0VGVzdCwgWyJlcnJvciIsICJkaXNhYmxlZCIsICJ3YXJuaW5nIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWVzc2FnZSA9IG51bGw7CiAgICB0aGlzLnBpY3R1cmUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogIH0KfQpjbGFzcyBWYWx1ZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ2YWx1ZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm92ZXJyaWRlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMub3ZlcnJpZGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5hcmMgPSBudWxsOwogICAgdGhpcy5ib29sZWFuID0gbnVsbDsKICAgIHRoaXMuZGF0ZSA9IG51bGw7CiAgICB0aGlzLmRhdGVUaW1lID0gbnVsbDsKICAgIHRoaXMuZGVjaW1hbCA9IG51bGw7CiAgICB0aGlzLmV4RGF0YSA9IG51bGw7CiAgICB0aGlzLmZsb2F0ID0gbnVsbDsKICAgIHRoaXMuaW1hZ2UgPSBudWxsOwogICAgdGhpcy5pbnRlZ2VyID0gbnVsbDsKICAgIHRoaXMubGluZSA9IG51bGw7CiAgICB0aGlzLnJlY3RhbmdsZSA9IG51bGw7CiAgICB0aGlzLnRleHQgPSBudWxsOwogICAgdGhpcy50aW1lID0gbnVsbDsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBGaWVsZCkgewogICAgICBpZiAocGFyZW50LnVpPy5pbWFnZUVkaXQpIHsKICAgICAgICBpZiAoIXRoaXMuaW1hZ2UpIHsKICAgICAgICAgIHRoaXMuaW1hZ2UgPSBuZXcgSW1hZ2Uoe30pOwogICAgICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKHRoaXMuaW1hZ2UpOwogICAgICAgIH0KICAgICAgICB0aGlzLmltYWdlWyRjb250ZW50XSA9IHZhbHVlWyRjb250ZW50XTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHZhbHVlTmFtZSA9IHZhbHVlWyRub2RlTmFtZV07CiAgICBpZiAodGhpc1t2YWx1ZU5hbWVdICE9PSBudWxsKSB7CiAgICAgIHRoaXNbdmFsdWVOYW1lXVskY29udGVudF0gPSB2YWx1ZVskY29udGVudF07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgICAgdGhpc1tuYW1lXSA9IG51bGw7CiAgICAgICAgdGhpc1skcmVtb3ZlQ2hpbGRdKG9iaik7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbdmFsdWVbJG5vZGVOYW1lXV0gPSB2YWx1ZTsKICAgIHRoaXNbJGFwcGVuZENoaWxkXSh2YWx1ZSk7CiAgfQogIFskdGV4dF0oKSB7CiAgICBpZiAodGhpcy5leERhdGEpIHsKICAgICAgaWYgKHR5cGVvZiB0aGlzLmV4RGF0YVskY29udGVudF0gPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZXhEYXRhWyRjb250ZW50XS50cmltKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZXhEYXRhWyRjb250ZW50XVskdGV4dF0oKS50cmltKCk7CiAgICB9CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKG5hbWUgPT09ICJpbWFnZSIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIChvYmpbJGNvbnRlbnRdIHx8ICIiKS50b1N0cmluZygpLnRyaW0oKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgIGNvbnN0IG9iaiA9IHRoaXNbbmFtZV07CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFhGQU9iamVjdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICByZXR1cm4gb2JqWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogIH0KfQpjbGFzcyBWYXJpYWJsZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidmFyaWFibGVzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm1hbmlmZXN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNjcmlwdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50ZXh0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRpbWUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBUZW1wbGF0ZU5hbWVzcGFjZSB7CiAgc3RhdGljIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChUZW1wbGF0ZU5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICBjb25zdCBub2RlID0gVGVtcGxhdGVOYW1lc3BhY2VbbmFtZV0oYXR0cmlidXRlcyk7CiAgICAgIG5vZGVbJHNldFNldEF0dHJpYnV0ZXNdKGF0dHJpYnV0ZXMpOwogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIHN0YXRpYyBhcHBlYXJhbmNlRmlsdGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFwcGVhcmFuY2VGaWx0ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgYXJjKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFyYyhhdHRycyk7CiAgfQogIHN0YXRpYyBhcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFyZWEoYXR0cnMpOwogIH0KICBzdGF0aWMgYXNzaXN0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFzc2lzdChhdHRycyk7CiAgfQogIHN0YXRpYyBiYXJjb2RlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJhcmNvZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgYmluZChhdHRycykgewogICAgcmV0dXJuIG5ldyBCaW5kKGF0dHJzKTsKICB9CiAgc3RhdGljIGJpbmRJdGVtcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBCaW5kSXRlbXMoYXR0cnMpOwogIH0KICBzdGF0aWMgYm9va2VuZChhdHRycykgewogICAgcmV0dXJuIG5ldyBCb29rZW5kKGF0dHJzKTsKICB9CiAgc3RhdGljIGJvb2xlYW4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQm9vbGVhbkVsZW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgYm9yZGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJvcmRlcihhdHRycyk7CiAgfQogIHN0YXRpYyBicmVhayhhdHRycykgewogICAgcmV0dXJuIG5ldyBCcmVhayhhdHRycyk7CiAgfQogIHN0YXRpYyBicmVha0FmdGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJyZWFrQWZ0ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgYnJlYWtCZWZvcmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQnJlYWtCZWZvcmUoYXR0cnMpOwogIH0KICBzdGF0aWMgYnV0dG9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJ1dHRvbihhdHRycyk7CiAgfQogIHN0YXRpYyBjYWxjdWxhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2FsY3VsYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNhcHRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2FwdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBjZXJ0aWZpY2F0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBDZXJ0aWZpY2F0ZShhdHRycyk7CiAgfQogIHN0YXRpYyBjZXJ0aWZpY2F0ZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2VydGlmaWNhdGVzKGF0dHJzKTsKICB9CiAgc3RhdGljIGNoZWNrQnV0dG9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENoZWNrQnV0dG9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGNob2ljZUxpc3QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2hvaWNlTGlzdChhdHRycyk7CiAgfQogIHN0YXRpYyBjb2xvcihhdHRycykgewogICAgcmV0dXJuIG5ldyBDb2xvcihhdHRycyk7CiAgfQogIHN0YXRpYyBjb21iKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbWIoYXR0cnMpOwogIH0KICBzdGF0aWMgY29ubmVjdChhdHRycykgewogICAgcmV0dXJuIG5ldyBDb25uZWN0KGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbnRlbnRBcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbnRlbnRBcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvcm5lcihhdHRycykgewogICAgcmV0dXJuIG5ldyBDb3JuZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlRWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlVGltZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlVGltZShhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlVGltZUVkaXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWVFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIGRlY2ltYWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVjaW1hbChhdHRycyk7CiAgfQogIHN0YXRpYyBkZWZhdWx0VWkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVmYXVsdFVpKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlc2MoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVzYyhhdHRycyk7CiAgfQogIHN0YXRpYyBkaWdlc3RNZXRob2QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGlnZXN0TWV0aG9kKGF0dHJzKTsKICB9CiAgc3RhdGljIGRpZ2VzdE1ldGhvZHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGlnZXN0TWV0aG9kcyhhdHRycyk7CiAgfQogIHN0YXRpYyBkcmF3KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERyYXcoYXR0cnMpOwogIH0KICBzdGF0aWMgZWRnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFZGdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY29kaW5nKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY29kaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY29kaW5ncyhhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNvZGluZ3MoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdChhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNyeXB0KGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHREYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY3J5cHREYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBlbmNyeXB0aW9uTWV0aG9kKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY3J5cHRpb25NZXRob2QoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdGlvbk1ldGhvZHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbk1ldGhvZHMoYXR0cnMpOwogIH0KICBzdGF0aWMgZXZlbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXZlbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgZXhEYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEV4RGF0YShhdHRycyk7CiAgfQogIHN0YXRpYyBleE9iamVjdChhdHRycykgewogICAgcmV0dXJuIG5ldyBFeE9iamVjdChhdHRycyk7CiAgfQogIHN0YXRpYyBleGNsR3JvdXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhjbEdyb3VwKGF0dHJzKTsKICB9CiAgc3RhdGljIGV4ZWN1dGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhlY3V0ZShhdHRycyk7CiAgfQogIHN0YXRpYyBleHRyYXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXh0cmFzKGF0dHJzKTsKICB9CiAgc3RhdGljIGZpZWxkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEZpZWxkKGF0dHJzKTsKICB9CiAgc3RhdGljIGZpbGwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRmlsbChhdHRycyk7CiAgfQogIHN0YXRpYyBmaWx0ZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRmlsdGVyKGF0dHJzKTsKICB9CiAgc3RhdGljIGZsb2F0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0KGF0dHJzKTsKICB9CiAgc3RhdGljIGZvbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgdGVtcGxhdGVfRm9udChhdHRycyk7CiAgfQogIHN0YXRpYyBmb3JtYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRm9ybWF0KGF0dHJzKTsKICB9CiAgc3RhdGljIGhhbmRsZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSGFuZGxlcihhdHRycyk7CiAgfQogIHN0YXRpYyBoeXBoZW5hdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBIeXBoZW5hdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBpbWFnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBJbWFnZShhdHRycyk7CiAgfQogIHN0YXRpYyBpbWFnZUVkaXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW1hZ2VFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIGludGVnZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW50ZWdlcihhdHRycyk7CiAgfQogIHN0YXRpYyBpc3N1ZXJzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IElzc3VlcnMoYXR0cnMpOwogIH0KICBzdGF0aWMgaXRlbXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSXRlbXMoYXR0cnMpOwogIH0KICBzdGF0aWMga2VlcChhdHRycykgewogICAgcmV0dXJuIG5ldyBLZWVwKGF0dHJzKTsKICB9CiAgc3RhdGljIGtleVVzYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEtleVVzYWdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGxpbmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTGluZShhdHRycyk7CiAgfQogIHN0YXRpYyBsaW5lYXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTGluZWFyKGF0dHJzKTsKICB9CiAgc3RhdGljIGxvY2tEb2N1bWVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBMb2NrRG9jdW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWFuaWZlc3QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWFuaWZlc3QoYXR0cnMpOwogIH0KICBzdGF0aWMgbWFyZ2luKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1hcmdpbihhdHRycyk7CiAgfQogIHN0YXRpYyBtZHAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWRwKGF0dHJzKTsKICB9CiAgc3RhdGljIG1lZGl1bShhdHRycykgewogICAgcmV0dXJuIG5ldyBNZWRpdW0oYXR0cnMpOwogIH0KICBzdGF0aWMgbWVzc2FnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBNZXNzYWdlKGF0dHJzKTsKICB9CiAgc3RhdGljIG51bWVyaWNFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWVyaWNFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIG9jY3VyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE9jY3VyKGF0dHJzKTsKICB9CiAgc3RhdGljIG9pZChhdHRycykgewogICAgcmV0dXJuIG5ldyBPaWQoYXR0cnMpOwogIH0KICBzdGF0aWMgb2lkcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBPaWRzKGF0dHJzKTsKICB9CiAgc3RhdGljIG92ZXJmbG93KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE92ZXJmbG93KGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VBcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhZ2VBcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VTZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnZVNldChhdHRycyk7CiAgfQogIHN0YXRpYyBwYXJhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhcmEoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFzc3dvcmRFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhc3N3b3JkRWRpdChhdHRycyk7CiAgfQogIHN0YXRpYyBwYXR0ZXJuKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IHRlbXBsYXRlX1BhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgcGljdHVyZShhdHRycykgewogICAgcmV0dXJuIG5ldyBQaWN0dXJlKGF0dHJzKTsKICB9CiAgc3RhdGljIHByb3RvKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByb3RvKGF0dHJzKTsKICB9CiAgc3RhdGljIHJhZGlhbChhdHRycykgewogICAgcmV0dXJuIG5ldyBSYWRpYWwoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVhc29uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlYXNvbihhdHRycyk7CiAgfQogIHN0YXRpYyByZWFzb25zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlYXNvbnMoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVjdGFuZ2xlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlY3RhbmdsZShhdHRycyk7CiAgfQogIHN0YXRpYyByZWYoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVmRWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBzY3JpcHQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU2NyaXB0KGF0dHJzKTsKICB9CiAgc3RhdGljIHNldFByb3BlcnR5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNldFByb3BlcnR5KGF0dHJzKTsKICB9CiAgc3RhdGljIHNpZ25EYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNpZ25EYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIHNpZ25hdHVyZShhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWduYXR1cmUoYXR0cnMpOwogIH0KICBzdGF0aWMgc2lnbmluZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWduaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIHNvbGlkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNvbGlkKGF0dHJzKTsKICB9CiAgc3RhdGljIHNwZWFrKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNwZWFrKGF0dHJzKTsKICB9CiAgc3RhdGljIHN0aXBwbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3RpcHBsZShhdHRycyk7CiAgfQogIHN0YXRpYyBzdWJmb3JtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN1YmZvcm0oYXR0cnMpOwogIH0KICBzdGF0aWMgc3ViZm9ybVNldChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJmb3JtU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIHN1YmplY3RETihhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJqZWN0RE4oYXR0cnMpOwogIH0KICBzdGF0aWMgc3ViamVjdEROcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJqZWN0RE5zKGF0dHJzKTsKICB9CiAgc3RhdGljIHN1Ym1pdChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJtaXQoYXR0cnMpOwogIH0KICBzdGF0aWMgdGVtcGxhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGVtcGxhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdGV4dChhdHRycykgewogICAgcmV0dXJuIG5ldyBUZXh0KGF0dHJzKTsKICB9CiAgc3RhdGljIHRleHRFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRleHRFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIHRpbWUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZShhdHRycyk7CiAgfQogIHN0YXRpYyB0aW1lU3RhbXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZVN0YW1wKGF0dHJzKTsKICB9CiAgc3RhdGljIHRvb2xUaXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVG9vbFRpcChhdHRycyk7CiAgfQogIHN0YXRpYyB0cmF2ZXJzYWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHJhdmVyc2FsKGF0dHJzKTsKICB9CiAgc3RhdGljIHRyYXZlcnNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRyYXZlcnNlKGF0dHJzKTsKICB9CiAgc3RhdGljIHVpKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFVpKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbGlkYXRlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhbGlkYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbHVlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhbHVlKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhcmlhYmxlcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBWYXJpYWJsZXMoYXR0cnMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2JpbmQuanMKCgoKCgoKY29uc3QgYmluZF9OU19EQVRBU0VUUyA9IE5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZDsKZnVuY3Rpb24gY3JlYXRlVGV4dChjb250ZW50KSB7CiAgY29uc3Qgbm9kZSA9IG5ldyBUZXh0KHt9KTsKICBub2RlWyRjb250ZW50XSA9IGNvbnRlbnQ7CiAgcmV0dXJuIG5vZGU7Cn0KY2xhc3MgQmluZGVyIHsKICBjb25zdHJ1Y3Rvcihyb290KSB7CiAgICB0aGlzLnJvb3QgPSByb290OwogICAgdGhpcy5kYXRhc2V0cyA9IHJvb3QuZGF0YXNldHM7CiAgICB0aGlzLmRhdGEgPSByb290LmRhdGFzZXRzPy5kYXRhIHx8IG5ldyBYbWxPYmplY3QoTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkLCAiZGF0YSIpOwogICAgdGhpcy5lbXB0eU1lcmdlID0gdGhpcy5kYXRhWyRnZXRDaGlsZHJlbl0oKS5sZW5ndGggPT09IDA7CiAgICB0aGlzLnJvb3QuZm9ybSA9IHRoaXMuZm9ybSA9IHJvb3QudGVtcGxhdGVbJGNsb25lXSgpOwogIH0KICBfaXNDb25zdW1lRGF0YSgpIHsKICAgIHJldHVybiAhdGhpcy5lbXB0eU1lcmdlICYmIHRoaXMuX21lcmdlTW9kZTsKICB9CiAgX2lzTWF0Y2hUZW1wbGF0ZSgpIHsKICAgIHJldHVybiAhdGhpcy5faXNDb25zdW1lRGF0YSgpOwogIH0KICBiaW5kKCkgewogICAgdGhpcy5fYmluZEVsZW1lbnQodGhpcy5mb3JtLCB0aGlzLmRhdGEpOwogICAgcmV0dXJuIHRoaXMuZm9ybTsKICB9CiAgZ2V0RGF0YSgpIHsKICAgIHJldHVybiB0aGlzLmRhdGE7CiAgfQogIF9iaW5kVmFsdWUoZm9ybU5vZGUsIGRhdGEsIHBpY3R1cmUpIHsKICAgIGZvcm1Ob2RlWyRkYXRhXSA9IGRhdGE7CiAgICBpZiAoZm9ybU5vZGVbJGhhc1NldHRhYmxlVmFsdWVdKCkpIHsKICAgICAgaWYgKGRhdGFbJGlzRGF0YVZhbHVlXSgpKSB7CiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhWyRnZXREYXRhVmFsdWVdKCk7CiAgICAgICAgZm9ybU5vZGVbJHNldFZhbHVlXShjcmVhdGVUZXh0KHZhbHVlKSk7CiAgICAgIH0gZWxzZSBpZiAoZm9ybU5vZGUgaW5zdGFuY2VvZiBGaWVsZCAmJiBmb3JtTm9kZS51aT8uY2hvaWNlTGlzdD8ub3BlbiA9PT0gIm11bHRpU2VsZWN0IikgewogICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVskZ2V0Q2hpbGRyZW5dKCkubWFwKGNoaWxkID0+IGNoaWxkWyRjb250ZW50XS50cmltKCkpLmpvaW4oIlxuIik7CiAgICAgICAgZm9ybU5vZGVbJHNldFZhbHVlXShjcmVhdGVUZXh0KHZhbHVlKSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5faXNDb25zdW1lRGF0YSgpKSB7CiAgICAgICAgd2FybihgWEZBIC0gTm9kZXMgaGF2ZW4ndCB0aGUgc2FtZSB0eXBlLmApOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCFkYXRhWyRpc0RhdGFWYWx1ZV0oKSB8fCB0aGlzLl9pc01hdGNoVGVtcGxhdGUoKSkgewogICAgICB0aGlzLl9iaW5kRWxlbWVudChmb3JtTm9kZSwgZGF0YSk7CiAgICB9IGVsc2UgewogICAgICB3YXJuKGBYRkEgLSBOb2RlcyBoYXZlbid0IHRoZSBzYW1lIHR5cGUuYCk7CiAgICB9CiAgfQogIF9maW5kRGF0YUJ5TmFtZVRvQ29uc3VtZShuYW1lLCBpc1ZhbHVlLCBkYXRhTm9kZSwgZ2xvYmFsKSB7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgZ2VuZXJhdG9yLCBtYXRjaDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgIGdlbmVyYXRvciA9IGRhdGFOb2RlWyRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgZmFsc2UsIHRydWUpOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIG1hdGNoID0gZ2VuZXJhdG9yLm5leHQoKS52YWx1ZTsKICAgICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGlzVmFsdWUgPT09IG1hdGNoWyRpc0RhdGFWYWx1ZV0oKSkgewogICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGF0YU5vZGVbJG5hbWVzcGFjZUlkXSA9PT0gTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkICYmIGRhdGFOb2RlWyRub2RlTmFtZV0gPT09ICJkYXRhIikgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRhdGFOb2RlID0gZGF0YU5vZGVbJGdldFBhcmVudF0oKTsKICAgIH0KICAgIGlmICghZ2xvYmFsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZ2VuZXJhdG9yID0gdGhpcy5kYXRhWyRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgdHJ1ZSwgZmFsc2UpOwogICAgbWF0Y2ggPSBnZW5lcmF0b3IubmV4dCgpLnZhbHVlOwogICAgaWYgKG1hdGNoKSB7CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICAgIGdlbmVyYXRvciA9IHRoaXMuZGF0YVskZ2V0QXR0cmlidXRlSXRdKG5hbWUsIHRydWUpOwogICAgbWF0Y2ggPSBnZW5lcmF0b3IubmV4dCgpLnZhbHVlOwogICAgaWYgKG1hdGNoPy5bJGlzRGF0YVZhbHVlXSgpKSB7CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBfc2V0UHJvcGVydGllcyhmb3JtTm9kZSwgZGF0YU5vZGUpIHsKICAgIGlmICghZm9ybU5vZGUuaGFzT3duUHJvcGVydHkoInNldFByb3BlcnR5IikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCB7CiAgICAgIHJlZiwKICAgICAgdGFyZ2V0LAogICAgICBjb25uZWN0aW9uCiAgICB9IG9mIGZvcm1Ob2RlLnNldFByb3BlcnR5LmNoaWxkcmVuKSB7CiAgICAgIGlmIChjb25uZWN0aW9uKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFyZWYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBub2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBkYXRhTm9kZSwgcmVmLCBmYWxzZSwgZmFsc2UpOwogICAgICBpZiAoIW5vZGVzKSB7CiAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBbbm9kZV0gPSBub2RlczsKICAgICAgaWYgKCFub2RlWyRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YSkpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIG5vZGU6IG11c3QgYmUgYSBkYXRhIG5vZGUuYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdGFyZ2V0Tm9kZXMgPSBzZWFyY2hOb2RlKHRoaXMucm9vdCwgZm9ybU5vZGUsIHRhcmdldCwgZmFsc2UsIGZhbHNlKTsKICAgICAgaWYgKCF0YXJnZXROb2RlcykgewogICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgdGFyZ2V0OiAke3RhcmdldH0uYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgW3RhcmdldE5vZGVdID0gdGFyZ2V0Tm9kZXM7CiAgICAgIGlmICghdGFyZ2V0Tm9kZVskaXNEZXNjZW5kZW50XShmb3JtTm9kZSkpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHRhcmdldDogbXVzdCBiZSBhIHByb3BlcnR5IG9yIHN1YnByb3BlcnR5LmApOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHRhcmdldFBhcmVudCA9IHRhcmdldE5vZGVbJGdldFBhcmVudF0oKTsKICAgICAgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBTZXRQcm9wZXJ0eSB8fCB0YXJnZXRQYXJlbnQgaW5zdGFuY2VvZiBTZXRQcm9wZXJ0eSkgewogICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgdGFyZ2V0OiBjYW5ub3QgYmUgYSBzZXRQcm9wZXJ0eSBvciBvbmUgb2YgaXRzIHByb3BlcnRpZXMuYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBCaW5kSXRlbXMgfHwgdGFyZ2V0UGFyZW50IGluc3RhbmNlb2YgQmluZEl0ZW1zKSB7CiAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCB0YXJnZXQ6IGNhbm5vdCBiZSBhIGJpbmRJdGVtcyBvciBvbmUgb2YgaXRzIHByb3BlcnRpZXMuYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgY29udGVudCA9IG5vZGVbJHRleHRdKCk7CiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXROb2RlWyRub2RlTmFtZV07CiAgICAgIGlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgWEZBQXR0cmlidXRlKSB7CiAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIGF0dHJzW25hbWVdID0gY29udGVudDsKICAgICAgICBjb25zdCBvYmogPSBSZWZsZWN0LmNvbnN0cnVjdChPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0UGFyZW50KS5jb25zdHJ1Y3RvciwgW2F0dHJzXSk7CiAgICAgICAgdGFyZ2V0UGFyZW50W25hbWVdID0gb2JqW25hbWVdOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghdGFyZ2V0Tm9kZS5oYXNPd25Qcm9wZXJ0eSgkY29udGVudCkpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIG5vZGUgdG8gdXNlIGluIHNldFByb3BlcnR5YCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdGFyZ2V0Tm9kZVskZGF0YV0gPSBub2RlOwogICAgICB0YXJnZXROb2RlWyRjb250ZW50XSA9IGNvbnRlbnQ7CiAgICAgIHRhcmdldE5vZGVbJGZpbmFsaXplXSgpOwogICAgfQogIH0KICBfYmluZEl0ZW1zKGZvcm1Ob2RlLCBkYXRhTm9kZSkgewogICAgaWYgKCFmb3JtTm9kZS5oYXNPd25Qcm9wZXJ0eSgiaXRlbXMiKSB8fCAhZm9ybU5vZGUuaGFzT3duUHJvcGVydHkoImJpbmRJdGVtcyIpIHx8IGZvcm1Ob2RlLmJpbmRJdGVtcy5pc0VtcHR5KCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBpdGVtIG9mIGZvcm1Ob2RlLml0ZW1zLmNoaWxkcmVuKSB7CiAgICAgIGZvcm1Ob2RlWyRyZW1vdmVDaGlsZF0oaXRlbSk7CiAgICB9CiAgICBmb3JtTm9kZS5pdGVtcy5jbGVhcigpOwogICAgY29uc3QgbGFiZWxzID0gbmV3IEl0ZW1zKHt9KTsKICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBJdGVtcyh7fSk7CiAgICBmb3JtTm9kZVskYXBwZW5kQ2hpbGRdKGxhYmVscyk7CiAgICBmb3JtTm9kZS5pdGVtcy5wdXNoKGxhYmVscyk7CiAgICBmb3JtTm9kZVskYXBwZW5kQ2hpbGRdKHZhbHVlcyk7CiAgICBmb3JtTm9kZS5pdGVtcy5wdXNoKHZhbHVlcyk7CiAgICBmb3IgKGNvbnN0IHsKICAgICAgcmVmLAogICAgICBsYWJlbFJlZiwKICAgICAgdmFsdWVSZWYsCiAgICAgIGNvbm5lY3Rpb24KICAgIH0gb2YgZm9ybU5vZGUuYmluZEl0ZW1zLmNoaWxkcmVuKSB7CiAgICAgIGlmIChjb25uZWN0aW9uKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFyZWYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBub2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBkYXRhTm9kZSwgcmVmLCBmYWxzZSwgZmFsc2UpOwogICAgICBpZiAoIW5vZGVzKSB7CiAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHsKICAgICAgICBpZiAoIW5vZGVbJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhc2V0cykpIHsKICAgICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgcmVmICgke3JlZn0pOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFiZWxOb2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBub2RlLCBsYWJlbFJlZiwgdHJ1ZSwgZmFsc2UpOwogICAgICAgIGlmICghbGFiZWxOb2RlcykgewogICAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCBsYWJlbDogJHtsYWJlbFJlZn0uYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgW2xhYmVsTm9kZV0gPSBsYWJlbE5vZGVzOwogICAgICAgIGlmICghbGFiZWxOb2RlWyRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIGxhYmVsOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdmFsdWVOb2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBub2RlLCB2YWx1ZVJlZiwgdHJ1ZSwgZmFsc2UpOwogICAgICAgIGlmICghdmFsdWVOb2RlcykgewogICAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCB2YWx1ZTogJHt2YWx1ZVJlZn0uYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgW3ZhbHVlTm9kZV0gPSB2YWx1ZU5vZGVzOwogICAgICAgIGlmICghdmFsdWVOb2RlWyRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHZhbHVlOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFiZWwgPSBjcmVhdGVUZXh0KGxhYmVsTm9kZVskdGV4dF0oKSk7CiAgICAgICAgY29uc3QgdmFsdWUgPSBjcmVhdGVUZXh0KHZhbHVlTm9kZVskdGV4dF0oKSk7CiAgICAgICAgbGFiZWxzWyRhcHBlbmRDaGlsZF0obGFiZWwpOwogICAgICAgIGxhYmVscy50ZXh0LnB1c2gobGFiZWwpOwogICAgICAgIHZhbHVlc1skYXBwZW5kQ2hpbGRdKHZhbHVlKTsKICAgICAgICB2YWx1ZXMudGV4dC5wdXNoKHZhbHVlKTsKICAgICAgfQogICAgfQogIH0KICBfYmluZE9jY3VycmVuY2VzKGZvcm1Ob2RlLCBtYXRjaGVzLCBwaWN0dXJlKSB7CiAgICBsZXQgYmFzZUNsb25lOwogICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkgewogICAgICBiYXNlQ2xvbmUgPSBmb3JtTm9kZVskY2xvbmVdKCk7CiAgICAgIGJhc2VDbG9uZVskcmVtb3ZlQ2hpbGRdKGJhc2VDbG9uZS5vY2N1cik7CiAgICAgIGJhc2VDbG9uZS5vY2N1ciA9IG51bGw7CiAgICB9CiAgICB0aGlzLl9iaW5kVmFsdWUoZm9ybU5vZGUsIG1hdGNoZXNbMF0sIHBpY3R1cmUpOwogICAgdGhpcy5fc2V0UHJvcGVydGllcyhmb3JtTm9kZSwgbWF0Y2hlc1swXSk7CiAgICB0aGlzLl9iaW5kSXRlbXMoZm9ybU5vZGUsIG1hdGNoZXNbMF0pOwogICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAxKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHBhcmVudCA9IGZvcm1Ob2RlWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBuYW1lID0gZm9ybU5vZGVbJG5vZGVOYW1lXTsKICAgIGNvbnN0IHBvcyA9IHBhcmVudFskaW5kZXhPZl0oZm9ybU5vZGUpOwogICAgZm9yIChsZXQgaSA9IDEsIGlpID0gbWF0Y2hlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlc1tpXTsKICAgICAgY29uc3QgY2xvbmUgPSBiYXNlQ2xvbmVbJGNsb25lXSgpOwogICAgICBwYXJlbnRbbmFtZV0ucHVzaChjbG9uZSk7CiAgICAgIHBhcmVudFskaW5zZXJ0QXRdKHBvcyArIGksIGNsb25lKTsKICAgICAgdGhpcy5fYmluZFZhbHVlKGNsb25lLCBtYXRjaCwgcGljdHVyZSk7CiAgICAgIHRoaXMuX3NldFByb3BlcnRpZXMoY2xvbmUsIG1hdGNoKTsKICAgICAgdGhpcy5fYmluZEl0ZW1zKGNsb25lLCBtYXRjaCk7CiAgICB9CiAgfQogIF9jcmVhdGVPY2N1cnJlbmNlcyhmb3JtTm9kZSkgewogICAgaWYgKCF0aGlzLmVtcHR5TWVyZ2UpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgewogICAgICBvY2N1cgogICAgfSA9IGZvcm1Ob2RlOwogICAgaWYgKCFvY2N1ciB8fCBvY2N1ci5pbml0aWFsIDw9IDEpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGFyZW50ID0gZm9ybU5vZGVbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IG5hbWUgPSBmb3JtTm9kZVskbm9kZU5hbWVdOwogICAgaWYgKCEocGFyZW50W25hbWVdIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBjdXJyZW50TnVtYmVyOwogICAgaWYgKGZvcm1Ob2RlLm5hbWUpIHsKICAgICAgY3VycmVudE51bWJlciA9IHBhcmVudFtuYW1lXS5jaGlsZHJlbi5maWx0ZXIoZSA9PiBlLm5hbWUgPT09IGZvcm1Ob2RlLm5hbWUpLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnROdW1iZXIgPSBwYXJlbnRbbmFtZV0uY2hpbGRyZW4ubGVuZ3RoOwogICAgfQogICAgY29uc3QgcG9zID0gcGFyZW50WyRpbmRleE9mXShmb3JtTm9kZSkgKyAxOwogICAgY29uc3QgaWkgPSBvY2N1ci5pbml0aWFsIC0gY3VycmVudE51bWJlcjsKICAgIGlmIChpaSkgewogICAgICBjb25zdCBub2RlQ2xvbmUgPSBmb3JtTm9kZVskY2xvbmVdKCk7CiAgICAgIG5vZGVDbG9uZVskcmVtb3ZlQ2hpbGRdKG5vZGVDbG9uZS5vY2N1cik7CiAgICAgIG5vZGVDbG9uZS5vY2N1ciA9IG51bGw7CiAgICAgIHBhcmVudFtuYW1lXS5wdXNoKG5vZGVDbG9uZSk7CiAgICAgIHBhcmVudFskaW5zZXJ0QXRdKHBvcywgbm9kZUNsb25lKTsKICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgY2xvbmUgPSBub2RlQ2xvbmVbJGNsb25lXSgpOwogICAgICAgIHBhcmVudFtuYW1lXS5wdXNoKGNsb25lKTsKICAgICAgICBwYXJlbnRbJGluc2VydEF0XShwb3MgKyBpLCBjbG9uZSk7CiAgICAgIH0KICAgIH0KICB9CiAgX2dldE9jY3VySW5mbyhmb3JtTm9kZSkgewogICAgY29uc3QgewogICAgICBuYW1lLAogICAgICBvY2N1cgogICAgfSA9IGZvcm1Ob2RlOwogICAgaWYgKCFvY2N1ciB8fCAhbmFtZSkgewogICAgICByZXR1cm4gWzEsIDFdOwogICAgfQogICAgY29uc3QgbWF4ID0gb2NjdXIubWF4ID09PSAtMSA/IEluZmluaXR5IDogb2NjdXIubWF4OwogICAgcmV0dXJuIFtvY2N1ci5taW4sIG1heF07CiAgfQogIF9zZXRBbmRCaW5kKGZvcm1Ob2RlLCBkYXRhTm9kZSkgewogICAgdGhpcy5fc2V0UHJvcGVydGllcyhmb3JtTm9kZSwgZGF0YU5vZGUpOwogICAgdGhpcy5fYmluZEl0ZW1zKGZvcm1Ob2RlLCBkYXRhTm9kZSk7CiAgICB0aGlzLl9iaW5kRWxlbWVudChmb3JtTm9kZSwgZGF0YU5vZGUpOwogIH0KICBfYmluZEVsZW1lbnQoZm9ybU5vZGUsIGRhdGFOb2RlKSB7CiAgICBjb25zdCB1c2VsZXNzTm9kZXMgPSBbXTsKICAgIHRoaXMuX2NyZWF0ZU9jY3VycmVuY2VzKGZvcm1Ob2RlKTsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZm9ybU5vZGVbJGdldENoaWxkcmVuXSgpKSB7CiAgICAgIGlmIChjaGlsZFskZGF0YV0pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodGhpcy5fbWVyZ2VNb2RlID09PSB1bmRlZmluZWQgJiYgY2hpbGRbJG5vZGVOYW1lXSA9PT0gInN1YmZvcm0iKSB7CiAgICAgICAgdGhpcy5fbWVyZ2VNb2RlID0gY2hpbGQubWVyZ2VNb2RlID09PSAiY29uc3VtZURhdGEiOwogICAgICAgIGNvbnN0IGRhdGFDaGlsZHJlbiA9IGRhdGFOb2RlWyRnZXRDaGlsZHJlbl0oKTsKICAgICAgICBpZiAoZGF0YUNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMuX2JpbmRPY2N1cnJlbmNlcyhjaGlsZCwgW2RhdGFDaGlsZHJlblswXV0sIG51bGwpOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbXB0eU1lcmdlKSB7CiAgICAgICAgICBjb25zdCBuc0lkID0gZGF0YU5vZGVbJG5hbWVzcGFjZUlkXSA9PT0gYmluZF9OU19EQVRBU0VUUyA/IC0xIDogZGF0YU5vZGVbJG5hbWVzcGFjZUlkXTsKICAgICAgICAgIGNvbnN0IGRhdGFDaGlsZCA9IGNoaWxkWyRkYXRhXSA9IG5ldyBYbWxPYmplY3QobnNJZCwgY2hpbGQubmFtZSB8fCAicm9vdCIpOwogICAgICAgICAgZGF0YU5vZGVbJGFwcGVuZENoaWxkXShkYXRhQ2hpbGQpOwogICAgICAgICAgdGhpcy5fYmluZEVsZW1lbnQoY2hpbGQsIGRhdGFDaGlsZCk7CiAgICAgICAgfQogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghY2hpbGRbJGlzQmluZGFibGVdKCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgZ2xvYmFsID0gZmFsc2U7CiAgICAgIGxldCBwaWN0dXJlID0gbnVsbDsKICAgICAgbGV0IHJlZiA9IG51bGw7CiAgICAgIGxldCBtYXRjaCA9IG51bGw7CiAgICAgIGlmIChjaGlsZC5iaW5kKSB7CiAgICAgICAgc3dpdGNoIChjaGlsZC5iaW5kLm1hdGNoKSB7CiAgICAgICAgICBjYXNlICJub25lIjoKICAgICAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgZGF0YU5vZGUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNhc2UgImdsb2JhbCI6CiAgICAgICAgICAgIGdsb2JhbCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiZGF0YVJlZiI6CiAgICAgICAgICAgIGlmICghY2hpbGQuYmluZC5yZWYpIHsKICAgICAgICAgICAgICB3YXJuKGBYRkEgLSByZWYgaXMgZW1wdHkgaW4gbm9kZSAke2NoaWxkWyRub2RlTmFtZV19LmApOwogICAgICAgICAgICAgIHRoaXMuX3NldEFuZEJpbmQoY2hpbGQsIGRhdGFOb2RlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWYgPSBjaGlsZC5iaW5kLnJlZjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGNoaWxkLmJpbmQucGljdHVyZSkgewogICAgICAgICAgcGljdHVyZSA9IGNoaWxkLmJpbmQucGljdHVyZVskY29udGVudF07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB0aGlzLl9nZXRPY2N1ckluZm8oY2hpbGQpOwogICAgICBpZiAocmVmKSB7CiAgICAgICAgbWF0Y2ggPSBzZWFyY2hOb2RlKHRoaXMucm9vdCwgZGF0YU5vZGUsIHJlZiwgdHJ1ZSwgZmFsc2UpOwogICAgICAgIGlmIChtYXRjaCA9PT0gbnVsbCkgewogICAgICAgICAgbWF0Y2ggPSBjcmVhdGVEYXRhTm9kZSh0aGlzLmRhdGEsIGRhdGFOb2RlLCByZWYpOwogICAgICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLl9pc0NvbnN1bWVEYXRhKCkpIHsKICAgICAgICAgICAgbWF0Y2hbJGNvbnN1bWVkXSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9zZXRBbmRCaW5kKGNoaWxkLCBtYXRjaCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX2lzQ29uc3VtZURhdGEoKSkgewogICAgICAgICAgICBtYXRjaCA9IG1hdGNoLmZpbHRlcihub2RlID0+ICFub2RlWyRjb25zdW1lZF0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IG1heCkgewogICAgICAgICAgICBtYXRjaCA9IG1hdGNoLnNsaWNlKDAsIG1heCk7CiAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBtYXRjaCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWF0Y2ggJiYgdGhpcy5faXNDb25zdW1lRGF0YSgpKSB7CiAgICAgICAgICAgIG1hdGNoLmZvckVhY2gobm9kZSA9PiB7CiAgICAgICAgICAgICAgbm9kZVskY29uc3VtZWRdID0gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICghY2hpbGQubmFtZSkgewogICAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgZGF0YU5vZGUpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9pc0NvbnN1bWVEYXRhKCkpIHsKICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBbXTsKICAgICAgICAgIHdoaWxlIChtYXRjaGVzLmxlbmd0aCA8IG1heCkgewogICAgICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuX2ZpbmREYXRhQnlOYW1lVG9Db25zdW1lKGNoaWxkLm5hbWUsIGNoaWxkWyRoYXNTZXR0YWJsZVZhbHVlXSgpLCBkYXRhTm9kZSwgZ2xvYmFsKTsKICAgICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvdW5kWyRjb25zdW1lZF0gPSB0cnVlOwogICAgICAgICAgICBtYXRjaGVzLnB1c2goZm91bmQpOwogICAgICAgICAgfQogICAgICAgICAgbWF0Y2ggPSBtYXRjaGVzLmxlbmd0aCA+IDAgPyBtYXRjaGVzIDogbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWF0Y2ggPSBkYXRhTm9kZVskZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXRdKGNoaWxkLm5hbWUsIGZhbHNlLCB0aGlzLmVtcHR5TWVyZ2UpLm5leHQoKS52YWx1ZTsKICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgaWYgKG1pbiA9PT0gMCkgewogICAgICAgICAgICAgIHVzZWxlc3NOb2Rlcy5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBuc0lkID0gZGF0YU5vZGVbJG5hbWVzcGFjZUlkXSA9PT0gYmluZF9OU19EQVRBU0VUUyA/IC0xIDogZGF0YU5vZGVbJG5hbWVzcGFjZUlkXTsKICAgICAgICAgICAgbWF0Y2ggPSBjaGlsZFskZGF0YV0gPSBuZXcgWG1sT2JqZWN0KG5zSWQsIGNoaWxkLm5hbWUpOwogICAgICAgICAgICBpZiAodGhpcy5lbXB0eU1lcmdlKSB7CiAgICAgICAgICAgICAgbWF0Y2hbJGNvbnN1bWVkXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YU5vZGVbJGFwcGVuZENoaWxkXShtYXRjaCk7CiAgICAgICAgICAgIHRoaXMuX3NldEFuZEJpbmQoY2hpbGQsIG1hdGNoKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5lbXB0eU1lcmdlKSB7CiAgICAgICAgICAgIG1hdGNoWyRjb25zdW1lZF0gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgbWF0Y2ggPSBbbWF0Y2hdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobWF0Y2gpIHsKICAgICAgICB0aGlzLl9iaW5kT2NjdXJyZW5jZXMoY2hpbGQsIG1hdGNoLCBwaWN0dXJlKTsKICAgICAgfSBlbHNlIGlmIChtaW4gPiAwKSB7CiAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgZGF0YU5vZGUpOwogICAgICB9IGVsc2UgewogICAgICAgIHVzZWxlc3NOb2Rlcy5wdXNoKGNoaWxkKTsKICAgICAgfQogICAgfQogICAgdXNlbGVzc05vZGVzLmZvckVhY2gobm9kZSA9PiBub2RlWyRnZXRQYXJlbnRdKClbJHJlbW92ZUNoaWxkXShub2RlKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvZGF0YS5qcwoKY2xhc3MgRGF0YUhhbmRsZXIgewogIGNvbnN0cnVjdG9yKHJvb3QsIGRhdGEpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLmRhdGFzZXQgPSByb290LmRhdGFzZXRzIHx8IG51bGw7CiAgfQogIHNlcmlhbGl6ZShzdG9yYWdlKSB7CiAgICBjb25zdCBzdGFjayA9IFtbLTEsIHRoaXMuZGF0YVskZ2V0Q2hpbGRyZW5dKCldXTsKICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGxhc3QgPSBzdGFjay5hdCgtMSk7CiAgICAgIGNvbnN0IFtpLCBjaGlsZHJlbl0gPSBsYXN0OwogICAgICBpZiAoaSArIDEgPT09IGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bKytsYXN0WzBdXTsKICAgICAgY29uc3Qgc3RvcmFnZUVudHJ5ID0gc3RvcmFnZS5nZXQoY2hpbGRbJHVpZF0pOwogICAgICBpZiAoc3RvcmFnZUVudHJ5KSB7CiAgICAgICAgY2hpbGRbJHNldFZhbHVlXShzdG9yYWdlRW50cnkpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjaGlsZFskZ2V0QXR0cmlidXRlc10oKTsKICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGF0dHJpYnV0ZXMudmFsdWVzKCkpIHsKICAgICAgICAgIGNvbnN0IGVudHJ5ID0gc3RvcmFnZS5nZXQodmFsdWVbJHVpZF0pOwogICAgICAgICAgaWYgKGVudHJ5KSB7CiAgICAgICAgICAgIHZhbHVlWyRzZXRWYWx1ZV0oZW50cnkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgbm9kZXMgPSBjaGlsZFskZ2V0Q2hpbGRyZW5dKCk7CiAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgc3RhY2sucHVzaChbLTEsIG5vZGVzXSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGJ1ZiA9IFtgPHhmYTpkYXRhc2V0cyB4bWxuczp4ZmE9Imh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyI+YF07CiAgICBpZiAodGhpcy5kYXRhc2V0KSB7CiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5kYXRhc2V0WyRnZXRDaGlsZHJlbl0oKSkgewogICAgICAgIGlmIChjaGlsZFskbm9kZU5hbWVdICE9PSAiZGF0YSIpIHsKICAgICAgICAgIGNoaWxkWyR0b1N0cmluZ10oYnVmKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZGF0YVskdG9TdHJpbmddKGJ1Zik7CiAgICBidWYucHVzaCgiPC94ZmE6ZGF0YXNldHM+Iik7CiAgICByZXR1cm4gYnVmLmpvaW4oIiIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2NvbmZpZy5qcwoKCgoKCmNvbnN0IENPTkZJR19OU19JRCA9IE5hbWVzcGFjZUlkcy5jb25maWcuaWQ7CmNsYXNzIEFjcm9iYXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFjcm9iYXQiLCB0cnVlKTsKICAgIHRoaXMuYWNyb2JhdDcgPSBudWxsOwogICAgdGhpcy5hdXRvU2F2ZSA9IG51bGw7CiAgICB0aGlzLmNvbW1vbiA9IG51bGw7CiAgICB0aGlzLnZhbGlkYXRlID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMgPSBudWxsOwogICAgdGhpcy5zdWJtaXRVcmwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQWNyb2JhdDcgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFjcm9iYXQ3IiwgdHJ1ZSk7CiAgICB0aGlzLmR5bmFtaWNSZW5kZXIgPSBudWxsOwogIH0KfQpjbGFzcyBBREJFX0pTQ29uc29sZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiQURCRV9KU0NvbnNvbGUiLCBbImRlbGVnYXRlIiwgIkVuYWJsZSIsICJEaXNhYmxlIl0pOwogIH0KfQpjbGFzcyBBREJFX0pTRGVidWdnZXIgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIkFEQkVfSlNEZWJ1Z2dlciIsIFsiZGVsZWdhdGUiLCAiRW5hYmxlIiwgIkRpc2FibGUiXSk7CiAgfQp9CmNsYXNzIEFkZFNpbGVudFByaW50IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFkZFNpbGVudFByaW50Iik7CiAgfQp9CmNsYXNzIEFkZFZpZXdlclByZWZlcmVuY2VzIGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFkZFZpZXdlclByZWZlcmVuY2VzIik7CiAgfQp9CmNsYXNzIEFkanVzdERhdGEgZXh0ZW5kcyBPcHRpb24xMCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWRqdXN0RGF0YSIpOwogIH0KfQpjbGFzcyBBZG9iZUV4dGVuc2lvbkxldmVsIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWRvYmVFeHRlbnNpb25MZXZlbCIsIDAsIG4gPT4gbiA+PSAxICYmIG4gPD0gOCk7CiAgfQp9CmNsYXNzIEFnZW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhZ2VudCIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lID8gYXR0cmlidXRlcy5uYW1lLnRyaW0oKSA6ICIiOwogICAgdGhpcy5jb21tb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQWx3YXlzRW1iZWQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhbHdheXNFbWJlZCIpOwogIH0KfQpjbGFzcyBBbWQgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFtZCIpOwogIH0KfQpjbGFzcyBjb25maWdfQXJlYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYXJlYSIpOwogICAgdGhpcy5sZXZlbCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmxldmVsLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPj0gMSAmJiBuIDw9IDMKICAgIH0pOwogICAgdGhpcy5uYW1lID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmFtZSwgWyIiLCAiYmFyY29kZSIsICJjb3JlaW5pdCIsICJkZXZpY2VEcml2ZXIiLCAiZm9udCIsICJnZW5lcmFsIiwgImxheW91dCIsICJtZXJnZSIsICJzY3JpcHQiLCAic2lnbmF0dXJlIiwgInNvdXJjZVNldCIsICJ0ZW1wbGF0ZUNhY2hlIl0pOwogIH0KfQpjbGFzcyBBdHRyaWJ1dGVzIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhdHRyaWJ1dGVzIiwgWyJwcmVzZXJ2ZSIsICJkZWxlZ2F0ZSIsICJpZ25vcmUiXSk7CiAgfQp9CmNsYXNzIEF1dG9TYXZlIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhdXRvU2F2ZSIsIFsiZGlzYWJsZWQiLCAiZW5hYmxlZCJdKTsKICB9Cn0KY2xhc3MgQmFzZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYmFzZSIpOwogIH0KfQpjbGFzcyBCYXRjaE91dHB1dCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYmF0Y2hPdXRwdXQiKTsKICAgIHRoaXMuZm9ybWF0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZm9ybWF0LCBbIm5vbmUiLCAiY29uY2F0IiwgInppcCIsICJ6aXBDb21wcmVzcyJdKTsKICB9Cn0KY2xhc3MgQmVoYXZpb3JPdmVycmlkZSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImJlaGF2aW9yT3ZlcnJpZGUiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IG5ldyBNYXAodGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiB4LmluY2x1ZGVzKCI6IikpLm1hcCh4ID0+IHguc3BsaXQoIjoiLCAyKSkpOwogIH0KfQpjbGFzcyBDYWNoZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY2FjaGUiLCB0cnVlKTsKICAgIHRoaXMudGVtcGxhdGVDYWNoZSA9IG51bGw7CiAgfQp9CmNsYXNzIENoYW5nZSBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjaGFuZ2UiKTsKICB9Cn0KY2xhc3MgQ29tbW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjb21tb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YSA9IG51bGw7CiAgICB0aGlzLmxvY2FsZSA9IG51bGw7CiAgICB0aGlzLmxvY2FsZVNldCA9IG51bGw7CiAgICB0aGlzLm1lc3NhZ2luZyA9IG51bGw7CiAgICB0aGlzLnN1cHByZXNzQmFubmVyID0gbnVsbDsKICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnaW5nID0gbnVsbDsKICAgIHRoaXMudmVyc2lvbkNvbnRyb2wgPSBudWxsOwogICAgdGhpcy5sb2cgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQ29tcHJlc3MgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbXByZXNzIik7CiAgICB0aGlzLnNjb3BlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuc2NvcGUsIFsiaW1hZ2VPbmx5IiwgImRvY3VtZW50Il0pOwogIH0KfQpjbGFzcyBDb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlIik7CiAgfQp9CmNsYXNzIENvbXByZXNzT2JqZWN0U3RyZWFtIGV4dGVuZHMgT3B0aW9uMTAgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbXByZXNzT2JqZWN0U3RyZWFtIik7CiAgfQp9CmNsYXNzIENvbXByZXNzaW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjb21wcmVzc2lvbiIsIHRydWUpOwogICAgdGhpcy5jb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUgPSBudWxsOwogICAgdGhpcy5jb21wcmVzc09iamVjdFN0cmVhbSA9IG51bGw7CiAgICB0aGlzLmxldmVsID0gbnVsbDsKICAgIHRoaXMudHlwZSA9IG51bGw7CiAgfQp9CmNsYXNzIENvbmZpZyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29uZmlnIiwgdHJ1ZSk7CiAgICB0aGlzLmFjcm9iYXQgPSBudWxsOwogICAgdGhpcy5wcmVzZW50ID0gbnVsbDsKICAgIHRoaXMudHJhY2UgPSBudWxsOwogICAgdGhpcy5hZ2VudCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBDb25mb3JtYW5jZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29uZm9ybWFuY2UiLCBbIkEiLCAiQiJdKTsKICB9Cn0KY2xhc3MgQ29udGVudENvcHkgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29udGVudENvcHkiKTsKICB9Cn0KY2xhc3MgQ29waWVzIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29waWVzIiwgMSwgbiA9PiBuID49IDEpOwogIH0KfQpjbGFzcyBDcmVhdG9yIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjcmVhdG9yIik7CiAgfQp9CmNsYXNzIEN1cnJlbnRQYWdlIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY3VycmVudFBhZ2UiLCAwLCBuID0+IG4gPj0gMCk7CiAgfQp9CmNsYXNzIERhdGEgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRhdGEiLCB0cnVlKTsKICAgIHRoaXMuYWRqdXN0RGF0YSA9IG51bGw7CiAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsOwogICAgdGhpcy5pbmNyZW1lbnRhbExvYWQgPSBudWxsOwogICAgdGhpcy5vdXRwdXRYU0wgPSBudWxsOwogICAgdGhpcy5yYW5nZSA9IG51bGw7CiAgICB0aGlzLnJlY29yZCA9IG51bGw7CiAgICB0aGlzLnN0YXJ0Tm9kZSA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgICB0aGlzLndpbmRvdyA9IG51bGw7CiAgICB0aGlzLnhzbCA9IG51bGw7CiAgICB0aGlzLmV4Y2x1ZGVOUyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50cmFuc2Zvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRGVidWcgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRlYnVnIiwgdHJ1ZSk7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIERlZmF1bHRUeXBlZmFjZSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRlZmF1bHRUeXBlZmFjZSIpOwogICAgdGhpcy53cml0aW5nU2NyaXB0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMud3JpdGluZ1NjcmlwdCwgWyIqIiwgIkFyYWJpYyIsICJDeXJpbGxpYyIsICJFYXN0RXVyb3BlYW5Sb21hbiIsICJHcmVlayIsICJIZWJyZXciLCAiSmFwYW5lc2UiLCAiS29yZWFuIiwgIlJvbWFuIiwgIlNpbXBsaWZpZWRDaGluZXNlIiwgIlRoYWkiLCAiVHJhZGl0aW9uYWxDaGluZXNlIiwgIlZpZXRuYW1lc2UiXSk7CiAgfQp9CmNsYXNzIERlc3RpbmF0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkZXN0aW5hdGlvbiIsIFsicGRmIiwgInBjbCIsICJwcyIsICJ3ZWJDbGllbnQiLCAienBsIl0pOwogIH0KfQpjbGFzcyBEb2N1bWVudEFzc2VtYmx5IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRvY3VtZW50QXNzZW1ibHkiKTsKICB9Cn0KY2xhc3MgRHJpdmVyIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkcml2ZXIiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSA/IGF0dHJpYnV0ZXMubmFtZS50cmltKCkgOiAiIjsKICAgIHRoaXMuZm9udEluZm8gPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBEdXBsZXhPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImR1cGxleE9wdGlvbiIsIFsic2ltcGxleCIsICJkdXBsZXhGbGlwTG9uZ0VkZ2UiLCAiZHVwbGV4RmxpcFNob3J0RWRnZSJdKTsKICB9Cn0KY2xhc3MgRHluYW1pY1JlbmRlciBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZHluYW1pY1JlbmRlciIsIFsiZm9yYmlkZGVuIiwgInJlcXVpcmVkIl0pOwogIH0KfQpjbGFzcyBFbWJlZCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbWJlZCIpOwogIH0KfQpjbGFzcyBjb25maWdfRW5jcnlwdCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbmNyeXB0Iik7CiAgfQp9CmNsYXNzIGNvbmZpZ19FbmNyeXB0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbmNyeXB0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmVuY3J5cHQgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0aW9uTGV2ZWwgPSBudWxsOwogICAgdGhpcy5wZXJtaXNzaW9ucyA9IG51bGw7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25MZXZlbCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZW5jcnlwdGlvbkxldmVsIiwgWyI0MGJpdCIsICIxMjhiaXQiXSk7CiAgfQp9CmNsYXNzIEVuZm9yY2UgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImVuZm9yY2UiKTsKICB9Cn0KY2xhc3MgRXF1YXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlcXVhdGUiKTsKICAgIHRoaXMuZm9yY2UgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5mb3JjZSwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID09PSAwCiAgICB9KTsKICAgIHRoaXMuZnJvbSA9IGF0dHJpYnV0ZXMuZnJvbSB8fCAiIjsKICAgIHRoaXMudG8gPSBhdHRyaWJ1dGVzLnRvIHx8ICIiOwogIH0KfQpjbGFzcyBFcXVhdGVSYW5nZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZXF1YXRlUmFuZ2UiKTsKICAgIHRoaXMuZnJvbSA9IGF0dHJpYnV0ZXMuZnJvbSB8fCAiIjsKICAgIHRoaXMudG8gPSBhdHRyaWJ1dGVzLnRvIHx8ICIiOwogICAgdGhpcy5fdW5pY29kZVJhbmdlID0gYXR0cmlidXRlcy51bmljb2RlUmFuZ2UgfHwgIiI7CiAgfQogIGdldCB1bmljb2RlUmFuZ2UoKSB7CiAgICBjb25zdCByYW5nZXMgPSBbXTsKICAgIGNvbnN0IHVuaWNvZGVSZWdleCA9IC9VXCsoWzAtOWEtZkEtRl0rKS87CiAgICBjb25zdCB1bmljb2RlUmFuZ2UgPSB0aGlzLl91bmljb2RlUmFuZ2U7CiAgICBmb3IgKGxldCByYW5nZSBvZiB1bmljb2RlUmFuZ2Uuc3BsaXQoIiwiKS5tYXAoeCA9PiB4LnRyaW0oKSkuZmlsdGVyKHggPT4gISF4KSkgewogICAgICByYW5nZSA9IHJhbmdlLnNwbGl0KCItIiwgMikubWFwKHggPT4gewogICAgICAgIGNvbnN0IGZvdW5kID0geC5tYXRjaCh1bmljb2RlUmVnZXgpOwogICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyc2VJbnQoZm91bmRbMV0sIDE2KTsKICAgICAgfSk7CiAgICAgIGlmIChyYW5nZS5sZW5ndGggPT09IDEpIHsKICAgICAgICByYW5nZS5wdXNoKHJhbmdlWzBdKTsKICAgICAgfQogICAgICByYW5nZXMucHVzaChyYW5nZSk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ1bmljb2RlUmFuZ2UiLCByYW5nZXMpOwogIH0KfQpjbGFzcyBFeGNsdWRlIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZXhjbHVkZSIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiB4ICYmIFsiY2FsY3VsYXRlIiwgImNsb3NlIiwgImVudGVyIiwgImV4aXQiLCAiaW5pdGlhbGl6ZSIsICJyZWFkeSIsICJ2YWxpZGF0ZSJdLmluY2x1ZGVzKHgpKTsKICB9Cn0KY2xhc3MgRXhjbHVkZU5TIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJleGNsdWRlTlMiKTsKICB9Cn0KY2xhc3MgRmxpcExhYmVsIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmbGlwTGFiZWwiLCBbInVzZVByaW50ZXJTZXR0aW5nIiwgIm9uIiwgIm9mZiJdKTsKICB9Cn0KY2xhc3MgY29uZmlnX0ZvbnRJbmZvIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmb250SW5mbyIsIHRydWUpOwogICAgdGhpcy5lbWJlZCA9IG51bGw7CiAgICB0aGlzLm1hcCA9IG51bGw7CiAgICB0aGlzLnN1YnNldEJlbG93ID0gbnVsbDsKICAgIHRoaXMuYWx3YXlzRW1iZWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGVmYXVsdFR5cGVmYWNlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm5ldmVyRW1iZWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRm9ybUZpZWxkRmlsbGluZyBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmb3JtRmllbGRGaWxsaW5nIik7CiAgfQp9CmNsYXNzIEdyb3VwUGFyZW50IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJncm91cFBhcmVudCIpOwogIH0KfQpjbGFzcyBJZkVtcHR5IGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpZkVtcHR5IiwgWyJkYXRhVmFsdWUiLCAiZGF0YUdyb3VwIiwgImlnbm9yZSIsICJyZW1vdmUiXSk7CiAgfQp9CmNsYXNzIEluY2x1ZGVYRFBDb250ZW50IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpbmNsdWRlWERQQ29udGVudCIpOwogIH0KfQpjbGFzcyBJbmNyZW1lbnRhbExvYWQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImluY3JlbWVudGFsTG9hZCIsIFsibm9uZSIsICJmb3J3YXJkT25seSJdKTsKICB9Cn0KY2xhc3MgSW5jcmVtZW50YWxNZXJnZSBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpbmNyZW1lbnRhbE1lcmdlIik7CiAgfQp9CmNsYXNzIEludGVyYWN0aXZlIGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImludGVyYWN0aXZlIik7CiAgfQp9CmNsYXNzIEpvZyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiam9nIiwgWyJ1c2VQcmludGVyU2V0dGluZyIsICJub25lIiwgInBhZ2VTZXQiXSk7CiAgfQp9CmNsYXNzIExhYmVsUHJpbnRlciBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibGFiZWxQcmludGVyIiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5uYW1lLCBbInpwbCIsICJkcGwiLCAiaXBsIiwgInRjcGwiXSk7CiAgICB0aGlzLmJhdGNoT3V0cHV0ID0gbnVsbDsKICAgIHRoaXMuZmxpcExhYmVsID0gbnVsbDsKICAgIHRoaXMuZm9udEluZm8gPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBMYXlvdXQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImxheW91dCIsIFsicGFnaW5hdGUiLCAicGFuZWwiXSk7CiAgfQp9CmNsYXNzIExldmVsIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibGV2ZWwiLCAwLCBuID0+IG4gPiAwKTsKICB9Cn0KY2xhc3MgTGluZWFyaXplZCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJsaW5lYXJpemVkIik7CiAgfQp9CmNsYXNzIExvY2FsZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9jYWxlIik7CiAgfQp9CmNsYXNzIExvY2FsZVNldCBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9jYWxlU2V0Iik7CiAgfQp9CmNsYXNzIExvZyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9nIiwgdHJ1ZSk7CiAgICB0aGlzLm1vZGUgPSBudWxsOwogICAgdGhpcy50aHJlc2hvbGQgPSBudWxsOwogICAgdGhpcy50byA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE1hcEVsZW1lbnQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm1hcCIsIHRydWUpOwogICAgdGhpcy5lcXVhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXF1YXRlUmFuZ2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTWVkaXVtSW5mbyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibWVkaXVtSW5mbyIsIHRydWUpOwogICAgdGhpcy5tYXAgPSBudWxsOwogIH0KfQpjbGFzcyBjb25maWdfTWVzc2FnZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibWVzc2FnZSIsIHRydWUpOwogICAgdGhpcy5tc2dJZCA9IG51bGw7CiAgICB0aGlzLnNldmVyaXR5ID0gbnVsbDsKICB9Cn0KY2xhc3MgTWVzc2FnaW5nIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJtZXNzYWdpbmciLCB0cnVlKTsKICAgIHRoaXMubWVzc2FnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBNb2RlIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJtb2RlIiwgWyJhcHBlbmQiLCAib3ZlcndyaXRlIl0pOwogIH0KfQpjbGFzcyBNb2RpZnlBbm5vdHMgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibW9kaWZ5QW5ub3RzIik7CiAgfQp9CmNsYXNzIE1zZ0lkIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibXNnSWQiLCAxLCBuID0+IG4gPj0gMSk7CiAgfQp9CmNsYXNzIE5hbWVBdHRyIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJuYW1lQXR0ciIpOwogIH0KfQpjbGFzcyBOZXZlckVtYmVkIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibmV2ZXJFbWJlZCIpOwogIH0KfQpjbGFzcyBOdW1iZXJPZkNvcGllcyBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm51bWJlck9mQ29waWVzIiwgbnVsbCwgbiA9PiBuID49IDIgJiYgbiA8PSA1KTsKICB9Cn0KY2xhc3MgT3BlbkFjdGlvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3BlbkFjdGlvbiIsIHRydWUpOwogICAgdGhpcy5kZXN0aW5hdGlvbiA9IG51bGw7CiAgfQp9CmNsYXNzIE91dHB1dCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0IiwgdHJ1ZSk7CiAgICB0aGlzLnRvID0gbnVsbDsKICAgIHRoaXMudHlwZSA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE91dHB1dEJpbiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0QmluIik7CiAgfQp9CmNsYXNzIE91dHB1dFhTTCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0WFNMIiwgdHJ1ZSk7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE92ZXJwcmludCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3ZlcnByaW50IiwgWyJub25lIiwgImJvdGgiLCAiZHJhdyIsICJmaWVsZCJdKTsKICB9Cn0KY2xhc3MgUGFja2V0cyBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGFja2V0cyIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGlmICh0aGlzWyRjb250ZW50XSA9PT0gIioiKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiBbImNvbmZpZyIsICJkYXRhc2V0cyIsICJ0ZW1wbGF0ZSIsICJ4ZmRmIiwgInhzbHQiXS5pbmNsdWRlcyh4KSk7CiAgfQp9CmNsYXNzIFBhZ2VPZmZzZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2VPZmZzZXQiKTsKICAgIHRoaXMueCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLngsCiAgICAgIGRlZmF1bHRWYWx1ZTogInVzZVhEQ1NldHRpbmciLAogICAgICB2YWxpZGF0ZTogbiA9PiB0cnVlCiAgICB9KTsKICAgIHRoaXMueSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnksCiAgICAgIGRlZmF1bHRWYWx1ZTogInVzZVhEQ1NldHRpbmciLAogICAgICB2YWxpZGF0ZTogbiA9PiB0cnVlCiAgICB9KTsKICB9Cn0KY2xhc3MgUGFnZVJhbmdlIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwYWdlUmFuZ2UiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBudW1iZXJzID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5tYXAoeCA9PiBwYXJzZUludCh4LCAxMCkpOwogICAgY29uc3QgcmFuZ2VzID0gW107CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBudW1iZXJzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgcmFuZ2VzLnB1c2gobnVtYmVycy5zbGljZShpLCBpICsgMikpOwogICAgfQogICAgdGhpc1skY29udGVudF0gPSByYW5nZXM7CiAgfQp9CmNsYXNzIFBhZ2luYXRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2luYXRpb24iLCBbInNpbXBsZXgiLCAiZHVwbGV4U2hvcnRFZGdlIiwgImR1cGxleExvbmdFZGdlIl0pOwogIH0KfQpjbGFzcyBQYWdpbmF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2luYXRpb25PdmVycmlkZSIsIFsibm9uZSIsICJmb3JjZUR1cGxleCIsICJmb3JjZUR1cGxleExvbmdFZGdlIiwgImZvcmNlRHVwbGV4U2hvcnRFZGdlIiwgImZvcmNlU2ltcGxleCJdKTsKICB9Cn0KY2xhc3MgUGFydCBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhcnQiLCAxLCBuID0+IGZhbHNlKTsKICB9Cn0KY2xhc3MgUGNsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwY2wiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMuYmF0Y2hPdXRwdXQgPSBudWxsOwogICAgdGhpcy5mb250SW5mbyA9IG51bGw7CiAgICB0aGlzLmpvZyA9IG51bGw7CiAgICB0aGlzLm1lZGl1bUluZm8gPSBudWxsOwogICAgdGhpcy5vdXRwdXRCaW4gPSBudWxsOwogICAgdGhpcy5wYWdlT2Zmc2V0ID0gbnVsbDsKICAgIHRoaXMuc3RhcGxlID0gbnVsbDsKICAgIHRoaXMueGRjID0gbnVsbDsKICB9Cn0KY2xhc3MgUGRmIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwZGYiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMuYWRvYmVFeHRlbnNpb25MZXZlbCA9IG51bGw7CiAgICB0aGlzLmJhdGNoT3V0cHV0ID0gbnVsbDsKICAgIHRoaXMuY29tcHJlc3Npb24gPSBudWxsOwogICAgdGhpcy5jcmVhdG9yID0gbnVsbDsKICAgIHRoaXMuZW5jcnlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMuaW50ZXJhY3RpdmUgPSBudWxsOwogICAgdGhpcy5saW5lYXJpemVkID0gbnVsbDsKICAgIHRoaXMub3BlbkFjdGlvbiA9IG51bGw7CiAgICB0aGlzLnBkZmEgPSBudWxsOwogICAgdGhpcy5wcm9kdWNlciA9IG51bGw7CiAgICB0aGlzLnJlbmRlclBvbGljeSA9IG51bGw7CiAgICB0aGlzLnNjcmlwdE1vZGVsID0gbnVsbDsKICAgIHRoaXMuc2lsZW50UHJpbnQgPSBudWxsOwogICAgdGhpcy5zdWJtaXRGb3JtYXQgPSBudWxsOwogICAgdGhpcy50YWdnZWQgPSBudWxsOwogICAgdGhpcy52ZXJzaW9uID0gbnVsbDsKICAgIHRoaXMudmlld2VyUHJlZmVyZW5jZXMgPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBQZGZhIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwZGZhIiwgdHJ1ZSk7CiAgICB0aGlzLmFtZCA9IG51bGw7CiAgICB0aGlzLmNvbmZvcm1hbmNlID0gbnVsbDsKICAgIHRoaXMuaW5jbHVkZVhEUENvbnRlbnQgPSBudWxsOwogICAgdGhpcy5wYXJ0ID0gbnVsbDsKICB9Cn0KY2xhc3MgUGVybWlzc2lvbnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBlcm1pc3Npb25zIiwgdHJ1ZSk7CiAgICB0aGlzLmFjY2Vzc2libGVDb250ZW50ID0gbnVsbDsKICAgIHRoaXMuY2hhbmdlID0gbnVsbDsKICAgIHRoaXMuY29udGVudENvcHkgPSBudWxsOwogICAgdGhpcy5kb2N1bWVudEFzc2VtYmx5ID0gbnVsbDsKICAgIHRoaXMuZm9ybUZpZWxkRmlsbGluZyA9IG51bGw7CiAgICB0aGlzLm1vZGlmeUFubm90cyA9IG51bGw7CiAgICB0aGlzLnBsYWludGV4dE1ldGFkYXRhID0gbnVsbDsKICAgIHRoaXMucHJpbnQgPSBudWxsOwogICAgdGhpcy5wcmludEhpZ2hRdWFsaXR5ID0gbnVsbDsKICB9Cn0KY2xhc3MgUGlja1RyYXlCeVBERlNpemUgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGlja1RyYXlCeVBERlNpemUiKTsKICB9Cn0KY2xhc3MgY29uZmlnX1BpY3R1cmUgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBpY3R1cmUiKTsKICB9Cn0KY2xhc3MgUGxhaW50ZXh0TWV0YWRhdGEgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGxhaW50ZXh0TWV0YWRhdGEiKTsKICB9Cn0KY2xhc3MgUHJlc2VuY2UgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByZXNlbmNlIiwgWyJwcmVzZXJ2ZSIsICJkaXNzb2x2ZSIsICJkaXNzb2x2ZVN0cnVjdHVyZSIsICJpZ25vcmUiLCAicmVtb3ZlIl0pOwogIH0KfQpjbGFzcyBQcmVzZW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmVzZW50IiwgdHJ1ZSk7CiAgICB0aGlzLmJlaGF2aW9yT3ZlcnJpZGUgPSBudWxsOwogICAgdGhpcy5jYWNoZSA9IG51bGw7CiAgICB0aGlzLmNvbW1vbiA9IG51bGw7CiAgICB0aGlzLmNvcGllcyA9IG51bGw7CiAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDsKICAgIHRoaXMuaW5jcmVtZW50YWxNZXJnZSA9IG51bGw7CiAgICB0aGlzLmxheW91dCA9IG51bGw7CiAgICB0aGlzLm91dHB1dCA9IG51bGw7CiAgICB0aGlzLm92ZXJwcmludCA9IG51bGw7CiAgICB0aGlzLnBhZ2luYXRpb24gPSBudWxsOwogICAgdGhpcy5wYWdpbmF0aW9uT3ZlcnJpZGUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogICAgdGhpcy52YWxpZGF0ZSA9IG51bGw7CiAgICB0aGlzLnhkcCA9IG51bGw7CiAgICB0aGlzLmRyaXZlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5sYWJlbFByaW50ZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGNsID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBkZiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJtaXRVcmwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMud2ViQ2xpZW50ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnpwbCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBQcmludCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmludCIpOwogIH0KfQpjbGFzcyBQcmludEhpZ2hRdWFsaXR5IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByaW50SGlnaFF1YWxpdHkiKTsKICB9Cn0KY2xhc3MgUHJpbnRTY2FsaW5nIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmludFNjYWxpbmciLCBbImFwcGRlZmF1bHQiLCAibm9TY2FsaW5nIl0pOwogIH0KfQpjbGFzcyBQcmludGVyTmFtZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicHJpbnRlck5hbWUiKTsKICB9Cn0KY2xhc3MgUHJvZHVjZXIgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByb2R1Y2VyIik7CiAgfQp9CmNsYXNzIFBzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcyIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5iYXRjaE91dHB1dCA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMuam9nID0gbnVsbDsKICAgIHRoaXMubWVkaXVtSW5mbyA9IG51bGw7CiAgICB0aGlzLm91dHB1dEJpbiA9IG51bGw7CiAgICB0aGlzLnN0YXBsZSA9IG51bGw7CiAgICB0aGlzLnhkYyA9IG51bGw7CiAgfQp9CmNsYXNzIFJhbmdlIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicmFuZ2UiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdLnNwbGl0KCIsIiwgMikubWFwKHJhbmdlID0+IHJhbmdlLnNwbGl0KCItIikubWFwKHggPT4gcGFyc2VJbnQoeC50cmltKCksIDEwKSkpLmZpbHRlcihyYW5nZSA9PiByYW5nZS5ldmVyeSh4ID0+ICFpc05hTih4KSkpLm1hcChyYW5nZSA9PiB7CiAgICAgIGlmIChyYW5nZS5sZW5ndGggPT09IDEpIHsKICAgICAgICByYW5nZS5wdXNoKHJhbmdlWzBdKTsKICAgICAgfQogICAgICByZXR1cm4gcmFuZ2U7CiAgICB9KTsKICB9Cn0KY2xhc3MgUmVjb3JkIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicmVjb3JkIik7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICBjb25zdCBuID0gcGFyc2VJbnQodGhpc1skY29udGVudF0sIDEwKTsKICAgIGlmICghaXNOYU4obikgJiYgbiA+PSAwKSB7CiAgICAgIHRoaXNbJGNvbnRlbnRdID0gbjsKICAgIH0KICB9Cn0KY2xhc3MgUmVsZXZhbnQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJyZWxldmFudCIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKTsKICB9Cn0KY2xhc3MgUmVuYW1lIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicmVuYW1lIik7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICBpZiAodGhpc1skY29udGVudF0udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJ4bWwiKSB8fCBuZXcgUmVnRXhwKCJbXFxwe0x9X11bXFxwe0x9XFxkLl9cXHB7TX0tXSoiLCAidSIpLnRlc3QodGhpc1skY29udGVudF0pKSB7CiAgICAgIHdhcm4oIlhGQSAtIFJlbmFtZTogaW52YWxpZCBYRkEgbmFtZSIpOwogICAgfQogIH0KfQpjbGFzcyBSZW5kZXJQb2xpY3kgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInJlbmRlclBvbGljeSIsIFsic2VydmVyIiwgImNsaWVudCJdKTsKICB9Cn0KY2xhc3MgUnVuU2NyaXB0cyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicnVuU2NyaXB0cyIsIFsiYm90aCIsICJjbGllbnQiLCAibm9uZSIsICJzZXJ2ZXIiXSk7CiAgfQp9CmNsYXNzIGNvbmZpZ19TY3JpcHQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNjcmlwdCIsIHRydWUpOwogICAgdGhpcy5jdXJyZW50UGFnZSA9IG51bGw7CiAgICB0aGlzLmV4Y2x1ZGUgPSBudWxsOwogICAgdGhpcy5ydW5TY3JpcHRzID0gbnVsbDsKICB9Cn0KY2xhc3MgU2NyaXB0TW9kZWwgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNjcmlwdE1vZGVsIiwgWyJYRkEiLCAibm9uZSJdKTsKICB9Cn0KY2xhc3MgU2V2ZXJpdHkgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNldmVyaXR5IiwgWyJpZ25vcmUiLCAiZXJyb3IiLCAiaW5mb3JtYXRpb24iLCAidHJhY2UiLCAid2FybmluZyJdKTsKICB9Cn0KY2xhc3MgU2lsZW50UHJpbnQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNpbGVudFByaW50IiwgdHJ1ZSk7CiAgICB0aGlzLmFkZFNpbGVudFByaW50ID0gbnVsbDsKICAgIHRoaXMucHJpbnRlck5hbWUgPSBudWxsOwogIH0KfQpjbGFzcyBTdGFwbGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN0YXBsZSIpOwogICAgdGhpcy5tb2RlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubW9kZSwgWyJ1c2VQcmludGVyU2V0dGluZyIsICJvbiIsICJvZmYiXSk7CiAgfQp9CmNsYXNzIFN0YXJ0Tm9kZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAic3RhcnROb2RlIik7CiAgfQp9CmNsYXNzIFN0YXJ0UGFnZSBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN0YXJ0UGFnZSIsIDAsIG4gPT4gdHJ1ZSk7CiAgfQp9CmNsYXNzIFN1Ym1pdEZvcm1hdCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAic3VibWl0Rm9ybWF0IiwgWyJodG1sIiwgImRlbGVnYXRlIiwgImZkZiIsICJ4bWwiLCAicGRmIl0pOwogIH0KfQpjbGFzcyBTdWJtaXRVcmwgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1Ym1pdFVybCIpOwogIH0KfQpjbGFzcyBTdWJzZXRCZWxvdyBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1YnNldEJlbG93IiwgMTAwLCBuID0+IG4gPj0gMCAmJiBuIDw9IDEwMCk7CiAgfQp9CmNsYXNzIFN1cHByZXNzQmFubmVyIGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1cHByZXNzQmFubmVyIik7CiAgfQp9CmNsYXNzIFRhZ2dlZCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0YWdnZWQiKTsKICB9Cn0KY2xhc3MgY29uZmlnX1RlbXBsYXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0ZW1wbGF0ZSIsIHRydWUpOwogICAgdGhpcy5iYXNlID0gbnVsbDsKICAgIHRoaXMucmVsZXZhbnQgPSBudWxsOwogICAgdGhpcy5zdGFydFBhZ2UgPSBudWxsOwogICAgdGhpcy51cmkgPSBudWxsOwogICAgdGhpcy54c2wgPSBudWxsOwogIH0KfQpjbGFzcyBUaHJlc2hvbGQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRocmVzaG9sZCIsIFsidHJhY2UiLCAiZXJyb3IiLCAiaW5mb3JtYXRpb24iLCAid2FybmluZyJdKTsKICB9Cn0KY2xhc3MgVG8gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRvIiwgWyJudWxsIiwgIm1lbW9yeSIsICJzdGRlcnIiLCAic3Rkb3V0IiwgInN5c3RlbSIsICJ1cmkiXSk7CiAgfQp9CmNsYXNzIFRlbXBsYXRlQ2FjaGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRlbXBsYXRlQ2FjaGUiKTsKICAgIHRoaXMubWF4RW50cmllcyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm1heEVudHJpZXMsCiAgICAgIGRlZmF1bHRWYWx1ZTogNSwKICAgICAgdmFsaWRhdGU6IG4gPT4gbiA+PSAwCiAgICB9KTsKICB9Cn0KY2xhc3MgVHJhY2UgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRyYWNlIiwgdHJ1ZSk7CiAgICB0aGlzLmFyZWEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgVHJhbnNmb3JtIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0cmFuc2Zvcm0iLCB0cnVlKTsKICAgIHRoaXMuZ3JvdXBQYXJlbnQgPSBudWxsOwogICAgdGhpcy5pZkVtcHR5ID0gbnVsbDsKICAgIHRoaXMubmFtZUF0dHIgPSBudWxsOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICAgIHRoaXMucHJlc2VuY2UgPSBudWxsOwogICAgdGhpcy5yZW5hbWUgPSBudWxsOwogICAgdGhpcy53aGl0ZXNwYWNlID0gbnVsbDsKICB9Cn0KY2xhc3MgVHlwZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidHlwZSIsIFsibm9uZSIsICJhc2NpaTg1IiwgImFzY2lpSGV4IiwgImNjaXR0ZmF4IiwgImZsYXRlIiwgImx6dyIsICJydW5MZW5ndGgiLCAibmF0aXZlIiwgInhkcCIsICJtZXJnZWRYRFAiXSk7CiAgfQp9CmNsYXNzIFVyaSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidXJpIik7CiAgfQp9CmNsYXNzIGNvbmZpZ19WYWxpZGF0ZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidmFsaWRhdGUiLCBbInByZVN1Ym1pdCIsICJwcmVQcmludCIsICJwcmVFeGVjdXRlIiwgInByZVNhdmUiXSk7CiAgfQp9CmNsYXNzIFZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLykuZmlsdGVyKHggPT4gWyJkb2NSZWFkeSIsICJwb3N0U2lnbiJdLmluY2x1ZGVzKHgpKTsKICB9Cn0KY2xhc3MgVmFsaWRhdGlvbk1lc3NhZ2luZyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidmFsaWRhdGlvbk1lc3NhZ2luZyIsIFsiYWxsTWVzc2FnZXNJbmRpdmlkdWFsbHkiLCAiYWxsTWVzc2FnZXNUb2dldGhlciIsICJmaXJzdE1lc3NhZ2VPbmx5IiwgIm5vTWVzc2FnZXMiXSk7CiAgfQp9CmNsYXNzIFZlcnNpb24gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZlcnNpb24iLCBbIjEuNyIsICIxLjYiLCAiMS41IiwgIjEuNCIsICIxLjMiLCAiMS4yIl0pOwogIH0KfQpjbGFzcyBWZXJzaW9uQ29udHJvbCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiVmVyc2lvbkNvbnRyb2wiKTsKICAgIHRoaXMub3V0cHV0QmVsb3cgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5vdXRwdXRCZWxvdywgWyJ3YXJuIiwgImVycm9yIiwgInVwZGF0ZSJdKTsKICAgIHRoaXMuc291cmNlQWJvdmUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zb3VyY2VBYm92ZSwgWyJ3YXJuIiwgImVycm9yIl0pOwogICAgdGhpcy5zb3VyY2VCZWxvdyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnNvdXJjZUJlbG93LCBbInVwZGF0ZSIsICJtYWludGFpbiJdKTsKICB9Cn0KY2xhc3MgVmlld2VyUHJlZmVyZW5jZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZpZXdlclByZWZlcmVuY2VzIiwgdHJ1ZSk7CiAgICB0aGlzLkFEQkVfSlNDb25zb2xlID0gbnVsbDsKICAgIHRoaXMuQURCRV9KU0RlYnVnZ2VyID0gbnVsbDsKICAgIHRoaXMuYWRkVmlld2VyUHJlZmVyZW5jZXMgPSBudWxsOwogICAgdGhpcy5kdXBsZXhPcHRpb24gPSBudWxsOwogICAgdGhpcy5lbmZvcmNlID0gbnVsbDsKICAgIHRoaXMubnVtYmVyT2ZDb3BpZXMgPSBudWxsOwogICAgdGhpcy5wYWdlUmFuZ2UgPSBudWxsOwogICAgdGhpcy5waWNrVHJheUJ5UERGU2l6ZSA9IG51bGw7CiAgICB0aGlzLnByaW50U2NhbGluZyA9IG51bGw7CiAgfQp9CmNsYXNzIFdlYkNsaWVudCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAid2ViQ2xpZW50IiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgPyBhdHRyaWJ1dGVzLm5hbWUudHJpbSgpIDogIiI7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMueGRjID0gbnVsbDsKICB9Cn0KY2xhc3MgV2hpdGVzcGFjZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAid2hpdGVzcGFjZSIsIFsicHJlc2VydmUiLCAibHRyaW0iLCAibm9ybWFsaXplIiwgInJ0cmltIiwgInRyaW0iXSk7CiAgfQp9CmNsYXNzIFdpbmRvdyBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIndpbmRvdyIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IHBhaXIgPSB0aGlzWyRjb250ZW50XS5zcGxpdCgiLCIsIDIpLm1hcCh4ID0+IHBhcnNlSW50KHgudHJpbSgpLCAxMCkpOwogICAgaWYgKHBhaXIuc29tZSh4ID0+IGlzTmFOKHgpKSkgewogICAgICB0aGlzWyRjb250ZW50XSA9IFswLCAwXTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHBhaXIubGVuZ3RoID09PSAxKSB7CiAgICAgIHBhaXIucHVzaChwYWlyWzBdKTsKICAgIH0KICAgIHRoaXNbJGNvbnRlbnRdID0gcGFpcjsKICB9Cn0KY2xhc3MgWGRjIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ4ZGMiLCB0cnVlKTsKICAgIHRoaXMudXJpID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnhzbCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBYZHAgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInhkcCIsIHRydWUpOwogICAgdGhpcy5wYWNrZXRzID0gbnVsbDsKICB9Cn0KY2xhc3MgWHNsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ4c2wiLCB0cnVlKTsKICAgIHRoaXMuZGVidWcgPSBudWxsOwogICAgdGhpcy51cmkgPSBudWxsOwogIH0KfQpjbGFzcyBacGwgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInpwbCIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lID8gYXR0cmlidXRlcy5uYW1lLnRyaW0oKSA6ICIiOwogICAgdGhpcy5iYXRjaE91dHB1dCA9IG51bGw7CiAgICB0aGlzLmZsaXBMYWJlbCA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMueGRjID0gbnVsbDsKICB9Cn0KY2xhc3MgQ29uZmlnTmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKENvbmZpZ05hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gQ29uZmlnTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGFjcm9iYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWNyb2JhdChhdHRycyk7CiAgfQogIHN0YXRpYyBhY3JvYmF0NyhhdHRycykgewogICAgcmV0dXJuIG5ldyBBY3JvYmF0NyhhdHRycyk7CiAgfQogIHN0YXRpYyBBREJFX0pTQ29uc29sZShhdHRycykgewogICAgcmV0dXJuIG5ldyBBREJFX0pTQ29uc29sZShhdHRycyk7CiAgfQogIHN0YXRpYyBBREJFX0pTRGVidWdnZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQURCRV9KU0RlYnVnZ2VyKGF0dHJzKTsKICB9CiAgc3RhdGljIGFkZFNpbGVudFByaW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFkZFNpbGVudFByaW50KGF0dHJzKTsKICB9CiAgc3RhdGljIGFkZFZpZXdlclByZWZlcmVuY2VzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFkZFZpZXdlclByZWZlcmVuY2VzKGF0dHJzKTsKICB9CiAgc3RhdGljIGFkanVzdERhdGEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWRqdXN0RGF0YShhdHRycyk7CiAgfQogIHN0YXRpYyBhZG9iZUV4dGVuc2lvbkxldmVsKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFkb2JlRXh0ZW5zaW9uTGV2ZWwoYXR0cnMpOwogIH0KICBzdGF0aWMgYWdlbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWdlbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgYWx3YXlzRW1iZWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWx3YXlzRW1iZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgYW1kKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFtZChhdHRycyk7CiAgfQogIHN0YXRpYyBhcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbmZpZ19BcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIGF0dHJpYnV0ZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQXR0cmlidXRlcyhhdHRycyk7CiAgfQogIHN0YXRpYyBhdXRvU2F2ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBBdXRvU2F2ZShhdHRycyk7CiAgfQogIHN0YXRpYyBiYXNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJhc2UoYXR0cnMpOwogIH0KICBzdGF0aWMgYmF0Y2hPdXRwdXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQmF0Y2hPdXRwdXQoYXR0cnMpOwogIH0KICBzdGF0aWMgYmVoYXZpb3JPdmVycmlkZShhdHRycykgewogICAgcmV0dXJuIG5ldyBCZWhhdmlvck92ZXJyaWRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNhY2hlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENhY2hlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNoYW5nZShhdHRycykgewogICAgcmV0dXJuIG5ldyBDaGFuZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgY29tbW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbW1vbihhdHRycyk7CiAgfQogIHN0YXRpYyBjb21wcmVzcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDb21wcmVzcyhhdHRycyk7CiAgfQogIHN0YXRpYyBjb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbXByZXNzT2JqZWN0U3RyZWFtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbXByZXNzT2JqZWN0U3RyZWFtKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbXByZXNzaW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbXByZXNzaW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbmZpZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDb25maWcoYXR0cnMpOwogIH0KICBzdGF0aWMgY29uZm9ybWFuY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29uZm9ybWFuY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgY29udGVudENvcHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29udGVudENvcHkoYXR0cnMpOwogIH0KICBzdGF0aWMgY29waWVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvcGllcyhhdHRycyk7CiAgfQogIHN0YXRpYyBjcmVhdG9yKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENyZWF0b3IoYXR0cnMpOwogIH0KICBzdGF0aWMgY3VycmVudFBhZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ3VycmVudFBhZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0YShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlYnVnKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERlYnVnKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlZmF1bHRUeXBlZmFjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEZWZhdWx0VHlwZWZhY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZGVzdGluYXRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVzdGluYXRpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgZG9jdW1lbnRBc3NlbWJseShhdHRycykgewogICAgcmV0dXJuIG5ldyBEb2N1bWVudEFzc2VtYmx5KGF0dHJzKTsKICB9CiAgc3RhdGljIGRyaXZlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBEcml2ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZHVwbGV4T3B0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IER1cGxleE9wdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBkeW5hbWljUmVuZGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IER5bmFtaWNSZW5kZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZW1iZWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW1iZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdChhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfRW5jcnlwdChhdHRycyk7CiAgfQogIHN0YXRpYyBlbmNyeXB0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbmZpZ19FbmNyeXB0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHRpb25MZXZlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNyeXB0aW9uTGV2ZWwoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5mb3JjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmZvcmNlKGF0dHJzKTsKICB9CiAgc3RhdGljIGVxdWF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFcXVhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgZXF1YXRlUmFuZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXF1YXRlUmFuZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZXhjbHVkZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFeGNsdWRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGV4Y2x1ZGVOUyhhdHRycykgewogICAgcmV0dXJuIG5ldyBFeGNsdWRlTlMoYXR0cnMpOwogIH0KICBzdGF0aWMgZmxpcExhYmVsKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEZsaXBMYWJlbChhdHRycyk7CiAgfQogIHN0YXRpYyBmb250SW5mbyhhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfRm9udEluZm8oYXR0cnMpOwogIH0KICBzdGF0aWMgZm9ybUZpZWxkRmlsbGluZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBGb3JtRmllbGRGaWxsaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIGdyb3VwUGFyZW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEdyb3VwUGFyZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIGlmRW1wdHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSWZFbXB0eShhdHRycyk7CiAgfQogIHN0YXRpYyBpbmNsdWRlWERQQ29udGVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBJbmNsdWRlWERQQ29udGVudChhdHRycyk7CiAgfQogIHN0YXRpYyBpbmNyZW1lbnRhbExvYWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxMb2FkKGF0dHJzKTsKICB9CiAgc3RhdGljIGluY3JlbWVudGFsTWVyZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxNZXJnZShhdHRycyk7CiAgfQogIHN0YXRpYyBpbnRlcmFjdGl2ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBJbnRlcmFjdGl2ZShhdHRycyk7CiAgfQogIHN0YXRpYyBqb2coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSm9nKGF0dHJzKTsKICB9CiAgc3RhdGljIGxhYmVsUHJpbnRlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBMYWJlbFByaW50ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgbGF5b3V0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExheW91dChhdHRycyk7CiAgfQogIHN0YXRpYyBsZXZlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBMZXZlbChhdHRycyk7CiAgfQogIHN0YXRpYyBsaW5lYXJpemVkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExpbmVhcml6ZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgbG9jYWxlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExvY2FsZShhdHRycyk7CiAgfQogIHN0YXRpYyBsb2NhbGVTZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTG9jYWxlU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIGxvZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBMb2coYXR0cnMpOwogIH0KICBzdGF0aWMgbWFwKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1hcEVsZW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVkaXVtSW5mbyhhdHRycykgewogICAgcmV0dXJuIG5ldyBNZWRpdW1JbmZvKGF0dHJzKTsKICB9CiAgc3RhdGljIG1lc3NhZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX01lc3NhZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVzc2FnaW5nKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1lc3NhZ2luZyhhdHRycyk7CiAgfQogIHN0YXRpYyBtb2RlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1vZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgbW9kaWZ5QW5ub3RzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1vZGlmeUFubm90cyhhdHRycyk7CiAgfQogIHN0YXRpYyBtc2dJZChhdHRycykgewogICAgcmV0dXJuIG5ldyBNc2dJZChhdHRycyk7CiAgfQogIHN0YXRpYyBuYW1lQXR0cihhdHRycykgewogICAgcmV0dXJuIG5ldyBOYW1lQXR0cihhdHRycyk7CiAgfQogIHN0YXRpYyBuZXZlckVtYmVkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE5ldmVyRW1iZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyT2ZDb3BpZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTnVtYmVyT2ZDb3BpZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgb3BlbkFjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBPcGVuQWN0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIG91dHB1dChhdHRycykgewogICAgcmV0dXJuIG5ldyBPdXRwdXQoYXR0cnMpOwogIH0KICBzdGF0aWMgb3V0cHV0QmluKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE91dHB1dEJpbihhdHRycyk7CiAgfQogIHN0YXRpYyBvdXRwdXRYU0woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgT3V0cHV0WFNMKGF0dHJzKTsKICB9CiAgc3RhdGljIG92ZXJwcmludChhdHRycykgewogICAgcmV0dXJuIG5ldyBPdmVycHJpbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFja2V0cyhhdHRycykgewogICAgcmV0dXJuIG5ldyBQYWNrZXRzKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VPZmZzZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnZU9mZnNldChhdHRycyk7CiAgfQogIHN0YXRpYyBwYWdlUmFuZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnZVJhbmdlKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2luYXRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBwYWdpbmF0aW9uT3ZlcnJpZGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbk92ZXJyaWRlKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhcnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFydChhdHRycyk7CiAgfQogIHN0YXRpYyBwY2woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGNsKGF0dHJzKTsKICB9CiAgc3RhdGljIHBkZihhdHRycykgewogICAgcmV0dXJuIG5ldyBQZGYoYXR0cnMpOwogIH0KICBzdGF0aWMgcGRmYShhdHRycykgewogICAgcmV0dXJuIG5ldyBQZGZhKGF0dHJzKTsKICB9CiAgc3RhdGljIHBlcm1pc3Npb25zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25zKGF0dHJzKTsKICB9CiAgc3RhdGljIHBpY2tUcmF5QnlQREZTaXplKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBpY2tUcmF5QnlQREZTaXplKGF0dHJzKTsKICB9CiAgc3RhdGljIHBpY3R1cmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX1BpY3R1cmUoYXR0cnMpOwogIH0KICBzdGF0aWMgcGxhaW50ZXh0TWV0YWRhdGEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGxhaW50ZXh0TWV0YWRhdGEoYXR0cnMpOwogIH0KICBzdGF0aWMgcHJlc2VuY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUHJlc2VuY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgcHJlc2VudChhdHRycykgewogICAgcmV0dXJuIG5ldyBQcmVzZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHByaW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByaW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHByaW50SGlnaFF1YWxpdHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUHJpbnRIaWdoUXVhbGl0eShhdHRycyk7CiAgfQogIHN0YXRpYyBwcmludFNjYWxpbmcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUHJpbnRTY2FsaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIHByaW50ZXJOYW1lKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByaW50ZXJOYW1lKGF0dHJzKTsKICB9CiAgc3RhdGljIHByb2R1Y2VyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByb2R1Y2VyKGF0dHJzKTsKICB9CiAgc3RhdGljIHBzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBzKGF0dHJzKTsKICB9CiAgc3RhdGljIHJhbmdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJhbmdlKGF0dHJzKTsKICB9CiAgc3RhdGljIHJlY29yZChhdHRycykgewogICAgcmV0dXJuIG5ldyBSZWNvcmQoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVsZXZhbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVsZXZhbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVuYW1lKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlbmFtZShhdHRycyk7CiAgfQogIHN0YXRpYyByZW5kZXJQb2xpY3koYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVuZGVyUG9saWN5KGF0dHJzKTsKICB9CiAgc3RhdGljIHJ1blNjcmlwdHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUnVuU2NyaXB0cyhhdHRycyk7CiAgfQogIHN0YXRpYyBzY3JpcHQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX1NjcmlwdChhdHRycyk7CiAgfQogIHN0YXRpYyBzY3JpcHRNb2RlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBTY3JpcHRNb2RlbChhdHRycyk7CiAgfQogIHN0YXRpYyBzZXZlcml0eShhdHRycykgewogICAgcmV0dXJuIG5ldyBTZXZlcml0eShhdHRycyk7CiAgfQogIHN0YXRpYyBzaWxlbnRQcmludChhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWxlbnRQcmludChhdHRycyk7CiAgfQogIHN0YXRpYyBzdGFwbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3RhcGxlKGF0dHJzKTsKICB9CiAgc3RhdGljIHN0YXJ0Tm9kZShhdHRycykgewogICAgcmV0dXJuIG5ldyBTdGFydE5vZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgc3RhcnRQYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN0YXJ0UGFnZShhdHRycyk7CiAgfQogIHN0YXRpYyBzdWJtaXRGb3JtYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3VibWl0Rm9ybWF0KGF0dHJzKTsKICB9CiAgc3RhdGljIHN1Ym1pdFVybChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJtaXRVcmwoYXR0cnMpOwogIH0KICBzdGF0aWMgc3Vic2V0QmVsb3coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3Vic2V0QmVsb3coYXR0cnMpOwogIH0KICBzdGF0aWMgc3VwcHJlc3NCYW5uZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3VwcHJlc3NCYW5uZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgdGFnZ2VkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRhZ2dlZChhdHRycyk7CiAgfQogIHN0YXRpYyB0ZW1wbGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfVGVtcGxhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdGVtcGxhdGVDYWNoZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUZW1wbGF0ZUNhY2hlKGF0dHJzKTsKICB9CiAgc3RhdGljIHRocmVzaG9sZChhdHRycykgewogICAgcmV0dXJuIG5ldyBUaHJlc2hvbGQoYXR0cnMpOwogIH0KICBzdGF0aWMgdG8oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVG8oYXR0cnMpOwogIH0KICBzdGF0aWMgdHJhY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHJhY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgdHJhbnNmb3JtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRyYW5zZm9ybShhdHRycyk7CiAgfQogIHN0YXRpYyB0eXBlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFR5cGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdXJpKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFVyaShhdHRycyk7CiAgfQogIHN0YXRpYyB2YWxpZGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfVmFsaWRhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgdmFsaWRhdGlvbk1lc3NhZ2luZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uTWVzc2FnaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIHZlcnNpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmVyc2lvbihhdHRycyk7CiAgfQogIHN0YXRpYyB2ZXJzaW9uQ29udHJvbChhdHRycykgewogICAgcmV0dXJuIG5ldyBWZXJzaW9uQ29udHJvbChhdHRycyk7CiAgfQogIHN0YXRpYyB2aWV3ZXJQcmVmZXJlbmNlcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBWaWV3ZXJQcmVmZXJlbmNlcyhhdHRycyk7CiAgfQogIHN0YXRpYyB3ZWJDbGllbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV2ViQ2xpZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHdoaXRlc3BhY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV2hpdGVzcGFjZShhdHRycyk7CiAgfQogIHN0YXRpYyB3aW5kb3coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV2luZG93KGF0dHJzKTsKICB9CiAgc3RhdGljIHhkYyhhdHRycykgewogICAgcmV0dXJuIG5ldyBYZGMoYXR0cnMpOwogIH0KICBzdGF0aWMgeGRwKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFhkcChhdHRycyk7CiAgfQogIHN0YXRpYyB4c2woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgWHNsKGF0dHJzKTsKICB9CiAgc3RhdGljIHpwbChhdHRycykgewogICAgcmV0dXJuIG5ldyBacGwoYXR0cnMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2Nvbm5lY3Rpb25fc2V0LmpzCgoKY29uc3QgQ09OTkVDVElPTl9TRVRfTlNfSUQgPSBOYW1lc3BhY2VJZHMuY29ubmVjdGlvblNldC5pZDsKY2xhc3MgQ29ubmVjdGlvblNldCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJjb25uZWN0aW9uU2V0IiwgdHJ1ZSk7CiAgICB0aGlzLndzZGxDb25uZWN0aW9uID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnhtbENvbm5lY3Rpb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMueHNkQ29ubmVjdGlvbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBFZmZlY3RpdmVJbnB1dFBvbGljeSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJlZmZlY3RpdmVJbnB1dFBvbGljeSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBFZmZlY3RpdmVPdXRwdXRQb2xpY3kgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAiZWZmZWN0aXZlT3V0cHV0UG9saWN5Iik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIE9wZXJhdGlvbiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJvcGVyYXRpb24iKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5pbnB1dCA9IGF0dHJpYnV0ZXMuaW5wdXQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLm91dHB1dCA9IGF0dHJpYnV0ZXMub3V0cHV0IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgUm9vdEVsZW1lbnQgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAicm9vdEVsZW1lbnQiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgU29hcEFjdGlvbiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJzb2FwQWN0aW9uIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFNvYXBBZGRyZXNzIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgInNvYXBBZGRyZXNzIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIGNvbm5lY3Rpb25fc2V0X1VyaSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJ1cmkiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgV3NkbEFkZHJlc3MgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAid3NkbEFkZHJlc3MiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgV3NkbENvbm5lY3Rpb24gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAid3NkbENvbm5lY3Rpb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YURlc2NyaXB0aW9uID0gYXR0cmlidXRlcy5kYXRhRGVzY3JpcHRpb24gfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLmVmZmVjdGl2ZUlucHV0UG9saWN5ID0gbnVsbDsKICAgIHRoaXMuZWZmZWN0aXZlT3V0cHV0UG9saWN5ID0gbnVsbDsKICAgIHRoaXMub3BlcmF0aW9uID0gbnVsbDsKICAgIHRoaXMuc29hcEFjdGlvbiA9IG51bGw7CiAgICB0aGlzLnNvYXBBZGRyZXNzID0gbnVsbDsKICAgIHRoaXMud3NkbEFkZHJlc3MgPSBudWxsOwogIH0KfQpjbGFzcyBYbWxDb25uZWN0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgInhtbENvbm5lY3Rpb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YURlc2NyaXB0aW9uID0gYXR0cmlidXRlcy5kYXRhRGVzY3JpcHRpb24gfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIFhzZENvbm5lY3Rpb24gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAieHNkQ29ubmVjdGlvbiIsIHRydWUpOwogICAgdGhpcy5kYXRhRGVzY3JpcHRpb24gPSBhdHRyaWJ1dGVzLmRhdGFEZXNjcmlwdGlvbiB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucm9vdEVsZW1lbnQgPSBudWxsOwogICAgdGhpcy51cmkgPSBudWxsOwogIH0KfQpjbGFzcyBDb25uZWN0aW9uU2V0TmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKENvbm5lY3Rpb25TZXROYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIENvbm5lY3Rpb25TZXROYW1lc3BhY2VbbmFtZV0oYXR0cmlidXRlcyk7CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KICBzdGF0aWMgY29ubmVjdGlvblNldChhdHRycykgewogICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIGVmZmVjdGl2ZUlucHV0UG9saWN5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVmZmVjdGl2ZUlucHV0UG9saWN5KGF0dHJzKTsKICB9CiAgc3RhdGljIGVmZmVjdGl2ZU91dHB1dFBvbGljeShhdHRycykgewogICAgcmV0dXJuIG5ldyBFZmZlY3RpdmVPdXRwdXRQb2xpY3koYXR0cnMpOwogIH0KICBzdGF0aWMgb3BlcmF0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE9wZXJhdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyByb290RWxlbWVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBSb290RWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBzb2FwQWN0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNvYXBBY3Rpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgc29hcEFkZHJlc3MoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU29hcEFkZHJlc3MoYXR0cnMpOwogIH0KICBzdGF0aWMgdXJpKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbm5lY3Rpb25fc2V0X1VyaShhdHRycyk7CiAgfQogIHN0YXRpYyB3c2RsQWRkcmVzcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBXc2RsQWRkcmVzcyhhdHRycyk7CiAgfQogIHN0YXRpYyB3c2RsQ29ubmVjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBXc2RsQ29ubmVjdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyB4bWxDb25uZWN0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFhtbENvbm5lY3Rpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgeHNkQ29ubmVjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBYc2RDb25uZWN0aW9uKGF0dHJzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9kYXRhc2V0cy5qcwoKCgpjb25zdCBEQVRBU0VUU19OU19JRCA9IE5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZDsKY2xhc3MgZGF0YXNldHNfRGF0YSBleHRlbmRzIFhtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoREFUQVNFVFNfTlNfSUQsICJkYXRhIiwgYXR0cmlidXRlcyk7CiAgfQogIFskaXNOc0Fnbm9zdGljXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBEYXRhc2V0cyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoREFUQVNFVFNfTlNfSUQsICJkYXRhc2V0cyIsIHRydWUpOwogICAgdGhpcy5kYXRhID0gbnVsbDsKICAgIHRoaXMuU2lnbmF0dXJlID0gbnVsbDsKICB9CiAgWyRvbkNoaWxkXShjaGlsZCkgewogICAgY29uc3QgbmFtZSA9IGNoaWxkWyRub2RlTmFtZV07CiAgICBpZiAobmFtZSA9PT0gImRhdGEiICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IERBVEFTRVRTX05TX0lEIHx8IG5hbWUgPT09ICJTaWduYXR1cmUiICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IE5hbWVzcGFjZUlkcy5zaWduYXR1cmUuaWQpIHsKICAgICAgdGhpc1tuYW1lXSA9IGNoaWxkOwogICAgfQogICAgdGhpc1skYXBwZW5kQ2hpbGRdKGNoaWxkKTsKICB9Cn0KY2xhc3MgRGF0YXNldHNOYW1lc3BhY2UgewogIHN0YXRpYyBbJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoRGF0YXNldHNOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIERhdGFzZXRzTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGRhdGFzZXRzKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgRGF0YXNldHMoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBkYXRhKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgZGF0YXNldHNfRGF0YShhdHRyaWJ1dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9sb2NhbGVfc2V0LmpzCgoKCmNvbnN0IExPQ0FMRV9TRVRfTlNfSUQgPSBOYW1lc3BhY2VJZHMubG9jYWxlU2V0LmlkOwpjbGFzcyBDYWxlbmRhclN5bWJvbHMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJjYWxlbmRhclN5bWJvbHMiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9ICJncmVnb3JpYW4iOwogICAgdGhpcy5kYXlOYW1lcyA9IG5ldyBYRkFPYmplY3RBcnJheSgyKTsKICAgIHRoaXMuZXJhTmFtZXMgPSBudWxsOwogICAgdGhpcy5tZXJpZGllbU5hbWVzID0gbnVsbDsKICAgIHRoaXMubW9udGhOYW1lcyA9IG5ldyBYRkFPYmplY3RBcnJheSgyKTsKICB9Cn0KY2xhc3MgQ3VycmVuY3lTeW1ib2wgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJjdXJyZW5jeVN5bWJvbCIpOwogICAgdGhpcy5uYW1lID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmFtZSwgWyJzeW1ib2wiLCAiaXNvbmFtZSIsICJkZWNpbWFsIl0pOwogIH0KfQpjbGFzcyBDdXJyZW5jeVN5bWJvbHMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJjdXJyZW5jeVN5bWJvbHMiLCB0cnVlKTsKICAgIHRoaXMuY3VycmVuY3lTeW1ib2wgPSBuZXcgWEZBT2JqZWN0QXJyYXkoMyk7CiAgfQp9CmNsYXNzIERhdGVQYXR0ZXJuIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZGF0ZVBhdHRlcm4iKTsKICAgIHRoaXMubmFtZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5hbWUsIFsiZnVsbCIsICJsb25nIiwgIm1lZCIsICJzaG9ydCJdKTsKICB9Cn0KY2xhc3MgRGF0ZVBhdHRlcm5zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZGF0ZVBhdHRlcm5zIiwgdHJ1ZSk7CiAgICB0aGlzLmRhdGVQYXR0ZXJuID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogIH0KfQpjbGFzcyBEYXRlVGltZVN5bWJvbHMgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZGF0ZVRpbWVTeW1ib2xzIik7CiAgfQp9CmNsYXNzIERheSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImRheSIpOwogIH0KfQpjbGFzcyBEYXlOYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImRheU5hbWVzIiwgdHJ1ZSk7CiAgICB0aGlzLmFiYnIgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5hYmJyLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5kYXkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoNyk7CiAgfQp9CmNsYXNzIEVyYSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImVyYSIpOwogIH0KfQpjbGFzcyBFcmFOYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImVyYU5hbWVzIiwgdHJ1ZSk7CiAgICB0aGlzLmVyYSA9IG5ldyBYRkFPYmplY3RBcnJheSgyKTsKICB9Cn0KY2xhc3MgbG9jYWxlX3NldF9Mb2NhbGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJsb2NhbGUiLCB0cnVlKTsKICAgIHRoaXMuZGVzYyA9IGF0dHJpYnV0ZXMuZGVzYyB8fCAiIjsKICAgIHRoaXMubmFtZSA9ICJpc29uYW1lIjsKICAgIHRoaXMuY2FsZW5kYXJTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMuY3VycmVuY3lTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMuZGF0ZVBhdHRlcm5zID0gbnVsbDsKICAgIHRoaXMuZGF0ZVRpbWVTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMubnVtYmVyUGF0dGVybnMgPSBudWxsOwogICAgdGhpcy5udW1iZXJTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMudGltZVBhdHRlcm5zID0gbnVsbDsKICAgIHRoaXMudHlwZUZhY2VzID0gbnVsbDsKICB9Cn0KY2xhc3MgbG9jYWxlX3NldF9Mb2NhbGVTZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJsb2NhbGVTZXQiLCB0cnVlKTsKICAgIHRoaXMubG9jYWxlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIE1lcmlkaWVtIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibWVyaWRpZW0iKTsKICB9Cn0KY2xhc3MgTWVyaWRpZW1OYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm1lcmlkaWVtTmFtZXMiLCB0cnVlKTsKICAgIHRoaXMubWVyaWRpZW0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoMik7CiAgfQp9CmNsYXNzIE1vbnRoIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibW9udGgiKTsKICB9Cn0KY2xhc3MgTW9udGhOYW1lcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm1vbnRoTmFtZXMiLCB0cnVlKTsKICAgIHRoaXMuYWJiciA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmFiYnIsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLm1vbnRoID0gbmV3IFhGQU9iamVjdEFycmF5KDEyKTsKICB9Cn0KY2xhc3MgTnVtYmVyUGF0dGVybiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm51bWJlclBhdHRlcm4iKTsKICAgIHRoaXMubmFtZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5hbWUsIFsiZnVsbCIsICJsb25nIiwgIm1lZCIsICJzaG9ydCJdKTsKICB9Cn0KY2xhc3MgTnVtYmVyUGF0dGVybnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJudW1iZXJQYXR0ZXJucyIsIHRydWUpOwogICAgdGhpcy5udW1iZXJQYXR0ZXJuID0gbmV3IFhGQU9iamVjdEFycmF5KDQpOwogIH0KfQpjbGFzcyBOdW1iZXJTeW1ib2wgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJudW1iZXJTeW1ib2wiKTsKICAgIHRoaXMubmFtZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5hbWUsIFsiZGVjaW1hbCIsICJncm91cGluZyIsICJwZXJjZW50IiwgIm1pbnVzIiwgInplcm8iXSk7CiAgfQp9CmNsYXNzIE51bWJlclN5bWJvbHMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJudW1iZXJTeW1ib2xzIiwgdHJ1ZSk7CiAgICB0aGlzLm51bWJlclN5bWJvbCA9IG5ldyBYRkFPYmplY3RBcnJheSg1KTsKICB9Cn0KY2xhc3MgVGltZVBhdHRlcm4gZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJ0aW1lUGF0dGVybiIpOwogICAgdGhpcy5uYW1lID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmFtZSwgWyJmdWxsIiwgImxvbmciLCAibWVkIiwgInNob3J0Il0pOwogIH0KfQpjbGFzcyBUaW1lUGF0dGVybnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJ0aW1lUGF0dGVybnMiLCB0cnVlKTsKICAgIHRoaXMudGltZVBhdHRlcm4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoNCk7CiAgfQp9CmNsYXNzIFR5cGVGYWNlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAidHlwZUZhY2UiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8ICIiOwogIH0KfQpjbGFzcyBUeXBlRmFjZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJ0eXBlRmFjZXMiLCB0cnVlKTsKICAgIHRoaXMudHlwZUZhY2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTG9jYWxlU2V0TmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKExvY2FsZVNldE5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gTG9jYWxlU2V0TmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGNhbGVuZGFyU3ltYm9scyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDYWxlbmRhclN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgY3VycmVuY3lTeW1ib2woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ3VycmVuY3lTeW1ib2woYXR0cnMpOwogIH0KICBzdGF0aWMgY3VycmVuY3lTeW1ib2xzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEN1cnJlbmN5U3ltYm9scyhhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlUGF0dGVybihhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlUGF0dGVybihhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlUGF0dGVybnMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0ZVBhdHRlcm5zKGF0dHJzKTsKICB9CiAgc3RhdGljIGRhdGVUaW1lU3ltYm9scyhhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlVGltZVN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERheShhdHRycyk7CiAgfQogIHN0YXRpYyBkYXlOYW1lcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXlOYW1lcyhhdHRycyk7CiAgfQogIHN0YXRpYyBlcmEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXJhKGF0dHJzKTsKICB9CiAgc3RhdGljIGVyYU5hbWVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVyYU5hbWVzKGF0dHJzKTsKICB9CiAgc3RhdGljIGxvY2FsZShhdHRycykgewogICAgcmV0dXJuIG5ldyBsb2NhbGVfc2V0X0xvY2FsZShhdHRycyk7CiAgfQogIHN0YXRpYyBsb2NhbGVTZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgbG9jYWxlX3NldF9Mb2NhbGVTZXQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVyaWRpZW0oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWVyaWRpZW0oYXR0cnMpOwogIH0KICBzdGF0aWMgbWVyaWRpZW1OYW1lcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBNZXJpZGllbU5hbWVzKGF0dHJzKTsKICB9CiAgc3RhdGljIG1vbnRoKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1vbnRoKGF0dHJzKTsKICB9CiAgc3RhdGljIG1vbnRoTmFtZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTW9udGhOYW1lcyhhdHRycyk7CiAgfQogIHN0YXRpYyBudW1iZXJQYXR0ZXJuKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclBhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyUGF0dGVybnMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTnVtYmVyUGF0dGVybnMoYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyU3ltYm9sKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclN5bWJvbChhdHRycyk7CiAgfQogIHN0YXRpYyBudW1iZXJTeW1ib2xzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgdGltZVBhdHRlcm4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZVBhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgdGltZVBhdHRlcm5zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRpbWVQYXR0ZXJucyhhdHRycyk7CiAgfQogIHN0YXRpYyB0eXBlRmFjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUeXBlRmFjZShhdHRycyk7CiAgfQogIHN0YXRpYyB0eXBlRmFjZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHlwZUZhY2VzKGF0dHJzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9zaWduYXR1cmUuanMKCgpjb25zdCBTSUdOQVRVUkVfTlNfSUQgPSBOYW1lc3BhY2VJZHMuc2lnbmF0dXJlLmlkOwpjbGFzcyBzaWduYXR1cmVfU2lnbmF0dXJlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihTSUdOQVRVUkVfTlNfSUQsICJzaWduYXR1cmUiLCB0cnVlKTsKICB9Cn0KY2xhc3MgU2lnbmF0dXJlTmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKFNpZ25hdHVyZU5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gU2lnbmF0dXJlTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIHNpZ25hdHVyZShhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IHNpZ25hdHVyZV9TaWduYXR1cmUoYXR0cmlidXRlcyk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvc3R5bGVzaGVldC5qcwoKCmNvbnN0IFNUWUxFU0hFRVRfTlNfSUQgPSBOYW1lc3BhY2VJZHMuc3R5bGVzaGVldC5pZDsKY2xhc3MgU3R5bGVzaGVldCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoU1RZTEVTSEVFVF9OU19JRCwgInN0eWxlc2hlZXQiLCB0cnVlKTsKICB9Cn0KY2xhc3MgU3R5bGVzaGVldE5hbWVzcGFjZSB7CiAgc3RhdGljIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChTdHlsZXNoZWV0TmFtZXNwYWNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgIHJldHVybiBTdHlsZXNoZWV0TmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIHN0eWxlc2hlZXQoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBTdHlsZXNoZWV0KGF0dHJpYnV0ZXMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL3hkcC5qcwoKCgpjb25zdCBYRFBfTlNfSUQgPSBOYW1lc3BhY2VJZHMueGRwLmlkOwpjbGFzcyB4ZHBfWGRwIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihYRFBfTlNfSUQsICJ4ZHAiLCB0cnVlKTsKICAgIHRoaXMudXVpZCA9IGF0dHJpYnV0ZXMudXVpZCB8fCAiIjsKICAgIHRoaXMudGltZVN0YW1wID0gYXR0cmlidXRlcy50aW1lU3RhbXAgfHwgIiI7CiAgICB0aGlzLmNvbmZpZyA9IG51bGw7CiAgICB0aGlzLmNvbm5lY3Rpb25TZXQgPSBudWxsOwogICAgdGhpcy5kYXRhc2V0cyA9IG51bGw7CiAgICB0aGlzLmxvY2FsZVNldCA9IG51bGw7CiAgICB0aGlzLnN0eWxlc2hlZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogIH0KICBbJG9uQ2hpbGRDaGVja10oY2hpbGQpIHsKICAgIGNvbnN0IG5zID0gTmFtZXNwYWNlSWRzW2NoaWxkWyRub2RlTmFtZV1dOwogICAgcmV0dXJuIG5zICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IG5zLmlkOwogIH0KfQpjbGFzcyBYZHBOYW1lc3BhY2UgewogIHN0YXRpYyBbJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoWGRwTmFtZXNwYWNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgIHJldHVybiBYZHBOYW1lc3BhY2VbbmFtZV0oYXR0cmlidXRlcyk7CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KICBzdGF0aWMgeGRwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgeGRwX1hkcChhdHRyaWJ1dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS94aHRtbC5qcwoKCgoKCmNvbnN0IFhIVE1MX05TX0lEID0gTmFtZXNwYWNlSWRzLnhodG1sLmlkOwpjb25zdCAkcmljaFRleHQgPSBTeW1ib2woKTsKY29uc3QgVkFMSURfU1RZTEVTID0gbmV3IFNldChbImNvbG9yIiwgImZvbnQiLCAiZm9udC1mYW1pbHkiLCAiZm9udC1zaXplIiwgImZvbnQtc3RyZXRjaCIsICJmb250LXN0eWxlIiwgImZvbnQtd2VpZ2h0IiwgIm1hcmdpbiIsICJtYXJnaW4tYm90dG9tIiwgIm1hcmdpbi1sZWZ0IiwgIm1hcmdpbi1yaWdodCIsICJtYXJnaW4tdG9wIiwgImxldHRlci1zcGFjaW5nIiwgImxpbmUtaGVpZ2h0IiwgIm9ycGhhbnMiLCAicGFnZS1icmVhay1hZnRlciIsICJwYWdlLWJyZWFrLWJlZm9yZSIsICJwYWdlLWJyZWFrLWluc2lkZSIsICJ0YWItaW50ZXJ2YWwiLCAidGFiLXN0b3AiLCAidGV4dC1hbGlnbiIsICJ0ZXh0LWRlY29yYXRpb24iLCAidGV4dC1pbmRlbnQiLCAidmVydGljYWwtYWxpZ24iLCAid2lkb3dzIiwgImtlcm5pbmctbW9kZSIsICJ4ZmEtZm9udC1ob3Jpem9udGFsLXNjYWxlIiwgInhmYS1mb250LXZlcnRpY2FsLXNjYWxlIiwgInhmYS1zcGFjZXJ1biIsICJ4ZmEtdGFiLXN0b3BzIl0pOwpjb25zdCBTdHlsZU1hcHBpbmcgPSBuZXcgTWFwKFtbInBhZ2UtYnJlYWstYWZ0ZXIiLCAiYnJlYWtBZnRlciJdLCBbInBhZ2UtYnJlYWstYmVmb3JlIiwgImJyZWFrQmVmb3JlIl0sIFsicGFnZS1icmVhay1pbnNpZGUiLCAiYnJlYWtJbnNpZGUiXSwgWyJrZXJuaW5nLW1vZGUiLCB2YWx1ZSA9PiB2YWx1ZSA9PT0gIm5vbmUiID8gIm5vbmUiIDogIm5vcm1hbCJdLCBbInhmYS1mb250LWhvcml6b250YWwtc2NhbGUiLCB2YWx1ZSA9PiBgc2NhbGVYKCR7TWF0aC5tYXgoMCwgcGFyc2VJbnQodmFsdWUpIC8gMTAwKS50b0ZpeGVkKDIpfSlgXSwgWyJ4ZmEtZm9udC12ZXJ0aWNhbC1zY2FsZSIsIHZhbHVlID0+IGBzY2FsZVkoJHtNYXRoLm1heCgwLCBwYXJzZUludCh2YWx1ZSkgLyAxMDApLnRvRml4ZWQoMil9KWBdLCBbInhmYS1zcGFjZXJ1biIsICIiXSwgWyJ4ZmEtdGFiLXN0b3BzIiwgIiJdLCBbImZvbnQtc2l6ZSIsICh2YWx1ZSwgb3JpZ2luYWwpID0+IHsKICB2YWx1ZSA9IG9yaWdpbmFsLmZvbnRTaXplID0gTWF0aC5hYnMoZ2V0TWVhc3VyZW1lbnQodmFsdWUpKTsKICByZXR1cm4gbWVhc3VyZVRvU3RyaW5nKDAuOTkgKiB2YWx1ZSk7Cn1dLCBbImxldHRlci1zcGFjaW5nIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbImxpbmUtaGVpZ2h0IiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbIm1hcmdpbiIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJtYXJnaW4tYm90dG9tIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbIm1hcmdpbi1sZWZ0IiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbIm1hcmdpbi1yaWdodCIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJtYXJnaW4tdG9wIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbInRleHQtaW5kZW50IiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldLCBbImZvbnQtZmFtaWx5IiwgdmFsdWUgPT4gdmFsdWVdLCBbInZlcnRpY2FsLWFsaWduIiwgdmFsdWUgPT4gbWVhc3VyZVRvU3RyaW5nKGdldE1lYXN1cmVtZW50KHZhbHVlKSldXSk7CmNvbnN0IHNwYWNlc1JlZ0V4cCA9IC9ccysvZzsKY29uc3QgY3JsZlJlZ0V4cCA9IC9bXHJcbl0rL2c7CmNvbnN0IGNybGZGb3JSaWNoVGV4dFJlZ0V4cCA9IC9cclxuPy9nOwpmdW5jdGlvbiBtYXBTdHlsZShzdHlsZVN0ciwgbm9kZSwgcmljaFRleHQpIHsKICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKCFzdHlsZVN0cikgewogICAgcmV0dXJuIHN0eWxlOwogIH0KICBjb25zdCBvcmlnaW5hbCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3R5bGVTdHIuc3BsaXQoIjsiKS5tYXAocyA9PiBzLnNwbGl0KCI6IiwgMikpKSB7CiAgICBjb25zdCBtYXBwaW5nID0gU3R5bGVNYXBwaW5nLmdldChrZXkpOwogICAgaWYgKG1hcHBpbmcgPT09ICIiKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbGV0IG5ld1ZhbHVlID0gdmFsdWU7CiAgICBpZiAobWFwcGluZykgewogICAgICBuZXdWYWx1ZSA9IHR5cGVvZiBtYXBwaW5nID09PSAic3RyaW5nIiA/IG1hcHBpbmcgOiBtYXBwaW5nKHZhbHVlLCBvcmlnaW5hbCk7CiAgICB9CiAgICBpZiAoa2V5LmVuZHNXaXRoKCJzY2FsZSIpKSB7CiAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlLnRyYW5zZm9ybSA/IGAke3N0eWxlW2tleV19ICR7bmV3VmFsdWV9YCA6IG5ld1ZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgc3R5bGVba2V5LnJlcGxhY2VBbGwoLy0oW2EtekEtWl0pL2csIChfLCB4KSA9PiB4LnRvVXBwZXJDYXNlKCkpXSA9IG5ld1ZhbHVlOwogICAgfQogIH0KICBpZiAoc3R5bGUuZm9udEZhbWlseSkgewogICAgc2V0Rm9udEZhbWlseSh7CiAgICAgIHR5cGVmYWNlOiBzdHlsZS5mb250RmFtaWx5LAogICAgICB3ZWlnaHQ6IHN0eWxlLmZvbnRXZWlnaHQgfHwgIm5vcm1hbCIsCiAgICAgIHBvc3R1cmU6IHN0eWxlLmZvbnRTdHlsZSB8fCAibm9ybWFsIiwKICAgICAgc2l6ZTogb3JpZ2luYWwuZm9udFNpemUgfHwgMAogICAgfSwgbm9kZSwgbm9kZVskZ2xvYmFsRGF0YV0uZm9udEZpbmRlciwgc3R5bGUpOwogIH0KICBpZiAocmljaFRleHQgJiYgc3R5bGUudmVydGljYWxBbGlnbiAmJiBzdHlsZS52ZXJ0aWNhbEFsaWduICE9PSAiMHB4IiAmJiBzdHlsZS5mb250U2l6ZSkgewogICAgY29uc3QgU1VCX1NVUEVSX1NDUklQVF9GQUNUT1IgPSAwLjU4MzsKICAgIGNvbnN0IFZFUlRJQ0FMX0ZBQ1RPUiA9IDAuMzMzOwogICAgY29uc3QgZm9udFNpemUgPSBnZXRNZWFzdXJlbWVudChzdHlsZS5mb250U2l6ZSk7CiAgICBzdHlsZS5mb250U2l6ZSA9IG1lYXN1cmVUb1N0cmluZyhmb250U2l6ZSAqIFNVQl9TVVBFUl9TQ1JJUFRfRkFDVE9SKTsKICAgIHN0eWxlLnZlcnRpY2FsQWxpZ24gPSBtZWFzdXJlVG9TdHJpbmcoTWF0aC5zaWduKGdldE1lYXN1cmVtZW50KHN0eWxlLnZlcnRpY2FsQWxpZ24pKSAqIGZvbnRTaXplICogVkVSVElDQUxfRkFDVE9SKTsKICB9CiAgaWYgKHJpY2hUZXh0ICYmIHN0eWxlLmZvbnRTaXplKSB7CiAgICBzdHlsZS5mb250U2l6ZSA9IGBjYWxjKCR7c3R5bGUuZm9udFNpemV9ICogdmFyKC0tdG90YWwtc2NhbGUtZmFjdG9yKSlgOwogIH0KICBmaXhUZXh0SW5kZW50KHN0eWxlKTsKICByZXR1cm4gc3R5bGU7Cn0KZnVuY3Rpb24gY2hlY2tTdHlsZShub2RlKSB7CiAgaWYgKCFub2RlLnN0eWxlKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIHJldHVybiBub2RlLnN0eWxlLnNwbGl0KCI7IikuZmlsdGVyKHMgPT4gISFzLnRyaW0oKSkubWFwKHMgPT4gcy5zcGxpdCgiOiIsIDIpLm1hcCh0ID0+IHQudHJpbSgpKSkuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHsKICAgIGlmIChrZXkgPT09ICJmb250LWZhbWlseSIpIHsKICAgICAgbm9kZVskZ2xvYmFsRGF0YV0udXNlZFR5cGVmYWNlcy5hZGQodmFsdWUpOwogICAgfQogICAgcmV0dXJuIFZBTElEX1NUWUxFUy5oYXMoa2V5KTsKICB9KS5tYXAoa3YgPT4ga3Yuam9pbigiOiIpKS5qb2luKCI7Iik7Cn0KY29uc3QgTm9XaGl0ZXMgPSBuZXcgU2V0KFsiYm9keSIsICJodG1sIl0pOwpjbGFzcyBYaHRtbE9iamVjdCBleHRlbmRzIFhtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcywgbmFtZSkgewogICAgc3VwZXIoWEhUTUxfTlNfSUQsIG5hbWUpOwogICAgdGhpc1skcmljaFRleHRdID0gZmFsc2U7CiAgICB0aGlzLnN0eWxlID0gYXR0cmlidXRlcy5zdHlsZSB8fCAiIjsKICB9CiAgWyRjbGVhbl0oYnVpbGRlcikgewogICAgc3VwZXJbJGNsZWFuXShidWlsZGVyKTsKICAgIHRoaXMuc3R5bGUgPSBjaGVja1N0eWxlKHRoaXMpOwogIH0KICBbJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuICFOb1doaXRlcy5oYXModGhpc1skbm9kZU5hbWVdKTsKICB9CiAgWyRvblRleHRdKHN0ciwgcmljaFRleHQgPSBmYWxzZSkgewogICAgaWYgKCFyaWNoVGV4dCkgewogICAgICBzdHIgPSBzdHIucmVwbGFjZUFsbChjcmxmUmVnRXhwLCAiIik7CiAgICAgIGlmICghdGhpcy5zdHlsZS5pbmNsdWRlcygieGZhLXNwYWNlcnVuOnllcyIpKSB7CiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2VBbGwoc3BhY2VzUmVnRXhwLCAiICIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzWyRyaWNoVGV4dF0gPSB0cnVlOwogICAgfQogICAgaWYgKHN0cikgewogICAgICB0aGlzWyRjb250ZW50XSArPSBzdHI7CiAgICB9CiAgfQogIFskcHVzaEdseXBoc10obWVhc3VyZSwgbXVzdFBvcCA9IHRydWUpIHsKICAgIGNvbnN0IHhmYUZvbnQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29uc3QgbWFyZ2luID0gewogICAgICB0b3A6IE5hTiwKICAgICAgYm90dG9tOiBOYU4sCiAgICAgIGxlZnQ6IE5hTiwKICAgICAgcmlnaHQ6IE5hTgogICAgfTsKICAgIGxldCBsaW5lSGVpZ2h0ID0gbnVsbDsKICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuc3R5bGUuc3BsaXQoIjsiKS5tYXAocyA9PiBzLnNwbGl0KCI6IiwgMikpKSB7CiAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgY2FzZSAiZm9udC1mYW1pbHkiOgogICAgICAgICAgeGZhRm9udC50eXBlZmFjZSA9IHN0cmlwUXVvdGVzKHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImZvbnQtc2l6ZSI6CiAgICAgICAgICB4ZmFGb250LnNpemUgPSBnZXRNZWFzdXJlbWVudCh2YWx1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJmb250LXdlaWdodCI6CiAgICAgICAgICB4ZmFGb250LndlaWdodCA9IHZhbHVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZm9udC1zdHlsZSI6CiAgICAgICAgICB4ZmFGb250LnBvc3R1cmUgPSB2YWx1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxldHRlci1zcGFjaW5nIjoKICAgICAgICAgIHhmYUZvbnQubGV0dGVyU3BhY2luZyA9IGdldE1lYXN1cmVtZW50KHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm1hcmdpbiI6CiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgvIFx0LykubWFwKHggPT4gZ2V0TWVhc3VyZW1lbnQoeCkpOwogICAgICAgICAgc3dpdGNoICh2YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gbWFyZ2luLmJvdHRvbSA9IG1hcmdpbi5sZWZ0ID0gbWFyZ2luLnJpZ2h0ID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgbWFyZ2luLnRvcCA9IG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMF07CiAgICAgICAgICAgICAgbWFyZ2luLmxlZnQgPSBtYXJnaW4ucmlnaHQgPSB2YWx1ZXNbMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMl07CiAgICAgICAgICAgICAgbWFyZ2luLmxlZnQgPSBtYXJnaW4ucmlnaHQgPSB2YWx1ZXNbMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIG1hcmdpbi5sZWZ0ID0gdmFsdWVzWzFdOwogICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMl07CiAgICAgICAgICAgICAgbWFyZ2luLnJpZ2h0ID0gdmFsdWVzWzNdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLXRvcCI6CiAgICAgICAgICBtYXJnaW4udG9wID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLWJvdHRvbSI6CiAgICAgICAgICBtYXJnaW4uYm90dG9tID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLWxlZnQiOgogICAgICAgICAgbWFyZ2luLmxlZnQgPSBnZXRNZWFzdXJlbWVudCh2YWx1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtYXJnaW4tcmlnaHQiOgogICAgICAgICAgbWFyZ2luLnJpZ2h0ID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibGluZS1oZWlnaHQiOgogICAgICAgICAgbGluZUhlaWdodCA9IGdldE1lYXN1cmVtZW50KHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBtZWFzdXJlLnB1c2hEYXRhKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCk7CiAgICBpZiAodGhpc1skY29udGVudF0pIHsKICAgICAgbWVhc3VyZS5hZGRTdHJpbmcodGhpc1skY29udGVudF0pOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzWyRnZXRDaGlsZHJlbl0oKSkgewogICAgICAgIGlmIChjaGlsZFskbm9kZU5hbWVdID09PSAiI3RleHQiKSB7CiAgICAgICAgICBtZWFzdXJlLmFkZFN0cmluZyhjaGlsZFskY29udGVudF0pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNoaWxkWyRwdXNoR2x5cGhzXShtZWFzdXJlKTsKICAgICAgfQogICAgfQogICAgaWYgKG11c3RQb3ApIHsKICAgICAgbWVhc3VyZS5wb3BGb250KCk7CiAgICB9CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICB0aGlzWyRjaGlsZHJlblRvSFRNTF0oe30pOwogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpc1skY29udGVudF0pIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBsZXQgdmFsdWU7CiAgICBpZiAodGhpc1skcmljaFRleHRdKSB7CiAgICAgIHZhbHVlID0gdGhpc1skY29udGVudF0gPyB0aGlzWyRjb250ZW50XS5yZXBsYWNlQWxsKGNybGZGb3JSaWNoVGV4dFJlZ0V4cCwgIlxuIikgOiB1bmRlZmluZWQ7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZSA9IHRoaXNbJGNvbnRlbnRdIHx8IHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiB0aGlzWyRub2RlTmFtZV0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBocmVmOiB0aGlzLmhyZWYsCiAgICAgICAgc3R5bGU6IG1hcFN0eWxlKHRoaXMuc3R5bGUsIHRoaXMsIHRoaXNbJHJpY2hUZXh0XSkKICAgICAgfSwKICAgICAgY2hpbGRyZW4sCiAgICAgIHZhbHVlCiAgICB9KTsKICB9Cn0KY2xhc3MgQSBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAiYSIpOwogICAgdGhpcy5ocmVmID0gZml4VVJMKGF0dHJpYnV0ZXMuaHJlZikgfHwgIiI7CiAgfQp9CmNsYXNzIEIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImIiKTsKICB9CiAgWyRwdXNoR2x5cGhzXShtZWFzdXJlKSB7CiAgICBtZWFzdXJlLnB1c2hGb250KHsKICAgICAgd2VpZ2h0OiAiYm9sZCIKICAgIH0pOwogICAgc3VwZXJbJHB1c2hHbHlwaHNdKG1lYXN1cmUpOwogICAgbWVhc3VyZS5wb3BGb250KCk7CiAgfQp9CmNsYXNzIEJvZHkgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImJvZHkiKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCByZXMgPSBzdXBlclskdG9IVE1MXShhdmFpbGFibGVTcGFjZSk7CiAgICBjb25zdCB7CiAgICAgIGh0bWwKICAgIH0gPSByZXM7CiAgICBpZiAoIWh0bWwpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBodG1sLm5hbWUgPSAiZGl2IjsKICAgIGh0bWwuYXR0cmlidXRlcy5jbGFzcyA9IFsieGZhUmljaCJdOwogICAgcmV0dXJuIHJlczsKICB9Cn0KY2xhc3MgQnIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImJyIik7CiAgfQogIFskdGV4dF0oKSB7CiAgICByZXR1cm4gIlxuIjsKICB9CiAgWyRwdXNoR2x5cGhzXShtZWFzdXJlKSB7CiAgICBtZWFzdXJlLmFkZFN0cmluZygiXG4iKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImJyIgogICAgfSk7CiAgfQp9CmNsYXNzIEh0bWwgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImh0bWwiKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgdGhpc1skZXh0cmFdID0gewogICAgICBjaGlsZHJlbgogICAgfTsKICAgIHRoaXNbJGNoaWxkcmVuVG9IVE1MXSh7fSk7CiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICAgIG5hbWU6ICJkaXYiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIGNsYXNzOiBbInhmYVJpY2giXSwKICAgICAgICAgIHN0eWxlOiB7fQogICAgICAgIH0sCiAgICAgICAgdmFsdWU6IHRoaXNbJGNvbnRlbnRdIHx8ICIiCiAgICAgIH0pOwogICAgfQogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkgewogICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuWzBdOwogICAgICBpZiAoY2hpbGQuYXR0cmlidXRlcz8uY2xhc3MuaW5jbHVkZXMoInhmYVJpY2giKSkgewogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY2hpbGQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFSaWNoIl0sCiAgICAgICAgc3R5bGU6IHt9CiAgICAgIH0sCiAgICAgIGNoaWxkcmVuCiAgICB9KTsKICB9Cn0KY2xhc3MgSSBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAiaSIpOwogIH0KICBbJHB1c2hHbHlwaHNdKG1lYXN1cmUpIHsKICAgIG1lYXN1cmUucHVzaEZvbnQoewogICAgICBwb3N0dXJlOiAiaXRhbGljIgogICAgfSk7CiAgICBzdXBlclskcHVzaEdseXBoc10obWVhc3VyZSk7CiAgICBtZWFzdXJlLnBvcEZvbnQoKTsKICB9Cn0KY2xhc3MgTGkgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImxpIik7CiAgfQp9CmNsYXNzIE9sIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJvbCIpOwogIH0KfQpjbGFzcyBQIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJwIik7CiAgfQogIFskcHVzaEdseXBoc10obWVhc3VyZSkgewogICAgc3VwZXJbJHB1c2hHbHlwaHNdKG1lYXN1cmUsIGZhbHNlKTsKICAgIG1lYXN1cmUuYWRkU3RyaW5nKCJcbiIpOwogICAgbWVhc3VyZS5hZGRQYXJhKCk7CiAgICBtZWFzdXJlLnBvcEZvbnQoKTsKICB9CiAgWyR0ZXh0XSgpIHsKICAgIGNvbnN0IHNpYmxpbmdzID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRDaGlsZHJlbl0oKTsKICAgIGlmIChzaWJsaW5ncy5hdCgtMSkgPT09IHRoaXMpIHsKICAgICAgcmV0dXJuIHN1cGVyWyR0ZXh0XSgpOwogICAgfQogICAgcmV0dXJuIHN1cGVyWyR0ZXh0XSgpICsgIlxuIjsKICB9Cn0KY2xhc3MgU3BhbiBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAic3BhbiIpOwogIH0KfQpjbGFzcyBTdWIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgInN1YiIpOwogIH0KfQpjbGFzcyBTdXAgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgInN1cCIpOwogIH0KfQpjbGFzcyBVbCBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAidWwiKTsKICB9Cn0KY2xhc3MgWGh0bWxOYW1lc3BhY2UgewogIHN0YXRpYyBbJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoWGh0bWxOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIFhodG1sTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGEoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBBKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgYihhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IEIoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBib2R5KGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgQm9keShhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIGJyKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgQnIoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBodG1sKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgSHRtbChhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIGkoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBJKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgbGkoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBMaShhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIG9sKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgT2woYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgUChhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIHNwYW4oYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBTcGFuKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgc3ViKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgU3ViKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgc3VwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgU3VwKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgdWwoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBVbChhdHRyaWJ1dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9zZXR1cC5qcwoKCgoKCgoKCgpjb25zdCBOYW1lc3BhY2VTZXRVcCA9IHsKICBjb25maWc6IENvbmZpZ05hbWVzcGFjZSwKICBjb25uZWN0aW9uOiBDb25uZWN0aW9uU2V0TmFtZXNwYWNlLAogIGRhdGFzZXRzOiBEYXRhc2V0c05hbWVzcGFjZSwKICBsb2NhbGVTZXQ6IExvY2FsZVNldE5hbWVzcGFjZSwKICBzaWduYXR1cmU6IFNpZ25hdHVyZU5hbWVzcGFjZSwKICBzdHlsZXNoZWV0OiBTdHlsZXNoZWV0TmFtZXNwYWNlLAogIHRlbXBsYXRlOiBUZW1wbGF0ZU5hbWVzcGFjZSwKICB4ZHA6IFhkcE5hbWVzcGFjZSwKICB4aHRtbDogWGh0bWxOYW1lc3BhY2UKfTsKCjsvLyAuL3NyYy9jb3JlL3hmYS91bmtub3duLmpzCgoKY2xhc3MgVW5rbm93bk5hbWVzcGFjZSB7CiAgY29uc3RydWN0b3IobnNJZCkgewogICAgdGhpcy5uYW1lc3BhY2VJZCA9IG5zSWQ7CiAgfQogIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgWG1sT2JqZWN0KHRoaXMubmFtZXNwYWNlSWQsIG5hbWUsIGF0dHJpYnV0ZXMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2J1aWxkZXIuanMKCgoKCgoKCmNsYXNzIFJvb3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGlkcykgewogICAgc3VwZXIoLTEsICJyb290IiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7CiAgICB0aGlzLmVsZW1lbnQgPSBudWxsOwogICAgdGhpc1skaWRzXSA9IGlkczsKICB9CiAgWyRvbkNoaWxkXShjaGlsZCkgewogICAgdGhpcy5lbGVtZW50ID0gY2hpbGQ7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBzdXBlclskZmluYWxpemVdKCk7CiAgICBpZiAodGhpcy5lbGVtZW50LnRlbXBsYXRlIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKICAgICAgdGhpc1skaWRzXS5zZXQoJHJvb3QsIHRoaXMuZWxlbWVudCk7CiAgICAgIHRoaXMuZWxlbWVudC50ZW1wbGF0ZVskcmVzb2x2ZVByb3RvdHlwZXNdKHRoaXNbJGlkc10pOwogICAgICB0aGlzLmVsZW1lbnQudGVtcGxhdGVbJGlkc10gPSB0aGlzWyRpZHNdOwogICAgfQogIH0KfQpjbGFzcyBFbXB0eSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcigtMSwgIiIsIE9iamVjdC5jcmVhdGUobnVsbCkpOwogIH0KICBbJG9uQ2hpbGRdKF8pIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KY2xhc3MgQnVpbGRlciB7CiAgY29uc3RydWN0b3Iocm9vdE5hbWVTcGFjZSA9IG51bGwpIHsKICAgIHRoaXMuX25hbWVzcGFjZVN0YWNrID0gW107CiAgICB0aGlzLl9uc0Fnbm9zdGljTGV2ZWwgPSAwOwogICAgdGhpcy5fbmFtZXNwYWNlUHJlZml4ZXMgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9uYW1lc3BhY2VzID0gbmV3IE1hcCgpOwogICAgdGhpcy5fbmV4dE5zSWQgPSBNYXRoLm1heCguLi5PYmplY3QudmFsdWVzKE5hbWVzcGFjZUlkcykubWFwKCh7CiAgICAgIGlkCiAgICB9KSA9PiBpZCkpOwogICAgdGhpcy5fY3VycmVudE5hbWVzcGFjZSA9IHJvb3ROYW1lU3BhY2UgfHwgbmV3IFVua25vd25OYW1lc3BhY2UoKyt0aGlzLl9uZXh0TnNJZCk7CiAgfQogIGJ1aWxkUm9vdChpZHMpIHsKICAgIHJldHVybiBuZXcgUm9vdChpZHMpOwogIH0KICBidWlsZCh7CiAgICBuc1ByZWZpeCwKICAgIG5hbWUsCiAgICBhdHRyaWJ1dGVzLAogICAgbmFtZXNwYWNlLAogICAgcHJlZml4ZXMKICB9KSB7CiAgICBjb25zdCBoYXNOYW1lc3BhY2VEZWYgPSBuYW1lc3BhY2UgIT09IG51bGw7CiAgICBpZiAoaGFzTmFtZXNwYWNlRGVmKSB7CiAgICAgIHRoaXMuX25hbWVzcGFjZVN0YWNrLnB1c2godGhpcy5fY3VycmVudE5hbWVzcGFjZSk7CiAgICAgIHRoaXMuX2N1cnJlbnROYW1lc3BhY2UgPSB0aGlzLl9zZWFyY2hOYW1lc3BhY2UobmFtZXNwYWNlKTsKICAgIH0KICAgIGlmIChwcmVmaXhlcykgewogICAgICB0aGlzLl9hZGROYW1lc3BhY2VQcmVmaXgocHJlZml4ZXMpOwogICAgfQogICAgaWYgKGF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoJG5zQXR0cmlidXRlcykpIHsKICAgICAgY29uc3QgZGF0YVRlbXBsYXRlID0gTmFtZXNwYWNlU2V0VXAuZGF0YXNldHM7CiAgICAgIGNvbnN0IG5zQXR0cnMgPSBhdHRyaWJ1dGVzWyRuc0F0dHJpYnV0ZXNdOwogICAgICBsZXQgeGZhQXR0cnMgPSBudWxsOwogICAgICBmb3IgKGNvbnN0IFtucywgYXR0cnNdIG9mIE9iamVjdC5lbnRyaWVzKG5zQXR0cnMpKSB7CiAgICAgICAgY29uc3QgbnNUb1VzZSA9IHRoaXMuX2dldE5hbWVzcGFjZVRvVXNlKG5zKTsKICAgICAgICBpZiAobnNUb1VzZSA9PT0gZGF0YVRlbXBsYXRlKSB7CiAgICAgICAgICB4ZmFBdHRycyA9IHsKICAgICAgICAgICAgeGZhOiBhdHRycwogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoeGZhQXR0cnMpIHsKICAgICAgICBhdHRyaWJ1dGVzWyRuc0F0dHJpYnV0ZXNdID0geGZhQXR0cnM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXNbJG5zQXR0cmlidXRlc107CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG5hbWVzcGFjZVRvVXNlID0gdGhpcy5fZ2V0TmFtZXNwYWNlVG9Vc2UobnNQcmVmaXgpOwogICAgY29uc3Qgbm9kZSA9IG5hbWVzcGFjZVRvVXNlPy5bJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB8fCBuZXcgRW1wdHkoKTsKICAgIGlmIChub2RlWyRpc05zQWdub3N0aWNdKCkpIHsKICAgICAgdGhpcy5fbnNBZ25vc3RpY0xldmVsKys7CiAgICB9CiAgICBpZiAoaGFzTmFtZXNwYWNlRGVmIHx8IHByZWZpeGVzIHx8IG5vZGVbJGlzTnNBZ25vc3RpY10oKSkgewogICAgICBub2RlWyRjbGVhbnVwXSA9IHsKICAgICAgICBoYXNOYW1lc3BhY2U6IGhhc05hbWVzcGFjZURlZiwKICAgICAgICBwcmVmaXhlcywKICAgICAgICBuc0Fnbm9zdGljOiBub2RlWyRpc05zQWdub3N0aWNdKCkKICAgICAgfTsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KICBpc05zQWdub3N0aWMoKSB7CiAgICByZXR1cm4gdGhpcy5fbnNBZ25vc3RpY0xldmVsID4gMDsKICB9CiAgX3NlYXJjaE5hbWVzcGFjZShuc05hbWUpIHsKICAgIGxldCBucyA9IHRoaXMuX25hbWVzcGFjZXMuZ2V0KG5zTmFtZSk7CiAgICBpZiAobnMpIHsKICAgICAgcmV0dXJuIG5zOwogICAgfQogICAgZm9yIChjb25zdCBbbmFtZSwgewogICAgICBjaGVjawogICAgfV0gb2YgT2JqZWN0LmVudHJpZXMoTmFtZXNwYWNlSWRzKSkgewogICAgICBpZiAoY2hlY2sobnNOYW1lKSkgewogICAgICAgIG5zID0gTmFtZXNwYWNlU2V0VXBbbmFtZV07CiAgICAgICAgaWYgKG5zKSB7CiAgICAgICAgICB0aGlzLl9uYW1lc3BhY2VzLnNldChuc05hbWUsIG5zKTsKICAgICAgICAgIHJldHVybiBuczsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIG5zID0gbmV3IFVua25vd25OYW1lc3BhY2UoKyt0aGlzLl9uZXh0TnNJZCk7CiAgICB0aGlzLl9uYW1lc3BhY2VzLnNldChuc05hbWUsIG5zKTsKICAgIHJldHVybiBuczsKICB9CiAgX2FkZE5hbWVzcGFjZVByZWZpeChwcmVmaXhlcykgewogICAgZm9yIChjb25zdCB7CiAgICAgIHByZWZpeCwKICAgICAgdmFsdWUKICAgIH0gb2YgcHJlZml4ZXMpIHsKICAgICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5fc2VhcmNoTmFtZXNwYWNlKHZhbHVlKTsKICAgICAgbGV0IHByZWZpeFN0YWNrID0gdGhpcy5fbmFtZXNwYWNlUHJlZml4ZXMuZ2V0KHByZWZpeCk7CiAgICAgIGlmICghcHJlZml4U3RhY2spIHsKICAgICAgICBwcmVmaXhTdGFjayA9IFtdOwogICAgICAgIHRoaXMuX25hbWVzcGFjZVByZWZpeGVzLnNldChwcmVmaXgsIHByZWZpeFN0YWNrKTsKICAgICAgfQogICAgICBwcmVmaXhTdGFjay5wdXNoKG5hbWVzcGFjZSk7CiAgICB9CiAgfQogIF9nZXROYW1lc3BhY2VUb1VzZShwcmVmaXgpIHsKICAgIGlmICghcHJlZml4KSB7CiAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50TmFtZXNwYWNlOwogICAgfQogICAgY29uc3QgcHJlZml4U3RhY2sgPSB0aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5nZXQocHJlZml4KTsKICAgIGlmIChwcmVmaXhTdGFjaz8ubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gcHJlZml4U3RhY2suYXQoLTEpOwogICAgfQogICAgd2FybihgVW5rbm93biBuYW1lc3BhY2UgcHJlZml4OiAke3ByZWZpeH0uYCk7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY2xlYW4oZGF0YSkgewogICAgY29uc3QgewogICAgICBoYXNOYW1lc3BhY2UsCiAgICAgIHByZWZpeGVzLAogICAgICBuc0Fnbm9zdGljCiAgICB9ID0gZGF0YTsKICAgIGlmIChoYXNOYW1lc3BhY2UpIHsKICAgICAgdGhpcy5fY3VycmVudE5hbWVzcGFjZSA9IHRoaXMuX25hbWVzcGFjZVN0YWNrLnBvcCgpOwogICAgfQogICAgaWYgKHByZWZpeGVzKSB7CiAgICAgIHByZWZpeGVzLmZvckVhY2goKHsKICAgICAgICBwcmVmaXgKICAgICAgfSkgPT4gewogICAgICAgIHRoaXMuX25hbWVzcGFjZVByZWZpeGVzLmdldChwcmVmaXgpLnBvcCgpOwogICAgICB9KTsKICAgIH0KICAgIGlmIChuc0Fnbm9zdGljKSB7CiAgICAgIHRoaXMuX25zQWdub3N0aWNMZXZlbC0tOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL3BhcnNlci5qcwoKCgoKY2xhc3MgWEZBUGFyc2VyIGV4dGVuZHMgWE1MUGFyc2VyQmFzZSB7CiAgY29uc3RydWN0b3Iocm9vdE5hbWVTcGFjZSA9IG51bGwsIHJpY2hUZXh0ID0gZmFsc2UpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9idWlsZGVyID0gbmV3IEJ1aWxkZXIocm9vdE5hbWVTcGFjZSk7CiAgICB0aGlzLl9zdGFjayA9IFtdOwogICAgdGhpcy5fZ2xvYmFsRGF0YSA9IHsKICAgICAgdXNlZFR5cGVmYWNlczogbmV3IFNldCgpCiAgICB9OwogICAgdGhpcy5faWRzID0gbmV3IE1hcCgpOwogICAgdGhpcy5fY3VycmVudCA9IHRoaXMuX2J1aWxkZXIuYnVpbGRSb290KHRoaXMuX2lkcyk7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcjsKICAgIHRoaXMuX3doaXRlUmVnZXggPSAvXlxzKyQvOwogICAgdGhpcy5fbmJzcHMgPSAvXHhhMCsvZzsKICAgIHRoaXMuX3JpY2hUZXh0ID0gcmljaFRleHQ7CiAgfQogIHBhcnNlKGRhdGEpIHsKICAgIHRoaXMucGFyc2VYbWwoZGF0YSk7CiAgICBpZiAodGhpcy5fZXJyb3JDb2RlICE9PSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcikgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgdGhpcy5fY3VycmVudFskZmluYWxpemVdKCk7CiAgICByZXR1cm4gdGhpcy5fY3VycmVudC5lbGVtZW50OwogIH0KICBvblRleHQodGV4dCkgewogICAgdGV4dCA9IHRleHQucmVwbGFjZSh0aGlzLl9uYnNwcywgbWF0Y2ggPT4gbWF0Y2guc2xpY2UoMSkgKyAiICIpOwogICAgaWYgKHRoaXMuX3JpY2hUZXh0IHx8IHRoaXMuX2N1cnJlbnRbJGFjY2VwdFdoaXRlc3BhY2VdKCkpIHsKICAgICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0LCB0aGlzLl9yaWNoVGV4dCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl93aGl0ZVJlZ2V4LnRlc3QodGV4dCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0LnRyaW0oKSk7CiAgfQogIG9uQ2RhdGEodGV4dCkgewogICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0KTsKICB9CiAgX21rQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCB0YWdOYW1lKSB7CiAgICBsZXQgbmFtZXNwYWNlID0gbnVsbDsKICAgIGxldCBwcmVmaXhlcyA9IG51bGw7CiAgICBjb25zdCBhdHRyaWJ1dGVPYmogPSBPYmplY3QuY3JlYXRlKHt9KTsKICAgIGZvciAoY29uc3QgewogICAgICBuYW1lLAogICAgICB2YWx1ZQogICAgfSBvZiBhdHRyaWJ1dGVzKSB7CiAgICAgIGlmIChuYW1lID09PSAieG1sbnMiKSB7CiAgICAgICAgaWYgKCFuYW1lc3BhY2UpIHsKICAgICAgICAgIG5hbWVzcGFjZSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBtdWx0aXBsZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBpbiA8JHt0YWdOYW1lfT5gKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkgewogICAgICAgIGNvbnN0IHByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKCJ4bWxuczoiLmxlbmd0aCk7CiAgICAgICAgaWYgKCFwcmVmaXhlcykgewogICAgICAgICAgcHJlZml4ZXMgPSBbXTsKICAgICAgICB9CiAgICAgICAgcHJlZml4ZXMucHVzaCh7CiAgICAgICAgICBwcmVmaXgsCiAgICAgICAgICB2YWx1ZQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGkgPSBuYW1lLmluZGV4T2YoIjoiKTsKICAgICAgICBpZiAoaSA9PT0gLTEpIHsKICAgICAgICAgIGF0dHJpYnV0ZU9ialtuYW1lXSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsZXQgbnNBdHRycyA9IGF0dHJpYnV0ZU9ialskbnNBdHRyaWJ1dGVzXTsKICAgICAgICAgIGlmICghbnNBdHRycykgewogICAgICAgICAgICBuc0F0dHJzID0gYXR0cmlidXRlT2JqWyRuc0F0dHJpYnV0ZXNdID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IFtucywgYXR0ck5hbWVdID0gW25hbWUuc2xpY2UoMCwgaSksIG5hbWUuc2xpY2UoaSArIDEpXTsKICAgICAgICAgIGNvbnN0IGF0dHJzID0gbnNBdHRyc1tuc10gfHw9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICBhdHRyc1thdHRyTmFtZV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBbbmFtZXNwYWNlLCBwcmVmaXhlcywgYXR0cmlidXRlT2JqXTsKICB9CiAgX2dldE5hbWVBbmRQcmVmaXgobmFtZSwgbnNBZ25vc3RpYykgewogICAgY29uc3QgaSA9IG5hbWUuaW5kZXhPZigiOiIpOwogICAgaWYgKGkgPT09IC0xKSB7CiAgICAgIHJldHVybiBbbmFtZSwgbnVsbF07CiAgICB9CiAgICByZXR1cm4gW25hbWUuc3Vic3RyaW5nKGkgKyAxKSwgbnNBZ25vc3RpYyA/ICIiIDogbmFtZS5zdWJzdHJpbmcoMCwgaSldOwogIH0KICBvbkJlZ2luRWxlbWVudCh0YWdOYW1lLCBhdHRyaWJ1dGVzLCBpc0VtcHR5KSB7CiAgICBjb25zdCBbbmFtZXNwYWNlLCBwcmVmaXhlcywgYXR0cmlidXRlc09ial0gPSB0aGlzLl9ta0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgdGFnTmFtZSk7CiAgICBjb25zdCBbbmFtZSwgbnNQcmVmaXhdID0gdGhpcy5fZ2V0TmFtZUFuZFByZWZpeCh0YWdOYW1lLCB0aGlzLl9idWlsZGVyLmlzTnNBZ25vc3RpYygpKTsKICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9idWlsZGVyLmJ1aWxkKHsKICAgICAgbnNQcmVmaXgsCiAgICAgIG5hbWUsCiAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNPYmosCiAgICAgIG5hbWVzcGFjZSwKICAgICAgcHJlZml4ZXMKICAgIH0pOwogICAgbm9kZVskZ2xvYmFsRGF0YV0gPSB0aGlzLl9nbG9iYWxEYXRhOwogICAgaWYgKGlzRW1wdHkpIHsKICAgICAgbm9kZVskZmluYWxpemVdKCk7CiAgICAgIGlmICh0aGlzLl9jdXJyZW50WyRvbkNoaWxkXShub2RlKSkgewogICAgICAgIG5vZGVbJHNldElkXSh0aGlzLl9pZHMpOwogICAgICB9CiAgICAgIG5vZGVbJGNsZWFuXSh0aGlzLl9idWlsZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fc3RhY2sucHVzaCh0aGlzLl9jdXJyZW50KTsKICAgIHRoaXMuX2N1cnJlbnQgPSBub2RlOwogIH0KICBvbkVuZEVsZW1lbnQobmFtZSkgewogICAgY29uc3Qgbm9kZSA9IHRoaXMuX2N1cnJlbnQ7CiAgICBpZiAobm9kZVskaXNDREFUQVhtbF0oKSAmJiB0eXBlb2Ygbm9kZVskY29udGVudF0gPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBYRkFQYXJzZXIoKTsKICAgICAgcGFyc2VyLl9nbG9iYWxEYXRhID0gdGhpcy5fZ2xvYmFsRGF0YTsKICAgICAgY29uc3Qgcm9vdCA9IHBhcnNlci5wYXJzZShub2RlWyRjb250ZW50XSk7CiAgICAgIG5vZGVbJGNvbnRlbnRdID0gbnVsbDsKICAgICAgbm9kZVskb25DaGlsZF0ocm9vdCk7CiAgICB9CiAgICBub2RlWyRmaW5hbGl6ZV0oKTsKICAgIHRoaXMuX2N1cnJlbnQgPSB0aGlzLl9zdGFjay5wb3AoKTsKICAgIGlmICh0aGlzLl9jdXJyZW50WyRvbkNoaWxkXShub2RlKSkgewogICAgICBub2RlWyRzZXRJZF0odGhpcy5faWRzKTsKICAgIH0KICAgIG5vZGVbJGNsZWFuXSh0aGlzLl9idWlsZGVyKTsKICB9CiAgb25FcnJvcihjb2RlKSB7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBjb2RlOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2ZhY3RvcnkuanMKCgoKCgoKCgpjbGFzcyBYRkFGYWN0b3J5IHsKICBjb25zdHJ1Y3RvcihkYXRhKSB7CiAgICB0cnkgewogICAgICB0aGlzLnJvb3QgPSBuZXcgWEZBUGFyc2VyKCkucGFyc2UoWEZBRmFjdG9yeS5fY3JlYXRlRG9jdW1lbnQoZGF0YSkpOwogICAgICBjb25zdCBiaW5kZXIgPSBuZXcgQmluZGVyKHRoaXMucm9vdCk7CiAgICAgIHRoaXMuZm9ybSA9IGJpbmRlci5iaW5kKCk7CiAgICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIodGhpcy5yb290LCBiaW5kZXIuZ2V0RGF0YSgpKTsKICAgICAgdGhpcy5mb3JtWyRnbG9iYWxEYXRhXS50ZW1wbGF0ZSA9IHRoaXMuZm9ybTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgd2FybihgWEZBIC0gYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmcgYW5kIGJpbmRpbmc6ICR7ZX1gKTsKICAgIH0KICB9CiAgaXNWYWxpZCgpIHsKICAgIHJldHVybiB0aGlzLnJvb3QgJiYgdGhpcy5mb3JtOwogIH0KICBfY3JlYXRlUGFnZXNIZWxwZXIoKSB7CiAgICBjb25zdCBpdGVyYXRvciA9IHRoaXMuZm9ybVskdG9QYWdlc10oKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgIGNvbnN0IG5leHRJdGVyYXRpb24gPSAoKSA9PiB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHZhbHVlID0gaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgaWYgKHZhbHVlLmRvbmUpIHsKICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZS52YWx1ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXRUaW1lb3V0KG5leHRJdGVyYXRpb24sIDApOwogICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHNldFRpbWVvdXQobmV4dEl0ZXJhdGlvbiwgMCk7CiAgICB9KTsKICB9CiAgYXN5bmMgX2NyZWF0ZVBhZ2VzKCkgewogICAgdHJ5IHsKICAgICAgdGhpcy5wYWdlcyA9IGF3YWl0IHRoaXMuX2NyZWF0ZVBhZ2VzSGVscGVyKCk7CiAgICAgIHRoaXMuZGltcyA9IHRoaXMucGFnZXMuY2hpbGRyZW4ubWFwKGMgPT4gewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIHdpZHRoLAogICAgICAgICAgaGVpZ2h0CiAgICAgICAgfSA9IGMuYXR0cmlidXRlcy5zdHlsZTsKICAgICAgICByZXR1cm4gWzAsIDAsIHBhcnNlSW50KHdpZHRoKSwgcGFyc2VJbnQoaGVpZ2h0KV07CiAgICAgIH0pOwogICAgfSBjYXRjaCAoZSkgewogICAgICB3YXJuKGBYRkEgLSBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgbGF5b3V0OiAke2V9YCk7CiAgICB9CiAgfQogIGdldEJvdW5kaW5nQm94KHBhZ2VJbmRleCkgewogICAgcmV0dXJuIHRoaXMuZGltc1twYWdlSW5kZXhdOwogIH0KICBhc3luYyBnZXROdW1QYWdlcygpIHsKICAgIGlmICghdGhpcy5wYWdlcykgewogICAgICBhd2FpdCB0aGlzLl9jcmVhdGVQYWdlcygpOwogICAgfQogICAgcmV0dXJuIHRoaXMuZGltcy5sZW5ndGg7CiAgfQogIHNldEltYWdlcyhpbWFnZXMpIHsKICAgIHRoaXMuZm9ybVskZ2xvYmFsRGF0YV0uaW1hZ2VzID0gaW1hZ2VzOwogIH0KICBzZXRGb250cyhmb250cykgewogICAgdGhpcy5mb3JtWyRnbG9iYWxEYXRhXS5mb250RmluZGVyID0gbmV3IEZvbnRGaW5kZXIoZm9udHMpOwogICAgY29uc3QgbWlzc2luZ0ZvbnRzID0gW107CiAgICBmb3IgKGxldCB0eXBlZmFjZSBvZiB0aGlzLmZvcm1bJGdsb2JhbERhdGFdLnVzZWRUeXBlZmFjZXMpIHsKICAgICAgdHlwZWZhY2UgPSBzdHJpcFF1b3Rlcyh0eXBlZmFjZSk7CiAgICAgIGNvbnN0IGZvbnQgPSB0aGlzLmZvcm1bJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIuZmluZCh0eXBlZmFjZSk7CiAgICAgIGlmICghZm9udCkgewogICAgICAgIG1pc3NpbmdGb250cy5wdXNoKHR5cGVmYWNlKTsKICAgICAgfQogICAgfQogICAgaWYgKG1pc3NpbmdGb250cy5sZW5ndGggPiAwKSB7CiAgICAgIHJldHVybiBtaXNzaW5nRm9udHM7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgYXBwZW5kRm9udHMoZm9udHMsIHJlYWxseU1pc3NpbmdGb250cykgewogICAgdGhpcy5mb3JtWyRnbG9iYWxEYXRhXS5mb250RmluZGVyLmFkZChmb250cywgcmVhbGx5TWlzc2luZ0ZvbnRzKTsKICB9CiAgYXN5bmMgZ2V0UGFnZXMoKSB7CiAgICBpZiAoIXRoaXMucGFnZXMpIHsKICAgICAgYXdhaXQgdGhpcy5fY3JlYXRlUGFnZXMoKTsKICAgIH0KICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5wYWdlczsKICAgIHRoaXMucGFnZXMgPSBudWxsOwogICAgcmV0dXJuIHBhZ2VzOwogIH0KICBzZXJpYWxpemVEYXRhKHN0b3JhZ2UpIHsKICAgIHJldHVybiB0aGlzLmRhdGFIYW5kbGVyLnNlcmlhbGl6ZShzdG9yYWdlKTsKICB9CiAgc3RhdGljIF9jcmVhdGVEb2N1bWVudChkYXRhKSB7CiAgICBpZiAoIWRhdGFbIi94ZHA6eGRwIl0pIHsKICAgICAgcmV0dXJuIGRhdGFbInhkcDp4ZHAiXTsKICAgIH0KICAgIHJldHVybiBPYmplY3QudmFsdWVzKGRhdGEpLmpvaW4oIiIpOwogIH0KICBzdGF0aWMgZ2V0UmljaFRleHRBc0h0bWwocmMpIHsKICAgIGlmICghcmMgfHwgdHlwZW9mIHJjICE9PSAic3RyaW5nIikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRyeSB7CiAgICAgIGxldCByb290ID0gbmV3IFhGQVBhcnNlcihYaHRtbE5hbWVzcGFjZSwgdHJ1ZSkucGFyc2UocmMpOwogICAgICBpZiAoIVsiYm9keSIsICJ4aHRtbCJdLmluY2x1ZGVzKHJvb3RbJG5vZGVOYW1lXSkpIHsKICAgICAgICBjb25zdCBuZXdSb290ID0gWGh0bWxOYW1lc3BhY2UuYm9keSh7fSk7CiAgICAgICAgbmV3Um9vdFskYXBwZW5kQ2hpbGRdKHJvb3QpOwogICAgICAgIHJvb3QgPSBuZXdSb290OwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IHJvb3RbJHRvSFRNTF0oKTsKICAgICAgaWYgKCFyZXN1bHQuc3VjY2VzcykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IHsKICAgICAgICBodG1sCiAgICAgIH0gPSByZXN1bHQ7CiAgICAgIGNvbnN0IHsKICAgICAgICBhdHRyaWJ1dGVzCiAgICAgIH0gPSBodG1sOwogICAgICBpZiAoYXR0cmlidXRlcykgewogICAgICAgIGlmIChhdHRyaWJ1dGVzLmNsYXNzKSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzID0gYXR0cmlidXRlcy5jbGFzcy5maWx0ZXIoYXR0ciA9PiAhYXR0ci5zdGFydHNXaXRoKCJ4ZmEiKSk7CiAgICAgICAgfQogICAgICAgIGF0dHJpYnV0ZXMuZGlyID0gImF1dG8iOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgaHRtbCwKICAgICAgICBzdHI6IHJvb3RbJHRleHRdKCkKICAgICAgfTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgd2FybihgWEZBIC0gYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmcgb2YgcmljaCB0ZXh0OiAke2V9YCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2Fubm90YXRpb24uanMKCgoKCgoKCgoKCgoKCgpjbGFzcyBBbm5vdGF0aW9uRmFjdG9yeSB7CiAgc3RhdGljIGNyZWF0ZUdsb2JhbHMocGRmTWFuYWdlcikgewogICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJ4ZmFEYXRhc2V0cyIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInN0cnVjdFRyZWVSb290IiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYmFzZVVybCIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImF0dGFjaG1lbnRzIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZ2xvYmFsQ29sb3JTcGFjZUNhY2hlIildKS50aGVuKChbYWNyb0Zvcm0sIHhmYURhdGFzZXRzLCBzdHJ1Y3RUcmVlUm9vdCwgYmFzZVVybCwgYXR0YWNobWVudHMsIGdsb2JhbENvbG9yU3BhY2VDYWNoZV0pID0+ICh7CiAgICAgIHBkZk1hbmFnZXIsCiAgICAgIGFjcm9Gb3JtOiBhY3JvRm9ybSBpbnN0YW5jZW9mIERpY3QgPyBhY3JvRm9ybSA6IERpY3QuZW1wdHksCiAgICAgIHhmYURhdGFzZXRzLAogICAgICBzdHJ1Y3RUcmVlUm9vdCwKICAgICAgYmFzZVVybCwKICAgICAgYXR0YWNobWVudHMsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZQogICAgfSksIHJlYXNvbiA9PiB7CiAgICAgIHdhcm4oYGNyZWF0ZUdsb2JhbHM6ICIke3JlYXNvbn0iLmApOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0pOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlKHhyZWYsIHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMsIGlkRmFjdG9yeSwgY29sbGVjdEZpZWxkcywgb3JwaGFuRmllbGRzLCBwYWdlUmVmKSB7CiAgICBjb25zdCBwYWdlSW5kZXggPSBjb2xsZWN0RmllbGRzID8gYXdhaXQgdGhpcy5fZ2V0UGFnZUluZGV4KHhyZWYsIHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMucGRmTWFuYWdlcikgOiBudWxsOwogICAgcmV0dXJuIGFubm90YXRpb25HbG9iYWxzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJfY3JlYXRlIiwgW3hyZWYsIHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMsIGlkRmFjdG9yeSwgY29sbGVjdEZpZWxkcywgb3JwaGFuRmllbGRzLCBwYWdlSW5kZXgsIHBhZ2VSZWZdKTsKICB9CiAgc3RhdGljIF9jcmVhdGUoeHJlZiwgcmVmLCBhbm5vdGF0aW9uR2xvYmFscywgaWRGYWN0b3J5LCBjb2xsZWN0RmllbGRzID0gZmFsc2UsIG9ycGhhbkZpZWxkcyA9IG51bGwsIHBhZ2VJbmRleCA9IG51bGwsIHBhZ2VSZWYgPSBudWxsKSB7CiAgICBjb25zdCBkaWN0ID0geHJlZi5mZXRjaElmUmVmKHJlZik7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgYWNyb0Zvcm0sCiAgICAgIHBkZk1hbmFnZXIKICAgIH0gPSBhbm5vdGF0aW9uR2xvYmFsczsKICAgIGNvbnN0IGlkID0gcmVmIGluc3RhbmNlb2YgUmVmID8gcmVmLnRvU3RyaW5nKCkgOiBgYW5ub3RfJHtpZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gOwogICAgbGV0IHN1YnR5cGUgPSBkaWN0LmdldCgiU3VidHlwZSIpOwogICAgc3VidHlwZSA9IHN1YnR5cGUgaW5zdGFuY2VvZiBOYW1lID8gc3VidHlwZS5uYW1lIDogbnVsbDsKICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7CiAgICAgIHhyZWYsCiAgICAgIHJlZiwKICAgICAgZGljdCwKICAgICAgc3VidHlwZSwKICAgICAgaWQsCiAgICAgIGFubm90YXRpb25HbG9iYWxzLAogICAgICBjb2xsZWN0RmllbGRzLAogICAgICBvcnBoYW5GaWVsZHMsCiAgICAgIG5lZWRBcHBlYXJhbmNlczogIWNvbGxlY3RGaWVsZHMgJiYgYWNyb0Zvcm0uZ2V0KCJOZWVkQXBwZWFyYW5jZXMiKSA9PT0gdHJ1ZSwKICAgICAgcGFnZUluZGV4LAogICAgICBldmFsdWF0b3JPcHRpb25zOiBwZGZNYW5hZ2VyLmV2YWx1YXRvck9wdGlvbnMsCiAgICAgIHBhZ2VSZWYKICAgIH07CiAgICBzd2l0Y2ggKHN1YnR5cGUpIHsKICAgICAgY2FzZSAiTGluayI6CiAgICAgICAgcmV0dXJuIG5ldyBMaW5rQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiVGV4dCI6CiAgICAgICAgcmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiV2lkZ2V0IjoKICAgICAgICBsZXQgZmllbGRUeXBlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgICAgICBkaWN0LAogICAgICAgICAga2V5OiAiRlQiCiAgICAgICAgfSk7CiAgICAgICAgZmllbGRUeXBlID0gZmllbGRUeXBlIGluc3RhbmNlb2YgTmFtZSA/IGZpZWxkVHlwZS5uYW1lIDogbnVsbDsKICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgewogICAgICAgICAgY2FzZSAiVHgiOgogICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICAgICAgY2FzZSAiQnRuIjoKICAgICAgICAgICAgcmV0dXJuIG5ldyBCdXR0b25XaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICAgICAgY2FzZSAiQ2giOgogICAgICAgICAgICByZXR1cm4gbmV3IENob2ljZVdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgICAgICBjYXNlICJTaWciOgogICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZVdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgICAgfQogICAgICAgIHdhcm4oYFVuaW1wbGVtZW50ZWQgd2lkZ2V0IGZpZWxkIHR5cGUgIiR7ZmllbGRUeXBlfSIsIGAgKyAiZmFsbGluZyBiYWNrIHRvIGJhc2UgZmllbGQgdHlwZS4iKTsKICAgICAgICByZXR1cm4gbmV3IFdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlBvcHVwIjoKICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiRnJlZVRleHQiOgogICAgICAgIHJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJMaW5lIjoKICAgICAgICByZXR1cm4gbmV3IExpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJTcXVhcmUiOgogICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiQ2lyY2xlIjoKICAgICAgICByZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlBvbHlMaW5lIjoKICAgICAgICByZXR1cm4gbmV3IFBvbHlsaW5lQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiUG9seWdvbiI6CiAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiQ2FyZXQiOgogICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJJbmsiOgogICAgICAgIHJldHVybiBuZXcgSW5rQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiSGlnaGxpZ2h0IjoKICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlVuZGVybGluZSI6CiAgICAgICAgcmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJTcXVpZ2dseSI6CiAgICAgICAgcmV0dXJuIG5ldyBTcXVpZ2dseUFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlN0cmlrZU91dCI6CiAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJTdGFtcCI6CiAgICAgICAgcmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIkZpbGVBdHRhY2htZW50IjoKICAgICAgICByZXR1cm4gbmV3IEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgZGVmYXVsdDoKICAgICAgICBpZiAoIWNvbGxlY3RGaWVsZHMpIHsKICAgICAgICAgIGlmICghc3VidHlwZSkgewogICAgICAgICAgICB3YXJuKCJBbm5vdGF0aW9uIGlzIG1pc3NpbmcgdGhlIHJlcXVpcmVkIC9TdWJ0eXBlLiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2FybihgVW5pbXBsZW1lbnRlZCBhbm5vdGF0aW9uIHR5cGUgIiR7c3VidHlwZX0iLCBgICsgImZhbGxpbmcgYmFjayB0byBiYXNlIGFubm90YXRpb24uIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgIH0KICB9CiAgc3RhdGljIGFzeW5jIF9nZXRQYWdlSW5kZXgoeHJlZiwgcmVmLCBwZGZNYW5hZ2VyKSB7CiAgICB0cnkgewogICAgICBjb25zdCBhbm5vdERpY3QgPSBhd2FpdCB4cmVmLmZldGNoSWZSZWZBc3luYyhyZWYpOwogICAgICBpZiAoIShhbm5vdERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBjb25zdCBwYWdlUmVmID0gYW5ub3REaWN0LmdldFJhdygiUCIpOwogICAgICBpZiAocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsIFtwYWdlUmVmXSk7CiAgICAgICAgICByZXR1cm4gcGFnZUluZGV4OwogICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICBpbmZvKGBfZ2V0UGFnZUluZGV4IC0tIG5vdCBhIHZhbGlkIHBhZ2UgcmVmZXJlbmNlOiAiJHtleH0iLmApOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYW5ub3REaWN0LmhhcygiS2lkcyIpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGNvbnN0IG51bVBhZ2VzID0gYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoIm51bVBhZ2VzIik7CiAgICAgIGZvciAobGV0IHBhZ2VJbmRleCA9IDA7IHBhZ2VJbmRleCA8IG51bVBhZ2VzOyBwYWdlSW5kZXgrKykgewogICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KTsKICAgICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJhbm5vdGF0aW9ucyIpOwogICAgICAgIGZvciAoY29uc3QgYW5ub3RSZWYgb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgICAgIGlmIChhbm5vdFJlZiBpbnN0YW5jZW9mIFJlZiAmJiBpc1JlZnNFcXVhbChhbm5vdFJlZiwgcmVmKSkgewogICAgICAgICAgICByZXR1cm4gcGFnZUluZGV4OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgd2FybihgX2dldFBhZ2VJbmRleDogIiR7ZXh9Ii5gKTsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgc3RhdGljIGdlbmVyYXRlSW1hZ2VzKGFubm90YXRpb25zLCB4cmVmLCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgaWYgKCFpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgICB3YXJuKCJnZW5lcmF0ZUltYWdlczogT2Zmc2NyZWVuQ2FudmFzIGlzIG5vdCBzdXBwb3J0ZWQsIGNhbm5vdCBzYXZlIG9yIHByaW50IHNvbWUgYW5ub3RhdGlvbnMgd2l0aCBpbWFnZXMuIik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IGltYWdlUHJvbWlzZXM7CiAgICBmb3IgKGNvbnN0IHsKICAgICAgYml0bWFwSWQsCiAgICAgIGJpdG1hcAogICAgfSBvZiBhbm5vdGF0aW9ucykgewogICAgICBpZiAoIWJpdG1hcCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGltYWdlUHJvbWlzZXMgfHw9IG5ldyBNYXAoKTsKICAgICAgaW1hZ2VQcm9taXNlcy5zZXQoYml0bWFwSWQsIFN0YW1wQW5ub3RhdGlvbi5jcmVhdGVJbWFnZShiaXRtYXAsIHhyZWYpKTsKICAgIH0KICAgIHJldHVybiBpbWFnZVByb21pc2VzOwogIH0KICBzdGF0aWMgYXN5bmMgc2F2ZU5ld0Fubm90YXRpb25zKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvbnMsIGltYWdlUHJvbWlzZXMsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHhyZWYgPSBldmFsdWF0b3IueHJlZjsKICAgIGxldCBiYXNlRm9udFJlZjsKICAgIGNvbnN0IHByb21pc2VzID0gW107CiAgICBjb25zdCB7CiAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkCiAgICB9ID0gZXZhbHVhdG9yLm9wdGlvbnM7CiAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgaWYgKGFubm90YXRpb24uZGVsZXRlZCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHN3aXRjaCAoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSkgewogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6CiAgICAgICAgICBpZiAoIWJhc2VGb250UmVmKSB7CiAgICAgICAgICAgIGNvbnN0IGJhc2VGb250ID0gbmV3IERpY3QoeHJlZik7CiAgICAgICAgICAgIGJhc2VGb250LnNldCgiQmFzZUZvbnQiLCBOYW1lLmdldCgiSGVsdmV0aWNhIikpOwogICAgICAgICAgICBiYXNlRm9udC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRm9udCIpKTsKICAgICAgICAgICAgYmFzZUZvbnQuc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIlR5cGUxIikpOwogICAgICAgICAgICBiYXNlRm9udC5zZXQoIkVuY29kaW5nIiwgTmFtZS5nZXQoIldpbkFuc2lFbmNvZGluZyIpKTsKICAgICAgICAgICAgYmFzZUZvbnRSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgICAgICBjaGFuZ2VzLnB1dChiYXNlRm9udFJlZiwgewogICAgICAgICAgICAgIGRhdGE6IGJhc2VGb250CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgcHJvbWlzZXMucHVzaChGcmVlVGV4dEFubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzLCB7CiAgICAgICAgICAgIGV2YWx1YXRvciwKICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgYmFzZUZvbnRSZWYKICAgICAgICAgIH0pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUOgogICAgICAgICAgaWYgKGFubm90YXRpb24ucXVhZFBvaW50cykgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKEhpZ2hsaWdodEFubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKElua0Fubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLklOSzoKICAgICAgICAgIHByb21pc2VzLnB1c2goSW5rQW5ub3RhdGlvbi5jcmVhdGVOZXdBbm5vdGF0aW9uKHhyZWYsIGFubm90YXRpb24sIGNoYW5nZXMpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVA6CiAgICAgICAgICBjb25zdCBpbWFnZSA9IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID8gYXdhaXQgaW1hZ2VQcm9taXNlcz8uZ2V0KGFubm90YXRpb24uYml0bWFwSWQpIDogbnVsbDsKICAgICAgICAgIGlmIChpbWFnZT8uaW1hZ2VTdHJlYW0pIHsKICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgIGltYWdlU3RyZWFtLAogICAgICAgICAgICAgIHNtYXNrU3RyZWFtCiAgICAgICAgICAgIH0gPSBpbWFnZTsKICAgICAgICAgICAgaWYgKHNtYXNrU3RyZWFtKSB7CiAgICAgICAgICAgICAgY29uc3Qgc21hc2tSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgICAgICAgIGNoYW5nZXMucHV0KHNtYXNrUmVmLCB7CiAgICAgICAgICAgICAgICBkYXRhOiBzbWFza1N0cmVhbQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGltYWdlU3RyZWFtLmRpY3Quc2V0KCJTTWFzayIsIHNtYXNrUmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpbWFnZVJlZiA9IGltYWdlLmltYWdlUmVmID0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgICAgICAgICAgY2hhbmdlcy5wdXQoaW1hZ2VSZWYsIHsKICAgICAgICAgICAgICBkYXRhOiBpbWFnZVN0cmVhbQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaW1hZ2UuaW1hZ2VTdHJlYW0gPSBpbWFnZS5zbWFza1N0cmVhbSA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBwcm9taXNlcy5wdXNoKFN0YW1wQW5ub3RhdGlvbi5jcmVhdGVOZXdBbm5vdGF0aW9uKHhyZWYsIGFubm90YXRpb24sIGNoYW5nZXMsIHsKICAgICAgICAgICAgaW1hZ2UKICAgICAgICAgIH0pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuU0lHTkFUVVJFOgogICAgICAgICAgcHJvbWlzZXMucHVzaChTdGFtcEFubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzLCB7fSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGFubm90YXRpb25zOiBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcykKICAgIH07CiAgfQogIHN0YXRpYyBhc3luYyBwcmludE5ld0Fubm90YXRpb25zKGFubm90YXRpb25HbG9iYWxzLCBldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25zLCBpbWFnZVByb21pc2VzKSB7CiAgICBpZiAoIWFubm90YXRpb25zKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgewogICAgICBvcHRpb25zLAogICAgICB4cmVmCiAgICB9ID0gZXZhbHVhdG9yOwogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBpZiAoYW5ub3RhdGlvbi5kZWxldGVkKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgc3dpdGNoIChhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKSB7CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDoKICAgICAgICAgIHByb21pc2VzLnB1c2goRnJlZVRleHRBbm5vdGF0aW9uLmNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihhbm5vdGF0aW9uR2xvYmFscywgeHJlZiwgYW5ub3RhdGlvbiwgewogICAgICAgICAgICBldmFsdWF0b3IsCiAgICAgICAgICAgIHRhc2ssCiAgICAgICAgICAgIGV2YWx1YXRvck9wdGlvbnM6IG9wdGlvbnMKICAgICAgICAgIH0pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuSElHSExJR0hUOgogICAgICAgICAgaWYgKGFubm90YXRpb24ucXVhZFBvaW50cykgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKEhpZ2hsaWdodEFubm90YXRpb24uY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKGFubm90YXRpb25HbG9iYWxzLCB4cmVmLCBhbm5vdGF0aW9uLCB7CiAgICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKElua0Fubm90YXRpb24uY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKGFubm90YXRpb25HbG9iYWxzLCB4cmVmLCBhbm5vdGF0aW9uLCB7CiAgICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLklOSzoKICAgICAgICAgIHByb21pc2VzLnB1c2goSW5rQW5ub3RhdGlvbi5jcmVhdGVOZXdQcmludEFubm90YXRpb24oYW5ub3RhdGlvbkdsb2JhbHMsIHhyZWYsIGFubm90YXRpb24sIHsKICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUDoKICAgICAgICAgIGNvbnN0IGltYWdlID0gb3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA/IGF3YWl0IGltYWdlUHJvbWlzZXM/LmdldChhbm5vdGF0aW9uLmJpdG1hcElkKSA6IG51bGw7CiAgICAgICAgICBpZiAoaW1hZ2U/LmltYWdlU3RyZWFtKSB7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICBpbWFnZVN0cmVhbSwKICAgICAgICAgICAgICBzbWFza1N0cmVhbQogICAgICAgICAgICB9ID0gaW1hZ2U7CiAgICAgICAgICAgIGlmIChzbWFza1N0cmVhbSkgewogICAgICAgICAgICAgIGltYWdlU3RyZWFtLmRpY3Quc2V0KCJTTWFzayIsIHNtYXNrU3RyZWFtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbWFnZS5pbWFnZVJlZiA9IG5ldyBKcGVnU3RyZWFtKGltYWdlU3RyZWFtLCBpbWFnZVN0cmVhbS5sZW5ndGgpOwogICAgICAgICAgICBpbWFnZS5pbWFnZVN0cmVhbSA9IGltYWdlLnNtYXNrU3RyZWFtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHByb21pc2VzLnB1c2goU3RhbXBBbm5vdGF0aW9uLmNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihhbm5vdGF0aW9uR2xvYmFscywgeHJlZiwgYW5ub3RhdGlvbiwgewogICAgICAgICAgICBpbWFnZSwKICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5TSUdOQVRVUkU6CiAgICAgICAgICBwcm9taXNlcy5wdXNoKFN0YW1wQW5ub3RhdGlvbi5jcmVhdGVOZXdQcmludEFubm90YXRpb24oYW5ub3RhdGlvbkdsb2JhbHMsIHhyZWYsIGFubm90YXRpb24sIHsKICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQp9CmZ1bmN0aW9uIGdldFJnYkNvbG9yKGNvbG9yLCBkZWZhdWx0Q29sb3IgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMykpIHsKICBpZiAoIUFycmF5LmlzQXJyYXkoY29sb3IpKSB7CiAgICByZXR1cm4gZGVmYXVsdENvbG9yOwogIH0KICBjb25zdCByZ2JDb2xvciA9IGRlZmF1bHRDb2xvciB8fCBuZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7CiAgc3dpdGNoIChjb2xvci5sZW5ndGgpIHsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIG51bGw7CiAgICBjYXNlIDE6CiAgICAgIENvbG9yU3BhY2VVdGlscy5ncmF5LmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTsKICAgICAgcmV0dXJuIHJnYkNvbG9yOwogICAgY2FzZSAzOgogICAgICBDb2xvclNwYWNlVXRpbHMucmdiLmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTsKICAgICAgcmV0dXJuIHJnYkNvbG9yOwogICAgY2FzZSA0OgogICAgICBDb2xvclNwYWNlVXRpbHMuY215ay5nZXRSZ2JJdGVtKGNvbG9yLCAwLCByZ2JDb2xvciwgMCk7CiAgICAgIHJldHVybiByZ2JDb2xvcjsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBkZWZhdWx0Q29sb3I7CiAgfQp9CmZ1bmN0aW9uIGdldFBkZkNvbG9yQXJyYXkoY29sb3IpIHsKICByZXR1cm4gQXJyYXkuZnJvbShjb2xvciwgYyA9PiBjIC8gMjU1KTsKfQpmdW5jdGlvbiBnZXRRdWFkUG9pbnRzKGRpY3QsIHJlY3QpIHsKICBjb25zdCBxdWFkUG9pbnRzID0gZGljdC5nZXRBcnJheSgiUXVhZFBvaW50cyIpOwogIGlmICghaXNOdW1iZXJBcnJheShxdWFkUG9pbnRzLCBudWxsKSB8fCBxdWFkUG9pbnRzLmxlbmd0aCA9PT0gMCB8fCBxdWFkUG9pbnRzLmxlbmd0aCAlIDggPiAwKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgbmV3UXVhZFBvaW50cyA9IG5ldyBGbG9hdDMyQXJyYXkocXVhZFBvaW50cy5sZW5ndGgpOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHF1YWRQb2ludHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gOCkgewogICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NF0gPSBxdWFkUG9pbnRzLnNsaWNlKGksIGkgKyA4KTsKICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbih4MSwgeDIsIHgzLCB4NCk7CiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeDEsIHgyLCB4MywgeDQpOwogICAgY29uc3QgbWluWSA9IE1hdGgubWluKHkxLCB5MiwgeTMsIHk0KTsKICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heCh5MSwgeTIsIHkzLCB5NCk7CiAgICBpZiAocmVjdCAhPT0gbnVsbCAmJiAobWluWCA8IHJlY3RbMF0gfHwgbWF4WCA+IHJlY3RbMl0gfHwgbWluWSA8IHJlY3RbMV0gfHwgbWF4WSA+IHJlY3RbM10pKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbmV3UXVhZFBvaW50cy5zZXQoW21pblgsIG1heFksIG1heFgsIG1heFksIG1pblgsIG1pblksIG1heFgsIG1pblldLCBpKTsKICB9CiAgcmV0dXJuIG5ld1F1YWRQb2ludHM7Cn0KZnVuY3Rpb24gZ2V0VHJhbnNmb3JtTWF0cml4KHJlY3QsIGJib3gsIG1hdHJpeCkgewogIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IFV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goYmJveCwgbWF0cml4KTsKICBpZiAobWluWCA9PT0gbWF4WCB8fCBtaW5ZID09PSBtYXhZKSB7CiAgICByZXR1cm4gWzEsIDAsIDAsIDEsIHJlY3RbMF0sIHJlY3RbMV1dOwogIH0KICBjb25zdCB4UmF0aW8gPSAocmVjdFsyXSAtIHJlY3RbMF0pIC8gKG1heFggLSBtaW5YKTsKICBjb25zdCB5UmF0aW8gPSAocmVjdFszXSAtIHJlY3RbMV0pIC8gKG1heFkgLSBtaW5ZKTsKICByZXR1cm4gW3hSYXRpbywgMCwgMCwgeVJhdGlvLCByZWN0WzBdIC0gbWluWCAqIHhSYXRpbywgcmVjdFsxXSAtIG1pblkgKiB5UmF0aW9dOwp9CmNsYXNzIEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmLAogICAgICBhbm5vdGF0aW9uR2xvYmFscywKICAgICAgcmVmLAogICAgICBvcnBoYW5GaWVsZHMKICAgIH0gPSBwYXJhbXM7CiAgICBjb25zdCBwYXJlbnRSZWYgPSBvcnBoYW5GaWVsZHM/LmdldChyZWYpOwogICAgaWYgKHBhcmVudFJlZikgewogICAgICBkaWN0LnNldCgiUGFyZW50IiwgcGFyZW50UmVmKTsKICAgIH0KICAgIHRoaXMuc2V0VGl0bGUoZGljdC5nZXQoIlQiKSk7CiAgICB0aGlzLnNldENvbnRlbnRzKGRpY3QuZ2V0KCJDb250ZW50cyIpKTsKICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShkaWN0LmdldCgiTSIpKTsKICAgIHRoaXMuc2V0RmxhZ3MoZGljdC5nZXQoIkYiKSk7CiAgICB0aGlzLnNldFJlY3RhbmdsZShkaWN0LmdldEFycmF5KCJSZWN0IikpOwogICAgdGhpcy5zZXRDb2xvcihkaWN0LmdldEFycmF5KCJDIikpOwogICAgdGhpcy5zZXRCb3JkZXJTdHlsZShkaWN0KTsKICAgIHRoaXMuc2V0QXBwZWFyYW5jZShkaWN0KTsKICAgIHRoaXMuc2V0T3B0aW9uYWxDb250ZW50KGRpY3QpOwogICAgY29uc3QgTUsgPSBkaWN0LmdldCgiTUsiKTsKICAgIHRoaXMuc2V0Qm9yZGVyQW5kQmFja2dyb3VuZENvbG9ycyhNSyk7CiAgICB0aGlzLnNldFJvdGF0aW9uKE1LLCBkaWN0KTsKICAgIHRoaXMucmVmID0gcGFyYW1zLnJlZiBpbnN0YW5jZW9mIFJlZiA/IHBhcmFtcy5yZWYgOiBudWxsOwogICAgdGhpcy5fc3RyZWFtcyA9IFtdOwogICAgaWYgKHRoaXMuYXBwZWFyYW5jZSkgewogICAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5hcHBlYXJhbmNlKTsKICAgIH0KICAgIGNvbnN0IGlzTG9ja2VkID0gISEodGhpcy5mbGFncyAmIEFubm90YXRpb25GbGFnLkxPQ0tFRCk7CiAgICBjb25zdCBpc0NvbnRlbnRMb2NrZWQgPSAhISh0aGlzLmZsYWdzICYgQW5ub3RhdGlvbkZsYWcuTE9DS0VEQ09OVEVOVFMpOwogICAgdGhpcy5kYXRhID0gewogICAgICBhbm5vdGF0aW9uRmxhZ3M6IHRoaXMuZmxhZ3MsCiAgICAgIGJvcmRlclN0eWxlOiB0aGlzLmJvcmRlclN0eWxlLAogICAgICBjb2xvcjogdGhpcy5jb2xvciwKICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2tncm91bmRDb2xvciwKICAgICAgYm9yZGVyQ29sb3I6IHRoaXMuYm9yZGVyQ29sb3IsCiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLAogICAgICBjb250ZW50c09iajogdGhpcy5fY29udGVudHMsCiAgICAgIGhhc0FwcGVhcmFuY2U6ICEhdGhpcy5hcHBlYXJhbmNlLAogICAgICBpZDogcGFyYW1zLmlkLAogICAgICBtb2RpZmljYXRpb25EYXRlOiB0aGlzLm1vZGlmaWNhdGlvbkRhdGUsCiAgICAgIHJlY3Q6IHRoaXMucmVjdGFuZ2xlLAogICAgICBzdWJ0eXBlOiBwYXJhbXMuc3VidHlwZSwKICAgICAgaGFzT3duQ2FudmFzOiBmYWxzZSwKICAgICAgbm9Sb3RhdGU6ICEhKHRoaXMuZmxhZ3MgJiBBbm5vdGF0aW9uRmxhZy5OT1JPVEFURSksCiAgICAgIG5vSFRNTDogaXNMb2NrZWQgJiYgaXNDb250ZW50TG9ja2VkLAogICAgICBpc0VkaXRhYmxlOiBmYWxzZSwKICAgICAgc3RydWN0UGFyZW50OiAtMQogICAgfTsKICAgIGlmIChhbm5vdGF0aW9uR2xvYmFscy5zdHJ1Y3RUcmVlUm9vdCkgewogICAgICBsZXQgc3RydWN0UGFyZW50ID0gZGljdC5nZXQoIlN0cnVjdFBhcmVudCIpOwogICAgICB0aGlzLmRhdGEuc3RydWN0UGFyZW50ID0gc3RydWN0UGFyZW50ID0gTnVtYmVyLmlzSW50ZWdlcihzdHJ1Y3RQYXJlbnQpICYmIHN0cnVjdFBhcmVudCA+PSAwID8gc3RydWN0UGFyZW50IDogLTE7CiAgICAgIGFubm90YXRpb25HbG9iYWxzLnN0cnVjdFRyZWVSb290LmFkZEFubm90YXRpb25JZFRvUGFnZShwYXJhbXMucGFnZVJlZiwgc3RydWN0UGFyZW50KTsKICAgIH0KICAgIGlmIChwYXJhbXMuY29sbGVjdEZpZWxkcykgewogICAgICBjb25zdCBraWRzID0gZGljdC5nZXQoIktpZHMiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgICBjb25zdCBraWRJZHMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGtpZCBvZiBraWRzKSB7CiAgICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIGtpZElkcy5wdXNoKGtpZC50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGtpZElkcy5sZW5ndGggIT09IDApIHsKICAgICAgICAgIHRoaXMuZGF0YS5raWRJZHMgPSBraWRJZHM7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuZGF0YS5hY3Rpb25zID0gY29sbGVjdEFjdGlvbnMoeHJlZiwgZGljdCwgQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZSk7CiAgICAgIHRoaXMuZGF0YS5maWVsZE5hbWUgPSB0aGlzLl9jb25zdHJ1Y3RGaWVsZE5hbWUoZGljdCk7CiAgICAgIHRoaXMuZGF0YS5wYWdlSW5kZXggPSBwYXJhbXMucGFnZUluZGV4OwogICAgfQogICAgY29uc3QgaXQgPSBkaWN0LmdldCgiSVQiKTsKICAgIGlmIChpdCBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgdGhpcy5kYXRhLml0ID0gaXQubmFtZTsKICAgIH0KICAgIHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gcGFyYW1zLmV2YWx1YXRvck9wdGlvbnMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ7CiAgICB0aGlzLl9mYWxsYmFja0ZvbnREaWN0ID0gbnVsbDsKICAgIHRoaXMuX25lZWRBcHBlYXJhbmNlcyA9IGZhbHNlOwogIH0KICBfaGFzRmxhZyhmbGFncywgZmxhZykgewogICAgcmV0dXJuICEhKGZsYWdzICYgZmxhZyk7CiAgfQogIF9idWlsZEZsYWdzKG5vVmlldywgbm9QcmludCkgewogICAgbGV0IHsKICAgICAgZmxhZ3MKICAgIH0gPSB0aGlzOwogICAgaWYgKG5vVmlldyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmIChub1ByaW50ID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICB9CiAgICAgIGlmIChub1ByaW50KSB7CiAgICAgICAgcmV0dXJuIGZsYWdzICYgfkFubm90YXRpb25GbGFnLlBSSU5UOwogICAgICB9CiAgICAgIHJldHVybiBmbGFncyAmIH5Bbm5vdGF0aW9uRmxhZy5ISURERU4gfCBBbm5vdGF0aW9uRmxhZy5QUklOVDsKICAgIH0KICAgIGlmIChub1ZpZXcpIHsKICAgICAgZmxhZ3MgfD0gQW5ub3RhdGlvbkZsYWcuUFJJTlQ7CiAgICAgIGlmIChub1ByaW50KSB7CiAgICAgICAgcmV0dXJuIGZsYWdzICYgfkFubm90YXRpb25GbGFnLk5PVklFVyB8IEFubm90YXRpb25GbGFnLkhJRERFTjsKICAgICAgfQogICAgICByZXR1cm4gZmxhZ3MgJiB+QW5ub3RhdGlvbkZsYWcuSElEREVOIHwgQW5ub3RhdGlvbkZsYWcuTk9WSUVXOwogICAgfQogICAgZmxhZ3MgJj0gfihBbm5vdGF0aW9uRmxhZy5ISURERU4gfCBBbm5vdGF0aW9uRmxhZy5OT1ZJRVcpOwogICAgaWYgKG5vUHJpbnQpIHsKICAgICAgcmV0dXJuIGZsYWdzICYgfkFubm90YXRpb25GbGFnLlBSSU5UOwogICAgfQogICAgcmV0dXJuIGZsYWdzIHwgQW5ub3RhdGlvbkZsYWcuUFJJTlQ7CiAgfQogIF9pc1ZpZXdhYmxlKGZsYWdzKSB7CiAgICByZXR1cm4gIXRoaXMuX2hhc0ZsYWcoZmxhZ3MsIEFubm90YXRpb25GbGFnLklOVklTSUJMRSkgJiYgIXRoaXMuX2hhc0ZsYWcoZmxhZ3MsIEFubm90YXRpb25GbGFnLk5PVklFVyk7CiAgfQogIF9pc1ByaW50YWJsZShmbGFncykgewogICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcoZmxhZ3MsIEFubm90YXRpb25GbGFnLlBSSU5UKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuSElEREVOKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuSU5WSVNJQkxFKTsKICB9CiAgbXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlLCBfcmVuZGVyRm9ybXMpIHsKICAgIGNvbnN0IG5vVmlldyA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ubm9WaWV3OwogICAgaWYgKG5vVmlldyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiAhbm9WaWV3OwogICAgfQogICAgcmV0dXJuIHRoaXMudmlld2FibGUgJiYgIXRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgQW5ub3RhdGlvbkZsYWcuSElEREVOKTsKICB9CiAgbXVzdEJlUHJpbnRlZChhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgY29uc3Qgbm9QcmludCA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ubm9QcmludDsKICAgIGlmIChub1ByaW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuICFub1ByaW50OwogICAgfQogICAgcmV0dXJuIHRoaXMucHJpbnRhYmxlOwogIH0KICBtdXN0QmVWaWV3ZWRXaGVuRWRpdGluZyhpc0VkaXRpbmcsIG1vZGlmaWVkSWRzID0gbnVsbCkgewogICAgcmV0dXJuIGlzRWRpdGluZyA/ICF0aGlzLmRhdGEuaXNFZGl0YWJsZSA6ICFtb2RpZmllZElkcz8uaGFzKHRoaXMuZGF0YS5pZCk7CiAgfQogIGdldCB2aWV3YWJsZSgpIHsKICAgIGlmICh0aGlzLmRhdGEucXVhZFBvaW50cyA9PT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy5mbGFncyA9PT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9pc1ZpZXdhYmxlKHRoaXMuZmxhZ3MpOwogIH0KICBnZXQgcHJpbnRhYmxlKCkgewogICAgaWYgKHRoaXMuZGF0YS5xdWFkUG9pbnRzID09PSBudWxsKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLmZsYWdzID09PSAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9pc1ByaW50YWJsZSh0aGlzLmZsYWdzKTsKICB9CiAgX3BhcnNlU3RyaW5nSGVscGVyKGRhdGEpIHsKICAgIGNvbnN0IHN0ciA9IHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiA/IHN0cmluZ1RvUERGU3RyaW5nKGRhdGEpIDogIiI7CiAgICBjb25zdCBkaXIgPSBzdHIgJiYgYmlkaShzdHIpLmRpciA9PT0gInJ0bCIgPyAicnRsIiA6ICJsdHIiOwogICAgcmV0dXJuIHsKICAgICAgc3RyLAogICAgICBkaXIKICAgIH07CiAgfQogIHNldERlZmF1bHRBcHBlYXJhbmNlKHBhcmFtcykgewogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICBhbm5vdGF0aW9uR2xvYmFscwogICAgfSA9IHBhcmFtczsKICAgIGNvbnN0IGRlZmF1bHRBcHBlYXJhbmNlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkRBIgogICAgfSkgfHwgYW5ub3RhdGlvbkdsb2JhbHMuYWNyb0Zvcm0uZ2V0KCJEQSIpOwogICAgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UgPSB0eXBlb2YgZGVmYXVsdEFwcGVhcmFuY2UgPT09ICJzdHJpbmciID8gZGVmYXVsdEFwcGVhcmFuY2UgOiAiIjsKICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEgPSBwYXJzZURlZmF1bHRBcHBlYXJhbmNlKHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlKTsKICB9CiAgc2V0VGl0bGUodGl0bGUpIHsKICAgIHRoaXMuX3RpdGxlID0gdGhpcy5fcGFyc2VTdHJpbmdIZWxwZXIodGl0bGUpOwogIH0KICBzZXRDb250ZW50cyhjb250ZW50cykgewogICAgdGhpcy5fY29udGVudHMgPSB0aGlzLl9wYXJzZVN0cmluZ0hlbHBlcihjb250ZW50cyk7CiAgfQogIHNldE1vZGlmaWNhdGlvbkRhdGUobW9kaWZpY2F0aW9uRGF0ZSkgewogICAgdGhpcy5tb2RpZmljYXRpb25EYXRlID0gdHlwZW9mIG1vZGlmaWNhdGlvbkRhdGUgPT09ICJzdHJpbmciID8gbW9kaWZpY2F0aW9uRGF0ZSA6IG51bGw7CiAgfQogIHNldEZsYWdzKGZsYWdzKSB7CiAgICB0aGlzLmZsYWdzID0gTnVtYmVyLmlzSW50ZWdlcihmbGFncykgJiYgZmxhZ3MgPiAwID8gZmxhZ3MgOiAwOwogICAgaWYgKHRoaXMuZmxhZ3MgJiBBbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUgJiYgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAiQW5ub3RhdGlvbiIpIHsKICAgICAgdGhpcy5mbGFncyBePSBBbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEU7CiAgICB9CiAgfQogIGhhc0ZsYWcoZmxhZykgewogICAgcmV0dXJuIHRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgZmxhZyk7CiAgfQogIHNldFJlY3RhbmdsZShyZWN0YW5nbGUpIHsKICAgIHRoaXMucmVjdGFuZ2xlID0gbG9va3VwTm9ybWFsUmVjdChyZWN0YW5nbGUsIFswLCAwLCAwLCAwXSk7CiAgfQogIHNldENvbG9yKGNvbG9yKSB7CiAgICB0aGlzLmNvbG9yID0gZ2V0UmdiQ29sb3IoY29sb3IpOwogIH0KICBzZXRMaW5lRW5kaW5ncyhsaW5lRW5kaW5ncykgewogICAgdGhpcy5saW5lRW5kaW5ncyA9IFsiTm9uZSIsICJOb25lIl07CiAgICBpZiAoQXJyYXkuaXNBcnJheShsaW5lRW5kaW5ncykgJiYgbGluZUVuZGluZ3MubGVuZ3RoID09PSAyKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgY29uc3Qgb2JqID0gbGluZUVuZGluZ3NbaV07CiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiTm9uZSI6CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNhc2UgIlNxdWFyZSI6CiAgICAgICAgICAgIGNhc2UgIkNpcmNsZSI6CiAgICAgICAgICAgIGNhc2UgIkRpYW1vbmQiOgogICAgICAgICAgICBjYXNlICJPcGVuQXJyb3ciOgogICAgICAgICAgICBjYXNlICJDbG9zZWRBcnJvdyI6CiAgICAgICAgICAgIGNhc2UgIkJ1dHQiOgogICAgICAgICAgICBjYXNlICJST3BlbkFycm93IjoKICAgICAgICAgICAgY2FzZSAiUkNsb3NlZEFycm93IjoKICAgICAgICAgICAgY2FzZSAiU2xhc2giOgogICAgICAgICAgICAgIHRoaXMubGluZUVuZGluZ3NbaV0gPSBvYmoubmFtZTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgd2FybihgSWdub3JpbmcgaW52YWxpZCBsaW5lRW5kaW5nOiAke29ian1gKTsKICAgICAgfQogICAgfQogIH0KICBzZXRSb3RhdGlvbihtaywgZGljdCkgewogICAgdGhpcy5yb3RhdGlvbiA9IDA7CiAgICBsZXQgYW5nbGUgPSBtayBpbnN0YW5jZW9mIERpY3QgPyBtay5nZXQoIlIiKSB8fCAwIDogZGljdC5nZXQoIlJvdGF0ZSIpIHx8IDA7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihhbmdsZSkgJiYgYW5nbGUgIT09IDApIHsKICAgICAgYW5nbGUgJT0gMzYwOwogICAgICBpZiAoYW5nbGUgPCAwKSB7CiAgICAgICAgYW5nbGUgKz0gMzYwOwogICAgICB9CiAgICAgIGlmIChhbmdsZSAlIDkwID09PSAwKSB7CiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IGFuZ2xlOwogICAgICB9CiAgICB9CiAgfQogIHNldEJvcmRlckFuZEJhY2tncm91bmRDb2xvcnMobWspIHsKICAgIGlmIChtayBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgdGhpcy5ib3JkZXJDb2xvciA9IGdldFJnYkNvbG9yKG1rLmdldEFycmF5KCJCQyIpLCBudWxsKTsKICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBnZXRSZ2JDb2xvcihtay5nZXRBcnJheSgiQkciKSwgbnVsbCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmJvcmRlckNvbG9yID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwogICAgfQogIH0KICBzZXRCb3JkZXJTdHlsZShib3JkZXJTdHlsZSkgewogICAgdGhpcy5ib3JkZXJTdHlsZSA9IG5ldyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUoKTsKICAgIGlmICghKGJvcmRlclN0eWxlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGJvcmRlclN0eWxlLmhhcygiQlMiKSkgewogICAgICBjb25zdCBkaWN0ID0gYm9yZGVyU3R5bGUuZ2V0KCJCUyIpOwogICAgICBpZiAoZGljdCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjb25zdCBkaWN0VHlwZSA9IGRpY3QuZ2V0KCJUeXBlIik7CiAgICAgICAgaWYgKCFkaWN0VHlwZSB8fCBpc05hbWUoZGljdFR5cGUsICJCb3JkZXIiKSkgewogICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRXaWR0aChkaWN0LmdldCgiVyIpLCB0aGlzLnJlY3RhbmdsZSk7CiAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFN0eWxlKGRpY3QuZ2V0KCJTIikpOwogICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoZGljdC5nZXRBcnJheSgiRCIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYm9yZGVyU3R5bGUuaGFzKCJCb3JkZXIiKSkgewogICAgICBjb25zdCBhcnJheSA9IGJvcmRlclN0eWxlLmdldEFycmF5KCJCb3JkZXIiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5Lmxlbmd0aCA+PSAzKSB7CiAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKGFycmF5WzBdKTsKICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKGFycmF5WzFdKTsKICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKGFycmF5WzJdLCB0aGlzLnJlY3RhbmdsZSk7CiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gNCkgewogICAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoYXJyYXlbM10sIHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXRXaWR0aCgwKTsKICAgIH0KICB9CiAgc2V0QXBwZWFyYW5jZShkaWN0KSB7CiAgICB0aGlzLmFwcGVhcmFuY2UgPSBudWxsOwogICAgY29uc3QgYXBwZWFyYW5jZVN0YXRlcyA9IGRpY3QuZ2V0KCJBUCIpOwogICAgaWYgKCEoYXBwZWFyYW5jZVN0YXRlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSA9IGFwcGVhcmFuY2VTdGF0ZXMuZ2V0KCJOIik7CiAgICBpZiAobm9ybWFsQXBwZWFyYW5jZVN0YXRlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICB0aGlzLmFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghKG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFzID0gZGljdC5nZXQoIkFTIik7CiAgICBpZiAoIShhcyBpbnN0YW5jZW9mIE5hbWUpIHx8ICFub3JtYWxBcHBlYXJhbmNlU3RhdGUuaGFzKGFzLm5hbWUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGUuZ2V0KGFzLm5hbWUpOwogICAgaWYgKGFwcGVhcmFuY2UgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IGFwcGVhcmFuY2U7CiAgICB9CiAgfQogIHNldE9wdGlvbmFsQ29udGVudChkaWN0KSB7CiAgICB0aGlzLm9jID0gbnVsbDsKICAgIGNvbnN0IG9jID0gZGljdC5nZXQoIk9DIik7CiAgICBpZiAob2MgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHdhcm4oInNldE9wdGlvbmFsQ29udGVudDogU3VwcG9ydCBmb3IgL05hbWUtZW50cnkgaXMgbm90IGltcGxlbWVudGVkLiIpOwogICAgfSBlbHNlIGlmIChvYyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgdGhpcy5vYyA9IG9jOwogICAgfQogIH0KICBsb2FkUmVzb3VyY2VzKGtleXMsIGFwcGVhcmFuY2UpIHsKICAgIHJldHVybiBhcHBlYXJhbmNlLmRpY3QuZ2V0QXN5bmMoIlJlc291cmNlcyIpLnRoZW4ocmVzb3VyY2VzID0+IHsKICAgICAgaWYgKCFyZXNvdXJjZXMpIHsKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICB9CiAgICAgIGNvbnN0IG9iamVjdExvYWRlciA9IG5ldyBPYmplY3RMb2FkZXIocmVzb3VyY2VzLCBrZXlzLCByZXNvdXJjZXMueHJlZik7CiAgICAgIHJldHVybiBvYmplY3RMb2FkZXIubG9hZCgpLnRoZW4oKCkgPT4gcmVzb3VyY2VzKTsKICAgIH0pOwogIH0KICBhc3luYyBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBjb25zdCB7CiAgICAgIGhhc093bkNhbnZhcywKICAgICAgaWQsCiAgICAgIHJlY3QKICAgIH0gPSB0aGlzLmRhdGE7CiAgICBsZXQgYXBwZWFyYW5jZSA9IHRoaXMuYXBwZWFyYW5jZTsKICAgIGNvbnN0IGlzVXNpbmdPd25DYW52YXMgPSAhIShoYXNPd25DYW52YXMgJiYgaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZKTsKICAgIGlmIChpc1VzaW5nT3duQ2FudmFzICYmICh0aGlzLndpZHRoID09PSAwIHx8IHRoaXMuaGVpZ2h0ID09PSAwKSkgewogICAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gZmFsc2U7CiAgICAgIHJldHVybiB7CiAgICAgICAgb3BMaXN0OiBuZXcgT3BlcmF0b3JMaXN0KCksCiAgICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgICBzZXBhcmF0ZUNhbnZhczogZmFsc2UKICAgICAgfTsKICAgIH0KICAgIGlmICghYXBwZWFyYW5jZSkgewogICAgICBpZiAoIWlzVXNpbmdPd25DYW52YXMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgb3BMaXN0OiBuZXcgT3BlcmF0b3JMaXN0KCksCiAgICAgICAgICBzZXBhcmF0ZUZvcm06IGZhbHNlLAogICAgICAgICAgc2VwYXJhdGVDYW52YXM6IGZhbHNlCiAgICAgICAgfTsKICAgICAgfQogICAgICBhcHBlYXJhbmNlID0gbmV3IFN0cmluZ1N0cmVhbSgiIik7CiAgICAgIGFwcGVhcmFuY2UuZGljdCA9IG5ldyBEaWN0KCk7CiAgICB9CiAgICBjb25zdCBhcHBlYXJhbmNlRGljdCA9IGFwcGVhcmFuY2UuZGljdDsKICAgIGNvbnN0IHJlc291cmNlcyA9IGF3YWl0IHRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsICJDb2xvclNwYWNlIiwgIlBhdHRlcm4iLCAiU2hhZGluZyIsICJYT2JqZWN0IiwgIkZvbnQiXSwgYXBwZWFyYW5jZSk7CiAgICBjb25zdCBiYm94ID0gbG9va3VwUmVjdChhcHBlYXJhbmNlRGljdC5nZXRBcnJheSgiQkJveCIpLCBbMCwgMCwgMSwgMV0pOwogICAgY29uc3QgbWF0cml4ID0gbG9va3VwTWF0cml4KGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgSURFTlRJVFlfTUFUUklYKTsKICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeChyZWN0LCBiYm94LCBtYXRyaXgpOwogICAgY29uc3Qgb3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpOwogICAgbGV0IG9wdGlvbmFsQ29udGVudDsKICAgIGlmICh0aGlzLm9jKSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGF3YWl0IGV2YWx1YXRvci5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyh0aGlzLm9jLCBudWxsKTsKICAgIH0KICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcExpc3QuYWRkT3AoT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLCBbIk9DIiwgb3B0aW9uYWxDb250ZW50XSk7CiAgICB9CiAgICBvcExpc3QuYWRkT3AoT1BTLmJlZ2luQW5ub3RhdGlvbiwgW2lkLCByZWN0LCB0cmFuc2Zvcm0sIG1hdHJpeCwgaXNVc2luZ093bkNhbnZhc10pOwogICAgYXdhaXQgZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgIHN0cmVhbTogYXBwZWFyYW5jZSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzLAogICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdCwKICAgICAgZmFsbGJhY2tGb250RGljdDogdGhpcy5fZmFsbGJhY2tGb250RGljdAogICAgfSk7CiAgICBvcExpc3QuYWRkT3AoT1BTLmVuZEFubm90YXRpb24sIFtdKTsKICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcExpc3QuYWRkT3AoT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTsKICAgIH0KICAgIHRoaXMucmVzZXQoKTsKICAgIHJldHVybiB7CiAgICAgIG9wTGlzdCwKICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgc2VwYXJhdGVDYW52YXM6IGlzVXNpbmdPd25DYW52YXMKICAgIH07CiAgfQogIGFzeW5jIHNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldCBoYXNUZXh0Q29udGVudCgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZXh0cmFjdFRleHRDb250ZW50KGV2YWx1YXRvciwgdGFzaywgdmlld0JveCkgewogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwgIkZvbnQiLCAiUHJvcGVydGllcyIsICJYT2JqZWN0Il0sIHRoaXMuYXBwZWFyYW5jZSk7CiAgICBjb25zdCB0ZXh0ID0gW107CiAgICBjb25zdCBidWZmZXIgPSBbXTsKICAgIGxldCBmaXJzdFBvc2l0aW9uID0gbnVsbDsKICAgIGNvbnN0IHNpbmsgPSB7CiAgICAgIGRlc2lyZWRTaXplOiBNYXRoLkluZmluaXR5LAogICAgICByZWFkeTogdHJ1ZSwKICAgICAgZW5xdWV1ZShjaHVuaywgc2l6ZSkgewogICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjaHVuay5pdGVtcykgewogICAgICAgICAgaWYgKGl0ZW0uc3RyID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBmaXJzdFBvc2l0aW9uIHx8PSBpdGVtLnRyYW5zZm9ybS5zbGljZSgtMik7CiAgICAgICAgICBidWZmZXIucHVzaChpdGVtLnN0cik7CiAgICAgICAgICBpZiAoaXRlbS5oYXNFT0wpIHsKICAgICAgICAgICAgdGV4dC5wdXNoKGJ1ZmZlci5qb2luKCIiKS50cmltRW5kKCkpOwogICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBhd2FpdCBldmFsdWF0b3IuZ2V0VGV4dENvbnRlbnQoewogICAgICBzdHJlYW06IHRoaXMuYXBwZWFyYW5jZSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzLAogICAgICBpbmNsdWRlTWFya2VkQ29udGVudDogdHJ1ZSwKICAgICAga2VlcFdoaXRlU3BhY2U6IHRydWUsCiAgICAgIHNpbmssCiAgICAgIHZpZXdCb3gKICAgIH0pOwogICAgdGhpcy5yZXNldCgpOwogICAgaWYgKGJ1ZmZlci5sZW5ndGgpIHsKICAgICAgdGV4dC5wdXNoKGJ1ZmZlci5qb2luKCIiKS50cmltRW5kKCkpOwogICAgfQogICAgaWYgKHRleHQubGVuZ3RoID4gMSB8fCB0ZXh0WzBdKSB7CiAgICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gdGhpcy5hcHBlYXJhbmNlLmRpY3Q7CiAgICAgIGNvbnN0IGJib3ggPSBsb29rdXBSZWN0KGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KCJCQm94IiksIG51bGwpOwogICAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoYXBwZWFyYW5jZURpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpLCBudWxsKTsKICAgICAgdGhpcy5kYXRhLnRleHRQb3NpdGlvbiA9IHRoaXMuX3RyYW5zZm9ybVBvaW50KGZpcnN0UG9zaXRpb24sIGJib3gsIG1hdHJpeCk7CiAgICAgIHRoaXMuZGF0YS50ZXh0Q29udGVudCA9IHRleHQ7CiAgICB9CiAgfQogIF90cmFuc2Zvcm1Qb2ludChjb29yZHMsIGJib3gsIG1hdHJpeCkgewogICAgY29uc3QgewogICAgICByZWN0CiAgICB9ID0gdGhpcy5kYXRhOwogICAgYmJveCB8fD0gWzAsIDAsIDEsIDFdOwogICAgbWF0cml4IHx8PSBbMSwgMCwgMCwgMSwgMCwgMF07CiAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1NYXRyaXgocmVjdCwgYmJveCwgbWF0cml4KTsKICAgIHRyYW5zZm9ybVs0XSAtPSByZWN0WzBdOwogICAgdHJhbnNmb3JtWzVdIC09IHJlY3RbMV07CiAgICBjb29yZHMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKGNvb3JkcywgdHJhbnNmb3JtKTsKICAgIHJldHVybiBVdGlsLmFwcGx5VHJhbnNmb3JtKGNvb3JkcywgbWF0cml4KTsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICBpZiAodGhpcy5kYXRhLmtpZElkcykgewogICAgICByZXR1cm4gewogICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsCiAgICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgICAgbmFtZTogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5kYXRhLmJvcmRlckNvbG9yLAogICAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgICB0eXBlOiAiIiwKICAgICAgICBraWRJZHM6IHRoaXMuZGF0YS5raWRJZHMsCiAgICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbgogICAgICB9OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHJlc2V0KCkgewogICAgZm9yIChjb25zdCBzdHJlYW0gb2YgdGhpcy5fc3RyZWFtcykgewogICAgICBzdHJlYW0ucmVzZXQoKTsKICAgIH0KICB9CiAgX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KSB7CiAgICBpZiAoIWRpY3QuaGFzKCJUIikgJiYgIWRpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICB3YXJuKCJVbmtub3duIGZpZWxkIG5hbWUsIGZhbGxpbmcgYmFjayB0byBlbXB0eSBmaWVsZCBuYW1lLiIpOwogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAoIWRpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZGljdC5nZXQoIlQiKSk7CiAgICB9CiAgICBjb25zdCBmaWVsZE5hbWUgPSBbXTsKICAgIGlmIChkaWN0LmhhcygiVCIpKSB7CiAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGRpY3QuZ2V0KCJUIikpKTsKICAgIH0KICAgIGxldCBsb29wRGljdCA9IGRpY3Q7CiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFJlZlNldCgpOwogICAgaWYgKGRpY3Qub2JqSWQpIHsKICAgICAgdmlzaXRlZC5wdXQoZGljdC5vYmpJZCk7CiAgICB9CiAgICB3aGlsZSAobG9vcERpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICBsb29wRGljdCA9IGxvb3BEaWN0LmdldCgiUGFyZW50Iik7CiAgICAgIGlmICghKGxvb3BEaWN0IGluc3RhbmNlb2YgRGljdCkgfHwgbG9vcERpY3Qub2JqSWQgJiYgdmlzaXRlZC5oYXMobG9vcERpY3Qub2JqSWQpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGxvb3BEaWN0Lm9iaklkKSB7CiAgICAgICAgdmlzaXRlZC5wdXQobG9vcERpY3Qub2JqSWQpOwogICAgICB9CiAgICAgIGlmIChsb29wRGljdC5oYXMoIlQiKSkgewogICAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGxvb3BEaWN0LmdldCgiVCIpKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmaWVsZE5hbWUuam9pbigiLiIpOwogIH0KICBnZXQgd2lkdGgoKSB7CiAgICByZXR1cm4gdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXTsKICB9CiAgZ2V0IGhlaWdodCgpIHsKICAgIHJldHVybiB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdOwogIH0KfQpjbGFzcyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy53aWR0aCA9IDE7CiAgICB0aGlzLnJhd1dpZHRoID0gMTsKICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOwogICAgdGhpcy5kYXNoQXJyYXkgPSBbM107CiAgICB0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXMgPSAwOwogICAgdGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cyA9IDA7CiAgfQogIHNldFdpZHRoKHdpZHRoLCByZWN0ID0gWzAsIDAsIDAsIDBdKSB7CiAgICBpZiAod2lkdGggaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHRoaXMud2lkdGggPSAwOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICBpZiAod2lkdGggPiAwKSB7CiAgICAgICAgdGhpcy5yYXdXaWR0aCA9IHdpZHRoOwogICAgICAgIGNvbnN0IG1heFdpZHRoID0gKHJlY3RbMl0gLSByZWN0WzBdKSAvIDI7CiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIDI7CiAgICAgICAgaWYgKG1heFdpZHRoID4gMCAmJiBtYXhIZWlnaHQgPiAwICYmICh3aWR0aCA+IG1heFdpZHRoIHx8IHdpZHRoID4gbWF4SGVpZ2h0KSkgewogICAgICAgICAgd2FybihgQW5ub3RhdGlvbkJvcmRlclN0eWxlLnNldFdpZHRoIC0gaWdub3Jpbmcgd2lkdGg6ICR7d2lkdGh9YCk7CiAgICAgICAgICB3aWR0aCA9IDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKICAgIH0KICB9CiAgc2V0U3R5bGUoc3R5bGUpIHsKICAgIGlmICghKHN0eWxlIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3dpdGNoIChzdHlsZS5uYW1lKSB7CiAgICAgIGNhc2UgIlMiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJEIjoKICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkIiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkkiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLklOU0VUOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJVIjoKICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHNldERhc2hBcnJheShkYXNoQXJyYXksIGZvcmNlU3R5bGUgPSBmYWxzZSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkoZGFzaEFycmF5KSkgewogICAgICBsZXQgaXNWYWxpZCA9IHRydWU7CiAgICAgIGxldCBhbGxaZXJvcyA9IHRydWU7CiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkYXNoQXJyYXkpIHsKICAgICAgICBjb25zdCB2YWxpZE51bWJlciA9ICtlbGVtZW50ID49IDA7CiAgICAgICAgaWYgKCF2YWxpZE51bWJlcikgewogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID4gMCkgewogICAgICAgICAgYWxsWmVyb3MgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRhc2hBcnJheS5sZW5ndGggPT09IDAgfHwgaXNWYWxpZCAmJiAhYWxsWmVyb3MpIHsKICAgICAgICB0aGlzLmRhc2hBcnJheSA9IGRhc2hBcnJheTsKICAgICAgICBpZiAoZm9yY2VTdHlsZSkgewogICAgICAgICAgdGhpcy5zZXRTdHlsZShOYW1lLmdldCgiRCIpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy53aWR0aCA9IDA7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGFzaEFycmF5KSB7CiAgICAgIHRoaXMud2lkdGggPSAwOwogICAgfQogIH0KICBzZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKHJhZGl1cykgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgewogICAgICB0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXMgPSByYWRpdXM7CiAgICB9CiAgfQogIHNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKHJhZGl1cykgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgewogICAgICB0aGlzLnZlcnRpY2FsQ29ybmVyUmFkaXVzID0gcmFkaXVzOwogICAgfQogIH0KfQpjbGFzcyBNYXJrdXBBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0CiAgICB9ID0gcGFyYW1zOwogICAgaWYgKGRpY3QuaGFzKCJJUlQiKSkgewogICAgICBjb25zdCByYXdJUlQgPSBkaWN0LmdldFJhdygiSVJUIik7CiAgICAgIHRoaXMuZGF0YS5pblJlcGx5VG8gPSByYXdJUlQgaW5zdGFuY2VvZiBSZWYgPyByYXdJUlQudG9TdHJpbmcoKSA6IG51bGw7CiAgICAgIGNvbnN0IHJ0ID0gZGljdC5nZXQoIlJUIik7CiAgICAgIHRoaXMuZGF0YS5yZXBseVR5cGUgPSBydCBpbnN0YW5jZW9mIE5hbWUgPyBydC5uYW1lIDogQW5ub3RhdGlvblJlcGx5VHlwZS5SRVBMWTsKICAgIH0KICAgIGxldCBwb3B1cFJlZiA9IG51bGw7CiAgICBpZiAodGhpcy5kYXRhLnJlcGx5VHlwZSA9PT0gQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCkgewogICAgICBjb25zdCBwYXJlbnQgPSBkaWN0LmdldCgiSVJUIik7CiAgICAgIHRoaXMuc2V0VGl0bGUocGFyZW50LmdldCgiVCIpKTsKICAgICAgdGhpcy5kYXRhLnRpdGxlT2JqID0gdGhpcy5fdGl0bGU7CiAgICAgIHRoaXMuc2V0Q29udGVudHMocGFyZW50LmdldCgiQ29udGVudHMiKSk7CiAgICAgIHRoaXMuZGF0YS5jb250ZW50c09iaiA9IHRoaXMuX2NvbnRlbnRzOwogICAgICBpZiAoIXBhcmVudC5oYXMoIkNyZWF0aW9uRGF0ZSIpKSB7CiAgICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUocGFyZW50LmdldCgiQ3JlYXRpb25EYXRlIikpOwogICAgICAgIHRoaXMuZGF0YS5jcmVhdGlvbkRhdGUgPSB0aGlzLmNyZWF0aW9uRGF0ZTsKICAgICAgfQogICAgICBpZiAoIXBhcmVudC5oYXMoIk0iKSkgewogICAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUocGFyZW50LmdldCgiTSIpKTsKICAgICAgICB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMubW9kaWZpY2F0aW9uRGF0ZTsKICAgICAgfQogICAgICBwb3B1cFJlZiA9IHBhcmVudC5nZXRSYXcoIlBvcHVwIik7CiAgICAgIGlmICghcGFyZW50LmhhcygiQyIpKSB7CiAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNldENvbG9yKHBhcmVudC5nZXRBcnJheSgiQyIpKTsKICAgICAgICB0aGlzLmRhdGEuY29sb3IgPSB0aGlzLmNvbG9yOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEudGl0bGVPYmogPSB0aGlzLl90aXRsZTsKICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUoZGljdC5nZXQoIkNyZWF0aW9uRGF0ZSIpKTsKICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IHRoaXMuY3JlYXRpb25EYXRlOwogICAgICBwb3B1cFJlZiA9IGRpY3QuZ2V0UmF3KCJQb3B1cCIpOwogICAgICBpZiAoIWRpY3QuaGFzKCJDIikpIHsKICAgICAgICB0aGlzLmRhdGEuY29sb3IgPSBudWxsOwogICAgICB9CiAgICB9CiAgICB0aGlzLmRhdGEucG9wdXBSZWYgPSBwb3B1cFJlZiBpbnN0YW5jZW9mIFJlZiA/IHBvcHVwUmVmLnRvU3RyaW5nKCkgOiBudWxsOwogICAgaWYgKGRpY3QuaGFzKCJSQyIpKSB7CiAgICAgIHRoaXMuZGF0YS5yaWNoVGV4dCA9IFhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwoZGljdC5nZXQoIlJDIikpOwogICAgfQogIH0KICBzZXRDcmVhdGlvbkRhdGUoY3JlYXRpb25EYXRlKSB7CiAgICB0aGlzLmNyZWF0aW9uRGF0ZSA9IHR5cGVvZiBjcmVhdGlvbkRhdGUgPT09ICJzdHJpbmciID8gY3JlYXRpb25EYXRlIDogbnVsbDsKICB9CiAgX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgIHhyZWYsCiAgICBleHRyYSwKICAgIHN0cm9rZUNvbG9yLAogICAgZmlsbENvbG9yLAogICAgYmxlbmRNb2RlLAogICAgc3Ryb2tlQWxwaGEsCiAgICBmaWxsQWxwaGEsCiAgICBwb2ludHNDYWxsYmFjawogIH0pIHsKICAgIGNvbnN0IGJib3ggPSB0aGlzLmRhdGEucmVjdCA9IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTsKICAgIGNvbnN0IGJ1ZmZlciA9IFsicSJdOwogICAgaWYgKGV4dHJhKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGV4dHJhKTsKICAgIH0KICAgIGlmIChzdHJva2VDb2xvcikgewogICAgICBidWZmZXIucHVzaChgJHtzdHJva2VDb2xvclswXX0gJHtzdHJva2VDb2xvclsxXX0gJHtzdHJva2VDb2xvclsyXX0gUkdgKTsKICAgIH0KICAgIGlmIChmaWxsQ29sb3IpIHsKICAgICAgYnVmZmVyLnB1c2goYCR7ZmlsbENvbG9yWzBdfSAke2ZpbGxDb2xvclsxXX0gJHtmaWxsQ29sb3JbMl19IHJnYCk7CiAgICB9CiAgICBjb25zdCBwb2ludHNBcnJheSA9IHRoaXMuZGF0YS5xdWFkUG9pbnRzIHx8IEZsb2F0MzJBcnJheS5mcm9tKFt0aGlzLnJlY3RhbmdsZVswXSwgdGhpcy5yZWN0YW5nbGVbM10sIHRoaXMucmVjdGFuZ2xlWzJdLCB0aGlzLnJlY3RhbmdsZVszXSwgdGhpcy5yZWN0YW5nbGVbMF0sIHRoaXMucmVjdGFuZ2xlWzFdLCB0aGlzLnJlY3RhbmdsZVsyXSwgdGhpcy5yZWN0YW5nbGVbMV1dKTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50c0FycmF5Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDgpIHsKICAgICAgY29uc3QgcG9pbnRzID0gcG9pbnRzQ2FsbGJhY2soYnVmZmVyLCBwb2ludHNBcnJheS5zdWJhcnJheShpLCBpICsgOCkpOwogICAgICBVdGlsLnJlY3RCb3VuZGluZ0JveCguLi5wb2ludHMsIGJib3gpOwogICAgfQogICAgYnVmZmVyLnB1c2goIlEiKTsKICAgIGNvbnN0IGZvcm1EaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShidWZmZXIuam9pbigiICIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW0uZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgZm9ybURpY3Quc2V0KCJGbTAiLCBhcHBlYXJhbmNlU3RyZWFtKTsKICAgIGNvbnN0IGdzRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgaWYgKGJsZW5kTW9kZSkgewogICAgICBnc0RpY3Quc2V0KCJCTSIsIE5hbWUuZ2V0KGJsZW5kTW9kZSkpOwogICAgfQogICAgaWYgKHR5cGVvZiBzdHJva2VBbHBoYSA9PT0gIm51bWJlciIpIHsKICAgICAgZ3NEaWN0LnNldCgiQ0EiLCBzdHJva2VBbHBoYSk7CiAgICB9CiAgICBpZiAodHlwZW9mIGZpbGxBbHBoYSA9PT0gIm51bWJlciIpIHsKICAgICAgZ3NEaWN0LnNldCgiY2EiLCBmaWxsQWxwaGEpOwogICAgfQogICAgY29uc3Qgc3RhdGVEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBzdGF0ZURpY3Quc2V0KCJHUzAiLCBnc0RpY3QpOwogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QoeHJlZik7CiAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBzdGF0ZURpY3QpOwogICAgcmVzb3VyY2VzLnNldCgiWE9iamVjdCIsIGZvcm1EaWN0KTsKICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICBhcHBlYXJhbmNlRGljdC5zZXQoIkJCb3giLCBiYm94KTsKICAgIHRoaXMuYXBwZWFyYW5jZSA9IG5ldyBTdHJpbmdTdHJlYW0oIi9HUzAgZ3MgL0ZtMCBEbyIpOwogICAgdGhpcy5hcHBlYXJhbmNlLmRpY3QgPSBhcHBlYXJhbmNlRGljdDsKICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmFwcGVhcmFuY2UsIGFwcGVhcmFuY2VTdHJlYW0pOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzLCBwYXJhbXMpIHsKICAgIGNvbnN0IGFubm90YXRpb25SZWYgPSBhbm5vdGF0aW9uLnJlZiB8fD0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgIGNvbnN0IGFwID0gYXdhaXQgdGhpcy5jcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcyk7CiAgICBsZXQgYW5ub3RhdGlvbkRpY3Q7CiAgICBpZiAoYXApIHsKICAgICAgY29uc3QgYXBSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICBhbm5vdGF0aW9uRGljdCA9IHRoaXMuY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7CiAgICAgICAgYXBSZWYKICAgICAgfSk7CiAgICAgIGNoYW5nZXMucHV0KGFwUmVmLCB7CiAgICAgICAgZGF0YTogYXAKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBhbm5vdGF0aW9uRGljdCA9IHRoaXMuY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7fSk7CiAgICB9CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihhbm5vdGF0aW9uLnBhcmVudFRyZWVJZCkpIHsKICAgICAgYW5ub3RhdGlvbkRpY3Quc2V0KCJTdHJ1Y3RQYXJlbnQiLCBhbm5vdGF0aW9uLnBhcmVudFRyZWVJZCk7CiAgICB9CiAgICBjaGFuZ2VzLnB1dChhbm5vdGF0aW9uUmVmLCB7CiAgICAgIGRhdGE6IGFubm90YXRpb25EaWN0CiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIHJlZjogYW5ub3RhdGlvblJlZgogICAgfTsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihhbm5vdGF0aW9uR2xvYmFscywgeHJlZiwgYW5ub3RhdGlvbiwgcGFyYW1zKSB7CiAgICBjb25zdCBhcCA9IGF3YWl0IHRoaXMuY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpOwogICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSB0aGlzLmNyZWF0ZU5ld0RpY3QoYW5ub3RhdGlvbiwgeHJlZiwgYXAgPyB7CiAgICAgIGFwCiAgICB9IDoge30pOwogICAgY29uc3QgbmV3QW5ub3RhdGlvbiA9IG5ldyB0aGlzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcih7CiAgICAgIGRpY3Q6IGFubm90YXRpb25EaWN0LAogICAgICB4cmVmLAogICAgICBhbm5vdGF0aW9uR2xvYmFscywKICAgICAgZXZhbHVhdG9yT3B0aW9uczogcGFyYW1zLmV2YWx1YXRvck9wdGlvbnMKICAgIH0pOwogICAgaWYgKGFubm90YXRpb24ucmVmKSB7CiAgICAgIG5ld0Fubm90YXRpb24ucmVmID0gbmV3QW5ub3RhdGlvbi5yZWZUb1JlcGxhY2UgPSBhbm5vdGF0aW9uLnJlZjsKICAgIH0KICAgIHJldHVybiBuZXdBbm5vdGF0aW9uOwogIH0KfQpjbGFzcyBXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmLAogICAgICBhbm5vdGF0aW9uR2xvYmFscwogICAgfSA9IHBhcmFtczsKICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CiAgICB0aGlzLl9uZWVkQXBwZWFyYW5jZXMgPSBwYXJhbXMubmVlZEFwcGVhcmFuY2VzOwogICAgZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLldJREdFVDsKICAgIGlmIChkYXRhLmZpZWxkTmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGRhdGEuZmllbGROYW1lID0gdGhpcy5fY29uc3RydWN0RmllbGROYW1lKGRpY3QpOwogICAgfQogICAgaWYgKGRhdGEuYWN0aW9ucyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGRhdGEuYWN0aW9ucyA9IGNvbGxlY3RBY3Rpb25zKHhyZWYsIGRpY3QsIEFubm90YXRpb25BY3Rpb25FdmVudFR5cGUpOwogICAgfQogICAgbGV0IGZpZWxkVmFsdWUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiViIsCiAgICAgIGdldEFycmF5OiB0cnVlCiAgICB9KTsKICAgIGRhdGEuZmllbGRWYWx1ZSA9IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShmaWVsZFZhbHVlKTsKICAgIGNvbnN0IGRlZmF1bHRGaWVsZFZhbHVlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkRWIiwKICAgICAgZ2V0QXJyYXk6IHRydWUKICAgIH0pOwogICAgZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSA9IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShkZWZhdWx0RmllbGRWYWx1ZSk7CiAgICBpZiAoZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25HbG9iYWxzLnhmYURhdGFzZXRzKSB7CiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLl90aXRsZS5zdHI7CiAgICAgIGlmIChwYXRoKSB7CiAgICAgICAgdGhpcy5faGFzVmFsdWVGcm9tWEZBID0gdHJ1ZTsKICAgICAgICBkYXRhLmZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlID0gYW5ub3RhdGlvbkdsb2JhbHMueGZhRGF0YXNldHMuZ2V0VmFsdWUocGF0aCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChmaWVsZFZhbHVlID09PSB1bmRlZmluZWQgJiYgZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSAhPT0gbnVsbCkgewogICAgICBkYXRhLmZpZWxkVmFsdWUgPSBkYXRhLmRlZmF1bHRGaWVsZFZhbHVlOwogICAgfQogICAgZGF0YS5hbHRlcm5hdGl2ZVRleHQgPSBzdHJpbmdUb1BERlN0cmluZyhkaWN0LmdldCgiVFUiKSB8fCAiIik7CiAgICB0aGlzLnNldERlZmF1bHRBcHBlYXJhbmNlKHBhcmFtcyk7CiAgICBkYXRhLmhhc0FwcGVhcmFuY2UgfHw9IHRoaXMuX25lZWRBcHBlYXJhbmNlcyAmJiBkYXRhLmZpZWxkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBkYXRhLmZpZWxkVmFsdWUgIT09IG51bGw7CiAgICBjb25zdCBmaWVsZFR5cGUgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiRlQiCiAgICB9KTsKICAgIGRhdGEuZmllbGRUeXBlID0gZmllbGRUeXBlIGluc3RhbmNlb2YgTmFtZSA/IGZpZWxkVHlwZS5uYW1lIDogbnVsbDsKICAgIGNvbnN0IGxvY2FsUmVzb3VyY2VzID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkRSIgogICAgfSk7CiAgICBjb25zdCBhY3JvRm9ybVJlc291cmNlcyA9IGFubm90YXRpb25HbG9iYWxzLmFjcm9Gb3JtLmdldCgiRFIiKTsKICAgIGNvbnN0IGFwcGVhcmFuY2VSZXNvdXJjZXMgPSB0aGlzLmFwcGVhcmFuY2U/LmRpY3QuZ2V0KCJSZXNvdXJjZXMiKTsKICAgIHRoaXMuX2ZpZWxkUmVzb3VyY2VzID0gewogICAgICBsb2NhbFJlc291cmNlcywKICAgICAgYWNyb0Zvcm1SZXNvdXJjZXMsCiAgICAgIGFwcGVhcmFuY2VSZXNvdXJjZXMsCiAgICAgIG1lcmdlZFJlc291cmNlczogRGljdC5tZXJnZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBkaWN0QXJyYXk6IFtsb2NhbFJlc291cmNlcywgYXBwZWFyYW5jZVJlc291cmNlcywgYWNyb0Zvcm1SZXNvdXJjZXNdLAogICAgICAgIG1lcmdlU3ViRGljdHM6IHRydWUKICAgICAgfSkKICAgIH07CiAgICBkYXRhLmZpZWxkRmxhZ3MgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiRmYiCiAgICB9KTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihkYXRhLmZpZWxkRmxhZ3MpIHx8IGRhdGEuZmllbGRGbGFncyA8IDApIHsKICAgICAgZGF0YS5maWVsZEZsYWdzID0gMDsKICAgIH0KICAgIGRhdGEucGFzc3dvcmQgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKTsKICAgIGRhdGEucmVhZE9ubHkgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJFQURPTkxZKTsKICAgIGRhdGEucmVxdWlyZWQgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJFUVVJUkVEKTsKICAgIGRhdGEuaGlkZGVuID0gdGhpcy5faGFzRmxhZyhkYXRhLmFubm90YXRpb25GbGFncywgQW5ub3RhdGlvbkZsYWcuSElEREVOKSB8fCB0aGlzLl9oYXNGbGFnKGRhdGEuYW5ub3RhdGlvbkZsYWdzLCBBbm5vdGF0aW9uRmxhZy5OT1ZJRVcpOwogIH0KICBfZGVjb2RlRm9ybVZhbHVlKGZvcm1WYWx1ZSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlKSkgewogICAgICByZXR1cm4gZm9ybVZhbHVlLmZpbHRlcihpdGVtID0+IHR5cGVvZiBpdGVtID09PSAic3RyaW5nIikubWFwKGl0ZW0gPT4gc3RyaW5nVG9QREZTdHJpbmcoaXRlbSkpOwogICAgfSBlbHNlIGlmIChmb3JtVmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHJldHVybiBzdHJpbmdUb1BERlN0cmluZyhmb3JtVmFsdWUubmFtZSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmb3JtVmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgIHJldHVybiBzdHJpbmdUb1BERlN0cmluZyhmb3JtVmFsdWUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGhhc0ZpZWxkRmxhZyhmbGFnKSB7CiAgICByZXR1cm4gISEodGhpcy5kYXRhLmZpZWxkRmxhZ3MgJiBmbGFnKTsKICB9CiAgX2lzVmlld2FibGUoZmxhZ3MpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBtdXN0QmVWaWV3ZWQoYW5ub3RhdGlvblN0b3JhZ2UsIHJlbmRlckZvcm1zKSB7CiAgICBpZiAocmVuZGVyRm9ybXMpIHsKICAgICAgcmV0dXJuIHRoaXMudmlld2FibGU7CiAgICB9CiAgICByZXR1cm4gc3VwZXIubXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlLCByZW5kZXJGb3JtcykgJiYgIXRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgQW5ub3RhdGlvbkZsYWcuTk9WSUVXKTsKICB9CiAgZ2V0Um90YXRpb25NYXRyaXgoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGxldCByb3RhdGlvbiA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ucm90YXRpb247CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICByb3RhdGlvbiA9IHRoaXMucm90YXRpb247CiAgICB9CiAgICByZXR1cm4gcm90YXRpb24gPT09IDAgPyBJREVOVElUWV9NQVRSSVggOiBnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbiwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpOwogIH0KICBnZXRCb3JkZXJBbmRCYWNrZ3JvdW5kQXBwZWFyYW5jZXMoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGxldCByb3RhdGlvbiA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8ucm90YXRpb247CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICByb3RhdGlvbiA9IHRoaXMucm90YXRpb247CiAgICB9CiAgICBpZiAoIXRoaXMuYmFja2dyb3VuZENvbG9yICYmICF0aGlzLmJvcmRlckNvbG9yKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGNvbnN0IHJlY3QgPSByb3RhdGlvbiA9PT0gMCB8fCByb3RhdGlvbiA9PT0gMTgwID8gYDAgMCAke3RoaXMud2lkdGh9ICR7dGhpcy5oZWlnaHR9IHJlYCA6IGAwIDAgJHt0aGlzLmhlaWdodH0gJHt0aGlzLndpZHRofSByZWA7CiAgICBsZXQgc3RyID0gIiI7CiAgICBpZiAodGhpcy5iYWNrZ3JvdW5kQ29sb3IpIHsKICAgICAgc3RyID0gYCR7Z2V0UGRmQ29sb3IodGhpcy5iYWNrZ3JvdW5kQ29sb3IsIHRydWUpfSAke3JlY3R9IGYgYDsKICAgIH0KICAgIGlmICh0aGlzLmJvcmRlckNvbG9yKSB7CiAgICAgIGNvbnN0IGJvcmRlcldpZHRoID0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aCB8fCAxOwogICAgICBzdHIgKz0gYCR7Ym9yZGVyV2lkdGh9IHcgJHtnZXRQZGZDb2xvcih0aGlzLmJvcmRlckNvbG9yLCBmYWxzZSl9ICR7cmVjdH0gUyBgOwogICAgfQogICAgcmV0dXJuIHN0cjsKICB9CiAgYXN5bmMgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRk9STVMgJiYgISh0aGlzIGluc3RhbmNlb2YgU2lnbmF0dXJlV2lkZ2V0QW5ub3RhdGlvbikgJiYgIXRoaXMuZGF0YS5ub0hUTUwgJiYgIXRoaXMuZGF0YS5oYXNPd25DYW52YXMpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBvcExpc3Q6IG5ldyBPcGVyYXRvckxpc3QoKSwKICAgICAgICBzZXBhcmF0ZUZvcm06IHRydWUsCiAgICAgICAgc2VwYXJhdGVDYW52YXM6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICBpZiAoIXRoaXMuX2hhc1RleHQpIHsKICAgICAgcmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpOwogICAgfQogICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIGlmICh0aGlzLmFwcGVhcmFuY2UgJiYgY29udGVudCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBjb25zdCBvcExpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7CiAgICBpZiAoIXRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlIHx8IGNvbnRlbnQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBvcExpc3QsCiAgICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgICBzZXBhcmF0ZUNhbnZhczogZmFsc2UKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IGlzVXNpbmdPd25DYW52YXMgPSAhISh0aGlzLmRhdGEuaGFzT3duQ2FudmFzICYmIGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSk7CiAgICBjb25zdCBtYXRyaXggPSBbMSwgMCwgMCwgMSwgMCwgMF07CiAgICBjb25zdCBiYm94ID0gWzAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XTsKICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeCh0aGlzLmRhdGEucmVjdCwgYmJveCwgbWF0cml4KTsKICAgIGxldCBvcHRpb25hbENvbnRlbnQ7CiAgICBpZiAodGhpcy5vYykgewogICAgICBvcHRpb25hbENvbnRlbnQgPSBhd2FpdCBldmFsdWF0b3IucGFyc2VNYXJrZWRDb250ZW50UHJvcHModGhpcy5vYywgbnVsbCk7CiAgICB9CiAgICBpZiAob3B0aW9uYWxDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgb3BMaXN0LmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG9wdGlvbmFsQ29udGVudF0pOwogICAgfQogICAgb3BMaXN0LmFkZE9wKE9QUy5iZWdpbkFubm90YXRpb24sIFt0aGlzLmRhdGEuaWQsIHRoaXMuZGF0YS5yZWN0LCB0cmFuc2Zvcm0sIHRoaXMuZ2V0Um90YXRpb25NYXRyaXgoYW5ub3RhdGlvblN0b3JhZ2UpLCBpc1VzaW5nT3duQ2FudmFzXSk7CiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKGNvbnRlbnQpOwogICAgYXdhaXQgZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgIHN0cmVhbSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzOiB0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMsCiAgICAgIG9wZXJhdG9yTGlzdDogb3BMaXN0CiAgICB9KTsKICAgIG9wTGlzdC5hZGRPcChPUFMuZW5kQW5ub3RhdGlvbiwgW10pOwogICAgaWYgKG9wdGlvbmFsQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIG9wTGlzdC5hZGRPcChPUFMuZW5kTWFya2VkQ29udGVudCwgW10pOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgb3BMaXN0LAogICAgICBzZXBhcmF0ZUZvcm06IGZhbHNlLAogICAgICBzZXBhcmF0ZUNhbnZhczogaXNVc2luZ093bkNhbnZhcwogICAgfTsKICB9CiAgX2dldE1LRGljdChyb3RhdGlvbikgewogICAgY29uc3QgbWsgPSBuZXcgRGljdChudWxsKTsKICAgIGlmIChyb3RhdGlvbikgewogICAgICBtay5zZXQoIlIiLCByb3RhdGlvbik7CiAgICB9CiAgICBpZiAodGhpcy5ib3JkZXJDb2xvcikgewogICAgICBtay5zZXQoIkJDIiwgZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmJvcmRlckNvbG9yKSk7CiAgICB9CiAgICBpZiAodGhpcy5iYWNrZ3JvdW5kQ29sb3IpIHsKICAgICAgbWsuc2V0KCJCRyIsIGdldFBkZkNvbG9yQXJyYXkodGhpcy5iYWNrZ3JvdW5kQ29sb3IpKTsKICAgIH0KICAgIHJldHVybiBtay5zaXplID4gMCA/IG1rIDogbnVsbDsKICB9CiAgYW1lbmRTYXZlZERpY3QoYW5ub3RhdGlvblN0b3JhZ2UsIGRpY3QpIHt9CiAgc2V0VmFsdWUoZGljdCwgdmFsdWUsIHhyZWYsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHsKICAgICAgZGljdDogcGFyZW50RGljdCwKICAgICAgcmVmOiBwYXJlbnRSZWYKICAgIH0gPSBnZXRQYXJlbnRUb1VwZGF0ZShkaWN0LCB0aGlzLnJlZiwgeHJlZik7CiAgICBpZiAoIXBhcmVudERpY3QpIHsKICAgICAgZGljdC5zZXQoIlYiLCB2YWx1ZSk7CiAgICB9IGVsc2UgaWYgKCFjaGFuZ2VzLmhhcyhwYXJlbnRSZWYpKSB7CiAgICAgIGNvbnN0IG5ld1BhcmVudERpY3QgPSBwYXJlbnREaWN0LmNsb25lKCk7CiAgICAgIG5ld1BhcmVudERpY3Quc2V0KCJWIiwgdmFsdWUpOwogICAgICBjaGFuZ2VzLnB1dChwYXJlbnRSZWYsIHsKICAgICAgICBkYXRhOiBuZXdQYXJlbnREaWN0CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3UGFyZW50RGljdDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBhc3luYyBzYXZlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHN0b3JhZ2VFbnRyeSA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGNvbnN0IGZsYWdzID0gdGhpcy5fYnVpbGRGbGFncyhzdG9yYWdlRW50cnk/Lm5vVmlldywgc3RvcmFnZUVudHJ5Py5ub1ByaW50KTsKICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2VFbnRyeT8udmFsdWUsCiAgICAgIHJvdGF0aW9uID0gc3RvcmFnZUVudHJ5Py5yb3RhdGlvbjsKICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICBpZiAoIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSAmJiByb3RhdGlvbiA9PT0gdW5kZWZpbmVkICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFsdWUgfHw9IHRoaXMuZGF0YS5maWVsZFZhbHVlOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQgJiYgIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5maWVsZFZhbHVlKSAmJiBpc0FycmF5RXF1YWwodmFsdWUsIHRoaXMuZGF0YS5maWVsZFZhbHVlKSAmJiBmbGFncyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGxldCBhcHBlYXJhbmNlID0gbnVsbDsKICAgIGlmICghdGhpcy5fbmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgIGFwcGVhcmFuY2UgPSBhd2FpdCB0aGlzLl9nZXRBcHBlYXJhbmNlKGV2YWx1YXRvciwgdGFzaywgUmVuZGVyaW5nSW50ZW50RmxhZy5TQVZFLCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICAgIGlmIChhcHBlYXJhbmNlID09PSBudWxsICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0gZWxzZSB7fQogICAgbGV0IG5lZWRBcHBlYXJhbmNlcyA9IGZhbHNlOwogICAgaWYgKGFwcGVhcmFuY2U/Lm5lZWRBcHBlYXJhbmNlcykgewogICAgICBuZWVkQXBwZWFyYW5jZXMgPSB0cnVlOwogICAgICBhcHBlYXJhbmNlID0gbnVsbDsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgeHJlZgogICAgfSA9IGV2YWx1YXRvcjsKICAgIGNvbnN0IG9yaWdpbmFsRGljdCA9IHhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CiAgICBpZiAoIShvcmlnaW5hbERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBmb3IgKGNvbnN0IGtleSBvZiBvcmlnaW5hbERpY3QuZ2V0S2V5cygpKSB7CiAgICAgIGlmIChrZXkgIT09ICJBUCIpIHsKICAgICAgICBkaWN0LnNldChrZXksIG9yaWdpbmFsRGljdC5nZXRSYXcoa2V5KSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChmbGFncyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGRpY3Quc2V0KCJGIiwgZmxhZ3MpOwogICAgICBpZiAoYXBwZWFyYW5jZSA9PT0gbnVsbCAmJiAhbmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgICAgY29uc3QgYXAgPSBvcmlnaW5hbERpY3QuZ2V0UmF3KCJBUCIpOwogICAgICAgIGlmIChhcCkgewogICAgICAgICAgZGljdC5zZXQoIkFQIiwgYXApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3QgeGZhID0gewogICAgICBwYXRoOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICB2YWx1ZQogICAgfTsKICAgIGNvbnN0IG5ld1BhcmVudERpY3QgPSB0aGlzLnNldFZhbHVlKGRpY3QsIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKHN0cmluZ1RvQXNjaWlPclVURjE2QkUpIDogc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRSh2YWx1ZSksIHhyZWYsIGNoYW5nZXMpOwogICAgdGhpcy5hbWVuZFNhdmVkRGljdChhbm5vdGF0aW9uU3RvcmFnZSwgbmV3UGFyZW50RGljdCB8fCBkaWN0KTsKICAgIGNvbnN0IG1heWJlTUsgPSB0aGlzLl9nZXRNS0RpY3Qocm90YXRpb24pOwogICAgaWYgKG1heWJlTUspIHsKICAgICAgZGljdC5zZXQoIk1LIiwgbWF5YmVNSyk7CiAgICB9CiAgICBjaGFuZ2VzLnB1dCh0aGlzLnJlZiwgewogICAgICBkYXRhOiBkaWN0LAogICAgICB4ZmEsCiAgICAgIG5lZWRBcHBlYXJhbmNlcwogICAgfSk7CiAgICBpZiAoYXBwZWFyYW5jZSAhPT0gbnVsbCkgewogICAgICBjb25zdCBuZXdSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICBjb25zdCBBUCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBkaWN0LnNldCgiQVAiLCBBUCk7CiAgICAgIEFQLnNldCgiTiIsIG5ld1JlZik7CiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuX2dldFNhdmVGaWVsZFJlc291cmNlcyh4cmVmKTsKICAgICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gYXBwZWFyYW5jZVN0cmVhbS5kaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgICBhcHBlYXJhbmNlRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiQkJveCIsIFswLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodF0pOwogICAgICBjb25zdCByb3RhdGlvbk1hdHJpeCA9IHRoaXMuZ2V0Um90YXRpb25NYXRyaXgoYW5ub3RhdGlvblN0b3JhZ2UpOwogICAgICBpZiAocm90YXRpb25NYXRyaXggIT09IElERU5USVRZX01BVFJJWCkgewogICAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiTWF0cml4Iiwgcm90YXRpb25NYXRyaXgpOwogICAgICB9CiAgICAgIGNoYW5nZXMucHV0KG5ld1JlZiwgewogICAgICAgIGRhdGE6IGFwcGVhcmFuY2VTdHJlYW0sCiAgICAgICAgeGZhOiBudWxsLAogICAgICAgIG5lZWRBcHBlYXJhbmNlczogZmFsc2UKICAgICAgfSk7CiAgICB9CiAgICBkaWN0LnNldCgiTSIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApOwogIH0KICBhc3luYyBfZ2V0QXBwZWFyYW5jZShldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZT8uZ2V0KHRoaXMuZGF0YS5pZCk7CiAgICBsZXQgdmFsdWUsIHJvdGF0aW9uOwogICAgaWYgKHN0b3JhZ2VFbnRyeSkgewogICAgICB2YWx1ZSA9IHN0b3JhZ2VFbnRyeS5mb3JtYXR0ZWRWYWx1ZSB8fCBzdG9yYWdlRW50cnkudmFsdWU7CiAgICAgIHJvdGF0aW9uID0gc3RvcmFnZUVudHJ5LnJvdGF0aW9uOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhdGhpcy5fbmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgIGlmICghdGhpcy5faGFzVmFsdWVGcm9tWEZBIHx8IHRoaXMuYXBwZWFyYW5jZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyhhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlOwogICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGAvVHggQk1DIHEgJHtjb2xvcnN9USBFTUNgOwogICAgICB9CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAxKSB7CiAgICAgIHZhbHVlID0gdmFsdWVbMF07CiAgICB9CiAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiwgIkV4cGVjdGVkIGB2YWx1ZWAgdG8gYmUgYSBzdHJpbmcuIik7CiAgICB2YWx1ZSA9IHZhbHVlLnRyaW1FbmQoKTsKICAgIGlmICh0aGlzLmRhdGEuY29tYm8pIHsKICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5kYXRhLm9wdGlvbnMuZmluZCgoewogICAgICAgIGV4cG9ydFZhbHVlCiAgICAgIH0pID0+IHZhbHVlID09PSBleHBvcnRWYWx1ZSk7CiAgICAgIHZhbHVlID0gb3B0aW9uPy5kaXNwbGF5VmFsdWUgfHwgdmFsdWU7CiAgICB9CiAgICBpZiAodmFsdWUgPT09ICIiKSB7CiAgICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfVEgRU1DYDsKICAgIH0KICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGxldCBsaW5lQ291bnQgPSAtMTsKICAgIGxldCBsaW5lczsKICAgIGlmICh0aGlzLmRhdGEubXVsdGlMaW5lKSB7CiAgICAgIGxpbmVzID0gdmFsdWUuc3BsaXQoL1xyXG4/fFxuLykubWFwKGxpbmUgPT4gbGluZS5ub3JtYWxpemUoIk5GQyIpKTsKICAgICAgbGluZUNvdW50ID0gbGluZXMubGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgbGluZXMgPSBbdmFsdWUucmVwbGFjZSgvXHJcbj98XG4vLCAiIikubm9ybWFsaXplKCJORkMiKV07CiAgICB9CiAgICBjb25zdCBkZWZhdWx0UGFkZGluZyA9IDE7CiAgICBjb25zdCBkZWZhdWx0SFBhZGRpbmcgPSAyOwogICAgbGV0IHsKICAgICAgd2lkdGg6IHRvdGFsV2lkdGgsCiAgICAgIGhlaWdodDogdG90YWxIZWlnaHQKICAgIH0gPSB0aGlzOwogICAgaWYgKHJvdGF0aW9uID09PSA5MCB8fCByb3RhdGlvbiA9PT0gMjcwKSB7CiAgICAgIFt0b3RhbFdpZHRoLCB0b3RhbEhlaWdodF0gPSBbdG90YWxIZWlnaHQsIHRvdGFsV2lkdGhdOwogICAgfQogICAgaWYgKCF0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gcGFyc2VEZWZhdWx0QXBwZWFyYW5jZSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9ICIvSGVsdmV0aWNhIDAgVGYgMCBnIik7CiAgICB9CiAgICBsZXQgZm9udCA9IGF3YWl0IFdpZGdldEFubm90YXRpb24uX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzaywgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSwgdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzKTsKICAgIGxldCBkZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGxpbmVIZWlnaHQ7CiAgICBjb25zdCBlbmNvZGVkTGluZXMgPSBbXTsKICAgIGxldCBlbmNvZGluZ0Vycm9yID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHsKICAgICAgY29uc3QgZW5jb2RlZFN0cmluZyA9IGZvbnQuZW5jb2RlU3RyaW5nKGxpbmUpOwogICAgICBpZiAoZW5jb2RlZFN0cmluZy5sZW5ndGggPiAxKSB7CiAgICAgICAgZW5jb2RpbmdFcnJvciA9IHRydWU7CiAgICAgIH0KICAgICAgZW5jb2RlZExpbmVzLnB1c2goZW5jb2RlZFN0cmluZy5qb2luKCIiKSk7CiAgICB9CiAgICBpZiAoZW5jb2RpbmdFcnJvciAmJiBpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlNBVkUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBuZWVkQXBwZWFyYW5jZXM6IHRydWUKICAgICAgfTsKICAgIH0KICAgIGlmIChlbmNvZGluZ0Vycm9yICYmIHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmRhdGEuY29tYiA/ICJtb25vc3BhY2UiIDogInNhbnMtc2VyaWYiOwogICAgICBjb25zdCBmYWtlVW5pY29kZUZvbnQgPSBuZXcgRmFrZVVuaWNvZGVGb250KGV2YWx1YXRvci54cmVmLCBmb250RmFtaWx5KTsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gZmFrZVVuaWNvZGVGb250LmNyZWF0ZUZvbnRSZXNvdXJjZXMobGluZXMuam9pbigiIikpOwogICAgICBjb25zdCBuZXdGb250ID0gcmVzb3VyY2VzLmdldFJhdygiRm9udCIpOwogICAgICBpZiAodGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLmhhcygiRm9udCIpKSB7CiAgICAgICAgY29uc3Qgb2xkRm9udCA9IHRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcy5nZXQoIkZvbnQiKTsKICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBuZXdGb250LmdldEtleXMoKSkgewogICAgICAgICAgb2xkRm9udC5zZXQoa2V5LCBuZXdGb250LmdldFJhdyhrZXkpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLnNldCgiRm9udCIsIG5ld0ZvbnQpOwogICAgICB9CiAgICAgIGNvbnN0IGZvbnROYW1lID0gZmFrZVVuaWNvZGVGb250LmZvbnROYW1lLm5hbWU7CiAgICAgIGZvbnQgPSBhd2FpdCBXaWRnZXRBbm5vdGF0aW9uLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIHsKICAgICAgICBmb250TmFtZSwKICAgICAgICBmb250U2l6ZTogMAogICAgICB9LCByZXNvdXJjZXMpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBlbmNvZGVkTGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGVuY29kZWRMaW5lc1tpXSA9IHN0cmluZ1RvVVRGMTZTdHJpbmcobGluZXNbaV0pOwogICAgICB9CiAgICAgIGNvbnN0IHNhdmVkRGVmYXVsdEFwcGVhcmFuY2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEpOwogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnRTaXplID0gMDsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250TmFtZSA9IGZvbnROYW1lOwogICAgICBbZGVmYXVsdEFwcGVhcmFuY2UsIGZvbnRTaXplLCBsaW5lSGVpZ2h0XSA9IHRoaXMuX2NvbXB1dGVGb250U2l6ZSh0b3RhbEhlaWdodCAtIDIgKiBkZWZhdWx0UGFkZGluZywgdG90YWxXaWR0aCAtIDIgKiBkZWZhdWx0SFBhZGRpbmcsIHZhbHVlLCBmb250LCBsaW5lQ291bnQpOwogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gc2F2ZWREZWZhdWx0QXBwZWFyYW5jZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgICAgICB3YXJuKCJfZ2V0QXBwZWFyYW5jZTogT2Zmc2NyZWVuQ2FudmFzIGlzIG5vdCBzdXBwb3J0ZWQsIGFubm90YXRpb24gbWF5IG5vdCByZW5kZXIgY29ycmVjdGx5LiIpOwogICAgICB9CiAgICAgIFtkZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGxpbmVIZWlnaHRdID0gdGhpcy5fY29tcHV0ZUZvbnRTaXplKHRvdGFsSGVpZ2h0IC0gMiAqIGRlZmF1bHRQYWRkaW5nLCB0b3RhbFdpZHRoIC0gMiAqIGRlZmF1bHRIUGFkZGluZywgdmFsdWUsIGZvbnQsIGxpbmVDb3VudCk7CiAgICB9CiAgICBsZXQgZGVzY2VudCA9IGZvbnQuZGVzY2VudDsKICAgIGlmIChpc05hTihkZXNjZW50KSkgewogICAgICBkZXNjZW50ID0gQkFTRUxJTkVfRkFDVE9SICogbGluZUhlaWdodDsKICAgIH0gZWxzZSB7CiAgICAgIGRlc2NlbnQgPSBNYXRoLm1heChCQVNFTElORV9GQUNUT1IgKiBsaW5lSGVpZ2h0LCBNYXRoLmFicyhkZXNjZW50KSAqIGZvbnRTaXplKTsKICAgIH0KICAgIGNvbnN0IGRlZmF1bHRWUGFkZGluZyA9IE1hdGgubWluKE1hdGguZmxvb3IoKHRvdGFsSGVpZ2h0IC0gZm9udFNpemUpIC8gMiksIGRlZmF1bHRQYWRkaW5nKTsKICAgIGNvbnN0IGFsaWdubWVudCA9IHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50OwogICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHsKICAgICAgcmV0dXJuIHRoaXMuX2dldE11bHRpbGluZUFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIGVuY29kZWRMaW5lcywgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIHRvdGFsSGVpZ2h0LCBhbGlnbm1lbnQsIGRlZmF1bHRIUGFkZGluZywgZGVmYXVsdFZQYWRkaW5nLCBkZXNjZW50LCBsaW5lSGVpZ2h0LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHsKICAgICAgcmV0dXJuIHRoaXMuX2dldENvbWJBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCBmb250LCBlbmNvZGVkTGluZXNbMF0sIGZvbnRTaXplLCB0b3RhbFdpZHRoLCB0b3RhbEhlaWdodCwgZGVmYXVsdEhQYWRkaW5nLCBkZWZhdWx0VlBhZGRpbmcsIGRlc2NlbnQsIGxpbmVIZWlnaHQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGNvbnN0IGJvdHRvbVBhZGRpbmcgPSBkZWZhdWx0VlBhZGRpbmcgKyBkZXNjZW50OwogICAgaWYgKGFsaWdubWVudCA9PT0gMCB8fCBhbGlnbm1lbnQgPiAyKSB7CiAgICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfUJUIGAgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAke251bWJlclRvU3RyaW5nKGRlZmF1bHRIUGFkZGluZyl9ICR7bnVtYmVyVG9TdHJpbmcoYm90dG9tUGFkZGluZyl9IFRtICgke2VzY2FwZVN0cmluZyhlbmNvZGVkTGluZXNbMF0pfSkgVGpgICsgIiBFVCBRIEVNQyI7CiAgICB9CiAgICBjb25zdCBwcmV2SW5mbyA9IHsKICAgICAgc2hpZnQ6IDAKICAgIH07CiAgICBjb25zdCByZW5kZXJlZFRleHQgPSB0aGlzLl9yZW5kZXJUZXh0KGVuY29kZWRMaW5lc1swXSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIGFsaWdubWVudCwgcHJldkluZm8sIGRlZmF1bHRIUGFkZGluZywgYm90dG9tUGFkZGluZyk7CiAgICByZXR1cm4gYC9UeCBCTUMgcSAke2NvbG9yc31CVCBgICsgZGVmYXVsdEFwcGVhcmFuY2UgKyBgIDEgMCAwIDEgMCAwIFRtICR7cmVuZGVyZWRUZXh0fWAgKyAiIEVUIFEgRU1DIjsKICB9CiAgc3RhdGljIGFzeW5jIF9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIGFwcGVhcmFuY2VEYXRhLCByZXNvdXJjZXMpIHsKICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoKTsKICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHsKICAgICAgZm9udDogbnVsbCwKICAgICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCB7CiAgICAgIGZvbnROYW1lLAogICAgICBmb250U2l6ZQogICAgfSA9IGFwcGVhcmFuY2VEYXRhOwogICAgYXdhaXQgZXZhbHVhdG9yLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBbZm9udE5hbWUgJiYgTmFtZS5nZXQoZm9udE5hbWUpLCBmb250U2l6ZV0sIG51bGwsIG9wZXJhdG9yTGlzdCwgdGFzaywgaW5pdGlhbFN0YXRlLCBudWxsKTsKICAgIHJldHVybiBpbml0aWFsU3RhdGUuZm9udDsKICB9CiAgX2dldFRleHRXaWR0aCh0ZXh0LCBmb250KSB7CiAgICByZXR1cm4gTWF0aC5zdW1QcmVjaXNlKGZvbnQuY2hhcnNUb0dseXBocyh0ZXh0KS5tYXAoZyA9PiBnLndpZHRoKSkgLyAxMDAwOwogIH0KICBfY29tcHV0ZUZvbnRTaXplKGhlaWdodCwgd2lkdGgsIHRleHQsIGZvbnQsIGxpbmVDb3VudCkgewogICAgbGV0IHsKICAgICAgZm9udFNpemUKICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhOwogICAgbGV0IGxpbmVIZWlnaHQgPSAoZm9udFNpemUgfHwgMTIpICogTElORV9GQUNUT1IsCiAgICAgIG51bWJlck9mTGluZXMgPSBNYXRoLnJvdW5kKGhlaWdodCAvIGxpbmVIZWlnaHQpOwogICAgaWYgKCFmb250U2l6ZSkgewogICAgICBjb25zdCByb3VuZFdpdGhUd29EaWdpdHMgPSB4ID0+IE1hdGguZmxvb3IoeCAqIDEwMCkgLyAxMDA7CiAgICAgIGlmIChsaW5lQ291bnQgPT09IC0xKSB7CiAgICAgICAgY29uc3QgdGV4dFdpZHRoID0gdGhpcy5fZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpOwogICAgICAgIGZvbnRTaXplID0gcm91bmRXaXRoVHdvRGlnaXRzKE1hdGgubWluKGhlaWdodCAvIExJTkVfRkFDVE9SLCB3aWR0aCAvIHRleHRXaWR0aCkpOwogICAgICAgIG51bWJlck9mTGluZXMgPSAxOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvXHJcbj98XG4vKTsKICAgICAgICBjb25zdCBjYWNoZWRMaW5lcyA9IFtdOwogICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykgewogICAgICAgICAgY29uc3QgZW5jb2RlZCA9IGZvbnQuZW5jb2RlU3RyaW5nKGxpbmUpLmpvaW4oIiIpOwogICAgICAgICAgY29uc3QgZ2x5cGhzID0gZm9udC5jaGFyc1RvR2x5cGhzKGVuY29kZWQpOwogICAgICAgICAgY29uc3QgcG9zaXRpb25zID0gZm9udC5nZXRDaGFyUG9zaXRpb25zKGVuY29kZWQpOwogICAgICAgICAgY2FjaGVkTGluZXMucHVzaCh7CiAgICAgICAgICAgIGxpbmU6IGVuY29kZWQsCiAgICAgICAgICAgIGdseXBocywKICAgICAgICAgICAgcG9zaXRpb25zCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaXNUb29CaWcgPSBmc2l6ZSA9PiB7CiAgICAgICAgICBsZXQgdG90YWxIZWlnaHQgPSAwOwogICAgICAgICAgZm9yIChjb25zdCBjYWNoZSBvZiBjYWNoZWRMaW5lcykgewogICAgICAgICAgICBjb25zdCBjaHVua3MgPSB0aGlzLl9zcGxpdExpbmUobnVsbCwgZm9udCwgZnNpemUsIHdpZHRoLCBjYWNoZSk7CiAgICAgICAgICAgIHRvdGFsSGVpZ2h0ICs9IGNodW5rcy5sZW5ndGggKiBmc2l6ZTsKICAgICAgICAgICAgaWYgKHRvdGFsSGVpZ2h0ID4gaGVpZ2h0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9OwogICAgICAgIG51bWJlck9mTGluZXMgPSBNYXRoLm1heChudW1iZXJPZkxpbmVzLCBsaW5lQ291bnQpOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICBsaW5lSGVpZ2h0ID0gaGVpZ2h0IC8gbnVtYmVyT2ZMaW5lczsKICAgICAgICAgIGZvbnRTaXplID0gcm91bmRXaXRoVHdvRGlnaXRzKGxpbmVIZWlnaHQgLyBMSU5FX0ZBQ1RPUik7CiAgICAgICAgICBpZiAoaXNUb29CaWcoZm9udFNpemUpKSB7CiAgICAgICAgICAgIG51bWJlck9mTGluZXMrKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgewogICAgICAgIGZvbnROYW1lLAogICAgICAgIGZvbnRDb2xvcgogICAgICB9ID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YTsKICAgICAgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UgPSBjcmVhdGVEZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgZm9udFNpemUsCiAgICAgICAgZm9udE5hbWUsCiAgICAgICAgZm9udENvbG9yCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIFt0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGhlaWdodCAvIG51bWJlck9mTGluZXNdOwogIH0KICBfcmVuZGVyVGV4dCh0ZXh0LCBmb250LCBmb250U2l6ZSwgdG90YWxXaWR0aCwgYWxpZ25tZW50LCBwcmV2SW5mbywgaFBhZGRpbmcsIHZQYWRkaW5nKSB7CiAgICBsZXQgc2hpZnQ7CiAgICBpZiAoYWxpZ25tZW50ID09PSAxKSB7CiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpICogZm9udFNpemU7CiAgICAgIHNoaWZ0ID0gKHRvdGFsV2lkdGggLSB3aWR0aCkgLyAyOwogICAgfSBlbHNlIGlmIChhbGlnbm1lbnQgPT09IDIpIHsKICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9nZXRUZXh0V2lkdGgodGV4dCwgZm9udCkgKiBmb250U2l6ZTsKICAgICAgc2hpZnQgPSB0b3RhbFdpZHRoIC0gd2lkdGggLSBoUGFkZGluZzsKICAgIH0gZWxzZSB7CiAgICAgIHNoaWZ0ID0gaFBhZGRpbmc7CiAgICB9CiAgICBjb25zdCBzaGlmdFN0ciA9IG51bWJlclRvU3RyaW5nKHNoaWZ0IC0gcHJldkluZm8uc2hpZnQpOwogICAgcHJldkluZm8uc2hpZnQgPSBzaGlmdDsKICAgIHZQYWRkaW5nID0gbnVtYmVyVG9TdHJpbmcodlBhZGRpbmcpOwogICAgcmV0dXJuIGAke3NoaWZ0U3RyfSAke3ZQYWRkaW5nfSBUZCAoJHtlc2NhcGVTdHJpbmcodGV4dCl9KSBUamA7CiAgfQogIF9nZXRTYXZlRmllbGRSZXNvdXJjZXMoeHJlZikgewogICAgY29uc3QgewogICAgICBsb2NhbFJlc291cmNlcywKICAgICAgYXBwZWFyYW5jZVJlc291cmNlcywKICAgICAgYWNyb0Zvcm1SZXNvdXJjZXMKICAgIH0gPSB0aGlzLl9maWVsZFJlc291cmNlczsKICAgIGNvbnN0IGZvbnROYW1lID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YT8uZm9udE5hbWU7CiAgICBpZiAoIWZvbnROYW1lKSB7CiAgICAgIHJldHVybiBsb2NhbFJlc291cmNlcyB8fCBEaWN0LmVtcHR5OwogICAgfQogICAgZm9yIChjb25zdCByZXNvdXJjZXMgb2YgW2xvY2FsUmVzb3VyY2VzLCBhcHBlYXJhbmNlUmVzb3VyY2VzXSkgewogICAgICBpZiAocmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGNvbnN0IGxvY2FsRm9udCA9IHJlc291cmNlcy5nZXQoIkZvbnQiKTsKICAgICAgICBpZiAobG9jYWxGb250IGluc3RhbmNlb2YgRGljdCAmJiBsb2NhbEZvbnQuaGFzKGZvbnROYW1lKSkgewogICAgICAgICAgcmV0dXJuIHJlc291cmNlczsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChhY3JvRm9ybVJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3QgYWNyb0Zvcm1Gb250ID0gYWNyb0Zvcm1SZXNvdXJjZXMuZ2V0KCJGb250Iik7CiAgICAgIGlmIChhY3JvRm9ybUZvbnQgaW5zdGFuY2VvZiBEaWN0ICYmIGFjcm9Gb3JtRm9udC5oYXMoZm9udE5hbWUpKSB7CiAgICAgICAgY29uc3Qgc3ViRm9udERpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgICBzdWJGb250RGljdC5zZXQoZm9udE5hbWUsIGFjcm9Gb3JtRm9udC5nZXRSYXcoZm9udE5hbWUpKTsKICAgICAgICBjb25zdCBzdWJSZXNvdXJjZXNEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICAgICAgc3ViUmVzb3VyY2VzRGljdC5zZXQoIkZvbnQiLCBzdWJGb250RGljdCk7CiAgICAgICAgcmV0dXJuIERpY3QubWVyZ2UoewogICAgICAgICAgeHJlZiwKICAgICAgICAgIGRpY3RBcnJheTogW3N1YlJlc291cmNlc0RpY3QsIGxvY2FsUmVzb3VyY2VzXSwKICAgICAgICAgIG1lcmdlU3ViRGljdHM6IHRydWUKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGxvY2FsUmVzb3VyY2VzIHx8IERpY3QuZW1wdHk7CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgcmV0dXJuIG51bGw7CiAgfQp9CmNsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0CiAgICB9ID0gcGFyYW1zOwogICAgaWYgKGRpY3QuaGFzKCJQTUQiKSkgewogICAgICB0aGlzLmZsYWdzIHw9IEFubm90YXRpb25GbGFnLkhJRERFTjsKICAgICAgdGhpcy5kYXRhLmhpZGRlbiA9IHRydWU7CiAgICAgIHdhcm4oIkJhcmNvZGVzIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICB9CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLnJlYWRPbmx5ICYmICF0aGlzLmRhdGEubm9IVE1MOwogICAgdGhpcy5faGFzVGV4dCA9IHRydWU7CiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5maWVsZFZhbHVlICE9PSAic3RyaW5nIikgewogICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9ICIiOwogICAgfQogICAgbGV0IGFsaWdubWVudCA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0LAogICAgICBrZXk6ICJRIgogICAgfSk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYWxpZ25tZW50KSB8fCBhbGlnbm1lbnQgPCAwIHx8IGFsaWdubWVudCA+IDIpIHsKICAgICAgYWxpZ25tZW50ID0gbnVsbDsKICAgIH0KICAgIHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50ID0gYWxpZ25tZW50OwogICAgbGV0IG1heGltdW1MZW5ndGggPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiTWF4TGVuIgogICAgfSk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4aW11bUxlbmd0aCkgfHwgbWF4aW11bUxlbmd0aCA8IDApIHsKICAgICAgbWF4aW11bUxlbmd0aCA9IDA7CiAgICB9CiAgICB0aGlzLmRhdGEubWF4TGVuID0gbWF4aW11bUxlbmd0aDsKICAgIHRoaXMuZGF0YS5tdWx0aUxpbmUgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSk7CiAgICB0aGlzLmRhdGEuY29tYiA9IHRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuQ09NQikgJiYgIXRoaXMuZGF0YS5tdWx0aUxpbmUgJiYgIXRoaXMuZGF0YS5wYXNzd29yZCAmJiAhdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSAmJiB0aGlzLmRhdGEubWF4TGVuICE9PSAwOwogICAgdGhpcy5kYXRhLmRvTm90U2Nyb2xsID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5ET05PVFNDUk9MTCk7CiAgfQogIGdldCBoYXNUZXh0Q29udGVudCgpIHsKICAgIHJldHVybiAhIXRoaXMuYXBwZWFyYW5jZSAmJiAhdGhpcy5fbmVlZEFwcGVhcmFuY2VzOwogIH0KICBfZ2V0Q29tYkFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIGZvbnQsIHRleHQsIGZvbnRTaXplLCB3aWR0aCwgaGVpZ2h0LCBoUGFkZGluZywgdlBhZGRpbmcsIGRlc2NlbnQsIGxpbmVIZWlnaHQsIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBjb25zdCBjb21iV2lkdGggPSB3aWR0aCAvIHRoaXMuZGF0YS5tYXhMZW47CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyhhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICBjb25zdCBidWYgPSBbXTsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IGZvbnQuZ2V0Q2hhclBvc2l0aW9ucyh0ZXh0KTsKICAgIGZvciAoY29uc3QgW3N0YXJ0LCBlbmRdIG9mIHBvc2l0aW9ucykgewogICAgICBidWYucHVzaChgKCR7ZXNjYXBlU3RyaW5nKHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKX0pIFRqYCk7CiAgICB9CiAgICBjb25zdCByZW5kZXJlZENvbWIgPSBidWYuam9pbihgICR7bnVtYmVyVG9TdHJpbmcoY29tYldpZHRoKX0gMCBUZCBgKTsKICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfUJUIGAgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAke251bWJlclRvU3RyaW5nKGhQYWRkaW5nKX0gJHtudW1iZXJUb1N0cmluZyh2UGFkZGluZyArIGRlc2NlbnQpfSBUbSAke3JlbmRlcmVkQ29tYn1gICsgIiBFVCBRIEVNQyI7CiAgfQogIF9nZXRNdWx0aWxpbmVBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCBsaW5lcywgZm9udCwgZm9udFNpemUsIHdpZHRoLCBoZWlnaHQsIGFsaWdubWVudCwgaFBhZGRpbmcsIHZQYWRkaW5nLCBkZXNjZW50LCBsaW5lSGVpZ2h0LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgY29uc3QgYnVmID0gW107CiAgICBjb25zdCB0b3RhbFdpZHRoID0gd2lkdGggLSAyICogaFBhZGRpbmc7CiAgICBjb25zdCBwcmV2SW5mbyA9IHsKICAgICAgc2hpZnQ6IDAKICAgIH07CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgY29uc3QgY2h1bmtzID0gdGhpcy5fc3BsaXRMaW5lKGxpbmUsIGZvbnQsIGZvbnRTaXplLCB0b3RhbFdpZHRoKTsKICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gY2h1bmtzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBjb25zdCBjaHVuayA9IGNodW5rc1tqXTsKICAgICAgICBjb25zdCB2U2hpZnQgPSBpID09PSAwICYmIGogPT09IDAgPyAtdlBhZGRpbmcgLSAobGluZUhlaWdodCAtIGRlc2NlbnQpIDogLWxpbmVIZWlnaHQ7CiAgICAgICAgYnVmLnB1c2godGhpcy5fcmVuZGVyVGV4dChjaHVuaywgZm9udCwgZm9udFNpemUsIHdpZHRoLCBhbGlnbm1lbnQsIHByZXZJbmZvLCBoUGFkZGluZywgdlNoaWZ0KSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGFubm90YXRpb25TdG9yYWdlKTsKICAgIGNvbnN0IHJlbmRlcmVkVGV4dCA9IGJ1Zi5qb2luKCJcbiIpOwogICAgcmV0dXJuIGAvVHggQk1DIHEgJHtjb2xvcnN9QlQgYCArIGRlZmF1bHRBcHBlYXJhbmNlICsgYCAxIDAgMCAxIDAgJHtudW1iZXJUb1N0cmluZyhoZWlnaHQpfSBUbSAke3JlbmRlcmVkVGV4dH1gICsgIiBFVCBRIEVNQyI7CiAgfQogIF9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHdpZHRoLCBjYWNoZSA9IHt9KSB7CiAgICBsaW5lID0gY2FjaGUubGluZSB8fCBsaW5lOwogICAgY29uc3QgZ2x5cGhzID0gY2FjaGUuZ2x5cGhzIHx8IGZvbnQuY2hhcnNUb0dseXBocyhsaW5lKTsKICAgIGlmIChnbHlwaHMubGVuZ3RoIDw9IDEpIHsKICAgICAgcmV0dXJuIFtsaW5lXTsKICAgIH0KICAgIGNvbnN0IHBvc2l0aW9ucyA9IGNhY2hlLnBvc2l0aW9ucyB8fCBmb250LmdldENoYXJQb3NpdGlvbnMobGluZSk7CiAgICBjb25zdCBzY2FsZSA9IGZvbnRTaXplIC8gMTAwMDsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgbGV0IGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSAtMSwKICAgICAgbGFzdFNwYWNlUG9zSW5TdHJpbmdFbmQgPSAtMSwKICAgICAgbGFzdFNwYWNlUG9zID0gLTEsCiAgICAgIHN0YXJ0Q2h1bmsgPSAwLAogICAgICBjdXJyZW50V2lkdGggPSAwOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gcG9zaXRpb25zW2ldOwogICAgICBjb25zdCBnbHlwaCA9IGdseXBoc1tpXTsKICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IGdseXBoLndpZHRoICogc2NhbGU7CiAgICAgIGlmIChnbHlwaC51bmljb2RlID09PSAiICIpIHsKICAgICAgICBpZiAoY3VycmVudFdpZHRoICsgZ2x5cGhXaWR0aCA+IHdpZHRoKSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBzdGFydCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IHN0YXJ0OwogICAgICAgICAgY3VycmVudFdpZHRoID0gZ2x5cGhXaWR0aDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSAtMTsKICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50V2lkdGggKz0gZ2x5cGhXaWR0aDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSBzdGFydDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nRW5kID0gZW5kOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gaTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFdpZHRoICsgZ2x5cGhXaWR0aCA+IHdpZHRoKSB7CiAgICAgICAgaWYgKGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgIT09IC0xKSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBsYXN0U3BhY2VQb3NJblN0cmluZ0VuZCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IGxhc3RTcGFjZVBvc0luU3RyaW5nRW5kOwogICAgICAgICAgaSA9IGxhc3RTcGFjZVBvcyArIDE7CiAgICAgICAgICBsYXN0U3BhY2VQb3NJblN0cmluZ1N0YXJ0ID0gLTE7CiAgICAgICAgICBjdXJyZW50V2lkdGggPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBzdGFydCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IHN0YXJ0OwogICAgICAgICAgY3VycmVudFdpZHRoID0gZ2x5cGhXaWR0aDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFdpZHRoICs9IGdseXBoV2lkdGg7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdGFydENodW5rIDwgbGluZS5sZW5ndGgpIHsKICAgICAgY2h1bmtzLnB1c2gobGluZS5zdWJzdHJpbmcoc3RhcnRDaHVuaywgbGluZS5sZW5ndGgpKTsKICAgIH0KICAgIHJldHVybiBjaHVua3M7CiAgfQogIGFzeW5jIGV4dHJhY3RUZXh0Q29udGVudChldmFsdWF0b3IsIHRhc2ssIHZpZXdCb3gpIHsKICAgIGF3YWl0IHN1cGVyLmV4dHJhY3RUZXh0Q29udGVudChldmFsdWF0b3IsIHRhc2ssIHZpZXdCb3gpOwogICAgY29uc3QgdGV4dCA9IHRoaXMuZGF0YS50ZXh0Q29udGVudDsKICAgIGlmICghdGV4dCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBhbGxUZXh0ID0gdGV4dC5qb2luKCJcbiIpOwogICAgaWYgKGFsbFRleHQgPT09IHRoaXMuZGF0YS5maWVsZFZhbHVlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJlZ2V4ID0gYWxsVGV4dC5yZXBsYWNlQWxsKC8oWy4qKz9eJHt9KCl8W1xdXFxdKXwoXHMrKS9nLCAoX20sIHAxKSA9PiBwMSA/IGBcXCR7cDF9YCA6ICJcXHMrIik7CiAgICBpZiAobmV3IFJlZ0V4cChgXlxccyoke3JlZ2V4fVxccyokYCkudGVzdCh0aGlzLmRhdGEuZmllbGRWYWx1ZSkpIHsKICAgICAgdGhpcy5kYXRhLnRleHRDb250ZW50ID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUuc3BsaXQoIlxuIik7CiAgICB9CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgcmV0dXJuIHsKICAgICAgaWQ6IHRoaXMuZGF0YS5pZCwKICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlLAogICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSB8fCAiIiwKICAgICAgbXVsdGlsaW5lOiB0aGlzLmRhdGEubXVsdGlMaW5lLAogICAgICBwYXNzd29yZDogdGhpcy5kYXRhLnBhc3N3b3JkLAogICAgICBjaGFyTGltaXQ6IHRoaXMuZGF0YS5tYXhMZW4sCiAgICAgIGNvbWI6IHRoaXMuZGF0YS5jb21iLAogICAgICBlZGl0YWJsZTogIXRoaXMuZGF0YS5yZWFkT25seSwKICAgICAgaGlkZGVuOiB0aGlzLmRhdGEuaGlkZGVuLAogICAgICBuYW1lOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCwKICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgIHBhZ2U6IHRoaXMuZGF0YS5wYWdlSW5kZXgsCiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLmRhdGEuYm9yZGVyQ29sb3IsCiAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sCiAgICAgIHR5cGU6ICJ0ZXh0IgogICAgfTsKICB9Cn0KY2xhc3MgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBudWxsOwogICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gbnVsbDsKICAgIGNvbnN0IGlzUmFkaW8gPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlJBRElPKSwKICAgICAgaXNQdXNoQnV0dG9uID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5QVVNIQlVUVE9OKTsKICAgIHRoaXMuZGF0YS5jaGVja0JveCA9ICFpc1JhZGlvICYmICFpc1B1c2hCdXR0b247CiAgICB0aGlzLmRhdGEucmFkaW9CdXR0b24gPSBpc1JhZGlvICYmICFpc1B1c2hCdXR0b247CiAgICB0aGlzLmRhdGEucHVzaEJ1dHRvbiA9IGlzUHVzaEJ1dHRvbjsKICAgIHRoaXMuZGF0YS5pc1Rvb2x0aXBPbmx5ID0gZmFsc2U7CiAgICBpZiAodGhpcy5kYXRhLmNoZWNrQm94KSB7CiAgICAgIHRoaXMuX3Byb2Nlc3NDaGVja0JveChwYXJhbXMpOwogICAgfSBlbHNlIGlmICh0aGlzLmRhdGEucmFkaW9CdXR0b24pIHsKICAgICAgdGhpcy5fcHJvY2Vzc1JhZGlvQnV0dG9uKHBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5wdXNoQnV0dG9uKSB7CiAgICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0cnVlOwogICAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICAgIHRoaXMuX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcyk7CiAgICB9IGVsc2UgewogICAgICB3YXJuKCJJbnZhbGlkIGZpZWxkIGZsYWdzIGZvciBidXR0b24gd2lkZ2V0IGFubm90YXRpb24iKTsKICAgIH0KICB9CiAgYXN5bmMgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKHRoaXMuZGF0YS5wdXNoQnV0dG9uKSB7CiAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGZhbHNlLCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBsZXQgdmFsdWUgPSBudWxsOwogICAgbGV0IHJvdGF0aW9uID0gbnVsbDsKICAgIGlmIChhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgICAgdmFsdWUgPSBzdG9yYWdlRW50cnkgPyBzdG9yYWdlRW50cnkudmFsdWUgOiBudWxsOwogICAgICByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeSA/IHN0b3JhZ2VFbnRyeS5yb3RhdGlvbiA6IG51bGw7CiAgICB9CiAgICBpZiAodmFsdWUgPT09IG51bGwgJiYgdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmNoZWNrQm94ID8gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5leHBvcnRWYWx1ZSA6IHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSB0aGlzLmRhdGEuYnV0dG9uVmFsdWU7CiAgICB9CiAgICBjb25zdCBhcHBlYXJhbmNlID0gdmFsdWUgPyB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlIDogdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlOwogICAgaWYgKGFwcGVhcmFuY2UpIHsKICAgICAgY29uc3Qgc2F2ZWRBcHBlYXJhbmNlID0gdGhpcy5hcHBlYXJhbmNlOwogICAgICBjb25zdCBzYXZlZE1hdHJpeCA9IGxvb2t1cE1hdHJpeChhcHBlYXJhbmNlLmRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpLCBJREVOVElUWV9NQVRSSVgpOwogICAgICBpZiAocm90YXRpb24pIHsKICAgICAgICBhcHBlYXJhbmNlLmRpY3Quc2V0KCJNYXRyaXgiLCB0aGlzLmdldFJvdGF0aW9uTWF0cml4KGFubm90YXRpb25TdG9yYWdlKSk7CiAgICAgIH0KICAgICAgdGhpcy5hcHBlYXJhbmNlID0gYXBwZWFyYW5jZTsKICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IHNhdmVkQXBwZWFyYW5jZTsKICAgICAgYXBwZWFyYW5jZS5kaWN0LnNldCgiTWF0cml4Iiwgc2F2ZWRNYXRyaXgpOwogICAgICByZXR1cm4gb3BlcmF0b3JMaXN0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgb3BMaXN0OiBuZXcgT3BlcmF0b3JMaXN0KCksCiAgICAgIHNlcGFyYXRlRm9ybTogZmFsc2UsCiAgICAgIHNlcGFyYXRlQ2FudmFzOiBmYWxzZQogICAgfTsKICB9CiAgYXN5bmMgc2F2ZShldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlLCBjaGFuZ2VzKSB7CiAgICBpZiAodGhpcy5kYXRhLmNoZWNrQm94KSB7CiAgICAgIHRoaXMuX3NhdmVDaGVja2JveChldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlLCBjaGFuZ2VzKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuZGF0YS5yYWRpb0J1dHRvbikgewogICAgICB0aGlzLl9zYXZlUmFkaW9CdXR0b24oZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcyk7CiAgICB9CiAgfQogIGFzeW5jIF9zYXZlQ2hlY2tib3goZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgaWYgKCFhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGNvbnN0IGZsYWdzID0gdGhpcy5fYnVpbGRGbGFncyhzdG9yYWdlRW50cnk/Lm5vVmlldywgc3RvcmFnZUVudHJ5Py5ub1ByaW50KTsKICAgIGxldCByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeT8ucm90YXRpb24sCiAgICAgIHZhbHVlID0gc3RvcmFnZUVudHJ5Py52YWx1ZTsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5leHBvcnRWYWx1ZTsKICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdmFsdWUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGxldCBkaWN0ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZGljdCA9IGRpY3QuY2xvbmUoKTsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5leHBvcnRWYWx1ZTsKICAgIH0KICAgIGNvbnN0IHhmYSA9IHsKICAgICAgcGF0aDogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgdmFsdWU6IHZhbHVlID8gdGhpcy5kYXRhLmV4cG9ydFZhbHVlIDogIiIKICAgIH07CiAgICBjb25zdCBuYW1lID0gTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgOiAiT2ZmIik7CiAgICB0aGlzLnNldFZhbHVlKGRpY3QsIG5hbWUsIGV2YWx1YXRvci54cmVmLCBjaGFuZ2VzKTsKICAgIGRpY3Quc2V0KCJBUyIsIG5hbWUpOwogICAgZGljdC5zZXQoIk0iLCBgRDoke2dldE1vZGlmaWNhdGlvbkRhdGUoKX1gKTsKICAgIGlmIChmbGFncyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGRpY3Quc2V0KCJGIiwgZmxhZ3MpOwogICAgfQogICAgY29uc3QgbWF5YmVNSyA9IHRoaXMuX2dldE1LRGljdChyb3RhdGlvbik7CiAgICBpZiAobWF5YmVNSykgewogICAgICBkaWN0LnNldCgiTUsiLCBtYXliZU1LKTsKICAgIH0KICAgIGNoYW5nZXMucHV0KHRoaXMucmVmLCB7CiAgICAgIGRhdGE6IGRpY3QsCiAgICAgIHhmYSwKICAgICAgbmVlZEFwcGVhcmFuY2VzOiBmYWxzZQogICAgfSk7CiAgfQogIGFzeW5jIF9zYXZlUmFkaW9CdXR0b24oZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgaWYgKCFhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGNvbnN0IGZsYWdzID0gdGhpcy5fYnVpbGRGbGFncyhzdG9yYWdlRW50cnk/Lm5vVmlldywgc3RvcmFnZUVudHJ5Py5ub1ByaW50KTsKICAgIGxldCByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeT8ucm90YXRpb24sCiAgICAgIHZhbHVlID0gc3RvcmFnZUVudHJ5Py52YWx1ZTsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5idXR0b25WYWx1ZTsKICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdmFsdWUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGxldCBkaWN0ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZGljdCA9IGRpY3QuY2xvbmUoKTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5idXR0b25WYWx1ZTsKICAgIH0KICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGNvbnN0IHhmYSA9IHsKICAgICAgcGF0aDogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgdmFsdWU6IHZhbHVlID8gdGhpcy5kYXRhLmJ1dHRvblZhbHVlIDogIiIKICAgIH07CiAgICBjb25zdCBuYW1lID0gTmFtZS5nZXQodmFsdWUgPyB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgOiAiT2ZmIik7CiAgICBpZiAodmFsdWUpIHsKICAgICAgdGhpcy5zZXRWYWx1ZShkaWN0LCBuYW1lLCBldmFsdWF0b3IueHJlZiwgY2hhbmdlcyk7CiAgICB9CiAgICBkaWN0LnNldCgiQVMiLCBuYW1lKTsKICAgIGRpY3Quc2V0KCJNIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICBpZiAoZmxhZ3MgIT09IHVuZGVmaW5lZCkgewogICAgICBkaWN0LnNldCgiRiIsIGZsYWdzKTsKICAgIH0KICAgIGNvbnN0IG1heWJlTUsgPSB0aGlzLl9nZXRNS0RpY3Qocm90YXRpb24pOwogICAgaWYgKG1heWJlTUspIHsKICAgICAgZGljdC5zZXQoIk1LIiwgbWF5YmVNSyk7CiAgICB9CiAgICBjaGFuZ2VzLnB1dCh0aGlzLnJlZiwgewogICAgICBkYXRhOiBkaWN0LAogICAgICB4ZmEsCiAgICAgIG5lZWRBcHBlYXJhbmNlczogZmFsc2UKICAgIH0pOwogIH0KICBfZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKHBhcmFtcywgdHlwZSkgewogICAgY29uc3QgewogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0CiAgICB9ID0gdGhpczsKICAgIGNvbnN0IGJib3ggPSBbMCwgMCwgd2lkdGgsIGhlaWdodF07CiAgICBjb25zdCBGT05UX1JBVElPID0gMC44OwogICAgY29uc3QgZm9udFNpemUgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAqIEZPTlRfUkFUSU87CiAgICBsZXQgbWV0cmljcywgY2hhcjsKICAgIGlmICh0eXBlID09PSAiY2hlY2siKSB7CiAgICAgIG1ldHJpY3MgPSB7CiAgICAgICAgd2lkdGg6IDAuNzU1ICogZm9udFNpemUsCiAgICAgICAgaGVpZ2h0OiAwLjcwNSAqIGZvbnRTaXplCiAgICAgIH07CiAgICAgIGNoYXIgPSAiXHgzMyI7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJkaXNjIikgewogICAgICBtZXRyaWNzID0gewogICAgICAgIHdpZHRoOiAwLjc5MSAqIGZvbnRTaXplLAogICAgICAgIGhlaWdodDogMC43MDUgKiBmb250U2l6ZQogICAgICB9OwogICAgICBjaGFyID0gIlx4NkMiOwogICAgfSBlbHNlIHsKICAgICAgdW5yZWFjaGFibGUoYF9nZXREZWZhdWx0Q2hlY2tlZEFwcGVhcmFuY2UgLSB1bnN1cHBvcnRlZCB0eXBlOiAke3R5cGV9YCk7CiAgICB9CiAgICBjb25zdCB4U2hpZnQgPSBudW1iZXJUb1N0cmluZygod2lkdGggLSBtZXRyaWNzLndpZHRoKSAvIDIpOwogICAgY29uc3QgeVNoaWZ0ID0gbnVtYmVyVG9TdHJpbmcoKGhlaWdodCAtIG1ldHJpY3MuaGVpZ2h0KSAvIDIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGBxIEJUIC9QZGZKc1phRGIgJHtmb250U2l6ZX0gVGYgMCBnICR7eFNoaWZ0fSAke3lTaGlmdH0gVGQgKCR7Y2hhcn0pIFRqIEVUIFFgOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdChwYXJhbXMueHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgYmJveCk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIk1hdHJpeCIsIFsxLCAwLCAwLCAxLCAwLCAwXSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHBhcmFtcy54cmVmKTsKICAgIGNvbnN0IGZvbnQgPSBuZXcgRGljdChwYXJhbXMueHJlZik7CiAgICBmb250LnNldCgiUGRmSnNaYURiIiwgdGhpcy5mYWxsYmFja0ZvbnREaWN0KTsKICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBuZXcgU3RyaW5nU3RyZWFtKGFwcGVhcmFuY2UpOwogICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZS5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5jaGVja2VkQXBwZWFyYW5jZSk7CiAgfQogIF9wcm9jZXNzQ2hlY2tCb3gocGFyYW1zKSB7CiAgICBjb25zdCBjdXN0b21BcHBlYXJhbmNlID0gcGFyYW1zLmRpY3QuZ2V0KCJBUCIpOwogICAgaWYgKCEoY3VzdG9tQXBwZWFyYW5jZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2UgPSBjdXN0b21BcHBlYXJhbmNlLmdldCgiTiIpOwogICAgaWYgKCEobm9ybWFsQXBwZWFyYW5jZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFzVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUocGFyYW1zLmRpY3QuZ2V0KCJBUyIpKTsKICAgIGlmICh0eXBlb2YgYXNWYWx1ZSA9PT0gInN0cmluZyIpIHsKICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBhc1ZhbHVlOwogICAgfQogICAgY29uc3QgeWVzID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgIT09IG51bGwgJiYgdGhpcy5kYXRhLmZpZWxkVmFsdWUgIT09ICJPZmYiID8gdGhpcy5kYXRhLmZpZWxkVmFsdWUgOiAiWWVzIjsKICAgIGNvbnN0IGV4cG9ydFZhbHVlcyA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0S2V5cygpOwogICAgaWYgKGV4cG9ydFZhbHVlcy5sZW5ndGggPT09IDApIHsKICAgICAgZXhwb3J0VmFsdWVzLnB1c2goIk9mZiIsIHllcyk7CiAgICB9IGVsc2UgaWYgKGV4cG9ydFZhbHVlcy5sZW5ndGggPT09IDEpIHsKICAgICAgaWYgKGV4cG9ydFZhbHVlc1swXSA9PT0gIk9mZiIpIHsKICAgICAgICBleHBvcnRWYWx1ZXMucHVzaCh5ZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGV4cG9ydFZhbHVlcy51bnNoaWZ0KCJPZmYiKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChleHBvcnRWYWx1ZXMuaW5jbHVkZXMoeWVzKSkgewogICAgICBleHBvcnRWYWx1ZXMubGVuZ3RoID0gMDsKICAgICAgZXhwb3J0VmFsdWVzLnB1c2goIk9mZiIsIHllcyk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBvdGhlclllcyA9IGV4cG9ydFZhbHVlcy5maW5kKHYgPT4gdiAhPT0gIk9mZiIpOwogICAgICBleHBvcnRWYWx1ZXMubGVuZ3RoID0gMDsKICAgICAgZXhwb3J0VmFsdWVzLnB1c2goIk9mZiIsIG90aGVyWWVzKTsKICAgIH0KICAgIGlmICghZXhwb3J0VmFsdWVzLmluY2x1ZGVzKHRoaXMuZGF0YS5maWVsZFZhbHVlKSkgewogICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9ICJPZmYiOwogICAgfQogICAgdGhpcy5kYXRhLmV4cG9ydFZhbHVlID0gZXhwb3J0VmFsdWVzWzFdOwogICAgY29uc3QgY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCh0aGlzLmRhdGEuZXhwb3J0VmFsdWUpOwogICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IGNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IGNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGNvbnN0IHVuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCgiT2ZmIik7CiAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSB1bmNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IHVuY2hlY2tlZEFwcGVhcmFuY2UgOiBudWxsOwogICAgaWYgKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpIHsKICAgICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5fZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKHBhcmFtcywgImNoZWNrIik7CiAgICB9CiAgICBpZiAodGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UpOwogICAgfQogICAgdGhpcy5fZmFsbGJhY2tGb250RGljdCA9IHRoaXMuZmFsbGJhY2tGb250RGljdDsKICAgIGlmICh0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgPT09IG51bGwpIHsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlID0gIk9mZiI7CiAgICB9CiAgfQogIF9wcm9jZXNzUmFkaW9CdXR0b24ocGFyYW1zKSB7CiAgICB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSBudWxsOwogICAgY29uc3QgZmllbGRQYXJlbnQgPSBwYXJhbXMuZGljdC5nZXQoIlBhcmVudCIpOwogICAgaWYgKGZpZWxkUGFyZW50IGluc3RhbmNlb2YgRGljdCkgewogICAgICB0aGlzLnBhcmVudCA9IHBhcmFtcy5kaWN0LmdldFJhdygiUGFyZW50Iik7CiAgICAgIGNvbnN0IGZpZWxkUGFyZW50VmFsdWUgPSBmaWVsZFBhcmVudC5nZXQoIlYiKTsKICAgICAgaWYgKGZpZWxkUGFyZW50VmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoZmllbGRQYXJlbnRWYWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGFwcGVhcmFuY2VTdGF0ZXMgPSBwYXJhbXMuZGljdC5nZXQoIkFQIik7CiAgICBpZiAoIShhcHBlYXJhbmNlU3RhdGVzIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZSA9IGFwcGVhcmFuY2VTdGF0ZXMuZ2V0KCJOIik7CiAgICBpZiAoIShub3JtYWxBcHBlYXJhbmNlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBrZXkgb2Ygbm9ybWFsQXBwZWFyYW5jZS5nZXRLZXlzKCkpIHsKICAgICAgaWYgKGtleSAhPT0gIk9mZiIpIHsKICAgICAgICB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoa2V5KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgY29uc3QgY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCh0aGlzLmRhdGEuYnV0dG9uVmFsdWUpOwogICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IGNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IGNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGNvbnN0IHVuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCgiT2ZmIik7CiAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSB1bmNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IHVuY2hlY2tlZEFwcGVhcmFuY2UgOiBudWxsOwogICAgaWYgKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpIHsKICAgICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5fZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKHBhcmFtcywgImRpc2MiKTsKICAgIH0KICAgIGlmICh0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UpIHsKICAgICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSk7CiAgICB9CiAgICB0aGlzLl9mYWxsYmFja0ZvbnREaWN0ID0gdGhpcy5mYWxsYmFja0ZvbnREaWN0OwogICAgaWYgKHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSA9PT0gbnVsbCkgewogICAgICB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgPSAiT2ZmIjsKICAgIH0KICB9CiAgX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcykgewogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICBhbm5vdGF0aW9uR2xvYmFscwogICAgfSA9IHBhcmFtczsKICAgIGlmICghZGljdC5oYXMoIkEiKSAmJiAhZGljdC5oYXMoIkFBIikgJiYgIXRoaXMuZGF0YS5hbHRlcm5hdGl2ZVRleHQpIHsKICAgICAgd2FybigiUHVzaCBidXR0b25zIHdpdGhvdXQgYWN0aW9uIGRpY3Rpb25hcmllcyBhcmUgbm90IHN1cHBvcnRlZCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmRhdGEuaXNUb29sdGlwT25seSA9ICFkaWN0LmhhcygiQSIpICYmICFkaWN0LmhhcygiQUEiKTsKICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7CiAgICAgIGRlc3REaWN0OiBkaWN0LAogICAgICByZXN1bHRPYmo6IHRoaXMuZGF0YSwKICAgICAgZG9jQmFzZVVybDogYW5ub3RhdGlvbkdsb2JhbHMuYmFzZVVybCwKICAgICAgZG9jQXR0YWNobWVudHM6IGFubm90YXRpb25HbG9iYWxzLmF0dGFjaG1lbnRzCiAgICB9KTsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICBsZXQgdHlwZSA9ICJidXR0b24iOwogICAgbGV0IGV4cG9ydFZhbHVlczsKICAgIGlmICh0aGlzLmRhdGEuY2hlY2tCb3gpIHsKICAgICAgdHlwZSA9ICJjaGVja2JveCI7CiAgICAgIGV4cG9ydFZhbHVlcyA9IHRoaXMuZGF0YS5leHBvcnRWYWx1ZTsKICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLnJhZGlvQnV0dG9uKSB7CiAgICAgIHR5cGUgPSAicmFkaW9idXR0b24iOwogICAgICBleHBvcnRWYWx1ZXMgPSB0aGlzLmRhdGEuYnV0dG9uVmFsdWU7CiAgICB9CiAgICByZXR1cm4gewogICAgICBpZDogdGhpcy5kYXRhLmlkLAogICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWUgfHwgIk9mZiIsCiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlLAogICAgICBleHBvcnRWYWx1ZXMsCiAgICAgIGVkaXRhYmxlOiAhdGhpcy5kYXRhLnJlYWRPbmx5LAogICAgICBuYW1lOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCwKICAgICAgaGlkZGVuOiB0aGlzLmRhdGEuaGlkZGVuLAogICAgICBhY3Rpb25zOiB0aGlzLmRhdGEuYWN0aW9ucywKICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuZGF0YS5ib3JkZXJDb2xvciwKICAgICAgZmlsbENvbG9yOiB0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLAogICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbiwKICAgICAgdHlwZQogICAgfTsKICB9CiAgZ2V0IGZhbGxiYWNrRm9udERpY3QoKSB7CiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QoKTsKICAgIGRpY3Quc2V0KCJCYXNlRm9udCIsIE5hbWUuZ2V0KCJaYXBmRGluZ2JhdHMiKSk7CiAgICBkaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSk7CiAgICBkaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSk7CiAgICBkaWN0LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiWmFwZkRpbmdiYXRzRW5jb2RpbmciKSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmYWxsYmFja0ZvbnREaWN0IiwgZGljdCk7CiAgfQp9CmNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmluZGljZXMgPSBkaWN0LmdldEFycmF5KCJJIik7CiAgICB0aGlzLmhhc0luZGljZXMgPSBBcnJheS5pc0FycmF5KHRoaXMuaW5kaWNlcykgJiYgdGhpcy5pbmRpY2VzLmxlbmd0aCA+IDA7CiAgICB0aGlzLmRhdGEub3B0aW9ucyA9IFtdOwogICAgY29uc3Qgb3B0aW9ucyA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0LAogICAgICBrZXk6ICJPcHQiCiAgICB9KTsKICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMpKSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IG9wdGlvbiA9IHhyZWYuZmV0Y2hJZlJlZihvcHRpb25zW2ldKTsKICAgICAgICBjb25zdCBpc09wdGlvbkFycmF5ID0gQXJyYXkuaXNBcnJheShvcHRpb24pOwogICAgICAgIHRoaXMuZGF0YS5vcHRpb25zW2ldID0gewogICAgICAgICAgZXhwb3J0VmFsdWU6IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShpc09wdGlvbkFycmF5ID8geHJlZi5mZXRjaElmUmVmKG9wdGlvblswXSkgOiBvcHRpb24pLAogICAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoaXNPcHRpb25BcnJheSA/IHhyZWYuZmV0Y2hJZlJlZihvcHRpb25bMV0pIDogb3B0aW9uKQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhpcy5oYXNJbmRpY2VzKSB7CiAgICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBbdGhpcy5kYXRhLmZpZWxkVmFsdWVdOwogICAgICB9IGVsc2UgaWYgKCF0aGlzLmRhdGEuZmllbGRWYWx1ZSkgewogICAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gW107CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gW107CiAgICAgIGNvbnN0IGlpID0gdGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoOwogICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5pbmRpY2VzKSB7CiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoaSkgJiYgaSA+PSAwICYmIGkgPCBpaSkgewogICAgICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUucHVzaCh0aGlzLmRhdGEub3B0aW9uc1tpXS5leHBvcnRWYWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoID09PSAwICYmIHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCA+IDApIHsKICAgICAgdGhpcy5kYXRhLm9wdGlvbnMgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZS5tYXAodmFsdWUgPT4gKHsKICAgICAgICBleHBvcnRWYWx1ZTogdmFsdWUsCiAgICAgICAgZGlzcGxheVZhbHVlOiB2YWx1ZQogICAgICB9KSk7CiAgICB9CiAgICB0aGlzLmRhdGEuY29tYm8gPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLkNPTUJPKTsKICAgIHRoaXMuZGF0YS5tdWx0aVNlbGVjdCA9IHRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuTVVMVElTRUxFQ1QpOwogICAgdGhpcy5faGFzVGV4dCA9IHRydWU7CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgY29uc3QgdHlwZSA9IHRoaXMuZGF0YS5jb21ibyA/ICJjb21ib2JveCIgOiAibGlzdGJveCI7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCA+IDAgPyB0aGlzLmRhdGEuZmllbGRWYWx1ZVswXSA6IG51bGw7CiAgICByZXR1cm4gewogICAgICBpZDogdGhpcy5kYXRhLmlkLAogICAgICB2YWx1ZSwKICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUsCiAgICAgIGVkaXRhYmxlOiAhdGhpcy5kYXRhLnJlYWRPbmx5LAogICAgICBuYW1lOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCwKICAgICAgbnVtSXRlbXM6IHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCwKICAgICAgbXVsdGlwbGVTZWxlY3Rpb246IHRoaXMuZGF0YS5tdWx0aVNlbGVjdCwKICAgICAgaGlkZGVuOiB0aGlzLmRhdGEuaGlkZGVuLAogICAgICBhY3Rpb25zOiB0aGlzLmRhdGEuYWN0aW9ucywKICAgICAgaXRlbXM6IHRoaXMuZGF0YS5vcHRpb25zLAogICAgICBwYWdlOiB0aGlzLmRhdGEucGFnZUluZGV4LAogICAgICBzdHJva2VDb2xvcjogdGhpcy5kYXRhLmJvcmRlckNvbG9yLAogICAgICBmaWxsQ29sb3I6IHRoaXMuZGF0YS5iYWNrZ3JvdW5kQ29sb3IsCiAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLAogICAgICB0eXBlCiAgICB9OwogIH0KICBhbWVuZFNhdmVkRGljdChhbm5vdGF0aW9uU3RvcmFnZSwgZGljdCkgewogICAgaWYgKCF0aGlzLmhhc0luZGljZXMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IHZhbHVlcyA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8udmFsdWU7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgewogICAgICB2YWx1ZXMgPSBbdmFsdWVzXTsKICAgIH0KICAgIGNvbnN0IGluZGljZXMgPSBbXTsKICAgIGNvbnN0IHsKICAgICAgb3B0aW9ucwogICAgfSA9IHRoaXMuZGF0YTsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSBvcHRpb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgaWYgKG9wdGlvbnNbaV0uZXhwb3J0VmFsdWUgPT09IHZhbHVlc1tqXSkgewogICAgICAgIGluZGljZXMucHVzaChpKTsKICAgICAgICBqICs9IDE7CiAgICAgIH0KICAgIH0KICAgIGRpY3Quc2V0KCJJIiwgaW5kaWNlcyk7CiAgfQogIGFzeW5jIF9nZXRBcHBlYXJhbmNlKGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKHRoaXMuZGF0YS5jb21ibykgewogICAgICByZXR1cm4gc3VwZXIuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGxldCBleHBvcnRlZFZhbHVlLCByb3RhdGlvbjsKICAgIGNvbnN0IHN0b3JhZ2VFbnRyeSA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGlmIChzdG9yYWdlRW50cnkpIHsKICAgICAgcm90YXRpb24gPSBzdG9yYWdlRW50cnkucm90YXRpb247CiAgICAgIGV4cG9ydGVkVmFsdWUgPSBzdG9yYWdlRW50cnkudmFsdWU7CiAgICB9CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCAmJiBleHBvcnRlZFZhbHVlID09PSB1bmRlZmluZWQgJiYgIXRoaXMuX25lZWRBcHBlYXJhbmNlcykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChleHBvcnRlZFZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgZXhwb3J0ZWRWYWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlOwogICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShleHBvcnRlZFZhbHVlKSkgewogICAgICBleHBvcnRlZFZhbHVlID0gW2V4cG9ydGVkVmFsdWVdOwogICAgfQogICAgY29uc3QgZGVmYXVsdFBhZGRpbmcgPSAxOwogICAgY29uc3QgZGVmYXVsdEhQYWRkaW5nID0gMjsKICAgIGxldCB7CiAgICAgIHdpZHRoOiB0b3RhbFdpZHRoLAogICAgICBoZWlnaHQ6IHRvdGFsSGVpZ2h0CiAgICB9ID0gdGhpczsKICAgIGlmIChyb3RhdGlvbiA9PT0gOTAgfHwgcm90YXRpb24gPT09IDI3MCkgewogICAgICBbdG90YWxXaWR0aCwgdG90YWxIZWlnaHRdID0gW3RvdGFsSGVpZ2h0LCB0b3RhbFdpZHRoXTsKICAgIH0KICAgIGNvbnN0IGxpbmVDb3VudCA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDsKICAgIGNvbnN0IHZhbHVlSW5kaWNlcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewogICAgICBjb25zdCB7CiAgICAgICAgZXhwb3J0VmFsdWUKICAgICAgfSA9IHRoaXMuZGF0YS5vcHRpb25zW2ldOwogICAgICBpZiAoZXhwb3J0ZWRWYWx1ZS5pbmNsdWRlcyhleHBvcnRWYWx1ZSkpIHsKICAgICAgICB2YWx1ZUluZGljZXMucHVzaChpKTsKICAgICAgfQogICAgfQogICAgaWYgKCF0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gcGFyc2VEZWZhdWx0QXBwZWFyYW5jZSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9ICIvSGVsdmV0aWNhIDAgVGYgMCBnIik7CiAgICB9CiAgICBjb25zdCBmb250ID0gYXdhaXQgV2lkZ2V0QW5ub3RhdGlvbi5fZ2V0Rm9udERhdGEoZXZhbHVhdG9yLCB0YXNrLCB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLCB0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMpOwogICAgbGV0IGRlZmF1bHRBcHBlYXJhbmNlOwogICAgbGV0IHsKICAgICAgZm9udFNpemUKICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhOwogICAgaWYgKCFmb250U2l6ZSkgewogICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gKHRvdGFsSGVpZ2h0IC0gZGVmYXVsdFBhZGRpbmcpIC8gbGluZUNvdW50OwogICAgICBsZXQgbGluZVdpZHRoID0gLTE7CiAgICAgIGxldCB2YWx1ZTsKICAgICAgZm9yIChjb25zdCB7CiAgICAgICAgZGlzcGxheVZhbHVlCiAgICAgIH0gb2YgdGhpcy5kYXRhLm9wdGlvbnMpIHsKICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX2dldFRleHRXaWR0aChkaXNwbGF5VmFsdWUsIGZvbnQpOwogICAgICAgIGlmICh3aWR0aCA+IGxpbmVXaWR0aCkgewogICAgICAgICAgbGluZVdpZHRoID0gd2lkdGg7CiAgICAgICAgICB2YWx1ZSA9IGRpc3BsYXlWYWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgW2RlZmF1bHRBcHBlYXJhbmNlLCBmb250U2l6ZV0gPSB0aGlzLl9jb21wdXRlRm9udFNpemUobGluZUhlaWdodCwgdG90YWxXaWR0aCAtIDIgKiBkZWZhdWx0SFBhZGRpbmcsIHZhbHVlLCBmb250LCAtMSk7CiAgICB9IGVsc2UgewogICAgICBkZWZhdWx0QXBwZWFyYW5jZSA9IHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlOwogICAgfQogICAgY29uc3QgbGluZUhlaWdodCA9IGZvbnRTaXplICogTElORV9GQUNUT1I7CiAgICBjb25zdCB2UGFkZGluZyA9IChsaW5lSGVpZ2h0IC0gZm9udFNpemUpIC8gMjsKICAgIGNvbnN0IG51bWJlck9mVmlzaWJsZUxpbmVzID0gTWF0aC5mbG9vcih0b3RhbEhlaWdodCAvIGxpbmVIZWlnaHQpOwogICAgbGV0IGZpcnN0SW5kZXggPSAwOwogICAgaWYgKHZhbHVlSW5kaWNlcy5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IG1pbkluZGV4ID0gTWF0aC5taW4oLi4udmFsdWVJbmRpY2VzKTsKICAgICAgY29uc3QgbWF4SW5kZXggPSBNYXRoLm1heCguLi52YWx1ZUluZGljZXMpOwogICAgICBmaXJzdEluZGV4ID0gTWF0aC5tYXgoMCwgbWF4SW5kZXggLSBudW1iZXJPZlZpc2libGVMaW5lcyArIDEpOwogICAgICBpZiAoZmlyc3RJbmRleCA+IG1pbkluZGV4KSB7CiAgICAgICAgZmlyc3RJbmRleCA9IG1pbkluZGV4OwogICAgICB9CiAgICB9CiAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihmaXJzdEluZGV4ICsgbnVtYmVyT2ZWaXNpYmxlTGluZXMgKyAxLCBsaW5lQ291bnQpOwogICAgY29uc3QgYnVmID0gWyIvVHggQk1DIHEiLCBgMSAxICR7dG90YWxXaWR0aH0gJHt0b3RhbEhlaWdodH0gcmUgVyBuYF07CiAgICBpZiAodmFsdWVJbmRpY2VzLmxlbmd0aCkgewogICAgICBidWYucHVzaCgiMC42MDAwMDYgMC43NTY4NjYgMC44NTQ5MDQgcmciKTsKICAgICAgZm9yIChjb25zdCBpbmRleCBvZiB2YWx1ZUluZGljZXMpIHsKICAgICAgICBpZiAoZmlyc3RJbmRleCA8PSBpbmRleCAmJiBpbmRleCA8IGVuZCkgewogICAgICAgICAgYnVmLnB1c2goYDEgJHt0b3RhbEhlaWdodCAtIChpbmRleCAtIGZpcnN0SW5kZXggKyAxKSAqIGxpbmVIZWlnaHR9ICR7dG90YWxXaWR0aH0gJHtsaW5lSGVpZ2h0fSByZSBmYCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBidWYucHVzaCgiQlQiLCBkZWZhdWx0QXBwZWFyYW5jZSwgYDEgMCAwIDEgMCAke3RvdGFsSGVpZ2h0fSBUbWApOwogICAgY29uc3QgcHJldkluZm8gPSB7CiAgICAgIHNoaWZ0OiAwCiAgICB9OwogICAgZm9yIChsZXQgaSA9IGZpcnN0SW5kZXg7IGkgPCBlbmQ7IGkrKykgewogICAgICBjb25zdCB7CiAgICAgICAgZGlzcGxheVZhbHVlCiAgICAgIH0gPSB0aGlzLmRhdGEub3B0aW9uc1tpXTsKICAgICAgY29uc3QgdnBhZGRpbmcgPSBpID09PSBmaXJzdEluZGV4ID8gdlBhZGRpbmcgOiAwOwogICAgICBidWYucHVzaCh0aGlzLl9yZW5kZXJUZXh0KGRpc3BsYXlWYWx1ZSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIDAsIHByZXZJbmZvLCBkZWZhdWx0SFBhZGRpbmcsIC1saW5lSGVpZ2h0ICsgdnBhZGRpbmcpKTsKICAgIH0KICAgIGJ1Zi5wdXNoKCJFVCBRIEVNQyIpOwogICAgcmV0dXJuIGJ1Zi5qb2luKCJcbiIpOwogIH0KfQpjbGFzcyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBudWxsOwogICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRoaXMuZGF0YS5ub1JvdGF0ZTsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSAhdGhpcy5kYXRhLmhhc093bkNhbnZhczsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICByZXR1cm4gewogICAgICBpZDogdGhpcy5kYXRhLmlkLAogICAgICB2YWx1ZTogbnVsbCwKICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgdHlwZTogInNpZ25hdHVyZSIKICAgIH07CiAgfQp9CmNsYXNzIFRleHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBjb25zdCBERUZBVUxUX0lDT05fU0laRSA9IDIyOwogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5ub1JvdGF0ZSA9IHRydWU7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgY29uc3QgewogICAgICBkaWN0CiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuVEVYVDsKICAgIGlmICh0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEubmFtZSA9ICJOb0ljb24iOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnJlY3RbMV0gPSB0aGlzLmRhdGEucmVjdFszXSAtIERFRkFVTFRfSUNPTl9TSVpFOwogICAgICB0aGlzLmRhdGEucmVjdFsyXSA9IHRoaXMuZGF0YS5yZWN0WzBdICsgREVGQVVMVF9JQ09OX1NJWkU7CiAgICAgIHRoaXMuZGF0YS5uYW1lID0gZGljdC5oYXMoIk5hbWUiKSA/IGRpY3QuZ2V0KCJOYW1lIikubmFtZSA6ICJOb3RlIjsKICAgIH0KICAgIGlmIChkaWN0LmhhcygiU3RhdGUiKSkgewogICAgICB0aGlzLmRhdGEuc3RhdGUgPSBkaWN0LmdldCgiU3RhdGUiKSB8fCBudWxsOwogICAgICB0aGlzLmRhdGEuc3RhdGVNb2RlbCA9IGRpY3QuZ2V0KCJTdGF0ZU1vZGVsIikgfHwgbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5zdGF0ZSA9IG51bGw7CiAgICAgIHRoaXMuZGF0YS5zdGF0ZU1vZGVsID0gbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgTGlua0Fubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIGFubm90YXRpb25HbG9iYWxzCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuTElOSzsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSBmYWxzZTsKICAgIGNvbnN0IHF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKGRpY3QsIHRoaXMucmVjdGFuZ2xlKTsKICAgIGlmIChxdWFkUG9pbnRzKSB7CiAgICAgIHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gcXVhZFBvaW50czsKICAgIH0KICAgIHRoaXMuZGF0YS5ib3JkZXJDb2xvciB8fD0gdGhpcy5kYXRhLmNvbG9yOwogICAgQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKICAgICAgZGVzdERpY3Q6IGRpY3QsCiAgICAgIHJlc3VsdE9iajogdGhpcy5kYXRhLAogICAgICBkb2NCYXNlVXJsOiBhbm5vdGF0aW9uR2xvYmFscy5iYXNlVXJsLAogICAgICBkb2NBdHRhY2htZW50czogYW5ub3RhdGlvbkdsb2JhbHMuYXR0YWNobWVudHMKICAgIH0pOwogIH0KfQpjbGFzcyBQb3B1cEFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5QT1BVUDsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSBmYWxzZTsKICAgIGlmICh0aGlzLndpZHRoID09PSAwIHx8IHRoaXMuaGVpZ2h0ID09PSAwKSB7CiAgICAgIHRoaXMuZGF0YS5yZWN0ID0gbnVsbDsKICAgIH0KICAgIGxldCBwYXJlbnRJdGVtID0gZGljdC5nZXQoIlBhcmVudCIpOwogICAgaWYgKCFwYXJlbnRJdGVtKSB7CiAgICAgIHdhcm4oIlBvcHVwIGFubm90YXRpb24gaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIHBhcmVudCBhbm5vdGF0aW9uLiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmRhdGEucGFyZW50UmVjdCA9IGxvb2t1cE5vcm1hbFJlY3QocGFyZW50SXRlbS5nZXRBcnJheSgiUmVjdCIpLCBudWxsKTsKICAgIGNvbnN0IHJ0ID0gcGFyZW50SXRlbS5nZXQoIlJUIik7CiAgICBpZiAoaXNOYW1lKHJ0LCBBbm5vdGF0aW9uUmVwbHlUeXBlLkdST1VQKSkgewogICAgICBwYXJlbnRJdGVtID0gcGFyZW50SXRlbS5nZXQoIklSVCIpOwogICAgfQogICAgaWYgKCFwYXJlbnRJdGVtLmhhcygiTSIpKSB7CiAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShwYXJlbnRJdGVtLmdldCgiTSIpKTsKICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSB0aGlzLm1vZGlmaWNhdGlvbkRhdGU7CiAgICB9CiAgICBpZiAoIXBhcmVudEl0ZW0uaGFzKCJDIikpIHsKICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc2V0Q29sb3IocGFyZW50SXRlbS5nZXRBcnJheSgiQyIpKTsKICAgICAgdGhpcy5kYXRhLmNvbG9yID0gdGhpcy5jb2xvcjsKICAgIH0KICAgIGlmICghdGhpcy52aWV3YWJsZSkgewogICAgICBjb25zdCBwYXJlbnRGbGFncyA9IHBhcmVudEl0ZW0uZ2V0KCJGIik7CiAgICAgIGlmICh0aGlzLl9pc1ZpZXdhYmxlKHBhcmVudEZsYWdzKSkgewogICAgICAgIHRoaXMuc2V0RmxhZ3MocGFyZW50RmxhZ3MpOwogICAgICB9CiAgICB9CiAgICB0aGlzLnNldFRpdGxlKHBhcmVudEl0ZW0uZ2V0KCJUIikpOwogICAgdGhpcy5kYXRhLnRpdGxlT2JqID0gdGhpcy5fdGl0bGU7CiAgICB0aGlzLnNldENvbnRlbnRzKHBhcmVudEl0ZW0uZ2V0KCJDb250ZW50cyIpKTsKICAgIHRoaXMuZGF0YS5jb250ZW50c09iaiA9IHRoaXMuX2NvbnRlbnRzOwogICAgaWYgKHBhcmVudEl0ZW0uaGFzKCJSQyIpKSB7CiAgICAgIHRoaXMuZGF0YS5yaWNoVGV4dCA9IFhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwocGFyZW50SXRlbS5nZXQoIlJDIikpOwogICAgfQogICAgdGhpcy5kYXRhLm9wZW4gPSAhIWRpY3QuZ2V0KCJPcGVuIik7CiAgfQp9CmNsYXNzIEZyZWVUZXh0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEuaXNFZGl0YWJsZSA9ICF0aGlzLmRhdGEubm9IVE1MOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgY29uc3QgewogICAgICBhbm5vdGF0aW9uR2xvYmFscywKICAgICAgZXZhbHVhdG9yT3B0aW9ucywKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkZSRUVURVhUOwogICAgdGhpcy5zZXREZWZhdWx0QXBwZWFyYW5jZShwYXJhbXMpOwogICAgdGhpcy5faGFzQXBwZWFyYW5jZSA9ICEhdGhpcy5hcHBlYXJhbmNlOwogICAgaWYgKHRoaXMuX2hhc0FwcGVhcmFuY2UpIHsKICAgICAgY29uc3QgewogICAgICAgIGZvbnRDb2xvciwKICAgICAgICBmb250U2l6ZQogICAgICB9ID0gcGFyc2VBcHBlYXJhbmNlU3RyZWFtKHRoaXMuYXBwZWFyYW5jZSwgZXZhbHVhdG9yT3B0aW9ucywgeHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlKTsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250Q29sb3IgPSBmb250Q29sb3I7CiAgICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemUgPSBmb250U2l6ZSB8fCAxMDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemUgfHw9IDEwOwogICAgICBjb25zdCB7CiAgICAgICAgZm9udENvbG9yLAogICAgICAgIGZvbnRTaXplCiAgICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhOwogICAgICBpZiAodGhpcy5fY29udGVudHMuc3RyKSB7CiAgICAgICAgdGhpcy5kYXRhLnRleHRDb250ZW50ID0gdGhpcy5fY29udGVudHMuc3RyLnNwbGl0KC9cclxuP3xcbi8pLm1hcChsaW5lID0+IGxpbmUudHJpbUVuZCgpKTsKICAgICAgICBjb25zdCB7CiAgICAgICAgICBjb29yZHMsCiAgICAgICAgICBiYm94LAogICAgICAgICAgbWF0cml4CiAgICAgICAgfSA9IEZha2VVbmljb2RlRm9udC5nZXRGaXJzdFBvc2l0aW9uSW5mbyh0aGlzLnJlY3RhbmdsZSwgdGhpcy5yb3RhdGlvbiwgZm9udFNpemUpOwogICAgICAgIHRoaXMuZGF0YS50ZXh0UG9zaXRpb24gPSB0aGlzLl90cmFuc2Zvcm1Qb2ludChjb29yZHMsIGJib3gsIG1hdHJpeCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBwYXJhbXMuZGljdC5nZXQoIkNBIik7CiAgICAgICAgY29uc3QgZmFrZVVuaWNvZGVGb250ID0gbmV3IEZha2VVbmljb2RlRm9udCh4cmVmLCAic2Fucy1zZXJpZiIpOwogICAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IGZha2VVbmljb2RlRm9udC5jcmVhdGVBcHBlYXJhbmNlKHRoaXMuX2NvbnRlbnRzLnN0ciwgdGhpcy5yZWN0YW5nbGUsIHRoaXMucm90YXRpb24sIGZvbnRTaXplLCBmb250Q29sb3IsIHN0cm9rZUFscGhhKTsKICAgICAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5hcHBlYXJhbmNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3YXJuKCJGcmVlVGV4dEFubm90YXRpb246IE9mZnNjcmVlbkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkLCBhbm5vdGF0aW9uIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseS4iKTsKICAgICAgfQogICAgfQogIH0KICBnZXQgaGFzVGV4dENvbnRlbnQoKSB7CiAgICByZXR1cm4gdGhpcy5faGFzQXBwZWFyYW5jZTsKICB9CiAgc3RhdGljIGNyZWF0ZU5ld0RpY3QoYW5ub3RhdGlvbiwgeHJlZiwgewogICAgYXBSZWYsCiAgICBhcAogIH0pIHsKICAgIGNvbnN0IHsKICAgICAgY29sb3IsCiAgICAgIGZvbnRTaXplLAogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdXNlciwKICAgICAgdmFsdWUKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgZnJlZXRleHQgPSBvbGRBbm5vdGF0aW9uIHx8IG5ldyBEaWN0KHhyZWYpOwogICAgZnJlZXRleHQuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkFubm90IikpOwogICAgZnJlZXRleHQuc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZyZWVUZXh0IikpOwogICAgaWYgKG9sZEFubm90YXRpb24pIHsKICAgICAgZnJlZXRleHQuc2V0KCJNIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICAgIGZyZWV0ZXh0LmRlbGV0ZSgiUkMiKTsKICAgIH0gZWxzZSB7CiAgICAgIGZyZWV0ZXh0LnNldCgiQ3JlYXRpb25EYXRlIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICB9CiAgICBmcmVldGV4dC5zZXQoIlJlY3QiLCByZWN0KTsKICAgIGNvbnN0IGRhID0gYC9IZWx2ICR7Zm9udFNpemV9IFRmICR7Z2V0UGRmQ29sb3IoY29sb3IsIHRydWUpfWA7CiAgICBmcmVldGV4dC5zZXQoIkRBIiwgZGEpOwogICAgZnJlZXRleHQuc2V0KCJDb250ZW50cyIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUodmFsdWUpKTsKICAgIGZyZWV0ZXh0LnNldCgiRiIsIDQpOwogICAgZnJlZXRleHQuc2V0KCJCb3JkZXIiLCBbMCwgMCwgMF0pOwogICAgZnJlZXRleHQuc2V0KCJSb3RhdGUiLCByb3RhdGlvbik7CiAgICBpZiAodXNlcikgewogICAgICBmcmVldGV4dC5zZXQoIlQiLCBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHVzZXIpKTsKICAgIH0KICAgIGlmIChhcFJlZiB8fCBhcCkgewogICAgICBjb25zdCBuID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGZyZWV0ZXh0LnNldCgiQVAiLCBuKTsKICAgICAgaWYgKGFwUmVmKSB7CiAgICAgICAgbi5zZXQoIk4iLCBhcFJlZik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbi5zZXQoIk4iLCBhcCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmcmVldGV4dDsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0oYW5ub3RhdGlvbiwgeHJlZiwgcGFyYW1zKSB7CiAgICBjb25zdCB7CiAgICAgIGJhc2VGb250UmVmLAogICAgICBldmFsdWF0b3IsCiAgICAgIHRhc2sKICAgIH0gPSBwYXJhbXM7CiAgICBjb25zdCB7CiAgICAgIGNvbG9yLAogICAgICBmb250U2l6ZSwKICAgICAgcmVjdCwKICAgICAgcm90YXRpb24sCiAgICAgIHZhbHVlCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgZm9udCA9IG5ldyBEaWN0KHhyZWYpOwogICAgaWYgKGJhc2VGb250UmVmKSB7CiAgICAgIGZvbnQuc2V0KCJIZWx2IiwgYmFzZUZvbnRSZWYpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgYmFzZUZvbnQgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgYmFzZUZvbnQuc2V0KCJCYXNlRm9udCIsIE5hbWUuZ2V0KCJIZWx2ZXRpY2EiKSk7CiAgICAgIGJhc2VGb250LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGb250IikpOwogICAgICBiYXNlRm9udC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiVHlwZTEiKSk7CiAgICAgIGJhc2VGb250LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpOwogICAgICBmb250LnNldCgiSGVsdiIsIGJhc2VGb250KTsKICAgIH0KICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIGNvbnN0IGhlbHYgPSBhd2FpdCBXaWRnZXRBbm5vdGF0aW9uLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIHsKICAgICAgZm9udE5hbWU6ICJIZWx2IiwKICAgICAgZm9udFNpemUKICAgIH0sIHJlc291cmNlcyk7CiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gcmVjdDsKICAgIGxldCB3ID0geDIgLSB4MTsKICAgIGxldCBoID0geTIgLSB5MTsKICAgIGlmIChyb3RhdGlvbiAlIDE4MCAhPT0gMCkgewogICAgICBbdywgaF0gPSBbaCwgd107CiAgICB9CiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KCJcbiIpOwogICAgY29uc3Qgc2NhbGUgPSBmb250U2l6ZSAvIDEwMDA7CiAgICBsZXQgdG90YWxXaWR0aCA9IC1JbmZpbml0eTsKICAgIGNvbnN0IGVuY29kZWRMaW5lcyA9IFtdOwogICAgZm9yIChsZXQgbGluZSBvZiBsaW5lcykgewogICAgICBjb25zdCBlbmNvZGVkID0gaGVsdi5lbmNvZGVTdHJpbmcobGluZSk7CiAgICAgIGlmIChlbmNvZGVkLmxlbmd0aCA+IDEpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBsaW5lID0gZW5jb2RlZC5qb2luKCIiKTsKICAgICAgZW5jb2RlZExpbmVzLnB1c2gobGluZSk7CiAgICAgIGxldCBsaW5lV2lkdGggPSAwOwogICAgICBjb25zdCBnbHlwaHMgPSBoZWx2LmNoYXJzVG9HbHlwaHMobGluZSk7CiAgICAgIGZvciAoY29uc3QgZ2x5cGggb2YgZ2x5cGhzKSB7CiAgICAgICAgbGluZVdpZHRoICs9IGdseXBoLndpZHRoICogc2NhbGU7CiAgICAgIH0KICAgICAgdG90YWxXaWR0aCA9IE1hdGgubWF4KHRvdGFsV2lkdGgsIGxpbmVXaWR0aCk7CiAgICB9CiAgICBsZXQgaHNjYWxlID0gMTsKICAgIGlmICh0b3RhbFdpZHRoID4gdykgewogICAgICBoc2NhbGUgPSB3IC8gdG90YWxXaWR0aDsKICAgIH0KICAgIGxldCB2c2NhbGUgPSAxOwogICAgY29uc3QgbGluZUhlaWdodCA9IExJTkVfRkFDVE9SICogZm9udFNpemU7CiAgICBjb25zdCBsaW5lQXNjZW50ID0gKExJTkVfRkFDVE9SIC0gTElORV9ERVNDRU5UX0ZBQ1RPUikgKiBmb250U2l6ZTsKICAgIGNvbnN0IHRvdGFsSGVpZ2h0ID0gbGluZUhlaWdodCAqIGxpbmVzLmxlbmd0aDsKICAgIGlmICh0b3RhbEhlaWdodCA+IGgpIHsKICAgICAgdnNjYWxlID0gaCAvIHRvdGFsSGVpZ2h0OwogICAgfQogICAgY29uc3QgZnNjYWxlID0gTWF0aC5taW4oaHNjYWxlLCB2c2NhbGUpOwogICAgY29uc3QgbmV3Rm9udFNpemUgPSBmb250U2l6ZSAqIGZzY2FsZTsKICAgIGxldCBmaXJzdFBvaW50LCBjbGlwQm94LCBtYXRyaXg7CiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBtYXRyaXggPSBbMSwgMCwgMCwgMV07CiAgICAgICAgY2xpcEJveCA9IFtyZWN0WzBdLCByZWN0WzFdLCB3LCBoXTsKICAgICAgICBmaXJzdFBvaW50ID0gW3JlY3RbMF0sIHJlY3RbM10gLSBsaW5lQXNjZW50XTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA5MDoKICAgICAgICBtYXRyaXggPSBbMCwgMSwgLTEsIDBdOwogICAgICAgIGNsaXBCb3ggPSBbcmVjdFsxXSwgLXJlY3RbMl0sIHcsIGhdOwogICAgICAgIGZpcnN0UG9pbnQgPSBbcmVjdFsxXSwgLXJlY3RbMF0gLSBsaW5lQXNjZW50XTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAxODA6CiAgICAgICAgbWF0cml4ID0gWy0xLCAwLCAwLCAtMV07CiAgICAgICAgY2xpcEJveCA9IFstcmVjdFsyXSwgLXJlY3RbM10sIHcsIGhdOwogICAgICAgIGZpcnN0UG9pbnQgPSBbLXJlY3RbMl0sIC1yZWN0WzFdIC0gbGluZUFzY2VudF07CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjcwOgogICAgICAgIG1hdHJpeCA9IFswLCAtMSwgMSwgMF07CiAgICAgICAgY2xpcEJveCA9IFstcmVjdFszXSwgcmVjdFswXSwgdywgaF07CiAgICAgICAgZmlyc3RQb2ludCA9IFstcmVjdFszXSwgcmVjdFsyXSAtIGxpbmVBc2NlbnRdOwogICAgICAgIGJyZWFrOwogICAgfQogICAgY29uc3QgYnVmZmVyID0gWyJxIiwgYCR7bWF0cml4LmpvaW4oIiAiKX0gMCAwIGNtYCwgYCR7Y2xpcEJveC5qb2luKCIgIil9IHJlIFcgbmAsIGBCVGAsIGAke2dldFBkZkNvbG9yKGNvbG9yLCB0cnVlKX1gLCBgMCBUYyAvSGVsdiAke251bWJlclRvU3RyaW5nKG5ld0ZvbnRTaXplKX0gVGZgXTsKICAgIGJ1ZmZlci5wdXNoKGAke2ZpcnN0UG9pbnQuam9pbigiICIpfSBUZCAoJHtlc2NhcGVTdHJpbmcoZW5jb2RlZExpbmVzWzBdKX0pIFRqYCk7CiAgICBjb25zdCB2U2hpZnQgPSBudW1iZXJUb1N0cmluZyhsaW5lSGVpZ2h0KTsKICAgIGZvciAobGV0IGkgPSAxLCBpaSA9IGVuY29kZWRMaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGxpbmUgPSBlbmNvZGVkTGluZXNbaV07CiAgICAgIGJ1ZmZlci5wdXNoKGAwIC0ke3ZTaGlmdH0gVGQgKCR7ZXNjYXBlU3RyaW5nKGxpbmUpfSkgVGpgKTsKICAgIH0KICAgIGJ1ZmZlci5wdXNoKCJFVCIsICJRIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYnVmZmVyLmpvaW4oIlxuIik7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJGb3JtVHlwZSIsIDEpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiWE9iamVjdCIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiQkJveCIsIHJlY3QpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJSZXNvdXJjZXMiLCByZXNvdXJjZXMpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJNYXRyaXgiLCBbMSwgMCwgMCwgMSwgLXJlY3RbMF0sIC1yZWN0WzFdXSk7CiAgICBjb25zdCBhcCA9IG5ldyBTdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICBhcC5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICByZXR1cm4gYXA7CiAgfQp9CmNsYXNzIExpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuTElORTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBjb25zdCBsaW5lQ29vcmRpbmF0ZXMgPSBsb29rdXBSZWN0KGRpY3QuZ2V0QXJyYXkoIkwiKSwgWzAsIDAsIDAsIDBdKTsKICAgIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXMgPSBVdGlsLm5vcm1hbGl6ZVJlY3QobGluZUNvb3JkaW5hdGVzKTsKICAgIHRoaXMuc2V0TGluZUVuZGluZ3MoZGljdC5nZXRBcnJheSgiTEUiKSk7CiAgICB0aGlzLmRhdGEubGluZUVuZGluZ3MgPSB0aGlzLmxpbmVFbmRpbmdzOwogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgY29uc3QgaW50ZXJpb3JDb2xvciA9IGdldFJnYkNvbG9yKGRpY3QuZ2V0QXJyYXkoIklDIiksIG51bGwpOwogICAgICBjb25zdCBmaWxsQ29sb3IgPSBpbnRlcmlvckNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheShpbnRlcmlvckNvbG9yKSA6IG51bGw7CiAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGZpbGxDb2xvciA/IHN0cm9rZUFscGhhIDogbnVsbDsKICAgICAgY29uc3QgYm9yZGVyV2lkdGggPSB0aGlzLmJvcmRlclN0eWxlLndpZHRoIHx8IDEsCiAgICAgICAgYm9yZGVyQWRqdXN0ID0gMiAqIGJvcmRlcldpZHRoOwogICAgICBjb25zdCBiYm94ID0gW3RoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMF0gLSBib3JkZXJBZGp1c3QsIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMV0gLSBib3JkZXJBZGp1c3QsIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMl0gKyBib3JkZXJBZGp1c3QsIHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbM10gKyBib3JkZXJBZGp1c3RdOwogICAgICBpZiAoIVV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLCBiYm94KSkgewogICAgICAgIHRoaXMucmVjdGFuZ2xlID0gYmJveDsKICAgICAgfQogICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBleHRyYTogYCR7Ym9yZGVyV2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIGZpbGxDb2xvciwKICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgYnVmZmVyLnB1c2goYCR7bGluZUNvb3JkaW5hdGVzWzBdfSAke2xpbmVDb29yZGluYXRlc1sxXX0gbWAsIGAke2xpbmVDb29yZGluYXRlc1syXX0gJHtsaW5lQ29vcmRpbmF0ZXNbM119IGxgLCAiUyIpOwogICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0gLSBib3JkZXJXaWR0aCwgcG9pbnRzWzddIC0gYm9yZGVyV2lkdGgsIHBvaW50c1syXSArIGJvcmRlcldpZHRoLCBwb2ludHNbM10gKyBib3JkZXJXaWR0aF07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn0KY2xhc3MgU3F1YXJlQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlNRVUFSRTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBpbnRlcmlvckNvbG9yID0gZ2V0UmdiQ29sb3IoZGljdC5nZXRBcnJheSgiSUMiKSwgbnVsbCk7CiAgICAgIGNvbnN0IGZpbGxDb2xvciA9IGludGVyaW9yQ29sb3IgPyBnZXRQZGZDb2xvckFycmF5KGludGVyaW9yQ29sb3IpIDogbnVsbDsKICAgICAgY29uc3QgZmlsbEFscGhhID0gZmlsbENvbG9yID8gc3Ryb2tlQWxwaGEgOiBudWxsOwogICAgICBpZiAodGhpcy5ib3JkZXJTdHlsZS53aWR0aCA9PT0gMCAmJiAhZmlsbENvbG9yKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICB4cmVmLAogICAgICAgIGV4dHJhOiBgJHt0aGlzLmJvcmRlclN0eWxlLndpZHRofSB3YCwKICAgICAgICBzdHJva2VDb2xvciwKICAgICAgICBmaWxsQ29sb3IsCiAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgZmlsbEFscGhhLAogICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgIGNvbnN0IHggPSBwb2ludHNbNF0gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHkgPSBwb2ludHNbNV0gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHdpZHRoID0gcG9pbnRzWzZdIC0gcG9pbnRzWzRdIC0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aDsKICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHBvaW50c1szXSAtIHBvaW50c1s3XSAtIHRoaXMuYm9yZGVyU3R5bGUud2lkdGg7CiAgICAgICAgICBidWZmZXIucHVzaChgJHt4fSAke3l9ICR7d2lkdGh9ICR7aGVpZ2h0fSByZWApOwogICAgICAgICAgaWYgKGZpbGxDb2xvcikgewogICAgICAgICAgICBidWZmZXIucHVzaCgiQiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goIlMiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLCBwb2ludHNbN10sIHBvaW50c1syXSwgcG9pbnRzWzNdXTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KfQpjbGFzcyBDaXJjbGVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuQ0lSQ0xFOwogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgY29uc3QgaW50ZXJpb3JDb2xvciA9IGdldFJnYkNvbG9yKGRpY3QuZ2V0QXJyYXkoIklDIiksIG51bGwpOwogICAgICBjb25zdCBmaWxsQ29sb3IgPSBpbnRlcmlvckNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheShpbnRlcmlvckNvbG9yKSA6IG51bGw7CiAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGZpbGxDb2xvciA/IHN0cm9rZUFscGhhIDogbnVsbDsKICAgICAgaWYgKHRoaXMuYm9yZGVyU3R5bGUud2lkdGggPT09IDAgJiYgIWZpbGxDb2xvcikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBjb250cm9sUG9pbnRzRGlzdGFuY2UgPSA0IC8gMyAqIE1hdGgudGFuKE1hdGguUEkgLyAoMiAqIDQpKTsKICAgICAgdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2UoewogICAgICAgIHhyZWYsCiAgICAgICAgZXh0cmE6IGAke3RoaXMuYm9yZGVyU3R5bGUud2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIGZpbGxDb2xvciwKICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgY29uc3QgeDAgPSBwb2ludHNbMF0gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHkwID0gcG9pbnRzWzFdIC0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aCAvIDI7CiAgICAgICAgICBjb25zdCB4MSA9IHBvaW50c1s2XSAtIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3QgeTEgPSBwb2ludHNbN10gKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHhNaWQgPSB4MCArICh4MSAtIHgwKSAvIDI7CiAgICAgICAgICBjb25zdCB5TWlkID0geTAgKyAoeTEgLSB5MCkgLyAyOwogICAgICAgICAgY29uc3QgeE9mZnNldCA9ICh4MSAtIHgwKSAvIDIgKiBjb250cm9sUG9pbnRzRGlzdGFuY2U7CiAgICAgICAgICBjb25zdCB5T2Zmc2V0ID0gKHkxIC0geTApIC8gMiAqIGNvbnRyb2xQb2ludHNEaXN0YW5jZTsKICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3hNaWR9ICR7eTF9IG1gLCBgJHt4TWlkICsgeE9mZnNldH0gJHt5MX0gJHt4MX0gJHt5TWlkICsgeU9mZnNldH0gJHt4MX0gJHt5TWlkfSBjYCwgYCR7eDF9ICR7eU1pZCAtIHlPZmZzZXR9ICR7eE1pZCArIHhPZmZzZXR9ICR7eTB9ICR7eE1pZH0gJHt5MH0gY2AsIGAke3hNaWQgLSB4T2Zmc2V0fSAke3kwfSAke3gwfSAke3lNaWQgLSB5T2Zmc2V0fSAke3gwfSAke3lNaWR9IGNgLCBgJHt4MH0gJHt5TWlkICsgeU9mZnNldH0gJHt4TWlkIC0geE9mZnNldH0gJHt5MX0gJHt4TWlkfSAke3kxfSBjYCwgImgiKTsKICAgICAgICAgIGlmIChmaWxsQ29sb3IpIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goIkIiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKCJTIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gW3BvaW50c1swXSwgcG9pbnRzWzddLCBwb2ludHNbMl0sIHBvaW50c1szXV07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn0KY2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgdGhpcy5kYXRhLnZlcnRpY2VzID0gbnVsbDsKICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQb2x5Z29uQW5ub3RhdGlvbikpIHsKICAgICAgdGhpcy5zZXRMaW5lRW5kaW5ncyhkaWN0LmdldEFycmF5KCJMRSIpKTsKICAgICAgdGhpcy5kYXRhLmxpbmVFbmRpbmdzID0gdGhpcy5saW5lRW5kaW5nczsKICAgIH0KICAgIGNvbnN0IHJhd1ZlcnRpY2VzID0gZGljdC5nZXRBcnJheSgiVmVydGljZXMiKTsKICAgIGlmICghaXNOdW1iZXJBcnJheShyYXdWZXJ0aWNlcywgbnVsbCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdmVydGljZXMgPSB0aGlzLmRhdGEudmVydGljZXMgPSBGbG9hdDMyQXJyYXkuZnJvbShyYXdWZXJ0aWNlcyk7CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuYm9yZGVyU3R5bGUud2lkdGggfHwgMSwKICAgICAgICBib3JkZXJBZGp1c3QgPSAyICogYm9yZGVyV2lkdGg7CiAgICAgIGNvbnN0IGJib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICBVdGlsLnJlY3RCb3VuZGluZ0JveCh2ZXJ0aWNlc1tpXSAtIGJvcmRlckFkanVzdCwgdmVydGljZXNbaSArIDFdIC0gYm9yZGVyQWRqdXN0LCB2ZXJ0aWNlc1tpXSArIGJvcmRlckFkanVzdCwgdmVydGljZXNbaSArIDFdICsgYm9yZGVyQWRqdXN0LCBiYm94KTsKICAgICAgfQogICAgICBpZiAoIVV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLCBiYm94KSkgewogICAgICAgIHRoaXMucmVjdGFuZ2xlID0gYmJveDsKICAgICAgfQogICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBleHRyYTogYCR7Ym9yZGVyV2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIHN0cm9rZUFscGhhLAogICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7dmVydGljZXNbaV19ICR7dmVydGljZXNbaSArIDFdfSAke2kgPT09IDAgPyAibSIgOiAibCJ9YCk7CiAgICAgICAgICB9CiAgICAgICAgICBidWZmZXIucHVzaCgiUyIpOwogICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0sIHBvaW50c1s3XSwgcG9pbnRzWzJdLCBwb2ludHNbM11dOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQp9CmNsYXNzIFBvbHlnb25Bbm5vdGF0aW9uIGV4dGVuZHMgUG9seWxpbmVBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5QT0xZR09OOwogIH0KfQpjbGFzcyBDYXJldEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5DQVJFVDsKICB9Cn0KY2xhc3MgSW5rQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5JTks7CiAgICB0aGlzLmRhdGEuaW5rTGlzdHMgPSBbXTsKICAgIHRoaXMuZGF0YS5pc0VkaXRhYmxlID0gIXRoaXMuZGF0YS5ub0hUTUw7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEub3BhY2l0eSA9IGRpY3QuZ2V0KCJDQSIpIHx8IDE7CiAgICBjb25zdCByYXdJbmtMaXN0cyA9IGRpY3QuZ2V0QXJyYXkoIklua0xpc3QiKTsKICAgIGlmICghQXJyYXkuaXNBcnJheShyYXdJbmtMaXN0cykpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcmF3SW5rTGlzdHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmF3SW5rTGlzdHNbaV0pKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaW5rTGlzdCA9IG5ldyBGbG9hdDMyQXJyYXkocmF3SW5rTGlzdHNbaV0ubGVuZ3RoKTsKICAgICAgdGhpcy5kYXRhLmlua0xpc3RzLnB1c2goaW5rTGlzdCk7CiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJhd0lua0xpc3RzW2ldLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHsKICAgICAgICBjb25zdCB4ID0geHJlZi5mZXRjaElmUmVmKHJhd0lua0xpc3RzW2ldW2pdKSwKICAgICAgICAgIHkgPSB4cmVmLmZldGNoSWZSZWYocmF3SW5rTGlzdHNbaV1baiArIDFdKTsKICAgICAgICBpZiAodHlwZW9mIHggPT09ICJudW1iZXIiICYmIHR5cGVvZiB5ID09PSAibnVtYmVyIikgewogICAgICAgICAgaW5rTGlzdFtqXSA9IHg7CiAgICAgICAgICBpbmtMaXN0W2ogKyAxXSA9IHk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuYm9yZGVyU3R5bGUud2lkdGggfHwgMSwKICAgICAgICBib3JkZXJBZGp1c3QgPSAyICogYm9yZGVyV2lkdGg7CiAgICAgIGNvbnN0IGJib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07CiAgICAgIGZvciAoY29uc3QgaW5rTGlzdCBvZiB0aGlzLmRhdGEuaW5rTGlzdHMpIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbmtMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICAgIFV0aWwucmVjdEJvdW5kaW5nQm94KGlua0xpc3RbaV0gLSBib3JkZXJBZGp1c3QsIGlua0xpc3RbaSArIDFdIC0gYm9yZGVyQWRqdXN0LCBpbmtMaXN0W2ldICsgYm9yZGVyQWRqdXN0LCBpbmtMaXN0W2kgKyAxXSArIGJvcmRlckFkanVzdCwgYmJveCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghVXRpbC5pbnRlcnNlY3QodGhpcy5yZWN0YW5nbGUsIGJib3gpKSB7CiAgICAgICAgdGhpcy5yZWN0YW5nbGUgPSBiYm94OwogICAgICB9CiAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICB4cmVmLAogICAgICAgIGV4dHJhOiBgJHtib3JkZXJXaWR0aH0gd2AsCiAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgZm9yIChjb25zdCBpbmtMaXN0IG9mIHRoaXMuZGF0YS5pbmtMaXN0cykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbmtMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICAgICAgICBidWZmZXIucHVzaChgJHtpbmtMaXN0W2ldfSAke2lua0xpc3RbaSArIDFdfSAke2kgPT09IDAgPyAibSIgOiAibCJ9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnVmZmVyLnB1c2goIlMiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLCBwb2ludHNbN10sIHBvaW50c1syXSwgcG9pbnRzWzNdXTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KICBzdGF0aWMgY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7CiAgICBhcFJlZiwKICAgIGFwCiAgfSkgewogICAgY29uc3QgewogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICBjb2xvciwKICAgICAgb3BhY2l0eSwKICAgICAgcGF0aHMsCiAgICAgIG91dGxpbmVzLAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdGhpY2tuZXNzLAogICAgICB1c2VyCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IGluayA9IG9sZEFubm90YXRpb24gfHwgbmV3IERpY3QoeHJlZik7CiAgICBpbmsuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkFubm90IikpOwogICAgaW5rLnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJJbmsiKSk7CiAgICBpbmsuc2V0KG9sZEFubm90YXRpb24gPyAiTSIgOiAiQ3JlYXRpb25EYXRlIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICBpbmsuc2V0KCJSZWN0IiwgcmVjdCk7CiAgICBpbmsuc2V0KCJJbmtMaXN0Iiwgb3V0bGluZXM/LnBvaW50cyB8fCBwYXRocy5wb2ludHMpOwogICAgaW5rLnNldCgiRiIsIDQpOwogICAgaW5rLnNldCgiUm90YXRlIiwgcm90YXRpb24pOwogICAgaWYgKHVzZXIpIHsKICAgICAgaW5rLnNldCgiVCIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUodXNlcikpOwogICAgfQogICAgaWYgKG91dGxpbmVzKSB7CiAgICAgIGluay5zZXQoIklUIiwgTmFtZS5nZXQoIklua0hpZ2hsaWdodCIpKTsKICAgIH0KICAgIGNvbnN0IGJzID0gbmV3IERpY3QoeHJlZik7CiAgICBpbmsuc2V0KCJCUyIsIGJzKTsKICAgIGJzLnNldCgiVyIsIHRoaWNrbmVzcyk7CiAgICBpbmsuc2V0KCJDIiwgZ2V0UGRmQ29sb3JBcnJheShjb2xvcikpOwogICAgaW5rLnNldCgiQ0EiLCBvcGFjaXR5KTsKICAgIGNvbnN0IG4gPSBuZXcgRGljdCh4cmVmKTsKICAgIGluay5zZXQoIkFQIiwgbik7CiAgICBpZiAoYXBSZWYpIHsKICAgICAgbi5zZXQoIk4iLCBhcFJlZik7CiAgICB9IGVsc2UgewogICAgICBuLnNldCgiTiIsIGFwKTsKICAgIH0KICAgIHJldHVybiBpbms7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgaWYgKGFubm90YXRpb24ub3V0bGluZXMpIHsKICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbUZvckhpZ2hsaWdodChhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpOwogICAgfQogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgcGF0aHMsCiAgICAgIHRoaWNrbmVzcywKICAgICAgb3BhY2l0eQogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBhcHBlYXJhbmNlQnVmZmVyID0gW2Ake3RoaWNrbmVzc30gdyAxIEogMSBqYCwgYCR7Z2V0UGRmQ29sb3IoY29sb3IsIGZhbHNlKX1gXTsKICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7CiAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaCgiL1IwIGdzIik7CiAgICB9CiAgICBmb3IgKGNvbnN0IG91dGxpbmUgb2YgcGF0aHMubGluZXMpIHsKICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNF0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNV0pfSBtYCk7CiAgICAgIGZvciAobGV0IGkgPSA2LCBpaSA9IG91dGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNikgewogICAgICAgIGlmIChpc05hTihvdXRsaW5lW2ldKSkgewogICAgICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaSArIDRdKX0gJHtudW1iZXJUb1N0cmluZyhvdXRsaW5lW2kgKyA1XSl9IGxgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgW2MxeCwgYzF5LCBjMngsIGMyeSwgeCwgeV0gPSBvdXRsaW5lLnNsaWNlKGksIGkgKyA2KTsKICAgICAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XS5tYXAobnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKSArICIgYyIpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAob3V0bGluZS5sZW5ndGggPT09IDYpIHsKICAgICAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goYCR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVs0XSl9ICR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVs1XSl9IGxgKTsKICAgICAgfQogICAgfQogICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKCJTIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXBwZWFyYW5jZUJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCByZWN0KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOwogICAgaWYgKG9wYWNpdHkgIT09IDEpIHsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGNvbnN0IGV4dEdTdGF0ZSA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBjb25zdCByMCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICByMC5zZXQoIkNBIiwgb3BhY2l0eSk7CiAgICAgIHIwLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJFeHRHU3RhdGUiKSk7CiAgICAgIGV4dEdTdGF0ZS5zZXQoIlIwIiwgcjApOwogICAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBleHRHU3RhdGUpOwogICAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICB9CiAgICBjb25zdCBhcCA9IG5ldyBTdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICBhcC5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICByZXR1cm4gYXA7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtRm9ySGlnaGxpZ2h0KGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgb3V0bGluZXM6IHsKICAgICAgICBvdXRsaW5lCiAgICAgIH0sCiAgICAgIG9wYWNpdHkKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgYXBwZWFyYW5jZUJ1ZmZlciA9IFtgJHtnZXRQZGZDb2xvcihjb2xvciwgdHJ1ZSl9YCwgIi9SMCBncyJdOwogICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNF0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNV0pfSBtYCk7CiAgICBmb3IgKGxldCBpID0gNiwgaWkgPSBvdXRsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHsKICAgICAgaWYgKGlzTmFOKG91dGxpbmVbaV0pKSB7CiAgICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaSArIDRdKX0gJHtudW1iZXJUb1N0cmluZyhvdXRsaW5lW2kgKyA1XSl9IGxgKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XSA9IG91dGxpbmUuc2xpY2UoaSwgaSArIDYpOwogICAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XS5tYXAobnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKSArICIgYyIpOwogICAgICB9CiAgICB9CiAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goImggZiIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGFwcGVhcmFuY2VCdWZmZXIuam9pbigiXG4iKTsKICAgIGNvbnN0IGFwcGVhcmFuY2VTdHJlYW1EaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgcmVjdCk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgZXh0R1N0YXRlID0gbmV3IERpY3QoeHJlZik7CiAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBleHRHU3RhdGUpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJSZXNvdXJjZXMiLCByZXNvdXJjZXMpOwogICAgY29uc3QgcjAgPSBuZXcgRGljdCh4cmVmKTsKICAgIGV4dEdTdGF0ZS5zZXQoIlIwIiwgcjApOwogICAgcjAuc2V0KCJCTSIsIE5hbWUuZ2V0KCJNdWx0aXBseSIpKTsKICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7CiAgICAgIHIwLnNldCgiY2EiLCBvcGFjaXR5KTsKICAgICAgcjAuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkV4dEdTdGF0ZSIpKTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybiBhcDsKICB9Cn0KY2xhc3MgSGlnaGxpZ2h0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkhJR0hMSUdIVDsKICAgIHRoaXMuZGF0YS5pc0VkaXRhYmxlID0gIXRoaXMuZGF0YS5ub0hUTUw7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEub3BhY2l0eSA9IGRpY3QuZ2V0KCJDQSIpIHx8IDE7CiAgICBjb25zdCBxdWFkUG9pbnRzID0gdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKGRpY3QsIG51bGwpOwogICAgaWYgKHF1YWRQb2ludHMpIHsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5hcHBlYXJhbmNlPy5kaWN0LmdldCgiUmVzb3VyY2VzIik7CiAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlIHx8ICFyZXNvdXJjZXM/LmhhcygiRXh0R1N0YXRlIikpIHsKICAgICAgICBpZiAodGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgICB3YXJuKCJIaWdobGlnaHRBbm5vdGF0aW9uIC0gaWdub3JpbmcgYnVpbHQtaW4gYXBwZWFyYW5jZSBzdHJlYW0uIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzEsIDEsIDBdOwogICAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBmaWxsQ29sb3IsCiAgICAgICAgICBibGVuZE1vZGU6ICJNdWx0aXBseSIsCiAgICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3BvaW50c1swXX0gJHtwb2ludHNbMV19IG1gLCBgJHtwb2ludHNbMl19ICR7cG9pbnRzWzNdfSBsYCwgYCR7cG9pbnRzWzZdfSAke3BvaW50c1s3XX0gbGAsIGAke3BvaW50c1s0XX0gJHtwb2ludHNbNV19IGxgLCAiZiIpOwogICAgICAgICAgICByZXR1cm4gW3BvaW50c1swXSwgcG9pbnRzWzddLCBwb2ludHNbMl0sIHBvaW50c1szXV07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiA9IG51bGw7CiAgICB9CiAgfQogIHN0YXRpYyBjcmVhdGVOZXdEaWN0KGFubm90YXRpb24sIHhyZWYsIHsKICAgIGFwUmVmLAogICAgYXAKICB9KSB7CiAgICBjb25zdCB7CiAgICAgIGNvbG9yLAogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICBvcGFjaXR5LAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdXNlciwKICAgICAgcXVhZFBvaW50cwogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBoaWdobGlnaHQgPSBvbGRBbm5vdGF0aW9uIHx8IG5ldyBEaWN0KHhyZWYpOwogICAgaGlnaGxpZ2h0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJBbm5vdCIpKTsKICAgIGhpZ2hsaWdodC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiSGlnaGxpZ2h0IikpOwogICAgaGlnaGxpZ2h0LnNldChvbGRBbm5vdGF0aW9uID8gIk0iIDogIkNyZWF0aW9uRGF0ZSIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApOwogICAgaGlnaGxpZ2h0LnNldCgiQ3JlYXRpb25EYXRlIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICBoaWdobGlnaHQuc2V0KCJSZWN0IiwgcmVjdCk7CiAgICBoaWdobGlnaHQuc2V0KCJGIiwgNCk7CiAgICBoaWdobGlnaHQuc2V0KCJCb3JkZXIiLCBbMCwgMCwgMF0pOwogICAgaGlnaGxpZ2h0LnNldCgiUm90YXRlIiwgcm90YXRpb24pOwogICAgaGlnaGxpZ2h0LnNldCgiUXVhZFBvaW50cyIsIHF1YWRQb2ludHMpOwogICAgaGlnaGxpZ2h0LnNldCgiQyIsIGdldFBkZkNvbG9yQXJyYXkoY29sb3IpKTsKICAgIGhpZ2hsaWdodC5zZXQoIkNBIiwgb3BhY2l0eSk7CiAgICBpZiAodXNlcikgewogICAgICBoaWdobGlnaHQuc2V0KCJUIiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRSh1c2VyKSk7CiAgICB9CiAgICBpZiAoYXBSZWYgfHwgYXApIHsKICAgICAgY29uc3QgbiA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBoaWdobGlnaHQuc2V0KCJBUCIsIG4pOwogICAgICBuLnNldCgiTiIsIGFwUmVmIHx8IGFwKTsKICAgIH0KICAgIHJldHVybiBoaWdobGlnaHQ7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgb3V0bGluZXMsCiAgICAgIG9wYWNpdHkKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgYXBwZWFyYW5jZUJ1ZmZlciA9IFtgJHtnZXRQZGZDb2xvcihjb2xvciwgdHJ1ZSl9YCwgIi9SMCBncyJdOwogICAgY29uc3QgYnVmZmVyID0gW107CiAgICBmb3IgKGNvbnN0IG91dGxpbmUgb2Ygb3V0bGluZXMpIHsKICAgICAgYnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgIGJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbMF0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbMV0pfSBtYCk7CiAgICAgIGZvciAobGV0IGkgPSAyLCBpaSA9IG91dGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICAgIGJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaV0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaSArIDFdKX0gbGApOwogICAgICB9CiAgICAgIGJ1ZmZlci5wdXNoKCJoIik7CiAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChidWZmZXIuam9pbigiXG4iKSk7CiAgICB9CiAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goImYqIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXBwZWFyYW5jZUJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCByZWN0KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOwogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QoeHJlZik7CiAgICBjb25zdCBleHRHU3RhdGUgPSBuZXcgRGljdCh4cmVmKTsKICAgIHJlc291cmNlcy5zZXQoIkV4dEdTdGF0ZSIsIGV4dEdTdGF0ZSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICBjb25zdCByMCA9IG5ldyBEaWN0KHhyZWYpOwogICAgZXh0R1N0YXRlLnNldCgiUjAiLCByMCk7CiAgICByMC5zZXQoIkJNIiwgTmFtZS5nZXQoIk11bHRpcGx5IikpOwogICAgaWYgKG9wYWNpdHkgIT09IDEpIHsKICAgICAgcjAuc2V0KCJjYSIsIG9wYWNpdHkpOwogICAgICByMC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRXh0R1N0YXRlIikpOwogICAgfQogICAgY29uc3QgYXAgPSBuZXcgU3RyaW5nU3RyZWFtKGFwcGVhcmFuY2UpOwogICAgYXAuZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgcmV0dXJuIGFwOwogIH0KfQpjbGFzcyBVbmRlcmxpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOwogICAgY29uc3QgcXVhZFBvaW50cyA9IHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhkaWN0LCBudWxsKTsKICAgIGlmIChxdWFkUG9pbnRzKSB7CiAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBleHRyYTogIltdIDAgZCAwLjU3MSB3IiwKICAgICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3BvaW50c1s0XX0gJHtwb2ludHNbNV0gKyAxLjN9IG1gLCBgJHtwb2ludHNbNl19ICR7cG9pbnRzWzddICsgMS4zfSBsYCwgIlMiKTsKICAgICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0sIHBvaW50c1s3XSwgcG9pbnRzWzJdLCBwb2ludHNbM11dOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEucG9wdXBSZWYgPSBudWxsOwogICAgfQogIH0KfQpjbGFzcyBTcXVpZ2dseUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5TUVVJR0dMWTsKICAgIGNvbnN0IHF1YWRQb2ludHMgPSB0aGlzLmRhdGEucXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMoZGljdCwgbnVsbCk7CiAgICBpZiAocXVhZFBvaW50cykgewogICAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jb2xvciA/IGdldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcikgOiBbMCwgMCwgMF07CiAgICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgICB4cmVmLAogICAgICAgICAgZXh0cmE6ICJbXSAwIGQgMSB3IiwKICAgICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGR5ID0gKHBvaW50c1sxXSAtIHBvaW50c1s1XSkgLyA2OwogICAgICAgICAgICBsZXQgc2hpZnQgPSBkeTsKICAgICAgICAgICAgbGV0IHggPSBwb2ludHNbNF07CiAgICAgICAgICAgIGNvbnN0IHkgPSBwb2ludHNbNV07CiAgICAgICAgICAgIGNvbnN0IHhFbmQgPSBwb2ludHNbNl07CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3h9ICR7eSArIHNoaWZ0fSBtYCk7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICB4ICs9IDI7CiAgICAgICAgICAgICAgc2hpZnQgPSBzaGlmdCA9PT0gMCA/IGR5IDogMDsKICAgICAgICAgICAgICBidWZmZXIucHVzaChgJHt4fSAke3kgKyBzaGlmdH0gbGApOwogICAgICAgICAgICB9IHdoaWxlICh4IDwgeEVuZCk7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKCJTIik7CiAgICAgICAgICAgIHJldHVybiBbcG9pbnRzWzRdLCB5IC0gMiAqIGR5LCB4RW5kLCB5ICsgMiAqIGR5XTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmID0gbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgU3RyaWtlT3V0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlNUUklLRU9VVDsKICAgIGNvbnN0IHF1YWRQb2ludHMgPSB0aGlzLmRhdGEucXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMoZGljdCwgbnVsbCk7CiAgICBpZiAocXVhZFBvaW50cykgewogICAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jb2xvciA/IGdldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcikgOiBbMCwgMCwgMF07CiAgICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgICB4cmVmLAogICAgICAgICAgZXh0cmE6ICJbXSAwIGQgMSB3IiwKICAgICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgICAgc3Ryb2tlQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAkeyhwb2ludHNbMF0gKyBwb2ludHNbNF0pIC8gMn0gYCArIGAkeyhwb2ludHNbMV0gKyBwb2ludHNbNV0pIC8gMn0gbWAsIGAkeyhwb2ludHNbMl0gKyBwb2ludHNbNl0pIC8gMn0gYCArIGAkeyhwb2ludHNbM10gKyBwb2ludHNbN10pIC8gMn0gbGAsICJTIik7CiAgICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLCBwb2ludHNbN10sIHBvaW50c1syXSwgcG9pbnRzWzNdXTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmID0gbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgU3RhbXBBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgI3NhdmVkSGFzT3duQ2FudmFzID0gbnVsbDsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5TVEFNUDsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEuaXNFZGl0YWJsZSA9ICF0aGlzLmRhdGEubm9IVE1MOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogIH0KICBtdXN0QmVWaWV3ZWRXaGVuRWRpdGluZyhpc0VkaXRpbmcsIG1vZGlmaWVkSWRzID0gbnVsbCkgewogICAgaWYgKGlzRWRpdGluZykgewogICAgICBpZiAoIXRoaXMuZGF0YS5pc0VkaXRhYmxlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgdGhpcy4jc2F2ZWRIYXNPd25DYW52YXMgPz89IHRoaXMuZGF0YS5oYXNPd25DYW52YXM7CiAgICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0cnVlOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0aGlzLiNzYXZlZEhhc093bkNhbnZhcyAhPT0gbnVsbCkgewogICAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy4jc2F2ZWRIYXNPd25DYW52YXM7CiAgICAgIHRoaXMuI3NhdmVkSGFzT3duQ2FudmFzID0gbnVsbDsKICAgIH0KICAgIHJldHVybiAhbW9kaWZpZWRJZHM/Lmhhcyh0aGlzLmRhdGEuaWQpOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2UoYml0bWFwLCB4cmVmKSB7CiAgICBjb25zdCB7CiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQKICAgIH0gPSBiaXRtYXA7CiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIiwgewogICAgICBhbHBoYTogdHJ1ZQogICAgfSk7CiAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCk7CiAgICBjb25zdCBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhOwogICAgY29uc3QgYnVmMzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIpOwogICAgY29uc3QgaGFzQWxwaGEgPSBidWYzMi5zb21lKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8geCA9PiB4ID4+PiAyNCAhPT0gMHhmZiA6IHggPT4gKHggJiAweGZmKSAhPT0gMHhmZik7CiAgICBpZiAoaGFzQWxwaGEpIHsKICAgICAgY3R4LmZpbGxTdHlsZSA9ICJ3aGl0ZSI7CiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApOwogICAgfQogICAgY29uc3QganBlZ0J1ZmZlclByb21pc2UgPSBjYW52YXMuY29udmVydFRvQmxvYih7CiAgICAgIHR5cGU6ICJpbWFnZS9qcGVnIiwKICAgICAgcXVhbGl0eTogMQogICAgfSkudGhlbihibG9iID0+IGJsb2IuYXJyYXlCdWZmZXIoKSk7CiAgICBjb25zdCB4b2JqZWN0TmFtZSA9IE5hbWUuZ2V0KCJYT2JqZWN0Iik7CiAgICBjb25zdCBpbWFnZU5hbWUgPSBOYW1lLmdldCgiSW1hZ2UiKTsKICAgIGNvbnN0IGltYWdlID0gbmV3IERpY3QoeHJlZik7CiAgICBpbWFnZS5zZXQoIlR5cGUiLCB4b2JqZWN0TmFtZSk7CiAgICBpbWFnZS5zZXQoIlN1YnR5cGUiLCBpbWFnZU5hbWUpOwogICAgaW1hZ2Uuc2V0KCJCaXRzUGVyQ29tcG9uZW50IiwgOCk7CiAgICBpbWFnZS5zZXQoIkNvbG9yU3BhY2UiLCBOYW1lLmdldCgiRGV2aWNlUkdCIikpOwogICAgaW1hZ2Uuc2V0KCJGaWx0ZXIiLCBOYW1lLmdldCgiRENURGVjb2RlIikpOwogICAgaW1hZ2Uuc2V0KCJCQm94IiwgWzAsIDAsIHdpZHRoLCBoZWlnaHRdKTsKICAgIGltYWdlLnNldCgiV2lkdGgiLCB3aWR0aCk7CiAgICBpbWFnZS5zZXQoIkhlaWdodCIsIGhlaWdodCk7CiAgICBsZXQgc21hc2tTdHJlYW0gPSBudWxsOwogICAgaWYgKGhhc0FscGhhKSB7CiAgICAgIGNvbnN0IGFscGhhQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYnVmMzIubGVuZ3RoKTsKICAgICAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnVmMzIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgYWxwaGFCdWZmZXJbaV0gPSBidWYzMltpXSA+Pj4gMjQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJ1ZjMyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGFscGhhQnVmZmVyW2ldID0gYnVmMzJbaV0gJiAweGZmOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBzbWFzayA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBzbWFzay5zZXQoIlR5cGUiLCB4b2JqZWN0TmFtZSk7CiAgICAgIHNtYXNrLnNldCgiU3VidHlwZSIsIGltYWdlTmFtZSk7CiAgICAgIHNtYXNrLnNldCgiQml0c1BlckNvbXBvbmVudCIsIDgpOwogICAgICBzbWFzay5zZXQoIkNvbG9yU3BhY2UiLCBOYW1lLmdldCgiRGV2aWNlR3JheSIpKTsKICAgICAgc21hc2suc2V0KCJXaWR0aCIsIHdpZHRoKTsKICAgICAgc21hc2suc2V0KCJIZWlnaHQiLCBoZWlnaHQpOwogICAgICBzbWFza1N0cmVhbSA9IG5ldyBTdHJlYW0oYWxwaGFCdWZmZXIsIDAsIDAsIHNtYXNrKTsKICAgIH0KICAgIGNvbnN0IGltYWdlU3RyZWFtID0gbmV3IFN0cmVhbShhd2FpdCBqcGVnQnVmZmVyUHJvbWlzZSwgMCwgMCwgaW1hZ2UpOwogICAgcmV0dXJuIHsKICAgICAgaW1hZ2VTdHJlYW0sCiAgICAgIHNtYXNrU3RyZWFtLAogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0CiAgICB9OwogIH0KICBzdGF0aWMgY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7CiAgICBhcFJlZiwKICAgIGFwCiAgfSkgewogICAgY29uc3QgewogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdXNlcgogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBzdGFtcCA9IG9sZEFubm90YXRpb24gfHwgbmV3IERpY3QoeHJlZik7CiAgICBzdGFtcC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiQW5ub3QiKSk7CiAgICBzdGFtcC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiU3RhbXAiKSk7CiAgICBzdGFtcC5zZXQob2xkQW5ub3RhdGlvbiA/ICJNIiA6ICJDcmVhdGlvbkRhdGUiLCBgRDoke2dldE1vZGlmaWNhdGlvbkRhdGUoKX1gKTsKICAgIHN0YW1wLnNldCgiUmVjdCIsIHJlY3QpOwogICAgc3RhbXAuc2V0KCJGIiwgNCk7CiAgICBzdGFtcC5zZXQoIkJvcmRlciIsIFswLCAwLCAwXSk7CiAgICBzdGFtcC5zZXQoIlJvdGF0ZSIsIHJvdGF0aW9uKTsKICAgIGlmICh1c2VyKSB7CiAgICAgIHN0YW1wLnNldCgiVCIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUodXNlcikpOwogICAgfQogICAgaWYgKGFwUmVmIHx8IGFwKSB7CiAgICAgIGNvbnN0IG4gPSBuZXcgRGljdCh4cmVmKTsKICAgICAgc3RhbXAuc2V0KCJBUCIsIG4pOwogICAgICBpZiAoYXBSZWYpIHsKICAgICAgICBuLnNldCgiTiIsIGFwUmVmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuLnNldCgiTiIsIGFwKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0YW1wOwogIH0KICBzdGF0aWMgYXN5bmMgI2NyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW1Gb3JEcmF3aW5nKGFubm90YXRpb24sIHhyZWYpIHsKICAgIGNvbnN0IHsKICAgICAgYXJlQ29udG91cnMsCiAgICAgIGNvbG9yLAogICAgICByZWN0LAogICAgICBsaW5lcywKICAgICAgdGhpY2tuZXNzCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IGFwcGVhcmFuY2VCdWZmZXIgPSBbYCR7dGhpY2tuZXNzfSB3IDEgSiAxIGpgLCBgJHtnZXRQZGZDb2xvcihjb2xvciwgYXJlQ29udG91cnMpfWBdOwogICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChgJHtudW1iZXJUb1N0cmluZyhsaW5lWzRdKX0gJHtudW1iZXJUb1N0cmluZyhsaW5lWzVdKX0gbWApOwogICAgICBmb3IgKGxldCBpID0gNiwgaWkgPSBsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHsKICAgICAgICBpZiAoaXNOYU4obGluZVtpXSkpIHsKICAgICAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChgJHtudW1iZXJUb1N0cmluZyhsaW5lW2kgKyA0XSl9ICR7bnVtYmVyVG9TdHJpbmcobGluZVtpICsgNV0pfSBsYCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IFtjMXgsIGMxeSwgYzJ4LCBjMnksIHgsIHldID0gbGluZS5zbGljZShpLCBpICsgNik7CiAgICAgICAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goW2MxeCwgYzF5LCBjMngsIGMyeSwgeCwgeV0ubWFwKG51bWJlclRvU3RyaW5nKS5qb2luKCIgIikgKyAiIGMiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSA2KSB7CiAgICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKGxpbmVbNF0pfSAke251bWJlclRvU3RyaW5nKGxpbmVbNV0pfSBsYCk7CiAgICAgIH0KICAgIH0KICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChhcmVDb250b3VycyA/ICJGIiA6ICJTIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXBwZWFyYW5jZUJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCByZWN0KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOwogICAgY29uc3QgYXAgPSBuZXcgU3RyaW5nU3RyZWFtKGFwcGVhcmFuY2UpOwogICAgYXAuZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgcmV0dXJuIGFwOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpIHsKICAgIGlmIChhbm5vdGF0aW9uLm9sZEFubm90YXRpb24pIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoYW5ub3RhdGlvbi5pc1NpZ25hdHVyZSkgewogICAgICByZXR1cm4gdGhpcy4jY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbUZvckRyYXdpbmcoYW5ub3RhdGlvbiwgeHJlZik7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIHJvdGF0aW9uCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IHsKICAgICAgaW1hZ2VSZWYsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQKICAgIH0gPSBwYXJhbXMuaW1hZ2U7CiAgICBjb25zdCByZXNvdXJjZXMgPSBuZXcgRGljdCh4cmVmKTsKICAgIGNvbnN0IHhvYmplY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIHJlc291cmNlcy5zZXQoIlhPYmplY3QiLCB4b2JqZWN0KTsKICAgIHhvYmplY3Quc2V0KCJJbTAiLCBpbWFnZVJlZik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYHEgJHt3aWR0aH0gMCAwICR7aGVpZ2h0fSAwIDAgY20gL0ltMCBEbyBRYDsKICAgIGNvbnN0IGFwcGVhcmFuY2VTdHJlYW1EaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgWzAsIDAsIHdpZHRoLCBoZWlnaHRdKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIGlmIChyb3RhdGlvbikgewogICAgICBjb25zdCBtYXRyaXggPSBnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbiwgd2lkdGgsIGhlaWdodCk7CiAgICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTWF0cml4IiwgbWF0cml4KTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybiBhcDsKICB9Cn0KY2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlU3BlYyhkaWN0LmdldCgiRlMiKSwgeHJlZik7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5GSUxFQVRUQUNITUVOVDsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEuZmlsZSA9IGZpbGUuc2VyaWFsaXphYmxlOwogICAgY29uc3QgbmFtZSA9IGRpY3QuZ2V0KCJOYW1lIik7CiAgICB0aGlzLmRhdGEubmFtZSA9IG5hbWUgaW5zdGFuY2VvZiBOYW1lID8gc3RyaW5nVG9QREZTdHJpbmcobmFtZS5uYW1lKSA6ICJQdXNoUGluIjsKICAgIGNvbnN0IGZpbGxBbHBoYSA9IGRpY3QuZ2V0KCJjYSIpOwogICAgdGhpcy5kYXRhLmZpbGxBbHBoYSA9IHR5cGVvZiBmaWxsQWxwaGEgPT09ICJudW1iZXIiICYmIGZpbGxBbHBoYSA+PSAwICYmIGZpbGxBbHBoYSA8PSAxID8gZmlsbEFscGhhIDogbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NhbGN1bGF0ZV9tZDUuanMKCmNvbnN0IFBBUkFNUyA9IHsKICBnZXQgcigpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgInIiLCBuZXcgVWludDhBcnJheShbNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDUsIDksIDE0LCAyMCwgNSwgOSwgMTQsIDIwLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxXSkpOwogIH0sCiAgZ2V0IGsoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJrIiwgbmV3IEludDMyQXJyYXkoWy02ODA4NzY5MzYsIC0zODk1NjQ1ODYsIDYwNjEwNTgxOSwgLTEwNDQ1MjUzMzAsIC0xNzY0MTg4OTcsIDEyMDAwODA0MjYsIC0xNDczMjMxMzQxLCAtNDU3MDU5ODMsIDE3NzAwMzU0MTYsIC0xOTU4NDE0NDE3LCAtNDIwNjMsIC0xOTkwNDA0MTYyLCAxODA0NjAzNjgyLCAtNDAzNDExMDEsIC0xNTAyMDAyMjkwLCAxMjM2NTM1MzI5LCAtMTY1Nzk2NTEwLCAtMTA2OTUwMTYzMiwgNjQzNzE3NzEzLCAtMzczODk3MzAyLCAtNzAxNTU4NjkxLCAzODAxNjA4MywgLTY2MDQ3ODMzNSwgLTQwNTUzNzg0OCwgNTY4NDQ2NDM4LCAtMTAxOTgwMzY5MCwgLTE4NzM2Mzk2MSwgMTE2MzUzMTUwMSwgLTE0NDQ2ODE0NjcsIC01MTQwMzc4NCwgMTczNTMyODQ3MywgLTE5MjY2MDc3MzQsIC0zNzg1NTgsIC0yMDIyNTc0NDYzLCAxODM5MDMwNTYyLCAtMzUzMDk1NTYsIC0xNTMwOTkyMDYwLCAxMjcyODkzMzUzLCAtMTU1NDk3NjMyLCAtMTA5NDczMDY0MCwgNjgxMjc5MTc0LCAtMzU4NTM3MjIyLCAtNzIyNTIxOTc5LCA3NjAyOTE4OSwgLTY0MDM2NDQ4NywgLTQyMTgxNTgzNSwgNTMwNzQyNTIwLCAtOTk1MzM4NjUxLCAtMTk4NjMwODQ0LCAxMTI2ODkxNDE1LCAtMTQxNjM1NDkwNSwgLTU3NDM0MDU1LCAxNzAwNDg1NTcxLCAtMTg5NDk4NjYwNiwgLTEwNTE1MjMsIC0yMDU0OTIyNzk5LCAxODczMzEzMzU5LCAtMzA2MTE3NDQsIC0xNTYwMTk4MzgwLCAxMzA5MTUxNjQ5LCAtMTQ1NTIzMDcwLCAtMTEyMDIxMDM3OSwgNzE4Nzg3MjU5LCAtMzQzNDg1NTUxXSkpOwogIH0KfTsKZnVuY3Rpb24gY2FsY3VsYXRlTUQ1KGRhdGEsIG9mZnNldCwgbGVuZ3RoKSB7CiAgbGV0IGgwID0gMTczMjU4NDE5MywKICAgIGgxID0gLTI3MTczMzg3OSwKICAgIGgyID0gLTE3MzI1ODQxOTQsCiAgICBoMyA9IDI3MTczMzg3ODsKICBjb25zdCBwYWRkZWRMZW5ndGggPSBsZW5ndGggKyA3MiAmIH42MzsKICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOwogIGxldCBpLCBqOwogIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgcGFkZGVkW2ldID0gZGF0YVtvZmZzZXQrK107CiAgfQogIHBhZGRlZFtpKytdID0gMHg4MDsKICBjb25zdCBuID0gcGFkZGVkTGVuZ3RoIC0gODsKICBpZiAoaSA8IG4pIHsKICAgIGkgPSBuOwogIH0KICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA8PCAzICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiA1ICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAxMyAmIDB4ZmY7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMjEgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+PiAyOSAmIDB4ZmY7CiAgaSArPSAzOwogIGNvbnN0IHcgPSBuZXcgSW50MzJBcnJheSgxNik7CiAgY29uc3QgewogICAgaywKICAgIHIKICB9ID0gUEFSQU1TOwogIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7KSB7CiAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraiwgaSArPSA0KSB7CiAgICAgIHdbal0gPSBwYWRkZWRbaV0gfCBwYWRkZWRbaSArIDFdIDw8IDggfCBwYWRkZWRbaSArIDJdIDw8IDE2IHwgcGFkZGVkW2kgKyAzXSA8PCAyNDsKICAgIH0KICAgIGxldCBhID0gaDAsCiAgICAgIGIgPSBoMSwKICAgICAgYyA9IGgyLAogICAgICBkID0gaDMsCiAgICAgIGYsCiAgICAgIGc7CiAgICBmb3IgKGogPSAwOyBqIDwgNjQ7ICsraikgewogICAgICBpZiAoaiA8IDE2KSB7CiAgICAgICAgZiA9IGIgJiBjIHwgfmIgJiBkOwogICAgICAgIGcgPSBqOwogICAgICB9IGVsc2UgaWYgKGogPCAzMikgewogICAgICAgIGYgPSBkICYgYiB8IH5kICYgYzsKICAgICAgICBnID0gNSAqIGogKyAxICYgMTU7CiAgICAgIH0gZWxzZSBpZiAoaiA8IDQ4KSB7CiAgICAgICAgZiA9IGIgXiBjIF4gZDsKICAgICAgICBnID0gMyAqIGogKyA1ICYgMTU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZiA9IGMgXiAoYiB8IH5kKTsKICAgICAgICBnID0gNyAqIGogJiAxNTsKICAgICAgfQogICAgICBjb25zdCB0bXAgPSBkLAogICAgICAgIHJvdGF0ZUFyZyA9IGEgKyBmICsga1tqXSArIHdbZ10gfCAwLAogICAgICAgIHJvdGF0ZSA9IHJbal07CiAgICAgIGQgPSBjOwogICAgICBjID0gYjsKICAgICAgYiA9IGIgKyAocm90YXRlQXJnIDw8IHJvdGF0ZSB8IHJvdGF0ZUFyZyA+Pj4gMzIgLSByb3RhdGUpIHwgMDsKICAgICAgYSA9IHRtcDsKICAgIH0KICAgIGgwID0gaDAgKyBhIHwgMDsKICAgIGgxID0gaDEgKyBiIHwgMDsKICAgIGgyID0gaDIgKyBjIHwgMDsKICAgIGgzID0gaDMgKyBkIHwgMDsKICB9CiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtoMCAmIDB4RkYsIGgwID4+IDggJiAweEZGLCBoMCA+PiAxNiAmIDB4RkYsIGgwID4+PiAyNCAmIDB4RkYsIGgxICYgMHhGRiwgaDEgPj4gOCAmIDB4RkYsIGgxID4+IDE2ICYgMHhGRiwgaDEgPj4+IDI0ICYgMHhGRiwgaDIgJiAweEZGLCBoMiA+PiA4ICYgMHhGRiwgaDIgPj4gMTYgJiAweEZGLCBoMiA+Pj4gMjQgJiAweEZGLCBoMyAmIDB4RkYsIGgzID4+IDggJiAweEZGLCBoMyA+PiAxNiAmIDB4RkYsIGgzID4+PiAyNCAmIDB4RkZdKTsKfQoKOy8vIC4vc3JjL2NvcmUvZGF0YXNldF9yZWFkZXIuanMKCgoKZnVuY3Rpb24gZGVjb2RlU3RyaW5nKHN0cikgewogIHRyeSB7CiAgICByZXR1cm4gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cik7CiAgfSBjYXRjaCAoZXgpIHsKICAgIHdhcm4oYFVURi04IGRlY29kaW5nIGZhaWxlZDogIiR7ZXh9Ii5gKTsKICAgIHJldHVybiBzdHI7CiAgfQp9CmNsYXNzIERhdGFzZXRYTUxQYXJzZXIgZXh0ZW5kcyBTaW1wbGVYTUxQYXJzZXIgewogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHN1cGVyKG9wdGlvbnMpOwogICAgdGhpcy5ub2RlID0gbnVsbDsKICB9CiAgb25FbmRFbGVtZW50KG5hbWUpIHsKICAgIGNvbnN0IG5vZGUgPSBzdXBlci5vbkVuZEVsZW1lbnQobmFtZSk7CiAgICBpZiAobm9kZSAmJiBuYW1lID09PSAieGZhOmRhdGFzZXRzIikgewogICAgICB0aGlzLm5vZGUgPSBub2RlOwogICAgICB0aHJvdyBuZXcgRXJyb3IoIkFib3J0aW5nIERhdGFzZXRYTUxQYXJzZXIuIik7CiAgICB9CiAgfQp9CmNsYXNzIERhdGFzZXRSZWFkZXIgewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIGlmIChkYXRhLmRhdGFzZXRzKSB7CiAgICAgIHRoaXMubm9kZSA9IG5ldyBTaW1wbGVYTUxQYXJzZXIoewogICAgICAgIGhhc0F0dHJpYnV0ZXM6IHRydWUKICAgICAgfSkucGFyc2VGcm9tU3RyaW5nKGRhdGEuZGF0YXNldHMpLmRvY3VtZW50RWxlbWVudDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBEYXRhc2V0WE1MUGFyc2VyKHsKICAgICAgICBoYXNBdHRyaWJ1dGVzOiB0cnVlCiAgICAgIH0pOwogICAgICB0cnkgewogICAgICAgIHBhcnNlci5wYXJzZUZyb21TdHJpbmcoZGF0YVsieGRwOnhkcCJdKTsKICAgICAgfSBjYXRjaCB7fQogICAgICB0aGlzLm5vZGUgPSBwYXJzZXIubm9kZTsKICAgIH0KICB9CiAgZ2V0VmFsdWUocGF0aCkgewogICAgaWYgKCF0aGlzLm5vZGUgfHwgIXBhdGgpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgY29uc3Qgbm9kZSA9IHRoaXMubm9kZS5zZWFyY2hOb2RlKHBhcnNlWEZBUGF0aChwYXRoKSwgMCk7CiAgICBpZiAoIW5vZGUpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgY29uc3QgZmlyc3QgPSBub2RlLmZpcnN0Q2hpbGQ7CiAgICBpZiAoZmlyc3Q/Lm5vZGVOYW1lID09PSAidmFsdWUiKSB7CiAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBkZWNvZGVTdHJpbmcoY2hpbGQudGV4dENvbnRlbnQpKTsKICAgIH0KICAgIHJldHVybiBkZWNvZGVTdHJpbmcobm9kZS50ZXh0Q29udGVudCk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jYWxjdWxhdGVfc2hhX290aGVyLmpzCgpjbGFzcyBXb3JkNjQgewogIGNvbnN0cnVjdG9yKGhpZ2hJbnRlZ2VyLCBsb3dJbnRlZ2VyKSB7CiAgICB0aGlzLmhpZ2ggPSBoaWdoSW50ZWdlciB8IDA7CiAgICB0aGlzLmxvdyA9IGxvd0ludGVnZXIgfCAwOwogIH0KICBhbmQod29yZCkgewogICAgdGhpcy5oaWdoICY9IHdvcmQuaGlnaDsKICAgIHRoaXMubG93ICY9IHdvcmQubG93OwogIH0KICB4b3Iod29yZCkgewogICAgdGhpcy5oaWdoIF49IHdvcmQuaGlnaDsKICAgIHRoaXMubG93IF49IHdvcmQubG93OwogIH0KICBzaGlmdFJpZ2h0KHBsYWNlcykgewogICAgaWYgKHBsYWNlcyA+PSAzMikgewogICAgICB0aGlzLmxvdyA9IHRoaXMuaGlnaCA+Pj4gcGxhY2VzIC0gMzIgfCAwOwogICAgICB0aGlzLmhpZ2ggPSAwOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sb3cgPSB0aGlzLmxvdyA+Pj4gcGxhY2VzIHwgdGhpcy5oaWdoIDw8IDMyIC0gcGxhY2VzOwogICAgICB0aGlzLmhpZ2ggPSB0aGlzLmhpZ2ggPj4+IHBsYWNlcyB8IDA7CiAgICB9CiAgfQogIHJvdGF0ZVJpZ2h0KHBsYWNlcykgewogICAgbGV0IGxvdywgaGlnaDsKICAgIGlmIChwbGFjZXMgJiAzMikgewogICAgICBoaWdoID0gdGhpcy5sb3c7CiAgICAgIGxvdyA9IHRoaXMuaGlnaDsKICAgIH0gZWxzZSB7CiAgICAgIGxvdyA9IHRoaXMubG93OwogICAgICBoaWdoID0gdGhpcy5oaWdoOwogICAgfQogICAgcGxhY2VzICY9IDMxOwogICAgdGhpcy5sb3cgPSBsb3cgPj4+IHBsYWNlcyB8IGhpZ2ggPDwgMzIgLSBwbGFjZXM7CiAgICB0aGlzLmhpZ2ggPSBoaWdoID4+PiBwbGFjZXMgfCBsb3cgPDwgMzIgLSBwbGFjZXM7CiAgfQogIG5vdCgpIHsKICAgIHRoaXMuaGlnaCA9IH50aGlzLmhpZ2g7CiAgICB0aGlzLmxvdyA9IH50aGlzLmxvdzsKICB9CiAgYWRkKHdvcmQpIHsKICAgIGNvbnN0IGxvd0FkZCA9ICh0aGlzLmxvdyA+Pj4gMCkgKyAod29yZC5sb3cgPj4+IDApOwogICAgbGV0IGhpZ2hBZGQgPSAodGhpcy5oaWdoID4+PiAwKSArICh3b3JkLmhpZ2ggPj4+IDApOwogICAgaWYgKGxvd0FkZCA+IDB4ZmZmZmZmZmYpIHsKICAgICAgaGlnaEFkZCArPSAxOwogICAgfQogICAgdGhpcy5sb3cgPSBsb3dBZGQgfCAwOwogICAgdGhpcy5oaWdoID0gaGlnaEFkZCB8IDA7CiAgfQogIGNvcHlUbyhieXRlcywgb2Zmc2V0KSB7CiAgICBieXRlc1tvZmZzZXRdID0gdGhpcy5oaWdoID4+PiAyNCAmIDB4ZmY7CiAgICBieXRlc1tvZmZzZXQgKyAxXSA9IHRoaXMuaGlnaCA+PiAxNiAmIDB4ZmY7CiAgICBieXRlc1tvZmZzZXQgKyAyXSA9IHRoaXMuaGlnaCA+PiA4ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDNdID0gdGhpcy5oaWdoICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDRdID0gdGhpcy5sb3cgPj4+IDI0ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDVdID0gdGhpcy5sb3cgPj4gMTYgJiAweGZmOwogICAgYnl0ZXNbb2Zmc2V0ICsgNl0gPSB0aGlzLmxvdyA+PiA4ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDddID0gdGhpcy5sb3cgJiAweGZmOwogIH0KICBhc3NpZ24od29yZCkgewogICAgdGhpcy5oaWdoID0gd29yZC5oaWdoOwogICAgdGhpcy5sb3cgPSB3b3JkLmxvdzsKICB9Cn0KY29uc3QgY2FsY3VsYXRlX3NoYV9vdGhlcl9QQVJBTVMgPSB7CiAgZ2V0IGsoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJrIiwgW25ldyBXb3JkNjQoMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiksIG5ldyBXb3JkNjQoMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCksIG5ldyBXb3JkNjQoMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiksIG5ldyBXb3JkNjQoMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyksIG5ldyBXb3JkNjQoMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCksIG5ldyBXb3JkNjQoMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSksIG5ldyBXb3JkNjQoMHg5MjNmODJhNCwgMHhhZjE5NGY5YiksIG5ldyBXb3JkNjQoMHhhYjFjNWVkNSwgMHhkYTZkODExOCksIG5ldyBXb3JkNjQoMHhkODA3YWE5OCwgMHhhMzAzMDI0MiksIG5ldyBXb3JkNjQoMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSksIG5ldyBXb3JkNjQoMHgyNDMxODViZSwgMHg0ZWU0YjI4YyksIG5ldyBXb3JkNjQoMHg1NTBjN2RjMywgMHhkNWZmYjRlMiksIG5ldyBXb3JkNjQoMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiksIG5ldyBXb3JkNjQoMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSksIG5ldyBXb3JkNjQoMHg5YmRjMDZhNywgMHgyNWM3MTIzNSksIG5ldyBXb3JkNjQoMHhjMTliZjE3NCwgMHhjZjY5MjY5NCksIG5ldyBXb3JkNjQoMHhlNDliNjljMSwgMHg5ZWYxNGFkMiksIG5ldyBXb3JkNjQoMHhlZmJlNDc4NiwgMHgzODRmMjVlMyksIG5ldyBXb3JkNjQoMHgwZmMxOWRjNiwgMHg4YjhjZDViNSksIG5ldyBXb3JkNjQoMHgyNDBjYTFjYywgMHg3N2FjOWM2NSksIG5ldyBXb3JkNjQoMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSksIG5ldyBXb3JkNjQoMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyksIG5ldyBXb3JkNjQoMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCksIG5ldyBXb3JkNjQoMHg3NmY5ODhkYSwgMHg4MzExNTNiNSksIG5ldyBXb3JkNjQoMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiksIG5ldyBXb3JkNjQoMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCksIG5ldyBXb3JkNjQoMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiksIG5ldyBXb3JkNjQoMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCksIG5ldyBXb3JkNjQoMHhjNmUwMGJmMywgMHgzZGE4OGZjMiksIG5ldyBXb3JkNjQoMHhkNWE3OTE0NywgMHg5MzBhYTcyNSksIG5ldyBXb3JkNjQoMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiksIG5ldyBXb3JkNjQoMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCksIG5ldyBXb3JkNjQoMHgyN2I3MGE4NSwgMHg0NmQyMmZmYyksIG5ldyBXb3JkNjQoMHgyZTFiMjEzOCwgMHg1YzI2YzkyNiksIG5ldyBXb3JkNjQoMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCksIG5ldyBXb3JkNjQoMHg1MzM4MGQxMywgMHg5ZDk1YjNkZiksIG5ldyBXb3JkNjQoMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSksIG5ldyBXb3JkNjQoMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCksIG5ldyBXb3JkNjQoMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiksIG5ldyBXb3JkNjQoMHg5MjcyMmM4NSwgMHgxNDgyMzUzYiksIG5ldyBXb3JkNjQoMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCksIG5ldyBXb3JkNjQoMHhhODFhNjY0YiwgMHhiYzQyMzAwMSksIG5ldyBXb3JkNjQoMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSksIG5ldyBXb3JkNjQoMHhjNzZjNTFhMywgMHgwNjU0YmUzMCksIG5ldyBXb3JkNjQoMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCksIG5ldyBXb3JkNjQoMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCksIG5ldyBXb3JkNjQoMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSksIG5ldyBXb3JkNjQoMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCksIG5ldyBXb3JkNjQoMHgxOWE0YzExNiwgMHhiOGQyZDBjOCksIG5ldyBXb3JkNjQoMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyksIG5ldyBXb3JkNjQoMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSksIG5ldyBXb3JkNjQoMHgzNGIwYmNiNSwgMHhlMTliNDhhOCksIG5ldyBXb3JkNjQoMHgzOTFjMGNiMywgMHhjNWM5NWE2MyksIG5ldyBXb3JkNjQoMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYiksIG5ldyBXb3JkNjQoMHg1YjljY2E0ZiwgMHg3NzYzZTM3MyksIG5ldyBXb3JkNjQoMHg2ODJlNmZmMywgMHhkNmIyYjhhMyksIG5ldyBXb3JkNjQoMHg3NDhmODJlZSwgMHg1ZGVmYjJmYyksIG5ldyBXb3JkNjQoMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCksIG5ldyBXb3JkNjQoMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiksIG5ldyBXb3JkNjQoMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyksIG5ldyBXb3JkNjQoMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCksIG5ldyBXb3JkNjQoMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSksIG5ldyBXb3JkNjQoMHhiZWY5YTNmNywgMHhiMmM2NzkxNSksIG5ldyBXb3JkNjQoMHhjNjcxNzhmMiwgMHhlMzcyNTMyYiksIG5ldyBXb3JkNjQoMHhjYTI3M2VjZSwgMHhlYTI2NjE5YyksIG5ldyBXb3JkNjQoMHhkMTg2YjhjNywgMHgyMWMwYzIwNyksIG5ldyBXb3JkNjQoMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSksIG5ldyBXb3JkNjQoMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCksIG5ldyBXb3JkNjQoMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSksIG5ldyBXb3JkNjQoMHgwYTYzN2RjNSwgMHhhMmM4OThhNiksIG5ldyBXb3JkNjQoMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSksIG5ldyBXb3JkNjQoMHgxYjcxMGIzNSwgMHgxMzFjNDcxYiksIG5ldyBXb3JkNjQoMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCksIG5ldyBXb3JkNjQoMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyksIG5ldyBXb3JkNjQoMHgzYzllYmUwYSwgMHgxNWM5YmViYyksIG5ldyBXb3JkNjQoMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyksIG5ldyBXb3JkNjQoMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiksIG5ldyBXb3JkNjQoMHg1OTdmMjk5YywgMHhmYzY1N2UyYSksIG5ldyBXb3JkNjQoMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYyksIG5ldyBXb3JkNjQoMHg2YzQ0MTk4YywgMHg0YTQ3NTgxNyldKTsKICB9Cn07CmZ1bmN0aW9uIGNoKHJlc3VsdCwgeCwgeSwgeiwgdG1wKSB7CiAgcmVzdWx0LmFzc2lnbih4KTsKICByZXN1bHQuYW5kKHkpOwogIHRtcC5hc3NpZ24oeCk7CiAgdG1wLm5vdCgpOwogIHRtcC5hbmQoeik7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIG1haihyZXN1bHQsIHgsIHksIHosIHRtcCkgewogIHJlc3VsdC5hc3NpZ24oeCk7CiAgcmVzdWx0LmFuZCh5KTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5hbmQoeik7CiAgcmVzdWx0Lnhvcih0bXApOwogIHRtcC5hc3NpZ24oeSk7CiAgdG1wLmFuZCh6KTsKICByZXN1bHQueG9yKHRtcCk7Cn0KZnVuY3Rpb24gc2lnbWEocmVzdWx0LCB4LCB0bXApIHsKICByZXN1bHQuYXNzaWduKHgpOwogIHJlc3VsdC5yb3RhdGVSaWdodCgyOCk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoMzQpOwogIHJlc3VsdC54b3IodG1wKTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5yb3RhdGVSaWdodCgzOSk7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIHNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHsKICByZXN1bHQuYXNzaWduKHgpOwogIHJlc3VsdC5yb3RhdGVSaWdodCgxNCk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoMTgpOwogIHJlc3VsdC54b3IodG1wKTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5yb3RhdGVSaWdodCg0MSk7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIGxpdHRsZVNpZ21hKHJlc3VsdCwgeCwgdG1wKSB7CiAgcmVzdWx0LmFzc2lnbih4KTsKICByZXN1bHQucm90YXRlUmlnaHQoMSk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoOCk7CiAgcmVzdWx0Lnhvcih0bXApOwogIHRtcC5hc3NpZ24oeCk7CiAgdG1wLnNoaWZ0UmlnaHQoNyk7CiAgcmVzdWx0Lnhvcih0bXApOwp9CmZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHsKICByZXN1bHQuYXNzaWduKHgpOwogIHJlc3VsdC5yb3RhdGVSaWdodCgxOSk7CiAgdG1wLmFzc2lnbih4KTsKICB0bXAucm90YXRlUmlnaHQoNjEpOwogIHJlc3VsdC54b3IodG1wKTsKICB0bXAuYXNzaWduKHgpOwogIHRtcC5zaGlmdFJpZ2h0KDYpOwogIHJlc3VsdC54b3IodG1wKTsKfQpmdW5jdGlvbiBjYWxjdWxhdGVTSEE1MTIoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIG1vZGUzODQgPSBmYWxzZSkgewogIGxldCBoMCwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaDc7CiAgaWYgKCFtb2RlMzg0KSB7CiAgICBoMCA9IG5ldyBXb3JkNjQoMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCk7CiAgICBoMSA9IG5ldyBXb3JkNjQoMHhiYjY3YWU4NSwgMHg4NGNhYTczYik7CiAgICBoMiA9IG5ldyBXb3JkNjQoMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYik7CiAgICBoMyA9IG5ldyBXb3JkNjQoMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSk7CiAgICBoNCA9IG5ldyBXb3JkNjQoMHg1MTBlNTI3ZiwgMHhhZGU2ODJkMSk7CiAgICBoNSA9IG5ldyBXb3JkNjQoMHg5YjA1Njg4YywgMHgyYjNlNmMxZik7CiAgICBoNiA9IG5ldyBXb3JkNjQoMHgxZjgzZDlhYiwgMHhmYjQxYmQ2Yik7CiAgICBoNyA9IG5ldyBXb3JkNjQoMHg1YmUwY2QxOSwgMHgxMzdlMjE3OSk7CiAgfSBlbHNlIHsKICAgIGgwID0gbmV3IFdvcmQ2NCgweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4KTsKICAgIGgxID0gbmV3IFdvcmQ2NCgweDYyOWEyOTJhLCAweDM2N2NkNTA3KTsKICAgIGgyID0gbmV3IFdvcmQ2NCgweDkxNTkwMTVhLCAweDMwNzBkZDE3KTsKICAgIGgzID0gbmV3IFdvcmQ2NCgweDE1MmZlY2Q4LCAweGY3MGU1OTM5KTsKICAgIGg0ID0gbmV3IFdvcmQ2NCgweDY3MzMyNjY3LCAweGZmYzAwYjMxKTsKICAgIGg1ID0gbmV3IFdvcmQ2NCgweDhlYjQ0YTg3LCAweDY4NTgxNTExKTsKICAgIGg2ID0gbmV3IFdvcmQ2NCgweGRiMGMyZTBkLCAweDY0Zjk4ZmE3KTsKICAgIGg3ID0gbmV3IFdvcmQ2NCgweDQ3YjU0ODFkLCAweGJlZmE0ZmE0KTsKICB9CiAgY29uc3QgcGFkZGVkTGVuZ3RoID0gTWF0aC5jZWlsKChsZW5ndGggKyAxNykgLyAxMjgpICogMTI4OwogIGNvbnN0IHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7CiAgbGV0IGksIGo7CiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTsKICB9CiAgcGFkZGVkW2krK10gPSAweDgwOwogIGNvbnN0IG4gPSBwYWRkZWRMZW5ndGggLSAxNjsKICBpZiAoaSA8IG4pIHsKICAgIGkgPSBuOwogIH0KICBpICs9IDExOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+PiAyOSAmIDB4ZmY7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMjEgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDEzICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiA1ICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA8PCAzICYgMHhmZjsKICBjb25zdCB3ID0gbmV3IEFycmF5KDgwKTsKICBmb3IgKGkgPSAwOyBpIDwgODA7IGkrKykgewogICAgd1tpXSA9IG5ldyBXb3JkNjQoMCwgMCk7CiAgfQogIGNvbnN0IHsKICAgIGsKICB9ID0gY2FsY3VsYXRlX3NoYV9vdGhlcl9QQVJBTVM7CiAgbGV0IGEgPSBuZXcgV29yZDY0KDAsIDApLAogICAgYiA9IG5ldyBXb3JkNjQoMCwgMCksCiAgICBjID0gbmV3IFdvcmQ2NCgwLCAwKTsKICBsZXQgZCA9IG5ldyBXb3JkNjQoMCwgMCksCiAgICBlID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIGYgPSBuZXcgV29yZDY0KDAsIDApOwogIGxldCBnID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIGggPSBuZXcgV29yZDY0KDAsIDApOwogIGNvbnN0IHQxID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIHQyID0gbmV3IFdvcmQ2NCgwLCAwKTsKICBjb25zdCB0bXAxID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgIHRtcDIgPSBuZXcgV29yZDY0KDAsIDApOwogIGxldCB0bXAzOwogIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7KSB7CiAgICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICB3W2pdLmhpZ2ggPSBwYWRkZWRbaV0gPDwgMjQgfCBwYWRkZWRbaSArIDFdIDw8IDE2IHwgcGFkZGVkW2kgKyAyXSA8PCA4IHwgcGFkZGVkW2kgKyAzXTsKICAgICAgd1tqXS5sb3cgPSBwYWRkZWRbaSArIDRdIDw8IDI0IHwgcGFkZGVkW2kgKyA1XSA8PCAxNiB8IHBhZGRlZFtpICsgNl0gPDwgOCB8IHBhZGRlZFtpICsgN107CiAgICAgIGkgKz0gODsKICAgIH0KICAgIGZvciAoaiA9IDE2OyBqIDwgODA7ICsraikgewogICAgICB0bXAzID0gd1tqXTsKICAgICAgbGl0dGxlU2lnbWFQcmltZSh0bXAzLCB3W2ogLSAyXSwgdG1wMik7CiAgICAgIHRtcDMuYWRkKHdbaiAtIDddKTsKICAgICAgbGl0dGxlU2lnbWEodG1wMSwgd1tqIC0gMTVdLCB0bXAyKTsKICAgICAgdG1wMy5hZGQodG1wMSk7CiAgICAgIHRtcDMuYWRkKHdbaiAtIDE2XSk7CiAgICB9CiAgICBhLmFzc2lnbihoMCk7CiAgICBiLmFzc2lnbihoMSk7CiAgICBjLmFzc2lnbihoMik7CiAgICBkLmFzc2lnbihoMyk7CiAgICBlLmFzc2lnbihoNCk7CiAgICBmLmFzc2lnbihoNSk7CiAgICBnLmFzc2lnbihoNik7CiAgICBoLmFzc2lnbihoNyk7CiAgICBmb3IgKGogPSAwOyBqIDwgODA7ICsraikgewogICAgICB0MS5hc3NpZ24oaCk7CiAgICAgIHNpZ21hUHJpbWUodG1wMSwgZSwgdG1wMik7CiAgICAgIHQxLmFkZCh0bXAxKTsKICAgICAgY2godG1wMSwgZSwgZiwgZywgdG1wMik7CiAgICAgIHQxLmFkZCh0bXAxKTsKICAgICAgdDEuYWRkKGtbal0pOwogICAgICB0MS5hZGQod1tqXSk7CiAgICAgIHNpZ21hKHQyLCBhLCB0bXAyKTsKICAgICAgbWFqKHRtcDEsIGEsIGIsIGMsIHRtcDIpOwogICAgICB0Mi5hZGQodG1wMSk7CiAgICAgIHRtcDMgPSBoOwogICAgICBoID0gZzsKICAgICAgZyA9IGY7CiAgICAgIGYgPSBlOwogICAgICBkLmFkZCh0MSk7CiAgICAgIGUgPSBkOwogICAgICBkID0gYzsKICAgICAgYyA9IGI7CiAgICAgIGIgPSBhOwogICAgICB0bXAzLmFzc2lnbih0MSk7CiAgICAgIHRtcDMuYWRkKHQyKTsKICAgICAgYSA9IHRtcDM7CiAgICB9CiAgICBoMC5hZGQoYSk7CiAgICBoMS5hZGQoYik7CiAgICBoMi5hZGQoYyk7CiAgICBoMy5hZGQoZCk7CiAgICBoNC5hZGQoZSk7CiAgICBoNS5hZGQoZik7CiAgICBoNi5hZGQoZyk7CiAgICBoNy5hZGQoaCk7CiAgfQogIGxldCByZXN1bHQ7CiAgaWYgKCFtb2RlMzg0KSB7CiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheSg2NCk7CiAgICBoMC5jb3B5VG8ocmVzdWx0LCAwKTsKICAgIGgxLmNvcHlUbyhyZXN1bHQsIDgpOwogICAgaDIuY29weVRvKHJlc3VsdCwgMTYpOwogICAgaDMuY29weVRvKHJlc3VsdCwgMjQpOwogICAgaDQuY29weVRvKHJlc3VsdCwgMzIpOwogICAgaDUuY29weVRvKHJlc3VsdCwgNDApOwogICAgaDYuY29weVRvKHJlc3VsdCwgNDgpOwogICAgaDcuY29weVRvKHJlc3VsdCwgNTYpOwogIH0gZWxzZSB7CiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheSg0OCk7CiAgICBoMC5jb3B5VG8ocmVzdWx0LCAwKTsKICAgIGgxLmNvcHlUbyhyZXN1bHQsIDgpOwogICAgaDIuY29weVRvKHJlc3VsdCwgMTYpOwogICAgaDMuY29weVRvKHJlc3VsdCwgMjQpOwogICAgaDQuY29weVRvKHJlc3VsdCwgMzIpOwogICAgaDUuY29weVRvKHJlc3VsdCwgNDApOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTM4NChkYXRhLCBvZmZzZXQsIGxlbmd0aCkgewogIHJldHVybiBjYWxjdWxhdGVTSEE1MTIoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIHRydWUpOwp9Cgo7Ly8gLi9zcmMvY29yZS9jYWxjdWxhdGVfc2hhMjU2LmpzCgpjb25zdCBjYWxjdWxhdGVfc2hhMjU2X1BBUkFNUyA9IHsKICBnZXQgaygpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImsiLCBbMHg0MjhhMmY5OCwgMHg3MTM3NDQ5MSwgMHhiNWMwZmJjZiwgMHhlOWI1ZGJhNSwgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSwgMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMywgMHg3MmJlNWQ3NCwgMHg4MGRlYjFmZSwgMHg5YmRjMDZhNywgMHhjMTliZjE3NCwgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYywgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSwgMHg5ODNlNTE1MiwgMHhhODMxYzY2ZCwgMHhiMDAzMjdjOCwgMHhiZjU5N2ZjNywgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NywgMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMywgMHg2NTBhNzM1NCwgMHg3NjZhMGFiYiwgMHg4MWMyYzkyZSwgMHg5MjcyMmM4NSwgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCwgMHgxOWE0YzExNiwgMHgxZTM3NmMwOCwgMHgyNzQ4Nzc0YywgMHgzNGIwYmNiNSwgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMywgMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOCwgMHg5MGJlZmZmYSwgMHhhNDUwNmNlYiwgMHhiZWY5YTNmNywgMHhjNjcxNzhmMl0pOwogIH0KfTsKZnVuY3Rpb24gcm90cih4LCBuKSB7CiAgcmV0dXJuIHggPj4+IG4gfCB4IDw8IDMyIC0gbjsKfQpmdW5jdGlvbiBjYWxjdWxhdGVfc2hhMjU2X2NoKHgsIHksIHopIHsKICByZXR1cm4geCAmIHkgXiB+eCAmIHo7Cn0KZnVuY3Rpb24gY2FsY3VsYXRlX3NoYTI1Nl9tYWooeCwgeSwgeikgewogIHJldHVybiB4ICYgeSBeIHggJiB6IF4geSAmIHo7Cn0KZnVuY3Rpb24gY2FsY3VsYXRlX3NoYTI1Nl9zaWdtYSh4KSB7CiAgcmV0dXJuIHJvdHIoeCwgMikgXiByb3RyKHgsIDEzKSBeIHJvdHIoeCwgMjIpOwp9CmZ1bmN0aW9uIGNhbGN1bGF0ZV9zaGEyNTZfc2lnbWFQcmltZSh4KSB7CiAgcmV0dXJuIHJvdHIoeCwgNikgXiByb3RyKHgsIDExKSBeIHJvdHIoeCwgMjUpOwp9CmZ1bmN0aW9uIGNhbGN1bGF0ZV9zaGEyNTZfbGl0dGxlU2lnbWEoeCkgewogIHJldHVybiByb3RyKHgsIDcpIF4gcm90cih4LCAxOCkgXiB4ID4+PiAzOwp9CmZ1bmN0aW9uIGNhbGN1bGF0ZV9zaGEyNTZfbGl0dGxlU2lnbWFQcmltZSh4KSB7CiAgcmV0dXJuIHJvdHIoeCwgMTcpIF4gcm90cih4LCAxOSkgXiB4ID4+PiAxMDsKfQpmdW5jdGlvbiBjYWxjdWxhdGVTSEEyNTYoZGF0YSwgb2Zmc2V0LCBsZW5ndGgpIHsKICBsZXQgaDAgPSAweDZhMDllNjY3LAogICAgaDEgPSAweGJiNjdhZTg1LAogICAgaDIgPSAweDNjNmVmMzcyLAogICAgaDMgPSAweGE1NGZmNTNhLAogICAgaDQgPSAweDUxMGU1MjdmLAogICAgaDUgPSAweDliMDU2ODhjLAogICAgaDYgPSAweDFmODNkOWFiLAogICAgaDcgPSAweDViZTBjZDE5OwogIGNvbnN0IHBhZGRlZExlbmd0aCA9IE1hdGguY2VpbCgobGVuZ3RoICsgOSkgLyA2NCkgKiA2NDsKICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOwogIGxldCBpLCBqOwogIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgcGFkZGVkW2ldID0gZGF0YVtvZmZzZXQrK107CiAgfQogIHBhZGRlZFtpKytdID0gMHg4MDsKICBjb25zdCBuID0gcGFkZGVkTGVuZ3RoIC0gODsKICBpZiAoaSA8IG4pIHsKICAgIGkgPSBuOwogIH0KICBpICs9IDM7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4+IDI5ICYgMHhmZjsKICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAyMSAmIDB4ZmY7CiAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMTMgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDUgJiAweGZmOwogIHBhZGRlZFtpKytdID0gbGVuZ3RoIDw8IDMgJiAweGZmOwogIGNvbnN0IHcgPSBuZXcgVWludDMyQXJyYXkoNjQpOwogIGNvbnN0IHsKICAgIGsKICB9ID0gY2FsY3VsYXRlX3NoYTI1Nl9QQVJBTVM7CiAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDspIHsKICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CiAgICAgIHdbal0gPSBwYWRkZWRbaV0gPDwgMjQgfCBwYWRkZWRbaSArIDFdIDw8IDE2IHwgcGFkZGVkW2kgKyAyXSA8PCA4IHwgcGFkZGVkW2kgKyAzXTsKICAgICAgaSArPSA0OwogICAgfQogICAgZm9yIChqID0gMTY7IGogPCA2NDsgKytqKSB7CiAgICAgIHdbal0gPSBjYWxjdWxhdGVfc2hhMjU2X2xpdHRsZVNpZ21hUHJpbWUod1tqIC0gMl0pICsgd1tqIC0gN10gKyBjYWxjdWxhdGVfc2hhMjU2X2xpdHRsZVNpZ21hKHdbaiAtIDE1XSkgKyB3W2ogLSAxNl0gfCAwOwogICAgfQogICAgbGV0IGEgPSBoMCwKICAgICAgYiA9IGgxLAogICAgICBjID0gaDIsCiAgICAgIGQgPSBoMywKICAgICAgZSA9IGg0LAogICAgICBmID0gaDUsCiAgICAgIGcgPSBoNiwKICAgICAgaCA9IGg3LAogICAgICB0MSwKICAgICAgdDI7CiAgICBmb3IgKGogPSAwOyBqIDwgNjQ7ICsraikgewogICAgICB0MSA9IGggKyBjYWxjdWxhdGVfc2hhMjU2X3NpZ21hUHJpbWUoZSkgKyBjYWxjdWxhdGVfc2hhMjU2X2NoKGUsIGYsIGcpICsga1tqXSArIHdbal07CiAgICAgIHQyID0gY2FsY3VsYXRlX3NoYTI1Nl9zaWdtYShhKSArIGNhbGN1bGF0ZV9zaGEyNTZfbWFqKGEsIGIsIGMpOwogICAgICBoID0gZzsKICAgICAgZyA9IGY7CiAgICAgIGYgPSBlOwogICAgICBlID0gZCArIHQxIHwgMDsKICAgICAgZCA9IGM7CiAgICAgIGMgPSBiOwogICAgICBiID0gYTsKICAgICAgYSA9IHQxICsgdDIgfCAwOwogICAgfQogICAgaDAgPSBoMCArIGEgfCAwOwogICAgaDEgPSBoMSArIGIgfCAwOwogICAgaDIgPSBoMiArIGMgfCAwOwogICAgaDMgPSBoMyArIGQgfCAwOwogICAgaDQgPSBoNCArIGUgfCAwOwogICAgaDUgPSBoNSArIGYgfCAwOwogICAgaDYgPSBoNiArIGcgfCAwOwogICAgaDcgPSBoNyArIGggfCAwOwogIH0KICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoW2gwID4+IDI0ICYgMHhGRiwgaDAgPj4gMTYgJiAweEZGLCBoMCA+PiA4ICYgMHhGRiwgaDAgJiAweEZGLCBoMSA+PiAyNCAmIDB4RkYsIGgxID4+IDE2ICYgMHhGRiwgaDEgPj4gOCAmIDB4RkYsIGgxICYgMHhGRiwgaDIgPj4gMjQgJiAweEZGLCBoMiA+PiAxNiAmIDB4RkYsIGgyID4+IDggJiAweEZGLCBoMiAmIDB4RkYsIGgzID4+IDI0ICYgMHhGRiwgaDMgPj4gMTYgJiAweEZGLCBoMyA+PiA4ICYgMHhGRiwgaDMgJiAweEZGLCBoNCA+PiAyNCAmIDB4RkYsIGg0ID4+IDE2ICYgMHhGRiwgaDQgPj4gOCAmIDB4RkYsIGg0ICYgMHhGRiwgaDUgPj4gMjQgJiAweEZGLCBoNSA+PiAxNiAmIDB4RkYsIGg1ID4+IDggJiAweEZGLCBoNSAmIDB4RkYsIGg2ID4+IDI0ICYgMHhGRiwgaDYgPj4gMTYgJiAweEZGLCBoNiA+PiA4ICYgMHhGRiwgaDYgJiAweEZGLCBoNyA+PiAyNCAmIDB4RkYsIGg3ID4+IDE2ICYgMHhGRiwgaDcgPj4gOCAmIDB4RkYsIGg3ICYgMHhGRl0pOwp9Cgo7Ly8gLi9zcmMvY29yZS9kZWNyeXB0X3N0cmVhbS5qcwoKY29uc3QgY2h1bmtTaXplID0gNTEyOwpjbGFzcyBEZWNyeXB0U3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoLCBkZWNyeXB0KSB7CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgdGhpcy5kZWNyeXB0ID0gZGVjcnlwdDsKICAgIHRoaXMubmV4dENodW5rID0gbnVsbDsKICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgbGV0IGNodW5rOwogICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHsKICAgICAgY2h1bmsgPSB0aGlzLm5leHRDaHVuazsKICAgIH0gZWxzZSB7CiAgICAgIGNodW5rID0gdGhpcy5zdHIuZ2V0Qnl0ZXMoY2h1bmtTaXplKTsKICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CiAgICB9CiAgICBpZiAoIWNodW5rPy5sZW5ndGgpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLm5leHRDaHVuayA9IHRoaXMuc3RyLmdldEJ5dGVzKGNodW5rU2l6ZSk7CiAgICBjb25zdCBoYXNNb3JlRGF0YSA9IHRoaXMubmV4dENodW5rPy5sZW5ndGggPiAwOwogICAgY29uc3QgZGVjcnlwdCA9IHRoaXMuZGVjcnlwdDsKICAgIGNodW5rID0gZGVjcnlwdChjaHVuaywgIWhhc01vcmVEYXRhKTsKICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoLAogICAgICBuZXdMZW5ndGggPSBidWZmZXJMZW5ndGggKyBjaHVuay5sZW5ndGgsCiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKG5ld0xlbmd0aCk7CiAgICBidWZmZXIuc2V0KGNodW5rLCBidWZmZXJMZW5ndGgpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jcnlwdG8uanMKCgoKCgoKY2xhc3MgQVJDRm91ckNpcGhlciB7CiAgY29uc3RydWN0b3Ioa2V5KSB7CiAgICB0aGlzLmEgPSAwOwogICAgdGhpcy5iID0gMDsKICAgIGNvbnN0IHMgPSBuZXcgVWludDhBcnJheSgyNTYpOwogICAgY29uc3Qga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKICAgICAgc1tpXSA9IGk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCAyNTY7ICsraSkgewogICAgICBjb25zdCB0bXAgPSBzW2ldOwogICAgICBqID0gaiArIHRtcCArIGtleVtpICUga2V5TGVuZ3RoXSAmIDB4ZmY7CiAgICAgIHNbaV0gPSBzW2pdOwogICAgICBzW2pdID0gdG1wOwogICAgfQogICAgdGhpcy5zID0gczsKICB9CiAgZW5jcnlwdEJsb2NrKGRhdGEpIHsKICAgIGxldCBhID0gdGhpcy5hLAogICAgICBiID0gdGhpcy5iOwogICAgY29uc3QgcyA9IHRoaXMuczsKICAgIGNvbnN0IG4gPSBkYXRhLmxlbmd0aDsKICAgIGNvbnN0IG91dHB1dCA9IG5ldyBVaW50OEFycmF5KG4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgYSA9IGEgKyAxICYgMHhmZjsKICAgICAgY29uc3QgdG1wID0gc1thXTsKICAgICAgYiA9IGIgKyB0bXAgJiAweGZmOwogICAgICBjb25zdCB0bXAyID0gc1tiXTsKICAgICAgc1thXSA9IHRtcDI7CiAgICAgIHNbYl0gPSB0bXA7CiAgICAgIG91dHB1dFtpXSA9IGRhdGFbaV0gXiBzW3RtcCArIHRtcDIgJiAweGZmXTsKICAgIH0KICAgIHRoaXMuYSA9IGE7CiAgICB0aGlzLmIgPSBiOwogICAgcmV0dXJuIG91dHB1dDsKICB9CiAgZGVjcnlwdEJsb2NrKGRhdGEpIHsKICAgIHJldHVybiB0aGlzLmVuY3J5cHRCbG9jayhkYXRhKTsKICB9CiAgZW5jcnlwdChkYXRhKSB7CiAgICByZXR1cm4gdGhpcy5lbmNyeXB0QmxvY2soZGF0YSk7CiAgfQp9CmNsYXNzIE51bGxDaXBoZXIgewogIGRlY3J5cHRCbG9jayhkYXRhKSB7CiAgICByZXR1cm4gZGF0YTsKICB9CiAgZW5jcnlwdChkYXRhKSB7CiAgICByZXR1cm4gZGF0YTsKICB9Cn0KY2xhc3MgQUVTQmFzZUNpcGhlciB7CiAgX3MgPSBuZXcgVWludDhBcnJheShbMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwgMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwgMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwgMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywgMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwgMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwgMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwgMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwgMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwgMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwgMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwgMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwgMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwgMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywgMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwgMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwgMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywgMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwgMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwgMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwgMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwgMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwgMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwgMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwgMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwgMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNl0pOwogIF9pbnZfcyA9IG5ldyBVaW50OEFycmF5KFsweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4LCAweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiLCAweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3LCAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiLCAweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkLCAweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlLCAweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyLCAweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1LCAweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LCAweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyLCAweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhLCAweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0LCAweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhLCAweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2LCAweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyLCAweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiLCAweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhLCAweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczLCAweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1LCAweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlLCAweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5LCAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiLCAweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwLCAweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0LCAweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxLCAweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmLCAweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkLCAweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmLCAweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwLCAweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxLCAweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2LCAweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkXSk7CiAgX21peCA9IG5ldyBVaW50MzJBcnJheShbMHgwMDAwMDAwMCwgMHgwZTA5MGQwYiwgMHgxYzEyMWExNiwgMHgxMjFiMTcxZCwgMHgzODI0MzQyYywgMHgzNjJkMzkyNywgMHgyNDM2MmUzYSwgMHgyYTNmMjMzMSwgMHg3MDQ4Njg1OCwgMHg3ZTQxNjU1MywgMHg2YzVhNzI0ZSwgMHg2MjUzN2Y0NSwgMHg0ODZjNWM3NCwgMHg0NjY1NTE3ZiwgMHg1NDdlNDY2MiwgMHg1YTc3NGI2OSwgMHhlMDkwZDBiMCwgMHhlZTk5ZGRiYiwgMHhmYzgyY2FhNiwgMHhmMjhiYzdhZCwgMHhkOGI0ZTQ5YywgMHhkNmJkZTk5NywgMHhjNGE2ZmU4YSwgMHhjYWFmZjM4MSwgMHg5MGQ4YjhlOCwgMHg5ZWQxYjVlMywgMHg4Y2NhYTJmZSwgMHg4MmMzYWZmNSwgMHhhOGZjOGNjNCwgMHhhNmY1ODFjZiwgMHhiNGVlOTZkMiwgMHhiYWU3OWJkOSwgMHhkYjNiYmI3YiwgMHhkNTMyYjY3MCwgMHhjNzI5YTE2ZCwgMHhjOTIwYWM2NiwgMHhlMzFmOGY1NywgMHhlZDE2ODI1YywgMHhmZjBkOTU0MSwgMHhmMTA0OTg0YSwgMHhhYjczZDMyMywgMHhhNTdhZGUyOCwgMHhiNzYxYzkzNSwgMHhiOTY4YzQzZSwgMHg5MzU3ZTcwZiwgMHg5ZDVlZWEwNCwgMHg4ZjQ1ZmQxOSwgMHg4MTRjZjAxMiwgMHgzYmFiNmJjYiwgMHgzNWEyNjZjMCwgMHgyN2I5NzFkZCwgMHgyOWIwN2NkNiwgMHgwMzhmNWZlNywgMHgwZDg2NTJlYywgMHgxZjlkNDVmMSwgMHgxMTk0NDhmYSwgMHg0YmUzMDM5MywgMHg0NWVhMGU5OCwgMHg1N2YxMTk4NSwgMHg1OWY4MTQ4ZSwgMHg3M2M3MzdiZiwgMHg3ZGNlM2FiNCwgMHg2ZmQ1MmRhOSwgMHg2MWRjMjBhMiwgMHhhZDc2NmRmNiwgMHhhMzdmNjBmZCwgMHhiMTY0NzdlMCwgMHhiZjZkN2FlYiwgMHg5NTUyNTlkYSwgMHg5YjViNTRkMSwgMHg4OTQwNDNjYywgMHg4NzQ5NGVjNywgMHhkZDNlMDVhZSwgMHhkMzM3MDhhNSwgMHhjMTJjMWZiOCwgMHhjZjI1MTJiMywgMHhlNTFhMzE4MiwgMHhlYjEzM2M4OSwgMHhmOTA4MmI5NCwgMHhmNzAxMjY5ZiwgMHg0ZGU2YmQ0NiwgMHg0M2VmYjA0ZCwgMHg1MWY0YTc1MCwgMHg1ZmZkYWE1YiwgMHg3NWMyODk2YSwgMHg3YmNiODQ2MSwgMHg2OWQwOTM3YywgMHg2N2Q5OWU3NywgMHgzZGFlZDUxZSwgMHgzM2E3ZDgxNSwgMHgyMWJjY2YwOCwgMHgyZmI1YzIwMywgMHgwNThhZTEzMiwgMHgwYjgzZWMzOSwgMHgxOTk4ZmIyNCwgMHgxNzkxZjYyZiwgMHg3NjRkZDY4ZCwgMHg3ODQ0ZGI4NiwgMHg2YTVmY2M5YiwgMHg2NDU2YzE5MCwgMHg0ZTY5ZTJhMSwgMHg0MDYwZWZhYSwgMHg1MjdiZjhiNywgMHg1YzcyZjViYywgMHgwNjA1YmVkNSwgMHgwODBjYjNkZSwgMHgxYTE3YTRjMywgMHgxNDFlYTljOCwgMHgzZTIxOGFmOSwgMHgzMDI4ODdmMiwgMHgyMjMzOTBlZiwgMHgyYzNhOWRlNCwgMHg5NmRkMDYzZCwgMHg5OGQ0MGIzNiwgMHg4YWNmMWMyYiwgMHg4NGM2MTEyMCwgMHhhZWY5MzIxMSwgMHhhMGYwM2YxYSwgMHhiMmViMjgwNywgMHhiY2UyMjUwYywgMHhlNjk1NmU2NSwgMHhlODljNjM2ZSwgMHhmYTg3NzQ3MywgMHhmNDhlNzk3OCwgMHhkZWIxNWE0OSwgMHhkMGI4NTc0MiwgMHhjMmEzNDA1ZiwgMHhjY2FhNGQ1NCwgMHg0MWVjZGFmNywgMHg0ZmU1ZDdmYywgMHg1ZGZlYzBlMSwgMHg1M2Y3Y2RlYSwgMHg3OWM4ZWVkYiwgMHg3N2MxZTNkMCwgMHg2NWRhZjRjZCwgMHg2YmQzZjljNiwgMHgzMWE0YjJhZiwgMHgzZmFkYmZhNCwgMHgyZGI2YThiOSwgMHgyM2JmYTViMiwgMHgwOTgwODY4MywgMHgwNzg5OGI4OCwgMHgxNTkyOWM5NSwgMHgxYjliOTE5ZSwgMHhhMTdjMGE0NywgMHhhZjc1MDc0YywgMHhiZDZlMTA1MSwgMHhiMzY3MWQ1YSwgMHg5OTU4M2U2YiwgMHg5NzUxMzM2MCwgMHg4NTRhMjQ3ZCwgMHg4YjQzMjk3NiwgMHhkMTM0NjIxZiwgMHhkZjNkNmYxNCwgMHhjZDI2NzgwOSwgMHhjMzJmNzUwMiwgMHhlOTEwNTYzMywgMHhlNzE5NWIzOCwgMHhmNTAyNGMyNSwgMHhmYjBiNDEyZSwgMHg5YWQ3NjE4YywgMHg5NGRlNmM4NywgMHg4NmM1N2I5YSwgMHg4OGNjNzY5MSwgMHhhMmYzNTVhMCwgMHhhY2ZhNThhYiwgMHhiZWUxNGZiNiwgMHhiMGU4NDJiZCwgMHhlYTlmMDlkNCwgMHhlNDk2MDRkZiwgMHhmNjhkMTNjMiwgMHhmODg0MWVjOSwgMHhkMmJiM2RmOCwgMHhkY2IyMzBmMywgMHhjZWE5MjdlZSwgMHhjMGEwMmFlNSwgMHg3YTQ3YjEzYywgMHg3NDRlYmMzNywgMHg2NjU1YWIyYSwgMHg2ODVjYTYyMSwgMHg0MjYzODUxMCwgMHg0YzZhODgxYiwgMHg1ZTcxOWYwNiwgMHg1MDc4OTIwZCwgMHgwYTBmZDk2NCwgMHgwNDA2ZDQ2ZiwgMHgxNjFkYzM3MiwgMHgxODE0Y2U3OSwgMHgzMjJiZWQ0OCwgMHgzYzIyZTA0MywgMHgyZTM5Zjc1ZSwgMHgyMDMwZmE1NSwgMHhlYzlhYjcwMSwgMHhlMjkzYmEwYSwgMHhmMDg4YWQxNywgMHhmZTgxYTAxYywgMHhkNGJlODMyZCwgMHhkYWI3OGUyNiwgMHhjOGFjOTkzYiwgMHhjNmE1OTQzMCwgMHg5Y2QyZGY1OSwgMHg5MmRiZDI1MiwgMHg4MGMwYzU0ZiwgMHg4ZWM5Yzg0NCwgMHhhNGY2ZWI3NSwgMHhhYWZmZTY3ZSwgMHhiOGU0ZjE2MywgMHhiNmVkZmM2OCwgMHgwYzBhNjdiMSwgMHgwMjAzNmFiYSwgMHgxMDE4N2RhNywgMHgxZTExNzBhYywgMHgzNDJlNTM5ZCwgMHgzYTI3NWU5NiwgMHgyODNjNDk4YiwgMHgyNjM1NDQ4MCwgMHg3YzQyMGZlOSwgMHg3MjRiMDJlMiwgMHg2MDUwMTVmZiwgMHg2ZTU5MThmNCwgMHg0NDY2M2JjNSwgMHg0YTZmMzZjZSwgMHg1ODc0MjFkMywgMHg1NjdkMmNkOCwgMHgzN2ExMGM3YSwgMHgzOWE4MDE3MSwgMHgyYmIzMTY2YywgMHgyNWJhMWI2NywgMHgwZjg1Mzg1NiwgMHgwMThjMzU1ZCwgMHgxMzk3MjI0MCwgMHgxZDllMmY0YiwgMHg0N2U5NjQyMiwgMHg0OWUwNjkyOSwgMHg1YmZiN2UzNCwgMHg1NWYyNzMzZiwgMHg3ZmNkNTAwZSwgMHg3MWM0NWQwNSwgMHg2M2RmNGExOCwgMHg2ZGQ2NDcxMywgMHhkNzMxZGNjYSwgMHhkOTM4ZDFjMSwgMHhjYjIzYzZkYywgMHhjNTJhY2JkNywgMHhlZjE1ZThlNiwgMHhlMTFjZTVlZCwgMHhmMzA3ZjJmMCwgMHhmZDBlZmZmYiwgMHhhNzc5YjQ5MiwgMHhhOTcwYjk5OSwgMHhiYjZiYWU4NCwgMHhiNTYyYTM4ZiwgMHg5ZjVkODBiZSwgMHg5MTU0OGRiNSwgMHg4MzRmOWFhOCwgMHg4ZDQ2OTdhM10pOwogIF9taXhDb2wgPSBuZXcgVWludDhBcnJheSgyNTYpLm1hcCgoXywgaSkgPT4gaSA8IDEyOCA/IGkgPDwgMSA6IGkgPDwgMSBeIDB4MWIpOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICB0aGlzLmJ1ZmZlclBvc2l0aW9uID0gMDsKICB9CiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKICAgIHVucmVhY2hhYmxlKCJDYW5ub3QgY2FsbCBgX2V4cGFuZEtleWAgb24gdGhlIGJhc2UgY2xhc3MiKTsKICB9CiAgX2RlY3J5cHQoaW5wdXQsIGtleSkgewogICAgbGV0IHQsIHUsIHY7CiAgICBjb25zdCBzdGF0ZSA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgIHN0YXRlLnNldChpbnB1dCk7CiAgICBmb3IgKGxldCBqID0gMCwgayA9IHRoaXMuX2tleVNpemU7IGogPCAxNjsgKytqLCArK2spIHsKICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOwogICAgfQogICAgZm9yIChsZXQgaSA9IHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbiAtIDE7IGkgPj0gMTsgLS1pKSB7CiAgICAgIHQgPSBzdGF0ZVsxM107CiAgICAgIHN0YXRlWzEzXSA9IHN0YXRlWzldOwogICAgICBzdGF0ZVs5XSA9IHN0YXRlWzVdOwogICAgICBzdGF0ZVs1XSA9IHN0YXRlWzFdOwogICAgICBzdGF0ZVsxXSA9IHQ7CiAgICAgIHQgPSBzdGF0ZVsxNF07CiAgICAgIHUgPSBzdGF0ZVsxMF07CiAgICAgIHN0YXRlWzE0XSA9IHN0YXRlWzZdOwogICAgICBzdGF0ZVsxMF0gPSBzdGF0ZVsyXTsKICAgICAgc3RhdGVbNl0gPSB0OwogICAgICBzdGF0ZVsyXSA9IHU7CiAgICAgIHQgPSBzdGF0ZVsxNV07CiAgICAgIHUgPSBzdGF0ZVsxMV07CiAgICAgIHYgPSBzdGF0ZVs3XTsKICAgICAgc3RhdGVbMTVdID0gc3RhdGVbM107CiAgICAgIHN0YXRlWzExXSA9IHQ7CiAgICAgIHN0YXRlWzddID0gdTsKICAgICAgc3RhdGVbM10gPSB2OwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICBzdGF0ZVtqXSA9IHRoaXMuX2ludl9zW3N0YXRlW2pdXTsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMCwgayA9IGkgKiAxNjsgaiA8IDE2OyArK2osICsraykgewogICAgICAgIHN0YXRlW2pdIF49IGtleVtrXTsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyBqICs9IDQpIHsKICAgICAgICBjb25zdCBzMCA9IHRoaXMuX21peFtzdGF0ZVtqXV07CiAgICAgICAgY29uc3QgczEgPSB0aGlzLl9taXhbc3RhdGVbaiArIDFdXTsKICAgICAgICBjb25zdCBzMiA9IHRoaXMuX21peFtzdGF0ZVtqICsgMl1dOwogICAgICAgIGNvbnN0IHMzID0gdGhpcy5fbWl4W3N0YXRlW2ogKyAzXV07CiAgICAgICAgdCA9IHMwIF4gczEgPj4+IDggXiBzMSA8PCAyNCBeIHMyID4+PiAxNiBeIHMyIDw8IDE2IF4gczMgPj4+IDI0IF4gczMgPDwgODsKICAgICAgICBzdGF0ZVtqXSA9IHQgPj4+IDI0ICYgMHhmZjsKICAgICAgICBzdGF0ZVtqICsgMV0gPSB0ID4+IDE2ICYgMHhmZjsKICAgICAgICBzdGF0ZVtqICsgMl0gPSB0ID4+IDggJiAweGZmOwogICAgICAgIHN0YXRlW2ogKyAzXSA9IHQgJiAweGZmOwogICAgICB9CiAgICB9CiAgICB0ID0gc3RhdGVbMTNdOwogICAgc3RhdGVbMTNdID0gc3RhdGVbOV07CiAgICBzdGF0ZVs5XSA9IHN0YXRlWzVdOwogICAgc3RhdGVbNV0gPSBzdGF0ZVsxXTsKICAgIHN0YXRlWzFdID0gdDsKICAgIHQgPSBzdGF0ZVsxNF07CiAgICB1ID0gc3RhdGVbMTBdOwogICAgc3RhdGVbMTRdID0gc3RhdGVbNl07CiAgICBzdGF0ZVsxMF0gPSBzdGF0ZVsyXTsKICAgIHN0YXRlWzZdID0gdDsKICAgIHN0YXRlWzJdID0gdTsKICAgIHQgPSBzdGF0ZVsxNV07CiAgICB1ID0gc3RhdGVbMTFdOwogICAgdiA9IHN0YXRlWzddOwogICAgc3RhdGVbMTVdID0gc3RhdGVbM107CiAgICBzdGF0ZVsxMV0gPSB0OwogICAgc3RhdGVbN10gPSB1OwogICAgc3RhdGVbM10gPSB2OwogICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7CiAgICAgIHN0YXRlW2pdID0gdGhpcy5faW52X3Nbc3RhdGVbal1dOwogICAgICBzdGF0ZVtqXSBePSBrZXlbal07CiAgICB9CiAgICByZXR1cm4gc3RhdGU7CiAgfQogIF9lbmNyeXB0KGlucHV0LCBrZXkpIHsKICAgIGNvbnN0IHMgPSB0aGlzLl9zOwogICAgbGV0IHQsIHUsIHY7CiAgICBjb25zdCBzdGF0ZSA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgIHN0YXRlLnNldChpbnB1dCk7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgc3RhdGVbal0gXj0ga2V5W2pdOwogICAgfQogICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb247IGkrKykgewogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICBzdGF0ZVtqXSA9IHNbc3RhdGVbal1dOwogICAgICB9CiAgICAgIHYgPSBzdGF0ZVsxXTsKICAgICAgc3RhdGVbMV0gPSBzdGF0ZVs1XTsKICAgICAgc3RhdGVbNV0gPSBzdGF0ZVs5XTsKICAgICAgc3RhdGVbOV0gPSBzdGF0ZVsxM107CiAgICAgIHN0YXRlWzEzXSA9IHY7CiAgICAgIHYgPSBzdGF0ZVsyXTsKICAgICAgdSA9IHN0YXRlWzZdOwogICAgICBzdGF0ZVsyXSA9IHN0YXRlWzEwXTsKICAgICAgc3RhdGVbNl0gPSBzdGF0ZVsxNF07CiAgICAgIHN0YXRlWzEwXSA9IHY7CiAgICAgIHN0YXRlWzE0XSA9IHU7CiAgICAgIHYgPSBzdGF0ZVszXTsKICAgICAgdSA9IHN0YXRlWzddOwogICAgICB0ID0gc3RhdGVbMTFdOwogICAgICBzdGF0ZVszXSA9IHN0YXRlWzE1XTsKICAgICAgc3RhdGVbN10gPSB2OwogICAgICBzdGF0ZVsxMV0gPSB1OwogICAgICBzdGF0ZVsxNV0gPSB0OwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyBqICs9IDQpIHsKICAgICAgICBjb25zdCBzMCA9IHN0YXRlW2pdOwogICAgICAgIGNvbnN0IHMxID0gc3RhdGVbaiArIDFdOwogICAgICAgIGNvbnN0IHMyID0gc3RhdGVbaiArIDJdOwogICAgICAgIGNvbnN0IHMzID0gc3RhdGVbaiArIDNdOwogICAgICAgIHQgPSBzMCBeIHMxIF4gczIgXiBzMzsKICAgICAgICBzdGF0ZVtqXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MwIF4gczFdOwogICAgICAgIHN0YXRlW2ogKyAxXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MxIF4gczJdOwogICAgICAgIHN0YXRlW2ogKyAyXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MyIF4gczNdOwogICAgICAgIHN0YXRlW2ogKyAzXSBePSB0IF4gdGhpcy5fbWl4Q29sW3MzIF4gczBdOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwLCBrID0gaSAqIDE2OyBqIDwgMTY7ICsraiwgKytrKSB7CiAgICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOwogICAgICB9CiAgICB9CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgc3RhdGVbal0gPSBzW3N0YXRlW2pdXTsKICAgIH0KICAgIHYgPSBzdGF0ZVsxXTsKICAgIHN0YXRlWzFdID0gc3RhdGVbNV07CiAgICBzdGF0ZVs1XSA9IHN0YXRlWzldOwogICAgc3RhdGVbOV0gPSBzdGF0ZVsxM107CiAgICBzdGF0ZVsxM10gPSB2OwogICAgdiA9IHN0YXRlWzJdOwogICAgdSA9IHN0YXRlWzZdOwogICAgc3RhdGVbMl0gPSBzdGF0ZVsxMF07CiAgICBzdGF0ZVs2XSA9IHN0YXRlWzE0XTsKICAgIHN0YXRlWzEwXSA9IHY7CiAgICBzdGF0ZVsxNF0gPSB1OwogICAgdiA9IHN0YXRlWzNdOwogICAgdSA9IHN0YXRlWzddOwogICAgdCA9IHN0YXRlWzExXTsKICAgIHN0YXRlWzNdID0gc3RhdGVbMTVdOwogICAgc3RhdGVbN10gPSB2OwogICAgc3RhdGVbMTFdID0gdTsKICAgIHN0YXRlWzE1XSA9IHQ7CiAgICBmb3IgKGxldCBqID0gMCwgayA9IHRoaXMuX2tleVNpemU7IGogPCAxNjsgKytqLCArK2spIHsKICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOwogICAgfQogICAgcmV0dXJuIHN0YXRlOwogIH0KICBfZGVjcnlwdEJsb2NrMihkYXRhLCBmaW5hbGl6ZSkgewogICAgY29uc3Qgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBsZXQgYnVmZmVyID0gdGhpcy5idWZmZXIsCiAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIGxldCBpdiA9IHRoaXMuaXY7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgKytpKSB7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTsKICAgICAgKytidWZmZXJMZW5ndGg7CiAgICAgIGlmIChidWZmZXJMZW5ndGggPCAxNikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHBsYWluID0gdGhpcy5fZGVjcnlwdChidWZmZXIsIHRoaXMuX2tleSk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICAgIHBsYWluW2pdIF49IGl2W2pdOwogICAgICB9CiAgICAgIGl2ID0gYnVmZmVyOwogICAgICByZXN1bHQucHVzaChwbGFpbik7CiAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgYnVmZmVyTGVuZ3RoID0gMDsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICB0aGlzLml2ID0gaXY7CiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CiAgICB9CiAgICBsZXQgb3V0cHV0TGVuZ3RoID0gMTYgKiByZXN1bHQubGVuZ3RoOwogICAgaWYgKGZpbmFsaXplKSB7CiAgICAgIGNvbnN0IGxhc3RCbG9jayA9IHJlc3VsdC5hdCgtMSk7CiAgICAgIGxldCBwc0xlbiA9IGxhc3RCbG9ja1sxNV07CiAgICAgIGlmIChwc0xlbiA8PSAxNikgewogICAgICAgIGZvciAobGV0IGkgPSAxNSwgaWkgPSAxNiAtIHBzTGVuOyBpID49IGlpOyAtLWkpIHsKICAgICAgICAgIGlmIChsYXN0QmxvY2tbaV0gIT09IHBzTGVuKSB7CiAgICAgICAgICAgIHBzTGVuID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG91dHB1dExlbmd0aCAtPSBwc0xlbjsKICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gbGFzdEJsb2NrLnN1YmFycmF5KDAsIDE2IC0gcHNMZW4pOwogICAgICB9CiAgICB9CiAgICBjb25zdCBvdXRwdXQgPSBuZXcgVWludDhBcnJheShvdXRwdXRMZW5ndGgpOwogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpaTsgKytpLCBqICs9IDE2KSB7CiAgICAgIG91dHB1dC5zZXQocmVzdWx0W2ldLCBqKTsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQogIGRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSwgaXYgPSBudWxsKSB7CiAgICBjb25zdCBzb3VyY2VMZW5ndGggPSBkYXRhLmxlbmd0aDsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgbGV0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CiAgICBpZiAoaXYpIHsKICAgICAgdGhpcy5pdiA9IGl2OwogICAgfSBlbHNlIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGJ1ZmZlckxlbmd0aCA8IDE2ICYmIGkgPCBzb3VyY2VMZW5ndGg7ICsraSwgKytidWZmZXJMZW5ndGgpIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoXSA9IGRhdGFbaV07CiAgICAgIH0KICAgICAgaWYgKGJ1ZmZlckxlbmd0aCA8IDE2KSB7CiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogICAgICB9CiAgICAgIHRoaXMuaXYgPSBidWZmZXI7CiAgICAgIGRhdGEgPSBkYXRhLnN1YmFycmF5KDE2KTsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTYpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOwogICAgdGhpcy5kZWNyeXB0QmxvY2sgPSB0aGlzLl9kZWNyeXB0QmxvY2syOwogICAgcmV0dXJuIHRoaXMuZGVjcnlwdEJsb2NrKGRhdGEsIGZpbmFsaXplKTsKICB9CiAgZW5jcnlwdChkYXRhLCBpdikgewogICAgY29uc3Qgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBsZXQgYnVmZmVyID0gdGhpcy5idWZmZXIsCiAgICAgIGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyUG9zaXRpb247CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIGl2IHx8PSBuZXcgVWludDhBcnJheSgxNik7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUxlbmd0aDsgKytpKSB7CiAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGhdID0gZGF0YVtpXTsKICAgICAgKytidWZmZXJMZW5ndGg7CiAgICAgIGlmIChidWZmZXJMZW5ndGggPCAxNikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICAgIGJ1ZmZlcltqXSBePSBpdltqXTsKICAgICAgfQogICAgICBjb25zdCBjaXBoZXIgPSB0aGlzLl9lbmNyeXB0KGJ1ZmZlciwgdGhpcy5fa2V5KTsKICAgICAgaXYgPSBjaXBoZXI7CiAgICAgIHJlc3VsdC5wdXNoKGNpcGhlcik7CiAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgYnVmZmVyTGVuZ3RoID0gMDsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICB0aGlzLml2ID0gaXY7CiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7CiAgICB9CiAgICBjb25zdCBvdXRwdXRMZW5ndGggPSAxNiAqIHJlc3VsdC5sZW5ndGg7CiAgICBjb25zdCBvdXRwdXQgPSBuZXcgVWludDhBcnJheShvdXRwdXRMZW5ndGgpOwogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpaTsgKytpLCBqICs9IDE2KSB7CiAgICAgIG91dHB1dC5zZXQocmVzdWx0W2ldLCBqKTsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQp9CmNsYXNzIEFFUzEyOENpcGhlciBleHRlbmRzIEFFU0Jhc2VDaXBoZXIgewogIF9yY29uID0gbmV3IFVpbnQ4QXJyYXkoWzB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGRdKTsKICBjb25zdHJ1Y3RvcihrZXkpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxMDsKICAgIHRoaXMuX2tleVNpemUgPSAxNjA7CiAgICB0aGlzLl9rZXkgPSB0aGlzLl9leHBhbmRLZXkoa2V5KTsKICB9CiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKICAgIGNvbnN0IGIgPSAxNzY7CiAgICBjb25zdCBzID0gdGhpcy5fczsKICAgIGNvbnN0IHJjb24gPSB0aGlzLl9yY29uOwogICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYik7CiAgICByZXN1bHQuc2V0KGNpcGhlcktleSk7CiAgICBmb3IgKGxldCBqID0gMTYsIGkgPSAxOyBqIDwgYjsgKytpKSB7CiAgICAgIGxldCB0MSA9IHJlc3VsdFtqIC0gM107CiAgICAgIGxldCB0MiA9IHJlc3VsdFtqIC0gMl07CiAgICAgIGxldCB0MyA9IHJlc3VsdFtqIC0gMV07CiAgICAgIGxldCB0NCA9IHJlc3VsdFtqIC0gNF07CiAgICAgIHQxID0gc1t0MV07CiAgICAgIHQyID0gc1t0Ml07CiAgICAgIHQzID0gc1t0M107CiAgICAgIHQ0ID0gc1t0NF07CiAgICAgIHQxIF49IHJjb25baV07CiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgNDsgKytuKSB7CiAgICAgICAgcmVzdWx0W2pdID0gdDEgXj0gcmVzdWx0W2ogLSAxNl07CiAgICAgICAgaisrOwogICAgICAgIHJlc3VsdFtqXSA9IHQyIF49IHJlc3VsdFtqIC0gMTZdOwogICAgICAgIGorKzsKICAgICAgICByZXN1bHRbal0gPSB0MyBePSByZXN1bHRbaiAtIDE2XTsKICAgICAgICBqKys7CiAgICAgICAgcmVzdWx0W2pdID0gdDQgXj0gcmVzdWx0W2ogLSAxNl07CiAgICAgICAgaisrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQpjbGFzcyBBRVMyNTZDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHsKICBjb25zdHJ1Y3RvcihrZXkpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxNDsKICAgIHRoaXMuX2tleVNpemUgPSAyMjQ7CiAgICB0aGlzLl9rZXkgPSB0aGlzLl9leHBhbmRLZXkoa2V5KTsKICB9CiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKICAgIGNvbnN0IGIgPSAyNDA7CiAgICBjb25zdCBzID0gdGhpcy5fczsKICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGIpOwogICAgcmVzdWx0LnNldChjaXBoZXJLZXkpOwogICAgbGV0IHIgPSAxOwogICAgbGV0IHQxLCB0MiwgdDMsIHQ0OwogICAgZm9yIChsZXQgaiA9IDMyLCBpID0gMTsgaiA8IGI7ICsraSkgewogICAgICBpZiAoaiAlIDMyID09PSAxNikgewogICAgICAgIHQxID0gc1t0MV07CiAgICAgICAgdDIgPSBzW3QyXTsKICAgICAgICB0MyA9IHNbdDNdOwogICAgICAgIHQ0ID0gc1t0NF07CiAgICAgIH0gZWxzZSBpZiAoaiAlIDMyID09PSAwKSB7CiAgICAgICAgdDEgPSByZXN1bHRbaiAtIDNdOwogICAgICAgIHQyID0gcmVzdWx0W2ogLSAyXTsKICAgICAgICB0MyA9IHJlc3VsdFtqIC0gMV07CiAgICAgICAgdDQgPSByZXN1bHRbaiAtIDRdOwogICAgICAgIHQxID0gc1t0MV07CiAgICAgICAgdDIgPSBzW3QyXTsKICAgICAgICB0MyA9IHNbdDNdOwogICAgICAgIHQ0ID0gc1t0NF07CiAgICAgICAgdDEgXj0gcjsKICAgICAgICBpZiAoKHIgPDw9IDEpID49IDI1NikgewogICAgICAgICAgciA9IChyIF4gMHgxYikgJiAweGZmOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGxldCBuID0gMDsgbiA8IDQ7ICsrbikgewogICAgICAgIHJlc3VsdFtqXSA9IHQxIF49IHJlc3VsdFtqIC0gMzJdOwogICAgICAgIGorKzsKICAgICAgICByZXN1bHRbal0gPSB0MiBePSByZXN1bHRbaiAtIDMyXTsKICAgICAgICBqKys7CiAgICAgICAgcmVzdWx0W2pdID0gdDMgXj0gcmVzdWx0W2ogLSAzMl07CiAgICAgICAgaisrOwogICAgICAgIHJlc3VsdFtqXSA9IHQ0IF49IHJlc3VsdFtqIC0gMzJdOwogICAgICAgIGorKzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KY2xhc3MgUERGQmFzZSB7CiAgX2hhc2gocGFzc3dvcmQsIGlucHV0LCB1c2VyQnl0ZXMpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYF9oYXNoYCBjYWxsZWQiKTsKICB9CiAgY2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCB1c2VyQnl0ZXMsIG93bmVyUGFzc3dvcmQpIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldChvd25lclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOwogICAgaGFzaERhdGEuc2V0KHVzZXJCeXRlcywgcGFzc3dvcmQubGVuZ3RoICsgb3duZXJWYWxpZGF0aW9uU2FsdC5sZW5ndGgpOwogICAgY29uc3QgcmVzdWx0ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIHVzZXJCeXRlcyk7CiAgICByZXR1cm4gaXNBcnJheUVxdWFsKHJlc3VsdCwgb3duZXJQYXNzd29yZCk7CiAgfQogIGNoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJQYXNzd29yZCkgewogICAgY29uc3QgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA4KTsKICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CiAgICBoYXNoRGF0YS5zZXQodXNlclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOwogICAgY29uc3QgcmVzdWx0ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIFtdKTsKICAgIHJldHVybiBpc0FycmF5RXF1YWwocmVzdWx0LCB1c2VyUGFzc3dvcmQpOwogIH0KICBnZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1c2VyQnl0ZXMsIG93bmVyRW5jcnlwdGlvbikgewogICAgY29uc3QgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7CiAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOwogICAgaGFzaERhdGEuc2V0KG93bmVyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyS2V5U2FsdC5sZW5ndGgpOwogICAgY29uc3Qga2V5ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIHVzZXJCeXRlcyk7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgQUVTMjU2Q2lwaGVyKGtleSk7CiAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhvd25lckVuY3J5cHRpb24sIGZhbHNlLCBuZXcgVWludDhBcnJheSgxNikpOwogIH0KICBnZXRVc2VyS2V5KHBhc3N3b3JkLCB1c2VyS2V5U2FsdCwgdXNlckVuY3J5cHRpb24pIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgOCk7CiAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOwogICAgaGFzaERhdGEuc2V0KHVzZXJLZXlTYWx0LCBwYXNzd29yZC5sZW5ndGgpOwogICAgY29uc3Qga2V5ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIFtdKTsKICAgIGNvbnN0IGNpcGhlciA9IG5ldyBBRVMyNTZDaXBoZXIoa2V5KTsKICAgIHJldHVybiBjaXBoZXIuZGVjcnlwdEJsb2NrKHVzZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKICB9Cn0KY2xhc3MgUERGMTcgZXh0ZW5kcyBQREZCYXNlIHsKICBfaGFzaChwYXNzd29yZCwgaW5wdXQsIHVzZXJCeXRlcykgewogICAgcmV0dXJuIGNhbGN1bGF0ZVNIQTI1NihpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKTsKICB9Cn0KY2xhc3MgUERGMjAgZXh0ZW5kcyBQREZCYXNlIHsKICBfaGFzaChwYXNzd29yZCwgaW5wdXQsIHVzZXJCeXRlcykgewogICAgbGV0IGsgPSBjYWxjdWxhdGVTSEEyNTYoaW5wdXQsIDAsIGlucHV0Lmxlbmd0aCkuc3ViYXJyYXkoMCwgMzIpOwogICAgbGV0IGUgPSBbMF07CiAgICBsZXQgaSA9IDA7CiAgICB3aGlsZSAoaSA8IDY0IHx8IGUuYXQoLTEpID4gaSAtIDMyKSB7CiAgICAgIGNvbnN0IGNvbWJpbmVkTGVuZ3RoID0gcGFzc3dvcmQubGVuZ3RoICsgay5sZW5ndGggKyB1c2VyQnl0ZXMubGVuZ3RoLAogICAgICAgIGNvbWJpbmVkQXJyYXkgPSBuZXcgVWludDhBcnJheShjb21iaW5lZExlbmd0aCk7CiAgICAgIGxldCB3cml0ZU9mZnNldCA9IDA7CiAgICAgIGNvbWJpbmVkQXJyYXkuc2V0KHBhc3N3b3JkLCB3cml0ZU9mZnNldCk7CiAgICAgIHdyaXRlT2Zmc2V0ICs9IHBhc3N3b3JkLmxlbmd0aDsKICAgICAgY29tYmluZWRBcnJheS5zZXQoaywgd3JpdGVPZmZzZXQpOwogICAgICB3cml0ZU9mZnNldCArPSBrLmxlbmd0aDsKICAgICAgY29tYmluZWRBcnJheS5zZXQodXNlckJ5dGVzLCB3cml0ZU9mZnNldCk7CiAgICAgIGNvbnN0IGsxID0gbmV3IFVpbnQ4QXJyYXkoY29tYmluZWRMZW5ndGggKiA2NCk7CiAgICAgIGZvciAobGV0IGogPSAwLCBwb3MgPSAwOyBqIDwgNjQ7IGorKywgcG9zICs9IGNvbWJpbmVkTGVuZ3RoKSB7CiAgICAgICAgazEuc2V0KGNvbWJpbmVkQXJyYXksIHBvcyk7CiAgICAgIH0KICAgICAgY29uc3QgY2lwaGVyID0gbmV3IEFFUzEyOENpcGhlcihrLnN1YmFycmF5KDAsIDE2KSk7CiAgICAgIGUgPSBjaXBoZXIuZW5jcnlwdChrMSwgay5zdWJhcnJheSgxNiwgMzIpKTsKICAgICAgY29uc3QgcmVtYWluZGVyID0gTWF0aC5zdW1QcmVjaXNlKGUuc2xpY2UoMCwgMTYpKSAlIDM7CiAgICAgIGlmIChyZW1haW5kZXIgPT09IDApIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBMjU2KGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDEpIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBMzg0KGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDIpIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBNTEyKGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfQogICAgICBpKys7CiAgICB9CiAgICByZXR1cm4gay5zdWJhcnJheSgwLCAzMik7CiAgfQp9CmNsYXNzIENpcGhlclRyYW5zZm9ybSB7CiAgY29uc3RydWN0b3Ioc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IsIHN0cmVhbUNpcGhlckNvbnN0cnVjdG9yKSB7CiAgICB0aGlzLlN0cmluZ0NpcGhlckNvbnN0cnVjdG9yID0gc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3I7CiAgICB0aGlzLlN0cmVhbUNpcGhlckNvbnN0cnVjdG9yID0gc3RyZWFtQ2lwaGVyQ29uc3RydWN0b3I7CiAgfQogIGNyZWF0ZVN0cmVhbShzdHJlYW0sIGxlbmd0aCkgewogICAgY29uc3QgY2lwaGVyID0gbmV3IHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IoKTsKICAgIHJldHVybiBuZXcgRGVjcnlwdFN0cmVhbShzdHJlYW0sIGxlbmd0aCwgZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRGVjcnlwdFN0cmVhbShkYXRhLCBmaW5hbGl6ZSkgewogICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSk7CiAgICB9KTsKICB9CiAgZGVjcnlwdFN0cmluZyhzKSB7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpOwogICAgbGV0IGRhdGEgPSBzdHJpbmdUb0J5dGVzKHMpOwogICAgZGF0YSA9IGNpcGhlci5kZWNyeXB0QmxvY2soZGF0YSwgdHJ1ZSk7CiAgICByZXR1cm4gYnl0ZXNUb1N0cmluZyhkYXRhKTsKICB9CiAgZW5jcnlwdFN0cmluZyhzKSB7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpOwogICAgaWYgKGNpcGhlciBpbnN0YW5jZW9mIEFFU0Jhc2VDaXBoZXIpIHsKICAgICAgY29uc3Qgc3RyTGVuID0gcy5sZW5ndGg7CiAgICAgIGNvbnN0IHBhZCA9IDE2IC0gc3RyTGVuICUgMTY7CiAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShwYWQpLnJlcGVhdChwYWQpOwogICAgICBjb25zdCBpdiA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhpdik7CiAgICAgIGxldCBkYXRhID0gc3RyaW5nVG9CeXRlcyhzKTsKICAgICAgZGF0YSA9IGNpcGhlci5lbmNyeXB0KGRhdGEsIGl2KTsKICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyBkYXRhLmxlbmd0aCk7CiAgICAgIGJ1Zi5zZXQoaXYpOwogICAgICBidWYuc2V0KGRhdGEsIDE2KTsKICAgICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoYnVmKTsKICAgIH0KICAgIGxldCBkYXRhID0gc3RyaW5nVG9CeXRlcyhzKTsKICAgIGRhdGEgPSBjaXBoZXIuZW5jcnlwdChkYXRhKTsKICAgIHJldHVybiBieXRlc1RvU3RyaW5nKGRhdGEpOwogIH0KfQpjbGFzcyBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5IHsKICBzdGF0aWMgZ2V0IF9kZWZhdWx0UGFzc3dvcmRCeXRlcygpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9kZWZhdWx0UGFzc3dvcmRCeXRlcyIsIG5ldyBVaW50OEFycmF5KFsweDI4LCAweGJmLCAweDRlLCAweDVlLCAweDRlLCAweDc1LCAweDhhLCAweDQxLCAweDY0LCAweDAwLCAweDRlLCAweDU2LCAweGZmLCAweGZhLCAweDAxLCAweDA4LCAweDJlLCAweDJlLCAweDAwLCAweGI2LCAweGQwLCAweDY4LCAweDNlLCAweDgwLCAweDJmLCAweDBjLCAweGE5LCAweGZlLCAweDY0LCAweDUzLCAweDY5LCAweDdhXSkpOwogIH0KICAjY3JlYXRlRW5jcnlwdGlvbktleTIwKHJldmlzaW9uLCBwYXNzd29yZCwgb3duZXJQYXNzd29yZCwgb3duZXJWYWxpZGF0aW9uU2FsdCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIHVzZXJQYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyS2V5U2FsdCwgb3duZXJFbmNyeXB0aW9uLCB1c2VyRW5jcnlwdGlvbiwgcGVybXMpIHsKICAgIGlmIChwYXNzd29yZCkgewogICAgICBjb25zdCBwYXNzd29yZExlbmd0aCA9IE1hdGgubWluKDEyNywgcGFzc3dvcmQubGVuZ3RoKTsKICAgICAgcGFzc3dvcmQgPSBwYXNzd29yZC5zdWJhcnJheSgwLCBwYXNzd29yZExlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICBwYXNzd29yZCA9IFtdOwogICAgfQogICAgY29uc3QgcGRmQWxnb3JpdGhtID0gcmV2aXNpb24gPT09IDYgPyBuZXcgUERGMjAoKSA6IG5ldyBQREYxNygpOwogICAgaWYgKHBkZkFsZ29yaXRobS5jaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyUGFzc3dvcmQpKSB7CiAgICAgIHJldHVybiBwZGZBbGdvcml0aG0uZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKTsKICAgIH0gZWxzZSBpZiAocGFzc3dvcmQubGVuZ3RoICYmIHBkZkFsZ29yaXRobS5jaGVja093bmVyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvblNhbHQsIHVCeXRlcywgb3duZXJQYXNzd29yZCkpIHsKICAgICAgcmV0dXJuIHBkZkFsZ29yaXRobS5nZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIG93bmVyRW5jcnlwdGlvbik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgI3ByZXBhcmVLZXlEYXRhKGZpbGVJZCwgcGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHVzZXJQYXNzd29yZCwgZmxhZ3MsIHJldmlzaW9uLCBrZXlMZW5ndGgsIGVuY3J5cHRNZXRhZGF0YSkgewogICAgY29uc3QgaGFzaERhdGFTaXplID0gNDAgKyBvd25lclBhc3N3b3JkLmxlbmd0aCArIGZpbGVJZC5sZW5ndGg7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KGhhc2hEYXRhU2l6ZSk7CiAgICBsZXQgaSA9IDAsCiAgICAgIGosCiAgICAgIG47CiAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgbiA9IE1hdGgubWluKDMyLCBwYXNzd29yZC5sZW5ndGgpOwogICAgICBmb3IgKDsgaSA8IG47ICsraSkgewogICAgICAgIGhhc2hEYXRhW2ldID0gcGFzc3dvcmRbaV07CiAgICAgIH0KICAgIH0KICAgIGogPSAwOwogICAgd2hpbGUgKGkgPCAzMikgewogICAgICBoYXNoRGF0YVtpKytdID0gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeS5fZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaisrXTsKICAgIH0KICAgIGhhc2hEYXRhLnNldChvd25lclBhc3N3b3JkLCBpKTsKICAgIGkgKz0gb3duZXJQYXNzd29yZC5sZW5ndGg7CiAgICBoYXNoRGF0YVtpKytdID0gZmxhZ3MgJiAweGZmOwogICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzID4+IDggJiAweGZmOwogICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzID4+IDE2ICYgMHhmZjsKICAgIGhhc2hEYXRhW2krK10gPSBmbGFncyA+Pj4gMjQgJiAweGZmOwogICAgaGFzaERhdGEuc2V0KGZpbGVJZCwgaSk7CiAgICBpICs9IGZpbGVJZC5sZW5ndGg7CiAgICBpZiAocmV2aXNpb24gPj0gNCAmJiAhZW5jcnlwdE1ldGFkYXRhKSB7CiAgICAgIGhhc2hEYXRhLmZpbGwoMHhmZiwgaSwgaSArIDQpOwogICAgICBpICs9IDQ7CiAgICB9CiAgICBsZXQgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSk7CiAgICBjb25zdCBrZXlMZW5ndGhJbkJ5dGVzID0ga2V5TGVuZ3RoID4+IDM7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikgewogICAgICAgIGhhc2ggPSBjYWxjdWxhdGVNRDUoaGFzaCwgMCwga2V5TGVuZ3RoSW5CeXRlcyk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBoYXNoLnN1YmFycmF5KDAsIGtleUxlbmd0aEluQnl0ZXMpOwogICAgbGV0IGNpcGhlciwgY2hlY2tEYXRhOwogICAgaWYgKHJldmlzaW9uID49IDMpIHsKICAgICAgaSA9IDA7CiAgICAgIGhhc2hEYXRhLnNldChDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5Ll9kZWZhdWx0UGFzc3dvcmRCeXRlcywgaSk7CiAgICAgIGkgKz0gMzI7CiAgICAgIGhhc2hEYXRhLnNldChmaWxlSWQsIGkpOwogICAgICBpICs9IGZpbGVJZC5sZW5ndGg7CiAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGVuY3J5cHRpb25LZXkpOwogICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSkpOwogICAgICBuID0gZW5jcnlwdGlvbktleS5sZW5ndGg7CiAgICAgIGNvbnN0IGRlcml2ZWRLZXkgPSBuZXcgVWludDhBcnJheShuKTsKICAgICAgZm9yIChqID0gMTsgaiA8PSAxOTsgKytqKSB7CiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyArK2spIHsKICAgICAgICAgIGRlcml2ZWRLZXlba10gPSBlbmNyeXB0aW9uS2V5W2tdIF4gajsKICAgICAgICB9CiAgICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZGVyaXZlZEtleSk7CiAgICAgICAgY2hlY2tEYXRhID0gY2lwaGVyLmVuY3J5cHRCbG9jayhjaGVja0RhdGEpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjaXBoZXIgPSBuZXcgQVJDRm91ckNpcGhlcihlbmNyeXB0aW9uS2V5KTsKICAgICAgY2hlY2tEYXRhID0gY2lwaGVyLmVuY3J5cHRCbG9jayhDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5Ll9kZWZhdWx0UGFzc3dvcmRCeXRlcyk7CiAgICB9CiAgICByZXR1cm4gY2hlY2tEYXRhLmV2ZXJ5KChkYXRhLCBrKSA9PiB1c2VyUGFzc3dvcmRba10gPT09IGRhdGEpID8gZW5jcnlwdGlvbktleSA6IG51bGw7CiAgfQogICNkZWNvZGVVc2VyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHJldmlzaW9uLCBrZXlMZW5ndGgpIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMzIpOwogICAgbGV0IGkgPSAwOwogICAgY29uc3QgbiA9IE1hdGgubWluKDMyLCBwYXNzd29yZC5sZW5ndGgpOwogICAgZm9yICg7IGkgPCBuOyArK2kpIHsKICAgICAgaGFzaERhdGFbaV0gPSBwYXNzd29yZFtpXTsKICAgIH0KICAgIGxldCBqID0gMDsKICAgIHdoaWxlIChpIDwgMzIpIHsKICAgICAgaGFzaERhdGFbaSsrXSA9IENpcGhlclRyYW5zZm9ybUZhY3RvcnkuX2RlZmF1bHRQYXNzd29yZEJ5dGVzW2orK107CiAgICB9CiAgICBsZXQgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSk7CiAgICBjb25zdCBrZXlMZW5ndGhJbkJ5dGVzID0ga2V5TGVuZ3RoID4+IDM7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikgewogICAgICAgIGhhc2ggPSBjYWxjdWxhdGVNRDUoaGFzaCwgMCwgaGFzaC5sZW5ndGgpOwogICAgICB9CiAgICB9CiAgICBsZXQgY2lwaGVyLCB1c2VyUGFzc3dvcmQ7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICB1c2VyUGFzc3dvcmQgPSBvd25lclBhc3N3b3JkOwogICAgICBjb25zdCBkZXJpdmVkS2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5TGVuZ3RoSW5CeXRlcyk7CiAgICAgIGZvciAoaiA9IDE5OyBqID49IDA7IGotLSkgewogICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5TGVuZ3RoSW5CeXRlczsgKytrKSB7CiAgICAgICAgICBkZXJpdmVkS2V5W2tdID0gaGFzaFtrXSBeIGo7CiAgICAgICAgfQogICAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGRlcml2ZWRLZXkpOwogICAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sodXNlclBhc3N3b3JkKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoaGFzaC5zdWJhcnJheSgwLCBrZXlMZW5ndGhJbkJ5dGVzKSk7CiAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sob3duZXJQYXNzd29yZCk7CiAgICB9CiAgICByZXR1cm4gdXNlclBhc3N3b3JkOwogIH0KICAjYnVpbGRPYmplY3RLZXkobnVtLCBnZW4sIGVuY3J5cHRpb25LZXksIGlzQWVzID0gZmFsc2UpIHsKICAgIGNvbnN0IG4gPSBlbmNyeXB0aW9uS2V5Lmxlbmd0aDsKICAgIGNvbnN0IGtleSA9IG5ldyBVaW50OEFycmF5KG4gKyA5KTsKICAgIGtleS5zZXQoZW5jcnlwdGlvbktleSk7CiAgICBsZXQgaSA9IG47CiAgICBrZXlbaSsrXSA9IG51bSAmIDB4ZmY7CiAgICBrZXlbaSsrXSA9IG51bSA+PiA4ICYgMHhmZjsKICAgIGtleVtpKytdID0gbnVtID4+IDE2ICYgMHhmZjsKICAgIGtleVtpKytdID0gZ2VuICYgMHhmZjsKICAgIGtleVtpKytdID0gZ2VuID4+IDggJiAweGZmOwogICAgaWYgKGlzQWVzKSB7CiAgICAgIGtleVtpKytdID0gMHg3MzsKICAgICAga2V5W2krK10gPSAweDQxOwogICAgICBrZXlbaSsrXSA9IDB4NmM7CiAgICAgIGtleVtpKytdID0gMHg1NDsKICAgIH0KICAgIGNvbnN0IGhhc2ggPSBjYWxjdWxhdGVNRDUoa2V5LCAwLCBpKTsKICAgIHJldHVybiBoYXNoLnN1YmFycmF5KDAsIE1hdGgubWluKG4gKyA1LCAxNikpOwogIH0KICAjYnVpbGRDaXBoZXJDb25zdHJ1Y3RvcihjZiwgbmFtZSwgbnVtLCBnZW4sIGtleSkgewogICAgaWYgKCEobmFtZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBjcnlwdCBmaWx0ZXIgbmFtZS4iKTsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSB0aGlzOwogICAgY29uc3QgY3J5cHRGaWx0ZXIgPSBjZi5nZXQobmFtZS5uYW1lKTsKICAgIGNvbnN0IGNmbSA9IGNyeXB0RmlsdGVyPy5nZXQoIkNGTSIpOwogICAgaWYgKCFjZm0gfHwgY2ZtLm5hbWUgPT09ICJOb25lIikgewogICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBuZXcgTnVsbENpcGhlcigpOwogICAgICB9OwogICAgfQogICAgaWYgKGNmbS5uYW1lID09PSAiVjIiKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKHNlbGYuI2J1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBrZXksIGZhbHNlKSk7CiAgICAgIH07CiAgICB9CiAgICBpZiAoY2ZtLm5hbWUgPT09ICJBRVNWMiIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gbmV3IEFFUzEyOENpcGhlcihzZWxmLiNidWlsZE9iamVjdEtleShudW0sIGdlbiwga2V5LCB0cnVlKSk7CiAgICAgIH07CiAgICB9CiAgICBpZiAoY2ZtLm5hbWUgPT09ICJBRVNWMyIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gbmV3IEFFUzI1NkNpcGhlcihrZXkpOwogICAgICB9OwogICAgfQogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGNyeXB0byBtZXRob2QiKTsKICB9CiAgY29uc3RydWN0b3IoZGljdCwgZmlsZUlkLCBwYXNzd29yZCkgewogICAgY29uc3QgZmlsdGVyID0gZGljdC5nZXQoIkZpbHRlciIpOwogICAgaWYgKCFpc05hbWUoZmlsdGVyLCAiU3RhbmRhcmQiKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoInVua25vd24gZW5jcnlwdGlvbiBtZXRob2QiKTsKICAgIH0KICAgIHRoaXMuZmlsdGVyTmFtZSA9IGZpbHRlci5uYW1lOwogICAgdGhpcy5kaWN0ID0gZGljdDsKICAgIGNvbnN0IGFsZ29yaXRobSA9IGRpY3QuZ2V0KCJWIik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYWxnb3JpdGhtKSB8fCBhbGdvcml0aG0gIT09IDEgJiYgYWxnb3JpdGhtICE9PSAyICYmIGFsZ29yaXRobSAhPT0gNCAmJiBhbGdvcml0aG0gIT09IDUpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJ1bnN1cHBvcnRlZCBlbmNyeXB0aW9uIGFsZ29yaXRobSIpOwogICAgfQogICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CiAgICBsZXQga2V5TGVuZ3RoID0gZGljdC5nZXQoIkxlbmd0aCIpOwogICAgaWYgKCFrZXlMZW5ndGgpIHsKICAgICAgaWYgKGFsZ29yaXRobSA8PSAzKSB7CiAgICAgICAga2V5TGVuZ3RoID0gNDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgY2ZEaWN0ID0gZGljdC5nZXQoIkNGIik7CiAgICAgICAgY29uc3Qgc3RyZWFtQ3J5cHRvTmFtZSA9IGRpY3QuZ2V0KCJTdG1GIik7CiAgICAgICAgaWYgKGNmRGljdCBpbnN0YW5jZW9mIERpY3QgJiYgc3RyZWFtQ3J5cHRvTmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIGNmRGljdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICAgICAgY29uc3QgaGFuZGxlckRpY3QgPSBjZkRpY3QuZ2V0KHN0cmVhbUNyeXB0b05hbWUubmFtZSk7CiAgICAgICAgICBrZXlMZW5ndGggPSBoYW5kbGVyRGljdD8uZ2V0KCJMZW5ndGgiKSB8fCAxMjg7CiAgICAgICAgICBpZiAoa2V5TGVuZ3RoIDwgNDApIHsKICAgICAgICAgICAga2V5TGVuZ3RoIDw8PSAzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGtleUxlbmd0aCkgfHwga2V5TGVuZ3RoIDwgNDAgfHwga2V5TGVuZ3RoICUgOCAhPT0gMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQga2V5IGxlbmd0aCIpOwogICAgfQogICAgY29uc3Qgb3duZXJCeXRlcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIk8iKSksCiAgICAgIHVzZXJCeXRlcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlUiKSk7CiAgICBjb25zdCBvd25lclBhc3N3b3JkID0gb3duZXJCeXRlcy5zdWJhcnJheSgwLCAzMik7CiAgICBjb25zdCB1c2VyUGFzc3dvcmQgPSB1c2VyQnl0ZXMuc3ViYXJyYXkoMCwgMzIpOwogICAgY29uc3QgZmxhZ3MgPSBkaWN0LmdldCgiUCIpOwogICAgY29uc3QgcmV2aXNpb24gPSBkaWN0LmdldCgiUiIpOwogICAgY29uc3QgZW5jcnlwdE1ldGFkYXRhID0gKGFsZ29yaXRobSA9PT0gNCB8fCBhbGdvcml0aG0gPT09IDUpICYmIGRpY3QuZ2V0KCJFbmNyeXB0TWV0YWRhdGEiKSAhPT0gZmFsc2U7CiAgICB0aGlzLmVuY3J5cHRNZXRhZGF0YSA9IGVuY3J5cHRNZXRhZGF0YTsKICAgIGNvbnN0IGZpbGVJZEJ5dGVzID0gc3RyaW5nVG9CeXRlcyhmaWxlSWQpOwogICAgbGV0IHBhc3N3b3JkQnl0ZXM7CiAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgaWYgKHJldmlzaW9uID09PSA2KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHBhc3N3b3JkID0gdXRmOFN0cmluZ1RvU3RyaW5nKHBhc3N3b3JkKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIHdhcm4oIkNpcGhlclRyYW5zZm9ybUZhY3Rvcnk6IFVuYWJsZSB0byBjb252ZXJ0IFVURjggZW5jb2RlZCBwYXNzd29yZC4iKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcGFzc3dvcmRCeXRlcyA9IHN0cmluZ1RvQnl0ZXMocGFzc3dvcmQpOwogICAgfQogICAgbGV0IGVuY3J5cHRpb25LZXk7CiAgICBpZiAoYWxnb3JpdGhtICE9PSA1KSB7CiAgICAgIGVuY3J5cHRpb25LZXkgPSB0aGlzLiNwcmVwYXJlS2V5RGF0YShmaWxlSWRCeXRlcywgcGFzc3dvcmRCeXRlcywgb3duZXJQYXNzd29yZCwgdXNlclBhc3N3b3JkLCBmbGFncywgcmV2aXNpb24sIGtleUxlbmd0aCwgZW5jcnlwdE1ldGFkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IG93bmVyVmFsaWRhdGlvblNhbHQgPSBvd25lckJ5dGVzLnN1YmFycmF5KDMyLCA0MCk7CiAgICAgIGNvbnN0IG93bmVyS2V5U2FsdCA9IG93bmVyQnl0ZXMuc3ViYXJyYXkoNDAsIDQ4KTsKICAgICAgY29uc3QgdUJ5dGVzID0gdXNlckJ5dGVzLnN1YmFycmF5KDAsIDQ4KTsKICAgICAgY29uc3QgdXNlclZhbGlkYXRpb25TYWx0ID0gdXNlckJ5dGVzLnN1YmFycmF5KDMyLCA0MCk7CiAgICAgIGNvbnN0IHVzZXJLZXlTYWx0ID0gdXNlckJ5dGVzLnN1YmFycmF5KDQwLCA0OCk7CiAgICAgIGNvbnN0IG93bmVyRW5jcnlwdGlvbiA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIk9FIikpOwogICAgICBjb25zdCB1c2VyRW5jcnlwdGlvbiA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlVFIikpOwogICAgICBjb25zdCBwZXJtcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlBlcm1zIikpOwogICAgICBlbmNyeXB0aW9uS2V5ID0gdGhpcy4jY3JlYXRlRW5jcnlwdGlvbktleTIwKHJldmlzaW9uLCBwYXNzd29yZEJ5dGVzLCBvd25lclBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCBvd25lcktleVNhbHQsIHVCeXRlcywgdXNlclBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJLZXlTYWx0LCBvd25lckVuY3J5cHRpb24sIHVzZXJFbmNyeXB0aW9uLCBwZXJtcyk7CiAgICB9CiAgICBpZiAoIWVuY3J5cHRpb25LZXkpIHsKICAgICAgaWYgKCFwYXNzd29yZCkgewogICAgICAgIHRocm93IG5ldyBQYXNzd29yZEV4Y2VwdGlvbigiTm8gcGFzc3dvcmQgZ2l2ZW4iLCBQYXNzd29yZFJlc3BvbnNlcy5ORUVEX1BBU1NXT1JEKTsKICAgICAgfQogICAgICBjb25zdCBkZWNvZGVkUGFzc3dvcmQgPSB0aGlzLiNkZWNvZGVVc2VyUGFzc3dvcmQocGFzc3dvcmRCeXRlcywgb3duZXJQYXNzd29yZCwgcmV2aXNpb24sIGtleUxlbmd0aCk7CiAgICAgIGVuY3J5cHRpb25LZXkgPSB0aGlzLiNwcmVwYXJlS2V5RGF0YShmaWxlSWRCeXRlcywgZGVjb2RlZFBhc3N3b3JkLCBvd25lclBhc3N3b3JkLCB1c2VyUGFzc3dvcmQsIGZsYWdzLCByZXZpc2lvbiwga2V5TGVuZ3RoLCBlbmNyeXB0TWV0YWRhdGEpOwogICAgfQogICAgaWYgKCFlbmNyeXB0aW9uS2V5KSB7CiAgICAgIHRocm93IG5ldyBQYXNzd29yZEV4Y2VwdGlvbigiSW5jb3JyZWN0IFBhc3N3b3JkIiwgUGFzc3dvcmRSZXNwb25zZXMuSU5DT1JSRUNUX1BBU1NXT1JEKTsKICAgIH0KICAgIGlmIChhbGdvcml0aG0gPT09IDQgJiYgZW5jcnlwdGlvbktleS5sZW5ndGggPCAxNikgewogICAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgIHRoaXMuZW5jcnlwdGlvbktleS5zZXQoZW5jcnlwdGlvbktleSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5OwogICAgfQogICAgaWYgKGFsZ29yaXRobSA+PSA0KSB7CiAgICAgIGNvbnN0IGNmID0gZGljdC5nZXQoIkNGIik7CiAgICAgIGlmIChjZiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjZi5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICB9CiAgICAgIHRoaXMuY2YgPSBjZjsKICAgICAgdGhpcy5zdG1mID0gZGljdC5nZXQoIlN0bUYiKSB8fCBOYW1lLmdldCgiSWRlbnRpdHkiKTsKICAgICAgdGhpcy5zdHJmID0gZGljdC5nZXQoIlN0ckYiKSB8fCBOYW1lLmdldCgiSWRlbnRpdHkiKTsKICAgICAgdGhpcy5lZmYgPSBkaWN0LmdldCgiRUZGIikgfHwgdGhpcy5zdG1mOwogICAgfQogIH0KICBjcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pIHsKICAgIGlmICh0aGlzLmFsZ29yaXRobSA9PT0gNCB8fCB0aGlzLmFsZ29yaXRobSA9PT0gNSkgewogICAgICByZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybSh0aGlzLiNidWlsZENpcGhlckNvbnN0cnVjdG9yKHRoaXMuY2YsIHRoaXMuc3RyZiwgbnVtLCBnZW4sIHRoaXMuZW5jcnlwdGlvbktleSksIHRoaXMuI2J1aWxkQ2lwaGVyQ29uc3RydWN0b3IodGhpcy5jZiwgdGhpcy5zdG1mLCBudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5KSk7CiAgICB9CiAgICBjb25zdCBrZXkgPSB0aGlzLiNidWlsZE9iamVjdEtleShudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5LCBmYWxzZSk7CiAgICBjb25zdCBjaXBoZXJDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKGtleSk7CiAgICB9OwogICAgcmV0dXJuIG5ldyBDaXBoZXJUcmFuc2Zvcm0oY2lwaGVyQ29uc3RydWN0b3IsIGNpcGhlckNvbnN0cnVjdG9yKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hyZWYuanMKCgoKCgoKY2xhc3MgWFJlZiB7CiAgI2ZpcnN0WFJlZlN0bVBvcyA9IG51bGw7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBwZGZNYW5hZ2VyKSB7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7CiAgICB0aGlzLmVudHJpZXMgPSBbXTsKICAgIHRoaXMuX3hyZWZTdG1zID0gbmV3IFNldCgpOwogICAgdGhpcy5fY2FjaGVNYXAgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9wZW5kaW5nUmVmcyA9IG5ldyBSZWZTZXQoKTsKICAgIHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0gPSBudWxsOwogICAgdGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtID0gbnVsbDsKICAgIHRoaXMuX3BlcnNpc3RlbnRSZWZzQ2FjaGUgPSBudWxsOwogIH0KICBnZXROZXdQZXJzaXN0ZW50UmVmKG9iaikgewogICAgaWYgKHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0gPT09IG51bGwpIHsKICAgICAgdGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bSA9IHRoaXMuZW50cmllcy5sZW5ndGggfHwgMTsKICAgIH0KICAgIGNvbnN0IG51bSA9IHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0rKzsKICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIG9iaik7CiAgICByZXR1cm4gUmVmLmdldChudW0sIDApOwogIH0KICBnZXROZXdUZW1wb3JhcnlSZWYoKSB7CiAgICBpZiAodGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtID09PSBudWxsKSB7CiAgICAgIHRoaXMuX25ld1RlbXBvcmFyeVJlZk51bSA9IHRoaXMuZW50cmllcy5sZW5ndGggfHwgMTsKICAgICAgaWYgKHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0pIHsKICAgICAgICB0aGlzLl9wZXJzaXN0ZW50UmVmc0NhY2hlID0gbmV3IE1hcCgpOwogICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW07IGkgPCB0aGlzLl9uZXdQZXJzaXN0ZW50UmVmTnVtOyBpKyspIHsKICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbnRSZWZzQ2FjaGUuc2V0KGksIHRoaXMuX2NhY2hlTWFwLmdldChpKSk7CiAgICAgICAgICB0aGlzLl9jYWNoZU1hcC5kZWxldGUoaSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gUmVmLmdldCh0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW0rKywgMCk7CiAgfQogIHJlc2V0TmV3VGVtcG9yYXJ5UmVmKCkgewogICAgdGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtID0gbnVsbDsKICAgIGlmICh0aGlzLl9wZXJzaXN0ZW50UmVmc0NhY2hlKSB7CiAgICAgIGZvciAoY29uc3QgW251bSwgb2JqXSBvZiB0aGlzLl9wZXJzaXN0ZW50UmVmc0NhY2hlKSB7CiAgICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgb2JqKTsKICAgICAgfQogICAgfQogICAgdGhpcy5fcGVyc2lzdGVudFJlZnNDYWNoZSA9IG51bGw7CiAgfQogIHNldFN0YXJ0WFJlZihzdGFydFhSZWYpIHsKICAgIHRoaXMuc3RhcnRYUmVmUXVldWUgPSBbc3RhcnRYUmVmXTsKICB9CiAgcGFyc2UocmVjb3ZlcnlNb2RlID0gZmFsc2UpIHsKICAgIGxldCB0cmFpbGVyRGljdDsKICAgIGlmICghcmVjb3ZlcnlNb2RlKSB7CiAgICAgIHRyYWlsZXJEaWN0ID0gdGhpcy5yZWFkWFJlZigpOwogICAgfSBlbHNlIHsKICAgICAgd2FybigiSW5kZXhpbmcgYWxsIFBERiBvYmplY3RzIik7CiAgICAgIHRyYWlsZXJEaWN0ID0gdGhpcy5pbmRleE9iamVjdHMoKTsKICAgIH0KICAgIHRyYWlsZXJEaWN0LmFzc2lnblhyZWYodGhpcyk7CiAgICB0aGlzLnRyYWlsZXIgPSB0cmFpbGVyRGljdDsKICAgIGxldCBlbmNyeXB0OwogICAgdHJ5IHsKICAgICAgZW5jcnlwdCA9IHRyYWlsZXJEaWN0LmdldCgiRW5jcnlwdCIpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiRW5jcnlwdCIgcmVmZXJlbmNlOiAiJHtleH0iLmApOwogICAgfQogICAgaWYgKGVuY3J5cHQgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGlkcyA9IHRyYWlsZXJEaWN0LmdldCgiSUQiKTsKICAgICAgY29uc3QgZmlsZUlkID0gaWRzPy5sZW5ndGggPyBpZHNbMF0gOiAiIjsKICAgICAgZW5jcnlwdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICB0aGlzLmVuY3J5cHQgPSBuZXcgQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeShlbmNyeXB0LCBmaWxlSWQsIHRoaXMucGRmTWFuYWdlci5wYXNzd29yZCk7CiAgICB9CiAgICBsZXQgcm9vdDsKICAgIHRyeSB7CiAgICAgIHJvb3QgPSB0cmFpbGVyRGljdC5nZXQoIlJvb3QiKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgWFJlZi5wYXJzZSAtIEludmFsaWQgIlJvb3QiIHJlZmVyZW5jZTogIiR7ZXh9Ii5gKTsKICAgIH0KICAgIGlmIChyb290IGluc3RhbmNlb2YgRGljdCkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IHBhZ2VzID0gcm9vdC5nZXQoIlBhZ2VzIik7CiAgICAgICAgaWYgKHBhZ2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICAgIHRocm93IGV4OwogICAgICAgIH0KICAgICAgICB3YXJuKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiUGFnZXMiIHJlZmVyZW5jZTogIiR7ZXh9Ii5gKTsKICAgICAgfQogICAgfQogICAgaWYgKCFyZWNvdmVyeU1vZGUpIHsKICAgICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpOwogICAgfQogICAgdGhyb3cgbmV3IEludmFsaWRQREZFeGNlcHRpb24oIkludmFsaWQgUm9vdCByZWZlcmVuY2UuIik7CiAgfQogIHByb2Nlc3NYUmVmVGFibGUocGFyc2VyKSB7CiAgICBpZiAoISgidGFibGVTdGF0ZSIgaW4gdGhpcykpIHsKICAgICAgdGhpcy50YWJsZVN0YXRlID0gewogICAgICAgIGVudHJ5TnVtOiAwLAogICAgICAgIHN0cmVhbVBvczogcGFyc2VyLmxleGVyLnN0cmVhbS5wb3MsCiAgICAgICAgcGFyc2VyQnVmMTogcGFyc2VyLmJ1ZjEsCiAgICAgICAgcGFyc2VyQnVmMjogcGFyc2VyLmJ1ZjIKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IG9iaiA9IHRoaXMucmVhZFhSZWZUYWJsZShwYXJzZXIpOwogICAgaWYgKCFpc0NtZChvYmosICJ0cmFpbGVyIikpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBmaW5kIHRyYWlsZXIgZGljdGlvbmFyeSIpOwogICAgfQogICAgbGV0IGRpY3QgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkgJiYgZGljdC5kaWN0KSB7CiAgICAgIGRpY3QgPSBkaWN0LmRpY3Q7CiAgICB9CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBwYXJzZSB0cmFpbGVyIGRpY3Rpb25hcnkiKTsKICAgIH0KICAgIGRlbGV0ZSB0aGlzLnRhYmxlU3RhdGU7CiAgICByZXR1cm4gZGljdDsKICB9CiAgcmVhZFhSZWZUYWJsZShwYXJzZXIpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHBhcnNlci5sZXhlci5zdHJlYW07CiAgICBjb25zdCB0YWJsZVN0YXRlID0gdGhpcy50YWJsZVN0YXRlOwogICAgc3RyZWFtLnBvcyA9IHRhYmxlU3RhdGUuc3RyZWFtUG9zOwogICAgcGFyc2VyLmJ1ZjEgPSB0YWJsZVN0YXRlLnBhcnNlckJ1ZjE7CiAgICBwYXJzZXIuYnVmMiA9IHRhYmxlU3RhdGUucGFyc2VyQnVmMjsKICAgIGxldCBvYmo7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoISgiZmlyc3RFbnRyeU51bSIgaW4gdGFibGVTdGF0ZSkgfHwgISgiZW50cnlDb3VudCIgaW4gdGFibGVTdGF0ZSkpIHsKICAgICAgICBpZiAoaXNDbWQob2JqID0gcGFyc2VyLmdldE9iaigpLCAidHJhaWxlciIpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtID0gb2JqOwogICAgICAgIHRhYmxlU3RhdGUuZW50cnlDb3VudCA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgfQogICAgICBsZXQgZmlyc3QgPSB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW07CiAgICAgIGNvbnN0IGNvdW50ID0gdGFibGVTdGF0ZS5lbnRyeUNvdW50OwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmlyc3QpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGNvdW50KSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiB3cm9uZyB0eXBlcyBpbiBzdWJzZWN0aW9uIGhlYWRlciIpOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSB0YWJsZVN0YXRlLmVudHJ5TnVtOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIHRhYmxlU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvczsKICAgICAgICB0YWJsZVN0YXRlLmVudHJ5TnVtID0gaTsKICAgICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjEgPSBwYXJzZXIuYnVmMTsKICAgICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjIgPSBwYXJzZXIuYnVmMjsKICAgICAgICBjb25zdCBlbnRyeSA9IHt9OwogICAgICAgIGVudHJ5Lm9mZnNldCA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBlbnRyeS5nZW4gPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICAgICAgY29uc3QgdHlwZSA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENtZCkgewogICAgICAgICAgc3dpdGNoICh0eXBlLmNtZCkgewogICAgICAgICAgICBjYXNlICJmIjoKICAgICAgICAgICAgICBlbnRyeS5mcmVlID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAibiI6CiAgICAgICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGVudHJ5Lm9mZnNldCkgfHwgIU51bWJlci5pc0ludGVnZXIoZW50cnkuZ2VuKSB8fCAhKGVudHJ5LmZyZWUgfHwgZW50cnkudW5jb21wcmVzc2VkKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGVudHJ5IGluIFhSZWYgc3Vic2VjdGlvbjogJHtmaXJzdH0sICR7Y291bnR9YCk7CiAgICAgICAgfQogICAgICAgIGlmIChpID09PSAwICYmIGVudHJ5LmZyZWUgJiYgZmlyc3QgPT09IDEpIHsKICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXNbaSArIGZpcnN0XSkgewogICAgICAgICAgdGhpcy5lbnRyaWVzW2kgKyBmaXJzdF0gPSBlbnRyeTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGFibGVTdGF0ZS5lbnRyeU51bSA9IDA7CiAgICAgIHRhYmxlU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvczsKICAgICAgdGFibGVTdGF0ZS5wYXJzZXJCdWYxID0gcGFyc2VyLmJ1ZjE7CiAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMiA9IHBhcnNlci5idWYyOwogICAgICBkZWxldGUgdGFibGVTdGF0ZS5maXJzdEVudHJ5TnVtOwogICAgICBkZWxldGUgdGFibGVTdGF0ZS5lbnRyeUNvdW50OwogICAgfQogICAgaWYgKHRoaXMuZW50cmllc1swXSAmJiAhdGhpcy5lbnRyaWVzWzBdLmZyZWUpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHVuZXhwZWN0ZWQgZmlyc3Qgb2JqZWN0Iik7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KICBwcm9jZXNzWFJlZlN0cmVhbShzdHJlYW0pIHsKICAgIGlmICghKCJzdHJlYW1TdGF0ZSIgaW4gdGhpcykpIHsKICAgICAgY29uc3QgewogICAgICAgIGRpY3QsCiAgICAgICAgcG9zCiAgICAgIH0gPSBzdHJlYW07CiAgICAgIGNvbnN0IGJ5dGVXaWR0aHMgPSBkaWN0LmdldCgiVyIpOwogICAgICBjb25zdCByYW5nZSA9IGRpY3QuZ2V0KCJJbmRleCIpIHx8IFswLCBkaWN0LmdldCgiU2l6ZSIpXTsKICAgICAgdGhpcy5zdHJlYW1TdGF0ZSA9IHsKICAgICAgICBlbnRyeVJhbmdlczogcmFuZ2UsCiAgICAgICAgYnl0ZVdpZHRocywKICAgICAgICBlbnRyeU51bTogMCwKICAgICAgICBzdHJlYW1Qb3M6IHBvcwogICAgICB9OwogICAgfQogICAgdGhpcy5yZWFkWFJlZlN0cmVhbShzdHJlYW0pOwogICAgZGVsZXRlIHRoaXMuc3RyZWFtU3RhdGU7CiAgICByZXR1cm4gc3RyZWFtLmRpY3Q7CiAgfQogIHJlYWRYUmVmU3RyZWFtKHN0cmVhbSkgewogICAgY29uc3Qgc3RyZWFtU3RhdGUgPSB0aGlzLnN0cmVhbVN0YXRlOwogICAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXRlLnN0cmVhbVBvczsKICAgIGNvbnN0IFt0eXBlRmllbGRXaWR0aCwgb2Zmc2V0RmllbGRXaWR0aCwgZ2VuZXJhdGlvbkZpZWxkV2lkdGhdID0gc3RyZWFtU3RhdGUuYnl0ZVdpZHRoczsKICAgIGNvbnN0IGVudHJ5UmFuZ2VzID0gc3RyZWFtU3RhdGUuZW50cnlSYW5nZXM7CiAgICB3aGlsZSAoZW50cnlSYW5nZXMubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBbZmlyc3QsIG5dID0gZW50cnlSYW5nZXM7CiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmaXJzdCkgfHwgIU51bWJlci5pc0ludGVnZXIobikpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiByYW5nZSBmaWVsZHM6ICR7Zmlyc3R9LCAke259YCk7CiAgICAgIH0KICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHR5cGVGaWVsZFdpZHRoKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihvZmZzZXRGaWVsZFdpZHRoKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihnZW5lcmF0aW9uRmllbGRXaWR0aCkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAke2ZpcnN0fSwgJHtufWApOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSBzdHJlYW1TdGF0ZS5lbnRyeU51bTsgaSA8IG47ICsraSkgewogICAgICAgIHN0cmVhbVN0YXRlLmVudHJ5TnVtID0gaTsKICAgICAgICBzdHJlYW1TdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOwogICAgICAgIGxldCB0eXBlID0gMCwKICAgICAgICAgIG9mZnNldCA9IDAsCiAgICAgICAgICBnZW5lcmF0aW9uID0gMDsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHR5cGVGaWVsZFdpZHRoOyArK2opIHsKICAgICAgICAgIGNvbnN0IHR5cGVCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICAgIGlmICh0eXBlQnl0ZSA9PT0gLTEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgYnl0ZVdpZHRocyAndHlwZScuIik7CiAgICAgICAgICB9CiAgICAgICAgICB0eXBlID0gdHlwZSA8PCA4IHwgdHlwZUJ5dGU7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlRmllbGRXaWR0aCA9PT0gMCkgewogICAgICAgICAgdHlwZSA9IDE7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb2Zmc2V0RmllbGRXaWR0aDsgKytqKSB7CiAgICAgICAgICBjb25zdCBvZmZzZXRCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICAgIGlmIChvZmZzZXRCeXRlID09PSAtMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBieXRlV2lkdGhzICdvZmZzZXQnLiIpOwogICAgICAgICAgfQogICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IDw8IDggfCBvZmZzZXRCeXRlOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGdlbmVyYXRpb25GaWVsZFdpZHRoOyArK2opIHsKICAgICAgICAgIGNvbnN0IGdlbmVyYXRpb25CeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICAgIGlmIChnZW5lcmF0aW9uQnl0ZSA9PT0gLTEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgYnl0ZVdpZHRocyAnZ2VuZXJhdGlvbicuIik7CiAgICAgICAgICB9CiAgICAgICAgICBnZW5lcmF0aW9uID0gZ2VuZXJhdGlvbiA8PCA4IHwgZ2VuZXJhdGlvbkJ5dGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGVudHJ5ID0ge307CiAgICAgICAgZW50cnkub2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgIGVudHJ5LmdlbiA9IGdlbmVyYXRpb247CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGVudHJ5LmZyZWUgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIFhSZWYgZW50cnkgdHlwZTogJHt0eXBlfWApOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuZW50cmllc1tmaXJzdCArIGldKSB7CiAgICAgICAgICB0aGlzLmVudHJpZXNbZmlyc3QgKyBpXSA9IGVudHJ5OwogICAgICAgIH0KICAgICAgfQogICAgICBzdHJlYW1TdGF0ZS5lbnRyeU51bSA9IDA7CiAgICAgIHN0cmVhbVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CiAgICAgIGVudHJ5UmFuZ2VzLnNwbGljZSgwLCAyKTsKICAgIH0KICB9CiAgaW5kZXhPYmplY3RzKCkgewogICAgY29uc3QgVEFCID0gMHg5LAogICAgICBMRiA9IDB4YSwKICAgICAgQ1IgPSAweGQsCiAgICAgIFNQQUNFID0gMHgyMDsKICAgIGNvbnN0IFBFUkNFTlQgPSAweDI1LAogICAgICBMVCA9IDB4M2M7CiAgICBmdW5jdGlvbiByZWFkVG9rZW4oZGF0YSwgb2Zmc2V0KSB7CiAgICAgIGxldCB0b2tlbiA9ICIiLAogICAgICAgIGNoID0gZGF0YVtvZmZzZXRdOwogICAgICB3aGlsZSAoY2ggIT09IExGICYmIGNoICE9PSBDUiAmJiBjaCAhPT0gTFQpIHsKICAgICAgICBpZiAoKytvZmZzZXQgPj0gZGF0YS5sZW5ndGgpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0b2tlbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgICAgICBjaCA9IGRhdGFbb2Zmc2V0XTsKICAgICAgfQogICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgICBmdW5jdGlvbiBza2lwVW50aWwoZGF0YSwgb2Zmc2V0LCB3aGF0KSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IHdoYXQubGVuZ3RoLAogICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKICAgICAgbGV0IHNraXBwZWQgPSAwOwogICAgICB3aGlsZSAob2Zmc2V0IDwgZGF0YUxlbmd0aCkgewogICAgICAgIGxldCBpID0gMDsKICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aCAmJiBkYXRhW29mZnNldCArIGldID09PSB3aGF0W2ldKSB7CiAgICAgICAgICArK2k7CiAgICAgICAgfQogICAgICAgIGlmIChpID49IGxlbmd0aCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG9mZnNldCsrOwogICAgICAgIHNraXBwZWQrKzsKICAgICAgfQogICAgICByZXR1cm4gc2tpcHBlZDsKICAgIH0KICAgIGNvbnN0IGdFbmRvYmpSZWdFeHAgPSAvXGIoZW5kb2JqfFxkK1xzK1xkK1xzK29ianx4cmVmfHRyYWlsZXJccyo8PClcYi9nOwogICAgY29uc3QgZ1N0YXJ0eHJlZlJlZ0V4cCA9IC9cYihzdGFydHhyZWZ8XGQrXHMrXGQrXHMrb2JqKVxiL2c7CiAgICBjb25zdCBvYmpSZWdFeHAgPSAvXihcZCspXHMrKFxkKylccytvYmpcYi87CiAgICBjb25zdCB0cmFpbGVyQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTE2LCAxMTQsIDk3LCAxMDUsIDEwOCwgMTAxLCAxMTRdKTsKICAgIGNvbnN0IHN0YXJ0eHJlZkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzExNSwgMTE2LCA5NywgMTE0LCAxMTYsIDEyMCwgMTE0LCAxMDEsIDEwMl0pOwogICAgY29uc3QgeHJlZkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzQ3LCA4OCwgODIsIDEwMSwgMTAyXSk7CiAgICB0aGlzLmVudHJpZXMubGVuZ3RoID0gMDsKICAgIHRoaXMuX2NhY2hlTWFwLmNsZWFyKCk7CiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbTsKICAgIHN0cmVhbS5wb3MgPSAwOwogICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLmdldEJ5dGVzKCksCiAgICAgIGJ1ZmZlclN0ciA9IGJ5dGVzVG9TdHJpbmcoYnVmZmVyKSwKICAgICAgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aDsKICAgIGxldCBwb3NpdGlvbiA9IHN0cmVhbS5zdGFydDsKICAgIGNvbnN0IHRyYWlsZXJzID0gW10sCiAgICAgIHhyZWZTdG1zID0gW107CiAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHsKICAgICAgbGV0IGNoID0gYnVmZmVyW3Bvc2l0aW9uXTsKICAgICAgaWYgKGNoID09PSBUQUIgfHwgY2ggPT09IExGIHx8IGNoID09PSBDUiB8fCBjaCA9PT0gU1BBQ0UpIHsKICAgICAgICArK3Bvc2l0aW9uOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChjaCA9PT0gUEVSQ0VOVCkgewogICAgICAgIGRvIHsKICAgICAgICAgICsrcG9zaXRpb247CiAgICAgICAgICBpZiAocG9zaXRpb24gPj0gbGVuZ3RoKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2ggPSBidWZmZXJbcG9zaXRpb25dOwogICAgICAgIH0gd2hpbGUgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHRva2VuID0gcmVhZFRva2VuKGJ1ZmZlciwgcG9zaXRpb24pOwogICAgICBsZXQgbTsKICAgICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoInhyZWYiKSAmJiAodG9rZW4ubGVuZ3RoID09PSA0IHx8IC9ccy8udGVzdCh0b2tlbls0XSkpKSB7CiAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHRyYWlsZXJCeXRlcyk7CiAgICAgICAgdHJhaWxlcnMucHVzaChwb3NpdGlvbik7CiAgICAgICAgcG9zaXRpb24gKz0gc2tpcFVudGlsKGJ1ZmZlciwgcG9zaXRpb24sIHN0YXJ0eHJlZkJ5dGVzKTsKICAgICAgfSBlbHNlIGlmIChtID0gb2JqUmVnRXhwLmV4ZWModG9rZW4pKSB7CiAgICAgICAgY29uc3QgbnVtID0gbVsxXSB8IDAsCiAgICAgICAgICBnZW4gPSBtWzJdIHwgMDsKICAgICAgICBjb25zdCBzdGFydFBvcyA9IHBvc2l0aW9uICsgdG9rZW4ubGVuZ3RoOwogICAgICAgIGxldCBjb250ZW50TGVuZ3RoLAogICAgICAgICAgdXBkYXRlRW50cmllcyA9IGZhbHNlOwogICAgICAgIGlmICghdGhpcy5lbnRyaWVzW251bV0pIHsKICAgICAgICAgIHVwZGF0ZUVudHJpZXMgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbnRyaWVzW251bV0uZ2VuID09PSBnZW4pIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICAgICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MpKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcGFyc2VyLmdldE9iaigpOwogICAgICAgICAgICB1cGRhdGVFbnRyaWVzID0gdHJ1ZTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFBhcnNlckVPRkV4Y2VwdGlvbikgewogICAgICAgICAgICAgIHdhcm4oYGluZGV4T2JqZWN0cyAtLSBjaGVja2luZyBvYmplY3QgKCR7dG9rZW59KTogIiR7ZXh9Ii5gKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB1cGRhdGVFbnRyaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodXBkYXRlRW50cmllcykgewogICAgICAgICAgdGhpcy5lbnRyaWVzW251bV0gPSB7CiAgICAgICAgICAgIG9mZnNldDogcG9zaXRpb24gLSBzdHJlYW0uc3RhcnQsCiAgICAgICAgICAgIGdlbiwKICAgICAgICAgICAgdW5jb21wcmVzc2VkOiB0cnVlCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBnRW5kb2JqUmVnRXhwLmxhc3RJbmRleCA9IHN0YXJ0UG9zOwogICAgICAgIGNvbnN0IG1hdGNoID0gZ0VuZG9ialJlZ0V4cC5leGVjKGJ1ZmZlclN0cik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICBjb25zdCBlbmRQb3MgPSBnRW5kb2JqUmVnRXhwLmxhc3RJbmRleCArIDE7CiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gZW5kUG9zIC0gcG9zaXRpb247CiAgICAgICAgICBpZiAobWF0Y2hbMV0gIT09ICJlbmRvYmoiKSB7CiAgICAgICAgICAgIHdhcm4oYGluZGV4T2JqZWN0czogRm91bmQgIiR7bWF0Y2hbMV19IiBpbnNpZGUgb2YgYW5vdGhlciAib2JqIiwgYCArICdjYXVzZWQgYnkgbWlzc2luZyAiZW5kb2JqIiAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICAgICAgICAgICAgY29udGVudExlbmd0aCAtPSBtYXRjaFsxXS5sZW5ndGggKyAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gbGVuZ3RoIC0gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbnRlbnQgPSBidWZmZXIuc3ViYXJyYXkocG9zaXRpb24sIHBvc2l0aW9uICsgY29udGVudExlbmd0aCk7CiAgICAgICAgY29uc3QgeHJlZlRhZ09mZnNldCA9IHNraXBVbnRpbChjb250ZW50LCAwLCB4cmVmQnl0ZXMpOwogICAgICAgIGlmICh4cmVmVGFnT2Zmc2V0IDwgY29udGVudExlbmd0aCAmJiBjb250ZW50W3hyZWZUYWdPZmZzZXQgKyA1XSA8IDY0KSB7CiAgICAgICAgICB4cmVmU3Rtcy5wdXNoKHBvc2l0aW9uIC0gc3RyZWFtLnN0YXJ0KTsKICAgICAgICAgIHRoaXMuX3hyZWZTdG1zLmFkZChwb3NpdGlvbiAtIHN0cmVhbS5zdGFydCk7CiAgICAgICAgfQogICAgICAgIHBvc2l0aW9uICs9IGNvbnRlbnRMZW5ndGg7CiAgICAgIH0gZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgidHJhaWxlciIpICYmICh0b2tlbi5sZW5ndGggPT09IDcgfHwgL1xzLy50ZXN0KHRva2VuWzddKSkpIHsKICAgICAgICB0cmFpbGVycy5wdXNoKHBvc2l0aW9uKTsKICAgICAgICBjb25zdCBzdGFydFBvcyA9IHBvc2l0aW9uICsgdG9rZW4ubGVuZ3RoOwogICAgICAgIGxldCBjb250ZW50TGVuZ3RoOwogICAgICAgIGdTdGFydHhyZWZSZWdFeHAubGFzdEluZGV4ID0gc3RhcnRQb3M7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBnU3RhcnR4cmVmUmVnRXhwLmV4ZWMoYnVmZmVyU3RyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgIGNvbnN0IGVuZFBvcyA9IGdTdGFydHhyZWZSZWdFeHAubGFzdEluZGV4ICsgMTsKICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBlbmRQb3MgLSBwb3NpdGlvbjsKICAgICAgICAgIGlmIChtYXRjaFsxXSAhPT0gInN0YXJ0eHJlZiIpIHsKICAgICAgICAgICAgd2FybihgaW5kZXhPYmplY3RzOiBGb3VuZCAiJHttYXRjaFsxXX0iIGFmdGVyICJ0cmFpbGVyIiwgYCArICdjYXVzZWQgYnkgbWlzc2luZyAic3RhcnR4cmVmIiAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICAgICAgICAgICAgY29udGVudExlbmd0aCAtPSBtYXRjaFsxXS5sZW5ndGggKyAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gbGVuZ3RoIC0gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIHBvc2l0aW9uICs9IGNvbnRlbnRMZW5ndGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9zaXRpb24gKz0gdG9rZW4ubGVuZ3RoICsgMTsKICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCB4cmVmU3RtIG9mIHhyZWZTdG1zKSB7CiAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaCh4cmVmU3RtKTsKICAgICAgdGhpcy5yZWFkWFJlZih0cnVlKTsKICAgIH0KICAgIGNvbnN0IHRyYWlsZXJEaWN0cyA9IFtdOwogICAgbGV0IGlzRW5jcnlwdGVkID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IHRyYWlsZXIgb2YgdHJhaWxlcnMpIHsKICAgICAgc3RyZWFtLnBvcyA9IHRyYWlsZXI7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSwKICAgICAgICB4cmVmOiB0aGlzLAogICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZSwKICAgICAgICByZWNvdmVyeU1vZGU6IHRydWUKICAgICAgfSk7CiAgICAgIGNvbnN0IG9iaiA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgaWYgKCFpc0NtZChvYmosICJ0cmFpbGVyIikpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBkaWN0ID0gcGFyc2VyLmdldE9iaigpOwogICAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0cmFpbGVyRGljdHMucHVzaChkaWN0KTsKICAgICAgaWYgKGRpY3QuaGFzKCJFbmNyeXB0IikpIHsKICAgICAgICBpc0VuY3J5cHRlZCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGxldCB0cmFpbGVyRGljdCwgdHJhaWxlckVycm9yOwogICAgZm9yIChjb25zdCBkaWN0IG9mIFsuLi50cmFpbGVyRGljdHMsICJnZW5GYWxsYmFjayIsIC4uLnRyYWlsZXJEaWN0c10pIHsKICAgICAgaWYgKGRpY3QgPT09ICJnZW5GYWxsYmFjayIpIHsKICAgICAgICBpZiAoIXRyYWlsZXJFcnJvcikgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2dlbmVyYXRpb25GYWxsYmFjayA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgbGV0IHZhbGlkUGFnZXNEaWN0ID0gZmFsc2U7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3Qgcm9vdERpY3QgPSBkaWN0LmdldCgiUm9vdCIpOwogICAgICAgIGlmICghKHJvb3REaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYWdlc0RpY3QgPSByb290RGljdC5nZXQoIlBhZ2VzIik7CiAgICAgICAgaWYgKCEocGFnZXNEaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYWdlc0NvdW50ID0gcGFnZXNEaWN0LmdldCgiQ291bnQiKTsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihwYWdlc0NvdW50KSkgewogICAgICAgICAgdmFsaWRQYWdlc0RpY3QgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICB0cmFpbGVyRXJyb3IgPSBleDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodmFsaWRQYWdlc0RpY3QgJiYgKCFpc0VuY3J5cHRlZCB8fCBkaWN0LmhhcygiRW5jcnlwdCIpKSAmJiBkaWN0LmhhcygiSUQiKSkgewogICAgICAgIHJldHVybiBkaWN0OwogICAgICB9CiAgICAgIHRyYWlsZXJEaWN0ID0gZGljdDsKICAgIH0KICAgIGlmICh0cmFpbGVyRGljdCkgewogICAgICByZXR1cm4gdHJhaWxlckRpY3Q7CiAgICB9CiAgICBpZiAodGhpcy50b3BEaWN0KSB7CiAgICAgIHJldHVybiB0aGlzLnRvcERpY3Q7CiAgICB9CiAgICBpZiAoIXRyYWlsZXJEaWN0cy5sZW5ndGgpIHsKICAgICAgZm9yIChjb25zdCBbbnVtLCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkgewogICAgICAgIGlmICghZW50cnkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCByZWYgPSBSZWYuZ2V0KG51bSwgZW50cnkuZ2VuKTsKICAgICAgICBsZXQgb2JqOwogICAgICAgIHRyeSB7CiAgICAgICAgICBvYmogPSB0aGlzLmZldGNoKHJlZik7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICAgIG9iaiA9IG9iai5kaWN0OwogICAgICAgIH0KICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouaGFzKCJSb290IikpIHsKICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aHJvdyBuZXcgSW52YWxpZFBERkV4Y2VwdGlvbigiSW52YWxpZCBQREYgc3RydWN0dXJlLiIpOwogIH0KICByZWFkWFJlZihyZWNvdmVyeU1vZGUgPSBmYWxzZSkgewogICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW07CiAgICBjb25zdCBzdGFydFhSZWZQYXJzZWRDYWNoZSA9IG5ldyBTZXQoKTsKICAgIHdoaWxlICh0aGlzLnN0YXJ0WFJlZlF1ZXVlLmxlbmd0aCkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IHN0YXJ0WFJlZiA9IHRoaXMuc3RhcnRYUmVmUXVldWVbMF07CiAgICAgICAgaWYgKHN0YXJ0WFJlZlBhcnNlZENhY2hlLmhhcyhzdGFydFhSZWYpKSB7CiAgICAgICAgICB3YXJuKCJyZWFkWFJlZiAtIHNraXBwaW5nIFhSZWYgdGFibGUgc2luY2UgaXQgd2FzIGFscmVhZHkgcGFyc2VkLiIpOwogICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHN0YXJ0WFJlZlBhcnNlZENhY2hlLmFkZChzdGFydFhSZWYpOwogICAgICAgIHN0cmVhbS5wb3MgPSBzdGFydFhSZWYgKyBzdHJlYW0uc3RhcnQ7CiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgICAgICB4cmVmOiB0aGlzLAogICAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCiAgICAgICAgfSk7CiAgICAgICAgbGV0IG9iaiA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBsZXQgZGljdDsKICAgICAgICBpZiAoaXNDbWQob2JqLCAieHJlZiIpKSB7CiAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlRhYmxlKHBhcnNlcik7CiAgICAgICAgICBpZiAoIXRoaXMudG9wRGljdCkgewogICAgICAgICAgICB0aGlzLnRvcERpY3QgPSBkaWN0OwogICAgICAgICAgfQogICAgICAgICAgb2JqID0gZGljdC5nZXQoIlhSZWZTdG0iKTsKICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikgJiYgIXRoaXMuX3hyZWZTdG1zLmhhcyhvYmopKSB7CiAgICAgICAgICAgIHRoaXMuX3hyZWZTdG1zLmFkZChvYmopOwogICAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gob2JqKTsKICAgICAgICAgICAgdGhpcy4jZmlyc3RYUmVmU3RtUG9zID8/PSBvYmo7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZXIuZ2V0T2JqKCkpIHx8ICFpc0NtZChwYXJzZXIuZ2V0T2JqKCksICJvYmoiKSB8fCAhKChvYmogPSBwYXJzZXIuZ2V0T2JqKCkpIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgc3RyZWFtIik7CiAgICAgICAgICB9CiAgICAgICAgICBkaWN0ID0gdGhpcy5wcm9jZXNzWFJlZlN0cmVhbShvYmopOwogICAgICAgICAgaWYgKCF0aGlzLnRvcERpY3QpIHsKICAgICAgICAgICAgdGhpcy50b3BEaWN0ID0gZGljdDsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghZGljdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkZhaWxlZCB0byByZWFkIFhSZWYgc3RyZWFtIik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHN0cmVhbSBoZWFkZXIiKTsKICAgICAgICB9CiAgICAgICAgb2JqID0gZGljdC5nZXQoIlByZXYiKTsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CiAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gob2JqKTsKICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKG9iai5udW0pOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIGluZm8oIih3aGlsZSByZWFkaW5nIFhSZWYpOiAiICsgZSk7CiAgICAgIH0KICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpOwogICAgfQogICAgaWYgKHRoaXMudG9wRGljdCkgewogICAgICByZXR1cm4gdGhpcy50b3BEaWN0OwogICAgfQogICAgaWYgKHJlY292ZXJ5TW9kZSkgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpOwogIH0KICBnZXQgbGFzdFhSZWZTdHJlYW1Qb3MoKSB7CiAgICByZXR1cm4gdGhpcy4jZmlyc3RYUmVmU3RtUG9zID8/ICh0aGlzLl94cmVmU3Rtcy5zaXplID4gMCA/IE1hdGgubWF4KC4uLnRoaXMuX3hyZWZTdG1zKSA6IG51bGwpOwogIH0KICBnZXRFbnRyeShpKSB7CiAgICBjb25zdCB4cmVmRW50cnkgPSB0aGlzLmVudHJpZXNbaV07CiAgICBpZiAoeHJlZkVudHJ5ICYmICF4cmVmRW50cnkuZnJlZSAmJiB4cmVmRW50cnkub2Zmc2V0KSB7CiAgICAgIHJldHVybiB4cmVmRW50cnk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZmV0Y2hJZlJlZihvYmosIHN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlKSB7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHJldHVybiB0aGlzLmZldGNoKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICAgIHJldHVybiBvYmo7CiAgfQogIGZldGNoKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHsKICAgIGlmICghKHJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJyZWYgb2JqZWN0IGlzIG5vdCBhIHJlZmVyZW5jZSIpOwogICAgfQogICAgY29uc3QgbnVtID0gcmVmLm51bTsKICAgIGNvbnN0IGNhY2hlRW50cnkgPSB0aGlzLl9jYWNoZU1hcC5nZXQobnVtKTsKICAgIGlmIChjYWNoZUVudHJ5ICE9PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKGNhY2hlRW50cnkgaW5zdGFuY2VvZiBEaWN0ICYmICFjYWNoZUVudHJ5Lm9iaklkKSB7CiAgICAgICAgY2FjaGVFbnRyeS5vYmpJZCA9IHJlZi50b1N0cmluZygpOwogICAgICB9CiAgICAgIHJldHVybiBjYWNoZUVudHJ5OwogICAgfQogICAgbGV0IHhyZWZFbnRyeSA9IHRoaXMuZ2V0RW50cnkobnVtKTsKICAgIGlmICh4cmVmRW50cnkgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIHhyZWZFbnRyeTsKICAgIH0KICAgIGlmICh0aGlzLl9wZW5kaW5nUmVmcy5oYXMocmVmKSkgewogICAgICB0aGlzLl9wZW5kaW5nUmVmcy5yZW1vdmUocmVmKTsKICAgICAgd2FybihgSWdub3JpbmcgY2lyY3VsYXIgcmVmZXJlbmNlOiAke3JlZn0uYCk7CiAgICAgIHJldHVybiBDSVJDVUxBUl9SRUY7CiAgICB9CiAgICB0aGlzLl9wZW5kaW5nUmVmcy5wdXQocmVmKTsKICAgIHRyeSB7CiAgICAgIHhyZWZFbnRyeSA9IHhyZWZFbnRyeS51bmNvbXByZXNzZWQgPyB0aGlzLmZldGNoVW5jb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pIDogdGhpcy5mZXRjaENvbXByZXNzZWQocmVmLCB4cmVmRW50cnksIHN1cHByZXNzRW5jcnlwdGlvbik7CiAgICAgIHRoaXMuX3BlbmRpbmdSZWZzLnJlbW92ZShyZWYpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgdGhpcy5fcGVuZGluZ1JlZnMucmVtb3ZlKHJlZik7CiAgICAgIHRocm93IGV4OwogICAgfQogICAgaWYgKHhyZWZFbnRyeSBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgeHJlZkVudHJ5Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7CiAgICB9IGVsc2UgaWYgKHhyZWZFbnRyeSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgeHJlZkVudHJ5LmRpY3Qub2JqSWQgPSByZWYudG9TdHJpbmcoKTsKICAgIH0KICAgIHJldHVybiB4cmVmRW50cnk7CiAgfQogIGZldGNoVW5jb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24gPSBmYWxzZSkgewogICAgY29uc3QgZ2VuID0gcmVmLmdlbjsKICAgIGxldCBudW0gPSByZWYubnVtOwogICAgaWYgKHhyZWZFbnRyeS5nZW4gIT09IGdlbikgewogICAgICBjb25zdCBtc2cgPSBgSW5jb25zaXN0ZW50IGdlbmVyYXRpb24gaW4gWFJlZjogJHtyZWZ9YDsKICAgICAgaWYgKHRoaXMuX2dlbmVyYXRpb25GYWxsYmFjayAmJiB4cmVmRW50cnkuZ2VuIDwgZ2VuKSB7CiAgICAgICAgd2Fybihtc2cpOwogICAgICAgIHJldHVybiB0aGlzLmZldGNoVW5jb21wcmVzc2VkKFJlZi5nZXQobnVtLCB4cmVmRW50cnkuZ2VuKSwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgICB9CiAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24obXNnKTsKICAgIH0KICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtLm1ha2VTdWJTdHJlYW0oeHJlZkVudHJ5Lm9mZnNldCArIHRoaXMuc3RyZWFtLnN0YXJ0KTsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgIHhyZWY6IHRoaXMsCiAgICAgIGFsbG93U3RyZWFtczogdHJ1ZQogICAgfSk7CiAgICBjb25zdCBvYmoxID0gcGFyc2VyLmdldE9iaigpOwogICAgY29uc3Qgb2JqMiA9IHBhcnNlci5nZXRPYmooKTsKICAgIGNvbnN0IG9iajMgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBpZiAob2JqMSAhPT0gbnVtIHx8IG9iajIgIT09IGdlbiB8fCAhKG9iajMgaW5zdGFuY2VvZiBDbWQpKSB7CiAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24oYEJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTsKICAgIH0KICAgIGlmIChvYmozLmNtZCAhPT0gIm9iaiIpIHsKICAgICAgaWYgKG9iajMuY21kLnN0YXJ0c1dpdGgoIm9iaiIpKSB7CiAgICAgICAgbnVtID0gcGFyc2VJbnQob2JqMy5jbWQuc3Vic3RyaW5nKDMpLCAxMCk7CiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obnVtKSkgewogICAgICAgICAgcmV0dXJuIG51bTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IFhSZWZFbnRyeUV4Y2VwdGlvbihgQmFkICh1bmNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICR7cmVmfWApOwogICAgfQogICAgeHJlZkVudHJ5ID0gdGhpcy5lbmNyeXB0ICYmICFzdXBwcmVzc0VuY3J5cHRpb24gPyBwYXJzZXIuZ2V0T2JqKHRoaXMuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pKSA6IHBhcnNlci5nZXRPYmooKTsKICAgIGlmICghKHhyZWZFbnRyeSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgIHRoaXMuX2NhY2hlTWFwLnNldChudW0sIHhyZWZFbnRyeSk7CiAgICB9CiAgICByZXR1cm4geHJlZkVudHJ5OwogIH0KICBmZXRjaENvbXByZXNzZWQocmVmLCB4cmVmRW50cnksIHN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlKSB7CiAgICBjb25zdCB0YWJsZU9mZnNldCA9IHhyZWZFbnRyeS5vZmZzZXQ7CiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLmZldGNoKFJlZi5nZXQodGFibGVPZmZzZXQsIDApKTsKICAgIGlmICghKHN0cmVhbSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiYmFkIE9ialN0bSBzdHJlYW0iKTsKICAgIH0KICAgIGNvbnN0IGZpcnN0ID0gc3RyZWFtLmRpY3QuZ2V0KCJGaXJzdCIpOwogICAgY29uc3QgbiA9IHN0cmVhbS5kaWN0LmdldCgiTiIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQgZmlyc3QgYW5kIG4gcGFyYW1ldGVycyBmb3IgT2JqU3RtIHN0cmVhbSIpOwogICAgfQogICAgbGV0IHBhcnNlciA9IG5ldyBQYXJzZXIoewogICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbSksCiAgICAgIHhyZWY6IHRoaXMsCiAgICAgIGFsbG93U3RyZWFtczogdHJ1ZQogICAgfSk7CiAgICBjb25zdCBudW1zID0gbmV3IEFycmF5KG4pOwogICAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBBcnJheShuKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGNvbnN0IG51bSA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYGludmFsaWQgb2JqZWN0IG51bWJlciBpbiB0aGUgT2JqU3RtIHN0cmVhbTogJHtudW19YCk7CiAgICAgIH0KICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFyc2VyLmdldE9iaigpOwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob2Zmc2V0KSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgaW52YWxpZCBvYmplY3Qgb2Zmc2V0IGluIHRoZSBPYmpTdG0gc3RyZWFtOiAke29mZnNldH1gKTsKICAgICAgfQogICAgICBudW1zW2ldID0gbnVtOwogICAgICBvZmZzZXRzW2ldID0gb2Zmc2V0OwogICAgfQogICAgY29uc3Qgc3RhcnQgPSAoc3RyZWFtLnN0YXJ0IHx8IDApICsgZmlyc3Q7CiAgICBjb25zdCBlbnRyaWVzID0gbmV3IEFycmF5KG4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gaSA8IG4gLSAxID8gb2Zmc2V0c1tpICsgMV0gLSBvZmZzZXRzW2ldIDogdW5kZWZpbmVkOwogICAgICBpZiAobGVuZ3RoIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBvZmZzZXQgaW4gdGhlIE9ialN0bSBzdHJlYW0uIik7CiAgICAgIH0KICAgICAgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgICAgbGV4ZXI6IG5ldyBMZXhlcihzdHJlYW0ubWFrZVN1YlN0cmVhbShzdGFydCArIG9mZnNldHNbaV0sIGxlbmd0aCwgc3RyZWFtLmRpY3QpKSwKICAgICAgICB4cmVmOiB0aGlzLAogICAgICAgIGFsbG93U3RyZWFtczogdHJ1ZQogICAgICB9KTsKICAgICAgY29uc3Qgb2JqID0gcGFyc2VyLmdldE9iaigpOwogICAgICBlbnRyaWVzW2ldID0gb2JqOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IG51bSA9IG51bXNbaV0sCiAgICAgICAgZW50cnkgPSB0aGlzLmVudHJpZXNbbnVtXTsKICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5Lm9mZnNldCA9PT0gdGFibGVPZmZzZXQgJiYgZW50cnkuZ2VuID09PSBpKSB7CiAgICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgb2JqKTsKICAgICAgfQogICAgfQogICAgeHJlZkVudHJ5ID0gZW50cmllc1t4cmVmRW50cnkuZ2VuXTsKICAgIGlmICh4cmVmRW50cnkgPT09IHVuZGVmaW5lZCkgewogICAgICB0aHJvdyBuZXcgWFJlZkVudHJ5RXhjZXB0aW9uKGBCYWQgKGNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICR7cmVmfWApOwogICAgfQogICAgcmV0dXJuIHhyZWZFbnRyeTsKICB9CiAgYXN5bmMgZmV0Y2hJZlJlZkFzeW5jKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKSB7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHJldHVybiB0aGlzLmZldGNoQXN5bmMob2JqLCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CiAgYXN5bmMgZmV0Y2hBc3luYyhyZWYsIHN1cHByZXNzRW5jcnlwdGlvbikgewogICAgdHJ5IHsKICAgICAgcmV0dXJuIHRoaXMuZmV0Y2gocmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikpIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICBhd2FpdCB0aGlzLnBkZk1hbmFnZXIucmVxdWVzdFJhbmdlKGV4LmJlZ2luLCBleC5lbmQpOwogICAgICByZXR1cm4gdGhpcy5mZXRjaEFzeW5jKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICB9CiAgZ2V0Q2F0YWxvZ09iaigpIHsKICAgIHJldHVybiB0aGlzLnJvb3Q7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9kb2N1bWVudC5qcwoKCgoKCgoKCgoKCgoKCgoKCgoKY29uc3QgTEVUVEVSX1NJWkVfTUVESUFCT1ggPSBbMCwgMCwgNjEyLCA3OTJdOwpjbGFzcyBQYWdlIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBwZGZNYW5hZ2VyLAogICAgeHJlZiwKICAgIHBhZ2VJbmRleCwKICAgIHBhZ2VEaWN0LAogICAgcmVmLAogICAgZ2xvYmFsSWRGYWN0b3J5LAogICAgZm9udENhY2hlLAogICAgYnVpbHRJbkNNYXBDYWNoZSwKICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgIGdsb2JhbEltYWdlQ2FjaGUsCiAgICBzeXN0ZW1Gb250Q2FjaGUsCiAgICBub25CbGVuZE1vZGVzU2V0LAogICAgeGZhRmFjdG9yeQogIH0pIHsKICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7CiAgICB0aGlzLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDsKICAgIHRoaXMucGFnZURpY3QgPSBwYWdlRGljdDsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLnJlZiA9IHJlZjsKICAgIHRoaXMuZm9udENhY2hlID0gZm9udENhY2hlOwogICAgdGhpcy5idWlsdEluQ01hcENhY2hlID0gYnVpbHRJbkNNYXBDYWNoZTsKICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlID0gc3RhbmRhcmRGb250RGF0YUNhY2hlOwogICAgdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUgPSBnbG9iYWxDb2xvclNwYWNlQ2FjaGU7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUgPSBnbG9iYWxJbWFnZUNhY2hlOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUgPSBzeXN0ZW1Gb250Q2FjaGU7CiAgICB0aGlzLm5vbkJsZW5kTW9kZXNTZXQgPSBub25CbGVuZE1vZGVzU2V0OwogICAgdGhpcy5ldmFsdWF0b3JPcHRpb25zID0gcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zOwogICAgdGhpcy5yZXNvdXJjZXNQcm9taXNlID0gbnVsbDsKICAgIHRoaXMueGZhRmFjdG9yeSA9IHhmYUZhY3Rvcnk7CiAgICBjb25zdCBpZENvdW50ZXJzID0gewogICAgICBvYmo6IDAKICAgIH07CiAgICB0aGlzLl9sb2NhbElkRmFjdG9yeSA9IGNsYXNzIGV4dGVuZHMgZ2xvYmFsSWRGYWN0b3J5IHsKICAgICAgc3RhdGljIGNyZWF0ZU9iaklkKCkgewogICAgICAgIHJldHVybiBgcCR7cGFnZUluZGV4fV8keysraWRDb3VudGVycy5vYmp9YDsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0UGFnZU9iaklkKCkgewogICAgICAgIHJldHVybiBgcCR7cmVmLnRvU3RyaW5nKCl9YDsKICAgICAgfQogICAgfTsKICB9CiAgX2dldEluaGVyaXRhYmxlUHJvcGVydHkoa2V5LCBnZXRBcnJheSA9IGZhbHNlKSB7CiAgICBjb25zdCB2YWx1ZSA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0OiB0aGlzLnBhZ2VEaWN0LAogICAgICBrZXksCiAgICAgIGdldEFycmF5LAogICAgICBzdG9wV2hlbkZvdW5kOiBmYWxzZQogICAgfSk7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEgfHwgISh2YWx1ZVswXSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiB2YWx1ZVswXTsKICAgIH0KICAgIHJldHVybiBEaWN0Lm1lcmdlKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBkaWN0QXJyYXk6IHZhbHVlCiAgICB9KTsKICB9CiAgZ2V0IGNvbnRlbnQoKSB7CiAgICByZXR1cm4gdGhpcy5wYWdlRGljdC5nZXRBcnJheSgiQ29udGVudHMiKTsKICB9CiAgZ2V0IHJlc291cmNlcygpIHsKICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJlc291cmNlcyIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicmVzb3VyY2VzIiwgcmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCA/IHJlc291cmNlcyA6IERpY3QuZW1wdHkpOwogIH0KICBfZ2V0Qm91bmRpbmdCb3gobmFtZSkgewogICAgaWYgKHRoaXMueGZhRGF0YSkgewogICAgICByZXR1cm4gdGhpcy54ZmFEYXRhLmJib3g7CiAgICB9CiAgICBjb25zdCBib3ggPSBsb29rdXBOb3JtYWxSZWN0KHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkobmFtZSwgdHJ1ZSksIG51bGwpOwogICAgaWYgKGJveCkgewogICAgICBpZiAoYm94WzJdIC0gYm94WzBdID4gMCAmJiBib3hbM10gLSBib3hbMV0gPiAwKSB7CiAgICAgICAgcmV0dXJuIGJveDsKICAgICAgfQogICAgICB3YXJuKGBFbXB0eSwgb3IgaW52YWxpZCwgLyR7bmFtZX0gZW50cnkuYCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZ2V0IG1lZGlhQm94KCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibWVkaWFCb3giLCB0aGlzLl9nZXRCb3VuZGluZ0JveCgiTWVkaWFCb3giKSB8fCBMRVRURVJfU0laRV9NRURJQUJPWCk7CiAgfQogIGdldCBjcm9wQm94KCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiY3JvcEJveCIsIHRoaXMuX2dldEJvdW5kaW5nQm94KCJDcm9wQm94IikgfHwgdGhpcy5tZWRpYUJveCk7CiAgfQogIGdldCB1c2VyVW5pdCgpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMucGFnZURpY3QuZ2V0KCJVc2VyVW5pdCIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidXNlclVuaXQiLCB0eXBlb2Ygb2JqID09PSAibnVtYmVyIiAmJiBvYmogPiAwID8gb2JqIDogMS4wKTsKICB9CiAgZ2V0IHZpZXcoKSB7CiAgICBjb25zdCB7CiAgICAgIGNyb3BCb3gsCiAgICAgIG1lZGlhQm94CiAgICB9ID0gdGhpczsKICAgIGlmIChjcm9wQm94ICE9PSBtZWRpYUJveCAmJiAhaXNBcnJheUVxdWFsKGNyb3BCb3gsIG1lZGlhQm94KSkgewogICAgICBjb25zdCBib3ggPSBVdGlsLmludGVyc2VjdChjcm9wQm94LCBtZWRpYUJveCk7CiAgICAgIGlmIChib3ggJiYgYm94WzJdIC0gYm94WzBdID4gMCAmJiBib3hbM10gLSBib3hbMV0gPiAwKSB7CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmlldyIsIGJveCk7CiAgICAgIH0KICAgICAgd2FybigiRW1wdHkgL0Nyb3BCb3ggYW5kIC9NZWRpYUJveCBpbnRlcnNlY3Rpb24uIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2aWV3IiwgbWVkaWFCb3gpOwogIH0KICBnZXQgcm90YXRlKCkgewogICAgbGV0IHJvdGF0ZSA9IHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJvdGF0ZSIpIHx8IDA7CiAgICBpZiAocm90YXRlICUgOTAgIT09IDApIHsKICAgICAgcm90YXRlID0gMDsKICAgIH0gZWxzZSBpZiAocm90YXRlID49IDM2MCkgewogICAgICByb3RhdGUgJT0gMzYwOwogICAgfSBlbHNlIGlmIChyb3RhdGUgPCAwKSB7CiAgICAgIHJvdGF0ZSA9IChyb3RhdGUgJSAzNjAgKyAzNjApICUgMzYwOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicm90YXRlIiwgcm90YXRlKTsKICB9CiAgX29uU3ViU3RyZWFtRXJyb3IocmVhc29uLCBvYmpJZCkgewogICAgaWYgKHRoaXMuZXZhbHVhdG9yT3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgd2FybihgZ2V0Q29udGVudFN0cmVhbSAtIGlnbm9yaW5nIHN1Yi1zdHJlYW0gKCR7b2JqSWR9KTogIiR7cmVhc29ufSIuYCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRocm93IHJlYXNvbjsKICB9CiAgYXN5bmMgZ2V0Q29udGVudFN0cmVhbSgpIHsKICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJjb250ZW50Iik7CiAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZW50KSkgewogICAgICByZXR1cm4gbmV3IFN0cmVhbXNTZXF1ZW5jZVN0cmVhbShjb250ZW50LCB0aGlzLl9vblN1YlN0cmVhbUVycm9yLmJpbmQodGhpcykpOwogICAgfQogICAgcmV0dXJuIG5ldyBOdWxsU3RyZWFtKCk7CiAgfQogIGdldCB4ZmFEYXRhKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAieGZhRGF0YSIsIHRoaXMueGZhRmFjdG9yeSA/IHsKICAgICAgYmJveDogdGhpcy54ZmFGYWN0b3J5LmdldEJvdW5kaW5nQm94KHRoaXMucGFnZUluZGV4KQogICAgfSA6IG51bGwpOwogIH0KICBhc3luYyAjcmVwbGFjZUlkQnlSZWYoYW5ub3RhdGlvbnMsIGRlbGV0ZWRBbm5vdGF0aW9ucywgZXhpc3RpbmdBbm5vdGF0aW9ucykgewogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBpZiAoYW5ub3RhdGlvbi5pZCkgewogICAgICAgIGNvbnN0IHJlZiA9IFJlZi5mcm9tU3RyaW5nKGFubm90YXRpb24uaWQpOwogICAgICAgIGlmICghcmVmKSB7CiAgICAgICAgICB3YXJuKGBBIG5vbi1saW5rZWQgYW5ub3RhdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQ6ICR7YW5ub3RhdGlvbi5pZH1gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYW5ub3RhdGlvbi5kZWxldGVkKSB7CiAgICAgICAgICBkZWxldGVkQW5ub3RhdGlvbnMucHV0KHJlZiwgcmVmKTsKICAgICAgICAgIGlmIChhbm5vdGF0aW9uLnBvcHVwUmVmKSB7CiAgICAgICAgICAgIGNvbnN0IHBvcHVwUmVmID0gUmVmLmZyb21TdHJpbmcoYW5ub3RhdGlvbi5wb3B1cFJlZik7CiAgICAgICAgICAgIGlmIChwb3B1cFJlZikgewogICAgICAgICAgICAgIGRlbGV0ZWRBbm5vdGF0aW9ucy5wdXQocG9wdXBSZWYsIHBvcHVwUmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nQW5ub3RhdGlvbnM/LnB1dChyZWYpOwogICAgICAgIGFubm90YXRpb24ucmVmID0gcmVmOwogICAgICAgIHByb21pc2VzLnB1c2godGhpcy54cmVmLmZldGNoQXN5bmMocmVmKS50aGVuKG9iaiA9PiB7CiAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICBhbm5vdGF0aW9uLm9sZEFubm90YXRpb24gPSBvYmouY2xvbmUoKTsKICAgICAgICAgIH0KICAgICAgICB9LCAoKSA9PiB7CiAgICAgICAgICB3YXJuKGBDYW5ub3QgZmV0Y2ggXGBvbGRBbm5vdGF0aW9uXGAgZm9yOiAke3JlZn0uYCk7CiAgICAgICAgfSkpOwogICAgICAgIGRlbGV0ZSBhbm5vdGF0aW9uLmlkOwogICAgICB9CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQogIGFzeW5jIHNhdmVOZXdBbm5vdGF0aW9ucyhoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9ucywgaW1hZ2VQcm9taXNlcywgY2hhbmdlcykgewogICAgaWYgKHRoaXMueGZhRmFjdG9yeSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlhGQTogQ2Fubm90IHNhdmUgbmV3IGFubm90YXRpb25zLiIpOwogICAgfQogICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBQYXJ0aWFsRXZhbHVhdG9yKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBoYW5kbGVyLAogICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IHRoaXMuZm9udENhY2hlLAogICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgb3B0aW9uczogdGhpcy5ldmFsdWF0b3JPcHRpb25zCiAgICB9KTsKICAgIGNvbnN0IGRlbGV0ZWRBbm5vdGF0aW9ucyA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgY29uc3QgZXhpc3RpbmdBbm5vdGF0aW9ucyA9IG5ldyBSZWZTZXQoKTsKICAgIGF3YWl0IHRoaXMuI3JlcGxhY2VJZEJ5UmVmKGFubm90YXRpb25zLCBkZWxldGVkQW5ub3RhdGlvbnMsIGV4aXN0aW5nQW5ub3RhdGlvbnMpOwogICAgY29uc3QgcGFnZURpY3QgPSB0aGlzLnBhZ2VEaWN0OwogICAgY29uc3QgYW5ub3RhdGlvbnNBcnJheSA9IHRoaXMuYW5ub3RhdGlvbnMuZmlsdGVyKGEgPT4gIShhIGluc3RhbmNlb2YgUmVmICYmIGRlbGV0ZWRBbm5vdGF0aW9ucy5oYXMoYSkpKTsKICAgIGNvbnN0IG5ld0RhdGEgPSBhd2FpdCBBbm5vdGF0aW9uRmFjdG9yeS5zYXZlTmV3QW5ub3RhdGlvbnMocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvbnMsIGltYWdlUHJvbWlzZXMsIGNoYW5nZXMpOwogICAgZm9yIChjb25zdCB7CiAgICAgIHJlZgogICAgfSBvZiBuZXdEYXRhLmFubm90YXRpb25zKSB7CiAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBSZWYgJiYgIWV4aXN0aW5nQW5ub3RhdGlvbnMuaGFzKHJlZikpIHsKICAgICAgICBhbm5vdGF0aW9uc0FycmF5LnB1c2gocmVmKTsKICAgICAgfQogICAgfQogICAgY29uc3QgZGljdCA9IHBhZ2VEaWN0LmNsb25lKCk7CiAgICBkaWN0LnNldCgiQW5ub3RzIiwgYW5ub3RhdGlvbnNBcnJheSk7CiAgICBjaGFuZ2VzLnB1dCh0aGlzLnJlZiwgewogICAgICBkYXRhOiBkaWN0CiAgICB9KTsKICAgIGZvciAoY29uc3QgZGVsZXRlZFJlZiBvZiBkZWxldGVkQW5ub3RhdGlvbnMpIHsKICAgICAgY2hhbmdlcy5wdXQoZGVsZXRlZFJlZiwgewogICAgICAgIGRhdGE6IG51bGwKICAgICAgfSk7CiAgICB9CiAgfQogIGFzeW5jIHNhdmUoaGFuZGxlciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgUGFydGlhbEV2YWx1YXRvcih7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaGFuZGxlciwKICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSwKICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLAogICAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGU6IHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLAogICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsCiAgICAgIHN5c3RlbUZvbnRDYWNoZTogdGhpcy5zeXN0ZW1Gb250Q2FjaGUsCiAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucwogICAgfSk7CiAgICBjb25zdCBhbm5vdGF0aW9ucyA9IGF3YWl0IHRoaXMuX3BhcnNlZEFubm90YXRpb25zOwogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBwcm9taXNlcy5wdXNoKGFubm90YXRpb24uc2F2ZShwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgIHdhcm4oInNhdmUgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIgKyBgIiR7dGFzay5uYW1lfSIgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0pKTsKICAgIH0KICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQogIGFzeW5jIGxvYWRSZXNvdXJjZXMoa2V5cykgewogICAgYXdhaXQgKHRoaXMucmVzb3VyY2VzUHJvbWlzZSA/Pz0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAicmVzb3VyY2VzIikpOwogICAgY29uc3Qgb2JqZWN0TG9hZGVyID0gbmV3IE9iamVjdExvYWRlcih0aGlzLnJlc291cmNlcywga2V5cywgdGhpcy54cmVmKTsKICAgIGF3YWl0IG9iamVjdExvYWRlci5sb2FkKCk7CiAgfQogIGFzeW5jIGdldE9wZXJhdG9yTGlzdCh7CiAgICBoYW5kbGVyLAogICAgc2luaywKICAgIHRhc2ssCiAgICBpbnRlbnQsCiAgICBjYWNoZUtleSwKICAgIGFubm90YXRpb25TdG9yYWdlID0gbnVsbCwKICAgIG1vZGlmaWVkSWRzID0gbnVsbAogIH0pIHsKICAgIGNvbnN0IGNvbnRlbnRTdHJlYW1Qcm9taXNlID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7CiAgICBjb25zdCByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFsiQ29sb3JTcGFjZSIsICJFeHRHU3RhdGUiLCAiRm9udCIsICJQYXR0ZXJuIiwgIlByb3BlcnRpZXMiLCAiU2hhZGluZyIsICJYT2JqZWN0Il0pOwogICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBQYXJ0aWFsRXZhbHVhdG9yKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBoYW5kbGVyLAogICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IHRoaXMuZm9udENhY2hlLAogICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgb3B0aW9uczogdGhpcy5ldmFsdWF0b3JPcHRpb25zCiAgICB9KTsKICAgIGNvbnN0IG5ld0Fubm90c0J5UGFnZSA9ICF0aGlzLnhmYUZhY3RvcnkgPyBnZXROZXdBbm5vdGF0aW9uc01hcChhbm5vdGF0aW9uU3RvcmFnZSkgOiBudWxsOwogICAgY29uc3QgbmV3QW5ub3RzID0gbmV3QW5ub3RzQnlQYWdlPy5nZXQodGhpcy5wYWdlSW5kZXgpOwogICAgbGV0IG5ld0Fubm90YXRpb25zUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgIGxldCBkZWxldGVkQW5ub3RhdGlvbnMgPSBudWxsOwogICAgaWYgKG5ld0Fubm90cykgewogICAgICBjb25zdCBhbm5vdGF0aW9uR2xvYmFsc1Byb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJhbm5vdGF0aW9uR2xvYmFscyIpOwogICAgICBsZXQgaW1hZ2VQcm9taXNlczsKICAgICAgY29uc3QgbWlzc2luZ0JpdG1hcHMgPSBuZXcgU2V0KCk7CiAgICAgIGZvciAoY29uc3QgewogICAgICAgIGJpdG1hcElkLAogICAgICAgIGJpdG1hcAogICAgICB9IG9mIG5ld0Fubm90cykgewogICAgICAgIGlmIChiaXRtYXBJZCAmJiAhYml0bWFwICYmICFtaXNzaW5nQml0bWFwcy5oYXMoYml0bWFwSWQpKSB7CiAgICAgICAgICBtaXNzaW5nQml0bWFwcy5hZGQoYml0bWFwSWQpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCB7CiAgICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQKICAgICAgfSA9IHRoaXMuZXZhbHVhdG9yT3B0aW9uczsKICAgICAgaWYgKG1pc3NpbmdCaXRtYXBzLnNpemUgPiAwKSB7CiAgICAgICAgY29uc3QgYW5ub3RhdGlvbldpdGhCaXRtYXBzID0gbmV3QW5ub3RzLnNsaWNlKCk7CiAgICAgICAgZm9yIChjb25zdCBba2V5LCBhbm5vdGF0aW9uXSBvZiBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChBbm5vdGF0aW9uRWRpdG9yUHJlZml4KSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhbm5vdGF0aW9uLmJpdG1hcCAmJiBtaXNzaW5nQml0bWFwcy5oYXMoYW5ub3RhdGlvbi5iaXRtYXBJZCkpIHsKICAgICAgICAgICAgYW5ub3RhdGlvbldpdGhCaXRtYXBzLnB1c2goYW5ub3RhdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGltYWdlUHJvbWlzZXMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhhbm5vdGF0aW9uV2l0aEJpdG1hcHMsIHRoaXMueHJlZiwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpOwogICAgICB9IGVsc2UgewogICAgICAgIGltYWdlUHJvbWlzZXMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhuZXdBbm5vdHMsIHRoaXMueHJlZiwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpOwogICAgICB9CiAgICAgIGRlbGV0ZWRBbm5vdGF0aW9ucyA9IG5ldyBSZWZTZXQoKTsKICAgICAgbmV3QW5ub3RhdGlvbnNQcm9taXNlID0gUHJvbWlzZS5hbGwoW2Fubm90YXRpb25HbG9iYWxzUHJvbWlzZSwgdGhpcy4jcmVwbGFjZUlkQnlSZWYobmV3QW5ub3RzLCBkZWxldGVkQW5ub3RhdGlvbnMsIG51bGwpXSkudGhlbigoW2Fubm90YXRpb25HbG9iYWxzXSkgPT4gewogICAgICAgIGlmICghYW5ub3RhdGlvbkdsb2JhbHMpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkucHJpbnROZXdBbm5vdGF0aW9ucyhhbm5vdGF0aW9uR2xvYmFscywgcGFydGlhbEV2YWx1YXRvciwgdGFzaywgbmV3QW5ub3RzLCBpbWFnZVByb21pc2VzKTsKICAgICAgfSk7CiAgICB9CiAgICBjb25zdCBwYWdlTGlzdFByb21pc2UgPSBQcm9taXNlLmFsbChbY29udGVudFN0cmVhbVByb21pc2UsIHJlc291cmNlc1Byb21pc2VdKS50aGVuKGFzeW5jIChbY29udGVudFN0cmVhbV0pID0+IHsKICAgICAgY29uc3Qgb3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdChpbnRlbnQsIHNpbmspOwogICAgICBoYW5kbGVyLnNlbmQoIlN0YXJ0UmVuZGVyUGFnZSIsIHsKICAgICAgICB0cmFuc3BhcmVuY3k6IHBhcnRpYWxFdmFsdWF0b3IuaGFzQmxlbmRNb2Rlcyh0aGlzLnJlc291cmNlcywgdGhpcy5ub25CbGVuZE1vZGVzU2V0KSwKICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICAgIGNhY2hlS2V5CiAgICAgIH0pOwogICAgICBhd2FpdCBwYXJ0aWFsRXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgICAgc3RyZWFtOiBjb250ZW50U3RyZWFtLAogICAgICAgIHRhc2ssCiAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcywKICAgICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdAogICAgICB9KTsKICAgICAgcmV0dXJuIG9wTGlzdDsKICAgIH0pOwogICAgbGV0IFtwYWdlT3BMaXN0LCBhbm5vdGF0aW9ucywgbmV3QW5ub3RhdGlvbnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3BhZ2VMaXN0UHJvbWlzZSwgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnMsIG5ld0Fubm90YXRpb25zUHJvbWlzZV0pOwogICAgaWYgKG5ld0Fubm90YXRpb25zKSB7CiAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuZmlsdGVyKGEgPT4gIShhLnJlZiAmJiBkZWxldGVkQW5ub3RhdGlvbnMuaGFzKGEucmVmKSkpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBuZXdBbm5vdGF0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgbmV3QW5ub3RhdGlvbiA9IG5ld0Fubm90YXRpb25zW2ldOwogICAgICAgIGlmIChuZXdBbm5vdGF0aW9uLnJlZlRvUmVwbGFjZSkgewogICAgICAgICAgY29uc3QgaiA9IGFubm90YXRpb25zLmZpbmRJbmRleChhID0+IGEucmVmICYmIGlzUmVmc0VxdWFsKGEucmVmLCBuZXdBbm5vdGF0aW9uLnJlZlRvUmVwbGFjZSkpOwogICAgICAgICAgaWYgKGogPj0gMCkgewogICAgICAgICAgICBhbm5vdGF0aW9ucy5zcGxpY2UoaiwgMSwgbmV3QW5ub3RhdGlvbik7CiAgICAgICAgICAgIG5ld0Fubm90YXRpb25zLnNwbGljZShpLS0sIDEpOwogICAgICAgICAgICBpaS0tOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zLmNvbmNhdChuZXdBbm5vdGF0aW9ucyk7CiAgICB9CiAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwIHx8IGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRElTQUJMRSkgewogICAgICBwYWdlT3BMaXN0LmZsdXNoKHRydWUpOwogICAgICByZXR1cm4gewogICAgICAgIGxlbmd0aDogcGFnZU9wTGlzdC50b3RhbExlbmd0aAogICAgICB9OwogICAgfQogICAgY29uc3QgcmVuZGVyRm9ybXMgPSAhIShpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0ZPUk1TKSwKICAgICAgaXNFZGl0aW5nID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5JU19FRElUSU5HKSwKICAgICAgaW50ZW50QW55ID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5BTlkpLAogICAgICBpbnRlbnREaXNwbGF5ID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZKSwKICAgICAgaW50ZW50UHJpbnQgPSAhIShpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UKTsKICAgIGNvbnN0IG9wTGlzdFByb21pc2VzID0gW107CiAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgaWYgKGludGVudEFueSB8fCBpbnRlbnREaXNwbGF5ICYmIGFubm90YXRpb24ubXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlLCByZW5kZXJGb3JtcykgJiYgYW5ub3RhdGlvbi5tdXN0QmVWaWV3ZWRXaGVuRWRpdGluZyhpc0VkaXRpbmcsIG1vZGlmaWVkSWRzKSB8fCBpbnRlbnRQcmludCAmJiBhbm5vdGF0aW9uLm11c3RCZVByaW50ZWQoYW5ub3RhdGlvblN0b3JhZ2UpKSB7CiAgICAgICAgb3BMaXN0UHJvbWlzZXMucHVzaChhbm5vdGF0aW9uLmdldE9wZXJhdG9yTGlzdChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICB3YXJuKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIgKyBgIiR7dGFzay5uYW1lfSIgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBvcExpc3Q6IG51bGwsCiAgICAgICAgICAgIHNlcGFyYXRlRm9ybTogZmFsc2UsCiAgICAgICAgICAgIHNlcGFyYXRlQ2FudmFzOiBmYWxzZQogICAgICAgICAgfTsKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG9wTGlzdHMgPSBhd2FpdCBQcm9taXNlLmFsbChvcExpc3RQcm9taXNlcyk7CiAgICBsZXQgZm9ybSA9IGZhbHNlLAogICAgICBjYW52YXMgPSBmYWxzZTsKICAgIGZvciAoY29uc3QgewogICAgICBvcExpc3QsCiAgICAgIHNlcGFyYXRlRm9ybSwKICAgICAgc2VwYXJhdGVDYW52YXMKICAgIH0gb2Ygb3BMaXN0cykgewogICAgICBwYWdlT3BMaXN0LmFkZE9wTGlzdChvcExpc3QpOwogICAgICBmb3JtIHx8PSBzZXBhcmF0ZUZvcm07CiAgICAgIGNhbnZhcyB8fD0gc2VwYXJhdGVDYW52YXM7CiAgICB9CiAgICBwYWdlT3BMaXN0LmZsdXNoKHRydWUsIHsKICAgICAgZm9ybSwKICAgICAgY2FudmFzCiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIGxlbmd0aDogcGFnZU9wTGlzdC50b3RhbExlbmd0aAogICAgfTsKICB9CiAgYXN5bmMgZXh0cmFjdFRleHRDb250ZW50KHsKICAgIGhhbmRsZXIsCiAgICB0YXNrLAogICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICBkaXNhYmxlTm9ybWFsaXphdGlvbiwKICAgIHNpbmsKICB9KSB7CiAgICBjb25zdCBjb250ZW50U3RyZWFtUHJvbWlzZSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpOwogICAgY29uc3QgcmVzb3VyY2VzUHJvbWlzZSA9IHRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsICJGb250IiwgIlByb3BlcnRpZXMiLCAiWE9iamVjdCJdKTsKICAgIGNvbnN0IGxhbmdQcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImxhbmciKTsKICAgIGNvbnN0IFtjb250ZW50U3RyZWFtLCwgbGFuZ10gPSBhd2FpdCBQcm9taXNlLmFsbChbY29udGVudFN0cmVhbVByb21pc2UsIHJlc291cmNlc1Byb21pc2UsIGxhbmdQcm9taXNlXSk7CiAgICBjb25zdCBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IFBhcnRpYWxFdmFsdWF0b3IoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGhhbmRsZXIsCiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCiAgICAgIGlkRmFjdG9yeTogdGhpcy5fbG9jYWxJZEZhY3RvcnksCiAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsCiAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSwKICAgICAgc3RhbmRhcmRGb250RGF0YUNhY2hlOiB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgZ2xvYmFsQ29sb3JTcGFjZUNhY2hlOiB0aGlzLmdsb2JhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAogICAgICBzeXN0ZW1Gb250Q2FjaGU6IHRoaXMuc3lzdGVtRm9udENhY2hlLAogICAgICBvcHRpb25zOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMKICAgIH0pOwogICAgcmV0dXJuIHBhcnRpYWxFdmFsdWF0b3IuZ2V0VGV4dENvbnRlbnQoewogICAgICBzdHJlYW06IGNvbnRlbnRTdHJlYW0sCiAgICAgIHRhc2ssCiAgICAgIHJlc291cmNlczogdGhpcy5yZXNvdXJjZXMsCiAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50LAogICAgICBkaXNhYmxlTm9ybWFsaXphdGlvbiwKICAgICAgc2luaywKICAgICAgdmlld0JveDogdGhpcy52aWV3LAogICAgICBsYW5nCiAgICB9KTsKICB9CiAgYXN5bmMgZ2V0U3RydWN0VHJlZSgpIHsKICAgIGNvbnN0IHN0cnVjdFRyZWVSb290ID0gYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInN0cnVjdFRyZWVSb290Iik7CiAgICBpZiAoIXN0cnVjdFRyZWVSb290KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgYXdhaXQgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnM7CiAgICBjb25zdCBzdHJ1Y3RUcmVlID0gYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAiX3BhcnNlU3RydWN0VHJlZSIsIFtzdHJ1Y3RUcmVlUm9vdF0pOwogICAgcmV0dXJuIHRoaXMucGRmTWFuYWdlci5lbnN1cmUoc3RydWN0VHJlZSwgInNlcmlhbGl6YWJsZSIpOwogIH0KICBfcGFyc2VTdHJ1Y3RUcmVlKHN0cnVjdFRyZWVSb290KSB7CiAgICBjb25zdCB0cmVlID0gbmV3IFN0cnVjdFRyZWVQYWdlKHN0cnVjdFRyZWVSb290LCB0aGlzLnBhZ2VEaWN0KTsKICAgIHRyZWUucGFyc2UodGhpcy5yZWYpOwogICAgcmV0dXJuIHRyZWU7CiAgfQogIGFzeW5jIGdldEFubm90YXRpb25zRGF0YShoYW5kbGVyLCB0YXNrLCBpbnRlbnQpIHsKICAgIGNvbnN0IGFubm90YXRpb25zID0gYXdhaXQgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnM7CiAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKICAgIH0KICAgIGNvbnN0IGFubm90YXRpb25zRGF0YSA9IFtdLAogICAgICB0ZXh0Q29udGVudFByb21pc2VzID0gW107CiAgICBsZXQgcGFydGlhbEV2YWx1YXRvcjsKICAgIGNvbnN0IGludGVudEFueSA9ICEhKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuQU5ZKSwKICAgICAgaW50ZW50RGlzcGxheSA9ICEhKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksCiAgICAgIGludGVudFByaW50ID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCk7CiAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgY29uc3QgaXNWaXNpYmxlID0gaW50ZW50QW55IHx8IGludGVudERpc3BsYXkgJiYgYW5ub3RhdGlvbi52aWV3YWJsZTsKICAgICAgaWYgKGlzVmlzaWJsZSB8fCBpbnRlbnRQcmludCAmJiBhbm5vdGF0aW9uLnByaW50YWJsZSkgewogICAgICAgIGFubm90YXRpb25zRGF0YS5wdXNoKGFubm90YXRpb24uZGF0YSk7CiAgICAgIH0KICAgICAgaWYgKGFubm90YXRpb24uaGFzVGV4dENvbnRlbnQgJiYgaXNWaXNpYmxlKSB7CiAgICAgICAgcGFydGlhbEV2YWx1YXRvciB8fD0gbmV3IFBhcnRpYWxFdmFsdWF0b3IoewogICAgICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICAgICAgaGFuZGxlciwKICAgICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCiAgICAgICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKICAgICAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSwKICAgICAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgICAgICBnbG9iYWxDb2xvclNwYWNlQ2FjaGU6IHRoaXMuZ2xvYmFsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAogICAgICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucwogICAgICAgIH0pOwogICAgICAgIHRleHRDb250ZW50UHJvbWlzZXMucHVzaChhbm5vdGF0aW9uLmV4dHJhY3RUZXh0Q29udGVudChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBbLUluZmluaXR5LCAtSW5maW5pdHksIEluZmluaXR5LCBJbmZpbml0eV0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIHdhcm4oYGdldEFubm90YXRpb25zRGF0YSAtIGlnbm9yaW5nIHRleHRDb250ZW50IGR1cmluZyAiJHt0YXNrLm5hbWV9IiB0YXNrOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICB9KSk7CiAgICAgIH0KICAgIH0KICAgIGF3YWl0IFByb21pc2UuYWxsKHRleHRDb250ZW50UHJvbWlzZXMpOwogICAgcmV0dXJuIGFubm90YXRpb25zRGF0YTsKICB9CiAgZ2V0IGFubm90YXRpb25zKCkgewogICAgY29uc3QgYW5ub3RzID0gdGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSgiQW5ub3RzIik7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJhbm5vdGF0aW9ucyIsIEFycmF5LmlzQXJyYXkoYW5ub3RzKSA/IGFubm90cyA6IFtdKTsKICB9CiAgZ2V0IF9wYXJzZWRBbm5vdGF0aW9ucygpIHsKICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJhbm5vdGF0aW9ucyIpLnRoZW4oYXN5bmMgYW5ub3RzID0+IHsKICAgICAgaWYgKGFubm90cy5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gYW5ub3RzOwogICAgICB9CiAgICAgIGNvbnN0IFthbm5vdGF0aW9uR2xvYmFscywgZmllbGRPYmplY3RzXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJhbm5vdGF0aW9uR2xvYmFscyIpLCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJmaWVsZE9iamVjdHMiKV0pOwogICAgICBpZiAoIWFubm90YXRpb25HbG9iYWxzKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIGNvbnN0IG9ycGhhbkZpZWxkcyA9IGZpZWxkT2JqZWN0cz8ub3JwaGFuRmllbGRzOwogICAgICBjb25zdCBhbm5vdGF0aW9uUHJvbWlzZXMgPSBbXTsKICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uUmVmIG9mIGFubm90cykgewogICAgICAgIGFubm90YXRpb25Qcm9taXNlcy5wdXNoKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh0aGlzLnhyZWYsIGFubm90YXRpb25SZWYsIGFubm90YXRpb25HbG9iYWxzLCB0aGlzLl9sb2NhbElkRmFjdG9yeSwgZmFsc2UsIG9ycGhhbkZpZWxkcywgdGhpcy5yZWYpLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIHdhcm4oYF9wYXJzZWRBbm5vdGF0aW9uczogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgY29uc3Qgc29ydGVkQW5ub3RhdGlvbnMgPSBbXTsKICAgICAgbGV0IHBvcHVwQW5ub3RhdGlvbnMsIHdpZGdldEFubm90YXRpb25zOwogICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYXdhaXQgUHJvbWlzZS5hbGwoYW5ub3RhdGlvblByb21pc2VzKSkgewogICAgICAgIGlmICghYW5ub3RhdGlvbikgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgV2lkZ2V0QW5ub3RhdGlvbikgewogICAgICAgICAgKHdpZGdldEFubm90YXRpb25zIHx8PSBbXSkucHVzaChhbm5vdGF0aW9uKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFBvcHVwQW5ub3RhdGlvbikgewogICAgICAgICAgKHBvcHVwQW5ub3RhdGlvbnMgfHw9IFtdKS5wdXNoKGFubm90YXRpb24pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHNvcnRlZEFubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbik7CiAgICAgIH0KICAgICAgaWYgKHdpZGdldEFubm90YXRpb25zKSB7CiAgICAgICAgc29ydGVkQW5ub3RhdGlvbnMucHVzaCguLi53aWRnZXRBbm5vdGF0aW9ucyk7CiAgICAgIH0KICAgICAgaWYgKHBvcHVwQW5ub3RhdGlvbnMpIHsKICAgICAgICBzb3J0ZWRBbm5vdGF0aW9ucy5wdXNoKC4uLnBvcHVwQW5ub3RhdGlvbnMpOwogICAgICB9CiAgICAgIHJldHVybiBzb3J0ZWRBbm5vdGF0aW9uczsKICAgIH0pOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiX3BhcnNlZEFubm90YXRpb25zIiwgcHJvbWlzZSk7CiAgfQogIGdldCBqc0FjdGlvbnMoKSB7CiAgICBjb25zdCBhY3Rpb25zID0gY29sbGVjdEFjdGlvbnModGhpcy54cmVmLCB0aGlzLnBhZ2VEaWN0LCBQYWdlQWN0aW9uRXZlbnRUeXBlKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImpzQWN0aW9ucyIsIGFjdGlvbnMpOwogIH0KfQpjb25zdCBQREZfSEVBREVSX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFsweDI1LCAweDUwLCAweDQ0LCAweDQ2LCAweDJkXSk7CmNvbnN0IFNUQVJUWFJFRl9TSUdOQVRVUkUgPSBuZXcgVWludDhBcnJheShbMHg3MywgMHg3NCwgMHg2MSwgMHg3MiwgMHg3NCwgMHg3OCwgMHg3MiwgMHg2NSwgMHg2Nl0pOwpjb25zdCBFTkRPQkpfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjUsIDB4NmUsIDB4NjQsIDB4NmYsIDB4NjIsIDB4NmFdKTsKZnVuY3Rpb24gZmluZChzdHJlYW0sIHNpZ25hdHVyZSwgbGltaXQgPSAxMDI0LCBiYWNrd2FyZHMgPSBmYWxzZSkgewogIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CiAgY29uc3Qgc2NhbkJ5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhsaW1pdCk7CiAgY29uc3Qgc2Nhbkxlbmd0aCA9IHNjYW5CeXRlcy5sZW5ndGggLSBzaWduYXR1cmVMZW5ndGg7CiAgaWYgKHNjYW5MZW5ndGggPD0gMCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoYmFja3dhcmRzKSB7CiAgICBjb25zdCBzaWduYXR1cmVFbmQgPSBzaWduYXR1cmVMZW5ndGggLSAxOwogICAgbGV0IHBvcyA9IHNjYW5CeXRlcy5sZW5ndGggLSAxOwogICAgd2hpbGUgKHBvcyA+PSBzaWduYXR1cmVFbmQpIHsKICAgICAgbGV0IGogPSAwOwogICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzY2FuQnl0ZXNbcG9zIC0gal0gPT09IHNpZ25hdHVyZVtzaWduYXR1cmVFbmQgLSBqXSkgewogICAgICAgIGorKzsKICAgICAgfQogICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKICAgICAgICBzdHJlYW0ucG9zICs9IHBvcyAtIHNpZ25hdHVyZUVuZDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBwb3MtLTsKICAgIH0KICB9IGVsc2UgewogICAgbGV0IHBvcyA9IDA7CiAgICB3aGlsZSAocG9zIDw9IHNjYW5MZW5ndGgpIHsKICAgICAgbGV0IGogPSAwOwogICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzY2FuQnl0ZXNbcG9zICsgal0gPT09IHNpZ25hdHVyZVtqXSkgewogICAgICAgIGorKzsKICAgICAgfQogICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKICAgICAgICBzdHJlYW0ucG9zICs9IHBvczsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBwb3MrKzsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9CmNsYXNzIFBERkRvY3VtZW50IHsKICBjb25zdHJ1Y3RvcihwZGZNYW5hZ2VyLCBzdHJlYW0pIHsKICAgIGlmIChzdHJlYW0ubGVuZ3RoIDw9IDApIHsKICAgICAgdGhyb3cgbmV3IEludmFsaWRQREZFeGNlcHRpb24oIlRoZSBQREYgZmlsZSBpcyBlbXB0eSwgaS5lLiBpdHMgc2l6ZSBpcyB6ZXJvIGJ5dGVzLiIpOwogICAgfQogICAgdGhpcy5wZGZNYW5hZ2VyID0gcGRmTWFuYWdlcjsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy54cmVmID0gbmV3IFhSZWYoc3RyZWFtLCBwZGZNYW5hZ2VyKTsKICAgIHRoaXMuX3BhZ2VQcm9taXNlcyA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX3ZlcnNpb24gPSBudWxsOwogICAgY29uc3QgaWRDb3VudGVycyA9IHsKICAgICAgZm9udDogMAogICAgfTsKICAgIHRoaXMuX2dsb2JhbElkRmFjdG9yeSA9IGNsYXNzIHsKICAgICAgc3RhdGljIGdldERvY0lkKCkgewogICAgICAgIHJldHVybiBgZ18ke3BkZk1hbmFnZXIuZG9jSWR9YDsKICAgICAgfQogICAgICBzdGF0aWMgY3JlYXRlRm9udElkKCkgewogICAgICAgIHJldHVybiBgZiR7KytpZENvdW50ZXJzLmZvbnR9YDsKICAgICAgfQogICAgICBzdGF0aWMgY3JlYXRlT2JqSWQoKSB7CiAgICAgICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgY3JlYXRlT2JqSWRgIGNhbGxlZC4iKTsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0UGFnZU9iaklkKCkgewogICAgICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGdldFBhZ2VPYmpJZGAgY2FsbGVkLiIpOwogICAgICB9CiAgICB9OwogIH0KICBwYXJzZShyZWNvdmVyeU1vZGUpIHsKICAgIHRoaXMueHJlZi5wYXJzZShyZWNvdmVyeU1vZGUpOwogICAgdGhpcy5jYXRhbG9nID0gbmV3IENhdGFsb2codGhpcy5wZGZNYW5hZ2VyLCB0aGlzLnhyZWYpOwogIH0KICBnZXQgbGluZWFyaXphdGlvbigpIHsKICAgIGxldCBsaW5lYXJpemF0aW9uID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIGxpbmVhcml6YXRpb24gPSBMaW5lYXJpemF0aW9uLmNyZWF0ZSh0aGlzLnN0cmVhbSk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXJyOwogICAgICB9CiAgICAgIGluZm8oZXJyKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImxpbmVhcml6YXRpb24iLCBsaW5lYXJpemF0aW9uKTsKICB9CiAgZ2V0IHN0YXJ0WFJlZigpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOwogICAgbGV0IHN0YXJ0WFJlZiA9IDA7CiAgICBpZiAodGhpcy5saW5lYXJpemF0aW9uKSB7CiAgICAgIHN0cmVhbS5yZXNldCgpOwogICAgICBpZiAoZmluZChzdHJlYW0sIEVORE9CSl9TSUdOQVRVUkUpKSB7CiAgICAgICAgc3RyZWFtLnNraXAoNik7CiAgICAgICAgbGV0IGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICAgICAgd2hpbGUgKGlzV2hpdGVTcGFjZShjaCkpIHsKICAgICAgICAgIHN0cmVhbS5wb3MrKzsKICAgICAgICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICAgICAgfQogICAgICAgIHN0YXJ0WFJlZiA9IHN0cmVhbS5wb3MgLSBzdHJlYW0uc3RhcnQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0ZXAgPSAxMDI0OwogICAgICBjb25zdCBzdGFydFhSZWZMZW5ndGggPSBTVEFSVFhSRUZfU0lHTkFUVVJFLmxlbmd0aDsKICAgICAgbGV0IGZvdW5kID0gZmFsc2UsCiAgICAgICAgcG9zID0gc3RyZWFtLmVuZDsKICAgICAgd2hpbGUgKCFmb3VuZCAmJiBwb3MgPiAwKSB7CiAgICAgICAgcG9zIC09IHN0ZXAgLSBzdGFydFhSZWZMZW5ndGg7CiAgICAgICAgaWYgKHBvcyA8IDApIHsKICAgICAgICAgIHBvcyA9IDA7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5wb3MgPSBwb3M7CiAgICAgICAgZm91bmQgPSBmaW5kKHN0cmVhbSwgU1RBUlRYUkVGX1NJR05BVFVSRSwgc3RlcCwgdHJ1ZSk7CiAgICAgIH0KICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgc3RyZWFtLnNraXAoOSk7CiAgICAgICAgbGV0IGNoOwogICAgICAgIGRvIHsKICAgICAgICAgIGNoID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICB9IHdoaWxlIChpc1doaXRlU3BhY2UoY2gpKTsKICAgICAgICBsZXQgc3RyID0gIiI7CiAgICAgICAgd2hpbGUgKGNoID49IDB4MjAgJiYgY2ggPD0gMHgzOSkgewogICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICAgICAgY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICAgIH0KICAgICAgICBzdGFydFhSZWYgPSBwYXJzZUludChzdHIsIDEwKTsKICAgICAgICBpZiAoaXNOYU4oc3RhcnRYUmVmKSkgewogICAgICAgICAgc3RhcnRYUmVmID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInN0YXJ0WFJlZiIsIHN0YXJ0WFJlZik7CiAgfQogIGNoZWNrSGVhZGVyKCkgewogICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW07CiAgICBzdHJlYW0ucmVzZXQoKTsKICAgIGlmICghZmluZChzdHJlYW0sIFBERl9IRUFERVJfU0lHTkFUVVJFKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBzdHJlYW0ubW92ZVN0YXJ0KCk7CiAgICBzdHJlYW0uc2tpcChQREZfSEVBREVSX1NJR05BVFVSRS5sZW5ndGgpOwogICAgbGV0IHZlcnNpb24gPSAiIiwKICAgICAgY2g7CiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLmdldEJ5dGUoKSkgPiAweDIwICYmIHZlcnNpb24ubGVuZ3RoIDwgNykgewogICAgICB2ZXJzaW9uICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgfQogICAgaWYgKFBERl9WRVJTSU9OX1JFR0VYUC50ZXN0KHZlcnNpb24pKSB7CiAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uOwogICAgfSBlbHNlIHsKICAgICAgd2FybihgSW52YWxpZCBQREYgaGVhZGVyIHZlcnNpb246ICR7dmVyc2lvbn1gKTsKICAgIH0KICB9CiAgcGFyc2VTdGFydFhSZWYoKSB7CiAgICB0aGlzLnhyZWYuc2V0U3RhcnRYUmVmKHRoaXMuc3RhcnRYUmVmKTsKICB9CiAgZ2V0IG51bVBhZ2VzKCkgewogICAgbGV0IG51bSA9IDA7CiAgICBpZiAodGhpcy5jYXRhbG9nLmhhc0FjdHVhbE51bVBhZ2VzKSB7CiAgICAgIG51bSA9IHRoaXMuY2F0YWxvZy5udW1QYWdlczsKICAgIH0gZWxzZSBpZiAodGhpcy54ZmFGYWN0b3J5KSB7CiAgICAgIG51bSA9IHRoaXMueGZhRmFjdG9yeS5nZXROdW1QYWdlcygpOwogICAgfSBlbHNlIGlmICh0aGlzLmxpbmVhcml6YXRpb24pIHsKICAgICAgbnVtID0gdGhpcy5saW5lYXJpemF0aW9uLm51bVBhZ2VzOwogICAgfSBlbHNlIHsKICAgICAgbnVtID0gdGhpcy5jYXRhbG9nLm51bVBhZ2VzOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibnVtUGFnZXMiLCBudW0pOwogIH0KICBfaGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhmaWVsZHMsIHJlY3Vyc2lvbkRlcHRoID0gMCkgewogICAgY29uc3QgUkVDVVJTSU9OX0xJTUlUID0gMTA7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmllbGRzKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gZmllbGRzLmV2ZXJ5KGZpZWxkID0+IHsKICAgICAgZmllbGQgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWVsZCk7CiAgICAgIGlmICghKGZpZWxkIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGZpZWxkLmhhcygiS2lkcyIpKSB7CiAgICAgICAgaWYgKCsrcmVjdXJzaW9uRGVwdGggPiBSRUNVUlNJT05fTElNSVQpIHsKICAgICAgICAgIHdhcm4oIl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzOiBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCByZWFjaGVkIik7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGZpZWxkLmdldCgiS2lkcyIpLCByZWN1cnNpb25EZXB0aCk7CiAgICAgIH0KICAgICAgY29uc3QgaXNTaWduYXR1cmUgPSBpc05hbWUoZmllbGQuZ2V0KCJGVCIpLCAiU2lnIik7CiAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IGZpZWxkLmdldCgiUmVjdCIpOwogICAgICBjb25zdCBpc0ludmlzaWJsZSA9IEFycmF5LmlzQXJyYXkocmVjdGFuZ2xlKSAmJiByZWN0YW5nbGUuZXZlcnkodmFsdWUgPT4gdmFsdWUgPT09IDApOwogICAgICByZXR1cm4gaXNTaWduYXR1cmUgJiYgaXNJbnZpc2libGU7CiAgICB9KTsKICB9CiAgZ2V0IF94ZmFTdHJlYW1zKCkgewogICAgY29uc3QgYWNyb0Zvcm0gPSB0aGlzLmNhdGFsb2cuYWNyb0Zvcm07CiAgICBpZiAoIWFjcm9Gb3JtKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgeGZhID0gYWNyb0Zvcm0uZ2V0KCJYRkEiKTsKICAgIGNvbnN0IGVudHJpZXMgPSB7CiAgICAgICJ4ZHA6eGRwIjogIiIsCiAgICAgIHRlbXBsYXRlOiAiIiwKICAgICAgZGF0YXNldHM6ICIiLAogICAgICBjb25maWc6ICIiLAogICAgICBjb25uZWN0aW9uU2V0OiAiIiwKICAgICAgbG9jYWxlU2V0OiAiIiwKICAgICAgc3R5bGVzaGVldDogIiIsCiAgICAgICIveGRwOnhkcCI6ICIiCiAgICB9OwogICAgaWYgKHhmYSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gJiYgIXhmYS5pc0VtcHR5KSB7CiAgICAgIGVudHJpZXNbInhkcDp4ZHAiXSA9IHhmYTsKICAgICAgcmV0dXJuIGVudHJpZXM7CiAgICB9CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoeGZhKSB8fCB4ZmEubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0geGZhLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgbGV0IG5hbWU7CiAgICAgIGlmIChpID09PSAwKSB7CiAgICAgICAgbmFtZSA9ICJ4ZHA6eGRwIjsKICAgICAgfSBlbHNlIGlmIChpID09PSBpaSAtIDIpIHsKICAgICAgICBuYW1lID0gIi94ZHA6eGRwIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuYW1lID0geGZhW2ldOwogICAgICB9CiAgICAgIGlmICghZW50cmllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZih4ZmFbaSArIDFdKTsKICAgICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHx8IGRhdGEuaXNFbXB0eSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGVudHJpZXNbbmFtZV0gPSBkYXRhOwogICAgfQogICAgcmV0dXJuIGVudHJpZXM7CiAgfQogIGdldCB4ZmFEYXRhc2V0cygpIHsKICAgIGNvbnN0IHN0cmVhbXMgPSB0aGlzLl94ZmFTdHJlYW1zOwogICAgaWYgKCFzdHJlYW1zKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgInhmYURhdGFzZXRzIiwgbnVsbCk7CiAgICB9CiAgICBmb3IgKGNvbnN0IGtleSBvZiBbImRhdGFzZXRzIiwgInhkcDp4ZHAiXSkgewogICAgICBjb25zdCBzdHJlYW0gPSBzdHJlYW1zW2tleV07CiAgICAgIGlmICghc3RyZWFtKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBzdHIgPSBzdHJpbmdUb1VURjhTdHJpbmcoc3RyZWFtLmdldFN0cmluZygpKTsKICAgICAgICBjb25zdCBkYXRhID0gewogICAgICAgICAgW2tleV06IHN0cgogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAieGZhRGF0YXNldHMiLCBuZXcgRGF0YXNldFJlYWRlcihkYXRhKSk7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHdhcm4oIlhGQSAtIEludmFsaWQgdXRmLTggc3RyaW5nLiIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ4ZmFEYXRhc2V0cyIsIG51bGwpOwogIH0KICBnZXQgeGZhRGF0YSgpIHsKICAgIGNvbnN0IHN0cmVhbXMgPSB0aGlzLl94ZmFTdHJlYW1zOwogICAgaWYgKCFzdHJlYW1zKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgZGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmb3IgKGNvbnN0IFtrZXksIHN0cmVhbV0gb2YgT2JqZWN0LmVudHJpZXMoc3RyZWFtcykpIHsKICAgICAgaWYgKCFzdHJlYW0pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIGRhdGFba2V5XSA9IHN0cmluZ1RvVVRGOFN0cmluZyhzdHJlYW0uZ2V0U3RyaW5nKCkpOwogICAgICB9IGNhdGNoIHsKICAgICAgICB3YXJuKCJYRkEgLSBJbnZhbGlkIHV0Zi04IHN0cmluZy4iKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIGdldCB4ZmFGYWN0b3J5KCkgewogICAgbGV0IGRhdGE7CiAgICBpZiAodGhpcy5wZGZNYW5hZ2VyLmVuYWJsZVhmYSAmJiB0aGlzLmNhdGFsb2cubmVlZHNSZW5kZXJpbmcgJiYgdGhpcy5mb3JtSW5mby5oYXNYZmEgJiYgIXRoaXMuZm9ybUluZm8uaGFzQWNyb0Zvcm0pIHsKICAgICAgZGF0YSA9IHRoaXMueGZhRGF0YTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInhmYUZhY3RvcnkiLCBkYXRhID8gbmV3IFhGQUZhY3RvcnkoZGF0YSkgOiBudWxsKTsKICB9CiAgZ2V0IGlzUHVyZVhmYSgpIHsKICAgIHJldHVybiB0aGlzLnhmYUZhY3RvcnkgPyB0aGlzLnhmYUZhY3RvcnkuaXNWYWxpZCgpIDogZmFsc2U7CiAgfQogIGdldCBodG1sRm9yWGZhKCkgewogICAgcmV0dXJuIHRoaXMueGZhRmFjdG9yeSA/IHRoaXMueGZhRmFjdG9yeS5nZXRQYWdlcygpIDogbnVsbDsKICB9CiAgYXN5bmMgbG9hZFhmYUltYWdlcygpIHsKICAgIGNvbnN0IHhmYUltYWdlc0RpY3QgPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygieGZhSW1hZ2VzIik7CiAgICBpZiAoIXhmYUltYWdlc0RpY3QpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qga2V5cyA9IHhmYUltYWdlc0RpY3QuZ2V0S2V5cygpOwogICAgY29uc3Qgb2JqZWN0TG9hZGVyID0gbmV3IE9iamVjdExvYWRlcih4ZmFJbWFnZXNEaWN0LCBrZXlzLCB0aGlzLnhyZWYpOwogICAgYXdhaXQgb2JqZWN0TG9hZGVyLmxvYWQoKTsKICAgIGNvbnN0IHhmYUltYWdlcyA9IG5ldyBNYXAoKTsKICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHsKICAgICAgY29uc3Qgc3RyZWFtID0geGZhSW1hZ2VzRGljdC5nZXQoa2V5KTsKICAgICAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICB4ZmFJbWFnZXMuc2V0KGtleSwgc3RyZWFtLmdldEJ5dGVzKCkpOwogICAgICB9CiAgICB9CiAgICB0aGlzLnhmYUZhY3Rvcnkuc2V0SW1hZ2VzKHhmYUltYWdlcyk7CiAgfQogIGFzeW5jIGxvYWRYZmFGb250cyhoYW5kbGVyLCB0YXNrKSB7CiAgICBjb25zdCBhY3JvRm9ybSA9IGF3YWl0IHRoaXMucGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybSIpOwogICAgaWYgKCFhY3JvRm9ybSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCByZXNvdXJjZXMgPSBhd2FpdCBhY3JvRm9ybS5nZXRBc3luYygiRFIiKTsKICAgIGlmICghKHJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG9iamVjdExvYWRlciA9IG5ldyBPYmplY3RMb2FkZXIocmVzb3VyY2VzLCBbIkZvbnQiXSwgdGhpcy54cmVmKTsKICAgIGF3YWl0IG9iamVjdExvYWRlci5sb2FkKCk7CiAgICBjb25zdCBmb250UmVzID0gcmVzb3VyY2VzLmdldCgiRm9udCIpOwogICAgaWYgKCEoZm9udFJlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMucGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zKTsKICAgIG9wdGlvbnMudXNlU3lzdGVtRm9udHMgPSBmYWxzZTsKICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgUGFydGlhbEV2YWx1YXRvcih7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaGFuZGxlciwKICAgICAgcGFnZUluZGV4OiAtMSwKICAgICAgaWRGYWN0b3J5OiB0aGlzLl9nbG9iYWxJZEZhY3RvcnksCiAgICAgIGZvbnRDYWNoZTogdGhpcy5jYXRhbG9nLmZvbnRDYWNoZSwKICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5jYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5jYXRhbG9nLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgb3B0aW9ucwogICAgfSk7CiAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7CiAgICBjb25zdCBwZGZGb250cyA9IFtdOwogICAgY29uc3QgaW5pdGlhbFN0YXRlID0gewogICAgICBnZXQgZm9udCgpIHsKICAgICAgICByZXR1cm4gcGRmRm9udHMuYXQoLTEpOwogICAgICB9LAogICAgICBzZXQgZm9udChmb250KSB7CiAgICAgICAgcGRmRm9udHMucHVzaChmb250KTsKICAgICAgfSwKICAgICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCBwcm9taXNlcyA9IFtdOwogICAgZm9yIChjb25zdCBbZm9udE5hbWUsIGZvbnRdIG9mIGZvbnRSZXMpIHsKICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGZvbnQuZ2V0KCJGb250RGVzY3JpcHRvciIpOwogICAgICBpZiAoIShkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgZm9udEZhbWlseSA9IGRlc2NyaXB0b3IuZ2V0KCJGb250RmFtaWx5Iik7CiAgICAgIGZvbnRGYW1pbHkgPSBmb250RmFtaWx5LnJlcGxhY2VBbGwoL1sgXSsoXGQpL2csICIkMSIpOwogICAgICBjb25zdCBmb250V2VpZ2h0ID0gZGVzY3JpcHRvci5nZXQoIkZvbnRXZWlnaHQiKTsKICAgICAgY29uc3QgaXRhbGljQW5nbGUgPSAtZGVzY3JpcHRvci5nZXQoIkl0YWxpY0FuZ2xlIik7CiAgICAgIGNvbnN0IGNzc0ZvbnRJbmZvID0gewogICAgICAgIGZvbnRGYW1pbHksCiAgICAgICAgZm9udFdlaWdodCwKICAgICAgICBpdGFsaWNBbmdsZQogICAgICB9OwogICAgICBpZiAoIXZhbGlkYXRlQ1NTRm9udChjc3NGb250SW5mbykpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBwcm9taXNlcy5wdXNoKHBhcnRpYWxFdmFsdWF0b3IuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIFtOYW1lLmdldChmb250TmFtZSksIDFdLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIGluaXRpYWxTdGF0ZSwgbnVsbCwgY3NzRm9udEluZm8pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICB3YXJuKGBsb2FkWGZhRm9udHM6ICIke3JlYXNvbn0iLmApOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9KSk7CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICBjb25zdCBtaXNzaW5nRm9udHMgPSB0aGlzLnhmYUZhY3Rvcnkuc2V0Rm9udHMocGRmRm9udHMpOwogICAgaWYgKCFtaXNzaW5nRm9udHMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgb3B0aW9ucy5pZ25vcmVFcnJvcnMgPSB0cnVlOwogICAgcHJvbWlzZXMubGVuZ3RoID0gMDsKICAgIHBkZkZvbnRzLmxlbmd0aCA9IDA7CiAgICBjb25zdCByZWFsbHlNaXNzaW5nRm9udHMgPSBuZXcgU2V0KCk7CiAgICBmb3IgKGNvbnN0IG1pc3Npbmcgb2YgbWlzc2luZ0ZvbnRzKSB7CiAgICAgIGlmICghZ2V0WGZhRm9udE5hbWUoYCR7bWlzc2luZ30tUmVndWxhcmApKSB7CiAgICAgICAgcmVhbGx5TWlzc2luZ0ZvbnRzLmFkZChtaXNzaW5nKTsKICAgICAgfQogICAgfQogICAgaWYgKHJlYWxseU1pc3NpbmdGb250cy5zaXplKSB7CiAgICAgIG1pc3NpbmdGb250cy5wdXNoKCJQZGZKUy1GYWxsYmFjayIpOwogICAgfQogICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIG1pc3NpbmdGb250cykgewogICAgICBpZiAocmVhbGx5TWlzc2luZ0ZvbnRzLmhhcyhtaXNzaW5nKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgZm9udEluZm8gb2YgW3sKICAgICAgICBuYW1lOiAiUmVndWxhciIsCiAgICAgICAgZm9udFdlaWdodDogNDAwLAogICAgICAgIGl0YWxpY0FuZ2xlOiAwCiAgICAgIH0sIHsKICAgICAgICBuYW1lOiAiQm9sZCIsCiAgICAgICAgZm9udFdlaWdodDogNzAwLAogICAgICAgIGl0YWxpY0FuZ2xlOiAwCiAgICAgIH0sIHsKICAgICAgICBuYW1lOiAiSXRhbGljIiwKICAgICAgICBmb250V2VpZ2h0OiA0MDAsCiAgICAgICAgaXRhbGljQW5nbGU6IDEyCiAgICAgIH0sIHsKICAgICAgICBuYW1lOiAiQm9sZEl0YWxpYyIsCiAgICAgICAgZm9udFdlaWdodDogNzAwLAogICAgICAgIGl0YWxpY0FuZ2xlOiAxMgogICAgICB9XSkgewogICAgICAgIGNvbnN0IG5hbWUgPSBgJHttaXNzaW5nfS0ke2ZvbnRJbmZvLm5hbWV9YDsKICAgICAgICBjb25zdCBkaWN0ID0gZ2V0WGZhRm9udERpY3QobmFtZSk7CiAgICAgICAgcHJvbWlzZXMucHVzaChwYXJ0aWFsRXZhbHVhdG9yLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBbTmFtZS5nZXQobmFtZSksIDFdLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIGluaXRpYWxTdGF0ZSwgZGljdCwgewogICAgICAgICAgZm9udEZhbWlseTogbWlzc2luZywKICAgICAgICAgIGZvbnRXZWlnaHQ6IGZvbnRJbmZvLmZvbnRXZWlnaHQsCiAgICAgICAgICBpdGFsaWNBbmdsZTogZm9udEluZm8uaXRhbGljQW5nbGUKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICB3YXJuKGBsb2FkWGZhRm9udHM6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSkpOwogICAgICB9CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICB0aGlzLnhmYUZhY3RvcnkuYXBwZW5kRm9udHMocGRmRm9udHMsIHJlYWxseU1pc3NpbmdGb250cyk7CiAgfQogIGFzeW5jIHNlcmlhbGl6ZVhmYURhdGEoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIHJldHVybiB0aGlzLnhmYUZhY3RvcnkgPyB0aGlzLnhmYUZhY3Rvcnkuc2VyaWFsaXplRGF0YShhbm5vdGF0aW9uU3RvcmFnZSkgOiBudWxsOwogIH0KICBnZXQgdmVyc2lvbigpIHsKICAgIHJldHVybiB0aGlzLmNhdGFsb2cudmVyc2lvbiB8fCB0aGlzLl92ZXJzaW9uOwogIH0KICBnZXQgZm9ybUluZm8oKSB7CiAgICBjb25zdCBmb3JtSW5mbyA9IHsKICAgICAgaGFzRmllbGRzOiBmYWxzZSwKICAgICAgaGFzQWNyb0Zvcm06IGZhbHNlLAogICAgICBoYXNYZmE6IGZhbHNlLAogICAgICBoYXNTaWduYXR1cmVzOiBmYWxzZQogICAgfTsKICAgIGNvbnN0IGFjcm9Gb3JtID0gdGhpcy5jYXRhbG9nLmFjcm9Gb3JtOwogICAgaWYgKCFhY3JvRm9ybSkgewogICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmb3JtSW5mbyIsIGZvcm1JbmZvKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IGZpZWxkcyA9IGFjcm9Gb3JtLmdldCgiRmllbGRzIik7CiAgICAgIGNvbnN0IGhhc0ZpZWxkcyA9IEFycmF5LmlzQXJyYXkoZmllbGRzKSAmJiBmaWVsZHMubGVuZ3RoID4gMDsKICAgICAgZm9ybUluZm8uaGFzRmllbGRzID0gaGFzRmllbGRzOwogICAgICBjb25zdCB4ZmEgPSBhY3JvRm9ybS5nZXQoIlhGQSIpOwogICAgICBmb3JtSW5mby5oYXNYZmEgPSBBcnJheS5pc0FycmF5KHhmYSkgJiYgeGZhLmxlbmd0aCA+IDAgfHwgeGZhIGluc3RhbmNlb2YgQmFzZVN0cmVhbSAmJiAheGZhLmlzRW1wdHk7CiAgICAgIGNvbnN0IHNpZ0ZsYWdzID0gYWNyb0Zvcm0uZ2V0KCJTaWdGbGFncyIpOwogICAgICBjb25zdCBoYXNTaWduYXR1cmVzID0gISEoc2lnRmxhZ3MgJiAweDEpOwogICAgICBjb25zdCBoYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzID0gaGFzU2lnbmF0dXJlcyAmJiB0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGZpZWxkcyk7CiAgICAgIGZvcm1JbmZvLmhhc0Fjcm9Gb3JtID0gaGFzRmllbGRzICYmICFoYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzOwogICAgICBmb3JtSW5mby5oYXNTaWduYXR1cmVzID0gaGFzU2lnbmF0dXJlczsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgQ2Fubm90IGZldGNoIGZvcm0gaW5mb3JtYXRpb246ICIke2V4fSIuYCk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmb3JtSW5mbyIsIGZvcm1JbmZvKTsKICB9CiAgZ2V0IGRvY3VtZW50SW5mbygpIHsKICAgIGNvbnN0IGRvY0luZm8gPSB7CiAgICAgIFBERkZvcm1hdFZlcnNpb246IHRoaXMudmVyc2lvbiwKICAgICAgTGFuZ3VhZ2U6IHRoaXMuY2F0YWxvZy5sYW5nLAogICAgICBFbmNyeXB0RmlsdGVyTmFtZTogdGhpcy54cmVmLmVuY3J5cHQgPyB0aGlzLnhyZWYuZW5jcnlwdC5maWx0ZXJOYW1lIDogbnVsbCwKICAgICAgSXNMaW5lYXJpemVkOiAhIXRoaXMubGluZWFyaXphdGlvbiwKICAgICAgSXNBY3JvRm9ybVByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzQWNyb0Zvcm0sCiAgICAgIElzWEZBUHJlc2VudDogdGhpcy5mb3JtSW5mby5oYXNYZmEsCiAgICAgIElzQ29sbGVjdGlvblByZXNlbnQ6ICEhdGhpcy5jYXRhbG9nLmNvbGxlY3Rpb24sCiAgICAgIElzU2lnbmF0dXJlc1ByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzU2lnbmF0dXJlcwogICAgfTsKICAgIGxldCBpbmZvRGljdDsKICAgIHRyeSB7CiAgICAgIGluZm9EaWN0ID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJbmZvIik7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXJyOwogICAgICB9CiAgICAgIGluZm8oIlRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIik7CiAgICB9CiAgICBpZiAoIShpbmZvRGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgImRvY3VtZW50SW5mbyIsIGRvY0luZm8pOwogICAgfQogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5mb0RpY3QpIHsKICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICBjYXNlICJUaXRsZSI6CiAgICAgICAgY2FzZSAiQXV0aG9yIjoKICAgICAgICBjYXNlICJTdWJqZWN0IjoKICAgICAgICBjYXNlICJLZXl3b3JkcyI6CiAgICAgICAgY2FzZSAiQ3JlYXRvciI6CiAgICAgICAgY2FzZSAiUHJvZHVjZXIiOgogICAgICAgIGNhc2UgIkNyZWF0aW9uRGF0ZSI6CiAgICAgICAgY2FzZSAiTW9kRGF0ZSI6CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgICAgICAgICBkb2NJbmZvW2tleV0gPSBzdHJpbmdUb1BERlN0cmluZyh2YWx1ZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiVHJhcHBlZCI6CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgIGRvY0luZm9ba2V5XSA9IHZhbHVlOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBsZXQgY3VzdG9tVmFsdWU7CiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkgewogICAgICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgICAgIGN1c3RvbVZhbHVlID0gc3RyaW5nVG9QREZTdHJpbmcodmFsdWUpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgICBjYXNlICJib29sZWFuIjoKICAgICAgICAgICAgICBjdXN0b21WYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICAgIGN1c3RvbVZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGN1c3RvbVZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgd2FybihgQmFkIHZhbHVlLCBmb3IgY3VzdG9tIGtleSAiJHtrZXl9IiwgaW4gSW5mbzogJHt2YWx1ZX0uYCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFkb2NJbmZvLkN1c3RvbSkgewogICAgICAgICAgICBkb2NJbmZvLkN1c3RvbSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgICBkb2NJbmZvLkN1c3RvbVtrZXldID0gY3VzdG9tVmFsdWU7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB3YXJuKGBCYWQgdmFsdWUsIGZvciBrZXkgIiR7a2V5fSIsIGluIEluZm86ICR7dmFsdWV9LmApOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZG9jdW1lbnRJbmZvIiwgZG9jSW5mbyk7CiAgfQogIGdldCBmaW5nZXJwcmludHMoKSB7CiAgICBjb25zdCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyA9IDEwMjQ7CiAgICBjb25zdCBFTVBUWV9GSU5HRVJQUklOVCA9ICJceDAwIi5yZXBlYXQoMTYpOwogICAgZnVuY3Rpb24gdmFsaWRhdGUoZGF0YSkgewogICAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICYmIGRhdGEubGVuZ3RoID09PSAxNiAmJiBkYXRhICE9PSBFTVBUWV9GSU5HRVJQUklOVDsKICAgIH0KICAgIGNvbnN0IGlkID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJRCIpOwogICAgbGV0IGhhc2hPcmlnaW5hbCwgaGFzaE1vZGlmaWVkOwogICAgaWYgKEFycmF5LmlzQXJyYXkoaWQpICYmIHZhbGlkYXRlKGlkWzBdKSkgewogICAgICBoYXNoT3JpZ2luYWwgPSBzdHJpbmdUb0J5dGVzKGlkWzBdKTsKICAgICAgaWYgKGlkWzFdICE9PSBpZFswXSAmJiB2YWxpZGF0ZShpZFsxXSkpIHsKICAgICAgICBoYXNoTW9kaWZpZWQgPSBzdHJpbmdUb0J5dGVzKGlkWzFdKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaGFzaE9yaWdpbmFsID0gY2FsY3VsYXRlTUQ1KHRoaXMuc3RyZWFtLmdldEJ5dGVSYW5nZSgwLCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyksIDAsIEZJTkdFUlBSSU5UX0ZJUlNUX0JZVEVTKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImZpbmdlcnByaW50cyIsIFt0b0hleFV0aWwoaGFzaE9yaWdpbmFsKSwgaGFzaE1vZGlmaWVkID8gdG9IZXhVdGlsKGhhc2hNb2RpZmllZCkgOiBudWxsXSk7CiAgfQogIGFzeW5jIF9nZXRMaW5lYXJpemF0aW9uUGFnZShwYWdlSW5kZXgpIHsKICAgIGNvbnN0IHsKICAgICAgY2F0YWxvZywKICAgICAgbGluZWFyaXphdGlvbiwKICAgICAgeHJlZgogICAgfSA9IHRoaXM7CiAgICBjb25zdCByZWYgPSBSZWYuZ2V0KGxpbmVhcml6YXRpb24ub2JqZWN0TnVtYmVyRmlyc3QsIDApOwogICAgdHJ5IHsKICAgICAgY29uc3Qgb2JqID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKHJlZik7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgbGV0IHR5cGUgPSBvYmouZ2V0UmF3KCJUeXBlIik7CiAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChpc05hbWUodHlwZSwgIlBhZ2UiKSB8fCAhb2JqLmhhcygiVHlwZSIpICYmICFvYmouaGFzKCJLaWRzIikgJiYgb2JqLmhhcygiQ29udGVudHMiKSkgewogICAgICAgICAgaWYgKCFjYXRhbG9nLnBhZ2VLaWRzQ291bnRDYWNoZS5oYXMocmVmKSkgewogICAgICAgICAgICBjYXRhbG9nLnBhZ2VLaWRzQ291bnRDYWNoZS5wdXQocmVmLCAxKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghY2F0YWxvZy5wYWdlSW5kZXhDYWNoZS5oYXMocmVmKSkgewogICAgICAgICAgICBjYXRhbG9nLnBhZ2VJbmRleENhY2hlLnB1dChyZWYsIDApOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFtvYmosIHJlZl07CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVGhlIExpbmVhcml6YXRpb24gZGljdGlvbmFyeSBkb2Vzbid0IHBvaW50IHRvIGEgdmFsaWQgUGFnZSBkaWN0aW9uYXJ5LiIpOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYF9nZXRMaW5lYXJpemF0aW9uUGFnZTogIiR7cmVhc29uLm1lc3NhZ2V9Ii5gKTsKICAgICAgcmV0dXJuIGNhdGFsb2cuZ2V0UGFnZURpY3QocGFnZUluZGV4KTsKICAgIH0KICB9CiAgZ2V0UGFnZShwYWdlSW5kZXgpIHsKICAgIGNvbnN0IGNhY2hlZFByb21pc2UgPSB0aGlzLl9wYWdlUHJvbWlzZXMuZ2V0KHBhZ2VJbmRleCk7CiAgICBpZiAoY2FjaGVkUHJvbWlzZSkgewogICAgICByZXR1cm4gY2FjaGVkUHJvbWlzZTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgY2F0YWxvZywKICAgICAgbGluZWFyaXphdGlvbiwKICAgICAgeGZhRmFjdG9yeQogICAgfSA9IHRoaXM7CiAgICBsZXQgcHJvbWlzZTsKICAgIGlmICh4ZmFGYWN0b3J5KSB7CiAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoW0RpY3QuZW1wdHksIG51bGxdKTsKICAgIH0gZWxzZSBpZiAobGluZWFyaXphdGlvbj8ucGFnZUZpcnN0ID09PSBwYWdlSW5kZXgpIHsKICAgICAgcHJvbWlzZSA9IHRoaXMuX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleCk7CiAgICB9IGVsc2UgewogICAgICBwcm9taXNlID0gY2F0YWxvZy5nZXRQYWdlRGljdChwYWdlSW5kZXgpOwogICAgfQogICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoW3BhZ2VEaWN0LCByZWZdKSA9PiBuZXcgUGFnZSh7CiAgICAgIHBkZk1hbmFnZXI6IHRoaXMucGRmTWFuYWdlciwKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBwYWdlSW5kZXgsCiAgICAgIHBhZ2VEaWN0LAogICAgICByZWYsCiAgICAgIGdsb2JhbElkRmFjdG9yeTogdGhpcy5fZ2xvYmFsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IGNhdGFsb2cuZm9udENhY2hlLAogICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogY2F0YWxvZy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogY2F0YWxvZy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IGNhdGFsb2cuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgc3lzdGVtRm9udENhY2hlOiBjYXRhbG9nLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgbm9uQmxlbmRNb2Rlc1NldDogY2F0YWxvZy5ub25CbGVuZE1vZGVzU2V0LAogICAgICB4ZmFGYWN0b3J5CiAgICB9KSk7CiAgICB0aGlzLl9wYWdlUHJvbWlzZXMuc2V0KHBhZ2VJbmRleCwgcHJvbWlzZSk7CiAgICByZXR1cm4gcHJvbWlzZTsKICB9CiAgYXN5bmMgY2hlY2tGaXJzdFBhZ2UocmVjb3ZlcnlNb2RlID0gZmFsc2UpIHsKICAgIGlmIChyZWNvdmVyeU1vZGUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdHJ5IHsKICAgICAgYXdhaXQgdGhpcy5nZXRQYWdlKDApOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBYUmVmRW50cnlFeGNlcHRpb24pIHsKICAgICAgICB0aGlzLl9wYWdlUHJvbWlzZXMuZGVsZXRlKDApOwogICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cCgpOwogICAgICAgIHRocm93IG5ldyBYUmVmUGFyc2VFeGNlcHRpb24oKTsKICAgICAgfQogICAgfQogIH0KICBhc3luYyBjaGVja0xhc3RQYWdlKHJlY292ZXJ5TW9kZSA9IGZhbHNlKSB7CiAgICBjb25zdCB7CiAgICAgIGNhdGFsb2csCiAgICAgIHBkZk1hbmFnZXIKICAgIH0gPSB0aGlzOwogICAgY2F0YWxvZy5zZXRBY3R1YWxOdW1QYWdlcygpOwogICAgbGV0IG51bVBhZ2VzOwogICAgdHJ5IHsKICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3BkZk1hbmFnZXIuZW5zdXJlRG9jKCJ4ZmFGYWN0b3J5IiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJsaW5lYXJpemF0aW9uIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygibnVtUGFnZXMiKV0pOwogICAgICBpZiAodGhpcy54ZmFGYWN0b3J5KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgaWYgKHRoaXMubGluZWFyaXphdGlvbikgewogICAgICAgIG51bVBhZ2VzID0gdGhpcy5saW5lYXJpemF0aW9uLm51bVBhZ2VzOwogICAgICB9IGVsc2UgewogICAgICAgIG51bVBhZ2VzID0gY2F0YWxvZy5udW1QYWdlczsKICAgICAgfQogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtUGFnZXMpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYWdlIGNvdW50IGlzIG5vdCBhbiBpbnRlZ2VyLiIpOwogICAgICB9IGVsc2UgaWYgKG51bVBhZ2VzIDw9IDEpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYXdhaXQgdGhpcy5nZXRQYWdlKG51bVBhZ2VzIC0gMSk7CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgdGhpcy5fcGFnZVByb21pc2VzLmRlbGV0ZShudW1QYWdlcyAtIDEpOwogICAgICBhd2FpdCB0aGlzLmNsZWFudXAoKTsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFhSZWZFbnRyeUV4Y2VwdGlvbiAmJiAhcmVjb3ZlcnlNb2RlKSB7CiAgICAgICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpOwogICAgICB9CiAgICAgIHdhcm4oYGNoZWNrTGFzdFBhZ2UgLSBpbnZhbGlkIC9QYWdlcyB0cmVlIC9Db3VudDogJHtudW1QYWdlc30uYCk7CiAgICAgIGxldCBwYWdlc1RyZWU7CiAgICAgIHRyeSB7CiAgICAgICAgcGFnZXNUcmVlID0gYXdhaXQgY2F0YWxvZy5nZXRBbGxQYWdlRGljdHMocmVjb3ZlcnlNb2RlKTsKICAgICAgfSBjYXRjaCAocmVhc29uQWxsKSB7CiAgICAgICAgaWYgKHJlYXNvbkFsbCBpbnN0YW5jZW9mIFhSZWZFbnRyeUV4Y2VwdGlvbiAmJiAhcmVjb3ZlcnlNb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgWFJlZlBhcnNlRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgIGNhdGFsb2cuc2V0QWN0dWFsTnVtUGFnZXMoMSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgW3BhZ2VJbmRleCwgW3BhZ2VEaWN0LCByZWZdXSBvZiBwYWdlc1RyZWUpIHsKICAgICAgICBsZXQgcHJvbWlzZTsKICAgICAgICBpZiAocGFnZURpY3QgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVqZWN0KHBhZ2VEaWN0KTsKICAgICAgICAgIHByb21pc2UuY2F0Y2goKCkgPT4ge30pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG5ldyBQYWdlKHsKICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICAgICAgICBwYWdlSW5kZXgsCiAgICAgICAgICAgIHBhZ2VEaWN0LAogICAgICAgICAgICByZWYsCiAgICAgICAgICAgIGdsb2JhbElkRmFjdG9yeTogdGhpcy5fZ2xvYmFsSWRGYWN0b3J5LAogICAgICAgICAgICBmb250Q2FjaGU6IGNhdGFsb2cuZm9udENhY2hlLAogICAgICAgICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgICAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogY2F0YWxvZy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgICAgICAgIGdsb2JhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5nbG9iYWxDb2xvclNwYWNlQ2FjaGUsCiAgICAgICAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IGNhdGFsb2cuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgICAgICAgc3lzdGVtRm9udENhY2hlOiBjYXRhbG9nLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgICAgICAgbm9uQmxlbmRNb2Rlc1NldDogY2F0YWxvZy5ub25CbGVuZE1vZGVzU2V0LAogICAgICAgICAgICB4ZmFGYWN0b3J5OiBudWxsCiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BhZ2VQcm9taXNlcy5zZXQocGFnZUluZGV4LCBwcm9taXNlKTsKICAgICAgfQogICAgICBjYXRhbG9nLnNldEFjdHVhbE51bVBhZ2VzKHBhZ2VzVHJlZS5zaXplKTsKICAgIH0KICB9CiAgYXN5bmMgZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKSB7CiAgICBjb25zdCB7CiAgICAgIGNhdGFsb2csCiAgICAgIHBkZk1hbmFnZXIKICAgIH0gPSB0aGlzOwogICAgZm9yIChjb25zdCB0cmFuc2xhdGVkRm9udCBvZiBhd2FpdCBQcm9taXNlLmFsbChjYXRhbG9nLmZvbnRDYWNoZSkpIHsKICAgICAgaWYgKHRyYW5zbGF0ZWRGb250LmxvYWRlZE5hbWUgPT09IGlkKSB7CiAgICAgICAgdHJhbnNsYXRlZEZvbnQuZmFsbGJhY2soaGFuZGxlciwgcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICB9CiAgYXN5bmMgY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCA9IGZhbHNlKSB7CiAgICByZXR1cm4gdGhpcy5jYXRhbG9nID8gdGhpcy5jYXRhbG9nLmNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQpIDogY2xlYXJHbG9iYWxDYWNoZXMoKTsKICB9CiAgYXN5bmMgI2NvbGxlY3RGaWVsZE9iamVjdHMobmFtZSwgcGFyZW50UmVmLCBmaWVsZFJlZiwgcHJvbWlzZXMsIGFubm90YXRpb25HbG9iYWxzLCB2aXNpdGVkUmVmcywgb3JwaGFuRmllbGRzKSB7CiAgICBjb25zdCB7CiAgICAgIHhyZWYKICAgIH0gPSB0aGlzOwogICAgaWYgKCEoZmllbGRSZWYgaW5zdGFuY2VvZiBSZWYpIHx8IHZpc2l0ZWRSZWZzLmhhcyhmaWVsZFJlZikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmlzaXRlZFJlZnMucHV0KGZpZWxkUmVmKTsKICAgIGNvbnN0IGZpZWxkID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGZpZWxkUmVmKTsKICAgIGlmICghKGZpZWxkIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IHN1YnR5cGUgPSBhd2FpdCBmaWVsZC5nZXRBc3luYygiU3VidHlwZSIpOwogICAgc3VidHlwZSA9IHN1YnR5cGUgaW5zdGFuY2VvZiBOYW1lID8gc3VidHlwZS5uYW1lIDogbnVsbDsKICAgIHN3aXRjaCAoc3VidHlwZSkgewogICAgICBjYXNlICJMaW5rIjoKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZmllbGQuaGFzKCJUIikpIHsKICAgICAgY29uc3QgcGFydE5hbWUgPSBzdHJpbmdUb1BERlN0cmluZyhhd2FpdCBmaWVsZC5nZXRBc3luYygiVCIpKTsKICAgICAgbmFtZSA9IG5hbWUgPT09ICIiID8gcGFydE5hbWUgOiBgJHtuYW1lfS4ke3BhcnROYW1lfWA7CiAgICB9IGVsc2UgewogICAgICBsZXQgb2JqID0gZmllbGQ7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgb2JqID0gb2JqLmdldFJhdygiUGFyZW50IikgfHwgcGFyZW50UmVmOwogICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIGlmICh2aXNpdGVkUmVmcy5oYXMob2JqKSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIG9iaiA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyhvYmopOwogICAgICAgIH0KICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChvYmouaGFzKCJUIikpIHsKICAgICAgICAgIGNvbnN0IHBhcnROYW1lID0gc3RyaW5nVG9QREZTdHJpbmcoYXdhaXQgb2JqLmdldEFzeW5jKCJUIikpOwogICAgICAgICAgbmFtZSA9IG5hbWUgPT09ICIiID8gcGFydE5hbWUgOiBgJHtuYW1lfS4ke3BhcnROYW1lfWA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChwYXJlbnRSZWYgJiYgIWZpZWxkLmhhcygiUGFyZW50IikgJiYgaXNOYW1lKGZpZWxkLmdldCgiU3VidHlwZSIpLCAiV2lkZ2V0IikpIHsKICAgICAgb3JwaGFuRmllbGRzLnB1dChmaWVsZFJlZiwgcGFyZW50UmVmKTsKICAgIH0KICAgIGlmICghcHJvbWlzZXMuaGFzKG5hbWUpKSB7CiAgICAgIHByb21pc2VzLnNldChuYW1lLCBbXSk7CiAgICB9CiAgICBwcm9taXNlcy5nZXQobmFtZSkucHVzaChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgZmllbGRSZWYsIGFubm90YXRpb25HbG9iYWxzLCBudWxsLCB0cnVlLCBvcnBoYW5GaWVsZHMsIG51bGwpLnRoZW4oYW5ub3RhdGlvbiA9PiBhbm5vdGF0aW9uPy5nZXRGaWVsZE9iamVjdCgpKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgIHdhcm4oYCNjb2xsZWN0RmllbGRPYmplY3RzOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9KSk7CiAgICBpZiAoIWZpZWxkLmhhcygiS2lkcyIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGtpZHMgPSBhd2FpdCBmaWVsZC5nZXRBc3luYygiS2lkcyIpOwogICAgaWYgKEFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgIGF3YWl0IHRoaXMuI2NvbGxlY3RGaWVsZE9iamVjdHMobmFtZSwgZmllbGRSZWYsIGtpZCwgcHJvbWlzZXMsIGFubm90YXRpb25HbG9iYWxzLCB2aXNpdGVkUmVmcywgb3JwaGFuRmllbGRzKTsKICAgICAgfQogICAgfQogIH0KICBnZXQgZmllbGRPYmplY3RzKCkgewogICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmVEb2MoImZvcm1JbmZvIikudGhlbihhc3luYyBmb3JtSW5mbyA9PiB7CiAgICAgIGlmICghZm9ybUluZm8uaGFzRmllbGRzKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgW2Fubm90YXRpb25HbG9iYWxzLCBhY3JvRm9ybV0gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiYW5ub3RhdGlvbkdsb2JhbHMiKSwgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIildKTsKICAgICAgaWYgKCFhbm5vdGF0aW9uR2xvYmFscykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IHZpc2l0ZWRSZWZzID0gbmV3IFJlZlNldCgpOwogICAgICBjb25zdCBhbGxGaWVsZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBjb25zdCBmaWVsZFByb21pc2VzID0gbmV3IE1hcCgpOwogICAgICBjb25zdCBvcnBoYW5GaWVsZHMgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgICAgZm9yIChjb25zdCBmaWVsZFJlZiBvZiBhd2FpdCBhY3JvRm9ybS5nZXRBc3luYygiRmllbGRzIikpIHsKICAgICAgICBhd2FpdCB0aGlzLiNjb2xsZWN0RmllbGRPYmplY3RzKCIiLCBudWxsLCBmaWVsZFJlZiwgZmllbGRQcm9taXNlcywgYW5ub3RhdGlvbkdsb2JhbHMsIHZpc2l0ZWRSZWZzLCBvcnBoYW5GaWVsZHMpOwogICAgICB9CiAgICAgIGNvbnN0IGFsbFByb21pc2VzID0gW107CiAgICAgIGZvciAoY29uc3QgW25hbWUsIHByb21pc2VzXSBvZiBmaWVsZFByb21pc2VzKSB7CiAgICAgICAgYWxsUHJvbWlzZXMucHVzaChQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmaWVsZHMgPT4gewogICAgICAgICAgZmllbGRzID0gZmllbGRzLmZpbHRlcihmaWVsZCA9PiAhIWZpZWxkKTsKICAgICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBhbGxGaWVsZHNbbmFtZV0gPSBmaWVsZHM7CiAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFsbFByb21pc2VzKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBhbGxGaWVsZHM6IG9iamVjdFNpemUoYWxsRmllbGRzKSA+IDAgPyBhbGxGaWVsZHMgOiBudWxsLAogICAgICAgIG9ycGhhbkZpZWxkcwogICAgICB9OwogICAgfSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJmaWVsZE9iamVjdHMiLCBwcm9taXNlKTsKICB9CiAgZ2V0IGhhc0pTQWN0aW9ucygpIHsKICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJfcGFyc2VIYXNKU0FjdGlvbnMiKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImhhc0pTQWN0aW9ucyIsIHByb21pc2UpOwogIH0KICBhc3luYyBfcGFyc2VIYXNKU0FjdGlvbnMoKSB7CiAgICBjb25zdCBbY2F0YWxvZ0pzQWN0aW9ucywgZmllbGRPYmplY3RzXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIiksIHRoaXMucGRmTWFuYWdlci5lbnN1cmVEb2MoImZpZWxkT2JqZWN0cyIpXSk7CiAgICBpZiAoY2F0YWxvZ0pzQWN0aW9ucykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChmaWVsZE9iamVjdHM/LmFsbEZpZWxkcykgewogICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhmaWVsZE9iamVjdHMuYWxsRmllbGRzKS5zb21lKGZpZWxkT2JqZWN0ID0+IGZpZWxkT2JqZWN0LnNvbWUob2JqZWN0ID0+IG9iamVjdC5hY3Rpb25zICE9PSBudWxsKSk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGdldCBjYWxjdWxhdGlvbk9yZGVySWRzKCkgewogICAgY29uc3QgY2FsY3VsYXRpb25PcmRlciA9IHRoaXMuY2F0YWxvZy5hY3JvRm9ybT8uZ2V0KCJDTyIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KGNhbGN1bGF0aW9uT3JkZXIpIHx8IGNhbGN1bGF0aW9uT3JkZXIubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgImNhbGN1bGF0aW9uT3JkZXJJZHMiLCBudWxsKTsKICAgIH0KICAgIGNvbnN0IGlkcyA9IFtdOwogICAgZm9yIChjb25zdCBpZCBvZiBjYWxjdWxhdGlvbk9yZGVyKSB7CiAgICAgIGlmIChpZCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGlkcy5wdXNoKGlkLnRvU3RyaW5nKCkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjYWxjdWxhdGlvbk9yZGVySWRzIiwgaWRzLmxlbmd0aCA/IGlkcyA6IG51bGwpOwogIH0KICBnZXQgYW5ub3RhdGlvbkdsb2JhbHMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJhbm5vdGF0aW9uR2xvYmFscyIsIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUdsb2JhbHModGhpcy5wZGZNYW5hZ2VyKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9wZGZfbWFuYWdlci5qcwoKCgoKCgoKCgpmdW5jdGlvbiBwYXJzZURvY0Jhc2VVcmwodXJsKSB7CiAgaWYgKHVybCkgewogICAgY29uc3QgYWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCk7CiAgICBpZiAoYWJzb2x1dGVVcmwpIHsKICAgICAgcmV0dXJuIGFic29sdXRlVXJsLmhyZWY7CiAgICB9CiAgICB3YXJuKGBJbnZhbGlkIGFic29sdXRlIGRvY0Jhc2VVcmw6ICIke3VybH0iLmApOwogIH0KICByZXR1cm4gbnVsbDsKfQpjbGFzcyBCYXNlUGRmTWFuYWdlciB7CiAgY29uc3RydWN0b3IoewogICAgZG9jQmFzZVVybCwKICAgIGRvY0lkLAogICAgZW5hYmxlWGZhLAogICAgZXZhbHVhdG9yT3B0aW9ucywKICAgIGhhbmRsZXIsCiAgICBwYXNzd29yZAogIH0pIHsKICAgIHRoaXMuX2RvY0Jhc2VVcmwgPSBwYXJzZURvY0Jhc2VVcmwoZG9jQmFzZVVybCk7CiAgICB0aGlzLl9kb2NJZCA9IGRvY0lkOwogICAgdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZDsKICAgIHRoaXMuZW5hYmxlWGZhID0gZW5hYmxlWGZhOwogICAgZXZhbHVhdG9yT3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCAmJj0gRmVhdHVyZVRlc3QuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ7CiAgICBldmFsdWF0b3JPcHRpb25zLmlzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkICYmPSBGZWF0dXJlVGVzdC5pc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICAgIHRoaXMuZXZhbHVhdG9yT3B0aW9ucyA9IE9iamVjdC5mcmVlemUoZXZhbHVhdG9yT3B0aW9ucyk7CiAgICBJbWFnZVJlc2l6ZXIuc2V0T3B0aW9ucyhldmFsdWF0b3JPcHRpb25zKTsKICAgIEpwZWdTdHJlYW0uc2V0T3B0aW9ucyhldmFsdWF0b3JPcHRpb25zKTsKICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgIC4uLmV2YWx1YXRvck9wdGlvbnMsCiAgICAgIGhhbmRsZXIKICAgIH07CiAgICBKcHhJbWFnZS5zZXRPcHRpb25zKG9wdGlvbnMpOwogICAgSWNjQ29sb3JTcGFjZS5zZXRPcHRpb25zKG9wdGlvbnMpOwogICAgQ215a0lDQ0Jhc2VkQ1Muc2V0T3B0aW9ucyhvcHRpb25zKTsKICB9CiAgZ2V0IGRvY0lkKCkgewogICAgcmV0dXJuIHRoaXMuX2RvY0lkOwogIH0KICBnZXQgcGFzc3dvcmQoKSB7CiAgICByZXR1cm4gdGhpcy5fcGFzc3dvcmQ7CiAgfQogIGdldCBkb2NCYXNlVXJsKCkgewogICAgcmV0dXJuIHRoaXMuX2RvY0Jhc2VVcmw7CiAgfQogIGdldCBjYXRhbG9nKCkgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuY2F0YWxvZzsKICB9CiAgZW5zdXJlRG9jKHByb3AsIGFyZ3MpIHsKICAgIHJldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LCBwcm9wLCBhcmdzKTsKICB9CiAgZW5zdXJlWFJlZihwcm9wLCBhcmdzKSB7CiAgICByZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudC54cmVmLCBwcm9wLCBhcmdzKTsKICB9CiAgZW5zdXJlQ2F0YWxvZyhwcm9wLCBhcmdzKSB7CiAgICByZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudC5jYXRhbG9nLCBwcm9wLCBhcmdzKTsKICB9CiAgZ2V0UGFnZShwYWdlSW5kZXgpIHsKICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2UocGFnZUluZGV4KTsKICB9CiAgZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKSB7CiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5mb250RmFsbGJhY2soaWQsIGhhbmRsZXIpOwogIH0KICBsb2FkWGZhRm9udHMoaGFuZGxlciwgdGFzaykgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQubG9hZFhmYUZvbnRzKGhhbmRsZXIsIHRhc2spOwogIH0KICBsb2FkWGZhSW1hZ2VzKCkgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQubG9hZFhmYUltYWdlcygpOwogIH0KICBzZXJpYWxpemVYZmFEYXRhKGFubm90YXRpb25TdG9yYWdlKSB7CiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5zZXJpYWxpemVYZmFEYXRhKGFubm90YXRpb25TdG9yYWdlKTsKICB9CiAgY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCA9IGZhbHNlKSB7CiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5jbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkKTsKICB9CiAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZW5zdXJlYCBjYWxsZWQiKTsKICB9CiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYHJlcXVlc3RSYW5nZWAgY2FsbGVkIik7CiAgfQogIHJlcXVlc3RMb2FkZWRTdHJlYW0obm9GZXRjaCA9IGZhbHNlKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0TG9hZGVkU3RyZWFtYCBjYWxsZWQiKTsKICB9CiAgc2VuZFByb2dyZXNzaXZlRGF0YShjaHVuaykgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgc2VuZFByb2dyZXNzaXZlRGF0YWAgY2FsbGVkIik7CiAgfQogIHVwZGF0ZVBhc3N3b3JkKHBhc3N3b3JkKSB7CiAgICB0aGlzLl9wYXNzd29yZCA9IHBhc3N3b3JkOwogIH0KICB0ZXJtaW5hdGUocmVhc29uKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGB0ZXJtaW5hdGVgIGNhbGxlZCIpOwogIH0KfQpjbGFzcyBMb2NhbFBkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7CiAgY29uc3RydWN0b3IoYXJncykgewogICAgc3VwZXIoYXJncyk7CiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKGFyZ3Muc291cmNlKTsKICAgIHRoaXMucGRmRG9jdW1lbnQgPSBuZXcgUERGRG9jdW1lbnQodGhpcywgc3RyZWFtKTsKICAgIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoc3RyZWFtKTsKICB9CiAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgewogICAgY29uc3QgdmFsdWUgPSBvYmpbcHJvcF07CiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiB2YWx1ZS5hcHBseShvYmosIGFyZ3MpOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCkgewogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogIH0KICByZXF1ZXN0TG9hZGVkU3RyZWFtKG5vRmV0Y2ggPSBmYWxzZSkgewogICAgcmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2U7CiAgfQogIHRlcm1pbmF0ZShyZWFzb24pIHt9Cn0KY2xhc3MgTmV0d29ya1BkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7CiAgY29uc3RydWN0b3IoYXJncykgewogICAgc3VwZXIoYXJncyk7CiAgICB0aGlzLnN0cmVhbU1hbmFnZXIgPSBuZXcgQ2h1bmtlZFN0cmVhbU1hbmFnZXIoYXJncy5zb3VyY2UsIHsKICAgICAgbXNnSGFuZGxlcjogYXJncy5oYW5kbGVyLAogICAgICBsZW5ndGg6IGFyZ3MubGVuZ3RoLAogICAgICBkaXNhYmxlQXV0b0ZldGNoOiBhcmdzLmRpc2FibGVBdXRvRmV0Y2gsCiAgICAgIHJhbmdlQ2h1bmtTaXplOiBhcmdzLnJhbmdlQ2h1bmtTaXplCiAgICB9KTsKICAgIHRoaXMucGRmRG9jdW1lbnQgPSBuZXcgUERGRG9jdW1lbnQodGhpcywgdGhpcy5zdHJlYW1NYW5hZ2VyLmdldFN0cmVhbSgpKTsKICB9CiAgYXN5bmMgZW5zdXJlKG9iaiwgcHJvcCwgYXJncykgewogICAgdHJ5IHsKICAgICAgY29uc3QgdmFsdWUgPSBvYmpbcHJvcF07CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4gdmFsdWUuYXBwbHkob2JqLCBhcmdzKTsKICAgICAgfQogICAgICByZXR1cm4gdmFsdWU7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoIShleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSkgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdFJhbmdlKGV4LmJlZ2luLCBleC5lbmQpOwogICAgICByZXR1cm4gdGhpcy5lbnN1cmUob2JqLCBwcm9wLCBhcmdzKTsKICAgIH0KICB9CiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbU1hbmFnZXIucmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpOwogIH0KICByZXF1ZXN0TG9hZGVkU3RyZWFtKG5vRmV0Y2ggPSBmYWxzZSkgewogICAgcmV0dXJuIHRoaXMuc3RyZWFtTWFuYWdlci5yZXF1ZXN0QWxsQ2h1bmtzKG5vRmV0Y2gpOwogIH0KICBzZW5kUHJvZ3Jlc3NpdmVEYXRhKGNodW5rKSB7CiAgICB0aGlzLnN0cmVhbU1hbmFnZXIub25SZWNlaXZlRGF0YSh7CiAgICAgIGNodW5rCiAgICB9KTsKICB9CiAgdGVybWluYXRlKHJlYXNvbikgewogICAgdGhpcy5zdHJlYW1NYW5hZ2VyLmFib3J0KHJlYXNvbik7CiAgfQp9Cgo7Ly8gLi9zcmMvc2hhcmVkL21lc3NhZ2VfaGFuZGxlci5qcwoKY29uc3QgQ2FsbGJhY2tLaW5kID0gewogIERBVEE6IDEsCiAgRVJST1I6IDIKfTsKY29uc3QgU3RyZWFtS2luZCA9IHsKICBDQU5DRUw6IDEsCiAgQ0FOQ0VMX0NPTVBMRVRFOiAyLAogIENMT1NFOiAzLAogIEVOUVVFVUU6IDQsCiAgRVJST1I6IDUsCiAgUFVMTDogNiwKICBQVUxMX0NPTVBMRVRFOiA3LAogIFNUQVJUX0NPTVBMRVRFOiA4Cn07CmZ1bmN0aW9uIG9uRm4oKSB7fQpmdW5jdGlvbiB3cmFwUmVhc29uKGV4KSB7CiAgaWYgKGV4IGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24gfHwgZXggaW5zdGFuY2VvZiBJbnZhbGlkUERGRXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgUGFzc3dvcmRFeGNlcHRpb24gfHwgZXggaW5zdGFuY2VvZiBSZXNwb25zZUV4Y2VwdGlvbiB8fCBleCBpbnN0YW5jZW9mIFVua25vd25FcnJvckV4Y2VwdGlvbikgewogICAgcmV0dXJuIGV4OwogIH0KICBpZiAoIShleCBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiBleCA9PT0gIm9iamVjdCIgJiYgZXggIT09IG51bGwpKSB7CiAgICB1bnJlYWNoYWJsZSgnd3JhcFJlYXNvbjogRXhwZWN0ZWQgInJlYXNvbiIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nKTsKICB9CiAgc3dpdGNoIChleC5uYW1lKSB7CiAgICBjYXNlICJBYm9ydEV4Y2VwdGlvbiI6CiAgICAgIHJldHVybiBuZXcgQWJvcnRFeGNlcHRpb24oZXgubWVzc2FnZSk7CiAgICBjYXNlICJJbnZhbGlkUERGRXhjZXB0aW9uIjoKICAgICAgcmV0dXJuIG5ldyBJbnZhbGlkUERGRXhjZXB0aW9uKGV4Lm1lc3NhZ2UpOwogICAgY2FzZSAiUGFzc3dvcmRFeGNlcHRpb24iOgogICAgICByZXR1cm4gbmV3IFBhc3N3b3JkRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmNvZGUpOwogICAgY2FzZSAiUmVzcG9uc2VFeGNlcHRpb24iOgogICAgICByZXR1cm4gbmV3IFJlc3BvbnNlRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LnN0YXR1cywgZXgubWlzc2luZyk7CiAgICBjYXNlICJVbmtub3duRXJyb3JFeGNlcHRpb24iOgogICAgICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5kZXRhaWxzKTsKICB9CiAgcmV0dXJuIG5ldyBVbmtub3duRXJyb3JFeGNlcHRpb24oZXgubWVzc2FnZSwgZXgudG9TdHJpbmcoKSk7Cn0KY2xhc3MgTWVzc2FnZUhhbmRsZXIgewogICNtZXNzYWdlQUMgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgY29uc3RydWN0b3Ioc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgY29tT2JqKSB7CiAgICB0aGlzLnNvdXJjZU5hbWUgPSBzb3VyY2VOYW1lOwogICAgdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTsKICAgIHRoaXMuY29tT2JqID0gY29tT2JqOwogICAgdGhpcy5jYWxsYmFja0lkID0gMTsKICAgIHRoaXMuc3RyZWFtSWQgPSAxOwogICAgdGhpcy5zdHJlYW1TaW5rcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5hY3Rpb25IYW5kbGVyID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbU9iai5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgdGhpcy4jb25NZXNzYWdlLmJpbmQodGhpcyksIHsKICAgICAgc2lnbmFsOiB0aGlzLiNtZXNzYWdlQUMuc2lnbmFsCiAgICB9KTsKICB9CiAgI29uTWVzc2FnZSh7CiAgICBkYXRhCiAgfSkgewogICAgaWYgKGRhdGEudGFyZ2V0TmFtZSAhPT0gdGhpcy5zb3VyY2VOYW1lKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChkYXRhLnN0cmVhbSkgewogICAgICB0aGlzLiNwcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRhdGEuY2FsbGJhY2spIHsKICAgICAgY29uc3QgY2FsbGJhY2tJZCA9IGRhdGEuY2FsbGJhY2tJZDsKICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07CiAgICAgIGlmICghY2FwYWJpbGl0eSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgJHtjYWxsYmFja0lkfWApOwogICAgICB9CiAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdOwogICAgICBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkRBVEEpIHsKICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoZGF0YS5kYXRhKTsKICAgICAgfSBlbHNlIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuRVJST1IpIHsKICAgICAgICBjYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2UiKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dOwogICAgaWYgKCFhY3Rpb24pIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogJHtkYXRhLmFjdGlvbn1gKTsKICAgIH0KICAgIGlmIChkYXRhLmNhbGxiYWNrSWQpIHsKICAgICAgY29uc3Qgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSwKICAgICAgICB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lLAogICAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgICBQcm9taXNlLnRyeShhY3Rpb24sIGRhdGEuZGF0YSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5EQVRBLAogICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLAogICAgICAgICAgZGF0YTogcmVzdWx0CiAgICAgICAgfSk7CiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkVSUk9SLAogICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLAogICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChkYXRhLnN0cmVhbUlkKSB7CiAgICAgIHRoaXMuI2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGFjdGlvbihkYXRhLmRhdGEpOwogIH0KICBvbihhY3Rpb25OYW1lLCBoYW5kbGVyKSB7CiAgICBjb25zdCBhaCA9IHRoaXMuYWN0aW9uSGFuZGxlcjsKICAgIGlmIChhaFthY3Rpb25OYW1lXSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgIiR7YWN0aW9uTmFtZX0iYCk7CiAgICB9CiAgICBhaFthY3Rpb25OYW1lXSA9IGhhbmRsZXI7CiAgfQogIHNlbmQoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7CiAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSwKICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLAogICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCiAgICAgIGRhdGEKICAgIH0sIHRyYW5zZmVycyk7CiAgfQogIHNlbmRXaXRoUHJvbWlzZShhY3Rpb25OYW1lLCBkYXRhLCB0cmFuc2ZlcnMpIHsKICAgIGNvbnN0IGNhbGxiYWNrSWQgPSB0aGlzLmNhbGxiYWNrSWQrKzsKICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTsKICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF0gPSBjYXBhYmlsaXR5OwogICAgdHJ5IHsKICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgIHNvdXJjZU5hbWU6IHRoaXMuc291cmNlTmFtZSwKICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsCiAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLAogICAgICAgIGNhbGxiYWNrSWQsCiAgICAgICAgZGF0YQogICAgICB9LCB0cmFuc2ZlcnMpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgY2FwYWJpbGl0eS5yZWplY3QoZXgpOwogICAgfQogICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTsKICB9CiAgc2VuZFdpdGhTdHJlYW0oYWN0aW9uTmFtZSwgZGF0YSwgcXVldWVpbmdTdHJhdGVneSwgdHJhbnNmZXJzKSB7CiAgICBjb25zdCBzdHJlYW1JZCA9IHRoaXMuc3RyZWFtSWQrKywKICAgICAgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSwKICAgICAgdGFyZ2V0TmFtZSA9IHRoaXMudGFyZ2V0TmFtZSwKICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7CiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHsKICAgICAgc3RhcnQ6IGNvbnRyb2xsZXIgPT4gewogICAgICAgIGNvbnN0IHN0YXJ0Q2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdID0gewogICAgICAgICAgY29udHJvbGxlciwKICAgICAgICAgIHN0YXJ0Q2FsbDogc3RhcnRDYXBhYmlsaXR5LAogICAgICAgICAgcHVsbENhbGw6IG51bGwsCiAgICAgICAgICBjYW5jZWxDYWxsOiBudWxsLAogICAgICAgICAgaXNDbG9zZWQ6IGZhbHNlCiAgICAgICAgfTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCiAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgIGRhdGEsCiAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZQogICAgICAgIH0sIHRyYW5zZmVycyk7CiAgICAgICAgcmV0dXJuIHN0YXJ0Q2FwYWJpbGl0eS5wcm9taXNlOwogICAgICB9LAogICAgICBwdWxsOiBjb250cm9sbGVyID0+IHsKICAgICAgICBjb25zdCBwdWxsQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLnB1bGxDYWxsID0gcHVsbENhcGFiaWxpdHk7CiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTEwsCiAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHB1bGxDYXBhYmlsaXR5LnByb21pc2U7CiAgICAgIH0sCiAgICAgIGNhbmNlbDogcmVhc29uID0+IHsKICAgICAgICBhc3NlcnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsICJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7CiAgICAgICAgY29uc3QgY2FuY2VsQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwgPSBjYW5jZWxDYXBhYmlsaXR5OwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMLAogICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBjYW5jZWxDYXBhYmlsaXR5LnByb21pc2U7CiAgICAgIH0KICAgIH0sIHF1ZXVlaW5nU3RyYXRlZ3kpOwogIH0KICAjY3JlYXRlU3RyZWFtU2luayhkYXRhKSB7CiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsCiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsCiAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsCiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgY29uc3Qgc2VsZiA9IHRoaXMsCiAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07CiAgICBjb25zdCBzdHJlYW1TaW5rID0gewogICAgICBlbnF1ZXVlKGNodW5rLCBzaXplID0gMSwgdHJhbnNmZXJzKSB7CiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFzdERlc2lyZWRTaXplID0gdGhpcy5kZXNpcmVkU2l6ZTsKICAgICAgICB0aGlzLmRlc2lyZWRTaXplIC09IHNpemU7CiAgICAgICAgaWYgKGxhc3REZXNpcmVkU2l6ZSA+IDAgJiYgdGhpcy5kZXNpcmVkU2l6ZSA8PSAwKSB7CiAgICAgICAgICB0aGlzLnNpbmtDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgICAgIH0KICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRU5RVUVVRSwKICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgY2h1bmsKICAgICAgICB9LCB0cmFuc2ZlcnMpOwogICAgICB9LAogICAgICBjbG9zZSgpIHsKICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0xPU0UsCiAgICAgICAgICBzdHJlYW1JZAogICAgICAgIH0pOwogICAgICAgIGRlbGV0ZSBzZWxmLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTsKICAgICAgfSwKICAgICAgZXJyb3IocmVhc29uKSB7CiAgICAgICAgYXNzZXJ0KHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCAiZXJyb3IgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7CiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7CiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVSUk9SLAogICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgIH0pOwogICAgICB9LAogICAgICBzaW5rQ2FwYWJpbGl0eTogUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCksCiAgICAgIG9uUHVsbDogbnVsbCwKICAgICAgb25DYW5jZWw6IG51bGwsCiAgICAgIGlzQ2FuY2VsbGVkOiBmYWxzZSwKICAgICAgZGVzaXJlZFNpemU6IGRhdGEuZGVzaXJlZFNpemUsCiAgICAgIHJlYWR5OiBudWxsCiAgICB9OwogICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CiAgICBzdHJlYW1TaW5rLnJlYWR5ID0gc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0gPSBzdHJlYW1TaW5rOwogICAgUHJvbWlzZS50cnkoYWN0aW9uLCBkYXRhLmRhdGEsIHN0cmVhbVNpbmspLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsCiAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgc3VjY2VzczogdHJ1ZQogICAgICB9KTsKICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLAogICAgICAgIHN0cmVhbUlkLAogICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCiAgICAgIH0pOwogICAgfSk7CiAgfQogICNwcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKSB7CiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsCiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsCiAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsCiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgY29uc3Qgc3RyZWFtQ29udHJvbGxlciA9IHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLAogICAgICBzdHJlYW1TaW5rID0gdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07CiAgICBzd2l0Y2ggKGRhdGEuc3RyZWFtKSB7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURToKICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7CiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnN0YXJ0Q2FsbC5yZXNvbHZlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURToKICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7CiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlc29sdmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5wdWxsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTEw6CiAgICAgICAgaWYgKCFzdHJlYW1TaW5rKSB7CiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKICAgICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1TaW5rLmRlc2lyZWRTaXplIDw9IDAgJiYgZGF0YS5kZXNpcmVkU2l6ZSA+IDApIHsKICAgICAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgICBzdHJlYW1TaW5rLmRlc2lyZWRTaXplID0gZGF0YS5kZXNpcmVkU2l6ZTsKICAgICAgICBQcm9taXNlLnRyeShzdHJlYW1TaW5rLm9uUHVsbCB8fCBvbkZuKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLAogICAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgICAgc3VjY2VzczogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsCiAgICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5FTlFVRVVFOgogICAgICAgIGFzc2VydChzdHJlYW1Db250cm9sbGVyLCAiZW5xdWV1ZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOwogICAgICAgIGlmIChzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jb250cm9sbGVyLmVucXVldWUoZGF0YS5jaHVuayk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5DTE9TRToKICAgICAgICBhc3NlcnQoc3RyZWFtQ29udHJvbGxlciwgImNsb3NlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7CiAgICAgICAgaWYgKHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLkVSUk9SOgogICAgICAgIGFzc2VydChzdHJlYW1Db250cm9sbGVyLCAiZXJyb3Igc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTsKICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOwogICAgICAgIHRoaXMuI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFOgogICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbC5yZXNvbHZlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOwogICAgICAgIH0KICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTDoKICAgICAgICBpZiAoIXN0cmVhbVNpbmspIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjb25zdCBkYXRhUmVhc29uID0gd3JhcFJlYXNvbihkYXRhLnJlYXNvbik7CiAgICAgICAgUHJvbWlzZS50cnkoc3RyZWFtU2luay5vbkNhbmNlbCB8fCBvbkZuLCBkYXRhUmVhc29uKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsCiAgICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgICBzdWNjZXNzOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLAogICAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVqZWN0KGRhdGFSZWFzb24pOwogICAgICAgIHN0cmVhbVNpbmsuaXNDYW5jZWxsZWQgPSB0cnVlOwogICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2UiKTsKICAgIH0KICB9CiAgYXN5bmMgI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpIHsKICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbc3RyZWFtQ29udHJvbGxlci5zdGFydENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIucHVsbENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbD8ucHJvbWlzZV0pOwogICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdOwogIH0KICBkZXN0cm95KCkgewogICAgdGhpcy4jbWVzc2FnZUFDPy5hYm9ydCgpOwogICAgdGhpcy4jbWVzc2FnZUFDID0gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3dyaXRlci5qcwoKCgoKCgoKYXN5bmMgZnVuY3Rpb24gd3JpdGVPYmplY3QocmVmLCBvYmosIGJ1ZmZlciwgewogIGVuY3J5cHQgPSBudWxsCn0pIHsKICBjb25zdCB0cmFuc2Zvcm0gPSBlbmNyeXB0Py5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0ocmVmLm51bSwgcmVmLmdlbik7CiAgYnVmZmVyLnB1c2goYCR7cmVmLm51bX0gJHtyZWYuZ2VufSBvYmpcbmApOwogIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBhd2FpdCB3cml0ZURpY3Qob2JqLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICBhd2FpdCB3cml0ZVN0cmVhbShvYmosIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKSkgewogICAgYXdhaXQgd3JpdGVBcnJheShvYmosIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICB9CiAgYnVmZmVyLnB1c2goIlxuZW5kb2JqXG4iKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZURpY3QoZGljdCwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBidWZmZXIucHVzaCgiPDwiKTsKICBmb3IgKGNvbnN0IGtleSBvZiBkaWN0LmdldEtleXMoKSkgewogICAgYnVmZmVyLnB1c2goYCAvJHtlc2NhcGVQREZOYW1lKGtleSl9IGApOwogICAgYXdhaXQgd3JpdGVWYWx1ZShkaWN0LmdldFJhdyhrZXkpLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfQogIGJ1ZmZlci5wdXNoKCI+PiIpOwp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlU3RyZWFtKHN0cmVhbSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBsZXQgYnl0ZXMgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKICBjb25zdCB7CiAgICBkaWN0CiAgfSA9IHN0cmVhbTsKICBjb25zdCBbZmlsdGVyLCBwYXJhbXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2RpY3QuZ2V0QXN5bmMoIkZpbHRlciIpLCBkaWN0LmdldEFzeW5jKCJEZWNvZGVQYXJtcyIpXSk7CiAgY29uc3QgZmlsdGVyWmVybyA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IGF3YWl0IGRpY3QueHJlZi5mZXRjaElmUmVmQXN5bmMoZmlsdGVyWzBdKSA6IGZpbHRlcjsKICBjb25zdCBpc0ZpbHRlclplcm9GbGF0ZURlY29kZSA9IGlzTmFtZShmaWx0ZXJaZXJvLCAiRmxhdGVEZWNvZGUiKTsKICBjb25zdCBNSU5fTEVOR1RIX0ZPUl9DT01QUkVTU0lORyA9IDI1NjsKICBpZiAoYnl0ZXMubGVuZ3RoID49IE1JTl9MRU5HVEhfRk9SX0NPTVBSRVNTSU5HIHx8IGlzRmlsdGVyWmVyb0ZsYXRlRGVjb2RlKSB7CiAgICB0cnkgewogICAgICBjb25zdCBjcyA9IG5ldyBDb21wcmVzc2lvblN0cmVhbSgiZGVmbGF0ZSIpOwogICAgICBjb25zdCB3cml0ZXIgPSBjcy53cml0YWJsZS5nZXRXcml0ZXIoKTsKICAgICAgYXdhaXQgd3JpdGVyLnJlYWR5OwogICAgICB3cml0ZXIud3JpdGUoYnl0ZXMpLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICAgIGF3YWl0IHdyaXRlci5yZWFkeTsKICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTsKICAgICAgfSkuY2F0Y2goKCkgPT4ge30pOwogICAgICBjb25zdCBidWYgPSBhd2FpdCBuZXcgUmVzcG9uc2UoY3MucmVhZGFibGUpLmFycmF5QnVmZmVyKCk7CiAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKICAgICAgbGV0IG5ld0ZpbHRlciwgbmV3UGFyYW1zOwogICAgICBpZiAoIWZpbHRlcikgewogICAgICAgIG5ld0ZpbHRlciA9IE5hbWUuZ2V0KCJGbGF0ZURlY29kZSIpOwogICAgICB9IGVsc2UgaWYgKCFpc0ZpbHRlclplcm9GbGF0ZURlY29kZSkgewogICAgICAgIG5ld0ZpbHRlciA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IFtOYW1lLmdldCgiRmxhdGVEZWNvZGUiKSwgLi4uZmlsdGVyXSA6IFtOYW1lLmdldCgiRmxhdGVEZWNvZGUiKSwgZmlsdGVyXTsKICAgICAgICBpZiAocGFyYW1zKSB7CiAgICAgICAgICBuZXdQYXJhbXMgPSBBcnJheS5pc0FycmF5KHBhcmFtcykgPyBbbnVsbCwgLi4ucGFyYW1zXSA6IFtudWxsLCBwYXJhbXNdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobmV3RmlsdGVyKSB7CiAgICAgICAgZGljdC5zZXQoIkZpbHRlciIsIG5ld0ZpbHRlcik7CiAgICAgIH0KICAgICAgaWYgKG5ld1BhcmFtcykgewogICAgICAgIGRpY3Quc2V0KCJEZWNvZGVQYXJtcyIsIG5ld1BhcmFtcyk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGluZm8oYHdyaXRlU3RyZWFtIC0gY2Fubm90IGNvbXByZXNzIGRhdGE6ICIke2V4fSIuYCk7CiAgICB9CiAgfQogIGxldCBzdHJpbmcgPSBieXRlc1RvU3RyaW5nKGJ5dGVzKTsKICBpZiAodHJhbnNmb3JtKSB7CiAgICBzdHJpbmcgPSB0cmFuc2Zvcm0uZW5jcnlwdFN0cmluZyhzdHJpbmcpOwogIH0KICBkaWN0LnNldCgiTGVuZ3RoIiwgc3RyaW5nLmxlbmd0aCk7CiAgYXdhaXQgd3JpdGVEaWN0KGRpY3QsIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICBidWZmZXIucHVzaCgiIHN0cmVhbVxuIiwgc3RyaW5nLCAiXG5lbmRzdHJlYW0iKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZUFycmF5KGFycmF5LCBidWZmZXIsIHRyYW5zZm9ybSkgewogIGJ1ZmZlci5wdXNoKCJbIik7CiAgbGV0IGZpcnN0ID0gdHJ1ZTsKICBmb3IgKGNvbnN0IHZhbCBvZiBhcnJheSkgewogICAgaWYgKCFmaXJzdCkgewogICAgICBidWZmZXIucHVzaCgiICIpOwogICAgfSBlbHNlIHsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIGF3YWl0IHdyaXRlVmFsdWUodmFsLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfQogIGJ1ZmZlci5wdXNoKCJdIik7Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVWYWx1ZSh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICBidWZmZXIucHVzaChgLyR7ZXNjYXBlUERGTmFtZSh2YWx1ZS5uYW1lKX1gKTsKICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmKSB7CiAgICBidWZmZXIucHVzaChgJHt2YWx1ZS5udW19ICR7dmFsdWUuZ2VufSBSYCk7CiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7CiAgICBhd2FpdCB3cml0ZUFycmF5KHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICBpZiAodHJhbnNmb3JtKSB7CiAgICAgIHZhbHVlID0gdHJhbnNmb3JtLmVuY3J5cHRTdHJpbmcodmFsdWUpOwogICAgfQogICAgYnVmZmVyLnB1c2goYCgke2VzY2FwZVN0cmluZyh2YWx1ZSl9KWApOwogIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAibnVtYmVyIikgewogICAgYnVmZmVyLnB1c2gobnVtYmVyVG9TdHJpbmcodmFsdWUpKTsKICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImJvb2xlYW4iKSB7CiAgICBidWZmZXIucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGljdCkgewogICAgYXdhaXQgd3JpdGVEaWN0KHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgIGF3YWl0IHdyaXRlU3RyZWFtKHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCkgewogICAgYnVmZmVyLnB1c2goIm51bGwiKTsKICB9IGVsc2UgewogICAgd2FybihgVW5oYW5kbGVkIHZhbHVlIGluIHdyaXRlcjogJHt0eXBlb2YgdmFsdWV9LCBwbGVhc2UgZmlsZSBhIGJ1Zy5gKTsKICB9Cn0KZnVuY3Rpb24gd3JpdGVJbnQobnVtYmVyLCBzaXplLCBvZmZzZXQsIGJ1ZmZlcikgewogIGZvciAobGV0IGkgPSBzaXplICsgb2Zmc2V0IC0gMTsgaSA+IG9mZnNldCAtIDE7IGktLSkgewogICAgYnVmZmVyW2ldID0gbnVtYmVyICYgMHhmZjsKICAgIG51bWJlciA+Pj0gODsKICB9CiAgcmV0dXJuIG9mZnNldCArIHNpemU7Cn0KZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyaW5nLCBvZmZzZXQsIGJ1ZmZlcikgewogIGNvbnN0IGlpID0gc3RyaW5nLmxlbmd0aDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGlpOyBpKyspIHsKICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IHN0cmluZy5jaGFyQ29kZUF0KGkpICYgMHhmZjsKICB9CiAgcmV0dXJuIG9mZnNldCArIGlpOwp9CmZ1bmN0aW9uIGNvbXB1dGVNRDUoZmlsZXNpemUsIHhyZWZJbmZvKSB7CiAgY29uc3QgdGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApOwogIGNvbnN0IGZpbGVuYW1lID0geHJlZkluZm8uZmlsZW5hbWUgfHwgIiI7CiAgY29uc3QgbWQ1QnVmZmVyID0gW3RpbWUudG9TdHJpbmcoKSwgZmlsZW5hbWUsIGZpbGVzaXplLnRvU3RyaW5nKCksIC4uLk9iamVjdC52YWx1ZXMoeHJlZkluZm8uaW5mbyldOwogIGNvbnN0IG1kNUJ1ZmZlckxlbiA9IE1hdGguc3VtUHJlY2lzZShtZDVCdWZmZXIubWFwKHN0ciA9PiBzdHIubGVuZ3RoKSk7CiAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheShtZDVCdWZmZXJMZW4pOwogIGxldCBvZmZzZXQgPSAwOwogIGZvciAoY29uc3Qgc3RyIG9mIG1kNUJ1ZmZlcikgewogICAgb2Zmc2V0ID0gd3JpdGVTdHJpbmcoc3RyLCBvZmZzZXQsIGFycmF5KTsKICB9CiAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoY2FsY3VsYXRlTUQ1KGFycmF5LCAwLCBhcnJheS5sZW5ndGgpKTsKfQpmdW5jdGlvbiB3cml0ZVhGQURhdGFGb3JBY3JvZm9ybShzdHIsIGNoYW5nZXMpIHsKICBjb25zdCB4bWwgPSBuZXcgU2ltcGxlWE1MUGFyc2VyKHsKICAgIGhhc0F0dHJpYnV0ZXM6IHRydWUKICB9KS5wYXJzZUZyb21TdHJpbmcoc3RyKTsKICBmb3IgKGNvbnN0IHsKICAgIHhmYQogIH0gb2YgY2hhbmdlcykgewogICAgaWYgKCF4ZmEpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIHBhdGgsCiAgICAgIHZhbHVlCiAgICB9ID0geGZhOwogICAgaWYgKCFwYXRoKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3Qgbm9kZVBhdGggPSBwYXJzZVhGQVBhdGgocGF0aCk7CiAgICBsZXQgbm9kZSA9IHhtbC5kb2N1bWVudEVsZW1lbnQuc2VhcmNoTm9kZShub2RlUGF0aCwgMCk7CiAgICBpZiAoIW5vZGUgJiYgbm9kZVBhdGgubGVuZ3RoID4gMSkgewogICAgICBub2RlID0geG1sLmRvY3VtZW50RWxlbWVudC5zZWFyY2hOb2RlKFtub2RlUGF0aC5hdCgtMSldLCAwKTsKICAgIH0KICAgIGlmIChub2RlKSB7CiAgICAgIG5vZGUuY2hpbGROb2RlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKHZhbCA9PiBuZXcgU2ltcGxlRE9NTm9kZSgidmFsdWUiLCB2YWwpKSA6IFtuZXcgU2ltcGxlRE9NTm9kZSgiI3RleHQiLCB2YWx1ZSldOwogICAgfSBlbHNlIHsKICAgICAgd2FybihgTm9kZSBub3QgZm91bmQgZm9yIHBhdGg6ICR7cGF0aH1gKTsKICAgIH0KICB9CiAgY29uc3QgYnVmZmVyID0gW107CiAgeG1sLmRvY3VtZW50RWxlbWVudC5kdW1wKGJ1ZmZlcik7CiAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKfQphc3luYyBmdW5jdGlvbiB1cGRhdGVBY3JvZm9ybSh7CiAgeHJlZiwKICBhY3JvRm9ybSwKICBhY3JvRm9ybVJlZiwKICBoYXNYZmEsCiAgaGFzWGZhRGF0YXNldHNFbnRyeSwKICB4ZmFEYXRhc2V0c1JlZiwKICBuZWVkQXBwZWFyYW5jZXMsCiAgY2hhbmdlcwp9KSB7CiAgaWYgKGhhc1hmYSAmJiAhaGFzWGZhRGF0YXNldHNFbnRyeSAmJiAheGZhRGF0YXNldHNSZWYpIHsKICAgIHdhcm4oIlhGQSAtIENhbm5vdCBzYXZlIGl0Iik7CiAgfQogIGlmICghbmVlZEFwcGVhcmFuY2VzICYmICghaGFzWGZhIHx8ICF4ZmFEYXRhc2V0c1JlZiB8fCBoYXNYZmFEYXRhc2V0c0VudHJ5KSkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCBkaWN0ID0gYWNyb0Zvcm0uY2xvbmUoKTsKICBpZiAoaGFzWGZhICYmICFoYXNYZmFEYXRhc2V0c0VudHJ5KSB7CiAgICBjb25zdCBuZXdYZmEgPSBhY3JvRm9ybS5nZXQoIlhGQSIpLnNsaWNlKCk7CiAgICBuZXdYZmEuc3BsaWNlKDIsIDAsICJkYXRhc2V0cyIpOwogICAgbmV3WGZhLnNwbGljZSgzLCAwLCB4ZmFEYXRhc2V0c1JlZik7CiAgICBkaWN0LnNldCgiWEZBIiwgbmV3WGZhKTsKICB9CiAgaWYgKG5lZWRBcHBlYXJhbmNlcykgewogICAgZGljdC5zZXQoIk5lZWRBcHBlYXJhbmNlcyIsIHRydWUpOwogIH0KICBjaGFuZ2VzLnB1dChhY3JvRm9ybVJlZiwgewogICAgZGF0YTogZGljdAogIH0pOwp9CmZ1bmN0aW9uIHVwZGF0ZVhGQSh7CiAgeGZhRGF0YSwKICB4ZmFEYXRhc2V0c1JlZiwKICBjaGFuZ2VzLAogIHhyZWYKfSkgewogIGlmICh4ZmFEYXRhID09PSBudWxsKSB7CiAgICBjb25zdCBkYXRhc2V0cyA9IHhyZWYuZmV0Y2hJZlJlZih4ZmFEYXRhc2V0c1JlZik7CiAgICB4ZmFEYXRhID0gd3JpdGVYRkFEYXRhRm9yQWNyb2Zvcm0oZGF0YXNldHMuZ2V0U3RyaW5nKCksIGNoYW5nZXMpOwogIH0KICBjb25zdCB4ZmFEYXRhU3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbSh4ZmFEYXRhKTsKICB4ZmFEYXRhU3RyZWFtLmRpY3QgPSBuZXcgRGljdCh4cmVmKTsKICB4ZmFEYXRhU3RyZWFtLmRpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkVtYmVkZGVkRmlsZSIpKTsKICBjaGFuZ2VzLnB1dCh4ZmFEYXRhc2V0c1JlZiwgewogICAgZGF0YTogeGZhRGF0YVN0cmVhbQogIH0pOwp9CmFzeW5jIGZ1bmN0aW9uIGdldFhSZWZUYWJsZSh4cmVmSW5mbywgYmFzZU9mZnNldCwgbmV3UmVmcywgbmV3WHJlZiwgYnVmZmVyKSB7CiAgYnVmZmVyLnB1c2goInhyZWZcbiIpOwogIGNvbnN0IGluZGV4ZXMgPSBnZXRJbmRleGVzKG5ld1JlZnMpOwogIGxldCBpbmRleGVzUG9zaXRpb24gPSAwOwogIGZvciAoY29uc3QgewogICAgcmVmLAogICAgZGF0YQogIH0gb2YgbmV3UmVmcykgewogICAgaWYgKHJlZi5udW0gPT09IGluZGV4ZXNbaW5kZXhlc1Bvc2l0aW9uXSkgewogICAgICBidWZmZXIucHVzaChgJHtpbmRleGVzW2luZGV4ZXNQb3NpdGlvbl19ICR7aW5kZXhlc1tpbmRleGVzUG9zaXRpb24gKyAxXX1cbmApOwogICAgICBpbmRleGVzUG9zaXRpb24gKz0gMjsKICAgIH0KICAgIGlmIChkYXRhICE9PSBudWxsKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAke2Jhc2VPZmZzZXQudG9TdHJpbmcoKS5wYWRTdGFydCgxMCwgIjAiKX0gJHtNYXRoLm1pbihyZWYuZ2VuLCAweGZmZmYpLnRvU3RyaW5nKCkucGFkU3RhcnQoNSwgIjAiKX0gblxyXG5gKTsKICAgICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAwMDAwMDAwMDAwICR7TWF0aC5taW4ocmVmLmdlbiArIDEsIDB4ZmZmZikudG9TdHJpbmcoKS5wYWRTdGFydCg1LCAiMCIpfSBmXHJcbmApOwogICAgfQogIH0KICBjb21wdXRlSURzKGJhc2VPZmZzZXQsIHhyZWZJbmZvLCBuZXdYcmVmKTsKICBidWZmZXIucHVzaCgidHJhaWxlclxuIik7CiAgYXdhaXQgd3JpdGVEaWN0KG5ld1hyZWYsIGJ1ZmZlcik7CiAgYnVmZmVyLnB1c2goIlxuc3RhcnR4cmVmXG4iLCBiYXNlT2Zmc2V0LnRvU3RyaW5nKCksICJcbiUlRU9GXG4iKTsKfQpmdW5jdGlvbiBnZXRJbmRleGVzKG5ld1JlZnMpIHsKICBjb25zdCBpbmRleGVzID0gW107CiAgZm9yIChjb25zdCB7CiAgICByZWYKICB9IG9mIG5ld1JlZnMpIHsKICAgIGlmIChyZWYubnVtID09PSBpbmRleGVzLmF0KC0yKSArIGluZGV4ZXMuYXQoLTEpKSB7CiAgICAgIGluZGV4ZXNbaW5kZXhlcy5sZW5ndGggLSAxXSArPSAxOwogICAgfSBlbHNlIHsKICAgICAgaW5kZXhlcy5wdXNoKHJlZi5udW0sIDEpOwogICAgfQogIH0KICByZXR1cm4gaW5kZXhlczsKfQphc3luYyBmdW5jdGlvbiBnZXRYUmVmU3RyZWFtVGFibGUoeHJlZkluZm8sIGJhc2VPZmZzZXQsIG5ld1JlZnMsIG5ld1hyZWYsIGJ1ZmZlcikgewogIGNvbnN0IHhyZWZUYWJsZURhdGEgPSBbXTsKICBsZXQgbWF4T2Zmc2V0ID0gMDsKICBsZXQgbWF4R2VuID0gMDsKICBmb3IgKGNvbnN0IHsKICAgIHJlZiwKICAgIGRhdGEKICB9IG9mIG5ld1JlZnMpIHsKICAgIGxldCBnZW47CiAgICBtYXhPZmZzZXQgPSBNYXRoLm1heChtYXhPZmZzZXQsIGJhc2VPZmZzZXQpOwogICAgaWYgKGRhdGEgIT09IG51bGwpIHsKICAgICAgZ2VuID0gTWF0aC5taW4ocmVmLmdlbiwgMHhmZmZmKTsKICAgICAgeHJlZlRhYmxlRGF0YS5wdXNoKFsxLCBiYXNlT2Zmc2V0LCBnZW5dKTsKICAgICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGdlbiA9IE1hdGgubWluKHJlZi5nZW4gKyAxLCAweGZmZmYpOwogICAgICB4cmVmVGFibGVEYXRhLnB1c2goWzAsIDAsIGdlbl0pOwogICAgfQogICAgbWF4R2VuID0gTWF0aC5tYXgobWF4R2VuLCBnZW4pOwogIH0KICBuZXdYcmVmLnNldCgiSW5kZXgiLCBnZXRJbmRleGVzKG5ld1JlZnMpKTsKICBjb25zdCBvZmZzZXRTaXplID0gZ2V0U2l6ZUluQnl0ZXMobWF4T2Zmc2V0KTsKICBjb25zdCBtYXhHZW5TaXplID0gZ2V0U2l6ZUluQnl0ZXMobWF4R2VuKTsKICBjb25zdCBzaXplcyA9IFsxLCBvZmZzZXRTaXplLCBtYXhHZW5TaXplXTsKICBuZXdYcmVmLnNldCgiVyIsIHNpemVzKTsKICBjb21wdXRlSURzKGJhc2VPZmZzZXQsIHhyZWZJbmZvLCBuZXdYcmVmKTsKICBjb25zdCBzdHJ1Y3RTaXplID0gTWF0aC5zdW1QcmVjaXNlKHNpemVzKTsKICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoc3RydWN0U2l6ZSAqIHhyZWZUYWJsZURhdGEubGVuZ3RoKTsKICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKGRhdGEpOwogIHN0cmVhbS5kaWN0ID0gbmV3WHJlZjsKICBsZXQgb2Zmc2V0ID0gMDsKICBmb3IgKGNvbnN0IFt0eXBlLCBvYmpPZmZzZXQsIGdlbl0gb2YgeHJlZlRhYmxlRGF0YSkgewogICAgb2Zmc2V0ID0gd3JpdGVJbnQodHlwZSwgc2l6ZXNbMF0sIG9mZnNldCwgZGF0YSk7CiAgICBvZmZzZXQgPSB3cml0ZUludChvYmpPZmZzZXQsIHNpemVzWzFdLCBvZmZzZXQsIGRhdGEpOwogICAgb2Zmc2V0ID0gd3JpdGVJbnQoZ2VuLCBzaXplc1syXSwgb2Zmc2V0LCBkYXRhKTsKICB9CiAgYXdhaXQgd3JpdGVPYmplY3QoeHJlZkluZm8ubmV3UmVmLCBzdHJlYW0sIGJ1ZmZlciwge30pOwogIGJ1ZmZlci5wdXNoKCJzdGFydHhyZWZcbiIsIGJhc2VPZmZzZXQudG9TdHJpbmcoKSwgIlxuJSVFT0ZcbiIpOwp9CmZ1bmN0aW9uIGNvbXB1dGVJRHMoYmFzZU9mZnNldCwgeHJlZkluZm8sIG5ld1hyZWYpIHsKICBpZiAoQXJyYXkuaXNBcnJheSh4cmVmSW5mby5maWxlSWRzKSAmJiB4cmVmSW5mby5maWxlSWRzLmxlbmd0aCA+IDApIHsKICAgIGNvbnN0IG1kNSA9IGNvbXB1dGVNRDUoYmFzZU9mZnNldCwgeHJlZkluZm8pOwogICAgbmV3WHJlZi5zZXQoIklEIiwgW3hyZWZJbmZvLmZpbGVJZHNbMF0sIG1kNV0pOwogIH0KfQpmdW5jdGlvbiBnZXRUcmFpbGVyRGljdCh4cmVmSW5mbywgY2hhbmdlcywgdXNlWHJlZlN0cmVhbSkgewogIGNvbnN0IG5ld1hyZWYgPSBuZXcgRGljdChudWxsKTsKICBuZXdYcmVmLnNldCgiUHJldiIsIHhyZWZJbmZvLnN0YXJ0WFJlZik7CiAgY29uc3QgcmVmRm9yWHJlZlRhYmxlID0geHJlZkluZm8ubmV3UmVmOwogIGlmICh1c2VYcmVmU3RyZWFtKSB7CiAgICBjaGFuZ2VzLnB1dChyZWZGb3JYcmVmVGFibGUsIHsKICAgICAgZGF0YTogIiIKICAgIH0pOwogICAgbmV3WHJlZi5zZXQoIlNpemUiLCByZWZGb3JYcmVmVGFibGUubnVtICsgMSk7CiAgICBuZXdYcmVmLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYUmVmIikpOwogIH0gZWxzZSB7CiAgICBuZXdYcmVmLnNldCgiU2l6ZSIsIHJlZkZvclhyZWZUYWJsZS5udW0pOwogIH0KICBpZiAoeHJlZkluZm8ucm9vdFJlZiAhPT0gbnVsbCkgewogICAgbmV3WHJlZi5zZXQoIlJvb3QiLCB4cmVmSW5mby5yb290UmVmKTsKICB9CiAgaWYgKHhyZWZJbmZvLmluZm9SZWYgIT09IG51bGwpIHsKICAgIG5ld1hyZWYuc2V0KCJJbmZvIiwgeHJlZkluZm8uaW5mb1JlZik7CiAgfQogIGlmICh4cmVmSW5mby5lbmNyeXB0UmVmICE9PSBudWxsKSB7CiAgICBuZXdYcmVmLnNldCgiRW5jcnlwdCIsIHhyZWZJbmZvLmVuY3J5cHRSZWYpOwogIH0KICByZXR1cm4gbmV3WHJlZjsKfQphc3luYyBmdW5jdGlvbiB3cml0ZUNoYW5nZXMoY2hhbmdlcywgeHJlZiwgYnVmZmVyID0gW10pIHsKICBjb25zdCBuZXdSZWZzID0gW107CiAgZm9yIChjb25zdCBbcmVmLCB7CiAgICBkYXRhCiAgfV0gb2YgY2hhbmdlcy5pdGVtcygpKSB7CiAgICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIpIHsKICAgICAgbmV3UmVmcy5wdXNoKHsKICAgICAgICByZWYsCiAgICAgICAgZGF0YQogICAgICB9KTsKICAgICAgY29udGludWU7CiAgICB9CiAgICBhd2FpdCB3cml0ZU9iamVjdChyZWYsIGRhdGEsIGJ1ZmZlciwgeHJlZik7CiAgICBuZXdSZWZzLnB1c2goewogICAgICByZWYsCiAgICAgIGRhdGE6IGJ1ZmZlci5qb2luKCIiKQogICAgfSk7CiAgICBidWZmZXIubGVuZ3RoID0gMDsKICB9CiAgcmV0dXJuIG5ld1JlZnMuc29ydCgoYSwgYikgPT4gYS5yZWYubnVtIC0gYi5yZWYubnVtKTsKfQphc3luYyBmdW5jdGlvbiBpbmNyZW1lbnRhbFVwZGF0ZSh7CiAgb3JpZ2luYWxEYXRhLAogIHhyZWZJbmZvLAogIGNoYW5nZXMsCiAgeHJlZiA9IG51bGwsCiAgaGFzWGZhID0gZmFsc2UsCiAgeGZhRGF0YXNldHNSZWYgPSBudWxsLAogIGhhc1hmYURhdGFzZXRzRW50cnkgPSBmYWxzZSwKICBuZWVkQXBwZWFyYW5jZXMsCiAgYWNyb0Zvcm1SZWYgPSBudWxsLAogIGFjcm9Gb3JtID0gbnVsbCwKICB4ZmFEYXRhID0gbnVsbCwKICB1c2VYcmVmU3RyZWFtID0gZmFsc2UKfSkgewogIGF3YWl0IHVwZGF0ZUFjcm9mb3JtKHsKICAgIHhyZWYsCiAgICBhY3JvRm9ybSwKICAgIGFjcm9Gb3JtUmVmLAogICAgaGFzWGZhLAogICAgaGFzWGZhRGF0YXNldHNFbnRyeSwKICAgIHhmYURhdGFzZXRzUmVmLAogICAgbmVlZEFwcGVhcmFuY2VzLAogICAgY2hhbmdlcwogIH0pOwogIGlmIChoYXNYZmEpIHsKICAgIHVwZGF0ZVhGQSh7CiAgICAgIHhmYURhdGEsCiAgICAgIHhmYURhdGFzZXRzUmVmLAogICAgICBjaGFuZ2VzLAogICAgICB4cmVmCiAgICB9KTsKICB9CiAgY29uc3QgbmV3WHJlZiA9IGdldFRyYWlsZXJEaWN0KHhyZWZJbmZvLCBjaGFuZ2VzLCB1c2VYcmVmU3RyZWFtKTsKICBjb25zdCBidWZmZXIgPSBbXTsKICBjb25zdCBuZXdSZWZzID0gYXdhaXQgd3JpdGVDaGFuZ2VzKGNoYW5nZXMsIHhyZWYsIGJ1ZmZlcik7CiAgbGV0IGJhc2VPZmZzZXQgPSBvcmlnaW5hbERhdGEubGVuZ3RoOwogIGNvbnN0IGxhc3RCeXRlID0gb3JpZ2luYWxEYXRhLmF0KC0xKTsKICBpZiAobGFzdEJ5dGUgIT09IDB4MGEgJiYgbGFzdEJ5dGUgIT09IDB4MGQpIHsKICAgIGJ1ZmZlci5wdXNoKCJcbiIpOwogICAgYmFzZU9mZnNldCArPSAxOwogIH0KICBmb3IgKGNvbnN0IHsKICAgIGRhdGEKICB9IG9mIG5ld1JlZnMpIHsKICAgIGlmIChkYXRhICE9PSBudWxsKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGRhdGEpOwogICAgfQogIH0KICBhd2FpdCAodXNlWHJlZlN0cmVhbSA/IGdldFhSZWZTdHJlYW1UYWJsZSh4cmVmSW5mbywgYmFzZU9mZnNldCwgbmV3UmVmcywgbmV3WHJlZiwgYnVmZmVyKSA6IGdldFhSZWZUYWJsZSh4cmVmSW5mbywgYmFzZU9mZnNldCwgbmV3UmVmcywgbmV3WHJlZiwgYnVmZmVyKSk7CiAgY29uc3QgdG90YWxMZW5ndGggPSBvcmlnaW5hbERhdGEubGVuZ3RoICsgTWF0aC5zdW1QcmVjaXNlKGJ1ZmZlci5tYXAoc3RyID0+IHN0ci5sZW5ndGgpKTsKICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKICBhcnJheS5zZXQob3JpZ2luYWxEYXRhKTsKICBsZXQgb2Zmc2V0ID0gb3JpZ2luYWxEYXRhLmxlbmd0aDsKICBmb3IgKGNvbnN0IHN0ciBvZiBidWZmZXIpIHsKICAgIG9mZnNldCA9IHdyaXRlU3RyaW5nKHN0ciwgb2Zmc2V0LCBhcnJheSk7CiAgfQogIHJldHVybiBhcnJheTsKfQoKOy8vIC4vc3JjL2NvcmUvd29ya2VyX3N0cmVhbS5qcwoKY2xhc3MgUERGV29ya2VyU3RyZWFtIHsKICBjb25zdHJ1Y3Rvcihtc2dIYW5kbGVyKSB7CiAgICB0aGlzLl9tc2dIYW5kbGVyID0gbXNnSGFuZGxlcjsKICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsOwogICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsOwogICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdOwogIH0KICBnZXRGdWxsUmVhZGVyKCkgewogICAgYXNzZXJ0KCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgIlBERldvcmtlclN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOwogICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGV29ya2VyU3RyZWFtUmVhZGVyKHRoaXMuX21zZ0hhbmRsZXIpOwogICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyOwogIH0KICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7CiAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCwgdGhpcy5fbXNnSGFuZGxlcik7CiAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmVhZGVyKTsKICAgIHJldHVybiByZWFkZXI7CiAgfQogIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikgewogICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pOwogICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkgewogICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7CiAgICB9CiAgfQp9CmNsYXNzIFBERldvcmtlclN0cmVhbVJlYWRlciB7CiAgY29uc3RydWN0b3IobXNnSGFuZGxlcikgewogICAgdGhpcy5fbXNnSGFuZGxlciA9IG1zZ0hhbmRsZXI7CiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOwogICAgdGhpcy5fY29udGVudExlbmd0aCA9IG51bGw7CiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZmFsc2U7CiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGZhbHNlOwogICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLl9tc2dIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKCJHZXRSZWFkZXIiKTsKICAgIHRoaXMuX3JlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOwogICAgdGhpcy5faGVhZGVyc1JlYWR5ID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlJlYWRlckhlYWRlcnNSZWFkeSIpLnRoZW4oZGF0YSA9PiB7CiAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gZGF0YS5pc1N0cmVhbWluZ1N1cHBvcnRlZDsKICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGRhdGEuaXNSYW5nZVN1cHBvcnRlZDsKICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGRhdGEuY29udGVudExlbmd0aDsKICAgIH0pOwogIH0KICBnZXQgaGVhZGVyc1JlYWR5KCkgewogICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTsKICB9CiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDsKICB9CiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgewogICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkOwogIH0KICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHsKICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkOwogIH0KICBhc3luYyByZWFkKCkgewogICAgY29uc3QgewogICAgICB2YWx1ZSwKICAgICAgZG9uZQogICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7CiAgICBpZiAoZG9uZSkgewogICAgICByZXR1cm4gewogICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCiAgICAgICAgZG9uZTogdHJ1ZQogICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgdmFsdWU6IHZhbHVlLmJ1ZmZlciwKICAgICAgZG9uZTogZmFsc2UKICAgIH07CiAgfQogIGNhbmNlbChyZWFzb24pIHsKICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTsKICB9Cn0KY2xhc3MgUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIgewogIGNvbnN0cnVjdG9yKGJlZ2luLCBlbmQsIG1zZ0hhbmRsZXIpIHsKICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOwogICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0UmFuZ2VSZWFkZXIiLCB7CiAgICAgIGJlZ2luLAogICAgICBlbmQKICAgIH0pOwogICAgdGhpcy5fcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7CiAgfQogIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgcmVhZCgpIHsKICAgIGNvbnN0IHsKICAgICAgdmFsdWUsCiAgICAgIGRvbmUKICAgIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpOwogICAgaWYgKGRvbmUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgIGRvbmU6IHRydWUKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHZhbHVlOiB2YWx1ZS5idWZmZXIsCiAgICAgIGRvbmU6IGZhbHNlCiAgICB9OwogIH0KICBjYW5jZWwocmVhc29uKSB7CiAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS93b3JrZXIuanMKCgoKCgoKCgoKCmNsYXNzIFdvcmtlclRhc2sgewogIGNvbnN0cnVjdG9yKG5hbWUpIHsKICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICB0aGlzLnRlcm1pbmF0ZWQgPSBmYWxzZTsKICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTsKICB9CiAgZ2V0IGZpbmlzaGVkKCkgewogICAgcmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZTsKICB9CiAgZmluaXNoKCkgewogICAgdGhpcy5fY2FwYWJpbGl0eS5yZXNvbHZlKCk7CiAgfQogIHRlcm1pbmF0ZSgpIHsKICAgIHRoaXMudGVybWluYXRlZCA9IHRydWU7CiAgfQogIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKSB7CiAgICBpZiAodGhpcy50ZXJtaW5hdGVkKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIHRhc2sgd2FzIHRlcm1pbmF0ZWQiKTsKICAgIH0KICB9Cn0KY2xhc3MgV29ya2VyTWVzc2FnZUhhbmRsZXIgewogIHN0YXRpYyB7CiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIgJiYgIWlzTm9kZUpTICYmIHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2Ygc2VsZi5wb3N0TWVzc2FnZSA9PT0gImZ1bmN0aW9uIiAmJiAib25tZXNzYWdlIiBpbiBzZWxmKSB7CiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZyb21Qb3J0KHNlbGYpOwogICAgfQogIH0KICBzdGF0aWMgc2V0dXAoaGFuZGxlciwgcG9ydCkgewogICAgbGV0IHRlc3RNZXNzYWdlUHJvY2Vzc2VkID0gZmFsc2U7CiAgICBoYW5kbGVyLm9uKCJ0ZXN0IiwgZGF0YSA9PiB7CiAgICAgIGlmICh0ZXN0TWVzc2FnZVByb2Nlc3NlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0ZXN0TWVzc2FnZVByb2Nlc3NlZCA9IHRydWU7CiAgICAgIGhhbmRsZXIuc2VuZCgidGVzdCIsIGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiY29uZmlndXJlIiwgZGF0YSA9PiB7CiAgICAgIHNldFZlcmJvc2l0eUxldmVsKGRhdGEudmVyYm9zaXR5KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0RG9jUmVxdWVzdCIsIGRhdGEgPT4gdGhpcy5jcmVhdGVEb2N1bWVudEhhbmRsZXIoZGF0YSwgcG9ydCkpOwogIH0KICBzdGF0aWMgY3JlYXRlRG9jdW1lbnRIYW5kbGVyKGRvY1BhcmFtcywgcG9ydCkgewogICAgbGV0IHBkZk1hbmFnZXI7CiAgICBsZXQgdGVybWluYXRlZCA9IGZhbHNlOwogICAgbGV0IGNhbmNlbFhIUnMgPSBudWxsOwogICAgY29uc3QgV29ya2VyVGFza3MgPSBuZXcgU2V0KCk7CiAgICBjb25zdCB2ZXJib3NpdHkgPSBnZXRWZXJib3NpdHlMZXZlbCgpOwogICAgY29uc3QgewogICAgICBkb2NJZCwKICAgICAgYXBpVmVyc2lvbgogICAgfSA9IGRvY1BhcmFtczsKICAgIGNvbnN0IHdvcmtlclZlcnNpb24gPSAiNS4xLjkxIjsKICAgIGlmIChhcGlWZXJzaW9uICE9PSB3b3JrZXJWZXJzaW9uKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEFQSSB2ZXJzaW9uICIke2FwaVZlcnNpb259IiBkb2VzIG5vdCBtYXRjaCBgICsgYHRoZSBXb3JrZXIgdmVyc2lvbiAiJHt3b3JrZXJWZXJzaW9ufSIuYCk7CiAgICB9CiAgICBjb25zdCBlbnVtZXJhYmxlUHJvcGVydGllcyA9IFtdOwogICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBbXSkgewogICAgICBlbnVtZXJhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTsKICAgIH0KICAgIGlmIChlbnVtZXJhYmxlUHJvcGVydGllcy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYEFycmF5LnByb3RvdHlwZWAgY29udGFpbnMgdW5leHBlY3RlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXM6ICIgKyBlbnVtZXJhYmxlUHJvcGVydGllcy5qb2luKCIsICIpICsgIjsgdGh1cyBicmVha2luZyBlLmcuIGBmb3IuLi5pbmAgaXRlcmF0aW9uIG9mIGBBcnJheWBzLiIpOwogICAgfQogICAgY29uc3Qgd29ya2VySGFuZGxlck5hbWUgPSBkb2NJZCArICJfd29ya2VyIjsKICAgIGxldCBoYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKHdvcmtlckhhbmRsZXJOYW1lLCBkb2NJZCwgcG9ydCk7CiAgICBmdW5jdGlvbiBlbnN1cmVOb3RUZXJtaW5hdGVkKCkgewogICAgICBpZiAodGVybWluYXRlZCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkIik7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0YXJ0V29ya2VyVGFzayh0YXNrKSB7CiAgICAgIFdvcmtlclRhc2tzLmFkZCh0YXNrKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbmlzaFdvcmtlclRhc2sodGFzaykgewogICAgICB0YXNrLmZpbmlzaCgpOwogICAgICBXb3JrZXJUYXNrcy5kZWxldGUodGFzayk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBsb2FkRG9jdW1lbnQocmVjb3ZlcnlNb2RlKSB7CiAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjaGVja0hlYWRlciIpOwogICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygicGFyc2VTdGFydFhSZWYiKTsKICAgICAgYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoInBhcnNlIiwgW3JlY292ZXJ5TW9kZV0pOwogICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiY2hlY2tGaXJzdFBhZ2UiLCBbcmVjb3ZlcnlNb2RlXSk7CiAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjaGVja0xhc3RQYWdlIiwgW3JlY292ZXJ5TW9kZV0pOwogICAgICBjb25zdCBpc1B1cmVYZmEgPSBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiaXNQdXJlWGZhIik7CiAgICAgIGlmIChpc1B1cmVYZmEpIHsKICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soImxvYWRYZmFGb250cyIpOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5sb2FkWGZhRm9udHMoaGFuZGxlciwgdGFzaykuY2F0Y2gocmVhc29uID0+IHt9KS50aGVuKCgpID0+IGZpbmlzaFdvcmtlclRhc2sodGFzaykpLCBwZGZNYW5hZ2VyLmxvYWRYZmFJbWFnZXMoKV0pOwogICAgICB9CiAgICAgIGNvbnN0IFtudW1QYWdlcywgZmluZ2VycHJpbnRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZURvYygibnVtUGFnZXMiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoImZpbmdlcnByaW50cyIpXSk7CiAgICAgIGNvbnN0IGh0bWxGb3JYZmEgPSBpc1B1cmVYZmEgPyBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiaHRtbEZvclhmYSIpIDogbnVsbDsKICAgICAgcmV0dXJuIHsKICAgICAgICBudW1QYWdlcywKICAgICAgICBmaW5nZXJwcmludHMsCiAgICAgICAgaHRtbEZvclhmYQogICAgICB9OwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gZ2V0UGRmTWFuYWdlcih7CiAgICAgIGRhdGEsCiAgICAgIHBhc3N3b3JkLAogICAgICBkaXNhYmxlQXV0b0ZldGNoLAogICAgICByYW5nZUNodW5rU2l6ZSwKICAgICAgbGVuZ3RoLAogICAgICBkb2NCYXNlVXJsLAogICAgICBlbmFibGVYZmEsCiAgICAgIGV2YWx1YXRvck9wdGlvbnMKICAgIH0pIHsKICAgICAgY29uc3QgcGRmTWFuYWdlckFyZ3MgPSB7CiAgICAgICAgc291cmNlOiBudWxsLAogICAgICAgIGRpc2FibGVBdXRvRmV0Y2gsCiAgICAgICAgZG9jQmFzZVVybCwKICAgICAgICBkb2NJZCwKICAgICAgICBlbmFibGVYZmEsCiAgICAgICAgZXZhbHVhdG9yT3B0aW9ucywKICAgICAgICBoYW5kbGVyLAogICAgICAgIGxlbmd0aCwKICAgICAgICBwYXNzd29yZCwKICAgICAgICByYW5nZUNodW5rU2l6ZQogICAgICB9OwogICAgICBpZiAoZGF0YSkgewogICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IGRhdGE7CiAgICAgICAgcmV0dXJuIG5ldyBMb2NhbFBkZk1hbmFnZXIocGRmTWFuYWdlckFyZ3MpOwogICAgICB9CiAgICAgIGNvbnN0IHBkZlN0cmVhbSA9IG5ldyBQREZXb3JrZXJTdHJlYW0oaGFuZGxlciksCiAgICAgICAgZnVsbFJlcXVlc3QgPSBwZGZTdHJlYW0uZ2V0RnVsbFJlYWRlcigpOwogICAgICBjb25zdCBwZGZNYW5hZ2VyQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICBsZXQgbmV3UGRmTWFuYWdlciwKICAgICAgICBjYWNoZWRDaHVua3MgPSBbXSwKICAgICAgICBsb2FkZWQgPSAwOwogICAgICBmdWxsUmVxdWVzdC5oZWFkZXJzUmVhZHkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFmdWxsUmVxdWVzdC5pc1JhbmdlU3VwcG9ydGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IHBkZlN0cmVhbTsKICAgICAgICBwZGZNYW5hZ2VyQXJncy5sZW5ndGggPSBmdWxsUmVxdWVzdC5jb250ZW50TGVuZ3RoOwogICAgICAgIHBkZk1hbmFnZXJBcmdzLmRpc2FibGVBdXRvRmV0Y2ggfHw9IGZ1bGxSZXF1ZXN0LmlzU3RyZWFtaW5nU3VwcG9ydGVkOwogICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgTmV0d29ya1BkZk1hbmFnZXIocGRmTWFuYWdlckFyZ3MpOwogICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2FjaGVkQ2h1bmtzKSB7CiAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspOwogICAgICAgIH0KICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOwogICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7CiAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7CiAgICAgIH0pOwogICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgY29uc3QgcmVhZENodW5rID0gZnVuY3Rpb24gKHsKICAgICAgICAgIHZhbHVlLAogICAgICAgICAgZG9uZQogICAgICAgIH0pIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgICAgICBpZiAoIW5ld1BkZk1hbmFnZXIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBkZkZpbGUgPSBhcnJheUJ1ZmZlcnNUb0J5dGVzKGNhY2hlZENodW5rcyk7CiAgICAgICAgICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKICAgICAgICAgICAgICAgIGlmIChsZW5ndGggJiYgcGRmRmlsZS5sZW5ndGggIT09IGxlbmd0aCkgewogICAgICAgICAgICAgICAgICB3YXJuKCJyZXBvcnRlZCBIVFRQIGxlbmd0aCBpcyBkaWZmZXJlbnQgZnJvbSBhY3R1YWwiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IHBkZkZpbGU7CiAgICAgICAgICAgICAgICBuZXdQZGZNYW5hZ2VyID0gbmV3IExvY2FsUGRmTWFuYWdlcihwZGZNYW5hZ2VyQXJncyk7CiAgICAgICAgICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjYW5jZWxYSFJzID0gbnVsbDsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7CiAgICAgICAgICAgIGlmICghZnVsbFJlcXVlc3QuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY1Byb2dyZXNzIiwgewogICAgICAgICAgICAgICAgbG9hZGVkLAogICAgICAgICAgICAgICAgdG90YWw6IE1hdGgubWF4KGxvYWRlZCwgZnVsbFJlcXVlc3QuY29udGVudExlbmd0aCB8fCAwKQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdQZGZNYW5hZ2VyKSB7CiAgICAgICAgICAgICAgbmV3UGRmTWFuYWdlci5zZW5kUHJvZ3Jlc3NpdmVEYXRhKHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjYWNoZWRDaHVua3MucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVsbFJlcXVlc3QucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICByZWplY3QoZSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBmdWxsUmVxdWVzdC5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGUpOwogICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOwogICAgICB9KTsKICAgICAgY2FuY2VsWEhScyA9IHJlYXNvbiA9PiB7CiAgICAgICAgcGRmU3RyZWFtLmNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbik7CiAgICAgIH07CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgfQogICAgZnVuY3Rpb24gc2V0dXBEb2MoZGF0YSkgewogICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoZG9jKSB7CiAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgIGhhbmRsZXIuc2VuZCgiR2V0RG9jIiwgewogICAgICAgICAgcGRmSW5mbzogZG9jCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gb25GYWlsdXJlKGV4KSB7CiAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFBhc3N3b3JkRXhjZXB0aW9uKSB7CiAgICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soYFBhc3N3b3JkRXhjZXB0aW9uOiByZXNwb25zZSAke2V4LmNvZGV9YCk7CiAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBoYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiUGFzc3dvcmRSZXF1ZXN0IiwgZXgpLnRoZW4oZnVuY3Rpb24gKHsKICAgICAgICAgICAgcGFzc3dvcmQKICAgICAgICAgIH0pIHsKICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgcGRmTWFuYWdlci51cGRhdGVQYXNzd29yZChwYXNzd29yZCk7CiAgICAgICAgICAgIHBkZk1hbmFnZXJSZWFkeSgpOwogICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY0V4Y2VwdGlvbiIsIGV4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY0V4Y2VwdGlvbiIsIHdyYXBSZWFzb24oZXgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcGRmTWFuYWdlclJlYWR5KCkgewogICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICBsb2FkRG9jdW1lbnQoZmFsc2UpLnRoZW4ob25TdWNjZXNzLCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgICAgICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBYUmVmUGFyc2VFeGNlcHRpb24pKSB7CiAgICAgICAgICAgIG9uRmFpbHVyZShyZWFzb24pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgICAgICBsb2FkRG9jdW1lbnQodHJ1ZSkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbHVyZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgIGdldFBkZk1hbmFnZXIoZGF0YSkudGhlbihmdW5jdGlvbiAobmV3UGRmTWFuYWdlcikgewogICAgICAgIGlmICh0ZXJtaW5hdGVkKSB7CiAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnRlcm1pbmF0ZShuZXcgQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldvcmtlciB3YXMgdGVybWluYXRlZCIpOwogICAgICAgIH0KICAgICAgICBwZGZNYW5hZ2VyID0gbmV3UGRmTWFuYWdlcjsKICAgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0odHJ1ZSkudGhlbihzdHJlYW0gPT4gewogICAgICAgICAgaGFuZGxlci5zZW5kKCJEYXRhTG9hZGVkIiwgewogICAgICAgICAgICBsZW5ndGg6IHN0cmVhbS5ieXRlcy5ieXRlTGVuZ3RoCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSkudGhlbihwZGZNYW5hZ2VyUmVhZHksIG9uRmFpbHVyZSk7CiAgICB9CiAgICBoYW5kbGVyLm9uKCJHZXRQYWdlIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZ2V0UGFnZShkYXRhLnBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgInJvdGF0ZSIpLCBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAicmVmIiksIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJ1c2VyVW5pdCIpLCBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAidmlldyIpXSkudGhlbihmdW5jdGlvbiAoW3JvdGF0ZSwgcmVmLCB1c2VyVW5pdCwgdmlld10pIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJvdGF0ZSwKICAgICAgICAgICAgcmVmLAogICAgICAgICAgICByZWZTdHI6IHJlZj8udG9TdHJpbmcoKSA/PyBudWxsLAogICAgICAgICAgICB1c2VyVW5pdCwKICAgICAgICAgICAgdmlldwogICAgICAgICAgfTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFBhZ2VJbmRleCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIGNvbnN0IHBhZ2VSZWYgPSBSZWYuZ2V0KGRhdGEubnVtLCBkYXRhLmdlbik7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsIFtwYWdlUmVmXSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldERlc3RpbmF0aW9ucyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImRlc3RpbmF0aW9ucyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXREZXN0aW5hdGlvbiIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldERlc3RpbmF0aW9uIiwgW2RhdGEuaWRdKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZUxhYmVscyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYWJlbHMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZUxheW91dCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYXlvdXQiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZU1vZGUiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJwYWdlTW9kZSIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRWaWV3ZXJQcmVmZXJlbmNlcyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInZpZXdlclByZWZlcmVuY2VzIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE9wZW5BY3Rpb24iLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJvcGVuQWN0aW9uIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldEF0dGFjaG1lbnRzIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYXR0YWNobWVudHMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0RG9jSlNBY3Rpb25zIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFBhZ2VKU0FjdGlvbnMiLCBmdW5jdGlvbiAoewogICAgICBwYWdlSW5kZXgKICAgIH0pIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4ocGFnZSA9PiBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAianNBY3Rpb25zIikpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRPdXRsaW5lIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZG9jdW1lbnRPdXRsaW5lIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE9wdGlvbmFsQ29udGVudENvbmZpZyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm9wdGlvbmFsQ29udGVudENvbmZpZyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRQZXJtaXNzaW9ucyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBlcm1pc3Npb25zIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE1ldGFkYXRhIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZURvYygiZG9jdW1lbnRJbmZvIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygibWV0YWRhdGEiKV0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRNYXJrSW5mbyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm1hcmtJbmZvIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldERhdGEiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCkudGhlbihzdHJlYW0gPT4gc3RyZWFtLmJ5dGVzKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0QW5ub3RhdGlvbnMiLCBmdW5jdGlvbiAoewogICAgICBwYWdlSW5kZXgsCiAgICAgIGludGVudAogICAgfSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgV29ya2VyVGFzayhgR2V0QW5ub3RhdGlvbnM6IHBhZ2UgJHtwYWdlSW5kZXh9YCk7CiAgICAgICAgc3RhcnRXb3JrZXJUYXNrKHRhc2spOwogICAgICAgIHJldHVybiBwYWdlLmdldEFubm90YXRpb25zRGF0YShoYW5kbGVyLCB0YXNrLCBpbnRlbnQpLnRoZW4oZGF0YSA9PiB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfSwgcmVhc29uID0+IHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRGaWVsZE9iamVjdHMiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVEb2MoImZpZWxkT2JqZWN0cyIpLnRoZW4oZmllbGRPYmplY3RzID0+IGZpZWxkT2JqZWN0cz8uYWxsRmllbGRzIHx8IG51bGwpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJIYXNKU0FjdGlvbnMiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVEb2MoImhhc0pTQWN0aW9ucyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRDYWxjdWxhdGlvbk9yZGVySWRzIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjYWxjdWxhdGlvbk9yZGVySWRzIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIlNhdmVEb2N1bWVudCIsIGFzeW5jIGZ1bmN0aW9uICh7CiAgICAgIGlzUHVyZVhmYSwKICAgICAgbnVtUGFnZXMsCiAgICAgIGFubm90YXRpb25TdG9yYWdlLAogICAgICBmaWxlbmFtZQogICAgfSkgewogICAgICBjb25zdCBnbG9iYWxQcm9taXNlcyA9IFtwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKSwgcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybSIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtUmVmIiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJzdGFydFhSZWYiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoInhyZWYiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoImxpbmVhcml6YXRpb24iKSwgcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJzdHJ1Y3RUcmVlUm9vdCIpXTsKICAgICAgY29uc3QgY2hhbmdlcyA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgICBjb25zdCBwcm9taXNlcyA9IFtdOwogICAgICBjb25zdCBuZXdBbm5vdGF0aW9uc0J5UGFnZSA9ICFpc1B1cmVYZmEgPyBnZXROZXdBbm5vdGF0aW9uc01hcChhbm5vdGF0aW9uU3RvcmFnZSkgOiBudWxsOwogICAgICBjb25zdCBbc3RyZWFtLCBhY3JvRm9ybSwgYWNyb0Zvcm1SZWYsIHN0YXJ0WFJlZiwgeHJlZiwgbGluZWFyaXphdGlvbiwgX3N0cnVjdFRyZWVSb290XSA9IGF3YWl0IFByb21pc2UuYWxsKGdsb2JhbFByb21pc2VzKTsKICAgICAgY29uc3QgY2F0YWxvZ1JlZiA9IHhyZWYudHJhaWxlci5nZXRSYXcoIlJvb3QiKSB8fCBudWxsOwogICAgICBsZXQgc3RydWN0VHJlZVJvb3Q7CiAgICAgIGlmIChuZXdBbm5vdGF0aW9uc0J5UGFnZSkgewogICAgICAgIGlmICghX3N0cnVjdFRyZWVSb290KSB7CiAgICAgICAgICBpZiAoYXdhaXQgU3RydWN0VHJlZVJvb3QuY2FuQ3JlYXRlU3RydWN0dXJlVHJlZSh7CiAgICAgICAgICAgIGNhdGFsb2dSZWYsCiAgICAgICAgICAgIHBkZk1hbmFnZXIsCiAgICAgICAgICAgIG5ld0Fubm90YXRpb25zQnlQYWdlCiAgICAgICAgICB9KSkgewogICAgICAgICAgICBzdHJ1Y3RUcmVlUm9vdCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChhd2FpdCBfc3RydWN0VHJlZVJvb3QuY2FuVXBkYXRlU3RydWN0VHJlZSh7CiAgICAgICAgICBwZGZNYW5hZ2VyLAogICAgICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UKICAgICAgICB9KSkgewogICAgICAgICAgc3RydWN0VHJlZVJvb3QgPSBfc3RydWN0VHJlZVJvb3Q7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGltYWdlUHJvbWlzZXMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhhbm5vdGF0aW9uU3RvcmFnZS52YWx1ZXMoKSwgeHJlZiwgcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTsKICAgICAgICBjb25zdCBuZXdBbm5vdGF0aW9uUHJvbWlzZXMgPSBzdHJ1Y3RUcmVlUm9vdCA9PT0gdW5kZWZpbmVkID8gcHJvbWlzZXMgOiBbXTsKICAgICAgICBmb3IgKGNvbnN0IFtwYWdlSW5kZXgsIGFubm90YXRpb25zXSBvZiBuZXdBbm5vdGF0aW9uc0J5UGFnZSkgewogICAgICAgICAgbmV3QW5ub3RhdGlvblByb21pc2VzLnB1c2gocGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihwYWdlID0+IHsKICAgICAgICAgICAgY29uc3QgdGFzayA9IG5ldyBXb3JrZXJUYXNrKGBTYXZlIChlZGl0b3IpOiBwYWdlICR7cGFnZUluZGV4fWApOwogICAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICAgIHJldHVybiBwYWdlLnNhdmVOZXdBbm5vdGF0aW9ucyhoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9ucywgaW1hZ2VQcm9taXNlcywgY2hhbmdlcykuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJ1Y3RUcmVlUm9vdCA9PT0gbnVsbCkgewogICAgICAgICAgcHJvbWlzZXMucHVzaChQcm9taXNlLmFsbChuZXdBbm5vdGF0aW9uUHJvbWlzZXMpLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICAgICAgICBhd2FpdCBTdHJ1Y3RUcmVlUm9vdC5jcmVhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgICAgICAgICAgICBuZXdBbm5vdGF0aW9uc0J5UGFnZSwKICAgICAgICAgICAgICB4cmVmLAogICAgICAgICAgICAgIGNhdGFsb2dSZWYsCiAgICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgICBjaGFuZ2VzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkpOwogICAgICAgIH0gZWxzZSBpZiAoc3RydWN0VHJlZVJvb3QpIHsKICAgICAgICAgIHByb21pc2VzLnB1c2goUHJvbWlzZS5hbGwobmV3QW5ub3RhdGlvblByb21pc2VzKS50aGVuKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgYXdhaXQgc3RydWN0VHJlZVJvb3QudXBkYXRlU3RydWN0dXJlVHJlZSh7CiAgICAgICAgICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UsCiAgICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgICBjaGFuZ2VzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNQdXJlWGZhKSB7CiAgICAgICAgcHJvbWlzZXMucHVzaChwZGZNYW5hZ2VyLnNlcmlhbGl6ZVhmYURhdGEoYW5ub3RhdGlvblN0b3JhZ2UpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGxldCBwYWdlSW5kZXggPSAwOyBwYWdlSW5kZXggPCBudW1QYWdlczsgcGFnZUluZGV4KyspIHsKICAgICAgICAgIHByb21pc2VzLnB1c2gocGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soYFNhdmU6IHBhZ2UgJHtwYWdlSW5kZXh9YCk7CiAgICAgICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgcmV0dXJuIHBhZ2Uuc2F2ZShoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHJlZnMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICAgIGxldCB4ZmFEYXRhID0gbnVsbDsKICAgICAgaWYgKGlzUHVyZVhmYSkgewogICAgICAgIHhmYURhdGEgPSByZWZzWzBdOwogICAgICAgIGlmICgheGZhRGF0YSkgewogICAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5zaXplID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKICAgICAgfQogICAgICBjb25zdCBuZWVkQXBwZWFyYW5jZXMgPSBhY3JvRm9ybVJlZiAmJiBhY3JvRm9ybSBpbnN0YW5jZW9mIERpY3QgJiYgY2hhbmdlcy52YWx1ZXMoKS5zb21lKHJlZiA9PiByZWYubmVlZEFwcGVhcmFuY2VzKTsKICAgICAgY29uc3QgeGZhID0gYWNyb0Zvcm0gaW5zdGFuY2VvZiBEaWN0ICYmIGFjcm9Gb3JtLmdldCgiWEZBIikgfHwgbnVsbDsKICAgICAgbGV0IHhmYURhdGFzZXRzUmVmID0gbnVsbDsKICAgICAgbGV0IGhhc1hmYURhdGFzZXRzRW50cnkgPSBmYWxzZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeGZhKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHhmYS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgICBpZiAoeGZhW2ldID09PSAiZGF0YXNldHMiKSB7CiAgICAgICAgICAgIHhmYURhdGFzZXRzUmVmID0geGZhW2kgKyAxXTsKICAgICAgICAgICAgaGFzWGZhRGF0YXNldHNFbnRyeSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh4ZmFEYXRhc2V0c1JlZiA9PT0gbnVsbCkgewogICAgICAgICAgeGZhRGF0YXNldHNSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh4ZmEpIHsKICAgICAgICB3YXJuKCJVbnN1cHBvcnRlZCBYRkEgdHlwZS4iKTsKICAgICAgfQogICAgICBsZXQgbmV3WHJlZkluZm8gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBpZiAoeHJlZi50cmFpbGVyKSB7CiAgICAgICAgY29uc3QgaW5mb09iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgY29uc3QgeHJlZkluZm8gPSB4cmVmLnRyYWlsZXIuZ2V0KCJJbmZvIikgfHwgbnVsbDsKICAgICAgICBpZiAoeHJlZkluZm8gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB4cmVmSW5mbykgewogICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgIGluZm9PYmpba2V5XSA9IHN0cmluZ1RvUERGU3RyaW5nKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXdYcmVmSW5mbyA9IHsKICAgICAgICAgIHJvb3RSZWY6IGNhdGFsb2dSZWYsCiAgICAgICAgICBlbmNyeXB0UmVmOiB4cmVmLnRyYWlsZXIuZ2V0UmF3KCJFbmNyeXB0IikgfHwgbnVsbCwKICAgICAgICAgIG5ld1JlZjogeHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKSwKICAgICAgICAgIGluZm9SZWY6IHhyZWYudHJhaWxlci5nZXRSYXcoIkluZm8iKSB8fCBudWxsLAogICAgICAgICAgaW5mbzogaW5mb09iaiwKICAgICAgICAgIGZpbGVJZHM6IHhyZWYudHJhaWxlci5nZXQoIklEIikgfHwgbnVsbCwKICAgICAgICAgIHN0YXJ0WFJlZjogbGluZWFyaXphdGlvbiA/IHN0YXJ0WFJlZiA6IHhyZWYubGFzdFhSZWZTdHJlYW1Qb3MgPz8gc3RhcnRYUmVmLAogICAgICAgICAgZmlsZW5hbWUKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBpbmNyZW1lbnRhbFVwZGF0ZSh7CiAgICAgICAgb3JpZ2luYWxEYXRhOiBzdHJlYW0uYnl0ZXMsCiAgICAgICAgeHJlZkluZm86IG5ld1hyZWZJbmZvLAogICAgICAgIGNoYW5nZXMsCiAgICAgICAgeHJlZiwKICAgICAgICBoYXNYZmE6ICEheGZhLAogICAgICAgIHhmYURhdGFzZXRzUmVmLAogICAgICAgIGhhc1hmYURhdGFzZXRzRW50cnksCiAgICAgICAgbmVlZEFwcGVhcmFuY2VzLAogICAgICAgIGFjcm9Gb3JtUmVmLAogICAgICAgIGFjcm9Gb3JtLAogICAgICAgIHhmYURhdGEsCiAgICAgICAgdXNlWHJlZlN0cmVhbTogaXNEaWN0KHhyZWYudG9wRGljdCwgIlhSZWYiKQogICAgICB9KS5maW5hbGx5KCgpID0+IHsKICAgICAgICB4cmVmLnJlc2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRPcGVyYXRvckxpc3QiLCBmdW5jdGlvbiAoZGF0YSwgc2luaykgewogICAgICBjb25zdCBwYWdlSW5kZXggPSBkYXRhLnBhZ2VJbmRleDsKICAgICAgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgV29ya2VyVGFzayhgR2V0T3BlcmF0b3JMaXN0OiBwYWdlICR7cGFnZUluZGV4fWApOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOwogICAgICAgIHBhZ2UuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgICAgIGhhbmRsZXIsCiAgICAgICAgICBzaW5rLAogICAgICAgICAgdGFzaywKICAgICAgICAgIGludGVudDogZGF0YS5pbnRlbnQsCiAgICAgICAgICBjYWNoZUtleTogZGF0YS5jYWNoZUtleSwKICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBkYXRhLmFubm90YXRpb25TdG9yYWdlLAogICAgICAgICAgbW9kaWZpZWRJZHM6IGRhdGEubW9kaWZpZWRJZHMKICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChvcGVyYXRvckxpc3RJbmZvKSB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgaWYgKHN0YXJ0KSB7CiAgICAgICAgICAgIGluZm8oYHBhZ2U9JHtwYWdlSW5kZXggKyAxfSAtIGdldE9wZXJhdG9yTGlzdDogdGltZT1gICsgYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zLCBsZW49JHtvcGVyYXRvckxpc3RJbmZvLmxlbmd0aH1gKTsKICAgICAgICAgIH0KICAgICAgICAgIHNpbmsuY2xvc2UoKTsKICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgaWYgKHRhc2sudGVybWluYXRlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRUZXh0Q29udGVudCIsIGZ1bmN0aW9uIChkYXRhLCBzaW5rKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBwYWdlSW5kZXgsCiAgICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24KICAgICAgfSA9IGRhdGE7CiAgICAgIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soIkdldFRleHRDb250ZW50OiBwYWdlICIgKyBwYWdlSW5kZXgpOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOwogICAgICAgIHBhZ2UuZXh0cmFjdFRleHRDb250ZW50KHsKICAgICAgICAgIGhhbmRsZXIsCiAgICAgICAgICB0YXNrLAogICAgICAgICAgc2luaywKICAgICAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50LAogICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24KICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBpZiAoc3RhcnQpIHsKICAgICAgICAgICAgaW5mbyhgcGFnZT0ke3BhZ2VJbmRleCArIDF9IC0gZ2V0VGV4dENvbnRlbnQ6IHRpbWU9YCArIGAke0RhdGUubm93KCkgLSBzdGFydH1tc2ApOwogICAgICAgICAgfQogICAgICAgICAgc2luay5jbG9zZSgpOwogICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBpZiAodGFzay50ZXJtaW5hdGVkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFN0cnVjdFRyZWUiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKGRhdGEucGFnZUluZGV4KS50aGVuKHBhZ2UgPT4gcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgImdldFN0cnVjdFRyZWUiKSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkZvbnRGYWxsYmFjayIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmZvbnRGYWxsYmFjayhkYXRhLmlkLCBoYW5kbGVyKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiQ2xlYW51cCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmNsZWFudXAodHJ1ZSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIlRlcm1pbmF0ZSIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHRlcm1pbmF0ZWQgPSB0cnVlOwogICAgICBjb25zdCB3YWl0T24gPSBbXTsKICAgICAgaWYgKHBkZk1hbmFnZXIpIHsKICAgICAgICBwZGZNYW5hZ2VyLnRlcm1pbmF0ZShuZXcgQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CiAgICAgICAgY29uc3QgY2xlYW51cFByb21pc2UgPSBwZGZNYW5hZ2VyLmNsZWFudXAoKTsKICAgICAgICB3YWl0T24ucHVzaChjbGVhbnVwUHJvbWlzZSk7CiAgICAgICAgcGRmTWFuYWdlciA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xlYXJHbG9iYWxDYWNoZXMoKTsKICAgICAgfQogICAgICBjYW5jZWxYSFJzPy4obmV3IEFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpOwogICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgV29ya2VyVGFza3MpIHsKICAgICAgICB3YWl0T24ucHVzaCh0YXNrLmZpbmlzaGVkKTsKICAgICAgICB0YXNrLnRlcm1pbmF0ZSgpOwogICAgICB9CiAgICAgIHJldHVybiBQcm9taXNlLmFsbCh3YWl0T24pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIGhhbmRsZXIuZGVzdHJveSgpOwogICAgICAgIGhhbmRsZXIgPSBudWxsOwogICAgICB9KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiUmVhZHkiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICBzZXR1cERvYyhkb2NQYXJhbXMpOwogICAgICBkb2NQYXJhbXMgPSBudWxsOwogICAgfSk7CiAgICByZXR1cm4gd29ya2VySGFuZGxlck5hbWU7CiAgfQogIHN0YXRpYyBpbml0aWFsaXplRnJvbVBvcnQocG9ydCkgewogICAgY29uc3QgaGFuZGxlciA9IG5ldyBNZXNzYWdlSGFuZGxlcigid29ya2VyIiwgIm1haW4iLCBwb3J0KTsKICAgIHRoaXMuc2V0dXAoaGFuZGxlciwgcG9ydCk7CiAgICBoYW5kbGVyLnNlbmQoInJlYWR5IiwgbnVsbCk7CiAgfQp9Cgo7Ly8gLi9zcmMvcGRmLndvcmtlci5qcwoKY29uc3QgcGRmanNWZXJzaW9uID0gIjUuMS45MSI7CmNvbnN0IHBkZmpzQnVpbGQgPSAiNDVjYmU4YmIwIjsKCnZhciBfX3dlYnBhY2tfZXhwb3J0c19fV29ya2VyTWVzc2FnZUhhbmRsZXIgPSBfX3dlYnBhY2tfZXhwb3J0c19fLldvcmtlck1lc3NhZ2VIYW5kbGVyOwpleHBvcnQgeyBfX3dlYnBhY2tfZXhwb3J0c19fV29ya2VyTWVzc2FnZUhhbmRsZXIgYXMgV29ya2VyTWVzc2FnZUhhbmRsZXIgfTsKCi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBkZi53b3JrZXIubWpzLm1hcA==", import.meta.url).toString();
const I = t, g = wi(1), C = wi([]), i = wi(""), e = wi(1);
let A = null;
const s = () => {
let d = 0;
window.screen.width > 1440 ? d = 1.4 : d = 1.2, !(g.value >= d) && (g.value = g.value + 0.1, n());
}, l = () => {
g.value <= 1 || (g.value = g.value - 0.1, n());
}, n = async () => {
A = await fdg(I.data).promise, C.value = A.numPages, a();
}, a = async (d = 1) => {
e.value = d;
const o = await A.getPage(d), c = document.getElementById("the_canvas" + d), r = c.getContext("2d"), h = window.devicePixelRatio || 1, b = r.webkitBackingStorePixelRatio || r.mozBackingStorePixelRatio || r.msBackingStorePixelRatio || r.oBackingStorePixelRatio || r.backingStorePixelRatio || 1, u = h / b, m = o.getViewport({ scale: g.value });
c.width = m.width * u, c.height = m.height * u, c.style.width = m.width + "px", i.value = m.width + "px", c.style.height = m.height + "px", r.setTransform(u, 0, 0, u, 0, 0);
const Z = {
canvasContext: r,
viewport: m
};
o.render(Z), C.value > d && setTimeout(() => a(d + 1));
};
return tG(() => {
n();
}), (d, o) => (Ug(), Pg("div", Hdg, [
tC("div", { class: "pdf_down" }, [
tC("div", {
class: "pdf_set_left",
onClick: s
}, "➕"),
tC("div", {
class: "pdf_set_middle",
onClick: l
}, "➖")
]),
tC("div", {
style: Ae({ width: i.value, margin: "0 auto" })
}, [
(Ug(!0), Pg(ct, null, vi(C.value, (c) => (Ug(), Pg("canvas", {
id: "the_canvas" + c,
key: c
}, null, 8, Xdg))), 128))
], 4)
]));
}
}, Ddg = /* @__PURE__ */ V0(Sdg, [["__scopeId", "data-v-58fcf604"]]);
async function Kdg(t, I) {
const g = iG(Ddg, { data: t });
return g.mount(I), {
$el: I,
$destroy() {
g.unmount();
}
};
}
const Fdg = ["src"], kdg = ["src"], zdg = {
__name: "ImageViewer",
props: {
image: String,
srcList: Array
},
setup(t) {
const I = t, g = wi(!1), C = wi(0), i = DA(() => {
const d = Array.isArray(I.srcList) ? I.srcList : [];
if (d.length) return d.map((c) => String(c || "")).filter(Boolean);
const o = String(I.image || "");
return o ? [o] : [];
}), e = DA(() => ({
visible: g.value,
open: A,
close: s,
next: l,
prev: n
}));
function A(d = 0) {
i.value.length && (C.value = Math.max(0, Math.min(i.value.length - 1, Number(d) || 0)), g.value = !0);
}
function s() {
g.value = !1;
}
function l() {
i.value.length <= 1 || (C.value = (C.value + 1) % i.value.length);
}
function n() {
i.value.length <= 1 || (C.value = (C.value - 1 + i.value.length) % i.value.length);
}
function a(d) {
g.value && (d.key === "Escape" && s(), d.key === "ArrowRight" && l(), d.key === "ArrowLeft" && n());
}
return tG(() => {
window.addEventListener("keydown", a);
}), s9(() => {
window.removeEventListener("keydown", a);
}), (d, o) => (Ug(), Pg("div", null, [
d$(d.$slots, "image", {
src: i.value[0],
srcList: i.value,
index: C.value,
preview: e.value
}, () => [
i.value[0] ? (Ug(), Pg("img", {
key: 0,
class: "image",
src: i.value[0],
alt: "",
onClick: o[0] || (o[0] = (c) => A(0))
}, null, 8, Fdg)) : Yt("", !0)
], !0),
g.value ? (Ug(), Pg("div", {
key: 0,
class: "viewfile-image-preview",
onClick: ah(s, ["self"])
}, [
tC("button", {
class: "viewfile-image-preview-close",
type: "button",
onClick: s
}, "×"),
i.value.length > 1 ? (Ug(), Pg("button", {
key: 0,
class: "viewfile-image-preview-prev",
type: "button",
onClick: ah(n, ["stop"])
}, "‹")) : Yt("", !0),
tC("img", {
class: "viewfile-image-preview-img",
src: i.value[C.value],
alt: ""
}, null, 8, kdg),
i.value.length > 1 ? (Ug(), Pg("button", {
key: 1,
class: "viewfile-image-preview-next",
type: "button",
onClick: ah(l, ["stop"])
}, "›")) : Yt("", !0)
])) : Yt("", !0)
]));
}
}, Jdg = /* @__PURE__ */ V0(zdg, [["__scopeId", "data-v-00723940"]]);
async function Ldg(t, I) {
const g = await Nig(t), C = iG(Jdg, { image: g });
return C.mount(I), {
$el: I,
$destroy() {
C.unmount();
}
};
}
const vdg = { class: "code-area" }, Tdg = {
__name: "CodeViewer",
props: {
value: {
type: String,
description: "值"
}
},
setup(t) {
return (I, g) => (Ug(), Pg("pre", vdg, " " + um(t.value) + `
`, 1));
}
}, xdg = /* @__PURE__ */ V0(Tdg, [["__scopeId", "data-v-215846b2"]]);
async function jdg(t, I) {
const g = await gGg(t), C = iG(xdg, { value: g });
return C.mount(I), {
$el: I,
$destroy() {
C.unmount();
}
};
}
function gI(t) {
const I = Number(t);
return Number.isFinite(I) ? I : 0;
}
function G8(t) {
const I = Number.parseFloat(String(t ?? ""));
return Number.isFinite(I) ? I : 0;
}
function cG(t, I) {
return `${t}-${I}`;
}
function dh(t) {
if (!t) return "";
try {
const g = new DOMParser().parseFromString(t, "text/html");
return ["script", "style", "iframe", "object", "embed", "link", "meta"].forEach((i) => {
g.querySelectorAll(i).forEach((e) => e.remove());
}), g.querySelectorAll("*").forEach((i) => {
Array.from(i.attributes).forEach((A) => {
const s = A.name.toLowerCase(), l = String(A.value || "").trim().toLowerCase();
s.startsWith("on") && i.removeAttribute(A.name), (s === "href" || s === "src") && l.startsWith("javascript:") && i.removeAttribute(A.name);
});
const e = i.getAttribute("style");
if (e) {
let A = e.replace(/font-size\s*:\s*([\d.]+)pt/gi, (s, l) => {
const n = Number(l);
return Number.isFinite(n) ? `font-size: ${(n * 96 / 72).toFixed(3).replace(/\.0+$/, "").replace(/(\.\d*?)0+$/, "$1")}px` : s;
});
/text-align\s*:\s*justify/i.test(A) && (/text-align-last/i.test(A) || (A += ";text-align-last:justify"), /text-justify/i.test(A) || (A += ";text-justify:inter-character")), A !== e && i.setAttribute("style", A);
}
}), g.body.innerHTML;
} catch {
return t;
}
}
function Qdg(t, I) {
const g = gI(t.order) || I;
return `${t.type || "el"}-${g}`;
}
function KI(t, I, g) {
const C = gI(t.order) || I, e = `${String(t.type || "el")}-${C}`;
return g ? `${g}/${e}` : e;
}
function DIg(t) {
const g = [t.radius, t.cornerRadius, t.rx].map(gI).find((C) => C > 0) || 0;
return g ? `${g}px` : void 0;
}
function CM(t) {
const I = String(t.borderColor ?? t.stroke ?? t.lineColor ?? ""), g = gI(t.borderWidth ?? t.strokeWidth ?? t.lineWidth), C = String(t.borderStrokeDasharray ?? t.strokeDasharray ?? t.dasharray ?? ""), i = t.border && typeof t.border == "object" ? t.border : null, e = t.line && typeof t.line == "object" ? t.line : null, A = String((i == null ? void 0 : i.color) ?? (e == null ? void 0 : e.color) ?? ""), s = gI((i == null ? void 0 : i.width) ?? (e == null ? void 0 : e.width)), l = String((i == null ? void 0 : i.dasharray) ?? (e == null ? void 0 : e.dasharray) ?? ""), n = I || A, a = g || s, d = (C && C !== "0" ? C : "") || (l && l !== "0" ? l : "");
return {
color: n || "transparent",
width: Math.max(0, a),
dasharray: d || void 0
};
}
function Odg(t) {
const I = (t == null ? void 0 : t.ph) ?? (t == null ? void 0 : t.placeholder) ?? (t == null ? void 0 : t.placeHolder) ?? null, g = String((I == null ? void 0 : I.type) ?? (I == null ? void 0 : I.phType) ?? (t == null ? void 0 : t.phType) ?? (t == null ? void 0 : t.placeholderType) ?? "").trim().toLowerCase(), C = gI((I == null ? void 0 : I.idx) ?? (I == null ? void 0 : I.phIdx) ?? (t == null ? void 0 : t.phIdx) ?? (t == null ? void 0 : t.idx) ?? (t == null ? void 0 : t.placeholderIdx) ?? (t == null ? void 0 : t.phIndex)), i = String((I == null ? void 0 : I.id) ?? (t == null ? void 0 : t.phId) ?? (t == null ? void 0 : t.placeholderId) ?? "").trim();
return !g && !C && !i ? null : { type: g, idx: C, id: i };
}
function w8(t) {
const I = Odg(t);
if (!I) return "";
const g = I.id || (I.idx ? String(I.idx) : "");
return g ? `${I.type || "ph"}:${g}` : `${I.type || "ph"}`;
}
function Udg(t) {
const I = String(t || "").trim();
return I ? /click to add/i.test(I) || /单击.*添加/.test(I) || /点击.*添加/.test(I) || /添加(标题|文本|内容)/.test(I) : !1;
}
function xY(t) {
const I = gI(t);
return I ? I > 1 ? Math.max(0, Math.min(1, I / 100)) : Math.max(0, Math.min(1, I)) : 0;
}
function KIg(t) {
const I = t == null ? void 0 : t.rect, g = t == null ? void 0 : t.crop, C = I && typeof I == "object" ? I : g && typeof g == "object" ? g : null;
if (!C) return null;
const i = xY(C.t), e = xY(C.b), A = xY(C.l), s = xY(C.r);
if (!i && !e && !A && !s) return null;
const l = Math.max(0, Math.min(0.9, A)), n = Math.max(0, Math.min(0.9, s)), a = Math.max(0, Math.min(0.9, i)), d = Math.max(0, Math.min(0.9, e));
return l + n >= 0.98 || a + d >= 0.98 ? null : { t: a, b: d, l, r: n };
}
function Edg(t) {
return String((t == null ? void 0 : t.geom) || (t == null ? void 0 : t.shapeType) || "").toLowerCase();
}
function FIg(t) {
const I = Edg(t);
return {
width: "100%",
height: "100%",
position: "relative",
overflow: "hidden",
borderRadius: I === "ellipse" || I === "circle" ? "50%" : DIg(t)
};
}
function EH(t, I = 1) {
if (t == null) return I;
const g = gI(t);
if (!g) return I;
const C = g > 10 ? g / 100 : g;
return Math.max(0, Math.min(3, C));
}
function Pdg(t) {
const I = t == null ? void 0 : t.filters;
if (!I || typeof I != "object") return;
const g = EH(I.brightness, 1), C = EH(I.contrast, 1), i = EH(I.saturation, 1), e = gI(I.colorTemperature), A = [];
if (g !== 1 && A.push(`brightness(${g})`), C !== 1 && A.push(`contrast(${C})`), i !== 1 && A.push(`saturate(${i})`), e) {
const s = Math.max(-100, Math.min(100, e)), l = s * 0.6, n = Math.min(1, Math.abs(s) / 200);
A.push(`hue-rotate(${l}deg)`), s > 0 && n && A.push(`sepia(${n})`);
}
return A.length ? A.join(" ") : void 0;
}
function kIg(t) {
const I = KIg(t), g = Pdg(t);
if (!I)
return {
width: "100%",
height: "100%",
objectFit: "fill",
filter: g,
display: "block"
};
const C = 1 / (1 - I.l - I.r), i = 1 / (1 - I.t - I.b), e = -I.l * 100, A = -I.t * 100;
return {
width: "100%",
height: "100%",
objectFit: "fill",
display: "block",
transformOrigin: "top left",
transform: `translate(${e}%, ${A}%) scale(${C}, ${i})`,
filter: g
};
}
function tA(t) {
var i, e, A, s;
const I = typeof t.fill == "object" && t.fill ? t.fill : null, C = [
t.src,
t.url,
t.picBase64,
t.mediaBase64,
t.base64,
t.blob,
t.blobUrl,
(i = t.value) == null ? void 0 : i.picBase64,
(e = t.value) == null ? void 0 : e.src,
(A = I == null ? void 0 : I.value) == null ? void 0 : A.picBase64,
(s = I == null ? void 0 : I.value) == null ? void 0 : s.src
].find((l) => typeof l == "string" && l.trim());
return C ? String(C) : "";
}
function tM(t) {
const I = String(t.type || "").toLowerCase();
return I === "shape" || I === "rect" || I === "line";
}
function y9(t) {
var g, C;
if (typeof t.fill == "object" && ((g = t.fill) == null ? void 0 : g.type) === "image") return !0;
if (typeof t.fill == "object" && t.fill) {
const i = (C = t.fill) == null ? void 0 : C.value;
if (i && (typeof i.picBase64 == "string" || typeof i.src == "string") || typeof t.fill.picBase64 == "string" || typeof t.fill.src == "string") return !0;
}
const I = String(t.type || "").toLowerCase();
return I === "pic" || I === "picture";
}
function Y9(t) {
const I = String(t.type || "").toLowerCase();
if (y9(t)) return !1;
if (I === "image" || I === "pic" || I === "picture") return !0;
const g = tA(t);
return !!g && /^data:image\//i.test(g);
}
function N9(t) {
if (String(t.type || "").toLowerCase() === "video") return !0;
const g = tA(t);
return !!g && /^data:video\//i.test(g);
}
function V9(t) {
if (String(t.type || "").toLowerCase() === "audio") return !0;
const g = tA(t);
return !!g && /^data:audio\//i.test(g);
}
function zIg(t) {
return String(t.type || "").toLowerCase() === "table";
}
function JIg(t) {
const I = String(t.type || "").toLowerCase();
return I === "chart" || I === "charts";
}
function LIg(t) {
const I = String(t.type || "").toLowerCase();
return I === "group" || I === "groupshape" || I === "grpsp" || I === "grp" || [t == null ? void 0 : t.elements, t == null ? void 0 : t.children, t == null ? void 0 : t.childrens, t == null ? void 0 : t.items, t == null ? void 0 : t.spTree].some((i) => Array.isArray(i) && i.length) ? !0 : I.includes("group");
}
function vIg(t) {
const I = String(t.type || "").toLowerCase();
return I === "math" || I === "equation";
}
function TIg(t) {
const I = String(t.type || "").toLowerCase();
return I === "diagram" || I === "smartart" || I === "smart_art";
}
function _dg(t) {
var I, g, C, i, e;
if (!t || !t.type) return "#fff";
if (t.type === "color") return String(t.value || "#fff");
if (t.type === "gradient") {
const A = Array.isArray((I = t.value) == null ? void 0 : I.colors) ? t.value.colors : [], s = gI((g = t.value) == null ? void 0 : g.rot), l = String(((C = t.value) == null ? void 0 : C.path) || "rect"), n = A.map((a) => {
const d = String((a == null ? void 0 : a.pos) ?? ""), o = String((a == null ? void 0 : a.color) ?? "");
return o ? d ? `${o} ${d}` : o : "";
}).filter(Boolean).join(", ");
return n ? l === "rect" ? `linear-gradient(${(90 - s + 360) % 360}deg, ${n})` : `radial-gradient(circle, ${n})` : "#fff";
}
if (t.type === "image") {
const A = String(((i = t.value) == null ? void 0 : i.picBase64) || ((e = t.value) == null ? void 0 : e.src) || "");
return A ? `center / cover no-repeat url(${A})` : "#fff";
}
return "#fff";
}
function qdg(t, I) {
const g = gI(t.order) || I, i = (t == null ? void 0 : t.__source) === "slide" ? 1e5 : 0;
return g + i;
}
function xIg(t) {
const I = t == null ? void 0 : t.shadow;
if (!I || typeof I != "object") return;
const g = gI(I.h), C = gI(I.v), i = Math.max(0, gI(I.blur)), e = String(I.color || "").trim();
if (!(!e || !g && !C && !i))
return `drop-shadow(${g}px ${C}px ${i}px ${e})`;
}
function jIg(t) {
if (tM(t)) return;
const I = CM(t);
if (I.width)
return `${I.width}px solid ${I.color}`;
}
function QIg(t) {
var g, C, i;
if (tM(t) || y9(t) || Y9(t) || N9(t) || V9(t)) return;
if (typeof t.fill == "string") {
const e = t.fill.trim();
return e || void 0;
}
const I = typeof t.fill == "object" && t.fill ? t.fill : null;
if (!(!I || !I.type)) {
if (I.type === "color") return String(I.value || "") || void 0;
if (I.type === "gradient") {
const e = Array.isArray((g = I.value) == null ? void 0 : g.colors) ? I.value.colors : [], A = gI((C = I.value) == null ? void 0 : C.rot), s = String(((i = I.value) == null ? void 0 : i.path) || "rect"), l = e.map((n) => {
const a = String((n == null ? void 0 : n.pos) ?? ""), d = String((n == null ? void 0 : n.color) ?? "");
return d ? a ? `${d} ${a}` : d : "";
}).filter(Boolean).join(", ");
return l ? s === "rect" ? `linear-gradient(${(90 - A + 360) % 360}deg, ${l})` : `radial-gradient(circle, ${l})` : void 0;
}
}
}
function $dg(t, I) {
const g = gI(t.left), C = gI(t.top), i = Math.max(0, gI(t.width)), e = Math.max(0, gI(t.height)), A = gI(t.rotate), s = !!t.isFlipH, l = !!t.isFlipV, n = qdg(t, I), a = t.opacity == null ? 1 : Math.max(0, Math.min(1, gI(t.opacity))), d = [];
A && d.push(`rotate(${A}deg)`), s && d.push("scaleX(-1)"), l && d.push("scaleY(-1)");
const o = QIg(t), c = jIg(t), r = DIg(t), h = xIg(t);
return {
position: "absolute",
left: `${g}px`,
top: `${C}px`,
width: `${i}px`,
height: `${e}px`,
zIndex: n,
opacity: a,
background: o,
border: c,
borderRadius: r,
filter: h,
transformOrigin: "center center",
transform: d.length ? d.join(" ") : void 0
};
}
function aV(t) {
return {
position: "absolute",
left: 0,
top: 0,
width: "100%",
height: "100%",
display: "table"
};
}
function oV(t) {
const I = t == null ? void 0 : t.autoFit, g = I && typeof I == "object" ? gI(I.fontScale) : 1, C = g && g !== 1 ? Math.max(0.1, Math.min(5, g)) : 1, i = !!(t != null && t.isVertical), e = i ? "vertical-rl" : void 0, A = i ? "mixed" : void 0, s = String(t.vAlign || "up"), l = s === "down" ? "bottom" : s === "mid" ? "middle" : "top";
return C === 1 ? {
display: "table-cell",
width: "100%",
height: "100%",
verticalAlign: l,
writingMode: e,
textOrientation: A
} : {
display: "table-cell",
// width: `${inv}%`,
// height: `${inv}%`,
width: "100%",
height: "100%",
position: "absolute",
left: 0,
top: 0,
verticalAlign: l,
// transformOrigin: "top left",
// transform: `scale(${fontScale})`,
writingMode: e,
textOrientation: A
};
}
const Ku = /* @__PURE__ */ new Map();
function Ti(t, I, g) {
var w;
const C = `c-${cG(I, g)}`, i = Ku.get(C);
if (i) return i;
const e = Math.max(1, gI(t.width)), A = Math.max(1, gI(t.height)), s = String((t == null ? void 0 : t.chartType) || "").toLowerCase(), l = Array.isArray(t == null ? void 0 : t.colors) ? t.colors : [], n = l.length ? l.map((W) => String(W || "").trim()).filter(Boolean) : [], a = (W) => n[W % Math.max(1, n.length)] || "#4e79a7", d = t.opacity == null ? 1 : Math.max(0, Math.min(1, gI(t.opacity))), o = Math.max(4, Math.min(24, Math.round(Math.min(e, A) * 0.08))), c = s.includes("pie") || s.includes("doughnut"), r = s.includes("bar") || s.includes("col");
if (s.includes("scatter") || s.includes("bubble")) {
const W = t == null ? void 0 : t.data, y = Array.isArray(W == null ? void 0 : W[0]) ? W[0] : [], f = Array.isArray(W == null ? void 0 : W[1]) ? W[1] : [], D = Math.min(y.length, f.length), F = D ? Math.min(...y.slice(0, D)) : 0, T = D ? Math.max(...y.slice(0, D)) : 1, Q = D ? Math.min(...f.slice(0, D)) : 0, P = D ? Math.max(...f.slice(0, D)) : 1, L = T - F || 1, E = P - Q || 1, J = Math.max(1, e - o * 2), k = Math.max(1, A - o * 2), j = [];
for (let Cg = 0; Cg < D; Cg++) {
const Ig = o + (y[Cg] - F) / L * J, x = o + (1 - (f[Cg] - Q) / E) * k;
j.push({ cx: Ig, cy: x, r: 3, fill: a(0), opacity: d });
}
const q = { kind: "scatter", bars: [], paths: [], points: j, slices: [], cx: 0, cy: 0, holeR: 0 };
return Ku.set(C, q), q;
}
const b = t == null ? void 0 : t.data;
if (c) {
const W = Array.isArray(b) ? b : [], f = (Array.isArray((w = W == null ? void 0 : W[0]) == null ? void 0 : w.values) ? W[0].values : []).map((k) => ({ y: gI(k == null ? void 0 : k.y), x: String((k == null ? void 0 : k.x) ?? "") })).filter((k) => Number.isFinite(k.y) && k.y > 0), D = f.reduce((k, j) => k + j.y, 0) || 1, F = e / 2, T = A / 2, Q = Math.max(2, Math.min(e, A) / 2 - o), P = s.includes("doughnut") ? Q * 0.55 : 0;
let L = -Math.PI / 2;
const E = [];
f.forEach((k, j) => {
const q = k.y / D * Math.PI * 2, Cg = L + q, Ig = F + Q * Math.cos(L), x = T + Q * Math.sin(L), Ag = F + Q * Math.cos(Cg), eg = T + Q * Math.sin(Cg), O = q > Math.PI ? 1 : 0, _ = `M ${F} ${T} L ${Ig} ${x} A ${Q} ${Q} 0 ${O} 1 ${Ag} ${eg} Z`;
E.push({ d: _, fill: a(j), opacity: d }), L = Cg;
});
const J = { kind: "pie", bars: [], paths: [], points: [], slices: E, cx: F, cy: T, holeR: P };
return Ku.set(C, J), J;
}
const m = (Array.isArray(b) ? b : []).map((W) => {
const f = (Array.isArray(W == null ? void 0 : W.values) ? W.values : []).map((D) => ({ y: gI(D == null ? void 0 : D.y), x: String((D == null ? void 0 : D.x) ?? "") })).filter((D) => Number.isFinite(D.y));
return {
name: String((W == null ? void 0 : W.name) ?? ""),
values: f
};
}).filter((W) => W.values.length), Z = Array.from(new Set(m.flatMap((W) => W.values.map((y) => y.x)).filter((W) => W != null).map((W) => String(W)))), p = Math.max(1, Z.length), Y = Math.max(1, m.length), R = Math.max(1, ...m.flatMap((W) => W.values.map((y) => y.y)).filter((W) => Number.isFinite(W))), X = Math.max(1, e - o * 2), H = Math.max(1, A - o * 2), S = String((t == null ? void 0 : t.barDir) || "col").toLowerCase();
if (r) {
const W = [];
if (S === "bar") {
const f = H / p, D = f * 0.8, F = (f - D) / 2, T = D / Y;
for (let Q = 0; Q < p; Q++)
for (let P = 0; P < m.length; P++) {
const L = m[P].values.find((q) => q.x === Z[Q]), J = (L ? L.y : 0) / R * X, k = o, j = o + Q * f + F + P * T;
W.push({ x: k, y: j, w: Math.max(0, J), h: Math.max(0, T * 0.9), fill: a(P), opacity: d });
}
} else {
const f = X / p, D = f * 0.8, F = (f - D) / 2, T = D / Y;
for (let Q = 0; Q < p; Q++)
for (let P = 0; P < m.length; P++) {
const L = m[P].values.find((q) => q.x === Z[Q]), J = (L ? L.y : 0) / R * H, k = o + Q * f + F + P * T, j = o + (H - J);
W.push({ x: k, y: j, w: Math.max(0, T * 0.9), h: Math.max(0, J), fill: a(P), opacity: d });
}
}
const y = { kind: "bar", bars: W, paths: [], points: [], slices: [], cx: 0, cy: 0, holeR: 0 };
return Ku.set(C, y), y;
}
const z = [], v = [], K = Math.max(1, Math.round(Math.min(e, A) * 0.01)), V = !!(t != null && t.marker), N = (W) => o + (p === 1 ? X / 2 : W / (p - 1) * X), B = (W) => o + (1 - W / R) * H;
m.forEach((W, y) => {
let f = "";
Z.forEach((D, F) => {
const T = W.values.find((E) => E.x === D), Q = T ? T.y : 0, P = N(F), L = B(Q);
f += F === 0 ? `M ${P} ${L}` : ` L ${P} ${L}`, V && v.push({ cx: P, cy: L, r: K * 0.9 + 1, fill: a(y), opacity: d });
}), z.push({ d: f, stroke: a(y), strokeWidth: K });
});
const G = { kind: "line", bars: [], paths: z, points: v, slices: [], cx: 0, cy: 0, holeR: 0 };
return Ku.set(C, G), G;
}
const p8 = /* @__PURE__ */ new Map();
function Zm(t, I, g) {
const C = `t-${cG(I, g)}`, i = p8.get(C);
if (i) return i;
const e = t == null ? void 0 : t.data, A = Array.isArray(e) ? e : [], s = t == null ? void 0 : t.colWidths, l = t == null ? void 0 : t.rowHeights, n = Array.isArray(s) ? s.map(gI) : [], a = Array.isArray(l) ? l.map(gI) : [], d = A.map((c) => (Array.isArray(c) ? c : []).map((h) => Irg(t, h))), o = {
colWidths: n,
rowHeights: a,
rows: d
};
return p8.set(C, o), o;
}
function OIg(t, I, g, C) {
const e = Zm(t, I, g).rowHeights[C];
if (e)
return {
height: `${e}px`
};
}
function grg(t) {
const I = t.match(/text-align\s*:\s*(left|right|center|justify)/i);
return I ? I[1].toLowerCase() : "left";
}
function jY(t) {
if (!t) return "";
const I = String(t.borderColor || ""), g = Math.max(0, gI(t.borderWidth)), C = String(t.borderType || "solid");
return !I || !g ? "" : `${g}px ${C === "dashed" || C === "dash" ? "dashed" : "solid"} ${I}`;
}
function Irg(t, I) {
const g = I && typeof I == "object" ? I : {}, C = String(g.text ?? g.content ?? g.html ?? ""), i = Math.max(1, gI(g.colSpan ?? g.colspan ?? g.gridSpan) || 1), e = Math.max(1, gI(g.rowSpan ?? g.rowspan) || 1), A = gI(g.hMerge) === 1 || gI(g.vMerge) === 1, s = String(g.fillColor || "") || void 0, l = String(g.fontColor || "") || void 0, n = g.fontBold ? 700 : void 0, a = g.fontItalic ? "italic" : void 0, d = C ? grg(C) : void 0, o = g.borders || (t == null ? void 0 : t.borders) || void 0, c = jY(o == null ? void 0 : o.top), r = jY(o == null ? void 0 : o.right), h = jY(o == null ? void 0 : o.bottom), b = jY(o == null ? void 0 : o.left);
return {
html: C,
colspan: i,
rowspan: e,
skip: A,
style: {
padding: "2px 4px",
verticalAlign: "middle",
background: s,
color: l,
fontWeight: n,
fontStyle: a,
textAlign: d,
borderTop: c || void 0,
borderRight: r || void 0,
borderBottom: h || void 0,
borderLeft: b || void 0,
overflow: "hidden"
}
};
}
function M9(t) {
return t.replace(/[^a-zA-Z0-9_-]/g, "_");
}
function hs(t, I, g) {
var l, n, a;
const C = typeof t.fill == "object" ? t.fill : null;
if (!C || C.type !== "pattern" || !C.value) return null;
const i = String(((l = C.value) == null ? void 0 : l.type) || ""), e = String(((n = C.value) == null ? void 0 : n.foregroundColor) || "#000"), A = String(((a = C.value) == null ? void 0 : a.backgroundColor) || "#fff"), s = `pptx-pattern-${I}-${M9(g)}`;
return i === "pct5" ? {
id: s,
width: 10,
height: 10,
background: A,
shapes: [{ kind: "circle", cx: 5, cy: 5, r: 1.2, fill: e }]
} : i === "solidDmnd" ? {
id: s,
width: 12,
height: 12,
background: A,
shapes: [{ kind: "polygon", points: "6,0 12,6 6,12 0,6", fill: e }]
} : {
id: s,
width: 10,
height: 10,
background: A,
shapes: [{ kind: "circle", cx: 5, cy: 5, r: 1, fill: e }]
};
}
function Gm(t, I, g) {
const C = typeof t.fill == "object" ? t.fill : null;
if (!C) return null;
const i = C == null ? void 0 : C.value;
if (!(C.type === "image" || !!i && (typeof i.picBase64 == "string" || typeof i.src == "string") || typeof C.picBase64 == "string" || typeof C.src == "string")) return null;
const A = tA(t);
return A ? {
id: `pptx-shape-img-${I}-${M9(g)}`,
href: A
} : null;
}
const gA = {
pattern: /* @__PURE__ */ new Map(),
image: /* @__PURE__ */ new Map(),
gradient: /* @__PURE__ */ new Map()
};
function UIg(t, I, g) {
const C = `p-${cG(I, g)}`;
if (gA.pattern.has(C)) return gA.pattern.get(C);
const i = hs(t, I, g);
return gA.pattern.set(C, i), i;
}
function LN(t, I, g) {
const C = `i-${cG(I, g)}`;
if (gA.image.has(C)) return gA.image.get(C);
const i = Gm(t, I, g);
return gA.image.set(C, i), i;
}
function Crg(t) {
const I = String(t ?? "").trim();
if (!I) return "";
if (I.endsWith("%")) return I;
const g = Number(I);
return Number.isFinite(g) ? `${g}%` : I;
}
function ae(t, I, g) {
var m, Z, p;
const C = `g-${cG(I, g)}`;
if (gA.gradient.has(C)) return gA.gradient.get(C);
const i = typeof t.fill == "object" ? t.fill : null;
if (!i || i.type !== "gradient" || !i.value)
return gA.gradient.set(C, null), null;
const e = Array.isArray((m = i.value) == null ? void 0 : m.colors) ? i.value.colors : [], A = gI((Z = i.value) == null ? void 0 : Z.rot), s = String(((p = i.value) == null ? void 0 : p.path) || "rect"), l = e.map((Y) => {
const R = Crg(Y == null ? void 0 : Y.pos), X = String((Y == null ? void 0 : Y.color) ?? "").trim(), H = (Y == null ? void 0 : Y.alpha) ?? (Y == null ? void 0 : Y.opacity), S = H == null ? void 0 : Math.max(0, Math.min(1, gI(H)));
return X ? {
offset: R || void 0,
color: X,
opacity: S
} : null;
}).filter(Boolean), n = `pptx-grad-${I}-${M9(g)}`;
if (!l.length)
return gA.gradient.set(C, null), null;
if (s !== "rect") {
const Y = {
id: n,
kind: "radial",
stops: l.map((R) => ({ ...R, offset: R.offset || "0%" }))
};
return gA.gradient.set(C, Y), Y;
}
const a = (90 - A + 360) % 360 * (Math.PI / 180), d = Math.cos(a), o = Math.sin(a), c = 0.5 - d / 2, r = 0.5 + o / 2, h = 0.5 + d / 2, b = 0.5 - o / 2, u = {
id: n,
kind: "linear",
x1: `${Math.max(0, Math.min(1, c)) * 100}%`,
y1: `${Math.max(0, Math.min(1, r)) * 100}%`,
x2: `${Math.max(0, Math.min(1, h)) * 100}%`,
y2: `${Math.max(0, Math.min(1, b)) * 100}%`,
stops: l.map((Y) => ({ ...Y, offset: Y.offset || "0%" }))
};
return gA.gradient.set(C, u), u;
}
function EIg(t, I, g) {
return !!(ae(t, I, g) || UIg(t, I, g) || LN(t, I, g));
}
function PIg(t, I, g) {
var e;
const C = typeof t.fill == "object" ? t.fill : null, i = String(t.type || "").toLowerCase().includes("pic");
if ((!C || !C.type) && i) {
const A = LN(t, I, g);
return A ? `url(#${A.id})` : "transparent";
}
if (!C || !C.type) return "transparent";
if (C.type === "color") return String(C.value || "transparent");
if (C.type === "gradient") {
const A = ae(t, I, g);
return A ? `url(#${A.id})` : "transparent";
}
if (C.type === "pattern") {
const A = UIg(t, I, g);
return A ? `url(#${A.id})` : String(((e = C.value) == null ? void 0 : e.foregroundColor) || "transparent");
}
if (C.type === "image" || i || C.type == null && LN(t, I, g)) {
const A = LN(t, I, g);
return A ? `url(#${A.id})` : "transparent";
}
return "transparent";
}
function _Ig(t) {
return CM(t).color || "transparent";
}
function qIg(t) {
const I = CM(t);
return Math.max(0, I.width);
}
function $Ig(t) {
return CM(t).dasharray;
}
function gCg(t) {
const I = typeof t.path == "string" ? String(t.path).trim() : "";
if (I) return I;
const g = Math.max(0, gI(t.width)), C = Math.max(0, gI(t.height)), i = String(t.shapType || t.shapeType || t.geom || "").toLowerCase(), e = !!t.isFlipH, A = !!t.isFlipV;
if (i === "line" || i === "connector" || i === "straightconnector1")
return A && e ? `M ${g} ${C} L 0 0` : A ? `M 0 ${C} L ${g} 0` : e ? `M ${g} 0 L 0 ${C}` : `M 0 0 L ${g} ${C}`;
if (g <= 0 || C <= 0)
return g > 0 ? `M 0 0 L ${g} 0` : C > 0 ? `M 0 0 L 0 ${C}` : "";
if (i === "ellipse" || i === "circle") {
const l = g / 2, n = C / 2, a = g / 2, d = C / 2;
return `M ${l - a} ${n} A ${a} ${d} 0 1 0 ${l + a} ${n} A ${a} ${d} 0 1 0 ${l - a} ${n} Z`;
}
if (i === "triangle" || i === "tri")
return `M ${g / 2} 0 L ${g} ${C} L 0 ${C} Z`;
if (i === "diamond" || i === "rhombus")
return `M ${g / 2} 0 L ${g} ${C / 2} L ${g / 2} ${C} L 0 ${C / 2} Z`;
const s = Math.max(0, Math.min(Math.min(g, C) / 2, gI(t.radius || t.cornerRadius || t.rx)));
if (s) {
const l = Math.min(s, g / 2, C / 2);
return `M ${l} 0 H ${g - l} A ${l} ${l} 0 0 1 ${g} ${l} V ${C - l} A ${l} ${l} 0 0 1 ${g - l} ${C} H ${l} A ${l} ${l} 0 0 1 0 ${C - l} V ${l} A ${l} ${l} 0 0 1 ${l} 0 Z`;
}
return `M 0 0 H ${g} V ${C} H 0 Z`;
}
function trg(t) {
var C;
const I = [
t == null ? void 0 : t.elements,
t == null ? void 0 : t.children,
t == null ? void 0 : t.childrens,
t == null ? void 0 : t.items,
t == null ? void 0 : t.spTree,
(C = t == null ? void 0 : t.spTree) == null ? void 0 : C.elements
], g = [];
return I.forEach((i) => {
Array.isArray(i) && i.forEach((e) => {
e && typeof e == "object" && g.push(e);
});
}), g;
}
function irg(t) {
const I = String(t || "").match(/-?\d*\.?\d+(?:e[-+]?\d+)?/gi);
if (!I || I.length < 2) return null;
let g = 0, C = 0;
for (let i = 0; i + 1 < I.length; i += 2) {
const e = Number(I[i]), A = Number(I[i + 1]);
Number.isFinite(e) && (g = Math.max(g, Math.abs(e))), Number.isFinite(A) && (C = Math.max(C, Math.abs(A)));
}
return !g || !C ? null : { vbW: g, vbH: C };
}
function ICg(t) {
const I = (t == null ? void 0 : t.chOff) ?? (t == null ? void 0 : t.childOff) ?? (t == null ? void 0 : t.childOffset) ?? null, g = (t == null ? void 0 : t.chExt) ?? (t == null ? void 0 : t.childExt) ?? (t == null ? void 0 : t.childExtent) ?? null, C = gI((I == null ? void 0 : I.x) ?? (I == null ? void 0 : I.left) ?? (I == null ? void 0 : I.l) ?? (t == null ? void 0 : t.chOffX) ?? (t == null ? void 0 : t.childOffX)), i = gI((I == null ? void 0 : I.y) ?? (I == null ? void 0 : I.top) ?? (I == null ? void 0 : I.t) ?? (t == null ? void 0 : t.chOffY) ?? (t == null ? void 0 : t.childOffY)), e = gI((g == null ? void 0 : g.cx) ?? (g == null ? void 0 : g.w) ?? (g == null ? void 0 : g.width) ?? (t == null ? void 0 : t.chExtW) ?? (t == null ? void 0 : t.childExtW)), A = gI((g == null ? void 0 : g.cy) ?? (g == null ? void 0 : g.h) ?? (g == null ? void 0 : g.height) ?? (t == null ? void 0 : t.chExtH) ?? (t == null ? void 0 : t.childExtH));
return !e || !A ? null : { offX: C, offY: i, extW: e, extH: A };
}
function erg(t, I, g, C, i) {
const e = Math.max(0, gI(t.width)), A = Math.max(0, gI(t.height)), s = gI(I.left), l = gI(I.top), n = Math.max(0, gI(I.width)), a = Math.max(0, gI(I.height)), d = s >= -0.5 && l >= -0.5 && s + n <= e + 0.5 && l + a <= A + 0.5, o = ICg(t), c = o && e ? e / o.extW : 1, r = o && A ? A / o.extH : 1, h = d ? s : o ? (s - o.offX) * c : s - C, b = d ? l : o ? (l - o.offY) * r : l - i, u = o && !d ? n * c : n, m = o && !d ? a * r : a, Z = gI(I.rotate), p = !!I.isFlipH, Y = !!I.isFlipV, R = gI(I.order) || g, X = I.opacity == null ? 1 : Math.max(0, Math.min(1, gI(I.opacity))), H = [];
Z && H.push(`rotate(${Z}deg)`), p && H.push("scaleX(-1)"), Y && H.push("scaleY(-1)");
const S = QIg(I), z = jIg(I), v = xIg(I);
return {
position: "absolute",
left: `${h}px`,
top: `${b}px`,
width: `${u}px`,
height: `${m}px`,
zIndex: R,
opacity: X,
background: S,
border: z,
filter: v,
transformOrigin: "center center",
transform: H.length ? H.join(" ") : void 0
};
}
const CCg = r$({
name: "PptxGroup",
props: {
el: { type: Object, required: !0 },
slideIndex: { type: Number, required: !0 },
cacheId: { type: String, required: !0 },
absLeft: { type: Number, required: !0 },
absTop: { type: Number, required: !0 }
},
setup(t) {
const I = (C, i, e, A, s) => {
if (!EIg(C, i, e)) return null;
const l = ae(C, i, e), n = hs(C, i, e), a = Gm(C, i, e), d = [];
if ((l == null ? void 0 : l.kind) === "linear" ? d.push(
yI(
"linearGradient",
{ id: l.id, x1: l.x1, y1: l.y1, x2: l.x2, y2: l.y2 },
l.stops.map((o, c) => yI("stop", { key: c, offset: o.offset, "stop-color": o.color, "stop-opacity": o.opacity }))
)
) : (l == null ? void 0 : l.kind) === "radial" && d.push(
yI(
"radialGradient",
{ id: l.id, cx: "50%", cy: "50%", r: "50%" },
l.stops.map((o, c) => yI("stop", { key: c, offset: o.offset, "stop-color": o.color, "stop-opacity": o.opacity }))
)
), n && d.push(
yI(
"pattern",
{ id: n.id, patternUnits: "userSpaceOnUse", width: n.width, height: n.height },
[
yI("rect", { x: 0, y: 0, width: n.width, height: n.height, fill: n.background }),
...n.shapes.map((o, c) => o.kind === "circle" ? yI("circle", { key: c, cx: o.cx, cy: o.cy, r: o.r, fill: o.fill }) : o.kind === "polygon" ? yI("polygon", { key: c, points: o.points, fill: o.fill }) : yI("rect", {
key: c,
x: o.x,
y: o.y,
width: o.width,
height: o.height,
fill: o.fill,
transform: o.transform
}))
]
)
), a) {
const o = KIg(C), c = o ? 1 / (1 - o.l - o.r) : 1, r = o ? 1 / (1 - o.t - o.b) : 1, h = o ? -o.l * c : 0, b = o ? -o.t * r : 0;
d.push(
yI(
"pattern",
{
id: a.id,
patternUnits: "userSpaceOnUse",
patternContentUnits: "userSpaceOnUse",
x: 0,
y: 0,
width: A,
height: s
},
[
yI("image", {
x: h * A,
y: b * s,
width: c * A,
height: r * s,
href: a.href,
"xlink:href": a.href,
preserveAspectRatio: "none"
})
]
)
);
}
return d.length ? yI("defs", null, d) : null;
}, g = (C, i, e, A, s, l) => {
const n = erg(e, C, i, A, s), a = KI(C, i, l), d = G8(n == null ? void 0 : n.left), o = G8(n == null ? void 0 : n.top), c = A + d, r = s + o, h = ICg(e), b = Math.max(0, gI(e.width)), u = Math.max(0, gI(e.height)), m = h && b ? b / h.extW : 1, Z = h && u ? u / h.extH : 1;
if (Y9(C))
return yI("div", { key: a, class: "pptx-element", style: n }, [
yI("div", { class: "pptx-img-wrap", style: FIg(C) }, [
yI("img", { class: "pptx-img", src: tA(C), style: kIg(C), alt: "", draggable: !1 })
])
]);
if (N9(C))
return yI("div", { key: a, class: "pptx-element", style: n }, [yI("video", { class: "pptx-media", src: tA(C), controls: !0, preload: "metadata" })]);
if (V9(C))
return yI("div", { key: a, class: "pptx-element", style: n }, [yI("audio", { class: "pptx-media", src: tA(C), controls: !0, preload: "metadata" })]);
if (vIg(C))
return yI("div", { key: a, class: "pptx-element", style: n }, [yI("img", { class: "pptx-img", src: tA(C), alt: "", draggable: !1 })]);
if (JIg(C)) {
const Y = Ti(C, t.slideIndex, a), R = [];
return Y.kind === "bar" ? R.push(...Y.bars.map((X, H) => yI("rect", { key: H, x: X.x, y: X.y, width: X.w, height: X.h, fill: X.fill, "fill-opacity": X.opacity }))) : Y.kind === "line" ? (R.push(
...Y.paths.map(
(X, H) => yI("path", { key: H, d: X.d, fill: "none", stroke: X.stroke, "stroke-width": X.strokeWidth, "stroke-linejoin": "round", "stroke-linecap": "round" })
)
), R.push(...Y.points.map((X, H) => yI("circle", { key: H, cx: X.cx, cy: X.cy, r: X.r, fill: X.fill, "fill-opacity": X.opacity })))) : Y.kind === "pie" ? (R.push(...Y.slices.map((X, H) => yI("path", { key: H, d: X.d, fill: X.fill, "fill-opacity": X.opacity }))), Y.holeR && R.push(yI("circle", { cx: Y.cx, cy: Y.cy, r: Y.holeR, fill: "#fff" }))) : Y.kind === "scatter" && R.push(...Y.points.map((X, H) => yI("circle", { key: H, cx: X.cx, cy: X.cy, r: X.r, fill: X.fill, "fill-opacity": X.opacity }))), yI("div", { key: a, class: "pptx-element", style: n }, [yI("svg", { class: "pptx-chart", viewBox: `0 0 ${gI(C.width)} ${gI(C.height)}`, preserveAspectRatio: "none" }, R)]);
}
if (zIg(C)) {
const Y = Zm(C, t.slideIndex, a);
return yI("div", { key: a, class: "pptx-element", style: n }, [
yI("div", { class: "pptx-table-wrap" }, [
yI("table", { class: "pptx-table" }, [
Y.colWidths.length ? yI("colgroup", null, Y.colWidths.map((R, X) => yI("col", { key: X, style: { width: R ? `${R}px` : void 0 } }))) : null,
yI(
"tbody",
null,
Y.rows.map(
(R, X) => yI(
"tr",
{ key: X, style: OIg(C, t.slideIndex, a, X) },
R.map((H, S) => H.skip ? null : yI(
"td",
{ key: `${X}-${S}`, colspan: H.colspan, rowspan: H.rowspan, style: H.style },
[yI("div", { class: "pptx-table-html", innerHTML: dh(H.html) })]
)).filter(Boolean)
)
)
)
].filter(Boolean))
])
]);
}
if (tM(C) || y9(C)) {
const Y = Math.max(0, gI(C.width)), R = Math.max(0, gI(C.height)), X = gCg(C), H = (!Y || !R) && X ? irg(X) : null, S = Y || (H == null ? void 0 : H.vbW) || 1, z = R || (H == null ? void 0 : H.vbH) || 1, v = I(C, t.slideIndex, a, S, z), K = yI(
"svg",
{
class: "pptx-shape-svg",
viewBox: `0 0 ${S} ${z}`,
preserveAspectRatio: "none",
style: {
overflow: "visible",
width: "100%",
height: "100%",
display: "block"
}
},
[
v,
yI("path", {
d: X,
fill: PIg(C, t.slideIndex, a),
stroke: _Ig(C),
"stroke-width": qIg(C),
"stroke-dasharray": $Ig(C),
style: { vectorEffect: "non-scaling-stroke" }
})
].filter(Boolean)
), N = typeof C.content == "string" && C.content.trim() ? yI(
"div",
{
class: "pptx-html",
style: {
...aV(),
overflow: "visible",
width: `${Y}px`,
height: `${R}px`,
transform: m !== 1 || Z !== 1 ? `scale(${m}, ${Z})` : void 0,
transformOrigin: "top left",
position: "absolute",
left: 0,
top: 0
}
},
[yI("div", { class: "pptx-html-inner", style: oV(C), innerHTML: dh(C.content) })]
) : null;
return yI("div", { key: a, class: "pptx-element", style: { ...n, overflow: "visible" } }, [K, N].filter(Boolean));
}
if (LIg(C) || TIg(C))
return yI("div", { key: a, class: "pptx-element", style: n }, [
yI(CCg, { el: C, slideIndex: t.slideIndex, cacheId: a, absLeft: c, absTop: r })
]);
const p = typeof C.content == "string" && C.content.trim();
return yI(
"div",
{ key: a, class: "pptx-element", style: n },
p ? [
yI("div", { class: "pptx-html", style: aV() }, [
yI("div", { class: "pptx-html-inner", style: oV(C), innerHTML: dh(C.content) })
])
] : []
);
};
return () => {
const C = trg(t.el);
return yI(
"div",
{ class: "pptx-group-inner" },
C.map((i, e) => g(i, e, t.el, t.absLeft, t.absTop, t.cacheId))
);
};
}
}), Arg = {
key: 0,
class: "pptx-empty"
}, srg = {
key: 1,
class: "pptx-slides"
}, lrg = ["src"], nrg = ["src"], arg = ["src"], org = ["src"], crg = ["viewBox"], drg = ["x", "y", "width", "height", "fill", "fill-opacity"], rrg = ["d", "stroke", "stroke-width"], hrg = ["cx", "cy", "r", "fill", "fill-opacity"], brg = ["d", "fill", "fill-opacity"], urg = ["cx", "cy", "r"], mrg = ["cx", "cy", "r", "fill", "fill-opacity"], Zrg = {
key: 6,
class: "pptx-table-wrap"
}, Grg = { class: "pptx-table" }, wrg = { key: 0 }, prg = ["colspan", "rowspan"], Brg = ["innerHTML"], Wrg = ["viewBox"], yrg = { key: 0 }, Yrg = ["id", "x1", "y1", "x2", "y2"], Nrg = ["offset", "stop-color", "stop-opacity"], Vrg = ["id"], Mrg = ["offset", "stop-color", "stop-opacity"], Rrg = ["id", "width", "height"], frg = ["width", "height", "fill"], Hrg = ["cx", "cy", "r", "fill"], Xrg = ["points", "fill"], Srg = ["x", "y", "width", "height", "fill", "transform"], Drg = ["id"], Krg = ["href"], Frg = ["d", "fill", "stroke", "stroke-width", "stroke-dasharray"], krg = ["innerHTML"], zrg = ["innerHTML"], Jrg = /* @__PURE__ */ r$({
__name: "PPT",
props: {
pptxJson: {}
},
setup(t) {
const I = t, g = wi(null), C = wi(0);
let i = null;
const e = DA(() => {
var o, c, r, h;
const a = ((c = (o = I.pptxJson) == null ? void 0 : o.size) == null ? void 0 : c.width) ?? 960, d = ((h = (r = I.pptxJson) == null ? void 0 : r.size) == null ? void 0 : h.height) ?? 540;
return {
width: Number.isFinite(a) ? a : 960,
height: Number.isFinite(d) ? d : 540
};
}), A = DA(() => {
const a = C.value;
if (!a) return 1;
const d = a / e.value.width;
return Math.min(1, Math.max(0.1, d));
}), s = DA(() => {
var d;
return (Array.isArray((d = I.pptxJson) == null ? void 0 : d.slides) ? I.pptxJson.slides : []).map((o) => {
const c = (Array.isArray(o.elements) ? o.elements : []).map((m) => ({
...m,
__source: "slide"
})), r = new Set(c.map(w8).filter(Boolean)), u = [...(Array.isArray(o.layoutElements) ? o.layoutElements : []).map((m) => {
const Z = { ...m, __source: "layout" }, p = w8(Z);
return p && r.has(p) ? null : p && typeof Z.content == "string" && Udg(Z.content) ? { ...Z, content: "" } : Z;
}).filter(Boolean), ...c].filter((m) => m && typeof m == "object").map((m, Z) => ({ el: m, idx: Z })).sort((m, Z) => {
const p = gI(m.el.order), Y = gI(Z.el.order);
return p !== Y ? p - Y : m.idx - Z.idx;
}).map((m) => m.el);
return {
...o,
elements: u
};
});
});
tG(() => {
if (!g.value) return;
console.log(I.pptxJson);
const a = () => {
g.value && (C.value = g.value.clientWidth);
};
a(), i = new ResizeObserver(() => a()), i.observe(g.value);
}), s9(() => {
i == null || i.disconnect(), i = null;
});
function l() {
return {
width: `${Math.round(e.value.width * A.value)}px`,
height: `${Math.round(e.value.height * A.value)}px`
};
}
function n(a) {
var o;
const d = _dg(
(a == null ? void 0 : a.fill) ?? (a == null ? void 0 : a.backgroundFill) ?? (a == null ? void 0 : a.layoutFill) ?? ((o = a == null ? void 0 : a.layout) == null ? void 0 : o.fill) ?? (a == null ? void 0 : a.masterFill)
);
return {
width: `${e.value.width}px`,
height: `${e.value.height}px`,
transform: `scale(${A.value})`,
background: d
};
}
return (a, d) => (Ug(), Pg("div", {
ref_key: "rootRef",
ref: g,
class: "pptx-preview"
}, [
s.value.length ? (Ug(), Pg("div", srg, [
(Ug(!0), Pg(ct, null, vi(s.value, (o, c) => (Ug(), Pg("div", {
key: c,
class: "pptx-slide-shell",
style: Ae(l())
}, [
tC("div", {
class: "pptx-slide",
style: Ae(n(o))
}, [
(Ug(!0), Pg(ct, null, vi(o.elements, (r, h) => {
var b, u;
return Ug(), Pg("div", {
key: Dg(Qdg)(r, h),
class: "pptx-element",
style: Ae(Dg($dg)(r, h))
}, [
Dg(Y9)(r) ? (Ug(), Pg("div", {
key: 0,
class: "pptx-img-wrap",
style: Ae(Dg(FIg)(r))
}, [
tC("img", {
class: "pptx-img",
src: Dg(tA)(r),
style: Ae(Dg(kIg)(r)),
alt: "",
draggable: "false"
}, null, 12, lrg)
], 4)) : Dg(N9)(r) ? (Ug(), Pg("video", {
key: 1,
class: "pptx-media",
src: Dg(tA)(r),
controls: "",
preload: "metadata"
}, null, 8, nrg)) : Dg(V9)(r) ? (Ug(), Pg("audio", {
key: 2,
class: "pptx-media",
src: Dg(tA)(r),
controls: "",
preload: "metadata"
}, null, 8, arg)) : Dg(vIg)(r) ? (Ug(), Pg("img", {
key: 3,
class: "pptx-img",
src: Dg(tA)(r),
alt: "",
draggable: "false"
}, null, 8, org)) : Dg(JIg)(r) ? (Ug(), Pg("svg", {
key: 4,
class: "pptx-chart",
viewBox: `0 0 ${Dg(gI)(r.width)} ${Dg(gI)(r.height)}`,
preserveAspectRatio: "none"
}, [
Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "bar" ? (Ug(!0), Pg(ct, { key: 0 }, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).bars, (m, Z) => (Ug(), Pg("rect", {
key: Z,
x: m.x,
y: m.y,
width: m.w,
height: m.h,
fill: m.fill,
"fill-opacity": m.opacity
}, null, 8, drg))), 128)) : Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "line" ? (Ug(), Pg(ct, { key: 1 }, [
(Ug(!0), Pg(ct, null, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).paths, (m, Z) => (Ug(), Pg("path", {
key: Z,
d: m.d,
fill: "none",
stroke: m.stroke,
"stroke-width": m.strokeWidth,
"stroke-linejoin": "round",
"stroke-linecap": "round"
}, null, 8, rrg))), 128)),
(Ug(!0), Pg(ct, null, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).points, (m, Z) => (Ug(), Pg("circle", {
key: Z,
cx: m.cx,
cy: m.cy,
r: m.r,
fill: m.fill,
"fill-opacity": m.opacity
}, null, 8, hrg))), 128))
], 64)) : Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "pie" ? (Ug(), Pg(ct, { key: 2 }, [
(Ug(!0), Pg(ct, null, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).slices, (m, Z) => (Ug(), Pg("path", {
key: Z,
d: m.d,
fill: m.fill,
"fill-opacity": m.opacity
}, null, 8, brg))), 128)),
Dg(Ti)(r, c, Dg(KI)(r, h)).holeR ? (Ug(), Pg("circle", {
key: 0,
cx: Dg(Ti)(r, c, Dg(KI)(r, h)).cx,
cy: Dg(Ti)(r, c, Dg(KI)(r, h)).cy,
r: Dg(Ti)(r, c, Dg(KI)(r, h)).holeR,
fill: "#fff"
}, null, 8, urg)) : Yt("", !0)
], 64)) : Dg(Ti)(r, c, Dg(KI)(r, h)).kind === "scatter" ? (Ug(!0), Pg(ct, { key: 3 }, vi(Dg(Ti)(r, c, Dg(KI)(r, h)).points, (m, Z) => (Ug(), Pg("circle", {
key: Z,
cx: m.cx,
cy: m.cy,
r: m.r,
fill: m.fill,
"fill-opacity": m.opacity
}, null, 8, mrg))), 128)) : Yt("", !0)
], 8, crg)) : Dg(LIg)(r) || Dg(TIg)(r) ? (Ug(), h$(Dg(CCg), {
key: 5,
el: r,
"slide-index": c,
"cache-id": Dg(KI)(r, h),
"abs-left": Dg(gI)(r.left),
"abs-top": Dg(gI)(r.top)
}, null, 8, ["el", "slide-index", "cache-id", "abs-left", "abs-top"])) : Dg(zIg)(r) ? (Ug(), Pg("div", Zrg, [
tC("table", Grg, [
Dg(Zm)(r, c, Dg(KI)(r, h)).colWidths.length ? (Ug(), Pg("colgroup", wrg, [
(Ug(!0), Pg(ct, null, vi(Dg(Zm)(r, c, Dg(KI)(r, h)).colWidths, (m, Z) => (Ug(), Pg("col", {
key: Z,
style: Ae({ width: m ? `${m}px` : void 0 })
}, null, 4))), 128))
])) : Yt("", !0),
tC("tbody", null, [
(Ug(!0), Pg(ct, null, vi(Dg(Zm)(r, c, Dg(KI)(r, h)).rows, (m, Z) => (Ug(), Pg("tr", {
key: Z,
style: Ae(Dg(OIg)(r, c, Dg(KI)(r, h), Z))
}, [
(Ug(!0), Pg(ct, null, vi(m, (p, Y) => (Ug(), Pg(ct, {
key: `${Z}-${Y}`
}, [
p.skip ? Yt("", !0) : (Ug(), Pg("td", {
key: 0,
colspan: p.colspan,
rowspan: p.rowspan,
style: Ae(p.style)
}, [
tC("div", {
class: "pptx-table-html",
innerHTML: Dg(dh)(p.html)
}, null, 8, Brg)
], 12, prg))
], 64))), 128))
], 4))), 128))
])
])
])) : Dg(tM)(r) ? (Ug(), Pg(ct, { key: 7 }, [
(Ug(), Pg("svg", {
class: "pptx-shape-svg",
viewBox: `0 0 ${Dg(gI)(r.width)} ${Dg(gI)(r.height)}`,
preserveAspectRatio: "none"
}, [
Dg(EIg)(r, c, Dg(KI)(r, h)) ? (Ug(), Pg("defs", yrg, [
((b = Dg(ae)(r, c, Dg(KI)(r, h))) == null ? void 0 : b.kind) === "linear" ? (Ug(), Pg("linearGradient", {
key: 0,
id: Dg(ae)(r, c, Dg(KI)(r, h)).id,
x1: Dg(ae)(r, c, Dg(KI)(r, h)).x1,
y1: Dg(ae)(r, c, Dg(KI)(r, h)).y1,
x2: Dg(ae)(r, c, Dg(KI)(r, h)).x2,
y2: Dg(ae)(r, c, Dg(KI)(r, h)).y2
}, [
(Ug(!0), Pg(ct, null, vi(Dg(ae)(r, c, Dg(KI)(r, h)).stops, (m, Z) => (Ug(), Pg("stop", {
key: Z,
offset: m.offset,
"stop-color": m.color,
"stop-opacity": m.opacity
}, null, 8, Nrg))), 128))
], 8, Yrg)) : ((u = Dg(ae)(r, c, Dg(KI)(r, h))) == null ? void 0 : u.kind) === "radial" ? (Ug(), Pg("radialGradient", {
key: 1,
id: Dg(ae)(r, c, Dg(KI)(r, h)).id,
cx: "50%",
cy: "50%",
r: "50%"
}, [
(Ug(!0), Pg(ct, null, vi(Dg(ae)(r, c, Dg(KI)(r, h)).stops, (m, Z) => (Ug(), Pg("stop", {
key: Z,
offset: m.offset,
"stop-color": m.color,
"stop-opacity": m.opacity
}, null, 8, Mrg))), 128))
], 8, Vrg)) : Yt("", !0),
Dg(hs)(r, c, Dg(KI)(r, h)) ? (Ug(), Pg("pattern", {
key: 2,
id: Dg(hs)(r, c, Dg(KI)(r, h)).id,
patternUnits: "userSpaceOnUse",
width: Dg(hs)(r, c, Dg(KI)(r, h)).width,
height: Dg(hs)(r, c, Dg(KI)(r, h)).height
}, [
tC("rect", {
x: "0",
y: "0",
width: Dg(hs)(r, c, Dg(KI)(r, h)).width,
height: Dg(hs)(r, c, Dg(KI)(r, h)).height,
fill: Dg(hs)(r, c, Dg(KI)(r, h)).background
}, null, 8, frg),
(Ug(!0), Pg(ct, null, vi(Dg(hs)(r, c, Dg(KI)(r, h)).shapes, (m, Z) => (Ug(), Pg(ct, { key: Z }, [
m.kind === "circle" ? (Ug(), Pg("circle", {
key: 0,
cx: m.cx,
cy: m.cy,
r: m.r,
fill: m.fill
}, null, 8, Hrg)) : m.kind === "polygon" ? (Ug(), Pg("polygon", {
key: 1,
points: m.points,
fill: m.fill
}, null, 8, Xrg)) : m.kind === "rect" ? (Ug(), Pg("rect", {
key: 2,
x: m.x,
y: m.y,
width: m.width,
height: m.height,
fill: m.fill,
transform: m.transform
}, null, 8, Srg)) : Yt("", !0)
], 64))), 128))
], 8, Rrg)) : Yt("", !0),
Dg(Gm)(r, c, Dg(KI)(r, h)) ? (Ug(), Pg("pattern", {
key: 3,
id: Dg(Gm)(r, c, Dg(KI)(r, h)).id,
patternUnits: "objectBoundingBox",
width: "1",
height: "1"
}, [
tC("image", {
x: "0",
y: "0",
width: "100%",
height: "100%",
preserveAspectRatio: "none",
href: Dg(Gm)(r, c, Dg(KI)(r, h)).href
}, null, 8, Krg)
], 8, Drg)) : Yt("", !0)
])) : Yt("", !0),
tC("path", {
d: Dg(gCg)(r),
fill: Dg(PIg)(r, c, Dg(KI)(r, h)),
stroke: Dg(_Ig)(r),
"stroke-width": Dg(qIg)(r),
"stroke-dasharray": Dg($Ig)(r)
}, null, 8, Frg)
], 8, Wrg)),
typeof r.content == "string" && r.content.trim() ? (Ug(), Pg("div", {
key: 0,
class: "pptx-html",
style: Ae(Dg(aV)(r))
}, [
tC("div", {
class: "pptx-html-inner",
style: Ae(Dg(oV)(r)),
innerHTML: Dg(dh)(r.content)
}, null, 12, krg)
], 4)) : Yt("", !0)
], 64)) : (Ug(), Pg(ct, { key: 8 }, [
typeof r.content == "string" && r.content.trim() ? (Ug(), Pg("div", {
key: 0,
class: "pptx-html",
style: Ae(Dg(aV)(r))
}, [
tC("div", {
class: "pptx-html-inner",
style: Ae(Dg(oV)(r)),
innerHTML: Dg(dh)(r.content)
}, null, 12, zrg)
], 4)) : Yt("", !0)
], 64))
], 4);
}), 128))
], 4)
], 4))), 128))
])) : (Ug(), Pg("div", Arg, "暂无可渲染的幻灯片"))
], 512));
}
}), Lrg = /* @__PURE__ */ V0(Jrg, [["__scopeId", "data-v-5765ec3e"]]);
function nD(t, I) {
(I == null || I > t.length) && (I = t.length);
for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
return C;
}
function tCg(t, I) {
if (t) {
if (typeof t == "string") return nD(t, I);
var g = Object.prototype.toString.call(t).slice(8, -1);
return g === "Object" && t.constructor && (g = t.constructor.name), g === "Map" || g === "Set" ? Array.from(t) : g === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(g) ? nD(t, I) : void 0;
}
}
function R9(t) {
return function(I) {
if (Array.isArray(I)) return nD(I);
}(t) || function(I) {
if (typeof Symbol < "u" && I[Symbol.iterator] != null || I["@@iterator"] != null) return Array.from(I);
}(t) || tCg(t) || function() {
throw new TypeError(`Invalid attempt to spread non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
}();
}
function B8(t, I, g, C, i, e, A) {
try {
var s = t[e](A), l = s.value;
} catch (n) {
return void g(n);
}
s.done ? I(l) : Promise.resolve(l).then(C, i);
}
function SC(t) {
return function() {
var I = this, g = arguments;
return new Promise(function(C, i) {
var e = t.apply(I, g);
function A(l) {
B8(e, C, i, A, s, "next", l);
}
function s(l) {
B8(e, C, i, A, s, "throw", l);
}
A(void 0);
});
};
}
function _a(t) {
return _a = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(I) {
return typeof I;
} : function(I) {
return I && typeof Symbol == "function" && I.constructor === Symbol && I !== Symbol.prototype ? "symbol" : typeof I;
}, _a(t);
}
function f9(t, I, g) {
return I in t ? Object.defineProperty(t, I, { value: g, enumerable: !0, configurable: !0, writable: !0 }) : t[I] = g, t;
}
var oe = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
function iM(t) {
var I = t.default;
if (typeof I == "function") {
var g = function() {
return I.apply(this, arguments);
};
g.prototype = I.prototype;
} else g = {};
return Object.defineProperty(g, "__esModule", { value: !0 }), Object.keys(t).forEach(function(C) {
var i = Object.getOwnPropertyDescriptor(t, C);
Object.defineProperty(g, C, i.get ? i : { enumerable: !0, get: function() {
return t[C];
} });
}), g;
}
var iCg = { exports: {} }, W8 = { exports: {} };
(function(t) {
function I(g) {
return t.exports = I = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(C) {
return typeof C;
} : function(C) {
return C && typeof Symbol == "function" && C.constructor === Symbol && C !== Symbol.prototype ? "symbol" : typeof C;
}, t.exports.__esModule = !0, t.exports.default = t.exports, I(g);
}
t.exports = I, t.exports.__esModule = !0, t.exports.default = t.exports;
})(W8), function(t) {
var I = W8.exports.default;
function g() {
t.exports = g = function() {
return C;
}, t.exports.__esModule = !0, t.exports.default = t.exports;
var C = {}, i = Object.prototype, e = i.hasOwnProperty, A = Object.defineProperty || function(B, G, w) {
B[G] = w.value;
}, s = typeof Symbol == "function" ? Symbol : {}, l = s.iterator || "@@iterator", n = s.asyncIterator || "@@asyncIterator", a = s.toStringTag || "@@toStringTag";
function d(B, G, w) {
return Object.defineProperty(B, G, { value: w, enumerable: !0, configurable: !0, writable: !0 }), B[G];
}
try {
d({}, "");
} catch {
d = function(G, w, W) {
return G[w] = W;
};
}
function o(B, G, w, W) {
var y = G && G.prototype instanceof h ? G : h, f = Object.create(y.prototype), D = new K(W || []);
return A(f, "_invoke", { value: H(B, w, D) }), f;
}
function c(B, G, w) {
try {
return { type: "normal", arg: B.call(G, w) };
} catch (W) {
return { type: "throw", arg: W };
}
}
C.wrap = o;
var r = {};
function h() {
}
function b() {
}
function u() {
}
var m = {};
d(m, l, function() {
return this;
});
var Z = Object.getPrototypeOf, p = Z && Z(Z(V([])));
p && p !== i && e.call(p, l) && (m = p);
var Y = u.prototype = h.prototype = Object.create(m);
function R(B) {
["next", "throw", "return"].forEach(function(G) {
d(B, G, function(w) {
return this._invoke(G, w);
});
});
}
function X(B, G) {
function w(y, f, D, F) {
var T = c(B[y], B, f);
if (T.type !== "throw") {
var Q = T.arg, P = Q.value;
return P && I(P) == "object" && e.call(P, "__await") ? G.resolve(P.__await).then(function(L) {
w("next", L, D, F);
}, function(L) {
w("throw", L, D, F);
}) : G.resolve(P).then(function(L) {
Q.value = L, D(Q);
}, function(L) {
return w("throw", L, D, F);
});
}
F(T.arg);
}
var W;
A(this, "_invoke", { value: function(y, f) {
function D() {
return new G(function(F, T) {
w(y, f, F, T);
});
}
return W = W ? W.then(D, D) : D();
} });
}
function H(B, G, w) {
var W = "suspendedStart";
return function(y, f) {
if (W === "executing") throw new Error("Generator is already running");
if (W === "completed") {
if (y === "throw") throw f;
return N();
}
for (w.method = y, w.arg = f; ; ) {
var D = w.delegate;
if (D) {
var F = S(D, w);
if (F) {
if (F === r) continue;
return F;
}
}
if (w.method === "next") w.sent = w._sent = w.arg;
else if (w.method === "throw") {
if (W === "suspendedStart") throw W = "completed", w.arg;
w.dispatchException(w.arg);
} else w.method === "return" && w.abrupt("return", w.arg);
W = "executing";
var T = c(B, G, w);
if (T.type === "normal") {
if (W = w.done ? "completed" : "suspendedYield", T.arg === r) continue;
return { value: T.arg, done: w.done };
}
T.type === "throw" && (W = "completed", w.method = "throw", w.arg = T.arg);
}
};
}
function S(B, G) {
var w = B.iterator[G.method];
if (w === void 0) {
if (G.delegate = null, G.method === "throw") {
if (B.iterator.return && (G.method = "return", G.arg = void 0, S(B, G), G.method === "throw")) return r;
G.method = "throw", G.arg = new TypeError("The iterator does not provide a 'throw' method");
}
return r;
}
var W = c(w, B.iterator, G.arg);
if (W.type === "throw") return G.method = "throw", G.arg = W.arg, G.delegate = null, r;
var y = W.arg;
return y ? y.done ? (G[B.resultName] = y.value, G.next = B.nextLoc, G.method !== "return" && (G.method = "next", G.arg = void 0), G.delegate = null, r) : y : (G.method = "throw", G.arg = new TypeError("iterator result is not an object"), G.delegate = null, r);
}
function z(B) {
var G = { tryLoc: B[0] };
1 in B && (G.catchLoc = B[1]), 2 in B && (G.finallyLoc = B[2], G.afterLoc = B[3]), this.tryEntries.push(G);
}
function v(B) {
var G = B.completion || {};
G.type = "normal", delete G.arg, B.completion = G;
}
function K(B) {
this.tryEntries = [{ tryLoc: "root" }], B.forEach(z, this), this.reset(!0);
}
function V(B) {
if (B) {
var G = B[l];
if (G) return G.call(B);
if (typeof B.next == "function") return B;
if (!isNaN(B.length)) {
var w = -1, W = function y() {
for (; ++w < B.length; ) if (e.call(B, w)) return y.value = B[w], y.done = !1, y;
return y.value = void 0, y.done = !0, y;
};
return W.next = W;
}
}
return { next: N };
}
function N() {
return { value: void 0, done: !0 };
}
return b.prototype = u, A(Y, "constructor", { value: u, configurable: !0 }), A(u, "constructor", { value: b, configurable: !0 }), b.displayName = d(u, a, "GeneratorFunction"), C.isGeneratorFunction = function(B) {
var G = typeof B == "function" && B.constructor;
return !!G && (G === b || (G.displayName || G.name) === "GeneratorFunction");
}, C.mark = function(B) {
return Object.setPrototypeOf ? Object.setPrototypeOf(B, u) : (B.__proto__ = u, d(B, a, "GeneratorFunction")), B.prototype = Object.create(Y), B;
}, C.awrap = function(B) {
return { __await: B };
}, R(X.prototype), d(X.prototype, n, function() {
return this;
}), C.AsyncIterator = X, C.async = function(B, G, w, W, y) {
y === void 0 && (y = Promise);
var f = new X(o(B, G, w, W), y);
return C.isGeneratorFunction(G) ? f : f.next().then(function(D) {
return D.done ? D.value : f.next();
});
}, R(Y), d(Y, a, "Generator"), d(Y, l, function() {
return this;
}), d(Y, "toString", function() {
return "[object Generator]";
}), C.keys = function(B) {
var G = Object(B), w = [];
for (var W in G) w.push(W);
return w.reverse(), function y() {
for (; w.length; ) {
var f = w.pop();
if (f in G) return y.value = f, y.done = !1, y;
}
return y.done = !0, y;
};
}, C.values = V, K.prototype = { constructor: K, reset: function(B) {
if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = !1, this.delegate = null, this.method = "next", this.arg = void 0, this.tryEntries.forEach(v), !B) for (var G in this) G.charAt(0) === "t" && e.call(this, G) && !isNaN(+G.slice(1)) && (this[G] = void 0);
}, stop: function() {
this.done = !0;
var B = this.tryEntries[0].completion;
if (B.type === "throw") throw B.arg;
return this.rval;
}, dispatchException: function(B) {
if (this.done) throw B;
var G = this;
function w(T, Q) {
return f.type = "throw", f.arg = B, G.next = T, Q && (G.method = "next", G.arg = void 0), !!Q;
}
for (var W = this.tryEntries.length - 1; W >= 0; --W) {
var y = this.tryEntries[W], f = y.completion;
if (y.tryLoc === "root") return w("end");
if (y.tryLoc <= this.prev) {
var D = e.call(y, "catchLoc"), F = e.call(y, "finallyLoc");
if (D && F) {
if (this.prev < y.catchLoc) return w(y.catchLoc, !0);
if (this.prev < y.finallyLoc) return w(y.finallyLoc);
} else if (D) {
if (this.prev < y.catchLoc) return w(y.catchLoc, !0);
} else {
if (!F) throw new Error("try statement without catch or finally");
if (this.prev < y.finallyLoc) return w(y.finallyLoc);
}
}
}
}, abrupt: function(B, G) {
for (var w = this.tryEntries.length - 1; w >= 0; --w) {
var W = this.tryEntries[w];
if (W.tryLoc <= this.prev && e.call(W, "finallyLoc") && this.prev < W.finallyLoc) {
var y = W;
break;
}
}
y && (B === "break" || B === "continue") && y.tryLoc <= G && G <= y.finallyLoc && (y = null);
var f = y ? y.completion : {};
return f.type = B, f.arg = G, y ? (this.method = "next", this.next = y.finallyLoc, r) : this.complete(f);
}, complete: function(B, G) {
if (B.type === "throw") throw B.arg;
return B.type === "break" || B.type === "continue" ? this.next = B.arg : B.type === "return" ? (this.rval = this.arg = B.arg, this.method = "return", this.next = "end") : B.type === "normal" && G && (this.next = G), r;
}, finish: function(B) {
for (var G = this.tryEntries.length - 1; G >= 0; --G) {
var w = this.tryEntries[G];
if (w.finallyLoc === B) return this.complete(w.completion, w.afterLoc), v(w), r;
}
}, catch: function(B) {
for (var G = this.tryEntries.length - 1; G >= 0; --G) {
var w = this.tryEntries[G];
if (w.tryLoc === B) {
var W = w.completion;
if (W.type === "throw") {
var y = W.arg;
v(w);
}
return y;
}
}
throw new Error("illegal catch attempt");
}, delegateYield: function(B, G, w) {
return this.delegate = { iterator: V(B), resultName: G, nextLoc: w }, this.method === "next" && (this.arg = void 0), r;
} }, C;
}
t.exports = g, t.exports.__esModule = !0, t.exports.default = t.exports;
}(iCg);
var vN = iCg.exports(), bI = vN;
try {
regeneratorRuntime = vN;
} catch {
typeof globalThis == "object" ? globalThis.regeneratorRuntime = vN : Function("r", "regeneratorRuntime = r")(vN);
}
var M0 = {}, y8 = {}, W0 = typeof global < "u" ? global : typeof self < "u" ? self : typeof window < "u" ? window : {}, Xs = [], xe = [], vrg = typeof Uint8Array < "u" ? Uint8Array : Array, H9 = !1;
function eCg() {
H9 = !0;
for (var t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", I = 0, g = t.length; I < g; ++I) Xs[I] = t[I], xe[t.charCodeAt(I)] = I;
xe[45] = 62, xe[95] = 63;
}
function Trg(t, I, g) {
for (var C, i, e = [], A = I; A < g; A += 3) C = (t[A] << 16) + (t[A + 1] << 8) + t[A + 2], e.push(Xs[(i = C) >> 18 & 63] + Xs[i >> 12 & 63] + Xs[i >> 6 & 63] + Xs[63 & i]);
return e.join("");
}
function Y8(t) {
var I;
H9 || eCg();
for (var g = t.length, C = g % 3, i = "", e = [], A = 16383, s = 0, l = g - C; s < l; s += A) e.push(Trg(t, s, s + A > l ? l : s + A));
return C === 1 ? (I = t[g - 1], i += Xs[I >> 2], i += Xs[I << 4 & 63], i += "==") : C === 2 && (I = (t[g - 2] << 8) + t[g - 1], i += Xs[I >> 10], i += Xs[I >> 4 & 63], i += Xs[I << 2 & 63], i += "="), e.push(i), e.join("");
}
function QY(t, I, g, C, i) {
var e, A, s = 8 * i - C - 1, l = (1 << s) - 1, n = l >> 1, a = -7, d = g ? i - 1 : 0, o = g ? -1 : 1, c = t[I + d];
for (d += o, e = c & (1 << -a) - 1, c >>= -a, a += s; a > 0; e = 256 * e + t[I + d], d += o, a -= 8) ;
for (A = e & (1 << -a) - 1, e >>= -a, a += C; a > 0; A = 256 * A + t[I + d], d += o, a -= 8) ;
if (e === 0) e = 1 - n;
else {
if (e === l) return A ? NaN : 1 / 0 * (c ? -1 : 1);
A += Math.pow(2, C), e -= n;
}
return (c ? -1 : 1) * A * Math.pow(2, e - C);
}
function ACg(t, I, g, C, i, e) {
var A, s, l, n = 8 * e - i - 1, a = (1 << n) - 1, d = a >> 1, o = i === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0, c = C ? 0 : e - 1, r = C ? 1 : -1, h = I < 0 || I === 0 && 1 / I < 0 ? 1 : 0;
for (I = Math.abs(I), isNaN(I) || I === 1 / 0 ? (s = isNaN(I) ? 1 : 0, A = a) : (A = Math.floor(Math.log(I) / Math.LN2), I * (l = Math.pow(2, -A)) < 1 && (A--, l *= 2), (I += A + d >= 1 ? o / l : o * Math.pow(2, 1 - d)) * l >= 2 && (A++, l /= 2), A + d >= a ? (s = 0, A = a) : A + d >= 1 ? (s = (I * l - 1) * Math.pow(2, i), A += d) : (s = I * Math.pow(2, d - 1) * Math.pow(2, i), A = 0)); i >= 8; t[g + c] = 255 & s, c += r, s /= 256, i -= 8) ;
for (A = A << i | s, n += i; n > 0; t[g + c] = 255 & A, c += r, A /= 256, n -= 8) ;
t[g + c - r] |= 128 * h;
}
var xrg = {}.toString, sCg = Array.isArray || function(t) {
return xrg.call(t) == "[object Array]";
};
Hg.TYPED_ARRAY_SUPPORT = W0.TYPED_ARRAY_SUPPORT === void 0 || W0.TYPED_ARRAY_SUPPORT;
var jrg = cV();
function cV() {
return Hg.TYPED_ARRAY_SUPPORT ? 2147483647 : 1073741823;
}
function Pl(t, I) {
if (cV() < I) throw new RangeError("Invalid typed array length");
return Hg.TYPED_ARRAY_SUPPORT ? (t = new Uint8Array(I)).__proto__ = Hg.prototype : (t === null && (t = new Hg(I)), t.length = I), t;
}
function Hg(t, I, g) {
if (!(Hg.TYPED_ARRAY_SUPPORT || this instanceof Hg)) return new Hg(t, I, g);
if (typeof t == "number") {
if (typeof I == "string") throw new Error("If encoding is specified then the first argument must be a string");
return aD(this, t);
}
return lCg(this, t, I, g);
}
function lCg(t, I, g, C) {
if (typeof I == "number") throw new TypeError('"value" argument must not be a number');
return typeof ArrayBuffer < "u" && I instanceof ArrayBuffer ? function(i, e, A, s) {
if (e.byteLength, A < 0 || e.byteLength < A) throw new RangeError("'offset' is out of bounds");
if (e.byteLength < A + (s || 0)) throw new RangeError("'length' is out of bounds");
return e = A === void 0 && s === void 0 ? new Uint8Array(e) : s === void 0 ? new Uint8Array(e, A) : new Uint8Array(e, A, s), Hg.TYPED_ARRAY_SUPPORT ? (i = e).__proto__ = Hg.prototype : i = PH(i, e), i;
}(t, I, g, C) : typeof I == "string" ? function(i, e, A) {
if (typeof A == "string" && A !== "" || (A = "utf8"), !Hg.isEncoding(A)) throw new TypeError('"encoding" must be a valid string encoding');
var s = 0 | aCg(e, A), l = (i = Pl(i, s)).write(e, A);
return l !== s && (i = i.slice(0, l)), i;
}(t, I, g) : function(i, e) {
if (Ss(e)) {
var A = 0 | X9(e.length);
return (i = Pl(i, A)).length === 0 || e.copy(i, 0, 0, A), i;
}
if (e) {
if (typeof ArrayBuffer < "u" && e.buffer instanceof ArrayBuffer || "length" in e) return typeof e.length != "number" || (s = e.length) != s ? Pl(i, 0) : PH(i, e);
if (e.type === "Buffer" && sCg(e.data)) return PH(i, e.data);
}
var s;
throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.");
}(t, I);
}
function nCg(t) {
if (typeof t != "number") throw new TypeError('"size" argument must be a number');
if (t < 0) throw new RangeError('"size" argument must not be negative');
}
function aD(t, I) {
if (nCg(I), t = Pl(t, I < 0 ? 0 : 0 | X9(I)), !Hg.TYPED_ARRAY_SUPPORT) for (var g = 0; g < I; ++g) t[g] = 0;
return t;
}
function PH(t, I) {
var g = I.length < 0 ? 0 : 0 | X9(I.length);
t = Pl(t, g);
for (var C = 0; C < g; C += 1) t[C] = 255 & I[C];
return t;
}
function X9(t) {
if (t >= cV()) throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x" + cV().toString(16) + " bytes");
return 0 | t;
}
function Ss(t) {
return !(t == null || !t._isBuffer);
}
function aCg(t, I) {
if (Ss(t)) return t.length;
if (typeof ArrayBuffer < "u" && typeof ArrayBuffer.isView == "function" && (ArrayBuffer.isView(t) || t instanceof ArrayBuffer)) return t.byteLength;
typeof t != "string" && (t = "" + t);
var g = t.length;
if (g === 0) return 0;
for (var C = !1; ; ) switch (I) {
case "ascii":
case "latin1":
case "binary":
return g;
case "utf8":
case "utf-8":
case void 0:
return dV(t).length;
case "ucs2":
case "ucs-2":
case "utf16le":
case "utf-16le":
return 2 * g;
case "hex":
return g >>> 1;
case "base64":
return rCg(t).length;
default:
if (C) return dV(t).length;
I = ("" + I).toLowerCase(), C = !0;
}
}
function Qrg(t, I, g) {
var C = !1;
if ((I === void 0 || I < 0) && (I = 0), I > this.length || ((g === void 0 || g > this.length) && (g = this.length), g <= 0) || (g >>>= 0) <= (I >>>= 0)) return "";
for (t || (t = "utf8"); ; ) switch (t) {
case "hex":
return Ihg(this, I, g);
case "utf8":
case "utf-8":
return cCg(this, I, g);
case "ascii":
return $rg(this, I, g);
case "latin1":
case "binary":
return ghg(this, I, g);
case "base64":
return qrg(this, I, g);
case "ucs2":
case "ucs-2":
case "utf16le":
case "utf-16le":
return Chg(this, I, g);
default:
if (C) throw new TypeError("Unknown encoding: " + t);
t = (t + "").toLowerCase(), C = !0;
}
}
function Lo(t, I, g) {
var C = t[I];
t[I] = t[g], t[g] = C;
}
function N8(t, I, g, C, i) {
if (t.length === 0) return -1;
if (typeof g == "string" ? (C = g, g = 0) : g > 2147483647 ? g = 2147483647 : g < -2147483648 && (g = -2147483648), g = +g, isNaN(g) && (g = i ? 0 : t.length - 1), g < 0 && (g = t.length + g), g >= t.length) {
if (i) return -1;
g = t.length - 1;
} else if (g < 0) {
if (!i) return -1;
g = 0;
}
if (typeof I == "string" && (I = Hg.from(I, C)), Ss(I)) return I.length === 0 ? -1 : V8(t, I, g, C, i);
if (typeof I == "number") return I &= 255, Hg.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf == "function" ? i ? Uint8Array.prototype.indexOf.call(t, I, g) : Uint8Array.prototype.lastIndexOf.call(t, I, g) : V8(t, [I], g, C, i);
throw new TypeError("val must be string, number or Buffer");
}
function V8(t, I, g, C, i) {
var e, A = 1, s = t.length, l = I.length;
if (C !== void 0 && ((C = String(C).toLowerCase()) === "ucs2" || C === "ucs-2" || C === "utf16le" || C === "utf-16le")) {
if (t.length < 2 || I.length < 2) return -1;
A = 2, s /= 2, l /= 2, g /= 2;
}
function n(c, r) {
return A === 1 ? c[r] : c.readUInt16BE(r * A);
}
if (i) {
var a = -1;
for (e = g; e < s; e++) if (n(t, e) === n(I, a === -1 ? 0 : e - a)) {
if (a === -1 && (a = e), e - a + 1 === l) return a * A;
} else a !== -1 && (e -= e - a), a = -1;
} else for (g + l > s && (g = s - l), e = g; e >= 0; e--) {
for (var d = !0, o = 0; o < l; o++) if (n(t, e + o) !== n(I, o)) {
d = !1;
break;
}
if (d) return e;
}
return -1;
}
function Org(t, I, g, C) {
g = Number(g) || 0;
var i = t.length - g;
C ? (C = Number(C)) > i && (C = i) : C = i;
var e = I.length;
if (e % 2 != 0) throw new TypeError("Invalid hex string");
C > e / 2 && (C = e / 2);
for (var A = 0; A < C; ++A) {
var s = parseInt(I.substr(2 * A, 2), 16);
if (isNaN(s)) return A;
t[g + A] = s;
}
return A;
}
function Urg(t, I, g, C) {
return eM(dV(I, t.length - g), t, g, C);
}
function oCg(t, I, g, C) {
return eM(function(i) {
for (var e = [], A = 0; A < i.length; ++A) e.push(255 & i.charCodeAt(A));
return e;
}(I), t, g, C);
}
function Erg(t, I, g, C) {
return oCg(t, I, g, C);
}
function Prg(t, I, g, C) {
return eM(rCg(I), t, g, C);
}
function _rg(t, I, g, C) {
return eM(function(i, e) {
for (var A, s, l, n = [], a = 0; a < i.length && !((e -= 2) < 0); ++a) s = (A = i.charCodeAt(a)) >> 8, l = A % 256, n.push(l), n.push(s);
return n;
}(I, t.length - g), t, g, C);
}
function qrg(t, I, g) {
return I === 0 && g === t.length ? Y8(t) : Y8(t.slice(I, g));
}
function cCg(t, I, g) {
g = Math.min(t.length, g);
for (var C = [], i = I; i < g; ) {
var e, A, s, l, n = t[i], a = null, d = n > 239 ? 4 : n > 223 ? 3 : n > 191 ? 2 : 1;
if (i + d <= g) switch (d) {
case 1:
n < 128 && (a = n);
break;
case 2:
(192 & (e = t[i + 1])) == 128 && (l = (31 & n) << 6 | 63 & e) > 127 && (a = l);
break;
case 3:
e = t[i + 1], A = t[i + 2], (192 & e) == 128 && (192 & A) == 128 && (l = (15 & n) << 12 | (63 & e) << 6 | 63 & A) > 2047 && (l < 55296 || l > 57343) && (a = l);
break;
case 4:
e = t[i + 1], A = t[i + 2], s = t[i + 3], (192 & e) == 128 && (192 & A) == 128 && (192 & s) == 128 && (l = (15 & n) << 18 | (63 & e) << 12 | (63 & A) << 6 | 63 & s) > 65535 && l < 1114112 && (a = l);
}
a === null ? (a = 65533, d = 1) : a > 65535 && (a -= 65536, C.push(a >>> 10 & 1023 | 55296), a = 56320 | 1023 & a), C.push(a), i += d;
}
return function(o) {
var c = o.length;
if (c <= 4096) return String.fromCharCode.apply(String, o);
for (var r = "", h = 0; h < c; ) r += String.fromCharCode.apply(String, o.slice(h, h += 4096));
return r;
}(C);
}
Hg.poolSize = 8192, Hg._augment = function(t) {
return t.__proto__ = Hg.prototype, t;
}, Hg.from = function(t, I, g) {
return lCg(null, t, I, g);
}, Hg.TYPED_ARRAY_SUPPORT && (Hg.prototype.__proto__ = Uint8Array.prototype, Hg.__proto__ = Uint8Array, typeof Symbol < "u" && Symbol.species && Hg[Symbol.species]), Hg.alloc = function(t, I, g) {
return function(C, i, e, A) {
return nCg(i), i <= 0 ? Pl(C, i) : e !== void 0 ? typeof A == "string" ? Pl(C, i).fill(e, A) : Pl(C, i).fill(e) : Pl(C, i);
}(null, t, I, g);
}, Hg.allocUnsafe = function(t) {
return aD(null, t);
}, Hg.allocUnsafeSlow = function(t) {
return aD(null, t);
}, Hg.isBuffer = dG, Hg.compare = function(t, I) {
if (!Ss(t) || !Ss(I)) throw new TypeError("Arguments must be Buffers");
if (t === I) return 0;
for (var g = t.length, C = I.length, i = 0, e = Math.min(g, C); i < e; ++i) if (t[i] !== I[i]) {
g = t[i], C = I[i];
break;
}
return g < C ? -1 : C < g ? 1 : 0;
}, Hg.isEncoding = function(t) {
switch (String(t).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 !0;
default:
return !1;
}
}, Hg.concat = function(t, I) {
if (!sCg(t)) throw new TypeError('"list" argument must be an Array of Buffers');
if (t.length === 0) return Hg.alloc(0);
var g;
if (I === void 0) for (I = 0, g = 0; g < t.length; ++g) I += t[g].length;
var C = Hg.allocUnsafe(I), i = 0;
for (g = 0; g < t.length; ++g) {
var e = t[g];
if (!Ss(e)) throw new TypeError('"list" argument must be an Array of Buffers');
e.copy(C, i), i += e.length;
}
return C;
}, Hg.byteLength = aCg, Hg.prototype._isBuffer = !0, Hg.prototype.swap16 = function() {
var t = this.length;
if (t % 2 != 0) throw new RangeError("Buffer size must be a multiple of 16-bits");
for (var I = 0; I < t; I += 2) Lo(this, I, I + 1);
return this;
}, Hg.prototype.swap32 = function() {
var t = this.length;
if (t % 4 != 0) throw new RangeError("Buffer size must be a multiple of 32-bits");
for (var I = 0; I < t; I += 4) Lo(this, I, I + 3), Lo(this, I + 1, I + 2);
return this;
}, Hg.prototype.swap64 = function() {
var t = this.length;
if (t % 8 != 0) throw new RangeError("Buffer size must be a multiple of 64-bits");
for (var I = 0; I < t; I += 8) Lo(this, I, I + 7), Lo(this, I + 1, I + 6), Lo(this, I + 2, I + 5), Lo(this, I + 3, I + 4);
return this;
}, Hg.prototype.toString = function() {
var t = 0 | this.length;
return t === 0 ? "" : arguments.length === 0 ? cCg(this, 0, t) : Qrg.apply(this, arguments);
}, Hg.prototype.equals = function(t) {
if (!Ss(t)) throw new TypeError("Argument must be a Buffer");
return this === t || Hg.compare(this, t) === 0;
}, Hg.prototype.inspect = function() {
var t = "";
return this.length > 0 && (t = this.toString("hex", 0, 50).match(/.{2}/g).join(" "), this.length > 50 && (t += " ... ")), "";
}, Hg.prototype.compare = function(t, I, g, C, i) {
if (!Ss(t)) throw new TypeError("Argument must be a Buffer");
if (I === void 0 && (I = 0), g === void 0 && (g = t ? t.length : 0), C === void 0 && (C = 0), i === void 0 && (i = this.length), I < 0 || g > t.length || C < 0 || i > this.length) throw new RangeError("out of range index");
if (C >= i && I >= g) return 0;
if (C >= i) return -1;
if (I >= g) return 1;
if (this === t) return 0;
for (var e = (i >>>= 0) - (C >>>= 0), A = (g >>>= 0) - (I >>>= 0), s = Math.min(e, A), l = this.slice(C, i), n = t.slice(I, g), a = 0; a < s; ++a) if (l[a] !== n[a]) {
e = l[a], A = n[a];
break;
}
return e < A ? -1 : A < e ? 1 : 0;
}, Hg.prototype.includes = function(t, I, g) {
return this.indexOf(t, I, g) !== -1;
}, Hg.prototype.indexOf = function(t, I, g) {
return N8(this, t, I, g, !0);
}, Hg.prototype.lastIndexOf = function(t, I, g) {
return N8(this, t, I, g, !1);
}, Hg.prototype.write = function(t, I, g, C) {
if (I === void 0) C = "utf8", g = this.length, I = 0;
else if (g === void 0 && typeof I == "string") C = I, g = this.length, I = 0;
else {
if (!isFinite(I)) throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");
I |= 0, isFinite(g) ? (g |= 0, C === void 0 && (C = "utf8")) : (C = g, g = void 0);
}
var i = this.length - I;
if ((g === void 0 || g > i) && (g = i), t.length > 0 && (g < 0 || I < 0) || I > this.length) throw new RangeError("Attempt to write outside buffer bounds");
C || (C = "utf8");
for (var e = !1; ; ) switch (C) {
case "hex":
return Org(this, t, I, g);
case "utf8":
case "utf-8":
return Urg(this, t, I, g);
case "ascii":
return oCg(this, t, I, g);
case "latin1":
case "binary":
return Erg(this, t, I, g);
case "base64":
return Prg(this, t, I, g);
case "ucs2":
case "ucs-2":
case "utf16le":
case "utf-16le":
return _rg(this, t, I, g);
default:
if (e) throw new TypeError("Unknown encoding: " + C);
C = ("" + C).toLowerCase(), e = !0;
}
}, Hg.prototype.toJSON = function() {
return { type: "Buffer", data: Array.prototype.slice.call(this._arr || this, 0) };
};
function $rg(t, I, g) {
var C = "";
g = Math.min(t.length, g);
for (var i = I; i < g; ++i) C += String.fromCharCode(127 & t[i]);
return C;
}
function ghg(t, I, g) {
var C = "";
g = Math.min(t.length, g);
for (var i = I; i < g; ++i) C += String.fromCharCode(t[i]);
return C;
}
function Ihg(t, I, g) {
var C = t.length;
(!I || I < 0) && (I = 0), (!g || g < 0 || g > C) && (g = C);
for (var i = "", e = I; e < g; ++e) i += ihg(t[e]);
return i;
}
function Chg(t, I, g) {
for (var C = t.slice(I, g), i = "", e = 0; e < C.length; e += 2) i += String.fromCharCode(C[e] + 256 * C[e + 1]);
return i;
}
function Xt(t, I, g) {
if (t % 1 != 0 || t < 0) throw new RangeError("offset is not uint");
if (t + I > g) throw new RangeError("Trying to access beyond buffer length");
}
function Ji(t, I, g, C, i, e) {
if (!Ss(t)) throw new TypeError('"buffer" argument must be a Buffer instance');
if (I > i || I < e) throw new RangeError('"value" argument is out of bounds');
if (g + C > t.length) throw new RangeError("Index out of range");
}
function OY(t, I, g, C) {
I < 0 && (I = 65535 + I + 1);
for (var i = 0, e = Math.min(t.length - g, 2); i < e; ++i) t[g + i] = (I & 255 << 8 * (C ? i : 1 - i)) >>> 8 * (C ? i : 1 - i);
}
function UY(t, I, g, C) {
I < 0 && (I = 4294967295 + I + 1);
for (var i = 0, e = Math.min(t.length - g, 4); i < e; ++i) t[g + i] = I >>> 8 * (C ? i : 3 - i) & 255;
}
function dCg(t, I, g, C, i, e) {
if (g + C > t.length) throw new RangeError("Index out of range");
if (g < 0) throw new RangeError("Index out of range");
}
function M8(t, I, g, C, i) {
return i || dCg(t, 0, g, 4), ACg(t, I, g, C, 23, 4), g + 4;
}
function R8(t, I, g, C, i) {
return i || dCg(t, 0, g, 8), ACg(t, I, g, C, 52, 8), g + 8;
}
Hg.prototype.slice = function(t, I) {
var g, C = this.length;
if ((t = ~~t) < 0 ? (t += C) < 0 && (t = 0) : t > C && (t = C), (I = I === void 0 ? C : ~~I) < 0 ? (I += C) < 0 && (I = 0) : I > C && (I = C), I < t && (I = t), Hg.TYPED_ARRAY_SUPPORT) (g = this.subarray(t, I)).__proto__ = Hg.prototype;
else {
var i = I - t;
g = new Hg(i, void 0);
for (var e = 0; e < i; ++e) g[e] = this[e + t];
}
return g;
}, Hg.prototype.readUIntLE = function(t, I, g) {
t |= 0, I |= 0, g || Xt(t, I, this.length);
for (var C = this[t], i = 1, e = 0; ++e < I && (i *= 256); ) C += this[t + e] * i;
return C;
}, Hg.prototype.readUIntBE = function(t, I, g) {
t |= 0, I |= 0, g || Xt(t, I, this.length);
for (var C = this[t + --I], i = 1; I > 0 && (i *= 256); ) C += this[t + --I] * i;
return C;
}, Hg.prototype.readUInt8 = function(t, I) {
return I || Xt(t, 1, this.length), this[t];
}, Hg.prototype.readUInt16LE = function(t, I) {
return I || Xt(t, 2, this.length), this[t] | this[t + 1] << 8;
}, Hg.prototype.readUInt16BE = function(t, I) {
return I || Xt(t, 2, this.length), this[t] << 8 | this[t + 1];
}, Hg.prototype.readUInt32LE = function(t, I) {
return I || Xt(t, 4, this.length), (this[t] | this[t + 1] << 8 | this[t + 2] << 16) + 16777216 * this[t + 3];
}, Hg.prototype.readUInt32BE = function(t, I) {
return I || Xt(t, 4, this.length), 16777216 * this[t] + (this[t + 1] << 16 | this[t + 2] << 8 | this[t + 3]);
}, Hg.prototype.readIntLE = function(t, I, g) {
t |= 0, I |= 0, g || Xt(t, I, this.length);
for (var C = this[t], i = 1, e = 0; ++e < I && (i *= 256); ) C += this[t + e] * i;
return C >= (i *= 128) && (C -= Math.pow(2, 8 * I)), C;
}, Hg.prototype.readIntBE = function(t, I, g) {
t |= 0, I |= 0, g || Xt(t, I, this.length);
for (var C = I, i = 1, e = this[t + --C]; C > 0 && (i *= 256); ) e += this[t + --C] * i;
return e >= (i *= 128) && (e -= Math.pow(2, 8 * I)), e;
}, Hg.prototype.readInt8 = function(t, I) {
return I || Xt(t, 1, this.length), 128 & this[t] ? -1 * (255 - this[t] + 1) : this[t];
}, Hg.prototype.readInt16LE = function(t, I) {
I || Xt(t, 2, this.length);
var g = this[t] | this[t + 1] << 8;
return 32768 & g ? 4294901760 | g : g;
}, Hg.prototype.readInt16BE = function(t, I) {
I || Xt(t, 2, this.length);
var g = this[t + 1] | this[t] << 8;
return 32768 & g ? 4294901760 | g : g;
}, Hg.prototype.readInt32LE = function(t, I) {
return I || Xt(t, 4, this.length), this[t] | this[t + 1] << 8 | this[t + 2] << 16 | this[t + 3] << 24;
}, Hg.prototype.readInt32BE = function(t, I) {
return I || Xt(t, 4, this.length), this[t] << 24 | this[t + 1] << 16 | this[t + 2] << 8 | this[t + 3];
}, Hg.prototype.readFloatLE = function(t, I) {
return I || Xt(t, 4, this.length), QY(this, t, !0, 23, 4);
}, Hg.prototype.readFloatBE = function(t, I) {
return I || Xt(t, 4, this.length), QY(this, t, !1, 23, 4);
}, Hg.prototype.readDoubleLE = function(t, I) {
return I || Xt(t, 8, this.length), QY(this, t, !0, 52, 8);
}, Hg.prototype.readDoubleBE = function(t, I) {
return I || Xt(t, 8, this.length), QY(this, t, !1, 52, 8);
}, Hg.prototype.writeUIntLE = function(t, I, g, C) {
t = +t, I |= 0, g |= 0, C || Ji(this, t, I, g, Math.pow(2, 8 * g) - 1, 0);
var i = 1, e = 0;
for (this[I] = 255 & t; ++e < g && (i *= 256); ) this[I + e] = t / i & 255;
return I + g;
}, Hg.prototype.writeUIntBE = function(t, I, g, C) {
t = +t, I |= 0, g |= 0, C || Ji(this, t, I, g, Math.pow(2, 8 * g) - 1, 0);
var i = g - 1, e = 1;
for (this[I + i] = 255 & t; --i >= 0 && (e *= 256); ) this[I + i] = t / e & 255;
return I + g;
}, Hg.prototype.writeUInt8 = function(t, I, g) {
return t = +t, I |= 0, g || Ji(this, t, I, 1, 255, 0), Hg.TYPED_ARRAY_SUPPORT || (t = Math.floor(t)), this[I] = 255 & t, I + 1;
}, Hg.prototype.writeUInt16LE = function(t, I, g) {
return t = +t, I |= 0, g || Ji(this, t, I, 2, 65535, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = 255 & t, this[I + 1] = t >>> 8) : OY(this, t, I, !0), I + 2;
}, Hg.prototype.writeUInt16BE = function(t, I, g) {
return t = +t, I |= 0, g || Ji(this, t, I, 2, 65535, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 8, this[I + 1] = 255 & t) : OY(this, t, I, !1), I + 2;
}, Hg.prototype.writeUInt32LE = function(t, I, g) {
return t = +t, I |= 0, g || Ji(this, t, I, 4, 4294967295, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I + 3] = t >>> 24, this[I + 2] = t >>> 16, this[I + 1] = t >>> 8, this[I] = 255 & t) : UY(this, t, I, !0), I + 4;
}, Hg.prototype.writeUInt32BE = function(t, I, g) {
return t = +t, I |= 0, g || Ji(this, t, I, 4, 4294967295, 0), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 24, this[I + 1] = t >>> 16, this[I + 2] = t >>> 8, this[I + 3] = 255 & t) : UY(this, t, I, !1), I + 4;
}, Hg.prototype.writeIntLE = function(t, I, g, C) {
if (t = +t, I |= 0, !C) {
var i = Math.pow(2, 8 * g - 1);
Ji(this, t, I, g, i - 1, -i);
}
var e = 0, A = 1, s = 0;
for (this[I] = 255 & t; ++e < g && (A *= 256); ) t < 0 && s === 0 && this[I + e - 1] !== 0 && (s = 1), this[I + e] = (t / A >> 0) - s & 255;
return I + g;
}, Hg.prototype.writeIntBE = function(t, I, g, C) {
if (t = +t, I |= 0, !C) {
var i = Math.pow(2, 8 * g - 1);
Ji(this, t, I, g, i - 1, -i);
}
var e = g - 1, A = 1, s = 0;
for (this[I + e] = 255 & t; --e >= 0 && (A *= 256); ) t < 0 && s === 0 && this[I + e + 1] !== 0 && (s = 1), this[I + e] = (t / A >> 0) - s & 255;
return I + g;
}, Hg.prototype.writeInt8 = function(t, I, g) {
return t = +t, I |= 0, g || Ji(this, t, I, 1, 127, -128), Hg.TYPED_ARRAY_SUPPORT || (t = Math.floor(t)), t < 0 && (t = 255 + t + 1), this[I] = 255 & t, I + 1;
}, Hg.prototype.writeInt16LE = function(t, I, g) {
return t = +t, I |= 0, g || Ji(this, t, I, 2, 32767, -32768), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = 255 & t, this[I + 1] = t >>> 8) : OY(this, t, I, !0), I + 2;
}, Hg.prototype.writeInt16BE = function(t, I, g) {
return t = +t, I |= 0, g || Ji(this, t, I, 2, 32767, -32768), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 8, this[I + 1] = 255 & t) : OY(this, t, I, !1), I + 2;
}, Hg.prototype.writeInt32LE = function(t, I, g) {
return t = +t, I |= 0, g || Ji(this, t, I, 4, 2147483647, -2147483648), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = 255 & t, this[I + 1] = t >>> 8, this[I + 2] = t >>> 16, this[I + 3] = t >>> 24) : UY(this, t, I, !0), I + 4;
}, Hg.prototype.writeInt32BE = function(t, I, g) {
return t = +t, I |= 0, g || Ji(this, t, I, 4, 2147483647, -2147483648), t < 0 && (t = 4294967295 + t + 1), Hg.TYPED_ARRAY_SUPPORT ? (this[I] = t >>> 24, this[I + 1] = t >>> 16, this[I + 2] = t >>> 8, this[I + 3] = 255 & t) : UY(this, t, I, !1), I + 4;
}, Hg.prototype.writeFloatLE = function(t, I, g) {
return M8(this, t, I, !0, g);
}, Hg.prototype.writeFloatBE = function(t, I, g) {
return M8(this, t, I, !1, g);
}, Hg.prototype.writeDoubleLE = function(t, I, g) {
return R8(this, t, I, !0, g);
}, Hg.prototype.writeDoubleBE = function(t, I, g) {
return R8(this, t, I, !1, g);
}, Hg.prototype.copy = function(t, I, g, C) {
if (g || (g = 0), C || C === 0 || (C = this.length), I >= t.length && (I = t.length), I || (I = 0), C > 0 && C < g && (C = g), C === g || t.length === 0 || this.length === 0) return 0;
if (I < 0) throw new RangeError("targetStart out of bounds");
if (g < 0 || g >= this.length) throw new RangeError("sourceStart out of bounds");
if (C < 0) throw new RangeError("sourceEnd out of bounds");
C > this.length && (C = this.length), t.length - I < C - g && (C = t.length - I + g);
var i, e = C - g;
if (this === t && g < I && I < C) for (i = e - 1; i >= 0; --i) t[i + I] = this[i + g];
else if (e < 1e3 || !Hg.TYPED_ARRAY_SUPPORT) for (i = 0; i < e; ++i) t[i + I] = this[i + g];
else Uint8Array.prototype.set.call(t, this.subarray(g, g + e), I);
return e;
}, Hg.prototype.fill = function(t, I, g, C) {
if (typeof t == "string") {
if (typeof I == "string" ? (C = I, I = 0, g = this.length) : typeof g == "string" && (C = g, g = this.length), t.length === 1) {
var i = t.charCodeAt(0);
i < 256 && (t = i);
}
if (C !== void 0 && typeof C != "string") throw new TypeError("encoding must be a string");
if (typeof C == "string" && !Hg.isEncoding(C)) throw new TypeError("Unknown encoding: " + C);
} else typeof t == "number" && (t &= 255);
if (I < 0 || this.length < I || this.length < g) throw new RangeError("Out of range index");
if (g <= I) return this;
var e;
if (I >>>= 0, g = g === void 0 ? this.length : g >>> 0, t || (t = 0), typeof t == "number") for (e = I; e < g; ++e) this[e] = t;
else {
var A = Ss(t) ? t : dV(new Hg(t, C).toString()), s = A.length;
for (e = 0; e < g - I; ++e) this[e + I] = A[e % s];
}
return this;
};
var thg = /[^+\/0-9A-Za-z-_]/g;
function ihg(t) {
return t < 16 ? "0" + t.toString(16) : t.toString(16);
}
function dV(t, I) {
var g;
I = I || 1 / 0;
for (var C = t.length, i = null, e = [], A = 0; A < C; ++A) {
if ((g = t.charCodeAt(A)) > 55295 && g < 57344) {
if (!i) {
if (g > 56319) {
(I -= 3) > -1 && e.push(239, 191, 189);
continue;
}
if (A + 1 === C) {
(I -= 3) > -1 && e.push(239, 191, 189);
continue;
}
i = g;
continue;
}
if (g < 56320) {
(I -= 3) > -1 && e.push(239, 191, 189), i = g;
continue;
}
g = 65536 + (i - 55296 << 10 | g - 56320);
} else i && (I -= 3) > -1 && e.push(239, 191, 189);
if (i = null, g < 128) {
if ((I -= 1) < 0) break;
e.push(g);
} else if (g < 2048) {
if ((I -= 2) < 0) break;
e.push(g >> 6 | 192, 63 & g | 128);
} else if (g < 65536) {
if ((I -= 3) < 0) break;
e.push(g >> 12 | 224, g >> 6 & 63 | 128, 63 & g | 128);
} else {
if (!(g < 1114112)) throw new Error("Invalid code point");
if ((I -= 4) < 0) break;
e.push(g >> 18 | 240, g >> 12 & 63 | 128, g >> 6 & 63 | 128, 63 & g | 128);
}
}
return e;
}
function rCg(t) {
return function(I) {
var g, C, i, e, A, s;
H9 || eCg();
var l = I.length;
if (l % 4 > 0) throw new Error("Invalid string. Length must be a multiple of 4");
A = I[l - 2] === "=" ? 2 : I[l - 1] === "=" ? 1 : 0, s = new vrg(3 * l / 4 - A), i = A > 0 ? l - 4 : l;
var n = 0;
for (g = 0, C = 0; g < i; g += 4, C += 3) e = xe[I.charCodeAt(g)] << 18 | xe[I.charCodeAt(g + 1)] << 12 | xe[I.charCodeAt(g + 2)] << 6 | xe[I.charCodeAt(g + 3)], s[n++] = e >> 16 & 255, s[n++] = e >> 8 & 255, s[n++] = 255 & e;
return A === 2 ? (e = xe[I.charCodeAt(g)] << 2 | xe[I.charCodeAt(g + 1)] >> 4, s[n++] = 255 & e) : A === 1 && (e = xe[I.charCodeAt(g)] << 10 | xe[I.charCodeAt(g + 1)] << 4 | xe[I.charCodeAt(g + 2)] >> 2, s[n++] = e >> 8 & 255, s[n++] = 255 & e), s;
}(function(I) {
if ((I = function(g) {
return g.trim ? g.trim() : g.replace(/^\s+|\s+$/g, "");
}(I).replace(thg, "")).length < 2) return "";
for (; I.length % 4 != 0; ) I += "=";
return I;
}(t));
}
function eM(t, I, g, C) {
for (var i = 0; i < C && !(i + g >= I.length || i >= t.length); ++i) I[i + g] = t[i];
return i;
}
function dG(t) {
return t != null && (!!t._isBuffer || f8(t) || function(I) {
return typeof I.readFloatLE == "function" && typeof I.slice == "function" && f8(I.slice(0, 0));
}(t));
}
function f8(t) {
return !!t.constructor && typeof t.constructor.isBuffer == "function" && t.constructor.isBuffer(t);
}
var ehg = Object.freeze({ __proto__: null, INSPECT_MAX_BYTES: 50, kMaxLength: jrg, Buffer: Hg, SlowBuffer: function(t) {
return +t != t && (t = 0), Hg.alloc(+t);
}, isBuffer: dG }), rt = {};
function hCg() {
throw new Error("setTimeout has not been defined");
}
function bCg() {
throw new Error("clearTimeout has not been defined");
}
var ga = hCg, Ia = bCg;
function uCg(t) {
if (ga === setTimeout) return setTimeout(t, 0);
if ((ga === hCg || !ga) && setTimeout) return ga = setTimeout, setTimeout(t, 0);
try {
return ga(t, 0);
} catch {
try {
return ga.call(null, t, 0);
} catch {
return ga.call(this, t, 0);
}
}
}
typeof W0.setTimeout == "function" && (ga = setTimeout), typeof W0.clearTimeout == "function" && (Ia = clearTimeout);
var $o, _l = [], rh = !1, TN = -1;
function Ahg() {
rh && $o && (rh = !1, $o.length ? _l = $o.concat(_l) : TN = -1, _l.length && mCg());
}
function mCg() {
if (!rh) {
var t = uCg(Ahg);
rh = !0;
for (var I = _l.length; I; ) {
for ($o = _l, _l = []; ++TN < I; ) $o && $o[TN].run();
TN = -1, I = _l.length;
}
$o = null, rh = !1, function(g) {
if (Ia === clearTimeout) return clearTimeout(g);
if ((Ia === bCg || !Ia) && clearTimeout) return Ia = clearTimeout, clearTimeout(g);
try {
Ia(g);
} catch {
try {
return Ia.call(null, g);
} catch {
return Ia.call(this, g);
}
}
}(t);
}
}
function vt(t) {
var I = new Array(arguments.length - 1);
if (arguments.length > 1) for (var g = 1; g < arguments.length; g++) I[g - 1] = arguments[g];
_l.push(new ZCg(t, I)), _l.length !== 1 || rh || uCg(mCg);
}
function ZCg(t, I) {
this.fun = t, this.array = I;
}
ZCg.prototype.run = function() {
this.fun.apply(null, this.array);
};
var Fu = W0.performance || {};
Fu.now || Fu.mozNow || Fu.msNow || Fu.oNow || Fu.webkitNow;
var ld = { env: {} }, _H = { exports: {} };
function Ca() {
}
function qI() {
qI.init.call(this);
}
function GCg(t) {
return t._maxListeners === void 0 ? qI.defaultMaxListeners : t._maxListeners;
}
function shg(t, I, g) {
if (I) t.call(g);
else for (var C = t.length, i = rG(t, C), e = 0; e < C; ++e) i[e].call(g);
}
function lhg(t, I, g, C) {
if (I) t.call(g, C);
else for (var i = t.length, e = rG(t, i), A = 0; A < i; ++A) e[A].call(g, C);
}
function nhg(t, I, g, C, i) {
if (I) t.call(g, C, i);
else for (var e = t.length, A = rG(t, e), s = 0; s < e; ++s) A[s].call(g, C, i);
}
function ahg(t, I, g, C, i, e) {
if (I) t.call(g, C, i, e);
else for (var A = t.length, s = rG(t, A), l = 0; l < A; ++l) s[l].call(g, C, i, e);
}
function ohg(t, I, g, C) {
if (I) t.apply(g, C);
else for (var i = t.length, e = rG(t, i), A = 0; A < i; ++A) e[A].apply(g, C);
}
function H8(t, I, g, C) {
var i, e, A, s;
if (typeof g != "function") throw new TypeError('"listener" argument must be a function');
if ((e = t._events) ? (e.newListener && (t.emit("newListener", I, g.listener ? g.listener : g), e = t._events), A = e[I]) : (e = t._events = new Ca(), t._eventsCount = 0), A) {
if (typeof A == "function" ? A = e[I] = C ? [g, A] : [A, g] : C ? A.unshift(g) : A.push(g), !A.warned && (i = GCg(t)) && i > 0 && A.length > i) {
A.warned = !0;
var l = new Error("Possible EventEmitter memory leak detected. " + A.length + " " + I + " listeners added. Use emitter.setMaxListeners() to increase limit");
l.name = "MaxListenersExceededWarning", l.emitter = t, l.type = I, l.count = A.length, s = l, typeof console.warn == "function" ? console.warn(s) : console.log(s);
}
} else A = e[I] = g, ++t._eventsCount;
return t;
}
function X8(t, I, g) {
var C = !1;
function i() {
t.removeListener(I, i), C || (C = !0, g.apply(t, arguments));
}
return i.listener = g, i;
}
function S8(t) {
var I = this._events;
if (I) {
var g = I[t];
if (typeof g == "function") return 1;
if (g) return g.length;
}
return 0;
}
function rG(t, I) {
for (var g = new Array(I); I--; ) g[I] = t[I];
return g;
}
Ca.prototype = /* @__PURE__ */ Object.create(null), qI.EventEmitter = qI, qI.usingDomains = !1, qI.prototype.domain = void 0, qI.prototype._events = void 0, qI.prototype._maxListeners = void 0, qI.defaultMaxListeners = 10, qI.init = function() {
this.domain = null, qI.usingDomains && (void 0).active, this._events && this._events !== Object.getPrototypeOf(this)._events || (this._events = new Ca(), this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0;
}, qI.prototype.setMaxListeners = function(t) {
if (typeof t != "number" || t < 0 || isNaN(t)) throw new TypeError('"n" argument must be a positive number');
return this._maxListeners = t, this;
}, qI.prototype.getMaxListeners = function() {
return GCg(this);
}, qI.prototype.emit = function(t) {
var I, g, C, i, e, A, s, l = t === "error";
if (A = this._events) l = l && A.error == null;
else if (!l) return !1;
if (s = this.domain, l) {
if (I = arguments[1], !s) {
if (I instanceof Error) throw I;
var n = new Error('Uncaught, unspecified "error" event. (' + I + ")");
throw n.context = I, n;
}
return I || (I = new Error('Uncaught, unspecified "error" event')), I.domainEmitter = this, I.domain = s, I.domainThrown = !1, s.emit("error", I), !1;
}
if (!(g = A[t])) return !1;
var a = typeof g == "function";
switch (C = arguments.length) {
case 1:
shg(g, a, this);
break;
case 2:
lhg(g, a, this, arguments[1]);
break;
case 3:
nhg(g, a, this, arguments[1], arguments[2]);
break;
case 4:
ahg(g, a, this, arguments[1], arguments[2], arguments[3]);
break;
default:
for (i = new Array(C - 1), e = 1; e < C; e++) i[e - 1] = arguments[e];
ohg(g, a, this, i);
}
return !0;
}, qI.prototype.addListener = function(t, I) {
return H8(this, t, I, !1);
}, qI.prototype.on = qI.prototype.addListener, qI.prototype.prependListener = function(t, I) {
return H8(this, t, I, !0);
}, qI.prototype.once = function(t, I) {
if (typeof I != "function") throw new TypeError('"listener" argument must be a function');
return this.on(t, X8(this, t, I)), this;
}, qI.prototype.prependOnceListener = function(t, I) {
if (typeof I != "function") throw new TypeError('"listener" argument must be a function');
return this.prependListener(t, X8(this, t, I)), this;
}, qI.prototype.removeListener = function(t, I) {
var g, C, i, e, A;
if (typeof I != "function") throw new TypeError('"listener" argument must be a function');
if (!(C = this._events)) return this;
if (!(g = C[t])) return this;
if (g === I || g.listener && g.listener === I) --this._eventsCount == 0 ? this._events = new Ca() : (delete C[t], C.removeListener && this.emit("removeListener", t, g.listener || I));
else if (typeof g != "function") {
for (i = -1, e = g.length; e-- > 0; ) if (g[e] === I || g[e].listener && g[e].listener === I) {
A = g[e].listener, i = e;
break;
}
if (i < 0) return this;
if (g.length === 1) {
if (g[0] = void 0, --this._eventsCount == 0) return this._events = new Ca(), this;
delete C[t];
} else (function(s, l) {
for (var n = l, a = n + 1, d = s.length; a < d; n += 1, a += 1) s[n] = s[a];
s.pop();
})(g, i);
C.removeListener && this.emit("removeListener", t, A || I);
}
return this;
}, qI.prototype.removeAllListeners = function(t) {
var I, g;
if (!(g = this._events)) return this;
if (!g.removeListener) return arguments.length === 0 ? (this._events = new Ca(), this._eventsCount = 0) : g[t] && (--this._eventsCount == 0 ? this._events = new Ca() : delete g[t]), this;
if (arguments.length === 0) {
for (var C, i = Object.keys(g), e = 0; e < i.length; ++e) (C = i[e]) !== "removeListener" && this.removeAllListeners(C);
return this.removeAllListeners("removeListener"), this._events = new Ca(), this._eventsCount = 0, this;
}
if (typeof (I = g[t]) == "function") this.removeListener(t, I);
else if (I) do
this.removeListener(t, I[I.length - 1]);
while (I[0]);
return this;
}, qI.prototype.listeners = function(t) {
var I, g, C = this._events;
return g = C && (I = C[t]) ? typeof I == "function" ? [I.listener || I] : function(i) {
for (var e = new Array(i.length), A = 0; A < e.length; ++A) e[A] = i[A].listener || i[A];
return e;
}(I) : [], g;
}, qI.listenerCount = function(t, I) {
return typeof t.listenerCount == "function" ? t.listenerCount(I) : S8.call(t, I);
}, qI.prototype.listenerCount = S8, qI.prototype.eventNames = function() {
return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
};
var chg = Object.freeze({ __proto__: null, default: qI, EventEmitter: qI }), Oa = typeof Object.create == "function" ? function(t, I) {
t.super_ = I, t.prototype = Object.create(I.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } });
} : function(t, I) {
t.super_ = I;
var g = function() {
};
g.prototype = I.prototype, t.prototype = new g(), t.prototype.constructor = t;
}, dhg = /%[sdj%]/g;
function AM(t) {
if (!fm(t)) {
for (var I = [], g = 0; g < arguments.length; g++) I.push(ks(arguments[g]));
return I.join(" ");
}
g = 1;
for (var C = arguments, i = C.length, e = String(t).replace(dhg, function(s) {
if (s === "%%") return "%";
if (g >= i) return s;
switch (s) {
case "%s":
return String(C[g++]);
case "%d":
return Number(C[g++]);
case "%j":
try {
return JSON.stringify(C[g++]);
} catch {
return "[Circular]";
}
default:
return s;
}
}), A = C[g]; g < i; A = C[++g]) hG(A) || !Zd(A) ? e += " " + A : e += " " + ks(A);
return e;
}
function sM(t, I) {
if (Ks(W0.process)) return function() {
return sM(t, I).apply(this, arguments);
};
if (ld.noDeprecation === !0) return t;
var g = !1;
return function() {
if (!g) {
if (ld.throwDeprecation) throw new Error(I);
ld.traceDeprecation ? console.trace(I) : console.error(I), g = !0;
}
return t.apply(this, arguments);
};
}
var qH, EY = {};
function S9(t) {
return Ks(qH) && (qH = ld.env.NODE_DEBUG || ""), t = t.toUpperCase(), !EY[t] && (new RegExp("\\b" + t + "\\b", "i").test(qH) ? EY[t] = function() {
var I = AM.apply(null, arguments);
console.error("%s %d: %s", t, 0, I);
} : EY[t] = function() {
}), EY[t];
}
function ks(t, I) {
var g = { seen: [], stylize: hhg };
return arguments.length >= 3 && (g.depth = arguments[2]), arguments.length >= 4 && (g.colors = arguments[3]), lM(I) ? g.showHidden = I : I && k9(g, I), Ks(g.showHidden) && (g.showHidden = !1), Ks(g.depth) && (g.depth = 2), Ks(g.colors) && (g.colors = !1), Ks(g.customInspect) && (g.customInspect = !0), g.colors && (g.stylize = rhg), rV(g, t, g.depth);
}
function rhg(t, I) {
var g = ks.styles[I];
return g ? "\x1B[" + ks.colors[g][0] + "m" + t + "\x1B[" + ks.colors[g][1] + "m" : t;
}
function hhg(t, I) {
return t;
}
function rV(t, I, g) {
if (t.customInspect && I && Bm(I.inspect) && I.inspect !== ks && (!I.constructor || I.constructor.prototype !== I)) {
var C = I.inspect(g, t);
return fm(C) || (C = rV(t, C, g)), C;
}
var i = function(o, c) {
if (Ks(c)) return o.stylize("undefined", "undefined");
if (fm(c)) {
var r = "'" + JSON.stringify(c).replace(/^"|"$/g, "").replace(/'/g, "\\'").replace(/\\"/g, '"') + "'";
return o.stylize(r, "string");
}
if (K9(c)) return o.stylize("" + c, "number");
if (lM(c)) return o.stylize("" + c, "boolean");
if (hG(c)) return o.stylize("null", "null");
}(t, I);
if (i) return i;
var e = Object.keys(I), A = function(o) {
var c = {};
return o.forEach(function(r, h) {
c[r] = !0;
}), c;
}(e);
if (t.showHidden && (e = Object.getOwnPropertyNames(I)), pm(I) && (e.indexOf("message") >= 0 || e.indexOf("description") >= 0)) return $H(I);
if (e.length === 0) {
if (Bm(I)) {
var s = I.name ? ": " + I.name : "";
return t.stylize("[Function" + s + "]", "special");
}
if (wm(I)) return t.stylize(RegExp.prototype.toString.call(I), "regexp");
if (hV(I)) return t.stylize(Date.prototype.toString.call(I), "date");
if (pm(I)) return $H(I);
}
var l, n = "", a = !1, d = ["{", "}"];
return D9(I) && (a = !0, d = ["[", "]"]), Bm(I) && (n = " [Function" + (I.name ? ": " + I.name : "") + "]"), wm(I) && (n = " " + RegExp.prototype.toString.call(I)), hV(I) && (n = " " + Date.prototype.toUTCString.call(I)), pm(I) && (n = " " + $H(I)), e.length !== 0 || a && I.length != 0 ? g < 0 ? wm(I) ? t.stylize(RegExp.prototype.toString.call(I), "regexp") : t.stylize("[Object]", "special") : (t.seen.push(I), l = a ? function(o, c, r, h, b) {
for (var u = [], m = 0, Z = c.length; m < Z; ++m) YCg(c, String(m)) ? u.push(gX(o, c, r, h, String(m), !0)) : u.push("");
return b.forEach(function(p) {
p.match(/^\d+$/) || u.push(gX(o, c, r, h, p, !0));
}), u;
}(t, I, g, A, e) : e.map(function(o) {
return gX(t, I, g, A, o, a);
}), t.seen.pop(), function(o, c, r) {
return o.reduce(function(h, b) {
return b.indexOf(`
`), h + b.replace(/\u001b\[\d\d?m/g, "").length + 1;
}, 0) > 60 ? r[0] + (c === "" ? "" : c + `
`) + " " + o.join(`,
`) + " " + r[1] : r[0] + c + " " + o.join(", ") + " " + r[1];
}(l, n, d)) : d[0] + n + d[1];
}
function $H(t) {
return "[" + Error.prototype.toString.call(t) + "]";
}
function gX(t, I, g, C, i, e) {
var A, s, l;
if ((l = Object.getOwnPropertyDescriptor(I, i) || { value: I[i] }).get ? s = l.set ? t.stylize("[Getter/Setter]", "special") : t.stylize("[Getter]", "special") : l.set && (s = t.stylize("[Setter]", "special")), YCg(C, i) || (A = "[" + i + "]"), s || (t.seen.indexOf(l.value) < 0 ? (s = hG(g) ? rV(t, l.value, null) : rV(t, l.value, g - 1)).indexOf(`
`) > -1 && (s = e ? s.split(`
`).map(function(n) {
return " " + n;
}).join(`
`).substr(2) : `
` + s.split(`
`).map(function(n) {
return " " + n;
}).join(`
`)) : s = t.stylize("[Circular]", "special")), Ks(A)) {
if (e && i.match(/^\d+$/)) return s;
(A = JSON.stringify("" + i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/) ? (A = A.substr(1, A.length - 2), A = t.stylize(A, "name")) : (A = A.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'"), A = t.stylize(A, "string"));
}
return A + ": " + s;
}
function D9(t) {
return Array.isArray(t);
}
function lM(t) {
return typeof t == "boolean";
}
function hG(t) {
return t === null;
}
function wCg(t) {
return t == null;
}
function K9(t) {
return typeof t == "number";
}
function fm(t) {
return typeof t == "string";
}
function pCg(t) {
return typeof t == "symbol";
}
function Ks(t) {
return t === void 0;
}
function wm(t) {
return Zd(t) && F9(t) === "[object RegExp]";
}
function Zd(t) {
return typeof t == "object" && t !== null;
}
function hV(t) {
return Zd(t) && F9(t) === "[object Date]";
}
function pm(t) {
return Zd(t) && (F9(t) === "[object Error]" || t instanceof Error);
}
function Bm(t) {
return typeof t == "function";
}
function BCg(t) {
return t === null || typeof t == "boolean" || typeof t == "number" || typeof t == "string" || typeof t == "symbol" || t === void 0;
}
function WCg(t) {
return dG(t);
}
function F9(t) {
return Object.prototype.toString.call(t);
}
function IX(t) {
return t < 10 ? "0" + t.toString(10) : t.toString(10);
}
ks.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] }, ks.styles = { special: "cyan", number: "yellow", boolean: "yellow", undefined: "grey", null: "bold", string: "green", date: "magenta", regexp: "red" };
var bhg = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
function uhg() {
var t = /* @__PURE__ */ new Date(), I = [IX(t.getHours()), IX(t.getMinutes()), IX(t.getSeconds())].join(":");
return [t.getDate(), bhg[t.getMonth()], I].join(" ");
}
function yCg() {
console.log("%s - %s", uhg(), AM.apply(null, arguments));
}
function k9(t, I) {
if (!I || !Zd(I)) return t;
for (var g = Object.keys(I), C = g.length; C--; ) t[g[C]] = I[g[C]];
return t;
}
function YCg(t, I) {
return Object.prototype.hasOwnProperty.call(t, I);
}
var mhg = { inherits: Oa, _extend: k9, log: yCg, isBuffer: WCg, isPrimitive: BCg, isFunction: Bm, isError: pm, isDate: hV, isObject: Zd, isRegExp: wm, isUndefined: Ks, isSymbol: pCg, isString: fm, isNumber: K9, isNullOrUndefined: wCg, isNull: hG, isBoolean: lM, isArray: D9, inspect: ks, deprecate: sM, format: AM, debuglog: S9 }, Zhg = Object.freeze({ __proto__: null, format: AM, deprecate: sM, debuglog: S9, inspect: ks, isArray: D9, isBoolean: lM, isNull: hG, isNullOrUndefined: wCg, isNumber: K9, isString: fm, isSymbol: pCg, isUndefined: Ks, isRegExp: wm, isObject: Zd, isDate: hV, isError: pm, isFunction: Bm, isPrimitive: BCg, isBuffer: WCg, log: yCg, inherits: Oa, _extend: k9, default: mhg });
function Qo() {
this.head = null, this.tail = null, this.length = 0;
}
Qo.prototype.push = function(t) {
var I = { data: t, next: null };
this.length > 0 ? this.tail.next = I : this.head = I, this.tail = I, ++this.length;
}, Qo.prototype.unshift = function(t) {
var I = { data: t, next: this.head };
this.length === 0 && (this.tail = I), this.head = I, ++this.length;
}, Qo.prototype.shift = function() {
if (this.length !== 0) {
var t = this.head.data;
return this.length === 1 ? this.head = this.tail = null : this.head = this.head.next, --this.length, t;
}
}, Qo.prototype.clear = function() {
this.head = this.tail = null, this.length = 0;
}, Qo.prototype.join = function(t) {
if (this.length === 0) return "";
for (var I = this.head, g = "" + I.data; I = I.next; ) g += t + I.data;
return g;
}, Qo.prototype.concat = function(t) {
if (this.length === 0) return Hg.alloc(0);
if (this.length === 1) return this.head.data;
for (var I = Hg.allocUnsafe(t >>> 0), g = this.head, C = 0; g; ) g.data.copy(I, C), C += g.data.length, g = g.next;
return I;
};
var Ghg = Hg.isEncoding || function(t) {
switch (t && t.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 !0;
default:
return !1;
}
};
function Wm(t) {
switch (this.encoding = (t || "utf8").toLowerCase().replace(/[-_]/, ""), function(I) {
if (I && !Ghg(I)) throw new Error("Unknown encoding: " + I);
}(t), this.encoding) {
case "utf8":
this.surrogateSize = 3;
break;
case "ucs2":
case "utf16le":
this.surrogateSize = 2, this.detectIncompleteChar = phg;
break;
case "base64":
this.surrogateSize = 3, this.detectIncompleteChar = Bhg;
break;
default:
return void (this.write = whg);
}
this.charBuffer = new Hg(6), this.charReceived = 0, this.charLength = 0;
}
function whg(t) {
return t.toString(this.encoding);
}
function phg(t) {
this.charReceived = t.length % 2, this.charLength = this.charReceived ? 2 : 0;
}
function Bhg(t) {
this.charReceived = t.length % 3, this.charLength = this.charReceived ? 3 : 0;
}
Wm.prototype.write = function(t) {
for (var I = ""; this.charLength; ) {
var g = t.length >= this.charLength - this.charReceived ? this.charLength - this.charReceived : t.length;
if (t.copy(this.charBuffer, this.charReceived, 0, g), this.charReceived += g, this.charReceived < this.charLength) return "";
if (t = t.slice(g, t.length), !((i = (I = this.charBuffer.slice(0, this.charLength).toString(this.encoding)).charCodeAt(I.length - 1)) >= 55296 && i <= 56319)) {
if (this.charReceived = this.charLength = 0, t.length === 0) return I;
break;
}
this.charLength += this.surrogateSize, I = "";
}
this.detectIncompleteChar(t);
var C = t.length;
this.charLength && (t.copy(this.charBuffer, 0, t.length - this.charReceived, C), C -= this.charReceived);
var i;
if (C = (I += t.toString(this.encoding, 0, C)).length - 1, (i = I.charCodeAt(C)) >= 55296 && i <= 56319) {
var e = this.surrogateSize;
return this.charLength += e, this.charReceived += e, this.charBuffer.copy(this.charBuffer, e, 0, e), t.copy(this.charBuffer, 0, 0, e), I.substring(0, C);
}
return I;
}, Wm.prototype.detectIncompleteChar = function(t) {
for (var I = t.length >= 3 ? 3 : t.length; I > 0; I--) {
var g = t[t.length - I];
if (I == 1 && g >> 5 == 6) {
this.charLength = 2;
break;
}
if (I <= 2 && g >> 4 == 14) {
this.charLength = 3;
break;
}
if (I <= 3 && g >> 3 == 30) {
this.charLength = 4;
break;
}
}
this.charReceived = I;
}, Wm.prototype.end = function(t) {
var I = "";
if (t && t.length && (I = this.write(t)), this.charReceived) {
var g = this.charReceived, C = this.charBuffer, i = this.encoding;
I += C.slice(0, g).toString(i);
}
return I;
}, PC.ReadableState = NCg;
var uC = S9("stream");
function NCg(t, I) {
t = t || {}, this.objectMode = !!t.objectMode, I instanceof Ve && (this.objectMode = this.objectMode || !!t.readableObjectMode);
var g = t.highWaterMark, C = this.objectMode ? 16 : 16384;
this.highWaterMark = g || g === 0 ? g : C, this.highWaterMark = ~~this.highWaterMark, this.buffer = new Qo(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.defaultEncoding = t.defaultEncoding || "utf8", this.ranOut = !1, this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, t.encoding && (this.decoder = new Wm(t.encoding), this.encoding = t.encoding);
}
function PC(t) {
if (!(this instanceof PC)) return new PC(t);
this._readableState = new NCg(t, this), this.readable = !0, t && typeof t.read == "function" && (this._read = t.read), qI.call(this);
}
function D8(t, I, g, C, i) {
var e = function(n, a) {
var d = null;
return dG(a) || typeof a == "string" || a == null || n.objectMode || (d = new TypeError("Invalid non-string/buffer chunk")), d;
}(I, g);
if (e) t.emit("error", e);
else if (g === null) I.reading = !1, function(n, a) {
if (!a.ended) {
if (a.decoder) {
var d = a.decoder.end();
d && d.length && (a.buffer.push(d), a.length += a.objectMode ? 1 : d.length);
}
a.ended = !0, bV(n);
}
}(t, I);
else if (I.objectMode || g && g.length > 0) if (I.ended && !i) {
var A = new Error("stream.push() after EOF");
t.emit("error", A);
} else if (I.endEmitted && i) {
var s = new Error("stream.unshift() after end event");
t.emit("error", s);
} else {
var l;
!I.decoder || i || C || (g = I.decoder.write(g), l = !I.objectMode && g.length === 0), i || (I.reading = !1), l || (I.flowing && I.length === 0 && !I.sync ? (t.emit("data", g), t.read(0)) : (I.length += I.objectMode ? 1 : g.length, i ? I.buffer.unshift(g) : I.buffer.push(g), I.needReadable && bV(t))), function(n, a) {
a.readingMore || (a.readingMore = !0, vt(Whg, n, a));
}(t, I);
}
else i || (I.reading = !1);
return function(n) {
return !n.ended && (n.needReadable || n.length < n.highWaterMark || n.length === 0);
}(I);
}
Oa(PC, qI), PC.prototype.push = function(t, I) {
var g = this._readableState;
return g.objectMode || typeof t != "string" || (I = I || g.defaultEncoding) !== g.encoding && (t = Hg.from(t, I), I = ""), D8(this, g, t, I, !1);
}, PC.prototype.unshift = function(t) {
return D8(this, this._readableState, t, "", !0);
}, PC.prototype.isPaused = function() {
return this._readableState.flowing === !1;
}, PC.prototype.setEncoding = function(t) {
return this._readableState.decoder = new Wm(t), this._readableState.encoding = t, this;
};
function K8(t, I) {
return t <= 0 || I.length === 0 && I.ended ? 0 : I.objectMode ? 1 : t != t ? I.flowing && I.length ? I.buffer.head.data.length : I.length : (t > I.highWaterMark && (I.highWaterMark = function(g) {
return g >= 8388608 ? g = 8388608 : (g--, g |= g >>> 1, g |= g >>> 2, g |= g >>> 4, g |= g >>> 8, g |= g >>> 16, g++), g;
}(t)), t <= I.length ? t : I.ended ? I.length : (I.needReadable = !0, 0));
}
function bV(t) {
var I = t._readableState;
I.needReadable = !1, I.emittedReadable || (uC("emitReadable", I.flowing), I.emittedReadable = !0, I.sync ? vt(F8, t) : F8(t));
}
function F8(t) {
uC("emit readable"), t.emit("readable"), z9(t);
}
function Whg(t, I) {
for (var g = I.length; !I.reading && !I.flowing && !I.ended && I.length < I.highWaterMark && (uC("maybeReadMore read 0"), t.read(0), g !== I.length); ) g = I.length;
I.readingMore = !1;
}
function yhg(t) {
uC("readable nexttick read 0"), t.read(0);
}
function Yhg(t, I) {
I.reading || (uC("resume read 0"), t.read(0)), I.resumeScheduled = !1, I.awaitDrain = 0, t.emit("resume"), z9(t), I.flowing && !I.reading && t.read(0);
}
function z9(t) {
var I = t._readableState;
for (uC("flow", I.flowing); I.flowing && t.read() !== null; ) ;
}
function k8(t, I) {
return I.length === 0 ? null : (I.objectMode ? g = I.buffer.shift() : !t || t >= I.length ? (g = I.decoder ? I.buffer.join("") : I.buffer.length === 1 ? I.buffer.head.data : I.buffer.concat(I.length), I.buffer.clear()) : g = function(C, i, e) {
var A;
return C < i.head.data.length ? (A = i.head.data.slice(0, C), i.head.data = i.head.data.slice(C)) : A = C === i.head.data.length ? i.shift() : e ? function(s, l) {
var n = l.head, a = 1, d = n.data;
for (s -= d.length; n = n.next; ) {
var o = n.data, c = s > o.length ? o.length : s;
if (c === o.length ? d += o : d += o.slice(0, s), (s -= c) === 0) {
c === o.length ? (++a, n.next ? l.head = n.next : l.head = l.tail = null) : (l.head = n, n.data = o.slice(c));
break;
}
++a;
}
return l.length -= a, d;
}(C, i) : function(s, l) {
var n = Hg.allocUnsafe(s), a = l.head, d = 1;
for (a.data.copy(n), s -= a.data.length; a = a.next; ) {
var o = a.data, c = s > o.length ? o.length : s;
if (o.copy(n, n.length - s, 0, c), (s -= c) === 0) {
c === o.length ? (++d, a.next ? l.head = a.next : l.head = l.tail = null) : (l.head = a, a.data = o.slice(c));
break;
}
++d;
}
return l.length -= d, n;
}(C, i), A;
}(t, I.buffer, I.decoder), g);
var g;
}
function CX(t) {
var I = t._readableState;
if (I.length > 0) throw new Error('"endReadable()" called on non-empty stream');
I.endEmitted || (I.ended = !0, vt(Nhg, I, t));
}
function Nhg(t, I) {
t.endEmitted || t.length !== 0 || (t.endEmitted = !0, I.readable = !1, I.emit("end"));
}
function z8(t, I) {
for (var g = 0, C = t.length; g < C; g++) if (t[g] === I) return g;
return -1;
}
function Vhg() {
}
function Mhg(t, I, g) {
this.chunk = t, this.encoding = I, this.callback = g, this.next = null;
}
function oD(t, I) {
Object.defineProperty(this, "buffer", { get: sM(function() {
return this.getBuffer();
}, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.") }), t = t || {}, this.objectMode = !!t.objectMode, I instanceof Ve && (this.objectMode = this.objectMode || !!t.writableObjectMode);
var g = t.highWaterMark, C = this.objectMode ? 16 : 16384;
this.highWaterMark = g || g === 0 ? g : C, this.highWaterMark = ~~this.highWaterMark, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1;
var i = t.decodeStrings === !1;
this.decodeStrings = !i, this.defaultEncoding = t.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function(e) {
(function(A, s) {
var l = A._writableState, n = l.sync, a = l.writecb;
if (function(o) {
o.writing = !1, o.writecb = null, o.length -= o.writelen, o.writelen = 0;
}(l), s) (function(o, c, r, h, b) {
--c.pendingcb, r ? vt(b, h) : b(h), o._writableState.errorEmitted = !0, o.emit("error", h);
})(A, l, n, s, a);
else {
var d = MCg(l);
d || l.corked || l.bufferProcessing || !l.bufferedRequest || VCg(A, l), n ? vt(J8, A, l, d, a) : J8(A, l, d, a);
}
})(I, e);
}, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.bufferedRequestCount = 0, this.corkedRequestsFree = new fCg(this);
}
function gi(t) {
if (!(this instanceof gi || this instanceof Ve)) return new gi(t);
this._writableState = new oD(t, this), this.writable = !0, t && (typeof t.write == "function" && (this._write = t.write), typeof t.writev == "function" && (this._writev = t.writev)), qI.call(this);
}
function cD(t, I, g, C, i, e, A) {
I.writelen = C, I.writecb = A, I.writing = !0, I.sync = !0, g ? t._writev(i, I.onwrite) : t._write(i, e, I.onwrite), I.sync = !1;
}
function J8(t, I, g, C) {
g || function(i, e) {
e.length === 0 && e.needDrain && (e.needDrain = !1, i.emit("drain"));
}(t, I), I.pendingcb--, C(), RCg(t, I);
}
function VCg(t, I) {
I.bufferProcessing = !0;
var g = I.bufferedRequest;
if (t._writev && g && g.next) {
var C = I.bufferedRequestCount, i = new Array(C), e = I.corkedRequestsFree;
e.entry = g;
for (var A = 0; g; ) i[A] = g, g = g.next, A += 1;
cD(t, I, !0, I.length, i, "", e.finish), I.pendingcb++, I.lastBufferedRequest = null, e.next ? (I.corkedRequestsFree = e.next, e.next = null) : I.corkedRequestsFree = new fCg(I);
} else {
for (; g; ) {
var s = g.chunk, l = g.encoding, n = g.callback;
if (cD(t, I, !1, I.objectMode ? 1 : s.length, s, l, n), g = g.next, I.writing) break;
}
g === null && (I.lastBufferedRequest = null);
}
I.bufferedRequestCount = 0, I.bufferedRequest = g, I.bufferProcessing = !1;
}
function MCg(t) {
return t.ending && t.length === 0 && t.bufferedRequest === null && !t.finished && !t.writing;
}
function L8(t, I) {
I.prefinished || (I.prefinished = !0, t.emit("prefinish"));
}
function RCg(t, I) {
var g = MCg(I);
return g && (I.pendingcb === 0 ? (L8(t, I), I.finished = !0, t.emit("finish")) : L8(t, I)), g;
}
function fCg(t) {
var I = this;
this.next = null, this.entry = null, this.finish = function(g) {
var C = I.entry;
for (I.entry = null; C; ) {
var i = C.callback;
t.pendingcb--, i(g), C = C.next;
}
t.corkedRequestsFree ? t.corkedRequestsFree.next = I : t.corkedRequestsFree = I;
};
}
PC.prototype.read = function(t) {
uC("read", t), t = parseInt(t, 10);
var I = this._readableState, g = t;
if (t !== 0 && (I.emittedReadable = !1), t === 0 && I.needReadable && (I.length >= I.highWaterMark || I.ended)) return uC("read: emitReadable", I.length, I.ended), I.length === 0 && I.ended ? CX(this) : bV(this), null;
if ((t = K8(t, I)) === 0 && I.ended) return I.length === 0 && CX(this), null;
var C, i = I.needReadable;
return uC("need readable", i), (I.length === 0 || I.length - t < I.highWaterMark) && uC("length less than watermark", i = !0), I.ended || I.reading ? uC("reading or ended", i = !1) : i && (uC("do read"), I.reading = !0, I.sync = !0, I.length === 0 && (I.needReadable = !0), this._read(I.highWaterMark), I.sync = !1, I.reading || (t = K8(g, I))), (C = t > 0 ? k8(t, I) : null) === null ? (I.needReadable = !0, t = 0) : I.length -= t, I.length === 0 && (I.ended || (I.needReadable = !0), g !== t && I.ended && CX(this)), C !== null && this.emit("data", C), C;
}, PC.prototype._read = function(t) {
this.emit("error", new Error("not implemented"));
}, PC.prototype.pipe = function(t, I) {
var g = this, C = this._readableState;
switch (C.pipesCount) {
case 0:
C.pipes = t;
break;
case 1:
C.pipes = [C.pipes, t];
break;
default:
C.pipes.push(t);
}
C.pipesCount += 1, uC("pipe count=%d opts=%j", C.pipesCount, I);
var i = !I || I.end !== !1 ? A : n;
function e(b) {
uC("onunpipe"), b === g && n();
}
function A() {
uC("onend"), t.end();
}
C.endEmitted ? vt(i) : g.once("end", i), t.on("unpipe", e);
var s = /* @__PURE__ */ function(b) {
return function() {
var u = b._readableState;
uC("pipeOnDrain", u.awaitDrain), u.awaitDrain && u.awaitDrain--, u.awaitDrain === 0 && b.listeners("data").length && (u.flowing = !0, z9(b));
};
}(g);
t.on("drain", s);
var l = !1;
function n() {
uC("cleanup"), t.removeListener("close", c), t.removeListener("finish", r), t.removeListener("drain", s), t.removeListener("error", o), t.removeListener("unpipe", e), g.removeListener("end", A), g.removeListener("end", n), g.removeListener("data", d), l = !0, !C.awaitDrain || t._writableState && !t._writableState.needDrain || s();
}
var a = !1;
function d(b) {
uC("ondata"), a = !1, t.write(b) !== !1 || a || ((C.pipesCount === 1 && C.pipes === t || C.pipesCount > 1 && z8(C.pipes, t) !== -1) && !l && (uC("false write response, pause", g._readableState.awaitDrain), g._readableState.awaitDrain++, a = !0), g.pause());
}
function o(b) {
var u;
uC("onerror", b), h(), t.removeListener("error", o), u = "error", t.listeners(u).length === 0 && t.emit("error", b);
}
function c() {
t.removeListener("finish", r), h();
}
function r() {
uC("onfinish"), t.removeListener("close", c), h();
}
function h() {
uC("unpipe"), g.unpipe(t);
}
return g.on("data", d), function(b, u, m) {
if (typeof b.prependListener == "function") return b.prependListener(u, m);
b._events && b._events[u] ? Array.isArray(b._events[u]) ? b._events[u].unshift(m) : b._events[u] = [m, b._events[u]] : b.on(u, m);
}(t, "error", o), t.once("close", c), t.once("finish", r), t.emit("pipe", g), C.flowing || (uC("pipe resume"), g.resume()), t;
}, PC.prototype.unpipe = function(t) {
var I = this._readableState;
if (I.pipesCount === 0) return this;
if (I.pipesCount === 1) return t && t !== I.pipes || (t || (t = I.pipes), I.pipes = null, I.pipesCount = 0, I.flowing = !1, t && t.emit("unpipe", this)), this;
if (!t) {
var g = I.pipes, C = I.pipesCount;
I.pipes = null, I.pipesCount = 0, I.flowing = !1;
for (var i = 0; i < C; i++) g[i].emit("unpipe", this);
return this;
}
var e = z8(I.pipes, t);
return e === -1 || (I.pipes.splice(e, 1), I.pipesCount -= 1, I.pipesCount === 1 && (I.pipes = I.pipes[0]), t.emit("unpipe", this)), this;
}, PC.prototype.on = function(t, I) {
var g = qI.prototype.on.call(this, t, I);
if (t === "data") this._readableState.flowing !== !1 && this.resume();
else if (t === "readable") {
var C = this._readableState;
C.endEmitted || C.readableListening || (C.readableListening = C.needReadable = !0, C.emittedReadable = !1, C.reading ? C.length && bV(this) : vt(yhg, this));
}
return g;
}, PC.prototype.addListener = PC.prototype.on, PC.prototype.resume = function() {
var t = this._readableState;
return t.flowing || (uC("resume"), t.flowing = !0, function(I, g) {
g.resumeScheduled || (g.resumeScheduled = !0, vt(Yhg, I, g));
}(this, t)), this;
}, PC.prototype.pause = function() {
return uC("call pause flowing=%j", this._readableState.flowing), this._readableState.flowing !== !1 && (uC("pause"), this._readableState.flowing = !1, this.emit("pause")), this;
}, PC.prototype.wrap = function(t) {
var I = this._readableState, g = !1, C = this;
for (var i in t.on("end", function() {
if (uC("wrapped end"), I.decoder && !I.ended) {
var e = I.decoder.end();
e && e.length && C.push(e);
}
C.push(null);
}), t.on("data", function(e) {
uC("wrapped data"), I.decoder && (e = I.decoder.write(e)), I.objectMode && e == null || (I.objectMode || e && e.length) && (C.push(e) || (g = !0, t.pause()));
}), t) this[i] === void 0 && typeof t[i] == "function" && (this[i] = /* @__PURE__ */ function(e) {
return function() {
return t[e].apply(t, arguments);
};
}(i));
return function(e, A) {
for (var s = 0, l = e.length; s < l; s++) A(e[s], s);
}(["error", "close", "destroy", "pause", "resume"], function(e) {
t.on(e, C.emit.bind(C, e));
}), C._read = function(e) {
uC("wrapped _read", e), g && (g = !1, t.resume());
}, C;
}, PC._fromList = k8, gi.WritableState = oD, Oa(gi, qI), oD.prototype.getBuffer = function() {
for (var t = this.bufferedRequest, I = []; t; ) I.push(t), t = t.next;
return I;
}, gi.prototype.pipe = function() {
this.emit("error", new Error("Cannot pipe, not readable"));
}, gi.prototype.write = function(t, I, g) {
var C = this._writableState, i = !1;
return typeof I == "function" && (g = I, I = null), Hg.isBuffer(t) ? I = "buffer" : I || (I = C.defaultEncoding), typeof g != "function" && (g = Vhg), C.ended ? function(e, A) {
var s = new Error("write after end");
e.emit("error", s), vt(A, s);
}(this, g) : function(e, A, s, l) {
var n = !0, a = !1;
return s === null ? a = new TypeError("May not write null values to stream") : Hg.isBuffer(s) || typeof s == "string" || s === void 0 || A.objectMode || (a = new TypeError("Invalid non-string/buffer chunk")), a && (e.emit("error", a), vt(l, a), n = !1), n;
}(this, C, t, g) && (C.pendingcb++, i = function(e, A, s, l, n) {
s = function(c, r, h) {
return c.objectMode || c.decodeStrings === !1 || typeof r != "string" || (r = Hg.from(r, h)), r;
}(A, s, l), Hg.isBuffer(s) && (l = "buffer");
var a = A.objectMode ? 1 : s.length;
A.length += a;
var d = A.length < A.highWaterMark;
if (d || (A.needDrain = !0), A.writing || A.corked) {
var o = A.lastBufferedRequest;
A.lastBufferedRequest = new Mhg(s, l, n), o ? o.next = A.lastBufferedRequest : A.bufferedRequest = A.lastBufferedRequest, A.bufferedRequestCount += 1;
} else cD(e, A, !1, a, s, l, n);
return d;
}(this, C, t, I, g)), i;
}, gi.prototype.cork = function() {
this._writableState.corked++;
}, gi.prototype.uncork = function() {
var t = this._writableState;
t.corked && (t.corked--, t.writing || t.corked || t.finished || t.bufferProcessing || !t.bufferedRequest || VCg(this, t));
}, gi.prototype.setDefaultEncoding = function(t) {
if (typeof t == "string" && (t = t.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((t + "").toLowerCase()) > -1)) throw new TypeError("Unknown encoding: " + t);
return this._writableState.defaultEncoding = t, this;
}, gi.prototype._write = function(t, I, g) {
g(new Error("not implemented"));
}, gi.prototype._writev = null, gi.prototype.end = function(t, I, g) {
var C = this._writableState;
typeof t == "function" ? (g = t, t = null, I = null) : typeof I == "function" && (g = I, I = null), t != null && this.write(t, I), C.corked && (C.corked = 1, this.uncork()), C.ending || C.finished || function(i, e, A) {
e.ending = !0, RCg(i, e), A && (e.finished ? vt(A) : i.once("finish", A)), e.ended = !0, i.writable = !1;
}(this, C, g);
}, Oa(Ve, PC);
for (var v8 = Object.keys(gi.prototype), tX = 0; tX < v8.length; tX++) {
var iX = v8[tX];
Ve.prototype[iX] || (Ve.prototype[iX] = gi.prototype[iX]);
}
function Ve(t) {
if (!(this instanceof Ve)) return new Ve(t);
PC.call(this, t), gi.call(this, t), t && t.readable === !1 && (this.readable = !1), t && t.writable === !1 && (this.writable = !1), this.allowHalfOpen = !0, t && t.allowHalfOpen === !1 && (this.allowHalfOpen = !1), this.once("end", Rhg);
}
function Rhg() {
this.allowHalfOpen || this._writableState.ended || vt(fhg, this);
}
function fhg(t) {
t.end();
}
function Hhg(t) {
this.afterTransform = function(I, g) {
return function(C, i, e) {
var A = C._transformState;
A.transforming = !1;
var s = A.writecb;
if (!s) return C.emit("error", new Error("no writecb in Transform class"));
A.writechunk = null, A.writecb = null, e != null && C.push(e), s(i);
var l = C._readableState;
l.reading = !1, (l.needReadable || l.length < l.highWaterMark) && C._read(l.highWaterMark);
}(t, I, g);
}, this.needTransform = !1, this.transforming = !1, this.writecb = null, this.writechunk = null, this.writeencoding = null;
}
function SA(t) {
if (!(this instanceof SA)) return new SA(t);
Ve.call(this, t), this._transformState = new Hhg(this);
var I = this;
this._readableState.needReadable = !0, this._readableState.sync = !1, t && (typeof t.transform == "function" && (this._transform = t.transform), typeof t.flush == "function" && (this._flush = t.flush)), this.once("prefinish", function() {
typeof this._flush == "function" ? this._flush(function(g) {
T8(I, g);
}) : T8(I);
});
}
function T8(t, I) {
if (I) return t.emit("error", I);
var g = t._writableState, C = t._transformState;
if (g.length) throw new Error("Calling transform done when ws.length != 0");
if (C.transforming) throw new Error("Calling transform done when still transforming");
return t.push(null);
}
function hh(t) {
if (!(this instanceof hh)) return new hh(t);
SA.call(this, t);
}
function GA() {
qI.call(this);
}
Oa(SA, Ve), SA.prototype.push = function(t, I) {
return this._transformState.needTransform = !1, Ve.prototype.push.call(this, t, I);
}, SA.prototype._transform = function(t, I, g) {
throw new Error("Not implemented");
}, SA.prototype._write = function(t, I, g) {
var C = this._transformState;
if (C.writecb = g, C.writechunk = t, C.writeencoding = I, !C.transforming) {
var i = this._readableState;
(C.needTransform || i.needReadable || i.length < i.highWaterMark) && this._read(i.highWaterMark);
}
}, SA.prototype._read = function(t) {
var I = this._transformState;
I.writechunk !== null && I.writecb && !I.transforming ? (I.transforming = !0, this._transform(I.writechunk, I.writeencoding, I.afterTransform)) : I.needTransform = !0;
}, Oa(hh, SA), hh.prototype._transform = function(t, I, g) {
g(null, t);
}, Oa(GA, qI), GA.Readable = PC, GA.Writable = gi, GA.Duplex = Ve, GA.Transform = SA, GA.PassThrough = hh, GA.Stream = GA, GA.prototype.pipe = function(t, I) {
var g = this;
function C(a) {
t.writable && t.write(a) === !1 && g.pause && g.pause();
}
function i() {
g.readable && g.resume && g.resume();
}
g.on("data", C), t.on("drain", i), t._isStdio || I && I.end === !1 || (g.on("end", A), g.on("close", s));
var e = !1;
function A() {
e || (e = !0, t.end());
}
function s() {
e || (e = !0, typeof t.destroy == "function" && t.destroy());
}
function l(a) {
if (n(), qI.listenerCount(this, "error") === 0) throw a;
}
function n() {
g.removeListener("data", C), t.removeListener("drain", i), g.removeListener("end", A), g.removeListener("close", s), g.removeListener("error", l), t.removeListener("error", l), g.removeListener("end", n), g.removeListener("close", n), t.removeListener("close", n);
}
return g.on("error", l), t.on("error", l), g.on("end", n), g.on("close", n), t.on("close", n), t.emit("pipe", g), t;
};
var x8, j8, Q8, HCg = iM(Object.freeze({ __proto__: null, default: GA, Readable: PC, Writable: gi, Duplex: Ve, Transform: SA, PassThrough: hh, Stream: GA })), eX = { exports: {} };
function nM() {
return x8 || (x8 = 1, eX.exports = { nextTick: function(t, I, g, C) {
if (typeof t != "function") throw new TypeError('"callback" argument must be a function');
var i, e, A = arguments.length;
switch (A) {
case 0:
case 1:
return vt(t);
case 2:
return vt(function() {
t.call(null, I);
});
case 3:
return vt(function() {
t.call(null, I, g);
});
case 4:
return vt(function() {
t.call(null, I, g, C);
});
default:
for (i = new Array(A - 1), e = 0; e < i.length; ) i[e++] = arguments[e];
return vt(function() {
t.apply(null, i);
});
}
} }), eX.exports;
}
var O8, Xhg = iM(chg), U8 = { exports: {} };
function XCg() {
return O8 ? U8.exports : (O8 = 1, U8.exports = HCg);
}
var E8, AX = { exports: {} }, SCg = iM(ehg);
function aM() {
return E8 || (E8 = 1, function(t, I) {
var g = SCg, C = g.Buffer;
function i(A, s) {
for (var l in A) s[l] = A[l];
}
function e(A, s, l) {
return C(A, s, l);
}
C.from && C.alloc && C.allocUnsafe && C.allocUnsafeSlow ? t.exports = g : (i(g, I), I.Buffer = e), i(C, e), e.from = function(A, s, l) {
if (typeof A == "number") throw new TypeError("Argument must not be a number");
return C(A, s, l);
}, e.alloc = function(A, s, l) {
if (typeof A != "number") throw new TypeError("Argument must be a number");
var n = C(A);
return s !== void 0 ? typeof l == "string" ? n.fill(s, l) : n.fill(s) : n.fill(0), n;
}, e.allocUnsafe = function(A) {
if (typeof A != "number") throw new TypeError("Argument must be a number");
return C(A);
}, e.allocUnsafeSlow = function(A) {
if (typeof A != "number") throw new TypeError("Argument must be a number");
return g.SlowBuffer(A);
};
}(AX, AX.exports)), AX.exports;
}
var P8, Ut = {};
function bG() {
if (P8) return Ut;
function t(I) {
return Object.prototype.toString.call(I);
}
return P8 = 1, Ut.isArray = function(I) {
return Array.isArray ? Array.isArray(I) : t(I) === "[object Array]";
}, Ut.isBoolean = function(I) {
return typeof I == "boolean";
}, Ut.isNull = function(I) {
return I === null;
}, Ut.isNullOrUndefined = function(I) {
return I == null;
}, Ut.isNumber = function(I) {
return typeof I == "number";
}, Ut.isString = function(I) {
return typeof I == "string";
}, Ut.isSymbol = function(I) {
return typeof I == "symbol";
}, Ut.isUndefined = function(I) {
return I === void 0;
}, Ut.isRegExp = function(I) {
return t(I) === "[object RegExp]";
}, Ut.isObject = function(I) {
return typeof I == "object" && I !== null;
}, Ut.isDate = function(I) {
return t(I) === "[object Date]";
}, Ut.isError = function(I) {
return t(I) === "[object Error]" || I instanceof Error;
}, Ut.isFunction = function(I) {
return typeof I == "function";
}, Ut.isPrimitive = function(I) {
return I === null || typeof I == "boolean" || typeof I == "number" || typeof I == "string" || typeof I == "symbol" || I === void 0;
}, Ut.isBuffer = SCg.Buffer.isBuffer, Ut;
}
var _8, q8, $8 = { exports: {} }, oM = iM(Zhg), sX = { exports: {} };
function uG() {
return q8 || (q8 = 1, function(t) {
try {
var I = oM;
if (typeof I.inherits != "function") throw "";
t.exports = I.inherits;
} catch {
t.exports = (_8 || (_8 = 1, typeof Object.create == "function" ? sX.exports = function(C, i) {
i && (C.super_ = i, C.prototype = Object.create(i.prototype, { constructor: { value: C, enumerable: !1, writable: !0, configurable: !0 } }));
} : sX.exports = function(C, i) {
if (i) {
C.super_ = i;
var e = function() {
};
e.prototype = i.prototype, C.prototype = new e(), C.prototype.constructor = C;
}
}), sX.exports);
}
}($8)), $8.exports;
}
var g_, lX, I_, C_, t_, nX, i_, aX, e_, A_ = { exports: {} };
function Shg() {
return g_ || (g_ = 1, function(t) {
var I = aM().Buffer, g = oM;
t.exports = function() {
function C() {
(function(i, e) {
if (!(i instanceof e)) throw new TypeError("Cannot call a class as a function");
})(this, C), this.head = null, this.tail = null, this.length = 0;
}
return C.prototype.push = function(i) {
var e = { data: i, next: null };
this.length > 0 ? this.tail.next = e : this.head = e, this.tail = e, ++this.length;
}, C.prototype.unshift = function(i) {
var e = { data: i, next: this.head };
this.length === 0 && (this.tail = e), this.head = e, ++this.length;
}, C.prototype.shift = function() {
if (this.length !== 0) {
var i = this.head.data;
return this.length === 1 ? this.head = this.tail = null : this.head = this.head.next, --this.length, i;
}
}, C.prototype.clear = function() {
this.head = this.tail = null, this.length = 0;
}, C.prototype.join = function(i) {
if (this.length === 0) return "";
for (var e = this.head, A = "" + e.data; e = e.next; ) A += i + e.data;
return A;
}, C.prototype.concat = function(i) {
if (this.length === 0) return I.alloc(0);
if (this.length === 1) return this.head.data;
for (var e, A, s, l = I.allocUnsafe(i >>> 0), n = this.head, a = 0; n; ) e = n.data, A = l, s = a, e.copy(A, s), a += n.data.length, n = n.next;
return l;
}, C;
}(), g && g.inspect && g.inspect.custom && (t.exports.prototype[g.inspect.custom] = function() {
var C = g.inspect({ length: this.length });
return this.constructor.name + " " + C;
});
}(A_)), A_.exports;
}
function DCg() {
if (I_) return lX;
I_ = 1;
var t = nM();
function I(g, C) {
g.emit("error", C);
}
return lX = { destroy: function(g, C) {
var i = this, e = this._readableState && this._readableState.destroyed, A = this._writableState && this._writableState.destroyed;
return e || A ? (C ? C(g) : !g || this._writableState && this._writableState.errorEmitted || t.nextTick(I, this, g), this) : (this._readableState && (this._readableState.destroyed = !0), this._writableState && (this._writableState.destroyed = !0), this._destroy(g || null, function(s) {
!C && s ? (t.nextTick(I, i, s), i._writableState && (i._writableState.errorEmitted = !0)) : C && C(s);
}), this);
}, undestroy: function() {
this._readableState && (this._readableState.destroyed = !1, this._readableState.reading = !1, this._readableState.ended = !1, this._readableState.endEmitted = !1), this._writableState && (this._writableState.destroyed = !1, this._writableState.ended = !1, this._writableState.ending = !1, this._writableState.finished = !1, this._writableState.errorEmitted = !1);
} }, lX;
}
function KCg() {
if (i_) return nX;
i_ = 1;
var t = nM();
function I(p) {
var Y = this;
this.next = null, this.entry = null, this.finish = function() {
(function(R, X, H) {
var S = R.entry;
for (R.entry = null; S; ) {
var z = S.callback;
X.pendingcb--, z(H), S = S.next;
}
X.corkedRequestsFree ? X.corkedRequestsFree.next = R : X.corkedRequestsFree = R;
})(Y, p);
};
}
nX = c;
var g, C = t.nextTick;
c.WritableState = o;
var i = Object.create(bG());
i.inherits = uG();
var e = { deprecate: t_ ? C_ : (t_ = 1, C_ = oM.deprecate) }, A = XCg(), s = aM().Buffer, l = oe.Uint8Array || function() {
}, n, a = DCg();
function d() {
}
function o(p, Y) {
g = g || y0(), p = p || {};
var R = Y instanceof g;
this.objectMode = !!p.objectMode, R && (this.objectMode = this.objectMode || !!p.writableObjectMode);
var X = p.highWaterMark, H = p.writableHighWaterMark, S = this.objectMode ? 16 : 16384;
this.highWaterMark = X || X === 0 ? X : R && (H || H === 0) ? H : S, this.highWaterMark = Math.floor(this.highWaterMark), this.finalCalled = !1, this.needDrain = !1, this.ending = !1, this.ended = !1, this.finished = !1, this.destroyed = !1;
var z = p.decodeStrings === !1;
this.decodeStrings = !z, this.defaultEncoding = p.defaultEncoding || "utf8", this.length = 0, this.writing = !1, this.corked = 0, this.sync = !0, this.bufferProcessing = !1, this.onwrite = function(v) {
(function(K, V) {
var N = K._writableState, B = N.sync, G = N.writecb;
if (function(W) {
W.writing = !1, W.writecb = null, W.length -= W.writelen, W.writelen = 0;
}(N), V) (function(W, y, f, D, F) {
--y.pendingcb, f ? (t.nextTick(F, D), t.nextTick(Z, W, y), W._writableState.errorEmitted = !0, W.emit("error", D)) : (F(D), W._writableState.errorEmitted = !0, W.emit("error", D), Z(W, y));
})(K, N, B, V, G);
else {
var w = u(N);
w || N.corked || N.bufferProcessing || !N.bufferedRequest || b(K, N), B ? C(h, K, N, w, G) : h(K, N, w, G);
}
})(Y, v);
}, this.writecb = null, this.writelen = 0, this.bufferedRequest = null, this.lastBufferedRequest = null, this.pendingcb = 0, this.prefinished = !1, this.errorEmitted = !1, this.bufferedRequestCount = 0, this.corkedRequestsFree = new I(this);
}
function c(p) {
if (g = g || y0(), !(n.call(c, this) || this instanceof g)) return new c(p);
this._writableState = new o(p, this), this.writable = !0, p && (typeof p.write == "function" && (this._write = p.write), typeof p.writev == "function" && (this._writev = p.writev), typeof p.destroy == "function" && (this._destroy = p.destroy), typeof p.final == "function" && (this._final = p.final)), A.call(this);
}
function r(p, Y, R, X, H, S, z) {
Y.writelen = X, Y.writecb = z, Y.writing = !0, Y.sync = !0, R ? p._writev(H, Y.onwrite) : p._write(H, S, Y.onwrite), Y.sync = !1;
}
function h(p, Y, R, X) {
R || function(H, S) {
S.length === 0 && S.needDrain && (S.needDrain = !1, H.emit("drain"));
}(p, Y), Y.pendingcb--, X(), Z(p, Y);
}
function b(p, Y) {
Y.bufferProcessing = !0;
var R = Y.bufferedRequest;
if (p._writev && R && R.next) {
var X = Y.bufferedRequestCount, H = new Array(X), S = Y.corkedRequestsFree;
S.entry = R;
for (var z = 0, v = !0; R; ) H[z] = R, R.isBuf || (v = !1), R = R.next, z += 1;
H.allBuffers = v, r(p, Y, !0, Y.length, H, "", S.finish), Y.pendingcb++, Y.lastBufferedRequest = null, S.next ? (Y.corkedRequestsFree = S.next, S.next = null) : Y.corkedRequestsFree = new I(Y), Y.bufferedRequestCount = 0;
} else {
for (; R; ) {
var K = R.chunk, V = R.encoding, N = R.callback;
if (r(p, Y, !1, Y.objectMode ? 1 : K.length, K, V, N), R = R.next, Y.bufferedRequestCount--, Y.writing) break;
}
R === null && (Y.lastBufferedRequest = null);
}
Y.bufferedRequest = R, Y.bufferProcessing = !1;
}
function u(p) {
return p.ending && p.length === 0 && p.bufferedRequest === null && !p.finished && !p.writing;
}
function m(p, Y) {
p._final(function(R) {
Y.pendingcb--, R && p.emit("error", R), Y.prefinished = !0, p.emit("prefinish"), Z(p, Y);
});
}
function Z(p, Y) {
var R = u(Y);
return R && (function(X, H) {
H.prefinished || H.finalCalled || (typeof X._final == "function" ? (H.pendingcb++, H.finalCalled = !0, t.nextTick(m, X, H)) : (H.prefinished = !0, X.emit("prefinish")));
}(p, Y), Y.pendingcb === 0 && (Y.finished = !0, p.emit("finish"))), R;
}
return i.inherits(c, A), o.prototype.getBuffer = function() {
for (var p = this.bufferedRequest, Y = []; p; ) Y.push(p), p = p.next;
return Y;
}, function() {
try {
Object.defineProperty(o.prototype, "buffer", { get: e.deprecate(function() {
return this.getBuffer();
}, "_writableState.buffer is deprecated. Use _writableState.getBuffer instead.", "DEP0003") });
} catch {
}
}(), typeof Symbol == "function" && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] == "function" ? (n = Function.prototype[Symbol.hasInstance], Object.defineProperty(c, Symbol.hasInstance, { value: function(p) {
return !!n.call(this, p) || this === c && p && p._writableState instanceof o;
} })) : n = function(p) {
return p instanceof this;
}, c.prototype.pipe = function() {
this.emit("error", new Error("Cannot pipe, not readable"));
}, c.prototype.write = function(p, Y, R) {
var X, H = this._writableState, S = !1, z = !H.objectMode && (X = p, s.isBuffer(X) || X instanceof l);
return z && !s.isBuffer(p) && (p = function(v) {
return s.from(v);
}(p)), typeof Y == "function" && (R = Y, Y = null), z ? Y = "buffer" : Y || (Y = H.defaultEncoding), typeof R != "function" && (R = d), H.ended ? function(v, K) {
var V = new Error("write after end");
v.emit("error", V), t.nextTick(K, V);
}(this, R) : (z || function(v, K, V, N) {
var B = !0, G = !1;
return V === null ? G = new TypeError("May not write null values to stream") : typeof V == "string" || V === void 0 || K.objectMode || (G = new TypeError("Invalid non-string/buffer chunk")), G && (v.emit("error", G), t.nextTick(N, G), B = !1), B;
}(this, H, p, R)) && (H.pendingcb++, S = function(v, K, V, N, B, G) {
if (!V) {
var w = function(D, F, T) {
return D.objectMode || D.decodeStrings === !1 || typeof F != "string" || (F = s.from(F, T)), F;
}(K, N, B);
N !== w && (V = !0, B = "buffer", N = w);
}
var W = K.objectMode ? 1 : N.length;
K.length += W;
var y = K.length < K.highWaterMark;
if (y || (K.needDrain = !0), K.writing || K.corked) {
var f = K.lastBufferedRequest;
K.lastBufferedRequest = { chunk: N, encoding: B, isBuf: V, callback: G, next: null }, f ? f.next = K.lastBufferedRequest : K.bufferedRequest = K.lastBufferedRequest, K.bufferedRequestCount += 1;
} else r(v, K, !1, W, N, B, G);
return y;
}(this, H, z, p, Y, R)), S;
}, c.prototype.cork = function() {
this._writableState.corked++;
}, c.prototype.uncork = function() {
var p = this._writableState;
p.corked && (p.corked--, p.writing || p.corked || p.finished || p.bufferProcessing || !p.bufferedRequest || b(this, p));
}, c.prototype.setDefaultEncoding = function(p) {
if (typeof p == "string" && (p = p.toLowerCase()), !(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((p + "").toLowerCase()) > -1)) throw new TypeError("Unknown encoding: " + p);
return this._writableState.defaultEncoding = p, this;
}, Object.defineProperty(c.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
return this._writableState.highWaterMark;
} }), c.prototype._write = function(p, Y, R) {
R(new Error("_write() is not implemented"));
}, c.prototype._writev = null, c.prototype.end = function(p, Y, R) {
var X = this._writableState;
typeof p == "function" ? (R = p, p = null, Y = null) : typeof Y == "function" && (R = Y, Y = null), p != null && this.write(p, Y), X.corked && (X.corked = 1, this.uncork()), X.ending || X.finished || function(H, S, z) {
S.ending = !0, Z(H, S), z && (S.finished ? t.nextTick(z) : H.once("finish", z)), S.ended = !0, H.writable = !1;
}(this, X, R);
}, Object.defineProperty(c.prototype, "destroyed", { get: function() {
return this._writableState !== void 0 && this._writableState.destroyed;
}, set: function(p) {
this._writableState && (this._writableState.destroyed = p);
} }), c.prototype.destroy = a.destroy, c.prototype._undestroy = a.undestroy, c.prototype._destroy = function(p, Y) {
this.end(), Y(p);
}, nX;
}
function y0() {
if (e_) return aX;
e_ = 1;
var t = nM(), I = Object.keys || function(d) {
var o = [];
for (var c in d) o.push(c);
return o;
};
aX = l;
var g = Object.create(bG());
g.inherits = uG();
var C = FCg(), i = KCg();
g.inherits(l, C);
for (var e = I(i.prototype), A = 0; A < e.length; A++) {
var s = e[A];
l.prototype[s] || (l.prototype[s] = i.prototype[s]);
}
function l(d) {
if (!(this instanceof l)) return new l(d);
C.call(this, d), i.call(this, d), d && d.readable === !1 && (this.readable = !1), d && d.writable === !1 && (this.writable = !1), this.allowHalfOpen = !0, d && d.allowHalfOpen === !1 && (this.allowHalfOpen = !1), this.once("end", n);
}
function n() {
this.allowHalfOpen || this._writableState.ended || t.nextTick(a, this);
}
function a(d) {
d.end();
}
return Object.defineProperty(l.prototype, "writableHighWaterMark", { enumerable: !1, get: function() {
return this._writableState.highWaterMark;
} }), Object.defineProperty(l.prototype, "destroyed", { get: function() {
return this._readableState !== void 0 && this._writableState !== void 0 && this._readableState.destroyed && this._writableState.destroyed;
}, set: function(d) {
this._readableState !== void 0 && this._writableState !== void 0 && (this._readableState.destroyed = d, this._writableState.destroyed = d);
} }), l.prototype._destroy = function(d, o) {
this.push(null), this.end(), t.nextTick(o, d);
}, aX;
}
var s_, oX, l_, cX, n_, dX, a_, o_, rX = {};
function c_() {
if (s_) return rX;
s_ = 1;
var t = aM().Buffer, I = t.isEncoding || function(d) {
switch ((d = "" + d) && d.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 !0;
default:
return !1;
}
};
function g(d) {
var o;
switch (this.encoding = function(c) {
var r = function(h) {
if (!h) return "utf8";
for (var b; ; ) switch (h) {
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 h;
default:
if (b) return;
h = ("" + h).toLowerCase(), b = !0;
}
}(c);
if (typeof r != "string" && (t.isEncoding === I || !I(c))) throw new Error("Unknown encoding: " + c);
return r || c;
}(d), this.encoding) {
case "utf16le":
this.text = e, this.end = A, o = 4;
break;
case "utf8":
this.fillLast = i, o = 4;
break;
case "base64":
this.text = s, this.end = l, o = 3;
break;
default:
return this.write = n, void (this.end = a);
}
this.lastNeed = 0, this.lastTotal = 0, this.lastChar = t.allocUnsafe(o);
}
function C(d) {
return d <= 127 ? 0 : d >> 5 == 6 ? 2 : d >> 4 == 14 ? 3 : d >> 3 == 30 ? 4 : d >> 6 == 2 ? -1 : -2;
}
function i(d) {
var o = this.lastTotal - this.lastNeed, c = function(r, h, b) {
if ((192 & h[0]) != 128) return r.lastNeed = 0, "�";
if (r.lastNeed > 1 && h.length > 1) {
if ((192 & h[1]) != 128) return r.lastNeed = 1, "�";
if (r.lastNeed > 2 && h.length > 2 && (192 & h[2]) != 128) return r.lastNeed = 2, "�";
}
}(this, d);
return c !== void 0 ? c : this.lastNeed <= d.length ? (d.copy(this.lastChar, o, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal)) : (d.copy(this.lastChar, o, 0, d.length), void (this.lastNeed -= d.length));
}
function e(d, o) {
if ((d.length - o) % 2 == 0) {
var c = d.toString("utf16le", o);
if (c) {
var r = c.charCodeAt(c.length - 1);
if (r >= 55296 && r <= 56319) return this.lastNeed = 2, this.lastTotal = 4, this.lastChar[0] = d[d.length - 2], this.lastChar[1] = d[d.length - 1], c.slice(0, -1);
}
return c;
}
return this.lastNeed = 1, this.lastTotal = 2, this.lastChar[0] = d[d.length - 1], d.toString("utf16le", o, d.length - 1);
}
function A(d) {
var o = d && d.length ? this.write(d) : "";
if (this.lastNeed) {
var c = this.lastTotal - this.lastNeed;
return o + this.lastChar.toString("utf16le", 0, c);
}
return o;
}
function s(d, o) {
var c = (d.length - o) % 3;
return c === 0 ? d.toString("base64", o) : (this.lastNeed = 3 - c, this.lastTotal = 3, c === 1 ? this.lastChar[0] = d[d.length - 1] : (this.lastChar[0] = d[d.length - 2], this.lastChar[1] = d[d.length - 1]), d.toString("base64", o, d.length - c));
}
function l(d) {
var o = d && d.length ? this.write(d) : "";
return this.lastNeed ? o + this.lastChar.toString("base64", 0, 3 - this.lastNeed) : o;
}
function n(d) {
return d.toString(this.encoding);
}
function a(d) {
return d && d.length ? this.write(d) : "";
}
return rX.StringDecoder = g, g.prototype.write = function(d) {
if (d.length === 0) return "";
var o, c;
if (this.lastNeed) {
if ((o = this.fillLast(d)) === void 0) return "";
c = this.lastNeed, this.lastNeed = 0;
} else c = 0;
return c < d.length ? o ? o + this.text(d, c) : this.text(d, c) : o || "";
}, g.prototype.end = function(d) {
var o = d && d.length ? this.write(d) : "";
return this.lastNeed ? o + "�" : o;
}, g.prototype.text = function(d, o) {
var c = function(h, b, u) {
var m = b.length - 1;
if (m < u) return 0;
var Z = C(b[m]);
return Z >= 0 ? (Z > 0 && (h.lastNeed = Z - 1), Z) : --m < u || Z === -2 ? 0 : (Z = C(b[m])) >= 0 ? (Z > 0 && (h.lastNeed = Z - 2), Z) : --m < u || Z === -2 ? 0 : (Z = C(b[m])) >= 0 ? (Z > 0 && (Z === 2 ? Z = 0 : h.lastNeed = Z - 3), Z) : 0;
}(this, d, o);
if (!this.lastNeed) return d.toString("utf8", o);
this.lastTotal = c;
var r = d.length - (c - this.lastNeed);
return d.copy(this.lastChar, 0, r), d.toString("utf8", o, r);
}, g.prototype.fillLast = function(d) {
if (this.lastNeed <= d.length) return d.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal);
d.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, d.length), this.lastNeed -= d.length;
}, rX;
}
function FCg() {
if (l_) return oX;
l_ = 1;
var t = nM();
oX = h;
var I, g = function() {
if (Q8) return j8;
Q8 = 1;
var B = {}.toString;
return j8 = Array.isArray || function(G) {
return B.call(G) == "[object Array]";
};
}();
h.ReadableState = r, Xhg.EventEmitter;
var C = function(B, G) {
return B.listeners(G).length;
}, i = XCg(), e = aM().Buffer, A = oe.Uint8Array || function() {
}, s = Object.create(bG());
s.inherits = uG();
var l = oM, n = void 0;
n = l && l.debuglog ? l.debuglog("stream") : function() {
};
var a, d = Shg(), o = DCg();
s.inherits(h, i);
var c = ["error", "close", "destroy", "pause", "resume"];
function r(B, G) {
B = B || {};
var w = G instanceof (I = I || y0());
this.objectMode = !!B.objectMode, w && (this.objectMode = this.objectMode || !!B.readableObjectMode);
var W = B.highWaterMark, y = B.readableHighWaterMark, f = this.objectMode ? 16 : 16384;
this.highWaterMark = W || W === 0 ? W : w && (y || y === 0) ? y : f, this.highWaterMark = Math.floor(this.highWaterMark), this.buffer = new d(), this.length = 0, this.pipes = null, this.pipesCount = 0, this.flowing = null, this.ended = !1, this.endEmitted = !1, this.reading = !1, this.sync = !0, this.needReadable = !1, this.emittedReadable = !1, this.readableListening = !1, this.resumeScheduled = !1, this.destroyed = !1, this.defaultEncoding = B.defaultEncoding || "utf8", this.awaitDrain = 0, this.readingMore = !1, this.decoder = null, this.encoding = null, B.encoding && (a || (a = c_().StringDecoder), this.decoder = new a(B.encoding), this.encoding = B.encoding);
}
function h(B) {
if (I = I || y0(), !(this instanceof h)) return new h(B);
this._readableState = new r(B, this), this.readable = !0, B && (typeof B.read == "function" && (this._read = B.read), typeof B.destroy == "function" && (this._destroy = B.destroy)), i.call(this);
}
function b(B, G, w, W, y) {
var f, D = B._readableState;
return G === null ? (D.reading = !1, function(F, T) {
if (!T.ended) {
if (T.decoder) {
var Q = T.decoder.end();
Q && Q.length && (T.buffer.push(Q), T.length += T.objectMode ? 1 : Q.length);
}
T.ended = !0, p(F);
}
}(B, D)) : (y || (f = function(F, T) {
var Q;
P = T, e.isBuffer(P) || P instanceof A || typeof T == "string" || T === void 0 || F.objectMode || (Q = new TypeError("Invalid non-string/buffer chunk"));
var P;
return Q;
}(D, G)), f ? B.emit("error", f) : D.objectMode || G && G.length > 0 ? (typeof G == "string" || D.objectMode || Object.getPrototypeOf(G) === e.prototype || (G = function(F) {
return e.from(F);
}(G)), W ? D.endEmitted ? B.emit("error", new Error("stream.unshift() after end event")) : u(B, D, G, !0) : D.ended ? B.emit("error", new Error("stream.push() after EOF")) : (D.reading = !1, D.decoder && !w ? (G = D.decoder.write(G), D.objectMode || G.length !== 0 ? u(B, D, G, !1) : R(B, D)) : u(B, D, G, !1))) : W || (D.reading = !1)), function(F) {
return !F.ended && (F.needReadable || F.length < F.highWaterMark || F.length === 0);
}(D);
}
function u(B, G, w, W) {
G.flowing && G.length === 0 && !G.sync ? (B.emit("data", w), B.read(0)) : (G.length += G.objectMode ? 1 : w.length, W ? G.buffer.unshift(w) : G.buffer.push(w), G.needReadable && p(B)), R(B, G);
}
Object.defineProperty(h.prototype, "destroyed", { get: function() {
return this._readableState !== void 0 && this._readableState.destroyed;
}, set: function(B) {
this._readableState && (this._readableState.destroyed = B);
} }), h.prototype.destroy = o.destroy, h.prototype._undestroy = o.undestroy, h.prototype._destroy = function(B, G) {
this.push(null), G(B);
}, h.prototype.push = function(B, G) {
var w, W = this._readableState;
return W.objectMode ? w = !0 : typeof B == "string" && ((G = G || W.defaultEncoding) !== W.encoding && (B = e.from(B, G), G = ""), w = !0), b(this, B, G, !1, w);
}, h.prototype.unshift = function(B) {
return b(this, B, null, !0, !1);
}, h.prototype.isPaused = function() {
return this._readableState.flowing === !1;
}, h.prototype.setEncoding = function(B) {
return a || (a = c_().StringDecoder), this._readableState.decoder = new a(B), this._readableState.encoding = B, this;
};
var m = 8388608;
function Z(B, G) {
return B <= 0 || G.length === 0 && G.ended ? 0 : G.objectMode ? 1 : B != B ? G.flowing && G.length ? G.buffer.head.data.length : G.length : (B > G.highWaterMark && (G.highWaterMark = function(w) {
return w >= m ? w = m : (w--, w |= w >>> 1, w |= w >>> 2, w |= w >>> 4, w |= w >>> 8, w |= w >>> 16, w++), w;
}(B)), B <= G.length ? B : G.ended ? G.length : (G.needReadable = !0, 0));
}
function p(B) {
var G = B._readableState;
G.needReadable = !1, G.emittedReadable || (n("emitReadable", G.flowing), G.emittedReadable = !0, G.sync ? t.nextTick(Y, B) : Y(B));
}
function Y(B) {
n("emit readable"), B.emit("readable"), z(B);
}
function R(B, G) {
G.readingMore || (G.readingMore = !0, t.nextTick(X, B, G));
}
function X(B, G) {
for (var w = G.length; !G.reading && !G.flowing && !G.ended && G.length < G.highWaterMark && (n("maybeReadMore read 0"), B.read(0), w !== G.length); ) w = G.length;
G.readingMore = !1;
}
function H(B) {
n("readable nexttick read 0"), B.read(0);
}
function S(B, G) {
G.reading || (n("resume read 0"), B.read(0)), G.resumeScheduled = !1, G.awaitDrain = 0, B.emit("resume"), z(B), G.flowing && !G.reading && B.read(0);
}
function z(B) {
var G = B._readableState;
for (n("flow", G.flowing); G.flowing && B.read() !== null; ) ;
}
function v(B, G) {
return G.length === 0 ? null : (G.objectMode ? w = G.buffer.shift() : !B || B >= G.length ? (w = G.decoder ? G.buffer.join("") : G.buffer.length === 1 ? G.buffer.head.data : G.buffer.concat(G.length), G.buffer.clear()) : w = function(W, y, f) {
var D;
return W < y.head.data.length ? (D = y.head.data.slice(0, W), y.head.data = y.head.data.slice(W)) : D = W === y.head.data.length ? y.shift() : f ? function(F, T) {
var Q = T.head, P = 1, L = Q.data;
for (F -= L.length; Q = Q.next; ) {
var E = Q.data, J = F > E.length ? E.length : F;
if (J === E.length ? L += E : L += E.slice(0, F), (F -= J) === 0) {
J === E.length ? (++P, Q.next ? T.head = Q.next : T.head = T.tail = null) : (T.head = Q, Q.data = E.slice(J));
break;
}
++P;
}
return T.length -= P, L;
}(W, y) : function(F, T) {
var Q = e.allocUnsafe(F), P = T.head, L = 1;
for (P.data.copy(Q), F -= P.data.length; P = P.next; ) {
var E = P.data, J = F > E.length ? E.length : F;
if (E.copy(Q, Q.length - F, 0, J), (F -= J) === 0) {
J === E.length ? (++L, P.next ? T.head = P.next : T.head = T.tail = null) : (T.head = P, P.data = E.slice(J));
break;
}
++L;
}
return T.length -= L, Q;
}(W, y), D;
}(B, G.buffer, G.decoder), w);
var w;
}
function K(B) {
var G = B._readableState;
if (G.length > 0) throw new Error('"endReadable()" called on non-empty stream');
G.endEmitted || (G.ended = !0, t.nextTick(V, G, B));
}
function V(B, G) {
B.endEmitted || B.length !== 0 || (B.endEmitted = !0, G.readable = !1, G.emit("end"));
}
function N(B, G) {
for (var w = 0, W = B.length; w < W; w++) if (B[w] === G) return w;
return -1;
}
return h.prototype.read = function(B) {
n("read", B), B = parseInt(B, 10);
var G = this._readableState, w = B;
if (B !== 0 && (G.emittedReadable = !1), B === 0 && G.needReadable && (G.length >= G.highWaterMark || G.ended)) return n("read: emitReadable", G.length, G.ended), G.length === 0 && G.ended ? K(this) : p(this), null;
if ((B = Z(B, G)) === 0 && G.ended) return G.length === 0 && K(this), null;
var W, y = G.needReadable;
return n("need readable", y), (G.length === 0 || G.length - B < G.highWaterMark) && n("length less than watermark", y = !0), G.ended || G.reading ? n("reading or ended", y = !1) : y && (n("do read"), G.reading = !0, G.sync = !0, G.length === 0 && (G.needReadable = !0), this._read(G.highWaterMark), G.sync = !1, G.reading || (B = Z(w, G))), (W = B > 0 ? v(B, G) : null) === null ? (G.needReadable = !0, B = 0) : G.length -= B, G.length === 0 && (G.ended || (G.needReadable = !0), w !== B && G.ended && K(this)), W !== null && this.emit("data", W), W;
}, h.prototype._read = function(B) {
this.emit("error", new Error("_read() is not implemented"));
}, h.prototype.pipe = function(B, G) {
var w = this, W = this._readableState;
switch (W.pipesCount) {
case 0:
W.pipes = B;
break;
case 1:
W.pipes = [W.pipes, B];
break;
default:
W.pipes.push(B);
}
W.pipesCount += 1, n("pipe count=%d opts=%j", W.pipesCount, G);
var y = (!G || G.end !== !1) && B !== ld.stdout && B !== ld.stderr ? D : k;
function f(j, q) {
n("onunpipe"), j === w && q && q.hasUnpiped === !1 && (q.hasUnpiped = !0, n("cleanup"), B.removeListener("close", E), B.removeListener("finish", J), B.removeListener("drain", F), B.removeListener("error", L), B.removeListener("unpipe", f), w.removeListener("end", D), w.removeListener("end", k), w.removeListener("data", P), T = !0, !W.awaitDrain || B._writableState && !B._writableState.needDrain || F());
}
function D() {
n("onend"), B.end();
}
W.endEmitted ? t.nextTick(y) : w.once("end", y), B.on("unpipe", f);
var F = /* @__PURE__ */ function(j) {
return function() {
var q = j._readableState;
n("pipeOnDrain", q.awaitDrain), q.awaitDrain && q.awaitDrain--, q.awaitDrain === 0 && C(j, "data") && (q.flowing = !0, z(j));
};
}(w);
B.on("drain", F);
var T = !1, Q = !1;
function P(j) {
n("ondata"), Q = !1, B.write(j) !== !1 || Q || ((W.pipesCount === 1 && W.pipes === B || W.pipesCount > 1 && N(W.pipes, B) !== -1) && !T && (n("false write response, pause", w._readableState.awaitDrain), w._readableState.awaitDrain++, Q = !0), w.pause());
}
function L(j) {
n("onerror", j), k(), B.removeListener("error", L), C(B, "error") === 0 && B.emit("error", j);
}
function E() {
B.removeListener("finish", J), k();
}
function J() {
n("onfinish"), B.removeListener("close", E), k();
}
function k() {
n("unpipe"), w.unpipe(B);
}
return w.on("data", P), function(j, q, Cg) {
if (typeof j.prependListener == "function") return j.prependListener(q, Cg);
j._events && j._events[q] ? g(j._events[q]) ? j._events[q].unshift(Cg) : j._events[q] = [Cg, j._events[q]] : j.on(q, Cg);
}(B, "error", L), B.once("close", E), B.once("finish", J), B.emit("pipe", w), W.flowing || (n("pipe resume"), w.resume()), B;
}, h.prototype.unpipe = function(B) {
var G = this._readableState, w = { hasUnpiped: !1 };
if (G.pipesCount === 0) return this;
if (G.pipesCount === 1) return B && B !== G.pipes || (B || (B = G.pipes), G.pipes = null, G.pipesCount = 0, G.flowing = !1, B && B.emit("unpipe", this, w)), this;
if (!B) {
var W = G.pipes, y = G.pipesCount;
G.pipes = null, G.pipesCount = 0, G.flowing = !1;
for (var f = 0; f < y; f++) W[f].emit("unpipe", this, w);
return this;
}
var D = N(G.pipes, B);
return D === -1 || (G.pipes.splice(D, 1), G.pipesCount -= 1, G.pipesCount === 1 && (G.pipes = G.pipes[0]), B.emit("unpipe", this, w)), this;
}, h.prototype.on = function(B, G) {
var w = i.prototype.on.call(this, B, G);
if (B === "data") this._readableState.flowing !== !1 && this.resume();
else if (B === "readable") {
var W = this._readableState;
W.endEmitted || W.readableListening || (W.readableListening = W.needReadable = !0, W.emittedReadable = !1, W.reading ? W.length && p(this) : t.nextTick(H, this));
}
return w;
}, h.prototype.addListener = h.prototype.on, h.prototype.resume = function() {
var B = this._readableState;
return B.flowing || (n("resume"), B.flowing = !0, function(G, w) {
w.resumeScheduled || (w.resumeScheduled = !0, t.nextTick(S, G, w));
}(this, B)), this;
}, h.prototype.pause = function() {
return n("call pause flowing=%j", this._readableState.flowing), this._readableState.flowing !== !1 && (n("pause"), this._readableState.flowing = !1, this.emit("pause")), this;
}, h.prototype.wrap = function(B) {
var G = this, w = this._readableState, W = !1;
for (var y in B.on("end", function() {
if (n("wrapped end"), w.decoder && !w.ended) {
var D = w.decoder.end();
D && D.length && G.push(D);
}
G.push(null);
}), B.on("data", function(D) {
n("wrapped data"), w.decoder && (D = w.decoder.write(D)), w.objectMode && D == null || (w.objectMode || D && D.length) && (G.push(D) || (W = !0, B.pause()));
}), B) this[y] === void 0 && typeof B[y] == "function" && (this[y] = /* @__PURE__ */ function(D) {
return function() {
return B[D].apply(B, arguments);
};
}(y));
for (var f = 0; f < c.length; f++) B.on(c[f], this.emit.bind(this, c[f]));
return this._read = function(D) {
n("wrapped _read", D), W && (W = !1, B.resume());
}, this;
}, Object.defineProperty(h.prototype, "readableHighWaterMark", { enumerable: !1, get: function() {
return this._readableState.highWaterMark;
} }), h._fromList = v, oX;
}
function d_() {
if (n_) return cX;
n_ = 1, cX = C;
var t = y0(), I = Object.create(bG());
function g(A, s) {
var l = this._transformState;
l.transforming = !1;
var n = l.writecb;
if (!n) return this.emit("error", new Error("write callback called multiple times"));
l.writechunk = null, l.writecb = null, s != null && this.push(s), n(A);
var a = this._readableState;
a.reading = !1, (a.needReadable || a.length < a.highWaterMark) && this._read(a.highWaterMark);
}
function C(A) {
if (!(this instanceof C)) return new C(A);
t.call(this, A), this._transformState = { afterTransform: g.bind(this), needTransform: !1, transforming: !1, writecb: null, writechunk: null, writeencoding: null }, this._readableState.needReadable = !0, this._readableState.sync = !1, A && (typeof A.transform == "function" && (this._transform = A.transform), typeof A.flush == "function" && (this._flush = A.flush)), this.on("prefinish", i);
}
function i() {
var A = this;
typeof this._flush == "function" ? this._flush(function(s, l) {
e(A, s, l);
}) : e(this, null, null);
}
function e(A, s, l) {
if (s) return A.emit("error", s);
if (l != null && A.push(l), A._writableState.length) throw new Error("Calling transform done when ws.length != 0");
if (A._transformState.transforming) throw new Error("Calling transform done when still transforming");
return A.push(null);
}
return I.inherits = uG(), I.inherits(C, t), C.prototype.push = function(A, s) {
return this._transformState.needTransform = !1, t.prototype.push.call(this, A, s);
}, C.prototype._transform = function(A, s, l) {
throw new Error("_transform() is not implemented");
}, C.prototype._write = function(A, s, l) {
var n = this._transformState;
if (n.writecb = l, n.writechunk = A, n.writeencoding = s, !n.transforming) {
var a = this._readableState;
(n.needTransform || a.needReadable || a.length < a.highWaterMark) && this._read(a.highWaterMark);
}
}, C.prototype._read = function(A) {
var s = this._transformState;
s.writechunk !== null && s.writecb && !s.transforming ? (s.transforming = !0, this._transform(s.writechunk, s.writeencoding, s.afterTransform)) : s.needTransform = !0;
}, C.prototype._destroy = function(A, s) {
var l = this;
t.prototype._destroy.call(this, A, function(n) {
s(n), l.emit("close");
});
}, cX;
}
function kCg() {
return o_ || (o_ = 1, function(t, I) {
var g = HCg;
ld.env.READABLE_STREAM === "disable" && g ? (t.exports = g, (I = t.exports = g.Readable).Readable = g.Readable, I.Writable = g.Writable, I.Duplex = g.Duplex, I.Transform = g.Transform, I.PassThrough = g.PassThrough, I.Stream = g) : ((I = t.exports = FCg()).Stream = g || I, I.Readable = I, I.Writable = KCg(), I.Duplex = y0(), I.Transform = d_(), I.PassThrough = function() {
if (a_) return dX;
a_ = 1, dX = e;
var C = d_(), i = Object.create(bG());
function e(A) {
if (!(this instanceof e)) return new e(A);
C.call(this, A);
}
return i.inherits = uG(), i.inherits(e, C), e.prototype._transform = function(A, s, l) {
l(null, A);
}, dX;
}());
}(_H, _H.exports)), _H.exports;
}
if (rt.base64 = !0, rt.array = !0, rt.string = !0, rt.arraybuffer = typeof ArrayBuffer < "u" && typeof Uint8Array < "u", rt.nodebuffer = !0, rt.uint8array = typeof Uint8Array < "u", typeof ArrayBuffer > "u") rt.blob = !1;
else {
var r_ = new ArrayBuffer(0);
try {
rt.blob = new Blob([r_], { type: "application/zip" }).size === 0;
} catch {
try {
var h_ = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
h_.append(r_), rt.blob = h_.getBlob("application/zip").size === 0;
} catch {
rt.blob = !1;
}
}
}
try {
rt.nodestream = !!kCg().Readable;
} catch {
rt.nodestream = !1;
}
var b_, PY = {};
function zCg() {
if (b_) return PY;
b_ = 1;
var t = gt(), I = rt, g = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
return PY.encode = function(C) {
for (var i, e, A, s, l, n, a, d = [], o = 0, c = C.length, r = c, h = t.getTypeOf(C) !== "string"; o < C.length; ) r = c - o, h ? (i = C[o++], e = o < c ? C[o++] : 0, A = o < c ? C[o++] : 0) : (i = C.charCodeAt(o++), e = o < c ? C.charCodeAt(o++) : 0, A = o < c ? C.charCodeAt(o++) : 0), s = i >> 2, l = (3 & i) << 4 | e >> 4, n = r > 1 ? (15 & e) << 2 | A >> 6 : 64, a = r > 2 ? 63 & A : 64, d.push(g.charAt(s) + g.charAt(l) + g.charAt(n) + g.charAt(a));
return d.join("");
}, PY.decode = function(C) {
var i, e, A, s, l, n, a = 0, d = 0, o = "data:";
if (C.substr(0, o.length) === o) throw new Error("Invalid base64 input, it looks like a data url.");
var c, r = 3 * (C = C.replace(/[^A-Za-z0-9+/=]/g, "")).length / 4;
if (C.charAt(C.length - 1) === g.charAt(64) && r--, C.charAt(C.length - 2) === g.charAt(64) && r--, r % 1 != 0) throw new Error("Invalid base64 input, bad content length.");
for (c = I.uint8array ? new Uint8Array(0 | r) : new Array(0 | r); a < C.length; ) i = g.indexOf(C.charAt(a++)) << 2 | (s = g.indexOf(C.charAt(a++))) >> 4, e = (15 & s) << 4 | (l = g.indexOf(C.charAt(a++))) >> 2, A = (3 & l) << 6 | (n = g.indexOf(C.charAt(a++))), c[d++] = i, l !== 64 && (c[d++] = e), n !== 64 && (c[d++] = A);
return c;
}, PY;
}
var u_, m_, hX, Z_, cM = { isNode: !0, newBufferFrom: function(t, I) {
if (Hg.from && Hg.from !== Uint8Array.from) return Hg.from(t, I);
if (typeof t == "number") throw new Error('The "data" argument must not be a number');
return new Hg(t, I);
}, allocBuffer: function(t) {
if (Hg.alloc) return Hg.alloc(t);
var I = new Hg(t);
return I.fill(0), I;
}, isBuffer: function(t) {
return dG(t);
}, isStream: function(t) {
return t && typeof t.on == "function" && typeof t.pause == "function" && typeof t.resume == "function";
} }, JCg = null;
JCg = typeof Promise < "u" ? Promise : function() {
if (Z_) return hX;
Z_ = 1;
var t = function() {
if (m_) return u_;
m_ = 1;
var o, c, r = oe.MutationObserver || oe.WebKitMutationObserver;
if (r) {
var h = 0, b = new r(p), u = oe.document.createTextNode("");
b.observe(u, { characterData: !0 }), o = function() {
u.data = h = ++h % 2;
};
} else if (oe.setImmediate || oe.MessageChannel === void 0) o = "document" in oe && "onreadystatechange" in oe.document.createElement("script") ? function() {
var Y = oe.document.createElement("script");
Y.onreadystatechange = function() {
p(), Y.onreadystatechange = null, Y.parentNode.removeChild(Y), Y = null;
}, oe.document.documentElement.appendChild(Y);
} : function() {
setTimeout(p, 0);
};
else {
var m = new oe.MessageChannel();
m.port1.onmessage = p, o = function() {
m.port2.postMessage(0);
};
}
var Z = [];
function p() {
var Y, R;
c = !0;
for (var X = Z.length; X; ) {
for (R = Z, Z = [], Y = -1; ++Y < X; ) R[Y]();
X = Z.length;
}
c = !1;
}
return u_ = function(Y) {
Z.push(Y) !== 1 || c || o();
};
}();
function I() {
}
var g = {}, C = ["REJECTED"], i = ["FULFILLED"], e = ["PENDING"];
function A(o) {
if (typeof o != "function") throw new TypeError("resolver must be a function");
this.state = e, this.queue = [], this.outcome = void 0, o !== I && a(this, o);
}
function s(o, c, r) {
this.promise = o, typeof c == "function" && (this.onFulfilled = c, this.callFulfilled = this.otherCallFulfilled), typeof r == "function" && (this.onRejected = r, this.callRejected = this.otherCallRejected);
}
function l(o, c, r) {
t(function() {
var h;
try {
h = c(r);
} catch (b) {
return g.reject(o, b);
}
h === o ? g.reject(o, new TypeError("Cannot resolve promise with itself")) : g.resolve(o, h);
});
}
function n(o) {
var c = o && o.then;
if (o && (typeof o == "object" || typeof o == "function") && typeof c == "function") return function() {
c.apply(o, arguments);
};
}
function a(o, c) {
var r = !1;
function h(m) {
r || (r = !0, g.reject(o, m));
}
function b(m) {
r || (r = !0, g.resolve(o, m));
}
var u = d(function() {
c(b, h);
});
u.status === "error" && h(u.value);
}
function d(o, c) {
var r = {};
try {
r.value = o(c), r.status = "success";
} catch (h) {
r.status = "error", r.value = h;
}
return r;
}
return hX = A, A.prototype.finally = function(o) {
if (typeof o != "function") return this;
var c = this.constructor;
return this.then(function(r) {
return c.resolve(o()).then(function() {
return r;
});
}, function(r) {
return c.resolve(o()).then(function() {
throw r;
});
});
}, A.prototype.catch = function(o) {
return this.then(null, o);
}, A.prototype.then = function(o, c) {
if (typeof o != "function" && this.state === i || typeof c != "function" && this.state === C) return this;
var r = new this.constructor(I);
return this.state !== e ? l(r, this.state === i ? o : c, this.outcome) : this.queue.push(new s(r, o, c)), r;
}, s.prototype.callFulfilled = function(o) {
g.resolve(this.promise, o);
}, s.prototype.otherCallFulfilled = function(o) {
l(this.promise, this.onFulfilled, o);
}, s.prototype.callRejected = function(o) {
g.reject(this.promise, o);
}, s.prototype.otherCallRejected = function(o) {
l(this.promise, this.onRejected, o);
}, g.resolve = function(o, c) {
var r = d(n, c);
if (r.status === "error") return g.reject(o, r.value);
var h = r.value;
if (h) a(o, h);
else {
o.state = i, o.outcome = c;
for (var b = -1, u = o.queue.length; ++b < u; ) o.queue[b].callFulfilled(c);
}
return o;
}, g.reject = function(o, c) {
o.state = C, o.outcome = c;
for (var r = -1, h = o.queue.length; ++r < h; ) o.queue[r].callRejected(c);
return o;
}, A.resolve = function(o) {
return o instanceof this ? o : g.resolve(new this(I), o);
}, A.reject = function(o) {
var c = new this(I);
return g.reject(c, o);
}, A.all = function(o) {
var c = this;
if (Object.prototype.toString.call(o) !== "[object Array]") return this.reject(new TypeError("must be an array"));
var r = o.length, h = !1;
if (!r) return this.resolve([]);
for (var b = new Array(r), u = 0, m = -1, Z = new this(I); ++m < r; ) p(o[m], m);
return Z;
function p(Y, R) {
c.resolve(Y).then(function(X) {
b[R] = X, ++u !== r || h || (h = !0, g.resolve(Z, b));
}, function(X) {
h || (h = !0, g.reject(Z, X));
});
}
}, A.race = function(o) {
var c = this;
if (Object.prototype.toString.call(o) !== "[object Array]") return this.reject(new TypeError("must be an array"));
var r = o.length, h = !1;
if (!r) return this.resolve([]);
for (var b, u = -1, m = new this(I); ++u < r; ) b = o[u], c.resolve(b).then(function(Z) {
h || (h = !0, g.resolve(m, Z));
}, function(Z) {
h || (h = !0, g.reject(m, Z));
});
return m;
}, hX;
}();
var G_, mG = { Promise: JCg };
function gt() {
return G_ || (G_ = 1, function(t) {
var I = rt, g = zCg(), C = cM, i = mG;
function e(d) {
return d;
}
function A(d, o) {
for (var c = 0; c < d.length; ++c) o[c] = 255 & d.charCodeAt(c);
return o;
}
t.newBlob = function(d, o) {
t.checkSupport("blob");
try {
return new Blob([d], { type: o });
} catch {
try {
var c = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();
return c.append(d), c.getBlob(o);
} catch {
throw new Error("Bug : can't construct the Blob.");
}
}
};
var s = { stringifyByChunk: function(d, o, c) {
var r = [], h = 0, b = d.length;
if (b <= c) return String.fromCharCode.apply(null, d);
for (; h < b; ) o === "array" || o === "nodebuffer" ? r.push(String.fromCharCode.apply(null, d.slice(h, Math.min(h + c, b)))) : r.push(String.fromCharCode.apply(null, d.subarray(h, Math.min(h + c, b)))), h += c;
return r.join("");
}, stringifyByChar: function(d) {
for (var o = "", c = 0; c < d.length; c++) o += String.fromCharCode(d[c]);
return o;
}, applyCanBeUsed: { uint8array: function() {
try {
return I.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;
} catch {
return !1;
}
}(), nodebuffer: function() {
try {
return I.nodebuffer && String.fromCharCode.apply(null, C.allocBuffer(1)).length === 1;
} catch {
return !1;
}
}() } };
function l(d) {
var o = 65536, c = t.getTypeOf(d), r = !0;
if (c === "uint8array" ? r = s.applyCanBeUsed.uint8array : c === "nodebuffer" && (r = s.applyCanBeUsed.nodebuffer), r) for (; o > 1; ) try {
return s.stringifyByChunk(d, c, o);
} catch {
o = Math.floor(o / 2);
}
return s.stringifyByChar(d);
}
function n(d, o) {
for (var c = 0; c < d.length; c++) o[c] = d[c];
return o;
}
t.applyFromCharCode = l;
var a = {};
a.string = { string: e, array: function(d) {
return A(d, new Array(d.length));
}, arraybuffer: function(d) {
return a.string.uint8array(d).buffer;
}, uint8array: function(d) {
return A(d, new Uint8Array(d.length));
}, nodebuffer: function(d) {
return A(d, C.allocBuffer(d.length));
} }, a.array = { string: l, array: e, arraybuffer: function(d) {
return new Uint8Array(d).buffer;
}, uint8array: function(d) {
return new Uint8Array(d);
}, nodebuffer: function(d) {
return C.newBufferFrom(d);
} }, a.arraybuffer = { string: function(d) {
return l(new Uint8Array(d));
}, array: function(d) {
return n(new Uint8Array(d), new Array(d.byteLength));
}, arraybuffer: e, uint8array: function(d) {
return new Uint8Array(d);
}, nodebuffer: function(d) {
return C.newBufferFrom(new Uint8Array(d));
} }, a.uint8array = { string: l, array: function(d) {
return n(d, new Array(d.length));
}, arraybuffer: function(d) {
return d.buffer;
}, uint8array: e, nodebuffer: function(d) {
return C.newBufferFrom(d);
} }, a.nodebuffer = { string: l, array: function(d) {
return n(d, new Array(d.length));
}, arraybuffer: function(d) {
return a.nodebuffer.uint8array(d).buffer;
}, uint8array: function(d) {
return n(d, new Uint8Array(d.length));
}, nodebuffer: e }, t.transformTo = function(d, o) {
if (o || (o = ""), !d) return o;
t.checkSupport(d);
var c = t.getTypeOf(o);
return a[c][d](o);
}, t.resolve = function(d) {
for (var o = d.split("/"), c = [], r = 0; r < o.length; r++) {
var h = o[r];
h === "." || h === "" && r !== 0 && r !== o.length - 1 || (h === ".." ? c.pop() : c.push(h));
}
return c.join("/");
}, t.getTypeOf = function(d) {
return typeof d == "string" ? "string" : Object.prototype.toString.call(d) === "[object Array]" ? "array" : I.nodebuffer && C.isBuffer(d) ? "nodebuffer" : I.uint8array && d instanceof Uint8Array ? "uint8array" : I.arraybuffer && d instanceof ArrayBuffer ? "arraybuffer" : void 0;
}, t.checkSupport = function(d) {
if (!I[d.toLowerCase()]) throw new Error(d + " is not supported by this platform");
}, t.MAX_VALUE_16BITS = 65535, t.MAX_VALUE_32BITS = -1, t.pretty = function(d) {
var o, c, r = "";
for (c = 0; c < (d || "").length; c++) r += "\\x" + ((o = d.charCodeAt(c)) < 16 ? "0" : "") + o.toString(16).toUpperCase();
return r;
}, t.delay = function(d, o, c) {
setImmediate(function() {
d.apply(c || null, o || []);
});
}, t.inherits = function(d, o) {
var c = function() {
};
c.prototype = o.prototype, d.prototype = new c();
}, t.extend = function() {
var d, o, c = {};
for (d = 0; d < arguments.length; d++) for (o in arguments[d]) Object.prototype.hasOwnProperty.call(arguments[d], o) && c[o] === void 0 && (c[o] = arguments[d][o]);
return c;
}, t.prepareContent = function(d, o, c, r, h) {
return i.Promise.resolve(o).then(function(b) {
return I.blob && (b instanceof Blob || ["[object File]", "[object Blob]"].indexOf(Object.prototype.toString.call(b)) !== -1) && typeof FileReader < "u" ? new i.Promise(function(u, m) {
var Z = new FileReader();
Z.onload = function(p) {
u(p.target.result);
}, Z.onerror = function(p) {
m(p.target.error);
}, Z.readAsArrayBuffer(b);
}) : b;
}).then(function(b) {
var u, m = t.getTypeOf(b);
return m ? (m === "arraybuffer" ? b = t.transformTo("uint8array", b) : m === "string" && (h ? b = g.decode(b) : c && r !== !0 && (b = A(u = b, I.uint8array ? new Uint8Array(u.length) : new Array(u.length)))), b) : i.Promise.reject(new Error("Can't read the data of '" + d + "'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));
});
};
}(y8)), y8;
}
function LCg(t) {
this.name = t || "default", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;
}
(function(t, I) {
if (!t.setImmediate) {
var g, C, i, e, A, s = 1, l = {}, n = !1, a = t.document, d = Object.getPrototypeOf && Object.getPrototypeOf(t);
d = d && d.setTimeout ? d : t, {}.toString.call(t.process) === "[object process]" ? g = function(r) {
vt(function() {
c(r);
});
} : function() {
if (t.postMessage && !t.importScripts) {
var r = !0, h = t.onmessage;
return t.onmessage = function() {
r = !1;
}, t.postMessage("", "*"), t.onmessage = h, r;
}
}() ? (e = "setImmediate$" + Math.random() + "$", A = function(r) {
r.source === t && typeof r.data == "string" && r.data.indexOf(e) === 0 && c(+r.data.slice(e.length));
}, t.addEventListener ? t.addEventListener("message", A, !1) : t.attachEvent("onmessage", A), g = function(r) {
t.postMessage(e + r, "*");
}) : t.MessageChannel ? ((i = new MessageChannel()).port1.onmessage = function(r) {
c(r.data);
}, g = function(r) {
i.port2.postMessage(r);
}) : a && "onreadystatechange" in a.createElement("script") ? (C = a.documentElement, g = function(r) {
var h = a.createElement("script");
h.onreadystatechange = function() {
c(r), h.onreadystatechange = null, C.removeChild(h), h = null;
}, C.appendChild(h);
}) : g = function(r) {
setTimeout(c, 0, r);
}, d.setImmediate = function(r) {
typeof r != "function" && (r = new Function("" + r));
for (var h = new Array(arguments.length - 1), b = 0; b < h.length; b++) h[b] = arguments[b + 1];
var u = { callback: r, args: h };
return l[s] = u, g(s), s++;
}, d.clearImmediate = o;
}
function o(r) {
delete l[r];
}
function c(r) {
if (n) setTimeout(c, 0, r);
else {
var h = l[r];
if (h) {
n = !0;
try {
(function(b) {
var u = b.callback, m = b.args;
switch (m.length) {
case 0:
u();
break;
case 1:
u(m[0]);
break;
case 2:
u(m[0], m[1]);
break;
case 3:
u(m[0], m[1], m[2]);
break;
default:
u.apply(void 0, m);
}
})(h);
} finally {
o(r), n = !1;
}
}
}
}
})(typeof self > "u" ? oe : self), LCg.prototype = { push: function(t) {
this.emit("data", t);
}, end: function() {
if (this.isFinished) return !1;
this.flush();
try {
this.emit("end"), this.cleanUp(), this.isFinished = !0;
} catch (t) {
this.emit("error", t);
}
return !0;
}, error: function(t) {
return !this.isFinished && (this.isPaused ? this.generatedError = t : (this.isFinished = !0, this.emit("error", t), this.previous && this.previous.error(t), this.cleanUp()), !0);
}, on: function(t, I) {
return this._listeners[t].push(I), this;
}, cleanUp: function() {
this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];
}, emit: function(t, I) {
if (this._listeners[t]) for (var g = 0; g < this._listeners[t].length; g++) this._listeners[t][g].call(this, I);
}, pipe: function(t) {
return t.registerPrevious(this);
}, registerPrevious: function(t) {
if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
this.streamInfo = t.streamInfo, this.mergeStreamInfo(), this.previous = t;
var I = this;
return t.on("data", function(g) {
I.processChunk(g);
}), t.on("end", function() {
I.end();
}), t.on("error", function(g) {
I.error(g);
}), this;
}, pause: function() {
return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);
}, resume: function() {
if (!this.isPaused || this.isFinished) return !1;
this.isPaused = !1;
var t = !1;
return this.generatedError && (this.error(this.generatedError), t = !0), this.previous && this.previous.resume(), !t;
}, flush: function() {
}, processChunk: function(t) {
this.push(t);
}, withStreamInfo: function(t, I) {
return this.extraStreamInfo[t] = I, this.mergeStreamInfo(), this;
}, mergeStreamInfo: function() {
for (var t in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, t) && (this.streamInfo[t] = this.extraStreamInfo[t]);
}, lock: function() {
if (this.isLocked) throw new Error("The stream '" + this + "' has already been used.");
this.isLocked = !0, this.previous && this.previous.lock();
}, toString: function() {
var t = "Worker " + this.name;
return this.previous ? this.previous + " -> " + t : t;
} };
var eA = LCg;
(function(t) {
for (var I = gt(), g = rt, C = cM, i = eA, e = new Array(256), A = 0; A < 256; A++) e[A] = A >= 252 ? 6 : A >= 248 ? 5 : A >= 240 ? 4 : A >= 224 ? 3 : A >= 192 ? 2 : 1;
e[254] = e[254] = 1;
function s() {
i.call(this, "utf-8 decode"), this.leftOver = null;
}
function l() {
i.call(this, "utf-8 encode");
}
t.utf8encode = function(n) {
return g.nodebuffer ? C.newBufferFrom(n, "utf-8") : function(a) {
var d, o, c, r, h, b = a.length, u = 0;
for (r = 0; r < b; r++) (64512 & (o = a.charCodeAt(r))) == 55296 && r + 1 < b && (64512 & (c = a.charCodeAt(r + 1))) == 56320 && (o = 65536 + (o - 55296 << 10) + (c - 56320), r++), u += o < 128 ? 1 : o < 2048 ? 2 : o < 65536 ? 3 : 4;
for (d = g.uint8array ? new Uint8Array(u) : new Array(u), h = 0, r = 0; h < u; r++) (64512 & (o = a.charCodeAt(r))) == 55296 && r + 1 < b && (64512 & (c = a.charCodeAt(r + 1))) == 56320 && (o = 65536 + (o - 55296 << 10) + (c - 56320), r++), o < 128 ? d[h++] = o : o < 2048 ? (d[h++] = 192 | o >>> 6, d[h++] = 128 | 63 & o) : o < 65536 ? (d[h++] = 224 | o >>> 12, d[h++] = 128 | o >>> 6 & 63, d[h++] = 128 | 63 & o) : (d[h++] = 240 | o >>> 18, d[h++] = 128 | o >>> 12 & 63, d[h++] = 128 | o >>> 6 & 63, d[h++] = 128 | 63 & o);
return d;
}(n);
}, t.utf8decode = function(n) {
return g.nodebuffer ? I.transformTo("nodebuffer", n).toString("utf-8") : function(a) {
var d, o, c, r, h = a.length, b = new Array(2 * h);
for (o = 0, d = 0; d < h; ) if ((c = a[d++]) < 128) b[o++] = c;
else if ((r = e[c]) > 4) b[o++] = 65533, d += r - 1;
else {
for (c &= r === 2 ? 31 : r === 3 ? 15 : 7; r > 1 && d < h; ) c = c << 6 | 63 & a[d++], r--;
r > 1 ? b[o++] = 65533 : c < 65536 ? b[o++] = c : (c -= 65536, b[o++] = 55296 | c >> 10 & 1023, b[o++] = 56320 | 1023 & c);
}
return b.length !== o && (b.subarray ? b = b.subarray(0, o) : b.length = o), I.applyFromCharCode(b);
}(n = I.transformTo(g.uint8array ? "uint8array" : "array", n));
}, I.inherits(s, i), s.prototype.processChunk = function(n) {
var a = I.transformTo(g.uint8array ? "uint8array" : "array", n.data);
if (this.leftOver && this.leftOver.length) {
if (g.uint8array) {
var d = a;
(a = new Uint8Array(d.length + this.leftOver.length)).set(this.leftOver, 0), a.set(d, this.leftOver.length);
} else a = this.leftOver.concat(a);
this.leftOver = null;
}
var o = function(r, h) {
var b;
for ((h = h || r.length) > r.length && (h = r.length), b = h - 1; b >= 0 && (192 & r[b]) == 128; ) b--;
return b < 0 || b === 0 ? h : b + e[r[b]] > h ? b : h;
}(a), c = a;
o !== a.length && (g.uint8array ? (c = a.subarray(0, o), this.leftOver = a.subarray(o, a.length)) : (c = a.slice(0, o), this.leftOver = a.slice(o, a.length))), this.push({ data: t.utf8decode(c), meta: n.meta });
}, s.prototype.flush = function() {
this.leftOver && this.leftOver.length && (this.push({ data: t.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);
}, t.Utf8DecodeWorker = s, I.inherits(l, i), l.prototype.processChunk = function(n) {
this.push({ data: t.utf8encode(n.data), meta: n.meta });
}, t.Utf8EncodeWorker = l;
})(M0);
var vCg = eA, w_ = gt();
function dD(t) {
vCg.call(this, "ConvertWorker to " + t), this.destType = t;
}
w_.inherits(dD, vCg), dD.prototype.processChunk = function(t) {
this.push({ data: w_.transformTo(this.destType, t.data), meta: t.meta });
};
var p_, B_, Dhg = dD, nd = gt(), Khg = Dhg, Fhg = eA, khg = zCg(), zhg = mG, TCg = null;
if (rt.nodestream) try {
TCg = function() {
if (B_) return p_;
B_ = 1;
var t = kCg().Readable;
function I(g, C, i) {
t.call(this, C), this._helper = g;
var e = this;
g.on("data", function(A, s) {
e.push(A) || e._helper.pause(), i && i(s);
}).on("error", function(A) {
e.emit("error", A);
}).on("end", function() {
e.push(null);
});
}
return gt().inherits(I, t), I.prototype._read = function() {
this._helper.resume();
}, p_ = I;
}();
} catch {
}
function Jhg(t, I) {
return new zhg.Promise(function(g, C) {
var i = [], e = t._internalType, A = t._outputType, s = t._mimeType;
t.on("data", function(l, n) {
i.push(l), I && I(n);
}).on("error", function(l) {
i = [], C(l);
}).on("end", function() {
try {
var l = function(n, a, d) {
switch (n) {
case "blob":
return nd.newBlob(nd.transformTo("arraybuffer", a), d);
case "base64":
return khg.encode(a);
default:
return nd.transformTo(n, a);
}
}(A, function(n, a) {
var d, o = 0, c = null, r = 0;
for (d = 0; d < a.length; d++) r += a[d].length;
switch (n) {
case "string":
return a.join("");
case "array":
return Array.prototype.concat.apply([], a);
case "uint8array":
for (c = new Uint8Array(r), d = 0; d < a.length; d++) c.set(a[d], o), o += a[d].length;
return c;
case "nodebuffer":
return Hg.concat(a);
default:
throw new Error("concat : unsupported type '" + n + "'");
}
}(e, i), s);
g(l);
} catch (n) {
C(n);
}
i = [];
}).resume();
});
}
function xCg(t, I, g) {
var C = I;
switch (I) {
case "blob":
case "arraybuffer":
C = "uint8array";
break;
case "base64":
C = "string";
}
try {
this._internalType = C, this._outputType = I, this._mimeType = g, nd.checkSupport(C), this._worker = t.pipe(new Khg(C)), t.lock();
} catch (i) {
this._worker = new Fhg("error"), this._worker.error(i);
}
}
xCg.prototype = { accumulate: function(t) {
return Jhg(this, t);
}, on: function(t, I) {
var g = this;
return t === "data" ? this._worker.on(t, function(C) {
I.call(g, C.data, C.meta);
}) : this._worker.on(t, function() {
nd.delay(I, arguments, g);
}), this;
}, resume: function() {
return nd.delay(this._worker.resume, [], this._worker), this;
}, pause: function() {
return this._worker.pause(), this;
}, toNodejsStream: function(t) {
if (nd.checkSupport("nodestream"), this._outputType !== "nodebuffer") throw new Error(this._outputType + " is not supported by this method");
return new TCg(this, { objectMode: this._outputType !== "nodebuffer" }, t);
} };
var jCg = xCg, QCg = { base64: !1, binary: !1, dir: !1, createFolders: !0, date: null, compression: null, compressionOptions: null, comment: null, unixPermissions: null, dosPermissions: null }, xN = gt(), jN = eA;
function gh(t) {
jN.call(this, "DataWorker");
var I = this;
this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = "", this._tickScheduled = !1, t.then(function(g) {
I.dataIsReady = !0, I.data = g, I.max = g && g.length || 0, I.type = xN.getTypeOf(g), I.isPaused || I._tickAndRepeat();
}, function(g) {
I.error(g);
});
}
xN.inherits(gh, jN), gh.prototype.cleanUp = function() {
jN.prototype.cleanUp.call(this), this.data = null;
}, gh.prototype.resume = function() {
return !!jN.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, xN.delay(this._tickAndRepeat, [], this)), !0);
}, gh.prototype._tickAndRepeat = function() {
this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (xN.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));
}, gh.prototype._tick = function() {
if (this.isPaused || this.isFinished) return !1;
var t = null, I = Math.min(this.max, this.index + 16384);
if (this.index >= this.max) return this.end();
switch (this.type) {
case "string":
t = this.data.substring(this.index, I);
break;
case "uint8array":
t = this.data.subarray(this.index, I);
break;
case "array":
case "nodebuffer":
t = this.data.slice(this.index, I);
}
return this.index = I, this.push({ data: t, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });
};
var OCg = gh, Lhg = gt(), W_ = function() {
for (var t, I = [], g = 0; g < 256; g++) {
t = g;
for (var C = 0; C < 8; C++) t = 1 & t ? 3988292384 ^ t >>> 1 : t >>> 1;
I[g] = t;
}
return I;
}(), J9 = function(t, I) {
return t !== void 0 && t.length ? Lhg.getTypeOf(t) !== "string" ? function(g, C, i, e) {
var A = W_, s = e + i;
g ^= -1;
for (var l = e; l < s; l++) g = g >>> 8 ^ A[255 & (g ^ C[l])];
return -1 ^ g;
}(0 | I, t, t.length, 0) : function(g, C, i, e) {
var A = W_, s = e + i;
g ^= -1;
for (var l = e; l < s; l++) g = g >>> 8 ^ A[255 & (g ^ C.charCodeAt(l))];
return -1 ^ g;
}(0 | I, t, t.length, 0) : 0;
}, UCg = eA, vhg = J9;
function rD() {
UCg.call(this, "Crc32Probe"), this.withStreamInfo("crc32", 0);
}
gt().inherits(rD, UCg), rD.prototype.processChunk = function(t) {
this.streamInfo.crc32 = vhg(t.data, this.streamInfo.crc32 || 0), this.push(t);
};
var ECg = rD, Thg = gt(), hD = eA;
function bD(t) {
hD.call(this, "DataLengthProbe for " + t), this.propName = t, this.withStreamInfo(t, 0);
}
Thg.inherits(bD, hD), bD.prototype.processChunk = function(t) {
if (t) {
var I = this.streamInfo[this.propName] || 0;
this.streamInfo[this.propName] = I + t.data.length;
}
hD.prototype.processChunk.call(this, t);
};
var y_ = mG, Y_ = OCg, xhg = ECg, bX = bD;
function uD(t, I, g, C, i) {
this.compressedSize = t, this.uncompressedSize = I, this.crc32 = g, this.compression = C, this.compressedContent = i;
}
uD.prototype = { getContentWorker: function() {
var t = new Y_(y_.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new bX("data_length")), I = this;
return t.on("end", function() {
if (this.streamInfo.data_length !== I.uncompressedSize) throw new Error("Bug : uncompressed data size mismatch");
}), t;
}, getCompressedWorker: function() {
return new Y_(y_.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize", this.compressedSize).withStreamInfo("uncompressedSize", this.uncompressedSize).withStreamInfo("crc32", this.crc32).withStreamInfo("compression", this.compression);
} }, uD.createWorkerFrom = function(t, I, g) {
return t.pipe(new xhg()).pipe(new bX("uncompressedSize")).pipe(I.compressWorker(g)).pipe(new bX("compressedSize")).withStreamInfo("compression", I);
};
var L9 = uD, jhg = jCg, Qhg = OCg, uX = M0, mX = L9, N_ = eA, v9 = function(t, I, g) {
this.name = t, this.dir = g.dir, this.date = g.date, this.comment = g.comment, this.unixPermissions = g.unixPermissions, this.dosPermissions = g.dosPermissions, this._data = I, this._dataBinary = g.binary, this.options = { compression: g.compression, compressionOptions: g.compressionOptions };
};
v9.prototype = { internalStream: function(t) {
var I = null, g = "string";
try {
if (!t) throw new Error("No output type specified.");
var C = (g = t.toLowerCase()) === "string" || g === "text";
g !== "binarystring" && g !== "text" || (g = "string"), I = this._decompressWorker();
var i = !this._dataBinary;
i && !C && (I = I.pipe(new uX.Utf8EncodeWorker())), !i && C && (I = I.pipe(new uX.Utf8DecodeWorker()));
} catch (e) {
(I = new N_("error")).error(e);
}
return new jhg(I, g, "");
}, async: function(t, I) {
return this.internalStream(t).accumulate(I);
}, nodeStream: function(t, I) {
return this.internalStream(t || "nodebuffer").toNodejsStream(I);
}, _compressWorker: function(t, I) {
if (this._data instanceof mX && this._data.compression.magic === t.magic) return this._data.getCompressedWorker();
var g = this._decompressWorker();
return this._dataBinary || (g = g.pipe(new uX.Utf8EncodeWorker())), mX.createWorkerFrom(g, t, I);
}, _decompressWorker: function() {
return this._data instanceof mX ? this._data.getContentWorker() : this._data instanceof N_ ? this._data : new Qhg(this._data);
} };
for (var V_ = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"], Ohg = function() {
throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
}, ZX = 0; ZX < V_.length; ZX++) v9.prototype[V_[ZX]] = Ohg;
var Uhg = v9, PCg = {}, uV = {}, QN = {}, tn = {};
(function(t) {
var I = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Int32Array < "u";
function g(e, A) {
return Object.prototype.hasOwnProperty.call(e, A);
}
t.assign = function(e) {
for (var A = Array.prototype.slice.call(arguments, 1); A.length; ) {
var s = A.shift();
if (s) {
if (typeof s != "object") throw new TypeError(s + "must be non-object");
for (var l in s) g(s, l) && (e[l] = s[l]);
}
}
return e;
}, t.shrinkBuf = function(e, A) {
return e.length === A ? e : e.subarray ? e.subarray(0, A) : (e.length = A, e);
};
var C = { arraySet: function(e, A, s, l, n) {
if (A.subarray && e.subarray) e.set(A.subarray(s, s + l), n);
else for (var a = 0; a < l; a++) e[n + a] = A[s + a];
}, flattenChunks: function(e) {
var A, s, l, n, a, d;
for (l = 0, A = 0, s = e.length; A < s; A++) l += e[A].length;
for (d = new Uint8Array(l), n = 0, A = 0, s = e.length; A < s; A++) a = e[A], d.set(a, n), n += a.length;
return d;
} }, i = { arraySet: function(e, A, s, l, n) {
for (var a = 0; a < l; a++) e[n + a] = A[s + a];
}, flattenChunks: function(e) {
return [].concat.apply([], e);
} };
t.setTyped = function(e) {
e ? (t.Buf8 = Uint8Array, t.Buf16 = Uint16Array, t.Buf32 = Int32Array, t.assign(t, C)) : (t.Buf8 = Array, t.Buf16 = Array, t.Buf32 = Array, t.assign(t, i));
}, t.setTyped(I);
})(tn);
var em = {}, rs = {}, Ih = {}, Ehg = tn;
function R0(t) {
for (var I = t.length; --I >= 0; ) t[I] = 0;
}
var mD = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], ON = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], Phg = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], M_ = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], bl = new Array(576);
R0(bl);
var Am = new Array(60);
R0(Am);
var Hm = new Array(512);
R0(Hm);
var ym = new Array(256);
R0(ym);
var T9 = new Array(29);
R0(T9);
var R_, f_, H_, mV = new Array(30);
function GX(t, I, g, C, i) {
this.static_tree = t, this.extra_bits = I, this.extra_base = g, this.elems = C, this.max_length = i, this.has_stree = t && t.length;
}
function wX(t, I) {
this.dyn_tree = t, this.max_code = 0, this.stat_desc = I;
}
function _Cg(t) {
return t < 256 ? Hm[t] : Hm[256 + (t >>> 7)];
}
function Xm(t, I) {
t.pending_buf[t.pending++] = 255 & I, t.pending_buf[t.pending++] = I >>> 8 & 255;
}
function Pi(t, I, g) {
t.bi_valid > 16 - g ? (t.bi_buf |= I << t.bi_valid & 65535, Xm(t, t.bi_buf), t.bi_buf = I >> 16 - t.bi_valid, t.bi_valid += g - 16) : (t.bi_buf |= I << t.bi_valid & 65535, t.bi_valid += g);
}
function Ds(t, I, g) {
Pi(t, g[2 * I], g[2 * I + 1]);
}
function qCg(t, I) {
var g = 0;
do
g |= 1 & t, t >>>= 1, g <<= 1;
while (--I > 0);
return g >>> 1;
}
function $Cg(t, I, g) {
var C, i, e = new Array(16), A = 0;
for (C = 1; C <= 15; C++) e[C] = A = A + g[C - 1] << 1;
for (i = 0; i <= I; i++) {
var s = t[2 * i + 1];
s !== 0 && (t[2 * i] = qCg(e[s]++, s));
}
}
function X_(t) {
var I;
for (I = 0; I < 286; I++) t.dyn_ltree[2 * I] = 0;
for (I = 0; I < 30; I++) t.dyn_dtree[2 * I] = 0;
for (I = 0; I < 19; I++) t.bl_tree[2 * I] = 0;
t.dyn_ltree[512] = 1, t.opt_len = t.static_len = 0, t.last_lit = t.matches = 0;
}
function gtg(t) {
t.bi_valid > 8 ? Xm(t, t.bi_buf) : t.bi_valid > 0 && (t.pending_buf[t.pending++] = t.bi_buf), t.bi_buf = 0, t.bi_valid = 0;
}
function S_(t, I, g, C) {
var i = 2 * I, e = 2 * g;
return t[i] < t[e] || t[i] === t[e] && C[I] <= C[g];
}
function pX(t, I, g) {
for (var C = t.heap[g], i = g << 1; i <= t.heap_len && (i < t.heap_len && S_(I, t.heap[i + 1], t.heap[i], t.depth) && i++, !S_(I, C, t.heap[i], t.depth)); ) t.heap[g] = t.heap[i], g = i, i <<= 1;
t.heap[g] = C;
}
function D_(t, I, g) {
var C, i, e, A, s = 0;
if (t.last_lit !== 0) do
C = t.pending_buf[t.d_buf + 2 * s] << 8 | t.pending_buf[t.d_buf + 2 * s + 1], i = t.pending_buf[t.l_buf + s], s++, C === 0 ? Ds(t, i, I) : (Ds(t, (e = ym[i]) + 256 + 1, I), (A = mD[e]) !== 0 && Pi(t, i -= T9[e], A), Ds(t, e = _Cg(--C), g), (A = ON[e]) !== 0 && Pi(t, C -= mV[e], A));
while (s < t.last_lit);
Ds(t, 256, I);
}
function BX(t, I) {
var g, C, i, e = I.dyn_tree, A = I.stat_desc.static_tree, s = I.stat_desc.has_stree, l = I.stat_desc.elems, n = -1;
for (t.heap_len = 0, t.heap_max = 573, g = 0; g < l; g++) e[2 * g] !== 0 ? (t.heap[++t.heap_len] = n = g, t.depth[g] = 0) : e[2 * g + 1] = 0;
for (; t.heap_len < 2; ) e[2 * (i = t.heap[++t.heap_len] = n < 2 ? ++n : 0)] = 1, t.depth[i] = 0, t.opt_len--, s && (t.static_len -= A[2 * i + 1]);
for (I.max_code = n, g = t.heap_len >> 1; g >= 1; g--) pX(t, e, g);
i = l;
do
g = t.heap[1], t.heap[1] = t.heap[t.heap_len--], pX(t, e, 1), C = t.heap[1], t.heap[--t.heap_max] = g, t.heap[--t.heap_max] = C, e[2 * i] = e[2 * g] + e[2 * C], t.depth[i] = (t.depth[g] >= t.depth[C] ? t.depth[g] : t.depth[C]) + 1, e[2 * g + 1] = e[2 * C + 1] = i, t.heap[1] = i++, pX(t, e, 1);
while (t.heap_len >= 2);
t.heap[--t.heap_max] = t.heap[1], function(a, d) {
var o, c, r, h, b, u, m = d.dyn_tree, Z = d.max_code, p = d.stat_desc.static_tree, Y = d.stat_desc.has_stree, R = d.stat_desc.extra_bits, X = d.stat_desc.extra_base, H = d.stat_desc.max_length, S = 0;
for (h = 0; h <= 15; h++) a.bl_count[h] = 0;
for (m[2 * a.heap[a.heap_max] + 1] = 0, o = a.heap_max + 1; o < 573; o++) (h = m[2 * m[2 * (c = a.heap[o]) + 1] + 1] + 1) > H && (h = H, S++), m[2 * c + 1] = h, c > Z || (a.bl_count[h]++, b = 0, c >= X && (b = R[c - X]), u = m[2 * c], a.opt_len += u * (h + b), Y && (a.static_len += u * (p[2 * c + 1] + b)));
if (S !== 0) {
do {
for (h = H - 1; a.bl_count[h] === 0; ) h--;
a.bl_count[h]--, a.bl_count[h + 1] += 2, a.bl_count[H]--, S -= 2;
} while (S > 0);
for (h = H; h !== 0; h--) for (c = a.bl_count[h]; c !== 0; ) (r = a.heap[--o]) > Z || (m[2 * r + 1] !== h && (a.opt_len += (h - m[2 * r + 1]) * m[2 * r], m[2 * r + 1] = h), c--);
}
}(t, I), $Cg(e, n, t.bl_count);
}
function K_(t, I, g) {
var C, i, e = -1, A = I[1], s = 0, l = 7, n = 4;
for (A === 0 && (l = 138, n = 3), I[2 * (g + 1) + 1] = 65535, C = 0; C <= g; C++) i = A, A = I[2 * (C + 1) + 1], ++s < l && i === A || (s < n ? t.bl_tree[2 * i] += s : i !== 0 ? (i !== e && t.bl_tree[2 * i]++, t.bl_tree[32]++) : s <= 10 ? t.bl_tree[34]++ : t.bl_tree[36]++, s = 0, e = i, A === 0 ? (l = 138, n = 3) : i === A ? (l = 6, n = 3) : (l = 7, n = 4));
}
function F_(t, I, g) {
var C, i, e = -1, A = I[1], s = 0, l = 7, n = 4;
for (A === 0 && (l = 138, n = 3), C = 0; C <= g; C++) if (i = A, A = I[2 * (C + 1) + 1], !(++s < l && i === A)) {
if (s < n) do
Ds(t, i, t.bl_tree);
while (--s != 0);
else i !== 0 ? (i !== e && (Ds(t, i, t.bl_tree), s--), Ds(t, 16, t.bl_tree), Pi(t, s - 3, 2)) : s <= 10 ? (Ds(t, 17, t.bl_tree), Pi(t, s - 3, 3)) : (Ds(t, 18, t.bl_tree), Pi(t, s - 11, 7));
s = 0, e = i, A === 0 ? (l = 138, n = 3) : i === A ? (l = 6, n = 3) : (l = 7, n = 4);
}
}
R0(mV);
var k_ = !1;
function z_(t, I, g, C) {
Pi(t, 0 + (C ? 1 : 0), 3), function(i, e, A, s) {
gtg(i), Xm(i, A), Xm(i, ~A), Ehg.arraySet(i.pending_buf, i.window, e, A, i.pending), i.pending += A;
}(t, I, g);
}
Ih._tr_init = function(t) {
k_ || (function() {
var I, g, C, i, e, A = new Array(16);
for (C = 0, i = 0; i < 28; i++) for (T9[i] = C, I = 0; I < 1 << mD[i]; I++) ym[C++] = i;
for (ym[C - 1] = i, e = 0, i = 0; i < 16; i++) for (mV[i] = e, I = 0; I < 1 << ON[i]; I++) Hm[e++] = i;
for (e >>= 7; i < 30; i++) for (mV[i] = e << 7, I = 0; I < 1 << ON[i] - 7; I++) Hm[256 + e++] = i;
for (g = 0; g <= 15; g++) A[g] = 0;
for (I = 0; I <= 143; ) bl[2 * I + 1] = 8, I++, A[8]++;
for (; I <= 255; ) bl[2 * I + 1] = 9, I++, A[9]++;
for (; I <= 279; ) bl[2 * I + 1] = 7, I++, A[7]++;
for (; I <= 287; ) bl[2 * I + 1] = 8, I++, A[8]++;
for ($Cg(bl, 287, A), I = 0; I < 30; I++) Am[2 * I + 1] = 5, Am[2 * I] = qCg(I, 5);
R_ = new GX(bl, mD, 257, 286, 15), f_ = new GX(Am, ON, 0, 30, 15), H_ = new GX(new Array(0), Phg, 0, 19, 7);
}(), k_ = !0), t.l_desc = new wX(t.dyn_ltree, R_), t.d_desc = new wX(t.dyn_dtree, f_), t.bl_desc = new wX(t.bl_tree, H_), t.bi_buf = 0, t.bi_valid = 0, X_(t);
}, Ih._tr_stored_block = z_, Ih._tr_flush_block = function(t, I, g, C) {
var i, e, A = 0;
t.level > 0 ? (t.strm.data_type === 2 && (t.strm.data_type = function(s) {
var l, n = 4093624447;
for (l = 0; l <= 31; l++, n >>>= 1) if (1 & n && s.dyn_ltree[2 * l] !== 0) return 0;
if (s.dyn_ltree[18] !== 0 || s.dyn_ltree[20] !== 0 || s.dyn_ltree[26] !== 0) return 1;
for (l = 32; l < 256; l++) if (s.dyn_ltree[2 * l] !== 0) return 1;
return 0;
}(t)), BX(t, t.l_desc), BX(t, t.d_desc), A = function(s) {
var l;
for (K_(s, s.dyn_ltree, s.l_desc.max_code), K_(s, s.dyn_dtree, s.d_desc.max_code), BX(s, s.bl_desc), l = 18; l >= 3 && s.bl_tree[2 * M_[l] + 1] === 0; l--) ;
return s.opt_len += 3 * (l + 1) + 5 + 5 + 4, l;
}(t), i = t.opt_len + 3 + 7 >>> 3, (e = t.static_len + 3 + 7 >>> 3) <= i && (i = e)) : i = e = g + 5, g + 4 <= i && I !== -1 ? z_(t, I, g, C) : t.strategy === 4 || e === i ? (Pi(t, 2 + (C ? 1 : 0), 3), D_(t, bl, Am)) : (Pi(t, 4 + (C ? 1 : 0), 3), function(s, l, n, a) {
var d;
for (Pi(s, l - 257, 5), Pi(s, n - 1, 5), Pi(s, a - 4, 4), d = 0; d < a; d++) Pi(s, s.bl_tree[2 * M_[d] + 1], 3);
F_(s, s.dyn_ltree, l - 1), F_(s, s.dyn_dtree, n - 1);
}(t, t.l_desc.max_code + 1, t.d_desc.max_code + 1, A + 1), D_(t, t.dyn_ltree, t.dyn_dtree)), X_(t), C && gtg(t);
}, Ih._tr_tally = function(t, I, g) {
return t.pending_buf[t.d_buf + 2 * t.last_lit] = I >>> 8 & 255, t.pending_buf[t.d_buf + 2 * t.last_lit + 1] = 255 & I, t.pending_buf[t.l_buf + t.last_lit] = 255 & g, t.last_lit++, I === 0 ? t.dyn_ltree[2 * g]++ : (t.matches++, I--, t.dyn_ltree[2 * (ym[g] + 256 + 1)]++, t.dyn_dtree[2 * _Cg(I)]++), t.last_lit === t.lit_bufsize - 1;
}, Ih._tr_align = function(t) {
Pi(t, 2, 3), Ds(t, 256, bl), function(I) {
I.bi_valid === 16 ? (Xm(I, I.bi_buf), I.bi_buf = 0, I.bi_valid = 0) : I.bi_valid >= 8 && (I.pending_buf[I.pending++] = 255 & I.bi_buf, I.bi_buf >>= 8, I.bi_valid -= 8);
}(t);
};
var Itg = function(t, I, g, C) {
for (var i = 65535 & t | 0, e = t >>> 16 & 65535 | 0, A = 0; g !== 0; ) {
g -= A = g > 2e3 ? 2e3 : g;
do
e = e + (i = i + I[C++] | 0) | 0;
while (--A);
i %= 65521, e %= 65521;
}
return i | e << 16 | 0;
}, _hg = function() {
for (var t, I = [], g = 0; g < 256; g++) {
t = g;
for (var C = 0; C < 8; C++) t = 1 & t ? 3988292384 ^ t >>> 1 : t >>> 1;
I[g] = t;
}
return I;
}(), Ah, Ctg = function(t, I, g, C) {
var i = _hg, e = C + g;
t ^= -1;
for (var A = C; A < e; A++) t = t >>> 8 ^ i[255 & (t ^ I[A])];
return -1 ^ t;
}, x9 = { 2: "need dictionary", 1: "stream end", 0: "", "-1": "file error", "-2": "stream error", "-3": "data error", "-4": "insufficient memory", "-5": "buffer error", "-6": "incompatible version" }, Hi = tn, IA = Ih, ttg = Itg, ta = Ctg, qhg = x9;
function Aa(t, I) {
return t.msg = qhg[I], I;
}
function J_(t) {
return (t << 1) - (t > 4 ? 9 : 0);
}
function na(t) {
for (var I = t.length; --I >= 0; ) t[I] = 0;
}
function ia(t) {
var I = t.state, g = I.pending;
g > t.avail_out && (g = t.avail_out), g !== 0 && (Hi.arraySet(t.output, I.pending_buf, I.pending_out, g, t.next_out), t.next_out += g, I.pending_out += g, t.total_out += g, t.avail_out -= g, I.pending -= g, I.pending === 0 && (I.pending_out = 0));
}
function Ii(t, I) {
IA._tr_flush_block(t, t.block_start >= 0 ? t.block_start : -1, t.strstart - t.block_start, I), t.block_start = t.strstart, ia(t.strm);
}
function oC(t, I) {
t.pending_buf[t.pending++] = I;
}
function ku(t, I) {
t.pending_buf[t.pending++] = I >>> 8 & 255, t.pending_buf[t.pending++] = 255 & I;
}
function itg(t, I) {
var g, C, i = t.max_chain_length, e = t.strstart, A = t.prev_length, s = t.nice_match, l = t.strstart > t.w_size - 262 ? t.strstart - (t.w_size - 262) : 0, n = t.window, a = t.w_mask, d = t.prev, o = t.strstart + 258, c = n[e + A - 1], r = n[e + A];
t.prev_length >= t.good_match && (i >>= 2), s > t.lookahead && (s = t.lookahead);
do
if (n[(g = I) + A] === r && n[g + A - 1] === c && n[g] === n[e] && n[++g] === n[e + 1]) {
e += 2, g++;
do
;
while (n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && n[++e] === n[++g] && e < o);
if (C = 258 - (o - e), e = o - 258, C > A) {
if (t.match_start = I, A = C, C >= s) break;
c = n[e + A - 1], r = n[e + A];
}
}
while ((I = d[I & a]) > l && --i != 0);
return A <= t.lookahead ? A : t.lookahead;
}
function Oo(t) {
var I, g, C, i, e, A, s, l, n, a, d = t.w_size;
do {
if (i = t.window_size - t.lookahead - t.strstart, t.strstart >= d + (d - 262)) {
Hi.arraySet(t.window, t.window, d, d, 0), t.match_start -= d, t.strstart -= d, t.block_start -= d, I = g = t.hash_size;
do
C = t.head[--I], t.head[I] = C >= d ? C - d : 0;
while (--g);
I = g = d;
do
C = t.prev[--I], t.prev[I] = C >= d ? C - d : 0;
while (--g);
i += d;
}
if (t.strm.avail_in === 0) break;
if (A = t.strm, s = t.window, l = t.strstart + t.lookahead, n = i, a = void 0, (a = A.avail_in) > n && (a = n), g = a === 0 ? 0 : (A.avail_in -= a, Hi.arraySet(s, A.input, A.next_in, a, l), A.state.wrap === 1 ? A.adler = ttg(A.adler, s, a, l) : A.state.wrap === 2 && (A.adler = ta(A.adler, s, a, l)), A.next_in += a, A.total_in += a, a), t.lookahead += g, t.lookahead + t.insert >= 3) for (e = t.strstart - t.insert, t.ins_h = t.window[e], t.ins_h = (t.ins_h << t.hash_shift ^ t.window[e + 1]) & t.hash_mask; t.insert && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[e + 3 - 1]) & t.hash_mask, t.prev[e & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = e, e++, t.insert--, !(t.lookahead + t.insert < 3)); ) ;
} while (t.lookahead < 262 && t.strm.avail_in !== 0);
}
function WX(t, I) {
for (var g, C; ; ) {
if (t.lookahead < 262) {
if (Oo(t), t.lookahead < 262 && I === 0) return 1;
if (t.lookahead === 0) break;
}
if (g = 0, t.lookahead >= 3 && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart), g !== 0 && t.strstart - g <= t.w_size - 262 && (t.match_length = itg(t, g)), t.match_length >= 3) if (C = IA._tr_tally(t, t.strstart - t.match_start, t.match_length - 3), t.lookahead -= t.match_length, t.match_length <= t.max_lazy_match && t.lookahead >= 3) {
t.match_length--;
do
t.strstart++, t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart;
while (--t.match_length != 0);
t.strstart++;
} else t.strstart += t.match_length, t.match_length = 0, t.ins_h = t.window[t.strstart], t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 1]) & t.hash_mask;
else C = IA._tr_tally(t, 0, t.window[t.strstart]), t.lookahead--, t.strstart++;
if (C && (Ii(t, !1), t.strm.avail_out === 0)) return 1;
}
return t.insert = t.strstart < 2 ? t.strstart : 2, I === 4 ? (Ii(t, !0), t.strm.avail_out === 0 ? 3 : 4) : t.last_lit && (Ii(t, !1), t.strm.avail_out === 0) ? 1 : 2;
}
function kr(t, I) {
for (var g, C, i; ; ) {
if (t.lookahead < 262) {
if (Oo(t), t.lookahead < 262 && I === 0) return 1;
if (t.lookahead === 0) break;
}
if (g = 0, t.lookahead >= 3 && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart), t.prev_length = t.match_length, t.prev_match = t.match_start, t.match_length = 2, g !== 0 && t.prev_length < t.max_lazy_match && t.strstart - g <= t.w_size - 262 && (t.match_length = itg(t, g), t.match_length <= 5 && (t.strategy === 1 || t.match_length === 3 && t.strstart - t.match_start > 4096) && (t.match_length = 2)), t.prev_length >= 3 && t.match_length <= t.prev_length) {
i = t.strstart + t.lookahead - 3, C = IA._tr_tally(t, t.strstart - 1 - t.prev_match, t.prev_length - 3), t.lookahead -= t.prev_length - 1, t.prev_length -= 2;
do
++t.strstart <= i && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + 3 - 1]) & t.hash_mask, g = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart);
while (--t.prev_length != 0);
if (t.match_available = 0, t.match_length = 2, t.strstart++, C && (Ii(t, !1), t.strm.avail_out === 0)) return 1;
} else if (t.match_available) {
if ((C = IA._tr_tally(t, 0, t.window[t.strstart - 1])) && Ii(t, !1), t.strstart++, t.lookahead--, t.strm.avail_out === 0) return 1;
} else t.match_available = 1, t.strstart++, t.lookahead--;
}
return t.match_available && (C = IA._tr_tally(t, 0, t.window[t.strstart - 1]), t.match_available = 0), t.insert = t.strstart < 2 ? t.strstart : 2, I === 4 ? (Ii(t, !0), t.strm.avail_out === 0 ? 3 : 4) : t.last_lit && (Ii(t, !1), t.strm.avail_out === 0) ? 1 : 2;
}
function ns(t, I, g, C, i) {
this.good_length = t, this.max_lazy = I, this.nice_length = g, this.max_chain = C, this.func = i;
}
function $hg() {
this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = 8, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new Hi.Buf16(1146), this.dyn_dtree = new Hi.Buf16(122), this.bl_tree = new Hi.Buf16(78), na(this.dyn_ltree), na(this.dyn_dtree), na(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new Hi.Buf16(16), this.heap = new Hi.Buf16(573), na(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new Hi.Buf16(573), na(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;
}
function etg(t) {
var I;
return t && t.state ? (t.total_in = t.total_out = 0, t.data_type = 2, (I = t.state).pending = 0, I.pending_out = 0, I.wrap < 0 && (I.wrap = -I.wrap), I.status = I.wrap ? 42 : 113, t.adler = I.wrap === 2 ? 0 : 1, I.last_flush = 0, IA._tr_init(I), 0) : Aa(t, -2);
}
function Atg(t) {
var I, g = etg(t);
return g === 0 && ((I = t.state).window_size = 2 * I.w_size, na(I.head), I.max_lazy_match = Ah[I.level].max_lazy, I.good_match = Ah[I.level].good_length, I.nice_match = Ah[I.level].nice_length, I.max_chain_length = Ah[I.level].max_chain, I.strstart = 0, I.block_start = 0, I.lookahead = 0, I.insert = 0, I.match_length = I.prev_length = 2, I.match_available = 0, I.ins_h = 0), g;
}
function L_(t, I, g, C, i, e) {
if (!t) return -2;
var A = 1;
if (I === -1 && (I = 6), C < 0 ? (A = 0, C = -C) : C > 15 && (A = 2, C -= 16), i < 1 || i > 9 || g !== 8 || C < 8 || C > 15 || I < 0 || I > 9 || e < 0 || e > 4) return Aa(t, -2);
C === 8 && (C = 9);
var s = new $hg();
return t.state = s, s.strm = t, s.wrap = A, s.gzhead = null, s.w_bits = C, s.w_size = 1 << s.w_bits, s.w_mask = s.w_size - 1, s.hash_bits = i + 7, s.hash_size = 1 << s.hash_bits, s.hash_mask = s.hash_size - 1, s.hash_shift = ~~((s.hash_bits + 3 - 1) / 3), s.window = new Hi.Buf8(2 * s.w_size), s.head = new Hi.Buf16(s.hash_size), s.prev = new Hi.Buf16(s.w_size), s.lit_bufsize = 1 << i + 6, s.pending_buf_size = 4 * s.lit_bufsize, s.pending_buf = new Hi.Buf8(s.pending_buf_size), s.d_buf = 1 * s.lit_bufsize, s.l_buf = 3 * s.lit_bufsize, s.level = I, s.strategy = e, s.method = g, Atg(t);
}
Ah = [new ns(0, 0, 0, 0, function(t, I) {
var g = 65535;
for (g > t.pending_buf_size - 5 && (g = t.pending_buf_size - 5); ; ) {
if (t.lookahead <= 1) {
if (Oo(t), t.lookahead === 0 && I === 0) return 1;
if (t.lookahead === 0) break;
}
t.strstart += t.lookahead, t.lookahead = 0;
var C = t.block_start + g;
if ((t.strstart === 0 || t.strstart >= C) && (t.lookahead = t.strstart - C, t.strstart = C, Ii(t, !1), t.strm.avail_out === 0) || t.strstart - t.block_start >= t.w_size - 262 && (Ii(t, !1), t.strm.avail_out === 0)) return 1;
}
return t.insert = 0, I === 4 ? (Ii(t, !0), t.strm.avail_out === 0 ? 3 : 4) : (t.strstart > t.block_start && (Ii(t, !1), t.strm.avail_out), 1);
}), new ns(4, 4, 8, 4, WX), new ns(4, 5, 16, 8, WX), new ns(4, 6, 32, 32, WX), new ns(4, 4, 16, 16, kr), new ns(8, 16, 32, 32, kr), new ns(8, 16, 128, 128, kr), new ns(8, 32, 128, 256, kr), new ns(32, 128, 258, 1024, kr), new ns(32, 258, 258, 4096, kr)], rs.deflateInit = function(t, I) {
return L_(t, I, 8, 15, 8, 0);
}, rs.deflateInit2 = L_, rs.deflateReset = Atg, rs.deflateResetKeep = etg, rs.deflateSetHeader = function(t, I) {
return t && t.state ? t.state.wrap !== 2 ? -2 : (t.state.gzhead = I, 0) : -2;
}, rs.deflate = function(t, I) {
var g, C, i, e;
if (!t || !t.state || I > 5 || I < 0) return t ? Aa(t, -2) : -2;
if (C = t.state, !t.output || !t.input && t.avail_in !== 0 || C.status === 666 && I !== 4) return Aa(t, t.avail_out === 0 ? -5 : -2);
if (C.strm = t, g = C.last_flush, C.last_flush = I, C.status === 42) if (C.wrap === 2) t.adler = 0, oC(C, 31), oC(C, 139), oC(C, 8), C.gzhead ? (oC(C, (C.gzhead.text ? 1 : 0) + (C.gzhead.hcrc ? 2 : 0) + (C.gzhead.extra ? 4 : 0) + (C.gzhead.name ? 8 : 0) + (C.gzhead.comment ? 16 : 0)), oC(C, 255 & C.gzhead.time), oC(C, C.gzhead.time >> 8 & 255), oC(C, C.gzhead.time >> 16 & 255), oC(C, C.gzhead.time >> 24 & 255), oC(C, C.level === 9 ? 2 : C.strategy >= 2 || C.level < 2 ? 4 : 0), oC(C, 255 & C.gzhead.os), C.gzhead.extra && C.gzhead.extra.length && (oC(C, 255 & C.gzhead.extra.length), oC(C, C.gzhead.extra.length >> 8 & 255)), C.gzhead.hcrc && (t.adler = ta(t.adler, C.pending_buf, C.pending, 0)), C.gzindex = 0, C.status = 69) : (oC(C, 0), oC(C, 0), oC(C, 0), oC(C, 0), oC(C, 0), oC(C, C.level === 9 ? 2 : C.strategy >= 2 || C.level < 2 ? 4 : 0), oC(C, 3), C.status = 113);
else {
var A = 8 + (C.w_bits - 8 << 4) << 8;
A |= (C.strategy >= 2 || C.level < 2 ? 0 : C.level < 6 ? 1 : C.level === 6 ? 2 : 3) << 6, C.strstart !== 0 && (A |= 32), A += 31 - A % 31, C.status = 113, ku(C, A), C.strstart !== 0 && (ku(C, t.adler >>> 16), ku(C, 65535 & t.adler)), t.adler = 1;
}
if (C.status === 69) if (C.gzhead.extra) {
for (i = C.pending; C.gzindex < (65535 & C.gzhead.extra.length) && (C.pending !== C.pending_buf_size || (C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), ia(t), i = C.pending, C.pending !== C.pending_buf_size)); ) oC(C, 255 & C.gzhead.extra[C.gzindex]), C.gzindex++;
C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), C.gzindex === C.gzhead.extra.length && (C.gzindex = 0, C.status = 73);
} else C.status = 73;
if (C.status === 73) if (C.gzhead.name) {
i = C.pending;
do {
if (C.pending === C.pending_buf_size && (C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), ia(t), i = C.pending, C.pending === C.pending_buf_size)) {
e = 1;
break;
}
e = C.gzindex < C.gzhead.name.length ? 255 & C.gzhead.name.charCodeAt(C.gzindex++) : 0, oC(C, e);
} while (e !== 0);
C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), e === 0 && (C.gzindex = 0, C.status = 91);
} else C.status = 91;
if (C.status === 91) if (C.gzhead.comment) {
i = C.pending;
do {
if (C.pending === C.pending_buf_size && (C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), ia(t), i = C.pending, C.pending === C.pending_buf_size)) {
e = 1;
break;
}
e = C.gzindex < C.gzhead.comment.length ? 255 & C.gzhead.comment.charCodeAt(C.gzindex++) : 0, oC(C, e);
} while (e !== 0);
C.gzhead.hcrc && C.pending > i && (t.adler = ta(t.adler, C.pending_buf, C.pending - i, i)), e === 0 && (C.status = 103);
} else C.status = 103;
if (C.status === 103 && (C.gzhead.hcrc ? (C.pending + 2 > C.pending_buf_size && ia(t), C.pending + 2 <= C.pending_buf_size && (oC(C, 255 & t.adler), oC(C, t.adler >> 8 & 255), t.adler = 0, C.status = 113)) : C.status = 113), C.pending !== 0) {
if (ia(t), t.avail_out === 0) return C.last_flush = -1, 0;
} else if (t.avail_in === 0 && J_(I) <= J_(g) && I !== 4) return Aa(t, -5);
if (C.status === 666 && t.avail_in !== 0) return Aa(t, -5);
if (t.avail_in !== 0 || C.lookahead !== 0 || I !== 0 && C.status !== 666) {
var s = C.strategy === 2 ? function(l, n) {
for (var a; ; ) {
if (l.lookahead === 0 && (Oo(l), l.lookahead === 0)) {
if (n === 0) return 1;
break;
}
if (l.match_length = 0, a = IA._tr_tally(l, 0, l.window[l.strstart]), l.lookahead--, l.strstart++, a && (Ii(l, !1), l.strm.avail_out === 0)) return 1;
}
return l.insert = 0, n === 4 ? (Ii(l, !0), l.strm.avail_out === 0 ? 3 : 4) : l.last_lit && (Ii(l, !1), l.strm.avail_out === 0) ? 1 : 2;
}(C, I) : C.strategy === 3 ? function(l, n) {
for (var a, d, o, c, r = l.window; ; ) {
if (l.lookahead <= 258) {
if (Oo(l), l.lookahead <= 258 && n === 0) return 1;
if (l.lookahead === 0) break;
}
if (l.match_length = 0, l.lookahead >= 3 && l.strstart > 0 && (d = r[o = l.strstart - 1]) === r[++o] && d === r[++o] && d === r[++o]) {
c = l.strstart + 258;
do
;
while (d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && d === r[++o] && o < c);
l.match_length = 258 - (c - o), l.match_length > l.lookahead && (l.match_length = l.lookahead);
}
if (l.match_length >= 3 ? (a = IA._tr_tally(l, 1, l.match_length - 3), l.lookahead -= l.match_length, l.strstart += l.match_length, l.match_length = 0) : (a = IA._tr_tally(l, 0, l.window[l.strstart]), l.lookahead--, l.strstart++), a && (Ii(l, !1), l.strm.avail_out === 0)) return 1;
}
return l.insert = 0, n === 4 ? (Ii(l, !0), l.strm.avail_out === 0 ? 3 : 4) : l.last_lit && (Ii(l, !1), l.strm.avail_out === 0) ? 1 : 2;
}(C, I) : Ah[C.level].func(C, I);
if (s !== 3 && s !== 4 || (C.status = 666), s === 1 || s === 3) return t.avail_out === 0 && (C.last_flush = -1), 0;
if (s === 2 && (I === 1 ? IA._tr_align(C) : I !== 5 && (IA._tr_stored_block(C, 0, 0, !1), I === 3 && (na(C.head), C.lookahead === 0 && (C.strstart = 0, C.block_start = 0, C.insert = 0))), ia(t), t.avail_out === 0)) return C.last_flush = -1, 0;
}
return I !== 4 ? 0 : C.wrap <= 0 ? 1 : (C.wrap === 2 ? (oC(C, 255 & t.adler), oC(C, t.adler >> 8 & 255), oC(C, t.adler >> 16 & 255), oC(C, t.adler >> 24 & 255), oC(C, 255 & t.total_in), oC(C, t.total_in >> 8 & 255), oC(C, t.total_in >> 16 & 255), oC(C, t.total_in >> 24 & 255)) : (ku(C, t.adler >>> 16), ku(C, 65535 & t.adler)), ia(t), C.wrap > 0 && (C.wrap = -C.wrap), C.pending !== 0 ? 0 : 1);
}, rs.deflateEnd = function(t) {
var I;
return t && t.state ? (I = t.state.status) !== 42 && I !== 69 && I !== 73 && I !== 91 && I !== 103 && I !== 113 && I !== 666 ? Aa(t, -2) : (t.state = null, I === 113 ? Aa(t, -3) : 0) : -2;
}, rs.deflateSetDictionary = function(t, I) {
var g, C, i, e, A, s, l, n, a = I.length;
if (!t || !t.state || (e = (g = t.state).wrap) === 2 || e === 1 && g.status !== 42 || g.lookahead) return -2;
for (e === 1 && (t.adler = ttg(t.adler, I, a, 0)), g.wrap = 0, a >= g.w_size && (e === 0 && (na(g.head), g.strstart = 0, g.block_start = 0, g.insert = 0), n = new Hi.Buf8(g.w_size), Hi.arraySet(n, I, a - g.w_size, g.w_size, 0), I = n, a = g.w_size), A = t.avail_in, s = t.next_in, l = t.input, t.avail_in = a, t.next_in = 0, t.input = I, Oo(g); g.lookahead >= 3; ) {
C = g.strstart, i = g.lookahead - 2;
do
g.ins_h = (g.ins_h << g.hash_shift ^ g.window[C + 3 - 1]) & g.hash_mask, g.prev[C & g.w_mask] = g.head[g.ins_h], g.head[g.ins_h] = C, C++;
while (--i);
g.strstart = C, g.lookahead = 2, Oo(g);
}
return g.strstart += g.lookahead, g.block_start = g.strstart, g.insert = g.lookahead, g.lookahead = 0, g.match_length = g.prev_length = 2, g.match_available = 0, t.next_in = s, t.input = l, t.avail_in = A, g.wrap = e, 0;
}, rs.deflateInfo = "pako deflate (from Nodeca project)";
var Uo = {}, ZV = tn, stg = !0, ltg = !0;
try {
String.fromCharCode.apply(null, [0]);
} catch {
stg = !1;
}
try {
String.fromCharCode.apply(null, new Uint8Array(1));
} catch {
ltg = !1;
}
for (var sm = new ZV.Buf8(256), En = 0; En < 256; En++) sm[En] = En >= 252 ? 6 : En >= 248 ? 5 : En >= 240 ? 4 : En >= 224 ? 3 : En >= 192 ? 2 : 1;
function v_(t, I) {
if (I < 65534 && (t.subarray && ltg || !t.subarray && stg)) return String.fromCharCode.apply(null, ZV.shrinkBuf(t, I));
for (var g = "", C = 0; C < I; C++) g += String.fromCharCode(t[C]);
return g;
}
sm[254] = sm[254] = 1, Uo.string2buf = function(t) {
var I, g, C, i, e, A = t.length, s = 0;
for (i = 0; i < A; i++) (64512 & (g = t.charCodeAt(i))) == 55296 && i + 1 < A && (64512 & (C = t.charCodeAt(i + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (C - 56320), i++), s += g < 128 ? 1 : g < 2048 ? 2 : g < 65536 ? 3 : 4;
for (I = new ZV.Buf8(s), e = 0, i = 0; e < s; i++) (64512 & (g = t.charCodeAt(i))) == 55296 && i + 1 < A && (64512 & (C = t.charCodeAt(i + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (C - 56320), i++), g < 128 ? I[e++] = g : g < 2048 ? (I[e++] = 192 | g >>> 6, I[e++] = 128 | 63 & g) : g < 65536 ? (I[e++] = 224 | g >>> 12, I[e++] = 128 | g >>> 6 & 63, I[e++] = 128 | 63 & g) : (I[e++] = 240 | g >>> 18, I[e++] = 128 | g >>> 12 & 63, I[e++] = 128 | g >>> 6 & 63, I[e++] = 128 | 63 & g);
return I;
}, Uo.buf2binstring = function(t) {
return v_(t, t.length);
}, Uo.binstring2buf = function(t) {
for (var I = new ZV.Buf8(t.length), g = 0, C = I.length; g < C; g++) I[g] = t.charCodeAt(g);
return I;
}, Uo.buf2string = function(t, I) {
var g, C, i, e, A = I || t.length, s = new Array(2 * A);
for (C = 0, g = 0; g < A; ) if ((i = t[g++]) < 128) s[C++] = i;
else if ((e = sm[i]) > 4) s[C++] = 65533, g += e - 1;
else {
for (i &= e === 2 ? 31 : e === 3 ? 15 : 7; e > 1 && g < A; ) i = i << 6 | 63 & t[g++], e--;
e > 1 ? s[C++] = 65533 : i < 65536 ? s[C++] = i : (i -= 65536, s[C++] = 55296 | i >> 10 & 1023, s[C++] = 56320 | 1023 & i);
}
return v_(s, C);
}, Uo.utf8border = function(t, I) {
var g;
for ((I = I || t.length) > t.length && (I = t.length), g = I - 1; g >= 0 && (192 & t[g]) == 128; ) g--;
return g < 0 || g === 0 ? I : g + sm[t[g]] > I ? g : I;
};
var ntg = function() {
this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler = 0;
}, Ym = rs, lm = tn, ZD = Uo, GD = x9, g0g = ntg, atg = Object.prototype.toString;
function gc(t) {
if (!(this instanceof gc)) return new gc(t);
this.options = lm.assign({ level: -1, method: 8, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: 0, to: "" }, t || {});
var I = this.options;
I.raw && I.windowBits > 0 ? I.windowBits = -I.windowBits : I.gzip && I.windowBits > 0 && I.windowBits < 16 && (I.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new g0g(), this.strm.avail_out = 0;
var g = Ym.deflateInit2(this.strm, I.level, I.method, I.windowBits, I.memLevel, I.strategy);
if (g !== 0) throw new Error(GD[g]);
if (I.header && Ym.deflateSetHeader(this.strm, I.header), I.dictionary) {
var C;
if (C = typeof I.dictionary == "string" ? ZD.string2buf(I.dictionary) : atg.call(I.dictionary) === "[object ArrayBuffer]" ? new Uint8Array(I.dictionary) : I.dictionary, (g = Ym.deflateSetDictionary(this.strm, C)) !== 0) throw new Error(GD[g]);
this._dict_set = !0;
}
}
function yX(t, I) {
var g = new gc(I);
if (g.push(t, !0), g.err) throw g.msg || GD[g.err];
return g.result;
}
gc.prototype.push = function(t, I) {
var g, C, i = this.strm, e = this.options.chunkSize;
if (this.ended) return !1;
C = I === ~~I ? I : I === !0 ? 4 : 0, typeof t == "string" ? i.input = ZD.string2buf(t) : atg.call(t) === "[object ArrayBuffer]" ? i.input = new Uint8Array(t) : i.input = t, i.next_in = 0, i.avail_in = i.input.length;
do {
if (i.avail_out === 0 && (i.output = new lm.Buf8(e), i.next_out = 0, i.avail_out = e), (g = Ym.deflate(i, C)) !== 1 && g !== 0) return this.onEnd(g), this.ended = !0, !1;
i.avail_out !== 0 && (i.avail_in !== 0 || C !== 4 && C !== 2) || (this.options.to === "string" ? this.onData(ZD.buf2binstring(lm.shrinkBuf(i.output, i.next_out))) : this.onData(lm.shrinkBuf(i.output, i.next_out)));
} while ((i.avail_in > 0 || i.avail_out === 0) && g !== 1);
return C === 4 ? (g = Ym.deflateEnd(this.strm), this.onEnd(g), this.ended = !0, g === 0) : C !== 2 || (this.onEnd(0), i.avail_out = 0, !0);
}, gc.prototype.onData = function(t) {
this.chunks.push(t);
}, gc.prototype.onEnd = function(t) {
t === 0 && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = lm.flattenChunks(this.chunks)), this.chunks = [], this.err = t, this.msg = this.strm.msg;
}, em.Deflate = gc, em.deflate = yX, em.deflateRaw = function(t, I) {
return (I = I || {}).raw = !0, yX(t, I);
}, em.gzip = function(t, I) {
return (I = I || {}).gzip = !0, yX(t, I);
};
var nm = {}, bA = {}, T_ = tn, I0g = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], C0g = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], t0g = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], i0g = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64], Ne = tn, YX = Itg, as = Ctg, e0g = function(t, I) {
var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z;
g = t.state, C = t.next_in, S = t.input, i = C + (t.avail_in - 5), e = t.next_out, z = t.output, A = e - (I - t.avail_out), s = e + (t.avail_out - 257), l = g.dmax, n = g.wsize, a = g.whave, d = g.wnext, o = g.window, c = g.hold, r = g.bits, h = g.lencode, b = g.distcode, u = (1 << g.lenbits) - 1, m = (1 << g.distbits) - 1;
g: do {
r < 15 && (c += S[C++] << r, r += 8, c += S[C++] << r, r += 8), Z = h[c & u];
I: for (; ; ) {
if (c >>>= p = Z >>> 24, r -= p, (p = Z >>> 16 & 255) === 0) z[e++] = 65535 & Z;
else {
if (!(16 & p)) {
if ((64 & p) == 0) {
Z = h[(65535 & Z) + (c & (1 << p) - 1)];
continue I;
}
if (32 & p) {
g.mode = 12;
break g;
}
t.msg = "invalid literal/length code", g.mode = 30;
break g;
}
Y = 65535 & Z, (p &= 15) && (r < p && (c += S[C++] << r, r += 8), Y += c & (1 << p) - 1, c >>>= p, r -= p), r < 15 && (c += S[C++] << r, r += 8, c += S[C++] << r, r += 8), Z = b[c & m];
C: for (; ; ) {
if (c >>>= p = Z >>> 24, r -= p, !(16 & (p = Z >>> 16 & 255))) {
if ((64 & p) == 0) {
Z = b[(65535 & Z) + (c & (1 << p) - 1)];
continue C;
}
t.msg = "invalid distance code", g.mode = 30;
break g;
}
if (R = 65535 & Z, r < (p &= 15) && (c += S[C++] << r, (r += 8) < p && (c += S[C++] << r, r += 8)), (R += c & (1 << p) - 1) > l) {
t.msg = "invalid distance too far back", g.mode = 30;
break g;
}
if (c >>>= p, r -= p, R > (p = e - A)) {
if ((p = R - p) > a && g.sane) {
t.msg = "invalid distance too far back", g.mode = 30;
break g;
}
if (X = 0, H = o, d === 0) {
if (X += n - p, p < Y) {
Y -= p;
do
z[e++] = o[X++];
while (--p);
X = e - R, H = z;
}
} else if (d < p) {
if (X += n + d - p, (p -= d) < Y) {
Y -= p;
do
z[e++] = o[X++];
while (--p);
if (X = 0, d < Y) {
Y -= p = d;
do
z[e++] = o[X++];
while (--p);
X = e - R, H = z;
}
}
} else if (X += d - p, p < Y) {
Y -= p;
do
z[e++] = o[X++];
while (--p);
X = e - R, H = z;
}
for (; Y > 2; ) z[e++] = H[X++], z[e++] = H[X++], z[e++] = H[X++], Y -= 3;
Y && (z[e++] = H[X++], Y > 1 && (z[e++] = H[X++]));
} else {
X = e - R;
do
z[e++] = z[X++], z[e++] = z[X++], z[e++] = z[X++], Y -= 3;
while (Y > 2);
Y && (z[e++] = z[X++], Y > 1 && (z[e++] = z[X++]));
}
break;
}
}
break;
}
} while (C < i && e < s);
C -= Y = r >> 3, c &= (1 << (r -= Y << 3)) - 1, t.next_in = C, t.next_out = e, t.avail_in = C < i ? i - C + 5 : 5 - (C - i), t.avail_out = e < s ? s - e + 257 : 257 - (e - s), g.hold = c, g.bits = r;
}, Nm = function(t, I, g, C, i, e, A, s) {
var l, n, a, d, o, c, r, h, b, u = s.bits, m = 0, Z = 0, p = 0, Y = 0, R = 0, X = 0, H = 0, S = 0, z = 0, v = 0, K = null, V = 0, N = new T_.Buf16(16), B = new T_.Buf16(16), G = null, w = 0;
for (m = 0; m <= 15; m++) N[m] = 0;
for (Z = 0; Z < C; Z++) N[I[g + Z]]++;
for (R = u, Y = 15; Y >= 1 && N[Y] === 0; Y--) ;
if (R > Y && (R = Y), Y === 0) return i[e++] = 20971520, i[e++] = 20971520, s.bits = 1, 0;
for (p = 1; p < Y && N[p] === 0; p++) ;
for (R < p && (R = p), S = 1, m = 1; m <= 15; m++) if (S <<= 1, (S -= N[m]) < 0) return -1;
if (S > 0 && (t === 0 || Y !== 1)) return -1;
for (B[1] = 0, m = 1; m < 15; m++) B[m + 1] = B[m] + N[m];
for (Z = 0; Z < C; Z++) I[g + Z] !== 0 && (A[B[I[g + Z]]++] = Z);
if (t === 0 ? (K = G = A, c = 19) : t === 1 ? (K = I0g, V -= 257, G = C0g, w -= 257, c = 256) : (K = t0g, G = i0g, c = -1), v = 0, Z = 0, m = p, o = e, X = R, H = 0, a = -1, d = (z = 1 << R) - 1, t === 1 && z > 852 || t === 2 && z > 592) return 1;
for (; ; ) {
r = m - H, A[Z] < c ? (h = 0, b = A[Z]) : A[Z] > c ? (h = G[w + A[Z]], b = K[V + A[Z]]) : (h = 96, b = 0), l = 1 << m - H, p = n = 1 << X;
do
i[o + (v >> H) + (n -= l)] = r << 24 | h << 16 | b | 0;
while (n !== 0);
for (l = 1 << m - 1; v & l; ) l >>= 1;
if (l !== 0 ? (v &= l - 1, v += l) : v = 0, Z++, --N[m] == 0) {
if (m === Y) break;
m = I[g + A[Z]];
}
if (m > R && (v & d) !== a) {
for (H === 0 && (H = R), o += p, S = 1 << (X = m - H); X + H < Y && !((S -= N[X + H]) <= 0); ) X++, S <<= 1;
if (z += 1 << X, t === 1 && z > 852 || t === 2 && z > 592) return 1;
i[a = v & d] = R << 24 | X << 16 | o - e | 0;
}
}
return v !== 0 && (i[o + v] = m - H << 24 | 64 << 16 | 0), s.bits = R, 0;
};
function x_(t) {
return (t >>> 24 & 255) + (t >>> 8 & 65280) + ((65280 & t) << 8) + ((255 & t) << 24);
}
function A0g() {
this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new Ne.Buf16(320), this.work = new Ne.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;
}
function otg(t) {
var I;
return t && t.state ? (I = t.state, t.total_in = t.total_out = I.total = 0, t.msg = "", I.wrap && (t.adler = 1 & I.wrap), I.mode = 1, I.last = 0, I.havedict = 0, I.dmax = 32768, I.head = null, I.hold = 0, I.bits = 0, I.lencode = I.lendyn = new Ne.Buf32(852), I.distcode = I.distdyn = new Ne.Buf32(592), I.sane = 1, I.back = -1, 0) : -2;
}
function ctg(t) {
var I;
return t && t.state ? ((I = t.state).wsize = 0, I.whave = 0, I.wnext = 0, otg(t)) : -2;
}
function dtg(t, I) {
var g, C;
return t && t.state ? (C = t.state, I < 0 ? (g = 0, I = -I) : (g = 1 + (I >> 4), I < 48 && (I &= 15)), I && (I < 8 || I > 15) ? -2 : (C.window !== null && C.wbits !== I && (C.window = null), C.wrap = g, C.wbits = I, ctg(t))) : -2;
}
function j_(t, I) {
var g, C;
return t ? (C = new A0g(), t.state = C, C.window = null, (g = dtg(t, I)) !== 0 && (t.state = null), g) : -2;
}
var NX, VX, Q_ = !0;
function s0g(t) {
if (Q_) {
var I;
for (NX = new Ne.Buf32(512), VX = new Ne.Buf32(32), I = 0; I < 144; ) t.lens[I++] = 8;
for (; I < 256; ) t.lens[I++] = 9;
for (; I < 280; ) t.lens[I++] = 7;
for (; I < 288; ) t.lens[I++] = 8;
for (Nm(1, t.lens, 0, 288, NX, 0, t.work, { bits: 9 }), I = 0; I < 32; ) t.lens[I++] = 5;
Nm(2, t.lens, 0, 32, VX, 0, t.work, { bits: 5 }), Q_ = !1;
}
t.lencode = NX, t.lenbits = 9, t.distcode = VX, t.distbits = 5;
}
function O_(t, I, g, C) {
var i, e = t.state;
return e.window === null && (e.wsize = 1 << e.wbits, e.wnext = 0, e.whave = 0, e.window = new Ne.Buf8(e.wsize)), C >= e.wsize ? (Ne.arraySet(e.window, I, g - e.wsize, e.wsize, 0), e.wnext = 0, e.whave = e.wsize) : ((i = e.wsize - e.wnext) > C && (i = C), Ne.arraySet(e.window, I, g - C, i, e.wnext), (C -= i) ? (Ne.arraySet(e.window, I, g - C, C, 0), e.wnext = C, e.whave = e.wsize) : (e.wnext += i, e.wnext === e.wsize && (e.wnext = 0), e.whave < e.wsize && (e.whave += i))), 0;
}
bA.inflateReset = ctg, bA.inflateReset2 = dtg, bA.inflateResetKeep = otg, bA.inflateInit = function(t) {
return j_(t, 15);
}, bA.inflateInit2 = j_, bA.inflate = function(t, I) {
var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z = 0, v = new Ne.Buf8(4), K = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
if (!t || !t.state || !t.output || !t.input && t.avail_in !== 0) return -2;
(g = t.state).mode === 12 && (g.mode = 13), A = t.next_out, i = t.output, l = t.avail_out, e = t.next_in, C = t.input, s = t.avail_in, n = g.hold, a = g.bits, d = s, o = l, X = 0;
g: for (; ; ) switch (g.mode) {
case 1:
if (g.wrap === 0) {
g.mode = 13;
break;
}
for (; a < 16; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
if (2 & g.wrap && n === 35615) {
g.check = 0, v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0), n = 0, a = 0, g.mode = 2;
break;
}
if (g.flags = 0, g.head && (g.head.done = !1), !(1 & g.wrap) || (((255 & n) << 8) + (n >> 8)) % 31) {
t.msg = "incorrect header check", g.mode = 30;
break;
}
if ((15 & n) != 8) {
t.msg = "unknown compression method", g.mode = 30;
break;
}
if (a -= 4, R = 8 + (15 & (n >>>= 4)), g.wbits === 0) g.wbits = R;
else if (R > g.wbits) {
t.msg = "invalid window size", g.mode = 30;
break;
}
g.dmax = 1 << R, t.adler = g.check = 1, g.mode = 512 & n ? 10 : 12, n = 0, a = 0;
break;
case 2:
for (; a < 16; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
if (g.flags = n, (255 & g.flags) != 8) {
t.msg = "unknown compression method", g.mode = 30;
break;
}
if (57344 & g.flags) {
t.msg = "unknown header flags set", g.mode = 30;
break;
}
g.head && (g.head.text = n >> 8 & 1), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0)), n = 0, a = 0, g.mode = 3;
case 3:
for (; a < 32; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
g.head && (g.head.time = n), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, v[2] = n >>> 16 & 255, v[3] = n >>> 24 & 255, g.check = as(g.check, v, 4, 0)), n = 0, a = 0, g.mode = 4;
case 4:
for (; a < 16; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
g.head && (g.head.xflags = 255 & n, g.head.os = n >> 8), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0)), n = 0, a = 0, g.mode = 5;
case 5:
if (1024 & g.flags) {
for (; a < 16; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
g.length = n, g.head && (g.head.extra_len = n), 512 & g.flags && (v[0] = 255 & n, v[1] = n >>> 8 & 255, g.check = as(g.check, v, 2, 0)), n = 0, a = 0;
} else g.head && (g.head.extra = null);
g.mode = 6;
case 6:
if (1024 & g.flags && ((c = g.length) > s && (c = s), c && (g.head && (R = g.head.extra_len - g.length, g.head.extra || (g.head.extra = new Array(g.head.extra_len)), Ne.arraySet(g.head.extra, C, e, c, R)), 512 & g.flags && (g.check = as(g.check, C, c, e)), s -= c, e += c, g.length -= c), g.length)) break g;
g.length = 0, g.mode = 7;
case 7:
if (2048 & g.flags) {
if (s === 0) break g;
c = 0;
do
R = C[e + c++], g.head && R && g.length < 65536 && (g.head.name += String.fromCharCode(R));
while (R && c < s);
if (512 & g.flags && (g.check = as(g.check, C, c, e)), s -= c, e += c, R) break g;
} else g.head && (g.head.name = null);
g.length = 0, g.mode = 8;
case 8:
if (4096 & g.flags) {
if (s === 0) break g;
c = 0;
do
R = C[e + c++], g.head && R && g.length < 65536 && (g.head.comment += String.fromCharCode(R));
while (R && c < s);
if (512 & g.flags && (g.check = as(g.check, C, c, e)), s -= c, e += c, R) break g;
} else g.head && (g.head.comment = null);
g.mode = 9;
case 9:
if (512 & g.flags) {
for (; a < 16; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
if (n !== (65535 & g.check)) {
t.msg = "header crc mismatch", g.mode = 30;
break;
}
n = 0, a = 0;
}
g.head && (g.head.hcrc = g.flags >> 9 & 1, g.head.done = !0), t.adler = g.check = 0, g.mode = 12;
break;
case 10:
for (; a < 32; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
t.adler = g.check = x_(n), n = 0, a = 0, g.mode = 11;
case 11:
if (g.havedict === 0) return t.next_out = A, t.avail_out = l, t.next_in = e, t.avail_in = s, g.hold = n, g.bits = a, 2;
t.adler = g.check = 1, g.mode = 12;
case 12:
if (I === 5 || I === 6) break g;
case 13:
if (g.last) {
n >>>= 7 & a, a -= 7 & a, g.mode = 27;
break;
}
for (; a < 3; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
switch (g.last = 1 & n, a -= 1, 3 & (n >>>= 1)) {
case 0:
g.mode = 14;
break;
case 1:
if (s0g(g), g.mode = 20, I === 6) {
n >>>= 2, a -= 2;
break g;
}
break;
case 2:
g.mode = 17;
break;
case 3:
t.msg = "invalid block type", g.mode = 30;
}
n >>>= 2, a -= 2;
break;
case 14:
for (n >>>= 7 & a, a -= 7 & a; a < 32; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
if ((65535 & n) != (n >>> 16 ^ 65535)) {
t.msg = "invalid stored block lengths", g.mode = 30;
break;
}
if (g.length = 65535 & n, n = 0, a = 0, g.mode = 15, I === 6) break g;
case 15:
g.mode = 16;
case 16:
if (c = g.length) {
if (c > s && (c = s), c > l && (c = l), c === 0) break g;
Ne.arraySet(i, C, e, c, A), s -= c, e += c, l -= c, A += c, g.length -= c;
break;
}
g.mode = 12;
break;
case 17:
for (; a < 14; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
if (g.nlen = 257 + (31 & n), n >>>= 5, a -= 5, g.ndist = 1 + (31 & n), n >>>= 5, a -= 5, g.ncode = 4 + (15 & n), n >>>= 4, a -= 4, g.nlen > 286 || g.ndist > 30) {
t.msg = "too many length or distance symbols", g.mode = 30;
break;
}
g.have = 0, g.mode = 18;
case 18:
for (; g.have < g.ncode; ) {
for (; a < 3; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
g.lens[K[g.have++]] = 7 & n, n >>>= 3, a -= 3;
}
for (; g.have < 19; ) g.lens[K[g.have++]] = 0;
if (g.lencode = g.lendyn, g.lenbits = 7, H = { bits: g.lenbits }, X = Nm(0, g.lens, 0, 19, g.lencode, 0, g.work, H), g.lenbits = H.bits, X) {
t.msg = "invalid code lengths set", g.mode = 30;
break;
}
g.have = 0, g.mode = 19;
case 19:
for (; g.have < g.nlen + g.ndist; ) {
for (; u = (z = g.lencode[n & (1 << g.lenbits) - 1]) >>> 16 & 255, m = 65535 & z, !((b = z >>> 24) <= a); ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
if (m < 16) n >>>= b, a -= b, g.lens[g.have++] = m;
else {
if (m === 16) {
for (S = b + 2; a < S; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
if (n >>>= b, a -= b, g.have === 0) {
t.msg = "invalid bit length repeat", g.mode = 30;
break;
}
R = g.lens[g.have - 1], c = 3 + (3 & n), n >>>= 2, a -= 2;
} else if (m === 17) {
for (S = b + 3; a < S; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
a -= b, R = 0, c = 3 + (7 & (n >>>= b)), n >>>= 3, a -= 3;
} else {
for (S = b + 7; a < S; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
a -= b, R = 0, c = 11 + (127 & (n >>>= b)), n >>>= 7, a -= 7;
}
if (g.have + c > g.nlen + g.ndist) {
t.msg = "invalid bit length repeat", g.mode = 30;
break;
}
for (; c--; ) g.lens[g.have++] = R;
}
}
if (g.mode === 30) break;
if (g.lens[256] === 0) {
t.msg = "invalid code -- missing end-of-block", g.mode = 30;
break;
}
if (g.lenbits = 9, H = { bits: g.lenbits }, X = Nm(1, g.lens, 0, g.nlen, g.lencode, 0, g.work, H), g.lenbits = H.bits, X) {
t.msg = "invalid literal/lengths set", g.mode = 30;
break;
}
if (g.distbits = 6, g.distcode = g.distdyn, H = { bits: g.distbits }, X = Nm(2, g.lens, g.nlen, g.ndist, g.distcode, 0, g.work, H), g.distbits = H.bits, X) {
t.msg = "invalid distances set", g.mode = 30;
break;
}
if (g.mode = 20, I === 6) break g;
case 20:
g.mode = 21;
case 21:
if (s >= 6 && l >= 258) {
t.next_out = A, t.avail_out = l, t.next_in = e, t.avail_in = s, g.hold = n, g.bits = a, e0g(t, o), A = t.next_out, i = t.output, l = t.avail_out, e = t.next_in, C = t.input, s = t.avail_in, n = g.hold, a = g.bits, g.mode === 12 && (g.back = -1);
break;
}
for (g.back = 0; u = (z = g.lencode[n & (1 << g.lenbits) - 1]) >>> 16 & 255, m = 65535 & z, !((b = z >>> 24) <= a); ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
if (u && (240 & u) == 0) {
for (Z = b, p = u, Y = m; u = (z = g.lencode[Y + ((n & (1 << Z + p) - 1) >> Z)]) >>> 16 & 255, m = 65535 & z, !(Z + (b = z >>> 24) <= a); ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
n >>>= Z, a -= Z, g.back += Z;
}
if (n >>>= b, a -= b, g.back += b, g.length = m, u === 0) {
g.mode = 26;
break;
}
if (32 & u) {
g.back = -1, g.mode = 12;
break;
}
if (64 & u) {
t.msg = "invalid literal/length code", g.mode = 30;
break;
}
g.extra = 15 & u, g.mode = 22;
case 22:
if (g.extra) {
for (S = g.extra; a < S; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
g.length += n & (1 << g.extra) - 1, n >>>= g.extra, a -= g.extra, g.back += g.extra;
}
g.was = g.length, g.mode = 23;
case 23:
for (; u = (z = g.distcode[n & (1 << g.distbits) - 1]) >>> 16 & 255, m = 65535 & z, !((b = z >>> 24) <= a); ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
if ((240 & u) == 0) {
for (Z = b, p = u, Y = m; u = (z = g.distcode[Y + ((n & (1 << Z + p) - 1) >> Z)]) >>> 16 & 255, m = 65535 & z, !(Z + (b = z >>> 24) <= a); ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
n >>>= Z, a -= Z, g.back += Z;
}
if (n >>>= b, a -= b, g.back += b, 64 & u) {
t.msg = "invalid distance code", g.mode = 30;
break;
}
g.offset = m, g.extra = 15 & u, g.mode = 24;
case 24:
if (g.extra) {
for (S = g.extra; a < S; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
g.offset += n & (1 << g.extra) - 1, n >>>= g.extra, a -= g.extra, g.back += g.extra;
}
if (g.offset > g.dmax) {
t.msg = "invalid distance too far back", g.mode = 30;
break;
}
g.mode = 25;
case 25:
if (l === 0) break g;
if (c = o - l, g.offset > c) {
if ((c = g.offset - c) > g.whave && g.sane) {
t.msg = "invalid distance too far back", g.mode = 30;
break;
}
c > g.wnext ? (c -= g.wnext, r = g.wsize - c) : r = g.wnext - c, c > g.length && (c = g.length), h = g.window;
} else h = i, r = A - g.offset, c = g.length;
c > l && (c = l), l -= c, g.length -= c;
do
i[A++] = h[r++];
while (--c);
g.length === 0 && (g.mode = 21);
break;
case 26:
if (l === 0) break g;
i[A++] = g.length, l--, g.mode = 21;
break;
case 27:
if (g.wrap) {
for (; a < 32; ) {
if (s === 0) break g;
s--, n |= C[e++] << a, a += 8;
}
if (o -= l, t.total_out += o, g.total += o, o && (t.adler = g.check = g.flags ? as(g.check, i, o, A - o) : YX(g.check, i, o, A - o)), o = l, (g.flags ? n : x_(n)) !== g.check) {
t.msg = "incorrect data check", g.mode = 30;
break;
}
n = 0, a = 0;
}
g.mode = 28;
case 28:
if (g.wrap && g.flags) {
for (; a < 32; ) {
if (s === 0) break g;
s--, n += C[e++] << a, a += 8;
}
if (n !== (4294967295 & g.total)) {
t.msg = "incorrect length check", g.mode = 30;
break;
}
n = 0, a = 0;
}
g.mode = 29;
case 29:
X = 1;
break g;
case 30:
X = -3;
break g;
case 31:
return -4;
default:
return -2;
}
return t.next_out = A, t.avail_out = l, t.next_in = e, t.avail_in = s, g.hold = n, g.bits = a, (g.wsize || o !== t.avail_out && g.mode < 30 && (g.mode < 27 || I !== 4)) && O_(t, t.output, t.next_out, o - t.avail_out), d -= t.avail_in, o -= t.avail_out, t.total_in += d, t.total_out += o, g.total += o, g.wrap && o && (t.adler = g.check = g.flags ? as(g.check, i, o, t.next_out - o) : YX(g.check, i, o, t.next_out - o)), t.data_type = g.bits + (g.last ? 64 : 0) + (g.mode === 12 ? 128 : 0) + (g.mode === 20 || g.mode === 15 ? 256 : 0), (d === 0 && o === 0 || I === 4) && X === 0 && (X = -5), X;
}, bA.inflateEnd = function(t) {
if (!t || !t.state) return -2;
var I = t.state;
return I.window && (I.window = null), t.state = null, 0;
}, bA.inflateGetHeader = function(t, I) {
var g;
return t && t.state ? (2 & (g = t.state).wrap) == 0 ? -2 : (g.head = I, I.done = !1, 0) : -2;
}, bA.inflateSetDictionary = function(t, I) {
var g, C = I.length;
return t && t.state ? (g = t.state).wrap !== 0 && g.mode !== 11 ? -2 : g.mode === 11 && YX(1, I, C, 0) !== g.check ? -3 : O_(t, I, C, C) ? (g.mode = 31, -4) : (g.havedict = 1, 0) : -2;
}, bA.inflateInfo = "pako inflate (from Nodeca project)";
var rtg = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 }, bh = bA, am = tn, UN = Uo, tt = rtg, wD = x9, l0g = ntg, n0g = function() {
this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = "", this.comment = "", this.hcrc = 0, this.done = !1;
}, htg = Object.prototype.toString;
function Ic(t) {
if (!(this instanceof Ic)) return new Ic(t);
this.options = am.assign({ chunkSize: 16384, windowBits: 0, to: "" }, t || {});
var I = this.options;
I.raw && I.windowBits >= 0 && I.windowBits < 16 && (I.windowBits = -I.windowBits, I.windowBits === 0 && (I.windowBits = -15)), !(I.windowBits >= 0 && I.windowBits < 16) || t && t.windowBits || (I.windowBits += 32), I.windowBits > 15 && I.windowBits < 48 && (15 & I.windowBits) == 0 && (I.windowBits |= 15), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new l0g(), this.strm.avail_out = 0;
var g = bh.inflateInit2(this.strm, I.windowBits);
if (g !== tt.Z_OK) throw new Error(wD[g]);
if (this.header = new n0g(), bh.inflateGetHeader(this.strm, this.header), I.dictionary && (typeof I.dictionary == "string" ? I.dictionary = UN.string2buf(I.dictionary) : htg.call(I.dictionary) === "[object ArrayBuffer]" && (I.dictionary = new Uint8Array(I.dictionary)), I.raw && (g = bh.inflateSetDictionary(this.strm, I.dictionary)) !== tt.Z_OK)) throw new Error(wD[g]);
}
function MX(t, I) {
var g = new Ic(I);
if (g.push(t, !0), g.err) throw g.msg || wD[g.err];
return g.result;
}
Ic.prototype.push = function(t, I) {
var g, C, i, e, A, s = this.strm, l = this.options.chunkSize, n = this.options.dictionary, a = !1;
if (this.ended) return !1;
C = I === ~~I ? I : I === !0 ? tt.Z_FINISH : tt.Z_NO_FLUSH, typeof t == "string" ? s.input = UN.binstring2buf(t) : htg.call(t) === "[object ArrayBuffer]" ? s.input = new Uint8Array(t) : s.input = t, s.next_in = 0, s.avail_in = s.input.length;
do {
if (s.avail_out === 0 && (s.output = new am.Buf8(l), s.next_out = 0, s.avail_out = l), (g = bh.inflate(s, tt.Z_NO_FLUSH)) === tt.Z_NEED_DICT && n && (g = bh.inflateSetDictionary(this.strm, n)), g === tt.Z_BUF_ERROR && a === !0 && (g = tt.Z_OK, a = !1), g !== tt.Z_STREAM_END && g !== tt.Z_OK) return this.onEnd(g), this.ended = !0, !1;
s.next_out && (s.avail_out !== 0 && g !== tt.Z_STREAM_END && (s.avail_in !== 0 || C !== tt.Z_FINISH && C !== tt.Z_SYNC_FLUSH) || (this.options.to === "string" ? (i = UN.utf8border(s.output, s.next_out), e = s.next_out - i, A = UN.buf2string(s.output, i), s.next_out = e, s.avail_out = l - e, e && am.arraySet(s.output, s.output, i, e, 0), this.onData(A)) : this.onData(am.shrinkBuf(s.output, s.next_out)))), s.avail_in === 0 && s.avail_out === 0 && (a = !0);
} while ((s.avail_in > 0 || s.avail_out === 0) && g !== tt.Z_STREAM_END);
return g === tt.Z_STREAM_END && (C = tt.Z_FINISH), C === tt.Z_FINISH ? (g = bh.inflateEnd(this.strm), this.onEnd(g), this.ended = !0, g === tt.Z_OK) : C !== tt.Z_SYNC_FLUSH || (this.onEnd(tt.Z_OK), s.avail_out = 0, !0);
}, Ic.prototype.onData = function(t) {
this.chunks.push(t);
}, Ic.prototype.onEnd = function(t) {
t === tt.Z_OK && (this.options.to === "string" ? this.result = this.chunks.join("") : this.result = am.flattenChunks(this.chunks)), this.chunks = [], this.err = t, this.msg = this.strm.msg;
}, nm.Inflate = Ic, nm.inflate = MX, nm.inflateRaw = function(t, I) {
return (I = I || {}).raw = !0, MX(t, I);
}, nm.ungzip = MX;
var btg = {};
(0, tn.assign)(btg, em, nm, rtg);
var a0g = typeof Uint8Array < "u" && typeof Uint16Array < "u" && typeof Uint32Array < "u", o0g = btg, U_ = gt(), EN = eA, c0g = a0g ? "uint8array" : "array";
function vo(t, I) {
EN.call(this, "FlateWorker/" + t), this._pako = null, this._pakoAction = t, this._pakoOptions = I, this.meta = {};
}
QN.magic = "\b\0", U_.inherits(vo, EN), vo.prototype.processChunk = function(t) {
this.meta = t.meta, this._pako === null && this._createPako(), this._pako.push(U_.transformTo(c0g, t.data), !1);
}, vo.prototype.flush = function() {
EN.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);
}, vo.prototype.cleanUp = function() {
EN.prototype.cleanUp.call(this), this._pako = null;
}, vo.prototype._createPako = function() {
this._pako = new o0g[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });
var t = this;
this._pako.onData = function(I) {
t.push({ data: I, meta: t.meta });
};
}, QN.compressWorker = function(t) {
return new vo("Deflate", t);
}, QN.uncompressWorker = function() {
return new vo("Inflate", {});
};
var E_ = eA;
uV.STORE = { magic: "\0\0", compressWorker: function() {
return new E_("STORE compression");
}, uncompressWorker: function() {
return new E_("STORE decompression");
} }, uV.DEFLATE = QN;
var utg = { LOCAL_FILE_HEADER: "PK", CENTRAL_FILE_HEADER: "PK", CENTRAL_DIRECTORY_END: "PK", ZIP64_CENTRAL_DIRECTORY_LOCATOR: "PK\x07", ZIP64_CENTRAL_DIRECTORY_END: "PK", DATA_DESCRIPTOR: "PK\x07\b" }, sh = gt(), Ch = eA, RX = M0, P_ = J9, GV = utg, VC = function(t, I) {
var g, C = "";
for (g = 0; g < I; g++) C += String.fromCharCode(255 & t), t >>>= 8;
return C;
}, __ = function(t, I, g, C, i, e) {
var A, s, l = t.file, n = t.compression, a = e !== RX.utf8encode, d = sh.transformTo("string", e(l.name)), o = sh.transformTo("string", RX.utf8encode(l.name)), c = l.comment, r = sh.transformTo("string", e(c)), h = sh.transformTo("string", RX.utf8encode(c)), b = o.length !== l.name.length, u = h.length !== c.length, m = "", Z = "", p = "", Y = l.dir, R = l.date, X = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };
I && !g || (X.crc32 = t.crc32, X.compressedSize = t.compressedSize, X.uncompressedSize = t.uncompressedSize);
var H = 0;
I && (H |= 8), a || !b && !u || (H |= 2048);
var S, z, v, K = 0, V = 0;
Y && (K |= 16), i === "UNIX" ? (V = 798, K |= (S = l.unixPermissions, z = Y, v = S, S || (v = z ? 16893 : 33204), (65535 & v) << 16)) : (V = 20, K |= 63 & (l.dosPermissions || 0)), A = R.getUTCHours(), A <<= 6, A |= R.getUTCMinutes(), A <<= 5, A |= R.getUTCSeconds() / 2, s = R.getUTCFullYear() - 1980, s <<= 4, s |= R.getUTCMonth() + 1, s <<= 5, s |= R.getUTCDate(), b && (Z = VC(1, 1) + VC(P_(d), 4) + o, m += "up" + VC(Z.length, 2) + Z), u && (p = VC(1, 1) + VC(P_(r), 4) + h, m += "uc" + VC(p.length, 2) + p);
var N = "";
return N += `
\0`, N += VC(H, 2), N += n.magic, N += VC(A, 2), N += VC(s, 2), N += VC(X.crc32, 4), N += VC(X.compressedSize, 4), N += VC(X.uncompressedSize, 4), N += VC(d.length, 2), N += VC(m.length, 2), { fileRecord: GV.LOCAL_FILE_HEADER + N + d + m, dirRecord: GV.CENTRAL_FILE_HEADER + VC(V, 2) + N + VC(r.length, 2) + "\0\0\0\0" + VC(K, 4) + VC(C, 4) + d + m + r };
}, d0g = function(t) {
return GV.DATA_DESCRIPTOR + VC(t.crc32, 4) + VC(t.compressedSize, 4) + VC(t.uncompressedSize, 4);
};
function uA(t, I, g, C) {
Ch.call(this, "ZipFileWorker"), this.bytesWritten = 0, this.zipComment = I, this.zipPlatform = g, this.encodeFileName = C, this.streamFiles = t, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];
}
sh.inherits(uA, Ch), uA.prototype.push = function(t) {
var I = t.meta.percent || 0, g = this.entriesCount, C = this._sources.length;
this.accumulate ? this.contentBuffer.push(t) : (this.bytesWritten += t.data.length, Ch.prototype.push.call(this, { data: t.data, meta: { currentFile: this.currentFile, percent: g ? (I + 100 * (g - C - 1)) / g : 100 } }));
}, uA.prototype.openedSource = function(t) {
this.currentSourceOffset = this.bytesWritten, this.currentFile = t.file.name;
var I = this.streamFiles && !t.file.dir;
if (I) {
var g = __(t, I, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
this.push({ data: g.fileRecord, meta: { percent: 0 } });
} else this.accumulate = !0;
}, uA.prototype.closedSource = function(t) {
this.accumulate = !1;
var I = this.streamFiles && !t.file.dir, g = __(t, I, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);
if (this.dirRecords.push(g.dirRecord), I) this.push({ data: d0g(t), meta: { percent: 100 } });
else for (this.push({ data: g.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());
this.currentFile = null;
}, uA.prototype.flush = function() {
for (var t = this.bytesWritten, I = 0; I < this.dirRecords.length; I++) this.push({ data: this.dirRecords[I], meta: { percent: 100 } });
var g = this.bytesWritten - t, C = function(i, e, A, s, l) {
var n = sh.transformTo("string", l(s));
return GV.CENTRAL_DIRECTORY_END + "\0\0\0\0" + VC(i, 2) + VC(i, 2) + VC(e, 4) + VC(A, 4) + VC(n.length, 2) + n;
}(this.dirRecords.length, g, t, this.zipComment, this.encodeFileName);
this.push({ data: C, meta: { percent: 100 } });
}, uA.prototype.prepareNextSource = function() {
this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();
}, uA.prototype.registerPrevious = function(t) {
this._sources.push(t);
var I = this;
return t.on("data", function(g) {
I.processChunk(g);
}), t.on("end", function() {
I.closedSource(I.previous.streamInfo), I._sources.length ? I.prepareNextSource() : I.end();
}), t.on("error", function(g) {
I.error(g);
}), this;
}, uA.prototype.resume = function() {
return !!Ch.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));
}, uA.prototype.error = function(t) {
var I = this._sources;
if (!Ch.prototype.error.call(this, t)) return !1;
for (var g = 0; g < I.length; g++) try {
I[g].error(t);
} catch {
}
return !0;
}, uA.prototype.lock = function() {
Ch.prototype.lock.call(this);
for (var t = this._sources, I = 0; I < t.length; I++) t[I].lock();
};
var r0g = uV, h0g = uA;
PCg.generateWorker = function(t, I, g) {
var C = new h0g(I.streamFiles, g, I.platform, I.encodeFileName), i = 0;
try {
t.forEach(function(e, A) {
i++;
var s = function(d, o) {
var c = d || o, r = r0g[c];
if (!r) throw new Error(c + " is not a valid compression method !");
return r;
}(A.options.compression, I.compression), l = A.options.compressionOptions || I.compressionOptions || {}, n = A.dir, a = A.date;
A._compressWorker(s, l).withStreamInfo("file", { name: e, dir: n, date: a, comment: A.comment || "", unixPermissions: A.unixPermissions, dosPermissions: A.dosPermissions }).pipe(C);
}), C.entriesCount = i;
} catch (e) {
C.error(e);
}
return C;
};
var b0g = gt(), PN = eA;
function om(t, I) {
PN.call(this, "Nodejs stream input adapter for " + t), this._upstreamEnded = !1, this._bindStream(I);
}
b0g.inherits(om, PN), om.prototype._bindStream = function(t) {
var I = this;
this._stream = t, t.pause(), t.on("data", function(g) {
I.push({ data: g, meta: { percent: 0 } });
}).on("error", function(g) {
I.isPaused ? this.generatedError = g : I.error(g);
}).on("end", function() {
I.isPaused ? I._upstreamEnded = !0 : I.end();
});
}, om.prototype.pause = function() {
return !!PN.prototype.pause.call(this) && (this._stream.pause(), !0);
}, om.prototype.resume = function() {
return !!PN.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);
};
var u0g = om, m0g = M0, Vm = gt(), mtg = eA, Z0g = jCg, Ztg = QCg, q_ = L9, G0g = Uhg, w0g = PCg, $_ = cM, p0g = u0g, Gtg = function(t, I, g) {
var C, i = Vm.getTypeOf(I), e = Vm.extend(g || {}, Ztg);
e.date = e.date || /* @__PURE__ */ new Date(), e.compression !== null && (e.compression = e.compression.toUpperCase()), typeof e.unixPermissions == "string" && (e.unixPermissions = parseInt(e.unixPermissions, 8)), e.unixPermissions && 16384 & e.unixPermissions && (e.dir = !0), e.dosPermissions && 16 & e.dosPermissions && (e.dir = !0), e.dir && (t = wtg(t)), e.createFolders && (C = B0g(t)) && ptg.call(this, C, !0);
var A = i === "string" && e.binary === !1 && e.base64 === !1;
g && g.binary !== void 0 || (e.binary = !A), (I instanceof q_ && I.uncompressedSize === 0 || e.dir || !I || I.length === 0) && (e.base64 = !1, e.binary = !0, I = "", e.compression = "STORE", i = "string");
var s = null;
s = I instanceof q_ || I instanceof mtg ? I : $_.isNode && $_.isStream(I) ? new p0g(t, I) : Vm.prepareContent(t, I, e.binary, e.optimizedBinaryString, e.base64);
var l = new G0g(t, s, e);
this.files[t] = l;
}, B0g = function(t) {
t.slice(-1) === "/" && (t = t.substring(0, t.length - 1));
var I = t.lastIndexOf("/");
return I > 0 ? t.substring(0, I) : "";
}, wtg = function(t) {
return t.slice(-1) !== "/" && (t += "/"), t;
}, ptg = function(t, I) {
return I = I !== void 0 ? I : Ztg.createFolders, t = wtg(t), this.files[t] || Gtg.call(this, t, null, { dir: !0, createFolders: I }), this.files[t];
};
function gq(t) {
return Object.prototype.toString.call(t) === "[object RegExp]";
}
var W0g = { load: function() {
throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
}, forEach: function(t) {
var I, g, C;
for (I in this.files) C = this.files[I], (g = I.slice(this.root.length, I.length)) && I.slice(0, this.root.length) === this.root && t(g, C);
}, filter: function(t) {
var I = [];
return this.forEach(function(g, C) {
t(g, C) && I.push(C);
}), I;
}, file: function(t, I, g) {
if (arguments.length === 1) {
if (gq(t)) {
var C = t;
return this.filter(function(e, A) {
return !A.dir && C.test(e);
});
}
var i = this.files[this.root + t];
return i && !i.dir ? i : null;
}
return t = this.root + t, Gtg.call(this, t, I, g), this;
}, folder: function(t) {
if (!t) return this;
if (gq(t)) return this.filter(function(i, e) {
return e.dir && t.test(i);
});
var I = this.root + t, g = ptg.call(this, I), C = this.clone();
return C.root = g.name, C;
}, remove: function(t) {
t = this.root + t;
var I = this.files[t];
if (I || (t.slice(-1) !== "/" && (t += "/"), I = this.files[t]), I && !I.dir) delete this.files[t];
else for (var g = this.filter(function(i, e) {
return e.name.slice(0, t.length) === t;
}), C = 0; C < g.length; C++) delete this.files[g[C].name];
return this;
}, generate: function() {
throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
}, generateInternalStream: function(t) {
var I, g = {};
try {
if ((g = Vm.extend(t || {}, { streamFiles: !1, compression: "STORE", compressionOptions: null, type: "", platform: "DOS", comment: null, mimeType: "application/zip", encodeFileName: m0g.utf8encode })).type = g.type.toLowerCase(), g.compression = g.compression.toUpperCase(), g.type === "binarystring" && (g.type = "string"), !g.type) throw new Error("No output type specified.");
Vm.checkSupport(g.type), g.platform !== "darwin" && g.platform !== "freebsd" && g.platform !== "linux" && g.platform !== "sunos" || (g.platform = "UNIX"), g.platform === "win32" && (g.platform = "DOS");
var C = g.comment || this.comment || "";
I = w0g.generateWorker(this, g, C);
} catch (i) {
(I = new mtg("error")).error(i);
}
return new Z0g(I, g.type || "string", g.mimeType);
}, generateAsync: function(t, I) {
return this.generateInternalStream(t).accumulate(I);
}, generateNodeStream: function(t, I) {
return (t = t || {}).type || (t.type = "nodebuffer"), this.generateInternalStream(t).toNodejsStream(I);
} }, y0g = W0g, Y0g = gt();
function Btg(t) {
this.data = t, this.length = t.length, this.index = 0, this.zero = 0;
}
Btg.prototype = { checkOffset: function(t) {
this.checkIndex(this.index + t);
}, checkIndex: function(t) {
if (this.length < this.zero + t || t < 0) throw new Error("End of data reached (data length = " + this.length + ", asked index = " + t + "). Corrupted zip ?");
}, setIndex: function(t) {
this.checkIndex(t), this.index = t;
}, skip: function(t) {
this.setIndex(this.index + t);
}, byteAt: function() {
}, readInt: function(t) {
var I, g = 0;
for (this.checkOffset(t), I = this.index + t - 1; I >= this.index; I--) g = (g << 8) + this.byteAt(I);
return this.index += t, g;
}, readString: function(t) {
return Y0g.transformTo("string", this.readData(t));
}, readData: function() {
}, lastIndexOfSignature: function() {
}, readAndCheckSignature: function() {
}, readDate: function() {
var t = this.readInt(4);
return new Date(Date.UTC(1980 + (t >> 25 & 127), (t >> 21 & 15) - 1, t >> 16 & 31, t >> 11 & 31, t >> 5 & 63, (31 & t) << 1));
} };
var Wtg = Btg, ytg = Wtg;
function th(t) {
ytg.call(this, t);
for (var I = 0; I < this.data.length; I++) t[I] = 255 & t[I];
}
gt().inherits(th, ytg), th.prototype.byteAt = function(t) {
return this.data[this.zero + t];
}, th.prototype.lastIndexOfSignature = function(t) {
for (var I = t.charCodeAt(0), g = t.charCodeAt(1), C = t.charCodeAt(2), i = t.charCodeAt(3), e = this.length - 4; e >= 0; --e) if (this.data[e] === I && this.data[e + 1] === g && this.data[e + 2] === C && this.data[e + 3] === i) return e - this.zero;
return -1;
}, th.prototype.readAndCheckSignature = function(t) {
var I = t.charCodeAt(0), g = t.charCodeAt(1), C = t.charCodeAt(2), i = t.charCodeAt(3), e = this.readData(4);
return I === e[0] && g === e[1] && C === e[2] && i === e[3];
}, th.prototype.readData = function(t) {
if (this.checkOffset(t), t === 0) return [];
var I = this.data.slice(this.zero + this.index, this.zero + this.index + t);
return this.index += t, I;
};
var Ytg = th, Ntg = Wtg;
function ih(t) {
Ntg.call(this, t);
}
gt().inherits(ih, Ntg), ih.prototype.byteAt = function(t) {
return this.data.charCodeAt(this.zero + t);
}, ih.prototype.lastIndexOfSignature = function(t) {
return this.data.lastIndexOf(t) - this.zero;
}, ih.prototype.readAndCheckSignature = function(t) {
return t === this.readData(4);
}, ih.prototype.readData = function(t) {
this.checkOffset(t);
var I = this.data.slice(this.zero + this.index, this.zero + this.index + t);
return this.index += t, I;
};
var N0g = ih, Vtg = Ytg;
function pD(t) {
Vtg.call(this, t);
}
gt().inherits(pD, Vtg), pD.prototype.readData = function(t) {
if (this.checkOffset(t), t === 0) return new Uint8Array(0);
var I = this.data.subarray(this.zero + this.index, this.zero + this.index + t);
return this.index += t, I;
};
var Mtg = pD, Rtg = Mtg;
function BD(t) {
Rtg.call(this, t);
}
gt().inherits(BD, Rtg), BD.prototype.readData = function(t) {
this.checkOffset(t);
var I = this.data.slice(this.zero + this.index, this.zero + this.index + t);
return this.index += t, I;
};
var V0g = BD, _Y = gt(), Iq = rt, M0g = Ytg, R0g = N0g, f0g = V0g, H0g = Mtg, ftg = function(t) {
var I = _Y.getTypeOf(t);
return _Y.checkSupport(I), I !== "string" || Iq.uint8array ? I === "nodebuffer" ? new f0g(t) : Iq.uint8array ? new H0g(_Y.transformTo("uint8array", t)) : new M0g(_Y.transformTo("array", t)) : new R0g(t);
}, fX = ftg, Pn = gt(), X0g = L9, Cq = J9, qY = M0, $Y = uV, S0g = rt;
function Htg(t, I) {
this.options = t, this.loadOptions = I;
}
Htg.prototype = { isEncrypted: function() {
return (1 & this.bitFlag) == 1;
}, useUTF8: function() {
return (2048 & this.bitFlag) == 2048;
}, readLocalPart: function(t) {
var I, g;
if (t.skip(22), this.fileNameLength = t.readInt(2), g = t.readInt(2), this.fileName = t.readData(this.fileNameLength), t.skip(g), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");
if (I = function(C) {
for (var i in $Y) if (Object.prototype.hasOwnProperty.call($Y, i) && $Y[i].magic === C) return $Y[i];
return null;
}(this.compressionMethod), I === null) throw new Error("Corrupted zip : compression " + Pn.pretty(this.compressionMethod) + " unknown (inner file : " + Pn.transformTo("string", this.fileName) + ")");
this.decompressed = new X0g(this.compressedSize, this.uncompressedSize, this.crc32, I, t.readData(this.compressedSize));
}, readCentralPart: function(t) {
this.versionMadeBy = t.readInt(2), t.skip(2), this.bitFlag = t.readInt(2), this.compressionMethod = t.readString(2), this.date = t.readDate(), this.crc32 = t.readInt(4), this.compressedSize = t.readInt(4), this.uncompressedSize = t.readInt(4);
var I = t.readInt(2);
if (this.extraFieldsLength = t.readInt(2), this.fileCommentLength = t.readInt(2), this.diskNumberStart = t.readInt(2), this.internalFileAttributes = t.readInt(2), this.externalFileAttributes = t.readInt(4), this.localHeaderOffset = t.readInt(4), this.isEncrypted()) throw new Error("Encrypted zip are not supported");
t.skip(I), this.readExtraFields(t), this.parseZIP64ExtraField(t), this.fileComment = t.readData(this.fileCommentLength);
}, processAttributes: function() {
this.unixPermissions = null, this.dosPermissions = null;
var t = this.versionMadeBy >> 8;
this.dir = !!(16 & this.externalFileAttributes), t === 0 && (this.dosPermissions = 63 & this.externalFileAttributes), t === 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== "/" || (this.dir = !0);
}, parseZIP64ExtraField: function() {
if (this.extraFields[1]) {
var t = fX(this.extraFields[1].value);
this.uncompressedSize === Pn.MAX_VALUE_32BITS && (this.uncompressedSize = t.readInt(8)), this.compressedSize === Pn.MAX_VALUE_32BITS && (this.compressedSize = t.readInt(8)), this.localHeaderOffset === Pn.MAX_VALUE_32BITS && (this.localHeaderOffset = t.readInt(8)), this.diskNumberStart === Pn.MAX_VALUE_32BITS && (this.diskNumberStart = t.readInt(4));
}
}, readExtraFields: function(t) {
var I, g, C, i = t.index + this.extraFieldsLength;
for (this.extraFields || (this.extraFields = {}); t.index + 4 < i; ) I = t.readInt(2), g = t.readInt(2), C = t.readData(g), this.extraFields[I] = { id: I, length: g, value: C };
t.setIndex(i);
}, handleUTF8: function() {
var t = S0g.uint8array ? "uint8array" : "array";
if (this.useUTF8()) this.fileNameStr = qY.utf8decode(this.fileName), this.fileCommentStr = qY.utf8decode(this.fileComment);
else {
var I = this.findExtraFieldUnicodePath();
if (I !== null) this.fileNameStr = I;
else {
var g = Pn.transformTo(t, this.fileName);
this.fileNameStr = this.loadOptions.decodeFileName(g);
}
var C = this.findExtraFieldUnicodeComment();
if (C !== null) this.fileCommentStr = C;
else {
var i = Pn.transformTo(t, this.fileComment);
this.fileCommentStr = this.loadOptions.decodeFileName(i);
}
}
}, findExtraFieldUnicodePath: function() {
var t = this.extraFields[28789];
if (t) {
var I = fX(t.value);
return I.readInt(1) !== 1 || Cq(this.fileName) !== I.readInt(4) ? null : qY.utf8decode(I.readData(t.length - 5));
}
return null;
}, findExtraFieldUnicodeComment: function() {
var t = this.extraFields[25461];
if (t) {
var I = fX(t.value);
return I.readInt(1) !== 1 || Cq(this.fileComment) !== I.readInt(4) ? null : qY.utf8decode(I.readData(t.length - 5));
}
return null;
} };
var D0g = Htg, K0g = ftg, al = gt(), rA = utg, F0g = D0g, k0g = rt;
function Xtg(t) {
this.files = [], this.loadOptions = t;
}
Xtg.prototype = { checkSignature: function(t) {
if (!this.reader.readAndCheckSignature(t)) {
this.reader.index -= 4;
var I = this.reader.readString(4);
throw new Error("Corrupted zip or bug: unexpected signature (" + al.pretty(I) + ", expected " + al.pretty(t) + ")");
}
}, isSignature: function(t, I) {
var g = this.reader.index;
this.reader.setIndex(t);
var C = this.reader.readString(4) === I;
return this.reader.setIndex(g), C;
}, readBlockEndOfCentral: function() {
this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);
var t = this.reader.readData(this.zipCommentLength), I = k0g.uint8array ? "uint8array" : "array", g = al.transformTo(I, t);
this.zipComment = this.loadOptions.decodeFileName(g);
}, readBlockZip64EndOfCentral: function() {
this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};
for (var t, I, g, C = this.zip64EndOfCentralSize - 44; 0 < C; ) t = this.reader.readInt(2), I = this.reader.readInt(4), g = this.reader.readData(I), this.zip64ExtensibleData[t] = { id: t, length: I, value: g };
}, readBlockZip64EndOfCentralLocator: function() {
if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), this.disksCount > 1) throw new Error("Multi-volumes zip are not supported");
}, readLocalFiles: function() {
var t, I;
for (t = 0; t < this.files.length; t++) I = this.files[t], this.reader.setIndex(I.localHeaderOffset), this.checkSignature(rA.LOCAL_FILE_HEADER), I.readLocalPart(this.reader), I.handleUTF8(), I.processAttributes();
}, readCentralDir: function() {
var t;
for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(rA.CENTRAL_FILE_HEADER); ) (t = new F0g({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(t);
if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length);
}, readEndOfCentral: function() {
var t = this.reader.lastIndexOfSignature(rA.CENTRAL_DIRECTORY_END);
if (t < 0) throw this.isSignature(0, rA.LOCAL_FILE_HEADER) ? new Error("Corrupted zip: can't find end of central directory") : new Error("Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html");
this.reader.setIndex(t);
var I = t;
if (this.checkSignature(rA.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === al.MAX_VALUE_16BITS || this.diskWithCentralDirStart === al.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === al.MAX_VALUE_16BITS || this.centralDirRecords === al.MAX_VALUE_16BITS || this.centralDirSize === al.MAX_VALUE_32BITS || this.centralDirOffset === al.MAX_VALUE_32BITS) {
if (this.zip64 = !0, (t = this.reader.lastIndexOfSignature(rA.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory locator");
if (this.reader.setIndex(t), this.checkSignature(rA.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, rA.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(rA.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error("Corrupted zip: can't find the ZIP64 end of central directory");
this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(rA.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();
}
var g = this.centralDirOffset + this.centralDirSize;
this.zip64 && (g += 20, g += 12 + this.zip64EndOfCentralSize);
var C = I - g;
if (C > 0) this.isSignature(I, rA.CENTRAL_FILE_HEADER) || (this.reader.zero = C);
else if (C < 0) throw new Error("Corrupted zip: missing " + Math.abs(C) + " bytes.");
}, prepareReader: function(t) {
this.reader = K0g(t);
}, load: function(t) {
this.prepareReader(t), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();
} };
var z0g = Xtg, HX = gt(), _N = mG, J0g = M0, L0g = z0g, v0g = ECg, tq = cM;
function T0g(t) {
return new _N.Promise(function(I, g) {
var C = t.decompressed.getContentWorker().pipe(new v0g());
C.on("error", function(i) {
g(i);
}).on("end", function() {
C.streamInfo.crc32 !== t.decompressed.crc32 ? g(new Error("Corrupted zip : CRC32 mismatch")) : I();
}).resume();
});
}
function $e() {
if (!(this instanceof $e)) return new $e();
if (arguments.length) throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");
this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = "", this.clone = function() {
var t = new $e();
for (var I in this) typeof this[I] != "function" && (t[I] = this[I]);
return t;
};
}
$e.prototype = y0g, $e.prototype.loadAsync = function(t, I) {
var g = this;
return I = HX.extend(I || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: J0g.utf8decode }), tq.isNode && tq.isStream(t) ? _N.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")) : HX.prepareContent("the loaded zip file", t, !0, I.optimizedBinaryString, I.base64).then(function(C) {
var i = new L0g(I);
return i.load(C), i;
}).then(function(C) {
var i = [_N.Promise.resolve(C)], e = C.files;
if (I.checkCRC32) for (var A = 0; A < e.length; A++) i.push(T0g(e[A]));
return _N.Promise.all(i);
}).then(function(C) {
for (var i = C.shift(), e = i.files, A = 0; A < e.length; A++) {
var s = e[A], l = s.fileNameStr, n = HX.resolve(s.fileNameStr);
g.file(n, s.decompressed, { binary: !0, optimizedBinaryString: !0, date: s.date, dir: s.dir, comment: s.fileCommentStr.length ? s.fileCommentStr : null, unixPermissions: s.unixPermissions, dosPermissions: s.dosPermissions, createFolders: I.createFolders }), s.dir || (g.file(n).unsafeOriginalName = l);
}
return i.zipComment.length && (g.comment = i.zipComment), g;
});
}, $e.support = rt, $e.defaults = QCg, $e.version = "3.10.1", $e.loadAsync = function(t, I) {
return new $e().loadAsync(t, I);
}, $e.external = mG;
var x0g = $e;
function j0g(t, I) {
var g = (I = I || {}).pos || 0, C = !!I.keepComments, i = !!I.keepWhitespace, e = 60, A = 62, s = 45, l = 47, n = 33, a = 39, d = 34, o = 91, c = 93;
function r(R) {
for (var X = []; t[g]; ) if (t.charCodeAt(g) == e) {
if (t.charCodeAt(g + 1) === l) {
var H = g + 2;
if (g = t.indexOf(">", g), t.substring(H, g).indexOf(R) == -1) {
var S = t.substring(0, g).split(`
`);
throw new Error(`Unexpected close tag
Line: ` + (S.length - 1) + `
Column: ` + (S[S.length - 1].length + 1) + `
Char: ` + t[g]);
}
return g + 1 && (g += 1), X;
}
if (t.charCodeAt(g + 1) === n) {
if (t.charCodeAt(g + 2) == s) {
const B = g;
for (; g !== -1 && (t.charCodeAt(g) !== A || t.charCodeAt(g - 1) != s || t.charCodeAt(g - 2) != s || g == -1); ) g = t.indexOf(">", g + 1);
g === -1 && (g = t.length), C && X.push(t.substring(B, g + 1));
} else {
if (t.charCodeAt(g + 2) === o && t.charCodeAt(g + 8) === o && t.substr(g + 3, 5).toLowerCase() === "cdata") {
var z = t.indexOf("]]>", g);
z == -1 ? (X.push(t.substr(g + 9)), g = t.length) : (X.push(t.substring(g + 9, z)), g = z + 3);
continue;
}
{
const B = g + 1;
g += 2;
for (var v = !1; (t.charCodeAt(g) !== A || v === !0) && t[g]; ) t.charCodeAt(g) === o ? v = !0 : v === !0 && t.charCodeAt(g) === c && (v = !1), g++;
X.push(t.substring(B, g));
}
}
g++;
continue;
}
var K = m();
X.push(K), K.tagName[0] === "?" && (X.push(...K.children), K.children = []);
} else {
var V = h();
if (i) V.length > 0 && X.push(V);
else {
var N = V.trim();
N.length > 0 && X.push(N);
}
g++;
}
return X;
}
function h() {
var R = g;
return (g = t.indexOf("<", g) - 1) === -2 && (g = t.length), t.slice(R, g + 1);
}
function b() {
for (var R = g; `\r
>/= `.indexOf(t[g]) === -1 && t[g]; ) g++;
return t.slice(R, g);
}
var u = I.noChildNodes || ["img", "br", "input", "meta", "link", "hr"];
function m() {
g++;
const R = b(), X = {};
let H = [];
for (; t.charCodeAt(g) !== A && t[g]; ) {
var S = t.charCodeAt(g);
if (S > 64 && S < 91 || S > 96 && S < 123) {
for (var z = b(), v = t.charCodeAt(g); v && v !== a && v !== d && !(v > 64 && v < 91 || v > 96 && v < 123) && v !== A; ) g++, v = t.charCodeAt(g);
if (v === a || v === d) {
var K = Z();
if (g === -1) return { tagName: R, attributes: X, children: H };
} else K = null, g--;
X[z] = K;
}
g++;
}
if (t.charCodeAt(g - 1) !== l) if (R == "script") {
var V = g + 1;
g = t.indexOf("<\/script>", g), H = [t.slice(V, g)], g += 9;
} else R == "style" ? (V = g + 1, g = t.indexOf("", g), H = [t.slice(V, g)], g += 8) : u.indexOf(R) === -1 ? (g++, H = r(R)) : g++;
else g++;
return { tagName: R, attributes: X, children: H };
}
function Z() {
var R = t[g], X = g + 1;
return g = t.indexOf(R, X), t.slice(X, g);
}
var p, Y = null;
if (I.attrValue !== void 0)
for (I.attrName = I.attrName || "id", Y = []; p = void 0, p = new RegExp("\\s" + I.attrName + `\\s*=['"]` + I.attrValue + `['"]`).exec(t), (g = p ? p.index : -1) !== -1; ) (g = t.lastIndexOf("<", g)) !== -1 && Y.push(m()), t = t.substr(g), g = 0;
else Y = I.parseNode ? m() : r("");
return I.filter && (Y = Dtg(Y, I.filter)), I.simplify ? Stg(Array.isArray(Y) ? Y : [Y]) : (I.setPos && (Y.pos = g), Y);
}
function Stg(t) {
var I = {};
if (!t.length) return "";
if (t.length === 1 && typeof t[0] == "string") return t[0];
for (var g in t.forEach(function(C) {
if (typeof C == "object") {
I[C.tagName] || (I[C.tagName] = []);
var i = Stg(C.children);
I[C.tagName].push(i), Object.keys(C.attributes).length && typeof i != "string" && (i._attributes = C.attributes);
}
}), I) I[g].length == 1 && (I[g] = I[g][0]);
return I;
}
function Dtg(t, I, g = 0, C = "") {
var i = [];
return t.forEach(function(e, A) {
if (typeof e == "object" && I(e, A, g, C) && i.push(e), e.children) {
var s = Dtg(e.children, I, g + 1, (C ? C + "." : "") + A + "." + e.tagName);
i = i.concat(s);
}
}), i;
}
function Q0g(t, I) {
var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
if (!g) {
if (Array.isArray(t) || (g = function(l, n) {
if (l) {
if (typeof l == "string") return iq(l, n);
var a = Object.prototype.toString.call(l).slice(8, -1);
if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return iq(l, n);
}
}(t)) || I) {
g && (t = g);
var C = 0, i = function() {
};
return { s: i, n: function() {
return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
}, e: function(l) {
throw l;
}, f: i };
}
throw new TypeError(`Invalid attempt to iterate non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
}
var e, A = !0, s = !1;
return { s: function() {
g = g.call(t);
}, n: function() {
var l = g.next();
return A = l.done, l;
}, e: function(l) {
s = !0, e = l;
}, f: function() {
try {
A || g.return == null || g.return();
} finally {
if (s) throw e;
}
} };
}
function iq(t, I) {
(I == null || I > t.length) && (I = t.length);
for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
return C;
}
function eq(t, I) {
var g = Object.keys(t);
if (Object.getOwnPropertySymbols) {
var C = Object.getOwnPropertySymbols(t);
I && (C = C.filter(function(i) {
return Object.getOwnPropertyDescriptor(t, i).enumerable;
})), g.push.apply(g, C);
}
return g;
}
function XX(t) {
for (var I = 1; I < arguments.length; I++) {
var g = arguments[I] != null ? arguments[I] : {};
I % 2 ? eq(Object(g), !0).forEach(function(C) {
f9(t, C, g[C]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(g)) : eq(Object(g)).forEach(function(C) {
Object.defineProperty(t, C, Object.getOwnPropertyDescriptor(g, C));
});
}
return t;
}
var SX = 0;
function Ktg(t) {
var I = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, g = {};
if (!t.length) return g;
if (t.length === 1 && typeof t[0] == "string") return Object.keys(I).length ? { attrs: XX({ order: SX++ }, I), value: t[0] } : t[0];
var C, i = Q0g(t);
try {
for (i.s(); !(C = i.n()).done; ) {
var e = C.value;
if (_a(e) !== "object") return;
if (e.tagName !== "?xml") {
g[e.tagName] || (g[e.tagName] = []);
var A = Ktg(e.children || [], e.attributes);
_a(A) === "object" && (A.attrs ? A.attrs.order = SX++ : A.attrs = { order: SX++ }), Object.keys(e.attributes || {}).length && (A.attrs = XX(XX({}, A.attrs), e.attributes)), g[e.tagName].push(A);
}
}
} catch (l) {
i.e(l);
} finally {
i.f();
}
for (var s in g) g[s].length === 1 && (g[s] = g[s][0]);
return g;
}
function yt(t, I) {
return Ftg.apply(this, arguments);
}
function Ftg() {
return (Ftg = SC(bI.mark(function t(I, g) {
var C;
return bI.wrap(function(i) {
for (; ; ) switch (i.prev = i.next) {
case 0:
return i.prev = 0, i.next = 3, I.file(g).async("string");
case 3:
return C = i.sent, i.abrupt("return", Ktg(j0g(C)));
case 7:
return i.prev = 7, i.t0 = i.catch(0), i.abrupt("return", null);
case 10:
case "end":
return i.stop();
}
}, t, null, [[0, 7]]);
}))).apply(this, arguments);
}
function wV(t) {
return wV = typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? function(I) {
return typeof I;
} : function(I) {
return I && typeof Symbol == "function" && I.constructor === Symbol && I !== Symbol.prototype ? "symbol" : typeof I;
}, wV(t);
}
var O0g = /^\s+/, U0g = /\s+$/;
function Qg(t, I) {
if (I = I || {}, (t = t || "") instanceof Qg) return t;
if (!(this instanceof Qg)) return new Qg(t, I);
var g = function(C) {
var i = { r: 0, g: 0, b: 0 }, e = 1, A = null, s = null, l = null, n = !1, a = !1;
typeof C == "string" && (C = function(r) {
r = r.replace(O0g, "").replace(U0g, "").toLowerCase();
var h, b = !1;
if (WD[r]) r = WD[r], b = !0;
else if (r == "transparent") return { r: 0, g: 0, b: 0, a: 0, format: "name" };
return (h = mA.rgb.exec(r)) ? { r: h[1], g: h[2], b: h[3] } : (h = mA.rgba.exec(r)) ? { r: h[1], g: h[2], b: h[3], a: h[4] } : (h = mA.hsl.exec(r)) ? { h: h[1], s: h[2], l: h[3] } : (h = mA.hsla.exec(r)) ? { h: h[1], s: h[2], l: h[3], a: h[4] } : (h = mA.hsv.exec(r)) ? { h: h[1], s: h[2], v: h[3] } : (h = mA.hsva.exec(r)) ? { h: h[1], s: h[2], v: h[3], a: h[4] } : (h = mA.hex8.exec(r)) ? { r: se(h[1]), g: se(h[2]), b: se(h[3]), a: oq(h[4]), format: b ? "name" : "hex8" } : (h = mA.hex6.exec(r)) ? { r: se(h[1]), g: se(h[2]), b: se(h[3]), format: b ? "name" : "hex" } : (h = mA.hex4.exec(r)) ? { r: se(h[1] + "" + h[1]), g: se(h[2] + "" + h[2]), b: se(h[3] + "" + h[3]), a: oq(h[4] + "" + h[4]), format: b ? "name" : "hex8" } : (h = mA.hex3.exec(r)) ? { r: se(h[1] + "" + h[1]), g: se(h[2] + "" + h[2]), b: se(h[3] + "" + h[3]), format: b ? "name" : "hex" } : !1;
}(C)), wV(C) == "object" && (ol(C.r) && ol(C.g) && ol(C.b) ? (d = C.r, o = C.g, c = C.b, i = { r: 255 * JC(d, 255), g: 255 * JC(o, 255), b: 255 * JC(c, 255) }, n = !0, a = String(C.r).substr(-1) === "%" ? "prgb" : "rgb") : ol(C.h) && ol(C.s) && ol(C.v) ? (A = cm(C.s), s = cm(C.v), i = function(r, h, b) {
r = 6 * JC(r, 360), h = JC(h, 100), b = JC(b, 100);
var u = Math.floor(r), m = r - u, Z = b * (1 - h), p = b * (1 - m * h), Y = b * (1 - (1 - m) * h), R = u % 6;
return { r: 255 * [b, p, Z, Z, Y, b][R], g: 255 * [Y, b, b, p, Z, Z][R], b: 255 * [Z, Z, Y, b, b, p][R] };
}(C.h, A, s), n = !0, a = "hsv") : ol(C.h) && ol(C.s) && ol(C.l) && (A = cm(C.s), l = cm(C.l), i = function(r, h, b) {
var u, m, Z;
function p(X, H, S) {
return S < 0 && (S += 1), S > 1 && (S -= 1), S < 1 / 6 ? X + 6 * (H - X) * S : S < 0.5 ? H : S < 2 / 3 ? X + (H - X) * (2 / 3 - S) * 6 : X;
}
if (r = JC(r, 360), h = JC(h, 100), b = JC(b, 100), h === 0) u = m = Z = b;
else {
var Y = b < 0.5 ? b * (1 + h) : b + h - b * h, R = 2 * b - Y;
u = p(R, Y, r + 1 / 3), m = p(R, Y, r), Z = p(R, Y, r - 1 / 3);
}
return { r: 255 * u, g: 255 * m, b: 255 * Z };
}(C.h, A, l), n = !0, a = "hsl"), C.hasOwnProperty("a") && (e = C.a));
var d, o, c;
return e = ktg(e), { ok: n, format: C.format || a, r: Math.min(255, Math.max(i.r, 0)), g: Math.min(255, Math.max(i.g, 0)), b: Math.min(255, Math.max(i.b, 0)), a: e };
}(t);
this._originalInput = t, this._r = g.r, this._g = g.g, this._b = g.b, this._a = g.a, this._roundA = Math.round(100 * this._a) / 100, this._format = I.format || g.format, this._gradientType = I.gradientType, this._r < 1 && (this._r = Math.round(this._r)), this._g < 1 && (this._g = Math.round(this._g)), this._b < 1 && (this._b = Math.round(this._b)), this._ok = g.ok;
}
function Aq(t, I, g) {
t = JC(t, 255), I = JC(I, 255), g = JC(g, 255);
var C, i, e = Math.max(t, I, g), A = Math.min(t, I, g), s = (e + A) / 2;
if (e == A) C = i = 0;
else {
var l = e - A;
switch (i = s > 0.5 ? l / (2 - e - A) : l / (e + A), e) {
case t:
C = (I - g) / l + (I < g ? 6 : 0);
break;
case I:
C = (g - t) / l + 2;
break;
case g:
C = (t - I) / l + 4;
}
C /= 6;
}
return { h: C, s: i, l: s };
}
function sq(t, I, g) {
t = JC(t, 255), I = JC(I, 255), g = JC(g, 255);
var C, i, e = Math.max(t, I, g), A = Math.min(t, I, g), s = e, l = e - A;
if (i = e === 0 ? 0 : l / e, e == A) C = 0;
else {
switch (e) {
case t:
C = (I - g) / l + (I < g ? 6 : 0);
break;
case I:
C = (g - t) / l + 2;
break;
case g:
C = (t - I) / l + 4;
}
C /= 6;
}
return { h: C, s: i, v: s };
}
function lq(t, I, g, C) {
var i = [KA(Math.round(t).toString(16)), KA(Math.round(I).toString(16)), KA(Math.round(g).toString(16))];
return C && i[0].charAt(0) == i[0].charAt(1) && i[1].charAt(0) == i[1].charAt(1) && i[2].charAt(0) == i[2].charAt(1) ? i[0].charAt(0) + i[1].charAt(0) + i[2].charAt(0) : i.join("");
}
function nq(t, I, g, C) {
return [KA(ztg(C)), KA(Math.round(t).toString(16)), KA(Math.round(I).toString(16)), KA(Math.round(g).toString(16))].join("");
}
function E0g(t, I) {
I = I === 0 ? 0 : I || 10;
var g = Qg(t).toHsl();
return g.s -= I / 100, g.s = dM(g.s), Qg(g);
}
function P0g(t, I) {
I = I === 0 ? 0 : I || 10;
var g = Qg(t).toHsl();
return g.s += I / 100, g.s = dM(g.s), Qg(g);
}
function _0g(t) {
return Qg(t).desaturate(100);
}
function q0g(t, I) {
I = I === 0 ? 0 : I || 10;
var g = Qg(t).toHsl();
return g.l += I / 100, g.l = dM(g.l), Qg(g);
}
function $0g(t, I) {
I = I === 0 ? 0 : I || 10;
var g = Qg(t).toRgb();
return g.r = Math.max(0, Math.min(255, g.r - Math.round(-I / 100 * 255))), g.g = Math.max(0, Math.min(255, g.g - Math.round(-I / 100 * 255))), g.b = Math.max(0, Math.min(255, g.b - Math.round(-I / 100 * 255))), Qg(g);
}
function gbg(t, I) {
I = I === 0 ? 0 : I || 10;
var g = Qg(t).toHsl();
return g.l -= I / 100, g.l = dM(g.l), Qg(g);
}
function Ibg(t, I) {
var g = Qg(t).toHsl(), C = (g.h + I) % 360;
return g.h = C < 0 ? 360 + C : C, Qg(g);
}
function Cbg(t) {
var I = Qg(t).toHsl();
return I.h = (I.h + 180) % 360, Qg(I);
}
function aq(t, I) {
if (isNaN(I) || I <= 0) throw new Error("Argument to polyad must be a positive number");
for (var g = Qg(t).toHsl(), C = [Qg(t)], i = 360 / I, e = 1; e < I; e++) C.push(Qg({ h: (g.h + e * i) % 360, s: g.s, l: g.l }));
return C;
}
function tbg(t) {
var I = Qg(t).toHsl(), g = I.h;
return [Qg(t), Qg({ h: (g + 72) % 360, s: I.s, l: I.l }), Qg({ h: (g + 216) % 360, s: I.s, l: I.l })];
}
function ibg(t, I, g) {
I = I || 6, g = g || 30;
var C = Qg(t).toHsl(), i = 360 / g, e = [Qg(t)];
for (C.h = (C.h - (i * I >> 1) + 720) % 360; --I; ) C.h = (C.h + i) % 360, e.push(Qg(C));
return e;
}
function ebg(t, I) {
I = I || 6;
for (var g = Qg(t).toHsv(), C = g.h, i = g.s, e = g.v, A = [], s = 1 / I; I--; ) A.push(Qg({ h: C, s: i, v: e })), e = (e + s) % 1;
return A;
}
Qg.prototype = { isDark: function() {
return this.getBrightness() < 128;
}, isLight: function() {
return !this.isDark();
}, isValid: function() {
return this._ok;
}, getOriginalInput: function() {
return this._originalInput;
}, getFormat: function() {
return this._format;
}, getAlpha: function() {
return this._a;
}, getBrightness: function() {
var t = this.toRgb();
return (299 * t.r + 587 * t.g + 114 * t.b) / 1e3;
}, getLuminance: function() {
var t, I, g, C = this.toRgb();
return t = C.r / 255, I = C.g / 255, g = C.b / 255, 0.2126 * (t <= 0.03928 ? t / 12.92 : Math.pow((t + 0.055) / 1.055, 2.4)) + 0.7152 * (I <= 0.03928 ? I / 12.92 : Math.pow((I + 0.055) / 1.055, 2.4)) + 0.0722 * (g <= 0.03928 ? g / 12.92 : Math.pow((g + 0.055) / 1.055, 2.4));
}, setAlpha: function(t) {
return this._a = ktg(t), this._roundA = Math.round(100 * this._a) / 100, this;
}, toHsv: function() {
var t = sq(this._r, this._g, this._b);
return { h: 360 * t.h, s: t.s, v: t.v, a: this._a };
}, toHsvString: function() {
var t = sq(this._r, this._g, this._b), I = Math.round(360 * t.h), g = Math.round(100 * t.s), C = Math.round(100 * t.v);
return this._a == 1 ? "hsv(" + I + ", " + g + "%, " + C + "%)" : "hsva(" + I + ", " + g + "%, " + C + "%, " + this._roundA + ")";
}, toHsl: function() {
var t = Aq(this._r, this._g, this._b);
return { h: 360 * t.h, s: t.s, l: t.l, a: this._a };
}, toHslString: function() {
var t = Aq(this._r, this._g, this._b), I = Math.round(360 * t.h), g = Math.round(100 * t.s), C = Math.round(100 * t.l);
return this._a == 1 ? "hsl(" + I + ", " + g + "%, " + C + "%)" : "hsla(" + I + ", " + g + "%, " + C + "%, " + this._roundA + ")";
}, toHex: function(t) {
return lq(this._r, this._g, this._b, t);
}, toHexString: function(t) {
return "#" + this.toHex(t);
}, toHex8: function(t) {
return function(I, g, C, i, e) {
var A = [KA(Math.round(I).toString(16)), KA(Math.round(g).toString(16)), KA(Math.round(C).toString(16)), KA(ztg(i))];
return e && A[0].charAt(0) == A[0].charAt(1) && A[1].charAt(0) == A[1].charAt(1) && A[2].charAt(0) == A[2].charAt(1) && A[3].charAt(0) == A[3].charAt(1) ? A[0].charAt(0) + A[1].charAt(0) + A[2].charAt(0) + A[3].charAt(0) : A.join("");
}(this._r, this._g, this._b, this._a, t);
}, toHex8String: function(t) {
return "#" + this.toHex8(t);
}, toRgb: function() {
return { r: Math.round(this._r), g: Math.round(this._g), b: Math.round(this._b), a: this._a };
}, toRgbString: function() {
return this._a == 1 ? "rgb(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ")" : "rgba(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ", " + this._roundA + ")";
}, toPercentageRgb: function() {
return { r: Math.round(100 * JC(this._r, 255)) + "%", g: Math.round(100 * JC(this._g, 255)) + "%", b: Math.round(100 * JC(this._b, 255)) + "%", a: this._a };
}, toPercentageRgbString: function() {
return this._a == 1 ? "rgb(" + Math.round(100 * JC(this._r, 255)) + "%, " + Math.round(100 * JC(this._g, 255)) + "%, " + Math.round(100 * JC(this._b, 255)) + "%)" : "rgba(" + Math.round(100 * JC(this._r, 255)) + "%, " + Math.round(100 * JC(this._g, 255)) + "%, " + Math.round(100 * JC(this._b, 255)) + "%, " + this._roundA + ")";
}, toName: function() {
return this._a === 0 ? "transparent" : !(this._a < 1) && (Abg[lq(this._r, this._g, this._b, !0)] || !1);
}, toFilter: function(t) {
var I = "#" + nq(this._r, this._g, this._b, this._a), g = I, C = this._gradientType ? "GradientType = 1, " : "";
if (t) {
var i = Qg(t);
g = "#" + nq(i._r, i._g, i._b, i._a);
}
return "progid:DXImageTransform.Microsoft.gradient(" + C + "startColorstr=" + I + ",endColorstr=" + g + ")";
}, toString: function(t) {
var I = !!t;
t = t || this._format;
var g = !1, C = this._a < 1 && this._a >= 0;
return I || !C || t !== "hex" && t !== "hex6" && t !== "hex3" && t !== "hex4" && t !== "hex8" && t !== "name" ? (t === "rgb" && (g = this.toRgbString()), t === "prgb" && (g = this.toPercentageRgbString()), t !== "hex" && t !== "hex6" || (g = this.toHexString()), t === "hex3" && (g = this.toHexString(!0)), t === "hex4" && (g = this.toHex8String(!0)), t === "hex8" && (g = this.toHex8String()), t === "name" && (g = this.toName()), t === "hsl" && (g = this.toHslString()), t === "hsv" && (g = this.toHsvString()), g || this.toHexString()) : t === "name" && this._a === 0 ? this.toName() : this.toRgbString();
}, clone: function() {
return Qg(this.toString());
}, _applyModification: function(t, I) {
var g = t.apply(null, [this].concat([].slice.call(I)));
return this._r = g._r, this._g = g._g, this._b = g._b, this.setAlpha(g._a), this;
}, lighten: function() {
return this._applyModification(q0g, arguments);
}, brighten: function() {
return this._applyModification($0g, arguments);
}, darken: function() {
return this._applyModification(gbg, arguments);
}, desaturate: function() {
return this._applyModification(E0g, arguments);
}, saturate: function() {
return this._applyModification(P0g, arguments);
}, greyscale: function() {
return this._applyModification(_0g, arguments);
}, spin: function() {
return this._applyModification(Ibg, arguments);
}, _applyCombination: function(t, I) {
return t.apply(null, [this].concat([].slice.call(I)));
}, analogous: function() {
return this._applyCombination(ibg, arguments);
}, complement: function() {
return this._applyCombination(Cbg, arguments);
}, monochromatic: function() {
return this._applyCombination(ebg, arguments);
}, splitcomplement: function() {
return this._applyCombination(tbg, arguments);
}, triad: function() {
return this._applyCombination(aq, [3]);
}, tetrad: function() {
return this._applyCombination(aq, [4]);
} }, Qg.fromRatio = function(t, I) {
if (wV(t) == "object") {
var g = {};
for (var C in t) t.hasOwnProperty(C) && (g[C] = C === "a" ? t[C] : cm(t[C]));
t = g;
}
return Qg(t, I);
}, Qg.equals = function(t, I) {
return !(!t || !I) && Qg(t).toRgbString() == Qg(I).toRgbString();
}, Qg.random = function() {
return Qg.fromRatio({ r: Math.random(), g: Math.random(), b: Math.random() });
}, Qg.mix = function(t, I, g) {
g = g === 0 ? 0 : g || 50;
var C = Qg(t).toRgb(), i = Qg(I).toRgb(), e = g / 100;
return Qg({ r: (i.r - C.r) * e + C.r, g: (i.g - C.g) * e + C.g, b: (i.b - C.b) * e + C.b, a: (i.a - C.a) * e + C.a });
}, Qg.readability = function(t, I) {
var g = Qg(t), C = Qg(I);
return (Math.max(g.getLuminance(), C.getLuminance()) + 0.05) / (Math.min(g.getLuminance(), C.getLuminance()) + 0.05);
}, Qg.isReadable = function(t, I, g) {
var C, i, e = Qg.readability(t, I);
switch (i = !1, (C = function(A) {
var s, l;
return s = ((A = A || { level: "AA", size: "small" }).level || "AA").toUpperCase(), l = (A.size || "small").toLowerCase(), s !== "AA" && s !== "AAA" && (s = "AA"), l !== "small" && l !== "large" && (l = "small"), { level: s, size: l };
}(g)).level + C.size) {
case "AAsmall":
case "AAAlarge":
i = e >= 4.5;
break;
case "AAlarge":
i = e >= 3;
break;
case "AAAsmall":
i = e >= 7;
}
return i;
}, Qg.mostReadable = function(t, I, g) {
var C, i, e, A, s = null, l = 0;
i = (g = g || {}).includeFallbackColors, e = g.level, A = g.size;
for (var n = 0; n < I.length; n++) (C = Qg.readability(t, I[n])) > l && (l = C, s = Qg(I[n]));
return Qg.isReadable(t, s, { level: e, size: A }) || !i ? s : (g.includeFallbackColors = !1, Qg.mostReadable(t, ["#fff", "#000"], g));
};
var WD = Qg.names = { aliceblue: "f0f8ff", antiquewhite: "faebd7", aqua: "0ff", aquamarine: "7fffd4", azure: "f0ffff", beige: "f5f5dc", bisque: "ffe4c4", black: "000", blanchedalmond: "ffebcd", blue: "00f", blueviolet: "8a2be2", brown: "a52a2a", burlywood: "deb887", burntsienna: "ea7e5d", cadetblue: "5f9ea0", chartreuse: "7fff00", chocolate: "d2691e", coral: "ff7f50", cornflowerblue: "6495ed", cornsilk: "fff8dc", crimson: "dc143c", cyan: "0ff", darkblue: "00008b", darkcyan: "008b8b", darkgoldenrod: "b8860b", darkgray: "a9a9a9", darkgreen: "006400", darkgrey: "a9a9a9", darkkhaki: "bdb76b", darkmagenta: "8b008b", darkolivegreen: "556b2f", darkorange: "ff8c00", darkorchid: "9932cc", darkred: "8b0000", darksalmon: "e9967a", darkseagreen: "8fbc8f", darkslateblue: "483d8b", darkslategray: "2f4f4f", darkslategrey: "2f4f4f", darkturquoise: "00ced1", darkviolet: "9400d3", deeppink: "ff1493", deepskyblue: "00bfff", dimgray: "696969", dimgrey: "696969", dodgerblue: "1e90ff", firebrick: "b22222", floralwhite: "fffaf0", forestgreen: "228b22", fuchsia: "f0f", gainsboro: "dcdcdc", ghostwhite: "f8f8ff", gold: "ffd700", goldenrod: "daa520", gray: "808080", green: "008000", greenyellow: "adff2f", grey: "808080", honeydew: "f0fff0", hotpink: "ff69b4", indianred: "cd5c5c", indigo: "4b0082", ivory: "fffff0", khaki: "f0e68c", lavender: "e6e6fa", lavenderblush: "fff0f5", lawngreen: "7cfc00", lemonchiffon: "fffacd", lightblue: "add8e6", lightcoral: "f08080", lightcyan: "e0ffff", lightgoldenrodyellow: "fafad2", lightgray: "d3d3d3", lightgreen: "90ee90", lightgrey: "d3d3d3", lightpink: "ffb6c1", lightsalmon: "ffa07a", lightseagreen: "20b2aa", lightskyblue: "87cefa", lightslategray: "789", lightslategrey: "789", lightsteelblue: "b0c4de", lightyellow: "ffffe0", lime: "0f0", limegreen: "32cd32", linen: "faf0e6", magenta: "f0f", maroon: "800000", mediumaquamarine: "66cdaa", mediumblue: "0000cd", mediumorchid: "ba55d3", mediumpurple: "9370db", mediumseagreen: "3cb371", mediumslateblue: "7b68ee", mediumspringgreen: "00fa9a", mediumturquoise: "48d1cc", mediumvioletred: "c71585", midnightblue: "191970", mintcream: "f5fffa", mistyrose: "ffe4e1", moccasin: "ffe4b5", navajowhite: "ffdead", navy: "000080", oldlace: "fdf5e6", olive: "808000", olivedrab: "6b8e23", orange: "ffa500", orangered: "ff4500", orchid: "da70d6", palegoldenrod: "eee8aa", palegreen: "98fb98", paleturquoise: "afeeee", palevioletred: "db7093", papayawhip: "ffefd5", peachpuff: "ffdab9", peru: "cd853f", pink: "ffc0cb", plum: "dda0dd", powderblue: "b0e0e6", purple: "800080", rebeccapurple: "663399", red: "f00", rosybrown: "bc8f8f", royalblue: "4169e1", saddlebrown: "8b4513", salmon: "fa8072", sandybrown: "f4a460", seagreen: "2e8b57", seashell: "fff5ee", sienna: "a0522d", silver: "c0c0c0", skyblue: "87ceeb", slateblue: "6a5acd", slategray: "708090", slategrey: "708090", snow: "fffafa", springgreen: "00ff7f", steelblue: "4682b4", tan: "d2b48c", teal: "008080", thistle: "d8bfd8", tomato: "ff6347", turquoise: "40e0d0", violet: "ee82ee", wheat: "f5deb3", white: "fff", whitesmoke: "f5f5f5", yellow: "ff0", yellowgreen: "9acd32" }, Abg = Qg.hexNames = function(t) {
var I = {};
for (var g in t) t.hasOwnProperty(g) && (I[t[g]] = g);
return I;
}(WD);
function ktg(t) {
return t = parseFloat(t), (isNaN(t) || t < 0 || t > 1) && (t = 1), t;
}
function JC(t, I) {
(function(C) {
return typeof C == "string" && C.indexOf(".") != -1 && parseFloat(C) === 1;
})(t) && (t = "100%");
var g = function(C) {
return typeof C == "string" && C.indexOf("%") != -1;
}(t);
return t = Math.min(I, Math.max(0, parseFloat(t))), g && (t = parseInt(t * I, 10) / 100), Math.abs(t - I) < 1e-6 ? 1 : t % I / parseFloat(I);
}
function dM(t) {
return Math.min(1, Math.max(0, t));
}
function se(t) {
return parseInt(t, 16);
}
function KA(t) {
return t.length == 1 ? "0" + t : "" + t;
}
function cm(t) {
return t <= 1 && (t = 100 * t + "%"), t;
}
function ztg(t) {
return Math.round(255 * parseFloat(t)).toString(16);
}
function oq(t) {
return se(t) / 255;
}
var _n, gN, IN, mA = (gN = "[\\s|\\(]+(" + (_n = "(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)") + ")[,|\\s]+(" + _n + ")[,|\\s]+(" + _n + ")\\s*\\)?", IN = "[\\s|\\(]+(" + _n + ")[,|\\s]+(" + _n + ")[,|\\s]+(" + _n + ")[,|\\s]+(" + _n + ")\\s*\\)?", { CSS_UNIT: new RegExp(_n), rgb: new RegExp("rgb" + gN), rgba: new RegExp("rgba" + IN), hsl: new RegExp("hsl" + gN), hsla: new RegExp("hsla" + IN), hsv: new RegExp("hsv" + gN), hsva: new RegExp("hsva" + IN), hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ });
function ol(t) {
return !!mA.CSS_UNIT.exec(t);
}
function sbg(t, I) {
var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
if (!g) {
if (Array.isArray(t) || (g = function(l, n) {
if (l) {
if (typeof l == "string") return cq(l, n);
var a = Object.prototype.toString.call(l).slice(8, -1);
if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return cq(l, n);
}
}(t)) || I) {
g && (t = g);
var C = 0, i = function() {
};
return { s: i, n: function() {
return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
}, e: function(l) {
throw l;
}, f: i };
}
throw new TypeError(`Invalid attempt to iterate non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
}
var e, A = !0, s = !1;
return { s: function() {
g = g.call(t);
}, n: function() {
var l = g.next();
return A = l.done, l;
}, e: function(l) {
s = !0, e = l;
}, f: function() {
try {
A || g.return == null || g.return();
} finally {
if (s) throw e;
}
} };
}
function cq(t, I) {
(I == null || I > t.length) && (I = t.length);
for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
return C;
}
function Jtg(t) {
for (var I, g = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", C = new Uint8Array(t), i = C.byteLength, e = i % 3, A = i - e, s = "", l = 0; l < A; l += 3) s += g[(16515072 & (I = C[l] << 16 | C[l + 1] << 8 | C[l + 2])) >> 18] + g[(258048 & I) >> 12] + g[(4032 & I) >> 6] + g[63 & I];
return e === 1 ? s += g[(252 & (I = C[A])) >> 2] + g[(3 & I) << 4] + "==" : e === 2 && (s += g[(64512 & (I = C[A] << 8 | C[A + 1])) >> 10] + g[(1008 & I) >> 4] + g[(15 & I) << 2] + "="), s;
}
function DX(t) {
return t.substr(2 + (~-t.lastIndexOf(".") >>> 0));
}
function zr(t, I) {
if (!t) return t;
var g = "";
if (t.constructor === Array) for (var C = 0; C < t.length; C++) g += I(t[C], C);
else g += I(t, 0);
return g;
}
function U(t, I) {
if (!t) return t;
var g, C = sbg(I);
try {
for (C.s(); !(g = C.n()).done; )
if (!(t = t[g.value])) return t;
} catch (i) {
C.e(i);
} finally {
C.f();
}
return t;
}
function Y0(t) {
return t ? Math.round(t / 6e4) : 0;
}
function pV(t) {
var I = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" };
return t.replace(/[&<>"']/g, function(g) {
return I[g];
});
}
function yD(t) {
var I = "";
switch (t.toLowerCase()) {
case "jpg":
case "jpeg":
I = "image/jpeg";
break;
case "png":
I = "image/png";
break;
case "gif":
I = "image/gif";
break;
case "emf":
I = "image/x-emf";
break;
case "wmf":
I = "image/x-wmf";
break;
case "svg":
I = "image/svg+xml";
break;
case "mp4":
I = "video/mp4";
break;
case "webm":
I = "video/webm";
break;
case "ogg":
I = "video/ogg";
break;
case "avi":
I = "video/avi";
break;
case "mpg":
I = "video/mpg";
break;
case "wmv":
I = "video/wmv";
break;
case "mp3":
I = "audio/mpeg";
break;
case "wav":
I = "audio/wav";
break;
case "tif":
case "tiff":
I = "image/tiff";
}
return I;
}
function lbg(t) {
return /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/.test(t);
}
function Jr(t) {
for (var I = t.toString(16); I.length < 2; ) I = "0" + I;
return I;
}
function Ltg(t) {
if (typeof DOMParser > "u") return t.replace(/<[^>]+>/g, "").replace(/\s+/g, " ").trim() !== "";
var I = new DOMParser().parseFromString(t, "text/html");
return (I.body.textContent || I.body.innerText).trim() !== "";
}
function Lt(t) {
var I = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 4;
return parseFloat(t.toFixed(I));
}
function YD(t, I, g, C) {
var i, e;
if (g) e = g;
else {
var A = U(I.slideContent, ["p:sld", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]);
e = A || (A = U(I.slideLayoutContent, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"])) || U(I.slideMasterContent, ["p:sldMaster", "p:clrMap", "attrs"]);
}
var s = t.substr(2);
if (s === "phClr" && C) i = C;
else {
if (e) switch (s) {
case "tx1":
case "tx2":
case "bg1":
case "bg2":
t = "a:" + e[s];
}
else switch (s) {
case "tx1":
t = "a:dk1";
break;
case "tx2":
t = "a:dk2";
break;
case "bg1":
t = "a:lt1";
break;
case "bg2":
t = "a:lt2";
}
var l = U(I.themeContent, ["a:theme", "a:themeElements", "a:clrScheme", t]);
!(i = U(l, ["a:srgbClr", "attrs", "val"])) && l && (i = U(l, ["a:sysClr", "attrs", "lastClr"]));
}
return i;
}
function Fs(t, I, g) {
var C = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : [], i = U(t, ["p:spPr", "a:ln"]), e = !!U(i, ["a:grpFill"]);
if ((!i || e) && C && C.length) for (var A = C.length - 1; A >= 0; A--) {
var s = U(C[A], ["p:grpSpPr", "a:ln"]);
if (s) {
i = s;
break;
}
}
if (!i) {
var l = U(t, ["p:style", "a:lnRef"]);
if (l) {
var n = U(l, ["attrs", "idx"]);
i = g.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:lnStyleLst"]["a:ln"][Number(n) - 1];
}
}
i || (i = t);
var a = U(i, ["a:noFill"]), d = U(i, ["attrs", "w"]), o = !!(d !== void 0 || U(i, ["a:prstDash"]) || U(i, ["a:solidFill"]) || U(i, ["a:gradFill"]) || U(i, ["a:pattFill"])), c = 0;
!a && o && (c = parseInt(d) / 12700, (!Number.isFinite(c) || c <= 0) && (c = 1));
var r = U(i, ["a:solidFill", "a:srgbClr", "attrs", "val"]);
if (!r) {
var h = U(i, ["a:solidFill", "a:schemeClr"]), b = "a:" + U(h, ["attrs", "val"]);
r = YD(b, g);
}
if (!r) {
var u = U(t, ["p:style", "a:lnRef", "a:schemeClr"]), m = "a:" + U(u, ["attrs", "val"]);
if (r = YD(m, g)) {
var Z = U(u, ["a:shade", "attrs", "val"]);
if (Z) {
Z = parseInt(Z) / 1e5;
var p = Qg("#" + r).toHsl();
r = Qg({ h: p.h, s: p.s, l: p.l * Z, a: p.a }).toHex();
}
}
}
r = r ? "#".concat(r) : "#000000";
var Y = U(i, ["a:prstDash", "attrs", "val"]), R = "solid", X = "0";
switch (Y) {
case "solid":
R = "solid", X = "0";
break;
case "dash":
R = "dashed", X = "5";
break;
case "dashDot":
R = "dashed", X = "5, 5, 1, 5";
break;
case "dot":
R = "dotted", X = "1, 5";
break;
case "lgDash":
R = "dashed", X = "10, 5";
break;
case "lgDashDotDot":
R = "dotted", X = "10, 5, 1, 5, 1, 5";
break;
case "sysDash":
R = "dashed", X = "5, 2";
break;
case "sysDashDot":
R = "dotted", X = "5, 2, 1, 5";
break;
case "sysDashDotDot":
R = "dotted", X = "5, 2, 1, 5, 1, 5";
break;
case "sysDot":
R = "dotted", X = "2, 5";
}
return { borderColor: r, borderWidth: c, borderType: R, strokeDasharray: X };
}
function KX(t, I, g) {
return g < 0 && (g += 6), g >= 6 && (g -= 6), g < 1 ? (I - t) * g + t : g < 3 ? I : g < 4 ? (I - t) * (4 - g) + t : t;
}
function vtg(t, I, g) {
var C = Qg(t).toHsl();
I >= 1 && (I = 1);
var i = C.l * I + (1 - I);
return g ? Qg({ h: C.h, s: C.s, l: i, a: C.a }).toHex8() : Qg({ h: C.h, s: C.s, l: i, a: C.a }).toHex();
}
function dq(t, I) {
var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
if (!g) {
if (Array.isArray(t) || (g = function(l, n) {
if (l) {
if (typeof l == "string") return rq(l, n);
var a = Object.prototype.toString.call(l).slice(8, -1);
if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return rq(l, n);
}
}(t)) || I) {
g && (t = g);
var C = 0, i = function() {
};
return { s: i, n: function() {
return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
}, e: function(l) {
throw l;
}, f: i };
}
throw new TypeError(`Invalid attempt to iterate non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
}
var e, A = !0, s = !1;
return { s: function() {
g = g.call(t);
}, n: function() {
var l = g.next();
return A = l.done, l;
}, e: function(l) {
s = !0, e = l;
}, f: function() {
try {
A || g.return == null || g.return();
} finally {
if (s) throw e;
}
} };
}
function rq(t, I) {
(I == null || I > t.length) && (I = t.length);
for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
return C;
}
function Hs(t) {
var I = "";
return t["a:noFill"] && (I = "NO_FILL"), t["a:solidFill"] && (I = "SOLID_FILL"), t["a:gradFill"] && (I = "GRADIENT_FILL"), t["a:pattFill"] && (I = "PATTERN_FILL"), t["a:blipFill"] && (I = "PIC_FILL"), t["a:grpFill"] && (I = "GROUP_FILL"), I;
}
function rM(t, I, g) {
return ND.apply(this, arguments);
}
function ND() {
return ND = SC(bI.mark(function t(I, g, C) {
var i, e, A, s, l, n, a;
return bI.wrap(function(d) {
for (; ; ) switch (d.prev = d.next) {
case 0:
if (g) {
d.next = 2;
break;
}
return d.abrupt("return", "");
case 2:
if (e = U(g, ["a:blip", "attrs", "r:embed"]), I === "slideBg" || I === "slide" ? A = U(C, ["slideResObj", e, "target"]) : I === "slideLayoutBg" ? A = U(C, ["layoutResObj", e, "target"]) : I === "slideMasterBg" ? A = U(C, ["masterResObj", e, "target"]) : I === "themeBg" ? A = U(C, ["themeResObj", e, "target"]) : I === "diagramBg" && (A = U(C, ["diagramResObj", e, "target"])), A) {
d.next = 6;
break;
}
return d.abrupt("return", A);
case 6:
if (i = U(C, ["loaded-images", A])) {
d.next = 20;
break;
}
if (A = pV(A), (s = A.split(".").pop()) !== "xml") {
d.next = 12;
break;
}
return d.abrupt("return", "");
case 12:
return d.next = 14, C.zip.file(A).async("arraybuffer");
case 14:
l = d.sent, n = yD(s), i = "data:".concat(n, ";base64,").concat(Jtg(l)), (a = C["loaded-images"] || {})[A] = i, C["loaded-images"] = a;
case 20:
return d.abrupt("return", i);
case 21:
case "end":
return d.stop();
}
}, t);
})), ND.apply(this, arguments);
}
function Ttg(t) {
var I = U(t["a:blip"], ["a:alphaModFix", "attrs"]), g = 1;
return I && I.amt && I.amt !== "" && (g = parseInt(I.amt) / 1e5), g;
}
function nbg(t) {
if (!t) return null;
var I = t["a:blip"];
if (!I) return null;
var g = {}, C = I["a:extLst"];
if (C && C["a:ext"]) {
var i, e = dq(Array.isArray(C["a:ext"]) ? C["a:ext"] : [C["a:ext"]]);
try {
for (e.s(); !(i = e.n()).done; ) {
var A = i.value;
if (A["a14:imgProps"] && A["a14:imgProps"]["a14:imgLayer"]) {
var s = A["a14:imgProps"]["a14:imgLayer"]["a14:imgEffect"];
if (s) {
var l, n = dq(Array.isArray(s) ? s : [s]);
try {
for (n.s(); !(l = n.n()).done; ) {
var a = l.value;
if (a["a14:saturation"]) {
var d = U(a, ["a14:saturation", "attrs", "sat"]);
d && (g.saturation = parseInt(d) / 1e5);
}
if (a["a14:brightnessContrast"]) {
var o = U(a, ["a14:brightnessContrast", "attrs", "bright"]), c = U(a, ["a14:brightnessContrast", "attrs", "contrast"]);
o && (g.brightness = parseInt(o) / 1e5), c && (g.contrast = parseInt(c) / 1e5);
}
if (a["a14:sharpenSoften"]) {
var r = U(a, ["a14:sharpenSoften", "attrs", "amount"]);
if (r) {
var h = parseInt(r) / 1e5;
h > 0 ? g.sharpen = h : g.soften = Math.abs(h);
}
}
if (a["a14:colorTemperature"]) {
var b = U(a, ["a14:colorTemperature", "attrs", "colorTemp"]);
b && (g.colorTemperature = parseInt(b));
}
}
} catch (u) {
n.e(u);
} finally {
n.f();
}
}
}
}
} catch (u) {
e.e(u);
} finally {
e.f();
}
}
return Object.keys(g).length > 0 ? g : null;
}
function zu(t, I, g) {
return xtg.apply(this, arguments);
}
function xtg() {
return (xtg = SC(bI.mark(function t(I, g, C) {
var i, e, A, s;
return bI.wrap(function(l) {
for (; ; ) switch (l.prev = l.next) {
case 0:
return l.next = 2, rM(g, I["a:blipFill"], C);
case 2:
return i = l.sent, e = I["a:blipFill"]["a:blip"], A = U(e, ["a:alphaModFix", "attrs"]), s = 1, A && A.amt && A.amt !== "" && (s = parseInt(A.amt) / 1e5), l.abrupt("return", { picBase64: i, opacity: s });
case 8:
case "end":
return l.stop();
}
}, t);
}))).apply(this, arguments);
}
function j9(t, I) {
for (var g = t["a:gsLst"]["a:gs"], C = [], i = 0; i < g.length; i++) {
var e = eC(g[i], void 0, void 0, I), A = U(g[i], ["attrs", "pos"]);
C[i] = { pos: A ? A / 1e3 + "%" : "", color: e };
}
var s = t["a:lin"], l = 0, n = "line";
if (s) l = Y0(s.attrs.ang);
else {
var a = t["a:path"];
a && a.attrs && a.attrs.path && (n = a.attrs.path);
}
return { rot: l, path: n, colors: C.sort(function(d, o) {
return parseInt(d.pos) - parseInt(o.pos);
}) };
}
function Eo(t, I) {
if (!t) return null;
var g = t["a:pattFill"];
if (!g) return null;
var C = U(g, ["attrs", "prst"]), i = g["a:fgClr"], e = g["a:bgClr"], A = "#000000", s = "#FFFFFF";
return i && (A = eC(i, void 0, void 0, I)), e && (s = eC(e, void 0, void 0, I)), { type: C, foregroundColor: A, backgroundColor: s };
}
function Lr(t, I, g, C) {
if (t) {
for (var i = t["a:gradFill"], e = i["a:gsLst"]["a:gs"], A = [], s = 0; s < e.length; s++) {
var l = eC(e[s], g["p:sldMaster"]["p:clrMap"].attrs, I, C), n = U(e[s], ["attrs", "pos"]);
A[s] = { pos: n ? n / 1e3 + "%" : "", color: l };
}
var a = i["a:lin"], d = 0, o = "line";
if (a) d = Y0(a.attrs.ang) + 0;
else {
var c = i["a:path"];
c && c.attrs && c.attrs.path && (o = c.attrs.path);
}
return { rot: d, path: o, colors: A.sort(function(r, h) {
return parseInt(r.pos) - parseInt(h.pos);
}) };
}
return I ? I.indexOf("#") === -1 ? "#".concat(I) : I : null;
}
function abg(t) {
return VD.apply(this, arguments);
}
function VD() {
return VD = SC(bI.mark(function t(I) {
var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg, dg, Bg, Zg, Xg, Kg, kg;
return bI.wrap(function(Wg) {
for (; ; ) switch (Wg.prev = Wg.next) {
case 0:
if (g = I.slideContent, C = I.slideLayoutContent, i = I.slideMasterContent, e = U(g, ["p:sld", "p:cSld", "p:bg", "p:bgPr"]), A = U(g, ["p:sld", "p:cSld", "p:bg", "p:bgRef"]), s = "#fff", l = "color", !e) {
Wg.next = 32;
break;
}
if ((n = Hs(e)) !== "SOLID_FILL") {
Wg.next = 17;
break;
}
a = e["a:solidFill"], (o = U(g, ["p:sld", "p:clrMapOvr", "a:overrideClrMapping", "attrs"])) ? d = o : (c = U(C, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]), d = c || U(i, ["p:sldMaster", "p:clrMap", "attrs"])), r = eC(a, d, void 0, I), s = r, Wg.next = 30;
break;
case 17:
if (n !== "GRADIENT_FILL") {
Wg.next = 22;
break;
}
typeof (h = Lr(e, void 0, i, I)) == "string" ? s = h : h && (s = h, l = "gradient"), Wg.next = 30;
break;
case 22:
if (n !== "PIC_FILL") {
Wg.next = 29;
break;
}
return Wg.next = 25, zu(e, "slideBg", I);
case 25:
s = Wg.sent, l = "image", Wg.next = 30;
break;
case 29:
n === "PATTERN_FILL" && (b = Eo(e, I)) && (s = b, l = "pattern");
case 30:
Wg.next = 157;
break;
case 32:
if (!A) {
Wg.next = 40;
break;
}
(m = U(g, ["p:sld", "p:clrMapOvr", "a:overrideClrMapping", "attrs"])) ? u = m : (Z = U(C, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]), u = Z || U(i, ["p:sldMaster", "p:clrMap", "attrs"])), p = eC(A, u, void 0, I), (Y = Number(A.attrs.idx)) > 1e3 && (R = Y - 1e3, X = I.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:bgFillStyleLst"], H = [], Object.keys(X).forEach(function(Ng) {
var wg = X[Ng];
if (Ng !== "attrs") if (wg.constructor === Array) for (var fg = 0; fg < wg.length; fg++) {
var Jg = {};
Jg[Ng] = wg[fg], wg[fg].attrs && (Jg.idex = wg[fg].attrs.order, Jg.attrs = { order: wg[fg].attrs.order }), H.push(Jg);
}
else {
var zg = {};
zg[Ng] = wg, wg.attrs && (zg.idex = wg.attrs.order, zg.attrs = { order: wg.attrs.order }), H.push(zg);
}
}), (S = H.slice(0)).sort(function(Ng, wg) {
return Ng.idex - wg.idex;
}), z = S[R - 1], (v = Hs(z)) === "SOLID_FILL" ? (K = z["a:solidFill"], V = eC(K, u, void 0, I), s = V) : v === "GRADIENT_FILL" && (typeof (N = Lr(z, p, i, I)) == "string" ? s = N : N && (s = N, l = "gradient"))), Wg.next = 157;
break;
case 40:
if (e = U(C, ["p:sldLayout", "p:cSld", "p:bg", "p:bgPr"]), A = U(C, ["p:sldLayout", "p:cSld", "p:bg", "p:bgRef"]), G = U(C, ["p:sldLayout", "p:clrMapOvr", "a:overrideClrMapping", "attrs"]), B = G || U(i, ["p:sldMaster", "p:clrMap", "attrs"]), !e) {
Wg.next = 67;
break;
}
if ((w = Hs(e)) !== "SOLID_FILL") {
Wg.next = 52;
break;
}
W = e["a:solidFill"], y = eC(W, B, void 0, I), s = y, Wg.next = 65;
break;
case 52:
if (w !== "GRADIENT_FILL") {
Wg.next = 57;
break;
}
typeof (f = Lr(e, void 0, i, I)) == "string" ? s = f : f && (s = f, l = "gradient"), Wg.next = 65;
break;
case 57:
if (w !== "PIC_FILL") {
Wg.next = 64;
break;
}
return Wg.next = 60, zu(e, "slideLayoutBg", I);
case 60:
s = Wg.sent, l = "image", Wg.next = 65;
break;
case 64:
w === "PATTERN_FILL" && (D = Eo(e, I)) && (s = D, l = "pattern");
case 65:
Wg.next = 157;
break;
case 67:
if (!A) {
Wg.next = 100;
break;
}
if (F = eC(A, B, void 0, I), !((T = Number(A.attrs.idx)) > 1e3)) {
Wg.next = 98;
break;
}
if (Q = T - 1e3, P = I.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:bgFillStyleLst"], L = [], Object.keys(P).forEach(function(Ng) {
var wg = P[Ng];
if (Ng !== "attrs") if (wg.constructor === Array) for (var fg = 0; fg < wg.length; fg++) {
var Jg = {};
Jg[Ng] = wg[fg], wg[fg].attrs && (Jg.idex = wg[fg].attrs.order, Jg.attrs = { order: wg[fg].attrs.order }), L.push(Jg);
}
else {
var zg = {};
zg[Ng] = wg, wg.attrs && (zg.idex = wg.attrs.order, zg.attrs = { order: wg.attrs.order }), L.push(zg);
}
}), (E = L.slice(0)).sort(function(Ng, wg) {
return Ng.idex - wg.idex;
}), J = E[Q - 1], (k = Hs(J)) !== "SOLID_FILL") {
Wg.next = 85;
break;
}
j = J["a:solidFill"], q = eC(j, B, void 0, I), s = q, Wg.next = 98;
break;
case 85:
if (k !== "GRADIENT_FILL") {
Wg.next = 90;
break;
}
typeof (Cg = Lr(J, F, i, I)) == "string" ? s = Cg : Cg && (s = Cg, l = "gradient"), Wg.next = 98;
break;
case 90:
if (k !== "PIC_FILL") {
Wg.next = 97;
break;
}
return Wg.next = 93, zu(J, "themeBg", I);
case 93:
s = Wg.sent, l = "image", Wg.next = 98;
break;
case 97:
k === "PATTERN_FILL" && (Ig = Eo(J, I)) && (s = Ig, l = "pattern");
case 98:
Wg.next = 157;
break;
case 100:
if (e = U(i, ["p:sldMaster", "p:cSld", "p:bg", "p:bgPr"]), A = U(i, ["p:sldMaster", "p:cSld", "p:bg", "p:bgRef"]), x = U(i, ["p:sldMaster", "p:clrMap", "attrs"]), !e) {
Wg.next = 126;
break;
}
if ((Ag = Hs(e)) !== "SOLID_FILL") {
Wg.next = 111;
break;
}
eg = e["a:solidFill"], O = eC(eg, x, void 0, I), s = O, Wg.next = 124;
break;
case 111:
if (Ag !== "GRADIENT_FILL") {
Wg.next = 116;
break;
}
typeof (_ = Lr(e, void 0, i, I)) == "string" ? s = _ : _ && (s = _, l = "gradient"), Wg.next = 124;
break;
case 116:
if (Ag !== "PIC_FILL") {
Wg.next = 123;
break;
}
return Wg.next = 119, zu(e, "slideMasterBg", I);
case 119:
s = Wg.sent, l = "image", Wg.next = 124;
break;
case 123:
Ag === "PATTERN_FILL" && (gg = Eo(e, I)) && (s = gg, l = "pattern");
case 124:
Wg.next = 157;
break;
case 126:
if (!A) {
Wg.next = 157;
break;
}
if (lg = eC(A, x, void 0, I), !((ng = Number(A.attrs.idx)) > 1e3)) {
Wg.next = 157;
break;
}
if (sg = ng - 1e3, og = I.themeContent["a:theme"]["a:themeElements"]["a:fmtScheme"]["a:bgFillStyleLst"], cg = [], Object.keys(og).forEach(function(Ng) {
var wg = og[Ng];
if (Ng !== "attrs") if (wg.constructor === Array) for (var fg = 0; fg < wg.length; fg++) {
var Jg = {};
Jg[Ng] = wg[fg], wg[fg].attrs && (Jg.idex = wg[fg].attrs.order, Jg.attrs = { order: wg[fg].attrs.order }), cg.push(Jg);
}
else {
var zg = {};
zg[Ng] = wg, wg.attrs && (zg.idex = wg.attrs.order, zg.attrs = { order: wg.attrs.order }), cg.push(zg);
}
}), (rg = cg.slice(0)).sort(function(Ng, wg) {
return Ng.idex - wg.idex;
}), dg = rg[sg - 1], (Bg = Hs(dg)) !== "SOLID_FILL") {
Wg.next = 144;
break;
}
Zg = dg["a:solidFill"], Xg = eC(Zg, B, void 0, I), s = Xg, Wg.next = 157;
break;
case 144:
if (Bg !== "GRADIENT_FILL") {
Wg.next = 149;
break;
}
typeof (Kg = Lr(dg, lg, i, I)) == "string" ? s = Kg : Kg && (s = Kg, l = "gradient"), Wg.next = 157;
break;
case 149:
if (Bg !== "PIC_FILL") {
Wg.next = 156;
break;
}
return Wg.next = 152, zu(dg, "themeBg", I);
case 152:
s = Wg.sent, l = "image", Wg.next = 157;
break;
case 156:
Bg === "PATTERN_FILL" && (kg = Eo(dg, I)) && (s = kg, l = "pattern");
case 157:
return Wg.abrupt("return", { type: l, value: s });
case 158:
case "end":
return Wg.stop();
}
}, t);
})), VD.apply(this, arguments);
}
function jtg(t, I, g, C, i) {
return MD.apply(this, arguments);
}
function MD() {
return MD = SC(bI.mark(function t(I, g, C, i, e) {
var A, s, l, n, a, d, o, c, r, h, b, u = arguments;
return bI.wrap(function(m) {
for (; ; ) switch (m.prev = m.next) {
case 0:
if (A = u.length > 5 && u[5] !== void 0 ? u[5] : [], s = Hs(U(I, ["p:spPr"])), l = "color", n = "", s !== "NO_FILL") {
m.next = 8;
break;
}
return m.abrupt("return", C ? "none" : "");
case 8:
if (s !== "SOLID_FILL") {
m.next = 14;
break;
}
a = I["p:spPr"]["a:solidFill"], n = eC(a, void 0, void 0, i), l = "color", m.next = 38;
break;
case 14:
if (s !== "GRADIENT_FILL") {
m.next = 20;
break;
}
d = I["p:spPr"]["a:gradFill"], n = j9(d, i), l = "gradient", m.next = 38;
break;
case 20:
if (s !== "PIC_FILL") {
m.next = 30;
break;
}
return o = I["p:spPr"]["a:blipFill"], m.next = 24, rM(e, o, i);
case 24:
c = m.sent, r = Ttg(o), n = { picBase64: c, opacity: r }, l = "image", m.next = 38;
break;
case 30:
if (s !== "PATTERN_FILL") {
m.next = 36;
break;
}
h = I["p:spPr"]["a:pattFill"], n = Eo({ "a:pattFill": h }, i), l = "pattern", m.next = 38;
break;
case 36:
if (s !== "GROUP_FILL") {
m.next = 38;
break;
}
return m.abrupt("return", obg(A, i, e));
case 38:
if (n || (b = U(I, ["p:style", "a:fillRef"]), n = eC(b, void 0, void 0, i), l = "color"), n || !g || s !== "NO_FILL") {
m.next = 41;
break;
}
return m.abrupt("return", C ? "none" : "");
case 41:
return m.abrupt("return", { type: l, value: n });
case 42:
case "end":
return m.stop();
}
}, t);
})), MD.apply(this, arguments);
}
function obg(t, I, g) {
return RD.apply(this, arguments);
}
function RD() {
return RD = SC(bI.mark(function t(I, g, C) {
var i, e, A, s, l, n, a, d, o, c, r, h, b;
return bI.wrap(function(u) {
for (; ; ) switch (u.prev = u.next) {
case 0:
i = I.length - 1;
case 1:
if (!(i >= 0)) {
u.next = 39;
break;
}
if ((e = I[i]) && e["p:grpSpPr"]) {
u.next = 5;
break;
}
return u.abrupt("continue", 36);
case 5:
if (A = e["p:grpSpPr"], (s = Hs(A)) !== "SOLID_FILL") {
u.next = 14;
break;
}
if (l = A["a:solidFill"], !(n = eC(l, void 0, void 0, g))) {
u.next = 12;
break;
}
return u.abrupt("return", { type: "color", value: n });
case 12:
u.next = 36;
break;
case 14:
if (s !== "GRADIENT_FILL") {
u.next = 21;
break;
}
if (a = A["a:gradFill"], !(d = j9(a, g))) {
u.next = 19;
break;
}
return u.abrupt("return", { type: "gradient", value: d });
case 19:
u.next = 36;
break;
case 21:
if (s !== "PIC_FILL") {
u.next = 31;
break;
}
return o = A["a:blipFill"], u.next = 25, rM(C, o, g);
case 25:
if (c = u.sent, r = Ttg(o), !c) {
u.next = 29;
break;
}
return u.abrupt("return", { type: "image", value: { picBase64: c, opacity: r } });
case 29:
u.next = 36;
break;
case 31:
if (s !== "PATTERN_FILL") {
u.next = 36;
break;
}
if (h = A["a:pattFill"], !(b = Eo({ "a:pattFill": h }, g))) {
u.next = 36;
break;
}
return u.abrupt("return", { type: "pattern", value: b });
case 36:
i--, u.next = 1;
break;
case 39:
return u.abrupt("return", null);
case 40:
case "end":
return u.stop();
}
}, t);
})), RD.apply(this, arguments);
}
function eC(t, I, g, C) {
if (!t) return "";
var i, e, A, s = "";
if (t["a:srgbClr"]) s = U(i = t["a:srgbClr"], ["attrs", "val"]);
else if (t["a:schemeClr"])
s = YD("a:" + U(i = t["a:schemeClr"], ["attrs", "val"]), C, I, g) || "";
else if (t["a:scrgbClr"]) {
var l = (i = t["a:scrgbClr"]).attrs, n = l.r.indexOf("%") !== -1 ? l.r.split("%").shift() : l.r, a = l.g.indexOf("%") !== -1 ? l.g.split("%").shift() : l.g, d = l.b.indexOf("%") !== -1 ? l.b.split("%").shift() : l.b;
s = Jr(Number(n) / 100 * 255) + Jr(Number(a) / 100 * 255) + Jr(Number(d) / 100 * 255);
} else if (t["a:prstClr"]) {
var o = U(i = t["a:prstClr"], ["attrs", "val"]);
(A = ["white", "AliceBlue", "AntiqueWhite", "Aqua", "Aquamarine", "Azure", "Beige", "Bisque", "black", "BlanchedAlmond", "Blue", "BlueViolet", "Brown", "BurlyWood", "CadetBlue", "Chartreuse", "Chocolate", "Coral", "CornflowerBlue", "Cornsilk", "Crimson", "Cyan", "DarkBlue", "DarkCyan", "DarkGoldenRod", "DarkGray", "DarkGrey", "DarkGreen", "DarkKhaki", "DarkMagenta", "DarkOliveGreen", "DarkOrange", "DarkOrchid", "DarkRed", "DarkSalmon", "DarkSeaGreen", "DarkSlateBlue", "DarkSlateGray", "DarkSlateGrey", "DarkTurquoise", "DarkViolet", "DeepPink", "DeepSkyBlue", "DimGray", "DimGrey", "DodgerBlue", "FireBrick", "FloralWhite", "ForestGreen", "Fuchsia", "Gainsboro", "GhostWhite", "Gold", "GoldenRod", "Gray", "Grey", "Green", "GreenYellow", "HoneyDew", "HotPink", "IndianRed", "Indigo", "Ivory", "Khaki", "Lavender", "LavenderBlush", "LawnGreen", "LemonChiffon", "LightBlue", "LightCoral", "LightCyan", "LightGoldenRodYellow", "LightGray", "LightGrey", "LightGreen", "LightPink", "LightSalmon", "LightSeaGreen", "LightSkyBlue", "LightSlateGray", "LightSlateGrey", "LightSteelBlue", "LightYellow", "Lime", "LimeGreen", "Linen", "Magenta", "Maroon", "MediumAquaMarine", "MediumBlue", "MediumOrchid", "MediumPurple", "MediumSeaGreen", "MediumSlateBlue", "MediumSpringGreen", "MediumTurquoise", "MediumVioletRed", "MidnightBlue", "MintCream", "MistyRose", "Moccasin", "NavajoWhite", "Navy", "OldLace", "Olive", "OliveDrab", "Orange", "OrangeRed", "Orchid", "PaleGoldenRod", "PaleGreen", "PaleTurquoise", "PaleVioletRed", "PapayaWhip", "PeachPuff", "Peru", "Pink", "Plum", "PowderBlue", "Purple", "RebeccaPurple", "Red", "RosyBrown", "RoyalBlue", "SaddleBrown", "Salmon", "SandyBrown", "SeaGreen", "SeaShell", "Sienna", "Silver", "SkyBlue", "SlateBlue", "SlateGray", "SlateGrey", "Snow", "SpringGreen", "SteelBlue", "Tan", "Teal", "Thistle", "Tomato", "Turquoise", "Violet", "Wheat", "White", "WhiteSmoke", "Yellow", "YellowGreen"].indexOf(o)) !== -1 && (e = ["ffffff", "f0f8ff", "faebd7", "00ffff", "7fffd4", "f0ffff", "f5f5dc", "ffe4c4", "000000", "ffebcd", "0000ff", "8a2be2", "a52a2a", "deb887", "5f9ea0", "7fff00", "d2691e", "ff7f50", "6495ed", "fff8dc", "dc143c", "00ffff", "00008b", "008b8b", "b8860b", "a9a9a9", "a9a9a9", "006400", "bdb76b", "8b008b", "556b2f", "ff8c00", "9932cc", "8b0000", "e9967a", "8fbc8f", "483d8b", "2f4f4f", "2f4f4f", "00ced1", "9400d3", "ff1493", "00bfff", "696969", "696969", "1e90ff", "b22222", "fffaf0", "228b22", "ff00ff", "dcdcdc", "f8f8ff", "ffd700", "daa520", "808080", "808080", "008000", "adff2f", "f0fff0", "ff69b4", "cd5c5c", "4b0082", "fffff0", "f0e68c", "e6e6fa", "fff0f5", "7cfc00", "fffacd", "add8e6", "f08080", "e0ffff", "fafad2", "d3d3d3", "d3d3d3", "90ee90", "ffb6c1", "ffa07a", "20b2aa", "87cefa", "778899", "778899", "b0c4de", "ffffe0", "00ff00", "32cd32", "faf0e6", "ff00ff", "800000", "66cdaa", "0000cd", "ba55d3", "9370db", "3cb371", "7b68ee", "00fa9a", "48d1cc", "c71585", "191970", "f5fffa", "ffe4e1", "ffe4b5", "ffdead", "000080", "fdf5e6", "808000", "6b8e23", "ffa500", "ff4500", "da70d6", "eee8aa", "98fb98", "afeeee", "db7093", "ffefd5", "ffdab9", "cd853f", "ffc0cb", "dda0dd", "b0e0e6", "800080", "663399", "ff0000", "bc8f8f", "4169e1", "8b4513", "fa8072", "f4a460", "2e8b57", "fff5ee", "a0522d", "c0c0c0", "87ceeb", "6a5acd", "708090", "708090", "fffafa", "00ff7f", "4682b4", "d2b48c", "008080", "d8bfd8", "ff6347", "40e0d0", "ee82ee", "f5deb3", "ffffff", "f5f5f5", "ffff00", "9acd32"][A]), s = e;
} else if (t["a:hslClr"]) {
var c = (i = t["a:hslClr"]).attrs, r = function(S, z, v) {
var K, V = 2 * v - (K = v <= 0.5 ? v * (z + 1) : v + z - v * z);
return { r: 255 * KX(V, K, 2 + (S /= 60)), g: 255 * KX(V, K, S), b: 255 * KX(V, K, S - 2) };
}(Number(c.hue) / 1e5, Number(c.sat.indexOf("%") !== -1 ? c.sat.split("%").shift() : c.sat) / 100, Number(c.lum.indexOf("%") !== -1 ? c.lum.split("%").shift() : c.lum) / 100);
s = Jr(r.r) + Jr(r.g) + Jr(r.b);
} else if (t["a:sysClr"]) {
var h = U(i = t["a:sysClr"], ["attrs", "lastClr"]);
h && (s = h);
}
var b = !1, u = parseInt(U(i, ["a:alpha", "attrs", "val"])) / 1e5;
if (!isNaN(u)) {
var m = Qg(s);
m.setAlpha(u), s = m.toHex8(), b = !0;
}
var Z = parseInt(U(i, ["a:hueMod", "attrs", "val"])) / 1e5;
isNaN(Z) || (s = function(S, z, v) {
var K = Qg(S).toHsl(), V = K.h * z;
return V >= 360 && (V -= 360), v ? Qg({ h: V, s: K.s, l: K.l, a: K.a }).toHex8() : Qg({ h: V, s: K.s, l: K.l, a: K.a }).toHex();
}(s, Z, b));
var p = parseInt(U(i, ["a:lumMod", "attrs", "val"])) / 1e5;
isNaN(p) || (s = function(S, z, v) {
var K = Qg(S).toHsl(), V = K.l * z;
return V >= 1 && (V = 1), v ? Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex();
}(s, p, b));
var Y = parseInt(U(i, ["a:lumOff", "attrs", "val"])) / 1e5;
isNaN(Y) || (s = function(S, z, v) {
var K = Qg(S).toHsl(), V = z + K.l;
return V >= 1 ? v ? Qg({ h: K.h, s: K.s, l: 1, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: 1, a: K.a }).toHex() : v ? Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex();
}(s, Y, b));
var R = parseInt(U(i, ["a:satMod", "attrs", "val"])) / 1e5;
isNaN(R) || (s = function(S, z, v) {
var K = Qg(S).toHsl(), V = K.s * z;
return V >= 1 && (V = 1), v ? Qg({ h: K.h, s: V, l: K.l, a: K.a }).toHex8() : Qg({ h: K.h, s: V, l: K.l, a: K.a }).toHex();
}(s, R, b));
var X = parseInt(U(i, ["a:shade", "attrs", "val"])) / 1e5;
isNaN(X) || (s = function(S, z, v) {
var K = Qg(S).toHsl();
z >= 1 && (z = 1);
var V = Math.min(K.l * z, 1);
return v ? Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex8() : Qg({ h: K.h, s: K.s, l: V, a: K.a }).toHex();
}(s, X, b));
var H = parseInt(U(i, ["a:tint", "attrs", "val"])) / 1e5;
return isNaN(H) || (s = vtg(s, H, b)), s && s.indexOf("#") === -1 && (s = "#" + s), s;
}
function cbg(t, I) {
var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
if (!g) {
if (Array.isArray(t) || (g = function(l, n) {
if (l) {
if (typeof l == "string") return hq(l, n);
var a = Object.prototype.toString.call(l).slice(8, -1);
if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return hq(l, n);
}
}(t)) || I) {
g && (t = g);
var C = 0, i = function() {
};
return { s: i, n: function() {
return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
}, e: function(l) {
throw l;
}, f: i };
}
throw new TypeError(`Invalid attempt to iterate non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
}
var e, A = !0, s = !1;
return { s: function() {
g = g.call(t);
}, n: function() {
var l = g.next();
return A = l.done, l;
}, e: function(l) {
s = !0, e = l;
}, f: function() {
try {
A || g.return == null || g.return();
} finally {
if (s) throw e;
}
} };
}
function hq(t, I) {
(I == null || I > t.length) && (I = t.length);
for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
return C;
}
function Li(t, I) {
t.constructor !== Array && (t = [t]);
var g, C = [], i = cbg(t);
try {
for (i.s(); !(g = i.n()).done; ) {
var e = g.value, A = U(e, ["c:spPr", "a:solidFill", "a:schemeClr"]);
A || (A = U(e, ["c:spPr", "a:ln", "a:solidFill", "a:schemeClr"])), A || (A = U(e, ["c:marker", "c:spPr", "a:ln", "a:solidFill", "a:schemeClr"]));
var s = U(A, ["attrs", "val"]);
if (s) {
s = U(I.themeContent, ["a:theme", "a:themeElements", "a:clrScheme", "a:".concat(s), "a:srgbClr", "attrs", "val"]);
var l = U(A, ["a:tint", "attrs", "val"]) / 1e5;
s && !isNaN(l) && (s = vtg(s, l));
} else s = U(e, ["c:spPr", "a:solidFill", "a:srgbClr", "attrs", "val"]);
s && (s = "#" + s), C.push(s);
}
} catch (n) {
i.e(n);
} finally {
i.f();
}
return C;
}
function yi(t) {
var I = [];
if (!t) return I;
if (t["c:xVal"]) {
var g = [];
zr(t["c:xVal"]["c:numRef"]["c:numCache"]["c:pt"], function(C) {
return g.push(parseFloat(C["c:v"])), "";
}), I.push(g), g = [], zr(t["c:yVal"]["c:numRef"]["c:numCache"]["c:pt"], function(C) {
return g.push(parseFloat(C["c:v"])), "";
}), I.push(g);
} else zr(t, function(C, i) {
var e = [], A = U(C, ["c:tx", "c:strRef", "c:strCache", "c:pt", "c:v"]) || i, s = {};
return U(C, ["c:cat", "c:strRef", "c:strCache", "c:pt"]) ? zr(C["c:cat"]["c:strRef"]["c:strCache"]["c:pt"], function(l) {
return s[l.attrs.idx] = l["c:v"], "";
}) : U(C, ["c:cat", "c:numRef", "c:numCache", "c:pt"]) && zr(C["c:cat"]["c:numRef"]["c:numCache"]["c:pt"], function(l) {
return s[l.attrs.idx] = l["c:v"], "";
}), U(C, ["c:val", "c:numRef", "c:numCache", "c:pt"]) && zr(C["c:val"]["c:numRef"]["c:numCache"]["c:pt"], function(l) {
return e.push({ x: l.attrs.idx, y: parseFloat(l["c:v"]) }), "";
}), I.push({ key: A, values: e, xlabels: s }), "";
});
return I;
}
function dbg(t, I) {
var g = null;
for (var C in t) switch (C) {
case "c:lineChart":
g = { type: "lineChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]), marker: !!t[C]["c:marker"] };
break;
case "c:line3DChart":
g = { type: "line3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]) };
break;
case "c:barChart":
g = { type: "barChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]), barDir: U(t[C], ["c:barDir", "attrs", "val"]) };
break;
case "c:bar3DChart":
g = { type: "bar3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]), barDir: U(t[C], ["c:barDir", "attrs", "val"]) };
break;
case "c:pieChart":
g = { type: "pieChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"]["c:dPt"], I) };
break;
case "c:pie3DChart":
g = { type: "pie3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"]["c:dPt"], I) };
break;
case "c:doughnutChart":
g = { type: "doughnutChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"]["c:dPt"], I), holeSize: U(t[C], ["c:holeSize", "attrs", "val"]) };
break;
case "c:areaChart":
g = { type: "areaChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]) };
break;
case "c:area3DChart":
g = { type: "area3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), grouping: U(t[C], ["c:grouping", "attrs", "val"]) };
break;
case "c:scatterChart":
g = { type: "scatterChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), style: U(t[C], ["c:scatterStyle", "attrs", "val"]) };
break;
case "c:bubbleChart":
g = { type: "bubbleChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I) };
break;
case "c:radarChart":
g = { type: "radarChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I), style: U(t[C], ["c:radarStyle", "attrs", "val"]) };
break;
case "c:surfaceChart":
g = { type: "surfaceChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I) };
break;
case "c:surface3DChart":
g = { type: "surface3DChart", data: yi(t[C]["c:ser"]), colors: Li(t[C]["c:ser"], I) };
break;
case "c:stockChart":
g = { type: "stockChart", data: yi(t[C]["c:ser"]), colors: [] };
}
return g;
}
function rbg(t, I, g, C) {
var i = U(t, ["a:pPr", "attrs", "algn"]);
if (i || (i = U(I, ["a:pPr", "attrs", "algn"])), !i) if (g === "title" || g === "ctrTitle" || g === "subTitle") {
var e = 1, A = U(I, ["a:pPr", "attrs", "lvl"]);
A && (e = parseInt(A) + 1);
var s = "a:lvl" + e + "pPr";
(i = U(C, ["slideLayoutTables", "typeTable", g, "p:txBody", "a:lstStyle", s, "attrs", "algn"])) || (i = U(C, ["slideMasterTables", "typeTable", g, "p:txBody", "a:lstStyle", s, "attrs", "algn"])), i || (i = U(C, ["slideMasterTextStyles", "p:titleStyle", s, "attrs", "algn"])), i || g !== "subTitle" || (i = U(C, ["slideMasterTextStyles", "p:bodyStyle", s, "attrs", "algn"]));
} else i = U(C, g === "body" ? ["slideMasterTextStyles", "p:bodyStyle", "a:lvl1pPr", "attrs", "algn"] : ["slideMasterTables", "typeTable", g, "p:txBody", "a:lstStyle", "a:lvl1pPr", "attrs", "algn"]);
var l = "left";
if (i) switch (i) {
case "l":
l = "left";
break;
case "r":
l = "right";
break;
case "ctr":
l = "center";
break;
case "just":
case "dist":
l = "justify";
break;
default:
l = "inherit";
}
return l;
}
function hbg(t, I, g) {
var C = U(t, ["p:txBody", "a:bodyPr", "attrs", "anchor"]);
return C || (C = U(I, ["p:txBody", "a:bodyPr", "attrs", "anchor"])) || (C = U(g, ["p:txBody", "a:bodyPr", "attrs", "anchor"])) || (C = "t"), C === "ctr" ? "mid" : C === "b" ? "down" : "up";
}
function bbg(t, I, g) {
function C(s) {
if (!s) return null;
if (s["a:noAutofit"]) return { result: null };
if (s["a:spAutoFit"]) return { result: { type: "shape" } };
if (s["a:normAutofit"]) {
var l = U(s["a:normAutofit"], ["attrs", "fontScale"]);
return l ? { result: { type: "text", fontScale: parseInt(l) / 1e3 } } : { result: { type: "text" } };
}
return null;
}
var i = C(U(t, ["p:txBody", "a:bodyPr"]));
if (i) return i.result;
var e = C(U(I, ["p:txBody", "a:bodyPr"]));
if (e) return e.result;
var A = C(U(g, ["p:txBody", "a:bodyPr"]));
return A ? A.result : null;
}
var Gg = 72 / 914400;
function f0(t, I, g) {
var C;
return t ? C = t["a:off"].attrs : I ? C = I["a:off"].attrs : g && (C = g["a:off"].attrs), C ? { top: Lt(parseInt(C.y) * Gg), left: Lt(parseInt(C.x) * Gg) } : { top: 0, left: 0 };
}
function H0(t, I, g) {
var C;
return t ? C = t["a:ext"].attrs : I ? C = I["a:ext"].attrs : g && (C = g["a:ext"].attrs), C ? { width: Lt(parseInt(C.cx) * Gg), height: Lt(parseInt(C.cy) * Gg) } : { width: 0, height: 0 };
}
function ubg(t, I) {
return function(g) {
if (Array.isArray(g)) return g;
}(t) || function(g, C) {
var i = g == null ? null : typeof Symbol < "u" && g[Symbol.iterator] || g["@@iterator"];
if (i != null) {
var e, A, s = [], l = !0, n = !1;
try {
for (i = i.call(g); !(l = (e = i.next()).done) && (s.push(e.value), !C || s.length !== C); l = !0) ;
} catch (a) {
n = !0, A = a;
} finally {
try {
l || i.return == null || i.return();
} finally {
if (n) throw A;
}
}
return s;
}
}(t, I) || tCg(t, I) || function() {
throw new TypeError(`Invalid attempt to destructure non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
}();
}
function Qtg(t, I) {
var g = eC(t, void 0, void 0, I), C = t.attrs, i = C.dir ? parseInt(C.dir) / 6e4 : 0, e = C.dist ? parseInt(C.dist) * Gg : 0, A = C.blurRad ? parseInt(C.blurRad) * Gg : "", s = e * Math.sin(i * Math.PI / 180);
return { h: e * Math.cos(i * Math.PI / 180), v: s, blur: A, color: g };
}
function bq(t, I) {
var g = Object.keys(t);
if (Object.getOwnPropertySymbols) {
var C = Object.getOwnPropertySymbols(t);
I && (C = C.filter(function(i) {
return Object.getOwnPropertyDescriptor(t, i).enumerable;
})), g.push.apply(g, C);
}
return g;
}
function os(t) {
for (var I = 1; I < arguments.length; I++) {
var g = arguments[I] != null ? arguments[I] : {};
I % 2 ? bq(Object(g), !0).forEach(function(C) {
f9(t, C, g[C]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(g)) : bq(Object(g)).forEach(function(C) {
Object.defineProperty(t, C, Object.getOwnPropertyDescriptor(g, C));
});
}
return t;
}
function uq(t, I) {
var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
if (!g) {
if (Array.isArray(t) || (g = function(l, n) {
if (l) {
if (typeof l == "string") return mq(l, n);
var a = Object.prototype.toString.call(l).slice(8, -1);
if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return mq(l, n);
}
}(t)) || I) {
g && (t = g);
var C = 0, i = function() {
};
return { s: i, n: function() {
return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
}, e: function(l) {
throw l;
}, f: i };
}
throw new TypeError(`Invalid attempt to iterate non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
}
var e, A = !0, s = !1;
return { s: function() {
g = g.call(t);
}, n: function() {
var l = g.next();
return A = l.done, l;
}, e: function(l) {
s = !0, e = l;
}, f: function() {
try {
A || g.return == null || g.return();
} finally {
if (s) throw e;
}
} };
}
function mq(t, I) {
(I == null || I > t.length) && (I = t.length);
for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
return C;
}
function BV(t, I, g, C, i) {
if (!t) return "";
var e, A = "", s = U(I, ["p:style", "a:fontRef"]), l = t["a:p"], n = l.constructor === Array ? l : [l], a = null, d = /* @__PURE__ */ new Map(), o = uq(n);
try {
for (o.s(); !(e = o.n()).done; ) {
var c = e.value, r = c["a:r"], h = c["a:fld"], b = c["a:br"];
r && (r = r.constructor === Array ? r : [r], h && (h = h.constructor === Array ? h : [h], r = r.concat(h)), b && ((b = b.constructor === Array ? b : [b]).forEach(function(G) {
return G.type = "br";
}), b.length > 1 && b.shift(), (r = r.concat(b)).sort(function(G, w) {
return !G.attrs || !w.attrs || G.attrs.order - w.attrs.order;
})));
var u = rbg(c, I, C, i), m = mbg(c, t, g, C, i);
if (m) {
var Z = Zbg(m);
if (!a || a.key !== Z) {
a && (A += "".concat(a.tag, ">")), A += "<".concat(m.tag, ' style="list-style: none; padding-left: 0; margin: 0;">');
var p = m.kind === "autoNum" ? d.has(Z) ? d.get(Z) : m.startAt : null;
a = { key: Z, tag: m.tag, listInfo: m, counter: p };
}
var Y = wbg(a);
a.listInfo.kind === "autoNum" && d.set(a.key, a.counter);
var R = Gbg(a.listInfo), X = 1.5 * (m.lvl - 1);
A += '
').concat(Y, "");
} else a && (A += "".concat(a.tag, ">"), a = null, d.clear()), A += '
');
if (r) {
var H, S = null, z = "", v = uq(r);
try {
for (v.s(); !(H = v.n()).done; ) {
var K = Otg(H.value, c, t, s, g, C, i);
if (!S || S.styleText !== K.styleText || S.hasLink !== K.hasLink || K.hasLink) {
if (z) {
var V = z.replace(/\t/g, " ").replace(/\s/g, " ");
A += '').concat(V, ""), z = "";
}
if (K.hasLink) {
var N = K.text.replace(/\t/g, " ").replace(/\s/g, " ");
A += '').concat(N, ""), S = null;
} else S = K, z = K.text;
} else z += K.text;
}
} catch (G) {
v.e(G);
} finally {
v.f();
}
if (z && S) {
var B = z.replace(/\t/g, " ").replace(/\s/g, " ");
A += '').concat(B, "");
}
} else A += pbg(c, I, t, s, g, C, i);
A += m ? "
" : "
";
}
} catch (G) {
o.e(G);
} finally {
o.f();
}
return a && (A += "".concat(a.tag, ">")), A;
}
function mbg(t, I, g, C, i) {
var e = t["a:pPr"];
if (!e || e["a:buNone"]) return null;
var A = 1, s = U(e, ["attrs", "lvl"]);
s !== void 0 && (A = parseInt(s) + 1);
var l = Ju(e);
if (l) return os(os({}, l), {}, { lvl: A });
var n = Ju(U(I, ["a:lstStyle", "a:lvl".concat(A, "pPr")]));
if (n) return os(os({}, n), {}, { lvl: A });
var a = Ju(U(g, ["p:txBody", "a:lstStyle", "a:lvl".concat(A, "pPr")]));
if (a) return os(os({}, a), {}, { lvl: A });
var d = i && i.slideMasterTextStyles;
if (d) {
var o = function(h, b) {
return b ? h === "title" || h === "ctrTitle" ? "p:titleStyle" : h === "subTitle" ? b["p:titleStyle"] ? "p:titleStyle" : "p:bodyStyle" : h === "body" ? "p:bodyStyle" : "p:otherStyle" : null;
}(C, d);
if (o) {
var c = Ju(U(d, [o, "a:lvl".concat(A, "pPr")]));
if (c) return os(os({}, c), {}, { lvl: A });
var r = Ju(U(d, [o, "a:lvl1pPr"]));
if (r) return os(os({}, r), {}, { lvl: A });
}
}
return null;
}
function Ju(t) {
if (!t || t["a:buNone"]) return null;
if (t["a:buChar"]) return { kind: "char", tag: "ul", char: U(t, ["a:buChar", "attrs", "char"]) || "•", font: U(t, ["a:buFont", "attrs", "typeface"]) || "" };
if (t["a:buAutoNum"]) {
var I = t["a:buAutoNum"], g = U(I, ["attrs", "type"]) || "arabicPeriod", C = U(I, ["attrs", "startAt"]), i = C ? parseInt(C) : 1, e = U(t, ["a:buFont", "attrs", "typeface"]) || "";
return { kind: "autoNum", tag: "ol", numType: g, startAt: isNaN(i) ? 1 : i, font: e };
}
return null;
}
function Zbg(t) {
return t ? t.kind === "autoNum" ? "".concat(t.tag, ":").concat(t.kind, ":").concat(t.numType, ":").concat(t.startAt, ":").concat(t.lvl, ":").concat(t.font) : "".concat(t.tag, ":").concat(t.kind, ":").concat(t.char, ":").concat(t.lvl, ":").concat(t.font) : "";
}
function Gbg(t) {
var I = "display: inline-block; min-width: 1.4em; margin-right: 0.4em;";
return t.font && (I += "font-family: ".concat(t.font, ";")), I;
}
function wbg(t) {
var I = t.listInfo;
if (I.kind === "char") return pV(I.char);
var g = t.counter;
return t.counter += 1, pV(function(C, i) {
if (/circle/i.test(i)) return function(d) {
var o = parseInt(d);
return isNaN(o) || o <= 0 ? String(d) : o >= 1 && o <= 20 ? String.fromCharCode(o - 1 + 9312) : o >= 21 && o <= 35 ? String.fromCharCode(o - 21 + 12881) : o >= 36 && o <= 50 ? String.fromCharCode(o - 36 + 12977) : String(o);
}(C);
var e, A = String(i || "").toLowerCase(), s = A.includes("chs") || A.includes("cht"), l = i.includes("ParenBoth"), n = "";
if (l || (i.includes("ParenR") ? n = ")" : i.includes("Period") ? n = "." : i.includes("Comma") && (n = ",")), e = i.includes("alphaLc") ? Zq(C, !1) : i.includes("alphaUc") ? Zq(C, !0) : i.includes("romanLc") ? Gq(C, !1) : i.includes("romanUc") ? Gq(C, !0) : s ? function(d, o, c) {
var r = parseInt(d);
if (isNaN(r) || r <= 0) return String(d);
var h = c ? ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"] : ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"], b = c ? ["", "拾", "佰", "仟"] : ["", "十", "百", "千"], u = o ? ["", "萬", "億", "兆"] : ["", "万", "亿", "兆"], m = function(S) {
var z = S % 1e4;
if (z === 0) return "";
for (var v = [], K = [Math.floor(z / 1e3), Math.floor(z % 1e3 / 100), Math.floor(z % 100 / 10), z % 10], V = [b[3], b[2], b[1], b[0]], N = !1, B = 0; B < K.length; B++) {
var G = K[B], w = V[B], W = B === K.length - 1;
G !== 0 ? (N && (v.push(h[0]), N = !1), w === b[1] && G === 1 && v.length === 0 ? v.push(w) : v.push(h[G] + w)) : !W && v.length && K.slice(B + 1).some(function(y) {
return y !== 0;
}) && (N = !0);
}
return v.join("");
};
if (r < 1e4) return m(r);
for (var Z = [], p = r; p > 0; ) Z.push(p % 1e4), p = Math.floor(p / 1e4);
for (var Y = "", R = Z.length - 1; R >= 0; R--) {
var X = Z[R];
if (X !== 0) {
if (Y) {
var H = Y.endsWith(h[0]);
!H && X < 1e3 && (Y += h[0]), H && X >= 1e3 && (Y = Y.slice(0, -h[0].length));
}
Y += m(X) + (u[R] || "");
} else Y && !Y.endsWith(h[0]) && (Y += h[0]);
}
return (Y = Y.replace(/零+$/g, "")) || h[0];
}(C, A.includes("cht"), A.includes("db")) : String(C), l) return "(".concat(e, ")");
var a = s && n === "." ? "、" : n;
return "".concat(e).concat(a);
}(g, I.numType));
}
function Zq(t, I) {
for (var g = t, C = ""; g > 0; ) g -= 1, C = String.fromCharCode(g % 26 + 65) + C, g = Math.floor(g / 26);
return I ? C : C.toLowerCase();
}
function Gq(t, I) {
for (var g = "", C = Math.max(1, Math.min(3999, t)), i = 0, e = [[1e3, "M"], [900, "CM"], [500, "D"], [400, "CD"], [100, "C"], [90, "XC"], [50, "L"], [40, "XL"], [10, "X"], [9, "IX"], [5, "V"], [4, "IV"], [1, "I"]]; i < e.length; i++) for (var A = ubg(e[i], 2), s = A[0], l = A[1]; C >= s; ) g += l, C -= s;
return I ? g : g.toLowerCase();
}
function pbg(t, I, g, C, i, e, A) {
var s = Otg(t, I, g, C, i, e, A), l = s.styleText, n = s.text, a = s.hasLink, d = s.linkURL, o = n.replace(/\t/g, " ").replace(/\s/g, " ");
return a ? '').concat(o, "") : '').concat(o, "");
}
function Otg(t, I, g, C, i, e, A) {
var s = g["a:lstStyle"], l = A.slideMasterTextStyles, n = 1, a = U(I["a:pPr"], ["attrs", "lvl"]);
a !== void 0 && (n = parseInt(a) + 1);
var d = t["a:t"];
typeof d != "string" && (d = U(t, ["a:fld", "a:t"])), typeof d != "string" && (d = " ");
var o = U(t, ["attrs", "type"]) || U(t, ["a:fld", "attrs", "type"]), c = typeof o == "string" ? o.toLowerCase() : "";
if (c === "slidenum" && A && A.slideNo !== void 0 && A.slideNo !== null) d = String(A.slideNo);
else if (c.startsWith("datetime")) {
var r = typeof d == "string" ? d.replace(/\s+/g, " ").trim() : "";
if (!r || r === "日期" || r.toLowerCase() === "date") {
var h = /* @__PURE__ */ new Date(), b = String(h.getFullYear()), u = String(h.getMonth() + 1).padStart(2, "0"), m = String(h.getDate()).padStart(2, "0");
d = "".concat(b, "-").concat(u, "-").concat(m);
}
}
var Z = typeof d == "string" ? d.replace(/\s+/g, " ").trim() : "";
if (e !== "sldNum" || Z !== "<#>" && Z !== "#" || !A || A.slideNo === void 0 || A.slideNo === null) {
if (e === "dt" && (Z === "日期" || Z.toLowerCase() === "date")) {
var p = /* @__PURE__ */ new Date(), Y = String(p.getFullYear()), R = String(p.getMonth() + 1).padStart(2, "0"), X = String(p.getDate()).padStart(2, "0");
d = "".concat(Y, "-").concat(R, "-").concat(X);
}
} else d = String(A.slideNo);
var H = "", S = function(P, L, E, J, k, j) {
var q, Cg, Ig = U(P, ["a:rPr"]);
if (Ig && ((q = Hs(Ig)) === "SOLID_FILL" && (Cg = eC(Ig["a:solidFill"], void 0, void 0, j)), q === "GRADIENT_FILL")) return j9(Ig["a:gradFill"], j);
if (!Cg && U(E, ["a:lvl" + k + "pPr", "a:defRPr"])) {
var x = U(E, ["a:lvl" + k + "pPr", "a:defRPr"]);
(q = Hs(x)) === "SOLID_FILL" && (Cg = eC(x["a:solidFill"], void 0, void 0, j));
}
if (!Cg) {
var Ag = U(L, ["p:style", "a:fontRef"]);
Ag && (Cg = eC(Ag, void 0, void 0, j)), !Cg && J && (Cg = eC(J, void 0, void 0, j));
}
return Cg || "";
}(t, I, s, C, n, A), z = function(P, L, E, J, k, j, q) {
var Cg, Ig = 1;
if (q) {
var x = U(q, ["a:pPr", "attrs", "lvl"]);
x !== void 0 && (Ig = parseInt(x) + 1);
}
if (U(P, ["a:rPr", "attrs", "sz"]) && (Cg = U(P, ["a:rPr", "attrs", "sz"]) / 100), !isNaN(Cg) && Cg || !q || U(q, ["a:endParaRPr", "attrs", "sz"]) && (Cg = U(q, ["a:endParaRPr", "attrs", "sz"]) / 100), (isNaN(Cg) || !Cg) && j) {
var Ag = U(j, ["a:lstStyle"]);
if (Ag) {
var eg = U(Ag, ["a:lvl".concat(Ig, "pPr"), "a:defRPr", "attrs", "sz"]);
eg && (Cg = parseInt(eg) / 100);
}
}
if ((isNaN(Cg) || !Cg) && L) {
var O = U(L, ["p:txBody", "a:lstStyle", "a:lvl".concat(Ig, "pPr"), "a:defRPr", "attrs", "sz"]);
O && (Cg = parseInt(O) / 100);
}
if ((isNaN(Cg) || !Cg) && L) {
var _ = U(L, ["p:txBody", "a:lstStyle", "a:lvl1pPr", "a:defRPr", "attrs", "sz"]);
_ && (Cg = parseInt(_) / 100);
}
if ((isNaN(Cg) || !Cg) && q) {
var gg = U(q, ["a:pPr", "a:defRPr", "attrs", "sz"]);
gg && (Cg = parseInt(gg) / 100);
}
if (isNaN(Cg) || !Cg) if (E === "dt" || E === "sldNum") Cg = 12;
else {
var lg, ng = "a:lvl".concat(Ig, "pPr"), sg = function(cg) {
var rg = U(J, [cg, ng, "a:defRPr", "attrs", "sz"]);
if (rg) return parseInt(rg) / 100;
var dg = U(J, [cg, "a:lvl1pPr", "a:defRPr", "attrs", "sz"]);
return dg ? parseInt(dg) / 100 : null;
};
E === "title" || E === "ctrTitle" ? lg = sg("p:titleStyle") : E === "subTitle" ? (lg = sg("p:titleStyle")) === null && (lg = sg("p:bodyStyle")) : lg = sg(E === "body" ? "p:bodyStyle" : "p:otherStyle"), lg !== null && (Cg = lg);
}
if (isNaN(Cg) || !Cg) {
var og = U(k, ["a:lvl".concat(Ig, "pPr"), "a:defRPr", "attrs", "sz"]) || U(k, ["a:defPPr", "a:defRPr", "attrs", "sz"]);
og && (Cg = parseInt(og) / 100);
}
return (Cg = isNaN(Cg) || !Cg ? 18 : Cg) + "px";
}(t, i, e, l, A.defaultTextStyle, g, I), v = function(P, L, E) {
var J = U(P, ["a:t"]), k = typeof J == "string" && /[\u3040-\u30ff\u3400-\u9fff\uf900-\ufaff]/.test(J), j = (k ? U(P, ["a:rPr", "a:ea", "attrs", "typeface"]) : null) || U(P, ["a:rPr", "a:latin", "attrs", "typeface"]) || U(P, ["a:rPr", "a:ea", "attrs", "typeface"]) || U(P, ["a:rPr", "a:cs", "attrs", "typeface"]);
if (!j) {
var q, Cg = U(E.themeContent, ["a:theme", "a:themeElements", "a:fontScheme"]);
q = U(Cg, L === "title" || L === "subTitle" || L === "ctrTitle" ? ["a:majorFont"] : ["a:minorFont"]), j = (k ? U(q, ["a:ea", "attrs", "typeface"]) : null) || U(q, ["a:latin", "attrs", "typeface"]) || U(q, ["a:ea", "attrs", "typeface"]) || U(q, ["a:cs", "attrs", "typeface"]);
}
return j || "";
}(t, e, A), K = function(P) {
return U(P, ["a:rPr", "attrs", "b"]) === "1" ? "bold" : "";
}(t), V = function(P) {
return U(P, ["a:rPr", "attrs", "i"]) === "1" ? "italic" : "";
}(t), N = function(P) {
return U(P, ["a:rPr", "attrs", "u"]) === "sng" ? "underline" : "";
}(t), B = function(P) {
return U(P, ["a:rPr", "attrs", "strike"]) === "sngStrike" ? "line-through" : "";
}(t), G = function(P) {
var L = U(P, ["a:rPr", "attrs", "spc"]);
return L ? parseInt(L) / 100 + "pt" : "";
}(t), w = function(P, L) {
var E = U(P, ["a:rPr", "a:effectLst", "a:outerShdw"]);
if (E) {
var J = Qtg(E, L);
if (J) {
var k = J.h, j = J.v, q = J.blur, Cg = J.color;
if (!isNaN(j) && !isNaN(k)) return k + "pt " + j + "pt " + (q ? q + "pt" : "") + " " + Cg;
}
}
return "";
}(t, A), W = function(P) {
var L = U(P, ["a:rPr", "attrs", "baseline"]);
return L ? parseInt(L) > 0 ? "super" : "sub" : "";
}(t);
if (S) {
if (typeof S == "string") H += "color: ".concat(S, ";");
else if (S.colors) {
var y = S.colors, f = S.rot, D = y.map(function(P) {
return "".concat(P.color, " ").concat(P.pos);
}).join(", "), F = "linear-gradient(".concat(f + 90, "deg, ").concat(D, ")");
H += "background: ".concat(F, "; background-clip: text; color: transparent;");
}
}
z && (H += "font-size: ".concat(z, ";")), v && (H += "font-family: ".concat(v, ";")), K && (H += "font-weight: ".concat(K, ";")), V && (H += "font-style: ".concat(V, ";")), N && (H += "text-decoration: ".concat(N, ";")), B && (H += "text-decoration-line: ".concat(B, ";")), G && (H += "letter-spacing: ".concat(G, ";")), W && (H += "vertical-align: ".concat(W, ";")), w && (H += "text-shadow: ".concat(w, ";"));
var T = U(t, ["a:rPr", "a:hlinkClick", "attrs", "r:id"]), Q = T && A.slideResObj[T];
return { styleText: H, text: d, hasLink: Q, linkURL: Q ? A.slideResObj[T].target : null };
}
function Bbg(t, I, g, C, i, e, A) {
var s, l = i;
if (e >= i) for (; l <= e; ) {
var n = l * (Math.PI / 180), a = t + Math.cos(n) * g, d = I + Math.sin(n) * C;
l === i && (s = " M" + a + " " + d), s += " L" + a + " " + d, l++;
}
else for (; l > e; ) {
var o = l * (Math.PI / 180), c = t + Math.cos(o) * g, r = I + Math.sin(o) * C;
l === i && (s = " M " + c + " " + r), s += " L " + c + " " + r, l--;
}
return s += "";
}
function Wbg(t, I, g) {
var C = U(t, ["a:pathLst"]), i = U(C, ["a:path"]);
Array.isArray(i) && (i = i.shift());
var e = parseInt(i.attrs.w), A = parseInt(i.attrs.h), s = e === 0 ? 0 : 1 / e * I, l = A === 0 ? 0 : 1 / A * g, n = "", a = U(i, ["a:moveTo"]), d = i["a:lnTo"], o = i["a:cubicBezTo"], c = i["a:arcTo"], r = U(i, ["a:close"]);
Array.isArray(a) || (a = [a]);
var h = [];
if (a.length > 0) {
if (Object.keys(a).forEach(function(N) {
var B = a[N]["a:pt"];
B && Object.keys(B).forEach(function(G) {
var w = B[G], W = w.x, y = w.y, f = w.order;
h.push({ type: "movto", x: W, y, order: f });
});
}), d && (Array.isArray(d) || (d = [d]), Object.keys(d).forEach(function(N) {
var B = d[N]["a:pt"];
B && Object.keys(B).forEach(function(G) {
var w = B[G], W = w.x, y = w.y, f = w.order;
h.push({ type: "lnto", x: W, y, order: f });
});
})), o) {
var b = [];
Array.isArray(o) || (o = [o]), Object.keys(o).forEach(function(N) {
b.push(o[N]["a:pt"]);
}), b.forEach(function(N) {
var B = [];
N.forEach(function(w) {
var W = { x: w.attrs.x, y: w.attrs.y };
B.push(W);
});
var G = N[0].attrs.order;
h.push({ type: "cubicBezTo", cubBzPt: B, order: G });
});
}
if (c) {
var u = c.attrs, m = u.order, Z = u.hR, p = u.wR, Y = u.stAng, R = u.swAng, X = 0, H = 0, S = U(c, ["a:pt", "attrs"]);
S && (X = S.x, H = S.y), h.push({ type: "arcTo", hR: Z, wR: p, stAng: Y, swAng: R, shftX: X, shftY: H, order: m });
}
r && (Array.isArray(r) || (r = [r]), Object.keys(r).forEach(function() {
h.push({ type: "close", order: 1 / 0 });
})), h.sort(function(N, B) {
return N.order - B.order;
});
for (var z = 0; z < h.length; ) {
if (h[z].type === "movto") n += " M" + parseInt(h[z].x) * s + "," + parseInt(h[z].y) * l;
else if (h[z].type === "lnto")
n += " L" + parseInt(h[z].x) * s + "," + parseInt(h[z].y) * l;
else if (h[z].type === "cubicBezTo")
n += " C" + parseInt(h[z].cubBzPt[0].x) * s + "," + parseInt(h[z].cubBzPt[0].y) * l + " " + parseInt(h[z].cubBzPt[1].x) * s + "," + parseInt(h[z].cubBzPt[1].y) * l + " " + parseInt(h[z].cubBzPt[2].x) * s + "," + parseInt(h[z].cubBzPt[2].y) * l;
else if (h[z].type === "arcTo") {
var v = parseInt(h[z].hR) * s, K = parseInt(h[z].wR) * l, V = parseInt(h[z].stAng) / 6e4;
n += Bbg(K, v, K, v, V, V + parseInt(h[z].swAng) / 6e4);
} else h[z].type === "close" && (n += "z");
z++;
}
}
return n;
}
function ybg(t, I) {
var g = {};
if (t["a:bottom"]) {
var C = Fs({ "p:spPr": { "a:ln": t["a:bottom"]["a:ln"] } }, void 0, I);
g.bottom = C;
}
if (t["a:top"]) {
var i = Fs({ "p:spPr": { "a:ln": t["a:top"]["a:ln"] } }, void 0, I);
g.top = i;
}
if (t["a:right"]) {
var e = Fs({ "p:spPr": { "a:ln": t["a:right"]["a:ln"] } }, void 0, I);
g.right = e;
}
if (t["a:left"]) {
var A = Fs({ "p:spPr": { "a:ln": t["a:left"]["a:ln"] } }, void 0, I);
g.left = A;
}
return g;
}
function wq(t, I, g, C) {
return Utg.apply(this, arguments);
}
function Utg() {
return (Utg = SC(bI.mark(function t(I, g, C, i) {
var e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y;
return bI.wrap(function(R) {
for (; ; ) switch (R.prev = R.next) {
case 0:
if (e = U(I, ["attrs", "rowSpan"]), A = U(I, ["attrs", "gridSpan"]), s = U(I, ["attrs", "vMerge"]), l = U(I, ["attrs", "hMerge"]), !(o = U(I, ["a:tcPr"]))) {
R.next = 11;
break;
}
return c = { "p:spPr": o }, R.next = 9, jtg(c, void 0, !1, i, "slide");
case 9:
(r = R.sent) && r.type === "color" && r.value && (n = r.value);
case 11:
return n || (C && (h = U(g, [C, "a:tcStyle", "a:fill", "a:solidFill"])), h && (n = eC(h, void 0, void 0, i))), C && (b = U(g, [C, "a:tcTxStyle"])), b && (a = eC(b, void 0, void 0, i), U(b, ["attrs", "b"]) === "on" && (d = !0)), (u = U(I, ["a:tcPr", "a:lnB"])) || (C && (u = U(g[C], ["a:tcStyle", "a:tcBdr", "a:bottom", "a:ln"])), u || (u = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:bottom", "a:ln"]))), (m = U(I, ["a:tcPr", "a:lnT"])) || (C && (m = U(g[C], ["a:tcStyle", "a:tcBdr", "a:top", "a:ln"])), m || (m = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:top", "a:ln"]))), (Z = U(I, ["a:tcPr", "a:lnL"])) || (C && (Z = U(g[C], ["a:tcStyle", "a:tcBdr", "a:left", "a:ln"])), Z || (Z = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:left", "a:ln"]))), (p = U(I, ["a:tcPr", "a:lnR"])) || (C && (p = U(g[C], ["a:tcStyle", "a:tcBdr", "a:right", "a:ln"])), p || (p = U(g, ["a:wholeTbl", "a:tcStyle", "a:tcBdr", "a:right", "a:ln"]))), Y = {}, u && (Y.bottom = Fs(u, void 0, i)), m && (Y.top = Fs(m, void 0, i)), Z && (Y.left = Fs(Z, void 0, i)), p && (Y.right = Fs(p, void 0, i)), R.abrupt("return", { fillColor: n, fontColor: a, fontBold: d, borders: Y, rowSpan: e ? +e : void 0, colSpan: A ? +A : void 0, vMerge: s ? +s : void 0, hMerge: l ? +l : void 0 });
case 28:
case "end":
return R.stop();
}
}, t);
}))).apply(this, arguments);
}
function Ybg(t, I, g, C, i) {
var e, A, s;
if (C && C["a:wholeTbl"]) {
var l = U(C, ["a:wholeTbl", "a:tcStyle", "a:fill", "a:solidFill"]);
if (l) {
var n = eC(l, void 0, void 0, i);
n && (e = n);
}
var a = U(C, ["a:wholeTbl", "a:tcTxStyle"]);
if (a) {
var d = eC(a, void 0, void 0, i);
d && (A = d), U(a, ["attrs", "b"]) === "on" && (s = !0);
}
}
if (I === 0 && g.isFrstRowAttr === 1 && C) {
var o = U(C, ["a:firstRow", "a:tcStyle", "a:fill", "a:solidFill"]);
if (o) {
var c = eC(o, void 0, void 0, i);
c && (e = c);
}
var r = U(C, ["a:firstRow", "a:tcTxStyle"]);
if (r) {
var h = eC(r, void 0, void 0, i);
h && (A = h), U(r, ["attrs", "b"]) === "on" && (s = !0);
}
} else if (I > 0 && g.isBandRowAttr === 1 && C) {
if (e = "", I % 2 == 0 && C["a:band2H"]) {
var b = U(C, ["a:band2H", "a:tcStyle", "a:fill", "a:solidFill"]);
if (b) {
var u = eC(b, void 0, void 0, i);
u && (e = u);
}
var m = U(C, ["a:band2H", "a:tcTxStyle"]);
if (m) {
var Z = eC(m, void 0, void 0, i);
Z && (A = Z);
}
U(m, ["attrs", "b"]) === "on" && (s = !0);
}
if (I % 2 != 0 && C["a:band1H"]) {
var p = U(C, ["a:band1H", "a:tcStyle", "a:fill", "a:solidFill"]);
if (p) {
var Y = eC(p, void 0, void 0, i);
Y && (e = Y);
}
var R = U(C, ["a:band1H", "a:tcTxStyle"]);
if (R) {
var X = eC(R, void 0, void 0, i);
X && (A = X), U(R, ["attrs", "b"]) === "on" && (s = !0);
}
}
}
if (I === t.length - 1 && g.isLstRowAttr === 1 && C) {
var H = U(C, ["a:lastRow", "a:tcStyle", "a:fill", "a:solidFill"]);
if (H) {
var S = eC(H, void 0, void 0, i);
S && (e = S);
}
var z = U(C, ["a:lastRow", "a:tcTxStyle"]);
if (z) {
var v = eC(z, void 0, void 0, i);
v && (A = v), U(z, ["attrs", "b"]) === "on" && (s = !0);
}
}
return { fillColor: e, fontColor: A, fontBold: s };
}
function Etg(t) {
var I = [];
return _a(t) !== "object" || (t["m:oMath"] && (I = I.concat(t["m:oMath"])), Object.values(t).forEach(function(g) {
(Array.isArray(g) || _a(g) === "object") && (I = I.concat(Etg(g)));
})), I;
}
function pq(t, I) {
var g = HC(t["m:e"]), C = HC(t["m:lim"]);
return I === "low" ? "".concat(g, "_{").concat(C, "}") : "".concat(g, "^{").concat(C, "}");
}
function HC(t) {
if (!t) return "";
if (Array.isArray(t)) return t.map(function(A) {
return HC(A);
}).join("");
for (var I = [], g = Object.keys(t), C = function() {
var A = e[i];
Array.isArray(t[A]) ? I.push.apply(I, R9(t[A].map(function(s) {
return { key: A, value: s };
}))) : I.push({ key: A, value: t[A] });
}, i = 0, e = g; i < e.length; i++) C();
return I.sort(function(A, s) {
var l = 0;
A.key === "m:r" && A.value && A.value["a:rPr"] ? l = A.value["a:rPr"].attrs.order : A.value["".concat(A.key, "Pr")] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"]["a:rPr"] && (l = A.value["".concat(A.key, "Pr")] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"]["a:rPr"] && A.value["".concat(A.key, "Pr")]["m:ctrlPr"]["a:rPr"].attrs.order);
var n = 0;
return s.key === "m:r" && s.value && s.value["a:rPr"] ? n = s.value["a:rPr"].attrs.order : s.value["".concat(s.key, "Pr")] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"]["a:rPr"] && (n = s.value["".concat(s.key, "Pr")] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"]["a:rPr"] && s.value["".concat(s.key, "Pr")]["m:ctrlPr"]["a:rPr"].attrs.order), l - n;
}), I.map(function(A) {
var s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H = A.key, S = A.value;
return H === "m:f" ? (l = HC((s = S)["m:num"]), n = HC(s["m:den"]), "\\frac{".concat(l, "}{").concat(n, "}")) : H === "m:sSup" ? (d = HC((a = S)["m:e"]), o = HC(a["m:sup"]), "".concat(d, "^{").concat(o, "}")) : H === "m:sSub" ? function(z) {
var v = HC(z["m:e"]), K = HC(z["m:sub"]);
return "".concat(v, "_{").concat(K, "}");
}(S) : H === "m:rad" ? (r = HC((c = S)["m:deg"]), h = HC(c["m:e"]), r ? "\\sqrt[".concat(r, "]{").concat(h, "}") : "\\sqrt{".concat(h, "}")) : H === "m:nary" ? function(z) {
var v = U(z, ["m:naryPr", "m:chr", "attrs", "m:val"]) || "∫", K = HC(z["m:sub"]), V = HC(z["m:sup"]), N = HC(z["m:e"]);
return "".concat(v, "_{").concat(K, "}^{").concat(V, "}{").concat(N, "}");
}(S) : H === "m:limLow" ? pq(S, "low") : H === "m:limUpp" ? pq(S, "upp") : H === "m:d" ? function(z) {
var v = U(z, ["m:dPr", "m:begChr", "attrs", "m:val"]), K = U(z, ["m:dPr", "m:endChr", "attrs", "m:val"]);
v || K || (v = "(", K = ")"), v && K && (v = "\\left".concat(v), K = "\\right".concat(K));
var V = HC(z["m:e"]);
return "".concat(v).concat(V).concat(K);
}(S) : H === "m:func" ? (u = HC((b = S)["m:fName"]), m = HC(b["m:e"]), "\\".concat(u, "{").concat(m, "}")) : H === "m:groupChr" ? (p = U(Z = S, ["m:groupChrPr", "m:chr", "attrs", "m:val"]), Y = HC(Z["m:e"]), "".concat(p).concat(Y).concat(p)) : H === "m:eqArr" ? (R = S["m:e"].map(function(z) {
return HC(z);
}).join(" \\\\ "), "\\begin{cases} ".concat(R, " \\end{cases}")) : H === "m:bar" ? function(z) {
var v = HC(z["m:e"]);
return U(z, ["m:barPr", "m:pos", "attrs", "m:val"]) === "top" ? "\\overline{".concat(v, "}") : "\\underline{".concat(v, "}");
}(S) : H === "m:acc" ? function(z) {
var v = U(z, ["m:accPr", "m:chr", "attrs", "m:val"]) || "^", K = HC(z["m:e"]);
switch (v) {
case "́":
return "\\acute{".concat(K, "}");
case "̀":
return "\\grave{".concat(K, "}");
case "̂":
return "\\hat{".concat(K, "}");
case "̃":
return "\\tilde{".concat(K, "}");
case "̄":
return "\\bar{".concat(K, "}");
case "̆":
return "\\breve{".concat(K, "}");
case "̇":
return "\\dot{".concat(K, "}");
case "̈":
return "\\ddot{".concat(K, "}");
case "̊":
return "\\mathring{".concat(K, "}");
case "̋":
return "\\H{".concat(K, "}");
case "̌":
return "\\check{".concat(K, "}");
case "̧":
return "\\c{".concat(K, "}");
default:
return "\\".concat(v, "{").concat(K, "}");
}
}(S) : H === "m:borderBox" ? function(z) {
var v = HC(z["m:e"]);
return "\\boxed{".concat(v, "}");
}(S) : H === "m:m" ? (X = S["m:mr"].map(function(z) {
return z["m:e"].map(function(v) {
return HC(v);
}).join(" & ");
}), "\\begin{matrix} ".concat(X.join(" \\\\ "), " \\end{matrix}")) : H === "m:r" ? HC(S) : H === "m:t" ? S : "";
}).join("");
}
function Nbg(t) {
return t.replaceAll(/</g, "<").replaceAll(/>/g, ">").replaceAll(/&/g, "&").replaceAll(/'/g, "'").replaceAll(/"/g, '"');
}
function HI(t, I) {
var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
if (!g) {
if (Array.isArray(t) || (g = function(l, n) {
if (l) {
if (typeof l == "string") return Bq(l, n);
var a = Object.prototype.toString.call(l).slice(8, -1);
if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return Bq(l, n);
}
}(t)) || I) {
g && (t = g);
var C = 0, i = function() {
};
return { s: i, n: function() {
return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
}, e: function(l) {
throw l;
}, f: i };
}
throw new TypeError(`Invalid attempt to iterate non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
}
var e, A = !0, s = !1;
return { s: function() {
g = g.call(t);
}, n: function() {
var l = g.next();
return A = l.done, l;
}, e: function(l) {
s = !0, e = l;
}, f: function() {
try {
A || g.return == null || g.return();
} finally {
if (s) throw e;
}
} };
}
function Bq(t, I) {
(I == null || I > t.length) && (I = t.length);
for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
return C;
}
function Wq(t, I, g, C, i) {
return { x: t + Math.cos(i) * g, y: I + Math.sin(i) * C };
}
function yq(t, I, g, C, i, e, A) {
var s = Wq(t, I, g, C, i), l = Wq(t, I, g, C, e), n = l, a = s, d = i - e, o = Math.abs(d) > Math.PI ? 1 : 0, c = d >= 0 ? 1 : 0;
return "M ".concat(n.x, ",").concat(n.y, " A ").concat(g, ",").concat(C, " 0 ").concat(o, ",").concat(c, " ").concat(a.x, ",").concat(a.y, " Z");
}
function Vg(t, I, g, C, i, e, A) {
for (var s, l = "", n = e >= i ? 1 : -1, a = i; s = a, n > 0 ? s <= e : s >= e; ) {
var d = a * (Math.PI / 180), o = t + Math.cos(d) * g, c = I + Math.sin(d) * C;
a === i && (l = " M".concat(o, " ").concat(c)), l += " L".concat(o, " ").concat(c), a += n;
}
return A && (l += " z"), l;
}
function Vbg(t, I, g, C) {
var i = "";
switch (t) {
case "rect":
case "actionButtonBlank":
case "leftRightCircularArrow":
case "chartPlus":
case "chartStar":
case "chartX":
case "cornerTabs":
case "flowChartOfflineStorage":
case "folderCorner":
case "funnel":
case "lineInv":
case "nonIsoscelesTrapezoid":
case "plaqueTabs":
case "squareTabs":
case "upDownArrowCallout":
default:
i = "M 0 0 L ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g, " Z");
break;
case "flowChartPredefinedProcess":
i = "M 0 0 L ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g, " Z M ").concat(I * (1 / 8), " 0 L ").concat(I * (1 / 8), " ").concat(g, " M ").concat(I * (7 / 8), " 0 L ").concat(I * (7 / 8), " ").concat(g);
break;
case "flowChartInternalStorage":
i = "M 0 0 L ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g, " Z M ").concat(I * (1 / 8), " 0 L ").concat(I * (1 / 8), " ").concat(g, " M 0 ").concat(g * (1 / 8), " L ").concat(I, " ").concat(g * (1 / 8));
break;
case "flowChartCollate":
i = "M 0,0 L ".concat(I, ",0 L 0,").concat(g, " L ").concat(I, ",").concat(g, " z");
break;
case "flowChartDocument":
var e = 10800 * I / 21600, A = 17322 * g / 21600, s = 20172 * g / 21600, l = 23922 * g / 21600;
i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(A, " C ").concat(e, ",").concat(A, " ").concat(e, ",").concat(l, " 0,").concat(s, " z");
break;
case "flowChartMultidocument":
var n = 18022 * g / 21600, a = 3675 * g / 21600, d = 23542 * g / 21600, o = 1815 * g / 21600, c = 16252 * g / 21600, r = 16352 * g / 21600, h = 14392 * g / 21600, b = 20782 * g / 21600, u = 14467 * g / 21600, m = 1532 * I / 21600, Z = 2e4 * I / 21600, p = 9298 * I / 21600, Y = 19298 * I / 21600, R = 18595 * I / 21600, X = 2972 * I / 21600, H = 20800 * I / 21600;
i = "M 0,".concat(a, " L ").concat(R, ",").concat(a, " L ").concat(R, ",").concat(n, " C ").concat(p, ",").concat(n, " ").concat(p, ",").concat(d, " 0,").concat(b, " z M ").concat(m, ",").concat(a, " L ").concat(m, ",").concat(o, " L ").concat(Z, ",").concat(o, " L ").concat(Z, ",").concat(c, " C ").concat(Y, ",").concat(c, " ").concat(R, ",").concat(r, " ").concat(R, ",").concat(r, " M ").concat(X, ",").concat(o, " L ").concat(X, ",0 L ").concat(I, ",0 L ").concat(I, ",").concat(h, " C ").concat(H, ",").concat(h, " ").concat(Z, ",").concat(u, " ").concat(Z, ",").concat(u);
break;
case "actionButtonBackPrevious":
var S = I / 2, z = g / 2, v = 3 * Math.min(I, g) / 8, K = z - v, V = z + v, N = S - v, B = S + v;
i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(N, ",").concat(z, " L ").concat(B, ",").concat(K, " L ").concat(B, ",").concat(V, " z");
break;
case "actionButtonBeginning":
var G = I / 2, w = g / 2, W = Math.min(I, g), y = 3 * W / 8, f = w - y, D = w + y, F = G - y, T = G + y, Q = 3 * W / 4, P = F + Q / 8, L = F + Q / 4;
i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(L, ",").concat(w, " L ").concat(T, ",").concat(f, " L ").concat(T, ",").concat(D, " z M ").concat(P, ",").concat(f, " L ").concat(F, ",").concat(f, " L ").concat(F, ",").concat(D, " L ").concat(P, ",").concat(D, " z");
break;
case "actionButtonDocument":
var E = I / 2, J = g / 2, k = Math.min(I, g), j = 3 * k / 8, q = J - j, Cg = J + j, Ig = 9 * k / 32, x = E - Ig, Ag = E + Ig, eg = 3 * k / 16, O = Ag - eg, _ = q + eg;
i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(x, ",").concat(q, " L ").concat(O, ",").concat(q, " L ").concat(Ag, ",").concat(_, " L ").concat(Ag, ",").concat(Cg, " L ").concat(x, ",").concat(Cg, " z M ").concat(O, ",").concat(q, " L ").concat(O, ",").concat(_, " L ").concat(Ag, ",").concat(_, " z");
break;
case "actionButtonEnd":
var gg = I / 2, lg = g / 2, ng = Math.min(I, g), sg = 3 * ng / 8, og = lg - sg, cg = lg + sg, rg = gg - sg, dg = gg + sg, Bg = 3 * ng / 4, Zg = rg + 3 * Bg / 4, Xg = rg + 7 * Bg / 8;
i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(Xg, ",").concat(og, " L ").concat(dg, ",").concat(og, " L ").concat(dg, ",").concat(cg, " L ").concat(Xg, ",").concat(cg, " z M ").concat(Zg, ",").concat(lg, " L ").concat(rg, ",").concat(og, " L ").concat(rg, ",").concat(cg, " z");
break;
case "actionButtonForwardNext":
var Kg = I / 2, kg = g / 2, Wg = 3 * Math.min(I, g) / 8, Ng = kg - Wg, wg = kg + Wg, fg = Kg - Wg, Jg = Kg + Wg;
i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(Jg, ",").concat(kg, " L ").concat(fg, ",").concat(Ng, " L ").concat(fg, ",").concat(wg, " z");
break;
case "actionButtonHelp":
var zg = I / 2, cI = g / 2, YI = Math.min(I, g), Eg = 3 * YI / 8, aI = cI - Eg, dI = zg - Eg, _g = 3 * YI / 4, xI = _g / 7, SI = 3 * _g / 14, eI = 2 * _g / 7, NI = aI + eI, EI = aI + 17 * _g / 28, oI = aI + 21 * _g / 28, LI = aI + 11 * _g / 14, pg = dI + SI, uI = dI + 3 * _g / 7, hg = dI + 4 * _g / 7, bg = _g / 14, Rg = 3 * _g / 28, Tg = pg + eI, rI = uI + xI, jg = LI + Rg, GI = (hg + uI + eI) / 2;
i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(pg, ",").concat(NI, " ").concat(Vg(Tg, NI, eI, eI, 180, 360, !1).replace("M", "L"), " ").concat(Vg(GI, NI, xI, SI, 0, 90, !1).replace("M", "L"), " ").concat(Vg(GI, EI, bg, Rg, 270, 180, !1).replace("M", "L"), " L ").concat(hg, ",").concat(oI, " L ").concat(uI, ",").concat(oI, " L ").concat(uI, ",").concat(EI, " ").concat(Vg(rI, EI, xI, SI, 180, 270, !1).replace("M", "L"), " ").concat(Vg(hg, NI, bg, Rg, 90, 0, !1).replace("M", "L"), " ").concat(Vg(Tg, NI, xI, xI, 0, -180, !1).replace("M", "L"), " z M ").concat(zg, ",").concat(LI, " ").concat(Vg(zg, jg, Rg, Rg, 270, 630, !1).replace("M", "L"), " z");
break;
case "actionButtonHome":
var nI = I / 2, CI = g / 2, WI = Math.min(I, g), mI = 3 * WI / 8, VI = CI - mI, yC = CI + mI, gC = nI - mI, It = nI + mI, dC = 3 * WI / 4, Tt = VI + dC / 16, ag = VI + 3 * dC / 16, mg = VI + 5 * dC / 16, Sg = VI + 3 * dC / 4, Fg = gC + dC / 8, tI = gC + 7 * dC / 16, vg = gC + 9 * dC / 16, xg = gC + 11 * dC / 16, vI = gC + 13 * dC / 16, fI = gC + 7 * dC / 8;
i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(nI, ",").concat(VI, " L ").concat(gC, ",").concat(CI, " L ").concat(Fg, ",").concat(CI, " L ").concat(Fg, ",").concat(yC, " L ").concat(fI, ",").concat(yC, " L ").concat(fI, ",").concat(CI, " L ").concat(It, ",").concat(CI, " L ").concat(vI, ",").concat(mg, " L ").concat(vI, ",").concat(Tt, " L ").concat(xg, ",").concat(Tt, " L ").concat(xg, ",").concat(ag, " z M ").concat(tI, ",").concat(Sg, " L ").concat(vg, ",").concat(Sg, " L ").concat(vg, ",").concat(yC, " L ").concat(tI, ",").concat(yC, " z");
break;
case "actionButtonInformation":
var MI = I / 2, hI = g / 2, AC = Math.min(I, g), PI = 3 * AC / 8, jI = hI - PI, mC = MI - PI, ZC = 3 * AC / 4, Vt = 5 * ZC / 16, Si = jI + ZC / 32, LA = jI + Vt, vs = jI + 3 * ZC / 8, AA = jI + 13 * ZC / 16, Ts = jI + 7 * ZC / 8, IC = mC + Vt, QI = mC + 13 * ZC / 32, sA = mC + 19 * ZC / 32, vA = mC + 11 * ZC / 16, An = 3 * ZC / 32, Bi = jI + PI, lA = Si + An;
i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(MI, ",").concat(jI, " ").concat(Vg(MI, Bi, PI, PI, 270, 630, !1).replace("M", "L"), " z M ").concat(MI, ",").concat(Si, " ").concat(Vg(MI, lA, An, An, 270, 630, !1).replace("M", "L"), " M ").concat(IC, ",").concat(LA, " L ").concat(sA, ",").concat(LA, " L ").concat(sA, ",").concat(AA, " L ").concat(vA, ",").concat(AA, " L ").concat(vA, ",").concat(Ts, " L ").concat(IC, ",").concat(Ts, " L ").concat(IC, ",").concat(AA, " L ").concat(QI, ",").concat(AA, " L ").concat(QI, ",").concat(vs, " L ").concat(IC, ",").concat(vs, " z");
break;
case "actionButtonMovie":
var nA = I / 2, Io = g / 2, xs = Math.min(I, g), xt = nA - 3 * xs / 8, Mt = Io - 3 * xs / 8, S0 = nA + 3 * xs / 8, _C = 3 * xs / 4, Gd = xt + 1455 * _C / 21600, Co = xt + 1905 * _C / 21600, to = xt + 2325 * _C / 21600, pG = xt + 16155 * _C / 21600, js = xt + 17010 * _C / 21600, wd = xt + 19335 * _C / 21600, Vig = xt + 19725 * _C / 21600, s1 = xt + 20595 * _C / 21600, l1 = Mt + 5280 * _C / 21600, n1 = Mt + 5730 * _C / 21600, uM = Mt + 6630 * _C / 21600, a1 = Mt + 7492 * _C / 21600, o1 = Mt + 9067 * _C / 21600, c1 = Mt + 9555 * _C / 21600, d1 = Mt + 13342 * _C / 21600, r1 = Mt + 14580 * _C / 21600, h1 = Mt + 15592 * _C / 21600;
i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(xt, ",").concat(l1, " L ").concat(xt, ",").concat(c1, " L ").concat(Gd, ",").concat(c1, " L ").concat(Co, ",").concat(o1, " L ").concat(to, ",").concat(o1, " L ").concat(to, ",").concat(h1, " L ").concat(js, ",").concat(h1, " L ").concat(js, ",").concat(d1, " L ").concat(wd, ",").concat(d1, " L ").concat(s1, ",").concat(r1, " L ").concat(S0, ",").concat(r1, " L ").concat(S0, ",").concat(uM, " L ").concat(s1, ",").concat(uM, " L ").concat(Vig, ",").concat(a1, " L ").concat(js, ",").concat(a1, " L ").concat(js, ",").concat(uM, " L ").concat(pG, ",").concat(n1, " L ").concat(Co, ",").concat(n1, " L ").concat(Gd, ",").concat(l1, " z");
break;
case "actionButtonReturn":
var D0 = I / 2, b1 = g / 2, u1 = Math.min(I, g), BG = 3 * u1 / 8, WG = b1 - BG, m1 = b1 + BG, sn = D0 - BG, Mig = D0 + BG, pd = 3 * u1 / 4, Z1 = 3 * pd / 4, G1 = 5 * pd / 8, io = 3 * pd / 8, w1 = pd / 4, p1 = WG + Z1, yG = WG + G1, Bd = WG + w1, Rig = sn + 7 * pd / 8, fig = sn + Z1, mM = sn + G1, B1 = sn + io, Hig = sn + w1, Wd = pd / 8, Xig = mM - Wd, Sig = p1 - Wd, Dig = sn + io, Kig = m1 - io;
i = "M 0,".concat(g, " L ").concat(I, ",").concat(g, " L ").concat(I, ",0 L 0,0 z M ").concat(Mig, ",").concat(Bd, " L ").concat(fig, ",").concat(WG, " L ").concat(D0, ",").concat(Bd, " L ").concat(mM, ",").concat(Bd, " L ").concat(mM, ",").concat(yG, " ").concat(Vg(Xig, yG, Wd, Wd, 0, 90, !1).replace("M", "L"), " L ").concat(B1, ",").concat(p1, " ").concat(Vg(B1, Sig, Wd, Wd, 90, 180, !1).replace("M", "L"), " L ").concat(Hig, ",").concat(Bd, " L ").concat(sn, ",").concat(Bd, " L ").concat(sn, ",").concat(yG, " ").concat(Vg(Dig, yG, io, io, 180, 90, !1).replace("M", "L"), " L ").concat(D0, ",").concat(m1, " ").concat(Vg(D0, Kig, io, io, 90, 0, !1).replace("M", "L"), " L ").concat(Rig, ",").concat(Bd, " z");
break;
case "actionButtonSound":
var W1 = I / 2, YG = g / 2, y1 = Math.min(I, g), NG = 3 * y1 / 8, K0 = YG - NG, Fig = YG + NG, F0 = W1 - NG, ZM = W1 + NG, yd = 3 * y1 / 4, Y1 = 5 * yd / 16, kig = K0 + yd / 8, GM = K0 + Y1, wM = K0 + 11 * yd / 16, zig = K0 + 7 * yd / 8, N1 = F0 + Y1, V1 = F0 + 5 * yd / 8, pM = F0 + 3 * yd / 4;
i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(F0, ",").concat(GM, " L ").concat(N1, ",").concat(GM, " L ").concat(V1, ",").concat(K0, " L ").concat(V1, ",").concat(Fig, " L ").concat(N1, ",").concat(wM, " L ").concat(F0, ",").concat(wM, " z M ").concat(pM, ",").concat(GM, " L ").concat(ZM, ",").concat(kig, " M ").concat(pM, ",").concat(YG, " L ").concat(ZM, ",").concat(YG, " M ").concat(pM, ",").concat(wM, " L ").concat(ZM, ",").concat(zig);
break;
case "irregularSeal1":
i = "M ".concat(10800 * I / 21600, ",").concat(5800 * g / 21600, " L ").concat(14522 * I / 21600, ",0 L ").concat(14155 * I / 21600, ",").concat(5325 * g / 21600, " L ").concat(18380 * I / 21600, ",").concat(4457 * g / 21600, " L ").concat(16702 * I / 21600, ",").concat(7315 * g / 21600, " L ").concat(21097 * I / 21600, ",").concat(8137 * g / 21600, " L ").concat(17607 * I / 21600, ",").concat(10475 * g / 21600, " L ").concat(I, ",").concat(13290 * g / 21600, " L ").concat(16837 * I / 21600, ",").concat(12942 * g / 21600, " L ").concat(18145 * I / 21600, ",").concat(18095 * g / 21600, " L ").concat(14020 * I / 21600, ",").concat(14457 * g / 21600, " L ").concat(13247 * I / 21600, ",").concat(19737 * g / 21600, " L ").concat(10532 * I / 21600, ",").concat(14935 * g / 21600, " L ").concat(8485 * I / 21600, ",").concat(g, " L ").concat(7715 * I / 21600, ",").concat(15627 * g / 21600, " L ").concat(4762 * I / 21600, ",").concat(17617 * g / 21600, " L ").concat(5667 * I / 21600, ",").concat(13937 * g / 21600, " L ").concat(135 * I / 21600, ",").concat(14587 * g / 21600, " L ").concat(3722 * I / 21600, ",").concat(11775 * g / 21600, " L 0,").concat(8615 * g / 21600, " L ").concat(4627 * I / 21600, ",").concat(7617 * g / 21600, " L ").concat(370 * I / 21600, ",").concat(2295 * g / 21600, " L ").concat(7312 * I / 21600, ",").concat(6320 * g / 21600, " L ").concat(8352 * I / 21600, ",").concat(2295 * g / 21600, " z");
break;
case "irregularSeal2":
i = "M ".concat(11462 * I / 21600, ",").concat(4342 * g / 21600, " L ").concat(14790 * I / 21600, ",0 L ").concat(14525 * I / 21600, ",").concat(5777 * g / 21600, " L ").concat(18007 * I / 21600, ",").concat(3172 * g / 21600, " L ").concat(16380 * I / 21600, ",").concat(6532 * g / 21600, " L ").concat(I, ",").concat(6645 * g / 21600, " L ").concat(16985 * I / 21600, ",").concat(9402 * g / 21600, " L ").concat(18270 * I / 21600, ",").concat(11290 * g / 21600, " L ").concat(16380 * I / 21600, ",").concat(12310 * g / 21600, " L ").concat(18877 * I / 21600, ",").concat(15632 * g / 21600, " L ").concat(14640 * I / 21600, ",").concat(14350 * g / 21600, " L ").concat(14942 * I / 21600, ",").concat(17370 * g / 21600, " L ").concat(12180 * I / 21600, ",").concat(15935 * g / 21600, " L ").concat(11612 * I / 21600, ",").concat(18842 * g / 21600, " L ").concat(9872 * I / 21600, ",").concat(17370 * g / 21600, " L ").concat(8700 * I / 21600, ",").concat(19712 * g / 21600, " L ").concat(7527 * I / 21600, ",").concat(18125 * g / 21600, " L ").concat(4917 * I / 21600, ",").concat(g, " L ").concat(4805 * I / 21600, ",").concat(18240 * g / 21600, " L ").concat(1285 * I / 21600, ",").concat(17825 * g / 21600, " L ").concat(3330 * I / 21600, ",").concat(15370 * g / 21600, " L 0,").concat(12877 * g / 21600, " L ").concat(3935 * I / 21600, ",").concat(11592 * g / 21600, " L ").concat(1172 * I / 21600, ",").concat(8270 * g / 21600, " L ").concat(5372 * I / 21600, ",").concat(7817 * g / 21600, " L ").concat(4502 * I / 21600, ",").concat(3625 * g / 21600, " L ").concat(8550 * I / 21600, ",").concat(6382 * g / 21600, " L ").concat(9722 * I / 21600, ",").concat(1887 * g / 21600, " z");
break;
case "flowChartTerminator":
var k0 = 3475 * I / 21600, M1 = 18125 * I / 21600, R1 = 10800 * g / 21600;
i = "M ".concat(k0, ",0 L ").concat(M1, ",0 ").concat(Vg(M1, g / 2, k0, R1, 270, 450, !1).replace("M", "L"), " L ").concat(k0, ",").concat(g, " ").concat(Vg(k0, g / 2, k0, R1, 90, 270, !1).replace("M", "L"), " z");
break;
case "flowChartPunchedTape":
var BM = 180, Yd = 5 * I / 20, eo = 2 * g / 20, WM = 18 * g / 20;
i = "M 0,".concat(eo, " ").concat(Vg(Yd, eo, Yd, eo, BM, 0, !1).replace("M", "L"), " ").concat(Vg(I * (3 / 4), eo, Yd, eo, BM, 360, !1).replace("M", "L"), " L ").concat(I, ",").concat(WM, " ").concat(Vg(I * (3 / 4), WM, Yd, eo, 0, -180, !1).replace("M", "L"), " ").concat(Vg(Yd, WM, Yd, eo, 0, BM, !1).replace("M", "L"), " z");
break;
case "flowChartOnlineStorage":
var z0 = 1 * I / 6, f1 = 3 * g / 6;
i = "M ".concat(z0, ",0 L ").concat(I, ",0 ").concat(Vg(I, g / 2, z0, f1, 270, 90, !1).replace("M", "L"), " L ").concat(z0, ",").concat(g, " ").concat(Vg(z0, g / 2, z0, f1, 90, 270, !1).replace("M", "L"), " z");
break;
case "flowChartDisplay":
var yM = 1 * I / 6, Jig = 5 * I / 6, H1 = 3 * g / 6;
i = "M 0,".concat(H1, " L ").concat(yM, ",0 L ").concat(Jig, ",0 ").concat(Vg(I, g / 2, yM, H1, 270, 450, !1).replace("M", "L"), " L ").concat(yM, ",").concat(g, " z");
break;
case "flowChartDelay":
var YM = I / 2, X1 = g / 2;
i = "M 0,0 L ".concat(YM, ",0 ").concat(Vg(YM, X1, YM, X1, 270, 450, !1).replace("M", "L"), " L 0,").concat(g, " z");
break;
case "flowChartMagneticTape":
var Qs = I / 2, TA = g / 2, Lig = TA + TA * Math.sin(Math.PI / 4), vig = 180 * Math.atan(g / I) / Math.PI;
i = "M ".concat(Qs, ",").concat(g, " ").concat(Vg(Qs, TA, Qs, TA, 90, 180, !1).replace("M", "L"), " ").concat(Vg(Qs, TA, Qs, TA, 180, 270, !1).replace("M", "L"), " ").concat(Vg(Qs, TA, Qs, TA, 270, 360, !1).replace("M", "L"), " ").concat(Vg(Qs, TA, Qs, TA, 0, vig, !1).replace("M", "L"), " L ").concat(I, ",").concat(Lig, " L ").concat(I, ",").concat(g, " z");
break;
case "ellipse":
case "flowChartConnector":
case "flowChartSummingJunction":
case "flowChartOr":
var J0 = I / 2, L0 = g / 2, v0 = I / 2, S1 = g / 2;
if (i = "M ".concat(J0 - v0, ",").concat(L0, " A ").concat(v0, ",").concat(S1, " 0 1,0 ").concat(J0 + v0, ",").concat(L0, " A ").concat(v0, ",").concat(S1, " 0 1,0 ").concat(J0 - v0, ",").concat(L0, " Z"), t === "flowChartOr") i += " M ".concat(I / 2, " 0 L ").concat(I / 2, " ").concat(g, " M 0 ").concat(g / 2, " L ").concat(I, " ").concat(g / 2);
else if (t === "flowChartSummingJunction") {
var D1 = Math.PI / 4, K1 = I / 2 * Math.cos(D1), F1 = g / 2 * Math.sin(D1), k1 = J0 - K1, z1 = J0 + K1, J1 = L0 - F1, L1 = L0 + F1;
i += " M ".concat(k1, " ").concat(J1, " L ").concat(z1, " ").concat(L1, " M ").concat(z1, " ").concat(J1, " L ").concat(k1, " ").concat(L1);
}
break;
case "roundRect":
case "round1Rect":
case "round2DiagRect":
case "round2SameRect":
case "snip1Rect":
case "snip2DiagRect":
case "snip2SameRect":
case "flowChartAlternateProcess":
case "flowChartPunchedCard":
var jt, Di, ln, nn, T0 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
if (T0 && Array.isArray(T0)) {
var v1, VG = HI(T0);
try {
for (VG.s(); !(v1 = VG.n()).done; ) {
var NM = v1.value, T1 = U(NM, ["attrs", "name"]);
if (T1 === "adj1") {
var Tig = U(NM, ["attrs", "fmla"]);
jt = parseInt(Tig.substring(4)) / 5e4;
} else if (T1 === "adj2") {
var xig = U(NM, ["attrs", "fmla"]);
Di = parseInt(xig.substring(4)) / 5e4;
}
}
} catch (Mg) {
VG.e(Mg);
} finally {
VG.f();
}
} else if (T0) {
var jig = U(T0, ["attrs", "fmla"]);
jt = parseInt(jig.substring(4)) / 5e4, Di = 0;
}
var x1 = !1;
switch (t) {
case "roundRect":
case "flowChartAlternateProcess":
ln = "round", nn = "cornrAll", jt === void 0 && (jt = 0.33334), Di = 0;
break;
case "round1Rect":
ln = "round", nn = "cornr1", jt === void 0 && (jt = 0.33334), Di = 0;
break;
case "round2DiagRect":
ln = "round", nn = "diag", jt === void 0 && (jt = 0.33334), Di === void 0 && (Di = 0);
break;
case "round2SameRect":
ln = "round", nn = "cornr2", jt === void 0 && (jt = 0.33334), Di === void 0 && (Di = 0);
break;
case "snip1Rect":
case "flowChartPunchedCard":
ln = "snip", nn = "cornr1", jt === void 0 && (jt = 0.33334), Di = 0, t === "flowChartPunchedCard" && (x1 = !0);
break;
case "snip2DiagRect":
ln = "snip", nn = "diag", jt === void 0 && (jt = 0), Di === void 0 && (Di = 0.33334);
break;
case "snip2SameRect":
ln = "snip", nn = "cornr2", jt === void 0 && (jt = 0.33334), Di === void 0 && (Di = 0);
}
i = function(Mg, RI, YC, QC, OC, zi) {
var UC, Ct, Zt, Ht, ee;
switch (zi) {
case "cornr1":
UC = 0, Ct = 0, Zt = 0, Ht = YC;
break;
case "cornr2":
UC = YC, Ct = QC, Zt = QC, Ht = YC;
break;
case "cornrAll":
UC = YC, Ct = YC, Zt = YC, Ht = YC;
break;
case "diag":
UC = YC, Ct = QC, Zt = YC, Ht = QC;
break;
default:
UC = Ct = Zt = Ht = 0;
}
if (OC === "round") {
if (!Mg || !RI) return "";
var Qt = function(Kr) {
var Fr = Number(Kr);
return Number.isFinite(Fr) ? Math.max(0, Math.min(1, Fr)) : 0;
}, Gt = Math.min(Mg, RI), Ot = Qt(UC) * (Gt / 2), at = Qt(Ht) * (Gt / 2), Je = Qt(Zt) * (Gt / 2), Le = Qt(Ct) * (Gt / 2), RY = Ot + at > 0 ? Mg / (Ot + at) : 1, fY = Le + Je > 0 ? Mg / (Le + Je) : 1, HY = Ot + Le > 0 ? RI / (Ot + Le) : 1, Mu = at + Je > 0 ? RI / (at + Je) : 1, Jo = Math.min(1, RY, fY, HY, Mu);
at *= Jo, Je *= Jo, Le *= Jo;
var ve = function(Kr, Fr) {
return "L".concat(Kr, ",").concat(Fr);
}, XY = function(Kr, Fr, eag) {
return "A".concat(Kr, ",").concat(Kr, " 0 0,1 ").concat(Fr, ",").concat(eag);
}, nl = "";
return nl += (ee = 0, "M".concat(Ot *= Jo, ",").concat(ee)), nl += ve(Mg - at, 0), nl += at > 0 ? XY(at, Mg, at) : ve(Mg, 0), nl += ve(Mg, RI - Je), nl += Je > 0 ? XY(Je, Mg - Je, RI) : ve(Mg, RI), nl += ve(Le, RI), nl += Le > 0 ? XY(Le, 0, RI - Le) : ve(0, RI), nl += ve(0, Ot), (nl += Ot > 0 ? XY(Ot, Ot, 0) : ve(0, 0)) + "Z";
}
return OC === "snip" ? "M0,".concat(UC * (RI / 2), " L0,").concat(RI / 2 + RI / 2 * (1 - Ct), " L").concat(Ct * (Mg / 2), ",").concat(RI, " L").concat(Mg / 2 + Mg / 2 * (1 - Zt), ",").concat(RI, " L").concat(Mg, ",").concat(RI / 2 + RI / 2 * (1 - Zt), " L").concat(Mg, ",").concat(Ht * (RI / 2), " L").concat(Mg / 2 + Mg / 2 * (1 - Ht), ",0 L").concat(Mg / 2 * UC, ",0 z") : "";
}(I, g, jt, Di, ln, nn), x1 && (i = i.replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC) {
var OC = I - parseFloat(YC);
return "".concat(RI).concat(OC, " ").concat(QC);
}).replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC, OC, zi) {
var UC = I - parseFloat(YC), Ct = I - parseFloat(OC);
return "".concat(RI).concat(UC, " ").concat(QC, " ").concat(Ct, " ").concat(zi);
}));
break;
case "snipRoundRect":
var j1 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), VM = 0.33334, MM = 0.33334;
if (j1) {
var Q1, MG = HI(j1);
try {
for (MG.s(); !(Q1 = MG.n()).done; ) {
var RM = Q1.value, O1 = U(RM, ["attrs", "name"]);
if (O1 === "adj1") {
var Qig = U(RM, ["attrs", "fmla"]);
VM = parseInt(Qig.substring(4)) / 5e4;
} else if (O1 === "adj2") {
var Oig = U(RM, ["attrs", "fmla"]);
MM = parseInt(Oig.substring(4)) / 5e4;
}
}
} catch (Mg) {
MG.e(Mg);
} finally {
MG.f();
}
}
i = "M0,".concat(g, " L").concat(I, ",").concat(g, " L").concat(I, ",").concat(g / 2 * MM, " L").concat(I / 2 + I / 2 * (1 - MM), ",0 L").concat(I / 2 * VM, ",0 Q0,0 0,").concat(g / 2 * VM, " z");
break;
case "bentConnector2":
i = "M ".concat(I, " 0 L ").concat(I, " ").concat(g, " L 0 ").concat(g);
break;
case "rtTriangle":
i = "M 0 0 L 0 ".concat(g, " L ").concat(I, " ").concat(g, " Z");
break;
case "triangle":
case "flowChartExtract":
case "flowChartMerge":
var U1 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), E1 = 0.5;
U1 && (E1 = parseInt(U1.substring(4)) * Gg);
var fM = I * E1, HM = 0, XM = 0, SM = g, DM = I, KM = g;
if (t === "flowChartMerge") {
var P1 = [I - fM, g - HM];
fM = P1[0], HM = P1[1];
var _1 = [I - XM, g - SM];
XM = _1[0], SM = _1[1];
var q1 = [I - DM, g - KM];
DM = q1[0], KM = q1[1];
}
i = "M ".concat(fM, " ").concat(HM, " L ").concat(XM, " ").concat(SM, " L ").concat(DM, " ").concat(KM, " Z");
break;
case "diamond":
case "flowChartDecision":
case "flowChartSort":
var $1 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), gK = 5e4;
if ($1) {
var FM = U($1, ["attrs", "fmla"]);
FM && FM.startsWith("val ") && (gK = parseInt(FM.substring(4)));
}
var Nd = gK / 1e5;
i = "M ".concat(I * Nd, " 0 L 0 ").concat(g * Nd, " L ").concat(I * Nd, " ").concat(g, " L ").concat(I, " ").concat(g * Nd, " Z"), t === "flowChartSort" && (i += " M 0 ".concat(g * Nd, " L ").concat(I, " ").concat(g * Nd));
break;
case "trapezoid":
case "flowChartManualOperation":
case "flowChartManualInput":
var IK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), x0 = 0.2;
IK && (x0 = 0.5 * (parseInt(IK.substring(4)) * Gg) / 0.7407);
var RG = I * x0, fG = 0, kM = 0, zM = g, JM = I, LM = g, HG = (1 - x0) * I, vM = 0;
if (t === "flowChartManualInput" && (fG = g / 5, RG = I * (x0 = 0), HG = (1 - x0) * I), t === "flowChartManualOperation") {
var CK = [I - RG, g - fG];
RG = CK[0], fG = CK[1];
var tK = [I - kM, g - zM];
kM = tK[0], zM = tK[1];
var iK = [I - JM, g - LM];
JM = iK[0], LM = iK[1];
var eK = [I - HG, g - vM];
HG = eK[0], vM = eK[1];
}
i = "M ".concat(RG, " ").concat(fG, " L ").concat(kM, " ").concat(zM, " L ").concat(JM, " ").concat(LM, " L ").concat(HG, " ").concat(vM, " Z");
break;
case "parallelogram":
case "flowChartInputOutput":
var AK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), TM = 0.25;
if (AK) {
var Uig = I > g ? I / g : g / I;
TM = parseInt(AK.substring(4)) / 1e5 / Uig;
}
i = "M ".concat(TM * I, " 0 L 0 ").concat(g, " L ").concat((1 - TM) * I, " ").concat(g, " L ").concat(I, " 0 Z");
break;
case "pentagon":
i = "M ".concat(0.5 * I, " 0 L 0 ").concat(0.375 * g, " L ").concat(0.15 * I, " ").concat(g, " L ").concat(0.85 * I, " ").concat(g, " L ").concat(I, " ").concat(0.375 * g, " Z");
break;
case "hexagon":
case "flowChartPreparation":
var sK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), XG = 1.9685039370078738;
sK && (XG = parseInt(sK.substring(4)) * Gg);
var lK = 7.874015748031495, Eig = 60 * Math.PI / 180, nK = Math.min(I, g), aK = 3.9370078740157477 * I / nK, xM = nK * (XG < 0 ? 0 : XG > aK ? aK : XG) / lK, oK = I - xM, cK = 9.092125984251968 * (g / 2) / lK * Math.sin(Eig), SG = g / 2, dK = SG - cK, rK = SG + cK;
i = "M 0,".concat(SG, " L ").concat(xM, ",").concat(dK, " L ").concat(oK, ",").concat(dK, " L ").concat(I, ",").concat(SG, " L ").concat(oK, ",").concat(rK, " L ").concat(xM, ",").concat(rK, " z");
break;
case "heptagon":
i = "M ".concat(0.5 * I, " 0 L ").concat(I / 8, " ").concat(g / 4, " L 0 ").concat(5 / 8 * g, " L ").concat(I / 4, " ").concat(g, " L ").concat(3 / 4 * I, " ").concat(g, " L ").concat(I, " ").concat(5 / 8 * g, " L ").concat(7 / 8 * I, " ").concat(g / 4, " Z");
break;
case "octagon":
var hK = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Vd = 0.25;
hK && (Vd = parseInt(hK.substring(4)) / 1e5);
var DG = 1 - Vd;
i = "M ".concat(Vd * I, " 0 L 0 ").concat(Vd * g, " L 0 ").concat(DG * g, " L ").concat(Vd * I, " ").concat(g, " L ").concat(DG * I, " ").concat(g, " L ").concat(I, " ").concat(DG * g, " L ").concat(I, " ").concat(Vd * g, " L ").concat(DG * I, " 0 Z");
break;
case "decagon":
i = "M ".concat(3 / 8 * I, " 0 L ").concat(I / 8, " ").concat(g / 8, " L 0 ").concat(g / 2, " L ").concat(I / 8, " ").concat(7 / 8 * g, " L ").concat(3 / 8 * I, " ").concat(g, " L ").concat(5 / 8 * I, " ").concat(g, " L ").concat(7 / 8 * I, " ").concat(7 / 8 * g, " L ").concat(I, " ").concat(g / 2, " L ").concat(7 / 8 * I, " ").concat(g / 8, " L ").concat(5 / 8 * I, " 0 Z");
break;
case "dodecagon":
i = "M ".concat(3 / 8 * I, " 0 L ").concat(I / 8, " ").concat(g / 8, " L 0 ").concat(3 / 8 * g, " L 0 ").concat(5 / 8 * g, " L ").concat(I / 8, " ").concat(7 / 8 * g, " L ").concat(3 / 8 * I, " ").concat(g, " L ").concat(5 / 8 * I, " ").concat(g, " L ").concat(7 / 8 * I, " ").concat(7 / 8 * g, " L ").concat(I, " ").concat(5 / 8 * g, " L ").concat(I, " ").concat(3 / 8 * g, " L ").concat(7 / 8 * I, " ").concat(g / 8, " L ").concat(5 / 8 * I, " 0 Z");
break;
case "star4":
var KG = I / 2, FG = g / 2, Pig = I / 2, _ig = g / 2, kG = 1.503779527559055, zG = 3.9370078740157477, jM = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
jM && jM.attrs.name === "adj" && (kG = parseInt(jM.attrs.fmla.substring(4)) * Gg);
var bK = kG < 0 ? 0 : kG > zG ? zG : kG, qig = _ig * bK / zG, uK = Pig * bK / zG * Math.cos(0.7853981634), mK = qig * Math.sin(0.7853981634), ZK = KG - uK, GK = KG + uK, wK = FG - mK, pK = FG + mK;
i = "M 0,".concat(FG, " L ").concat(ZK, ",").concat(wK, " L ").concat(KG, ",0 L ").concat(GK, ",").concat(wK, " L ").concat(I, ",").concat(FG, " L ").concat(GK, ",").concat(pK, " L ").concat(KG, ",").concat(g, " L ").concat(ZK, ",").concat(pK, " z");
break;
case "star5":
var xA = I / 2, $ig = g / 2, geg = I / 2, Ieg = g / 2, JG = 1.503779527559055, BK = 8.279212598425197, QM = 8.70527559055118, LG = 3.9370078740157477, OM = 7.874015748031495, Md = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
Md && Object.keys(Md).forEach(function(Mg) {
var RI = Md[Mg].attrs.name;
RI === "adj" ? JG = parseInt(Md[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" ? BK = parseInt(Md[Mg].attrs.fmla.substring(4)) * Gg : RI === "vf" && (QM = parseInt(Md[Mg].attrs.fmla.substring(4)) * Gg);
});
var WK = JG < 0 ? 0 : JG > LG ? LG : JG, UM = geg * BK / OM, EM = Ieg * QM / OM, j0 = $ig * QM / OM, yK = UM * Math.cos(0.31415926536), YK = UM * Math.cos(5.3407075111), Ceg = xA - yK, teg = xA - YK, ieg = xA + YK, eeg = xA + yK, NK = j0 - EM * Math.sin(0.31415926536), VK = j0 - EM * Math.sin(5.3407075111), MK = UM * WK / LG, PM = EM * WK / LG, RK = MK * Math.cos(5.9690260418), fK = MK * Math.cos(0.94247779608), Aeg = xA - RK, seg = xA - fK, leg = xA + fK, neg = xA + RK, HK = j0 - PM * Math.sin(0.94247779608), XK = j0 - PM * Math.sin(5.9690260418), aeg = j0 + PM;
i = "M ".concat(Ceg, ",").concat(NK, " L ").concat(seg, ",").concat(HK, " L ").concat(xA, ",0 L ").concat(leg, ",").concat(HK, " L ").concat(eeg, ",").concat(NK, " L ").concat(neg, ",").concat(XK, " L ").concat(ieg, ",").concat(VK, " L ").concat(xA, ",").concat(aeg, " L ").concat(teg, ",").concat(VK, " L ").concat(Aeg, ",").concat(XK, " z");
break;
case "star6":
var an = I / 2, Q0 = g / 2, oeg = I / 2, ceg = g / 2, _M = g / 4, vG = 2.2730708661417323, SK = 9.092125984251968, TG = 3.9370078740157477, O0 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
O0 && Object.keys(O0).forEach(function(Mg) {
var RI = O0[Mg].attrs.name;
RI === "adj" ? vG = parseInt(O0[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" && (SK = parseInt(O0[Mg].attrs.fmla.substring(4)) * Gg);
});
var DK = vG < 0 ? 0 : vG > TG ? TG : vG, KK = oeg * SK / 7.874015748031495, FK = KK * Math.cos(0.5235987756), kK = an - FK, zK = an + FK, JK = Q0 + _M, qM = KK * DK / TG, LK = qM / 2, deg = an - qM, vK = an - LK, TK = an + LK, reg = an + qM, xK = ceg * DK / TG * Math.sin(1.0471975512), jK = Q0 - xK, QK = Q0 + xK;
i = "M ".concat(kK, ",").concat(_M, " L ").concat(vK, ",").concat(jK, " L ").concat(an, ",0 L ").concat(TK, ",").concat(jK, " L ").concat(zK, ",").concat(_M, " L ").concat(reg, ",").concat(Q0, " L ").concat(zK, ",").concat(JK, " L ").concat(TK, ",").concat(QK, " L ").concat(an, ",").concat(g, " L ").concat(vK, ",").concat(QK, " L ").concat(kK, ",").concat(JK, " L ").concat(deg, ",").concat(Q0, " z");
break;
case "star7":
var Ki = I / 2, heg = g / 2, beg = I / 2, ueg = g / 2, xG = 2.7244881889763777, OK = 8.076535433070866, $M = 8.284251968503936, jG = 3.9370078740157477, gR = 7.874015748031495, Rd = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
Rd && Object.keys(Rd).forEach(function(Mg) {
var RI = Rd[Mg].attrs.name;
RI === "adj" ? xG = parseInt(Rd[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" ? OK = parseInt(Rd[Mg].attrs.fmla.substring(4)) * Gg : RI === "vf" && ($M = parseInt(Rd[Mg].attrs.fmla.substring(4)) * Gg);
});
var UK = xG < 0 ? 0 : xG > jG ? jG : xG, QG = beg * OK / gR, OG = ueg * $M / gR, Ao = heg * $M / gR, EK = 97493 * QG / 1e5, PK = 78183 * QG / 1e5, _K = 43388 * QG / 1e5, meg = Ki - PK, Zeg = Ki - _K, Geg = Ki + _K, weg = Ki + PK, peg = Ki + EK, qK = Ao - 62349 * OG / 1e5, $K = Ao + 22252 * OG / 1e5, gF = Ao + 90097 * OG / 1e5, IR = QG * UK / jG, UG = OG * UK / jG, IF = 97493 * IR / 1e5, CF = 78183 * IR / 1e5, tF = 43388 * IR / 1e5, Beg = Ki - IF, Weg = Ki - CF, yeg = Ki - tF, Yeg = Ki + tF, Neg = Ki + CF, Veg = Ki + IF, iF = Ao - 90097 * UG / 1e5, eF = Ao - 22252 * UG / 1e5, AF = Ao + 62349 * UG / 1e5, Meg = Ao + UG;
i = "M ".concat(Ki - EK, ",").concat($K, " L ").concat(Beg, ",").concat(eF, " L ").concat(meg, ",").concat(qK, " L ").concat(yeg, ",").concat(iF, " L ").concat(Ki, ",0 L ").concat(Yeg, ",").concat(iF, " L ").concat(weg, ",").concat(qK, " L ").concat(Veg, ",").concat(eF, " L ").concat(peg, ",").concat($K, " L ").concat(Neg, ",").concat(AF, " L ").concat(Geg, ",").concat(gF, " L ").concat(Ki, ",").concat(Meg, " L ").concat(Zeg, ",").concat(gF, " L ").concat(Weg, ",").concat(AF, " z");
break;
case "star8":
var on = I / 2, cn = g / 2, sF = I / 2, lF = g / 2, EG = 2.9527559055118107, PG = 3.9370078740157477, CR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
CR && CR.attrs.name === "adj" && (EG = parseInt(CR.attrs.fmla.substring(4)) * Gg);
var nF = EG < 0 ? 0 : EG > PG ? PG : EG, aF = sF * Math.cos(0.7853981634), oF = on - aF, cF = on + aF, dF = lF * Math.sin(0.7853981634), rF = cn - dF, hF = cn + dF, bF = sF * nF / PG, uF = lF * nF / PG, mF = 92388 * bF / 1e5, ZF = 38268 * bF / 1e5, GF = 92388 * uF / 1e5, wF = 38268 * uF / 1e5, pF = on - mF, BF = on - ZF, WF = on + ZF, yF = on + mF, YF = cn - GF, NF = cn - wF, VF = cn + wF, MF = cn + GF;
i = "M 0,".concat(cn, " L ").concat(pF, ",").concat(NF, " L ").concat(oF, ",").concat(rF, " L ").concat(BF, ",").concat(YF, " L ").concat(on, ",0 L ").concat(WF, ",").concat(YF, " L ").concat(cF, ",").concat(rF, " L ").concat(yF, ",").concat(NF, " L ").concat(I, ",").concat(cn, " L ").concat(yF, ",").concat(VF, " L ").concat(cF, ",").concat(hF, " L ").concat(WF, ",").concat(MF, " L ").concat(on, ",").concat(g, " L ").concat(BF, ",").concat(MF, " L ").concat(oF, ",").concat(hF, " L ").concat(pF, ",").concat(VF, " z");
break;
case "star10":
var fe = I / 2, jA = g / 2, Reg = I / 2, tR = g / 2, _G = 3.349055118110236, RF = 8.279212598425197, qG = 3.9370078740157477, U0 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
U0 && Object.keys(U0).forEach(function(Mg) {
var RI = U0[Mg].attrs.name;
RI === "adj" ? _G = parseInt(U0[Mg].attrs.fmla.substring(4)) * Gg : RI === "hf" && (RF = parseInt(U0[Mg].attrs.fmla.substring(4)) * Gg);
});
var fF = _G < 0 ? 0 : _G > qG ? qG : _G, iR = Reg * RF / 7.874015748031495, HF = 95106 * iR / 1e5, XF = 58779 * iR / 1e5, SF = fe - HF, DF = fe - XF, KF = fe + XF, FF = fe + HF, kF = 80902 * tR / 1e5, zF = 30902 * tR / 1e5, JF = jA - kF, LF = jA - zF, vF = jA + zF, TF = jA + kF, $G = iR * fF / qG, xF = tR * fF / qG, jF = 80902 * $G / 1e5, QF = 30902 * $G / 1e5, OF = 95106 * xF / 1e5, UF = 58779 * xF / 1e5, feg = fe - $G, EF = fe - jF, PF = fe - QF, _F = fe + QF, qF = fe + jF, Heg = fe + $G, $F = jA - OF, gk = jA - UF, Ik = jA + UF, Ck = jA + OF;
i = "M ".concat(SF, ",").concat(LF, " L ").concat(EF, ",").concat(gk, " L ").concat(DF, ",").concat(JF, " L ").concat(PF, ",").concat($F, " L ").concat(fe, ",0 L ").concat(_F, ",").concat($F, " L ").concat(KF, ",").concat(JF, " L ").concat(qF, ",").concat(gk, " L ").concat(FF, ",").concat(LF, " L ").concat(Heg, ",").concat(jA, " L ").concat(FF, ",").concat(vF, " L ").concat(qF, ",").concat(Ik, " L ").concat(KF, ",").concat(TF, " L ").concat(_F, ",").concat(Ck, " L ").concat(fe, ",").concat(g, " L ").concat(PF, ",").concat(Ck, " L ").concat(DF, ",").concat(TF, " L ").concat(EF, ",").concat(Ik, " L ").concat(SF, ",").concat(vF, " L ").concat(feg, ",").concat(jA, " z");
break;
case "star12":
var QA = I / 2, OA = g / 2, tk = I / 2, ik = g / 2, ek = g / 4, Ak = I / 4, gw = 2.9527559055118107, Iw = 3.9370078740157477, eR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
eR && eR.attrs.name === "adj" && (gw = parseInt(eR.attrs.fmla.substring(4)) * Gg);
var sk = gw < 0 ? 0 : gw > Iw ? Iw : gw, lk = tk * Math.cos(0.5235987756), nk = ik * Math.sin(1.0471975512), ak = QA - lk, ok = 3 * I / 4, ck = QA + lk, dk = OA - nk, rk = 3 * g / 4, hk = OA + nk, AR = tk * sk / Iw, sR = ik * sk / Iw, bk = AR * Math.cos(0.2617993878), uk = AR * Math.cos(0.7853981634), mk = AR * Math.cos(1.308996939), Zk = sR * Math.sin(1.308996939), Gk = sR * Math.sin(0.7853981634), wk = sR * Math.sin(0.2617993878), pk = QA - bk, Bk = QA - uk, Wk = QA - mk, yk = QA + mk, Yk = QA + uk, Nk = QA + bk, Vk = OA - Zk, Mk = OA - Gk, Rk = OA - wk, fk = OA + wk, Hk = OA + Gk, Xk = OA + Zk;
i = "M 0,".concat(OA, " L ").concat(pk, ",").concat(Rk, " L ").concat(ak, ",").concat(ek, " L ").concat(Bk, ",").concat(Mk, " L ").concat(Ak, ",").concat(dk, " L ").concat(Wk, ",").concat(Vk, " L ").concat(QA, ",0 L ").concat(yk, ",").concat(Vk, " L ").concat(ok, ",").concat(dk, " L ").concat(Yk, ",").concat(Mk, " L ").concat(ck, ",").concat(ek, " L ").concat(Nk, ",").concat(Rk, " L ").concat(I, ",").concat(OA, " L ").concat(Nk, ",").concat(fk, " L ").concat(ck, ",").concat(rk, " L ").concat(Yk, ",").concat(Hk, " L ").concat(ok, ",").concat(hk, " L ").concat(yk, ",").concat(Xk, " L ").concat(QA, ",").concat(g, " L ").concat(Wk, ",").concat(Xk, " L ").concat(Ak, ",").concat(hk, " L ").concat(Bk, ",").concat(Hk, " L ").concat(ak, ",").concat(rk, " L ").concat(pk, ",").concat(fk, " z");
break;
case "star16":
var si = I / 2, li = g / 2, Cw = I / 2, tw = g / 2, iw = 2.9527559055118107, ew = 3.9370078740157477, lR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
lR && lR.attrs.name === "adj" && (iw = parseInt(lR.attrs.fmla.substring(4)) * Gg);
var Sk = iw < 0 ? 0 : iw > ew ? ew : iw, Dk = 92388 * Cw / 1e5, Kk = 70711 * Cw / 1e5, Fk = 38268 * Cw / 1e5, kk = 92388 * tw / 1e5, zk = 70711 * tw / 1e5, Jk = 38268 * tw / 1e5, Lk = si - Dk, vk = si - Kk, Tk = si - Fk, xk = si + Fk, jk = si + Kk, Qk = si + Dk, Ok = li - kk, Uk = li - zk, Ek = li - Jk, Pk = li + Jk, _k = li + zk, qk = li + kk, Aw = Cw * Sk / ew, sw = tw * Sk / ew, $k = 98079 * Aw / 1e5, g3 = 83147 * Aw / 1e5, I3 = 55557 * Aw / 1e5, C3 = 19509 * Aw / 1e5, t3 = 98079 * sw / 1e5, i3 = 83147 * sw / 1e5, e3 = 55557 * sw / 1e5, A3 = 19509 * sw / 1e5, s3 = si - $k, l3 = si - g3, n3 = si - I3, a3 = si - C3, o3 = si + C3, c3 = si + I3, d3 = si + g3, r3 = si + $k, h3 = li - t3, b3 = li - i3, u3 = li - e3, m3 = li - A3, Z3 = li + A3, G3 = li + e3, w3 = li + i3, p3 = li + t3;
i = "M 0,".concat(li, " L ").concat(s3, ",").concat(m3, " L ").concat(Lk, ",").concat(Ek, " L ").concat(l3, ",").concat(u3, " L ").concat(vk, ",").concat(Uk, " L ").concat(n3, ",").concat(b3, " L ").concat(Tk, ",").concat(Ok, " L ").concat(a3, ",").concat(h3, " L ").concat(si, ",0 L ").concat(o3, ",").concat(h3, " L ").concat(xk, ",").concat(Ok, " L ").concat(c3, ",").concat(b3, " L ").concat(jk, ",").concat(Uk, " L ").concat(d3, ",").concat(u3, " L ").concat(Qk, ",").concat(Ek, " L ").concat(r3, ",").concat(m3, " L ").concat(I, ",").concat(li, " L ").concat(r3, ",").concat(Z3, " L ").concat(Qk, ",").concat(Pk, " L ").concat(d3, ",").concat(G3, " L ").concat(jk, ",").concat(_k, " L ").concat(c3, ",").concat(w3, " L ").concat(xk, ",").concat(qk, " L ").concat(o3, ",").concat(p3, " L ").concat(si, ",").concat(g, " L ").concat(a3, ",").concat(p3, " L ").concat(Tk, ",").concat(qk, " L ").concat(n3, ",").concat(w3, " L ").concat(vk, ",").concat(_k, " L ").concat(l3, ",").concat(G3, " L ").concat(Lk, ",").concat(Pk, " L ").concat(s3, ",").concat(Z3, " z");
break;
case "star24":
var DC = I / 2, KC = g / 2, E0 = I / 2, P0 = g / 2, Xeg = g / 4, Seg = I / 4, lw = 2.9527559055118107, nw = 3.9370078740157477, nR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
nR && nR.attrs.name === "adj" && (lw = parseInt(nR.attrs.fmla.substring(4)) * Gg);
var B3 = lw < 0 ? 0 : lw > nw ? nw : lw, W3 = E0 * Math.cos(0.2617993878), y3 = E0 * Math.cos(0.5235987756), Y3 = E0 * Math.cos(0.7853981634), N3 = Seg, V3 = E0 * Math.cos(1.308996939), M3 = P0 * Math.sin(1.308996939), R3 = P0 * Math.sin(1.0471975512), f3 = P0 * Math.sin(0.7853981634), H3 = Xeg, X3 = P0 * Math.sin(0.2617993878), S3 = DC - W3, D3 = DC - y3, K3 = DC - Y3, F3 = DC - N3, k3 = DC - V3, z3 = DC + V3, J3 = DC + N3, L3 = DC + Y3, v3 = DC + y3, T3 = DC + W3, x3 = KC - M3, j3 = KC - R3, Q3 = KC - f3, O3 = KC - H3, U3 = KC - X3, E3 = KC + X3, P3 = KC + H3, _3 = KC + f3, q3 = KC + R3, $3 = KC + M3, fd = E0 * B3 / nw, Hd = P0 * B3 / nw, gz = 99144 * fd / 1e5, Iz = 92388 * fd / 1e5, Cz = 79335 * fd / 1e5, tz = 60876 * fd / 1e5, iz = 38268 * fd / 1e5, ez = 13053 * fd / 1e5, Az = 99144 * Hd / 1e5, sz = 92388 * Hd / 1e5, lz = 79335 * Hd / 1e5, nz = 60876 * Hd / 1e5, az = 38268 * Hd / 1e5, oz = 13053 * Hd / 1e5, cz = DC - gz, dz = DC - Iz, rz = DC - Cz, hz = DC - tz, bz = DC - iz, uz = DC - ez, mz = DC + ez, Zz = DC + iz, Gz = DC + tz, wz = DC + Cz, pz = DC + Iz, Bz = DC + gz, Wz = KC - Az, yz = KC - sz, Yz = KC - lz, Nz = KC - nz, Vz = KC - az, Mz = KC - oz, Rz = KC + oz, fz = KC + az, Hz = KC + nz, Xz = KC + lz, Sz = KC + sz, Dz = KC + Az;
i = "M 0,".concat(KC, " L ").concat(cz, ",").concat(Mz, " L ").concat(S3, ",").concat(U3, " L ").concat(dz, ",").concat(Vz, " L ").concat(D3, ",").concat(O3, " L ").concat(rz, ",").concat(Nz, " L ").concat(K3, ",").concat(Q3, " L ").concat(hz, ",").concat(Yz, " L ").concat(F3, ",").concat(j3, " L ").concat(bz, ",").concat(yz, " L ").concat(k3, ",").concat(x3, " L ").concat(uz, ",").concat(Wz, " L ").concat(DC, ",0 L ").concat(mz, ",").concat(Wz, " L ").concat(z3, ",").concat(x3, " L ").concat(Zz, ",").concat(yz, " L ").concat(J3, ",").concat(j3, " L ").concat(Gz, ",").concat(Yz, " L ").concat(L3, ",").concat(Q3, " L ").concat(wz, ",").concat(Nz, " L ").concat(v3, ",").concat(O3, " L ").concat(pz, ",").concat(Vz, " L ").concat(T3, ",").concat(U3, " L ").concat(Bz, ",").concat(Mz, " L ").concat(I, ",").concat(KC, " L ").concat(Bz, ",").concat(Rz, " L ").concat(T3, ",").concat(E3, " L ").concat(pz, ",").concat(fz, " L ").concat(v3, ",").concat(P3, " L ").concat(wz, ",").concat(Hz, " L ").concat(L3, ",").concat(_3, " L ").concat(Gz, ",").concat(Xz, " L ").concat(J3, ",").concat(q3, " L ").concat(Zz, ",").concat(Sz, " L ").concat(z3, ",").concat($3, " L ").concat(mz, ",").concat(Dz, " L ").concat(DC, ",").concat(g, " L ").concat(uz, ",").concat(Dz, " L ").concat(k3, ",").concat($3, " L ").concat(bz, ",").concat(Sz, " L ").concat(F3, ",").concat(q3, " L ").concat(hz, ",").concat(Xz, " L ").concat(K3, ",").concat(_3, " L ").concat(rz, ",").concat(Hz, " L ").concat(D3, ",").concat(P3, " L ").concat(dz, ",").concat(fz, " L ").concat(S3, ",").concat(E3, " L ").concat(cz, ",").concat(Rz, " z");
break;
case "star32":
var nC = I / 2, aC = g / 2, dn = I / 2, rn = g / 2, aw = 2.9527559055118107, ow = 3.9370078740157477, aR = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
aR && aR.attrs.name === "adj" && (aw = parseInt(aR.attrs.fmla.substring(4)) * Gg);
var Kz = aw < 0 ? 0 : aw > ow ? ow : aw, Fz = 98079 * dn / 1e5, kz = 92388 * dn / 1e5, zz = 83147 * dn / 1e5, Jz = dn * Math.cos(0.7853981634), Lz = 55557 * dn / 1e5, vz = 38268 * dn / 1e5, Tz = 19509 * dn / 1e5, xz = 98079 * rn / 1e5, jz = 92388 * rn / 1e5, Qz = 83147 * rn / 1e5, Oz = rn * Math.sin(0.7853981634), Uz = 55557 * rn / 1e5, Ez = 38268 * rn / 1e5, Pz = 19509 * rn / 1e5, _z = nC - Fz, qz = nC - kz, $z = nC - zz, gJ = nC - Jz, IJ = nC - Lz, CJ = nC - vz, tJ = nC - Tz, iJ = nC + Tz, eJ = nC + vz, AJ = nC + Lz, sJ = nC + Jz, lJ = nC + zz, nJ = nC + kz, aJ = nC + Fz, oJ = aC - xz, cJ = aC - jz, dJ = aC - Qz, rJ = aC - Oz, hJ = aC - Uz, bJ = aC - Ez, uJ = aC - Pz, mJ = aC + Pz, ZJ = aC + Ez, GJ = aC + Uz, wJ = aC + Oz, pJ = aC + Qz, BJ = aC + jz, WJ = aC + xz, hn = dn * Kz / ow, bn = rn * Kz / ow, yJ = 99518 * hn / 1e5, YJ = 95694 * hn / 1e5, NJ = 88192 * hn / 1e5, VJ = 77301 * hn / 1e5, MJ = 63439 * hn / 1e5, RJ = 47140 * hn / 1e5, fJ = 29028 * hn / 1e5, HJ = 9802 * hn / 1e5, XJ = 99518 * bn / 1e5, SJ = 95694 * bn / 1e5, DJ = 88192 * bn / 1e5, KJ = 77301 * bn / 1e5, FJ = 63439 * bn / 1e5, kJ = 47140 * bn / 1e5, zJ = 29028 * bn / 1e5, JJ = 9802 * bn / 1e5, LJ = nC - yJ, vJ = nC - YJ, TJ = nC - NJ, xJ = nC - VJ, jJ = nC - MJ, QJ = nC - RJ, OJ = nC - fJ, UJ = nC - HJ, EJ = nC + HJ, PJ = nC + fJ, _J = nC + RJ, qJ = nC + MJ, $J = nC + VJ, gL = nC + NJ, IL = nC + YJ, CL = nC + yJ, tL = aC - XJ, iL = aC - SJ, eL = aC - DJ, AL = aC - KJ, sL = aC - FJ, lL = aC - kJ, nL = aC - zJ, aL = aC - JJ, oL = aC + JJ, cL = aC + zJ, dL = aC + kJ, rL = aC + FJ, hL = aC + KJ, bL = aC + DJ, uL = aC + SJ, mL = aC + XJ;
i = "M 0,".concat(aC, " L ").concat(LJ, ",").concat(aL, " L ").concat(_z, ",").concat(uJ, " L ").concat(vJ, ",").concat(nL, " L ").concat(qz, ",").concat(bJ, " L ").concat(TJ, ",").concat(lL, " L ").concat($z, ",").concat(hJ, " L ").concat(xJ, ",").concat(sL, " L ").concat(gJ, ",").concat(rJ, " L ").concat(jJ, ",").concat(AL, " L ").concat(IJ, ",").concat(dJ, " L ").concat(QJ, ",").concat(eL, " L ").concat(CJ, ",").concat(cJ, " L ").concat(OJ, ",").concat(iL, " L ").concat(tJ, ",").concat(oJ, " L ").concat(UJ, ",").concat(tL, " L ").concat(nC, ",0 L ").concat(EJ, ",").concat(tL, " L ").concat(iJ, ",").concat(oJ, " L ").concat(PJ, ",").concat(iL, " L ").concat(eJ, ",").concat(cJ, " L ").concat(_J, ",").concat(eL, " L ").concat(AJ, ",").concat(dJ, " L ").concat(qJ, ",").concat(AL, " L ").concat(sJ, ",").concat(rJ, " L ").concat($J, ",").concat(sL, " L ").concat(lJ, ",").concat(hJ, " L ").concat(gL, ",").concat(lL, " L ").concat(nJ, ",").concat(bJ, " L ").concat(IL, ",").concat(nL, " L ").concat(aJ, ",").concat(uJ, " L ").concat(CL, ",").concat(aL, " L ").concat(I, ",").concat(aC, " L ").concat(CL, ",").concat(oL, " L ").concat(aJ, ",").concat(mJ, " L ").concat(IL, ",").concat(cL, " L ").concat(nJ, ",").concat(ZJ, " L ").concat(gL, ",").concat(dL, " L ").concat(lJ, ",").concat(GJ, " L ").concat($J, ",").concat(rL, " L ").concat(sJ, ",").concat(wJ, " L ").concat(qJ, ",").concat(hL, " L ").concat(AJ, ",").concat(pJ, " L ").concat(_J, ",").concat(bL, " L ").concat(eJ, ",").concat(BJ, " L ").concat(PJ, ",").concat(uL, " L ").concat(iJ, ",").concat(WJ, " L ").concat(EJ, ",").concat(mL, " L ").concat(nC, ",").concat(g, " L ").concat(UJ, ",").concat(mL, " L ").concat(tJ, ",").concat(WJ, " L ").concat(OJ, ",").concat(uL, " L ").concat(CJ, ",").concat(BJ, " L ").concat(QJ, ",").concat(bL, " L ").concat(IJ, ",").concat(pJ, " L ").concat(jJ, ",").concat(hL, " L ").concat(gJ, ",").concat(wJ, " L ").concat(xJ, ",").concat(rL, " L ").concat($z, ",").concat(GJ, " L ").concat(TJ, ",").concat(dL, " L ").concat(qz, ",").concat(ZJ, " L ").concat(vJ, ",").concat(cL, " L ").concat(_z, ",").concat(mJ, " L ").concat(LJ, ",").concat(oL, " z");
break;
case "pie":
case "pieWedge":
case "arc":
var _0, q0, cw, dw, rw = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
if (t === "pie" ? (_0 = 0, q0 = 270, cw = g, dw = !0) : t === "pieWedge" ? (_0 = 180, q0 = 270, cw = 2 * g, dw = !0) : t === "arc" && (_0 = 270, q0 = 0, cw = g, dw = !1), rw) {
var $0 = U(rw, ["attrs", "fmla"]), oR = $0;
$0 === void 0 && ($0 = rw[0].attrs.fmla, oR = rw[1].attrs.fmla), $0 && (_0 = parseInt($0.substring(4)) / 6e4), oR && (q0 = parseInt(oR.substring(4)) / 6e4);
}
i = function(Mg, RI, YC, QC, OC) {
var zi = function(Mu) {
var Jo = Number(Mu);
if (!Number.isFinite(Jo)) return 0;
var ve = Jo % 360;
return ve < 0 && (ve += 360), ve;
}, UC = zi(YC), Ct = zi(QC), Zt = Ct - UC;
Zt < 0 && (Zt += 360), Zt = Math.min(Math.max(Zt, 0), 360);
var Ht = Number(Mg), ee = Number(RI) / 2, Qt = Ht / 2, Gt = ee, Ot = Qt, at = function(Mu) {
return Mu * (Math.PI / 180);
}, Je = Gt + Math.cos(at(UC)) * ee, Le = Ot + Math.sin(at(UC)) * Qt, RY = Gt + Math.cos(at(Ct)) * ee, fY = Ot + Math.sin(at(Ct)) * Qt, HY = Zt > 180 ? 1 : 0;
return OC ? "M".concat(Gt, ",").concat(Ot, " L").concat(Je, ",").concat(Le, " A").concat(ee, ",").concat(Qt, " 0 ").concat(HY, ",").concat(1, " ").concat(RY, ",").concat(fY, " Z") : "M".concat(Je, ",").concat(Le, " A").concat(ee, ",").concat(Qt, " 0 ").concat(HY, ",").concat(1, " ").concat(RY, ",").concat(fY);
}(cw, I, _0, q0, dw);
break;
case "chord":
var ZL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), GL = 45, wL = 270;
if (ZL) {
var pL, hw = HI(ZL);
try {
for (hw.s(); !(pL = hw.n()).done; ) {
var cR = pL.value, BL = U(cR, ["attrs", "name"]);
if (BL === "adj1") {
var Deg = U(cR, ["attrs", "fmla"]);
GL = parseInt(Deg.substring(4)) / 6e4;
} else if (BL === "adj2") {
var Keg = U(cR, ["attrs", "fmla"]);
wL = parseInt(Keg.substring(4)) / 6e4;
}
}
} catch (Mg) {
hw.e(Mg);
} finally {
hw.f();
}
}
var WL = g / 2, yL = I / 2;
i = Vg(yL, WL, yL, WL, GL, wL, !0);
break;
case "frame":
var YL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), bw = 0.9842519685039369, NL = 3.9370078740157477;
YL && (bw = parseInt(YL.substring(4)) * Gg);
var Feg = bw < 0 ? 0 : bw > NL ? NL : bw, Xd = Math.min(I, g) * Feg / 7.874015748031495, VL = I - Xd, ML = g - Xd;
i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(Xd, ",").concat(Xd, " L ").concat(Xd, ",").concat(ML, " L ").concat(VL, ",").concat(ML, " L ").concat(VL, ",").concat(Xd, " z");
break;
case "donut":
var RL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), uw = 1.9685039370078738, fL = 3.9370078740157477;
RL && (uw = parseInt(RL.substring(4)) * Gg);
var keg = uw < 0 ? 0 : uw > fL ? fL : uw, HL = Math.min(I, g) * keg / 7.874015748031495, gb = I / 2 - HL, XL = g / 2 - HL, zeg = "M ".concat(I / 2 - I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 + I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 - I / 2, ",").concat(g / 2, " Z"), Jeg = "M ".concat(I / 2 + gb, ",").concat(g / 2, " A ").concat(gb, ",").concat(XL, " 0 1,1 ").concat(I / 2 - gb, ",").concat(g / 2, " A ").concat(gb, ",").concat(XL, " 0 1,1 ").concat(I / 2 + gb, ",").concat(g / 2, " Z");
i = "".concat(zeg, " ").concat(Jeg);
break;
case "noSmoking":
var SL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), mw = 1.4763779527559053, DL = 3.9370078740157477;
SL && (mw = parseInt(SL.substring(4)) * Gg);
var Leg = mw < 0 ? 0 : mw > DL ? DL : mw, dR = Math.min(I, g) * Leg / 7.874015748031495, Zw = I / 2 - dR, Gw = g / 2 - dR, rR = Math.atan(g / I), KL = Gw * Math.cos(rR), FL = Zw * Math.sin(rR), veg = Zw * Gw / Math.sqrt(KL * KL + FL * FL), Teg = dR / 2, kL = Math.atan(Teg / veg), zL = -Math.PI + 2 * kL, hR = rR - kL, JL = hR - Math.PI, xeg = "M ".concat(I / 2 - I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 + I / 2, ",").concat(g / 2, " A ").concat(I / 2, ",").concat(g / 2, " 0 1,0 ").concat(I / 2 - I / 2, ",").concat(g / 2, " Z"), LL = I / 2, vL = g / 2, jeg = yq(LL, vL, Zw, Gw, hR, hR + zL), Qeg = yq(LL, vL, Zw, Gw, JL, JL + zL);
i = "".concat(xeg, " ").concat(jeg, " ").concat(Qeg);
break;
case "halfFrame":
var TL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), ww = 3.5, pw = 3.5, Bw = 7.874015748031495;
if (TL) {
var xL, Ww = HI(TL);
try {
for (Ww.s(); !(xL = Ww.n()).done; ) {
var bR = xL.value, jL = U(bR, ["attrs", "name"]);
jL === "adj1" ? ww = parseInt(U(bR, ["attrs", "fmla"]).substring(4)) * Gg : jL === "adj2" && (pw = parseInt(U(bR, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
Ww.e(Mg);
} finally {
Ww.f();
}
}
var yw = Math.min(I, g), QL = Bw * I / yw, Yw = yw * (pw < 0 ? 0 : pw > QL ? QL : pw) / Bw, OL = Bw * (g - g * Yw / I) / yw, uR = yw * (ww < 0 ? 0 : ww > OL ? OL : ww) / Bw, Oeg = I - uR * I / g, Ueg = g - Yw * g / I;
i = "M 0,0 L ".concat(I, ",0 L ").concat(Oeg, ",").concat(uR, " L ").concat(Yw, ",").concat(uR, " L ").concat(Yw, ",").concat(Ueg, " L 0,").concat(g, " z");
break;
case "blockArc":
var UL = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Nw = 180, Vw = 0, Mw = 1.9685039370078738, EL = 3.9370078740157477;
if (UL) {
var PL, Rw = HI(UL);
try {
for (Rw.s(); !(PL = Rw.n()).done; ) {
var fw = PL.value, mR = U(fw, ["attrs", "name"]);
mR === "adj1" ? Nw = parseInt(U(fw, ["attrs", "fmla"]).substring(4)) / 6e4 : mR === "adj2" ? Vw = parseInt(U(fw, ["attrs", "fmla"]).substring(4)) / 6e4 : mR === "adj3" && (Mw = parseInt(U(fw, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
Rw.e(Mg);
} finally {
Rw.f();
}
}
var ZR, GR, Ib = 360, Sd = Nw < 0 ? 0 : Nw > Ib ? Ib : Nw, Hw = Vw < 0 ? 0 : Vw > Ib ? Ib : Vw, Eeg = Mw < 0 ? 0 : Mw > EL ? EL : Mw, wR = Hw - Sd, _L = wR > 0 ? wR : wR + Ib, Cb = Sd + _L, Peg = Hw + -_L, Xw = Sd * Math.PI / 180, Sw = Hw * Math.PI / 180, un = I / 2, mn = g / 2, Dw = I / 2, Kw = g / 2;
if (Sd > 90 && Sd < 270) {
var qL = un * Math.sin(Math.PI / 2 - Xw), $L = mn * Math.cos(Math.PI / 2 - Xw);
ZR = Dw - un * Math.cos(Math.atan($L / qL)), GR = Kw - mn * Math.sin(Math.atan($L / qL));
} else {
var gv = un * Math.sin(Xw), Iv = mn * Math.cos(Xw);
ZR = Dw + un * Math.cos(Math.atan(gv / Iv)), GR = Kw + mn * Math.sin(Math.atan(gv / Iv));
}
var pR, BR, Cv = Math.min(I, g) * Eeg / 7.874015748031495, tb = un - Cv, ib = mn - Cv;
if (Cb <= 450 && Cb > 270 || Cb >= 630 && Cb < 720) {
var tv = tb * Math.sin(Sw), iv = ib * Math.cos(Sw);
pR = Dw + tb * Math.cos(Math.atan(tv / iv)), BR = Kw + ib * Math.sin(Math.atan(tv / iv));
} else {
var ev = tb * Math.sin(Math.PI / 2 - Sw), Av = ib * Math.cos(Math.PI / 2 - Sw);
pR = Dw - tb * Math.cos(Math.atan(Av / ev)), BR = Kw - ib * Math.sin(Math.atan(Av / ev));
}
i = "M ".concat(ZR, ",").concat(GR, " ").concat(Vg(un, mn, un, mn, Sd, Cb, !1).replace("M", "L"), " L ").concat(pR, ",").concat(BR, " ").concat(Vg(un, mn, tb, ib, Hw, Peg, !1).replace("M", "L"), " z");
break;
case "bracePair":
var sv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Fw = 0.6561417322834645, lv = 1.9685039370078738;
sv && (Fw = parseInt(sv.substring(4)) * Gg);
var nv = g / 2, kw = 180, av = Fw < 0 ? 0 : Fw > lv ? lv : Fw, ov = Math.min(I, g), MC = ov * av / 7.874015748031495, zw = ov * av / 3.9370078740157477, WR = I - zw, cv = I - MC, yR = nv - MC, YR = nv + MC, NR = g - MC;
i = "M ".concat(zw, ",").concat(g, " ").concat(Vg(zw, NR, MC, MC, 90, kw, !1).replace("M", "L"), " L ").concat(MC, ",").concat(YR, " ").concat(Vg(0, YR, MC, MC, 0, -90, !1).replace("M", "L"), " ").concat(Vg(0, yR, MC, MC, 90, 0, !1).replace("M", "L"), " L ").concat(MC, ",").concat(MC, " ").concat(Vg(zw, MC, MC, MC, kw, 270, !1).replace("M", "L"), " M ").concat(WR, ",0 ").concat(Vg(WR, MC, MC, MC, 270, 360, !1).replace("M", "L"), " L ").concat(cv, ",").concat(yR, " ").concat(Vg(I, yR, MC, MC, kw, 90, !1).replace("M", "L"), " ").concat(Vg(I, YR, MC, MC, 270, kw, !1).replace("M", "L"), " L ").concat(cv, ",").concat(NR, " ").concat(Vg(WR, NR, MC, MC, 0, 90, !1).replace("M", "L"));
break;
case "leftBrace":
var dv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Jw = 0.6561417322834645, Lw = 3.9370078740157477, eb = 7.874015748031495;
if (dv) {
var rv, vw = HI(dv);
try {
for (vw.s(); !(rv = vw.n()).done; ) {
var VR = rv.value, hv = U(VR, ["attrs", "name"]);
hv === "adj1" ? Jw = parseInt(U(VR, ["attrs", "fmla"]).substring(4)) * Gg : hv === "adj2" && (Lw = parseInt(U(VR, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
vw.e(Mg);
} finally {
vw.f();
}
}
var Tw = Lw < 0 ? 0 : Lw > eb ? eb : Lw, bv = Math.min(I, g), uv = eb - Tw, mv = (uv < Tw ? uv : Tw) / 2 * g / bv, Os = bv * (Jw < 0 ? 0 : Jw > mv ? mv : Jw) / eb, Zv = g * Tw / eb, _eg = Zv - Os, Gv = Zv + Os;
i = "M ".concat(I, ",").concat(g, " ").concat(Vg(I, g - Os, I / 2, Os, 90, 180, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Gv, " ").concat(Vg(0, Gv, I / 2, Os, 0, -90, !1).replace("M", "L"), " ").concat(Vg(0, _eg, I / 2, Os, 90, 0, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Os, " ").concat(Vg(I, Os, I / 2, Os, 180, 270, !1).replace("M", "L"));
break;
case "rightBrace":
var wv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), xw = 0.6561417322834645, jw = 3.9370078740157477, Ab = 7.874015748031495;
if (wv) {
var pv, Qw = HI(wv);
try {
for (Qw.s(); !(pv = Qw.n()).done; ) {
var MR = pv.value, Bv = U(MR, ["attrs", "name"]);
Bv === "adj1" ? xw = parseInt(U(MR, ["attrs", "fmla"]).substring(4)) * Gg : Bv === "adj2" && (jw = parseInt(U(MR, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
Qw.e(Mg);
} finally {
Qw.f();
}
}
var Ow = jw < 0 ? 0 : jw > Ab ? Ab : jw, Wv = Math.min(I, g), yv = Ab - Ow, Yv = (yv < Ow ? yv : Ow) / 2 * g / Wv, Zn = Wv * (xw < 0 ? 0 : xw > Yv ? Yv : xw) / Ab, Nv = g * Ow / Ab, Vv = Nv - Zn, Mv = g - Zn;
i = "M 0,0 ".concat(Vg(0, Zn, I / 2, Zn, 270, 360, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Vv, " ").concat(Vg(I, Vv, I / 2, Zn, 180, 90, !1).replace("M", "L"), " ").concat(Vg(I, Nv + Zn, I / 2, Zn, 270, 180, !1).replace("M", "L"), " L ").concat(I / 2, ",").concat(Mv, " ").concat(Vg(0, Mv, I / 2, Zn, 0, 90, !1).replace("M", "L"));
break;
case "bracketPair":
var Rv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Uw = 1.3123622047244095, fv = 3.9370078740157477;
Rv && (Uw = parseInt(Rv.substring(4)) * Gg);
var qeg = Uw < 0 ? 0 : Uw > fv ? fv : Uw, Fi = Math.min(I, g) * qeg / 7.874015748031495, Hv = I - Fi, Xv = g - Fi;
i = "".concat(Vg(Fi, Fi, Fi, Fi, 270, 180, !1), " ").concat(Vg(Fi, Xv, Fi, Fi, 180, 90, !1).replace("M", "L"), " ").concat(Vg(Hv, Fi, Fi, Fi, 270, 360, !1), " ").concat(Vg(Hv, Xv, Fi, Fi, 0, 90, !1).replace("M", "L"));
break;
case "leftBracket":
var Sv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Ew = 0.6561417322834645, Dv = 3.9370078740157477 * g / Math.min(I, g);
Sv && (Ew = parseInt(Sv.substring(4)) * Gg);
var $eg = Ew < 0 ? 0 : Ew > Dv ? Dv : Ew, aA = Math.min(I, g) * $eg / 7.874015748031495;
aA > I && (aA = I);
var gAg = g - aA;
i = "M ".concat(I, ",").concat(g, " ").concat(Vg(aA, gAg, aA, aA, 90, 180, !1).replace("M", "L"), " L 0,").concat(aA, " ").concat(Vg(aA, aA, aA, aA, 180, 270, !1).replace("M", "L"), " L ").concat(I, ",0");
break;
case "rightBracket":
var Kv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Pw = 0.6561417322834645, Fv = 3.9370078740157477 * g / Math.min(I, g);
Kv && (Pw = parseInt(Kv.substring(4)) * Gg);
var IAg = Pw < 0 ? 0 : Pw > Fv ? Fv : Pw, so = Math.min(I, g) * IAg / 7.874015748031495, CAg = g - so, kv = I - so;
i = "M 0,".concat(g, " ").concat(Vg(kv, CAg, so, so, 90, 0, !1).replace("M", "L"), " L ").concat(I, ",").concat(g / 2, " ").concat(Vg(kv, so, so, so, 360, 270, !1).replace("M", "L"), " L 0,0");
break;
case "moon":
var zv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Jv = 0.5;
zv && (Jv = parseInt(zv.substring(4)) / 1e5);
var _w = g / 2, tAg = (1 - Jv) * I;
i = "M ".concat(I, ",").concat(g, " ").concat(Vg(I, _w, I, _w, 90, 270, !1).replace("M", "L"), " ").concat(Vg(I, _w, tAg, _w, 270, 90, !1).replace("M", "L"), " z");
break;
case "corner":
var Lv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), qw = 3.9370078740157477, $w = 3.9370078740157477, gp = 7.874015748031495;
if (Lv) {
var vv, Ip = HI(Lv);
try {
for (Ip.s(); !(vv = Ip.n()).done; ) {
var RR = vv.value, Tv = U(RR, ["attrs", "name"]);
Tv === "adj1" ? qw = parseInt(U(RR, ["attrs", "fmla"]).substring(4)) * Gg : Tv === "adj2" && ($w = parseInt(U(RR, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
Ip.e(Mg);
} finally {
Ip.f();
}
}
var Cp = Math.min(I, g), xv = gp * g / Cp, jv = gp * I / Cp, Qv = Cp * ($w < 0 ? 0 : $w > jv ? jv : $w) / gp, Ov = g - Cp * (qw < 0 ? 0 : qw > xv ? xv : qw) / gp;
i = "M 0,0 L ".concat(Qv, ",0 L ").concat(Qv, ",").concat(Ov, " L ").concat(I, ",").concat(Ov, " L ").concat(I, ",").concat(g, " L 0,").concat(g, " z");
break;
case "diagStripe":
var Uv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), tp = 3.9370078740157477, ip = 7.874015748031495;
Uv && (tp = parseInt(Uv.substring(4)) * Gg);
var Ev = tp < 0 ? 0 : tp > ip ? ip : tp, iAg = I * Ev / ip;
i = "M 0,".concat(g * Ev / ip, " L ").concat(iAg, ",0 L ").concat(I, ",0 L 0,").concat(g, " z");
break;
case "gear6":
case "gear9":
i = function(Mg, RI) {
for (var YC = 1.5 * Mg, QC = YC, OC = YC, zi = RI, UC = YC, Ct = Mg, Zt = 2 * Math.PI, Ht = Zt / (2 * zi), ee = 35 * Ht * 5e-3, Qt = 50 * Ht * 5e-3, Gt = Ht, Ot = !1, at = " M" + (QC + UC * Math.cos(Qt)) + " " + (OC + UC * Math.sin(Qt)); Gt <= Zt + Ht; Gt += Ht) Ot ? (at += " L" + (QC + Ct * Math.cos(Gt - ee)) + "," + (OC + Ct * Math.sin(Gt - ee)), at += " L" + (QC + UC * Math.cos(Gt + Qt)) + "," + (OC + UC * Math.sin(Gt + Qt))) : (at += " L" + (QC + UC * Math.cos(Gt - Qt)) + "," + (OC + UC * Math.sin(Gt - Qt)), at += " L" + (QC + Ct * Math.cos(Gt + ee)) + "," + (OC + Ct * Math.sin(Gt + ee))), Ot = !Ot;
return at + " ";
}(I, g / 3.5, parseInt(t.substring(4)));
break;
case "bentConnector3":
var Pv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), fR = 0.5;
Pv && (fR = parseInt(Pv.substring(4)) / 1e5), i = "M 0 0 L ".concat(fR * I, " 0 L ").concat(fR * I, " ").concat(g, " L ").concat(I, " ").concat(g);
break;
case "plus":
var _v = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), UA = 0.25;
_v && (UA = parseInt(_v.substring(4)) / 1e5);
var Gn = 1 - UA;
i = "M ".concat(UA * I, " 0 L ").concat(UA * I, " ").concat(UA * g, " L 0 ").concat(UA * g, " L 0 ").concat(Gn * g, " L ").concat(UA * I, " ").concat(Gn * g, " L ").concat(UA * I, " ").concat(g, " L ").concat(Gn * I, " ").concat(g, " L ").concat(Gn * I, " ").concat(Gn * g, " L ").concat(I, " ").concat(Gn * g, " L ").concat(I, " ").concat(UA * g, " L ").concat(Gn * I, " ").concat(UA * g, " L ").concat(Gn * I, " 0 Z");
break;
case "teardrop":
var qv = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), sb = 7.874015748031495, $v = sb, gT = 15.74803149606299;
qv && (sb = parseInt(qv.substring(4)) * Gg);
var IT = sb < 0 ? 0 : sb > gT ? gT : sb, CT = Math.sqrt(2), eAg = CT * (I / 2) * IT / $v, AAg = CT * (g / 2) * IT / $v, tT = 45 * Math.PI / 180, sAg = eAg * Math.cos(tT), lAg = AAg * Math.cos(tT), iT = I / 2 + sAg, eT = g / 2 - lAg, nAg = (I / 2 + iT) / 2, aAg = (g / 2 + eT) / 2;
i = "".concat(Vg(I / 2, g / 2, I / 2, g / 2, 180, 270, !1), " Q ").concat(nAg, ",0 ").concat(iT, ",").concat(eT, " Q ").concat(I, ",").concat(aAg, " ").concat(I, ",").concat(g / 2, " ").concat(Vg(I / 2, g / 2, I / 2, g / 2, 0, 90, !1).replace("M", "L"), " ").concat(Vg(I / 2, g / 2, I / 2, g / 2, 90, 180, !1).replace("M", "L"), " z");
break;
case "plaque":
var AT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), ep = 1.3123622047244095, sT = 3.9370078740157477;
AT && (ep = parseInt(AT.substring(4)) * Gg);
var He = (ep < 0 ? 0 : ep > sT ? sT : ep) * Math.min(I, g) / 7.874015748031495, oAg = I - He, cAg = g - He;
i = "M 0,".concat(He, " ").concat(Vg(0, 0, He, He, 90, 0, !1).replace("M", "L"), " L ").concat(oAg, ",0 ").concat(Vg(I, 0, He, He, 180, 90, !1).replace("M", "L"), " L ").concat(I, ",").concat(cAg, " ").concat(Vg(I, g, He, He, 270, 180, !1).replace("M", "L"), " L ").concat(He, ",").concat(g, " ").concat(Vg(0, g, He, He, 0, -90, !1).replace("M", "L"), " z");
break;
case "sun":
var lT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Us = Gg, Ap = 25e3 * Us, nT = 12500 * Us, aT = 46875 * Us;
lT && (Ap = parseInt(lT.substring(4)) * Us);
var oT = Ap < nT ? nT : Ap > aT ? aT : Ap, HR = 5e4 * Us, xC = 1e5 * Us, sp = HR - oT, lp = 3 * (HR - 30274 * sp / 32768) / 4, cT = 3 * (HR - 12540 * sp / 32768) / 4, XR = lp + 3662 * Us, SR = cT + 36620 * Us, DR = cT + 12500 * Us, dT = xC - lp, rT = xC - XR, hT = xC - SR, bT = xC - DR, uT = 18436 * I / 21600, mT = 3163 * g / 21600, ZT = 3163 * I / 21600, GT = 18436 * g / 21600, wT = I * lp / xC, pT = I * XR / xC, BT = I * SR / xC, WT = I * DR / xC, yT = I * dT / xC, YT = I * rT / xC, NT = I * hT / xC, VT = I * bT / xC, dAg = I * oT / xC, rAg = I * sp / xC, hAg = g * sp / xC, MT = g * lp / xC, RT = g * XR / xC, fT = g * SR / xC, HT = g * DR / xC, XT = g * dT / xC, ST = g * rT / xC, DT = g * hT / xC, KT = g * bT / xC;
i = "M ".concat(I, ",").concat(g / 2, " L ").concat(yT, ",").concat(KT, " L ").concat(yT, ",").concat(HT, " z M ").concat(uT, ",").concat(mT, " L ").concat(YT, ",").concat(DT, " L ").concat(BT, ",").concat(RT, " z M ").concat(I / 2, ",0 L ").concat(VT, ",").concat(MT, " L ").concat(WT, ",").concat(MT, " z M ").concat(ZT, ",").concat(mT, " L ").concat(NT, ",").concat(RT, " L ").concat(pT, ",").concat(DT, " z M 0,").concat(g / 2, " L ").concat(wT, ",").concat(HT, " L ").concat(wT, ",").concat(KT, " z M ").concat(ZT, ",").concat(GT, " L ").concat(pT, ",").concat(fT, " L ").concat(NT, ",").concat(ST, " z M ").concat(I / 2, ",").concat(g, " L ").concat(WT, ",").concat(XT, " L ").concat(VT, ",").concat(XT, " z M ").concat(uT, ",").concat(GT, " L ").concat(BT, ",").concat(ST, " L ").concat(YT, ",").concat(fT, " z M ").concat(dAg, ",").concat(g / 2, " ").concat(Vg(I / 2, g / 2, rAg, hAg, 180, 540, !1).replace("M", "L"), " z");
break;
case "heart":
var FT = 49 * I / 48, kT = 10 * I / 48, bAg = I / 2 - FT, uAg = I / 2 - kT, mAg = I / 2 + kT, ZAg = I / 2 + FT, zT = -g / 3;
i = "M ".concat(I / 2, ",").concat(g / 4, " C ").concat(mAg, ",").concat(zT, " ").concat(ZAg, ",").concat(g / 4, " ").concat(I / 2, ",").concat(g, " C ").concat(bAg, ",").concat(g / 4, " ").concat(uAg, ",").concat(zT, " ").concat(I / 2, ",").concat(g / 4, " z");
break;
case "lightningBolt":
var GAg = 5022 * I / 21600, wAg = 11050 * I / 21600, pAg = 10012 * I / 21600, BAg = 14767 * I / 21600, WAg = 12222 * I / 21600, yAg = 12860 * I / 21600, YAg = 7602 * I / 21600, NAg = 16577 * I / 21600, VAg = 3890 * g / 21600, MAg = 6080 * g / 21600, RAg = 6797 * g / 21600, fAg = 12877 * g / 21600, HAg = 9705 * g / 21600, XAg = 12007 * g / 21600, SAg = 13987 * g / 21600, DAg = 8382 * g / 21600, KAg = 14915 * g / 21600;
i = "M ".concat(8472 * I / 21600, ",0 L ").concat(yAg, ",").concat(MAg, " L ").concat(wAg, ",").concat(RAg, " L ").concat(NAg, ",").concat(XAg, " L ").concat(BAg, ",").concat(fAg, " L ").concat(I, ",").concat(g, " L ").concat(pAg, ",").concat(KAg, " L ").concat(WAg, ",").concat(SAg, " L ").concat(GAg, ",").concat(HAg, " L ").concat(YAg, ",").concat(DAg, " L 0,").concat(VAg, " z");
break;
case "cube":
var JT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), KR = Gg, np = 25e3 * KR;
JT && (np = parseInt(JT.substring(4)) * KR);
var FR = 1e5 * KR, wn = Math.min(I, g) * (np < 0 ? 0 : np > FR ? FR : np) / FR, FAg = g - wn, lb = I - wn;
i = "M 0,".concat(wn, " L ").concat(wn, ",0 L ").concat(I, ",0 L ").concat(I, ",").concat(FAg, " L ").concat(lb, ",").concat(g, " L 0,").concat(g, " z M 0,").concat(wn, " L ").concat(lb, ",").concat(wn, " M ").concat(lb, ",").concat(wn, " L ").concat(I, ",0 M ").concat(lb, ",").concat(wn, " L ").concat(lb, ",").concat(g);
break;
case "bevel":
var LT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), kR = Gg, ap = 12500 * kR;
LT && (ap = parseInt(LT.substring(4)) * kR);
var vT = 5e4 * kR, EA = Math.min(I, g) * (ap < 0 ? 0 : ap > vT ? vT : ap) / 7.874015748031495, op = I - EA, cp = g - EA;
i = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z M ").concat(EA, ",").concat(EA, " L ").concat(op, ",").concat(EA, " L ").concat(op, ",").concat(cp, " L ").concat(EA, ",").concat(cp, " z M 0,0 L ").concat(EA, ",").concat(EA, " M 0,").concat(g, " L ").concat(EA, ",").concat(cp, " M ").concat(I, ",0 L ").concat(op, ",").concat(EA, " M ").concat(I, ",").concat(g, " L ").concat(op, ",").concat(cp);
break;
case "foldedCorner":
var TT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), zR = Gg, dp = 16667 * zR;
TT && (dp = parseInt(TT.substring(4)) * zR);
var xT = 5e4 * zR, JR = Math.min(I, g) * (dp < 0 ? 0 : dp > xT ? xT : dp) / 7.874015748031495, jT = JR / 5, LR = I - JR, kAg = LR + jT, vR = g - JR, zAg = vR + jT;
i = "M ".concat(LR, ",").concat(g, " L ").concat(kAg, ",").concat(zAg, " L ").concat(I, ",").concat(vR, " L ").concat(LR, ",").concat(g, " L 0,").concat(g, " L 0,0 L ").concat(I, ",0 L ").concat(I, ",").concat(vR);
break;
case "cloud":
case "cloudCallout":
for (var QT = 3900 * I / 43200, OT = 14370 * g / 43200, JAg = 6753 * I / 43200, LAg = 9190 * g / 43200, UT = 5333 * I / 43200, vAg = 7267 * g / 43200, TAg = 4365 * I / 43200, ET = 5945 * g / 43200, xAg = 4857 * I / 43200, jAg = 6595 * g / 43200, QAg = 7273 * g / 43200, OAg = 6775 * I / 43200, UAg = 9220 * g / 43200, EAg = 5785 * I / 43200, PAg = 7867 * g / 43200, _Ag = 6752 * I / 43200, qAg = 9215 * g / 43200, $Ag = 7720 * I / 43200, gsg = 10543 * g / 43200, Isg = 4360 * I / 43200, Csg = 5918 * g / 43200, tsg = 4345 * I / 43200, isg = function(Mg, RI, YC, QC, OC, zi) {
return Vg(Mg - YC * Math.cos(OC * Math.PI / 180), RI - QC * Math.sin(OC * Math.PI / 180), YC, QC, OC, OC + zi, !1).replace("M", "L");
}, rp = "M ".concat(QT, ",").concat(OT), TR = [QT, OT], xR = 0, PT = [[JAg, LAg, -11429249 / 6e4, 7426832 / 6e4], [UT, vAg, -8646143 / 6e4, 5396714 / 6e4], [TAg, ET, -8748475 / 6e4, 5983381 / 6e4], [xAg, jAg, -7859164 / 6e4, 7034504 / 6e4], [UT, QAg, -4722533 / 6e4, 6541615 / 6e4], [OAg, UAg, -46.26725, 130.269], [EAg, PAg, 37501 / 6e4, 6842e3 / 6e4], [_Ag, qAg, 22.4516, 115.17255], [$Ag, gsg, 3974558 / 6e4, 4542661 / 6e4], [Isg, Csg, -16496525 / 6e4, 8804134 / 6e4], [tsg, ET, -246.8285, 152.51885]]; xR < PT.length; xR++) {
var esg = PT[xR], jR = isg.apply(void 0, [TR[0], TR[1]].concat(R9(esg)));
rp += jR;
var Asg = jR.lastIndexOf("L"), _T = jR.substring(Asg + 1).split(" ");
TR = [parseFloat(_T[0]), parseFloat(_T[1])];
}
if (rp += " z", t === "cloudCallout") {
var qT = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), nb = Gg, hp = -20833 * nb, $T = 62500 * nb;
if (qT) {
var gx, bp = HI(qT);
try {
for (bp.s(); !(gx = bp.n()).done; ) {
var QR = gx.value, Ix = U(QR, ["attrs", "name"]);
Ix === "adj1" ? hp = parseInt(U(QR, ["attrs", "fmla"]).substring(4)) * nb : Ix === "adj2" && ($T = parseInt(U(QR, ["attrs", "fmla"]).substring(4)) * nb);
}
} catch (Mg) {
bp.e(Mg);
} finally {
bp.f();
}
}
var Cx = 1e5 * nb, ab = Math.min(I, g), ob = I / 2, cb = g / 2, OR = I * hp / Cx, UR = g * $T / Cx, up = ob + OR, mp = cb + UR, tx = cb * Math.cos(Math.atan(UR / OR)), ix = ob * Math.sin(Math.atan(UR / OR)), ex = ob * Math.cos(Math.atan(ix / tx)), Ax = cb * Math.sin(Math.atan(ix / tx)), Zp = (hp >= 0 ? ob + ex : ob - ex) - up, Gp = (hp >= 0 ? cb + Ax : cb - Ax) - mp, db = Math.sqrt(Zp * Zp + Gp * Gp), sx = (db - 6600 * ab / 21600) / 3, rb = 1800 * ab / 21600, lx = sx + rb, nx = lx * Gp / db + mp, ax = 4800 * ab / 21600 + 2 * sx, ox = ax * Gp / db + mp, wp = 1200 * ab / 21600, pp = 600 * ab / 21600, cx = lx * Zp / db + up + wp, dx = ax * Zp / db + up + rb;
rp += "".concat(Vg(up + pp - pp, mp, pp, pp, 0, 360, !0), " M ").concat(cx, ",").concat(nx, " ").concat(Vg(cx - wp, nx, wp, wp, 0, 360, !0).replace("M", "L"), " M ").concat(dx, ",").concat(ox, " ").concat(Vg(dx - rb, ox, rb, rb, 0, 360, !0).replace("M", "L"));
}
i = rp;
break;
case "smileyFace":
var rx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), ER = Gg, Bp = 4653 * ER;
rx && (Bp = parseInt(rx.substring(4)) * ER);
var Wp = 4653 * ER, yp = I / 2, PR = g / 2, hx = Bp < -Wp ? -Wp : Bp > Wp ? Wp : Bp, ssg = 16640 * I / 21600, bx = 16515 * g / 21600, ux = g * hx / 7.874015748031495, _R = bx - ux, mx = bx + ux + g * hx / 3.9370078740157477, Zx = 1125 * I / 21600, Gx = 1125 * g / 21600, wx = 7570 * g / 21600, lsg = 13135 * I / 21600, px = 4969 * I / 21699;
i = "".concat(Vg(6215 * I / 21600, wx, Zx, Gx, 0, 360, !0), " ").concat(Vg(lsg, wx, Zx, Gx, 0, 360, !0), " M ").concat(px, ",").concat(_R, " Q ").concat(yp, ",").concat(mx, " ").concat(ssg, ",").concat(_R, " Q ").concat(yp, ",").concat(mx, " ").concat(px, ",").concat(_R, " M 0,").concat(PR, " ").concat(Vg(yp, PR, yp, PR, 180, 540, !1).replace("M", "L"), " z");
break;
case "verticalScroll":
case "horizontalScroll":
var Bx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), qR = Gg, Yp = 12500 * qR;
Bx && (Yp = parseInt(Bx.substring(4)) * qR);
var Wx = 25e3 * qR, nsg = Math.min(I, g), hb = g, bb = I, GC = nsg * (Yp < 0 ? 0 : Yp > Wx ? Wx : Yp) / 7.874015748031495, BI = GC / 2, pn = GC / 4;
if (t === "verticalScroll") {
var Dd = GC + BI, asg = GC + GC, Np = bb - GC, yx = bb - BI, osg = Np - BI, $R = hb - GC, lo = hb - BI;
i = "M ".concat(GC, ",").concat($R, " L ").concat(GC, ",").concat(BI, " ").concat(Vg(Dd, BI, BI, BI, 180, 270, !1).replace("M", "L"), " L ").concat(yx, ",").concat(0, " ").concat(Vg(yx, BI, BI, BI, 270, 450, !1).replace("M", "L"), " L ").concat(Np, ",").concat(GC, " L ").concat(Np, ",").concat(lo, " ").concat(Vg(osg, lo, BI, BI, 0, 90, !1).replace("M", "L"), " L ").concat(BI, ",").concat(hb, " ").concat(Vg(BI, lo, BI, BI, 90, 270, !1).replace("M", "L"), " z M ").concat(Dd, ",").concat(0, " ").concat(Vg(Dd, BI, BI, BI, 270, 450, !1).replace("M", "L"), " ").concat(Vg(Dd, Dd / 2, pn, pn, 90, 270, !1).replace("M", "L"), " L ").concat(asg, ",").concat(BI, " M ").concat(Np, ",").concat(GC, " L ").concat(Dd, ",").concat(GC, " M ").concat(GC, ",").concat(lo, " ").concat(Vg(BI, lo, BI, BI, 0, 270, !1).replace("M", "L"), " ").concat(Vg(BI, (lo + $R) / 2, pn, pn, 270, 450, !1).replace("M", "L"), " z M ").concat(GC, ",").concat(lo, " L ").concat(GC, ",").concat($R);
} else if (t === "horizontalScroll") {
var no = GC + BI, csg = GC + GC, gf = hb - GC, Yx = hb - BI, Nx = gf - BI, Vp = bb - GC, Kd = bb - BI;
i = "M ".concat(0, ",").concat(no, " ").concat(Vg(BI, no, BI, BI, 180, 270, !1).replace("M", "L"), " L ").concat(Vp, ",").concat(GC, " L ").concat(Vp, ",").concat(BI, " ").concat(Vg(Kd, BI, BI, BI, 180, 360, !1).replace("M", "L"), " L ").concat(bb, ",").concat(Nx, " ").concat(Vg(Kd, Nx, BI, BI, 0, 90, !1).replace("M", "L"), " L ").concat(GC, ",").concat(gf, " L ").concat(GC, ",").concat(Yx, " ").concat(Vg(BI, Yx, BI, BI, 0, 180, !1).replace("M", "L"), " z M ").concat(Kd, ",").concat(GC, " ").concat(Vg(Kd, BI, BI, BI, 90, -180, !1).replace("M", "L"), " ").concat(Vg((Vp + Kd) / 2, BI, pn, pn, 180, 0, !1).replace("M", "L"), " z M ").concat(Kd, ",").concat(GC, " L ").concat(Vp, ",").concat(GC, " M ").concat(BI, ",").concat(csg, " L ").concat(BI, ",").concat(no, " ").concat(Vg(no / 2, no, pn, pn, 180, 360, !1).replace("M", "L"), " ").concat(Vg(BI, no, BI, BI, 0, 180, !1).replace("M", "L"), " M ").concat(GC, ",").concat(no, " L ").concat(GC, ",").concat(gf);
}
break;
case "wedgeEllipseCallout":
var Vx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Mp = Gg, Mx = -20833 * Mp, Rx = 62500 * Mp;
if (Vx) {
var fx, Rp = HI(Vx);
try {
for (Rp.s(); !(fx = Rp.n()).done; ) {
var If = fx.value, Hx = U(If, ["attrs", "name"]);
Hx === "adj1" ? Mx = parseInt(U(If, ["attrs", "fmla"]).substring(4)) * Mp : Hx === "adj2" && (Rx = parseInt(U(If, ["attrs", "fmla"]).substring(4)) * Mp);
}
} catch (Mg) {
Rp.e(Mg);
} finally {
Rp.f();
}
}
var Xx = 7.874015748031495, Sx = 11 * Math.PI / 180, ao = g / 2, oo = I / 2, Dx = I * Mx / Xx, Kx = g * Rx / Xx, dsg = oo + Dx, rsg = ao + Kx, Fx = Math.atan2(Kx * I, Dx * g), Cf = Fx + Sx, tf = Fx - Sx, hsg = oo * Math.cos(Cf), bsg = ao + ao * Math.sin(Cf), usg = oo + oo * Math.cos(tf), msg = ao + ao * Math.sin(tf);
i = "M ".concat(oo + hsg, ",").concat(bsg, " L ").concat(dsg, ",").concat(rsg, " L ").concat(usg, ",").concat(msg, " ").concat(Vg(oo, ao, oo, ao, 180 * tf / Math.PI, 180 * Cf / Math.PI, !0).replace("M", "L"));
break;
case "wedgeRectCallout":
var kx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), fp = Gg, zx = -20833 * fp, Jx = 62500 * fp;
if (kx) {
var Lx, Hp = HI(kx);
try {
for (Hp.s(); !(Lx = Hp.n()).done; ) {
var ef = Lx.value, vx = U(ef, ["attrs", "name"]);
vx === "adj1" ? zx = parseInt(U(ef, ["attrs", "fmla"]).substring(4)) * fp : vx === "adj2" && (Jx = parseInt(U(ef, ["attrs", "fmla"]).substring(4)) * fp);
}
} catch (Mg) {
Hp.e(Mg);
} finally {
Hp.f();
}
}
var Tx = 7.874015748031495, Bn = I * zx / Tx, Wn = g * Jx / Tx, Xp = I / 2 + Bn, Sp = g / 2 + Wn, Zsg = Bn * g / I, yn = Math.abs(Wn) - Math.abs(Zsg), ub = I * (Bn > 0 ? 7 : 2) / 12, xx = I * (Bn > 0 ? 10 : 5) / 12, mb = g * (Wn > 0 ? 7 : 2) / 12, jx = g * (Wn > 0 ? 10 : 5) / 12, Gsg = yn > 0 || Bn > 0 ? 0 : Xp, wsg = yn > 0 ? Wn > 0 ? ub : Xp : ub, psg = yn > 0 ? I : Bn > 0 ? Xp : I, Bsg = yn > 0 && Wn > 0 ? Xp : ub, Wsg = yn > 0 || Bn > 0 ? mb : Sp, ysg = yn > 0 ? Wn > 0 ? 0 : Sp : 0, Ysg = yn > 0 ? mb : Bn > 0 ? Sp : mb, Nsg = yn > 0 && Wn > 0 ? Sp : g;
i = "M 0,0 L ".concat(ub, ",0 L ").concat(wsg, ",").concat(ysg, " L ").concat(xx, ",0 L ").concat(I, ",0 L ").concat(I, ",").concat(mb, " L ").concat(psg, ",").concat(Ysg, " L ").concat(I, ",").concat(jx, " L ").concat(I, ",").concat(g, " L ").concat(xx, ",").concat(g, " L ").concat(Bsg, ",").concat(Nsg, " L ").concat(ub, ",").concat(g, " L 0,").concat(g, " L 0,").concat(jx, " L ").concat(Gsg, ",").concat(Wsg, " L 0,").concat(mb, " z");
break;
case "wedgeRoundRectCallout":
var Qx = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Fd = Gg, Ox = -20833 * Fd, Ux = 62500 * Fd, Ex = 16667 * Fd;
if (Qx) {
var Px, Dp = HI(Qx);
try {
for (Dp.s(); !(Px = Dp.n()).done; ) {
var Kp = Px.value, Af = U(Kp, ["attrs", "name"]);
Af === "adj1" ? Ox = parseInt(U(Kp, ["attrs", "fmla"]).substring(4)) * Fd : Af === "adj2" ? Ux = parseInt(U(Kp, ["attrs", "fmla"]).substring(4)) * Fd : Af === "adj3" && (Ex = parseInt(U(Kp, ["attrs", "fmla"]).substring(4)) * Fd);
}
} catch (Mg) {
Dp.e(Mg);
} finally {
Dp.f();
}
}
var sf = 7.874015748031495, Vsg = Math.min(I, g), Yn = I * Ox / sf, Nn = g * Ux / sf, Fp = I / 2 + Yn, kp = g / 2 + Nn, Msg = Yn * g / I, Vn = Math.abs(Nn) - Math.abs(Msg), Zb = I * (Yn > 0 ? 7 : 2) / 12, _x = I * (Yn > 0 ? 10 : 5) / 12, Gb = g * (Nn > 0 ? 7 : 2) / 12, qx = g * (Nn > 0 ? 10 : 5) / 12, Rsg = Vn > 0 || Yn > 0 ? 0 : Fp, fsg = Vn > 0 ? Nn > 0 ? Zb : Fp : Zb, Hsg = Vn > 0 ? I : Yn > 0 ? Fp : I, Xsg = Vn > 0 && Nn > 0 ? Fp : Zb, Ssg = Vn > 0 || Yn > 0 ? Gb : kp, Dsg = Vn > 0 ? Nn > 0 ? 0 : kp : 0, Ksg = Vn > 0 ? Gb : Yn > 0 ? kp : Gb, Fsg = Vn > 0 && Nn > 0 ? kp : g, ni = Vsg * Ex / sf, lf = I - ni, nf = g - ni;
i = "M 0,".concat(ni, " ").concat(Vg(ni, ni, ni, ni, 180, 270, !1).replace("M", "L"), " L ").concat(Zb, ",0 L ").concat(fsg, ",").concat(Dsg, " L ").concat(_x, ",0 L ").concat(lf, ",0 ").concat(Vg(lf, ni, ni, ni, 270, 360, !1).replace("M", "L"), " L ").concat(I, ",").concat(Gb, " L ").concat(Hsg, ",").concat(Ksg, " L ").concat(I, ",").concat(qx, " L ").concat(I, ",").concat(nf, " ").concat(Vg(lf, nf, ni, ni, 0, 90, !1).replace("M", "L"), " L ").concat(_x, ",").concat(g, " L ").concat(Xsg, ",").concat(Fsg, " L ").concat(Zb, ",").concat(g, " L ").concat(ni, ",").concat(g, " ").concat(Vg(ni, nf, ni, ni, 90, 180, !1).replace("M", "L"), " L 0,").concat(qx, " L ").concat(Rsg, ",").concat(Ssg, " L 0,").concat(Gb, " z");
break;
case "accentBorderCallout1":
case "accentBorderCallout2":
case "accentBorderCallout3":
case "borderCallout1":
case "borderCallout2":
case "borderCallout3":
case "accentCallout1":
case "accentCallout2":
case "accentCallout3":
case "callout1":
case "callout2":
case "callout3":
var Mn = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), ZI = Gg, ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 1e5 * ZI, Ps = -16667 * ZI, wb = 112963 * ZI, pb = -8333 * ZI;
if (Mn) {
var $x, zp = HI(Mn);
try {
for (zp.s(); !($x = zp.n()).done; ) {
var _s = $x.value, Rn = U(_s, ["attrs", "name"]);
Rn === "adj1" ? ge = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj2" ? Ie = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj3" ? Ce = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj4" ? te = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj5" ? Es = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj6" ? Ps = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj7" ? wb = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI : Rn === "adj8" && (pb = parseInt(U(_s, ["attrs", "fmla"]).substring(4)) * ZI);
}
} catch (Mg) {
zp.e(Mg);
} finally {
zp.f();
}
}
var Rt, Xe, Se, De, fn, Hn, Jp, Lp, _I = 1e5 * ZI, kd = "M 0,0 L ".concat(I, ",0 L ").concat(I, ",").concat(g, " L 0,").concat(g, " z");
switch (t) {
case "borderCallout1":
case "callout1":
Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 112500 * ZI, te = -38333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De);
break;
case "borderCallout2":
case "callout2":
Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 112500 * ZI, Ps = -46667 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn);
break;
case "borderCallout3":
case "callout3":
Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 1e5 * ZI, Ps = -16667 * ZI, wb = 112963 * ZI, pb = -8333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, Lp = g * wb / _I, Jp = I * pb / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn, " L ").concat(Jp, ",").concat(Lp);
break;
case "accentBorderCallout1":
case "accentCallout1":
Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 112500 * ZI, te = -38333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " M ").concat(Rt, ",0 L ").concat(Rt, ",").concat(g);
break;
case "accentBorderCallout2":
case "accentCallout2":
Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 112500 * ZI, Ps = -46667 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn, " M ").concat(Rt, ",0 L ").concat(Rt, ",").concat(g);
break;
case "accentBorderCallout3":
case "accentCallout3":
Mn || (ge = 18750 * ZI, Ie = -8333 * ZI, Ce = 18750 * ZI, te = -16667 * ZI, Es = 1e5 * ZI, Ps = -16667 * ZI, wb = 112963 * ZI, pb = -8333 * ZI), Xe = g * ge / _I, Rt = I * Ie / _I, De = g * Ce / _I, Se = I * te / _I, Hn = g * Es / _I, fn = I * Ps / _I, Lp = g * wb / _I, Jp = I * pb / _I, i = "".concat(kd, " M ").concat(Rt, ",").concat(Xe, " L ").concat(Se, ",").concat(De, " L ").concat(fn, ",").concat(Hn, " L ").concat(Jp, ",").concat(Lp, " M ").concat(Rt, ",0 L ").concat(Rt, ",").concat(g);
}
break;
case "leftRightRibbon":
var gj = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), qs = Gg, vp = 5e4 * qs, Tp = 5e4 * qs, xp = 16667 * qs;
if (gj) {
var Ij, jp = HI(gj);
try {
for (jp.s(); !(Ij = jp.n()).done; ) {
var Qp = Ij.value, af = U(Qp, ["attrs", "name"]);
af === "adj1" ? vp = parseInt(U(Qp, ["attrs", "fmla"]).substring(4)) * qs : af === "adj2" ? Tp = parseInt(U(Qp, ["attrs", "fmla"]).substring(4)) * qs : af === "adj3" && (xp = parseInt(U(Qp, ["attrs", "fmla"]).substring(4)) * qs);
}
} catch (Mg) {
jp.e(Mg);
} finally {
jp.f();
}
}
var Cj = 33333 * qs, of = 1e5 * qs, tj = 2e5 * qs, cf = Math.min(I, g), Xn = I / 2, ij = g / 2, df = xp < 0 ? 0 : xp > Cj ? Cj : xp, ej = of - df, Aj = of * (Xn - I / 32) / cf, Bb = cf * (Tp < 0 ? 0 : Tp > Aj ? Aj : Tp) / of, Op = I - Bb, rf = g * (vp < 0 ? 0 : vp > ej ? ej : vp) / tj, sj = g * df / -tj, Sn = ij + sj - rf, hf = ij + rf - sj, bf = Sn + rf, ksg = g - bf, zd = 2 * bf, uf = g - (zd - Sn), Jd = df * cf / 31.49606299212598, mf = Xn - I / 32, lj = Xn + I / 32, nj = Sn + Jd, aj = uf - Jd;
i = "M 0,".concat(bf, " L ").concat(Bb, ",0 L ").concat(Bb, ",").concat(Sn, " L ").concat(Xn, ",").concat(Sn, " ").concat(Vg(Xn, nj, I / 32, Jd, 270, 450, !1).replace("M", "L"), " ").concat(Vg(Xn, aj, I / 32, Jd, 270, 90, !1).replace("M", "L"), " L ").concat(Op, ",").concat(uf, " L ").concat(Op, ",").concat(g - zd, " L ").concat(I, ",").concat(ksg, " L ").concat(Op, ",").concat(g, " L ").concat(Op, ",").concat(hf, " L ").concat(Xn, ",").concat(hf, " ").concat(Vg(Xn, hf - Jd, I / 32, Jd, 90, 180, !1).replace("M", "L"), " L ").concat(mf, ",").concat(zd - Sn, " L ").concat(Bb, ",").concat(zd - Sn, " L ").concat(Bb, ",").concat(zd, " z M ").concat(lj, ",").concat(nj, " L ").concat(lj, ",").concat(uf, " M ").concat(mf, ",").concat(aj, " L ").concat(mf, ",").concat(zd - Sn);
break;
case "ribbon":
case "ribbon2":
var oj = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Up = 1.3123622047244095, Ep = 3.9370078740157477;
if (oj) {
var cj, Pp = HI(oj);
try {
for (Pp.s(); !(cj = Pp.n()).done; ) {
var Zf = cj.value, dj = U(Zf, ["attrs", "name"]);
dj === "adj1" ? Up = parseInt(U(Zf, ["attrs", "fmla"]).substring(4)) * Gg : dj === "adj2" && (Ep = parseInt(U(Zf, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
Pp.e(Mg);
} finally {
Pp.f();
}
}
var rj = 1.9685039370078738, hj = 2.6246456692913385, bj = 5.905511811023621, uj = 7.874015748031495, Gf = 15.74803149606299, mj = I / 2, PA = g, Wb = I, yb = I / 8, ai = I / 32, Yb = Up < 0 ? 0 : Up > hj ? hj : Up, Zj = Wb - yb, Gj = I * (Ep < rj ? rj : Ep > bj ? bj : Ep) / Gf, $s = mj - Gj, gl = mj + Gj, co = $s + ai, ro = gl - ai, Nb = $s + yb, Vb = gl - yb, _p = Nb - ai, qp = Vb + ai, jC = g * Yb / 31.49606299212598;
if (t === "ribbon2") {
var wf = PA - g * Yb / Gf, wj = g * Yb / uj, pf = PA - wj, ho = 0 + wj, pj = (ho + PA) / 2, $p = PA - jC, gB = wf - jC;
i = "M ".concat(0, ",").concat(PA, " L ").concat(yb, ",").concat(pj, " L ").concat(0, ",").concat(ho, " L ").concat($s, ",").concat(ho, " L ").concat($s, ",").concat(jC, " ").concat(Vg(co, jC, ai, jC, 180, 270, !1).replace("M", "L"), " L ").concat(ro, ",").concat(0, " ").concat(Vg(ro, jC, ai, jC, 270, 360, !1).replace("M", "L"), " L ").concat(gl, ",").concat(ho, " L ").concat(Wb, ",").concat(ho, " L ").concat(Zj, ",").concat(pj, " L ").concat(Wb, ",").concat(PA, " L ").concat(qp, ",").concat(PA, " ").concat(Vg(qp, $p, ai, jC, 90, 270, !1).replace("M", "L"), " L ").concat(ro, ",").concat(wf, " ").concat(Vg(ro, gB, ai, jC, 90, -90, !1).replace("M", "L"), " L ").concat(co, ",").concat(pf, " ").concat(Vg(co, gB, ai, jC, 270, 90, !1).replace("M", "L"), " L ").concat(_p, ",").concat(wf, " ").concat(Vg(_p, $p, ai, jC, 270, 450, !1).replace("M", "L"), " z M ").concat(Nb, ",").concat(pf, " L ").concat(Nb, ",").concat($p, " M ").concat(Vb, ",").concat($p, " L ").concat(Vb, ",").concat(pf, " M ").concat($s, ",").concat(gB, " L ").concat($s, ",").concat(ho, " M ").concat(gl, ",").concat(ho, " L ").concat(gl, ",").concat(gB);
} else if (t === "ribbon") {
var Bj = g * Yb / Gf, Mb = g * Yb / uj, bo = PA - Mb, Wj = bo / 2, Bf = PA - jC, IB = Mb - jC;
i = "M ".concat(0, ",").concat(0, " L ").concat(_p, ",").concat(0, " ").concat(Vg(_p, jC, ai, jC, 270, 450, !1).replace("M", "L"), " L ").concat(co, ",").concat(Bj, " ").concat(Vg(co, IB, ai, jC, 270, 90, !1).replace("M", "L"), " L ").concat(ro, ",").concat(Mb, " ").concat(Vg(ro, IB, ai, jC, 90, -90, !1).replace("M", "L"), " L ").concat(qp, ",").concat(Bj, " ").concat(Vg(qp, jC, ai, jC, 90, 270, !1).replace("M", "L"), " L ").concat(Wb, ",").concat(0, " L ").concat(Zj, ",").concat(Wj, " L ").concat(Wb, ",").concat(bo, " L ").concat(gl, ",").concat(bo, " L ").concat(gl, ",").concat(Bf, " ").concat(Vg(ro, Bf, ai, jC, 0, 90, !1).replace("M", "L"), " L ").concat(co, ",").concat(PA, " ").concat(Vg(co, Bf, ai, jC, 90, 180, !1).replace("M", "L"), " L ").concat($s, ",").concat(bo, " L ").concat(0, ",").concat(bo, " L ").concat(yb, ",").concat(Wj, " z M ").concat(Nb, ",").concat(jC, " L ").concat(Nb, ",").concat(Mb, " M ").concat(Vb, ",").concat(Mb, " L ").concat(Vb, ",").concat(jC, " M ").concat($s, ",").concat(bo, " L ").concat($s, ",").concat(IB, " M ").concat(gl, ",").concat(IB, " L ").concat(gl, ",").concat(bo);
}
break;
case "doubleWave":
case "wave":
var yj = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), uo = t === "doubleWave" ? 0.49212598425196846 : 0.9842519685039369, mo = 0;
if (yj) {
var Yj, CB = HI(yj);
try {
for (CB.s(); !(Yj = CB.n()).done; ) {
var Wf = Yj.value, Nj = U(Wf, ["attrs", "name"]);
Nj === "adj1" ? uo = parseInt(U(Wf, ["attrs", "fmla"]).substring(4)) * Gg : Nj === "adj2" && (mo = parseInt(U(Wf, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
CB.e(Mg);
} finally {
CB.f();
}
}
var tB = -0.7874015748031495, Vj = 3.9370078740157477, Ld = 7.874015748031495, Mj = g, iB = I;
if (t === "doubleWave") {
var Rj = 0.9842519685039369, Zo = g * (uo < 0 ? 0 : uo > Rj ? Rj : uo) / Ld, eB = 10 * Zo / 3, fj = Zo - eB, Hj = Zo + eB, Rb = Mj - Zo, Xj = Rb - eB, Sj = Rb + eB, AB = I * (mo < tB ? tB : mo > Ld ? Ld : mo) / Vj, sB = AB > 0 ? 0 : AB, lB = 0 - sB, Dj = AB > 0 ? AB : 0, fb = iB - Dj, nB = (sB + fb) / 6, zsg = lB + nB, Kj = (sB + fb) / 3, Jsg = lB + Kj, Fj = (lB + fb) / 2, kj = Fj + nB, Lsg = (kj + fb) / 2, aB = 0 + Dj, yf = iB + sB, vsg = aB + nB, Tsg = aB + Kj, zj = (aB + yf) / 2, Jj = zj + nB, xsg = (Jj + yf) / 2;
i = "M ".concat(lB, ",").concat(Zo, " C ").concat(zsg, ",").concat(fj, " ").concat(Jsg, ",").concat(Hj, " ").concat(Fj, ",").concat(Zo, " C ").concat(kj, ",").concat(fj, " ").concat(Lsg, ",").concat(Hj, " ").concat(fb, ",").concat(Zo, " L ").concat(yf, ",").concat(Rb, " C ").concat(xsg, ",").concat(Sj, " ").concat(Jj, ",").concat(Xj, " ").concat(zj, ",").concat(Rb, " C ").concat(Tsg, ",").concat(Sj, " ").concat(vsg, ",").concat(Xj, " ").concat(aB, ",").concat(Rb, " z");
} else if (t === "wave") {
var Lj = 1.574803149606299, vd = g * (uo < 0 ? 0 : uo > Lj ? Lj : uo) / Ld, oB = 10 * vd / 3, jsg = vd - oB, Qsg = vd + oB, cB = Mj - vd, Osg = cB - oB, Usg = cB + oB, dB = I * (mo < tB ? tB : mo > Ld ? Ld : mo) / Vj, Yf = dB > 0 ? 0 : dB, vj = 0 - Yf, Tj = dB > 0 ? dB : 0, Nf = iB - Tj, xj = (Yf + Nf) / 3, jj = vj + xj, Esg = (jj + Nf) / 2, Qj = 0 + Tj, Oj = iB + Yf, Uj = Qj + xj, Psg = (Uj + Oj) / 2;
i = "M ".concat(vj, ",").concat(vd, " C ").concat(jj, ",").concat(jsg, " ").concat(Esg, ",").concat(Qsg, " ").concat(Nf, ",").concat(vd, " L ").concat(Oj, ",").concat(cB, " C ").concat(Psg, ",").concat(Usg, " ").concat(Uj, ",").concat(Osg, " ").concat(Qj, ",").concat(cB, " z");
}
break;
case "ellipseRibbon":
case "ellipseRibbon2":
var Ej = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), rB = 1.9685039370078738, hB = 3.9370078740157477, bB = 0.9842519685039369;
if (Ej) {
var Pj, uB = HI(Ej);
try {
for (uB.s(); !(Pj = uB.n()).done; ) {
var mB = Pj.value, Vf = U(mB, ["attrs", "name"]);
Vf === "adj1" ? rB = parseInt(U(mB, ["attrs", "fmla"]).substring(4)) * Gg : Vf === "adj2" ? hB = parseInt(U(mB, ["attrs", "fmla"]).substring(4)) * Gg : Vf === "adj3" && (bB = parseInt(U(mB, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
uB.e(Mg);
} finally {
uB.f();
}
}
var _j = 1.9685039370078738, qj = 5.905511811023621, Hb = 7.874015748031495, Xb = I / 2, ki = g, Il = I, ZB = I / 8, Td = rB < 0 ? 0 : rB > Hb ? Hb : rB, $j = Hb - Td, gQ = Td - $j / 2 > 0 ? Td - $j / 2 : 0, oi = Xb - I * (hB < _j ? _j : hB > qj ? qj : hB) / 15.74803149606299, oA = oi + ZB, xd = Il - oA, _A = Il - oi, IQ = Il - ZB, Go = g * (bB < gQ ? gQ : bB > Td ? Td : bB) / Hb, jd = 4 * Go / I, CQ = oA - oA * oA / I, Sb = oA / 2, tQ = Il - Sb, GB = g * Td / Hb, Dn = GB - Go, wB = jd * (oi - oi * oi / I), Ke = ki - GB, iQ = 14 * Go / 16, pB = oi / 2, eQ = jd * pB, AQ = Il - pB;
if (t === "ellipseRibbon") {
var Db = jd * CQ, sQ = jd * Sb, Qd = wB + Dn, lQ = Go + Dn - Qd + Go + Dn, nQ = (iQ + Ke) / 2, BB = wB + Ke, aQ = Qd + Ke, oQ = eQ + Ke, _sg = lQ + Ke, cQ = Db + Dn;
i = "M ".concat(0, ",").concat(0, " Q ").concat(Sb, ",").concat(sQ, " ").concat(oA, ",").concat(Db, " L ").concat(oi, ",").concat(Qd, " Q ").concat(Xb, ",").concat(lQ, " ").concat(_A, ",").concat(Qd, " L ").concat(xd, ",").concat(Db, " Q ").concat(tQ, ",").concat(sQ, " ").concat(Il, ",").concat(0, " L ").concat(IQ, ",").concat(nQ, " L ").concat(Il, ",").concat(Ke, " Q ").concat(AQ, ",").concat(oQ, " ").concat(_A, ",").concat(BB, " L ").concat(_A, ",").concat(aQ, " Q ").concat(Xb, ",").concat(_sg, " ").concat(oi, ",").concat(aQ, " L ").concat(oi, ",").concat(BB, " Q ").concat(pB, ",").concat(oQ, " ").concat(0, ",").concat(Ke, " L ").concat(ZB, ",").concat(nQ, " z M ").concat(oi, ",").concat(BB, " L ").concat(oi, ",").concat(Qd, " M ").concat(_A, ",").concat(Qd, " L ").concat(_A, ",").concat(BB, " M ").concat(oA, ",").concat(Db, " L ").concat(oA, ",").concat(cQ, " M ").concat(xd, ",").concat(cQ, " L ").concat(xd, ",").concat(Db);
} else if (t === "ellipseRibbon2") {
var dQ = jd * CQ, WB = ki - dQ, rQ = ki - jd * Sb, Mf = wB + Dn, yB = ki - Mf, hQ = Go + Dn - Mf + Go + Dn, qsg = ki - hQ, bQ = ki - (iQ + Ke) / 2, YB = ki - (wB + Ke), uQ = ki - (Mf + Ke), mQ = ki - (eQ + Ke), $sg = ki - (hQ + Ke), ZQ = ki - (dQ + Dn);
i = "M ".concat(0, ",").concat(ki, " L ").concat(ZB, ",").concat(bQ, " L ").concat(0, ",").concat(GB, " Q ").concat(pB, ",").concat(mQ, " ").concat(oi, ",").concat(YB, " L ").concat(oi, ",").concat(uQ, " Q ").concat(Xb, ",").concat($sg, " ").concat(_A, ",").concat(uQ, " L ").concat(_A, ",").concat(YB, " Q ").concat(AQ, ",").concat(mQ, " ").concat(Il, ",").concat(GB, " L ").concat(IQ, ",").concat(bQ, " L ").concat(Il, ",").concat(ki, " Q ").concat(tQ, ",").concat(rQ, " ").concat(xd, ",").concat(WB, " L ").concat(_A, ",").concat(yB, " Q ").concat(Xb, ",").concat(qsg, " ").concat(oi, ",").concat(yB, " L ").concat(oA, ",").concat(WB, " Q ").concat(Sb, ",").concat(rQ, " ").concat(0, ",").concat(ki, " z M ").concat(oi, ",").concat(yB, " L ").concat(oi, ",").concat(YB, " M ").concat(_A, ",").concat(YB, " L ").concat(_A, ",").concat(yB, " M ").concat(oA, ",").concat(ZQ, " L ").concat(oA, ",").concat(WB, " M ").concat(xd, ",").concat(WB, " L ").concat(xd, ",").concat(ZQ);
}
break;
case "line":
case "straightConnector1":
case "bentConnector4":
case "bentConnector5":
case "curvedConnector2":
case "curvedConnector3":
case "curvedConnector4":
case "curvedConnector5":
i = "M 0 0 L ".concat(I, " ").concat(g);
break;
case "rightArrow":
var GQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Kb = 0.25, Fb = 0.5;
if (GQ) {
var wQ, glg = I / g, NB = HI(GQ);
try {
for (NB.s(); !(wQ = NB.n()).done; ) {
var Rf = wQ.value, pQ = U(Rf, ["attrs", "name"]);
pQ === "adj1" ? Kb = 0.5 - parseInt(U(Rf, ["attrs", "fmla"]).substring(4)) / 2e5 : pQ === "adj2" && (Fb = 1 - parseInt(U(Rf, ["attrs", "fmla"]).substring(4)) / 1e5 / glg);
}
} catch (Mg) {
NB.e(Mg);
} finally {
NB.f();
}
}
i = "M ".concat(I, " ").concat(g / 2, " L ").concat(Fb * I, " 0 L ").concat(Fb * I, " ").concat(Kb * g, " L 0 ").concat(Kb * g, " L 0 ").concat((1 - Kb) * g, " L ").concat(Fb * I, " ").concat((1 - Kb) * g, " L ").concat(Fb * I, " ").concat(g, " Z");
break;
case "leftArrow":
var BQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), kb = 0.25, zb = 0.5;
if (BQ) {
var WQ, Ilg = I / g, VB = HI(BQ);
try {
for (VB.s(); !(WQ = VB.n()).done; ) {
var ff = WQ.value, yQ = U(ff, ["attrs", "name"]);
yQ === "adj1" ? kb = 0.5 - parseInt(U(ff, ["attrs", "fmla"]).substring(4)) / 2e5 : yQ === "adj2" && (zb = parseInt(U(ff, ["attrs", "fmla"]).substring(4)) / 1e5 / Ilg);
}
} catch (Mg) {
VB.e(Mg);
} finally {
VB.f();
}
}
i = "M 0 ".concat(g / 2, " L ").concat(zb * I, " ").concat(g, " L ").concat(zb * I, " ").concat((1 - kb) * g, " L ").concat(I, " ").concat((1 - kb) * g, " L ").concat(I, " ").concat(kb * g, " L ").concat(zb * I, " ").concat(kb * g, " L ").concat(zb * I, " 0 Z");
break;
case "downArrow":
case "flowChartOffpageConnector":
var YQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Od = 0.25, Ud = 0.5;
if (YQ) {
var NQ, Clg = g / I, MB = HI(YQ);
try {
for (MB.s(); !(NQ = MB.n()).done; ) {
var Hf = NQ.value, VQ = U(Hf, ["attrs", "name"]);
VQ === "adj1" ? Od = parseInt(U(Hf, ["attrs", "fmla"]).substring(4)) / 2e5 : VQ === "adj2" && (Ud = parseInt(U(Hf, ["attrs", "fmla"]).substring(4)) / 1e5 / Clg);
}
} catch (Mg) {
MB.e(Mg);
} finally {
MB.f();
}
}
t === "flowChartOffpageConnector" && (Od = 0.5, Ud = 0.212), i = "M ".concat((0.5 - Od) * I, " 0 L ").concat((0.5 - Od) * I, " ").concat((1 - Ud) * g, " L 0 ").concat((1 - Ud) * g, " L ").concat(I / 2, " ").concat(g, " L ").concat(I, " ").concat((1 - Ud) * g, " L ").concat((0.5 + Od) * I, " ").concat((1 - Ud) * g, " L ").concat((0.5 + Od) * I, " 0 Z");
break;
case "upArrow":
var MQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Jb = 0.25, Lb = 0.5;
if (MQ) {
var RQ, tlg = g / I, RB = HI(MQ);
try {
for (RB.s(); !(RQ = RB.n()).done; ) {
var Xf = RQ.value, fQ = U(Xf, ["attrs", "name"]);
fQ === "adj1" ? Jb = parseInt(U(Xf, ["attrs", "fmla"]).substring(4)) / 2e5 : fQ === "adj2" && (Lb = parseInt(U(Xf, ["attrs", "fmla"]).substring(4)) / 1e5 / tlg);
}
} catch (Mg) {
RB.e(Mg);
} finally {
RB.f();
}
}
i = "M ".concat(I / 2, " 0 L 0 ").concat(Lb * g, " L ").concat((0.5 - Jb) * I, " ").concat(Lb * g, " L ").concat((0.5 - Jb) * I, " ").concat(g, " L ").concat((0.5 + Jb) * I, " ").concat(g, " L ").concat((0.5 + Jb) * I, " ").concat(Lb * g, " L ").concat(I, " ").concat(Lb * g, " Z");
break;
case "leftRightArrow":
var HQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), vb = 0.25, Cl = 0.25;
if (HQ) {
var XQ, ilg = I / g, fB = HI(HQ);
try {
for (fB.s(); !(XQ = fB.n()).done; ) {
var Sf = XQ.value, SQ = U(Sf, ["attrs", "name"]);
SQ === "adj1" ? vb = 0.5 - parseInt(U(Sf, ["attrs", "fmla"]).substring(4)) / 2e5 : SQ === "adj2" && (Cl = parseInt(U(Sf, ["attrs", "fmla"]).substring(4)) / 1e5 / ilg);
}
} catch (Mg) {
fB.e(Mg);
} finally {
fB.f();
}
}
i = "M 0 ".concat(g / 2, " L ").concat(Cl * I, " ").concat(g, " L ").concat(Cl * I, " ").concat((1 - vb) * g, " L ").concat((1 - Cl) * I, " ").concat((1 - vb) * g, " L ").concat((1 - Cl) * I, " ").concat(g, " L ").concat(I, " ").concat(g / 2, " L ").concat((1 - Cl) * I, " 0 L ").concat((1 - Cl) * I, " ").concat(vb * g, " L ").concat(Cl * I, " ").concat(vb * g, " L ").concat(Cl * I, " 0 Z");
break;
case "upDownArrow":
var DQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Tb = 0.25, tl = 0.25;
if (DQ) {
var KQ, elg = g / I, HB = HI(DQ);
try {
for (HB.s(); !(KQ = HB.n()).done; ) {
var Df = KQ.value, FQ = U(Df, ["attrs", "name"]);
FQ === "adj1" ? Tb = 0.5 - parseInt(U(Df, ["attrs", "fmla"]).substring(4)) / 2e5 : FQ === "adj2" && (tl = parseInt(U(Df, ["attrs", "fmla"]).substring(4)) / 1e5 / elg);
}
} catch (Mg) {
HB.e(Mg);
} finally {
HB.f();
}
}
i = "M ".concat(I / 2, " 0 L 0 ").concat(tl * g, " L ").concat(Tb * I, " ").concat(tl * g, " L ").concat(Tb * I, " ").concat((1 - tl) * g, " L 0 ").concat((1 - tl) * g, " L ").concat(I / 2, " ").concat(g, " L ").concat(I, " ").concat((1 - tl) * g, " L ").concat((1 - Tb) * I, " ").concat((1 - tl) * g, " L ").concat((1 - Tb) * I, " ").concat(tl * g, " L ").concat(I, " ").concat(tl * g, " Z");
break;
case "quadArrow":
var kQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), XB = 1.7716535433070866, SB = 1.7716535433070866, DB = 1.7716535433070866, zQ = 3.9370078740157477, Kf = 7.874015748031495;
if (kQ) {
var JQ, KB = HI(kQ);
try {
for (KB.s(); !(JQ = KB.n()).done; ) {
var FB = JQ.value, Ff = U(FB, ["attrs", "name"]);
Ff === "adj1" ? XB = parseInt(U(FB, ["attrs", "fmla"]).substring(4)) * Gg : Ff === "adj2" ? SB = parseInt(U(FB, ["attrs", "fmla"]).substring(4)) * Gg : Ff === "adj3" && (DB = parseInt(U(FB, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
KB.e(Mg);
} finally {
KB.f();
}
}
var Ed = g / 2, Pd = I / 2, kf = Math.min(I, g), LQ = SB < 0 ? 0 : SB > zQ ? zQ : SB, zf = 2 * LQ, vQ = (Kf - zf) / 2, qA = kf * (DB < 0 ? 0 : DB > vQ ? vQ : DB) / Kf, kB = kf * LQ / Kf, TQ = Pd - kB, xQ = Pd + kB, zB = kf * (XB < 0 ? 0 : XB > zf ? zf : XB) / 15.74803149606299, JB = Pd - zB, LB = Pd + zB, vB = I - qA, jQ = Ed - kB, QQ = Ed + kB, TB = Ed - zB, xB = Ed + zB, jB = g - qA;
i = "M 0,".concat(Ed, " L ").concat(qA, ",").concat(jQ, " L ").concat(qA, ",").concat(TB, " L ").concat(JB, ",").concat(TB, " L ").concat(JB, ",").concat(qA, " L ").concat(TQ, ",").concat(qA, " L ").concat(Pd, ",0 L ").concat(xQ, ",").concat(qA, " L ").concat(LB, ",").concat(qA, " L ").concat(LB, ",").concat(TB, " L ").concat(vB, ",").concat(TB, " L ").concat(vB, ",").concat(jQ, " L ").concat(I, ",").concat(Ed, " L ").concat(vB, ",").concat(QQ, " L ").concat(vB, ",").concat(xB, " L ").concat(LB, ",").concat(xB, " L ").concat(LB, ",").concat(jB, " L ").concat(xQ, ",").concat(jB, " L ").concat(Pd, ",").concat(g, " L ").concat(TQ, ",").concat(jB, " L ").concat(JB, ",").concat(jB, " L ").concat(JB, ",").concat(xB, " L ").concat(qA, ",").concat(xB, " L ").concat(qA, ",").concat(QQ, " z");
break;
case "leftRightUpArrow":
var OQ = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), QB = 1.9685039370078738, OB = 1.9685039370078738, UB = 1.9685039370078738, Jf = 3.9370078740157477, Lf = 7.874015748031495;
if (OQ) {
var UQ, EB = HI(OQ);
try {
for (EB.s(); !(UQ = EB.n()).done; ) {
var PB = UQ.value, vf = U(PB, ["attrs", "name"]);
vf === "adj1" ? QB = parseInt(U(PB, ["attrs", "fmla"]).substring(4)) * Gg : vf === "adj2" ? OB = parseInt(U(PB, ["attrs", "fmla"]).substring(4)) * Gg : vf === "adj3" && (UB = parseInt(U(PB, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
EB.e(Mg);
} finally {
EB.f();
}
}
var xb = I / 2, _B = Math.min(I, g), Tf = OB < 0 ? 0 : OB > Jf ? Jf : OB, xf = 2 * Tf, EQ = (Lf - xf) / 2, il = _B * (UB < 0 ? 0 : UB > EQ ? EQ : UB) / Lf, jf = _B * Tf / Lf, Alg = xb - jf, slg = xb + jf, qB = _B * (QB < 0 ? 0 : QB > xf ? xf : QB) / 15.74803149606299, PQ = xb - qB, _Q = xb + qB, $B = I - il, qQ = g - _B * Tf / Jf, gW = g - jf, IW = gW - qB, $Q = gW + qB;
i = "M 0,".concat(gW, " L ").concat(il, ",").concat(qQ, " L ").concat(il, ",").concat(IW, " L ").concat(PQ, ",").concat(IW, " L ").concat(PQ, ",").concat(il, " L ").concat(Alg, ",").concat(il, " L ").concat(xb, ",0 L ").concat(slg, ",").concat(il, " L ").concat(_Q, ",").concat(il, " L ").concat(_Q, ",").concat(IW, " L ").concat($B, ",").concat(IW, " L ").concat($B, ",").concat(qQ, " L ").concat(I, ",").concat(gW, " L ").concat($B, ",").concat(g, " L ").concat($B, ",").concat($Q, " L ").concat(il, ",").concat($Q, " L ").concat(il, ",").concat(g, " z");
break;
case "leftUpArrow":
var gO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), CW = 1.9685039370078738, tW = 1.9685039370078738, iW = 1.9685039370078738, Qf = 3.9370078740157477, Of = 7.874015748031495;
if (gO) {
var IO, eW = HI(gO);
try {
for (eW.s(); !(IO = eW.n()).done; ) {
var AW = IO.value, Uf = U(AW, ["attrs", "name"]);
Uf === "adj1" ? CW = parseInt(U(AW, ["attrs", "fmla"]).substring(4)) * Gg : Uf === "adj2" ? tW = parseInt(U(AW, ["attrs", "fmla"]).substring(4)) * Gg : Uf === "adj3" && (iW = parseInt(U(AW, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
eW.e(Mg);
} finally {
eW.f();
}
}
var sW = Math.min(I, g), Ef = tW < 0 ? 0 : tW > Qf ? Qf : tW, Pf = 2 * Ef, CO = Of - Pf, Kn = sW * (iW < 0 ? 0 : iW > CO ? CO : iW) / Of, tO = sW * Ef / Qf, llg = I - tO, nlg = g - tO, iO = sW * Ef / Of, _f = I - iO, qf = g - iO, lW = sW * (CW < 0 ? 0 : CW > Pf ? Pf : CW) / 15.74803149606299, eO = _f - lW, AO = _f + lW, sO = qf - lW, lO = qf + lW;
i = "M 0,".concat(qf, " L ").concat(Kn, ",").concat(nlg, " L ").concat(Kn, ",").concat(sO, " L ").concat(eO, ",").concat(sO, " L ").concat(eO, ",").concat(Kn, " L ").concat(llg, ",").concat(Kn, " L ").concat(_f, ",0 L ").concat(I, ",").concat(Kn, " L ").concat(AO, ",").concat(Kn, " L ").concat(AO, ",").concat(lO, " L ").concat(Kn, ",").concat(lO, " L ").concat(Kn, ",").concat(g, " z");
break;
case "bentUpArrow":
var nO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), nW = 1.9685039370078738, aW = 1.9685039370078738, oW = 1.9685039370078738, wo = 3.9370078740157477, $f = 7.874015748031495;
if (nO) {
var aO, cW = HI(nO);
try {
for (cW.s(); !(aO = cW.n()).done; ) {
var dW = aO.value, g5 = U(dW, ["attrs", "name"]);
g5 === "adj1" ? nW = parseInt(U(dW, ["attrs", "fmla"]).substring(4)) * Gg : g5 === "adj2" ? aW = parseInt(U(dW, ["attrs", "fmla"]).substring(4)) * Gg : g5 === "adj3" && (oW = parseInt(U(dW, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
cW.e(Mg);
} finally {
cW.f();
}
}
var jb = Math.min(I, g), oO = nW < 0 ? 0 : nW > wo ? wo : nW, cO = aW < 0 ? 0 : aW > wo ? wo : aW, rW = jb * (oW < 0 ? 0 : oW > wo ? wo : oW) / $f, alg = I - jb * cO / wo, I5 = I - jb * cO / $f, dO = jb * oO / 15.74803149606299, rO = I5 - dO, hO = I5 + dO, bO = g - jb * oO / $f;
i = "M 0,".concat(bO, " L ").concat(rO, ",").concat(bO, " L ").concat(rO, ",").concat(rW, " L ").concat(alg, ",").concat(rW, " L ").concat(I5, ",0 L ").concat(I, ",").concat(rW, " L ").concat(hO, ",").concat(rW, " L ").concat(hO, ",").concat(g, " L 0,").concat(g, " z");
break;
case "bentArrow":
var uO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), hW = 1.9685039370078738, bW = 1.9685039370078738, uW = 1.9685039370078738, mW = 3.444881889763779, ZW = 3.9370078740157477, Qb = 7.874015748031495;
if (uO) {
var mO, GW = HI(uO);
try {
for (GW.s(); !(mO = GW.n()).done; ) {
var Ob = mO.value, wW = U(Ob, ["attrs", "name"]);
wW === "adj1" ? hW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg : wW === "adj2" ? bW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg : wW === "adj3" ? uW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg : wW === "adj4" && (mW = parseInt(U(Ob, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
GW.e(Mg);
} finally {
GW.f();
}
}
var Ub = Math.min(I, g), ZO = bW < 0 ? 0 : bW > ZW ? ZW : bW, GO = 2 * ZO, Eb = Ub * (hW < 0 ? 0 : hW > GO ? GO : hW) / Qb, wO = Ub * ZO / Qb, Pb = wO - Eb / 2, pO = Ub * (uW < 0 ? 0 : uW > ZW ? ZW : uW) / Qb, BO = I - pO, WO = g - Pb, yO = Qb * (BO < WO ? BO : WO) / Ub, _b = Ub * (mW < 0 ? 0 : mW > yO ? yO : mW) / Qb, YO = _b - Eb, pW = YO > 0 ? YO : 0, NO = Eb + pW, BW = I - pO, WW = Pb + Eb, olg = WW + Pb, VO = Pb + _b, clg = WW + pW;
i = "M 0,".concat(g, " L 0,").concat(VO, " ").concat(Vg(_b, VO, _b, _b, 180, 270, !1).replace("M", "L"), " L ").concat(BW, ",").concat(Pb, " L ").concat(BW, ",0 L ").concat(I, ",").concat(wO, " L ").concat(BW, ",").concat(olg, " L ").concat(BW, ",").concat(WW, " L ").concat(NO, ",").concat(WW, " ").concat(Vg(NO, clg, pW, pW, 270, 180, !1).replace("M", "L"), " L ").concat(Eb, ",").concat(g, " z");
break;
case "uturnArrow":
var MO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), yW = 1.9685039370078738, YW = 1.9685039370078738, NW = 1.9685039370078738, VW = 3.444881889763779, MW = 5.905511811023621, RO = 1.9685039370078738, el = 7.874015748031495;
if (MO) {
var fO, RW = HI(MO);
try {
for (RW.s(); !(fO = RW.n()).done; ) {
var _d = fO.value, qb = U(_d, ["attrs", "name"]);
qb === "adj1" ? yW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj2" ? YW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj3" ? NW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj4" ? VW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg : qb === "adj5" && (MW = parseInt(U(_d, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
RW.e(Mg);
} finally {
RW.f();
}
}
var Fn = Math.min(I, g), HO = YW < 0 ? 0 : YW > RO ? RO : YW, XO = 2 * HO, C5 = yW < 0 ? 0 : yW > XO ? XO : yW, SO = (el - C5 * Fn / g) * g / Fn, DO = NW < 0 ? 0 : NW > SO ? SO : NW, KO = (DO + C5) * Fn / g, $b = Fn * C5 / el, t5 = Fn * HO / el, FO = t5 - $b / 2, kO = g * (MW < KO ? KO : MW > el ? el : MW) / el, qd = kO - Fn * DO / el, i5 = I - FO, zO = i5 / 2, JO = el * (zO < qd ? zO : qd) / Fn, $A = Fn * (VW < 0 ? 0 : VW > JO ? JO : VW) / el, LO = $A - $b, $d = LO > 0 ? LO : 0, gu = $b + $d, vO = I - t5, TO = vO - t5, e5 = TO + FO, xO = i5 - $A, dlg = e5 - $d;
i = "M 0,".concat(g, " L 0,").concat($A, " ").concat(Vg($A, $A, $A, $A, 180, 270, !1).replace("M", "L"), " L ").concat(xO, ",0 ").concat(Vg(xO, $A, $A, $A, 270, 360, !1).replace("M", "L"), " L ").concat(i5, ",").concat(qd, " L ").concat(I, ",").concat(qd, " L ").concat(vO, ",").concat(kO, " L ").concat(TO, ",").concat(qd, " L ").concat(e5, ",").concat(qd, " L ").concat(e5, ",").concat(gu, " ").concat(Vg(dlg, gu, $d, $d, 0, -90, !1).replace("M", "L"), " L ").concat(gu, ",").concat($b, " ").concat(Vg(gu, gu, $d, $d, 270, 180, !1).replace("M", "L"), " L ").concat($b, ",").concat(g, " z");
break;
case "stripedRightArrow":
var jO = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), fW = 3.9370078740157477, HW = 3.9370078740157477, A5 = 7.874015748031495;
if (jO) {
var QO, XW = HI(jO);
try {
for (XW.s(); !(QO = XW.n()).done; ) {
var s5 = QO.value, OO = U(s5, ["attrs", "name"]);
OO === "adj1" ? fW = parseInt(U(s5, ["attrs", "fmla"]).substring(4)) * Gg : OO === "adj2" && (HW = parseInt(U(s5, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
XW.e(Mg);
} finally {
XW.f();
}
}
var l5 = g / 2, gr = Math.min(I, g), UO = 6.643700787401574 * I / gr, EO = 5 * gr / 32, SW = I - gr * (HW < 0 ? 0 : HW > UO ? UO : HW) / A5, PO = g * (fW < 0 ? 0 : fW > A5 ? A5 : fW) / 15.74803149606299, Ir = l5 - PO, Cr = l5 + PO, _O = gr / 8, qO = gr / 16, $O = gr / 32;
i = "M 0,".concat(Ir, " L ").concat($O, ",").concat(Ir, " L ").concat($O, ",").concat(Cr, " L 0,").concat(Cr, " z M ").concat(qO, ",").concat(Ir, " L ").concat(_O, ",").concat(Ir, " L ").concat(_O, ",").concat(Cr, " L ").concat(qO, ",").concat(Cr, " z M ").concat(EO, ",").concat(Ir, " L ").concat(SW, ",").concat(Ir, " L ").concat(SW, ",0 L ").concat(I, ",").concat(l5, " L ").concat(SW, ",").concat(g, " L ").concat(SW, ",").concat(Cr, " L ").concat(EO, ",").concat(Cr, " z");
break;
case "notchedRightArrow":
var g4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), DW = 3.9370078740157477, KW = 3.9370078740157477, FW = 7.874015748031495;
if (g4) {
var I4, kW = HI(g4);
try {
for (kW.s(); !(I4 = kW.n()).done; ) {
var n5 = I4.value, C4 = U(n5, ["attrs", "name"]);
C4 === "adj1" ? DW = parseInt(U(n5, ["attrs", "fmla"]).substring(4)) * Gg : C4 === "adj2" && (KW = parseInt(U(n5, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
kW.e(Mg);
} finally {
kW.f();
}
}
var Iu = g / 2, rlg = Iu, t4 = Math.min(I, g), i4 = FW * I / t4, e4 = t4 * (KW < 0 ? 0 : KW > i4 ? i4 : KW) / FW, zW = I - e4, a5 = g * (DW < 0 ? 0 : DW > FW ? FW : DW) / 15.74803149606299, A4 = Iu - a5, s4 = Iu + a5, hlg = a5 * e4 / rlg;
i = "M 0,".concat(A4, " L ").concat(zW, ",").concat(A4, " L ").concat(zW, ",0 L ").concat(I, ",").concat(Iu, " L ").concat(zW, ",").concat(g, " L ").concat(zW, ",").concat(s4, " L 0,").concat(s4, " L ").concat(hlg, ",").concat(Iu, " z");
break;
case "homePlate":
var l4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), JW = 3.9370078740157477, n4 = 7.874015748031495;
l4 && (JW = parseInt(l4.substring(4)) * Gg);
var blg = g / 2, a4 = Math.min(I, g), o4 = n4 * I / a4, c4 = I - a4 * (JW < 0 ? 0 : JW > o4 ? o4 : JW) / n4;
i = "M 0,0 L ".concat(c4, ",0 L ").concat(I, ",").concat(blg, " L ").concat(c4, ",").concat(g, " L 0,").concat(g, " z");
break;
case "chevron":
var d4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), LW = 3.9370078740157477, r4 = 7.874015748031495;
d4 && (LW = parseInt(d4.substring(4)) * Gg);
var h4 = g / 2, b4 = Math.min(I, g), u4 = r4 * I / b4, m4 = b4 * (LW < 0 ? 0 : LW > u4 ? u4 : LW) / r4, Z4 = I - m4;
i = "M 0,0 L ".concat(Z4, ",0 L ").concat(I, ",").concat(h4, " L ").concat(Z4, ",").concat(g, " L 0,").concat(g, " L ").concat(m4, ",").concat(h4, " z");
break;
case "rightArrowCallout":
var G4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), vW = 1.9685039370078738, TW = 1.9685039370078738, xW = 1.9685039370078738, jW = 5.116299212598425, w4 = 3.9370078740157477, QW = 7.874015748031495;
if (G4) {
var p4, OW = HI(G4);
try {
for (OW.s(); !(p4 = OW.n()).done; ) {
var Cu = p4.value, UW = U(Cu, ["attrs", "name"]);
UW === "adj1" ? vW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg : UW === "adj2" ? TW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg : UW === "adj3" ? xW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg : UW === "adj4" && (jW = parseInt(U(Cu, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
OW.e(Mg);
} finally {
OW.f();
}
}
var tu = g / 2, B4 = I, W4 = g, tr = Math.min(I, g), y4 = w4 * g / tr, Y4 = TW < 0 ? 0 : TW > y4 ? y4 : TW, N4 = 2 * Y4, V4 = QW * I / tr, M4 = xW < 0 ? 0 : xW > V4 ? V4 : xW, R4 = w4 - M4 * tr / I, f4 = tr * Y4 / QW, H4 = tr * (vW < 0 ? 0 : vW > N4 ? N4 : vW) / 15.74803149606299, ulg = tu - f4, X4 = tu - H4, S4 = tu + H4, mlg = tu + f4, EW = B4 - tr * M4 / QW, PW = I * (jW < 0 ? 0 : jW > R4 ? R4 : jW) / QW;
i = "M ".concat(0, ",").concat(0, " L ").concat(PW, ",").concat(0, " L ").concat(PW, ",").concat(X4, " L ").concat(EW, ",").concat(X4, " L ").concat(EW, ",").concat(ulg, " L ").concat(B4, ",").concat(tu, " L ").concat(EW, ",").concat(mlg, " L ").concat(EW, ",").concat(S4, " L ").concat(PW, ",").concat(S4, " L ").concat(PW, ",").concat(W4, " L ").concat(0, ",").concat(W4, " z");
break;
case "downArrowCallout":
var D4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), _W = 1.9685039370078738, qW = 1.9685039370078738, $W = 1.9685039370078738, g2 = 5.116299212598425, iu = 7.874015748031495;
if (D4) {
var K4, I2 = HI(D4);
try {
for (I2.s(); !(K4 = I2.n()).done; ) {
var eu = K4.value, C2 = U(eu, ["attrs", "name"]);
C2 === "adj1" ? _W = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg : C2 === "adj2" ? qW = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg : C2 === "adj3" ? $W = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg : C2 === "adj4" && (g2 = parseInt(U(eu, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
I2.e(Mg);
} finally {
I2.f();
}
}
var Au = I / 2, F4 = I, k4 = g, ir = Math.min(I, g), z4 = 3.9370078740157477 * I / ir, J4 = qW < 0 ? 0 : qW > z4 ? z4 : qW, L4 = 2 * J4, v4 = iu * g / ir, T4 = $W < 0 ? 0 : $W > v4 ? v4 : $W, x4 = iu - T4 * ir / g, j4 = ir * J4 / iu, Q4 = ir * (_W < 0 ? 0 : _W > L4 ? L4 : _W) / 15.74803149606299, Zlg = Au - j4, O4 = Au - Q4, U4 = Au + Q4, Glg = Au + j4, t2 = k4 - ir * T4 / iu, i2 = g * (g2 < 0 ? 0 : g2 > x4 ? x4 : g2) / iu;
i = "M ".concat(0, ",").concat(0, " L ").concat(F4, ",").concat(0, " L ").concat(F4, ",").concat(i2, " L ").concat(U4, ",").concat(i2, " L ").concat(U4, ",").concat(t2, " L ").concat(Glg, ",").concat(t2, " L ").concat(Au, ",").concat(k4, " L ").concat(Zlg, ",").concat(t2, " L ").concat(O4, ",").concat(t2, " L ").concat(O4, ",").concat(i2, " L ").concat(0, ",").concat(i2, " z");
break;
case "leftArrowCallout":
var E4 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), e2 = 1.9685039370078738, A2 = 1.9685039370078738, s2 = 1.9685039370078738, l2 = 5.116299212598425, su = 7.874015748031495;
if (E4) {
var P4, n2 = HI(E4);
try {
for (n2.s(); !(P4 = n2.n()).done; ) {
var lu = P4.value, a2 = U(lu, ["attrs", "name"]);
a2 === "adj1" ? e2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg : a2 === "adj2" ? A2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg : a2 === "adj3" ? s2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg : a2 === "adj4" && (l2 = parseInt(U(lu, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
n2.e(Mg);
} finally {
n2.f();
}
}
var nu = g / 2, o5 = I, _4 = g, er = Math.min(I, g), q4 = 3.9370078740157477 * g / er, $4 = A2 < 0 ? 0 : A2 > q4 ? q4 : A2, gU = 2 * $4, IU = su * I / er, CU = s2 < 0 ? 0 : s2 > IU ? IU : s2, tU = su - CU * er / I, iU = er * $4 / su, eU = er * (e2 < 0 ? 0 : e2 > gU ? gU : e2) / 15.74803149606299, wlg = nu - iU, AU = nu - eU, sU = nu + eU, plg = nu + iU, o2 = er * CU / su, c2 = o5 - I * (l2 < 0 ? 0 : l2 > tU ? tU : l2) / su;
i = "M ".concat(0, ",").concat(nu, " L ").concat(o2, ",").concat(wlg, " L ").concat(o2, ",").concat(AU, " L ").concat(c2, ",").concat(AU, " L ").concat(c2, ",").concat(0, " L ").concat(o5, ",").concat(0, " L ").concat(o5, ",").concat(_4, " L ").concat(c2, ",").concat(_4, " L ").concat(c2, ",").concat(sU, " L ").concat(o2, ",").concat(sU, " L ").concat(o2, ",").concat(plg, " z");
break;
case "upArrowCallout":
var lU = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), d2 = 1.9685039370078738, r2 = 1.9685039370078738, h2 = 1.9685039370078738, b2 = 5.116299212598425, au = 7.874015748031495;
if (lU) {
var nU, u2 = HI(lU);
try {
for (u2.s(); !(nU = u2.n()).done; ) {
var ou = nU.value, m2 = U(ou, ["attrs", "name"]);
m2 === "adj1" ? d2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg : m2 === "adj2" ? r2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg : m2 === "adj3" ? h2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg : m2 === "adj4" && (b2 = parseInt(U(ou, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
u2.e(Mg);
} finally {
u2.f();
}
}
var cu = I / 2, aU = I, c5 = g, Ar = Math.min(I, g), oU = 3.9370078740157477 * I / Ar, cU = r2 < 0 ? 0 : r2 > oU ? oU : r2, dU = 2 * cU, rU = au * g / Ar, hU = h2 < 0 ? 0 : h2 > rU ? rU : h2, bU = au - hU * Ar / g, uU = Ar * cU / au, mU = Ar * (d2 < 0 ? 0 : d2 > dU ? dU : d2) / 15.74803149606299, Blg = cu - uU, ZU = cu - mU, GU = cu + mU, Wlg = cu + uU, Z2 = Ar * hU / au, G2 = c5 - g * (b2 < 0 ? 0 : b2 > bU ? bU : b2) / au;
i = "M ".concat(0, ",").concat(G2, " L ").concat(ZU, ",").concat(G2, " L ").concat(ZU, ",").concat(Z2, " L ").concat(Blg, ",").concat(Z2, " L ").concat(cu, ",").concat(0, " L ").concat(Wlg, ",").concat(Z2, " L ").concat(GU, ",").concat(Z2, " L ").concat(GU, ",").concat(G2, " L ").concat(aU, ",").concat(G2, " L ").concat(aU, ",").concat(c5, " L ").concat(0, ",").concat(c5, " z");
break;
case "leftRightArrowCallout":
var wU = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), w2 = 1.9685039370078738, p2 = 1.9685039370078738, B2 = 1.9685039370078738, W2 = 3.7892125984251965, pU = 3.9370078740157477, d5 = 7.874015748031495, BU = 15.74803149606299;
if (wU) {
var WU, y2 = HI(wU);
try {
for (y2.s(); !(WU = y2.n()).done; ) {
var du = WU.value, Y2 = U(du, ["attrs", "name"]);
Y2 === "adj1" ? w2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg : Y2 === "adj2" ? p2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg : Y2 === "adj3" ? B2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg : Y2 === "adj4" && (W2 = parseInt(U(du, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
y2.e(Mg);
} finally {
y2.f();
}
}
var sr = g / 2, yU = I / 2, YU = I, NU = g, lr = Math.min(I, g), VU = pU * g / lr, MU = p2 < 0 ? 0 : p2 > VU ? VU : p2, RU = 2 * MU, fU = pU * I / lr, HU = B2 < 0 ? 0 : B2 > fU ? fU : B2, XU = d5 - HU * lr / (I / 2), SU = lr * MU / d5, DU = lr * (w2 < 0 ? 0 : w2 > RU ? RU : w2) / BU, KU = sr - SU, N2 = sr - DU, V2 = sr + DU, FU = sr + SU, ru = lr * HU / d5, M2 = YU - ru, kU = I * (W2 < 0 ? 0 : W2 > XU ? XU : W2) / BU, R2 = yU - kU, f2 = yU + kU;
i = "M ".concat(0, ",").concat(sr, " L ").concat(ru, ",").concat(KU, " L ").concat(ru, ",").concat(N2, " L ").concat(R2, ",").concat(N2, " L ").concat(R2, ",").concat(0, " L ").concat(f2, ",").concat(0, " L ").concat(f2, ",").concat(N2, " L ").concat(M2, ",").concat(N2, " L ").concat(M2, ",").concat(KU, " L ").concat(YU, ",").concat(sr, " L ").concat(M2, ",").concat(FU, " L ").concat(M2, ",").concat(V2, " L ").concat(f2, ",").concat(V2, " L ").concat(f2, ",").concat(NU, " L ").concat(R2, ",").concat(NU, " L ").concat(R2, ",").concat(V2, " L ").concat(ru, ",").concat(V2, " L ").concat(ru, ",").concat(FU, " z");
break;
case "quadArrowCallout":
var zU = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), H2 = 1.4578740157480314, X2 = 1.4578740157480314, S2 = 1.4578740157480314, D2 = 3.7892125984251965, r5 = 3.9370078740157477, h5 = 7.874015748031495, b5 = 15.74803149606299;
if (zU) {
var JU, K2 = HI(zU);
try {
for (K2.s(); !(JU = K2.n()).done; ) {
var hu = JU.value, F2 = U(hu, ["attrs", "name"]);
F2 === "adj1" ? H2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg : F2 === "adj2" ? X2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg : F2 === "adj3" ? S2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg : F2 === "adj4" && (D2 = parseInt(U(hu, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
K2.e(Mg);
} finally {
K2.f();
}
}
var kn = g / 2, zn = I / 2, LU = I, vU = g, u5 = Math.min(I, g), m5 = X2 < 0 ? 0 : X2 > r5 ? r5 : X2, TU = 2 * m5, Z5 = H2 < 0 ? 0 : H2 > TU ? TU : H2, xU = r5 - m5, jU = S2 < 0 ? 0 : S2 > xU ? xU : S2, QU = h5 - 2 * jU, OU = D2 < Z5 ? Z5 : D2 > QU ? QU : D2, k2 = u5 * m5 / h5, z2 = u5 * Z5 / b5, gs = u5 * jU / h5, UU = I * OU / b5, EU = g * OU / b5, J2 = LU - gs, L2 = zn - UU, v2 = zn + UU, PU = zn - k2, _U = zn + k2, T2 = zn - z2, x2 = zn + z2, j2 = vU - gs, Q2 = kn - EU, O2 = kn + EU, qU = kn - k2, $U = kn + k2, U2 = kn - z2, E2 = kn + z2;
i = "M ".concat(0, ",").concat(kn, " L ").concat(gs, ",").concat(qU, " L ").concat(gs, ",").concat(U2, " L ").concat(L2, ",").concat(U2, " L ").concat(L2, ",").concat(Q2, " L ").concat(T2, ",").concat(Q2, " L ").concat(T2, ",").concat(gs, " L ").concat(PU, ",").concat(gs, " L ").concat(zn, ",").concat(0, " L ").concat(_U, ",").concat(gs, " L ").concat(x2, ",").concat(gs, " L ").concat(x2, ",").concat(Q2, " L ").concat(v2, ",").concat(Q2, " L ").concat(v2, ",").concat(U2, " L ").concat(J2, ",").concat(U2, " L ").concat(J2, ",").concat(qU, " L ").concat(LU, ",").concat(kn, " L ").concat(J2, ",").concat($U, " L ").concat(J2, ",").concat(E2, " L ").concat(v2, ",").concat(E2, " L ").concat(v2, ",").concat(O2, " L ").concat(x2, ",").concat(O2, " L ").concat(x2, ",").concat(j2, " L ").concat(_U, ",").concat(j2, " L ").concat(zn, ",").concat(vU, " L ").concat(PU, ",").concat(j2, " L ").concat(T2, ",").concat(j2, " L ").concat(T2, ",").concat(O2, " L ").concat(L2, ",").concat(O2, " L ").concat(L2, ",").concat(E2, " L ").concat(gs, ",").concat(E2, " L ").concat(gs, ",").concat($U, " z");
break;
case "curvedDownArrow":
var gE = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), P2 = 1.9685039370078738, _2 = 3.9370078740157477, q2 = 1.9685039370078738, nr = 7.874015748031495;
if (gE) {
var IE, $2 = HI(gE);
try {
for ($2.s(); !(IE = $2.n()).done; ) {
var gy = IE.value, G5 = U(gy, ["attrs", "name"]);
G5 === "adj1" ? P2 = parseInt(U(gy, ["attrs", "fmla"]).substring(4)) * Gg : G5 === "adj2" ? _2 = parseInt(U(gy, ["attrs", "fmla"]).substring(4)) * Gg : G5 === "adj3" && (q2 = parseInt(U(gy, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
$2.e(Mg);
} finally {
$2.f();
}
}
var ylg = I / 2, Ylg = I, CE = g, Iy = 270, bu = Math.min(I, g), tE = 3.9370078740157477 * I / bu, po = bu * (P2 < 0 ? 0 : P2 > nr ? nr : P2) / nr, w5 = bu * (_2 < 0 ? 0 : _2 > tE ? tE : _2) / nr, Is = ylg - (po + w5) / 4, p5 = 2 * Is, iE = Math.sqrt(p5 * p5 - po * po) * g / p5, eE = nr * iE / bu, Cy = bu * (q2 < 0 ? 0 : q2 > eE ? eE : q2) / nr, uu = Is + po, B5 = Math.sqrt(g * g - Cy * Cy) * Is / g, W5 = Is + B5, AE = (w5 - po) / 2, Nlg = W5 - AE, Vlg = uu + B5 + AE, Mlg = Ylg - w5 / 2, ty = CE - Cy, y5 = 180 * Math.atan(B5 / Cy) / Math.PI, Rlg = -y5, Y5 = 180 * Math.atan(po / 2 / iE) / Math.PI, sE = Iy + y5, lE = Iy - Y5, flg = Y5 - 90, Hlg = 90 + Y5;
i = "M ".concat(Mlg, ",").concat(CE, " L ").concat(Nlg, ",").concat(ty, " L ").concat(W5, ",").concat(ty, " ").concat(Vg(Is, g, Is, g, sE, sE + Rlg, !1).replace("M", "L"), " L ").concat(uu, ",").concat(0, " ").concat(Vg(uu, g, Is, g, Iy, Iy + y5, !1).replace("M", "L"), " L ").concat(W5 + po, ",").concat(ty, " L ").concat(Vlg, ",").concat(ty, " z M ").concat(uu, ",").concat(0, " ").concat(Vg(uu, g, Is, g, lE, lE + flg, !1).replace("M", "L"), " ").concat(Vg(Is, g, Is, g, 180, 180 + Hlg, !1).replace("M", "L"));
break;
case "curvedLeftArrow":
var nE = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), iy = 1.9685039370078738, ey = 3.9370078740157477, Ay = 1.9685039370078738, sy = 7.874015748031495;
if (nE) {
var aE, ly = HI(nE);
try {
for (ly.s(); !(aE = ly.n()).done; ) {
var ny = aE.value, N5 = U(ny, ["attrs", "name"]);
N5 === "adj1" ? iy = parseInt(U(ny, ["attrs", "fmla"]).substring(4)) * Gg : N5 === "adj2" ? ey = parseInt(U(ny, ["attrs", "fmla"]).substring(4)) * Gg : N5 === "adj3" && (Ay = parseInt(U(ny, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
ly.e(Mg);
} finally {
ly.f();
}
}
var Xlg = g / 2, oE = I, Slg = g, cE = 270, mu = Math.min(I, g), dE = 3.9370078740157477 * g / mu, V5 = ey < 0 ? 0 : ey > dE ? dE : ey, ar = mu * (iy < 0 ? 0 : iy > V5 ? V5 : iy) / sy, M5 = mu * V5 / sy, ie = Xlg - (ar + M5) / 4, R5 = 2 * ie, rE = Math.sqrt(R5 * R5 - ar * ar) * I / R5, hE = sy * rE / mu, ay = mu * (Ay < 0 ? 0 : Ay > hE ? hE : Ay) / sy, or = ie + ar, f5 = Math.sqrt(I * I - ay * ay) * ie / I, bE = ie + f5, uE = or + f5, mE = (M5 - ar) / 2, Dlg = bE - mE, Klg = uE + mE, Flg = Slg - M5 / 2, oy = 0 + ay, ZE = Math.atan(f5 / ay), klg = Math.atan(ar / 2 / rE) - ZE, H5 = 180 * ZE / Math.PI, zlg = 180 * klg / Math.PI;
i = "M ".concat(oE, ",").concat(or, " ").concat(Vg(0, ie, I, ie, 0, -90, !1).replace("M", "L"), " L ").concat(0, ",").concat(0, " ").concat(Vg(0, or, I, ie, cE, 360, !1).replace("M", "L"), " L ").concat(oE, ",").concat(or, " ").concat(Vg(0, or, I, ie, 0, H5, !1).replace("M", "L"), " L ").concat(oy, ",").concat(uE, " L ").concat(oy, ",").concat(Klg, " L ").concat(0, ",").concat(Flg, " L ").concat(oy, ",").concat(Dlg, " L ").concat(oy, ",").concat(bE, " ").concat(Vg(0, ie, I, ie, H5, H5 + zlg, !1).replace("M", "L"), " ").concat(Vg(0, ie, I, ie, 0, -90, !1).replace("M", "L"), " ").concat(Vg(0, or, I, ie, cE, 360, !1).replace("M", "L"));
break;
case "curvedRightArrow":
var GE = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), cy = 1.9685039370078738, dy = 3.9370078740157477, ry = 1.9685039370078738, hy = 7.874015748031495;
if (GE) {
var wE, by = HI(GE);
try {
for (by.s(); !(wE = by.n()).done; ) {
var uy = wE.value, X5 = U(uy, ["attrs", "name"]);
X5 === "adj1" ? cy = parseInt(U(uy, ["attrs", "fmla"]).substring(4)) * Gg : X5 === "adj2" ? dy = parseInt(U(uy, ["attrs", "fmla"]).substring(4)) * Gg : X5 === "adj3" && (ry = parseInt(U(uy, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
by.e(Mg);
} finally {
by.f();
}
}
var Jlg = g / 2, S5 = I, Llg = g, D5 = 180, Zu = Math.min(I, g), pE = 3.9370078740157477 * g / Zu, K5 = dy < 0 ? 0 : dy > pE ? pE : dy, Bo = Zu * (cy < 0 ? 0 : cy > K5 ? K5 : cy) / hy, F5 = Zu * K5 / hy, Fe = Jlg - (Bo + F5) / 4, k5 = 2 * Fe, BE = Math.sqrt(k5 * k5 - Bo * Bo) * I / k5, WE = hy * BE / Zu, my = Zu * (ry < 0 ? 0 : ry > WE ? WE : ry) / hy, z5 = Fe + Bo, J5 = Math.sqrt(I * I - my * my) * Fe / I, yE = Fe + J5, YE = z5 + J5, NE = (F5 - Bo) / 2, vlg = yE - NE, Tlg = YE + NE, xlg = Llg - F5 / 2, Zy = S5 - my, L5 = Math.atan(J5 / my), jlg = Math.PI - L5, Qlg = -L5, Olg = Math.atan(Bo / 2 / BE) - Math.PI / 2, VE = 180 * jlg / Math.PI, Ulg = 180 * Qlg / Math.PI, Elg = 180 * L5 / Math.PI, Plg = 180 * Olg / Math.PI;
i = "M ".concat(0, ",").concat(Fe, " ").concat(Vg(I, Fe, I, Fe, D5, D5 + Ulg, !1).replace("M", "L"), " L ").concat(Zy, ",").concat(yE, " L ").concat(Zy, ",").concat(vlg, " L ").concat(S5, ",").concat(xlg, " L ").concat(Zy, ",").concat(Tlg, " L ").concat(Zy, ",").concat(YE, " ").concat(Vg(I, z5, I, Fe, VE, VE + Elg, !1).replace("M", "L"), " L ").concat(0, ",").concat(Fe, " ").concat(Vg(I, Fe, I, Fe, D5, 270, !1).replace("M", "L"), " L ").concat(S5, ",").concat(Bo, " ").concat(Vg(I, z5, I, Fe, 270, 270 + Plg, !1).replace("M", "L"));
break;
case "curvedUpArrow":
var ME = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Gy = 1.9685039370078738, wy = 3.9370078740157477, py = 1.9685039370078738, cr = 7.874015748031495;
if (ME) {
var RE, By = HI(ME);
try {
for (By.s(); !(RE = By.n()).done; ) {
var Wy = RE.value, v5 = U(Wy, ["attrs", "name"]);
v5 === "adj1" ? Gy = parseInt(U(Wy, ["attrs", "fmla"]).substring(4)) * Gg : v5 === "adj2" ? wy = parseInt(U(Wy, ["attrs", "fmla"]).substring(4)) * Gg : v5 === "adj3" && (py = parseInt(U(Wy, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
By.e(Mg);
} finally {
By.f();
}
}
var _lg = I / 2, qlg = I, $lg = g, Gu = Math.min(I, g), fE = 3.9370078740157477 * I / Gu, Wo = Gu * (Gy < 0 ? 0 : Gy > cr ? cr : Gy) / cr, T5 = Gu * (wy < 0 ? 0 : wy > fE ? fE : wy) / cr, cA = _lg - (Wo + T5) / 4, x5 = 2 * cA, HE = Math.sqrt(x5 * x5 - Wo * Wo) * g / x5, XE = cr * HE / Gu, yy = Gu * (py < 0 ? 0 : py > XE ? XE : py) / cr, j5 = cA + Wo, Q5 = Math.sqrt(g * g - yy * yy) * cA / g, SE = cA + Q5, DE = j5 + Q5, KE = (T5 - Wo) / 2, gng = SE - KE, Ing = DE + KE, Cng = qlg - T5 / 2, Yy = 0 + yy, O5 = Math.atan(Q5 / yy), FE = Math.atan(Wo / 2 / HE), tng = FE - O5, ing = Math.PI / 2 - O5, kE = 180 * (Math.PI / 2 - FE) / Math.PI, eng = 180 * tng / Math.PI, zE = 180 * ing / Math.PI, Ang = 180 * O5 / Math.PI;
i = "".concat(Vg(cA, 0, cA, g, kE, kE + eng, !1), " L ").concat(SE, ",").concat(Yy, " L ").concat(gng, ",").concat(Yy, " L ").concat(Cng, ",").concat(0, " L ").concat(Ing, ",").concat(Yy, " L ").concat(DE, ",").concat(Yy, " ").concat(Vg(j5, 0, cA, g, zE, zE + Ang, !1).replace("M", "L"), " L ").concat(cA, ",").concat($lg, " ").concat(Vg(cA, 0, cA, g, 90, 180, !1).replace("M", "L"), " L ").concat(Wo, ",").concat(0, " ").concat(Vg(j5, 0, cA, g, 180, 90, !1).replace("M", "L"));
break;
case "mathDivide":
case "mathEqual":
case "mathMinus":
case "mathMultiply":
case "mathNotEqual":
case "mathPlus":
var CC, ft, ke, Ny = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]);
if (Ny) if (Array.isArray(Ny)) {
var JE, Vy = HI(Ny);
try {
for (Vy.s(); !(JE = Vy.n()).done; ) {
var My = JE.value, U5 = U(My, ["attrs", "name"]);
U5 === "adj1" ? CC = parseInt(U(My, ["attrs", "fmla"]).substring(4)) : U5 === "adj2" ? ft = parseInt(U(My, ["attrs", "fmla"]).substring(4)) : U5 === "adj3" && (ke = parseInt(U(My, ["attrs", "fmla"]).substring(4)));
}
} catch (Mg) {
Vy.e(Mg);
} finally {
Vy.f();
}
} else CC = parseInt(U(Ny, ["attrs", "fmla"]).substring(4));
var LE = 3.9370078740157477, Cs = 7.874015748031495, dA = 15.74803149606299, qC = I / 2, ci = g / 2, Al = g / 2;
if (t === "mathNotEqual") {
CC === void 0 && (CC = 23520), ft === void 0 && (ft = 66e5), ke === void 0 && (ke = 11760), CC *= Gg, ft = ft / 6e4 * Math.PI / 180, ke *= Gg;
var vE = 70 * Math.PI / 180, TE = 110 * Math.PI / 180, xE = CC < 0 ? 0 : CC > LE ? LE : CC, jE = Cs - 2 * xE, wu = g * xE / Cs, QE = g * (ke < 0 ? 0 : ke > jE ? jE : ke) / dA, OE = 5.7866141732283465 * I / dA, Ry = qC - OE, fy = qC + OE, dr = ci - QE, rr = ci + QE, pu = dr - wu, Bu = rr + wu, Wu = (ft < vE ? vE : ft > TE ? TE : ft) - Math.PI / 2, Jn = Al * Math.tan(Wu), E5 = Math.sqrt(Jn * Jn + Al * Al), yo = E5 * wu / Al, Ln = qC + Jn - yo / 2, UE = Ln - Jn * pu / Al, EE = Ln - Jn * dr / Al, PE = Ln - Jn * rr / Al, _E = Ln - Jn * Bu / Al, sng = UE + yo, lng = EE + yo, nng = PE + yo, ang = _E + yo, qE = wu * Al / E5, $E = Wu > 0 ? Ln + qE : Ln + yo, g7 = Wu > 0 ? Ln : Ln + yo - qE, I7 = wu * Jn / E5, C7 = Wu > 0 ? I7 : 0, t7 = Wu > 0 ? 0 : -I7, ong = I - $E, cng = I - g7, dng = g - C7, rng = g - t7;
i = "M ".concat(Ry, ",").concat(pu, " L ").concat(UE, ",").concat(pu, " L ").concat(g7, ",").concat(t7, " L ").concat($E, ",").concat(C7, " L ").concat(sng, ",").concat(pu, " L ").concat(fy, ",").concat(pu, " L ").concat(fy, ",").concat(dr, " L ").concat(lng, ",").concat(dr, " L ").concat(nng, ",").concat(rr, " L ").concat(fy, ",").concat(rr, " L ").concat(fy, ",").concat(Bu, " L ").concat(ang, ",").concat(Bu, " L ").concat(cng, ",").concat(rng, " L ").concat(ong, ",").concat(dng, " L ").concat(_E, ",").concat(Bu, " L ").concat(Ry, ",").concat(Bu, " L ").concat(Ry, ",").concat(rr, " L ").concat(PE, ",").concat(rr, " L ").concat(EE, ",").concat(dr, " L ").concat(Ry, ",").concat(dr, " z");
} else if (t === "mathDivide") {
CC === void 0 && (CC = 23520), ft === void 0 && (ft = 5880), ke === void 0 && (ke = 11760);
var Hy = 0.07874015748031496, P5 = 2.8933070866141732, _5 = 5.7866141732283465, q5 = (CC *= Gg) < Hy ? Hy : CC > P5 ? P5 : CC, i7 = (_5 - q5) / 4, e7 = P5 * I / g, A7 = i7 < e7 ? i7 : e7, s7 = (ke *= Gg) < Hy ? Hy : ke > A7 ? A7 : ke, l7 = _5 - 4 * s7 - q5, n7 = g * q5 / dA, ze = g * s7 / Cs, a7 = I * _5 / dA, $5 = ci - n7, o7 = ci + n7, Xy = $5 - (g * ((ft *= Gg) < 0 ? 0 : ft > l7 ? l7 : ft) / Cs + ze) - ze, gH = g - Xy, c7 = qC - a7, d7 = qC + a7;
i = "M ".concat(qC, ",").concat(Xy, " A ").concat(ze, ",").concat(ze, " 0 1,0 ").concat(qC, ",").concat(Xy + 2 * ze, " A ").concat(ze, ",").concat(ze, " 0 1,0 ").concat(qC, ",").concat(Xy, " z M ").concat(qC, ",").concat(gH, " A ").concat(ze, ",").concat(ze, " 0 1,1 ").concat(qC, ",").concat(gH - 2 * ze, " A ").concat(ze, ",").concat(ze, " 0 1,1 ").concat(qC, ",").concat(gH, " z M ").concat(c7, ",").concat($5, " L ").concat(d7, ",").concat($5, " L ").concat(d7, ",").concat(o7, " L ").concat(c7, ",").concat(o7, " z");
} else if (t === "mathEqual") {
CC === void 0 && (CC = 23520), ft === void 0 && (ft = 11760);
var r7 = 2.8933070866141732, h7 = (CC *= Gg) < 0 ? 0 : CC > r7 ? r7 : CC, b7 = Cs - 2 * h7, u7 = g * h7 / Cs, m7 = g * ((ft *= Gg) < 0 ? 0 : ft > b7 ? b7 : ft) / dA, Z7 = 5.7866141732283465 * I / dA, IH = ci - m7, CH = ci + m7, G7 = IH - u7, w7 = CH + u7, Sy = qC - Z7, Dy = qC + Z7;
i = "M ".concat(Sy, ",").concat(G7, " L ").concat(Dy, ",").concat(G7, " L ").concat(Dy, ",").concat(IH, " L ").concat(Sy, ",").concat(IH, " z M ").concat(Sy, ",").concat(CH, " L ").concat(Dy, ",").concat(CH, " L ").concat(Dy, ",").concat(w7, " L ").concat(Sy, ",").concat(w7, " z");
} else if (t === "mathMinus") {
CC === void 0 && (CC = 23520);
var p7 = g * ((CC *= Gg) < 0 ? 0 : CC > Cs ? Cs : CC) / dA, B7 = 5.7866141732283465 * I / dA, W7 = ci - p7, y7 = ci + p7, Y7 = qC - B7, N7 = qC + B7;
i = "M ".concat(Y7, ",").concat(W7, " L ").concat(N7, ",").concat(W7, " L ").concat(N7, ",").concat(y7, " L ").concat(Y7, ",").concat(y7, " z");
} else if (t === "mathMultiply") {
CC === void 0 && (CC = 23520), CC *= Gg;
var tH = 4.091732283464567, V7 = Math.min(I, g) * (CC < 0 ? 0 : CC > tH ? tH : CC) / Cs, iH = Math.atan(g / I), M7 = Math.sin(iH), R7 = Math.cos(iH), eH = Math.tan(iH), f7 = Math.sqrt(I * I + g * g), H7 = f7 - f7 * tH / Cs, X7 = R7 * H7 / 2, S7 = M7 * H7 / 2, D7 = M7 * V7 / 2, K7 = R7 * V7 / 2, Ky = X7 - D7, yu = S7 + K7, Fy = X7 + D7, ky = S7 - K7, F7 = (qC - Fy) * eH + ky, k7 = I - Fy, AH = I - Ky, hng = AH - (ci - yu) / eH, bng = Ky + (ci - yu) / eH, z7 = g - yu, J7 = g - ky, ung = g - F7;
i = "M ".concat(Ky, ",").concat(yu, " L ").concat(Fy, ",").concat(ky, " L ").concat(qC, ",").concat(F7, " L ").concat(k7, ",").concat(ky, " L ").concat(AH, ",").concat(yu, " L ").concat(hng, ",").concat(ci, " L ").concat(AH, ",").concat(z7, " L ").concat(k7, ",").concat(J7, " L ").concat(qC, ",").concat(ung, " L ").concat(Fy, ",").concat(J7, " L ").concat(Ky, ",").concat(z7, " L ").concat(bng, ",").concat(ci, " z");
} else if (t === "mathPlus") {
CC === void 0 && (CC = 23520), CC *= Gg;
var zy = 5.7866141732283465, mng = Math.min(I, g), L7 = I * zy / dA, v7 = g * zy / dA, Jy = mng * (CC < 0 ? 0 : CC > zy ? zy : CC) / dA, T7 = qC - L7, Ly = qC - Jy, vy = qC + Jy, x7 = qC + L7, j7 = ci - v7, Ty = ci - Jy, xy = ci + Jy, Q7 = ci + v7;
i = "M ".concat(T7, ",").concat(Ty, " L ").concat(Ly, ",").concat(Ty, " L ").concat(Ly, ",").concat(j7, " L ").concat(vy, ",").concat(j7, " L ").concat(vy, ",").concat(Ty, " L ").concat(x7, ",").concat(Ty, " L ").concat(x7, ",").concat(xy, " L ").concat(vy, ",").concat(xy, " L ").concat(vy, ",").concat(Q7, " L ").concat(Ly, ",").concat(Q7, " L ").concat(Ly, ",").concat(xy, " L ").concat(T7, ",").concat(xy, " z");
}
break;
case "can":
case "flowChartMagneticDisk":
case "flowChartMagneticDrum":
var O7 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd", "attrs", "fmla"]), Yu = 1.9685039370078738;
O7 && (Yu = parseInt(O7.substring(4)) * Gg), t !== "flowChartMagneticDisk" && t !== "flowChartMagneticDrum" || (Yu = 3.9370078740157477);
var U7 = Math.min(I, g), E7 = 3.9370078740157477 * g / U7, Yo = U7 * (Yu < 0 ? 0 : Yu > E7 ? E7 : Yu) / 15.74803149606299, P7 = g - Yo, sH = 180, hr = I / 2, lH = "".concat(Vg(hr, Yo, hr, Yo, 0, sH, !1), " ").concat(Vg(hr, Yo, hr, Yo, sH, 360, !1).replace("M", "L"), " L ").concat(I, ",").concat(P7, " ").concat(Vg(hr, P7, hr, Yo, 0, sH, !1).replace("M", "L"), " L 0,").concat(Yo);
t === "flowChartMagneticDrum" && (lH = lH.replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC) {
var OC = I / 2 - (parseFloat(QC) - g / 2), zi = g / 2 + (parseFloat(YC) - I / 2);
return "".concat(RI).concat(OC, " ").concat(zi);
}).replace(/([MLQC])\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)\s*([-\d.e]+)/gi, function(Mg, RI, YC, QC, OC, zi) {
var UC = I / 2 - (parseFloat(QC) - g / 2), Ct = g / 2 + (parseFloat(YC) - I / 2), Zt = I / 2 - (parseFloat(zi) - g / 2), Ht = g / 2 + (parseFloat(OC) - I / 2);
return "".concat(RI).concat(UC, " ").concat(Ct, " ").concat(Zt, " ").concat(Ht);
})), i = lH;
break;
case "swooshArrow":
var _7 = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), No = Gg, jy = 25e3 * No, Qy = 16667 * No;
if (_7) {
var q7, Oy = HI(_7);
try {
for (Oy.s(); !(q7 = Oy.n()).done; ) {
var nH = q7.value, $7 = U(nH, ["attrs", "name"]);
$7 === "adj1" ? jy = parseInt(U(nH, ["attrs", "fmla"]).substring(4)) * No : $7 === "adj2" && (Qy = parseInt(U(nH, ["attrs", "fmla"]).substring(4)) * No);
}
} catch (Mg) {
Oy.e(Mg);
} finally {
Oy.f();
}
}
var gP = 1 * No, IP = 75e3 * No, CP = 1e5 * No, aH = Math.min(I, g), oH = aH / 8, cH = g / 6, tP = 5.511811023622047 * I / aH, iP = g * (jy < gP ? gP : jy > IP ? IP : jy) / CP, dH = I - aH * (Qy < 0 ? 0 : Qy > tP ? tP : Qy) / CP, eP = oH, AP = Math.PI / 2 / 14, sP = oH * Math.tan(AP), Zng = dH - sP, rH = eP + iP, lP = dH + iP * Math.tan(AP), Gng = lP + sP, nP = rH + oH, wng = nP / 2 - g / 20, png = cH + cH, Bng = I / 6, Wng = rH + cH / 2, yng = I / 4;
i = "M 0,".concat(g, " Q ").concat(Bng, ",").concat(png, " ").concat(dH, ",").concat(eP, " L ").concat(Zng, ",0 L ").concat(I, ",").concat(wng, " L ").concat(Gng, ",").concat(nP, " L ").concat(lP, ",").concat(rH, " Q ").concat(yng, ",").concat(Wng, " 0,").concat(g, " z");
break;
case "circularArrow":
var aP = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), Uy = 0.9842519685039369, Ey = 19.03865 * Math.PI / 180, Py = 340.96135 * Math.PI / 180, _y = 180 * Math.PI / 180, qy = 0.9842519685039369;
if (aP) {
var oP, $y = HI(aP);
try {
for ($y.s(); !(oP = $y.n()).done; ) {
var br = oP.value, Nu = U(br, ["attrs", "name"]);
Nu === "adj1" ? Uy = parseInt(U(br, ["attrs", "fmla"]).substring(4)) * Gg : Nu === "adj2" ? Ey = parseInt(U(br, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Nu === "adj3" ? Py = parseInt(U(br, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Nu === "adj4" ? _y = parseInt(U(br, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Nu === "adj5" && (qy = parseInt(U(br, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
$y.e(Mg);
} finally {
$y.f();
}
}
var Vo = I / 2, Mo = g / 2, Yng = I / 2, Nng = g / 2, cP = Math.min(I, g), dP = 1.9685039370078738, rP = 7.874015748031495, hP = 1 / 6e4 * Math.PI / 180, gY = 21599999 / 6e4 * Math.PI / 180, Ro = 2 * Math.PI, bP = qy < 0 ? 0 : qy > dP ? dP : qy, uP = 2 * bP, ur = Py < hP ? hP : Py > gY ? gY : Py, hH = _y < 0 ? 0 : _y > gY ? gY : _y, bH = cP * (Uy < 0 ? 0 : Uy > uP ? uP : Uy) / rP, fo = cP * bP / rP, IY = bH / 2, mr = Yng + IY - fo, Zr = Nng + IY - fo, Ho = mr - bH, Xo = Zr - bH, CY = Ho + IY, tY = Xo + IY, mP = CY * Math.sin(ur), ZP = tY * Math.cos(ur), vn = CY * Math.cos(Math.atan2(mP, ZP)), Gr = tY * Math.sin(Math.atan2(mP, ZP)), GP = Vo + vn, wP = Mo + Gr, di = Math.min(Ho, Xo), Vng = 1 - (vn * vn - di * di) * (Gr * Gr - di * di) / (vn * vn * Gr * Gr), uH = (1 + Math.sqrt(Vng)) / ((vn * vn - di * di) / vn / Gr), mH = Math.atan2(uH, 1) > 0 ? Math.atan2(uH, 1) : Math.atan2(uH, 1) + Ro, ZH = mH - ur > 0 ? mH - ur : mH - ur + Ro, Mng = ZH - Math.PI > 0 ? ZH - Ro : ZH, pP = Math.abs(Mng), wr = ur + (Ey < 0 ? 0 : Ey > pP ? pP : Ey), BP = CY * Math.sin(wr), WP = tY * Math.cos(wr), Rng = Vo + CY * Math.cos(Math.atan2(BP, WP)), fng = Mo + tY * Math.sin(Math.atan2(BP, WP)), yP = GP + fo * Math.cos(wr), YP = wP + fo * Math.sin(wr), NP = GP - fo * Math.cos(wr), VP = wP - fo * Math.sin(wr), MP = NP - Vo, RP = VP - Mo, fP = yP - Vo, HP = YP - Mo, Tn = Math.min(mr, Zr), XP = MP * Tn / mr, SP = RP * Tn / Zr, iY = fP * Tn / mr, eY = HP * Tn / Zr, pr = iY - XP, So = eY - SP, ts = Math.sqrt(pr * pr + So * So), Br = XP * eY - iY * SP, AY = Math.sqrt(Math.max(0, Tn * Tn * ts * ts - Br * Br)), sY = -1 * So > 0 ? -1 : 1, DP = (Br * So + sY * pr * AY) / (ts * ts), KP = (Br * So - sY * pr * AY) / (ts * ts), FP = (-Br * pr + Math.abs(So) * AY) / (ts * ts), kP = (-Br * pr - Math.abs(So) * AY) / (ts * ts), zP = Math.sqrt(Math.pow(iY - KP, 2) + Math.pow(eY - kP, 2)) - Math.sqrt(Math.pow(iY - DP, 2) + Math.pow(eY - FP, 2)), GH = Vo + (zP > 0 ? DP : KP) * mr / Tn, wH = Mo + (zP > 0 ? FP : kP) * Zr / Tn, lY = MP * di / Ho, nY = RP * di / Xo, JP = fP * di / Ho, LP = HP * di / Xo, Wr = JP - lY, yr = LP - nY, is = Math.sqrt(Wr * Wr + yr * yr), Yr = lY * LP - JP * nY, aY = Math.sqrt(Math.max(0, di * di * is * is - Yr * Yr)), vP = (Yr * yr + sY * Wr * aY) / (is * is), TP = (Yr * yr - sY * Wr * aY) / (is * is), xP = (-Yr * Wr + Math.abs(yr) * aY) / (is * is), jP = (-Yr * Wr - Math.abs(yr) * aY) / (is * is), QP = Math.sqrt(Math.pow(lY - TP, 2) + Math.pow(nY - jP, 2)) - Math.sqrt(Math.pow(lY - vP, 2) + Math.pow(nY - xP, 2)), OP = QP > 0 ? vP : TP, UP = QP > 0 ? xP : jP, pH = Vo + OP * Ho / di, BH = Mo + UP * Xo / di, WH = Math.atan2(UP * Xo / di, OP * Ho / di), EP = WH > 0 ? WH : WH + Ro, yH = hH - EP, Hng = yH > 0 ? yH - Ro : yH, oY = Math.sqrt(Math.pow(GH - pH, 2) + Math.pow(wH - BH, 2)) / 2 - fo, Xng = oY > 0 ? GH : yP, Sng = oY > 0 ? wH : YP, Dng = oY > 0 ? pH : NP, Kng = oY > 0 ? BH : VP, YH = Math.atan2(wH - Mo, GH - Vo), NH = (YH > 0 ? YH : YH + Ro) - hH, Fng = NH > 0 ? NH : NH + Ro, PP = 180 * hH / Math.PI, kng = PP + 180 * Fng / Math.PI, _P = 180 * EP / Math.PI, zng = _P + 180 * Hng / Math.PI;
i = "".concat(Vg(I / 2, g / 2, mr, Zr, PP, kng, !1), " L ").concat(Xng, ",").concat(Sng, " L ").concat(Rng, ",").concat(fng, " L ").concat(Dng, ",").concat(Kng, " L ").concat(pH, ",").concat(BH, " ").concat(Vg(I / 2, g / 2, Ho, Xo, _P, zng, !1).replace("M", "L"), " z");
break;
case "leftCircularArrow":
var qP = U(C, ["p:spPr", "a:prstGeom", "a:avLst", "a:gd"]), cY = 0.9842519685039369, dY = -19.03865 * Math.PI / 180, rY = 19.03865 * Math.PI / 180, hY = 180 * Math.PI / 180, bY = 0.9842519685039369;
if (qP) {
var $P, uY = HI(qP);
try {
for (uY.s(); !($P = uY.n()).done; ) {
var Nr = $P.value, Vu = U(Nr, ["attrs", "name"]);
Vu === "adj1" ? cY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) * Gg : Vu === "adj2" ? dY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Vu === "adj3" ? rY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Vu === "adj4" ? hY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) / 6e4 * Math.PI / 180 : Vu === "adj5" && (bY = parseInt(U(Nr, ["attrs", "fmla"]).substring(4)) * Gg);
}
} catch (Mg) {
uY.e(Mg);
} finally {
uY.f();
}
}
var sl = I / 2, ll = g / 2, Jng = I / 2, Lng = g / 2, g6 = Math.min(I, g), I6 = 1.9685039370078738, C6 = 7.874015748031495, t6 = 1 / 6e4 * Math.PI / 180, mY = 21599999 / 6e4 * Math.PI / 180, Do = 2 * Math.PI, i6 = bY < 0 ? 0 : bY > I6 ? I6 : bY, e6 = 2 * i6, Vr = rY < t6 ? t6 : rY > mY ? mY : rY, xn = hY < 0 ? 0 : hY > mY ? mY : hY, VH = g6 * (cY < 0 ? 0 : cY > e6 ? e6 : cY) / C6, Ko = g6 * i6 / C6, ZY = VH / 2, Fo = Jng + ZY - Ko, ko = Lng + ZY - Ko, jn = Fo - VH, Qn = ko - VH, A6 = jn + ZY, s6 = Qn + ZY, On = A6 * Math.cos(Vr), Mr = s6 * Math.sin(Vr), l6 = sl + On, n6 = ll + Mr, ri = Math.min(jn, Qn), vng = 1 - (On * On - ri * ri) * (Mr * Mr - ri * ri) / (On * On * Mr * Mr), MH = (1 + Math.sqrt(vng)) / ((On * On - ri * ri) / On / Mr), RH = Math.atan2(MH, 1) > 0 ? Math.atan2(MH, 1) : Math.atan2(MH, 1) + Do, fH = RH - Vr > 0 ? RH - Vr : RH - Vr + Do, Tng = fH - Math.PI > 0 ? fH - Do : fH, a6 = -Math.abs(Tng), Rr = Vr + (dY < a6 ? a6 : dY > 0 ? 0 : dY), xng = sl + A6 * Math.cos(Rr), jng = ll + s6 * Math.sin(Rr), Qng = sl + Fo * Math.cos(xn), Ong = ll + ko * Math.sin(xn), Ung = sl + jn * Math.cos(xn), Eng = ll + Qn * Math.sin(xn), o6 = l6 + Ko * Math.cos(Rr), c6 = n6 + Ko * Math.sin(Rr), d6 = l6 - Ko * Math.cos(Rr), r6 = n6 - Ko * Math.sin(Rr), h6 = d6 - sl, b6 = r6 - ll, u6 = o6 - sl, m6 = c6 - ll, Un = Math.min(Fo, ko), Z6 = h6 * Un / Fo, G6 = b6 * Un / ko, GY = u6 * Un / Fo, wY = m6 * Un / ko, fr = GY - Z6, zo = wY - G6, es = Math.sqrt(fr * fr + zo * zo), Hr = Z6 * wY - GY * G6, pY = Math.sqrt(Math.max(0, Un * Un * es * es - Hr * Hr)), BY = -1 * zo > 0 ? -1 : 1, w6 = (Hr * zo + BY * fr * pY) / (es * es), p6 = (Hr * zo - BY * fr * pY) / (es * es), B6 = (-Hr * fr + Math.abs(zo) * pY) / (es * es), W6 = (-Hr * fr - Math.abs(zo) * pY) / (es * es), y6 = Math.sqrt(Math.pow(GY - p6, 2) + Math.pow(wY - W6, 2)) - Math.sqrt(Math.pow(GY - w6, 2) + Math.pow(wY - B6, 2)), WY = sl + (y6 > 0 ? w6 : p6) * Fo / Un, yY = ll + (y6 > 0 ? B6 : W6) * ko / Un, YY = h6 * ri / jn, NY = b6 * ri / Qn, Y6 = u6 * ri / jn, N6 = m6 * ri / Qn, Xr = Y6 - YY, Sr = N6 - NY, As = Math.sqrt(Xr * Xr + Sr * Sr), Dr = YY * N6 - Y6 * NY, VY = Math.sqrt(Math.max(0, ri * ri * As * As - Dr * Dr)), V6 = (Dr * Sr + BY * Xr * VY) / (As * As), M6 = (Dr * Sr - BY * Xr * VY) / (As * As), R6 = (-Dr * Xr + Math.abs(Sr) * VY) / (As * As), f6 = (-Dr * Xr - Math.abs(Sr) * VY) / (As * As), H6 = Math.sqrt(Math.pow(YY - M6, 2) + Math.pow(NY - f6, 2)) - Math.sqrt(Math.pow(YY - V6, 2) + Math.pow(NY - R6, 2)), X6 = H6 > 0 ? V6 : M6, S6 = H6 > 0 ? R6 : f6, D6 = sl + X6 * jn / ri, K6 = ll + S6 * Qn / ri, HH = Math.atan2(S6 * Qn / ri, X6 * jn / ri), F6 = HH > 0 ? HH : HH + Do, XH = xn - F6, k6 = XH > 0 ? XH : XH + Do, Png = F6 + k6, _ng = -k6, MY = Math.sqrt(Math.pow(WY - D6, 2) + Math.pow(yY - K6, 2)) / 2 - Ko, qng = MY > 0 ? WY : o6, $ng = MY > 0 ? yY : c6, gag = MY > 0 ? D6 : d6, Iag = MY > 0 ? K6 : r6, SH = Math.atan2(yY - ll, WY - sl), DH = (SH > 0 ? SH : SH + Do) - xn, Cag = 180 * (xn + (DH > 0 ? DH - Do : DH)) / Math.PI, tag = 180 * xn / Math.PI, z6 = 180 * Png / Math.PI, iag = z6 + 180 * _ng / Math.PI;
i = "M ".concat(Qng, ",").concat(Ong, " L ").concat(Ung, ",").concat(Eng, " ").concat(Vg(I / 2, g / 2, jn, Qn, z6, iag, !1).replace("M", "L"), " L ").concat(gag, ",").concat(Iag, " L ").concat(xng, ",").concat(jng, " L ").concat(qng, ",").concat($ng, " L ").concat(WY, ",").concat(yY, " ").concat(Vg(I / 2, g / 2, Fo, ko, Cag, tag, !1).replace("M", "L"), " z");
}
return i;
}
function FX(t, I) {
if (!t || !I) return null;
var g = U(t, [I, "p:transition"]);
return g || ((g = U(t, [I, "mc:AlternateContent", "mc:Choice", "p:transition"])) ? g : g = U(t, [I, "mc:AlternateContent", "mc:Fallback", "p:transition"]));
}
function Mbg(t) {
if (!t) return null;
var I = { type: "none", duration: 1e3, direction: null }, g = t.attrs || {}, C = !1, i = /^p\d{2}:dur$/;
for (var e in g) if (i.test(e) && !isNaN(parseInt(g[e], 10))) {
I.duration = parseInt(g[e], 10), C = !0;
break;
}
if (!C && g.spd) switch (g.spd) {
case "slow":
default:
I.duration = 1e3;
break;
case "med":
I.duration = 800;
break;
case "fast":
I.duration = 500;
}
g.advClick === "0" && g.advTm && (I.autoNextAfter = parseInt(g.advTm, 10));
var A = /^(p|p\d{2}):/;
for (var s in t) if (s !== "attrs" && A.test(s)) {
var l = t[s];
if (I.type = s.substring(s.indexOf(":") + 1), l && l.attrs) {
var n = l.attrs;
n.dur && !isNaN(parseInt(n.dur, 10)) && (C || (I.duration = parseInt(n.dur, 10))), n.dir && (I.direction = n.dir);
}
break;
}
return I;
}
function Yq(t, I) {
var g = Object.keys(t);
if (Object.getOwnPropertySymbols) {
var C = Object.getOwnPropertySymbols(t);
I && (C = C.filter(function(i) {
return Object.getOwnPropertyDescriptor(t, i).enumerable;
})), g.push.apply(g, C);
}
return g;
}
function ti(t) {
for (var I = 1; I < arguments.length; I++) {
var g = arguments[I] != null ? arguments[I] : {};
I % 2 ? Yq(Object(g), !0).forEach(function(C) {
f9(t, C, g[C]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(g)) : Yq(Object(g)).forEach(function(C) {
Object.defineProperty(t, C, Object.getOwnPropertyDescriptor(g, C));
});
}
return t;
}
function wC(t, I) {
var g = typeof Symbol < "u" && t[Symbol.iterator] || t["@@iterator"];
if (!g) {
if (Array.isArray(t) || (g = function(l, n) {
if (l) {
if (typeof l == "string") return Nq(l, n);
var a = Object.prototype.toString.call(l).slice(8, -1);
if (a === "Object" && l.constructor && (a = l.constructor.name), a === "Map" || a === "Set") return Array.from(l);
if (a === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)) return Nq(l, n);
}
}(t)) || I) {
g && (t = g);
var C = 0, i = function() {
};
return { s: i, n: function() {
return C >= t.length ? { done: !0 } : { done: !1, value: t[C++] };
}, e: function(l) {
throw l;
}, f: i };
}
throw new TypeError(`Invalid attempt to iterate non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`);
}
var e, A = !0, s = !1;
return { s: function() {
g = g.call(t);
}, n: function() {
var l = g.next();
return A = l.done, l;
}, e: function(l) {
s = !0, e = l;
}, f: function() {
try {
A || g.return == null || g.return();
} finally {
if (s) throw e;
}
} };
}
function Nq(t, I) {
(I == null || I > t.length) && (I = t.length);
for (var g = 0, C = new Array(I); g < I; g++) C[g] = t[g];
return C;
}
function Ptg(t) {
var I = U(t, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(t, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(t, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]);
if (!I) return null;
var g = U(I, ["attrs", "type"]);
return g ? String(g) : null;
}
function _tg(t) {
return t === "dt" || t === "sldNum" || t === "ftr" || t === "hdr";
}
function Rbg(t) {
return U(t, ["p:nvSpPr", "p:cNvPr", "attrs", "name"]) || U(t, ["p:nvPicPr", "p:cNvPr", "attrs", "name"]) || U(t, ["p:nvGraphicFramePr", "p:cNvPr", "attrs", "name"]) || "";
}
function qtg(t) {
if (!t) return !1;
var I = String(t);
return /(^|\b)(Footer Text|Header Text|Slide Number|Date)(\b|$)/i.test(I) || /页脚|页眉|页码|日期/.test(I);
}
function $tg(t) {
return String(t || "").replace(/<[^>]+>/g, "").replace(/ /g, " ").trim();
}
function fbg(t) {
var I = String(t || "").replace(/\s+/g, " ").trim();
if (!I) return !1;
var g = I.toLowerCase();
return g === "click to add title" || g === "click to add text" || g === "click to add subtitle" || g === "click to add notes" || /edit\s+master/.test(g) || /edit\s+the\s+master/.test(g) || /edit\s+master\s+(title|text)/.test(g) || I === "此处添加标题" || I === "单击以添加标题" || I === "单击此处添加标题" || I === "此处添加文本" || I === "单击以添加文本" || I === "单击此处添加文本" || I === "单击以添加副标题" || I === "单击此处添加副标题" || I.includes("编辑母版");
}
function Hbg(t, I) {
if (!t || t.type !== "text" || !Number.isFinite(I) || I <= 0 || !Number.isFinite(t.top) || !Number.isFinite(t.height)) return !1;
var g = $tg(t.content);
if (!g) return !1;
var C = t.top > 0.78 * I, i = t.height < 0.2 * I;
if (!C || !i) return !1;
var e = /^[0-9]{1,3}$/.test(g), A = /^(\d{4}[\-/]\d{1,2}[\-/]\d{1,2})$/.test(g) || /(年\d{1,2}月\d{1,2}日)$/.test(g), s = /页码|日期/.test(g);
return e || A || s;
}
function fD(t, I) {
var g, C = [], i = wC(t || []);
try {
for (i.s(); !(g = i.n()).done; ) {
var e = g.value;
if (e && !qtg(e.name) && !(Hbg(e, I) || e.type === "text" && fbg($tg(e.content)))) if (Array.isArray(e.elements)) {
var A = fD(e.elements, I);
if (!A.length) continue;
C.push(ti(ti({}, e), {}, { elements: A }));
} else C.push(e);
}
} catch (s) {
i.e(s);
} finally {
i.f();
}
return C;
}
function HD(t) {
if (!Array.isArray(t)) return t;
for (var I = 0; I < t.length; I++) {
var g = t[I];
g && _a(g) === "object" && (g.order = I, Array.isArray(g.elements) && HD(g.elements));
}
return t;
}
function Xbg(t, I) {
var g = fD(t.elements, I), C = fD(t.layoutElements, I);
return HD(g), HD(C), ti(ti({}, t), {}, { elements: g, layoutElements: C });
}
function Ul(t, I, g) {
t && Array.isArray(t.trace) && (g === void 0 ? t.trace.push({ step: I }) : t.trace.push({ step: I, data: g }));
}
function Sbg(t) {
return XD.apply(this, arguments);
}
function XD() {
return XD = SC(bI.mark(function t(I) {
var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p = arguments;
return bI.wrap(function(Y) {
for (; ; ) switch (Y.prev = Y.next) {
case 0:
return g = p.length > 1 && p[1] !== void 0 ? p[1] : {}, C = [], Y.next = 4, x0g.loadAsync(I);
case 4:
return i = Y.sent, Y.next = 7, Dbg(i);
case 7:
return e = Y.sent, Y.next = 10, Kbg(i);
case 10:
return A = Y.sent, s = A.width, l = A.height, n = A.defaultTextStyle, a = A.headerFooter, Y.next = 17, Fbg(i);
case 17:
return d = Y.sent, o = d.themeContent, c = d.themeColors, Y.next = 22, kbg(i);
case 22:
r = Y.sent, h = r.length ? r : e.slides, b = 0;
case 25:
if (!(b < h.length)) {
Y.next = 35;
break;
}
return u = h[b], m = b + 1, Y.next = 30, zbg(i, u, o, n, a, m, g);
case 30:
Z = Y.sent, C.push(Xbg(Z, l));
case 32:
b++, Y.next = 25;
break;
case 35:
return Y.abrupt("return", { slides: C, themeColors: c, size: { width: s, height: l } });
case 36:
case "end":
return Y.stop();
}
}, t);
})), XD.apply(this, arguments);
}
function Dbg(t) {
return gig.apply(this, arguments);
}
function gig() {
return (gig = SC(bI.mark(function t(I) {
var g, C, i, e, A, s, l, n;
return bI.wrap(function(a) {
for (; ; ) switch (a.prev = a.next) {
case 0:
return a.next = 2, yt(I, "[Content_Types].xml");
case 2:
g = a.sent, C = g.Types.Override, i = [], e = [], A = wC(C), a.prev = 7, A.s();
case 9:
if ((s = A.n()).done) {
a.next = 20;
break;
}
l = s.value, a.t0 = l.attrs.ContentType, a.next = a.t0 === "application/vnd.openxmlformats-officedocument.presentationml.slide+xml" ? 14 : a.t0 === "application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml" ? 16 : 18;
break;
case 14:
return i.push(l.attrs.PartName.substr(1)), a.abrupt("break", 18);
case 16:
return e.push(l.attrs.PartName.substr(1)), a.abrupt("break", 18);
case 18:
a.next = 9;
break;
case 20:
a.next = 25;
break;
case 22:
a.prev = 22, a.t1 = a.catch(7), A.e(a.t1);
case 25:
return a.prev = 25, A.f(), a.finish(25);
case 28:
return n = function(d, o) {
return +/(\d+)\.xml/.exec(d)[1] - +/(\d+)\.xml/.exec(o)[1];
}, i = i.sort(n), e = e.sort(n), a.abrupt("return", { slides: i, slideLayouts: e });
case 32:
case "end":
return a.stop();
}
}, t, null, [[7, 22, 25, 28]]);
}))).apply(this, arguments);
}
function Kbg(t) {
return SD.apply(this, arguments);
}
function SD() {
return SD = SC(bI.mark(function t(I) {
var g, C, i, e, A, s, l;
return bI.wrap(function(n) {
for (; ; ) switch (n.prev = n.next) {
case 0:
return n.next = 2, yt(I, "ppt/presentation.xml");
case 2:
return g = n.sent, C = g["p:presentation"]["p:sldSz"].attrs, i = g["p:presentation"]["p:defaultTextStyle"], e = function(a) {
if (a != null) {
var d = String(a).toLowerCase();
return d === "1" || d === "true" || d === "on";
}
}, A = function(a) {
return a === void 0 || a;
}, s = U(g, ["p:presentation", "p:hf", "attrs"]), l = { dt: A(e(U(s, ["dt"]))), ftr: A(e(U(s, ["ftr"]))), hdr: A(e(U(s, ["hdr"]))), sldNum: A(e(U(s, ["sldNum"]))) }, n.abrupt("return", { width: parseInt(C.cx) * Gg, height: parseInt(C.cy) * Gg, defaultTextStyle: i, headerFooter: l });
case 10:
case "end":
return n.stop();
}
}, t);
})), SD.apply(this, arguments);
}
function Fbg(t) {
return DD.apply(this, arguments);
}
function DD() {
return DD = SC(bI.mark(function t(I) {
var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m;
return bI.wrap(function(Z) {
for (; ; ) switch (Z.prev = Z.next) {
case 0:
return Z.next = 2, yt(I, "ppt/_rels/presentation.xml.rels");
case 2:
if (g = Z.sent, (C = g.Relationships.Relationship).constructor !== Array) {
Z.next = 25;
break;
}
e = wC(C), Z.prev = 6, e.s();
case 8:
if ((A = e.n()).done) {
Z.next = 15;
break;
}
if ((s = A.value).attrs.Type !== "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme") {
Z.next = 13;
break;
}
return i = s.attrs.Target, Z.abrupt("break", 15);
case 13:
Z.next = 8;
break;
case 15:
Z.next = 20;
break;
case 17:
Z.prev = 17, Z.t0 = Z.catch(6), e.e(Z.t0);
case 20:
return Z.prev = 20, e.f(), Z.finish(20);
case 23:
Z.next = 26;
break;
case 25:
C.attrs.Type === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" && (i = C.attrs.Target);
case 26:
return Z.next = 28, yt(I, "ppt/" + i);
case 28:
if (l = Z.sent, n = [], !(a = U(l, ["a:theme", "a:themeElements", "a:clrScheme"]))) {
Z.next = 46;
break;
}
d = Object.keys(a), o = 0, c = d;
case 34:
if (!(o < c.length)) {
Z.next = 46;
break;
}
if ((r = c[o]).startsWith("a:")) {
Z.next = 38;
break;
}
return Z.abrupt("continue", 43);
case 38:
h = a[r], b = U(h, ["a:srgbClr", "attrs", "val"]), u = U(h, ["a:sysClr", "attrs", "lastClr"]), (m = b || u) && n.push("#" + m);
case 43:
o++, Z.next = 34;
break;
case 46:
return Z.abrupt("return", { themeContent: l, themeColors: n });
case 47:
case "end":
return Z.stop();
}
}, t, null, [[6, 17, 20, 23]]);
})), DD.apply(this, arguments);
}
function kbg(t) {
return KD.apply(this, arguments);
}
function KD() {
return KD = SC(bI.mark(function t(I) {
var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z;
return bI.wrap(function(p) {
for (; ; ) switch (p.prev = p.next) {
case 0:
return p.next = 2, yt(I, "ppt/presentation.xml");
case 2:
return g = p.sent, p.next = 5, yt(I, "ppt/_rels/presentation.xml.rels");
case 5:
if (C = p.sent, g && C) {
p.next = 8;
break;
}
return p.abrupt("return", []);
case 8:
i = U(g, ["p:presentation", "p:sldIdLst", "p:sldId"]), e = Array.isArray(i) ? i : i ? [i] : [], A = U(C, ["Relationships", "Relationship"]), s = Array.isArray(A) ? A : A ? [A] : [], l = /* @__PURE__ */ new Map(), n = wC(s), p.prev = 14, n.s();
case 16:
if ((a = n.n()).done) {
p.next = 28;
break;
}
if (d = a.value, U(d, ["attrs", "Type"]) === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide") {
p.next = 21;
break;
}
return p.abrupt("continue", 26);
case 21:
if (o = U(d, ["attrs", "Id"]), c = U(d, ["attrs", "Target"]), o && c) {
p.next = 25;
break;
}
return p.abrupt("continue", 26);
case 25:
l.set(String(o), String(c));
case 26:
p.next = 16;
break;
case 28:
p.next = 33;
break;
case 30:
p.prev = 30, p.t0 = p.catch(14), n.e(p.t0);
case 33:
return p.prev = 33, n.f(), p.finish(33);
case 36:
r = [], h = wC(e), p.prev = 38, h.s();
case 40:
if ((b = h.n()).done) {
p.next = 51;
break;
}
if (u = b.value, m = U(u, ["attrs", "r:id"])) {
p.next = 45;
break;
}
return p.abrupt("continue", 49);
case 45:
if (Z = l.get(String(m))) {
p.next = 48;
break;
}
return p.abrupt("continue", 49);
case 48:
Z.startsWith("ppt/") ? r.push(Z) : Z.startsWith("../") ? r.push(Z.replace("../", "ppt/")) : r.push("ppt/" + Z.replace(/^\//, ""));
case 49:
p.next = 40;
break;
case 51:
p.next = 56;
break;
case 53:
p.prev = 53, p.t1 = p.catch(38), h.e(p.t1);
case 56:
return p.prev = 56, h.f(), p.finish(56);
case 59:
return p.abrupt("return", r);
case 60:
case "end":
return p.stop();
}
}, t, null, [[14, 30, 33, 36], [38, 53, 56, 59]]);
})), KD.apply(this, arguments);
}
function zbg(t, I, g, C, i, e) {
return FD.apply(this, arguments);
}
function FD() {
return FD = SC(bI.mark(function t(I, g, C, i, e, A) {
var s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg, dg, Bg, Zg, Xg, Kg, kg, Wg, Ng, wg, fg, Jg, zg, cI, YI, Eg, aI, dI, _g, xI, SI, eI, NI, EI, oI, LI = arguments;
return bI.wrap(function(pg) {
for (; ; ) switch (pg.prev = pg.next) {
case 0:
return s = LI.length > 6 && LI[6] !== void 0 ? LI[6] : {}, l = g.replace("slides/slide", "slides/_rels/slide") + ".rels", pg.next = 4, yt(I, l);
case 4:
n = pg.sent, (a = n.Relationships.Relationship).constructor !== Array && (a = [a]), d = "", o = "", c = "", r = "", h = [], b = {}, u = {}, m = {}, Z = {}, p = {}, Y = wC(a), pg.prev = 18, Y.s();
case 20:
if ((R = Y.n()).done) {
pg.next = 37;
break;
}
X = R.value, pg.t0 = X.attrs.Type, pg.next = pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" ? 25 : pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide" ? 28 : pg.t0 === "http://schemas.microsoft.com/office/2007/relationships/diagramDrawing" ? 31 : (pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" || pg.t0 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart" || pg.t0, 34);
break;
case 25:
return o = X.attrs.Target.replace("../", "ppt/"), b[X.attrs.Id] = { type: X.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: X.attrs.Target.replace("../", "ppt/") }, pg.abrupt("break", 35);
case 28:
return d = X.attrs.Target.replace("../", "ppt/"), b[X.attrs.Id] = { type: X.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: X.attrs.Target.replace("../", "ppt/") }, pg.abrupt("break", 35);
case 31:
return h.push(X.attrs.Target.replace("../", "ppt/")), b[X.attrs.Id] = { type: "diagramDrawing", target: X.attrs.Target.replace("../", "ppt/") }, pg.abrupt("break", 35);
case 34:
b[X.attrs.Id] = { type: X.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: X.attrs.Target.replace("../", "ppt/") };
case 35:
pg.next = 20;
break;
case 37:
pg.next = 42;
break;
case 39:
pg.prev = 39, pg.t1 = pg.catch(18), Y.e(pg.t1);
case 42:
return pg.prev = 42, Y.f(), pg.finish(42);
case 45:
return H = s && s.trace ? [] : null, (S = !!H) && H.push({ step: "slide/rels", data: { slideNo: A, sldFileName: g, slideRels: l, noteFilename: d, layoutFilename: o } }), pg.next = 50, yt(I, d);
case 50:
return z = pg.sent, v = Jbg(z), pg.next = 54, yt(I, o);
case 54:
return K = pg.sent, pg.next = 57, Vq(K);
case 57:
return V = pg.sent, N = o.replace("slideLayouts/slideLayout", "slideLayouts/_rels/slideLayout") + ".rels", pg.next = 61, yt(I, N);
case 61:
B = pg.sent, (a = B.Relationships.Relationship).constructor !== Array && (a = [a]), G = wC(a), pg.prev = 65, G.s();
case 67:
if ((w = G.n()).done) {
pg.next = 77;
break;
}
W = w.value, pg.t2 = W.attrs.Type, pg.next = pg.t2 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" ? 72 : 74;
break;
case 72:
return c = W.attrs.Target.replace("../", "ppt/"), pg.abrupt("break", 75);
case 74:
u[W.attrs.Id] = { type: W.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: W.attrs.Target.replace("../", "ppt/") };
case 75:
pg.next = 67;
break;
case 77:
pg.next = 82;
break;
case 79:
pg.prev = 79, pg.t3 = pg.catch(65), G.e(pg.t3);
case 82:
return pg.prev = 82, G.f(), pg.finish(82);
case 85:
return S && H.push({ step: "slideLayout/rels", data: { slideLayout: o, slideLayoutRels: N, slideMaster: c } }), pg.next = 88, yt(I, c);
case 88:
return y = pg.sent, f = U(y, ["p:sldMaster", "p:txStyles"]), D = Vq(y), F = c.replace("slideMasters/slideMaster", "slideMasters/_rels/slideMaster") + ".rels", pg.next = 94, yt(I, F);
case 94:
T = pg.sent, (a = T.Relationships.Relationship).constructor !== Array && (a = [a]), Q = wC(a), pg.prev = 98, Q.s();
case 100:
if ((P = Q.n()).done) {
pg.next = 110;
break;
}
L = P.value, pg.t4 = L.attrs.Type, pg.next = pg.t4 === "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" ? 105 : 107;
break;
case 105:
return r = L.attrs.Target.replace("../", "ppt/"), pg.abrupt("break", 108);
case 107:
m[L.attrs.Id] = { type: L.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: L.attrs.Target.replace("../", "ppt/") };
case 108:
pg.next = 100;
break;
case 110:
pg.next = 115;
break;
case 112:
pg.prev = 112, pg.t5 = pg.catch(98), Q.e(pg.t5);
case 115:
return pg.prev = 115, Q.f(), pg.finish(115);
case 118:
if (S && H.push({ step: "slideMaster/rels", data: { slideMaster: c, slideMasterRels: F, themeFilename: r } }), E = C, !r) {
pg.next = 131;
break;
}
return pg.next = 123, yt(I, r);
case 123:
return (J = pg.sent) && (E = J), k = r.split("/").pop(), j = r.replace(k, "_rels/" + k) + ".rels", pg.next = 129, yt(I, j);
case 129:
if ((q = pg.sent) && (a = q.Relationships.Relationship)) {
a.constructor !== Array && (a = [a]), Cg = wC(a);
try {
for (Cg.s(); !(Ig = Cg.n()).done; ) x = Ig.value, Z[x.attrs.Id] = { type: x.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: x.attrs.Target.replace("../", "ppt/") };
} catch (uI) {
Cg.e(uI);
} finally {
Cg.f();
}
}
case 131:
if (Ag = {}, eg = {}, !h.length) {
pg.next = 162;
break;
}
O = wC(h), pg.prev = 135, O.s();
case 137:
if ((_ = O.n()).done) {
pg.next = 154;
break;
}
return gg = _.value, lg = gg.split("/").pop(), ng = gg.replace(lg, "_rels/" + lg) + ".rels", pg.next = 143, yt(I, gg);
case 143:
return (sg = pg.sent) && (og = JSON.stringify(sg).replace(/dsp:/g, "p:"), sg = JSON.parse(og)), Ag[gg] = sg, cg = {}, pg.next = 149, yt(I, ng);
case 149:
if (rg = pg.sent) {
(a = rg.Relationships.Relationship).constructor !== Array && (a = [a]), dg = wC(a);
try {
for (dg.s(); !(Bg = dg.n()).done; ) Zg = Bg.value, cg[Zg.attrs.Id] = { type: Zg.attrs.Type.replace("http://schemas.openxmlformats.org/officeDocument/2006/relationships/", ""), target: Zg.attrs.Target.replace("../", "ppt/") };
} catch (uI) {
dg.e(uI);
} finally {
dg.f();
}
}
eg[gg] = cg;
case 152:
pg.next = 137;
break;
case 154:
pg.next = 159;
break;
case 156:
pg.prev = 156, pg.t6 = pg.catch(135), O.e(pg.t6);
case 159:
return pg.prev = 159, O.f(), pg.finish(159);
case 162:
if (Xg = h.length ? Ag[h[0]] : null, h.length && (Kg = h[0], kg = eg[Kg])) for (Wg in kg) p[Wg] = kg[Wg];
return pg.next = 166, yt(I, "ppt/tableStyles.xml");
case 166:
return Ng = pg.sent, pg.next = 169, yt(I, g);
case 169:
return wg = pg.sent, fg = wg["p:sld"]["p:cSld"]["p:spTree"], Jg = U(wg, ["p:sld", "attrs"]), zg = U(Jg, ["showPh"]), cI = { zip: I, slideLayoutContent: K, slideLayoutTables: V, slideMasterContent: y, slideMasterTables: D, slideContent: wg, tableStyles: Ng, slideResObj: b, slideMasterTextStyles: f, layoutResObj: u, masterResObj: m, themeContent: E, themeResObj: Z, digramFileContent: Xg, diagramResObj: p, diagramDrawingTargets: h, diagramDrawingContents: Ag, diagramResObjByTarget: eg, diagramDrawingCursor: 0, defaultTextStyle: i, headerFooter: e, slideNo: A, trace: H }, pg.next = 176, Lbg(cI);
case 176:
return YI = pg.sent, pg.next = 179, abg(cI);
case 179:
Eg = pg.sent, aI = [], pg.t7 = bI.keys(fg);
case 182:
if ((pg.t8 = pg.t7()).done) {
pg.next = 213;
break;
}
dI = pg.t8.value, fg[dI].constructor !== Array && (fg[dI] = [fg[dI]]), _g = wC(fg[dI]), pg.prev = 186, _g.s();
case 188:
if ((xI = _g.n()).done) {
pg.next = 203;
break;
}
if (SI = xI.value, zg !== "0") {
pg.next = 194;
break;
}
if (!(U(SI, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(SI, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(SI, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]))) {
pg.next = 194;
break;
}
return pg.abrupt("continue", 201);
case 194:
if (!_tg(Ptg(SI))) {
pg.next = 197;
break;
}
return pg.abrupt("continue", 201);
case 197:
return pg.next = 199, ql(dI, SI, fg, cI, "slide");
case 199:
(eI = pg.sent) && aI.push(eI);
case 201:
pg.next = 188;
break;
case 203:
pg.next = 208;
break;
case 205:
pg.prev = 205, pg.t9 = pg.catch(186), _g.e(pg.t9);
case 208:
return pg.prev = 208, _g.f(), pg.finish(208);
case 211:
pg.next = 182;
break;
case 213:
return N0(aI), N0(YI), (NI = FX(wg, "p:sld")) || (NI = FX(K, "p:sldLayout")), NI || (NI = FX(y, "p:sldMaster")), EI = Mbg(NI), oI = { fill: Eg, elements: aI, layoutElements: YI, note: v, transition: EI }, S && H.length && (oI.trace = H), pg.abrupt("return", oI);
case 222:
case "end":
return pg.stop();
}
}, t, null, [[18, 39, 42, 45], [65, 79, 82, 85], [98, 112, 115, 118], [135, 156, 159, 162], [186, 205, 208, 211]]);
})), FD.apply(this, arguments);
}
function Jbg(t) {
var I = "", g = U(t, ["p:notes", "p:cSld", "p:spTree", "p:sp"]);
if (!g) return "";
g.constructor !== Array && (g = [g]);
var C, i = wC(g);
try {
for (i.s(); !(C = i.n()).done; ) {
var e = U(C.value, ["p:txBody", "a:p", "a:r"]);
if (e) {
e.constructor !== Array && (e = [e]);
var A, s = wC(e);
try {
for (s.s(); !(A = s.n()).done; ) {
var l = U(A.value, ["a:t"]);
l && typeof l == "string" && (I += l);
}
} catch (n) {
s.e(n);
} finally {
s.f();
}
}
}
} catch (n) {
i.e(n);
} finally {
i.f();
}
return I;
}
function Lbg(t) {
return kD.apply(this, arguments);
}
function kD() {
return kD = SC(bI.mark(function t(I) {
var g, C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og, cg, rg;
return bI.wrap(function(dg) {
for (; ; ) switch (dg.prev = dg.next) {
case 0:
if (g = [], C = I.slideLayoutContent, i = I.slideMasterContent, e = I.slideContent, A = U(C, ["p:sldLayout", "p:cSld", "p:spTree"]), s = U(i, ["p:sldMaster", "p:cSld", "p:spTree"]), l = /* @__PURE__ */ new Set(), n = U(e, ["p:sld", "p:cSld", "p:spTree"]), a = U(e, ["p:sld", "attrs"]), d = U(a, ["showMasterSp"]), o = U(a, ["showMasterPh"]), c = U(a, ["showPh"]), Ul(I, "layout/start", { slideNo: I && I.slideNo, slideShowPh: c, slideShowMasterSp: d, slideShowMasterPh: o }), r = function(Bg, Zg) {
var Xg = Bg || "", Kg = Zg || "";
(Xg || Kg) && (l.add("".concat(Xg, "|").concat(Kg)), Xg && l.add("".concat(Xg, "|")), Kg && l.add("|".concat(Kg)));
}, h = function(Bg) {
var Zg = U(Bg, ["p:txBody"]);
if (!Zg) return !1;
var Xg, Kg = U(Zg, ["a:p"]), kg = wC(Array.isArray(Kg) ? Kg : Kg ? [Kg] : []);
try {
for (kg.s(); !(Xg = kg.n()).done; ) {
var Wg, Ng = Xg.value, wg = U(Ng, ["a:r"]), fg = wC(Array.isArray(wg) ? wg : wg ? [wg] : []);
try {
for (fg.s(); !(Wg = fg.n()).done; ) {
var Jg = U(Wg.value, ["a:t"]);
if (typeof Jg == "string" && Jg.trim() !== "") return !0;
}
} catch (aI) {
fg.e(aI);
} finally {
fg.f();
}
var zg, cI = U(Ng, ["a:fld"]), YI = wC(Array.isArray(cI) ? cI : cI ? [cI] : []);
try {
for (YI.s(); !(zg = YI.n()).done; ) {
var Eg = U(zg.value, ["a:t"]);
if (typeof Eg == "string" && Eg.trim() !== "") return !0;
}
} catch (aI) {
YI.e(aI);
} finally {
YI.f();
}
}
} catch (aI) {
kg.e(aI);
} finally {
kg.f();
}
return !1;
}, b = function(Bg, Zg) {
if (!Zg || !Zg.type) return !1;
var Xg = String(Zg.type);
if (!(/* @__PURE__ */ new Set(["ftr"])).has(Xg)) return !1;
var Kg = U(I, ["slideContent", "p:sld", "p:hdrFtr", "attrs"]), kg = U(Kg, [Xg]), Wg = kg !== void 0 ? function(wg) {
if (wg == null) return !1;
var fg = String(wg).toLowerCase();
return fg === "1" || fg === "true" || fg === "on";
}(kg) : void 0, Ng = I && I.headerFooter && I.headerFooter[Xg] !== void 0 ? !!I.headerFooter[Xg] : void 0;
return !!(Wg !== void 0 ? Wg : Ng === void 0 || Ng) && Xg === "ftr" && h(Bg);
}, u = function(Bg) {
return !!(U(Bg, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]));
}, m = function(Bg) {
var Zg = U(Bg, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(Bg, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]);
if (!Zg) return null;
var Xg = U(Zg, ["attrs", "type"]), Kg = U(Zg, ["attrs", "idx"]);
return Xg || Kg ? { type: Xg, idx: Kg } : null;
}, Z = function Bg(Zg, Xg) {
if (Xg) {
var Kg = m(Xg);
if (Kg && r(Kg.type, Kg.idx), Zg !== "p:grpSp") {
if (Zg === "mc:AlternateContent") {
var kg = U(Xg, ["mc:Fallback"]), Wg = kg && (kg["p:grpSp"] || kg);
if (Wg) if (Wg["p:grpSpPr"]) Bg("p:grpSp", Wg);
else for (var Ng in Wg) {
var wg = Wg[Ng];
if (Array.isArray(wg)) {
var fg, Jg = wC(wg);
try {
for (Jg.s(); !(fg = Jg.n()).done; )
Bg(Ng, fg.value);
} catch (aI) {
Jg.e(aI);
} finally {
Jg.f();
}
} else Bg(Ng, wg);
}
}
} else for (var zg in Xg) if (zg !== "p:nvGrpSpPr" && zg !== "p:grpSpPr") {
var cI = Xg[zg];
if (Array.isArray(cI)) {
var YI, Eg = wC(cI);
try {
for (Eg.s(); !(YI = Eg.n()).done; )
Bg(zg, YI.value);
} catch (aI) {
Eg.e(aI);
} finally {
Eg.f();
}
} else Bg(zg, cI);
}
}
}, p = function(Bg) {
if (Bg) for (var Zg in Bg) {
var Xg = Bg[Zg];
if (Array.isArray(Xg)) {
var Kg, kg = wC(Xg);
try {
for (kg.s(); !(Kg = kg.n()).done; ) {
var Wg = Kg.value;
Z(Zg, Wg);
}
} catch (Ng) {
kg.e(Ng);
} finally {
kg.f();
}
} else Z(Zg, Xg);
}
}, Y = function(Bg, Zg) {
var Xg = Bg || "", Kg = Zg || "";
return !!l.has("".concat(Xg, "|").concat(Kg)) || !(!Xg || !l.has("".concat(Xg, "|"))) || !(!Kg || !l.has("|".concat(Kg)));
}, R = function Bg(Zg) {
if (!Zg || Y(Zg.placeholderType, Zg.placeholderIdx)) return null;
if (Array.isArray(Zg.elements)) {
var Xg, Kg = [], kg = wC(Zg.elements);
try {
for (kg.s(); !(Xg = kg.n()).done; ) {
var Wg = Bg(Xg.value);
Wg && Kg.push(Wg);
}
} catch (Ng) {
kg.e(Ng);
} finally {
kg.f();
}
return Kg.length ? ti(ti({}, Zg), {}, { elements: Kg }) : null;
}
return Zg;
}, p(n), Ul(I, "layout/overrides/fromSlide", { size: l.size }), X = U(C, ["p:sldLayout", "attrs", "showMasterSp"]), H = U(C, ["p:sldLayout", "attrs", "showMasterPh"]), S = 0, z = 0, v = 0, K = 0, !A) {
dg.next = 82;
break;
}
dg.t0 = bI.keys(A);
case 32:
if ((dg.t1 = dg.t0()).done) {
dg.next = 82;
break;
}
if (V = dg.t1.value, A[V].constructor !== Array) {
dg.next = 61;
break;
}
N = 0;
case 36:
if (!(N < A[V].length)) {
dg.next = 59;
break;
}
if (B = A[V][N], c !== "0" || !u(B)) {
dg.next = 41;
break;
}
return z += 1, dg.abrupt("continue", 56);
case 41:
if (!(G = m(B))) {
dg.next = 51;
break;
}
if (w = G.type || "", W = G.idx || "", !(l.has("".concat(w, "|").concat(W)) || w && l.has("".concat(w, "|")) || W && l.has("|".concat(W)))) {
dg.next = 48;
break;
}
return v += 1, dg.abrupt("continue", 56);
case 48:
if (b(B, G)) {
dg.next = 51;
break;
}
return K += 1, dg.abrupt("continue", 56);
case 51:
return dg.next = 53, ql(V, B, A, I, "slideLayoutBg");
case 53:
y = dg.sent, (f = R(y)) && (g.push(f), S += 1);
case 56:
N++, dg.next = 36;
break;
case 59:
dg.next = 80;
break;
case 61:
if (D = A[V], c !== "0" || !u(D)) {
dg.next = 65;
break;
}
return z += 1, dg.abrupt("continue", 32);
case 65:
if (!(F = m(D))) {
dg.next = 75;
break;
}
if (T = F.type || "", Q = F.idx || "", !(l.has("".concat(T, "|").concat(Q)) || T && l.has("".concat(T, "|")) || Q && l.has("|".concat(Q)))) {
dg.next = 72;
break;
}
return v += 1, dg.abrupt("continue", 32);
case 72:
if (b(D, F)) {
dg.next = 75;
break;
}
return K += 1, dg.abrupt("continue", 32);
case 75:
return dg.next = 77, ql(V, D, A, I, "slideLayoutBg");
case 77:
P = dg.sent, (L = R(P)) && (g.push(L), S += 1);
case 80:
dg.next = 32;
break;
case 82:
if (Ul(I, "layout/layoutElements", { showMasterSp: X, showMasterPh: H, kept: S, skipShowPh: z, skipOverridden: v, skipNotRenderable: K }), p(A), Ul(I, "layout/overrides/fromLayout", { size: l.size }), E = 0, J = 0, k = 0, j = 0, q = 0, !s || X === "0" || d === "0") {
dg.next = 148;
break;
}
dg.t2 = bI.keys(s);
case 92:
if ((dg.t3 = dg.t2()).done) {
dg.next = 148;
break;
}
if (Cg = dg.t3.value, s[Cg].constructor !== Array) {
dg.next = 124;
break;
}
Ig = 0;
case 96:
if (!(Ig < s[Cg].length)) {
dg.next = 122;
break;
}
if (x = s[Cg][Ig], c !== "0" || !u(x)) {
dg.next = 101;
break;
}
return J += 1, dg.abrupt("continue", 119);
case 101:
if (!(Ag = m(x))) {
dg.next = 114;
break;
}
if (H !== "0" && o !== "0") {
dg.next = 106;
break;
}
return k += 1, dg.abrupt("continue", 119);
case 106:
if (eg = Ag.type || "", O = Ag.idx || "", !(l.has("".concat(eg, "|").concat(O)) || eg && l.has("".concat(eg, "|")) || O && l.has("|".concat(O)))) {
dg.next = 111;
break;
}
return j += 1, dg.abrupt("continue", 119);
case 111:
if (b(x, Ag)) {
dg.next = 114;
break;
}
return q += 1, dg.abrupt("continue", 119);
case 114:
return dg.next = 116, ql(Cg, x, s, I, "slideMasterBg");
case 116:
_ = dg.sent, (gg = R(_)) && (g.push(gg), E += 1);
case 119:
Ig++, dg.next = 96;
break;
case 122:
dg.next = 146;
break;
case 124:
if (lg = s[Cg], c !== "0" || !u(lg)) {
dg.next = 128;
break;
}
return J += 1, dg.abrupt("continue", 92);
case 128:
if (!(ng = m(lg))) {
dg.next = 141;
break;
}
if (H !== "0" && o !== "0") {
dg.next = 133;
break;
}
return k += 1, dg.abrupt("continue", 92);
case 133:
if (sg = ng.type || "", og = ng.idx || "", !(l.has("".concat(sg, "|").concat(og)) || sg && l.has("".concat(sg, "|")) || og && l.has("|".concat(og)))) {
dg.next = 138;
break;
}
return j += 1, dg.abrupt("continue", 92);
case 138:
if (b(lg, ng)) {
dg.next = 141;
break;
}
return q += 1, dg.abrupt("continue", 92);
case 141:
return dg.next = 143, ql(Cg, lg, s, I, "slideMasterBg");
case 143:
cg = dg.sent, (rg = R(cg)) && (g.push(rg), E += 1);
case 146:
dg.next = 92;
break;
case 148:
return Ul(I, "layout/masterElements", { kept: E, skipShowPh: J, skipShowMasterPh: k, skipOverridden: j, skipNotRenderable: q }), dg.abrupt("return", g);
case 150:
case "end":
return dg.stop();
}
}, t);
})), kD.apply(this, arguments);
}
function N0(t) {
return t.sort(function(I, g) {
var C = parseInt(I && I.order), i = parseInt(g && g.order);
return (isNaN(C) ? 0 : C) - (isNaN(i) ? 0 : i);
});
}
function Iig(t) {
return U(t, ["p:grpSpPr", "a:xfrm"]) || U(t, ["p:grpSp", "p:grpSpPr", "a:xfrm"]);
}
function Cig(t, I, g) {
if (!t) return t;
var C, i, e = ti({}, t);
return typeof e.left == "number" && (e.left = Lt(e.left * I)), typeof e.top == "number" && (e.top = Lt(e.top * g)), typeof e.width == "number" && (e.width = Lt(e.width * I)), typeof e.height == "number" && (e.height = Lt(e.height * g)), typeof e.borderWidth == "number" && (e.borderWidth = Lt(e.borderWidth * Math.max(I, g))), typeof e.path == "string" && (e.path = function(A, s, l) {
if (!A || s === 1 && l === 1) return A;
var n = String(A).match(/[a-zA-Z]|[-+]?(?:\d*\.\d+|\d+)(?:e[-+]?\d+)?/g);
if (!n) return A;
var a, d = { M: 2, L: 2, T: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, A: 7, Z: 0 }, o = [], c = null, r = 0, h = wC(n);
try {
for (h.s(); !(a = h.n()).done; ) {
var b = a.value;
if (/^[a-zA-Z]$/.test(b)) c = b, r = 0, o.push(b);
else {
var u = c ? c.toUpperCase() : "", m = d[u];
if (m) {
var Z = r % m, p = b;
if (u !== "A" || Z !== 2 && Z !== 3 && Z !== 4) {
var Y = parseFloat(b);
if (!isNaN(Y)) {
var R = Y;
u === "H" ? R = Y * s : u === "V" ? R = Y * l : u === "A" ? Z === 0 ? R = Y * s : Z === 1 ? R = Y * l : Z === 5 ? R = Y * s : Z === 6 && (R = Y * l) : R = Z % 2 == 0 ? Y * s : Y * l, p = String(Lt(R));
}
} else p = b;
o.push(p), r += 1;
} else o.push(b);
}
}
} catch (X) {
h.e(X);
} finally {
h.f();
}
return o.join(" ");
}(e.path, I, g)), e.content && (e.content = (C = e.content, (i = g) !== 1 && C ? C.replace(/(font-size:\s*)([\d.]+)pt/g, function(A, s, l) {
var n = parseFloat(l) * i;
return "".concat(s).concat(Lt(n), "pt");
}) : C)), Array.isArray(e.elements) && (e.elements = e.elements.map(function(A) {
return Cig(A, I, g);
})), e;
}
function tig(t, I, g, C, i) {
if (!Array.isArray(t) || !C && !i) return t;
var e = Number(I), A = Number(g);
if (!Number.isFinite(e) || !Number.isFinite(A)) return t;
var s, l = wC(t);
try {
for (l.s(); !(s = l.n()).done; ) {
var n = s.value;
if (n && _a(n) === "object") {
var a = typeof n.width == "number" ? n.width : 0, d = typeof n.height == "number" ? n.height : 0;
C && typeof n.left == "number" && (n.left = Lt(e - n.left - a)), i && typeof n.top == "number" && (n.top = Lt(A - n.top - d));
var o = typeof n.content == "string" && Ltg(n.content);
n.type === "text" || o ? (n.isFlipH = !1, n.isFlipV = !1) : n.type === "group" && Array.isArray(n.elements) ? (tig(n.elements, n.width, n.height, C, i), n.isFlipH = !1, n.isFlipV = !1) : (C && (n.isFlipH = !n.isFlipH), i && (n.isFlipV = !n.isFlipV), (C ? 1 : 0) ^ (i ? 1 : 0) && typeof n.rotate == "number" && (n.rotate = Lt(-n.rotate)));
}
}
} catch (c) {
l.e(c);
} finally {
l.f();
}
return N0(t), t;
}
function uh(t, I) {
var g, C = wC(t || []);
try {
for (C.s(); !(g = C.n()).done; ) {
var i = g.value;
if (i) {
var e = U(i, ["attrs", I]);
if (e != null) return e;
}
}
} catch (A) {
C.e(A);
} finally {
C.f();
}
}
function Vq(t) {
var I = t[Object.keys(t)[0]]["p:cSld"]["p:spTree"], g = {}, C = {}, i = {}, e = {}, A = function(l) {
if (l) {
for (var n in l) if (n !== "p:nvGrpSpPr" && n !== "p:grpSpPr") {
var a = l[n];
if (Array.isArray(a)) {
var d, o = wC(a);
try {
for (o.s(); !(d = o.n()).done; ) {
var c = d.value;
s(n, c);
}
} catch (r) {
o.e(r);
} finally {
o.f();
}
} else s(n, a);
}
}
}, s = function l(n, a) {
if (a) if (n !== "p:sp" && n !== "p:pic" && n !== "p:graphicFrame") if (n !== "p:grpSp") {
if (n === "mc:AlternateContent") {
var d = U(a, ["mc:Fallback"]), o = d && (d["p:grpSp"] || d);
o && (o["p:grpSpPr"] ? l("p:grpSp", o) : A(o));
}
} else A(a);
else (function(c) {
var r = function(m) {
return m && (m["p:nvSpPr"] || m["p:nvPicPr"] || m["p:nvGraphicFramePr"]) || null;
}(c);
if (r) {
var h = U(r, ["p:cNvPr", "attrs", "id"]), b = U(r, ["p:nvPr", "p:ph", "attrs", "idx"]), u = U(r, ["p:nvPr", "p:ph", "attrs", "type"]);
h && (g[h] = c), b && (C[b] = c), u && (i[u] = c), u && b && (e["".concat(u, "|").concat(b)] = c);
}
})(a);
};
return A(I), { idTable: g, idxTable: C, typeTable: i, typeIdxTable: e };
}
function ql(t, I, g, C, i) {
return zD.apply(this, arguments);
}
function zD() {
return zD = SC(bI.mark(function t(I, g, C, i, e) {
var A, s, l, n, a = arguments;
return bI.wrap(function(d) {
for (; ; ) switch (d.prev = d.next) {
case 0:
if (A = a.length > 5 && a[5] !== void 0 ? a[5] : [], !_tg(Ptg(g))) {
d.next = 4;
break;
}
return d.abrupt("return", null);
case 4:
if (!qtg(Rbg(g))) {
d.next = 7;
break;
}
return d.abrupt("return", null);
case 7:
d.t0 = I, d.next = d.t0 === "p:sp" ? 10 : d.t0 === "p:cxnSp" ? 14 : d.t0 === "p:pic" ? 18 : d.t0 === "p:graphicFrame" ? 22 : d.t0 === "p:grpSp" ? 26 : d.t0 === "mc:AlternateContent" ? 30 : 42;
break;
case 10:
return d.next = 12, Tbg(g, C, i, e, A);
case 12:
return s = d.sent, d.abrupt("break", 42);
case 14:
return d.next = 16, xbg(g, C, i, e, A);
case 16:
return s = d.sent, d.abrupt("break", 42);
case 18:
return d.next = 20, jbg(g, i, e, A);
case 20:
return s = d.sent, d.abrupt("break", 42);
case 22:
return d.next = 24, Qbg(g, i, e);
case 24:
return s = d.sent, d.abrupt("break", 42);
case 26:
return d.next = 28, LD(g, i, e, A);
case 28:
return s = d.sent, d.abrupt("break", 42);
case 30:
if (l = U(g, ["mc:Fallback"]), !(n = l && (l["p:grpSp"] || l)) || !Iig(n)) {
d.next = 37;
break;
}
return d.next = 35, LD(n, i, e, A);
case 35:
return s = d.sent, d.abrupt("break", 42);
case 37:
if (!U(g, ["mc:Choice"])) {
d.next = 41;
break;
}
return d.next = 40, vbg(g, i, e);
case 40:
s = d.sent;
case 41:
return d.abrupt("break", 42);
case 42:
return d.abrupt("return", s);
case 43:
case "end":
return d.stop();
}
}, t);
})), zD.apply(this, arguments);
}
function vbg(t, I, g) {
return JD.apply(this, arguments);
}
function JD() {
return JD = SC(bI.mark(function t(I, g, C) {
var i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z;
return bI.wrap(function(p) {
for (; ; ) switch (p.prev = p.next) {
case 0:
return i = U(I, ["mc:Choice"]), e = U(I, ["mc:Fallback"]), A = I.attrs.order, s = U(i, ["p:sp", "p:spPr", "a:xfrm"]), l = f0(s, void 0, void 0), n = l.top, a = l.left, d = H0(s, void 0, void 0), o = d.width, c = d.height, r = Etg(i)[0], h = Nbg(HC(r)), b = U(e, ["p:sp", "p:spPr", "a:blipFill"]), p.next = 11, rM(C, b, g);
case 11:
return u = p.sent, m = "", U(i, ["p:sp", "p:txBody", "a:p", "a:r"]) && (Z = U(i, ["p:sp"]), m = BV(Z["p:txBody"], Z, void 0, void 0, g)), p.abrupt("return", { type: "math", top: n, left: a, width: o, height: c, latex: h, picBase64: u, text: m, order: A });
case 15:
case "end":
return p.stop();
}
}, t);
})), JD.apply(this, arguments);
}
function LD(t, I, g) {
return vD.apply(this, arguments);
}
function vD() {
return vD = SC(bI.mark(function t(I, g, C) {
var i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg, og = arguments;
return bI.wrap(function(cg) {
for (; ; ) switch (cg.prev = cg.next) {
case 0:
if (i = og.length > 3 && og[3] !== void 0 ? og[3] : [], e = I.attrs.order, A = Iig(I)) {
cg.next = 5;
break;
}
return cg.abrupt("return", null);
case 5:
s = U(I, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "name"]) || "", l = U(I, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "id"]) || "", n = parseInt(A["a:off"].attrs.x) * Gg, a = parseInt(A["a:off"].attrs.y) * Gg, d = parseInt(A["a:ext"].attrs.cx) * Gg, o = parseInt(A["a:ext"].attrs.cy) * Gg, c = U(A, ["a:chOff", "attrs"]), r = U(A, ["a:chExt", "attrs"]), h = c && c.x !== void 0 ? parseInt(c.x) * Gg : 0, b = c && c.y !== void 0 ? parseInt(c.y) * Gg : 0, u = r && r.cx !== void 0 ? parseInt(r.cx) * Gg : d, m = r && r.cy !== void 0 ? parseInt(r.cy) * Gg : o, Z = U(A, ["attrs", "flipV"]) === "1", p = U(A, ["attrs", "flipH"]) === "1", (Y = U(A, ["attrs", "rot"]) || 0) && (Y = Y0(Y)), R = u && !isNaN(u) && d ? d / u : 1, X = m && !isNaN(m) && o ? o / m : 1, H = [].concat(R9(i), [I]), S = function(rg) {
if (!rg) return "";
var dg = U(rg, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "name"]), Bg = U(rg, ["p:nvGrpSpPr", "p:cNvPr", "attrs", "id"]), Zg = U(rg, ["attrs", "order"]), Xg = [];
return dg && Xg.push(String(dg)), Bg && Xg.push("#".concat(Bg)), Zg !== void 0 && Xg.push("@".concat(Zg)), Xg.join("");
}, Ul(g, "group/start", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, hierarchy: H.map(S).filter(Boolean), x: n, y: a, cx: d, cy: o, chx: h, chy: b, chcx: u, chcy: m, ws: R, hs: X, isFlipV: Z, isFlipH: p, rotate: Y }), z = [], cg.t0 = bI.keys(I);
case 28:
if ((cg.t1 = cg.t0()).done) {
cg.next = 58;
break;
}
if (v = cg.t1.value, I[v].constructor !== Array) {
cg.next = 52;
break;
}
K = wC(I[v]), cg.prev = 32, K.s();
case 34:
if ((V = K.n()).done) {
cg.next = 42;
break;
}
return N = V.value, cg.next = 38, ql(v, N, I, g, C, H);
case 38:
(B = cg.sent) && z.push(B);
case 40:
cg.next = 34;
break;
case 42:
cg.next = 47;
break;
case 44:
cg.prev = 44, cg.t2 = cg.catch(32), K.e(cg.t2);
case 47:
return cg.prev = 47, K.f(), cg.finish(47);
case 50:
cg.next = 56;
break;
case 52:
return cg.next = 54, ql(v, I[v], I, g, C, H);
case 54:
(G = cg.sent) && z.push(G);
case 56:
cg.next = 28;
break;
case 58:
N0(z), w = 1 / 0, W = 1 / 0, y = -1 / 0, f = -1 / 0, D = 0, F = z;
case 64:
if (!(D < F.length)) {
cg.next = 77;
break;
}
if ((T = F[D]) && typeof T.left == "number" && typeof T.top == "number") {
cg.next = 68;
break;
}
return cg.abrupt("continue", 74);
case 68:
Q = T.left + (typeof T.width == "number" ? T.width : 0), P = T.top + (typeof T.height == "number" ? T.height : 0), w = Math.min(w, T.left), W = Math.min(W, T.top), y = Math.max(y, Q), f = Math.max(f, P);
case 74:
D++, cg.next = 64;
break;
case 77:
return L = Number.isFinite(w) && Number.isFinite(W) && Number.isFinite(y) && Number.isFinite(f), E = !(Number.isFinite(d) && Number.isFinite(o) && d && o && Number.isFinite(u) && Number.isFinite(m) && u && m), J = L ? y - w : 0, k = L ? f - W : 0, j = Math.max(1, 2e-3 * Math.min(Number.isFinite(d) ? d : 0, Number.isFinite(o) ? o : 0)), q = L ? Math.abs(J - d) + Math.abs(k - o) + Math.abs(w - n) + Math.abs(W - a) : 1 / 0, Cg = L ? Math.abs(J - u) + Math.abs(k - m) + Math.abs(w - h) + Math.abs(W - b) : 1 / 0, Ig = !E && L && q + 2 * j < Cg, Ul(g, "group/bbox", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, children: z.length, hasBBox: L, bboxMinX: w, bboxMinY: W, bboxMaxX: y, bboxMaxY: f, bboxW: J, bboxH: k, eps: j, isLooseGroup: E, errToSlide: q, errToChild: Cg, isChildCoordAbsToSlide: Ig }), x = E ? L ? w : 0 : Ig ? n : h, Ag = E ? L ? W : 0 : Ig ? a : b, eg = E || Ig ? 1 : R, O = E || Ig ? 1 : X, _ = Lt(E && L ? w : n), gg = Lt(E && L ? W : a), lg = Lt(E && L ? y - w : d), ng = Lt(E && L ? f - W : o), Ul(g, "group/normalize", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, baseX: x, baseY: Ag, effWs: eg, effHs: O, outLeft: _, outTop: gg, outWidth: lg, outHeight: ng }), N0(sg = z.map(function(rg) {
return rg && typeof rg.left == "number" && typeof rg.top == "number" ? Cig(ti(ti({}, rg), {}, { left: rg.left - x, top: rg.top - Ag }), eg, O) : rg;
})), tig(sg, lg, ng, p, Z), Ul(g, "group/end", { slideNo: g && g.slideNo, source: C, name: s, id: l, order: e, normalizedChildren: sg.length }), cg.abrupt("return", { type: "group", top: gg, left: _, width: lg, height: ng, rotate: Y, order: e, isFlipV: !1, isFlipH: !1, elements: sg });
case 100:
case "end":
return cg.stop();
}
}, t, null, [[32, 44, 47, 50]]);
})), vD.apply(this, arguments);
}
function Tbg(t, I, g, C) {
return TD.apply(this, arguments);
}
function TD() {
return TD = SC(bI.mark(function t(I, g, C, i) {
var e, A, s, l, n, a, d, o, c, r, h = arguments;
return bI.wrap(function(b) {
for (; ; ) switch (b.prev = b.next) {
case 0:
return e = h.length > 4 && h[4] !== void 0 ? h[4] : [], A = U(I, ["p:nvSpPr", "p:cNvPr", "attrs", "name"]), s = U(I, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "idx"]), l = U(I, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"]), n = U(I, ["attrs", "order"]), o = C.slideLayoutTables, c = C.slideMasterTables, l && s ? (r = "".concat(l, "|").concat(s), a = o && o.typeIdxTable && o.typeIdxTable[r] || o && o.idxTable && o.idxTable[s] || o && o.typeTable && o.typeTable[l], d = c && c.typeIdxTable && c.typeIdxTable[r] || c && c.idxTable && c.idxTable[s] || c && c.typeTable && c.typeTable[l]) : s ? (a = o && o.idxTable ? o.idxTable[s] : void 0, d = c && c.idxTable ? c.idxTable[s] : void 0) : l && (a = o && o.typeTable ? o.typeTable[l] : void 0, d = c && c.typeTable ? c.typeTable[l] : void 0), l || U(I, ["p:nvSpPr", "p:cNvSpPr", "attrs", "txBox"]) === "1" && (l = "text"), l || (l = U(a, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"])), l || (l = U(d, ["p:nvSpPr", "p:nvPr", "p:ph", "attrs", "type"])), l || (l = i === "diagramBg" ? "diagram" : "obj"), b.next = 14, iig(I, g, a, d, A, l, n, C, i, e);
case 14:
return b.abrupt("return", b.sent);
case 15:
case "end":
return b.stop();
}
}, t);
})), TD.apply(this, arguments);
}
function xbg(t, I, g, C) {
return xD.apply(this, arguments);
}
function xD() {
return xD = SC(bI.mark(function t(I, g, C, i) {
var e, A, s, l, n = arguments;
return bI.wrap(function(a) {
for (; ; ) switch (a.prev = a.next) {
case 0:
return e = n.length > 4 && n[4] !== void 0 ? n[4] : [], A = I["p:nvCxnSpPr"]["p:cNvPr"].attrs.name, s = I["p:nvCxnSpPr"]["p:nvPr"]["p:ph"] === void 0 ? void 0 : I["p:nvSpPr"]["p:nvPr"]["p:ph"].attrs.type, l = I.attrs.order, a.next = 6, iig(I, g, void 0, void 0, A, s, l, C, i, e);
case 6:
return a.abrupt("return", a.sent);
case 7:
case "end":
return a.stop();
}
}, t);
})), xD.apply(this, arguments);
}
function iig(t, I, g, C, i, e, A, s, l) {
return jD.apply(this, arguments);
}
function jD() {
return jD = SC(bI.mark(function t(I, g, C, i, e, A, s, l, n) {
var a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg = arguments;
return bI.wrap(function(O) {
for (; ; ) switch (O.prev = O.next) {
case 0:
return a = eg.length > 9 && eg[9] !== void 0 ? eg[9] : [], d = U(I, ["p:nvSpPr", "p:nvPr", "p:ph"]) || U(I, ["p:nvPicPr", "p:nvPr", "p:ph"]) || U(I, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]), o = d && U(d, ["attrs", "type"]) || "", c = d && U(d, ["attrs", "idx"]) || "", h = U(I, r = ["p:spPr", "a:xfrm"]), b = U(C, r), u = U(i, r), m = U(I, ["p:spPr", "a:prstGeom", "attrs", "prst"]), Z = U(I, ["p:spPr", "a:custGeom"]), p = f0(h, b, u), Y = p.top, R = p.left, X = H0(h, b, u), H = X.width, S = X.height, v = uh(z = [h, b, u], "flipV") === "1", K = uh(z, "flipH") === "1", V = Y0(uh(z, "rot")), N = U(I, ["p:txXfrm"]), B = V, N && (G = U(N, ["attrs", "rot"])) && (B = V + Y0(G)), w = "", I["p:txBody"] && (w = BV(I["p:txBody"], I, C, A, l)), W = Fs(I, A, l, a), y = W.borderColor, f = W.borderWidth, D = W.borderType, F = W.strokeDasharray, O.next = 24, jtg(I, g, void 0, l, n, a);
case 24:
if (O.t0 = O.sent, O.t0) {
O.next = 27;
break;
}
O.t0 = "";
case 27:
if (T = O.t0, m === "arc" && (T = ""), Q = H, P = S, m === "line" && (L = Math.max(1, f || 0), Q || (Q = L), P || (P = L)), (J = U(I, ["p:spPr", "a:effectLst", "a:outerShdw"])) && (E = Qtg(J, l)), k = hbg(I, C, i), j = U(I, ["p:txBody", "a:bodyPr", "attrs", "vert"]) === "eaVert", q = bbg(I, C, i), Cg = { left: R, top: Y, width: Q, height: P, borderColor: y, borderWidth: f, borderType: D, borderStrokeDasharray: F, fill: T, content: w, isFlipV: v, isFlipH: K, rotate: V, vAlign: k, name: e, order: s, placeholderType: o, placeholderIdx: c }, E && (Cg.shadow = E), q && (Cg.autoFit = q), Ig = Cg.content && Ltg(Cg.content), !Z || A === "diagram") {
O.next = 47;
break;
}
return x = Wbg(Z, Q, P), Ig || (Cg.content = ""), O.abrupt("return", ti(ti({}, Cg), {}, { type: "shape", shapType: "custom", path: x }));
case 47:
if (Ag = "", m && (Ag = Vbg(m, Q, P, I)), !m || A !== "obj" && A && m === "rect") {
O.next = 52;
break;
}
return Ig || (Cg.content = ""), O.abrupt("return", ti(ti({}, Cg), {}, { type: "shape", shapType: m, path: Ag }));
case 52:
if (!m || Ig || !T && !f) {
O.next = 54;
break;
}
return O.abrupt("return", ti(ti({}, Cg), {}, { type: "shape", content: "", shapType: m, path: Ag }));
case 54:
return O.abrupt("return", ti(ti({}, Cg), {}, { type: "text", isVertical: j, isFlipV: !1, isFlipH: !1, rotate: B }));
case 55:
case "end":
return O.stop();
}
}, t);
})), jD.apply(this, arguments);
}
function jbg(t, I, g) {
return QD.apply(this, arguments);
}
function QD() {
return QD = SC(bI.mark(function t(I, g, C) {
var i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg = arguments;
return bI.wrap(function(lg) {
for (; ; ) switch (lg.prev = lg.next) {
case 0:
return i = gg.length > 3 && gg[3] !== void 0 ? gg[3] : [], e = C === "slideMasterBg" ? g.masterResObj : C === "slideLayoutBg" ? g.layoutResObj : g.slideResObj, A = I.attrs.order, s = U(I, ["p:nvPicPr", "p:nvPr", "p:ph"]), l = s && U(s, ["attrs", "type"]) || "", n = s && U(s, ["attrs", "idx"]) || "", a = I["p:blipFill"]["a:blip"].attrs["r:embed"], d = e[a].target, o = DX(d).toLowerCase(), c = g.zip, lg.next = 12, c.file(d).async("arraybuffer");
case 12:
if (r = lg.sent, h = I["p:spPr"]["a:xfrm"], b = U(I, ["p:nvPicPr", "p:nvPr", "p:ph", "attrs", "idx"]), u = b ? U(g.slideLayoutTables, ["idxTable", b, "p:spPr", "a:xfrm"]) : void 0, m = b ? U(g.slideMasterTables, ["idxTable", b, "p:spPr", "a:xfrm"]) : void 0, h || (h = u || m), Z = yD(o), p = f0(h, u, m), Y = p.top, R = p.left, X = H0(h, u, m), H = X.width, S = X.height, z = "data:".concat(Z, ";base64,").concat(Jtg(r)), K = uh(v = [h, u, m], "flipV") === "1", V = uh(v, "flipH") === "1", N = Y0(uh(v, "rot")), B = U(I, ["p:nvPicPr", "p:nvPr", "a:videoFile"]), F = !1, !B) {
lg.next = 43;
break;
}
if (G = B.attrs["r:link"], !lbg(w = e[G].target)) {
lg.next = 36;
break;
}
w = pV(w), F = !0, lg.next = 43;
break;
case 36:
if ((W = DX(w).toLowerCase()) !== "mp4" && W !== "webm" && W !== "ogg") {
lg.next = 43;
break;
}
return lg.next = 40, c.file(w).async("arraybuffer");
case 40:
f = lg.sent, y = yD(W), D = URL.createObjectURL(new Blob([f], { type: y }));
case 43:
if (!(T = U(I, ["p:nvPicPr", "p:nvPr", "a:audioFile"]))) {
lg.next = 53;
break;
}
if (Q = T.attrs["r:link"], P = e[Q].target, (L = DX(P).toLowerCase()) !== "mp3" && L !== "wav" && L !== "ogg") {
lg.next = 53;
break;
}
return lg.next = 51, c.file(P).async("arraybuffer");
case 51:
E = lg.sent, J = URL.createObjectURL(new Blob([E]));
case 53:
if (!B || F) {
lg.next = 55;
break;
}
return lg.abrupt("return", { type: "video", top: Y, left: R, width: H, height: S, rotate: N, blob: D, order: A, placeholderType: l, placeholderIdx: n });
case 55:
if (!B || !F) {
lg.next = 57;
break;
}
return lg.abrupt("return", { type: "video", top: Y, left: R, width: H, height: S, rotate: N, src: w, order: A, placeholderType: l, placeholderIdx: n });
case 57:
if (!T) {
lg.next = 59;
break;
}
return lg.abrupt("return", { type: "audio", top: Y, left: R, width: H, height: S, rotate: N, blob: J, order: A, placeholderType: l, placeholderIdx: n });
case 59:
return (j = U(I, ["p:blipFill", "a:srcRect", "attrs"])) && (j.t || j.b || j.l || j.r) && (k = {}, j.t && (k.t = j.t / 1e3), j.b && (k.b = j.b / 1e3), j.l && (k.l = j.l / 1e3), j.r && (k.r = j.r / 1e3)), q = U(I, ["p:spPr", "a:prstGeom", "attrs", "prst"]) || "rect", Cg = Fs(I, void 0, g, i), Ig = Cg.borderColor, x = Cg.borderWidth, Ag = Cg.borderType, eg = Cg.strokeDasharray, O = nbg(I["p:blipFill"]), _ = { type: "image", top: Y, left: R, width: H, height: S, rotate: N, src: z, isFlipV: K, isFlipH: V, order: A, rect: k, geom: q, borderColor: Ig, borderWidth: x, borderType: Ag, borderStrokeDasharray: eg, placeholderType: l, placeholderIdx: n }, O && (_.filters = O), lg.abrupt("return", _);
case 67:
case "end":
return lg.stop();
}
}, t);
})), QD.apply(this, arguments);
}
function Qbg(t, I, g) {
return OD.apply(this, arguments);
}
function OD() {
return OD = SC(bI.mark(function t(I, g, C) {
var i, e, A, s, l, n;
return bI.wrap(function(a) {
for (; ; ) switch (a.prev = a.next) {
case 0:
i = U(I, ["p:nvGraphicFramePr", "p:nvPr", "p:ph"]), e = i && U(i, ["attrs", "type"]) || "", A = i && U(i, ["attrs", "idx"]) || "", s = U(I, ["a:graphic", "a:graphicData", "attrs", "uri"]), a.t0 = s, a.next = a.t0 === "http://schemas.openxmlformats.org/drawingml/2006/table" ? 7 : a.t0 === "http://schemas.openxmlformats.org/drawingml/2006/chart" ? 11 : a.t0 === "http://schemas.openxmlformats.org/drawingml/2006/diagram" ? 15 : a.t0 === "http://schemas.openxmlformats.org/presentationml/2006/ole" ? 19 : 26;
break;
case 7:
return a.next = 9, Obg(I, g);
case 9:
return l = a.sent, a.abrupt("break", 26);
case 11:
return a.next = 13, Ubg(I, g);
case 13:
return l = a.sent, a.abrupt("break", 26);
case 15:
return a.next = 17, Ebg(I, g);
case 17:
return l = a.sent, a.abrupt("break", 26);
case 19:
if ((n = U(I, ["a:graphic", "a:graphicData", "mc:AlternateContent", "mc:Fallback", "p:oleObj"])) || (n = U(I, ["a:graphic", "a:graphicData", "p:oleObj"])), !n) {
a.next = 25;
break;
}
return a.next = 24, LD(n, g, C);
case 24:
l = a.sent;
case 25:
return a.abrupt("break", 26);
case 26:
return l && (e || A) && (l.placeholderType = e, l.placeholderIdx = A), a.abrupt("return", l);
case 28:
case "end":
return a.stop();
}
}, t);
})), OD.apply(this, arguments);
}
function Obg(t, I) {
return UD.apply(this, arguments);
}
function UD() {
return UD = SC(bI.mark(function t(I, g) {
var C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V, N, B, G, w, W, y, f, D, F, T, Q, P, L, E, J, k, j, q, Cg, Ig, x, Ag, eg, O, _, gg, lg, ng, sg;
return bI.wrap(function(og) {
for (; ; ) switch (og.prev = og.next) {
case 0:
if (C = I.attrs.order, i = U(I, ["a:graphic", "a:graphicData", "a:tbl"]), e = U(I, ["p:xfrm"]), A = f0(e, void 0, void 0), s = A.top, l = A.left, n = H0(e, void 0, void 0), a = n.width, d = n.height, o = U(I, ["a:graphic", "a:graphicData", "a:tbl", "a:tblPr"]), (c = U(I, ["a:graphic", "a:graphicData", "a:tbl", "a:tblGrid", "a:gridCol"])).constructor !== Array && (c = [c]), r = [], c) {
h = wC(c);
try {
for (h.s(); !(b = h.n()).done; ) u = b.value, m = U(u, ["attrs", "w"]) || 0, Z = parseInt(m) * Gg, r.push(Z);
} catch (cg) {
h.e(cg);
} finally {
h.f();
}
}
if (p = o.attrs ? o.attrs.firstRow : void 0, Y = o.attrs ? o.attrs.firstCol : void 0, R = o.attrs ? o.attrs.lastRow : void 0, X = o.attrs ? o.attrs.lastCol : void 0, H = o.attrs ? o.attrs.bandRow : void 0, S = o.attrs ? o.attrs.bandCol : void 0, z = { isFrstRowAttr: p && p === "1" ? 1 : 0, isFrstColAttr: Y && Y === "1" ? 1 : 0, isLstRowAttr: R && R === "1" ? 1 : 0, isLstColAttr: X && X === "1" ? 1 : 0, isBandRowAttr: H && H === "1" ? 1 : 0, isBandColAttr: S && S === "1" ? 1 : 0 }, (K = o["a:tableStyleId"]) && (V = g.tableStyles["a:tblStyleLst"]["a:tblStyle"])) if (V.constructor === Array) for (N = 0; N < V.length; N++) V[N].attrs.styleId === K && (v = V[N]);
else V.attrs.styleId === K && (v = V);
v && (v.tblStylAttrObj = z), B = {}, G = U(v, ["a:wholeTbl", "a:tcStyle"]), (w = U(G, ["a:tcBdr"])) && (B = ybg(w, g)), W = "", (y = U(v, ["a:tblBg", "a:fillRef"])) && (W = eC(y, void 0, void 0, g)), y === void 0 && (y = U(v, ["a:wholeTbl", "a:tcStyle", "a:fill", "a:solidFill"]), W = eC(y, void 0, void 0, g)), (f = i["a:tr"]).constructor !== Array && (f = [f]), D = [], F = [], T = 0;
case 33:
if (!(T < f.length)) {
og.next = 88;
break;
}
if (Q = f[T], P = U(f[T], ["attrs", "h"]) || 0, L = parseInt(P) * Gg, F.push(L), E = Ybg(f, T, z, v, g), J = E.fillColor, k = E.fontColor, j = E.fontBold, q = Q["a:tc"], Cg = [], q.constructor !== Array) {
og.next = 67;
break;
}
Ig = 0;
case 43:
if (!(Ig < q.length)) {
og.next = 65;
break;
}
return x = q[Ig], Ag = void 0, Ig === 0 && z.isFrstColAttr === 1 ? (Ag = "a:firstCol", z.isLstRowAttr === 1 && T === f.length - 1 && U(v, ["a:seCell"]) ? Ag = "a:seCell" : z.isFrstRowAttr === 1 && T === 0 && U(v, ["a:neCell"]) && (Ag = "a:neCell")) : !(Ig > 0 && z.isBandColAttr === 1) || z.isFrstColAttr === 1 && T === 0 || z.isLstRowAttr === 1 && T === f.length - 1 || Ig === q.length - 1 || Ig % 2 != 0 && (U(v, ["a:band2V"]) === void 0 ? U(v, ["a:band1V"]) && (Ag = "a:band2V") : Ag = "a:band2V"), Ig === q.length - 1 && z.isLstColAttr === 1 && (Ag = "a:lastCol", z.isLstRowAttr === 1 && T === f.length - 1 && U(v, ["a:swCell"]) ? Ag = "a:swCell" : z.isFrstRowAttr === 1 && T === 0 && U(v, ["a:nwCell"]) && (Ag = "a:nwCell")), eg = BV(x["a:txBody"], x, void 0, void 0, g), og.next = 51, wq(x, v, Ag, g);
case 51:
O = og.sent, _ = { text: eg }, O.rowSpan && (_.rowSpan = O.rowSpan), O.colSpan && (_.colSpan = O.colSpan), O.vMerge && (_.vMerge = O.vMerge), O.hMerge && (_.hMerge = O.hMerge), (O.fontBold || j) && (_.fontBold = O.fontBold || j), (O.fontColor || k) && (_.fontColor = O.fontColor || k), (O.fillColor || J || W) && (_.fillColor = O.fillColor || J || W), O.borders && (_.borders = O.borders), Cg.push(_);
case 62:
Ig++, og.next = 43;
break;
case 65:
og.next = 84;
break;
case 67:
return gg = void 0, z.isFrstColAttr === 1 && z.isLstRowAttr !== 1 ? gg = "a:firstCol" : z.isBandColAttr === 1 && z.isLstRowAttr !== 1 && (U(v, ["a:band2V"]) || U(v, ["a:band1V"])) && (gg = "a:band2V"), z.isLstColAttr === 1 && z.isLstRowAttr !== 1 && (gg = "a:lastCol"), lg = BV(q["a:txBody"], q, void 0, void 0, g), og.next = 73, wq(q, v, gg, g);
case 73:
ng = og.sent, sg = { text: lg }, ng.rowSpan && (sg.rowSpan = ng.rowSpan), ng.colSpan && (sg.colSpan = ng.colSpan), ng.vMerge && (sg.vMerge = ng.vMerge), ng.hMerge && (sg.hMerge = ng.hMerge), (ng.fontBold || j) && (sg.fontBold = ng.fontBold || j), (ng.fontColor || k) && (sg.fontColor = ng.fontColor || k), (ng.fillColor || J || W) && (sg.fillColor = ng.fillColor || J || W), ng.borders && (sg.borders = ng.borders), Cg.push(sg);
case 84:
D.push(Cg);
case 85:
T++, og.next = 33;
break;
case 88:
return og.abrupt("return", { type: "table", top: s, left: l, width: a, height: d, data: D, order: C, borders: B, rowHeights: F, colWidths: r });
case 89:
case "end":
return og.stop();
}
}, t);
})), UD.apply(this, arguments);
}
function Ubg(t, I) {
return ED.apply(this, arguments);
}
function ED() {
return ED = SC(bI.mark(function t(I, g) {
var C, i, e, A, s, l, n, a, d, o, c, r, h, b;
return bI.wrap(function(u) {
for (; ; ) switch (u.prev = u.next) {
case 0:
if (C = I.attrs.order, i = U(I, ["p:xfrm"]), e = f0(i, void 0, void 0), A = e.top, s = e.left, l = H0(i, void 0, void 0), n = l.width, a = l.height, d = I["a:graphic"]["a:graphicData"]["c:chart"].attrs["r:id"], (o = U(g.slideResObj, [d, "target"])) || (o = U(g.layoutResObj, [d, "target"])), o || (o = U(g.masterResObj, [d, "target"])), o) {
u.next = 10;
break;
}
return u.abrupt("return", {});
case 10:
return u.next = 12, yt(g.zip, o);
case 12:
if (c = u.sent, r = U(c, ["c:chartSpace", "c:chart", "c:plotArea"]), h = dbg(r, g)) {
u.next = 17;
break;
}
return u.abrupt("return", {});
case 17:
return b = { type: "chart", top: A, left: s, width: n, height: a, data: h.data, colors: h.colors, chartType: h.type, order: C }, h.marker !== void 0 && (b.marker = h.marker), h.barDir !== void 0 && (b.barDir = h.barDir), h.holeSize !== void 0 && (b.holeSize = h.holeSize), h.grouping !== void 0 && (b.grouping = h.grouping), h.style !== void 0 && (b.style = h.style), u.abrupt("return", b);
case 24:
case "end":
return u.stop();
}
}, t);
})), ED.apply(this, arguments);
}
function Ebg(t, I) {
return PD.apply(this, arguments);
}
function PD() {
return PD = SC(bI.mark(function t(I, g) {
var C, i, e, A, s, l, n, a, d, o, c, r, h, b, u, m, Z, p, Y, R, X, H, S, z, v, K, V;
return bI.wrap(function(N) {
for (; ; ) switch (N.prev = N.next) {
case 0:
if (C = I.attrs.order, i = U(I, ["p:xfrm"]), e = f0(i, void 0, void 0), A = e.left, s = e.top, l = H0(i, void 0, void 0), n = l.width, a = l.height, !(d = U(I, ["a:graphic", "a:graphicData", "dgm:relIds", "attrs"]) || U(I, ["a:graphic", "a:graphicData", "p:relIds", "attrs"]))) {
N.next = 19;
break;
}
c = 0, r = Object.keys(d);
case 7:
if (!(c < r.length)) {
N.next = 19;
break;
}
if ((h = r[c]).startsWith("r:")) {
N.next = 11;
break;
}
return N.abrupt("continue", 16);
case 11:
if (b = d[h], !(u = U(g, ["slideResObj", b, "target"])) || typeof u != "string" || !/\/diagrams\/drawing/i.test(u)) {
N.next = 16;
break;
}
return o = u, N.abrupt("break", 19);
case 16:
c++, N.next = 7;
break;
case 19:
if (o || (m = g.diagramDrawingCursor || 0, o = g.diagramDrawingTargets && g.diagramDrawingTargets[m], g.diagramDrawingCursor = m + 1), Z = g.diagramResObj, p = g.digramFileContent, o && (g.diagramResObj = U(g, ["diagramResObjByTarget", o]) || Z, g.digramFileContent = U(g, ["diagramDrawingContents", o]) || p), Y = [], !(R = U(g.digramFileContent, ["p:drawing", "p:spTree"]))) {
N.next = 60;
break;
}
N.t0 = bI.keys(R);
case 27:
if ((N.t1 = N.t0()).done) {
N.next = 60;
break;
}
if ((X = N.t1.value) !== "p:nvGrpSpPr" && X !== "p:grpSpPr") {
N.next = 31;
break;
}
return N.abrupt("continue", 27);
case 31:
if (H = R[X], !Array.isArray(H)) {
N.next = 54;
break;
}
S = wC(H), N.prev = 34, S.s();
case 36:
if ((z = S.n()).done) {
N.next = 44;
break;
}
return v = z.value, N.next = 40, ql(X, v, R, g, "diagramBg");
case 40:
(K = N.sent) && Y.push(K);
case 42:
N.next = 36;
break;
case 44:
N.next = 49;
break;
case 46:
N.prev = 46, N.t2 = N.catch(34), S.e(N.t2);
case 49:
return N.prev = 49, S.f(), N.finish(49);
case 52:
N.next = 58;
break;
case 54:
return N.next = 56, ql(X, H, R, g, "diagramBg");
case 56:
(V = N.sent) && Y.push(V);
case 58:
N.next = 27;
break;
case 60:
return N0(Y), g.diagramResObj = Z, g.digramFileContent = p, N.abrupt("return", { type: "diagram", left: A, top: s, width: n, height: a, elements: Y, order: C });
case 64:
case "end":
return N.stop();
}
}, t, null, [[34, 46, 49, 52]]);
})), PD.apply(this, arguments);
}
async function Pbg(t, I) {
const g = await Sbg(t), C = iG(Lrg, { pptxJson: g });
return C.mount(I), {
$el: I,
$destroy() {
C.unmount();
}
};
}
var kX = { exports: {} };
/*! ExcelJS 19-10-2023 */
var Mq;
function _bg() {
return Mq || (Mq = 1, function(t, I) {
(function(g) {
t.exports = g();
})(function() {
return function g(C, i, e) {
function A(n, a) {
if (!i[n]) {
if (!C[n]) {
var d = typeof Qa == "function" && Qa;
if (!a && d) return d(n, !0);
if (s) return s(n, !0);
var o = new Error("Cannot find module '" + n + "'");
throw o.code = "MODULE_NOT_FOUND", o;
}
var c = i[n] = { exports: {} };
C[n][0].call(c.exports, function(r) {
return A(C[n][1][r] || r);
}, c, c.exports, g, C, i, e);
}
return i[n].exports;
}
for (var s = typeof Qa == "function" && Qa, l = 0; l < e.length; l++) A(e[l]);
return A;
}({ 1: [function(g, C, i) {
const e = g("fs"), A = g("fast-csv"), s = g("dayjs/plugin/customParseFormat"), l = g("dayjs/plugin/utc"), n = g("dayjs").extend(s).extend(l), a = g("../utils/stream-buf"), { fs: { exists: d } } = g("../utils/utils"), o = { true: !0, false: !1, "#N/A": { error: "#N/A" }, "#REF!": { error: "#REF!" }, "#NAME?": { error: "#NAME?" }, "#DIV/0!": { error: "#DIV/0!" }, "#NULL!": { error: "#NULL!" }, "#VALUE!": { error: "#VALUE!" }, "#NUM!": { error: "#NUM!" } };
C.exports = class {
constructor(c) {
this.workbook = c, this.worksheet = null;
}
async readFile(c, r) {
if (r = r || {}, !await d(c)) throw new Error("File not found: " + c);
const h = e.createReadStream(c), b = await this.read(h, r);
return h.close(), b;
}
read(c, r) {
return r = r || {}, new Promise((h, b) => {
const u = this.workbook.addWorksheet(r.sheetName), m = r.dateFormats || ["YYYY-MM-DD[T]HH:mm:ssZ", "YYYY-MM-DD[T]HH:mm:ss", "MM-DD-YYYY", "YYYY-MM-DD"], Z = r.map || function(Y) {
if (Y === "") return null;
const R = Number(Y);
if (!Number.isNaN(R) && R !== 1 / 0) return R;
const X = m.reduce((S, z) => {
if (S) return S;
const v = n(Y, z, !0);
return v.isValid() ? v : null;
}, null);
if (X) return new Date(X.valueOf());
const H = o[Y];
return H !== void 0 ? H : Y;
}, p = A.parse(r.parserOptions).on("data", (Y) => {
u.addRow(Y.map(Z));
}).on("end", () => {
p.emit("worksheet", u);
});
p.on("worksheet", h).on("error", b), c.pipe(p);
});
}
createInputStream() {
throw new Error("`CSV#createInputStream` is deprecated. You should use `CSV#read` instead. This method will be removed in version 5.0. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md");
}
write(c, r) {
return new Promise((h, b) => {
r = r || {};
const u = this.workbook.getWorksheet(r.sheetName || r.sheetId), m = A.format(r.formatterOptions);
c.on("finish", () => {
h();
}), m.on("error", b), m.pipe(c);
const { dateFormat: Z, dateUTC: p } = r, Y = r.map || ((H) => {
if (H) {
if (H.text || H.hyperlink) return H.hyperlink || H.text || "";
if (H.formula || H.result) return H.result || "";
if (H instanceof Date) return Z ? p ? n.utc(H).format(Z) : n(H).format(Z) : p ? n.utc(H).format() : n(H).format();
if (H.error) return H.error;
if (typeof H == "object") return JSON.stringify(H);
}
return H;
}), R = r.includeEmptyRows === void 0 || r.includeEmptyRows;
let X = 1;
u && u.eachRow((H, S) => {
if (R) for (; X++ < S - 1; ) m.write([]);
const { values: z } = H;
z.shift(), m.write(z.map(Y)), X = S;
}), m.end();
});
}
writeFile(c, r) {
const h = { encoding: (r = r || {}).encoding || "utf8" }, b = e.createWriteStream(c, h);
return this.write(b, r);
}
async writeBuffer(c) {
const r = new a();
return await this.write(r, c), r.read();
}
};
}, { "../utils/stream-buf": 24, "../utils/utils": 27, dayjs: 391, "dayjs/plugin/customParseFormat": 392, "dayjs/plugin/utc": 393, "fast-csv": 424, fs: 216 }], 2: [function(g, C, i) {
const e = g("../utils/col-cache");
class A {
constructor(l, n) {
let a = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 0;
if (this.worksheet = l, n) if (typeof n == "string") {
const d = e.decodeAddress(n);
this.nativeCol = d.col + a, this.nativeColOff = 0, this.nativeRow = d.row + a, this.nativeRowOff = 0;
} else n.nativeCol !== void 0 ? (this.nativeCol = n.nativeCol || 0, this.nativeColOff = n.nativeColOff || 0, this.nativeRow = n.nativeRow || 0, this.nativeRowOff = n.nativeRowOff || 0) : n.col !== void 0 ? (this.col = n.col + a, this.row = n.row + a) : (this.nativeCol = 0, this.nativeColOff = 0, this.nativeRow = 0, this.nativeRowOff = 0);
else this.nativeCol = 0, this.nativeColOff = 0, this.nativeRow = 0, this.nativeRowOff = 0;
}
static asInstance(l) {
return l instanceof A || l == null ? l : new A(l);
}
get col() {
return this.nativeCol + Math.min(this.colWidth - 1, this.nativeColOff) / this.colWidth;
}
set col(l) {
this.nativeCol = Math.floor(l), this.nativeColOff = Math.floor((l - this.nativeCol) * this.colWidth);
}
get row() {
return this.nativeRow + Math.min(this.rowHeight - 1, this.nativeRowOff) / this.rowHeight;
}
set row(l) {
this.nativeRow = Math.floor(l), this.nativeRowOff = Math.floor((l - this.nativeRow) * this.rowHeight);
}
get colWidth() {
return this.worksheet && this.worksheet.getColumn(this.nativeCol + 1) && this.worksheet.getColumn(this.nativeCol + 1).isCustomWidth ? Math.floor(1e4 * this.worksheet.getColumn(this.nativeCol + 1).width) : 64e4;
}
get rowHeight() {
return this.worksheet && this.worksheet.getRow(this.nativeRow + 1) && this.worksheet.getRow(this.nativeRow + 1).height ? Math.floor(1e4 * this.worksheet.getRow(this.nativeRow + 1).height) : 18e4;
}
get model() {
return { nativeCol: this.nativeCol, nativeColOff: this.nativeColOff, nativeRow: this.nativeRow, nativeRowOff: this.nativeRowOff };
}
set model(l) {
this.nativeCol = l.nativeCol, this.nativeColOff = l.nativeColOff, this.nativeRow = l.nativeRow, this.nativeRowOff = l.nativeRowOff;
}
}
C.exports = A;
}, { "../utils/col-cache": 19 }], 3: [function(g, C, i) {
const e = g("../utils/col-cache"), A = g("../utils/under-dash"), s = g("./enums"), { slideFormula: l } = g("../utils/shared-formula"), n = g("./note");
class a {
constructor(c, r, h) {
if (!c || !r) throw new Error("A Cell needs a Row");
this._row = c, this._column = r, e.validateAddress(h), this._address = h, this._value = d.create(a.Types.Null, this), this.style = this._mergeStyle(c.style, r.style, {}), this._mergeCount = 0;
}
get worksheet() {
return this._row.worksheet;
}
get workbook() {
return this._row.worksheet.workbook;
}
destroy() {
delete this.style, delete this._value, delete this._row, delete this._column, delete this._address;
}
get numFmt() {
return this.style.numFmt;
}
set numFmt(c) {
this.style.numFmt = c;
}
get font() {
return this.style.font;
}
set font(c) {
this.style.font = c;
}
get alignment() {
return this.style.alignment;
}
set alignment(c) {
this.style.alignment = c;
}
get border() {
return this.style.border;
}
set border(c) {
this.style.border = c;
}
get fill() {
return this.style.fill;
}
set fill(c) {
this.style.fill = c;
}
get protection() {
return this.style.protection;
}
set protection(c) {
this.style.protection = c;
}
_mergeStyle(c, r, h) {
const b = c && c.numFmt || r && r.numFmt;
b && (h.numFmt = b);
const u = c && c.font || r && r.font;
u && (h.font = u);
const m = c && c.alignment || r && r.alignment;
m && (h.alignment = m);
const Z = c && c.border || r && r.border;
Z && (h.border = Z);
const p = c && c.fill || r && r.fill;
p && (h.fill = p);
const Y = c && c.protection || r && r.protection;
return Y && (h.protection = Y), h;
}
get address() {
return this._address;
}
get row() {
return this._row.number;
}
get col() {
return this._column.number;
}
get $col$row() {
return `$${this._column.letter}$${this.row}`;
}
get type() {
return this._value.type;
}
get effectiveType() {
return this._value.effectiveType;
}
toCsvString() {
return this._value.toCsvString();
}
addMergeRef() {
this._mergeCount++;
}
releaseMergeRef() {
this._mergeCount--;
}
get isMerged() {
return this._mergeCount > 0 || this.type === a.Types.Merge;
}
merge(c, r) {
this._value.release(), this._value = d.create(a.Types.Merge, this, c), r || (this.style = c.style);
}
unmerge() {
this.type === a.Types.Merge && (this._value.release(), this._value = d.create(a.Types.Null, this), this.style = this._mergeStyle(this._row.style, this._column.style, {}));
}
isMergedTo(c) {
return this._value.type === a.Types.Merge && this._value.isMergedTo(c);
}
get master() {
return this.type === a.Types.Merge ? this._value.master : this;
}
get isHyperlink() {
return this._value.type === a.Types.Hyperlink;
}
get hyperlink() {
return this._value.hyperlink;
}
get value() {
return this._value.value;
}
set value(c) {
this.type !== a.Types.Merge ? (this._value.release(), this._value = d.create(d.getType(c), this, c)) : this._value.master.value = c;
}
get note() {
return this._comment && this._comment.note;
}
set note(c) {
this._comment = new n(c);
}
get text() {
return this._value.toString();
}
get html() {
return A.escapeHtml(this.text);
}
toString() {
return this.text;
}
_upgradeToHyperlink(c) {
this.type === a.Types.String && (this._value = d.create(a.Types.Hyperlink, this, { text: this._value.value, hyperlink: c }));
}
get formula() {
return this._value.formula;
}
get result() {
return this._value.result;
}
get formulaType() {
return this._value.formulaType;
}
get fullAddress() {
const { worksheet: c } = this._row;
return { sheetName: c.name, address: this.address, row: this.row, col: this.col };
}
get name() {
return this.names[0];
}
set name(c) {
this.names = [c];
}
get names() {
return this.workbook.definedNames.getNamesEx(this.fullAddress);
}
set names(c) {
const { definedNames: r } = this.workbook;
r.removeAllNames(this.fullAddress), c.forEach((h) => {
r.addEx(this.fullAddress, h);
});
}
addName(c) {
this.workbook.definedNames.addEx(this.fullAddress, c);
}
removeName(c) {
this.workbook.definedNames.removeEx(this.fullAddress, c);
}
removeAllNames() {
this.workbook.definedNames.removeAllNames(this.fullAddress);
}
get _dataValidations() {
return this.worksheet.dataValidations;
}
get dataValidation() {
return this._dataValidations.find(this.address);
}
set dataValidation(c) {
this._dataValidations.add(this.address, c);
}
get model() {
const { model: c } = this._value;
return c.style = this.style, this._comment && (c.comment = this._comment.model), c;
}
set model(c) {
if (this._value.release(), this._value = d.create(c.type, this), this._value.model = c, c.comment) switch (c.comment.type) {
case "note":
this._comment = n.fromModel(c.comment);
}
c.style ? this.style = c.style : this.style = {};
}
}
a.Types = s.ValueType;
const d = { getType: (o) => o == null ? a.Types.Null : o instanceof String || typeof o == "string" ? a.Types.String : typeof o == "number" ? a.Types.Number : typeof o == "boolean" ? a.Types.Boolean : o instanceof Date ? a.Types.Date : o.text && o.hyperlink ? a.Types.Hyperlink : o.formula || o.sharedFormula ? a.Types.Formula : o.richText ? a.Types.RichText : o.sharedString ? a.Types.SharedString : o.error ? a.Types.Error : a.Types.JSON, types: [{ t: a.Types.Null, f: class {
constructor(o) {
this.model = { address: o.address, type: a.Types.Null };
}
get value() {
return null;
}
set value(o) {
}
get type() {
return a.Types.Null;
}
get effectiveType() {
return a.Types.Null;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
toCsvString() {
return "";
}
release() {
}
toString() {
return "";
}
} }, { t: a.Types.Number, f: class {
constructor(o, c) {
this.model = { address: o.address, type: a.Types.Number, value: c };
}
get value() {
return this.model.value;
}
set value(o) {
this.model.value = o;
}
get type() {
return a.Types.Number;
}
get effectiveType() {
return a.Types.Number;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
toCsvString() {
return this.model.value.toString();
}
release() {
}
toString() {
return this.model.value.toString();
}
} }, { t: a.Types.String, f: class {
constructor(o, c) {
this.model = { address: o.address, type: a.Types.String, value: c };
}
get value() {
return this.model.value;
}
set value(o) {
this.model.value = o;
}
get type() {
return a.Types.String;
}
get effectiveType() {
return a.Types.String;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
toCsvString() {
return `"${this.model.value.replace(/"/g, '""')}"`;
}
release() {
}
toString() {
return this.model.value;
}
} }, { t: a.Types.Date, f: class {
constructor(o, c) {
this.model = { address: o.address, type: a.Types.Date, value: c };
}
get value() {
return this.model.value;
}
set value(o) {
this.model.value = o;
}
get type() {
return a.Types.Date;
}
get effectiveType() {
return a.Types.Date;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
toCsvString() {
return this.model.value.toISOString();
}
release() {
}
toString() {
return this.model.value.toString();
}
} }, { t: a.Types.Hyperlink, f: class {
constructor(o, c) {
this.model = { address: o.address, type: a.Types.Hyperlink, text: c ? c.text : void 0, hyperlink: c ? c.hyperlink : void 0 }, c && c.tooltip && (this.model.tooltip = c.tooltip);
}
get value() {
const o = { text: this.model.text, hyperlink: this.model.hyperlink };
return this.model.tooltip && (o.tooltip = this.model.tooltip), o;
}
set value(o) {
this.model = { text: o.text, hyperlink: o.hyperlink }, o.tooltip && (this.model.tooltip = o.tooltip);
}
get text() {
return this.model.text;
}
set text(o) {
this.model.text = o;
}
get hyperlink() {
return this.model.hyperlink;
}
set hyperlink(o) {
this.model.hyperlink = o;
}
get type() {
return a.Types.Hyperlink;
}
get effectiveType() {
return a.Types.Hyperlink;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
toCsvString() {
return this.model.hyperlink;
}
release() {
}
toString() {
return this.model.text;
}
} }, { t: a.Types.Formula, f: class {
constructor(o, c) {
this.cell = o, this.model = { address: o.address, type: a.Types.Formula, shareType: c ? c.shareType : void 0, ref: c ? c.ref : void 0, formula: c ? c.formula : void 0, sharedFormula: c ? c.sharedFormula : void 0, result: c ? c.result : void 0 };
}
_copyModel(o) {
const c = {}, r = (h) => {
const b = o[h];
b && (c[h] = b);
};
return r("formula"), r("result"), r("ref"), r("shareType"), r("sharedFormula"), c;
}
get value() {
return this._copyModel(this.model);
}
set value(o) {
this.model = this._copyModel(o);
}
validate(o) {
switch (d.getType(o)) {
case a.Types.Null:
case a.Types.String:
case a.Types.Number:
case a.Types.Date:
break;
case a.Types.Hyperlink:
case a.Types.Formula:
default:
throw new Error("Cannot process that type of result value");
}
}
get dependencies() {
return { ranges: this.formula.match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}:[A-Z]{1,3}\d{1,4}/g), cells: this.formula.replace(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}:[A-Z]{1,3}\d{1,4}/g, "").match(/([a-zA-Z0-9]+!)?[A-Z]{1,3}\d{1,4}/g) };
}
get formula() {
return this.model.formula || this._getTranslatedFormula();
}
set formula(o) {
this.model.formula = o;
}
get formulaType() {
return this.model.formula ? s.FormulaType.Master : this.model.sharedFormula ? s.FormulaType.Shared : s.FormulaType.None;
}
get result() {
return this.model.result;
}
set result(o) {
this.model.result = o;
}
get type() {
return a.Types.Formula;
}
get effectiveType() {
const o = this.model.result;
return o == null ? s.ValueType.Null : o instanceof String || typeof o == "string" ? s.ValueType.String : typeof o == "number" ? s.ValueType.Number : o instanceof Date ? s.ValueType.Date : o.text && o.hyperlink ? s.ValueType.Hyperlink : o.formula ? s.ValueType.Formula : s.ValueType.Null;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
_getTranslatedFormula() {
if (!this._translatedFormula && this.model.sharedFormula) {
const { worksheet: o } = this.cell, c = o.findCell(this.model.sharedFormula);
this._translatedFormula = c && l(c.formula, c.address, this.model.address);
}
return this._translatedFormula;
}
toCsvString() {
return "" + (this.model.result || "");
}
release() {
}
toString() {
return this.model.result ? this.model.result.toString() : "";
}
} }, { t: a.Types.Merge, f: class {
constructor(o, c) {
this.model = { address: o.address, type: a.Types.Merge, master: c ? c.address : void 0 }, this._master = c, c && c.addMergeRef();
}
get value() {
return this._master.value;
}
set value(o) {
o instanceof a ? (this._master && this._master.releaseMergeRef(), o.addMergeRef(), this._master = o) : this._master.value = o;
}
isMergedTo(o) {
return o === this._master;
}
get master() {
return this._master;
}
get type() {
return a.Types.Merge;
}
get effectiveType() {
return this._master.effectiveType;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
toCsvString() {
return "";
}
release() {
this._master.releaseMergeRef();
}
toString() {
return this.value.toString();
}
} }, { t: a.Types.JSON, f: class {
constructor(o, c) {
this.model = { address: o.address, type: a.Types.String, value: JSON.stringify(c), rawValue: c };
}
get value() {
return this.model.rawValue;
}
set value(o) {
this.model.rawValue = o, this.model.value = JSON.stringify(o);
}
get type() {
return a.Types.String;
}
get effectiveType() {
return a.Types.String;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
toCsvString() {
return this.model.value;
}
release() {
}
toString() {
return this.model.value;
}
} }, { t: a.Types.SharedString, f: class {
constructor(o, c) {
this.model = { address: o.address, type: a.Types.SharedString, value: c };
}
get value() {
return this.model.value;
}
set value(o) {
this.model.value = o;
}
get type() {
return a.Types.SharedString;
}
get effectiveType() {
return a.Types.SharedString;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
toCsvString() {
return this.model.value.toString();
}
release() {
}
toString() {
return this.model.value.toString();
}
} }, { t: a.Types.RichText, f: class {
constructor(o, c) {
this.model = { address: o.address, type: a.Types.String, value: c };
}
get value() {
return this.model.value;
}
set value(o) {
this.model.value = o;
}
toString() {
return this.model.value.richText.map((o) => o.text).join("");
}
get type() {
return a.Types.RichText;
}
get effectiveType() {
return a.Types.RichText;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
toCsvString() {
return `"${this.text.replace(/"/g, '""')}"`;
}
release() {
}
} }, { t: a.Types.Boolean, f: class {
constructor(o, c) {
this.model = { address: o.address, type: a.Types.Boolean, value: c };
}
get value() {
return this.model.value;
}
set value(o) {
this.model.value = o;
}
get type() {
return a.Types.Boolean;
}
get effectiveType() {
return a.Types.Boolean;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
toCsvString() {
return this.model.value ? 1 : 0;
}
release() {
}
toString() {
return this.model.value.toString();
}
} }, { t: a.Types.Error, f: class {
constructor(o, c) {
this.model = { address: o.address, type: a.Types.Error, value: c };
}
get value() {
return this.model.value;
}
set value(o) {
this.model.value = o;
}
get type() {
return a.Types.Error;
}
get effectiveType() {
return a.Types.Error;
}
get address() {
return this.model.address;
}
set address(o) {
this.model.address = o;
}
toCsvString() {
return this.toString();
}
release() {
}
toString() {
return this.model.value.error.toString();
}
} }].reduce((o, c) => (o[c.t] = c.f, o), []), create(o, c, r) {
const h = this.types[o];
if (!h) throw new Error("Could not create Value of type " + o);
return new h(c, r);
} };
C.exports = a;
}, { "../utils/col-cache": 19, "../utils/shared-formula": 23, "../utils/under-dash": 26, "./enums": 7, "./note": 9 }], 4: [function(g, C, i) {
const e = g("../utils/under-dash"), A = g("./enums"), s = g("../utils/col-cache");
class l {
constructor(a, d, o) {
this._worksheet = a, this._number = d, o !== !1 && (this.defn = o);
}
get number() {
return this._number;
}
get worksheet() {
return this._worksheet;
}
get letter() {
return s.n2l(this._number);
}
get isCustomWidth() {
return this.width !== void 0 && this.width !== 9;
}
get defn() {
return { header: this._header, key: this.key, width: this.width, style: this.style, hidden: this.hidden, outlineLevel: this.outlineLevel };
}
set defn(a) {
a ? (this.key = a.key, this.width = a.width !== void 0 ? a.width : 9, this.outlineLevel = a.outlineLevel, a.style ? this.style = a.style : this.style = {}, this.header = a.header, this._hidden = !!a.hidden) : (delete this._header, delete this._key, delete this.width, this.style = {}, this.outlineLevel = 0);
}
get headers() {
return this._header && this._header instanceof Array ? this._header : [this._header];
}
get header() {
return this._header;
}
set header(a) {
a !== void 0 ? (this._header = a, this.headers.forEach((d, o) => {
this._worksheet.getCell(o + 1, this.number).value = d;
})) : this._header = void 0;
}
get key() {
return this._key;
}
set key(a) {
(this._key && this._worksheet.getColumnKey(this._key)) === this && this._worksheet.deleteColumnKey(this._key), this._key = a, a && this._worksheet.setColumnKey(this._key, this);
}
get hidden() {
return !!this._hidden;
}
set hidden(a) {
this._hidden = a;
}
get outlineLevel() {
return this._outlineLevel || 0;
}
set outlineLevel(a) {
this._outlineLevel = a;
}
get collapsed() {
return !!(this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelCol);
}
toString() {
return JSON.stringify({ key: this.key, width: this.width, headers: this.headers.length ? this.headers : void 0 });
}
equivalentTo(a) {
return this.width === a.width && this.hidden === a.hidden && this.outlineLevel === a.outlineLevel && e.isEqual(this.style, a.style);
}
get isDefault() {
if (this.isCustomWidth || this.hidden || this.outlineLevel) return !1;
const a = this.style;
return !a || !(a.font || a.numFmt || a.alignment || a.border || a.fill || a.protection);
}
get headerCount() {
return this.headers.length;
}
eachCell(a, d) {
const o = this.number;
d || (d = a, a = null), this._worksheet.eachRow(a, (c, r) => {
d(c.getCell(o), r);
});
}
get values() {
const a = [];
return this.eachCell((d, o) => {
d && d.type !== A.ValueType.Null && (a[o] = d.value);
}), a;
}
set values(a) {
if (!a) return;
const d = this.number;
let o = 0;
a.hasOwnProperty("0") && (o = 1), a.forEach((c, r) => {
this._worksheet.getCell(r + o, d).value = c;
});
}
_applyStyle(a, d) {
return this.style[a] = d, this.eachCell((o) => {
o[a] = d;
}), d;
}
get numFmt() {
return this.style.numFmt;
}
set numFmt(a) {
this._applyStyle("numFmt", a);
}
get font() {
return this.style.font;
}
set font(a) {
this._applyStyle("font", a);
}
get alignment() {
return this.style.alignment;
}
set alignment(a) {
this._applyStyle("alignment", a);
}
get protection() {
return this.style.protection;
}
set protection(a) {
this._applyStyle("protection", a);
}
get border() {
return this.style.border;
}
set border(a) {
this._applyStyle("border", a);
}
get fill() {
return this.style.fill;
}
set fill(a) {
this._applyStyle("fill", a);
}
static toModel(a) {
const d = [];
let o = null;
return a && a.forEach((c, r) => {
c.isDefault ? o && (o = null) : o && c.equivalentTo(o) ? o.max = r + 1 : (o = { min: r + 1, max: r + 1, width: c.width !== void 0 ? c.width : 9, style: c.style, isCustomWidth: c.isCustomWidth, hidden: c.hidden, outlineLevel: c.outlineLevel, collapsed: c.collapsed }, d.push(o));
}), d.length ? d : void 0;
}
static fromModel(a, d) {
const o = [];
let c = 1, r = 0;
for (d = (d = d || []).sort(function(h, b) {
return h.min - b.min;
}); r < d.length; ) {
const h = d[r++];
for (; c < h.min; ) o.push(new l(a, c++));
for (; c <= h.max; ) o.push(new l(a, c++, h));
}
return o.length ? o : null;
}
}
C.exports = l;
}, { "../utils/col-cache": 19, "../utils/under-dash": 26, "./enums": 7 }], 5: [function(g, C, i) {
C.exports = class {
constructor(e) {
this.model = e || {};
}
add(e, A) {
return this.model[e] = A;
}
find(e) {
return this.model[e];
}
remove(e) {
this.model[e] = void 0;
}
};
}, {}], 6: [function(g, C, i) {
const e = g("../utils/under-dash"), A = g("../utils/col-cache"), s = g("../utils/cell-matrix"), l = g("./range"), n = /[$](\w+)[$](\d+)(:[$](\w+)[$](\d+))?/;
C.exports = class {
constructor() {
this.matrixMap = {};
}
getMatrix(a) {
return this.matrixMap[a] || (this.matrixMap[a] = new s());
}
add(a, d) {
const o = A.decodeEx(a);
this.addEx(o, d);
}
addEx(a, d) {
const o = this.getMatrix(d);
if (a.top) for (let c = a.left; c <= a.right; c++) for (let r = a.top; r <= a.bottom; r++) {
const h = { sheetName: a.sheetName, address: A.n2l(c) + r, row: r, col: c };
o.addCellEx(h);
}
else o.addCellEx(a);
}
remove(a, d) {
const o = A.decodeEx(a);
this.removeEx(o, d);
}
removeEx(a, d) {
this.getMatrix(d).removeCellEx(a);
}
removeAllNames(a) {
e.each(this.matrixMap, (d) => {
d.removeCellEx(a);
});
}
forEach(a) {
e.each(this.matrixMap, (d, o) => {
d.forEach((c) => {
a(o, c);
});
});
}
getNames(a) {
return this.getNamesEx(A.decodeEx(a));
}
getNamesEx(a) {
return e.map(this.matrixMap, (d, o) => d.findCellEx(a) && o).filter(Boolean);
}
_explore(a, d) {
d.mark = !1;
const { sheetName: o } = d, c = new l(d.row, d.col, d.row, d.col, o);
let r, h;
function b(m, Z) {
const p = a.findCellAt(o, m, d.col);
return !(!p || !p.mark) && (c[Z] = m, p.mark = !1, !0);
}
for (h = d.row - 1; b(h, "top"); h--) ;
for (h = d.row + 1; b(h, "bottom"); h++) ;
function u(m, Z) {
const p = [];
for (h = c.top; h <= c.bottom; h++) {
const Y = a.findCellAt(o, h, m);
if (!Y || !Y.mark) return !1;
p.push(Y);
}
c[Z] = m;
for (let Y = 0; Y < p.length; Y++) p[Y].mark = !1;
return !0;
}
for (r = d.col - 1; u(r, "left"); r--) ;
for (r = d.col + 1; u(r, "right"); r++) ;
return c;
}
getRanges(a, d) {
return (d = d || this.matrixMap[a]) ? (d.forEach((o) => {
o.mark = !0;
}), { name: a, ranges: d.map((o) => o.mark && this._explore(d, o)).filter(Boolean).map((o) => o.$shortRange) }) : { name: a, ranges: [] };
}
normaliseMatrix(a, d) {
a.forEachInSheet(d, (o, c, r) => {
o && (o.row === c && o.col === r || (o.row = c, o.col = r, o.address = A.n2l(r) + c));
});
}
spliceRows(a, d, o, c) {
e.each(this.matrixMap, (r) => {
r.spliceRows(a, d, o, c), this.normaliseMatrix(r, a);
});
}
spliceColumns(a, d, o, c) {
e.each(this.matrixMap, (r) => {
r.spliceColumns(a, d, o, c), this.normaliseMatrix(r, a);
});
}
get model() {
return e.map(this.matrixMap, (a, d) => this.getRanges(d, a)).filter((a) => a.ranges.length);
}
set model(a) {
const d = this.matrixMap = {};
a.forEach((o) => {
const c = d[o.name] = new s();
o.ranges.forEach((r) => {
n.test(r.split("!").pop() || "") && c.addCell(r);
});
});
}
};
}, { "../utils/cell-matrix": 18, "../utils/col-cache": 19, "../utils/under-dash": 26, "./range": 10 }], 7: [function(g, C, i) {
C.exports = { ValueType: { Null: 0, Merge: 1, Number: 2, String: 3, Date: 4, Hyperlink: 5, Formula: 6, SharedString: 7, RichText: 8, Boolean: 9, Error: 10 }, FormulaType: { None: 0, Master: 1, Shared: 2 }, RelationshipType: { None: 0, OfficeDocument: 1, Worksheet: 2, CalcChain: 3, SharedStrings: 4, Styles: 5, Theme: 6, Hyperlink: 7 }, DocumentType: { Xlsx: 1 }, ReadingOrder: { LeftToRight: 1, RightToLeft: 2 }, ErrorValue: { NotApplicable: "#N/A", Ref: "#REF!", Name: "#NAME?", DivZero: "#DIV/0!", Null: "#NULL!", Value: "#VALUE!", Num: "#NUM!" } };
}, {}], 8: [function(g, C, i) {
const e = g("../utils/col-cache"), A = g("./anchor");
C.exports = class {
constructor(s, l) {
this.worksheet = s, this.model = l;
}
get model() {
switch (this.type) {
case "background":
return { type: this.type, imageId: this.imageId };
case "image":
return { type: this.type, imageId: this.imageId, hyperlinks: this.range.hyperlinks, range: { tl: this.range.tl.model, br: this.range.br && this.range.br.model, ext: this.range.ext, editAs: this.range.editAs } };
default:
throw new Error("Invalid Image Type");
}
}
set model(s) {
let { type: l, imageId: n, range: a, hyperlinks: d } = s;
if (this.type = l, this.imageId = n, l === "image") if (typeof a == "string") {
const o = e.decode(a);
this.range = { tl: new A(this.worksheet, { col: o.left, row: o.top }, -1), br: new A(this.worksheet, { col: o.right, row: o.bottom }, 0), editAs: "oneCell" };
} else this.range = { tl: new A(this.worksheet, a.tl, 0), br: a.br && new A(this.worksheet, a.br, 0), ext: a.ext, editAs: a.editAs, hyperlinks: d || a.hyperlinks };
}
};
}, { "../utils/col-cache": 19, "./anchor": 2 }], 9: [function(g, C, i) {
const e = g("../utils/under-dash");
class A {
constructor(l) {
this.note = l;
}
get model() {
let l = null;
switch (typeof this.note) {
case "string":
l = { type: "note", note: { texts: [{ text: this.note }] } };
break;
default:
l = { type: "note", note: this.note };
}
return e.deepMerge({}, A.DEFAULT_CONFIGS, l);
}
set model(l) {
const { note: n } = l, { texts: a } = n;
a.length === 1 && Object.keys(a[0]).length === 1 ? this.note = a[0].text : this.note = n;
}
static fromModel(l) {
const n = new A();
return n.model = l, n;
}
}
A.DEFAULT_CONFIGS = { note: { margins: { insetmode: "auto", inset: [0.13, 0.13, 0.25, 0.25] }, protection: { locked: "True", lockText: "True" }, editAs: "absolute" } }, C.exports = A;
}, { "../utils/under-dash": 26 }], 10: [function(g, C, i) {
const e = g("../utils/col-cache");
class A {
constructor() {
this.decode(arguments);
}
setTLBR(l, n, a, d, o) {
if (arguments.length < 4) {
const c = e.decodeAddress(l), r = e.decodeAddress(n);
this.model = { top: Math.min(c.row, r.row), left: Math.min(c.col, r.col), bottom: Math.max(c.row, r.row), right: Math.max(c.col, r.col), sheetName: a }, this.setTLBR(c.row, c.col, r.row, r.col, o);
} else this.model = { top: Math.min(l, a), left: Math.min(n, d), bottom: Math.max(l, a), right: Math.max(n, d), sheetName: o };
}
decode(l) {
switch (l.length) {
case 5:
this.setTLBR(l[0], l[1], l[2], l[3], l[4]);
break;
case 4:
this.setTLBR(l[0], l[1], l[2], l[3]);
break;
case 3:
this.setTLBR(l[0], l[1], l[2]);
break;
case 2:
this.setTLBR(l[0], l[1]);
break;
case 1: {
const n = l[0];
if (n instanceof A) this.model = { top: n.model.top, left: n.model.left, bottom: n.model.bottom, right: n.model.right, sheetName: n.sheetName };
else if (n instanceof Array) this.decode(n);
else if (n.top && n.left && n.bottom && n.right) this.model = { top: n.top, left: n.left, bottom: n.bottom, right: n.right, sheetName: n.sheetName };
else {
const a = e.decodeEx(n);
a.top ? this.model = { top: a.top, left: a.left, bottom: a.bottom, right: a.right, sheetName: a.sheetName } : this.model = { top: a.row, left: a.col, bottom: a.row, right: a.col, sheetName: a.sheetName };
}
break;
}
case 0:
this.model = { top: 0, left: 0, bottom: 0, right: 0 };
break;
default:
throw new Error("Invalid number of arguments to _getDimensions() - " + l.length);
}
}
get top() {
return this.model.top || 1;
}
set top(l) {
this.model.top = l;
}
get left() {
return this.model.left || 1;
}
set left(l) {
this.model.left = l;
}
get bottom() {
return this.model.bottom || 1;
}
set bottom(l) {
this.model.bottom = l;
}
get right() {
return this.model.right || 1;
}
set right(l) {
this.model.right = l;
}
get sheetName() {
return this.model.sheetName;
}
set sheetName(l) {
this.model.sheetName = l;
}
get _serialisedSheetName() {
const { sheetName: l } = this.model;
return l ? /^[a-zA-Z0-9]*$/.test(l) ? l + "!" : `'${l}'!` : "";
}
expand(l, n, a, d) {
(!this.model.top || l < this.top) && (this.top = l), (!this.model.left || n < this.left) && (this.left = n), (!this.model.bottom || a > this.bottom) && (this.bottom = a), (!this.model.right || d > this.right) && (this.right = d);
}
expandRow(l) {
if (l) {
const { dimensions: n, number: a } = l;
n && this.expand(a, n.min, a, n.max);
}
}
expandToAddress(l) {
const n = e.decodeEx(l);
this.expand(n.row, n.col, n.row, n.col);
}
get tl() {
return e.n2l(this.left) + this.top;
}
get $t$l() {
return `$${e.n2l(this.left)}$${this.top}`;
}
get br() {
return e.n2l(this.right) + this.bottom;
}
get $b$r() {
return `$${e.n2l(this.right)}$${this.bottom}`;
}
get range() {
return `${this._serialisedSheetName + this.tl}:${this.br}`;
}
get $range() {
return `${this._serialisedSheetName + this.$t$l}:${this.$b$r}`;
}
get shortRange() {
return this.count > 1 ? this.range : this._serialisedSheetName + this.tl;
}
get $shortRange() {
return this.count > 1 ? this.$range : this._serialisedSheetName + this.$t$l;
}
get count() {
return (1 + this.bottom - this.top) * (1 + this.right - this.left);
}
toString() {
return this.range;
}
intersects(l) {
return (!l.sheetName || !this.sheetName || l.sheetName === this.sheetName) && !(l.bottom < this.top) && !(l.top > this.bottom) && !(l.right < this.left) && !(l.left > this.right);
}
contains(l) {
const n = e.decodeEx(l);
return this.containsEx(n);
}
containsEx(l) {
return (!l.sheetName || !this.sheetName || l.sheetName === this.sheetName) && l.row >= this.top && l.row <= this.bottom && l.col >= this.left && l.col <= this.right;
}
forEachAddress(l) {
for (let n = this.left; n <= this.right; n++) for (let a = this.top; a <= this.bottom; a++) l(e.encodeAddress(a, n), a, n);
}
}
C.exports = A;
}, { "../utils/col-cache": 19 }], 11: [function(g, C, i) {
const e = g("../utils/under-dash"), A = g("./enums"), s = g("../utils/col-cache"), l = g("./cell");
C.exports = class {
constructor(n, a) {
this._worksheet = n, this._number = a, this._cells = [], this.style = {}, this.outlineLevel = 0;
}
get number() {
return this._number;
}
get worksheet() {
return this._worksheet;
}
commit() {
this._worksheet._commitRow(this);
}
destroy() {
delete this._worksheet, delete this._cells, delete this.style;
}
findCell(n) {
return this._cells[n - 1];
}
getCellEx(n) {
let a = this._cells[n.col - 1];
if (!a) {
const d = this._worksheet.getColumn(n.col);
a = new l(this, d, n.address), this._cells[n.col - 1] = a;
}
return a;
}
getCell(n) {
if (typeof n == "string") {
const a = this._worksheet.getColumnKey(n);
n = a ? a.number : s.l2n(n);
}
return this._cells[n - 1] || this.getCellEx({ address: s.encodeAddress(this._number, n), row: this._number, col: n });
}
splice(n, a) {
const d = n + a;
for (var o = arguments.length, c = new Array(o > 2 ? o - 2 : 0), r = 2; r < o; r++) c[r - 2] = arguments[r];
const h = c.length - a, b = this._cells.length;
let u, m, Z;
if (h < 0) for (u = n + c.length; u <= b; u++) Z = this._cells[u - 1], m = this._cells[u - h - 1], m ? (Z = this.getCell(u), Z.value = m.value, Z.style = m.style, Z._comment = m._comment) : Z && (Z.value = null, Z.style = {}, Z._comment = void 0);
else if (h > 0) for (u = b; u >= d; u--) m = this._cells[u - 1], m ? (Z = this.getCell(u + h), Z.value = m.value, Z.style = m.style, Z._comment = m._comment) : this._cells[u + h - 1] = void 0;
for (u = 0; u < c.length; u++) Z = this.getCell(n + u), Z.value = c[u], Z.style = {}, Z._comment = void 0;
}
eachCell(n, a) {
if (a || (a = n, n = null), n && n.includeEmpty) {
const d = this._cells.length;
for (let o = 1; o <= d; o++) a(this.getCell(o), o);
} else this._cells.forEach((d, o) => {
d && d.type !== A.ValueType.Null && a(d, o + 1);
});
}
addPageBreak(n, a) {
const d = this._worksheet, o = Math.max(0, n - 1) || 0, c = Math.max(0, a - 1) || 16838, r = { id: this._number, max: c, man: 1 };
o && (r.min = o), d.rowBreaks.push(r);
}
get values() {
const n = [];
return this._cells.forEach((a) => {
a && a.type !== A.ValueType.Null && (n[a.col] = a.value);
}), n;
}
set values(n) {
if (this._cells = [], n) if (n instanceof Array) {
let a = 0;
n.hasOwnProperty("0") && (a = 1), n.forEach((d, o) => {
d !== void 0 && (this.getCellEx({ address: s.encodeAddress(this._number, o + a), row: this._number, col: o + a }).value = d);
});
} else this._worksheet.eachColumnKey((a, d) => {
n[d] !== void 0 && (this.getCellEx({ address: s.encodeAddress(this._number, a.number), row: this._number, col: a.number }).value = n[d]);
});
}
get hasValues() {
return e.some(this._cells, (n) => n && n.type !== A.ValueType.Null);
}
get cellCount() {
return this._cells.length;
}
get actualCellCount() {
let n = 0;
return this.eachCell(() => {
n++;
}), n;
}
get dimensions() {
let n = 0, a = 0;
return this._cells.forEach((d) => {
d && d.type !== A.ValueType.Null && ((!n || n > d.col) && (n = d.col), a < d.col && (a = d.col));
}), n > 0 ? { min: n, max: a } : null;
}
_applyStyle(n, a) {
return this.style[n] = a, this._cells.forEach((d) => {
d && (d[n] = a);
}), a;
}
get numFmt() {
return this.style.numFmt;
}
set numFmt(n) {
this._applyStyle("numFmt", n);
}
get font() {
return this.style.font;
}
set font(n) {
this._applyStyle("font", n);
}
get alignment() {
return this.style.alignment;
}
set alignment(n) {
this._applyStyle("alignment", n);
}
get protection() {
return this.style.protection;
}
set protection(n) {
this._applyStyle("protection", n);
}
get border() {
return this.style.border;
}
set border(n) {
this._applyStyle("border", n);
}
get fill() {
return this.style.fill;
}
set fill(n) {
this._applyStyle("fill", n);
}
get hidden() {
return !!this._hidden;
}
set hidden(n) {
this._hidden = n;
}
get outlineLevel() {
return this._outlineLevel || 0;
}
set outlineLevel(n) {
this._outlineLevel = n;
}
get collapsed() {
return !!(this._outlineLevel && this._outlineLevel >= this._worksheet.properties.outlineLevelRow);
}
get model() {
const n = [];
let a = 0, d = 0;
return this._cells.forEach((o) => {
if (o) {
const c = o.model;
c && ((!a || a > o.col) && (a = o.col), d < o.col && (d = o.col), n.push(c));
}
}), this.height || n.length ? { cells: n, number: this.number, min: a, max: d, height: this.height, style: this.style, hidden: this.hidden, outlineLevel: this.outlineLevel, collapsed: this.collapsed } : null;
}
set model(n) {
if (n.number !== this._number) throw new Error("Invalid row number in model");
let a;
this._cells = [], n.cells.forEach((d) => {
switch (d.type) {
case l.Types.Merge:
break;
default: {
let o;
if (d.address) o = s.decodeAddress(d.address);
else if (a) {
const { row: c } = a, r = a.col + 1;
o = { row: c, col: r, address: s.encodeAddress(c, r), $col$row: `$${s.n2l(r)}$${c}` };
}
a = o, this.getCellEx(o).model = d;
break;
}
}
}), n.height ? this.height = n.height : delete this.height, this.hidden = n.hidden, this.outlineLevel = n.outlineLevel || 0, this.style = n.style && JSON.parse(JSON.stringify(n.style)) || {};
}
};
}, { "../utils/col-cache": 19, "../utils/under-dash": 26, "./cell": 3, "./enums": 7 }], 12: [function(g, C, i) {
const e = g("../utils/col-cache");
class A {
constructor(l, n, a) {
this.table = l, this.column = n, this.index = a;
}
_set(l, n) {
this.table.cacheState(), this.column[l] = n;
}
get name() {
return this.column.name;
}
set name(l) {
this._set("name", l);
}
get filterButton() {
return this.column.filterButton;
}
set filterButton(l) {
this.column.filterButton = l;
}
get style() {
return this.column.style;
}
set style(l) {
this.column.style = l;
}
get totalsRowLabel() {
return this.column.totalsRowLabel;
}
set totalsRowLabel(l) {
this._set("totalsRowLabel", l);
}
get totalsRowFunction() {
return this.column.totalsRowFunction;
}
set totalsRowFunction(l) {
this._set("totalsRowFunction", l);
}
get totalsRowResult() {
return this.column.totalsRowResult;
}
set totalsRowResult(l) {
this._set("totalsRowResult", l);
}
get totalsRowFormula() {
return this.column.totalsRowFormula;
}
set totalsRowFormula(l) {
this._set("totalsRowFormula", l);
}
}
C.exports = class {
constructor(s, l) {
this.worksheet = s, l && (this.table = l, this.validate(), this.store());
}
getFormula(s) {
switch (s.totalsRowFunction) {
case "none":
return null;
case "average":
return `SUBTOTAL(101,${this.table.name}[${s.name}])`;
case "countNums":
return `SUBTOTAL(102,${this.table.name}[${s.name}])`;
case "count":
return `SUBTOTAL(103,${this.table.name}[${s.name}])`;
case "max":
return `SUBTOTAL(104,${this.table.name}[${s.name}])`;
case "min":
return `SUBTOTAL(105,${this.table.name}[${s.name}])`;
case "stdDev":
return `SUBTOTAL(106,${this.table.name}[${s.name}])`;
case "var":
return `SUBTOTAL(107,${this.table.name}[${s.name}])`;
case "sum":
return `SUBTOTAL(109,${this.table.name}[${s.name}])`;
case "custom":
return s.totalsRowFormula;
default:
throw new Error("Invalid Totals Row Function: " + s.totalsRowFunction);
}
}
get width() {
return this.table.columns.length;
}
get height() {
return this.table.rows.length;
}
get filterHeight() {
return this.height + (this.table.headerRow ? 1 : 0);
}
get tableHeight() {
return this.filterHeight + (this.table.totalsRow ? 1 : 0);
}
validate() {
const { table: s } = this, l = (h, b, u) => {
h[b] === void 0 && (h[b] = u);
};
l(s, "headerRow", !0), l(s, "totalsRow", !1), l(s, "style", {}), l(s.style, "theme", "TableStyleMedium2"), l(s.style, "showFirstColumn", !1), l(s.style, "showLastColumn", !1), l(s.style, "showRowStripes", !1), l(s.style, "showColumnStripes", !1);
const n = (h, b) => {
if (!h) throw new Error(b);
};
n(s.ref, "Table must have ref"), n(s.columns, "Table must have column definitions"), n(s.rows, "Table must have row definitions"), s.tl = e.decodeAddress(s.ref);
const { row: a, col: d } = s.tl;
n(a > 0, "Table must be on valid row"), n(d > 0, "Table must be on valid col");
const { width: o, filterHeight: c, tableHeight: r } = this;
s.autoFilterRef = e.encode(a, d, a + c - 1, d + o - 1), s.tableRef = e.encode(a, d, a + r - 1, d + o - 1), s.columns.forEach((h, b) => {
n(h.name, `Column ${b} must have a name`), b === 0 ? l(h, "totalsRowLabel", "Total") : (l(h, "totalsRowFunction", "none"), h.totalsRowFormula = this.getFormula(h));
});
}
store() {
const s = (c, r) => {
r && Object.keys(r).forEach((h) => {
c[h] = r[h];
});
}, { worksheet: l, table: n } = this, { row: a, col: d } = n.tl;
let o = 0;
if (n.headerRow) {
const c = l.getRow(a + o++);
n.columns.forEach((r, h) => {
const { style: b, name: u } = r, m = c.getCell(d + h);
m.value = u, s(m, b);
});
}
if (n.rows.forEach((c) => {
const r = l.getRow(a + o++);
c.forEach((h, b) => {
const u = r.getCell(d + b);
u.value = h, s(u, n.columns[b].style);
});
}), n.totalsRow) {
const c = l.getRow(a + o++);
n.columns.forEach((r, h) => {
const b = c.getCell(d + h);
if (h === 0) b.value = r.totalsRowLabel;
else {
const u = this.getFormula(r);
b.value = u ? { formula: r.totalsRowFormula, result: r.totalsRowResult } : null;
}
s(b, r.style);
});
}
}
load(s) {
const { table: l } = this, { row: n, col: a } = l.tl;
let d = 0;
if (l.headerRow) {
const o = s.getRow(n + d++);
l.columns.forEach((c, r) => {
o.getCell(a + r).value = c.name;
});
}
if (l.rows.forEach((o) => {
const c = s.getRow(n + d++);
o.forEach((r, h) => {
c.getCell(a + h).value = r;
});
}), l.totalsRow) {
const o = s.getRow(n + d++);
l.columns.forEach((c, r) => {
const h = o.getCell(a + r);
r === 0 ? h.value = c.totalsRowLabel : this.getFormula(c) && (h.value = { formula: c.totalsRowFormula, result: c.totalsRowResult });
});
}
}
get model() {
return this.table;
}
set model(s) {
this.table = s;
}
cacheState() {
this._cache || (this._cache = { ref: this.ref, width: this.width, tableHeight: this.tableHeight });
}
commit() {
if (!this._cache) return;
this.validate();
const s = e.decodeAddress(this._cache.ref);
if (this.ref !== this._cache.ref) for (let l = 0; l < this._cache.tableHeight; l++) {
const n = this.worksheet.getRow(s.row + l);
for (let a = 0; a < this._cache.width; a++)
n.getCell(s.col + a).value = null;
}
else {
for (let l = this.tableHeight; l < this._cache.tableHeight; l++) {
const n = this.worksheet.getRow(s.row + l);
for (let a = 0; a < this._cache.width; a++)
n.getCell(s.col + a).value = null;
}
for (let l = 0; l < this.tableHeight; l++) {
const n = this.worksheet.getRow(s.row + l);
for (let a = this.width; a < this._cache.width; a++)
n.getCell(s.col + a).value = null;
}
}
this.store();
}
addRow(s, l) {
this.cacheState(), l === void 0 ? this.table.rows.push(s) : this.table.rows.splice(l, 0, s);
}
removeRows(s) {
let l = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
this.cacheState(), this.table.rows.splice(s, l);
}
getColumn(s) {
const l = this.table.columns[s];
return new A(this, l, s);
}
addColumn(s, l, n) {
this.cacheState(), n === void 0 ? (this.table.columns.push(s), this.table.rows.forEach((a, d) => {
a.push(l[d]);
})) : (this.table.columns.splice(n, 0, s), this.table.rows.forEach((a, d) => {
a.splice(n, 0, l[d]);
}));
}
removeColumns(s) {
let l = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1;
this.cacheState(), this.table.columns.splice(s, l), this.table.rows.forEach((n) => {
n.splice(s, l);
});
}
_assign(s, l, n) {
this.cacheState(), s[l] = n;
}
get ref() {
return this.table.ref;
}
set ref(s) {
this._assign(this.table, "ref", s);
}
get name() {
return this.table.name;
}
set name(s) {
this.table.name = s;
}
get displayName() {
return this.table.displyName || this.table.name;
}
set displayNamename(s) {
this.table.displayName = s;
}
get headerRow() {
return this.table.headerRow;
}
set headerRow(s) {
this._assign(this.table, "headerRow", s);
}
get totalsRow() {
return this.table.totalsRow;
}
set totalsRow(s) {
this._assign(this.table, "totalsRow", s);
}
get theme() {
return this.table.style.name;
}
set theme(s) {
this.table.style.name = s;
}
get showFirstColumn() {
return this.table.style.showFirstColumn;
}
set showFirstColumn(s) {
this.table.style.showFirstColumn = s;
}
get showLastColumn() {
return this.table.style.showLastColumn;
}
set showLastColumn(s) {
this.table.style.showLastColumn = s;
}
get showRowStripes() {
return this.table.style.showRowStripes;
}
set showRowStripes(s) {
this.table.style.showRowStripes = s;
}
get showColumnStripes() {
return this.table.style.showColumnStripes;
}
set showColumnStripes(s) {
this.table.style.showColumnStripes = s;
}
};
}, { "../utils/col-cache": 19 }], 13: [function(g, C, i) {
const e = g("./worksheet"), A = g("./defined-names"), s = g("../xlsx/xlsx"), l = g("../csv/csv");
C.exports = class {
constructor() {
this.category = "", this.company = "", this.created = /* @__PURE__ */ new Date(), this.description = "", this.keywords = "", this.manager = "", this.modified = this.created, this.properties = {}, this.calcProperties = {}, this._worksheets = [], this.subject = "", this.title = "", this.views = [], this.media = [], this._definedNames = new A();
}
get xlsx() {
return this._xlsx || (this._xlsx = new s(this)), this._xlsx;
}
get csv() {
return this._csv || (this._csv = new l(this)), this._csv;
}
get nextId() {
for (let n = 1; n < this._worksheets.length; n++) if (!this._worksheets[n]) return n;
return this._worksheets.length || 1;
}
addWorksheet(n, a) {
const d = this.nextId;
a && (typeof a == "string" ? (console.trace('tabColor argument is now deprecated. Please use workbook.addWorksheet(name, {properties: { tabColor: { argb: "rbg value" } }'), a = { properties: { tabColor: { argb: a } } }) : (a.argb || a.theme || a.indexed) && (console.trace("tabColor argument is now deprecated. Please use workbook.addWorksheet(name, {properties: { tabColor: { ... } }"), a = { properties: { tabColor: a } }));
const o = this._worksheets.reduce((h, b) => (b && b.orderNo) > h ? b.orderNo : h, 0), c = Object.assign({}, a, { id: d, name: n, orderNo: o + 1, workbook: this }), r = new e(c);
return this._worksheets[d] = r, r;
}
removeWorksheetEx(n) {
delete this._worksheets[n.id];
}
removeWorksheet(n) {
const a = this.getWorksheet(n);
a && a.destroy();
}
getWorksheet(n) {
return n === void 0 ? this._worksheets.find(Boolean) : typeof n == "number" ? this._worksheets[n] : typeof n == "string" ? this._worksheets.find((a) => a && a.name === n) : void 0;
}
get worksheets() {
return this._worksheets.slice(1).sort((n, a) => n.orderNo - a.orderNo).filter(Boolean);
}
eachSheet(n) {
this.worksheets.forEach((a) => {
n(a, a.id);
});
}
get definedNames() {
return this._definedNames;
}
clearThemes() {
this._themes = void 0;
}
addImage(n) {
const a = this.media.length;
return this.media.push(Object.assign({}, n, { type: "image" })), a;
}
getImage(n) {
return this.media[n];
}
get model() {
return { creator: this.creator || "Unknown", lastModifiedBy: this.lastModifiedBy || "Unknown", lastPrinted: this.lastPrinted, created: this.created, modified: this.modified, properties: this.properties, worksheets: this.worksheets.map((n) => n.model), sheets: this.worksheets.map((n) => n.model).filter(Boolean), definedNames: this._definedNames.model, views: this.views, company: this.company, manager: this.manager, title: this.title, subject: this.subject, keywords: this.keywords, category: this.category, description: this.description, language: this.language, revision: this.revision, contentStatus: this.contentStatus, themes: this._themes, media: this.media, calcProperties: this.calcProperties };
}
set model(n) {
this.creator = n.creator, this.lastModifiedBy = n.lastModifiedBy, this.lastPrinted = n.lastPrinted, this.created = n.created, this.modified = n.modified, this.company = n.company, this.manager = n.manager, this.title = n.title, this.subject = n.subject, this.keywords = n.keywords, this.category = n.category, this.description = n.description, this.language = n.language, this.revision = n.revision, this.contentStatus = n.contentStatus, this.properties = n.properties, this.calcProperties = n.calcProperties, this._worksheets = [], n.worksheets.forEach((a) => {
const { id: d, name: o, state: c } = a, r = n.sheets && n.sheets.findIndex((h) => h.id === d);
(this._worksheets[d] = new e({ id: d, name: o, orderNo: r, state: c, workbook: this })).model = a;
}), this._definedNames.model = n.definedNames, this.views = n.views, this._themes = n.themes, this.media = n.media || [];
}
};
}, { "../csv/csv": 1, "../xlsx/xlsx": 144, "./defined-names": 6, "./worksheet": 14 }], 14: [function(g, C, i) {
const e = g("../utils/under-dash"), A = g("../utils/col-cache"), s = g("./range"), l = g("./row"), n = g("./column"), a = g("./enums"), d = g("./image"), o = g("./table"), c = g("./data-validations"), r = g("../utils/encryptor"), { copyStyle: h } = g("../utils/copy-style");
C.exports = class {
constructor(b) {
b = b || {}, this._workbook = b.workbook, this.id = b.id, this.orderNo = b.orderNo, this.name = b.name, this.state = b.state || "visible", this._rows = [], this._columns = null, this._keys = {}, this._merges = {}, this.rowBreaks = [], this.properties = Object.assign({}, { defaultRowHeight: 15, dyDescent: 55, outlineLevelCol: 0, outlineLevelRow: 0 }, b.properties), this.pageSetup = Object.assign({}, { margins: { left: 0.7, right: 0.7, top: 0.75, bottom: 0.75, header: 0.3, footer: 0.3 }, orientation: "portrait", horizontalDpi: 4294967295, verticalDpi: 4294967295, fitToPage: !(!b.pageSetup || !b.pageSetup.fitToWidth && !b.pageSetup.fitToHeight || b.pageSetup.scale), pageOrder: "downThenOver", blackAndWhite: !1, draft: !1, cellComments: "None", errors: "displayed", scale: 100, fitToWidth: 1, fitToHeight: 1, paperSize: void 0, showRowColHeaders: !1, showGridLines: !1, firstPageNumber: void 0, horizontalCentered: !1, verticalCentered: !1, rowBreaks: null, colBreaks: null }, b.pageSetup), this.headerFooter = Object.assign({}, { differentFirst: !1, differentOddEven: !1, oddHeader: null, oddFooter: null, evenHeader: null, evenFooter: null, firstHeader: null, firstFooter: null }, b.headerFooter), this.dataValidations = new c(), this.views = b.views || [], this.autoFilter = b.autoFilter || null, this._media = [], this.sheetProtection = null, this.tables = {}, this.conditionalFormattings = [];
}
get name() {
return this._name;
}
set name(b) {
if (b === void 0 && (b = "sheet" + this.id), this._name !== b) {
if (typeof b != "string") throw new Error("The name has to be a string.");
if (b === "") throw new Error("The name can't be empty.");
if (b === "History") throw new Error('The name "History" is protected. Please use a different name.');
if (/[*?:/\\[\]]/.test(b)) throw new Error(`Worksheet name ${b} cannot include any of the following characters: * ? : \\ / [ ]`);
if (/(^')|('$)/.test(b)) throw new Error("The first or last character of worksheet name cannot be a single quotation mark: " + b);
if (b && b.length > 31 && (console.warn(`Worksheet name ${b} exceeds 31 chars. This will be truncated`), b = b.substring(0, 31)), this._workbook._worksheets.find((u) => u && u.name.toLowerCase() === b.toLowerCase())) throw new Error("Worksheet name already exists: " + b);
this._name = b;
}
}
get workbook() {
return this._workbook;
}
destroy() {
this._workbook.removeWorksheetEx(this);
}
get dimensions() {
const b = new s();
return this._rows.forEach((u) => {
if (u) {
const m = u.dimensions;
m && b.expand(u.number, m.min, u.number, m.max);
}
}), b;
}
get columns() {
return this._columns;
}
set columns(b) {
this._headerRowCount = b.reduce((Z, p) => {
const Y = (p.header ? 1 : p.headers && p.headers.length) || 0;
return Math.max(Z, Y);
}, 0);
let u = 1;
const m = this._columns = [];
b.forEach((Z) => {
const p = new n(this, u++, !1);
m.push(p), p.defn = Z;
});
}
getColumnKey(b) {
return this._keys[b];
}
setColumnKey(b, u) {
this._keys[b] = u;
}
deleteColumnKey(b) {
delete this._keys[b];
}
eachColumnKey(b) {
e.each(this._keys, b);
}
getColumn(b) {
if (typeof b == "string") {
const u = this._keys[b];
if (u) return u;
b = A.l2n(b);
}
if (this._columns || (this._columns = []), b > this._columns.length) {
let u = this._columns.length + 1;
for (; u <= b; ) this._columns.push(new n(this, u++));
}
return this._columns[b - 1];
}
spliceColumns(b, u) {
const m = this._rows.length;
for (var Z = arguments.length, p = new Array(Z > 2 ? Z - 2 : 0), Y = 2; Y < Z; Y++) p[Y - 2] = arguments[Y];
if (p.length > 0) for (let S = 0; S < m; S++) {
const z = [b, u];
p.forEach((K) => {
z.push(K[S] || null);
});
const v = this.getRow(S + 1);
v.splice.apply(v, z);
}
else this._rows.forEach((S) => {
S && S.splice(b, u);
});
const R = p.length - u, X = b + u, H = this._columns.length;
if (R < 0) for (let S = b + p.length; S <= H; S++) this.getColumn(S).defn = this.getColumn(S - R).defn;
else if (R > 0) for (let S = H; S >= X; S--) this.getColumn(S + R).defn = this.getColumn(S).defn;
for (let S = b; S < b + p.length; S++) this.getColumn(S).defn = null;
this.workbook.definedNames.spliceColumns(this.name, b, u, p.length);
}
get lastColumn() {
return this.getColumn(this.columnCount);
}
get columnCount() {
let b = 0;
return this.eachRow((u) => {
b = Math.max(b, u.cellCount);
}), b;
}
get actualColumnCount() {
const b = [];
let u = 0;
return this.eachRow((m) => {
m.eachCell((Z) => {
let { col: p } = Z;
b[p] || (b[p] = !0, u++);
});
}), u;
}
_commitRow() {
}
get _lastRowNumber() {
const b = this._rows;
let u = b.length;
for (; u > 0 && b[u - 1] === void 0; ) u--;
return u;
}
get _nextRow() {
return this._lastRowNumber + 1;
}
get lastRow() {
if (this._rows.length) return this._rows[this._rows.length - 1];
}
findRow(b) {
return this._rows[b - 1];
}
findRows(b, u) {
return this._rows.slice(b - 1, b - 1 + u);
}
get rowCount() {
return this._lastRowNumber;
}
get actualRowCount() {
let b = 0;
return this.eachRow(() => {
b++;
}), b;
}
getRow(b) {
let u = this._rows[b - 1];
return u || (u = this._rows[b - 1] = new l(this, b)), u;
}
getRows(b, u) {
if (u < 1) return;
const m = [];
for (let Z = b; Z < b + u; Z++) m.push(this.getRow(Z));
return m;
}
addRow(b) {
let u = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "n";
const m = this._nextRow, Z = this.getRow(m);
return Z.values = b, this._setStyleOption(m, u[0] === "i" ? u : "n"), Z;
}
addRows(b) {
let u = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "n";
const m = [];
return b.forEach((Z) => {
m.push(this.addRow(Z, u));
}), m;
}
insertRow(b, u) {
let m = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "n";
return this.spliceRows(b, 0, u), this._setStyleOption(b, m), this.getRow(b);
}
insertRows(b, u) {
let m = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "n";
if (this.spliceRows(b, 0, ...u), m !== "n") for (let Z = 0; Z < u.length; Z++) m[0] === "o" && this.findRow(u.length + b + Z) !== void 0 ? this._copyStyle(u.length + b + Z, b + Z, m[1] === "+") : m[0] === "i" && this.findRow(b - 1) !== void 0 && this._copyStyle(b - 1, b + Z, m[1] === "+");
return this.getRows(b, u.length);
}
_setStyleOption(b) {
let u = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "n";
u[0] === "o" && this.findRow(b + 1) !== void 0 ? this._copyStyle(b + 1, b, u[1] === "+") : u[0] === "i" && this.findRow(b - 1) !== void 0 && this._copyStyle(b - 1, b, u[1] === "+");
}
_copyStyle(b, u) {
let m = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
const Z = this.getRow(b), p = this.getRow(u);
p.style = h(Z.style), Z.eachCell({ includeEmpty: m }, (Y, R) => {
p.getCell(R).style = h(Y.style);
}), p.height = Z.height;
}
duplicateRow(b, u) {
let m = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
const Z = this._rows[b - 1], p = new Array(u).fill(Z.values);
this.spliceRows(b + 1, m ? 0 : u, ...p);
for (let Y = 0; Y < u; Y++) {
const R = this._rows[b + Y];
R.style = Z.style, R.height = Z.height, Z.eachCell({ includeEmpty: !0 }, (X, H) => {
R.getCell(H).style = X.style;
});
}
}
spliceRows(b, u) {
const m = b + u;
for (var Z = arguments.length, p = new Array(Z > 2 ? Z - 2 : 0), Y = 2; Y < Z; Y++) p[Y - 2] = arguments[Y];
const R = p.length, X = R - u, H = this._rows.length;
let S, z;
if (X < 0) for (b === H && (this._rows[H - 1] = void 0), S = m; S <= H; S++) if (z = this._rows[S - 1], z) {
const v = this.getRow(S + X);
v.values = z.values, v.style = z.style, v.height = z.height, z.eachCell({ includeEmpty: !0 }, (K, V) => {
v.getCell(V).style = K.style;
}), this._rows[S - 1] = void 0;
} else this._rows[S + X - 1] = void 0;
else if (X > 0) for (S = H; S >= m; S--) if (z = this._rows[S - 1], z) {
const v = this.getRow(S + X);
v.values = z.values, v.style = z.style, v.height = z.height, z.eachCell({ includeEmpty: !0 }, (K, V) => {
if (v.getCell(V).style = K.style, K._value.constructor.name === "MergeValue") {
const N = this.getRow(K._row._number + R).getCell(V), B = K._value._master, G = this.getRow(B._row._number + R).getCell(B._column._number);
N.merge(G);
}
});
} else this._rows[S + X - 1] = void 0;
for (S = 0; S < R; S++) {
const v = this.getRow(b + S);
v.style = {}, v.values = p[S];
}
this.workbook.definedNames.spliceRows(this.name, b, u, R);
}
eachRow(b, u) {
if (u || (u = b, b = void 0), b && b.includeEmpty) {
const m = this._rows.length;
for (let Z = 1; Z <= m; Z++) u(this.getRow(Z), Z);
} else this._rows.forEach((m) => {
m && m.hasValues && u(m, m.number);
});
}
getSheetValues() {
const b = [];
return this._rows.forEach((u) => {
u && (b[u.number] = u.values);
}), b;
}
findCell(b, u) {
const m = A.getAddress(b, u), Z = this._rows[m.row - 1];
return Z ? Z.findCell(m.col) : void 0;
}
getCell(b, u) {
const m = A.getAddress(b, u);
return this.getRow(m.row).getCellEx(m);
}
mergeCells() {
for (var b = arguments.length, u = new Array(b), m = 0; m < b; m++) u[m] = arguments[m];
const Z = new s(u);
this._mergeCellsInternal(Z);
}
mergeCellsWithoutStyle() {
for (var b = arguments.length, u = new Array(b), m = 0; m < b; m++) u[m] = arguments[m];
const Z = new s(u);
this._mergeCellsInternal(Z, !0);
}
_mergeCellsInternal(b, u) {
e.each(this._merges, (Z) => {
if (Z.intersects(b)) throw new Error("Cannot merge already merged cells");
});
const m = this.getCell(b.top, b.left);
for (let Z = b.top; Z <= b.bottom; Z++) for (let p = b.left; p <= b.right; p++) (Z > b.top || p > b.left) && this.getCell(Z, p).merge(m, u);
this._merges[m.address] = b;
}
_unMergeMaster(b) {
const u = this._merges[b.address];
if (u) {
for (let m = u.top; m <= u.bottom; m++) for (let Z = u.left; Z <= u.right; Z++) this.getCell(m, Z).unmerge();
delete this._merges[b.address];
}
}
get hasMerges() {
return e.some(this._merges, Boolean);
}
unMergeCells() {
for (var b = arguments.length, u = new Array(b), m = 0; m < b; m++) u[m] = arguments[m];
const Z = new s(u);
for (let p = Z.top; p <= Z.bottom; p++) for (let Y = Z.left; Y <= Z.right; Y++) {
const R = this.findCell(p, Y);
R && (R.type === a.ValueType.Merge ? this._unMergeMaster(R.master) : this._merges[R.address] && this._unMergeMaster(R));
}
}
fillFormula(b, u, m) {
let Z = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "shared";
const p = A.decode(b), { top: Y, left: R, bottom: X, right: H } = p, S = H - R + 1, z = A.encodeAddress(Y, R), v = Z === "shared";
let K;
K = typeof m == "function" ? m : Array.isArray(m) ? Array.isArray(m[0]) ? (N, B) => m[N - Y][B - R] : (N, B) => m[(N - Y) * S + (B - R)] : () => {
};
let V = !0;
for (let N = Y; N <= X; N++) for (let B = R; B <= H; B++) V ? (this.getCell(N, B).value = { shareType: Z, formula: u, ref: b, result: K(N, B) }, V = !1) : this.getCell(N, B).value = v ? { sharedFormula: z, result: K(N, B) } : K(N, B);
}
addImage(b, u) {
const m = { type: "image", imageId: b, range: u };
this._media.push(new d(this, m));
}
getImages() {
return this._media.filter((b) => b.type === "image");
}
addBackgroundImage(b) {
const u = { type: "background", imageId: b };
this._media.push(new d(this, u));
}
getBackgroundImageId() {
const b = this._media.find((u) => u.type === "background");
return b && b.imageId;
}
protect(b, u) {
return new Promise((m) => {
this.sheetProtection = { sheet: !0 }, u && "spinCount" in u && (u.spinCount = Number.isFinite(u.spinCount) ? Math.round(Math.max(0, u.spinCount)) : 1e5), b && (this.sheetProtection.algorithmName = "SHA-512", this.sheetProtection.saltValue = r.randomBytes(16).toString("base64"), this.sheetProtection.spinCount = u && "spinCount" in u ? u.spinCount : 1e5, this.sheetProtection.hashValue = r.convertPasswordToHash(b, "SHA512", this.sheetProtection.saltValue, this.sheetProtection.spinCount)), u && (this.sheetProtection = Object.assign(this.sheetProtection, u), !b && "spinCount" in u && delete this.sheetProtection.spinCount), m();
});
}
unprotect() {
this.sheetProtection = null;
}
addTable(b) {
const u = new o(this, b);
return this.tables[b.name] = u, u;
}
getTable(b) {
return this.tables[b];
}
removeTable(b) {
delete this.tables[b];
}
getTables() {
return Object.values(this.tables);
}
addConditionalFormatting(b) {
this.conditionalFormattings.push(b);
}
removeConditionalFormatting(b) {
typeof b == "number" ? this.conditionalFormattings.splice(b, 1) : this.conditionalFormattings = b instanceof Function ? this.conditionalFormattings.filter(b) : [];
}
get tabColor() {
return console.trace("worksheet.tabColor property is now deprecated. Please use worksheet.properties.tabColor"), this.properties.tabColor;
}
set tabColor(b) {
console.trace("worksheet.tabColor property is now deprecated. Please use worksheet.properties.tabColor"), this.properties.tabColor = b;
}
get model() {
const b = { id: this.id, name: this.name, dataValidations: this.dataValidations.model, properties: this.properties, state: this.state, pageSetup: this.pageSetup, headerFooter: this.headerFooter, rowBreaks: this.rowBreaks, views: this.views, autoFilter: this.autoFilter, media: this._media.map((Z) => Z.model), sheetProtection: this.sheetProtection, tables: Object.values(this.tables).map((Z) => Z.model), conditionalFormattings: this.conditionalFormattings };
b.cols = n.toModel(this.columns);
const u = b.rows = [], m = b.dimensions = new s();
return this._rows.forEach((Z) => {
const p = Z && Z.model;
p && (m.expand(p.number, p.min, p.number, p.max), u.push(p));
}), b.merges = [], e.each(this._merges, (Z) => {
b.merges.push(Z.range);
}), b;
}
_parseRows(b) {
this._rows = [], b.rows.forEach((u) => {
const m = new l(this, u.number);
this._rows[m.number - 1] = m, m.model = u;
});
}
_parseMergeCells(b) {
e.each(b.mergeCells, (u) => {
this.mergeCellsWithoutStyle(u);
});
}
set model(b) {
this.name = b.name, this._columns = n.fromModel(this, b.cols), this._parseRows(b), this._parseMergeCells(b), this.dataValidations = new c(b.dataValidations), this.properties = b.properties, this.pageSetup = b.pageSetup, this.headerFooter = b.headerFooter, this.views = b.views, this.autoFilter = b.autoFilter, this._media = b.media.map((u) => new d(this, u)), this.sheetProtection = b.sheetProtection, this.tables = b.tables.reduce((u, m) => {
const Z = new o();
return Z.model = m, u[m.name] = Z, u;
}, {}), this.conditionalFormattings = b.conditionalFormattings;
}
};
}, { "../utils/col-cache": 19, "../utils/copy-style": 20, "../utils/encryptor": 21, "../utils/under-dash": 26, "./column": 4, "./data-validations": 5, "./enums": 7, "./image": 8, "./range": 10, "./row": 11, "./table": 12 }], 15: [function(g, C, i) {
g("core-js/modules/es.promise"), g("core-js/modules/es.promise.finally"), g("core-js/modules/es.object.assign"), g("core-js/modules/es.object.keys"), g("core-js/modules/es.object.values"), g("core-js/modules/es.symbol"), g("core-js/modules/es.symbol.async-iterator"), g("core-js/modules/es.array.iterator"), g("core-js/modules/es.array.includes"), g("core-js/modules/es.array.find-index"), g("core-js/modules/es.array.find"), g("core-js/modules/es.string.from-code-point"), g("core-js/modules/es.string.includes"), g("core-js/modules/es.number.is-nan"), g("regenerator-runtime/runtime");
const e = { Workbook: g("./doc/workbook") }, A = g("./doc/enums");
Object.keys(A).forEach((s) => {
e[s] = A[s];
}), C.exports = e;
}, { "./doc/enums": 7, "./doc/workbook": 13, "core-js/modules/es.array.find": 359, "core-js/modules/es.array.find-index": 358, "core-js/modules/es.array.includes": 360, "core-js/modules/es.array.iterator": 361, "core-js/modules/es.number.is-nan": 363, "core-js/modules/es.object.assign": 364, "core-js/modules/es.object.keys": 366, "core-js/modules/es.object.values": 367, "core-js/modules/es.promise": 372, "core-js/modules/es.promise.finally": 371, "core-js/modules/es.string.from-code-point": 376, "core-js/modules/es.string.includes": 377, "core-js/modules/es.symbol": 381, "core-js/modules/es.symbol.async-iterator": 378, "regenerator-runtime/runtime": 492 }], 16: [function(g, C, i) {
const e = typeof TextDecoder > "u" ? null : new TextDecoder("utf-8");
i.bufferToString = function(A) {
return typeof A == "string" ? A : e ? e.decode(A) : A.toString();
};
}, {}], 17: [function(g, C, i) {
const e = typeof TextEncoder > "u" ? null : new TextEncoder("utf-8"), { Buffer: A } = g("buffer");
i.stringToBuffer = function(s) {
return typeof s != "string" ? s : e ? A.from(e.encode(s).buffer) : A.from(s);
};
}, { buffer: 220 }], 18: [function(g, C, i) {
const e = g("./under-dash"), A = g("./col-cache");
C.exports = class {
constructor(s) {
this.template = s, this.sheets = {};
}
addCell(s) {
this.addCellEx(A.decodeEx(s));
}
getCell(s) {
return this.findCellEx(A.decodeEx(s), !0);
}
findCell(s) {
return this.findCellEx(A.decodeEx(s), !1);
}
findCellAt(s, l, n) {
const a = this.sheets[s], d = a && a[l];
return d && d[n];
}
addCellEx(s) {
if (s.top) for (let l = s.top; l <= s.bottom; l++) for (let n = s.left; n <= s.right; n++) this.getCellAt(s.sheetName, l, n);
else this.findCellEx(s, !0);
}
getCellEx(s) {
return this.findCellEx(s, !0);
}
findCellEx(s, l) {
const n = this.findSheet(s, l), a = this.findSheetRow(n, s, l);
return this.findRowCell(a, s, l);
}
getCellAt(s, l, n) {
const a = this.sheets[s] || (this.sheets[s] = []), d = a[l] || (a[l] = []);
return d[n] || (d[n] = { sheetName: s, address: A.n2l(n) + l, row: l, col: n });
}
removeCellEx(s) {
const l = this.findSheet(s);
if (!l) return;
const n = this.findSheetRow(l, s);
n && delete n[s.col];
}
forEachInSheet(s, l) {
const n = this.sheets[s];
n && n.forEach((a, d) => {
a && a.forEach((o, c) => {
o && l(o, d, c);
});
});
}
forEach(s) {
e.each(this.sheets, (l, n) => {
this.forEachInSheet(n, s);
});
}
map(s) {
const l = [];
return this.forEach((n) => {
l.push(s(n));
}), l;
}
findSheet(s, l) {
const n = s.sheetName;
return this.sheets[n] ? this.sheets[n] : l ? this.sheets[n] = [] : void 0;
}
findSheetRow(s, l, n) {
const { row: a } = l;
return s && s[a] ? s[a] : n ? s[a] = [] : void 0;
}
findRowCell(s, l, n) {
const { col: a } = l;
return s && s[a] ? s[a] : n ? s[a] = this.template ? Object.assign(l, JSON.parse(JSON.stringify(this.template))) : l : void 0;
}
spliceRows(s, l, n, a) {
const d = this.sheets[s];
if (d) {
const o = [];
for (let c = 0; c < a; c++) o.push([]);
d.splice(l, n, ...o);
}
}
spliceColumns(s, l, n, a) {
const d = this.sheets[s];
if (d) {
const o = [];
for (let c = 0; c < a; c++) o.push(null);
e.each(d, (c) => {
c.splice(l, n, ...o);
});
}
}
};
}, { "./col-cache": 19, "./under-dash": 26 }], 19: [function(g, C, i) {
const e = /^[A-Z]+\d+$/, A = { _dictionary: ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"], _l2nFill: 0, _l2n: {}, _n2l: [], _level: (s) => s <= 26 ? 1 : s <= 676 ? 2 : 3, _fill(s) {
let l, n, a, d, o, c = 1;
if (s >= 4) throw new Error("Out of bounds. Excel supports columns from 1 to 16384");
if (this._l2nFill < 1 && s >= 1) {
for (; c <= 26; ) l = this._dictionary[c - 1], this._n2l[c] = l, this._l2n[l] = c, c++;
this._l2nFill = 1;
}
if (this._l2nFill < 2 && s >= 2) {
for (c = 27; c <= 702; ) n = c - 27, a = n % 26, d = Math.floor(n / 26), l = this._dictionary[d] + this._dictionary[a], this._n2l[c] = l, this._l2n[l] = c, c++;
this._l2nFill = 2;
}
if (this._l2nFill < 3 && s >= 3) {
for (c = 703; c <= 16384; ) n = c - 703, a = n % 26, d = Math.floor(n / 26) % 26, o = Math.floor(n / 676), l = this._dictionary[o] + this._dictionary[d] + this._dictionary[a], this._n2l[c] = l, this._l2n[l] = c, c++;
this._l2nFill = 3;
}
}, l2n(s) {
if (this._l2n[s] || this._fill(s.length), !this._l2n[s]) throw new Error("Out of bounds. Invalid column letter: " + s);
return this._l2n[s];
}, n2l(s) {
if (s < 1 || s > 16384) throw new Error(s + " is out of bounds. Excel supports columns from 1 to 16384");
return this._n2l[s] || this._fill(this._level(s)), this._n2l[s];
}, _hash: {}, validateAddress(s) {
if (!e.test(s)) throw new Error("Invalid Address: " + s);
return !0;
}, decodeAddress(s) {
const l = s.length < 5 && this._hash[s];
if (l) return l;
let n = !1, a = "", d = 0, o = !1, c = "", r = 0;
for (let b, u = 0; u < s.length; u++) if (b = s.charCodeAt(u), !o && b >= 65 && b <= 90) n = !0, a += s[u], d = 26 * d + b - 64;
else if (b >= 48 && b <= 57) o = !0, c += s[u], r = 10 * r + b - 48;
else if (o && n && b !== 36) break;
if (n) {
if (d > 16384) throw new Error("Out of bounds. Invalid column letter: " + a);
} else d = void 0;
o || (r = void 0);
const h = { address: s = a + c, col: d, row: r, $col$row: `$${a}$${c}` };
return d <= 100 && r <= 100 && (this._hash[s] = h, this._hash[h.$col$row] = h), h;
}, getAddress(s, l) {
if (l) {
const n = this.n2l(l) + s;
return this.decodeAddress(n);
}
return this.decodeAddress(s);
}, decode(s) {
const l = s.split(":");
if (l.length === 2) {
const n = this.decodeAddress(l[0]), a = this.decodeAddress(l[1]), d = { top: Math.min(n.row, a.row), left: Math.min(n.col, a.col), bottom: Math.max(n.row, a.row), right: Math.max(n.col, a.col) };
return d.tl = this.n2l(d.left) + d.top, d.br = this.n2l(d.right) + d.bottom, d.dimensions = `${d.tl}:${d.br}`, d;
}
return this.decodeAddress(s);
}, decodeEx(s) {
const l = s.match(/(?:(?:(?:'((?:[^']|'')*)')|([^'^ !]*))!)?(.*)/), n = l[1] || l[2], a = l[3], d = a.split(":");
if (d.length > 1) {
let c = this.decodeAddress(d[0]), r = this.decodeAddress(d[1]);
const h = Math.min(c.row, r.row), b = Math.min(c.col, r.col), u = Math.max(c.row, r.row), m = Math.max(c.col, r.col);
return c = this.n2l(b) + h, r = this.n2l(m) + u, { top: h, left: b, bottom: u, right: m, sheetName: n, tl: { address: c, col: b, row: h, $col$row: `$${this.n2l(b)}$${h}`, sheetName: n }, br: { address: r, col: m, row: u, $col$row: `$${this.n2l(m)}$${u}`, sheetName: n }, dimensions: `${c}:${r}` };
}
if (a.startsWith("#")) return n ? { sheetName: n, error: a } : { error: a };
const o = this.decodeAddress(a);
return n ? { sheetName: n, ...o } : o;
}, encodeAddress: (s, l) => A.n2l(l) + s, encode() {
switch (arguments.length) {
case 2:
return A.encodeAddress(arguments[0], arguments[1]);
case 4:
return `${A.encodeAddress(arguments[0], arguments[1])}:${A.encodeAddress(arguments[2], arguments[3])}`;
default:
throw new Error("Can only encode with 2 or 4 arguments");
}
}, inRange(s, l) {
const [n, a, , d, o] = s, [c, r] = l;
return c >= n && c <= d && r >= a && r <= o;
} };
C.exports = A;
}, {}], 20: [function(g, C, i) {
const e = (s, l) => ({ ...s, ...l.reduce((n, a) => (s[a] && (n[a] = { ...s[a] }), n), {}) }), A = function(s, l, n) {
let a = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : [];
s[n] && (l[n] = e(s[n], a));
};
i.copyStyle = (s) => {
if (!s) return s;
if (l = s, Object.keys(l).length === 0) return {};
var l;
const n = { ...s };
return A(s, n, "font", ["color"]), A(s, n, "alignment"), A(s, n, "protection"), s.border && (A(s, n, "border"), A(s.border, n.border, "top", ["color"]), A(s.border, n.border, "left", ["color"]), A(s.border, n.border, "bottom", ["color"]), A(s.border, n.border, "right", ["color"]), A(s.border, n.border, "diagonal", ["color"])), s.fill && (A(s, n, "fill", ["fgColor", "bgColor", "center"]), s.fill.stops && (n.fill.stops = s.fill.stops.map((a) => e(a, ["color"])))), n;
};
}, {}], 21: [function(g, C, i) {
(function(e) {
(function() {
const A = g("crypto"), s = { hash(l) {
const n = A.createHash(l);
for (var a = arguments.length, d = new Array(a > 1 ? a - 1 : 0), o = 1; o < a; o++) d[o - 1] = arguments[o];
return n.update(e.concat(d)), n.digest();
}, convertPasswordToHash(l, n, a, d) {
if (n = n.toLowerCase(), A.getHashes().indexOf(n) < 0) throw new Error(`Hash algorithm '${n}' not supported!`);
const o = e.from(l, "utf16le");
let c = this.hash(n, e.from(a, "base64"), o);
for (let r = 0; r < d; r++) {
const h = e.alloc(4);
h.writeUInt32LE(r, 0), c = this.hash(n, c, h);
}
return c.toString("base64");
}, randomBytes: (l) => A.randomBytes(l) };
C.exports = s;
}).call(this);
}).call(this, g("buffer").Buffer);
}, { buffer: 220, crypto: 390 }], 22: [function(g, C, i) {
const { SaxesParser: e } = g("saxes"), { PassThrough: A } = g("readable-stream"), { bufferToString: s } = g("./browser-buffer-decode");
C.exports = async function* (l) {
l.pipe && !l[Symbol.asyncIterator] && (l = l.pipe(new A()));
const n = new e();
let a;
n.on("error", (o) => {
a = o;
});
let d = [];
n.on("opentag", (o) => d.push({ eventType: "opentag", value: o })), n.on("text", (o) => d.push({ eventType: "text", value: o })), n.on("closetag", (o) => d.push({ eventType: "closetag", value: o }));
for await (const o of l) {
if (n.write(s(o)), a) throw a;
yield d, d = [];
}
};
}, { "./browser-buffer-decode": 16, "readable-stream": 491, saxes: 496 }], 23: [function(g, C, i) {
const e = g("./col-cache"), A = /(([a-z_\-0-9]*)!)?([a-z0-9_$]{2,})([(])?/gi, s = /^([$])?([a-z]+)([$])?([1-9][0-9]*)$/i;
C.exports = { slideFormula: function(l, n, a) {
const d = e.decode(n), o = e.decode(a);
return l.replace(A, (c, r, h, b, u) => {
if (u) return c;
const m = s.exec(b);
if (m) {
const Z = m[1], p = m[2].toUpperCase(), Y = m[3], R = m[4];
if (p.length > 3 || p.length === 3 && p > "XFD") return c;
let X = e.l2n(p), H = parseInt(R, 10);
return Z || (X += o.col - d.col), Y || (H += o.row - d.row), (r || "") + (Z || "") + e.n2l(X) + (Y || "") + H;
}
return c;
});
} };
}, { "./col-cache": 19 }], 24: [function(g, C, i) {
(function(e, A) {
(function() {
const s = g("readable-stream"), l = g("./utils"), n = g("./string-buf");
class a {
constructor(b, u) {
this._data = b, this._encoding = u;
}
get length() {
return this.toBuffer().length;
}
copy(b, u, m, Z) {
return this.toBuffer().copy(b, u, m, Z);
}
toBuffer() {
return this._buffer || (this._buffer = A.from(this._data, this._encoding)), this._buffer;
}
}
class d {
constructor(b) {
this._data = b;
}
get length() {
return this._data.length;
}
copy(b, u, m, Z) {
return this._data._buf.copy(b, u, m, Z);
}
toBuffer() {
return this._data.toBuffer();
}
}
class o {
constructor(b) {
this._data = b;
}
get length() {
return this._data.length;
}
copy(b, u, m, Z) {
this._data.copy(b, u, m, Z);
}
toBuffer() {
return this._data;
}
}
class c {
constructor(b) {
this.size = b, this.buffer = A.alloc(b), this.iRead = 0, this.iWrite = 0;
}
toBuffer() {
if (this.iRead === 0 && this.iWrite === this.size) return this.buffer;
const b = A.alloc(this.iWrite - this.iRead);
return this.buffer.copy(b, 0, this.iRead, this.iWrite), b;
}
get length() {
return this.iWrite - this.iRead;
}
get eod() {
return this.iRead === this.iWrite;
}
get full() {
return this.iWrite === this.size;
}
read(b) {
let u;
return b === 0 ? null : b === void 0 || b >= this.length ? (u = this.toBuffer(), this.iRead = this.iWrite, u) : (u = A.alloc(b), this.buffer.copy(u, 0, this.iRead, b), this.iRead += b, u);
}
write(b, u, m) {
const Z = Math.min(m, this.size - this.iWrite);
return b.copy(this.buffer, this.iWrite, u, u + Z), this.iWrite += Z, Z;
}
}
const r = function(h) {
h = h || {}, this.bufSize = h.bufSize || 1048576, this.buffers = [], this.batch = h.batch || !1, this.corked = !1, this.inPos = 0, this.outPos = 0, this.pipes = [], this.paused = !1, this.encoding = null;
};
l.inherits(r, s.Duplex, { toBuffer() {
switch (this.buffers.length) {
case 0:
return null;
case 1:
return this.buffers[0].toBuffer();
default:
return A.concat(this.buffers.map((h) => h.toBuffer()));
}
}, _getWritableBuffer() {
if (this.buffers.length) {
const b = this.buffers[this.buffers.length - 1];
if (!b.full) return b;
}
const h = new c(this.bufSize);
return this.buffers.push(h), h;
}, async _pipe(h) {
await Promise.all(this.pipes.map(function(b) {
return new Promise((u) => {
b.write(h.toBuffer(), () => {
u();
});
});
}));
}, _writeToBuffers(h) {
let b = 0;
const u = h.length;
for (; b < u; )
b += this._getWritableBuffer().write(h, b, u - b);
}, async write(h, b, u) {
let m;
if (b instanceof Function && (u = b, b = "utf8"), u = u || l.nop, h instanceof n) m = new d(h);
else if (h instanceof A) m = new o(h);
else {
if (!(typeof h == "string" || h instanceof String || h instanceof ArrayBuffer)) throw new Error("Chunk must be one of type String, Buffer or StringBuf.");
m = new a(h, b);
}
if (this.pipes.length) if (this.batch) for (this._writeToBuffers(m); !this.corked && this.buffers.length > 1; ) this._pipe(this.buffers.shift());
else this.corked ? (this._writeToBuffers(m), e.nextTick(u)) : (await this._pipe(m), u());
else this.paused || this.emit("data", m.toBuffer()), this._writeToBuffers(m), this.emit("readable");
return !0;
}, cork() {
this.corked = !0;
}, _flush() {
if (this.pipes.length) for (; this.buffers.length; ) this._pipe(this.buffers.shift());
}, uncork() {
this.corked = !1, this._flush();
}, end(h, b, u) {
const m = (Z) => {
Z ? u(Z) : (this._flush(), this.pipes.forEach((p) => {
p.end();
}), this.emit("finish"));
};
h ? this.write(h, b, m) : m();
}, read(h) {
let b;
if (h) {
for (b = []; h && this.buffers.length && !this.buffers[0].eod; ) {
const u = this.buffers[0], m = u.read(h);
h -= m.length, b.push(m), u.eod && u.full && this.buffers.shift();
}
return A.concat(b);
}
return b = this.buffers.map((u) => u.toBuffer()).filter(Boolean), this.buffers = [], A.concat(b);
}, setEncoding(h) {
this.encoding = h;
}, pause() {
this.paused = !0;
}, resume() {
this.paused = !1;
}, isPaused() {
return !!this.paused;
}, pipe(h) {
this.pipes.push(h), !this.paused && this.buffers.length && this.end();
}, unpipe(h) {
this.pipes = this.pipes.filter((b) => b !== h);
}, unshift() {
throw new Error("Not Implemented");
}, wrap() {
throw new Error("Not Implemented");
} }), C.exports = r;
}).call(this);
}).call(this, g("_process"), g("buffer").Buffer);
}, { "./string-buf": 25, "./utils": 27, _process: 467, buffer: 220, "readable-stream": 491 }], 25: [function(g, C, i) {
(function(e) {
(function() {
C.exports = class {
constructor(A) {
this._buf = e.alloc(A && A.size || 16384), this._encoding = A && A.encoding || "utf8", this._inPos = 0, this._buffer = void 0;
}
get length() {
return this._inPos;
}
get capacity() {
return this._buf.length;
}
get buffer() {
return this._buf;
}
toBuffer() {
return this._buffer || (this._buffer = e.alloc(this.length), this._buf.copy(this._buffer, 0, 0, this.length)), this._buffer;
}
reset(A) {
A = A || 0, this._buffer = void 0, this._inPos = A;
}
_grow(A) {
let s = 2 * this._buf.length;
for (; s < A; ) s *= 2;
const l = e.alloc(s);
this._buf.copy(l, 0), this._buf = l;
}
addText(A) {
this._buffer = void 0;
let s = this._inPos + this._buf.write(A, this._inPos, this._encoding);
for (; s >= this._buf.length - 4; ) this._grow(this._inPos + A.length), s = this._inPos + this._buf.write(A, this._inPos, this._encoding);
this._inPos = s;
}
addStringBuf(A) {
A.length && (this._buffer = void 0, this.length + A.length > this.capacity && this._grow(this.length + A.length), A._buf.copy(this._buf, this._inPos, 0, A.length), this._inPos += A.length);
}
};
}).call(this);
}).call(this, g("buffer").Buffer);
}, { buffer: 220 }], 26: [function(g, C, i) {
const { toString: e } = Object.prototype, A = /["&<>]/, s = { each: function(l, n) {
l && (Array.isArray(l) ? l.forEach(n) : Object.keys(l).forEach((a) => {
n(l[a], a);
}));
}, some: function(l, n) {
return !!l && (Array.isArray(l) ? l.some(n) : Object.keys(l).some((a) => n(l[a], a)));
}, every: function(l, n) {
return !l || (Array.isArray(l) ? l.every(n) : Object.keys(l).every((a) => n(l[a], a)));
}, map: function(l, n) {
return l ? Array.isArray(l) ? l.map(n) : Object.keys(l).map((a) => n(l[a], a)) : [];
}, keyBy: (l, n) => l.reduce((a, d) => (a[d[n]] = d, a), {}), isEqual: function(l, n) {
const a = typeof l, d = typeof n, o = Array.isArray(l), c = Array.isArray(n);
let r;
if (a !== d) return !1;
switch (typeof l) {
case "object":
if (o || c) return !(!o || !c) && l.length === n.length && l.every((h, b) => {
const u = n[b];
return s.isEqual(h, u);
});
if (l === null || n === null) return l === n;
if (r = Object.keys(l), Object.keys(n).length !== r.length) return !1;
for (const h of r) if (!n.hasOwnProperty(h)) return !1;
return s.every(l, (h, b) => {
const u = n[b];
return s.isEqual(h, u);
});
default:
return l === n;
}
}, escapeHtml(l) {
const n = A.exec(l);
if (!n) return l;
let a = "", d = "", o = 0, c = n.index;
for (; c < l.length; c++) {
switch (l.charAt(c)) {
case '"':
d = """;
break;
case "&":
d = "&";
break;
case "'":
d = "'";
break;
case "<":
d = "<";
break;
case ">":
d = ">";
break;
default:
continue;
}
o !== c && (a += l.substring(o, c)), o = c + 1, a += d;
}
return o !== c ? a + l.substring(o, c) : a;
}, strcmp: (l, n) => l < n ? -1 : l > n ? 1 : 0, isUndefined: (l) => e.call(l) === "[object Undefined]", isObject: (l) => e.call(l) === "[object Object]", deepMerge() {
const l = arguments[0] || {}, { length: n } = arguments;
let a, d, o;
function c(r, h) {
a = l[h], o = Array.isArray(r), s.isObject(r) || o ? (o ? (o = !1, d = a && Array.isArray(a) ? a : []) : d = a && s.isObject(a) ? a : {}, l[h] = s.deepMerge(d, r)) : s.isUndefined(r) || (l[h] = r);
}
for (let r = 0; r < n; r++) s.each(arguments[r], c);
return l;
} };
C.exports = s;
}, {}], 27: [function(g, C, i) {
(function(e, A) {
(function() {
const s = g("fs"), l = /[<>&'"\x7F\x00-\x08\x0B-\x0C\x0E-\x1F]/, n = { nop() {
}, promiseImmediate: (a) => new Promise((d) => {
e.setImmediate ? A(() => {
d(a);
}) : setTimeout(() => {
d(a);
}, 1);
}), inherits: function(a, d, o, c) {
a.super_ = d, c || (c = o, o = null), o && Object.keys(o).forEach((h) => {
Object.defineProperty(a, h, Object.getOwnPropertyDescriptor(o, h));
});
const r = { constructor: { value: a, enumerable: !1, writable: !1, configurable: !0 } };
c && Object.keys(c).forEach((h) => {
r[h] = Object.getOwnPropertyDescriptor(c, h);
}), a.prototype = Object.create(d.prototype, r);
}, dateToExcel: (a, d) => 25569 + a.getTime() / 864e5 - (d ? 1462 : 0), excelToDate(a, d) {
const o = Math.round(24 * (a - 25569 + (d ? 1462 : 0)) * 3600 * 1e3);
return new Date(o);
}, parsePath(a) {
const d = a.lastIndexOf("/");
return { path: a.substring(0, d), name: a.substring(d + 1) };
}, getRelsPath(a) {
const d = n.parsePath(a);
return `${d.path}/_rels/${d.name}.rels`;
}, xmlEncode(a) {
const d = l.exec(a);
if (!d) return a;
let o = "", c = "", r = 0, h = d.index;
for (; h < a.length; h++) {
const b = a.charCodeAt(h);
switch (b) {
case 34:
c = """;
break;
case 38:
c = "&";
break;
case 39:
c = "'";
break;
case 60:
c = "<";
break;
case 62:
c = ">";
break;
case 127:
c = "";
break;
default:
if (b <= 31 && (b <= 8 || b >= 11 && b !== 13)) {
c = "";
break;
}
continue;
}
r !== h && (o += a.substring(r, h)), r = h + 1, c && (o += c);
}
return r !== h ? o + a.substring(r, h) : o;
}, xmlDecode: (a) => a.replace(/&([a-z]*);/g, (d) => {
switch (d) {
case "<":
return "<";
case ">":
return ">";
case "&":
return "&";
case "'":
return "'";
case """:
return '"';
default:
return d;
}
}), validInt(a) {
const d = parseInt(a, 10);
return Number.isNaN(d) ? 0 : d;
}, isDateFmt(a) {
return a ? (a = (a = a.replace(/\[[^\]]*]/g, "")).replace(/"[^"]*"/g, "")).match(/[ymdhMsb]+/) !== null : !1;
}, fs: { exists: (a) => new Promise((d) => {
s.access(a, s.constants.F_OK, (o) => {
d(!o);
});
}) }, toIsoDateString: (a) => a.toIsoString().subsstr(0, 10), parseBoolean: (a) => a === !0 || a === "true" || a === 1 || a === "1" };
C.exports = n;
}).call(this);
}).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {}, g("timers").setImmediate);
}, { fs: 216, timers: 523 }], 28: [function(g, C, i) {
const e = g("./under-dash"), A = g("./utils");
function s(a, d, o) {
a.push(` ${d}="${A.xmlEncode(o.toString())}"`);
}
function l(a, d) {
if (d) {
const o = [];
e.each(d, (c, r) => {
c !== void 0 && s(o, r, c);
}), a.push(o.join(""));
}
}
class n {
constructor() {
this._xml = [], this._stack = [], this._rollbacks = [];
}
get tos() {
return this._stack.length ? this._stack[this._stack.length - 1] : void 0;
}
get cursor() {
return this._xml.length;
}
openXml(d) {
const o = this._xml;
o.push("
`);
}
openNode(d, o) {
const c = this.tos, r = this._xml;
c && this.open && r.push(">"), this._stack.push(d), r.push("<"), r.push(d), l(r, o), this.leaf = !0, this.open = !0;
}
addAttribute(d, o) {
if (!this.open) throw new Error("Cannot write attributes to node if it is not open");
o !== void 0 && s(this._xml, d, o);
}
addAttributes(d) {
if (!this.open) throw new Error("Cannot write attributes to node if it is not open");
l(this._xml, d);
}
writeText(d) {
const o = this._xml;
this.open && (o.push(">"), this.open = !1), this.leaf = !1, o.push(A.xmlEncode(d.toString()));
}
writeXml(d) {
this.open && (this._xml.push(">"), this.open = !1), this.leaf = !1, this._xml.push(d);
}
closeNode() {
const d = this._stack.pop(), o = this._xml;
this.leaf ? o.push("/>") : (o.push(""), o.push(d), o.push(">")), this.open = !1, this.leaf = !1;
}
leafNode(d, o, c) {
this.openNode(d, o), c !== void 0 && this.writeText(c), this.closeNode();
}
closeAll() {
for (; this._stack.length; ) this.closeNode();
}
addRollback() {
return this._rollbacks.push({ xml: this._xml.length, stack: this._stack.length, leaf: this.leaf, open: this.open }), this.cursor;
}
commit() {
this._rollbacks.pop();
}
rollback() {
const d = this._rollbacks.pop();
this._xml.length > d.xml && this._xml.splice(d.xml, this._xml.length - d.xml), this._stack.length > d.stack && this._stack.splice(d.stack, this._stack.length - d.stack), this.leaf = d.leaf, this.open = d.open;
}
get xml() {
return this.closeAll(), this._xml.join("");
}
}
n.StdDocAttributes = { version: "1.0", encoding: "UTF-8", standalone: "yes" }, C.exports = n;
}, { "./under-dash": 26, "./utils": 27 }], 29: [function(g, C, i) {
(function(e) {
(function() {
const A = g("events"), s = g("jszip"), l = g("./stream-buf"), { stringToBuffer: n } = g("./browser-buffer-encode");
class a extends A.EventEmitter {
constructor(o) {
super(), this.options = Object.assign({ type: "nodebuffer", compression: "DEFLATE" }, o), this.zip = new s(), this.stream = new l();
}
append(o, c) {
c.hasOwnProperty("base64") && c.base64 ? this.zip.file(c.name, o, { base64: !0 }) : (e.browser && typeof o == "string" && (o = n(o)), this.zip.file(c.name, o));
}
async finalize() {
const o = await this.zip.generateAsync(this.options);
this.stream.end(o), this.emit("finish");
}
read(o) {
return this.stream.read(o);
}
setEncoding(o) {
return this.stream.setEncoding(o);
}
pause() {
return this.stream.pause();
}
resume() {
return this.stream.resume();
}
isPaused() {
return this.stream.isPaused();
}
pipe(o, c) {
return this.stream.pipe(o, c);
}
unpipe(o) {
return this.stream.unpipe(o);
}
unshift(o) {
return this.stream.unshift(o);
}
wrap(o) {
return this.stream.wrap(o);
}
}
C.exports = { ZipWriter: a };
}).call(this);
}).call(this, g("_process"));
}, { "./browser-buffer-encode": 17, "./stream-buf": 24, _process: 467, events: 422, jszip: 441 }], 30: [function(g, C, i) {
C.exports = { 0: { f: "General" }, 1: { f: "0" }, 2: { f: "0.00" }, 3: { f: "#,##0" }, 4: { f: "#,##0.00" }, 9: { f: "0%" }, 10: { f: "0.00%" }, 11: { f: "0.00E+00" }, 12: { f: "# ?/?" }, 13: { f: "# ??/??" }, 14: { f: "mm-dd-yy" }, 15: { f: "d-mmm-yy" }, 16: { f: "d-mmm" }, 17: { f: "mmm-yy" }, 18: { f: "h:mm AM/PM" }, 19: { f: "h:mm:ss AM/PM" }, 20: { f: "h:mm" }, 21: { f: "h:mm:ss" }, 22: { f: 'm/d/yy "h":mm' }, 27: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 28: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 29: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 30: { "zh-tw": "m/d/yy ", "zh-cn": "m-d-yy", "ja-jp": "m/d/yy", "ko-kr": "mm-dd-yy" }, 31: { "zh-tw": 'yyyy"年"m"月"d"日"', "zh-cn": 'yyyy"年"m"月"d"日"', "ja-jp": 'yyyy"年"m"月"d"日"', "ko-kr": 'yyyy"년" mm"월" dd"일"' }, 32: { "zh-tw": 'hh"時"mm"分"', "zh-cn": 'h"时"mm"分"', "ja-jp": 'h"時"mm"分"', "ko-kr": 'h"시" mm"분"' }, 33: { "zh-tw": 'hh"時"mm"分"ss"秒"', "zh-cn": 'h"时"mm"分"ss"秒"', "ja-jp": 'h"時"mm"分"ss"秒"', "ko-kr": 'h"시" mm"분" ss"초"' }, 34: { "zh-tw": '上午/下午 hh"時"mm"分"', "zh-cn": '上午/下午 h"时"mm"分"', "ja-jp": 'yyyy"年"m"月"', "ko-kr": "yyyy-mm-dd" }, 35: { "zh-tw": '上午/下午 hh"時"mm"分"ss"秒"', "zh-cn": '上午/下午 h"时"mm"分"ss"秒"', "ja-jp": 'm"月"d"日"', "ko-kr": "yyyy-mm-dd" }, 36: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 37: { f: "#,##0 ;(#,##0)" }, 38: { f: "#,##0 ;[Red](#,##0)" }, 39: { f: "#,##0.00 ;(#,##0.00)" }, 40: { f: "#,##0.00 ;[Red](#,##0.00)" }, 45: { f: "mm:ss" }, 46: { f: "[h]:mm:ss" }, 47: { f: "mmss.0" }, 48: { f: "##0.0E+0" }, 49: { f: "@" }, 50: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 51: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 52: { "zh-tw": '上午/下午 hh"時"mm"分"', "zh-cn": 'yyyy"年"m"月"', "ja-jp": 'yyyy"年"m"月"', "ko-kr": "yyyy-mm-dd" }, 53: { "zh-tw": '上午/下午 hh"時"mm"分"ss"秒"', "zh-cn": 'm"月"d"日"', "ja-jp": 'm"月"d"日"', "ko-kr": "yyyy-mm-dd" }, 54: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 55: { "zh-tw": '上午/下午 hh"時"mm"分"', "zh-cn": '上午/下午 h"时"mm"分"', "ja-jp": 'yyyy"年"m"月"', "ko-kr": "yyyy-mm-dd" }, 56: { "zh-tw": '上午/下午 hh"時"mm"分"ss"秒"', "zh-cn": '上午/下午 h"时"mm"分"ss"秒"', "ja-jp": 'm"月"d"日"', "ko-kr": "yyyy-mm-dd" }, 57: { "zh-tw": "[$-404]e/m/d", "zh-cn": 'yyyy"年"m"月"', "ja-jp": "[$-411]ge.m.d", "ko-kr": 'yyyy"年" mm"月" dd"日"' }, 58: { "zh-tw": '[$-404]e"年"m"月"d"日"', "zh-cn": 'm"月"d"日"', "ja-jp": '[$-411]ggge"年"m"月"d"日"', "ko-kr": "mm-dd" }, 59: { "th-th": "t0" }, 60: { "th-th": "t0.00" }, 61: { "th-th": "t#,##0" }, 62: { "th-th": "t#,##0.00" }, 67: { "th-th": "t0%" }, 68: { "th-th": "t0.00%" }, 69: { "th-th": "t# ?/?" }, 70: { "th-th": "t# ??/??" }, 81: { "th-th": "d/m/bb" } };
}, {}], 31: [function(g, C, i) {
C.exports = { OfficeDocument: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", Worksheet: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet", CalcChain: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain", SharedStrings: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings", Styles: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", Theme: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme", Hyperlink: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", Image: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", CoreProperties: "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties", ExtenderProperties: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties", Comments: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments", VmlDrawing: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing", Table: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table" };
}, {}], 32: [function(g, C, i) {
const e = g("../../utils/parse-sax"), A = g("../../utils/xml-stream");
class s {
prepare() {
}
render() {
}
parseOpen(n) {
}
parseText(n) {
}
parseClose(n) {
}
reconcile(n, a) {
}
reset() {
this.model = null, this.map && Object.values(this.map).forEach((n) => {
n instanceof s ? n.reset() : n.xform && n.xform.reset();
});
}
mergeModel(n) {
this.model = Object.assign(this.model || {}, n);
}
async parse(n) {
for await (const a of n) for (const { eventType: d, value: o } of a) if (d === "opentag") this.parseOpen(o);
else if (d === "text") this.parseText(o);
else if (d === "closetag" && !this.parseClose(o.name)) return this.model;
return this.model;
}
async parseStream(n) {
return this.parse(e(n));
}
get xml() {
return this.toXml(this.model);
}
toXml(n) {
const a = new A();
return this.render(a, n), a.xml;
}
static toAttribute(n, a) {
let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
if (n === void 0) {
if (d) return a;
} else if (d || n !== a) return n.toString();
}
static toStringAttribute(n, a) {
let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
return s.toAttribute(n, a, d);
}
static toStringValue(n, a) {
return n === void 0 ? a : n;
}
static toBoolAttribute(n, a) {
let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
if (n === void 0) {
if (d) return a;
} else if (d || n !== a) return n ? "1" : "0";
}
static toBoolValue(n, a) {
return n === void 0 ? a : n === "1";
}
static toIntAttribute(n, a) {
let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
return s.toAttribute(n, a, d);
}
static toIntValue(n, a) {
return n === void 0 ? a : parseInt(n, 10);
}
static toFloatAttribute(n, a) {
let d = arguments.length > 2 && arguments[2] !== void 0 && arguments[2];
return s.toAttribute(n, a, d);
}
static toFloatValue(n, a) {
return n === void 0 ? a : parseFloat(n);
}
}
C.exports = s;
}, { "../../utils/parse-sax": 22, "../../utils/xml-stream": 28 }], 33: [function(g, C, i) {
const e = g("../base-xform"), A = g("../../../utils/col-cache");
function s(n) {
try {
return A.decodeEx(n), !0;
} catch {
return !1;
}
}
function l(n) {
const a = [];
let d = !1, o = "";
return n.split(",").forEach((c) => {
if (!c) return;
const r = (c.match(/'/g) || []).length;
if (!r) return void (d ? o += c + "," : s(c) && a.push(c));
const h = r % 2 == 0;
!d && h && s(c) ? a.push(c) : d && !h ? (d = !1, s(o + c) && a.push(o + c), o = "") : (d = !0, o += c + ",");
}), a;
}
C.exports = class extends e {
render(n, a) {
n.openNode("definedName", { name: a.name, localSheetId: a.localSheetId }), n.writeText(a.ranges.join(",")), n.closeNode();
}
parseOpen(n) {
switch (n.name) {
case "definedName":
return this._parsedName = n.attributes.name, this._parsedLocalSheetId = n.attributes.localSheetId, this._parsedText = [], !0;
default:
return !1;
}
}
parseText(n) {
this._parsedText.push(n);
}
parseClose() {
return this.model = { name: this._parsedName, ranges: l(this._parsedText.join("")) }, this._parsedLocalSheetId !== void 0 && (this.model.localSheetId = parseInt(this._parsedLocalSheetId, 10)), !1;
}
};
}, { "../../../utils/col-cache": 19, "../base-xform": 32 }], 34: [function(g, C, i) {
const e = g("../../../utils/utils"), A = g("../base-xform");
C.exports = class extends A {
render(s, l) {
s.leafNode("sheet", { sheetId: l.id, name: l.name, state: l.state, "r:id": l.rId });
}
parseOpen(s) {
return s.name === "sheet" && (this.model = { name: e.xmlDecode(s.attributes.name), id: parseInt(s.attributes.sheetId, 10), state: s.attributes.state, rId: s.attributes["r:id"] }, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../../../utils/utils": 27, "../base-xform": 32 }], 35: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
render(A, s) {
A.leafNode("calcPr", { calcId: 171027, fullCalcOnLoad: s.fullCalcOnLoad ? 1 : void 0 });
}
parseOpen(A) {
return A.name === "calcPr" && (this.model = {}, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 36: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
render(A, s) {
A.leafNode("workbookPr", { date1904: s.date1904 ? 1 : void 0, defaultThemeVersion: 164011, filterPrivacy: 1 });
}
parseOpen(A) {
return A.name === "workbookPr" && (this.model = { date1904: A.attributes.date1904 === "1" }, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 37: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
render(A, s) {
const l = { xWindow: s.x || 0, yWindow: s.y || 0, windowWidth: s.width || 12e3, windowHeight: s.height || 24e3, firstSheet: s.firstSheet, activeTab: s.activeTab };
s.visibility && s.visibility !== "visible" && (l.visibility = s.visibility), A.leafNode("workbookView", l);
}
parseOpen(A) {
if (A.name === "workbookView") {
const s = this.model = {}, l = function(a, d, o) {
const c = d !== void 0 ? s[a] = d : o;
c !== void 0 && (s[a] = c);
}, n = function(a, d, o) {
const c = d !== void 0 ? s[a] = parseInt(d, 10) : o;
c !== void 0 && (s[a] = c);
};
return n("x", A.attributes.xWindow, 0), n("y", A.attributes.yWindow, 0), n("width", A.attributes.windowWidth, 25e3), n("height", A.attributes.windowHeight, 1e4), l("visibility", A.attributes.visibility, "visible"), n("activeTab", A.attributes.activeTab, void 0), n("firstSheet", A.attributes.firstSheet, void 0), !0;
}
return !1;
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 38: [function(g, C, i) {
const e = g("../../../utils/under-dash"), A = g("../../../utils/col-cache"), s = g("../../../utils/xml-stream"), l = g("../base-xform"), n = g("../static-xform"), a = g("../list-xform"), d = g("./defined-name-xform"), o = g("./sheet-xform"), c = g("./workbook-view-xform"), r = g("./workbook-properties-xform"), h = g("./workbook-calc-properties-xform");
class b extends l {
constructor() {
super(), this.map = { fileVersion: b.STATIC_XFORMS.fileVersion, workbookPr: new r(), bookViews: new a({ tag: "bookViews", count: !1, childXform: new c() }), sheets: new a({ tag: "sheets", count: !1, childXform: new o() }), definedNames: new a({ tag: "definedNames", count: !1, childXform: new d() }), calcPr: new h() };
}
prepare(m) {
m.sheets = m.worksheets;
const Z = [];
let p = 0;
m.sheets.forEach((Y) => {
if (Y.pageSetup && Y.pageSetup.printArea && Y.pageSetup.printArea.split("&&").forEach((R) => {
const X = R.split(":"), H = { name: "_xlnm.Print_Area", ranges: [`'${Y.name}'!$${X[0]}:$${X[1]}`], localSheetId: p };
Z.push(H);
}), Y.pageSetup && (Y.pageSetup.printTitlesRow || Y.pageSetup.printTitlesColumn)) {
const R = [];
if (Y.pageSetup.printTitlesColumn) {
const H = Y.pageSetup.printTitlesColumn.split(":");
R.push(`'${Y.name}'!$${H[0]}:$${H[1]}`);
}
if (Y.pageSetup.printTitlesRow) {
const H = Y.pageSetup.printTitlesRow.split(":");
R.push(`'${Y.name}'!$${H[0]}:$${H[1]}`);
}
const X = { name: "_xlnm.Print_Titles", ranges: R, localSheetId: p };
Z.push(X);
}
p++;
}), Z.length && (m.definedNames = m.definedNames.concat(Z)), (m.media || []).forEach((Y, R) => {
Y.name = Y.type + (R + 1);
});
}
render(m, Z) {
m.openXml(s.StdDocAttributes), m.openNode("workbook", b.WORKBOOK_ATTRIBUTES), this.map.fileVersion.render(m), this.map.workbookPr.render(m, Z.properties), this.map.bookViews.render(m, Z.views), this.map.sheets.render(m, Z.sheets), this.map.definedNames.render(m, Z.definedNames), this.map.calcPr.render(m, Z.calcProperties), m.closeNode();
}
parseOpen(m) {
if (this.parser) return this.parser.parseOpen(m), !0;
switch (m.name) {
case "workbook":
return !0;
default:
return this.parser = this.map[m.name], this.parser && this.parser.parseOpen(m), !0;
}
}
parseText(m) {
this.parser && this.parser.parseText(m);
}
parseClose(m) {
if (this.parser) return this.parser.parseClose(m) || (this.parser = void 0), !0;
switch (m) {
case "workbook":
return this.model = { sheets: this.map.sheets.model, properties: this.map.workbookPr.model || {}, views: this.map.bookViews.model, calcProperties: {} }, this.map.definedNames.model && (this.model.definedNames = this.map.definedNames.model), !1;
default:
return !0;
}
}
reconcile(m) {
const Z = (m.workbookRels || []).reduce((H, S) => (H[S.Id] = S, H), {}), p = [];
let Y, R = 0;
(m.sheets || []).forEach((H) => {
const S = Z[H.rId];
S && (Y = m.worksheetHash["xl/" + S.Target.replace(/^(\s|\/xl\/)+/, "")], Y && (Y.name = H.name, Y.id = H.id, Y.state = H.state, p[R++] = Y));
});
const X = [];
e.each(m.definedNames, (H) => {
if (H.name === "_xlnm.Print_Area") {
if (Y = p[H.localSheetId], Y) {
Y.pageSetup || (Y.pageSetup = {});
const S = A.decodeEx(H.ranges[0]);
Y.pageSetup.printArea = Y.pageSetup.printArea ? `${Y.pageSetup.printArea}&&${S.dimensions}` : S.dimensions;
}
} else if (H.name === "_xlnm.Print_Titles") {
if (Y = p[H.localSheetId], Y) {
Y.pageSetup || (Y.pageSetup = {});
const S = H.ranges.join(","), z = /\$/g, v = /\$\d+:\$\d+/, K = S.match(v);
if (K && K.length) {
const B = K[0];
Y.pageSetup.printTitlesRow = B.replace(z, "");
}
const V = /\$[A-Z]+:\$[A-Z]+/, N = S.match(V);
if (N && N.length) {
const B = N[0];
Y.pageSetup.printTitlesColumn = B.replace(z, "");
}
}
} else X.push(H);
}), m.definedNames = X, m.media.forEach((H, S) => {
H.index = S;
});
}
}
b.WORKBOOK_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "x15", "xmlns:x15": "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main" }, b.STATIC_XFORMS = { fileVersion: new n({ tag: "fileVersion", $: { appName: "xl", lastEdited: 5, lowestEdited: 5, rupBuild: 9303 } }) }, C.exports = b;
}, { "../../../utils/col-cache": 19, "../../../utils/under-dash": 26, "../../../utils/xml-stream": 28, "../base-xform": 32, "../list-xform": 71, "../static-xform": 120, "./defined-name-xform": 33, "./sheet-xform": 34, "./workbook-calc-properties-xform": 35, "./workbook-properties-xform": 36, "./workbook-view-xform": 37 }], 39: [function(g, C, i) {
const e = g("../strings/rich-text-xform"), A = g("../../../utils/utils"), s = g("../base-xform"), l = C.exports = function(n) {
this.model = n;
};
A.inherits(l, s, { get tag() {
return "r";
}, get richTextXform() {
return this._richTextXform || (this._richTextXform = new e()), this._richTextXform;
}, render(n, a) {
a = a || this.model, n.openNode("comment", { ref: a.ref, authorId: 0 }), n.openNode("text"), a && a.note && a.note.texts && a.note.texts.forEach((d) => {
this.richTextXform.render(n, d);
}), n.closeNode(), n.closeNode();
}, parseOpen(n) {
if (this.parser) return this.parser.parseOpen(n), !0;
switch (n.name) {
case "comment":
return this.model = { type: "note", note: { texts: [] }, ...n.attributes }, !0;
case "r":
return this.parser = this.richTextXform, this.parser.parseOpen(n), !0;
default:
return !1;
}
}, parseText(n) {
this.parser && this.parser.parseText(n);
}, parseClose(n) {
switch (n) {
case "comment":
return !1;
case "r":
return this.model.note.texts.push(this.parser.model), this.parser = void 0, !0;
default:
return this.parser && this.parser.parseClose(n), !0;
}
} });
}, { "../../../utils/utils": 27, "../base-xform": 32, "../strings/rich-text-xform": 122 }], 40: [function(g, C, i) {
const e = g("../../../utils/xml-stream"), A = g("../../../utils/utils"), s = g("../base-xform"), l = g("./comment-xform"), n = C.exports = function() {
this.map = { comment: new l() };
};
A.inherits(n, s, { COMMENTS_ATTRIBUTES: { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main" } }, { render(a, d) {
d = d || this.model, a.openXml(e.StdDocAttributes), a.openNode("comments", n.COMMENTS_ATTRIBUTES), a.openNode("authors"), a.leafNode("author", null, "Author"), a.closeNode(), a.openNode("commentList"), d.comments.forEach((o) => {
this.map.comment.render(a, o);
}), a.closeNode(), a.closeNode();
}, parseOpen(a) {
if (this.parser) return this.parser.parseOpen(a), !0;
switch (a.name) {
case "commentList":
return this.model = { comments: [] }, !0;
case "comment":
return this.parser = this.map.comment, this.parser.parseOpen(a), !0;
default:
return !1;
}
}, parseText(a) {
this.parser && this.parser.parseText(a);
}, parseClose(a) {
switch (a) {
case "commentList":
return !1;
case "comment":
return this.model.comments.push(this.parser.model), this.parser = void 0, !0;
default:
return this.parser && this.parser.parseClose(a), !0;
}
} });
}, { "../../../utils/utils": 27, "../../../utils/xml-stream": 28, "../base-xform": 32, "./comment-xform": 39 }], 41: [function(g, C, i) {
const e = g("../../base-xform");
C.exports = class extends e {
constructor(A) {
super(), this._model = A;
}
get tag() {
return this._model && this._model.tag;
}
render(A, s, l) {
(s === l[2] || this.tag === "x:SizeWithCells" && s === l[1]) && A.leafNode(this.tag);
}
parseOpen(A) {
switch (A.name) {
case this.tag:
return this.model = {}, this.model[this.tag] = !0, !0;
default:
return !1;
}
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../../base-xform": 32 }], 42: [function(g, C, i) {
const e = g("../../base-xform");
C.exports = class extends e {
constructor(A) {
super(), this._model = A;
}
get tag() {
return this._model && this._model.tag;
}
render(A, s) {
A.leafNode(this.tag, null, s);
}
parseOpen(A) {
switch (A.name) {
case this.tag:
return this.text = "", !0;
default:
return !1;
}
}
parseText(A) {
this.text = A;
}
parseClose() {
return !1;
}
};
}, { "../../base-xform": 32 }], 43: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "x:Anchor";
}
getAnchorRect(A) {
const s = Math.floor(A.left), l = Math.floor(68 * (A.left - s)), n = Math.floor(A.top), a = Math.floor(18 * (A.top - n)), d = Math.floor(A.right), o = Math.floor(68 * (A.right - d)), c = Math.floor(A.bottom);
return [s, l, n, a, d, o, c, Math.floor(18 * (A.bottom - c))];
}
getDefaultRect(A) {
const s = A.col, l = Math.max(A.row - 2, 0);
return [s, 6, l, 14, s + 2, 2, l + 4, 16];
}
render(A, s) {
const l = s.anchor ? this.getAnchorRect(s.anchor) : this.getDefaultRect(s.refAddress);
A.leafNode("x:Anchor", null, l.join(", "));
}
parseOpen(A) {
switch (A.name) {
case this.tag:
return this.text = "", !0;
default:
return !1;
}
}
parseText(A) {
this.text = A;
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 44: [function(g, C, i) {
const e = g("../base-xform"), A = g("./vml-anchor-xform"), s = g("./style/vml-protection-xform"), l = g("./style/vml-position-xform"), n = ["twoCells", "oneCells", "absolute"];
C.exports = class extends e {
constructor() {
super(), this.map = { "x:Anchor": new A(), "x:Locked": new s({ tag: "x:Locked" }), "x:LockText": new s({ tag: "x:LockText" }), "x:SizeWithCells": new l({ tag: "x:SizeWithCells" }), "x:MoveWithCells": new l({ tag: "x:MoveWithCells" }) };
}
get tag() {
return "x:ClientData";
}
render(a, d) {
const { protection: o, editAs: c } = d.note;
a.openNode(this.tag, { ObjectType: "Note" }), this.map["x:MoveWithCells"].render(a, c, n), this.map["x:SizeWithCells"].render(a, c, n), this.map["x:Anchor"].render(a, d), this.map["x:Locked"].render(a, o.locked), a.leafNode("x:AutoFill", null, "False"), this.map["x:LockText"].render(a, o.lockText), a.leafNode("x:Row", null, d.refAddress.row - 1), a.leafNode("x:Column", null, d.refAddress.col - 1), a.closeNode();
}
parseOpen(a) {
switch (a.name) {
case this.tag:
this.reset(), this.model = { anchor: [], protection: {}, editAs: "" };
break;
default:
this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
}
return !0;
}
parseText(a) {
this.parser && this.parser.parseText(a);
}
parseClose(a) {
if (this.parser) return this.parser.parseClose(a) || (this.parser = void 0), !0;
switch (a) {
case this.tag:
return this.normalizeModel(), !1;
default:
return !0;
}
}
normalizeModel() {
const a = Object.assign({}, this.map["x:MoveWithCells"].model, this.map["x:SizeWithCells"].model), d = Object.keys(a).length;
this.model.editAs = n[d], this.model.anchor = this.map["x:Anchor"].text, this.model.protection.locked = this.map["x:Locked"].text, this.model.protection.lockText = this.map["x:LockText"].text;
}
};
}, { "../base-xform": 32, "./style/vml-position-xform": 41, "./style/vml-protection-xform": 42, "./vml-anchor-xform": 43 }], 45: [function(g, C, i) {
const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("./vml-shape-xform");
class l extends A {
constructor() {
super(), this.map = { "v:shape": new s() };
}
get tag() {
return "xml";
}
render(a, d) {
a.openXml(e.StdDocAttributes), a.openNode(this.tag, l.DRAWING_ATTRIBUTES), a.openNode("o:shapelayout", { "v:ext": "edit" }), a.leafNode("o:idmap", { "v:ext": "edit", data: 1 }), a.closeNode(), a.openNode("v:shapetype", { id: "_x0000_t202", coordsize: "21600,21600", "o:spt": 202, path: "m,l,21600r21600,l21600,xe" }), a.leafNode("v:stroke", { joinstyle: "miter" }), a.leafNode("v:path", { gradientshapeok: "t", "o:connecttype": "rect" }), a.closeNode(), d.comments.forEach((o, c) => {
this.map["v:shape"].render(a, o, c);
}), a.closeNode();
}
parseOpen(a) {
if (this.parser) return this.parser.parseOpen(a), !0;
switch (a.name) {
case this.tag:
this.reset(), this.model = { comments: [] };
break;
default:
this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
}
return !0;
}
parseText(a) {
this.parser && this.parser.parseText(a);
}
parseClose(a) {
if (this.parser) return this.parser.parseClose(a) || (this.model.comments.push(this.parser.model), this.parser = void 0), !0;
switch (a) {
case this.tag:
return !1;
default:
return !0;
}
}
reconcile(a, d) {
a.anchors.forEach((o) => {
o.br ? this.map["xdr:twoCellAnchor"].reconcile(o, d) : this.map["xdr:oneCellAnchor"].reconcile(o, d);
});
}
}
l.DRAWING_ATTRIBUTES = { "xmlns:v": "urn:schemas-microsoft-com:vml", "xmlns:o": "urn:schemas-microsoft-com:office:office", "xmlns:x": "urn:schemas-microsoft-com:office:excel" }, C.exports = l;
}, { "../../../utils/xml-stream": 28, "../base-xform": 32, "./vml-shape-xform": 46 }], 46: [function(g, C, i) {
const e = g("../base-xform"), A = g("./vml-textbox-xform"), s = g("./vml-client-data-xform");
class l extends e {
constructor() {
super(), this.map = { "v:textbox": new A(), "x:ClientData": new s() };
}
get tag() {
return "v:shape";
}
render(a, d, o) {
a.openNode("v:shape", l.V_SHAPE_ATTRIBUTES(d, o)), a.leafNode("v:fill", { color2: "infoBackground [80]" }), a.leafNode("v:shadow", { color: "none [81]", obscured: "t" }), a.leafNode("v:path", { "o:connecttype": "none" }), this.map["v:textbox"].render(a, d), this.map["x:ClientData"].render(a, d), a.closeNode();
}
parseOpen(a) {
if (this.parser) return this.parser.parseOpen(a), !0;
switch (a.name) {
case this.tag:
this.reset(), this.model = { margins: { insetmode: a.attributes["o:insetmode"] }, anchor: "", editAs: "", protection: {} };
break;
default:
this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
}
return !0;
}
parseText(a) {
this.parser && this.parser.parseText(a);
}
parseClose(a) {
if (this.parser) return this.parser.parseClose(a) || (this.parser = void 0), !0;
switch (a) {
case this.tag:
return this.model.margins.inset = this.map["v:textbox"].model && this.map["v:textbox"].model.inset, this.model.protection = this.map["x:ClientData"].model && this.map["x:ClientData"].model.protection, this.model.anchor = this.map["x:ClientData"].model && this.map["x:ClientData"].model.anchor, this.model.editAs = this.map["x:ClientData"].model && this.map["x:ClientData"].model.editAs, !1;
default:
return !0;
}
}
}
l.V_SHAPE_ATTRIBUTES = (n, a) => ({ id: "_x0000_s" + (1025 + a), type: "#_x0000_t202", style: "position:absolute; margin-left:105.3pt;margin-top:10.5pt;width:97.8pt;height:59.1pt;z-index:1;visibility:hidden", fillcolor: "infoBackground [80]", strokecolor: "none [81]", "o:insetmode": n.note.margins && n.note.margins.insetmode }), C.exports = l;
}, { "../base-xform": 32, "./vml-client-data-xform": 44, "./vml-textbox-xform": 47 }], 47: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "v:textbox";
}
conversionUnit(A, s, l) {
return `${parseFloat(A) * s.toFixed(2)}${l}`;
}
reverseConversionUnit(A) {
return (A || "").split(",").map((s) => Number(parseFloat(this.conversionUnit(parseFloat(s), 0.1, "")).toFixed(2)));
}
render(A, s) {
const l = { style: "mso-direction-alt:auto" };
if (s && s.note) {
let { inset: n } = s.note && s.note.margins;
Array.isArray(n) && (n = n.map((a) => this.conversionUnit(a, 10, "mm")).join(",")), n && (l.inset = n);
}
A.openNode("v:textbox", l), A.leafNode("div", { style: "text-align:left" }), A.closeNode();
}
parseOpen(A) {
switch (A.name) {
case this.tag:
return this.model = { inset: this.reverseConversionUnit(A.attributes.inset) }, !0;
default:
return !0;
}
}
parseText() {
}
parseClose(A) {
switch (A) {
case this.tag:
return !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32 }], 48: [function(g, C, i) {
const e = g("./base-xform");
C.exports = class extends e {
createNewModel(A) {
return {};
}
parseOpen(A) {
return this.parser = this.parser || this.map[A.name], this.parser ? (this.parser.parseOpen(A), !0) : A.name === this.tag && (this.model = this.createNewModel(A), !0);
}
parseText(A) {
this.parser && this.parser.parseText(A);
}
onParserClose(A, s) {
this.model[A] = s.model;
}
parseClose(A) {
return this.parser ? (this.parser.parseClose(A) || (this.onParserClose(A, this.parser), this.parser = void 0), !0) : A !== this.tag;
}
};
}, { "./base-xform": 32 }], 49: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
render(A, s) {
A.openNode("HeadingPairs"), A.openNode("vt:vector", { size: 2, baseType: "variant" }), A.openNode("vt:variant"), A.leafNode("vt:lpstr", void 0, "Worksheets"), A.closeNode(), A.openNode("vt:variant"), A.leafNode("vt:i4", void 0, s.length), A.closeNode(), A.closeNode(), A.closeNode();
}
parseOpen(A) {
return A.name === "HeadingPairs";
}
parseText() {
}
parseClose(A) {
return A !== "HeadingPairs";
}
};
}, { "../base-xform": 32 }], 50: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
render(A, s) {
A.openNode("TitlesOfParts"), A.openNode("vt:vector", { size: s.length, baseType: "lpstr" }), s.forEach((l) => {
A.leafNode("vt:lpstr", void 0, l.name);
}), A.closeNode(), A.closeNode();
}
parseOpen(A) {
return A.name === "TitlesOfParts";
}
parseText() {
}
parseClose(A) {
return A !== "TitlesOfParts";
}
};
}, { "../base-xform": 32 }], 51: [function(g, C, i) {
const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("../simple/string-xform"), l = g("./app-heading-pairs-xform"), n = g("./app-titles-of-parts-xform");
class a extends A {
constructor() {
super(), this.map = { Company: new s({ tag: "Company" }), Manager: new s({ tag: "Manager" }), HeadingPairs: new l(), TitleOfParts: new n() };
}
render(o, c) {
o.openXml(e.StdDocAttributes), o.openNode("Properties", a.PROPERTY_ATTRIBUTES), o.leafNode("Application", void 0, "Microsoft Excel"), o.leafNode("DocSecurity", void 0, "0"), o.leafNode("ScaleCrop", void 0, "false"), this.map.HeadingPairs.render(o, c.worksheets), this.map.TitleOfParts.render(o, c.worksheets), this.map.Company.render(o, c.company || ""), this.map.Manager.render(o, c.manager), o.leafNode("LinksUpToDate", void 0, "false"), o.leafNode("SharedDoc", void 0, "false"), o.leafNode("HyperlinksChanged", void 0, "false"), o.leafNode("AppVersion", void 0, "16.0300"), o.closeNode();
}
parseOpen(o) {
if (this.parser) return this.parser.parseOpen(o), !0;
switch (o.name) {
case "Properties":
return !0;
default:
return this.parser = this.map[o.name], !!this.parser && (this.parser.parseOpen(o), !0);
}
}
parseText(o) {
this.parser && this.parser.parseText(o);
}
parseClose(o) {
if (this.parser) return this.parser.parseClose(o) || (this.parser = void 0), !0;
switch (o) {
case "Properties":
return this.model = { worksheets: this.map.TitleOfParts.model, company: this.map.Company.model, manager: this.map.Manager.model }, !1;
default:
return !0;
}
}
}
a.DateFormat = function(d) {
return d.toISOString().replace(/[.]\d{3,6}/, "");
}, a.DateAttrs = { "xsi:type": "dcterms:W3CDTF" }, a.PROPERTY_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties", "xmlns:vt": "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" }, C.exports = a;
}, { "../../../utils/xml-stream": 28, "../base-xform": 32, "../simple/string-xform": 119, "./app-heading-pairs-xform": 49, "./app-titles-of-parts-xform": 50 }], 52: [function(g, C, i) {
const e = g("../../../utils/xml-stream"), A = g("../base-xform");
class s extends A {
render(n, a) {
n.openXml(e.StdDocAttributes), n.openNode("Types", s.PROPERTY_ATTRIBUTES);
const d = {};
(a.media || []).forEach((o) => {
if (o.type === "image") {
const c = o.extension;
d[c] || (d[c] = !0, n.leafNode("Default", { Extension: c, ContentType: "image/" + c }));
}
}), n.leafNode("Default", { Extension: "rels", ContentType: "application/vnd.openxmlformats-package.relationships+xml" }), n.leafNode("Default", { Extension: "xml", ContentType: "application/xml" }), n.leafNode("Override", { PartName: "/xl/workbook.xml", ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" }), a.worksheets.forEach((o) => {
const c = `/xl/worksheets/sheet${o.id}.xml`;
n.leafNode("Override", { PartName: c, ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" });
}), n.leafNode("Override", { PartName: "/xl/theme/theme1.xml", ContentType: "application/vnd.openxmlformats-officedocument.theme+xml" }), n.leafNode("Override", { PartName: "/xl/styles.xml", ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" }), a.sharedStrings && a.sharedStrings.count && n.leafNode("Override", { PartName: "/xl/sharedStrings.xml", ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" }), a.tables && a.tables.forEach((o) => {
n.leafNode("Override", { PartName: "/xl/tables/" + o.target, ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml" });
}), a.drawings && a.drawings.forEach((o) => {
n.leafNode("Override", { PartName: `/xl/drawings/${o.name}.xml`, ContentType: "application/vnd.openxmlformats-officedocument.drawing+xml" });
}), a.commentRefs && (n.leafNode("Default", { Extension: "vml", ContentType: "application/vnd.openxmlformats-officedocument.vmlDrawing" }), a.commentRefs.forEach((o) => {
let { commentName: c } = o;
n.leafNode("Override", { PartName: `/xl/${c}.xml`, ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml" });
})), n.leafNode("Override", { PartName: "/docProps/core.xml", ContentType: "application/vnd.openxmlformats-package.core-properties+xml" }), n.leafNode("Override", { PartName: "/docProps/app.xml", ContentType: "application/vnd.openxmlformats-officedocument.extended-properties+xml" }), n.closeNode();
}
parseOpen() {
return !1;
}
parseText() {
}
parseClose() {
return !1;
}
}
s.PROPERTY_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/package/2006/content-types" }, C.exports = s;
}, { "../../../utils/xml-stream": 28, "../base-xform": 32 }], 53: [function(g, C, i) {
const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("../simple/date-xform"), l = g("../simple/string-xform"), n = g("../simple/integer-xform");
class a extends A {
constructor() {
super(), this.map = { "dc:creator": new l({ tag: "dc:creator" }), "dc:title": new l({ tag: "dc:title" }), "dc:subject": new l({ tag: "dc:subject" }), "dc:description": new l({ tag: "dc:description" }), "dc:identifier": new l({ tag: "dc:identifier" }), "dc:language": new l({ tag: "dc:language" }), "cp:keywords": new l({ tag: "cp:keywords" }), "cp:category": new l({ tag: "cp:category" }), "cp:lastModifiedBy": new l({ tag: "cp:lastModifiedBy" }), "cp:lastPrinted": new s({ tag: "cp:lastPrinted", format: a.DateFormat }), "cp:revision": new n({ tag: "cp:revision" }), "cp:version": new l({ tag: "cp:version" }), "cp:contentStatus": new l({ tag: "cp:contentStatus" }), "cp:contentType": new l({ tag: "cp:contentType" }), "dcterms:created": new s({ tag: "dcterms:created", attrs: a.DateAttrs, format: a.DateFormat }), "dcterms:modified": new s({ tag: "dcterms:modified", attrs: a.DateAttrs, format: a.DateFormat }) };
}
render(o, c) {
o.openXml(e.StdDocAttributes), o.openNode("cp:coreProperties", a.CORE_PROPERTY_ATTRIBUTES), this.map["dc:creator"].render(o, c.creator), this.map["dc:title"].render(o, c.title), this.map["dc:subject"].render(o, c.subject), this.map["dc:description"].render(o, c.description), this.map["dc:identifier"].render(o, c.identifier), this.map["dc:language"].render(o, c.language), this.map["cp:keywords"].render(o, c.keywords), this.map["cp:category"].render(o, c.category), this.map["cp:lastModifiedBy"].render(o, c.lastModifiedBy), this.map["cp:lastPrinted"].render(o, c.lastPrinted), this.map["cp:revision"].render(o, c.revision), this.map["cp:version"].render(o, c.version), this.map["cp:contentStatus"].render(o, c.contentStatus), this.map["cp:contentType"].render(o, c.contentType), this.map["dcterms:created"].render(o, c.created), this.map["dcterms:modified"].render(o, c.modified), o.closeNode();
}
parseOpen(o) {
if (this.parser) return this.parser.parseOpen(o), !0;
switch (o.name) {
case "cp:coreProperties":
case "coreProperties":
return !0;
default:
if (this.parser = this.map[o.name], this.parser) return this.parser.parseOpen(o), !0;
throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(o));
}
}
parseText(o) {
this.parser && this.parser.parseText(o);
}
parseClose(o) {
if (this.parser) return this.parser.parseClose(o) || (this.parser = void 0), !0;
switch (o) {
case "cp:coreProperties":
case "coreProperties":
return this.model = { creator: this.map["dc:creator"].model, title: this.map["dc:title"].model, subject: this.map["dc:subject"].model, description: this.map["dc:description"].model, identifier: this.map["dc:identifier"].model, language: this.map["dc:language"].model, keywords: this.map["cp:keywords"].model, category: this.map["cp:category"].model, lastModifiedBy: this.map["cp:lastModifiedBy"].model, lastPrinted: this.map["cp:lastPrinted"].model, revision: this.map["cp:revision"].model, contentStatus: this.map["cp:contentStatus"].model, contentType: this.map["cp:contentType"].model, created: this.map["dcterms:created"].model, modified: this.map["dcterms:modified"].model }, !1;
default:
throw new Error("Unexpected xml node in parseClose: " + o);
}
}
}
a.DateFormat = function(d) {
return d.toISOString().replace(/[.]\d{3}/, "");
}, a.DateAttrs = { "xsi:type": "dcterms:W3CDTF" }, a.CORE_PROPERTY_ATTRIBUTES = { "xmlns:cp": "http://schemas.openxmlformats.org/package/2006/metadata/core-properties", "xmlns:dc": "http://purl.org/dc/elements/1.1/", "xmlns:dcterms": "http://purl.org/dc/terms/", "xmlns:dcmitype": "http://purl.org/dc/dcmitype/", "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance" }, C.exports = a;
}, { "../../../utils/xml-stream": 28, "../base-xform": 32, "../simple/date-xform": 117, "../simple/integer-xform": 118, "../simple/string-xform": 119 }], 54: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
render(A, s) {
A.leafNode("Relationship", s);
}
parseOpen(A) {
switch (A.name) {
case "Relationship":
return this.model = A.attributes, !0;
default:
return !1;
}
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 55: [function(g, C, i) {
const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("./relationship-xform");
class l extends A {
constructor() {
super(), this.map = { Relationship: new s() };
}
render(a, d) {
d = d || this._values, a.openXml(e.StdDocAttributes), a.openNode("Relationships", l.RELATIONSHIPS_ATTRIBUTES), d.forEach((o) => {
this.map.Relationship.render(a, o);
}), a.closeNode();
}
parseOpen(a) {
if (this.parser) return this.parser.parseOpen(a), !0;
switch (a.name) {
case "Relationships":
return this.model = [], !0;
default:
if (this.parser = this.map[a.name], this.parser) return this.parser.parseOpen(a), !0;
throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(a));
}
}
parseText(a) {
this.parser && this.parser.parseText(a);
}
parseClose(a) {
if (this.parser) return this.parser.parseClose(a) || (this.model.push(this.parser.model), this.parser = void 0), !0;
switch (a) {
case "Relationships":
return !1;
default:
throw new Error("Unexpected xml node in parseClose: " + a);
}
}
}
l.RELATIONSHIPS_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/package/2006/relationships" }, C.exports = l;
}, { "../../../utils/xml-stream": 28, "../base-xform": 32, "./relationship-xform": 54 }], 56: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
parseOpen(A) {
if (this.parser) return this.parser.parseOpen(A), !0;
switch (A.name) {
case this.tag:
this.reset(), this.model = { range: { editAs: A.attributes.editAs || "oneCell" } };
break;
default:
this.parser = this.map[A.name], this.parser && this.parser.parseOpen(A);
}
return !0;
}
parseText(A) {
this.parser && this.parser.parseText(A);
}
reconcilePicture(A, s) {
if (A && A.rId) {
const l = s.rels[A.rId].Target.match(/.*\/media\/(.+[.][a-zA-Z]{3,4})/);
if (l) {
const n = l[1], a = s.mediaIndex[n];
return s.media[a];
}
}
}
};
}, { "../base-xform": 32 }], 57: [function(g, C, i) {
const e = g("../base-xform"), A = g("./blip-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { "a:blip": new A() };
}
get tag() {
return "xdr:blipFill";
}
render(s, l) {
s.openNode(this.tag), this.map["a:blip"].render(s, l), s.openNode("a:stretch"), s.leafNode("a:fillRect"), s.closeNode(), s.closeNode();
}
parseOpen(s) {
if (this.parser) return this.parser.parseOpen(s), !0;
switch (s.name) {
case this.tag:
this.reset();
break;
default:
this.parser = this.map[s.name], this.parser && this.parser.parseOpen(s);
}
return !0;
}
parseText() {
}
parseClose(s) {
if (this.parser) return this.parser.parseClose(s) || (this.parser = void 0), !0;
switch (s) {
case this.tag:
return this.model = this.map["a:blip"].model, !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32, "./blip-xform": 58 }], 58: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "a:blip";
}
render(A, s) {
A.leafNode(this.tag, { "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "r:embed": s.rId, cstate: "print" });
}
parseOpen(A) {
switch (A.name) {
case this.tag:
return this.model = { rId: A.attributes["r:embed"] }, !0;
default:
return !0;
}
}
parseText() {
}
parseClose(A) {
switch (A) {
case this.tag:
return !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32 }], 59: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "xdr:cNvPicPr";
}
render(A) {
A.openNode(this.tag), A.leafNode("a:picLocks", { noChangeAspect: "1" }), A.closeNode();
}
parseOpen(A) {
switch (A.name) {
case this.tag:
default:
return !0;
}
}
parseText() {
}
parseClose(A) {
switch (A) {
case this.tag:
return !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32 }], 60: [function(g, C, i) {
const e = g("../base-xform"), A = g("./hlink-click-xform"), s = g("./ext-lst-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { "a:hlinkClick": new A(), "a:extLst": new s() };
}
get tag() {
return "xdr:cNvPr";
}
render(l, n) {
l.openNode(this.tag, { id: n.index, name: "Picture " + n.index }), this.map["a:hlinkClick"].render(l, n), this.map["a:extLst"].render(l, n), l.closeNode();
}
parseOpen(l) {
if (this.parser) return this.parser.parseOpen(l), !0;
switch (l.name) {
case this.tag:
this.reset();
break;
default:
this.parser = this.map[l.name], this.parser && this.parser.parseOpen(l);
}
return !0;
}
parseText() {
}
parseClose(l) {
if (this.parser) return this.parser.parseClose(l) || (this.parser = void 0), !0;
switch (l) {
case this.tag:
return this.model = this.map["a:hlinkClick"].model, !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32, "./ext-lst-xform": 63, "./hlink-click-xform": 65 }], 61: [function(g, C, i) {
const e = g("../base-xform"), A = g("../simple/integer-xform");
C.exports = class extends e {
constructor(s) {
super(), this.tag = s.tag, this.map = { "xdr:col": new A({ tag: "xdr:col", zero: !0 }), "xdr:colOff": new A({ tag: "xdr:colOff", zero: !0 }), "xdr:row": new A({ tag: "xdr:row", zero: !0 }), "xdr:rowOff": new A({ tag: "xdr:rowOff", zero: !0 }) };
}
render(s, l) {
s.openNode(this.tag), this.map["xdr:col"].render(s, l.nativeCol), this.map["xdr:colOff"].render(s, l.nativeColOff), this.map["xdr:row"].render(s, l.nativeRow), this.map["xdr:rowOff"].render(s, l.nativeRowOff), s.closeNode();
}
parseOpen(s) {
if (this.parser) return this.parser.parseOpen(s), !0;
switch (s.name) {
case this.tag:
this.reset();
break;
default:
this.parser = this.map[s.name], this.parser && this.parser.parseOpen(s);
}
return !0;
}
parseText(s) {
this.parser && this.parser.parseText(s);
}
parseClose(s) {
if (this.parser) return this.parser.parseClose(s) || (this.parser = void 0), !0;
switch (s) {
case this.tag:
return this.model = { nativeCol: this.map["xdr:col"].model, nativeColOff: this.map["xdr:colOff"].model, nativeRow: this.map["xdr:row"].model, nativeRowOff: this.map["xdr:rowOff"].model }, !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32, "../simple/integer-xform": 118 }], 62: [function(g, C, i) {
const e = g("../../../utils/col-cache"), A = g("../../../utils/xml-stream"), s = g("../base-xform"), l = g("./two-cell-anchor-xform"), n = g("./one-cell-anchor-xform");
class a extends s {
constructor() {
super(), this.map = { "xdr:twoCellAnchor": new l(), "xdr:oneCellAnchor": new n() };
}
prepare(o) {
o.anchors.forEach((c, r) => {
c.anchorType = function(h) {
return (typeof h.range == "string" ? e.decode(h.range) : h.range).br ? "xdr:twoCellAnchor" : "xdr:oneCellAnchor";
}(c), this.map[c.anchorType].prepare(c, { index: r });
});
}
get tag() {
return "xdr:wsDr";
}
render(o, c) {
o.openXml(A.StdDocAttributes), o.openNode(this.tag, a.DRAWING_ATTRIBUTES), c.anchors.forEach((r) => {
this.map[r.anchorType].render(o, r);
}), o.closeNode();
}
parseOpen(o) {
if (this.parser) return this.parser.parseOpen(o), !0;
switch (o.name) {
case this.tag:
this.reset(), this.model = { anchors: [] };
break;
default:
this.parser = this.map[o.name], this.parser && this.parser.parseOpen(o);
}
return !0;
}
parseText(o) {
this.parser && this.parser.parseText(o);
}
parseClose(o) {
if (this.parser) return this.parser.parseClose(o) || (this.model.anchors.push(this.parser.model), this.parser = void 0), !0;
switch (o) {
case this.tag:
return !1;
default:
return !0;
}
}
reconcile(o, c) {
o.anchors.forEach((r) => {
r.br ? this.map["xdr:twoCellAnchor"].reconcile(r, c) : this.map["xdr:oneCellAnchor"].reconcile(r, c);
});
}
}
a.DRAWING_ATTRIBUTES = { "xmlns:xdr": "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing", "xmlns:a": "http://schemas.openxmlformats.org/drawingml/2006/main" }, C.exports = a;
}, { "../../../utils/col-cache": 19, "../../../utils/xml-stream": 28, "../base-xform": 32, "./one-cell-anchor-xform": 67, "./two-cell-anchor-xform": 70 }], 63: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "a:extLst";
}
render(A) {
A.openNode(this.tag), A.openNode("a:ext", { uri: "{FF2B5EF4-FFF2-40B4-BE49-F238E27FC236}" }), A.leafNode("a16:creationId", { "xmlns:a16": "http://schemas.microsoft.com/office/drawing/2014/main", id: "{00000000-0008-0000-0000-000002000000}" }), A.closeNode(), A.closeNode();
}
parseOpen(A) {
switch (A.name) {
case this.tag:
default:
return !0;
}
}
parseText() {
}
parseClose(A) {
switch (A) {
case this.tag:
return !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32 }], 64: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
constructor(A) {
super(), this.tag = A.tag, this.map = {};
}
render(A, s) {
A.openNode(this.tag);
const l = Math.floor(9525 * s.width), n = Math.floor(9525 * s.height);
A.addAttribute("cx", l), A.addAttribute("cy", n), A.closeNode();
}
parseOpen(A) {
return A.name === this.tag && (this.model = { width: parseInt(A.attributes.cx || "0", 10) / 9525, height: parseInt(A.attributes.cy || "0", 10) / 9525 }, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 65: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "a:hlinkClick";
}
render(A, s) {
s.hyperlinks && s.hyperlinks.rId && A.leafNode(this.tag, { "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "r:id": s.hyperlinks.rId, tooltip: s.hyperlinks.tooltip });
}
parseOpen(A) {
switch (A.name) {
case this.tag:
return this.model = { hyperlinks: { rId: A.attributes["r:id"], tooltip: A.attributes.tooltip } }, !0;
default:
return !0;
}
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 66: [function(g, C, i) {
const e = g("../base-xform"), A = g("./c-nv-pr-xform"), s = g("./c-nv-pic-pr-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { "xdr:cNvPr": new A(), "xdr:cNvPicPr": new s() };
}
get tag() {
return "xdr:nvPicPr";
}
render(l, n) {
l.openNode(this.tag), this.map["xdr:cNvPr"].render(l, n), this.map["xdr:cNvPicPr"].render(l, n), l.closeNode();
}
parseOpen(l) {
if (this.parser) return this.parser.parseOpen(l), !0;
switch (l.name) {
case this.tag:
this.reset();
break;
default:
this.parser = this.map[l.name], this.parser && this.parser.parseOpen(l);
}
return !0;
}
parseText() {
}
parseClose(l) {
if (this.parser) return this.parser.parseClose(l) || (this.parser = void 0), !0;
switch (l) {
case this.tag:
return this.model = this.map["xdr:cNvPr"].model, !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32, "./c-nv-pic-pr-xform": 59, "./c-nv-pr-xform": 60 }], 67: [function(g, C, i) {
const e = g("./base-cell-anchor-xform"), A = g("../static-xform"), s = g("./cell-position-xform"), l = g("./ext-xform"), n = g("./pic-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { "xdr:from": new s({ tag: "xdr:from" }), "xdr:ext": new l({ tag: "xdr:ext" }), "xdr:pic": new n(), "xdr:clientData": new A({ tag: "xdr:clientData" }) };
}
get tag() {
return "xdr:oneCellAnchor";
}
prepare(a, d) {
this.map["xdr:pic"].prepare(a.picture, d);
}
render(a, d) {
a.openNode(this.tag, { editAs: d.range.editAs || "oneCell" }), this.map["xdr:from"].render(a, d.range.tl), this.map["xdr:ext"].render(a, d.range.ext), this.map["xdr:pic"].render(a, d.picture), this.map["xdr:clientData"].render(a, {}), a.closeNode();
}
parseClose(a) {
if (this.parser) return this.parser.parseClose(a) || (this.parser = void 0), !0;
switch (a) {
case this.tag:
return this.model.range.tl = this.map["xdr:from"].model, this.model.range.ext = this.map["xdr:ext"].model, this.model.picture = this.map["xdr:pic"].model, !1;
default:
return !0;
}
}
reconcile(a, d) {
a.medium = this.reconcilePicture(a.picture, d);
}
};
}, { "../static-xform": 120, "./base-cell-anchor-xform": 56, "./cell-position-xform": 61, "./ext-xform": 64, "./pic-xform": 68 }], 68: [function(g, C, i) {
const e = g("../base-xform"), A = g("../static-xform"), s = g("./blip-fill-xform"), l = g("./nv-pic-pr-xform"), n = g("./sp-pr");
C.exports = class extends e {
constructor() {
super(), this.map = { "xdr:nvPicPr": new l(), "xdr:blipFill": new s(), "xdr:spPr": new A(n) };
}
get tag() {
return "xdr:pic";
}
prepare(a, d) {
a.index = d.index + 1;
}
render(a, d) {
a.openNode(this.tag), this.map["xdr:nvPicPr"].render(a, d), this.map["xdr:blipFill"].render(a, d), this.map["xdr:spPr"].render(a, d), a.closeNode();
}
parseOpen(a) {
if (this.parser) return this.parser.parseOpen(a), !0;
switch (a.name) {
case this.tag:
this.reset();
break;
default:
this.parser = this.map[a.name], this.parser && this.parser.parseOpen(a);
}
return !0;
}
parseText() {
}
parseClose(a) {
if (this.parser) return this.parser.parseClose(a) || (this.mergeModel(this.parser.model), this.parser = void 0), !0;
switch (a) {
case this.tag:
return !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32, "../static-xform": 120, "./blip-fill-xform": 57, "./nv-pic-pr-xform": 66, "./sp-pr": 69 }], 69: [function(g, C, i) {
C.exports = { tag: "xdr:spPr", c: [{ tag: "a:xfrm", c: [{ tag: "a:off", $: { x: "0", y: "0" } }, { tag: "a:ext", $: { cx: "0", cy: "0" } }] }, { tag: "a:prstGeom", $: { prst: "rect" }, c: [{ tag: "a:avLst" }] }] };
}, {}], 70: [function(g, C, i) {
const e = g("./base-cell-anchor-xform"), A = g("../static-xform"), s = g("./cell-position-xform"), l = g("./pic-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { "xdr:from": new s({ tag: "xdr:from" }), "xdr:to": new s({ tag: "xdr:to" }), "xdr:pic": new l(), "xdr:clientData": new A({ tag: "xdr:clientData" }) };
}
get tag() {
return "xdr:twoCellAnchor";
}
prepare(n, a) {
this.map["xdr:pic"].prepare(n.picture, a);
}
render(n, a) {
n.openNode(this.tag, { editAs: a.range.editAs || "oneCell" }), this.map["xdr:from"].render(n, a.range.tl), this.map["xdr:to"].render(n, a.range.br), this.map["xdr:pic"].render(n, a.picture), this.map["xdr:clientData"].render(n, {}), n.closeNode();
}
parseClose(n) {
if (this.parser) return this.parser.parseClose(n) || (this.parser = void 0), !0;
switch (n) {
case this.tag:
return this.model.range.tl = this.map["xdr:from"].model, this.model.range.br = this.map["xdr:to"].model, this.model.picture = this.map["xdr:pic"].model, !1;
default:
return !0;
}
}
reconcile(n, a) {
n.medium = this.reconcilePicture(n.picture, a);
}
};
}, { "../static-xform": 120, "./base-cell-anchor-xform": 56, "./cell-position-xform": 61, "./pic-xform": 68 }], 71: [function(g, C, i) {
const e = g("./base-xform");
C.exports = class extends e {
constructor(A) {
super(), this.tag = A.tag, this.always = !!A.always, this.count = A.count, this.empty = A.empty, this.$count = A.$count || "count", this.$ = A.$, this.childXform = A.childXform, this.maxItems = A.maxItems;
}
prepare(A, s) {
const { childXform: l } = this;
A && A.forEach((n, a) => {
s.index = a, l.prepare(n, s);
});
}
render(A, s) {
if (this.always || s && s.length) {
A.openNode(this.tag, this.$), this.count && A.addAttribute(this.$count, s && s.length || 0);
const { childXform: l } = this;
(s || []).forEach((n, a) => {
l.render(A, n, a);
}), A.closeNode();
} else this.empty && A.leafNode(this.tag);
}
parseOpen(A) {
if (this.parser) return this.parser.parseOpen(A), !0;
switch (A.name) {
case this.tag:
return this.model = [], !0;
default:
return !!this.childXform.parseOpen(A) && (this.parser = this.childXform, !0);
}
}
parseText(A) {
this.parser && this.parser.parseText(A);
}
parseClose(A) {
if (this.parser) {
if (!this.parser.parseClose(A) && (this.model.push(this.parser.model), this.parser = void 0, this.maxItems && this.model.length > this.maxItems)) throw new Error(`Max ${this.childXform.tag} count (${this.maxItems}) exceeded`);
return !0;
}
return !1;
}
reconcile(A, s) {
if (A) {
const { childXform: l } = this;
A.forEach((n) => {
l.reconcile(n, s);
});
}
}
};
}, { "./base-xform": 32 }], 72: [function(g, C, i) {
const e = g("../../../utils/col-cache"), A = g("../base-xform");
C.exports = class extends A {
get tag() {
return "autoFilter";
}
render(s, l) {
if (l) if (typeof l == "string") s.leafNode("autoFilter", { ref: l });
else {
const n = function(o) {
return typeof o == "string" ? o : e.getAddress(o.row, o.column).address;
}, a = n(l.from), d = n(l.to);
a && d && s.leafNode("autoFilter", { ref: `${a}:${d}` });
}
}
parseOpen(s) {
s.name === "autoFilter" && (this.model = s.attributes.ref);
}
};
}, { "../../../utils/col-cache": 19, "../base-xform": 32 }], 73: [function(g, C, i) {
const e = g("../../../utils/utils"), A = g("../base-xform"), s = g("../../../doc/range"), l = g("../../../doc/enums"), n = g("../strings/rich-text-xform");
function a(d) {
if (d == null) return l.ValueType.Null;
if (d instanceof String || typeof d == "string") return l.ValueType.String;
if (typeof d == "number") return l.ValueType.Number;
if (typeof d == "boolean") return l.ValueType.Boolean;
if (d instanceof Date) return l.ValueType.Date;
if (d.text && d.hyperlink) return l.ValueType.Hyperlink;
if (d.formula) return l.ValueType.Formula;
if (d.error) return l.ValueType.Error;
throw new Error("I could not understand type of value");
}
C.exports = class extends A {
constructor() {
super(), this.richTextXForm = new n();
}
get tag() {
return "c";
}
prepare(d, o) {
const c = o.styles.addStyleModel(d.style || {}, function(r) {
switch (r.type) {
case l.ValueType.Formula:
return a(r.result);
default:
return r.type;
}
}(d));
switch (c && (d.styleId = c), d.comment && o.comments.push({ ...d.comment, ref: d.address }), d.type) {
case l.ValueType.String:
case l.ValueType.RichText:
o.sharedStrings && (d.ssId = o.sharedStrings.add(d.value));
break;
case l.ValueType.Date:
o.date1904 && (d.date1904 = !0);
break;
case l.ValueType.Hyperlink:
o.sharedStrings && d.text !== void 0 && d.text !== null && (d.ssId = o.sharedStrings.add(d.text)), o.hyperlinks.push({ address: d.address, target: d.hyperlink, tooltip: d.tooltip });
break;
case l.ValueType.Merge:
o.merges.add(d);
break;
case l.ValueType.Formula:
if (o.date1904 && (d.date1904 = !0), d.shareType === "shared" && (d.si = o.siFormulae++), d.formula) o.formulae[d.address] = d;
else if (d.sharedFormula) {
const r = o.formulae[d.sharedFormula];
if (!r) throw new Error("Shared Formula master must exist above and or left of clone for cell " + d.address);
r.si === void 0 ? (r.shareType = "shared", r.si = o.siFormulae++, r.range = new s(r.address, d.address)) : r.range && r.range.expandToAddress(d.address), d.si = r.si;
}
}
}
renderFormula(d, o) {
let c = null;
switch (o.shareType) {
case "shared":
c = { t: "shared", ref: o.ref || o.range.range, si: o.si };
break;
case "array":
c = { t: "array", ref: o.ref };
break;
default:
o.si !== void 0 && (c = { t: "shared", si: o.si });
}
switch (a(o.result)) {
case l.ValueType.Null:
d.leafNode("f", c, o.formula);
break;
case l.ValueType.String:
d.addAttribute("t", "str"), d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result);
break;
case l.ValueType.Number:
d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result);
break;
case l.ValueType.Boolean:
d.addAttribute("t", "b"), d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result ? 1 : 0);
break;
case l.ValueType.Error:
d.addAttribute("t", "e"), d.leafNode("f", c, o.formula), d.leafNode("v", null, o.result.error);
break;
case l.ValueType.Date:
d.leafNode("f", c, o.formula), d.leafNode("v", null, e.dateToExcel(o.result, o.date1904));
break;
default:
throw new Error("I could not understand type of value");
}
}
render(d, o) {
if (o.type !== l.ValueType.Null || o.styleId) {
switch (d.openNode("c"), d.addAttribute("r", o.address), o.styleId && d.addAttribute("s", o.styleId), o.type) {
case l.ValueType.Null:
break;
case l.ValueType.Number:
d.leafNode("v", null, o.value);
break;
case l.ValueType.Boolean:
d.addAttribute("t", "b"), d.leafNode("v", null, o.value ? "1" : "0");
break;
case l.ValueType.Error:
d.addAttribute("t", "e"), d.leafNode("v", null, o.value.error);
break;
case l.ValueType.String:
case l.ValueType.RichText:
o.ssId !== void 0 ? (d.addAttribute("t", "s"), d.leafNode("v", null, o.ssId)) : o.value && o.value.richText ? (d.addAttribute("t", "inlineStr"), d.openNode("is"), o.value.richText.forEach((c) => {
this.richTextXForm.render(d, c);
}), d.closeNode("is")) : (d.addAttribute("t", "str"), d.leafNode("v", null, o.value));
break;
case l.ValueType.Date:
d.leafNode("v", null, e.dateToExcel(o.value, o.date1904));
break;
case l.ValueType.Hyperlink:
o.ssId !== void 0 ? (d.addAttribute("t", "s"), d.leafNode("v", null, o.ssId)) : (d.addAttribute("t", "str"), d.leafNode("v", null, o.text));
break;
case l.ValueType.Formula:
this.renderFormula(d, o);
break;
case l.ValueType.Merge:
}
d.closeNode();
}
}
parseOpen(d) {
if (this.parser) return this.parser.parseOpen(d), !0;
switch (d.name) {
case "c":
return this.model = { address: d.attributes.r }, this.t = d.attributes.t, d.attributes.s && (this.model.styleId = parseInt(d.attributes.s, 10)), !0;
case "f":
return this.currentNode = "f", this.model.si = d.attributes.si, this.model.shareType = d.attributes.t, this.model.ref = d.attributes.ref, !0;
case "v":
return this.currentNode = "v", !0;
case "t":
return this.currentNode = "t", !0;
case "r":
return this.parser = this.richTextXForm, this.parser.parseOpen(d), !0;
default:
return !1;
}
}
parseText(d) {
if (this.parser) this.parser.parseText(d);
else switch (this.currentNode) {
case "f":
this.model.formula = this.model.formula ? this.model.formula + d : d;
break;
case "v":
case "t":
this.model.value && this.model.value.richText ? this.model.value.richText.text = this.model.value.richText.text ? this.model.value.richText.text + d : d : this.model.value = this.model.value ? this.model.value + d : d;
}
}
parseClose(d) {
switch (d) {
case "c": {
const { model: o } = this;
if (o.formula || o.shareType) o.type = l.ValueType.Formula, o.value && (this.t === "str" ? o.result = e.xmlDecode(o.value) : this.t === "b" ? o.result = parseInt(o.value, 10) !== 0 : this.t === "e" ? o.result = { error: o.value } : o.result = parseFloat(o.value), o.value = void 0);
else if (o.value !== void 0) switch (this.t) {
case "s":
o.type = l.ValueType.String, o.value = parseInt(o.value, 10);
break;
case "str":
o.type = l.ValueType.String, o.value = e.xmlDecode(o.value);
break;
case "inlineStr":
o.type = l.ValueType.String;
break;
case "b":
o.type = l.ValueType.Boolean, o.value = parseInt(o.value, 10) !== 0;
break;
case "e":
o.type = l.ValueType.Error, o.value = { error: o.value };
break;
default:
o.type = l.ValueType.Number, o.value = parseFloat(o.value);
}
else o.styleId ? o.type = l.ValueType.Null : o.type = l.ValueType.Merge;
return !1;
}
case "f":
case "v":
case "is":
return this.currentNode = void 0, !0;
case "t":
return this.parser ? (this.parser.parseClose(d), !0) : (this.currentNode = void 0, !0);
case "r":
return this.model.value = this.model.value || {}, this.model.value.richText = this.model.value.richText || [], this.model.value.richText.push(this.parser.model), this.parser = void 0, this.currentNode = void 0, !0;
default:
return !!this.parser && (this.parser.parseClose(d), !0);
}
}
reconcile(d, o) {
const c = d.styleId && o.styles && o.styles.getStyleModel(d.styleId);
switch (c && (d.style = c), d.styleId !== void 0 && (d.styleId = void 0), d.type) {
case l.ValueType.String:
typeof d.value == "number" && o.sharedStrings && (d.value = o.sharedStrings.getString(d.value)), d.value.richText && (d.type = l.ValueType.RichText);
break;
case l.ValueType.Number:
c && e.isDateFmt(c.numFmt) && (d.type = l.ValueType.Date, d.value = e.excelToDate(d.value, o.date1904));
break;
case l.ValueType.Formula:
d.result !== void 0 && c && e.isDateFmt(c.numFmt) && (d.result = e.excelToDate(d.result, o.date1904)), d.shareType === "shared" && (d.ref ? o.formulae[d.si] = d.address : (d.sharedFormula = o.formulae[d.si], delete d.shareType), delete d.si);
}
const r = o.hyperlinkMap[d.address];
r && (d.type === l.ValueType.Formula ? (d.text = d.result, d.result = void 0) : (d.text = d.value, d.value = void 0), d.type = l.ValueType.Hyperlink, d.hyperlink = r);
const h = o.commentsMap && o.commentsMap[d.address];
h && (d.comment = h);
}
};
}, { "../../../doc/enums": 7, "../../../doc/range": 10, "../../../utils/utils": 27, "../base-xform": 32, "../strings/rich-text-xform": 122 }], 74: [function(g, C, i) {
const e = g("../../base-xform");
C.exports = class extends e {
get tag() {
return "x14:cfIcon";
}
render(A, s) {
A.leafNode(this.tag, { iconSet: s.iconSet, iconId: s.iconId });
}
parseOpen(A) {
let { attributes: s } = A;
this.model = { iconSet: s.iconSet, iconId: e.toIntValue(s.iconId) };
}
parseClose(A) {
return A !== this.tag;
}
};
}, { "../../base-xform": 32 }], 75: [function(g, C, i) {
const { v4: e } = g("uuid"), A = g("../../base-xform"), s = g("../../composite-xform"), l = g("./databar-ext-xform"), n = g("./icon-set-ext-xform"), a = { "3Triangles": !0, "3Stars": !0, "5Boxes": !0 };
class d extends s {
constructor() {
super(), this.map = { "x14:dataBar": this.databarXform = new l(), "x14:iconSet": this.iconSetXform = new n() };
}
get tag() {
return "x14:cfRule";
}
static isExt(c) {
return c.type === "dataBar" ? l.isExt(c) : !(c.type !== "iconSet" || !c.custom && !a[c.iconSet]);
}
prepare(c) {
d.isExt(c) && (c.x14Id = `{${e()}}`.toUpperCase());
}
render(c, r) {
if (d.isExt(r)) switch (r.type) {
case "dataBar":
this.renderDataBar(c, r);
break;
case "iconSet":
this.renderIconSet(c, r);
}
}
renderDataBar(c, r) {
c.openNode(this.tag, { type: "dataBar", id: r.x14Id }), this.databarXform.render(c, r), c.closeNode();
}
renderIconSet(c, r) {
c.openNode(this.tag, { type: "iconSet", priority: r.priority, id: r.x14Id || `{${e()}}` }), this.iconSetXform.render(c, r), c.closeNode();
}
createNewModel(c) {
let { attributes: r } = c;
return { type: r.type, x14Id: r.id, priority: A.toIntValue(r.priority) };
}
onParserClose(c, r) {
Object.assign(this.model, r.model);
}
}
C.exports = d;
}, { "../../base-xform": 32, "../../composite-xform": 48, "./databar-ext-xform": 79, "./icon-set-ext-xform": 81, uuid: 528 }], 76: [function(g, C, i) {
const e = g("../../composite-xform"), A = g("./f-ext-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { "xm:f": this.fExtXform = new A() };
}
get tag() {
return "x14:cfvo";
}
render(s, l) {
s.openNode(this.tag, { type: l.type }), l.value !== void 0 && this.fExtXform.render(s, l.value), s.closeNode();
}
createNewModel(s) {
return { type: s.attributes.type };
}
onParserClose(s, l) {
switch (s) {
case "xm:f":
this.model.value = l.model ? parseFloat(l.model) : 0;
}
}
};
}, { "../../composite-xform": 48, "./f-ext-xform": 80 }], 77: [function(g, C, i) {
const e = g("../../composite-xform"), A = g("./sqref-ext-xform"), s = g("./cf-rule-ext-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { "xm:sqref": this.sqRef = new A(), "x14:cfRule": this.cfRule = new s() };
}
get tag() {
return "x14:conditionalFormatting";
}
prepare(l, n) {
l.rules.forEach((a) => {
this.cfRule.prepare(a, n);
});
}
render(l, n) {
n.rules.some(s.isExt) && (l.openNode(this.tag, { "xmlns:xm": "http://schemas.microsoft.com/office/excel/2006/main" }), n.rules.filter(s.isExt).forEach((a) => this.cfRule.render(l, a)), this.sqRef.render(l, n.ref), l.closeNode());
}
createNewModel() {
return { rules: [] };
}
onParserClose(l, n) {
switch (l) {
case "xm:sqref":
this.model.ref = n.model;
break;
case "x14:cfRule":
this.model.rules.push(n.model);
}
}
};
}, { "../../composite-xform": 48, "./cf-rule-ext-xform": 75, "./sqref-ext-xform": 82 }], 78: [function(g, C, i) {
const e = g("../../composite-xform"), A = g("./cf-rule-ext-xform"), s = g("./conditional-formatting-ext-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { "x14:conditionalFormatting": this.cfXform = new s() };
}
get tag() {
return "x14:conditionalFormattings";
}
hasContent(l) {
return l.hasExtContent === void 0 && (l.hasExtContent = l.some((n) => n.rules.some(A.isExt))), l.hasExtContent;
}
prepare(l, n) {
l.forEach((a) => {
this.cfXform.prepare(a, n);
});
}
render(l, n) {
this.hasContent(n) && (l.openNode(this.tag), n.forEach((a) => this.cfXform.render(l, a)), l.closeNode());
}
createNewModel() {
return [];
}
onParserClose(l, n) {
this.model.push(n.model);
}
};
}, { "../../composite-xform": 48, "./cf-rule-ext-xform": 75, "./conditional-formatting-ext-xform": 77 }], 79: [function(g, C, i) {
const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("../../style/color-xform"), l = g("./cfvo-ext-xform");
C.exports = class extends A {
constructor() {
super(), this.map = { "x14:cfvo": this.cfvoXform = new l(), "x14:borderColor": this.borderColorXform = new s("x14:borderColor"), "x14:negativeBorderColor": this.negativeBorderColorXform = new s("x14:negativeBorderColor"), "x14:negativeFillColor": this.negativeFillColorXform = new s("x14:negativeFillColor"), "x14:axisColor": this.axisColorXform = new s("x14:axisColor") };
}
static isExt(n) {
return !n.gradient;
}
get tag() {
return "x14:dataBar";
}
render(n, a) {
n.openNode(this.tag, { minLength: e.toIntAttribute(a.minLength, 0, !0), maxLength: e.toIntAttribute(a.maxLength, 100, !0), border: e.toBoolAttribute(a.border, !1), gradient: e.toBoolAttribute(a.gradient, !0), negativeBarColorSameAsPositive: e.toBoolAttribute(a.negativeBarColorSameAsPositive, !0), negativeBarBorderColorSameAsPositive: e.toBoolAttribute(a.negativeBarBorderColorSameAsPositive, !0), axisPosition: e.toAttribute(a.axisPosition, "auto"), direction: e.toAttribute(a.direction, "leftToRight") }), a.cfvo.forEach((d) => {
this.cfvoXform.render(n, d);
}), this.borderColorXform.render(n, a.borderColor), this.negativeBorderColorXform.render(n, a.negativeBorderColor), this.negativeFillColorXform.render(n, a.negativeFillColor), this.axisColorXform.render(n, a.axisColor), n.closeNode();
}
createNewModel(n) {
let { attributes: a } = n;
return { cfvo: [], minLength: e.toIntValue(a.minLength, 0), maxLength: e.toIntValue(a.maxLength, 100), border: e.toBoolValue(a.border, !1), gradient: e.toBoolValue(a.gradient, !0), negativeBarColorSameAsPositive: e.toBoolValue(a.negativeBarColorSameAsPositive, !0), negativeBarBorderColorSameAsPositive: e.toBoolValue(a.negativeBarBorderColorSameAsPositive, !0), axisPosition: e.toStringValue(a.axisPosition, "auto"), direction: e.toStringValue(a.direction, "leftToRight") };
}
onParserClose(n, a) {
const [, d] = n.split(":");
switch (d) {
case "cfvo":
this.model.cfvo.push(a.model);
break;
default:
this.model[d] = a.model;
}
}
};
}, { "../../base-xform": 32, "../../composite-xform": 48, "../../style/color-xform": 128, "./cfvo-ext-xform": 76 }], 80: [function(g, C, i) {
const e = g("../../base-xform");
C.exports = class extends e {
get tag() {
return "xm:f";
}
render(A, s) {
A.leafNode(this.tag, null, s);
}
parseOpen() {
this.model = "";
}
parseText(A) {
this.model += A;
}
parseClose(A) {
return A !== this.tag;
}
};
}, { "../../base-xform": 32 }], 81: [function(g, C, i) {
const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("./cfvo-ext-xform"), l = g("./cf-icon-ext-xform");
C.exports = class extends A {
constructor() {
super(), this.map = { "x14:cfvo": this.cfvoXform = new s(), "x14:cfIcon": this.cfIconXform = new l() };
}
get tag() {
return "x14:iconSet";
}
render(n, a) {
n.openNode(this.tag, { iconSet: e.toStringAttribute(a.iconSet), reverse: e.toBoolAttribute(a.reverse, !1), showValue: e.toBoolAttribute(a.showValue, !0), custom: e.toBoolAttribute(a.icons, !1) }), a.cfvo.forEach((d) => {
this.cfvoXform.render(n, d);
}), a.icons && a.icons.forEach((d, o) => {
d.iconId = o, this.cfIconXform.render(n, d);
}), n.closeNode();
}
createNewModel(n) {
let { attributes: a } = n;
return { cfvo: [], iconSet: e.toStringValue(a.iconSet, "3TrafficLights"), reverse: e.toBoolValue(a.reverse, !1), showValue: e.toBoolValue(a.showValue, !0) };
}
onParserClose(n, a) {
const [, d] = n.split(":");
switch (d) {
case "cfvo":
this.model.cfvo.push(a.model);
break;
case "cfIcon":
this.model.icons || (this.model.icons = []), this.model.icons.push(a.model);
break;
default:
this.model[d] = a.model;
}
}
};
}, { "../../base-xform": 32, "../../composite-xform": 48, "./cf-icon-ext-xform": 74, "./cfvo-ext-xform": 76 }], 82: [function(g, C, i) {
const e = g("../../base-xform");
C.exports = class extends e {
get tag() {
return "xm:sqref";
}
render(A, s) {
A.leafNode(this.tag, null, s);
}
parseOpen() {
this.model = "";
}
parseText(A) {
this.model += A;
}
parseClose(A) {
return A !== this.tag;
}
};
}, { "../../base-xform": 32 }], 83: [function(g, C, i) {
const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("../../../../doc/range"), l = g("./databar-xform"), n = g("./ext-lst-ref-xform"), a = g("./formula-xform"), d = g("./color-scale-xform"), o = g("./icon-set-xform"), c = { "3Triangles": !0, "3Stars": !0, "5Boxes": !0 }, r = (b) => {
const { type: u, operator: m } = b;
switch (u) {
case "containsText":
case "containsBlanks":
case "notContainsBlanks":
case "containsErrors":
case "notContainsErrors":
return { type: "containsText", operator: u };
default:
return { type: u, operator: m };
}
};
class h extends A {
constructor() {
super(), this.map = { dataBar: this.databarXform = new l(), extLst: this.extLstRefXform = new n(), formula: this.formulaXform = new a(), colorScale: this.colorScaleXform = new d(), iconSet: this.iconSetXform = new o() };
}
get tag() {
return "cfRule";
}
static isPrimitive(u) {
return u.type !== "iconSet" || !u.custom && !c[u.iconSet];
}
render(u, m) {
switch (m.type) {
case "expression":
this.renderExpression(u, m);
break;
case "cellIs":
this.renderCellIs(u, m);
break;
case "top10":
this.renderTop10(u, m);
break;
case "aboveAverage":
this.renderAboveAverage(u, m);
break;
case "dataBar":
this.renderDataBar(u, m);
break;
case "colorScale":
this.renderColorScale(u, m);
break;
case "iconSet":
this.renderIconSet(u, m);
break;
case "containsText":
this.renderText(u, m);
break;
case "timePeriod":
this.renderTimePeriod(u, m);
}
}
renderExpression(u, m) {
u.openNode(this.tag, { type: "expression", dxfId: m.dxfId, priority: m.priority }), this.formulaXform.render(u, m.formulae[0]), u.closeNode();
}
renderCellIs(u, m) {
u.openNode(this.tag, { type: "cellIs", dxfId: m.dxfId, priority: m.priority, operator: m.operator }), m.formulae.forEach((Z) => {
this.formulaXform.render(u, Z);
}), u.closeNode();
}
renderTop10(u, m) {
u.leafNode(this.tag, { type: "top10", dxfId: m.dxfId, priority: m.priority, percent: e.toBoolAttribute(m.percent, !1), bottom: e.toBoolAttribute(m.bottom, !1), rank: e.toIntValue(m.rank, 10, !0) });
}
renderAboveAverage(u, m) {
u.leafNode(this.tag, { type: "aboveAverage", dxfId: m.dxfId, priority: m.priority, aboveAverage: e.toBoolAttribute(m.aboveAverage, !0) });
}
renderDataBar(u, m) {
u.openNode(this.tag, { type: "dataBar", priority: m.priority }), this.databarXform.render(u, m), this.extLstRefXform.render(u, m), u.closeNode();
}
renderColorScale(u, m) {
u.openNode(this.tag, { type: "colorScale", priority: m.priority }), this.colorScaleXform.render(u, m), u.closeNode();
}
renderIconSet(u, m) {
h.isPrimitive(m) && (u.openNode(this.tag, { type: "iconSet", priority: m.priority }), this.iconSetXform.render(u, m), u.closeNode());
}
renderText(u, m) {
u.openNode(this.tag, { type: m.operator, dxfId: m.dxfId, priority: m.priority, operator: e.toStringAttribute(m.operator, "containsText") });
const Z = ((p) => {
if (p.formulae && p.formulae[0]) return p.formulae[0];
const Y = new s(p.ref), { tl: R } = Y;
switch (p.operator) {
case "containsText":
return `NOT(ISERROR(SEARCH("${p.text}",${R})))`;
case "containsBlanks":
return `LEN(TRIM(${R}))=0`;
case "notContainsBlanks":
return `LEN(TRIM(${R}))>0`;
case "containsErrors":
return `ISERROR(${R})`;
case "notContainsErrors":
return `NOT(ISERROR(${R}))`;
default:
return;
}
})(m);
Z && this.formulaXform.render(u, Z), u.closeNode();
}
renderTimePeriod(u, m) {
u.openNode(this.tag, { type: "timePeriod", dxfId: m.dxfId, priority: m.priority, timePeriod: m.timePeriod });
const Z = ((p) => {
if (p.formulae && p.formulae[0]) return p.formulae[0];
const Y = new s(p.ref), { tl: R } = Y;
switch (p.timePeriod) {
case "thisWeek":
return `AND(TODAY()-ROUNDDOWN(${R},0)<=WEEKDAY(TODAY())-1,ROUNDDOWN(${R},0)-TODAY()<=7-WEEKDAY(TODAY()))`;
case "lastWeek":
return `AND(TODAY()-ROUNDDOWN(${R},0)>=(WEEKDAY(TODAY())),TODAY()-ROUNDDOWN(${R},0)<(WEEKDAY(TODAY())+7))`;
case "nextWeek":
return `AND(ROUNDDOWN(${R},0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN(${R},0)-TODAY()<(15-WEEKDAY(TODAY())))`;
case "yesterday":
return `FLOOR(${R},1)=TODAY()-1`;
case "today":
return `FLOOR(${R},1)=TODAY()`;
case "tomorrow":
return `FLOOR(${R},1)=TODAY()+1`;
case "last7Days":
return `AND(TODAY()-FLOOR(${R},1)<=6,FLOOR(${R},1)<=TODAY())`;
case "lastMonth":
return `AND(MONTH(${R})=MONTH(EDATE(TODAY(),0-1)),YEAR(${R})=YEAR(EDATE(TODAY(),0-1)))`;
case "thisMonth":
return `AND(MONTH(${R})=MONTH(TODAY()),YEAR(${R})=YEAR(TODAY()))`;
case "nextMonth":
return `AND(MONTH(${R})=MONTH(EDATE(TODAY(),0+1)),YEAR(${R})=YEAR(EDATE(TODAY(),0+1)))`;
default:
return;
}
})(m);
Z && this.formulaXform.render(u, Z), u.closeNode();
}
createNewModel(u) {
let { attributes: m } = u;
return { ...r(m), dxfId: e.toIntValue(m.dxfId), priority: e.toIntValue(m.priority), timePeriod: m.timePeriod, percent: e.toBoolValue(m.percent), bottom: e.toBoolValue(m.bottom), rank: e.toIntValue(m.rank), aboveAverage: e.toBoolValue(m.aboveAverage) };
}
onParserClose(u, m) {
switch (u) {
case "dataBar":
case "extLst":
case "colorScale":
case "iconSet":
Object.assign(this.model, m.model);
break;
case "formula":
this.model.formulae = this.model.formulae || [], this.model.formulae.push(m.model);
}
}
}
C.exports = h;
}, { "../../../../doc/range": 10, "../../base-xform": 32, "../../composite-xform": 48, "./color-scale-xform": 85, "./databar-xform": 88, "./ext-lst-ref-xform": 89, "./formula-xform": 90, "./icon-set-xform": 91 }], 84: [function(g, C, i) {
const e = g("../../base-xform");
C.exports = class extends e {
get tag() {
return "cfvo";
}
render(A, s) {
A.leafNode(this.tag, { type: s.type, val: s.value });
}
parseOpen(A) {
this.model = { type: A.attributes.type, value: e.toFloatValue(A.attributes.val) };
}
parseClose(A) {
return A !== this.tag;
}
};
}, { "../../base-xform": 32 }], 85: [function(g, C, i) {
const e = g("../../composite-xform"), A = g("../../style/color-xform"), s = g("./cfvo-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { cfvo: this.cfvoXform = new s(), color: this.colorXform = new A() };
}
get tag() {
return "colorScale";
}
render(l, n) {
l.openNode(this.tag), n.cfvo.forEach((a) => {
this.cfvoXform.render(l, a);
}), n.color.forEach((a) => {
this.colorXform.render(l, a);
}), l.closeNode();
}
createNewModel(l) {
return { cfvo: [], color: [] };
}
onParserClose(l, n) {
this.model[l].push(n.model);
}
};
}, { "../../composite-xform": 48, "../../style/color-xform": 128, "./cfvo-xform": 84 }], 86: [function(g, C, i) {
const e = g("../../composite-xform"), A = g("./cf-rule-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { cfRule: new A() };
}
get tag() {
return "conditionalFormatting";
}
render(s, l) {
l.rules.some(A.isPrimitive) && (s.openNode(this.tag, { sqref: l.ref }), l.rules.forEach((n) => {
A.isPrimitive(n) && (n.ref = l.ref, this.map.cfRule.render(s, n));
}), s.closeNode());
}
createNewModel(s) {
let { attributes: l } = s;
return { ref: l.sqref, rules: [] };
}
onParserClose(s, l) {
this.model.rules.push(l.model);
}
};
}, { "../../composite-xform": 48, "./cf-rule-xform": 83 }], 87: [function(g, C, i) {
const e = g("../../base-xform"), A = g("./conditional-formatting-xform");
C.exports = class extends e {
constructor() {
super(), this.cfXform = new A();
}
get tag() {
return "conditionalFormatting";
}
reset() {
this.model = [];
}
prepare(s, l) {
let n = s.reduce((a, d) => Math.max(a, ...d.rules.map((o) => o.priority || 0)), 1);
s.forEach((a) => {
a.rules.forEach((d) => {
d.priority || (d.priority = n++), d.style && (d.dxfId = l.styles.addDxfStyle(d.style));
});
});
}
render(s, l) {
l.forEach((n) => {
this.cfXform.render(s, n);
});
}
parseOpen(s) {
if (this.parser) return this.parser.parseOpen(s), !0;
switch (s.name) {
case "conditionalFormatting":
return this.parser = this.cfXform, this.parser.parseOpen(s), !0;
default:
return !1;
}
}
parseText(s) {
this.parser && this.parser.parseText(s);
}
parseClose(s) {
return !!this.parser && (!!this.parser.parseClose(s) || (this.model.push(this.parser.model), this.parser = void 0, !1));
}
reconcile(s, l) {
s.forEach((n) => {
n.rules.forEach((a) => {
a.dxfId !== void 0 && (a.style = l.styles.getDxfStyle(a.dxfId), delete a.dxfId);
});
});
}
};
}, { "../../base-xform": 32, "./conditional-formatting-xform": 86 }], 88: [function(g, C, i) {
const e = g("../../composite-xform"), A = g("../../style/color-xform"), s = g("./cfvo-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { cfvo: this.cfvoXform = new s(), color: this.colorXform = new A() };
}
get tag() {
return "dataBar";
}
render(l, n) {
l.openNode(this.tag), n.cfvo.forEach((a) => {
this.cfvoXform.render(l, a);
}), this.colorXform.render(l, n.color), l.closeNode();
}
createNewModel() {
return { cfvo: [] };
}
onParserClose(l, n) {
switch (l) {
case "cfvo":
this.model.cfvo.push(n.model);
break;
case "color":
this.model.color = n.model;
}
}
};
}, { "../../composite-xform": 48, "../../style/color-xform": 128, "./cfvo-xform": 84 }], 89: [function(g, C, i) {
const e = g("../../base-xform"), A = g("../../composite-xform");
class s extends e {
get tag() {
return "x14:id";
}
render(a, d) {
a.leafNode(this.tag, null, d);
}
parseOpen() {
this.model = "";
}
parseText(a) {
this.model += a;
}
parseClose(a) {
return a !== this.tag;
}
}
class l extends A {
constructor() {
super(), this.map = { "x14:id": this.idXform = new s() };
}
get tag() {
return "ext";
}
render(a, d) {
a.openNode(this.tag, { uri: "{B025F937-C7B1-47D3-B67F-A62EFF666E3E}", "xmlns:x14": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" }), this.idXform.render(a, d.x14Id), a.closeNode();
}
createNewModel() {
return {};
}
onParserClose(a, d) {
this.model.x14Id = d.model;
}
}
C.exports = class extends A {
constructor() {
super(), this.map = { ext: new l() };
}
get tag() {
return "extLst";
}
render(n, a) {
n.openNode(this.tag), this.map.ext.render(n, a), n.closeNode();
}
createNewModel() {
return {};
}
onParserClose(n, a) {
Object.assign(this.model, a.model);
}
};
}, { "../../base-xform": 32, "../../composite-xform": 48 }], 90: [function(g, C, i) {
const e = g("../../base-xform");
C.exports = class extends e {
get tag() {
return "formula";
}
render(A, s) {
A.leafNode(this.tag, null, s);
}
parseOpen() {
this.model = "";
}
parseText(A) {
this.model += A;
}
parseClose(A) {
return A !== this.tag;
}
};
}, { "../../base-xform": 32 }], 91: [function(g, C, i) {
const e = g("../../base-xform"), A = g("../../composite-xform"), s = g("./cfvo-xform");
C.exports = class extends A {
constructor() {
super(), this.map = { cfvo: this.cfvoXform = new s() };
}
get tag() {
return "iconSet";
}
render(l, n) {
l.openNode(this.tag, { iconSet: e.toStringAttribute(n.iconSet, "3TrafficLights"), reverse: e.toBoolAttribute(n.reverse, !1), showValue: e.toBoolAttribute(n.showValue, !0) }), n.cfvo.forEach((a) => {
this.cfvoXform.render(l, a);
}), l.closeNode();
}
createNewModel(l) {
let { attributes: n } = l;
return { iconSet: e.toStringValue(n.iconSet, "3TrafficLights"), reverse: e.toBoolValue(n.reverse), showValue: e.toBoolValue(n.showValue), cfvo: [] };
}
onParserClose(l, n) {
this.model[l].push(n.model);
}
};
}, { "../../base-xform": 32, "../../composite-xform": 48, "./cfvo-xform": 84 }], 92: [function(g, C, i) {
const e = g("../../../utils/utils"), A = g("../base-xform");
C.exports = class extends A {
get tag() {
return "col";
}
prepare(s, l) {
const n = l.styles.addStyleModel(s.style || {});
n && (s.styleId = n);
}
render(s, l) {
s.openNode("col"), s.addAttribute("min", l.min), s.addAttribute("max", l.max), l.width && s.addAttribute("width", l.width), l.styleId && s.addAttribute("style", l.styleId), l.hidden && s.addAttribute("hidden", "1"), l.bestFit && s.addAttribute("bestFit", "1"), l.outlineLevel && s.addAttribute("outlineLevel", l.outlineLevel), l.collapsed && s.addAttribute("collapsed", "1"), s.addAttribute("customWidth", "1"), s.closeNode();
}
parseOpen(s) {
if (s.name === "col") {
const l = this.model = { min: parseInt(s.attributes.min || "0", 10), max: parseInt(s.attributes.max || "0", 10), width: s.attributes.width === void 0 ? void 0 : parseFloat(s.attributes.width || "0") };
return s.attributes.style && (l.styleId = parseInt(s.attributes.style, 10)), e.parseBoolean(s.attributes.hidden) && (l.hidden = !0), e.parseBoolean(s.attributes.bestFit) && (l.bestFit = !0), s.attributes.outlineLevel && (l.outlineLevel = parseInt(s.attributes.outlineLevel, 10)), e.parseBoolean(s.attributes.collapsed) && (l.collapsed = !0), !0;
}
return !1;
}
parseText() {
}
parseClose() {
return !1;
}
reconcile(s, l) {
s.styleId && (s.style = l.styles.getStyleModel(s.styleId));
}
};
}, { "../../../utils/utils": 27, "../base-xform": 32 }], 93: [function(g, C, i) {
const e = g("../../../utils/under-dash"), A = g("../../../utils/utils"), s = g("../../../utils/col-cache"), l = g("../base-xform"), n = g("../../../doc/range");
function a(o, c, r, h) {
const b = c[r];
b !== void 0 ? o[r] = b : h !== void 0 && (o[r] = h);
}
function d(o, c, r, h) {
const b = c[r];
b !== void 0 && (o[r] = A.parseBoolean(b));
}
C.exports = class extends l {
get tag() {
return "dataValidations";
}
render(o, c) {
const r = function(h) {
const b = e.map(h, (Z, p) => ({ address: p, dataValidation: Z, marked: !1 })).sort((Z, p) => e.strcmp(Z.address, p.address)), u = e.keyBy(b, "address"), m = (Z, p, Y) => {
for (let R = 0; R < p; R++) {
const X = s.encodeAddress(Z.row + R, Y);
if (!h[X] || !e.isEqual(h[Z.address], h[X])) return !1;
}
return !0;
};
return b.map((Z) => {
if (!Z.marked) {
const p = s.decodeEx(Z.address);
if (p.dimensions) return u[p.dimensions].marked = !0, { ...Z.dataValidation, sqref: Z.address };
let Y = 1, R = s.encodeAddress(p.row + Y, p.col);
for (; h[R] && e.isEqual(Z.dataValidation, h[R]); ) Y++, R = s.encodeAddress(p.row + Y, p.col);
let X = 1;
for (; m(p, Y, p.col + X); ) X++;
for (let H = 0; H < Y; H++) for (let S = 0; S < X; S++) R = s.encodeAddress(p.row + H, p.col + S), u[R].marked = !0;
if (Y > 1 || X > 1) {
const H = p.row + (Y - 1), S = p.col + (X - 1);
return { ...Z.dataValidation, sqref: `${Z.address}:${s.encodeAddress(H, S)}` };
}
return { ...Z.dataValidation, sqref: Z.address };
}
return null;
}).filter(Boolean);
}(c);
r.length && (o.openNode("dataValidations", { count: r.length }), r.forEach((h) => {
o.openNode("dataValidation"), h.type !== "any" && (o.addAttribute("type", h.type), h.operator && h.type !== "list" && h.operator !== "between" && o.addAttribute("operator", h.operator), h.allowBlank && o.addAttribute("allowBlank", "1")), h.showInputMessage && o.addAttribute("showInputMessage", "1"), h.promptTitle && o.addAttribute("promptTitle", h.promptTitle), h.prompt && o.addAttribute("prompt", h.prompt), h.showErrorMessage && o.addAttribute("showErrorMessage", "1"), h.errorStyle && o.addAttribute("errorStyle", h.errorStyle), h.errorTitle && o.addAttribute("errorTitle", h.errorTitle), h.error && o.addAttribute("error", h.error), o.addAttribute("sqref", h.sqref), (h.formulae || []).forEach((b, u) => {
o.openNode("formula" + (u + 1)), h.type === "date" ? o.writeText(A.dateToExcel(new Date(b))) : o.writeText(b), o.closeNode();
}), o.closeNode();
}), o.closeNode());
}
parseOpen(o) {
switch (o.name) {
case "dataValidations":
return this.model = {}, !0;
case "dataValidation": {
this._address = o.attributes.sqref;
const c = { type: o.attributes.type || "any", formulae: [] };
switch (o.attributes.type && d(c, o.attributes, "allowBlank"), d(c, o.attributes, "showInputMessage"), d(c, o.attributes, "showErrorMessage"), c.type) {
case "any":
case "list":
case "custom":
break;
default:
a(c, o.attributes, "operator", "between");
}
return a(c, o.attributes, "promptTitle"), a(c, o.attributes, "prompt"), a(c, o.attributes, "errorStyle"), a(c, o.attributes, "errorTitle"), a(c, o.attributes, "error"), this._dataValidation = c, !0;
}
case "formula1":
case "formula2":
return this._formula = [], !0;
default:
return !1;
}
}
parseText(o) {
this._formula && this._formula.push(o);
}
parseClose(o) {
switch (o) {
case "dataValidations":
return !1;
case "dataValidation":
return this._dataValidation.formulae && this._dataValidation.formulae.length || (delete this._dataValidation.formulae, delete this._dataValidation.operator), (this._address.split(/\s+/g) || []).forEach((c) => {
c.includes(":") ? new n(c).forEachAddress((r) => {
this.model[r] = this._dataValidation;
}) : this.model[c] = this._dataValidation;
}), !0;
case "formula1":
case "formula2": {
let c = this._formula.join("");
switch (this._dataValidation.type) {
case "whole":
case "textLength":
c = parseInt(c, 10);
break;
case "decimal":
c = parseFloat(c);
break;
case "date":
c = A.excelToDate(parseFloat(c));
}
return this._dataValidation.formulae.push(c), this._formula = void 0, !0;
}
default:
return !0;
}
}
};
}, { "../../../doc/range": 10, "../../../utils/col-cache": 19, "../../../utils/under-dash": 26, "../../../utils/utils": 27, "../base-xform": 32 }], 94: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "dimension";
}
render(A, s) {
s && A.leafNode("dimension", { ref: s });
}
parseOpen(A) {
return A.name === "dimension" && (this.model = A.attributes.ref, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 95: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "drawing";
}
render(A, s) {
s && A.leafNode(this.tag, { "r:id": s.rId });
}
parseOpen(A) {
switch (A.name) {
case this.tag:
return this.model = { rId: A.attributes["r:id"] }, !0;
default:
return !1;
}
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 96: [function(g, C, i) {
const e = g("../composite-xform"), A = g("./cf-ext/conditional-formattings-ext-xform");
class s extends e {
constructor() {
super(), this.map = { "x14:conditionalFormattings": this.conditionalFormattings = new A() };
}
get tag() {
return "ext";
}
hasContent(n) {
return this.conditionalFormattings.hasContent(n.conditionalFormattings);
}
prepare(n, a) {
this.conditionalFormattings.prepare(n.conditionalFormattings, a);
}
render(n, a) {
n.openNode("ext", { uri: "{78C0D931-6437-407d-A8EE-F0AAD7539E65}", "xmlns:x14": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" }), this.conditionalFormattings.render(n, a.conditionalFormattings), n.closeNode();
}
createNewModel() {
return {};
}
onParserClose(n, a) {
this.model[n] = a.model;
}
}
C.exports = class extends e {
constructor() {
super(), this.map = { ext: this.ext = new s() };
}
get tag() {
return "extLst";
}
prepare(l, n) {
this.ext.prepare(l, n);
}
hasContent(l) {
return this.ext.hasContent(l);
}
render(l, n) {
this.hasContent(n) && (l.openNode("extLst"), this.ext.render(l, n), l.closeNode());
}
createNewModel() {
return {};
}
onParserClose(l, n) {
Object.assign(this.model, n.model);
}
};
}, { "../composite-xform": 48, "./cf-ext/conditional-formattings-ext-xform": 78 }], 97: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "headerFooter";
}
render(A, s) {
if (s) {
A.addRollback();
let l = !1;
A.openNode("headerFooter"), s.differentFirst && (A.addAttribute("differentFirst", "1"), l = !0), s.differentOddEven && (A.addAttribute("differentOddEven", "1"), l = !0), s.oddHeader && typeof s.oddHeader == "string" && (A.leafNode("oddHeader", null, s.oddHeader), l = !0), s.oddFooter && typeof s.oddFooter == "string" && (A.leafNode("oddFooter", null, s.oddFooter), l = !0), s.evenHeader && typeof s.evenHeader == "string" && (A.leafNode("evenHeader", null, s.evenHeader), l = !0), s.evenFooter && typeof s.evenFooter == "string" && (A.leafNode("evenFooter", null, s.evenFooter), l = !0), s.firstHeader && typeof s.firstHeader == "string" && (A.leafNode("firstHeader", null, s.firstHeader), l = !0), s.firstFooter && typeof s.firstFooter == "string" && (A.leafNode("firstFooter", null, s.firstFooter), l = !0), l ? (A.closeNode(), A.commit()) : A.rollback();
}
}
parseOpen(A) {
switch (A.name) {
case "headerFooter":
return this.model = {}, A.attributes.differentFirst && (this.model.differentFirst = parseInt(A.attributes.differentFirst, 0) === 1), A.attributes.differentOddEven && (this.model.differentOddEven = parseInt(A.attributes.differentOddEven, 0) === 1), !0;
case "oddHeader":
return this.currentNode = "oddHeader", !0;
case "oddFooter":
return this.currentNode = "oddFooter", !0;
case "evenHeader":
return this.currentNode = "evenHeader", !0;
case "evenFooter":
return this.currentNode = "evenFooter", !0;
case "firstHeader":
return this.currentNode = "firstHeader", !0;
case "firstFooter":
return this.currentNode = "firstFooter", !0;
default:
return !1;
}
}
parseText(A) {
switch (this.currentNode) {
case "oddHeader":
this.model.oddHeader = A;
break;
case "oddFooter":
this.model.oddFooter = A;
break;
case "evenHeader":
this.model.evenHeader = A;
break;
case "evenFooter":
this.model.evenFooter = A;
break;
case "firstHeader":
this.model.firstHeader = A;
break;
case "firstFooter":
this.model.firstFooter = A;
}
}
parseClose() {
switch (this.currentNode) {
case "oddHeader":
case "oddFooter":
case "evenHeader":
case "evenFooter":
case "firstHeader":
case "firstFooter":
return this.currentNode = void 0, !0;
default:
return !1;
}
}
};
}, { "../base-xform": 32 }], 98: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "hyperlink";
}
render(A, s) {
this.isInternalLink(s) ? A.leafNode("hyperlink", { ref: s.address, "r:id": s.rId, tooltip: s.tooltip, location: s.target }) : A.leafNode("hyperlink", { ref: s.address, "r:id": s.rId, tooltip: s.tooltip });
}
parseOpen(A) {
return A.name === "hyperlink" && (this.model = { address: A.attributes.ref, rId: A.attributes["r:id"], tooltip: A.attributes.tooltip }, A.attributes.location && (this.model.target = A.attributes.location), !0);
}
parseText() {
}
parseClose() {
return !1;
}
isInternalLink(A) {
return A.target && /^[^!]+![a-zA-Z]+[\d]+$/.test(A.target);
}
};
}, { "../base-xform": 32 }], 99: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "mergeCell";
}
render(A, s) {
A.leafNode("mergeCell", { ref: s });
}
parseOpen(A) {
return A.name === "mergeCell" && (this.model = A.attributes.ref, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 100: [function(g, C, i) {
const e = g("../../../utils/under-dash"), A = g("../../../doc/range"), s = g("../../../utils/col-cache"), l = g("../../../doc/enums");
C.exports = class {
constructor() {
this.merges = {};
}
add(n) {
if (this.merges[n.master]) this.merges[n.master].expandToAddress(n.address);
else {
const a = `${n.master}:${n.address}`;
this.merges[n.master] = new A(a);
}
}
get mergeCells() {
return e.map(this.merges, (n) => n.range);
}
reconcile(n, a) {
e.each(n, (d) => {
const o = s.decode(d);
for (let c = o.top; c <= o.bottom; c++) {
const r = a[c - 1];
for (let h = o.left; h <= o.right; h++) {
const b = r.cells[h - 1];
b ? b.type === l.ValueType.Merge && (b.master = o.tl) : r.cells[h] = { type: l.ValueType.Null, address: s.encodeAddress(c, h) };
}
}
});
}
getMasterAddress(n) {
const a = this.hash[n];
return a && a.tl;
}
};
}, { "../../../doc/enums": 7, "../../../doc/range": 10, "../../../utils/col-cache": 19, "../../../utils/under-dash": 26 }], 101: [function(g, C, i) {
const e = g("../base-xform"), A = (s) => s !== void 0;
C.exports = class extends e {
get tag() {
return "outlinePr";
}
render(s, l) {
return !(!l || !A(l.summaryBelow) && !A(l.summaryRight)) && (s.leafNode(this.tag, { summaryBelow: A(l.summaryBelow) ? Number(l.summaryBelow) : void 0, summaryRight: A(l.summaryRight) ? Number(l.summaryRight) : void 0 }), !0);
}
parseOpen(s) {
return s.name === this.tag && (this.model = { summaryBelow: A(s.attributes.summaryBelow) ? !!Number(s.attributes.summaryBelow) : void 0, summaryRight: A(s.attributes.summaryRight) ? !!Number(s.attributes.summaryRight) : void 0 }, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 102: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "brk";
}
render(A, s) {
A.leafNode("brk", s);
}
parseOpen(A) {
return A.name === "brk" && (this.model = A.attributes.ref, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 103: [function(g, C, i) {
const e = g("../../../utils/under-dash"), A = g("../base-xform");
C.exports = class extends A {
get tag() {
return "pageMargins";
}
render(s, l) {
if (l) {
const n = { left: l.left, right: l.right, top: l.top, bottom: l.bottom, header: l.header, footer: l.footer };
e.some(n, (a) => a !== void 0) && s.leafNode(this.tag, n);
}
}
parseOpen(s) {
switch (s.name) {
case this.tag:
return this.model = { left: parseFloat(s.attributes.left || 0.7), right: parseFloat(s.attributes.right || 0.7), top: parseFloat(s.attributes.top || 0.75), bottom: parseFloat(s.attributes.bottom || 0.75), header: parseFloat(s.attributes.header || 0.3), footer: parseFloat(s.attributes.footer || 0.3) }, !0;
default:
return !1;
}
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 104: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "pageSetUpPr";
}
render(A, s) {
return !(!s || !s.fitToPage) && (A.leafNode(this.tag, { fitToPage: s.fitToPage ? "1" : void 0 }), !0);
}
parseOpen(A) {
return A.name === this.tag && (this.model = { fitToPage: A.attributes.fitToPage === "1" }, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 105: [function(g, C, i) {
const e = g("../../../utils/under-dash"), A = g("../base-xform");
function s(d) {
return d ? "1" : void 0;
}
function l(d) {
switch (d) {
case "overThenDown":
return d;
default:
return;
}
}
function n(d) {
switch (d) {
case "atEnd":
case "asDisplyed":
return d;
default:
return;
}
}
function a(d) {
switch (d) {
case "dash":
case "blank":
case "NA":
return d;
default:
return;
}
}
C.exports = class extends A {
get tag() {
return "pageSetup";
}
render(d, o) {
if (o) {
const c = { paperSize: o.paperSize, orientation: o.orientation, horizontalDpi: o.horizontalDpi, verticalDpi: o.verticalDpi, pageOrder: l(o.pageOrder), blackAndWhite: s(o.blackAndWhite), draft: s(o.draft), cellComments: n(o.cellComments), errors: a(o.errors), scale: o.scale, fitToWidth: o.fitToWidth, fitToHeight: o.fitToHeight, firstPageNumber: o.firstPageNumber, useFirstPageNumber: s(o.firstPageNumber), usePrinterDefaults: s(o.usePrinterDefaults), copies: o.copies };
e.some(c, (r) => r !== void 0) && d.leafNode(this.tag, c);
}
}
parseOpen(d) {
switch (d.name) {
case this.tag:
return this.model = { paperSize: (o = d.attributes.paperSize, o !== void 0 ? parseInt(o, 10) : void 0), orientation: d.attributes.orientation || "portrait", horizontalDpi: parseInt(d.attributes.horizontalDpi || "4294967295", 10), verticalDpi: parseInt(d.attributes.verticalDpi || "4294967295", 10), pageOrder: d.attributes.pageOrder || "downThenOver", blackAndWhite: d.attributes.blackAndWhite === "1", draft: d.attributes.draft === "1", cellComments: d.attributes.cellComments || "None", errors: d.attributes.errors || "displayed", scale: parseInt(d.attributes.scale || "100", 10), fitToWidth: parseInt(d.attributes.fitToWidth || "1", 10), fitToHeight: parseInt(d.attributes.fitToHeight || "1", 10), firstPageNumber: parseInt(d.attributes.firstPageNumber || "1", 10), useFirstPageNumber: d.attributes.useFirstPageNumber === "1", usePrinterDefaults: d.attributes.usePrinterDefaults === "1", copies: parseInt(d.attributes.copies || "1", 10) }, !0;
default:
return !1;
}
var o;
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 106: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "picture";
}
render(A, s) {
s && A.leafNode(this.tag, { "r:id": s.rId });
}
parseOpen(A) {
switch (A.name) {
case this.tag:
return this.model = { rId: A.attributes["r:id"] }, !0;
default:
return !1;
}
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 107: [function(g, C, i) {
const e = g("../../../utils/under-dash"), A = g("../base-xform");
function s(l) {
return l ? "1" : void 0;
}
C.exports = class extends A {
get tag() {
return "printOptions";
}
render(l, n) {
if (n) {
const a = { headings: s(n.showRowColHeaders), gridLines: s(n.showGridLines), horizontalCentered: s(n.horizontalCentered), verticalCentered: s(n.verticalCentered) };
e.some(a, (d) => d !== void 0) && l.leafNode(this.tag, a);
}
}
parseOpen(l) {
switch (l.name) {
case this.tag:
return this.model = { showRowColHeaders: l.attributes.headings === "1", showGridLines: l.attributes.gridLines === "1", horizontalCentered: l.attributes.horizontalCentered === "1", verticalCentered: l.attributes.verticalCentered === "1" }, !0;
default:
return !1;
}
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 108: [function(g, C, i) {
const e = g("./page-breaks-xform"), A = g("../list-xform");
C.exports = class extends A {
constructor() {
super({ tag: "rowBreaks", count: !0, childXform: new e() });
}
render(s, l) {
if (l && l.length) {
s.openNode(this.tag, this.$), this.count && (s.addAttribute(this.$count, l.length), s.addAttribute("manualBreakCount", l.length));
const { childXform: n } = this;
l.forEach((a) => {
n.render(s, a);
}), s.closeNode();
} else this.empty && s.leafNode(this.tag);
}
};
}, { "../list-xform": 71, "./page-breaks-xform": 102 }], 109: [function(g, C, i) {
const e = g("../base-xform"), A = g("../../../utils/utils"), s = g("./cell-xform");
C.exports = class extends e {
constructor(l) {
super(), this.maxItems = l && l.maxItems, this.map = { c: new s() };
}
get tag() {
return "row";
}
prepare(l, n) {
const a = n.styles.addStyleModel(l.style);
a && (l.styleId = a);
const d = this.map.c;
l.cells.forEach((o) => {
d.prepare(o, n);
});
}
render(l, n, a) {
l.openNode("row"), l.addAttribute("r", n.number), n.height && (l.addAttribute("ht", n.height), l.addAttribute("customHeight", "1")), n.hidden && l.addAttribute("hidden", "1"), n.min > 0 && n.max > 0 && n.min <= n.max && l.addAttribute("spans", `${n.min}:${n.max}`), n.styleId && (l.addAttribute("s", n.styleId), l.addAttribute("customFormat", "1")), l.addAttribute("x14ac:dyDescent", "0.25"), n.outlineLevel && l.addAttribute("outlineLevel", n.outlineLevel), n.collapsed && l.addAttribute("collapsed", "1");
const d = this.map.c;
n.cells.forEach((o) => {
d.render(l, o, a);
}), l.closeNode();
}
parseOpen(l) {
if (this.parser) return this.parser.parseOpen(l), !0;
if (l.name === "row") {
this.numRowsSeen += 1;
const n = l.attributes.spans ? l.attributes.spans.split(":").map((d) => parseInt(d, 10)) : [void 0, void 0], a = this.model = { number: parseInt(l.attributes.r, 10), min: n[0], max: n[1], cells: [] };
return l.attributes.s && (a.styleId = parseInt(l.attributes.s, 10)), A.parseBoolean(l.attributes.hidden) && (a.hidden = !0), A.parseBoolean(l.attributes.bestFit) && (a.bestFit = !0), l.attributes.ht && (a.height = parseFloat(l.attributes.ht)), l.attributes.outlineLevel && (a.outlineLevel = parseInt(l.attributes.outlineLevel, 10)), A.parseBoolean(l.attributes.collapsed) && (a.collapsed = !0), !0;
}
return this.parser = this.map[l.name], !!this.parser && (this.parser.parseOpen(l), !0);
}
parseText(l) {
this.parser && this.parser.parseText(l);
}
parseClose(l) {
if (this.parser) {
if (!this.parser.parseClose(l)) {
if (this.model.cells.push(this.parser.model), this.maxItems && this.model.cells.length > this.maxItems) throw new Error(`Max column count (${this.maxItems}) exceeded`);
this.parser = void 0;
}
return !0;
}
return !1;
}
reconcile(l, n) {
l.style = l.styleId ? n.styles.getStyleModel(l.styleId) : {}, l.styleId !== void 0 && (l.styleId = void 0);
const a = this.map.c;
l.cells.forEach((d) => {
a.reconcile(d, n);
});
}
};
}, { "../../../utils/utils": 27, "../base-xform": 32, "./cell-xform": 73 }], 110: [function(g, C, i) {
const e = g("../../../utils/under-dash"), A = g("../base-xform");
C.exports = class extends A {
get tag() {
return "sheetFormatPr";
}
render(s, l) {
if (l) {
const n = { defaultRowHeight: l.defaultRowHeight, outlineLevelRow: l.outlineLevelRow, outlineLevelCol: l.outlineLevelCol, "x14ac:dyDescent": l.dyDescent };
l.defaultColWidth && (n.defaultColWidth = l.defaultColWidth), l.defaultRowHeight && l.defaultRowHeight === 15 || (n.customHeight = "1"), e.some(n, (a) => a !== void 0) && s.leafNode("sheetFormatPr", n);
}
}
parseOpen(s) {
return s.name === "sheetFormatPr" && (this.model = { defaultRowHeight: parseFloat(s.attributes.defaultRowHeight || "0"), dyDescent: parseFloat(s.attributes["x14ac:dyDescent"] || "0"), outlineLevelRow: parseInt(s.attributes.outlineLevelRow || "0", 10), outlineLevelCol: parseInt(s.attributes.outlineLevelCol || "0", 10) }, s.attributes.defaultColWidth && (this.model.defaultColWidth = parseFloat(s.attributes.defaultColWidth)), !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 111: [function(g, C, i) {
const e = g("../base-xform"), A = g("../style/color-xform"), s = g("./page-setup-properties-xform"), l = g("./outline-properties-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { tabColor: new A("tabColor"), pageSetUpPr: new s(), outlinePr: new l() };
}
get tag() {
return "sheetPr";
}
render(n, a) {
if (a) {
n.addRollback(), n.openNode("sheetPr");
let d = !1;
d = this.map.tabColor.render(n, a.tabColor) || d, d = this.map.pageSetUpPr.render(n, a.pageSetup) || d, d = this.map.outlinePr.render(n, a.outlineProperties) || d, d ? (n.closeNode(), n.commit()) : n.rollback();
}
}
parseOpen(n) {
return this.parser ? (this.parser.parseOpen(n), !0) : n.name === this.tag ? (this.reset(), !0) : !!this.map[n.name] && (this.parser = this.map[n.name], this.parser.parseOpen(n), !0);
}
parseText(n) {
return !!this.parser && (this.parser.parseText(n), !0);
}
parseClose(n) {
return this.parser ? (this.parser.parseClose(n) || (this.parser = void 0), !0) : (this.map.tabColor.model || this.map.pageSetUpPr.model || this.map.outlinePr.model ? (this.model = {}, this.map.tabColor.model && (this.model.tabColor = this.map.tabColor.model), this.map.pageSetUpPr.model && (this.model.pageSetup = this.map.pageSetUpPr.model), this.map.outlinePr.model && (this.model.outlineProperties = this.map.outlinePr.model)) : this.model = null, !1);
}
};
}, { "../base-xform": 32, "../style/color-xform": 128, "./outline-properties-xform": 101, "./page-setup-properties-xform": 104 }], 112: [function(g, C, i) {
const e = g("../../../utils/under-dash"), A = g("../base-xform");
function s(n, a) {
return n ? a : void 0;
}
function l(n, a) {
return n === a || void 0;
}
C.exports = class extends A {
get tag() {
return "sheetProtection";
}
render(n, a) {
if (a) {
const d = { sheet: s(a.sheet, "1"), selectLockedCells: a.selectLockedCells === !1 ? "1" : void 0, selectUnlockedCells: a.selectUnlockedCells === !1 ? "1" : void 0, formatCells: s(a.formatCells, "0"), formatColumns: s(a.formatColumns, "0"), formatRows: s(a.formatRows, "0"), insertColumns: s(a.insertColumns, "0"), insertRows: s(a.insertRows, "0"), insertHyperlinks: s(a.insertHyperlinks, "0"), deleteColumns: s(a.deleteColumns, "0"), deleteRows: s(a.deleteRows, "0"), sort: s(a.sort, "0"), autoFilter: s(a.autoFilter, "0"), pivotTables: s(a.pivotTables, "0") };
a.sheet && (d.algorithmName = a.algorithmName, d.hashValue = a.hashValue, d.saltValue = a.saltValue, d.spinCount = a.spinCount, d.objects = s(a.objects === !1, "1"), d.scenarios = s(a.scenarios === !1, "1")), e.some(d, (o) => o !== void 0) && n.leafNode(this.tag, d);
}
}
parseOpen(n) {
switch (n.name) {
case this.tag:
return this.model = { sheet: l(n.attributes.sheet, "1"), objects: n.attributes.objects !== "1" && void 0, scenarios: n.attributes.scenarios !== "1" && void 0, selectLockedCells: n.attributes.selectLockedCells !== "1" && void 0, selectUnlockedCells: n.attributes.selectUnlockedCells !== "1" && void 0, formatCells: l(n.attributes.formatCells, "0"), formatColumns: l(n.attributes.formatColumns, "0"), formatRows: l(n.attributes.formatRows, "0"), insertColumns: l(n.attributes.insertColumns, "0"), insertRows: l(n.attributes.insertRows, "0"), insertHyperlinks: l(n.attributes.insertHyperlinks, "0"), deleteColumns: l(n.attributes.deleteColumns, "0"), deleteRows: l(n.attributes.deleteRows, "0"), sort: l(n.attributes.sort, "0"), autoFilter: l(n.attributes.autoFilter, "0"), pivotTables: l(n.attributes.pivotTables, "0") }, n.attributes.algorithmName && (this.model.algorithmName = n.attributes.algorithmName, this.model.hashValue = n.attributes.hashValue, this.model.saltValue = n.attributes.saltValue, this.model.spinCount = parseInt(n.attributes.spinCount, 10)), !0;
default:
return !1;
}
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../../../utils/under-dash": 26, "../base-xform": 32 }], 113: [function(g, C, i) {
const e = g("../../../utils/col-cache"), A = g("../base-xform"), s = { frozen: "frozen", frozenSplit: "frozen", split: "split" };
C.exports = class extends A {
get tag() {
return "sheetView";
}
prepare(l) {
switch (l.state) {
case "frozen":
case "split":
break;
default:
l.state = "normal";
}
}
render(l, n) {
l.openNode("sheetView", { workbookViewId: n.workbookViewId || 0 });
const a = function(h, b, u) {
u && l.addAttribute(h, b);
};
let d, o, c, r;
switch (a("rightToLeft", "1", n.rightToLeft === !0), a("tabSelected", "1", n.tabSelected), a("showRuler", "0", n.showRuler === !1), a("showRowColHeaders", "0", n.showRowColHeaders === !1), a("showGridLines", "0", n.showGridLines === !1), a("zoomScale", n.zoomScale, n.zoomScale), a("zoomScaleNormal", n.zoomScaleNormal, n.zoomScaleNormal), a("view", n.style, n.style), n.state) {
case "frozen":
o = n.xSplit || 0, c = n.ySplit || 0, d = n.topLeftCell || e.getAddress(c + 1, o + 1).address, r = (n.xSplit && n.ySplit ? "bottomRight" : n.xSplit && "topRight") || "bottomLeft", l.leafNode("pane", { xSplit: n.xSplit || void 0, ySplit: n.ySplit || void 0, topLeftCell: d, activePane: r, state: "frozen" }), l.leafNode("selection", { pane: r, activeCell: n.activeCell, sqref: n.activeCell });
break;
case "split":
n.activePane === "topLeft" && (n.activePane = void 0), l.leafNode("pane", { xSplit: n.xSplit || void 0, ySplit: n.ySplit || void 0, topLeftCell: n.topLeftCell, activePane: n.activePane }), l.leafNode("selection", { pane: n.activePane, activeCell: n.activeCell, sqref: n.activeCell });
break;
case "normal":
n.activeCell && l.leafNode("selection", { activeCell: n.activeCell, sqref: n.activeCell });
}
l.closeNode();
}
parseOpen(l) {
switch (l.name) {
case "sheetView":
return this.sheetView = { workbookViewId: parseInt(l.attributes.workbookViewId, 10), rightToLeft: l.attributes.rightToLeft === "1", tabSelected: l.attributes.tabSelected === "1", showRuler: l.attributes.showRuler !== "0", showRowColHeaders: l.attributes.showRowColHeaders !== "0", showGridLines: l.attributes.showGridLines !== "0", zoomScale: parseInt(l.attributes.zoomScale || "100", 10), zoomScaleNormal: parseInt(l.attributes.zoomScaleNormal || "100", 10), style: l.attributes.view }, this.pane = void 0, this.selections = {}, !0;
case "pane":
return this.pane = { xSplit: parseInt(l.attributes.xSplit || "0", 10), ySplit: parseInt(l.attributes.ySplit || "0", 10), topLeftCell: l.attributes.topLeftCell, activePane: l.attributes.activePane || "topLeft", state: l.attributes.state }, !0;
case "selection": {
const n = l.attributes.pane || "topLeft";
return this.selections[n] = { pane: n, activeCell: l.attributes.activeCell }, !0;
}
default:
return !1;
}
}
parseText() {
}
parseClose(l) {
let n, a;
switch (l) {
case "sheetView":
return this.sheetView && this.pane ? (n = this.model = { workbookViewId: this.sheetView.workbookViewId, rightToLeft: this.sheetView.rightToLeft, state: s[this.pane.state] || "split", xSplit: this.pane.xSplit, ySplit: this.pane.ySplit, topLeftCell: this.pane.topLeftCell, showRuler: this.sheetView.showRuler, showRowColHeaders: this.sheetView.showRowColHeaders, showGridLines: this.sheetView.showGridLines, zoomScale: this.sheetView.zoomScale, zoomScaleNormal: this.sheetView.zoomScaleNormal }, this.model.state === "split" && (n.activePane = this.pane.activePane), a = this.selections[this.pane.activePane], a && a.activeCell && (n.activeCell = a.activeCell), this.sheetView.style && (n.style = this.sheetView.style)) : (n = this.model = { workbookViewId: this.sheetView.workbookViewId, rightToLeft: this.sheetView.rightToLeft, state: "normal", showRuler: this.sheetView.showRuler, showRowColHeaders: this.sheetView.showRowColHeaders, showGridLines: this.sheetView.showGridLines, zoomScale: this.sheetView.zoomScale, zoomScaleNormal: this.sheetView.zoomScaleNormal }, a = this.selections.topLeft, a && a.activeCell && (n.activeCell = a.activeCell), this.sheetView.style && (n.style = this.sheetView.style)), !1;
default:
return !0;
}
}
reconcile() {
}
};
}, { "../../../utils/col-cache": 19, "../base-xform": 32 }], 114: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "tablePart";
}
render(A, s) {
s && A.leafNode(this.tag, { "r:id": s.rId });
}
parseOpen(A) {
switch (A.name) {
case this.tag:
return this.model = { rId: A.attributes["r:id"] }, !0;
default:
return !1;
}
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 115: [function(g, C, i) {
const e = g("../../../utils/under-dash"), A = g("../../../utils/col-cache"), s = g("../../../utils/xml-stream"), l = g("../../rel-type"), n = g("./merges"), a = g("../base-xform"), d = g("../list-xform"), o = g("./row-xform"), c = g("./col-xform"), r = g("./dimension-xform"), h = g("./hyperlink-xform"), b = g("./merge-cell-xform"), u = g("./data-validations-xform"), m = g("./sheet-properties-xform"), Z = g("./sheet-format-properties-xform"), p = g("./sheet-view-xform"), Y = g("./sheet-protection-xform"), R = g("./page-margins-xform"), X = g("./page-setup-xform"), H = g("./print-options-xform"), S = g("./auto-filter-xform"), z = g("./picture-xform"), v = g("./drawing-xform"), K = g("./table-part-xform"), V = g("./row-breaks-xform"), N = g("./header-footer-xform"), B = g("./cf/conditional-formattings-xform"), G = g("./ext-lst-xform"), w = (y, f) => {
if (!f || !f.length) return y;
if (!y || !y.length) return f;
const D = {}, F = {};
return y.forEach((T) => {
D[T.ref] = T, T.rules.forEach((Q) => {
const { x14Id: P } = Q;
P && (F[P] = Q);
});
}), f.forEach((T) => {
T.rules.forEach((Q) => {
const P = F[Q.x14Id];
P ? ((L, E) => {
Object.keys(E).forEach((J) => {
const k = L[J], j = E[J];
k === void 0 && j !== void 0 && (L[J] = j);
});
})(P, Q) : D[T.ref] ? D[T.ref].rules.push(Q) : y.push({ ref: T.ref, rules: [Q] });
});
}), y;
};
class W extends a {
constructor(f) {
super();
const { maxRows: D, maxCols: F, ignoreNodes: T } = f || {};
this.ignoreNodes = T || [], this.map = { sheetPr: new m(), dimension: new r(), sheetViews: new d({ tag: "sheetViews", count: !1, childXform: new p() }), sheetFormatPr: new Z(), cols: new d({ tag: "cols", count: !1, childXform: new c() }), sheetData: new d({ tag: "sheetData", count: !1, empty: !0, childXform: new o({ maxItems: F }), maxItems: D }), autoFilter: new S(), mergeCells: new d({ tag: "mergeCells", count: !0, childXform: new b() }), rowBreaks: new V(), hyperlinks: new d({ tag: "hyperlinks", count: !1, childXform: new h() }), pageMargins: new R(), dataValidations: new u(), pageSetup: new X(), headerFooter: new N(), printOptions: new H(), picture: new z(), drawing: new v(), sheetProtection: new Y(), tableParts: new d({ tag: "tableParts", count: !0, childXform: new K() }), conditionalFormatting: new B(), extLst: new G() };
}
prepare(f, D) {
D.merges = new n(), f.hyperlinks = D.hyperlinks = [], f.comments = D.comments = [], D.formulae = {}, D.siFormulae = 0, this.map.cols.prepare(f.cols, D), this.map.sheetData.prepare(f.rows, D), this.map.conditionalFormatting.prepare(f.conditionalFormattings, D), f.mergeCells = D.merges.mergeCells;
const F = f.rels = [];
function T(L) {
return "rId" + (L.length + 1);
}
if (f.hyperlinks.forEach((L) => {
const E = T(F);
L.rId = E, F.push({ Id: E, Type: l.Hyperlink, Target: L.target, TargetMode: "External" });
}), f.comments.length > 0) {
const L = { Id: T(F), Type: l.Comments, Target: `../comments${f.id}.xml` };
F.push(L);
const E = { Id: T(F), Type: l.VmlDrawing, Target: `../drawings/vmlDrawing${f.id}.vml` };
F.push(E), f.comments.forEach((J) => {
J.refAddress = A.decodeAddress(J.ref);
}), D.commentRefs.push({ commentName: "comments" + f.id, vmlDrawing: "vmlDrawing" + f.id });
}
const Q = [];
let P;
f.media.forEach((L) => {
if (L.type === "background") {
const E = T(F);
P = D.media[L.imageId], F.push({ Id: E, Type: l.Image, Target: `../media/${P.name}.${P.extension}` }), f.background = { rId: E }, f.image = D.media[L.imageId];
} else if (L.type === "image") {
let { drawing: E } = f;
P = D.media[L.imageId], E || (E = f.drawing = { rId: T(F), name: "drawing" + ++D.drawingsCount, anchors: [], rels: [] }, D.drawings.push(E), F.push({ Id: E.rId, Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing", Target: `../drawings/${E.name}.xml` }));
let J = this.preImageId === L.imageId ? Q[L.imageId] : Q[E.rels.length];
J || (J = T(E.rels), Q[E.rels.length] = J, E.rels.push({ Id: J, Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", Target: `../media/${P.name}.${P.extension}` }));
const k = { picture: { rId: J }, range: L.range };
if (L.hyperlinks && L.hyperlinks.hyperlink) {
const j = T(E.rels);
Q[E.rels.length] = j, k.picture.hyperlinks = { tooltip: L.hyperlinks.tooltip, rId: j }, E.rels.push({ Id: j, Type: l.Hyperlink, Target: L.hyperlinks.hyperlink, TargetMode: "External" });
}
this.preImageId = L.imageId, E.anchors.push(k);
}
}), f.tables.forEach((L) => {
const E = T(F);
L.rId = E, F.push({ Id: E, Type: l.Table, Target: "../tables/" + L.target }), L.columns.forEach((J) => {
const { style: k } = J;
k && (J.dxfId = D.styles.addDxfStyle(k));
});
}), this.map.extLst.prepare(f, D);
}
render(f, D) {
f.openXml(s.StdDocAttributes), f.openNode("worksheet", W.WORKSHEET_ATTRIBUTES);
const F = D.properties ? { defaultRowHeight: D.properties.defaultRowHeight, dyDescent: D.properties.dyDescent, outlineLevelCol: D.properties.outlineLevelCol, outlineLevelRow: D.properties.outlineLevelRow } : void 0;
D.properties && D.properties.defaultColWidth && (F.defaultColWidth = D.properties.defaultColWidth);
const T = { outlineProperties: D.properties && D.properties.outlineProperties, tabColor: D.properties && D.properties.tabColor, pageSetup: D.pageSetup && D.pageSetup.fitToPage ? { fitToPage: D.pageSetup.fitToPage } : void 0 }, Q = D.pageSetup && D.pageSetup.margins, P = { showRowColHeaders: D.pageSetup && D.pageSetup.showRowColHeaders, showGridLines: D.pageSetup && D.pageSetup.showGridLines, horizontalCentered: D.pageSetup && D.pageSetup.horizontalCentered, verticalCentered: D.pageSetup && D.pageSetup.verticalCentered }, L = D.sheetProtection;
this.map.sheetPr.render(f, T), this.map.dimension.render(f, D.dimensions), this.map.sheetViews.render(f, D.views), this.map.sheetFormatPr.render(f, F), this.map.cols.render(f, D.cols), this.map.sheetData.render(f, D.rows), this.map.sheetProtection.render(f, L), this.map.autoFilter.render(f, D.autoFilter), this.map.mergeCells.render(f, D.mergeCells), this.map.conditionalFormatting.render(f, D.conditionalFormattings), this.map.dataValidations.render(f, D.dataValidations), this.map.hyperlinks.render(f, D.hyperlinks), this.map.printOptions.render(f, P), this.map.pageMargins.render(f, Q), this.map.pageSetup.render(f, D.pageSetup), this.map.headerFooter.render(f, D.headerFooter), this.map.rowBreaks.render(f, D.rowBreaks), this.map.drawing.render(f, D.drawing), this.map.picture.render(f, D.background), this.map.tableParts.render(f, D.tables), this.map.extLst.render(f, D), D.rels && D.rels.forEach((E) => {
E.Type === l.VmlDrawing && f.leafNode("legacyDrawing", { "r:id": E.Id });
}), f.closeNode();
}
parseOpen(f) {
return this.parser ? (this.parser.parseOpen(f), !0) : f.name === "worksheet" ? (e.each(this.map, (D) => {
D.reset();
}), !0) : (this.map[f.name] && !this.ignoreNodes.includes(f.name) && (this.parser = this.map[f.name], this.parser.parseOpen(f)), !0);
}
parseText(f) {
this.parser && this.parser.parseText(f);
}
parseClose(f) {
if (this.parser) return this.parser.parseClose(f) || (this.parser = void 0), !0;
switch (f) {
case "worksheet": {
const D = this.map.sheetFormatPr.model || {};
this.map.sheetPr.model && this.map.sheetPr.model.tabColor && (D.tabColor = this.map.sheetPr.model.tabColor), this.map.sheetPr.model && this.map.sheetPr.model.outlineProperties && (D.outlineProperties = this.map.sheetPr.model.outlineProperties);
const F = { fitToPage: this.map.sheetPr.model && this.map.sheetPr.model.pageSetup && this.map.sheetPr.model.pageSetup.fitToPage || !1, margins: this.map.pageMargins.model }, T = Object.assign(F, this.map.pageSetup.model, this.map.printOptions.model), Q = w(this.map.conditionalFormatting.model, this.map.extLst.model && this.map.extLst.model["x14:conditionalFormattings"]);
return this.model = { dimensions: this.map.dimension.model, cols: this.map.cols.model, rows: this.map.sheetData.model, mergeCells: this.map.mergeCells.model, hyperlinks: this.map.hyperlinks.model, dataValidations: this.map.dataValidations.model, properties: D, views: this.map.sheetViews.model, pageSetup: T, headerFooter: this.map.headerFooter.model, background: this.map.picture.model, drawing: this.map.drawing.model, tables: this.map.tableParts.model, conditionalFormattings: Q }, this.map.autoFilter.model && (this.model.autoFilter = this.map.autoFilter.model), this.map.sheetProtection.model && (this.model.sheetProtection = this.map.sheetProtection.model), !1;
}
default:
return !0;
}
}
reconcile(f, D) {
const F = (f.relationships || []).reduce((Q, P) => {
if (Q[P.Id] = P, P.Type === l.Comments && (f.comments = D.comments[P.Target].comments), P.Type === l.VmlDrawing && f.comments && f.comments.length) {
const L = D.vmlDrawings[P.Target].comments;
f.comments.forEach((E, J) => {
E.note = Object.assign({}, E.note, L[J]);
});
}
return Q;
}, {});
if (D.commentsMap = (f.comments || []).reduce((Q, P) => (P.ref && (Q[P.ref] = P), Q), {}), D.hyperlinkMap = (f.hyperlinks || []).reduce((Q, P) => (P.rId && (Q[P.address] = F[P.rId].Target), Q), {}), D.formulae = {}, f.rows = f.rows && f.rows.filter(Boolean) || [], f.rows.forEach((Q) => {
Q.cells = Q.cells && Q.cells.filter(Boolean) || [];
}), this.map.cols.reconcile(f.cols, D), this.map.sheetData.reconcile(f.rows, D), this.map.conditionalFormatting.reconcile(f.conditionalFormattings, D), f.media = [], f.drawing) {
const Q = F[f.drawing.rId].Target.match(/\/drawings\/([a-zA-Z0-9]+)[.][a-zA-Z]{3,4}$/);
if (Q) {
const P = Q[1];
D.drawings[P].anchors.forEach((L) => {
if (L.medium) {
const E = { type: "image", imageId: L.medium.index, range: L.range, hyperlinks: L.picture.hyperlinks };
f.media.push(E);
}
});
}
}
const T = f.background && F[f.background.rId];
if (T) {
const Q = T.Target.split("/media/")[1], P = D.mediaIndex && D.mediaIndex[Q];
P !== void 0 && f.media.push({ type: "background", imageId: P });
}
f.tables = (f.tables || []).map((Q) => {
const P = F[Q.rId];
return D.tables[P.Target];
}), delete f.relationships, delete f.hyperlinks, delete f.comments;
}
}
W.WORKSHEET_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "x14ac", "xmlns:x14ac": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" }, C.exports = W;
}, { "../../../utils/col-cache": 19, "../../../utils/under-dash": 26, "../../../utils/xml-stream": 28, "../../rel-type": 31, "../base-xform": 32, "../list-xform": 71, "./auto-filter-xform": 72, "./cf/conditional-formattings-xform": 87, "./col-xform": 92, "./data-validations-xform": 93, "./dimension-xform": 94, "./drawing-xform": 95, "./ext-lst-xform": 96, "./header-footer-xform": 97, "./hyperlink-xform": 98, "./merge-cell-xform": 99, "./merges": 100, "./page-margins-xform": 103, "./page-setup-xform": 105, "./picture-xform": 106, "./print-options-xform": 107, "./row-breaks-xform": 108, "./row-xform": 109, "./sheet-format-properties-xform": 110, "./sheet-properties-xform": 111, "./sheet-protection-xform": 112, "./sheet-view-xform": 113, "./table-part-xform": 114 }], 116: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
constructor(A) {
super(), this.tag = A.tag, this.attr = A.attr;
}
render(A, s) {
s && (A.openNode(this.tag), A.closeNode());
}
parseOpen(A) {
A.name === this.tag && (this.model = !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 117: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
constructor(A) {
super(), this.tag = A.tag, this.attr = A.attr, this.attrs = A.attrs, this._format = A.format || function(s) {
try {
return Number.isNaN(s.getTime()) ? "" : s.toISOString();
} catch {
return "";
}
}, this._parse = A.parse || function(s) {
return new Date(s);
};
}
render(A, s) {
s && (A.openNode(this.tag), this.attrs && A.addAttributes(this.attrs), this.attr ? A.addAttribute(this.attr, this._format(s)) : A.writeText(this._format(s)), A.closeNode());
}
parseOpen(A) {
A.name === this.tag && (this.attr ? this.model = this._parse(A.attributes[this.attr]) : this.text = []);
}
parseText(A) {
this.attr || this.text.push(A);
}
parseClose() {
return this.attr || (this.model = this._parse(this.text.join(""))), !1;
}
};
}, { "../base-xform": 32 }], 118: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
constructor(A) {
super(), this.tag = A.tag, this.attr = A.attr, this.attrs = A.attrs, this.zero = A.zero;
}
render(A, s) {
(s || this.zero) && (A.openNode(this.tag), this.attrs && A.addAttributes(this.attrs), this.attr ? A.addAttribute(this.attr, s) : A.writeText(s), A.closeNode());
}
parseOpen(A) {
return A.name === this.tag && (this.attr ? this.model = parseInt(A.attributes[this.attr], 10) : this.text = [], !0);
}
parseText(A) {
this.attr || this.text.push(A);
}
parseClose() {
return this.attr || (this.model = parseInt(this.text.join("") || 0, 10)), !1;
}
};
}, { "../base-xform": 32 }], 119: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
constructor(A) {
super(), this.tag = A.tag, this.attr = A.attr, this.attrs = A.attrs;
}
render(A, s) {
s !== void 0 && (A.openNode(this.tag), this.attrs && A.addAttributes(this.attrs), this.attr ? A.addAttribute(this.attr, s) : A.writeText(s), A.closeNode());
}
parseOpen(A) {
A.name === this.tag && (this.attr ? this.model = A.attributes[this.attr] : this.text = []);
}
parseText(A) {
this.attr || this.text.push(A);
}
parseClose() {
return this.attr || (this.model = this.text.join("")), !1;
}
};
}, { "../base-xform": 32 }], 120: [function(g, C, i) {
const e = g("./base-xform"), A = g("../../utils/xml-stream");
C.exports = class extends e {
constructor(s) {
super(), this._model = s;
}
render(s) {
if (!this._xml) {
const l = new A();
(function n(a, d) {
a.openNode(d.tag, d.$), d.c && d.c.forEach((o) => {
n(a, o);
}), d.t && a.writeText(d.t), a.closeNode();
})(l, this._model), this._xml = l.xml;
}
s.writeXml(this._xml);
}
parseOpen() {
return !0;
}
parseText() {
}
parseClose(s) {
switch (s) {
case this._model.tag:
return !1;
default:
return !0;
}
}
};
}, { "../../utils/xml-stream": 28, "./base-xform": 32 }], 121: [function(g, C, i) {
const e = g("./text-xform"), A = g("./rich-text-xform"), s = g("../base-xform");
C.exports = class extends s {
constructor() {
super(), this.map = { r: new A(), t: new e() };
}
get tag() {
return "rPh";
}
render(l, n) {
if (l.openNode(this.tag, { sb: n.sb || 0, eb: n.eb || 0 }), n && n.hasOwnProperty("richText") && n.richText) {
const { r: a } = this.map;
n.richText.forEach((d) => {
a.render(l, d);
});
} else n && this.map.t.render(l, n.text);
l.closeNode();
}
parseOpen(l) {
const { name: n } = l;
return this.parser ? (this.parser.parseOpen(l), !0) : n === this.tag ? (this.model = { sb: parseInt(l.attributes.sb, 10), eb: parseInt(l.attributes.eb, 10) }, !0) : (this.parser = this.map[n], !!this.parser && (this.parser.parseOpen(l), !0));
}
parseText(l) {
this.parser && this.parser.parseText(l);
}
parseClose(l) {
if (this.parser) {
if (!this.parser.parseClose(l)) {
switch (l) {
case "r": {
let n = this.model.richText;
n || (n = this.model.richText = []), n.push(this.parser.model);
break;
}
case "t":
this.model.text = this.parser.model;
}
this.parser = void 0;
}
return !0;
}
switch (l) {
case this.tag:
return !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32, "./rich-text-xform": 122, "./text-xform": 125 }], 122: [function(g, C, i) {
const e = g("./text-xform"), A = g("../style/font-xform"), s = g("../base-xform");
class l extends s {
constructor(a) {
super(), this.model = a;
}
get tag() {
return "r";
}
get textXform() {
return this._textXform || (this._textXform = new e());
}
get fontXform() {
return this._fontXform || (this._fontXform = new A(l.FONT_OPTIONS));
}
render(a, d) {
d = d || this.model, a.openNode("r"), d.font && this.fontXform.render(a, d.font), this.textXform.render(a, d.text), a.closeNode();
}
parseOpen(a) {
if (this.parser) return this.parser.parseOpen(a), !0;
switch (a.name) {
case "r":
return this.model = {}, !0;
case "t":
return this.parser = this.textXform, this.parser.parseOpen(a), !0;
case "rPr":
return this.parser = this.fontXform, this.parser.parseOpen(a), !0;
default:
return !1;
}
}
parseText(a) {
this.parser && this.parser.parseText(a);
}
parseClose(a) {
switch (a) {
case "r":
return !1;
case "t":
return this.model.text = this.parser.model, this.parser = void 0, !0;
case "rPr":
return this.model.font = this.parser.model, this.parser = void 0, !0;
default:
return this.parser && this.parser.parseClose(a), !0;
}
}
}
l.FONT_OPTIONS = { tagName: "rPr", fontNameTag: "rFont" }, C.exports = l;
}, { "../base-xform": 32, "../style/font-xform": 131, "./text-xform": 125 }], 123: [function(g, C, i) {
const e = g("./text-xform"), A = g("./rich-text-xform"), s = g("./phonetic-text-xform"), l = g("../base-xform");
C.exports = class extends l {
constructor(n) {
super(), this.model = n, this.map = { r: new A(), t: new e(), rPh: new s() };
}
get tag() {
return "si";
}
render(n, a) {
n.openNode(this.tag), a && a.hasOwnProperty("richText") && a.richText ? a.richText.length ? a.richText.forEach((d) => {
this.map.r.render(n, d);
}) : this.map.t.render(n, "") : a != null && this.map.t.render(n, a), n.closeNode();
}
parseOpen(n) {
const { name: a } = n;
return this.parser ? (this.parser.parseOpen(n), !0) : a === this.tag ? (this.model = {}, !0) : (this.parser = this.map[a], !!this.parser && (this.parser.parseOpen(n), !0));
}
parseText(n) {
this.parser && this.parser.parseText(n);
}
parseClose(n) {
if (this.parser) {
if (!this.parser.parseClose(n)) {
switch (n) {
case "r": {
let a = this.model.richText;
a || (a = this.model.richText = []), a.push(this.parser.model);
break;
}
case "t":
this.model = this.parser.model;
}
this.parser = void 0;
}
return !0;
}
switch (n) {
case this.tag:
return !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32, "./phonetic-text-xform": 121, "./rich-text-xform": 122, "./text-xform": 125 }], 124: [function(g, C, i) {
const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("./shared-string-xform");
C.exports = class extends A {
constructor(l) {
super(), this.model = l || { values: [], count: 0 }, this.hash = /* @__PURE__ */ Object.create(null), this.rich = /* @__PURE__ */ Object.create(null);
}
get sharedStringXform() {
return this._sharedStringXform || (this._sharedStringXform = new s());
}
get values() {
return this.model.values;
}
get uniqueCount() {
return this.model.values.length;
}
get count() {
return this.model.count;
}
getString(l) {
return this.model.values[l];
}
add(l) {
return l.richText ? this.addRichText(l) : this.addText(l);
}
addText(l) {
let n = this.hash[l];
return n === void 0 && (n = this.hash[l] = this.model.values.length, this.model.values.push(l)), this.model.count++, n;
}
addRichText(l) {
const n = this.sharedStringXform.toXml(l);
let a = this.rich[n];
return a === void 0 && (a = this.rich[n] = this.model.values.length, this.model.values.push(l)), this.model.count++, a;
}
render(l, n) {
n = n || this._values, l.openXml(e.StdDocAttributes), l.openNode("sst", { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", count: n.count, uniqueCount: n.values.length });
const a = this.sharedStringXform;
n.values.forEach((d) => {
a.render(l, d);
}), l.closeNode();
}
parseOpen(l) {
if (this.parser) return this.parser.parseOpen(l), !0;
switch (l.name) {
case "sst":
return !0;
case "si":
return this.parser = this.sharedStringXform, this.parser.parseOpen(l), !0;
default:
throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(l));
}
}
parseText(l) {
this.parser && this.parser.parseText(l);
}
parseClose(l) {
if (this.parser) return this.parser.parseClose(l) || (this.model.values.push(this.parser.model), this.model.count++, this.parser = void 0), !0;
switch (l) {
case "sst":
return !1;
default:
throw new Error("Unexpected xml node in parseClose: " + l);
}
}
};
}, { "../../../utils/xml-stream": 28, "../base-xform": 32, "./shared-string-xform": 123 }], 125: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "t";
}
render(A, s) {
A.openNode("t"), /^\s|\n|\s$/.test(s) && A.addAttribute("xml:space", "preserve"), A.writeText(s), A.closeNode();
}
get model() {
return this._text.join("").replace(/_x([0-9A-F]{4})_/g, (A, s) => String.fromCharCode(parseInt(s, 16)));
}
parseOpen(A) {
switch (A.name) {
case "t":
return this._text = [], !0;
default:
return !1;
}
}
parseText(A) {
this._text.push(A);
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 126: [function(g, C, i) {
const e = g("../../../doc/enums"), A = g("../../../utils/utils"), s = g("../base-xform"), l = { horizontalValues: ["left", "center", "right", "fill", "centerContinuous", "distributed", "justify"].reduce((a, d) => (a[d] = !0, a), {}), horizontal(a) {
return this.horizontalValues[a] ? a : void 0;
}, verticalValues: ["top", "middle", "bottom", "distributed", "justify"].reduce((a, d) => (a[d] = !0, a), {}), vertical(a) {
return a === "middle" ? "center" : this.verticalValues[a] ? a : void 0;
}, wrapText: (a) => !!a || void 0, shrinkToFit: (a) => !!a || void 0, textRotation(a) {
switch (a) {
case "vertical":
return a;
default:
return (a = A.validInt(a)) >= -90 && a <= 90 ? a : void 0;
}
}, indent: (a) => (a = A.validInt(a), Math.max(0, a)), readingOrder(a) {
switch (a) {
case "ltr":
return e.ReadingOrder.LeftToRight;
case "rtl":
return e.ReadingOrder.RightToLeft;
default:
return;
}
} }, n = { toXml(a) {
if (a = l.textRotation(a)) {
if (a === "vertical") return 255;
const d = Math.round(a);
if (d >= 0 && d <= 90) return d;
if (d < 0 && d >= -90) return 90 - d;
}
}, toModel(a) {
const d = A.validInt(a);
if (d !== void 0) {
if (d === 255) return "vertical";
if (d >= 0 && d <= 90) return d;
if (d > 90 && d <= 180) return 90 - d;
}
} };
C.exports = class extends s {
get tag() {
return "alignment";
}
render(a, d) {
a.addRollback(), a.openNode("alignment");
let o = !1;
function c(r, h) {
h && (a.addAttribute(r, h), o = !0);
}
c("horizontal", l.horizontal(d.horizontal)), c("vertical", l.vertical(d.vertical)), c("wrapText", !!l.wrapText(d.wrapText) && "1"), c("shrinkToFit", !!l.shrinkToFit(d.shrinkToFit) && "1"), c("indent", l.indent(d.indent)), c("textRotation", n.toXml(d.textRotation)), c("readingOrder", l.readingOrder(d.readingOrder)), a.closeNode(), o ? a.commit() : a.rollback();
}
parseOpen(a) {
const d = {};
let o = !1;
function c(r, h, b) {
r && (d[h] = b, o = !0);
}
c(a.attributes.horizontal, "horizontal", a.attributes.horizontal), c(a.attributes.vertical, "vertical", a.attributes.vertical === "center" ? "middle" : a.attributes.vertical), c(a.attributes.wrapText, "wrapText", A.parseBoolean(a.attributes.wrapText)), c(a.attributes.shrinkToFit, "shrinkToFit", A.parseBoolean(a.attributes.shrinkToFit)), c(a.attributes.indent, "indent", parseInt(a.attributes.indent, 10)), c(a.attributes.textRotation, "textRotation", n.toModel(a.attributes.textRotation)), c(a.attributes.readingOrder, "readingOrder", a.attributes.readingOrder === "2" ? "rtl" : "ltr"), this.model = o ? d : null;
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../../../doc/enums": 7, "../../../utils/utils": 27, "../base-xform": 32 }], 127: [function(g, C, i) {
const e = g("../base-xform"), A = g("../../../utils/utils"), s = g("./color-xform");
class l extends e {
constructor(a) {
super(), this.name = a, this.map = { color: new s() };
}
get tag() {
return this.name;
}
render(a, d, o) {
const c = d && d.color || o || this.defaultColor;
a.openNode(this.name), d && d.style && (a.addAttribute("style", d.style), c && this.map.color.render(a, c)), a.closeNode();
}
parseOpen(a) {
if (this.parser) return this.parser.parseOpen(a), !0;
switch (a.name) {
case this.name: {
const { style: d } = a.attributes;
return this.model = d ? { style: d } : void 0, !0;
}
case "color":
return this.parser = this.map.color, this.parser.parseOpen(a), !0;
default:
return !1;
}
}
parseText(a) {
this.parser && this.parser.parseText(a);
}
parseClose(a) {
return this.parser ? (this.parser.parseClose(a) || (this.parser = void 0), !0) : (a === this.name && this.map.color.model && (this.model || (this.model = {}), this.model.color = this.map.color.model), !1);
}
validStyle(a) {
return l.validStyleValues[a];
}
}
l.validStyleValues = ["thin", "dashed", "dotted", "dashDot", "hair", "dashDotDot", "slantDashDot", "mediumDashed", "mediumDashDotDot", "mediumDashDot", "medium", "double", "thick"].reduce((n, a) => (n[a] = !0, n), {}), C.exports = class extends e {
constructor() {
super(), this.map = { top: new l("top"), left: new l("left"), bottom: new l("bottom"), right: new l("right"), diagonal: new l("diagonal") };
}
render(n, a) {
const { color: d } = a;
function o(c, r) {
c && !c.color && a.color && (c = { ...c, color: a.color }), r.render(n, c, d);
}
n.openNode("border"), a.diagonal && a.diagonal.style && (a.diagonal.up && n.addAttribute("diagonalUp", "1"), a.diagonal.down && n.addAttribute("diagonalDown", "1")), o(a.left, this.map.left), o(a.right, this.map.right), o(a.top, this.map.top), o(a.bottom, this.map.bottom), o(a.diagonal, this.map.diagonal), n.closeNode();
}
parseOpen(n) {
if (this.parser) return this.parser.parseOpen(n), !0;
switch (n.name) {
case "border":
return this.reset(), this.diagonalUp = A.parseBoolean(n.attributes.diagonalUp), this.diagonalDown = A.parseBoolean(n.attributes.diagonalDown), !0;
default:
return this.parser = this.map[n.name], !!this.parser && (this.parser.parseOpen(n), !0);
}
}
parseText(n) {
this.parser && this.parser.parseText(n);
}
parseClose(n) {
if (this.parser) return this.parser.parseClose(n) || (this.parser = void 0), !0;
if (n === "border") {
const a = this.model = {}, d = function(o, c, r) {
c && (r && Object.assign(c, r), a[o] = c);
};
d("left", this.map.left.model), d("right", this.map.right.model), d("top", this.map.top.model), d("bottom", this.map.bottom.model), d("diagonal", this.map.diagonal.model, { up: this.diagonalUp, down: this.diagonalDown });
}
return !1;
}
};
}, { "../../../utils/utils": 27, "../base-xform": 32, "./color-xform": 128 }], 128: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
constructor(A) {
super(), this.name = A || "color";
}
get tag() {
return this.name;
}
render(A, s) {
return !!s && (A.openNode(this.name), s.argb ? A.addAttribute("rgb", s.argb) : s.theme !== void 0 ? (A.addAttribute("theme", s.theme), s.tint !== void 0 && A.addAttribute("tint", s.tint)) : s.indexed !== void 0 ? A.addAttribute("indexed", s.indexed) : A.addAttribute("auto", "1"), A.closeNode(), !0);
}
parseOpen(A) {
return A.name === this.name && (A.attributes.rgb ? this.model = { argb: A.attributes.rgb } : A.attributes.theme ? (this.model = { theme: parseInt(A.attributes.theme, 10) }, A.attributes.tint && (this.model.tint = parseFloat(A.attributes.tint))) : A.attributes.indexed ? this.model = { indexed: parseInt(A.attributes.indexed, 10) } : this.model = void 0, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 129: [function(g, C, i) {
const e = g("../base-xform"), A = g("./alignment-xform"), s = g("./border-xform"), l = g("./fill-xform"), n = g("./font-xform"), a = g("./numfmt-xform"), d = g("./protection-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { alignment: new A(), border: new s(), fill: new l(), font: new n(), numFmt: new a(), protection: new d() };
}
get tag() {
return "dxf";
}
render(o, c) {
if (o.openNode(this.tag), c.font && this.map.font.render(o, c.font), c.numFmt && c.numFmtId) {
const r = { id: c.numFmtId, formatCode: c.numFmt };
this.map.numFmt.render(o, r);
}
c.fill && this.map.fill.render(o, c.fill), c.alignment && this.map.alignment.render(o, c.alignment), c.border && this.map.border.render(o, c.border), c.protection && this.map.protection.render(o, c.protection), o.closeNode();
}
parseOpen(o) {
if (this.parser) return this.parser.parseOpen(o), !0;
switch (o.name) {
case this.tag:
return this.reset(), !0;
default:
return this.parser = this.map[o.name], this.parser && this.parser.parseOpen(o), !0;
}
}
parseText(o) {
this.parser && this.parser.parseText(o);
}
parseClose(o) {
return this.parser ? (this.parser.parseClose(o) || (this.parser = void 0), !0) : o !== this.tag || (this.model = { alignment: this.map.alignment.model, border: this.map.border.model, fill: this.map.fill.model, font: this.map.font.model, numFmt: this.map.numFmt.model, protection: this.map.protection.model }, !1);
}
};
}, { "../base-xform": 32, "./alignment-xform": 126, "./border-xform": 127, "./fill-xform": 130, "./font-xform": 131, "./numfmt-xform": 132, "./protection-xform": 133 }], 130: [function(g, C, i) {
const e = g("../base-xform"), A = g("./color-xform");
class s extends e {
constructor() {
super(), this.map = { color: new A() };
}
get tag() {
return "stop";
}
render(o, c) {
o.openNode("stop"), o.addAttribute("position", c.position), this.map.color.render(o, c.color), o.closeNode();
}
parseOpen(o) {
if (this.parser) return this.parser.parseOpen(o), !0;
switch (o.name) {
case "stop":
return this.model = { position: parseFloat(o.attributes.position) }, !0;
case "color":
return this.parser = this.map.color, this.parser.parseOpen(o), !0;
default:
return !1;
}
}
parseText() {
}
parseClose(o) {
return !!this.parser && (this.parser.parseClose(o) || (this.model.color = this.parser.model, this.parser = void 0), !0);
}
}
class l extends e {
constructor() {
super(), this.map = { fgColor: new A("fgColor"), bgColor: new A("bgColor") };
}
get name() {
return "pattern";
}
get tag() {
return "patternFill";
}
render(o, c) {
o.openNode("patternFill"), o.addAttribute("patternType", c.pattern), c.fgColor && this.map.fgColor.render(o, c.fgColor), c.bgColor && this.map.bgColor.render(o, c.bgColor), o.closeNode();
}
parseOpen(o) {
if (this.parser) return this.parser.parseOpen(o), !0;
switch (o.name) {
case "patternFill":
return this.model = { type: "pattern", pattern: o.attributes.patternType }, !0;
default:
return this.parser = this.map[o.name], !!this.parser && (this.parser.parseOpen(o), !0);
}
}
parseText(o) {
this.parser && this.parser.parseText(o);
}
parseClose(o) {
return !!this.parser && (this.parser.parseClose(o) || (this.parser.model && (this.model[o] = this.parser.model), this.parser = void 0), !0);
}
}
class n extends e {
constructor() {
super(), this.map = { stop: new s() };
}
get name() {
return "gradient";
}
get tag() {
return "gradientFill";
}
render(o, c) {
switch (o.openNode("gradientFill"), c.gradient) {
case "angle":
o.addAttribute("degree", c.degree);
break;
case "path":
o.addAttribute("type", "path"), c.center.left && (o.addAttribute("left", c.center.left), c.center.right === void 0 && o.addAttribute("right", c.center.left)), c.center.right && o.addAttribute("right", c.center.right), c.center.top && (o.addAttribute("top", c.center.top), c.center.bottom === void 0 && o.addAttribute("bottom", c.center.top)), c.center.bottom && o.addAttribute("bottom", c.center.bottom);
}
const r = this.map.stop;
c.stops.forEach((h) => {
r.render(o, h);
}), o.closeNode();
}
parseOpen(o) {
if (this.parser) return this.parser.parseOpen(o), !0;
switch (o.name) {
case "gradientFill": {
const c = this.model = { stops: [] };
return o.attributes.degree ? (c.gradient = "angle", c.degree = parseInt(o.attributes.degree, 10)) : o.attributes.type === "path" && (c.gradient = "path", c.center = { left: o.attributes.left ? parseFloat(o.attributes.left) : 0, top: o.attributes.top ? parseFloat(o.attributes.top) : 0 }, o.attributes.right !== o.attributes.left && (c.center.right = o.attributes.right ? parseFloat(o.attributes.right) : 0), o.attributes.bottom !== o.attributes.top && (c.center.bottom = o.attributes.bottom ? parseFloat(o.attributes.bottom) : 0)), !0;
}
case "stop":
return this.parser = this.map.stop, this.parser.parseOpen(o), !0;
default:
return !1;
}
}
parseText(o) {
this.parser && this.parser.parseText(o);
}
parseClose(o) {
return !!this.parser && (this.parser.parseClose(o) || (this.model.stops.push(this.parser.model), this.parser = void 0), !0);
}
}
class a extends e {
constructor() {
super(), this.map = { patternFill: new l(), gradientFill: new n() };
}
get tag() {
return "fill";
}
render(o, c) {
switch (o.addRollback(), o.openNode("fill"), c.type) {
case "pattern":
this.map.patternFill.render(o, c);
break;
case "gradient":
this.map.gradientFill.render(o, c);
break;
default:
return void o.rollback();
}
o.closeNode(), o.commit();
}
parseOpen(o) {
if (this.parser) return this.parser.parseOpen(o), !0;
switch (o.name) {
case "fill":
return this.model = {}, !0;
default:
return this.parser = this.map[o.name], !!this.parser && (this.parser.parseOpen(o), !0);
}
}
parseText(o) {
this.parser && this.parser.parseText(o);
}
parseClose(o) {
return !!this.parser && (this.parser.parseClose(o) || (this.model = this.parser.model, this.model.type = this.parser.name, this.parser = void 0), !0);
}
validStyle(o) {
return a.validPatternValues[o];
}
}
a.validPatternValues = ["none", "solid", "darkVertical", "darkGray", "mediumGray", "lightGray", "gray125", "gray0625", "darkHorizontal", "darkVertical", "darkDown", "darkUp", "darkGrid", "darkTrellis", "lightHorizontal", "lightVertical", "lightDown", "lightUp", "lightGrid", "lightTrellis", "lightGrid"].reduce((d, o) => (d[o] = !0, d), {}), a.StopXform = s, a.PatternFillXform = l, a.GradientFillXform = n, C.exports = a;
}, { "../base-xform": 32, "./color-xform": 128 }], 131: [function(g, C, i) {
const e = g("./color-xform"), A = g("../simple/boolean-xform"), s = g("../simple/integer-xform"), l = g("../simple/string-xform"), n = g("./underline-xform"), a = g("../../../utils/under-dash"), d = g("../base-xform");
class o extends d {
constructor(r) {
super(), this.options = r || o.OPTIONS, this.map = { b: { prop: "bold", xform: new A({ tag: "b", attr: "val" }) }, i: { prop: "italic", xform: new A({ tag: "i", attr: "val" }) }, u: { prop: "underline", xform: new n() }, charset: { prop: "charset", xform: new s({ tag: "charset", attr: "val" }) }, color: { prop: "color", xform: new e() }, condense: { prop: "condense", xform: new A({ tag: "condense", attr: "val" }) }, extend: { prop: "extend", xform: new A({ tag: "extend", attr: "val" }) }, family: { prop: "family", xform: new s({ tag: "family", attr: "val" }) }, outline: { prop: "outline", xform: new A({ tag: "outline", attr: "val" }) }, vertAlign: { prop: "vertAlign", xform: new l({ tag: "vertAlign", attr: "val" }) }, scheme: { prop: "scheme", xform: new l({ tag: "scheme", attr: "val" }) }, shadow: { prop: "shadow", xform: new A({ tag: "shadow", attr: "val" }) }, strike: { prop: "strike", xform: new A({ tag: "strike", attr: "val" }) }, sz: { prop: "size", xform: new s({ tag: "sz", attr: "val" }) } }, this.map[this.options.fontNameTag] = { prop: "name", xform: new l({ tag: this.options.fontNameTag, attr: "val" }) };
}
get tag() {
return this.options.tagName;
}
render(r, h) {
const { map: b } = this;
r.openNode(this.options.tagName), a.each(this.map, (u, m) => {
b[m].xform.render(r, h[u.prop]);
}), r.closeNode();
}
parseOpen(r) {
if (this.parser) return this.parser.parseOpen(r), !0;
if (this.map[r.name]) return this.parser = this.map[r.name].xform, this.parser.parseOpen(r);
switch (r.name) {
case this.options.tagName:
return this.model = {}, !0;
default:
return !1;
}
}
parseText(r) {
this.parser && this.parser.parseText(r);
}
parseClose(r) {
if (this.parser && !this.parser.parseClose(r)) {
const h = this.map[r];
return this.parser.model && (this.model[h.prop] = this.parser.model), this.parser = void 0, !0;
}
switch (r) {
case this.options.tagName:
return !1;
default:
return !0;
}
}
}
o.OPTIONS = { tagName: "font", fontNameTag: "name" }, C.exports = o;
}, { "../../../utils/under-dash": 26, "../base-xform": 32, "../simple/boolean-xform": 116, "../simple/integer-xform": 118, "../simple/string-xform": 119, "./color-xform": 128, "./underline-xform": 136 }], 132: [function(g, C, i) {
const e = g("../../../utils/under-dash"), A = g("../../defaultnumformats"), s = g("../base-xform"), l = function() {
const a = {};
return e.each(A, (d, o) => {
d.f && (a[d.f] = parseInt(o, 10));
}), a;
}();
class n extends s {
constructor(d, o) {
super(), this.id = d, this.formatCode = o;
}
get tag() {
return "numFmt";
}
render(d, o) {
d.leafNode("numFmt", { numFmtId: o.id, formatCode: o.formatCode });
}
parseOpen(d) {
switch (d.name) {
case "numFmt":
return this.model = { id: parseInt(d.attributes.numFmtId, 10), formatCode: d.attributes.formatCode.replace(/[\\](.)/g, "$1") }, !0;
default:
return !1;
}
}
parseText() {
}
parseClose() {
return !1;
}
}
n.getDefaultFmtId = function(a) {
return l[a];
}, n.getDefaultFmtCode = function(a) {
return A[a] && A[a].f;
}, C.exports = n;
}, { "../../../utils/under-dash": 26, "../../defaultnumformats": 30, "../base-xform": 32 }], 133: [function(g, C, i) {
const e = g("../base-xform"), A = { boolean: (s, l) => s === void 0 ? l : s };
C.exports = class extends e {
get tag() {
return "protection";
}
render(s, l) {
s.addRollback(), s.openNode("protection");
let n = !1;
function a(d, o) {
o !== void 0 && (s.addAttribute(d, o), n = !0);
}
a("locked", A.boolean(l.locked, !0) ? void 0 : "0"), a("hidden", A.boolean(l.hidden, !1) ? "1" : void 0), s.closeNode(), n ? s.commit() : s.rollback();
}
parseOpen(s) {
const l = { locked: s.attributes.locked !== "0", hidden: s.attributes.hidden === "1" }, n = !l.locked || l.hidden;
this.model = n ? l : null;
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 134: [function(g, C, i) {
const e = g("../base-xform"), A = g("./alignment-xform"), s = g("./protection-xform");
C.exports = class extends e {
constructor(l) {
super(), this.xfId = !(!l || !l.xfId), this.map = { alignment: new A(), protection: new s() };
}
get tag() {
return "xf";
}
render(l, n) {
l.openNode("xf", { numFmtId: n.numFmtId || 0, fontId: n.fontId || 0, fillId: n.fillId || 0, borderId: n.borderId || 0 }), this.xfId && l.addAttribute("xfId", n.xfId || 0), n.numFmtId && l.addAttribute("applyNumberFormat", "1"), n.fontId && l.addAttribute("applyFont", "1"), n.fillId && l.addAttribute("applyFill", "1"), n.borderId && l.addAttribute("applyBorder", "1"), n.alignment && l.addAttribute("applyAlignment", "1"), n.protection && l.addAttribute("applyProtection", "1"), n.alignment && this.map.alignment.render(l, n.alignment), n.protection && this.map.protection.render(l, n.protection), l.closeNode();
}
parseOpen(l) {
if (this.parser) return this.parser.parseOpen(l), !0;
switch (l.name) {
case "xf":
return this.model = { numFmtId: parseInt(l.attributes.numFmtId, 10), fontId: parseInt(l.attributes.fontId, 10), fillId: parseInt(l.attributes.fillId, 10), borderId: parseInt(l.attributes.borderId, 10) }, this.xfId && (this.model.xfId = parseInt(l.attributes.xfId, 10)), !0;
case "alignment":
return this.parser = this.map.alignment, this.parser.parseOpen(l), !0;
case "protection":
return this.parser = this.map.protection, this.parser.parseOpen(l), !0;
default:
return !1;
}
}
parseText(l) {
this.parser && this.parser.parseText(l);
}
parseClose(l) {
return this.parser ? (this.parser.parseClose(l) || (this.map.protection === this.parser ? this.model.protection = this.parser.model : this.model.alignment = this.parser.model, this.parser = void 0), !0) : l !== "xf";
}
};
}, { "../base-xform": 32, "./alignment-xform": 126, "./protection-xform": 133 }], 135: [function(g, C, i) {
const e = g("../../../doc/enums"), A = g("../../../utils/xml-stream"), s = g("../base-xform"), l = g("../static-xform"), n = g("../list-xform"), a = g("./font-xform"), d = g("./fill-xform"), o = g("./border-xform"), c = g("./numfmt-xform"), r = g("./style-xform"), h = g("./dxf-xform");
class b extends s {
constructor(m) {
super(), this.map = { numFmts: new n({ tag: "numFmts", count: !0, childXform: new c() }), fonts: new n({ tag: "fonts", count: !0, childXform: new a(), $: { "x14ac:knownFonts": 1 } }), fills: new n({ tag: "fills", count: !0, childXform: new d() }), borders: new n({ tag: "borders", count: !0, childXform: new o() }), cellStyleXfs: new n({ tag: "cellStyleXfs", count: !0, childXform: new r() }), cellXfs: new n({ tag: "cellXfs", count: !0, childXform: new r({ xfId: !0 }) }), dxfs: new n({ tag: "dxfs", always: !0, count: !0, childXform: new h() }), numFmt: new c(), font: new a(), fill: new d(), border: new o(), style: new r({ xfId: !0 }), cellStyles: b.STATIC_XFORMS.cellStyles, tableStyles: b.STATIC_XFORMS.tableStyles, extLst: b.STATIC_XFORMS.extLst }, m && this.init();
}
initIndex() {
this.index = { style: {}, numFmt: {}, numFmtNextId: 164, font: {}, border: {}, fill: {} };
}
init() {
this.model = { styles: [], numFmts: [], fonts: [], borders: [], fills: [], dxfs: [] }, this.initIndex(), this._addBorder({}), this._addStyle({ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }), this._addFill({ type: "pattern", pattern: "none" }), this._addFill({ type: "pattern", pattern: "gray125" }), this.weakMap = /* @__PURE__ */ new WeakMap();
}
render(m, Z) {
Z = Z || this.model, m.openXml(A.StdDocAttributes), m.openNode("styleSheet", b.STYLESHEET_ATTRIBUTES), this.index ? (Z.numFmts && Z.numFmts.length && (m.openNode("numFmts", { count: Z.numFmts.length }), Z.numFmts.forEach((p) => {
m.writeXml(p);
}), m.closeNode()), Z.fonts.length || this._addFont({ size: 11, color: { theme: 1 }, name: "Calibri", family: 2, scheme: "minor" }), m.openNode("fonts", { count: Z.fonts.length, "x14ac:knownFonts": 1 }), Z.fonts.forEach((p) => {
m.writeXml(p);
}), m.closeNode(), m.openNode("fills", { count: Z.fills.length }), Z.fills.forEach((p) => {
m.writeXml(p);
}), m.closeNode(), m.openNode("borders", { count: Z.borders.length }), Z.borders.forEach((p) => {
m.writeXml(p);
}), m.closeNode(), this.map.cellStyleXfs.render(m, [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }]), m.openNode("cellXfs", { count: Z.styles.length }), Z.styles.forEach((p) => {
m.writeXml(p);
}), m.closeNode()) : (this.map.numFmts.render(m, Z.numFmts), this.map.fonts.render(m, Z.fonts), this.map.fills.render(m, Z.fills), this.map.borders.render(m, Z.borders), this.map.cellStyleXfs.render(m, [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }]), this.map.cellXfs.render(m, Z.styles)), b.STATIC_XFORMS.cellStyles.render(m), this.map.dxfs.render(m, Z.dxfs), b.STATIC_XFORMS.tableStyles.render(m), b.STATIC_XFORMS.extLst.render(m), m.closeNode();
}
parseOpen(m) {
if (this.parser) return this.parser.parseOpen(m), !0;
switch (m.name) {
case "styleSheet":
return this.initIndex(), !0;
default:
return this.parser = this.map[m.name], this.parser && this.parser.parseOpen(m), !0;
}
}
parseText(m) {
this.parser && this.parser.parseText(m);
}
parseClose(m) {
if (this.parser) return this.parser.parseClose(m) || (this.parser = void 0), !0;
switch (m) {
case "styleSheet": {
this.model = {};
const Z = (p, Y) => {
Y.model && Y.model.length && (this.model[p] = Y.model);
};
if (Z("numFmts", this.map.numFmts), Z("fonts", this.map.fonts), Z("fills", this.map.fills), Z("borders", this.map.borders), Z("styles", this.map.cellXfs), Z("dxfs", this.map.dxfs), this.index = { model: [], numFmt: [] }, this.model.numFmts) {
const p = this.index.numFmt;
this.model.numFmts.forEach((Y) => {
p[Y.id] = Y.formatCode;
});
}
return !1;
}
default:
return !0;
}
}
addStyleModel(m, Z) {
if (!m) return 0;
if (this.model.fonts.length || this._addFont({ size: 11, color: { theme: 1 }, name: "Calibri", family: 2, scheme: "minor" }), this.weakMap && this.weakMap.has(m)) return this.weakMap.get(m);
const p = {};
if (Z = Z || e.ValueType.Number, m.numFmt) p.numFmtId = this._addNumFmtStr(m.numFmt);
else switch (Z) {
case e.ValueType.Number:
p.numFmtId = this._addNumFmtStr("General");
break;
case e.ValueType.Date:
p.numFmtId = this._addNumFmtStr("mm-dd-yy");
}
m.font && (p.fontId = this._addFont(m.font)), m.border && (p.borderId = this._addBorder(m.border)), m.fill && (p.fillId = this._addFill(m.fill)), m.alignment && (p.alignment = m.alignment), m.protection && (p.protection = m.protection);
const Y = this._addStyle(p);
return this.weakMap && this.weakMap.set(m, Y), Y;
}
getStyleModel(m) {
const Z = this.model.styles[m];
if (!Z) return null;
let p = this.index.model[m];
if (p) return p;
if (p = this.index.model[m] = {}, Z.numFmtId) {
const R = this.index.numFmt[Z.numFmtId] || c.getDefaultFmtCode(Z.numFmtId);
R && (p.numFmt = R);
}
function Y(R, X, H) {
if (H || H === 0) {
const S = X[H];
S && (p[R] = S);
}
}
return Y("font", this.model.fonts, Z.fontId), Y("border", this.model.borders, Z.borderId), Y("fill", this.model.fills, Z.fillId), Z.alignment && (p.alignment = Z.alignment), Z.protection && (p.protection = Z.protection), p;
}
addDxfStyle(m) {
return m.numFmt && (m.numFmtId = this._addNumFmtStr(m.numFmt)), this.model.dxfs.push(m), this.model.dxfs.length - 1;
}
getDxfStyle(m) {
return this.model.dxfs[m];
}
_addStyle(m) {
const Z = this.map.style.toXml(m);
let p = this.index.style[Z];
return p === void 0 && (p = this.index.style[Z] = this.model.styles.length, this.model.styles.push(Z)), p;
}
_addNumFmtStr(m) {
let Z = c.getDefaultFmtId(m);
if (Z !== void 0 || (Z = this.index.numFmt[m], Z !== void 0)) return Z;
Z = this.index.numFmt[m] = 164 + this.model.numFmts.length;
const p = this.map.numFmt.toXml({ id: Z, formatCode: m });
return this.model.numFmts.push(p), Z;
}
_addFont(m) {
const Z = this.map.font.toXml(m);
let p = this.index.font[Z];
return p === void 0 && (p = this.index.font[Z] = this.model.fonts.length, this.model.fonts.push(Z)), p;
}
_addBorder(m) {
const Z = this.map.border.toXml(m);
let p = this.index.border[Z];
return p === void 0 && (p = this.index.border[Z] = this.model.borders.length, this.model.borders.push(Z)), p;
}
_addFill(m) {
const Z = this.map.fill.toXml(m);
let p = this.index.fill[Z];
return p === void 0 && (p = this.index.fill[Z] = this.model.fills.length, this.model.fills.push(Z)), p;
}
}
b.STYLESHEET_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "x14ac x16r2", "xmlns:x14ac": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac", "xmlns:x16r2": "http://schemas.microsoft.com/office/spreadsheetml/2015/02/main" }, b.STATIC_XFORMS = { cellStyles: new l({ tag: "cellStyles", $: { count: 1 }, c: [{ tag: "cellStyle", $: { name: "Normal", xfId: 0, builtinId: 0 } }] }), dxfs: new l({ tag: "dxfs", $: { count: 0 } }), tableStyles: new l({ tag: "tableStyles", $: { count: 0, defaultTableStyle: "TableStyleMedium2", defaultPivotStyle: "PivotStyleLight16" } }), extLst: new l({ tag: "extLst", c: [{ tag: "ext", $: { uri: "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}", "xmlns:x14": "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" }, c: [{ tag: "x14:slicerStyles", $: { defaultSlicerStyle: "SlicerStyleLight1" } }] }, { tag: "ext", $: { uri: "{9260A510-F301-46a8-8635-F512D64BE5F5}", "xmlns:x15": "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main" }, c: [{ tag: "x15:timelineStyles", $: { defaultTimelineStyle: "TimeSlicerStyleLight1" } }] }] }) }, b.Mock = class extends b {
constructor() {
super(), this.model = { styles: [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0, xfId: 0 }], numFmts: [], fonts: [{ size: 11, color: { theme: 1 }, name: "Calibri", family: 2, scheme: "minor" }], borders: [{}], fills: [{ type: "pattern", pattern: "none" }, { type: "pattern", pattern: "gray125" }] };
}
parseStream(u) {
return u.autodrain(), Promise.resolve();
}
addStyleModel(u, m) {
switch (m) {
case e.ValueType.Date:
return this.dateStyleId;
default:
return 0;
}
}
get dateStyleId() {
if (!this._dateStyleId) {
const u = { numFmtId: c.getDefaultFmtId("mm-dd-yy") };
this._dateStyleId = this.model.styles.length, this.model.styles.push(u);
}
return this._dateStyleId;
}
getStyleModel() {
return {};
}
}, C.exports = b;
}, { "../../../doc/enums": 7, "../../../utils/xml-stream": 28, "../base-xform": 32, "../list-xform": 71, "../static-xform": 120, "./border-xform": 127, "./dxf-xform": 129, "./fill-xform": 130, "./font-xform": 131, "./numfmt-xform": 132, "./style-xform": 134 }], 136: [function(g, C, i) {
const e = g("../base-xform");
class A extends e {
constructor(l) {
super(), this.model = l;
}
get tag() {
return "u";
}
render(l, n) {
if ((n = n || this.model) === !0) l.leafNode("u");
else {
const a = A.Attributes[n];
a && l.leafNode("u", a);
}
}
parseOpen(l) {
l.name === "u" && (this.model = l.attributes.val || !0);
}
parseText() {
}
parseClose() {
return !1;
}
}
A.Attributes = { single: {}, double: { val: "double" }, singleAccounting: { val: "singleAccounting" }, doubleAccounting: { val: "doubleAccounting" } }, C.exports = A;
}, { "../base-xform": 32 }], 137: [function(g, C, i) {
const e = g("../base-xform"), A = g("./filter-column-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { filterColumn: new A() };
}
get tag() {
return "autoFilter";
}
prepare(s) {
s.columns.forEach((l, n) => {
this.map.filterColumn.prepare(l, { index: n });
});
}
render(s, l) {
return s.openNode(this.tag, { ref: l.autoFilterRef }), l.columns.forEach((n) => {
this.map.filterColumn.render(s, n);
}), s.closeNode(), !0;
}
parseOpen(s) {
if (this.parser) return this.parser.parseOpen(s), !0;
switch (s.name) {
case this.tag:
return this.model = { autoFilterRef: s.attributes.ref, columns: [] }, !0;
default:
if (this.parser = this.map[s.name], this.parser) return this.parseOpen(s), !0;
throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(s));
}
}
parseText(s) {
this.parser && this.parser.parseText(s);
}
parseClose(s) {
if (this.parser) return this.parser.parseClose(s) || (this.model.columns.push(this.parser.model), this.parser = void 0), !0;
switch (s) {
case this.tag:
return !1;
default:
throw new Error("Unexpected xml node in parseClose: " + s);
}
}
};
}, { "../base-xform": 32, "./filter-column-xform": 139 }], 138: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "customFilter";
}
render(A, s) {
A.leafNode(this.tag, { val: s.val, operator: s.operator });
}
parseOpen(A) {
return A.name === this.tag && (this.model = { val: A.attributes.val, operator: A.attributes.operator }, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 139: [function(g, C, i) {
const e = g("../base-xform"), A = g("../list-xform"), s = g("./custom-filter-xform"), l = g("./filter-xform");
C.exports = class extends e {
constructor() {
super(), this.map = { customFilters: new A({ tag: "customFilters", count: !1, empty: !0, childXform: new s() }), filters: new A({ tag: "filters", count: !1, empty: !0, childXform: new l() }) };
}
get tag() {
return "filterColumn";
}
prepare(n, a) {
n.colId = a.index.toString();
}
render(n, a) {
return a.customFilters ? (n.openNode(this.tag, { colId: a.colId, hiddenButton: a.filterButton ? "0" : "1" }), this.map.customFilters.render(n, a.customFilters), n.closeNode(), !0) : (n.leafNode(this.tag, { colId: a.colId, hiddenButton: a.filterButton ? "0" : "1" }), !0);
}
parseOpen(n) {
if (this.parser) return this.parser.parseOpen(n), !0;
const { attributes: a } = n;
switch (n.name) {
case this.tag:
return this.model = { filterButton: a.hiddenButton === "0" }, !0;
default:
if (this.parser = this.map[n.name], this.parser) return this.parseOpen(n), !0;
throw new Error("Unexpected xml node in parseOpen: " + JSON.stringify(n));
}
}
parseText() {
}
parseClose(n) {
if (this.parser) return this.parser.parseClose(n) || (this.parser = void 0), !0;
switch (n) {
case this.tag:
return this.model.customFilters = this.map.customFilters.model, !1;
default:
return !0;
}
}
};
}, { "../base-xform": 32, "../list-xform": 71, "./custom-filter-xform": 138, "./filter-xform": 140 }], 140: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "filter";
}
render(A, s) {
A.leafNode(this.tag, { val: s.val });
}
parseOpen(A) {
return A.name === this.tag && (this.model = { val: A.attributes.val }, !0);
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 141: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "tableColumn";
}
prepare(A, s) {
A.id = s.index + 1;
}
render(A, s) {
return A.leafNode(this.tag, { id: s.id.toString(), name: s.name, totalsRowLabel: s.totalsRowLabel, totalsRowFunction: s.totalsRowFunction, dxfId: s.dxfId }), !0;
}
parseOpen(A) {
if (A.name === this.tag) {
const { attributes: s } = A;
return this.model = { name: s.name, totalsRowLabel: s.totalsRowLabel, totalsRowFunction: s.totalsRowFunction, dxfId: s.dxfId }, !0;
}
return !1;
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 142: [function(g, C, i) {
const e = g("../base-xform");
C.exports = class extends e {
get tag() {
return "tableStyleInfo";
}
render(A, s) {
return A.leafNode(this.tag, { name: s.theme ? s.theme : void 0, showFirstColumn: s.showFirstColumn ? "1" : "0", showLastColumn: s.showLastColumn ? "1" : "0", showRowStripes: s.showRowStripes ? "1" : "0", showColumnStripes: s.showColumnStripes ? "1" : "0" }), !0;
}
parseOpen(A) {
if (A.name === this.tag) {
const { attributes: s } = A;
return this.model = { theme: s.name ? s.name : null, showFirstColumn: s.showFirstColumn === "1", showLastColumn: s.showLastColumn === "1", showRowStripes: s.showRowStripes === "1", showColumnStripes: s.showColumnStripes === "1" }, !0;
}
return !1;
}
parseText() {
}
parseClose() {
return !1;
}
};
}, { "../base-xform": 32 }], 143: [function(g, C, i) {
const e = g("../../../utils/xml-stream"), A = g("../base-xform"), s = g("../list-xform"), l = g("./auto-filter-xform"), n = g("./table-column-xform"), a = g("./table-style-info-xform");
class d extends A {
constructor() {
super(), this.map = { autoFilter: new l(), tableColumns: new s({ tag: "tableColumns", count: !0, empty: !0, childXform: new n() }), tableStyleInfo: new a() };
}
prepare(c, r) {
this.map.autoFilter.prepare(c), this.map.tableColumns.prepare(c.columns, r);
}
get tag() {
return "table";
}
render(c, r) {
c.openXml(e.StdDocAttributes), c.openNode(this.tag, { ...d.TABLE_ATTRIBUTES, id: r.id, name: r.name, displayName: r.displayName || r.name, ref: r.tableRef, totalsRowCount: r.totalsRow ? "1" : void 0, totalsRowShown: r.totalsRow ? void 0 : "1", headerRowCount: r.headerRow ? "1" : "0" }), this.map.autoFilter.render(c, r), this.map.tableColumns.render(c, r.columns), this.map.tableStyleInfo.render(c, r.style), c.closeNode();
}
parseOpen(c) {
if (this.parser) return this.parser.parseOpen(c), !0;
const { name: r, attributes: h } = c;
switch (r) {
case this.tag:
this.reset(), this.model = { name: h.name, displayName: h.displayName || h.name, tableRef: h.ref, totalsRow: h.totalsRowCount === "1", headerRow: h.headerRowCount === "1" };
break;
default:
this.parser = this.map[c.name], this.parser && this.parser.parseOpen(c);
}
return !0;
}
parseText(c) {
this.parser && this.parser.parseText(c);
}
parseClose(c) {
if (this.parser) return this.parser.parseClose(c) || (this.parser = void 0), !0;
switch (c) {
case this.tag:
return this.model.columns = this.map.tableColumns.model, this.map.autoFilter.model && (this.model.autoFilterRef = this.map.autoFilter.model.autoFilterRef, this.map.autoFilter.model.columns.forEach((r, h) => {
this.model.columns[h].filterButton = r.filterButton;
})), this.model.style = this.map.tableStyleInfo.model, !1;
default:
return !0;
}
}
reconcile(c, r) {
c.columns.forEach((h) => {
h.dxfId !== void 0 && (h.style = r.styles.getDxfStyle(h.dxfId));
});
}
}
d.TABLE_ATTRIBUTES = { xmlns: "http://schemas.openxmlformats.org/spreadsheetml/2006/main", "xmlns:mc": "http://schemas.openxmlformats.org/markup-compatibility/2006", "mc:Ignorable": "xr xr3", "xmlns:xr": "http://schemas.microsoft.com/office/spreadsheetml/2014/revision", "xmlns:xr3": "http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" }, C.exports = d;
}, { "../../../utils/xml-stream": 28, "../base-xform": 32, "../list-xform": 71, "./auto-filter-xform": 137, "./table-column-xform": 141, "./table-style-info-xform": 142 }], 144: [function(g, C, i) {
(function(e, A) {
(function() {
const s = g("fs"), l = g("jszip"), { PassThrough: n } = g("readable-stream"), a = g("../utils/zip-stream"), d = g("../utils/stream-buf"), o = g("../utils/utils"), c = g("../utils/xml-stream"), { bufferToString: r } = g("../utils/browser-buffer-decode"), h = g("./xform/style/styles-xform"), b = g("./xform/core/core-xform"), u = g("./xform/strings/shared-strings-xform"), m = g("./xform/core/relationships-xform"), Z = g("./xform/core/content-types-xform"), p = g("./xform/core/app-xform"), Y = g("./xform/book/workbook-xform"), R = g("./xform/sheet/worksheet-xform"), X = g("./xform/drawing/drawing-xform"), H = g("./xform/table/table-xform"), S = g("./xform/comment/comments-xform"), z = g("./xform/comment/vml-notes-xform"), v = g("./xml/theme1");
class K {
constructor(N) {
this.workbook = N;
}
async readFile(N, B) {
if (!await o.fs.exists(N)) throw new Error("File not found: " + N);
const G = s.createReadStream(N);
try {
const w = await this.read(G, B);
return G.close(), w;
} catch (w) {
throw G.close(), w;
}
}
parseRels(N) {
return new m().parseStream(N);
}
parseWorkbook(N) {
return new Y().parseStream(N);
}
parseSharedStrings(N) {
return new u().parseStream(N);
}
reconcile(N, B) {
const G = new Y(), w = new R(B), W = new X(), y = new H();
G.reconcile(N);
const f = { media: N.media, mediaIndex: N.mediaIndex };
Object.keys(N.drawings).forEach((T) => {
const Q = N.drawings[T], P = N.drawingRels[T];
P && (f.rels = P.reduce((L, E) => (L[E.Id] = E, L), {}), (Q.anchors || []).forEach((L) => {
const E = L.picture && L.picture.hyperlinks;
E && f.rels[E.rId] && (E.hyperlink = f.rels[E.rId].Target, delete E.rId);
}), W.reconcile(Q, f));
});
const D = { styles: N.styles };
Object.values(N.tables).forEach((T) => {
y.reconcile(T, D);
});
const F = { styles: N.styles, sharedStrings: N.sharedStrings, media: N.media, mediaIndex: N.mediaIndex, date1904: N.properties && N.properties.date1904, drawings: N.drawings, comments: N.comments, tables: N.tables, vmlDrawings: N.vmlDrawings };
N.worksheets.forEach((T) => {
T.relationships = N.worksheetRels[T.sheetNo], w.reconcile(T, F);
}), delete N.worksheetHash, delete N.worksheetRels, delete N.globalRels, delete N.sharedStrings, delete N.workbookRels, delete N.sheetDefs, delete N.styles, delete N.mediaIndex, delete N.drawings, delete N.drawingRels, delete N.vmlDrawings;
}
async _processWorksheetEntry(N, B, G, w, W) {
const y = new R(w), f = await y.parseStream(N);
f.sheetNo = G, B.worksheetHash[W] = f, B.worksheets.push(f);
}
async _processCommentEntry(N, B, G) {
const w = new S(), W = await w.parseStream(N);
B.comments[`../${G}.xml`] = W;
}
async _processTableEntry(N, B, G) {
const w = new H(), W = await w.parseStream(N);
B.tables[`../tables/${G}.xml`] = W;
}
async _processWorksheetRelsEntry(N, B, G) {
const w = new m(), W = await w.parseStream(N);
B.worksheetRels[G] = W;
}
async _processMediaEntry(N, B, G) {
const w = G.lastIndexOf(".");
if (w >= 1) {
const W = G.substr(w + 1), y = G.substr(0, w);
await new Promise((f, D) => {
const F = new d();
F.on("finish", () => {
B.mediaIndex[G] = B.media.length, B.mediaIndex[y] = B.media.length;
const T = { type: "image", name: y, extension: W, buffer: F.toBuffer() };
B.media.push(T), f();
}), N.on("error", (T) => {
D(T);
}), N.pipe(F);
});
}
}
async _processDrawingEntry(N, B, G) {
const w = new X(), W = await w.parseStream(N);
B.drawings[G] = W;
}
async _processDrawingRelsEntry(N, B, G) {
const w = new m(), W = await w.parseStream(N);
B.drawingRels[G] = W;
}
async _processVmlDrawingEntry(N, B, G) {
const w = new z(), W = await w.parseStream(N);
B.vmlDrawings[`../drawings/${G}.vml`] = W;
}
async _processThemeEntry(N, B, G) {
await new Promise((w, W) => {
const y = new d();
N.on("error", W), y.on("error", W), y.on("finish", () => {
B.themes[G] = y.read().toString(), w();
}), N.pipe(y);
});
}
createInputStream() {
throw new Error("`XLSX#createInputStream` is deprecated. You should use `XLSX#read` instead. This method will be removed in version 5.0. Please follow upgrade instruction: https://github.com/exceljs/exceljs/blob/master/UPGRADE-4.0.md");
}
async read(N, B) {
!N[Symbol.asyncIterator] && N.pipe && (N = N.pipe(new n()));
const G = [];
for await (const w of N) G.push(w);
return this.load(A.concat(G), B);
}
async load(N, B) {
let G;
G = B && B.base64 ? A.from(N.toString(), "base64") : N;
const w = { worksheets: [], worksheetHash: {}, worksheetRels: [], themes: {}, media: [], mediaIndex: {}, drawings: {}, drawingRels: {}, comments: {}, tables: {}, vmlDrawings: {} }, W = await l.loadAsync(G);
for (const y of Object.values(W.files)) if (!y.dir) {
let f, D = y.name;
if (D[0] === "/" && (D = D.substr(1)), D.match(/xl\/media\//) || D.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/)) f = new n(), f.write(await y.async("nodebuffer"));
else {
let F;
f = new n({ writableObjectMode: !0, readableObjectMode: !0 }), F = e.browser ? r(await y.async("nodebuffer")) : await y.async("string");
const T = 16384;
for (let Q = 0; Q < F.length; Q += T) f.write(F.substring(Q, Q + T));
}
switch (f.end(), D) {
case "_rels/.rels":
w.globalRels = await this.parseRels(f);
break;
case "xl/workbook.xml": {
const F = await this.parseWorkbook(f);
w.sheets = F.sheets, w.definedNames = F.definedNames, w.views = F.views, w.properties = F.properties, w.calcProperties = F.calcProperties;
break;
}
case "xl/_rels/workbook.xml.rels":
w.workbookRels = await this.parseRels(f);
break;
case "xl/sharedStrings.xml":
w.sharedStrings = new u(), await w.sharedStrings.parseStream(f);
break;
case "xl/styles.xml":
w.styles = new h(), await w.styles.parseStream(f);
break;
case "docProps/app.xml": {
const F = new p(), T = await F.parseStream(f);
w.company = T.company, w.manager = T.manager;
break;
}
case "docProps/core.xml": {
const F = new b(), T = await F.parseStream(f);
Object.assign(w, T);
break;
}
default: {
let F = D.match(/xl\/worksheets\/sheet(\d+)[.]xml/);
if (F) {
await this._processWorksheetEntry(f, w, F[1], B, D);
break;
}
if (F = D.match(/xl\/worksheets\/_rels\/sheet(\d+)[.]xml.rels/), F) {
await this._processWorksheetRelsEntry(f, w, F[1]);
break;
}
if (F = D.match(/xl\/theme\/([a-zA-Z0-9]+)[.]xml/), F) {
await this._processThemeEntry(f, w, F[1]);
break;
}
if (F = D.match(/xl\/media\/([a-zA-Z0-9]+[.][a-zA-Z0-9]{3,4})$/), F) {
await this._processMediaEntry(f, w, F[1]);
break;
}
if (F = D.match(/xl\/drawings\/([a-zA-Z0-9]+)[.]xml/), F) {
await this._processDrawingEntry(f, w, F[1]);
break;
}
if (F = D.match(/xl\/(comments\d+)[.]xml/), F) {
await this._processCommentEntry(f, w, F[1]);
break;
}
if (F = D.match(/xl\/tables\/(table\d+)[.]xml/), F) {
await this._processTableEntry(f, w, F[1]);
break;
}
if (F = D.match(/xl\/drawings\/_rels\/([a-zA-Z0-9]+)[.]xml[.]rels/), F) {
await this._processDrawingRelsEntry(f, w, F[1]);
break;
}
if (F = D.match(/xl\/drawings\/(vmlDrawing\d+)[.]vml/), F) {
await this._processVmlDrawingEntry(f, w, F[1]);
break;
}
}
}
}
return this.reconcile(w, B), this.workbook.model = w, this.workbook;
}
async addMedia(N, B) {
await Promise.all(B.media.map(async (G) => {
if (G.type === "image") {
const w = `xl/media/${G.name}.${G.extension}`;
if (G.filename) {
const W = await function(y, f) {
return new Promise((D, F) => {
s.readFile(y, f, (T, Q) => {
T ? F(T) : D(Q);
});
});
}(G.filename);
return N.append(W, { name: w });
}
if (G.buffer) return N.append(G.buffer, { name: w });
if (G.base64) {
const W = G.base64, y = W.substring(W.indexOf(",") + 1);
return N.append(y, { name: w, base64: !0 });
}
}
throw new Error("Unsupported media");
}));
}
addDrawings(N, B) {
const G = new X(), w = new m();
B.worksheets.forEach((W) => {
const { drawing: y } = W;
if (y) {
G.prepare(y, {});
let f = G.toXml(y);
N.append(f, { name: `xl/drawings/${y.name}.xml` }), f = w.toXml(y.rels), N.append(f, { name: `xl/drawings/_rels/${y.name}.xml.rels` });
}
});
}
addTables(N, B) {
const G = new H();
B.worksheets.forEach((w) => {
const { tables: W } = w;
W.forEach((y) => {
G.prepare(y, {});
const f = G.toXml(y);
N.append(f, { name: "xl/tables/" + y.target });
});
});
}
async addContentTypes(N, B) {
const G = new Z().toXml(B);
N.append(G, { name: "[Content_Types].xml" });
}
async addApp(N, B) {
const G = new p().toXml(B);
N.append(G, { name: "docProps/app.xml" });
}
async addCore(N, B) {
const G = new b();
N.append(G.toXml(B), { name: "docProps/core.xml" });
}
async addThemes(N, B) {
const G = B.themes || { theme1: v };
Object.keys(G).forEach((w) => {
const W = G[w], y = `xl/theme/${w}.xml`;
N.append(W, { name: y });
});
}
async addOfficeRels(N) {
const B = new m().toXml([{ Id: "rId1", Type: K.RelType.OfficeDocument, Target: "xl/workbook.xml" }, { Id: "rId2", Type: K.RelType.CoreProperties, Target: "docProps/core.xml" }, { Id: "rId3", Type: K.RelType.ExtenderProperties, Target: "docProps/app.xml" }]);
N.append(B, { name: "_rels/.rels" });
}
async addWorkbookRels(N, B) {
let G = 1;
const w = [{ Id: "rId" + G++, Type: K.RelType.Styles, Target: "styles.xml" }, { Id: "rId" + G++, Type: K.RelType.Theme, Target: "theme/theme1.xml" }];
B.sharedStrings.count && w.push({ Id: "rId" + G++, Type: K.RelType.SharedStrings, Target: "sharedStrings.xml" }), B.worksheets.forEach((y) => {
y.rId = "rId" + G++, w.push({ Id: y.rId, Type: K.RelType.Worksheet, Target: `worksheets/sheet${y.id}.xml` });
});
const W = new m().toXml(w);
N.append(W, { name: "xl/_rels/workbook.xml.rels" });
}
async addSharedStrings(N, B) {
B.sharedStrings && B.sharedStrings.count && N.append(B.sharedStrings.xml, { name: "xl/sharedStrings.xml" });
}
async addStyles(N, B) {
const { xml: G } = B.styles;
G && N.append(G, { name: "xl/styles.xml" });
}
async addWorkbook(N, B) {
const G = new Y();
N.append(G.toXml(B), { name: "xl/workbook.xml" });
}
async addWorksheets(N, B) {
const G = new R(), w = new m(), W = new S(), y = new z();
B.worksheets.forEach((f) => {
let D = new c();
G.render(D, f), N.append(D.xml, { name: `xl/worksheets/sheet${f.id}.xml` }), f.rels && f.rels.length && (D = new c(), w.render(D, f.rels), N.append(D.xml, { name: `xl/worksheets/_rels/sheet${f.id}.xml.rels` })), f.comments.length > 0 && (D = new c(), W.render(D, f), N.append(D.xml, { name: `xl/comments${f.id}.xml` }), D = new c(), y.render(D, f), N.append(D.xml, { name: `xl/drawings/vmlDrawing${f.id}.vml` }));
});
}
_finalize(N) {
return new Promise((B, G) => {
N.on("finish", () => {
B(this);
}), N.on("error", G), N.finalize();
});
}
prepareModel(N, B) {
N.creator = N.creator || "ExcelJS", N.lastModifiedBy = N.lastModifiedBy || "ExcelJS", N.created = N.created || /* @__PURE__ */ new Date(), N.modified = N.modified || /* @__PURE__ */ new Date(), N.useSharedStrings = B.useSharedStrings === void 0 || B.useSharedStrings, N.useStyles = B.useStyles === void 0 || B.useStyles, N.sharedStrings = new u(), N.styles = N.useStyles ? new h(!0) : new h.Mock();
const G = new Y(), w = new R();
G.prepare(N);
const W = { sharedStrings: N.sharedStrings, styles: N.styles, date1904: N.properties.date1904, drawingsCount: 0, media: N.media };
W.drawings = N.drawings = [], W.commentRefs = N.commentRefs = [];
let y = 0;
N.tables = [], N.worksheets.forEach((f) => {
f.tables.forEach((D) => {
y++, D.target = `table${y}.xml`, D.id = y, N.tables.push(D);
}), w.prepare(f, W);
});
}
async write(N, B) {
B = B || {};
const { model: G } = this.workbook, w = new a.ZipWriter(B.zip);
return w.pipe(N), this.prepareModel(G, B), await this.addContentTypes(w, G), await this.addOfficeRels(w, G), await this.addWorkbookRels(w, G), await this.addWorksheets(w, G), await this.addSharedStrings(w, G), await this.addDrawings(w, G), await this.addTables(w, G), await Promise.all([this.addThemes(w, G), this.addStyles(w, G)]), await this.addMedia(w, G), await Promise.all([this.addApp(w, G), this.addCore(w, G)]), await this.addWorkbook(w, G), this._finalize(w);
}
writeFile(N, B) {
const G = s.createWriteStream(N);
return new Promise((w, W) => {
G.on("finish", () => {
w();
}), G.on("error", (y) => {
W(y);
}), this.write(G, B).then(() => {
G.end();
}).catch((y) => {
W(y);
});
});
}
async writeBuffer(N) {
const B = new d();
return await this.write(B, N), B.read();
}
}
K.RelType = g("./rel-type"), C.exports = K;
}).call(this);
}).call(this, g("_process"), g("buffer").Buffer);
}, { "../utils/browser-buffer-decode": 16, "../utils/stream-buf": 24, "../utils/utils": 27, "../utils/xml-stream": 28, "../utils/zip-stream": 29, "./rel-type": 31, "./xform/book/workbook-xform": 38, "./xform/comment/comments-xform": 40, "./xform/comment/vml-notes-xform": 45, "./xform/core/app-xform": 51, "./xform/core/content-types-xform": 52, "./xform/core/core-xform": 53, "./xform/core/relationships-xform": 55, "./xform/drawing/drawing-xform": 62, "./xform/sheet/worksheet-xform": 115, "./xform/strings/shared-strings-xform": 124, "./xform/style/styles-xform": 135, "./xform/table/table-xform": 143, "./xml/theme1": 145, _process: 467, buffer: 220, fs: 216, jszip: 441, "readable-stream": 491 }], 145: [function(g, C, i) {
C.exports = `
`;
}, {}], 146: [function(g, C, i) {
(function(e) {
(function() {
Object.defineProperty(i, "__esModule", { value: !0 }), i.CsvFormatterStream = void 0;
const A = g("stream"), s = g("./formatter");
class l extends A.Transform {
constructor(a) {
super({ writableObjectMode: a.objectMode }), this.hasWrittenBOM = !1, this.formatterOptions = a, this.rowFormatter = new s.RowFormatter(a), this.hasWrittenBOM = !a.writeBOM;
}
transform(a) {
return this.rowFormatter.rowTransform = a, this;
}
_transform(a, d, o) {
let c = !1;
try {
this.hasWrittenBOM || (this.push(this.formatterOptions.BOM), this.hasWrittenBOM = !0), this.rowFormatter.format(a, (r, h) => r ? (c = !0, o(r)) : (h && h.forEach((b) => {
this.push(e.from(b, "utf8"));
}), c = !0, o()));
} catch (r) {
if (c) throw r;
o(r);
}
}
_flush(a) {
this.rowFormatter.finish((d, o) => d ? a(d) : (o && o.forEach((c) => {
this.push(e.from(c, "utf8"));
}), a()));
}
}
i.CsvFormatterStream = l;
}).call(this);
}).call(this, g("buffer").Buffer);
}, { "./formatter": 150, buffer: 220, stream: 505 }], 147: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.FormatterOptions = void 0, i.FormatterOptions = class {
constructor() {
let e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var A;
this.objectMode = !0, this.delimiter = ",", this.rowDelimiter = `
`, this.quote = '"', this.escape = this.quote, this.quoteColumns = !1, this.quoteHeaders = this.quoteColumns, this.headers = null, this.includeEndRowDelimiter = !1, this.writeBOM = !1, this.BOM = "\uFEFF", this.alwaysWriteHeaders = !1, Object.assign(this, e || {}), (e == null ? void 0 : e.quoteHeaders) === void 0 && (this.quoteHeaders = this.quoteColumns), (e == null ? void 0 : e.quote) === !0 ? this.quote = '"' : (e == null ? void 0 : e.quote) === !1 && (this.quote = ""), typeof (e == null ? void 0 : e.escape) != "string" && (this.escape = this.quote), this.shouldWriteHeaders = !!this.headers && ((A = e.writeHeaders) === null || A === void 0 || A), this.headers = Array.isArray(this.headers) ? this.headers : null, this.escapedQuote = `${this.escape}${this.quote}`;
}
};
}, {}], 148: [function(g, C, i) {
var e = function(n) {
return n && n.__esModule ? n : { default: n };
};
Object.defineProperty(i, "__esModule", { value: !0 }), i.FieldFormatter = void 0;
const A = e(g("lodash.isboolean")), s = e(g("lodash.isnil")), l = e(g("lodash.escaperegexp"));
i.FieldFormatter = class {
constructor(n) {
this._headers = null, this.formatterOptions = n, n.headers !== null && (this.headers = n.headers), this.REPLACE_REGEXP = new RegExp(n.quote, "g");
const a = `[${n.delimiter}${l.default(n.rowDelimiter)}|\r|
]`;
this.ESCAPE_REGEXP = new RegExp(a);
}
set headers(n) {
this._headers = n;
}
shouldQuote(n, a) {
const d = a ? this.formatterOptions.quoteHeaders : this.formatterOptions.quoteColumns;
return A.default(d) ? d : Array.isArray(d) ? d[n] : this._headers !== null && d[this._headers[n]];
}
format(n, a, d) {
const o = ("" + (s.default(n) ? "" : n)).replace(/\0/g, ""), { formatterOptions: c } = this;
return c.quote !== "" && o.indexOf(c.quote) !== -1 ? this.quoteField(o.replace(this.REPLACE_REGEXP, c.escapedQuote)) : o.search(this.ESCAPE_REGEXP) !== -1 || this.shouldQuote(a, d) ? this.quoteField(o) : o;
}
quoteField(n) {
const { quote: a } = this.formatterOptions;
return `${a}${n}${a}`;
}
};
}, { "lodash.escaperegexp": 442, "lodash.isboolean": 444, "lodash.isnil": 447 }], 149: [function(g, C, i) {
var e = function(d) {
return d && d.__esModule ? d : { default: d };
};
Object.defineProperty(i, "__esModule", { value: !0 }), i.RowFormatter = void 0;
const A = e(g("lodash.isfunction")), s = e(g("lodash.isequal")), l = g("./FieldFormatter"), n = g("../types");
class a {
constructor(o) {
this.rowCount = 0, this.formatterOptions = o, this.fieldFormatter = new l.FieldFormatter(o), this.headers = o.headers, this.shouldWriteHeaders = o.shouldWriteHeaders, this.hasWrittenHeaders = !1, this.headers !== null && (this.fieldFormatter.headers = this.headers), o.transform && (this.rowTransform = o.transform);
}
static isRowHashArray(o) {
return !!Array.isArray(o) && Array.isArray(o[0]) && o[0].length === 2;
}
static isRowArray(o) {
return Array.isArray(o) && !this.isRowHashArray(o);
}
static gatherHeaders(o) {
return a.isRowHashArray(o) ? o.map((c) => c[0]) : Array.isArray(o) ? o : Object.keys(o);
}
static createTransform(o) {
return n.isSyncTransform(o) ? (c, r) => {
let h = null;
try {
h = o(c);
} catch (b) {
return r(b);
}
return r(null, h);
} : (c, r) => {
o(c, r);
};
}
set rowTransform(o) {
if (!A.default(o)) throw new TypeError("The transform should be a function");
this._rowTransform = a.createTransform(o);
}
format(o, c) {
this.callTransformer(o, (r, h) => {
if (r) return c(r);
if (!o) return c(null);
const b = [];
if (h) {
const { shouldFormatColumns: u, headers: m } = this.checkHeaders(h);
if (this.shouldWriteHeaders && m && !this.hasWrittenHeaders && (b.push(this.formatColumns(m, !0)), this.hasWrittenHeaders = !0), u) {
const Z = this.gatherColumns(h);
b.push(this.formatColumns(Z, !1));
}
}
return c(null, b);
});
}
finish(o) {
const c = [];
if (this.formatterOptions.alwaysWriteHeaders && this.rowCount === 0) {
if (!this.headers) return o(new Error("`alwaysWriteHeaders` option is set to true but `headers` option not provided."));
c.push(this.formatColumns(this.headers, !0));
}
return this.formatterOptions.includeEndRowDelimiter && c.push(this.formatterOptions.rowDelimiter), o(null, c);
}
checkHeaders(o) {
if (this.headers) return { shouldFormatColumns: !0, headers: this.headers };
const c = a.gatherHeaders(o);
return this.headers = c, this.fieldFormatter.headers = c, this.shouldWriteHeaders ? { shouldFormatColumns: !s.default(c, o), headers: c } : { shouldFormatColumns: !0, headers: null };
}
gatherColumns(o) {
if (this.headers === null) throw new Error("Headers is currently null");
return Array.isArray(o) ? a.isRowHashArray(o) ? this.headers.map((c, r) => {
const h = o[r];
return h ? h[1] : "";
}) : a.isRowArray(o) && !this.shouldWriteHeaders ? o : this.headers.map((c, r) => o[r]) : this.headers.map((c) => o[c]);
}
callTransformer(o, c) {
return this._rowTransform ? this._rowTransform(o, c) : c(null, o);
}
formatColumns(o, c) {
const r = o.map((b, u) => this.fieldFormatter.format(b, u, c)).join(this.formatterOptions.delimiter), { rowCount: h } = this;
return this.rowCount += 1, h ? [this.formatterOptions.rowDelimiter, r].join("") : r;
}
}
i.RowFormatter = a;
}, { "../types": 152, "./FieldFormatter": 148, "lodash.isequal": 445, "lodash.isfunction": 446 }], 150: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.FieldFormatter = i.RowFormatter = void 0;
var e = g("./RowFormatter");
Object.defineProperty(i, "RowFormatter", { enumerable: !0, get: function() {
return e.RowFormatter;
} });
var A = g("./FieldFormatter");
Object.defineProperty(i, "FieldFormatter", { enumerable: !0, get: function() {
return A.FieldFormatter;
} });
}, { "./FieldFormatter": 148, "./RowFormatter": 149 }], 151: [function(g, C, i) {
(function(e) {
(function() {
var A = Object.create ? function(u, m, Z, p) {
p === void 0 && (p = Z), Object.defineProperty(u, p, { enumerable: !0, get: function() {
return m[Z];
} });
} : function(u, m, Z, p) {
p === void 0 && (p = Z), u[p] = m[Z];
}, s = Object.create ? function(u, m) {
Object.defineProperty(u, "default", { enumerable: !0, value: m });
} : function(u, m) {
u.default = m;
}, l = function(u) {
if (u && u.__esModule) return u;
var m = {};
if (u != null) for (var Z in u) Z !== "default" && Object.prototype.hasOwnProperty.call(u, Z) && A(m, u, Z);
return s(m, u), m;
}, n = function(u, m) {
for (var Z in u) Z === "default" || Object.prototype.hasOwnProperty.call(m, Z) || A(m, u, Z);
};
Object.defineProperty(i, "__esModule", { value: !0 }), i.writeToPath = i.writeToString = i.writeToBuffer = i.writeToStream = i.write = i.format = i.FormatterOptions = i.CsvFormatterStream = void 0;
const a = g("util"), d = g("stream"), o = l(g("fs")), c = g("./FormatterOptions"), r = g("./CsvFormatterStream");
n(g("./types"), i);
var h = g("./CsvFormatterStream");
Object.defineProperty(i, "CsvFormatterStream", { enumerable: !0, get: function() {
return h.CsvFormatterStream;
} });
var b = g("./FormatterOptions");
Object.defineProperty(i, "FormatterOptions", { enumerable: !0, get: function() {
return b.FormatterOptions;
} }), i.format = (u) => new r.CsvFormatterStream(new c.FormatterOptions(u)), i.write = (u, m) => {
const Z = i.format(m), p = a.promisify((Y, R) => {
Z.write(Y, void 0, R);
});
return u.reduce((Y, R) => Y.then(() => p(R)), Promise.resolve()).then(() => Z.end()).catch((Y) => {
Z.emit("error", Y);
}), Z;
}, i.writeToStream = (u, m, Z) => i.write(m, Z).pipe(u), i.writeToBuffer = function(u) {
let m = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
const Z = [], p = new d.Writable({ write(Y, R, X) {
Z.push(Y), X();
} });
return new Promise((Y, R) => {
p.on("error", R).on("finish", () => Y(e.concat(Z))), i.write(u, m).pipe(p);
});
}, i.writeToString = (u, m) => i.writeToBuffer(u, m).then((Z) => Z.toString()), i.writeToPath = (u, m, Z) => {
const p = o.createWriteStream(u, { encoding: "utf8" });
return i.write(m, Z).pipe(p);
};
}).call(this);
}).call(this, g("buffer").Buffer);
}, { "./CsvFormatterStream": 146, "./FormatterOptions": 147, "./types": 152, buffer: 220, fs: 216, stream: 505, util: 527 }], 152: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.isSyncTransform = void 0, i.isSyncTransform = (e) => e.length === 1;
}, {}], 153: [function(g, C, i) {
(function(e) {
(function() {
Object.defineProperty(i, "__esModule", { value: !0 }), i.CsvParserStream = void 0;
const A = g("string_decoder"), s = g("stream"), l = g("./transforms"), n = g("./parser");
class a extends s.Transform {
constructor(o) {
super({ objectMode: o.objectMode }), this.lines = "", this.rowCount = 0, this.parsedRowCount = 0, this.parsedLineCount = 0, this.endEmitted = !1, this.headersEmitted = !1, this.parserOptions = o, this.parser = new n.Parser(o), this.headerTransformer = new l.HeaderTransformer(o), this.decoder = new A.StringDecoder(o.encoding), this.rowTransformerValidator = new l.RowTransformerValidator();
}
get hasHitRowLimit() {
return this.parserOptions.limitRows && this.rowCount >= this.parserOptions.maxRows;
}
get shouldEmitRows() {
return this.parsedRowCount > this.parserOptions.skipRows;
}
get shouldSkipLine() {
return this.parsedLineCount <= this.parserOptions.skipLines;
}
transform(o) {
return this.rowTransformerValidator.rowTransform = o, this;
}
validate(o) {
return this.rowTransformerValidator.rowValidator = o, this;
}
emit(o) {
if (o === "end") return this.endEmitted || (this.endEmitted = !0, super.emit("end", this.rowCount)), !1;
for (var c = arguments.length, r = new Array(c > 1 ? c - 1 : 0), h = 1; h < c; h++) r[h - 1] = arguments[h];
return super.emit(o, ...r);
}
_transform(o, c, r) {
if (this.hasHitRowLimit) return r();
const h = a.wrapDoneCallback(r);
try {
const { lines: b } = this, u = b + this.decoder.write(o), m = this.parse(u, !0);
return this.processRows(m, h);
} catch (b) {
return h(b);
}
}
_flush(o) {
const c = a.wrapDoneCallback(o);
if (this.hasHitRowLimit) return c();
try {
const r = this.lines + this.decoder.end(), h = this.parse(r, !1);
return this.processRows(h, c);
} catch (r) {
return c(r);
}
}
parse(o, c) {
if (!o) return [];
const { line: r, rows: h } = this.parser.parse(o, c);
return this.lines = r, h;
}
processRows(o, c) {
const r = o.length, h = (b) => {
const u = (p) => p ? c(p) : b % 100 != 0 ? h(b + 1) : void e(() => h(b + 1));
if (this.checkAndEmitHeaders(), b >= r || this.hasHitRowLimit) return c();
if (this.parsedLineCount += 1, this.shouldSkipLine) return u();
const m = o[b];
this.rowCount += 1, this.parsedRowCount += 1;
const Z = this.rowCount;
return this.transformRow(m, (p, Y) => {
if (p) return this.rowCount -= 1, u(p);
if (!Y) return u(new Error("expected transform result"));
if (Y.isValid) {
if (Y.row) return this.pushRow(Y.row, u);
} else this.emit("data-invalid", Y.row, Z, Y.reason);
return u();
});
};
h(0);
}
transformRow(o, c) {
try {
this.headerTransformer.transform(o, (r, h) => r ? c(r) : h ? h.isValid ? h.row ? this.shouldEmitRows ? this.rowTransformerValidator.transformAndValidate(h.row, c) : this.skipRow(c) : (this.rowCount -= 1, this.parsedRowCount -= 1, c(null, { row: null, isValid: !0 })) : this.shouldEmitRows ? c(null, { isValid: !1, row: o }) : this.skipRow(c) : c(new Error("Expected result from header transform")));
} catch (r) {
c(r);
}
}
checkAndEmitHeaders() {
!this.headersEmitted && this.headerTransformer.headers && (this.headersEmitted = !0, this.emit("headers", this.headerTransformer.headers));
}
skipRow(o) {
return this.rowCount -= 1, o(null, { row: null, isValid: !0 });
}
pushRow(o, c) {
try {
this.parserOptions.objectMode ? this.push(o) : this.push(JSON.stringify(o)), c();
} catch (r) {
c(r);
}
}
static wrapDoneCallback(o) {
let c = !1;
return function(r) {
if (r) {
if (c) throw r;
return c = !0, void o(r);
}
for (var h = arguments.length, b = new Array(h > 1 ? h - 1 : 0), u = 1; u < h; u++) b[u - 1] = arguments[u];
o(...b);
};
}
}
i.CsvParserStream = a;
}).call(this);
}).call(this, g("timers").setImmediate);
}, { "./parser": 165, "./transforms": 168, stream: 505, string_decoder: 218, timers: 523 }], 154: [function(g, C, i) {
var e = function(l) {
return l && l.__esModule ? l : { default: l };
};
Object.defineProperty(i, "__esModule", { value: !0 }), i.ParserOptions = void 0;
const A = e(g("lodash.escaperegexp")), s = e(g("lodash.isnil"));
i.ParserOptions = class {
constructor(l) {
var n;
if (this.objectMode = !0, this.delimiter = ",", this.ignoreEmpty = !1, this.quote = '"', this.escape = null, this.escapeChar = this.quote, this.comment = null, this.supportsComments = !1, this.ltrim = !1, this.rtrim = !1, this.trim = !1, this.headers = null, this.renameHeaders = !1, this.strictColumnHandling = !1, this.discardUnmappedColumns = !1, this.carriageReturn = "\r", this.encoding = "utf8", this.limitRows = !1, this.maxRows = 0, this.skipLines = 0, this.skipRows = 0, Object.assign(this, l || {}), this.delimiter.length > 1) throw new Error("delimiter option must be one character long");
this.escapedDelimiter = A.default(this.delimiter), this.escapeChar = (n = this.escape) !== null && n !== void 0 ? n : this.quote, this.supportsComments = !s.default(this.comment), this.NEXT_TOKEN_REGEXP = new RegExp(`([^\\s]|\\r\\n|\\n|\\r|${this.escapedDelimiter})`), this.maxRows > 0 && (this.limitRows = !0);
}
};
}, { "lodash.escaperegexp": 442, "lodash.isnil": 447 }], 155: [function(g, C, i) {
var e = Object.create ? function(h, b, u, m) {
m === void 0 && (m = u), Object.defineProperty(h, m, { enumerable: !0, get: function() {
return b[u];
} });
} : function(h, b, u, m) {
m === void 0 && (m = u), h[m] = b[u];
}, A = Object.create ? function(h, b) {
Object.defineProperty(h, "default", { enumerable: !0, value: b });
} : function(h, b) {
h.default = b;
}, s = function(h) {
if (h && h.__esModule) return h;
var b = {};
if (h != null) for (var u in h) u !== "default" && Object.prototype.hasOwnProperty.call(h, u) && e(b, h, u);
return A(b, h), b;
}, l = function(h, b) {
for (var u in h) u === "default" || Object.prototype.hasOwnProperty.call(b, u) || e(b, h, u);
};
Object.defineProperty(i, "__esModule", { value: !0 }), i.parseString = i.parseFile = i.parseStream = i.parse = i.ParserOptions = i.CsvParserStream = void 0;
const n = s(g("fs")), a = g("stream"), d = g("./ParserOptions"), o = g("./CsvParserStream");
l(g("./types"), i);
var c = g("./CsvParserStream");
Object.defineProperty(i, "CsvParserStream", { enumerable: !0, get: function() {
return c.CsvParserStream;
} });
var r = g("./ParserOptions");
Object.defineProperty(i, "ParserOptions", { enumerable: !0, get: function() {
return r.ParserOptions;
} }), i.parse = (h) => new o.CsvParserStream(new d.ParserOptions(h)), i.parseStream = (h, b) => h.pipe(new o.CsvParserStream(new d.ParserOptions(b))), i.parseFile = function(h) {
let b = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
return n.createReadStream(h).pipe(new o.CsvParserStream(new d.ParserOptions(b)));
}, i.parseString = (h, b) => {
const u = new a.Readable();
return u.push(h), u.push(null), u.pipe(new o.CsvParserStream(new d.ParserOptions(b)));
};
}, { "./CsvParserStream": 153, "./ParserOptions": 154, "./types": 169, fs: 216, stream: 505 }], 156: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.Parser = void 0;
const e = g("./Scanner"), A = g("./RowParser"), s = g("./Token");
class l {
constructor(a) {
this.parserOptions = a, this.rowParser = new A.RowParser(this.parserOptions);
}
static removeBOM(a) {
return a && a.charCodeAt(0) === 65279 ? a.slice(1) : a;
}
parse(a, d) {
const o = new e.Scanner({ line: l.removeBOM(a), parserOptions: this.parserOptions, hasMoreData: d });
return this.parserOptions.supportsComments ? this.parseWithComments(o) : this.parseWithoutComments(o);
}
parseWithoutComments(a) {
const d = [];
let o = !0;
for (; o; ) o = this.parseRow(a, d);
return { line: a.line, rows: d };
}
parseWithComments(a) {
const { parserOptions: d } = this, o = [];
for (let c = a.nextCharacterToken; c !== null; c = a.nextCharacterToken) if (s.Token.isTokenComment(c, d)) {
if (a.advancePastLine() === null) return { line: a.lineFromCursor, rows: o };
if (!a.hasMoreCharacters) return { line: a.lineFromCursor, rows: o };
a.truncateToCursor();
} else if (!this.parseRow(a, o)) break;
return { line: a.line, rows: o };
}
parseRow(a, d) {
if (!a.nextNonSpaceToken) return !1;
const o = this.rowParser.parse(a);
return o !== null && (this.parserOptions.ignoreEmpty && A.RowParser.isEmptyRow(o) || d.push(o), !0);
}
}
i.Parser = l;
}, { "./RowParser": 157, "./Scanner": 158, "./Token": 159 }], 157: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.RowParser = void 0;
const e = g("./column"), A = g("./Token");
i.RowParser = class {
constructor(s) {
this.parserOptions = s, this.columnParser = new e.ColumnParser(s);
}
static isEmptyRow(s) {
return s.join("").replace(/\s+/g, "") === "";
}
parse(s) {
const { parserOptions: l } = this, { hasMoreData: n } = s, a = s, d = [];
let o = this.getStartToken(a, d);
for (; o; ) {
if (A.Token.isTokenRowDelimiter(o)) return a.advancePastToken(o), !a.hasMoreCharacters && A.Token.isTokenCarriageReturn(o, l) && n ? null : (a.truncateToCursor(), d);
if (!this.shouldSkipColumnParse(a, o, d)) {
const c = this.columnParser.parse(a);
if (c === null) return null;
d.push(c);
}
o = a.nextNonSpaceToken;
}
return n ? null : (a.truncateToCursor(), d);
}
getStartToken(s, l) {
const n = s.nextNonSpaceToken;
return n !== null && A.Token.isTokenDelimiter(n, this.parserOptions) ? (l.push(""), s.nextNonSpaceToken) : n;
}
shouldSkipColumnParse(s, l, n) {
const { parserOptions: a } = this;
if (A.Token.isTokenDelimiter(l, a)) {
s.advancePastToken(l);
const d = s.nextCharacterToken;
if (!s.hasMoreCharacters || d !== null && A.Token.isTokenRowDelimiter(d) || d !== null && A.Token.isTokenDelimiter(d, a)) return n.push(""), !0;
}
return !1;
}
};
}, { "./Token": 159, "./column": 164 }], 158: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.Scanner = void 0;
const e = g("./Token"), A = /((?:\r\n)|\n|\r)/;
i.Scanner = class {
constructor(s) {
this.cursor = 0, this.line = s.line, this.lineLength = this.line.length, this.parserOptions = s.parserOptions, this.hasMoreData = s.hasMoreData, this.cursor = s.cursor || 0;
}
get hasMoreCharacters() {
return this.lineLength > this.cursor;
}
get nextNonSpaceToken() {
const { lineFromCursor: s } = this, l = this.parserOptions.NEXT_TOKEN_REGEXP;
if (s.search(l) === -1) return null;
const n = l.exec(s);
if (n == null) return null;
const a = n[1], d = this.cursor + (n.index || 0);
return new e.Token({ token: a, startCursor: d, endCursor: d + a.length - 1 });
}
get nextCharacterToken() {
const { cursor: s, lineLength: l } = this;
return l <= s ? null : new e.Token({ token: this.line[s], startCursor: s, endCursor: s });
}
get lineFromCursor() {
return this.line.substr(this.cursor);
}
advancePastLine() {
const s = A.exec(this.lineFromCursor);
return s ? (this.cursor += (s.index || 0) + s[0].length, this) : this.hasMoreData ? null : (this.cursor = this.lineLength, this);
}
advanceTo(s) {
return this.cursor = s, this;
}
advanceToToken(s) {
return this.cursor = s.startCursor, this;
}
advancePastToken(s) {
return this.cursor = s.endCursor + 1, this;
}
truncateToCursor() {
return this.line = this.lineFromCursor, this.lineLength = this.line.length, this.cursor = 0, this;
}
};
}, { "./Token": 159 }], 159: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.Token = void 0, i.Token = class {
constructor(e) {
this.token = e.token, this.startCursor = e.startCursor, this.endCursor = e.endCursor;
}
static isTokenRowDelimiter(e) {
const A = e.token;
return A === "\r" || A === `
` || A === `\r
`;
}
static isTokenCarriageReturn(e, A) {
return e.token === A.carriageReturn;
}
static isTokenComment(e, A) {
return A.supportsComments && !!e && e.token === A.comment;
}
static isTokenEscapeCharacter(e, A) {
return e.token === A.escapeChar;
}
static isTokenQuote(e, A) {
return e.token === A.quote;
}
static isTokenDelimiter(e, A) {
return e.token === A.delimiter;
}
};
}, {}], 160: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.ColumnFormatter = void 0, i.ColumnFormatter = class {
constructor(e) {
e.trim ? this.format = (A) => A.trim() : e.ltrim ? this.format = (A) => A.trimLeft() : e.rtrim ? this.format = (A) => A.trimRight() : this.format = (A) => A;
}
};
}, {}], 161: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.ColumnParser = void 0;
const e = g("./NonQuotedColumnParser"), A = g("./QuotedColumnParser"), s = g("../Token");
i.ColumnParser = class {
constructor(l) {
this.parserOptions = l, this.quotedColumnParser = new A.QuotedColumnParser(l), this.nonQuotedColumnParser = new e.NonQuotedColumnParser(l);
}
parse(l) {
const { nextNonSpaceToken: n } = l;
return n !== null && s.Token.isTokenQuote(n, this.parserOptions) ? (l.advanceToToken(n), this.quotedColumnParser.parse(l)) : this.nonQuotedColumnParser.parse(l);
}
};
}, { "../Token": 159, "./NonQuotedColumnParser": 162, "./QuotedColumnParser": 163 }], 162: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.NonQuotedColumnParser = void 0;
const e = g("./ColumnFormatter"), A = g("../Token");
i.NonQuotedColumnParser = class {
constructor(s) {
this.parserOptions = s, this.columnFormatter = new e.ColumnFormatter(s);
}
parse(s) {
if (!s.hasMoreCharacters) return null;
const { parserOptions: l } = this, n = [];
let a = s.nextCharacterToken;
for (; a && !A.Token.isTokenDelimiter(a, l) && !A.Token.isTokenRowDelimiter(a); a = s.nextCharacterToken) n.push(a.token), s.advancePastToken(a);
return this.columnFormatter.format(n.join(""));
}
};
}, { "../Token": 159, "./ColumnFormatter": 160 }], 163: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.QuotedColumnParser = void 0;
const e = g("./ColumnFormatter"), A = g("../Token");
i.QuotedColumnParser = class {
constructor(s) {
this.parserOptions = s, this.columnFormatter = new e.ColumnFormatter(s);
}
parse(s) {
if (!s.hasMoreCharacters) return null;
const l = s.cursor, { foundClosingQuote: n, col: a } = this.gatherDataBetweenQuotes(s);
if (!n) {
if (s.advanceTo(l), !s.hasMoreData) throw new Error(`Parse Error: missing closing: '${this.parserOptions.quote || ""}' in line: at '${s.lineFromCursor.replace(/[\r\n]/g, "\\n'")}'`);
return null;
}
return this.checkForMalformedColumn(s), a;
}
gatherDataBetweenQuotes(s) {
const { parserOptions: l } = this;
let n = !1, a = !1;
const d = [];
let o = s.nextCharacterToken;
for (; !a && o !== null; o = s.nextCharacterToken) {
const c = A.Token.isTokenQuote(o, l);
if (!n && c) n = !0;
else if (n) if (A.Token.isTokenEscapeCharacter(o, l)) {
s.advancePastToken(o);
const r = s.nextCharacterToken;
r !== null && (A.Token.isTokenQuote(r, l) || A.Token.isTokenEscapeCharacter(r, l)) ? (d.push(r.token), o = r) : c ? a = !0 : d.push(o.token);
} else c ? a = !0 : d.push(o.token);
s.advancePastToken(o);
}
return { col: this.columnFormatter.format(d.join("")), foundClosingQuote: a };
}
checkForMalformedColumn(s) {
const { parserOptions: l } = this, { nextNonSpaceToken: n } = s;
if (n) {
const a = A.Token.isTokenDelimiter(n, l), d = A.Token.isTokenRowDelimiter(n);
if (!a && !d) {
const o = s.lineFromCursor.substr(0, 10).replace(/[\r\n]/g, "\\n'");
throw new Error(`Parse Error: expected: '${l.escapedDelimiter}' OR new line got: '${n.token}'. at '${o}`);
}
s.advanceToToken(n);
} else s.hasMoreData || s.advancePastLine();
}
};
}, { "../Token": 159, "./ColumnFormatter": 160 }], 164: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.ColumnFormatter = i.QuotedColumnParser = i.NonQuotedColumnParser = i.ColumnParser = void 0;
var e = g("./ColumnParser");
Object.defineProperty(i, "ColumnParser", { enumerable: !0, get: function() {
return e.ColumnParser;
} });
var A = g("./NonQuotedColumnParser");
Object.defineProperty(i, "NonQuotedColumnParser", { enumerable: !0, get: function() {
return A.NonQuotedColumnParser;
} });
var s = g("./QuotedColumnParser");
Object.defineProperty(i, "QuotedColumnParser", { enumerable: !0, get: function() {
return s.QuotedColumnParser;
} });
var l = g("./ColumnFormatter");
Object.defineProperty(i, "ColumnFormatter", { enumerable: !0, get: function() {
return l.ColumnFormatter;
} });
}, { "./ColumnFormatter": 160, "./ColumnParser": 161, "./NonQuotedColumnParser": 162, "./QuotedColumnParser": 163 }], 165: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.QuotedColumnParser = i.NonQuotedColumnParser = i.ColumnParser = i.Token = i.Scanner = i.RowParser = i.Parser = void 0;
var e = g("./Parser");
Object.defineProperty(i, "Parser", { enumerable: !0, get: function() {
return e.Parser;
} });
var A = g("./RowParser");
Object.defineProperty(i, "RowParser", { enumerable: !0, get: function() {
return A.RowParser;
} });
var s = g("./Scanner");
Object.defineProperty(i, "Scanner", { enumerable: !0, get: function() {
return s.Scanner;
} });
var l = g("./Token");
Object.defineProperty(i, "Token", { enumerable: !0, get: function() {
return l.Token;
} });
var n = g("./column");
Object.defineProperty(i, "ColumnParser", { enumerable: !0, get: function() {
return n.ColumnParser;
} }), Object.defineProperty(i, "NonQuotedColumnParser", { enumerable: !0, get: function() {
return n.NonQuotedColumnParser;
} }), Object.defineProperty(i, "QuotedColumnParser", { enumerable: !0, get: function() {
return n.QuotedColumnParser;
} });
}, { "./Parser": 156, "./RowParser": 157, "./Scanner": 158, "./Token": 159, "./column": 164 }], 166: [function(g, C, i) {
var e = function(a) {
return a && a.__esModule ? a : { default: a };
};
Object.defineProperty(i, "__esModule", { value: !0 }), i.HeaderTransformer = void 0;
const A = e(g("lodash.isundefined")), s = e(g("lodash.isfunction")), l = e(g("lodash.uniq")), n = e(g("lodash.groupby"));
i.HeaderTransformer = class {
constructor(a) {
this.headers = null, this.receivedHeaders = !1, this.shouldUseFirstRow = !1, this.processedFirstRow = !1, this.headersLength = 0, this.parserOptions = a, a.headers === !0 ? this.shouldUseFirstRow = !0 : Array.isArray(a.headers) ? this.setHeaders(a.headers) : s.default(a.headers) && (this.headersTransform = a.headers);
}
transform(a, d) {
return this.shouldMapRow(a) ? d(null, this.processRow(a)) : d(null, { row: null, isValid: !0 });
}
shouldMapRow(a) {
const { parserOptions: d } = this;
if (!this.headersTransform && d.renameHeaders && !this.processedFirstRow) {
if (!this.receivedHeaders) throw new Error("Error renaming headers: new headers must be provided in an array");
return this.processedFirstRow = !0, !1;
}
if (!this.receivedHeaders && Array.isArray(a)) {
if (this.headersTransform) this.setHeaders(this.headersTransform(a));
else {
if (!this.shouldUseFirstRow) return !0;
this.setHeaders(a);
}
return !1;
}
return !0;
}
processRow(a) {
if (!this.headers) return { row: a, isValid: !0 };
const { parserOptions: d } = this;
if (!d.discardUnmappedColumns && a.length > this.headersLength) {
if (!d.strictColumnHandling) throw new Error(`Unexpected Error: column header mismatch expected: ${this.headersLength} columns got: ${a.length}`);
return { row: a, isValid: !1, reason: `Column header mismatch expected: ${this.headersLength} columns got: ${a.length}` };
}
return d.strictColumnHandling && a.length < this.headersLength ? { row: a, isValid: !1, reason: `Column header mismatch expected: ${this.headersLength} columns got: ${a.length}` } : { row: this.mapHeaders(a), isValid: !0 };
}
mapHeaders(a) {
const d = {}, { headers: o, headersLength: c } = this;
for (let r = 0; r < c; r += 1) {
const h = o[r];
if (!A.default(h)) {
const b = a[r];
A.default(b) ? d[h] = "" : d[h] = b;
}
}
return d;
}
setHeaders(a) {
var d;
const o = a.filter((c) => !!c);
if (l.default(o).length !== o.length) {
const c = n.default(o), r = Object.keys(c).filter((h) => c[h].length > 1);
throw new Error("Duplicate headers found " + JSON.stringify(r));
}
this.headers = a, this.receivedHeaders = !0, this.headersLength = ((d = this.headers) === null || d === void 0 ? void 0 : d.length) || 0;
}
};
}, { "lodash.groupby": 443, "lodash.isfunction": 446, "lodash.isundefined": 448, "lodash.uniq": 449 }], 167: [function(g, C, i) {
var e = function(n) {
return n && n.__esModule ? n : { default: n };
};
Object.defineProperty(i, "__esModule", { value: !0 }), i.RowTransformerValidator = void 0;
const A = e(g("lodash.isfunction")), s = g("../types");
class l {
constructor() {
this._rowTransform = null, this._rowValidator = null;
}
static createTransform(a) {
return s.isSyncTransform(a) ? (d, o) => {
let c = null;
try {
c = a(d);
} catch (r) {
return o(r);
}
return o(null, c);
} : a;
}
static createValidator(a) {
return s.isSyncValidate(a) ? (d, o) => {
o(null, { row: d, isValid: a(d) });
} : (d, o) => {
a(d, (c, r, h) => c ? o(c) : o(null, r ? { row: d, isValid: r, reason: h } : { row: d, isValid: !1, reason: h }));
};
}
set rowTransform(a) {
if (!A.default(a)) throw new TypeError("The transform should be a function");
this._rowTransform = l.createTransform(a);
}
set rowValidator(a) {
if (!A.default(a)) throw new TypeError("The validate should be a function");
this._rowValidator = l.createValidator(a);
}
transformAndValidate(a, d) {
return this.callTransformer(a, (o, c) => o ? d(o) : c ? this.callValidator(c, (r, h) => r ? d(r) : h && !h.isValid ? d(null, { row: c, isValid: !1, reason: h.reason }) : d(null, { row: c, isValid: !0 })) : d(null, { row: null, isValid: !0 }));
}
callTransformer(a, d) {
return this._rowTransform ? this._rowTransform(a, d) : d(null, a);
}
callValidator(a, d) {
return this._rowValidator ? this._rowValidator(a, d) : d(null, { row: a, isValid: !0 });
}
}
i.RowTransformerValidator = l;
}, { "../types": 169, "lodash.isfunction": 446 }], 168: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.HeaderTransformer = i.RowTransformerValidator = void 0;
var e = g("./RowTransformerValidator");
Object.defineProperty(i, "RowTransformerValidator", { enumerable: !0, get: function() {
return e.RowTransformerValidator;
} });
var A = g("./HeaderTransformer");
Object.defineProperty(i, "HeaderTransformer", { enumerable: !0, get: function() {
return A.HeaderTransformer;
} });
}, { "./HeaderTransformer": 166, "./RowTransformerValidator": 167 }], 169: [function(g, C, i) {
Object.defineProperty(i, "__esModule", { value: !0 }), i.isSyncValidate = i.isSyncTransform = void 0, i.isSyncTransform = (e) => e.length === 1, i.isSyncValidate = (e) => e.length === 1;
}, {}], 170: [function(g, C, i) {
const e = i;
e.bignum = g("bn.js"), e.define = g("./asn1/api").define, e.base = g("./asn1/base"), e.constants = g("./asn1/constants"), e.decoders = g("./asn1/decoders"), e.encoders = g("./asn1/encoders");
}, { "./asn1/api": 171, "./asn1/base": 173, "./asn1/constants": 177, "./asn1/decoders": 179, "./asn1/encoders": 182, "bn.js": 184 }], 171: [function(g, C, i) {
const e = g("./encoders"), A = g("./decoders"), s = g("inherits");
function l(n, a) {
this.name = n, this.body = a, this.decoders = {}, this.encoders = {};
}
i.define = function(n, a) {
return new l(n, a);
}, l.prototype._createNamed = function(n) {
const a = this.name;
function d(o) {
this._initNamed(o, a);
}
return s(d, n), d.prototype._initNamed = function(o, c) {
n.call(this, o, c);
}, new d(this);
}, l.prototype._getDecoder = function(n) {
return n = n || "der", this.decoders.hasOwnProperty(n) || (this.decoders[n] = this._createNamed(A[n])), this.decoders[n];
}, l.prototype.decode = function(n, a, d) {
return this._getDecoder(a).decode(n, d);
}, l.prototype._getEncoder = function(n) {
return n = n || "der", this.encoders.hasOwnProperty(n) || (this.encoders[n] = this._createNamed(e[n])), this.encoders[n];
}, l.prototype.encode = function(n, a, d) {
return this._getEncoder(a).encode(n, d);
};
}, { "./decoders": 179, "./encoders": 182, inherits: 440 }], 172: [function(g, C, i) {
const e = g("inherits"), A = g("../base/reporter").Reporter, s = g("safer-buffer").Buffer;
function l(a, d) {
A.call(this, d), s.isBuffer(a) ? (this.base = a, this.offset = 0, this.length = a.length) : this.error("Input not Buffer");
}
function n(a, d) {
if (Array.isArray(a)) this.length = 0, this.value = a.map(function(o) {
return n.isEncoderBuffer(o) || (o = new n(o, d)), this.length += o.length, o;
}, this);
else if (typeof a == "number") {
if (!(0 <= a && a <= 255)) return d.error("non-byte EncoderBuffer value");
this.value = a, this.length = 1;
} else if (typeof a == "string") this.value = a, this.length = s.byteLength(a);
else {
if (!s.isBuffer(a)) return d.error("Unsupported type: " + typeof a);
this.value = a, this.length = a.length;
}
}
e(l, A), i.DecoderBuffer = l, l.isDecoderBuffer = function(a) {
return a instanceof l ? !0 : typeof a == "object" && s.isBuffer(a.base) && a.constructor.name === "DecoderBuffer" && typeof a.offset == "number" && typeof a.length == "number" && typeof a.save == "function" && typeof a.restore == "function" && typeof a.isEmpty == "function" && typeof a.readUInt8 == "function" && typeof a.skip == "function" && typeof a.raw == "function";
}, l.prototype.save = function() {
return { offset: this.offset, reporter: A.prototype.save.call(this) };
}, l.prototype.restore = function(a) {
const d = new l(this.base);
return d.offset = a.offset, d.length = this.offset, this.offset = a.offset, A.prototype.restore.call(this, a.reporter), d;
}, l.prototype.isEmpty = function() {
return this.offset === this.length;
}, l.prototype.readUInt8 = function(a) {
return this.offset + 1 <= this.length ? this.base.readUInt8(this.offset++, !0) : this.error(a || "DecoderBuffer overrun");
}, l.prototype.skip = function(a, d) {
if (!(this.offset + a <= this.length)) return this.error(d || "DecoderBuffer overrun");
const o = new l(this.base);
return o._reporterState = this._reporterState, o.offset = this.offset, o.length = this.offset + a, this.offset += a, o;
}, l.prototype.raw = function(a) {
return this.base.slice(a ? a.offset : this.offset, this.length);
}, i.EncoderBuffer = n, n.isEncoderBuffer = function(a) {
return a instanceof n ? !0 : typeof a == "object" && a.constructor.name === "EncoderBuffer" && typeof a.length == "number" && typeof a.join == "function";
}, n.prototype.join = function(a, d) {
return a || (a = s.alloc(this.length)), d || (d = 0), this.length === 0 || (Array.isArray(this.value) ? this.value.forEach(function(o) {
o.join(a, d), d += o.length;
}) : (typeof this.value == "number" ? a[d] = this.value : typeof this.value == "string" ? a.write(this.value, d) : s.isBuffer(this.value) && this.value.copy(a, d), d += this.length)), a;
};
}, { "../base/reporter": 175, inherits: 440, "safer-buffer": 495 }], 173: [function(g, C, i) {
const e = i;
e.Reporter = g("./reporter").Reporter, e.DecoderBuffer = g("./buffer").DecoderBuffer, e.EncoderBuffer = g("./buffer").EncoderBuffer, e.Node = g("./node");
}, { "./buffer": 172, "./node": 174, "./reporter": 175 }], 174: [function(g, C, i) {
const e = g("../base/reporter").Reporter, A = g("../base/buffer").EncoderBuffer, s = g("../base/buffer").DecoderBuffer, l = g("minimalistic-assert"), n = ["seq", "seqof", "set", "setof", "objid", "bool", "gentime", "utctime", "null_", "enum", "int", "objDesc", "bitstr", "bmpstr", "charstr", "genstr", "graphstr", "ia5str", "iso646str", "numstr", "octstr", "printstr", "t61str", "unistr", "utf8str", "videostr"], a = ["key", "obj", "use", "optional", "explicit", "implicit", "def", "choice", "any", "contains"].concat(n);
function d(c, r, h) {
const b = {};
this._baseState = b, b.name = h, b.enc = c, b.parent = r || null, b.children = null, b.tag = null, b.args = null, b.reverseArgs = null, b.choice = null, b.optional = !1, b.any = !1, b.obj = !1, b.use = null, b.useDecoder = null, b.key = null, b.default = null, b.explicit = null, b.implicit = null, b.contains = null, b.parent || (b.children = [], this._wrap());
}
C.exports = d;
const o = ["enc", "parent", "children", "tag", "args", "reverseArgs", "choice", "optional", "any", "obj", "use", "alteredUse", "key", "default", "explicit", "implicit", "contains"];
d.prototype.clone = function() {
const c = this._baseState, r = {};
o.forEach(function(b) {
r[b] = c[b];
});
const h = new this.constructor(r.parent);
return h._baseState = r, h;
}, d.prototype._wrap = function() {
const c = this._baseState;
a.forEach(function(r) {
this[r] = function() {
const h = new this.constructor(this);
return c.children.push(h), h[r].apply(h, arguments);
};
}, this);
}, d.prototype._init = function(c) {
const r = this._baseState;
l(r.parent === null), c.call(this), r.children = r.children.filter(function(h) {
return h._baseState.parent === this;
}, this), l.equal(r.children.length, 1, "Root node can have only one child");
}, d.prototype._useArgs = function(c) {
const r = this._baseState, h = c.filter(function(b) {
return b instanceof this.constructor;
}, this);
c = c.filter(function(b) {
return !(b instanceof this.constructor);
}, this), h.length !== 0 && (l(r.children === null), r.children = h, h.forEach(function(b) {
b._baseState.parent = this;
}, this)), c.length !== 0 && (l(r.args === null), r.args = c, r.reverseArgs = c.map(function(b) {
if (typeof b != "object" || b.constructor !== Object) return b;
const u = {};
return Object.keys(b).forEach(function(m) {
m == (0 | m) && (m |= 0);
const Z = b[m];
u[Z] = m;
}), u;
}));
}, ["_peekTag", "_decodeTag", "_use", "_decodeStr", "_decodeObjid", "_decodeTime", "_decodeNull", "_decodeInt", "_decodeBool", "_decodeList", "_encodeComposite", "_encodeStr", "_encodeObjid", "_encodeTime", "_encodeNull", "_encodeInt", "_encodeBool"].forEach(function(c) {
d.prototype[c] = function() {
const r = this._baseState;
throw new Error(c + " not implemented for encoding: " + r.enc);
};
}), n.forEach(function(c) {
d.prototype[c] = function() {
const r = this._baseState, h = Array.prototype.slice.call(arguments);
return l(r.tag === null), r.tag = c, this._useArgs(h), this;
};
}), d.prototype.use = function(c) {
l(c);
const r = this._baseState;
return l(r.use === null), r.use = c, this;
}, d.prototype.optional = function() {
return this._baseState.optional = !0, this;
}, d.prototype.def = function(c) {
const r = this._baseState;
return l(r.default === null), r.default = c, r.optional = !0, this;
}, d.prototype.explicit = function(c) {
const r = this._baseState;
return l(r.explicit === null && r.implicit === null), r.explicit = c, this;
}, d.prototype.implicit = function(c) {
const r = this._baseState;
return l(r.explicit === null && r.implicit === null), r.implicit = c, this;
}, d.prototype.obj = function() {
const c = this._baseState, r = Array.prototype.slice.call(arguments);
return c.obj = !0, r.length !== 0 && this._useArgs(r), this;
}, d.prototype.key = function(c) {
const r = this._baseState;
return l(r.key === null), r.key = c, this;
}, d.prototype.any = function() {
return this._baseState.any = !0, this;
}, d.prototype.choice = function(c) {
const r = this._baseState;
return l(r.choice === null), r.choice = c, this._useArgs(Object.keys(c).map(function(h) {
return c[h];
})), this;
}, d.prototype.contains = function(c) {
const r = this._baseState;
return l(r.use === null), r.contains = c, this;
}, d.prototype._decode = function(c, r) {
const h = this._baseState;
if (h.parent === null) return c.wrapResult(h.children[0]._decode(c, r));
let b, u = h.default, m = !0, Z = null;
if (h.key !== null && (Z = c.enterKey(h.key)), h.optional) {
let p = null;
if (h.explicit !== null ? p = h.explicit : h.implicit !== null ? p = h.implicit : h.tag !== null && (p = h.tag), p !== null || h.any) {
if (m = this._peekTag(c, p, h.any), c.isError(m)) return m;
} else {
const Y = c.save();
try {
h.choice === null ? this._decodeGeneric(h.tag, c, r) : this._decodeChoice(c, r), m = !0;
} catch {
m = !1;
}
c.restore(Y);
}
}
if (h.obj && m && (b = c.enterObject()), m) {
if (h.explicit !== null) {
const Y = this._decodeTag(c, h.explicit);
if (c.isError(Y)) return Y;
c = Y;
}
const p = c.offset;
if (h.use === null && h.choice === null) {
let Y;
h.any && (Y = c.save());
const R = this._decodeTag(c, h.implicit !== null ? h.implicit : h.tag, h.any);
if (c.isError(R)) return R;
h.any ? u = c.raw(Y) : c = R;
}
if (r && r.track && h.tag !== null && r.track(c.path(), p, c.length, "tagged"), r && r.track && h.tag !== null && r.track(c.path(), c.offset, c.length, "content"), h.any || (u = h.choice === null ? this._decodeGeneric(h.tag, c, r) : this._decodeChoice(c, r)), c.isError(u)) return u;
if (h.any || h.choice !== null || h.children === null || h.children.forEach(function(Y) {
Y._decode(c, r);
}), h.contains && (h.tag === "octstr" || h.tag === "bitstr")) {
const Y = new s(u);
u = this._getUse(h.contains, c._reporterState.obj)._decode(Y, r);
}
}
return h.obj && m && (u = c.leaveObject(b)), h.key === null || u === null && m !== !0 ? Z !== null && c.exitKey(Z) : c.leaveKey(Z, h.key, u), u;
}, d.prototype._decodeGeneric = function(c, r, h) {
const b = this._baseState;
return c === "seq" || c === "set" ? null : c === "seqof" || c === "setof" ? this._decodeList(r, c, b.args[0], h) : /str$/.test(c) ? this._decodeStr(r, c, h) : c === "objid" && b.args ? this._decodeObjid(r, b.args[0], b.args[1], h) : c === "objid" ? this._decodeObjid(r, null, null, h) : c === "gentime" || c === "utctime" ? this._decodeTime(r, c, h) : c === "null_" ? this._decodeNull(r, h) : c === "bool" ? this._decodeBool(r, h) : c === "objDesc" ? this._decodeStr(r, c, h) : c === "int" || c === "enum" ? this._decodeInt(r, b.args && b.args[0], h) : b.use !== null ? this._getUse(b.use, r._reporterState.obj)._decode(r, h) : r.error("unknown tag: " + c);
}, d.prototype._getUse = function(c, r) {
const h = this._baseState;
return h.useDecoder = this._use(c, r), l(h.useDecoder._baseState.parent === null), h.useDecoder = h.useDecoder._baseState.children[0], h.implicit !== h.useDecoder._baseState.implicit && (h.useDecoder = h.useDecoder.clone(), h.useDecoder._baseState.implicit = h.implicit), h.useDecoder;
}, d.prototype._decodeChoice = function(c, r) {
const h = this._baseState;
let b = null, u = !1;
return Object.keys(h.choice).some(function(m) {
const Z = c.save(), p = h.choice[m];
try {
const Y = p._decode(c, r);
if (c.isError(Y)) return !1;
b = { type: m, value: Y }, u = !0;
} catch {
return c.restore(Z), !1;
}
return !0;
}, this), u ? b : c.error("Choice not matched");
}, d.prototype._createEncoderBuffer = function(c) {
return new A(c, this.reporter);
}, d.prototype._encode = function(c, r, h) {
const b = this._baseState;
if (b.default !== null && b.default === c) return;
const u = this._encodeValue(c, r, h);
return u === void 0 || this._skipDefault(u, r, h) ? void 0 : u;
}, d.prototype._encodeValue = function(c, r, h) {
const b = this._baseState;
if (b.parent === null) return b.children[0]._encode(c, r || new e());
let u = null;
if (this.reporter = r, b.optional && c === void 0) {
if (b.default === null) return;
c = b.default;
}
let m = null, Z = !1;
if (b.any) u = this._createEncoderBuffer(c);
else if (b.choice) u = this._encodeChoice(c, r);
else if (b.contains) m = this._getUse(b.contains, h)._encode(c, r), Z = !0;
else if (b.children) m = b.children.map(function(p) {
if (p._baseState.tag === "null_") return p._encode(null, r, c);
if (p._baseState.key === null) return r.error("Child should have a key");
const Y = r.enterKey(p._baseState.key);
if (typeof c != "object") return r.error("Child expected, but input is not object");
const R = p._encode(c[p._baseState.key], r, c);
return r.leaveKey(Y), R;
}, this).filter(function(p) {
return p;
}), m = this._createEncoderBuffer(m);
else if (b.tag === "seqof" || b.tag === "setof") {
if (!b.args || b.args.length !== 1) return r.error("Too many args for : " + b.tag);
if (!Array.isArray(c)) return r.error("seqof/setof, but data is not Array");
const p = this.clone();
p._baseState.implicit = null, m = this._createEncoderBuffer(c.map(function(Y) {
const R = this._baseState;
return this._getUse(R.args[0], c)._encode(Y, r);
}, p));
} else b.use !== null ? u = this._getUse(b.use, h)._encode(c, r) : (m = this._encodePrimitive(b.tag, c), Z = !0);
if (!b.any && b.choice === null) {
const p = b.implicit !== null ? b.implicit : b.tag, Y = b.implicit === null ? "universal" : "context";
p === null ? b.use === null && r.error("Tag could be omitted only for .use()") : b.use === null && (u = this._encodeComposite(p, Z, Y, m));
}
return b.explicit !== null && (u = this._encodeComposite(b.explicit, !1, "context", u)), u;
}, d.prototype._encodeChoice = function(c, r) {
const h = this._baseState, b = h.choice[c.type];
return b || l(!1, c.type + " not found in " + JSON.stringify(Object.keys(h.choice))), b._encode(c.value, r);
}, d.prototype._encodePrimitive = function(c, r) {
const h = this._baseState;
if (/str$/.test(c)) return this._encodeStr(r, c);
if (c === "objid" && h.args) return this._encodeObjid(r, h.reverseArgs[0], h.args[1]);
if (c === "objid") return this._encodeObjid(r, null, null);
if (c === "gentime" || c === "utctime") return this._encodeTime(r, c);
if (c === "null_") return this._encodeNull();
if (c === "int" || c === "enum") return this._encodeInt(r, h.args && h.reverseArgs[0]);
if (c === "bool") return this._encodeBool(r);
if (c === "objDesc") return this._encodeStr(r, c);
throw new Error("Unsupported tag: " + c);
}, d.prototype._isNumstr = function(c) {
return /^[0-9 ]*$/.test(c);
}, d.prototype._isPrintstr = function(c) {
return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(c);
};
}, { "../base/buffer": 172, "../base/reporter": 175, "minimalistic-assert": 453 }], 175: [function(g, C, i) {
const e = g("inherits");
function A(l) {
this._reporterState = { obj: null, path: [], options: l || {}, errors: [] };
}
function s(l, n) {
this.path = l, this.rethrow(n);
}
i.Reporter = A, A.prototype.isError = function(l) {
return l instanceof s;
}, A.prototype.save = function() {
const l = this._reporterState;
return { obj: l.obj, pathLen: l.path.length };
}, A.prototype.restore = function(l) {
const n = this._reporterState;
n.obj = l.obj, n.path = n.path.slice(0, l.pathLen);
}, A.prototype.enterKey = function(l) {
return this._reporterState.path.push(l);
}, A.prototype.exitKey = function(l) {
const n = this._reporterState;
n.path = n.path.slice(0, l - 1);
}, A.prototype.leaveKey = function(l, n, a) {
const d = this._reporterState;
this.exitKey(l), d.obj !== null && (d.obj[n] = a);
}, A.prototype.path = function() {
return this._reporterState.path.join("/");
}, A.prototype.enterObject = function() {
const l = this._reporterState, n = l.obj;
return l.obj = {}, n;
}, A.prototype.leaveObject = function(l) {
const n = this._reporterState, a = n.obj;
return n.obj = l, a;
}, A.prototype.error = function(l) {
let n;
const a = this._reporterState, d = l instanceof s;
if (n = d ? l : new s(a.path.map(function(o) {
return "[" + JSON.stringify(o) + "]";
}).join(""), l.message || l, l.stack), !a.options.partial) throw n;
return d || a.errors.push(n), n;
}, A.prototype.wrapResult = function(l) {
const n = this._reporterState;
return n.options.partial ? { result: this.isError(l) ? null : l, errors: n.errors } : l;
}, e(s, Error), s.prototype.rethrow = function(l) {
if (this.message = l + " at: " + (this.path || "(shallow)"), Error.captureStackTrace && Error.captureStackTrace(this, s), !this.stack) try {
throw new Error(this.message);
} catch (n) {
this.stack = n.stack;
}
return this;
};
}, { inherits: 440 }], 176: [function(g, C, i) {
function e(A) {
const s = {};
return Object.keys(A).forEach(function(l) {
(0 | l) == l && (l |= 0);
const n = A[l];
s[n] = l;
}), s;
}
i.tagClass = { 0: "universal", 1: "application", 2: "context", 3: "private" }, i.tagClassByName = e(i.tagClass), i.tag = { 0: "end", 1: "bool", 2: "int", 3: "bitstr", 4: "octstr", 5: "null_", 6: "objid", 7: "objDesc", 8: "external", 9: "real", 10: "enum", 11: "embed", 12: "utf8str", 13: "relativeOid", 16: "seq", 17: "set", 18: "numstr", 19: "printstr", 20: "t61str", 21: "videostr", 22: "ia5str", 23: "utctime", 24: "gentime", 25: "graphstr", 26: "iso646str", 27: "genstr", 28: "unistr", 29: "charstr", 30: "bmpstr" }, i.tagByName = e(i.tag);
}, {}], 177: [function(g, C, i) {
const e = i;
e._reverse = function(A) {
const s = {};
return Object.keys(A).forEach(function(l) {
(0 | l) == l && (l |= 0);
const n = A[l];
s[n] = l;
}), s;
}, e.der = g("./der");
}, { "./der": 176 }], 178: [function(g, C, i) {
const e = g("inherits"), A = g("bn.js"), s = g("../base/buffer").DecoderBuffer, l = g("../base/node"), n = g("../constants/der");
function a(r) {
this.enc = "der", this.name = r.name, this.entity = r, this.tree = new d(), this.tree._init(r.body);
}
function d(r) {
l.call(this, "der", r);
}
function o(r, h) {
let b = r.readUInt8(h);
if (r.isError(b)) return b;
const u = n.tagClass[b >> 6], m = (32 & b) == 0;
if ((31 & b) == 31) {
let Z = b;
for (b = 0; (128 & Z) == 128; ) {
if (Z = r.readUInt8(h), r.isError(Z)) return Z;
b <<= 7, b |= 127 & Z;
}
} else b &= 31;
return { cls: u, primitive: m, tag: b, tagStr: n.tag[b] };
}
function c(r, h, b) {
let u = r.readUInt8(b);
if (r.isError(u)) return u;
if (!h && u === 128) return null;
if ((128 & u) == 0) return u;
const m = 127 & u;
if (m > 4) return r.error("length octect is too long");
u = 0;
for (let Z = 0; Z < m; Z++) {
u <<= 8;
const p = r.readUInt8(b);
if (r.isError(p)) return p;
u |= p;
}
return u;
}
C.exports = a, a.prototype.decode = function(r, h) {
return s.isDecoderBuffer(r) || (r = new s(r, h)), this.tree._decode(r, h);
}, e(d, l), d.prototype._peekTag = function(r, h, b) {
if (r.isEmpty()) return !1;
const u = r.save(), m = o(r, 'Failed to peek tag: "' + h + '"');
return r.isError(m) ? m : (r.restore(u), m.tag === h || m.tagStr === h || m.tagStr + "of" === h || b);
}, d.prototype._decodeTag = function(r, h, b) {
const u = o(r, 'Failed to decode tag of "' + h + '"');
if (r.isError(u)) return u;
let m = c(r, u.primitive, 'Failed to get length of "' + h + '"');
if (r.isError(m)) return m;
if (!b && u.tag !== h && u.tagStr !== h && u.tagStr + "of" !== h) return r.error('Failed to match tag: "' + h + '"');
if (u.primitive || m !== null) return r.skip(m, 'Failed to match body of: "' + h + '"');
const Z = r.save(), p = this._skipUntilEnd(r, 'Failed to skip indefinite length body: "' + this.tag + '"');
return r.isError(p) ? p : (m = r.offset - Z.offset, r.restore(Z), r.skip(m, 'Failed to match body of: "' + h + '"'));
}, d.prototype._skipUntilEnd = function(r, h) {
for (; ; ) {
const b = o(r, h);
if (r.isError(b)) return b;
const u = c(r, b.primitive, h);
if (r.isError(u)) return u;
let m;
if (m = b.primitive || u !== null ? r.skip(u) : this._skipUntilEnd(r, h), r.isError(m)) return m;
if (b.tagStr === "end") break;
}
}, d.prototype._decodeList = function(r, h, b, u) {
const m = [];
for (; !r.isEmpty(); ) {
const Z = this._peekTag(r, "end");
if (r.isError(Z)) return Z;
const p = b.decode(r, "der", u);
if (r.isError(p) && Z) break;
m.push(p);
}
return m;
}, d.prototype._decodeStr = function(r, h) {
if (h === "bitstr") {
const b = r.readUInt8();
return r.isError(b) ? b : { unused: b, data: r.raw() };
}
if (h === "bmpstr") {
const b = r.raw();
if (b.length % 2 == 1) return r.error("Decoding of string type: bmpstr length mismatch");
let u = "";
for (let m = 0; m < b.length / 2; m++) u += String.fromCharCode(b.readUInt16BE(2 * m));
return u;
}
if (h === "numstr") {
const b = r.raw().toString("ascii");
return this._isNumstr(b) ? b : r.error("Decoding of string type: numstr unsupported characters");
}
if (h === "octstr" || h === "objDesc") return r.raw();
if (h === "printstr") {
const b = r.raw().toString("ascii");
return this._isPrintstr(b) ? b : r.error("Decoding of string type: printstr unsupported characters");
}
return /str$/.test(h) ? r.raw().toString() : r.error("Decoding of string type: " + h + " unsupported");
}, d.prototype._decodeObjid = function(r, h, b) {
let u;
const m = [];
let Z = 0, p = 0;
for (; !r.isEmpty(); ) p = r.readUInt8(), Z <<= 7, Z |= 127 & p, (128 & p) == 0 && (m.push(Z), Z = 0);
128 & p && m.push(Z);
const Y = m[0] / 40 | 0, R = m[0] % 40;
if (u = b ? m : [Y, R].concat(m.slice(1)), h) {
let X = h[u.join(" ")];
X === void 0 && (X = h[u.join(".")]), X !== void 0 && (u = X);
}
return u;
}, d.prototype._decodeTime = function(r, h) {
const b = r.raw().toString();
let u, m, Z, p, Y, R;
if (h === "gentime") u = 0 | b.slice(0, 4), m = 0 | b.slice(4, 6), Z = 0 | b.slice(6, 8), p = 0 | b.slice(8, 10), Y = 0 | b.slice(10, 12), R = 0 | b.slice(12, 14);
else {
if (h !== "utctime") return r.error("Decoding " + h + " time is not supported yet");
u = 0 | b.slice(0, 2), m = 0 | b.slice(2, 4), Z = 0 | b.slice(4, 6), p = 0 | b.slice(6, 8), Y = 0 | b.slice(8, 10), R = 0 | b.slice(10, 12), u = u < 70 ? 2e3 + u : 1900 + u;
}
return Date.UTC(u, m - 1, Z, p, Y, R, 0);
}, d.prototype._decodeNull = function() {
return null;
}, d.prototype._decodeBool = function(r) {
const h = r.readUInt8();
return r.isError(h) ? h : h !== 0;
}, d.prototype._decodeInt = function(r, h) {
const b = r.raw();
let u = new A(b);
return h && (u = h[u.toString(10)] || u), u;
}, d.prototype._use = function(r, h) {
return typeof r == "function" && (r = r(h)), r._getDecoder("der").tree;
};
}, { "../base/buffer": 172, "../base/node": 174, "../constants/der": 176, "bn.js": 184, inherits: 440 }], 179: [function(g, C, i) {
const e = i;
e.der = g("./der"), e.pem = g("./pem");
}, { "./der": 178, "./pem": 180 }], 180: [function(g, C, i) {
const e = g("inherits"), A = g("safer-buffer").Buffer, s = g("./der");
function l(n) {
s.call(this, n), this.enc = "pem";
}
e(l, s), C.exports = l, l.prototype.decode = function(n, a) {
const d = n.toString().split(/[\r\n]+/g), o = a.label.toUpperCase(), c = /^-----(BEGIN|END) ([^-]+)-----$/;
let r = -1, h = -1;
for (let m = 0; m < d.length; m++) {
const Z = d[m].match(c);
if (Z !== null && Z[2] === o) {
if (r !== -1) {
if (Z[1] !== "END") break;
h = m;
break;
}
if (Z[1] !== "BEGIN") break;
r = m;
}
}
if (r === -1 || h === -1) throw new Error("PEM section not found for: " + o);
const b = d.slice(r + 1, h).join("");
b.replace(/[^a-z0-9+/=]+/gi, "");
const u = A.from(b, "base64");
return s.prototype.decode.call(this, u, a);
};
}, { "./der": 178, inherits: 440, "safer-buffer": 495 }], 181: [function(g, C, i) {
const e = g("inherits"), A = g("safer-buffer").Buffer, s = g("../base/node"), l = g("../constants/der");
function n(o) {
this.enc = "der", this.name = o.name, this.entity = o, this.tree = new a(), this.tree._init(o.body);
}
function a(o) {
s.call(this, "der", o);
}
function d(o) {
return o < 10 ? "0" + o : o;
}
C.exports = n, n.prototype.encode = function(o, c) {
return this.tree._encode(o, c).join();
}, e(a, s), a.prototype._encodeComposite = function(o, c, r, h) {
const b = function(Z, p, Y, R) {
let X;
if (Z === "seqof" ? Z = "seq" : Z === "setof" && (Z = "set"), l.tagByName.hasOwnProperty(Z)) X = l.tagByName[Z];
else {
if (typeof Z != "number" || (0 | Z) !== Z) return R.error("Unknown tag: " + Z);
X = Z;
}
return X >= 31 ? R.error("Multi-octet tag encoding unsupported") : (p || (X |= 32), X |= l.tagClassByName[Y || "universal"] << 6, X);
}(o, c, r, this.reporter);
if (h.length < 128) {
const Z = A.alloc(2);
return Z[0] = b, Z[1] = h.length, this._createEncoderBuffer([Z, h]);
}
let u = 1;
for (let Z = h.length; Z >= 256; Z >>= 8) u++;
const m = A.alloc(2 + u);
m[0] = b, m[1] = 128 | u;
for (let Z = 1 + u, p = h.length; p > 0; Z--, p >>= 8) m[Z] = 255 & p;
return this._createEncoderBuffer([m, h]);
}, a.prototype._encodeStr = function(o, c) {
if (c === "bitstr") return this._createEncoderBuffer([0 | o.unused, o.data]);
if (c === "bmpstr") {
const r = A.alloc(2 * o.length);
for (let h = 0; h < o.length; h++) r.writeUInt16BE(o.charCodeAt(h), 2 * h);
return this._createEncoderBuffer(r);
}
return c === "numstr" ? this._isNumstr(o) ? this._createEncoderBuffer(o) : this.reporter.error("Encoding of string type: numstr supports only digits and space") : c === "printstr" ? this._isPrintstr(o) ? this._createEncoderBuffer(o) : this.reporter.error("Encoding of string type: printstr supports only latin upper and lower case letters, digits, space, apostrophe, left and rigth parenthesis, plus sign, comma, hyphen, dot, slash, colon, equal sign, question mark") : /str$/.test(c) || c === "objDesc" ? this._createEncoderBuffer(o) : this.reporter.error("Encoding of string type: " + c + " unsupported");
}, a.prototype._encodeObjid = function(o, c, r) {
if (typeof o == "string") {
if (!c) return this.reporter.error("string objid given, but no values map found");
if (!c.hasOwnProperty(o)) return this.reporter.error("objid not found in values map");
o = c[o].split(/[\s.]+/g);
for (let m = 0; m < o.length; m++) o[m] |= 0;
} else if (Array.isArray(o)) {
o = o.slice();
for (let m = 0; m < o.length; m++) o[m] |= 0;
}
if (!Array.isArray(o)) return this.reporter.error("objid() should be either array or string, got: " + JSON.stringify(o));
if (!r) {
if (o[1] >= 40) return this.reporter.error("Second objid identifier OOB");
o.splice(0, 2, 40 * o[0] + o[1]);
}
let h = 0;
for (let m = 0; m < o.length; m++) {
let Z = o[m];
for (h++; Z >= 128; Z >>= 7) h++;
}
const b = A.alloc(h);
let u = b.length - 1;
for (let m = o.length - 1; m >= 0; m--) {
let Z = o[m];
for (b[u--] = 127 & Z; (Z >>= 7) > 0; ) b[u--] = 128 | 127 & Z;
}
return this._createEncoderBuffer(b);
}, a.prototype._encodeTime = function(o, c) {
let r;
const h = new Date(o);
return c === "gentime" ? r = [d(h.getUTCFullYear()), d(h.getUTCMonth() + 1), d(h.getUTCDate()), d(h.getUTCHours()), d(h.getUTCMinutes()), d(h.getUTCSeconds()), "Z"].join("") : c === "utctime" ? r = [d(h.getUTCFullYear() % 100), d(h.getUTCMonth() + 1), d(h.getUTCDate()), d(h.getUTCHours()), d(h.getUTCMinutes()), d(h.getUTCSeconds()), "Z"].join("") : this.reporter.error("Encoding " + c + " time is not supported yet"), this._encodeStr(r, "octstr");
}, a.prototype._encodeNull = function() {
return this._createEncoderBuffer("");
}, a.prototype._encodeInt = function(o, c) {
if (typeof o == "string") {
if (!c) return this.reporter.error("String int or enum given, but no values map");
if (!c.hasOwnProperty(o)) return this.reporter.error("Values map doesn't contain: " + JSON.stringify(o));
o = c[o];
}
if (typeof o != "number" && !A.isBuffer(o)) {
const b = o.toArray();
!o.sign && 128 & b[0] && b.unshift(0), o = A.from(b);
}
if (A.isBuffer(o)) {
let b = o.length;
o.length === 0 && b++;
const u = A.alloc(b);
return o.copy(u), o.length === 0 && (u[0] = 0), this._createEncoderBuffer(u);
}
if (o < 128) return this._createEncoderBuffer(o);
if (o < 256) return this._createEncoderBuffer([0, o]);
let r = 1;
for (let b = o; b >= 256; b >>= 8) r++;
const h = new Array(r);
for (let b = h.length - 1; b >= 0; b--) h[b] = 255 & o, o >>= 8;
return 128 & h[0] && h.unshift(0), this._createEncoderBuffer(A.from(h));
}, a.prototype._encodeBool = function(o) {
return this._createEncoderBuffer(o ? 255 : 0);
}, a.prototype._use = function(o, c) {
return typeof o == "function" && (o = o(c)), o._getEncoder("der").tree;
}, a.prototype._skipDefault = function(o, c, r) {
const h = this._baseState;
let b;
if (h.default === null) return !1;
const u = o.join();
if (h.defaultBuffer === void 0 && (h.defaultBuffer = this._encodeValue(h.default, c, r).join()), u.length !== h.defaultBuffer.length) return !1;
for (b = 0; b < u.length; b++) if (u[b] !== h.defaultBuffer[b]) return !1;
return !0;
};
}, { "../base/node": 174, "../constants/der": 176, inherits: 440, "safer-buffer": 495 }], 182: [function(g, C, i) {
const e = i;
e.der = g("./der"), e.pem = g("./pem");
}, { "./der": 181, "./pem": 183 }], 183: [function(g, C, i) {
const e = g("inherits"), A = g("./der");
function s(l) {
A.call(this, l), this.enc = "pem";
}
e(s, A), C.exports = s, s.prototype.encode = function(l, n) {
const a = A.prototype.encode.call(this, l).toString("base64"), d = ["-----BEGIN " + n.label + "-----"];
for (let o = 0; o < a.length; o += 64) d.push(a.slice(o, o + 64));
return d.push("-----END " + n.label + "-----"), d.join(`
`);
};
}, { "./der": 181, inherits: 440 }], 184: [function(g, C, i) {
(function(e, A) {
function s(V, N) {
if (!V) throw new Error(N || "Assertion failed");
}
function l(V, N) {
V.super_ = N;
var B = function() {
};
B.prototype = N.prototype, V.prototype = new B(), V.prototype.constructor = V;
}
function n(V, N, B) {
if (n.isBN(V)) return V;
this.negative = 0, this.words = null, this.length = 0, this.red = null, V !== null && (N !== "le" && N !== "be" || (B = N, N = 10), this._init(V || 0, N || 10, B || "be"));
}
var a;
typeof e == "object" ? e.exports = n : (void 0).BN = n, n.BN = n, n.wordSize = 26;
try {
a = typeof window < "u" && window.Buffer !== void 0 ? window.Buffer : g("buffer").Buffer;
} catch {
}
function d(V, N) {
var B = V.charCodeAt(N);
return B >= 65 && B <= 70 ? B - 55 : B >= 97 && B <= 102 ? B - 87 : B - 48 & 15;
}
function o(V, N, B) {
var G = d(V, B);
return B - 1 >= N && (G |= d(V, B - 1) << 4), G;
}
function c(V, N, B, G) {
for (var w = 0, W = Math.min(V.length, B), y = N; y < W; y++) {
var f = V.charCodeAt(y) - 48;
w *= G, w += f >= 49 ? f - 49 + 10 : f >= 17 ? f - 17 + 10 : f;
}
return w;
}
n.isBN = function(V) {
return V instanceof n || V !== null && typeof V == "object" && V.constructor.wordSize === n.wordSize && Array.isArray(V.words);
}, n.max = function(V, N) {
return V.cmp(N) > 0 ? V : N;
}, n.min = function(V, N) {
return V.cmp(N) < 0 ? V : N;
}, n.prototype._init = function(V, N, B) {
if (typeof V == "number") return this._initNumber(V, N, B);
if (typeof V == "object") return this._initArray(V, N, B);
N === "hex" && (N = 16), s(N === (0 | N) && N >= 2 && N <= 36);
var G = 0;
(V = V.toString().replace(/\s+/g, ""))[0] === "-" && (G++, this.negative = 1), G < V.length && (N === 16 ? this._parseHex(V, G, B) : (this._parseBase(V, N, G), B === "le" && this._initArray(this.toArray(), N, B)));
}, n.prototype._initNumber = function(V, N, B) {
V < 0 && (this.negative = 1, V = -V), V < 67108864 ? (this.words = [67108863 & V], this.length = 1) : V < 4503599627370496 ? (this.words = [67108863 & V, V / 67108864 & 67108863], this.length = 2) : (s(V < 9007199254740992), this.words = [67108863 & V, V / 67108864 & 67108863, 1], this.length = 3), B === "le" && this._initArray(this.toArray(), N, B);
}, n.prototype._initArray = function(V, N, B) {
if (s(typeof V.length == "number"), V.length <= 0) return this.words = [0], this.length = 1, this;
this.length = Math.ceil(V.length / 3), this.words = new Array(this.length);
for (var G = 0; G < this.length; G++) this.words[G] = 0;
var w, W, y = 0;
if (B === "be") for (G = V.length - 1, w = 0; G >= 0; G -= 3) W = V[G] | V[G - 1] << 8 | V[G - 2] << 16, this.words[w] |= W << y & 67108863, this.words[w + 1] = W >>> 26 - y & 67108863, (y += 24) >= 26 && (y -= 26, w++);
else if (B === "le") for (G = 0, w = 0; G < V.length; G += 3) W = V[G] | V[G + 1] << 8 | V[G + 2] << 16, this.words[w] |= W << y & 67108863, this.words[w + 1] = W >>> 26 - y & 67108863, (y += 24) >= 26 && (y -= 26, w++);
return this.strip();
}, n.prototype._parseHex = function(V, N, B) {
this.length = Math.ceil((V.length - N) / 6), this.words = new Array(this.length);
for (var G = 0; G < this.length; G++) this.words[G] = 0;
var w, W = 0, y = 0;
if (B === "be") for (G = V.length - 1; G >= N; G -= 2) w = o(V, N, G) << W, this.words[y] |= 67108863 & w, W >= 18 ? (W -= 18, y += 1, this.words[y] |= w >>> 26) : W += 8;
else for (G = (V.length - N) % 2 == 0 ? N + 1 : N; G < V.length; G += 2) w = o(V, N, G) << W, this.words[y] |= 67108863 & w, W >= 18 ? (W -= 18, y += 1, this.words[y] |= w >>> 26) : W += 8;
this.strip();
}, n.prototype._parseBase = function(V, N, B) {
this.words = [0], this.length = 1;
for (var G = 0, w = 1; w <= 67108863; w *= N) G++;
G--, w = w / N | 0;
for (var W = V.length - B, y = W % G, f = Math.min(W, W - y) + B, D = 0, F = B; F < f; F += G) D = c(V, F, F + G, N), this.imuln(w), this.words[0] + D < 67108864 ? this.words[0] += D : this._iaddn(D);
if (y !== 0) {
var T = 1;
for (D = c(V, F, V.length, N), F = 0; F < y; F++) T *= N;
this.imuln(T), this.words[0] + D < 67108864 ? this.words[0] += D : this._iaddn(D);
}
this.strip();
}, n.prototype.copy = function(V) {
V.words = new Array(this.length);
for (var N = 0; N < this.length; N++) V.words[N] = this.words[N];
V.length = this.length, V.negative = this.negative, V.red = this.red;
}, n.prototype.clone = function() {
var V = new n(null);
return this.copy(V), V;
}, n.prototype._expand = function(V) {
for (; this.length < V; ) this.words[this.length++] = 0;
return this;
}, n.prototype.strip = function() {
for (; this.length > 1 && this.words[this.length - 1] === 0; ) this.length--;
return this._normSign();
}, n.prototype._normSign = function() {
return this.length === 1 && this.words[0] === 0 && (this.negative = 0), this;
}, n.prototype.inspect = function() {
return (this.red ? "";
};
var r = ["", "0", "00", "000", "0000", "00000", "000000", "0000000", "00000000", "000000000", "0000000000", "00000000000", "000000000000", "0000000000000", "00000000000000", "000000000000000", "0000000000000000", "00000000000000000", "000000000000000000", "0000000000000000000", "00000000000000000000", "000000000000000000000", "0000000000000000000000", "00000000000000000000000", "000000000000000000000000", "0000000000000000000000000"], h = [0, 0, 25, 16, 12, 11, 10, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], b = [0, 0, 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, 43046721, 1e7, 19487171, 35831808, 62748517, 7529536, 11390625, 16777216, 24137569, 34012224, 47045881, 64e6, 4084101, 5153632, 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, 243e5, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176];
function u(V, N, B) {
B.negative = N.negative ^ V.negative;
var G = V.length + N.length | 0;
B.length = G, G = G - 1 | 0;
var w = 0 | V.words[0], W = 0 | N.words[0], y = w * W, f = 67108863 & y, D = y / 67108864 | 0;
B.words[0] = f;
for (var F = 1; F < G; F++) {
for (var T = D >>> 26, Q = 67108863 & D, P = Math.min(F, N.length - 1), L = Math.max(0, F - V.length + 1); L <= P; L++) {
var E = F - L | 0;
T += (y = (w = 0 | V.words[E]) * (W = 0 | N.words[L]) + Q) / 67108864 | 0, Q = 67108863 & y;
}
B.words[F] = 0 | Q, D = 0 | T;
}
return D !== 0 ? B.words[F] = 0 | D : B.length--, B.strip();
}
n.prototype.toString = function(V, N) {
var B;
if (N = 0 | N || 1, (V = V || 10) === 16 || V === "hex") {
B = "";
for (var G = 0, w = 0, W = 0; W < this.length; W++) {
var y = this.words[W], f = (16777215 & (y << G | w)).toString(16);
B = (w = y >>> 24 - G & 16777215) !== 0 || W !== this.length - 1 ? r[6 - f.length] + f + B : f + B, (G += 2) >= 26 && (G -= 26, W--);
}
for (w !== 0 && (B = w.toString(16) + B); B.length % N != 0; ) B = "0" + B;
return this.negative !== 0 && (B = "-" + B), B;
}
if (V === (0 | V) && V >= 2 && V <= 36) {
var D = h[V], F = b[V];
B = "";
var T = this.clone();
for (T.negative = 0; !T.isZero(); ) {
var Q = T.modn(F).toString(V);
B = (T = T.idivn(F)).isZero() ? Q + B : r[D - Q.length] + Q + B;
}
for (this.isZero() && (B = "0" + B); B.length % N != 0; ) B = "0" + B;
return this.negative !== 0 && (B = "-" + B), B;
}
s(!1, "Base should be between 2 and 36");
}, n.prototype.toNumber = function() {
var V = this.words[0];
return this.length === 2 ? V += 67108864 * this.words[1] : this.length === 3 && this.words[2] === 1 ? V += 4503599627370496 + 67108864 * this.words[1] : this.length > 2 && s(!1, "Number can only safely store up to 53 bits"), this.negative !== 0 ? -V : V;
}, n.prototype.toJSON = function() {
return this.toString(16);
}, n.prototype.toBuffer = function(V, N) {
return s(a !== void 0), this.toArrayLike(a, V, N);
}, n.prototype.toArray = function(V, N) {
return this.toArrayLike(Array, V, N);
}, n.prototype.toArrayLike = function(V, N, B) {
var G = this.byteLength(), w = B || Math.max(1, G);
s(G <= w, "byte array longer than desired length"), s(w > 0, "Requested array length <= 0"), this.strip();
var W, y, f = N === "le", D = new V(w), F = this.clone();
if (f) {
for (y = 0; !F.isZero(); y++) W = F.andln(255), F.iushrn(8), D[y] = W;
for (; y < w; y++) D[y] = 0;
} else {
for (y = 0; y < w - G; y++) D[y] = 0;
for (y = 0; !F.isZero(); y++) W = F.andln(255), F.iushrn(8), D[w - y - 1] = W;
}
return D;
}, Math.clz32 ? n.prototype._countBits = function(V) {
return 32 - Math.clz32(V);
} : n.prototype._countBits = function(V) {
var N = V, B = 0;
return N >= 4096 && (B += 13, N >>>= 13), N >= 64 && (B += 7, N >>>= 7), N >= 8 && (B += 4, N >>>= 4), N >= 2 && (B += 2, N >>>= 2), B + N;
}, n.prototype._zeroBits = function(V) {
if (V === 0) return 26;
var N = V, B = 0;
return (8191 & N) == 0 && (B += 13, N >>>= 13), (127 & N) == 0 && (B += 7, N >>>= 7), (15 & N) == 0 && (B += 4, N >>>= 4), (3 & N) == 0 && (B += 2, N >>>= 2), (1 & N) == 0 && B++, B;
}, n.prototype.bitLength = function() {
var V = this.words[this.length - 1], N = this._countBits(V);
return 26 * (this.length - 1) + N;
}, n.prototype.zeroBits = function() {
if (this.isZero()) return 0;
for (var V = 0, N = 0; N < this.length; N++) {
var B = this._zeroBits(this.words[N]);
if (V += B, B !== 26) break;
}
return V;
}, n.prototype.byteLength = function() {
return Math.ceil(this.bitLength() / 8);
}, n.prototype.toTwos = function(V) {
return this.negative !== 0 ? this.abs().inotn(V).iaddn(1) : this.clone();
}, n.prototype.fromTwos = function(V) {
return this.testn(V - 1) ? this.notn(V).iaddn(1).ineg() : this.clone();
}, n.prototype.isNeg = function() {
return this.negative !== 0;
}, n.prototype.neg = function() {
return this.clone().ineg();
}, n.prototype.ineg = function() {
return this.isZero() || (this.negative ^= 1), this;
}, n.prototype.iuor = function(V) {
for (; this.length < V.length; ) this.words[this.length++] = 0;
for (var N = 0; N < V.length; N++) this.words[N] = this.words[N] | V.words[N];
return this.strip();
}, n.prototype.ior = function(V) {
return s((this.negative | V.negative) == 0), this.iuor(V);
}, n.prototype.or = function(V) {
return this.length > V.length ? this.clone().ior(V) : V.clone().ior(this);
}, n.prototype.uor = function(V) {
return this.length > V.length ? this.clone().iuor(V) : V.clone().iuor(this);
}, n.prototype.iuand = function(V) {
var N;
N = this.length > V.length ? V : this;
for (var B = 0; B < N.length; B++) this.words[B] = this.words[B] & V.words[B];
return this.length = N.length, this.strip();
}, n.prototype.iand = function(V) {
return s((this.negative | V.negative) == 0), this.iuand(V);
}, n.prototype.and = function(V) {
return this.length > V.length ? this.clone().iand(V) : V.clone().iand(this);
}, n.prototype.uand = function(V) {
return this.length > V.length ? this.clone().iuand(V) : V.clone().iuand(this);
}, n.prototype.iuxor = function(V) {
var N, B;
this.length > V.length ? (N = this, B = V) : (N = V, B = this);
for (var G = 0; G < B.length; G++) this.words[G] = N.words[G] ^ B.words[G];
if (this !== N) for (; G < N.length; G++) this.words[G] = N.words[G];
return this.length = N.length, this.strip();
}, n.prototype.ixor = function(V) {
return s((this.negative | V.negative) == 0), this.iuxor(V);
}, n.prototype.xor = function(V) {
return this.length > V.length ? this.clone().ixor(V) : V.clone().ixor(this);
}, n.prototype.uxor = function(V) {
return this.length > V.length ? this.clone().iuxor(V) : V.clone().iuxor(this);
}, n.prototype.inotn = function(V) {
s(typeof V == "number" && V >= 0);
var N = 0 | Math.ceil(V / 26), B = V % 26;
this._expand(N), B > 0 && N--;
for (var G = 0; G < N; G++) this.words[G] = 67108863 & ~this.words[G];
return B > 0 && (this.words[G] = ~this.words[G] & 67108863 >> 26 - B), this.strip();
}, n.prototype.notn = function(V) {
return this.clone().inotn(V);
}, n.prototype.setn = function(V, N) {
s(typeof V == "number" && V >= 0);
var B = V / 26 | 0, G = V % 26;
return this._expand(B + 1), this.words[B] = N ? this.words[B] | 1 << G : this.words[B] & ~(1 << G), this.strip();
}, n.prototype.iadd = function(V) {
var N, B, G;
if (this.negative !== 0 && V.negative === 0) return this.negative = 0, N = this.isub(V), this.negative ^= 1, this._normSign();
if (this.negative === 0 && V.negative !== 0) return V.negative = 0, N = this.isub(V), V.negative = 1, N._normSign();
this.length > V.length ? (B = this, G = V) : (B = V, G = this);
for (var w = 0, W = 0; W < G.length; W++) N = (0 | B.words[W]) + (0 | G.words[W]) + w, this.words[W] = 67108863 & N, w = N >>> 26;
for (; w !== 0 && W < B.length; W++) N = (0 | B.words[W]) + w, this.words[W] = 67108863 & N, w = N >>> 26;
if (this.length = B.length, w !== 0) this.words[this.length] = w, this.length++;
else if (B !== this) for (; W < B.length; W++) this.words[W] = B.words[W];
return this;
}, n.prototype.add = function(V) {
var N;
return V.negative !== 0 && this.negative === 0 ? (V.negative = 0, N = this.sub(V), V.negative ^= 1, N) : V.negative === 0 && this.negative !== 0 ? (this.negative = 0, N = V.sub(this), this.negative = 1, N) : this.length > V.length ? this.clone().iadd(V) : V.clone().iadd(this);
}, n.prototype.isub = function(V) {
if (V.negative !== 0) {
V.negative = 0;
var N = this.iadd(V);
return V.negative = 1, N._normSign();
}
if (this.negative !== 0) return this.negative = 0, this.iadd(V), this.negative = 1, this._normSign();
var B, G, w = this.cmp(V);
if (w === 0) return this.negative = 0, this.length = 1, this.words[0] = 0, this;
w > 0 ? (B = this, G = V) : (B = V, G = this);
for (var W = 0, y = 0; y < G.length; y++) W = (N = (0 | B.words[y]) - (0 | G.words[y]) + W) >> 26, this.words[y] = 67108863 & N;
for (; W !== 0 && y < B.length; y++) W = (N = (0 | B.words[y]) + W) >> 26, this.words[y] = 67108863 & N;
if (W === 0 && y < B.length && B !== this) for (; y < B.length; y++) this.words[y] = B.words[y];
return this.length = Math.max(this.length, y), B !== this && (this.negative = 1), this.strip();
}, n.prototype.sub = function(V) {
return this.clone().isub(V);
};
var m = function(V, N, B) {
var G, w, W, y = V.words, f = N.words, D = B.words, F = 0, T = 0 | y[0], Q = 8191 & T, P = T >>> 13, L = 0 | y[1], E = 8191 & L, J = L >>> 13, k = 0 | y[2], j = 8191 & k, q = k >>> 13, Cg = 0 | y[3], Ig = 8191 & Cg, x = Cg >>> 13, Ag = 0 | y[4], eg = 8191 & Ag, O = Ag >>> 13, _ = 0 | y[5], gg = 8191 & _, lg = _ >>> 13, ng = 0 | y[6], sg = 8191 & ng, og = ng >>> 13, cg = 0 | y[7], rg = 8191 & cg, dg = cg >>> 13, Bg = 0 | y[8], Zg = 8191 & Bg, Xg = Bg >>> 13, Kg = 0 | y[9], kg = 8191 & Kg, Wg = Kg >>> 13, Ng = 0 | f[0], wg = 8191 & Ng, fg = Ng >>> 13, Jg = 0 | f[1], zg = 8191 & Jg, cI = Jg >>> 13, YI = 0 | f[2], Eg = 8191 & YI, aI = YI >>> 13, dI = 0 | f[3], _g = 8191 & dI, xI = dI >>> 13, SI = 0 | f[4], eI = 8191 & SI, NI = SI >>> 13, EI = 0 | f[5], oI = 8191 & EI, LI = EI >>> 13, pg = 0 | f[6], uI = 8191 & pg, hg = pg >>> 13, bg = 0 | f[7], Rg = 8191 & bg, Tg = bg >>> 13, rI = 0 | f[8], jg = 8191 & rI, GI = rI >>> 13, nI = 0 | f[9], CI = 8191 & nI, WI = nI >>> 13;
B.negative = V.negative ^ N.negative, B.length = 19;
var mI = (F + (G = Math.imul(Q, wg)) | 0) + ((8191 & (w = (w = Math.imul(Q, fg)) + Math.imul(P, wg) | 0)) << 13) | 0;
F = ((W = Math.imul(P, fg)) + (w >>> 13) | 0) + (mI >>> 26) | 0, mI &= 67108863, G = Math.imul(E, wg), w = (w = Math.imul(E, fg)) + Math.imul(J, wg) | 0, W = Math.imul(J, fg);
var VI = (F + (G = G + Math.imul(Q, zg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, cI) | 0) + Math.imul(P, zg) | 0)) << 13) | 0;
F = ((W = W + Math.imul(P, cI) | 0) + (w >>> 13) | 0) + (VI >>> 26) | 0, VI &= 67108863, G = Math.imul(j, wg), w = (w = Math.imul(j, fg)) + Math.imul(q, wg) | 0, W = Math.imul(q, fg), G = G + Math.imul(E, zg) | 0, w = (w = w + Math.imul(E, cI) | 0) + Math.imul(J, zg) | 0, W = W + Math.imul(J, cI) | 0;
var yC = (F + (G = G + Math.imul(Q, Eg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, aI) | 0) + Math.imul(P, Eg) | 0)) << 13) | 0;
F = ((W = W + Math.imul(P, aI) | 0) + (w >>> 13) | 0) + (yC >>> 26) | 0, yC &= 67108863, G = Math.imul(Ig, wg), w = (w = Math.imul(Ig, fg)) + Math.imul(x, wg) | 0, W = Math.imul(x, fg), G = G + Math.imul(j, zg) | 0, w = (w = w + Math.imul(j, cI) | 0) + Math.imul(q, zg) | 0, W = W + Math.imul(q, cI) | 0, G = G + Math.imul(E, Eg) | 0, w = (w = w + Math.imul(E, aI) | 0) + Math.imul(J, Eg) | 0, W = W + Math.imul(J, aI) | 0;
var gC = (F + (G = G + Math.imul(Q, _g) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, xI) | 0) + Math.imul(P, _g) | 0)) << 13) | 0;
F = ((W = W + Math.imul(P, xI) | 0) + (w >>> 13) | 0) + (gC >>> 26) | 0, gC &= 67108863, G = Math.imul(eg, wg), w = (w = Math.imul(eg, fg)) + Math.imul(O, wg) | 0, W = Math.imul(O, fg), G = G + Math.imul(Ig, zg) | 0, w = (w = w + Math.imul(Ig, cI) | 0) + Math.imul(x, zg) | 0, W = W + Math.imul(x, cI) | 0, G = G + Math.imul(j, Eg) | 0, w = (w = w + Math.imul(j, aI) | 0) + Math.imul(q, Eg) | 0, W = W + Math.imul(q, aI) | 0, G = G + Math.imul(E, _g) | 0, w = (w = w + Math.imul(E, xI) | 0) + Math.imul(J, _g) | 0, W = W + Math.imul(J, xI) | 0;
var It = (F + (G = G + Math.imul(Q, eI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, NI) | 0) + Math.imul(P, eI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(P, NI) | 0) + (w >>> 13) | 0) + (It >>> 26) | 0, It &= 67108863, G = Math.imul(gg, wg), w = (w = Math.imul(gg, fg)) + Math.imul(lg, wg) | 0, W = Math.imul(lg, fg), G = G + Math.imul(eg, zg) | 0, w = (w = w + Math.imul(eg, cI) | 0) + Math.imul(O, zg) | 0, W = W + Math.imul(O, cI) | 0, G = G + Math.imul(Ig, Eg) | 0, w = (w = w + Math.imul(Ig, aI) | 0) + Math.imul(x, Eg) | 0, W = W + Math.imul(x, aI) | 0, G = G + Math.imul(j, _g) | 0, w = (w = w + Math.imul(j, xI) | 0) + Math.imul(q, _g) | 0, W = W + Math.imul(q, xI) | 0, G = G + Math.imul(E, eI) | 0, w = (w = w + Math.imul(E, NI) | 0) + Math.imul(J, eI) | 0, W = W + Math.imul(J, NI) | 0;
var dC = (F + (G = G + Math.imul(Q, oI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, LI) | 0) + Math.imul(P, oI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(P, LI) | 0) + (w >>> 13) | 0) + (dC >>> 26) | 0, dC &= 67108863, G = Math.imul(sg, wg), w = (w = Math.imul(sg, fg)) + Math.imul(og, wg) | 0, W = Math.imul(og, fg), G = G + Math.imul(gg, zg) | 0, w = (w = w + Math.imul(gg, cI) | 0) + Math.imul(lg, zg) | 0, W = W + Math.imul(lg, cI) | 0, G = G + Math.imul(eg, Eg) | 0, w = (w = w + Math.imul(eg, aI) | 0) + Math.imul(O, Eg) | 0, W = W + Math.imul(O, aI) | 0, G = G + Math.imul(Ig, _g) | 0, w = (w = w + Math.imul(Ig, xI) | 0) + Math.imul(x, _g) | 0, W = W + Math.imul(x, xI) | 0, G = G + Math.imul(j, eI) | 0, w = (w = w + Math.imul(j, NI) | 0) + Math.imul(q, eI) | 0, W = W + Math.imul(q, NI) | 0, G = G + Math.imul(E, oI) | 0, w = (w = w + Math.imul(E, LI) | 0) + Math.imul(J, oI) | 0, W = W + Math.imul(J, LI) | 0;
var Tt = (F + (G = G + Math.imul(Q, uI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, hg) | 0) + Math.imul(P, uI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(P, hg) | 0) + (w >>> 13) | 0) + (Tt >>> 26) | 0, Tt &= 67108863, G = Math.imul(rg, wg), w = (w = Math.imul(rg, fg)) + Math.imul(dg, wg) | 0, W = Math.imul(dg, fg), G = G + Math.imul(sg, zg) | 0, w = (w = w + Math.imul(sg, cI) | 0) + Math.imul(og, zg) | 0, W = W + Math.imul(og, cI) | 0, G = G + Math.imul(gg, Eg) | 0, w = (w = w + Math.imul(gg, aI) | 0) + Math.imul(lg, Eg) | 0, W = W + Math.imul(lg, aI) | 0, G = G + Math.imul(eg, _g) | 0, w = (w = w + Math.imul(eg, xI) | 0) + Math.imul(O, _g) | 0, W = W + Math.imul(O, xI) | 0, G = G + Math.imul(Ig, eI) | 0, w = (w = w + Math.imul(Ig, NI) | 0) + Math.imul(x, eI) | 0, W = W + Math.imul(x, NI) | 0, G = G + Math.imul(j, oI) | 0, w = (w = w + Math.imul(j, LI) | 0) + Math.imul(q, oI) | 0, W = W + Math.imul(q, LI) | 0, G = G + Math.imul(E, uI) | 0, w = (w = w + Math.imul(E, hg) | 0) + Math.imul(J, uI) | 0, W = W + Math.imul(J, hg) | 0;
var ag = (F + (G = G + Math.imul(Q, Rg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, Tg) | 0) + Math.imul(P, Rg) | 0)) << 13) | 0;
F = ((W = W + Math.imul(P, Tg) | 0) + (w >>> 13) | 0) + (ag >>> 26) | 0, ag &= 67108863, G = Math.imul(Zg, wg), w = (w = Math.imul(Zg, fg)) + Math.imul(Xg, wg) | 0, W = Math.imul(Xg, fg), G = G + Math.imul(rg, zg) | 0, w = (w = w + Math.imul(rg, cI) | 0) + Math.imul(dg, zg) | 0, W = W + Math.imul(dg, cI) | 0, G = G + Math.imul(sg, Eg) | 0, w = (w = w + Math.imul(sg, aI) | 0) + Math.imul(og, Eg) | 0, W = W + Math.imul(og, aI) | 0, G = G + Math.imul(gg, _g) | 0, w = (w = w + Math.imul(gg, xI) | 0) + Math.imul(lg, _g) | 0, W = W + Math.imul(lg, xI) | 0, G = G + Math.imul(eg, eI) | 0, w = (w = w + Math.imul(eg, NI) | 0) + Math.imul(O, eI) | 0, W = W + Math.imul(O, NI) | 0, G = G + Math.imul(Ig, oI) | 0, w = (w = w + Math.imul(Ig, LI) | 0) + Math.imul(x, oI) | 0, W = W + Math.imul(x, LI) | 0, G = G + Math.imul(j, uI) | 0, w = (w = w + Math.imul(j, hg) | 0) + Math.imul(q, uI) | 0, W = W + Math.imul(q, hg) | 0, G = G + Math.imul(E, Rg) | 0, w = (w = w + Math.imul(E, Tg) | 0) + Math.imul(J, Rg) | 0, W = W + Math.imul(J, Tg) | 0;
var mg = (F + (G = G + Math.imul(Q, jg) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, GI) | 0) + Math.imul(P, jg) | 0)) << 13) | 0;
F = ((W = W + Math.imul(P, GI) | 0) + (w >>> 13) | 0) + (mg >>> 26) | 0, mg &= 67108863, G = Math.imul(kg, wg), w = (w = Math.imul(kg, fg)) + Math.imul(Wg, wg) | 0, W = Math.imul(Wg, fg), G = G + Math.imul(Zg, zg) | 0, w = (w = w + Math.imul(Zg, cI) | 0) + Math.imul(Xg, zg) | 0, W = W + Math.imul(Xg, cI) | 0, G = G + Math.imul(rg, Eg) | 0, w = (w = w + Math.imul(rg, aI) | 0) + Math.imul(dg, Eg) | 0, W = W + Math.imul(dg, aI) | 0, G = G + Math.imul(sg, _g) | 0, w = (w = w + Math.imul(sg, xI) | 0) + Math.imul(og, _g) | 0, W = W + Math.imul(og, xI) | 0, G = G + Math.imul(gg, eI) | 0, w = (w = w + Math.imul(gg, NI) | 0) + Math.imul(lg, eI) | 0, W = W + Math.imul(lg, NI) | 0, G = G + Math.imul(eg, oI) | 0, w = (w = w + Math.imul(eg, LI) | 0) + Math.imul(O, oI) | 0, W = W + Math.imul(O, LI) | 0, G = G + Math.imul(Ig, uI) | 0, w = (w = w + Math.imul(Ig, hg) | 0) + Math.imul(x, uI) | 0, W = W + Math.imul(x, hg) | 0, G = G + Math.imul(j, Rg) | 0, w = (w = w + Math.imul(j, Tg) | 0) + Math.imul(q, Rg) | 0, W = W + Math.imul(q, Tg) | 0, G = G + Math.imul(E, jg) | 0, w = (w = w + Math.imul(E, GI) | 0) + Math.imul(J, jg) | 0, W = W + Math.imul(J, GI) | 0;
var Sg = (F + (G = G + Math.imul(Q, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Q, WI) | 0) + Math.imul(P, CI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(P, WI) | 0) + (w >>> 13) | 0) + (Sg >>> 26) | 0, Sg &= 67108863, G = Math.imul(kg, zg), w = (w = Math.imul(kg, cI)) + Math.imul(Wg, zg) | 0, W = Math.imul(Wg, cI), G = G + Math.imul(Zg, Eg) | 0, w = (w = w + Math.imul(Zg, aI) | 0) + Math.imul(Xg, Eg) | 0, W = W + Math.imul(Xg, aI) | 0, G = G + Math.imul(rg, _g) | 0, w = (w = w + Math.imul(rg, xI) | 0) + Math.imul(dg, _g) | 0, W = W + Math.imul(dg, xI) | 0, G = G + Math.imul(sg, eI) | 0, w = (w = w + Math.imul(sg, NI) | 0) + Math.imul(og, eI) | 0, W = W + Math.imul(og, NI) | 0, G = G + Math.imul(gg, oI) | 0, w = (w = w + Math.imul(gg, LI) | 0) + Math.imul(lg, oI) | 0, W = W + Math.imul(lg, LI) | 0, G = G + Math.imul(eg, uI) | 0, w = (w = w + Math.imul(eg, hg) | 0) + Math.imul(O, uI) | 0, W = W + Math.imul(O, hg) | 0, G = G + Math.imul(Ig, Rg) | 0, w = (w = w + Math.imul(Ig, Tg) | 0) + Math.imul(x, Rg) | 0, W = W + Math.imul(x, Tg) | 0, G = G + Math.imul(j, jg) | 0, w = (w = w + Math.imul(j, GI) | 0) + Math.imul(q, jg) | 0, W = W + Math.imul(q, GI) | 0;
var Fg = (F + (G = G + Math.imul(E, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(E, WI) | 0) + Math.imul(J, CI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(J, WI) | 0) + (w >>> 13) | 0) + (Fg >>> 26) | 0, Fg &= 67108863, G = Math.imul(kg, Eg), w = (w = Math.imul(kg, aI)) + Math.imul(Wg, Eg) | 0, W = Math.imul(Wg, aI), G = G + Math.imul(Zg, _g) | 0, w = (w = w + Math.imul(Zg, xI) | 0) + Math.imul(Xg, _g) | 0, W = W + Math.imul(Xg, xI) | 0, G = G + Math.imul(rg, eI) | 0, w = (w = w + Math.imul(rg, NI) | 0) + Math.imul(dg, eI) | 0, W = W + Math.imul(dg, NI) | 0, G = G + Math.imul(sg, oI) | 0, w = (w = w + Math.imul(sg, LI) | 0) + Math.imul(og, oI) | 0, W = W + Math.imul(og, LI) | 0, G = G + Math.imul(gg, uI) | 0, w = (w = w + Math.imul(gg, hg) | 0) + Math.imul(lg, uI) | 0, W = W + Math.imul(lg, hg) | 0, G = G + Math.imul(eg, Rg) | 0, w = (w = w + Math.imul(eg, Tg) | 0) + Math.imul(O, Rg) | 0, W = W + Math.imul(O, Tg) | 0, G = G + Math.imul(Ig, jg) | 0, w = (w = w + Math.imul(Ig, GI) | 0) + Math.imul(x, jg) | 0, W = W + Math.imul(x, GI) | 0;
var tI = (F + (G = G + Math.imul(j, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(j, WI) | 0) + Math.imul(q, CI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(q, WI) | 0) + (w >>> 13) | 0) + (tI >>> 26) | 0, tI &= 67108863, G = Math.imul(kg, _g), w = (w = Math.imul(kg, xI)) + Math.imul(Wg, _g) | 0, W = Math.imul(Wg, xI), G = G + Math.imul(Zg, eI) | 0, w = (w = w + Math.imul(Zg, NI) | 0) + Math.imul(Xg, eI) | 0, W = W + Math.imul(Xg, NI) | 0, G = G + Math.imul(rg, oI) | 0, w = (w = w + Math.imul(rg, LI) | 0) + Math.imul(dg, oI) | 0, W = W + Math.imul(dg, LI) | 0, G = G + Math.imul(sg, uI) | 0, w = (w = w + Math.imul(sg, hg) | 0) + Math.imul(og, uI) | 0, W = W + Math.imul(og, hg) | 0, G = G + Math.imul(gg, Rg) | 0, w = (w = w + Math.imul(gg, Tg) | 0) + Math.imul(lg, Rg) | 0, W = W + Math.imul(lg, Tg) | 0, G = G + Math.imul(eg, jg) | 0, w = (w = w + Math.imul(eg, GI) | 0) + Math.imul(O, jg) | 0, W = W + Math.imul(O, GI) | 0;
var vg = (F + (G = G + Math.imul(Ig, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Ig, WI) | 0) + Math.imul(x, CI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(x, WI) | 0) + (w >>> 13) | 0) + (vg >>> 26) | 0, vg &= 67108863, G = Math.imul(kg, eI), w = (w = Math.imul(kg, NI)) + Math.imul(Wg, eI) | 0, W = Math.imul(Wg, NI), G = G + Math.imul(Zg, oI) | 0, w = (w = w + Math.imul(Zg, LI) | 0) + Math.imul(Xg, oI) | 0, W = W + Math.imul(Xg, LI) | 0, G = G + Math.imul(rg, uI) | 0, w = (w = w + Math.imul(rg, hg) | 0) + Math.imul(dg, uI) | 0, W = W + Math.imul(dg, hg) | 0, G = G + Math.imul(sg, Rg) | 0, w = (w = w + Math.imul(sg, Tg) | 0) + Math.imul(og, Rg) | 0, W = W + Math.imul(og, Tg) | 0, G = G + Math.imul(gg, jg) | 0, w = (w = w + Math.imul(gg, GI) | 0) + Math.imul(lg, jg) | 0, W = W + Math.imul(lg, GI) | 0;
var xg = (F + (G = G + Math.imul(eg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(eg, WI) | 0) + Math.imul(O, CI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(O, WI) | 0) + (w >>> 13) | 0) + (xg >>> 26) | 0, xg &= 67108863, G = Math.imul(kg, oI), w = (w = Math.imul(kg, LI)) + Math.imul(Wg, oI) | 0, W = Math.imul(Wg, LI), G = G + Math.imul(Zg, uI) | 0, w = (w = w + Math.imul(Zg, hg) | 0) + Math.imul(Xg, uI) | 0, W = W + Math.imul(Xg, hg) | 0, G = G + Math.imul(rg, Rg) | 0, w = (w = w + Math.imul(rg, Tg) | 0) + Math.imul(dg, Rg) | 0, W = W + Math.imul(dg, Tg) | 0, G = G + Math.imul(sg, jg) | 0, w = (w = w + Math.imul(sg, GI) | 0) + Math.imul(og, jg) | 0, W = W + Math.imul(og, GI) | 0;
var vI = (F + (G = G + Math.imul(gg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(gg, WI) | 0) + Math.imul(lg, CI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(lg, WI) | 0) + (w >>> 13) | 0) + (vI >>> 26) | 0, vI &= 67108863, G = Math.imul(kg, uI), w = (w = Math.imul(kg, hg)) + Math.imul(Wg, uI) | 0, W = Math.imul(Wg, hg), G = G + Math.imul(Zg, Rg) | 0, w = (w = w + Math.imul(Zg, Tg) | 0) + Math.imul(Xg, Rg) | 0, W = W + Math.imul(Xg, Tg) | 0, G = G + Math.imul(rg, jg) | 0, w = (w = w + Math.imul(rg, GI) | 0) + Math.imul(dg, jg) | 0, W = W + Math.imul(dg, GI) | 0;
var fI = (F + (G = G + Math.imul(sg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(sg, WI) | 0) + Math.imul(og, CI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(og, WI) | 0) + (w >>> 13) | 0) + (fI >>> 26) | 0, fI &= 67108863, G = Math.imul(kg, Rg), w = (w = Math.imul(kg, Tg)) + Math.imul(Wg, Rg) | 0, W = Math.imul(Wg, Tg), G = G + Math.imul(Zg, jg) | 0, w = (w = w + Math.imul(Zg, GI) | 0) + Math.imul(Xg, jg) | 0, W = W + Math.imul(Xg, GI) | 0;
var MI = (F + (G = G + Math.imul(rg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(rg, WI) | 0) + Math.imul(dg, CI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(dg, WI) | 0) + (w >>> 13) | 0) + (MI >>> 26) | 0, MI &= 67108863, G = Math.imul(kg, jg), w = (w = Math.imul(kg, GI)) + Math.imul(Wg, jg) | 0, W = Math.imul(Wg, GI);
var hI = (F + (G = G + Math.imul(Zg, CI) | 0) | 0) + ((8191 & (w = (w = w + Math.imul(Zg, WI) | 0) + Math.imul(Xg, CI) | 0)) << 13) | 0;
F = ((W = W + Math.imul(Xg, WI) | 0) + (w >>> 13) | 0) + (hI >>> 26) | 0, hI &= 67108863;
var AC = (F + (G = Math.imul(kg, CI)) | 0) + ((8191 & (w = (w = Math.imul(kg, WI)) + Math.imul(Wg, CI) | 0)) << 13) | 0;
return F = ((W = Math.imul(Wg, WI)) + (w >>> 13) | 0) + (AC >>> 26) | 0, AC &= 67108863, D[0] = mI, D[1] = VI, D[2] = yC, D[3] = gC, D[4] = It, D[5] = dC, D[6] = Tt, D[7] = ag, D[8] = mg, D[9] = Sg, D[10] = Fg, D[11] = tI, D[12] = vg, D[13] = xg, D[14] = vI, D[15] = fI, D[16] = MI, D[17] = hI, D[18] = AC, F !== 0 && (D[19] = F, B.length++), B;
};
function Z(V, N, B) {
return new p().mulp(V, N, B);
}
function p(V, N) {
this.x = V, this.y = N;
}
Math.imul || (m = u), n.prototype.mulTo = function(V, N) {
var B = this.length + V.length;
return this.length === 10 && V.length === 10 ? m(this, V, N) : B < 63 ? u(this, V, N) : B < 1024 ? function(G, w, W) {
W.negative = w.negative ^ G.negative, W.length = G.length + w.length;
for (var y = 0, f = 0, D = 0; D < W.length - 1; D++) {
var F = f;
f = 0;
for (var T = 67108863 & y, Q = Math.min(D, w.length - 1), P = Math.max(0, D - G.length + 1); P <= Q; P++) {
var L = D - P, E = (0 | G.words[L]) * (0 | w.words[P]), J = 67108863 & E;
T = 67108863 & (J = J + T | 0), f += (F = (F = F + (E / 67108864 | 0) | 0) + (J >>> 26) | 0) >>> 26, F &= 67108863;
}
W.words[D] = T, y = F, F = f;
}
return y !== 0 ? W.words[D] = y : W.length--, W.strip();
}(this, V, N) : Z(this, V, N);
}, p.prototype.makeRBT = function(V) {
for (var N = new Array(V), B = n.prototype._countBits(V) - 1, G = 0; G < V; G++) N[G] = this.revBin(G, B, V);
return N;
}, p.prototype.revBin = function(V, N, B) {
if (V === 0 || V === B - 1) return V;
for (var G = 0, w = 0; w < N; w++) G |= (1 & V) << N - w - 1, V >>= 1;
return G;
}, p.prototype.permute = function(V, N, B, G, w, W) {
for (var y = 0; y < W; y++) G[y] = N[V[y]], w[y] = B[V[y]];
}, p.prototype.transform = function(V, N, B, G, w, W) {
this.permute(W, V, N, B, G, w);
for (var y = 1; y < w; y <<= 1) for (var f = y << 1, D = Math.cos(2 * Math.PI / f), F = Math.sin(2 * Math.PI / f), T = 0; T < w; T += f) for (var Q = D, P = F, L = 0; L < y; L++) {
var E = B[T + L], J = G[T + L], k = B[T + L + y], j = G[T + L + y], q = Q * k - P * j;
j = Q * j + P * k, k = q, B[T + L] = E + k, G[T + L] = J + j, B[T + L + y] = E - k, G[T + L + y] = J - j, L !== f && (q = D * Q - F * P, P = D * P + F * Q, Q = q);
}
}, p.prototype.guessLen13b = function(V, N) {
var B = 1 | Math.max(N, V), G = 1 & B, w = 0;
for (B = B / 2 | 0; B; B >>>= 1) w++;
return 1 << w + 1 + G;
}, p.prototype.conjugate = function(V, N, B) {
if (!(B <= 1)) for (var G = 0; G < B / 2; G++) {
var w = V[G];
V[G] = V[B - G - 1], V[B - G - 1] = w, w = N[G], N[G] = -N[B - G - 1], N[B - G - 1] = -w;
}
}, p.prototype.normalize13b = function(V, N) {
for (var B = 0, G = 0; G < N / 2; G++) {
var w = 8192 * Math.round(V[2 * G + 1] / N) + Math.round(V[2 * G] / N) + B;
V[G] = 67108863 & w, B = w < 67108864 ? 0 : w / 67108864 | 0;
}
return V;
}, p.prototype.convert13b = function(V, N, B, G) {
for (var w = 0, W = 0; W < N; W++) w += 0 | V[W], B[2 * W] = 8191 & w, w >>>= 13, B[2 * W + 1] = 8191 & w, w >>>= 13;
for (W = 2 * N; W < G; ++W) B[W] = 0;
s(w === 0), s((-8192 & w) == 0);
}, p.prototype.stub = function(V) {
for (var N = new Array(V), B = 0; B < V; B++) N[B] = 0;
return N;
}, p.prototype.mulp = function(V, N, B) {
var G = 2 * this.guessLen13b(V.length, N.length), w = this.makeRBT(G), W = this.stub(G), y = new Array(G), f = new Array(G), D = new Array(G), F = new Array(G), T = new Array(G), Q = new Array(G), P = B.words;
P.length = G, this.convert13b(V.words, V.length, y, G), this.convert13b(N.words, N.length, F, G), this.transform(y, W, f, D, G, w), this.transform(F, W, T, Q, G, w);
for (var L = 0; L < G; L++) {
var E = f[L] * T[L] - D[L] * Q[L];
D[L] = f[L] * Q[L] + D[L] * T[L], f[L] = E;
}
return this.conjugate(f, D, G), this.transform(f, D, P, W, G, w), this.conjugate(P, W, G), this.normalize13b(P, G), B.negative = V.negative ^ N.negative, B.length = V.length + N.length, B.strip();
}, n.prototype.mul = function(V) {
var N = new n(null);
return N.words = new Array(this.length + V.length), this.mulTo(V, N);
}, n.prototype.mulf = function(V) {
var N = new n(null);
return N.words = new Array(this.length + V.length), Z(this, V, N);
}, n.prototype.imul = function(V) {
return this.clone().mulTo(V, this);
}, n.prototype.imuln = function(V) {
s(typeof V == "number"), s(V < 67108864);
for (var N = 0, B = 0; B < this.length; B++) {
var G = (0 | this.words[B]) * V, w = (67108863 & G) + (67108863 & N);
N >>= 26, N += G / 67108864 | 0, N += w >>> 26, this.words[B] = 67108863 & w;
}
return N !== 0 && (this.words[B] = N, this.length++), this;
}, n.prototype.muln = function(V) {
return this.clone().imuln(V);
}, n.prototype.sqr = function() {
return this.mul(this);
}, n.prototype.isqr = function() {
return this.imul(this.clone());
}, n.prototype.pow = function(V) {
var N = function(W) {
for (var y = new Array(W.bitLength()), f = 0; f < y.length; f++) {
var D = f / 26 | 0, F = f % 26;
y[f] = (W.words[D] & 1 << F) >>> F;
}
return y;
}(V);
if (N.length === 0) return new n(1);
for (var B = this, G = 0; G < N.length && N[G] === 0; G++, B = B.sqr()) ;
if (++G < N.length) for (var w = B.sqr(); G < N.length; G++, w = w.sqr()) N[G] !== 0 && (B = B.mul(w));
return B;
}, n.prototype.iushln = function(V) {
s(typeof V == "number" && V >= 0);
var N, B = V % 26, G = (V - B) / 26, w = 67108863 >>> 26 - B << 26 - B;
if (B !== 0) {
var W = 0;
for (N = 0; N < this.length; N++) {
var y = this.words[N] & w, f = (0 | this.words[N]) - y << B;
this.words[N] = f | W, W = y >>> 26 - B;
}
W && (this.words[N] = W, this.length++);
}
if (G !== 0) {
for (N = this.length - 1; N >= 0; N--) this.words[N + G] = this.words[N];
for (N = 0; N < G; N++) this.words[N] = 0;
this.length += G;
}
return this.strip();
}, n.prototype.ishln = function(V) {
return s(this.negative === 0), this.iushln(V);
}, n.prototype.iushrn = function(V, N, B) {
var G;
s(typeof V == "number" && V >= 0), G = N ? (N - N % 26) / 26 : 0;
var w = V % 26, W = Math.min((V - w) / 26, this.length), y = 67108863 ^ 67108863 >>> w << w, f = B;
if (G -= W, G = Math.max(0, G), f) {
for (var D = 0; D < W; D++) f.words[D] = this.words[D];
f.length = W;
}
if (W !== 0) if (this.length > W) for (this.length -= W, D = 0; D < this.length; D++) this.words[D] = this.words[D + W];
else this.words[0] = 0, this.length = 1;
var F = 0;
for (D = this.length - 1; D >= 0 && (F !== 0 || D >= G); D--) {
var T = 0 | this.words[D];
this.words[D] = F << 26 - w | T >>> w, F = T & y;
}
return f && F !== 0 && (f.words[f.length++] = F), this.length === 0 && (this.words[0] = 0, this.length = 1), this.strip();
}, n.prototype.ishrn = function(V, N, B) {
return s(this.negative === 0), this.iushrn(V, N, B);
}, n.prototype.shln = function(V) {
return this.clone().ishln(V);
}, n.prototype.ushln = function(V) {
return this.clone().iushln(V);
}, n.prototype.shrn = function(V) {
return this.clone().ishrn(V);
}, n.prototype.ushrn = function(V) {
return this.clone().iushrn(V);
}, n.prototype.testn = function(V) {
s(typeof V == "number" && V >= 0);
var N = V % 26, B = (V - N) / 26, G = 1 << N;
return !(this.length <= B) && !!(this.words[B] & G);
}, n.prototype.imaskn = function(V) {
s(typeof V == "number" && V >= 0);
var N = V % 26, B = (V - N) / 26;
if (s(this.negative === 0, "imaskn works only with positive numbers"), this.length <= B) return this;
if (N !== 0 && B++, this.length = Math.min(B, this.length), N !== 0) {
var G = 67108863 ^ 67108863 >>> N << N;
this.words[this.length - 1] &= G;
}
return this.strip();
}, n.prototype.maskn = function(V) {
return this.clone().imaskn(V);
}, n.prototype.iaddn = function(V) {
return s(typeof V == "number"), s(V < 67108864), V < 0 ? this.isubn(-V) : this.negative !== 0 ? this.length === 1 && (0 | this.words[0]) < V ? (this.words[0] = V - (0 | this.words[0]), this.negative = 0, this) : (this.negative = 0, this.isubn(V), this.negative = 1, this) : this._iaddn(V);
}, n.prototype._iaddn = function(V) {
this.words[0] += V;
for (var N = 0; N < this.length && this.words[N] >= 67108864; N++) this.words[N] -= 67108864, N === this.length - 1 ? this.words[N + 1] = 1 : this.words[N + 1]++;
return this.length = Math.max(this.length, N + 1), this;
}, n.prototype.isubn = function(V) {
if (s(typeof V == "number"), s(V < 67108864), V < 0) return this.iaddn(-V);
if (this.negative !== 0) return this.negative = 0, this.iaddn(V), this.negative = 1, this;
if (this.words[0] -= V, this.length === 1 && this.words[0] < 0) this.words[0] = -this.words[0], this.negative = 1;
else for (var N = 0; N < this.length && this.words[N] < 0; N++) this.words[N] += 67108864, this.words[N + 1] -= 1;
return this.strip();
}, n.prototype.addn = function(V) {
return this.clone().iaddn(V);
}, n.prototype.subn = function(V) {
return this.clone().isubn(V);
}, n.prototype.iabs = function() {
return this.negative = 0, this;
}, n.prototype.abs = function() {
return this.clone().iabs();
}, n.prototype._ishlnsubmul = function(V, N, B) {
var G, w, W = V.length + B;
this._expand(W);
var y = 0;
for (G = 0; G < V.length; G++) {
w = (0 | this.words[G + B]) + y;
var f = (0 | V.words[G]) * N;
y = ((w -= 67108863 & f) >> 26) - (f / 67108864 | 0), this.words[G + B] = 67108863 & w;
}
for (; G < this.length - B; G++) y = (w = (0 | this.words[G + B]) + y) >> 26, this.words[G + B] = 67108863 & w;
if (y === 0) return this.strip();
for (s(y === -1), y = 0, G = 0; G < this.length; G++) y = (w = -(0 | this.words[G]) + y) >> 26, this.words[G] = 67108863 & w;
return this.negative = 1, this.strip();
}, n.prototype._wordDiv = function(V, N) {
var B = (this.length, V.length), G = this.clone(), w = V, W = 0 | w.words[w.length - 1];
(B = 26 - this._countBits(W)) !== 0 && (w = w.ushln(B), G.iushln(B), W = 0 | w.words[w.length - 1]);
var y, f = G.length - w.length;
if (N !== "mod") {
(y = new n(null)).length = f + 1, y.words = new Array(y.length);
for (var D = 0; D < y.length; D++) y.words[D] = 0;
}
var F = G.clone()._ishlnsubmul(w, 1, f);
F.negative === 0 && (G = F, y && (y.words[f] = 1));
for (var T = f - 1; T >= 0; T--) {
var Q = 67108864 * (0 | G.words[w.length + T]) + (0 | G.words[w.length + T - 1]);
for (Q = Math.min(Q / W | 0, 67108863), G._ishlnsubmul(w, Q, T); G.negative !== 0; ) Q--, G.negative = 0, G._ishlnsubmul(w, 1, T), G.isZero() || (G.negative ^= 1);
y && (y.words[T] = Q);
}
return y && y.strip(), G.strip(), N !== "div" && B !== 0 && G.iushrn(B), { div: y || null, mod: G };
}, n.prototype.divmod = function(V, N, B) {
return s(!V.isZero()), this.isZero() ? { div: new n(0), mod: new n(0) } : this.negative !== 0 && V.negative === 0 ? (W = this.neg().divmod(V, N), N !== "mod" && (G = W.div.neg()), N !== "div" && (w = W.mod.neg(), B && w.negative !== 0 && w.iadd(V)), { div: G, mod: w }) : this.negative === 0 && V.negative !== 0 ? (W = this.divmod(V.neg(), N), N !== "mod" && (G = W.div.neg()), { div: G, mod: W.mod }) : (this.negative & V.negative) != 0 ? (W = this.neg().divmod(V.neg(), N), N !== "div" && (w = W.mod.neg(), B && w.negative !== 0 && w.isub(V)), { div: W.div, mod: w }) : V.length > this.length || this.cmp(V) < 0 ? { div: new n(0), mod: this } : V.length === 1 ? N === "div" ? { div: this.divn(V.words[0]), mod: null } : N === "mod" ? { div: null, mod: new n(this.modn(V.words[0])) } : { div: this.divn(V.words[0]), mod: new n(this.modn(V.words[0])) } : this._wordDiv(V, N);
var G, w, W;
}, n.prototype.div = function(V) {
return this.divmod(V, "div", !1).div;
}, n.prototype.mod = function(V) {
return this.divmod(V, "mod", !1).mod;
}, n.prototype.umod = function(V) {
return this.divmod(V, "mod", !0).mod;
}, n.prototype.divRound = function(V) {
var N = this.divmod(V);
if (N.mod.isZero()) return N.div;
var B = N.div.negative !== 0 ? N.mod.isub(V) : N.mod, G = V.ushrn(1), w = V.andln(1), W = B.cmp(G);
return W < 0 || w === 1 && W === 0 ? N.div : N.div.negative !== 0 ? N.div.isubn(1) : N.div.iaddn(1);
}, n.prototype.modn = function(V) {
s(V <= 67108863);
for (var N = (1 << 26) % V, B = 0, G = this.length - 1; G >= 0; G--) B = (N * B + (0 | this.words[G])) % V;
return B;
}, n.prototype.idivn = function(V) {
s(V <= 67108863);
for (var N = 0, B = this.length - 1; B >= 0; B--) {
var G = (0 | this.words[B]) + 67108864 * N;
this.words[B] = G / V | 0, N = G % V;
}
return this.strip();
}, n.prototype.divn = function(V) {
return this.clone().idivn(V);
}, n.prototype.egcd = function(V) {
s(V.negative === 0), s(!V.isZero());
var N = this, B = V.clone();
N = N.negative !== 0 ? N.umod(V) : N.clone();
for (var G = new n(1), w = new n(0), W = new n(0), y = new n(1), f = 0; N.isEven() && B.isEven(); ) N.iushrn(1), B.iushrn(1), ++f;
for (var D = B.clone(), F = N.clone(); !N.isZero(); ) {
for (var T = 0, Q = 1; (N.words[0] & Q) == 0 && T < 26; ++T, Q <<= 1) ;
if (T > 0) for (N.iushrn(T); T-- > 0; ) (G.isOdd() || w.isOdd()) && (G.iadd(D), w.isub(F)), G.iushrn(1), w.iushrn(1);
for (var P = 0, L = 1; (B.words[0] & L) == 0 && P < 26; ++P, L <<= 1) ;
if (P > 0) for (B.iushrn(P); P-- > 0; ) (W.isOdd() || y.isOdd()) && (W.iadd(D), y.isub(F)), W.iushrn(1), y.iushrn(1);
N.cmp(B) >= 0 ? (N.isub(B), G.isub(W), w.isub(y)) : (B.isub(N), W.isub(G), y.isub(w));
}
return { a: W, b: y, gcd: B.iushln(f) };
}, n.prototype._invmp = function(V) {
s(V.negative === 0), s(!V.isZero());
var N = this, B = V.clone();
N = N.negative !== 0 ? N.umod(V) : N.clone();
for (var G, w = new n(1), W = new n(0), y = B.clone(); N.cmpn(1) > 0 && B.cmpn(1) > 0; ) {
for (var f = 0, D = 1; (N.words[0] & D) == 0 && f < 26; ++f, D <<= 1) ;
if (f > 0) for (N.iushrn(f); f-- > 0; ) w.isOdd() && w.iadd(y), w.iushrn(1);
for (var F = 0, T = 1; (B.words[0] & T) == 0 && F < 26; ++F, T <<= 1) ;
if (F > 0) for (B.iushrn(F); F-- > 0; ) W.isOdd() && W.iadd(y), W.iushrn(1);
N.cmp(B) >= 0 ? (N.isub(B), w.isub(W)) : (B.isub(N), W.isub(w));
}
return (G = N.cmpn(1) === 0 ? w : W).cmpn(0) < 0 && G.iadd(V), G;
}, n.prototype.gcd = function(V) {
if (this.isZero()) return V.abs();
if (V.isZero()) return this.abs();
var N = this.clone(), B = V.clone();
N.negative = 0, B.negative = 0;
for (var G = 0; N.isEven() && B.isEven(); G++) N.iushrn(1), B.iushrn(1);
for (; ; ) {
for (; N.isEven(); ) N.iushrn(1);
for (; B.isEven(); ) B.iushrn(1);
var w = N.cmp(B);
if (w < 0) {
var W = N;
N = B, B = W;
} else if (w === 0 || B.cmpn(1) === 0) break;
N.isub(B);
}
return B.iushln(G);
}, n.prototype.invm = function(V) {
return this.egcd(V).a.umod(V);
}, n.prototype.isEven = function() {
return (1 & this.words[0]) == 0;
}, n.prototype.isOdd = function() {
return (1 & this.words[0]) == 1;
}, n.prototype.andln = function(V) {
return this.words[0] & V;
}, n.prototype.bincn = function(V) {
s(typeof V == "number");
var N = V % 26, B = (V - N) / 26, G = 1 << N;
if (this.length <= B) return this._expand(B + 1), this.words[B] |= G, this;
for (var w = G, W = B; w !== 0 && W < this.length; W++) {
var y = 0 | this.words[W];
w = (y += w) >>> 26, y &= 67108863, this.words[W] = y;
}
return w !== 0 && (this.words[W] = w, this.length++), this;
}, n.prototype.isZero = function() {
return this.length === 1 && this.words[0] === 0;
}, n.prototype.cmpn = function(V) {
var N, B = V < 0;
if (this.negative !== 0 && !B) return -1;
if (this.negative === 0 && B) return 1;
if (this.strip(), this.length > 1) N = 1;
else {
B && (V = -V), s(V <= 67108863, "Number is too big");
var G = 0 | this.words[0];
N = G === V ? 0 : G < V ? -1 : 1;
}
return this.negative !== 0 ? 0 | -N : N;
}, n.prototype.cmp = function(V) {
if (this.negative !== 0 && V.negative === 0) return -1;
if (this.negative === 0 && V.negative !== 0) return 1;
var N = this.ucmp(V);
return this.negative !== 0 ? 0 | -N : N;
}, n.prototype.ucmp = function(V) {
if (this.length > V.length) return 1;
if (this.length < V.length) return -1;
for (var N = 0, B = this.length - 1; B >= 0; B--) {
var G = 0 | this.words[B], w = 0 | V.words[B];
if (G !== w) {
G < w ? N = -1 : G > w && (N = 1);
break;
}
}
return N;
}, n.prototype.gtn = function(V) {
return this.cmpn(V) === 1;
}, n.prototype.gt = function(V) {
return this.cmp(V) === 1;
}, n.prototype.gten = function(V) {
return this.cmpn(V) >= 0;
}, n.prototype.gte = function(V) {
return this.cmp(V) >= 0;
}, n.prototype.ltn = function(V) {
return this.cmpn(V) === -1;
}, n.prototype.lt = function(V) {
return this.cmp(V) === -1;
}, n.prototype.lten = function(V) {
return this.cmpn(V) <= 0;
}, n.prototype.lte = function(V) {
return this.cmp(V) <= 0;
}, n.prototype.eqn = function(V) {
return this.cmpn(V) === 0;
}, n.prototype.eq = function(V) {
return this.cmp(V) === 0;
}, n.red = function(V) {
return new v(V);
}, n.prototype.toRed = function(V) {
return s(!this.red, "Already a number in reduction context"), s(this.negative === 0, "red works only with positives"), V.convertTo(this)._forceRed(V);
}, n.prototype.fromRed = function() {
return s(this.red, "fromRed works only with numbers in reduction context"), this.red.convertFrom(this);
}, n.prototype._forceRed = function(V) {
return this.red = V, this;
}, n.prototype.forceRed = function(V) {
return s(!this.red, "Already a number in reduction context"), this._forceRed(V);
}, n.prototype.redAdd = function(V) {
return s(this.red, "redAdd works only with red numbers"), this.red.add(this, V);
}, n.prototype.redIAdd = function(V) {
return s(this.red, "redIAdd works only with red numbers"), this.red.iadd(this, V);
}, n.prototype.redSub = function(V) {
return s(this.red, "redSub works only with red numbers"), this.red.sub(this, V);
}, n.prototype.redISub = function(V) {
return s(this.red, "redISub works only with red numbers"), this.red.isub(this, V);
}, n.prototype.redShl = function(V) {
return s(this.red, "redShl works only with red numbers"), this.red.shl(this, V);
}, n.prototype.redMul = function(V) {
return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, V), this.red.mul(this, V);
}, n.prototype.redIMul = function(V) {
return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, V), this.red.imul(this, V);
}, n.prototype.redSqr = function() {
return s(this.red, "redSqr works only with red numbers"), this.red._verify1(this), this.red.sqr(this);
}, n.prototype.redISqr = function() {
return s(this.red, "redISqr works only with red numbers"), this.red._verify1(this), this.red.isqr(this);
}, n.prototype.redSqrt = function() {
return s(this.red, "redSqrt works only with red numbers"), this.red._verify1(this), this.red.sqrt(this);
}, n.prototype.redInvm = function() {
return s(this.red, "redInvm works only with red numbers"), this.red._verify1(this), this.red.invm(this);
}, n.prototype.redNeg = function() {
return s(this.red, "redNeg works only with red numbers"), this.red._verify1(this), this.red.neg(this);
}, n.prototype.redPow = function(V) {
return s(this.red && !V.red, "redPow(normalNum)"), this.red._verify1(this), this.red.pow(this, V);
};
var Y = { k256: null, p224: null, p192: null, p25519: null };
function R(V, N) {
this.name = V, this.p = new n(N, 16), this.n = this.p.bitLength(), this.k = new n(1).iushln(this.n).isub(this.p), this.tmp = this._tmp();
}
function X() {
R.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
}
function H() {
R.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
}
function S() {
R.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
}
function z() {
R.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
}
function v(V) {
if (typeof V == "string") {
var N = n._prime(V);
this.m = N.p, this.prime = N;
} else s(V.gtn(1), "modulus must be greater than 1"), this.m = V, this.prime = null;
}
function K(V) {
v.call(this, V), this.shift = this.m.bitLength(), this.shift % 26 != 0 && (this.shift += 26 - this.shift % 26), this.r = new n(1).iushln(this.shift), this.r2 = this.imod(this.r.sqr()), this.rinv = this.r._invmp(this.m), this.minv = this.rinv.mul(this.r).isubn(1).div(this.m), this.minv = this.minv.umod(this.r), this.minv = this.r.sub(this.minv);
}
R.prototype._tmp = function() {
var V = new n(null);
return V.words = new Array(Math.ceil(this.n / 13)), V;
}, R.prototype.ireduce = function(V) {
var N, B = V;
do
this.split(B, this.tmp), N = (B = (B = this.imulK(B)).iadd(this.tmp)).bitLength();
while (N > this.n);
var G = N < this.n ? -1 : B.ucmp(this.p);
return G === 0 ? (B.words[0] = 0, B.length = 1) : G > 0 ? B.isub(this.p) : B.strip !== void 0 ? B.strip() : B._strip(), B;
}, R.prototype.split = function(V, N) {
V.iushrn(this.n, 0, N);
}, R.prototype.imulK = function(V) {
return V.imul(this.k);
}, l(X, R), X.prototype.split = function(V, N) {
for (var B = Math.min(V.length, 9), G = 0; G < B; G++) N.words[G] = V.words[G];
if (N.length = B, V.length <= 9) return V.words[0] = 0, void (V.length = 1);
var w = V.words[9];
for (N.words[N.length++] = 4194303 & w, G = 10; G < V.length; G++) {
var W = 0 | V.words[G];
V.words[G - 10] = (4194303 & W) << 4 | w >>> 22, w = W;
}
w >>>= 22, V.words[G - 10] = w, w === 0 && V.length > 10 ? V.length -= 10 : V.length -= 9;
}, X.prototype.imulK = function(V) {
V.words[V.length] = 0, V.words[V.length + 1] = 0, V.length += 2;
for (var N = 0, B = 0; B < V.length; B++) {
var G = 0 | V.words[B];
N += 977 * G, V.words[B] = 67108863 & N, N = 64 * G + (N / 67108864 | 0);
}
return V.words[V.length - 1] === 0 && (V.length--, V.words[V.length - 1] === 0 && V.length--), V;
}, l(H, R), l(S, R), l(z, R), z.prototype.imulK = function(V) {
for (var N = 0, B = 0; B < V.length; B++) {
var G = 19 * (0 | V.words[B]) + N, w = 67108863 & G;
G >>>= 26, V.words[B] = w, N = G;
}
return N !== 0 && (V.words[V.length++] = N), V;
}, n._prime = function(V) {
if (Y[V]) return Y[V];
var N;
if (V === "k256") N = new X();
else if (V === "p224") N = new H();
else if (V === "p192") N = new S();
else {
if (V !== "p25519") throw new Error("Unknown prime " + V);
N = new z();
}
return Y[V] = N, N;
}, v.prototype._verify1 = function(V) {
s(V.negative === 0, "red works only with positives"), s(V.red, "red works only with red numbers");
}, v.prototype._verify2 = function(V, N) {
s((V.negative | N.negative) == 0, "red works only with positives"), s(V.red && V.red === N.red, "red works only with red numbers");
}, v.prototype.imod = function(V) {
return this.prime ? this.prime.ireduce(V)._forceRed(this) : V.umod(this.m)._forceRed(this);
}, v.prototype.neg = function(V) {
return V.isZero() ? V.clone() : this.m.sub(V)._forceRed(this);
}, v.prototype.add = function(V, N) {
this._verify2(V, N);
var B = V.add(N);
return B.cmp(this.m) >= 0 && B.isub(this.m), B._forceRed(this);
}, v.prototype.iadd = function(V, N) {
this._verify2(V, N);
var B = V.iadd(N);
return B.cmp(this.m) >= 0 && B.isub(this.m), B;
}, v.prototype.sub = function(V, N) {
this._verify2(V, N);
var B = V.sub(N);
return B.cmpn(0) < 0 && B.iadd(this.m), B._forceRed(this);
}, v.prototype.isub = function(V, N) {
this._verify2(V, N);
var B = V.isub(N);
return B.cmpn(0) < 0 && B.iadd(this.m), B;
}, v.prototype.shl = function(V, N) {
return this._verify1(V), this.imod(V.ushln(N));
}, v.prototype.imul = function(V, N) {
return this._verify2(V, N), this.imod(V.imul(N));
}, v.prototype.mul = function(V, N) {
return this._verify2(V, N), this.imod(V.mul(N));
}, v.prototype.isqr = function(V) {
return this.imul(V, V.clone());
}, v.prototype.sqr = function(V) {
return this.mul(V, V);
}, v.prototype.sqrt = function(V) {
if (V.isZero()) return V.clone();
var N = this.m.andln(3);
if (s(N % 2 == 1), N === 3) {
var B = this.m.add(new n(1)).iushrn(2);
return this.pow(V, B);
}
for (var G = this.m.subn(1), w = 0; !G.isZero() && G.andln(1) === 0; ) w++, G.iushrn(1);
s(!G.isZero());
var W = new n(1).toRed(this), y = W.redNeg(), f = this.m.subn(1).iushrn(1), D = this.m.bitLength();
for (D = new n(2 * D * D).toRed(this); this.pow(D, f).cmp(y) !== 0; ) D.redIAdd(y);
for (var F = this.pow(D, G), T = this.pow(V, G.addn(1).iushrn(1)), Q = this.pow(V, G), P = w; Q.cmp(W) !== 0; ) {
for (var L = Q, E = 0; L.cmp(W) !== 0; E++) L = L.redSqr();
s(E < P);
var J = this.pow(F, new n(1).iushln(P - E - 1));
T = T.redMul(J), F = J.redSqr(), Q = Q.redMul(F), P = E;
}
return T;
}, v.prototype.invm = function(V) {
var N = V._invmp(this.m);
return N.negative !== 0 ? (N.negative = 0, this.imod(N).redNeg()) : this.imod(N);
}, v.prototype.pow = function(V, N) {
if (N.isZero()) return new n(1).toRed(this);
if (N.cmpn(1) === 0) return V.clone();
var B = new Array(16);
B[0] = new n(1).toRed(this), B[1] = V;
for (var G = 2; G < B.length; G++) B[G] = this.mul(B[G - 1], V);
var w = B[0], W = 0, y = 0, f = N.bitLength() % 26;
for (f === 0 && (f = 26), G = N.length - 1; G >= 0; G--) {
for (var D = N.words[G], F = f - 1; F >= 0; F--) {
var T = D >> F & 1;
w !== B[0] && (w = this.sqr(w)), T !== 0 || W !== 0 ? (W <<= 1, W |= T, (++y === 4 || G === 0 && F === 0) && (w = this.mul(w, B[W]), y = 0, W = 0)) : y = 0;
}
f = 26;
}
return w;
}, v.prototype.convertTo = function(V) {
var N = V.umod(this.m);
return N === V ? N.clone() : N;
}, v.prototype.convertFrom = function(V) {
var N = V.clone();
return N.red = null, N;
}, n.mont = function(V) {
return new K(V);
}, l(K, v), K.prototype.convertTo = function(V) {
return this.imod(V.ushln(this.shift));
}, K.prototype.convertFrom = function(V) {
var N = this.imod(V.mul(this.rinv));
return N.red = null, N;
}, K.prototype.imul = function(V, N) {
if (V.isZero() || N.isZero()) return V.words[0] = 0, V.length = 1, V;
var B = V.imul(N), G = B.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), w = B.isub(G).iushrn(this.shift), W = w;
return w.cmp(this.m) >= 0 ? W = w.isub(this.m) : w.cmpn(0) < 0 && (W = w.iadd(this.m)), W._forceRed(this);
}, K.prototype.mul = function(V, N) {
if (V.isZero() || N.isZero()) return new n(0)._forceRed(this);
var B = V.mul(N), G = B.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), w = B.isub(G).iushrn(this.shift), W = w;
return w.cmp(this.m) >= 0 ? W = w.isub(this.m) : w.cmpn(0) < 0 && (W = w.iadd(this.m)), W._forceRed(this);
}, K.prototype.invm = function(V) {
return this.imod(V._invmp(this.m).mul(this.r2))._forceRed(this);
};
})(C === void 0 || C);
}, { buffer: 188 }], 185: [function(g, C, i) {
i.byteLength = function(c) {
var r = d(c), h = r[0], b = r[1];
return 3 * (h + b) / 4 - b;
}, i.toByteArray = function(c) {
var r, h, b = d(c), u = b[0], m = b[1], Z = new s(function(R, X, H) {
return 3 * (X + H) / 4 - H;
}(0, u, m)), p = 0, Y = m > 0 ? u - 4 : u;
for (h = 0; h < Y; h += 4) r = A[c.charCodeAt(h)] << 18 | A[c.charCodeAt(h + 1)] << 12 | A[c.charCodeAt(h + 2)] << 6 | A[c.charCodeAt(h + 3)], Z[p++] = r >> 16 & 255, Z[p++] = r >> 8 & 255, Z[p++] = 255 & r;
return m === 2 && (r = A[c.charCodeAt(h)] << 2 | A[c.charCodeAt(h + 1)] >> 4, Z[p++] = 255 & r), m === 1 && (r = A[c.charCodeAt(h)] << 10 | A[c.charCodeAt(h + 1)] << 4 | A[c.charCodeAt(h + 2)] >> 2, Z[p++] = r >> 8 & 255, Z[p++] = 255 & r), Z;
}, i.fromByteArray = function(c) {
for (var r, h = c.length, b = h % 3, u = [], m = 0, Z = h - b; m < Z; m += 16383) u.push(o(c, m, m + 16383 > Z ? Z : m + 16383));
return b === 1 ? (r = c[h - 1], u.push(e[r >> 2] + e[r << 4 & 63] + "==")) : b === 2 && (r = (c[h - 2] << 8) + c[h - 1], u.push(e[r >> 10] + e[r >> 4 & 63] + e[r << 2 & 63] + "=")), u.join("");
};
for (var e = [], A = [], s = typeof Uint8Array < "u" ? Uint8Array : Array, l = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", n = 0, a = l.length; n < a; ++n) e[n] = l[n], A[l.charCodeAt(n)] = n;
function d(c) {
var r = c.length;
if (r % 4 > 0) throw new Error("Invalid string. Length must be a multiple of 4");
var h = c.indexOf("=");
return h === -1 && (h = r), [h, h === r ? 0 : 4 - h % 4];
}
function o(c, r, h) {
for (var b, u, m = [], Z = r; Z < h; Z += 3) b = (c[Z] << 16 & 16711680) + (c[Z + 1] << 8 & 65280) + (255 & c[Z + 2]), m.push(e[(u = b) >> 18 & 63] + e[u >> 12 & 63] + e[u >> 6 & 63] + e[63 & u]);
return m.join("");
}
A[45] = 62, A[95] = 63;
}, {}], 186: [function(g, C, i) {
(function(e, A) {
function s(B, G) {
if (!B) throw new Error(G || "Assertion failed");
}
function l(B, G) {
B.super_ = G;
var w = function() {
};
w.prototype = G.prototype, B.prototype = new w(), B.prototype.constructor = B;
}
function n(B, G, w) {
if (n.isBN(B)) return B;
this.negative = 0, this.words = null, this.length = 0, this.red = null, B !== null && (G !== "le" && G !== "be" || (w = G, G = 10), this._init(B || 0, G || 10, w || "be"));
}
var a;
typeof e == "object" ? e.exports = n : (void 0).BN = n, n.BN = n, n.wordSize = 26;
try {
a = typeof window < "u" && window.Buffer !== void 0 ? window.Buffer : g("buffer").Buffer;
} catch {
}
function d(B, G) {
var w = B.charCodeAt(G);
return w >= 48 && w <= 57 ? w - 48 : w >= 65 && w <= 70 ? w - 55 : w >= 97 && w <= 102 ? w - 87 : void s(!1, "Invalid character in " + B);
}
function o(B, G, w) {
var W = d(B, w);
return w - 1 >= G && (W |= d(B, w - 1) << 4), W;
}
function c(B, G, w, W) {
for (var y = 0, f = 0, D = Math.min(B.length, w), F = G; F < D; F++) {
var T = B.charCodeAt(F) - 48;
y *= W, f = T >= 49 ? T - 49 + 10 : T >= 17 ? T - 17 + 10 : T, s(T >= 0 && f < W, "Invalid character"), y += f;
}
return y;
}
function r(B, G) {
B.words = G.words, B.length = G.length, B.negative = G.negative, B.red = G.red;
}
if (n.isBN = function(B) {
return B instanceof n || B !== null && typeof B == "object" && B.constructor.wordSize === n.wordSize && Array.isArray(B.words);
}, n.max = function(B, G) {
return B.cmp(G) > 0 ? B : G;
}, n.min = function(B, G) {
return B.cmp(G) < 0 ? B : G;
}, n.prototype._init = function(B, G, w) {
if (typeof B == "number") return this._initNumber(B, G, w);
if (typeof B == "object") return this._initArray(B, G, w);
G === "hex" && (G = 16), s(G === (0 | G) && G >= 2 && G <= 36);
var W = 0;
(B = B.toString().replace(/\s+/g, ""))[0] === "-" && (W++, this.negative = 1), W < B.length && (G === 16 ? this._parseHex(B, W, w) : (this._parseBase(B, G, W), w === "le" && this._initArray(this.toArray(), G, w)));
}, n.prototype._initNumber = function(B, G, w) {
B < 0 && (this.negative = 1, B = -B), B < 67108864 ? (this.words = [67108863 & B], this.length = 1) : B < 4503599627370496 ? (this.words = [67108863 & B, B / 67108864 & 67108863], this.length = 2) : (s(B < 9007199254740992), this.words = [67108863 & B, B / 67108864 & 67108863, 1], this.length = 3), w === "le" && this._initArray(this.toArray(), G, w);
}, n.prototype._initArray = function(B, G, w) {
if (s(typeof B.length == "number"), B.length <= 0) return this.words = [0], this.length = 1, this;
this.length = Math.ceil(B.length / 3), this.words = new Array(this.length);
for (var W = 0; W < this.length; W++) this.words[W] = 0;
var y, f, D = 0;
if (w === "be") for (W = B.length - 1, y = 0; W >= 0; W -= 3) f = B[W] | B[W - 1] << 8 | B[W - 2] << 16, this.words[y] |= f << D & 67108863, this.words[y + 1] = f >>> 26 - D & 67108863, (D += 24) >= 26 && (D -= 26, y++);
else if (w === "le") for (W = 0, y = 0; W < B.length; W += 3) f = B[W] | B[W + 1] << 8 | B[W + 2] << 16, this.words[y] |= f << D & 67108863, this.words[y + 1] = f >>> 26 - D & 67108863, (D += 24) >= 26 && (D -= 26, y++);
return this._strip();
}, n.prototype._parseHex = function(B, G, w) {
this.length = Math.ceil((B.length - G) / 6), this.words = new Array(this.length);
for (var W = 0; W < this.length; W++) this.words[W] = 0;
var y, f = 0, D = 0;
if (w === "be") for (W = B.length - 1; W >= G; W -= 2) y = o(B, G, W) << f, this.words[D] |= 67108863 & y, f >= 18 ? (f -= 18, D += 1, this.words[D] |= y >>> 26) : f += 8;
else for (W = (B.length - G) % 2 == 0 ? G + 1 : G; W < B.length; W += 2) y = o(B, G, W) << f, this.words[D] |= 67108863 & y, f >= 18 ? (f -= 18, D += 1, this.words[D] |= y >>> 26) : f += 8;
this._strip();
}, n.prototype._parseBase = function(B, G, w) {
this.words = [0], this.length = 1;
for (var W = 0, y = 1; y <= 67108863; y *= G) W++;
W--, y = y / G | 0;
for (var f = B.length - w, D = f % W, F = Math.min(f, f - D) + w, T = 0, Q = w; Q < F; Q += W) T = c(B, Q, Q + W, G), this.imuln(y), this.words[0] + T < 67108864 ? this.words[0] += T : this._iaddn(T);
if (D !== 0) {
var P = 1;
for (T = c(B, Q, B.length, G), Q = 0; Q < D; Q++) P *= G;
this.imuln(P), this.words[0] + T < 67108864 ? this.words[0] += T : this._iaddn(T);
}
this._strip();
}, n.prototype.copy = function(B) {
B.words = new Array(this.length);
for (var G = 0; G < this.length; G++) B.words[G] = this.words[G];
B.length = this.length, B.negative = this.negative, B.red = this.red;
}, n.prototype._move = function(B) {
r(B, this);
}, n.prototype.clone = function() {
var B = new n(null);
return this.copy(B), B;
}, n.prototype._expand = function(B) {
for (; this.length < B; ) this.words[this.length++] = 0;
return this;
}, n.prototype._strip = function() {
for (; this.length > 1 && this.words[this.length - 1] === 0; ) this.length--;
return this._normSign();
}, n.prototype._normSign = function() {
return this.length === 1 && this.words[0] === 0 && (this.negative = 0), this;
}, typeof Symbol < "u" && typeof Symbol.for == "function") try {
n.prototype[Symbol.for("nodejs.util.inspect.custom")] = h;
} catch {
n.prototype.inspect = h;
}
else n.prototype.inspect = h;
function h() {
return (this.red ? "";
}
var b = ["", "0", "00", "000", "0000", "00000", "000000", "0000000", "00000000", "000000000", "0000000000", "00000000000", "000000000000", "0000000000000", "00000000000000", "000000000000000", "0000000000000000", "00000000000000000", "000000000000000000", "0000000000000000000", "00000000000000000000", "000000000000000000000", "0000000000000000000000", "00000000000000000000000", "000000000000000000000000", "0000000000000000000000000"], u = [0, 0, 25, 16, 12, 11, 10, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], m = [0, 0, 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, 43046721, 1e7, 19487171, 35831808, 62748517, 7529536, 11390625, 16777216, 24137569, 34012224, 47045881, 64e6, 4084101, 5153632, 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, 243e5, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176];
n.prototype.toString = function(B, G) {
var w;
if (G = 0 | G || 1, (B = B || 10) === 16 || B === "hex") {
w = "";
for (var W = 0, y = 0, f = 0; f < this.length; f++) {
var D = this.words[f], F = (16777215 & (D << W | y)).toString(16);
y = D >>> 24 - W & 16777215, (W += 2) >= 26 && (W -= 26, f--), w = y !== 0 || f !== this.length - 1 ? b[6 - F.length] + F + w : F + w;
}
for (y !== 0 && (w = y.toString(16) + w); w.length % G != 0; ) w = "0" + w;
return this.negative !== 0 && (w = "-" + w), w;
}
if (B === (0 | B) && B >= 2 && B <= 36) {
var T = u[B], Q = m[B];
w = "";
var P = this.clone();
for (P.negative = 0; !P.isZero(); ) {
var L = P.modrn(Q).toString(B);
w = (P = P.idivn(Q)).isZero() ? L + w : b[T - L.length] + L + w;
}
for (this.isZero() && (w = "0" + w); w.length % G != 0; ) w = "0" + w;
return this.negative !== 0 && (w = "-" + w), w;
}
s(!1, "Base should be between 2 and 36");
}, n.prototype.toNumber = function() {
var B = this.words[0];
return this.length === 2 ? B += 67108864 * this.words[1] : this.length === 3 && this.words[2] === 1 ? B += 4503599627370496 + 67108864 * this.words[1] : this.length > 2 && s(!1, "Number can only safely store up to 53 bits"), this.negative !== 0 ? -B : B;
}, n.prototype.toJSON = function() {
return this.toString(16, 2);
}, a && (n.prototype.toBuffer = function(B, G) {
return this.toArrayLike(a, B, G);
}), n.prototype.toArray = function(B, G) {
return this.toArrayLike(Array, B, G);
};
function Z(B, G, w) {
w.negative = G.negative ^ B.negative;
var W = B.length + G.length | 0;
w.length = W, W = W - 1 | 0;
var y = 0 | B.words[0], f = 0 | G.words[0], D = y * f, F = 67108863 & D, T = D / 67108864 | 0;
w.words[0] = F;
for (var Q = 1; Q < W; Q++) {
for (var P = T >>> 26, L = 67108863 & T, E = Math.min(Q, G.length - 1), J = Math.max(0, Q - B.length + 1); J <= E; J++) {
var k = Q - J | 0;
P += (D = (y = 0 | B.words[k]) * (f = 0 | G.words[J]) + L) / 67108864 | 0, L = 67108863 & D;
}
w.words[Q] = 0 | L, T = 0 | P;
}
return T !== 0 ? w.words[Q] = 0 | T : w.length--, w._strip();
}
n.prototype.toArrayLike = function(B, G, w) {
this._strip();
var W = this.byteLength(), y = w || Math.max(1, W);
s(W <= y, "byte array longer than desired length"), s(y > 0, "Requested array length <= 0");
var f = function(D, F) {
return D.allocUnsafe ? D.allocUnsafe(F) : new D(F);
}(B, y);
return this["_toArrayLike" + (G === "le" ? "LE" : "BE")](f, W), f;
}, n.prototype._toArrayLikeLE = function(B, G) {
for (var w = 0, W = 0, y = 0, f = 0; y < this.length; y++) {
var D = this.words[y] << f | W;
B[w++] = 255 & D, w < B.length && (B[w++] = D >> 8 & 255), w < B.length && (B[w++] = D >> 16 & 255), f === 6 ? (w < B.length && (B[w++] = D >> 24 & 255), W = 0, f = 0) : (W = D >>> 24, f += 2);
}
if (w < B.length) for (B[w++] = W; w < B.length; ) B[w++] = 0;
}, n.prototype._toArrayLikeBE = function(B, G) {
for (var w = B.length - 1, W = 0, y = 0, f = 0; y < this.length; y++) {
var D = this.words[y] << f | W;
B[w--] = 255 & D, w >= 0 && (B[w--] = D >> 8 & 255), w >= 0 && (B[w--] = D >> 16 & 255), f === 6 ? (w >= 0 && (B[w--] = D >> 24 & 255), W = 0, f = 0) : (W = D >>> 24, f += 2);
}
if (w >= 0) for (B[w--] = W; w >= 0; ) B[w--] = 0;
}, Math.clz32 ? n.prototype._countBits = function(B) {
return 32 - Math.clz32(B);
} : n.prototype._countBits = function(B) {
var G = B, w = 0;
return G >= 4096 && (w += 13, G >>>= 13), G >= 64 && (w += 7, G >>>= 7), G >= 8 && (w += 4, G >>>= 4), G >= 2 && (w += 2, G >>>= 2), w + G;
}, n.prototype._zeroBits = function(B) {
if (B === 0) return 26;
var G = B, w = 0;
return (8191 & G) == 0 && (w += 13, G >>>= 13), (127 & G) == 0 && (w += 7, G >>>= 7), (15 & G) == 0 && (w += 4, G >>>= 4), (3 & G) == 0 && (w += 2, G >>>= 2), (1 & G) == 0 && w++, w;
}, n.prototype.bitLength = function() {
var B = this.words[this.length - 1], G = this._countBits(B);
return 26 * (this.length - 1) + G;
}, n.prototype.zeroBits = function() {
if (this.isZero()) return 0;
for (var B = 0, G = 0; G < this.length; G++) {
var w = this._zeroBits(this.words[G]);
if (B += w, w !== 26) break;
}
return B;
}, n.prototype.byteLength = function() {
return Math.ceil(this.bitLength() / 8);
}, n.prototype.toTwos = function(B) {
return this.negative !== 0 ? this.abs().inotn(B).iaddn(1) : this.clone();
}, n.prototype.fromTwos = function(B) {
return this.testn(B - 1) ? this.notn(B).iaddn(1).ineg() : this.clone();
}, n.prototype.isNeg = function() {
return this.negative !== 0;
}, n.prototype.neg = function() {
return this.clone().ineg();
}, n.prototype.ineg = function() {
return this.isZero() || (this.negative ^= 1), this;
}, n.prototype.iuor = function(B) {
for (; this.length < B.length; ) this.words[this.length++] = 0;
for (var G = 0; G < B.length; G++) this.words[G] = this.words[G] | B.words[G];
return this._strip();
}, n.prototype.ior = function(B) {
return s((this.negative | B.negative) == 0), this.iuor(B);
}, n.prototype.or = function(B) {
return this.length > B.length ? this.clone().ior(B) : B.clone().ior(this);
}, n.prototype.uor = function(B) {
return this.length > B.length ? this.clone().iuor(B) : B.clone().iuor(this);
}, n.prototype.iuand = function(B) {
var G;
G = this.length > B.length ? B : this;
for (var w = 0; w < G.length; w++) this.words[w] = this.words[w] & B.words[w];
return this.length = G.length, this._strip();
}, n.prototype.iand = function(B) {
return s((this.negative | B.negative) == 0), this.iuand(B);
}, n.prototype.and = function(B) {
return this.length > B.length ? this.clone().iand(B) : B.clone().iand(this);
}, n.prototype.uand = function(B) {
return this.length > B.length ? this.clone().iuand(B) : B.clone().iuand(this);
}, n.prototype.iuxor = function(B) {
var G, w;
this.length > B.length ? (G = this, w = B) : (G = B, w = this);
for (var W = 0; W < w.length; W++) this.words[W] = G.words[W] ^ w.words[W];
if (this !== G) for (; W < G.length; W++) this.words[W] = G.words[W];
return this.length = G.length, this._strip();
}, n.prototype.ixor = function(B) {
return s((this.negative | B.negative) == 0), this.iuxor(B);
}, n.prototype.xor = function(B) {
return this.length > B.length ? this.clone().ixor(B) : B.clone().ixor(this);
}, n.prototype.uxor = function(B) {
return this.length > B.length ? this.clone().iuxor(B) : B.clone().iuxor(this);
}, n.prototype.inotn = function(B) {
s(typeof B == "number" && B >= 0);
var G = 0 | Math.ceil(B / 26), w = B % 26;
this._expand(G), w > 0 && G--;
for (var W = 0; W < G; W++) this.words[W] = 67108863 & ~this.words[W];
return w > 0 && (this.words[W] = ~this.words[W] & 67108863 >> 26 - w), this._strip();
}, n.prototype.notn = function(B) {
return this.clone().inotn(B);
}, n.prototype.setn = function(B, G) {
s(typeof B == "number" && B >= 0);
var w = B / 26 | 0, W = B % 26;
return this._expand(w + 1), this.words[w] = G ? this.words[w] | 1 << W : this.words[w] & ~(1 << W), this._strip();
}, n.prototype.iadd = function(B) {
var G, w, W;
if (this.negative !== 0 && B.negative === 0) return this.negative = 0, G = this.isub(B), this.negative ^= 1, this._normSign();
if (this.negative === 0 && B.negative !== 0) return B.negative = 0, G = this.isub(B), B.negative = 1, G._normSign();
this.length > B.length ? (w = this, W = B) : (w = B, W = this);
for (var y = 0, f = 0; f < W.length; f++) G = (0 | w.words[f]) + (0 | W.words[f]) + y, this.words[f] = 67108863 & G, y = G >>> 26;
for (; y !== 0 && f < w.length; f++) G = (0 | w.words[f]) + y, this.words[f] = 67108863 & G, y = G >>> 26;
if (this.length = w.length, y !== 0) this.words[this.length] = y, this.length++;
else if (w !== this) for (; f < w.length; f++) this.words[f] = w.words[f];
return this;
}, n.prototype.add = function(B) {
var G;
return B.negative !== 0 && this.negative === 0 ? (B.negative = 0, G = this.sub(B), B.negative ^= 1, G) : B.negative === 0 && this.negative !== 0 ? (this.negative = 0, G = B.sub(this), this.negative = 1, G) : this.length > B.length ? this.clone().iadd(B) : B.clone().iadd(this);
}, n.prototype.isub = function(B) {
if (B.negative !== 0) {
B.negative = 0;
var G = this.iadd(B);
return B.negative = 1, G._normSign();
}
if (this.negative !== 0) return this.negative = 0, this.iadd(B), this.negative = 1, this._normSign();
var w, W, y = this.cmp(B);
if (y === 0) return this.negative = 0, this.length = 1, this.words[0] = 0, this;
y > 0 ? (w = this, W = B) : (w = B, W = this);
for (var f = 0, D = 0; D < W.length; D++) f = (G = (0 | w.words[D]) - (0 | W.words[D]) + f) >> 26, this.words[D] = 67108863 & G;
for (; f !== 0 && D < w.length; D++) f = (G = (0 | w.words[D]) + f) >> 26, this.words[D] = 67108863 & G;
if (f === 0 && D < w.length && w !== this) for (; D < w.length; D++) this.words[D] = w.words[D];
return this.length = Math.max(this.length, D), w !== this && (this.negative = 1), this._strip();
}, n.prototype.sub = function(B) {
return this.clone().isub(B);
};
var p = function(B, G, w) {
var W, y, f, D = B.words, F = G.words, T = w.words, Q = 0, P = 0 | D[0], L = 8191 & P, E = P >>> 13, J = 0 | D[1], k = 8191 & J, j = J >>> 13, q = 0 | D[2], Cg = 8191 & q, Ig = q >>> 13, x = 0 | D[3], Ag = 8191 & x, eg = x >>> 13, O = 0 | D[4], _ = 8191 & O, gg = O >>> 13, lg = 0 | D[5], ng = 8191 & lg, sg = lg >>> 13, og = 0 | D[6], cg = 8191 & og, rg = og >>> 13, dg = 0 | D[7], Bg = 8191 & dg, Zg = dg >>> 13, Xg = 0 | D[8], Kg = 8191 & Xg, kg = Xg >>> 13, Wg = 0 | D[9], Ng = 8191 & Wg, wg = Wg >>> 13, fg = 0 | F[0], Jg = 8191 & fg, zg = fg >>> 13, cI = 0 | F[1], YI = 8191 & cI, Eg = cI >>> 13, aI = 0 | F[2], dI = 8191 & aI, _g = aI >>> 13, xI = 0 | F[3], SI = 8191 & xI, eI = xI >>> 13, NI = 0 | F[4], EI = 8191 & NI, oI = NI >>> 13, LI = 0 | F[5], pg = 8191 & LI, uI = LI >>> 13, hg = 0 | F[6], bg = 8191 & hg, Rg = hg >>> 13, Tg = 0 | F[7], rI = 8191 & Tg, jg = Tg >>> 13, GI = 0 | F[8], nI = 8191 & GI, CI = GI >>> 13, WI = 0 | F[9], mI = 8191 & WI, VI = WI >>> 13;
w.negative = B.negative ^ G.negative, w.length = 19;
var yC = (Q + (W = Math.imul(L, Jg)) | 0) + ((8191 & (y = (y = Math.imul(L, zg)) + Math.imul(E, Jg) | 0)) << 13) | 0;
Q = ((f = Math.imul(E, zg)) + (y >>> 13) | 0) + (yC >>> 26) | 0, yC &= 67108863, W = Math.imul(k, Jg), y = (y = Math.imul(k, zg)) + Math.imul(j, Jg) | 0, f = Math.imul(j, zg);
var gC = (Q + (W = W + Math.imul(L, YI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, Eg) | 0) + Math.imul(E, YI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(E, Eg) | 0) + (y >>> 13) | 0) + (gC >>> 26) | 0, gC &= 67108863, W = Math.imul(Cg, Jg), y = (y = Math.imul(Cg, zg)) + Math.imul(Ig, Jg) | 0, f = Math.imul(Ig, zg), W = W + Math.imul(k, YI) | 0, y = (y = y + Math.imul(k, Eg) | 0) + Math.imul(j, YI) | 0, f = f + Math.imul(j, Eg) | 0;
var It = (Q + (W = W + Math.imul(L, dI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, _g) | 0) + Math.imul(E, dI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(E, _g) | 0) + (y >>> 13) | 0) + (It >>> 26) | 0, It &= 67108863, W = Math.imul(Ag, Jg), y = (y = Math.imul(Ag, zg)) + Math.imul(eg, Jg) | 0, f = Math.imul(eg, zg), W = W + Math.imul(Cg, YI) | 0, y = (y = y + Math.imul(Cg, Eg) | 0) + Math.imul(Ig, YI) | 0, f = f + Math.imul(Ig, Eg) | 0, W = W + Math.imul(k, dI) | 0, y = (y = y + Math.imul(k, _g) | 0) + Math.imul(j, dI) | 0, f = f + Math.imul(j, _g) | 0;
var dC = (Q + (W = W + Math.imul(L, SI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, eI) | 0) + Math.imul(E, SI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(E, eI) | 0) + (y >>> 13) | 0) + (dC >>> 26) | 0, dC &= 67108863, W = Math.imul(_, Jg), y = (y = Math.imul(_, zg)) + Math.imul(gg, Jg) | 0, f = Math.imul(gg, zg), W = W + Math.imul(Ag, YI) | 0, y = (y = y + Math.imul(Ag, Eg) | 0) + Math.imul(eg, YI) | 0, f = f + Math.imul(eg, Eg) | 0, W = W + Math.imul(Cg, dI) | 0, y = (y = y + Math.imul(Cg, _g) | 0) + Math.imul(Ig, dI) | 0, f = f + Math.imul(Ig, _g) | 0, W = W + Math.imul(k, SI) | 0, y = (y = y + Math.imul(k, eI) | 0) + Math.imul(j, SI) | 0, f = f + Math.imul(j, eI) | 0;
var Tt = (Q + (W = W + Math.imul(L, EI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, oI) | 0) + Math.imul(E, EI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(E, oI) | 0) + (y >>> 13) | 0) + (Tt >>> 26) | 0, Tt &= 67108863, W = Math.imul(ng, Jg), y = (y = Math.imul(ng, zg)) + Math.imul(sg, Jg) | 0, f = Math.imul(sg, zg), W = W + Math.imul(_, YI) | 0, y = (y = y + Math.imul(_, Eg) | 0) + Math.imul(gg, YI) | 0, f = f + Math.imul(gg, Eg) | 0, W = W + Math.imul(Ag, dI) | 0, y = (y = y + Math.imul(Ag, _g) | 0) + Math.imul(eg, dI) | 0, f = f + Math.imul(eg, _g) | 0, W = W + Math.imul(Cg, SI) | 0, y = (y = y + Math.imul(Cg, eI) | 0) + Math.imul(Ig, SI) | 0, f = f + Math.imul(Ig, eI) | 0, W = W + Math.imul(k, EI) | 0, y = (y = y + Math.imul(k, oI) | 0) + Math.imul(j, EI) | 0, f = f + Math.imul(j, oI) | 0;
var ag = (Q + (W = W + Math.imul(L, pg) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, uI) | 0) + Math.imul(E, pg) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(E, uI) | 0) + (y >>> 13) | 0) + (ag >>> 26) | 0, ag &= 67108863, W = Math.imul(cg, Jg), y = (y = Math.imul(cg, zg)) + Math.imul(rg, Jg) | 0, f = Math.imul(rg, zg), W = W + Math.imul(ng, YI) | 0, y = (y = y + Math.imul(ng, Eg) | 0) + Math.imul(sg, YI) | 0, f = f + Math.imul(sg, Eg) | 0, W = W + Math.imul(_, dI) | 0, y = (y = y + Math.imul(_, _g) | 0) + Math.imul(gg, dI) | 0, f = f + Math.imul(gg, _g) | 0, W = W + Math.imul(Ag, SI) | 0, y = (y = y + Math.imul(Ag, eI) | 0) + Math.imul(eg, SI) | 0, f = f + Math.imul(eg, eI) | 0, W = W + Math.imul(Cg, EI) | 0, y = (y = y + Math.imul(Cg, oI) | 0) + Math.imul(Ig, EI) | 0, f = f + Math.imul(Ig, oI) | 0, W = W + Math.imul(k, pg) | 0, y = (y = y + Math.imul(k, uI) | 0) + Math.imul(j, pg) | 0, f = f + Math.imul(j, uI) | 0;
var mg = (Q + (W = W + Math.imul(L, bg) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, Rg) | 0) + Math.imul(E, bg) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(E, Rg) | 0) + (y >>> 13) | 0) + (mg >>> 26) | 0, mg &= 67108863, W = Math.imul(Bg, Jg), y = (y = Math.imul(Bg, zg)) + Math.imul(Zg, Jg) | 0, f = Math.imul(Zg, zg), W = W + Math.imul(cg, YI) | 0, y = (y = y + Math.imul(cg, Eg) | 0) + Math.imul(rg, YI) | 0, f = f + Math.imul(rg, Eg) | 0, W = W + Math.imul(ng, dI) | 0, y = (y = y + Math.imul(ng, _g) | 0) + Math.imul(sg, dI) | 0, f = f + Math.imul(sg, _g) | 0, W = W + Math.imul(_, SI) | 0, y = (y = y + Math.imul(_, eI) | 0) + Math.imul(gg, SI) | 0, f = f + Math.imul(gg, eI) | 0, W = W + Math.imul(Ag, EI) | 0, y = (y = y + Math.imul(Ag, oI) | 0) + Math.imul(eg, EI) | 0, f = f + Math.imul(eg, oI) | 0, W = W + Math.imul(Cg, pg) | 0, y = (y = y + Math.imul(Cg, uI) | 0) + Math.imul(Ig, pg) | 0, f = f + Math.imul(Ig, uI) | 0, W = W + Math.imul(k, bg) | 0, y = (y = y + Math.imul(k, Rg) | 0) + Math.imul(j, bg) | 0, f = f + Math.imul(j, Rg) | 0;
var Sg = (Q + (W = W + Math.imul(L, rI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, jg) | 0) + Math.imul(E, rI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(E, jg) | 0) + (y >>> 13) | 0) + (Sg >>> 26) | 0, Sg &= 67108863, W = Math.imul(Kg, Jg), y = (y = Math.imul(Kg, zg)) + Math.imul(kg, Jg) | 0, f = Math.imul(kg, zg), W = W + Math.imul(Bg, YI) | 0, y = (y = y + Math.imul(Bg, Eg) | 0) + Math.imul(Zg, YI) | 0, f = f + Math.imul(Zg, Eg) | 0, W = W + Math.imul(cg, dI) | 0, y = (y = y + Math.imul(cg, _g) | 0) + Math.imul(rg, dI) | 0, f = f + Math.imul(rg, _g) | 0, W = W + Math.imul(ng, SI) | 0, y = (y = y + Math.imul(ng, eI) | 0) + Math.imul(sg, SI) | 0, f = f + Math.imul(sg, eI) | 0, W = W + Math.imul(_, EI) | 0, y = (y = y + Math.imul(_, oI) | 0) + Math.imul(gg, EI) | 0, f = f + Math.imul(gg, oI) | 0, W = W + Math.imul(Ag, pg) | 0, y = (y = y + Math.imul(Ag, uI) | 0) + Math.imul(eg, pg) | 0, f = f + Math.imul(eg, uI) | 0, W = W + Math.imul(Cg, bg) | 0, y = (y = y + Math.imul(Cg, Rg) | 0) + Math.imul(Ig, bg) | 0, f = f + Math.imul(Ig, Rg) | 0, W = W + Math.imul(k, rI) | 0, y = (y = y + Math.imul(k, jg) | 0) + Math.imul(j, rI) | 0, f = f + Math.imul(j, jg) | 0;
var Fg = (Q + (W = W + Math.imul(L, nI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, CI) | 0) + Math.imul(E, nI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(E, CI) | 0) + (y >>> 13) | 0) + (Fg >>> 26) | 0, Fg &= 67108863, W = Math.imul(Ng, Jg), y = (y = Math.imul(Ng, zg)) + Math.imul(wg, Jg) | 0, f = Math.imul(wg, zg), W = W + Math.imul(Kg, YI) | 0, y = (y = y + Math.imul(Kg, Eg) | 0) + Math.imul(kg, YI) | 0, f = f + Math.imul(kg, Eg) | 0, W = W + Math.imul(Bg, dI) | 0, y = (y = y + Math.imul(Bg, _g) | 0) + Math.imul(Zg, dI) | 0, f = f + Math.imul(Zg, _g) | 0, W = W + Math.imul(cg, SI) | 0, y = (y = y + Math.imul(cg, eI) | 0) + Math.imul(rg, SI) | 0, f = f + Math.imul(rg, eI) | 0, W = W + Math.imul(ng, EI) | 0, y = (y = y + Math.imul(ng, oI) | 0) + Math.imul(sg, EI) | 0, f = f + Math.imul(sg, oI) | 0, W = W + Math.imul(_, pg) | 0, y = (y = y + Math.imul(_, uI) | 0) + Math.imul(gg, pg) | 0, f = f + Math.imul(gg, uI) | 0, W = W + Math.imul(Ag, bg) | 0, y = (y = y + Math.imul(Ag, Rg) | 0) + Math.imul(eg, bg) | 0, f = f + Math.imul(eg, Rg) | 0, W = W + Math.imul(Cg, rI) | 0, y = (y = y + Math.imul(Cg, jg) | 0) + Math.imul(Ig, rI) | 0, f = f + Math.imul(Ig, jg) | 0, W = W + Math.imul(k, nI) | 0, y = (y = y + Math.imul(k, CI) | 0) + Math.imul(j, nI) | 0, f = f + Math.imul(j, CI) | 0;
var tI = (Q + (W = W + Math.imul(L, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(L, VI) | 0) + Math.imul(E, mI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(E, VI) | 0) + (y >>> 13) | 0) + (tI >>> 26) | 0, tI &= 67108863, W = Math.imul(Ng, YI), y = (y = Math.imul(Ng, Eg)) + Math.imul(wg, YI) | 0, f = Math.imul(wg, Eg), W = W + Math.imul(Kg, dI) | 0, y = (y = y + Math.imul(Kg, _g) | 0) + Math.imul(kg, dI) | 0, f = f + Math.imul(kg, _g) | 0, W = W + Math.imul(Bg, SI) | 0, y = (y = y + Math.imul(Bg, eI) | 0) + Math.imul(Zg, SI) | 0, f = f + Math.imul(Zg, eI) | 0, W = W + Math.imul(cg, EI) | 0, y = (y = y + Math.imul(cg, oI) | 0) + Math.imul(rg, EI) | 0, f = f + Math.imul(rg, oI) | 0, W = W + Math.imul(ng, pg) | 0, y = (y = y + Math.imul(ng, uI) | 0) + Math.imul(sg, pg) | 0, f = f + Math.imul(sg, uI) | 0, W = W + Math.imul(_, bg) | 0, y = (y = y + Math.imul(_, Rg) | 0) + Math.imul(gg, bg) | 0, f = f + Math.imul(gg, Rg) | 0, W = W + Math.imul(Ag, rI) | 0, y = (y = y + Math.imul(Ag, jg) | 0) + Math.imul(eg, rI) | 0, f = f + Math.imul(eg, jg) | 0, W = W + Math.imul(Cg, nI) | 0, y = (y = y + Math.imul(Cg, CI) | 0) + Math.imul(Ig, nI) | 0, f = f + Math.imul(Ig, CI) | 0;
var vg = (Q + (W = W + Math.imul(k, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(k, VI) | 0) + Math.imul(j, mI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(j, VI) | 0) + (y >>> 13) | 0) + (vg >>> 26) | 0, vg &= 67108863, W = Math.imul(Ng, dI), y = (y = Math.imul(Ng, _g)) + Math.imul(wg, dI) | 0, f = Math.imul(wg, _g), W = W + Math.imul(Kg, SI) | 0, y = (y = y + Math.imul(Kg, eI) | 0) + Math.imul(kg, SI) | 0, f = f + Math.imul(kg, eI) | 0, W = W + Math.imul(Bg, EI) | 0, y = (y = y + Math.imul(Bg, oI) | 0) + Math.imul(Zg, EI) | 0, f = f + Math.imul(Zg, oI) | 0, W = W + Math.imul(cg, pg) | 0, y = (y = y + Math.imul(cg, uI) | 0) + Math.imul(rg, pg) | 0, f = f + Math.imul(rg, uI) | 0, W = W + Math.imul(ng, bg) | 0, y = (y = y + Math.imul(ng, Rg) | 0) + Math.imul(sg, bg) | 0, f = f + Math.imul(sg, Rg) | 0, W = W + Math.imul(_, rI) | 0, y = (y = y + Math.imul(_, jg) | 0) + Math.imul(gg, rI) | 0, f = f + Math.imul(gg, jg) | 0, W = W + Math.imul(Ag, nI) | 0, y = (y = y + Math.imul(Ag, CI) | 0) + Math.imul(eg, nI) | 0, f = f + Math.imul(eg, CI) | 0;
var xg = (Q + (W = W + Math.imul(Cg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Cg, VI) | 0) + Math.imul(Ig, mI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(Ig, VI) | 0) + (y >>> 13) | 0) + (xg >>> 26) | 0, xg &= 67108863, W = Math.imul(Ng, SI), y = (y = Math.imul(Ng, eI)) + Math.imul(wg, SI) | 0, f = Math.imul(wg, eI), W = W + Math.imul(Kg, EI) | 0, y = (y = y + Math.imul(Kg, oI) | 0) + Math.imul(kg, EI) | 0, f = f + Math.imul(kg, oI) | 0, W = W + Math.imul(Bg, pg) | 0, y = (y = y + Math.imul(Bg, uI) | 0) + Math.imul(Zg, pg) | 0, f = f + Math.imul(Zg, uI) | 0, W = W + Math.imul(cg, bg) | 0, y = (y = y + Math.imul(cg, Rg) | 0) + Math.imul(rg, bg) | 0, f = f + Math.imul(rg, Rg) | 0, W = W + Math.imul(ng, rI) | 0, y = (y = y + Math.imul(ng, jg) | 0) + Math.imul(sg, rI) | 0, f = f + Math.imul(sg, jg) | 0, W = W + Math.imul(_, nI) | 0, y = (y = y + Math.imul(_, CI) | 0) + Math.imul(gg, nI) | 0, f = f + Math.imul(gg, CI) | 0;
var vI = (Q + (W = W + Math.imul(Ag, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Ag, VI) | 0) + Math.imul(eg, mI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(eg, VI) | 0) + (y >>> 13) | 0) + (vI >>> 26) | 0, vI &= 67108863, W = Math.imul(Ng, EI), y = (y = Math.imul(Ng, oI)) + Math.imul(wg, EI) | 0, f = Math.imul(wg, oI), W = W + Math.imul(Kg, pg) | 0, y = (y = y + Math.imul(Kg, uI) | 0) + Math.imul(kg, pg) | 0, f = f + Math.imul(kg, uI) | 0, W = W + Math.imul(Bg, bg) | 0, y = (y = y + Math.imul(Bg, Rg) | 0) + Math.imul(Zg, bg) | 0, f = f + Math.imul(Zg, Rg) | 0, W = W + Math.imul(cg, rI) | 0, y = (y = y + Math.imul(cg, jg) | 0) + Math.imul(rg, rI) | 0, f = f + Math.imul(rg, jg) | 0, W = W + Math.imul(ng, nI) | 0, y = (y = y + Math.imul(ng, CI) | 0) + Math.imul(sg, nI) | 0, f = f + Math.imul(sg, CI) | 0;
var fI = (Q + (W = W + Math.imul(_, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(_, VI) | 0) + Math.imul(gg, mI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(gg, VI) | 0) + (y >>> 13) | 0) + (fI >>> 26) | 0, fI &= 67108863, W = Math.imul(Ng, pg), y = (y = Math.imul(Ng, uI)) + Math.imul(wg, pg) | 0, f = Math.imul(wg, uI), W = W + Math.imul(Kg, bg) | 0, y = (y = y + Math.imul(Kg, Rg) | 0) + Math.imul(kg, bg) | 0, f = f + Math.imul(kg, Rg) | 0, W = W + Math.imul(Bg, rI) | 0, y = (y = y + Math.imul(Bg, jg) | 0) + Math.imul(Zg, rI) | 0, f = f + Math.imul(Zg, jg) | 0, W = W + Math.imul(cg, nI) | 0, y = (y = y + Math.imul(cg, CI) | 0) + Math.imul(rg, nI) | 0, f = f + Math.imul(rg, CI) | 0;
var MI = (Q + (W = W + Math.imul(ng, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(ng, VI) | 0) + Math.imul(sg, mI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(sg, VI) | 0) + (y >>> 13) | 0) + (MI >>> 26) | 0, MI &= 67108863, W = Math.imul(Ng, bg), y = (y = Math.imul(Ng, Rg)) + Math.imul(wg, bg) | 0, f = Math.imul(wg, Rg), W = W + Math.imul(Kg, rI) | 0, y = (y = y + Math.imul(Kg, jg) | 0) + Math.imul(kg, rI) | 0, f = f + Math.imul(kg, jg) | 0, W = W + Math.imul(Bg, nI) | 0, y = (y = y + Math.imul(Bg, CI) | 0) + Math.imul(Zg, nI) | 0, f = f + Math.imul(Zg, CI) | 0;
var hI = (Q + (W = W + Math.imul(cg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(cg, VI) | 0) + Math.imul(rg, mI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(rg, VI) | 0) + (y >>> 13) | 0) + (hI >>> 26) | 0, hI &= 67108863, W = Math.imul(Ng, rI), y = (y = Math.imul(Ng, jg)) + Math.imul(wg, rI) | 0, f = Math.imul(wg, jg), W = W + Math.imul(Kg, nI) | 0, y = (y = y + Math.imul(Kg, CI) | 0) + Math.imul(kg, nI) | 0, f = f + Math.imul(kg, CI) | 0;
var AC = (Q + (W = W + Math.imul(Bg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Bg, VI) | 0) + Math.imul(Zg, mI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(Zg, VI) | 0) + (y >>> 13) | 0) + (AC >>> 26) | 0, AC &= 67108863, W = Math.imul(Ng, nI), y = (y = Math.imul(Ng, CI)) + Math.imul(wg, nI) | 0, f = Math.imul(wg, CI);
var PI = (Q + (W = W + Math.imul(Kg, mI) | 0) | 0) + ((8191 & (y = (y = y + Math.imul(Kg, VI) | 0) + Math.imul(kg, mI) | 0)) << 13) | 0;
Q = ((f = f + Math.imul(kg, VI) | 0) + (y >>> 13) | 0) + (PI >>> 26) | 0, PI &= 67108863;
var jI = (Q + (W = Math.imul(Ng, mI)) | 0) + ((8191 & (y = (y = Math.imul(Ng, VI)) + Math.imul(wg, mI) | 0)) << 13) | 0;
return Q = ((f = Math.imul(wg, VI)) + (y >>> 13) | 0) + (jI >>> 26) | 0, jI &= 67108863, T[0] = yC, T[1] = gC, T[2] = It, T[3] = dC, T[4] = Tt, T[5] = ag, T[6] = mg, T[7] = Sg, T[8] = Fg, T[9] = tI, T[10] = vg, T[11] = xg, T[12] = vI, T[13] = fI, T[14] = MI, T[15] = hI, T[16] = AC, T[17] = PI, T[18] = jI, Q !== 0 && (T[19] = Q, w.length++), w;
};
function Y(B, G, w) {
w.negative = G.negative ^ B.negative, w.length = B.length + G.length;
for (var W = 0, y = 0, f = 0; f < w.length - 1; f++) {
var D = y;
y = 0;
for (var F = 67108863 & W, T = Math.min(f, G.length - 1), Q = Math.max(0, f - B.length + 1); Q <= T; Q++) {
var P = f - Q, L = (0 | B.words[P]) * (0 | G.words[Q]), E = 67108863 & L;
F = 67108863 & (E = E + F | 0), y += (D = (D = D + (L / 67108864 | 0) | 0) + (E >>> 26) | 0) >>> 26, D &= 67108863;
}
w.words[f] = F, W = D, D = y;
}
return W !== 0 ? w.words[f] = W : w.length--, w._strip();
}
function R(B, G, w) {
return Y(B, G, w);
}
Math.imul || (p = Z), n.prototype.mulTo = function(B, G) {
var w = this.length + B.length;
return this.length === 10 && B.length === 10 ? p(this, B, G) : w < 63 ? Z(this, B, G) : w < 1024 ? Y(this, B, G) : R(this, B, G);
}, n.prototype.mul = function(B) {
var G = new n(null);
return G.words = new Array(this.length + B.length), this.mulTo(B, G);
}, n.prototype.mulf = function(B) {
var G = new n(null);
return G.words = new Array(this.length + B.length), R(this, B, G);
}, n.prototype.imul = function(B) {
return this.clone().mulTo(B, this);
}, n.prototype.imuln = function(B) {
var G = B < 0;
G && (B = -B), s(typeof B == "number"), s(B < 67108864);
for (var w = 0, W = 0; W < this.length; W++) {
var y = (0 | this.words[W]) * B, f = (67108863 & y) + (67108863 & w);
w >>= 26, w += y / 67108864 | 0, w += f >>> 26, this.words[W] = 67108863 & f;
}
return w !== 0 && (this.words[W] = w, this.length++), G ? this.ineg() : this;
}, n.prototype.muln = function(B) {
return this.clone().imuln(B);
}, n.prototype.sqr = function() {
return this.mul(this);
}, n.prototype.isqr = function() {
return this.imul(this.clone());
}, n.prototype.pow = function(B) {
var G = function(f) {
for (var D = new Array(f.bitLength()), F = 0; F < D.length; F++) {
var T = F / 26 | 0, Q = F % 26;
D[F] = f.words[T] >>> Q & 1;
}
return D;
}(B);
if (G.length === 0) return new n(1);
for (var w = this, W = 0; W < G.length && G[W] === 0; W++, w = w.sqr()) ;
if (++W < G.length) for (var y = w.sqr(); W < G.length; W++, y = y.sqr()) G[W] !== 0 && (w = w.mul(y));
return w;
}, n.prototype.iushln = function(B) {
s(typeof B == "number" && B >= 0);
var G, w = B % 26, W = (B - w) / 26, y = 67108863 >>> 26 - w << 26 - w;
if (w !== 0) {
var f = 0;
for (G = 0; G < this.length; G++) {
var D = this.words[G] & y, F = (0 | this.words[G]) - D << w;
this.words[G] = F | f, f = D >>> 26 - w;
}
f && (this.words[G] = f, this.length++);
}
if (W !== 0) {
for (G = this.length - 1; G >= 0; G--) this.words[G + W] = this.words[G];
for (G = 0; G < W; G++) this.words[G] = 0;
this.length += W;
}
return this._strip();
}, n.prototype.ishln = function(B) {
return s(this.negative === 0), this.iushln(B);
}, n.prototype.iushrn = function(B, G, w) {
var W;
s(typeof B == "number" && B >= 0), W = G ? (G - G % 26) / 26 : 0;
var y = B % 26, f = Math.min((B - y) / 26, this.length), D = 67108863 ^ 67108863 >>> y << y, F = w;
if (W -= f, W = Math.max(0, W), F) {
for (var T = 0; T < f; T++) F.words[T] = this.words[T];
F.length = f;
}
if (f !== 0) if (this.length > f) for (this.length -= f, T = 0; T < this.length; T++) this.words[T] = this.words[T + f];
else this.words[0] = 0, this.length = 1;
var Q = 0;
for (T = this.length - 1; T >= 0 && (Q !== 0 || T >= W); T--) {
var P = 0 | this.words[T];
this.words[T] = Q << 26 - y | P >>> y, Q = P & D;
}
return F && Q !== 0 && (F.words[F.length++] = Q), this.length === 0 && (this.words[0] = 0, this.length = 1), this._strip();
}, n.prototype.ishrn = function(B, G, w) {
return s(this.negative === 0), this.iushrn(B, G, w);
}, n.prototype.shln = function(B) {
return this.clone().ishln(B);
}, n.prototype.ushln = function(B) {
return this.clone().iushln(B);
}, n.prototype.shrn = function(B) {
return this.clone().ishrn(B);
}, n.prototype.ushrn = function(B) {
return this.clone().iushrn(B);
}, n.prototype.testn = function(B) {
s(typeof B == "number" && B >= 0);
var G = B % 26, w = (B - G) / 26, W = 1 << G;
return !(this.length <= w) && !!(this.words[w] & W);
}, n.prototype.imaskn = function(B) {
s(typeof B == "number" && B >= 0);
var G = B % 26, w = (B - G) / 26;
if (s(this.negative === 0, "imaskn works only with positive numbers"), this.length <= w) return this;
if (G !== 0 && w++, this.length = Math.min(w, this.length), G !== 0) {
var W = 67108863 ^ 67108863 >>> G << G;
this.words[this.length - 1] &= W;
}
return this._strip();
}, n.prototype.maskn = function(B) {
return this.clone().imaskn(B);
}, n.prototype.iaddn = function(B) {
return s(typeof B == "number"), s(B < 67108864), B < 0 ? this.isubn(-B) : this.negative !== 0 ? this.length === 1 && (0 | this.words[0]) <= B ? (this.words[0] = B - (0 | this.words[0]), this.negative = 0, this) : (this.negative = 0, this.isubn(B), this.negative = 1, this) : this._iaddn(B);
}, n.prototype._iaddn = function(B) {
this.words[0] += B;
for (var G = 0; G < this.length && this.words[G] >= 67108864; G++) this.words[G] -= 67108864, G === this.length - 1 ? this.words[G + 1] = 1 : this.words[G + 1]++;
return this.length = Math.max(this.length, G + 1), this;
}, n.prototype.isubn = function(B) {
if (s(typeof B == "number"), s(B < 67108864), B < 0) return this.iaddn(-B);
if (this.negative !== 0) return this.negative = 0, this.iaddn(B), this.negative = 1, this;
if (this.words[0] -= B, this.length === 1 && this.words[0] < 0) this.words[0] = -this.words[0], this.negative = 1;
else for (var G = 0; G < this.length && this.words[G] < 0; G++) this.words[G] += 67108864, this.words[G + 1] -= 1;
return this._strip();
}, n.prototype.addn = function(B) {
return this.clone().iaddn(B);
}, n.prototype.subn = function(B) {
return this.clone().isubn(B);
}, n.prototype.iabs = function() {
return this.negative = 0, this;
}, n.prototype.abs = function() {
return this.clone().iabs();
}, n.prototype._ishlnsubmul = function(B, G, w) {
var W, y, f = B.length + w;
this._expand(f);
var D = 0;
for (W = 0; W < B.length; W++) {
y = (0 | this.words[W + w]) + D;
var F = (0 | B.words[W]) * G;
D = ((y -= 67108863 & F) >> 26) - (F / 67108864 | 0), this.words[W + w] = 67108863 & y;
}
for (; W < this.length - w; W++) D = (y = (0 | this.words[W + w]) + D) >> 26, this.words[W + w] = 67108863 & y;
if (D === 0) return this._strip();
for (s(D === -1), D = 0, W = 0; W < this.length; W++) D = (y = -(0 | this.words[W]) + D) >> 26, this.words[W] = 67108863 & y;
return this.negative = 1, this._strip();
}, n.prototype._wordDiv = function(B, G) {
var w = (this.length, B.length), W = this.clone(), y = B, f = 0 | y.words[y.length - 1];
(w = 26 - this._countBits(f)) !== 0 && (y = y.ushln(w), W.iushln(w), f = 0 | y.words[y.length - 1]);
var D, F = W.length - y.length;
if (G !== "mod") {
(D = new n(null)).length = F + 1, D.words = new Array(D.length);
for (var T = 0; T < D.length; T++) D.words[T] = 0;
}
var Q = W.clone()._ishlnsubmul(y, 1, F);
Q.negative === 0 && (W = Q, D && (D.words[F] = 1));
for (var P = F - 1; P >= 0; P--) {
var L = 67108864 * (0 | W.words[y.length + P]) + (0 | W.words[y.length + P - 1]);
for (L = Math.min(L / f | 0, 67108863), W._ishlnsubmul(y, L, P); W.negative !== 0; ) L--, W.negative = 0, W._ishlnsubmul(y, 1, P), W.isZero() || (W.negative ^= 1);
D && (D.words[P] = L);
}
return D && D._strip(), W._strip(), G !== "div" && w !== 0 && W.iushrn(w), { div: D || null, mod: W };
}, n.prototype.divmod = function(B, G, w) {
return s(!B.isZero()), this.isZero() ? { div: new n(0), mod: new n(0) } : this.negative !== 0 && B.negative === 0 ? (f = this.neg().divmod(B, G), G !== "mod" && (W = f.div.neg()), G !== "div" && (y = f.mod.neg(), w && y.negative !== 0 && y.iadd(B)), { div: W, mod: y }) : this.negative === 0 && B.negative !== 0 ? (f = this.divmod(B.neg(), G), G !== "mod" && (W = f.div.neg()), { div: W, mod: f.mod }) : (this.negative & B.negative) != 0 ? (f = this.neg().divmod(B.neg(), G), G !== "div" && (y = f.mod.neg(), w && y.negative !== 0 && y.isub(B)), { div: f.div, mod: y }) : B.length > this.length || this.cmp(B) < 0 ? { div: new n(0), mod: this } : B.length === 1 ? G === "div" ? { div: this.divn(B.words[0]), mod: null } : G === "mod" ? { div: null, mod: new n(this.modrn(B.words[0])) } : { div: this.divn(B.words[0]), mod: new n(this.modrn(B.words[0])) } : this._wordDiv(B, G);
var W, y, f;
}, n.prototype.div = function(B) {
return this.divmod(B, "div", !1).div;
}, n.prototype.mod = function(B) {
return this.divmod(B, "mod", !1).mod;
}, n.prototype.umod = function(B) {
return this.divmod(B, "mod", !0).mod;
}, n.prototype.divRound = function(B) {
var G = this.divmod(B);
if (G.mod.isZero()) return G.div;
var w = G.div.negative !== 0 ? G.mod.isub(B) : G.mod, W = B.ushrn(1), y = B.andln(1), f = w.cmp(W);
return f < 0 || y === 1 && f === 0 ? G.div : G.div.negative !== 0 ? G.div.isubn(1) : G.div.iaddn(1);
}, n.prototype.modrn = function(B) {
var G = B < 0;
G && (B = -B), s(B <= 67108863);
for (var w = (1 << 26) % B, W = 0, y = this.length - 1; y >= 0; y--) W = (w * W + (0 | this.words[y])) % B;
return G ? -W : W;
}, n.prototype.modn = function(B) {
return this.modrn(B);
}, n.prototype.idivn = function(B) {
var G = B < 0;
G && (B = -B), s(B <= 67108863);
for (var w = 0, W = this.length - 1; W >= 0; W--) {
var y = (0 | this.words[W]) + 67108864 * w;
this.words[W] = y / B | 0, w = y % B;
}
return this._strip(), G ? this.ineg() : this;
}, n.prototype.divn = function(B) {
return this.clone().idivn(B);
}, n.prototype.egcd = function(B) {
s(B.negative === 0), s(!B.isZero());
var G = this, w = B.clone();
G = G.negative !== 0 ? G.umod(B) : G.clone();
for (var W = new n(1), y = new n(0), f = new n(0), D = new n(1), F = 0; G.isEven() && w.isEven(); ) G.iushrn(1), w.iushrn(1), ++F;
for (var T = w.clone(), Q = G.clone(); !G.isZero(); ) {
for (var P = 0, L = 1; (G.words[0] & L) == 0 && P < 26; ++P, L <<= 1) ;
if (P > 0) for (G.iushrn(P); P-- > 0; ) (W.isOdd() || y.isOdd()) && (W.iadd(T), y.isub(Q)), W.iushrn(1), y.iushrn(1);
for (var E = 0, J = 1; (w.words[0] & J) == 0 && E < 26; ++E, J <<= 1) ;
if (E > 0) for (w.iushrn(E); E-- > 0; ) (f.isOdd() || D.isOdd()) && (f.iadd(T), D.isub(Q)), f.iushrn(1), D.iushrn(1);
G.cmp(w) >= 0 ? (G.isub(w), W.isub(f), y.isub(D)) : (w.isub(G), f.isub(W), D.isub(y));
}
return { a: f, b: D, gcd: w.iushln(F) };
}, n.prototype._invmp = function(B) {
s(B.negative === 0), s(!B.isZero());
var G = this, w = B.clone();
G = G.negative !== 0 ? G.umod(B) : G.clone();
for (var W, y = new n(1), f = new n(0), D = w.clone(); G.cmpn(1) > 0 && w.cmpn(1) > 0; ) {
for (var F = 0, T = 1; (G.words[0] & T) == 0 && F < 26; ++F, T <<= 1) ;
if (F > 0) for (G.iushrn(F); F-- > 0; ) y.isOdd() && y.iadd(D), y.iushrn(1);
for (var Q = 0, P = 1; (w.words[0] & P) == 0 && Q < 26; ++Q, P <<= 1) ;
if (Q > 0) for (w.iushrn(Q); Q-- > 0; ) f.isOdd() && f.iadd(D), f.iushrn(1);
G.cmp(w) >= 0 ? (G.isub(w), y.isub(f)) : (w.isub(G), f.isub(y));
}
return (W = G.cmpn(1) === 0 ? y : f).cmpn(0) < 0 && W.iadd(B), W;
}, n.prototype.gcd = function(B) {
if (this.isZero()) return B.abs();
if (B.isZero()) return this.abs();
var G = this.clone(), w = B.clone();
G.negative = 0, w.negative = 0;
for (var W = 0; G.isEven() && w.isEven(); W++) G.iushrn(1), w.iushrn(1);
for (; ; ) {
for (; G.isEven(); ) G.iushrn(1);
for (; w.isEven(); ) w.iushrn(1);
var y = G.cmp(w);
if (y < 0) {
var f = G;
G = w, w = f;
} else if (y === 0 || w.cmpn(1) === 0) break;
G.isub(w);
}
return w.iushln(W);
}, n.prototype.invm = function(B) {
return this.egcd(B).a.umod(B);
}, n.prototype.isEven = function() {
return (1 & this.words[0]) == 0;
}, n.prototype.isOdd = function() {
return (1 & this.words[0]) == 1;
}, n.prototype.andln = function(B) {
return this.words[0] & B;
}, n.prototype.bincn = function(B) {
s(typeof B == "number");
var G = B % 26, w = (B - G) / 26, W = 1 << G;
if (this.length <= w) return this._expand(w + 1), this.words[w] |= W, this;
for (var y = W, f = w; y !== 0 && f < this.length; f++) {
var D = 0 | this.words[f];
y = (D += y) >>> 26, D &= 67108863, this.words[f] = D;
}
return y !== 0 && (this.words[f] = y, this.length++), this;
}, n.prototype.isZero = function() {
return this.length === 1 && this.words[0] === 0;
}, n.prototype.cmpn = function(B) {
var G, w = B < 0;
if (this.negative !== 0 && !w) return -1;
if (this.negative === 0 && w) return 1;
if (this._strip(), this.length > 1) G = 1;
else {
w && (B = -B), s(B <= 67108863, "Number is too big");
var W = 0 | this.words[0];
G = W === B ? 0 : W < B ? -1 : 1;
}
return this.negative !== 0 ? 0 | -G : G;
}, n.prototype.cmp = function(B) {
if (this.negative !== 0 && B.negative === 0) return -1;
if (this.negative === 0 && B.negative !== 0) return 1;
var G = this.ucmp(B);
return this.negative !== 0 ? 0 | -G : G;
}, n.prototype.ucmp = function(B) {
if (this.length > B.length) return 1;
if (this.length < B.length) return -1;
for (var G = 0, w = this.length - 1; w >= 0; w--) {
var W = 0 | this.words[w], y = 0 | B.words[w];
if (W !== y) {
W < y ? G = -1 : W > y && (G = 1);
break;
}
}
return G;
}, n.prototype.gtn = function(B) {
return this.cmpn(B) === 1;
}, n.prototype.gt = function(B) {
return this.cmp(B) === 1;
}, n.prototype.gten = function(B) {
return this.cmpn(B) >= 0;
}, n.prototype.gte = function(B) {
return this.cmp(B) >= 0;
}, n.prototype.ltn = function(B) {
return this.cmpn(B) === -1;
}, n.prototype.lt = function(B) {
return this.cmp(B) === -1;
}, n.prototype.lten = function(B) {
return this.cmpn(B) <= 0;
}, n.prototype.lte = function(B) {
return this.cmp(B) <= 0;
}, n.prototype.eqn = function(B) {
return this.cmpn(B) === 0;
}, n.prototype.eq = function(B) {
return this.cmp(B) === 0;
}, n.red = function(B) {
return new V(B);
}, n.prototype.toRed = function(B) {
return s(!this.red, "Already a number in reduction context"), s(this.negative === 0, "red works only with positives"), B.convertTo(this)._forceRed(B);
}, n.prototype.fromRed = function() {
return s(this.red, "fromRed works only with numbers in reduction context"), this.red.convertFrom(this);
}, n.prototype._forceRed = function(B) {
return this.red = B, this;
}, n.prototype.forceRed = function(B) {
return s(!this.red, "Already a number in reduction context"), this._forceRed(B);
}, n.prototype.redAdd = function(B) {
return s(this.red, "redAdd works only with red numbers"), this.red.add(this, B);
}, n.prototype.redIAdd = function(B) {
return s(this.red, "redIAdd works only with red numbers"), this.red.iadd(this, B);
}, n.prototype.redSub = function(B) {
return s(this.red, "redSub works only with red numbers"), this.red.sub(this, B);
}, n.prototype.redISub = function(B) {
return s(this.red, "redISub works only with red numbers"), this.red.isub(this, B);
}, n.prototype.redShl = function(B) {
return s(this.red, "redShl works only with red numbers"), this.red.shl(this, B);
}, n.prototype.redMul = function(B) {
return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, B), this.red.mul(this, B);
}, n.prototype.redIMul = function(B) {
return s(this.red, "redMul works only with red numbers"), this.red._verify2(this, B), this.red.imul(this, B);
}, n.prototype.redSqr = function() {
return s(this.red, "redSqr works only with red numbers"), this.red._verify1(this), this.red.sqr(this);
}, n.prototype.redISqr = function() {
return s(this.red, "redISqr works only with red numbers"), this.red._verify1(this), this.red.isqr(this);
}, n.prototype.redSqrt = function() {
return s(this.red, "redSqrt works only with red numbers"), this.red._verify1(this), this.red.sqrt(this);
}, n.prototype.redInvm = function() {
return s(this.red, "redInvm works only with red numbers"), this.red._verify1(this), this.red.invm(this);
}, n.prototype.redNeg = function() {
return s(this.red, "redNeg works only with red numbers"), this.red._verify1(this), this.red.neg(this);
}, n.prototype.redPow = function(B) {
return s(this.red && !B.red, "redPow(normalNum)"), this.red._verify1(this), this.red.pow(this, B);
};
var X = { k256: null, p224: null, p192: null, p25519: null };
function H(B, G) {
this.name = B, this.p = new n(G, 16), this.n = this.p.bitLength(), this.k = new n(1).iushln(this.n).isub(this.p), this.tmp = this._tmp();
}
function S() {
H.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f");
}
function z() {
H.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001");
}
function v() {
H.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff");
}
function K() {
H.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed");
}
function V(B) {
if (typeof B == "string") {
var G = n._prime(B);
this.m = G.p, this.prime = G;
} else s(B.gtn(1), "modulus must be greater than 1"), this.m = B, this.prime = null;
}
function N(B) {
V.call(this, B), this.shift = this.m.bitLength(), this.shift % 26 != 0 && (this.shift += 26 - this.shift % 26), this.r = new n(1).iushln(this.shift), this.r2 = this.imod(this.r.sqr()), this.rinv = this.r._invmp(this.m), this.minv = this.rinv.mul(this.r).isubn(1).div(this.m), this.minv = this.minv.umod(this.r), this.minv = this.r.sub(this.minv);
}
H.prototype._tmp = function() {
var B = new n(null);
return B.words = new Array(Math.ceil(this.n / 13)), B;
}, H.prototype.ireduce = function(B) {
var G, w = B;
do
this.split(w, this.tmp), G = (w = (w = this.imulK(w)).iadd(this.tmp)).bitLength();
while (G > this.n);
var W = G < this.n ? -1 : w.ucmp(this.p);
return W === 0 ? (w.words[0] = 0, w.length = 1) : W > 0 ? w.isub(this.p) : w.strip !== void 0 ? w.strip() : w._strip(), w;
}, H.prototype.split = function(B, G) {
B.iushrn(this.n, 0, G);
}, H.prototype.imulK = function(B) {
return B.imul(this.k);
}, l(S, H), S.prototype.split = function(B, G) {
for (var w = Math.min(B.length, 9), W = 0; W < w; W++) G.words[W] = B.words[W];
if (G.length = w, B.length <= 9) return B.words[0] = 0, void (B.length = 1);
var y = B.words[9];
for (G.words[G.length++] = 4194303 & y, W = 10; W < B.length; W++) {
var f = 0 | B.words[W];
B.words[W - 10] = (4194303 & f) << 4 | y >>> 22, y = f;
}
y >>>= 22, B.words[W - 10] = y, y === 0 && B.length > 10 ? B.length -= 10 : B.length -= 9;
}, S.prototype.imulK = function(B) {
B.words[B.length] = 0, B.words[B.length + 1] = 0, B.length += 2;
for (var G = 0, w = 0; w < B.length; w++) {
var W = 0 | B.words[w];
G += 977 * W, B.words[w] = 67108863 & G, G = 64 * W + (G / 67108864 | 0);
}
return B.words[B.length - 1] === 0 && (B.length--, B.words[B.length - 1] === 0 && B.length--), B;
}, l(z, H), l(v, H), l(K, H), K.prototype.imulK = function(B) {
for (var G = 0, w = 0; w < B.length; w++) {
var W = 19 * (0 | B.words[w]) + G, y = 67108863 & W;
W >>>= 26, B.words[w] = y, G = W;
}
return G !== 0 && (B.words[B.length++] = G), B;
}, n._prime = function(B) {
if (X[B]) return X[B];
var G;
if (B === "k256") G = new S();
else if (B === "p224") G = new z();
else if (B === "p192") G = new v();
else {
if (B !== "p25519") throw new Error("Unknown prime " + B);
G = new K();
}
return X[B] = G, G;
}, V.prototype._verify1 = function(B) {
s(B.negative === 0, "red works only with positives"), s(B.red, "red works only with red numbers");
}, V.prototype._verify2 = function(B, G) {
s((B.negative | G.negative) == 0, "red works only with positives"), s(B.red && B.red === G.red, "red works only with red numbers");
}, V.prototype.imod = function(B) {
return this.prime ? this.prime.ireduce(B)._forceRed(this) : (r(B, B.umod(this.m)._forceRed(this)), B);
}, V.prototype.neg = function(B) {
return B.isZero() ? B.clone() : this.m.sub(B)._forceRed(this);
}, V.prototype.add = function(B, G) {
this._verify2(B, G);
var w = B.add(G);
return w.cmp(this.m) >= 0 && w.isub(this.m), w._forceRed(this);
}, V.prototype.iadd = function(B, G) {
this._verify2(B, G);
var w = B.iadd(G);
return w.cmp(this.m) >= 0 && w.isub(this.m), w;
}, V.prototype.sub = function(B, G) {
this._verify2(B, G);
var w = B.sub(G);
return w.cmpn(0) < 0 && w.iadd(this.m), w._forceRed(this);
}, V.prototype.isub = function(B, G) {
this._verify2(B, G);
var w = B.isub(G);
return w.cmpn(0) < 0 && w.iadd(this.m), w;
}, V.prototype.shl = function(B, G) {
return this._verify1(B), this.imod(B.ushln(G));
}, V.prototype.imul = function(B, G) {
return this._verify2(B, G), this.imod(B.imul(G));
}, V.prototype.mul = function(B, G) {
return this._verify2(B, G), this.imod(B.mul(G));
}, V.prototype.isqr = function(B) {
return this.imul(B, B.clone());
}, V.prototype.sqr = function(B) {
return this.mul(B, B);
}, V.prototype.sqrt = function(B) {
if (B.isZero()) return B.clone();
var G = this.m.andln(3);
if (s(G % 2 == 1), G === 3) {
var w = this.m.add(new n(1)).iushrn(2);
return this.pow(B, w);
}
for (var W = this.m.subn(1), y = 0; !W.isZero() && W.andln(1) === 0; ) y++, W.iushrn(1);
s(!W.isZero());
var f = new n(1).toRed(this), D = f.redNeg(), F = this.m.subn(1).iushrn(1), T = this.m.bitLength();
for (T = new n(2 * T * T).toRed(this); this.pow(T, F).cmp(D) !== 0; ) T.redIAdd(D);
for (var Q = this.pow(T, W), P = this.pow(B, W.addn(1).iushrn(1)), L = this.pow(B, W), E = y; L.cmp(f) !== 0; ) {
for (var J = L, k = 0; J.cmp(f) !== 0; k++) J = J.redSqr();
s(k < E);
var j = this.pow(Q, new n(1).iushln(E - k - 1));
P = P.redMul(j), Q = j.redSqr(), L = L.redMul(Q), E = k;
}
return P;
}, V.prototype.invm = function(B) {
var G = B._invmp(this.m);
return G.negative !== 0 ? (G.negative = 0, this.imod(G).redNeg()) : this.imod(G);
}, V.prototype.pow = function(B, G) {
if (G.isZero()) return new n(1).toRed(this);
if (G.cmpn(1) === 0) return B.clone();
var w = new Array(16);
w[0] = new n(1).toRed(this), w[1] = B;
for (var W = 2; W < w.length; W++) w[W] = this.mul(w[W - 1], B);
var y = w[0], f = 0, D = 0, F = G.bitLength() % 26;
for (F === 0 && (F = 26), W = G.length - 1; W >= 0; W--) {
for (var T = G.words[W], Q = F - 1; Q >= 0; Q--) {
var P = T >> Q & 1;
y !== w[0] && (y = this.sqr(y)), P !== 0 || f !== 0 ? (f <<= 1, f |= P, (++D === 4 || W === 0 && Q === 0) && (y = this.mul(y, w[f]), D = 0, f = 0)) : D = 0;
}
F = 26;
}
return y;
}, V.prototype.convertTo = function(B) {
var G = B.umod(this.m);
return G === B ? G.clone() : G;
}, V.prototype.convertFrom = function(B) {
var G = B.clone();
return G.red = null, G;
}, n.mont = function(B) {
return new N(B);
}, l(N, V), N.prototype.convertTo = function(B) {
return this.imod(B.ushln(this.shift));
}, N.prototype.convertFrom = function(B) {
var G = this.imod(B.mul(this.rinv));
return G.red = null, G;
}, N.prototype.imul = function(B, G) {
if (B.isZero() || G.isZero()) return B.words[0] = 0, B.length = 1, B;
var w = B.imul(G), W = w.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), y = w.isub(W).iushrn(this.shift), f = y;
return y.cmp(this.m) >= 0 ? f = y.isub(this.m) : y.cmpn(0) < 0 && (f = y.iadd(this.m)), f._forceRed(this);
}, N.prototype.mul = function(B, G) {
if (B.isZero() || G.isZero()) return new n(0)._forceRed(this);
var w = B.mul(G), W = w.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), y = w.isub(W).iushrn(this.shift), f = y;
return y.cmp(this.m) >= 0 ? f = y.isub(this.m) : y.cmpn(0) < 0 && (f = y.iadd(this.m)), f._forceRed(this);
}, N.prototype.invm = function(B) {
return this.imod(B._invmp(this.m).mul(this.r2))._forceRed(this);
};
})(C === void 0 || C);
}, { buffer: 188 }], 187: [function(g, C, i) {
var e;
function A(l) {
this.rand = l;
}
if (C.exports = function(l) {
return e || (e = new A(null)), e.generate(l);
}, C.exports.Rand = A, A.prototype.generate = function(l) {
return this._rand(l);
}, A.prototype._rand = function(l) {
if (this.rand.getBytes) return this.rand.getBytes(l);
for (var n = new Uint8Array(l), a = 0; a < n.length; a++) n[a] = this.rand.getByte();
return n;
}, typeof self == "object") self.crypto && self.crypto.getRandomValues ? A.prototype._rand = function(l) {
var n = new Uint8Array(l);
return self.crypto.getRandomValues(n), n;
} : self.msCrypto && self.msCrypto.getRandomValues ? A.prototype._rand = function(l) {
var n = new Uint8Array(l);
return self.msCrypto.getRandomValues(n), n;
} : typeof window == "object" && (A.prototype._rand = function() {
throw new Error("Not implemented yet");
});
else try {
var s = g("crypto");
if (typeof s.randomBytes != "function") throw new Error("Not supported");
A.prototype._rand = function(l) {
return s.randomBytes(l);
};
} catch {
}
}, { crypto: 188 }], 188: [function(g, C, i) {
}, {}], 189: [function(g, C, i) {
var e = g("safe-buffer").Buffer;
function A(o) {
e.isBuffer(o) || (o = e.from(o));
for (var c = o.length / 4 | 0, r = new Array(c), h = 0; h < c; h++) r[h] = o.readUInt32BE(4 * h);
return r;
}
function s(o) {
for (; 0 < o.length; o++) o[0] = 0;
}
function l(o, c, r, h, b) {
for (var u, m, Z, p, Y = r[0], R = r[1], X = r[2], H = r[3], S = o[0] ^ c[0], z = o[1] ^ c[1], v = o[2] ^ c[2], K = o[3] ^ c[3], V = 4, N = 1; N < b; N++) u = Y[S >>> 24] ^ R[z >>> 16 & 255] ^ X[v >>> 8 & 255] ^ H[255 & K] ^ c[V++], m = Y[z >>> 24] ^ R[v >>> 16 & 255] ^ X[K >>> 8 & 255] ^ H[255 & S] ^ c[V++], Z = Y[v >>> 24] ^ R[K >>> 16 & 255] ^ X[S >>> 8 & 255] ^ H[255 & z] ^ c[V++], p = Y[K >>> 24] ^ R[S >>> 16 & 255] ^ X[z >>> 8 & 255] ^ H[255 & v] ^ c[V++], S = u, z = m, v = Z, K = p;
return u = (h[S >>> 24] << 24 | h[z >>> 16 & 255] << 16 | h[v >>> 8 & 255] << 8 | h[255 & K]) ^ c[V++], m = (h[z >>> 24] << 24 | h[v >>> 16 & 255] << 16 | h[K >>> 8 & 255] << 8 | h[255 & S]) ^ c[V++], Z = (h[v >>> 24] << 24 | h[K >>> 16 & 255] << 16 | h[S >>> 8 & 255] << 8 | h[255 & z]) ^ c[V++], p = (h[K >>> 24] << 24 | h[S >>> 16 & 255] << 16 | h[z >>> 8 & 255] << 8 | h[255 & v]) ^ c[V++], [u >>>= 0, m >>>= 0, Z >>>= 0, p >>>= 0];
}
var n = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54], a = function() {
for (var o = new Array(256), c = 0; c < 256; c++) o[c] = c < 128 ? c << 1 : c << 1 ^ 283;
for (var r = [], h = [], b = [[], [], [], []], u = [[], [], [], []], m = 0, Z = 0, p = 0; p < 256; ++p) {
var Y = Z ^ Z << 1 ^ Z << 2 ^ Z << 3 ^ Z << 4;
Y = Y >>> 8 ^ 255 & Y ^ 99, r[m] = Y, h[Y] = m;
var R = o[m], X = o[R], H = o[X], S = 257 * o[Y] ^ 16843008 * Y;
b[0][m] = S << 24 | S >>> 8, b[1][m] = S << 16 | S >>> 16, b[2][m] = S << 8 | S >>> 24, b[3][m] = S, S = 16843009 * H ^ 65537 * X ^ 257 * R ^ 16843008 * m, u[0][Y] = S << 24 | S >>> 8, u[1][Y] = S << 16 | S >>> 16, u[2][Y] = S << 8 | S >>> 24, u[3][Y] = S, m === 0 ? m = Z = 1 : (m = R ^ o[o[o[H ^ R]]], Z ^= o[o[Z]]);
}
return { SBOX: r, INV_SBOX: h, SUB_MIX: b, INV_SUB_MIX: u };
}();
function d(o) {
this._key = A(o), this._reset();
}
d.blockSize = 16, d.keySize = 32, d.prototype.blockSize = d.blockSize, d.prototype.keySize = d.keySize, d.prototype._reset = function() {
for (var o = this._key, c = o.length, r = c + 6, h = 4 * (r + 1), b = [], u = 0; u < c; u++) b[u] = o[u];
for (u = c; u < h; u++) {
var m = b[u - 1];
u % c == 0 ? (m = m << 8 | m >>> 24, m = a.SBOX[m >>> 24] << 24 | a.SBOX[m >>> 16 & 255] << 16 | a.SBOX[m >>> 8 & 255] << 8 | a.SBOX[255 & m], m ^= n[u / c | 0] << 24) : c > 6 && u % c == 4 && (m = a.SBOX[m >>> 24] << 24 | a.SBOX[m >>> 16 & 255] << 16 | a.SBOX[m >>> 8 & 255] << 8 | a.SBOX[255 & m]), b[u] = b[u - c] ^ m;
}
for (var Z = [], p = 0; p < h; p++) {
var Y = h - p, R = b[Y - (p % 4 ? 0 : 4)];
Z[p] = p < 4 || Y <= 4 ? R : a.INV_SUB_MIX[0][a.SBOX[R >>> 24]] ^ a.INV_SUB_MIX[1][a.SBOX[R >>> 16 & 255]] ^ a.INV_SUB_MIX[2][a.SBOX[R >>> 8 & 255]] ^ a.INV_SUB_MIX[3][a.SBOX[255 & R]];
}
this._nRounds = r, this._keySchedule = b, this._invKeySchedule = Z;
}, d.prototype.encryptBlockRaw = function(o) {
return l(o = A(o), this._keySchedule, a.SUB_MIX, a.SBOX, this._nRounds);
}, d.prototype.encryptBlock = function(o) {
var c = this.encryptBlockRaw(o), r = e.allocUnsafe(16);
return r.writeUInt32BE(c[0], 0), r.writeUInt32BE(c[1], 4), r.writeUInt32BE(c[2], 8), r.writeUInt32BE(c[3], 12), r;
}, d.prototype.decryptBlock = function(o) {
var c = (o = A(o))[1];
o[1] = o[3], o[3] = c;
var r = l(o, this._invKeySchedule, a.INV_SUB_MIX, a.INV_SBOX, this._nRounds), h = e.allocUnsafe(16);
return h.writeUInt32BE(r[0], 0), h.writeUInt32BE(r[3], 4), h.writeUInt32BE(r[2], 8), h.writeUInt32BE(r[1], 12), h;
}, d.prototype.scrub = function() {
s(this._keySchedule), s(this._invKeySchedule), s(this._key);
}, C.exports.AES = d;
}, { "safe-buffer": 494 }], 190: [function(g, C, i) {
var e = g("./aes"), A = g("safe-buffer").Buffer, s = g("cipher-base"), l = g("inherits"), n = g("./ghash"), a = g("buffer-xor"), d = g("./incr32");
function o(c, r, h, b) {
s.call(this);
var u = A.alloc(4, 0);
this._cipher = new e.AES(r);
var m = this._cipher.encryptBlock(u);
this._ghash = new n(m), h = function(Z, p, Y) {
if (p.length === 12) return Z._finID = A.concat([p, A.from([0, 0, 0, 1])]), A.concat([p, A.from([0, 0, 0, 2])]);
var R = new n(Y), X = p.length, H = X % 16;
R.update(p), H && (H = 16 - H, R.update(A.alloc(H, 0))), R.update(A.alloc(8, 0));
var S = 8 * X, z = A.alloc(8);
z.writeUIntBE(S, 0, 8), R.update(z), Z._finID = R.state;
var v = A.from(Z._finID);
return d(v), v;
}(this, h, m), this._prev = A.from(h), this._cache = A.allocUnsafe(0), this._secCache = A.allocUnsafe(0), this._decrypt = b, this._alen = 0, this._len = 0, this._mode = c, this._authTag = null, this._called = !1;
}
l(o, s), o.prototype._update = function(c) {
if (!this._called && this._alen) {
var r = 16 - this._alen % 16;
r < 16 && (r = A.alloc(r, 0), this._ghash.update(r));
}
this._called = !0;
var h = this._mode.encrypt(this, c);
return this._decrypt ? this._ghash.update(c) : this._ghash.update(h), this._len += c.length, h;
}, o.prototype._final = function() {
if (this._decrypt && !this._authTag) throw new Error("Unsupported state or unable to authenticate data");
var c = a(this._ghash.final(8 * this._alen, 8 * this._len), this._cipher.encryptBlock(this._finID));
if (this._decrypt && function(r, h) {
var b = 0;
r.length !== h.length && b++;
for (var u = Math.min(r.length, h.length), m = 0; m < u; ++m) b += r[m] ^ h[m];
return b;
}(c, this._authTag)) throw new Error("Unsupported state or unable to authenticate data");
this._authTag = c, this._cipher.scrub();
}, o.prototype.getAuthTag = function() {
if (this._decrypt || !A.isBuffer(this._authTag)) throw new Error("Attempting to get auth tag in unsupported state");
return this._authTag;
}, o.prototype.setAuthTag = function(c) {
if (!this._decrypt) throw new Error("Attempting to set auth tag in unsupported state");
this._authTag = c;
}, o.prototype.setAAD = function(c) {
if (this._called) throw new Error("Attempting to set AAD in unsupported state");
this._ghash.update(c), this._alen += c.length;
}, C.exports = o;
}, { "./aes": 189, "./ghash": 194, "./incr32": 195, "buffer-xor": 219, "cipher-base": 221, inherits: 440, "safe-buffer": 494 }], 191: [function(g, C, i) {
var e = g("./encrypter"), A = g("./decrypter"), s = g("./modes/list.json");
i.createCipher = i.Cipher = e.createCipher, i.createCipheriv = i.Cipheriv = e.createCipheriv, i.createDecipher = i.Decipher = A.createDecipher, i.createDecipheriv = i.Decipheriv = A.createDecipheriv, i.listCiphers = i.getCiphers = function() {
return Object.keys(s);
};
}, { "./decrypter": 192, "./encrypter": 193, "./modes/list.json": 203 }], 192: [function(g, C, i) {
var e = g("./authCipher"), A = g("safe-buffer").Buffer, s = g("./modes"), l = g("./streamCipher"), n = g("cipher-base"), a = g("./aes"), d = g("evp_bytestokey");
function o(h, b, u) {
n.call(this), this._cache = new c(), this._last = void 0, this._cipher = new a.AES(b), this._prev = A.from(u), this._mode = h, this._autopadding = !0;
}
function c() {
this.cache = A.allocUnsafe(0);
}
function r(h, b, u) {
var m = s[h.toLowerCase()];
if (!m) throw new TypeError("invalid suite type");
if (typeof u == "string" && (u = A.from(u)), m.mode !== "GCM" && u.length !== m.iv) throw new TypeError("invalid iv length " + u.length);
if (typeof b == "string" && (b = A.from(b)), b.length !== m.key / 8) throw new TypeError("invalid key length " + b.length);
return m.type === "stream" ? new l(m.module, b, u, !0) : m.type === "auth" ? new e(m.module, b, u, !0) : new o(m.module, b, u);
}
g("inherits")(o, n), o.prototype._update = function(h) {
var b, u;
this._cache.add(h);
for (var m = []; b = this._cache.get(this._autopadding); ) u = this._mode.decrypt(this, b), m.push(u);
return A.concat(m);
}, o.prototype._final = function() {
var h = this._cache.flush();
if (this._autopadding) return function(b) {
var u = b[15];
if (u < 1 || u > 16) throw new Error("unable to decrypt data");
for (var m = -1; ++m < u; ) if (b[m + (16 - u)] !== u) throw new Error("unable to decrypt data");
if (u !== 16)
return b.slice(0, 16 - u);
}(this._mode.decrypt(this, h));
if (h) throw new Error("data not multiple of block length");
}, o.prototype.setAutoPadding = function(h) {
return this._autopadding = !!h, this;
}, c.prototype.add = function(h) {
this.cache = A.concat([this.cache, h]);
}, c.prototype.get = function(h) {
var b;
if (h) {
if (this.cache.length > 16) return b = this.cache.slice(0, 16), this.cache = this.cache.slice(16), b;
} else if (this.cache.length >= 16) return b = this.cache.slice(0, 16), this.cache = this.cache.slice(16), b;
return null;
}, c.prototype.flush = function() {
if (this.cache.length) return this.cache;
}, i.createDecipher = function(h, b) {
var u = s[h.toLowerCase()];
if (!u) throw new TypeError("invalid suite type");
var m = d(b, !1, u.key, u.iv);
return r(h, m.key, m.iv);
}, i.createDecipheriv = r;
}, { "./aes": 189, "./authCipher": 190, "./modes": 202, "./streamCipher": 205, "cipher-base": 221, evp_bytestokey: 423, inherits: 440, "safe-buffer": 494 }], 193: [function(g, C, i) {
var e = g("./modes"), A = g("./authCipher"), s = g("safe-buffer").Buffer, l = g("./streamCipher"), n = g("cipher-base"), a = g("./aes"), d = g("evp_bytestokey");
function o(b, u, m) {
n.call(this), this._cache = new r(), this._cipher = new a.AES(u), this._prev = s.from(m), this._mode = b, this._autopadding = !0;
}
g("inherits")(o, n), o.prototype._update = function(b) {
var u, m;
this._cache.add(b);
for (var Z = []; u = this._cache.get(); ) m = this._mode.encrypt(this, u), Z.push(m);
return s.concat(Z);
};
var c = s.alloc(16, 16);
function r() {
this.cache = s.allocUnsafe(0);
}
function h(b, u, m) {
var Z = e[b.toLowerCase()];
if (!Z) throw new TypeError("invalid suite type");
if (typeof u == "string" && (u = s.from(u)), u.length !== Z.key / 8) throw new TypeError("invalid key length " + u.length);
if (typeof m == "string" && (m = s.from(m)), Z.mode !== "GCM" && m.length !== Z.iv) throw new TypeError("invalid iv length " + m.length);
return Z.type === "stream" ? new l(Z.module, u, m) : Z.type === "auth" ? new A(Z.module, u, m) : new o(Z.module, u, m);
}
o.prototype._final = function() {
var b = this._cache.flush();
if (this._autopadding) return b = this._mode.encrypt(this, b), this._cipher.scrub(), b;
if (!b.equals(c)) throw this._cipher.scrub(), new Error("data not multiple of block length");
}, o.prototype.setAutoPadding = function(b) {
return this._autopadding = !!b, this;
}, r.prototype.add = function(b) {
this.cache = s.concat([this.cache, b]);
}, r.prototype.get = function() {
if (this.cache.length > 15) {
var b = this.cache.slice(0, 16);
return this.cache = this.cache.slice(16), b;
}
return null;
}, r.prototype.flush = function() {
for (var b = 16 - this.cache.length, u = s.allocUnsafe(b), m = -1; ++m < b; ) u.writeUInt8(b, m);
return s.concat([this.cache, u]);
}, i.createCipheriv = h, i.createCipher = function(b, u) {
var m = e[b.toLowerCase()];
if (!m) throw new TypeError("invalid suite type");
var Z = d(u, !1, m.key, m.iv);
return h(b, Z.key, Z.iv);
};
}, { "./aes": 189, "./authCipher": 190, "./modes": 202, "./streamCipher": 205, "cipher-base": 221, evp_bytestokey: 423, inherits: 440, "safe-buffer": 494 }], 194: [function(g, C, i) {
var e = g("safe-buffer").Buffer, A = e.alloc(16, 0);
function s(n) {
var a = e.allocUnsafe(16);
return a.writeUInt32BE(n[0] >>> 0, 0), a.writeUInt32BE(n[1] >>> 0, 4), a.writeUInt32BE(n[2] >>> 0, 8), a.writeUInt32BE(n[3] >>> 0, 12), a;
}
function l(n) {
this.h = n, this.state = e.alloc(16, 0), this.cache = e.allocUnsafe(0);
}
l.prototype.ghash = function(n) {
for (var a = -1; ++a < n.length; ) this.state[a] ^= n[a];
this._multiply();
}, l.prototype._multiply = function() {
for (var n, a, d, o = [(n = this.h).readUInt32BE(0), n.readUInt32BE(4), n.readUInt32BE(8), n.readUInt32BE(12)], c = [0, 0, 0, 0], r = -1; ++r < 128; ) {
for ((this.state[~~(r / 8)] & 1 << 7 - r % 8) != 0 && (c[0] ^= o[0], c[1] ^= o[1], c[2] ^= o[2], c[3] ^= o[3]), d = (1 & o[3]) != 0, a = 3; a > 0; a--) o[a] = o[a] >>> 1 | (1 & o[a - 1]) << 31;
o[0] = o[0] >>> 1, d && (o[0] = o[0] ^ 225 << 24);
}
this.state = s(c);
}, l.prototype.update = function(n) {
var a;
for (this.cache = e.concat([this.cache, n]); this.cache.length >= 16; ) a = this.cache.slice(0, 16), this.cache = this.cache.slice(16), this.ghash(a);
}, l.prototype.final = function(n, a) {
return this.cache.length && this.ghash(e.concat([this.cache, A], 16)), this.ghash(s([0, n, 0, a])), this.state;
}, C.exports = l;
}, { "safe-buffer": 494 }], 195: [function(g, C, i) {
C.exports = function(e) {
for (var A, s = e.length; s--; ) {
if ((A = e.readUInt8(s)) !== 255) {
A++, e.writeUInt8(A, s);
break;
}
e.writeUInt8(0, s);
}
};
}, {}], 196: [function(g, C, i) {
var e = g("buffer-xor");
i.encrypt = function(A, s) {
var l = e(s, A._prev);
return A._prev = A._cipher.encryptBlock(l), A._prev;
}, i.decrypt = function(A, s) {
var l = A._prev;
A._prev = s;
var n = A._cipher.decryptBlock(s);
return e(n, l);
};
}, { "buffer-xor": 219 }], 197: [function(g, C, i) {
var e = g("safe-buffer").Buffer, A = g("buffer-xor");
function s(l, n, a) {
var d = n.length, o = A(n, l._cache);
return l._cache = l._cache.slice(d), l._prev = e.concat([l._prev, a ? n : o]), o;
}
i.encrypt = function(l, n, a) {
for (var d, o = e.allocUnsafe(0); n.length; ) {
if (l._cache.length === 0 && (l._cache = l._cipher.encryptBlock(l._prev), l._prev = e.allocUnsafe(0)), !(l._cache.length <= n.length)) {
o = e.concat([o, s(l, n, a)]);
break;
}
d = l._cache.length, o = e.concat([o, s(l, n.slice(0, d), a)]), n = n.slice(d);
}
return o;
};
}, { "buffer-xor": 219, "safe-buffer": 494 }], 198: [function(g, C, i) {
var e = g("safe-buffer").Buffer;
function A(l, n, a) {
for (var d, o, c = -1, r = 0; ++c < 8; ) d = n & 1 << 7 - c ? 128 : 0, r += (128 & (o = l._cipher.encryptBlock(l._prev)[0] ^ d)) >> c % 8, l._prev = s(l._prev, a ? d : o);
return r;
}
function s(l, n) {
var a = l.length, d = -1, o = e.allocUnsafe(l.length);
for (l = e.concat([l, e.from([n])]); ++d < a; ) o[d] = l[d] << 1 | l[d + 1] >> 7;
return o;
}
i.encrypt = function(l, n, a) {
for (var d = n.length, o = e.allocUnsafe(d), c = -1; ++c < d; ) o[c] = A(l, n[c], a);
return o;
};
}, { "safe-buffer": 494 }], 199: [function(g, C, i) {
var e = g("safe-buffer").Buffer;
function A(s, l, n) {
var a = s._cipher.encryptBlock(s._prev)[0] ^ l;
return s._prev = e.concat([s._prev.slice(1), e.from([n ? l : a])]), a;
}
i.encrypt = function(s, l, n) {
for (var a = l.length, d = e.allocUnsafe(a), o = -1; ++o < a; ) d[o] = A(s, l[o], n);
return d;
};
}, { "safe-buffer": 494 }], 200: [function(g, C, i) {
var e = g("buffer-xor"), A = g("safe-buffer").Buffer, s = g("../incr32");
function l(n) {
var a = n._cipher.encryptBlockRaw(n._prev);
return s(n._prev), a;
}
i.encrypt = function(n, a) {
var d = Math.ceil(a.length / 16), o = n._cache.length;
n._cache = A.concat([n._cache, A.allocUnsafe(16 * d)]);
for (var c = 0; c < d; c++) {
var r = l(n), h = o + 16 * c;
n._cache.writeUInt32BE(r[0], h + 0), n._cache.writeUInt32BE(r[1], h + 4), n._cache.writeUInt32BE(r[2], h + 8), n._cache.writeUInt32BE(r[3], h + 12);
}
var b = n._cache.slice(0, a.length);
return n._cache = n._cache.slice(a.length), e(a, b);
};
}, { "../incr32": 195, "buffer-xor": 219, "safe-buffer": 494 }], 201: [function(g, C, i) {
i.encrypt = function(e, A) {
return e._cipher.encryptBlock(A);
}, i.decrypt = function(e, A) {
return e._cipher.decryptBlock(A);
};
}, {}], 202: [function(g, C, i) {
var e = { ECB: g("./ecb"), CBC: g("./cbc"), CFB: g("./cfb"), CFB8: g("./cfb8"), CFB1: g("./cfb1"), OFB: g("./ofb"), CTR: g("./ctr"), GCM: g("./ctr") }, A = g("./list.json");
for (var s in A) A[s].module = e[A[s].mode];
C.exports = A;
}, { "./cbc": 196, "./cfb": 197, "./cfb1": 198, "./cfb8": 199, "./ctr": 200, "./ecb": 201, "./list.json": 203, "./ofb": 204 }], 203: [function(g, C, i) {
C.exports = { "aes-128-ecb": { cipher: "AES", key: 128, iv: 0, mode: "ECB", type: "block" }, "aes-192-ecb": { cipher: "AES", key: 192, iv: 0, mode: "ECB", type: "block" }, "aes-256-ecb": { cipher: "AES", key: 256, iv: 0, mode: "ECB", type: "block" }, "aes-128-cbc": { cipher: "AES", key: 128, iv: 16, mode: "CBC", type: "block" }, "aes-192-cbc": { cipher: "AES", key: 192, iv: 16, mode: "CBC", type: "block" }, "aes-256-cbc": { cipher: "AES", key: 256, iv: 16, mode: "CBC", type: "block" }, aes128: { cipher: "AES", key: 128, iv: 16, mode: "CBC", type: "block" }, aes192: { cipher: "AES", key: 192, iv: 16, mode: "CBC", type: "block" }, aes256: { cipher: "AES", key: 256, iv: 16, mode: "CBC", type: "block" }, "aes-128-cfb": { cipher: "AES", key: 128, iv: 16, mode: "CFB", type: "stream" }, "aes-192-cfb": { cipher: "AES", key: 192, iv: 16, mode: "CFB", type: "stream" }, "aes-256-cfb": { cipher: "AES", key: 256, iv: 16, mode: "CFB", type: "stream" }, "aes-128-cfb8": { cipher: "AES", key: 128, iv: 16, mode: "CFB8", type: "stream" }, "aes-192-cfb8": { cipher: "AES", key: 192, iv: 16, mode: "CFB8", type: "stream" }, "aes-256-cfb8": { cipher: "AES", key: 256, iv: 16, mode: "CFB8", type: "stream" }, "aes-128-cfb1": { cipher: "AES", key: 128, iv: 16, mode: "CFB1", type: "stream" }, "aes-192-cfb1": { cipher: "AES", key: 192, iv: 16, mode: "CFB1", type: "stream" }, "aes-256-cfb1": { cipher: "AES", key: 256, iv: 16, mode: "CFB1", type: "stream" }, "aes-128-ofb": { cipher: "AES", key: 128, iv: 16, mode: "OFB", type: "stream" }, "aes-192-ofb": { cipher: "AES", key: 192, iv: 16, mode: "OFB", type: "stream" }, "aes-256-ofb": { cipher: "AES", key: 256, iv: 16, mode: "OFB", type: "stream" }, "aes-128-ctr": { cipher: "AES", key: 128, iv: 16, mode: "CTR", type: "stream" }, "aes-192-ctr": { cipher: "AES", key: 192, iv: 16, mode: "CTR", type: "stream" }, "aes-256-ctr": { cipher: "AES", key: 256, iv: 16, mode: "CTR", type: "stream" }, "aes-128-gcm": { cipher: "AES", key: 128, iv: 12, mode: "GCM", type: "auth" }, "aes-192-gcm": { cipher: "AES", key: 192, iv: 12, mode: "GCM", type: "auth" }, "aes-256-gcm": { cipher: "AES", key: 256, iv: 12, mode: "GCM", type: "auth" } };
}, {}], 204: [function(g, C, i) {
(function(e) {
(function() {
var A = g("buffer-xor");
function s(l) {
return l._prev = l._cipher.encryptBlock(l._prev), l._prev;
}
i.encrypt = function(l, n) {
for (; l._cache.length < n.length; ) l._cache = e.concat([l._cache, s(l)]);
var a = l._cache.slice(0, n.length);
return l._cache = l._cache.slice(n.length), A(n, a);
};
}).call(this);
}).call(this, g("buffer").Buffer);
}, { buffer: 220, "buffer-xor": 219 }], 205: [function(g, C, i) {
var e = g("./aes"), A = g("safe-buffer").Buffer, s = g("cipher-base");
function l(n, a, d, o) {
s.call(this), this._cipher = new e.AES(a), this._prev = A.from(d), this._cache = A.allocUnsafe(0), this._secCache = A.allocUnsafe(0), this._decrypt = o, this._mode = n;
}
g("inherits")(l, s), l.prototype._update = function(n) {
return this._mode.encrypt(this, n, this._decrypt);
}, l.prototype._final = function() {
this._cipher.scrub();
}, C.exports = l;
}, { "./aes": 189, "cipher-base": 221, inherits: 440, "safe-buffer": 494 }], 206: [function(g, C, i) {
var e = g("browserify-des"), A = g("browserify-aes/browser"), s = g("browserify-aes/modes"), l = g("browserify-des/modes"), n = g("evp_bytestokey");
function a(o, c, r) {
if (o = o.toLowerCase(), s[o]) return A.createCipheriv(o, c, r);
if (l[o]) return new e({ key: c, iv: r, mode: o });
throw new TypeError("invalid suite type");
}
function d(o, c, r) {
if (o = o.toLowerCase(), s[o]) return A.createDecipheriv(o, c, r);
if (l[o]) return new e({ key: c, iv: r, mode: o, decrypt: !0 });
throw new TypeError("invalid suite type");
}
i.createCipher = i.Cipher = function(o, c) {
var r, h;
if (o = o.toLowerCase(), s[o]) r = s[o].key, h = s[o].iv;
else {
if (!l[o]) throw new TypeError("invalid suite type");
r = 8 * l[o].key, h = l[o].iv;
}
var b = n(c, !1, r, h);
return a(o, b.key, b.iv);
}, i.createCipheriv = i.Cipheriv = a, i.createDecipher = i.Decipher = function(o, c) {
var r, h;
if (o = o.toLowerCase(), s[o]) r = s[o].key, h = s[o].iv;
else {
if (!l[o]) throw new TypeError("invalid suite type");
r = 8 * l[o].key, h = l[o].iv;
}
var b = n(c, !1, r, h);
return d(o, b.key, b.iv);
}, i.createDecipheriv = i.Decipheriv = d, i.listCiphers = i.getCiphers = function() {
return Object.keys(l).concat(A.getCiphers());
};
}, { "browserify-aes/browser": 191, "browserify-aes/modes": 202, "browserify-des": 207, "browserify-des/modes": 208, evp_bytestokey: 423 }], 207: [function(g, C, i) {
var e = g("cipher-base"), A = g("des.js"), s = g("inherits"), l = g("safe-buffer").Buffer, n = { "des-ede3-cbc": A.CBC.instantiate(A.EDE), "des-ede3": A.EDE, "des-ede-cbc": A.CBC.instantiate(A.EDE), "des-ede": A.EDE, "des-cbc": A.CBC.instantiate(A.DES), "des-ecb": A.DES };
function a(d) {
e.call(this);
var o, c = d.mode.toLowerCase(), r = n[c];
o = d.decrypt ? "decrypt" : "encrypt";
var h = d.key;
l.isBuffer(h) || (h = l.from(h)), c !== "des-ede" && c !== "des-ede-cbc" || (h = l.concat([h, h.slice(0, 8)]));
var b = d.iv;
l.isBuffer(b) || (b = l.from(b)), this._des = r.create({ key: h, iv: b, type: o });
}
n.des = n["des-cbc"], n.des3 = n["des-ede3-cbc"], C.exports = a, s(a, e), a.prototype._update = function(d) {
return l.from(this._des.update(d));
}, a.prototype._final = function() {
return l.from(this._des.final());
};
}, { "cipher-base": 221, "des.js": 394, inherits: 440, "safe-buffer": 494 }], 208: [function(g, C, i) {
i["des-ecb"] = { key: 8, iv: 0 }, i["des-cbc"] = i.des = { key: 8, iv: 8 }, i["des-ede3-cbc"] = i.des3 = { key: 24, iv: 8 }, i["des-ede3"] = { key: 24, iv: 0 }, i["des-ede-cbc"] = { key: 16, iv: 8 }, i["des-ede"] = { key: 16, iv: 0 };
}, {}], 209: [function(g, C, i) {
(function(e) {
(function() {
var A = g("bn.js"), s = g("randombytes");
function l(a) {
var d, o = a.modulus.byteLength();
do
d = new A(s(o));
while (d.cmp(a.modulus) >= 0 || !d.umod(a.prime1) || !d.umod(a.prime2));
return d;
}
function n(a, d) {
var o = function(X) {
var H = l(X);
return { blinder: H.toRed(A.mont(X.modulus)).redPow(new A(X.publicExponent)).fromRed(), unblinder: H.invm(X.modulus) };
}(d), c = d.modulus.byteLength(), r = new A(a).mul(o.blinder).umod(d.modulus), h = r.toRed(A.mont(d.prime1)), b = r.toRed(A.mont(d.prime2)), u = d.coefficient, m = d.prime1, Z = d.prime2, p = h.redPow(d.exponent1).fromRed(), Y = b.redPow(d.exponent2).fromRed(), R = p.isub(Y).imul(u).umod(m).imul(Z);
return Y.iadd(R).imul(o.unblinder).umod(d.modulus).toArrayLike(e, "be", c);
}
n.getr = l, C.exports = n;
}).call(this);
}).call(this, g("buffer").Buffer);
}, { "bn.js": 186, buffer: 220, randombytes: 475 }], 210: [function(g, C, i) {
C.exports = g("./browser/algorithms.json");
}, { "./browser/algorithms.json": 211 }], 211: [function(g, C, i) {
C.exports = { sha224WithRSAEncryption: { sign: "rsa", hash: "sha224", id: "302d300d06096086480165030402040500041c" }, "RSA-SHA224": { sign: "ecdsa/rsa", hash: "sha224", id: "302d300d06096086480165030402040500041c" }, sha256WithRSAEncryption: { sign: "rsa", hash: "sha256", id: "3031300d060960864801650304020105000420" }, "RSA-SHA256": { sign: "ecdsa/rsa", hash: "sha256", id: "3031300d060960864801650304020105000420" }, sha384WithRSAEncryption: { sign: "rsa", hash: "sha384", id: "3041300d060960864801650304020205000430" }, "RSA-SHA384": { sign: "ecdsa/rsa", hash: "sha384", id: "3041300d060960864801650304020205000430" }, sha512WithRSAEncryption: { sign: "rsa", hash: "sha512", id: "3051300d060960864801650304020305000440" }, "RSA-SHA512": { sign: "ecdsa/rsa", hash: "sha512", id: "3051300d060960864801650304020305000440" }, "RSA-SHA1": { sign: "rsa", hash: "sha1", id: "3021300906052b0e03021a05000414" }, "ecdsa-with-SHA1": { sign: "ecdsa", hash: "sha1", id: "" }, sha256: { sign: "ecdsa", hash: "sha256", id: "" }, sha224: { sign: "ecdsa", hash: "sha224", id: "" }, sha384: { sign: "ecdsa", hash: "sha384", id: "" }, sha512: { sign: "ecdsa", hash: "sha512", id: "" }, "DSA-SHA": { sign: "dsa", hash: "sha1", id: "" }, "DSA-SHA1": { sign: "dsa", hash: "sha1", id: "" }, DSA: { sign: "dsa", hash: "sha1", id: "" }, "DSA-WITH-SHA224": { sign: "dsa", hash: "sha224", id: "" }, "DSA-SHA224": { sign: "dsa", hash: "sha224", id: "" }, "DSA-WITH-SHA256": { sign: "dsa", hash: "sha256", id: "" }, "DSA-SHA256": { sign: "dsa", hash: "sha256", id: "" }, "DSA-WITH-SHA384": { sign: "dsa", hash: "sha384", id: "" }, "DSA-SHA384": { sign: "dsa", hash: "sha384", id: "" }, "DSA-WITH-SHA512": { sign: "dsa", hash: "sha512", id: "" }, "DSA-SHA512": { sign: "dsa", hash: "sha512", id: "" }, "DSA-RIPEMD160": { sign: "dsa", hash: "rmd160", id: "" }, ripemd160WithRSA: { sign: "rsa", hash: "rmd160", id: "3021300906052b2403020105000414" }, "RSA-RIPEMD160": { sign: "rsa", hash: "rmd160", id: "3021300906052b2403020105000414" }, md5WithRSAEncryption: { sign: "rsa", hash: "md5", id: "3020300c06082a864886f70d020505000410" }, "RSA-MD5": { sign: "rsa", hash: "md5", id: "3020300c06082a864886f70d020505000410" } };
}, {}], 212: [function(g, C, i) {
C.exports = { "1.3.132.0.10": "secp256k1", "1.3.132.0.33": "p224", "1.2.840.10045.3.1.1": "p192", "1.2.840.10045.3.1.7": "p256", "1.3.132.0.34": "p384", "1.3.132.0.35": "p521" };
}, {}], 213: [function(g, C, i) {
var e = g("safe-buffer").Buffer, A = g("create-hash"), s = g("readable-stream"), l = g("inherits"), n = g("./sign"), a = g("./verify"), d = g("./algorithms.json");
function o(b) {
s.Writable.call(this);
var u = d[b];
if (!u) throw new Error("Unknown message digest");
this._hashType = u.hash, this._hash = A(u.hash), this._tag = u.id, this._signType = u.sign;
}
function c(b) {
s.Writable.call(this);
var u = d[b];
if (!u) throw new Error("Unknown message digest");
this._hash = A(u.hash), this._tag = u.id, this._signType = u.sign;
}
function r(b) {
return new o(b);
}
function h(b) {
return new c(b);
}
Object.keys(d).forEach(function(b) {
d[b].id = e.from(d[b].id, "hex"), d[b.toLowerCase()] = d[b];
}), l(o, s.Writable), o.prototype._write = function(b, u, m) {
this._hash.update(b), m();
}, o.prototype.update = function(b, u) {
return typeof b == "string" && (b = e.from(b, u)), this._hash.update(b), this;
}, o.prototype.sign = function(b, u) {
this.end();
var m = this._hash.digest(), Z = n(m, b, this._hashType, this._signType, this._tag);
return u ? Z.toString(u) : Z;
}, l(c, s.Writable), c.prototype._write = function(b, u, m) {
this._hash.update(b), m();
}, c.prototype.update = function(b, u) {
return typeof b == "string" && (b = e.from(b, u)), this._hash.update(b), this;
}, c.prototype.verify = function(b, u, m) {
typeof u == "string" && (u = e.from(u, m)), this.end();
var Z = this._hash.digest();
return a(u, Z, b, this._signType, this._tag);
}, C.exports = { Sign: r, Verify: h, createSign: r, createVerify: h };
}, { "./algorithms.json": 211, "./sign": 214, "./verify": 215, "create-hash": 386, inherits: 440, "readable-stream": 491, "safe-buffer": 494 }], 214: [function(g, C, i) {
var e = g("safe-buffer").Buffer, A = g("create-hmac"), s = g("browserify-rsa"), l = g("elliptic").ec, n = g("bn.js"), a = g("parse-asn1"), d = g("./curves.json");
function o(b, u, m, Z) {
if ((b = e.from(b.toArray())).length < u.byteLength()) {
var p = e.alloc(u.byteLength() - b.length);
b = e.concat([p, b]);
}
var Y = m.length, R = function(S, z) {
S = (S = c(S, z)).mod(z);
var v = e.from(S.toArray());
if (v.length < z.byteLength()) {
var K = e.alloc(z.byteLength() - v.length);
v = e.concat([K, v]);
}
return v;
}(m, u), X = e.alloc(Y);
X.fill(1);
var H = e.alloc(Y);
return H = A(Z, H).update(X).update(e.from([0])).update(b).update(R).digest(), X = A(Z, H).update(X).digest(), { k: H = A(Z, H).update(X).update(e.from([1])).update(b).update(R).digest(), v: X = A(Z, H).update(X).digest() };
}
function c(b, u) {
var m = new n(b), Z = (b.length << 3) - u.bitLength();
return Z > 0 && m.ishrn(Z), m;
}
function r(b, u, m) {
var Z, p;
do {
for (Z = e.alloc(0); 8 * Z.length < b.bitLength(); ) u.v = A(m, u.k).update(u.v).digest(), Z = e.concat([Z, u.v]);
p = c(Z, b), u.k = A(m, u.k).update(u.v).update(e.from([0])).digest(), u.v = A(m, u.k).update(u.v).digest();
} while (p.cmp(b) !== -1);
return p;
}
function h(b, u, m, Z) {
return b.toRed(n.mont(m)).redPow(u).fromRed().mod(Z);
}
C.exports = function(b, u, m, Z, p) {
var Y = a(u);
if (Y.curve) {
if (Z !== "ecdsa" && Z !== "ecdsa/rsa") throw new Error("wrong private key type");
return function(S, z) {
var v = d[z.curve.join(".")];
if (!v) throw new Error("unknown curve " + z.curve.join("."));
var K = new l(v).keyFromPrivate(z.privateKey).sign(S);
return e.from(K.toDER());
}(b, Y);
}
if (Y.type === "dsa") {
if (Z !== "dsa") throw new Error("wrong private key type");
return function(S, z, v) {
for (var K, V = z.params.priv_key, N = z.params.p, B = z.params.q, G = z.params.g, w = new n(0), W = c(S, B).mod(B), y = !1, f = o(V, B, S, v); y === !1; ) K = r(B, f, v), w = h(G, K, N, B), (y = K.invm(B).imul(W.add(V.mul(w))).mod(B)).cmpn(0) === 0 && (y = !1, w = new n(0));
return function(D, F) {
D = D.toArray(), F = F.toArray(), 128 & D[0] && (D = [0].concat(D)), 128 & F[0] && (F = [0].concat(F));
var T = [48, D.length + F.length + 4, 2, D.length];
return T = T.concat(D, [2, F.length], F), e.from(T);
}(w, y);
}(b, Y, m);
}
if (Z !== "rsa" && Z !== "ecdsa/rsa") throw new Error("wrong private key type");
b = e.concat([p, b]);
for (var R = Y.modulus.byteLength(), X = [0, 1]; b.length + X.length + 1 < R; ) X.push(255);
X.push(0);
for (var H = -1; ++H < b.length; ) X.push(b[H]);
return s(X, Y);
}, C.exports.getKey = o, C.exports.makeKey = r;
}, { "./curves.json": 212, "bn.js": 186, "browserify-rsa": 209, "create-hmac": 388, elliptic: 405, "parse-asn1": 459, "safe-buffer": 494 }], 215: [function(g, C, i) {
var e = g("safe-buffer").Buffer, A = g("bn.js"), s = g("elliptic").ec, l = g("parse-asn1"), n = g("./curves.json");
function a(d, o) {
if (d.cmpn(0) <= 0) throw new Error("invalid sig");
if (d.cmp(o) >= o) throw new Error("invalid sig");
}
C.exports = function(d, o, c, r, h) {
var b = l(c);
if (b.type === "ec") {
if (r !== "ecdsa" && r !== "ecdsa/rsa") throw new Error("wrong public key type");
return function(X, H, S) {
var z = n[S.data.algorithm.curve.join(".")];
if (!z) throw new Error("unknown curve " + S.data.algorithm.curve.join("."));
var v = new s(z), K = S.data.subjectPrivateKey.data;
return v.verify(H, X, K);
}(d, o, b);
}
if (b.type === "dsa") {
if (r !== "dsa") throw new Error("wrong public key type");
return function(X, H, S) {
var z = S.data.p, v = S.data.q, K = S.data.g, V = S.data.pub_key, N = l.signature.decode(X, "der"), B = N.s, G = N.r;
a(B, v), a(G, v);
var w = A.mont(z), W = B.invm(v);
return K.toRed(w).redPow(new A(H).mul(W).mod(v)).fromRed().mul(V.toRed(w).redPow(G.mul(W).mod(v)).fromRed()).mod(z).mod(v).cmp(G) === 0;
}(d, o, b);
}
if (r !== "rsa" && r !== "ecdsa/rsa") throw new Error("wrong public key type");
o = e.concat([h, o]);
for (var u = b.modulus.byteLength(), m = [1], Z = 0; o.length + m.length + 2 < u; ) m.push(255), Z++;
m.push(0);
for (var p = -1; ++p < o.length; ) m.push(o[p]);
m = e.from(m);
var Y = A.mont(b.modulus);
d = (d = new A(d).toRed(Y)).redPow(new A(b.publicExponent)), d = e.from(d.fromRed().toArray());
var R = Z < 8 ? 1 : 0;
for (u = Math.min(d.length, m.length), d.length !== m.length && (R = 1), p = -1; ++p < u; ) R |= d[p] ^ m[p];
return R === 0;
};
}, { "./curves.json": 212, "bn.js": 186, elliptic: 405, "parse-asn1": 459, "safe-buffer": 494 }], 216: [function(g, C, i) {
}, {}], 217: [function(g, C, i) {
var e = g("buffer"), A = e.Buffer;
function s(n, a) {
for (var d in n) a[d] = n[d];
}
function l(n, a, d) {
return A(n, a, d);
}
A.from && A.alloc && A.allocUnsafe && A.allocUnsafeSlow ? C.exports = e : (s(e, i), i.Buffer = l), s(A, l), l.from = function(n, a, d) {
if (typeof n == "number") throw new TypeError("Argument must not be a number");
return A(n, a, d);
}, l.alloc = function(n, a, d) {
if (typeof n != "number") throw new TypeError("Argument must be a number");
var o = A(n);
return a !== void 0 ? typeof d == "string" ? o.fill(a, d) : o.fill(a) : o.fill(0), o;
}, l.allocUnsafe = function(n) {
if (typeof n != "number") throw new TypeError("Argument must be a number");
return A(n);
}, l.allocUnsafeSlow = function(n) {
if (typeof n != "number") throw new TypeError("Argument must be a number");
return e.SlowBuffer(n);
};
}, { buffer: 220 }], 218: [function(g, C, i) {
var e = g("safe-buffer").Buffer, A = e.isEncoding || function(b) {
switch ((b = "" + b) && b.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 !0;
default:
return !1;
}
};
function s(b) {
var u;
switch (this.encoding = function(m) {
var Z = function(p) {
if (!p) return "utf8";
for (var Y; ; ) switch (p) {
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 p;
default:
if (Y) return;
p = ("" + p).toLowerCase(), Y = !0;
}
}(m);
if (typeof Z != "string" && (e.isEncoding === A || !A(m))) throw new Error("Unknown encoding: " + m);
return Z || m;
}(b), this.encoding) {
case "utf16le":
this.text = a, this.end = d, u = 4;
break;
case "utf8":
this.fillLast = n, u = 4;
break;
case "base64":
this.text = o, this.end = c, u = 3;
break;
default:
return this.write = r, void (this.end = h);
}
this.lastNeed = 0, this.lastTotal = 0, this.lastChar = e.allocUnsafe(u);
}
function l(b) {
return b <= 127 ? 0 : b >> 5 == 6 ? 2 : b >> 4 == 14 ? 3 : b >> 3 == 30 ? 4 : b >> 6 == 2 ? -1 : -2;
}
function n(b) {
var u = this.lastTotal - this.lastNeed, m = function(Z, p, Y) {
if ((192 & p[0]) != 128) return Z.lastNeed = 0, "�";
if (Z.lastNeed > 1 && p.length > 1) {
if ((192 & p[1]) != 128) return Z.lastNeed = 1, "�";
if (Z.lastNeed > 2 && p.length > 2 && (192 & p[2]) != 128) return Z.lastNeed = 2, "�";
}
}(this, b);
return m !== void 0 ? m : this.lastNeed <= b.length ? (b.copy(this.lastChar, u, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal)) : (b.copy(this.lastChar, u, 0, b.length), void (this.lastNeed -= b.length));
}
function a(b, u) {
if ((b.length - u) % 2 == 0) {
var m = b.toString("utf16le", u);
if (m) {
var Z = m.charCodeAt(m.length - 1);
if (Z >= 55296 && Z <= 56319) return this.lastNeed = 2, this.lastTotal = 4, this.lastChar[0] = b[b.length - 2], this.lastChar[1] = b[b.length - 1], m.slice(0, -1);
}
return m;
}
return this.lastNeed = 1, this.lastTotal = 2, this.lastChar[0] = b[b.length - 1], b.toString("utf16le", u, b.length - 1);
}
function d(b) {
var u = b && b.length ? this.write(b) : "";
if (this.lastNeed) {
var m = this.lastTotal - this.lastNeed;
return u + this.lastChar.toString("utf16le", 0, m);
}
return u;
}
function o(b, u) {
var m = (b.length - u) % 3;
return m === 0 ? b.toString("base64", u) : (this.lastNeed = 3 - m, this.lastTotal = 3, m === 1 ? this.lastChar[0] = b[b.length - 1] : (this.lastChar[0] = b[b.length - 2], this.lastChar[1] = b[b.length - 1]), b.toString("base64", u, b.length - m));
}
function c(b) {
var u = b && b.length ? this.write(b) : "";
return this.lastNeed ? u + this.lastChar.toString("base64", 0, 3 - this.lastNeed) : u;
}
function r(b) {
return b.toString(this.encoding);
}
function h(b) {
return b && b.length ? this.write(b) : "";
}
i.StringDecoder = s, s.prototype.write = function(b) {
if (b.length === 0) return "";
var u, m;
if (this.lastNeed) {
if ((u = this.fillLast(b)) === void 0) return "";
m = this.lastNeed, this.lastNeed = 0;
} else m = 0;
return m < b.length ? u ? u + this.text(b, m) : this.text(b, m) : u || "";
}, s.prototype.end = function(b) {
var u = b && b.length ? this.write(b) : "";
return this.lastNeed ? u + "�" : u;
}, s.prototype.text = function(b, u) {
var m = function(p, Y, R) {
var X = Y.length - 1;
if (X < R) return 0;
var H = l(Y[X]);
return H >= 0 ? (H > 0 && (p.lastNeed = H - 1), H) : --X < R || H === -2 ? 0 : (H = l(Y[X])) >= 0 ? (H > 0 && (p.lastNeed = H - 2), H) : --X < R || H === -2 ? 0 : (H = l(Y[X])) >= 0 ? (H > 0 && (H === 2 ? H = 0 : p.lastNeed = H - 3), H) : 0;
}(this, b, u);
if (!this.lastNeed) return b.toString("utf8", u);
this.lastTotal = m;
var Z = b.length - (m - this.lastNeed);
return b.copy(this.lastChar, 0, Z), b.toString("utf8", u, Z);
}, s.prototype.fillLast = function(b) {
if (this.lastNeed <= b.length) return b.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed), this.lastChar.toString(this.encoding, 0, this.lastTotal);
b.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, b.length), this.lastNeed -= b.length;
};
}, { "safe-buffer": 217 }], 219: [function(g, C, i) {
(function(e) {
(function() {
C.exports = function(A, s) {
for (var l = Math.min(A.length, s.length), n = new e(l), a = 0; a < l; ++a) n[a] = A[a] ^ s[a];
return n;
};
}).call(this);
}).call(this, g("buffer").Buffer);
}, { buffer: 220 }], 220: [function(g, C, i) {
(function(e) {
(function() {
var A = g("base64-js"), s = g("ieee754");
i.Buffer = n, i.SlowBuffer = function(J) {
return +J != J && (J = 0), n.alloc(+J);
}, i.INSPECT_MAX_BYTES = 50;
function l(J) {
if (J > 2147483647) throw new RangeError('The value "' + J + '" is invalid for option "size"');
var k = new Uint8Array(J);
return k.__proto__ = n.prototype, k;
}
function n(J, k, j) {
if (typeof J == "number") {
if (typeof k == "string") throw new TypeError('The "string" argument must be of type string. Received type number');
return o(J);
}
return a(J, k, j);
}
function a(J, k, j) {
if (typeof J == "string") return function(Ig, x) {
if (typeof x == "string" && x !== "" || (x = "utf8"), !n.isEncoding(x)) throw new TypeError("Unknown encoding: " + x);
var Ag = 0 | h(Ig, x), eg = l(Ag), O = eg.write(Ig, x);
return O !== Ag && (eg = eg.slice(0, O)), eg;
}(J, k);
if (ArrayBuffer.isView(J)) return c(J);
if (J == null) throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof J);
if (L(J, ArrayBuffer) || J && L(J.buffer, ArrayBuffer)) return function(Ig, x, Ag) {
if (x < 0 || Ig.byteLength < x) throw new RangeError('"offset" is outside of buffer bounds');
if (Ig.byteLength < x + (Ag || 0)) throw new RangeError('"length" is outside of buffer bounds');
var eg;
return eg = x === void 0 && Ag === void 0 ? new Uint8Array(Ig) : Ag === void 0 ? new Uint8Array(Ig, x) : new Uint8Array(Ig, x, Ag), eg.__proto__ = n.prototype, eg;
}(J, k, j);
if (typeof J == "number") throw new TypeError('The "value" argument must not be of type number. Received type number');
var q = J.valueOf && J.valueOf();
if (q != null && q !== J) return n.from(q, k, j);
var Cg = function(Ig) {
if (n.isBuffer(Ig)) {
var x = 0 | r(Ig.length), Ag = l(x);
return Ag.length === 0 || Ig.copy(Ag, 0, 0, x), Ag;
}
if (Ig.length !== void 0) return typeof Ig.length != "number" || E(Ig.length) ? l(0) : c(Ig);
if (Ig.type === "Buffer" && Array.isArray(Ig.data)) return c(Ig.data);
}(J);
if (Cg) return Cg;
if (typeof Symbol < "u" && Symbol.toPrimitive != null && typeof J[Symbol.toPrimitive] == "function") return n.from(J[Symbol.toPrimitive]("string"), k, j);
throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type " + typeof J);
}
function d(J) {
if (typeof J != "number") throw new TypeError('"size" argument must be of type number');
if (J < 0) throw new RangeError('The value "' + J + '" is invalid for option "size"');
}
function o(J) {
return d(J), l(J < 0 ? 0 : 0 | r(J));
}
function c(J) {
for (var k = J.length < 0 ? 0 : 0 | r(J.length), j = l(k), q = 0; q < k; q += 1) j[q] = 255 & J[q];
return j;
}
function r(J) {
if (J >= 2147483647) throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x7fffffff bytes");
return 0 | J;
}
function h(J, k) {
if (n.isBuffer(J)) return J.length;
if (ArrayBuffer.isView(J) || L(J, ArrayBuffer)) return J.byteLength;
if (typeof J != "string") throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof J);
var j = J.length, q = arguments.length > 2 && arguments[2] === !0;
if (!q && j === 0) return 0;
for (var Cg = !1; ; ) switch (k) {
case "ascii":
case "latin1":
case "binary":
return j;
case "utf8":
case "utf-8":
return T(J).length;
case "ucs2":
case "ucs-2":
case "utf16le":
case "utf-16le":
return 2 * j;
case "hex":
return j >>> 1;
case "base64":
return Q(J).length;
default:
if (Cg) return q ? -1 : T(J).length;
k = ("" + k).toLowerCase(), Cg = !0;
}
}
function b(J, k, j) {
var q = !1;
if ((k === void 0 || k < 0) && (k = 0), k > this.length || ((j === void 0 || j > this.length) && (j = this.length), j <= 0) || (j >>>= 0) <= (k >>>= 0)) return "";
for (J || (J = "utf8"); ; ) switch (J) {
case "hex":
return N(this, k, j);
case "utf8":
case "utf-8":
return v(this, k, j);
case "ascii":
return K(this, k, j);
case "latin1":
case "binary":
return V(this, k, j);
case "base64":
return z(this, k, j);
case "ucs2":
case "ucs-2":
case "utf16le":
case "utf-16le":
return B(this, k, j);
default:
if (q) throw new TypeError("Unknown encoding: " + J);
J = (J + "").toLowerCase(), q = !0;
}
}
function u(J, k, j) {
var q = J[k];
J[k] = J[j], J[j] = q;
}
function m(J, k, j, q, Cg) {
if (J.length === 0) return -1;
if (typeof j == "string" ? (q = j, j = 0) : j > 2147483647 ? j = 2147483647 : j < -2147483648 && (j = -2147483648), E(j = +j) && (j = Cg ? 0 : J.length - 1), j < 0 && (j = J.length + j), j >= J.length) {
if (Cg) return -1;
j = J.length - 1;
} else if (j < 0) {
if (!Cg) return -1;
j = 0;
}
if (typeof k == "string" && (k = n.from(k, q)), n.isBuffer(k)) return k.length === 0 ? -1 : Z(J, k, j, q, Cg);
if (typeof k == "number") return k &= 255, typeof Uint8Array.prototype.indexOf == "function" ? Cg ? Uint8Array.prototype.indexOf.call(J, k, j) : Uint8Array.prototype.lastIndexOf.call(J, k, j) : Z(J, [k], j, q, Cg);
throw new TypeError("val must be string, number or Buffer");
}
function Z(J, k, j, q, Cg) {
var Ig, x = 1, Ag = J.length, eg = k.length;
if (q !== void 0 && ((q = String(q).toLowerCase()) === "ucs2" || q === "ucs-2" || q === "utf16le" || q === "utf-16le")) {
if (J.length < 2 || k.length < 2) return -1;
x = 2, Ag /= 2, eg /= 2, j /= 2;
}
function O(ng, sg) {
return x === 1 ? ng[sg] : ng.readUInt16BE(sg * x);
}
if (Cg) {
var _ = -1;
for (Ig = j; Ig < Ag; Ig++) if (O(J, Ig) === O(k, _ === -1 ? 0 : Ig - _)) {
if (_ === -1 && (_ = Ig), Ig - _ + 1 === eg) return _ * x;
} else _ !== -1 && (Ig -= Ig - _), _ = -1;
} else for (j + eg > Ag && (j = Ag - eg), Ig = j; Ig >= 0; Ig--) {
for (var gg = !0, lg = 0; lg < eg; lg++) if (O(J, Ig + lg) !== O(k, lg)) {
gg = !1;
break;
}
if (gg) return Ig;
}
return -1;
}
function p(J, k, j, q) {
j = Number(j) || 0;
var Cg = J.length - j;
q ? (q = Number(q)) > Cg && (q = Cg) : q = Cg;
var Ig = k.length;
q > Ig / 2 && (q = Ig / 2);
for (var x = 0; x < q; ++x) {
var Ag = parseInt(k.substr(2 * x, 2), 16);
if (E(Ag)) return x;
J[j + x] = Ag;
}
return x;
}
function Y(J, k, j, q) {
return P(T(k, J.length - j), J, j, q);
}
function R(J, k, j, q) {
return P(function(Cg) {
for (var Ig = [], x = 0; x < Cg.length; ++x) Ig.push(255 & Cg.charCodeAt(x));
return Ig;
}(k), J, j, q);
}
function X(J, k, j, q) {
return R(J, k, j, q);
}
function H(J, k, j, q) {
return P(Q(k), J, j, q);
}
function S(J, k, j, q) {
return P(function(Cg, Ig) {
for (var x, Ag, eg, O = [], _ = 0; _ < Cg.length && !((Ig -= 2) < 0); ++_) x = Cg.charCodeAt(_), Ag = x >> 8, eg = x % 256, O.push(eg), O.push(Ag);
return O;
}(k, J.length - j), J, j, q);
}
function z(J, k, j) {
return k === 0 && j === J.length ? A.fromByteArray(J) : A.fromByteArray(J.slice(k, j));
}
function v(J, k, j) {
j = Math.min(J.length, j);
for (var q = [], Cg = k; Cg < j; ) {
var Ig, x, Ag, eg, O = J[Cg], _ = null, gg = O > 239 ? 4 : O > 223 ? 3 : O > 191 ? 2 : 1;
if (Cg + gg <= j) switch (gg) {
case 1:
O < 128 && (_ = O);
break;
case 2:
(192 & (Ig = J[Cg + 1])) == 128 && (eg = (31 & O) << 6 | 63 & Ig) > 127 && (_ = eg);
break;
case 3:
Ig = J[Cg + 1], x = J[Cg + 2], (192 & Ig) == 128 && (192 & x) == 128 && (eg = (15 & O) << 12 | (63 & Ig) << 6 | 63 & x) > 2047 && (eg < 55296 || eg > 57343) && (_ = eg);
break;
case 4:
Ig = J[Cg + 1], x = J[Cg + 2], Ag = J[Cg + 3], (192 & Ig) == 128 && (192 & x) == 128 && (192 & Ag) == 128 && (eg = (15 & O) << 18 | (63 & Ig) << 12 | (63 & x) << 6 | 63 & Ag) > 65535 && eg < 1114112 && (_ = eg);
}
_ === null ? (_ = 65533, gg = 1) : _ > 65535 && (_ -= 65536, q.push(_ >>> 10 & 1023 | 55296), _ = 56320 | 1023 & _), q.push(_), Cg += gg;
}
return function(lg) {
var ng = lg.length;
if (ng <= 4096) return String.fromCharCode.apply(String, lg);
for (var sg = "", og = 0; og < ng; ) sg += String.fromCharCode.apply(String, lg.slice(og, og += 4096));
return sg;
}(q);
}
i.kMaxLength = 2147483647, n.TYPED_ARRAY_SUPPORT = function() {
try {
var J = new Uint8Array(1);
return J.__proto__ = { __proto__: Uint8Array.prototype, foo: function() {
return 42;
} }, J.foo() === 42;
} catch {
return !1;
}
}(), n.TYPED_ARRAY_SUPPORT || typeof console > "u" || 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."), Object.defineProperty(n.prototype, "parent", { enumerable: !0, get: function() {
if (n.isBuffer(this)) return this.buffer;
} }), Object.defineProperty(n.prototype, "offset", { enumerable: !0, get: function() {
if (n.isBuffer(this)) return this.byteOffset;
} }), typeof Symbol < "u" && Symbol.species != null && n[Symbol.species] === n && Object.defineProperty(n, Symbol.species, { value: null, configurable: !0, enumerable: !1, writable: !1 }), n.poolSize = 8192, n.from = function(J, k, j) {
return a(J, k, j);
}, n.prototype.__proto__ = Uint8Array.prototype, n.__proto__ = Uint8Array, n.alloc = function(J, k, j) {
return function(q, Cg, Ig) {
return d(q), q <= 0 ? l(q) : Cg !== void 0 ? typeof Ig == "string" ? l(q).fill(Cg, Ig) : l(q).fill(Cg) : l(q);
}(J, k, j);
}, n.allocUnsafe = function(J) {
return o(J);
}, n.allocUnsafeSlow = function(J) {
return o(J);
}, n.isBuffer = function(J) {
return J != null && J._isBuffer === !0 && J !== n.prototype;
}, n.compare = function(J, k) {
if (L(J, Uint8Array) && (J = n.from(J, J.offset, J.byteLength)), L(k, Uint8Array) && (k = n.from(k, k.offset, k.byteLength)), !n.isBuffer(J) || !n.isBuffer(k)) throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');
if (J === k) return 0;
for (var j = J.length, q = k.length, Cg = 0, Ig = Math.min(j, q); Cg < Ig; ++Cg) if (J[Cg] !== k[Cg]) {
j = J[Cg], q = k[Cg];
break;
}
return j < q ? -1 : q < j ? 1 : 0;
}, n.isEncoding = function(J) {
switch (String(J).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 !0;
default:
return !1;
}
}, n.concat = function(J, k) {
if (!Array.isArray(J)) throw new TypeError('"list" argument must be an Array of Buffers');
if (J.length === 0) return n.alloc(0);
var j;
if (k === void 0) for (k = 0, j = 0; j < J.length; ++j) k += J[j].length;
var q = n.allocUnsafe(k), Cg = 0;
for (j = 0; j < J.length; ++j) {
var Ig = J[j];
if (L(Ig, Uint8Array) && (Ig = n.from(Ig)), !n.isBuffer(Ig)) throw new TypeError('"list" argument must be an Array of Buffers');
Ig.copy(q, Cg), Cg += Ig.length;
}
return q;
}, n.byteLength = h, n.prototype._isBuffer = !0, n.prototype.swap16 = function() {
var J = this.length;
if (J % 2 != 0) throw new RangeError("Buffer size must be a multiple of 16-bits");
for (var k = 0; k < J; k += 2) u(this, k, k + 1);
return this;
}, n.prototype.swap32 = function() {
var J = this.length;
if (J % 4 != 0) throw new RangeError("Buffer size must be a multiple of 32-bits");
for (var k = 0; k < J; k += 4) u(this, k, k + 3), u(this, k + 1, k + 2);
return this;
}, n.prototype.swap64 = function() {
var J = this.length;
if (J % 8 != 0) throw new RangeError("Buffer size must be a multiple of 64-bits");
for (var k = 0; k < J; k += 8) u(this, k, k + 7), u(this, k + 1, k + 6), u(this, k + 2, k + 5), u(this, k + 3, k + 4);
return this;
}, n.prototype.toString = function() {
var J = this.length;
return J === 0 ? "" : arguments.length === 0 ? v(this, 0, J) : b.apply(this, arguments);
}, n.prototype.toLocaleString = n.prototype.toString, n.prototype.equals = function(J) {
if (!n.isBuffer(J)) throw new TypeError("Argument must be a Buffer");
return this === J || n.compare(this, J) === 0;
}, n.prototype.inspect = function() {
var J = "", k = i.INSPECT_MAX_BYTES;
return J = this.toString("hex", 0, k).replace(/(.{2})/g, "$1 ").trim(), this.length > k && (J += " ... "), "";
}, n.prototype.compare = function(J, k, j, q, Cg) {
if (L(J, Uint8Array) && (J = n.from(J, J.offset, J.byteLength)), !n.isBuffer(J)) throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type ' + typeof J);
if (k === void 0 && (k = 0), j === void 0 && (j = J ? J.length : 0), q === void 0 && (q = 0), Cg === void 0 && (Cg = this.length), k < 0 || j > J.length || q < 0 || Cg > this.length) throw new RangeError("out of range index");
if (q >= Cg && k >= j) return 0;
if (q >= Cg) return -1;
if (k >= j) return 1;
if (this === J) return 0;
for (var Ig = (Cg >>>= 0) - (q >>>= 0), x = (j >>>= 0) - (k >>>= 0), Ag = Math.min(Ig, x), eg = this.slice(q, Cg), O = J.slice(k, j), _ = 0; _ < Ag; ++_) if (eg[_] !== O[_]) {
Ig = eg[_], x = O[_];
break;
}
return Ig < x ? -1 : x < Ig ? 1 : 0;
}, n.prototype.includes = function(J, k, j) {
return this.indexOf(J, k, j) !== -1;
}, n.prototype.indexOf = function(J, k, j) {
return m(this, J, k, j, !0);
}, n.prototype.lastIndexOf = function(J, k, j) {
return m(this, J, k, j, !1);
}, n.prototype.write = function(J, k, j, q) {
if (k === void 0) q = "utf8", j = this.length, k = 0;
else if (j === void 0 && typeof k == "string") q = k, j = this.length, k = 0;
else {
if (!isFinite(k)) throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");
k >>>= 0, isFinite(j) ? (j >>>= 0, q === void 0 && (q = "utf8")) : (q = j, j = void 0);
}
var Cg = this.length - k;
if ((j === void 0 || j > Cg) && (j = Cg), J.length > 0 && (j < 0 || k < 0) || k > this.length) throw new RangeError("Attempt to write outside buffer bounds");
q || (q = "utf8");
for (var Ig = !1; ; ) switch (q) {
case "hex":
return p(this, J, k, j);
case "utf8":
case "utf-8":
return Y(this, J, k, j);
case "ascii":
return R(this, J, k, j);
case "latin1":
case "binary":
return X(this, J, k, j);
case "base64":
return H(this, J, k, j);
case "ucs2":
case "ucs-2":
case "utf16le":
case "utf-16le":
return S(this, J, k, j);
default:
if (Ig) throw new TypeError("Unknown encoding: " + q);
q = ("" + q).toLowerCase(), Ig = !0;
}
}, n.prototype.toJSON = function() {
return { type: "Buffer", data: Array.prototype.slice.call(this._arr || this, 0) };
};
function K(J, k, j) {
var q = "";
j = Math.min(J.length, j);
for (var Cg = k; Cg < j; ++Cg) q += String.fromCharCode(127 & J[Cg]);
return q;
}
function V(J, k, j) {
var q = "";
j = Math.min(J.length, j);
for (var Cg = k; Cg < j; ++Cg) q += String.fromCharCode(J[Cg]);
return q;
}
function N(J, k, j) {
var q = J.length;
(!k || k < 0) && (k = 0), (!j || j < 0 || j > q) && (j = q);
for (var Cg = "", Ig = k; Ig < j; ++Ig) Cg += F(J[Ig]);
return Cg;
}
function B(J, k, j) {
for (var q = J.slice(k, j), Cg = "", Ig = 0; Ig < q.length; Ig += 2) Cg += String.fromCharCode(q[Ig] + 256 * q[Ig + 1]);
return Cg;
}
function G(J, k, j) {
if (J % 1 != 0 || J < 0) throw new RangeError("offset is not uint");
if (J + k > j) throw new RangeError("Trying to access beyond buffer length");
}
function w(J, k, j, q, Cg, Ig) {
if (!n.isBuffer(J)) throw new TypeError('"buffer" argument must be a Buffer instance');
if (k > Cg || k < Ig) throw new RangeError('"value" argument is out of bounds');
if (j + q > J.length) throw new RangeError("Index out of range");
}
function W(J, k, j, q, Cg, Ig) {
if (j + q > J.length) throw new RangeError("Index out of range");
if (j < 0) throw new RangeError("Index out of range");
}
function y(J, k, j, q, Cg) {
return k = +k, j >>>= 0, Cg || W(J, 0, j, 4), s.write(J, k, j, q, 23, 4), j + 4;
}
function f(J, k, j, q, Cg) {
return k = +k, j >>>= 0, Cg || W(J, 0, j, 8), s.write(J, k, j, q, 52, 8), j + 8;
}
n.prototype.slice = function(J, k) {
var j = this.length;
(J = ~~J) < 0 ? (J += j) < 0 && (J = 0) : J > j && (J = j), (k = k === void 0 ? j : ~~k) < 0 ? (k += j) < 0 && (k = 0) : k > j && (k = j), k < J && (k = J);
var q = this.subarray(J, k);
return q.__proto__ = n.prototype, q;
}, n.prototype.readUIntLE = function(J, k, j) {
J >>>= 0, k >>>= 0, j || G(J, k, this.length);
for (var q = this[J], Cg = 1, Ig = 0; ++Ig < k && (Cg *= 256); ) q += this[J + Ig] * Cg;
return q;
}, n.prototype.readUIntBE = function(J, k, j) {
J >>>= 0, k >>>= 0, j || G(J, k, this.length);
for (var q = this[J + --k], Cg = 1; k > 0 && (Cg *= 256); ) q += this[J + --k] * Cg;
return q;
}, n.prototype.readUInt8 = function(J, k) {
return J >>>= 0, k || G(J, 1, this.length), this[J];
}, n.prototype.readUInt16LE = function(J, k) {
return J >>>= 0, k || G(J, 2, this.length), this[J] | this[J + 1] << 8;
}, n.prototype.readUInt16BE = function(J, k) {
return J >>>= 0, k || G(J, 2, this.length), this[J] << 8 | this[J + 1];
}, n.prototype.readUInt32LE = function(J, k) {
return J >>>= 0, k || G(J, 4, this.length), (this[J] | this[J + 1] << 8 | this[J + 2] << 16) + 16777216 * this[J + 3];
}, n.prototype.readUInt32BE = function(J, k) {
return J >>>= 0, k || G(J, 4, this.length), 16777216 * this[J] + (this[J + 1] << 16 | this[J + 2] << 8 | this[J + 3]);
}, n.prototype.readIntLE = function(J, k, j) {
J >>>= 0, k >>>= 0, j || G(J, k, this.length);
for (var q = this[J], Cg = 1, Ig = 0; ++Ig < k && (Cg *= 256); ) q += this[J + Ig] * Cg;
return q >= (Cg *= 128) && (q -= Math.pow(2, 8 * k)), q;
}, n.prototype.readIntBE = function(J, k, j) {
J >>>= 0, k >>>= 0, j || G(J, k, this.length);
for (var q = k, Cg = 1, Ig = this[J + --q]; q > 0 && (Cg *= 256); ) Ig += this[J + --q] * Cg;
return Ig >= (Cg *= 128) && (Ig -= Math.pow(2, 8 * k)), Ig;
}, n.prototype.readInt8 = function(J, k) {
return J >>>= 0, k || G(J, 1, this.length), 128 & this[J] ? -1 * (255 - this[J] + 1) : this[J];
}, n.prototype.readInt16LE = function(J, k) {
J >>>= 0, k || G(J, 2, this.length);
var j = this[J] | this[J + 1] << 8;
return 32768 & j ? 4294901760 | j : j;
}, n.prototype.readInt16BE = function(J, k) {
J >>>= 0, k || G(J, 2, this.length);
var j = this[J + 1] | this[J] << 8;
return 32768 & j ? 4294901760 | j : j;
}, n.prototype.readInt32LE = function(J, k) {
return J >>>= 0, k || G(J, 4, this.length), this[J] | this[J + 1] << 8 | this[J + 2] << 16 | this[J + 3] << 24;
}, n.prototype.readInt32BE = function(J, k) {
return J >>>= 0, k || G(J, 4, this.length), this[J] << 24 | this[J + 1] << 16 | this[J + 2] << 8 | this[J + 3];
}, n.prototype.readFloatLE = function(J, k) {
return J >>>= 0, k || G(J, 4, this.length), s.read(this, J, !0, 23, 4);
}, n.prototype.readFloatBE = function(J, k) {
return J >>>= 0, k || G(J, 4, this.length), s.read(this, J, !1, 23, 4);
}, n.prototype.readDoubleLE = function(J, k) {
return J >>>= 0, k || G(J, 8, this.length), s.read(this, J, !0, 52, 8);
}, n.prototype.readDoubleBE = function(J, k) {
return J >>>= 0, k || G(J, 8, this.length), s.read(this, J, !1, 52, 8);
}, n.prototype.writeUIntLE = function(J, k, j, q) {
J = +J, k >>>= 0, j >>>= 0, q || w(this, J, k, j, Math.pow(2, 8 * j) - 1, 0);
var Cg = 1, Ig = 0;
for (this[k] = 255 & J; ++Ig < j && (Cg *= 256); ) this[k + Ig] = J / Cg & 255;
return k + j;
}, n.prototype.writeUIntBE = function(J, k, j, q) {
J = +J, k >>>= 0, j >>>= 0, q || w(this, J, k, j, Math.pow(2, 8 * j) - 1, 0);
var Cg = j - 1, Ig = 1;
for (this[k + Cg] = 255 & J; --Cg >= 0 && (Ig *= 256); ) this[k + Cg] = J / Ig & 255;
return k + j;
}, n.prototype.writeUInt8 = function(J, k, j) {
return J = +J, k >>>= 0, j || w(this, J, k, 1, 255, 0), this[k] = 255 & J, k + 1;
}, n.prototype.writeUInt16LE = function(J, k, j) {
return J = +J, k >>>= 0, j || w(this, J, k, 2, 65535, 0), this[k] = 255 & J, this[k + 1] = J >>> 8, k + 2;
}, n.prototype.writeUInt16BE = function(J, k, j) {
return J = +J, k >>>= 0, j || w(this, J, k, 2, 65535, 0), this[k] = J >>> 8, this[k + 1] = 255 & J, k + 2;
}, n.prototype.writeUInt32LE = function(J, k, j) {
return J = +J, k >>>= 0, j || w(this, J, k, 4, 4294967295, 0), this[k + 3] = J >>> 24, this[k + 2] = J >>> 16, this[k + 1] = J >>> 8, this[k] = 255 & J, k + 4;
}, n.prototype.writeUInt32BE = function(J, k, j) {
return J = +J, k >>>= 0, j || w(this, J, k, 4, 4294967295, 0), this[k] = J >>> 24, this[k + 1] = J >>> 16, this[k + 2] = J >>> 8, this[k + 3] = 255 & J, k + 4;
}, n.prototype.writeIntLE = function(J, k, j, q) {
if (J = +J, k >>>= 0, !q) {
var Cg = Math.pow(2, 8 * j - 1);
w(this, J, k, j, Cg - 1, -Cg);
}
var Ig = 0, x = 1, Ag = 0;
for (this[k] = 255 & J; ++Ig < j && (x *= 256); ) J < 0 && Ag === 0 && this[k + Ig - 1] !== 0 && (Ag = 1), this[k + Ig] = (J / x >> 0) - Ag & 255;
return k + j;
}, n.prototype.writeIntBE = function(J, k, j, q) {
if (J = +J, k >>>= 0, !q) {
var Cg = Math.pow(2, 8 * j - 1);
w(this, J, k, j, Cg - 1, -Cg);
}
var Ig = j - 1, x = 1, Ag = 0;
for (this[k + Ig] = 255 & J; --Ig >= 0 && (x *= 256); ) J < 0 && Ag === 0 && this[k + Ig + 1] !== 0 && (Ag = 1), this[k + Ig] = (J / x >> 0) - Ag & 255;
return k + j;
}, n.prototype.writeInt8 = function(J, k, j) {
return J = +J, k >>>= 0, j || w(this, J, k, 1, 127, -128), J < 0 && (J = 255 + J + 1), this[k] = 255 & J, k + 1;
}, n.prototype.writeInt16LE = function(J, k, j) {
return J = +J, k >>>= 0, j || w(this, J, k, 2, 32767, -32768), this[k] = 255 & J, this[k + 1] = J >>> 8, k + 2;
}, n.prototype.writeInt16BE = function(J, k, j) {
return J = +J, k >>>= 0, j || w(this, J, k, 2, 32767, -32768), this[k] = J >>> 8, this[k + 1] = 255 & J, k + 2;
}, n.prototype.writeInt32LE = function(J, k, j) {
return J = +J, k >>>= 0, j || w(this, J, k, 4, 2147483647, -2147483648), this[k] = 255 & J, this[k + 1] = J >>> 8, this[k + 2] = J >>> 16, this[k + 3] = J >>> 24, k + 4;
}, n.prototype.writeInt32BE = function(J, k, j) {
return J = +J, k >>>= 0, j || w(this, J, k, 4, 2147483647, -2147483648), J < 0 && (J = 4294967295 + J + 1), this[k] = J >>> 24, this[k + 1] = J >>> 16, this[k + 2] = J >>> 8, this[k + 3] = 255 & J, k + 4;
}, n.prototype.writeFloatLE = function(J, k, j) {
return y(this, J, k, !0, j);
}, n.prototype.writeFloatBE = function(J, k, j) {
return y(this, J, k, !1, j);
}, n.prototype.writeDoubleLE = function(J, k, j) {
return f(this, J, k, !0, j);
}, n.prototype.writeDoubleBE = function(J, k, j) {
return f(this, J, k, !1, j);
}, n.prototype.copy = function(J, k, j, q) {
if (!n.isBuffer(J)) throw new TypeError("argument should be a Buffer");
if (j || (j = 0), q || q === 0 || (q = this.length), k >= J.length && (k = J.length), k || (k = 0), q > 0 && q < j && (q = j), q === j || J.length === 0 || this.length === 0) return 0;
if (k < 0) throw new RangeError("targetStart out of bounds");
if (j < 0 || j >= this.length) throw new RangeError("Index out of range");
if (q < 0) throw new RangeError("sourceEnd out of bounds");
q > this.length && (q = this.length), J.length - k < q - j && (q = J.length - k + j);
var Cg = q - j;
if (this === J && typeof Uint8Array.prototype.copyWithin == "function") this.copyWithin(k, j, q);
else if (this === J && j < k && k < q) for (var Ig = Cg - 1; Ig >= 0; --Ig) J[Ig + k] = this[Ig + j];
else Uint8Array.prototype.set.call(J, this.subarray(j, q), k);
return Cg;
}, n.prototype.fill = function(J, k, j, q) {
if (typeof J == "string") {
if (typeof k == "string" ? (q = k, k = 0, j = this.length) : typeof j == "string" && (q = j, j = this.length), q !== void 0 && typeof q != "string") throw new TypeError("encoding must be a string");
if (typeof q == "string" && !n.isEncoding(q)) throw new TypeError("Unknown encoding: " + q);
if (J.length === 1) {
var Cg = J.charCodeAt(0);
(q === "utf8" && Cg < 128 || q === "latin1") && (J = Cg);
}
} else typeof J == "number" && (J &= 255);
if (k < 0 || this.length < k || this.length < j) throw new RangeError("Out of range index");
if (j <= k) return this;
var Ig;
if (k >>>= 0, j = j === void 0 ? this.length : j >>> 0, J || (J = 0), typeof J == "number") for (Ig = k; Ig < j; ++Ig) this[Ig] = J;
else {
var x = n.isBuffer(J) ? J : n.from(J, q), Ag = x.length;
if (Ag === 0) throw new TypeError('The value "' + J + '" is invalid for argument "value"');
for (Ig = 0; Ig < j - k; ++Ig) this[Ig + k] = x[Ig % Ag];
}
return this;
};
var D = /[^+/0-9A-Za-z-_]/g;
function F(J) {
return J < 16 ? "0" + J.toString(16) : J.toString(16);
}
function T(J, k) {
var j;
k = k || 1 / 0;
for (var q = J.length, Cg = null, Ig = [], x = 0; x < q; ++x) {
if ((j = J.charCodeAt(x)) > 55295 && j < 57344) {
if (!Cg) {
if (j > 56319) {
(k -= 3) > -1 && Ig.push(239, 191, 189);
continue;
}
if (x + 1 === q) {
(k -= 3) > -1 && Ig.push(239, 191, 189);
continue;
}
Cg = j;
continue;
}
if (j < 56320) {
(k -= 3) > -1 && Ig.push(239, 191, 189), Cg = j;
continue;
}
j = 65536 + (Cg - 55296 << 10 | j - 56320);
} else Cg && (k -= 3) > -1 && Ig.push(239, 191, 189);
if (Cg = null, j < 128) {
if ((k -= 1) < 0) break;
Ig.push(j);
} else if (j < 2048) {
if ((k -= 2) < 0) break;
Ig.push(j >> 6 | 192, 63 & j | 128);
} else if (j < 65536) {
if ((k -= 3) < 0) break;
Ig.push(j >> 12 | 224, j >> 6 & 63 | 128, 63 & j | 128);
} else {
if (!(j < 1114112)) throw new Error("Invalid code point");
if ((k -= 4) < 0) break;
Ig.push(j >> 18 | 240, j >> 12 & 63 | 128, j >> 6 & 63 | 128, 63 & j | 128);
}
}
return Ig;
}
function Q(J) {
return A.toByteArray(function(k) {
if ((k = (k = k.split("=")[0]).trim().replace(D, "")).length < 2) return "";
for (; k.length % 4 != 0; ) k += "=";
return k;
}(J));
}
function P(J, k, j, q) {
for (var Cg = 0; Cg < q && !(Cg + j >= k.length || Cg >= J.length); ++Cg) k[Cg + j] = J[Cg];
return Cg;
}
function L(J, k) {
return J instanceof k || J != null && J.constructor != null && J.constructor.name != null && J.constructor.name === k.name;
}
function E(J) {
return J != J;
}
}).call(this);
}).call(this, g("buffer").Buffer);
}, { "base64-js": 185, buffer: 220, ieee754: 439 }], 221: [function(g, C, i) {
var e = g("safe-buffer").Buffer, A = g("stream").Transform, s = g("string_decoder").StringDecoder;
function l(n) {
A.call(this), this.hashMode = typeof n == "string", this.hashMode ? this[n] = this._finalOrDigest : this.final = this._finalOrDigest, this._final && (this.__final = this._final, this._final = null), this._decoder = null, this._encoding = null;
}
g("inherits")(l, A), l.prototype.update = function(n, a, d) {
typeof n == "string" && (n = e.from(n, a));
var o = this._update(n);
return this.hashMode ? this : (d && (o = this._toString(o, d)), o);
}, l.prototype.setAutoPadding = function() {
}, l.prototype.getAuthTag = function() {
throw new Error("trying to get auth tag in unsupported state");
}, l.prototype.setAuthTag = function() {
throw new Error("trying to set auth tag in unsupported state");
}, l.prototype.setAAD = function() {
throw new Error("trying to set aad in unsupported state");
}, l.prototype._transform = function(n, a, d) {
var o;
try {
this.hashMode ? this._update(n) : this.push(this._update(n));
} catch (c) {
o = c;
} finally {
d(o);
}
}, l.prototype._flush = function(n) {
var a;
try {
this.push(this.__final());
} catch (d) {
a = d;
}
n(a);
}, l.prototype._finalOrDigest = function(n) {
var a = this.__final() || e.alloc(0);
return n && (a = this._toString(a, n, !0)), a;
}, l.prototype._toString = function(n, a, d) {
if (this._decoder || (this._decoder = new s(a), this._encoding = a), this._encoding !== a) throw new Error("can't switch encodings");
var o = this._decoder.write(n);
return d && (o += this._decoder.end()), o;
}, C.exports = l;
}, { inherits: 440, "safe-buffer": 494, stream: 505, string_decoder: 218 }], 222: [function(g, C, i) {
var e = g("../internals/is-callable"), A = g("../internals/try-to-string"), s = TypeError;
C.exports = function(l) {
if (e(l)) return l;
throw new s(A(l) + " is not a function");
};
}, { "../internals/is-callable": 285, "../internals/try-to-string": 349 }], 223: [function(g, C, i) {
var e = g("../internals/is-constructor"), A = g("../internals/try-to-string"), s = TypeError;
C.exports = function(l) {
if (e(l)) return l;
throw new s(A(l) + " is not a constructor");
};
}, { "../internals/is-constructor": 286, "../internals/try-to-string": 349 }], 224: [function(g, C, i) {
var e = g("../internals/is-callable"), A = String, s = TypeError;
C.exports = function(l) {
if (typeof l == "object" || e(l)) return l;
throw new s("Can't set " + A(l) + " as a prototype");
};
}, { "../internals/is-callable": 285 }], 225: [function(g, C, i) {
var e = g("../internals/well-known-symbol"), A = g("../internals/object-create"), s = g("../internals/object-define-property").f, l = e("unscopables"), n = Array.prototype;
n[l] === void 0 && s(n, l, { configurable: !0, value: A(null) }), C.exports = function(a) {
n[l][a] = !0;
};
}, { "../internals/object-create": 306, "../internals/object-define-property": 308, "../internals/well-known-symbol": 357 }], 226: [function(g, C, i) {
var e = g("../internals/object-is-prototype-of"), A = TypeError;
C.exports = function(s, l) {
if (e(l, s)) return s;
throw new A("Incorrect invocation");
};
}, { "../internals/object-is-prototype-of": 314 }], 227: [function(g, C, i) {
var e = g("../internals/is-object"), A = String, s = TypeError;
C.exports = function(l) {
if (e(l)) return l;
throw new s(A(l) + " is not an object");
};
}, { "../internals/is-object": 289 }], 228: [function(g, C, i) {
var e = g("../internals/to-indexed-object"), A = g("../internals/to-absolute-index"), s = g("../internals/length-of-array-like"), l = function(n) {
return function(a, d, o) {
var c, r = e(a), h = s(r), b = A(o, h);
if (n && d != d) {
for (; h > b; ) if ((c = r[b++]) != c) return !0;
} else for (; h > b; b++) if ((n || b in r) && r[b] === d) return n || b || 0;
return !n && -1;
};
};
C.exports = { includes: l(!0), indexOf: l(!1) };
}, { "../internals/length-of-array-like": 299, "../internals/to-absolute-index": 340, "../internals/to-indexed-object": 341 }], 229: [function(g, C, i) {
var e = g("../internals/function-bind-context"), A = g("../internals/function-uncurry-this"), s = g("../internals/indexed-object"), l = g("../internals/to-object"), n = g("../internals/length-of-array-like"), a = g("../internals/array-species-create"), d = A([].push), o = function(c) {
var r = c === 1, h = c === 2, b = c === 3, u = c === 4, m = c === 6, Z = c === 7, p = c === 5 || m;
return function(Y, R, X, H) {
for (var S, z, v = l(Y), K = s(v), V = e(R, X), N = n(K), B = 0, G = H || a, w = r ? G(Y, N) : h || Z ? G(Y, 0) : void 0; N > B; B++) if ((p || B in K) && (z = V(S = K[B], B, v), c)) if (r) w[B] = z;
else if (z) switch (c) {
case 3:
return !0;
case 5:
return S;
case 6:
return B;
case 2:
d(w, S);
}
else switch (c) {
case 4:
return !1;
case 7:
d(w, S);
}
return m ? -1 : b || u ? u : w;
};
};
C.exports = { forEach: o(0), map: o(1), filter: o(2), some: o(3), every: o(4), find: o(5), findIndex: o(6), filterReject: o(7) };
}, { "../internals/array-species-create": 233, "../internals/function-bind-context": 262, "../internals/function-uncurry-this": 268, "../internals/indexed-object": 280, "../internals/length-of-array-like": 299, "../internals/to-object": 344 }], 230: [function(g, C, i) {
var e = g("../internals/to-absolute-index"), A = g("../internals/length-of-array-like"), s = g("../internals/create-property"), l = Array, n = Math.max;
C.exports = function(a, d, o) {
for (var c = A(a), r = e(d, c), h = e(o === void 0 ? c : o, c), b = l(n(h - r, 0)), u = 0; r < h; r++, u++) s(b, u, a[r]);
return b.length = u, b;
};
}, { "../internals/create-property": 243, "../internals/length-of-array-like": 299, "../internals/to-absolute-index": 340 }], 231: [function(g, C, i) {
var e = g("../internals/function-uncurry-this");
C.exports = e([].slice);
}, { "../internals/function-uncurry-this": 268 }], 232: [function(g, C, i) {
var e = g("../internals/is-array"), A = g("../internals/is-constructor"), s = g("../internals/is-object"), l = g("../internals/well-known-symbol")("species"), n = Array;
C.exports = function(a) {
var d;
return e(a) && (d = a.constructor, (A(d) && (d === n || e(d.prototype)) || s(d) && (d = d[l]) === null) && (d = void 0)), d === void 0 ? n : d;
};
}, { "../internals/is-array": 284, "../internals/is-constructor": 286, "../internals/is-object": 289, "../internals/well-known-symbol": 357 }], 233: [function(g, C, i) {
var e = g("../internals/array-species-constructor");
C.exports = function(A, s) {
return new (e(A))(s === 0 ? 0 : s);
};
}, { "../internals/array-species-constructor": 232 }], 234: [function(g, C, i) {
var e = g("../internals/well-known-symbol")("iterator"), A = !1;
try {
var s = 0, l = { next: function() {
return { done: !!s++ };
}, return: function() {
A = !0;
} };
l[e] = function() {
return this;
}, Array.from(l, function() {
throw 2;
});
} catch {
}
C.exports = function(n, a) {
try {
if (!a && !A) return !1;
} catch {
return !1;
}
var d = !1;
try {
var o = {};
o[e] = function() {
return { next: function() {
return { done: d = !0 };
} };
}, n(o);
} catch {
}
return d;
};
}, { "../internals/well-known-symbol": 357 }], 235: [function(g, C, i) {
var e = g("../internals/function-uncurry-this"), A = e({}.toString), s = e("".slice);
C.exports = function(l) {
return s(A(l), 8, -1);
};
}, { "../internals/function-uncurry-this": 268 }], 236: [function(g, C, i) {
var e = g("../internals/to-string-tag-support"), A = g("../internals/is-callable"), s = g("../internals/classof-raw"), l = g("../internals/well-known-symbol")("toStringTag"), n = Object, a = s(/* @__PURE__ */ function() {
return arguments;
}()) === "Arguments";
C.exports = e ? s : function(d) {
var o, c, r;
return d === void 0 ? "Undefined" : d === null ? "Null" : typeof (c = function(h, b) {
try {
return h[b];
} catch {
}
}(o = n(d), l)) == "string" ? c : a ? s(o) : (r = s(o)) === "Object" && A(o.callee) ? "Arguments" : r;
};
}, { "../internals/classof-raw": 235, "../internals/is-callable": 285, "../internals/to-string-tag-support": 347, "../internals/well-known-symbol": 357 }], 237: [function(g, C, i) {
var e = g("../internals/has-own-property"), A = g("../internals/own-keys"), s = g("../internals/object-get-own-property-descriptor"), l = g("../internals/object-define-property");
C.exports = function(n, a, d) {
for (var o = A(a), c = l.f, r = s.f, h = 0; h < o.length; h++) {
var b = o[h];
e(n, b) || d && e(d, b) || c(n, b, r(a, b));
}
};
}, { "../internals/has-own-property": 275, "../internals/object-define-property": 308, "../internals/object-get-own-property-descriptor": 309, "../internals/own-keys": 321 }], 238: [function(g, C, i) {
var e = g("../internals/well-known-symbol")("match");
C.exports = function(A) {
var s = /./;
try {
"/./"[A](s);
} catch {
try {
return s[e] = !1, "/./"[A](s);
} catch {
}
}
return !1;
};
}, { "../internals/well-known-symbol": 357 }], 239: [function(g, C, i) {
var e = g("../internals/fails");
C.exports = !e(function() {
function A() {
}
return A.prototype.constructor = null, Object.getPrototypeOf(new A()) !== A.prototype;
});
}, { "../internals/fails": 260 }], 240: [function(g, C, i) {
C.exports = function(e, A) {
return { value: e, done: A };
};
}, {}], 241: [function(g, C, i) {
var e = g("../internals/descriptors"), A = g("../internals/object-define-property"), s = g("../internals/create-property-descriptor");
C.exports = e ? function(l, n, a) {
return A.f(l, n, s(1, a));
} : function(l, n, a) {
return l[n] = a, l;
};
}, { "../internals/create-property-descriptor": 242, "../internals/descriptors": 247, "../internals/object-define-property": 308 }], 242: [function(g, C, i) {
C.exports = function(e, A) {
return { enumerable: !(1 & e), configurable: !(2 & e), writable: !(4 & e), value: A };
};
}, {}], 243: [function(g, C, i) {
var e = g("../internals/to-property-key"), A = g("../internals/object-define-property"), s = g("../internals/create-property-descriptor");
C.exports = function(l, n, a) {
var d = e(n);
d in l ? A.f(l, d, s(0, a)) : l[d] = a;
};
}, { "../internals/create-property-descriptor": 242, "../internals/object-define-property": 308, "../internals/to-property-key": 346 }], 244: [function(g, C, i) {
var e = g("../internals/make-built-in"), A = g("../internals/object-define-property");
C.exports = function(s, l, n) {
return n.get && e(n.get, l, { getter: !0 }), n.set && e(n.set, l, { setter: !0 }), A.f(s, l, n);
};
}, { "../internals/make-built-in": 300, "../internals/object-define-property": 308 }], 245: [function(g, C, i) {
var e = g("../internals/is-callable"), A = g("../internals/object-define-property"), s = g("../internals/make-built-in"), l = g("../internals/define-global-property");
C.exports = function(n, a, d, o) {
o || (o = {});
var c = o.enumerable, r = o.name !== void 0 ? o.name : a;
if (e(d) && s(d, r, o), o.global) c ? n[a] = d : l(a, d);
else {
try {
o.unsafe ? n[a] && (c = !0) : delete n[a];
} catch {
}
c ? n[a] = d : A.f(n, a, { value: d, enumerable: !1, configurable: !o.nonConfigurable, writable: !o.nonWritable });
}
return n;
};
}, { "../internals/define-global-property": 246, "../internals/is-callable": 285, "../internals/make-built-in": 300, "../internals/object-define-property": 308 }], 246: [function(g, C, i) {
var e = g("../internals/global"), A = Object.defineProperty;
C.exports = function(s, l) {
try {
A(e, s, { value: l, configurable: !0, writable: !0 });
} catch {
e[s] = l;
}
return l;
};
}, { "../internals/global": 274 }], 247: [function(g, C, i) {
var e = g("../internals/fails");
C.exports = !e(function() {
return Object.defineProperty({}, 1, { get: function() {
return 7;
} })[1] !== 7;
});
}, { "../internals/fails": 260 }], 248: [function(g, C, i) {
var e = typeof document == "object" && document.all, A = e === void 0 && e !== void 0;
C.exports = { all: e, IS_HTMLDDA: A };
}, {}], 249: [function(g, C, i) {
var e = g("../internals/global"), A = g("../internals/is-object"), s = e.document, l = A(s) && A(s.createElement);
C.exports = function(n) {
return l ? s.createElement(n) : {};
};
}, { "../internals/global": 274, "../internals/is-object": 289 }], 250: [function(g, C, i) {
var e = g("../internals/engine-is-deno"), A = g("../internals/engine-is-node");
C.exports = !e && !A && typeof window == "object" && typeof document == "object";
}, { "../internals/engine-is-deno": 251, "../internals/engine-is-node": 254 }], 251: [function(g, C, i) {
C.exports = typeof Deno == "object" && Deno && typeof Deno.version == "object";
}, {}], 252: [function(g, C, i) {
var e = g("../internals/engine-user-agent");
C.exports = /ipad|iphone|ipod/i.test(e) && typeof Pebble < "u";
}, { "../internals/engine-user-agent": 256 }], 253: [function(g, C, i) {
var e = g("../internals/engine-user-agent");
C.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(e);
}, { "../internals/engine-user-agent": 256 }], 254: [function(g, C, i) {
var e = g("../internals/global"), A = g("../internals/classof-raw");
C.exports = A(e.process) === "process";
}, { "../internals/classof-raw": 235, "../internals/global": 274 }], 255: [function(g, C, i) {
var e = g("../internals/engine-user-agent");
C.exports = /web0s(?!.*chrome)/i.test(e);
}, { "../internals/engine-user-agent": 256 }], 256: [function(g, C, i) {
C.exports = typeof navigator < "u" && String(navigator.userAgent) || "";
}, {}], 257: [function(g, C, i) {
var e, A, s = g("../internals/global"), l = g("../internals/engine-user-agent"), n = s.process, a = s.Deno, d = n && n.versions || a && a.version, o = d && d.v8;
o && (A = (e = o.split("."))[0] > 0 && e[0] < 4 ? 1 : +(e[0] + e[1])), !A && l && (!(e = l.match(/Edge\/(\d+)/)) || e[1] >= 74) && (e = l.match(/Chrome\/(\d+)/)) && (A = +e[1]), C.exports = A;
}, { "../internals/engine-user-agent": 256, "../internals/global": 274 }], 258: [function(g, C, i) {
C.exports = ["constructor", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "valueOf"];
}, {}], 259: [function(g, C, i) {
var e = g("../internals/global"), A = g("../internals/object-get-own-property-descriptor").f, s = g("../internals/create-non-enumerable-property"), l = g("../internals/define-built-in"), n = g("../internals/define-global-property"), a = g("../internals/copy-constructor-properties"), d = g("../internals/is-forced");
C.exports = function(o, c) {
var r, h, b, u, m, Z = o.target, p = o.global, Y = o.stat;
if (r = p ? e : Y ? e[Z] || n(Z, {}) : (e[Z] || {}).prototype) for (h in c) {
if (u = c[h], b = o.dontCallGetSet ? (m = A(r, h)) && m.value : r[h], !d(p ? h : Z + (Y ? "." : "#") + h, o.forced) && b !== void 0) {
if (typeof u == typeof b) continue;
a(u, b);
}
(o.sham || b && b.sham) && s(u, "sham", !0), l(r, h, u, o);
}
};
}, { "../internals/copy-constructor-properties": 237, "../internals/create-non-enumerable-property": 241, "../internals/define-built-in": 245, "../internals/define-global-property": 246, "../internals/global": 274, "../internals/is-forced": 287, "../internals/object-get-own-property-descriptor": 309 }], 260: [function(g, C, i) {
C.exports = function(e) {
try {
return !!e();
} catch {
return !0;
}
};
}, {}], 261: [function(g, C, i) {
var e = g("../internals/function-bind-native"), A = Function.prototype, s = A.apply, l = A.call;
C.exports = typeof Reflect == "object" && Reflect.apply || (e ? l.bind(s) : function() {
return l.apply(s, arguments);
});
}, { "../internals/function-bind-native": 263 }], 262: [function(g, C, i) {
var e = g("../internals/function-uncurry-this-clause"), A = g("../internals/a-callable"), s = g("../internals/function-bind-native"), l = e(e.bind);
C.exports = function(n, a) {
return A(n), a === void 0 ? n : s ? l(n, a) : function() {
return n.apply(a, arguments);
};
};
}, { "../internals/a-callable": 222, "../internals/function-bind-native": 263, "../internals/function-uncurry-this-clause": 267 }], 263: [function(g, C, i) {
var e = g("../internals/fails");
C.exports = !e(function() {
var A = (function() {
}).bind();
return typeof A != "function" || A.hasOwnProperty("prototype");
});
}, { "../internals/fails": 260 }], 264: [function(g, C, i) {
var e = g("../internals/function-bind-native"), A = Function.prototype.call;
C.exports = e ? A.bind(A) : function() {
return A.apply(A, arguments);
};
}, { "../internals/function-bind-native": 263 }], 265: [function(g, C, i) {
var e = g("../internals/descriptors"), A = g("../internals/has-own-property"), s = Function.prototype, l = e && Object.getOwnPropertyDescriptor, n = A(s, "name"), a = n && (function() {
}).name === "something", d = n && (!e || e && l(s, "name").configurable);
C.exports = { EXISTS: n, PROPER: a, CONFIGURABLE: d };
}, { "../internals/descriptors": 247, "../internals/has-own-property": 275 }], 266: [function(g, C, i) {
var e = g("../internals/function-uncurry-this"), A = g("../internals/a-callable");
C.exports = function(s, l, n) {
try {
return e(A(Object.getOwnPropertyDescriptor(s, l)[n]));
} catch {
}
};
}, { "../internals/a-callable": 222, "../internals/function-uncurry-this": 268 }], 267: [function(g, C, i) {
var e = g("../internals/classof-raw"), A = g("../internals/function-uncurry-this");
C.exports = function(s) {
if (e(s) === "Function") return A(s);
};
}, { "../internals/classof-raw": 235, "../internals/function-uncurry-this": 268 }], 268: [function(g, C, i) {
var e = g("../internals/function-bind-native"), A = Function.prototype, s = A.call, l = e && A.bind.bind(s, s);
C.exports = e ? l : function(n) {
return function() {
return s.apply(n, arguments);
};
};
}, { "../internals/function-bind-native": 263 }], 269: [function(g, C, i) {
var e = g("../internals/global"), A = g("../internals/is-callable"), s = function(l) {
return A(l) ? l : void 0;
};
C.exports = function(l, n) {
return arguments.length < 2 ? s(e[l]) : e[l] && e[l][n];
};
}, { "../internals/global": 274, "../internals/is-callable": 285 }], 270: [function(g, C, i) {
var e = g("../internals/classof"), A = g("../internals/get-method"), s = g("../internals/is-null-or-undefined"), l = g("../internals/iterators"), n = g("../internals/well-known-symbol")("iterator");
C.exports = function(a) {
if (!s(a)) return A(a, n) || A(a, "@@iterator") || l[e(a)];
};
}, { "../internals/classof": 236, "../internals/get-method": 273, "../internals/is-null-or-undefined": 288, "../internals/iterators": 298, "../internals/well-known-symbol": 357 }], 271: [function(g, C, i) {
var e = g("../internals/function-call"), A = g("../internals/a-callable"), s = g("../internals/an-object"), l = g("../internals/try-to-string"), n = g("../internals/get-iterator-method"), a = TypeError;
C.exports = function(d, o) {
var c = arguments.length < 2 ? n(d) : o;
if (A(c)) return s(e(c, d));
throw new a(l(d) + " is not iterable");
};
}, { "../internals/a-callable": 222, "../internals/an-object": 227, "../internals/function-call": 264, "../internals/get-iterator-method": 270, "../internals/try-to-string": 349 }], 272: [function(g, C, i) {
var e = g("../internals/function-uncurry-this"), A = g("../internals/is-array"), s = g("../internals/is-callable"), l = g("../internals/classof-raw"), n = g("../internals/to-string"), a = e([].push);
C.exports = function(d) {
if (s(d)) return d;
if (A(d)) {
for (var o = d.length, c = [], r = 0; r < o; r++) {
var h = d[r];
typeof h == "string" ? a(c, h) : typeof h != "number" && l(h) !== "Number" && l(h) !== "String" || a(c, n(h));
}
var b = c.length, u = !0;
return function(m, Z) {
if (u) return u = !1, Z;
if (A(this)) return Z;
for (var p = 0; p < b; p++) if (c[p] === m) return Z;
};
}
};
}, { "../internals/classof-raw": 235, "../internals/function-uncurry-this": 268, "../internals/is-array": 284, "../internals/is-callable": 285, "../internals/to-string": 348 }], 273: [function(g, C, i) {
var e = g("../internals/a-callable"), A = g("../internals/is-null-or-undefined");
C.exports = function(s, l) {
var n = s[l];
return A(n) ? void 0 : e(n);
};
}, { "../internals/a-callable": 222, "../internals/is-null-or-undefined": 288 }], 274: [function(g, C, i) {
(function(e) {
(function() {
var A = function(s) {
return s && s.Math === Math && s;
};
C.exports = A(typeof globalThis == "object" && globalThis) || A(typeof window == "object" && window) || A(typeof self == "object" && self) || A(typeof e == "object" && e) || /* @__PURE__ */ function() {
return this;
}() || this || Function("return this")();
}).call(this);
}).call(this, typeof JI < "u" ? JI : typeof self < "u" ? self : typeof window < "u" ? window : {});
}, {}], 275: [function(g, C, i) {
var e = g("../internals/function-uncurry-this"), A = g("../internals/to-object"), s = e({}.hasOwnProperty);
C.exports = Object.hasOwn || function(l, n) {
return s(A(l), n);
};
}, { "../internals/function-uncurry-this": 268, "../internals/to-object": 344 }], 276: [function(g, C, i) {
C.exports = {};
}, {}], 277: [function(g, C, i) {
C.exports = function(e, A) {
try {
arguments.length === 1 ? console.error(e) : console.error(e, A);
} catch {
}
};
}, {}], 278: [function(g, C, i) {
var e = g("../internals/get-built-in");
C.exports = e("document", "documentElement");
}, { "../internals/get-built-in": 269 }], 279: [function(g, C, i) {
var e = g("../internals/descriptors"), A = g("../internals/fails"), s = g("../internals/document-create-element");
C.exports = !e && !A(function() {
return Object.defineProperty(s("div"), "a", { get: function() {
return 7;
} }).a !== 7;
});
}, { "../internals/descriptors": 247, "../internals/document-create-element": 249, "../internals/fails": 260 }], 280: [function(g, C, i) {
var e = g("../internals/function-uncurry-this"), A = g("../internals/fails"), s = g("../internals/classof-raw"), l = Object, n = e("".split);
C.exports = A(function() {
return !l("z").propertyIsEnumerable(0);
}) ? function(a) {
return s(a) === "String" ? n(a, "") : l(a);
} : l;
}, { "../internals/classof-raw": 235, "../internals/fails": 260, "../internals/function-uncurry-this": 268 }], 281: [function(g, C, i) {
var e = g("../internals/function-uncurry-this"), A = g("../internals/is-callable"), s = g("../internals/shared-store"), l = e(Function.toString);
A(s.inspectSource) || (s.inspectSource = function(n) {
return l(n);
}), C.exports = s.inspectSource;
}, { "../internals/function-uncurry-this": 268, "../internals/is-callable": 285, "../internals/shared-store": 333 }], 282: [function(g, C, i) {
var e, A, s, l = g("../internals/weak-map-basic-detection"), n = g("../internals/global"), a = g("../internals/is-object"), d = g("../internals/create-non-enumerable-property"), o = g("../internals/has-own-property"), c = g("../internals/shared-store"), r = g("../internals/shared-key"), h = g("../internals/hidden-keys"), b = n.TypeError, u = n.WeakMap;
if (l || c.state) {
var m = c.state || (c.state = new u());
m.get = m.get, m.has = m.has, m.set = m.set, e = function(p, Y) {
if (m.has(p)) throw new b("Object already initialized");
return Y.facade = p, m.set(p, Y), Y;
}, A = function(p) {
return m.get(p) || {};
}, s = function(p) {
return m.has(p);
};
} else {
var Z = r("state");
h[Z] = !0, e = function(p, Y) {
if (o(p, Z)) throw new b("Object already initialized");
return Y.facade = p, d(p, Z, Y), Y;
}, A = function(p) {
return o(p, Z) ? p[Z] : {};
}, s = function(p) {
return o(p, Z);
};
}
C.exports = { set: e, get: A, has: s, enforce: function(p) {
return s(p) ? A(p) : e(p, {});
}, getterFor: function(p) {
return function(Y) {
var R;
if (!a(Y) || (R = A(Y)).type !== p) throw new b("Incompatible receiver, " + p + " required");
return R;
};
} };
}, { "../internals/create-non-enumerable-property": 241, "../internals/global": 274, "../internals/has-own-property": 275, "../internals/hidden-keys": 276, "../internals/is-object": 289, "../internals/shared-key": 332, "../internals/shared-store": 333, "../internals/weak-map-basic-detection": 354 }], 283: [function(g, C, i) {
var e = g("../internals/well-known-symbol"), A = g("../internals/iterators"), s = e("iterator"), l = Array.prototype;
C.exports = function(n) {
return n !== void 0 && (A.Array === n || l[s] === n);
};
}, { "../internals/iterators": 298, "../internals/well-known-symbol": 357 }], 284: [function(g, C, i) {
var e = g("../internals/classof-raw");
C.exports = Array.isArray || function(A) {
return e(A) === "Array";
};
}, { "../internals/classof-raw": 235 }], 285: [function(g, C, i) {
var e = g("../internals/document-all"), A = e.all;
C.exports = e.IS_HTMLDDA ? function(s) {
return typeof s == "function" || s === A;
} : function(s) {
return typeof s == "function";
};
}, { "../internals/document-all": 248 }], 286: [function(g, C, i) {
var e = g("../internals/function-uncurry-this"), A = g("../internals/fails"), s = g("../internals/is-callable"), l = g("../internals/classof"), n = g("../internals/get-built-in"), a = g("../internals/inspect-source"), d = function() {
}, o = [], c = n("Reflect", "construct"), r = /^\s*(?:class|function)\b/, h = e(r.exec), b = !r.test(d), u = function(Z) {
if (!s(Z)) return !1;
try {
return c(d, o, Z), !0;
} catch {
return !1;
}
}, m = function(Z) {
if (!s(Z)) return !1;
switch (l(Z)) {
case "AsyncFunction":
case "GeneratorFunction":
case "AsyncGeneratorFunction":
return !1;
}
try {
return b || !!h(r, a(Z));
} catch {
return !0;
}
};
m.sham = !0, C.exports = !c || A(function() {
var Z;
return u(u.call) || !u(Object) || !u(function() {
Z = !0;
}) || Z;
}) ? m : u;
}, { "../internals/classof": 236, "../internals/fails": 260, "../internals/function-uncurry-this": 268, "../internals/get-built-in": 269, "../internals/inspect-source": 281, "../internals/is-callable": 285 }], 287: [function(g, C, i) {
var e = g("../internals/fails"), A = g("../internals/is-callable"), s = /#|\.prototype\./, l = function(c, r) {
var h = a[n(c)];
return h === o || h !== d && (A(r) ? e(r) : !!r);
}, n = l.normalize = function(c) {
return String(c).replace(s, ".").toLowerCase();
}, a = l.data = {}, d = l.NATIVE = "N", o = l.POLYFILL = "P";
C.exports = l;
}, { "../internals/fails": 260, "../internals/is-callable": 285 }], 288: [function(g, C, i) {
C.exports = function(e) {
return e == null;
};
}, {}], 289: [function(g, C, i) {
var e = g("../internals/is-callable"), A = g("../internals/document-all"), s = A.all;
C.exports = A.IS_HTMLDDA ? function(l) {
return typeof l == "object" ? l !== null : e(l) || l === s;
} : function(l) {
return typeof l == "object" ? l !== null : e(l);
};
}, { "../internals/document-all": 248, "../internals/is-callable": 285 }], 290: [function(g, C, i) {
C.exports = !1;
}, {}], 291: [function(g, C, i) {
var e = g("../internals/is-object"), A = g("../internals/classof-raw"), s = g("../internals/well-known-symbol")("match");
C.exports = function(l) {
var n;
return e(l) && ((n = l[s]) !== void 0 ? !!n : A(l) === "RegExp");
};
}, { "../internals/classof-raw": 235, "../internals/is-object": 289, "../internals/well-known-symbol": 357 }], 292: [function(g, C, i) {
var e = g("../internals/get-built-in"), A = g("../internals/is-callable"), s = g("../internals/object-is-prototype-of"), l = g("../internals/use-symbol-as-uid"), n = Object;
C.exports = l ? function(a) {
return typeof a == "symbol";
} : function(a) {
var d = e("Symbol");
return A(d) && s(d.prototype, n(a));
};
}, { "../internals/get-built-in": 269, "../internals/is-callable": 285, "../internals/object-is-prototype-of": 314, "../internals/use-symbol-as-uid": 351 }], 293: [function(g, C, i) {
var e = g("../internals/function-bind-context"), A = g("../internals/function-call"), s = g("../internals/an-object"), l = g("../internals/try-to-string"), n = g("../internals/is-array-iterator-method"), a = g("../internals/length-of-array-like"), d = g("../internals/object-is-prototype-of"), o = g("../internals/get-iterator"), c = g("../internals/get-iterator-method"), r = g("../internals/iterator-close"), h = TypeError, b = function(m, Z) {
this.stopped = m, this.result = Z;
}, u = b.prototype;
C.exports = function(m, Z, p) {
var Y, R, X, H, S, z, v, K = p && p.that, V = !(!p || !p.AS_ENTRIES), N = !(!p || !p.IS_RECORD), B = !(!p || !p.IS_ITERATOR), G = !(!p || !p.INTERRUPTED), w = e(Z, K), W = function(f) {
return Y && r(Y, "normal", f), new b(!0, f);
}, y = function(f) {
return V ? (s(f), G ? w(f[0], f[1], W) : w(f[0], f[1])) : G ? w(f, W) : w(f);
};
if (N) Y = m.iterator;
else if (B) Y = m;
else {
if (!(R = c(m))) throw new h(l(m) + " is not iterable");
if (n(R)) {
for (X = 0, H = a(m); H > X; X++) if ((S = y(m[X])) && d(u, S)) return S;
return new b(!1);
}
Y = o(m, R);
}
for (z = N ? m.next : Y.next; !(v = A(z, Y)).done; ) {
try {
S = y(v.value);
} catch (f) {
r(Y, "throw", f);
}
if (typeof S == "object" && S && d(u, S)) return S;
}
return new b(!1);
};
}, { "../internals/an-object": 227, "../internals/function-bind-context": 262, "../internals/function-call": 264, "../internals/get-iterator": 271, "../internals/get-iterator-method": 270, "../internals/is-array-iterator-method": 283, "../internals/iterator-close": 294, "../internals/length-of-array-like": 299, "../internals/object-is-prototype-of": 314, "../internals/try-to-string": 349 }], 294: [function(g, C, i) {
var e = g("../internals/function-call"), A = g("../internals/an-object"), s = g("../internals/get-method");
C.exports = function(l, n, a) {
var d, o;
A(l);
try {
if (!(d = s(l, "return"))) {
if (n === "throw") throw a;
return a;
}
d = e(d, l);
} catch (c) {
o = !0, d = c;
}
if (n === "throw") throw a;
if (o) throw d;
return A(d), a;
};
}, { "../internals/an-object": 227, "../internals/function-call": 264, "../internals/get-method": 273 }], 295: [function(g, C, i) {
var e = g("../internals/iterators-core").IteratorPrototype, A = g("../internals/object-create"), s = g("../internals/create-property-descriptor"), l = g("../internals/set-to-string-tag"), n = g("../internals/iterators"), a = function() {
return this;
};
C.exports = function(d, o, c, r) {
var h = o + " Iterator";
return d.prototype = A(e, { next: s(+!r, c) }), l(d, h, !1, !0), n[h] = a, d;
};
}, { "../internals/create-property-descriptor": 242, "../internals/iterators": 298, "../internals/iterators-core": 297, "../internals/object-create": 306, "../internals/set-to-string-tag": 331 }], 296: [function(g, C, i) {
var e = g("../internals/export"), A = g("../internals/function-call"), s = g("../internals/is-pure"), l = g("../internals/function-name"), n = g("../internals/is-callable"), a = g("../internals/iterator-create-constructor"), d = g("../internals/object-get-prototype-of"), o = g("../internals/object-set-prototype-of"), c = g("../internals/set-to-string-tag"), r = g("../internals/create-non-enumerable-property"), h = g("../internals/define-built-in"), b = g("../internals/well-known-symbol"), u = g("../internals/iterators"), m = g("../internals/iterators-core"), Z = l.PROPER, p = l.CONFIGURABLE, Y = m.IteratorPrototype, R = m.BUGGY_SAFARI_ITERATORS, X = b("iterator"), H = function() {
return this;
};
C.exports = function(S, z, v, K, V, N, B) {
a(v, z, K);
var G, w, W, y = function(L) {
if (L === V && Q) return Q;
if (!R && L && L in F) return F[L];
switch (L) {
case "keys":
case "values":
case "entries":
return function() {
return new v(this, L);
};
}
return function() {
return new v(this);
};
}, f = z + " Iterator", D = !1, F = S.prototype, T = F[X] || F["@@iterator"] || V && F[V], Q = !R && T || y(V), P = z === "Array" && F.entries || T;
if (P && (G = d(P.call(new S()))) !== Object.prototype && G.next && (s || d(G) === Y || (o ? o(G, Y) : n(G[X]) || h(G, X, H)), c(G, f, !0, !0), s && (u[f] = H)), Z && V === "values" && T && T.name !== "values" && (!s && p ? r(F, "name", "values") : (D = !0, Q = function() {
return A(T, this);
})), V) if (w = { values: y("values"), keys: N ? Q : y("keys"), entries: y("entries") }, B) for (W in w) (R || D || !(W in F)) && h(F, W, w[W]);
else e({ target: z, proto: !0, forced: R || D }, w);
return s && !B || F[X] === Q || h(F, X, Q, { name: V }), u[z] = Q, w;
};
}, { "../internals/create-non-enumerable-property": 241, "../internals/define-built-in": 245, "../internals/export": 259, "../internals/function-call": 264, "../internals/function-name": 265, "../internals/is-callable": 285, "../internals/is-pure": 290, "../internals/iterator-create-constructor": 295, "../internals/iterators": 298, "../internals/iterators-core": 297, "../internals/object-get-prototype-of": 313, "../internals/object-set-prototype-of": 318, "../internals/set-to-string-tag": 331, "../internals/well-known-symbol": 357 }], 297: [function(g, C, i) {
var e, A, s, l = g("../internals/fails"), n = g("../internals/is-callable"), a = g("../internals/is-object"), d = g("../internals/object-create"), o = g("../internals/object-get-prototype-of"), c = g("../internals/define-built-in"), r = g("../internals/well-known-symbol"), h = g("../internals/is-pure"), b = r("iterator"), u = !1;
[].keys && ("next" in (s = [].keys()) ? (A = o(o(s))) !== Object.prototype && (e = A) : u = !0), !a(e) || l(function() {
var m = {};
return e[b].call(m) !== m;
}) ? e = {} : h && (e = d(e)), n(e[b]) || c(e, b, function() {
return this;
}), C.exports = { IteratorPrototype: e, BUGGY_SAFARI_ITERATORS: u };
}, { "../internals/define-built-in": 245, "../internals/fails": 260, "../internals/is-callable": 285, "../internals/is-object": 289, "../internals/is-pure": 290, "../internals/object-create": 306, "../internals/object-get-prototype-of": 313, "../internals/well-known-symbol": 357 }], 298: [function(g, C, i) {
arguments[4][276][0].apply(i, arguments);
}, { dup: 276 }], 299: [function(g, C, i) {
var e = g("../internals/to-length");
C.exports = function(A) {
return e(A.length);
};
}, { "../internals/to-length": 343 }], 300: [function(g, C, i) {
var e = g("../internals/function-uncurry-this"), A = g("../internals/fails"), s = g("../internals/is-callable"), l = g("../internals/has-own-property"), n = g("../internals/descriptors"), a = g("../internals/function-name").CONFIGURABLE, d = g("../internals/inspect-source"), o = g("../internals/internal-state"), c = o.enforce, r = o.get, h = String, b = Object.defineProperty, u = e("".slice), m = e("".replace), Z = e([].join), p = n && !A(function() {
return b(function() {
}, "length", { value: 8 }).length !== 8;
}), Y = String(String).split("String"), R = C.exports = function(X, H, S) {
u(h(H), 0, 7) === "Symbol(" && (H = "[" + m(h(H), /^Symbol\(([^)]*)\)/, "$1") + "]"), S && S.getter && (H = "get " + H), S && S.setter && (H = "set " + H), (!l(X, "name") || a && X.name !== H) && (n ? b(X, "name", { value: H, configurable: !0 }) : X.name = H), p && S && l(S, "arity") && X.length !== S.arity && b(X, "length", { value: S.arity });
try {
S && l(S, "constructor") && S.constructor ? n && b(X, "prototype", { writable: !1 }) : X.prototype && (X.prototype = void 0);
} catch {
}
var z = c(X);
return l(z, "source") || (z.source = Z(Y, typeof H == "string" ? H : "")), X;
};
Function.prototype.toString = R(function() {
return s(this) && r(this).source || d(this);
}, "toString");
}, { "../internals/descriptors": 247, "../internals/fails": 260, "../internals/function-name": 265, "../internals/function-uncurry-this": 268, "../internals/has-own-property": 275, "../internals/inspect-source": 281, "../internals/internal-state": 282, "../internals/is-callable": 285 }], 301: [function(g, C, i) {
var e = Math.ceil, A = Math.floor;
C.exports = Math.trunc || function(s) {
var l = +s;
return (l > 0 ? A : e)(l);
};
}, {}], 302: [function(g, C, i) {
var e, A, s, l, n, a = g("../internals/global"), d = g("../internals/function-bind-context"), o = g("../internals/object-get-own-property-descriptor").f, c = g("../internals/task").set, r = g("../internals/queue"), h = g("../internals/engine-is-ios"), b = g("../internals/engine-is-ios-pebble"), u = g("../internals/engine-is-webos-webkit"), m = g("../internals/engine-is-node"), Z = a.MutationObserver || a.WebKitMutationObserver, p = a.document, Y = a.process, R = a.Promise, X = o(a, "queueMicrotask"), H = X && X.value;
if (!H) {
var S = new r(), z = function() {
var v, K;
for (m && (v = Y.domain) && v.exit(); K = S.get(); ) try {
K();
} catch (V) {
throw S.head && e(), V;
}
v && v.enter();
};
h || m || u || !Z || !p ? !b && R && R.resolve ? ((l = R.resolve(void 0)).constructor = R, n = d(l.then, l), e = function() {
n(z);
}) : m ? e = function() {
Y.nextTick(z);
} : (c = d(c, a), e = function() {
c(z);
}) : (A = !0, s = p.createTextNode(""), new Z(z).observe(s, { characterData: !0 }), e = function() {
s.data = A = !A;
}), H = function(v) {
S.head || e(), S.add(v);
};
}
C.exports = H;
}, { "../internals/engine-is-ios": 253, "../internals/engine-is-ios-pebble": 252, "../internals/engine-is-node": 254, "../internals/engine-is-webos-webkit": 255, "../internals/function-bind-context": 262, "../internals/global": 274, "../internals/object-get-own-property-descriptor": 309, "../internals/queue": 328, "../internals/task": 339 }], 303: [function(g, C, i) {
var e = g("../internals/a-callable"), A = TypeError, s = function(l) {
var n, a;
this.promise = new l(function(d, o) {
if (n !== void 0 || a !== void 0) throw new A("Bad Promise constructor");
n = d, a = o;
}), this.resolve = e(n), this.reject = e(a);
};
C.exports.f = function(l) {
return new s(l);
};
}, { "../internals/a-callable": 222 }], 304: [function(g, C, i) {
var e = g("../internals/is-regexp"), A = TypeError;
C.exports = function(s) {
if (e(s)) throw new A("The method doesn't accept regular expressions");
return s;
};
}, { "../internals/is-regexp": 291 }], 305: [function(g, C, i) {
var e = g("../internals/descriptors"), A = g("../internals/function-uncurry-this"), s = g("../internals/function-call"), l = g("../internals/fails"), n = g("../internals/object-keys"), a = g("../internals/object-get-own-property-symbols"), d = g("../internals/object-property-is-enumerable"), o = g("../internals/to-object"), c = g("../internals/indexed-object"), r = Object.assign, h = Object.defineProperty, b = A([].concat);
C.exports = !r || l(function() {
if (e && r({ b: 1 }, r(h({}, "a", { enumerable: !0, get: function() {
h(this, "b", { value: 3, enumerable: !1 });
} }), { b: 2 })).b !== 1) return !0;
var u = {}, m = {}, Z = Symbol("assign detection");
return u[Z] = 7, "abcdefghijklmnopqrst".split("").forEach(function(p) {
m[p] = p;
}), r({}, u)[Z] !== 7 || n(r({}, m)).join("") !== "abcdefghijklmnopqrst";
}) ? function(u, m) {
for (var Z = o(u), p = arguments.length, Y = 1, R = a.f, X = d.f; p > Y; ) for (var H, S = c(arguments[Y++]), z = R ? b(n(S), R(S)) : n(S), v = z.length, K = 0; v > K; ) H = z[K++], e && !s(X, S, H) || (Z[H] = S[H]);
return Z;
} : r;
}, { "../internals/descriptors": 247, "../internals/fails": 260, "../internals/function-call": 264, "../internals/function-uncurry-this": 268, "../internals/indexed-object": 280, "../internals/object-get-own-property-symbols": 312, "../internals/object-keys": 316, "../internals/object-property-is-enumerable": 317, "../internals/to-object": 344 }], 306: [function(g, C, i) {
var e, A = g("../internals/an-object"), s = g("../internals/object-define-properties"), l = g("../internals/enum-bug-keys"), n = g("../internals/hidden-keys"), a = g("../internals/html"), d = g("../internals/document-create-element"), o = g("../internals/shared-key"), c = o("IE_PROTO"), r = function() {
}, h = function(m) {
return "