14194 lines
1.7 MiB
14194 lines
1.7 MiB
var es = Object.defineProperty;
|
||
var ts = (e, t, n) => t in e ? es(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
|
||
var se = (e, t, n) => (ts(e, typeof t != "symbol" ? t + "" : t, n), n), or = (e, t, n) => {
|
||
if (!t.has(e))
|
||
throw TypeError("Cannot " + n);
|
||
};
|
||
var g = (e, t, n) => (or(e, t, "read from private field"), n ? n.call(e) : t.get(e)), ve = (e, t, n) => {
|
||
if (t.has(e))
|
||
throw TypeError("Cannot add the same private member more than once");
|
||
t instanceof WeakSet ? t.add(e) : t.set(e, n);
|
||
}, he = (e, t, n, o) => (or(e, t, "write to private field"), o ? o.call(e, n) : t.set(e, n), n);
|
||
var yo = (e, t, n, o) => ({
|
||
set _(r) {
|
||
he(e, t, r, n);
|
||
},
|
||
get _() {
|
||
return g(e, t, o);
|
||
}
|
||
}), te = (e, t, n) => (or(e, t, "access private method"), n);
|
||
import { uiContext as Le, useUi as Ce } from "@fast-crud/ui-interface";
|
||
import { defineAsyncComponent as ns, reactive as un, computed as B, defineComponent as ue, ref as K, onMounted as Cn, openBlock as w, createElementBlock as j, renderSlot as ae, createCommentVNode as ne, createElementVNode as ee, isRef as Bo, isShallow as La, watch as lt, shallowReactive as jo, createVNode as L, shallowRef as os, inject as xn, render as rs, toRaw as Hn, unref as q, nextTick as Me, getCurrentInstance as Jo, normalizeStyle as jn, resolveComponent as J, createBlock as V, withCtx as N, resolveDynamicComponent as z, isVNode as Lr, h as yr, mergeProps as H, normalizeClass as _t, createTextVNode as St, toDisplayString as xe, provide as Ut, Fragment as we, renderList as Ee, createSlots as qr, normalizeProps as Be, useAttrs as Qo, useSlots as Hr, toRef as ua, guardReactiveProps as xt, withModifiers as as, resolveDirective as is, withDirectives as zr, vShow as qa, TransitionGroup as ss, toHandlerKey as ls, withKeys as us } from "vue";
|
||
import { forEach as G, camelCase as Ha, upperFirst as cs, merge as mo, isString as wr, toPath as ds, identity as fs, cloneDeep as dt, get as et, mergeWith as hs, cloneDeepWith as ms, isArray as No, set as We, remove as za, size as ps, sortBy as Sn, pick as Wa, includes as gs, each as bt, map as vs, omit as _n, entries as Wr, unset as xo, forOwn as bs, toString as ys, debounce as ws, keys as Ua } from "lodash-es";
|
||
import ot from "dayjs";
|
||
import { Icon as _s } from "@iconify/vue";
|
||
import { useRoute as Ka } from "vue-router";
|
||
function Cs() {
|
||
var t;
|
||
return (t = new Error().stack) == null ? void 0 : t.split(`
|
||
`)[3];
|
||
}
|
||
const Lt = (...e) => {
|
||
};
|
||
function _r(...e) {
|
||
console.log.apply(this, arguments);
|
||
}
|
||
function Ss(...e) {
|
||
console.warn.apply(this, arguments);
|
||
}
|
||
function Fs(...e) {
|
||
console.error.apply(this, arguments);
|
||
}
|
||
const Rs = (...e) => {
|
||
Fs("%c [error]", "font-weight: 600;", ...e);
|
||
}, Ds = (...e) => {
|
||
Ss("%c [warn]", "font-weight: 600;", ...e);
|
||
}, ca = (...e) => {
|
||
_r("%c [info]", "font-weight: 600;", ...e);
|
||
}, ks = (...e) => {
|
||
if (!console.log)
|
||
return;
|
||
const t = Cs();
|
||
{
|
||
const n = ["%c [debug]", "font-weight: 600;", ...e];
|
||
_r(...n);
|
||
const o = ["%c " + t, "color:#999"];
|
||
_r(...o);
|
||
}
|
||
}, de = {
|
||
debug: Lt,
|
||
info: Lt,
|
||
warn: Lt,
|
||
error: Lt,
|
||
log: Lt
|
||
};
|
||
function Os(e = {}) {
|
||
const t = (e == null ? void 0 : e.level) || "info";
|
||
switch (de.debug = Lt, de.info = Lt, de.warn = Lt, de.error = Lt, de.log = Lt, t) {
|
||
case "debug":
|
||
de.debug = ks;
|
||
case "info":
|
||
de.info = ca, de.log = ca;
|
||
case "warn":
|
||
de.warn = Ds;
|
||
case "error":
|
||
de.error = Rs;
|
||
break;
|
||
}
|
||
}
|
||
Os();
|
||
function $s(e) {
|
||
return e == null || e === "";
|
||
}
|
||
function Es(...e) {
|
||
for (const t of e)
|
||
if (!(t == null || t === ""))
|
||
return !1;
|
||
return !1;
|
||
}
|
||
function Ts(...e) {
|
||
for (const t of e)
|
||
if (t == null || t === "")
|
||
return !0;
|
||
return !1;
|
||
}
|
||
const Ur = {
|
||
isEmpty: $s,
|
||
isAllEmpty: Es,
|
||
hasEmpty: Ts
|
||
};
|
||
function Is(e, t = !1) {
|
||
}
|
||
function Kr(e) {
|
||
return ns({
|
||
loader: e,
|
||
onError(t, n, o, r) {
|
||
console.error("load error", t), t.message.match(/fetch/) && r <= 3 ? n() : o();
|
||
}
|
||
});
|
||
}
|
||
function As(e, t, n, o) {
|
||
const r = Kr(n);
|
||
e.component(t, r, o);
|
||
}
|
||
function Vs(e, t, n, o, r) {
|
||
const a = po(t, o, r);
|
||
G(a, (i, s) => {
|
||
n && n.indexOf(s) != -1 || As(e, s, i, null);
|
||
});
|
||
}
|
||
function Ps(e, t, n, o, r) {
|
||
const a = po(t, o, r);
|
||
G(a, (i, s) => {
|
||
n && n.indexOf(s) || e.component(s, i.default);
|
||
});
|
||
}
|
||
function po(e, t, n) {
|
||
const o = {};
|
||
return t == null && (t = /.*\/(.+).(vue|jsx|tsx)/), G(e, (r, a) => {
|
||
const i = a.match(t);
|
||
if ((i == null ? void 0 : i.length) <= 1) {
|
||
console.error(`"${a}" can't pick a component name,this component can't register`);
|
||
return;
|
||
}
|
||
let s = i[1];
|
||
s = Ha(s), s = cs(s), n && (r = n(r)), o[s] = r;
|
||
}), o;
|
||
}
|
||
function Ms(e) {
|
||
const t = po(e), n = {};
|
||
return G(t, (o, r) => {
|
||
n[r] = Kr(o);
|
||
}), n;
|
||
}
|
||
function Bs(e) {
|
||
const t = po(e), n = {};
|
||
return G(t, (o, r) => {
|
||
n[r] = o.default;
|
||
}), n;
|
||
}
|
||
const js = {
|
||
transformFromGlob: po,
|
||
installAsyncComponents: Vs,
|
||
installSyncComponents: Ps,
|
||
createAsyncComponent: Kr,
|
||
loadAsyncComponentFromGlob: Ms,
|
||
loadComponentFromGlob: Bs
|
||
};
|
||
class Yr {
|
||
constructor(t) {
|
||
se(this, "remoteStorage");
|
||
se(this, "$router");
|
||
se(this, "tableName");
|
||
se(this, "keyType");
|
||
se(this, "id");
|
||
this.remoteStorage = t.remoteStorage, this.$router = t.$router, this.tableName = t.tableName, this.keyType = t.keyType, this.id = t.id;
|
||
}
|
||
getTableId() {
|
||
const t = this.tableName;
|
||
let n = "fs-crud";
|
||
return this.id && (n = n + "." + this.id), t && typeof t == "string" ? n + "." + t : n;
|
||
}
|
||
async getTable() {
|
||
const t = this.getTableId(), n = localStorage.getItem(t);
|
||
if (n != null)
|
||
return JSON.parse(n);
|
||
}
|
||
async saveTable(t) {
|
||
const n = this.getTableId();
|
||
localStorage.setItem(n, JSON.stringify(t));
|
||
}
|
||
async clearTable() {
|
||
const t = this.getTableId();
|
||
localStorage.removeItem(t);
|
||
}
|
||
async updateTableValue(t, n) {
|
||
if (n == null && (n = this.getItemKey()), this.remoteStorage) {
|
||
await this.remoteStorage.set(n, t);
|
||
return;
|
||
}
|
||
let o = await this.getTable();
|
||
o == null && (o = {}), o[n] = t, await this.saveTable(o);
|
||
}
|
||
getItemKey() {
|
||
const t = this.$router, n = this.keyType;
|
||
let o = location.href;
|
||
return t && (o = t.path), this.id && (o = o + "." + this.id), n == null || typeof n != "string" || !n ? o : o + "." + n;
|
||
}
|
||
async getTableValue(t) {
|
||
if (t == null && (t = this.getItemKey()), this.remoteStorage)
|
||
return await this.remoteStorage.get(t);
|
||
const n = await this.getTable();
|
||
return n == null ? null : n[t];
|
||
}
|
||
async clearTableValue(t) {
|
||
if (t == null && (t = this.getItemKey()), this.remoteStorage) {
|
||
await this.remoteStorage.remove(t);
|
||
return;
|
||
}
|
||
const n = await this.getTable();
|
||
n != null && (delete n[t], await this.saveTable(n));
|
||
}
|
||
}
|
||
const Ns = /\D/, xs = /^[a-zA-Z_$]+([\w_$]*)$/, Ls = /"/g;
|
||
function da(...e) {
|
||
return e.reduce((t, n) => t ? !n || n.startsWith("[") ? `${t}${n}` : `${t}.${n}` : n, "");
|
||
}
|
||
function Ya(e) {
|
||
function t(n, ...o) {
|
||
if (o = o.filter((r) => r !== void 0), e.isString(n))
|
||
return da(...o, n);
|
||
if (Array.isArray(n))
|
||
return o = da(...o), n.reduce((r, a) => {
|
||
const i = typeof a;
|
||
return i === "number" ? a < 0 || a % 1 !== 0 ? `${r}["${a}"]` : `${r}[${a}]` : i !== "string" ? `${r}["${a}"]` : a ? Ns.test(a) ? xs.test(a) ? r ? `${r}.${a}` : `${r}${a}` : `${r}["${a.replace(Ls, '\\"')}"]` : `${r}[${a}]` : `${r}[""]`;
|
||
}, o);
|
||
}
|
||
return t;
|
||
}
|
||
Ya.notChainable = !0;
|
||
const qs = /^[a-zA-Z_$]+([\w_$]*)$/, Hs = /"/g, Ga = Object.prototype.hasOwnProperty;
|
||
function zs(e) {
|
||
const t = typeof e;
|
||
return e != null && (t == "object" || t == "function");
|
||
}
|
||
function Ws(e) {
|
||
const t = Ya(e);
|
||
function n(a) {
|
||
const { options: i, obj: s, callback: u } = a;
|
||
i.pathFormatArray = i.pathFormat == "array", a.depth = 0;
|
||
let l = !1;
|
||
const c = () => (l = !0, !1);
|
||
for (; a && !l; ) {
|
||
if (!a.inited) {
|
||
if (a.inited = !0, a.info = ha(a.value, i.ownPropertiesOnly), i.checkCircular && (a.circularParentIndex = -1, a.circularParent = null, a.isCircular = !1, a.info.isObject && !a.info.isEmpty)) {
|
||
let d = a.parent;
|
||
for (; d; ) {
|
||
if (d.value === a.value) {
|
||
a.isCircular = !0, a.circularParent = d, a.circularParentIndex = a.depth - d.depth - 1;
|
||
break;
|
||
}
|
||
d = d.parent;
|
||
}
|
||
}
|
||
if (a.children = [], i.childrenPath && i.childrenPath.forEach((d, h) => {
|
||
const f = e.get(a.value, d), v = ha(f, i.ownPropertiesOnly);
|
||
v.isEmpty || a.children.push([d, i.strChildrenPath[h], f, v]);
|
||
}), a.isLeaf = a.isCircular || i.childrenPath !== void 0 && !a.children.length || !a.info.isObject || a.info.isEmpty, a.needCallback = (a.depth || i.includeRoot) && (!i.leavesOnly || a.isLeaf), a.needCallback) {
|
||
const d = new fa(s, i, c);
|
||
d.setItem(a, !1);
|
||
try {
|
||
a.res = u(a.value, a.key, a.parent && a.parent.value, d);
|
||
} catch (h) {
|
||
throw h.message && (h.message += `
|
||
callback failed before deep iterate at:
|
||
` + t(a.path)), h;
|
||
}
|
||
}
|
||
if (l)
|
||
break;
|
||
a.res !== !1 && !l && !a.isCircular && a.info.isObject && (i.childrenPath !== void 0 && (a.depth || !i.rootIsChildren) ? (a.childrenItems = [], a.children.length && a.children.forEach(([d, h, f, v]) => {
|
||
a.childrenItems = [
|
||
...a.childrenItems,
|
||
...v.isArray ? o(a, f, i, d, h) : r(a, f, i, d, h)
|
||
];
|
||
})) : a.childrenItems = a.info.isArray ? o(a, a.value, i, [], "") : r(a, a.value, i, [], "")), a.currentChildIndex = -1;
|
||
}
|
||
if (a.childrenItems && a.currentChildIndex < a.childrenItems.length - 1) {
|
||
a.currentChildIndex++, a.childrenItems[a.currentChildIndex].parentItem = a, a = a.childrenItems[a.currentChildIndex];
|
||
continue;
|
||
}
|
||
if (a.needCallback && i.callbackAfterIterate) {
|
||
const d = new fa(s, i, c);
|
||
d.setItem(a, !0);
|
||
try {
|
||
u(a.value, a.key, a.parent && a.parent.value, d);
|
||
} catch (h) {
|
||
throw h.message && (h.message += `
|
||
callback failed after deep iterate at:
|
||
` + t(a.path)), h;
|
||
}
|
||
}
|
||
a = a.parentItem;
|
||
}
|
||
}
|
||
return n;
|
||
function o(a, i, s, u, l) {
|
||
let c;
|
||
s.pathFormatArray || (c = a.strPath || "", l && c && !l.startsWith("[") && (c += "."), c += l || "");
|
||
const d = [];
|
||
for (let h = 0; h < i.length; h++) {
|
||
const f = i[h];
|
||
if (f === void 0 && !(h in i))
|
||
continue;
|
||
let v;
|
||
const p = !s.pathFormatArray;
|
||
p && (v = `${c}[${h}]`), d.push({
|
||
value: f,
|
||
key: h + "",
|
||
path: [...a.path || [], ...u, h + ""],
|
||
strPath: v,
|
||
depth: a.depth + 1,
|
||
parent: {
|
||
value: a.value,
|
||
key: a.key,
|
||
path: p ? a.strPath : a.path,
|
||
parent: a.parent,
|
||
depth: a.depth,
|
||
info: a.info
|
||
},
|
||
childrenPath: u.length && u || void 0,
|
||
strChildrenPath: l || void 0
|
||
});
|
||
}
|
||
return d;
|
||
}
|
||
function r(a, i, s, u, l) {
|
||
let c;
|
||
s.pathFormatArray || (c = a.strPath || "", l && c && !l.startsWith("[") && (c += "."), c += l || "");
|
||
const d = [], h = !s.pathFormatArray;
|
||
for (const f in i) {
|
||
if (s.ownPropertiesOnly && !Ga.call(i, f))
|
||
continue;
|
||
let v;
|
||
h && (qs.test(f) ? c ? v = `${c}.${f}` : v = `${f}` : v = `${c}["${f.replace(Hs, '\\"')}"]`), d.push({
|
||
value: i[f],
|
||
key: f,
|
||
path: [...a.path || [], ...u, f],
|
||
strPath: v,
|
||
depth: a.depth + 1,
|
||
parent: {
|
||
value: a.value,
|
||
key: a.key,
|
||
path: h ? a.strPath : a.path,
|
||
parent: a.parent,
|
||
depth: a.depth,
|
||
info: a.info
|
||
},
|
||
childrenPath: u.length && u || void 0,
|
||
strChildrenPath: l || void 0
|
||
});
|
||
}
|
||
return d;
|
||
}
|
||
}
|
||
class fa {
|
||
constructor(t, n, o) {
|
||
se(this, "_item");
|
||
se(this, "obj");
|
||
se(this, "_options");
|
||
se(this, "afterIterate");
|
||
this.obj = t, this._options = n, this.break = o;
|
||
}
|
||
setItem(t, n) {
|
||
this._item = t, this.afterIterate = n;
|
||
}
|
||
get path() {
|
||
return this._options.pathFormatArray ? this._item.path : this._item.strPath;
|
||
}
|
||
get parent() {
|
||
return this._item.parent;
|
||
}
|
||
get parents() {
|
||
if (!this._item._parents) {
|
||
this._item._parents = [];
|
||
let t = this._item.parent;
|
||
for (; t; )
|
||
this._item._parents[t.depth] = t, t = t.parent;
|
||
}
|
||
return this._item._parents;
|
||
}
|
||
get depth() {
|
||
return this._item.depth;
|
||
}
|
||
get isLeaf() {
|
||
return this._item.isLeaf;
|
||
}
|
||
get isCircular() {
|
||
return this._item.isCircular;
|
||
}
|
||
get circularParentIndex() {
|
||
return this._item.circularParentIndex;
|
||
}
|
||
get circularParent() {
|
||
return this._item.circularParent;
|
||
}
|
||
get childrenPath() {
|
||
return this._options.childrenPath !== void 0 && (this._options.pathFormatArray ? this._item.childrenPath : this._item.strChildrenPath) || void 0;
|
||
}
|
||
get info() {
|
||
return this._item.info;
|
||
}
|
||
}
|
||
function Us(e, t) {
|
||
for (const n in e)
|
||
if (!t || Ga.call(e, n))
|
||
return !1;
|
||
return !0;
|
||
}
|
||
function ha(e, t) {
|
||
const n = { isObject: zs(e) };
|
||
return n.isArray = n.isObject && Array.isArray(e), n.isEmpty = n.isArray ? !e.length : n.isObject ? Us(e, t) : !0, n;
|
||
}
|
||
function Ks(e) {
|
||
const t = Ws(e);
|
||
function n(o, r, a) {
|
||
if (r === void 0 && (r = fs), a = mo({
|
||
includeRoot: !Array.isArray(o),
|
||
pathFormat: "string",
|
||
checkCircular: !1,
|
||
leavesOnly: !1,
|
||
ownPropertiesOnly: !0
|
||
//
|
||
}, a || {}), a.childrenPath !== void 0) {
|
||
if (!a.includeRoot && a.rootIsChildren === void 0 && (a.rootIsChildren = Array.isArray(o)), !wr(a.childrenPath) && !Array.isArray(a.childrenPath))
|
||
throw Error("childrenPath can be string or array");
|
||
wr(a.childrenPath) && (a.childrenPath = [a.childrenPath]), a.strChildrenPath = a.childrenPath, a.childrenPath = [];
|
||
for (let i = a.strChildrenPath.length - 1; i >= 0; i--)
|
||
a.childrenPath[i] = ds(a.strChildrenPath[i]);
|
||
}
|
||
return t({
|
||
value: o,
|
||
callback: r,
|
||
options: a,
|
||
obj: o
|
||
}), o;
|
||
}
|
||
return n;
|
||
}
|
||
const Ys = Ks({ isString: wr }), Xa = {
|
||
forEachDeep: Ys
|
||
}, Gs = {
|
||
/**
|
||
* 重构object,但忽略某些字段
|
||
* @param ref
|
||
* @param skips
|
||
*/
|
||
omit(e, ...t) {
|
||
const n = Object.keys(e.value), o = {};
|
||
for (const r of n)
|
||
r !== "loading" && (t.indexOf(r) >= 0 || (o[r] = e.value[r]));
|
||
return o;
|
||
}
|
||
};
|
||
function ma(e) {
|
||
const t = document.createElement("textarea");
|
||
t.value = e, t.style.position = "fixed", t.style.top = "0", t.style.left = "0", t.style.opacity = "0", t.style.pointerEvents = "none", t.style.zIndex = "-1", document.body.appendChild(t);
|
||
try {
|
||
t.select(), t.setSelectionRange(0, 99999);
|
||
const n = document.execCommand("copy");
|
||
return document.body.removeChild(t), n ? !0 : (console.error("传统复制方法失败"), !1);
|
||
} catch (n) {
|
||
return console.error("传统复制方法出错: ", n), document.body.removeChild(t), !1;
|
||
}
|
||
}
|
||
async function Xs(e) {
|
||
try {
|
||
return !navigator.clipboard || !navigator.clipboard.writeText ? (console.warn("Clipboard API not supported, falling back to traditional method"), ma(e)) : (await navigator.clipboard.writeText(e), !0);
|
||
} catch (t) {
|
||
return console.error("复制失败: ", t), ma(e);
|
||
}
|
||
}
|
||
async function Js() {
|
||
return new Promise((e, t) => {
|
||
const n = document.createElement("textarea");
|
||
n.style.position = "fixed", n.style.top = "0", n.style.left = "0", n.style.opacity = "0", document.body.appendChild(n);
|
||
try {
|
||
if (n.focus(), document.execCommand("paste")) {
|
||
const r = n.value;
|
||
document.body.removeChild(n), e(r);
|
||
} else
|
||
document.body.removeChild(n), t(new Error("传统读取方法失败"));
|
||
} finally {
|
||
document.body.removeChild(n);
|
||
}
|
||
});
|
||
}
|
||
async function Qs() {
|
||
try {
|
||
if (!navigator.clipboard || !navigator.clipboard.readText)
|
||
throw console.warn("Clipboard API not supported for reading"), new Error("浏览器不支持读取剪贴板");
|
||
if (navigator.permissions && (await navigator.permissions.query({ name: "clipboard-read" })).state === "denied")
|
||
throw new Error("剪贴板读取权限被拒绝");
|
||
return await navigator.clipboard.readText();
|
||
} catch (e) {
|
||
return console.error("读取剪贴板失败: ", e), await Js();
|
||
}
|
||
}
|
||
const Gr = un({
|
||
store: {}
|
||
});
|
||
function Zs(e, t = "__default__") {
|
||
Gr.store[t] = e;
|
||
}
|
||
function el(e = "__default__") {
|
||
return Gr.store[e];
|
||
}
|
||
function tl(e = "__default__") {
|
||
Gr.store[e] = "";
|
||
}
|
||
const nl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
clearMemoryClipboard: tl,
|
||
copyToClipboard: Xs,
|
||
copyToMemory: Zs,
|
||
readToClipboard: Qs,
|
||
readToMemory: el
|
||
}, Symbol.toStringTag, { value: "Module" })), an = {
|
||
logger: de,
|
||
strings: Ur,
|
||
trace: Is,
|
||
vite: js,
|
||
store: Yr,
|
||
deepdash: Xa,
|
||
dash: Gs,
|
||
clipboard: nl
|
||
}, oo = {
|
||
commonOptions(e) {
|
||
return {};
|
||
},
|
||
defaultOptions(e) {
|
||
const { t, crudOptionsRef: n } = e, o = (a) => B(() => t(a)), r = Le.get();
|
||
return {
|
||
settings: {
|
||
plugins: {
|
||
mobile: {
|
||
enabled: !0,
|
||
props: {
|
||
isMobile: B(() => window.innerWidth < 768)
|
||
}
|
||
}
|
||
}
|
||
},
|
||
mode: {},
|
||
status: {},
|
||
search: {
|
||
container: {
|
||
is: "fs-search-layout-default",
|
||
collapse: !0,
|
||
col: {
|
||
span: 4
|
||
}
|
||
},
|
||
formItem: {
|
||
wrapperCol: {
|
||
style: {
|
||
// width: "50%"
|
||
}
|
||
}
|
||
},
|
||
options: {
|
||
...r.form.inlineLayout,
|
||
// n-form 是否显示校验反馈
|
||
showFeedback: !1
|
||
},
|
||
onValidateError({ trigger: a }) {
|
||
a === "search" && r.notification.error({ message: t("fs.search.error.message") });
|
||
},
|
||
collapse: !0,
|
||
show: !0,
|
||
buttons: {
|
||
search: {
|
||
className: {
|
||
"fs-search-btn-search": !0
|
||
},
|
||
icon: r.icons.search
|
||
},
|
||
reset: {
|
||
className: {
|
||
"fs-search-btn-reset": !0
|
||
},
|
||
icon: r.icons.refresh
|
||
}
|
||
}
|
||
},
|
||
form: {
|
||
pasteKey: "__default__",
|
||
labelPlacement: "left",
|
||
labelPosition: "right",
|
||
labelWidth: "120px",
|
||
style: {
|
||
"grid-template-columns": "50% 50%"
|
||
// grid布局,默认两列
|
||
},
|
||
row: {
|
||
gutter: 10
|
||
},
|
||
col: { span: 12 },
|
||
labelAlign: "right",
|
||
labelCol: { span: 4 },
|
||
wrapperCol: { span: 18 },
|
||
wrapper: {
|
||
is: r.dialog.name,
|
||
...r.formWrapper.buildWidthBind(r.dialog.name, "960px"),
|
||
...r.formWrapper.buildInitBind(r.dialog.name),
|
||
dragenabled: !0,
|
||
destroyOnClose: !0,
|
||
...r.dialog.footer(),
|
||
buttons: {
|
||
copy: {
|
||
text: o("fs.form.copy"),
|
||
order: 1,
|
||
click: async ({ form: a }) => {
|
||
var s, u;
|
||
const i = (u = (s = n.value) == null ? void 0 : s.form) == null ? void 0 : u.pasteKey;
|
||
an.clipboard.copyToMemory(JSON.stringify(a), i), r.message.success(t("fs.form.copySuccess"));
|
||
}
|
||
},
|
||
paste: {
|
||
text: o("fs.form.paste"),
|
||
order: 2,
|
||
badge: B(() => {
|
||
var s, u;
|
||
const a = (u = (s = n.value) == null ? void 0 : s.form) == null ? void 0 : u.pasteKey, i = an.clipboard.readToMemory(a);
|
||
return {
|
||
[r.badge.value]: i ? 1 : 0,
|
||
[r.badge.dot]: !!i
|
||
};
|
||
}),
|
||
click: async ({ form: a }) => {
|
||
var u, l;
|
||
const i = (l = (u = n.value) == null ? void 0 : u.form) == null ? void 0 : l.pasteKey, s = an.clipboard.readToMemory(i);
|
||
if (s)
|
||
try {
|
||
const c = JSON.parse(s);
|
||
mo(a, c);
|
||
} catch (c) {
|
||
console.error(c);
|
||
} finally {
|
||
an.clipboard.clearMemoryClipboard(i);
|
||
}
|
||
}
|
||
},
|
||
cancel: {
|
||
text: o("fs.form.cancel"),
|
||
order: 4,
|
||
click: ({ doClose: a }) => {
|
||
a();
|
||
}
|
||
},
|
||
reset: {
|
||
text: o("fs.form.reset"),
|
||
order: 3,
|
||
click: ({ reset: a }) => {
|
||
a();
|
||
}
|
||
},
|
||
ok: {
|
||
text: o("fs.form.ok"),
|
||
order: 5,
|
||
type: "primary",
|
||
click: async ({ submit: a }) => {
|
||
await a();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
addForm: {
|
||
mode: "add",
|
||
wrapper: {
|
||
title: o("fs.addForm.title")
|
||
}
|
||
},
|
||
editForm: {
|
||
mode: "edit",
|
||
wrapper: {
|
||
title: o("fs.editForm.title")
|
||
}
|
||
},
|
||
viewForm: {
|
||
mode: "view",
|
||
wrapper: {
|
||
title: o("fs.viewForm.title"),
|
||
buttons: {
|
||
reset: {
|
||
show: !1
|
||
},
|
||
cancel: {
|
||
show: !1
|
||
}
|
||
}
|
||
}
|
||
},
|
||
rowHandle: {
|
||
width: 250,
|
||
title: o("fs.rowHandle.title"),
|
||
order: 1e3,
|
||
dropdown: {
|
||
// 操作列折叠
|
||
more: {
|
||
text: null,
|
||
type: "primary",
|
||
icon: r.icons.more
|
||
}
|
||
}
|
||
},
|
||
pagination: {
|
||
background: !0,
|
||
pageSize: 20,
|
||
[r.pagination.currentPage]: 1,
|
||
[r.pagination.total]: 1,
|
||
pageSizes: [5, 10, 20, 50],
|
||
layout: "total, sizes, prev, pager, next, jumper",
|
||
showSizeChanger: !0,
|
||
showQuickJumper: !0,
|
||
showSizePicker: !0,
|
||
showTotal: (a) => t("fs.pagination.showTotal", [a])
|
||
//antdv
|
||
},
|
||
table: {
|
||
show: !0,
|
||
height: "100%",
|
||
rowKey: r.table.defaultRowKey,
|
||
stripe: !0,
|
||
border: !0,
|
||
bordered: !0,
|
||
singleLine: !1,
|
||
scrollTopOnRefreshed: !0,
|
||
editable: { enabled: !1, rowKey: "$editable_id" },
|
||
pagination: !1
|
||
//antdv 关闭默认分页
|
||
},
|
||
toolbar: {
|
||
compact: !0,
|
||
buttons: {
|
||
search: {
|
||
className: {
|
||
"fs-toolbar-btn-search": !0
|
||
}
|
||
},
|
||
compact: {
|
||
className: {
|
||
"fs-toolbar-btn-compact": !0
|
||
}
|
||
},
|
||
refresh: {
|
||
className: {
|
||
"fs-toolbar-btn-refresh": !0
|
||
}
|
||
},
|
||
export: {
|
||
className: {
|
||
"fs-toolbar-btn-export": !0
|
||
}
|
||
},
|
||
columns: {
|
||
className: {
|
||
"fs-toolbar-btn-columns": !0
|
||
}
|
||
}
|
||
}
|
||
},
|
||
actionbar: {
|
||
buttons: {
|
||
add: {
|
||
className: {
|
||
"fs-actionbar-btn-add": !0
|
||
},
|
||
type: "primary",
|
||
text: o("fs.actionbar.add")
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
};
|
||
function rr(e, t) {
|
||
return e.type !== "antdv" ? {} : { labelCol: { span: t }, wrapperCol: { span: 23 - t } };
|
||
}
|
||
function ol() {
|
||
const { ui: e } = Ce();
|
||
return {
|
||
colspan: {
|
||
//跨列
|
||
form: {
|
||
col: { span: 24 },
|
||
...rr(e, 2)
|
||
}
|
||
},
|
||
colspan3: {
|
||
//跨列
|
||
form: {
|
||
col: { span: 24 },
|
||
...rr(e, 3)
|
||
}
|
||
},
|
||
colspan4: {
|
||
//跨列
|
||
form: {
|
||
col: { span: 24 },
|
||
...rr(e, 4)
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const rl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: ol
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function al() {
|
||
const e = Le.get();
|
||
return {
|
||
button: {
|
||
form: {
|
||
component: {
|
||
name: e.input.name,
|
||
vModel: e.input.modelValue,
|
||
[e.input.clearable]: !0
|
||
}
|
||
},
|
||
column: {
|
||
component: {
|
||
name: "fs-button",
|
||
vModel: "text"
|
||
}
|
||
}
|
||
},
|
||
link: {
|
||
form: {
|
||
component: {
|
||
name: e.input.name,
|
||
vModel: e.input.modelValue,
|
||
[e.input.clearable]: !0
|
||
}
|
||
},
|
||
column: {
|
||
component: {
|
||
name: "fs-button",
|
||
vModel: "text",
|
||
...e.button.linkType
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const il = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: al
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function sl() {
|
||
const e = Le.get();
|
||
return {
|
||
"dict-cascader": {
|
||
search: {
|
||
component: {
|
||
clearable: !0
|
||
}
|
||
},
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-cascader",
|
||
vModel: e.cascader.modelValue,
|
||
[e.cascader.clearable]: !0
|
||
}
|
||
},
|
||
column: {
|
||
component: { name: "fs-dict-cascader-format" }
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const ll = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: sl
|
||
}, Symbol.toStringTag, { value: "Module" })), Ja = {
|
||
name: "zh-cn",
|
||
fs: {
|
||
component: {
|
||
select: {
|
||
placeholder: "请选择"
|
||
}
|
||
},
|
||
addForm: { title: "添加" },
|
||
editForm: { title: "编辑" },
|
||
viewForm: { title: "查看" },
|
||
rowHandle: {
|
||
title: "操作",
|
||
remove: {
|
||
text: "删除",
|
||
confirmTitle: "删除提示",
|
||
confirmMessage: "您确定要删除该记录吗?",
|
||
success: "删除成功!",
|
||
confirmText: "确定",
|
||
cancelText: "取消"
|
||
},
|
||
copy: {
|
||
text: "复制"
|
||
},
|
||
edit: {
|
||
text: "编辑"
|
||
},
|
||
view: {
|
||
text: "查看"
|
||
}
|
||
},
|
||
form: {
|
||
cancel: "取消",
|
||
ok: "确定",
|
||
reset: "重置",
|
||
saveRemind: {
|
||
title: "提示",
|
||
content: "表单数据有变更,是否保存",
|
||
cancel: "不保存",
|
||
ok: "保存"
|
||
},
|
||
copy: "复制",
|
||
paste: "粘贴",
|
||
copySuccess: "表单数据已复制,您可以在添加对话框中粘贴"
|
||
},
|
||
actionbar: { add: "添加" },
|
||
toolbar: {
|
||
columnFilter: {
|
||
title: "列设置",
|
||
fixed: "固定",
|
||
order: "排序",
|
||
reset: "还原",
|
||
confirm: "确定",
|
||
unnamed: "未命名"
|
||
},
|
||
search: { title: "查询显示" },
|
||
refresh: { title: "刷新" },
|
||
compact: { title: "紧凑模式" },
|
||
export: { title: "导出" },
|
||
columns: { title: "列设置" }
|
||
},
|
||
search: {
|
||
container: {
|
||
collapseButton: {
|
||
text: {
|
||
collapse: "收起",
|
||
expand: "展开"
|
||
}
|
||
}
|
||
},
|
||
search: { text: "查询" },
|
||
reset: { text: "重置" },
|
||
error: {
|
||
message: "查询表单校验失败"
|
||
}
|
||
},
|
||
pagination: {
|
||
showTotal: "共 {0} 条"
|
||
},
|
||
date: {
|
||
formatter: { to: "至" }
|
||
},
|
||
extends: {
|
||
tableSelect: {
|
||
view: "查看",
|
||
select: "选择",
|
||
ok: "确定",
|
||
cancel: "取消"
|
||
},
|
||
cropper: {
|
||
title: "图片裁剪",
|
||
preview: "预览",
|
||
reChoose: "重新选择",
|
||
flipX: "左右翻转",
|
||
flipY: "上下翻转",
|
||
reset: "重置",
|
||
cancel: "取消",
|
||
confirm: "确定",
|
||
chooseImage: "+ 选择图片",
|
||
onlySupport: "仅支持",
|
||
sizeLimit: "大小不能超过",
|
||
sizeNoLimit: "大小不限制"
|
||
},
|
||
fileUploader: {
|
||
text: "文件上传",
|
||
limitTip: "文件数量不能超过 {0}",
|
||
sizeLimitTip: "文件大小不能超过 {0},当前大小:{1}",
|
||
loadError: "图片加载失败",
|
||
pixelLimitTip: "图片像素尺寸不能超过 宽:{0},高:{1}",
|
||
hasUploading: "还有文件正在上传,请等待上传完成,或删除它"
|
||
}
|
||
}
|
||
}
|
||
}, ul = {
|
||
name: "en",
|
||
fs: {
|
||
component: {
|
||
select: {
|
||
placeholder: "please select"
|
||
}
|
||
},
|
||
addForm: { title: "add" },
|
||
editForm: { title: "edit" },
|
||
viewForm: { title: "view" },
|
||
rowHandle: {
|
||
title: "handle",
|
||
remove: {
|
||
text: "remove",
|
||
confirmTitle: "remove tip",
|
||
confirmMessage: "Are you sure you want to delete this record?",
|
||
success: "delete success!",
|
||
confirmText: "confirm",
|
||
cancelText: "cancel"
|
||
},
|
||
copy: {
|
||
text: "copy"
|
||
},
|
||
edit: {
|
||
text: "edit"
|
||
},
|
||
view: {
|
||
text: "view"
|
||
}
|
||
},
|
||
form: {
|
||
cancel: "cancel",
|
||
ok: "ok",
|
||
reset: "reset",
|
||
saveRemind: {
|
||
title: "save remind",
|
||
content: "The form data has changed, whether to save",
|
||
cancel: "don't save",
|
||
ok: "save"
|
||
},
|
||
copy: "copy",
|
||
paste: "paste"
|
||
},
|
||
actionbar: { add: "add" },
|
||
toolbar: {
|
||
columnFilter: {
|
||
title: "columns set",
|
||
fixed: "fixed",
|
||
order: "sort",
|
||
reset: "reset",
|
||
confirm: "ok",
|
||
unnamed: "unnamed"
|
||
},
|
||
search: { title: "show search bar" },
|
||
refresh: { title: "refresh" },
|
||
compact: { title: "compact mode" },
|
||
export: { title: "export" },
|
||
columns: { title: "columns set" }
|
||
},
|
||
search: {
|
||
container: {
|
||
collapseButton: {
|
||
text: {
|
||
collapse: "collapse",
|
||
expand: "expand"
|
||
}
|
||
}
|
||
},
|
||
search: { text: "search" },
|
||
reset: { text: "reset" },
|
||
error: {
|
||
message: "form valid error"
|
||
}
|
||
},
|
||
pagination: {
|
||
showTotal: "Total {0} items"
|
||
},
|
||
date: { formatter: { to: "to" } },
|
||
extends: {
|
||
tableSelect: {
|
||
view: "view",
|
||
select: "select"
|
||
},
|
||
cropper: {
|
||
title: "image crop",
|
||
preview: "preview",
|
||
reChoose: "reChoose",
|
||
flipX: "flipX",
|
||
flipY: "flipY",
|
||
reset: "reset",
|
||
cancel: "cancel",
|
||
confirm: "confirm",
|
||
chooseImage: "+ choose image",
|
||
onlySupport: "only",
|
||
sizeLimit: "size limit",
|
||
sizeNoLimit: " no limit"
|
||
},
|
||
fileUploader: {
|
||
text: "fileUpload",
|
||
limitTip: "file count limit: {0}",
|
||
sizeLimitTip: "file size limit: {0}, current size: {1}",
|
||
loadError: "image load error",
|
||
pixelLimitTip: "pixel limit : width:{0},height:{1}",
|
||
hasUploading: "The file is being uploaded, please wait for the upload to complete or delete"
|
||
}
|
||
}
|
||
}
|
||
};
|
||
function cl(e, t) {
|
||
let n = et(Ja, e);
|
||
return n == null ? e : t instanceof Array ? (G(t, (o, r) => {
|
||
n = n.replace("{" + r + "}", o);
|
||
}), n) : n.replace("{n}", t);
|
||
}
|
||
class dl {
|
||
constructor() {
|
||
se(this, "vueI18nInstance", null);
|
||
}
|
||
t(t, n) {
|
||
return cl(t, n);
|
||
}
|
||
setVueI18n(t) {
|
||
if (!t)
|
||
return;
|
||
t.global && (t = t.global);
|
||
const n = t.availableLocales;
|
||
for (const o of n) {
|
||
if (o.startsWith("zh")) {
|
||
const r = t.getLocaleMessage(o), a = dt(r.fs || {});
|
||
t.mergeLocaleMessage(o, { fs: Ja.fs }), t.mergeLocaleMessage(o, { fs: a });
|
||
} else if (o.startsWith("en")) {
|
||
const r = t.getLocaleMessage(o), a = dt(r.fs || {});
|
||
t.mergeLocaleMessage(o, { fs: ul.fs }), t.mergeLocaleMessage(o, { fs: a });
|
||
}
|
||
de.debug("i18n", t.getLocaleMessage(o));
|
||
}
|
||
this.vueI18nInstance = t;
|
||
}
|
||
}
|
||
const ko = new dl();
|
||
function ut() {
|
||
return ko.vueI18nInstance != null ? {
|
||
// @ts-ignore
|
||
t: ko.vueI18nInstance.t
|
||
} : { t: ko.t };
|
||
}
|
||
var Zo = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
|
||
function er(e) {
|
||
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
|
||
}
|
||
var Qa = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(Zo, function() {
|
||
return function(n, o) {
|
||
var r = o.prototype, a = r.format;
|
||
r.format = function(i) {
|
||
var s = this, u = this.$locale();
|
||
if (!this.isValid())
|
||
return a.bind(this)(i);
|
||
var l = this.$utils(), c = (i || "YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function(d) {
|
||
switch (d) {
|
||
case "Q":
|
||
return Math.ceil((s.$M + 1) / 3);
|
||
case "Do":
|
||
return u.ordinal(s.$D);
|
||
case "gggg":
|
||
return s.weekYear();
|
||
case "GGGG":
|
||
return s.isoWeekYear();
|
||
case "wo":
|
||
return u.ordinal(s.week(), "W");
|
||
case "w":
|
||
case "ww":
|
||
return l.s(s.week(), d === "w" ? 1 : 2, "0");
|
||
case "W":
|
||
case "WW":
|
||
return l.s(s.isoWeek(), d === "W" ? 1 : 2, "0");
|
||
case "k":
|
||
case "kk":
|
||
return l.s(String(s.$H === 0 ? 24 : s.$H), d === "k" ? 1 : 2, "0");
|
||
case "X":
|
||
return Math.floor(s.$d.getTime() / 1e3);
|
||
case "x":
|
||
return s.$d.getTime();
|
||
case "z":
|
||
return "[" + s.offsetName() + "]";
|
||
case "zzz":
|
||
return "[" + s.offsetName("long") + "]";
|
||
default:
|
||
return d;
|
||
}
|
||
});
|
||
return a.bind(this)(c);
|
||
};
|
||
};
|
||
});
|
||
})(Qa);
|
||
var fl = Qa.exports;
|
||
const hl = /* @__PURE__ */ er(fl);
|
||
ot.extend(hl);
|
||
function ar(e, t) {
|
||
if (!Ur.isEmpty(e))
|
||
return ot(e).format(t);
|
||
}
|
||
function Za(e, t = "YYYY-MM-DD HH:mm:ss") {
|
||
if (e != null && e instanceof Array && e.length > 1) {
|
||
if (Ur.hasEmpty(e))
|
||
return;
|
||
const { t: n } = ut();
|
||
return `${ar(e[0], t)} ${n("fs.date.formatter.to")} ${ar(e[1], t)}`;
|
||
}
|
||
return ar(e, t);
|
||
}
|
||
function ml(e) {
|
||
const { value: t } = e;
|
||
return Za(t, "YYYY-MM-DD");
|
||
}
|
||
function pl(e) {
|
||
const { value: t } = e;
|
||
return Za(t, "YYYY-MM-DD HH:mm:ss");
|
||
}
|
||
var ei = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(Zo, function() {
|
||
var n = "week", o = "year";
|
||
return function(r, a, i) {
|
||
var s = a.prototype;
|
||
s.week = function(u) {
|
||
if (u === void 0 && (u = null), u !== null)
|
||
return this.add(7 * (u - this.week()), "day");
|
||
var l = this.$locale().yearStart || 1;
|
||
if (this.month() === 11 && this.date() > 25) {
|
||
var c = i(this).startOf(o).add(1, o).date(l), d = i(this).endOf(n);
|
||
if (c.isBefore(d))
|
||
return 1;
|
||
}
|
||
var h = i(this).startOf(o).date(l).startOf(n).subtract(1, "millisecond"), f = this.diff(h, n, !0);
|
||
return f < 0 ? i(this).startOf("week").week() : Math.ceil(f);
|
||
}, s.weeks = function(u) {
|
||
return u === void 0 && (u = null), this.week(u);
|
||
};
|
||
};
|
||
});
|
||
})(ei);
|
||
var gl = ei.exports;
|
||
const vl = /* @__PURE__ */ er(gl);
|
||
var ti = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(Zo, function() {
|
||
return function(n, o) {
|
||
o.prototype.weekday = function(r) {
|
||
var a = this.$locale().weekStart || 0, i = this.$W, s = (i < a ? i + 7 : i) - a;
|
||
return this.$utils().u(r) ? s : this.subtract(s, "day").add(r, "day");
|
||
};
|
||
};
|
||
});
|
||
})(ti);
|
||
var bl = ti.exports;
|
||
const yl = /* @__PURE__ */ er(bl);
|
||
var ni = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(Zo, function() {
|
||
return function(n, o, r) {
|
||
var a = o.prototype, i = function(d) {
|
||
return d && (d.indexOf ? d : d.s);
|
||
}, s = function(d, h, f, v, p) {
|
||
var y = d.name ? d : d.$locale(), b = i(y[h]), F = i(y[f]), R = b || F.map(function(A) {
|
||
return A.slice(0, v);
|
||
});
|
||
if (!p)
|
||
return R;
|
||
var D = y.weekStart;
|
||
return R.map(function(A, $) {
|
||
return R[($ + (D || 0)) % 7];
|
||
});
|
||
}, u = function() {
|
||
return r.Ls[r.locale()];
|
||
}, l = function(d, h) {
|
||
return d.formats[h] || function(f) {
|
||
return f.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(v, p, y) {
|
||
return p || y.slice(1);
|
||
});
|
||
}(d.formats[h.toUpperCase()]);
|
||
}, c = function() {
|
||
var d = this;
|
||
return { months: function(h) {
|
||
return h ? h.format("MMMM") : s(d, "months");
|
||
}, monthsShort: function(h) {
|
||
return h ? h.format("MMM") : s(d, "monthsShort", "months", 3);
|
||
}, firstDayOfWeek: function() {
|
||
return d.$locale().weekStart || 0;
|
||
}, weekdays: function(h) {
|
||
return h ? h.format("dddd") : s(d, "weekdays");
|
||
}, weekdaysMin: function(h) {
|
||
return h ? h.format("dd") : s(d, "weekdaysMin", "weekdays", 2);
|
||
}, weekdaysShort: function(h) {
|
||
return h ? h.format("ddd") : s(d, "weekdaysShort", "weekdays", 3);
|
||
}, longDateFormat: function(h) {
|
||
return l(d.$locale(), h);
|
||
}, meridiem: this.$locale().meridiem, ordinal: this.$locale().ordinal };
|
||
};
|
||
a.localeData = function() {
|
||
return c.bind(this)();
|
||
}, r.localeData = function() {
|
||
var d = u();
|
||
return { firstDayOfWeek: function() {
|
||
return d.weekStart || 0;
|
||
}, weekdays: function() {
|
||
return r.weekdays();
|
||
}, weekdaysShort: function() {
|
||
return r.weekdaysShort();
|
||
}, weekdaysMin: function() {
|
||
return r.weekdaysMin();
|
||
}, months: function() {
|
||
return r.months();
|
||
}, monthsShort: function() {
|
||
return r.monthsShort();
|
||
}, longDateFormat: function(h) {
|
||
return l(d, h);
|
||
}, meridiem: d.meridiem, ordinal: d.ordinal };
|
||
}, r.months = function() {
|
||
return s(u(), "months");
|
||
}, r.monthsShort = function() {
|
||
return s(u(), "monthsShort", "months", 3);
|
||
}, r.weekdays = function(d) {
|
||
return s(u(), "weekdays", null, null, d);
|
||
}, r.weekdaysShort = function(d) {
|
||
return s(u(), "weekdaysShort", "weekdays", 3, d);
|
||
}, r.weekdaysMin = function(d) {
|
||
return s(u(), "weekdaysMin", "weekdays", 2, d);
|
||
};
|
||
};
|
||
});
|
||
})(ni);
|
||
var wl = ni.exports;
|
||
const _l = /* @__PURE__ */ er(wl);
|
||
ot.extend(yl);
|
||
ot.extend(_l);
|
||
ot.extend(vl);
|
||
function Cl() {
|
||
const e = Le.get();
|
||
function t(o) {
|
||
const { row: r, key: a, value: i } = o;
|
||
i != null && (e.type === "naive" ? r[a] = ot(i).valueOf() : e.type === "antdv" && e.version === "4" || e.type);
|
||
}
|
||
return {
|
||
datetime: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("datetime"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
width: 170,
|
||
component: { name: "fs-date-format" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
date: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("date"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
align: "center",
|
||
width: 120,
|
||
component: { name: "fs-date-format", format: "YYYY-MM-DD" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
daterange: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("daterange"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: { width: 210, formatter: ml },
|
||
valueBuilder({ row: o, key: r, value: a }) {
|
||
a != null && Array.isArray(a) && a.length === 2 && a != null && (e.type === "naive" ? o[r] = [ot(a[0]).valueOf(), ot(a[1]).valueOf()] : o[r] = [ot(a[0]), ot(a[1])]);
|
||
}
|
||
},
|
||
datetimerange: {
|
||
form: {
|
||
component: {
|
||
...e.datePicker.buildDateType("datetimerange"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
width: 340,
|
||
formatter: pl
|
||
},
|
||
valueBuilder({ row: o, key: r, value: a }) {
|
||
a != null && Array.isArray(a) && a.length === 2 && (e.type === "naive" ? o[r] = [ot(a[0]).valueOf(), ot(a[1]).valueOf()] : o[r] = [ot(a[0]), ot(a[1])]);
|
||
}
|
||
},
|
||
time: {
|
||
form: {
|
||
component: {
|
||
//el-time-picker,a-time-picker
|
||
name: e.timePicker.name,
|
||
vModel: e.timePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
width: 100,
|
||
align: "center",
|
||
component: { name: "fs-date-format", format: "HH:mm:ss" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
month: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("month"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
align: "center",
|
||
width: 120,
|
||
component: { name: "fs-date-format", format: "YYYY-MM" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
week: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("week"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
align: "center",
|
||
width: 120,
|
||
component: { name: "fs-date-format", format: "YYYY-ww[周]" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
quarter: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("quarter"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
align: "center",
|
||
width: 120,
|
||
component: { name: "fs-date-format", format: "YYYY-[Q]Q" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
},
|
||
year: {
|
||
form: {
|
||
component: {
|
||
//el-date-picker,a-date-picker
|
||
...e.datePicker.buildDateType("year"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
align: "center",
|
||
width: 120,
|
||
component: { name: "fs-date-format", format: "YYYY" }
|
||
},
|
||
valueBuilder(o) {
|
||
t(o);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const Sl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Cl
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Fl() {
|
||
const { ui: e } = Ce();
|
||
return {
|
||
number: {
|
||
form: { component: { name: e.number.name, props: {} } },
|
||
align: "center"
|
||
},
|
||
switch: {
|
||
form: { component: { name: e.switch.name, props: {} } },
|
||
component: { name: e.switch.name, props: {} },
|
||
align: "center"
|
||
},
|
||
slider: {
|
||
form: { component: { name: "el-slider", props: {} } },
|
||
align: "center"
|
||
},
|
||
rate: {
|
||
form: { component: { name: "el-rate", props: {} } },
|
||
align: "center"
|
||
},
|
||
"color-picker": {
|
||
form: { component: { name: "el-color-picker", props: {} } },
|
||
align: "center"
|
||
},
|
||
transfer: {
|
||
form: { component: { name: "el-transfer", props: {} } },
|
||
align: "center"
|
||
},
|
||
autocomplete: {
|
||
form: { component: { name: "el-autocomplete", props: {} } }
|
||
}
|
||
};
|
||
}
|
||
const Rl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Fl
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Dl() {
|
||
return {
|
||
icon: {
|
||
form: {
|
||
component: {
|
||
name: "fs-icon-selector",
|
||
vModel: "modelValue",
|
||
[Le.get().input.clearable]: !0
|
||
}
|
||
},
|
||
column: {
|
||
component: {
|
||
name: "fs-icon",
|
||
vModel: "icon",
|
||
style: "font-size:18px"
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const kl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Dl
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Ol() {
|
||
const e = Le.get();
|
||
return {
|
||
number: {
|
||
form: {
|
||
component: {
|
||
// el-input-number,a-input-number
|
||
name: e.number.name,
|
||
vModel: e.modelValue
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const $l = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Ol
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function El() {
|
||
return {
|
||
"phone-number": {
|
||
form: {
|
||
component: {
|
||
name: "el-phone-number-input"
|
||
}
|
||
},
|
||
column: {
|
||
formatter(e, t, n) {
|
||
let o = "";
|
||
return n != null && (n.callingCode != null ? o += "(+" + n.callingCode + ")" : n.countryCode != null && (o += "(" + n.countryCode + ")"), n.phoneNumber != null && (o += n.phoneNumber)), o;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const Tl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: El
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Il() {
|
||
const e = Le.get();
|
||
return {
|
||
select: {
|
||
search: { autoSearchTrigger: "change" },
|
||
form: {
|
||
component: {
|
||
name: e.select.name,
|
||
[e.select.clearable]: !0
|
||
}
|
||
}
|
||
},
|
||
"dict-select": {
|
||
search: { autoSearchTrigger: "change" },
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } },
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-select",
|
||
vModel: e.select.modelValue,
|
||
[e.select.clearable]: !0
|
||
}
|
||
}
|
||
},
|
||
"table-select": {
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } },
|
||
form: {
|
||
component: {
|
||
name: "fs-table-select"
|
||
}
|
||
}
|
||
},
|
||
"editable-select": {
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } },
|
||
form: {
|
||
component: {
|
||
name: "fs-editable-select"
|
||
}
|
||
}
|
||
},
|
||
"dict-radio": {
|
||
search: {
|
||
component: {
|
||
name: "fs-dict-select",
|
||
vModel: e.select.modelValue,
|
||
autoSearchTrigger: "change"
|
||
}
|
||
},
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-radio",
|
||
vModel: e.radioGroup.modelValue,
|
||
[e.select.clearable]: !0
|
||
}
|
||
},
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } }
|
||
},
|
||
"dict-checkbox": {
|
||
search: {
|
||
component: { name: "fs-dict-select" },
|
||
autoSearchTrigger: "change"
|
||
},
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-checkbox",
|
||
vModel: e.radioGroup.modelValue,
|
||
[e.select.clearable]: !0
|
||
}
|
||
},
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } }
|
||
},
|
||
"dict-switch": {
|
||
search: {
|
||
component: { name: "fs-dict-select", vModel: e.select.modelValue },
|
||
autoSearchTrigger: "change"
|
||
},
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-switch",
|
||
vModel: e.switch.modelValue,
|
||
[e.select.clearable]: !0
|
||
}
|
||
},
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } }
|
||
}
|
||
};
|
||
}
|
||
const Al = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Il
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Vl() {
|
||
const e = Le.get();
|
||
return {
|
||
text: {
|
||
form: {
|
||
component: {
|
||
// el-input, a-input
|
||
name: e.input.name,
|
||
vModel: e.textArea.modelValue,
|
||
[e.input.clearable]: !0
|
||
}
|
||
},
|
||
search: {
|
||
autoSearchTrigger: "enter"
|
||
}
|
||
},
|
||
password: {
|
||
form: {
|
||
component: {
|
||
// el-input / a-input-password
|
||
name: e.inputPassword.name,
|
||
vModel: e.inputPassword.modelValue,
|
||
...e.inputPassword.passwordType
|
||
}
|
||
},
|
||
search: {
|
||
autoSearchTrigger: "enter"
|
||
}
|
||
},
|
||
textarea: {
|
||
search: {
|
||
component: {
|
||
// el-input / a-input
|
||
name: e.input.name,
|
||
type: "text",
|
||
[e.input.clearable]: !0
|
||
},
|
||
autoSearchTrigger: "enter"
|
||
},
|
||
form: {
|
||
component: {
|
||
// el-input / a-textarea
|
||
name: e.textArea.name,
|
||
type: e.textArea.type,
|
||
vModel: e.textArea.modelValue,
|
||
[e.input.clearable]: !0
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const Pl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Vl
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Ml() {
|
||
const e = Le.get();
|
||
return {
|
||
"dict-tree": {
|
||
search: { autoSearchTrigger: "change" },
|
||
column: { component: { name: "fs-values-format", vModel: "modelValue" } },
|
||
form: {
|
||
component: {
|
||
name: "fs-dict-tree",
|
||
vModel: e.treeSelect.modelValue,
|
||
[e.treeSelect.clearable]: !0
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const Bl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Ml
|
||
}, Symbol.toStringTag, { value: "Module" })), jl = /* @__PURE__ */ Object.assign({ "./list/assist.ts": rl, "./list/button.ts": il, "./list/cascader.ts": ll, "./list/date.ts": Sl, "./list/el.ts": Rl, "./list/icon.ts": kl, "./list/number.ts": $l, "./list/phone.ts": Tl, "./list/select.ts": Al, "./list/text.ts": Pl, "./list/tree.ts": Bl }), oi = [];
|
||
G(jl, (e) => {
|
||
oi.push(e.default);
|
||
});
|
||
const ro = {};
|
||
function Nl() {
|
||
return ro;
|
||
}
|
||
function xl(e) {
|
||
return ro[e];
|
||
}
|
||
function Ll(e) {
|
||
for (const t in e)
|
||
ro[t] = e[t];
|
||
}
|
||
const $n = {
|
||
getType: xl,
|
||
addTypes: Ll,
|
||
getTypes: Nl,
|
||
install() {
|
||
for (const e of oi)
|
||
G(e(), (t, n) => {
|
||
ro[n] = t;
|
||
});
|
||
de.debug("types installed:", ro);
|
||
}
|
||
}, ql = ue({
|
||
name: "FsPage",
|
||
setup() {
|
||
const e = K();
|
||
return Cn(() => {
|
||
window.getComputedStyle(e.value.parentNode).getPropertyValue("position") !== "relative" && an.logger.warn(
|
||
"fs-page父节点的position建议为relative,因为fs-page为相对定位(position:absolute),如果样式没有异常,你可以忽略此警告"
|
||
);
|
||
}), {
|
||
pageRef: e
|
||
};
|
||
}
|
||
});
|
||
const Te = (e, t) => {
|
||
const n = e.__vccOpts || e;
|
||
for (const [o, r] of t)
|
||
n[o] = r;
|
||
return n;
|
||
}, Hl = {
|
||
ref: "pageRef",
|
||
class: "fs-page"
|
||
}, zl = {
|
||
key: 0,
|
||
class: "fs-page-header"
|
||
}, Wl = { class: "fs-page-content" }, Ul = {
|
||
key: 1,
|
||
class: "fs-page-footer"
|
||
};
|
||
function Kl(e, t, n, o, r, a) {
|
||
return w(), j("div", Hl, [
|
||
e.$slots.header != null ? (w(), j("div", zl, [
|
||
ae(e.$slots, "header")
|
||
])) : ne("", !0),
|
||
ee("div", Wl, [
|
||
ae(e.$slots, "default")
|
||
]),
|
||
e.$slots.footer != null ? (w(), j("div", Ul, [
|
||
ae(e.$slots, "footer")
|
||
])) : ne("", !0)
|
||
], 512);
|
||
}
|
||
const Yl = /* @__PURE__ */ Te(ql, [["render", Kl]]);
|
||
function Cr(e) {
|
||
return e != null && (e instanceof ri || Bo(e) || La(e));
|
||
}
|
||
function pa(e) {
|
||
return Cr(e) && !e.cloneable;
|
||
}
|
||
function Gl(e, ...t) {
|
||
function n(r, a) {
|
||
if (a != null && (No(r) || Cr(a)))
|
||
return a;
|
||
}
|
||
let o = null;
|
||
for (const r of t)
|
||
Cr(r) && (o = r);
|
||
return o || hs(e, ...t, n);
|
||
}
|
||
function Xl(e) {
|
||
if (pa(e))
|
||
return e;
|
||
function t(n) {
|
||
if (pa(n))
|
||
return n;
|
||
}
|
||
return ms(e, t);
|
||
}
|
||
let ri = class {
|
||
constructor() {
|
||
se(this, "cloneable", !1);
|
||
}
|
||
setCloneable(t) {
|
||
this.cloneable = t;
|
||
}
|
||
};
|
||
function $e() {
|
||
return {
|
||
merge: Gl,
|
||
cloneDeep: Xl,
|
||
UnMergeable: ri
|
||
};
|
||
}
|
||
const { cloneDeep: Jl } = $e();
|
||
function Ql(e) {
|
||
return e instanceof Xr;
|
||
}
|
||
function Zl(e) {
|
||
return e instanceof tr;
|
||
}
|
||
function ga(e, t, n) {
|
||
const o = {};
|
||
if (e == null)
|
||
return o;
|
||
const r = n ? Ql : Zl;
|
||
return Xa.forEachDeep(e, (a, i, s, u) => {
|
||
if (a == null)
|
||
return !1;
|
||
if (r(a)) {
|
||
const l = u.path;
|
||
if (t) {
|
||
for (const c of t)
|
||
if (typeof c == "string") {
|
||
if (l.startsWith(c))
|
||
return !1;
|
||
} else if (c instanceof RegExp && c.test(l))
|
||
return !0;
|
||
}
|
||
return o[l] = a, !1;
|
||
}
|
||
return !La(a);
|
||
}, {
|
||
// https://deepdash.io/#eachdeep-foreachdeep
|
||
checkCircular: !0
|
||
}), o;
|
||
}
|
||
function eu(e, t) {
|
||
if (e == null || Object.keys(e).length <= 0)
|
||
return null;
|
||
const n = {};
|
||
return G(e, (o, r) => {
|
||
n[r] = o.buildAsyncRef(t);
|
||
}), n;
|
||
}
|
||
function tu(e, t) {
|
||
t == null || Object.keys(t).length <= 0 || G(t, (n, o) => {
|
||
We(e, o, n.value == null ? null : n.value);
|
||
});
|
||
}
|
||
function nu(e, t, n, o) {
|
||
const r = B(() => {
|
||
const s = e();
|
||
return ga(s, n, !1);
|
||
}), a = B(() => {
|
||
const s = e();
|
||
return ga(s, n, !0);
|
||
}), i = eu(a.value, t);
|
||
return B(() => {
|
||
let s = e();
|
||
const u = Object.keys(a.value).length, l = Object.keys(r.value).length;
|
||
if (u > 0 || l > 0) {
|
||
if (s = Jl(s), l > 0) {
|
||
const c = t ? t() : {};
|
||
G(r.value, (d, h) => {
|
||
We(s, h, d.computeFn(c));
|
||
});
|
||
}
|
||
u > 0 && tu(s, i);
|
||
}
|
||
return o ? o(s) : s;
|
||
});
|
||
}
|
||
class tr {
|
||
constructor(t) {
|
||
se(this, "computeFn");
|
||
this.computeFn = t;
|
||
}
|
||
}
|
||
function ou(e) {
|
||
return new tr(e);
|
||
}
|
||
class Xr {
|
||
constructor(t) {
|
||
se(this, "watch");
|
||
se(this, "asyncFn");
|
||
se(this, "defaultValue");
|
||
const { asyncFn: n, defaultValue: o } = t;
|
||
this.watch = t.watch, this.asyncFn = n, this.defaultValue = o;
|
||
}
|
||
buildAsyncRef(t) {
|
||
t = t || function() {
|
||
};
|
||
const n = K(this.defaultValue), o = B(() => this.watch ? this.watch(t()) : null);
|
||
return lt(() => o.value, async (r) => {
|
||
n.value = await this.asyncFn(r, t());
|
||
}, { immediate: !0 }), n;
|
||
}
|
||
}
|
||
function ru(e) {
|
||
return new Xr(e);
|
||
}
|
||
function Vt() {
|
||
return {
|
||
ComputeValue: tr,
|
||
compute: ou,
|
||
AsyncComputeValue: Xr,
|
||
asyncCompute: ru,
|
||
doComputed: nu
|
||
};
|
||
}
|
||
const cn = {
|
||
orderDefault: 1
|
||
}, {
|
||
merge: At,
|
||
cloneDeep: Kt
|
||
} = $e(), zn = [];
|
||
function ai(e) {
|
||
za(zn, (t) => t.name === e.name), zn.push(e), zn.sort((t, n) => t.order - n.order), de.debug("mergeColumnPlugin register success: current:", e, "registered:", zn);
|
||
}
|
||
function au(e) {
|
||
var t, n;
|
||
if (e.dict) {
|
||
if ((t = e.column) != null && t.component) {
|
||
const o = jo(Kt(e.dict));
|
||
o.cloneable && (o.cloneable = !1), e.column.component.dict = At(o, e.column.component.dict);
|
||
}
|
||
if ((n = e.form) != null && n.component) {
|
||
const o = jo(Kt(e.dict));
|
||
o.cloneable && (o.cloneable = !1), e.form.component.dict = At(o, e.form.component.dict);
|
||
}
|
||
}
|
||
return e;
|
||
}
|
||
function iu(e) {
|
||
if (!e.type)
|
||
return e;
|
||
let t = [];
|
||
typeof e.type == "string" ? t = [e.type] : e.type instanceof Array && (t = e.type);
|
||
const n = {};
|
||
for (const o of t) {
|
||
const r = $n.getType(o);
|
||
r && At(n, r);
|
||
}
|
||
return e = At(n, e), e;
|
||
}
|
||
const Ln = [];
|
||
Ln.push({
|
||
name: "type",
|
||
handle: iu,
|
||
order: -2
|
||
});
|
||
Ln.push({
|
||
name: "dict",
|
||
handle: au,
|
||
order: -1
|
||
});
|
||
Ln.push({
|
||
name: "viewFormUseCellComponent",
|
||
order: 10,
|
||
handle: (e = {}, t = {}) => {
|
||
var r, a;
|
||
if (!((r = t.settings) != null && r.viewFormUseCellComponent))
|
||
return e;
|
||
const o = {
|
||
component: ((a = e.column) == null ? void 0 : a.component) || {}
|
||
};
|
||
return (e.type === "text" || e.type instanceof Array && e.type.includes("text")) && (o.render || (o.render = (i) => {
|
||
const {
|
||
value: s
|
||
} = i;
|
||
return L("span", null, [s]);
|
||
})), At(e, {
|
||
viewForm: o
|
||
}), e;
|
||
}
|
||
});
|
||
Ln.push({
|
||
name: "NaiveFormRuleFix",
|
||
order: 10,
|
||
handle: (e = {}, t = {}) => {
|
||
var o, r, a, i, s;
|
||
const {
|
||
ui: n
|
||
} = Ce();
|
||
return n.type !== "naive" || ((o = e.addForm) != null && o.rules && (e.addForm.rule = e.addForm.rules), (r = e.editForm) != null && r.rules && (e.editForm.rule = e.editForm.rules), (a = e.viewForm) != null && a.rules && (e.viewForm.rule = e.viewForm.rules), (i = e.form) != null && i.rules && (e.form.rule = e.form.rules), (s = e.search) != null && s.rules && (e.search.rule = e.search.rules)), e;
|
||
}
|
||
});
|
||
Ln.push({
|
||
name: "DefaultOrder",
|
||
order: 0,
|
||
handle: (e = {}, t = {}, n) => (et(e, "column.order") == null && We(e, "column.order", n), et(e, "form.order") == null && We(e, "form.order", n), e)
|
||
});
|
||
for (const e of Ln)
|
||
ai(e);
|
||
function Jr(e, t) {
|
||
const n = {};
|
||
let o = 0;
|
||
return G(e, (r, a) => {
|
||
if (r.key = a, r.children)
|
||
r.children = Jr(r.children, t);
|
||
else
|
||
for (const i of zn)
|
||
r = i.handle(r, t, o);
|
||
n[a] = r, o++;
|
||
}), n;
|
||
}
|
||
function Qr(e = {}, t) {
|
||
return G(t, (n, o) => {
|
||
n.children ? Qr(e, n.children) : e[o] = n;
|
||
}), e;
|
||
}
|
||
function Zr(e = {}, t) {
|
||
return G(t, (n, o) => {
|
||
n.children ? Zr(e, n.children) : e[o] = n;
|
||
}), e;
|
||
}
|
||
function su(e) {
|
||
const t = e, n = t.column || {};
|
||
return n.title == null && (n.title = t.title), n.key = t.key, t.children && (n.children = si(t.children)), ii(n), un(n);
|
||
}
|
||
function ii(e) {
|
||
var t;
|
||
e && (t = e.component) != null && t.name && typeof e.component.name != "string" && (Bo(e.component.name) || (e.component.name = os(e.component.name)));
|
||
}
|
||
function si(e) {
|
||
let t = {};
|
||
return G(e, (n, o) => {
|
||
t[o] = su(n);
|
||
}), t = ea(t), t;
|
||
}
|
||
function lu(e) {
|
||
return Sn(e, (t) => t.order ?? cn.orderDefault);
|
||
}
|
||
function ea(e) {
|
||
const t = [];
|
||
for (const r in e) {
|
||
const a = e[r];
|
||
a.key = r, a.children && ps(a.children) > 0 && (a.children = ea(a.children)), t.push(a);
|
||
}
|
||
const n = lu(t), o = {};
|
||
for (const r of n)
|
||
o[r.key] = r;
|
||
return o;
|
||
}
|
||
function li(e, t) {
|
||
const n = {};
|
||
return G(e, (o) => {
|
||
const r = Kt(o[t]) || {};
|
||
t === "form" && r.title == null && (r.title = o.title), r.key = o.key, n[o.key] = r, ii(r);
|
||
}), n;
|
||
}
|
||
function Wn(e, t, n, o) {
|
||
const r = li(n, t), a = At(Kt(e.form), e[t], {
|
||
columns: r
|
||
});
|
||
return o && o(a), a;
|
||
}
|
||
function uu(e, t = "search", n) {
|
||
var s;
|
||
const o = li(n, t), r = {}, a = ((s = e.settings) == null ? void 0 : s.searchCopyFormProps) ?? ["component", "valueChange", "title", "key", "label", "render"];
|
||
function i(u, l, c) {
|
||
if (gs(a, c) && e.columns[l]) {
|
||
const h = e.columns[l][c];
|
||
h && (u[c] = h);
|
||
}
|
||
}
|
||
return G(Kt(e.form.columns), (u, l) => {
|
||
const c = {};
|
||
i(c, l, "valueResolve"), i(c, l, "valueBuilder"), r[l] = At(c, Wa(u, a));
|
||
}), At({
|
||
columns: r
|
||
}, {
|
||
columns: o
|
||
}, e.search);
|
||
}
|
||
function cu(e, t, n = "form") {
|
||
const {
|
||
t: o
|
||
} = ut(), {
|
||
merge: r
|
||
} = $e();
|
||
t = t || {};
|
||
const a = {
|
||
value: null
|
||
}, i = r(oo.defaultOptions({
|
||
t: o,
|
||
crudOptionsRef: a
|
||
}), oo.commonOptions({
|
||
crudOptions: e,
|
||
context: t,
|
||
crudExpose: null
|
||
}), e);
|
||
a.value = i;
|
||
const s = Jr(Kt(i.columns), i), u = Qr({}, s), l = n === "form" ? "form" : `${n}Form`;
|
||
return Wn(i, l, u);
|
||
}
|
||
function du(e) {
|
||
G(e.columns, (o, r) => {
|
||
o.key = r;
|
||
});
|
||
const t = Jr(Kt(e.columns), e);
|
||
e.columns = t;
|
||
const n = Qr({}, t);
|
||
return e.table.columns = si(Kt(t)), e.table.columnsMap = Zr({}, e.table.columns), At(e.toolbar, {
|
||
columnsFilter: {
|
||
originalColumns: Kt(e.table.columns)
|
||
}
|
||
}), e.form = Wn(e, "form", n), e.addForm = Wn(e, "addForm", n), e.editForm = Wn(e, "editForm", n), e.viewForm = Wn(e, "viewForm", n, (o) => {
|
||
G(o.columns, (r) => {
|
||
r.component || (r.component = {}), r.component.disabled = !0;
|
||
});
|
||
}), e.search = uu(e, "search", n), e.table.editable && (e.table.editable.addForm = At(e.addForm.columns, e.table.editable.addForm), e.table.editable.editForm = At(e.editForm.columns, e.table.editable.editForm)), e;
|
||
}
|
||
function Lo(e, t) {
|
||
G(e, (n, o) => {
|
||
n.key || (n.key = o), n.children ? Lo(n.children, t) : t(n, o);
|
||
});
|
||
}
|
||
function qo(e, t) {
|
||
G(e, (n, o) => {
|
||
n.key || (n.key = o), n.children ? qo(n.children, t) : t(n, o);
|
||
});
|
||
}
|
||
function ta() {
|
||
return {
|
||
buildFormOptions: cu,
|
||
buildColumns: du,
|
||
registerMergeColumnPlugin: ai,
|
||
forEachColumns: qo,
|
||
doColumnsSort: ea,
|
||
forEachTableColumns: Lo
|
||
};
|
||
}
|
||
let fu = 0;
|
||
const ir = {};
|
||
async function hu(e) {
|
||
const t = e.id || `${fu++}`, n = document.createElement("div");
|
||
return new Promise((o, r) => {
|
||
let a = ir[t];
|
||
a != null && (a.vm.exposed.open(e), o(a));
|
||
const i = L(ao, {
|
||
id: t,
|
||
onClosed() {
|
||
e.id || delete ir[t];
|
||
}
|
||
});
|
||
i.appContext = ao._context, rs(i, n), document.body.appendChild(n);
|
||
const u = i.component;
|
||
a = {
|
||
id: t,
|
||
vNode: i,
|
||
vm: u,
|
||
props: i.component.props
|
||
}, ir[t] = a, a.vm.exposed.open(e), o(a.vm.exposed);
|
||
});
|
||
}
|
||
function mu() {
|
||
let e = null;
|
||
try {
|
||
e = xn("use:form:wrapper", () => {
|
||
})();
|
||
} catch (o) {
|
||
de.warn("cant inject use:form:wrapper,建议在App.vue中使用<fs-form-provider>组件包裹<router-view/>", o);
|
||
}
|
||
let t = null;
|
||
e == null ? t = async (o) => await hu(o) : t = async (o) => await e.open(o);
|
||
async function n(o) {
|
||
const { buildFormOptions: r } = ta(), a = r(o.crudOptions, o.context);
|
||
return await t(a);
|
||
}
|
||
return {
|
||
openDialog: t,
|
||
openCrudFormDialog: n
|
||
};
|
||
}
|
||
const { merge: ui } = $e(), pu = ui;
|
||
function gu(e) {
|
||
const { crudExpose: t } = e, { crudBinding: n } = t;
|
||
Ce(), ut();
|
||
const { merge: o } = $e();
|
||
lt(() => {
|
||
var a, i, s;
|
||
return (s = (i = (a = n.value) == null ? void 0 : a.table) == null ? void 0 : i.editable) == null ? void 0 : s.enabled;
|
||
}, (a) => {
|
||
var s, u, l, c, d;
|
||
const i = (l = (u = (s = n.value) == null ? void 0 : s.table) == null ? void 0 : u.editable) == null ? void 0 : l.customRowHandleActive;
|
||
if (i) {
|
||
i({
|
||
enabled: a,
|
||
mode: (c = n.value.table.editable) == null ? void 0 : c.mode,
|
||
rowHandle: n.value.rowHandle
|
||
});
|
||
return;
|
||
}
|
||
a ? ((d = n.value.table.editable) == null ? void 0 : d.mode) === "row" ? n.value.rowHandle.active = "editRow" : n.value.rowHandle.active = "editable" : n.value.rowHandle.active = "default";
|
||
});
|
||
const r = {
|
||
/**
|
||
* 启用编辑
|
||
* @param opts
|
||
*/
|
||
async enable(a, i) {
|
||
const s = n.value.table.editable;
|
||
o(s, { enabled: !0 }, a), i && i({ editable: s });
|
||
},
|
||
/**
|
||
* 禁用编辑
|
||
*/
|
||
disable() {
|
||
var a;
|
||
(a = t.getTableRef()) == null || a.editable.resume(), n.value.table.editable.enabled = !1, n.value.rowHandle.active = "default";
|
||
},
|
||
/**
|
||
* 激活所有编辑
|
||
*/
|
||
active(a) {
|
||
t.getTableRef().editable.active(a);
|
||
},
|
||
/**
|
||
* 退出编辑
|
||
*/
|
||
inactive() {
|
||
t.getTableRef().editable.inactive();
|
||
},
|
||
/**
|
||
* 添加行
|
||
*/
|
||
addRow(a) {
|
||
t.getTableRef().editable.addRow(a);
|
||
},
|
||
activeCols(a) {
|
||
t.getTableRef().editable.activeCols(a);
|
||
},
|
||
/**
|
||
* 还原,取消编辑
|
||
*/
|
||
resume() {
|
||
t.getTableRef().editable.resume();
|
||
},
|
||
/**
|
||
* 还原,取消编辑,同resume
|
||
*/
|
||
cancel() {
|
||
t.getTableRef().editable.cancelAll();
|
||
},
|
||
/**
|
||
* 本地保存,不提交到后台
|
||
*/
|
||
persist() {
|
||
t.getTableRef().editable.persist();
|
||
},
|
||
removeRow(a) {
|
||
t.getTableRef().editable.removeRow(a);
|
||
},
|
||
getEditableRow(a) {
|
||
var i, s;
|
||
return (s = (i = t.getTableRef()) == null ? void 0 : i.editable) == null ? void 0 : s.getEditableRow(a);
|
||
},
|
||
getActiveRows() {
|
||
var a, i;
|
||
return (i = (a = t.getTableRef()) == null ? void 0 : a.editable) == null ? void 0 : i.getActiveRows();
|
||
},
|
||
async doSaveRow(a) {
|
||
let i = a.editableId;
|
||
i || (i = a.row[n.value.table.editable.rowKey]);
|
||
const s = r.getEditableRow(i);
|
||
await s.save({
|
||
async doSave(u) {
|
||
var f, v;
|
||
const { isAdd: l, row: c, setData: d } = u, h = c;
|
||
if (((v = (f = n.value) == null ? void 0 : f.mode) == null ? void 0 : v.name) !== "local")
|
||
try {
|
||
if (s.loading = !0, l) {
|
||
const p = await n.value.request.addRequest({ form: h });
|
||
d(p);
|
||
} else
|
||
await n.value.request.editRequest({ form: h, row: h });
|
||
} finally {
|
||
s.loading = !1;
|
||
}
|
||
}
|
||
});
|
||
},
|
||
async doCancelRow(a) {
|
||
let i = a.editableId;
|
||
i || (i = a.row[n.value.table.editable.rowKey]);
|
||
const s = r.getEditableRow(i);
|
||
if (s.isAdd) {
|
||
r.removeRow(i);
|
||
return;
|
||
}
|
||
s.cancel();
|
||
},
|
||
async doRemoveRow(a) {
|
||
let i = a.editableId;
|
||
i || (i = a.row[n.value.table.editable.rowKey]);
|
||
const s = r.getEditableRow(i);
|
||
return await t.doRemove(a, {
|
||
async handle() {
|
||
return s.isAdd ? (r.removeRow(i), !1) : n.value.mode.name === "local" ? (r.removeRow(i), { isLocal: !0 }) : await n.value.request.delRequest(a);
|
||
}
|
||
});
|
||
},
|
||
getInstance() {
|
||
t.getTableRef().editable;
|
||
},
|
||
eachCells(a) {
|
||
var i;
|
||
(i = t.getTableRef().editable) == null || i.eachCells(a);
|
||
},
|
||
eachRows(a) {
|
||
var i;
|
||
(i = t.getTableRef().editable) == null || i.eachRows(a);
|
||
},
|
||
async validate() {
|
||
var a;
|
||
return await ((a = t.getTableRef().editable) == null ? void 0 : a.validate());
|
||
},
|
||
getTableData(a) {
|
||
var i;
|
||
return (i = t.getTableRef().editable) == null ? void 0 : i.getCleanTableData(a);
|
||
},
|
||
getCleanTableData(a) {
|
||
var i;
|
||
return (i = t.getTableRef().editable) == null ? void 0 : i.getCleanTableData(a);
|
||
}
|
||
};
|
||
return r;
|
||
}
|
||
function ci(e) {
|
||
const { crudRef: t, crudBinding: n } = e, { ui: o } = Ce(), { t: r } = ut(), a = mu();
|
||
function i() {
|
||
t.value == null && de.warn("crudRef还未初始化,请在onMounted之后调用");
|
||
}
|
||
function s() {
|
||
n.value == null && de.warn("crudBinding还未初始化,请在useFs或useCrud之后调用");
|
||
}
|
||
const u = {
|
||
crudRef: t,
|
||
crudBinding: n,
|
||
getFormWrapperRef() {
|
||
return t.value.formWrapperRef;
|
||
},
|
||
getFormRef: () => {
|
||
const l = u.getFormWrapperRef();
|
||
if (l == null || (l == null ? void 0 : l.formRef) == null) {
|
||
de.error("当前无法获取FormRef,请在编辑对话框已打开的状态下调用此方法,如果是在打开对话框时调用,可以尝试先nextTick");
|
||
return;
|
||
}
|
||
return l == null ? void 0 : l.formRef;
|
||
},
|
||
getFormData: () => {
|
||
const l = u.getFormRef();
|
||
return l == null ? void 0 : l.getFormData();
|
||
},
|
||
setFormData: (l, c) => {
|
||
var d;
|
||
(d = u.getFormRef()) == null || d.setFormData(l, c);
|
||
},
|
||
getFormComponentRef(l, c = !1) {
|
||
const d = u.getFormRef();
|
||
return d == null ? void 0 : d.getComponentRef(l, c);
|
||
},
|
||
doValueBuilder(l, c) {
|
||
c == null && (c = Hn(n.value.columns)), de.debug("doValueBuilder ,columns=", c);
|
||
const d = [];
|
||
qo(c, (h) => {
|
||
h.valueBuilder != null && d.push(h);
|
||
}), d.length !== 0 && (G(l, (h, f) => {
|
||
G(d, (v) => {
|
||
const p = v.valueBuilder({
|
||
value: et(h, v.key),
|
||
row: h,
|
||
form: h,
|
||
index: f,
|
||
key: v.key,
|
||
column: v
|
||
});
|
||
p != null && !(p instanceof Promise) && We(h, v.key, p);
|
||
}), h.children && No(h.children) && u.doValueBuilder(h.children, c);
|
||
}), de.debug("valueBuilder success:", l));
|
||
},
|
||
doValueResolve({ form: l }, c) {
|
||
c == null && (c = Hn(n.value.columns));
|
||
const d = [];
|
||
qo(c, (h) => {
|
||
h.valueResolve != null && d.push(h);
|
||
}), d.length !== 0 && (de.debug("doValueResolve ,columns=", c), G(d, (h) => {
|
||
const f = h.key, v = h.valueResolve({
|
||
value: et(l, f),
|
||
row: l,
|
||
form: l,
|
||
key: f,
|
||
column: h
|
||
});
|
||
v != null && !(v instanceof Promise) && We(l, f, v);
|
||
}), de.debug("valueResolve success:", l));
|
||
},
|
||
doSearchValidate() {
|
||
u.getSearchRef().doValidate();
|
||
},
|
||
getSearchFormData() {
|
||
return n.value.search.validatedForm;
|
||
},
|
||
getSearchValidatedFormData() {
|
||
return n.value.search.validatedForm;
|
||
},
|
||
/**
|
||
* {form,mergeForm}
|
||
*/
|
||
setSearchFormData(l) {
|
||
if (t.value && t.value.setSearchFormData({
|
||
form: l.form,
|
||
mergeForm: l.mergeForm
|
||
}), l.mergeForm === !1)
|
||
for (const d in n.value.search.validatedForm)
|
||
delete n.value.search.validatedForm[d];
|
||
const { merge: c } = $e();
|
||
c(n.value.search.validatedForm, l.form), l.triggerSearch && u.doRefresh();
|
||
},
|
||
/**
|
||
* 获取search组件ref
|
||
*/
|
||
getSearchRef() {
|
||
var l;
|
||
return i(), (l = t.value) == null ? void 0 : l.getSearchRef();
|
||
},
|
||
buildPageQuery(l) {
|
||
var p, y;
|
||
const c = l.page;
|
||
let d = l.form;
|
||
d == null && (d = dt(u.getSearchValidatedFormData()) || {}, (y = (p = n.value) == null ? void 0 : p.search) != null && y.columns && u.doValueResolve({ form: d }, Hn(n.value.search.columns)));
|
||
let h = l.sort;
|
||
h == null && (h = n.value.table.sort || {});
|
||
const f = { page: c, form: d, sort: h };
|
||
let v = f;
|
||
return n.value.request.transformQuery && (v = n.value.request.transformQuery(f)), v;
|
||
},
|
||
async search(l, c = {}) {
|
||
const d = u.buildPageQuery(l);
|
||
let h;
|
||
const f = q(n.value.table.disableLoading);
|
||
try {
|
||
c.silence !== !0 && f !== !0 && (n.value.table.loading = !0), de.debug("pageRequest", d), h = await n.value.request.pageRequest(d);
|
||
} finally {
|
||
n.value.table.loading = !1;
|
||
}
|
||
if (h == null) {
|
||
de.warn("pageRequest返回结果不能为空");
|
||
return;
|
||
}
|
||
let v = h;
|
||
return n.value.request.transformRes && (v = n.value.request.transformRes({
|
||
res: h,
|
||
query: d
|
||
})), v.records && u.doValueBuilder(v.records), v;
|
||
},
|
||
getPage() {
|
||
let l = {
|
||
currentPage: 1,
|
||
pageSize: 10
|
||
};
|
||
return n.value.pagination && (l = {
|
||
currentPage: n.value.pagination[o.pagination.currentPage],
|
||
pageSize: n.value.pagination.pageSize
|
||
}), l;
|
||
},
|
||
async doRefresh(l) {
|
||
var y, b;
|
||
if (n.value.request.pageRequest == null)
|
||
return;
|
||
de.debug("do refresh:", l), n.value.pagination && l != null && l.goFirstPage && (n.value.pagination[o.pagination.currentPage] = 1);
|
||
const c = u.getPage(), d = await u.search({ page: c }, { silence: l == null ? void 0 : l.silence });
|
||
if (d == null) {
|
||
de.error("pageRequest返回结构不正确,请配置正确的request.transformRes,期望:{currentPage>0, pageSize>0, total, records:[]},实际返回:", d);
|
||
return;
|
||
}
|
||
const { currentPage: h = c.currentPage || 1, pageSize: f = c.pageSize, total: v } = d, { records: p } = d;
|
||
if (p == null || !(p instanceof Array) || v == null || h == null || h <= 0 || isNaN(h) || f == null || f <= 0 || isNaN(f)) {
|
||
de.error("pageRequest返回结构不正确,请配置正确的request.transformRes,期望:{currentPage>0, pageSize>0, total, records:[]},实际返回:", d), de.info("如果你的不需要分页,也需要按照上面的格式返回,可以让pageSize=99999,然后配置crudOptions.pagination.show=false来隐藏分页组件");
|
||
return;
|
||
}
|
||
if (n.value.data = p, n.value.pagination && (n.value.pagination[o.pagination.currentPage] = h, n.value.pagination.pageSize = f, n.value.pagination[o.pagination.total] = v || p.length), (l == null ? void 0 : l.scrollTop) ?? n.value.table.scrollTopOnRefreshed) {
|
||
const F = u.getTableRef();
|
||
F == null || F.scrollTo(0);
|
||
}
|
||
(b = (y = n.value) == null ? void 0 : y.table) != null && b.onRefreshed && n.value.table.onRefreshed({
|
||
data: p
|
||
});
|
||
},
|
||
/**
|
||
* 获取toolbar组件Ref
|
||
*/
|
||
getToolbarRef: () => t.value.toolbarRef,
|
||
/**
|
||
* 获取列设置组件Ref
|
||
*/
|
||
getColumnsFilterRef: () => u.getToolbarRef().columnsFilterRef,
|
||
/**
|
||
* 获取列设置的原始列配置Ref
|
||
* 可以修改列设置的原始配置
|
||
*/
|
||
getColumnsFilterOriginalColumnsRef: () => u.getColumnsFilterRef().original,
|
||
/**
|
||
* 获取列设置的列配置Ref
|
||
* 可以动态修改列设置每列的配置
|
||
*/
|
||
getColumnsFilterColumnsRef: () => u.getColumnsFilterRef().columns,
|
||
doPageTurn(l) {
|
||
n.value.pagination[o.pagination.currentPage] = l;
|
||
},
|
||
/**
|
||
*
|
||
* @param opts = {
|
||
* form
|
||
* goFirstPage =true
|
||
* mergeForm=false
|
||
* }
|
||
*/
|
||
async doSearch(l) {
|
||
de.debug("do search:", l), l = ui({ goFirstPage: !0 }, l), l.goFirstPage && u.doPageTurn(1), l.form && t.value && u.setSearchFormData({
|
||
form: l.form,
|
||
mergeForm: l.mergeForm,
|
||
refWarning: !1,
|
||
triggerSearch: !1
|
||
}), await u.doRefresh();
|
||
},
|
||
/**
|
||
* 获取FsTable实例
|
||
*/
|
||
getTableRef() {
|
||
var l;
|
||
return i(), (l = t.value) == null ? void 0 : l.tableRef;
|
||
},
|
||
/**
|
||
* 获取x-Table实例
|
||
*/
|
||
getBaseTableRef() {
|
||
const l = this.getTableRef();
|
||
if (l == null) {
|
||
de.warn("fs-table还未挂载");
|
||
return;
|
||
}
|
||
return l.tableRef;
|
||
},
|
||
/**
|
||
* 获取表格数据
|
||
*/
|
||
getTableData() {
|
||
return s(), n.value.data;
|
||
},
|
||
setTableData(l) {
|
||
s(), n.value.data = l;
|
||
},
|
||
insertTableRow(l, c) {
|
||
s(), n.value.data.splice(l, 0, c);
|
||
},
|
||
updateTableRow(l, c, d = !0) {
|
||
d ? n.value.data[l] = pu(n.value.data[l], c) : n.value.data[l] = c;
|
||
},
|
||
removeTableRow(l) {
|
||
s(), n.value.data.splice(l, 1);
|
||
},
|
||
removeTableRowByRowKey: (l, c) => {
|
||
s(), c == null && (c = n.value.data);
|
||
for (let d = 0; d < c.length; d++) {
|
||
const h = c[d];
|
||
if (h[n.value.table.rowKey] === l)
|
||
return c.splice(d, 1), !0;
|
||
if (h.children && No(h.children) && u.removeTableRowByRowKey(l, h.children))
|
||
return !0;
|
||
}
|
||
},
|
||
getTableDataRow(l) {
|
||
const c = u.getTableData();
|
||
if (c == null)
|
||
throw new Error("table data is not init");
|
||
if (c.length <= l)
|
||
throw new Error("index over array length");
|
||
return c[l];
|
||
},
|
||
/**
|
||
* 选择某一行
|
||
* @param index
|
||
* @param row
|
||
*/
|
||
doSelectCurrentRow({ row: l }) {
|
||
u.getTableRef().value.setCurrentRow(l);
|
||
},
|
||
/**
|
||
* 删除行按钮
|
||
* @param context
|
||
* @param opts
|
||
*/
|
||
async doRemove(l, c) {
|
||
var p;
|
||
const d = n.value.table.remove ?? c ?? {};
|
||
if ((c == null ? void 0 : c.noConfirm) !== !0)
|
||
try {
|
||
d.confirmFn ? await d.confirmFn(l) : await o.messageBox.confirm({
|
||
title: d.confirmTitle || r("fs.rowHandle.remove.confirmTitle"),
|
||
message: d.confirmMessage || r("fs.rowHandle.remove.confirmMessage"),
|
||
cancelButtonText: d.cancelButtonText || r("fs.rowHandle.remove.cancelText"),
|
||
confirmButtonText: d.confirmButtonText || r("fs.rowHandle.remove.confirmText"),
|
||
type: "warn",
|
||
...d.confirmProps
|
||
});
|
||
} catch {
|
||
d.onCanceled && await d.onCanceled(l);
|
||
return;
|
||
}
|
||
let h = null;
|
||
const f = ((p = n.value.mode) == null ? void 0 : p.name) === "local";
|
||
if (c != null && c.handle ? h = await c.handle(l) : f ? u.removeTableRow(l == null ? void 0 : l.index) : h = await n.value.request.delRequest(l), h === !1)
|
||
return;
|
||
const v = { ...l, res: h };
|
||
if (d.afterRemove && await d.afterRemove(v) === !1)
|
||
return !1;
|
||
d.showSuccessNotification !== !1 && o.notification.success(r("fs.rowHandle.remove.success")), f || d.refreshTable !== !1 && await u.doRefresh({ scrollTop: !1 }), d.onRemoved && await d.onRemoved({ ...l, res: h });
|
||
},
|
||
/**
|
||
*
|
||
* 打开表单对话框
|
||
* @param formOpts ={mode, initialForm: row, index,...formOptions}
|
||
*/
|
||
async openDialog(l) {
|
||
if (l.newInstance === !0 && a)
|
||
return await a.openDialog(l);
|
||
const c = this.getFormWrapperRef();
|
||
return c.open(l), c;
|
||
},
|
||
async _openDialog(l, c, d) {
|
||
var y, b;
|
||
const { merge: h } = $e();
|
||
let f = c.row || c[o.tableColumn.row];
|
||
delete c.row, f == null && c.index != null && (f = u.getTableDataRow(c.index)), (b = (y = n.value) == null ? void 0 : y.request) != null && b.infoRequest && (f = await n.value.request.infoRequest({ mode: l, row: f }));
|
||
const v = {
|
||
mode: l
|
||
}, p = Hn(n.value[l + "Form"]);
|
||
return h(v, p, { initialForm: f }, c, d), await this.openDialog(v);
|
||
},
|
||
async openAdd(l, c = {}) {
|
||
return this._openDialog("add", l, c);
|
||
},
|
||
async openEdit(l, c = {}) {
|
||
return this._openDialog("edit", l, c);
|
||
},
|
||
async openView(l, c = {}) {
|
||
return this._openDialog("view", l, c);
|
||
},
|
||
async openCopy(l, c = {}) {
|
||
return this._openDialog("add", l, c);
|
||
},
|
||
editable: void 0
|
||
};
|
||
return u.editable = gu({ crudExpose: u }), { expose: u, crudExpose: u };
|
||
}
|
||
async function vu() {
|
||
const e = await /* @__PURE__ */ Object.assign({ "./lib/index.ts": () => import("./index-64865240.mjs") });
|
||
let t = null;
|
||
return bt(e, (o) => {
|
||
t = o;
|
||
}), (await t()).exportUtil;
|
||
}
|
||
async function bu() {
|
||
const e = await /* @__PURE__ */ Object.assign({ "./lib/index.ts": () => import("./index-64865240.mjs") });
|
||
let t = null;
|
||
return bt(e, (o) => {
|
||
t = o;
|
||
}), (await t()).importUtil;
|
||
}
|
||
function yu({ originalRow: e, row: t, key: n, col: o }) {
|
||
var i;
|
||
const r = e[n], a = (i = o.component) == null ? void 0 : i.dict;
|
||
if (a && r != null) {
|
||
const s = a.getNodesFromDataMap(r);
|
||
if (s != null && s.length > 0) {
|
||
const u = vs(s, (l) => a.getLabel(l) || a.getValue(l)).join("|");
|
||
u != null && u !== "" && (t[n] = u);
|
||
}
|
||
}
|
||
return t;
|
||
}
|
||
async function wu(e, t = {}) {
|
||
if (t.server) {
|
||
const l = e.getPage(), c = e.buildPageQuery({ page: l });
|
||
await t.server(c);
|
||
return;
|
||
}
|
||
const n = e.crudBinding;
|
||
let o = t.columns;
|
||
o == null && (o = [], bt(n.value.table.columnsMap, (l) => {
|
||
if (!(t.columnFilter && t.columnFilter(l) === !1) && !(t.onlyShow && q(l.show) === !1) && l.exportable !== !1 && l.key !== "_index") {
|
||
const c = {
|
||
key: l.key,
|
||
title: l.title
|
||
};
|
||
o.push(c);
|
||
}
|
||
}));
|
||
for (const l of o) {
|
||
const c = n.value.table.columnsMap[l.key];
|
||
l.columnProps = c || {}, t.columnBuilder && t.columnBuilder({ col: l });
|
||
}
|
||
const { merge: r } = $e(), a = await vu(), i = [];
|
||
let s = n.value.data;
|
||
if (t.dataFrom === "search") {
|
||
const l = r({
|
||
page: {
|
||
currentPage: 1,
|
||
pageSize: 99999999
|
||
}
|
||
}, n.value.toolbar.export.searchParams);
|
||
s = (await e.search(l, { silence: !0 })).records;
|
||
}
|
||
for (const l of s) {
|
||
const c = dt(l);
|
||
bt(o, (d) => {
|
||
const h = d.columnProps, f = {
|
||
row: c,
|
||
originalRow: l,
|
||
key: d.key,
|
||
col: h,
|
||
exportCol: d
|
||
};
|
||
t.autoUseDictLabel !== !1 && yu(f), t.dataFormatter && t.dataFormatter(f);
|
||
}), i.push(c);
|
||
}
|
||
const u = r({
|
||
columns: o,
|
||
data: i,
|
||
filename: "table",
|
||
noHeader: !1,
|
||
separator: ",",
|
||
quoted: !1
|
||
//每项数据是否加引号
|
||
}, {
|
||
...t
|
||
});
|
||
t.fileType === "excel" ? await a.excel(u) : await a.csv(u);
|
||
}
|
||
async function yp(e, t) {
|
||
const o = await (await bu()).csv(t.file), r = e.crudBinding;
|
||
t.append === !1 && (r.value.data.length = 0);
|
||
const a = r.value.table.editable.enabled;
|
||
for (const i of o.data)
|
||
a ? e.editable.addRow({ row: i, active: !1 }) : r.value.data.push(i);
|
||
}
|
||
const di = {};
|
||
function fi(e, t, n = {}) {
|
||
di[e] = {
|
||
handle: t,
|
||
opts: n
|
||
};
|
||
}
|
||
function _u(e) {
|
||
return di[e];
|
||
}
|
||
fi("rowSelection", (e, t, n) => {
|
||
const r = t.crudExpose.crudBinding;
|
||
function a() {
|
||
var u, l;
|
||
return ((l = (u = r.value) == null ? void 0 : u.table) == null ? void 0 : l.rowKey) || "id";
|
||
}
|
||
const { ui: i } = Ce();
|
||
if (!e) {
|
||
de.warn("请配置settings.plugins.rowSelection.props参数");
|
||
return;
|
||
}
|
||
let s = i.table;
|
||
return (n == null ? void 0 : n.table.tableVersion) == "v2" && (s = i.tableV2), s.buildSelectionCrudOptions({
|
||
crossPage: e.crossPage,
|
||
getRowKey: a,
|
||
getPageData() {
|
||
return r.value.data;
|
||
},
|
||
useCompute: () => Vt(),
|
||
selectionFixed: e.selectionFixed,
|
||
multiple: e.multiple,
|
||
selectedRowKeys: e.selectedRowKeys,
|
||
onSelectedKeysChanged: async (u) => {
|
||
const l = e.selectedRowKeys instanceof Function ? e.selectedRowKeys() : e.selectedRowKeys;
|
||
l.value = [...u], await Me(), e.onSelectedChanged && e.onSelectedChanged(l.value);
|
||
}
|
||
});
|
||
}, {
|
||
before: !0,
|
||
order: -2
|
||
});
|
||
fi("mobile", (e, t, n) => {
|
||
const o = n.rowHandle, r = o.buttons;
|
||
let a = {};
|
||
for (const s in r) {
|
||
const u = r[s];
|
||
Bo(u.dropdown) ? a = u : a[s] = {
|
||
...u,
|
||
dropdown: B(() => e.isMobile.value ? !0 : u.dropdown)
|
||
};
|
||
}
|
||
let i = o.width;
|
||
return (i == null || !Bo(i)) && (i = B(() => {
|
||
var s;
|
||
return e.isMobile.value ? ((s = e == null ? void 0 : e.rowHandle) == null ? void 0 : s.width) || 60 : o.width || 250;
|
||
})), {
|
||
rowHandle: {
|
||
width: i,
|
||
buttons: a
|
||
}
|
||
};
|
||
}, {
|
||
before: !1,
|
||
order: -2
|
||
});
|
||
const { merge: Jt } = $e();
|
||
function Cu(e) {
|
||
e.context == null && (e.context = {});
|
||
const t = Le.get(), { t: n } = ut(), o = (k) => B(() => n(k));
|
||
let r = e.crudOptions;
|
||
const a = e.expose || e.crudExpose;
|
||
if (!a)
|
||
throw new Error("crudExpose不能为空,请给useCrud传入{crudExpose}参数");
|
||
const i = a, { crudBinding: s } = i, { doRefresh: u, doValueResolve: l } = i;
|
||
function c() {
|
||
return {
|
||
pagination: {
|
||
...t.pagination.onChange({
|
||
setCurrentPage(Y) {
|
||
s.value.pagination[t.pagination.currentPage] = Y, s.value.pagination._onCurrentChange && s.value.pagination._onCurrentChange({ current: Y, pagination: s.value.pagination });
|
||
},
|
||
setPageSize(Y) {
|
||
s.value.pagination.pageSize = Y, s.value.pagination[t.pagination.currentPage] = 1, s.value.pagination._onPageSizeChange && s.value.pagination._onPageSizeChange({
|
||
pageSize: Y,
|
||
current: 1,
|
||
pagination: s.value.pagination
|
||
});
|
||
},
|
||
async doAfterChange() {
|
||
return await u();
|
||
}
|
||
})
|
||
}
|
||
};
|
||
}
|
||
function d() {
|
||
return {
|
||
form: {
|
||
async doSubmit(k) {
|
||
var Y, ce, E, M;
|
||
if (k.mode === "edit")
|
||
if (l(k), ((Y = r.mode) == null ? void 0 : Y.name) === "local")
|
||
i.updateTableRow(k.index, k.form, r.mode.isMergeWhenUpdate);
|
||
else
|
||
return (ce = s.value.request) != null && ce.editRequest || de.warn("request.editRequest 未定义,无法保存"), await s.value.request.editRequest(k);
|
||
else if (k.mode === "add")
|
||
if (l(k), ((E = r.mode) == null ? void 0 : E.name) === "local") {
|
||
const I = r.mode.isAppendWhenAdd ? i.getTableData().length : 0;
|
||
i.insertTableRow(I, k.form);
|
||
} else
|
||
return (M = s.value.request) != null && M.addRequest || de.warn("request.addRequest 未定义,无法保存"), await s.value.request.addRequest(k);
|
||
},
|
||
async onSuccess({ mode: k }) {
|
||
k === "edit" ? await u({ scrollTop: !1 }) : k === "add" ? await u({ scrollTop: !0, goFirstPage: !0 }) : await u();
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function h() {
|
||
return {
|
||
rowHandle: {
|
||
buttons: {
|
||
remove: {
|
||
click: async (k) => {
|
||
k.row = k[t.tableColumn.row], await i.doRemove(k);
|
||
}
|
||
},
|
||
copy: {
|
||
show: !1,
|
||
click: async (k) => {
|
||
k.row = k[t.tableColumn.row], await i.openCopy({
|
||
row: k.row,
|
||
index: k.index
|
||
});
|
||
}
|
||
},
|
||
edit: {
|
||
click: async (k) => {
|
||
k.row = k[t.tableColumn.row], await i.openEdit({
|
||
row: k.row,
|
||
index: k.index
|
||
});
|
||
}
|
||
},
|
||
view: {
|
||
click: async (k) => {
|
||
k.row = k[t.tableColumn.row], await i.openView({
|
||
row: k.row,
|
||
index: k.index
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function f() {
|
||
return {
|
||
search: {
|
||
buttons: {
|
||
search: {
|
||
loading: B(() => {
|
||
var k, Y;
|
||
return (Y = (k = s.value) == null ? void 0 : k.table) == null ? void 0 : Y.loading;
|
||
})
|
||
}
|
||
},
|
||
on_reset() {
|
||
s.value.table.sort = {}, Lo(s.value.table.columns, (Y) => {
|
||
Y.sortOrder = !1;
|
||
});
|
||
const k = a.getBaseTableRef();
|
||
k != null && k.clearSort && k.clearSort();
|
||
},
|
||
on_search() {
|
||
a.doRefresh({ goFirstPage: !0 });
|
||
},
|
||
"onUpdate:form": (k) => {
|
||
s.value.search.form = k;
|
||
},
|
||
"onUpdate:validatedForm": (k) => {
|
||
s.value.search.validatedForm = k;
|
||
},
|
||
"onUpdate:collapse": (k) => {
|
||
s.value.search.collapse = k;
|
||
},
|
||
container: {
|
||
collapse: !0,
|
||
"onUpdate:collapse": (k) => {
|
||
s.value.search.container.collapse = k;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function v() {
|
||
return {
|
||
tabs: {},
|
||
onTabChange(k) {
|
||
a.setSearchFormData({ form: k, mergeForm: !0 }), u();
|
||
}
|
||
};
|
||
}
|
||
function p() {
|
||
const k = K(!1);
|
||
return {
|
||
toolbar: {
|
||
buttons: {
|
||
refresh: {
|
||
type: "primary",
|
||
icon: t.icons.refresh,
|
||
title: o("fs.toolbar.refresh.title"),
|
||
order: 1,
|
||
circle: !0,
|
||
click: async () => {
|
||
await a.doRefresh({ scrollTop: !1 });
|
||
}
|
||
},
|
||
search: {
|
||
type: B(() => s.value.search.show !== !1 ? "primary" : "default"),
|
||
icon: t.icons.search,
|
||
title: o("fs.toolbar.search.title"),
|
||
order: 2,
|
||
circle: !0,
|
||
click: () => {
|
||
s.value.search.show = !s.value.search.show;
|
||
}
|
||
},
|
||
compact: {
|
||
type: B(() => s.value.toolbar.compact ? "primary" : "default"),
|
||
icon: t.icons.compact,
|
||
title: o("fs.toolbar.compact.title"),
|
||
order: 3,
|
||
circle: !0,
|
||
click: () => {
|
||
s.value.toolbar.compact = !s.value.toolbar.compact;
|
||
}
|
||
},
|
||
export: {
|
||
show: !0,
|
||
type: "primary",
|
||
icon: t.icons.export,
|
||
order: 4,
|
||
loading: k,
|
||
title: o("fs.toolbar.export.title"),
|
||
circle: !0,
|
||
click: async () => {
|
||
k.value = !0;
|
||
try {
|
||
await wu(a, s.value.toolbar.export);
|
||
} finally {
|
||
k.value = !1;
|
||
}
|
||
}
|
||
},
|
||
columns: {
|
||
type: "primary",
|
||
icon: t.icons.columnsFilter,
|
||
title: o("fs.toolbar.columns.title"),
|
||
circle: !0,
|
||
order: 5
|
||
}
|
||
},
|
||
"onUpdate:columns"(Y) {
|
||
const ce = s.value.table.columns;
|
||
function E(I, T) {
|
||
const x = {};
|
||
return G(T, (Q) => {
|
||
const oe = I[Q.key];
|
||
if (oe) {
|
||
if (oe.columnSetShow === !1) {
|
||
x[Q.key] = oe;
|
||
return;
|
||
}
|
||
delete oe.order;
|
||
const ye = Jt({ ...oe }, Q);
|
||
x[Q.key] = ye, oe.children && (ye.children = E(oe.children, Q.children));
|
||
}
|
||
}), x;
|
||
}
|
||
const M = E(ce, Y);
|
||
s.value.table.columns = M, s.value.table.columnsMap = Zr({}, M);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function y() {
|
||
return {
|
||
table: {
|
||
onSortChange(k) {
|
||
const { isServerSort: Y, prop: ce, asc: E, order: M } = k;
|
||
Lo(s.value.table.columns, (T) => {
|
||
T.key === ce ? T.sortOrder = M : T.sortOrder = !1;
|
||
});
|
||
const I = s.value.table.sort;
|
||
s.value.table.sort = Y ? { prop: ce, order: M, asc: E } : null, (Y || I != null) && i.doRefresh();
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function b() {
|
||
return {
|
||
actionbar: {
|
||
buttons: {
|
||
add: {
|
||
click() {
|
||
i.openAdd({});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function F() {
|
||
const { compute: k } = Vt();
|
||
return {
|
||
actionbar: {
|
||
buttons: {
|
||
addRow: {
|
||
show: !1,
|
||
text: o("fs.actionbar.add"),
|
||
type: "primary",
|
||
click: () => {
|
||
i.editable.addRow();
|
||
}
|
||
}
|
||
}
|
||
},
|
||
rowHandle: {
|
||
group: {
|
||
editable: {
|
||
remove: {
|
||
text: "删除",
|
||
...t.button.colors("danger"),
|
||
click: async (Y) => {
|
||
const { index: ce, row: E } = Y, M = E[s.value.table.editable.rowKey];
|
||
await i.editable.doRemoveRow({ editableId: M, row: E });
|
||
}
|
||
}
|
||
},
|
||
editRow: {
|
||
edit: {
|
||
text: "编辑",
|
||
loading: k((Y) => {
|
||
const { index: ce, row: E } = Y, M = E[s.value.table.editable.rowKey], I = i.editable.getEditableRow(M);
|
||
return !!(I != null && I.loading);
|
||
}),
|
||
click: async (Y) => {
|
||
var I;
|
||
const { index: ce, row: E } = Y, M = E[s.value.table.editable.rowKey];
|
||
if (s.value.table.editable.exclusive) {
|
||
const T = i.editable.getActiveRows();
|
||
G(T, (x) => {
|
||
s.value.table.editable.exclusiveEffect === "save" ? i.editable.doSaveRow({ row: x.rowData }) : i.editable.doCancelRow({ row: x.rowData });
|
||
});
|
||
}
|
||
(I = i.editable.getEditableRow(M)) == null || I.active();
|
||
},
|
||
show: k((Y) => {
|
||
var I, T;
|
||
const { index: ce, row: E } = Y, M = E[s.value.table.editable.rowKey];
|
||
return !((T = (I = i.editable) == null ? void 0 : I.getEditableRow(M)) != null && T.isEditing);
|
||
})
|
||
},
|
||
save: {
|
||
text: "保存",
|
||
loading: !1,
|
||
click: async (Y) => {
|
||
const { index: ce, row: E } = Y;
|
||
await i.editable.doSaveRow({ row: E });
|
||
},
|
||
show: k((Y) => {
|
||
var I, T;
|
||
const { index: ce, row: E } = Y, M = E[s.value.table.editable.rowKey];
|
||
return !!((T = (I = i.editable) == null ? void 0 : I.getEditableRow(M)) != null && T.isEditing);
|
||
})
|
||
},
|
||
cancel: {
|
||
text: "取消",
|
||
click: async (Y) => {
|
||
var M;
|
||
const { index: ce, row: E } = Y;
|
||
await ((M = i.editable) == null ? void 0 : M.doCancelRow({ row: E }));
|
||
},
|
||
show: k((Y) => {
|
||
var I, T;
|
||
const { index: ce, row: E } = Y, M = E[s.value.table.editable.rowKey];
|
||
return !!((T = (I = i.editable) == null ? void 0 : I.getEditableRow(M)) != null && T.isEditing);
|
||
})
|
||
},
|
||
remove: {
|
||
text: "删除",
|
||
...t.button.colors("danger"),
|
||
click: async (Y) => {
|
||
var I;
|
||
const { index: ce, row: E } = Y, M = E[s.value.table.editable.rowKey];
|
||
await ((I = i.editable) == null ? void 0 : I.doRemoveRow({ row: E, editableId: M }));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const { cloneDeep: R } = $e();
|
||
function D(k) {
|
||
k.search.validatedForm = R(k.search.initialForm);
|
||
}
|
||
function A(k) {
|
||
var oe;
|
||
const Y = { value: null };
|
||
let ce = R(k);
|
||
const E = oo.commonOptions(e), M = oo.defaultOptions({ t: n, crudOptionsRef: Y });
|
||
r = Jt({}, M, E, ce), Y.value = r;
|
||
const I = q(r.settings);
|
||
if (I) {
|
||
const ye = q(I.plugins);
|
||
G(ye, (re, m) => {
|
||
if (re.enabled === !1)
|
||
return;
|
||
let C = re.handle, _ = {};
|
||
if (C == null) {
|
||
const X = _u(m);
|
||
X != null && (C = X.handle, _ = X.opts);
|
||
}
|
||
if (C == null)
|
||
return;
|
||
const S = re.before ?? _.before, O = C(re.props, e, r);
|
||
S !== !1 ? ce = Jt(O, ce) : ce = Jt(ce, O);
|
||
});
|
||
}
|
||
const T = Jt(M, c(), d(), h(), f(), v(), p(), y(), b(), F(), E, ce), { buildColumns: x } = ta(), Q = x(T);
|
||
return D(Q), (oe = Q == null ? void 0 : Q.settings) != null && oe.onUseCrud && Q.settings.onUseCrud(Q), Q;
|
||
}
|
||
function $(k) {
|
||
s.value = A(k), de.info("fast-crud inited, crudBinding=", s.value);
|
||
}
|
||
function P(k) {
|
||
const Y = Jt({}, r, k);
|
||
return $(Y), r = Y, Y;
|
||
}
|
||
$(r);
|
||
function W(k) {
|
||
Jt(s.value, k);
|
||
}
|
||
return {
|
||
appendCrudOptions: P,
|
||
resetCrudOptions: $,
|
||
appendCrudBinding: W,
|
||
rebuildCrudBindings: A
|
||
};
|
||
}
|
||
function hi(e) {
|
||
const { createCrudOptions: t, crudExposeRef: n } = e, o = e.crudRef || K(), r = e.crudBinding || K({});
|
||
let a = e.crudExpose;
|
||
a || (a = ci({ crudRef: o, crudBinding: r }).crudExpose), n && !n.value && (n.value = a), e.context == null && (e.context = {});
|
||
const i = e.context;
|
||
e.onExpose && e.onExpose({ crudRef: o, crudBinding: r, crudExpose: a, context: i });
|
||
const s = t({
|
||
...e,
|
||
crudExpose: a,
|
||
expose: a,
|
||
context: i
|
||
});
|
||
function u(l) {
|
||
const c = { crudExpose: a, ...l, context: i };
|
||
Jt(l.crudOptions, e.crudOptionsOverride);
|
||
const d = Cu(c);
|
||
return {
|
||
...l,
|
||
...d,
|
||
crudRef: o,
|
||
crudExpose: a,
|
||
crudBinding: r,
|
||
context: i
|
||
};
|
||
}
|
||
return s instanceof Promise ? s.then((l) => u(l)) : u(s);
|
||
}
|
||
function wp(e) {
|
||
return hi(e);
|
||
}
|
||
function Su(e) {
|
||
return hi(e);
|
||
}
|
||
function Fu() {
|
||
const e = K(), t = K(), n = {}, { crudExpose: o } = ci({ crudBinding: t, crudRef: e });
|
||
return {
|
||
crudRef: e,
|
||
crudBinding: t,
|
||
context: n,
|
||
crudExpose: o
|
||
};
|
||
}
|
||
function dn(e, t, n = "modelValue") {
|
||
const o = Le.get();
|
||
let r = e.dict;
|
||
r && r.prototype && (r.clear(), r = jo(dt(e.dict)), r.cloneable = !1, r.clear());
|
||
function a() {
|
||
return B(() => {
|
||
let $ = [];
|
||
if (e.options ? $ = e.options : r && r.data != null && (r.data instanceof Array || an.logger.warn("dict.data类型错误,期望为数组,实际:", r.data), $ = r.data, e.transformDictData && ($ = e.transformDictData(dt(r.data)))), o.type === "naive" || o.type === "element") {
|
||
const P = [];
|
||
for (const W of $)
|
||
P.push({
|
||
...W,
|
||
value: F(W),
|
||
label: D(W)
|
||
});
|
||
return P;
|
||
}
|
||
return $;
|
||
});
|
||
}
|
||
function i() {
|
||
return r;
|
||
}
|
||
const s = xn("get:scope", function() {
|
||
});
|
||
function u() {
|
||
const $ = e[n] || t.attrs[n];
|
||
return {
|
||
...s(),
|
||
componentRef: l,
|
||
value: $
|
||
};
|
||
}
|
||
const { proxy: l } = Jo(), c = async ($ = !1) => {
|
||
if (!r)
|
||
return;
|
||
if (r.getNodesByValues) {
|
||
const W = u();
|
||
if (W.value == null)
|
||
return;
|
||
let k = W.value;
|
||
Array.isArray(W.value) || (k = [W.value]), await r.appendByValues(k);
|
||
return;
|
||
}
|
||
if (r.loading)
|
||
return;
|
||
const P = u();
|
||
if ($) {
|
||
await r.reloadDict(P);
|
||
return;
|
||
}
|
||
await r.loadDict(P);
|
||
};
|
||
c();
|
||
const d = async () => {
|
||
await c(!0);
|
||
}, h = () => {
|
||
r && r.clear();
|
||
}, f = () => {
|
||
r != null && (!r.prototype && !r.cloneable || lt(() => e[n], () => {
|
||
d();
|
||
}));
|
||
};
|
||
(() => {
|
||
lt(() => r == null ? void 0 : r.data, () => {
|
||
const $ = u();
|
||
t.attrs.onDictChange, t.emit("dict-change", { dict: r, ...$ });
|
||
}, {
|
||
immediate: !0
|
||
});
|
||
})();
|
||
const p = () => {
|
||
var $;
|
||
return ($ = i()) == null ? void 0 : $.data;
|
||
}, y = ($, P) => {
|
||
let W = P;
|
||
return i() && (W = i()[P]), $[W];
|
||
}, b = ($, P) => {
|
||
let W = P;
|
||
i() && (W = i()[P]), delete $[W];
|
||
}, F = ($) => y($, "value"), R = ($) => y($, "children"), D = ($) => {
|
||
if (e.labelFormatter)
|
||
return e.labelFormatter($);
|
||
const P = y($, "label");
|
||
return P == null ? "" : String(P);
|
||
};
|
||
return {
|
||
createComputedOptions: a,
|
||
loadDict: c,
|
||
reloadDict: d,
|
||
clearDict: h,
|
||
getDictData: p,
|
||
getDict: i,
|
||
watchValue: f,
|
||
getValue: F,
|
||
getLabel: D,
|
||
getChildren: R,
|
||
getColor: ($) => y($, "color"),
|
||
removePropValue: b,
|
||
curDict: r
|
||
};
|
||
}
|
||
const Fn = typeof performance == "object" && performance && typeof performance.now == "function" ? performance : Date, mi = /* @__PURE__ */ new Set(), Sr = typeof process == "object" && process ? process : {}, pi = (e, t, n, o) => {
|
||
typeof Sr.emitWarning == "function" ? Sr.emitWarning(e, t, n, o) : console.error(`[${n}] ${t}: ${e}`);
|
||
};
|
||
let Ho = globalThis.AbortController, va = globalThis.AbortSignal;
|
||
var xa;
|
||
if (typeof Ho > "u") {
|
||
va = class {
|
||
constructor() {
|
||
se(this, "onabort");
|
||
se(this, "_onabort", []);
|
||
se(this, "reason");
|
||
se(this, "aborted", !1);
|
||
}
|
||
addEventListener(o, r) {
|
||
this._onabort.push(r);
|
||
}
|
||
}, Ho = class {
|
||
constructor() {
|
||
se(this, "signal", new va());
|
||
t();
|
||
}
|
||
abort(o) {
|
||
var r, a;
|
||
if (!this.signal.aborted) {
|
||
this.signal.reason = o, this.signal.aborted = !0;
|
||
for (const i of this.signal._onabort)
|
||
i(o);
|
||
(a = (r = this.signal).onabort) == null || a.call(r, o);
|
||
}
|
||
}
|
||
};
|
||
let e = ((xa = Sr.env) == null ? void 0 : xa.LRU_CACHE_IGNORE_AC_WARNING) !== "1";
|
||
const t = () => {
|
||
e && (e = !1, pi("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.", "NO_ABORT_CONTROLLER", "ENOTSUP", t));
|
||
};
|
||
}
|
||
const Ru = (e) => !mi.has(e), Qt = (e) => e && e === Math.floor(e) && e > 0 && isFinite(e), gi = (e) => Qt(e) ? e <= Math.pow(2, 8) ? Uint8Array : e <= Math.pow(2, 16) ? Uint16Array : e <= Math.pow(2, 32) ? Uint32Array : e <= Number.MAX_SAFE_INTEGER ? Oo : null : null;
|
||
class Oo extends Array {
|
||
constructor(t) {
|
||
super(t), this.fill(0);
|
||
}
|
||
}
|
||
var In;
|
||
const gn = class gn {
|
||
constructor(t, n) {
|
||
se(this, "heap");
|
||
se(this, "length");
|
||
if (!g(gn, In))
|
||
throw new TypeError("instantiate Stack using Stack.create(n)");
|
||
this.heap = new n(t), this.length = 0;
|
||
}
|
||
static create(t) {
|
||
const n = gi(t);
|
||
if (!n)
|
||
return [];
|
||
he(gn, In, !0);
|
||
const o = new gn(t, n);
|
||
return he(gn, In, !1), o;
|
||
}
|
||
push(t) {
|
||
this.heap[this.length++] = t;
|
||
}
|
||
pop() {
|
||
return this.heap[--this.length];
|
||
}
|
||
};
|
||
In = new WeakMap(), // private constructor
|
||
ve(gn, In, !1);
|
||
let Fr = gn;
|
||
var Rt, mt, Dt, kt, An, Vn, Ue, Ot, ze, Ve, be, it, pt, nt, Xe, $t, Je, Et, Tt, gt, It, rn, st, so, Dr, bn, Wt, lo, vt, Xo, vi, yn, Pn, uo, Bt, Zt, jt, en, co, kr, up, Mn, $o, Bn, Eo, Ie, Ae, fo, Or, wn, Un, Nt, tn, ho, $r;
|
||
const ia = class ia {
|
||
constructor(t) {
|
||
ve(this, so);
|
||
ve(this, Xo);
|
||
ve(this, Bt);
|
||
ve(this, jt);
|
||
ve(this, co);
|
||
ve(this, Mn);
|
||
ve(this, Bn);
|
||
ve(this, Ie);
|
||
ve(this, fo);
|
||
ve(this, wn);
|
||
ve(this, Nt);
|
||
ve(this, ho);
|
||
// options that cannot be changed without disaster
|
||
ve(this, Rt, void 0);
|
||
ve(this, mt, void 0);
|
||
ve(this, Dt, void 0);
|
||
ve(this, kt, void 0);
|
||
ve(this, An, void 0);
|
||
ve(this, Vn, void 0);
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ttl}
|
||
*/
|
||
se(this, "ttl");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ttlResolution}
|
||
*/
|
||
se(this, "ttlResolution");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ttlAutopurge}
|
||
*/
|
||
se(this, "ttlAutopurge");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.updateAgeOnGet}
|
||
*/
|
||
se(this, "updateAgeOnGet");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.updateAgeOnHas}
|
||
*/
|
||
se(this, "updateAgeOnHas");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.allowStale}
|
||
*/
|
||
se(this, "allowStale");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noDisposeOnSet}
|
||
*/
|
||
se(this, "noDisposeOnSet");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noUpdateTTL}
|
||
*/
|
||
se(this, "noUpdateTTL");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.maxEntrySize}
|
||
*/
|
||
se(this, "maxEntrySize");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.sizeCalculation}
|
||
*/
|
||
se(this, "sizeCalculation");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}
|
||
*/
|
||
se(this, "noDeleteOnFetchRejection");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noDeleteOnStaleGet}
|
||
*/
|
||
se(this, "noDeleteOnStaleGet");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}
|
||
*/
|
||
se(this, "allowStaleOnFetchAbort");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}
|
||
*/
|
||
se(this, "allowStaleOnFetchRejection");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ignoreFetchAbort}
|
||
*/
|
||
se(this, "ignoreFetchAbort");
|
||
// computed properties
|
||
ve(this, Ue, void 0);
|
||
ve(this, Ot, void 0);
|
||
ve(this, ze, void 0);
|
||
ve(this, Ve, void 0);
|
||
ve(this, be, void 0);
|
||
ve(this, it, void 0);
|
||
ve(this, pt, void 0);
|
||
ve(this, nt, void 0);
|
||
ve(this, Xe, void 0);
|
||
ve(this, $t, void 0);
|
||
ve(this, Je, void 0);
|
||
ve(this, Et, void 0);
|
||
ve(this, Tt, void 0);
|
||
ve(this, gt, void 0);
|
||
ve(this, It, void 0);
|
||
ve(this, rn, void 0);
|
||
ve(this, st, void 0);
|
||
// conditionally set private methods related to TTL
|
||
ve(this, bn, () => {
|
||
});
|
||
ve(this, Wt, () => {
|
||
});
|
||
ve(this, lo, () => {
|
||
});
|
||
/* c8 ignore stop */
|
||
ve(this, vt, () => !1);
|
||
ve(this, yn, (t) => {
|
||
});
|
||
ve(this, Pn, (t, n, o) => {
|
||
});
|
||
ve(this, uo, (t, n, o, r) => {
|
||
if (o || r)
|
||
throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache");
|
||
return 0;
|
||
});
|
||
/**
|
||
* A String value that is used in the creation of the default string
|
||
* description of an object. Called by the built-in method
|
||
* `Object.prototype.toString`.
|
||
*/
|
||
se(this, up, "LRUCache");
|
||
const { max: n = 0, ttl: o, ttlResolution: r = 1, ttlAutopurge: a, updateAgeOnGet: i, updateAgeOnHas: s, allowStale: u, dispose: l, disposeAfter: c, noDisposeOnSet: d, noUpdateTTL: h, maxSize: f = 0, maxEntrySize: v = 0, sizeCalculation: p, fetchMethod: y, memoMethod: b, noDeleteOnFetchRejection: F, noDeleteOnStaleGet: R, allowStaleOnFetchRejection: D, allowStaleOnFetchAbort: A, ignoreFetchAbort: $ } = t;
|
||
if (n !== 0 && !Qt(n))
|
||
throw new TypeError("max option must be a nonnegative integer");
|
||
const P = n ? gi(n) : Array;
|
||
if (!P)
|
||
throw new Error("invalid max value: " + n);
|
||
if (he(this, Rt, n), he(this, mt, f), this.maxEntrySize = v || g(this, mt), this.sizeCalculation = p, this.sizeCalculation) {
|
||
if (!g(this, mt) && !this.maxEntrySize)
|
||
throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize");
|
||
if (typeof this.sizeCalculation != "function")
|
||
throw new TypeError("sizeCalculation set to non-function");
|
||
}
|
||
if (b !== void 0 && typeof b != "function")
|
||
throw new TypeError("memoMethod must be a function if defined");
|
||
if (he(this, Vn, b), y !== void 0 && typeof y != "function")
|
||
throw new TypeError("fetchMethod must be a function if specified");
|
||
if (he(this, An, y), he(this, rn, !!y), he(this, ze, /* @__PURE__ */ new Map()), he(this, Ve, new Array(n).fill(void 0)), he(this, be, new Array(n).fill(void 0)), he(this, it, new P(n)), he(this, pt, new P(n)), he(this, nt, 0), he(this, Xe, 0), he(this, $t, Fr.create(n)), he(this, Ue, 0), he(this, Ot, 0), typeof l == "function" && he(this, Dt, l), typeof c == "function" ? (he(this, kt, c), he(this, Je, [])) : (he(this, kt, void 0), he(this, Je, void 0)), he(this, It, !!g(this, Dt)), he(this, st, !!g(this, kt)), this.noDisposeOnSet = !!d, this.noUpdateTTL = !!h, this.noDeleteOnFetchRejection = !!F, this.allowStaleOnFetchRejection = !!D, this.allowStaleOnFetchAbort = !!A, this.ignoreFetchAbort = !!$, this.maxEntrySize !== 0) {
|
||
if (g(this, mt) !== 0 && !Qt(g(this, mt)))
|
||
throw new TypeError("maxSize must be a positive integer if specified");
|
||
if (!Qt(this.maxEntrySize))
|
||
throw new TypeError("maxEntrySize must be a positive integer if specified");
|
||
te(this, Xo, vi).call(this);
|
||
}
|
||
if (this.allowStale = !!u, this.noDeleteOnStaleGet = !!R, this.updateAgeOnGet = !!i, this.updateAgeOnHas = !!s, this.ttlResolution = Qt(r) || r === 0 ? r : 1, this.ttlAutopurge = !!a, this.ttl = o || 0, this.ttl) {
|
||
if (!Qt(this.ttl))
|
||
throw new TypeError("ttl must be a positive integer if specified");
|
||
te(this, so, Dr).call(this);
|
||
}
|
||
if (g(this, Rt) === 0 && this.ttl === 0 && g(this, mt) === 0)
|
||
throw new TypeError("At least one of max, maxSize, or ttl is required");
|
||
if (!this.ttlAutopurge && !g(this, Rt) && !g(this, mt)) {
|
||
const W = "LRU_CACHE_UNBOUNDED";
|
||
Ru(W) && (mi.add(W), pi("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.", "UnboundedCacheWarning", W, ia));
|
||
}
|
||
}
|
||
/**
|
||
* Do not call this method unless you need to inspect the
|
||
* inner workings of the cache. If anything returned by this
|
||
* object is modified in any way, strange breakage may occur.
|
||
*
|
||
* These fields are private for a reason!
|
||
*
|
||
* @internal
|
||
*/
|
||
static unsafeExposeInternals(t) {
|
||
return {
|
||
// properties
|
||
starts: g(t, Tt),
|
||
ttls: g(t, gt),
|
||
sizes: g(t, Et),
|
||
keyMap: g(t, ze),
|
||
keyList: g(t, Ve),
|
||
valList: g(t, be),
|
||
next: g(t, it),
|
||
prev: g(t, pt),
|
||
get head() {
|
||
return g(t, nt);
|
||
},
|
||
get tail() {
|
||
return g(t, Xe);
|
||
},
|
||
free: g(t, $t),
|
||
// methods
|
||
isBackgroundFetch: (n) => {
|
||
var o;
|
||
return te(o = t, Ie, Ae).call(o, n);
|
||
},
|
||
backgroundFetch: (n, o, r, a) => {
|
||
var i;
|
||
return te(i = t, Bn, Eo).call(i, n, o, r, a);
|
||
},
|
||
moveToTail: (n) => {
|
||
var o;
|
||
return te(o = t, wn, Un).call(o, n);
|
||
},
|
||
indexes: (n) => {
|
||
var o;
|
||
return te(o = t, Bt, Zt).call(o, n);
|
||
},
|
||
rindexes: (n) => {
|
||
var o;
|
||
return te(o = t, jt, en).call(o, n);
|
||
},
|
||
isStale: (n) => {
|
||
var o;
|
||
return g(o = t, vt).call(o, n);
|
||
}
|
||
};
|
||
}
|
||
// Protected read-only members
|
||
/**
|
||
* {@link LRUCache.OptionsBase.max} (read-only)
|
||
*/
|
||
get max() {
|
||
return g(this, Rt);
|
||
}
|
||
/**
|
||
* {@link LRUCache.OptionsBase.maxSize} (read-only)
|
||
*/
|
||
get maxSize() {
|
||
return g(this, mt);
|
||
}
|
||
/**
|
||
* The total computed size of items in the cache (read-only)
|
||
*/
|
||
get calculatedSize() {
|
||
return g(this, Ot);
|
||
}
|
||
/**
|
||
* The number of items stored in the cache (read-only)
|
||
*/
|
||
get size() {
|
||
return g(this, Ue);
|
||
}
|
||
/**
|
||
* {@link LRUCache.OptionsBase.fetchMethod} (read-only)
|
||
*/
|
||
get fetchMethod() {
|
||
return g(this, An);
|
||
}
|
||
get memoMethod() {
|
||
return g(this, Vn);
|
||
}
|
||
/**
|
||
* {@link LRUCache.OptionsBase.dispose} (read-only)
|
||
*/
|
||
get dispose() {
|
||
return g(this, Dt);
|
||
}
|
||
/**
|
||
* {@link LRUCache.OptionsBase.disposeAfter} (read-only)
|
||
*/
|
||
get disposeAfter() {
|
||
return g(this, kt);
|
||
}
|
||
/**
|
||
* Return the number of ms left in the item's TTL. If item is not in cache,
|
||
* returns `0`. Returns `Infinity` if item is in cache without a defined TTL.
|
||
*/
|
||
getRemainingTTL(t) {
|
||
return g(this, ze).has(t) ? 1 / 0 : 0;
|
||
}
|
||
/**
|
||
* Return a generator yielding `[key, value]` pairs,
|
||
* in order from most recently used to least recently used.
|
||
*/
|
||
*entries() {
|
||
for (const t of te(this, Bt, Zt).call(this))
|
||
g(this, be)[t] !== void 0 && g(this, Ve)[t] !== void 0 && !te(this, Ie, Ae).call(this, g(this, be)[t]) && (yield [g(this, Ve)[t], g(this, be)[t]]);
|
||
}
|
||
/**
|
||
* Inverse order version of {@link LRUCache.entries}
|
||
*
|
||
* Return a generator yielding `[key, value]` pairs,
|
||
* in order from least recently used to most recently used.
|
||
*/
|
||
*rentries() {
|
||
for (const t of te(this, jt, en).call(this))
|
||
g(this, be)[t] !== void 0 && g(this, Ve)[t] !== void 0 && !te(this, Ie, Ae).call(this, g(this, be)[t]) && (yield [g(this, Ve)[t], g(this, be)[t]]);
|
||
}
|
||
/**
|
||
* Return a generator yielding the keys in the cache,
|
||
* in order from most recently used to least recently used.
|
||
*/
|
||
*keys() {
|
||
for (const t of te(this, Bt, Zt).call(this)) {
|
||
const n = g(this, Ve)[t];
|
||
n !== void 0 && !te(this, Ie, Ae).call(this, g(this, be)[t]) && (yield n);
|
||
}
|
||
}
|
||
/**
|
||
* Inverse order version of {@link LRUCache.keys}
|
||
*
|
||
* Return a generator yielding the keys in the cache,
|
||
* in order from least recently used to most recently used.
|
||
*/
|
||
*rkeys() {
|
||
for (const t of te(this, jt, en).call(this)) {
|
||
const n = g(this, Ve)[t];
|
||
n !== void 0 && !te(this, Ie, Ae).call(this, g(this, be)[t]) && (yield n);
|
||
}
|
||
}
|
||
/**
|
||
* Return a generator yielding the values in the cache,
|
||
* in order from most recently used to least recently used.
|
||
*/
|
||
*values() {
|
||
for (const t of te(this, Bt, Zt).call(this))
|
||
g(this, be)[t] !== void 0 && !te(this, Ie, Ae).call(this, g(this, be)[t]) && (yield g(this, be)[t]);
|
||
}
|
||
/**
|
||
* Inverse order version of {@link LRUCache.values}
|
||
*
|
||
* Return a generator yielding the values in the cache,
|
||
* in order from least recently used to most recently used.
|
||
*/
|
||
*rvalues() {
|
||
for (const t of te(this, jt, en).call(this))
|
||
g(this, be)[t] !== void 0 && !te(this, Ie, Ae).call(this, g(this, be)[t]) && (yield g(this, be)[t]);
|
||
}
|
||
/**
|
||
* Iterating over the cache itself yields the same results as
|
||
* {@link LRUCache.entries}
|
||
*/
|
||
[Symbol.iterator]() {
|
||
return this.entries();
|
||
}
|
||
/**
|
||
* Find a value for which the supplied fn method returns a truthy value,
|
||
* similar to `Array.find()`. fn is called as `fn(value, key, cache)`.
|
||
*/
|
||
find(t, n = {}) {
|
||
for (const o of te(this, Bt, Zt).call(this)) {
|
||
const r = g(this, be)[o], a = te(this, Ie, Ae).call(this, r) ? r.__staleWhileFetching : r;
|
||
if (a !== void 0 && t(a, g(this, Ve)[o], this))
|
||
return this.get(g(this, Ve)[o], n);
|
||
}
|
||
}
|
||
/**
|
||
* Call the supplied function on each item in the cache, in order from most
|
||
* recently used to least recently used.
|
||
*
|
||
* `fn` is called as `fn(value, key, cache)`.
|
||
*
|
||
* If `thisp` is provided, function will be called in the `this`-context of
|
||
* the provided object, or the cache if no `thisp` object is provided.
|
||
*
|
||
* Does not update age or recenty of use, or iterate over stale values.
|
||
*/
|
||
forEach(t, n = this) {
|
||
for (const o of te(this, Bt, Zt).call(this)) {
|
||
const r = g(this, be)[o], a = te(this, Ie, Ae).call(this, r) ? r.__staleWhileFetching : r;
|
||
a !== void 0 && t.call(n, a, g(this, Ve)[o], this);
|
||
}
|
||
}
|
||
/**
|
||
* The same as {@link LRUCache.forEach} but items are iterated over in
|
||
* reverse order. (ie, less recently used items are iterated over first.)
|
||
*/
|
||
rforEach(t, n = this) {
|
||
for (const o of te(this, jt, en).call(this)) {
|
||
const r = g(this, be)[o], a = te(this, Ie, Ae).call(this, r) ? r.__staleWhileFetching : r;
|
||
a !== void 0 && t.call(n, a, g(this, Ve)[o], this);
|
||
}
|
||
}
|
||
/**
|
||
* Delete any stale entries. Returns true if anything was removed,
|
||
* false otherwise.
|
||
*/
|
||
purgeStale() {
|
||
let t = !1;
|
||
for (const n of te(this, jt, en).call(this, { allowStale: !0 }))
|
||
g(this, vt).call(this, n) && (te(this, Nt, tn).call(this, g(this, Ve)[n], "expire"), t = !0);
|
||
return t;
|
||
}
|
||
/**
|
||
* Get the extended info about a given entry, to get its value, size, and
|
||
* TTL info simultaneously. Returns `undefined` if the key is not present.
|
||
*
|
||
* Unlike {@link LRUCache#dump}, which is designed to be portable and survive
|
||
* serialization, the `start` value is always the current timestamp, and the
|
||
* `ttl` is a calculated remaining time to live (negative if expired).
|
||
*
|
||
* Always returns stale values, if their info is found in the cache, so be
|
||
* sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})
|
||
* if relevant.
|
||
*/
|
||
info(t) {
|
||
const n = g(this, ze).get(t);
|
||
if (n === void 0)
|
||
return;
|
||
const o = g(this, be)[n], r = te(this, Ie, Ae).call(this, o) ? o.__staleWhileFetching : o;
|
||
if (r === void 0)
|
||
return;
|
||
const a = { value: r };
|
||
if (g(this, gt) && g(this, Tt)) {
|
||
const i = g(this, gt)[n], s = g(this, Tt)[n];
|
||
if (i && s) {
|
||
const u = i - (Fn.now() - s);
|
||
a.ttl = u, a.start = Date.now();
|
||
}
|
||
}
|
||
return g(this, Et) && (a.size = g(this, Et)[n]), a;
|
||
}
|
||
/**
|
||
* Return an array of [key, {@link LRUCache.Entry}] tuples which can be
|
||
* passed to {@link LRLUCache#load}.
|
||
*
|
||
* The `start` fields are calculated relative to a portable `Date.now()`
|
||
* timestamp, even if `performance.now()` is available.
|
||
*
|
||
* Stale entries are always included in the `dump`, even if
|
||
* {@link LRUCache.OptionsBase.allowStale} is false.
|
||
*
|
||
* Note: this returns an actual array, not a generator, so it can be more
|
||
* easily passed around.
|
||
*/
|
||
dump() {
|
||
const t = [];
|
||
for (const n of te(this, Bt, Zt).call(this, { allowStale: !0 })) {
|
||
const o = g(this, Ve)[n], r = g(this, be)[n], a = te(this, Ie, Ae).call(this, r) ? r.__staleWhileFetching : r;
|
||
if (a === void 0 || o === void 0)
|
||
continue;
|
||
const i = { value: a };
|
||
if (g(this, gt) && g(this, Tt)) {
|
||
i.ttl = g(this, gt)[n];
|
||
const s = Fn.now() - g(this, Tt)[n];
|
||
i.start = Math.floor(Date.now() - s);
|
||
}
|
||
g(this, Et) && (i.size = g(this, Et)[n]), t.unshift([o, i]);
|
||
}
|
||
return t;
|
||
}
|
||
/**
|
||
* Reset the cache and load in the items in entries in the order listed.
|
||
*
|
||
* The shape of the resulting cache may be different if the same options are
|
||
* not used in both caches.
|
||
*
|
||
* The `start` fields are assumed to be calculated relative to a portable
|
||
* `Date.now()` timestamp, even if `performance.now()` is available.
|
||
*/
|
||
load(t) {
|
||
this.clear();
|
||
for (const [n, o] of t) {
|
||
if (o.start) {
|
||
const r = Date.now() - o.start;
|
||
o.start = Fn.now() - r;
|
||
}
|
||
this.set(n, o.value, o);
|
||
}
|
||
}
|
||
/**
|
||
* Add a value to the cache.
|
||
*
|
||
* Note: if `undefined` is specified as a value, this is an alias for
|
||
* {@link LRUCache#delete}
|
||
*
|
||
* Fields on the {@link LRUCache.SetOptions} options param will override
|
||
* their corresponding values in the constructor options for the scope
|
||
* of this single `set()` operation.
|
||
*
|
||
* If `start` is provided, then that will set the effective start
|
||
* time for the TTL calculation. Note that this must be a previous
|
||
* value of `performance.now()` if supported, or a previous value of
|
||
* `Date.now()` if not.
|
||
*
|
||
* Options object may also include `size`, which will prevent
|
||
* calling the `sizeCalculation` function and just use the specified
|
||
* number if it is a positive integer, and `noDisposeOnSet` which
|
||
* will prevent calling a `dispose` function in the case of
|
||
* overwrites.
|
||
*
|
||
* If the `size` (or return value of `sizeCalculation`) for a given
|
||
* entry is greater than `maxEntrySize`, then the item will not be
|
||
* added to the cache.
|
||
*
|
||
* Will update the recency of the entry.
|
||
*
|
||
* If the value is `undefined`, then this is an alias for
|
||
* `cache.delete(key)`. `undefined` is never stored in the cache.
|
||
*/
|
||
set(t, n, o = {}) {
|
||
var h, f, v, p, y;
|
||
if (n === void 0)
|
||
return this.delete(t), this;
|
||
const { ttl: r = this.ttl, start: a, noDisposeOnSet: i = this.noDisposeOnSet, sizeCalculation: s = this.sizeCalculation, status: u } = o;
|
||
let { noUpdateTTL: l = this.noUpdateTTL } = o;
|
||
const c = g(this, uo).call(this, t, n, o.size || 0, s);
|
||
if (this.maxEntrySize && c > this.maxEntrySize)
|
||
return u && (u.set = "miss", u.maxEntrySizeExceeded = !0), te(this, Nt, tn).call(this, t, "set"), this;
|
||
let d = g(this, Ue) === 0 ? void 0 : g(this, ze).get(t);
|
||
if (d === void 0)
|
||
d = g(this, Ue) === 0 ? g(this, Xe) : g(this, $t).length !== 0 ? g(this, $t).pop() : g(this, Ue) === g(this, Rt) ? te(this, Mn, $o).call(this, !1) : g(this, Ue), g(this, Ve)[d] = t, g(this, be)[d] = n, g(this, ze).set(t, d), g(this, it)[g(this, Xe)] = d, g(this, pt)[d] = g(this, Xe), he(this, Xe, d), yo(this, Ue)._++, g(this, Pn).call(this, d, c, u), u && (u.set = "add"), l = !1;
|
||
else {
|
||
te(this, wn, Un).call(this, d);
|
||
const b = g(this, be)[d];
|
||
if (n !== b) {
|
||
if (g(this, rn) && te(this, Ie, Ae).call(this, b)) {
|
||
b.__abortController.abort(new Error("replaced"));
|
||
const { __staleWhileFetching: F } = b;
|
||
F !== void 0 && !i && (g(this, It) && ((h = g(this, Dt)) == null || h.call(this, F, t, "set")), g(this, st) && ((f = g(this, Je)) == null || f.push([F, t, "set"])));
|
||
} else
|
||
i || (g(this, It) && ((v = g(this, Dt)) == null || v.call(this, b, t, "set")), g(this, st) && ((p = g(this, Je)) == null || p.push([b, t, "set"])));
|
||
if (g(this, yn).call(this, d), g(this, Pn).call(this, d, c, u), g(this, be)[d] = n, u) {
|
||
u.set = "replace";
|
||
const F = b && te(this, Ie, Ae).call(this, b) ? b.__staleWhileFetching : b;
|
||
F !== void 0 && (u.oldValue = F);
|
||
}
|
||
} else
|
||
u && (u.set = "update");
|
||
}
|
||
if (r !== 0 && !g(this, gt) && te(this, so, Dr).call(this), g(this, gt) && (l || g(this, lo).call(this, d, r, a), u && g(this, Wt).call(this, u, d)), !i && g(this, st) && g(this, Je)) {
|
||
const b = g(this, Je);
|
||
let F;
|
||
for (; F = b == null ? void 0 : b.shift(); )
|
||
(y = g(this, kt)) == null || y.call(this, ...F);
|
||
}
|
||
return this;
|
||
}
|
||
/**
|
||
* Evict the least recently used item, returning its value or
|
||
* `undefined` if cache is empty.
|
||
*/
|
||
pop() {
|
||
var t;
|
||
try {
|
||
for (; g(this, Ue); ) {
|
||
const n = g(this, be)[g(this, nt)];
|
||
if (te(this, Mn, $o).call(this, !0), te(this, Ie, Ae).call(this, n)) {
|
||
if (n.__staleWhileFetching)
|
||
return n.__staleWhileFetching;
|
||
} else if (n !== void 0)
|
||
return n;
|
||
}
|
||
} finally {
|
||
if (g(this, st) && g(this, Je)) {
|
||
const n = g(this, Je);
|
||
let o;
|
||
for (; o = n == null ? void 0 : n.shift(); )
|
||
(t = g(this, kt)) == null || t.call(this, ...o);
|
||
}
|
||
}
|
||
}
|
||
/**
|
||
* Check if a key is in the cache, without updating the recency of use.
|
||
* Will return false if the item is stale, even though it is technically
|
||
* in the cache.
|
||
*
|
||
* Check if a key is in the cache, without updating the recency of
|
||
* use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set
|
||
* to `true` in either the options or the constructor.
|
||
*
|
||
* Will return `false` if the item is stale, even though it is technically in
|
||
* the cache. The difference can be determined (if it matters) by using a
|
||
* `status` argument, and inspecting the `has` field.
|
||
*
|
||
* Will not update item age unless
|
||
* {@link LRUCache.OptionsBase.updateAgeOnHas} is set.
|
||
*/
|
||
has(t, n = {}) {
|
||
const { updateAgeOnHas: o = this.updateAgeOnHas, status: r } = n, a = g(this, ze).get(t);
|
||
if (a !== void 0) {
|
||
const i = g(this, be)[a];
|
||
if (te(this, Ie, Ae).call(this, i) && i.__staleWhileFetching === void 0)
|
||
return !1;
|
||
if (g(this, vt).call(this, a))
|
||
r && (r.has = "stale", g(this, Wt).call(this, r, a));
|
||
else
|
||
return o && g(this, bn).call(this, a), r && (r.has = "hit", g(this, Wt).call(this, r, a)), !0;
|
||
} else
|
||
r && (r.has = "miss");
|
||
return !1;
|
||
}
|
||
/**
|
||
* Like {@link LRUCache#get} but doesn't update recency or delete stale
|
||
* items.
|
||
*
|
||
* Returns `undefined` if the item is stale, unless
|
||
* {@link LRUCache.OptionsBase.allowStale} is set.
|
||
*/
|
||
peek(t, n = {}) {
|
||
const { allowStale: o = this.allowStale } = n, r = g(this, ze).get(t);
|
||
if (r === void 0 || !o && g(this, vt).call(this, r))
|
||
return;
|
||
const a = g(this, be)[r];
|
||
return te(this, Ie, Ae).call(this, a) ? a.__staleWhileFetching : a;
|
||
}
|
||
async fetch(t, n = {}) {
|
||
const {
|
||
// get options
|
||
allowStale: o = this.allowStale,
|
||
updateAgeOnGet: r = this.updateAgeOnGet,
|
||
noDeleteOnStaleGet: a = this.noDeleteOnStaleGet,
|
||
// set options
|
||
ttl: i = this.ttl,
|
||
noDisposeOnSet: s = this.noDisposeOnSet,
|
||
size: u = 0,
|
||
sizeCalculation: l = this.sizeCalculation,
|
||
noUpdateTTL: c = this.noUpdateTTL,
|
||
// fetch exclusive options
|
||
noDeleteOnFetchRejection: d = this.noDeleteOnFetchRejection,
|
||
allowStaleOnFetchRejection: h = this.allowStaleOnFetchRejection,
|
||
ignoreFetchAbort: f = this.ignoreFetchAbort,
|
||
allowStaleOnFetchAbort: v = this.allowStaleOnFetchAbort,
|
||
context: p,
|
||
forceRefresh: y = !1,
|
||
status: b,
|
||
signal: F
|
||
} = n;
|
||
if (!g(this, rn))
|
||
return b && (b.fetch = "get"), this.get(t, {
|
||
allowStale: o,
|
||
updateAgeOnGet: r,
|
||
noDeleteOnStaleGet: a,
|
||
status: b
|
||
});
|
||
const R = {
|
||
allowStale: o,
|
||
updateAgeOnGet: r,
|
||
noDeleteOnStaleGet: a,
|
||
ttl: i,
|
||
noDisposeOnSet: s,
|
||
size: u,
|
||
sizeCalculation: l,
|
||
noUpdateTTL: c,
|
||
noDeleteOnFetchRejection: d,
|
||
allowStaleOnFetchRejection: h,
|
||
allowStaleOnFetchAbort: v,
|
||
ignoreFetchAbort: f,
|
||
status: b,
|
||
signal: F
|
||
};
|
||
let D = g(this, ze).get(t);
|
||
if (D === void 0) {
|
||
b && (b.fetch = "miss");
|
||
const A = te(this, Bn, Eo).call(this, t, D, R, p);
|
||
return A.__returned = A;
|
||
} else {
|
||
const A = g(this, be)[D];
|
||
if (te(this, Ie, Ae).call(this, A)) {
|
||
const Y = o && A.__staleWhileFetching !== void 0;
|
||
return b && (b.fetch = "inflight", Y && (b.returnedStale = !0)), Y ? A.__staleWhileFetching : A.__returned = A;
|
||
}
|
||
const $ = g(this, vt).call(this, D);
|
||
if (!y && !$)
|
||
return b && (b.fetch = "hit"), te(this, wn, Un).call(this, D), r && g(this, bn).call(this, D), b && g(this, Wt).call(this, b, D), A;
|
||
const P = te(this, Bn, Eo).call(this, t, D, R, p), k = P.__staleWhileFetching !== void 0 && o;
|
||
return b && (b.fetch = $ ? "stale" : "refresh", k && $ && (b.returnedStale = !0)), k ? P.__staleWhileFetching : P.__returned = P;
|
||
}
|
||
}
|
||
async forceFetch(t, n = {}) {
|
||
const o = await this.fetch(t, n);
|
||
if (o === void 0)
|
||
throw new Error("fetch() returned undefined");
|
||
return o;
|
||
}
|
||
memo(t, n = {}) {
|
||
const o = g(this, Vn);
|
||
if (!o)
|
||
throw new Error("no memoMethod provided to constructor");
|
||
const { context: r, forceRefresh: a, ...i } = n, s = this.get(t, i);
|
||
if (!a && s !== void 0)
|
||
return s;
|
||
const u = o(t, s, {
|
||
options: i,
|
||
context: r
|
||
});
|
||
return this.set(t, u, i), u;
|
||
}
|
||
/**
|
||
* Return a value from the cache. Will update the recency of the cache
|
||
* entry found.
|
||
*
|
||
* If the key is not found, get() will return `undefined`.
|
||
*/
|
||
get(t, n = {}) {
|
||
const { allowStale: o = this.allowStale, updateAgeOnGet: r = this.updateAgeOnGet, noDeleteOnStaleGet: a = this.noDeleteOnStaleGet, status: i } = n, s = g(this, ze).get(t);
|
||
if (s !== void 0) {
|
||
const u = g(this, be)[s], l = te(this, Ie, Ae).call(this, u);
|
||
return i && g(this, Wt).call(this, i, s), g(this, vt).call(this, s) ? (i && (i.get = "stale"), l ? (i && o && u.__staleWhileFetching !== void 0 && (i.returnedStale = !0), o ? u.__staleWhileFetching : void 0) : (a || te(this, Nt, tn).call(this, t, "expire"), i && o && (i.returnedStale = !0), o ? u : void 0)) : (i && (i.get = "hit"), l ? u.__staleWhileFetching : (te(this, wn, Un).call(this, s), r && g(this, bn).call(this, s), u));
|
||
} else
|
||
i && (i.get = "miss");
|
||
}
|
||
/**
|
||
* Deletes a key out of the cache.
|
||
*
|
||
* Returns true if the key was deleted, false otherwise.
|
||
*/
|
||
delete(t) {
|
||
return te(this, Nt, tn).call(this, t, "delete");
|
||
}
|
||
/**
|
||
* Clear the cache entirely, throwing away all values.
|
||
*/
|
||
clear() {
|
||
return te(this, ho, $r).call(this, "delete");
|
||
}
|
||
};
|
||
up = Symbol.toStringTag, Rt = new WeakMap(), mt = new WeakMap(), Dt = new WeakMap(), kt = new WeakMap(), An = new WeakMap(), Vn = new WeakMap(), Ue = new WeakMap(), Ot = new WeakMap(), ze = new WeakMap(), Ve = new WeakMap(), be = new WeakMap(), it = new WeakMap(), pt = new WeakMap(), nt = new WeakMap(), Xe = new WeakMap(), $t = new WeakMap(), Je = new WeakMap(), Et = new WeakMap(), Tt = new WeakMap(), gt = new WeakMap(), It = new WeakMap(), rn = new WeakMap(), st = new WeakMap(), so = new WeakSet(), Dr = function() {
|
||
const t = new Oo(g(this, Rt)), n = new Oo(g(this, Rt));
|
||
he(this, gt, t), he(this, Tt, n), he(this, lo, (a, i, s = Fn.now()) => {
|
||
if (n[a] = i !== 0 ? s : 0, t[a] = i, i !== 0 && this.ttlAutopurge) {
|
||
const u = setTimeout(() => {
|
||
g(this, vt).call(this, a) && te(this, Nt, tn).call(this, g(this, Ve)[a], "expire");
|
||
}, i + 1);
|
||
u.unref && u.unref();
|
||
}
|
||
}), he(this, bn, (a) => {
|
||
n[a] = t[a] !== 0 ? Fn.now() : 0;
|
||
}), he(this, Wt, (a, i) => {
|
||
if (t[i]) {
|
||
const s = t[i], u = n[i];
|
||
if (!s || !u)
|
||
return;
|
||
a.ttl = s, a.start = u, a.now = o || r();
|
||
const l = a.now - u;
|
||
a.remainingTTL = s - l;
|
||
}
|
||
});
|
||
let o = 0;
|
||
const r = () => {
|
||
const a = Fn.now();
|
||
if (this.ttlResolution > 0) {
|
||
o = a;
|
||
const i = setTimeout(() => o = 0, this.ttlResolution);
|
||
i.unref && i.unref();
|
||
}
|
||
return a;
|
||
};
|
||
this.getRemainingTTL = (a) => {
|
||
const i = g(this, ze).get(a);
|
||
if (i === void 0)
|
||
return 0;
|
||
const s = t[i], u = n[i];
|
||
if (!s || !u)
|
||
return 1 / 0;
|
||
const l = (o || r()) - u;
|
||
return s - l;
|
||
}, he(this, vt, (a) => {
|
||
const i = n[a], s = t[a];
|
||
return !!s && !!i && (o || r()) - i > s;
|
||
});
|
||
}, bn = new WeakMap(), Wt = new WeakMap(), lo = new WeakMap(), vt = new WeakMap(), Xo = new WeakSet(), vi = function() {
|
||
const t = new Oo(g(this, Rt));
|
||
he(this, Ot, 0), he(this, Et, t), he(this, yn, (n) => {
|
||
he(this, Ot, g(this, Ot) - t[n]), t[n] = 0;
|
||
}), he(this, uo, (n, o, r, a) => {
|
||
if (te(this, Ie, Ae).call(this, o))
|
||
return 0;
|
||
if (!Qt(r))
|
||
if (a) {
|
||
if (typeof a != "function")
|
||
throw new TypeError("sizeCalculation must be a function");
|
||
if (r = a(o, n), !Qt(r))
|
||
throw new TypeError("sizeCalculation return invalid (expect positive integer)");
|
||
} else
|
||
throw new TypeError("invalid size value (must be positive integer). When maxSize or maxEntrySize is used, sizeCalculation or size must be set.");
|
||
return r;
|
||
}), he(this, Pn, (n, o, r) => {
|
||
if (t[n] = o, g(this, mt)) {
|
||
const a = g(this, mt) - t[n];
|
||
for (; g(this, Ot) > a; )
|
||
te(this, Mn, $o).call(this, !0);
|
||
}
|
||
he(this, Ot, g(this, Ot) + t[n]), r && (r.entrySize = o, r.totalCalculatedSize = g(this, Ot));
|
||
});
|
||
}, yn = new WeakMap(), Pn = new WeakMap(), uo = new WeakMap(), Bt = new WeakSet(), Zt = function* ({ allowStale: t = this.allowStale } = {}) {
|
||
if (g(this, Ue))
|
||
for (let n = g(this, Xe); !(!te(this, co, kr).call(this, n) || ((t || !g(this, vt).call(this, n)) && (yield n), n === g(this, nt))); )
|
||
n = g(this, pt)[n];
|
||
}, jt = new WeakSet(), en = function* ({ allowStale: t = this.allowStale } = {}) {
|
||
if (g(this, Ue))
|
||
for (let n = g(this, nt); !(!te(this, co, kr).call(this, n) || ((t || !g(this, vt).call(this, n)) && (yield n), n === g(this, Xe))); )
|
||
n = g(this, it)[n];
|
||
}, co = new WeakSet(), kr = function(t) {
|
||
return t !== void 0 && g(this, ze).get(g(this, Ve)[t]) === t;
|
||
}, Mn = new WeakSet(), $o = function(t) {
|
||
var a, i;
|
||
const n = g(this, nt), o = g(this, Ve)[n], r = g(this, be)[n];
|
||
return g(this, rn) && te(this, Ie, Ae).call(this, r) ? r.__abortController.abort(new Error("evicted")) : (g(this, It) || g(this, st)) && (g(this, It) && ((a = g(this, Dt)) == null || a.call(this, r, o, "evict")), g(this, st) && ((i = g(this, Je)) == null || i.push([r, o, "evict"]))), g(this, yn).call(this, n), t && (g(this, Ve)[n] = void 0, g(this, be)[n] = void 0, g(this, $t).push(n)), g(this, Ue) === 1 ? (he(this, nt, he(this, Xe, 0)), g(this, $t).length = 0) : he(this, nt, g(this, it)[n]), g(this, ze).delete(o), yo(this, Ue)._--, n;
|
||
}, Bn = new WeakSet(), Eo = function(t, n, o, r) {
|
||
const a = n === void 0 ? void 0 : g(this, be)[n];
|
||
if (te(this, Ie, Ae).call(this, a))
|
||
return a;
|
||
const i = new Ho(), { signal: s } = o;
|
||
s == null || s.addEventListener("abort", () => i.abort(s.reason), {
|
||
signal: i.signal
|
||
});
|
||
const u = {
|
||
signal: i.signal,
|
||
options: o,
|
||
context: r
|
||
}, l = (p, y = !1) => {
|
||
const { aborted: b } = i.signal, F = o.ignoreFetchAbort && p !== void 0;
|
||
if (o.status && (b && !y ? (o.status.fetchAborted = !0, o.status.fetchError = i.signal.reason, F && (o.status.fetchAbortIgnored = !0)) : o.status.fetchResolved = !0), b && !F && !y)
|
||
return d(i.signal.reason);
|
||
const R = f;
|
||
return g(this, be)[n] === f && (p === void 0 ? R.__staleWhileFetching ? g(this, be)[n] = R.__staleWhileFetching : te(this, Nt, tn).call(this, t, "fetch") : (o.status && (o.status.fetchUpdated = !0), this.set(t, p, u.options))), p;
|
||
}, c = (p) => (o.status && (o.status.fetchRejected = !0, o.status.fetchError = p), d(p)), d = (p) => {
|
||
const { aborted: y } = i.signal, b = y && o.allowStaleOnFetchAbort, F = b || o.allowStaleOnFetchRejection, R = F || o.noDeleteOnFetchRejection, D = f;
|
||
if (g(this, be)[n] === f && (!R || D.__staleWhileFetching === void 0 ? te(this, Nt, tn).call(this, t, "fetch") : b || (g(this, be)[n] = D.__staleWhileFetching)), F)
|
||
return o.status && D.__staleWhileFetching !== void 0 && (o.status.returnedStale = !0), D.__staleWhileFetching;
|
||
if (D.__returned === D)
|
||
throw p;
|
||
}, h = (p, y) => {
|
||
var F;
|
||
const b = (F = g(this, An)) == null ? void 0 : F.call(this, t, a, u);
|
||
b && b instanceof Promise && b.then((R) => p(R === void 0 ? void 0 : R), y), i.signal.addEventListener("abort", () => {
|
||
(!o.ignoreFetchAbort || o.allowStaleOnFetchAbort) && (p(void 0), o.allowStaleOnFetchAbort && (p = (R) => l(R, !0)));
|
||
});
|
||
};
|
||
o.status && (o.status.fetchDispatched = !0);
|
||
const f = new Promise(h).then(l, c), v = Object.assign(f, {
|
||
__abortController: i,
|
||
__staleWhileFetching: a,
|
||
__returned: void 0
|
||
});
|
||
return n === void 0 ? (this.set(t, v, { ...u.options, status: void 0 }), n = g(this, ze).get(t)) : g(this, be)[n] = v, v;
|
||
}, Ie = new WeakSet(), Ae = function(t) {
|
||
if (!g(this, rn))
|
||
return !1;
|
||
const n = t;
|
||
return !!n && n instanceof Promise && n.hasOwnProperty("__staleWhileFetching") && n.__abortController instanceof Ho;
|
||
}, fo = new WeakSet(), Or = function(t, n) {
|
||
g(this, pt)[n] = t, g(this, it)[t] = n;
|
||
}, wn = new WeakSet(), Un = function(t) {
|
||
t !== g(this, Xe) && (t === g(this, nt) ? he(this, nt, g(this, it)[t]) : te(this, fo, Or).call(this, g(this, pt)[t], g(this, it)[t]), te(this, fo, Or).call(this, g(this, Xe), t), he(this, Xe, t));
|
||
}, Nt = new WeakSet(), tn = function(t, n) {
|
||
var r, a, i, s;
|
||
let o = !1;
|
||
if (g(this, Ue) !== 0) {
|
||
const u = g(this, ze).get(t);
|
||
if (u !== void 0)
|
||
if (o = !0, g(this, Ue) === 1)
|
||
te(this, ho, $r).call(this, n);
|
||
else {
|
||
g(this, yn).call(this, u);
|
||
const l = g(this, be)[u];
|
||
if (te(this, Ie, Ae).call(this, l) ? l.__abortController.abort(new Error("deleted")) : (g(this, It) || g(this, st)) && (g(this, It) && ((r = g(this, Dt)) == null || r.call(this, l, t, n)), g(this, st) && ((a = g(this, Je)) == null || a.push([l, t, n]))), g(this, ze).delete(t), g(this, Ve)[u] = void 0, g(this, be)[u] = void 0, u === g(this, Xe))
|
||
he(this, Xe, g(this, pt)[u]);
|
||
else if (u === g(this, nt))
|
||
he(this, nt, g(this, it)[u]);
|
||
else {
|
||
const c = g(this, pt)[u];
|
||
g(this, it)[c] = g(this, it)[u];
|
||
const d = g(this, it)[u];
|
||
g(this, pt)[d] = g(this, pt)[u];
|
||
}
|
||
yo(this, Ue)._--, g(this, $t).push(u);
|
||
}
|
||
}
|
||
if (g(this, st) && ((i = g(this, Je)) != null && i.length)) {
|
||
const u = g(this, Je);
|
||
let l;
|
||
for (; l = u == null ? void 0 : u.shift(); )
|
||
(s = g(this, kt)) == null || s.call(this, ...l);
|
||
}
|
||
return o;
|
||
}, ho = new WeakSet(), $r = function(t) {
|
||
var n, o, r;
|
||
for (const a of te(this, jt, en).call(this, { allowStale: !0 })) {
|
||
const i = g(this, be)[a];
|
||
if (te(this, Ie, Ae).call(this, i))
|
||
i.__abortController.abort(new Error("deleted"));
|
||
else {
|
||
const s = g(this, Ve)[a];
|
||
g(this, It) && ((n = g(this, Dt)) == null || n.call(this, i, s, t)), g(this, st) && ((o = g(this, Je)) == null || o.push([i, s, t]));
|
||
}
|
||
}
|
||
if (g(this, ze).clear(), g(this, be).fill(void 0), g(this, Ve).fill(void 0), g(this, gt) && g(this, Tt) && (g(this, gt).fill(0), g(this, Tt).fill(0)), g(this, Et) && g(this, Et).fill(0), he(this, nt, 0), he(this, Xe, 0), g(this, $t).length = 0, he(this, Ot, 0), he(this, Ue, 0), g(this, st) && g(this, Je)) {
|
||
const a = g(this, Je);
|
||
let i;
|
||
for (; i = a == null ? void 0 : a.shift(); )
|
||
(r = g(this, kt)) == null || r.call(this, ...i);
|
||
}
|
||
};
|
||
let Rr = ia;
|
||
const wo = new Rr({
|
||
max: 500,
|
||
maxSize: 5e3,
|
||
ttl: 1e3 * 60 * 30,
|
||
sizeCalculation: (e, t) => 1
|
||
}), { UnMergeable: Du } = $e();
|
||
function ku(e) {
|
||
bi = e;
|
||
}
|
||
let bi = async (e) => (de.warn("请配置 app.use(FsCrud,{dictRequest:(context)=>{ 你的字典请求方法 }})"), []);
|
||
class yi extends Du {
|
||
//loadDict成功后的通知
|
||
constructor(n) {
|
||
super();
|
||
se(this, "cache", !1);
|
||
// 获取到结果是否进行全局缓存
|
||
se(this, "prototype", !1);
|
||
// 是否原型配置
|
||
se(this, "immediate", !0);
|
||
//是否立即请求
|
||
se(this, "url");
|
||
se(this, "getData");
|
||
se(this, "value", "value");
|
||
se(this, "label", "label");
|
||
se(this, "labelBuilder");
|
||
se(this, "children", "children");
|
||
se(this, "color", "color");
|
||
se(this, "isTree", !1);
|
||
se(this, "_data", null);
|
||
se(this, "originalData");
|
||
se(this, "dataMap", {});
|
||
se(this, "loading", !1);
|
||
se(this, "custom", {});
|
||
se(this, "getNodesByValues");
|
||
se(this, "onReady");
|
||
se(this, "notifies", []);
|
||
se(this, "_unfetchValues", {});
|
||
Object.defineProperty(this, "loading", {
|
||
value: !1,
|
||
enumerable: !1
|
||
}), Object.defineProperty(this, "notifies", {
|
||
value: !1,
|
||
enumerable: !1
|
||
}), Object.defineProperty(this, "originalData", {
|
||
value: null,
|
||
enumerable: !1
|
||
}), this.loading = !1, mo(this, n), n.data != null && (this.originalData = n.data, this.setData(n.data)), this.toMap();
|
||
}
|
||
get data() {
|
||
return this._data;
|
||
}
|
||
set data(n) {
|
||
this._data = n, this.toMap();
|
||
}
|
||
isDynamic() {
|
||
return this.url instanceof Function || this.getData instanceof Function || this.prototype;
|
||
}
|
||
setData(n) {
|
||
this.data = n;
|
||
}
|
||
/**
|
||
* 加载字典
|
||
*/
|
||
async _loadDict(n) {
|
||
if (this.data && !n.reload)
|
||
return this.data;
|
||
if (this.loading)
|
||
return this._registerNotify();
|
||
let o = null;
|
||
if (this.getNodesByValues) {
|
||
if (n.value) {
|
||
let r = null;
|
||
this.cache && this.url && (r = this.url + n.value);
|
||
let a = null;
|
||
if (r && (a = wo.get(r)), a)
|
||
o = a;
|
||
else {
|
||
const i = Array.isArray(n.value) ? n.value : [n.value];
|
||
if (o = await this.getNodesByValues(i, n), o != null && !(o instanceof Array)) {
|
||
de.error("getNodesByValues需要返回数组,当前返回值:", o);
|
||
return;
|
||
}
|
||
r && wo.set(r, o);
|
||
}
|
||
}
|
||
} else if (this.originalData)
|
||
o = this.originalData;
|
||
else {
|
||
this.loading = !0;
|
||
try {
|
||
o = await this.getRemoteDictData(n);
|
||
} finally {
|
||
this.loading = !1;
|
||
}
|
||
}
|
||
this.data = o, this.onReady && this.onReady({ dict: this, ...n }), this._triggerNotify();
|
||
}
|
||
_triggerNotify() {
|
||
this.notifies && this.notifies.length > 0 && (G(this.notifies, (n) => {
|
||
n(this.data);
|
||
}), this.notifies.length = 0);
|
||
}
|
||
_registerNotify() {
|
||
let n = null;
|
||
const o = new Promise((r) => {
|
||
n = (a) => {
|
||
r(a);
|
||
};
|
||
});
|
||
return this.notifies || (this.notifies = []), this.notifies.push(n), o;
|
||
}
|
||
/**
|
||
* 加载字典
|
||
* @param context 当prototype=true时会传入
|
||
*/
|
||
async loadDict(n) {
|
||
return await this._loadDict({ ...n });
|
||
}
|
||
async reloadDict(n) {
|
||
return await this.loadDict({ ...n, reload: !0 });
|
||
}
|
||
/**
|
||
* 根据value获取nodes 追加数据
|
||
* @param values
|
||
*/
|
||
async appendByValues(n) {
|
||
if (this.getNodesByValues == null) {
|
||
de.warn("请配置getNodesByValues");
|
||
return;
|
||
}
|
||
for (const r of n)
|
||
this.dataMap[r] || this._unfetchValues[r] || (this._unfetchValues[r] = {
|
||
loading: !1,
|
||
value: r
|
||
});
|
||
await Me(), await Me(), await Me();
|
||
const o = [];
|
||
if (G(this._unfetchValues, (r) => {
|
||
r.loading || (r.loading = !0, o.push(r.value));
|
||
}), o.length > 0) {
|
||
const r = await this.getNodesByValues(o);
|
||
this.setData([...this.data || [], ...r]);
|
||
for (const a of o)
|
||
delete this._unfetchValues[a];
|
||
return Object.keys(this._unfetchValues).length === 0 && this._triggerNotify(), this.data;
|
||
} else
|
||
return this._registerNotify();
|
||
}
|
||
clear() {
|
||
this.originalData = null, this.setData(null);
|
||
}
|
||
async getRemoteDictData(n) {
|
||
let o, r, a;
|
||
if (this.url && (a = this.url, a instanceof Function && (a = a({ ...n, dict: this })), r = a), this.getData != null)
|
||
o = async () => {
|
||
const i = await this.getData({ url: a, dict: this, ...n });
|
||
return Array.isArray(i) ? i : [];
|
||
};
|
||
else if (a)
|
||
o = async () => {
|
||
const i = await bi({ url: a, dict: this });
|
||
return Array.isArray(i) ? i : [];
|
||
};
|
||
else
|
||
return [];
|
||
if (this.cache && r) {
|
||
let i = wo.get(r);
|
||
if (i == null)
|
||
i = {
|
||
loaded: !1,
|
||
loading: !0,
|
||
data: void 0,
|
||
callback: []
|
||
}, wo.set(r, i);
|
||
else {
|
||
if (i.loaded)
|
||
return i.data;
|
||
if (i.loading)
|
||
return new Promise((s) => {
|
||
const u = (l) => {
|
||
s(l);
|
||
};
|
||
i.callback.push(u);
|
||
});
|
||
}
|
||
try {
|
||
i.loaded = !1, i.loading = !0;
|
||
let s = await o();
|
||
s = s || [], s instanceof Array || de.warn("dict data 格式有误,期望格式为数组,实际格式为:", s), i.data = s, i.loaded = !0, i.loading = !1;
|
||
for (const u of i.callback)
|
||
u(s);
|
||
return i.callback = [], s;
|
||
} catch (s) {
|
||
i.loading = !1, i.loaded = !1, de.error("load dict error:", s);
|
||
}
|
||
}
|
||
return await o();
|
||
}
|
||
toMap() {
|
||
if (this._data == null) {
|
||
this.dataMap = {};
|
||
return;
|
||
}
|
||
const n = {};
|
||
this.data && this.buildMap(n, this.data || []), this.dataMap = n;
|
||
}
|
||
buildMap(n, o) {
|
||
G(o, (r) => {
|
||
n[this.getValue(r)] = r, this.isTree && this.getChildren(r) && this.buildMap(n, this.getChildren(r));
|
||
});
|
||
}
|
||
getValue(n) {
|
||
return n[this.value];
|
||
}
|
||
getLabel(n) {
|
||
return this.labelBuilder ? this.labelBuilder(n) : n[this.label];
|
||
}
|
||
getChildren(n) {
|
||
return n[this.children];
|
||
}
|
||
getColor(n) {
|
||
return n[this.color];
|
||
}
|
||
getDictData() {
|
||
return this.data;
|
||
}
|
||
getDictMap() {
|
||
return this.dataMap;
|
||
}
|
||
getNodeByValue(n) {
|
||
return this.dataMap[n];
|
||
}
|
||
getNodesFromDataMap(n) {
|
||
if (n == null)
|
||
return [];
|
||
No(n) || (n = [n]);
|
||
const o = [];
|
||
return G(n, (r) => {
|
||
const a = this.dataMap[r];
|
||
a ? o.push(a) : o.push({ [this.value]: r });
|
||
}), o;
|
||
}
|
||
}
|
||
function Ou(e) {
|
||
const t = jo(new yi(e));
|
||
return !t.prototype && t.immediate && t.loadDict(), t;
|
||
}
|
||
function $u() {
|
||
return {
|
||
dict: Ou,
|
||
setDictRequest: ku,
|
||
Dict: yi
|
||
};
|
||
}
|
||
function Sp() {
|
||
return {
|
||
addTypes: $n.addTypes,
|
||
getType: $n.getType,
|
||
getTypes: $n.getTypes,
|
||
install: $n.install
|
||
};
|
||
}
|
||
async function Eu(e) {
|
||
await Me();
|
||
const t = e.getModal();
|
||
if (t == null)
|
||
return;
|
||
const n = t.querySelector(".ant-modal-header");
|
||
if (n == null)
|
||
return;
|
||
const o = t, a = t.style;
|
||
n.style.cursor = "move", n.onmousedown = (i) => {
|
||
const s = i.clientX, u = i.clientY;
|
||
o.style.transform = "translate(0px, 0px)";
|
||
let l, c;
|
||
a.left.includes("%") ? (l = +document.body.clientWidth * (+a.left.replace(/%/g, "") / 100), c = +document.body.clientHeight * (+a.top.replace(/%/g, "") / 100)) : (l = +a.left.replace(/px/g, ""), c = +a.top.replace(/px/g, ""), c = c === 0 ? 100 : c), document.onmousemove = function(d) {
|
||
const h = d.clientX - s, f = d.clientY - u;
|
||
o.style.left = `${h + l}px`, o.style.top = `${f + c}px`;
|
||
}, document.onmouseup = function(d) {
|
||
document.onmousemove = null, document.onmouseup = null;
|
||
};
|
||
};
|
||
}
|
||
async function Tu(e) {
|
||
await Me();
|
||
const t = e.getModal();
|
||
if (t == null)
|
||
return;
|
||
const n = t.querySelector(".n-card-header");
|
||
if (n == null)
|
||
return;
|
||
const o = t, a = t.style;
|
||
n.style.cursor = "move", n.onmousedown = (i) => {
|
||
const s = i.clientX, u = i.clientY;
|
||
o.style.transform = "translate(0px, 0px)";
|
||
let l, c;
|
||
a.left.includes("%") ? (l = +document.body.clientWidth * (+a.left.replace(/%/g, "") / 100), c = +document.body.clientHeight * (+a.top.replace(/%/g, "") / 100)) : (l = +a.left.replace(/px/g, ""), c = +a.top.replace(/px/g, "")), document.onmousemove = async function(d) {
|
||
if (d.clientX == 0 && d.clientY == 0)
|
||
return;
|
||
const h = d.clientX - s, f = d.clientY - u;
|
||
o.style.left = `${h + l}px`, o.style.top = `${f + c}px`;
|
||
}, document.onmouseup = function(d) {
|
||
document.onmousemove = null, document.onmouseup = null;
|
||
};
|
||
};
|
||
}
|
||
async function Iu(e) {
|
||
const { ui: t } = Ce();
|
||
t.type === "antdv" ? await Eu(e) : t.type === "element" || await Tu(e);
|
||
}
|
||
function Au() {
|
||
return {
|
||
dragModal: Iu
|
||
};
|
||
}
|
||
const Vu = {
|
||
logger: {
|
||
off: {
|
||
tableColumns: !1
|
||
}
|
||
}
|
||
}, Pu = ue({
|
||
name: "FsContainer",
|
||
props: {
|
||
/**
|
||
* 是否固定高度
|
||
*/
|
||
fixedHeight: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* body的样式
|
||
*/
|
||
bodyStyle: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
/**
|
||
* inner的样式
|
||
*/
|
||
innerStyle: {
|
||
type: Object,
|
||
default: () => ({})
|
||
}
|
||
},
|
||
setup(e, t) {
|
||
const { merge: n } = $e(), o = B(() => e.fixedHeight === !1 ? n({ position: "relative" }, e.innerStyle) : e.innerStyle), r = B(() => e.fixedHeight === !1 ? n({ flex: "unset" }, e.bodyStyle) : e.bodyStyle);
|
||
return {
|
||
computedInnerStyle: o,
|
||
computedBodyStyle: r
|
||
};
|
||
}
|
||
});
|
||
const Mu = { class: "fs-container" }, Bu = { class: "box" }, ju = { class: "header" }, Nu = { class: "footer" };
|
||
function xu(e, t, n, o, r, a) {
|
||
return w(), j("div", Mu, [
|
||
ee("div", Bu, [
|
||
ee("div", {
|
||
class: "inner",
|
||
style: jn(e.computedInnerStyle)
|
||
}, [
|
||
ee("div", ju, [
|
||
ae(e.$slots, "header")
|
||
]),
|
||
ee("div", {
|
||
class: "body",
|
||
style: jn(e.computedBodyStyle)
|
||
}, [
|
||
ae(e.$slots, "default")
|
||
], 4),
|
||
ee("div", Nu, [
|
||
ae(e.$slots, "footer")
|
||
])
|
||
], 4)
|
||
]),
|
||
ae(e.$slots, "box")
|
||
]);
|
||
}
|
||
const Lu = /* @__PURE__ */ Te(Pu, [["render", xu]]), qu = ue({
|
||
name: "FsLayoutDefault"
|
||
});
|
||
const Hu = { class: "fs-crud-header" }, zu = { class: "fs-header-top" }, Wu = { class: "fs-header-middle" }, Uu = { class: "fs-header-bottom" }, Ku = { class: "fs-crud-footer" };
|
||
function Yu(e, t, n, o, r, a) {
|
||
const i = J("fs-container");
|
||
return w(), V(i, { class: "fs-layout-default" }, {
|
||
header: N(() => [
|
||
ee("div", Hu, [
|
||
ee("div", zu, [
|
||
ae(e.$slots, "header-top")
|
||
]),
|
||
ae(e.$slots, "search"),
|
||
ee("div", Wu, [
|
||
ae(e.$slots, "header-middle")
|
||
]),
|
||
ae(e.$slots, "actionbar"),
|
||
ae(e.$slots, "toolbar"),
|
||
ee("div", Uu, [
|
||
ae(e.$slots, "header-bottom")
|
||
]),
|
||
ae(e.$slots, "tabs")
|
||
])
|
||
]),
|
||
footer: N(() => [
|
||
ee("div", Ku, [
|
||
ae(e.$slots, "footer-top"),
|
||
ae(e.$slots, "pagination"),
|
||
ae(e.$slots, "footer-bottom")
|
||
])
|
||
]),
|
||
default: N(() => [
|
||
ae(e.$slots, "default"),
|
||
ae(e.$slots, "table"),
|
||
ae(e.$slots, "form")
|
||
]),
|
||
_: 3
|
||
});
|
||
}
|
||
const Gu = /* @__PURE__ */ Te(qu, [["render", Yu]]), Xu = ue({
|
||
name: "FsLayoutCard",
|
||
setup() {
|
||
const e = xn("get:crudBinding"), t = B(() => {
|
||
var r, a;
|
||
return e == null ? !0 : (a = (r = e()) == null ? void 0 : r.search) == null ? void 0 : a.show;
|
||
}), { ui: n } = Ce(), o = K(n.card.name);
|
||
return {
|
||
searchShow: t,
|
||
cardComponentName: o
|
||
};
|
||
}
|
||
});
|
||
const Ju = { class: "fs-header-top" }, Qu = { class: "fs-header-bottom" }, Zu = { class: "top-bar" }, ec = { class: "top-bar" }, tc = { class: "fs-crud-footer" };
|
||
function nc(e, t, n, o, r, a) {
|
||
const i = J("fs-container");
|
||
return w(), V(i, { class: "fs-layout-card" }, {
|
||
header: N(() => [
|
||
ee("div", Ju, [
|
||
ae(e.$slots, "header-top")
|
||
]),
|
||
e.searchShow ? (w(), V(z(e.cardComponentName), { key: 0 }, {
|
||
default: N(() => [
|
||
ae(e.$slots, "search")
|
||
]),
|
||
_: 3
|
||
})) : ne("", !0),
|
||
ee("div", Qu, [
|
||
ae(e.$slots, "header-bottom")
|
||
])
|
||
]),
|
||
default: N(() => [
|
||
L(i, null, {
|
||
header: N(() => [
|
||
ae(e.$slots, "tabs")
|
||
]),
|
||
default: N(() => [
|
||
(w(), V(z(e.cardComponentName), { class: "fs-layout-card-body" }, {
|
||
title: N(() => [
|
||
ee("div", Zu, [
|
||
ae(e.$slots, "actionbar"),
|
||
ae(e.$slots, "toolbar")
|
||
])
|
||
]),
|
||
header: N(() => [
|
||
ee("div", ec, [
|
||
ae(e.$slots, "actionbar"),
|
||
ae(e.$slots, "toolbar")
|
||
])
|
||
]),
|
||
default: N(() => [
|
||
L(i, null, {
|
||
footer: N(() => [
|
||
ee("div", tc, [
|
||
ae(e.$slots, "footer-top"),
|
||
ae(e.$slots, "pagination"),
|
||
ae(e.$slots, "footer-bottom")
|
||
])
|
||
]),
|
||
default: N(() => [
|
||
ae(e.$slots, "default"),
|
||
ae(e.$slots, "table"),
|
||
ae(e.$slots, "form")
|
||
]),
|
||
_: 3
|
||
})
|
||
]),
|
||
_: 3
|
||
}))
|
||
]),
|
||
_: 3
|
||
})
|
||
]),
|
||
_: 3
|
||
});
|
||
}
|
||
const oc = /* @__PURE__ */ Te(Xu, [["render", nc]]);
|
||
function ba(e) {
|
||
return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !Lr(e);
|
||
}
|
||
const rc = /* @__PURE__ */ ue({
|
||
name: "FsButton",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 文字
|
||
*/
|
||
text: {
|
||
type: String,
|
||
default: "",
|
||
required: !1
|
||
},
|
||
/**
|
||
* 图标
|
||
*/
|
||
icon: {
|
||
type: [String, Object, Function],
|
||
default: "",
|
||
required: !1
|
||
},
|
||
/**
|
||
* 右边的图标
|
||
*/
|
||
iconRight: {
|
||
type: [String, Object, Function],
|
||
default: "",
|
||
required: !1
|
||
},
|
||
/**
|
||
* 是否圆形按钮,text需配置为null
|
||
*/
|
||
circle: {
|
||
type: Boolean,
|
||
default: !1,
|
||
required: !1
|
||
},
|
||
/**
|
||
* tooltip配置,为空不显示tooltip
|
||
*/
|
||
tooltip: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* badge配置,为空不显示badge
|
||
* `{count:0,dot:"show"}`
|
||
*/
|
||
badge: {
|
||
type: Object,
|
||
default: null,
|
||
required: !1
|
||
},
|
||
/**
|
||
* x-button的配置,当x-button的配置与fs-button的配置有冲突时可以配置在此处
|
||
* 比如:n-button的text
|
||
*/
|
||
buttonProps: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 自定义的className
|
||
*/
|
||
className: {},
|
||
/**
|
||
* 是否加载中
|
||
*/
|
||
loading: {
|
||
type: Boolean,
|
||
default: void 0,
|
||
required: !1
|
||
}
|
||
},
|
||
emits: ["click"],
|
||
setup(e, t) {
|
||
const {
|
||
ui: n
|
||
} = Ce(), {
|
||
merge: o
|
||
} = $e(), r = K(!1), a = B(() => e.loading ?? r.value ?? !1), i = (f, v = "fs-button-icon") => {
|
||
if (f != null)
|
||
return typeof f == "string" ? L(J("fs-icon"), {
|
||
icon: f,
|
||
class: v
|
||
}, null) : typeof f == "function" ? f() : L(J("fs-icon"), H(f, {
|
||
class: v
|
||
}), null);
|
||
};
|
||
let s = () => {
|
||
const f = e.icon, v = e.iconRight, p = n.type !== "element", y = !p;
|
||
let b;
|
||
const F = {
|
||
...t.slots
|
||
};
|
||
(f && !p && !y || t.slots.default || e.text || v) && (F.default = () => {
|
||
const P = [];
|
||
return f && !p && !y && P.push(i(f)), t.slots.default && P.push(t.slots.default()), e.text && P.push(e.text), v && P.push(i(v, "fs-button-icon-right")), P;
|
||
}), f && (p && !F.icon ? F.icon = () => i(f) : y && !F.icon && (b = i(f)));
|
||
const R = e.circle ? n.button.circle : {}, D = z(n.button.name), A = (P) => {
|
||
P.loadingRef = r, t.emit("click", P);
|
||
}, $ = o({
|
||
...R,
|
||
//icon,
|
||
class: {
|
||
"fs-button": !0,
|
||
"is-thin": !e.text && !t.slots.default
|
||
},
|
||
loading: a.value,
|
||
onClick: A
|
||
}, {
|
||
class: e.className,
|
||
...t.attrs,
|
||
...e.buttonProps
|
||
});
|
||
return b && ($.icon = b), yr(D, $, F);
|
||
};
|
||
const u = s, l = z(n.badge.name);
|
||
if (e.badge && (s = () => {
|
||
let f;
|
||
return L(l, e.badge, ba(f = u()) ? f : {
|
||
default: () => [f]
|
||
});
|
||
}), !e.tooltip)
|
||
return s;
|
||
const c = z(n.tooltip.name), d = B(() => _n(e.tooltip, "slots")), h = n.tooltip.trigger;
|
||
return () => {
|
||
var v;
|
||
const f = {
|
||
...(v = e.tooltip) == null ? void 0 : v.slots,
|
||
[h]: s
|
||
};
|
||
return L(c, d.value, ba(f) ? f : {
|
||
default: () => [f]
|
||
});
|
||
};
|
||
}
|
||
}), ac = /* @__PURE__ */ ue({
|
||
name: "FsIcon",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* icon名称
|
||
*/
|
||
icon: {
|
||
type: String,
|
||
default: void 0,
|
||
require: !0
|
||
},
|
||
baseUrl: {
|
||
type: String,
|
||
default: ""
|
||
}
|
||
},
|
||
setup(e, t) {
|
||
const {
|
||
ui: n
|
||
} = Ce(), o = B(() => {
|
||
var a;
|
||
if (e.icon && ((a = e.icon) == null ? void 0 : a.indexOf(":")) >= 0) {
|
||
if (e.icon.startsWith("http:") || e.icon.startsWith("https:")) {
|
||
let c = null;
|
||
return e.icon.startsWith("http://") || e.icon.startsWith("https://") ? c = e.icon : c = e.baseUrl + e.icon.replace("http:", "").replace("https:", ""), () => L("img", H({
|
||
class: "fs-icon-image",
|
||
src: c
|
||
}, t.attrs), null);
|
||
}
|
||
if (e.icon.startsWith("svg:")) {
|
||
const c = z("FsIconSvg");
|
||
return () => {
|
||
const d = e.icon.replace("svg:", "");
|
||
return L(c, H({
|
||
class: "fs-icon",
|
||
icon: d
|
||
}, t.attrs), null);
|
||
};
|
||
}
|
||
const i = z("FsIconify"), s = e.icon.split(":");
|
||
let u = {}, l = e.icon;
|
||
return s.length >= 3 && (u = {
|
||
color: s[2]
|
||
}, l = s[0] + ":" + s[1]), () => L(i, H({
|
||
class: "fs-icon",
|
||
icon: l,
|
||
style: u
|
||
}, t.attrs), null);
|
||
}
|
||
const r = z(e.icon);
|
||
return typeof r == "string" ? () => L("span", {
|
||
title: "error icon name"
|
||
}, [r]) : n.icon.isComponent ? () => L(r, H({
|
||
class: "fs-icon"
|
||
}, t.attrs), null) : () => L(J("el-icon"), H({
|
||
class: "fs-icon"
|
||
}, t.attrs), {
|
||
default: () => [L(r, null, null)]
|
||
});
|
||
});
|
||
return () => o.value();
|
||
}
|
||
}), ic = ue({
|
||
name: "FsIconify",
|
||
components: { Icon: _s },
|
||
props: {
|
||
/**
|
||
* 图标名称
|
||
*/
|
||
icon: {
|
||
type: String
|
||
},
|
||
/**
|
||
* 旋转
|
||
*/
|
||
spin: {
|
||
type: Boolean,
|
||
default: !1
|
||
}
|
||
},
|
||
setup(e, t) {
|
||
return { iconifyRef: K(null) };
|
||
}
|
||
});
|
||
function sc(e, t, n, o, r, a) {
|
||
const i = J("Icon");
|
||
return w(), j("span", {
|
||
class: _t(["fs-iconify", { "fs-iconify-spin": e.spin }])
|
||
}, [
|
||
L(i, {
|
||
ref: "iconifyRef",
|
||
icon: e.icon,
|
||
inline: !0
|
||
}, null, 8, ["icon"])
|
||
], 2);
|
||
}
|
||
const lc = /* @__PURE__ */ Te(ic, [["render", sc]]), uc = ue({
|
||
name: "FsSvgIcon",
|
||
props: {
|
||
icon: {
|
||
type: String,
|
||
required: !0
|
||
},
|
||
size: {
|
||
type: [Number, String],
|
||
default: 16
|
||
},
|
||
spin: {
|
||
type: Boolean,
|
||
default: !1
|
||
}
|
||
},
|
||
setup(e) {
|
||
const t = B(() => `#${e.icon}`), n = B(() => {
|
||
const { size: o } = e;
|
||
let r = `${o}`;
|
||
return r = `${r.replace("px", "")}px`, {
|
||
width: r,
|
||
height: r
|
||
};
|
||
});
|
||
return { symbolId: t, getStyle: n };
|
||
}
|
||
});
|
||
const cc = {
|
||
class: "fs-icon-svg-content",
|
||
"aria-hidden": "true"
|
||
}, dc = ["xlink:href"];
|
||
function fc(e, t, n, o, r, a) {
|
||
return w(), j("span", {
|
||
class: _t(["fs-icon-svg", e.spin && "fs-icon-spin"])
|
||
}, [
|
||
(w(), j("svg", cc, [
|
||
ee("use", { "xlink:href": e.symbolId }, null, 8, dc)
|
||
]))
|
||
], 2);
|
||
}
|
||
const hc = /* @__PURE__ */ Te(uc, [["render", fc]]), mc = ue({
|
||
name: "FsLabel",
|
||
props: {
|
||
label: {
|
||
type: String,
|
||
default: ""
|
||
},
|
||
labelAttrs: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
contentAttrs: {
|
||
type: Object,
|
||
default: () => ({})
|
||
}
|
||
}
|
||
});
|
||
const pc = { class: "fs-label" };
|
||
function gc(e, t, n, o, r, a) {
|
||
return w(), j("div", pc, [
|
||
ee("div", H({ class: "label" }, e.labelAttrs), [
|
||
St(xe(e.label) + " ", 1),
|
||
ae(e.$slots, "label")
|
||
], 16),
|
||
ee("div", H({ class: "content" }, e.contentAttrs), [
|
||
ae(e.$slots, "default")
|
||
], 16)
|
||
]);
|
||
}
|
||
const vc = /* @__PURE__ */ Te(mc, [["render", gc]]), bc = {
|
||
key: 0,
|
||
class: "fs-loading"
|
||
}, yc = { key: 0 }, wc = ue({
|
||
name: "FsLoading"
|
||
}), _c = /* @__PURE__ */ ue({
|
||
...wc,
|
||
props: {
|
||
loading: { type: Boolean },
|
||
icon: {},
|
||
text: {}
|
||
},
|
||
setup(e) {
|
||
const { ui: t } = Ce();
|
||
return (n, o) => {
|
||
const r = J("fs-icon");
|
||
return n.loading ? (w(), j("div", bc, [
|
||
L(r, {
|
||
class: "fs-icon-spin",
|
||
icon: n.icon ?? q(t).icons.refresh
|
||
}, null, 8, ["icon"]),
|
||
n.text ? (w(), j("span", yc, xe(n.text), 1)) : ne("", !0)
|
||
])) : ne("", !0);
|
||
};
|
||
}
|
||
});
|
||
const Cc = ue({
|
||
name: "FsBox"
|
||
}), Sc = { class: "fs-box" };
|
||
function Fc(e, t, n, o, r, a) {
|
||
return w(), j("div", Sc, [
|
||
ae(e.$slots, "default")
|
||
]);
|
||
}
|
||
const Rc = /* @__PURE__ */ Te(Cc, [["render", Fc]]);
|
||
function Dc(e) {
|
||
return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !Lr(e);
|
||
}
|
||
function ya(e, t) {
|
||
if (e[t] instanceof Array) {
|
||
const n = e[t];
|
||
e[t] = (o) => {
|
||
for (const r of n)
|
||
r(o);
|
||
};
|
||
}
|
||
}
|
||
const kc = ["div", "span", "a", "p", "pre", "li", "ol", "ul"], Oc = /* @__PURE__ */ ue({
|
||
name: "FsComponentRender",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* modelValue
|
||
*/
|
||
modelValue: {},
|
||
/**
|
||
* 组件名称
|
||
*/
|
||
name: {},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 子元素,同slots
|
||
*/
|
||
children: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 事件监听
|
||
*/
|
||
on: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 同 on
|
||
*/
|
||
events: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 上下文scope
|
||
*/
|
||
scope: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* modelValue的属性名
|
||
*/
|
||
vModel: {
|
||
type: [String, Object]
|
||
},
|
||
/**
|
||
* 组件参数,会与attrs合并
|
||
*/
|
||
props: {},
|
||
/**
|
||
* 自定义render
|
||
*/
|
||
render: {},
|
||
/**
|
||
* 当输入框的值上报为undefine时,转为null
|
||
*/
|
||
undefineToNull: {
|
||
type: Boolean,
|
||
default: !0
|
||
}
|
||
},
|
||
emits: ["update:dict", "update:modelValue", "mounted"],
|
||
setup(e, t) {
|
||
const {
|
||
ui: n
|
||
} = Ce(), {
|
||
merge: o
|
||
} = $e();
|
||
Ut("get:scope", () => e.scope), Cn(() => {
|
||
t.emit("mounted", e.scope);
|
||
});
|
||
const r = K(), a = B(() => {
|
||
const f = {
|
||
name: "modelValue",
|
||
trim: !1,
|
||
number: !1,
|
||
transform: void 0
|
||
};
|
||
e.vModel && (typeof e.vModel == "string" ? f.name = e.vModel : o(f, e.vModel));
|
||
const v = e.modelValue ?? (n.type === "antdv" ? void 0 : null), p = "onUpdate:" + f.name, y = {
|
||
ref: r,
|
||
// scope: props.scope,
|
||
// fix element display false bug
|
||
[f.name]: v,
|
||
[p]: (F) => {
|
||
if (F && (f.trim && (F = F.trim()), f.number)) {
|
||
const R = Number(F);
|
||
isNaN(R) || (F = R);
|
||
}
|
||
f.transform && (F = f.transform(F)), F === void 0 && e.undefineToNull && (F = null), t.emit("update:modelValue", F);
|
||
},
|
||
...e.props
|
||
}, b = {
|
||
...e.events,
|
||
...e.on
|
||
};
|
||
return G(b, (F, R) => {
|
||
const D = F;
|
||
R.startsWith("on") || (R = Ha("on_" + R)), y[R] = (A) => D({
|
||
...e.scope,
|
||
$event: A
|
||
});
|
||
}), y;
|
||
}), i = () => {
|
||
const f = {}, v = (p, y) => {
|
||
p instanceof Function ? f[y] = (b) => p({
|
||
...e.scope,
|
||
scope: b
|
||
}) : f[y] = () => p;
|
||
};
|
||
return G(e.children, v), G(e.slots, v), f;
|
||
}, s = B(() => {
|
||
e.name;
|
||
let f = q(e.name) || n.input.name;
|
||
typeof f == "function" && (f = f());
|
||
const v = {
|
||
isAsyncComponent: !1,
|
||
component: f
|
||
};
|
||
let p = v.component;
|
||
return kc.includes(p) || (typeof p == "string" && (p = J(p)), (p == null ? void 0 : p.name) === "AsyncComponentWrapper" && (v.isAsyncComponent = !0)), v.component = p, v;
|
||
}), u = i;
|
||
function l() {
|
||
return s.value.isAsyncComponent ? d() : c();
|
||
}
|
||
function c() {
|
||
return r.value;
|
||
}
|
||
async function d() {
|
||
const f = c();
|
||
return f ?? new Promise((v, p) => {
|
||
h(v, p, 0);
|
||
});
|
||
}
|
||
function h(f, v, p) {
|
||
setTimeout(() => {
|
||
const y = c();
|
||
if (y != null) {
|
||
f(y);
|
||
return;
|
||
}
|
||
if (p++, p > 20) {
|
||
v(new Error("异步组件加载超时"));
|
||
return;
|
||
}
|
||
h(f, v, p);
|
||
}, 200);
|
||
}
|
||
return t.expose({
|
||
props: e,
|
||
getTargetRefSync: c,
|
||
getTargetRef: l,
|
||
getTargetRefAsync: d
|
||
}), () => {
|
||
let f;
|
||
const v = H(a.value, t.attrs);
|
||
return ya(v, "onChange"), ya(v, "onBlur"), e.render ? e.render({
|
||
...e.scope,
|
||
attrs: v
|
||
}) : L(s.value.component, v, Dc(f = u()) ? f : {
|
||
default: () => [f]
|
||
});
|
||
};
|
||
}
|
||
}), $c = /* @__PURE__ */ ue({
|
||
name: "FsSlotRender",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {
|
||
type: Function
|
||
},
|
||
/**
|
||
* 上下文
|
||
*/
|
||
scope: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup(e) {
|
||
return () => e.slots(e.scope);
|
||
}
|
||
}), wi = /* @__PURE__ */ ue({
|
||
name: "FsRender",
|
||
functional: !0,
|
||
props: {
|
||
renderFunc: {
|
||
type: Function
|
||
},
|
||
scope: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup() {
|
||
},
|
||
render() {
|
||
return this.renderFunc(this.scope);
|
||
}
|
||
}), Ec = ue({
|
||
name: "FsForm",
|
||
props: {
|
||
/**
|
||
* 初始表单数据
|
||
**/
|
||
initialForm: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 字段模版
|
||
* {
|
||
* key:{
|
||
* title: "字段名称",
|
||
* component:{
|
||
* name:"组件名称"
|
||
* ...组件参数
|
||
* }
|
||
* }
|
||
* }
|
||
* */
|
||
columns: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 字段分组
|
||
* {
|
||
* type:'xxx', //分组展示类型
|
||
* groups:{ //分组数据
|
||
* groupKey:{ title:'xxx',columns:['fieldKey','fieldKey']}
|
||
* }
|
||
* }
|
||
*/
|
||
group: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 重置表单后的操作
|
||
*/
|
||
doReset: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 点击保存按钮,表单校验前执行操作(async)
|
||
*/
|
||
beforeValidate: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 表单校验完完成后,提交前处理(async)
|
||
*/
|
||
beforeSubmit: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 点击保存按钮时执行操作(async)
|
||
*/
|
||
doSubmit: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 表单提交后处理(async)
|
||
*/
|
||
afterSubmit: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 插槽内容
|
||
*/
|
||
slots: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
/**
|
||
* 布局方式【flex|grid】
|
||
*/
|
||
display: {
|
||
type: String,
|
||
default: "flex"
|
||
// flex
|
||
},
|
||
/**
|
||
* 序号,编辑时会传入
|
||
*/
|
||
index: {
|
||
type: Number,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 模式 [add,edit,view,自定义]
|
||
*/
|
||
mode: {
|
||
type: String,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* a-row配置
|
||
*/
|
||
row: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* el-col|a-col配置,可配置跨列
|
||
*/
|
||
col: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* formItem的公共配置
|
||
*/
|
||
formItem: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* helper位置:{position:'label'}
|
||
*/
|
||
helper: {
|
||
type: Object
|
||
},
|
||
watch: {
|
||
type: Function,
|
||
default: null
|
||
}
|
||
},
|
||
emits: ["reset", "submit", "success", "validationError", "value-change", "init"],
|
||
setup(e, t) {
|
||
var m, C;
|
||
const { merge: n } = $e(), { ui: o } = Ce(), { AsyncComputeValue: r, doComputed: a } = Vt(), i = K(), s = un({}), { proxy: u } = Jo();
|
||
bt(e.columns, (_) => {
|
||
_.value != null && (_.value instanceof r || _.value instanceof tr) && de.warn("form.value配置不支持Compute/AsyncCompute类型的动态计算");
|
||
});
|
||
function l() {
|
||
const _ = {};
|
||
return bt(e.columns, (S, O) => {
|
||
const X = q(S.value);
|
||
X !== void 0 && We(_, O, X);
|
||
}), n(_, dt(e.initialForm)), _;
|
||
}
|
||
const c = l();
|
||
y(c);
|
||
const d = B(() => ({
|
||
row: c,
|
||
form: s,
|
||
index: e.index,
|
||
mode: e.mode || "add",
|
||
attrs: t.attrs,
|
||
getComponentRef: $
|
||
}));
|
||
function h() {
|
||
return d.value;
|
||
}
|
||
const f = B(() => e.columns);
|
||
function v(_) {
|
||
_ != null && bt(e.columns, (S, O) => {
|
||
let X = et(_, O);
|
||
if (S.valueBuilder) {
|
||
const le = S.valueBuilder({
|
||
value: X,
|
||
key: O,
|
||
row: c,
|
||
form: _,
|
||
index: e.index,
|
||
mode: e.mode
|
||
});
|
||
le != null && !(le instanceof Promise) && We(_, O, le);
|
||
}
|
||
});
|
||
}
|
||
function p() {
|
||
return s;
|
||
}
|
||
function y(_, S = {}) {
|
||
if (v(_), S.mergeForm === !1)
|
||
for (const X in s)
|
||
delete s[X];
|
||
n(s, _);
|
||
const { valueChange: O } = S;
|
||
O && G(e.columns, (X, le) => {
|
||
const ie = s[le];
|
||
R(le, ie);
|
||
});
|
||
}
|
||
function b(..._) {
|
||
return n({}, e.col, ..._);
|
||
}
|
||
function F(_) {
|
||
return { key: _.key, ...d.value };
|
||
}
|
||
function R(_, S) {
|
||
const O = { key: _, value: S, formRef: u, ...d.value, immediate: !1 };
|
||
t.emit("value-change", O);
|
||
let X = e.columns[_].valueChange;
|
||
X && (X instanceof Function ? X(O) : X.handle && X.handle(O));
|
||
}
|
||
const D = K({});
|
||
function A(_) {
|
||
return D.value[_].getFormItemRef();
|
||
}
|
||
function $(_, S = !1) {
|
||
var O;
|
||
return (O = A(_)) == null ? void 0 : O.getComponentRef(S);
|
||
}
|
||
const P = K([]);
|
||
G((m = e.group) == null ? void 0 : m.groups, (_, S) => {
|
||
_.collapsed !== !0 && P.value.push(S);
|
||
}), ((C = e.group) == null ? void 0 : C.groupType) === "tabs" && (P.value = P.value.length > 0 ? P.value[0] : null);
|
||
const W = a(
|
||
() => e.group,
|
||
h,
|
||
null,
|
||
(_ = {}) => {
|
||
const S = {};
|
||
G(_ == null ? void 0 : _.groups, (le, ie) => {
|
||
G(le.columns, (fe) => {
|
||
if (f.value[fe] == null) {
|
||
an.logger.warn("无效的分组字段:" + fe);
|
||
return;
|
||
}
|
||
S[fe] = ie;
|
||
});
|
||
});
|
||
const O = _.groupType;
|
||
let X = {
|
||
parent: o.collapse.name,
|
||
child: o.collapseItem.name
|
||
};
|
||
return O === "tabs" && (X.parent = o.tabs.name, X.child = o.tabPane.name), n(
|
||
{
|
||
wrapper: X,
|
||
groupedKeys: S
|
||
},
|
||
_
|
||
);
|
||
}
|
||
), k = B(() => {
|
||
const _ = [];
|
||
return G(f.value, (S, O) => {
|
||
var le, ie;
|
||
const X = dt(e.formItem || {});
|
||
S = n(X, S), S.key = O, S.order == null && (S.order = cn.orderDefault), (((le = W.value) == null ? void 0 : le.groupedKeys) == null || ((ie = W.value) == null ? void 0 : ie.groupedKeys[O]) == null) && _.push(S), S.col = b(S.col);
|
||
}), _.sort((S, O) => S.order - O.order), _;
|
||
});
|
||
function Y() {
|
||
return i.value;
|
||
}
|
||
async function ce() {
|
||
const _ = l(), S = Wr(s);
|
||
for (const O of S) {
|
||
const X = et(_, O[0]);
|
||
X == null ? xo(s, O[0]) : We(s, O[0], X);
|
||
}
|
||
e.doReset && await e.doReset(d.value), t.emit("reset");
|
||
}
|
||
const E = K(), M = K({});
|
||
function I(_) {
|
||
var S, O;
|
||
if ((S = W.value) != null && S.groupedKeys)
|
||
for (let X in _) {
|
||
const le = (O = W.value) == null ? void 0 : O.groupedKeys[X];
|
||
le != null && (_["group." + le] = !0);
|
||
}
|
||
}
|
||
async function T() {
|
||
const _ = { ...d.value, form: s };
|
||
if (_.mode !== "view") {
|
||
if (e.beforeValidate && await e.beforeValidate(_) === !1)
|
||
return !1;
|
||
try {
|
||
M.value = {}, await o.form.validateWrap(i.value), E.value = !0;
|
||
} catch (S) {
|
||
E.value = !1;
|
||
const O = o.form.transformValidateErrors(S);
|
||
throw I(O), M.value = O, t.emit("validationError", d.value), S;
|
||
}
|
||
}
|
||
}
|
||
async function x() {
|
||
await T();
|
||
const _ = dt(Hn(s)), S = { ...d.value, form: _ };
|
||
if (de.debug("form submit", JSON.stringify(s)), bt(e.columns, (O, X) => {
|
||
let le = et(_, X);
|
||
if (O.valueResolve) {
|
||
const ie = O.valueResolve({
|
||
value: le,
|
||
key: X,
|
||
...S
|
||
});
|
||
ie != null && !(ie instanceof Promise) && We(_, X, ie);
|
||
}
|
||
}), e.beforeSubmit && await e.beforeSubmit(S) === !1)
|
||
return !1;
|
||
if (bt(e.columns, (O, X) => {
|
||
O.submit === !1 ? xo(_, X) : O.submit === !0 && We(_, X, _[X]);
|
||
}), e.doSubmit) {
|
||
const O = await e.doSubmit(S);
|
||
if (S.res = O, O === !1)
|
||
return !1;
|
||
}
|
||
return t.emit("submit", S), e.afterSubmit && await e.afterSubmit(S) === !1 ? !1 : (t.emit("success", S), S);
|
||
}
|
||
Cn(() => {
|
||
G(f.value, (_, S) => {
|
||
if (_.valueChange == null)
|
||
return;
|
||
let O = _.valueChange;
|
||
if (O && O.immediate === !0 && O.handle) {
|
||
const X = { key: S, value: s[S], formRef: u, ...d.value, immediate: !0 };
|
||
O.handle && O.handle(X);
|
||
}
|
||
});
|
||
});
|
||
function Q(_) {
|
||
return !!(_ && q(_.show) !== !1);
|
||
}
|
||
function oe(_) {
|
||
if (!_.columns || q(_.show) === !1)
|
||
return !1;
|
||
for (let S of _.columns) {
|
||
if (f.value[S] == null)
|
||
continue;
|
||
if (Q(f.value[S]))
|
||
return !0;
|
||
}
|
||
return !1;
|
||
}
|
||
e.watch && lt(
|
||
() => s,
|
||
(_, S) => {
|
||
e.watch && e.watch(d.value);
|
||
},
|
||
{
|
||
deep: !0,
|
||
immediate: !0
|
||
}
|
||
);
|
||
function ye() {
|
||
const _ = JSON.stringify(c), S = JSON.stringify(s);
|
||
return _ !== S;
|
||
}
|
||
const re = B(() => n({}, e.slots, t.slots));
|
||
return t.emit("init", d.value), {
|
||
get: (_, S) => et(_, S),
|
||
set: (_, S, O) => {
|
||
We(_, S, O), R(S, O);
|
||
},
|
||
ui: o,
|
||
validRef: E,
|
||
errorsRef: M,
|
||
formRef: i,
|
||
computedColumns: f,
|
||
computedDefaultColumns: k,
|
||
submit: x,
|
||
reset: ce,
|
||
getFormRef: Y,
|
||
scope: d,
|
||
buildItemScope: F,
|
||
groupActiveKey: P,
|
||
form: s,
|
||
formItemRefs: D,
|
||
getFormData: p,
|
||
setFormData: y,
|
||
getComponentRef: $,
|
||
mergeCol: b,
|
||
validate: T,
|
||
computedGroup: W,
|
||
getContextFn: h,
|
||
formItemShow: Q,
|
||
groupItemShow: oe,
|
||
isDirty: ye,
|
||
mergedSlots: re
|
||
};
|
||
}
|
||
});
|
||
function Tc(e, t, n, o, r, a) {
|
||
const i = J("fs-form-item-col"), s = J("fs-render");
|
||
return w(), V(z(e.ui.form.name), {
|
||
ref: "formRef",
|
||
class: _t(["fs-form", {
|
||
"fs-form-grid": e.display === "grid",
|
||
"fs-form-flex": e.display === "flex",
|
||
"fs-form-invalid": e.validRef === !1
|
||
}]),
|
||
onsubmit: "event.preventDefault();",
|
||
model: e.form
|
||
}, {
|
||
default: N(() => [
|
||
(w(), V(z(e.ui.row.name), H({ class: "fs-row" }, e.row), {
|
||
default: N(() => [
|
||
(w(!0), j(we, null, Ee(e.computedDefaultColumns, (u) => (w(), V(i, {
|
||
key: u == null ? void 0 : u.key,
|
||
ref_for: !0,
|
||
ref: (l) => {
|
||
l && (e.formItemRefs[u.key] = l);
|
||
},
|
||
col: e.mergeCol(u.col),
|
||
item: u,
|
||
helper: e.helper,
|
||
"model-value": e.get(e.form, u.key),
|
||
slots: e.mergedSlots["form_" + u.key],
|
||
"get-context-fn": e.getContextFn,
|
||
"onUpdate:modelValue": (l) => e.set(e.form, u.key, l)
|
||
}, null, 8, ["col", "item", "helper", "model-value", "slots", "get-context-fn", "onUpdate:modelValue"]))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16)),
|
||
e.computedGroup.wrapper ? (w(), V(z(e.computedGroup.wrapper.parent), H({
|
||
key: 0,
|
||
[e.ui.collapse.modelValue]: e.groupActiveKey,
|
||
["onUpdate:" + e.ui.collapse.modelValue]: t[0] || (t[0] = (u) => e.groupActiveKey = u),
|
||
style: { width: "100%" }
|
||
}, e.computedGroup), {
|
||
default: N(() => [
|
||
(w(!0), j(we, null, Ee(e.computedGroup.groups, (u, l) => (w(), j(we, { key: l }, [
|
||
e.groupItemShow(u) ? (w(), V(z(e.computedGroup.wrapper.child), H({
|
||
key: 0,
|
||
[e.ui.collapse.keyName || ""]: l
|
||
}, { ref_for: !0 }, u, {
|
||
class: { "fs-form-group-error": e.errorsRef["group." + l] }
|
||
}), qr({
|
||
default: N(() => [
|
||
(w(), V(z(e.ui.row.name), H({ class: "fs-row" }, { ref_for: !0 }, e.row), {
|
||
default: N(() => [
|
||
(w(!0), j(we, null, Ee(u.columns, (c) => (w(), j(we, { key: c }, [
|
||
e.computedColumns[c] ? (w(), V(i, {
|
||
key: 0,
|
||
ref_for: !0,
|
||
ref: (d) => {
|
||
d && (e.formItemRefs[c] = d);
|
||
},
|
||
col: e.mergeCol(e.computedColumns[c].col),
|
||
item: e.computedColumns[c],
|
||
"model-value": e.get(e.form, c),
|
||
slots: e.mergedSlots["form_" + c],
|
||
"get-context-fn": e.getContextFn,
|
||
helper: e.helper,
|
||
"onUpdate:modelValue": (d) => e.set(e.form, c, d)
|
||
}, null, 8, ["col", "item", "model-value", "slots", "get-context-fn", "helper", "onUpdate:modelValue"])) : ne("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 2
|
||
}, 1040))
|
||
]),
|
||
_: 2
|
||
}, [
|
||
Ee(u.slots, (c, d) => ({
|
||
name: d,
|
||
fn: N((h) => [
|
||
L(s, {
|
||
"render-func": c,
|
||
scope: { ...h, hasError: e.errorsRef["group." + l] }
|
||
}, null, 8, ["render-func", "scope"])
|
||
])
|
||
}))
|
||
]), 1040, ["class"])) : ne("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16)) : ne("", !0)
|
||
]),
|
||
_: 1
|
||
}, 8, ["class", "model"]);
|
||
}
|
||
const Ic = /* @__PURE__ */ Te(Ec, [["render", Tc]]), Ac = ue({
|
||
name: "FsFormItem",
|
||
components: { FsRender: wi },
|
||
props: {
|
||
/**
|
||
* 表单字段值(v-model)
|
||
*/
|
||
modelValue: {},
|
||
/**
|
||
* 字段配置
|
||
*/
|
||
item: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 字段组件插槽
|
||
*/
|
||
formSlot: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
getContextFn: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
helper: {
|
||
type: [String, Object]
|
||
}
|
||
},
|
||
emits: ["update:modelValue"],
|
||
setup(e, t) {
|
||
const { ui: n } = Ce(), { merge: o } = $e(), r = K(), a = () => {
|
||
const p = e.getContextFn ? e.getContextFn() : {};
|
||
return { value: e.modelValue, key: e.item.key, ...p };
|
||
};
|
||
function i(p) {
|
||
t.emit("update:modelValue", p);
|
||
}
|
||
function s(p = !1) {
|
||
var y, b;
|
||
return p ? (y = r.value) == null ? void 0 : y.getTargetRefAsync() : (b = r.value) == null ? void 0 : b.getTargetRef();
|
||
}
|
||
const u = B(() => {
|
||
const p = {
|
||
...e.item
|
||
};
|
||
return delete p.title, delete p.label, p;
|
||
}), l = B(() => {
|
||
var p, y, b;
|
||
return ((y = (p = e.item) == null ? void 0 : p.helper) == null ? void 0 : y.position) || ((b = e.helper) == null ? void 0 : b.position);
|
||
}), c = B(() => {
|
||
var p, y;
|
||
return o({}, (p = e.item.helper) == null ? void 0 : p.tooltip, (y = e.helper) == null ? void 0 : y.tooltip);
|
||
}), d = B(() => {
|
||
if (e.item != null)
|
||
return e.item.key.indexOf(".") >= 0 ? e.item.key.split(".") : e.item.key;
|
||
}), h = B(() => e.item.label || e.item.title), f = B(() => h.value instanceof Function);
|
||
return {
|
||
ui: n,
|
||
updateModelValue: i,
|
||
scopeFunc: a,
|
||
getComponentRef: s,
|
||
componentRenderRef: r,
|
||
computedHelperPosition: l,
|
||
computedHelperTooltip: c,
|
||
computedKey: d,
|
||
computedLabelIsRender: f,
|
||
computedLabel: h,
|
||
computedLabelRender: () => h.value(a()),
|
||
computedItem: u
|
||
};
|
||
}
|
||
});
|
||
const Vc = {
|
||
key: 0,
|
||
class: "fs-form-item-label-text"
|
||
}, Pc = ["title"], Mc = { class: "fs-form-helper-tooltip" }, Bc = { class: "fs-form-item-label-icon" }, jc = { class: "fs-form-item-content" }, Nc = { class: "fs-form-item-render" }, xc = { class: "fs-form-item-component" };
|
||
function Lc(e, t, n, o, r, a) {
|
||
const i = J("fs-render"), s = J("fs-form-helper"), u = J("fs-icon"), l = J("fs-slot-render"), c = J("fs-component-render");
|
||
return e.computedItem ? (w(), V(z(e.ui.formItem.name), H({
|
||
key: 0,
|
||
class: "fs-form-item",
|
||
[e.ui.formItem.prop || ""]: e.computedKey
|
||
}, e.computedItem, {
|
||
path: e.computedItem.key,
|
||
"rule-path": e.computedItem.key
|
||
}), {
|
||
label: N(() => [
|
||
e.computedLabelIsRender ? (w(), j("span", Vc, [
|
||
L(i, { "render-func": e.computedLabelRender }, null, 8, ["render-func"])
|
||
])) : (w(), j("span", {
|
||
key: 1,
|
||
class: "fs-form-item-label-text",
|
||
title: e.computedLabel
|
||
}, xe(e.computedLabel), 9, Pc)),
|
||
e.computedItem.helper && e.computedHelperPosition === "label" ? (w(), V(z(e.ui.tooltip.name), Be(H({ key: 2 }, e.computedHelperTooltip)), {
|
||
[e.ui.tooltip.content]: N(() => [
|
||
ee("span", Mc, [
|
||
L(s, {
|
||
helper: e.computedItem.helper,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["helper", "scope"])
|
||
])
|
||
]),
|
||
[e.ui.tooltip.trigger]: N(() => [
|
||
ee("span", Bc, [
|
||
L(u, {
|
||
class: "fs-form-item-label-icon-inner",
|
||
icon: e.ui.icons.question
|
||
}, null, 8, ["icon"])
|
||
])
|
||
]),
|
||
_: 2
|
||
}, 1040)) : ne("", !0)
|
||
]),
|
||
default: N(() => {
|
||
var d;
|
||
return [
|
||
ee("div", jc, [
|
||
e.computedItem.topRender ? (w(), V(i, {
|
||
key: 0,
|
||
"render-func": e.computedItem.topRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : ne("", !0),
|
||
ee("div", Nc, [
|
||
e.computedItem.prefixRender ? (w(), V(i, {
|
||
key: 0,
|
||
"render-func": e.computedItem.prefixRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : ne("", !0),
|
||
ee("div", xc, [
|
||
e.formSlot ? (w(), V(l, {
|
||
key: 0,
|
||
slots: e.formSlot,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["slots", "scope"])) : ((d = e.computedItem.component) == null ? void 0 : d.show) !== !1 ? (w(), j(we, { key: 1 }, [
|
||
e.computedItem.conditionalRender && e.computedItem.conditionalRender.match && e.computedItem.conditionalRender.match(e.scopeFunc()) ? (w(), V(i, {
|
||
key: 0,
|
||
"render-func": e.computedItem.conditionalRender.render,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : e.computedItem.render ? (w(), V(i, {
|
||
key: 1,
|
||
"render-func": e.computedItem.render,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : (w(), V(c, H({
|
||
key: 2,
|
||
ref: "componentRenderRef"
|
||
}, e.computedItem.component, {
|
||
"model-value": e.modelValue,
|
||
scope: e.scopeFunc(),
|
||
"onUpdate:modelValue": e.updateModelValue
|
||
}), null, 16, ["model-value", "scope", "onUpdate:modelValue"]))
|
||
], 64)) : ne("", !0)
|
||
]),
|
||
e.computedItem.suffixRender ? (w(), V(i, {
|
||
key: 1,
|
||
"render-func": e.computedItem.suffixRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : ne("", !0)
|
||
]),
|
||
e.computedItem.bottomRender ? (w(), V(i, {
|
||
key: 1,
|
||
"render-func": e.computedItem.bottomRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : ne("", !0),
|
||
e.computedItem.helper && e.computedHelperPosition !== "label" ? (w(), V(s, {
|
||
key: 2,
|
||
helper: e.computedItem.helper,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["helper", "scope"])) : ne("", !0)
|
||
])
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 16, ["path", "rule-path"])) : ne("", !0);
|
||
}
|
||
const qc = /* @__PURE__ */ Te(Ac, [["render", Lc]]), Hc = /* @__PURE__ */ ue({
|
||
__name: "fs-form-item-col",
|
||
props: {
|
||
/**
|
||
* 字段配置
|
||
*/
|
||
item: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 字段组件插槽
|
||
*/
|
||
slots: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
getContextFn: {
|
||
type: Function,
|
||
default: void 0
|
||
},
|
||
col: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
helper: {
|
||
type: [String, Object],
|
||
default: void 0
|
||
}
|
||
},
|
||
setup(e, { expose: t }) {
|
||
const { ui: n } = Ce(), o = e, { doComputed: r } = Vt(), a = r(
|
||
() => o.item,
|
||
() => o.getContextFn()
|
||
), { merge: i } = $e(), s = Qo(), u = K();
|
||
function l() {
|
||
return u.value;
|
||
}
|
||
return t({
|
||
getFormItemRef: l
|
||
}), (c, d) => {
|
||
var f;
|
||
const h = J("fs-form-item");
|
||
return q(a) && q(a).show !== !1 ? (w(), V(z(q(n).col.name), H({
|
||
key: 0,
|
||
class: "fs-col"
|
||
}, q(i)(e.col, (f = q(a)) == null ? void 0 : f.col)), {
|
||
default: N(() => {
|
||
var v;
|
||
return [
|
||
q(a) && ((v = q(a)) == null ? void 0 : v.blank) !== !0 ? (w(), V(h, H({
|
||
key: 0,
|
||
ref_key: "formItemRef",
|
||
ref: u,
|
||
item: q(a),
|
||
"form-slot": e.slots,
|
||
"get-context-fn": e.getContextFn,
|
||
helper: e.helper
|
||
}, q(s)), null, 16, ["item", "form-slot", "get-context-fn", "helper"])) : ne("", !0)
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 16)) : ne("", !0);
|
||
};
|
||
}
|
||
});
|
||
const zc = ue({
|
||
name: "FsFormHelper",
|
||
props: {
|
||
/**
|
||
* 帮助说明, text: 说明文字, render: function(scope) 自定义渲染
|
||
*/
|
||
helper: {
|
||
type: [
|
||
/**
|
||
* text: 说明文字,
|
||
* render: function , 自定义render
|
||
*/
|
||
Object,
|
||
/**
|
||
* 说明文本
|
||
*/
|
||
String
|
||
]
|
||
},
|
||
scope: {}
|
||
},
|
||
setup(e) {
|
||
}
|
||
});
|
||
const Wc = { class: "fs-form-helper" }, Uc = { key: 0 }, Kc = { key: 2 };
|
||
function Yc(e, t, n, o, r, a) {
|
||
const i = J("fs-render");
|
||
return w(), j("div", Wc, [
|
||
typeof e.helper == "string" ? (w(), j("pre", Uc, xe(e.helper), 1)) : e.helper.render ? (w(), V(i, {
|
||
key: 1,
|
||
"render-func": e.helper.render,
|
||
scope: e.scope
|
||
}, null, 8, ["render-func", "scope"])) : e.helper.text ? (w(), j("pre", Kc, xe(e.helper.text), 1)) : ne("", !0)
|
||
]);
|
||
}
|
||
const Gc = /* @__PURE__ */ Te(zc, [["render", Yc]]);
|
||
function Xc(e) {
|
||
return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !Lr(e);
|
||
}
|
||
const ao = /* @__PURE__ */ ue({
|
||
name: "FsFormWrapper",
|
||
props: {
|
||
/**
|
||
* 表单配置
|
||
* {
|
||
* wrapper:{ //表单包装配置
|
||
* is: 'el-dialog'//el-dialog|a-modal|el-drawer|a-drawer,
|
||
* draggable: false, //是否支持拖动
|
||
* inner:false //是否在页面内部打开
|
||
* }
|
||
* ...FsForm配置
|
||
* }
|
||
*/
|
||
options: {},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {},
|
||
/**
|
||
* 是否在内部打开对话框
|
||
*/
|
||
inner: {},
|
||
/**
|
||
* 内部打开对话框的wrapper
|
||
*/
|
||
innerWrapper: {},
|
||
id: {},
|
||
zIndex: {}
|
||
},
|
||
emits: ["reset", "submit", "validationError", "value-change", "open", "opened", "mounted", "closed", "inner-change"],
|
||
setup(e, t) {
|
||
var Qe;
|
||
const {
|
||
t: n
|
||
} = ut(), {
|
||
merge: o
|
||
} = $e(), r = K(!1), a = K(), i = K(), s = K(), u = K(), l = K(), c = K(!1), d = K(), h = K(), f = K(), v = K(), p = e.id || Math.floor(Math.random() * 1e6) + "", y = "fs-form-wrapper_" + p, b = K({});
|
||
function F(Z = {}) {
|
||
var ge;
|
||
return {
|
||
formWrapperId: p,
|
||
formWrapperIdClass: y,
|
||
close: M,
|
||
doClose: I,
|
||
onClosed: T,
|
||
onOpened: x,
|
||
open: R,
|
||
title: v,
|
||
fullscreenEnabled: le,
|
||
fullscreen: X,
|
||
formWrapperIs: a,
|
||
formWrapperOpen: r,
|
||
formWrapperBind: s,
|
||
computedButtons: O,
|
||
onValueChange: Q,
|
||
innerBind: Se,
|
||
formWrapperSlots: b,
|
||
wrapper: s.value,
|
||
options: i.value,
|
||
formRef: l.value,
|
||
form: re(),
|
||
wrapperBindRef: s,
|
||
formOptionsRef: i,
|
||
setFormData: m,
|
||
getFormData: re,
|
||
reset: ye,
|
||
loading: c,
|
||
toggleFullscreen: ie,
|
||
submit: oe,
|
||
mode: (ge = i.value) == null ? void 0 : ge.mode,
|
||
...Z
|
||
};
|
||
}
|
||
const R = async (Z) => {
|
||
var Ge, zt;
|
||
const {
|
||
wrapper: ge
|
||
} = Z;
|
||
ge.onOpen && ge.onOpen(Z), v.value = q(ge.title), a.value = Z.wrapper.is, u.value = ge, i.value = {
|
||
..._n(Z, "wrapper", "slots"),
|
||
slots: {
|
||
...e.slots,
|
||
...Z.slots,
|
||
...t.slots
|
||
}
|
||
};
|
||
const Oe = fe.formWrapper.customClass(a.value), Fe = `fs-form-wrapper fs-form-wrapper-${(Ge = i.value) == null ? void 0 : Ge.mode} ${y} ${ge[Oe] || ""} `;
|
||
return s.value = {
|
||
..._n(ge, "title", "onOpen", "onClosed", "onOpened", "is", "inner", "beforeClose"),
|
||
[Oe]: Fe
|
||
}, b.value = {
|
||
...e.slots,
|
||
...(zt = Z.wrapper) == null ? void 0 : zt.slots,
|
||
...t.slots
|
||
}, t.emit("open", F()), d.value = () => {
|
||
ge.onClosed && ge.onClosed(F());
|
||
}, h.value = () => {
|
||
ge.onOpened && ge.onOpened(F());
|
||
}, f.value = ge.beforeClose, ge.fullscreen != null && (X.value = ge.fullscreen), t.emit("inner-change", !!u.value.inner), await Me(), r.value = !0, await Me(), x(), F();
|
||
};
|
||
async function D() {
|
||
var Oe;
|
||
const Z = u.value.saveRemind;
|
||
if (((Oe = l.value) == null ? void 0 : Oe.isDirty()) && Z) {
|
||
let Fe = !1;
|
||
if (Z instanceof Function)
|
||
Fe = await Z();
|
||
else
|
||
try {
|
||
await fe.messageBox.confirm({
|
||
title: n("fs.form.saveRemind.title"),
|
||
message: n("fs.form.saveRemind.content"),
|
||
confirmButtonText: n("fs.form.saveRemind.ok"),
|
||
cancelButtonText: n("fs.form.saveRemind.cancel")
|
||
}), Fe = !0;
|
||
} catch {
|
||
Fe = !1;
|
||
}
|
||
Fe && await oe();
|
||
}
|
||
}
|
||
const A = Ka();
|
||
let $ = null;
|
||
function P() {
|
||
return u.value.saveDraft ? ($ == null && ($ = new Yr({
|
||
$router: A,
|
||
tableName: "addFormDraft",
|
||
keyType: e.id || "0"
|
||
})), $) : null;
|
||
}
|
||
async function W() {
|
||
var Fe;
|
||
const Z = u.value.saveDraft, ge = (Fe = l.value) == null ? void 0 : Fe.isDirty(), Oe = i.value.mode == "add";
|
||
return ge && Z && Oe ? (await P().updateTableValue(re()), !0) : !1;
|
||
}
|
||
async function k() {
|
||
const Z = P();
|
||
Z && await Z.clearTableValue();
|
||
}
|
||
async function Y() {
|
||
const Z = P();
|
||
if (Z) {
|
||
const ge = await Z.getTableValue();
|
||
ge && m(ge, {
|
||
mergeForm: !0
|
||
});
|
||
}
|
||
}
|
||
async function ce() {
|
||
let Z = !1;
|
||
return u.value.saveDraft && (Z = await W()), f.value && f.value(F()) == !1 ? !1 : (Z || await D(), !0);
|
||
}
|
||
const E = B(() => fe.type == "element" ? {
|
||
beforeClose: (Z) => {
|
||
I();
|
||
}
|
||
} : {}), M = async () => {
|
||
r.value = !1;
|
||
}, I = async () => await ce() == !1 ? !1 : (M(), !0), T = () => {
|
||
d.value && d.value(), t.emit("closed"), i.value = null;
|
||
}, x = () => {
|
||
if (u.value.saveDraft && Y(), t.emit("opened"), h.value && h.value(), s.value.draggable || s.value.dragenabled) {
|
||
const {
|
||
dragModal: Z
|
||
} = Au();
|
||
Z({
|
||
getModal: () => document.querySelector(`.${y}`)
|
||
});
|
||
}
|
||
}, Q = (Z) => {
|
||
t.emit("value-change", Z);
|
||
};
|
||
async function oe() {
|
||
c.value = !0;
|
||
try {
|
||
if (await l.value.submit() === !1)
|
||
return;
|
||
await k(), M();
|
||
} finally {
|
||
c.value = !1;
|
||
}
|
||
}
|
||
async function ye() {
|
||
await l.value.reset();
|
||
}
|
||
function re() {
|
||
var Z;
|
||
return (Z = l.value) == null ? void 0 : Z.getFormData();
|
||
}
|
||
function m(Z, ge) {
|
||
var Oe;
|
||
(Oe = l.value) == null || Oe.setFormData(Z, ge);
|
||
}
|
||
const {
|
||
doComputed: C
|
||
} = Vt();
|
||
function _() {
|
||
var Z, ge, Oe;
|
||
return {
|
||
row: (Z = i.value) == null ? void 0 : Z.initialForm,
|
||
form: re(),
|
||
index: (ge = i.value) == null ? void 0 : ge.index,
|
||
mode: (Oe = i.value) == null ? void 0 : Oe.mode,
|
||
attrs: i.value,
|
||
getComponentRef(...Fe) {
|
||
var Ge;
|
||
(Ge = l.value) == null || Ge.getComponentRef(...Fe);
|
||
}
|
||
};
|
||
}
|
||
const S = C(() => {
|
||
var Z;
|
||
return (Z = s.value) == null ? void 0 : Z.buttons;
|
||
}, _), O = B(() => {
|
||
const Z = {
|
||
cancel: {},
|
||
reset: {},
|
||
ok: {
|
||
loading: c.value
|
||
}
|
||
}, ge = o(Z, S.value), Oe = [];
|
||
return G(ge, (Fe, Ge) => {
|
||
Fe.key = Ge, Oe.push(Fe), Fe.onClick == null && Fe.click != null && (Fe.onClick = (zt) => {
|
||
Fe.click(F({
|
||
loadingRef: zt == null ? void 0 : zt.loadingRef
|
||
}));
|
||
});
|
||
}), Sn(Oe, (Fe) => Fe.order ?? cn.orderDefault);
|
||
});
|
||
Cn(async () => {
|
||
e.options != null && await R(e.options), t.emit("mounted", Jo().exposed);
|
||
});
|
||
const X = K(!1), le = B(() => {
|
||
var Z;
|
||
return !((Z = a.value) != null && Z.endsWith("drawer"));
|
||
});
|
||
function ie() {
|
||
X.value = !X.value;
|
||
}
|
||
const fe = Le.get(), Se = B(() => u.value.inner ? fe.formWrapper.buildInnerBind({
|
||
getInnerWrapper() {
|
||
if (u.value.innerContainerSelector) {
|
||
const Z = document.querySelector(u.value.innerContainerSelector);
|
||
if (Z)
|
||
return Z.classList.add("fs-form-inner-wrapper"), Z;
|
||
console.error(`找不到选择器为${u.value.innerContainerSelector}的元素`);
|
||
}
|
||
return e.innerWrapper;
|
||
}
|
||
}) : {});
|
||
t.expose({
|
||
formWrapperId: p,
|
||
formWrapperIdClass: y,
|
||
close: M,
|
||
doClose: I,
|
||
onClosed: T,
|
||
onOpened: x,
|
||
open: R,
|
||
title: v,
|
||
fullscreenEnabled: le,
|
||
fullscreen: X,
|
||
toggleFullscreen: ie,
|
||
formOptions: i,
|
||
formWrapperIs: a,
|
||
formWrapperOpen: r,
|
||
formWrapperBind: s,
|
||
formRef: l,
|
||
submit: oe,
|
||
reset: ye,
|
||
computedButtons: O,
|
||
loading: c,
|
||
getFormData: re,
|
||
setFormData: m,
|
||
onValueChange: Q,
|
||
innerBind: Se,
|
||
formWrapperSlots: b,
|
||
form: re(),
|
||
wrapperBindRef: s,
|
||
formOptionsRef: i,
|
||
mode: (Qe = i.value) == null ? void 0 : Qe.mode
|
||
});
|
||
const qe = Hr();
|
||
return () => {
|
||
if (!s.value)
|
||
return null;
|
||
const Z = Le.get();
|
||
let ge = {};
|
||
const Oe = {
|
||
...qe,
|
||
...b.value
|
||
}, Fe = (Pt, fn, rt = Oe) => rt[Pt] ? rt[Pt](fn) : null, Ge = a.value || "el-dialog";
|
||
if (i.value) {
|
||
const {
|
||
index: Pt,
|
||
mode: fn
|
||
} = i.value || {}, rt = {
|
||
_self: this,
|
||
index: Pt,
|
||
mode: fn,
|
||
getFormData: re
|
||
};
|
||
ge = {
|
||
[Z.formWrapper.titleSlotName]: () => {
|
||
let qn = null;
|
||
return le.value && (qn = L(J("fs-icon"), {
|
||
class: "fs-fullscreen-icon",
|
||
onClick: ie,
|
||
icon: X.value ? Z.icons.fullScreen : Z.icons.unFullScreen
|
||
}, null)), L("div", {
|
||
class: "fs-form-header"
|
||
}, [L("div", {
|
||
class: "fs-form-header-left"
|
||
}, [Fe("form-header-left", rt), v.value, Fe("form-header-right", rt)]), L("div", {
|
||
class: "fs-form-header-action"
|
||
}, [Fe("form-header-action-left", rt), qn, Fe("form-header-action-right", rt)])]);
|
||
},
|
||
default: () => {
|
||
const qn = [];
|
||
return G(O.value, (la) => {
|
||
la.show !== !1 && qn.push(L(J("fs-button"), la, null));
|
||
}), L("div", {
|
||
class: "fs-form-wrapper-body"
|
||
}, [L("div", {
|
||
class: "fs-form-body"
|
||
}, [Fe("form-body-top", rt), L("div", {
|
||
class: "fs-form-content"
|
||
}, [Fe("form-body-left", rt), L(J("fs-form"), H({
|
||
ref: l
|
||
}, i.value, {
|
||
onValueChange: Q
|
||
}), null), Fe("form-body-right", rt)]), Fe("form-body-bottom", rt)]), L("div", {
|
||
class: "fs-form-footer-btns"
|
||
}, [Fe("form-footer-left", rt), qn, Fe("form-footer-right", rt)])]);
|
||
}
|
||
};
|
||
}
|
||
if (Z.formWrapper.hasContentWrap) {
|
||
const Pt = Z.formWrapper.hasContentWrap(Ge), fn = ge;
|
||
if (Pt) {
|
||
const rt = z(Pt);
|
||
ge = {
|
||
default: () => L(rt, H({
|
||
closable: !0
|
||
}, u.value.contentProps), Xc(fn) ? fn : {
|
||
default: () => [fn]
|
||
})
|
||
};
|
||
}
|
||
}
|
||
const zt = Z.formWrapper.visible, Ki = {
|
||
[zt]: r.value,
|
||
["onUpdate:" + zt]: async (Pt) => {
|
||
if (Pt === !1 && r.value)
|
||
return await I();
|
||
r.value = Pt;
|
||
}
|
||
}, Yi = Z.formWrapper.buildOnClosedBind(Ge, T), sa = Z.formWrapper.customClass(Ge), Gi = `${X.value ? "fs-fullscreen" : ""} ${s.value[sa] || ""}`, Xi = {
|
||
[sa]: Gi
|
||
}, Ji = {
|
||
fullscreen: X.value
|
||
}, Qi = {
|
||
zIndex: s.value.zIndex || e.zIndex
|
||
}, Zi = z(Ge);
|
||
return L(Zi, H(s.value, Xi, Ki, Yi, Ji, Se.value, Qi, E.value), ge);
|
||
};
|
||
}
|
||
}), Jc = ue({
|
||
name: "FsFormProvider"
|
||
}), Qc = /* @__PURE__ */ ue({
|
||
...Jc,
|
||
setup(e) {
|
||
const t = K({}), n = K({});
|
||
return Ut("get:form:wrapper:context", (o) => n.value[o]), Ut("use:form:wrapper", () => ({
|
||
setContext(o, r) {
|
||
n.value[o] = r;
|
||
},
|
||
open(o) {
|
||
const r = o.id || Math.floor(Math.random() * 1e6) + "";
|
||
return new Promise((a, i) => {
|
||
t.value[r] = {
|
||
id: r,
|
||
// zIndex: getMaxZIndex() + 1,
|
||
async onMounted(s) {
|
||
await s.open(o), a(s);
|
||
},
|
||
onClosed() {
|
||
o.id || delete t.value[r];
|
||
}
|
||
};
|
||
});
|
||
}
|
||
})), (o, r) => (w(), j(we, null, [
|
||
ae(o.$slots, "default"),
|
||
(w(!0), j(we, null, Ee(t.value, (a) => (w(), V(q(ao), H({
|
||
key: a.id
|
||
}, { ref_for: !0 }, a), null, 16))), 128))
|
||
], 64));
|
||
}
|
||
});
|
||
function Zc(e, t) {
|
||
Ut("get:columns", () => e.table.columns), Ut("update:columns", (n) => {
|
||
t.emit("update:columns", n);
|
||
}), Ut("get:crudBinding", () => e);
|
||
}
|
||
function ed(e, t) {
|
||
const n = K(), o = () => n.value, r = () => n.value ? n.value.getForm() : (de.warn("请使用expose.getSearchFormData代替"), {}), a = () => n.value ? n.value.getValidatedForm() : (de.warn("请使用expose.getSearchValidatedFormData代替"), {});
|
||
function i({ form: s, mergeForm: u = !1 }) {
|
||
n.value && n.value.setForm(s, u);
|
||
}
|
||
return {
|
||
searchRef: n,
|
||
getSearchRef: o,
|
||
getSearchFormData: r,
|
||
setSearchFormData: i,
|
||
getSearchValidatedFormData: a
|
||
};
|
||
}
|
||
function td(e, t, n) {
|
||
return {
|
||
tabsBinding: B(() => {
|
||
var r, a, i, s, u, l, c;
|
||
if (t.tabs && t.tabs.show && t.tabs.name) {
|
||
let d = null;
|
||
const h = { ...t.tabs };
|
||
return (r = t.search) != null && r.columns && ((s = (i = (a = t.search) == null ? void 0 : a.columns[t.tabs.name]) == null ? void 0 : i.component) != null && s.dict) && (d = (c = (l = (u = t.search) == null ? void 0 : u.columns[t.tabs.name]) == null ? void 0 : l.component) == null ? void 0 : c.dict, h.value == null && (h.value = d.value), h.label == null && (h.label = d.label), h.options == null && (h.options = d.data || [])), {
|
||
...h,
|
||
modelValue: t.search.validatedForm && t.search.validatedForm[t.tabs.name],
|
||
"onUpdate:modelValue": (f) => {
|
||
n.emit("tab-change", { [t.tabs.name]: f });
|
||
}
|
||
};
|
||
}
|
||
return {
|
||
show: !1
|
||
};
|
||
})
|
||
};
|
||
}
|
||
function _o(e, t) {
|
||
if (!e)
|
||
return {};
|
||
const n = {};
|
||
return G(e, (o, r) => {
|
||
r.startsWith(t) && (n[r] = o);
|
||
}), n;
|
||
}
|
||
function nd(e, t, { tableRef: n, containerRef: o }) {
|
||
var l;
|
||
const r = Le.get();
|
||
let a = r.table;
|
||
if (((l = e.table) == null ? void 0 : l.tableVersion) === "v2" && (a = r.tableV2), a.hasMaxHeight(e.table))
|
||
return {};
|
||
if (!a.fixedHeaderNeedComputeBodyHeight)
|
||
return {};
|
||
const i = K(null);
|
||
function s() {
|
||
var v;
|
||
const c = (v = n == null ? void 0 : n.value) == null ? void 0 : v.$el;
|
||
if (c == null || c.querySelector == null)
|
||
return;
|
||
const d = c.querySelector(a.headerDomSelector);
|
||
if (d == null)
|
||
return;
|
||
const h = c.getBoundingClientRect().height, f = d.getBoundingClientRect().height;
|
||
i.value = h - f - 2 + (e.table.maxHeightAdjust || 0), de.debug("table max height recomputed ", i.value);
|
||
}
|
||
function u() {
|
||
var f;
|
||
const c = (f = n == null ? void 0 : n.value) == null ? void 0 : f.$el;
|
||
if (c == null)
|
||
return;
|
||
const d = c.parentNode;
|
||
new ResizeObserver(function(v) {
|
||
de.debug("table resized", v), v.length > 0 && v[0].contentRect.height > 0 && (s(), setTimeout(() => {
|
||
s();
|
||
}, 200), setTimeout(() => {
|
||
s();
|
||
}, 500));
|
||
}).observe(d);
|
||
}
|
||
return Cn(async () => {
|
||
await Me(), await Me(), u();
|
||
}), { maxHeightRef: i, computeBodyHeight: s };
|
||
}
|
||
function od(e, t) {
|
||
const n = Le.get(), o = K(), r = K(), a = K(), { maxHeightRef: i, computeBodyHeight: s } = nd(e, t, { tableRef: o, containerRef: a }), { merge: u } = $e(), l = ua(e, "table"), c = B(() => {
|
||
var P;
|
||
let A = {};
|
||
if ((i == null ? void 0 : i.value) != null) {
|
||
let W = n.table;
|
||
((P = e.table) == null ? void 0 : P.tableVersion) === "v2" && (W = n.tableV2), A = W.buildMaxHeight(i.value);
|
||
}
|
||
const $ = an.dash.omit(l, "loading", "columns", "columnsMap");
|
||
return u(A, { ...t.attrs, ...$ });
|
||
}), d = ua(e, "toolbar"), h = B(() => _o(t.slots, "cell")), f = B(() => _o(t.slots, "form")), v = B(() => _o(t.slots, "search")), p = B(() => _o(t.slots, "toolbar")), y = K(), b = B(() => {
|
||
const A = { compact: e.toolbar.compact !== !1 };
|
||
return e.customClass && (A[e.customClass] = !0), A;
|
||
}), F = K(), R = K(!1);
|
||
return {
|
||
tableRef: o,
|
||
containerRef: a,
|
||
toolbarRef: r,
|
||
computedTable: c,
|
||
computedToolbar: d,
|
||
computedCellSlots: h,
|
||
formWrapperRef: y,
|
||
isFormInner: R,
|
||
onFormInnerChange: (A) => {
|
||
R.value = A;
|
||
},
|
||
computedFormSlots: f,
|
||
computedSearchSlots: v,
|
||
computedToolbarSlots: p,
|
||
computeBodyHeight: s,
|
||
computedClass: b,
|
||
innerWrapperRef: F
|
||
};
|
||
}
|
||
const rd = ue({
|
||
name: "FsCrud",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 表格id
|
||
*/
|
||
id: {
|
||
type: String,
|
||
default: ""
|
||
},
|
||
/**
|
||
* 表格配置,见FsTable
|
||
*/
|
||
table: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 表格数据
|
||
*/
|
||
// eslint-disable-next-line vue/require-default-prop
|
||
data: {
|
||
type: Array
|
||
},
|
||
/**
|
||
* 操作列配置,见FsRowHandle
|
||
*/
|
||
rowHandle: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 查询框配置,见FsSearch
|
||
*/
|
||
search: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 工具条配置,见FsToolbar
|
||
*/
|
||
toolbar: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 动作条配置,见FsActionbar
|
||
*/
|
||
actionbar: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* tabs filter
|
||
*/
|
||
tabs: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 添加表单对话框配置,见FsFormWrapper
|
||
*/
|
||
addForm: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 编辑表单对话框配置,见FsFormWrapper
|
||
*/
|
||
editForm: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 查看表单对话框配置,见FsFormWrapper
|
||
*/
|
||
viewForm: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 翻页配置,支持el-pagination|a-pagination配置
|
||
*/
|
||
pagination: {
|
||
type: Object,
|
||
default() {
|
||
return { show: !1 };
|
||
}
|
||
},
|
||
/**
|
||
* 容器配置,见FsContainer
|
||
*/
|
||
container: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* crud包裹容器的class
|
||
*/
|
||
customClass: {},
|
||
/**
|
||
* 不要传到fs-table去
|
||
*/
|
||
form: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 可选择
|
||
*/
|
||
selection: {
|
||
type: Object,
|
||
default() {
|
||
return { show: !1 };
|
||
}
|
||
}
|
||
},
|
||
emits: ["update:search", "update:compact", "update:columns", "form-value-change", "update:modelValue", "tab-change"],
|
||
setup(e, t) {
|
||
const { ui: n } = Ce();
|
||
Zc(e, t);
|
||
const o = ed(), r = td(o, e, t), a = od(e, t);
|
||
return {
|
||
ui: n,
|
||
...o,
|
||
...a,
|
||
...r
|
||
};
|
||
}
|
||
});
|
||
const ad = { class: "fs-crud-search" }, id = {
|
||
key: 0,
|
||
class: "fs-crud-actionbar"
|
||
}, sd = {
|
||
key: 0,
|
||
class: "fs-crud-toolbar"
|
||
}, ld = { class: "fs-crud-pagination" }, ud = { class: "fs-pagination-left" }, cd = { class: "fs-pagination" }, dd = { class: "fs-pagination-right" };
|
||
function fd(e, t, n, o, r, a) {
|
||
var d;
|
||
const i = J("fs-actionbar"), s = J("fs-toolbar"), u = J("fs-tabs-filter"), l = J("fs-table"), c = J("fs-form-wrapper");
|
||
return w(), V(z(((d = e.container) == null ? void 0 : d.is) || "fs-layout-default"), H({
|
||
ref: "containerRef",
|
||
class: "fs-crud-container"
|
||
}, e.container, { class: e.computedClass }), {
|
||
"header-top": N(() => [
|
||
ae(e.$slots, "header-top")
|
||
]),
|
||
"header-bottom": N(() => [
|
||
ae(e.$slots, "header-bottom")
|
||
]),
|
||
"header-middle": N(() => [
|
||
ae(e.$slots, "header-middle")
|
||
]),
|
||
search: N(() => [
|
||
ee("div", ad, [
|
||
(w(), V(z(e.search.is || "fs-search"), H({ ref: "searchRef" }, e.search, { slots: e.computedSearchSlots }), null, 16, ["slots"]))
|
||
])
|
||
]),
|
||
actionbar: N(() => [
|
||
e.actionbar && e.actionbar.show !== !1 ? (w(), j("div", id, [
|
||
ae(e.$slots, "actionbar-left"),
|
||
L(i, Be(xt(e.actionbar)), null, 16),
|
||
ae(e.$slots, "actionbar-right")
|
||
])) : ne("", !0)
|
||
]),
|
||
toolbar: N(() => [
|
||
e.toolbar && e.toolbar.show !== !1 ? (w(), j("div", sd, [
|
||
ae(e.$slots, "toolbar-left"),
|
||
L(s, H({ ref: "toolbarRef" }, e.toolbar, {
|
||
slots: e.computedToolbarSlots,
|
||
columns: e.table.columns
|
||
}), null, 16, ["slots", "columns"]),
|
||
ae(e.$slots, "toolbar-right")
|
||
])) : ne("", !0)
|
||
]),
|
||
tabs: N(() => [
|
||
e.tabsBinding.show ? (w(), V(u, H({
|
||
key: 0,
|
||
ref: "tabsRef",
|
||
class: "fs-tabs"
|
||
}, e.tabsBinding), null, 16)) : ne("", !0)
|
||
]),
|
||
table: N(() => [
|
||
L(l, H({
|
||
ref: "tableRef",
|
||
class: "fs-crud-table"
|
||
}, e.computedTable, {
|
||
columns: e.table.columns,
|
||
loading: e.table.loading,
|
||
"row-handle": e.rowHandle,
|
||
data: e.data,
|
||
"cell-slots": e.computedCellSlots
|
||
}), null, 16, ["columns", "loading", "row-handle", "data", "cell-slots"])
|
||
]),
|
||
form: N(() => [
|
||
ee("div", {
|
||
ref: "innerWrapperRef",
|
||
class: _t(["fs-form-wrapper-container", { "fs-form-inner-wrapper": e.isFormInner }])
|
||
}, [
|
||
L(c, {
|
||
ref: "formWrapperRef",
|
||
slots: e.computedFormSlots,
|
||
"inner-wrapper": e.innerWrapperRef,
|
||
onInnerChange: e.onFormInnerChange,
|
||
onValueChange: t[0] || (t[0] = (h) => e.$emit("form-value-change", h))
|
||
}, null, 8, ["slots", "inner-wrapper", "onInnerChange"])
|
||
], 2)
|
||
]),
|
||
pagination: N(() => [
|
||
ee("div", ld, [
|
||
ee("div", ud, [
|
||
ae(e.$slots, "pagination-left")
|
||
]),
|
||
ee("div", cd, [
|
||
e.pagination.show !== !1 ? (w(), V(z(e.ui.pagination.name), Be(H({ key: 0 }, e.pagination)), null, 16)) : ne("", !0)
|
||
]),
|
||
ee("div", dd, [
|
||
ae(e.$slots, "pagination-right")
|
||
])
|
||
])
|
||
]),
|
||
"footer-top": N(() => [
|
||
ae(e.$slots, "footer-top")
|
||
]),
|
||
"footer-bottom": N(() => [
|
||
ae(e.$slots, "footer-bottom")
|
||
]),
|
||
default: N(() => [
|
||
ae(e.$slots, "default")
|
||
]),
|
||
_: 3
|
||
}, 16, ["class"]);
|
||
}
|
||
const hd = /* @__PURE__ */ Te(rd, [["render", fd]]), md = ue({
|
||
name: "FsRowHandle",
|
||
props: {
|
||
/**
|
||
* 按钮折叠配置
|
||
*/
|
||
dropdown: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 按钮配置
|
||
* {
|
||
* view:{...FsButton,click:Function,order:1},
|
||
* edit:{...FsButton,click:Function,order:2},
|
||
* remove:{...FsButton,click:Function,order:3},
|
||
* ...自定义
|
||
* }
|
||
*/
|
||
buttons: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 按钮分组,上面的buttons为默认分组
|
||
* {
|
||
* groupKey:{buttonKey:{},buttonKey2:{}}
|
||
* }
|
||
*/
|
||
group: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 当前激活分组
|
||
*/
|
||
active: {
|
||
type: String,
|
||
default: "default"
|
||
},
|
||
/**
|
||
* scope
|
||
*/
|
||
scope: {
|
||
type: Object,
|
||
default: () => ({})
|
||
}
|
||
},
|
||
emits: ["handle"],
|
||
setup(e, t) {
|
||
const { ui: n } = Ce(), { merge: o } = $e(), { t: r } = ut(), a = B(() => ({
|
||
...e.scope,
|
||
row: e.scope[n.tableColumn.row],
|
||
index: e.scope[n.tableColumn.index]
|
||
})), i = (y, b) => {
|
||
const F = e.scope[n.tableColumn.index], R = e.scope[n.tableColumn.row], D = { key: y.key, row: R, btn: y, index: F, ...e.scope, loadingRef: b == null ? void 0 : b.loadingRef };
|
||
if (y.click)
|
||
return y.click(D);
|
||
t.emit("handle", D);
|
||
}, { doComputed: s } = Vt(), u = B(() => ({
|
||
dropdown: e.dropdown,
|
||
buttons: e.buttons,
|
||
active: e.active,
|
||
group: e.group
|
||
})), l = s(
|
||
() => u.value,
|
||
() => {
|
||
const y = e.scope[n.tableColumn.index], b = e.scope[n.tableColumn.row];
|
||
return { ...e.scope, index: y, row: b };
|
||
}
|
||
), c = B(() => {
|
||
let y = null;
|
||
if (l.value.active == null || l.value.active === "default") {
|
||
const F = {
|
||
view: {
|
||
key: "view",
|
||
text: r("fs.rowHandle.view.text"),
|
||
title: r("fs.rowHandle.view.text")
|
||
},
|
||
copy: {
|
||
key: "copy",
|
||
text: r("fs.rowHandle.copy.text"),
|
||
title: r("fs.rowHandle.copy.text")
|
||
},
|
||
edit: {
|
||
key: "edit",
|
||
type: "primary",
|
||
text: r("fs.rowHandle.edit.text"),
|
||
title: r("fs.rowHandle.edit.text")
|
||
},
|
||
remove: {
|
||
key: "remove",
|
||
...n.button.colors("danger"),
|
||
text: r("fs.rowHandle.remove.text"),
|
||
title: r("fs.rowHandle.remove.text")
|
||
}
|
||
};
|
||
y = o(F, l.value.buttons);
|
||
} else
|
||
y = l.value.group[l.value.active];
|
||
const b = [];
|
||
return G(y, (F, R) => {
|
||
F.key = R, F.show !== !1 && b.push(F);
|
||
}), Sn(b, (F) => F.order ?? cn.orderDefault);
|
||
}), d = B(() => l.value.dropdown == null || l.value.dropdown.atLeast == null || l.value.dropdown.atLeast <= 0 || c.value.length <= l.value.dropdown.atLeast ? 0 : l.value.dropdown.atLeast || 0);
|
||
function h(y, b) {
|
||
return y.dropdown === !0 || d.value > 0 && d.value < b;
|
||
}
|
||
const f = B(() => {
|
||
let y = 0;
|
||
for (const b of c.value) {
|
||
if (h(b, y))
|
||
return !0;
|
||
y++;
|
||
}
|
||
return !1;
|
||
});
|
||
function v(y) {
|
||
for (let b of c.value)
|
||
if (y === b.key) {
|
||
i(b);
|
||
return;
|
||
}
|
||
}
|
||
const p = B(() => {
|
||
const y = {};
|
||
if (n.dropdown.renderMode !== "slot") {
|
||
const b = c.value, F = [];
|
||
G(b, (R, D) => {
|
||
R.show !== !1 && h(R, D) && F.push({
|
||
[n.dropdown.value]: R.key,
|
||
[n.dropdown.label]: R.text,
|
||
title: R.title
|
||
});
|
||
}), y.options = F;
|
||
}
|
||
return {
|
||
..._n(e.dropdown, "more", "atLeast"),
|
||
...n.dropdown.command(v),
|
||
...y
|
||
};
|
||
});
|
||
return {
|
||
ui: n,
|
||
hasDropdownBtn: f,
|
||
computedHandleBtns: c,
|
||
doDropdownItemClick: v,
|
||
computedDropdownAtLeast: d,
|
||
doClick: i,
|
||
isDropdownBtn: h,
|
||
scopeRef: a,
|
||
computedDropdownBinding: p
|
||
};
|
||
}
|
||
});
|
||
const pd = { class: "fs-row-handle" }, gd = {
|
||
key: 0,
|
||
class: "row-handle-btn fs-handle-row-dropdown"
|
||
};
|
||
function vd(e, t, n, o, r, a) {
|
||
const i = J("fs-render"), s = J("fs-button"), u = J("fs-icon");
|
||
return w(), j("div", pd, [
|
||
ae(e.$slots, "cell-rowHandle-left", Be(xt(e.scopeRef))),
|
||
(w(!0), j(we, null, Ee(e.computedHandleBtns, (l, c) => (w(), j(we, { key: c }, [
|
||
l.show !== !1 && !e.isDropdownBtn(l, c) ? (w(), j(we, { key: 0 }, [
|
||
l.render ? (w(), V(i, {
|
||
key: 0,
|
||
"render-func": l.render,
|
||
scope: e.scopeRef
|
||
}, null, 8, ["render-func", "scope"])) : (w(), V(s, H({
|
||
key: 1,
|
||
class: "row-handle-btn"
|
||
}, { ref_for: !0 }, l, {
|
||
onClick: as((d) => e.doClick(l, d), ["stop"])
|
||
}), null, 16, ["onClick"]))
|
||
], 64)) : ne("", !0)
|
||
], 64))), 128)),
|
||
ae(e.$slots, "cell-rowHandle-middle", Be(xt(e.scope))),
|
||
e.hasDropdownBtn ? (w(), j("span", gd, [
|
||
(w(), V(z(e.ui.dropdown.name), Be(xt(e.computedDropdownBinding)), {
|
||
[e.ui.dropdown.slotName]: N(() => [
|
||
e.ui.dropdown.renderMode === "slot" ? (w(), V(z(e.ui.dropdownMenu.name), Be(H({ key: 0 }, e.ui.dropdownMenu.command(e.doDropdownItemClick))), {
|
||
default: N(() => [
|
||
(w(!0), j(we, null, Ee(e.computedHandleBtns, (l, c) => (w(), j(we, { key: c }, [
|
||
l.show !== !1 && e.isDropdownBtn(l, c) ? (w(), V(z(e.ui.dropdownItem.name), H({
|
||
key: 0,
|
||
[e.ui.dropdownItem.command || ""]: l.key
|
||
}, { ref_for: !0 }, l.dropdownItem, {
|
||
disabled: l.disabled
|
||
}), {
|
||
default: N(() => [
|
||
ee("div", H({ class: "fs-row-handle-dropdown-item" }, { ref_for: !0 }, l), [
|
||
l.icon ? (w(), V(u, {
|
||
key: 0,
|
||
icon: l.icon
|
||
}, null, 8, ["icon"])) : ne("", !0),
|
||
St(" " + xe(l.text || l.title), 1)
|
||
], 16)
|
||
]),
|
||
_: 2
|
||
}, 1040, ["disabled"])) : ne("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16)) : ne("", !0)
|
||
]),
|
||
default: N(() => [
|
||
L(s, Be(xt(e.dropdown.more)), null, 16)
|
||
]),
|
||
_: 2
|
||
}, 1040))
|
||
])) : ne("", !0),
|
||
ae(e.$slots, "cell-rowHandle-right", Be(xt(e.scope)))
|
||
]);
|
||
}
|
||
const bd = /* @__PURE__ */ Te(md, [["render", vd]]);
|
||
function vn() {
|
||
return vn = Object.assign ? Object.assign.bind() : function(e) {
|
||
for (var t = 1; t < arguments.length; t++) {
|
||
var n = arguments[t];
|
||
for (var o in n)
|
||
Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]);
|
||
}
|
||
return e;
|
||
}, vn.apply(this, arguments);
|
||
}
|
||
function yd(e, t) {
|
||
e.prototype = Object.create(t.prototype), e.prototype.constructor = e, io(e, t);
|
||
}
|
||
function Er(e) {
|
||
return Er = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(n) {
|
||
return n.__proto__ || Object.getPrototypeOf(n);
|
||
}, Er(e);
|
||
}
|
||
function io(e, t) {
|
||
return io = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(o, r) {
|
||
return o.__proto__ = r, o;
|
||
}, io(e, t);
|
||
}
|
||
function wd() {
|
||
if (typeof Reflect > "u" || !Reflect.construct || Reflect.construct.sham)
|
||
return !1;
|
||
if (typeof Proxy == "function")
|
||
return !0;
|
||
try {
|
||
return Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {
|
||
})), !0;
|
||
} catch {
|
||
return !1;
|
||
}
|
||
}
|
||
function To(e, t, n) {
|
||
return wd() ? To = Reflect.construct.bind() : To = function(r, a, i) {
|
||
var s = [null];
|
||
s.push.apply(s, a);
|
||
var u = Function.bind.apply(r, s), l = new u();
|
||
return i && io(l, i.prototype), l;
|
||
}, To.apply(null, arguments);
|
||
}
|
||
function _d(e) {
|
||
return Function.toString.call(e).indexOf("[native code]") !== -1;
|
||
}
|
||
function Tr(e) {
|
||
var t = typeof Map == "function" ? /* @__PURE__ */ new Map() : void 0;
|
||
return Tr = function(o) {
|
||
if (o === null || !_d(o))
|
||
return o;
|
||
if (typeof o != "function")
|
||
throw new TypeError("Super expression must either be null or a function");
|
||
if (typeof t < "u") {
|
||
if (t.has(o))
|
||
return t.get(o);
|
||
t.set(o, r);
|
||
}
|
||
function r() {
|
||
return To(o, arguments, Er(this).constructor);
|
||
}
|
||
return r.prototype = Object.create(o.prototype, {
|
||
constructor: {
|
||
value: r,
|
||
enumerable: !1,
|
||
writable: !0,
|
||
configurable: !0
|
||
}
|
||
}), io(r, o);
|
||
}, Tr(e);
|
||
}
|
||
var Cd = /%[sdj%]/g, _i = function() {
|
||
};
|
||
typeof process < "u" && process.env && process.env.NODE_ENV !== "production" && typeof window < "u" && typeof document < "u" && (_i = function(t, n) {
|
||
typeof console < "u" && console.warn && typeof ASYNC_VALIDATOR_NO_WARNING > "u" && n.every(function(o) {
|
||
return typeof o == "string";
|
||
}) && console.warn(t, n);
|
||
});
|
||
function Ir(e) {
|
||
if (!e || !e.length)
|
||
return null;
|
||
var t = {};
|
||
return e.forEach(function(n) {
|
||
var o = n.field;
|
||
t[o] = t[o] || [], t[o].push(n);
|
||
}), t;
|
||
}
|
||
function wt(e) {
|
||
for (var t = arguments.length, n = new Array(t > 1 ? t - 1 : 0), o = 1; o < t; o++)
|
||
n[o - 1] = arguments[o];
|
||
var r = 0, a = n.length;
|
||
if (typeof e == "function")
|
||
return e.apply(null, n);
|
||
if (typeof e == "string") {
|
||
var i = e.replace(Cd, function(s) {
|
||
if (s === "%%")
|
||
return "%";
|
||
if (r >= a)
|
||
return s;
|
||
switch (s) {
|
||
case "%s":
|
||
return String(n[r++]);
|
||
case "%d":
|
||
return Number(n[r++]);
|
||
case "%j":
|
||
try {
|
||
return JSON.stringify(n[r++]);
|
||
} catch {
|
||
return "[Circular]";
|
||
}
|
||
break;
|
||
default:
|
||
return s;
|
||
}
|
||
});
|
||
return i;
|
||
}
|
||
return e;
|
||
}
|
||
function Sd(e) {
|
||
return e === "string" || e === "url" || e === "hex" || e === "email" || e === "date" || e === "pattern";
|
||
}
|
||
function Ye(e, t) {
|
||
return !!(e == null || t === "array" && Array.isArray(e) && !e.length || Sd(t) && typeof e == "string" && !e);
|
||
}
|
||
function Fd(e, t, n) {
|
||
var o = [], r = 0, a = e.length;
|
||
function i(s) {
|
||
o.push.apply(o, s || []), r++, r === a && n(o);
|
||
}
|
||
e.forEach(function(s) {
|
||
t(s, i);
|
||
});
|
||
}
|
||
function wa(e, t, n) {
|
||
var o = 0, r = e.length;
|
||
function a(i) {
|
||
if (i && i.length) {
|
||
n(i);
|
||
return;
|
||
}
|
||
var s = o;
|
||
o = o + 1, s < r ? t(e[s], a) : n([]);
|
||
}
|
||
a([]);
|
||
}
|
||
function Rd(e) {
|
||
var t = [];
|
||
return Object.keys(e).forEach(function(n) {
|
||
t.push.apply(t, e[n] || []);
|
||
}), t;
|
||
}
|
||
var _a = /* @__PURE__ */ function(e) {
|
||
yd(t, e);
|
||
function t(n, o) {
|
||
var r;
|
||
return r = e.call(this, "Async Validation Error") || this, r.errors = n, r.fields = o, r;
|
||
}
|
||
return t;
|
||
}(/* @__PURE__ */ Tr(Error));
|
||
function Dd(e, t, n, o, r) {
|
||
if (t.first) {
|
||
var a = new Promise(function(h, f) {
|
||
var v = function(b) {
|
||
return o(b), b.length ? f(new _a(b, Ir(b))) : h(r);
|
||
}, p = Rd(e);
|
||
wa(p, n, v);
|
||
});
|
||
return a.catch(function(h) {
|
||
return h;
|
||
}), a;
|
||
}
|
||
var i = t.firstFields === !0 ? Object.keys(e) : t.firstFields || [], s = Object.keys(e), u = s.length, l = 0, c = [], d = new Promise(function(h, f) {
|
||
var v = function(y) {
|
||
if (c.push.apply(c, y), l++, l === u)
|
||
return o(c), c.length ? f(new _a(c, Ir(c))) : h(r);
|
||
};
|
||
s.length || (o(c), h(r)), s.forEach(function(p) {
|
||
var y = e[p];
|
||
i.indexOf(p) !== -1 ? wa(y, n, v) : Fd(y, n, v);
|
||
});
|
||
});
|
||
return d.catch(function(h) {
|
||
return h;
|
||
}), d;
|
||
}
|
||
function kd(e) {
|
||
return !!(e && e.message !== void 0);
|
||
}
|
||
function Od(e, t) {
|
||
for (var n = e, o = 0; o < t.length; o++) {
|
||
if (n == null)
|
||
return n;
|
||
n = n[t[o]];
|
||
}
|
||
return n;
|
||
}
|
||
function Ca(e, t) {
|
||
return function(n) {
|
||
var o;
|
||
return e.fullFields ? o = Od(t, e.fullFields) : o = t[n.field || e.fullField], kd(n) ? (n.field = n.field || e.fullField, n.fieldValue = o, n) : {
|
||
message: typeof n == "function" ? n() : n,
|
||
fieldValue: o,
|
||
field: n.field || e.fullField
|
||
};
|
||
};
|
||
}
|
||
function Sa(e, t) {
|
||
if (t) {
|
||
for (var n in t)
|
||
if (t.hasOwnProperty(n)) {
|
||
var o = t[n];
|
||
typeof o == "object" && typeof e[n] == "object" ? e[n] = vn({}, e[n], o) : e[n] = o;
|
||
}
|
||
}
|
||
return e;
|
||
}
|
||
var Ci = function(t, n, o, r, a, i) {
|
||
t.required && (!o.hasOwnProperty(t.field) || Ye(n, i || t.type)) && r.push(wt(a.messages.required, t.fullField));
|
||
}, $d = function(t, n, o, r, a) {
|
||
(/^\s+$/.test(n) || n === "") && r.push(wt(a.messages.whitespace, t.fullField));
|
||
}, Co, Ed = function() {
|
||
if (Co)
|
||
return Co;
|
||
var e = "[a-fA-F\\d:]", t = function(D) {
|
||
return D && D.includeBoundaries ? "(?:(?<=\\s|^)(?=" + e + ")|(?<=" + e + ")(?=\\s|$))" : "";
|
||
}, n = "(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}", o = "[a-fA-F\\d]{1,4}", r = (`
|
||
(?:
|
||
(?:` + o + ":){7}(?:" + o + `|:)| // 1:2:3:4:5:6:7:: 1:2:3:4:5:6:7:8
|
||
(?:` + o + ":){6}(?:" + n + "|:" + o + `|:)| // 1:2:3:4:5:6:: 1:2:3:4:5:6::8 1:2:3:4:5:6::8 1:2:3:4:5:6::1.2.3.4
|
||
(?:` + o + ":){5}(?::" + n + "|(?::" + o + `){1,2}|:)| // 1:2:3:4:5:: 1:2:3:4:5::7:8 1:2:3:4:5::8 1:2:3:4:5::7:1.2.3.4
|
||
(?:` + o + ":){4}(?:(?::" + o + "){0,1}:" + n + "|(?::" + o + `){1,3}|:)| // 1:2:3:4:: 1:2:3:4::6:7:8 1:2:3:4::8 1:2:3:4::6:7:1.2.3.4
|
||
(?:` + o + ":){3}(?:(?::" + o + "){0,2}:" + n + "|(?::" + o + `){1,4}|:)| // 1:2:3:: 1:2:3::5:6:7:8 1:2:3::8 1:2:3::5:6:7:1.2.3.4
|
||
(?:` + o + ":){2}(?:(?::" + o + "){0,3}:" + n + "|(?::" + o + `){1,5}|:)| // 1:2:: 1:2::4:5:6:7:8 1:2::8 1:2::4:5:6:7:1.2.3.4
|
||
(?:` + o + ":){1}(?:(?::" + o + "){0,4}:" + n + "|(?::" + o + `){1,6}|:)| // 1:: 1::3:4:5:6:7:8 1::8 1::3:4:5:6:7:1.2.3.4
|
||
(?::(?:(?::` + o + "){0,5}:" + n + "|(?::" + o + `){1,7}|:)) // ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::1.2.3.4
|
||
)(?:%[0-9a-zA-Z]{1,})? // %eth0 %1
|
||
`).replace(/\s*\/\/.*$/gm, "").replace(/\n/g, "").trim(), a = new RegExp("(?:^" + n + "$)|(?:^" + r + "$)"), i = new RegExp("^" + n + "$"), s = new RegExp("^" + r + "$"), u = function(D) {
|
||
return D && D.exact ? a : new RegExp("(?:" + t(D) + n + t(D) + ")|(?:" + t(D) + r + t(D) + ")", "g");
|
||
};
|
||
u.v4 = function(R) {
|
||
return R && R.exact ? i : new RegExp("" + t(R) + n + t(R), "g");
|
||
}, u.v6 = function(R) {
|
||
return R && R.exact ? s : new RegExp("" + t(R) + r + t(R), "g");
|
||
};
|
||
var l = "(?:(?:[a-z]+:)?//)", c = "(?:\\S+(?::\\S*)?@)?", d = u.v4().source, h = u.v6().source, f = "(?:(?:[a-z\\u00a1-\\uffff0-9][-_]*)*[a-z\\u00a1-\\uffff0-9]+)", v = "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*", p = "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))", y = "(?::\\d{2,5})?", b = '(?:[/?#][^\\s"]*)?', F = "(?:" + l + "|www\\.)" + c + "(?:localhost|" + d + "|" + h + "|" + f + v + p + ")" + y + b;
|
||
return Co = new RegExp("(?:^" + F + "$)", "i"), Co;
|
||
}, Fa = {
|
||
// http://emailregex.com/
|
||
email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,
|
||
// url: new RegExp(
|
||
// '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$',
|
||
// 'i',
|
||
// ),
|
||
hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i
|
||
}, Kn = {
|
||
integer: function(t) {
|
||
return Kn.number(t) && parseInt(t, 10) === t;
|
||
},
|
||
float: function(t) {
|
||
return Kn.number(t) && !Kn.integer(t);
|
||
},
|
||
array: function(t) {
|
||
return Array.isArray(t);
|
||
},
|
||
regexp: function(t) {
|
||
if (t instanceof RegExp)
|
||
return !0;
|
||
try {
|
||
return !!new RegExp(t);
|
||
} catch {
|
||
return !1;
|
||
}
|
||
},
|
||
date: function(t) {
|
||
return typeof t.getTime == "function" && typeof t.getMonth == "function" && typeof t.getYear == "function" && !isNaN(t.getTime());
|
||
},
|
||
number: function(t) {
|
||
return isNaN(t) ? !1 : typeof t == "number";
|
||
},
|
||
object: function(t) {
|
||
return typeof t == "object" && !Kn.array(t);
|
||
},
|
||
method: function(t) {
|
||
return typeof t == "function";
|
||
},
|
||
email: function(t) {
|
||
return typeof t == "string" && t.length <= 320 && !!t.match(Fa.email);
|
||
},
|
||
url: function(t) {
|
||
return typeof t == "string" && t.length <= 2048 && !!t.match(Ed());
|
||
},
|
||
hex: function(t) {
|
||
return typeof t == "string" && !!t.match(Fa.hex);
|
||
}
|
||
}, Td = function(t, n, o, r, a) {
|
||
if (t.required && n === void 0) {
|
||
Ci(t, n, o, r, a);
|
||
return;
|
||
}
|
||
var i = ["integer", "float", "array", "regexp", "object", "method", "email", "number", "date", "url", "hex"], s = t.type;
|
||
i.indexOf(s) > -1 ? Kn[s](n) || r.push(wt(a.messages.types[s], t.fullField, t.type)) : s && typeof n !== t.type && r.push(wt(a.messages.types[s], t.fullField, t.type));
|
||
}, Id = function(t, n, o, r, a) {
|
||
var i = typeof t.len == "number", s = typeof t.min == "number", u = typeof t.max == "number", l = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, c = n, d = null, h = typeof n == "number", f = typeof n == "string", v = Array.isArray(n);
|
||
if (h ? d = "number" : f ? d = "string" : v && (d = "array"), !d)
|
||
return !1;
|
||
v && (c = n.length), f && (c = n.replace(l, "_").length), i ? c !== t.len && r.push(wt(a.messages[d].len, t.fullField, t.len)) : s && !u && c < t.min ? r.push(wt(a.messages[d].min, t.fullField, t.min)) : u && !s && c > t.max ? r.push(wt(a.messages[d].max, t.fullField, t.max)) : s && u && (c < t.min || c > t.max) && r.push(wt(a.messages[d].range, t.fullField, t.min, t.max));
|
||
}, Rn = "enum", Ad = function(t, n, o, r, a) {
|
||
t[Rn] = Array.isArray(t[Rn]) ? t[Rn] : [], t[Rn].indexOf(n) === -1 && r.push(wt(a.messages[Rn], t.fullField, t[Rn].join(", ")));
|
||
}, Vd = function(t, n, o, r, a) {
|
||
if (t.pattern) {
|
||
if (t.pattern instanceof RegExp)
|
||
t.pattern.lastIndex = 0, t.pattern.test(n) || r.push(wt(a.messages.pattern.mismatch, t.fullField, n, t.pattern));
|
||
else if (typeof t.pattern == "string") {
|
||
var i = new RegExp(t.pattern);
|
||
i.test(n) || r.push(wt(a.messages.pattern.mismatch, t.fullField, n, t.pattern));
|
||
}
|
||
}
|
||
}, Re = {
|
||
required: Ci,
|
||
whitespace: $d,
|
||
type: Td,
|
||
range: Id,
|
||
enum: Ad,
|
||
pattern: Vd
|
||
}, Pd = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n, "string") && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a, "string"), Ye(n, "string") || (Re.type(t, n, r, i, a), Re.range(t, n, r, i, a), Re.pattern(t, n, r, i, a), t.whitespace === !0 && Re.whitespace(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, Md = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && Re.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Bd = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (n === "" && (n = void 0), Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && (Re.type(t, n, r, i, a), Re.range(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, jd = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && Re.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Nd = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), Ye(n) || Re.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, xd = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && (Re.type(t, n, r, i, a), Re.range(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, Ld = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && (Re.type(t, n, r, i, a), Re.range(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, qd = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (n == null && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a, "array"), n != null && (Re.type(t, n, r, i, a), Re.range(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, Hd = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && Re.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, zd = "enum", Wd = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), n !== void 0 && Re[zd](t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Ud = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n, "string") && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a), Ye(n, "string") || Re.pattern(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Kd = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n, "date") && !t.required)
|
||
return o();
|
||
if (Re.required(t, n, r, i, a), !Ye(n, "date")) {
|
||
var u;
|
||
n instanceof Date ? u = n : u = new Date(n), Re.type(t, u, r, i, a), u && Re.range(t, u.getTime(), r, i, a);
|
||
}
|
||
}
|
||
o(i);
|
||
}, Yd = function(t, n, o, r, a) {
|
||
var i = [], s = Array.isArray(n) ? "array" : typeof n;
|
||
Re.required(t, n, r, i, a, s), o(i);
|
||
}, sr = function(t, n, o, r, a) {
|
||
var i = t.type, s = [], u = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (u) {
|
||
if (Ye(n, i) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, s, a, i), Ye(n, i) || Re.type(t, n, r, s, a);
|
||
}
|
||
o(s);
|
||
}, Gd = function(t, n, o, r, a) {
|
||
var i = [], s = t.required || !t.required && r.hasOwnProperty(t.field);
|
||
if (s) {
|
||
if (Ye(n) && !t.required)
|
||
return o();
|
||
Re.required(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Jn = {
|
||
string: Pd,
|
||
method: Md,
|
||
number: Bd,
|
||
boolean: jd,
|
||
regexp: Nd,
|
||
integer: xd,
|
||
float: Ld,
|
||
array: qd,
|
||
object: Hd,
|
||
enum: Wd,
|
||
pattern: Ud,
|
||
date: Kd,
|
||
url: sr,
|
||
hex: sr,
|
||
email: sr,
|
||
required: Yd,
|
||
any: Gd
|
||
};
|
||
function Ar() {
|
||
return {
|
||
default: "Validation error on field %s",
|
||
required: "%s is required",
|
||
enum: "%s must be one of %s",
|
||
whitespace: "%s cannot be empty",
|
||
date: {
|
||
format: "%s date %s is invalid for format %s",
|
||
parse: "%s date could not be parsed, %s is invalid ",
|
||
invalid: "%s date %s is invalid"
|
||
},
|
||
types: {
|
||
string: "%s is not a %s",
|
||
method: "%s is not a %s (function)",
|
||
array: "%s is not an %s",
|
||
object: "%s is not an %s",
|
||
number: "%s is not a %s",
|
||
date: "%s is not a %s",
|
||
boolean: "%s is not a %s",
|
||
integer: "%s is not an %s",
|
||
float: "%s is not a %s",
|
||
regexp: "%s is not a valid %s",
|
||
email: "%s is not a valid %s",
|
||
url: "%s is not a valid %s",
|
||
hex: "%s is not a valid %s"
|
||
},
|
||
string: {
|
||
len: "%s must be exactly %s characters",
|
||
min: "%s must be at least %s characters",
|
||
max: "%s cannot be longer than %s characters",
|
||
range: "%s must be between %s and %s characters"
|
||
},
|
||
number: {
|
||
len: "%s must equal %s",
|
||
min: "%s cannot be less than %s",
|
||
max: "%s cannot be greater than %s",
|
||
range: "%s must be between %s and %s"
|
||
},
|
||
array: {
|
||
len: "%s must be exactly %s in length",
|
||
min: "%s cannot be less than %s in length",
|
||
max: "%s cannot be greater than %s in length",
|
||
range: "%s must be between %s and %s in length"
|
||
},
|
||
pattern: {
|
||
mismatch: "%s value %s does not match pattern %s"
|
||
},
|
||
clone: function() {
|
||
var t = JSON.parse(JSON.stringify(this));
|
||
return t.clone = this.clone, t;
|
||
}
|
||
};
|
||
}
|
||
var Vr = Ar(), go = /* @__PURE__ */ function() {
|
||
function e(n) {
|
||
this.rules = null, this._messages = Vr, this.define(n);
|
||
}
|
||
var t = e.prototype;
|
||
return t.define = function(o) {
|
||
var r = this;
|
||
if (!o)
|
||
throw new Error("Cannot configure a schema with no rules");
|
||
if (typeof o != "object" || Array.isArray(o))
|
||
throw new Error("Rules must be an object");
|
||
this.rules = {}, Object.keys(o).forEach(function(a) {
|
||
var i = o[a];
|
||
r.rules[a] = Array.isArray(i) ? i : [i];
|
||
});
|
||
}, t.messages = function(o) {
|
||
return o && (this._messages = Sa(Ar(), o)), this._messages;
|
||
}, t.validate = function(o, r, a) {
|
||
var i = this;
|
||
r === void 0 && (r = {}), a === void 0 && (a = function() {
|
||
});
|
||
var s = o, u = r, l = a;
|
||
if (typeof u == "function" && (l = u, u = {}), !this.rules || Object.keys(this.rules).length === 0)
|
||
return l && l(null, s), Promise.resolve(s);
|
||
function c(p) {
|
||
var y = [], b = {};
|
||
function F(D) {
|
||
if (Array.isArray(D)) {
|
||
var A;
|
||
y = (A = y).concat.apply(A, D);
|
||
} else
|
||
y.push(D);
|
||
}
|
||
for (var R = 0; R < p.length; R++)
|
||
F(p[R]);
|
||
y.length ? (b = Ir(y), l(y, b)) : l(null, s);
|
||
}
|
||
if (u.messages) {
|
||
var d = this.messages();
|
||
d === Vr && (d = Ar()), Sa(d, u.messages), u.messages = d;
|
||
} else
|
||
u.messages = this.messages();
|
||
var h = {}, f = u.keys || Object.keys(this.rules);
|
||
f.forEach(function(p) {
|
||
var y = i.rules[p], b = s[p];
|
||
y.forEach(function(F) {
|
||
var R = F;
|
||
typeof R.transform == "function" && (s === o && (s = vn({}, s)), b = s[p] = R.transform(b)), typeof R == "function" ? R = {
|
||
validator: R
|
||
} : R = vn({}, R), R.validator = i.getValidationMethod(R), R.validator && (R.field = p, R.fullField = R.fullField || p, R.type = i.getType(R), h[p] = h[p] || [], h[p].push({
|
||
rule: R,
|
||
value: b,
|
||
source: s,
|
||
field: p
|
||
}));
|
||
});
|
||
});
|
||
var v = {};
|
||
return Dd(h, u, function(p, y) {
|
||
var b = p.rule, F = (b.type === "object" || b.type === "array") && (typeof b.fields == "object" || typeof b.defaultField == "object");
|
||
F = F && (b.required || !b.required && p.value), b.field = p.field;
|
||
function R($, P) {
|
||
return vn({}, P, {
|
||
fullField: b.fullField + "." + $,
|
||
fullFields: b.fullFields ? [].concat(b.fullFields, [$]) : [$]
|
||
});
|
||
}
|
||
function D($) {
|
||
$ === void 0 && ($ = []);
|
||
var P = Array.isArray($) ? $ : [$];
|
||
!u.suppressWarning && P.length && e.warning("async-validator:", P), P.length && b.message !== void 0 && (P = [].concat(b.message));
|
||
var W = P.map(Ca(b, s));
|
||
if (u.first && W.length)
|
||
return v[b.field] = 1, y(W);
|
||
if (!F)
|
||
y(W);
|
||
else {
|
||
if (b.required && !p.value)
|
||
return b.message !== void 0 ? W = [].concat(b.message).map(Ca(b, s)) : u.error && (W = [u.error(b, wt(u.messages.required, b.field))]), y(W);
|
||
var k = {};
|
||
b.defaultField && Object.keys(p.value).map(function(E) {
|
||
k[E] = b.defaultField;
|
||
}), k = vn({}, k, p.rule.fields);
|
||
var Y = {};
|
||
Object.keys(k).forEach(function(E) {
|
||
var M = k[E], I = Array.isArray(M) ? M : [M];
|
||
Y[E] = I.map(R.bind(null, E));
|
||
});
|
||
var ce = new e(Y);
|
||
ce.messages(u.messages), p.rule.options && (p.rule.options.messages = u.messages, p.rule.options.error = u.error), ce.validate(p.value, p.rule.options || u, function(E) {
|
||
var M = [];
|
||
W && W.length && M.push.apply(M, W), E && E.length && M.push.apply(M, E), y(M.length ? M : null);
|
||
});
|
||
}
|
||
}
|
||
var A;
|
||
if (b.asyncValidator)
|
||
A = b.asyncValidator(b, p.value, D, p.source, u);
|
||
else if (b.validator) {
|
||
try {
|
||
A = b.validator(b, p.value, D, p.source, u);
|
||
} catch ($) {
|
||
console.error == null || console.error($), u.suppressValidatorError || setTimeout(function() {
|
||
throw $;
|
||
}, 0), D($.message);
|
||
}
|
||
A === !0 ? D() : A === !1 ? D(typeof b.message == "function" ? b.message(b.fullField || b.field) : b.message || (b.fullField || b.field) + " fails") : A instanceof Array ? D(A) : A instanceof Error && D(A.message);
|
||
}
|
||
A && A.then && A.then(function() {
|
||
return D();
|
||
}, function($) {
|
||
return D($);
|
||
});
|
||
}, function(p) {
|
||
c(p);
|
||
}, s);
|
||
}, t.getType = function(o) {
|
||
if (o.type === void 0 && o.pattern instanceof RegExp && (o.type = "pattern"), typeof o.validator != "function" && o.type && !Jn.hasOwnProperty(o.type))
|
||
throw new Error(wt("Unknown rule type %s", o.type));
|
||
return o.type || "string";
|
||
}, t.getValidationMethod = function(o) {
|
||
if (typeof o.validator == "function")
|
||
return o.validator;
|
||
var r = Object.keys(o), a = r.indexOf("message");
|
||
return a !== -1 && r.splice(a, 1), r.length === 1 && r[0] === "required" ? Jn.required : Jn[this.getType(o)] || void 0;
|
||
}, e;
|
||
}();
|
||
go.register = function(t, n) {
|
||
if (typeof n != "function")
|
||
throw new Error("Cannot register a validator by type, validator is not a function");
|
||
Jn[t] = n;
|
||
};
|
||
go.warning = _i;
|
||
go.messages = Vr;
|
||
go.validators = Jn;
|
||
function Xd(e) {
|
||
const t = {};
|
||
for (const n in e) {
|
||
const o = e[n].getForm(), r = o.rules || o.rule, a = n.split(".");
|
||
let i = t;
|
||
if (r)
|
||
for (let s = 0; s < a.length; s++) {
|
||
const u = a[s];
|
||
i[u] || (i[u] = { type: "object", fields: {} }), s == a.length - 1 ? i[u] = r : i = i[u].fields;
|
||
}
|
||
}
|
||
return new go(t);
|
||
}
|
||
function Pr(e, t) {
|
||
G(e, (n) => {
|
||
n.children ? Pr(n.children, t) : t(n);
|
||
});
|
||
}
|
||
function Jd(e, t) {
|
||
const n = Le.get();
|
||
function o() {
|
||
if (e.data)
|
||
return e.data;
|
||
if (t.value) {
|
||
let r = n.table;
|
||
return e.tableVersion === "v2" && (r = n.tableV2), t.value[r.data] || [];
|
||
}
|
||
return [];
|
||
}
|
||
return {
|
||
getData: o,
|
||
insert(r, a) {
|
||
o().splice(r, 0, a);
|
||
},
|
||
unshift(r) {
|
||
o().unshift(r);
|
||
},
|
||
remove(r) {
|
||
o().splice(r, 1);
|
||
},
|
||
get(r) {
|
||
return o()[r];
|
||
}
|
||
};
|
||
}
|
||
function Qd(e, t, n) {
|
||
const o = Jd(e, n), r = un([]);
|
||
function a(m) {
|
||
return typeof e.rowKey == "string" ? m[e.rowKey] : e.rowKey(m);
|
||
}
|
||
function i(m) {
|
||
return m[e.editable.rowKey];
|
||
}
|
||
function s(m) {
|
||
for (const C in r) {
|
||
const _ = r[C], S = _.cells, O = _.rowData;
|
||
if (m({ rowData: O, row: _, cells: S }) === "break")
|
||
return;
|
||
}
|
||
}
|
||
function u(m) {
|
||
s(({ rowData: C, row: _, cells: S }) => {
|
||
G(S, (O, X) => {
|
||
m({ rowData: C, row: _, cells: S, cell: O, key: X });
|
||
});
|
||
});
|
||
}
|
||
const { merge: l } = $e(), c = B(() => l({
|
||
enabled: !1,
|
||
//模式,free,row,cell
|
||
mode: "free",
|
||
rowKey: "id",
|
||
addForm: {},
|
||
editForm: {},
|
||
//是否排他式激活,激活一个,其他自动提交或取消
|
||
exclusive: !0,
|
||
//排他式激活时,其他的效果,cancel,save
|
||
exclusiveEffect: "cancel",
|
||
//激活触发方式,onClick,onDbClick
|
||
activeTrigger: "onClick",
|
||
//默认激活
|
||
activeDefault: !1,
|
||
isEditable(m) {
|
||
return !0;
|
||
}
|
||
}, e.editable));
|
||
function d(m, C, _, S) {
|
||
function O(Se) {
|
||
return et(m, Se);
|
||
}
|
||
function X(Se, qe) {
|
||
We(m, Se, qe);
|
||
}
|
||
const le = B(() => {
|
||
var Se;
|
||
return ((Se = S.editable) == null ? void 0 : Se.updateCell) || c.value.updateCell;
|
||
}), ie = B(() => {
|
||
var Se;
|
||
return ((Se = S.editable) == null ? void 0 : Se.showAction) || c.value.showAction;
|
||
}), fe = un({
|
||
mode: _ < 0 ? "add" : "edit",
|
||
oldValue: void 0,
|
||
newValue: void 0,
|
||
loading: !1,
|
||
isEditing: c.value.activeDefault,
|
||
activeTrigger: c.value.activeTrigger,
|
||
column: S,
|
||
updateCell: le,
|
||
showAction: ie,
|
||
isEditable: () => {
|
||
var Qe;
|
||
let Se = (Qe = S == null ? void 0 : S.editable) == null ? void 0 : Qe.disabled;
|
||
Se instanceof Function && (Se = Se({ column: S, editableId: _, row: m }));
|
||
let qe = null;
|
||
return Se != null && (qe = !Se), qe ?? (c.value.isEditable({ editableId: _, key: C, row: m }) || !1);
|
||
},
|
||
isChanged: () => fe.newValue !== fe.oldValue,
|
||
getForm: () => {
|
||
let Se = c.value[fe.mode + "Form"];
|
||
return Se == null && (Se = c.value.editForm), Se[C];
|
||
},
|
||
active: (Se = {}) => {
|
||
(Se.exclusive ?? c.value.exclusive) && ((Se.exclusiveEffect ?? c.value.exclusiveEffect) === "save" ? D() : A()), fe.isEditing = !0, fe.oldValue = O(C);
|
||
const Qe = c.value.editForm[C];
|
||
Qe && ce(Qe, m);
|
||
},
|
||
inactive: () => {
|
||
fe.isEditing = !1, fe.newValue = O(C);
|
||
},
|
||
resume: () => {
|
||
fe.isEditing && (fe.isEditing = !1, X(C, fe.oldValue), delete fe.newValue, delete fe.oldValue);
|
||
},
|
||
cancel: () => {
|
||
fe.resume();
|
||
},
|
||
persist: () => {
|
||
fe.isEditing = !1, delete fe.newValue, delete fe.oldValue;
|
||
},
|
||
save: async () => {
|
||
const Se = q(fe.updateCell);
|
||
if (!Se) {
|
||
de.warn("没有配置table.editable.updateCell方法,无法保存,相关文档:http://fast-crud.docmirror.cn/api/crud-options/table.html#editable");
|
||
return;
|
||
}
|
||
fe.loading = !0;
|
||
try {
|
||
const qe = await Se({ editableId: _, row: m, key: C, value: O(C) }), Qe = m[c.value.rowKey];
|
||
(Qe == null || Qe <= 0) && ((qe && qe[c.value.rowKey]) == null ? de.error(`对于添加的行,updateCell方法需要返回{'id':value},如果你配置了别的rowKey,需要返回{[rowKey]:id}。
|
||
当前返回值:${JSON.stringify(qe)}`) : m[c.value.rowKey] = qe[c.value.rowKey]), fe.persist();
|
||
} finally {
|
||
fe.loading = !1;
|
||
}
|
||
}
|
||
});
|
||
return fe;
|
||
}
|
||
function h(m, C) {
|
||
const _ = {};
|
||
Pr(e.columns, (ie) => {
|
||
_[ie.key] = d(C, ie.key, m, ie);
|
||
});
|
||
const S = B(() => Xd(_)), O = a(C), X = O == null || O < 0, le = un({
|
||
isAdd: X,
|
||
rowData: C,
|
||
editableId: m,
|
||
isEditing: !1,
|
||
loading: !1,
|
||
cells: _,
|
||
validator: S,
|
||
inactive: () => {
|
||
le.isEditing = !1, G(le.cells, (ie) => {
|
||
ie.isEditing && ie.inactive();
|
||
});
|
||
},
|
||
active: () => {
|
||
le.isEditing = !0, G(le.cells, (ie) => {
|
||
ie.active({ exclusive: !1 });
|
||
});
|
||
},
|
||
persist: () => {
|
||
le.isEditing = !1, le.inactive(), delete le.isAdd, G(le.cells, (ie) => {
|
||
ie.persist();
|
||
});
|
||
},
|
||
resume: () => {
|
||
le.isEditing = !1, G(le.cells, (ie) => {
|
||
ie.resume();
|
||
});
|
||
},
|
||
cancel: () => {
|
||
le.resume();
|
||
},
|
||
validate: async (ie) => {
|
||
try {
|
||
return G(le.cells, (fe, Se) => {
|
||
fe.validateErrors = [];
|
||
}), ie == null && (ie = le.rowData), await le.validator.validate(ie), !0;
|
||
} catch (fe) {
|
||
const { errors: Se, fields: qe } = fe;
|
||
return G(qe, (Qe, Z) => {
|
||
const ge = le.cells[Z];
|
||
ge && (ge.validateErrors = Qe);
|
||
}), qe;
|
||
}
|
||
},
|
||
getRowData: () => {
|
||
const ie = dt(le.rowData);
|
||
return delete ie[e.editable.rowKey], delete ie.children, ie;
|
||
},
|
||
save: async (ie) => {
|
||
const { doSave: fe } = ie, Se = le.rowData, { merge: qe } = $e();
|
||
if (await le.validate() !== !0)
|
||
return;
|
||
function Z(Oe) {
|
||
Oe && (a(Oe) == null && console.error("保存接口没有返回rowKey,无法更新该行的id,newRow:", Oe), qe(Se, Oe));
|
||
}
|
||
le.loading = !0;
|
||
const ge = le.getRowData();
|
||
try {
|
||
await fe({ isAdd: le.isAdd, row: ge, setData: Z }), le.persist();
|
||
} finally {
|
||
le.loading = !1;
|
||
}
|
||
}
|
||
});
|
||
if (lt(() => C, async (ie, fe, Se) => {
|
||
await le.validate();
|
||
}, {
|
||
deep: !0
|
||
}), C.children && C.children.length > 0)
|
||
for (const ie of C.children) {
|
||
ie[e.editable.rowKey] || (ie[e.editable.rowKey] = v());
|
||
const fe = ie[e.editable.rowKey];
|
||
r[fe] = h(fe, ie);
|
||
}
|
||
return X && le.active(), le;
|
||
}
|
||
let f = 0;
|
||
function v() {
|
||
return f++, f;
|
||
}
|
||
function p(m) {
|
||
m == null && (m = o.getData());
|
||
const C = Object.assign({}, r);
|
||
bs(r, (_, S) => {
|
||
delete r[S];
|
||
}), G(m, (_) => {
|
||
_[e.editable.rowKey] || (_[e.editable.rowKey] = v());
|
||
const S = _[e.editable.rowKey];
|
||
C[S] ? r[S] = C[S] : r[S] = h(S, _);
|
||
}), c.value.onSetup && c.value.onSetup();
|
||
}
|
||
function y(m) {
|
||
const C = e.editable.rowKey, _ = [];
|
||
for (const S of m) {
|
||
const O = { [C]: S[C] };
|
||
S.children && S.children.length && (O.children = y(S.children)), _.push(O);
|
||
}
|
||
return _;
|
||
}
|
||
lt(() => {
|
||
const m = e.data;
|
||
let C = [];
|
||
return m != null && m instanceof Array && (C = y(m)), JSON.stringify(C);
|
||
}, (m, C) => {
|
||
c.value.enabled && p(e.data);
|
||
}, {
|
||
immediate: !0
|
||
}), lt(() => c.value.enabled, (m) => {
|
||
var C;
|
||
m && (((C = o.getData()) == null ? void 0 : C.length) > 0 && p(), c.value.onEnabled && c.value.onEnabled({ ...c.value }));
|
||
}, {
|
||
immediate: !0
|
||
}), lt(() => c.value.mode, () => {
|
||
c.value.onEnabled && c.value.onEnabled({ ...c.value });
|
||
});
|
||
function b(m, C) {
|
||
var _;
|
||
if (C != null)
|
||
return (_ = r[m]) == null ? void 0 : _.cells[C];
|
||
}
|
||
function F(m = {}) {
|
||
u(({ cell: C }) => {
|
||
C.active({ ...m, exclusive: !1 });
|
||
});
|
||
}
|
||
function R() {
|
||
u(({ cell: m }) => {
|
||
m.isEditing && m.inactive();
|
||
});
|
||
}
|
||
async function D() {
|
||
u(({ cell: m }) => {
|
||
m.isEditing && m.save();
|
||
});
|
||
}
|
||
function A() {
|
||
u(({ cell: m }) => {
|
||
m.isEditing && m.cancel();
|
||
});
|
||
}
|
||
function $() {
|
||
R(), s(({ row: m }) => {
|
||
delete m.isAdd;
|
||
}), u(({ cell: m }) => {
|
||
delete m.newValue, delete m.oldValue;
|
||
});
|
||
}
|
||
function P() {
|
||
u(({ cell: m }) => {
|
||
m.resume();
|
||
});
|
||
}
|
||
function W() {
|
||
let m = !1;
|
||
return s(({ cells: C }) => {
|
||
G(C, (_) => {
|
||
if (_.isChanged())
|
||
return m = !0, "break";
|
||
});
|
||
}), m;
|
||
}
|
||
let k = 0;
|
||
function Y(m, C) {
|
||
Pr(m, (_) => {
|
||
ce(_, C);
|
||
});
|
||
}
|
||
function ce(m, C) {
|
||
const _ = et(C, m.key), S = q(m.value);
|
||
S != null && _ == null && We(C, m.key, S);
|
||
}
|
||
async function E(m = { row: void 0, active: !0 }) {
|
||
let C = m.row || { [c.value.rowKey]: --k, [e.rowKey]: k };
|
||
if (Y(c.value.addForm, C), m.addRowFunc) {
|
||
const _ = await m.addRowFunc({ row: m.row });
|
||
_ && (C = _);
|
||
} else if (e.editable.addRow) {
|
||
const _ = await e.editable.addRow(o.getData(), C);
|
||
_ && (C = _);
|
||
} else
|
||
o.unshift(C);
|
||
if (m.active ?? e.editable.activeDefault) {
|
||
await Me();
|
||
const _ = i(C), S = x(_);
|
||
S && S.active();
|
||
}
|
||
}
|
||
function M(m, C) {
|
||
for (let _ = 0; _ < C.length; _++) {
|
||
const S = C[_];
|
||
if (i(S) === m)
|
||
return za(C, S), !0;
|
||
if (S.children && S.children.length > 0 && M(m, S.children))
|
||
return;
|
||
}
|
||
return !1;
|
||
}
|
||
function I(m) {
|
||
delete r[m], M(m, o.getData());
|
||
}
|
||
function T(m) {
|
||
const { cols: C } = m;
|
||
s(({ cells: _ }) => {
|
||
G(C, (S) => {
|
||
_[S].active({ ...m, exclusive: !1 });
|
||
});
|
||
});
|
||
}
|
||
function x(m) {
|
||
return r[m];
|
||
}
|
||
function Q() {
|
||
const m = [];
|
||
return s(({ row: C }) => {
|
||
C.isEditing && m.push(C);
|
||
}), m;
|
||
}
|
||
async function oe() {
|
||
const m = {};
|
||
let C = !1;
|
||
for (const _ in r) {
|
||
const S = r[_], O = await S.validate();
|
||
O != !0 && (m[S.editableId] = O, C = !0);
|
||
}
|
||
return C ? m : !0;
|
||
}
|
||
function ye(m) {
|
||
for (const C of m)
|
||
delete C[e.editable.rowKey], C.children && C.children.length > 0 && ye(C.children);
|
||
return m;
|
||
}
|
||
function re(m) {
|
||
return m == null && (m = dt(o.getData())), m == null ? [] : ye(m);
|
||
}
|
||
return {
|
||
editable: {
|
||
options: c,
|
||
setupEditable: p,
|
||
inactive: R,
|
||
active: F,
|
||
persist: $,
|
||
saveEach: D,
|
||
cancelAll: A,
|
||
resume: P,
|
||
addRow: E,
|
||
removeRow: I,
|
||
getEditableRow: x,
|
||
activeCols: T,
|
||
hasDirty: W,
|
||
getEditableCell: b,
|
||
eachRows: s,
|
||
eachCells: u,
|
||
validate: oe,
|
||
getCleanTableData: re,
|
||
getActiveRows: Q
|
||
}
|
||
};
|
||
}
|
||
function Zd(e) {
|
||
const t = (o, r) => et(e, `value[${o}].${r}`);
|
||
Ut("componentRef:get", t);
|
||
const n = (o, r, a) => We(e, `value[${o}].${r}`, a);
|
||
return Ut("componentRef:set", n), {
|
||
getter: t,
|
||
setter: n
|
||
};
|
||
}
|
||
function ef({
|
||
props: e,
|
||
ui: t,
|
||
sortedColumns: n,
|
||
renderRowHandle: o,
|
||
renderCellComponent: r,
|
||
componentDefines: a
|
||
}) {
|
||
const {
|
||
tableComp: i,
|
||
tableColumnComp: s,
|
||
tableColumnGroupComp: u
|
||
} = a;
|
||
t.tableColumn;
|
||
const l = {}, c = (d) => {
|
||
const h = {
|
||
...d.columnSlots
|
||
}, f = "cell_" + d.key;
|
||
let v = s;
|
||
if (d.children)
|
||
h.default = () => {
|
||
const y = [];
|
||
return G(d.children, (b) => {
|
||
b.show !== !1 && y.push(c(b));
|
||
}), y;
|
||
}, v = u;
|
||
else if (d.type != null) {
|
||
de.debug("cell render column.type:", d.type);
|
||
const y = e.cellSlots && e.cellSlots[f];
|
||
y && (h.default = y);
|
||
} else
|
||
h.default = (y) => y == null ? L("div", null, [St("1111")]) : r(d, y);
|
||
const p = {
|
||
...d
|
||
};
|
||
return delete p.children, L(v, H({
|
||
ref: "tableColumnRef"
|
||
}, p, {
|
||
label: d.title,
|
||
prop: d.key,
|
||
dataIndex: d.key
|
||
}), h);
|
||
};
|
||
return l.default = () => {
|
||
var h;
|
||
const d = [];
|
||
if (G(n, (f) => {
|
||
f.show !== !1 && d.push(c(f));
|
||
}), e.rowHandle && e.rowHandle.show !== !1) {
|
||
const f = {
|
||
default: o,
|
||
...(h = e.rowHandle) == null ? void 0 : h.columnSlots
|
||
};
|
||
d.push(L(s, H({
|
||
ref: "tableColumnRef"
|
||
}, e.rowHandle, {
|
||
label: e.rowHandle.title,
|
||
prop: e.rowHandle.key || "rowHandle"
|
||
}), f));
|
||
}
|
||
return d;
|
||
}, e.slots && G(e.slots, (d, h) => {
|
||
l[h] = d;
|
||
}), l;
|
||
}
|
||
function Si(e, t) {
|
||
var c;
|
||
const {
|
||
props: n,
|
||
renderRowHandle: o,
|
||
renderCellComponent: r,
|
||
sortedColumns: a
|
||
} = e, {
|
||
ui: i
|
||
} = Ce(), s = a ?? {}, u = [];
|
||
let l = i.table;
|
||
n.tableVersion === "v2" && (l = i.tableV2);
|
||
for (const d in s) {
|
||
const h = s[d];
|
||
if (h.show === !1)
|
||
continue;
|
||
const f = {
|
||
...h
|
||
};
|
||
if (f._parent = t, f.dataIndex = h.key, u.push(f), h.children != null) {
|
||
const p = {
|
||
...e,
|
||
sortedColumns: h.children
|
||
};
|
||
delete p.renderRowHandle, f.children = Si(p, f);
|
||
} else if (h.type == null) {
|
||
const p = f[l.renderMethod], y = {
|
||
...f
|
||
};
|
||
delete y[l.renderMethod], p ? f[l.renderMethod] = (b, F, R) => {
|
||
const D = l.rebuildRenderScope(b, F, R);
|
||
return p(D, () => r(y, D));
|
||
} : f[l.renderMethod] = (b, F, R) => {
|
||
const D = l.rebuildRenderScope(b, F, R);
|
||
return r(y, D);
|
||
};
|
||
}
|
||
}
|
||
if (o && ((c = n.rowHandle) == null ? void 0 : c.show) !== !1) {
|
||
const d = {
|
||
key: "_rowHandle",
|
||
...n.rowHandle
|
||
};
|
||
d[l.renderMethod] = (h, f, v) => {
|
||
const p = l.rebuildRenderScope(h, f, v);
|
||
return o(p);
|
||
}, u.push(d);
|
||
}
|
||
return de.debug("table columns:", u), u;
|
||
}
|
||
const tf = /* @__PURE__ */ ue({
|
||
name: "FsTable",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
tableVersion: {
|
||
type: String
|
||
},
|
||
/**
|
||
* table插槽
|
||
*/
|
||
slots: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 单元格插槽
|
||
*/
|
||
cellSlots: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 列配置,支持el-table-column|a-table-column配置
|
||
*/
|
||
columns: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 操作列
|
||
*/
|
||
rowHandle: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 是否显示表格
|
||
*/
|
||
show: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 表格数据
|
||
*/
|
||
data: {
|
||
type: Array,
|
||
default: () => []
|
||
},
|
||
conditionalRender: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 行编辑,批量编辑
|
||
*/
|
||
editable: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
loading: {
|
||
type: Boolean,
|
||
default: !1
|
||
},
|
||
/**
|
||
* 当前sort状态
|
||
*/
|
||
sort: {
|
||
type: Object
|
||
},
|
||
request: {
|
||
type: Object
|
||
},
|
||
rowKey: {
|
||
type: [String, Function],
|
||
default: "id"
|
||
}
|
||
},
|
||
emits: ["row-handle", "value-change", "pagination-change", "filter-change", "sort-change", "data-change"],
|
||
setup(e, t) {
|
||
const n = K(), o = K([]);
|
||
Zd(o);
|
||
const r = (E, M) => {
|
||
if (!M || E == null || E > o.value.length)
|
||
return;
|
||
const T = o.value[E][M];
|
||
return T == null ? void 0 : T.getTargetRef();
|
||
}, {
|
||
ui: a
|
||
} = Ce(), i = Jo();
|
||
lt(() => e.data, (E) => {
|
||
t.emit("data-change", {
|
||
data: E
|
||
});
|
||
});
|
||
let s = a.table, u = a.tableColumn;
|
||
e.tableVersion === "v2" && (s = a.tableV2, u = a.tableColumnV2);
|
||
function l(E = 0) {
|
||
s.scrollTo({
|
||
top: E,
|
||
tableRef: n,
|
||
fsTableRef: i
|
||
});
|
||
}
|
||
const c = z(s.name), d = Qd(e, t, n), h = (E, M) => {
|
||
const I = M[u.row], T = I, x = M[u.index];
|
||
return M.index = x, {
|
||
...M,
|
||
key: E.key,
|
||
value: et(I, E.key),
|
||
row: I,
|
||
form: T,
|
||
getComponentRef: (Q) => r(x, Q)
|
||
};
|
||
};
|
||
function f(E) {
|
||
t.emit("row-handle", E);
|
||
}
|
||
const v = s.onChange({
|
||
onSortChange: (E) => {
|
||
t.emit("sort-change", E);
|
||
},
|
||
onFilterChange: (E) => {
|
||
t.emit("filter-change", E);
|
||
},
|
||
onPagination: () => {
|
||
},
|
||
bubbleUp: (E) => {
|
||
E(t.attrs);
|
||
}
|
||
}), p = (E) => {
|
||
E == null && (E = {}), E.index = E[u.index];
|
||
const M = "cell-rowHandle", I = {};
|
||
if (e.cellSlots)
|
||
for (const T in e.cellSlots)
|
||
T.startsWith(M) && (I[T] = e.cellSlots[T]);
|
||
return L(J("fs-row-handle"), H(e.rowHandle, {
|
||
scope: E,
|
||
onHandle: f
|
||
}), I);
|
||
}, y = (E, M) => {
|
||
var C, _, S, O, X, le, ie, fe, Se, qe, Qe, Z;
|
||
const I = "cell_" + E.key;
|
||
M == null && (M = {});
|
||
const T = (M.row = M[u.row]) || {}, x = {
|
||
modelValue: et(M[u.row], E.key),
|
||
"onUpdate:modelValue": (ge) => {
|
||
var Fe;
|
||
We(M[u.row], E.key, ge);
|
||
const Oe = h(E, M);
|
||
t.emit("value-change", Oe), E.valueChange && (E.valueChange instanceof Function ? E.valueChange(Oe) : (Fe = E.valueChange) == null || Fe.handle(Oe));
|
||
}
|
||
}, Q = (ge) => {
|
||
const Oe = M[u.index], Fe = E.key;
|
||
let Ge = o.value[Oe];
|
||
Ge == null && (o.value[Oe] = Ge = {}), Ge[Fe] = ge;
|
||
}, oe = M[u.index], ye = T[(C = e.editable) == null ? void 0 : C.rowKey], re = e.cellSlots && e.cellSlots[I], m = h(E, M);
|
||
if (((O = (S = (_ = d.editable) == null ? void 0 : _.options) == null ? void 0 : S.value) == null ? void 0 : O.enabled) === !0) {
|
||
const ge = d.editable.getEditableCell(ye, E.key);
|
||
return L(J("fs-editable-cell"), H({
|
||
ref: Q,
|
||
key: E.key,
|
||
columnKey: E.key,
|
||
index: oe,
|
||
editableId: ye,
|
||
item: E,
|
||
editableCell: ge,
|
||
editableOpts: (le = (X = d.editable) == null ? void 0 : X.options) == null ? void 0 : le.value,
|
||
scope: m,
|
||
slots: re,
|
||
disabled: (Se = (fe = (ie = d.editable) == null ? void 0 : ie.options) == null ? void 0 : fe.value) == null ? void 0 : Se.disabled,
|
||
readonly: (Z = (Qe = (qe = d.editable) == null ? void 0 : qe.options) == null ? void 0 : Qe.value) == null ? void 0 : Z.readonly
|
||
}, x), null);
|
||
} else
|
||
return L(J("fs-cell"), H({
|
||
ref: Q,
|
||
key: E.key,
|
||
item: E,
|
||
scope: m,
|
||
slots: re
|
||
}, x, {
|
||
conditionalRender: e.conditionalRender
|
||
}), null);
|
||
}, {
|
||
expose: b
|
||
} = t;
|
||
b({
|
||
tableRef: n,
|
||
componentRefs: o,
|
||
getComponentRef: r,
|
||
...d,
|
||
scrollTo: l
|
||
});
|
||
const {
|
||
doColumnsSort: F
|
||
} = ta(), R = s.renderMode, D = B(() => ({
|
||
[s.data]: e.data
|
||
})), {
|
||
merge: A,
|
||
cloneDeep: $
|
||
} = $e(), P = B(() => {
|
||
let E = e.rowKey;
|
||
return a.type === "naive" && typeof e.rowKey == "string" && (E = (M) => M[e.rowKey]), A({
|
||
rowKey: E
|
||
}, t.attrs, v);
|
||
}), W = B(() => F($(e.columns))), k = z(a.tableColumn.name), Y = z(a.tableColumnGroup.name), ce = {
|
||
tableComp: c,
|
||
tableColumnComp: k,
|
||
tableColumnGroupComp: Y
|
||
};
|
||
if (R === "slot") {
|
||
const E = B(() => ef({
|
||
props: e,
|
||
ui: a,
|
||
sortedColumns: W.value,
|
||
renderRowHandle: p,
|
||
renderCellComponent: y,
|
||
componentDefines: ce
|
||
}));
|
||
return () => {
|
||
if (e.show === !1)
|
||
return;
|
||
const M = L(c, H({
|
||
ref: n,
|
||
loading: e.loading
|
||
}, P.value, D.value), E.value);
|
||
if (typeof s.vLoading == "string") {
|
||
const I = is(s.vLoading);
|
||
return zr(M, [[I, e.loading]]);
|
||
}
|
||
return M;
|
||
};
|
||
} else {
|
||
const E = B(() => Si({
|
||
props: e,
|
||
ctx: t,
|
||
ui: a,
|
||
getContextFn: h,
|
||
sortedColumns: W.value,
|
||
componentRefs: o,
|
||
renderRowHandle: p,
|
||
renderCellComponent: y,
|
||
columns: e.columns
|
||
})), M = B(() => {
|
||
const T = [];
|
||
function x(Q) {
|
||
Q.forEach((oe) => {
|
||
oe.children ? x(oe.children) : T.push(oe);
|
||
});
|
||
}
|
||
return x(E.value), T;
|
||
}), I = B(() => s.buildMultiHeadersBind ? s.buildMultiHeadersBind({
|
||
treeColumns: E.value,
|
||
flatColumns: M.value
|
||
}) : {
|
||
bind: {},
|
||
slots: {}
|
||
});
|
||
return () => {
|
||
var oe;
|
||
if (e.show === !1)
|
||
return;
|
||
const T = {
|
||
...e.slots,
|
||
...(oe = I.value) == null ? void 0 : oe.slots
|
||
}, x = s.columnsIsFlat, Q = (ye = {}) => {
|
||
var re;
|
||
return L(c, H({
|
||
ref: n,
|
||
loading: e.loading
|
||
}, P.value, {
|
||
columns: x ? M.value : E.value
|
||
}, D.value, (re = I.value) == null ? void 0 : re.bind, ye), T);
|
||
};
|
||
if (e.tableVersion === "v2" && a.type === "element") {
|
||
const ye = {
|
||
default({
|
||
width: re,
|
||
height: m
|
||
}) {
|
||
return Q({
|
||
width: re,
|
||
height: m
|
||
});
|
||
}
|
||
};
|
||
return L(J("el-auto-resizer"), null, ye);
|
||
}
|
||
return Q();
|
||
};
|
||
}
|
||
}
|
||
}), nf = /* @__PURE__ */ ue({
|
||
name: "FsCell",
|
||
props: {
|
||
item: {},
|
||
/**
|
||
* scope
|
||
*/
|
||
scope: {
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {},
|
||
/**
|
||
* 条件渲染,符合条件的情况下优先渲染
|
||
*/
|
||
conditionalRender: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup(e, t) {
|
||
const {
|
||
doComputed: n
|
||
} = Vt(), {
|
||
ui: o
|
||
} = Ce(), i = n(() => ({
|
||
component: e.item.component
|
||
}), () => e.scope, null, (h) => h.component), s = K();
|
||
function u() {
|
||
return s.value.getTargetRef();
|
||
}
|
||
t.expose({
|
||
getTargetRef: u,
|
||
targetRef: s
|
||
});
|
||
const l = B(() => {
|
||
let h = e.item.showTitle;
|
||
const f = e.scope.value;
|
||
return h === !0 && (h = f), h;
|
||
}), c = B(() => (f) => L("span", {
|
||
class: "fs-cell",
|
||
title: l.value
|
||
}, [f])), d = () => {
|
||
var y, b;
|
||
const h = e.scope.value, f = c.value, v = {
|
||
...e.scope,
|
||
props: e.item
|
||
}, p = e.item.conditionalRender ?? e.conditionalRender;
|
||
if (p && p.match && p.match(v))
|
||
return f(p.render(v));
|
||
if (e.slots)
|
||
return f(e.slots(v));
|
||
if (e.item.formatter)
|
||
return f(e.item.formatter(v));
|
||
if (e.item.cellRender)
|
||
return f(e.item.cellRender(v));
|
||
if (e.item.render)
|
||
console.warn("column.render 配置已废弃,请使用column.cellRender代替");
|
||
else
|
||
return (y = i.value) != null && y.name ? ((b = i.value) == null ? void 0 : b.show) === !1 ? void 0 : L(J("fs-component-render"), H({
|
||
title: l.value,
|
||
ref: s
|
||
}, i.value, {
|
||
scope: v
|
||
}), null) : f(ys(h));
|
||
};
|
||
if (e.item.tooltip) {
|
||
const h = z(o.tooltip.name);
|
||
return () => {
|
||
let f = {}, v = {};
|
||
typeof e.item.tooltip == "object" ? (f = _n(e.item.tooltip, "slots"), v = {
|
||
...e.item.tooltip.slots
|
||
}) : v[o.tooltip.content] = () => e.item.tooltip === !0 ? l.value ?? e.scope.value : typeof e.item.tooltip == "function" ? e.item.tooltip({
|
||
...e.scope
|
||
}) : e.item.tooltip;
|
||
const p = {
|
||
...v,
|
||
[o.tooltip.trigger]: () => d()
|
||
};
|
||
return L(h, f, p);
|
||
};
|
||
} else
|
||
return d;
|
||
}
|
||
}), of = /* @__PURE__ */ ue({
|
||
name: "FsEditableCell",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 组件配置
|
||
*/
|
||
item: {},
|
||
scope: {},
|
||
index: {},
|
||
editableId: {},
|
||
columnKey: {},
|
||
editableCell: {
|
||
type: Object
|
||
},
|
||
editableOpts: {
|
||
type: Object
|
||
},
|
||
slots: {},
|
||
disabled: {},
|
||
readonly: {}
|
||
},
|
||
setup(e, t) {
|
||
Le.get();
|
||
const {
|
||
doComputed: n
|
||
} = Vt();
|
||
if (e.index === -1)
|
||
return () => {
|
||
};
|
||
const r = n(() => {
|
||
var f;
|
||
return (f = e.editableCell) == null ? void 0 : f.getForm();
|
||
}, () => e.scope), a = B(() => {
|
||
var f;
|
||
return r.value && r.value.show !== !1 && ((f = e.editableCell) == null ? void 0 : f.isEditable());
|
||
});
|
||
function i(f) {
|
||
f && a.value && e.editableCell.active();
|
||
}
|
||
async function s() {
|
||
var f;
|
||
if (((f = e.editableOpts) == null ? void 0 : f.mode) === "free") {
|
||
await e.editableCell.persist();
|
||
return;
|
||
}
|
||
await e.editableCell.save();
|
||
}
|
||
function u() {
|
||
e.editableCell.cancel();
|
||
}
|
||
const l = B(() => {
|
||
var f, v;
|
||
return (((f = e.editableOpts) == null ? void 0 : f.mode) === "cell" || ((v = e.editableOpts) == null ? void 0 : v.mode) === "free") && e.editableCell.showAction !== !1;
|
||
}), c = B(() => e.editableCell.isChanged && e.editableCell.isChanged()), d = () => e.scope, h = {
|
||
default: () => L(J("fs-cell"), H({
|
||
ref: "targetRef",
|
||
item: e.item,
|
||
scope: e.scope,
|
||
slots: e.slots
|
||
}, t.attrs), null),
|
||
edit: () => {
|
||
var v, p;
|
||
let f = null;
|
||
return (v = e.editableCell) != null && v.isEditing && (r.value.blank === !1 || ((p = r.value.component) == null ? void 0 : p.show) === !1 ? f = null : r.value.conditionalRender && r.value.conditionalRender.match && r.value.conditionalRender.match(d()) ? f = L(J("fs-render"), H({
|
||
"render-func": r.value.conditionalRender.render,
|
||
scope: d()
|
||
}, t.attrs), null) : r.value.render ? f = L(J("fs-render"), H({
|
||
"render-func": r.value.render,
|
||
scope: d()
|
||
}, t.attrs), null) : f = L(J("fs-component-render"), H({
|
||
ref: "targetInputRef"
|
||
}, r.value.component, t.attrs, {
|
||
scope: e.scope
|
||
}), null)), f;
|
||
}
|
||
};
|
||
return () => {
|
||
var p;
|
||
if (!a.value || e.disabled || e.readonly)
|
||
return L(J("fs-cell"), H({
|
||
ref: "targetRef",
|
||
item: e.item,
|
||
scope: e.scope
|
||
}, t.attrs), null);
|
||
const f = e.editableCell, v = l.value ? (p = e.editableOpts) == null ? void 0 : p.activeTrigger : !1;
|
||
return L(J("fs-editable"), {
|
||
ref: "editableRef",
|
||
class: "fs-editable-cell",
|
||
editing: f == null ? void 0 : f.isEditing,
|
||
showAction: l.value,
|
||
dirty: c.value,
|
||
"onUpdate:editing": i,
|
||
onSubmit: s,
|
||
onCancel: u,
|
||
loading: f == null ? void 0 : f.loading,
|
||
trigger: v,
|
||
validateErrors: f == null ? void 0 : f.validateErrors
|
||
}, h);
|
||
};
|
||
},
|
||
methods: {
|
||
getTargetRef() {
|
||
var e;
|
||
return ((e = this.$refs.targetInputRef) == null ? void 0 : e.getTargetRef()) || this.$refs.targetRef;
|
||
}
|
||
}
|
||
}), rf = { class: "fs-editable" }, af = { class: "fs-editable-input" }, sf = {
|
||
key: 0,
|
||
class: "fs-editable-dirty"
|
||
}, lf = {
|
||
key: 0,
|
||
class: "fs-editable-action fs-editable-icon"
|
||
}, uf = { class: "fs-editable-input" }, cf = { class: "fs-editable-action" }, df = { class: "error-icon" }, ff = /* @__PURE__ */ ue({
|
||
__name: "fs-editable",
|
||
props: {
|
||
disabled: { type: Boolean, default: !1 },
|
||
editing: { type: Boolean, default: !1 },
|
||
dirty: { type: Boolean, default: !1 },
|
||
trigger: { type: [String, Boolean], default: "onClick" },
|
||
loading: { type: Boolean, default: !1 },
|
||
showAction: { type: Boolean, default: !0 },
|
||
validateErrors: { default: () => [] }
|
||
},
|
||
emits: ["update:editing", "submit", "cancel"],
|
||
setup(e, { emit: t }) {
|
||
const n = e, { ui: o } = Ce(), r = t, a = B(() => n.trigger ? {
|
||
[n.trigger]: () => {
|
||
r("update:editing", !0);
|
||
}
|
||
} : {});
|
||
function i() {
|
||
r("submit");
|
||
}
|
||
function s() {
|
||
r("cancel");
|
||
}
|
||
function u() {
|
||
var c;
|
||
return ((c = n.validateErrors) == null ? void 0 : c.length) > 0;
|
||
}
|
||
function l() {
|
||
var c, d;
|
||
if (((c = n.validateErrors) == null ? void 0 : c.length) !== 0)
|
||
return (d = n.validateErrors) == null ? void 0 : d.map((h) => h.message).join(",");
|
||
}
|
||
return (c, d) => {
|
||
const h = J("fs-icon");
|
||
return w(), j("div", rf, [
|
||
!c.editing || c.disabled ? (w(), j("div", H({
|
||
key: 0,
|
||
class: "fs-editable-inner fs-editable-pointer"
|
||
}, a.value), [
|
||
ee("div", af, [
|
||
c.dirty ? (w(), j("div", sf)) : ne("", !0),
|
||
ae(c.$slots, "default")
|
||
]),
|
||
c.trigger && !c.disabled ? (w(), j("div", lf, [
|
||
L(h, {
|
||
icon: q(o).icons.edit
|
||
}, null, 8, ["icon"])
|
||
])) : ne("", !0)
|
||
], 16)) : (w(), j("div", {
|
||
key: 1,
|
||
class: _t(["fs-editable-inner", { "fs-validate-error": u() }])
|
||
}, [
|
||
ee("div", uf, [
|
||
ae(c.$slots, "edit")
|
||
]),
|
||
ee("div", cf, [
|
||
(w(), V(z(q(o).tooltip.name), null, {
|
||
[q(o).tooltip.content]: N(() => [
|
||
ee("span", df, xe(l()), 1)
|
||
]),
|
||
[q(o).tooltip.trigger]: N(() => [
|
||
L(h, {
|
||
class: _t({ hidden: !u(), "error-icon": !0 }),
|
||
size: "mini",
|
||
icon: q(o).icons.info
|
||
}, null, 8, ["class", "icon"])
|
||
]),
|
||
_: 2
|
||
}, 1024)),
|
||
c.showAction ? (w(), j(we, { key: 0 }, [
|
||
c.loading ? (w(), V(h, {
|
||
key: 0,
|
||
size: "mini",
|
||
spin: !0,
|
||
icon: q(o).icons.refresh
|
||
}, null, 8, ["icon"])) : (w(), V(h, {
|
||
key: 1,
|
||
size: "mini",
|
||
icon: q(o).icons.check,
|
||
onClick: i
|
||
}, null, 8, ["icon"])),
|
||
L(h, {
|
||
class: _t({ hidden: c.loading }),
|
||
size: "mini",
|
||
icon: q(o).icons.close,
|
||
onClick: s
|
||
}, null, 8, ["class", "icon"])
|
||
], 64)) : ne("", !0)
|
||
])
|
||
], 2))
|
||
]);
|
||
};
|
||
}
|
||
});
|
||
const hf = ue({
|
||
name: "FsActionbar",
|
||
props: {
|
||
/**
|
||
* 按钮配置
|
||
* {
|
||
* add:{
|
||
* ...FsButton,
|
||
* show:true
|
||
* },
|
||
* custom:{...}
|
||
* }
|
||
*/
|
||
buttons: {}
|
||
},
|
||
emits: ["action"],
|
||
setup(e, t) {
|
||
function n(r, a, i) {
|
||
const s = { key: r, btn: a, $event: i, loadingRef: i == null ? void 0 : i.loadingRef };
|
||
if (a.click) {
|
||
a.click(s);
|
||
return;
|
||
}
|
||
if (a.onClick) {
|
||
a.onClick(s);
|
||
return;
|
||
}
|
||
t.emit("action", s);
|
||
}
|
||
const o = B(() => {
|
||
let r = [];
|
||
for (let i in e.buttons)
|
||
r.push({
|
||
// @ts-ignore
|
||
...e.buttons[i],
|
||
_key: i
|
||
});
|
||
r = Sn(r, (i) => i.order ?? cn.orderDefault);
|
||
const a = {};
|
||
return r.forEach((i) => {
|
||
let s = i._key;
|
||
delete i._key, a[s] = i;
|
||
}), a;
|
||
});
|
||
return {
|
||
onClick: n,
|
||
computedButtons: o
|
||
};
|
||
}
|
||
});
|
||
const mf = { class: "fs-actionbar" };
|
||
function pf(e, t, n, o, r, a) {
|
||
const i = J("fs-button");
|
||
return w(), j("div", mf, [
|
||
(w(!0), j(we, null, Ee(e.computedButtons, (s, u) => (w(), j(we, { key: u }, [
|
||
s.show !== !1 ? (w(), V(i, H({
|
||
key: 0,
|
||
ref_for: !0
|
||
}, s, {
|
||
onClick: (l) => e.onClick(u, s, l)
|
||
}), null, 16, ["onClick"])) : ne("", !0)
|
||
], 64))), 128))
|
||
]);
|
||
}
|
||
const gf = /* @__PURE__ */ Te(hf, [["render", pf]]);
|
||
class Fp {
|
||
constructor() {
|
||
/**
|
||
* 是否执行valueChange
|
||
*/
|
||
se(this, "valueChange");
|
||
se(this, "mergeForm");
|
||
}
|
||
}
|
||
const na = "ColumnsFilterContext", vf = /* @__PURE__ */ ue({
|
||
__name: "index",
|
||
props: {
|
||
container: { default: () => ({ is: "fs-columns-filter-layout-default" }) },
|
||
is: {},
|
||
show: { type: Boolean },
|
||
mode: { default: "default" },
|
||
columns: {},
|
||
originalColumns: {},
|
||
storage: { type: [Boolean, String, Object], default: !0 },
|
||
text: {},
|
||
onReset: {},
|
||
onSubmit: {}
|
||
},
|
||
emits: ["update:columns", "update:show", "reset", "submit"],
|
||
setup(e, { expose: t, emit: n }) {
|
||
const o = e, r = n, { t: a } = ut(), i = Le.get(), s = K(!1), u = () => {
|
||
s.value = !0;
|
||
}, l = B(() => F(o.originalColumns)), c = K([]), d = B(() => {
|
||
const m = {};
|
||
return p(l.value, (C) => {
|
||
m[C.__key] = C;
|
||
}), m;
|
||
}), { merge: h, cloneDeep: f } = $e(), v = B(() => {
|
||
const m = {
|
||
title: a("fs.toolbar.columnFilter.title"),
|
||
fixed: a("fs.toolbar.columnFilter.fixed"),
|
||
order: a("fs.toolbar.columnFilter.order"),
|
||
reset: a("fs.toolbar.columnFilter.reset"),
|
||
confirm: a("fs.toolbar.columnFilter.confirm"),
|
||
unnamed: a("fs.toolbar.columnFilter.unnamed")
|
||
};
|
||
return h(m, o.text), m;
|
||
});
|
||
function p(m, C) {
|
||
if (m)
|
||
if (Array.isArray(m))
|
||
for (const _ of m)
|
||
C(_), _.children && p(_.children, C);
|
||
else
|
||
for (const _ in m) {
|
||
const S = m[_];
|
||
C(S), S.children && p(S.children, C);
|
||
}
|
||
}
|
||
function y(m) {
|
||
return {
|
||
key: m.key,
|
||
title: m.title,
|
||
fixed: m.fixed ?? !1,
|
||
show: m.show ?? !0,
|
||
__show: m.columnSetShow !== !1,
|
||
__disabled: m.columnSetDisabled ?? !1
|
||
};
|
||
}
|
||
function b(m) {
|
||
const C = {};
|
||
return G(m, (_) => {
|
||
const S = _n(_, "children", "__show", "__disabled", "__parent", "__key");
|
||
_.children && _.children.length > 0 && (S.children = b(_.children)), C[_.key] = S;
|
||
}), C;
|
||
}
|
||
function F(m, C) {
|
||
const _ = [];
|
||
return G(m, (S) => {
|
||
const O = y(S);
|
||
O.__parent = C, O.__key = `${(C == null ? void 0 : C.key) || ""}.${S.key}`, _.push(O), S.children && (O.children = F(S.children, O));
|
||
}), _;
|
||
}
|
||
function R(m) {
|
||
c.value = F(m);
|
||
}
|
||
async function D() {
|
||
c.value = F(o.originalColumns), await A(!0), await x(), r("reset");
|
||
}
|
||
async function A(m = !1) {
|
||
m || await I(c.value);
|
||
const C = f(c.value);
|
||
return p(C, (_) => {
|
||
_ && (delete _.__disabled, delete _.__show, delete _.__parent, delete _.__key);
|
||
}), Y(C), s.value = !1, C;
|
||
}
|
||
async function $(m = !1) {
|
||
const C = await A(m);
|
||
r("submit", { columns: C });
|
||
}
|
||
const P = B(() => o.originalColumns);
|
||
Ut(na, {
|
||
originalColumns: P,
|
||
originalColumnsMap: d,
|
||
currentColumns: c,
|
||
text: v,
|
||
active: s,
|
||
submit: $,
|
||
reset: D
|
||
});
|
||
async function W() {
|
||
await $(!1), r("update:show", !1);
|
||
}
|
||
async function k() {
|
||
await D(), r("update:show", !1);
|
||
}
|
||
function Y(m) {
|
||
r("update:columns", b(m));
|
||
}
|
||
const ce = xn("get:crudBinding", () => ({ id: "" })), E = K();
|
||
function M() {
|
||
const m = typeof o.storage == "object" ? o.storage : null, C = typeof o.storage == "string" ? o.storage : "";
|
||
if (E.value == null) {
|
||
const _ = Ka();
|
||
E.value = new Yr({
|
||
$router: _,
|
||
tableName: "columnsFilter",
|
||
keyType: C,
|
||
remoteStorage: m
|
||
});
|
||
}
|
||
return E.value.id = ce().id, E.value;
|
||
}
|
||
async function I(m) {
|
||
if (o.storage === !1)
|
||
return;
|
||
const C = f(m);
|
||
p(C, (_) => {
|
||
delete _.__parent;
|
||
}), await M().updateTableValue(C);
|
||
}
|
||
async function T() {
|
||
if (o.storage !== !1)
|
||
return await M().getTableValue();
|
||
}
|
||
async function x() {
|
||
await M().clearTableValue();
|
||
}
|
||
function Q(m) {
|
||
const C = [];
|
||
p(m, (S) => {
|
||
const O = Wa(S, "key", "__show", "__disabled");
|
||
C.push(JSON.stringify(O));
|
||
}), C.sort();
|
||
let _ = "";
|
||
for (const S of C)
|
||
_ += S;
|
||
return _;
|
||
}
|
||
lt(
|
||
() => o.columns,
|
||
(m) => {
|
||
R(m);
|
||
}
|
||
);
|
||
const oe = async () => {
|
||
R(o.columns);
|
||
const m = await T();
|
||
if (m) {
|
||
const C = Q(m);
|
||
if (Q(l.value) !== C)
|
||
return;
|
||
c.value = m, await Me(), await $(!0);
|
||
}
|
||
};
|
||
async function ye(m) {
|
||
await m(c), await A();
|
||
}
|
||
lt(
|
||
() => l.value,
|
||
async (m) => {
|
||
await oe();
|
||
},
|
||
{
|
||
immediate: !0
|
||
}
|
||
), t({
|
||
start: u,
|
||
save: A,
|
||
update: ye,
|
||
original: l,
|
||
columns: c
|
||
});
|
||
function re(m) {
|
||
return m.label || m.title || m.key || v.value.unnamed;
|
||
}
|
||
return (m, C) => {
|
||
var S;
|
||
const _ = J("fs-button");
|
||
return m.mode === "simple" ? (w(), j(we, { key: 0 }, [
|
||
(w(), V(z(q(i).row.name), { class: "fs-table-columns-filter-simple" }, {
|
||
default: N(() => [
|
||
(w(!0), j(we, null, Ee(c.value, (O, X) => {
|
||
var le;
|
||
return zr((w(), V(z(q(i).col.name), {
|
||
key: X,
|
||
span: 6
|
||
}, {
|
||
default: N(() => {
|
||
var ie;
|
||
return [
|
||
(w(), V(z(q(i).checkbox.name), Be({
|
||
[q(i).checkbox.modelValue]: O.show,
|
||
["onUpdate:" + q(i).checkbox.modelValue]: (fe) => O.show = fe,
|
||
disabled: ((ie = l.value[O.key]) == null ? void 0 : ie.__disabled) === !0,
|
||
class: "item-label",
|
||
title: re(O)
|
||
}), {
|
||
default: N(() => [
|
||
St(xe(re(O)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040, ["disabled", "title"]))
|
||
];
|
||
}),
|
||
_: 2
|
||
}, 1024)), [
|
||
[qa, ((le = l.value[O.key]) == null ? void 0 : le.__show) !== !1]
|
||
]);
|
||
}), 128))
|
||
]),
|
||
_: 1
|
||
})),
|
||
(w(), V(z(q(i).divider.name))),
|
||
(w(), V(z(q(i).row.name), null, {
|
||
default: N(() => [
|
||
L(_, {
|
||
style: { "margin-right": "5px" },
|
||
type: "primary",
|
||
icon: q(i).icons.check,
|
||
text: v.value.confirm,
|
||
onClick: C[0] || (C[0] = (O) => W())
|
||
}, null, 8, ["icon", "text"]),
|
||
L(_, {
|
||
icon: q(i).icons.refresh,
|
||
text: v.value.reset,
|
||
onClick: k
|
||
}, null, 8, ["icon", "text"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
], 64)) : (w(), V(z(((S = m.container) == null ? void 0 : S.is) || "fs-columns-filter-layout-default"), Be(H({ key: 1 }, m.container)), {
|
||
buttons: N(() => [
|
||
(w(), V(z(q(i).row.name), {
|
||
class: "fs-drawer-footer",
|
||
gutter: 10
|
||
}, {
|
||
default: N(() => [
|
||
(w(), V(z(q(i).col.name), { span: 12 }, {
|
||
default: N(() => [
|
||
L(_, {
|
||
icon: q(i).icons.refresh,
|
||
text: v.value.reset,
|
||
block: "",
|
||
onClick: D
|
||
}, null, 8, ["icon", "text"])
|
||
]),
|
||
_: 1
|
||
})),
|
||
(w(), V(z(q(i).col.name), { span: 12 }, {
|
||
default: N(() => [
|
||
L(_, {
|
||
type: "primary",
|
||
icon: q(i).icons.check,
|
||
text: v.value.confirm,
|
||
block: "",
|
||
onClick: C[1] || (C[1] = (O) => $(!1))
|
||
}, null, 8, ["icon", "text"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
]),
|
||
_: 1
|
||
}))
|
||
]),
|
||
_: 1
|
||
}, 16));
|
||
};
|
||
}
|
||
});
|
||
const bf = ue({
|
||
name: "FsToolbar",
|
||
components: { FsTableColumnsFilter: vf },
|
||
props: {
|
||
/**
|
||
* 按钮配置
|
||
*{
|
||
* search:{}, 查询
|
||
* refresh:{}, 刷新
|
||
* compact:{}, 紧凑模式
|
||
* export:{}, 导出
|
||
* columns:{} 列设置
|
||
*}
|
||
**/
|
||
buttons: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 当前是否紧凑模式
|
||
*/
|
||
compact: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 列配置
|
||
*/
|
||
columns: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 是否保存用户列设置
|
||
* 传string则表示传入缓存的主key
|
||
*/
|
||
storage: {
|
||
type: [String, Boolean],
|
||
default: !0
|
||
},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {},
|
||
/**
|
||
* 列设置配置
|
||
*/
|
||
columnsFilter: {
|
||
type: Object
|
||
}
|
||
},
|
||
emits: ["update:columns"],
|
||
setup(e, t) {
|
||
ut();
|
||
const n = K(), { ui: o } = Ce(), { merge: r } = $e(), a = B(() => {
|
||
const u = {
|
||
columns: {
|
||
click: () => {
|
||
n.value.start();
|
||
}
|
||
}
|
||
};
|
||
r(u, e.buttons);
|
||
let l = [];
|
||
for (let d in u)
|
||
l.push({
|
||
...u[d],
|
||
_key: d
|
||
});
|
||
l = Sn(l, (d) => d.order ?? cn.orderDefault);
|
||
const c = {};
|
||
return l.forEach((d) => {
|
||
let h = d._key;
|
||
delete d._key, c[h] = d;
|
||
}), c;
|
||
}), i = K(!1);
|
||
return {
|
||
ui: o,
|
||
columnsFilterRef: n,
|
||
computedButtons: a,
|
||
popoverVisible: i,
|
||
handleSimpleClick: (u) => {
|
||
o.type !== "element" && (i.value = !i.value);
|
||
}
|
||
};
|
||
}
|
||
});
|
||
const yf = { class: "fs-toolbar" };
|
||
function wf(e, t, n, o, r, a) {
|
||
var s;
|
||
const i = J("fs-button");
|
||
return w(), j("div", yf, [
|
||
(w(!0), j(we, null, Ee(e.computedButtons, (u, l) => {
|
||
var c;
|
||
return w(), j(we, { key: l }, [
|
||
u.show !== !1 ? (w(), j(we, { key: 0 }, [
|
||
l === "columns" && e.columnsFilter && ((c = e.columnsFilter) == null ? void 0 : c.mode) === "simple" ? (w(), V(z(e.ui.popover.name), Be({
|
||
key: 0,
|
||
[e.ui.popover.visible]: e.popoverVisible,
|
||
["onUpdate:" + e.ui.popover.visible]: t[2] || (t[2] = (d) => e.popoverVisible = d),
|
||
"display-directive": "show",
|
||
placement: "bottom",
|
||
width: 760,
|
||
trigger: "click"
|
||
}), {
|
||
[e.ui.popover.triggerSlotName]: N(() => [
|
||
L(i, H({ ref_for: !0 }, u, { onClick: e.handleSimpleClick }), null, 16, ["onClick"])
|
||
]),
|
||
[e.ui.popover.contentSlotName]: N(() => [
|
||
e.columns ? (w(), V(z(e.columnsFilter.is || "fs-table-columns-filter"), H({
|
||
key: 0,
|
||
ref_for: !0,
|
||
ref: "columnsFilterRef",
|
||
show: e.popoverVisible,
|
||
"onUpdate:show": t[0] || (t[0] = (d) => e.popoverVisible = d),
|
||
mode: "simple"
|
||
}, { ref_for: !0 }, e.columnsFilter, {
|
||
columns: e.columns,
|
||
storage: e.storage,
|
||
"onUpdate:columns": t[1] || (t[1] = (d) => e.$emit("update:columns", d))
|
||
}), null, 16, ["show", "columns", "storage"])) : ne("", !0)
|
||
]),
|
||
_: 2
|
||
}, 1040)) : (w(), V(i, H({
|
||
key: 1,
|
||
ref_for: !0
|
||
}, u, {
|
||
onClick: (d) => u.click(d)
|
||
}), null, 16, ["onClick"]))
|
||
], 64)) : ne("", !0)
|
||
], 64);
|
||
}), 128)),
|
||
e.columns && ((s = e.columnsFilter) == null ? void 0 : s.mode) !== "simple" ? (w(), V(z(e.columnsFilter.is || "fs-table-columns-filter"), H({
|
||
key: 0,
|
||
ref: "columnsFilterRef",
|
||
storage: e.storage
|
||
}, e.columnsFilter, {
|
||
columns: e.columns,
|
||
"onUpdate:columns": t[3] || (t[3] = (u) => e.$emit("update:columns", u))
|
||
}), null, 16, ["storage", "columns"])) : ne("", !0)
|
||
]);
|
||
}
|
||
const _f = /* @__PURE__ */ Te(bf, [["render", wf]]);
|
||
/**!
|
||
* Sortable 1.14.0
|
||
* @author RubaXa <trash@rubaxa.org>
|
||
* @author owenm <owen23355@gmail.com>
|
||
* @license MIT
|
||
*/
|
||
function Ra(e, t) {
|
||
var n = Object.keys(e);
|
||
if (Object.getOwnPropertySymbols) {
|
||
var o = Object.getOwnPropertySymbols(e);
|
||
t && (o = o.filter(function(r) {
|
||
return Object.getOwnPropertyDescriptor(e, r).enumerable;
|
||
})), n.push.apply(n, o);
|
||
}
|
||
return n;
|
||
}
|
||
function Ht(e) {
|
||
for (var t = 1; t < arguments.length; t++) {
|
||
var n = arguments[t] != null ? arguments[t] : {};
|
||
t % 2 ? Ra(Object(n), !0).forEach(function(o) {
|
||
Cf(e, o, n[o]);
|
||
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Ra(Object(n)).forEach(function(o) {
|
||
Object.defineProperty(e, o, Object.getOwnPropertyDescriptor(n, o));
|
||
});
|
||
}
|
||
return e;
|
||
}
|
||
function Io(e) {
|
||
"@babel/helpers - typeof";
|
||
return typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? Io = function(t) {
|
||
return typeof t;
|
||
} : Io = function(t) {
|
||
return t && typeof Symbol == "function" && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t;
|
||
}, Io(e);
|
||
}
|
||
function Cf(e, t, n) {
|
||
return t in e ? Object.defineProperty(e, t, {
|
||
value: n,
|
||
enumerable: !0,
|
||
configurable: !0,
|
||
writable: !0
|
||
}) : e[t] = n, e;
|
||
}
|
||
function Gt() {
|
||
return Gt = Object.assign || function(e) {
|
||
for (var t = 1; t < arguments.length; t++) {
|
||
var n = arguments[t];
|
||
for (var o in n)
|
||
Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]);
|
||
}
|
||
return e;
|
||
}, Gt.apply(this, arguments);
|
||
}
|
||
function Sf(e, t) {
|
||
if (e == null)
|
||
return {};
|
||
var n = {}, o = Object.keys(e), r, a;
|
||
for (a = 0; a < o.length; a++)
|
||
r = o[a], !(t.indexOf(r) >= 0) && (n[r] = e[r]);
|
||
return n;
|
||
}
|
||
function Ff(e, t) {
|
||
if (e == null)
|
||
return {};
|
||
var n = Sf(e, t), o, r;
|
||
if (Object.getOwnPropertySymbols) {
|
||
var a = Object.getOwnPropertySymbols(e);
|
||
for (r = 0; r < a.length; r++)
|
||
o = a[r], !(t.indexOf(o) >= 0) && Object.prototype.propertyIsEnumerable.call(e, o) && (n[o] = e[o]);
|
||
}
|
||
return n;
|
||
}
|
||
var Rf = "1.14.0";
|
||
function Yt(e) {
|
||
if (typeof window < "u" && window.navigator)
|
||
return !!/* @__PURE__ */ navigator.userAgent.match(e);
|
||
}
|
||
var Xt = Yt(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i), vo = Yt(/Edge/i), Da = Yt(/firefox/i), Qn = Yt(/safari/i) && !Yt(/chrome/i) && !Yt(/android/i), Fi = Yt(/iP(ad|od|hone)/i), Df = Yt(/chrome/i) && Yt(/android/i), Ri = {
|
||
capture: !1,
|
||
passive: !1
|
||
};
|
||
function ke(e, t, n) {
|
||
e.addEventListener(t, n, !Xt && Ri);
|
||
}
|
||
function De(e, t, n) {
|
||
e.removeEventListener(t, n, !Xt && Ri);
|
||
}
|
||
function zo(e, t) {
|
||
if (t) {
|
||
if (t[0] === ">" && (t = t.substring(1)), e)
|
||
try {
|
||
if (e.matches)
|
||
return e.matches(t);
|
||
if (e.msMatchesSelector)
|
||
return e.msMatchesSelector(t);
|
||
if (e.webkitMatchesSelector)
|
||
return e.webkitMatchesSelector(t);
|
||
} catch {
|
||
return !1;
|
||
}
|
||
return !1;
|
||
}
|
||
}
|
||
function kf(e) {
|
||
return e.host && e !== document && e.host.nodeType ? e.host : e.parentNode;
|
||
}
|
||
function Mt(e, t, n, o) {
|
||
if (e) {
|
||
n = n || document;
|
||
do {
|
||
if (t != null && (t[0] === ">" ? e.parentNode === n && zo(e, t) : zo(e, t)) || o && e === n)
|
||
return e;
|
||
if (e === n)
|
||
break;
|
||
} while (e = kf(e));
|
||
}
|
||
return null;
|
||
}
|
||
var ka = /\s+/g;
|
||
function ft(e, t, n) {
|
||
if (e && t)
|
||
if (e.classList)
|
||
e.classList[n ? "add" : "remove"](t);
|
||
else {
|
||
var o = (" " + e.className + " ").replace(ka, " ").replace(" " + t + " ", " ");
|
||
e.className = (o + (n ? " " + t : "")).replace(ka, " ");
|
||
}
|
||
}
|
||
function me(e, t, n) {
|
||
var o = e && e.style;
|
||
if (o) {
|
||
if (n === void 0)
|
||
return document.defaultView && document.defaultView.getComputedStyle ? n = document.defaultView.getComputedStyle(e, "") : e.currentStyle && (n = e.currentStyle), t === void 0 ? n : n[t];
|
||
!(t in o) && t.indexOf("webkit") === -1 && (t = "-webkit-" + t), o[t] = n + (typeof n == "string" ? "" : "px");
|
||
}
|
||
}
|
||
function Tn(e, t) {
|
||
var n = "";
|
||
if (typeof e == "string")
|
||
n = e;
|
||
else
|
||
do {
|
||
var o = me(e, "transform");
|
||
o && o !== "none" && (n = o + " " + n);
|
||
} while (!t && (e = e.parentNode));
|
||
var r = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;
|
||
return r && new r(n);
|
||
}
|
||
function Di(e, t, n) {
|
||
if (e) {
|
||
var o = e.getElementsByTagName(t), r = 0, a = o.length;
|
||
if (n)
|
||
for (; r < a; r++)
|
||
n(o[r], r);
|
||
return o;
|
||
}
|
||
return [];
|
||
}
|
||
function qt() {
|
||
var e = document.scrollingElement;
|
||
return e || document.documentElement;
|
||
}
|
||
function Ke(e, t, n, o, r) {
|
||
if (!(!e.getBoundingClientRect && e !== window)) {
|
||
var a, i, s, u, l, c, d;
|
||
if (e !== window && e.parentNode && e !== qt() ? (a = e.getBoundingClientRect(), i = a.top, s = a.left, u = a.bottom, l = a.right, c = a.height, d = a.width) : (i = 0, s = 0, u = window.innerHeight, l = window.innerWidth, c = window.innerHeight, d = window.innerWidth), (t || n) && e !== window && (r = r || e.parentNode, !Xt))
|
||
do
|
||
if (r && r.getBoundingClientRect && (me(r, "transform") !== "none" || n && me(r, "position") !== "static")) {
|
||
var h = r.getBoundingClientRect();
|
||
i -= h.top + parseInt(me(r, "border-top-width")), s -= h.left + parseInt(me(r, "border-left-width")), u = i + a.height, l = s + a.width;
|
||
break;
|
||
}
|
||
while (r = r.parentNode);
|
||
if (o && e !== window) {
|
||
var f = Tn(r || e), v = f && f.a, p = f && f.d;
|
||
f && (i /= p, s /= v, d /= v, c /= p, u = i + c, l = s + d);
|
||
}
|
||
return {
|
||
top: i,
|
||
left: s,
|
||
bottom: u,
|
||
right: l,
|
||
width: d,
|
||
height: c
|
||
};
|
||
}
|
||
}
|
||
function Oa(e, t, n) {
|
||
for (var o = sn(e, !0), r = Ke(e)[t]; o; ) {
|
||
var a = Ke(o)[n], i = void 0;
|
||
if (n === "top" || n === "left" ? i = r >= a : i = r <= a, !i)
|
||
return o;
|
||
if (o === qt())
|
||
break;
|
||
o = sn(o, !1);
|
||
}
|
||
return !1;
|
||
}
|
||
function Nn(e, t, n, o) {
|
||
for (var r = 0, a = 0, i = e.children; a < i.length; ) {
|
||
if (i[a].style.display !== "none" && i[a] !== pe.ghost && (o || i[a] !== pe.dragged) && Mt(i[a], n.draggable, e, !1)) {
|
||
if (r === t)
|
||
return i[a];
|
||
r++;
|
||
}
|
||
a++;
|
||
}
|
||
return null;
|
||
}
|
||
function oa(e, t) {
|
||
for (var n = e.lastElementChild; n && (n === pe.ghost || me(n, "display") === "none" || t && !zo(n, t)); )
|
||
n = n.previousElementSibling;
|
||
return n || null;
|
||
}
|
||
function Ct(e, t) {
|
||
var n = 0;
|
||
if (!e || !e.parentNode)
|
||
return -1;
|
||
for (; e = e.previousElementSibling; )
|
||
e.nodeName.toUpperCase() !== "TEMPLATE" && e !== pe.clone && (!t || zo(e, t)) && n++;
|
||
return n;
|
||
}
|
||
function $a(e) {
|
||
var t = 0, n = 0, o = qt();
|
||
if (e)
|
||
do {
|
||
var r = Tn(e), a = r.a, i = r.d;
|
||
t += e.scrollLeft * a, n += e.scrollTop * i;
|
||
} while (e !== o && (e = e.parentNode));
|
||
return [t, n];
|
||
}
|
||
function Of(e, t) {
|
||
for (var n in e)
|
||
if (e.hasOwnProperty(n)) {
|
||
for (var o in t)
|
||
if (t.hasOwnProperty(o) && t[o] === e[n][o])
|
||
return Number(n);
|
||
}
|
||
return -1;
|
||
}
|
||
function sn(e, t) {
|
||
if (!e || !e.getBoundingClientRect)
|
||
return qt();
|
||
var n = e, o = !1;
|
||
do
|
||
if (n.clientWidth < n.scrollWidth || n.clientHeight < n.scrollHeight) {
|
||
var r = me(n);
|
||
if (n.clientWidth < n.scrollWidth && (r.overflowX == "auto" || r.overflowX == "scroll") || n.clientHeight < n.scrollHeight && (r.overflowY == "auto" || r.overflowY == "scroll")) {
|
||
if (!n.getBoundingClientRect || n === document.body)
|
||
return qt();
|
||
if (o || t)
|
||
return n;
|
||
o = !0;
|
||
}
|
||
}
|
||
while (n = n.parentNode);
|
||
return qt();
|
||
}
|
||
function $f(e, t) {
|
||
if (e && t)
|
||
for (var n in t)
|
||
t.hasOwnProperty(n) && (e[n] = t[n]);
|
||
return e;
|
||
}
|
||
function lr(e, t) {
|
||
return Math.round(e.top) === Math.round(t.top) && Math.round(e.left) === Math.round(t.left) && Math.round(e.height) === Math.round(t.height) && Math.round(e.width) === Math.round(t.width);
|
||
}
|
||
var Zn;
|
||
function ki(e, t) {
|
||
return function() {
|
||
if (!Zn) {
|
||
var n = arguments, o = this;
|
||
n.length === 1 ? e.call(o, n[0]) : e.apply(o, n), Zn = setTimeout(function() {
|
||
Zn = void 0;
|
||
}, t);
|
||
}
|
||
};
|
||
}
|
||
function Ef() {
|
||
clearTimeout(Zn), Zn = void 0;
|
||
}
|
||
function Oi(e, t, n) {
|
||
e.scrollLeft += t, e.scrollTop += n;
|
||
}
|
||
function $i(e) {
|
||
var t = window.Polymer, n = window.jQuery || window.Zepto;
|
||
return t && t.dom ? t.dom(e).cloneNode(!0) : n ? n(e).clone(!0)[0] : e.cloneNode(!0);
|
||
}
|
||
var yt = "Sortable" + (/* @__PURE__ */ new Date()).getTime();
|
||
function Tf() {
|
||
var e = [], t;
|
||
return {
|
||
captureAnimationState: function() {
|
||
if (e = [], !!this.options.animation) {
|
||
var o = [].slice.call(this.el.children);
|
||
o.forEach(function(r) {
|
||
if (!(me(r, "display") === "none" || r === pe.ghost)) {
|
||
e.push({
|
||
target: r,
|
||
rect: Ke(r)
|
||
});
|
||
var a = Ht({}, e[e.length - 1].rect);
|
||
if (r.thisAnimationDuration) {
|
||
var i = Tn(r, !0);
|
||
i && (a.top -= i.f, a.left -= i.e);
|
||
}
|
||
r.fromRect = a;
|
||
}
|
||
});
|
||
}
|
||
},
|
||
addAnimationState: function(o) {
|
||
e.push(o);
|
||
},
|
||
removeAnimationState: function(o) {
|
||
e.splice(Of(e, {
|
||
target: o
|
||
}), 1);
|
||
},
|
||
animateAll: function(o) {
|
||
var r = this;
|
||
if (!this.options.animation) {
|
||
clearTimeout(t), typeof o == "function" && o();
|
||
return;
|
||
}
|
||
var a = !1, i = 0;
|
||
e.forEach(function(s) {
|
||
var u = 0, l = s.target, c = l.fromRect, d = Ke(l), h = l.prevFromRect, f = l.prevToRect, v = s.rect, p = Tn(l, !0);
|
||
p && (d.top -= p.f, d.left -= p.e), l.toRect = d, l.thisAnimationDuration && lr(h, d) && !lr(c, d) && // Make sure animatingRect is on line between toRect & fromRect
|
||
(v.top - d.top) / (v.left - d.left) === (c.top - d.top) / (c.left - d.left) && (u = Af(v, h, f, r.options)), lr(d, c) || (l.prevFromRect = c, l.prevToRect = d, u || (u = r.options.animation), r.animate(l, v, d, u)), u && (a = !0, i = Math.max(i, u), clearTimeout(l.animationResetTimer), l.animationResetTimer = setTimeout(function() {
|
||
l.animationTime = 0, l.prevFromRect = null, l.fromRect = null, l.prevToRect = null, l.thisAnimationDuration = null;
|
||
}, u), l.thisAnimationDuration = u);
|
||
}), clearTimeout(t), a ? t = setTimeout(function() {
|
||
typeof o == "function" && o();
|
||
}, i) : typeof o == "function" && o(), e = [];
|
||
},
|
||
animate: function(o, r, a, i) {
|
||
if (i) {
|
||
me(o, "transition", ""), me(o, "transform", "");
|
||
var s = Tn(this.el), u = s && s.a, l = s && s.d, c = (r.left - a.left) / (u || 1), d = (r.top - a.top) / (l || 1);
|
||
o.animatingX = !!c, o.animatingY = !!d, me(o, "transform", "translate3d(" + c + "px," + d + "px,0)"), this.forRepaintDummy = If(o), me(o, "transition", "transform " + i + "ms" + (this.options.easing ? " " + this.options.easing : "")), me(o, "transform", "translate3d(0,0,0)"), typeof o.animated == "number" && clearTimeout(o.animated), o.animated = setTimeout(function() {
|
||
me(o, "transition", ""), me(o, "transform", ""), o.animated = !1, o.animatingX = !1, o.animatingY = !1;
|
||
}, i);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function If(e) {
|
||
return e.offsetWidth;
|
||
}
|
||
function Af(e, t, n, o) {
|
||
return Math.sqrt(Math.pow(t.top - e.top, 2) + Math.pow(t.left - e.left, 2)) / Math.sqrt(Math.pow(t.top - n.top, 2) + Math.pow(t.left - n.left, 2)) * o.animation;
|
||
}
|
||
var Dn = [], ur = {
|
||
initializeByDefault: !0
|
||
}, bo = {
|
||
mount: function(t) {
|
||
for (var n in ur)
|
||
ur.hasOwnProperty(n) && !(n in t) && (t[n] = ur[n]);
|
||
Dn.forEach(function(o) {
|
||
if (o.pluginName === t.pluginName)
|
||
throw "Sortable: Cannot mount plugin ".concat(t.pluginName, " more than once");
|
||
}), Dn.push(t);
|
||
},
|
||
pluginEvent: function(t, n, o) {
|
||
var r = this;
|
||
this.eventCanceled = !1, o.cancel = function() {
|
||
r.eventCanceled = !0;
|
||
};
|
||
var a = t + "Global";
|
||
Dn.forEach(function(i) {
|
||
n[i.pluginName] && (n[i.pluginName][a] && n[i.pluginName][a](Ht({
|
||
sortable: n
|
||
}, o)), n.options[i.pluginName] && n[i.pluginName][t] && n[i.pluginName][t](Ht({
|
||
sortable: n
|
||
}, o)));
|
||
});
|
||
},
|
||
initializePlugins: function(t, n, o, r) {
|
||
Dn.forEach(function(s) {
|
||
var u = s.pluginName;
|
||
if (!(!t.options[u] && !s.initializeByDefault)) {
|
||
var l = new s(t, n, t.options);
|
||
l.sortable = t, l.options = t.options, t[u] = l, Gt(o, l.defaults);
|
||
}
|
||
});
|
||
for (var a in t.options)
|
||
if (t.options.hasOwnProperty(a)) {
|
||
var i = this.modifyOption(t, a, t.options[a]);
|
||
typeof i < "u" && (t.options[a] = i);
|
||
}
|
||
},
|
||
getEventProperties: function(t, n) {
|
||
var o = {};
|
||
return Dn.forEach(function(r) {
|
||
typeof r.eventProperties == "function" && Gt(o, r.eventProperties.call(n[r.pluginName], t));
|
||
}), o;
|
||
},
|
||
modifyOption: function(t, n, o) {
|
||
var r;
|
||
return Dn.forEach(function(a) {
|
||
t[a.pluginName] && a.optionListeners && typeof a.optionListeners[n] == "function" && (r = a.optionListeners[n].call(t[a.pluginName], o));
|
||
}), r;
|
||
}
|
||
};
|
||
function Vf(e) {
|
||
var t = e.sortable, n = e.rootEl, o = e.name, r = e.targetEl, a = e.cloneEl, i = e.toEl, s = e.fromEl, u = e.oldIndex, l = e.newIndex, c = e.oldDraggableIndex, d = e.newDraggableIndex, h = e.originalEvent, f = e.putSortable, v = e.extraEventProperties;
|
||
if (t = t || n && n[yt], !!t) {
|
||
var p, y = t.options, b = "on" + o.charAt(0).toUpperCase() + o.substr(1);
|
||
window.CustomEvent && !Xt && !vo ? p = new CustomEvent(o, {
|
||
bubbles: !0,
|
||
cancelable: !0
|
||
}) : (p = document.createEvent("Event"), p.initEvent(o, !0, !0)), p.to = i || n, p.from = s || n, p.item = r || n, p.clone = a, p.oldIndex = u, p.newIndex = l, p.oldDraggableIndex = c, p.newDraggableIndex = d, p.originalEvent = h, p.pullMode = f ? f.lastPutMode : void 0;
|
||
var F = Ht(Ht({}, v), bo.getEventProperties(o, t));
|
||
for (var R in F)
|
||
p[R] = F[R];
|
||
n && n.dispatchEvent(p), y[b] && y[b].call(t, p);
|
||
}
|
||
}
|
||
var Pf = ["evt"], ct = function(t, n) {
|
||
var o = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, r = o.evt, a = Ff(o, Pf);
|
||
bo.pluginEvent.bind(pe)(t, n, Ht({
|
||
dragEl: U,
|
||
parentEl: je,
|
||
ghostEl: _e,
|
||
rootEl: Pe,
|
||
nextEl: pn,
|
||
lastDownEl: Ao,
|
||
cloneEl: Ne,
|
||
cloneHidden: on,
|
||
dragStarted: Yn,
|
||
putSortable: Ze,
|
||
activeSortable: pe.active,
|
||
originalEvent: r,
|
||
oldIndex: En,
|
||
oldDraggableIndex: eo,
|
||
newIndex: ht,
|
||
newDraggableIndex: nn,
|
||
hideGhostForTarget: Ai,
|
||
unhideGhostForTarget: Vi,
|
||
cloneNowHidden: function() {
|
||
on = !0;
|
||
},
|
||
cloneNowShown: function() {
|
||
on = !1;
|
||
},
|
||
dispatchSortableEvent: function(s) {
|
||
at({
|
||
sortable: n,
|
||
name: s,
|
||
originalEvent: r
|
||
});
|
||
}
|
||
}, a));
|
||
};
|
||
function at(e) {
|
||
Vf(Ht({
|
||
putSortable: Ze,
|
||
cloneEl: Ne,
|
||
targetEl: U,
|
||
rootEl: Pe,
|
||
oldIndex: En,
|
||
oldDraggableIndex: eo,
|
||
newIndex: ht,
|
||
newDraggableIndex: nn
|
||
}, e));
|
||
}
|
||
var U, je, _e, Pe, pn, Ao, Ne, on, En, ht, eo, nn, So, Ze, On = !1, Wo = !1, Uo = [], hn, Ft, cr, dr, Ea, Ta, Yn, kn, to, no = !1, Fo = !1, Vo, tt, fr = [], Mr = !1, Ko = [], nr = typeof document < "u", Ro = Fi, Ia = vo || Xt ? "cssFloat" : "float", Mf = nr && !Df && !Fi && "draggable" in document.createElement("div"), Ei = function() {
|
||
if (nr) {
|
||
if (Xt)
|
||
return !1;
|
||
var e = document.createElement("x");
|
||
return e.style.cssText = "pointer-events:auto", e.style.pointerEvents === "auto";
|
||
}
|
||
}(), Ti = function(t, n) {
|
||
var o = me(t), r = parseInt(o.width) - parseInt(o.paddingLeft) - parseInt(o.paddingRight) - parseInt(o.borderLeftWidth) - parseInt(o.borderRightWidth), a = Nn(t, 0, n), i = Nn(t, 1, n), s = a && me(a), u = i && me(i), l = s && parseInt(s.marginLeft) + parseInt(s.marginRight) + Ke(a).width, c = u && parseInt(u.marginLeft) + parseInt(u.marginRight) + Ke(i).width;
|
||
if (o.display === "flex")
|
||
return o.flexDirection === "column" || o.flexDirection === "column-reverse" ? "vertical" : "horizontal";
|
||
if (o.display === "grid")
|
||
return o.gridTemplateColumns.split(" ").length <= 1 ? "vertical" : "horizontal";
|
||
if (a && s.float && s.float !== "none") {
|
||
var d = s.float === "left" ? "left" : "right";
|
||
return i && (u.clear === "both" || u.clear === d) ? "vertical" : "horizontal";
|
||
}
|
||
return a && (s.display === "block" || s.display === "flex" || s.display === "table" || s.display === "grid" || l >= r && o[Ia] === "none" || i && o[Ia] === "none" && l + c > r) ? "vertical" : "horizontal";
|
||
}, Bf = function(t, n, o) {
|
||
var r = o ? t.left : t.top, a = o ? t.right : t.bottom, i = o ? t.width : t.height, s = o ? n.left : n.top, u = o ? n.right : n.bottom, l = o ? n.width : n.height;
|
||
return r === s || a === u || r + i / 2 === s + l / 2;
|
||
}, jf = function(t, n) {
|
||
var o;
|
||
return Uo.some(function(r) {
|
||
var a = r[yt].options.emptyInsertThreshold;
|
||
if (!(!a || oa(r))) {
|
||
var i = Ke(r), s = t >= i.left - a && t <= i.right + a, u = n >= i.top - a && n <= i.bottom + a;
|
||
if (s && u)
|
||
return o = r;
|
||
}
|
||
}), o;
|
||
}, Ii = function(t) {
|
||
function n(a, i) {
|
||
return function(s, u, l, c) {
|
||
var d = s.options.group.name && u.options.group.name && s.options.group.name === u.options.group.name;
|
||
if (a == null && (i || d))
|
||
return !0;
|
||
if (a == null || a === !1)
|
||
return !1;
|
||
if (i && a === "clone")
|
||
return a;
|
||
if (typeof a == "function")
|
||
return n(a(s, u, l, c), i)(s, u, l, c);
|
||
var h = (i ? s : u).options.group.name;
|
||
return a === !0 || typeof a == "string" && a === h || a.join && a.indexOf(h) > -1;
|
||
};
|
||
}
|
||
var o = {}, r = t.group;
|
||
(!r || Io(r) != "object") && (r = {
|
||
name: r
|
||
}), o.name = r.name, o.checkPull = n(r.pull, !0), o.checkPut = n(r.put), o.revertClone = r.revertClone, t.group = o;
|
||
}, Ai = function() {
|
||
!Ei && _e && me(_e, "display", "none");
|
||
}, Vi = function() {
|
||
!Ei && _e && me(_e, "display", "");
|
||
};
|
||
nr && document.addEventListener("click", function(e) {
|
||
if (Wo)
|
||
return e.preventDefault(), e.stopPropagation && e.stopPropagation(), e.stopImmediatePropagation && e.stopImmediatePropagation(), Wo = !1, !1;
|
||
}, !0);
|
||
var mn = function(t) {
|
||
if (U) {
|
||
t = t.touches ? t.touches[0] : t;
|
||
var n = jf(t.clientX, t.clientY);
|
||
if (n) {
|
||
var o = {};
|
||
for (var r in t)
|
||
t.hasOwnProperty(r) && (o[r] = t[r]);
|
||
o.target = o.rootEl = n, o.preventDefault = void 0, o.stopPropagation = void 0, n[yt]._onDragOver(o);
|
||
}
|
||
}
|
||
}, Nf = function(t) {
|
||
U && U.parentNode[yt]._isOutsideThisEl(t.target);
|
||
};
|
||
function pe(e, t) {
|
||
if (!(e && e.nodeType && e.nodeType === 1))
|
||
throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(e));
|
||
this.el = e, this.options = t = Gt({}, t), e[yt] = this;
|
||
var n = {
|
||
group: null,
|
||
sort: !0,
|
||
disabled: !1,
|
||
store: null,
|
||
handle: null,
|
||
draggable: /^[uo]l$/i.test(e.nodeName) ? ">li" : ">*",
|
||
swapThreshold: 1,
|
||
// percentage; 0 <= x <= 1
|
||
invertSwap: !1,
|
||
// invert always
|
||
invertedSwapThreshold: null,
|
||
// will be set to same as swapThreshold if default
|
||
removeCloneOnHide: !0,
|
||
direction: function() {
|
||
return Ti(e, this.options);
|
||
},
|
||
ghostClass: "sortable-ghost",
|
||
chosenClass: "sortable-chosen",
|
||
dragClass: "sortable-drag",
|
||
ignore: "a, img",
|
||
filter: null,
|
||
preventOnFilter: !0,
|
||
animation: 0,
|
||
easing: null,
|
||
setData: function(i, s) {
|
||
i.setData("Text", s.textContent);
|
||
},
|
||
dropBubble: !1,
|
||
dragoverBubble: !1,
|
||
dataIdAttr: "data-id",
|
||
delay: 0,
|
||
delayOnTouchOnly: !1,
|
||
touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,
|
||
forceFallback: !1,
|
||
fallbackClass: "sortable-fallback",
|
||
fallbackOnBody: !1,
|
||
fallbackTolerance: 0,
|
||
fallbackOffset: {
|
||
x: 0,
|
||
y: 0
|
||
},
|
||
supportPointer: pe.supportPointer !== !1 && "PointerEvent" in window && !Qn,
|
||
emptyInsertThreshold: 5
|
||
};
|
||
bo.initializePlugins(this, e, n);
|
||
for (var o in n)
|
||
!(o in t) && (t[o] = n[o]);
|
||
Ii(t);
|
||
for (var r in this)
|
||
r.charAt(0) === "_" && typeof this[r] == "function" && (this[r] = this[r].bind(this));
|
||
this.nativeDraggable = t.forceFallback ? !1 : Mf, this.nativeDraggable && (this.options.touchStartThreshold = 1), t.supportPointer ? ke(e, "pointerdown", this._onTapStart) : (ke(e, "mousedown", this._onTapStart), ke(e, "touchstart", this._onTapStart)), this.nativeDraggable && (ke(e, "dragover", this), ke(e, "dragenter", this)), Uo.push(this.el), t.store && t.store.get && this.sort(t.store.get(this) || []), Gt(this, Tf());
|
||
}
|
||
pe.prototype = /** @lends Sortable.prototype */
|
||
{
|
||
constructor: pe,
|
||
_isOutsideThisEl: function(t) {
|
||
!this.el.contains(t) && t !== this.el && (kn = null);
|
||
},
|
||
_getDirection: function(t, n) {
|
||
return typeof this.options.direction == "function" ? this.options.direction.call(this, t, n, U) : this.options.direction;
|
||
},
|
||
_onTapStart: function(t) {
|
||
if (t.cancelable) {
|
||
var n = this, o = this.el, r = this.options, a = r.preventOnFilter, i = t.type, s = t.touches && t.touches[0] || t.pointerType && t.pointerType === "touch" && t, u = (s || t).target, l = t.target.shadowRoot && (t.path && t.path[0] || t.composedPath && t.composedPath()[0]) || u, c = r.filter;
|
||
if (Kf(o), !U && !(/mousedown|pointerdown/.test(i) && t.button !== 0 || r.disabled) && !l.isContentEditable && !(!this.nativeDraggable && Qn && u && u.tagName.toUpperCase() === "SELECT") && (u = Mt(u, r.draggable, o, !1), !(u && u.animated) && Ao !== u)) {
|
||
if (En = Ct(u), eo = Ct(u, r.draggable), typeof c == "function") {
|
||
if (c.call(this, t, u, this)) {
|
||
at({
|
||
sortable: n,
|
||
rootEl: l,
|
||
name: "filter",
|
||
targetEl: u,
|
||
toEl: o,
|
||
fromEl: o
|
||
}), ct("filter", n, {
|
||
evt: t
|
||
}), a && t.cancelable && t.preventDefault();
|
||
return;
|
||
}
|
||
} else if (c && (c = c.split(",").some(function(d) {
|
||
if (d = Mt(l, d.trim(), o, !1), d)
|
||
return at({
|
||
sortable: n,
|
||
rootEl: d,
|
||
name: "filter",
|
||
targetEl: u,
|
||
fromEl: o,
|
||
toEl: o
|
||
}), ct("filter", n, {
|
||
evt: t
|
||
}), !0;
|
||
}), c)) {
|
||
a && t.cancelable && t.preventDefault();
|
||
return;
|
||
}
|
||
r.handle && !Mt(l, r.handle, o, !1) || this._prepareDragStart(t, s, u);
|
||
}
|
||
}
|
||
},
|
||
_prepareDragStart: function(t, n, o) {
|
||
var r = this, a = r.el, i = r.options, s = a.ownerDocument, u;
|
||
if (o && !U && o.parentNode === a) {
|
||
var l = Ke(o);
|
||
if (Pe = a, U = o, je = U.parentNode, pn = U.nextSibling, Ao = o, So = i.group, pe.dragged = U, hn = {
|
||
target: U,
|
||
clientX: (n || t).clientX,
|
||
clientY: (n || t).clientY
|
||
}, Ea = hn.clientX - l.left, Ta = hn.clientY - l.top, this._lastX = (n || t).clientX, this._lastY = (n || t).clientY, U.style["will-change"] = "all", u = function() {
|
||
if (ct("delayEnded", r, {
|
||
evt: t
|
||
}), pe.eventCanceled) {
|
||
r._onDrop();
|
||
return;
|
||
}
|
||
r._disableDelayedDragEvents(), !Da && r.nativeDraggable && (U.draggable = !0), r._triggerDragStart(t, n), at({
|
||
sortable: r,
|
||
name: "choose",
|
||
originalEvent: t
|
||
}), ft(U, i.chosenClass, !0);
|
||
}, i.ignore.split(",").forEach(function(c) {
|
||
Di(U, c.trim(), hr);
|
||
}), ke(s, "dragover", mn), ke(s, "mousemove", mn), ke(s, "touchmove", mn), ke(s, "mouseup", r._onDrop), ke(s, "touchend", r._onDrop), ke(s, "touchcancel", r._onDrop), Da && this.nativeDraggable && (this.options.touchStartThreshold = 4, U.draggable = !0), ct("delayStart", this, {
|
||
evt: t
|
||
}), i.delay && (!i.delayOnTouchOnly || n) && (!this.nativeDraggable || !(vo || Xt))) {
|
||
if (pe.eventCanceled) {
|
||
this._onDrop();
|
||
return;
|
||
}
|
||
ke(s, "mouseup", r._disableDelayedDrag), ke(s, "touchend", r._disableDelayedDrag), ke(s, "touchcancel", r._disableDelayedDrag), ke(s, "mousemove", r._delayedDragTouchMoveHandler), ke(s, "touchmove", r._delayedDragTouchMoveHandler), i.supportPointer && ke(s, "pointermove", r._delayedDragTouchMoveHandler), r._dragStartTimer = setTimeout(u, i.delay);
|
||
} else
|
||
u();
|
||
}
|
||
},
|
||
_delayedDragTouchMoveHandler: function(t) {
|
||
var n = t.touches ? t.touches[0] : t;
|
||
Math.max(Math.abs(n.clientX - this._lastX), Math.abs(n.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1)) && this._disableDelayedDrag();
|
||
},
|
||
_disableDelayedDrag: function() {
|
||
U && hr(U), clearTimeout(this._dragStartTimer), this._disableDelayedDragEvents();
|
||
},
|
||
_disableDelayedDragEvents: function() {
|
||
var t = this.el.ownerDocument;
|
||
De(t, "mouseup", this._disableDelayedDrag), De(t, "touchend", this._disableDelayedDrag), De(t, "touchcancel", this._disableDelayedDrag), De(t, "mousemove", this._delayedDragTouchMoveHandler), De(t, "touchmove", this._delayedDragTouchMoveHandler), De(t, "pointermove", this._delayedDragTouchMoveHandler);
|
||
},
|
||
_triggerDragStart: function(t, n) {
|
||
n = n || t.pointerType == "touch" && t, !this.nativeDraggable || n ? this.options.supportPointer ? ke(document, "pointermove", this._onTouchMove) : n ? ke(document, "touchmove", this._onTouchMove) : ke(document, "mousemove", this._onTouchMove) : (ke(U, "dragend", this), ke(Pe, "dragstart", this._onDragStart));
|
||
try {
|
||
document.selection ? Po(function() {
|
||
document.selection.empty();
|
||
}) : window.getSelection().removeAllRanges();
|
||
} catch {
|
||
}
|
||
},
|
||
_dragStarted: function(t, n) {
|
||
if (On = !1, Pe && U) {
|
||
ct("dragStarted", this, {
|
||
evt: n
|
||
}), this.nativeDraggable && ke(document, "dragover", Nf);
|
||
var o = this.options;
|
||
!t && ft(U, o.dragClass, !1), ft(U, o.ghostClass, !0), pe.active = this, t && this._appendGhost(), at({
|
||
sortable: this,
|
||
name: "start",
|
||
originalEvent: n
|
||
});
|
||
} else
|
||
this._nulling();
|
||
},
|
||
_emulateDragOver: function() {
|
||
if (Ft) {
|
||
this._lastX = Ft.clientX, this._lastY = Ft.clientY, Ai();
|
||
for (var t = document.elementFromPoint(Ft.clientX, Ft.clientY), n = t; t && t.shadowRoot && (t = t.shadowRoot.elementFromPoint(Ft.clientX, Ft.clientY), t !== n); )
|
||
n = t;
|
||
if (U.parentNode[yt]._isOutsideThisEl(t), n)
|
||
do {
|
||
if (n[yt]) {
|
||
var o = void 0;
|
||
if (o = n[yt]._onDragOver({
|
||
clientX: Ft.clientX,
|
||
clientY: Ft.clientY,
|
||
target: t,
|
||
rootEl: n
|
||
}), o && !this.options.dragoverBubble)
|
||
break;
|
||
}
|
||
t = n;
|
||
} while (n = n.parentNode);
|
||
Vi();
|
||
}
|
||
},
|
||
_onTouchMove: function(t) {
|
||
if (hn) {
|
||
var n = this.options, o = n.fallbackTolerance, r = n.fallbackOffset, a = t.touches ? t.touches[0] : t, i = _e && Tn(_e, !0), s = _e && i && i.a, u = _e && i && i.d, l = Ro && tt && $a(tt), c = (a.clientX - hn.clientX + r.x) / (s || 1) + (l ? l[0] - fr[0] : 0) / (s || 1), d = (a.clientY - hn.clientY + r.y) / (u || 1) + (l ? l[1] - fr[1] : 0) / (u || 1);
|
||
if (!pe.active && !On) {
|
||
if (o && Math.max(Math.abs(a.clientX - this._lastX), Math.abs(a.clientY - this._lastY)) < o)
|
||
return;
|
||
this._onDragStart(t, !0);
|
||
}
|
||
if (_e) {
|
||
i ? (i.e += c - (cr || 0), i.f += d - (dr || 0)) : i = {
|
||
a: 1,
|
||
b: 0,
|
||
c: 0,
|
||
d: 1,
|
||
e: c,
|
||
f: d
|
||
};
|
||
var h = "matrix(".concat(i.a, ",").concat(i.b, ",").concat(i.c, ",").concat(i.d, ",").concat(i.e, ",").concat(i.f, ")");
|
||
me(_e, "webkitTransform", h), me(_e, "mozTransform", h), me(_e, "msTransform", h), me(_e, "transform", h), cr = c, dr = d, Ft = a;
|
||
}
|
||
t.cancelable && t.preventDefault();
|
||
}
|
||
},
|
||
_appendGhost: function() {
|
||
if (!_e) {
|
||
var t = this.options.fallbackOnBody ? document.body : Pe, n = Ke(U, !0, Ro, !0, t), o = this.options;
|
||
if (Ro) {
|
||
for (tt = t; me(tt, "position") === "static" && me(tt, "transform") === "none" && tt !== document; )
|
||
tt = tt.parentNode;
|
||
tt !== document.body && tt !== document.documentElement ? (tt === document && (tt = qt()), n.top += tt.scrollTop, n.left += tt.scrollLeft) : tt = qt(), fr = $a(tt);
|
||
}
|
||
_e = U.cloneNode(!0), ft(_e, o.ghostClass, !1), ft(_e, o.fallbackClass, !0), ft(_e, o.dragClass, !0), me(_e, "transition", ""), me(_e, "transform", ""), me(_e, "box-sizing", "border-box"), me(_e, "margin", 0), me(_e, "top", n.top), me(_e, "left", n.left), me(_e, "width", n.width), me(_e, "height", n.height), me(_e, "opacity", "0.8"), me(_e, "position", Ro ? "absolute" : "fixed"), me(_e, "zIndex", "100000"), me(_e, "pointerEvents", "none"), pe.ghost = _e, t.appendChild(_e), me(_e, "transform-origin", Ea / parseInt(_e.style.width) * 100 + "% " + Ta / parseInt(_e.style.height) * 100 + "%");
|
||
}
|
||
},
|
||
_onDragStart: function(t, n) {
|
||
var o = this, r = t.dataTransfer, a = o.options;
|
||
if (ct("dragStart", this, {
|
||
evt: t
|
||
}), pe.eventCanceled) {
|
||
this._onDrop();
|
||
return;
|
||
}
|
||
ct("setupClone", this), pe.eventCanceled || (Ne = $i(U), Ne.draggable = !1, Ne.style["will-change"] = "", this._hideClone(), ft(Ne, this.options.chosenClass, !1), pe.clone = Ne), o.cloneId = Po(function() {
|
||
ct("clone", o), !pe.eventCanceled && (o.options.removeCloneOnHide || Pe.insertBefore(Ne, U), o._hideClone(), at({
|
||
sortable: o,
|
||
name: "clone"
|
||
}));
|
||
}), !n && ft(U, a.dragClass, !0), n ? (Wo = !0, o._loopId = setInterval(o._emulateDragOver, 50)) : (De(document, "mouseup", o._onDrop), De(document, "touchend", o._onDrop), De(document, "touchcancel", o._onDrop), r && (r.effectAllowed = "move", a.setData && a.setData.call(o, r, U)), ke(document, "drop", o), me(U, "transform", "translateZ(0)")), On = !0, o._dragStartId = Po(o._dragStarted.bind(o, n, t)), ke(document, "selectstart", o), Yn = !0, Qn && me(document.body, "user-select", "none");
|
||
},
|
||
// Returns true - if no further action is needed (either inserted or another condition)
|
||
_onDragOver: function(t) {
|
||
var n = this.el, o = t.target, r, a, i, s = this.options, u = s.group, l = pe.active, c = So === u, d = s.sort, h = Ze || l, f, v = this, p = !1;
|
||
if (Mr)
|
||
return;
|
||
function y(oe, ye) {
|
||
ct(oe, v, Ht({
|
||
evt: t,
|
||
isOwner: c,
|
||
axis: f ? "vertical" : "horizontal",
|
||
revert: i,
|
||
dragRect: r,
|
||
targetRect: a,
|
||
canSort: d,
|
||
fromSortable: h,
|
||
target: o,
|
||
completed: F,
|
||
onMove: function(m, C) {
|
||
return Do(Pe, n, U, r, m, Ke(m), t, C);
|
||
},
|
||
changed: R
|
||
}, ye));
|
||
}
|
||
function b() {
|
||
y("dragOverAnimationCapture"), v.captureAnimationState(), v !== h && h.captureAnimationState();
|
||
}
|
||
function F(oe) {
|
||
return y("dragOverCompleted", {
|
||
insertion: oe
|
||
}), oe && (c ? l._hideClone() : l._showClone(v), v !== h && (ft(U, Ze ? Ze.options.ghostClass : l.options.ghostClass, !1), ft(U, s.ghostClass, !0)), Ze !== v && v !== pe.active ? Ze = v : v === pe.active && Ze && (Ze = null), h === v && (v._ignoreWhileAnimating = o), v.animateAll(function() {
|
||
y("dragOverAnimationComplete"), v._ignoreWhileAnimating = null;
|
||
}), v !== h && (h.animateAll(), h._ignoreWhileAnimating = null)), (o === U && !U.animated || o === n && !o.animated) && (kn = null), !s.dragoverBubble && !t.rootEl && o !== document && (U.parentNode[yt]._isOutsideThisEl(t.target), !oe && mn(t)), !s.dragoverBubble && t.stopPropagation && t.stopPropagation(), p = !0;
|
||
}
|
||
function R() {
|
||
ht = Ct(U), nn = Ct(U, s.draggable), at({
|
||
sortable: v,
|
||
name: "change",
|
||
toEl: n,
|
||
newIndex: ht,
|
||
newDraggableIndex: nn,
|
||
originalEvent: t
|
||
});
|
||
}
|
||
if (t.preventDefault !== void 0 && t.cancelable && t.preventDefault(), o = Mt(o, s.draggable, n, !0), y("dragOver"), pe.eventCanceled)
|
||
return p;
|
||
if (U.contains(t.target) || o.animated && o.animatingX && o.animatingY || v._ignoreWhileAnimating === o)
|
||
return F(!1);
|
||
if (Wo = !1, l && !s.disabled && (c ? d || (i = je !== Pe) : Ze === this || (this.lastPutMode = So.checkPull(this, l, U, t)) && u.checkPut(this, l, U, t))) {
|
||
if (f = this._getDirection(t, o) === "vertical", r = Ke(U), y("dragOverValid"), pe.eventCanceled)
|
||
return p;
|
||
if (i)
|
||
return je = Pe, b(), this._hideClone(), y("revert"), pe.eventCanceled || (pn ? Pe.insertBefore(U, pn) : Pe.appendChild(U)), F(!0);
|
||
var D = oa(n, s.draggable);
|
||
if (!D || Hf(t, f, this) && !D.animated) {
|
||
if (D === U)
|
||
return F(!1);
|
||
if (D && n === t.target && (o = D), o && (a = Ke(o)), Do(Pe, n, U, r, o, a, t, !!o) !== !1)
|
||
return b(), n.appendChild(U), je = n, R(), F(!0);
|
||
} else if (D && qf(t, f, this)) {
|
||
var A = Nn(n, 0, s, !0);
|
||
if (A === U)
|
||
return F(!1);
|
||
if (o = A, a = Ke(o), Do(Pe, n, U, r, o, a, t, !1) !== !1)
|
||
return b(), n.insertBefore(U, A), je = n, R(), F(!0);
|
||
} else if (o.parentNode === n) {
|
||
a = Ke(o);
|
||
var $ = 0, P, W = U.parentNode !== n, k = !Bf(U.animated && U.toRect || r, o.animated && o.toRect || a, f), Y = f ? "top" : "left", ce = Oa(o, "top", "top") || Oa(U, "top", "top"), E = ce ? ce.scrollTop : void 0;
|
||
kn !== o && (P = a[Y], no = !1, Fo = !k && s.invertSwap || W), $ = zf(t, o, a, f, k ? 1 : s.swapThreshold, s.invertedSwapThreshold == null ? s.swapThreshold : s.invertedSwapThreshold, Fo, kn === o);
|
||
var M;
|
||
if ($ !== 0) {
|
||
var I = Ct(U);
|
||
do
|
||
I -= $, M = je.children[I];
|
||
while (M && (me(M, "display") === "none" || M === _e));
|
||
}
|
||
if ($ === 0 || M === o)
|
||
return F(!1);
|
||
kn = o, to = $;
|
||
var T = o.nextElementSibling, x = !1;
|
||
x = $ === 1;
|
||
var Q = Do(Pe, n, U, r, o, a, t, x);
|
||
if (Q !== !1)
|
||
return (Q === 1 || Q === -1) && (x = Q === 1), Mr = !0, setTimeout(Lf, 30), b(), x && !T ? n.appendChild(U) : o.parentNode.insertBefore(U, x ? T : o), ce && Oi(ce, 0, E - ce.scrollTop), je = U.parentNode, P !== void 0 && !Fo && (Vo = Math.abs(P - Ke(o)[Y])), R(), F(!0);
|
||
}
|
||
if (n.contains(U))
|
||
return F(!1);
|
||
}
|
||
return !1;
|
||
},
|
||
_ignoreWhileAnimating: null,
|
||
_offMoveEvents: function() {
|
||
De(document, "mousemove", this._onTouchMove), De(document, "touchmove", this._onTouchMove), De(document, "pointermove", this._onTouchMove), De(document, "dragover", mn), De(document, "mousemove", mn), De(document, "touchmove", mn);
|
||
},
|
||
_offUpEvents: function() {
|
||
var t = this.el.ownerDocument;
|
||
De(t, "mouseup", this._onDrop), De(t, "touchend", this._onDrop), De(t, "pointerup", this._onDrop), De(t, "touchcancel", this._onDrop), De(document, "selectstart", this);
|
||
},
|
||
_onDrop: function(t) {
|
||
var n = this.el, o = this.options;
|
||
if (ht = Ct(U), nn = Ct(U, o.draggable), ct("drop", this, {
|
||
evt: t
|
||
}), je = U && U.parentNode, ht = Ct(U), nn = Ct(U, o.draggable), pe.eventCanceled) {
|
||
this._nulling();
|
||
return;
|
||
}
|
||
On = !1, Fo = !1, no = !1, clearInterval(this._loopId), clearTimeout(this._dragStartTimer), Br(this.cloneId), Br(this._dragStartId), this.nativeDraggable && (De(document, "drop", this), De(n, "dragstart", this._onDragStart)), this._offMoveEvents(), this._offUpEvents(), Qn && me(document.body, "user-select", ""), me(U, "transform", ""), t && (Yn && (t.cancelable && t.preventDefault(), !o.dropBubble && t.stopPropagation()), _e && _e.parentNode && _e.parentNode.removeChild(_e), (Pe === je || Ze && Ze.lastPutMode !== "clone") && Ne && Ne.parentNode && Ne.parentNode.removeChild(Ne), U && (this.nativeDraggable && De(U, "dragend", this), hr(U), U.style["will-change"] = "", Yn && !On && ft(U, Ze ? Ze.options.ghostClass : this.options.ghostClass, !1), ft(U, this.options.chosenClass, !1), at({
|
||
sortable: this,
|
||
name: "unchoose",
|
||
toEl: je,
|
||
newIndex: null,
|
||
newDraggableIndex: null,
|
||
originalEvent: t
|
||
}), Pe !== je ? (ht >= 0 && (at({
|
||
rootEl: je,
|
||
name: "add",
|
||
toEl: je,
|
||
fromEl: Pe,
|
||
originalEvent: t
|
||
}), at({
|
||
sortable: this,
|
||
name: "remove",
|
||
toEl: je,
|
||
originalEvent: t
|
||
}), at({
|
||
rootEl: je,
|
||
name: "sort",
|
||
toEl: je,
|
||
fromEl: Pe,
|
||
originalEvent: t
|
||
}), at({
|
||
sortable: this,
|
||
name: "sort",
|
||
toEl: je,
|
||
originalEvent: t
|
||
})), Ze && Ze.save()) : ht !== En && ht >= 0 && (at({
|
||
sortable: this,
|
||
name: "update",
|
||
toEl: je,
|
||
originalEvent: t
|
||
}), at({
|
||
sortable: this,
|
||
name: "sort",
|
||
toEl: je,
|
||
originalEvent: t
|
||
})), pe.active && ((ht == null || ht === -1) && (ht = En, nn = eo), at({
|
||
sortable: this,
|
||
name: "end",
|
||
toEl: je,
|
||
originalEvent: t
|
||
}), this.save()))), this._nulling();
|
||
},
|
||
_nulling: function() {
|
||
ct("nulling", this), Pe = U = je = _e = pn = Ne = Ao = on = hn = Ft = Yn = ht = nn = En = eo = kn = to = Ze = So = pe.dragged = pe.ghost = pe.clone = pe.active = null, Ko.forEach(function(t) {
|
||
t.checked = !0;
|
||
}), Ko.length = cr = dr = 0;
|
||
},
|
||
handleEvent: function(t) {
|
||
switch (t.type) {
|
||
case "drop":
|
||
case "dragend":
|
||
this._onDrop(t);
|
||
break;
|
||
case "dragenter":
|
||
case "dragover":
|
||
U && (this._onDragOver(t), xf(t));
|
||
break;
|
||
case "selectstart":
|
||
t.preventDefault();
|
||
break;
|
||
}
|
||
},
|
||
/**
|
||
* Serializes the item into an array of string.
|
||
* @returns {String[]}
|
||
*/
|
||
toArray: function() {
|
||
for (var t = [], n, o = this.el.children, r = 0, a = o.length, i = this.options; r < a; r++)
|
||
n = o[r], Mt(n, i.draggable, this.el, !1) && t.push(n.getAttribute(i.dataIdAttr) || Uf(n));
|
||
return t;
|
||
},
|
||
/**
|
||
* Sorts the elements according to the array.
|
||
* @param {String[]} order order of the items
|
||
*/
|
||
sort: function(t, n) {
|
||
var o = {}, r = this.el;
|
||
this.toArray().forEach(function(a, i) {
|
||
var s = r.children[i];
|
||
Mt(s, this.options.draggable, r, !1) && (o[a] = s);
|
||
}, this), n && this.captureAnimationState(), t.forEach(function(a) {
|
||
o[a] && (r.removeChild(o[a]), r.appendChild(o[a]));
|
||
}), n && this.animateAll();
|
||
},
|
||
/**
|
||
* Save the current sorting
|
||
*/
|
||
save: function() {
|
||
var t = this.options.store;
|
||
t && t.set && t.set(this);
|
||
},
|
||
/**
|
||
* For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
|
||
* @param {HTMLElement} el
|
||
* @param {String} [selector] default: `options.draggable`
|
||
* @returns {HTMLElement|null}
|
||
*/
|
||
closest: function(t, n) {
|
||
return Mt(t, n || this.options.draggable, this.el, !1);
|
||
},
|
||
/**
|
||
* Set/get option
|
||
* @param {string} name
|
||
* @param {*} [value]
|
||
* @returns {*}
|
||
*/
|
||
option: function(t, n) {
|
||
var o = this.options;
|
||
if (n === void 0)
|
||
return o[t];
|
||
var r = bo.modifyOption(this, t, n);
|
||
typeof r < "u" ? o[t] = r : o[t] = n, t === "group" && Ii(o);
|
||
},
|
||
/**
|
||
* Destroy
|
||
*/
|
||
destroy: function() {
|
||
ct("destroy", this);
|
||
var t = this.el;
|
||
t[yt] = null, De(t, "mousedown", this._onTapStart), De(t, "touchstart", this._onTapStart), De(t, "pointerdown", this._onTapStart), this.nativeDraggable && (De(t, "dragover", this), De(t, "dragenter", this)), Array.prototype.forEach.call(t.querySelectorAll("[draggable]"), function(n) {
|
||
n.removeAttribute("draggable");
|
||
}), this._onDrop(), this._disableDelayedDragEvents(), Uo.splice(Uo.indexOf(this.el), 1), this.el = t = null;
|
||
},
|
||
_hideClone: function() {
|
||
if (!on) {
|
||
if (ct("hideClone", this), pe.eventCanceled)
|
||
return;
|
||
me(Ne, "display", "none"), this.options.removeCloneOnHide && Ne.parentNode && Ne.parentNode.removeChild(Ne), on = !0;
|
||
}
|
||
},
|
||
_showClone: function(t) {
|
||
if (t.lastPutMode !== "clone") {
|
||
this._hideClone();
|
||
return;
|
||
}
|
||
if (on) {
|
||
if (ct("showClone", this), pe.eventCanceled)
|
||
return;
|
||
U.parentNode == Pe && !this.options.group.revertClone ? Pe.insertBefore(Ne, U) : pn ? Pe.insertBefore(Ne, pn) : Pe.appendChild(Ne), this.options.group.revertClone && this.animate(U, Ne), me(Ne, "display", ""), on = !1;
|
||
}
|
||
}
|
||
};
|
||
function xf(e) {
|
||
e.dataTransfer && (e.dataTransfer.dropEffect = "move"), e.cancelable && e.preventDefault();
|
||
}
|
||
function Do(e, t, n, o, r, a, i, s) {
|
||
var u, l = e[yt], c = l.options.onMove, d;
|
||
return window.CustomEvent && !Xt && !vo ? u = new CustomEvent("move", {
|
||
bubbles: !0,
|
||
cancelable: !0
|
||
}) : (u = document.createEvent("Event"), u.initEvent("move", !0, !0)), u.to = t, u.from = e, u.dragged = n, u.draggedRect = o, u.related = r || t, u.relatedRect = a || Ke(t), u.willInsertAfter = s, u.originalEvent = i, e.dispatchEvent(u), c && (d = c.call(l, u, i)), d;
|
||
}
|
||
function hr(e) {
|
||
e.draggable = !1;
|
||
}
|
||
function Lf() {
|
||
Mr = !1;
|
||
}
|
||
function qf(e, t, n) {
|
||
var o = Ke(Nn(n.el, 0, n.options, !0)), r = 10;
|
||
return t ? e.clientX < o.left - r || e.clientY < o.top && e.clientX < o.right : e.clientY < o.top - r || e.clientY < o.bottom && e.clientX < o.left;
|
||
}
|
||
function Hf(e, t, n) {
|
||
var o = Ke(oa(n.el, n.options.draggable)), r = 10;
|
||
return t ? e.clientX > o.right + r || e.clientX <= o.right && e.clientY > o.bottom && e.clientX >= o.left : e.clientX > o.right && e.clientY > o.top || e.clientX <= o.right && e.clientY > o.bottom + r;
|
||
}
|
||
function zf(e, t, n, o, r, a, i, s) {
|
||
var u = o ? e.clientY : e.clientX, l = o ? n.height : n.width, c = o ? n.top : n.left, d = o ? n.bottom : n.right, h = !1;
|
||
if (!i) {
|
||
if (s && Vo < l * r) {
|
||
if (!no && (to === 1 ? u > c + l * a / 2 : u < d - l * a / 2) && (no = !0), no)
|
||
h = !0;
|
||
else if (to === 1 ? u < c + Vo : u > d - Vo)
|
||
return -to;
|
||
} else if (u > c + l * (1 - r) / 2 && u < d - l * (1 - r) / 2)
|
||
return Wf(t);
|
||
}
|
||
return h = h || i, h && (u < c + l * a / 2 || u > d - l * a / 2) ? u > c + l / 2 ? 1 : -1 : 0;
|
||
}
|
||
function Wf(e) {
|
||
return Ct(U) < Ct(e) ? 1 : -1;
|
||
}
|
||
function Uf(e) {
|
||
for (var t = e.tagName + e.className + e.src + e.href + e.textContent, n = t.length, o = 0; n--; )
|
||
o += t.charCodeAt(n);
|
||
return o.toString(36);
|
||
}
|
||
function Kf(e) {
|
||
Ko.length = 0;
|
||
for (var t = e.getElementsByTagName("input"), n = t.length; n--; ) {
|
||
var o = t[n];
|
||
o.checked && Ko.push(o);
|
||
}
|
||
}
|
||
function Po(e) {
|
||
return setTimeout(e, 0);
|
||
}
|
||
function Br(e) {
|
||
return clearTimeout(e);
|
||
}
|
||
nr && ke(document, "touchmove", function(e) {
|
||
(pe.active || On) && e.cancelable && e.preventDefault();
|
||
});
|
||
pe.utils = {
|
||
on: ke,
|
||
off: De,
|
||
css: me,
|
||
find: Di,
|
||
is: function(t, n) {
|
||
return !!Mt(t, n, t, !1);
|
||
},
|
||
extend: $f,
|
||
throttle: ki,
|
||
closest: Mt,
|
||
toggleClass: ft,
|
||
clone: $i,
|
||
index: Ct,
|
||
nextTick: Po,
|
||
cancelNextTick: Br,
|
||
detectDirection: Ti,
|
||
getChild: Nn
|
||
};
|
||
pe.get = function(e) {
|
||
return e[yt];
|
||
};
|
||
pe.mount = function() {
|
||
for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++)
|
||
t[n] = arguments[n];
|
||
t[0].constructor === Array && (t = t[0]), t.forEach(function(o) {
|
||
if (!o.prototype || !o.prototype.constructor)
|
||
throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(o));
|
||
o.utils && (pe.utils = Ht(Ht({}, pe.utils), o.utils)), bo.mount(o);
|
||
});
|
||
};
|
||
pe.create = function(e, t) {
|
||
return new pe(e, t);
|
||
};
|
||
pe.version = Rf;
|
||
var He = [], Gn, jr, Nr = !1, mr, pr, Yo, Xn;
|
||
function Yf() {
|
||
function e() {
|
||
this.defaults = {
|
||
scroll: !0,
|
||
forceAutoScrollFallback: !1,
|
||
scrollSensitivity: 30,
|
||
scrollSpeed: 10,
|
||
bubbleScroll: !0
|
||
};
|
||
for (var t in this)
|
||
t.charAt(0) === "_" && typeof this[t] == "function" && (this[t] = this[t].bind(this));
|
||
}
|
||
return e.prototype = {
|
||
dragStarted: function(n) {
|
||
var o = n.originalEvent;
|
||
this.sortable.nativeDraggable ? ke(document, "dragover", this._handleAutoScroll) : this.options.supportPointer ? ke(document, "pointermove", this._handleFallbackAutoScroll) : o.touches ? ke(document, "touchmove", this._handleFallbackAutoScroll) : ke(document, "mousemove", this._handleFallbackAutoScroll);
|
||
},
|
||
dragOverCompleted: function(n) {
|
||
var o = n.originalEvent;
|
||
!this.options.dragOverBubble && !o.rootEl && this._handleAutoScroll(o);
|
||
},
|
||
drop: function() {
|
||
this.sortable.nativeDraggable ? De(document, "dragover", this._handleAutoScroll) : (De(document, "pointermove", this._handleFallbackAutoScroll), De(document, "touchmove", this._handleFallbackAutoScroll), De(document, "mousemove", this._handleFallbackAutoScroll)), Aa(), Mo(), Ef();
|
||
},
|
||
nulling: function() {
|
||
Yo = jr = Gn = Nr = Xn = mr = pr = null, He.length = 0;
|
||
},
|
||
_handleFallbackAutoScroll: function(n) {
|
||
this._handleAutoScroll(n, !0);
|
||
},
|
||
_handleAutoScroll: function(n, o) {
|
||
var r = this, a = (n.touches ? n.touches[0] : n).clientX, i = (n.touches ? n.touches[0] : n).clientY, s = document.elementFromPoint(a, i);
|
||
if (Yo = n, o || this.options.forceAutoScrollFallback || vo || Xt || Qn) {
|
||
gr(n, this.options, s, o);
|
||
var u = sn(s, !0);
|
||
Nr && (!Xn || a !== mr || i !== pr) && (Xn && Aa(), Xn = setInterval(function() {
|
||
var l = sn(document.elementFromPoint(a, i), !0);
|
||
l !== u && (u = l, Mo()), gr(n, r.options, l, o);
|
||
}, 10), mr = a, pr = i);
|
||
} else {
|
||
if (!this.options.bubbleScroll || sn(s, !0) === qt()) {
|
||
Mo();
|
||
return;
|
||
}
|
||
gr(n, this.options, sn(s, !1), !1);
|
||
}
|
||
}
|
||
}, Gt(e, {
|
||
pluginName: "scroll",
|
||
initializeByDefault: !0
|
||
});
|
||
}
|
||
function Mo() {
|
||
He.forEach(function(e) {
|
||
clearInterval(e.pid);
|
||
}), He = [];
|
||
}
|
||
function Aa() {
|
||
clearInterval(Xn);
|
||
}
|
||
var gr = ki(function(e, t, n, o) {
|
||
if (t.scroll) {
|
||
var r = (e.touches ? e.touches[0] : e).clientX, a = (e.touches ? e.touches[0] : e).clientY, i = t.scrollSensitivity, s = t.scrollSpeed, u = qt(), l = !1, c;
|
||
jr !== n && (jr = n, Mo(), Gn = t.scroll, c = t.scrollFn, Gn === !0 && (Gn = sn(n, !0)));
|
||
var d = 0, h = Gn;
|
||
do {
|
||
var f = h, v = Ke(f), p = v.top, y = v.bottom, b = v.left, F = v.right, R = v.width, D = v.height, A = void 0, $ = void 0, P = f.scrollWidth, W = f.scrollHeight, k = me(f), Y = f.scrollLeft, ce = f.scrollTop;
|
||
f === u ? (A = R < P && (k.overflowX === "auto" || k.overflowX === "scroll" || k.overflowX === "visible"), $ = D < W && (k.overflowY === "auto" || k.overflowY === "scroll" || k.overflowY === "visible")) : (A = R < P && (k.overflowX === "auto" || k.overflowX === "scroll"), $ = D < W && (k.overflowY === "auto" || k.overflowY === "scroll"));
|
||
var E = A && (Math.abs(F - r) <= i && Y + R < P) - (Math.abs(b - r) <= i && !!Y), M = $ && (Math.abs(y - a) <= i && ce + D < W) - (Math.abs(p - a) <= i && !!ce);
|
||
if (!He[d])
|
||
for (var I = 0; I <= d; I++)
|
||
He[I] || (He[I] = {});
|
||
(He[d].vx != E || He[d].vy != M || He[d].el !== f) && (He[d].el = f, He[d].vx = E, He[d].vy = M, clearInterval(He[d].pid), (E != 0 || M != 0) && (l = !0, He[d].pid = setInterval((function() {
|
||
o && this.layer === 0 && pe.active._onTouchMove(Yo);
|
||
var T = He[this.layer].vy ? He[this.layer].vy * s : 0, x = He[this.layer].vx ? He[this.layer].vx * s : 0;
|
||
typeof c == "function" && c.call(pe.dragged.parentNode[yt], x, T, e, Yo, He[this.layer].el) !== "continue" || Oi(He[this.layer].el, x, T);
|
||
}).bind({
|
||
layer: d
|
||
}), 24))), d++;
|
||
} while (t.bubbleScroll && h !== u && (h = sn(h, !1)));
|
||
Nr = l;
|
||
}
|
||
}, 30), Pi = function(t) {
|
||
var n = t.originalEvent, o = t.putSortable, r = t.dragEl, a = t.activeSortable, i = t.dispatchSortableEvent, s = t.hideGhostForTarget, u = t.unhideGhostForTarget;
|
||
if (n) {
|
||
var l = o || a;
|
||
s();
|
||
var c = n.changedTouches && n.changedTouches.length ? n.changedTouches[0] : n, d = document.elementFromPoint(c.clientX, c.clientY);
|
||
u(), l && !l.el.contains(d) && (i("spill"), this.onSpill({
|
||
dragEl: r,
|
||
putSortable: o
|
||
}));
|
||
}
|
||
};
|
||
function ra() {
|
||
}
|
||
ra.prototype = {
|
||
startIndex: null,
|
||
dragStart: function(t) {
|
||
var n = t.oldDraggableIndex;
|
||
this.startIndex = n;
|
||
},
|
||
onSpill: function(t) {
|
||
var n = t.dragEl, o = t.putSortable;
|
||
this.sortable.captureAnimationState(), o && o.captureAnimationState();
|
||
var r = Nn(this.sortable.el, this.startIndex, this.options);
|
||
r ? this.sortable.el.insertBefore(n, r) : this.sortable.el.appendChild(n), this.sortable.animateAll(), o && o.animateAll();
|
||
},
|
||
drop: Pi
|
||
};
|
||
Gt(ra, {
|
||
pluginName: "revertOnSpill"
|
||
});
|
||
function aa() {
|
||
}
|
||
aa.prototype = {
|
||
onSpill: function(t) {
|
||
var n = t.dragEl, o = t.putSortable, r = o || this.sortable;
|
||
r.captureAnimationState(), n.parentNode && n.parentNode.removeChild(n), r.animateAll();
|
||
},
|
||
drop: Pi
|
||
};
|
||
Gt(aa, {
|
||
pluginName: "removeOnSpill"
|
||
});
|
||
pe.mount(new Yf());
|
||
pe.mount(aa, ra);
|
||
var Gf = Object.defineProperty, Xf = Object.defineProperties, Jf = Object.getOwnPropertyDescriptors, Va = Object.getOwnPropertySymbols, Qf = Object.prototype.hasOwnProperty, Zf = Object.prototype.propertyIsEnumerable, Pa = (e, t, n) => t in e ? Gf(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n, ln = (e, t) => {
|
||
for (var n in t || (t = {}))
|
||
Qf.call(t, n) && Pa(e, n, t[n]);
|
||
if (Va)
|
||
for (var n of Va(t))
|
||
Zf.call(t, n) && Pa(e, n, t[n]);
|
||
return e;
|
||
}, Go = (e, t) => Xf(e, Jf(t));
|
||
function vr(e) {
|
||
e.parentElement !== null && e.parentElement.removeChild(e);
|
||
}
|
||
function Ma(e, t, n) {
|
||
const o = n === 0 ? e.children[0] : e.children[n - 1].nextSibling;
|
||
e.insertBefore(t, o);
|
||
}
|
||
function eh() {
|
||
return typeof window < "u" ? window.console : global.console;
|
||
}
|
||
const th = eh();
|
||
function nh(e) {
|
||
const t = /* @__PURE__ */ Object.create(null);
|
||
return function(o) {
|
||
return t[o] || (t[o] = e(o));
|
||
};
|
||
}
|
||
const oh = /-(\w)/g, rh = nh((e) => e.replace(oh, (t, n) => n.toUpperCase())), Mi = ["Start", "Add", "Remove", "Update", "End"], Bi = ["Choose", "Unchoose", "Sort", "Filter", "Clone"], ji = ["Move"], ah = [ji, Mi, Bi].flatMap((e) => e).map((e) => `on${e}`), xr = {
|
||
manage: ji,
|
||
manageAndEmit: Mi,
|
||
emit: Bi
|
||
};
|
||
function ih(e) {
|
||
return ah.indexOf(e) !== -1;
|
||
}
|
||
const sh = [
|
||
"a",
|
||
"abbr",
|
||
"address",
|
||
"area",
|
||
"article",
|
||
"aside",
|
||
"audio",
|
||
"b",
|
||
"base",
|
||
"bdi",
|
||
"bdo",
|
||
"blockquote",
|
||
"body",
|
||
"br",
|
||
"button",
|
||
"canvas",
|
||
"caption",
|
||
"cite",
|
||
"code",
|
||
"col",
|
||
"colgroup",
|
||
"data",
|
||
"datalist",
|
||
"dd",
|
||
"del",
|
||
"details",
|
||
"dfn",
|
||
"dialog",
|
||
"div",
|
||
"dl",
|
||
"dt",
|
||
"em",
|
||
"embed",
|
||
"fieldset",
|
||
"figcaption",
|
||
"figure",
|
||
"footer",
|
||
"form",
|
||
"h1",
|
||
"h2",
|
||
"h3",
|
||
"h4",
|
||
"h5",
|
||
"h6",
|
||
"head",
|
||
"header",
|
||
"hgroup",
|
||
"hr",
|
||
"html",
|
||
"i",
|
||
"iframe",
|
||
"img",
|
||
"input",
|
||
"ins",
|
||
"kbd",
|
||
"label",
|
||
"legend",
|
||
"li",
|
||
"link",
|
||
"main",
|
||
"map",
|
||
"mark",
|
||
"math",
|
||
"menu",
|
||
"menuitem",
|
||
"meta",
|
||
"meter",
|
||
"nav",
|
||
"noscript",
|
||
"object",
|
||
"ol",
|
||
"optgroup",
|
||
"option",
|
||
"output",
|
||
"p",
|
||
"param",
|
||
"picture",
|
||
"pre",
|
||
"progress",
|
||
"q",
|
||
"rb",
|
||
"rp",
|
||
"rt",
|
||
"rtc",
|
||
"ruby",
|
||
"s",
|
||
"samp",
|
||
"script",
|
||
"section",
|
||
"select",
|
||
"slot",
|
||
"small",
|
||
"source",
|
||
"span",
|
||
"strong",
|
||
"style",
|
||
"sub",
|
||
"summary",
|
||
"sup",
|
||
"svg",
|
||
"table",
|
||
"tbody",
|
||
"td",
|
||
"template",
|
||
"textarea",
|
||
"tfoot",
|
||
"th",
|
||
"thead",
|
||
"time",
|
||
"title",
|
||
"tr",
|
||
"track",
|
||
"u",
|
||
"ul",
|
||
"var",
|
||
"video",
|
||
"wbr"
|
||
];
|
||
function lh(e) {
|
||
return sh.includes(e);
|
||
}
|
||
function uh(e) {
|
||
return ["transition-group", "TransitionGroup"].includes(e);
|
||
}
|
||
function Ni(e) {
|
||
return ["id", "class", "role", "style"].includes(e) || e.startsWith("data-") || e.startsWith("aria-") || e.startsWith("on");
|
||
}
|
||
function xi(e) {
|
||
return e.reduce((t, [n, o]) => (t[n] = o, t), {});
|
||
}
|
||
function ch({ $attrs: e, componentData: t = {} }) {
|
||
const n = xi(Object.entries(e).filter(([o, r]) => Ni(o)));
|
||
return ln(ln({}, n), t);
|
||
}
|
||
function dh({ $attrs: e, callBackBuilder: t }) {
|
||
const n = xi(Li(e));
|
||
Object.entries(t).forEach(([r, a]) => {
|
||
xr[r].forEach((i) => {
|
||
n[`on${i}`] = a(i);
|
||
});
|
||
});
|
||
const o = `[data-draggable]${n.draggable || ""}`;
|
||
return Go(ln({}, n), {
|
||
draggable: o
|
||
});
|
||
}
|
||
function Li(e) {
|
||
return Object.entries(e).filter(([t, n]) => !Ni(t)).map(([t, n]) => [rh(t), n]).filter(([t, n]) => !ih(t));
|
||
}
|
||
const Ba = (e) => {
|
||
const t = e.el || Array.isArray(e.children) && e.children[0].el.parentNode;
|
||
return t || console.error("使用 transition-group , 需要在slot中template内至少2层html标签"), t || {};
|
||
}, fh = (e, t) => e.__draggable_context = t, ja = (e) => e.__draggable_context;
|
||
class hh {
|
||
constructor({
|
||
nodes: { header: t, default: n, footer: o },
|
||
root: r,
|
||
realList: a
|
||
}) {
|
||
this.defaultNodes = n, this.children = [...t, ...n, ...o], this.externalComponent = r.externalComponent, this.rootTransition = r.transition, this.tag = r.tag, this.realList = a;
|
||
}
|
||
get _isRootComponent() {
|
||
return this.externalComponent || this.rootTransition;
|
||
}
|
||
render(t, n) {
|
||
const { tag: o, children: r, _isRootComponent: a } = this;
|
||
return t(o, n, a ? { default: () => r } : r);
|
||
}
|
||
updated() {
|
||
const { defaultNodes: t, realList: n } = this;
|
||
t.forEach((o, r) => {
|
||
fh(Ba(o), {
|
||
element: n[r],
|
||
index: r
|
||
});
|
||
});
|
||
}
|
||
getUnderlyingVm(t) {
|
||
return ja(t);
|
||
}
|
||
getVmIndexFromDomIndex(t, n) {
|
||
const { defaultNodes: o } = this, { length: r } = o, a = n.children, i = a.item(t);
|
||
if (i === null)
|
||
return r;
|
||
const s = ja(i);
|
||
if (s)
|
||
return s.index;
|
||
if (r === 0)
|
||
return 0;
|
||
const u = Ba(o[0]), l = [...a].findIndex((c) => c === u);
|
||
return t < l ? 0 : r;
|
||
}
|
||
}
|
||
function mh(e, t) {
|
||
const n = e[t];
|
||
return n ? n() : [];
|
||
}
|
||
function ph({ $slots: e, realList: t, getKey: n }) {
|
||
const o = t || [], [r, a] = ["header", "footer"].map((u) => mh(e, u)), { item: i } = e;
|
||
if (!i)
|
||
throw new Error("draggable element must have an item slot");
|
||
const s = o.flatMap((u, l) => i({ element: u, index: l }).map((c) => (c.key = n(u), c.props = Go(ln({}, c.props || {}), { "data-draggable": !0 }), c)));
|
||
if (s.length !== o.length)
|
||
throw new Error("Item slot must have only one child");
|
||
return {
|
||
header: r,
|
||
footer: a,
|
||
default: s
|
||
};
|
||
}
|
||
function gh(e) {
|
||
const t = uh(e), n = !lh(e) && !t;
|
||
return {
|
||
transition: t,
|
||
externalComponent: n,
|
||
tag: n ? J(e) : t ? ss : e
|
||
};
|
||
}
|
||
function vh({ $slots: e, tag: t, realList: n, getKey: o }) {
|
||
const r = ph({ $slots: e, realList: n, getKey: o }), a = gh(t);
|
||
return new hh({ nodes: r, root: a, realList: n });
|
||
}
|
||
function qi(e, t) {
|
||
Me(() => this.$emit(e.toLowerCase(), t));
|
||
}
|
||
function Hi(e) {
|
||
return (t, n) => {
|
||
if (this.realList !== null)
|
||
return this[`onDrag${e}`](t, n);
|
||
};
|
||
}
|
||
function bh(e) {
|
||
const t = Hi.call(this, e);
|
||
return (n, o) => {
|
||
t.call(this, n, o), qi.call(this, e, n);
|
||
};
|
||
}
|
||
let br = null;
|
||
const yh = {
|
||
list: {
|
||
type: Array,
|
||
required: !1,
|
||
default: null
|
||
},
|
||
modelValue: {
|
||
type: Array,
|
||
required: !1,
|
||
default: null
|
||
},
|
||
itemKey: {
|
||
type: [String, Function],
|
||
required: !0
|
||
},
|
||
clone: {
|
||
type: Function,
|
||
default: (e) => e
|
||
},
|
||
tag: {
|
||
type: String,
|
||
default: "div"
|
||
},
|
||
move: {
|
||
type: Function,
|
||
default: null
|
||
},
|
||
componentData: {
|
||
type: Object,
|
||
required: !1,
|
||
default: null
|
||
}
|
||
}, wh = [
|
||
"update:modelValue",
|
||
"change",
|
||
...[...xr.manageAndEmit, ...xr.emit].map((e) => e.toLowerCase())
|
||
], _h = ue({
|
||
name: "draggable",
|
||
inheritAttrs: !1,
|
||
props: yh,
|
||
emits: wh,
|
||
data() {
|
||
return {
|
||
error: !1
|
||
};
|
||
},
|
||
render() {
|
||
try {
|
||
this.error = !1;
|
||
const { $slots: e, $attrs: t, tag: n, componentData: o, realList: r, getKey: a } = this, i = vh({
|
||
$slots: e,
|
||
tag: n,
|
||
realList: r,
|
||
getKey: a
|
||
});
|
||
this.componentStructure = i;
|
||
const s = ch({ $attrs: t, componentData: o });
|
||
return i.render(yr, s);
|
||
} catch (e) {
|
||
return this.error = !0, yr("pre", { style: { color: "red" } }, e.stack);
|
||
}
|
||
},
|
||
created() {
|
||
this.list !== null && this.modelValue !== null && th.error("modelValue and list props are mutually exclusive! Please set one or another.");
|
||
},
|
||
mounted() {
|
||
if (this.error)
|
||
return;
|
||
const { $attrs: e, $el: t, componentStructure: n } = this;
|
||
n.updated();
|
||
const o = dh({
|
||
$attrs: e,
|
||
callBackBuilder: {
|
||
manageAndEmit: (a) => bh.call(this, a),
|
||
emit: (a) => qi.bind(this, a),
|
||
manage: (a) => Hi.call(this, a)
|
||
}
|
||
}), r = t.nodeType === 1 ? t : t.parentElement;
|
||
this._sortable = new pe(r, o), this.targetDomElement = r, r.__draggable_component__ = this;
|
||
},
|
||
updated() {
|
||
this.componentStructure.updated();
|
||
},
|
||
beforeUnmount() {
|
||
this._sortable !== void 0 && this._sortable.destroy();
|
||
},
|
||
computed: {
|
||
realList() {
|
||
const { list: e } = this;
|
||
return e || this.modelValue;
|
||
},
|
||
getKey() {
|
||
const { itemKey: e } = this;
|
||
return typeof e == "function" ? e : (t) => t[e];
|
||
}
|
||
},
|
||
watch: {
|
||
$attrs: {
|
||
handler(e) {
|
||
const { _sortable: t } = this;
|
||
t && Li(e).forEach(([n, o]) => {
|
||
t.option(n, o);
|
||
});
|
||
},
|
||
deep: !0
|
||
}
|
||
},
|
||
methods: {
|
||
getUnderlyingVm(e) {
|
||
return this.componentStructure.getUnderlyingVm(e) || null;
|
||
},
|
||
getUnderlyingPotencialDraggableComponent(e) {
|
||
return e.__draggable_component__;
|
||
},
|
||
emitChanges(e) {
|
||
Me(() => this.$emit("change", e));
|
||
},
|
||
alterList(e) {
|
||
if (this.list) {
|
||
e(this.list);
|
||
return;
|
||
}
|
||
const t = [...this.modelValue];
|
||
e(t), this.$emit("update:modelValue", t);
|
||
},
|
||
spliceList() {
|
||
const e = (t) => t.splice(...arguments);
|
||
this.alterList(e);
|
||
},
|
||
updatePosition(e, t) {
|
||
const n = (o) => o.splice(t, 0, o.splice(e, 1)[0]);
|
||
this.alterList(n);
|
||
},
|
||
getRelatedContextFromMoveEvent({ to: e, related: t }) {
|
||
const n = this.getUnderlyingPotencialDraggableComponent(e);
|
||
if (!n)
|
||
return { component: n };
|
||
const o = n.realList, r = { list: o, component: n };
|
||
if (e !== t && o) {
|
||
const a = n.getUnderlyingVm(t) || {};
|
||
return ln(ln({}, a), r);
|
||
}
|
||
return r;
|
||
},
|
||
getVmIndexFromDomIndex(e) {
|
||
return this.componentStructure.getVmIndexFromDomIndex(e, this.targetDomElement);
|
||
},
|
||
onDragStart(e) {
|
||
this.context = this.getUnderlyingVm(e.item), e.item._underlying_vm_ = this.clone(this.context.element), br = e.item;
|
||
},
|
||
onDragAdd(e) {
|
||
const t = e.item._underlying_vm_;
|
||
if (t === void 0)
|
||
return;
|
||
vr(e.item);
|
||
const n = this.getVmIndexFromDomIndex(e.newIndex);
|
||
this.spliceList(n, 0, t);
|
||
const o = { element: t, newIndex: n };
|
||
this.emitChanges({ added: o });
|
||
},
|
||
onDragRemove(e) {
|
||
if (Ma(this.$el, e.item, e.oldIndex), e.pullMode === "clone") {
|
||
vr(e.clone);
|
||
return;
|
||
}
|
||
const { index: t, element: n } = this.context;
|
||
this.spliceList(t, 1);
|
||
const o = { element: n, oldIndex: t };
|
||
this.emitChanges({ removed: o });
|
||
},
|
||
onDragUpdate(e) {
|
||
vr(e.item), Ma(e.from, e.item, e.oldIndex);
|
||
const t = this.context.index, n = this.getVmIndexFromDomIndex(e.newIndex);
|
||
this.updatePosition(t, n);
|
||
const o = { element: this.context.element, oldIndex: t, newIndex: n };
|
||
this.emitChanges({ moved: o });
|
||
},
|
||
computeFutureIndex(e, t) {
|
||
if (!e.element)
|
||
return 0;
|
||
const n = [...t.to.children].filter((i) => i.style.display !== "none"), o = n.indexOf(t.related), r = e.component.getVmIndexFromDomIndex(o);
|
||
return n.indexOf(br) !== -1 || !t.willInsertAfter ? r : r + 1;
|
||
},
|
||
onDragMove(e, t) {
|
||
const { move: n, realList: o } = this;
|
||
if (!n || !o)
|
||
return !0;
|
||
const r = this.getRelatedContextFromMoveEvent(e), a = this.computeFutureIndex(r, e), i = Go(ln({}, this.context), {
|
||
futureIndex: a
|
||
}), s = Go(ln({}, e), {
|
||
relatedContext: r,
|
||
draggedContext: i
|
||
});
|
||
return n(s, t);
|
||
},
|
||
onDragEnd() {
|
||
br = null;
|
||
}
|
||
}
|
||
}), Ch = ue({
|
||
name: "FsTableColumnsFixedController",
|
||
props: {
|
||
modelValue: {
|
||
default: !1
|
||
}
|
||
},
|
||
emits: ["update:modelValue", "change"],
|
||
setup(e, t) {
|
||
const { ui: n } = Ce(), o = B(() => [
|
||
{
|
||
value: "left",
|
||
icon: n.icons.left
|
||
// 'el-icon-arrow-left'
|
||
},
|
||
{
|
||
value: !1,
|
||
icon: n.icons.close
|
||
// 'el-icon-close'
|
||
},
|
||
{
|
||
value: "right",
|
||
icon: n.icons.right
|
||
// 'el-icon-arrow-right'
|
||
}
|
||
]);
|
||
function r(a) {
|
||
t.emit("update:modelValue", a), t.emit("change", a);
|
||
}
|
||
return {
|
||
ui: n,
|
||
options: o,
|
||
submit: r
|
||
};
|
||
}
|
||
});
|
||
function Sh(e, t, n, o, r, a) {
|
||
const i = J("fs-button");
|
||
return w(), V(z(e.ui.buttonGroup.name), { class: "fs-table-columns-fixed-controller" }, {
|
||
default: N(() => [
|
||
(w(!0), j(we, null, Ee(e.options, (s) => (w(), V(i, {
|
||
key: s.icon,
|
||
type: e.modelValue === s.value ? "primary" : "default",
|
||
icon: s.icon,
|
||
size: "small",
|
||
onClick: (u) => e.submit(s.value)
|
||
}, null, 8, ["type", "icon", "onClick"]))), 128))
|
||
]),
|
||
_: 1
|
||
});
|
||
}
|
||
const zi = /* @__PURE__ */ Te(Ch, [["render", Sh]]), Fh = ["title", "i"], Rh = { class: "item-right" }, Dh = {
|
||
"flex-box": "0",
|
||
class: "component--list-item-handle handle"
|
||
}, kh = { style: { "margin-left": "20px", "padding-left": "10px", "border-left": "1px solid #eee" } }, Wi = /* @__PURE__ */ ue({
|
||
__name: "fs-columns-filter-nest-list",
|
||
props: {
|
||
columns: {},
|
||
isRoot: { type: Boolean, default: !1 }
|
||
},
|
||
emits: ["check-changed", "fixed-changed"],
|
||
setup(e, { emit: t }) {
|
||
const { ui: n } = Ce(), o = t, { originalColumns: r, currentColumns: a, originalColumnsMap: i, text: s, active: u } = xn(na);
|
||
function l(p) {
|
||
return p.label || p.title || p.key || s.value.unnamed;
|
||
}
|
||
function c(p) {
|
||
const y = p.draggedContext.element, b = p.relatedContext.element, F = [];
|
||
for (const P of a.value)
|
||
P.key === y.key ? F.push(b) : P.key === b.key ? F.push(y) : F.push(P);
|
||
let R = 0, D = F.length - 1, A = F.length - 1, $ = 0;
|
||
for (let P = 0; P < F.length; P++) {
|
||
const W = F[P];
|
||
W.fixed === "left" ? R = P : W.fixed === "right" ? D = D > P ? P : D : (A = A > P ? P : A, $ = $ < P ? P : $);
|
||
}
|
||
if (A < R || $ > D)
|
||
return !1;
|
||
}
|
||
function d(p) {
|
||
return "update:" + p;
|
||
}
|
||
function h(p) {
|
||
p.show = !p.show;
|
||
function y(F) {
|
||
F.children && F.children.forEach((R) => {
|
||
!R.__show || R.__disabled || (R.show = F.show, y(R));
|
||
});
|
||
}
|
||
y(p);
|
||
function b(F) {
|
||
if (F.__parent) {
|
||
const R = F.__parent;
|
||
R && (R.show = R.children.filter((D) => D.__show && D.show === !0).length > 0, b(R));
|
||
}
|
||
}
|
||
b(p);
|
||
}
|
||
function f() {
|
||
o("check-changed");
|
||
}
|
||
function v(p, y) {
|
||
o("fixed-changed", p, y);
|
||
}
|
||
return (p, y) => {
|
||
const b = J("fs-icon"), F = J("fs-columns-filter-nest-list", !0);
|
||
return w(), V(q(_h), {
|
||
list: p.columns,
|
||
"item-key": "key",
|
||
move: c
|
||
}, {
|
||
item: N(({ element: R, index: D }) => {
|
||
var A, $;
|
||
return [
|
||
ee("div", null, [
|
||
zr(ee("div", {
|
||
title: l(R),
|
||
class: "component--list-item",
|
||
flex: "main:justify cross:center",
|
||
i: D
|
||
}, [
|
||
(w(), V(z(q(n).checkbox.name), H({
|
||
[q(n).checkbox.modelValue || ""]: R.show,
|
||
disabled: ((A = q(i)[R.__key]) == null ? void 0 : A.__disabled) === !0,
|
||
class: "item-label",
|
||
title: l(R)
|
||
}, {
|
||
[ls(d(q(n).checkbox.modelValue))]: (P) => h(R)
|
||
}, { onChange: f }), {
|
||
default: N(() => [
|
||
St(xe(l(R)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040, ["disabled", "title"])),
|
||
ee("div", Rh, [
|
||
p.isRoot ? (w(), V(zi, {
|
||
key: 0,
|
||
modelValue: R.fixed,
|
||
"onUpdate:modelValue": (P) => R.fixed = P,
|
||
"flex-box": "0",
|
||
class: "d2-mr-10",
|
||
onChange: (P) => v(D, P)
|
||
}, null, 8, ["modelValue", "onUpdate:modelValue", "onChange"])) : ne("", !0),
|
||
ee("div", Dh, [
|
||
L(b, {
|
||
icon: q(n).icons.sort
|
||
}, null, 8, ["icon"])
|
||
])
|
||
])
|
||
], 8, Fh), [
|
||
[qa, (($ = q(i)[R.__key]) == null ? void 0 : $.__show) !== !1]
|
||
]),
|
||
ee("div", kh, [
|
||
R.children ? (w(), V(F, {
|
||
key: 0,
|
||
columns: R.children,
|
||
onCheckChanged: f
|
||
}, null, 8, ["columns"])) : ne("", !0)
|
||
])
|
||
])
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 8, ["list"]);
|
||
};
|
||
}
|
||
}), Oh = { class: "component--list" }, $h = {
|
||
key: "__first__",
|
||
class: "component--list-item",
|
||
flex: "main:justify cross:center"
|
||
}, Eh = { span: 12 }, Th = { class: "title" }, Ih = /* @__PURE__ */ ue({
|
||
__name: "fs-columns-filter-layout-default",
|
||
props: {
|
||
width: {},
|
||
drawer: {}
|
||
},
|
||
setup(e) {
|
||
const { ui: t } = Ce(), { originalColumns: n, currentColumns: o, text: r, active: a } = xn(na), i = e, s = B(() => mo(
|
||
{
|
||
[t.drawer.visible]: a.value,
|
||
["onUpdate:" + t.drawer.visible]: (y) => {
|
||
a.value = y;
|
||
},
|
||
[t.drawer.width]: i.width || "400px"
|
||
},
|
||
i.drawer
|
||
)), u = K(!1);
|
||
function l(y) {
|
||
u.value = y, o.value = o.value.map((b) => (!b.__show || b.__disabled || (b.show = y), b));
|
||
}
|
||
const c = B(() => ({
|
||
[t.checkbox.modelValue]: u.value,
|
||
["onUpdate:" + t.checkbox.modelValue]: (y) => {
|
||
l(y);
|
||
}
|
||
})), d = B(() => o.value.filter((y) => y.__show && y.show === !0).length), h = B(() => o.value.filter((y) => y.__show).length), f = B(() => d.value > 0 && d.value < h.value);
|
||
lt(
|
||
() => {
|
||
o.value;
|
||
},
|
||
() => {
|
||
p();
|
||
},
|
||
{ immediate: !0 }
|
||
);
|
||
function v(y, b) {
|
||
b && (o.value[y].show = !0), b === "left" && o.value.unshift(o.value.splice(y, 1)[0]), b === "right" && o.value.push(o.value.splice(y, 1)[0]), p();
|
||
}
|
||
function p() {
|
||
u.value = d.value === h.value;
|
||
}
|
||
return (y, b) => (w(), V(z(q(t).drawer.name), H({
|
||
class: "fs-columns-filter-layout-default",
|
||
title: q(r).title
|
||
}, s.value, { "append-to-body": "" }), {
|
||
default: N(() => [
|
||
(w(), V(z(q(t).drawer.hasContentWrap || "div"), {
|
||
class: "fs-drawer-wrapper fs-table-columns-filter",
|
||
title: q(r).title
|
||
}, {
|
||
default: N(() => [
|
||
(w(), V(z(q(t).card.name), { shadow: "never" }, {
|
||
default: N(() => [
|
||
ee("div", Oh, [
|
||
ee("div", $h, [
|
||
ee("span", Eh, [
|
||
(w(), V(z(q(t).checkbox.name), H({ indeterminate: f.value }, c.value), {
|
||
default: N(() => [
|
||
St(xe(d.value) + " / " + xe(h.value), 1)
|
||
]),
|
||
_: 1
|
||
}, 16, ["indeterminate"]))
|
||
]),
|
||
ee("span", Th, xe(q(r).fixed) + " / " + xe(q(r).order), 1)
|
||
]),
|
||
L(Wi, {
|
||
columns: q(o),
|
||
"is-root": !0,
|
||
onCheckChanged: p,
|
||
onFixedChanged: v
|
||
}, null, 8, ["columns"])
|
||
])
|
||
]),
|
||
_: 1
|
||
})),
|
||
ae(y.$slots, "buttons")
|
||
]),
|
||
_: 3
|
||
}, 8, ["title"]))
|
||
]),
|
||
_: 3
|
||
}, 16, ["title"]));
|
||
}
|
||
}), Ah = ue({
|
||
name: "FsSearchButtons",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
buttons: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup() {
|
||
const { ui: e } = Ce();
|
||
return { ui: e };
|
||
}
|
||
}), Vh = { class: "fs-search-col fs-search-btns" };
|
||
function Ph(e, t, n, o, r, a) {
|
||
const i = J("fs-button");
|
||
return w(), j("div", Vh, [
|
||
(w(), V(z(e.ui.formItem.name), null, {
|
||
default: N(() => [
|
||
(w(!0), j(we, null, Ee(e.buttons, (s, u) => (w(), j(we, { key: u }, [
|
||
s.show ? (w(), V(i, H({
|
||
key: 0,
|
||
ref_for: !0
|
||
}, s, {
|
||
onClick: (l) => s._click(l)
|
||
}), null, 16, ["onClick"])) : ne("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 1
|
||
}))
|
||
]);
|
||
}
|
||
const Ui = /* @__PURE__ */ Te(Ah, [["render", Ph]]), Mh = /* @__PURE__ */ ue({
|
||
name: "FsSearch",
|
||
components: {
|
||
FsSearchButtons: Ui
|
||
},
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 布局容器
|
||
*/
|
||
container: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 初始查询条件
|
||
* 点击重置,会重置成该条件
|
||
*/
|
||
initialForm: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 校验后的查询表单数据
|
||
*/
|
||
validatedForm: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 表单参数
|
||
* 支持el-form | a-form的属性
|
||
*/
|
||
options: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 查询字段配置
|
||
*/
|
||
columns: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 按钮配置,可以根据order排序
|
||
* `{search:{...FsButton},reset:{...FsButton}}`
|
||
*/
|
||
buttons: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 点击重置后是否立即触发查询
|
||
*/
|
||
searchAfterReset: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 是否开启自动查询
|
||
*/
|
||
autoSearch: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 自动查询,防抖设置
|
||
* 传false则关闭自动查询
|
||
*/
|
||
debounce: {
|
||
type: [Boolean, Object],
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 是否显示查询框
|
||
*/
|
||
show: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 是否启用校验
|
||
*/
|
||
validate: {
|
||
default: !1
|
||
},
|
||
/**
|
||
* 是否任意值变化就触发校验
|
||
*/
|
||
validateOnChange: {
|
||
default: !0,
|
||
type: Boolean
|
||
},
|
||
/**
|
||
* 列的宽度设置,span=xx
|
||
*/
|
||
col: {},
|
||
/**
|
||
* 统一字段的formItem属性
|
||
*/
|
||
formItem: {
|
||
type: Object,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 查询事件
|
||
**/
|
||
"search",
|
||
/**
|
||
* 查询事件,此事件供系统调用
|
||
*/
|
||
"_search",
|
||
/**
|
||
* 重置事件,供用户使用
|
||
**/
|
||
"reset",
|
||
/**
|
||
* 重置事件,此事件供系统调用
|
||
*/
|
||
"_reset",
|
||
/**
|
||
* 校验失败事件
|
||
*/
|
||
"validate-error",
|
||
/**
|
||
* 校验后的表单数据变化
|
||
*/
|
||
"update:validatedForm"
|
||
],
|
||
setup(e, t) {
|
||
const {
|
||
ui: n
|
||
} = Ce(), {
|
||
merge: o
|
||
} = $e(), r = o, {
|
||
doComputed: a,
|
||
AsyncComputeValue: i,
|
||
ComputeValue: s
|
||
} = Vt();
|
||
bt(e.columns, (m) => {
|
||
m.value != null && (m.value instanceof i || m.value instanceof s) && de.warn("search.value配置不支持ComputeValue/AsyncCompute类型的动态计算");
|
||
});
|
||
function u() {
|
||
const m = {};
|
||
return G(e.columns, (C, _) => {
|
||
var O;
|
||
if (C.value === void 0)
|
||
return;
|
||
const S = q(C.value);
|
||
S !== void 0 && C.show !== !1 && ((O = C.component) == null ? void 0 : O.show) !== !1 && (m[_] = S);
|
||
}), dt(o({}, e.initialForm, m));
|
||
}
|
||
const l = un(u());
|
||
let c = null;
|
||
const d = a(() => e.columns, A, null, (m) => {
|
||
const C = dt(e.formItem || {});
|
||
G(m, (O) => {
|
||
o(O, C, O);
|
||
}), e.validate || G(m, (O) => {
|
||
delete O.rules, delete O.rule;
|
||
}), e.col && G(m, (O) => {
|
||
O.col = o({}, e.col, O.col);
|
||
}), G(m, (O) => {
|
||
O._cellRender = () => p(O);
|
||
});
|
||
let _ = [];
|
||
G(m, (O, X) => {
|
||
O._key = X, _.push(O);
|
||
}), _ = Sn(_, (O) => O.order ?? cn.orderDefault);
|
||
const S = {};
|
||
return _.forEach((O) => {
|
||
let X = O._key;
|
||
delete O._key, S[X] = O;
|
||
}), S;
|
||
});
|
||
function h() {
|
||
const m = dt(l);
|
||
t.emit("update:validatedForm", m);
|
||
}
|
||
lt(() => e.validatedForm, (m) => {
|
||
for (const C in l)
|
||
delete l[C];
|
||
o(l, m || {});
|
||
}, {
|
||
deep: !0
|
||
});
|
||
const f = (m, C) => et(m, C);
|
||
function v(m) {
|
||
if (m != null)
|
||
return m.indexOf(".") >= 0 ? m.split(".") : m;
|
||
}
|
||
function p(m) {
|
||
const C = m.key;
|
||
async function _(ie) {
|
||
ye(ie, m);
|
||
}
|
||
function S() {
|
||
Q(m);
|
||
}
|
||
function O(ie, fe) {
|
||
fe.code === "Enter" && ie.autoSearchTrigger != !1 && W();
|
||
}
|
||
let X = null;
|
||
e.slots["search_" + C] ? X = L(J("fs-slot-render"), {
|
||
slots: e.slots["search_" + C],
|
||
scope: $(C)
|
||
}, null) : m.render ? X = L(J("fs-render"), {
|
||
"render-func": m.render,
|
||
scope: $(C)
|
||
}, null) : m.component && m.component.show !== !1 && (X = L(J("fs-component-render"), H({
|
||
ref: (ie) => {
|
||
F.value[C] = ie;
|
||
},
|
||
"model-value": f(l, C),
|
||
onKeyup: (ie) => {
|
||
O(m, ie);
|
||
}
|
||
}, m.component, {
|
||
scope: $(C),
|
||
"onUpdate:modelValue": _,
|
||
onInput: S,
|
||
onCompositionstart: () => {
|
||
oe(!0);
|
||
},
|
||
onCompositionend: () => {
|
||
oe(!1);
|
||
}
|
||
}), null));
|
||
const le = v(C);
|
||
return n.formItem.render({
|
||
props: {
|
||
...m,
|
||
label: m.title,
|
||
[n.formItem.prop]: le,
|
||
path: C,
|
||
rulePath: C
|
||
},
|
||
slots: {
|
||
default() {
|
||
return X;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
const y = K(), {
|
||
t: b
|
||
} = ut(), F = K({});
|
||
function R(m) {
|
||
return F.value[m];
|
||
}
|
||
function D(m) {
|
||
var C;
|
||
return (C = R(m)) == null ? void 0 : C.getTargetRef();
|
||
}
|
||
function A() {
|
||
return {
|
||
form: l,
|
||
validatedForm: e.validatedForm,
|
||
getComponentRef: D,
|
||
doSearch: W,
|
||
doReset: k,
|
||
doValidate: P
|
||
};
|
||
}
|
||
function $(m) {
|
||
return {
|
||
...A(),
|
||
key: m,
|
||
value: f(l, m)
|
||
};
|
||
}
|
||
async function P(m = !1, C = "search") {
|
||
try {
|
||
return e.validate && await n.form.validateWrap(y.value), !0;
|
||
} catch (_) {
|
||
return m || t.emit("validate-error", {
|
||
...A(),
|
||
error: _,
|
||
trigger: C
|
||
}), !1;
|
||
}
|
||
}
|
||
async function W() {
|
||
c && c.cancel(), await P() && (h(), await Me(), t.emit("_search", A()), t.emit("search", A()));
|
||
}
|
||
async function k() {
|
||
const m = u(), C = Wr(l);
|
||
for (const _ of C) {
|
||
const S = f(m, _[0]);
|
||
S == null ? xo(l, _[0]) : We(l, _[0], S);
|
||
}
|
||
await P() && (h(), await Me(), e.reset && e.reset(A()), t.emit("_reset", A()), t.emit("reset", A()), e.searchAfterReset && W());
|
||
}
|
||
const Y = B(() => {
|
||
const m = [], C = {
|
||
search: {
|
||
show: !0,
|
||
type: "primary",
|
||
disabled: !1,
|
||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||
click: (_) => {
|
||
W();
|
||
},
|
||
order: 1,
|
||
text: b("fs.search.search.text")
|
||
// '查询',
|
||
},
|
||
reset: {
|
||
show: !0,
|
||
disabled: !1,
|
||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||
click: (_) => {
|
||
k();
|
||
},
|
||
text: b("fs.search.reset.text"),
|
||
// '重置',
|
||
order: 2
|
||
}
|
||
};
|
||
o(C, e.buttons);
|
||
for (let _ in C) {
|
||
const S = C[_];
|
||
S._click = () => {
|
||
S.click(A());
|
||
}, m.push(S);
|
||
}
|
||
return m.sort((_, S) => _.order - S.order), m;
|
||
});
|
||
function ce() {
|
||
var m;
|
||
if (e.autoSearch !== !1 && e.debounce !== !1) {
|
||
let C = ((m = e.debounce) == null ? void 0 : m.wait) || 500;
|
||
c = ws(W, C, e.debounce);
|
||
}
|
||
}
|
||
ce();
|
||
function E() {
|
||
return l;
|
||
}
|
||
function M() {
|
||
return e.validatedForm;
|
||
}
|
||
function I(m, C = !0) {
|
||
C || bt(Ua(l), (_) => {
|
||
delete l[_];
|
||
}), r(l, m), h();
|
||
}
|
||
const T = K(!1), x = () => {
|
||
de.debug("do auto search,inputEventDisabled:", T.value), T.value !== !0 && c && c();
|
||
}, Q = (m) => {
|
||
m.autoSearchTrigger === "input" && x();
|
||
}, oe = (m) => {
|
||
T.value = m;
|
||
};
|
||
async function ye(m, C) {
|
||
const _ = C.key;
|
||
We(l, _, m);
|
||
const S = e.validateOnChangeSilent;
|
||
if (C.valueChange) {
|
||
const O = C.key, X = l[O], le = D(O), ie = C.valueChange instanceof Function ? C.valueChange : C.valueChange.handle, fe = A(), Se = {
|
||
index: 0,
|
||
row: fe.form,
|
||
form: fe.form,
|
||
...fe,
|
||
key: O,
|
||
value: X,
|
||
componentRef: le,
|
||
immediate: !1,
|
||
getComponentRef: D,
|
||
mode: "search"
|
||
};
|
||
ie(Se);
|
||
}
|
||
e.validateOnChange && await P(S, "change") && h(), T.value, (C.autoSearchTrigger == null || C.autoSearchTrigger === !0 || C.autoSearchTrigger === "change") && x();
|
||
}
|
||
const re = B(() => e.validate ? e.options.rules : []);
|
||
return h(), {
|
||
get: f,
|
||
ui: n,
|
||
onValueChanged: ye,
|
||
doValidate: P,
|
||
doSearch: W,
|
||
doReset: k,
|
||
formData: l,
|
||
componentRenderRefs: F,
|
||
getComponentRenderRef: R,
|
||
getComponentRef: D,
|
||
getForm: E,
|
||
getValidatedForm: M,
|
||
setForm: I,
|
||
searchFormRef: y,
|
||
onInput: Q,
|
||
inputEventDisabled: T,
|
||
changeInputEventDisabled: oe,
|
||
computedColumns: d,
|
||
computedButtons: Y,
|
||
computedRules: re,
|
||
buildFieldContext: $,
|
||
getContextFn: A
|
||
};
|
||
}
|
||
});
|
||
const Bh = { class: "fs-search fs-search-v2" }, jh = { class: "fs-search-buttons" };
|
||
function Nh(e, t, n, o, r, a) {
|
||
const i = J("fs-button"), s = J("fs-slot-render");
|
||
return w(), j("div", Bh, [
|
||
(w(), V(z(e.ui.collapseTransition.name), null, {
|
||
default: N(() => [
|
||
(w(), V(z(e.ui.form.name), H({
|
||
ref: "searchFormRef",
|
||
model: e.formData,
|
||
onsubmit: "event.preventDefault();"
|
||
}, e.options, {
|
||
rules: e.computedRules,
|
||
class: "fs-search-form"
|
||
}), {
|
||
default: N(() => {
|
||
var u;
|
||
return [
|
||
e.show !== !1 ? (w(), V(z(((u = e.container) == null ? void 0 : u.is) || "fs-search-layout-default"), H({ key: 0 }, e.container, {
|
||
columns: e.computedColumns,
|
||
"get-context-fn": e.getContextFn
|
||
}), qr({
|
||
"search-buttons": N(() => [
|
||
ee("div", jh, [
|
||
(w(!0), j(we, null, Ee(e.computedButtons, (l, c) => (w(), j(we, { key: c }, [
|
||
l.show !== !1 ? (w(), V(i, H({
|
||
key: 0,
|
||
ref_for: !0
|
||
}, l, {
|
||
onClick: (d) => l._click()
|
||
}), null, 16, ["onClick"])) : ne("", !0)
|
||
], 64))), 128))
|
||
])
|
||
]),
|
||
_: 2
|
||
}, [
|
||
e.slots["search-left"] ? {
|
||
name: "search-left",
|
||
fn: N(() => [
|
||
L(s, {
|
||
slots: e.slots["search-left"],
|
||
scope: e.getContextFn()
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
key: "0"
|
||
} : void 0,
|
||
e.slots["search-middle"] ? {
|
||
name: "search-middle",
|
||
fn: N(() => [
|
||
L(s, {
|
||
slots: e.slots["search-middle"],
|
||
scope: e.getContextFn()
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
key: "1"
|
||
} : void 0,
|
||
e.slots["search-right"] ? {
|
||
name: "search-right",
|
||
fn: N(() => [
|
||
L(s, {
|
||
slots: e.slots["search-right"],
|
||
scope: e.getContextFn()
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
key: "2"
|
||
} : void 0
|
||
]), 1040, ["columns", "get-context-fn"])) : ne("", !0)
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 16, ["model", "rules"]))
|
||
]),
|
||
_: 1
|
||
}))
|
||
]);
|
||
}
|
||
const xh = /* @__PURE__ */ Te(Mh, [["render", Nh]]), Lh = ue({
|
||
name: "FsSearchV1",
|
||
components: { FsSearchButtons: Ui },
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 初始查询条件
|
||
* 点击重置,会重置成该条件
|
||
*/
|
||
initialForm: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 表单参数
|
||
* 支持el-form | a-form的属性
|
||
*/
|
||
options: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 查询字段配置
|
||
*/
|
||
columns: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* tabs
|
||
* { show , options,key, default}
|
||
*/
|
||
tabs: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 按钮配置,可以根据order排序
|
||
* {search:{...FsButton},reset:{...FsButton}}
|
||
*/
|
||
buttons: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 点击重置后是否立即触发查询
|
||
*/
|
||
searchAfterReset: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 是否开启自动查询
|
||
*/
|
||
autoSearch: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 自动查询,防抖设置
|
||
* 传false则关闭自动查询
|
||
*/
|
||
debounce: {
|
||
type: [Boolean, Object],
|
||
default: void 0
|
||
},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 是否显示查询框
|
||
*/
|
||
show: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 是否启用校验
|
||
*/
|
||
validate: {
|
||
default: !1
|
||
},
|
||
/**
|
||
* 布局, single-line 单行, multi-line 多行(支持展开收起)
|
||
*/
|
||
layout: {
|
||
type: String,
|
||
default: "single-line"
|
||
},
|
||
/**
|
||
* 列的宽度设置,span=xx
|
||
*/
|
||
col: {},
|
||
/**
|
||
* 是否折叠
|
||
*/
|
||
collapse: {
|
||
type: Boolean,
|
||
default: !1
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 查询事件
|
||
**/
|
||
"search",
|
||
/**
|
||
* 重置事件
|
||
**/
|
||
"reset",
|
||
"collapse",
|
||
"update:collapse"
|
||
],
|
||
setup(e, t) {
|
||
const { ui: n } = Ce();
|
||
Cn(() => {
|
||
if (ye.value && I.value) {
|
||
T.value = I.value.$el.offsetHeight;
|
||
const m = I.value.$el.children;
|
||
m && m.length > 1 && (x.value = m[1].offsetHeight + 2);
|
||
}
|
||
});
|
||
let o = null;
|
||
function r() {
|
||
return cloneDeep(e.initialForm || {});
|
||
}
|
||
const a = un(r()), { doComputed: i, AsyncComputeValue: s } = Vt();
|
||
bt(e.columns, (m) => {
|
||
m.value != null && m.value instanceof s && de.warn("search.value配置不支持AsyncCompute类型的动态计算");
|
||
});
|
||
const { merge: u } = $e(), l = u, c = i(
|
||
() => e.columns,
|
||
y,
|
||
null,
|
||
(m) => {
|
||
e.validate || G(m, (S) => {
|
||
delete S.rules;
|
||
}), e.col && G(m, (S) => {
|
||
S.col = u({}, e.col, S.col);
|
||
});
|
||
let C = [];
|
||
G(m, (S, O) => {
|
||
S._key = O, C.push(S);
|
||
}), C = Sn(C, (S) => S.order ?? cn.orderDefault);
|
||
const _ = {};
|
||
return C.forEach((S) => {
|
||
let O = S._key;
|
||
delete S._key, _[O] = S;
|
||
}), _;
|
||
}
|
||
);
|
||
G(c.value, (m, C) => {
|
||
var S;
|
||
if (m.value === void 0)
|
||
return;
|
||
const _ = q(m.value);
|
||
_ !== void 0 && m.show !== !1 && ((S = m.component) == null ? void 0 : S.show) !== !1 && (a[C] = _);
|
||
});
|
||
const d = K(), { t: h } = ut(), f = K({});
|
||
function v(m) {
|
||
return f.value[m];
|
||
}
|
||
function p(m) {
|
||
var C, _;
|
||
return (_ = (C = v(m)) == null ? void 0 : C.$refs) == null ? void 0 : _.targetRef;
|
||
}
|
||
function y() {
|
||
return { form: a, validatedForm: a, getComponentRef: p, doValidate: null };
|
||
}
|
||
const b = K(y());
|
||
async function F() {
|
||
if (o && o.cancel(), await n.form.validateWrap(d.value))
|
||
t.emit("search", b.value);
|
||
else
|
||
return n.message.error({
|
||
message: h("fs.search.error.message")
|
||
}), !1;
|
||
}
|
||
function R() {
|
||
const m = r(), C = Wr(a);
|
||
for (const _ of C) {
|
||
const S = et(m, _[0]);
|
||
S == null ? xo(a, _[0]) : We(a, _[0], S);
|
||
}
|
||
e.reset && e.reset(b.value), t.emit("reset", y()), e.searchAfterReset && Me(() => {
|
||
F();
|
||
});
|
||
}
|
||
const D = B(() => {
|
||
const m = [], C = {
|
||
search: {
|
||
show: !0,
|
||
type: "primary",
|
||
disabled: !1,
|
||
click: (_) => {
|
||
F();
|
||
},
|
||
order: 1,
|
||
text: h("fs.search.search.text")
|
||
// '查询',
|
||
},
|
||
reset: {
|
||
show: !0,
|
||
disabled: !1,
|
||
click: (_) => {
|
||
R();
|
||
},
|
||
text: h("fs.search.reset.text"),
|
||
// '重置',
|
||
order: 2
|
||
}
|
||
};
|
||
u(C, e.buttons);
|
||
for (let _ in C) {
|
||
const S = C[_];
|
||
S._click = () => {
|
||
S.click(y());
|
||
}, m.push(S);
|
||
}
|
||
return m.sort((_, S) => _.order - S.order), m;
|
||
});
|
||
function A() {
|
||
var m;
|
||
if (e.autoSearch !== !1 && e.debounce !== !1) {
|
||
let C = ((m = e.debounce) == null ? void 0 : m.wait) || 500;
|
||
o = debounce(F, C, e.debounce);
|
||
}
|
||
}
|
||
A();
|
||
function $() {
|
||
return a;
|
||
}
|
||
function P(m, C = !0) {
|
||
C || bt(Ua(a), (_) => {
|
||
delete a[_];
|
||
}), l(a, m);
|
||
}
|
||
const W = K(!1), k = () => {
|
||
de.debug("do auto search,inputEventDisabled:", W.value), W.value !== !0 && o && o();
|
||
}, Y = (m) => {
|
||
m.autoSearchTrigger === "input" && k();
|
||
}, ce = (m) => {
|
||
W.value = m, k();
|
||
};
|
||
function E(m, C) {
|
||
const _ = C.key;
|
||
if (We(a, _, m), C.valueChange) {
|
||
const S = C.key, O = a[S], X = p(S);
|
||
(C.valueChange instanceof Function ? C.valueChange : C.valueChange.handle)({ key: S, value: O, componentRef: X, ...y(), immidiate: !1 });
|
||
}
|
||
(C.autoSearchTrigger == null || C.autoSearchTrigger === !0 || C.autoSearchTrigger === "change") && k();
|
||
}
|
||
const M = B(() => e.validate ? e.options.rules : []), I = K(), T = K(0), x = K(0), Q = () => {
|
||
t.emit("update:collapse", !e.collapse), t.emit("collapse", !e.collapse);
|
||
}, oe = B(() => e.layout === "multi-line" ? n.col.name : "div"), ye = B(() => e.layout === "multi-line"), re = B(() => ye.value ? e.collapse ? x.value ? x.value + "px" : "" : T.value ? T.value + "px" : "" : "auto");
|
||
return {
|
||
get: (m, C) => et(m, C),
|
||
ui: n,
|
||
onValueChanged: E,
|
||
doSearch: F,
|
||
doReset: R,
|
||
form: a,
|
||
componentRenderRefs: f,
|
||
getComponentRenderRef: v,
|
||
getComponentRef: p,
|
||
getForm: $,
|
||
setForm: P,
|
||
searchFormRef: d,
|
||
onInput: Y,
|
||
inputEventDisabled: W,
|
||
changeInputEventDisabled: ce,
|
||
computedColumns: c,
|
||
computedButtons: D,
|
||
computedRules: M,
|
||
columnsRowRef: I,
|
||
computedColumnBoxHeight: re,
|
||
computedColName: oe,
|
||
computedIsMultiLine: ye,
|
||
toggleCollapse: Q,
|
||
searchEventContextRef: b
|
||
};
|
||
}
|
||
});
|
||
const qh = { class: "fs-search-box" }, Hh = { class: "fs-search-main" }, zh = {
|
||
key: 0,
|
||
class: "fs-search-col"
|
||
}, Wh = {
|
||
key: 1,
|
||
class: "fs-search-col fs-search-middle"
|
||
}, Uh = {
|
||
key: 3,
|
||
class: "fs-search-col fs-search-right"
|
||
}, Kh = {
|
||
key: 0,
|
||
class: "fs-search-action"
|
||
};
|
||
function Yh(e, t, n, o, r, a) {
|
||
const i = J("fs-slot-render"), s = J("fs-component-render"), u = J("fs-search-buttons"), l = J("fs-button");
|
||
return w(), V(z(e.ui.collapseTransition.name), null, {
|
||
default: N(() => [
|
||
e.show !== !1 ? (w(), j("div", {
|
||
key: 0,
|
||
class: _t(["fs-search", { "fs-search-multi-line": e.computedIsMultiLine }])
|
||
}, [
|
||
(w(), V(z(e.ui.form.name), H({
|
||
ref: "searchFormRef",
|
||
model: e.form
|
||
}, e.options, {
|
||
rules: e.computedRules,
|
||
class: "fs-search-form",
|
||
onCompositionstart: t[0] || (t[0] = (c) => e.changeInputEventDisabled(!0)),
|
||
onCompositionend: t[1] || (t[1] = (c) => e.changeInputEventDisabled(!1))
|
||
}), {
|
||
default: N(() => [
|
||
ee("div", qh, [
|
||
ee("div", Hh, [
|
||
ee("div", {
|
||
class: _t(["fs-search-columns", { "fs-search-collapse": e.collapse }]),
|
||
style: jn({ height: e.computedColumnBoxHeight })
|
||
}, [
|
||
(w(), V(z(e.ui.row.name), { ref: "columnsRowRef" }, {
|
||
default: N(() => [
|
||
e.slots["search-left"] ? (w(), j("div", zh, [
|
||
(w(), V(z(e.ui.formItem.name), null, {
|
||
default: N(() => [
|
||
L(i, {
|
||
slots: e.slots["search-left"],
|
||
scope: e.searchEventContextRef
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : ne("", !0),
|
||
(w(!0), j(we, null, Ee(e.computedColumns, (c, d) => (w(), j(we, { key: d }, [
|
||
c.show === !0 ? (w(), V(z(e.computedColName), H({
|
||
key: 0,
|
||
class: "fs-search-col"
|
||
}, { ref_for: !0 }, c.col), {
|
||
default: N(() => [
|
||
(w(), V(z(e.ui.formItem.name), H({ ref_for: !0 }, c, {
|
||
[e.ui.formItem.prop || ""]: d,
|
||
label: c.title
|
||
}), {
|
||
default: N(() => [
|
||
e.slots["search_" + d] ? (w(), V(i, {
|
||
key: 0,
|
||
slots: e.slots["search_" + d],
|
||
scope: { ...e.searchEventContextRef, key: d }
|
||
}, null, 8, ["slots", "scope"])) : (w(), j(we, { key: 1 }, [
|
||
c.component && c.component.show !== !1 ? (w(), V(s, H({
|
||
key: 0,
|
||
ref_for: !0,
|
||
ref: (h) => {
|
||
h && (e.componentRenderRefs[c.key] = h);
|
||
},
|
||
"model-value": e.get(e.form, d)
|
||
}, { ref_for: !0 }, c.component, {
|
||
scope: e.searchEventContextRef,
|
||
"onUpdate:modelValue": (h) => e.onValueChanged(h, c),
|
||
onInput: (h) => e.onInput(c)
|
||
}), null, 16, ["model-value", "scope", "onUpdate:modelValue", "onInput"])) : ne("", !0)
|
||
], 64))
|
||
]),
|
||
_: 2
|
||
}, 1040, ["label"]))
|
||
]),
|
||
_: 2
|
||
}, 1040)) : ne("", !0)
|
||
], 64))), 128)),
|
||
e.slots["search-middle"] ? (w(), j("div", Wh, [
|
||
(w(), V(z(e.ui.formItem.name), null, {
|
||
default: N(() => [
|
||
L(i, {
|
||
slots: e.slots["search-middle"],
|
||
scope: e.searchEventContextRef
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : ne("", !0),
|
||
e.computedIsMultiLine ? ne("", !0) : (w(), V(u, {
|
||
key: 2,
|
||
buttons: e.computedButtons
|
||
}, null, 8, ["buttons"])),
|
||
e.slots["search-right"] ? (w(), j("div", Uh, [
|
||
(w(), V(z(e.ui.formItem.name), null, {
|
||
default: N(() => [
|
||
L(i, {
|
||
slots: e.slots["search-right"],
|
||
scope: e.searchEventContextRef
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : ne("", !0)
|
||
]),
|
||
_: 1
|
||
}, 512))
|
||
], 6),
|
||
e.computedIsMultiLine ? (w(), V(u, {
|
||
key: 0,
|
||
buttons: e.computedButtons
|
||
}, null, 8, ["buttons"])) : ne("", !0)
|
||
]),
|
||
e.computedIsMultiLine ? (w(), j("div", Kh, [
|
||
(w(), V(z(e.ui.formItem.name), null, {
|
||
default: N(() => [
|
||
L(l, {
|
||
icon: e.collapse ? e.ui.icons.caretUp : e.ui.icons.caretDown,
|
||
onClick: e.toggleCollapse
|
||
}, null, 8, ["icon", "onClick"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : ne("", !0)
|
||
])
|
||
]),
|
||
_: 1
|
||
}, 16, ["model", "rules"]))
|
||
], 2)) : ne("", !0)
|
||
]),
|
||
_: 1
|
||
});
|
||
}
|
||
const Gh = /* @__PURE__ */ Te(Lh, [["render", Yh]]), Xh = ue({
|
||
name: "FsSearchLayoutDefault",
|
||
props: {
|
||
/**
|
||
* 是否收缩
|
||
*/
|
||
collapse: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
/**
|
||
* 展开按钮
|
||
*/
|
||
collapseButton: {
|
||
type: Object
|
||
},
|
||
action: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 布局模式
|
||
*/
|
||
layout: {
|
||
type: String,
|
||
default: "single-line"
|
||
},
|
||
/**
|
||
* 查询字段列表,可以精细化自定义查询字段布局
|
||
*/
|
||
columns: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 默认的col配置
|
||
*/
|
||
col: {
|
||
type: Object
|
||
},
|
||
/**
|
||
* 获取查询上下文
|
||
*/
|
||
getContextFn: {
|
||
type: Function
|
||
}
|
||
},
|
||
emits: ["update:collapse", "collapse"],
|
||
setup(e, t) {
|
||
const { ui: n } = Ce(), { t: o } = ut(), r = K(), a = B(() => e.layout === "multi-line");
|
||
Cn(() => {
|
||
a.value && r.value && (s.value = r.value.$el.offsetHeight);
|
||
});
|
||
const i = B(() => !a.value || !e.collapse ? "auto" : s.value ? s.value + "px" : ""), s = K(0), u = () => {
|
||
t.emit("update:collapse", !e.collapse), t.emit("collapse", !e.collapse);
|
||
};
|
||
function l(c) {
|
||
return mo({}, e.col, c);
|
||
}
|
||
return {
|
||
ui: n,
|
||
columnsRowRef: r,
|
||
computedColumnBoxHeight: i,
|
||
computedIsMultiLine: a,
|
||
toggleCollapse: u,
|
||
mergeCol: l,
|
||
t: o
|
||
};
|
||
}
|
||
});
|
||
const Jh = { class: "fs-search-box" }, Qh = { class: "fs-search-col fs-search-slot" }, Zh = { class: "fs-search-col fs-search-slot" }, em = { class: "fs-search-col fs-search-slot" }, tm = {
|
||
key: 0,
|
||
class: "fs-search-buttons-group fs-search-multi-line-buttons"
|
||
};
|
||
function nm(e, t, n, o, r, a) {
|
||
var u;
|
||
const i = J("fs-render"), s = J("fs-button");
|
||
return w(), j("div", {
|
||
class: _t(["fs-search-layout-default", { "fs-search-multi-line": e.computedIsMultiLine }])
|
||
}, [
|
||
ee("div", Jh, [
|
||
ee("div", {
|
||
class: _t(["fs-search-main", { "fs-search-collapse": e.collapse }]),
|
||
style: jn({ maxHeight: e.computedColumnBoxHeight })
|
||
}, [
|
||
(w(), V(z(e.ui.row.name), {
|
||
ref: "columnsRowRef",
|
||
class: "fs-search-columns"
|
||
}, {
|
||
default: N(() => {
|
||
var l;
|
||
return [
|
||
ee("span", Qh, [
|
||
ae(e.$slots, "search-left")
|
||
]),
|
||
(w(!0), j(we, null, Ee(e.columns, (c, d) => (w(), j(we, { key: d }, [
|
||
c.show ? (w(), V(z(e.ui.col.name), H({
|
||
key: 0,
|
||
class: "fs-search-col"
|
||
}, { ref_for: !0 }, e.mergeCol(c.col)), {
|
||
default: N(() => [
|
||
L(i, {
|
||
"render-func": c._cellRender,
|
||
scope: e.getContextFn()
|
||
}, null, 8, ["render-func", "scope"])
|
||
]),
|
||
_: 2
|
||
}, 1040)) : ne("", !0)
|
||
], 64))), 128)),
|
||
ee("span", Zh, [
|
||
ae(e.$slots, "search-middle")
|
||
]),
|
||
e.computedIsMultiLine ? ne("", !0) : (w(), V(z(e.ui.col.name), H({
|
||
key: 0,
|
||
class: "fs-search-col fs-search-buttons-group"
|
||
}, e.mergeCol((l = e.action) == null ? void 0 : l.col)), {
|
||
default: N(() => {
|
||
var c;
|
||
return [
|
||
(w(), V(z(e.ui.formItem.name), Be({
|
||
[e.ui.formItem.label || ""]: (c = e.action) == null ? void 0 : c.label
|
||
}), {
|
||
default: N(() => [
|
||
ae(e.$slots, "search-buttons", Be(xt(e.getContextFn())))
|
||
]),
|
||
_: 3
|
||
}, 16))
|
||
];
|
||
}),
|
||
_: 3
|
||
}, 16)),
|
||
ee("span", em, [
|
||
ae(e.$slots, "search-right", Be(xt(e.getContextFn())))
|
||
])
|
||
];
|
||
}),
|
||
_: 3
|
||
}, 512))
|
||
], 6),
|
||
e.computedIsMultiLine ? (w(), j("div", tm, [
|
||
ae(e.$slots, "search-buttons"),
|
||
((u = e.collapseButton) == null ? void 0 : u.show) !== !1 ? (w(), V(s, H({
|
||
key: 0,
|
||
icon: e.collapse ? e.ui.icons.caretDown : e.ui.icons.caretUp,
|
||
text: e.collapse ? e.t("fs.search.container.collapseButton.text.expand") : e.t("fs.search.container.collapseButton.text.collapse")
|
||
}, e.collapseButton, { onClick: e.toggleCollapse }), null, 16, ["icon", "text", "onClick"])) : ne("", !0)
|
||
])) : ne("", !0)
|
||
])
|
||
], 2);
|
||
}
|
||
const om = /* @__PURE__ */ Te(Xh, [["render", nm]]), rm = { class: "fs-tabs-filter" }, am = ue({
|
||
name: "FsTabsFilter",
|
||
inheritAttrs: !1
|
||
}), im = /* @__PURE__ */ ue({
|
||
...am,
|
||
props: {
|
||
name: {},
|
||
show: { type: Boolean, default: !1 },
|
||
defaultOption: { default: void 0 },
|
||
options: { default: () => [] },
|
||
modelValue: {},
|
||
value: { default: "value" },
|
||
label: { default: "label" }
|
||
},
|
||
emits: ["update:modelValue", "change"],
|
||
setup(e, { emit: t }) {
|
||
const n = Qo(), { merge: o } = $e(), r = e, a = B(() => o({
|
||
show: !0,
|
||
value: null,
|
||
label: "全部"
|
||
}, r.defaultOption || {})), i = "_default_key_", s = B(() => {
|
||
const f = r.modelValue == null || r.modelValue === a.value.value ? i : r.modelValue;
|
||
return {
|
||
type: "card",
|
||
...n,
|
||
[h.tabs.modelValue]: f,
|
||
["onUpdate:" + h.tabs.modelValue]: l
|
||
};
|
||
}), u = t;
|
||
function l(f) {
|
||
i === f && (f = a.value.value);
|
||
const v = r.modelValue;
|
||
u("update:modelValue", f), v !== f && u("change", f);
|
||
}
|
||
function c(f) {
|
||
return f[r.value];
|
||
}
|
||
function d(f) {
|
||
return f[r.label];
|
||
}
|
||
const { ui: h } = Ce();
|
||
return (f, v) => (w(), j("div", rm, [
|
||
(w(), V(z(q(h).tabs.name), Be(xt(s.value)), {
|
||
default: N(() => [
|
||
a.value.show ? (w(), V(z(q(h).tabPane.name), Be({
|
||
key: 0,
|
||
[q(h).tabPane.key || ""]: i,
|
||
[q(h).tabPane.tab || ""]: a.value.label
|
||
}), null, 16)) : ne("", !0),
|
||
(w(!0), j(we, null, Ee(f.options, (p, y) => (w(), V(z(q(h).tabPane.name), Be({
|
||
key: y,
|
||
[q(h).tabPane.key || ""]: c(p),
|
||
[q(h).tabPane.tab || ""]: d(p)
|
||
}), null, 16))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16))
|
||
]));
|
||
}
|
||
});
|
||
const sm = { class: "fs-icon-selector" }, lm = {
|
||
key: 0,
|
||
class: "fs-icon-selector-dialog"
|
||
}, um = { class: "fs-icon-selector-dialog-content" }, cm = { class: "icon-tabs-box mt-10" }, dm = { class: "search-box" }, fm = { class: "color-select" }, hm = ["onClick"], mm = { class: "icon-container" }, pm = { class: "icon-list" }, gm = ["title", "onClick", "onDblclick"], vm = { class: "load-more" }, bm = { key: 1 }, ym = { class: "footer" }, wm = ue({
|
||
name: "FsIconSelector"
|
||
}), _m = /* @__PURE__ */ ue({
|
||
...wm,
|
||
props: {
|
||
modelValue: {
|
||
type: String,
|
||
default: ""
|
||
},
|
||
dialog: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
tabs: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
// 限制每页显示数量
|
||
limit: {
|
||
type: Number,
|
||
default: 136
|
||
},
|
||
iconSets: {
|
||
type: Array,
|
||
default: () => [
|
||
"logos",
|
||
"fa-brands",
|
||
"fa-solid",
|
||
"fa-regular",
|
||
"carbon",
|
||
"ion",
|
||
"ant-design",
|
||
"mdi",
|
||
"twemoji",
|
||
"svg-spinners"
|
||
]
|
||
},
|
||
apiProvider: {
|
||
type: String,
|
||
default: "https://api.iconify.design"
|
||
},
|
||
colors: {
|
||
type: Array,
|
||
default: () => [
|
||
"",
|
||
"#007AFF",
|
||
"#34C759",
|
||
"#FF9500",
|
||
"#FF3B30",
|
||
"#FFCC00",
|
||
"#424242",
|
||
"#8E8E93",
|
||
"#AF52DE",
|
||
"#5AC8FA",
|
||
"#A2845E"
|
||
]
|
||
}
|
||
},
|
||
emits: ["update:modelValue"],
|
||
setup(e, { emit: t }) {
|
||
const n = t, o = 136, r = e, { ui: a } = Ce(), i = K(!1), s = B(() => ({
|
||
width: 1024,
|
||
style: {
|
||
width: "1024px"
|
||
},
|
||
...r.dialog,
|
||
[a.dialog.visible]: i.value,
|
||
[`onUpdate:${a.dialog.visible}`]: (T) => {
|
||
i.value = T;
|
||
}
|
||
})), u = a.formItem.injectFormItemContext(), l = B(() => ({
|
||
...h,
|
||
[a.input.modelValue]: r.modelValue,
|
||
[`onUpdate:${a.input.modelValue}`]: (T) => {
|
||
c(T);
|
||
}
|
||
})), c = (T) => {
|
||
n("update:modelValue", T), u == null || u.onChange();
|
||
}, d = () => {
|
||
var x;
|
||
i.value = !0, r.iconSets.length > 0 && D.value.records.length === 0 && F(r.iconSets[0]);
|
||
const T = ((x = r.modelValue) == null ? void 0 : x.split(":")) || [];
|
||
T.length >= 2 ? (W.value = T[0] + ":" + T[1], k.value = T[2]) : (W.value = r.modelValue, k.value = "");
|
||
}, h = Qo(), f = {
|
||
async getCollections() {
|
||
return await (await fetch(`${r.apiProvider}/collections`)).json();
|
||
},
|
||
async getIcons(T) {
|
||
return await (await fetch(`${r.apiProvider}/collection?prefix=${T}`)).json();
|
||
},
|
||
async search(T, x) {
|
||
const Q = x.start ?? 0, oe = x.limit ?? 50;
|
||
return await (await fetch(`${r.apiProvider}/search?query=${T}&start=${Q}&limit=${oe}`)).json();
|
||
}
|
||
}, v = K({}), p = async (T) => {
|
||
let x = v.value[T];
|
||
if (!x) {
|
||
const Q = await f.getIcons(T), oe = Q.uncategorized ?? [], ye = Q.categories ?? [];
|
||
x = oe;
|
||
for (const re in ye)
|
||
x = x.concat(ye[re]);
|
||
x = x.map((re) => `${T}:${re}`), v.value[T] = x;
|
||
}
|
||
return x;
|
||
}, y = K(""), b = K("all"), F = (T) => {
|
||
b.value = T, y.value = "", R(), A();
|
||
}, R = () => {
|
||
D.value.start = 0, D.value.records = [], D.value.total = 0, D.value.limit = r.limit ?? o;
|
||
}, D = K({
|
||
loading: !1,
|
||
start: 0,
|
||
limit: r.limit ?? o,
|
||
total: null,
|
||
query: "",
|
||
records: []
|
||
}), A = async () => {
|
||
if (!D.value.loading) {
|
||
D.value.query !== y.value && R(), D.value.loading = !0;
|
||
try {
|
||
const T = await $();
|
||
D.value.records = D.value.records.concat(T.icons), D.value.total = T.total, D.value.limit = T.limit, D.value.query = y.value;
|
||
} finally {
|
||
D.value.loading = !1;
|
||
}
|
||
}
|
||
};
|
||
async function $() {
|
||
if (b.value === "all") {
|
||
if (!y.value) {
|
||
a.notification.warn("请输入搜索关键字");
|
||
return;
|
||
}
|
||
return await f.search(y.value, D.value);
|
||
} else
|
||
return await P(b.value);
|
||
}
|
||
async function P(T) {
|
||
const x = await p(T);
|
||
let Q = x;
|
||
y.value && (Q = x.filter((re) => re.includes(y.value)));
|
||
let oe = D.value.start + D.value.limit;
|
||
return oe > Q.length && (oe = Q.length), {
|
||
icons: Q.slice(D.value.start, oe),
|
||
total: Q.length,
|
||
limit: D.value.limit,
|
||
start: D.value.start
|
||
};
|
||
}
|
||
const W = K(""), k = K(""), Y = (T, x = !1) => {
|
||
W.value = T, x && ce();
|
||
}, ce = () => {
|
||
i.value = !1;
|
||
let T = W.value;
|
||
k.value && (T = T + ":" + k.value), c(T);
|
||
}, E = (T) => {
|
||
k.value = T;
|
||
}, M = async () => {
|
||
D.value.start += D.value.limit, await A();
|
||
}, I = B(() => ({
|
||
...r.tabs,
|
||
[a.tabs.modelValue]: b.value,
|
||
[`onUpdate:${a.tabs.modelValue}`]: F
|
||
}));
|
||
return (T, x) => {
|
||
const Q = J("fs-icon"), oe = J("fs-button"), ye = J("fs-loading");
|
||
return w(), j("div", sm, [
|
||
(w(), V(z(q(a).input.name), H(l.value, {
|
||
class: "fs-icon-selector-search",
|
||
onClick: d
|
||
}), {
|
||
prefix: N(() => [
|
||
e.modelValue ? (w(), V(Q, {
|
||
key: 0,
|
||
class: "fs-icon-selector-input-prefix",
|
||
icon: e.modelValue
|
||
}, null, 8, ["icon"])) : ne("", !0)
|
||
]),
|
||
_: 1
|
||
}, 16)),
|
||
i.value ? (w(), j("div", lm, [
|
||
(w(), V(z(q(a).dialog.name), H({
|
||
preset: "dialog",
|
||
title: "选择图标"
|
||
}, s.value, { footer: null }), {
|
||
default: N(() => [
|
||
ee("div", um, [
|
||
ee("div", cm, [
|
||
(w(), V(z(q(a).tabs.name), H(I.value, { type: "card" }), {
|
||
default: N(() => [
|
||
(w(), V(z(q(a).tabPane.name), Be({
|
||
key: "all",
|
||
[q(a).tabPane.key || ""]: "all",
|
||
[q(a).tabPane.tab || ""]: "全部"
|
||
}), null, 16)),
|
||
(w(!0), j(we, null, Ee(e.iconSets, (re) => (w(), V(z(q(a).tabPane.name), Be({
|
||
key: re,
|
||
[q(a).tabPane.key || ""]: re,
|
||
[q(a).tabPane.tab || ""]: re
|
||
}), null, 16))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16)),
|
||
ee("div", dm, [
|
||
(w(), V(z(q(a).input.name), Be({
|
||
[q(a).input.modelValue]: y.value,
|
||
["onUpdate:" + q(a).input.modelValue]: x[0] || (x[0] = (re) => y.value = re),
|
||
class: "search-input",
|
||
placeholder: "搜索图标, 双击选择",
|
||
onKeydown: us(A, ["enter"])
|
||
}), {
|
||
suffix: N(() => [
|
||
L(oe, {
|
||
type: "primary",
|
||
size: "small",
|
||
icon: q(a).icons.search,
|
||
onClick: A
|
||
}, null, 8, ["icon"])
|
||
]),
|
||
_: 1
|
||
}, 16)),
|
||
ee("div", fm, [
|
||
x[2] || (x[2] = St(" 图标颜色: ", -1)),
|
||
(w(!0), j(we, null, Ee(e.colors, (re) => (w(), j("div", {
|
||
key: re,
|
||
class: _t(["color-item", { active: re === k.value }]),
|
||
style: jn({ backgroundColor: re }),
|
||
onClick: (m) => E(re)
|
||
}, xe(re ? "" : "无"), 15, hm))), 128)),
|
||
(w(), V(z(q(a).input.name), Be({
|
||
style: { width: "100px" },
|
||
icon: q(a).icons.search,
|
||
[q(a).input.modelValue || ""]: k.value,
|
||
onInput: x[1] || (x[1] = (re) => E(re))
|
||
}), null, 16, ["icon"]))
|
||
])
|
||
]),
|
||
ee("div", mm, [
|
||
ee("div", pm, [
|
||
(w(!0), j(we, null, Ee(D.value.records, (re) => (w(), j("div", {
|
||
key: re,
|
||
class: _t(["icon-item", { active: re === W.value }]),
|
||
title: re,
|
||
onClick: (m) => Y(re, !1),
|
||
onDblclick: (m) => Y(re, !0)
|
||
}, [
|
||
L(Q, {
|
||
icon: k.value ? `${re}:${k.value}` : re,
|
||
class: "text-2xl"
|
||
}, null, 8, ["icon"])
|
||
], 42, gm))), 128))
|
||
]),
|
||
ee("div", vm, [
|
||
D.value.loading ? (w(), V(ye, {
|
||
key: 0,
|
||
loading: D.value.loading,
|
||
text: "加载中"
|
||
}, null, 8, ["loading"])) : D.value.total == null || D.value.total == 0 ? (w(), j("div", bm, x[3] || (x[3] = [
|
||
ee("div", null, "暂无数据", -1)
|
||
]))) : D.value.total > D.value.start + D.value.limit ? (w(), j("div", {
|
||
key: 2,
|
||
onClick: M
|
||
}, x[4] || (x[4] = [
|
||
ee("div", null, "加载更多", -1)
|
||
]))) : ne("", !0)
|
||
])
|
||
]),
|
||
ee("div", ym, [
|
||
L(oe, {
|
||
type: "primary",
|
||
onClick: ce
|
||
}, {
|
||
default: N(() => x[5] || (x[5] = [
|
||
St("确定", -1)
|
||
])),
|
||
_: 1,
|
||
__: [5]
|
||
})
|
||
])
|
||
])
|
||
])
|
||
]),
|
||
_: 1
|
||
}, 16))
|
||
])) : ne("", !0)
|
||
]);
|
||
};
|
||
}
|
||
});
|
||
const Cm = ue({
|
||
name: "FsDictRadio",
|
||
props: {
|
||
/**
|
||
* 数据字典配置
|
||
*/
|
||
dict: {},
|
||
/**
|
||
* 可选项,比dict.data优先级高
|
||
*/
|
||
options: { type: Array },
|
||
/**
|
||
* radio组件名称
|
||
* antdv使用button样式的时候有用
|
||
* 即将废弃,请使用optionName
|
||
*/
|
||
radioName: {},
|
||
/**
|
||
* 选项的组件名称
|
||
*/
|
||
optionName: {
|
||
type: String
|
||
},
|
||
/**
|
||
* 选项的属性
|
||
*/
|
||
optionProps: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 转换DictData
|
||
*/
|
||
transformDictData: {
|
||
type: Function,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 字典数据变化事件
|
||
*/
|
||
"dict-change",
|
||
/**
|
||
* 选中值变化事件,可以获取到当前选中的option对象
|
||
*/
|
||
"selected-change",
|
||
/**
|
||
* 值变化事件
|
||
*/
|
||
"change"
|
||
],
|
||
setup(e, t) {
|
||
const { ui: n } = Ce();
|
||
e.radioName && console.warn("参数radioName即将废弃,请改成optionName");
|
||
const o = B(() => e.optionName ?? e.radioName ?? n.radio.name);
|
||
let r = dn(e, t, n.radioGroup.modelValue);
|
||
const a = r.createComputedOptions();
|
||
return {
|
||
ui: n,
|
||
computedRadioName: o,
|
||
...r,
|
||
computedOptions: a,
|
||
onSelectedChange: (s) => {
|
||
t.emit("change", s), s && s.target && (s = s.target.value);
|
||
const u = r.getDict();
|
||
if (u && u.dataMap && u.dataMap[s]) {
|
||
const l = u.dataMap[s];
|
||
t.emit("selected-change", l);
|
||
} else
|
||
t.emit("selected-change", null);
|
||
}
|
||
};
|
||
}
|
||
});
|
||
function Sm(e, t, n, o, r, a) {
|
||
return w(), V(z(e.ui.radioGroup.name), { onChange: e.onSelectedChange }, {
|
||
default: N(() => [
|
||
(w(!0), j(we, null, Ee(e.computedOptions, (i) => (w(), V(z(e.computedRadioName), H({
|
||
ref_for: !0,
|
||
ref: "radioRef",
|
||
key: e.getValue(i),
|
||
[e.ui.radio.value || ""]: e.getValue(i)
|
||
}, { ref_for: !0 }, e.optionProps), {
|
||
default: N(() => [
|
||
St(xe(e.getLabel(i)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040))), 128))
|
||
]),
|
||
_: 1
|
||
}, 40, ["onChange"]);
|
||
}
|
||
const Fm = /* @__PURE__ */ Te(Cm, [["render", Sm]]), Rm = ue({
|
||
name: "FsDictSelect"
|
||
}), Dm = /* @__PURE__ */ ue({
|
||
...Rm,
|
||
props: {
|
||
dict: {},
|
||
options: {},
|
||
slots: {},
|
||
renderLabel: {
|
||
type: Function
|
||
},
|
||
transformDictData: {
|
||
type: Function
|
||
}
|
||
},
|
||
emits: ["dict-change", "selected-change", "change"],
|
||
setup(e, {
|
||
expose: t,
|
||
emit: n
|
||
}) {
|
||
const o = e, r = n, a = K(), {
|
||
t: i
|
||
} = ut(), s = B(() => o.placeholder || i("fs.component.select.placeholder")), {
|
||
ui: u
|
||
} = Ce(), l = Qo(), d = dn(o, {
|
||
emit: r,
|
||
attrs: l
|
||
}, u.select.modelValue), h = d.createComputedOptions(), f = (y) => {
|
||
r("change", y);
|
||
const b = d.getDict();
|
||
if (y && Array.isArray(y) && y.length > 0) {
|
||
const F = [];
|
||
for (const R of y)
|
||
b && b.dataMap && b.dataMap[R] && F.push(b.dataMap[R]);
|
||
r("selected-change", F);
|
||
return;
|
||
}
|
||
if (b && b.dataMap && b.dataMap[y]) {
|
||
const F = b.dataMap[y];
|
||
r("selected-change", F);
|
||
} else
|
||
r("selected-change", null);
|
||
}, v = Hr();
|
||
t({
|
||
selectRef: a,
|
||
computedPlaceholder: s,
|
||
...d,
|
||
computedOptions: h,
|
||
onSelectedChange: f
|
||
});
|
||
const p = () => {
|
||
const {
|
||
ui: y
|
||
} = Ce(), b = z(y.select.name), F = y.select.modelValue;
|
||
if (y.option.name == null) {
|
||
const P = h.value || [], W = {
|
||
[`onUpdate:${F}`]: (Y) => {
|
||
this.$emit(`onUpdate:${F}`, Y), f(Y);
|
||
},
|
||
...l
|
||
}, k = {
|
||
...v,
|
||
...o.slots
|
||
};
|
||
return L(b, H({
|
||
ref: "selectRef",
|
||
placeholder: s.value,
|
||
options: P,
|
||
renderLabel: o.renderLabel
|
||
}, W), k);
|
||
}
|
||
const R = [], D = z(y.option.name), A = h.value || [];
|
||
for (const P of A) {
|
||
const W = L(D, H(P, {
|
||
value: d.getValue(P),
|
||
label: d.getLabel(P)
|
||
}), {
|
||
default: () => [o.renderLabel ? o.renderLabel(P) : d.getLabel(P)]
|
||
});
|
||
R.push(W);
|
||
}
|
||
const $ = {
|
||
default: () => R,
|
||
...v,
|
||
...o.slots
|
||
};
|
||
return L(b, H({
|
||
ref: "selectRef",
|
||
placeholder: s.value,
|
||
onChange: f
|
||
}, l), $);
|
||
};
|
||
return (y, b) => (w(), V(p));
|
||
}
|
||
});
|
||
function km(e) {
|
||
if (e == null)
|
||
return 0;
|
||
typeof e != "string" && (e = JSON.stringify(e));
|
||
let t = 0, n, o, r;
|
||
if (e.length === 0)
|
||
return t;
|
||
for (n = 0, r = e.length; n < r; n++)
|
||
o = e.charCodeAt(n), t = (t << 5) - t + o, t |= 0;
|
||
return Math.abs(t);
|
||
}
|
||
function Om(e) {
|
||
let t = [];
|
||
return typeof e.modelValue == "string" && e.multiple && e.separator != null && e.separator !== "" ? t = e.modelValue.split(e.separator) : e.modelValue instanceof Array ? t = e.modelValue : t = [e.modelValue], t;
|
||
}
|
||
const $m = ue({
|
||
name: "FsValuesFormat",
|
||
props: {
|
||
/**
|
||
* 值
|
||
*/
|
||
modelValue: {},
|
||
/**
|
||
* 字典配置
|
||
*/
|
||
dict: {},
|
||
/**
|
||
* 是否多选
|
||
*/
|
||
multiple: { default: !0 },
|
||
/**
|
||
* 分隔符<br/>
|
||
* 多选时,如果value为string,则以该分隔符分割成多个展示<br/>
|
||
* 传入空字符串,表示不分割<br/>
|
||
*/
|
||
separator: { default: "," },
|
||
/**
|
||
* 颜色
|
||
* element=【auto, primary, success, warning, danger ,info】
|
||
* antdv=【auto, primary, success, blue,red,...】
|
||
* 配置auto,则自动根据value值hashcode分配颜色值
|
||
*/
|
||
color: {},
|
||
/**
|
||
* 效果(仅element)
|
||
**/
|
||
effect: {},
|
||
/**
|
||
* 自动染色颜色值列表
|
||
*/
|
||
autoColors: {
|
||
type: Array
|
||
},
|
||
/**
|
||
* 自动主题列表(仅element)
|
||
* 【 light, plain 】
|
||
*/
|
||
autoEffects: {
|
||
type: Array
|
||
},
|
||
/**
|
||
* 显示类型:【text, tag】
|
||
*/
|
||
type: {
|
||
default: "tag"
|
||
},
|
||
/**
|
||
* 值的类型,【 value | object】
|
||
*/
|
||
valueType: {
|
||
type: String
|
||
},
|
||
/**
|
||
* 当value值不在字典中时默认显示的文本
|
||
*/
|
||
defaultLabel: {},
|
||
/**
|
||
* label自定义render
|
||
*/
|
||
labelFormatter: {
|
||
type: Function
|
||
},
|
||
/**
|
||
* 自定义选项render
|
||
*/
|
||
itemRender: {
|
||
type: Function
|
||
},
|
||
closable: {
|
||
type: Boolean,
|
||
default: !1
|
||
}
|
||
},
|
||
emits: ["click", "dict-change", "close", "update:modelValue"],
|
||
setup(e, t) {
|
||
const { ui: n } = Ce(), o = n.tag.colors, r = ["plain", "light"], a = dn(e, t), { getColor: i, getValue: s, removePropValue: u } = a;
|
||
a.watchValue();
|
||
function l(f, v) {
|
||
!v.effect && f.effect && (v.effect = f.effect);
|
||
const p = n.tag.type, y = i(v);
|
||
if (y != null) {
|
||
if (typeof y != "string")
|
||
return;
|
||
u(v, "color"), v[p] = y;
|
||
return;
|
||
}
|
||
if (f.color === "auto") {
|
||
const b = km(s(v));
|
||
s(v);
|
||
const F = f.autoColors ? f.autoColors : o;
|
||
v[p] = F[b % F.length];
|
||
const R = f.autoEffects ? f.autoEffects : r;
|
||
v.effect = R[Math.floor(b / F.length) % R.length];
|
||
} else
|
||
v[p] = f.color;
|
||
}
|
||
const c = B(() => {
|
||
var R, D;
|
||
if (e.valueType === "object")
|
||
return e.modelValue && !Array.isArray(e.modelValue) ? [e.modelValue] : e.modelValue;
|
||
const f = a.getDict();
|
||
if (e.modelValue == null || e.modelValue === "")
|
||
return [];
|
||
const v = Om(e);
|
||
let p = [];
|
||
const y = ((R = e.dict) == null ? void 0 : R.value) || "value", b = ((D = e.dict) == null ? void 0 : D.label) || "label";
|
||
f ? (p = f.getNodesFromDataMap(v), G(p, (A) => {
|
||
A[b] == null && (A[b] = e.defaultLabel || A[y]);
|
||
})) : (p = [], G(v, (A) => {
|
||
A instanceof Object ? p.push(A) : p.push({
|
||
[y]: A,
|
||
[b]: A
|
||
});
|
||
}));
|
||
const F = [];
|
||
return G(p, (A) => {
|
||
F.push(_n(A, "children"));
|
||
}), G(F, (A) => {
|
||
l(e, A);
|
||
}), F;
|
||
});
|
||
function d(f) {
|
||
t.emit("click", { item: f });
|
||
}
|
||
function h(f, v) {
|
||
t.emit("close", { item: v, index: f });
|
||
const p = [];
|
||
for (let y = 0; y < c.value.length; y++)
|
||
y !== f && p.push(s(c.value[y]));
|
||
t.emit("update:modelValue", p);
|
||
}
|
||
return {
|
||
ui: n,
|
||
...a,
|
||
doClick: d,
|
||
computedValueItems: c,
|
||
doClose: h
|
||
};
|
||
}
|
||
});
|
||
const Em = { class: "fs-values-format" }, Tm = ["onClick"];
|
||
function Im(e, t, n, o, r, a) {
|
||
const i = J("fs-render"), s = J("fs-icon");
|
||
return w(), j("span", Em, [
|
||
e.itemRender ? (w(!0), j(we, { key: 0 }, Ee(e.computedValueItems, (u) => (w(), V(i, {
|
||
key: e.getValue(u),
|
||
"render-func": e.itemRender,
|
||
scope: u
|
||
}, null, 8, ["render-func", "scope"]))), 128)) : e.type === "text" ? (w(!0), j(we, { key: 1 }, Ee(e.computedValueItems, (u) => (w(), j("span", {
|
||
key: e.getValue(u),
|
||
onClick: (l) => e.doClick(u)
|
||
}, xe(e.getLabel(u)), 9, Tm))), 128)) : (w(!0), j(we, { key: 2 }, Ee(e.computedValueItems, (u, l) => (w(), V(z(e.ui.tag.name), H({
|
||
key: e.getValue(u),
|
||
class: "fs-tag",
|
||
size: "small",
|
||
closable: e.closable
|
||
}, { ref_for: !0 }, u, {
|
||
icon: null,
|
||
name: null,
|
||
onClose: (c) => e.doClose(l, u),
|
||
onClick: (c) => e.doClick(u)
|
||
}), {
|
||
default: N(() => [
|
||
u.icon ? (w(), V(s, {
|
||
key: 0,
|
||
icon: u.icon,
|
||
spin: u.iconSpin,
|
||
class: "fs-tag-icon"
|
||
}, null, 8, ["icon", "spin"])) : ne("", !0),
|
||
St(" " + xe(e.getLabel(u)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040, ["closable", "onClose", "onClick"]))), 128))
|
||
]);
|
||
}
|
||
const Am = /* @__PURE__ */ Te($m, [["render", Im]]), Vm = ue({
|
||
name: "FsDictCascaderFormat",
|
||
props: {
|
||
/**
|
||
* 值<br/>
|
||
* 单选时 '1,2,3' 或 [1,2,3]<br/>
|
||
* 多选[[1,2,3],[4,5,6]]<br/>
|
||
*/
|
||
// @ts-ignore
|
||
modelValue: {
|
||
type: [String, Array],
|
||
default: void 0,
|
||
require: !0
|
||
},
|
||
/**
|
||
* value的分隔符<br/>
|
||
* 多选时,如果value为string,则以该分隔符分割成多个展示<br/>
|
||
* 传入空字符串,表示不分割<br/>
|
||
*/
|
||
// @ts-ignore
|
||
separator: { type: String, default: ",", require: !1 },
|
||
/**
|
||
* 是否多选
|
||
*/
|
||
// @ts-ignore
|
||
multiple: { type: Boolean, default: !1 },
|
||
/**
|
||
* 数据字典
|
||
*/
|
||
dict: {
|
||
type: Object,
|
||
default: void 0,
|
||
require: !1
|
||
}
|
||
},
|
||
emits: ["dict-change"],
|
||
setup(e, t) {
|
||
var r;
|
||
const n = dn(e, t);
|
||
(r = e.dict) != null && r.getNodesByValues && n.watchValue();
|
||
const o = B(() => e.multiple);
|
||
return {
|
||
...n,
|
||
computedMultiple: o
|
||
};
|
||
},
|
||
data() {
|
||
return {};
|
||
},
|
||
computed: {
|
||
labels() {
|
||
return this.modelValue == null ? [] : this.buildValueItem(this.modelValue);
|
||
},
|
||
multipleLabels() {
|
||
if (this.modelValue == null)
|
||
return [];
|
||
const e = [];
|
||
for (const t of this.modelValue)
|
||
e.push(this.buildValueItem(t));
|
||
return e;
|
||
}
|
||
},
|
||
methods: {
|
||
getValueArr(e) {
|
||
if (e == null)
|
||
if (this.multiple) {
|
||
e = [];
|
||
for (const n of this.modelValue)
|
||
for (const o of n)
|
||
e.push(o);
|
||
} else
|
||
e = this.modelValue;
|
||
if (e == null)
|
||
return [];
|
||
let t = null;
|
||
return typeof e == "string" && !this.multiple && this.separator != null && this.separator !== "" ? t = e.split(this.separator) : e instanceof Array ? t = e : t = [e], t;
|
||
},
|
||
buildValueItem(e) {
|
||
const t = this.getValueArr(e), n = this.getDict();
|
||
if (n)
|
||
return n.getNodesFromDataMap(t);
|
||
}
|
||
}
|
||
}), Pm = { key: 0 }, Mm = { key: 0 };
|
||
function Bm(e, t, n, o, r, a) {
|
||
return w(), j("span", null, [
|
||
e.computedMultiple ? (w(!0), j(we, { key: 0 }, Ee(e.multipleLabels, (i, s) => (w(), j("div", { key: s }, [
|
||
(w(!0), j(we, null, Ee(i, (u, l) => (w(), j("span", { key: l }, [
|
||
l !== 0 ? (w(), j("span", Pm, " / ")) : ne("", !0),
|
||
ee("span", null, xe(e.getLabel(u)), 1)
|
||
]))), 128))
|
||
]))), 128)) : (w(!0), j(we, { key: 1 }, Ee(e.labels, (i, s) => (w(), j("span", { key: s }, [
|
||
s !== 0 ? (w(), j("span", Mm, " / ")) : ne("", !0),
|
||
ee("span", null, xe(e.getLabel(i)), 1)
|
||
]))), 128))
|
||
]);
|
||
}
|
||
const jm = /* @__PURE__ */ Te(Vm, [["render", Bm]]), Nm = ue({
|
||
name: "FsDictCascader",
|
||
props: {
|
||
/**
|
||
* 字典配置
|
||
*/
|
||
dict: {},
|
||
/**
|
||
* 选项,比dict.data优先级高
|
||
*/
|
||
options: { type: Array },
|
||
/**
|
||
* 转换DictData
|
||
*/
|
||
transformDictData: {
|
||
type: Function,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 字典数据变化事件
|
||
*/
|
||
"dict-change",
|
||
/**
|
||
* 选中值变化事件,可以获取到当前选中的option对象
|
||
*/
|
||
"selected-change",
|
||
/**
|
||
* 值变化事件
|
||
*/
|
||
"change"
|
||
],
|
||
setup(e, t) {
|
||
const n = K(), o = dn(e, t), { ui: r } = Ce(), a = K();
|
||
e.dict && (a.value = r.cascader.fieldNames({
|
||
// @ts-ignore
|
||
value: e.dict.value,
|
||
// @ts-ignore
|
||
label: e.dict.label,
|
||
// @ts-ignore
|
||
children: e.dict.children
|
||
}));
|
||
const i = o.createComputedOptions();
|
||
function s(u) {
|
||
if (t.emit("change", u), u) {
|
||
let l = [];
|
||
const c = o.getDict();
|
||
if (c && c.dataMap) {
|
||
for (let d of u) {
|
||
const h = c.dataMap[d];
|
||
h && l.push(h);
|
||
}
|
||
t.emit("selected-change", l);
|
||
}
|
||
} else
|
||
t.emit("selected-change", null);
|
||
}
|
||
return {
|
||
ui: r,
|
||
cascaderRef: n,
|
||
...o,
|
||
fieldNamesBinder: a,
|
||
computedOptions: i,
|
||
onSelectChange: s
|
||
};
|
||
}
|
||
});
|
||
function xm(e, t, n, o, r, a) {
|
||
return w(), V(z(e.ui.cascader.name), H({
|
||
ref: "cascaderRef",
|
||
options: e.computedOptions
|
||
}, e.fieldNamesBinder, { onChange: e.onSelectChange }), null, 16, ["options", "onChange"]);
|
||
}
|
||
const Lm = /* @__PURE__ */ Te(Nm, [["render", xm]]), qm = ue({
|
||
name: "FsDictCheckbox",
|
||
props: {
|
||
/**
|
||
* 字典
|
||
*/
|
||
dict: {},
|
||
/**
|
||
* 选项,比dict.data优先级高
|
||
*/
|
||
options: { type: Array, default: void 0, require: !1 },
|
||
/**
|
||
* 选项的组件名称
|
||
*/
|
||
optionName: {
|
||
type: String
|
||
},
|
||
/**
|
||
* 选项的属性
|
||
*/
|
||
optionProps: {
|
||
type: Object,
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 转换DictData
|
||
*/
|
||
transformDictData: {
|
||
type: Function,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 字典数据变化事件
|
||
*/
|
||
"dict-change",
|
||
/**
|
||
* 选中值变化事件,可以获取到当前选中的option对象
|
||
*/
|
||
"selected-change",
|
||
/**
|
||
* 值变化事件
|
||
*/
|
||
"change"
|
||
],
|
||
setup(e, t) {
|
||
const { ui: n } = Ce();
|
||
let o = dn(e, t, n.checkboxGroup.modelValue);
|
||
const r = o.createComputedOptions();
|
||
return {
|
||
ui: n,
|
||
...o,
|
||
computedOptions: r,
|
||
onSelectedChange: (i) => {
|
||
if (t.emit("change", i), i) {
|
||
let s = [];
|
||
const u = o.getDict();
|
||
if (u && u.dataMap) {
|
||
for (let l of i) {
|
||
const c = u.dataMap[l];
|
||
c && s.push(c);
|
||
}
|
||
t.emit("selected-change", s);
|
||
}
|
||
} else
|
||
t.emit("selected-change", null);
|
||
}
|
||
};
|
||
}
|
||
});
|
||
function Hm(e, t, n, o, r, a) {
|
||
return w(), V(z(e.ui.checkboxGroup.name), { onChange: e.onSelectedChange }, {
|
||
default: N(() => [
|
||
(w(!0), j(we, null, Ee(e.computedOptions, (i) => (w(), V(z(e.optionName || e.ui.checkbox.name), H({
|
||
ref_for: !0,
|
||
ref: "checkboxRef",
|
||
key: e.getValue(i),
|
||
[e.ui.checkbox.value || ""]: e.getValue(i)
|
||
}, { ref_for: !0 }, e.optionProps), {
|
||
default: N(() => [
|
||
St(xe(e.getLabel(i)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040))), 128))
|
||
]),
|
||
_: 1
|
||
}, 40, ["onChange"]);
|
||
}
|
||
const zm = /* @__PURE__ */ Te(qm, [["render", Hm]]), Wm = ue({
|
||
name: "FsDictSwitch",
|
||
props: {
|
||
/**
|
||
* 字典第一个为开启
|
||
* 第二个为关闭
|
||
*/
|
||
dict: {
|
||
type: Object
|
||
},
|
||
options: {},
|
||
/**
|
||
* 转换DictData
|
||
*/
|
||
transformDictData: {
|
||
type: Function,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: ["dict-change"],
|
||
setup(e, t) {
|
||
const { ui: n } = Ce();
|
||
let o = dn(e, t, n.switch.modelValue);
|
||
const r = o.createComputedOptions();
|
||
return {
|
||
ui: n,
|
||
...o,
|
||
computedOptions: r
|
||
};
|
||
},
|
||
computed: {
|
||
_active() {
|
||
return this.computedOptions.length > 0 ? this.computedOptions[0] : {};
|
||
},
|
||
_inActive() {
|
||
return this.computedOptions.length > 1 ? this.computedOptions[1] : {};
|
||
},
|
||
binding() {
|
||
var t, n, o, r, a, i;
|
||
const e = Le.get();
|
||
return {
|
||
// @ts-ignore
|
||
[e.switch.activeText]: this._active[((t = this.dict) == null ? void 0 : t.label) || "label"],
|
||
// @ts-ignore
|
||
[e.switch.inactiveText]: this._inActive[((n = this.dict) == null ? void 0 : n.label) || "label"],
|
||
// @ts-ignore
|
||
[e.switch.activeColor]: this._active[((o = this.dict) == null ? void 0 : o.color) || "color"],
|
||
// @ts-ignore
|
||
[e.switch.inactiveColor]: this._inActive[((r = this.dict) == null ? void 0 : r.color) || "color"],
|
||
// @ts-ignore
|
||
[e.switch.activeValue]: this._active[((a = this.dict) == null ? void 0 : a.value) || "value"],
|
||
// @ts-ignore
|
||
[e.switch.inactiveValue]: this._inActive[((i = this.dict) == null ? void 0 : i.value) || "value"]
|
||
};
|
||
}
|
||
}
|
||
});
|
||
function Um(e, t, n, o, r, a) {
|
||
return w(), V(z(e.ui.switch.name), H({ ref: "switchRef" }, e.binding), null, 16);
|
||
}
|
||
const Km = /* @__PURE__ */ Te(Wm, [["render", Um]]), Ym = ue({
|
||
name: "FsDateFormat",
|
||
props: {
|
||
/**
|
||
* 日期时间值,支持long,string,date等,由dayjs转化
|
||
*/
|
||
modelValue: { required: !1 },
|
||
/**
|
||
* 输入格式化,不传则由dayjs自动转化
|
||
*/
|
||
valueFormat: { type: String, default: void 0, required: !1 },
|
||
/**
|
||
* 输出格式化
|
||
*/
|
||
format: { type: String, default: "YYYY-MM-DD HH:mm:ss", required: !1 }
|
||
},
|
||
data() {
|
||
return {
|
||
item: {}
|
||
};
|
||
},
|
||
computed: {
|
||
doFormat() {
|
||
if (this.modelValue == null || this.modelValue === "")
|
||
return "";
|
||
let e = null;
|
||
return this.valueFormat != null ? e = ot(this.modelValue, this.valueFormat) : e = ot(this.modelValue), e.format(this.format);
|
||
}
|
||
},
|
||
created() {
|
||
},
|
||
methods: {}
|
||
});
|
||
function Gm(e, t, n, o, r, a) {
|
||
return w(), j("span", null, xe(e.doFormat), 1);
|
||
}
|
||
const Xm = /* @__PURE__ */ Te(Ym, [["render", Gm]]), Jm = ue({
|
||
name: "FsDictTree",
|
||
components: {},
|
||
props: {
|
||
/**
|
||
* 数据字典
|
||
*/
|
||
dict: {},
|
||
/**
|
||
* 可选项,比dict.data优先级高
|
||
*/
|
||
options: { type: Array },
|
||
/**
|
||
* placeholder
|
||
*/
|
||
placeholder: { type: String },
|
||
/**
|
||
* 转换DictData
|
||
*/
|
||
transformDictData: {
|
||
type: Function,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 字典数据变化事件
|
||
*/
|
||
"dict-change",
|
||
/**
|
||
* 选中值变化事件,可以获取到当前选中的option对象
|
||
*/
|
||
"selected-change",
|
||
/**
|
||
* 值变化事件
|
||
*/
|
||
"change"
|
||
],
|
||
// render () {
|
||
// return this.renderFunc({ data: this.data, dataMap: this.dataMap, scope: this.scope, attrs: this.$attrs })
|
||
// },
|
||
setup(e, t) {
|
||
const { t: n } = ut(), { ui: o } = Ce(), r = B(() => e.placeholder || n("fs.component.select.placeholder"));
|
||
let a = dn(e, t);
|
||
const i = t.slots, s = a.createComputedOptions(), u = B(() => {
|
||
const d = a.getDict();
|
||
return o.treeSelect.buildOptionKeysNameBinding({
|
||
label: d.label,
|
||
value: d.value,
|
||
children: d.children
|
||
});
|
||
}), l = (d) => {
|
||
if (t.emit("change", d), d) {
|
||
const h = a.getDict();
|
||
if (h && h.dataMap)
|
||
if (d instanceof Array) {
|
||
let f = [];
|
||
for (let v of d) {
|
||
const p = h.dataMap[v];
|
||
p && f.push(p);
|
||
}
|
||
t.emit("selected-change", f);
|
||
} else
|
||
t.emit("selected-change", h.dataMap[d]);
|
||
} else
|
||
t.emit("selected-change", null);
|
||
}, c = K();
|
||
return {
|
||
ui: o,
|
||
computedBinding: u,
|
||
computedPlaceholder: r,
|
||
...a,
|
||
computedOptions: s,
|
||
onSelectedChange: l,
|
||
slots: i,
|
||
treeRef: c
|
||
};
|
||
}
|
||
});
|
||
function Qm(e, t, n, o, r, a) {
|
||
const i = J("fs-slot-render");
|
||
return w(), V(z(e.ui.treeSelect.name), H({
|
||
ref: "treeRef",
|
||
[e.ui.treeSelect.options || ""]: e.computedOptions,
|
||
placeholder: e.computedPlaceholder
|
||
}, e.computedBinding, { onChange: e.onSelectedChange }), qr({ _: 2 }, [
|
||
Ee(e.slots, (s, u) => ({
|
||
name: u,
|
||
fn: N((l) => [
|
||
L(i, {
|
||
slots: s,
|
||
scope: l
|
||
}, null, 8, ["slots", "scope"])
|
||
])
|
||
}))
|
||
]), 1040, ["placeholder", "onChange"]);
|
||
}
|
||
const Zm = /* @__PURE__ */ Te(Jm, [["render", Qm]]), ep = {
|
||
class: "fs-table-select"
|
||
}, tp = {
|
||
key: 0,
|
||
class: "fs-table-select-current"
|
||
}, np = /* @__PURE__ */ ue({
|
||
__name: "fs-table-select",
|
||
props: {
|
||
modelValue: {},
|
||
createCrudOptions: {},
|
||
crudOptionsOverride: {
|
||
default: void 0
|
||
},
|
||
beforeOpen: {},
|
||
dict: {},
|
||
select: {
|
||
default: void 0
|
||
},
|
||
showSelect: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
dialog: {
|
||
default: void 0
|
||
},
|
||
showCurrent: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
valuesFormat: {
|
||
default: void 0
|
||
},
|
||
height: {
|
||
default: void 0
|
||
},
|
||
multiple: {
|
||
type: Boolean
|
||
},
|
||
crossPage: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
rowKey: {
|
||
default: void 0
|
||
},
|
||
disabled: {
|
||
type: Boolean,
|
||
default: !1
|
||
},
|
||
readonly: {
|
||
type: Boolean,
|
||
default: !1
|
||
},
|
||
valueType: {
|
||
default: "value"
|
||
},
|
||
viewMode: {
|
||
type: Boolean,
|
||
default: !1
|
||
},
|
||
emitOnViewModel: {
|
||
type: Boolean,
|
||
default: !0
|
||
},
|
||
destroyOnClose: {
|
||
type: Boolean,
|
||
default: !0
|
||
}
|
||
},
|
||
emits: [
|
||
"change",
|
||
"update:modelValue",
|
||
/* 选中行变化事件 */
|
||
"selected-change",
|
||
/*对话框即将关闭*/
|
||
"dialog-close",
|
||
/*对话框已关闭*/
|
||
"dialog-closed",
|
||
/*对话框关闭*/
|
||
"close"
|
||
],
|
||
setup(e, {
|
||
expose: t,
|
||
emit: n
|
||
}) {
|
||
const o = e, r = Hr(), a = n, {
|
||
ui: i
|
||
} = Ce(), {
|
||
t: s
|
||
} = ut(), u = K(), l = K(), c = K(!1);
|
||
function d() {
|
||
c.value = !1, a("close", E());
|
||
}
|
||
function h() {
|
||
c.value = !0;
|
||
}
|
||
const {
|
||
crudRef: f,
|
||
crudBinding: v,
|
||
crudExpose: p
|
||
} = Fu();
|
||
function y(I) {
|
||
I == null || Array.isArray(I) && I.length == 0 ? $.value = [] : (o.multiple ? $.value = I || [] : $.value = [I], o.valueType === "object" && ($.value = $.value.map((T) => o.dict.getValue(T))));
|
||
}
|
||
const b = K(), F = B(() => ({
|
||
wrapper: {}
|
||
})), R = async (I = {}) => {
|
||
var Q, oe;
|
||
if (o.disabled || o.readonly || (Q = o.select) != null && Q.disabled || (oe = o.select) != null && oe.readonly)
|
||
return;
|
||
if (o.dict == null)
|
||
throw new Error("必须配置dict,且必须配置dict.getNodesByValues");
|
||
const T = await Su({
|
||
crudBinding: v,
|
||
crudRef: f,
|
||
createCrudOptions: o.createCrudOptions,
|
||
crudOptionsOverride: k(),
|
||
context: {
|
||
t: s,
|
||
ui: i,
|
||
...I == null ? void 0 : I.context
|
||
},
|
||
crudExpose: p
|
||
});
|
||
y(o.modelValue), o.beforeOpen && await o.beforeOpen({
|
||
crudOptions: I == null ? void 0 : I.crudOptions,
|
||
...E()
|
||
}), I && T.appendCrudOptions(I == null ? void 0 : I.crudOptions);
|
||
const x = Y({
|
||
wrapper: {
|
||
title: o.viewMode ? s("fs.extends.tableSelect.view") : s("fs.extends.tableSelect.select"),
|
||
width: "80%",
|
||
draggable: !0,
|
||
is: i.dialog.name,
|
||
footer: !1,
|
||
...i.formWrapper.buildInitBind(i.dialog.name),
|
||
buttons: {
|
||
reset: {
|
||
show: !1
|
||
},
|
||
cancel: {
|
||
text: s("fs.extends.tableSelect.cancel"),
|
||
async click() {
|
||
b.value.close();
|
||
}
|
||
},
|
||
ok: {
|
||
type: "primary",
|
||
text: s("fs.extends.tableSelect.ok"),
|
||
async click() {
|
||
await ce();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}, {
|
||
wrapper: o.dialog
|
||
});
|
||
return b.value.open(x), await Me(), await p.doRefresh(), T;
|
||
}, D = B(() => ({
|
||
...o.valuesFormat
|
||
})), A = B(() => {
|
||
const I = `onUpdate:${i.select.modelValue}`;
|
||
let T = o.modelValue;
|
||
return o.valueType === "object" && o.modelValue && (o.multiple ? T = o.modelValue.map((x) => o.dict.getValue(x)) : T = o.dict.getValue(o.modelValue)), {
|
||
[i.select.modelValue]: T,
|
||
[I]: (x) => {
|
||
a("update:modelValue", x);
|
||
},
|
||
[i.select.clearable]: !0,
|
||
...i.select.buildMultiBinding(o.multiple),
|
||
show: !1,
|
||
...o.select
|
||
};
|
||
});
|
||
lt(() => o.modelValue, async (I) => {
|
||
I !== $.value && (y(I), await Me(), await o.dict.appendByValues($.value));
|
||
});
|
||
const $ = K([]);
|
||
function P() {
|
||
return o.rowKey || v.value.table.rowKey || "id";
|
||
}
|
||
const W = K(!1);
|
||
function k() {
|
||
var Q, oe;
|
||
let I = i.table;
|
||
((oe = (Q = v.value) == null ? void 0 : Q.table) == null ? void 0 : oe.tableVersion) === "v2" && (I = i.tableV2);
|
||
let T = I.buildSelectionCrudOptions({
|
||
crossPage: o.crossPage,
|
||
selectOnClickRow: !0,
|
||
getRowKey: P,
|
||
getPageData() {
|
||
return v.value.data;
|
||
},
|
||
useCompute: Vt,
|
||
multiple: o.multiple,
|
||
selectedRowKeys: $,
|
||
onSelectedKeysChanged: async (ye) => {
|
||
$.value = [...ye], await Me(), await o.dict.appendByValues($.value);
|
||
}
|
||
});
|
||
return Y({
|
||
table: {
|
||
async onRefreshed() {
|
||
if (I.setSelectedRows) {
|
||
W.value = !0, await Me(), await Me();
|
||
const ye = p.getBaseTableRef();
|
||
I.setSelectedRows({
|
||
getRowKey: P,
|
||
multiple: o.multiple,
|
||
tableRef: ye,
|
||
selectedRowKeys: $
|
||
}), W.value = !1;
|
||
}
|
||
}
|
||
}
|
||
}, T, o.crudOptionsOverride);
|
||
}
|
||
const {
|
||
merge: Y
|
||
} = $e();
|
||
async function ce() {
|
||
var Q;
|
||
if (o.dict.loading)
|
||
return;
|
||
let I = null, T = null;
|
||
((Q = $.value) == null ? void 0 : Q.length) > 0 && (I = [...$.value], T = I.map((oe) => o.dict.getDictMap()[oe]), o.valueType === "object" && (I = T), o.multiple !== !0 && I.length > 0 && (I = I[0])), (!o.viewMode || o.emitOnViewModel) && (a("update:modelValue", I), a("change", I), a("selected-change", T));
|
||
let x = {
|
||
value: I,
|
||
rows: T,
|
||
selectedRowKeys: $.value
|
||
};
|
||
a("dialog-close", x), await Me(), await b.value.close(), a("dialog-closed", x);
|
||
}
|
||
const E = () => ({
|
||
opened: c,
|
||
open: R,
|
||
selectedRowKeys: $,
|
||
dictSelectRef: u,
|
||
valuesFormatRef: l,
|
||
crudRef: f,
|
||
crudBinding: v,
|
||
crudExpose: p
|
||
}), M = K(E());
|
||
return t(M.value), (I, T) => {
|
||
const x = J("fs-dict-select"), Q = J("fs-values-format"), oe = J("fs-crud"), ye = J("fs-form-wrapper");
|
||
return w(), j("div", ep, [!(r != null && r.default) && !I.viewMode ? (w(), V(x, H({
|
||
key: 0,
|
||
ref_key: "dictSelectRef",
|
||
ref: u
|
||
}, A.value, {
|
||
open: !1,
|
||
disabled: I.disabled,
|
||
readonly: I.readonly,
|
||
dict: I.dict,
|
||
onClick: R
|
||
}), null, 16, ["disabled", "readonly", "dict"])) : ne("", !0), ae(I.$slots, "default", Be(xt(M.value))), (w(), V(z(q(i).formItem.skipValidationWrapper), null, {
|
||
default: N(() => [L(ye, H({
|
||
ref_key: "formWrapperRef",
|
||
ref: b
|
||
}, F.value, {
|
||
onClosed: d,
|
||
onOpen: h
|
||
}), {
|
||
"form-body-top": N(() => [c.value || I.destroyOnClose === !1 ? (w(), j("div", {
|
||
key: 0,
|
||
style: jn({
|
||
width: "100%",
|
||
height: I.height || "70vh"
|
||
})
|
||
}, [L(oe, H({
|
||
ref_key: "crudRef",
|
||
ref: f
|
||
}, q(v)), {
|
||
"header-top": N(() => [I.showCurrent !== !1 && !I.viewMode ? (w(), j("div", tp, [T[1] || (T[1] = St(" 当前选中: ", -1)), L(Q, H({
|
||
ref_key: "valuesFormatRef",
|
||
ref: l,
|
||
modelValue: $.value,
|
||
"onUpdate:modelValue": T[0] || (T[0] = (re) => $.value = re),
|
||
dict: I.dict,
|
||
closable: !0
|
||
}, D.value), null, 16, ["modelValue", "dict"])])) : ne("", !0)]),
|
||
_: 1
|
||
}, 16)], 4)) : ne("", !0)]),
|
||
_: 1
|
||
}, 16)]),
|
||
_: 1
|
||
}))]);
|
||
};
|
||
}
|
||
});
|
||
const op = { class: "fs-editable-select" }, rp = { class: "select" }, ap = ue({
|
||
/**
|
||
* 可编辑选择器
|
||
*/
|
||
name: "FsEditableSelect"
|
||
}), ip = /* @__PURE__ */ ue({
|
||
...ap,
|
||
props: {
|
||
modelValue: {},
|
||
dict: {},
|
||
tableSelect: {},
|
||
dictSelect: {},
|
||
button: {}
|
||
},
|
||
emits: [
|
||
/**
|
||
* 关闭对话框时触发
|
||
*/
|
||
"refresh",
|
||
"update:modelValue"
|
||
],
|
||
setup(e, { emit: t }) {
|
||
const n = e, o = t;
|
||
function r() {
|
||
var i;
|
||
o("refresh"), (i = n.dict) == null || i.reloadDict();
|
||
}
|
||
function a(i) {
|
||
o("update:modelValue", i);
|
||
}
|
||
return (i, s) => {
|
||
const u = J("fs-dict-select"), l = J("fs-button"), c = J("fs-table-select");
|
||
return w(), j("div", op, [
|
||
ee("div", rp, [
|
||
L(u, H({
|
||
value: i.modelValue,
|
||
dict: i.dict
|
||
}, i.dictSelect, { "onUpdate:value": a }), null, 16, ["value", "dict"])
|
||
]),
|
||
L(c, H({
|
||
class: "table-select",
|
||
"model-value": i.modelValue,
|
||
dict: i.dict,
|
||
"destroy-on-close": !1,
|
||
height: "400px"
|
||
}, i.tableSelect, {
|
||
"onUpdate:modelValue": a,
|
||
onDialogClosed: r
|
||
}), {
|
||
default: N((d) => [
|
||
L(l, H({
|
||
type: "primary",
|
||
icon: "ant-design:edit-outlined"
|
||
}, i.button, {
|
||
onClick: d.open
|
||
}), null, 16, ["onClick"])
|
||
]),
|
||
_: 1
|
||
}, 16, ["model-value", "dict"])
|
||
]);
|
||
};
|
||
}
|
||
});
|
||
const Na = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
FsActionbar: gf,
|
||
FsBox: Rc,
|
||
FsButton: rc,
|
||
FsCell: nf,
|
||
FsColumnsFilterLayoutDefault: Ih,
|
||
FsComponentRender: Oc,
|
||
FsContainer: Lu,
|
||
FsCrud: hd,
|
||
FsDateFormat: Xm,
|
||
FsDictCascader: Lm,
|
||
FsDictCascaderFormat: jm,
|
||
FsDictCheckbox: zm,
|
||
FsDictRadio: Fm,
|
||
FsDictSelect: Dm,
|
||
FsDictSwitch: Km,
|
||
FsDictTree: Zm,
|
||
FsEditable: ff,
|
||
FsEditableCell: of,
|
||
FsEditableSelect: ip,
|
||
FsForm: Ic,
|
||
FsFormHelper: Gc,
|
||
FsFormItem: qc,
|
||
FsFormItemCol: Hc,
|
||
FsFormProvider: Qc,
|
||
FsFormWrapper: ao,
|
||
FsIcon: ac,
|
||
FsIconSelector: _m,
|
||
FsIconSvg: hc,
|
||
FsIconify: lc,
|
||
FsLabel: vc,
|
||
FsLayoutCard: oc,
|
||
FsLayoutDefault: Gu,
|
||
FsLoading: _c,
|
||
FsPage: Yl,
|
||
FsRender: wi,
|
||
FsRowHandle: bd,
|
||
FsSearch: xh,
|
||
FsSearchLayoutDefault: om,
|
||
FsSearchV1: Gh,
|
||
FsSlotRender: $c,
|
||
FsTable: tf,
|
||
FsTableColumnsFixedController: zi,
|
||
FsTableSelect: np,
|
||
FsTabsFilter: im,
|
||
FsToolbar: _f,
|
||
FsValuesFormat: Am,
|
||
fsColumnsFilterNestList: Wi
|
||
}, Symbol.toStringTag, { value: "Module" })), { setDictRequest: sp } = $u(), Rp = {
|
||
install(e, t = {}) {
|
||
t.ui && Le.set(t.ui);
|
||
const { merge: n } = $e();
|
||
t.commonOptions && (oo.commonOptions = t.commonOptions), t.dictRequest && sp(t.dictRequest), t.i18n && ko.setVueI18n(t.i18n);
|
||
const o = t.customComponents || {};
|
||
for (const r in Na) {
|
||
const a = o[r] || Na[r];
|
||
e.component(r, a);
|
||
}
|
||
ao._context = e._context, $n.install(), e.config.globalProperties.$fsui = Le.get(), n(Vu.logger, t.logger), lp(t.logger);
|
||
}
|
||
};
|
||
function lp(e) {
|
||
var t;
|
||
((t = e == null ? void 0 : e.off) == null ? void 0 : t.tableColumns) !== !1 && console.warn(`[fast-crud] crudBinding.value.table.columns / toolbar.columnsFilter.originalColumns 由array改成map. 请改成通过key读取,你可以全局代码搜索【value.table.columns / columnsFilter.originalColumns】来检查是否有使用它们。
|
||
[通过 app.use(FastCrud,{logger:{off:{tableColumns:false}}}) 可关闭此警告] `);
|
||
}
|
||
export {
|
||
hd as $,
|
||
Xr as A,
|
||
fi as B,
|
||
tr as C,
|
||
yi as D,
|
||
_u as E,
|
||
Rp as F,
|
||
Vu as G,
|
||
Yl as H,
|
||
Lu as I,
|
||
Gu as J,
|
||
oc as K,
|
||
Oc as L,
|
||
$c as M,
|
||
wi as N,
|
||
rc as O,
|
||
ac as P,
|
||
lc as Q,
|
||
hc as R,
|
||
_m as S,
|
||
vc as T,
|
||
Ic as U,
|
||
qc as V,
|
||
Hc as W,
|
||
Gc as X,
|
||
ao as Y,
|
||
Qc as Z,
|
||
_c as _,
|
||
ut as a,
|
||
tf as a0,
|
||
nf as a1,
|
||
of as a2,
|
||
ff as a3,
|
||
bd as a4,
|
||
xh as a5,
|
||
Gh as a6,
|
||
om as a7,
|
||
im as a8,
|
||
gf as a9,
|
||
_f as aa,
|
||
Ih as ab,
|
||
Wi as ac,
|
||
zi as ad,
|
||
Fm as ae,
|
||
Dm as af,
|
||
Am as ag,
|
||
jm as ah,
|
||
Lm as ai,
|
||
zm as aj,
|
||
Km as ak,
|
||
Xm as al,
|
||
Rc as am,
|
||
Zm as an,
|
||
np as ao,
|
||
ip as ap,
|
||
Fp as aq,
|
||
na as ar,
|
||
vu as as,
|
||
bu as at,
|
||
wu as au,
|
||
yp as av,
|
||
Cu as b,
|
||
Zo as c,
|
||
wp as d,
|
||
Su as e,
|
||
Fu as f,
|
||
er as g,
|
||
ou as h,
|
||
ru as i,
|
||
Vt as j,
|
||
dn as k,
|
||
Ou as l,
|
||
$u as m,
|
||
Sp as n,
|
||
ci as o,
|
||
$e as p,
|
||
Zr as q,
|
||
ai as r,
|
||
Os as s,
|
||
Lo as t,
|
||
an as u,
|
||
qo as v,
|
||
ta as w,
|
||
Au as x,
|
||
mu as y,
|
||
di as z
|
||
};
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtYWE0YTg2YmIubWpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdXRpbC5sb2cudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC5zdHJpbmcudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC50cmFjZS50cyIsIi4uLy4uL3NyYy91dGlscy91dGlsLnZpdGUudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC5zdG9yZS50cyIsIi4uLy4uL3NyYy91dGlscy9kZWVwZGFzaC9wcml2YXRlL2dldFBhdGhUb1N0cmluZy50cyIsIi4uLy4uL3NyYy91dGlscy9kZWVwZGFzaC9wcml2YXRlL2dldEl0ZXJhdGUudHMiLCIuLi8uLi9zcmMvdXRpbHMvZGVlcGRhc2gvZ2V0LWVhY2gtZGVlcC50cyIsIi4uLy4uL3NyYy91dGlscy9kZWVwZGFzaC9pbmRleC50cyIsIi4uLy4uL3NyYy91dGlscy91dGlsLmRhc2gudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC5jbGlwYm9hcmQudHMiLCIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiLCIuLi8uLi9zcmMvdXNlL2RlZmF1bHQtY3J1ZC1vcHRpb25zLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvYXNzaXN0LnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvYnV0dG9uLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvY2FzY2FkZXIudHMiLCIuLi8uLi9zcmMvbG9jYWxlL2xhbmcvemgtY24udHMiLCIuLi8uLi9zcmMvbG9jYWxlL2xhbmcvZW4udHMiLCIuLi8uLi9zcmMvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2RheWpzQDEuMTEuMTMvbm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9hZHZhbmNlZEZvcm1hdC5qcyIsIi4uLy4uL3NyYy90eXBlcy9mdW5jdGlvbnMudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3dlZWtPZlllYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3dlZWtkYXkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL2xvY2FsZURhdGEuanMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9kYXRlLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvZWwudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9pY29uLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvbnVtYmVyLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvcGhvbmUudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9zZWxlY3QudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC90ZXh0LnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvdHJlZS50cyIsIi4uLy4uL3NyYy90eXBlcy9pbmRleC50cyIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1wYWdlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1wYWdlLnZ1ZSIsIi4uLy4uL3NyYy91c2UvdXNlLW1lcmdlLnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtY29tcHV0ZS50cyIsIi4uLy4uL3NyYy91dGlscy91dGlsLmNvbnN0YW50cy50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWNvbHVtbnMudHN4IiwiLi4vLi4vc3JjL3VzZS91c2UtZm9ybS50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWV4cG9zZS50cyIsIi4uLy4uL3NyYy9saWIvZnMtZXhwb3J0L2luZGV4LnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtcGx1Z2lucy50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWNydWQudHMiLCIuLi8uLi9zcmMvdXNlL3VzZS1kaWN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xydS1jYWNoZUAxMC40LjMvbm9kZV9tb2R1bGVzL2xydS1jYWNoZS9kaXN0L2VzbS9pbmRleC5qcyIsIi4uLy4uL3NyYy91c2UvdXNlLWRpY3QtZGVmaW5lLnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtdHlwZXMudHMiLCIuLi8uLi9zcmMvdXNlL3VzZS1kcmFnLnRzIiwiLi4vLi4vc3JjL3VzZS9jb25maWcudHMiLCIuLi9zcmMvY29tcG9uZW50cy9jb250YWluZXIvZnMtY29udGFpbmVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1jb250YWluZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY29udGFpbmVyL2ZzLWxheW91dC1kZWZhdWx0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1sYXlvdXQtZGVmYXVsdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb250YWluZXIvZnMtbGF5b3V0LWNhcmQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY29udGFpbmVyL2ZzLWxheW91dC1jYXJkLnZ1ZSIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWJ1dHRvbi50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWljb25pZnkudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvYmFzaWMvZnMtaWNvbmlmeS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLXN2Zy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLXN2Zy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sYWJlbC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sYWJlbC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sb2FkaW5nLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWJveC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1ib3gudnVlIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvcmVuZGVyL2ZzLWNvbXBvbmVudC1yZW5kZXIudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvcmVuZGVyL2ZzLXNsb3QtcmVuZGVyLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL3JlbmRlci9mcy1yZW5kZXIudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1mb3JtLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS1jb2wudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1mb3JtLWhlbHBlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taGVscGVyLnZ1ZSIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS13cmFwcGVyLnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS1wcm92aWRlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9mcy1jcnVkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2ZzLWNydWQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1yb3ctaGFuZGxlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtcm93LWhhbmRsZS52dWUiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vYXN5bmMtdmFsaWRhdG9yQDQuMi41L25vZGVfbW9kdWxlcy9hc3luYy12YWxpZGF0b3IvZGlzdC13ZWIvaW5kZXguanMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9jcnVkL2VkaXRhYmxlL3ZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvZWRpdGFibGUvdXNlLWVkaXRhYmxlLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC91c2UvcHJvdmlkZXIudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLXRhYmxlLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtY2VsbC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9jcnVkL2VkaXRhYmxlL2ZzLWVkaXRhYmxlLWNlbGwudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9lZGl0YWJsZS9mcy1lZGl0YWJsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9hY3Rpb25iYXIvaW5kZXgudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvYWN0aW9uYmFyL2luZGV4LnZ1ZSIsIi4uLy4uL3NyYy9kL2V4cG9zZS50cyIsIi4uLy4uL3NyYy9kL2NvbHVtbnMtZmlsdGVyLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvdG9vbGJhci9mcy10YWJsZS1jb2x1bW5zLWZpbHRlci9pbmRleC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy90b29sYmFyL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvaW5kZXgudnVlIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3NvcnRhYmxlanNAMS4xNC4wL25vZGVfbW9kdWxlcy9zb3J0YWJsZWpzL21vZHVsYXIvc29ydGFibGUuZXNtLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZWRyYWdnYWJsZS1lc0A0LjEuMV92dWVAMy41LjE4X3R5cGVzY3JpcHRANS4xLjZfL25vZGVfbW9kdWxlcy92dWVkcmFnZ2FibGUtZXMvZGlzdC9pbmRleC5lcy5qcyIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtY29sdW1ucy1maWx0ZXItbmVzdC1saXN0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtY29sdW1ucy1maWx0ZXItbGF5b3V0LWRlZmF1bHQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2J1dHRvbnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2J1dHRvbnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9pbmRleC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9zZWFyY2gvc2VhcmNoX3YxLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9zZWFyY2hfdjEudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2xheW91dC1kZWZhdWx0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9sYXlvdXQtZGVmYXVsdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9zZWFyY2gvdGFicy1maWx0ZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1pY29uLXNlbGVjdG9yL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1yYWRpby52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtcmFkaW8udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LXNlbGVjdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLXZhbHVlcy1mb3JtYXQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy12YWx1ZXMtZm9ybWF0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1jYXNjYWRlci1mb3JtYXQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LWNhc2NhZGVyLWZvcm1hdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtY2FzY2FkZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LWNhc2NhZGVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1jaGVja2JveC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtY2hlY2tib3gudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LXN3aXRjaC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRhdGUtZm9ybWF0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC10cmVlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC10cmVlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtdGFibGUtc2VsZWN0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZWRpdGFibGUtc2VsZWN0LnZ1ZSIsIi4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIiFmdW5jdGlvbihlLHQpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOihlPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6ZXx8c2VsZikuZGF5anNfcGx1Z2luX2FkdmFuY2VkRm9ybWF0PXQoKX0odGhpcywoZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgcj10LnByb3RvdHlwZSxuPXIuZm9ybWF0O3IuZm9ybWF0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMscj10aGlzLiRsb2NhbGUoKTtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG4uYmluZCh0aGlzKShlKTt2YXIgcz10aGlzLiR1dGlscygpLGE9KGV8fFwiWVlZWS1NTS1ERFRISDptbTpzc1pcIikucmVwbGFjZSgvXFxbKFteXFxdXSspXXxRfHdvfHd3fHd8V1d8V3x6enp8enxnZ2dnfEdHR0d8RG98WHx4fGt7MSwyfXxTL2csKGZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlXCJRXCI6cmV0dXJuIE1hdGguY2VpbCgodC4kTSsxKS8zKTtjYXNlXCJEb1wiOnJldHVybiByLm9yZGluYWwodC4kRCk7Y2FzZVwiZ2dnZ1wiOnJldHVybiB0LndlZWtZZWFyKCk7Y2FzZVwiR0dHR1wiOnJldHVybiB0Lmlzb1dlZWtZZWFyKCk7Y2FzZVwid29cIjpyZXR1cm4gci5vcmRpbmFsKHQud2VlaygpLFwiV1wiKTtjYXNlXCJ3XCI6Y2FzZVwid3dcIjpyZXR1cm4gcy5zKHQud2VlaygpLFwid1wiPT09ZT8xOjIsXCIwXCIpO2Nhc2VcIldcIjpjYXNlXCJXV1wiOnJldHVybiBzLnModC5pc29XZWVrKCksXCJXXCI9PT1lPzE6MixcIjBcIik7Y2FzZVwia1wiOmNhc2VcImtrXCI6cmV0dXJuIHMucyhTdHJpbmcoMD09PXQuJEg/MjQ6dC4kSCksXCJrXCI9PT1lPzE6MixcIjBcIik7Y2FzZVwiWFwiOnJldHVybiBNYXRoLmZsb29yKHQuJGQuZ2V0VGltZSgpLzFlMyk7Y2FzZVwieFwiOnJldHVybiB0LiRkLmdldFRpbWUoKTtjYXNlXCJ6XCI6cmV0dXJuXCJbXCIrdC5vZmZzZXROYW1lKCkrXCJdXCI7Y2FzZVwienp6XCI6cmV0dXJuXCJbXCIrdC5vZmZzZXROYW1lKFwibG9uZ1wiKStcIl1cIjtkZWZhdWx0OnJldHVybiBlfX0pKTtyZXR1cm4gbi5iaW5kKHRoaXMpKGEpfX19KSk7IixudWxsLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOmV8fHNlbGYpLmRheWpzX3BsdWdpbl93ZWVrT2ZZZWFyPXQoKX0odGhpcywoZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgZT1cIndlZWtcIix0PVwieWVhclwiO3JldHVybiBmdW5jdGlvbihpLG4scil7dmFyIGY9bi5wcm90b3R5cGU7Zi53ZWVrPWZ1bmN0aW9uKGkpe2lmKHZvaWQgMD09PWkmJihpPW51bGwpLG51bGwhPT1pKXJldHVybiB0aGlzLmFkZCg3KihpLXRoaXMud2VlaygpKSxcImRheVwiKTt2YXIgbj10aGlzLiRsb2NhbGUoKS55ZWFyU3RhcnR8fDE7aWYoMTE9PT10aGlzLm1vbnRoKCkmJnRoaXMuZGF0ZSgpPjI1KXt2YXIgZj1yKHRoaXMpLnN0YXJ0T2YodCkuYWRkKDEsdCkuZGF0ZShuKSxzPXIodGhpcykuZW5kT2YoZSk7aWYoZi5pc0JlZm9yZShzKSlyZXR1cm4gMX12YXIgYT1yKHRoaXMpLnN0YXJ0T2YodCkuZGF0ZShuKS5zdGFydE9mKGUpLnN1YnRyYWN0KDEsXCJtaWxsaXNlY29uZFwiKSxvPXRoaXMuZGlmZihhLGUsITApO3JldHVybiBvPDA/cih0aGlzKS5zdGFydE9mKFwid2Vla1wiKS53ZWVrKCk6TWF0aC5jZWlsKG8pfSxmLndlZWtzPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1udWxsKSx0aGlzLndlZWsoZSl9fX0pKTsiLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOmV8fHNlbGYpLmRheWpzX3BsdWdpbl93ZWVrZGF5PXQoKX0odGhpcywoZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gZnVuY3Rpb24oZSx0KXt0LnByb3RvdHlwZS53ZWVrZGF5PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJGxvY2FsZSgpLndlZWtTdGFydHx8MCxpPXRoaXMuJFcsbj0oaTx0P2krNzppKS10O3JldHVybiB0aGlzLiR1dGlscygpLnUoZSk/bjp0aGlzLnN1YnRyYWN0KG4sXCJkYXlcIikuYWRkKGUsXCJkYXlcIil9fX0pKTsiLCIhZnVuY3Rpb24obixlKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShlKToobj1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOm58fHNlbGYpLmRheWpzX3BsdWdpbl9sb2NhbGVEYXRhPWUoKX0odGhpcywoZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjtyZXR1cm4gZnVuY3Rpb24obixlLHQpe3ZhciByPWUucHJvdG90eXBlLG89ZnVuY3Rpb24obil7cmV0dXJuIG4mJihuLmluZGV4T2Y/bjpuLnMpfSx1PWZ1bmN0aW9uKG4sZSx0LHIsdSl7dmFyIGk9bi5uYW1lP246bi4kbG9jYWxlKCksYT1vKGlbZV0pLHM9byhpW3RdKSxmPWF8fHMubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gbi5zbGljZSgwLHIpfSkpO2lmKCF1KXJldHVybiBmO3ZhciBkPWkud2Vla1N0YXJ0O3JldHVybiBmLm1hcCgoZnVuY3Rpb24obixlKXtyZXR1cm4gZlsoZSsoZHx8MCkpJTddfSkpfSxpPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTHNbdC5sb2NhbGUoKV19LGE9ZnVuY3Rpb24obixlKXtyZXR1cm4gbi5mb3JtYXRzW2VdfHxmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC8oXFxbW15cXF1dK10pfChNTU1NfE1NfEREfGRkZGQpL2csKGZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gZXx8dC5zbGljZSgxKX0pKX0obi5mb3JtYXRzW2UudG9VcHBlckNhc2UoKV0pfSxzPWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm57bW9udGhzOmZ1bmN0aW9uKGUpe3JldHVybiBlP2UuZm9ybWF0KFwiTU1NTVwiKTp1KG4sXCJtb250aHNcIil9LG1vbnRoc1Nob3J0OmZ1bmN0aW9uKGUpe3JldHVybiBlP2UuZm9ybWF0KFwiTU1NXCIpOnUobixcIm1vbnRoc1Nob3J0XCIsXCJtb250aHNcIiwzKX0sZmlyc3REYXlPZldlZWs6ZnVuY3Rpb24oKXtyZXR1cm4gbi4kbG9jYWxlKCkud2Vla1N0YXJ0fHwwfSx3ZWVrZGF5czpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLmZvcm1hdChcImRkZGRcIik6dShuLFwid2Vla2RheXNcIil9LHdlZWtkYXlzTWluOmZ1bmN0aW9uKGUpe3JldHVybiBlP2UuZm9ybWF0KFwiZGRcIik6dShuLFwid2Vla2RheXNNaW5cIixcIndlZWtkYXlzXCIsMil9LHdlZWtkYXlzU2hvcnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/ZS5mb3JtYXQoXCJkZGRcIik6dShuLFwid2Vla2RheXNTaG9ydFwiLFwid2Vla2RheXNcIiwzKX0sbG9uZ0RhdGVGb3JtYXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGEobi4kbG9jYWxlKCksZSl9LG1lcmlkaWVtOnRoaXMuJGxvY2FsZSgpLm1lcmlkaWVtLG9yZGluYWw6dGhpcy4kbG9jYWxlKCkub3JkaW5hbH19O3IubG9jYWxlRGF0YT1mdW5jdGlvbigpe3JldHVybiBzLmJpbmQodGhpcykoKX0sdC5sb2NhbGVEYXRhPWZ1bmN0aW9uKCl7dmFyIG49aSgpO3JldHVybntmaXJzdERheU9mV2VlazpmdW5jdGlvbigpe3JldHVybiBuLndlZWtTdGFydHx8MH0sd2Vla2RheXM6ZnVuY3Rpb24oKXtyZXR1cm4gdC53ZWVrZGF5cygpfSx3ZWVrZGF5c1Nob3J0OmZ1bmN0aW9uKCl7cmV0dXJuIHQud2Vla2RheXNTaG9ydCgpfSx3ZWVrZGF5c01pbjpmdW5jdGlvbigpe3JldHVybiB0LndlZWtkYXlzTWluKCl9LG1vbnRoczpmdW5jdGlvbigpe3JldHVybiB0Lm1vbnRocygpfSxtb250aHNTaG9ydDpmdW5jdGlvbigpe3JldHVybiB0Lm1vbnRoc1Nob3J0KCl9LGxvbmdEYXRlRm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiBhKG4sZSl9LG1lcmlkaWVtOm4ubWVyaWRpZW0sb3JkaW5hbDpuLm9yZGluYWx9fSx0Lm1vbnRocz1mdW5jdGlvbigpe3JldHVybiB1KGkoKSxcIm1vbnRoc1wiKX0sdC5tb250aHNTaG9ydD1mdW5jdGlvbigpe3JldHVybiB1KGkoKSxcIm1vbnRoc1Nob3J0XCIsXCJtb250aHNcIiwzKX0sdC53ZWVrZGF5cz1mdW5jdGlvbihuKXtyZXR1cm4gdShpKCksXCJ3ZWVrZGF5c1wiLG51bGwsbnVsbCxuKX0sdC53ZWVrZGF5c1Nob3J0PWZ1bmN0aW9uKG4pe3JldHVybiB1KGkoKSxcIndlZWtkYXlzU2hvcnRcIixcIndlZWtkYXlzXCIsMyxuKX0sdC53ZWVrZGF5c01pbj1mdW5jdGlvbihuKXtyZXR1cm4gdShpKCksXCJ3ZWVrZGF5c01pblwiLFwid2Vla2RheXNcIiwyLG4pfX19KSk7IixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiPHRlbXBsYXRlPlxuICA8ZGl2IHJlZj1cInBhZ2VSZWZcIiBjbGFzcz1cImZzLXBhZ2VcIj5cbiAgICA8ZGl2IHYtaWY9XCIkc2xvdHMuaGVhZGVyICE9IG51bGxcIiBjbGFzcz1cImZzLXBhZ2UtaGVhZGVyXCI+XG4gICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyXCI+PC9zbG90PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZzLXBhZ2UtY29udGVudFwiPlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgdi1pZj1cIiRzbG90cy5mb290ZXIgIT0gbnVsbFwiIGNsYXNzPVwiZnMtcGFnZS1mb290ZXJcIj5cbiAgICAgIDxzbG90IG5hbWU9XCJmb290ZXJcIj48L3Nsb3Q+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgb25Nb3VudGVkLCByZWYsIFJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzUGFnZVwiLFxuICBzZXR1cCgpIHtcbiAgICBjb25zdCBwYWdlUmVmOiBSZWYgPSByZWYoKTtcbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgY29uc3Qgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFnZVJlZi52YWx1ZS5wYXJlbnROb2RlKTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uVmFsdWUgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShcInBvc2l0aW9uXCIpO1xuICAgICAgaWYgKHBvc2l0aW9uVmFsdWUgIT09IFwicmVsYXRpdmVcIikge1xuICAgICAgICB1dGlscy5sb2dnZXIud2FybihcbiAgICAgICAgICBcImZzLXBhZ2XniLboioLngrnnmoRwb3NpdGlvbuW7uuiuruS4unJlbGF0aXZlLOWboOS4umZzLXBhZ2XkuLrnm7jlr7nlrprkvY3vvIhwb3NpdGlvbjphYnNvbHV0Ze+8ie+8jOWmguaenOagt+W8j+ayoeacieW8guW4uO+8jOS9oOWPr+S7peW/veeVpeatpOitpuWRilwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VSZWZcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1wYWdlIHtcbiAgd2lkdGg6IDEwMCU7XG4gIHRvcDogMDtcbiAgYm90dG9tOiAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgLmZzLXBhZ2UtaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gICAgPiAudGl0bGUge1xuICAgICAgZmxleDogMTtcbiAgICAgIGp1c3RpZnktc2VsZjogZmxleC1zdGFydDtcbiAgICAgIHBhZGRpbmc6IDE4cHg7XG4gICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgIGNvbG9yOiAjNDQ0O1xuXG4gICAgICAuc3ViIHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogZ3JheTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBsaWdodGVyO1xuICAgICAgfVxuICAgIH1cbiAgICA+IC5tb3JlIHtcbiAgICAgIGp1c3RpZnktc2VsZjogZmxleC1lbmQ7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDE4cHg7XG4gICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgIH1cbiAgfVxuICAuZnMtcGFnZS1jb250ZW50IHtcbiAgICBmbGV4OiAxO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IHJlZj1cInBhZ2VSZWZcIiBjbGFzcz1cImZzLXBhZ2VcIj5cbiAgICA8ZGl2IHYtaWY9XCIkc2xvdHMuaGVhZGVyICE9IG51bGxcIiBjbGFzcz1cImZzLXBhZ2UtaGVhZGVyXCI+XG4gICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyXCI+PC9zbG90PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZzLXBhZ2UtY29udGVudFwiPlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgdi1pZj1cIiRzbG90cy5mb290ZXIgIT0gbnVsbFwiIGNsYXNzPVwiZnMtcGFnZS1mb290ZXJcIj5cbiAgICAgIDxzbG90IG5hbWU9XCJmb290ZXJcIj48L3Nsb3Q+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgb25Nb3VudGVkLCByZWYsIFJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzUGFnZVwiLFxuICBzZXR1cCgpIHtcbiAgICBjb25zdCBwYWdlUmVmOiBSZWYgPSByZWYoKTtcbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgY29uc3Qgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFnZVJlZi52YWx1ZS5wYXJlbnROb2RlKTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uVmFsdWUgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShcInBvc2l0aW9uXCIpO1xuICAgICAgaWYgKHBvc2l0aW9uVmFsdWUgIT09IFwicmVsYXRpdmVcIikge1xuICAgICAgICB1dGlscy5sb2dnZXIud2FybihcbiAgICAgICAgICBcImZzLXBhZ2XniLboioLngrnnmoRwb3NpdGlvbuW7uuiuruS4unJlbGF0aXZlLOWboOS4umZzLXBhZ2XkuLrnm7jlr7nlrprkvY3vvIhwb3NpdGlvbjphYnNvbHV0Ze+8ie+8jOWmguaenOagt+W8j+ayoeacieW8guW4uO+8jOS9oOWPr+S7peW/veeVpeatpOitpuWRilwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VSZWZcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1wYWdlIHtcbiAgd2lkdGg6IDEwMCU7XG4gIHRvcDogMDtcbiAgYm90dG9tOiAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgLmZzLXBhZ2UtaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gICAgPiAudGl0bGUge1xuICAgICAgZmxleDogMTtcbiAgICAgIGp1c3RpZnktc2VsZjogZmxleC1zdGFydDtcbiAgICAgIHBhZGRpbmc6IDE4cHg7XG4gICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgIGNvbG9yOiAjNDQ0O1xuXG4gICAgICAuc3ViIHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogZ3JheTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBsaWdodGVyO1xuICAgICAgfVxuICAgIH1cbiAgICA+IC5tb3JlIHtcbiAgICAgIGp1c3RpZnktc2VsZjogZmxleC1lbmQ7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDE4cHg7XG4gICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgIH1cbiAgfVxuICAuZnMtcGFnZS1jb250ZW50IHtcbiAgICBmbGV4OiAxO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICB9XG59XG48L3N0eWxlPlxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCIvKipcbiAqIEBtb2R1bGUgTFJVQ2FjaGVcbiAqL1xuY29uc3QgcGVyZiA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiZcbiAgICBwZXJmb3JtYW5jZSAmJlxuICAgIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbidcbiAgICA/IHBlcmZvcm1hbmNlXG4gICAgOiBEYXRlO1xuY29uc3Qgd2FybmVkID0gbmV3IFNldCgpO1xuLyogYzggaWdub3JlIHN0YXJ0ICovXG5jb25zdCBQUk9DRVNTID0gKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiAhIXByb2Nlc3MgPyBwcm9jZXNzIDoge30pO1xuLyogYzggaWdub3JlIHN0YXJ0ICovXG5jb25zdCBlbWl0V2FybmluZyA9IChtc2csIHR5cGUsIGNvZGUsIGZuKSA9PiB7XG4gICAgdHlwZW9mIFBST0NFU1MuZW1pdFdhcm5pbmcgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBQUk9DRVNTLmVtaXRXYXJuaW5nKG1zZywgdHlwZSwgY29kZSwgZm4pXG4gICAgICAgIDogY29uc29sZS5lcnJvcihgWyR7Y29kZX1dICR7dHlwZX06ICR7bXNnfWApO1xufTtcbmxldCBBQyA9IGdsb2JhbFRoaXMuQWJvcnRDb250cm9sbGVyO1xubGV0IEFTID0gZ2xvYmFsVGhpcy5BYm9ydFNpZ25hbDtcbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuaWYgKHR5cGVvZiBBQyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBBUyA9IGNsYXNzIEFib3J0U2lnbmFsIHtcbiAgICAgICAgb25hYm9ydDtcbiAgICAgICAgX29uYWJvcnQgPSBbXTtcbiAgICAgICAgcmVhc29uO1xuICAgICAgICBhYm9ydGVkID0gZmFsc2U7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXywgZm4pIHtcbiAgICAgICAgICAgIHRoaXMuX29uYWJvcnQucHVzaChmbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIEFDID0gY2xhc3MgQWJvcnRDb250cm9sbGVyIHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB3YXJuQUNQb2x5ZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbCA9IG5ldyBBUygpO1xuICAgICAgICBhYm9ydChyZWFzb24pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5zaWduYWwucmVhc29uID0gcmVhc29uO1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLnNpZ25hbC5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgZm9yIChjb25zdCBmbiBvZiB0aGlzLnNpZ25hbC5fb25hYm9ydCkge1xuICAgICAgICAgICAgICAgIGZuKHJlYXNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNpZ25hbC5vbmFib3J0Py4ocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IHByaW50QUNQb2x5ZmlsbFdhcm5pbmcgPSBQUk9DRVNTLmVudj8uTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HICE9PSAnMSc7XG4gICAgY29uc3Qgd2FybkFDUG9seWZpbGwgPSAoKSA9PiB7XG4gICAgICAgIGlmICghcHJpbnRBQ1BvbHlmaWxsV2FybmluZylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgcHJpbnRBQ1BvbHlmaWxsV2FybmluZyA9IGZhbHNlO1xuICAgICAgICBlbWl0V2FybmluZygnQWJvcnRDb250cm9sbGVyIGlzIG5vdCBkZWZpbmVkLiBJZiB1c2luZyBscnUtY2FjaGUgaW4gJyArXG4gICAgICAgICAgICAnbm9kZSAxNCwgbG9hZCBhbiBBYm9ydENvbnRyb2xsZXIgcG9seWZpbGwgZnJvbSB0aGUgJyArXG4gICAgICAgICAgICAnYG5vZGUtYWJvcnQtY29udHJvbGxlcmAgcGFja2FnZS4gQSBtaW5pbWFsIHBvbHlmaWxsIGlzICcgK1xuICAgICAgICAgICAgJ3Byb3ZpZGVkIGZvciB1c2UgYnkgTFJVQ2FjaGUuZmV0Y2goKSwgYnV0IGl0IHNob3VsZCBub3QgYmUgJyArXG4gICAgICAgICAgICAncmVsaWVkIHVwb24gaW4gb3RoZXIgY29udGV4dHMgKGVnLCBwYXNzaW5nIGl0IHRvIG90aGVyIEFQSXMgdGhhdCAnICtcbiAgICAgICAgICAgICd1c2UgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIG1pZ2h0IGhhdmUgdW5kZXNpcmFibGUgZWZmZWN0cykuICcgK1xuICAgICAgICAgICAgJ1lvdSBtYXkgZGlzYWJsZSB0aGlzIHdpdGggTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HPTEgaW4gdGhlIGVudi4nLCAnTk9fQUJPUlRfQ09OVFJPTExFUicsICdFTk9UU1VQJywgd2FybkFDUG9seWZpbGwpO1xuICAgIH07XG59XG4vKiBjOCBpZ25vcmUgc3RvcCAqL1xuY29uc3Qgc2hvdWxkV2FybiA9IChjb2RlKSA9PiAhd2FybmVkLmhhcyhjb2RlKTtcbmNvbnN0IFRZUEUgPSBTeW1ib2woJ3R5cGUnKTtcbmNvbnN0IGlzUG9zSW50ID0gKG4pID0+IG4gJiYgbiA9PT0gTWF0aC5mbG9vcihuKSAmJiBuID4gMCAmJiBpc0Zpbml0ZShuKTtcbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuLy8gVGhpcyBpcyBhIGxpdHRsZSBiaXQgcmlkaWN1bG91cywgdGJoLlxuLy8gVGhlIG1heGltdW0gYXJyYXkgbGVuZ3RoIGlzIDJeMzItMSBvciB0aGVyZWFib3V0cyBvbiBtb3N0IEpTIGltcGxzLlxuLy8gQW5kIHdlbGwgYmVmb3JlIHRoYXQgcG9pbnQsIHlvdSdyZSBjYWNoaW5nIHRoZSBlbnRpcmUgd29ybGQsIEkgbWVhbixcbi8vIHRoYXQncyB+MzJHQiBvZiBqdXN0IGludGVnZXJzIGZvciB0aGUgbmV4dC9wcmV2IGxpbmtzLCBwbHVzIHdoYXRldmVyXG4vLyBlbHNlIHRvIGhvbGQgdGhhdCBtYW55IGtleXMgYW5kIHZhbHVlcy4gIEp1c3QgZmlsbGluZyB0aGUgbWVtb3J5IHdpdGhcbi8vIHplcm9lcyBhdCBpbml0IHRpbWUgaXMgYnJ1dGFsIHdoZW4geW91IGdldCB0aGF0IGJpZy5cbi8vIEJ1dCB3aHkgbm90IGJlIGNvbXBsZXRlP1xuLy8gTWF5YmUgaW4gdGhlIGZ1dHVyZSwgdGhlc2UgbGltaXRzIHdpbGwgaGF2ZSBleHBhbmRlZC5cbmNvbnN0IGdldFVpbnRBcnJheSA9IChtYXgpID0+ICFpc1Bvc0ludChtYXgpXG4gICAgPyBudWxsXG4gICAgOiBtYXggPD0gTWF0aC5wb3coMiwgOClcbiAgICAgICAgPyBVaW50OEFycmF5XG4gICAgICAgIDogbWF4IDw9IE1hdGgucG93KDIsIDE2KVxuICAgICAgICAgICAgPyBVaW50MTZBcnJheVxuICAgICAgICAgICAgOiBtYXggPD0gTWF0aC5wb3coMiwgMzIpXG4gICAgICAgICAgICAgICAgPyBVaW50MzJBcnJheVxuICAgICAgICAgICAgICAgIDogbWF4IDw9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gICAgICAgICAgICAgICAgICAgID8gWmVyb0FycmF5XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbi8qIGM4IGlnbm9yZSBzdG9wICovXG5jbGFzcyBaZXJvQXJyYXkgZXh0ZW5kcyBBcnJheSB7XG4gICAgY29uc3RydWN0b3Ioc2l6ZSkge1xuICAgICAgICBzdXBlcihzaXplKTtcbiAgICAgICAgdGhpcy5maWxsKDApO1xuICAgIH1cbn1cbmNsYXNzIFN0YWNrIHtcbiAgICBoZWFwO1xuICAgIGxlbmd0aDtcbiAgICAvLyBwcml2YXRlIGNvbnN0cnVjdG9yXG4gICAgc3RhdGljICNjb25zdHJ1Y3RpbmcgPSBmYWxzZTtcbiAgICBzdGF0aWMgY3JlYXRlKG1heCkge1xuICAgICAgICBjb25zdCBIZWFwQ2xzID0gZ2V0VWludEFycmF5KG1heCk7XG4gICAgICAgIGlmICghSGVhcENscylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgU3RhY2suI2NvbnN0cnVjdGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgU3RhY2sobWF4LCBIZWFwQ2xzKTtcbiAgICAgICAgU3RhY2suI2NvbnN0cnVjdGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgY29uc3RydWN0b3IobWF4LCBIZWFwQ2xzKSB7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAoIVN0YWNrLiNjb25zdHJ1Y3RpbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2luc3RhbnRpYXRlIFN0YWNrIHVzaW5nIFN0YWNrLmNyZWF0ZShuKScpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHRoaXMuaGVhcCA9IG5ldyBIZWFwQ2xzKG1heCk7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgcHVzaChuKSB7XG4gICAgICAgIHRoaXMuaGVhcFt0aGlzLmxlbmd0aCsrXSA9IG47XG4gICAgfVxuICAgIHBvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXTtcbiAgICB9XG59XG4vKipcbiAqIERlZmF1bHQgZXhwb3J0LCB0aGUgdGhpbmcgeW91J3JlIHVzaW5nIHRoaXMgbW9kdWxlIHRvIGdldC5cbiAqXG4gKiBUaGUgYEtgIGFuZCBgVmAgdHlwZXMgZGVmaW5lIHRoZSBrZXkgYW5kIHZhbHVlIHR5cGVzLCByZXNwZWN0aXZlbHkuIFRoZVxuICogb3B0aW9uYWwgYEZDYCB0eXBlIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIGBjb250ZXh0YCBvYmplY3QgcGFzc2VkIHRvXG4gKiBgY2FjaGUuZmV0Y2goKWAgYW5kIGBjYWNoZS5tZW1vKClgLlxuICpcbiAqIEtleXMgYW5kIHZhbHVlcyAqKm11c3Qgbm90KiogYmUgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEFsbCBwcm9wZXJ0aWVzIGZyb20gdGhlIG9wdGlvbnMgb2JqZWN0ICh3aXRoIHRoZSBleGNlcHRpb24gb2YgYG1heGAsXG4gKiBgbWF4U2l6ZWAsIGBmZXRjaE1ldGhvZGAsIGBtZW1vTWV0aG9kYCwgYGRpc3Bvc2VgIGFuZCBgZGlzcG9zZUFmdGVyYCkgYXJlXG4gKiBhZGRlZCBhcyBub3JtYWwgcHVibGljIG1lbWJlcnMuIChUaGUgbGlzdGVkIG9wdGlvbnMgYXJlIHJlYWQtb25seSBnZXR0ZXJzLilcbiAqXG4gKiBDaGFuZ2luZyBhbnkgb2YgdGhlc2Ugd2lsbCBhbHRlciB0aGUgZGVmYXVsdHMgZm9yIHN1YnNlcXVlbnQgbWV0aG9kIGNhbGxzLlxuICovXG5leHBvcnQgY2xhc3MgTFJVQ2FjaGUge1xuICAgIC8vIG9wdGlvbnMgdGhhdCBjYW5ub3QgYmUgY2hhbmdlZCB3aXRob3V0IGRpc2FzdGVyXG4gICAgI21heDtcbiAgICAjbWF4U2l6ZTtcbiAgICAjZGlzcG9zZTtcbiAgICAjZGlzcG9zZUFmdGVyO1xuICAgICNmZXRjaE1ldGhvZDtcbiAgICAjbWVtb01ldGhvZDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudHRsfVxuICAgICAqL1xuICAgIHR0bDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudHRsUmVzb2x1dGlvbn1cbiAgICAgKi9cbiAgICB0dGxSZXNvbHV0aW9uO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS50dGxBdXRvcHVyZ2V9XG4gICAgICovXG4gICAgdHRsQXV0b3B1cmdlO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkdldH1cbiAgICAgKi9cbiAgICB1cGRhdGVBZ2VPbkdldDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25IYXN9XG4gICAgICovXG4gICAgdXBkYXRlQWdlT25IYXM7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGV9XG4gICAgICovXG4gICAgYWxsb3dTdGFsZTtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9EaXNwb3NlT25TZXR9XG4gICAgICovXG4gICAgbm9EaXNwb3NlT25TZXQ7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vVXBkYXRlVFRMfVxuICAgICAqL1xuICAgIG5vVXBkYXRlVFRMO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5tYXhFbnRyeVNpemV9XG4gICAgICovXG4gICAgbWF4RW50cnlTaXplO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5zaXplQ2FsY3VsYXRpb259XG4gICAgICovXG4gICAgc2l6ZUNhbGN1bGF0aW9uO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb259XG4gICAgICovXG4gICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5ub0RlbGV0ZU9uU3RhbGVHZXR9XG4gICAgICovXG4gICAgbm9EZWxldGVPblN0YWxlR2V0O1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlT25GZXRjaEFib3J0fVxuICAgICAqL1xuICAgIGFsbG93U3RhbGVPbkZldGNoQWJvcnQ7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9ufVxuICAgICAqL1xuICAgIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5pZ25vcmVGZXRjaEFib3J0fVxuICAgICAqL1xuICAgIGlnbm9yZUZldGNoQWJvcnQ7XG4gICAgLy8gY29tcHV0ZWQgcHJvcGVydGllc1xuICAgICNzaXplO1xuICAgICNjYWxjdWxhdGVkU2l6ZTtcbiAgICAja2V5TWFwO1xuICAgICNrZXlMaXN0O1xuICAgICN2YWxMaXN0O1xuICAgICNuZXh0O1xuICAgICNwcmV2O1xuICAgICNoZWFkO1xuICAgICN0YWlsO1xuICAgICNmcmVlO1xuICAgICNkaXNwb3NlZDtcbiAgICAjc2l6ZXM7XG4gICAgI3N0YXJ0cztcbiAgICAjdHRscztcbiAgICAjaGFzRGlzcG9zZTtcbiAgICAjaGFzRmV0Y2hNZXRob2Q7XG4gICAgI2hhc0Rpc3Bvc2VBZnRlcjtcbiAgICAvKipcbiAgICAgKiBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCB1bmxlc3MgeW91IG5lZWQgdG8gaW5zcGVjdCB0aGVcbiAgICAgKiBpbm5lciB3b3JraW5ncyBvZiB0aGUgY2FjaGUuICBJZiBhbnl0aGluZyByZXR1cm5lZCBieSB0aGlzXG4gICAgICogb2JqZWN0IGlzIG1vZGlmaWVkIGluIGFueSB3YXksIHN0cmFuZ2UgYnJlYWthZ2UgbWF5IG9jY3VyLlxuICAgICAqXG4gICAgICogVGhlc2UgZmllbGRzIGFyZSBwcml2YXRlIGZvciBhIHJlYXNvbiFcbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyB1bnNhZmVFeHBvc2VJbnRlcm5hbHMoYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLy8gcHJvcGVydGllc1xuICAgICAgICAgICAgc3RhcnRzOiBjLiNzdGFydHMsXG4gICAgICAgICAgICB0dGxzOiBjLiN0dGxzLFxuICAgICAgICAgICAgc2l6ZXM6IGMuI3NpemVzLFxuICAgICAgICAgICAga2V5TWFwOiBjLiNrZXlNYXAsXG4gICAgICAgICAgICBrZXlMaXN0OiBjLiNrZXlMaXN0LFxuICAgICAgICAgICAgdmFsTGlzdDogYy4jdmFsTGlzdCxcbiAgICAgICAgICAgIG5leHQ6IGMuI25leHQsXG4gICAgICAgICAgICBwcmV2OiBjLiNwcmV2LFxuICAgICAgICAgICAgZ2V0IGhlYWQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGMuI2hlYWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IHRhaWwoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGMuI3RhaWw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZnJlZTogYy4jZnJlZSxcbiAgICAgICAgICAgIC8vIG1ldGhvZHNcbiAgICAgICAgICAgIGlzQmFja2dyb3VuZEZldGNoOiAocCkgPT4gYy4jaXNCYWNrZ3JvdW5kRmV0Y2gocCksXG4gICAgICAgICAgICBiYWNrZ3JvdW5kRmV0Y2g6IChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dCkgPT4gYy4jYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KSxcbiAgICAgICAgICAgIG1vdmVUb1RhaWw6IChpbmRleCkgPT4gYy4jbW92ZVRvVGFpbChpbmRleCksXG4gICAgICAgICAgICBpbmRleGVzOiAob3B0aW9ucykgPT4gYy4jaW5kZXhlcyhvcHRpb25zKSxcbiAgICAgICAgICAgIHJpbmRleGVzOiAob3B0aW9ucykgPT4gYy4jcmluZGV4ZXMob3B0aW9ucyksXG4gICAgICAgICAgICBpc1N0YWxlOiAoaW5kZXgpID0+IGMuI2lzU3RhbGUoaW5kZXgpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBQcm90ZWN0ZWQgcmVhZC1vbmx5IG1lbWJlcnNcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UubWF4fSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBtYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNtYXg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5tYXhTaXplfSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBtYXhTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWF4U2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGNvbXB1dGVkIHNpemUgb2YgaXRlbXMgaW4gdGhlIGNhY2hlIChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IGNhbGN1bGF0ZWRTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2FsY3VsYXRlZFNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgaXRlbXMgc3RvcmVkIGluIHRoZSBjYWNoZSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmZldGNoTWV0aG9kfSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBmZXRjaE1ldGhvZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZldGNoTWV0aG9kO1xuICAgIH1cbiAgICBnZXQgbWVtb01ldGhvZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21lbW9NZXRob2Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5kaXNwb3NlfSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBkaXNwb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGlzcG9zZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmRpc3Bvc2VBZnRlcn0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgZGlzcG9zZUFmdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGlzcG9zZUFmdGVyO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgbWF4ID0gMCwgdHRsLCB0dGxSZXNvbHV0aW9uID0gMSwgdHRsQXV0b3B1cmdlLCB1cGRhdGVBZ2VPbkdldCwgdXBkYXRlQWdlT25IYXMsIGFsbG93U3RhbGUsIGRpc3Bvc2UsIGRpc3Bvc2VBZnRlciwgbm9EaXNwb3NlT25TZXQsIG5vVXBkYXRlVFRMLCBtYXhTaXplID0gMCwgbWF4RW50cnlTaXplID0gMCwgc2l6ZUNhbGN1bGF0aW9uLCBmZXRjaE1ldGhvZCwgbWVtb01ldGhvZCwgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLCBub0RlbGV0ZU9uU3RhbGVHZXQsIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLCBhbGxvd1N0YWxlT25GZXRjaEFib3J0LCBpZ25vcmVGZXRjaEFib3J0LCB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKG1heCAhPT0gMCAmJiAhaXNQb3NJbnQobWF4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4IG9wdGlvbiBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFVpbnRBcnJheSA9IG1heCA/IGdldFVpbnRBcnJheShtYXgpIDogQXJyYXk7XG4gICAgICAgIGlmICghVWludEFycmF5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWF4IHZhbHVlOiAnICsgbWF4KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNtYXggPSBtYXg7XG4gICAgICAgIHRoaXMuI21heFNpemUgPSBtYXhTaXplO1xuICAgICAgICB0aGlzLm1heEVudHJ5U2l6ZSA9IG1heEVudHJ5U2l6ZSB8fCB0aGlzLiNtYXhTaXplO1xuICAgICAgICB0aGlzLnNpemVDYWxjdWxhdGlvbiA9IHNpemVDYWxjdWxhdGlvbjtcbiAgICAgICAgaWYgKHRoaXMuc2l6ZUNhbGN1bGF0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI21heFNpemUgJiYgIXRoaXMubWF4RW50cnlTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2Fubm90IHNldCBzaXplQ2FsY3VsYXRpb24gd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2l6ZUNhbGN1bGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWVtb01ldGhvZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2YgbWVtb01ldGhvZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWVtb01ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgZGVmaW5lZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI21lbW9NZXRob2QgPSBtZW1vTWV0aG9kO1xuICAgICAgICBpZiAoZmV0Y2hNZXRob2QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIGZldGNoTWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZmV0Y2hNZXRob2QgPSBmZXRjaE1ldGhvZDtcbiAgICAgICAgdGhpcy4jaGFzRmV0Y2hNZXRob2QgPSAhIWZldGNoTWV0aG9kO1xuICAgICAgICB0aGlzLiNrZXlNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuI2tleUxpc3QgPSBuZXcgQXJyYXkobWF4KS5maWxsKHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuI3ZhbExpc3QgPSBuZXcgQXJyYXkobWF4KS5maWxsKHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuI25leHQgPSBuZXcgVWludEFycmF5KG1heCk7XG4gICAgICAgIHRoaXMuI3ByZXYgPSBuZXcgVWludEFycmF5KG1heCk7XG4gICAgICAgIHRoaXMuI2hlYWQgPSAwO1xuICAgICAgICB0aGlzLiN0YWlsID0gMDtcbiAgICAgICAgdGhpcy4jZnJlZSA9IFN0YWNrLmNyZWF0ZShtYXgpO1xuICAgICAgICB0aGlzLiNzaXplID0gMDtcbiAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgPSAwO1xuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2UgPSBkaXNwb3NlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZUFmdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXIgPSBkaXNwb3NlQWZ0ZXI7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlZCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jaGFzRGlzcG9zZSA9ICEhdGhpcy4jZGlzcG9zZTtcbiAgICAgICAgdGhpcy4jaGFzRGlzcG9zZUFmdGVyID0gISF0aGlzLiNkaXNwb3NlQWZ0ZXI7XG4gICAgICAgIHRoaXMubm9EaXNwb3NlT25TZXQgPSAhIW5vRGlzcG9zZU9uU2V0O1xuICAgICAgICB0aGlzLm5vVXBkYXRlVFRMID0gISFub1VwZGF0ZVRUTDtcbiAgICAgICAgdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24gPSAhIW5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjtcbiAgICAgICAgdGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiA9ICEhYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgICAgIHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9ICEhYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDtcbiAgICAgICAgdGhpcy5pZ25vcmVGZXRjaEFib3J0ID0gISFpZ25vcmVGZXRjaEFib3J0O1xuICAgICAgICAvLyBOQjogbWF4RW50cnlTaXplIGlzIHNldCB0byBtYXhTaXplIGlmIGl0J3Mgc2V0XG4gICAgICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI21heFNpemUgIT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMuI21heFNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heFNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLm1heEVudHJ5U2l6ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXhFbnRyeVNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNpbml0aWFsaXplU2l6ZVRyYWNraW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hbGxvd1N0YWxlID0gISFhbGxvd1N0YWxlO1xuICAgICAgICB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCA9ICEhbm9EZWxldGVPblN0YWxlR2V0O1xuICAgICAgICB0aGlzLnVwZGF0ZUFnZU9uR2V0ID0gISF1cGRhdGVBZ2VPbkdldDtcbiAgICAgICAgdGhpcy51cGRhdGVBZ2VPbkhhcyA9ICEhdXBkYXRlQWdlT25IYXM7XG4gICAgICAgIHRoaXMudHRsUmVzb2x1dGlvbiA9XG4gICAgICAgICAgICBpc1Bvc0ludCh0dGxSZXNvbHV0aW9uKSB8fCB0dGxSZXNvbHV0aW9uID09PSAwXG4gICAgICAgICAgICAgICAgPyB0dGxSZXNvbHV0aW9uXG4gICAgICAgICAgICAgICAgOiAxO1xuICAgICAgICB0aGlzLnR0bEF1dG9wdXJnZSA9ICEhdHRsQXV0b3B1cmdlO1xuICAgICAgICB0aGlzLnR0bCA9IHR0bCB8fCAwO1xuICAgICAgICBpZiAodGhpcy50dGwpIHtcbiAgICAgICAgICAgIGlmICghaXNQb3NJbnQodGhpcy50dGwpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHRsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZVRUTFRyYWNraW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZG8gbm90IGFsbG93IGNvbXBsZXRlbHkgdW5ib3VuZGVkIGNhY2hlc1xuICAgICAgICBpZiAodGhpcy4jbWF4ID09PSAwICYmIHRoaXMudHRsID09PSAwICYmIHRoaXMuI21heFNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0F0IGxlYXN0IG9uZSBvZiBtYXgsIG1heFNpemUsIG9yIHR0bCBpcyByZXF1aXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy50dGxBdXRvcHVyZ2UgJiYgIXRoaXMuI21heCAmJiAhdGhpcy4jbWF4U2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgY29kZSA9ICdMUlVfQ0FDSEVfVU5CT1VOREVEJztcbiAgICAgICAgICAgIGlmIChzaG91bGRXYXJuKGNvZGUpKSB7XG4gICAgICAgICAgICAgICAgd2FybmVkLmFkZChjb2RlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAnVFRMIGNhY2hpbmcgd2l0aG91dCB0dGxBdXRvcHVyZ2UsIG1heCwgb3IgbWF4U2l6ZSBjYW4gJyArXG4gICAgICAgICAgICAgICAgICAgICdyZXN1bHQgaW4gdW5ib3VuZGVkIG1lbW9yeSBjb25zdW1wdGlvbi4nO1xuICAgICAgICAgICAgICAgIGVtaXRXYXJuaW5nKG1zZywgJ1VuYm91bmRlZENhY2hlV2FybmluZycsIGNvZGUsIExSVUNhY2hlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtcyBsZWZ0IGluIHRoZSBpdGVtJ3MgVFRMLiBJZiBpdGVtIGlzIG5vdCBpbiBjYWNoZSxcbiAgICAgKiByZXR1cm5zIGAwYC4gUmV0dXJucyBgSW5maW5pdHlgIGlmIGl0ZW0gaXMgaW4gY2FjaGUgd2l0aG91dCBhIGRlZmluZWQgVFRMLlxuICAgICAqL1xuICAgIGdldFJlbWFpbmluZ1RUTChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2tleU1hcC5oYXMoa2V5KSA/IEluZmluaXR5IDogMDtcbiAgICB9XG4gICAgI2luaXRpYWxpemVUVExUcmFja2luZygpIHtcbiAgICAgICAgY29uc3QgdHRscyA9IG5ldyBaZXJvQXJyYXkodGhpcy4jbWF4KTtcbiAgICAgICAgY29uc3Qgc3RhcnRzID0gbmV3IFplcm9BcnJheSh0aGlzLiNtYXgpO1xuICAgICAgICB0aGlzLiN0dGxzID0gdHRscztcbiAgICAgICAgdGhpcy4jc3RhcnRzID0gc3RhcnRzO1xuICAgICAgICB0aGlzLiNzZXRJdGVtVFRMID0gKGluZGV4LCB0dGwsIHN0YXJ0ID0gcGVyZi5ub3coKSkgPT4ge1xuICAgICAgICAgICAgc3RhcnRzW2luZGV4XSA9IHR0bCAhPT0gMCA/IHN0YXJ0IDogMDtcbiAgICAgICAgICAgIHR0bHNbaW5kZXhdID0gdHRsO1xuICAgICAgICAgICAgaWYgKHR0bCAhPT0gMCAmJiB0aGlzLnR0bEF1dG9wdXJnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2lzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkZWxldGUodGhpcy4ja2V5TGlzdFtpbmRleF0sICdleHBpcmUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHR0bCArIDEpO1xuICAgICAgICAgICAgICAgIC8vIHVucmVmKCkgbm90IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zXG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgaWYgKHQudW5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdC51bnJlZigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLiN1cGRhdGVJdGVtQWdlID0gaW5kZXggPT4ge1xuICAgICAgICAgICAgc3RhcnRzW2luZGV4XSA9IHR0bHNbaW5kZXhdICE9PSAwID8gcGVyZi5ub3coKSA6IDA7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3N0YXR1c1RUTCA9IChzdGF0dXMsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHRsc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0dGwgPSB0dGxzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IHN0YXJ0c1tpbmRleF07XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgICAgICBpZiAoIXR0bCB8fCAhc3RhcnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBzdGF0dXMudHRsID0gdHRsO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5zdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgICAgIHN0YXR1cy5ub3cgPSBjYWNoZWROb3cgfHwgZ2V0Tm93KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWdlID0gc3RhdHVzLm5vdyAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgIHN0YXR1cy5yZW1haW5pbmdUVEwgPSB0dGwgLSBhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIGRlYm91bmNlIGNhbGxzIHRvIHBlcmYubm93KCkgdG8gMXMgc28gd2UncmUgbm90IGhpdHRpbmdcbiAgICAgICAgLy8gdGhhdCBjb3N0bHkgY2FsbCByZXBlYXRlZGx5LlxuICAgICAgICBsZXQgY2FjaGVkTm93ID0gMDtcbiAgICAgICAgY29uc3QgZ2V0Tm93ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IHBlcmYubm93KCk7XG4gICAgICAgICAgICBpZiAodGhpcy50dGxSZXNvbHV0aW9uID4gMCkge1xuICAgICAgICAgICAgICAgIGNhY2hlZE5vdyA9IG47XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHNldFRpbWVvdXQoKCkgPT4gKGNhY2hlZE5vdyA9IDApLCB0aGlzLnR0bFJlc29sdXRpb24pO1xuICAgICAgICAgICAgICAgIC8vIG5vdCBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3Jtc1xuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgICAgIGlmICh0LnVucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHQudW5yZWYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdldFJlbWFpbmluZ1RUTCA9IGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0dGwgPSB0dGxzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRzW2luZGV4XTtcbiAgICAgICAgICAgIGlmICghdHRsIHx8ICFzdGFydCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFnZSA9IChjYWNoZWROb3cgfHwgZ2V0Tm93KCkpIC0gc3RhcnQ7XG4gICAgICAgICAgICByZXR1cm4gdHRsIC0gYWdlO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNpc1N0YWxlID0gaW5kZXggPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IHN0YXJ0c1tpbmRleF07XG4gICAgICAgICAgICBjb25zdCB0ID0gdHRsc1tpbmRleF07XG4gICAgICAgICAgICByZXR1cm4gISF0ICYmICEhcyAmJiAoY2FjaGVkTm93IHx8IGdldE5vdygpKSAtIHMgPiB0O1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBjb25kaXRpb25hbGx5IHNldCBwcml2YXRlIG1ldGhvZHMgcmVsYXRlZCB0byBUVExcbiAgICAjdXBkYXRlSXRlbUFnZSA9ICgpID0+IHsgfTtcbiAgICAjc3RhdHVzVFRMID0gKCkgPT4geyB9O1xuICAgICNzZXRJdGVtVFRMID0gKCkgPT4geyB9O1xuICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgI2lzU3RhbGUgPSAoKSA9PiBmYWxzZTtcbiAgICAjaW5pdGlhbGl6ZVNpemVUcmFja2luZygpIHtcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSBuZXcgWmVyb0FycmF5KHRoaXMuI21heCk7XG4gICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplID0gMDtcbiAgICAgICAgdGhpcy4jc2l6ZXMgPSBzaXplcztcbiAgICAgICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUgPSBpbmRleCA9PiB7XG4gICAgICAgICAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSAtPSBzaXplc1tpbmRleF07XG4gICAgICAgICAgICBzaXplc1tpbmRleF0gPSAwO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNyZXF1aXJlU2l6ZSA9IChrLCB2LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pID0+IHtcbiAgICAgICAgICAgIC8vIHByb3Zpc2lvbmFsbHkgYWNjZXB0IGJhY2tncm91bmQgZmV0Y2hlcy5cbiAgICAgICAgICAgIC8vIGFjdHVhbCB2YWx1ZSBzaXplIHdpbGwgYmUgY2hlY2tlZCB3aGVuIHRoZXkgcmV0dXJuLlxuICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG9zSW50KHNpemUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNpemVDYWxjdWxhdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSBzaXplQ2FsY3VsYXRpb24odiwgayk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemVDYWxjdWxhdGlvbiByZXR1cm4gaW52YWxpZCAoZXhwZWN0IHBvc2l0aXZlIGludGVnZXIpJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc2l6ZSB2YWx1ZSAobXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyKS4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnV2hlbiBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZSBpcyB1c2VkLCBzaXplQ2FsY3VsYXRpb24gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnb3Igc2l6ZSBtdXN0IGJlIHNldC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jYWRkSXRlbVNpemUgPSAoaW5kZXgsIHNpemUsIHN0YXR1cykgPT4ge1xuICAgICAgICAgICAgc2l6ZXNbaW5kZXhdID0gc2l6ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNtYXhTaXplKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHRoaXMuI21heFNpemUgLSBzaXplc1tpbmRleF07XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuI2NhbGN1bGF0ZWRTaXplID4gbWF4U2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNldmljdCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSArPSBzaXplc1tpbmRleF07XG4gICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmVudHJ5U2l6ZSA9IHNpemU7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnRvdGFsQ2FsY3VsYXRlZFNpemUgPSB0aGlzLiNjYWxjdWxhdGVkU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgI3JlbW92ZUl0ZW1TaXplID0gX2kgPT4geyB9O1xuICAgICNhZGRJdGVtU2l6ZSA9IChfaSwgX3MsIF9zdCkgPT4geyB9O1xuICAgICNyZXF1aXJlU2l6ZSA9IChfaywgX3YsIHNpemUsIHNpemVDYWxjdWxhdGlvbikgPT4ge1xuICAgICAgICBpZiAoc2l6ZSB8fCBzaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Nhbm5vdCBzZXQgc2l6ZSB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUgb24gY2FjaGUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuICAgICojaW5kZXhlcyh7IGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUgfSA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLiNzaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy4jdGFpbDsgdHJ1ZTspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuI2lzVmFsaWRJbmRleChpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFsbG93U3RhbGUgfHwgIXRoaXMuI2lzU3RhbGUoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IHRoaXMuI2hlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpID0gdGhpcy4jcHJldltpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgKiNyaW5kZXhlcyh7IGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUgfSA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLiNzaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy4jaGVhZDsgdHJ1ZTspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuI2lzVmFsaWRJbmRleChpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFsbG93U3RhbGUgfHwgIXRoaXMuI2lzU3RhbGUoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IHRoaXMuI3RhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpID0gdGhpcy4jbmV4dFtpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2lzVmFsaWRJbmRleChpbmRleCkge1xuICAgICAgICByZXR1cm4gKGluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHRoaXMuI2tleU1hcC5nZXQodGhpcy4ja2V5TGlzdFtpbmRleF0pID09PSBpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyBgW2tleSwgdmFsdWVdYCBwYWlycyxcbiAgICAgKiBpbiBvcmRlciBmcm9tIG1vc3QgcmVjZW50bHkgdXNlZCB0byBsZWFzdCByZWNlbnRseSB1c2VkLlxuICAgICAqL1xuICAgICplbnRyaWVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jdmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgdGhpcy4ja2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgW3RoaXMuI2tleUxpc3RbaV0sIHRoaXMuI3ZhbExpc3RbaV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludmVyc2Ugb3JkZXIgdmVyc2lvbiBvZiB7QGxpbmsgTFJVQ2FjaGUuZW50cmllc31cbiAgICAgKlxuICAgICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyBgW2tleSwgdmFsdWVdYCBwYWlycyxcbiAgICAgKiBpbiBvcmRlciBmcm9tIGxlYXN0IHJlY2VudGx5IHVzZWQgdG8gbW9zdCByZWNlbnRseSB1c2VkLlxuICAgICAqL1xuICAgICpyZW50cmllcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI3JpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiN2YWxMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBbdGhpcy4ja2V5TGlzdFtpXSwgdGhpcy4jdmFsTGlzdFtpXV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSBrZXlzIGluIHRoZSBjYWNoZSxcbiAgICAgKiBpbiBvcmRlciBmcm9tIG1vc3QgcmVjZW50bHkgdXNlZCB0byBsZWFzdCByZWNlbnRseSB1c2VkLlxuICAgICAqL1xuICAgICprZXlzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBjb25zdCBrID0gdGhpcy4ja2V5TGlzdFtpXTtcbiAgICAgICAgICAgIGlmIChrICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludmVyc2Ugb3JkZXIgdmVyc2lvbiBvZiB7QGxpbmsgTFJVQ2FjaGUua2V5c31cbiAgICAgKlxuICAgICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyB0aGUga2V5cyBpbiB0aGUgY2FjaGUsXG4gICAgICogaW4gb3JkZXIgZnJvbSBsZWFzdCByZWNlbnRseSB1c2VkIHRvIG1vc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqcmtleXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBjb25zdCBrID0gdGhpcy4ja2V5TGlzdFtpXTtcbiAgICAgICAgICAgIGlmIChrICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyB0aGUgdmFsdWVzIGluIHRoZSBjYWNoZSxcbiAgICAgKiBpbiBvcmRlciBmcm9tIG1vc3QgcmVjZW50bHkgdXNlZCB0byBsZWFzdCByZWNlbnRseSB1c2VkLlxuICAgICAqL1xuICAgICp2YWx1ZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKHYgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52ZXJzZSBvcmRlciB2ZXJzaW9uIG9mIHtAbGluayBMUlVDYWNoZS52YWx1ZXN9XG4gICAgICpcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIHZhbHVlcyBpbiB0aGUgY2FjaGUsXG4gICAgICogaW4gb3JkZXIgZnJvbSBsZWFzdCByZWNlbnRseSB1c2VkIHRvIG1vc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqcnZhbHVlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI3JpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKHYgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSXRlcmF0aW5nIG92ZXIgdGhlIGNhY2hlIGl0c2VsZiB5aWVsZHMgdGhlIHNhbWUgcmVzdWx0cyBhc1xuICAgICAqIHtAbGluayBMUlVDYWNoZS5lbnRyaWVzfVxuICAgICAqL1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgU3RyaW5nIHZhbHVlIHRoYXQgaXMgdXNlZCBpbiB0aGUgY3JlYXRpb24gb2YgdGhlIGRlZmF1bHQgc3RyaW5nXG4gICAgICogZGVzY3JpcHRpb24gb2YgYW4gb2JqZWN0LiBDYWxsZWQgYnkgdGhlIGJ1aWx0LWluIG1ldGhvZFxuICAgICAqIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAgICAgKi9cbiAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdMUlVDYWNoZSc7XG4gICAgLyoqXG4gICAgICogRmluZCBhIHZhbHVlIGZvciB3aGljaCB0aGUgc3VwcGxpZWQgZm4gbWV0aG9kIHJldHVybnMgYSB0cnV0aHkgdmFsdWUsXG4gICAgICogc2ltaWxhciB0byBgQXJyYXkuZmluZCgpYC4gZm4gaXMgY2FsbGVkIGFzIGBmbih2YWx1ZSwga2V5LCBjYWNoZSlgLlxuICAgICAqL1xuICAgIGZpbmQoZm4sIGdldE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgICAgICA6IHY7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChmbih2YWx1ZSwgdGhpcy4ja2V5TGlzdFtpXSwgdGhpcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQodGhpcy4ja2V5TGlzdFtpXSwgZ2V0T3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gb24gZWFjaCBpdGVtIGluIHRoZSBjYWNoZSwgaW4gb3JkZXIgZnJvbSBtb3N0XG4gICAgICogcmVjZW50bHkgdXNlZCB0byBsZWFzdCByZWNlbnRseSB1c2VkLlxuICAgICAqXG4gICAgICogYGZuYCBpcyBjYWxsZWQgYXMgYGZuKHZhbHVlLCBrZXksIGNhY2hlKWAuXG4gICAgICpcbiAgICAgKiBJZiBgdGhpc3BgIGlzIHByb3ZpZGVkLCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgYHRoaXNgLWNvbnRleHQgb2ZcbiAgICAgKiB0aGUgcHJvdmlkZWQgb2JqZWN0LCBvciB0aGUgY2FjaGUgaWYgbm8gYHRoaXNwYCBvYmplY3QgaXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBEb2VzIG5vdCB1cGRhdGUgYWdlIG9yIHJlY2VudHkgb2YgdXNlLCBvciBpdGVyYXRlIG92ZXIgc3RhbGUgdmFsdWVzLlxuICAgICAqL1xuICAgIGZvckVhY2goZm4sIHRoaXNwID0gdGhpcykge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgICAgICA6IHY7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLiNrZXlMaXN0W2ldLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgc2FtZSBhcyB7QGxpbmsgTFJVQ2FjaGUuZm9yRWFjaH0gYnV0IGl0ZW1zIGFyZSBpdGVyYXRlZCBvdmVyIGluXG4gICAgICogcmV2ZXJzZSBvcmRlci4gIChpZSwgbGVzcyByZWNlbnRseSB1c2VkIGl0ZW1zIGFyZSBpdGVyYXRlZCBvdmVyIGZpcnN0LilcbiAgICAgKi9cbiAgICByZm9yRWFjaChmbiwgdGhpc3AgPSB0aGlzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgICAgICA6IHY7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLiNrZXlMaXN0W2ldLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYW55IHN0YWxlIGVudHJpZXMuIFJldHVybnMgdHJ1ZSBpZiBhbnl0aGluZyB3YXMgcmVtb3ZlZCxcbiAgICAgKiBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVyZ2VTdGFsZSgpIHtcbiAgICAgICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI3JpbmRleGVzKHsgYWxsb3dTdGFsZTogdHJ1ZSB9KSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzU3RhbGUoaSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkZWxldGUodGhpcy4ja2V5TGlzdFtpXSwgJ2V4cGlyZScpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWxldGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGV4dGVuZGVkIGluZm8gYWJvdXQgYSBnaXZlbiBlbnRyeSwgdG8gZ2V0IGl0cyB2YWx1ZSwgc2l6ZSwgYW5kXG4gICAgICogVFRMIGluZm8gc2ltdWx0YW5lb3VzbHkuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGtleSBpcyBub3QgcHJlc2VudC5cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgTFJVQ2FjaGUjZHVtcH0sIHdoaWNoIGlzIGRlc2lnbmVkIHRvIGJlIHBvcnRhYmxlIGFuZCBzdXJ2aXZlXG4gICAgICogc2VyaWFsaXphdGlvbiwgdGhlIGBzdGFydGAgdmFsdWUgaXMgYWx3YXlzIHRoZSBjdXJyZW50IHRpbWVzdGFtcCwgYW5kIHRoZVxuICAgICAqIGB0dGxgIGlzIGEgY2FsY3VsYXRlZCByZW1haW5pbmcgdGltZSB0byBsaXZlIChuZWdhdGl2ZSBpZiBleHBpcmVkKS5cbiAgICAgKlxuICAgICAqIEFsd2F5cyByZXR1cm5zIHN0YWxlIHZhbHVlcywgaWYgdGhlaXIgaW5mbyBpcyBmb3VuZCBpbiB0aGUgY2FjaGUsIHNvIGJlXG4gICAgICogc3VyZSB0byBjaGVjayBmb3IgZXhwaXJhdGlvbnMgKGllLCBhIG5lZ2F0aXZlIHtAbGluayBMUlVDYWNoZS5FbnRyeSN0dGx9KVxuICAgICAqIGlmIHJlbGV2YW50LlxuICAgICAqL1xuICAgIGluZm8oa2V5KSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLiNrZXlNYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmIChpID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICA6IHY7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZW50cnkgPSB7IHZhbHVlIH07XG4gICAgICAgIGlmICh0aGlzLiN0dGxzICYmIHRoaXMuI3N0YXJ0cykge1xuICAgICAgICAgICAgY29uc3QgdHRsID0gdGhpcy4jdHRsc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy4jc3RhcnRzW2ldO1xuICAgICAgICAgICAgaWYgKHR0bCAmJiBzdGFydCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbiA9IHR0bCAtIChwZXJmLm5vdygpIC0gc3RhcnQpO1xuICAgICAgICAgICAgICAgIGVudHJ5LnR0bCA9IHJlbWFpbjtcbiAgICAgICAgICAgICAgICBlbnRyeS5zdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3NpemVzKSB7XG4gICAgICAgICAgICBlbnRyeS5zaXplID0gdGhpcy4jc2l6ZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgW2tleSwge0BsaW5rIExSVUNhY2hlLkVudHJ5fV0gdHVwbGVzIHdoaWNoIGNhbiBiZVxuICAgICAqIHBhc3NlZCB0byB7QGxpbmsgTFJMVUNhY2hlI2xvYWR9LlxuICAgICAqXG4gICAgICogVGhlIGBzdGFydGAgZmllbGRzIGFyZSBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIGEgcG9ydGFibGUgYERhdGUubm93KClgXG4gICAgICogdGltZXN0YW1wLCBldmVuIGlmIGBwZXJmb3JtYW5jZS5ub3coKWAgaXMgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogU3RhbGUgZW50cmllcyBhcmUgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSBgZHVtcGAsIGV2ZW4gaWZcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZX0gaXMgZmFsc2UuXG4gICAgICpcbiAgICAgKiBOb3RlOiB0aGlzIHJldHVybnMgYW4gYWN0dWFsIGFycmF5LCBub3QgYSBnZW5lcmF0b3IsIHNvIGl0IGNhbiBiZSBtb3JlXG4gICAgICogZWFzaWx5IHBhc3NlZCBhcm91bmQuXG4gICAgICovXG4gICAgZHVtcCgpIHtcbiAgICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKHsgYWxsb3dTdGFsZTogdHJ1ZSB9KSkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy4ja2V5TGlzdFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB7IHZhbHVlIH07XG4gICAgICAgICAgICBpZiAodGhpcy4jdHRscyAmJiB0aGlzLiNzdGFydHMpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS50dGwgPSB0aGlzLiN0dGxzW2ldO1xuICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBkdW1wIHRoZSBzdGFydCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlIHRpbWVzdGFtcFxuICAgICAgICAgICAgICAgIC8vIGl0J3Mgb2sgZm9yIHRoaXMgdG8gYmUgYSBiaXQgc2xvdywgaXQncyBhIHJhcmUgb3BlcmF0aW9uLlxuICAgICAgICAgICAgICAgIGNvbnN0IGFnZSA9IHBlcmYubm93KCkgLSB0aGlzLiNzdGFydHNbaV07XG4gICAgICAgICAgICAgICAgZW50cnkuc3RhcnQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLSBhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuI3NpemVzKSB7XG4gICAgICAgICAgICAgICAgZW50cnkuc2l6ZSA9IHRoaXMuI3NpemVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJyLnVuc2hpZnQoW2tleSwgZW50cnldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldCB0aGUgY2FjaGUgYW5kIGxvYWQgaW4gdGhlIGl0ZW1zIGluIGVudHJpZXMgaW4gdGhlIG9yZGVyIGxpc3RlZC5cbiAgICAgKlxuICAgICAqIFRoZSBzaGFwZSBvZiB0aGUgcmVzdWx0aW5nIGNhY2hlIG1heSBiZSBkaWZmZXJlbnQgaWYgdGhlIHNhbWUgb3B0aW9ucyBhcmVcbiAgICAgKiBub3QgdXNlZCBpbiBib3RoIGNhY2hlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgc3RhcnRgIGZpZWxkcyBhcmUgYXNzdW1lZCB0byBiZSBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIGEgcG9ydGFibGVcbiAgICAgKiBgRGF0ZS5ub3coKWAgdGltZXN0YW1wLCBldmVuIGlmIGBwZXJmb3JtYW5jZS5ub3coKWAgaXMgYXZhaWxhYmxlLlxuICAgICAqL1xuICAgIGxvYWQoYXJyKSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgYXJyKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAvLyBlbnRyeS5zdGFydCBpcyBhIHBvcnRhYmxlIHRpbWVzdGFtcCwgYnV0IHdlIG1heSBiZSB1c2luZ1xuICAgICAgICAgICAgICAgIC8vIG5vZGUncyBwZXJmb3JtYW5jZS5ub3coKSwgc28gY2FsY3VsYXRlIHRoZSBvZmZzZXQsIHNvIHRoYXRcbiAgICAgICAgICAgICAgICAvLyB3ZSBnZXQgdGhlIGludGVuZGVkIHJlbWFpbmluZyBUVEwsIG5vIG1hdHRlciBob3cgbG9uZyBpdCdzXG4gICAgICAgICAgICAgICAgLy8gYmVlbiBvbiBpY2UuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgICAgICAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gZW50cnkuc3RhcnQ7XG4gICAgICAgICAgICAgICAgZW50cnkuc3RhcnQgPSBwZXJmLm5vdygpIC0gYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBlbnRyeS52YWx1ZSwgZW50cnkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIHZhbHVlIHRvIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IGlmIGB1bmRlZmluZWRgIGlzIHNwZWNpZmllZCBhcyBhIHZhbHVlLCB0aGlzIGlzIGFuIGFsaWFzIGZvclxuICAgICAqIHtAbGluayBMUlVDYWNoZSNkZWxldGV9XG4gICAgICpcbiAgICAgKiBGaWVsZHMgb24gdGhlIHtAbGluayBMUlVDYWNoZS5TZXRPcHRpb25zfSBvcHRpb25zIHBhcmFtIHdpbGwgb3ZlcnJpZGVcbiAgICAgKiB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGUgY29uc3RydWN0b3Igb3B0aW9ucyBmb3IgdGhlIHNjb3BlXG4gICAgICogb2YgdGhpcyBzaW5nbGUgYHNldCgpYCBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBJZiBgc3RhcnRgIGlzIHByb3ZpZGVkLCB0aGVuIHRoYXQgd2lsbCBzZXQgdGhlIGVmZmVjdGl2ZSBzdGFydFxuICAgICAqIHRpbWUgZm9yIHRoZSBUVEwgY2FsY3VsYXRpb24uIE5vdGUgdGhhdCB0aGlzIG11c3QgYmUgYSBwcmV2aW91c1xuICAgICAqIHZhbHVlIG9mIGBwZXJmb3JtYW5jZS5ub3coKWAgaWYgc3VwcG9ydGVkLCBvciBhIHByZXZpb3VzIHZhbHVlIG9mXG4gICAgICogYERhdGUubm93KClgIGlmIG5vdC5cbiAgICAgKlxuICAgICAqIE9wdGlvbnMgb2JqZWN0IG1heSBhbHNvIGluY2x1ZGUgYHNpemVgLCB3aGljaCB3aWxsIHByZXZlbnRcbiAgICAgKiBjYWxsaW5nIHRoZSBgc2l6ZUNhbGN1bGF0aW9uYCBmdW5jdGlvbiBhbmQganVzdCB1c2UgdGhlIHNwZWNpZmllZFxuICAgICAqIG51bWJlciBpZiBpdCBpcyBhIHBvc2l0aXZlIGludGVnZXIsIGFuZCBgbm9EaXNwb3NlT25TZXRgIHdoaWNoXG4gICAgICogd2lsbCBwcmV2ZW50IGNhbGxpbmcgYSBgZGlzcG9zZWAgZnVuY3Rpb24gaW4gdGhlIGNhc2Ugb2ZcbiAgICAgKiBvdmVyd3JpdGVzLlxuICAgICAqXG4gICAgICogSWYgdGhlIGBzaXplYCAob3IgcmV0dXJuIHZhbHVlIG9mIGBzaXplQ2FsY3VsYXRpb25gKSBmb3IgYSBnaXZlblxuICAgICAqIGVudHJ5IGlzIGdyZWF0ZXIgdGhhbiBgbWF4RW50cnlTaXplYCwgdGhlbiB0aGUgaXRlbSB3aWxsIG5vdCBiZVxuICAgICAqIGFkZGVkIHRvIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFdpbGwgdXBkYXRlIHRoZSByZWNlbmN5IG9mIHRoZSBlbnRyeS5cbiAgICAgKlxuICAgICAqIElmIHRoZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCwgdGhlbiB0aGlzIGlzIGFuIGFsaWFzIGZvclxuICAgICAqIGBjYWNoZS5kZWxldGUoa2V5KWAuIGB1bmRlZmluZWRgIGlzIG5ldmVyIHN0b3JlZCBpbiB0aGUgY2FjaGUuXG4gICAgICovXG4gICAgc2V0KGssIHYsIHNldE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShrKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdHRsID0gdGhpcy50dGwsIHN0YXJ0LCBub0Rpc3Bvc2VPblNldCA9IHRoaXMubm9EaXNwb3NlT25TZXQsIHNpemVDYWxjdWxhdGlvbiA9IHRoaXMuc2l6ZUNhbGN1bGF0aW9uLCBzdGF0dXMsIH0gPSBzZXRPcHRpb25zO1xuICAgICAgICBsZXQgeyBub1VwZGF0ZVRUTCA9IHRoaXMubm9VcGRhdGVUVEwgfSA9IHNldE9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLiNyZXF1aXJlU2l6ZShrLCB2LCBzZXRPcHRpb25zLnNpemUgfHwgMCwgc2l6ZUNhbGN1bGF0aW9uKTtcbiAgICAgICAgLy8gaWYgdGhlIGl0ZW0gZG9lc24ndCBmaXQsIGRvbid0IGRvIGFueXRoaW5nXG4gICAgICAgIC8vIE5COiBtYXhFbnRyeVNpemUgc2V0IHRvIG1heFNpemUgYnkgZGVmYXVsdFxuICAgICAgICBpZiAodGhpcy5tYXhFbnRyeVNpemUgJiYgc2l6ZSA+IHRoaXMubWF4RW50cnlTaXplKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnNldCA9ICdtaXNzJztcbiAgICAgICAgICAgICAgICBzdGF0dXMubWF4RW50cnlTaXplRXhjZWVkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGF2ZSB0byBkZWxldGUsIGluIGNhc2Ugc29tZXRoaW5nIGlzIHRoZXJlIGFscmVhZHkuXG4gICAgICAgICAgICB0aGlzLiNkZWxldGUoaywgJ3NldCcpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy4jc2l6ZSA9PT0gMCA/IHVuZGVmaW5lZCA6IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBhZGRpdGlvblxuICAgICAgICAgICAgaW5kZXggPSAodGhpcy4jc2l6ZSA9PT0gMFxuICAgICAgICAgICAgICAgID8gdGhpcy4jdGFpbFxuICAgICAgICAgICAgICAgIDogdGhpcy4jZnJlZS5sZW5ndGggIT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLiNmcmVlLnBvcCgpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy4jc2l6ZSA9PT0gdGhpcy4jbWF4XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuI2V2aWN0KGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLiNzaXplKTtcbiAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaW5kZXhdID0gaztcbiAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gdjtcbiAgICAgICAgICAgIHRoaXMuI2tleU1hcC5zZXQoaywgaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy4jbmV4dFt0aGlzLiN0YWlsXSA9IGluZGV4O1xuICAgICAgICAgICAgdGhpcy4jcHJldltpbmRleF0gPSB0aGlzLiN0YWlsO1xuICAgICAgICAgICAgdGhpcy4jdGFpbCA9IGluZGV4O1xuICAgICAgICAgICAgdGhpcy4jc2l6ZSsrO1xuICAgICAgICAgICAgdGhpcy4jYWRkSXRlbVNpemUoaW5kZXgsIHNpemUsIHN0YXR1cyk7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQgPSAnYWRkJztcbiAgICAgICAgICAgIG5vVXBkYXRlVFRMID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB1cGRhdGVcbiAgICAgICAgICAgIHRoaXMuI21vdmVUb1RhaWwoaW5kZXgpO1xuICAgICAgICAgICAgY29uc3Qgb2xkVmFsID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBpZiAodiAhPT0gb2xkVmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0ZldGNoTWV0aG9kICYmIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKG9sZFZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkVmFsLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigncmVwbGFjZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgX19zdGFsZVdoaWxlRmV0Y2hpbmc6IHMgfSA9IG9sZFZhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT09IHVuZGVmaW5lZCAmJiAhbm9EaXNwb3NlT25TZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHMsIGssICdzZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbcywgaywgJ3NldCddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghbm9EaXNwb3NlT25TZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2U/LihvbGRWYWwsIGssICdzZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbb2xkVmFsLCBrLCAnc2V0J10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplKGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGRJdGVtU2l6ZShpbmRleCwgc2l6ZSwgc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IHY7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0ID0gJ3JlcGxhY2UnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IG9sZFZhbCAmJiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaChvbGRWYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG9sZFZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBvbGRWYWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLm9sZFZhbHVlID0gb2xkVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnNldCA9ICd1cGRhdGUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0dGwgIT09IDAgJiYgIXRoaXMuI3R0bHMpIHtcbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVUVExUcmFja2luZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiN0dGxzKSB7XG4gICAgICAgICAgICBpZiAoIW5vVXBkYXRlVFRMKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jc2V0SXRlbVRUTChpbmRleCwgdHRsLCBzdGFydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vRGlzcG9zZU9uU2V0ICYmIHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciAmJiB0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZDtcbiAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV2aWN0IHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGl0ZW0sIHJldHVybmluZyBpdHMgdmFsdWUgb3JcbiAgICAgKiBgdW5kZWZpbmVkYCBpZiBjYWNoZSBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBwb3AoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy4jc2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuI3ZhbExpc3RbdGhpcy4jaGVhZF07XG4gICAgICAgICAgICAgICAgdGhpcy4jZXZpY3QodHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdCA9IHRoaXMuI2Rpc3Bvc2VkO1xuICAgICAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXI/LiguLi50YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2V2aWN0KGZyZWUpIHtcbiAgICAgICAgY29uc3QgaGVhZCA9IHRoaXMuI2hlYWQ7XG4gICAgICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2hlYWRdO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtoZWFkXTtcbiAgICAgICAgaWYgKHRoaXMuI2hhc0ZldGNoTWV0aG9kICYmIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZXZpY3RlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLiNoYXNEaXNwb3NlIHx8IHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4odiwgaywgJ2V2aWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3YsIGssICdldmljdCddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNyZW1vdmVJdGVtU2l6ZShoZWFkKTtcbiAgICAgICAgLy8gaWYgd2UgYXJlbid0IGFib3V0IHRvIHVzZSB0aGUgaW5kZXgsIHRoZW4gbnVsbCB0aGVzZSBvdXRcbiAgICAgICAgaWYgKGZyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaGVhZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2hlYWRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy4jZnJlZS5wdXNoKGhlYWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzaXplID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLiNoZWFkID0gdGhpcy4jdGFpbCA9IDA7XG4gICAgICAgICAgICB0aGlzLiNmcmVlLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNoZWFkID0gdGhpcy4jbmV4dFtoZWFkXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNrZXlNYXAuZGVsZXRlKGspO1xuICAgICAgICB0aGlzLiNzaXplLS07XG4gICAgICAgIHJldHVybiBoZWFkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGtleSBpcyBpbiB0aGUgY2FjaGUsIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHJlY2VuY3kgb2YgdXNlLlxuICAgICAqIFdpbGwgcmV0dXJuIGZhbHNlIGlmIHRoZSBpdGVtIGlzIHN0YWxlLCBldmVuIHRob3VnaCBpdCBpcyB0ZWNobmljYWxseVxuICAgICAqIGluIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIENoZWNrIGlmIGEga2V5IGlzIGluIHRoZSBjYWNoZSwgd2l0aG91dCB1cGRhdGluZyB0aGUgcmVjZW5jeSBvZlxuICAgICAqIHVzZS4gQWdlIGlzIHVwZGF0ZWQgaWYge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnVwZGF0ZUFnZU9uSGFzfSBpcyBzZXRcbiAgICAgKiB0byBgdHJ1ZWAgaW4gZWl0aGVyIHRoZSBvcHRpb25zIG9yIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIFdpbGwgcmV0dXJuIGBmYWxzZWAgaWYgdGhlIGl0ZW0gaXMgc3RhbGUsIGV2ZW4gdGhvdWdoIGl0IGlzIHRlY2huaWNhbGx5IGluXG4gICAgICogdGhlIGNhY2hlLiBUaGUgZGlmZmVyZW5jZSBjYW4gYmUgZGV0ZXJtaW5lZCAoaWYgaXQgbWF0dGVycykgYnkgdXNpbmcgYVxuICAgICAqIGBzdGF0dXNgIGFyZ3VtZW50LCBhbmQgaW5zcGVjdGluZyB0aGUgYGhhc2AgZmllbGQuXG4gICAgICpcbiAgICAgKiBXaWxsIG5vdCB1cGRhdGUgaXRlbSBhZ2UgdW5sZXNzXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnVwZGF0ZUFnZU9uSGFzfSBpcyBzZXQuXG4gICAgICovXG4gICAgaGFzKGssIGhhc09wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHVwZGF0ZUFnZU9uSGFzID0gdGhpcy51cGRhdGVBZ2VPbkhhcywgc3RhdHVzIH0gPSBoYXNPcHRpb25zO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikgJiZcbiAgICAgICAgICAgICAgICB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2lzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUFnZU9uSGFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UoaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5oYXMgPSAnaGl0JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5oYXMgPSAnc3RhbGUnO1xuICAgICAgICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIHN0YXR1cy5oYXMgPSAnbWlzcyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaWtlIHtAbGluayBMUlVDYWNoZSNnZXR9IGJ1dCBkb2Vzbid0IHVwZGF0ZSByZWNlbmN5IG9yIGRlbGV0ZSBzdGFsZVxuICAgICAqIGl0ZW1zLlxuICAgICAqXG4gICAgICogUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgaXRlbSBpcyBzdGFsZSwgdW5sZXNzXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGV9IGlzIHNldC5cbiAgICAgKi9cbiAgICBwZWVrKGssIHBlZWtPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSBwZWVrT3B0aW9ucztcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKCFhbGxvd1N0YWxlICYmIHRoaXMuI2lzU3RhbGUoaW5kZXgpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgLy8gZWl0aGVyIHN0YWxlIGFuZCBhbGxvd2VkLCBvciBmb3JjaW5nIGEgcmVmcmVzaCBvZiBub24tc3RhbGUgdmFsdWVcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHY7XG4gICAgfVxuICAgICNiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgdiA9IGluZGV4ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhYyA9IG5ldyBBQygpO1xuICAgICAgICBjb25zdCB7IHNpZ25hbCB9ID0gb3B0aW9ucztcbiAgICAgICAgLy8gd2hlbi9pZiBvdXIgQUMgc2lnbmFscywgdGhlbiBzdG9wIGxpc3RlbmluZyB0byB0aGVpcnMuXG4gICAgICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiBhYy5hYm9ydChzaWduYWwucmVhc29uKSwge1xuICAgICAgICAgICAgc2lnbmFsOiBhYy5zaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBmZXRjaE9wdHMgPSB7XG4gICAgICAgICAgICBzaWduYWw6IGFjLnNpZ25hbCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjYiA9ICh2LCB1cGRhdGVDYWNoZSA9IGZhbHNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGFib3J0ZWQgfSA9IGFjLnNpZ25hbDtcbiAgICAgICAgICAgIGNvbnN0IGlnbm9yZUFib3J0ID0gb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0ICYmIHYgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGlmIChhYm9ydGVkICYmICF1cGRhdGVDYWNoZSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEVycm9yID0gYWMuc2lnbmFsLnJlYXNvbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZUFib3J0KVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hBYm9ydElnbm9yZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFib3J0ZWQgJiYgIWlnbm9yZUFib3J0ICYmICF1cGRhdGVDYWNoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaEZhaWwoYWMuc2lnbmFsLnJlYXNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlaXRoZXIgd2UgZGlkbid0IGFib3J0LCBhbmQgYXJlIHN0aWxsIGhlcmUsIG9yIHdlIGRpZCwgYW5kIGlnbm9yZWRcbiAgICAgICAgICAgIGNvbnN0IGJmID0gcDtcbiAgICAgICAgICAgIGlmICh0aGlzLiN2YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICAgICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdmZXRjaCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMpXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChrLCB2LCBmZXRjaE9wdHMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGViID0gKGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFJlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEVycm9yID0gZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hGYWlsKGVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmV0Y2hGYWlsID0gKGVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGFib3J0ZWQgfSA9IGFjLnNpZ25hbDtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93U3RhbGVBYm9ydGVkID0gYWJvcnRlZCAmJiBvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQ7XG4gICAgICAgICAgICBjb25zdCBhbGxvd1N0YWxlID0gYWxsb3dTdGFsZUFib3J0ZWQgfHwgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IG5vRGVsZXRlID0gYWxsb3dTdGFsZSB8fCBvcHRpb25zLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGJmID0gcDtcbiAgICAgICAgICAgIGlmICh0aGlzLiN2YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFsbG93IHN0YWxlIG9uIGZldGNoIHJlamVjdGlvbnMsIHRoZW4gd2UgbmVlZCB0byBlbnN1cmUgdGhhdFxuICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFsZSB2YWx1ZSBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSB3aGVuIHRoZSBmZXRjaCBmYWlscy5cbiAgICAgICAgICAgICAgICBjb25zdCBkZWwgPSAhbm9EZWxldGUgfHwgYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoZGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZShrLCAnZmV0Y2gnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWFsbG93U3RhbGVBYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIHJlcGxhY2UgdGhlICpwcm9taXNlKiB3aXRoIHRoZSBzdGFsZSB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgYXJlIGRvbmUgd2l0aCB0aGUgcHJvbWlzZSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgICAgICAgICAvLyBsZWF2ZSBpdCB1bnRvdWNoZWQgaWYgd2UncmUgc3RpbGwgd2FpdGluZyBmb3IgYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWJvcnRlZCBiYWNrZ3JvdW5kIGZldGNoIHRoYXQgaGFzbid0IHlldCByZXR1cm5lZC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWxsb3dTdGFsZSkge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cyAmJiBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiZi5fX3JldHVybmVkID09PSBiZikge1xuICAgICAgICAgICAgICAgIHRocm93IGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwY2FsbCA9IChyZXMsIHJlaikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm1wID0gdGhpcy4jZmV0Y2hNZXRob2Q/LihrLCB2LCBmZXRjaE9wdHMpO1xuICAgICAgICAgICAgaWYgKGZtcCAmJiBmbXAgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgZm1wLnRoZW4odiA9PiByZXModiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdiksIHJlaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZ25vcmVkLCB3ZSBnbyB1bnRpbCB3ZSBmaW5pc2gsIHJlZ2FyZGxlc3MuXG4gICAgICAgICAgICAvLyBkZWZlciBjaGVjayB1bnRpbCB3ZSBhcmUgYWN0dWFsbHkgYWJvcnRpbmcsXG4gICAgICAgICAgICAvLyBzbyBmZXRjaE1ldGhvZCBjYW4gb3ZlcnJpZGUuXG4gICAgICAgICAgICBhYy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUZldGNoQWJvcnQgfHxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGl0IGV2ZW50dWFsbHkgcmVzb2x2ZXMsIHVwZGF0ZSB0aGUgY2FjaGUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHYgPT4gY2IodiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKVxuICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hEaXNwYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKHBjYWxsKS50aGVuKGNiLCBlYik7XG4gICAgICAgIGNvbnN0IGJmID0gT2JqZWN0LmFzc2lnbihwLCB7XG4gICAgICAgICAgICBfX2Fib3J0Q29udHJvbGxlcjogYWMsXG4gICAgICAgICAgICBfX3N0YWxlV2hpbGVGZXRjaGluZzogdixcbiAgICAgICAgICAgIF9fcmV0dXJuZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBpbnRlcm5hbCwgZG9uJ3QgZXhwb3NlIHN0YXR1cy5cbiAgICAgICAgICAgIHRoaXMuc2V0KGssIGJmLCB7IC4uLmZldGNoT3B0cy5vcHRpb25zLCBzdGF0dXM6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gYmY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJmO1xuICAgIH1cbiAgICAjaXNCYWNrZ3JvdW5kRmV0Y2gocCkge1xuICAgICAgICBpZiAoIXRoaXMuI2hhc0ZldGNoTWV0aG9kKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBiID0gcDtcbiAgICAgICAgcmV0dXJuICghIWIgJiZcbiAgICAgICAgICAgIGIgaW5zdGFuY2VvZiBQcm9taXNlICYmXG4gICAgICAgICAgICBiLmhhc093blByb3BlcnR5KCdfX3N0YWxlV2hpbGVGZXRjaGluZycpICYmXG4gICAgICAgICAgICBiLl9fYWJvcnRDb250cm9sbGVyIGluc3RhbmNlb2YgQUMpO1xuICAgIH1cbiAgICBhc3luYyBmZXRjaChrLCBmZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IFxuICAgICAgICAvLyBnZXQgb3B0aW9uc1xuICAgICAgICBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlLCB1cGRhdGVBZ2VPbkdldCA9IHRoaXMudXBkYXRlQWdlT25HZXQsIG5vRGVsZXRlT25TdGFsZUdldCA9IHRoaXMubm9EZWxldGVPblN0YWxlR2V0LCBcbiAgICAgICAgLy8gc2V0IG9wdGlvbnNcbiAgICAgICAgdHRsID0gdGhpcy50dGwsIG5vRGlzcG9zZU9uU2V0ID0gdGhpcy5ub0Rpc3Bvc2VPblNldCwgc2l6ZSA9IDAsIHNpemVDYWxjdWxhdGlvbiA9IHRoaXMuc2l6ZUNhbGN1bGF0aW9uLCBub1VwZGF0ZVRUTCA9IHRoaXMubm9VcGRhdGVUVEwsIFxuICAgICAgICAvLyBmZXRjaCBleGNsdXNpdmUgb3B0aW9uc1xuICAgICAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24gPSB0aGlzLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiwgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24gPSB0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLCBpZ25vcmVGZXRjaEFib3J0ID0gdGhpcy5pZ25vcmVGZXRjaEFib3J0LCBhbGxvd1N0YWxlT25GZXRjaEFib3J0ID0gdGhpcy5hbGxvd1N0YWxlT25GZXRjaEFib3J0LCBjb250ZXh0LCBmb3JjZVJlZnJlc2ggPSBmYWxzZSwgc3RhdHVzLCBzaWduYWwsIH0gPSBmZXRjaE9wdGlvbnM7XG4gICAgICAgIGlmICghdGhpcy4jaGFzRmV0Y2hNZXRob2QpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmZldGNoID0gJ2dldCc7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoaywge1xuICAgICAgICAgICAgICAgIGFsbG93U3RhbGUsXG4gICAgICAgICAgICAgICAgdXBkYXRlQWdlT25HZXQsXG4gICAgICAgICAgICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhbGxvd1N0YWxlLFxuICAgICAgICAgICAgdXBkYXRlQWdlT25HZXQsXG4gICAgICAgICAgICBub0RlbGV0ZU9uU3RhbGVHZXQsXG4gICAgICAgICAgICB0dGwsXG4gICAgICAgICAgICBub0Rpc3Bvc2VPblNldCxcbiAgICAgICAgICAgIHNpemUsXG4gICAgICAgICAgICBzaXplQ2FsY3VsYXRpb24sXG4gICAgICAgICAgICBub1VwZGF0ZVRUTCxcbiAgICAgICAgICAgIG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbixcbiAgICAgICAgICAgIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxcbiAgICAgICAgICAgIGlnbm9yZUZldGNoQWJvcnQsXG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH07XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdtaXNzJztcbiAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLiNiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIChwLl9fcmV0dXJuZWQgPSBwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluIGNhY2hlLCBtYXliZSBhbHJlYWR5IGZldGNoaW5nXG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFsZSA9IGFsbG93U3RhbGUgJiYgdi5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmZldGNoID0gJ2luZmxpZ2h0JztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhbGUgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nIDogKHYuX19yZXR1cm5lZCA9IHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgd2UgZm9yY2UgYSByZWZyZXNoLCB0aGF0IG1lYW5zIGRvIE5PVCBzZXJ2ZSB0aGUgY2FjaGVkIHZhbHVlLFxuICAgICAgICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIHJlZnJlc2hpbmcgdGhlIGNhY2hlLlxuICAgICAgICAgICAgY29uc3QgaXNTdGFsZSA9IHRoaXMuI2lzU3RhbGUoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgIWlzU3RhbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSAnaGl0JztcbiAgICAgICAgICAgICAgICB0aGlzLiNtb3ZlVG9UYWlsKGluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlQWdlT25HZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZShpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG9rLCBpdCBpcyBzdGFsZSBvciBhIGZvcmNlZCByZWZyZXNoLCBhbmQgbm90IGFscmVhZHkgZmV0Y2hpbmcuXG4gICAgICAgICAgICAvLyByZWZyZXNoIHRoZSBjYWNoZS5cbiAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLiNiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpO1xuICAgICAgICAgICAgY29uc3QgaGFzU3RhbGUgPSBwLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBzdGFsZVZhbCA9IGhhc1N0YWxlICYmIGFsbG93U3RhbGU7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmZldGNoID0gaXNTdGFsZSA/ICdzdGFsZScgOiAncmVmcmVzaCc7XG4gICAgICAgICAgICAgICAgaWYgKHN0YWxlVmFsICYmIGlzU3RhbGUpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdGFsZVZhbCA/IHAuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiAocC5fX3JldHVybmVkID0gcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZm9yY2VGZXRjaChrLCBmZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB2ID0gYXdhaXQgdGhpcy5mZXRjaChrLCBmZXRjaE9wdGlvbnMpO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmZXRjaCgpIHJldHVybmVkIHVuZGVmaW5lZCcpO1xuICAgICAgICByZXR1cm4gdjtcbiAgICB9XG4gICAgbWVtbyhrLCBtZW1vT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG1lbW9NZXRob2QgPSB0aGlzLiNtZW1vTWV0aG9kO1xuICAgICAgICBpZiAoIW1lbW9NZXRob2QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gbWVtb01ldGhvZCBwcm92aWRlZCB0byBjb25zdHJ1Y3RvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgY29udGV4dCwgZm9yY2VSZWZyZXNoLCAuLi5vcHRpb25zIH0gPSBtZW1vT3B0aW9ucztcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuZ2V0KGssIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIWZvcmNlUmVmcmVzaCAmJiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY29uc3QgdnYgPSBtZW1vTWV0aG9kKGssIHYsIHtcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXQoaywgdnYsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdnY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHZhbHVlIGZyb20gdGhlIGNhY2hlLiBXaWxsIHVwZGF0ZSB0aGUgcmVjZW5jeSBvZiB0aGUgY2FjaGVcbiAgICAgKiBlbnRyeSBmb3VuZC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLCBnZXQoKSB3aWxsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAgICAgKi9cbiAgICBnZXQoaywgZ2V0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSwgdXBkYXRlQWdlT25HZXQgPSB0aGlzLnVwZGF0ZUFnZU9uR2V0LCBub0RlbGV0ZU9uU3RhbGVHZXQgPSB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCwgc3RhdHVzLCB9ID0gZ2V0T3B0aW9ucztcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGZldGNoaW5nID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godmFsdWUpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgICAgICBpZiAodGhpcy4jaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0ID0gJ3N0YWxlJztcbiAgICAgICAgICAgICAgICAvLyBkZWxldGUgb25seSBpZiBub3QgYW4gaW4tZmxpZ2h0IGJhY2tncm91bmQgZmV0Y2hcbiAgICAgICAgICAgICAgICBpZiAoIWZldGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9EZWxldGVPblN0YWxlR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkZWxldGUoaywgJ2V4cGlyZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiYgYWxsb3dTdGFsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93U3RhbGUgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93U3RhbGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dTdGFsZSA/IHZhbHVlLl9fc3RhbGVXaGlsZUZldGNoaW5nIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5nZXQgPSAnaGl0JztcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBjdXJyZW50bHkgZmV0Y2hpbmcgaXQsIHdlIGRvbid0IGFjdHVhbGx5IGhhdmUgaXQgeWV0XG4gICAgICAgICAgICAgICAgLy8gaXQncyBub3Qgc3RhbGUsIHdoaWNoIG1lYW5zIHRoaXMgaXNuJ3QgYSBzdGFsZVdoaWxlUmVmZXRjaGluZy5cbiAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCBzdGFsZSwgYW5kIGZldGNoaW5nLCBBTkQgaGFzIGEgX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSwgdGhlbiB0aGF0IG1lYW5zIHRoZSB1c2VyIGZldGNoZWQgd2l0aCB7Zm9yY2VSZWZyZXNoOnRydWV9LFxuICAgICAgICAgICAgICAgIC8vIHNvIGl0J3Mgc2FmZSB0byByZXR1cm4gdGhhdCB2YWx1ZS5cbiAgICAgICAgICAgICAgICBpZiAoZmV0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLl9fc3RhbGVXaGlsZUZldGNoaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLiNtb3ZlVG9UYWlsKGluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlQWdlT25HZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZShpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIHN0YXR1cy5nZXQgPSAnbWlzcyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2Nvbm5lY3QocCwgbikge1xuICAgICAgICB0aGlzLiNwcmV2W25dID0gcDtcbiAgICAgICAgdGhpcy4jbmV4dFtwXSA9IG47XG4gICAgfVxuICAgICNtb3ZlVG9UYWlsKGluZGV4KSB7XG4gICAgICAgIC8vIGlmIHRhaWwgYWxyZWFkeSwgbm90aGluZyB0byBkb1xuICAgICAgICAvLyBpZiBoZWFkLCBtb3ZlIGhlYWQgdG8gbmV4dFtpbmRleF1cbiAgICAgICAgLy8gZWxzZVxuICAgICAgICAvLyAgIG1vdmUgbmV4dFtwcmV2W2luZGV4XV0gdG8gbmV4dFtpbmRleF0gKGhlYWQgaGFzIG5vIHByZXYpXG4gICAgICAgIC8vICAgbW92ZSBwcmV2W25leHRbaW5kZXhdXSB0byBwcmV2W2luZGV4XVxuICAgICAgICAvLyBwcmV2W2luZGV4XSA9IHRhaWxcbiAgICAgICAgLy8gbmV4dFt0YWlsXSA9IGluZGV4XG4gICAgICAgIC8vIHRhaWwgPSBpbmRleFxuICAgICAgICBpZiAoaW5kZXggIT09IHRoaXMuI3RhaWwpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy4jaGVhZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2hlYWQgPSB0aGlzLiNuZXh0W2luZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Nvbm5lY3QodGhpcy4jcHJldltpbmRleF0sIHRoaXMuI25leHRbaW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2Nvbm5lY3QodGhpcy4jdGFpbCwgaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy4jdGFpbCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgYSBrZXkgb3V0IG9mIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IHdhcyBkZWxldGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZGVsZXRlKGspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RlbGV0ZShrLCAnZGVsZXRlJyk7XG4gICAgfVxuICAgICNkZWxldGUoaywgcmVhc29uKSB7XG4gICAgICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLiNzaXplICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNzaXplID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2NsZWFyKHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNyZW1vdmVJdGVtU2l6ZShpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZGVsZXRlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLiNoYXNEaXNwb3NlIHx8IHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4odiwgaywgcmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbdiwgaywgcmVhc29uXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5TWFwLmRlbGV0ZShrKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4ja2V5TGlzdFtpbmRleF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuI3RhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3RhaWwgPSB0aGlzLiNwcmV2W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gdGhpcy4jaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI25leHRbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGkgPSB0aGlzLiNwcmV2W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI25leHRbcGldID0gdGhpcy4jbmV4dFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuaSA9IHRoaXMuI25leHRbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jcHJldltuaV0gPSB0aGlzLiNwcmV2W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNzaXplLS07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2ZyZWUucHVzaChpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZDtcbiAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoZSBjYWNoZSBlbnRpcmVseSwgdGhyb3dpbmcgYXdheSBhbGwgdmFsdWVzLlxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2xlYXIoJ2RlbGV0ZScpO1xuICAgIH1cbiAgICAjY2xlYXIocmVhc29uKSB7XG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgdGhpcy4jcmluZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZGVsZXRlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4odiwgaywgcmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbdiwgaywgcmVhc29uXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2tleU1hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLiN2YWxMaXN0LmZpbGwodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy4ja2V5TGlzdC5maWxsKHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0aGlzLiN0dGxzICYmIHRoaXMuI3N0YXJ0cykge1xuICAgICAgICAgICAgdGhpcy4jdHRscy5maWxsKDApO1xuICAgICAgICAgICAgdGhpcy4jc3RhcnRzLmZpbGwoMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3NpemVzKSB7XG4gICAgICAgICAgICB0aGlzLiNzaXplcy5maWxsKDApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2hlYWQgPSAwO1xuICAgICAgICB0aGlzLiN0YWlsID0gMDtcbiAgICAgICAgdGhpcy4jZnJlZS5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuI3NpemUgPSAwO1xuICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICBjb25zdCBkdCA9IHRoaXMuI2Rpc3Bvc2VkO1xuICAgICAgICAgICAgbGV0IHRhc2s7XG4gICAgICAgICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXI/LiguLi50YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsbnVsbCxudWxsLG51bGwsbnVsbCwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlubmVyXCIgOnN0eWxlPVwiY29tcHV0ZWRJbm5lclN0eWxlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgICA8IS0tIGhlYWRlciAtLT5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyXCI+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJvZHlcIiA6c3R5bGU9XCJjb21wdXRlZEJvZHlTdHlsZVwiPlxuICAgICAgICAgIDwhLS0gYm9keSwg6auY5bqm6Ieq6YCC5bqUIC0tPlxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXJcIj5cbiAgICAgICAgICA8IS0tIGZvb3RlciAtLT5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyXCI+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxzbG90IG5hbWU9XCJib3hcIj48L3Nsb3Q+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgY29tcHV0ZWQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbi8qKlxuICogY3J1ZOeahOWuueWZqO+8jOagueaNruWklumDqOmrmOW6puiHqumAguW6lFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQ29udGFpbmVyXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5piv5ZCm5Zu65a6a6auY5bqmXG4gICAgICovXG4gICAgZml4ZWRIZWlnaHQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBib2R555qE5qC35byPXG4gICAgICovXG4gICAgYm9keVN0eWxlOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGlubmVy55qE5qC35byPXG4gICAgICovXG4gICAgaW5uZXJTdHlsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCBjb21wdXRlZElubmVyU3R5bGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuZml4ZWRIZWlnaHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBtZXJnZSh7IHBvc2l0aW9uOiBcInJlbGF0aXZlXCIgfSwgcHJvcHMuaW5uZXJTdHlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMuaW5uZXJTdHlsZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkQm9keVN0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKHByb3BzLmZpeGVkSGVpZ2h0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbWVyZ2UoeyBmbGV4OiBcInVuc2V0XCIgfSwgcHJvcHMuYm9keVN0eWxlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wcy5ib2R5U3R5bGU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29tcHV0ZWRJbm5lclN0eWxlLFxuICAgICAgY29tcHV0ZWRCb2R5U3R5bGVcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1jb250YWluZXIge1xuICAmLmNvbXBhY3Qge1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cbiAgcGFkZGluZzogMCAyMHB4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC5ib3gge1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGZsZXg6IDE7XG4gICAgLmlubmVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgdG9wOiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAuaGVhZGVyIHtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICB9XG4gICAgICAuYm9keSB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICB9XG4gICAgICAuZm9vdGVyIHtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlubmVyXCIgOnN0eWxlPVwiY29tcHV0ZWRJbm5lclN0eWxlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgICA8IS0tIGhlYWRlciAtLT5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyXCI+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJvZHlcIiA6c3R5bGU9XCJjb21wdXRlZEJvZHlTdHlsZVwiPlxuICAgICAgICAgIDwhLS0gYm9keSwg6auY5bqm6Ieq6YCC5bqUIC0tPlxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXJcIj5cbiAgICAgICAgICA8IS0tIGZvb3RlciAtLT5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyXCI+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxzbG90IG5hbWU9XCJib3hcIj48L3Nsb3Q+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgY29tcHV0ZWQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbi8qKlxuICogY3J1ZOeahOWuueWZqO+8jOagueaNruWklumDqOmrmOW6puiHqumAguW6lFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQ29udGFpbmVyXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5piv5ZCm5Zu65a6a6auY5bqmXG4gICAgICovXG4gICAgZml4ZWRIZWlnaHQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBib2R555qE5qC35byPXG4gICAgICovXG4gICAgYm9keVN0eWxlOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGlubmVy55qE5qC35byPXG4gICAgICovXG4gICAgaW5uZXJTdHlsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCBjb21wdXRlZElubmVyU3R5bGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuZml4ZWRIZWlnaHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBtZXJnZSh7IHBvc2l0aW9uOiBcInJlbGF0aXZlXCIgfSwgcHJvcHMuaW5uZXJTdHlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMuaW5uZXJTdHlsZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkQm9keVN0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKHByb3BzLmZpeGVkSGVpZ2h0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbWVyZ2UoeyBmbGV4OiBcInVuc2V0XCIgfSwgcHJvcHMuYm9keVN0eWxlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wcy5ib2R5U3R5bGU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29tcHV0ZWRJbm5lclN0eWxlLFxuICAgICAgY29tcHV0ZWRCb2R5U3R5bGVcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1jb250YWluZXIge1xuICAmLmNvbXBhY3Qge1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cbiAgcGFkZGluZzogMCAyMHB4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC5ib3gge1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGZsZXg6IDE7XG4gICAgLmlubmVyIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgdG9wOiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAuaGVhZGVyIHtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICB9XG4gICAgICAuYm9keSB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICB9XG4gICAgICAuZm9vdGVyIHtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZnMtY29udGFpbmVyIGNsYXNzPVwiZnMtbGF5b3V0LWRlZmF1bHRcIj5cbiAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtaGVhZGVyLXRvcFwiPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItdG9wXCI+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaFwiPjwvc2xvdD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci1taWRkbGVcIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLW1pZGRsZVwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXJcIj48L3Nsb3Q+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyXCI+PC9zbG90PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtaGVhZGVyLWJvdHRvbVwiPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItYm90dG9tXCI+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNsb3QgbmFtZT1cInRhYnNcIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPCEtLSDpu5jorqTmj5Lmp70gLS0+XG4gICAgPHNsb3Q+PC9zbG90PlxuICAgIDwhLS0gdGFibGUgLS0+XG4gICAgPHNsb3QgbmFtZT1cInRhYmxlXCI+PC9zbG90PlxuXG4gICAgPHNsb3QgbmFtZT1cImZvcm1cIj4gPC9zbG90PlxuXG4gICAgPHRlbXBsYXRlICNmb290ZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1mb290ZXJcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci10b3BcIj48L3Nsb3Q+XG4gICAgICAgIDxzbG90IG5hbWU9XCJwYWdpbmF0aW9uXCI+PC9zbG90PlxuICAgICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvZnMtY29udGFpbmVyPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbi8qKlxuICog6buY6K6k5biD5bGAXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNMYXlvdXREZWZhdWx0XCJcbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWxheW91dC1kZWZhdWx0IHtcbiAgLmZzLXRhYnMtZmlsdGVyIHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZnMtY29udGFpbmVyIGNsYXNzPVwiZnMtbGF5b3V0LWRlZmF1bHRcIj5cbiAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtaGVhZGVyLXRvcFwiPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItdG9wXCI+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaFwiPjwvc2xvdD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci1taWRkbGVcIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLW1pZGRsZVwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXJcIj48L3Nsb3Q+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyXCI+PC9zbG90PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtaGVhZGVyLWJvdHRvbVwiPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItYm90dG9tXCI+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNsb3QgbmFtZT1cInRhYnNcIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPCEtLSDpu5jorqTmj5Lmp70gLS0+XG4gICAgPHNsb3Q+PC9zbG90PlxuICAgIDwhLS0gdGFibGUgLS0+XG4gICAgPHNsb3QgbmFtZT1cInRhYmxlXCI+PC9zbG90PlxuXG4gICAgPHNsb3QgbmFtZT1cImZvcm1cIj4gPC9zbG90PlxuXG4gICAgPHRlbXBsYXRlICNmb290ZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1mb290ZXJcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci10b3BcIj48L3Nsb3Q+XG4gICAgICAgIDxzbG90IG5hbWU9XCJwYWdpbmF0aW9uXCI+PC9zbG90PlxuICAgICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvZnMtY29udGFpbmVyPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbi8qKlxuICog6buY6K6k5biD5bGAXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNMYXlvdXREZWZhdWx0XCJcbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWxheW91dC1kZWZhdWx0IHtcbiAgLmZzLXRhYnMtZmlsdGVyIHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZnMtY29udGFpbmVyIGNsYXNzPVwiZnMtbGF5b3V0LWNhcmRcIj5cbiAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItdG9wXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItdG9wXCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgICA8Y29tcG9uZW50IDppcz1cImNhcmRDb21wb25lbnROYW1lXCIgdi1pZj1cInNlYXJjaFNob3dcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaFwiPjwvc2xvdD5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci1ib3R0b21cIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPGZzLWNvbnRhaW5lcj5cbiAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICA8c2xvdCBuYW1lPVwidGFic1wiPjwvc2xvdD5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8Y29tcG9uZW50IDppcz1cImNhcmRDb21wb25lbnROYW1lXCIgY2xhc3M9XCJmcy1sYXlvdXQtY2FyZC1ib2R5XCI+XG4gICAgICAgIDx0ZW1wbGF0ZSAjdGl0bGU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1iYXJcIj5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXJcIj48L3Nsb3Q+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwidG9vbGJhclwiPjwvc2xvdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1iYXJcIj5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXJcIj48L3Nsb3Q+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwidG9vbGJhclwiPjwvc2xvdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPGZzLWNvbnRhaW5lcj5cbiAgICAgICAgICA8IS0tIOm7mOiupOaPkuanvSAtLT5cbiAgICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICAgICAgPCEtLSB0YWJsZSAtLT5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwidGFibGVcIj48L3Nsb3Q+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImZvcm1cIj48L3Nsb3Q+XG4gICAgICAgICAgPHRlbXBsYXRlICNmb290ZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci10b3BcIj48L3Nsb3Q+XG4gICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJwYWdpbmF0aW9uXCI+PC9zbG90PlxuICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvZnMtY29udGFpbmVyPlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgPC9mcy1jb250YWluZXI+XG4gIDwvZnMtY29udGFpbmVyPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIGluamVjdCwgcmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS11aVwiO1xuLyoqXG4gKiBjYXJk5biD5bGAXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNMYXlvdXRDYXJkXCIsXG4gIHNldHVwKCkge1xuICAgIGNvbnN0IGdldENydWRCaW5kaW5nID0gaW5qZWN0KFwiZ2V0OmNydWRCaW5kaW5nXCIpO1xuICAgIGNvbnN0IHNlYXJjaFNob3cgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAoZ2V0Q3J1ZEJpbmRpbmcgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiBnZXRDcnVkQmluZGluZygpPy5zZWFyY2g/LnNob3c7XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuXG4gICAgY29uc3QgY2FyZENvbXBvbmVudE5hbWUgPSByZWYodWkuY2FyZC5uYW1lKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2VhcmNoU2hvdyxcbiAgICAgIGNhcmRDb21wb25lbnROYW1lXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtbGF5b3V0LWNhcmQge1xuICAmID4gLmJveCA+IC5pbm5lciA+IC5oZWFkZXIge1xuICAgIG1hcmdpbjogMTBweCAxMHB4IDVweCAxMHB4O1xuICB9XG4gICYgPiAuYm94ID4gLmlubmVyID4gLmJvZHkge1xuICAgIG1hcmdpbjogNXB4IDEwcHggMTBweCAxMHB4O1xuICB9XG4gIC50b3AtYmFyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgfVxuICAuZnMtY29udGFpbmVyIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIC5ib3gge1xuICAgICAgLmlubmVyIHtcbiAgICAgICAgLmhlYWRlciB7XG4gICAgICAgICAgLmFudC1jYXJkLWJvZHkge1xuICAgICAgICAgICAgcGFkZGluZzogMTRweDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLmZzLWxheW91dC1jYXJkLWJvZHkge1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAuYW50LWNhcmQtaGVhZCB7XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgcGFkZGluZzogMHB4O1xuICAgICAgLmFudC1jYXJkLWhlYWQtdGl0bGUge1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5lbC1jYXJkX19oZWFkZXIge1xuICAgICAgcGFkZGluZzogMDtcbiAgICB9XG5cbiAgICAubi1jYXJkLWhlYWRlciB7XG4gICAgICBwYWRkaW5nOiAwcHg7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTtcbiAgICB9XG4gICAgLm4tY2FyZF9fY29udGVudCB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgIH1cblxuICAgIC5mcy1jcnVkLWFjdGlvbmJhciB7XG4gICAgICBtYXJnaW46IDEwcHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG4gICAgLmZzLWNydWQtdG9vbGJhciB7XG4gICAgICBtYXJnaW46IDEwcHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG5cbiAgICAuYW50LWNhcmQtYm9keSB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgcGFkZGluZzogMTBweDtcbiAgICB9XG4gICAgLmVsLWNhcmRfX2JvZHkge1xuICAgICAgZmxleDogMTtcbiAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgfVxuICB9XG5cbiAgLmZzLXRhYnMtZmlsdGVyIHtcbiAgICBtYXJnaW4tYm90dG9tOiAtMXB4O1xuICAgIC5uLXRhYnMgLm4tdGFicy1uYXYubi10YWJzLW5hdi0tY2FyZC10eXBlIC5uLXRhYnMtdGFiIHtcbiAgICAgICYubi10YWJzLXRhYi0tYWN0aXZlIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICAgIH1cbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY2MDtcbiAgICB9XG5cbiAgICAuZWwtdGFicy0tY2FyZCA+IC5lbC10YWJzX19oZWFkZXIgLmVsLXRhYnNfX2l0ZW0ge1xuICAgICAgJi5pcy1hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgICAgfVxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjgwO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGZzLWNvbnRhaW5lciBjbGFzcz1cImZzLWxheW91dC1jYXJkXCI+XG4gICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtaGVhZGVyLXRvcFwiPlxuICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLXRvcFwiPjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGNvbXBvbmVudCA6aXM9XCJjYXJkQ29tcG9uZW50TmFtZVwiIHYtaWY9XCJzZWFyY2hTaG93XCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2hcIj48L3Nsb3Q+XG4gICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItYm90dG9tXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItYm90dG9tXCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDxmcy1jb250YWluZXI+XG4gICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgPHNsb3QgbmFtZT1cInRhYnNcIj48L3Nsb3Q+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgICAgPGNvbXBvbmVudCA6aXM9XCJjYXJkQ29tcG9uZW50TmFtZVwiIGNsYXNzPVwiZnMtbGF5b3V0LWNhcmQtYm9keVwiPlxuICAgICAgICA8dGVtcGxhdGUgI3RpdGxlPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtYmFyXCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyXCI+PC9zbG90PlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInRvb2xiYXJcIj48L3Nsb3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtYmFyXCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyXCI+PC9zbG90PlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInRvb2xiYXJcIj48L3Nsb3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDxmcy1jb250YWluZXI+XG4gICAgICAgICAgPCEtLSDpu5jorqTmj5Lmp70gLS0+XG4gICAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgICAgIDwhLS0gdGFibGUgLS0+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInRhYmxlXCI+PC9zbG90PlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJmb3JtXCI+PC9zbG90PlxuICAgICAgICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNydWQtZm9vdGVyXCI+XG4gICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxuICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwicGFnaW5hdGlvblwiPjwvc2xvdD5cbiAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L2ZzLWNvbnRhaW5lcj5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvZnMtY29udGFpbmVyPlxuICA8L2ZzLWNvbnRhaW5lcj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBpbmplY3QsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtdWlcIjtcbi8qKlxuICogY2FyZOW4g+WxgFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzTGF5b3V0Q2FyZFwiLFxuICBzZXR1cCgpIHtcbiAgICBjb25zdCBnZXRDcnVkQmluZGluZyA9IGluamVjdChcImdldDpjcnVkQmluZGluZ1wiKTtcbiAgICBjb25zdCBzZWFyY2hTaG93ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKGdldENydWRCaW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gZ2V0Q3J1ZEJpbmRpbmcoKT8uc2VhcmNoPy5zaG93O1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcblxuICAgIGNvbnN0IGNhcmRDb21wb25lbnROYW1lID0gcmVmKHVpLmNhcmQubmFtZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlYXJjaFNob3csXG4gICAgICBjYXJkQ29tcG9uZW50TmFtZVxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWxheW91dC1jYXJkIHtcbiAgJiA+IC5ib3ggPiAuaW5uZXIgPiAuaGVhZGVyIHtcbiAgICBtYXJnaW46IDEwcHggMTBweCA1cHggMTBweDtcbiAgfVxuICAmID4gLmJveCA+IC5pbm5lciA+IC5ib2R5IHtcbiAgICBtYXJnaW46IDVweCAxMHB4IDEwcHggMTBweDtcbiAgfVxuICAudG9wLWJhciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIH1cbiAgLmZzLWNvbnRhaW5lciB7XG4gICAgcGFkZGluZzogMDtcbiAgICAuYm94IHtcbiAgICAgIC5pbm5lciB7XG4gICAgICAgIC5oZWFkZXIge1xuICAgICAgICAgIC5hbnQtY2FyZC1ib2R5IHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDE0cHg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC5mcy1sYXlvdXQtY2FyZC1ib2R5IHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG4gICAgLmFudC1jYXJkLWhlYWQge1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgIHBhZGRpbmc6IDBweDtcbiAgICAgIC5hbnQtY2FyZC1oZWFkLXRpdGxlIHtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZWwtY2FyZF9faGVhZGVyIHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuXG4gICAgLm4tY2FyZC1oZWFkZXIge1xuICAgICAgcGFkZGluZzogMHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7XG4gICAgfVxuICAgIC5uLWNhcmRfX2NvbnRlbnQge1xuICAgICAgcGFkZGluZzogMTBweDtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC1hY3Rpb25iYXIge1xuICAgICAgbWFyZ2luOiAxMHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIC5mcy1jcnVkLXRvb2xiYXIge1xuICAgICAgbWFyZ2luOiAxMHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuXG4gICAgLmFudC1jYXJkLWJvZHkge1xuICAgICAgZmxleDogMTtcbiAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgfVxuICAgIC5lbC1jYXJkX19ib2R5IHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgIH1cbiAgfVxuXG4gIC5mcy10YWJzLWZpbHRlciB7XG4gICAgbWFyZ2luLWJvdHRvbTogLTFweDtcbiAgICAubi10YWJzIC5uLXRhYnMtbmF2Lm4tdGFicy1uYXYtLWNhcmQtdHlwZSAubi10YWJzLXRhYiB7XG4gICAgICAmLm4tdGFicy10YWItLWFjdGl2ZSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgICB9XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmNjA7XG4gICAgfVxuXG4gICAgLmVsLXRhYnMtLWNhcmQgPiAuZWwtdGFic19faGVhZGVyIC5lbC10YWJzX19pdGVtIHtcbiAgICAgICYuaXMtYWN0aXZlIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICAgIH1cbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY4MDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLG51bGwsbnVsbCwiPHRlbXBsYXRlPlxuICA8c3BhbiBjbGFzcz1cImZzLWljb25pZnlcIiA6Y2xhc3M9XCJ7ICdmcy1pY29uaWZ5LXNwaW4nOiBzcGluIH1cIj5cbiAgICA8SWNvbiByZWY9XCJpY29uaWZ5UmVmXCIgOmljb249XCJpY29uXCIgOmlubGluZT1cInRydWVcIiAvPlxuICA8L3NwYW4+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIG9uTW91bnRlZCwgcmVmLCB1bnJlZiwgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBJY29uIH0gZnJvbSBcIkBpY29uaWZ5L3Z1ZVwiO1xuLyoqXG4gKiBpY29uaWZ5IOaMiemcgOWKoOi9veWbvuagh+e7hOS7tlxuICogaHR0cHM6Ly9pY29uaWZ5LmRlc2lnbi9pY29uLXNldHMvaW9uL1xuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzSWNvbmlmeVwiLFxuICBjb21wb25lbnRzOiB7IEljb24gfSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDlm77moIflkI3np7BcbiAgICAgKi9cbiAgICBpY29uOiB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaXi+i9rFxuICAgICAqL1xuICAgIHNwaW46IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IGljb25pZnlSZWYgPSByZWYobnVsbCk7XG4gICAgcmV0dXJuIHsgaWNvbmlmeVJlZiB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtaWNvbmlmeSB7XG4gIC8vZGlzcGxheTogaW5saW5lLWZsZXggIWltcG9ydGFudDtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICYtc3BpbiB7XG4gICAgc3ZnIHtcbiAgICAgIGFuaW1hdGlvbjogZnNMb2FkaW5nQ2lyY2xlIDFzIGluZmluaXRlIGxpbmVhcjtcbiAgICB9XG4gIH1cblxuICAmLmZzLWljb24ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICB9XG59XG5cbkBrZXlmcmFtZXMgZnNMb2FkaW5nQ2lyY2xlIHtcbiAgZnJvbSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgdG8ge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gIH1cbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIGZzTG9hZGluZ0NpcmNsZSB7XG4gIGZyb20ge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG4gIHRvIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICB9XG59XG5cbi8vc3Bhbi5pY29uaWZ5IHtcbi8vICBkaXNwbGF5OiBibG9jaztcbi8vICBtaW4td2lkdGg6IDFlbTtcbi8vICBtaW4taGVpZ2h0OiAxZW07XG4vLyAgLy8gYmFja2dyb3VuZC1jb2xvcjogQGljb25pZnktYmctY29sb3I7XG4vLyAgYm9yZGVyLXJhZGl1czogMTAwJTtcbi8vfVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPHNwYW4gY2xhc3M9XCJmcy1pY29uaWZ5XCIgOmNsYXNzPVwieyAnZnMtaWNvbmlmeS1zcGluJzogc3BpbiB9XCI+XG4gICAgPEljb24gcmVmPVwiaWNvbmlmeVJlZlwiIDppY29uPVwiaWNvblwiIDppbmxpbmU9XCJ0cnVlXCIgLz5cbiAgPC9zcGFuPlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCBvbk1vdW50ZWQsIHJlZiwgdW5yZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgSWNvbiB9IGZyb20gXCJAaWNvbmlmeS92dWVcIjtcbi8qKlxuICogaWNvbmlmeSDmjInpnIDliqDovb3lm77moIfnu4Tku7ZcbiAqIGh0dHBzOi8vaWNvbmlmeS5kZXNpZ24vaWNvbi1zZXRzL2lvbi9cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0ljb25pZnlcIixcbiAgY29tcG9uZW50czogeyBJY29uIH0sXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5Zu+5qCH5ZCN56ewXG4gICAgICovXG4gICAgaWNvbjoge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDml4vovaxcbiAgICAgKi9cbiAgICBzcGluOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCBpY29uaWZ5UmVmID0gcmVmKG51bGwpO1xuICAgIHJldHVybiB7IGljb25pZnlSZWYgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWljb25pZnkge1xuICAvL2Rpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAmLXNwaW4ge1xuICAgIHN2ZyB7XG4gICAgICBhbmltYXRpb246IGZzTG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XG4gICAgfVxuICB9XG5cbiAgJi5mcy1pY29uIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIGZzTG9hZGluZ0NpcmNsZSB7XG4gIGZyb20ge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG4gIHRvIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICB9XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyBmc0xvYWRpbmdDaXJjbGUge1xuICBmcm9tIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgfVxuICB0byB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxufVxuXG4vL3NwYW4uaWNvbmlmeSB7XG4vLyAgZGlzcGxheTogYmxvY2s7XG4vLyAgbWluLXdpZHRoOiAxZW07XG4vLyAgbWluLWhlaWdodDogMWVtO1xuLy8gIC8vIGJhY2tncm91bmQtY29sb3I6IEBpY29uaWZ5LWJnLWNvbG9yO1xuLy8gIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4vL31cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxzcGFuIDpjbGFzcz1cIlsnZnMtaWNvbi1zdmcnLCBzcGluICYmICdmcy1pY29uLXNwaW4nXVwiPlxuICAgIDxzdmcgY2xhc3M9XCJmcy1pY29uLXN2Zy1jb250ZW50XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8dXNlIDp4bGluazpocmVmPVwic3ltYm9sSWRcIj48L3VzZT5cbiAgICA8L3N2Zz5cbiAgPC9zcGFuPlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgdHlwZSB7IENTU1Byb3BlcnRpZXMgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIGNvbXB1dGVkIH0gZnJvbSBcInZ1ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzU3ZnSWNvblwiLFxuICBwcm9wczoge1xuICAgIGljb246IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICBzaXplOiB7XG4gICAgICB0eXBlOiBbTnVtYmVyLCBTdHJpbmddLFxuICAgICAgZGVmYXVsdDogMTZcbiAgICB9LFxuICAgIHNwaW46IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgc2V0dXAocHJvcHMpIHtcbiAgICBjb25zdCBzeW1ib2xJZCA9IGNvbXB1dGVkKCgpID0+IGAjJHtwcm9wcy5pY29ufWApO1xuXG4gICAgY29uc3QgZ2V0U3R5bGUgPSBjb21wdXRlZCgoKTogQ1NTUHJvcGVydGllcyA9PiB7XG4gICAgICBjb25zdCB7IHNpemUgfSA9IHByb3BzO1xuICAgICAgbGV0IHMgPSBgJHtzaXplfWA7XG4gICAgICBzID0gYCR7cy5yZXBsYWNlKFwicHhcIiwgXCJcIil9cHhgO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2lkdGg6IHMsXG4gICAgICAgIGhlaWdodDogc1xuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBzeW1ib2xJZCwgZ2V0U3R5bGUgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWljb24tc3ZnIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAmLmZzLWljb24tc3BpbiB7XG4gICAgYW5pbWF0aW9uOiBsb2FkaW5nQ2lyY2xlIDFzIGluZmluaXRlIGxpbmVhcjtcbiAgfVxuXG4gIC5mcy1pY29uLXN2Zy1jb250ZW50IHtcbiAgICB3aWR0aDogMWVtO1xuICAgIGhlaWdodDogMWVtO1xuICAgIHZlcnRpY2FsLWFsaWduOiAtMC4xNWVtO1xuICAgIGZpbGw6IGN1cnJlbnRDb2xvcjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8c3BhbiA6Y2xhc3M9XCJbJ2ZzLWljb24tc3ZnJywgc3BpbiAmJiAnZnMtaWNvbi1zcGluJ11cIj5cbiAgICA8c3ZnIGNsYXNzPVwiZnMtaWNvbi1zdmctY29udGVudFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgPHVzZSA6eGxpbms6aHJlZj1cInN5bWJvbElkXCI+PC91c2U+XG4gICAgPC9zdmc+XG4gIDwvc3Bhbj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHR5cGUgeyBDU1NQcm9wZXJ0aWVzIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBjb21wdXRlZCB9IGZyb20gXCJ2dWVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1N2Z0ljb25cIixcbiAgcHJvcHM6IHtcbiAgICBpY29uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgc2l6ZToge1xuICAgICAgdHlwZTogW051bWJlciwgU3RyaW5nXSxcbiAgICAgIGRlZmF1bHQ6IDE2XG4gICAgfSxcbiAgICBzcGluOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHNldHVwKHByb3BzKSB7XG4gICAgY29uc3Qgc3ltYm9sSWQgPSBjb21wdXRlZCgoKSA9PiBgIyR7cHJvcHMuaWNvbn1gKTtcblxuICAgIGNvbnN0IGdldFN0eWxlID0gY29tcHV0ZWQoKCk6IENTU1Byb3BlcnRpZXMgPT4ge1xuICAgICAgY29uc3QgeyBzaXplIH0gPSBwcm9wcztcbiAgICAgIGxldCBzID0gYCR7c2l6ZX1gO1xuICAgICAgcyA9IGAke3MucmVwbGFjZShcInB4XCIsIFwiXCIpfXB4YDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiBzLFxuICAgICAgICBoZWlnaHQ6IHNcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3ltYm9sSWQsIGdldFN0eWxlIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1pY29uLXN2ZyB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgJi5mcy1pY29uLXNwaW4ge1xuICAgIGFuaW1hdGlvbjogbG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XG4gIH1cblxuICAuZnMtaWNvbi1zdmctY29udGVudCB7XG4gICAgd2lkdGg6IDFlbTtcbiAgICBoZWlnaHQ6IDFlbTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTVlbTtcbiAgICBmaWxsOiBjdXJyZW50Q29sb3I7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWxhYmVsXCI+XG4gICAgPGRpdiBjbGFzcz1cImxhYmVsXCIgdi1iaW5kPVwibGFiZWxBdHRyc1wiPlxuICAgICAge3sgbGFiZWwgfX1cbiAgICAgIDxzbG90IG5hbWU9XCJsYWJlbFwiPjwvc2xvdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiIHYtYmluZD1cImNvbnRlbnRBdHRyc1wiPlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuXG4vKipcbiAqIGxhYmVs57uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNMYWJlbFwiLFxuICBwcm9wczoge1xuICAgIGxhYmVsOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcIlwiXG4gICAgfSxcbiAgICBsYWJlbEF0dHJzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe30pXG4gICAgfSxcbiAgICBjb250ZW50QXR0cnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcbiAgICB9XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1sYWJlbCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIC5sYWJlbCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICB9XG4gIC5jb250ZW50IHtcbiAgICBmbGV4OiAxO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtbGFiZWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIiB2LWJpbmQ9XCJsYWJlbEF0dHJzXCI+XG4gICAgICB7eyBsYWJlbCB9fVxuICAgICAgPHNsb3QgbmFtZT1cImxhYmVsXCI+PC9zbG90PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCIgdi1iaW5kPVwiY29udGVudEF0dHJzXCI+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5cbi8qKlxuICogbGFiZWznu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0xhYmVsXCIsXG4gIHByb3BzOiB7XG4gICAgbGFiZWw6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IFwiXCJcbiAgICB9LFxuICAgIGxhYmVsQXR0cnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcbiAgICB9LFxuICAgIGNvbnRlbnRBdHRyczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHt9KVxuICAgIH1cbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWxhYmVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLmxhYmVsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICBtaW4td2lkdGg6IDEwMHB4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gIH1cbiAgLmNvbnRlbnQge1xuICAgIGZsZXg6IDE7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBtaW4td2lkdGg6IDEwMHB4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgZmxleC13cmFwOiBub3dyYXA7XG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IGFzIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi8gX19NQUNST1NfZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0xvYWRpbmdcIlxufSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbiAgPGRpdiB2LWlmPVwibG9hZGluZ1wiIGNsYXNzPVwiZnMtbG9hZGluZ1wiPlxuICAgIDxmcy1pY29uIGNsYXNzPVwiZnMtaWNvbi1zcGluXCIgOmljb249XCJpY29uID8/IHVpLmljb25zLnJlZnJlc2hcIj48L2ZzLWljb24+XG4gICAgPHNwYW4gdi1pZj1cInRleHRcIj57eyB0ZXh0IH19PC9zcGFuPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5cbjtcbmNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcbiAgbG9hZGluZz86IGJvb2xlYW47XG4gIGljb24/OiBzdHJpbmc7XG4gIHRleHQ/OiBzdHJpbmc7XG59PigpO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1sb2FkaW5nIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIC5mcy1pY29uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgd2lkdGg6IDkwJTtcbiAgICBoZWlnaHQ6IDkwJTtcbiAgICBtYXgtd2lkdGg6IDUwcHg7XG4gICAgbWF4LWhlaWdodDogNTBweDtcbiAgICAmLmZzLWljb24tc3BpbiB7XG4gICAgICBzdmcge1xuICAgICAgICBhbmltYXRpb246IGZzLWxvYWRpbmctY2lyY2xlIDFzIGluZmluaXRlIGxpbmVhcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBALXdlYmtpdC1rZXlmcmFtZXMgZnMtbG9hZGluZy1jaXJjbGUge1xuICAgIGZyb20ge1xuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtYm94XCI+XG4gICAgPHNsb3Q+PC9zbG90PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuXG4vKipcbiAqIOWNlee6r+eahOWMheijueS4gOS4quWtkOe7hOS7tlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQm94XCJcbn0pO1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1ib3hcIj5cbiAgICA8c2xvdD48L3Nsb3Q+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5cbi8qKlxuICog5Y2V57qv55qE5YyF6KO55LiA5Liq5a2Q57uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNCb3hcIlxufSk7XG48L3NjcmlwdD5cbiIsbnVsbCxudWxsLG51bGwsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cInVpLmZvcm0ubmFtZVwiXG4gICAgcmVmPVwiZm9ybVJlZlwiXG4gICAgY2xhc3M9XCJmcy1mb3JtXCJcbiAgICA6Y2xhc3M9XCJ7XG4gICAgICAnZnMtZm9ybS1ncmlkJzogZGlzcGxheSA9PT0gJ2dyaWQnLFxuICAgICAgJ2ZzLWZvcm0tZmxleCc6IGRpc3BsYXkgPT09ICdmbGV4JyxcbiAgICAgICdmcy1mb3JtLWludmFsaWQnOiB2YWxpZFJlZiA9PT0gZmFsc2VcbiAgICB9XCJcbiAgICBvbnN1Ym1pdD1cImV2ZW50LnByZXZlbnREZWZhdWx0KCk7XCJcbiAgICA6bW9kZWw9XCJmb3JtXCJcbiAgPlxuICAgIDwhLS0gcm93IC0tPlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiBjbGFzcz1cImZzLXJvd1wiIHYtYmluZD1cInJvd1wiPlxuICAgICAgPCEtLSBjb2wgLS0+XG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCJpdGVtIGluIGNvbXB1dGVkRGVmYXVsdENvbHVtbnNcIiA6a2V5PVwiaXRlbT8ua2V5XCI+XG4gICAgICAgIDxmcy1mb3JtLWl0ZW0tY29sXG4gICAgICAgICAgOnJlZj1cIlxuICAgICAgICAgICAgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgZm9ybUl0ZW1SZWZzW2l0ZW0ua2V5XSA9IGVsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgICA6Y29sPVwibWVyZ2VDb2woaXRlbS5jb2wpXCJcbiAgICAgICAgICA6aXRlbT1cIml0ZW1cIlxuICAgICAgICAgIDpoZWxwZXI9XCJoZWxwZXJcIlxuICAgICAgICAgIDptb2RlbC12YWx1ZT1cImdldChmb3JtLCBpdGVtLmtleSlcIlxuICAgICAgICAgIDpzbG90cz1cIm1lcmdlZFNsb3RzWydmb3JtXycgKyBpdGVtLmtleV1cIlxuICAgICAgICAgIDpnZXQtY29udGV4dC1mbj1cImdldENvbnRleHRGblwiXG4gICAgICAgICAgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInNldChmb3JtLCBpdGVtLmtleSwgJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvY29tcG9uZW50PlxuICAgIDxjb21wb25lbnRcbiAgICAgIDppcz1cImNvbXB1dGVkR3JvdXAud3JhcHBlci5wYXJlbnRcIlxuICAgICAgdi1pZj1cImNvbXB1dGVkR3JvdXAud3JhcHBlclwiXG4gICAgICB2LW1vZGVsOlt1aS5jb2xsYXBzZS5tb2RlbFZhbHVlXT1cImdyb3VwQWN0aXZlS2V5XCJcbiAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCVcIlxuICAgICAgdi1iaW5kPVwiY29tcHV0ZWRHcm91cFwiXG4gICAgPlxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGdyb3VwSXRlbSwgZ3JvdXBLZXkpIG9mIGNvbXB1dGVkR3JvdXAuZ3JvdXBzXCIgOmtleT1cImdyb3VwS2V5XCI+XG4gICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICA6aXM9XCJjb21wdXRlZEdyb3VwLndyYXBwZXIuY2hpbGRcIlxuICAgICAgICAgIHYtaWY9XCJncm91cEl0ZW1TaG93KGdyb3VwSXRlbSlcIlxuICAgICAgICAgIDpbdWkuY29sbGFwc2Uua2V5TmFtZV09XCJncm91cEtleVwiXG4gICAgICAgICAgdi1iaW5kPVwiZ3JvdXBJdGVtXCJcbiAgICAgICAgICA6Y2xhc3M9XCJ7ICdmcy1mb3JtLWdyb3VwLWVycm9yJzogZXJyb3JzUmVmWydncm91cC4nICsgZ3JvdXBLZXldIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIHNsb3ROYW1lKSBvZiBncm91cEl0ZW0uc2xvdHNcIiA6a2V5PVwic2xvdE5hbWVcIiAjW3Nsb3ROYW1lXT1cInNjb3BlXCI+XG4gICAgICAgICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cIml0ZW1cIiA6c2NvcGU9XCJ7IC4uLnNjb3BlLCBoYXNFcnJvcjogZXJyb3JzUmVmWydncm91cC4nICsgZ3JvdXBLZXldIH1cIiAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPCEtLSByb3cgLS0+XG4gICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yb3cubmFtZVwiIGNsYXNzPVwiZnMtcm93XCIgdi1iaW5kPVwicm93XCI+XG4gICAgICAgICAgICA8IS0tIGNvbCAtLT5cbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cImtleSBpbiBncm91cEl0ZW0uY29sdW1uc1wiIDprZXk9XCJrZXlcIj5cbiAgICAgICAgICAgICAgPGZzLWZvcm0taXRlbS1jb2xcbiAgICAgICAgICAgICAgICB2LWlmPVwiY29tcHV0ZWRDb2x1bW5zW2tleV1cIlxuICAgICAgICAgICAgICAgIDpyZWY9XCJcbiAgICAgICAgICAgICAgICAgIChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1JdGVtUmVmc1trZXldID0gZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIDpjb2w9XCJtZXJnZUNvbChjb21wdXRlZENvbHVtbnNba2V5XS5jb2wpXCJcbiAgICAgICAgICAgICAgICA6aXRlbT1cImNvbXB1dGVkQ29sdW1uc1trZXldXCJcbiAgICAgICAgICAgICAgICA6bW9kZWwtdmFsdWU9XCJnZXQoZm9ybSwga2V5KVwiXG4gICAgICAgICAgICAgICAgOnNsb3RzPVwibWVyZ2VkU2xvdHNbJ2Zvcm1fJyArIGtleV1cIlxuICAgICAgICAgICAgICAgIDpnZXQtY29udGV4dC1mbj1cImdldENvbnRleHRGblwiXG4gICAgICAgICAgICAgICAgOmhlbHBlcj1cImhlbHBlclwiXG4gICAgICAgICAgICAgICAgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInNldChmb3JtLCBrZXksICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvY29tcG9uZW50PlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQge1xuICBjb21wdXRlZCxcbiAgZGVmaW5lQ29tcG9uZW50LFxuICBnZXRDdXJyZW50SW5zdGFuY2UsXG4gIG9uTW91bnRlZCxcbiAgcmVhY3RpdmUsXG4gIFJlZixcbiAgcmVmLFxuICB0b1JhdyxcbiAgdW5yZWYsXG4gIFVud3JhcE5lc3RlZFJlZnMsXG4gIHdhdGNoXG59IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IGVhY2gsIHNldCwgY2xvbmVEZWVwLCBlbnRyaWVzLCBnZXQsIHVuc2V0LCBmb3JFYWNoLCBtZXJnZSB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IENvbXB1dGVWYWx1ZSwgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLW1lcmdlXCI7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcbmltcG9ydCB7IEZvcm1TY29wZUNvbnRleHQsIFNldEZvcm1EYXRhT3B0aW9ucywgdXNlVWksIHV0aWxzIH0gZnJvbSBcIi4uLy4uL2luZGV4XCI7XG5cbi8qKlxuICog6YWN572u5YyW55qE6KGo5Y2V57uE5Lu2XG4gKiDmmrTpnLLnmoTmlrnms5XvvJpcbiAqIHJlZi5zdWJtaXQoKSA9IOaPkOS6pOihqOWNlVxuICogcmVmLnJlc2V0KCkgPSDph43nva7ooajljZVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0Zvcm1cIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDliJ3lp4vooajljZXmlbDmja5cbiAgICAgKiovXG4gICAgaW5pdGlhbEZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWtl+auteaooeeJiFxuICAgICAqIHtcbiAgICAgKiAgIGtleTp7XG4gICAgICogICAgIHRpdGxlOiBcIuWtl+auteWQjeensFwiLFxuICAgICAqICAgICBjb21wb25lbnQ6e1xuICAgICAqICAgICAgIG5hbWU6XCLnu4Tku7blkI3np7BcIlxuICAgICAqICAgICAgIC4uLue7hOS7tuWPguaVsFxuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqICovXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlrZfmrrXliIbnu4RcbiAgICAgKiB7XG4gICAgICogICB0eXBlOid4eHgnLCAvL+WIhue7hOWxleekuuexu+Wei1xuICAgICAqICAgZ3JvdXBzOnsgLy/liIbnu4TmlbDmja5cbiAgICAgKiAgICAgZ3JvdXBLZXk6eyB0aXRsZToneHh4Jyxjb2x1bW5zOlsnZmllbGRLZXknLCdmaWVsZEtleSddfVxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKi9cbiAgICBncm91cDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDph43nva7ooajljZXlkI7nmoTmk43kvZxcbiAgICAgKi9cbiAgICBkb1Jlc2V0OiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog54K55Ye75L+d5a2Y5oyJ6ZKu77yM6KGo5Y2V5qCh6aqM5YmN5omn6KGM5pON5L2c77yIYXN5bmPvvIlcbiAgICAgKi9cbiAgICBiZWZvcmVWYWxpZGF0ZToge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOWNleagoemqjOWujOWujOaIkOWQju+8jOaPkOS6pOWJjeWkhOeQhu+8iGFzeW5j77yJXG4gICAgICovXG4gICAgYmVmb3JlU3VibWl0OiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog54K55Ye75L+d5a2Y5oyJ6ZKu5pe25omn6KGM5pON5L2c77yIYXN5bmPvvIlcbiAgICAgKi9cbiAgICBkb1N1Ym1pdDoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOWNleaPkOS6pOWQjuWkhOeQhu+8iGFzeW5j77yJXG4gICAgICovXG4gICAgYWZ0ZXJTdWJtaXQ6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmj5Lmp73lhoXlrrlcbiAgICAgKi9cbiAgICBzbG90czoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDluIPlsYDmlrnlvI/jgJBmbGV4fGdyaWTjgJFcbiAgICAgKi9cbiAgICBkaXNwbGF5OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcImZsZXhcIiAvLyBmbGV4XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDluo/lj7fvvIznvJbovpHml7bkvJrkvKDlhaVcbiAgICAgKi9cbiAgICBpbmRleDoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmqKHlvI8gW2FkZCxlZGl0LHZpZXcs6Ieq5a6a5LmJXVxuICAgICAqL1xuICAgIG1vZGU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICogYS1yb3fphY3nva5cbiAgICAgKi9cbiAgICByb3c6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZWwtY29sfGEtY29s6YWN572u77yM5Y+v6YWN572u6Leo5YiXXG4gICAgICovXG4gICAgY29sOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGZvcm1JdGVt55qE5YWs5YWx6YWN572uXG4gICAgICovXG4gICAgZm9ybUl0ZW06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICogaGVscGVy5L2N572u77yae3Bvc2l0aW9uOidsYWJlbCd9XG4gICAgICovXG4gICAgaGVscGVyOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuXG4gICAgd2F0Y2g6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcInJlc2V0XCIsIFwic3VibWl0XCIsIFwic3VjY2Vzc1wiLCBcInZhbGlkYXRpb25FcnJvclwiLCBcInZhbHVlLWNoYW5nZVwiLCBcImluaXRcIl0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgeyBBc3luY0NvbXB1dGVWYWx1ZSwgZG9Db21wdXRlZCB9ID0gdXNlQ29tcHV0ZSgpO1xuICAgIGNvbnN0IGZvcm1SZWYgPSByZWYoKTtcbiAgICBjb25zdCBmb3JtOiBVbndyYXBOZXN0ZWRSZWZzPGFueT4gPSByZWFjdGl2ZSh7fSk7XG4gICAgY29uc3QgeyBwcm94eSB9ID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cbiAgICAvLyB1dGlscy50cmFjZShcImZzLWZvcm1cIik7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNldHVwLXByb3BzLWRlc3RydWN0dXJlXG4gICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55KSA9PiB7XG4gICAgICBpZiAoaXRlbS52YWx1ZSAhPSBudWxsICYmIChpdGVtLnZhbHVlIGluc3RhbmNlb2YgQXN5bmNDb21wdXRlVmFsdWUgfHwgaXRlbS52YWx1ZSBpbnN0YW5jZW9mIENvbXB1dGVWYWx1ZSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJmb3JtLnZhbHVl6YWN572u5LiN5pSv5oyBQ29tcHV0ZS9Bc3luY0NvbXB1dGXnsbvlnovnmoTliqjmgIHorqHnrpdcIik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gY3JlYXRlSW5pdGlhbEZvcm0oKSB7XG4gICAgICBjb25zdCBmb3JtID0ge307XG4gICAgICAvLyDliJ3lp4vmlbDmja7otYvlgLxcbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZGVmVmFsdWUgPSB1bnJlZihpdGVtLnZhbHVlKTtcbiAgICAgICAgaWYgKGRlZlZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzZXQoZm9ybSwga2V5LCBkZWZWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbWVyZ2UoZm9ybSwgY2xvbmVEZWVwKHByb3BzLmluaXRpYWxGb3JtKSk7XG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsRm9ybSA9IGNyZWF0ZUluaXRpYWxGb3JtKCk7XG4gICAgc2V0Rm9ybURhdGEoaW5pdGlhbEZvcm0pO1xuXG4gICAgY29uc3Qgc2NvcGU6IFJlZjxGb3JtU2NvcGVDb250ZXh0PiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJvdzogaW5pdGlhbEZvcm0sXG4gICAgICAgIGZvcm0sXG4gICAgICAgIGluZGV4OiBwcm9wcy5pbmRleCxcbiAgICAgICAgbW9kZTogcHJvcHMubW9kZSB8fCBcImFkZFwiLFxuICAgICAgICBhdHRyczogY3R4LmF0dHJzLFxuICAgICAgICBnZXRDb21wb25lbnRSZWZcbiAgICAgIH0gYXMgRm9ybVNjb3BlQ29udGV4dDtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGdldENvbnRleHRGbigpIHtcbiAgICAgIHJldHVybiBzY29wZS52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuY29sdW1ucztcbiAgICB9KTtcbiAgICAvL2Zvcm0udmFsdWVCdWlsZGVyXG5cbiAgICBmdW5jdGlvbiBkb1ZhbHVlQnVpbGRlcihmb3JtOiBhbnkpIHtcbiAgICAgIGlmIChmb3JtID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55LCBrZXk6IGFueSkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBnZXQoZm9ybSwga2V5KTtcbiAgICAgICAgaWYgKGl0ZW0udmFsdWVCdWlsZGVyKSB7XG4gICAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBpdGVtLnZhbHVlQnVpbGRlcih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHJvdzogaW5pdGlhbEZvcm0sXG4gICAgICAgICAgICBmb3JtLFxuICAgICAgICAgICAgaW5kZXg6IHByb3BzLmluZGV4LFxuICAgICAgICAgICAgbW9kZTogcHJvcHMubW9kZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiAhKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG4gICAgICAgICAgICBzZXQoZm9ybSwga2V5LCByZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Rm9ybURhdGEoKSB7XG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0Rm9ybURhdGEoZm9ybURhdGE6IGFueSwgb3B0aW9uczogU2V0Rm9ybURhdGFPcHRpb25zID0ge30pIHtcbiAgICAgIGRvVmFsdWVCdWlsZGVyKGZvcm1EYXRhKTtcblxuICAgICAgaWYgKG9wdGlvbnMubWVyZ2VGb3JtID09PSBmYWxzZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtKSB7XG4gICAgICAgICAgZGVsZXRlIGZvcm1ba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWVyZ2UoZm9ybSwgZm9ybURhdGEpO1xuICAgICAgY29uc3QgeyB2YWx1ZUNoYW5nZSB9ID0gb3B0aW9ucztcbiAgICAgIGlmICh2YWx1ZUNoYW5nZSkge1xuICAgICAgICBmb3JFYWNoKHByb3BzLmNvbHVtbnMsIChjb2x1bW46IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1ba2V5XTtcbiAgICAgICAgICBkb1ZhbHVlQ2hhbmdlKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUNvbCguLi5jb2w6IGFueSkge1xuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5jb2wsIC4uLmNvbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnVpbGRJdGVtU2NvcGUoaXRlbTogYW55KTogRm9ybVNjb3BlQ29udGV4dCB7XG4gICAgICByZXR1cm4geyBrZXk6IGl0ZW0ua2V5LCAuLi5zY29wZS52YWx1ZSB9O1xuICAgIH1cblxuICAgIC8vIGRvVmFsdWVCdWlsZGVyKGZvcm0pO1xuXG4gICAgLy8gd2F0Y2goXG4gICAgLy8gICAoKSA9PiBwcm9wcy5pbml0aWFsRm9ybSxcbiAgICAvLyAgICgpID0+IHtcbiAgICAvLyAgICAgc2V0Rm9ybURhdGEoY3JlYXRlSW5pdGlhbEZvcm0oKSwgeyBtZXJnZUZvcm06IGZhbHNlIH0pO1xuICAgIC8vICAgfVxuICAgIC8vICk7XG5cbiAgICBmdW5jdGlvbiBkb1ZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICBjb25zdCBldmVudCA9IHsga2V5LCB2YWx1ZSwgZm9ybVJlZjogcHJveHksIC4uLnNjb3BlLnZhbHVlLCBpbW1lZGlhdGU6IGZhbHNlIH07XG4gICAgICBjdHguZW1pdChcInZhbHVlLWNoYW5nZVwiLCBldmVudCk7XG4gICAgICBsZXQgdmFsdWVDaGFuZ2UgPSBwcm9wcy5jb2x1bW5zW2tleV0udmFsdWVDaGFuZ2U7XG4gICAgICBpZiAodmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICB2YWx1ZUNoYW5nZShldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVDaGFuZ2UuaGFuZGxlKSB7XG4gICAgICAgICAgdmFsdWVDaGFuZ2UuaGFuZGxlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvcm1JdGVtUmVmczogUmVmID0gcmVmKHt9KTtcblxuICAgIGZ1bmN0aW9uIGdldEZvcm1JdGVtUmVmKGtleTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZm9ybUl0ZW1SZWZzLnZhbHVlW2tleV0uZ2V0Rm9ybUl0ZW1SZWYoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoa2V5OiBzdHJpbmcsIGlzQXN5bmMgPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGdldEZvcm1JdGVtUmVmKGtleSk/LmdldENvbXBvbmVudFJlZihpc0FzeW5jKTtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cEFjdGl2ZUtleSA9IHJlZihbXSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNldHVwLXByb3BzLWRlc3RydWN0dXJlXG4gICAgZm9yRWFjaChwcm9wcy5ncm91cD8uZ3JvdXBzLCAoZ3JvdXBJdGVtOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICBpZiAoZ3JvdXBJdGVtLmNvbGxhcHNlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBncm91cEFjdGl2ZUtleS52YWx1ZS5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxuICAgIGlmIChwcm9wcy5ncm91cD8uZ3JvdXBUeXBlID09PSBcInRhYnNcIikge1xuICAgICAgZ3JvdXBBY3RpdmVLZXkudmFsdWUgPSBncm91cEFjdGl2ZUtleS52YWx1ZS5sZW5ndGggPiAwID8gZ3JvdXBBY3RpdmVLZXkudmFsdWVbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIC8v5p6E5bu65YiG57uE5pWw5o2uXG4gICAgY29uc3QgY29tcHV0ZWRHcm91cCA9IGRvQ29tcHV0ZWQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9wcy5ncm91cDtcbiAgICAgIH0sXG4gICAgICBnZXRDb250ZXh0Rm4sXG4gICAgICBudWxsLFxuICAgICAgKGdyb3VwID0ge30pID0+IHtcbiAgICAgICAgLy/mib7lh7rmsqHmnInmt7vliqDov5vliIbnu4TnmoTlrZfmrrVcbiAgICAgICAgY29uc3QgZ3JvdXBlZEtleXM6IGFueSA9IHt9O1xuICAgICAgICBmb3JFYWNoKGdyb3VwPy5ncm91cHMsIChncm91cEl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBmb3JFYWNoKGdyb3VwSXRlbS5jb2x1bW5zLCAoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcHV0ZWRDb2x1bW5zLnZhbHVlW2l0ZW1dID09IG51bGwpIHtcbiAgICAgICAgICAgICAgdXRpbHMubG9nZ2VyLndhcm4oXCLml6DmlYjnmoTliIbnu4TlrZfmrrXvvJpcIiArIGl0ZW0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cGVkS2V5c1tpdGVtXSA9IGtleTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdHlwZSA9IGdyb3VwLmdyb3VwVHlwZTtcbiAgICAgICAgbGV0IHdyYXBwZXIgPSB7XG4gICAgICAgICAgcGFyZW50OiB1aS5jb2xsYXBzZS5uYW1lLFxuICAgICAgICAgIGNoaWxkOiB1aS5jb2xsYXBzZUl0ZW0ubmFtZVxuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJ0YWJzXCIpIHtcbiAgICAgICAgICB3cmFwcGVyLnBhcmVudCA9IHVpLnRhYnMubmFtZTtcbiAgICAgICAgICB3cmFwcGVyLmNoaWxkID0gdWkudGFiUGFuZS5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3cmFwcGVyLFxuICAgICAgICAgICAgZ3JvdXBlZEtleXNcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdyb3VwXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGNvbXB1dGVkRGVmYXVsdENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5zOiBhbnkgPSBbXTtcbiAgICAgIC8vZGVmYXVsdCBjb2x1bW5z5o6S5bqPXG4gICAgICBmb3JFYWNoKGNvbXB1dGVkQ29sdW1ucy52YWx1ZSwgKHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBjbG9uZURlZXAocHJvcHMuZm9ybUl0ZW0gfHwge30pO1xuICAgICAgICB2YWx1ZSA9IG1lcmdlKGl0ZW0sIHZhbHVlKTtcbiAgICAgICAgdmFsdWUua2V5ID0ga2V5O1xuICAgICAgICBpZiAodmFsdWUub3JkZXIgPT0gbnVsbCkge1xuICAgICAgICAgIHZhbHVlLm9yZGVyID0gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHV0ZWRHcm91cC52YWx1ZT8uZ3JvdXBlZEtleXMgPT0gbnVsbCB8fCBjb21wdXRlZEdyb3VwLnZhbHVlPy5ncm91cGVkS2V5c1trZXldID09IG51bGwpIHtcbiAgICAgICAgICBjb2x1bW5zLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlLmNvbCA9IG1lcmdlQ29sKHZhbHVlLmNvbCk7XG4gICAgICB9KTtcbiAgICAgIC8v5o6S5bqPXG4gICAgICBjb2x1bW5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGdldEZvcm1SZWYoKSB7XG4gICAgICByZXR1cm4gZm9ybVJlZi52YWx1ZTtcbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAvLyB1aS5mb3JtLnJlc2V0V3JhcChmb3JtUmVmLnZhbHVlLCB7IGZvcm0sIGluaXRpYWxGb3JtOiBjcmVhdGVJbml0aWFsRm9ybSgpIH0pO1xuICAgICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xuICAgICAgY29uc3QgZW50cmllc1JldCA9IGVudHJpZXMoZm9ybSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXNSZXQpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gZ2V0KGluaXRpYWxGb3JtLCBlbnRyeVswXSk7XG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIHVuc2V0KGZvcm0sIGVudHJ5WzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXQoZm9ybSwgZW50cnlbMF0sIGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmRvUmVzZXQpIHtcbiAgICAgICAgYXdhaXQgcHJvcHMuZG9SZXNldChzY29wZS52YWx1ZSk7XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcInJlc2V0XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkUmVmOiBSZWYgPSByZWYoKTtcbiAgICBjb25zdCBlcnJvcnNSZWY6IFJlZiA9IHJlZih7fSk7XG5cbiAgICBmdW5jdGlvbiBmaWxsR3JvdXBFcnJvcihmaWVsZEVycm9yczogYW55KSB7XG4gICAgICBpZiAoIWNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGtleSBpbiBmaWVsZEVycm9ycykge1xuICAgICAgICBjb25zdCBncm91cCA9IGNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzW2tleV07XG4gICAgICAgIGlmIChncm91cCAhPSBudWxsKSB7XG4gICAgICAgICAgZmllbGRFcnJvcnNbXCJncm91cC5cIiArIGdyb3VwXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlU2NvcGUgPSB7IC4uLnNjb3BlLnZhbHVlLCBmb3JtIH07XG4gICAgICBpZiAodmFsaWRhdGVTY29wZS5tb2RlID09PSBcInZpZXdcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuYmVmb3JlVmFsaWRhdGUpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgcHJvcHMuYmVmb3JlVmFsaWRhdGUodmFsaWRhdGVTY29wZSk7XG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGVycm9yc1JlZi52YWx1ZSA9IHt9O1xuICAgICAgICBhd2FpdCB1aS5mb3JtLnZhbGlkYXRlV3JhcChmb3JtUmVmLnZhbHVlKTtcbiAgICAgICAgdmFsaWRSZWYudmFsdWUgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHZhbGlkUmVmLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlRXJyb3JzID0gdWkuZm9ybS50cmFuc2Zvcm1WYWxpZGF0ZUVycm9ycyhlKTtcbiAgICAgICAgZmlsbEdyb3VwRXJyb3IodmFsaWRhdGVFcnJvcnMpO1xuICAgICAgICBlcnJvcnNSZWYudmFsdWUgPSB2YWxpZGF0ZUVycm9ycztcbiAgICAgICAgY3R4LmVtaXQoXCJ2YWxpZGF0aW9uRXJyb3JcIiwgc2NvcGUudmFsdWUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBmdW5jdGlvbiBzdWJtaXQoKSB7XG4gICAgICBhd2FpdCB2YWxpZGF0ZSgpO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBjbG9uZURlZXAodG9SYXcoZm9ybSkpO1xuICAgICAgY29uc3Qgc3VibWl0U2NvcGUgPSB7IC4uLnNjb3BlLnZhbHVlLCBmb3JtOiBmb3JtRGF0YSB9O1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiZm9ybSBzdWJtaXRcIiwgSlNPTi5zdHJpbmdpZnkoZm9ybSkpO1xuICAgICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBnZXQoZm9ybURhdGEsIGtleSk7XG4gICAgICAgIGlmIChpdGVtLnZhbHVlUmVzb2x2ZSkge1xuICAgICAgICAgIGNvbnN0IHJlczogYW55ID0gaXRlbS52YWx1ZVJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAuLi5zdWJtaXRTY29wZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiAhKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHNldChmb3JtRGF0YSwga2V5LCByZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChwcm9wcy5iZWZvcmVTdWJtaXQpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgcHJvcHMuYmVmb3JlU3VibWl0KHN1Ym1pdFNjb3BlKTtcbiAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy/np7vpmaTkuI3lhYHorrjmj5DkuqTnmoTlrZfmrrVcbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uc3VibWl0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHVuc2V0KGZvcm1EYXRhLCBrZXkpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uc3VibWl0ID09PSB0cnVlKSB7XG4gICAgICAgICAgLy/orr7nva7lvLrliLbmj5DkuqTnmoTlrZfmrrVcbiAgICAgICAgICBzZXQoZm9ybURhdGEsIGtleSwgZm9ybURhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocHJvcHMuZG9TdWJtaXQpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcHJvcHMuZG9TdWJtaXQoc3VibWl0U2NvcGUpO1xuICAgICAgICBzdWJtaXRTY29wZS5yZXMgPSByZXM7XG4gICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcInN1Ym1pdFwiLCBzdWJtaXRTY29wZSk7XG4gICAgICBpZiAocHJvcHMuYWZ0ZXJTdWJtaXQpIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IHByb3BzLmFmdGVyU3VibWl0KHN1Ym1pdFNjb3BlKTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcInN1Y2Nlc3NcIiwgc3VibWl0U2NvcGUpO1xuXG4gICAgICByZXR1cm4gc3VibWl0U2NvcGU7XG4gICAgfVxuXG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIC8vIGltbWVkaWF0ZSB2YWx1ZUNoYW5nZeinpuWPkVxuICAgICAgZm9yRWFjaChjb21wdXRlZENvbHVtbnMudmFsdWUsIChpdGVtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnZhbHVlQ2hhbmdlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlQ2hhbmdlID0gaXRlbS52YWx1ZUNoYW5nZTtcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlICYmIHZhbHVlQ2hhbmdlLmltbWVkaWF0ZSA9PT0gdHJ1ZSAmJiB2YWx1ZUNoYW5nZS5oYW5kbGUpIHtcbiAgICAgICAgICBjb25zdCBldmVudCA9IHsga2V5LCB2YWx1ZTogZm9ybVtrZXldLCBmb3JtUmVmOiBwcm94eSwgLi4uc2NvcGUudmFsdWUsIGltbWVkaWF0ZTogdHJ1ZSB9O1xuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZS5oYW5kbGUpIHtcbiAgICAgICAgICAgIHZhbHVlQ2hhbmdlLmhhbmRsZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGZvcm1JdGVtU2hvdyhpdGVtOiBhbnkpIHtcbiAgICAgIGlmIChpdGVtICYmIHVucmVmKGl0ZW0uc2hvdykgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBncm91cEl0ZW1TaG93KGdyb3VwSXRlbTogYW55KSB7XG4gICAgICBpZiAoIWdyb3VwSXRlbS5jb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh1bnJlZihncm91cEl0ZW0uc2hvdykgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQga2V5IG9mIGdyb3VwSXRlbS5jb2x1bW5zKSB7XG4gICAgICAgIGlmIChjb21wdXRlZENvbHVtbnMudmFsdWVba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNGaWVsZFNob3cgPSBmb3JtSXRlbVNob3coY29tcHV0ZWRDb2x1bW5zLnZhbHVlW2tleV0pO1xuICAgICAgICBpZiAoaXNGaWVsZFNob3cpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy53YXRjaCkge1xuICAgICAgd2F0Y2goXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gZm9ybTtcbiAgICAgICAgfSxcbiAgICAgICAgKG5ld1ZhbCwgb2xkVmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHByb3BzLndhdGNoKSB7XG4gICAgICAgICAgICBwcm9wcy53YXRjaChzY29wZS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgICBpbW1lZGlhdGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RpcnR5KCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gSlNPTi5zdHJpbmdpZnkoaW5pdGlhbEZvcm0pO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBKU09OLnN0cmluZ2lmeShmb3JtKTtcbiAgICAgIHJldHVybiBiZWZvcmUgIT09IGFmdGVyO1xuICAgIH1cblxuICAgIGNvbnN0IG1lcmdlZFNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5zbG90cywgY3R4LnNsb3RzKTtcbiAgICB9KTtcblxuICAgIGN0eC5lbWl0KFwiaW5pdFwiLCBzY29wZS52YWx1ZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0OiAoZm9ybTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KGZvcm0sIGtleSk7XG4gICAgICB9LFxuICAgICAgc2V0OiAoZm9ybTogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBzZXQoZm9ybSwga2V5LCB2YWx1ZSk7XG4gICAgICAgIGRvVmFsdWVDaGFuZ2Uoa2V5LCB2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgdWksXG4gICAgICB2YWxpZFJlZixcbiAgICAgIGVycm9yc1JlZixcbiAgICAgIGZvcm1SZWYsXG4gICAgICBjb21wdXRlZENvbHVtbnMsXG4gICAgICBjb21wdXRlZERlZmF1bHRDb2x1bW5zLFxuICAgICAgc3VibWl0LFxuICAgICAgcmVzZXQsXG4gICAgICBnZXRGb3JtUmVmLFxuICAgICAgc2NvcGUsXG4gICAgICBidWlsZEl0ZW1TY29wZSxcbiAgICAgIGdyb3VwQWN0aXZlS2V5LFxuICAgICAgZm9ybSxcbiAgICAgIGZvcm1JdGVtUmVmcyxcbiAgICAgIGdldEZvcm1EYXRhLFxuICAgICAgc2V0Rm9ybURhdGEsXG4gICAgICBnZXRDb21wb25lbnRSZWYsXG4gICAgICBtZXJnZUNvbCxcbiAgICAgIHZhbGlkYXRlLFxuICAgICAgY29tcHV0ZWRHcm91cCxcbiAgICAgIGdldENvbnRleHRGbixcbiAgICAgIGZvcm1JdGVtU2hvdyxcbiAgICAgIGdyb3VwSXRlbVNob3csXG4gICAgICBpc0RpcnR5LFxuICAgICAgbWVyZ2VkU2xvdHNcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1mb3JtIHtcbiAgLmVsLWNvbGxhcHNlLWl0ZW1fX2NvbnRlbnQge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgcGFkZGluZy1sZWZ0OiAzMHB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDMwcHg7XG4gIH1cblxuICAuZnMtZm9ybS1pbnZhbGlkIHtcbiAgfVxuXG4gIC5mcy1mb3JtLWl0ZW0tY29tcG9uZW50IHtcbiAgICAuYW50LXBpY2tlcixcbiAgICAuYW50LWlucHV0LWFmZml4LXdyYXBwZXIsXG4gICAgLmFudC1pbnB1dC1udW1iZXIsXG4gICAgLmVsLWNhc2NhZGVyLFxuICAgIC5lbC1kYXRlLWVkaXRvcixcbiAgICAuZWwtaW5wdXQtbnVtYmVyLFxuICAgIC5lbC1pbnB1dCxcbiAgICA+IC5lbC1zZWxlY3QsXG4gICAgPiAubi1zZWxlY3QsXG4gICAgLm4tZGF0ZS1waWNrZXIsXG4gICAgLm4taW5wdXQtbnVtYmVyIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2ljb24ge1xuICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgfVxuICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2Nsb3NlLWljb24ge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgIH1cblxuICAgIC5lbC1yYW5nZS1lZGl0b3IuZWwtaW5wdXRfX3dyYXBwZXIge1xuICAgICAgcGFkZGluZzogMDtcbiAgICB9XG4gIH1cblxuICAvLy5lbC1kYXRlLWVkaXRvci5lbC1pbnB1dF9fd3JhcHBlciB7XG4gIC8vICB3aWR0aDogMTAwJTtcbiAgLy99XG59XG5cbi5mcy1mb3JtLWdyaWQge1xuICAuZnMtcm93IHtcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNTAlIDUwJTtcbiAgICAvLyBnYXA6IDAgMjBweDsgLy/liJfpl7Tot50gMjBweFxuICAgIC5mcy1jb2wge1xuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLy8gYW50ZHZcbiAgICAuYW50LWZvcm0taXRlbS1sYWJlbCB7XG4gICAgICB3aWR0aDogMTAwcHg7XG4gICAgICBmbGV4OiBub25lO1xuICAgICAgbWF4LXdpZHRoOiBub25lO1xuICAgIH1cbiAgICAuYW50LWZvcm0taXRlbS1jb250cm9sLXdyYXBwZXIge1xuICAgICAgZmxleDogMTtcbiAgICAgIG1heC13aWR0aDogbm9uZTtcbiAgICB9XG4gIH1cblxuICAvLyBlbGVtZW50XG4gIC5lbC1yb3c6OmFmdGVyLFxuICAuZWwtcm93OjpiZWZvcmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cbi5mcy1mb3JtLWZsZXgge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbiAgZmxleC13cmFwOiB3cmFwO1xuICAuZnMtcm93IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgLmZzLWZvcm0tZmxleCB7XG4gICAgLmZzLXJvdyB7XG4gICAgICAuZnMtY29sIHtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgZmxleDogMCAwIDEwMCU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA1NzVweCkge1xuICAuZnMtZm9ybS1mbGV4IHtcbiAgICAuZnMtcm93IHtcbiAgICAgIC5mcy1jb2wge1xuICAgICAgICAvLy5hbnQtZm9ybS1pdGVtLWxhYmVsIHtcbiAgICAgICAgLy8gIGZsZXg6IG5vbmU7XG4gICAgICAgIC8vfVxuICAgICAgICAvLy5hbnQtZm9ybS1pdGVtIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xuICAgICAgICAvLyAgZmxleDogMTtcbiAgICAgICAgLy8gIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgLy99XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50XG4gICAgOmlzPVwidWkuZm9ybS5uYW1lXCJcbiAgICByZWY9XCJmb3JtUmVmXCJcbiAgICBjbGFzcz1cImZzLWZvcm1cIlxuICAgIDpjbGFzcz1cIntcbiAgICAgICdmcy1mb3JtLWdyaWQnOiBkaXNwbGF5ID09PSAnZ3JpZCcsXG4gICAgICAnZnMtZm9ybS1mbGV4JzogZGlzcGxheSA9PT0gJ2ZsZXgnLFxuICAgICAgJ2ZzLWZvcm0taW52YWxpZCc6IHZhbGlkUmVmID09PSBmYWxzZVxuICAgIH1cIlxuICAgIG9uc3VibWl0PVwiZXZlbnQucHJldmVudERlZmF1bHQoKTtcIlxuICAgIDptb2RlbD1cImZvcm1cIlxuICA+XG4gICAgPCEtLSByb3cgLS0+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yb3cubmFtZVwiIGNsYXNzPVwiZnMtcm93XCIgdi1iaW5kPVwicm93XCI+XG4gICAgICA8IS0tIGNvbCAtLT5cbiAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIml0ZW0gaW4gY29tcHV0ZWREZWZhdWx0Q29sdW1uc1wiIDprZXk9XCJpdGVtPy5rZXlcIj5cbiAgICAgICAgPGZzLWZvcm0taXRlbS1jb2xcbiAgICAgICAgICA6cmVmPVwiXG4gICAgICAgICAgICAoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgICBmb3JtSXRlbVJlZnNbaXRlbS5rZXldID0gZWw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcIlxuICAgICAgICAgIDpjb2w9XCJtZXJnZUNvbChpdGVtLmNvbClcIlxuICAgICAgICAgIDppdGVtPVwiaXRlbVwiXG4gICAgICAgICAgOmhlbHBlcj1cImhlbHBlclwiXG4gICAgICAgICAgOm1vZGVsLXZhbHVlPVwiZ2V0KGZvcm0sIGl0ZW0ua2V5KVwiXG4gICAgICAgICAgOnNsb3RzPVwibWVyZ2VkU2xvdHNbJ2Zvcm1fJyArIGl0ZW0ua2V5XVwiXG4gICAgICAgICAgOmdldC1jb250ZXh0LWZuPVwiZ2V0Q29udGV4dEZuXCJcbiAgICAgICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwic2V0KGZvcm0sIGl0ZW0ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9jb21wb25lbnQ+XG4gICAgPGNvbXBvbmVudFxuICAgICAgOmlzPVwiY29tcHV0ZWRHcm91cC53cmFwcGVyLnBhcmVudFwiXG4gICAgICB2LWlmPVwiY29tcHV0ZWRHcm91cC53cmFwcGVyXCJcbiAgICAgIHYtbW9kZWw6W3VpLmNvbGxhcHNlLm1vZGVsVmFsdWVdPVwiZ3JvdXBBY3RpdmVLZXlcIlxuICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiXG4gICAgICB2LWJpbmQ9XCJjb21wdXRlZEdyb3VwXCJcbiAgICA+XG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoZ3JvdXBJdGVtLCBncm91cEtleSkgb2YgY29tcHV0ZWRHcm91cC5ncm91cHNcIiA6a2V5PVwiZ3JvdXBLZXlcIj5cbiAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgIDppcz1cImNvbXB1dGVkR3JvdXAud3JhcHBlci5jaGlsZFwiXG4gICAgICAgICAgdi1pZj1cImdyb3VwSXRlbVNob3coZ3JvdXBJdGVtKVwiXG4gICAgICAgICAgOlt1aS5jb2xsYXBzZS5rZXlOYW1lXT1cImdyb3VwS2V5XCJcbiAgICAgICAgICB2LWJpbmQ9XCJncm91cEl0ZW1cIlxuICAgICAgICAgIDpjbGFzcz1cInsgJ2ZzLWZvcm0tZ3JvdXAtZXJyb3InOiBlcnJvcnNSZWZbJ2dyb3VwLicgKyBncm91cEtleV0gfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgc2xvdE5hbWUpIG9mIGdyb3VwSXRlbS5zbG90c1wiIDprZXk9XCJzbG90TmFtZVwiICNbc2xvdE5hbWVdPVwic2NvcGVcIj5cbiAgICAgICAgICAgIDxmcy1yZW5kZXIgOnJlbmRlci1mdW5jPVwiaXRlbVwiIDpzY29wZT1cInsgLi4uc2NvcGUsIGhhc0Vycm9yOiBlcnJvcnNSZWZbJ2dyb3VwLicgKyBncm91cEtleV0gfVwiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8IS0tIHJvdyAtLT5cbiAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgY2xhc3M9XCJmcy1yb3dcIiB2LWJpbmQ9XCJyb3dcIj5cbiAgICAgICAgICAgIDwhLS0gY29sIC0tPlxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwia2V5IGluIGdyb3VwSXRlbS5jb2x1bW5zXCIgOmtleT1cImtleVwiPlxuICAgICAgICAgICAgICA8ZnMtZm9ybS1pdGVtLWNvbFxuICAgICAgICAgICAgICAgIHYtaWY9XCJjb21wdXRlZENvbHVtbnNba2V5XVwiXG4gICAgICAgICAgICAgICAgOnJlZj1cIlxuICAgICAgICAgICAgICAgICAgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUl0ZW1SZWZzW2tleV0gPSBlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgOmNvbD1cIm1lcmdlQ29sKGNvbXB1dGVkQ29sdW1uc1trZXldLmNvbClcIlxuICAgICAgICAgICAgICAgIDppdGVtPVwiY29tcHV0ZWRDb2x1bW5zW2tleV1cIlxuICAgICAgICAgICAgICAgIDptb2RlbC12YWx1ZT1cImdldChmb3JtLCBrZXkpXCJcbiAgICAgICAgICAgICAgICA6c2xvdHM9XCJtZXJnZWRTbG90c1snZm9ybV8nICsga2V5XVwiXG4gICAgICAgICAgICAgICAgOmdldC1jb250ZXh0LWZuPVwiZ2V0Q29udGV4dEZuXCJcbiAgICAgICAgICAgICAgICA6aGVscGVyPVwiaGVscGVyXCJcbiAgICAgICAgICAgICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwic2V0KGZvcm0sIGtleSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7XG4gIGNvbXB1dGVkLFxuICBkZWZpbmVDb21wb25lbnQsXG4gIGdldEN1cnJlbnRJbnN0YW5jZSxcbiAgb25Nb3VudGVkLFxuICByZWFjdGl2ZSxcbiAgUmVmLFxuICByZWYsXG4gIHRvUmF3LFxuICB1bnJlZixcbiAgVW53cmFwTmVzdGVkUmVmcyxcbiAgd2F0Y2hcbn0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZWFjaCwgc2V0LCBjbG9uZURlZXAsIGVudHJpZXMsIGdldCwgdW5zZXQsIGZvckVhY2gsIG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgQ29tcHV0ZVZhbHVlLCB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtY29tcHV0ZVwiO1xuaW1wb3J0IGxvZ2dlciBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5sb2dcIjtcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtbWVyZ2VcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgRm9ybVNjb3BlQ29udGV4dCwgU2V0Rm9ybURhdGFPcHRpb25zLCB1c2VVaSwgdXRpbHMgfSBmcm9tIFwiLi4vLi4vaW5kZXhcIjtcblxuLyoqXG4gKiDphY3nva7ljJbnmoTooajljZXnu4Tku7ZcbiAqIOaatOmcsueahOaWueazle+8mlxuICogcmVmLnN1Ym1pdCgpID0g5o+Q5Lqk6KGo5Y2VXG4gKiByZWYucmVzZXQoKSA9IOmHjee9ruihqOWNlVxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRm9ybVwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOWIneWni+ihqOWNleaVsOaNrlxuICAgICAqKi9cbiAgICBpbml0aWFsRm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5a2X5q615qih54mIXG4gICAgICoge1xuICAgICAqICAga2V5OntcbiAgICAgKiAgICAgdGl0bGU6IFwi5a2X5q615ZCN56ewXCIsXG4gICAgICogICAgIGNvbXBvbmVudDp7XG4gICAgICogICAgICAgbmFtZTpcIue7hOS7tuWQjeensFwiXG4gICAgICogICAgICAgLi4u57uE5Lu25Y+C5pWwXG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogKi9cbiAgICBjb2x1bW5zOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWtl+auteWIhue7hFxuICAgICAqIHtcbiAgICAgKiAgIHR5cGU6J3h4eCcsIC8v5YiG57uE5bGV56S657G75Z6LXG4gICAgICogICBncm91cHM6eyAvL+WIhue7hOaVsOaNrlxuICAgICAqICAgICBncm91cEtleTp7IHRpdGxlOid4eHgnLGNvbHVtbnM6WydmaWVsZEtleScsJ2ZpZWxkS2V5J119XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqL1xuICAgIGdyb3VwOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOmHjee9ruihqOWNleWQjueahOaTjeS9nFxuICAgICAqL1xuICAgIGRvUmVzZXQ6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDngrnlh7vkv53lrZjmjInpkq7vvIzooajljZXmoKHpqozliY3miafooYzmk43kvZzvvIhhc3luY++8iVxuICAgICAqL1xuICAgIGJlZm9yZVZhbGlkYXRlOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6KGo5Y2V5qCh6aqM5a6M5a6M5oiQ5ZCO77yM5o+Q5Lqk5YmN5aSE55CG77yIYXN5bmPvvIlcbiAgICAgKi9cbiAgICBiZWZvcmVTdWJtaXQ6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDngrnlh7vkv53lrZjmjInpkq7ml7bmiafooYzmk43kvZzvvIhhc3luY++8iVxuICAgICAqL1xuICAgIGRvU3VibWl0OiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6KGo5Y2V5o+Q5Lqk5ZCO5aSE55CG77yIYXN5bmPvvIlcbiAgICAgKi9cbiAgICBhZnRlclN1Ym1pdDoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaPkuanveWGheWuuVxuICAgICAqL1xuICAgIHNsb3RzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW4g+WxgOaWueW8j+OAkGZsZXh8Z3JpZOOAkVxuICAgICAqL1xuICAgIGRpc3BsYXk6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IFwiZmxleFwiIC8vIGZsZXhcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW6j+WPt++8jOe8lui+keaXtuS8muS8oOWFpVxuICAgICAqL1xuICAgIGluZGV4OiB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaooeW8jyBbYWRkLGVkaXQsdmlldyzoh6rlrprkuYldXG4gICAgICovXG4gICAgbW9kZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBhLXJvd+mFjee9rlxuICAgICAqL1xuICAgIHJvdzoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBlbC1jb2x8YS1jb2zphY3nva7vvIzlj6/phY3nva7ot6jliJdcbiAgICAgKi9cbiAgICBjb2w6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZm9ybUl0ZW3nmoTlhazlhbHphY3nva5cbiAgICAgKi9cbiAgICBmb3JtSXRlbToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBoZWxwZXLkvY3nva7vvJp7cG9zaXRpb246J2xhYmVsJ31cbiAgICAgKi9cbiAgICBoZWxwZXI6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG5cbiAgICB3YXRjaDoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfVxuICB9LFxuICBlbWl0czogW1wicmVzZXRcIiwgXCJzdWJtaXRcIiwgXCJzdWNjZXNzXCIsIFwidmFsaWRhdGlvbkVycm9yXCIsIFwidmFsdWUtY2hhbmdlXCIsIFwiaW5pdFwiXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCB7IEFzeW5jQ29tcHV0ZVZhbHVlLCBkb0NvbXB1dGVkIH0gPSB1c2VDb21wdXRlKCk7XG4gICAgY29uc3QgZm9ybVJlZiA9IHJlZigpO1xuICAgIGNvbnN0IGZvcm06IFVud3JhcE5lc3RlZFJlZnM8YW55PiA9IHJlYWN0aXZlKHt9KTtcbiAgICBjb25zdCB7IHByb3h5IH0gPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcblxuICAgIC8vIHV0aWxzLnRyYWNlKFwiZnMtZm9ybVwiKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2V0dXAtcHJvcHMtZGVzdHJ1Y3R1cmVcbiAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmIChpdGVtLnZhbHVlICE9IG51bGwgJiYgKGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBBc3luY0NvbXB1dGVWYWx1ZSB8fCBpdGVtLnZhbHVlIGluc3RhbmNlb2YgQ29tcHV0ZVZhbHVlKSkge1xuICAgICAgICBsb2dnZXIud2FybihcImZvcm0udmFsdWXphY3nva7kuI3mlK/mjIFDb21wdXRlL0FzeW5jQ29tcHV0Zeexu+Wei+eahOWKqOaAgeiuoeeul1wiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmdW5jdGlvbiBjcmVhdGVJbml0aWFsRm9ybSgpIHtcbiAgICAgIGNvbnN0IGZvcm0gPSB7fTtcbiAgICAgIC8vIOWIneWni+aVsOaNrui1i+WAvFxuICAgICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55LCBrZXk6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBkZWZWYWx1ZSA9IHVucmVmKGl0ZW0udmFsdWUpO1xuICAgICAgICBpZiAoZGVmVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNldChmb3JtLCBrZXksIGRlZlZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBtZXJnZShmb3JtLCBjbG9uZURlZXAocHJvcHMuaW5pdGlhbEZvcm0pKTtcbiAgICAgIHJldHVybiBmb3JtO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxGb3JtID0gY3JlYXRlSW5pdGlhbEZvcm0oKTtcbiAgICBzZXRGb3JtRGF0YShpbml0aWFsRm9ybSk7XG5cbiAgICBjb25zdCBzY29wZTogUmVmPEZvcm1TY29wZUNvbnRleHQ+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcm93OiBpbml0aWFsRm9ybSxcbiAgICAgICAgZm9ybSxcbiAgICAgICAgaW5kZXg6IHByb3BzLmluZGV4LFxuICAgICAgICBtb2RlOiBwcm9wcy5tb2RlIHx8IFwiYWRkXCIsXG4gICAgICAgIGF0dHJzOiBjdHguYXR0cnMsXG4gICAgICAgIGdldENvbXBvbmVudFJlZlxuICAgICAgfSBhcyBGb3JtU2NvcGVDb250ZXh0O1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZ2V0Q29udGV4dEZuKCkge1xuICAgICAgcmV0dXJuIHNjb3BlLnZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkQ29sdW1ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBwcm9wcy5jb2x1bW5zO1xuICAgIH0pO1xuICAgIC8vZm9ybS52YWx1ZUJ1aWxkZXJcblxuICAgIGZ1bmN0aW9uIGRvVmFsdWVCdWlsZGVyKGZvcm06IGFueSkge1xuICAgICAgaWYgKGZvcm0gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGdldChmb3JtLCBrZXkpO1xuICAgICAgICBpZiAoaXRlbS52YWx1ZUJ1aWxkZXIpIHtcbiAgICAgICAgICBjb25zdCByZXM6IGFueSA9IGl0ZW0udmFsdWVCdWlsZGVyKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcm93OiBpbml0aWFsRm9ybSxcbiAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICBpbmRleDogcHJvcHMuaW5kZXgsXG4gICAgICAgICAgICBtb2RlOiBwcm9wcy5tb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlcyAhPSBudWxsICYmICEocmVzIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIHNldChmb3JtLCBrZXksIHJlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRGb3JtRGF0YSgpIHtcbiAgICAgIHJldHVybiBmb3JtO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRGb3JtRGF0YShmb3JtRGF0YTogYW55LCBvcHRpb25zOiBTZXRGb3JtRGF0YU9wdGlvbnMgPSB7fSkge1xuICAgICAgZG9WYWx1ZUJ1aWxkZXIoZm9ybURhdGEpO1xuXG4gICAgICBpZiAob3B0aW9ucy5tZXJnZUZvcm0gPT09IGZhbHNlKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm0pIHtcbiAgICAgICAgICBkZWxldGUgZm9ybVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtZXJnZShmb3JtLCBmb3JtRGF0YSk7XG4gICAgICBjb25zdCB7IHZhbHVlQ2hhbmdlIH0gPSBvcHRpb25zO1xuICAgICAgaWYgKHZhbHVlQ2hhbmdlKSB7XG4gICAgICAgIGZvckVhY2gocHJvcHMuY29sdW1ucywgKGNvbHVtbjogYW55LCBrZXk6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybVtrZXldO1xuICAgICAgICAgIGRvVmFsdWVDaGFuZ2Uoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29sKC4uLmNvbDogYW55KSB7XG4gICAgICByZXR1cm4gbWVyZ2Uoe30sIHByb3BzLmNvbCwgLi4uY29sKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBidWlsZEl0ZW1TY29wZShpdGVtOiBhbnkpOiBGb3JtU2NvcGVDb250ZXh0IHtcbiAgICAgIHJldHVybiB7IGtleTogaXRlbS5rZXksIC4uLnNjb3BlLnZhbHVlIH07XG4gICAgfVxuXG4gICAgLy8gZG9WYWx1ZUJ1aWxkZXIoZm9ybSk7XG5cbiAgICAvLyB3YXRjaChcbiAgICAvLyAgICgpID0+IHByb3BzLmluaXRpYWxGb3JtLFxuICAgIC8vICAgKCkgPT4ge1xuICAgIC8vICAgICBzZXRGb3JtRGF0YShjcmVhdGVJbml0aWFsRm9ybSgpLCB7IG1lcmdlRm9ybTogZmFsc2UgfSk7XG4gICAgLy8gICB9XG4gICAgLy8gKTtcblxuICAgIGZ1bmN0aW9uIGRvVmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0geyBrZXksIHZhbHVlLCBmb3JtUmVmOiBwcm94eSwgLi4uc2NvcGUudmFsdWUsIGltbWVkaWF0ZTogZmFsc2UgfTtcbiAgICAgIGN0eC5lbWl0KFwidmFsdWUtY2hhbmdlXCIsIGV2ZW50KTtcbiAgICAgIGxldCB2YWx1ZUNoYW5nZSA9IHByb3BzLmNvbHVtbnNba2V5XS52YWx1ZUNoYW5nZTtcbiAgICAgIGlmICh2YWx1ZUNoYW5nZSkge1xuICAgICAgICBpZiAodmFsdWVDaGFuZ2UgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgIHZhbHVlQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZUNoYW5nZS5oYW5kbGUpIHtcbiAgICAgICAgICB2YWx1ZUNoYW5nZS5oYW5kbGUoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybUl0ZW1SZWZzOiBSZWYgPSByZWYoe30pO1xuXG4gICAgZnVuY3Rpb24gZ2V0Rm9ybUl0ZW1SZWYoa2V5OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBmb3JtSXRlbVJlZnMudmFsdWVba2V5XS5nZXRGb3JtSXRlbVJlZigpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudFJlZihrZXk6IHN0cmluZywgaXNBc3luYyA9IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZ2V0Rm9ybUl0ZW1SZWYoa2V5KT8uZ2V0Q29tcG9uZW50UmVmKGlzQXN5bmMpO1xuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwQWN0aXZlS2V5ID0gcmVmKFtdKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2V0dXAtcHJvcHMtZGVzdHJ1Y3R1cmVcbiAgICBmb3JFYWNoKHByb3BzLmdyb3VwPy5ncm91cHMsIChncm91cEl0ZW06IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgIGlmIChncm91cEl0ZW0uY29sbGFwc2VkICE9PSB0cnVlKSB7XG4gICAgICAgIGdyb3VwQWN0aXZlS2V5LnZhbHVlLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNldHVwLXByb3BzLWRlc3RydWN0dXJlXG4gICAgaWYgKHByb3BzLmdyb3VwPy5ncm91cFR5cGUgPT09IFwidGFic1wiKSB7XG4gICAgICBncm91cEFjdGl2ZUtleS52YWx1ZSA9IGdyb3VwQWN0aXZlS2V5LnZhbHVlLmxlbmd0aCA+IDAgPyBncm91cEFjdGl2ZUtleS52YWx1ZVswXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy/mnoTlu7rliIbnu4TmlbDmja5cbiAgICBjb25zdCBjb21wdXRlZEdyb3VwID0gZG9Db21wdXRlZChcbiAgICAgICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHByb3BzLmdyb3VwO1xuICAgICAgfSxcbiAgICAgIGdldENvbnRleHRGbixcbiAgICAgIG51bGwsXG4gICAgICAoZ3JvdXAgPSB7fSkgPT4ge1xuICAgICAgICAvL+aJvuWHuuayoeaciea3u+WKoOi/m+WIhue7hOeahOWtl+autVxuICAgICAgICBjb25zdCBncm91cGVkS2V5czogYW55ID0ge307XG4gICAgICAgIGZvckVhY2goZ3JvdXA/Lmdyb3VwcywgKGdyb3VwSXRlbTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGZvckVhY2goZ3JvdXBJdGVtLmNvbHVtbnMsIChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wdXRlZENvbHVtbnMudmFsdWVbaXRlbV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICB1dGlscy5sb2dnZXIud2FybihcIuaXoOaViOeahOWIhue7hOWtl+aute+8mlwiICsgaXRlbSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyb3VwZWRLZXlzW2l0ZW1dID0ga2V5O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0eXBlID0gZ3JvdXAuZ3JvdXBUeXBlO1xuICAgICAgICBsZXQgd3JhcHBlciA9IHtcbiAgICAgICAgICBwYXJlbnQ6IHVpLmNvbGxhcHNlLm5hbWUsXG4gICAgICAgICAgY2hpbGQ6IHVpLmNvbGxhcHNlSXRlbS5uYW1lXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0eXBlID09PSBcInRhYnNcIikge1xuICAgICAgICAgIHdyYXBwZXIucGFyZW50ID0gdWkudGFicy5uYW1lO1xuICAgICAgICAgIHdyYXBwZXIuY2hpbGQgPSB1aS50YWJQYW5lLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdyYXBwZXIsXG4gICAgICAgICAgICBncm91cGVkS2V5c1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZ3JvdXBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgY29tcHV0ZWREZWZhdWx0Q29sdW1ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbnM6IGFueSA9IFtdO1xuICAgICAgLy9kZWZhdWx0IGNvbHVtbnPmjpLluo9cbiAgICAgIGZvckVhY2goY29tcHV0ZWRDb2x1bW5zLnZhbHVlLCAodmFsdWU6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGNsb25lRGVlcChwcm9wcy5mb3JtSXRlbSB8fCB7fSk7XG4gICAgICAgIHZhbHVlID0gbWVyZ2UoaXRlbSwgdmFsdWUpO1xuICAgICAgICB2YWx1ZS5rZXkgPSBrZXk7XG4gICAgICAgIGlmICh2YWx1ZS5vcmRlciA9PSBudWxsKSB7XG4gICAgICAgICAgdmFsdWUub3JkZXIgPSBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wdXRlZEdyb3VwLnZhbHVlPy5ncm91cGVkS2V5cyA9PSBudWxsIHx8IGNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgIGNvbHVtbnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUuY29sID0gbWVyZ2VDb2wodmFsdWUuY29sKTtcbiAgICAgIH0pO1xuICAgICAgLy/mjpLluo9cbiAgICAgIGNvbHVtbnMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZ2V0Rm9ybVJlZigpIHtcbiAgICAgIHJldHVybiBmb3JtUmVmLnZhbHVlO1xuICAgIH1cbiAgICBhc3luYyBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIC8vIHVpLmZvcm0ucmVzZXRXcmFwKGZvcm1SZWYudmFsdWUsIHsgZm9ybSwgaW5pdGlhbEZvcm06IGNyZWF0ZUluaXRpYWxGb3JtKCkgfSk7XG4gICAgICBjb25zdCBpbml0aWFsRm9ybSA9IGNyZWF0ZUluaXRpYWxGb3JtKCk7XG4gICAgICBjb25zdCBlbnRyaWVzUmV0ID0gZW50cmllcyhmb3JtKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllc1JldCkge1xuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBnZXQoaW5pdGlhbEZvcm0sIGVudHJ5WzBdKTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgdW5zZXQoZm9ybSwgZW50cnlbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldChmb3JtLCBlbnRyeVswXSwgaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuZG9SZXNldCkge1xuICAgICAgICBhd2FpdCBwcm9wcy5kb1Jlc2V0KHNjb3BlLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGN0eC5lbWl0KFwicmVzZXRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRSZWY6IFJlZiA9IHJlZigpO1xuICAgIGNvbnN0IGVycm9yc1JlZjogUmVmID0gcmVmKHt9KTtcblxuICAgIGZ1bmN0aW9uIGZpbGxHcm91cEVycm9yKGZpZWxkRXJyb3JzOiBhbnkpIHtcbiAgICAgIGlmICghY29tcHV0ZWRHcm91cC52YWx1ZT8uZ3JvdXBlZEtleXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQga2V5IGluIGZpZWxkRXJyb3JzKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gY29tcHV0ZWRHcm91cC52YWx1ZT8uZ3JvdXBlZEtleXNba2V5XTtcbiAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpIHtcbiAgICAgICAgICBmaWVsZEVycm9yc1tcImdyb3VwLlwiICsgZ3JvdXBdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICAgICAgY29uc3QgdmFsaWRhdGVTY29wZSA9IHsgLi4uc2NvcGUudmFsdWUsIGZvcm0gfTtcbiAgICAgIGlmICh2YWxpZGF0ZVNjb3BlLm1vZGUgPT09IFwidmlld1wiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5iZWZvcmVWYWxpZGF0ZSkge1xuICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBwcm9wcy5iZWZvcmVWYWxpZGF0ZSh2YWxpZGF0ZVNjb3BlKTtcbiAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgZXJyb3JzUmVmLnZhbHVlID0ge307XG4gICAgICAgIGF3YWl0IHVpLmZvcm0udmFsaWRhdGVXcmFwKGZvcm1SZWYudmFsdWUpO1xuICAgICAgICB2YWxpZFJlZi52YWx1ZSA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgdmFsaWRSZWYudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVFcnJvcnMgPSB1aS5mb3JtLnRyYW5zZm9ybVZhbGlkYXRlRXJyb3JzKGUpO1xuICAgICAgICBmaWxsR3JvdXBFcnJvcih2YWxpZGF0ZUVycm9ycyk7XG4gICAgICAgIGVycm9yc1JlZi52YWx1ZSA9IHZhbGlkYXRlRXJyb3JzO1xuICAgICAgICBjdHguZW1pdChcInZhbGlkYXRpb25FcnJvclwiLCBzY29wZS52YWx1ZSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uIHN1Ym1pdCgpIHtcbiAgICAgIGF3YWl0IHZhbGlkYXRlKCk7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IGNsb25lRGVlcCh0b1Jhdyhmb3JtKSk7XG4gICAgICBjb25zdCBzdWJtaXRTY29wZSA9IHsgLi4uc2NvcGUudmFsdWUsIGZvcm06IGZvcm1EYXRhIH07XG4gICAgICBsb2dnZXIuZGVidWcoXCJmb3JtIHN1Ym1pdFwiLCBKU09OLnN0cmluZ2lmeShmb3JtKSk7XG4gICAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGdldChmb3JtRGF0YSwga2V5KTtcbiAgICAgICAgaWYgKGl0ZW0udmFsdWVSZXNvbHZlKSB7XG4gICAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBpdGVtLnZhbHVlUmVzb2x2ZSh7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIC4uLnN1Ym1pdFNjb3BlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlcyAhPSBudWxsICYmICEocmVzIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgc2V0KGZvcm1EYXRhLCBrZXksIHJlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHByb3BzLmJlZm9yZVN1Ym1pdCkge1xuICAgICAgICBjb25zdCByZXQgPSBhd2FpdCBwcm9wcy5iZWZvcmVTdWJtaXQoc3VibWl0U2NvcGUpO1xuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvL+enu+mZpOS4jeWFgeiuuOaPkOS6pOeahOWtl+autVxuICAgICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoaXRlbS5zdWJtaXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgdW5zZXQoZm9ybURhdGEsIGtleSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS5zdWJtaXQgPT09IHRydWUpIHtcbiAgICAgICAgICAvL+iuvue9ruW8uuWItuaPkOS6pOeahOWtl+autVxuICAgICAgICAgIHNldChmb3JtRGF0YSwga2V5LCBmb3JtRGF0YVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChwcm9wcy5kb1N1Ym1pdCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBwcm9wcy5kb1N1Ym1pdChzdWJtaXRTY29wZSk7XG4gICAgICAgIHN1Ym1pdFNjb3BlLnJlcyA9IHJlcztcbiAgICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN0eC5lbWl0KFwic3VibWl0XCIsIHN1Ym1pdFNjb3BlKTtcbiAgICAgIGlmIChwcm9wcy5hZnRlclN1Ym1pdCkge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgcHJvcHMuYWZ0ZXJTdWJtaXQoc3VibWl0U2NvcGUpO1xuICAgICAgICBpZiAoc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN0eC5lbWl0KFwic3VjY2Vzc1wiLCBzdWJtaXRTY29wZSk7XG5cbiAgICAgIHJldHVybiBzdWJtaXRTY29wZTtcbiAgICB9XG5cbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgLy8gaW1tZWRpYXRlIHZhbHVlQ2hhbmdl6Kem5Y+RXG4gICAgICBmb3JFYWNoKGNvbXB1dGVkQ29sdW1ucy52YWx1ZSwgKGl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udmFsdWVDaGFuZ2UgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsdWVDaGFuZ2UgPSBpdGVtLnZhbHVlQ2hhbmdlO1xuICAgICAgICBpZiAodmFsdWVDaGFuZ2UgJiYgdmFsdWVDaGFuZ2UuaW1tZWRpYXRlID09PSB0cnVlICYmIHZhbHVlQ2hhbmdlLmhhbmRsZSkge1xuICAgICAgICAgIGNvbnN0IGV2ZW50ID0geyBrZXksIHZhbHVlOiBmb3JtW2tleV0sIGZvcm1SZWY6IHByb3h5LCAuLi5zY29wZS52YWx1ZSwgaW1tZWRpYXRlOiB0cnVlIH07XG4gICAgICAgICAgaWYgKHZhbHVlQ2hhbmdlLmhhbmRsZSkge1xuICAgICAgICAgICAgdmFsdWVDaGFuZ2UuaGFuZGxlKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZm9ybUl0ZW1TaG93KGl0ZW06IGFueSkge1xuICAgICAgaWYgKGl0ZW0gJiYgdW5yZWYoaXRlbS5zaG93KSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdyb3VwSXRlbVNob3coZ3JvdXBJdGVtOiBhbnkpIHtcbiAgICAgIGlmICghZ3JvdXBJdGVtLmNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHVucmVmKGdyb3VwSXRlbS5zaG93KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBrZXkgb2YgZ3JvdXBJdGVtLmNvbHVtbnMpIHtcbiAgICAgICAgaWYgKGNvbXB1dGVkQ29sdW1ucy52YWx1ZVtrZXldID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0ZpZWxkU2hvdyA9IGZvcm1JdGVtU2hvdyhjb21wdXRlZENvbHVtbnMudmFsdWVba2V5XSk7XG4gICAgICAgIGlmIChpc0ZpZWxkU2hvdykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLndhdGNoKSB7XG4gICAgICB3YXRjaChcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBmb3JtO1xuICAgICAgICB9LFxuICAgICAgICAobmV3VmFsLCBvbGRWYWwpID0+IHtcbiAgICAgICAgICBpZiAocHJvcHMud2F0Y2gpIHtcbiAgICAgICAgICAgIHByb3BzLndhdGNoKHNjb3BlLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGlydHkoKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSBKU09OLnN0cmluZ2lmeShpbml0aWFsRm9ybSk7XG4gICAgICBjb25zdCBhZnRlciA9IEpTT04uc3RyaW5naWZ5KGZvcm0pO1xuICAgICAgcmV0dXJuIGJlZm9yZSAhPT0gYWZ0ZXI7XG4gICAgfVxuXG4gICAgY29uc3QgbWVyZ2VkU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gbWVyZ2Uoe30sIHByb3BzLnNsb3RzLCBjdHguc2xvdHMpO1xuICAgIH0pO1xuXG4gICAgY3R4LmVtaXQoXCJpbml0XCIsIHNjb3BlLnZhbHVlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBnZXQ6IChmb3JtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXQoZm9ybSwga2V5KTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IChmb3JtOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIHNldChmb3JtLCBrZXksIHZhbHVlKTtcbiAgICAgICAgZG9WYWx1ZUNoYW5nZShrZXksIHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICB1aSxcbiAgICAgIHZhbGlkUmVmLFxuICAgICAgZXJyb3JzUmVmLFxuICAgICAgZm9ybVJlZixcbiAgICAgIGNvbXB1dGVkQ29sdW1ucyxcbiAgICAgIGNvbXB1dGVkRGVmYXVsdENvbHVtbnMsXG4gICAgICBzdWJtaXQsXG4gICAgICByZXNldCxcbiAgICAgIGdldEZvcm1SZWYsXG4gICAgICBzY29wZSxcbiAgICAgIGJ1aWxkSXRlbVNjb3BlLFxuICAgICAgZ3JvdXBBY3RpdmVLZXksXG4gICAgICBmb3JtLFxuICAgICAgZm9ybUl0ZW1SZWZzLFxuICAgICAgZ2V0Rm9ybURhdGEsXG4gICAgICBzZXRGb3JtRGF0YSxcbiAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgIG1lcmdlQ29sLFxuICAgICAgdmFsaWRhdGUsXG4gICAgICBjb21wdXRlZEdyb3VwLFxuICAgICAgZ2V0Q29udGV4dEZuLFxuICAgICAgZm9ybUl0ZW1TaG93LFxuICAgICAgZ3JvdXBJdGVtU2hvdyxcbiAgICAgIGlzRGlydHksXG4gICAgICBtZXJnZWRTbG90c1xuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWZvcm0ge1xuICAuZWwtY29sbGFwc2UtaXRlbV9fY29udGVudCB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDMwcHg7XG4gICAgcGFkZGluZy1yaWdodDogMzBweDtcbiAgfVxuXG4gIC5mcy1mb3JtLWludmFsaWQge1xuICB9XG5cbiAgLmZzLWZvcm0taXRlbS1jb21wb25lbnQge1xuICAgIC5hbnQtcGlja2VyLFxuICAgIC5hbnQtaW5wdXQtYWZmaXgtd3JhcHBlcixcbiAgICAuYW50LWlucHV0LW51bWJlcixcbiAgICAuZWwtY2FzY2FkZXIsXG4gICAgLmVsLWRhdGUtZWRpdG9yLFxuICAgIC5lbC1pbnB1dC1udW1iZXIsXG4gICAgLmVsLWlucHV0LFxuICAgID4gLmVsLXNlbGVjdCxcbiAgICA+IC5uLXNlbGVjdCxcbiAgICAubi1kYXRlLXBpY2tlcixcbiAgICAubi1pbnB1dC1udW1iZXIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmVsLWRhdGUtZWRpdG9yIC5lbC1yYW5nZV9faWNvbiB7XG4gICAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICB9XG4gICAgLmVsLWRhdGUtZWRpdG9yIC5lbC1yYW5nZV9fY2xvc2UtaWNvbiB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgfVxuXG4gICAgLmVsLXJhbmdlLWVkaXRvci5lbC1pbnB1dF9fd3JhcHBlciB7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgIH1cbiAgfVxuXG4gIC8vLmVsLWRhdGUtZWRpdG9yLmVsLWlucHV0X193cmFwcGVyIHtcbiAgLy8gIHdpZHRoOiAxMDAlO1xuICAvL31cbn1cblxuLmZzLWZvcm0tZ3JpZCB7XG4gIC5mcy1yb3cge1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA1MCUgNTAlO1xuICAgIC8vIGdhcDogMCAyMHB4OyAvL+WIl+mXtOi3nSAyMHB4XG4gICAgLmZzLWNvbCB7XG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAvLyBhbnRkdlxuICAgIC5hbnQtZm9ybS1pdGVtLWxhYmVsIHtcbiAgICAgIHdpZHRoOiAxMDBweDtcbiAgICAgIGZsZXg6IG5vbmU7XG4gICAgICBtYXgtd2lkdGg6IG5vbmU7XG4gICAgfVxuICAgIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wtd3JhcHBlciB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgbWF4LXdpZHRoOiBub25lO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVsZW1lbnRcbiAgLmVsLXJvdzo6YWZ0ZXIsXG4gIC5lbC1yb3c6OmJlZm9yZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuLmZzLWZvcm0tZmxleCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIC5mcy1yb3cge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAuZnMtZm9ybS1mbGV4IHtcbiAgICAuZnMtcm93IHtcbiAgICAgIC5mcy1jb2wge1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBmbGV4OiAwIDAgMTAwJTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gIC5mcy1mb3JtLWZsZXgge1xuICAgIC5mcy1yb3cge1xuICAgICAgLmZzLWNvbCB7XG4gICAgICAgIC8vLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgICAgICAvLyAgZmxleDogbm9uZTtcbiAgICAgICAgLy99XG4gICAgICAgIC8vLmFudC1mb3JtLWl0ZW0gLmFudC1mb3JtLWl0ZW0tY29udHJvbCB7XG4gICAgICAgIC8vICBmbGV4OiAxO1xuICAgICAgICAvLyAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICAvL31cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnRcbiAgICA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCJcbiAgICB2LWlmPVwiY29tcHV0ZWRJdGVtXCJcbiAgICBjbGFzcz1cImZzLWZvcm0taXRlbVwiXG4gICAgOlt1aS5mb3JtSXRlbS5wcm9wXT1cImNvbXB1dGVkS2V5XCJcbiAgICB2LWJpbmQ9XCJjb21wdXRlZEl0ZW1cIlxuICAgIDpwYXRoPVwiY29tcHV0ZWRJdGVtLmtleVwiXG4gICAgOnJ1bGUtcGF0aD1cImNvbXB1dGVkSXRlbS5rZXlcIlxuICA+XG4gICAgPHRlbXBsYXRlICNsYWJlbD5cbiAgICAgIDxzcGFuIHYtaWY9XCJjb21wdXRlZExhYmVsSXNSZW5kZXJcIiBjbGFzcz1cImZzLWZvcm0taXRlbS1sYWJlbC10ZXh0XCI+XG4gICAgICAgIDxmcy1yZW5kZXIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRMYWJlbFJlbmRlclwiPjwvZnMtcmVuZGVyPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gdi1lbHNlIGNsYXNzPVwiZnMtZm9ybS1pdGVtLWxhYmVsLXRleHRcIiA6dGl0bGU9XCJjb21wdXRlZExhYmVsXCI+XG4gICAgICAgIHt7IGNvbXB1dGVkTGFiZWwgfX1cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPGNvbXBvbmVudFxuICAgICAgICA6aXM9XCJ1aS50b29sdGlwLm5hbWVcIlxuICAgICAgICB2LWlmPVwiY29tcHV0ZWRJdGVtLmhlbHBlciAmJiBjb21wdXRlZEhlbHBlclBvc2l0aW9uID09PSAnbGFiZWwnXCJcbiAgICAgICAgdi1iaW5kPVwiY29tcHV0ZWRIZWxwZXJUb29sdGlwXCJcbiAgICAgID5cbiAgICAgICAgPHRlbXBsYXRlICNbdWkudG9vbHRpcC5jb250ZW50XT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLWZvcm0taGVscGVyLXRvb2x0aXBcIj5cbiAgICAgICAgICAgIDxmcy1mb3JtLWhlbHBlciA6aGVscGVyPVwiY29tcHV0ZWRJdGVtLmhlbHBlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnRvb2x0aXAudHJpZ2dlcl0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtaWNvblwiPlxuICAgICAgICAgICAgPGZzLWljb24gY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtaWNvbi1pbm5lclwiIDppY29uPVwidWkuaWNvbnMucXVlc3Rpb25cIj48L2ZzLWljb24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1pdGVtLWNvbnRlbnRcIj5cbiAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS50b3BSZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0udG9wUmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWZvcm0taXRlbS1yZW5kZXJcIj5cbiAgICAgICAgPGZzLXJlbmRlciB2LWlmPVwiY29tcHV0ZWRJdGVtLnByZWZpeFJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5wcmVmaXhSZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tY29tcG9uZW50XCI+XG4gICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIHYtaWY9XCJmb3JtU2xvdFwiIDpzbG90cz1cImZvcm1TbG90XCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJjb21wdXRlZEl0ZW0uY29tcG9uZW50Py5zaG93ICE9PSBmYWxzZVwiPlxuICAgICAgICAgICAgPGZzLXJlbmRlclxuICAgICAgICAgICAgICB2LWlmPVwiXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJdGVtLmNvbmRpdGlvbmFsUmVuZGVyICYmXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJdGVtLmNvbmRpdGlvbmFsUmVuZGVyLm1hdGNoICYmXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJdGVtLmNvbmRpdGlvbmFsUmVuZGVyLm1hdGNoKHNjb3BlRnVuYygpKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIucmVuZGVyXCJcbiAgICAgICAgICAgICAgOnNjb3BlPVwic2NvcGVGdW5jKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxmcy1yZW5kZXIgdi1lbHNlLWlmPVwiY29tcHV0ZWRJdGVtLnJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICAgICAgICA8ZnMtY29tcG9uZW50LXJlbmRlclxuICAgICAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICAgICAgcmVmPVwiY29tcG9uZW50UmVuZGVyUmVmXCJcbiAgICAgICAgICAgICAgdi1iaW5kPVwiY29tcHV0ZWRJdGVtLmNvbXBvbmVudFwiXG4gICAgICAgICAgICAgIDptb2RlbC12YWx1ZT1cIm1vZGVsVmFsdWVcIlxuICAgICAgICAgICAgICA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiXG4gICAgICAgICAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJ1cGRhdGVNb2RlbFZhbHVlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS5zdWZmaXhSZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0uc3VmZml4UmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJjb21wdXRlZEl0ZW0uYm90dG9tUmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLmJvdHRvbVJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiY29tcHV0ZWRJdGVtLmhlbHBlciAmJiBjb21wdXRlZEhlbHBlclBvc2l0aW9uICE9PSAnbGFiZWwnXCI+XG4gICAgICAgIDxmcy1mb3JtLWhlbHBlciA6aGVscGVyPVwiY29tcHV0ZWRJdGVtLmhlbHBlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIFJlZiwgUHJvcFR5cGUgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgRnNSZW5kZXIgZnJvbSBcIi4uL3JlbmRlci9mcy1yZW5kZXIuanNcIjtcbmltcG9ydCB7IHVzZU1lcmdlLCB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbi8qKlxuICogZm9ybS1pdGVt57uE5Lu25bCB6KOFXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNGb3JtSXRlbVwiLFxuICBjb21wb25lbnRzOiB7IEZzUmVuZGVyIH0sXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog6KGo5Y2V5a2X5q615YC8KHYtbW9kZWwpXG4gICAgICovXG4gICAgbW9kZWxWYWx1ZToge30sXG4gICAgLyoqXG4gICAgICog5a2X5q616YWN572uXG4gICAgICovXG4gICAgaXRlbToge1xuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPGFueT4sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWtl+autee7hOS7tuaPkuanvVxuICAgICAqL1xuICAgIGZvcm1TbG90OiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgZ2V0Q29udGV4dEZuOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgaGVscGVyOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3RdXG4gICAgfVxuICB9LFxuICBlbWl0czogW1widXBkYXRlOm1vZGVsVmFsdWVcIl0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgY29tcG9uZW50UmVuZGVyUmVmID0gcmVmKCk7XG4gICAgLy8gdXRpbHMudHJhY2UoXCJmcy1mb3JtLWl0ZW1cIik7XG4gICAgLy8gY29uc3Qgc2NvcGVDb21wdXRlZDogUmVmPFNjb3BlQ29udGV4dD4gPSBjb21wdXRlZCgoKSA9PiB7fSk7XG5cbiAgICBjb25zdCBzY29wZUZ1bmMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IHByb3BzLmdldENvbnRleHRGbiA/IHByb3BzLmdldENvbnRleHRGbigpIDoge307XG4gICAgICByZXR1cm4geyB2YWx1ZTogcHJvcHMubW9kZWxWYWx1ZSwga2V5OiBwcm9wcy5pdGVtLmtleSwgLi4uc2NvcGUgfTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdXBkYXRlTW9kZWxWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICBjdHguZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGlzQXN5bmMgPSBmYWxzZSkge1xuICAgICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZi52YWx1ZT8uZ2V0VGFyZ2V0UmVmQXN5bmMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21wb25lbnRSZW5kZXJSZWYudmFsdWU/LmdldFRhcmdldFJlZigpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkSXRlbSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgLi4ucHJvcHMuaXRlbVxuICAgICAgfTtcbiAgICAgIGRlbGV0ZSByZXMudGl0bGU7XG4gICAgICBkZWxldGUgcmVzLmxhYmVsO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkSGVscGVyUG9zaXRpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuaXRlbT8uaGVscGVyPy5wb3NpdGlvbiB8fCAocHJvcHMuaGVscGVyIGFzIGFueSk/LnBvc2l0aW9uO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXB1dGVkSGVscGVyVG9vbHRpcCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuaXRlbS5oZWxwZXI/LnRvb2x0aXAsIChwcm9wcy5oZWxwZXIgYXMgYW55KT8udG9vbHRpcCk7XG4gICAgfSk7XG4gICAgY29uc3QgY29tcHV0ZWRLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuaXRlbSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5pdGVtLmtleS5pbmRleE9mKFwiLlwiKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBwcm9wcy5pdGVtLmtleS5zcGxpdChcIi5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMuaXRlbS5rZXk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZExhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLml0ZW0ubGFiZWwgfHwgcHJvcHMuaXRlbS50aXRsZTtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlZExhYmVsSXNSZW5kZXIgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gY29tcHV0ZWRMYWJlbC52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcHV0ZWRMYWJlbFJlbmRlciA9ICgpID0+IHtcbiAgICAgIHJldHVybiBjb21wdXRlZExhYmVsLnZhbHVlKHNjb3BlRnVuYygpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgdXBkYXRlTW9kZWxWYWx1ZSxcbiAgICAgIHNjb3BlRnVuYyxcbiAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgIGNvbXBvbmVudFJlbmRlclJlZixcbiAgICAgIGNvbXB1dGVkSGVscGVyUG9zaXRpb24sXG4gICAgICBjb21wdXRlZEhlbHBlclRvb2x0aXAsXG4gICAgICBjb21wdXRlZEtleSxcbiAgICAgIGNvbXB1dGVkTGFiZWxJc1JlbmRlcixcbiAgICAgIGNvbXB1dGVkTGFiZWwsXG4gICAgICBjb21wdXRlZExhYmVsUmVuZGVyLFxuICAgICAgY29tcHV0ZWRJdGVtXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtZm9ybS1pdGVtIHtcbiAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgIC8vbGluZS1oZWlnaHQ6IDE7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC10ZXh0IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG4gIH1cbiAgLmVsLWZvcm0taXRlbSB7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC1pY29uIHtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgIH1cbiAgfVxuICAuZnMtZm9ybS1pdGVtLWxhYmVsLWljb24ge1xuICAgIG1hcmdpbjogMCAycHg7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC1pY29uLWlubmVyIHtcbiAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgIH1cbiAgfVxuICAuZnMtZm9ybS1pdGVtLWNvbnRlbnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBmbGV4OiAxO1xuICAgIC5mcy1mb3JtLWl0ZW0tcmVuZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgICAgLmZzLWZvcm0taXRlbS1jb21wb25lbnQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4uZnMtZm9ybS1oZWxwZXItdG9vbHRpcCB7XG4gIC5mcy1mb3JtLWhlbHBlciB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnRcbiAgICA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCJcbiAgICB2LWlmPVwiY29tcHV0ZWRJdGVtXCJcbiAgICBjbGFzcz1cImZzLWZvcm0taXRlbVwiXG4gICAgOlt1aS5mb3JtSXRlbS5wcm9wXT1cImNvbXB1dGVkS2V5XCJcbiAgICB2LWJpbmQ9XCJjb21wdXRlZEl0ZW1cIlxuICAgIDpwYXRoPVwiY29tcHV0ZWRJdGVtLmtleVwiXG4gICAgOnJ1bGUtcGF0aD1cImNvbXB1dGVkSXRlbS5rZXlcIlxuICA+XG4gICAgPHRlbXBsYXRlICNsYWJlbD5cbiAgICAgIDxzcGFuIHYtaWY9XCJjb21wdXRlZExhYmVsSXNSZW5kZXJcIiBjbGFzcz1cImZzLWZvcm0taXRlbS1sYWJlbC10ZXh0XCI+XG4gICAgICAgIDxmcy1yZW5kZXIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRMYWJlbFJlbmRlclwiPjwvZnMtcmVuZGVyPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gdi1lbHNlIGNsYXNzPVwiZnMtZm9ybS1pdGVtLWxhYmVsLXRleHRcIiA6dGl0bGU9XCJjb21wdXRlZExhYmVsXCI+XG4gICAgICAgIHt7IGNvbXB1dGVkTGFiZWwgfX1cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPGNvbXBvbmVudFxuICAgICAgICA6aXM9XCJ1aS50b29sdGlwLm5hbWVcIlxuICAgICAgICB2LWlmPVwiY29tcHV0ZWRJdGVtLmhlbHBlciAmJiBjb21wdXRlZEhlbHBlclBvc2l0aW9uID09PSAnbGFiZWwnXCJcbiAgICAgICAgdi1iaW5kPVwiY29tcHV0ZWRIZWxwZXJUb29sdGlwXCJcbiAgICAgID5cbiAgICAgICAgPHRlbXBsYXRlICNbdWkudG9vbHRpcC5jb250ZW50XT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLWZvcm0taGVscGVyLXRvb2x0aXBcIj5cbiAgICAgICAgICAgIDxmcy1mb3JtLWhlbHBlciA6aGVscGVyPVwiY29tcHV0ZWRJdGVtLmhlbHBlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnRvb2x0aXAudHJpZ2dlcl0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtaWNvblwiPlxuICAgICAgICAgICAgPGZzLWljb24gY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtaWNvbi1pbm5lclwiIDppY29uPVwidWkuaWNvbnMucXVlc3Rpb25cIj48L2ZzLWljb24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1pdGVtLWNvbnRlbnRcIj5cbiAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS50b3BSZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0udG9wUmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWZvcm0taXRlbS1yZW5kZXJcIj5cbiAgICAgICAgPGZzLXJlbmRlciB2LWlmPVwiY29tcHV0ZWRJdGVtLnByZWZpeFJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5wcmVmaXhSZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tY29tcG9uZW50XCI+XG4gICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIHYtaWY9XCJmb3JtU2xvdFwiIDpzbG90cz1cImZvcm1TbG90XCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJjb21wdXRlZEl0ZW0uY29tcG9uZW50Py5zaG93ICE9PSBmYWxzZVwiPlxuICAgICAgICAgICAgPGZzLXJlbmRlclxuICAgICAgICAgICAgICB2LWlmPVwiXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJdGVtLmNvbmRpdGlvbmFsUmVuZGVyICYmXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJdGVtLmNvbmRpdGlvbmFsUmVuZGVyLm1hdGNoICYmXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJdGVtLmNvbmRpdGlvbmFsUmVuZGVyLm1hdGNoKHNjb3BlRnVuYygpKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIucmVuZGVyXCJcbiAgICAgICAgICAgICAgOnNjb3BlPVwic2NvcGVGdW5jKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxmcy1yZW5kZXIgdi1lbHNlLWlmPVwiY29tcHV0ZWRJdGVtLnJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICAgICAgICA8ZnMtY29tcG9uZW50LXJlbmRlclxuICAgICAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICAgICAgcmVmPVwiY29tcG9uZW50UmVuZGVyUmVmXCJcbiAgICAgICAgICAgICAgdi1iaW5kPVwiY29tcHV0ZWRJdGVtLmNvbXBvbmVudFwiXG4gICAgICAgICAgICAgIDptb2RlbC12YWx1ZT1cIm1vZGVsVmFsdWVcIlxuICAgICAgICAgICAgICA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiXG4gICAgICAgICAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJ1cGRhdGVNb2RlbFZhbHVlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS5zdWZmaXhSZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0uc3VmZml4UmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJjb21wdXRlZEl0ZW0uYm90dG9tUmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLmJvdHRvbVJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiY29tcHV0ZWRJdGVtLmhlbHBlciAmJiBjb21wdXRlZEhlbHBlclBvc2l0aW9uICE9PSAnbGFiZWwnXCI+XG4gICAgICAgIDxmcy1mb3JtLWhlbHBlciA6aGVscGVyPVwiY29tcHV0ZWRJdGVtLmhlbHBlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIFJlZiwgUHJvcFR5cGUgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgRnNSZW5kZXIgZnJvbSBcIi4uL3JlbmRlci9mcy1yZW5kZXIuanNcIjtcbmltcG9ydCB7IHVzZU1lcmdlLCB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbi8qKlxuICogZm9ybS1pdGVt57uE5Lu25bCB6KOFXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNGb3JtSXRlbVwiLFxuICBjb21wb25lbnRzOiB7IEZzUmVuZGVyIH0sXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog6KGo5Y2V5a2X5q615YC8KHYtbW9kZWwpXG4gICAgICovXG4gICAgbW9kZWxWYWx1ZToge30sXG4gICAgLyoqXG4gICAgICog5a2X5q616YWN572uXG4gICAgICovXG4gICAgaXRlbToge1xuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPGFueT4sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWtl+autee7hOS7tuaPkuanvVxuICAgICAqL1xuICAgIGZvcm1TbG90OiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgZ2V0Q29udGV4dEZuOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgaGVscGVyOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3RdXG4gICAgfVxuICB9LFxuICBlbWl0czogW1widXBkYXRlOm1vZGVsVmFsdWVcIl0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgY29tcG9uZW50UmVuZGVyUmVmID0gcmVmKCk7XG4gICAgLy8gdXRpbHMudHJhY2UoXCJmcy1mb3JtLWl0ZW1cIik7XG4gICAgLy8gY29uc3Qgc2NvcGVDb21wdXRlZDogUmVmPFNjb3BlQ29udGV4dD4gPSBjb21wdXRlZCgoKSA9PiB7fSk7XG5cbiAgICBjb25zdCBzY29wZUZ1bmMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IHByb3BzLmdldENvbnRleHRGbiA/IHByb3BzLmdldENvbnRleHRGbigpIDoge307XG4gICAgICByZXR1cm4geyB2YWx1ZTogcHJvcHMubW9kZWxWYWx1ZSwga2V5OiBwcm9wcy5pdGVtLmtleSwgLi4uc2NvcGUgfTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdXBkYXRlTW9kZWxWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICBjdHguZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGlzQXN5bmMgPSBmYWxzZSkge1xuICAgICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZi52YWx1ZT8uZ2V0VGFyZ2V0UmVmQXN5bmMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21wb25lbnRSZW5kZXJSZWYudmFsdWU/LmdldFRhcmdldFJlZigpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkSXRlbSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgLi4ucHJvcHMuaXRlbVxuICAgICAgfTtcbiAgICAgIGRlbGV0ZSByZXMudGl0bGU7XG4gICAgICBkZWxldGUgcmVzLmxhYmVsO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkSGVscGVyUG9zaXRpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuaXRlbT8uaGVscGVyPy5wb3NpdGlvbiB8fCAocHJvcHMuaGVscGVyIGFzIGFueSk/LnBvc2l0aW9uO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXB1dGVkSGVscGVyVG9vbHRpcCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuaXRlbS5oZWxwZXI/LnRvb2x0aXAsIChwcm9wcy5oZWxwZXIgYXMgYW55KT8udG9vbHRpcCk7XG4gICAgfSk7XG4gICAgY29uc3QgY29tcHV0ZWRLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuaXRlbSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5pdGVtLmtleS5pbmRleE9mKFwiLlwiKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBwcm9wcy5pdGVtLmtleS5zcGxpdChcIi5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMuaXRlbS5rZXk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZExhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLml0ZW0ubGFiZWwgfHwgcHJvcHMuaXRlbS50aXRsZTtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlZExhYmVsSXNSZW5kZXIgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gY29tcHV0ZWRMYWJlbC52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcHV0ZWRMYWJlbFJlbmRlciA9ICgpID0+IHtcbiAgICAgIHJldHVybiBjb21wdXRlZExhYmVsLnZhbHVlKHNjb3BlRnVuYygpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgdXBkYXRlTW9kZWxWYWx1ZSxcbiAgICAgIHNjb3BlRnVuYyxcbiAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgIGNvbXBvbmVudFJlbmRlclJlZixcbiAgICAgIGNvbXB1dGVkSGVscGVyUG9zaXRpb24sXG4gICAgICBjb21wdXRlZEhlbHBlclRvb2x0aXAsXG4gICAgICBjb21wdXRlZEtleSxcbiAgICAgIGNvbXB1dGVkTGFiZWxJc1JlbmRlcixcbiAgICAgIGNvbXB1dGVkTGFiZWwsXG4gICAgICBjb21wdXRlZExhYmVsUmVuZGVyLFxuICAgICAgY29tcHV0ZWRJdGVtXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtZm9ybS1pdGVtIHtcbiAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgIC8vbGluZS1oZWlnaHQ6IDE7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC10ZXh0IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG4gIH1cbiAgLmVsLWZvcm0taXRlbSB7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC1pY29uIHtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgIH1cbiAgfVxuICAuZnMtZm9ybS1pdGVtLWxhYmVsLWljb24ge1xuICAgIG1hcmdpbjogMCAycHg7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC1pY29uLWlubmVyIHtcbiAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgIH1cbiAgfVxuICAuZnMtZm9ybS1pdGVtLWNvbnRlbnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBmbGV4OiAxO1xuICAgIC5mcy1mb3JtLWl0ZW0tcmVuZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgICAgLmZzLWZvcm0taXRlbS1jb21wb25lbnQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4uZnMtZm9ybS1oZWxwZXItdG9vbHRpcCB7XG4gIC5mcy1mb3JtLWhlbHBlciB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnRcbiAgICA6aXM9XCJ1aS5jb2wubmFtZVwiXG4gICAgdi1pZj1cImNvbXB1dGVkSXRlbSAmJiBjb21wdXRlZEl0ZW0uc2hvdyAhPT0gZmFsc2VcIlxuICAgIGNsYXNzPVwiZnMtY29sXCJcbiAgICB2LWJpbmQ9XCJtZXJnZShjb2wsIGNvbXB1dGVkSXRlbT8uY29sKVwiXG4gID5cbiAgICA8ZnMtZm9ybS1pdGVtXG4gICAgICB2LWlmPVwiY29tcHV0ZWRJdGVtICYmIGNvbXB1dGVkSXRlbT8uYmxhbmsgIT09IHRydWVcIlxuICAgICAgcmVmPVwiZm9ybUl0ZW1SZWZcIlxuICAgICAgOml0ZW09XCJjb21wdXRlZEl0ZW1cIlxuICAgICAgOmZvcm0tc2xvdD1cInNsb3RzXCJcbiAgICAgIDpnZXQtY29udGV4dC1mbj1cImdldENvbnRleHRGblwiXG4gICAgICA6aGVscGVyPVwiaGVscGVyXCJcbiAgICAgIHYtYmluZD1cImF0dHJzXCJcbiAgICAvPlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxuaW1wb3J0IHsgdXNlQXR0cnMsIGRlZmluZVByb3BzLCBQcm9wVHlwZSwgcmVmLCBwcm92aWRlIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtbWVyZ2VcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIkBmYXN0LWNydWQvdWktaW50ZXJmYWNlXCI7XG5jb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gIC8qKlxuICAgKiDlrZfmrrXphY3nva5cbiAgICovXG4gIGl0ZW06IHtcbiAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8YW55PixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgfSxcbiAgLyoqXG4gICAqIOWtl+autee7hOS7tuaPkuanvVxuICAgKi9cbiAgc2xvdHM6IHtcbiAgICB0eXBlOiBGdW5jdGlvbixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgfSxcbiAgZ2V0Q29udGV4dEZuOiB7XG4gICAgdHlwZTogRnVuY3Rpb24sXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gIH0sXG4gIGNvbDoge1xuICAgIHR5cGU6IE9iamVjdCxcbiAgICBkZWZhdWx0OiAoKSA9PiB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9LFxuICBoZWxwZXI6IHtcbiAgICB0eXBlOiBbU3RyaW5nLCBPYmplY3RdLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICB9XG59KTtcbmNvbnN0IHsgZG9Db21wdXRlZCB9ID0gdXNlQ29tcHV0ZSgpO1xuXG5jb25zdCBjb21wdXRlZEl0ZW0gPSBkb0NvbXB1dGVkKFxuICAoKSA9PiB7XG4gICAgcmV0dXJuIHByb3BzLml0ZW07XG4gIH0sXG4gICgpID0+IHtcbiAgICByZXR1cm4gcHJvcHMuZ2V0Q29udGV4dEZuKCk7XG4gIH1cbik7XG5cbmNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG5cbmNvbnN0IGF0dHJzID0gdXNlQXR0cnMoKTtcbmNvbnN0IGZvcm1JdGVtUmVmID0gcmVmKCk7XG5mdW5jdGlvbiBnZXRGb3JtSXRlbVJlZigpIHtcbiAgcmV0dXJuIGZvcm1JdGVtUmVmLnZhbHVlO1xufVxuXG5kZWZpbmVFeHBvc2Uoe1xuICBnZXRGb3JtSXRlbVJlZlxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtZm9ybS1pdGVtLWNvbCB7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1oZWxwZXJcIj5cbiAgICA8cHJlIHYtaWY9XCJ0eXBlb2YgaGVscGVyID09PSAnc3RyaW5nJ1wiPnt7IGhlbHBlciB9fTwvcHJlPlxuICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJoZWxwZXIucmVuZGVyXCI+XG4gICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cImhlbHBlci5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZVwiIC8+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8cHJlIHYtZWxzZS1pZj1cImhlbHBlci50ZXh0XCI+e3sgaGVscGVyLnRleHQgfX08L3ByZT5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB1dGlscyBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcblxuLyoqXG4gKiDooajljZXlrZfmrrXluK7liqnor7TmmI7nu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0Zvcm1IZWxwZXJcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDluK7liqnor7TmmI4sIHRleHQ6IOivtOaYjuaWh+WtlywgcmVuZGVyOiBmdW5jdGlvbihzY29wZSkg6Ieq5a6a5LmJ5riy5p+TXG4gICAgICovXG4gICAgaGVscGVyOiB7XG4gICAgICB0eXBlOiBbXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0ZXh0OiDor7TmmI7mloflrZcsXG4gICAgICAgICAqIHJlbmRlcjogZnVuY3Rpb24gLCDoh6rlrprkuYlyZW5kZXJcbiAgICAgICAgICovXG4gICAgICAgIE9iamVjdCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOivtOaYjuaWh+acrFxuICAgICAgICAgKi9cbiAgICAgICAgU3RyaW5nXG4gICAgICBdXG4gICAgfSxcbiAgICBzY29wZToge31cbiAgfSxcbiAgc2V0dXAocHJvcHMpIHtcbiAgICAvLyB1dGlscy50cmFjZShcImZzLWZvcm0taXRlbVwiKTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWZvcm0taGVscGVyIHtcbiAgY29sb3I6ICM3ZTdlN2U7XG4gIGxpbmUtaGVpZ2h0OiAxLjM7XG4gIG1hcmdpbi10b3A6IDRweDtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuXG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgcHJlIHtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgIG1hcmdpbi1ib3R0b206IDBweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWZvcm0taGVscGVyXCI+XG4gICAgPHByZSB2LWlmPVwidHlwZW9mIGhlbHBlciA9PT0gJ3N0cmluZydcIj57eyBoZWxwZXIgfX08L3ByZT5cbiAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwiaGVscGVyLnJlbmRlclwiPlxuICAgICAgPGZzLXJlbmRlciA6cmVuZGVyLWZ1bmM9XCJoZWxwZXIucmVuZGVyXCIgOnNjb3BlPVwic2NvcGVcIiAvPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHByZSB2LWVsc2UtaWY9XCJoZWxwZXIudGV4dFwiPnt7IGhlbHBlci50ZXh0IH19PC9wcmU+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5cbi8qKlxuICog6KGo5Y2V5a2X5q615biu5Yqp6K+05piO57uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNGb3JtSGVscGVyXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5biu5Yqp6K+05piOLCB0ZXh0OiDor7TmmI7mloflrZcsIHJlbmRlcjogZnVuY3Rpb24oc2NvcGUpIOiHquWumuS5iea4suafk1xuICAgICAqL1xuICAgIGhlbHBlcjoge1xuICAgICAgdHlwZTogW1xuICAgICAgICAvKipcbiAgICAgICAgICogdGV4dDog6K+05piO5paH5a2XLFxuICAgICAgICAgKiByZW5kZXI6IGZ1bmN0aW9uICwg6Ieq5a6a5LmJcmVuZGVyXG4gICAgICAgICAqL1xuICAgICAgICBPYmplY3QsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDor7TmmI7mlofmnKxcbiAgICAgICAgICovXG4gICAgICAgIFN0cmluZ1xuICAgICAgXVxuICAgIH0sXG4gICAgc2NvcGU6IHt9XG4gIH0sXG4gIHNldHVwKHByb3BzKSB7XG4gICAgLy8gdXRpbHMudHJhY2UoXCJmcy1mb3JtLWl0ZW1cIik7XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1mb3JtLWhlbHBlciB7XG4gIGNvbG9yOiAjN2U3ZTdlO1xuICBsaW5lLWhlaWdodDogMS4zO1xuICBtYXJnaW4tdG9wOiA0cHg7XG4gIG1hcmdpbi1ib3R0b206IDZweDtcblxuICBmb250LXNpemU6IDEycHg7XG4gIHByZSB7XG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLG51bGwsIjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgYXMgX19NQUNST1NfZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qLyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRm9ybVByb3ZpZGVyXCJcbn0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gIDxzbG90Pjwvc2xvdD5cbiAgPGZzLWZvcm0td3JhcHBlciB2LWZvcj1cIml0ZW0gb2YgZm9ybVdyYXBwZXJMaXN0XCIgOmtleT1cIml0ZW0uaWRcIiB2LWJpbmQ9XCJpdGVtXCIgLz5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBwcm92aWRlLCBSZWYsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCBGc0Zvcm1XcmFwcGVyIGZyb20gXCIuL2ZzLWZvcm0td3JhcHBlci5qc1wiO1xuaW1wb3J0IHsgT3BlbkRpYWxvZ1Byb3BzIH0gZnJvbSBcIi4uLy4uL2RcIjtcblxuO1xuXG5jb25zdCBmb3JtV3JhcHBlckxpc3Q6IFJlZiA9IHJlZih7fSk7XG5cbmZ1bmN0aW9uIGdldE1heFpJbmRleCgpOiBudW1iZXIge1xuICBsZXQgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiKlwiKTtcbiAgbGV0IG1heFppbmRleCA9IDEwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG1heFppbmRleCA9IE1hdGgubWF4KG1heFppbmRleCwgZWxlbWVudHNbaV0uc3R5bGUuekluZGV4IHx8IDApO1xuICB9XG4gIHJldHVybiBtYXhaaW5kZXg7XG59XG5cbmNvbnN0IGZvcm1XcmFwcGVyQ29udGV4dCA9IHJlZih7fSk7XG5wcm92aWRlKFwiZ2V0OmZvcm06d3JhcHBlcjpjb250ZXh0XCIsIChrZXkpID0+IHtcbiAgcmV0dXJuIGZvcm1XcmFwcGVyQ29udGV4dC52YWx1ZVtrZXldO1xufSk7XG5cbnByb3ZpZGUoXCJ1c2U6Zm9ybTp3cmFwcGVyXCIsICgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBzZXRDb250ZXh0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICBmb3JtV3JhcHBlckNvbnRleHQudmFsdWVba2V5XSA9IHZhbHVlO1xuICAgIH0sXG4gICAgb3BlbihvcHRzOiBPcGVuRGlhbG9nUHJvcHMpIHtcbiAgICAgIGNvbnN0IGlkID0gb3B0cy5pZCB8fCBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKSArIFwiXCI7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBmb3JtV3JhcHBlckxpc3QudmFsdWVbaWRdID0ge1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIC8vIHpJbmRleDogZ2V0TWF4WkluZGV4KCkgKyAxLFxuICAgICAgICAgIGFzeW5jIG9uTW91bnRlZChpbnN0YW5jZTogYW55KSB7XG4gICAgICAgICAgICBhd2FpdCBpbnN0YW5jZS5vcGVuKG9wdHMpO1xuICAgICAgICAgICAgcmVzb2x2ZShpbnN0YW5jZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNsb3NlZCgpIHtcbiAgICAgICAgICAgIGlmICghb3B0cy5pZCkge1xuICAgICAgICAgICAgICAvL+WmguaenOS4jeaYr+WbuuWummlk77yM5YiZ5YWz6Zet5ZCO6ZSA5q+BXG4gICAgICAgICAgICAgIGRlbGV0ZSBmb3JtV3JhcHBlckxpc3QudmFsdWVbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn0pO1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnRcbiAgICA6aXM9XCJjb250YWluZXI/LmlzIHx8ICdmcy1sYXlvdXQtZGVmYXVsdCdcIlxuICAgIHJlZj1cImNvbnRhaW5lclJlZlwiXG4gICAgY2xhc3M9XCJmcy1jcnVkLWNvbnRhaW5lclwiXG4gICAgdi1iaW5kPVwiY29udGFpbmVyXCJcbiAgICA6Y2xhc3M9XCJjb21wdXRlZENsYXNzXCJcbiAgPlxuICAgIDxzbG90Pjwvc2xvdD5cblxuICAgIDx0ZW1wbGF0ZSAjaGVhZGVyLXRvcD5cbiAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItdG9wXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICNoZWFkZXItYm90dG9tPlxuICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgI2hlYWRlci1taWRkbGU+XG4gICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLW1pZGRsZVwiPjwvc2xvdD5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICNzZWFyY2g+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1zZWFyY2hcIj5cbiAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJzZWFyY2guaXMgfHwgJ2ZzLXNlYXJjaCdcIiByZWY9XCJzZWFyY2hSZWZcIiB2LWJpbmQ9XCJzZWFyY2hcIiA6c2xvdHM9XCJjb21wdXRlZFNlYXJjaFNsb3RzXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgI2FjdGlvbmJhcj5cbiAgICAgIDxkaXYgdi1pZj1cImFjdGlvbmJhciAmJiBhY3Rpb25iYXIuc2hvdyAhPT0gZmFsc2VcIiBjbGFzcz1cImZzLWNydWQtYWN0aW9uYmFyXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXItbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgPGZzLWFjdGlvbmJhciB2LWJpbmQ9XCJhY3Rpb25iYXJcIiAvPlxuICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyLXJpZ2h0XCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjdG9vbGJhcj5cbiAgICAgIDxkaXYgdi1pZj1cInRvb2xiYXIgJiYgdG9vbGJhci5zaG93ICE9PSBmYWxzZVwiIGNsYXNzPVwiZnMtY3J1ZC10b29sYmFyXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyLWxlZnRcIj48L3Nsb3Q+XG4gICAgICAgIDxmcy10b29sYmFyIHJlZj1cInRvb2xiYXJSZWZcIiB2LWJpbmQ9XCJ0b29sYmFyXCIgOnNsb3RzPVwiY29tcHV0ZWRUb29sYmFyU2xvdHNcIiA6Y29sdW1ucz1cInRhYmxlLmNvbHVtbnNcIiAvPlxuICAgICAgICA8c2xvdCBuYW1lPVwidG9vbGJhci1yaWdodFwiPjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICN0YWJzPlxuICAgICAgPGZzLXRhYnMtZmlsdGVyIHYtaWY9XCJ0YWJzQmluZGluZy5zaG93XCIgcmVmPVwidGFic1JlZlwiIGNsYXNzPVwiZnMtdGFic1wiIHYtYmluZD1cInRhYnNCaW5kaW5nXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSAjdGFibGU+XG4gICAgICA8ZnMtdGFibGVcbiAgICAgICAgcmVmPVwidGFibGVSZWZcIlxuICAgICAgICBjbGFzcz1cImZzLWNydWQtdGFibGVcIlxuICAgICAgICB2LWJpbmQ9XCJjb21wdXRlZFRhYmxlXCJcbiAgICAgICAgOmNvbHVtbnM9XCJ0YWJsZS5jb2x1bW5zXCJcbiAgICAgICAgOmxvYWRpbmc9XCJ0YWJsZS5sb2FkaW5nXCJcbiAgICAgICAgOnJvdy1oYW5kbGU9XCJyb3dIYW5kbGVcIlxuICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICA6Y2VsbC1zbG90cz1cImNvbXB1dGVkQ2VsbFNsb3RzXCJcbiAgICAgIC8+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjZm9ybT5cbiAgICAgIDxkaXYgcmVmPVwiaW5uZXJXcmFwcGVyUmVmXCIgY2xhc3M9XCJmcy1mb3JtLXdyYXBwZXItY29udGFpbmVyXCIgOmNsYXNzPVwieyAnZnMtZm9ybS1pbm5lci13cmFwcGVyJzogaXNGb3JtSW5uZXIgfVwiPlxuICAgICAgICA8ZnMtZm9ybS13cmFwcGVyXG4gICAgICAgICAgcmVmPVwiZm9ybVdyYXBwZXJSZWZcIlxuICAgICAgICAgIDpzbG90cz1cImNvbXB1dGVkRm9ybVNsb3RzXCJcbiAgICAgICAgICA6aW5uZXItd3JhcHBlcj1cImlubmVyV3JhcHBlclJlZlwiXG4gICAgICAgICAgQGlubmVyLWNoYW5nZT1cIm9uRm9ybUlubmVyQ2hhbmdlXCJcbiAgICAgICAgICBAdmFsdWUtY2hhbmdlPVwiJGVtaXQoJ2Zvcm0tdmFsdWUtY2hhbmdlJywgJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICAgIDwhLS0g57yW6L6R5a+56K+d5qGGIC0tPlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjcGFnaW5hdGlvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLXBhZ2luYXRpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLXBhZ2luYXRpb24tbGVmdFwiPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJwYWdpbmF0aW9uLWxlZnRcIj48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcGFnaW5hdGlvblwiPlxuICAgICAgICAgIDwhLS0gcGFnaW5hdGlvbi5jdXJyZW50UGFnZSDlpoLmnpzkuLrnqbrvvIwgZWxlbWVudOS8muWHuuitpuWRiiAtLT5cbiAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnBhZ2luYXRpb24ubmFtZVwiIHYtaWY9XCJwYWdpbmF0aW9uLnNob3cgIT09IGZhbHNlXCIgdi1iaW5kPVwicGFnaW5hdGlvblwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcGFnaW5hdGlvbi1yaWdodFwiPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJwYWdpbmF0aW9uLXJpZ2h0XCI+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgI2Zvb3Rlci10b3A+XG4gICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyLXRvcFwiPjwvc2xvdD5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyLWJvdHRvbT5cbiAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItYm90dG9tXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgb25Nb3VudGVkLCBQcm9wVHlwZSwgcHJvdmlkZSwgcmVmLCBTZXR1cENvbnRleHQsIHRvUmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IHVpQ29udGV4dCB9IGZyb20gXCIuLi91aVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vdXNlL3VzZS1tZXJnZVwiO1xuaW1wb3J0IHV0aWxMb2cgZnJvbSBcIi4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuLi91dGlscy91dGlsLmxvZ1wiO1xuaW1wb3J0IHsgUm93U2VsZWN0aW9uUHJvcHMsIFNldFNlYXJjaEZvcm1EYXRhUHJvcHMgfSBmcm9tIFwiLi4vZFwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vdXNlXCI7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vLyB1dGlscy50cmFjZShcImZzLXRhYmxlXCIpO1xuY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcblxuZnVuY3Rpb24gdXNlUHJvdmlkZXJzKHByb3BzOiBhbnksIGN0eDogU2V0dXBDb250ZXh0KSB7XG4gIHByb3ZpZGUoXCJnZXQ6Y29sdW1uc1wiLCAoKSA9PiB7XG4gICAgcmV0dXJuIHByb3BzLnRhYmxlLmNvbHVtbnM7XG4gIH0pO1xuICBwcm92aWRlKFwidXBkYXRlOmNvbHVtbnNcIiwgKGNvbHVtbnM6IGFueSkgPT4ge1xuICAgIGN0eC5lbWl0KFwidXBkYXRlOmNvbHVtbnNcIiwgY29sdW1ucyk7XG4gIH0pO1xuXG4gIHByb3ZpZGUoXCJnZXQ6Y3J1ZEJpbmRpbmdcIiwgKCkgPT4ge1xuICAgIHJldHVybiBwcm9wcztcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVzZVNlYXJjaChwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCkge1xuICBjb25zdCBzZWFyY2hSZWYgPSByZWYoKTtcbiAgY29uc3QgZ2V0U2VhcmNoUmVmID0gKCkgPT4ge1xuICAgIHJldHVybiBzZWFyY2hSZWYudmFsdWU7XG4gIH07XG5cbiAgY29uc3QgZ2V0U2VhcmNoRm9ybURhdGEgPSAoKSA9PiB7XG4gICAgaWYgKHNlYXJjaFJlZi52YWx1ZSkge1xuICAgICAgcmV0dXJuIHNlYXJjaFJlZi52YWx1ZS5nZXRGb3JtKCk7XG4gICAgfVxuICAgIGxvZ2dlci53YXJuKFwi6K+35L2/55SoZXhwb3NlLmdldFNlYXJjaEZvcm1EYXRh5Luj5pu/XCIpO1xuICAgIHJldHVybiB7fTtcbiAgfTtcblxuICBjb25zdCBnZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YSA9ICgpID0+IHtcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XG4gICAgICByZXR1cm4gc2VhcmNoUmVmLnZhbHVlLmdldFZhbGlkYXRlZEZvcm0oKTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oXCLor7fkvb/nlKhleHBvc2UuZ2V0U2VhcmNoVmFsaWRhdGVkRm9ybURhdGHku6Pmm79cIik7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuXG4gIC8qKlxuICAgKiDorr7nva5mb3Jt5YC8XG4gICAqIEBwYXJhbSBmb3JtIGZvcm3lr7nosaFcbiAgICogQHBhcmFtIG9wdHMgPSB7XG4gICAqICAgIGlzTWVyZ2U6ZmFsc2Ug5piv5ZCm5LiO5Y6f5pyJZm9ybeWAvOWQiOW5tixcbiAgICogfVxuICAgKi9cbiAgZnVuY3Rpb24gc2V0U2VhcmNoRm9ybURhdGEoeyBmb3JtLCBtZXJnZUZvcm0gPSBmYWxzZSB9OiBTZXRTZWFyY2hGb3JtRGF0YVByb3BzKSB7XG4gICAgaWYgKHNlYXJjaFJlZi52YWx1ZSkge1xuICAgICAgc2VhcmNoUmVmLnZhbHVlLnNldEZvcm0oZm9ybSwgbWVyZ2VGb3JtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNlYXJjaFJlZixcbiAgICBnZXRTZWFyY2hSZWYsXG4gICAgZ2V0U2VhcmNoRm9ybURhdGEsXG4gICAgc2V0U2VhcmNoRm9ybURhdGEsXG4gICAgZ2V0U2VhcmNoVmFsaWRhdGVkRm9ybURhdGFcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlVGFicyhzZWFyY2hSZXQ6IGFueSwgcHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcbiAgY29uc3QgdGFic0JpbmRpbmcgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKHByb3BzLnRhYnMgJiYgcHJvcHMudGFicy5zaG93ICYmIHByb3BzLnRhYnMubmFtZSkge1xuICAgICAgbGV0IGRpY3QgPSBudWxsO1xuICAgICAgY29uc3QgZGVmYXVsdFRhYnMgPSB7IC4uLnByb3BzLnRhYnMgfTtcbiAgICAgIGlmIChwcm9wcy5zZWFyY2g/LmNvbHVtbnMgJiYgcHJvcHMuc2VhcmNoPy5jb2x1bW5zW3Byb3BzLnRhYnMubmFtZV0/LmNvbXBvbmVudD8uZGljdCkge1xuICAgICAgICBkaWN0ID0gcHJvcHMuc2VhcmNoPy5jb2x1bW5zW3Byb3BzLnRhYnMubmFtZV0/LmNvbXBvbmVudD8uZGljdDtcbiAgICAgICAgaWYgKGRlZmF1bHRUYWJzLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICBkZWZhdWx0VGFicy52YWx1ZSA9IGRpY3QudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRUYWJzLmxhYmVsID09IG51bGwpIHtcbiAgICAgICAgICBkZWZhdWx0VGFicy5sYWJlbCA9IGRpY3QubGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRUYWJzLm9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgIGRlZmF1bHRUYWJzLm9wdGlvbnMgPSBkaWN0LmRhdGEgfHwgW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmYXVsdFRhYnMsXG4gICAgICAgIG1vZGVsVmFsdWU6IHByb3BzLnNlYXJjaC52YWxpZGF0ZWRGb3JtICYmIHByb3BzLnNlYXJjaC52YWxpZGF0ZWRGb3JtW3Byb3BzLnRhYnMubmFtZV0sXG4gICAgICAgIFwib25VcGRhdGU6bW9kZWxWYWx1ZVwiOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIGN0eC5lbWl0KFwidGFiLWNoYW5nZVwiLCB7IFtwcm9wcy50YWJzLm5hbWVdOiB2YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3c6IGZhbHNlXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdGFic0JpbmRpbmdcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2xvdEZpbHRlcihjdHhTbG90czogYW55LCBrZXlQcmVmaXg6IHN0cmluZykge1xuICBpZiAoIWN0eFNsb3RzKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGNvbnN0IHNsb3RzOiBhbnkgPSB7fTtcbiAgZm9yRWFjaChjdHhTbG90cywgKHZhbHVlLCBrZXkpID0+IHtcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoa2V5UHJlZml4KSkge1xuICAgICAgc2xvdHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzbG90cztcbn1cblxuZnVuY3Rpb24gdXNlRml4ZWRIZWlnaHQocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQsIHsgdGFibGVSZWYsIGNvbnRhaW5lclJlZiB9OiBhbnkpIHtcbiAgY29uc3QgdWkgPSB1aUNvbnRleHQuZ2V0KCk7XG4gIGxldCB0YWJsZUNJID0gdWkudGFibGU7XG4gIGlmIChwcm9wcy50YWJsZT8udGFibGVWZXJzaW9uID09PSBcInYyXCIpIHtcbiAgICB0YWJsZUNJID0gdWkudGFibGVWMjtcbiAgfVxuICBpZiAodGFibGVDSS5oYXNNYXhIZWlnaHQocHJvcHMudGFibGUpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGlmICghdGFibGVDSS5maXhlZEhlYWRlck5lZWRDb21wdXRlQm9keUhlaWdodCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBjb25zdCBtYXhIZWlnaHRSZWYgPSByZWYobnVsbCk7XG5cbiAgZnVuY3Rpb24gY29tcHV0ZUJvZHlIZWlnaHQoKSB7XG4gICAgY29uc3QgdGFibGVEb20gPSB0YWJsZVJlZj8udmFsdWU/LiRlbDtcbiAgICBpZiAodGFibGVEb20gPT0gbnVsbCB8fCB0YWJsZURvbS5xdWVyeVNlbGVjdG9yID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGVhZERvbSA9IHRhYmxlRG9tLnF1ZXJ5U2VsZWN0b3IodGFibGVDSS5oZWFkZXJEb21TZWxlY3Rvcik7XG4gICAgaWYgKGhlYWREb20gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZUhlaWdodCA9IHRhYmxlRG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBjb25zdCBoZWFkSGVpZ2h0ID0gaGVhZERvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgbWF4SGVpZ2h0UmVmLnZhbHVlID0gdGFibGVIZWlnaHQgLSBoZWFkSGVpZ2h0IC0gMiArIChwcm9wcy50YWJsZS5tYXhIZWlnaHRBZGp1c3QgfHwgMCk7XG5cbiAgICB1dGlsTG9nLmRlYnVnKFwidGFibGUgbWF4IGhlaWdodCByZWNvbXB1dGVkIFwiLCBtYXhIZWlnaHRSZWYudmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gd2F0Y2hCb2R5SGVpZ2h0Q2hhbmdlKCkge1xuICAgIGNvbnN0IHRhYmxlRG9tID0gdGFibGVSZWY/LnZhbHVlPy4kZWw7XG4gICAgaWYgKHRhYmxlRG9tID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFibGVXcmFwcGVyRG9tID0gdGFibGVEb20ucGFyZW50Tm9kZTtcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgICB1dGlsTG9nLmRlYnVnKFwidGFibGUgcmVzaXplZFwiLCBlbnRyaWVzKTtcbiAgICAgIC8vIOavj+asoeiiq+ingua1i+eahOWFg+e0oOWwuuWvuOWPkeeUn+aUueWPmOi/memHjOmDveS8muaJp+ihjFxuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCAmJiBlbnRyaWVzWzBdLmNvbnRlbnRSZWN0LmhlaWdodCA+IDApIHtcbiAgICAgICAgY29tcHV0ZUJvZHlIZWlnaHQoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcHV0ZUJvZHlIZWlnaHQoKTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcHV0ZUJvZHlIZWlnaHQoKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRhYmxlV3JhcHBlckRvbSk7IC8vIOingua1i0RPTeWFg+e0oFxuICB9XG5cbiAgb25Nb3VudGVkKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgd2F0Y2hCb2R5SGVpZ2h0Q2hhbmdlKCk7XG4gIH0pO1xuICByZXR1cm4geyBtYXhIZWlnaHRSZWYsIGNvbXB1dGVCb2R5SGVpZ2h0IH07XG59XG5cbmZ1bmN0aW9uIHVzZVRhYmxlKHByb3BzOiBhbnksIGN0eDogU2V0dXBDb250ZXh0KSB7XG4gIGNvbnN0IHVpID0gdWlDb250ZXh0LmdldCgpO1xuICBjb25zdCB0YWJsZVJlZiA9IHJlZigpO1xuICBjb25zdCB0b29sYmFyUmVmID0gcmVmKCk7XG4gIGNvbnN0IGNvbnRhaW5lclJlZiA9IHJlZigpO1xuICBjb25zdCB7IG1heEhlaWdodFJlZiwgY29tcHV0ZUJvZHlIZWlnaHQgfSA9IHVzZUZpeGVkSGVpZ2h0KHByb3BzLCBjdHgsIHsgdGFibGVSZWYsIGNvbnRhaW5lclJlZiB9KTtcbiAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgY29uc3QgdGFibGVQcm9wUmVmID0gdG9SZWYocHJvcHMsIFwidGFibGVcIik7XG4gIGNvbnN0IGNvbXB1dGVkVGFibGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgLy8gYW50ZHYgbmFpdmUg6auY5bqm6Ieq6YCC5bqU77yMIOWmguaenOeUqOaIt+aciemFjee9rnNjcm9sbO+8jOWImeS8mOWFiOS9v+eUqOeUqOaIt+mFjee9rueahFxuICAgIGxldCBmaXhlZEhlaWdodCA9IHt9O1xuICAgIGlmIChtYXhIZWlnaHRSZWY/LnZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB0YWJsZUNJID0gdWkudGFibGU7XG4gICAgICBpZiAocHJvcHMudGFibGU/LnRhYmxlVmVyc2lvbiA9PT0gXCJ2MlwiKSB7XG4gICAgICAgIHRhYmxlQ0kgPSB1aS50YWJsZVYyO1xuICAgICAgfVxuICAgICAgZml4ZWRIZWlnaHQgPSB0YWJsZUNJLmJ1aWxkTWF4SGVpZ2h0KG1heEhlaWdodFJlZi52YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHBBdHRycyA9IHV0aWxzLmRhc2gub21pdCh0YWJsZVByb3BSZWYsIFwibG9hZGluZ1wiLCBcImNvbHVtbnNcIiwgXCJjb2x1bW5zTWFwXCIpO1xuXG4gICAgcmV0dXJuIG1lcmdlKGZpeGVkSGVpZ2h0LCB7IC4uLmN0eC5hdHRycywgLi4ucEF0dHJzIH0pO1xuICB9KTtcblxuICBjb25zdCBjb21wdXRlZFRvb2xiYXIgPSB0b1JlZihwcm9wcywgXCJ0b29sYmFyXCIpO1xuXG4gIGNvbnN0IGNvbXB1dGVkQ2VsbFNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBzbG90RmlsdGVyKGN0eC5zbG90cywgXCJjZWxsXCIpO1xuICB9KTtcblxuICBjb25zdCBjb21wdXRlZEZvcm1TbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gc2xvdEZpbHRlcihjdHguc2xvdHMsIFwiZm9ybVwiKTtcbiAgfSk7XG4gIGNvbnN0IGNvbXB1dGVkU2VhcmNoU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHNsb3RGaWx0ZXIoY3R4LnNsb3RzLCBcInNlYXJjaFwiKTtcbiAgfSk7XG4gIGNvbnN0IGNvbXB1dGVkVG9vbGJhclNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBzbG90RmlsdGVyKGN0eC5zbG90cywgXCJ0b29sYmFyXCIpO1xuICB9KTtcblxuICBjb25zdCBmb3JtV3JhcHBlclJlZiA9IHJlZigpO1xuXG4gIGNvbnN0IGNvbXB1dGVkQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY2xheno6IGFueSA9IHsgY29tcGFjdDogcHJvcHMudG9vbGJhci5jb21wYWN0ICE9PSBmYWxzZSB9O1xuICAgIGlmIChwcm9wcy5jdXN0b21DbGFzcykge1xuICAgICAgY2xhenpbcHJvcHMuY3VzdG9tQ2xhc3NdID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXp6O1xuICB9KTtcblxuICBjb25zdCBpbm5lcldyYXBwZXJSZWYgPSByZWYoKTtcblxuICBjb25zdCBpc0Zvcm1Jbm5lciA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IG9uRm9ybUlubmVyQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICBpc0Zvcm1Jbm5lci52YWx1ZSA9IHZhbHVlO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgdGFibGVSZWYsXG4gICAgY29udGFpbmVyUmVmLFxuICAgIHRvb2xiYXJSZWYsXG4gICAgY29tcHV0ZWRUYWJsZSxcbiAgICBjb21wdXRlZFRvb2xiYXIsXG4gICAgY29tcHV0ZWRDZWxsU2xvdHMsXG4gICAgZm9ybVdyYXBwZXJSZWYsXG4gICAgaXNGb3JtSW5uZXIsXG4gICAgb25Gb3JtSW5uZXJDaGFuZ2UsXG4gICAgY29tcHV0ZWRGb3JtU2xvdHMsXG4gICAgY29tcHV0ZWRTZWFyY2hTbG90cyxcbiAgICBjb21wdXRlZFRvb2xiYXJTbG90cyxcbiAgICBjb21wdXRlQm9keUhlaWdodCxcbiAgICBjb21wdXRlZENsYXNzLFxuICAgIGlubmVyV3JhcHBlclJlZlxuICB9O1xufVxuXG4vKipcbiAqIGZzLWNydWRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0NydWRcIixcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDooajmoLxpZFxuICAgICAqL1xuICAgIGlkOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcIlwiXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDooajmoLzphY3nva7vvIzop4FGc1RhYmxlXG4gICAgICovXG4gICAgdGFibGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOagvOaVsOaNrlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvcmVxdWlyZS1kZWZhdWx0LXByb3BcbiAgICBkYXRhOiB7XG4gICAgICB0eXBlOiBBcnJheVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5pON5L2c5YiX6YWN572u77yM6KeBRnNSb3dIYW5kbGVcbiAgICAgKi9cbiAgICByb3dIYW5kbGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOafpeivouahhumFjee9ru+8jOingUZzU2VhcmNoXG4gICAgICovXG4gICAgc2VhcmNoOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlt6XlhbfmnaHphY3nva7vvIzop4FGc1Rvb2xiYXJcbiAgICAgKi9cbiAgICB0b29sYmFyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliqjkvZzmnaHphY3nva7vvIzop4FGc0FjdGlvbmJhclxuICAgICAqL1xuICAgIGFjdGlvbmJhcjoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogdGFicyBmaWx0ZXJcbiAgICAgKi9cbiAgICB0YWJzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmt7vliqDooajljZXlr7nor53moYbphY3nva7vvIzop4FGc0Zvcm1XcmFwcGVyXG4gICAgICovXG4gICAgYWRkRm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog57yW6L6R6KGo5Y2V5a+56K+d5qGG6YWN572u77yM6KeBRnNGb3JtV3JhcHBlclxuICAgICAqL1xuICAgIGVkaXRGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmn6XnnIvooajljZXlr7nor53moYbphY3nva7vvIzop4FGc0Zvcm1XcmFwcGVyXG4gICAgICovXG4gICAgdmlld0Zvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOe/u+mhtemFjee9rizmlK/mjIFlbC1wYWdpbmF0aW9ufGEtcGFnaW5hdGlvbumFjee9rlxuICAgICAqL1xuICAgIHBhZ2luYXRpb246IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7IHNob3c6IGZhbHNlIH07XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlrrnlmajphY3nva7vvIzop4FGc0NvbnRhaW5lclxuICAgICAqL1xuICAgIGNvbnRhaW5lcjoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjcnVk5YyF6KO55a655Zmo55qEY2xhc3NcbiAgICAgKi9cbiAgICBjdXN0b21DbGFzczoge30sXG4gICAgLyoqXG4gICAgICog5LiN6KaB5Lyg5YiwZnMtdGFibGXljrtcbiAgICAgKi9cbiAgICBmb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWPr+mAieaLqVxuICAgICAqL1xuICAgIHNlbGVjdGlvbjoge1xuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPFJvd1NlbGVjdGlvblByb3BzPixcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7IHNob3c6IGZhbHNlIH07XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBlbWl0czogW1widXBkYXRlOnNlYXJjaFwiLCBcInVwZGF0ZTpjb21wYWN0XCIsIFwidXBkYXRlOmNvbHVtbnNcIiwgXCJmb3JtLXZhbHVlLWNoYW5nZVwiLCBcInVwZGF0ZTptb2RlbFZhbHVlXCIsIFwidGFiLWNoYW5nZVwiXSxcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4OiBhbnkpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIHVzZVByb3ZpZGVycyhwcm9wcywgY3R4KTtcbiAgICBjb25zdCBzZWFyY2ggPSB1c2VTZWFyY2gocHJvcHMsIGN0eCk7XG4gICAgY29uc3QgdGFicyA9IHVzZVRhYnMoc2VhcmNoLCBwcm9wcywgY3R4KTtcbiAgICBjb25zdCB0YWJsZSA9IHVzZVRhYmxlKHByb3BzLCBjdHgpO1xuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIC4uLnNlYXJjaCxcbiAgICAgIC4uLnRhYmxlLFxuICAgICAgLi4udGFic1xuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi8v5L2c5Li65pWw5o2u6KGo5qC85L2/55So55qE6aKE6K6+5qC35byP77yM6ZqQ6JePZm9vdGVy77yM6KGo5qC86auY5bqm56KO6K6w5b2V5pWw5aKe5Yqg6ICM5aKe5YqgXG4uZnMtY3J1ZC1hcy10YWJsZSB7XG4gIG1pbi1oZWlnaHQ6IDAgIWltcG9ydGFudDtcbiAgaGVpZ2h0OiB1bnNldDtcblxuICAuZnMtY3J1ZC1mb290ZXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAuYm94IC5pbm5lciB7XG4gICAgcG9zaXRpb246IHN0YXRpYztcbiAgfVxufVxuXG4uZnMtY3J1ZC1jb250YWluZXIge1xuICBtaW4taGVpZ2h0OiAzMDBweDtcblxuICAmLmNvbXBhY3Qge1xuICAgIC5lbC10YWJsZS0tYm9yZGVyIHtcbiAgICAgIGJvcmRlci1sZWZ0OiAwO1xuICAgIH1cblxuICAgIC5mcy1jcnVkLWhlYWRlciB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xuICAgIH1cblxuICAgIC5mcy1jcnVkLWZvb3RlciB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xuICAgIH1cbiAgfVxuXG4gIC5mcy1jcnVkLWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBwYWRkaW5nOiAxMHB4IDA7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuXG4gICAgLmZzLWhlYWRlci10b3Age1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtc2VhcmNoIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZ3JpZC1jb2x1bW46IHNwYW4gMjtcbiAgICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XG4gICAgfVxuXG4gICAgLmZzLWhlYWRlci1taWRkbGUge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmZzLWhlYWRlci1ib3R0b20ge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtYWN0aW9uYmFyIHtcbiAgICAgIC8vIHBhZGRpbmctdG9wOiA1cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleDogMTAwMDA7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgbWluLXdpZHRoOiAxcHg7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtdG9vbGJhciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cbiAgfVxuXG4gIC5mcy1jcnVkLXRhYmxlIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICAuZnMtY3J1ZC1mb290ZXIge1xuICAgIHBhZGRpbmc6IDEwcHggMDtcblxuICAgIC5mcy1jcnVkLXBhZ2luYXRpb24ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgICAgIC5mcy1wYWdpbmF0aW9uLWxlZnQge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgICB9XG5cbiAgICAgIC5mcy1wYWdpbmF0aW9uLXJpZ2h0IHtcbiAgICAgICAgZmxleDogMDtcbiAgICAgIH1cblxuICAgICAgLmZzLXBhZ2luYXRpb24ge1xuICAgICAgICBmbGV4OiAxO1xuXG4gICAgICAgIC5hbnQtcGFnaW5hdGlvbi1vcHRpb25zIHtcbiAgICAgICAgICAuYW50LXNlbGVjdCB7XG4gICAgICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAuZWwtcGFnaW5hdGlvbiB7XG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLmZzLXBhZ2luYXRpb24tcmlnaHQge1xuICAgICAgICBmbGV4OiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgLmZzLWNydWQtY29udGFpbmVyIHtcbiAgICAuYm9keSB7XG4gICAgICBvdmVyZmxvdy15OiB1bnNldCAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAuYW50LXRhYmxlLWJvZHkge1xuICAgICAgbWF4LWhlaWdodDogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgb3ZlcmZsb3c6IGF1dG8gIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAubi1kYXRhLXRhYmxlLWJhc2UtdGFibGUtYm9keSB7XG4gICAgICBtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC5mcy1jcnVkLWhlYWRlciAuZnMtY3J1ZC1hY3Rpb25iYXIge1xuICAgICAgZmxleDogdW5zZXQgIWltcG9ydGFudDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDJweDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnRcbiAgICA6aXM9XCJjb250YWluZXI/LmlzIHx8ICdmcy1sYXlvdXQtZGVmYXVsdCdcIlxuICAgIHJlZj1cImNvbnRhaW5lclJlZlwiXG4gICAgY2xhc3M9XCJmcy1jcnVkLWNvbnRhaW5lclwiXG4gICAgdi1iaW5kPVwiY29udGFpbmVyXCJcbiAgICA6Y2xhc3M9XCJjb21wdXRlZENsYXNzXCJcbiAgPlxuICAgIDxzbG90Pjwvc2xvdD5cblxuICAgIDx0ZW1wbGF0ZSAjaGVhZGVyLXRvcD5cbiAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItdG9wXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICNoZWFkZXItYm90dG9tPlxuICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgI2hlYWRlci1taWRkbGU+XG4gICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLW1pZGRsZVwiPjwvc2xvdD5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICNzZWFyY2g+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1zZWFyY2hcIj5cbiAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJzZWFyY2guaXMgfHwgJ2ZzLXNlYXJjaCdcIiByZWY9XCJzZWFyY2hSZWZcIiB2LWJpbmQ9XCJzZWFyY2hcIiA6c2xvdHM9XCJjb21wdXRlZFNlYXJjaFNsb3RzXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgI2FjdGlvbmJhcj5cbiAgICAgIDxkaXYgdi1pZj1cImFjdGlvbmJhciAmJiBhY3Rpb25iYXIuc2hvdyAhPT0gZmFsc2VcIiBjbGFzcz1cImZzLWNydWQtYWN0aW9uYmFyXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXItbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgPGZzLWFjdGlvbmJhciB2LWJpbmQ9XCJhY3Rpb25iYXJcIiAvPlxuICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyLXJpZ2h0XCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjdG9vbGJhcj5cbiAgICAgIDxkaXYgdi1pZj1cInRvb2xiYXIgJiYgdG9vbGJhci5zaG93ICE9PSBmYWxzZVwiIGNsYXNzPVwiZnMtY3J1ZC10b29sYmFyXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyLWxlZnRcIj48L3Nsb3Q+XG4gICAgICAgIDxmcy10b29sYmFyIHJlZj1cInRvb2xiYXJSZWZcIiB2LWJpbmQ9XCJ0b29sYmFyXCIgOnNsb3RzPVwiY29tcHV0ZWRUb29sYmFyU2xvdHNcIiA6Y29sdW1ucz1cInRhYmxlLmNvbHVtbnNcIiAvPlxuICAgICAgICA8c2xvdCBuYW1lPVwidG9vbGJhci1yaWdodFwiPjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICN0YWJzPlxuICAgICAgPGZzLXRhYnMtZmlsdGVyIHYtaWY9XCJ0YWJzQmluZGluZy5zaG93XCIgcmVmPVwidGFic1JlZlwiIGNsYXNzPVwiZnMtdGFic1wiIHYtYmluZD1cInRhYnNCaW5kaW5nXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSAjdGFibGU+XG4gICAgICA8ZnMtdGFibGVcbiAgICAgICAgcmVmPVwidGFibGVSZWZcIlxuICAgICAgICBjbGFzcz1cImZzLWNydWQtdGFibGVcIlxuICAgICAgICB2LWJpbmQ9XCJjb21wdXRlZFRhYmxlXCJcbiAgICAgICAgOmNvbHVtbnM9XCJ0YWJsZS5jb2x1bW5zXCJcbiAgICAgICAgOmxvYWRpbmc9XCJ0YWJsZS5sb2FkaW5nXCJcbiAgICAgICAgOnJvdy1oYW5kbGU9XCJyb3dIYW5kbGVcIlxuICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICA6Y2VsbC1zbG90cz1cImNvbXB1dGVkQ2VsbFNsb3RzXCJcbiAgICAgIC8+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjZm9ybT5cbiAgICAgIDxkaXYgcmVmPVwiaW5uZXJXcmFwcGVyUmVmXCIgY2xhc3M9XCJmcy1mb3JtLXdyYXBwZXItY29udGFpbmVyXCIgOmNsYXNzPVwieyAnZnMtZm9ybS1pbm5lci13cmFwcGVyJzogaXNGb3JtSW5uZXIgfVwiPlxuICAgICAgICA8ZnMtZm9ybS13cmFwcGVyXG4gICAgICAgICAgcmVmPVwiZm9ybVdyYXBwZXJSZWZcIlxuICAgICAgICAgIDpzbG90cz1cImNvbXB1dGVkRm9ybVNsb3RzXCJcbiAgICAgICAgICA6aW5uZXItd3JhcHBlcj1cImlubmVyV3JhcHBlclJlZlwiXG4gICAgICAgICAgQGlubmVyLWNoYW5nZT1cIm9uRm9ybUlubmVyQ2hhbmdlXCJcbiAgICAgICAgICBAdmFsdWUtY2hhbmdlPVwiJGVtaXQoJ2Zvcm0tdmFsdWUtY2hhbmdlJywgJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICAgIDwhLS0g57yW6L6R5a+56K+d5qGGIC0tPlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjcGFnaW5hdGlvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLXBhZ2luYXRpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLXBhZ2luYXRpb24tbGVmdFwiPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJwYWdpbmF0aW9uLWxlZnRcIj48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcGFnaW5hdGlvblwiPlxuICAgICAgICAgIDwhLS0gcGFnaW5hdGlvbi5jdXJyZW50UGFnZSDlpoLmnpzkuLrnqbrvvIwgZWxlbWVudOS8muWHuuitpuWRiiAtLT5cbiAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnBhZ2luYXRpb24ubmFtZVwiIHYtaWY9XCJwYWdpbmF0aW9uLnNob3cgIT09IGZhbHNlXCIgdi1iaW5kPVwicGFnaW5hdGlvblwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcGFnaW5hdGlvbi1yaWdodFwiPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJwYWdpbmF0aW9uLXJpZ2h0XCI+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgI2Zvb3Rlci10b3A+XG4gICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyLXRvcFwiPjwvc2xvdD5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyLWJvdHRvbT5cbiAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItYm90dG9tXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgb25Nb3VudGVkLCBQcm9wVHlwZSwgcHJvdmlkZSwgcmVmLCBTZXR1cENvbnRleHQsIHRvUmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IHVpQ29udGV4dCB9IGZyb20gXCIuLi91aVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vdXNlL3VzZS1tZXJnZVwiO1xuaW1wb3J0IHV0aWxMb2cgZnJvbSBcIi4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuLi91dGlscy91dGlsLmxvZ1wiO1xuaW1wb3J0IHsgUm93U2VsZWN0aW9uUHJvcHMsIFNldFNlYXJjaEZvcm1EYXRhUHJvcHMgfSBmcm9tIFwiLi4vZFwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vdXNlXCI7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vLyB1dGlscy50cmFjZShcImZzLXRhYmxlXCIpO1xuY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcblxuZnVuY3Rpb24gdXNlUHJvdmlkZXJzKHByb3BzOiBhbnksIGN0eDogU2V0dXBDb250ZXh0KSB7XG4gIHByb3ZpZGUoXCJnZXQ6Y29sdW1uc1wiLCAoKSA9PiB7XG4gICAgcmV0dXJuIHByb3BzLnRhYmxlLmNvbHVtbnM7XG4gIH0pO1xuICBwcm92aWRlKFwidXBkYXRlOmNvbHVtbnNcIiwgKGNvbHVtbnM6IGFueSkgPT4ge1xuICAgIGN0eC5lbWl0KFwidXBkYXRlOmNvbHVtbnNcIiwgY29sdW1ucyk7XG4gIH0pO1xuXG4gIHByb3ZpZGUoXCJnZXQ6Y3J1ZEJpbmRpbmdcIiwgKCkgPT4ge1xuICAgIHJldHVybiBwcm9wcztcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVzZVNlYXJjaChwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCkge1xuICBjb25zdCBzZWFyY2hSZWYgPSByZWYoKTtcbiAgY29uc3QgZ2V0U2VhcmNoUmVmID0gKCkgPT4ge1xuICAgIHJldHVybiBzZWFyY2hSZWYudmFsdWU7XG4gIH07XG5cbiAgY29uc3QgZ2V0U2VhcmNoRm9ybURhdGEgPSAoKSA9PiB7XG4gICAgaWYgKHNlYXJjaFJlZi52YWx1ZSkge1xuICAgICAgcmV0dXJuIHNlYXJjaFJlZi52YWx1ZS5nZXRGb3JtKCk7XG4gICAgfVxuICAgIGxvZ2dlci53YXJuKFwi6K+35L2/55SoZXhwb3NlLmdldFNlYXJjaEZvcm1EYXRh5Luj5pu/XCIpO1xuICAgIHJldHVybiB7fTtcbiAgfTtcblxuICBjb25zdCBnZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YSA9ICgpID0+IHtcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XG4gICAgICByZXR1cm4gc2VhcmNoUmVmLnZhbHVlLmdldFZhbGlkYXRlZEZvcm0oKTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oXCLor7fkvb/nlKhleHBvc2UuZ2V0U2VhcmNoVmFsaWRhdGVkRm9ybURhdGHku6Pmm79cIik7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuXG4gIC8qKlxuICAgKiDorr7nva5mb3Jt5YC8XG4gICAqIEBwYXJhbSBmb3JtIGZvcm3lr7nosaFcbiAgICogQHBhcmFtIG9wdHMgPSB7XG4gICAqICAgIGlzTWVyZ2U6ZmFsc2Ug5piv5ZCm5LiO5Y6f5pyJZm9ybeWAvOWQiOW5tixcbiAgICogfVxuICAgKi9cbiAgZnVuY3Rpb24gc2V0U2VhcmNoRm9ybURhdGEoeyBmb3JtLCBtZXJnZUZvcm0gPSBmYWxzZSB9OiBTZXRTZWFyY2hGb3JtRGF0YVByb3BzKSB7XG4gICAgaWYgKHNlYXJjaFJlZi52YWx1ZSkge1xuICAgICAgc2VhcmNoUmVmLnZhbHVlLnNldEZvcm0oZm9ybSwgbWVyZ2VGb3JtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNlYXJjaFJlZixcbiAgICBnZXRTZWFyY2hSZWYsXG4gICAgZ2V0U2VhcmNoRm9ybURhdGEsXG4gICAgc2V0U2VhcmNoRm9ybURhdGEsXG4gICAgZ2V0U2VhcmNoVmFsaWRhdGVkRm9ybURhdGFcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlVGFicyhzZWFyY2hSZXQ6IGFueSwgcHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcbiAgY29uc3QgdGFic0JpbmRpbmcgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKHByb3BzLnRhYnMgJiYgcHJvcHMudGFicy5zaG93ICYmIHByb3BzLnRhYnMubmFtZSkge1xuICAgICAgbGV0IGRpY3QgPSBudWxsO1xuICAgICAgY29uc3QgZGVmYXVsdFRhYnMgPSB7IC4uLnByb3BzLnRhYnMgfTtcbiAgICAgIGlmIChwcm9wcy5zZWFyY2g/LmNvbHVtbnMgJiYgcHJvcHMuc2VhcmNoPy5jb2x1bW5zW3Byb3BzLnRhYnMubmFtZV0/LmNvbXBvbmVudD8uZGljdCkge1xuICAgICAgICBkaWN0ID0gcHJvcHMuc2VhcmNoPy5jb2x1bW5zW3Byb3BzLnRhYnMubmFtZV0/LmNvbXBvbmVudD8uZGljdDtcbiAgICAgICAgaWYgKGRlZmF1bHRUYWJzLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICBkZWZhdWx0VGFicy52YWx1ZSA9IGRpY3QudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRUYWJzLmxhYmVsID09IG51bGwpIHtcbiAgICAgICAgICBkZWZhdWx0VGFicy5sYWJlbCA9IGRpY3QubGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRUYWJzLm9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgIGRlZmF1bHRUYWJzLm9wdGlvbnMgPSBkaWN0LmRhdGEgfHwgW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmYXVsdFRhYnMsXG4gICAgICAgIG1vZGVsVmFsdWU6IHByb3BzLnNlYXJjaC52YWxpZGF0ZWRGb3JtICYmIHByb3BzLnNlYXJjaC52YWxpZGF0ZWRGb3JtW3Byb3BzLnRhYnMubmFtZV0sXG4gICAgICAgIFwib25VcGRhdGU6bW9kZWxWYWx1ZVwiOiAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIGN0eC5lbWl0KFwidGFiLWNoYW5nZVwiLCB7IFtwcm9wcy50YWJzLm5hbWVdOiB2YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3c6IGZhbHNlXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdGFic0JpbmRpbmdcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2xvdEZpbHRlcihjdHhTbG90czogYW55LCBrZXlQcmVmaXg6IHN0cmluZykge1xuICBpZiAoIWN0eFNsb3RzKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGNvbnN0IHNsb3RzOiBhbnkgPSB7fTtcbiAgZm9yRWFjaChjdHhTbG90cywgKHZhbHVlLCBrZXkpID0+IHtcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoa2V5UHJlZml4KSkge1xuICAgICAgc2xvdHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzbG90cztcbn1cblxuZnVuY3Rpb24gdXNlRml4ZWRIZWlnaHQocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQsIHsgdGFibGVSZWYsIGNvbnRhaW5lclJlZiB9OiBhbnkpIHtcbiAgY29uc3QgdWkgPSB1aUNvbnRleHQuZ2V0KCk7XG4gIGxldCB0YWJsZUNJID0gdWkudGFibGU7XG4gIGlmIChwcm9wcy50YWJsZT8udGFibGVWZXJzaW9uID09PSBcInYyXCIpIHtcbiAgICB0YWJsZUNJID0gdWkudGFibGVWMjtcbiAgfVxuICBpZiAodGFibGVDSS5oYXNNYXhIZWlnaHQocHJvcHMudGFibGUpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGlmICghdGFibGVDSS5maXhlZEhlYWRlck5lZWRDb21wdXRlQm9keUhlaWdodCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBjb25zdCBtYXhIZWlnaHRSZWYgPSByZWYobnVsbCk7XG5cbiAgZnVuY3Rpb24gY29tcHV0ZUJvZHlIZWlnaHQoKSB7XG4gICAgY29uc3QgdGFibGVEb20gPSB0YWJsZVJlZj8udmFsdWU/LiRlbDtcbiAgICBpZiAodGFibGVEb20gPT0gbnVsbCB8fCB0YWJsZURvbS5xdWVyeVNlbGVjdG9yID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGVhZERvbSA9IHRhYmxlRG9tLnF1ZXJ5U2VsZWN0b3IodGFibGVDSS5oZWFkZXJEb21TZWxlY3Rvcik7XG4gICAgaWYgKGhlYWREb20gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZUhlaWdodCA9IHRhYmxlRG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBjb25zdCBoZWFkSGVpZ2h0ID0gaGVhZERvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgbWF4SGVpZ2h0UmVmLnZhbHVlID0gdGFibGVIZWlnaHQgLSBoZWFkSGVpZ2h0IC0gMiArIChwcm9wcy50YWJsZS5tYXhIZWlnaHRBZGp1c3QgfHwgMCk7XG5cbiAgICB1dGlsTG9nLmRlYnVnKFwidGFibGUgbWF4IGhlaWdodCByZWNvbXB1dGVkIFwiLCBtYXhIZWlnaHRSZWYudmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gd2F0Y2hCb2R5SGVpZ2h0Q2hhbmdlKCkge1xuICAgIGNvbnN0IHRhYmxlRG9tID0gdGFibGVSZWY/LnZhbHVlPy4kZWw7XG4gICAgaWYgKHRhYmxlRG9tID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFibGVXcmFwcGVyRG9tID0gdGFibGVEb20ucGFyZW50Tm9kZTtcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uIChlbnRyaWVzKSB7XG4gICAgICB1dGlsTG9nLmRlYnVnKFwidGFibGUgcmVzaXplZFwiLCBlbnRyaWVzKTtcbiAgICAgIC8vIOavj+asoeiiq+ingua1i+eahOWFg+e0oOWwuuWvuOWPkeeUn+aUueWPmOi/memHjOmDveS8muaJp+ihjFxuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCAmJiBlbnRyaWVzWzBdLmNvbnRlbnRSZWN0LmhlaWdodCA+IDApIHtcbiAgICAgICAgY29tcHV0ZUJvZHlIZWlnaHQoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcHV0ZUJvZHlIZWlnaHQoKTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcHV0ZUJvZHlIZWlnaHQoKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRhYmxlV3JhcHBlckRvbSk7IC8vIOingua1i0RPTeWFg+e0oFxuICB9XG5cbiAgb25Nb3VudGVkKGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgd2F0Y2hCb2R5SGVpZ2h0Q2hhbmdlKCk7XG4gIH0pO1xuICByZXR1cm4geyBtYXhIZWlnaHRSZWYsIGNvbXB1dGVCb2R5SGVpZ2h0IH07XG59XG5cbmZ1bmN0aW9uIHVzZVRhYmxlKHByb3BzOiBhbnksIGN0eDogU2V0dXBDb250ZXh0KSB7XG4gIGNvbnN0IHVpID0gdWlDb250ZXh0LmdldCgpO1xuICBjb25zdCB0YWJsZVJlZiA9IHJlZigpO1xuICBjb25zdCB0b29sYmFyUmVmID0gcmVmKCk7XG4gIGNvbnN0IGNvbnRhaW5lclJlZiA9IHJlZigpO1xuICBjb25zdCB7IG1heEhlaWdodFJlZiwgY29tcHV0ZUJvZHlIZWlnaHQgfSA9IHVzZUZpeGVkSGVpZ2h0KHByb3BzLCBjdHgsIHsgdGFibGVSZWYsIGNvbnRhaW5lclJlZiB9KTtcbiAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgY29uc3QgdGFibGVQcm9wUmVmID0gdG9SZWYocHJvcHMsIFwidGFibGVcIik7XG4gIGNvbnN0IGNvbXB1dGVkVGFibGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgLy8gYW50ZHYgbmFpdmUg6auY5bqm6Ieq6YCC5bqU77yMIOWmguaenOeUqOaIt+aciemFjee9rnNjcm9sbO+8jOWImeS8mOWFiOS9v+eUqOeUqOaIt+mFjee9rueahFxuICAgIGxldCBmaXhlZEhlaWdodCA9IHt9O1xuICAgIGlmIChtYXhIZWlnaHRSZWY/LnZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB0YWJsZUNJID0gdWkudGFibGU7XG4gICAgICBpZiAocHJvcHMudGFibGU/LnRhYmxlVmVyc2lvbiA9PT0gXCJ2MlwiKSB7XG4gICAgICAgIHRhYmxlQ0kgPSB1aS50YWJsZVYyO1xuICAgICAgfVxuICAgICAgZml4ZWRIZWlnaHQgPSB0YWJsZUNJLmJ1aWxkTWF4SGVpZ2h0KG1heEhlaWdodFJlZi52YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHBBdHRycyA9IHV0aWxzLmRhc2gub21pdCh0YWJsZVByb3BSZWYsIFwibG9hZGluZ1wiLCBcImNvbHVtbnNcIiwgXCJjb2x1bW5zTWFwXCIpO1xuXG4gICAgcmV0dXJuIG1lcmdlKGZpeGVkSGVpZ2h0LCB7IC4uLmN0eC5hdHRycywgLi4ucEF0dHJzIH0pO1xuICB9KTtcblxuICBjb25zdCBjb21wdXRlZFRvb2xiYXIgPSB0b1JlZihwcm9wcywgXCJ0b29sYmFyXCIpO1xuXG4gIGNvbnN0IGNvbXB1dGVkQ2VsbFNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBzbG90RmlsdGVyKGN0eC5zbG90cywgXCJjZWxsXCIpO1xuICB9KTtcblxuICBjb25zdCBjb21wdXRlZEZvcm1TbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gc2xvdEZpbHRlcihjdHguc2xvdHMsIFwiZm9ybVwiKTtcbiAgfSk7XG4gIGNvbnN0IGNvbXB1dGVkU2VhcmNoU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHNsb3RGaWx0ZXIoY3R4LnNsb3RzLCBcInNlYXJjaFwiKTtcbiAgfSk7XG4gIGNvbnN0IGNvbXB1dGVkVG9vbGJhclNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBzbG90RmlsdGVyKGN0eC5zbG90cywgXCJ0b29sYmFyXCIpO1xuICB9KTtcblxuICBjb25zdCBmb3JtV3JhcHBlclJlZiA9IHJlZigpO1xuXG4gIGNvbnN0IGNvbXB1dGVkQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY2xheno6IGFueSA9IHsgY29tcGFjdDogcHJvcHMudG9vbGJhci5jb21wYWN0ICE9PSBmYWxzZSB9O1xuICAgIGlmIChwcm9wcy5jdXN0b21DbGFzcykge1xuICAgICAgY2xhenpbcHJvcHMuY3VzdG9tQ2xhc3NdID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXp6O1xuICB9KTtcblxuICBjb25zdCBpbm5lcldyYXBwZXJSZWYgPSByZWYoKTtcblxuICBjb25zdCBpc0Zvcm1Jbm5lciA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IG9uRm9ybUlubmVyQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICBpc0Zvcm1Jbm5lci52YWx1ZSA9IHZhbHVlO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgdGFibGVSZWYsXG4gICAgY29udGFpbmVyUmVmLFxuICAgIHRvb2xiYXJSZWYsXG4gICAgY29tcHV0ZWRUYWJsZSxcbiAgICBjb21wdXRlZFRvb2xiYXIsXG4gICAgY29tcHV0ZWRDZWxsU2xvdHMsXG4gICAgZm9ybVdyYXBwZXJSZWYsXG4gICAgaXNGb3JtSW5uZXIsXG4gICAgb25Gb3JtSW5uZXJDaGFuZ2UsXG4gICAgY29tcHV0ZWRGb3JtU2xvdHMsXG4gICAgY29tcHV0ZWRTZWFyY2hTbG90cyxcbiAgICBjb21wdXRlZFRvb2xiYXJTbG90cyxcbiAgICBjb21wdXRlQm9keUhlaWdodCxcbiAgICBjb21wdXRlZENsYXNzLFxuICAgIGlubmVyV3JhcHBlclJlZlxuICB9O1xufVxuXG4vKipcbiAqIGZzLWNydWRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0NydWRcIixcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDooajmoLxpZFxuICAgICAqL1xuICAgIGlkOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcIlwiXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDooajmoLzphY3nva7vvIzop4FGc1RhYmxlXG4gICAgICovXG4gICAgdGFibGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOagvOaVsOaNrlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvcmVxdWlyZS1kZWZhdWx0LXByb3BcbiAgICBkYXRhOiB7XG4gICAgICB0eXBlOiBBcnJheVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5pON5L2c5YiX6YWN572u77yM6KeBRnNSb3dIYW5kbGVcbiAgICAgKi9cbiAgICByb3dIYW5kbGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOafpeivouahhumFjee9ru+8jOingUZzU2VhcmNoXG4gICAgICovXG4gICAgc2VhcmNoOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlt6XlhbfmnaHphY3nva7vvIzop4FGc1Rvb2xiYXJcbiAgICAgKi9cbiAgICB0b29sYmFyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliqjkvZzmnaHphY3nva7vvIzop4FGc0FjdGlvbmJhclxuICAgICAqL1xuICAgIGFjdGlvbmJhcjoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogdGFicyBmaWx0ZXJcbiAgICAgKi9cbiAgICB0YWJzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmt7vliqDooajljZXlr7nor53moYbphY3nva7vvIzop4FGc0Zvcm1XcmFwcGVyXG4gICAgICovXG4gICAgYWRkRm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog57yW6L6R6KGo5Y2V5a+56K+d5qGG6YWN572u77yM6KeBRnNGb3JtV3JhcHBlclxuICAgICAqL1xuICAgIGVkaXRGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmn6XnnIvooajljZXlr7nor53moYbphY3nva7vvIzop4FGc0Zvcm1XcmFwcGVyXG4gICAgICovXG4gICAgdmlld0Zvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOe/u+mhtemFjee9rizmlK/mjIFlbC1wYWdpbmF0aW9ufGEtcGFnaW5hdGlvbumFjee9rlxuICAgICAqL1xuICAgIHBhZ2luYXRpb246IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7IHNob3c6IGZhbHNlIH07XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlrrnlmajphY3nva7vvIzop4FGc0NvbnRhaW5lclxuICAgICAqL1xuICAgIGNvbnRhaW5lcjoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBjcnVk5YyF6KO55a655Zmo55qEY2xhc3NcbiAgICAgKi9cbiAgICBjdXN0b21DbGFzczoge30sXG4gICAgLyoqXG4gICAgICog5LiN6KaB5Lyg5YiwZnMtdGFibGXljrtcbiAgICAgKi9cbiAgICBmb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOWPr+mAieaLqVxuICAgICAqL1xuICAgIHNlbGVjdGlvbjoge1xuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPFJvd1NlbGVjdGlvblByb3BzPixcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7IHNob3c6IGZhbHNlIH07XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBlbWl0czogW1widXBkYXRlOnNlYXJjaFwiLCBcInVwZGF0ZTpjb21wYWN0XCIsIFwidXBkYXRlOmNvbHVtbnNcIiwgXCJmb3JtLXZhbHVlLWNoYW5nZVwiLCBcInVwZGF0ZTptb2RlbFZhbHVlXCIsIFwidGFiLWNoYW5nZVwiXSxcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4OiBhbnkpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIHVzZVByb3ZpZGVycyhwcm9wcywgY3R4KTtcbiAgICBjb25zdCBzZWFyY2ggPSB1c2VTZWFyY2gocHJvcHMsIGN0eCk7XG4gICAgY29uc3QgdGFicyA9IHVzZVRhYnMoc2VhcmNoLCBwcm9wcywgY3R4KTtcbiAgICBjb25zdCB0YWJsZSA9IHVzZVRhYmxlKHByb3BzLCBjdHgpO1xuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIC4uLnNlYXJjaCxcbiAgICAgIC4uLnRhYmxlLFxuICAgICAgLi4udGFic1xuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi8v5L2c5Li65pWw5o2u6KGo5qC85L2/55So55qE6aKE6K6+5qC35byP77yM6ZqQ6JePZm9vdGVy77yM6KGo5qC86auY5bqm56KO6K6w5b2V5pWw5aKe5Yqg6ICM5aKe5YqgXG4uZnMtY3J1ZC1hcy10YWJsZSB7XG4gIG1pbi1oZWlnaHQ6IDAgIWltcG9ydGFudDtcbiAgaGVpZ2h0OiB1bnNldDtcblxuICAuZnMtY3J1ZC1mb290ZXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAuYm94IC5pbm5lciB7XG4gICAgcG9zaXRpb246IHN0YXRpYztcbiAgfVxufVxuXG4uZnMtY3J1ZC1jb250YWluZXIge1xuICBtaW4taGVpZ2h0OiAzMDBweDtcblxuICAmLmNvbXBhY3Qge1xuICAgIC5lbC10YWJsZS0tYm9yZGVyIHtcbiAgICAgIGJvcmRlci1sZWZ0OiAwO1xuICAgIH1cblxuICAgIC5mcy1jcnVkLWhlYWRlciB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xuICAgIH1cblxuICAgIC5mcy1jcnVkLWZvb3RlciB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xuICAgIH1cbiAgfVxuXG4gIC5mcy1jcnVkLWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBwYWRkaW5nOiAxMHB4IDA7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuXG4gICAgLmZzLWhlYWRlci10b3Age1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtc2VhcmNoIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZ3JpZC1jb2x1bW46IHNwYW4gMjtcbiAgICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XG4gICAgfVxuXG4gICAgLmZzLWhlYWRlci1taWRkbGUge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmZzLWhlYWRlci1ib3R0b20ge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtYWN0aW9uYmFyIHtcbiAgICAgIC8vIHBhZGRpbmctdG9wOiA1cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleDogMTAwMDA7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgbWluLXdpZHRoOiAxcHg7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtdG9vbGJhciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cbiAgfVxuXG4gIC5mcy1jcnVkLXRhYmxlIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICAuZnMtY3J1ZC1mb290ZXIge1xuICAgIHBhZGRpbmc6IDEwcHggMDtcblxuICAgIC5mcy1jcnVkLXBhZ2luYXRpb24ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgICAgIC5mcy1wYWdpbmF0aW9uLWxlZnQge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgICB9XG5cbiAgICAgIC5mcy1wYWdpbmF0aW9uLXJpZ2h0IHtcbiAgICAgICAgZmxleDogMDtcbiAgICAgIH1cblxuICAgICAgLmZzLXBhZ2luYXRpb24ge1xuICAgICAgICBmbGV4OiAxO1xuXG4gICAgICAgIC5hbnQtcGFnaW5hdGlvbi1vcHRpb25zIHtcbiAgICAgICAgICAuYW50LXNlbGVjdCB7XG4gICAgICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAuZWwtcGFnaW5hdGlvbiB7XG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLmZzLXBhZ2luYXRpb24tcmlnaHQge1xuICAgICAgICBmbGV4OiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgLmZzLWNydWQtY29udGFpbmVyIHtcbiAgICAuYm9keSB7XG4gICAgICBvdmVyZmxvdy15OiB1bnNldCAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAuYW50LXRhYmxlLWJvZHkge1xuICAgICAgbWF4LWhlaWdodDogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgb3ZlcmZsb3c6IGF1dG8gIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAubi1kYXRhLXRhYmxlLWJhc2UtdGFibGUtYm9keSB7XG4gICAgICBtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC5mcy1jcnVkLWhlYWRlciAuZnMtY3J1ZC1hY3Rpb25iYXIge1xuICAgICAgZmxleDogdW5zZXQgIWltcG9ydGFudDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDJweDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1yb3ctaGFuZGxlXCI+XG4gICAgPHNsb3QgbmFtZT1cImNlbGwtcm93SGFuZGxlLWxlZnRcIiB2LWJpbmQ9XCJzY29wZVJlZlwiPjwvc2xvdD5cbiAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNvbXB1dGVkSGFuZGxlQnRuc1wiIDprZXk9XCJpbmRleFwiPlxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpdGVtLnNob3cgIT09IGZhbHNlICYmICFpc0Ryb3Bkb3duQnRuKGl0ZW0sIGluZGV4KVwiPlxuICAgICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJpdGVtLnJlbmRlclwiIDpyZW5kZXItZnVuYz1cIml0ZW0ucmVuZGVyXCIgOnNjb3BlPVwic2NvcGVSZWZcIiAvPlxuICAgICAgICA8ZnMtYnV0dG9uIHYtZWxzZSBjbGFzcz1cInJvdy1oYW5kbGUtYnRuXCIgdi1iaW5kPVwiaXRlbVwiIEBjbGljay5zdG9wPVwiZG9DbGljayhpdGVtLCAkZXZlbnQpXCIgLz5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8c2xvdCBuYW1lPVwiY2VsbC1yb3dIYW5kbGUtbWlkZGxlXCIgdi1iaW5kPVwic2NvcGVcIj48L3Nsb3Q+XG4gICAgPCEtLSDkuIvmi4nmjInpkq7oj5zljZUgLS0+XG4gICAgPHNwYW4gdi1pZj1cImhhc0Ryb3Bkb3duQnRuXCIgY2xhc3M9XCJyb3ctaGFuZGxlLWJ0biBmcy1oYW5kbGUtcm93LWRyb3Bkb3duXCI+XG4gICAgICA8Y29tcG9uZW50IDppcz1cInVpLmRyb3Bkb3duLm5hbWVcIiB2LWJpbmQ9XCJjb21wdXRlZERyb3Bkb3duQmluZGluZ1wiPlxuICAgICAgICA8ZnMtYnV0dG9uIHYtYmluZD1cImRyb3Bkb3duLm1vcmVcIiAvPlxuICAgICAgICA8dGVtcGxhdGUgI1t1aS5kcm9wZG93bi5zbG90TmFtZV0+XG4gICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgOmlzPVwidWkuZHJvcGRvd25NZW51Lm5hbWVcIlxuICAgICAgICAgICAgdi1pZj1cInVpLmRyb3Bkb3duLnJlbmRlck1vZGUgPT09ICdzbG90J1wiXG4gICAgICAgICAgICB2LWJpbmQ9XCJ1aS5kcm9wZG93bk1lbnUuY29tbWFuZChkb0Ryb3Bkb3duSXRlbUNsaWNrKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjb21wdXRlZEhhbmRsZUJ0bnNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIDppcz1cInVpLmRyb3Bkb3duSXRlbS5uYW1lXCJcbiAgICAgICAgICAgICAgICB2LWlmPVwiaXRlbS5zaG93ICE9PSBmYWxzZSAmJiBpc0Ryb3Bkb3duQnRuKGl0ZW0sIGluZGV4KVwiXG4gICAgICAgICAgICAgICAgOlt1aS5kcm9wZG93bkl0ZW0uY29tbWFuZF09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgdi1iaW5kPVwiaXRlbS5kcm9wZG93bkl0ZW1cIlxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLXJvdy1oYW5kbGUtZHJvcGRvd24taXRlbVwiIHYtYmluZD1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgIDxmcy1pY29uIHYtaWY9XCJpdGVtLmljb25cIiA6aWNvbj1cIml0ZW0uaWNvblwiIC8+IHt7IGl0ZW0udGV4dCB8fCBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvc3Bhbj5cbiAgICA8c2xvdCBuYW1lPVwiY2VsbC1yb3dIYW5kbGUtcmlnaHRcIiB2LWJpbmQ9XCJzY29wZVwiPjwvc2xvdD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBmb3JFYWNoLCBzb3J0QnksIG9taXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS11aVwiO1xuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgQnV0dG9uUHJvcHMsIFNjb3BlQ29udGV4dCB9IGZyb20gXCIuLi8uLi9kXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2VcIjtcblxuLyoqXG4gKiDmk43kvZzliJfphY3nva5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1Jvd0hhbmRsZVwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaMiemSruaKmOWPoOmFjee9rlxuICAgICAqL1xuICAgIGRyb3Bkb3duOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaMiemSrumFjee9rlxuICAgICAqIHtcbiAgICAgKiAgIHZpZXc6ey4uLkZzQnV0dG9uLGNsaWNrOkZ1bmN0aW9uLG9yZGVyOjF9LFxuICAgICAqICAgZWRpdDp7Li4uRnNCdXR0b24sY2xpY2s6RnVuY3Rpb24sb3JkZXI6Mn0sXG4gICAgICogICByZW1vdmU6ey4uLkZzQnV0dG9uLGNsaWNrOkZ1bmN0aW9uLG9yZGVyOjN9LFxuICAgICAqICAgLi4u6Ieq5a6a5LmJXG4gICAgICogfVxuICAgICAqL1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5oyJ6ZKu5YiG57uELOS4iumdoueahGJ1dHRvbnPkuLrpu5jorqTliIbnu4RcbiAgICAgKiAge1xuICAgICAqICAgIGdyb3VwS2V5OntidXR0b25LZXk6e30sYnV0dG9uS2V5Mjp7fX1cbiAgICAgKiAgfVxuICAgICAqL1xuICAgIGdyb3VwOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW9k+WJjea/gOa0u+WIhue7hFxuICAgICAqL1xuICAgIGFjdGl2ZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHNjb3BlXG4gICAgICovXG4gICAgc2NvcGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcImhhbmRsZVwiXSxcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuXG4gICAgY29uc3Qgc2NvcGVSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wcm9wcy5zY29wZSxcbiAgICAgICAgcm93OiBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5yb3ddLFxuICAgICAgICBpbmRleDogcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4uaW5kZXhdXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IGRvQ2xpY2sgPSAoaXRlbTogYW55LCAkZXZlbnQ/OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4uaW5kZXhdO1xuICAgICAgY29uc3Qgcm93ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4ucm93XTtcbiAgICAgIGNvbnN0IGU6IFNjb3BlQ29udGV4dCA9IHsga2V5OiBpdGVtLmtleSwgcm93LCBidG46IGl0ZW0sIGluZGV4LCAuLi5wcm9wcy5zY29wZSwgbG9hZGluZ1JlZjogJGV2ZW50Py5sb2FkaW5nUmVmIH07XG4gICAgICBpZiAoaXRlbS5jbGljaykge1xuICAgICAgICByZXR1cm4gaXRlbS5jbGljayhlKTtcbiAgICAgIH1cbiAgICAgIGN0eC5lbWl0KFwiaGFuZGxlXCIsIGUpO1xuICAgIH07XG4gICAgY29uc3QgeyBkb0NvbXB1dGVkIH0gPSB1c2VDb21wdXRlKCk7XG4gICAgY29uc3QgcGlja2VkUHJvcHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkcm9wZG93bjogcHJvcHMuZHJvcGRvd24sXG4gICAgICAgIGJ1dHRvbnM6IHByb3BzLmJ1dHRvbnMsXG4gICAgICAgIGFjdGl2ZTogcHJvcHMuYWN0aXZlLFxuICAgICAgICBncm91cDogcHJvcHMuZ3JvdXBcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgY29tcHV0ZVByb3BzID0gZG9Db21wdXRlZChcbiAgICAgICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHBpY2tlZFByb3BzLnZhbHVlO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5pbmRleF07XG4gICAgICAgIGNvbnN0IHJvdyA9IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLnJvd107XG4gICAgICAgIHJldHVybiB7IC4uLnByb3BzLnNjb3BlLCBpbmRleCwgcm93IH07XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vY29uc3QgY29tcHV0ZVByb3BzID0geyB2YWx1ZTogcHJvcHMgfTtcbiAgICBjb25zdCBjb21wdXRlZEhhbmRsZUJ0bnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBsZXQgbWVyZ2VkQnRucyA9IG51bGw7XG4gICAgICBpZiAoY29tcHV0ZVByb3BzLnZhbHVlLmFjdGl2ZSA9PSBudWxsIHx8IGNvbXB1dGVQcm9wcy52YWx1ZS5hY3RpdmUgPT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIGNvbnN0IGRlZkJ0bnMgPSB7XG4gICAgICAgICAgdmlldzoge1xuICAgICAgICAgICAga2V5OiBcInZpZXdcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJmcy5yb3dIYW5kbGUudmlldy50ZXh0XCIpLFxuICAgICAgICAgICAgdGl0bGU6IHQoXCJmcy5yb3dIYW5kbGUudmlldy50ZXh0XCIpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb3B5OiB7XG4gICAgICAgICAgICBrZXk6IFwiY29weVwiLFxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS5jb3B5LnRleHRcIiksXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS5jb3B5LnRleHRcIilcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVkaXQ6IHtcbiAgICAgICAgICAgIGtleTogXCJlZGl0XCIsXG4gICAgICAgICAgICB0eXBlOiBcInByaW1hcnlcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJmcy5yb3dIYW5kbGUuZWRpdC50ZXh0XCIpLFxuICAgICAgICAgICAgdGl0bGU6IHQoXCJmcy5yb3dIYW5kbGUuZWRpdC50ZXh0XCIpXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZW1vdmU6IHtcbiAgICAgICAgICAgIGtleTogXCJyZW1vdmVcIixcbiAgICAgICAgICAgIC4uLnVpLmJ1dHRvbi5jb2xvcnMoXCJkYW5nZXJcIiksXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMucm93SGFuZGxlLnJlbW92ZS50ZXh0XCIpLFxuICAgICAgICAgICAgdGl0bGU6IHQoXCJmcy5yb3dIYW5kbGUucmVtb3ZlLnRleHRcIilcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIG1lcmdlZEJ0bnMgPSBtZXJnZShkZWZCdG5zLCBjb21wdXRlUHJvcHMudmFsdWUuYnV0dG9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXJnZWRCdG5zID0gY29tcHV0ZVByb3BzLnZhbHVlLmdyb3VwW2NvbXB1dGVQcm9wcy52YWx1ZS5hY3RpdmVdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidG5zOiBCdXR0b25Qcm9wc1tdID0gW107XG4gICAgICBmb3JFYWNoKG1lcmdlZEJ0bnMsIChpdGVtLCBrZXkpID0+IHtcbiAgICAgICAgaXRlbS5rZXkgPSBrZXk7XG4gICAgICAgIGlmIChpdGVtLnNob3cgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGJ0bnMucHVzaChpdGVtKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gc29ydEJ5KGJ0bnMsIChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLm9yZGVyID8/IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkRHJvcGRvd25BdExlYXN0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBjb21wdXRlUHJvcHMudmFsdWUuZHJvcGRvd24gPT0gbnVsbCB8fFxuICAgICAgICBjb21wdXRlUHJvcHMudmFsdWUuZHJvcGRvd24uYXRMZWFzdCA9PSBudWxsIHx8XG4gICAgICAgIGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93bi5hdExlYXN0IDw9IDAgfHxcbiAgICAgICAgY29tcHV0ZWRIYW5kbGVCdG5zLnZhbHVlLmxlbmd0aCA8PSBjb21wdXRlUHJvcHMudmFsdWUuZHJvcGRvd24uYXRMZWFzdFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93bi5hdExlYXN0IHx8IDA7XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXNEcm9wZG93bkJ0bihpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgIGlmIChpdGVtLmRyb3Bkb3duID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXB1dGVkRHJvcGRvd25BdExlYXN0LnZhbHVlID4gMCAmJiBjb21wdXRlZERyb3Bkb3duQXRMZWFzdC52YWx1ZSA8IGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBoYXNEcm9wZG93bkJ0biA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29tcHV0ZWRIYW5kbGVCdG5zLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGlzID0gaXNEcm9wZG93bkJ0bihpdGVtLCBpbmRleCk7XG4gICAgICAgIGlmIChpcykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBkb0Ryb3Bkb3duSXRlbUNsaWNrKCRldmVudDogYW55KSB7XG4gICAgICBmb3IgKGxldCBidG4gb2YgY29tcHV0ZWRIYW5kbGVCdG5zLnZhbHVlKSB7XG4gICAgICAgIGlmICgkZXZlbnQgPT09IGJ0bi5rZXkpIHtcbiAgICAgICAgICBkb0NsaWNrKGJ0bik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWREcm9wZG93bkJpbmRpbmcgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBiaW5kaW5nOiBhbnkgPSB7fTtcbiAgICAgIGlmICh1aS5kcm9wZG93bi5yZW5kZXJNb2RlICE9PSBcInNsb3RcIikge1xuICAgICAgICAvLyBuYWl2ZSDpgJrov4dvcHRpb25z6YWN572u5p2l5pi+56S65a2Q6aG5XG4gICAgICAgIGNvbnN0IGJ0bnMgPSBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWU7XG4gICAgICAgIGNvbnN0IG9wdHM6IEJ1dHRvblByb3BzW10gPSBbXTtcbiAgICAgICAgZm9yRWFjaChidG5zLCAodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlLnNob3cgIT09IGZhbHNlICYmIGlzRHJvcGRvd25CdG4odmFsdWUsIGluZGV4KSkge1xuICAgICAgICAgICAgb3B0cy5wdXNoKHtcbiAgICAgICAgICAgICAgW3VpLmRyb3Bkb3duLnZhbHVlXTogdmFsdWUua2V5LFxuICAgICAgICAgICAgICBbdWkuZHJvcGRvd24ubGFiZWxdOiB2YWx1ZS50ZXh0LFxuICAgICAgICAgICAgICB0aXRsZTogdmFsdWUudGl0bGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJpbmRpbmcub3B0aW9ucyA9IG9wdHM7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vbWl0KHByb3BzLmRyb3Bkb3duLCBcIm1vcmVcIiwgXCJhdExlYXN0XCIpLFxuICAgICAgICAuLi51aS5kcm9wZG93bi5jb21tYW5kKGRvRHJvcGRvd25JdGVtQ2xpY2spLFxuICAgICAgICAuLi5iaW5kaW5nXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgaGFzRHJvcGRvd25CdG4sXG4gICAgICBjb21wdXRlZEhhbmRsZUJ0bnMsXG4gICAgICBkb0Ryb3Bkb3duSXRlbUNsaWNrLFxuICAgICAgY29tcHV0ZWREcm9wZG93bkF0TGVhc3QsXG4gICAgICBkb0NsaWNrLFxuICAgICAgaXNEcm9wZG93bkJ0bixcbiAgICAgIHNjb3BlUmVmLFxuICAgICAgY29tcHV0ZWREcm9wZG93bkJpbmRpbmdcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1yb3ctaGFuZGxlIHtcbiAgLy8gZGlzcGxheTogZmxleCA7IC8vIOi/memHjOS4jeiDveeUqGZsZXjvvIzlkKbliJnkvJrnoLTlnY9hbGlnbjpjZW50ZXLphY3nva5cbiAgZmxleC13cmFwOiB3cmFwO1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLmVsLWJ1dHRvbiArIC5lbC1idXR0b24ge1xuICAgIG1hcmdpbi1sZWZ0OiAycHg7XG4gIH1cbiAgJiA+ICoge1xuICAgIG1hcmdpbjogMnB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cbiAgLmZzLXJvdy1oYW5kbGUtZHJvcGRvd24taXRlbSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuXG4gIC5uLWJ1dHRvbiB7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBtYXJnaW46IDJweDtcbiAgfVxuXG4gIC5yb3ctaGFuZGxlLWJ0biB7XG4gICAgLmZzLWljb24ge1xuICAgICAgbWFyZ2luOiBhdXRvO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXJvdy1oYW5kbGVcIj5cbiAgICA8c2xvdCBuYW1lPVwiY2VsbC1yb3dIYW5kbGUtbGVmdFwiIHYtYmluZD1cInNjb3BlUmVmXCI+PC9zbG90PlxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gY29tcHV0ZWRIYW5kbGVCdG5zXCIgOmtleT1cImluZGV4XCI+XG4gICAgICA8dGVtcGxhdGUgdi1pZj1cIml0ZW0uc2hvdyAhPT0gZmFsc2UgJiYgIWlzRHJvcGRvd25CdG4oaXRlbSwgaW5kZXgpXCI+XG4gICAgICAgIDxmcy1yZW5kZXIgdi1pZj1cIml0ZW0ucmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiaXRlbS5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZVJlZlwiIC8+XG4gICAgICAgIDxmcy1idXR0b24gdi1lbHNlIGNsYXNzPVwicm93LWhhbmRsZS1idG5cIiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrLnN0b3A9XCJkb0NsaWNrKGl0ZW0sICRldmVudClcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDxzbG90IG5hbWU9XCJjZWxsLXJvd0hhbmRsZS1taWRkbGVcIiB2LWJpbmQ9XCJzY29wZVwiPjwvc2xvdD5cbiAgICA8IS0tIOS4i+aLieaMiemSruiPnOWNlSAtLT5cbiAgICA8c3BhbiB2LWlmPVwiaGFzRHJvcGRvd25CdG5cIiBjbGFzcz1cInJvdy1oYW5kbGUtYnRuIGZzLWhhbmRsZS1yb3ctZHJvcGRvd25cIj5cbiAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZHJvcGRvd24ubmFtZVwiIHYtYmluZD1cImNvbXB1dGVkRHJvcGRvd25CaW5kaW5nXCI+XG4gICAgICAgIDxmcy1idXR0b24gdi1iaW5kPVwiZHJvcGRvd24ubW9yZVwiIC8+XG4gICAgICAgIDx0ZW1wbGF0ZSAjW3VpLmRyb3Bkb3duLnNsb3ROYW1lXT5cbiAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICA6aXM9XCJ1aS5kcm9wZG93bk1lbnUubmFtZVwiXG4gICAgICAgICAgICB2LWlmPVwidWkuZHJvcGRvd24ucmVuZGVyTW9kZSA9PT0gJ3Nsb3QnXCJcbiAgICAgICAgICAgIHYtYmluZD1cInVpLmRyb3Bkb3duTWVudS5jb21tYW5kKGRvRHJvcGRvd25JdGVtQ2xpY2spXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNvbXB1dGVkSGFuZGxlQnRuc1wiIDprZXk9XCJpbmRleFwiPlxuICAgICAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICAgICAgOmlzPVwidWkuZHJvcGRvd25JdGVtLm5hbWVcIlxuICAgICAgICAgICAgICAgIHYtaWY9XCJpdGVtLnNob3cgIT09IGZhbHNlICYmIGlzRHJvcGRvd25CdG4oaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgICAgICA6W3VpLmRyb3Bkb3duSXRlbS5jb21tYW5kXT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgICAgICB2LWJpbmQ9XCJpdGVtLmRyb3Bkb3duSXRlbVwiXG4gICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LWhhbmRsZS1kcm9wZG93bi1pdGVtXCIgdi1iaW5kPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgPGZzLWljb24gdi1pZj1cIml0ZW0uaWNvblwiIDppY29uPVwiaXRlbS5pY29uXCIgLz4ge3sgaXRlbS50ZXh0IHx8IGl0ZW0udGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgPC9zcGFuPlxuICAgIDxzbG90IG5hbWU9XCJjZWxsLXJvd0hhbmRsZS1yaWdodFwiIHYtYmluZD1cInNjb3BlXCI+PC9zbG90PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IGZvckVhY2gsIHNvcnRCeSwgb21pdCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLXVpXCI7XG5pbXBvcnQgeyB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtY29tcHV0ZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBCdXR0b25Qcm9wcywgU2NvcGVDb250ZXh0IH0gZnJvbSBcIi4uLy4uL2RcIjtcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG4vKipcbiAqIOaTjeS9nOWIl+mFjee9rlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzUm93SGFuZGxlXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5oyJ6ZKu5oqY5Y+g6YWN572uXG4gICAgICovXG4gICAgZHJvcGRvd246IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uXG4gICAgICoge1xuICAgICAqICAgdmlldzp7Li4uRnNCdXR0b24sY2xpY2s6RnVuY3Rpb24sb3JkZXI6MX0sXG4gICAgICogICBlZGl0OnsuLi5Gc0J1dHRvbixjbGljazpGdW5jdGlvbixvcmRlcjoyfSxcbiAgICAgKiAgIHJlbW92ZTp7Li4uRnNCdXR0b24sY2xpY2s6RnVuY3Rpb24sb3JkZXI6M30sXG4gICAgICogICAuLi7oh6rlrprkuYlcbiAgICAgKiB9XG4gICAgICovXG4gICAgYnV0dG9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmjInpkq7liIbnu4Qs5LiK6Z2i55qEYnV0dG9uc+S4uum7mOiupOWIhue7hFxuICAgICAqICB7XG4gICAgICogICAgZ3JvdXBLZXk6e2J1dHRvbktleTp7fSxidXR0b25LZXkyOnt9fVxuICAgICAqICB9XG4gICAgICovXG4gICAgZ3JvdXA6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5b2T5YmN5r+A5rS75YiG57uEXG4gICAgICovXG4gICAgYWN0aXZlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIlxuICAgIH0sXG4gICAgLyoqXG4gICAgICogc2NvcGVcbiAgICAgKi9cbiAgICBzY29wZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBlbWl0czogW1wiaGFuZGxlXCJdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG5cbiAgICBjb25zdCBzY29wZVJlZiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByb3BzLnNjb3BlLFxuICAgICAgICByb3c6IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLnJvd10sXG4gICAgICAgIGluZGV4OiBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5pbmRleF1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgZG9DbGljayA9IChpdGVtOiBhbnksICRldmVudD86IGFueSkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5pbmRleF07XG4gICAgICBjb25zdCByb3cgPSBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5yb3ddO1xuICAgICAgY29uc3QgZTogU2NvcGVDb250ZXh0ID0geyBrZXk6IGl0ZW0ua2V5LCByb3csIGJ0bjogaXRlbSwgaW5kZXgsIC4uLnByb3BzLnNjb3BlLCBsb2FkaW5nUmVmOiAkZXZlbnQ/LmxvYWRpbmdSZWYgfTtcbiAgICAgIGlmIChpdGVtLmNsaWNrKSB7XG4gICAgICAgIHJldHVybiBpdGVtLmNsaWNrKGUpO1xuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJoYW5kbGVcIiwgZSk7XG4gICAgfTtcbiAgICBjb25zdCB7IGRvQ29tcHV0ZWQgfSA9IHVzZUNvbXB1dGUoKTtcbiAgICBjb25zdCBwaWNrZWRQcm9wcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRyb3Bkb3duOiBwcm9wcy5kcm9wZG93bixcbiAgICAgICAgYnV0dG9uczogcHJvcHMuYnV0dG9ucyxcbiAgICAgICAgYWN0aXZlOiBwcm9wcy5hY3RpdmUsXG4gICAgICAgIGdyb3VwOiBwcm9wcy5ncm91cFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlUHJvcHMgPSBkb0NvbXB1dGVkKFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gcGlja2VkUHJvcHMudmFsdWU7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLmluZGV4XTtcbiAgICAgICAgY29uc3Qgcm93ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4ucm93XTtcbiAgICAgICAgcmV0dXJuIHsgLi4ucHJvcHMuc2NvcGUsIGluZGV4LCByb3cgfTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy9jb25zdCBjb21wdXRlUHJvcHMgPSB7IHZhbHVlOiBwcm9wcyB9O1xuICAgIGNvbnN0IGNvbXB1dGVkSGFuZGxlQnRucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGxldCBtZXJnZWRCdG5zID0gbnVsbDtcbiAgICAgIGlmIChjb21wdXRlUHJvcHMudmFsdWUuYWN0aXZlID09IG51bGwgfHwgY29tcHV0ZVByb3BzLnZhbHVlLmFjdGl2ZSA9PT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgY29uc3QgZGVmQnRucyA9IHtcbiAgICAgICAgICB2aWV3OiB7XG4gICAgICAgICAgICBrZXk6IFwidmlld1wiLFxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS52aWV3LnRleHRcIiksXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS52aWV3LnRleHRcIilcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvcHk6IHtcbiAgICAgICAgICAgIGtleTogXCJjb3B5XCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMucm93SGFuZGxlLmNvcHkudGV4dFwiKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLmNvcHkudGV4dFwiKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZWRpdDoge1xuICAgICAgICAgICAga2V5OiBcImVkaXRcIixcbiAgICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS5lZGl0LnRleHRcIiksXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS5lZGl0LnRleHRcIilcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlbW92ZToge1xuICAgICAgICAgICAga2V5OiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgLi4udWkuYnV0dG9uLmNvbG9ycyhcImRhbmdlclwiKSxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJmcy5yb3dIYW5kbGUucmVtb3ZlLnRleHRcIiksXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS5yZW1vdmUudGV4dFwiKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbWVyZ2VkQnRucyA9IG1lcmdlKGRlZkJ0bnMsIGNvbXB1dGVQcm9wcy52YWx1ZS5idXR0b25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lcmdlZEJ0bnMgPSBjb21wdXRlUHJvcHMudmFsdWUuZ3JvdXBbY29tcHV0ZVByb3BzLnZhbHVlLmFjdGl2ZV07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ0bnM6IEJ1dHRvblByb3BzW10gPSBbXTtcbiAgICAgIGZvckVhY2gobWVyZ2VkQnRucywgKGl0ZW0sIGtleSkgPT4ge1xuICAgICAgICBpdGVtLmtleSA9IGtleTtcbiAgICAgICAgaWYgKGl0ZW0uc2hvdyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnRucy5wdXNoKGl0ZW0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzb3J0QnkoYnRucywgKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcHV0ZWREcm9wZG93bkF0TGVhc3QgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93biA9PSBudWxsIHx8XG4gICAgICAgIGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93bi5hdExlYXN0ID09IG51bGwgfHxcbiAgICAgICAgY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3QgPD0gMCB8fFxuICAgICAgICBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWUubGVuZ3RoIDw9IGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93bi5hdExlYXN0XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3QgfHwgMDtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpc0Ryb3Bkb3duQnRuKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgaWYgKGl0ZW0uZHJvcGRvd24gPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY29tcHV0ZWREcm9wZG93bkF0TGVhc3QudmFsdWUgPiAwICYmIGNvbXB1dGVkRHJvcGRvd25BdExlYXN0LnZhbHVlIDwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGhhc0Ryb3Bkb3duQnRuID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWUpIHtcbiAgICAgICAgY29uc3QgaXMgPSBpc0Ryb3Bkb3duQnRuKGl0ZW0sIGluZGV4KTtcbiAgICAgICAgaWYgKGlzKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGRvRHJvcGRvd25JdGVtQ2xpY2soJGV2ZW50OiBhbnkpIHtcbiAgICAgIGZvciAobGV0IGJ0biBvZiBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWUpIHtcbiAgICAgICAgaWYgKCRldmVudCA9PT0gYnRuLmtleSkge1xuICAgICAgICAgIGRvQ2xpY2soYnRuKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZERyb3Bkb3duQmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IGJpbmRpbmc6IGFueSA9IHt9O1xuICAgICAgaWYgKHVpLmRyb3Bkb3duLnJlbmRlck1vZGUgIT09IFwic2xvdFwiKSB7XG4gICAgICAgIC8vIG5haXZlIOmAmui/h29wdGlvbnPphY3nva7mnaXmmL7npLrlrZDpoblcbiAgICAgICAgY29uc3QgYnRucyA9IGNvbXB1dGVkSGFuZGxlQnRucy52YWx1ZTtcbiAgICAgICAgY29uc3Qgb3B0czogQnV0dG9uUHJvcHNbXSA9IFtdO1xuICAgICAgICBmb3JFYWNoKGJ0bnMsICh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodmFsdWUuc2hvdyAhPT0gZmFsc2UgJiYgaXNEcm9wZG93bkJ0bih2YWx1ZSwgaW5kZXgpKSB7XG4gICAgICAgICAgICBvcHRzLnB1c2goe1xuICAgICAgICAgICAgICBbdWkuZHJvcGRvd24udmFsdWVdOiB2YWx1ZS5rZXksXG4gICAgICAgICAgICAgIFt1aS5kcm9wZG93bi5sYWJlbF06IHZhbHVlLnRleHQsXG4gICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZS50aXRsZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYmluZGluZy5vcHRpb25zID0gb3B0cztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9taXQocHJvcHMuZHJvcGRvd24sIFwibW9yZVwiLCBcImF0TGVhc3RcIiksXG4gICAgICAgIC4uLnVpLmRyb3Bkb3duLmNvbW1hbmQoZG9Ecm9wZG93bkl0ZW1DbGljayksXG4gICAgICAgIC4uLmJpbmRpbmdcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICBoYXNEcm9wZG93bkJ0bixcbiAgICAgIGNvbXB1dGVkSGFuZGxlQnRucyxcbiAgICAgIGRvRHJvcGRvd25JdGVtQ2xpY2ssXG4gICAgICBjb21wdXRlZERyb3Bkb3duQXRMZWFzdCxcbiAgICAgIGRvQ2xpY2ssXG4gICAgICBpc0Ryb3Bkb3duQnRuLFxuICAgICAgc2NvcGVSZWYsXG4gICAgICBjb21wdXRlZERyb3Bkb3duQmluZGluZ1xuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXJvdy1oYW5kbGUge1xuICAvLyBkaXNwbGF5OiBmbGV4IDsgLy8g6L+Z6YeM5LiN6IO955SoZmxleO+8jOWQpuWImeS8muegtOWdj2FsaWduOmNlbnRlcumFjee9rlxuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAuZWwtYnV0dG9uICsgLmVsLWJ1dHRvbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDJweDtcbiAgfVxuICAmID4gKiB7XG4gICAgbWFyZ2luOiAycHg7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxuICAuZnMtcm93LWhhbmRsZS1kcm9wZG93bi1pdGVtIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgLm4tYnV0dG9uIHtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG1hcmdpbjogMnB4O1xuICB9XG5cbiAgLnJvdy1oYW5kbGUtYnRuIHtcbiAgICAuZnMtaWNvbiB7XG4gICAgICBtYXJnaW46IGF1dG87XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG5cbiAgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG5cbiAgdHJ5IHtcbiAgICBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gIGlmIChfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkpIHtcbiAgICBfY29uc3RydWN0ID0gUmVmbGVjdC5jb25zdHJ1Y3QuYmluZCgpO1xuICB9IGVsc2Uge1xuICAgIF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlRnVuY3Rpb24oZm4pIHtcbiAgcmV0dXJuIEZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoZm4pLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiID8gbmV3IE1hcCgpIDogdW5kZWZpbmVkO1xuXG4gIF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gICAgaWYgKENsYXNzID09PSBudWxsIHx8ICFfaXNOYXRpdmVGdW5jdGlvbihDbGFzcykpIHJldHVybiBDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihXcmFwcGVyLCBDbGFzcyk7XG4gIH07XG5cbiAgcmV0dXJuIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpO1xufVxuXG4vKiBlc2xpbnQgbm8tY29uc29sZTowICovXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbnZhciB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZygpIHt9OyAvLyBkb24ndCBwcmludCB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBpbiBwcm9kdWN0aW9uIGVudiBvciBub2RlIHJ1bnRpbWVcblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgd2FybmluZyA9IGZ1bmN0aW9uIHdhcm5pbmcodHlwZSwgZXJyb3JzKSB7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLndhcm4gJiYgdHlwZW9mIEFTWU5DX1ZBTElEQVRPUl9OT19XQVJOSU5HID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGVycm9ycy5ldmVyeShmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdzdHJpbmcnO1xuICAgICAgfSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKHR5cGUsIGVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKSB7XG4gIGlmICghZXJyb3JzIHx8ICFlcnJvcnMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgdmFyIGZpZWxkcyA9IHt9O1xuICBlcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICB2YXIgZmllbGQgPSBlcnJvci5maWVsZDtcbiAgICBmaWVsZHNbZmllbGRdID0gZmllbGRzW2ZpZWxkXSB8fCBbXTtcbiAgICBmaWVsZHNbZmllbGRdLnB1c2goZXJyb3IpO1xuICB9KTtcbiAgcmV0dXJuIGZpZWxkcztcbn1cbmZ1bmN0aW9uIGZvcm1hdCh0ZW1wbGF0ZSkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgaSA9IDA7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcblxuICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRlbXBsYXRlLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgc3RyID0gdGVtcGxhdGUucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uICh4KSB7XG4gICAgICBpZiAoeCA9PT0gJyUlJykge1xuICAgICAgICByZXR1cm4gJyUnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaSA+PSBsZW4pIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoeCkge1xuICAgICAgICBjYXNlICclcyc6XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuXG4gICAgICAgIGNhc2UgJyVkJzpcbiAgICAgICAgICByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG5cbiAgICAgICAgY2FzZSAnJWonOlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHJldHVybiB0ZW1wbGF0ZTtcbn1cblxuZnVuY3Rpb24gaXNOYXRpdmVTdHJpbmdUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICd1cmwnIHx8IHR5cGUgPT09ICdoZXgnIHx8IHR5cGUgPT09ICdlbWFpbCcgfHwgdHlwZSA9PT0gJ2RhdGUnIHx8IHR5cGUgPT09ICdwYXR0ZXJuJztcbn1cblxuZnVuY3Rpb24gaXNFbXB0eVZhbHVlKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gJ2FycmF5JyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAhdmFsdWUubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNOYXRpdmVTdHJpbmdUeXBlKHR5cGUpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIGNhbGxiYWNrKSB7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNvdW50KGVycm9ycykge1xuICAgIHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMgfHwgW10pO1xuICAgIHRvdGFsKys7XG5cbiAgICBpZiAodG90YWwgPT09IGFyckxlbmd0aCkge1xuICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgfVxuICB9XG5cbiAgYXJyLmZvckVhY2goZnVuY3Rpb24gKGEpIHtcbiAgICBmdW5jKGEsIGNvdW50KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFzeW5jU2VyaWFsQXJyYXkoYXJyLCBmdW5jLCBjYWxsYmFjaykge1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDtcblxuICBmdW5jdGlvbiBuZXh0KGVycm9ycykge1xuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xuICAgICAgY2FsbGJhY2soZXJyb3JzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb3JpZ2luYWwgPSBpbmRleDtcbiAgICBpbmRleCA9IGluZGV4ICsgMTtcblxuICAgIGlmIChvcmlnaW5hbCA8IGFyckxlbmd0aCkge1xuICAgICAgZnVuYyhhcnJbb3JpZ2luYWxdLCBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2soW10pO1xuICAgIH1cbiAgfVxuXG4gIG5leHQoW10pO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuT2JqQXJyKG9iakFycikge1xuICB2YXIgcmV0ID0gW107XG4gIE9iamVjdC5rZXlzKG9iakFycikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgIHJldC5wdXNoLmFwcGx5KHJldCwgb2JqQXJyW2tdIHx8IFtdKTtcbiAgfSk7XG4gIHJldHVybiByZXQ7XG59XG5cbnZhciBBc3luY1ZhbGlkYXRpb25FcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0Vycm9yKSB7XG4gIF9pbmhlcml0c0xvb3NlKEFzeW5jVmFsaWRhdGlvbkVycm9yLCBfRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIEFzeW5jVmFsaWRhdGlvbkVycm9yKGVycm9ycywgZmllbGRzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfRXJyb3IuY2FsbCh0aGlzLCAnQXN5bmMgVmFsaWRhdGlvbiBFcnJvcicpIHx8IHRoaXM7XG4gICAgX3RoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIF90aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICByZXR1cm4gQXN5bmNWYWxpZGF0aW9uRXJyb3I7XG59KCAvKiNfX1BVUkVfXyovX3dyYXBOYXRpdmVTdXBlcihFcnJvcikpO1xuZnVuY3Rpb24gYXN5bmNNYXAob2JqQXJyLCBvcHRpb24sIGZ1bmMsIGNhbGxiYWNrLCBzb3VyY2UpIHtcbiAgaWYgKG9wdGlvbi5maXJzdCkge1xuICAgIHZhciBfcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyb3JzKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPyByZWplY3QobmV3IEFzeW5jVmFsaWRhdGlvbkVycm9yKGVycm9ycywgY29udmVydEZpZWxkc0Vycm9yKGVycm9ycykpKSA6IHJlc29sdmUoc291cmNlKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBmbGF0dGVuQXJyID0gZmxhdHRlbk9iakFycihvYmpBcnIpO1xuICAgICAgYXN5bmNTZXJpYWxBcnJheShmbGF0dGVuQXJyLCBmdW5jLCBuZXh0KTtcbiAgICB9KTtcblxuICAgIF9wZW5kaW5nW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9wZW5kaW5nO1xuICB9XG5cbiAgdmFyIGZpcnN0RmllbGRzID0gb3B0aW9uLmZpcnN0RmllbGRzID09PSB0cnVlID8gT2JqZWN0LmtleXMob2JqQXJyKSA6IG9wdGlvbi5maXJzdEZpZWxkcyB8fCBbXTtcbiAgdmFyIG9iakFycktleXMgPSBPYmplY3Qua2V5cyhvYmpBcnIpO1xuICB2YXIgb2JqQXJyTGVuZ3RoID0gb2JqQXJyS2V5cy5sZW5ndGg7XG4gIHZhciB0b3RhbCA9IDA7XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBwZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciBuZXh0ID0gZnVuY3Rpb24gbmV4dChlcnJvcnMpIHtcbiAgICAgIHJlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLCBlcnJvcnMpO1xuICAgICAgdG90YWwrKztcblxuICAgICAgaWYgKHRvdGFsID09PSBvYmpBcnJMZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA/IHJlamVjdChuZXcgQXN5bmNWYWxpZGF0aW9uRXJyb3IocmVzdWx0cywgY29udmVydEZpZWxkc0Vycm9yKHJlc3VsdHMpKSkgOiByZXNvbHZlKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghb2JqQXJyS2V5cy5sZW5ndGgpIHtcbiAgICAgIGNhbGxiYWNrKHJlc3VsdHMpO1xuICAgICAgcmVzb2x2ZShzb3VyY2UpO1xuICAgIH1cblxuICAgIG9iakFycktleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgYXJyID0gb2JqQXJyW2tleV07XG5cbiAgICAgIGlmIChmaXJzdEZpZWxkcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgIGFzeW5jU2VyaWFsQXJyYXkoYXJyLCBmdW5jLCBuZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzeW5jUGFyYWxsZWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcGVuZGluZ1tcImNhdGNoXCJdKGZ1bmN0aW9uIChlKSB7XG4gICAgcmV0dXJuIGU7XG4gIH0pO1xuICByZXR1cm4gcGVuZGluZztcbn1cblxuZnVuY3Rpb24gaXNFcnJvck9iaihvYmopIHtcbiAgcmV0dXJuICEhKG9iaiAmJiBvYmoubWVzc2FnZSAhPT0gdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUodmFsdWUsIHBhdGgpIHtcbiAgdmFyIHYgPSB2YWx1ZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2O1xuICAgIH1cblxuICAgIHYgPSB2W3BhdGhbaV1dO1xuICB9XG5cbiAgcmV0dXJuIHY7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZW1lbnRFcnJvcihydWxlLCBzb3VyY2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvZSkge1xuICAgIHZhciBmaWVsZFZhbHVlO1xuXG4gICAgaWYgKHJ1bGUuZnVsbEZpZWxkcykge1xuICAgICAgZmllbGRWYWx1ZSA9IGdldFZhbHVlKHNvdXJjZSwgcnVsZS5mdWxsRmllbGRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmllbGRWYWx1ZSA9IHNvdXJjZVtvZS5maWVsZCB8fCBydWxlLmZ1bGxGaWVsZF07XG4gICAgfVxuXG4gICAgaWYgKGlzRXJyb3JPYmoob2UpKSB7XG4gICAgICBvZS5maWVsZCA9IG9lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkO1xuICAgICAgb2UuZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWU7XG4gICAgICByZXR1cm4gb2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHR5cGVvZiBvZSA9PT0gJ2Z1bmN0aW9uJyA/IG9lKCkgOiBvZSxcbiAgICAgIGZpZWxkVmFsdWU6IGZpZWxkVmFsdWUsXG4gICAgICBmaWVsZDogb2UuZmllbGQgfHwgcnVsZS5mdWxsRmllbGRcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gZGVlcE1lcmdlKHRhcmdldCwgc291cmNlKSB7XG4gIGlmIChzb3VyY2UpIHtcbiAgICBmb3IgKHZhciBzIGluIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShzKSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vbc107XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRhcmdldFtzXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0YXJnZXRbc10gPSBfZXh0ZW5kcyh7fSwgdGFyZ2V0W3NdLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W3NdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG52YXIgcmVxdWlyZWQkMSA9IGZ1bmN0aW9uIHJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgdHlwZSkge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKSB8fCBpc0VtcHR5VmFsdWUodmFsdWUsIHR5cGUgfHwgcnVsZS50eXBlKSkpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy5yZXF1aXJlZCwgcnVsZS5mdWxsRmllbGQpKTtcbiAgfVxufTtcblxuLyoqXG4gKiAgUnVsZSBmb3IgdmFsaWRhdGluZyB3aGl0ZXNwYWNlLlxuICpcbiAqICBAcGFyYW0gcnVsZSBUaGUgdmFsaWRhdGlvbiBydWxlLlxuICogIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9uIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgYmVpbmcgdmFsaWRhdGVkLlxuICogIEBwYXJhbSBlcnJvcnMgQW4gYXJyYXkgb2YgZXJyb3JzIHRoYXQgdGhpcyBydWxlIG1heSBhZGRcbiAqICB2YWxpZGF0aW9uIGVycm9ycyB0by5cbiAqICBAcGFyYW0gb3B0aW9ucyBUaGUgdmFsaWRhdGlvbiBvcHRpb25zLlxuICogIEBwYXJhbSBvcHRpb25zLm1lc3NhZ2VzIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICovXG5cbnZhciB3aGl0ZXNwYWNlID0gZnVuY3Rpb24gd2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgaWYgKC9eXFxzKyQvLnRlc3QodmFsdWUpIHx8IHZhbHVlID09PSAnJykge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLndoaXRlc3BhY2UsIHJ1bGUuZnVsbEZpZWxkKSk7XG4gIH1cbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rZXZ2YS91cmwtcmVnZXgvYmxvYi9tYXN0ZXIvaW5kZXguanNcbnZhciB1cmxSZWc7XG52YXIgZ2V0VXJsUmVnZXggPSAoZnVuY3Rpb24gKCkge1xuICBpZiAodXJsUmVnKSB7XG4gICAgcmV0dXJuIHVybFJlZztcbiAgfVxuXG4gIHZhciB3b3JkID0gJ1thLWZBLUZcXFxcZDpdJztcblxuICB2YXIgYiA9IGZ1bmN0aW9uIGIob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZUJvdW5kYXJpZXMgPyBcIig/Oig/PD1cXFxcc3xeKSg/PVwiICsgd29yZCArIFwiKXwoPzw9XCIgKyB3b3JkICsgXCIpKD89XFxcXHN8JCkpXCIgOiAnJztcbiAgfTtcblxuICB2YXIgdjQgPSAnKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSg/OlxcXFwuKD86MjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XVxcXFxkfFxcXFxkKSl7M30nO1xuICB2YXIgdjZzZWcgPSAnW2EtZkEtRlxcXFxkXXsxLDR9JztcbiAgdmFyIHY2ID0gKFwiXFxuKD86XFxuKD86XCIgKyB2NnNlZyArIFwiOil7N30oPzpcIiArIHY2c2VnICsgXCJ8Oil8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMToyOjM6NDo1OjY6Nzo6ICAxOjI6Mzo0OjU6Njo3OjhcXG4oPzpcIiArIHY2c2VnICsgXCI6KXs2fSg/OlwiICsgdjQgKyBcInw6XCIgKyB2NnNlZyArIFwifDopfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMToyOjM6NDo1OjY6OiAgICAxOjI6Mzo0OjU6Njo6OCAgIDE6MjozOjQ6NTo2Ojo4ICAxOjI6Mzo0OjU6Njo6MS4yLjMuNFxcbig/OlwiICsgdjZzZWcgKyBcIjopezV9KD86OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDJ9fDopfCAgICAgICAgICAgICAgICAgICAvLyAxOjI6Mzo0OjU6OiAgICAgIDE6MjozOjQ6NTo6Nzo4ICAgMToyOjM6NDo1Ojo4ICAgIDE6MjozOjQ6NTo6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7NH0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDF9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDN9fDopfCAvLyAxOjI6Mzo0OjogICAgICAgIDE6MjozOjQ6OjY6Nzo4ICAgMToyOjM6NDo6OCAgICAgIDE6MjozOjQ6OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7M30oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDJ9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDR9fDopfCAvLyAxOjI6Mzo6ICAgICAgICAgIDE6MjozOjo1OjY6Nzo4ICAgMToyOjM6OjggICAgICAgIDE6MjozOjo1OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7Mn0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDN9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDV9fDopfCAvLyAxOjI6OiAgICAgICAgICAgIDE6Mjo6NDo1OjY6Nzo4ICAgMToyOjo4ICAgICAgICAgIDE6Mjo6NDo1OjY6NzoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7MX0oPzooPzo6XCIgKyB2NnNlZyArIFwiKXswLDR9OlwiICsgdjQgKyBcInwoPzo6XCIgKyB2NnNlZyArIFwiKXsxLDZ9fDopfCAvLyAxOjogICAgICAgICAgICAgIDE6OjM6NDo1OjY6Nzo4ICAgMTo6OCAgICAgICAgICAgIDE6OjM6NDo1OjY6NzoxLjIuMy40XFxuKD86Oig/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsNX06XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsN318OikpICAgICAgICAgICAgIC8vIDo6MjozOjQ6NTo2Ojc6OCAgOjoyOjM6NDo1OjY6Nzo4ICA6OjggICAgICAgICAgICAgOjoxLjIuMy40XFxuKSg/OiVbMC05YS16QS1aXXsxLH0pPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICVldGgwICAgICAgICAgICAgJTFcXG5cIikucmVwbGFjZSgvXFxzKlxcL1xcLy4qJC9nbSwgJycpLnJlcGxhY2UoL1xcbi9nLCAnJykudHJpbSgpOyAvLyBQcmUtY29tcGlsZSBvbmx5IHRoZSBleGFjdCByZWdleGVzIGJlY2F1c2UgYWRkaW5nIGEgZ2xvYmFsIGZsYWcgbWFrZSByZWdleGVzIHN0YXRlZnVsXG5cbiAgdmFyIHY0NkV4YWN0ID0gbmV3IFJlZ0V4cChcIig/Ol5cIiArIHY0ICsgXCIkKXwoPzpeXCIgKyB2NiArIFwiJClcIik7XG4gIHZhciB2NGV4YWN0ID0gbmV3IFJlZ0V4cChcIl5cIiArIHY0ICsgXCIkXCIpO1xuICB2YXIgdjZleGFjdCA9IG5ldyBSZWdFeHAoXCJeXCIgKyB2NiArIFwiJFwiKTtcblxuICB2YXIgaXAgPSBmdW5jdGlvbiBpcChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5leGFjdCA/IHY0NkV4YWN0IDogbmV3IFJlZ0V4cChcIig/OlwiICsgYihvcHRpb25zKSArIHY0ICsgYihvcHRpb25zKSArIFwiKXwoPzpcIiArIGIob3B0aW9ucykgKyB2NiArIGIob3B0aW9ucykgKyBcIilcIiwgJ2cnKTtcbiAgfTtcblxuICBpcC52NCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5leGFjdCA/IHY0ZXhhY3QgOiBuZXcgUmVnRXhwKFwiXCIgKyBiKG9wdGlvbnMpICsgdjQgKyBiKG9wdGlvbnMpLCAnZycpO1xuICB9O1xuXG4gIGlwLnY2ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmV4YWN0ID8gdjZleGFjdCA6IG5ldyBSZWdFeHAoXCJcIiArIGIob3B0aW9ucykgKyB2NiArIGIob3B0aW9ucyksICdnJyk7XG4gIH07XG5cbiAgdmFyIHByb3RvY29sID0gXCIoPzooPzpbYS16XSs6KT8vLylcIjtcbiAgdmFyIGF1dGggPSAnKD86XFxcXFMrKD86OlxcXFxTKik/QCk/JztcbiAgdmFyIGlwdjQgPSBpcC52NCgpLnNvdXJjZTtcbiAgdmFyIGlwdjYgPSBpcC52NigpLnNvdXJjZTtcbiAgdmFyIGhvc3QgPSBcIig/Oig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XVstX10qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKVwiO1xuICB2YXIgZG9tYWluID0gXCIoPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XS0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSpcIjtcbiAgdmFyIHRsZCA9IFwiKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZl17Mix9KSlcIjtcbiAgdmFyIHBvcnQgPSAnKD86OlxcXFxkezIsNX0pPyc7XG4gIHZhciBwYXRoID0gJyg/OlsvPyNdW15cXFxcc1wiXSopPyc7XG4gIHZhciByZWdleCA9IFwiKD86XCIgKyBwcm90b2NvbCArIFwifHd3d1xcXFwuKVwiICsgYXV0aCArIFwiKD86bG9jYWxob3N0fFwiICsgaXB2NCArIFwifFwiICsgaXB2NiArIFwifFwiICsgaG9zdCArIGRvbWFpbiArIHRsZCArIFwiKVwiICsgcG9ydCArIHBhdGg7XG4gIHVybFJlZyA9IG5ldyBSZWdFeHAoXCIoPzpeXCIgKyByZWdleCArIFwiJClcIiwgJ2knKTtcbiAgcmV0dXJuIHVybFJlZztcbn0pO1xuXG4vKiBlc2xpbnQgbWF4LWxlbjowICovXG5cbnZhciBwYXR0ZXJuJDIgPSB7XG4gIC8vIGh0dHA6Ly9lbWFpbHJlZ2V4LmNvbS9cbiAgZW1haWw6IC9eKChbXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfV0pfCgoW2EtekEtWlxcLTAtOVxcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0rXFwuKStbYS16QS1aXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXXsyLH0pKSQvLFxuICAvLyB1cmw6IG5ldyBSZWdFeHAoXG4gIC8vICAgJ14oPyFtYWlsdG86KSg/Oig/Omh0dHB8aHR0cHN8ZnRwKTovL3wvLykoPzpcXFxcUysoPzo6XFxcXFMqKT9AKT8oPzooPzooPzpbMS05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAxXVxcXFxkfDIyWzAtM10pKD86XFxcXC4oPzoxP1xcXFxkezEsMn18MlswLTRdXFxcXGR8MjVbMC01XSkpezJ9KD86XFxcXC4oPzpbMC05XVxcXFxkP3wxXFxcXGRcXFxcZHwyWzAtNF1cXFxcZHwyNVswLTRdKSl8KD86KD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSg/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldKy0qKSpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rKSooPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH0pKSl8bG9jYWxob3N0KSg/OjpcXFxcZHsyLDV9KT8oPzooL3xcXFxcP3wjKVteXFxcXHNdKik/JCcsXG4gIC8vICAgJ2knLFxuICAvLyApLFxuICBoZXg6IC9eIz8oW2EtZjAtOV17Nn18W2EtZjAtOV17M30pJC9pXG59O1xudmFyIHR5cGVzID0ge1xuICBpbnRlZ2VyOiBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVzLm51bWJlcih2YWx1ZSkgJiYgcGFyc2VJbnQodmFsdWUsIDEwKSA9PT0gdmFsdWU7XG4gIH0sXG4gIFwiZmxvYXRcIjogZnVuY3Rpb24gZmxvYXQodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZXMubnVtYmVyKHZhbHVlKSAmJiAhdHlwZXMuaW50ZWdlcih2YWx1ZSk7XG4gIH0sXG4gIGFycmF5OiBmdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfSxcbiAgcmVnZXhwOiBmdW5jdGlvbiByZWdleHAodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISFuZXcgUmVnRXhwKHZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuICBkYXRlOiBmdW5jdGlvbiBkYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZS5nZXRUaW1lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS5nZXRNb250aCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuZ2V0WWVhciA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbiAgfSxcbiAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIG9iamVjdDogZnVuY3Rpb24gb2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXR5cGVzLmFycmF5KHZhbHVlKTtcbiAgfSxcbiAgbWV0aG9kOiBmdW5jdGlvbiBtZXRob2QodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuICB9LFxuICBlbWFpbDogZnVuY3Rpb24gZW1haWwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPD0gMzIwICYmICEhdmFsdWUubWF0Y2gocGF0dGVybiQyLmVtYWlsKTtcbiAgfSxcbiAgdXJsOiBmdW5jdGlvbiB1cmwodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPD0gMjA0OCAmJiAhIXZhbHVlLm1hdGNoKGdldFVybFJlZ2V4KCkpO1xuICB9LFxuICBoZXg6IGZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICEhdmFsdWUubWF0Y2gocGF0dGVybiQyLmhleCk7XG4gIH1cbn07XG5cbnZhciB0eXBlJDEgPSBmdW5jdGlvbiB0eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBpZiAocnVsZS5yZXF1aXJlZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVxdWlyZWQkMShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjdXN0b20gPSBbJ2ludGVnZXInLCAnZmxvYXQnLCAnYXJyYXknLCAncmVnZXhwJywgJ29iamVjdCcsICdtZXRob2QnLCAnZW1haWwnLCAnbnVtYmVyJywgJ2RhdGUnLCAndXJsJywgJ2hleCddO1xuICB2YXIgcnVsZVR5cGUgPSBydWxlLnR5cGU7XG5cbiAgaWYgKGN1c3RvbS5pbmRleE9mKHJ1bGVUeXBlKSA+IC0xKSB7XG4gICAgaWYgKCF0eXBlc1tydWxlVHlwZV0odmFsdWUpKSB7XG4gICAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcbiAgICB9IC8vIHN0cmFpZ2h0IHR5cGVvZiBjaGVja1xuXG4gIH0gZWxzZSBpZiAocnVsZVR5cGUgJiYgdHlwZW9mIHZhbHVlICE9PSBydWxlLnR5cGUpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlcy50eXBlc1tydWxlVHlwZV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLnR5cGUpKTtcbiAgfVxufTtcblxudmFyIHJhbmdlID0gZnVuY3Rpb24gcmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIHZhciBsZW4gPSB0eXBlb2YgcnVsZS5sZW4gPT09ICdudW1iZXInO1xuICB2YXIgbWluID0gdHlwZW9mIHJ1bGUubWluID09PSAnbnVtYmVyJztcbiAgdmFyIG1heCA9IHR5cGVvZiBydWxlLm1heCA9PT0gJ251bWJlcic7IC8vIOato+WImeWMuemFjeeggeeCueiMg+WbtOS7jlUrMDEwMDAw5LiA55u05YiwVSsxMEZGRkbnmoTmloflrZfvvIjooaXlhYXlubPpnaJTdXBwbGVtZW50YXJ5IFBsYW5l77yJXG5cbiAgdmFyIHNwUmVnZXhwID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZztcbiAgdmFyIHZhbCA9IHZhbHVlO1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIHZhciBzdHIgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICB2YXIgYXJyID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG5cbiAgaWYgKG51bSkge1xuICAgIGtleSA9ICdudW1iZXInO1xuICB9IGVsc2UgaWYgKHN0cikge1xuICAgIGtleSA9ICdzdHJpbmcnO1xuICB9IGVsc2UgaWYgKGFycikge1xuICAgIGtleSA9ICdhcnJheSc7XG4gIH0gLy8gaWYgdGhlIHZhbHVlIGlzIG5vdCBvZiBhIHN1cHBvcnRlZCB0eXBlIGZvciByYW5nZSB2YWxpZGF0aW9uXG4gIC8vIHRoZSB2YWxpZGF0aW9uIHJ1bGUgcnVsZSBzaG91bGQgdXNlIHRoZVxuICAvLyB0eXBlIHByb3BlcnR5IHRvIGFsc28gdGVzdCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGVcblxuXG4gIGlmICgha2V5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGFycikge1xuICAgIHZhbCA9IHZhbHVlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChzdHIpIHtcbiAgICAvLyDlpITnkIbnoIHngrnlpKfkuo5VKzAxMDAwMOeahOaWh+Wtl2xlbmd0aOWxnuaAp+S4jeWHhuehrueahGJ1Z++8jOWmglwi8KCut/CgrrfwoK63XCIubGVuZ2h0ICE9PSAzXG4gICAgdmFsID0gdmFsdWUucmVwbGFjZShzcFJlZ2V4cCwgJ18nKS5sZW5ndGg7XG4gIH1cblxuICBpZiAobGVuKSB7XG4gICAgaWYgKHZhbCAhPT0gcnVsZS5sZW4pIHtcbiAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ubGVuLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5sZW4pKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobWluICYmICFtYXggJiYgdmFsIDwgcnVsZS5taW4pIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1pbiwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWluKSk7XG4gIH0gZWxzZSBpZiAobWF4ICYmICFtaW4gJiYgdmFsID4gcnVsZS5tYXgpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLm1heCwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWF4KSk7XG4gIH0gZWxzZSBpZiAobWluICYmIG1heCAmJiAodmFsIDwgcnVsZS5taW4gfHwgdmFsID4gcnVsZS5tYXgpKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5yYW5nZSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUubWluLCBydWxlLm1heCkpO1xuICB9XG59O1xuXG52YXIgRU5VTSQxID0gJ2VudW0nO1xuXG52YXIgZW51bWVyYWJsZSQxID0gZnVuY3Rpb24gZW51bWVyYWJsZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgcnVsZVtFTlVNJDFdID0gQXJyYXkuaXNBcnJheShydWxlW0VOVU0kMV0pID8gcnVsZVtFTlVNJDFdIDogW107XG5cbiAgaWYgKHJ1bGVbRU5VTSQxXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1tFTlVNJDFdLCBydWxlLmZ1bGxGaWVsZCwgcnVsZVtFTlVNJDFdLmpvaW4oJywgJykpKTtcbiAgfVxufTtcblxudmFyIHBhdHRlcm4kMSA9IGZ1bmN0aW9uIHBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIGlmIChydWxlLnBhdHRlcm4pIHtcbiAgICBpZiAocnVsZS5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBpZiBhIFJlZ0V4cCBpbnN0YW5jZSBpcyBwYXNzZWQsIHJlc2V0IGBsYXN0SW5kZXhgIGluIGNhc2UgaXRzIGBnbG9iYWxgXG4gICAgICAvLyBmbGFnIGlzIGFjY2lkZW50YWxseSBzZXQgdG8gYHRydWVgLCB3aGljaCBpbiBhIHZhbGlkYXRpb24gc2NlbmFyaW9cbiAgICAgIC8vIGlzIG5vdCBuZWNlc3NhcnkgYW5kIHRoZSByZXN1bHQgbWlnaHQgYmUgbWlzbGVhZGluZ1xuICAgICAgcnVsZS5wYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG5cbiAgICAgIGlmICghcnVsZS5wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnBhdHRlcm4ubWlzbWF0Y2gsIHJ1bGUuZnVsbEZpZWxkLCB2YWx1ZSwgcnVsZS5wYXR0ZXJuKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcnVsZS5wYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIF9wYXR0ZXJuID0gbmV3IFJlZ0V4cChydWxlLnBhdHRlcm4pO1xuXG4gICAgICBpZiAoIV9wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnBhdHRlcm4ubWlzbWF0Y2gsIHJ1bGUuZnVsbEZpZWxkLCB2YWx1ZSwgcnVsZS5wYXR0ZXJuKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgcnVsZXMgPSB7XG4gIHJlcXVpcmVkOiByZXF1aXJlZCQxLFxuICB3aGl0ZXNwYWNlOiB3aGl0ZXNwYWNlLFxuICB0eXBlOiB0eXBlJDEsXG4gIHJhbmdlOiByYW5nZSxcbiAgXCJlbnVtXCI6IGVudW1lcmFibGUkMSxcbiAgcGF0dGVybjogcGF0dGVybiQxXG59O1xuXG52YXIgc3RyaW5nID0gZnVuY3Rpb24gc3RyaW5nKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ3N0cmluZycpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsICdzdHJpbmcnKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5wYXR0ZXJuKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChydWxlLndoaXRlc3BhY2UgPT09IHRydWUpIHtcbiAgICAgICAgcnVsZXMud2hpdGVzcGFjZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgbWV0aG9kID0gZnVuY3Rpb24gbWV0aG9kKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgbnVtYmVyID0gZnVuY3Rpb24gbnVtYmVyKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIF9ib29sZWFuID0gZnVuY3Rpb24gX2Jvb2xlYW4ocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciByZWdleHAgPSBmdW5jdGlvbiByZWdleHAocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgaW50ZWdlciA9IGZ1bmN0aW9uIGludGVnZXIocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgZmxvYXRGbiA9IGZ1bmN0aW9uIGZsb2F0Rm4ocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgYXJyYXkgPSBmdW5jdGlvbiBhcnJheShydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmICgodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ2FycmF5Jyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIG9iamVjdCA9IGZ1bmN0aW9uIG9iamVjdChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIEVOVU0gPSAnZW51bSc7XG5cbnZhciBlbnVtZXJhYmxlID0gZnVuY3Rpb24gZW51bWVyYWJsZShydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzW0VOVU1dKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBwYXR0ZXJuID0gZnVuY3Rpb24gcGF0dGVybihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICghaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykpIHtcbiAgICAgIHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIGRhdGUgPSBmdW5jdGlvbiBkYXRlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdpbnRlZ2VyIHJ1bGUgY2FsbGVkICVqJywgcnVsZSk7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7IC8vIGNvbnNvbGUubG9nKCd2YWxpZGF0ZSBvbiAlcyB2YWx1ZScsIHZhbHVlKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnZGF0ZScpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdkYXRlJykpIHtcbiAgICAgIHZhciBkYXRlT2JqZWN0O1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGVPYmplY3QgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgZGF0ZU9iamVjdCwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoZGF0ZU9iamVjdCkge1xuICAgICAgICBydWxlcy5yYW5nZShydWxlLCBkYXRlT2JqZWN0LmdldFRpbWUoKSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgcmVxdWlyZWQgPSBmdW5jdGlvbiByZXF1aXJlZChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB0eXBlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAnYXJyYXknIDogdHlwZW9mIHZhbHVlO1xuICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMsIHR5cGUpO1xuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHR5cGUgPSBmdW5jdGlvbiB0eXBlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBydWxlVHlwZSA9IHJ1bGUudHlwZTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCBydWxlVHlwZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgcnVsZVR5cGUpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsIHJ1bGVUeXBlKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgYW55ID0gZnVuY3Rpb24gYW55KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHZhbGlkYXRvcnMgPSB7XG4gIHN0cmluZzogc3RyaW5nLFxuICBtZXRob2Q6IG1ldGhvZCxcbiAgbnVtYmVyOiBudW1iZXIsXG4gIFwiYm9vbGVhblwiOiBfYm9vbGVhbixcbiAgcmVnZXhwOiByZWdleHAsXG4gIGludGVnZXI6IGludGVnZXIsXG4gIFwiZmxvYXRcIjogZmxvYXRGbixcbiAgYXJyYXk6IGFycmF5LFxuICBvYmplY3Q6IG9iamVjdCxcbiAgXCJlbnVtXCI6IGVudW1lcmFibGUsXG4gIHBhdHRlcm46IHBhdHRlcm4sXG4gIGRhdGU6IGRhdGUsXG4gIHVybDogdHlwZSxcbiAgaGV4OiB0eXBlLFxuICBlbWFpbDogdHlwZSxcbiAgcmVxdWlyZWQ6IHJlcXVpcmVkLFxuICBhbnk6IGFueVxufTtcblxuZnVuY3Rpb24gbmV3TWVzc2FnZXMoKSB7XG4gIHJldHVybiB7XG4gICAgXCJkZWZhdWx0XCI6ICdWYWxpZGF0aW9uIGVycm9yIG9uIGZpZWxkICVzJyxcbiAgICByZXF1aXJlZDogJyVzIGlzIHJlcXVpcmVkJyxcbiAgICBcImVudW1cIjogJyVzIG11c3QgYmUgb25lIG9mICVzJyxcbiAgICB3aGl0ZXNwYWNlOiAnJXMgY2Fubm90IGJlIGVtcHR5JyxcbiAgICBkYXRlOiB7XG4gICAgICBmb3JtYXQ6ICclcyBkYXRlICVzIGlzIGludmFsaWQgZm9yIGZvcm1hdCAlcycsXG4gICAgICBwYXJzZTogJyVzIGRhdGUgY291bGQgbm90IGJlIHBhcnNlZCwgJXMgaXMgaW52YWxpZCAnLFxuICAgICAgaW52YWxpZDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCdcbiAgICB9LFxuICAgIHR5cGVzOiB7XG4gICAgICBzdHJpbmc6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBtZXRob2Q6ICclcyBpcyBub3QgYSAlcyAoZnVuY3Rpb24pJyxcbiAgICAgIGFycmF5OiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIG9iamVjdDogJyVzIGlzIG5vdCBhbiAlcycsXG4gICAgICBudW1iZXI6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBkYXRlOiAnJXMgaXMgbm90IGEgJXMnLFxuICAgICAgXCJib29sZWFuXCI6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBpbnRlZ2VyOiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIFwiZmxvYXRcIjogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIHJlZ2V4cDogJyVzIGlzIG5vdCBhIHZhbGlkICVzJyxcbiAgICAgIGVtYWlsOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgdXJsOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgaGV4OiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnXG4gICAgfSxcbiAgICBzdHJpbmc6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBjaGFyYWN0ZXJzJyxcbiAgICAgIG1pbjogJyVzIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycsXG4gICAgICBtYXg6ICclcyBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gJXMgY2hhcmFjdGVycycsXG4gICAgICByYW5nZTogJyVzIG11c3QgYmUgYmV0d2VlbiAlcyBhbmQgJXMgY2hhcmFjdGVycydcbiAgICB9LFxuICAgIG51bWJlcjoge1xuICAgICAgbGVuOiAnJXMgbXVzdCBlcXVhbCAlcycsXG4gICAgICBtaW46ICclcyBjYW5ub3QgYmUgbGVzcyB0aGFuICVzJyxcbiAgICAgIG1heDogJyVzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJXMnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzJ1xuICAgIH0sXG4gICAgYXJyYXk6IHtcbiAgICAgIGxlbjogJyVzIG11c3QgYmUgZXhhY3RseSAlcyBpbiBsZW5ndGgnLFxuICAgICAgbWluOiAnJXMgY2Fubm90IGJlIGxlc3MgdGhhbiAlcyBpbiBsZW5ndGgnLFxuICAgICAgbWF4OiAnJXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAlcyBpbiBsZW5ndGgnLFxuICAgICAgcmFuZ2U6ICclcyBtdXN0IGJlIGJldHdlZW4gJXMgYW5kICVzIGluIGxlbmd0aCdcbiAgICB9LFxuICAgIHBhdHRlcm46IHtcbiAgICAgIG1pc21hdGNoOiAnJXMgdmFsdWUgJXMgZG9lcyBub3QgbWF0Y2ggcGF0dGVybiAlcydcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHZhciBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKTtcbiAgICAgIGNsb25lZC5jbG9uZSA9IHRoaXMuY2xvbmU7XG4gICAgICByZXR1cm4gY2xvbmVkO1xuICAgIH1cbiAgfTtcbn1cbnZhciBtZXNzYWdlcyA9IG5ld01lc3NhZ2VzKCk7XG5cbi8qKlxuICogIEVuY2Fwc3VsYXRlcyBhIHZhbGlkYXRpb24gc2NoZW1hLlxuICpcbiAqICBAcGFyYW0gZGVzY3JpcHRvciBBbiBvYmplY3QgZGVjbGFyaW5nIHZhbGlkYXRpb24gcnVsZXNcbiAqICBmb3IgdGhpcyBzY2hlbWEuXG4gKi9cblxudmFyIFNjaGVtYSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gU3RhdGljID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEluc3RhbmNlID09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBTY2hlbWEoZGVzY3JpcHRvcikge1xuICAgIHRoaXMucnVsZXMgPSBudWxsO1xuICAgIHRoaXMuX21lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgdGhpcy5kZWZpbmUoZGVzY3JpcHRvcik7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU2NoZW1hLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKHJ1bGVzKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICghcnVsZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbmZpZ3VyZSBhIHNjaGVtYSB3aXRoIG5vIHJ1bGVzJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBydWxlcyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShydWxlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUnVsZXMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bGVzID0ge307XG4gICAgT2JqZWN0LmtleXMocnVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBpdGVtID0gcnVsZXNbbmFtZV07XG4gICAgICBfdGhpcy5ydWxlc1tuYW1lXSA9IEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtIDogW2l0ZW1dO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5tZXNzYWdlcyA9IGZ1bmN0aW9uIG1lc3NhZ2VzKF9tZXNzYWdlcykge1xuICAgIGlmIChfbWVzc2FnZXMpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2VzID0gZGVlcE1lcmdlKG5ld01lc3NhZ2VzKCksIF9tZXNzYWdlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VzO1xuICB9O1xuXG4gIF9wcm90by52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKHNvdXJjZV8sIG8sIG9jKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAobyA9PT0gdm9pZCAwKSB7XG4gICAgICBvID0ge307XG4gICAgfVxuXG4gICAgaWYgKG9jID09PSB2b2lkIDApIHtcbiAgICAgIG9jID0gZnVuY3Rpb24gb2MoKSB7fTtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlID0gc291cmNlXztcbiAgICB2YXIgb3B0aW9ucyA9IG87XG4gICAgdmFyIGNhbGxiYWNrID0gb2M7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucnVsZXMgfHwgT2JqZWN0LmtleXModGhpcy5ydWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzb3VyY2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlKHJlc3VsdHMpIHtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIHZhciBmaWVsZHMgPSB7fTtcblxuICAgICAgZnVuY3Rpb24gYWRkKGUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgICAgICB2YXIgX2Vycm9ycztcblxuICAgICAgICAgIGVycm9ycyA9IChfZXJyb3JzID0gZXJyb3JzKS5jb25jYXQuYXBwbHkoX2Vycm9ycywgZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFkZChyZXN1bHRzW2ldKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHNvdXJjZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZHMgPSBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKTtcbiAgICAgICAgY2FsbGJhY2soZXJyb3JzLCBmaWVsZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1lc3NhZ2VzKSB7XG4gICAgICB2YXIgbWVzc2FnZXMkMSA9IHRoaXMubWVzc2FnZXMoKTtcblxuICAgICAgaWYgKG1lc3NhZ2VzJDEgPT09IG1lc3NhZ2VzKSB7XG4gICAgICAgIG1lc3NhZ2VzJDEgPSBuZXdNZXNzYWdlcygpO1xuICAgICAgfVxuXG4gICAgICBkZWVwTWVyZ2UobWVzc2FnZXMkMSwgb3B0aW9ucy5tZXNzYWdlcyk7XG4gICAgICBvcHRpb25zLm1lc3NhZ2VzID0gbWVzc2FnZXMkMTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5tZXNzYWdlcyA9IHRoaXMubWVzc2FnZXMoKTtcbiAgICB9XG5cbiAgICB2YXIgc2VyaWVzID0ge307XG4gICAgdmFyIGtleXMgPSBvcHRpb25zLmtleXMgfHwgT2JqZWN0LmtleXModGhpcy5ydWxlcyk7XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uICh6KSB7XG4gICAgICB2YXIgYXJyID0gX3RoaXMyLnJ1bGVzW3pdO1xuICAgICAgdmFyIHZhbHVlID0gc291cmNlW3pdO1xuICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgdmFyIHJ1bGUgPSByO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcnVsZS50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAoc291cmNlID09PSBzb3VyY2VfKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBfZXh0ZW5kcyh7fSwgc291cmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YWx1ZSA9IHNvdXJjZVt6XSA9IHJ1bGUudHJhbnNmb3JtKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJ1bGUgPSB7XG4gICAgICAgICAgICB2YWxpZGF0b3I6IHJ1bGVcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJ1bGUgPSBfZXh0ZW5kcyh7fSwgcnVsZSk7XG4gICAgICAgIH0gLy8gRmlsbCB2YWxpZGF0b3IuIFNraXAgaWYgbm90aGluZyBuZWVkIHRvIHZhbGlkYXRlXG5cblxuICAgICAgICBydWxlLnZhbGlkYXRvciA9IF90aGlzMi5nZXRWYWxpZGF0aW9uTWV0aG9kKHJ1bGUpO1xuXG4gICAgICAgIGlmICghcnVsZS52YWxpZGF0b3IpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBydWxlLmZpZWxkID0gejtcbiAgICAgICAgcnVsZS5mdWxsRmllbGQgPSBydWxlLmZ1bGxGaWVsZCB8fCB6O1xuICAgICAgICBydWxlLnR5cGUgPSBfdGhpczIuZ2V0VHlwZShydWxlKTtcbiAgICAgICAgc2VyaWVzW3pdID0gc2VyaWVzW3pdIHx8IFtdO1xuICAgICAgICBzZXJpZXNbel0ucHVzaCh7XG4gICAgICAgICAgcnVsZTogcnVsZSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZmllbGQ6IHpcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgZXJyb3JGaWVsZHMgPSB7fTtcbiAgICByZXR1cm4gYXN5bmNNYXAoc2VyaWVzLCBvcHRpb25zLCBmdW5jdGlvbiAoZGF0YSwgZG9JdCkge1xuICAgICAgdmFyIHJ1bGUgPSBkYXRhLnJ1bGU7XG4gICAgICB2YXIgZGVlcCA9IChydWxlLnR5cGUgPT09ICdvYmplY3QnIHx8IHJ1bGUudHlwZSA9PT0gJ2FycmF5JykgJiYgKHR5cGVvZiBydWxlLmZpZWxkcyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHJ1bGUuZGVmYXVsdEZpZWxkID09PSAnb2JqZWN0Jyk7XG4gICAgICBkZWVwID0gZGVlcCAmJiAocnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBkYXRhLnZhbHVlKTtcbiAgICAgIHJ1bGUuZmllbGQgPSBkYXRhLmZpZWxkO1xuXG4gICAgICBmdW5jdGlvbiBhZGRGdWxsRmllbGQoa2V5LCBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzY2hlbWEsIHtcbiAgICAgICAgICBmdWxsRmllbGQ6IHJ1bGUuZnVsbEZpZWxkICsgXCIuXCIgKyBrZXksXG4gICAgICAgICAgZnVsbEZpZWxkczogcnVsZS5mdWxsRmllbGRzID8gW10uY29uY2F0KHJ1bGUuZnVsbEZpZWxkcywgW2tleV0pIDogW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNiKGUpIHtcbiAgICAgICAgaWYgKGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGUgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBlcnJvckxpc3QgPSBBcnJheS5pc0FycmF5KGUpID8gZSA6IFtlXTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMuc3VwcHJlc3NXYXJuaW5nICYmIGVycm9yTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICBTY2hlbWEud2FybmluZygnYXN5bmMtdmFsaWRhdG9yOicsIGVycm9yTGlzdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3JMaXN0Lmxlbmd0aCAmJiBydWxlLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVycm9yTGlzdCA9IFtdLmNvbmNhdChydWxlLm1lc3NhZ2UpO1xuICAgICAgICB9IC8vIEZpbGwgZXJyb3IgaW5mb1xuXG5cbiAgICAgICAgdmFyIGZpbGxlZEVycm9ycyA9IGVycm9yTGlzdC5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUsIHNvdXJjZSkpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmZpcnN0ICYmIGZpbGxlZEVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICBlcnJvckZpZWxkc1tydWxlLmZpZWxkXSA9IDE7XG4gICAgICAgICAgcmV0dXJuIGRvSXQoZmlsbGVkRXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVlcCkge1xuICAgICAgICAgIGRvSXQoZmlsbGVkRXJyb3JzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiBydWxlIGlzIHJlcXVpcmVkIGJ1dCB0aGUgdGFyZ2V0IG9iamVjdFxuICAgICAgICAgIC8vIGRvZXMgbm90IGV4aXN0IGZhaWwgYXQgdGhlIHJ1bGUgbGV2ZWwgYW5kIGRvbid0XG4gICAgICAgICAgLy8gZ28gZGVlcGVyXG4gICAgICAgICAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgIWRhdGEudmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChydWxlLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBmaWxsZWRFcnJvcnMgPSBbXS5jb25jYXQocnVsZS5tZXNzYWdlKS5tYXAoY29tcGxlbWVudEVycm9yKHJ1bGUsIHNvdXJjZSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmVycm9yKSB7XG4gICAgICAgICAgICAgIGZpbGxlZEVycm9ycyA9IFtvcHRpb25zLmVycm9yKHJ1bGUsIGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnJlcXVpcmVkLCBydWxlLmZpZWxkKSldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZG9JdChmaWxsZWRFcnJvcnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBmaWVsZHNTY2hlbWEgPSB7fTtcblxuICAgICAgICAgIGlmIChydWxlLmRlZmF1bHRGaWVsZCkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YS52YWx1ZSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgZmllbGRzU2NoZW1hW2tleV0gPSBydWxlLmRlZmF1bHRGaWVsZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpZWxkc1NjaGVtYSA9IF9leHRlbmRzKHt9LCBmaWVsZHNTY2hlbWEsIGRhdGEucnVsZS5maWVsZHMpO1xuICAgICAgICAgIHZhciBwYXJlZEZpZWxkc1NjaGVtYSA9IHt9O1xuICAgICAgICAgIE9iamVjdC5rZXlzKGZpZWxkc1NjaGVtYSkuZm9yRWFjaChmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgICAgIHZhciBmaWVsZFNjaGVtYSA9IGZpZWxkc1NjaGVtYVtmaWVsZF07XG4gICAgICAgICAgICB2YXIgZmllbGRTY2hlbWFMaXN0ID0gQXJyYXkuaXNBcnJheShmaWVsZFNjaGVtYSkgPyBmaWVsZFNjaGVtYSA6IFtmaWVsZFNjaGVtYV07XG4gICAgICAgICAgICBwYXJlZEZpZWxkc1NjaGVtYVtmaWVsZF0gPSBmaWVsZFNjaGVtYUxpc3QubWFwKGFkZEZ1bGxGaWVsZC5iaW5kKG51bGwsIGZpZWxkKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIHNjaGVtYSA9IG5ldyBTY2hlbWEocGFyZWRGaWVsZHNTY2hlbWEpO1xuICAgICAgICAgIHNjaGVtYS5tZXNzYWdlcyhvcHRpb25zLm1lc3NhZ2VzKTtcblxuICAgICAgICAgIGlmIChkYXRhLnJ1bGUub3B0aW9ucykge1xuICAgICAgICAgICAgZGF0YS5ydWxlLm9wdGlvbnMubWVzc2FnZXMgPSBvcHRpb25zLm1lc3NhZ2VzO1xuICAgICAgICAgICAgZGF0YS5ydWxlLm9wdGlvbnMuZXJyb3IgPSBvcHRpb25zLmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVtYS52YWxpZGF0ZShkYXRhLnZhbHVlLCBkYXRhLnJ1bGUub3B0aW9ucyB8fCBvcHRpb25zLCBmdW5jdGlvbiAoZXJycykge1xuICAgICAgICAgICAgdmFyIGZpbmFsRXJyb3JzID0gW107XG5cbiAgICAgICAgICAgIGlmIChmaWxsZWRFcnJvcnMgJiYgZmlsbGVkRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBmaW5hbEVycm9ycy5wdXNoLmFwcGx5KGZpbmFsRXJyb3JzLCBmaWxsZWRFcnJvcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJycyAmJiBlcnJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBmaW5hbEVycm9ycy5wdXNoLmFwcGx5KGZpbmFsRXJyb3JzLCBlcnJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9JdChmaW5hbEVycm9ycy5sZW5ndGggPyBmaW5hbEVycm9ycyA6IG51bGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciByZXM7XG5cbiAgICAgIGlmIChydWxlLmFzeW5jVmFsaWRhdG9yKSB7XG4gICAgICAgIHJlcyA9IHJ1bGUuYXN5bmNWYWxpZGF0b3IocnVsZSwgZGF0YS52YWx1ZSwgY2IsIGRhdGEuc291cmNlLCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAocnVsZS52YWxpZGF0b3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXMgPSBydWxlLnZhbGlkYXRvcihydWxlLCBkYXRhLnZhbHVlLCBjYiwgZGF0YS5zb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnNvbGUuZXJyb3IoZXJyb3IpOyAvLyByZXRocm93IHRvIHJlcG9ydCBlcnJvclxuXG4gICAgICAgICAgaWYgKCFvcHRpb25zLnN1cHByZXNzVmFsaWRhdG9yRXJyb3IpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNiKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICAgIGNiKHR5cGVvZiBydWxlLm1lc3NhZ2UgPT09ICdmdW5jdGlvbicgPyBydWxlLm1lc3NhZ2UocnVsZS5mdWxsRmllbGQgfHwgcnVsZS5maWVsZCkgOiBydWxlLm1lc3NhZ2UgfHwgKHJ1bGUuZnVsbEZpZWxkIHx8IHJ1bGUuZmllbGQpICsgXCIgZmFpbHNcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBjYihyZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY2IocmVzLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXMgJiYgcmVzLnRoZW4pIHtcbiAgICAgICAgcmVzLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjYigpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBjYihlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIGNvbXBsZXRlKHJlc3VsdHMpO1xuICAgIH0sIHNvdXJjZSk7XG4gIH07XG5cbiAgX3Byb3RvLmdldFR5cGUgPSBmdW5jdGlvbiBnZXRUeXBlKHJ1bGUpIHtcbiAgICBpZiAocnVsZS50eXBlID09PSB1bmRlZmluZWQgJiYgcnVsZS5wYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBydWxlLnR5cGUgPSAncGF0dGVybic7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJyAmJiBydWxlLnR5cGUgJiYgIXZhbGlkYXRvcnMuaGFzT3duUHJvcGVydHkocnVsZS50eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdCgnVW5rbm93biBydWxlIHR5cGUgJXMnLCBydWxlLnR5cGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcnVsZS50eXBlIHx8ICdzdHJpbmcnO1xuICB9O1xuXG4gIF9wcm90by5nZXRWYWxpZGF0aW9uTWV0aG9kID0gZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbk1ldGhvZChydWxlKSB7XG4gICAgaWYgKHR5cGVvZiBydWxlLnZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHJ1bGUudmFsaWRhdG9yO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocnVsZSk7XG4gICAgdmFyIG1lc3NhZ2VJbmRleCA9IGtleXMuaW5kZXhPZignbWVzc2FnZScpO1xuXG4gICAgaWYgKG1lc3NhZ2VJbmRleCAhPT0gLTEpIHtcbiAgICAgIGtleXMuc3BsaWNlKG1lc3NhZ2VJbmRleCwgMSk7XG4gICAgfVxuXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAxICYmIGtleXNbMF0gPT09ICdyZXF1aXJlZCcpIHtcbiAgICAgIHJldHVybiB2YWxpZGF0b3JzLnJlcXVpcmVkO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3JzW3RoaXMuZ2V0VHlwZShydWxlKV0gfHwgdW5kZWZpbmVkO1xuICB9O1xuXG4gIHJldHVybiBTY2hlbWE7XG59KCk7XG5cblNjaGVtYS5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKHR5cGUsIHZhbGlkYXRvcikge1xuICBpZiAodHlwZW9mIHZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZ2lzdGVyIGEgdmFsaWRhdG9yIGJ5IHR5cGUsIHZhbGlkYXRvciBpcyBub3QgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFsaWRhdG9yc1t0eXBlXSA9IHZhbGlkYXRvcjtcbn07XG5cblNjaGVtYS53YXJuaW5nID0gd2FybmluZztcblNjaGVtYS5tZXNzYWdlcyA9IG1lc3NhZ2VzO1xuU2NoZW1hLnZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzO1xuXG5leHBvcnQgeyBTY2hlbWEgYXMgZGVmYXVsdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1lZGl0YWJsZVwiPlxuICAgIDxkaXYgdi1pZj1cIiFlZGl0aW5nIHx8IGRpc2FibGVkXCIgY2xhc3M9XCJmcy1lZGl0YWJsZS1pbm5lciBmcy1lZGl0YWJsZS1wb2ludGVyXCIgdi1iaW5kPVwiYWN0aXZlVHJpZ2dlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWVkaXRhYmxlLWlucHV0XCI+XG4gICAgICAgIDxkaXYgdi1pZj1cImRpcnR5XCIgY2xhc3M9XCJmcy1lZGl0YWJsZS1kaXJ0eVwiIC8+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiB2LWlmPVwidHJpZ2dlciAmJiAhZGlzYWJsZWRcIiBjbGFzcz1cImZzLWVkaXRhYmxlLWFjdGlvbiBmcy1lZGl0YWJsZS1pY29uXCI+XG4gICAgICAgIDxmcy1pY29uIDppY29uPVwidWkuaWNvbnMuZWRpdFwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHYtZWxzZSBjbGFzcz1cImZzLWVkaXRhYmxlLWlubmVyXCIgOmNsYXNzPVwieyAnZnMtdmFsaWRhdGUtZXJyb3InOiBoYXNFcnJvcigpIH1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1lZGl0YWJsZS1pbnB1dFwiPlxuICAgICAgICA8c2xvdCBuYW1lPVwiZWRpdFwiPjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWVkaXRhYmxlLWFjdGlvblwiPlxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnRvb2x0aXAubmFtZVwiPlxuICAgICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnRvb2x0aXAuY29udGVudF0+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yLWljb25cIj5cbiAgICAgICAgICAgICAge3sgZ2V0VmFsaWRhdGVFcnJvck1lc3NhZ2UoKSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPHRlbXBsYXRlICNbdWkudG9vbHRpcC50cmlnZ2VyXT5cbiAgICAgICAgICAgIDxmcy1pY29uIDpjbGFzcz1cInsgaGlkZGVuOiAhaGFzRXJyb3IoKSwgJ2Vycm9yLWljb24nOiB0cnVlIH1cIiBzaXplPVwibWluaVwiIDppY29uPVwidWkuaWNvbnMuaW5mb1wiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2hvd0FjdGlvblwiPlxuICAgICAgICAgIDxmcy1pY29uIHYtaWY9XCJsb2FkaW5nXCIgc2l6ZT1cIm1pbmlcIiA6c3Bpbj1cInRydWVcIiA6aWNvbj1cInVpLmljb25zLnJlZnJlc2hcIiAvPlxuICAgICAgICAgIDxmcy1pY29uIHYtZWxzZSBzaXplPVwibWluaVwiIDppY29uPVwidWkuaWNvbnMuY2hlY2tcIiBAY2xpY2s9XCJkb1N1Ym1pdFwiIC8+XG4gICAgICAgICAgPGZzLWljb24gOmNsYXNzPVwieyBoaWRkZW46IGxvYWRpbmcgfVwiIHNpemU9XCJtaW5pXCIgOmljb249XCJ1aS5pY29ucy5jbG9zZVwiIEBjbGljaz1cImRvQ2FuY2VsXCIgLz5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCJAZmFzdC1jcnVkL3VpLWludGVyZmFjZVwiO1xuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tIFwidnVlXCI7XG5cbnR5cGUgRnNFZGl0YWJsZVByb3BzID0ge1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGVkaXRpbmc6IGJvb2xlYW47XG4gIGRpcnR5PzogYm9vbGVhbjtcbiAgdHJpZ2dlcj86IFwib25DbGlja1wiIHwgXCJvbkRiQ2xpY2tcIiB8IGZhbHNlO1xuICBsb2FkaW5nPzogYm9vbGVhbjtcbiAgc2hvd0FjdGlvbj86IGJvb2xlYW47XG4gIHZhbGlkYXRlRXJyb3JzPzogYW55W107XG59O1xuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoZGVmaW5lUHJvcHM8RnNFZGl0YWJsZVByb3BzPigpLCB7XG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgZWRpdGluZzogZmFsc2UsXG4gIGRpcnR5OiBmYWxzZSxcbiAgbG9hZGluZzogZmFsc2UsXG4gIHNob3dBY3Rpb246IHRydWUsXG4gIHRyaWdnZXI6IFwib25DbGlja1wiLFxuICB2YWxpZGF0ZUVycm9yczogKCkgPT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxufSk7XG5cbmNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG5jb25zdCBlbWl0cyA9IGRlZmluZUVtaXRzKFtcInVwZGF0ZTplZGl0aW5nXCIsIFwic3VibWl0XCIsIFwiY2FuY2VsXCJdKTtcbmNvbnN0IGFjdGl2ZVRyaWdnZXIgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGlmICghcHJvcHMudHJpZ2dlcikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIFtwcm9wcy50cmlnZ2VyXTogKCkgPT4ge1xuICAgICAgZW1pdHMoXCJ1cGRhdGU6ZWRpdGluZ1wiLCB0cnVlKTtcbiAgICB9XG4gIH07XG59KTtcbmZ1bmN0aW9uIGRvU3VibWl0KCkge1xuICBlbWl0cyhcInN1Ym1pdFwiKTtcbn1cbmZ1bmN0aW9uIGRvQ2FuY2VsKCkge1xuICBlbWl0cyhcImNhbmNlbFwiKTtcbn1cbmZ1bmN0aW9uIGhhc0Vycm9yKCkge1xuICByZXR1cm4gcHJvcHMudmFsaWRhdGVFcnJvcnM/Lmxlbmd0aCA+IDA7XG59XG5mdW5jdGlvbiBnZXRWYWxpZGF0ZUVycm9yTWVzc2FnZSgpIHtcbiAgaWYgKHByb3BzLnZhbGlkYXRlRXJyb3JzPy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIHByb3BzLnZhbGlkYXRlRXJyb3JzPy5tYXAoKGl0ZW0pID0+IGl0ZW0ubWVzc2FnZSkuam9pbihcIixcIik7XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtZWRpdGFibGUge1xuICBkaXNwbGF5OiBmbGV4O1xuICB3aWR0aDogMTAwJTtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgLmZzLWVkaXRhYmxlLXBvaW50ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuICAuZnMtZWRpdGFibGUtaW5uZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBtaW4taGVpZ2h0OiAyM3B4O1xuICAgIC5mcy1lZGl0YWJsZS1kaXJ0eSB7XG4gICAgICBib3JkZXItcmFkaXVzOiAxMDBweDtcbiAgICAgIHdpZHRoOiA1cHg7XG4gICAgICBoZWlnaHQ6IDVweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtNXB4O1xuICAgICAgYmFja2dyb3VuZDogcmVkO1xuICAgIH1cbiAgICAuZnMtZWRpdGFibGUtaW5wdXQge1xuICAgICAgZmxleDogMTtcbiAgICB9XG4gICAgLmZzLWVkaXRhYmxlLWFjdGlvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICAgIGksXG4gICAgICAuYW50aWNvbiB7XG4gICAgICAgIHdpZHRoOiAyMHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgfVxuICAgICAgLmhpZGRlbiB7XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZnMtZWRpdGFibGUtaWNvbiB7XG4gICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgfVxuICAgICY6aG92ZXIgLmZzLWVkaXRhYmxlLWljb24ge1xuICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB9XG5cbiAgICAuZWwtcmFkaW8ge1xuICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gICAgICAuZWwtcmFkaW9fX2xhYmVsIHtcbiAgICAgICAgcGFkZGluZzogMnB4O1xuICAgICAgfVxuICAgIH1cblxuICAgICYuZnMtdmFsaWRhdGUtZXJyb3Ige1xuICAgICAgLmVycm9yLWljb24ge1xuICAgICAgICBjb2xvcjogI2ZmNGQ0ZjtcbiAgICAgIH1cbiAgICAgIC5hbnQtaW5wdXQtYWZmaXgtd3JhcHBlciB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogI2ZmNGQ0ZjtcbiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYigyNTUgMzggNSAvIDYlKTtcbiAgICAgIH1cbiAgICAgIC5lbC1pbnB1dF9fd3JhcHBlciB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogI2ZmNGQ0ZiAhaW1wb3J0YW50O1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggI2ZmNGQ0ZiBpbnNldCAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgICAgLm4taW5wdXQgLm4taW5wdXRfX3N0YXRlLWJvcmRlciB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogI2ZmNGQ0ZiAhaW1wb3J0YW50O1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiKDI1NSAzOCA1IC8gNiUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWFjdGlvbmJhclwiPlxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIih2YWx1ZSwga2V5KSBpbiBjb21wdXRlZEJ1dHRvbnNcIiA6a2V5PVwia2V5XCI+XG4gICAgICA8ZnMtYnV0dG9uIHYtaWY9XCJ2YWx1ZS5zaG93ICE9PSBmYWxzZVwiIHYtYmluZD1cInZhbHVlXCIgQGNsaWNrPVwib25DbGljayhrZXksIHZhbHVlLCAkZXZlbnQpXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBjb21wdXRlZCwgUmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgc29ydEJ5IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBY3Rpb25iYXJDbGlja0V2ZW50LCBCdXR0b25zUHJvcHMgfSBmcm9tIFwiLi4vLi4vZFwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQWN0aW9uYmFyXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uXG4gICAgICoge1xuICAgICAqICBhZGQ6e1xuICAgICAqICAgIC4uLkZzQnV0dG9uLFxuICAgICAqICAgIHNob3c6dHJ1ZVxuICAgICAqICB9LFxuICAgICAqICBjdXN0b206ey4uLn1cbiAgICAgKiB9XG4gICAgICovXG4gICAgYnV0dG9uczoge31cbiAgfSBhcyBhbnksXG4gIGVtaXRzOiBbXCJhY3Rpb25cIl0sXG4gIHNldHVwKHByb3BzLCBjdHg6IGFueSkge1xuICAgIGZ1bmN0aW9uIG9uQ2xpY2soa2V5OiBhbnksIGJ0bjogYW55LCAkZXZlbnQ6IGFueSkge1xuICAgICAgY29uc3QgZSA9IHsga2V5LCBidG4sICRldmVudCwgbG9hZGluZ1JlZjogJGV2ZW50Py5sb2FkaW5nUmVmIH07XG4gICAgICBpZiAoYnRuLmNsaWNrKSB7XG4gICAgICAgIGJ0bi5jbGljayhlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGJ0bi5vbkNsaWNrKSB7XG4gICAgICAgIGJ0bi5vbkNsaWNrKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcImFjdGlvblwiLCBlKTtcbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zOiBSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBsZXQgc29ydEFyciA9IFtdO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yIChsZXQga2V5IGluIHByb3BzLmJ1dHRvbnMpIHtcbiAgICAgICAgc29ydEFyci5wdXNoKHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgLi4ucHJvcHMuYnV0dG9uc1trZXldLFxuICAgICAgICAgIF9rZXk6IGtleVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNvcnRlZEJ1dHRvbnM6IEJ1dHRvbnNQcm9wczxBY3Rpb25iYXJDbGlja0V2ZW50PiA9IHt9O1xuXG4gICAgICBzb3J0QXJyLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBsZXQgX2tleSA9IGl0ZW0uX2tleTtcbiAgICAgICAgZGVsZXRlIGl0ZW0uX2tleTtcbiAgICAgICAgc29ydGVkQnV0dG9uc1tfa2V5XSA9IGl0ZW07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3J0ZWRCdXR0b25zO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBvbkNsaWNrLFxuICAgICAgY29tcHV0ZWRCdXR0b25zXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWFjdGlvbmJhciB7XG4gIC5mcy1idXR0b24ge1xuICAgIG1hcmdpbjogMnB4OyAvLyDmjaLooYzkuYvlkI7kuZ/opoHmnInkuIDngrnpl7TpmpRcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWFjdGlvbmJhclwiPlxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIih2YWx1ZSwga2V5KSBpbiBjb21wdXRlZEJ1dHRvbnNcIiA6a2V5PVwia2V5XCI+XG4gICAgICA8ZnMtYnV0dG9uIHYtaWY9XCJ2YWx1ZS5zaG93ICE9PSBmYWxzZVwiIHYtYmluZD1cInZhbHVlXCIgQGNsaWNrPVwib25DbGljayhrZXksIHZhbHVlLCAkZXZlbnQpXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBjb21wdXRlZCwgUmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgc29ydEJ5IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBY3Rpb25iYXJDbGlja0V2ZW50LCBCdXR0b25zUHJvcHMgfSBmcm9tIFwiLi4vLi4vZFwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQWN0aW9uYmFyXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uXG4gICAgICoge1xuICAgICAqICBhZGQ6e1xuICAgICAqICAgIC4uLkZzQnV0dG9uLFxuICAgICAqICAgIHNob3c6dHJ1ZVxuICAgICAqICB9LFxuICAgICAqICBjdXN0b206ey4uLn1cbiAgICAgKiB9XG4gICAgICovXG4gICAgYnV0dG9uczoge31cbiAgfSBhcyBhbnksXG4gIGVtaXRzOiBbXCJhY3Rpb25cIl0sXG4gIHNldHVwKHByb3BzLCBjdHg6IGFueSkge1xuICAgIGZ1bmN0aW9uIG9uQ2xpY2soa2V5OiBhbnksIGJ0bjogYW55LCAkZXZlbnQ6IGFueSkge1xuICAgICAgY29uc3QgZSA9IHsga2V5LCBidG4sICRldmVudCwgbG9hZGluZ1JlZjogJGV2ZW50Py5sb2FkaW5nUmVmIH07XG4gICAgICBpZiAoYnRuLmNsaWNrKSB7XG4gICAgICAgIGJ0bi5jbGljayhlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGJ0bi5vbkNsaWNrKSB7XG4gICAgICAgIGJ0bi5vbkNsaWNrKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcImFjdGlvblwiLCBlKTtcbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zOiBSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBsZXQgc29ydEFyciA9IFtdO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yIChsZXQga2V5IGluIHByb3BzLmJ1dHRvbnMpIHtcbiAgICAgICAgc29ydEFyci5wdXNoKHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgLi4ucHJvcHMuYnV0dG9uc1trZXldLFxuICAgICAgICAgIF9rZXk6IGtleVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNvcnRlZEJ1dHRvbnM6IEJ1dHRvbnNQcm9wczxBY3Rpb25iYXJDbGlja0V2ZW50PiA9IHt9O1xuXG4gICAgICBzb3J0QXJyLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBsZXQgX2tleSA9IGl0ZW0uX2tleTtcbiAgICAgICAgZGVsZXRlIGl0ZW0uX2tleTtcbiAgICAgICAgc29ydGVkQnV0dG9uc1tfa2V5XSA9IGl0ZW07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3J0ZWRCdXR0b25zO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBvbkNsaWNrLFxuICAgICAgY29tcHV0ZWRCdXR0b25zXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWFjdGlvbmJhciB7XG4gIC5mcy1idXR0b24ge1xuICAgIG1hcmdpbjogMnB4OyAvLyDmjaLooYzkuYvlkI7kuZ/opoHmnInkuIDngrnpl7TpmpRcbiAgfVxufVxuPC9zdHlsZT5cbiIsbnVsbCxudWxsLCI8dGVtcGxhdGU+XG4gIDwhLS0g566A5Y2V5qih5byPIC0tPlxuICA8dGVtcGxhdGUgdi1pZj1cIm1vZGUgPT09ICdzaW1wbGUnXCI+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yb3cubmFtZVwiIGNsYXNzPVwiZnMtdGFibGUtY29sdW1ucy1maWx0ZXItc2ltcGxlXCI+XG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLmNvbC5uYW1lXCJcbiAgICAgICAgdi1mb3I9XCIoZWxlbWVudCwga2V5KSBpbiBjdXJyZW50Q29sdW1uc1wiXG4gICAgICAgIHYtc2hvdz1cIm9yaWdpbmFsW2VsZW1lbnQua2V5XT8uX19zaG93ICE9PSBmYWxzZVwiXG4gICAgICAgIDprZXk9XCJrZXlcIlxuICAgICAgICA6c3Bhbj1cIjZcIlxuICAgICAgPlxuICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgOmlzPVwidWkuY2hlY2tib3gubmFtZVwiXG4gICAgICAgICAgdi1tb2RlbDpbdWkuY2hlY2tib3gubW9kZWxWYWx1ZV09XCJlbGVtZW50LnNob3dcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cIm9yaWdpbmFsW2VsZW1lbnQua2V5XT8uX19kaXNhYmxlZCA9PT0gdHJ1ZVwiXG4gICAgICAgICAgY2xhc3M9XCJpdGVtLWxhYmVsXCJcbiAgICAgICAgICA6dGl0bGU9XCJidWlsZFRleHQoZWxlbWVudClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgYnVpbGRUZXh0KGVsZW1lbnQpIH19XG4gICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgPC9jb21wb25lbnQ+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5kaXZpZGVyLm5hbWVcIiAvPlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIj5cbiAgICAgIDxmcy1idXR0b25cbiAgICAgICAgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDVweFwiXG4gICAgICAgIHR5cGU9XCJwcmltYXJ5XCJcbiAgICAgICAgOmljb249XCJ1aS5pY29ucy5jaGVja1wiXG4gICAgICAgIDp0ZXh0PVwiX3RleHQuY29uZmlybVwiXG4gICAgICAgIEBjbGljaz1cInNpbXBsZVN1Ym1pdCgpXCJcbiAgICAgIC8+XG4gICAgICA8ZnMtYnV0dG9uIDppY29uPVwidWkuaWNvbnMucmVmcmVzaFwiIDp0ZXh0PVwiX3RleHQucmVzZXRcIiBAY2xpY2s9XCJzaW1wbGVSZXNldFwiIC8+XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvdGVtcGxhdGU+XG4gIDwhLS0g5a6M5YWo5qih5byPIC0tPlxuXG4gIDxjb21wb25lbnQgOmlzPVwiY29udGFpbmVyPy5pcyB8fCAnZnMtY29sdW1ucy1maWx0ZXItbGF5b3V0LWRlZmF1bHQnXCIgdi1lbHNlIHYtYmluZD1cImNvbnRhaW5lclwiPlxuICAgIDx0ZW1wbGF0ZSAjYnV0dG9ucz5cbiAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiBjbGFzcz1cImZzLWRyYXdlci1mb290ZXJcIiA6Z3V0dGVyPVwiMTBcIj5cbiAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jb2wubmFtZVwiIDpzcGFuPVwiMTJcIj5cbiAgICAgICAgICA8ZnMtYnV0dG9uIDppY29uPVwidWkuaWNvbnMucmVmcmVzaFwiIDp0ZXh0PVwiX3RleHQucmVzZXRcIiBibG9jayBAY2xpY2s9XCJyZXNldFwiIC8+XG4gICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmNvbC5uYW1lXCIgOnNwYW49XCIxMlwiPlxuICAgICAgICAgIDxmcy1idXR0b24gdHlwZT1cInByaW1hcnlcIiA6aWNvbj1cInVpLmljb25zLmNoZWNrXCIgOnRleHQ9XCJfdGV4dC5jb25maXJtXCIgYmxvY2sgQGNsaWNrPVwic3VibWl0KGZhbHNlKVwiIC8+XG4gICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxuLyoqXG4gKiBGc1RhYmxlQ29sdW1uc0ZpbHRlcu+8jOWIl+iuvue9rue7hOS7tlxuICovXG5pbXBvcnQgeyBvbWl0LCBmb3JFYWNoLCBwaWNrIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IFRhYmxlU3RvcmUgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3V0aWwuc3RvcmVcIjtcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vLi4vbG9jYWxlXCI7XG5pbXBvcnQgeyBjb21wdXRlZCwgaW5qZWN0LCBuZXh0VGljaywgcHJvdmlkZSwgUmVmLCByZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdWlDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uL3VpXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi8uLi91c2UvdXNlLW1lcmdlXCI7XG5pbXBvcnQgeyB1c2VSb3V0ZSB9IGZyb20gXCJ2dWUtcm91dGVyXCI7XG5pbXBvcnQge1xuICBDb2x1bW5Qcm9wcyxcbiAgQ29sdW1uc0ZpbHRlckNvbXBvbmVudFByb3BzLFxuICBDb2x1bW5zRmlsdGVySXRlbSxcbiAgQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXksXG4gIFRhYmxlQ29sdW1uc1Byb3BzXG59IGZyb20gXCIuLi8uLi8uLi9kXCI7XG5cbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKGRlZmluZVByb3BzPENvbHVtbnNGaWx0ZXJDb21wb25lbnRQcm9wcz4oKSwge1xuICBzdG9yYWdlOiB0cnVlLFxuICBtb2RlOiBcImRlZmF1bHRcIixcbiAgY29udGFpbmVyOiAoKSA9PiB7XG4gICAgcmV0dXJuIHsgaXM6IFwiZnMtY29sdW1ucy1maWx0ZXItbGF5b3V0LWRlZmF1bHRcIiB9O1xuICB9XG59KTtcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0cyhbXCJ1cGRhdGU6Y29sdW1uc1wiLCBcInVwZGF0ZTpzaG93XCIsIFwicmVzZXRcIiwgXCJzdWJtaXRcIl0pO1xuXG5jb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcbmNvbnN0IHVpID0gdWlDb250ZXh0LmdldCgpO1xuY29uc3QgYWN0aXZlID0gcmVmKGZhbHNlKTtcbmNvbnN0IHN0YXJ0ID0gKCkgPT4ge1xuICBhY3RpdmUudmFsdWUgPSB0cnVlO1xufTtcblxuLy8g5pWw57uE5b2i5byP55qE5Y6f5aeLdHJlZVxuY29uc3Qgb3JpZ2luYWw6IFJlZjxDb2x1bW5zRmlsdGVySXRlbVtdPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIHRyYW5zZm9ybUNvbHVtbnNUcmVlKHByb3BzLm9yaWdpbmFsQ29sdW1ucyk7XG59KTtcbi8v5pWw57uE5b2i5byP55qEdHJlZVxuY29uc3QgY3VycmVudENvbHVtbnM6IFJlZjxDb2x1bW5zRmlsdGVySXRlbVtdPiA9IHJlZihbXSk7XG5cbmNvbnN0IG9yaWdpbmFsQ29sdW1uc01hcDogUmVmPFJlY29yZDxzdHJpbmcsIENvbHVtbnNGaWx0ZXJJdGVtPj4gPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgQ29sdW1uc0ZpbHRlckl0ZW0+ID0ge307XG4gIGVhY2hUcmVlKG9yaWdpbmFsLnZhbHVlLCAoaXRlbTogQ29sdW1uc0ZpbHRlckl0ZW0pID0+IHtcbiAgICBtYXBbaXRlbS5fX2tleV0gPSBpdGVtO1xuICB9KTtcbiAgcmV0dXJuIG1hcDtcbn0pO1xuY29uc3QgeyBtZXJnZSwgY2xvbmVEZWVwIH0gPSB1c2VNZXJnZSgpO1xuXG5jb25zdCBfdGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3QgZGVmID0ge1xuICAgIHRpdGxlOiB0KFwiZnMudG9vbGJhci5jb2x1bW5GaWx0ZXIudGl0bGVcIiksXG4gICAgZml4ZWQ6IHQoXCJmcy50b29sYmFyLmNvbHVtbkZpbHRlci5maXhlZFwiKSxcbiAgICBvcmRlcjogdChcImZzLnRvb2xiYXIuY29sdW1uRmlsdGVyLm9yZGVyXCIpLFxuICAgIHJlc2V0OiB0KFwiZnMudG9vbGJhci5jb2x1bW5GaWx0ZXIucmVzZXRcIiksXG4gICAgY29uZmlybTogdChcImZzLnRvb2xiYXIuY29sdW1uRmlsdGVyLmNvbmZpcm1cIiksXG4gICAgdW5uYW1lZDogdChcImZzLnRvb2xiYXIuY29sdW1uRmlsdGVyLnVubmFtZWRcIilcbiAgfTtcbiAgbWVyZ2UoZGVmLCBwcm9wcy50ZXh0KTtcbiAgcmV0dXJuIGRlZjtcbn0pO1xuXG5mdW5jdGlvbiBlYWNoVHJlZSh0cmVlOiBhbnksIGNhbGxiYWNrOiBGdW5jdGlvbikge1xuICBpZiAoIXRyZWUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodHJlZSkpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdHJlZSkge1xuICAgICAgY2FsbGJhY2soaXRlbSk7XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xuICAgICAgICBlYWNoVHJlZShpdGVtLmNoaWxkcmVuLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRyZWUpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0cmVlW2tleV07XG4gICAgICBjYWxsYmFjayhpdGVtKTtcbiAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgIGVhY2hUcmVlKGl0ZW0uY2hpbGRyZW4sIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDb2x1bW5GaWx0ZXJJdGVtKGl0ZW06IENvbHVtblByb3BzKTogQ29sdW1uc0ZpbHRlckl0ZW0ge1xuICByZXR1cm4ge1xuICAgIGtleTogaXRlbS5rZXksXG4gICAgdGl0bGU6IGl0ZW0udGl0bGUsXG4gICAgZml4ZWQ6IGl0ZW0uZml4ZWQgPz8gZmFsc2UsXG4gICAgc2hvdzogaXRlbS5zaG93ID8/IHRydWUsXG4gICAgX19zaG93OiBpdGVtLmNvbHVtblNldFNob3cgIT09IGZhbHNlLFxuICAgIF9fZGlzYWJsZWQ6IGl0ZW0uY29sdW1uU2V0RGlzYWJsZWQgPz8gZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtVG9UYWJsZUNvbHVtbnMocmVzdWx0OiBDb2x1bW5zRmlsdGVySXRlbVtdKSB7XG4gIGNvbnN0IGNvbHVtbnM6IFRhYmxlQ29sdW1uc1Byb3BzID0ge307XG4gIGZvckVhY2gocmVzdWx0LCAoaXRlbSkgPT4ge1xuICAgIGNvbnN0IGNvbHVtbjogQ29sdW1uUHJvcHMgPSBvbWl0KGl0ZW0sIFwiY2hpbGRyZW5cIiwgXCJfX3Nob3dcIiwgXCJfX2Rpc2FibGVkXCIsIFwiX19wYXJlbnRcIiwgXCJfX2tleVwiKTtcbiAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbHVtbi5jaGlsZHJlbiA9IHRyYW5zZm9ybVRvVGFibGVDb2x1bW5zKGl0ZW0uY2hpbGRyZW4pO1xuICAgIH1cbiAgICBjb2x1bW5zW2l0ZW0ua2V5XSA9IGNvbHVtbjtcbiAgfSk7XG4gIHJldHVybiBjb2x1bW5zO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Db2x1bW5zVHJlZSh2YWx1ZTogVGFibGVDb2x1bW5zUHJvcHMsIHBhcmVudD86IENvbHVtbnNGaWx0ZXJJdGVtKTogQ29sdW1uc0ZpbHRlckl0ZW1bXSB7XG4gIGNvbnN0IGNvbHVtbnM6IENvbHVtbnNGaWx0ZXJJdGVtW10gPSBbXTtcbiAgZm9yRWFjaCh2YWx1ZSwgKGl0ZW0pID0+IHtcbiAgICBjb25zdCBjb2x1bW4gPSBidWlsZENvbHVtbkZpbHRlckl0ZW0oaXRlbSk7XG4gICAgY29sdW1uLl9fcGFyZW50ID0gcGFyZW50O1xuICAgIGNvbHVtbi5fX2tleSA9IGAke3BhcmVudD8ua2V5IHx8IFwiXCJ9LiR7aXRlbS5rZXl9YDtcbiAgICBjb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xuICAgICAgY29sdW1uLmNoaWxkcmVuID0gdHJhbnNmb3JtQ29sdW1uc1RyZWUoaXRlbS5jaGlsZHJlbiwgY29sdW1uKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY29sdW1ucztcbn1cblxuZnVuY3Rpb24gc2V0Q3VycmVudFZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgY3VycmVudENvbHVtbnMudmFsdWUgPSB0cmFuc2Zvcm1Db2x1bW5zVHJlZSh2YWx1ZSk7XG59XG5cbi8vIOi/mOWOn1xuYXN5bmMgZnVuY3Rpb24gcmVzZXQoKSB7XG4gIGN1cnJlbnRDb2x1bW5zLnZhbHVlID0gdHJhbnNmb3JtQ29sdW1uc1RyZWUocHJvcHMub3JpZ2luYWxDb2x1bW5zKTtcbiAgYXdhaXQgZG9fc2F2ZSh0cnVlKTtcbiAgYXdhaXQgY2xlYXJUaGlzU3RvcmFnZSgpO1xuICBlbWl0KFwicmVzZXRcIik7XG59XG5cbi8vIOehruiupFxuYXN5bmMgZnVuY3Rpb24gZG9fc2F2ZShub1NhdmUgPSBmYWxzZSkge1xuICBpZiAoIW5vU2F2ZSkge1xuICAgIGF3YWl0IHNhdmVPcHRpb25zVG9TdG9yYWdlKGN1cnJlbnRDb2x1bW5zLnZhbHVlKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjbG9uZURlZXAoY3VycmVudENvbHVtbnMudmFsdWUpO1xuXG4gIC8v6Kej5YazbmFpdmUgdWnkuI7liJforr7nva7lhrLnqoHnmoTpl67pophcbiAgZWFjaFRyZWUocmVzdWx0LCAoaXRlbTogYW55KSA9PiB7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGRlbGV0ZSBpdGVtLl9fZGlzYWJsZWQ7XG4gICAgICBkZWxldGUgaXRlbS5fX3Nob3c7XG4gICAgICBkZWxldGUgaXRlbS5fX3BhcmVudDtcbiAgICAgIGRlbGV0ZSBpdGVtLl9fa2V5O1xuICAgIH1cbiAgfSk7XG5cbiAgZG9FbWl0KHJlc3VsdCk7XG4gIGFjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdWJtaXQobm9TYXZlID0gZmFsc2UpIHtcbiAgY29uc3QgY29sdW1ucyA9IGF3YWl0IGRvX3NhdmUobm9TYXZlKTtcbiAgZW1pdChcInN1Ym1pdFwiLCB7IGNvbHVtbnMgfSk7XG59XG5jb25zdCBjb21wdXRlZE9yaWdpbmFsQ29sdW1ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIHByb3BzLm9yaWdpbmFsQ29sdW1ucztcbn0pO1xucHJvdmlkZShDb2x1bW5zRmlsdGVyUHJvdmlkZUtleSwge1xuICBvcmlnaW5hbENvbHVtbnM6IGNvbXB1dGVkT3JpZ2luYWxDb2x1bW5zLFxuICBvcmlnaW5hbENvbHVtbnNNYXA6IG9yaWdpbmFsQ29sdW1uc01hcCxcbiAgY3VycmVudENvbHVtbnMsXG4gIHRleHQ6IF90ZXh0LFxuICBhY3RpdmUsXG4gIHN1Ym1pdCxcbiAgcmVzZXRcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBzaW1wbGVTdWJtaXQoKSB7XG4gIGF3YWl0IHN1Ym1pdChmYWxzZSk7XG4gIGVtaXQoXCJ1cGRhdGU6c2hvd1wiLCBmYWxzZSk7XG59XG5hc3luYyBmdW5jdGlvbiBzaW1wbGVSZXNldCgpIHtcbiAgYXdhaXQgcmVzZXQoKTtcbiAgZW1pdChcInVwZGF0ZTpzaG93XCIsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gZG9FbWl0KHJlc3VsdDogQ29sdW1uc0ZpbHRlckl0ZW1bXSkge1xuICBlbWl0KFwidXBkYXRlOmNvbHVtbnNcIiwgdHJhbnNmb3JtVG9UYWJsZUNvbHVtbnMocmVzdWx0KSk7XG59XG5cbmNvbnN0IGdldENydWRCaW5kaW5nID0gaW5qZWN0KFwiZ2V0OmNydWRCaW5kaW5nXCIsICgpID0+IHtcbiAgcmV0dXJuIHsgaWQ6IFwiXCIgfTtcbn0pO1xuXG5jb25zdCBzdG9yYWdlVGFibGVTdG9yZSA9IHJlZigpO1xuZnVuY3Rpb24gZ2V0U3RvcmFnZVRhYmxlKCkge1xuICAvL3Byb3BzLnN0b3JhZ2XmmK/lkKblrp7njrDkuoZDb2x1bW5GaWx0ZXJTdG9yYWdlIOaOpeWPo1xuICBjb25zdCByZW1vdGVTdG9yYWdlID0gdHlwZW9mIHByb3BzLnN0b3JhZ2UgPT09IFwib2JqZWN0XCIgPyBwcm9wcy5zdG9yYWdlIDogbnVsbDtcbiAgY29uc3Qga2V5VHlwZSA9IHR5cGVvZiBwcm9wcy5zdG9yYWdlID09PSBcInN0cmluZ1wiID8gcHJvcHMuc3RvcmFnZSA6IFwiXCI7XG4gIGlmIChzdG9yYWdlVGFibGVTdG9yZS52YWx1ZSA9PSBudWxsKSB7XG4gICAgY29uc3Qgcm91dGUgPSB1c2VSb3V0ZSgpO1xuICAgIHN0b3JhZ2VUYWJsZVN0b3JlLnZhbHVlID0gbmV3IFRhYmxlU3RvcmUoe1xuICAgICAgJHJvdXRlcjogcm91dGUsXG4gICAgICB0YWJsZU5hbWU6IFwiY29sdW1uc0ZpbHRlclwiLFxuICAgICAga2V5VHlwZToga2V5VHlwZSxcbiAgICAgIHJlbW90ZVN0b3JhZ2VcbiAgICB9KTtcbiAgfVxuICBzdG9yYWdlVGFibGVTdG9yZS52YWx1ZS5pZCA9IGdldENydWRCaW5kaW5nKCkuaWQ7XG4gIHJldHVybiBzdG9yYWdlVGFibGVTdG9yZS52YWx1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZU9wdGlvbnNUb1N0b3JhZ2UodmFsdWU6IGFueSkge1xuICBpZiAocHJvcHMuc3RvcmFnZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc3RvcmVkT3B0aW9uczogYW55ID0gY2xvbmVEZWVwKHZhbHVlKTtcbiAgLy/liKDpmaRwYXJlbnTlvJXnlKhcbiAgZWFjaFRyZWUoc3RvcmVkT3B0aW9ucywgKGl0ZW06IGFueSkgPT4ge1xuICAgIGRlbGV0ZSBpdGVtLl9fcGFyZW50O1xuICB9KTtcblxuICBhd2FpdCBnZXRTdG9yYWdlVGFibGUoKS51cGRhdGVUYWJsZVZhbHVlKHN0b3JlZE9wdGlvbnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPcHRpb25zRnJvbVN0b3JhZ2UoKSB7XG4gIGlmIChwcm9wcy5zdG9yYWdlID09PSBmYWxzZSkge1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gYXdhaXQgZ2V0U3RvcmFnZVRhYmxlKCkuZ2V0VGFibGVWYWx1ZSgpO1xufVxuYXN5bmMgZnVuY3Rpb24gY2xlYXJUaGlzU3RvcmFnZSgpIHtcbiAgYXdhaXQgZ2V0U3RvcmFnZVRhYmxlKCkuY2xlYXJUYWJsZVZhbHVlKCk7XG59XG5cbmZ1bmN0aW9uIGdldENvbHVtbnNIYXNoKGNvbHVtbnM6IGFueSkge1xuICBjb25zdCBrZXlzOiBhbnkgPSBbXTtcbiAgZWFjaFRyZWUoY29sdW1ucywgKGl0ZW06IGFueSkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IHBpY2soaXRlbSwgXCJrZXlcIiwgXCJfX3Nob3dcIiwgXCJfX2Rpc2FibGVkXCIpO1xuICAgIGtleXMucHVzaChKU09OLnN0cmluZ2lmeSh0YXJnZXQpKTtcbiAgfSk7XG4gIGtleXMuc29ydCgpO1xuICBsZXQgaGFzaCA9IFwiXCI7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBoYXNoICs9IGtleTtcbiAgfVxuICByZXR1cm4gaGFzaDtcbn1cbndhdGNoKFxuICAoKSA9PiB7XG4gICAgcmV0dXJuIHByb3BzLmNvbHVtbnM7XG4gIH0sXG4gICh2YWx1ZSkgPT4ge1xuICAgIHNldEN1cnJlbnRWYWx1ZSh2YWx1ZSk7XG4gIH1cbik7XG5cbmNvbnN0IGluaXQgPSBhc3luYyAoKSA9PiB7XG4gIHNldEN1cnJlbnRWYWx1ZShwcm9wcy5jb2x1bW5zKTtcbiAgY29uc3Qgc3RvcmVkT3B0aW9ucyA9IGF3YWl0IGdldE9wdGlvbnNGcm9tU3RvcmFnZSgpO1xuICBpZiAoc3RvcmVkT3B0aW9ucykge1xuICAgIGNvbnN0IHN0b3JlSGFzaCA9IGdldENvbHVtbnNIYXNoKHN0b3JlZE9wdGlvbnMpO1xuICAgIGNvbnN0IG9wdGlvbkhhc2ggPSBnZXRDb2x1bW5zSGFzaChvcmlnaW5hbC52YWx1ZSk7XG4gICAgaWYgKG9wdGlvbkhhc2ggIT09IHN0b3JlSGFzaCkge1xuICAgICAgY29uc29sZS5sb2coXCJjb2x1bW5zIGNoYW5nZWQsIGlnbm9yZSBsb2NhbCBzdG9yYWdlXCIpO1xuICAgICAgLy8g5aaC5p6c5a2X5q615YiX5pyJ6L+H5L+u5pS577yM5YiZ5LiN5L2/55So5pys5Zyw6K6+572uXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGN1cnJlbnRDb2x1bW5zLnZhbHVlID0gc3RvcmVkT3B0aW9ucztcbiAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgIGF3YWl0IHN1Ym1pdCh0cnVlKTtcbiAgfVxufTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlKGNoYW5nZTogKGN1cnJlbnRDb2x1bW5zOiBSZWY8Q29sdW1uc0ZpbHRlckl0ZW1bXT4pID0+IFByb21pc2U8dm9pZD4pIHtcbiAgYXdhaXQgY2hhbmdlKGN1cnJlbnRDb2x1bW5zKTtcbiAgYXdhaXQgZG9fc2F2ZSgpO1xufVxuXG53YXRjaChcbiAgKCkgPT4ge1xuICAgIHJldHVybiBvcmlnaW5hbC52YWx1ZTtcbiAgfSxcbiAgYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgYXdhaXQgaW5pdCgpO1xuICB9LFxuICB7XG4gICAgaW1tZWRpYXRlOiB0cnVlXG4gIH1cbik7XG5cbmRlZmluZUV4cG9zZSh7XG4gIHN0YXJ0LFxuICBzYXZlOiBkb19zYXZlLFxuICB1cGRhdGUsXG4gIG9yaWdpbmFsLFxuICBjb2x1bW5zOiBjdXJyZW50Q29sdW1uc1xufSk7XG5cbmZ1bmN0aW9uIGJ1aWxkVGV4dChlbGVtZW50OiBhbnkpIHtcbiAgcmV0dXJuIGVsZW1lbnQubGFiZWwgfHwgZWxlbWVudC50aXRsZSB8fCBlbGVtZW50LmtleSB8fCBfdGV4dC52YWx1ZS51bm5hbWVkO1xufVxuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy10YWJsZS1jb2x1bW5zLWZpbHRlci1zaW1wbGUge1xuICBtaW4td2lkdGg6IDc2MHB4O1xuICBwYWRkaW5nLXRvcDogMjBweDtcbn1cblxuLmZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyIHtcbiAgOmZvY3VzIHtcbiAgICBvdXRsaW5lOiAwO1xuICB9XG5cbiAgW2ZsZXh+PVwiY3Jvc3M6Y2VudGVyXCJdIHtcbiAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cblxuICBbZmxleH49XCJtYWluOmp1c3RpZnlcIl0ge1xuICAgIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICB9XG5cbiAgW2ZsZXhdIHtcbiAgICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgW2ZsZXgtYm94PVwiMVwiXSB7XG4gICAgZmxleC1ncm93OiAxO1xuICAgIGZsZXgtc2hyaW5rOiAxO1xuICB9XG5cbiAgW2ZsZXhdID4gKiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuXG4gIC5lbC1kcmF3ZXJfX2JvZHkge1xuICAgIGhlaWdodDogMDtcbiAgfVxuXG4gIC5mcy1kcmF3ZXItd3JhcHBlciB7XG4gICAgcGFkZGluZzogMTBweDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgfVxuXG4gIC5mcy1kcmF3ZXItZm9vdGVyIHtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICB9XG5cbiAgLmNvbXBvbmVudC0tbGlzdCB7XG4gICAgbWFyZ2luOiAtMjBweDtcblxuICAgIC5pdGVtLWxhYmVsIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBtaW4td2lkdGg6IDA7XG5cbiAgICAgIC5hbnQtY2hlY2tib3ggKyBzcGFuIHtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB9XG4gICAgfVxuICAgIC5pdGVtLXJpZ2h0IHtcbiAgICAgIGZsZXgtc2hyaW5rOiAxO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG5cbiAgICAudGl0bGUge1xuICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgIH1cblxuICAgIC5jb21wb25lbnQtLWxpc3QtaXRlbSB7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgbWFyZ2luLWJvdHRvbTogMXB4O1xuXG4gICAgICAmLmdob3N0IHtcbiAgICAgICAgb3BhY2l0eTogMC41O1xuICAgICAgfVxuXG4gICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gICAgICB9XG5cbiAgICAgIC5jb21wb25lbnQtLWxpc3QtaXRlbS1oYW5kbGUge1xuICAgICAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuXG4gICAgICAgICYuZGlzYWJsZWQge1xuICAgICAgICAgIG9wYWNpdHk6IDAuMztcbiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy10b29sYmFyXCI+XG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGtleSkgb2YgY29tcHV0ZWRCdXR0b25zXCIgOmtleT1cImtleVwiPlxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpdGVtLnNob3cgIT09IGZhbHNlXCI+XG4gICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICA6aXM9XCJ1aS5wb3BvdmVyLm5hbWVcIlxuICAgICAgICAgIHYtaWY9XCJrZXkgPT09ICdjb2x1bW5zJyAmJiBjb2x1bW5zRmlsdGVyICYmIGNvbHVtbnNGaWx0ZXI/Lm1vZGUgPT09ICdzaW1wbGUnXCJcbiAgICAgICAgICB2LW1vZGVsOlt1aS5wb3BvdmVyLnZpc2libGVdPVwicG9wb3ZlclZpc2libGVcIlxuICAgICAgICAgIGRpc3BsYXktZGlyZWN0aXZlPVwic2hvd1wiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICA6d2lkdGg9XCI3NjBcIlxuICAgICAgICAgIHRyaWdnZXI9XCJjbGlja1wiXG4gICAgICAgID5cbiAgICAgICAgICA8dGVtcGxhdGUgI1t1aS5wb3BvdmVyLnRyaWdnZXJTbG90TmFtZV0+XG4gICAgICAgICAgICA8ZnMtYnV0dG9uIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJoYW5kbGVTaW1wbGVDbGlja1wiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8dGVtcGxhdGUgI1t1aS5wb3BvdmVyLmNvbnRlbnRTbG90TmFtZV0+XG4gICAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICAgIDppcz1cImNvbHVtbnNGaWx0ZXIuaXMgfHwgJ2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyJ1wiXG4gICAgICAgICAgICAgIHYtaWY9XCJjb2x1bW5zXCJcbiAgICAgICAgICAgICAgcmVmPVwiY29sdW1uc0ZpbHRlclJlZlwiXG4gICAgICAgICAgICAgIHYtbW9kZWw6c2hvdz1cInBvcG92ZXJWaXNpYmxlXCJcbiAgICAgICAgICAgICAgbW9kZT1cInNpbXBsZVwiXG4gICAgICAgICAgICAgIHYtYmluZD1cImNvbHVtbnNGaWx0ZXJcIlxuICAgICAgICAgICAgICA6Y29sdW1ucz1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICA6c3RvcmFnZT1cInN0b3JhZ2VcIlxuICAgICAgICAgICAgICBAdXBkYXRlOmNvbHVtbnM9XCIkZW1pdCgndXBkYXRlOmNvbHVtbnMnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgIDxmcy1idXR0b24gdi1lbHNlIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJpdGVtLmNsaWNrKCRldmVudClcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDxjb21wb25lbnRcbiAgICAgIDppcz1cImNvbHVtbnNGaWx0ZXIuaXMgfHwgJ2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyJ1wiXG4gICAgICB2LWlmPVwiY29sdW1ucyAmJiBjb2x1bW5zRmlsdGVyPy5tb2RlICE9PSAnc2ltcGxlJ1wiXG4gICAgICByZWY9XCJjb2x1bW5zRmlsdGVyUmVmXCJcbiAgICAgIDpzdG9yYWdlPVwic3RvcmFnZVwiXG4gICAgICB2LWJpbmQ9XCJjb2x1bW5zRmlsdGVyXCJcbiAgICAgIDpjb2x1bW5zPVwiY29sdW1uc1wiXG4gICAgICBAdXBkYXRlOmNvbHVtbnM9XCIkZW1pdCgndXBkYXRlOmNvbHVtbnMnLCAkZXZlbnQpXCJcbiAgICAvPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgRnNUYWJsZUNvbHVtbnNGaWx0ZXIgZnJvbSBcIi4vZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvaW5kZXgudnVlXCI7XG5pbXBvcnQgeyBzb3J0QnkgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBQcm9wVHlwZSwgcmVmLCBSZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBCdXR0b25Qcm9wcywgQnV0dG9uc1Byb3BzLCBUYWJsZUNvbHVtbnNQcm9wcyB9IGZyb20gXCIuLi8uLi9kXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSwgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG4vKipcbiAqIOW3peWFt+adoVxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzVG9vbGJhclwiLFxuICBjb21wb25lbnRzOiB7IEZzVGFibGVDb2x1bW5zRmlsdGVyIH0sXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uXG4gICAgICp7XG4gICAgICogICBzZWFyY2g6e30sIOafpeivolxuICAgICAqICAgcmVmcmVzaDp7fSwg5Yi35pawXG4gICAgICogICBjb21wYWN0Ont9LCDntKflh5HmqKHlvI9cbiAgICAgKiAgIGV4cG9ydDp7fSwg5a+85Ye6XG4gICAgICogICBjb2x1bW5zOnt9IOWIl+iuvue9rlxuICAgICAqfVxuICAgICAqKi9cbiAgICBidXR0b25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW9k+WJjeaYr+WQpue0p+WHkeaooeW8j1xuICAgICAqL1xuICAgIGNvbXBhY3Q6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliJfphY3nva5cbiAgICAgKi9cbiAgICBjb2x1bW5zOiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8VGFibGVDb2x1bW5zUHJvcHM+LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKbkv53lrZjnlKjmiLfliJforr7nva5cbiAgICAgKiDkvKBzdHJpbmfliJnooajnpLrkvKDlhaXnvJPlrZjnmoTkuLtrZXlcbiAgICAgKi9cbiAgICBzdG9yYWdlOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaPkuanvVxuICAgICAqL1xuICAgIHNsb3RzOiB7fSxcblxuICAgIC8qKlxuICAgICAqIOWIl+iuvue9rumFjee9rlxuICAgICAqL1xuICAgIGNvbHVtbnNGaWx0ZXI6IHtcbiAgICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxhbnk+XG4gICAgfVxuICB9LFxuICBlbWl0czogW1widXBkYXRlOmNvbHVtbnNcIl0sXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eCkge1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IGNvbHVtbnNGaWx0ZXJSZWY6IFJlZiA9IHJlZigpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCBjb21wdXRlZEJ1dHRvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0QnV0dG9uczogQnV0dG9uc1Byb3BzPHZvaWQ+ID0ge1xuICAgICAgICBjb2x1bW5zOiB7XG4gICAgICAgICAgY2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbHVtbnNGaWx0ZXJSZWYudmFsdWUuc3RhcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG1lcmdlKGRlZmF1bHRCdXR0b25zLCBwcm9wcy5idXR0b25zKTtcbiAgICAgIC8vIGlmIChkZWZhdWx0QnV0dG9ucy5zZWFyY2gpIHtcbiAgICAgIC8vICAgZGVmYXVsdEJ1dHRvbnMuc2VhcmNoLnR5cGUgPSBwcm9wcy5zZWFyY2ggPyBcInByaW1hcnlcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgLy8gfVxuICAgICAgLy8gaWYgKGRlZmF1bHRCdXR0b25zLmNvbXBhY3QpIHtcbiAgICAgIC8vICAgZGVmYXVsdEJ1dHRvbnMuY29tcGFjdC50eXBlID0gcHJvcHMuY29tcGFjdCA/IFwicHJpbWFyeVwiIDogXCJkZWZhdWx0XCI7XG4gICAgICAvLyB9XG5cbiAgICAgIGxldCBzb3J0QXJyOiBCdXR0b25Qcm9wc1tdID0gW107XG4gICAgICBmb3IgKGxldCBkZWZhdWx0QnV0dG9uc0tleSBpbiBkZWZhdWx0QnV0dG9ucykge1xuICAgICAgICBzb3J0QXJyLnB1c2goe1xuICAgICAgICAgIC4uLmRlZmF1bHRCdXR0b25zW2RlZmF1bHRCdXR0b25zS2V5XSxcbiAgICAgICAgICBfa2V5OiBkZWZhdWx0QnV0dG9uc0tleVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzb3J0ZWRCdXR0b25zOiBCdXR0b25zUHJvcHM8dm9pZD4gPSB7fTtcblxuICAgICAgc29ydEFyci5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGxldCBfa2V5ID0gaXRlbS5fa2V5O1xuICAgICAgICBkZWxldGUgaXRlbS5fa2V5O1xuICAgICAgICBzb3J0ZWRCdXR0b25zW19rZXldID0gaXRlbTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvcnRlZEJ1dHRvbnM7XG4gICAgfSk7XG4gICAgY29uc3QgcG9wb3ZlclZpc2libGUgPSByZWYoZmFsc2UpO1xuICAgIGNvbnN0IGhhbmRsZVNpbXBsZUNsaWNrID0gKCRldmVudCkgPT4ge1xuICAgICAgaWYgKHVpLnR5cGUgPT09IFwiZWxlbWVudFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHBvcG92ZXJWaXNpYmxlLnZhbHVlID0gIXBvcG92ZXJWaXNpYmxlLnZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgY29sdW1uc0ZpbHRlclJlZixcbiAgICAgIGNvbXB1dGVkQnV0dG9ucyxcbiAgICAgIHBvcG92ZXJWaXNpYmxlLFxuICAgICAgaGFuZGxlU2ltcGxlQ2xpY2tcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtdG9vbGJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgLmZzLWJ1dHRvbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXRvb2xiYXJcIj5cbiAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwga2V5KSBvZiBjb21wdXRlZEJ1dHRvbnNcIiA6a2V5PVwia2V5XCI+XG4gICAgICA8dGVtcGxhdGUgdi1pZj1cIml0ZW0uc2hvdyAhPT0gZmFsc2VcIj5cbiAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgIDppcz1cInVpLnBvcG92ZXIubmFtZVwiXG4gICAgICAgICAgdi1pZj1cImtleSA9PT0gJ2NvbHVtbnMnICYmIGNvbHVtbnNGaWx0ZXIgJiYgY29sdW1uc0ZpbHRlcj8ubW9kZSA9PT0gJ3NpbXBsZSdcIlxuICAgICAgICAgIHYtbW9kZWw6W3VpLnBvcG92ZXIudmlzaWJsZV09XCJwb3BvdmVyVmlzaWJsZVwiXG4gICAgICAgICAgZGlzcGxheS1kaXJlY3RpdmU9XCJzaG93XCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxuICAgICAgICAgIDp3aWR0aD1cIjc2MFwiXG4gICAgICAgICAgdHJpZ2dlcj1cImNsaWNrXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnBvcG92ZXIudHJpZ2dlclNsb3ROYW1lXT5cbiAgICAgICAgICAgIDxmcy1idXR0b24gdi1iaW5kPVwiaXRlbVwiIEBjbGljaz1cImhhbmRsZVNpbXBsZUNsaWNrXCIgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnBvcG92ZXIuY29udGVudFNsb3ROYW1lXT5cbiAgICAgICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICAgICAgOmlzPVwiY29sdW1uc0ZpbHRlci5pcyB8fCAnZnMtdGFibGUtY29sdW1ucy1maWx0ZXInXCJcbiAgICAgICAgICAgICAgdi1pZj1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICByZWY9XCJjb2x1bW5zRmlsdGVyUmVmXCJcbiAgICAgICAgICAgICAgdi1tb2RlbDpzaG93PVwicG9wb3ZlclZpc2libGVcIlxuICAgICAgICAgICAgICBtb2RlPVwic2ltcGxlXCJcbiAgICAgICAgICAgICAgdi1iaW5kPVwiY29sdW1uc0ZpbHRlclwiXG4gICAgICAgICAgICAgIDpjb2x1bW5zPVwiY29sdW1uc1wiXG4gICAgICAgICAgICAgIDpzdG9yYWdlPVwic3RvcmFnZVwiXG4gICAgICAgICAgICAgIEB1cGRhdGU6Y29sdW1ucz1cIiRlbWl0KCd1cGRhdGU6Y29sdW1ucycsICRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgPGZzLWJ1dHRvbiB2LWVsc2Ugdi1iaW5kPVwiaXRlbVwiIEBjbGljaz1cIml0ZW0uY2xpY2soJGV2ZW50KVwiIC8+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPGNvbXBvbmVudFxuICAgICAgOmlzPVwiY29sdW1uc0ZpbHRlci5pcyB8fCAnZnMtdGFibGUtY29sdW1ucy1maWx0ZXInXCJcbiAgICAgIHYtaWY9XCJjb2x1bW5zICYmIGNvbHVtbnNGaWx0ZXI/Lm1vZGUgIT09ICdzaW1wbGUnXCJcbiAgICAgIHJlZj1cImNvbHVtbnNGaWx0ZXJSZWZcIlxuICAgICAgOnN0b3JhZ2U9XCJzdG9yYWdlXCJcbiAgICAgIHYtYmluZD1cImNvbHVtbnNGaWx0ZXJcIlxuICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgIEB1cGRhdGU6Y29sdW1ucz1cIiRlbWl0KCd1cGRhdGU6Y29sdW1ucycsICRldmVudClcIlxuICAgIC8+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCBGc1RhYmxlQ29sdW1uc0ZpbHRlciBmcm9tIFwiLi9mcy10YWJsZS1jb2x1bW5zLWZpbHRlci9pbmRleC52dWVcIjtcbmltcG9ydCB7IHNvcnRCeSB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIFByb3BUeXBlLCByZWYsIFJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcbmltcG9ydCB7IEJ1dHRvblByb3BzLCBCdXR0b25zUHJvcHMsIFRhYmxlQ29sdW1uc1Byb3BzIH0gZnJvbSBcIi4uLy4uL2RcIjtcbmltcG9ydCB7IHVzZU1lcmdlLCB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbi8qKlxuICog5bel5YW35p2hXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNUb29sYmFyXCIsXG4gIGNvbXBvbmVudHM6IHsgRnNUYWJsZUNvbHVtbnNGaWx0ZXIgfSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDmjInpkq7phY3nva5cbiAgICAgKntcbiAgICAgKiAgIHNlYXJjaDp7fSwg5p+l6K+iXG4gICAgICogICByZWZyZXNoOnt9LCDliLfmlrBcbiAgICAgKiAgIGNvbXBhY3Q6e30sIOe0p+WHkeaooeW8j1xuICAgICAqICAgZXhwb3J0Ont9LCDlr7zlh7pcbiAgICAgKiAgIGNvbHVtbnM6e30g5YiX6K6+572uXG4gICAgICp9XG4gICAgICoqL1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5b2T5YmN5piv5ZCm57Sn5YeR5qih5byPXG4gICAgICovXG4gICAgY29tcGFjdDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWIl+mFjee9rlxuICAgICAqL1xuICAgIGNvbHVtbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxUYWJsZUNvbHVtbnNQcm9wcz4sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuS/neWtmOeUqOaIt+WIl+iuvue9rlxuICAgICAqIOS8oHN0cmluZ+WImeihqOekuuS8oOWFpee8k+WtmOeahOS4u2tleVxuICAgICAqL1xuICAgIHN0b3JhZ2U6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIEJvb2xlYW5dLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5o+S5qe9XG4gICAgICovXG4gICAgc2xvdHM6IHt9LFxuXG4gICAgLyoqXG4gICAgICog5YiX6K6+572u6YWN572uXG4gICAgICovXG4gICAgY29sdW1uc0ZpbHRlcjoge1xuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPGFueT5cbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJ1cGRhdGU6Y29sdW1uc1wiXSxcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4KSB7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG4gICAgY29uc3QgY29sdW1uc0ZpbHRlclJlZjogUmVmID0gcmVmKCk7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IGNvbXB1dGVkQnV0dG9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRCdXR0b25zOiBCdXR0b25zUHJvcHM8dm9pZD4gPSB7XG4gICAgICAgIGNvbHVtbnM6IHtcbiAgICAgICAgICBjbGljazogKCkgPT4ge1xuICAgICAgICAgICAgY29sdW1uc0ZpbHRlclJlZi52YWx1ZS5zdGFydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgbWVyZ2UoZGVmYXVsdEJ1dHRvbnMsIHByb3BzLmJ1dHRvbnMpO1xuICAgICAgLy8gaWYgKGRlZmF1bHRCdXR0b25zLnNlYXJjaCkge1xuICAgICAgLy8gICBkZWZhdWx0QnV0dG9ucy5zZWFyY2gudHlwZSA9IHByb3BzLnNlYXJjaCA/IFwicHJpbWFyeVwiIDogXCJkZWZhdWx0XCI7XG4gICAgICAvLyB9XG4gICAgICAvLyBpZiAoZGVmYXVsdEJ1dHRvbnMuY29tcGFjdCkge1xuICAgICAgLy8gICBkZWZhdWx0QnV0dG9ucy5jb21wYWN0LnR5cGUgPSBwcm9wcy5jb21wYWN0ID8gXCJwcmltYXJ5XCIgOiBcImRlZmF1bHRcIjtcbiAgICAgIC8vIH1cblxuICAgICAgbGV0IHNvcnRBcnI6IEJ1dHRvblByb3BzW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGRlZmF1bHRCdXR0b25zS2V5IGluIGRlZmF1bHRCdXR0b25zKSB7XG4gICAgICAgIHNvcnRBcnIucHVzaCh7XG4gICAgICAgICAgLi4uZGVmYXVsdEJ1dHRvbnNbZGVmYXVsdEJ1dHRvbnNLZXldLFxuICAgICAgICAgIF9rZXk6IGRlZmF1bHRCdXR0b25zS2V5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc29ydEFyciA9IHNvcnRCeShzb3J0QXJyLCAoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNvcnRlZEJ1dHRvbnM6IEJ1dHRvbnNQcm9wczx2b2lkPiA9IHt9O1xuXG4gICAgICBzb3J0QXJyLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgbGV0IF9rZXkgPSBpdGVtLl9rZXk7XG4gICAgICAgIGRlbGV0ZSBpdGVtLl9rZXk7XG4gICAgICAgIHNvcnRlZEJ1dHRvbnNbX2tleV0gPSBpdGVtO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc29ydGVkQnV0dG9ucztcbiAgICB9KTtcbiAgICBjb25zdCBwb3BvdmVyVmlzaWJsZSA9IHJlZihmYWxzZSk7XG4gICAgY29uc3QgaGFuZGxlU2ltcGxlQ2xpY2sgPSAoJGV2ZW50KSA9PiB7XG4gICAgICBpZiAodWkudHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcG9wb3ZlclZpc2libGUudmFsdWUgPSAhcG9wb3ZlclZpc2libGUudmFsdWU7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICBjb2x1bW5zRmlsdGVyUmVmLFxuICAgICAgY29tcHV0ZWRCdXR0b25zLFxuICAgICAgcG9wb3ZlclZpc2libGUsXG4gICAgICBoYW5kbGVTaW1wbGVDbGlja1xuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy10b29sYmFyIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAuZnMtYnV0dG9uIHtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICB9XG59XG48L3N0eWxlPlxuIiwiLyoqIVxuICogU29ydGFibGUgMS4xNC4wXG4gKiBAYXV0aG9yXHRSdWJhWGEgICA8dHJhc2hAcnViYXhhLm9yZz5cbiAqIEBhdXRob3JcdG93ZW5tICAgIDxvd2VuMjMzNTVAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtcblxuICAgIGlmIChlbnVtZXJhYmxlT25seSkge1xuICAgICAgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG5cbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG5cbiAgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpO1xuXG4gIHZhciBrZXksIGk7XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldO1xuICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcblxuICByZXR1cm4gYXJyMjtcbn1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxudmFyIHZlcnNpb24gPSBcIjEuMTQuMFwiO1xuXG5mdW5jdGlvbiB1c2VyQWdlbnQocGF0dGVybikge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lm5hdmlnYXRvcikge1xuICAgIHJldHVybiAhISAvKkBfX1BVUkVfXyovbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaChwYXR0ZXJuKTtcbiAgfVxufVxuXG52YXIgSUUxMU9yTGVzcyA9IHVzZXJBZ2VudCgvKD86VHJpZGVudC4qcnZbIDpdPzExXFwufG1zaWV8aWVtb2JpbGV8V2luZG93cyBQaG9uZSkvaSk7XG52YXIgRWRnZSA9IHVzZXJBZ2VudCgvRWRnZS9pKTtcbnZhciBGaXJlRm94ID0gdXNlckFnZW50KC9maXJlZm94L2kpO1xudmFyIFNhZmFyaSA9IHVzZXJBZ2VudCgvc2FmYXJpL2kpICYmICF1c2VyQWdlbnQoL2Nocm9tZS9pKSAmJiAhdXNlckFnZW50KC9hbmRyb2lkL2kpO1xudmFyIElPUyA9IHVzZXJBZ2VudCgvaVAoYWR8b2R8aG9uZSkvaSk7XG52YXIgQ2hyb21lRm9yQW5kcm9pZCA9IHVzZXJBZ2VudCgvY2hyb21lL2kpICYmIHVzZXJBZ2VudCgvYW5kcm9pZC9pKTtcblxudmFyIGNhcHR1cmVNb2RlID0ge1xuICBjYXB0dXJlOiBmYWxzZSxcbiAgcGFzc2l2ZTogZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIG9uKGVsLCBldmVudCwgZm4pIHtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZm4sICFJRTExT3JMZXNzICYmIGNhcHR1cmVNb2RlKTtcbn1cblxuZnVuY3Rpb24gb2ZmKGVsLCBldmVudCwgZm4pIHtcbiAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgZm4sICFJRTExT3JMZXNzICYmIGNhcHR1cmVNb2RlKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlcyhcbi8qKkhUTUxFbGVtZW50Ki9cbmVsLFxuLyoqU3RyaW5nKi9cbnNlbGVjdG9yKSB7XG4gIGlmICghc2VsZWN0b3IpIHJldHVybjtcbiAgc2VsZWN0b3JbMF0gPT09ICc+JyAmJiAoc2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHJpbmcoMSkpO1xuXG4gIGlmIChlbCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZWwubWF0Y2hlcykge1xuICAgICAgICByZXR1cm4gZWwubWF0Y2hlcyhzZWxlY3Rvcik7XG4gICAgICB9IGVsc2UgaWYgKGVsLm1zTWF0Y2hlc1NlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBlbC5tc01hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9IGVsc2UgaWYgKGVsLndlYmtpdE1hdGNoZXNTZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnRPckhvc3QoZWwpIHtcbiAgcmV0dXJuIGVsLmhvc3QgJiYgZWwgIT09IGRvY3VtZW50ICYmIGVsLmhvc3Qubm9kZVR5cGUgPyBlbC5ob3N0IDogZWwucGFyZW50Tm9kZTtcbn1cblxuZnVuY3Rpb24gY2xvc2VzdChcbi8qKkhUTUxFbGVtZW50Ki9cbmVsLFxuLyoqU3RyaW5nKi9cbnNlbGVjdG9yLFxuLyoqSFRNTEVsZW1lbnQqL1xuY3R4LCBpbmNsdWRlQ1RYKSB7XG4gIGlmIChlbCkge1xuICAgIGN0eCA9IGN0eCB8fCBkb2N1bWVudDtcblxuICAgIGRvIHtcbiAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsICYmIChzZWxlY3RvclswXSA9PT0gJz4nID8gZWwucGFyZW50Tm9kZSA9PT0gY3R4ICYmIG1hdGNoZXMoZWwsIHNlbGVjdG9yKSA6IG1hdGNoZXMoZWwsIHNlbGVjdG9yKSkgfHwgaW5jbHVkZUNUWCAmJiBlbCA9PT0gY3R4KSB7XG4gICAgICAgIHJldHVybiBlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsID09PSBjdHgpIGJyZWFrO1xuICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuICAgIH0gd2hpbGUgKGVsID0gZ2V0UGFyZW50T3JIb3N0KGVsKSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJfU1BBQ0UgPSAvXFxzKy9nO1xuXG5mdW5jdGlvbiB0b2dnbGVDbGFzcyhlbCwgbmFtZSwgc3RhdGUpIHtcbiAgaWYgKGVsICYmIG5hbWUpIHtcbiAgICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgICBlbC5jbGFzc0xpc3Rbc3RhdGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNsYXNzTmFtZSA9ICgnICcgKyBlbC5jbGFzc05hbWUgKyAnICcpLnJlcGxhY2UoUl9TUEFDRSwgJyAnKS5yZXBsYWNlKCcgJyArIG5hbWUgKyAnICcsICcgJyk7XG4gICAgICBlbC5jbGFzc05hbWUgPSAoY2xhc3NOYW1lICsgKHN0YXRlID8gJyAnICsgbmFtZSA6ICcnKSkucmVwbGFjZShSX1NQQUNFLCAnICcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjc3MoZWwsIHByb3AsIHZhbCkge1xuICB2YXIgc3R5bGUgPSBlbCAmJiBlbC5zdHlsZTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICBpZiAodmFsID09PSB2b2lkIDApIHtcbiAgICAgIGlmIChkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgICAgIHZhbCA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsICcnKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwuY3VycmVudFN0eWxlKSB7XG4gICAgICAgIHZhbCA9IGVsLmN1cnJlbnRTdHlsZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb3AgPT09IHZvaWQgMCA/IHZhbCA6IHZhbFtwcm9wXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEocHJvcCBpbiBzdHlsZSkgJiYgcHJvcC5pbmRleE9mKCd3ZWJraXQnKSA9PT0gLTEpIHtcbiAgICAgICAgcHJvcCA9ICctd2Via2l0LScgKyBwcm9wO1xuICAgICAgfVxuXG4gICAgICBzdHlsZVtwcm9wXSA9IHZhbCArICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/ICcnIDogJ3B4Jyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hdHJpeChlbCwgc2VsZk9ubHkpIHtcbiAgdmFyIGFwcGxpZWRUcmFuc2Zvcm1zID0gJyc7XG5cbiAgaWYgKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycpIHtcbiAgICBhcHBsaWVkVHJhbnNmb3JtcyA9IGVsO1xuICB9IGVsc2Uge1xuICAgIGRvIHtcbiAgICAgIHZhciB0cmFuc2Zvcm0gPSBjc3MoZWwsICd0cmFuc2Zvcm0nKTtcblxuICAgICAgaWYgKHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0gIT09ICdub25lJykge1xuICAgICAgICBhcHBsaWVkVHJhbnNmb3JtcyA9IHRyYW5zZm9ybSArICcgJyArIGFwcGxpZWRUcmFuc2Zvcm1zO1xuICAgICAgfVxuICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXG4gICAgfSB3aGlsZSAoIXNlbGZPbmx5ICYmIChlbCA9IGVsLnBhcmVudE5vZGUpKTtcbiAgfVxuXG4gIHZhciBtYXRyaXhGbiA9IHdpbmRvdy5ET01NYXRyaXggfHwgd2luZG93LldlYktpdENTU01hdHJpeCB8fCB3aW5kb3cuQ1NTTWF0cml4IHx8IHdpbmRvdy5NU0NTU01hdHJpeDtcbiAgLypqc2hpbnQgLVcwNTYgKi9cblxuICByZXR1cm4gbWF0cml4Rm4gJiYgbmV3IG1hdHJpeEZuKGFwcGxpZWRUcmFuc2Zvcm1zKTtcbn1cblxuZnVuY3Rpb24gZmluZChjdHgsIHRhZ05hbWUsIGl0ZXJhdG9yKSB7XG4gIGlmIChjdHgpIHtcbiAgICB2YXIgbGlzdCA9IGN0eC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKSxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIG4gPSBsaXN0Lmxlbmd0aDtcblxuICAgIGlmIChpdGVyYXRvcikge1xuICAgICAgZm9yICg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaXRlcmF0b3IobGlzdFtpXSwgaSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSB7XG4gIHZhciBzY3JvbGxpbmdFbGVtZW50ID0gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudDtcblxuICBpZiAoc2Nyb2xsaW5nRWxlbWVudCkge1xuICAgIHJldHVybiBzY3JvbGxpbmdFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cbn1cbi8qKlxuICogUmV0dXJucyB0aGUgXCJib3VuZGluZyBjbGllbnQgcmVjdFwiIG9mIGdpdmVuIGVsZW1lbnRcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVsZW1lbnQgd2hvc2UgYm91bmRpbmdDbGllbnRSZWN0IGlzIHdhbnRlZFxuICogQHBhcmFtICB7W0Jvb2xlYW5dfSByZWxhdGl2ZVRvQ29udGFpbmluZ0Jsb2NrICBXaGV0aGVyIHRoZSByZWN0IHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgY29udGFpbmluZyBibG9jayBvZiAoaW5jbHVkaW5nKSB0aGUgY29udGFpbmVyXG4gKiBAcGFyYW0gIHtbQm9vbGVhbl19IHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQgIFdoZXRoZXIgdGhlIHJlY3Qgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSByZWxhdGl2ZSBwYXJlbnQgb2YgKGluY2x1ZGluZykgdGhlIGNvbnRhaWVuclxuICogQHBhcmFtICB7W0Jvb2xlYW5dfSB1bmRvU2NhbGUgICAgICAgICAgICAgICAgICBXaGV0aGVyIHRoZSBjb250YWluZXIncyBzY2FsZSgpIHNob3VsZCBiZSB1bmRvbmVcbiAqIEBwYXJhbSAge1tIVE1MRWxlbWVudF19IGNvbnRhaW5lciAgICAgICAgICAgICAgVGhlIHBhcmVudCB0aGUgZWxlbWVudCB3aWxsIGJlIHBsYWNlZCBpblxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYm91bmRpbmdDbGllbnRSZWN0IG9mIGVsLCB3aXRoIHNwZWNpZmllZCBhZGp1c3RtZW50c1xuICovXG5cblxuZnVuY3Rpb24gZ2V0UmVjdChlbCwgcmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jaywgcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCwgdW5kb1NjYWxlLCBjb250YWluZXIpIHtcbiAgaWYgKCFlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgJiYgZWwgIT09IHdpbmRvdykgcmV0dXJuO1xuICB2YXIgZWxSZWN0LCB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQsIGhlaWdodCwgd2lkdGg7XG5cbiAgaWYgKGVsICE9PSB3aW5kb3cgJiYgZWwucGFyZW50Tm9kZSAmJiBlbCAhPT0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpKSB7XG4gICAgZWxSZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdG9wID0gZWxSZWN0LnRvcDtcbiAgICBsZWZ0ID0gZWxSZWN0LmxlZnQ7XG4gICAgYm90dG9tID0gZWxSZWN0LmJvdHRvbTtcbiAgICByaWdodCA9IGVsUmVjdC5yaWdodDtcbiAgICBoZWlnaHQgPSBlbFJlY3QuaGVpZ2h0O1xuICAgIHdpZHRoID0gZWxSZWN0LndpZHRoO1xuICB9IGVsc2Uge1xuICAgIHRvcCA9IDA7XG4gICAgbGVmdCA9IDA7XG4gICAgYm90dG9tID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgIHJpZ2h0ID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgIHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gIH1cblxuICBpZiAoKHJlbGF0aXZlVG9Db250YWluaW5nQmxvY2sgfHwgcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCkgJiYgZWwgIT09IHdpbmRvdykge1xuICAgIC8vIEFkanVzdCBmb3IgdHJhbnNsYXRlKClcbiAgICBjb250YWluZXIgPSBjb250YWluZXIgfHwgZWwucGFyZW50Tm9kZTsgLy8gc29sdmVzICMxMTIzIChzZWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNzk1MzgwNi82MDg4MzEyKVxuICAgIC8vIE5vdCBuZWVkZWQgb24gPD0gSUUxMVxuXG4gICAgaWYgKCFJRTExT3JMZXNzKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChjb250YWluZXIgJiYgY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiAoY3NzKGNvbnRhaW5lciwgJ3RyYW5zZm9ybScpICE9PSAnbm9uZScgfHwgcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCAmJiBjc3MoY29udGFpbmVyLCAncG9zaXRpb24nKSAhPT0gJ3N0YXRpYycpKSB7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IC8vIFNldCByZWxhdGl2ZSB0byBlZGdlcyBvZiBwYWRkaW5nIGJveCBvZiBjb250YWluZXJcblxuICAgICAgICAgIHRvcCAtPSBjb250YWluZXJSZWN0LnRvcCArIHBhcnNlSW50KGNzcyhjb250YWluZXIsICdib3JkZXItdG9wLXdpZHRoJykpO1xuICAgICAgICAgIGxlZnQgLT0gY29udGFpbmVyUmVjdC5sZWZ0ICsgcGFyc2VJbnQoY3NzKGNvbnRhaW5lciwgJ2JvcmRlci1sZWZ0LXdpZHRoJykpO1xuICAgICAgICAgIGJvdHRvbSA9IHRvcCArIGVsUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgcmlnaHQgPSBsZWZ0ICsgZWxSZWN0LndpZHRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuICAgICAgfSB3aGlsZSAoY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh1bmRvU2NhbGUgJiYgZWwgIT09IHdpbmRvdykge1xuICAgIC8vIEFkanVzdCBmb3Igc2NhbGUoKVxuICAgIHZhciBlbE1hdHJpeCA9IG1hdHJpeChjb250YWluZXIgfHwgZWwpLFxuICAgICAgICBzY2FsZVggPSBlbE1hdHJpeCAmJiBlbE1hdHJpeC5hLFxuICAgICAgICBzY2FsZVkgPSBlbE1hdHJpeCAmJiBlbE1hdHJpeC5kO1xuXG4gICAgaWYgKGVsTWF0cml4KSB7XG4gICAgICB0b3AgLz0gc2NhbGVZO1xuICAgICAgbGVmdCAvPSBzY2FsZVg7XG4gICAgICB3aWR0aCAvPSBzY2FsZVg7XG4gICAgICBoZWlnaHQgLz0gc2NhbGVZO1xuICAgICAgYm90dG9tID0gdG9wICsgaGVpZ2h0O1xuICAgICAgcmlnaHQgPSBsZWZ0ICsgd2lkdGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IHRvcCxcbiAgICBsZWZ0OiBsZWZ0LFxuICAgIGJvdHRvbTogYm90dG9tLFxuICAgIHJpZ2h0OiByaWdodCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGEgc2lkZSBvZiBhbiBlbGVtZW50IGlzIHNjcm9sbGVkIHBhc3QgYSBzaWRlIG9mIGl0cyBwYXJlbnRzXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gIGVsICAgICAgICAgICBUaGUgZWxlbWVudCB3aG8ncyBzaWRlIGJlaW5nIHNjcm9sbGVkIG91dCBvZiB2aWV3IGlzIGluIHF1ZXN0aW9uXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgIGVsU2lkZSAgICAgICBTaWRlIG9mIHRoZSBlbGVtZW50IGluIHF1ZXN0aW9uICgndG9wJywgJ2xlZnQnLCAncmlnaHQnLCAnYm90dG9tJylcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgcGFyZW50U2lkZSAgIFNpZGUgb2YgdGhlIHBhcmVudCBpbiBxdWVzdGlvbiAoJ3RvcCcsICdsZWZ0JywgJ3JpZ2h0JywgJ2JvdHRvbScpXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICAgICAgICAgICAgICBUaGUgcGFyZW50IHNjcm9sbCBlbGVtZW50IHRoYXQgdGhlIGVsJ3Mgc2lkZSBpcyBzY3JvbGxlZCBwYXN0LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gaXNTY3JvbGxlZFBhc3QoZWwsIGVsU2lkZSwgcGFyZW50U2lkZSkge1xuICB2YXIgcGFyZW50ID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWwsIHRydWUpLFxuICAgICAgZWxTaWRlVmFsID0gZ2V0UmVjdChlbClbZWxTaWRlXTtcbiAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICB2YXIgcGFyZW50U2lkZVZhbCA9IGdldFJlY3QocGFyZW50KVtwYXJlbnRTaWRlXSxcbiAgICAgICAgdmlzaWJsZSA9IHZvaWQgMDtcblxuICAgIGlmIChwYXJlbnRTaWRlID09PSAndG9wJyB8fCBwYXJlbnRTaWRlID09PSAnbGVmdCcpIHtcbiAgICAgIHZpc2libGUgPSBlbFNpZGVWYWwgPj0gcGFyZW50U2lkZVZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlzaWJsZSA9IGVsU2lkZVZhbCA8PSBwYXJlbnRTaWRlVmFsO1xuICAgIH1cblxuICAgIGlmICghdmlzaWJsZSkgcmV0dXJuIHBhcmVudDtcbiAgICBpZiAocGFyZW50ID09PSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCkpIGJyZWFrO1xuICAgIHBhcmVudCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KHBhcmVudCwgZmFsc2UpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBHZXRzIG50aCBjaGlsZCBvZiBlbCwgaWdub3JpbmcgaGlkZGVuIGNoaWxkcmVuLCBzb3J0YWJsZSdzIGVsZW1lbnRzIChkb2VzIG5vdCBpZ25vcmUgY2xvbmUgaWYgaXQncyB2aXNpYmxlKVxuICogYW5kIG5vbi1kcmFnZ2FibGUgZWxlbWVudHNcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICAgICBUaGUgcGFyZW50IGVsZW1lbnRcbiAqIEBwYXJhbSAge051bWJlcn0gY2hpbGROdW0gICAgICBUaGUgaW5kZXggb2YgdGhlIGNoaWxkXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgICAgICAgUGFyZW50IFNvcnRhYmxlJ3Mgb3B0aW9uc1xuICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgICAgICAgIFRoZSBjaGlsZCBhdCBpbmRleCBjaGlsZE51bSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldENoaWxkKGVsLCBjaGlsZE51bSwgb3B0aW9ucywgaW5jbHVkZURyYWdFbCkge1xuICB2YXIgY3VycmVudENoaWxkID0gMCxcbiAgICAgIGkgPSAwLFxuICAgICAgY2hpbGRyZW4gPSBlbC5jaGlsZHJlbjtcblxuICB3aGlsZSAoaSA8IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGlmIChjaGlsZHJlbltpXS5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgY2hpbGRyZW5baV0gIT09IFNvcnRhYmxlLmdob3N0ICYmIChpbmNsdWRlRHJhZ0VsIHx8IGNoaWxkcmVuW2ldICE9PSBTb3J0YWJsZS5kcmFnZ2VkKSAmJiBjbG9zZXN0KGNoaWxkcmVuW2ldLCBvcHRpb25zLmRyYWdnYWJsZSwgZWwsIGZhbHNlKSkge1xuICAgICAgaWYgKGN1cnJlbnRDaGlsZCA9PT0gY2hpbGROdW0pIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2ldO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50Q2hpbGQrKztcbiAgICB9XG5cbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2V0cyB0aGUgbGFzdCBjaGlsZCBpbiB0aGUgZWwsIGlnbm9yaW5nIGdob3N0RWwgb3IgaW52aXNpYmxlIGVsZW1lbnRzIChjbG9uZXMpXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgUGFyZW50IGVsZW1lbnRcbiAqIEBwYXJhbSAge3NlbGVjdG9yfSBzZWxlY3RvciAgICBBbnkgb3RoZXIgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgaWdub3JlZFxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgICAgICAgIFRoZSBsYXN0IGNoaWxkLCBpZ25vcmluZyBnaG9zdEVsXG4gKi9cblxuXG5mdW5jdGlvbiBsYXN0Q2hpbGQoZWwsIHNlbGVjdG9yKSB7XG4gIHZhciBsYXN0ID0gZWwubGFzdEVsZW1lbnRDaGlsZDtcblxuICB3aGlsZSAobGFzdCAmJiAobGFzdCA9PT0gU29ydGFibGUuZ2hvc3QgfHwgY3NzKGxhc3QsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBzZWxlY3RvciAmJiAhbWF0Y2hlcyhsYXN0LCBzZWxlY3RvcikpKSB7XG4gICAgbGFzdCA9IGxhc3QucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgfVxuXG4gIHJldHVybiBsYXN0IHx8IG51bGw7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIGFuIGVsZW1lbnQgd2l0aGluIGl0cyBwYXJlbnQgZm9yIGEgc2VsZWN0ZWQgc2V0IG9mXG4gKiBlbGVtZW50c1xuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcGFyYW0gIHtzZWxlY3Rvcn0gc2VsZWN0b3JcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuXG5cbmZ1bmN0aW9uIGluZGV4KGVsLCBzZWxlY3Rvcikge1xuICB2YXIgaW5kZXggPSAwO1xuXG4gIGlmICghZWwgfHwgIWVsLnBhcmVudE5vZGUpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXG5cbiAgd2hpbGUgKGVsID0gZWwucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgIGlmIChlbC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnVEVNUExBVEUnICYmIGVsICE9PSBTb3J0YWJsZS5jbG9uZSAmJiAoIXNlbGVjdG9yIHx8IG1hdGNoZXMoZWwsIHNlbGVjdG9yKSkpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZGV4O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBnaXZlbiBlbGVtZW50LCBhZGRlZCB3aXRoIGFsbCB0aGUgc2Nyb2xsIG9mZnNldHMgb2YgcGFyZW50IGVsZW1lbnRzLlxuICogVGhlIHZhbHVlIGlzIHJldHVybmVkIGluIHJlYWwgcGl4ZWxzLlxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgICAgICAgT2Zmc2V0cyBpbiB0aGUgZm9ybWF0IG9mIFtsZWZ0LCB0b3BdXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChlbCkge1xuICB2YXIgb2Zmc2V0TGVmdCA9IDAsXG4gICAgICBvZmZzZXRUb3AgPSAwLFxuICAgICAgd2luU2Nyb2xsZXIgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG5cbiAgaWYgKGVsKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGVsTWF0cml4ID0gbWF0cml4KGVsKSxcbiAgICAgICAgICBzY2FsZVggPSBlbE1hdHJpeC5hLFxuICAgICAgICAgIHNjYWxlWSA9IGVsTWF0cml4LmQ7XG4gICAgICBvZmZzZXRMZWZ0ICs9IGVsLnNjcm9sbExlZnQgKiBzY2FsZVg7XG4gICAgICBvZmZzZXRUb3AgKz0gZWwuc2Nyb2xsVG9wICogc2NhbGVZO1xuICAgIH0gd2hpbGUgKGVsICE9PSB3aW5TY3JvbGxlciAmJiAoZWwgPSBlbC5wYXJlbnROb2RlKSk7XG4gIH1cblxuICByZXR1cm4gW29mZnNldExlZnQsIG9mZnNldFRvcF07XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBvYmplY3Qgd2l0aGluIHRoZSBnaXZlbiBhcnJheVxuICogQHBhcmFtICB7QXJyYXl9IGFyciAgIEFycmF5IHRoYXQgbWF5IG9yIG1heSBub3QgaG9sZCB0aGUgb2JqZWN0XG4gKiBAcGFyYW0gIHtPYmplY3R9IG9iaiAgQW4gb2JqZWN0IHRoYXQgaGFzIGEga2V5LXZhbHVlIHBhaXIgdW5pcXVlIHRvIGFuZCBpZGVudGljYWwgdG8gYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgb2JqZWN0IHlvdSB3YW50IHRvIGZpbmRcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICBUaGUgaW5kZXggb2YgdGhlIG9iamVjdCBpbiB0aGUgYXJyYXksIG9yIC0xXG4gKi9cblxuXG5mdW5jdGlvbiBpbmRleE9mT2JqZWN0KGFyciwgb2JqKSB7XG4gIGZvciAodmFyIGkgaW4gYXJyKSB7XG4gICAgaWYgKCFhcnIuaGFzT3duUHJvcGVydHkoaSkpIGNvbnRpbnVlO1xuXG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG9ialtrZXldID09PSBhcnJbaV1ba2V5XSkgcmV0dXJuIE51bWJlcihpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsLCBpbmNsdWRlU2VsZikge1xuICAvLyBza2lwIHRvIHdpbmRvd1xuICBpZiAoIWVsIHx8ICFlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHJldHVybiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gIHZhciBlbGVtID0gZWw7XG4gIHZhciBnb3RTZWxmID0gZmFsc2U7XG5cbiAgZG8ge1xuICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gZ2V0IGVsZW0gY3NzIGlmIGl0IGlzbid0IGV2ZW4gb3ZlcmZsb3dpbmcgaW4gdGhlIGZpcnN0IHBsYWNlIChwZXJmb3JtYW5jZSlcbiAgICBpZiAoZWxlbS5jbGllbnRXaWR0aCA8IGVsZW0uc2Nyb2xsV2lkdGggfHwgZWxlbS5jbGllbnRIZWlnaHQgPCBlbGVtLnNjcm9sbEhlaWdodCkge1xuICAgICAgdmFyIGVsZW1DU1MgPSBjc3MoZWxlbSk7XG5cbiAgICAgIGlmIChlbGVtLmNsaWVudFdpZHRoIDwgZWxlbS5zY3JvbGxXaWR0aCAmJiAoZWxlbUNTUy5vdmVyZmxvd1ggPT0gJ2F1dG8nIHx8IGVsZW1DU1Mub3ZlcmZsb3dYID09ICdzY3JvbGwnKSB8fCBlbGVtLmNsaWVudEhlaWdodCA8IGVsZW0uc2Nyb2xsSGVpZ2h0ICYmIChlbGVtQ1NTLm92ZXJmbG93WSA9PSAnYXV0bycgfHwgZWxlbUNTUy5vdmVyZmxvd1kgPT0gJ3Njcm9sbCcpKSB7XG4gICAgICAgIGlmICghZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgfHwgZWxlbSA9PT0gZG9jdW1lbnQuYm9keSkgcmV0dXJuIGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAgICAgaWYgKGdvdFNlbGYgfHwgaW5jbHVkZVNlbGYpIHJldHVybiBlbGVtO1xuICAgICAgICBnb3RTZWxmID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuXG4gIH0gd2hpbGUgKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpO1xuXG4gIHJldHVybiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkc3QsIHNyYykge1xuICBpZiAoZHN0ICYmIHNyYykge1xuICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBkc3Rba2V5XSA9IHNyY1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkc3Q7XG59XG5cbmZ1bmN0aW9uIGlzUmVjdEVxdWFsKHJlY3QxLCByZWN0Mikge1xuICByZXR1cm4gTWF0aC5yb3VuZChyZWN0MS50b3ApID09PSBNYXRoLnJvdW5kKHJlY3QyLnRvcCkgJiYgTWF0aC5yb3VuZChyZWN0MS5sZWZ0KSA9PT0gTWF0aC5yb3VuZChyZWN0Mi5sZWZ0KSAmJiBNYXRoLnJvdW5kKHJlY3QxLmhlaWdodCkgPT09IE1hdGgucm91bmQocmVjdDIuaGVpZ2h0KSAmJiBNYXRoLnJvdW5kKHJlY3QxLndpZHRoKSA9PT0gTWF0aC5yb3VuZChyZWN0Mi53aWR0aCk7XG59XG5cbnZhciBfdGhyb3R0bGVUaW1lb3V0O1xuXG5mdW5jdGlvbiB0aHJvdHRsZShjYWxsYmFjaywgbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIV90aHJvdHRsZVRpbWVvdXQpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwoX3RoaXMsIGFyZ3NbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2suYXBwbHkoX3RoaXMsIGFyZ3MpO1xuICAgICAgfVxuXG4gICAgICBfdGhyb3R0bGVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aHJvdHRsZVRpbWVvdXQgPSB2b2lkIDA7XG4gICAgICB9LCBtcyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjYW5jZWxUaHJvdHRsZSgpIHtcbiAgY2xlYXJUaW1lb3V0KF90aHJvdHRsZVRpbWVvdXQpO1xuICBfdGhyb3R0bGVUaW1lb3V0ID0gdm9pZCAwO1xufVxuXG5mdW5jdGlvbiBzY3JvbGxCeShlbCwgeCwgeSkge1xuICBlbC5zY3JvbGxMZWZ0ICs9IHg7XG4gIGVsLnNjcm9sbFRvcCArPSB5O1xufVxuXG5mdW5jdGlvbiBjbG9uZShlbCkge1xuICB2YXIgUG9seW1lciA9IHdpbmRvdy5Qb2x5bWVyO1xuICB2YXIgJCA9IHdpbmRvdy5qUXVlcnkgfHwgd2luZG93LlplcHRvO1xuXG4gIGlmIChQb2x5bWVyICYmIFBvbHltZXIuZG9tKSB7XG4gICAgcmV0dXJuIFBvbHltZXIuZG9tKGVsKS5jbG9uZU5vZGUodHJ1ZSk7XG4gIH0gZWxzZSBpZiAoJCkge1xuICAgIHJldHVybiAkKGVsKS5jbG9uZSh0cnVlKVswXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZWwuY2xvbmVOb2RlKHRydWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlY3QoZWwsIHJlY3QpIHtcbiAgY3NzKGVsLCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgY3NzKGVsLCAndG9wJywgcmVjdC50b3ApO1xuICBjc3MoZWwsICdsZWZ0JywgcmVjdC5sZWZ0KTtcbiAgY3NzKGVsLCAnd2lkdGgnLCByZWN0LndpZHRoKTtcbiAgY3NzKGVsLCAnaGVpZ2h0JywgcmVjdC5oZWlnaHQpO1xufVxuXG5mdW5jdGlvbiB1bnNldFJlY3QoZWwpIHtcbiAgY3NzKGVsLCAncG9zaXRpb24nLCAnJyk7XG4gIGNzcyhlbCwgJ3RvcCcsICcnKTtcbiAgY3NzKGVsLCAnbGVmdCcsICcnKTtcbiAgY3NzKGVsLCAnd2lkdGgnLCAnJyk7XG4gIGNzcyhlbCwgJ2hlaWdodCcsICcnKTtcbn1cblxudmFyIGV4cGFuZG8gPSAnU29ydGFibGUnICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbmZ1bmN0aW9uIEFuaW1hdGlvblN0YXRlTWFuYWdlcigpIHtcbiAgdmFyIGFuaW1hdGlvblN0YXRlcyA9IFtdLFxuICAgICAgYW5pbWF0aW9uQ2FsbGJhY2tJZDtcbiAgcmV0dXJuIHtcbiAgICBjYXB0dXJlQW5pbWF0aW9uU3RhdGU6IGZ1bmN0aW9uIGNhcHR1cmVBbmltYXRpb25TdGF0ZSgpIHtcbiAgICAgIGFuaW1hdGlvblN0YXRlcyA9IFtdO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSByZXR1cm47XG4gICAgICB2YXIgY2hpbGRyZW4gPSBbXS5zbGljZS5jYWxsKHRoaXMuZWwuY2hpbGRyZW4pO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNzcyhjaGlsZCwgJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8IGNoaWxkID09PSBTb3J0YWJsZS5naG9zdCkgcmV0dXJuO1xuICAgICAgICBhbmltYXRpb25TdGF0ZXMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiBjaGlsZCxcbiAgICAgICAgICByZWN0OiBnZXRSZWN0KGNoaWxkKVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgZnJvbVJlY3QgPSBfb2JqZWN0U3ByZWFkMih7fSwgYW5pbWF0aW9uU3RhdGVzW2FuaW1hdGlvblN0YXRlcy5sZW5ndGggLSAxXS5yZWN0KTsgLy8gSWYgYW5pbWF0aW5nOiBjb21wZW5zYXRlIGZvciBjdXJyZW50IGFuaW1hdGlvblxuXG5cbiAgICAgICAgaWYgKGNoaWxkLnRoaXNBbmltYXRpb25EdXJhdGlvbikge1xuICAgICAgICAgIHZhciBjaGlsZE1hdHJpeCA9IG1hdHJpeChjaGlsZCwgdHJ1ZSk7XG5cbiAgICAgICAgICBpZiAoY2hpbGRNYXRyaXgpIHtcbiAgICAgICAgICAgIGZyb21SZWN0LnRvcCAtPSBjaGlsZE1hdHJpeC5mO1xuICAgICAgICAgICAgZnJvbVJlY3QubGVmdCAtPSBjaGlsZE1hdHJpeC5lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkLmZyb21SZWN0ID0gZnJvbVJlY3Q7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGFkZEFuaW1hdGlvblN0YXRlOiBmdW5jdGlvbiBhZGRBbmltYXRpb25TdGF0ZShzdGF0ZSkge1xuICAgICAgYW5pbWF0aW9uU3RhdGVzLnB1c2goc3RhdGUpO1xuICAgIH0sXG4gICAgcmVtb3ZlQW5pbWF0aW9uU3RhdGU6IGZ1bmN0aW9uIHJlbW92ZUFuaW1hdGlvblN0YXRlKHRhcmdldCkge1xuICAgICAgYW5pbWF0aW9uU3RhdGVzLnNwbGljZShpbmRleE9mT2JqZWN0KGFuaW1hdGlvblN0YXRlcywge1xuICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgfSksIDEpO1xuICAgIH0sXG4gICAgYW5pbWF0ZUFsbDogZnVuY3Rpb24gYW5pbWF0ZUFsbChjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChhbmltYXRpb25DYWxsYmFja0lkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgYW5pbWF0aW5nID0gZmFsc2UsXG4gICAgICAgICAgYW5pbWF0aW9uVGltZSA9IDA7XG4gICAgICBhbmltYXRpb25TdGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgdmFyIHRpbWUgPSAwLFxuICAgICAgICAgICAgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0LFxuICAgICAgICAgICAgZnJvbVJlY3QgPSB0YXJnZXQuZnJvbVJlY3QsXG4gICAgICAgICAgICB0b1JlY3QgPSBnZXRSZWN0KHRhcmdldCksXG4gICAgICAgICAgICBwcmV2RnJvbVJlY3QgPSB0YXJnZXQucHJldkZyb21SZWN0LFxuICAgICAgICAgICAgcHJldlRvUmVjdCA9IHRhcmdldC5wcmV2VG9SZWN0LFxuICAgICAgICAgICAgYW5pbWF0aW5nUmVjdCA9IHN0YXRlLnJlY3QsXG4gICAgICAgICAgICB0YXJnZXRNYXRyaXggPSBtYXRyaXgodGFyZ2V0LCB0cnVlKTtcblxuICAgICAgICBpZiAodGFyZ2V0TWF0cml4KSB7XG4gICAgICAgICAgLy8gQ29tcGVuc2F0ZSBmb3IgY3VycmVudCBhbmltYXRpb25cbiAgICAgICAgICB0b1JlY3QudG9wIC09IHRhcmdldE1hdHJpeC5mO1xuICAgICAgICAgIHRvUmVjdC5sZWZ0IC09IHRhcmdldE1hdHJpeC5lO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0LnRvUmVjdCA9IHRvUmVjdDtcblxuICAgICAgICBpZiAodGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbikge1xuICAgICAgICAgIC8vIENvdWxkIGFsc28gY2hlY2sgaWYgYW5pbWF0aW5nUmVjdCBpcyBiZXR3ZWVuIGZyb21SZWN0IGFuZCB0b1JlY3RcbiAgICAgICAgICBpZiAoaXNSZWN0RXF1YWwocHJldkZyb21SZWN0LCB0b1JlY3QpICYmICFpc1JlY3RFcXVhbChmcm9tUmVjdCwgdG9SZWN0KSAmJiAvLyBNYWtlIHN1cmUgYW5pbWF0aW5nUmVjdCBpcyBvbiBsaW5lIGJldHdlZW4gdG9SZWN0ICYgZnJvbVJlY3RcbiAgICAgICAgICAoYW5pbWF0aW5nUmVjdC50b3AgLSB0b1JlY3QudG9wKSAvIChhbmltYXRpbmdSZWN0LmxlZnQgLSB0b1JlY3QubGVmdCkgPT09IChmcm9tUmVjdC50b3AgLSB0b1JlY3QudG9wKSAvIChmcm9tUmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQpKSB7XG4gICAgICAgICAgICAvLyBJZiByZXR1cm5pbmcgdG8gc2FtZSBwbGFjZSBhcyBzdGFydGVkIGZyb20gYW5pbWF0aW9uIGFuZCBvbiBzYW1lIGF4aXNcbiAgICAgICAgICAgIHRpbWUgPSBjYWxjdWxhdGVSZWFsVGltZShhbmltYXRpbmdSZWN0LCBwcmV2RnJvbVJlY3QsIHByZXZUb1JlY3QsIF90aGlzLm9wdGlvbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBpZiBmcm9tUmVjdCAhPSB0b1JlY3Q6IGFuaW1hdGVcblxuXG4gICAgICAgIGlmICghaXNSZWN0RXF1YWwodG9SZWN0LCBmcm9tUmVjdCkpIHtcbiAgICAgICAgICB0YXJnZXQucHJldkZyb21SZWN0ID0gZnJvbVJlY3Q7XG4gICAgICAgICAgdGFyZ2V0LnByZXZUb1JlY3QgPSB0b1JlY3Q7XG5cbiAgICAgICAgICBpZiAoIXRpbWUpIHtcbiAgICAgICAgICAgIHRpbWUgPSBfdGhpcy5vcHRpb25zLmFuaW1hdGlvbjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5hbmltYXRlKHRhcmdldCwgYW5pbWF0aW5nUmVjdCwgdG9SZWN0LCB0aW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgYW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBhbmltYXRpb25UaW1lID0gTWF0aC5tYXgoYW5pbWF0aW9uVGltZSwgdGltZSk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRhcmdldC5hbmltYXRpb25SZXNldFRpbWVyKTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0aW9uUmVzZXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGFyZ2V0LmFuaW1hdGlvblRpbWUgPSAwO1xuICAgICAgICAgICAgdGFyZ2V0LnByZXZGcm9tUmVjdCA9IG51bGw7XG4gICAgICAgICAgICB0YXJnZXQuZnJvbVJlY3QgPSBudWxsO1xuICAgICAgICAgICAgdGFyZ2V0LnByZXZUb1JlY3QgPSBudWxsO1xuICAgICAgICAgICAgdGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgfSwgdGltZSk7XG4gICAgICAgICAgdGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IHRpbWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2xlYXJUaW1lb3V0KGFuaW1hdGlvbkNhbGxiYWNrSWQpO1xuXG4gICAgICBpZiAoIWFuaW1hdGluZykge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW5pbWF0aW9uQ2FsbGJhY2tJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKCk7XG4gICAgICAgIH0sIGFuaW1hdGlvblRpbWUpO1xuICAgICAgfVxuXG4gICAgICBhbmltYXRpb25TdGF0ZXMgPSBbXTtcbiAgICB9LFxuICAgIGFuaW1hdGU6IGZ1bmN0aW9uIGFuaW1hdGUodGFyZ2V0LCBjdXJyZW50UmVjdCwgdG9SZWN0LCBkdXJhdGlvbikge1xuICAgICAgaWYgKGR1cmF0aW9uKSB7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2l0aW9uJywgJycpO1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJycpO1xuICAgICAgICB2YXIgZWxNYXRyaXggPSBtYXRyaXgodGhpcy5lbCksXG4gICAgICAgICAgICBzY2FsZVggPSBlbE1hdHJpeCAmJiBlbE1hdHJpeC5hLFxuICAgICAgICAgICAgc2NhbGVZID0gZWxNYXRyaXggJiYgZWxNYXRyaXguZCxcbiAgICAgICAgICAgIHRyYW5zbGF0ZVggPSAoY3VycmVudFJlY3QubGVmdCAtIHRvUmVjdC5sZWZ0KSAvIChzY2FsZVggfHwgMSksXG4gICAgICAgICAgICB0cmFuc2xhdGVZID0gKGN1cnJlbnRSZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKHNjYWxlWSB8fCAxKTtcbiAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1ggPSAhIXRyYW5zbGF0ZVg7XG4gICAgICAgIHRhcmdldC5hbmltYXRpbmdZID0gISF0cmFuc2xhdGVZO1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZTNkKCcgKyB0cmFuc2xhdGVYICsgJ3B4LCcgKyB0cmFuc2xhdGVZICsgJ3B4LDApJyk7XG4gICAgICAgIHRoaXMuZm9yUmVwYWludER1bW15ID0gcmVwYWludCh0YXJnZXQpOyAvLyByZXBhaW50XG5cbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAndHJhbnNmb3JtICcgKyBkdXJhdGlvbiArICdtcycgKyAodGhpcy5vcHRpb25zLmVhc2luZyA/ICcgJyArIHRoaXMub3B0aW9ucy5lYXNpbmcgOiAnJykpO1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZTNkKDAsMCwwKScpO1xuICAgICAgICB0eXBlb2YgdGFyZ2V0LmFuaW1hdGVkID09PSAnbnVtYmVyJyAmJiBjbGVhclRpbWVvdXQodGFyZ2V0LmFuaW1hdGVkKTtcbiAgICAgICAgdGFyZ2V0LmFuaW1hdGVkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICcnKTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0aW5nWCA9IGZhbHNlO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpbmdZID0gZmFsc2U7XG4gICAgICAgIH0sIGR1cmF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlcGFpbnQodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQub2Zmc2V0V2lkdGg7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVJlYWxUaW1lKGFuaW1hdGluZ1JlY3QsIGZyb21SZWN0LCB0b1JlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhmcm9tUmVjdC50b3AgLSBhbmltYXRpbmdSZWN0LnRvcCwgMikgKyBNYXRoLnBvdyhmcm9tUmVjdC5sZWZ0IC0gYW5pbWF0aW5nUmVjdC5sZWZ0LCAyKSkgLyBNYXRoLnNxcnQoTWF0aC5wb3coZnJvbVJlY3QudG9wIC0gdG9SZWN0LnRvcCwgMikgKyBNYXRoLnBvdyhmcm9tUmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQsIDIpKSAqIG9wdGlvbnMuYW5pbWF0aW9uO1xufVxuXG52YXIgcGx1Z2lucyA9IFtdO1xudmFyIGRlZmF1bHRzID0ge1xuICBpbml0aWFsaXplQnlEZWZhdWx0OiB0cnVlXG59O1xudmFyIFBsdWdpbk1hbmFnZXIgPSB7XG4gIG1vdW50OiBmdW5jdGlvbiBtb3VudChwbHVnaW4pIHtcbiAgICAvLyBTZXQgZGVmYXVsdCBzdGF0aWMgcHJvcGVydGllc1xuICAgIGZvciAodmFyIG9wdGlvbiBpbiBkZWZhdWx0cykge1xuICAgICAgaWYgKGRlZmF1bHRzLmhhc093blByb3BlcnR5KG9wdGlvbikgJiYgIShvcHRpb24gaW4gcGx1Z2luKSkge1xuICAgICAgICBwbHVnaW5bb3B0aW9uXSA9IGRlZmF1bHRzW29wdGlvbl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAocC5wbHVnaW5OYW1lID09PSBwbHVnaW4ucGx1Z2luTmFtZSkge1xuICAgICAgICB0aHJvdyBcIlNvcnRhYmxlOiBDYW5ub3QgbW91bnQgcGx1Z2luIFwiLmNvbmNhdChwbHVnaW4ucGx1Z2luTmFtZSwgXCIgbW9yZSB0aGFuIG9uY2VcIik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gIH0sXG4gIHBsdWdpbkV2ZW50OiBmdW5jdGlvbiBwbHVnaW5FdmVudChldmVudE5hbWUsIHNvcnRhYmxlLCBldnQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5ldmVudENhbmNlbGVkID0gZmFsc2U7XG5cbiAgICBldnQuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuZXZlbnRDYW5jZWxlZCA9IHRydWU7XG4gICAgfTtcblxuICAgIHZhciBldmVudE5hbWVHbG9iYWwgPSBldmVudE5hbWUgKyAnR2xvYmFsJztcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgaWYgKCFzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0pIHJldHVybjsgLy8gRmlyZSBnbG9iYWwgZXZlbnRzIGlmIGl0IGV4aXN0cyBpbiB0aGlzIHNvcnRhYmxlXG5cbiAgICAgIGlmIChzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lR2xvYmFsXSkge1xuICAgICAgICBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lR2xvYmFsXShfb2JqZWN0U3ByZWFkMih7XG4gICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlXG4gICAgICAgIH0sIGV2dCkpO1xuICAgICAgfSAvLyBPbmx5IGZpcmUgcGx1Z2luIGV2ZW50IGlmIHBsdWdpbiBpcyBlbmFibGVkIGluIHRoaXMgc29ydGFibGUsXG4gICAgICAvLyBhbmQgcGx1Z2luIGhhcyBldmVudCBkZWZpbmVkXG5cblxuICAgICAgaWYgKHNvcnRhYmxlLm9wdGlvbnNbcGx1Z2luLnBsdWdpbk5hbWVdICYmIHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVdKSB7XG4gICAgICAgIHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVdKF9vYmplY3RTcHJlYWQyKHtcbiAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGVcbiAgICAgICAgfSwgZXZ0KSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIGluaXRpYWxpemVQbHVnaW5zOiBmdW5jdGlvbiBpbml0aWFsaXplUGx1Z2lucyhzb3J0YWJsZSwgZWwsIGRlZmF1bHRzLCBvcHRpb25zKSB7XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHZhciBwbHVnaW5OYW1lID0gcGx1Z2luLnBsdWdpbk5hbWU7XG4gICAgICBpZiAoIXNvcnRhYmxlLm9wdGlvbnNbcGx1Z2luTmFtZV0gJiYgIXBsdWdpbi5pbml0aWFsaXplQnlEZWZhdWx0KSByZXR1cm47XG4gICAgICB2YXIgaW5pdGlhbGl6ZWQgPSBuZXcgcGx1Z2luKHNvcnRhYmxlLCBlbCwgc29ydGFibGUub3B0aW9ucyk7XG4gICAgICBpbml0aWFsaXplZC5zb3J0YWJsZSA9IHNvcnRhYmxlO1xuICAgICAgaW5pdGlhbGl6ZWQub3B0aW9ucyA9IHNvcnRhYmxlLm9wdGlvbnM7XG4gICAgICBzb3J0YWJsZVtwbHVnaW5OYW1lXSA9IGluaXRpYWxpemVkOyAvLyBBZGQgZGVmYXVsdCBvcHRpb25zIGZyb20gcGx1Z2luXG5cbiAgICAgIF9leHRlbmRzKGRlZmF1bHRzLCBpbml0aWFsaXplZC5kZWZhdWx0cyk7XG4gICAgfSk7XG5cbiAgICBmb3IgKHZhciBvcHRpb24gaW4gc29ydGFibGUub3B0aW9ucykge1xuICAgICAgaWYgKCFzb3J0YWJsZS5vcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbikpIGNvbnRpbnVlO1xuICAgICAgdmFyIG1vZGlmaWVkID0gdGhpcy5tb2RpZnlPcHRpb24oc29ydGFibGUsIG9wdGlvbiwgc29ydGFibGUub3B0aW9uc1tvcHRpb25dKTtcblxuICAgICAgaWYgKHR5cGVvZiBtb2RpZmllZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc29ydGFibGUub3B0aW9uc1tvcHRpb25dID0gbW9kaWZpZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBnZXRFdmVudFByb3BlcnRpZXM6IGZ1bmN0aW9uIGdldEV2ZW50UHJvcGVydGllcyhuYW1lLCBzb3J0YWJsZSkge1xuICAgIHZhciBldmVudFByb3BlcnRpZXMgPSB7fTtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgaWYgKHR5cGVvZiBwbHVnaW4uZXZlbnRQcm9wZXJ0aWVzICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XG5cbiAgICAgIF9leHRlbmRzKGV2ZW50UHJvcGVydGllcywgcGx1Z2luLmV2ZW50UHJvcGVydGllcy5jYWxsKHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSwgbmFtZSkpO1xuICAgIH0pO1xuICAgIHJldHVybiBldmVudFByb3BlcnRpZXM7XG4gIH0sXG4gIG1vZGlmeU9wdGlvbjogZnVuY3Rpb24gbW9kaWZ5T3B0aW9uKHNvcnRhYmxlLCBuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBtb2RpZmllZFZhbHVlO1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICAvLyBQbHVnaW4gbXVzdCBleGlzdCBvbiB0aGUgU29ydGFibGVcbiAgICAgIGlmICghc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdKSByZXR1cm47IC8vIElmIHN0YXRpYyBvcHRpb24gbGlzdGVuZXIgZXhpc3RzIGZvciB0aGlzIG9wdGlvbiwgY2FsbCBpbiB0aGUgY29udGV4dCBvZiB0aGUgU29ydGFibGUncyBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpblxuXG4gICAgICBpZiAocGx1Z2luLm9wdGlvbkxpc3RlbmVycyAmJiB0eXBlb2YgcGx1Z2luLm9wdGlvbkxpc3RlbmVyc1tuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtb2RpZmllZFZhbHVlID0gcGx1Z2luLm9wdGlvbkxpc3RlbmVyc1tuYW1lXS5jYWxsKHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtb2RpZmllZFZhbHVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KF9yZWYpIHtcbiAgdmFyIHNvcnRhYmxlID0gX3JlZi5zb3J0YWJsZSxcbiAgICAgIHJvb3RFbCA9IF9yZWYucm9vdEVsLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgIHRhcmdldEVsID0gX3JlZi50YXJnZXRFbCxcbiAgICAgIGNsb25lRWwgPSBfcmVmLmNsb25lRWwsXG4gICAgICB0b0VsID0gX3JlZi50b0VsLFxuICAgICAgZnJvbUVsID0gX3JlZi5mcm9tRWwsXG4gICAgICBvbGRJbmRleCA9IF9yZWYub2xkSW5kZXgsXG4gICAgICBuZXdJbmRleCA9IF9yZWYubmV3SW5kZXgsXG4gICAgICBvbGREcmFnZ2FibGVJbmRleCA9IF9yZWYub2xkRHJhZ2dhYmxlSW5kZXgsXG4gICAgICBuZXdEcmFnZ2FibGVJbmRleCA9IF9yZWYubmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgICBvcmlnaW5hbEV2ZW50ID0gX3JlZi5vcmlnaW5hbEV2ZW50LFxuICAgICAgcHV0U29ydGFibGUgPSBfcmVmLnB1dFNvcnRhYmxlLFxuICAgICAgZXh0cmFFdmVudFByb3BlcnRpZXMgPSBfcmVmLmV4dHJhRXZlbnRQcm9wZXJ0aWVzO1xuICBzb3J0YWJsZSA9IHNvcnRhYmxlIHx8IHJvb3RFbCAmJiByb290RWxbZXhwYW5kb107XG4gIGlmICghc29ydGFibGUpIHJldHVybjtcbiAgdmFyIGV2dCxcbiAgICAgIG9wdGlvbnMgPSBzb3J0YWJsZS5vcHRpb25zLFxuICAgICAgb25OYW1lID0gJ29uJyArIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cigxKTsgLy8gU3VwcG9ydCBmb3IgbmV3IEN1c3RvbUV2ZW50IGZlYXR1cmVcblxuICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmICFJRTExT3JMZXNzICYmICFFZGdlKSB7XG4gICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KG5hbWUsIHtcbiAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZ0LmluaXRFdmVudChuYW1lLCB0cnVlLCB0cnVlKTtcbiAgfVxuXG4gIGV2dC50byA9IHRvRWwgfHwgcm9vdEVsO1xuICBldnQuZnJvbSA9IGZyb21FbCB8fCByb290RWw7XG4gIGV2dC5pdGVtID0gdGFyZ2V0RWwgfHwgcm9vdEVsO1xuICBldnQuY2xvbmUgPSBjbG9uZUVsO1xuICBldnQub2xkSW5kZXggPSBvbGRJbmRleDtcbiAgZXZ0Lm5ld0luZGV4ID0gbmV3SW5kZXg7XG4gIGV2dC5vbGREcmFnZ2FibGVJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4O1xuICBldnQubmV3RHJhZ2dhYmxlSW5kZXggPSBuZXdEcmFnZ2FibGVJbmRleDtcbiAgZXZ0Lm9yaWdpbmFsRXZlbnQgPSBvcmlnaW5hbEV2ZW50O1xuICBldnQucHVsbE1vZGUgPSBwdXRTb3J0YWJsZSA/IHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlIDogdW5kZWZpbmVkO1xuXG4gIHZhciBhbGxFdmVudFByb3BlcnRpZXMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgZXh0cmFFdmVudFByb3BlcnRpZXMpLCBQbHVnaW5NYW5hZ2VyLmdldEV2ZW50UHJvcGVydGllcyhuYW1lLCBzb3J0YWJsZSkpO1xuXG4gIGZvciAodmFyIG9wdGlvbiBpbiBhbGxFdmVudFByb3BlcnRpZXMpIHtcbiAgICBldnRbb3B0aW9uXSA9IGFsbEV2ZW50UHJvcGVydGllc1tvcHRpb25dO1xuICB9XG5cbiAgaWYgKHJvb3RFbCkge1xuICAgIHJvb3RFbC5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gIH1cblxuICBpZiAob3B0aW9uc1tvbk5hbWVdKSB7XG4gICAgb3B0aW9uc1tvbk5hbWVdLmNhbGwoc29ydGFibGUsIGV2dCk7XG4gIH1cbn1cblxudmFyIF9leGNsdWRlZCA9IFtcImV2dFwiXTtcblxudmFyIHBsdWdpbkV2ZW50ID0gZnVuY3Rpb24gcGx1Z2luRXZlbnQoZXZlbnROYW1lLCBzb3J0YWJsZSkge1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge30sXG4gICAgICBvcmlnaW5hbEV2ZW50ID0gX3JlZi5ldnQsXG4gICAgICBkYXRhID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgUGx1Z2luTWFuYWdlci5wbHVnaW5FdmVudC5iaW5kKFNvcnRhYmxlKShldmVudE5hbWUsIHNvcnRhYmxlLCBfb2JqZWN0U3ByZWFkMih7XG4gICAgZHJhZ0VsOiBkcmFnRWwsXG4gICAgcGFyZW50RWw6IHBhcmVudEVsLFxuICAgIGdob3N0RWw6IGdob3N0RWwsXG4gICAgcm9vdEVsOiByb290RWwsXG4gICAgbmV4dEVsOiBuZXh0RWwsXG4gICAgbGFzdERvd25FbDogbGFzdERvd25FbCxcbiAgICBjbG9uZUVsOiBjbG9uZUVsLFxuICAgIGNsb25lSGlkZGVuOiBjbG9uZUhpZGRlbixcbiAgICBkcmFnU3RhcnRlZDogbW92ZWQsXG4gICAgcHV0U29ydGFibGU6IHB1dFNvcnRhYmxlLFxuICAgIGFjdGl2ZVNvcnRhYmxlOiBTb3J0YWJsZS5hY3RpdmUsXG4gICAgb3JpZ2luYWxFdmVudDogb3JpZ2luYWxFdmVudCxcbiAgICBvbGRJbmRleDogb2xkSW5kZXgsXG4gICAgb2xkRHJhZ2dhYmxlSW5kZXg6IG9sZERyYWdnYWJsZUluZGV4LFxuICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICBuZXdEcmFnZ2FibGVJbmRleDogbmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgaGlkZUdob3N0Rm9yVGFyZ2V0OiBfaGlkZUdob3N0Rm9yVGFyZ2V0LFxuICAgIHVuaGlkZUdob3N0Rm9yVGFyZ2V0OiBfdW5oaWRlR2hvc3RGb3JUYXJnZXQsXG4gICAgY2xvbmVOb3dIaWRkZW46IGZ1bmN0aW9uIGNsb25lTm93SGlkZGVuKCkge1xuICAgICAgY2xvbmVIaWRkZW4gPSB0cnVlO1xuICAgIH0sXG4gICAgY2xvbmVOb3dTaG93bjogZnVuY3Rpb24gY2xvbmVOb3dTaG93bigpIHtcbiAgICAgIGNsb25lSGlkZGVuID0gZmFsc2U7XG4gICAgfSxcbiAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQ6IGZ1bmN0aW9uIGRpc3BhdGNoU29ydGFibGVFdmVudChuYW1lKSB7XG4gICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogb3JpZ2luYWxFdmVudFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBkYXRhKSk7XG59O1xuXG5mdW5jdGlvbiBfZGlzcGF0Y2hFdmVudChpbmZvKSB7XG4gIGRpc3BhdGNoRXZlbnQoX29iamVjdFNwcmVhZDIoe1xuICAgIHB1dFNvcnRhYmxlOiBwdXRTb3J0YWJsZSxcbiAgICBjbG9uZUVsOiBjbG9uZUVsLFxuICAgIHRhcmdldEVsOiBkcmFnRWwsXG4gICAgcm9vdEVsOiByb290RWwsXG4gICAgb2xkSW5kZXg6IG9sZEluZGV4LFxuICAgIG9sZERyYWdnYWJsZUluZGV4OiBvbGREcmFnZ2FibGVJbmRleCxcbiAgICBuZXdJbmRleDogbmV3SW5kZXgsXG4gICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4XG4gIH0sIGluZm8pKTtcbn1cblxudmFyIGRyYWdFbCxcbiAgICBwYXJlbnRFbCxcbiAgICBnaG9zdEVsLFxuICAgIHJvb3RFbCxcbiAgICBuZXh0RWwsXG4gICAgbGFzdERvd25FbCxcbiAgICBjbG9uZUVsLFxuICAgIGNsb25lSGlkZGVuLFxuICAgIG9sZEluZGV4LFxuICAgIG5ld0luZGV4LFxuICAgIG9sZERyYWdnYWJsZUluZGV4LFxuICAgIG5ld0RyYWdnYWJsZUluZGV4LFxuICAgIGFjdGl2ZUdyb3VwLFxuICAgIHB1dFNvcnRhYmxlLFxuICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSBmYWxzZSxcbiAgICBpZ25vcmVOZXh0Q2xpY2sgPSBmYWxzZSxcbiAgICBzb3J0YWJsZXMgPSBbXSxcbiAgICB0YXBFdnQsXG4gICAgdG91Y2hFdnQsXG4gICAgbGFzdER4LFxuICAgIGxhc3REeSxcbiAgICB0YXBEaXN0YW5jZUxlZnQsXG4gICAgdGFwRGlzdGFuY2VUb3AsXG4gICAgbW92ZWQsXG4gICAgbGFzdFRhcmdldCxcbiAgICBsYXN0RGlyZWN0aW9uLFxuICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IGZhbHNlLFxuICAgIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSBmYWxzZSxcbiAgICB0YXJnZXRNb3ZlRGlzdGFuY2UsXG4gICAgLy8gRm9yIHBvc2l0aW9uaW5nIGdob3N0IGFic29sdXRlbHlcbmdob3N0UmVsYXRpdmVQYXJlbnQsXG4gICAgZ2hvc3RSZWxhdGl2ZVBhcmVudEluaXRpYWxTY3JvbGwgPSBbXSxcbiAgICAvLyAobGVmdCwgdG9wKVxuX3NpbGVudCA9IGZhbHNlLFxuICAgIHNhdmVkSW5wdXRDaGVja2VkID0gW107XG4vKiogQGNvbnN0ICovXG5cbnZhciBkb2N1bWVudEV4aXN0cyA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgUG9zaXRpb25HaG9zdEFic29sdXRlbHkgPSBJT1MsXG4gICAgQ1NTRmxvYXRQcm9wZXJ0eSA9IEVkZ2UgfHwgSUUxMU9yTGVzcyA/ICdjc3NGbG9hdCcgOiAnZmxvYXQnLFxuICAgIC8vIFRoaXMgd2lsbCBub3QgcGFzcyBmb3IgSUU5LCBiZWNhdXNlIElFOSBEbkQgb25seSB3b3JrcyBvbiBhbmNob3JzXG5zdXBwb3J0RHJhZ2dhYmxlID0gZG9jdW1lbnRFeGlzdHMgJiYgIUNocm9tZUZvckFuZHJvaWQgJiYgIUlPUyAmJiAnZHJhZ2dhYmxlJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxcbiAgICBzdXBwb3J0Q3NzUG9pbnRlckV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCFkb2N1bWVudEV4aXN0cykgcmV0dXJuOyAvLyBmYWxzZSB3aGVuIDw9IElFMTFcblxuICBpZiAoSUUxMU9yTGVzcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3gnKTtcbiAgZWwuc3R5bGUuY3NzVGV4dCA9ICdwb2ludGVyLWV2ZW50czphdXRvJztcbiAgcmV0dXJuIGVsLnN0eWxlLnBvaW50ZXJFdmVudHMgPT09ICdhdXRvJztcbn0oKSxcbiAgICBfZGV0ZWN0RGlyZWN0aW9uID0gZnVuY3Rpb24gX2RldGVjdERpcmVjdGlvbihlbCwgb3B0aW9ucykge1xuICB2YXIgZWxDU1MgPSBjc3MoZWwpLFxuICAgICAgZWxXaWR0aCA9IHBhcnNlSW50KGVsQ1NTLndpZHRoKSAtIHBhcnNlSW50KGVsQ1NTLnBhZGRpbmdMZWZ0KSAtIHBhcnNlSW50KGVsQ1NTLnBhZGRpbmdSaWdodCkgLSBwYXJzZUludChlbENTUy5ib3JkZXJMZWZ0V2lkdGgpIC0gcGFyc2VJbnQoZWxDU1MuYm9yZGVyUmlnaHRXaWR0aCksXG4gICAgICBjaGlsZDEgPSBnZXRDaGlsZChlbCwgMCwgb3B0aW9ucyksXG4gICAgICBjaGlsZDIgPSBnZXRDaGlsZChlbCwgMSwgb3B0aW9ucyksXG4gICAgICBmaXJzdENoaWxkQ1NTID0gY2hpbGQxICYmIGNzcyhjaGlsZDEpLFxuICAgICAgc2Vjb25kQ2hpbGRDU1MgPSBjaGlsZDIgJiYgY3NzKGNoaWxkMiksXG4gICAgICBmaXJzdENoaWxkV2lkdGggPSBmaXJzdENoaWxkQ1NTICYmIHBhcnNlSW50KGZpcnN0Q2hpbGRDU1MubWFyZ2luTGVmdCkgKyBwYXJzZUludChmaXJzdENoaWxkQ1NTLm1hcmdpblJpZ2h0KSArIGdldFJlY3QoY2hpbGQxKS53aWR0aCxcbiAgICAgIHNlY29uZENoaWxkV2lkdGggPSBzZWNvbmRDaGlsZENTUyAmJiBwYXJzZUludChzZWNvbmRDaGlsZENTUy5tYXJnaW5MZWZ0KSArIHBhcnNlSW50KHNlY29uZENoaWxkQ1NTLm1hcmdpblJpZ2h0KSArIGdldFJlY3QoY2hpbGQyKS53aWR0aDtcblxuICBpZiAoZWxDU1MuZGlzcGxheSA9PT0gJ2ZsZXgnKSB7XG4gICAgcmV0dXJuIGVsQ1NTLmZsZXhEaXJlY3Rpb24gPT09ICdjb2x1bW4nIHx8IGVsQ1NTLmZsZXhEaXJlY3Rpb24gPT09ICdjb2x1bW4tcmV2ZXJzZScgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICB9XG5cbiAgaWYgKGVsQ1NTLmRpc3BsYXkgPT09ICdncmlkJykge1xuICAgIHJldHVybiBlbENTUy5ncmlkVGVtcGxhdGVDb2x1bW5zLnNwbGl0KCcgJykubGVuZ3RoIDw9IDEgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICB9XG5cbiAgaWYgKGNoaWxkMSAmJiBmaXJzdENoaWxkQ1NTW1wiZmxvYXRcIl0gJiYgZmlyc3RDaGlsZENTU1tcImZsb2F0XCJdICE9PSAnbm9uZScpIHtcbiAgICB2YXIgdG91Y2hpbmdTaWRlQ2hpbGQyID0gZmlyc3RDaGlsZENTU1tcImZsb2F0XCJdID09PSAnbGVmdCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgIHJldHVybiBjaGlsZDIgJiYgKHNlY29uZENoaWxkQ1NTLmNsZWFyID09PSAnYm90aCcgfHwgc2Vjb25kQ2hpbGRDU1MuY2xlYXIgPT09IHRvdWNoaW5nU2lkZUNoaWxkMikgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkMSAmJiAoZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAnYmxvY2snIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ2ZsZXgnIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ3RhYmxlJyB8fCBmaXJzdENoaWxkQ1NTLmRpc3BsYXkgPT09ICdncmlkJyB8fCBmaXJzdENoaWxkV2lkdGggPj0gZWxXaWR0aCAmJiBlbENTU1tDU1NGbG9hdFByb3BlcnR5XSA9PT0gJ25vbmUnIHx8IGNoaWxkMiAmJiBlbENTU1tDU1NGbG9hdFByb3BlcnR5XSA9PT0gJ25vbmUnICYmIGZpcnN0Q2hpbGRXaWR0aCArIHNlY29uZENoaWxkV2lkdGggPiBlbFdpZHRoKSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG59LFxuICAgIF9kcmFnRWxJblJvd0NvbHVtbiA9IGZ1bmN0aW9uIF9kcmFnRWxJblJvd0NvbHVtbihkcmFnUmVjdCwgdGFyZ2V0UmVjdCwgdmVydGljYWwpIHtcbiAgdmFyIGRyYWdFbFMxT3BwID0gdmVydGljYWwgPyBkcmFnUmVjdC5sZWZ0IDogZHJhZ1JlY3QudG9wLFxuICAgICAgZHJhZ0VsUzJPcHAgPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LnJpZ2h0IDogZHJhZ1JlY3QuYm90dG9tLFxuICAgICAgZHJhZ0VsT3BwTGVuZ3RoID0gdmVydGljYWwgPyBkcmFnUmVjdC53aWR0aCA6IGRyYWdSZWN0LmhlaWdodCxcbiAgICAgIHRhcmdldFMxT3BwID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LmxlZnQgOiB0YXJnZXRSZWN0LnRvcCxcbiAgICAgIHRhcmdldFMyT3BwID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LnJpZ2h0IDogdGFyZ2V0UmVjdC5ib3R0b20sXG4gICAgICB0YXJnZXRPcHBMZW5ndGggPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3Qud2lkdGggOiB0YXJnZXRSZWN0LmhlaWdodDtcbiAgcmV0dXJuIGRyYWdFbFMxT3BwID09PSB0YXJnZXRTMU9wcCB8fCBkcmFnRWxTMk9wcCA9PT0gdGFyZ2V0UzJPcHAgfHwgZHJhZ0VsUzFPcHAgKyBkcmFnRWxPcHBMZW5ndGggLyAyID09PSB0YXJnZXRTMU9wcCArIHRhcmdldE9wcExlbmd0aCAvIDI7XG59LFxuXG4vKipcbiAqIERldGVjdHMgZmlyc3QgbmVhcmVzdCBlbXB0eSBzb3J0YWJsZSB0byBYIGFuZCBZIHBvc2l0aW9uIHVzaW5nIGVtcHR5SW5zZXJ0VGhyZXNob2xkLlxuICogQHBhcmFtICB7TnVtYmVyfSB4ICAgICAgWCBwb3NpdGlvblxuICogQHBhcmFtICB7TnVtYmVyfSB5ICAgICAgWSBwb3NpdGlvblxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgRWxlbWVudCBvZiB0aGUgZmlyc3QgZm91bmQgbmVhcmVzdCBTb3J0YWJsZVxuICovXG5fZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUgPSBmdW5jdGlvbiBfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUoeCwgeSkge1xuICB2YXIgcmV0O1xuICBzb3J0YWJsZXMuc29tZShmdW5jdGlvbiAoc29ydGFibGUpIHtcbiAgICB2YXIgdGhyZXNob2xkID0gc29ydGFibGVbZXhwYW5kb10ub3B0aW9ucy5lbXB0eUluc2VydFRocmVzaG9sZDtcbiAgICBpZiAoIXRocmVzaG9sZCB8fCBsYXN0Q2hpbGQoc29ydGFibGUpKSByZXR1cm47XG4gICAgdmFyIHJlY3QgPSBnZXRSZWN0KHNvcnRhYmxlKSxcbiAgICAgICAgaW5zaWRlSG9yaXpvbnRhbGx5ID0geCA+PSByZWN0LmxlZnQgLSB0aHJlc2hvbGQgJiYgeCA8PSByZWN0LnJpZ2h0ICsgdGhyZXNob2xkLFxuICAgICAgICBpbnNpZGVWZXJ0aWNhbGx5ID0geSA+PSByZWN0LnRvcCAtIHRocmVzaG9sZCAmJiB5IDw9IHJlY3QuYm90dG9tICsgdGhyZXNob2xkO1xuXG4gICAgaWYgKGluc2lkZUhvcml6b250YWxseSAmJiBpbnNpZGVWZXJ0aWNhbGx5KSB7XG4gICAgICByZXR1cm4gcmV0ID0gc29ydGFibGU7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldDtcbn0sXG4gICAgX3ByZXBhcmVHcm91cCA9IGZ1bmN0aW9uIF9wcmVwYXJlR3JvdXAob3B0aW9ucykge1xuICBmdW5jdGlvbiB0b0ZuKHZhbHVlLCBwdWxsKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0bywgZnJvbSwgZHJhZ0VsLCBldnQpIHtcbiAgICAgIHZhciBzYW1lR3JvdXAgPSB0by5vcHRpb25zLmdyb3VwLm5hbWUgJiYgZnJvbS5vcHRpb25zLmdyb3VwLm5hbWUgJiYgdG8ub3B0aW9ucy5ncm91cC5uYW1lID09PSBmcm9tLm9wdGlvbnMuZ3JvdXAubmFtZTtcblxuICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgKHB1bGwgfHwgc2FtZUdyb3VwKSkge1xuICAgICAgICAvLyBEZWZhdWx0IHB1bGwgdmFsdWVcbiAgICAgICAgLy8gRGVmYXVsdCBwdWxsIGFuZCBwdXQgdmFsdWUgaWYgc2FtZSBncm91cFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChwdWxsICYmIHZhbHVlID09PSAnY2xvbmUnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0b0ZuKHZhbHVlKHRvLCBmcm9tLCBkcmFnRWwsIGV2dCksIHB1bGwpKHRvLCBmcm9tLCBkcmFnRWwsIGV2dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb3RoZXJHcm91cCA9IChwdWxsID8gdG8gOiBmcm9tKS5vcHRpb25zLmdyb3VwLm5hbWU7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlID09PSBvdGhlckdyb3VwIHx8IHZhbHVlLmpvaW4gJiYgdmFsdWUuaW5kZXhPZihvdGhlckdyb3VwKSA+IC0xO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICB2YXIgZ3JvdXAgPSB7fTtcbiAgdmFyIG9yaWdpbmFsR3JvdXAgPSBvcHRpb25zLmdyb3VwO1xuXG4gIGlmICghb3JpZ2luYWxHcm91cCB8fCBfdHlwZW9mKG9yaWdpbmFsR3JvdXApICE9ICdvYmplY3QnKSB7XG4gICAgb3JpZ2luYWxHcm91cCA9IHtcbiAgICAgIG5hbWU6IG9yaWdpbmFsR3JvdXBcbiAgICB9O1xuICB9XG5cbiAgZ3JvdXAubmFtZSA9IG9yaWdpbmFsR3JvdXAubmFtZTtcbiAgZ3JvdXAuY2hlY2tQdWxsID0gdG9GbihvcmlnaW5hbEdyb3VwLnB1bGwsIHRydWUpO1xuICBncm91cC5jaGVja1B1dCA9IHRvRm4ob3JpZ2luYWxHcm91cC5wdXQpO1xuICBncm91cC5yZXZlcnRDbG9uZSA9IG9yaWdpbmFsR3JvdXAucmV2ZXJ0Q2xvbmU7XG4gIG9wdGlvbnMuZ3JvdXAgPSBncm91cDtcbn0sXG4gICAgX2hpZGVHaG9zdEZvclRhcmdldCA9IGZ1bmN0aW9uIF9oaWRlR2hvc3RGb3JUYXJnZXQoKSB7XG4gIGlmICghc3VwcG9ydENzc1BvaW50ZXJFdmVudHMgJiYgZ2hvc3RFbCkge1xuICAgIGNzcyhnaG9zdEVsLCAnZGlzcGxheScsICdub25lJyk7XG4gIH1cbn0sXG4gICAgX3VuaGlkZUdob3N0Rm9yVGFyZ2V0ID0gZnVuY3Rpb24gX3VuaGlkZUdob3N0Rm9yVGFyZ2V0KCkge1xuICBpZiAoIXN1cHBvcnRDc3NQb2ludGVyRXZlbnRzICYmIGdob3N0RWwpIHtcbiAgICBjc3MoZ2hvc3RFbCwgJ2Rpc3BsYXknLCAnJyk7XG4gIH1cbn07IC8vICMxMTg0IGZpeCAtIFByZXZlbnQgY2xpY2sgZXZlbnQgb24gZmFsbGJhY2sgaWYgZHJhZ2dlZCBidXQgaXRlbSBub3QgY2hhbmdlZCBwb3NpdGlvblxuXG5cbmlmIChkb2N1bWVudEV4aXN0cykge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldnQpIHtcbiAgICBpZiAoaWdub3JlTmV4dENsaWNrKSB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24gJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiAmJiBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICBpZ25vcmVOZXh0Q2xpY2sgPSBmYWxzZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHRydWUpO1xufVxuXG52YXIgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQgPSBmdW5jdGlvbiBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudChldnQpIHtcbiAgaWYgKGRyYWdFbCkge1xuICAgIGV2dCA9IGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQ7XG5cbiAgICB2YXIgbmVhcmVzdCA9IF9kZXRlY3ROZWFyZXN0RW1wdHlTb3J0YWJsZShldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuXG4gICAgaWYgKG5lYXJlc3QpIHtcbiAgICAgIC8vIENyZWF0ZSBpbWl0YXRpb24gZXZlbnRcbiAgICAgIHZhciBldmVudCA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBpIGluIGV2dCkge1xuICAgICAgICBpZiAoZXZ0Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgZXZlbnRbaV0gPSBldnRbaV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZXZlbnQudGFyZ2V0ID0gZXZlbnQucm9vdEVsID0gbmVhcmVzdDtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0ID0gdm9pZCAwO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uID0gdm9pZCAwO1xuXG4gICAgICBuZWFyZXN0W2V4cGFuZG9dLl9vbkRyYWdPdmVyKGV2ZW50KTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBfY2hlY2tPdXRzaWRlVGFyZ2V0RWwgPSBmdW5jdGlvbiBfY2hlY2tPdXRzaWRlVGFyZ2V0RWwoZXZ0KSB7XG4gIGlmIChkcmFnRWwpIHtcbiAgICBkcmFnRWwucGFyZW50Tm9kZVtleHBhbmRvXS5faXNPdXRzaWRlVGhpc0VsKGV2dC50YXJnZXQpO1xuICB9XG59O1xuLyoqXG4gKiBAY2xhc3MgIFNvcnRhYmxlXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gIGVsXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgIFtvcHRpb25zXVxuICovXG5cblxuZnVuY3Rpb24gU29ydGFibGUoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKCEoZWwgJiYgZWwubm9kZVR5cGUgJiYgZWwubm9kZVR5cGUgPT09IDEpKSB7XG4gICAgdGhyb3cgXCJTb3J0YWJsZTogYGVsYCBtdXN0IGJlIGFuIEhUTUxFbGVtZW50LCBub3QgXCIuY29uY2F0KHt9LnRvU3RyaW5nLmNhbGwoZWwpKTtcbiAgfVxuXG4gIHRoaXMuZWwgPSBlbDsgLy8gcm9vdCBlbGVtZW50XG5cbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA9IF9leHRlbmRzKHt9LCBvcHRpb25zKTsgLy8gRXhwb3J0IGluc3RhbmNlXG5cbiAgZWxbZXhwYW5kb10gPSB0aGlzO1xuICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgZ3JvdXA6IG51bGwsXG4gICAgc29ydDogdHJ1ZSxcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgc3RvcmU6IG51bGwsXG4gICAgaGFuZGxlOiBudWxsLFxuICAgIGRyYWdnYWJsZTogL15bdW9dbCQvaS50ZXN0KGVsLm5vZGVOYW1lKSA/ICc+bGknIDogJz4qJyxcbiAgICBzd2FwVGhyZXNob2xkOiAxLFxuICAgIC8vIHBlcmNlbnRhZ2U7IDAgPD0geCA8PSAxXG4gICAgaW52ZXJ0U3dhcDogZmFsc2UsXG4gICAgLy8gaW52ZXJ0IGFsd2F5c1xuICAgIGludmVydGVkU3dhcFRocmVzaG9sZDogbnVsbCxcbiAgICAvLyB3aWxsIGJlIHNldCB0byBzYW1lIGFzIHN3YXBUaHJlc2hvbGQgaWYgZGVmYXVsdFxuICAgIHJlbW92ZUNsb25lT25IaWRlOiB0cnVlLFxuICAgIGRpcmVjdGlvbjogZnVuY3Rpb24gZGlyZWN0aW9uKCkge1xuICAgICAgcmV0dXJuIF9kZXRlY3REaXJlY3Rpb24oZWwsIHRoaXMub3B0aW9ucyk7XG4gICAgfSxcbiAgICBnaG9zdENsYXNzOiAnc29ydGFibGUtZ2hvc3QnLFxuICAgIGNob3NlbkNsYXNzOiAnc29ydGFibGUtY2hvc2VuJyxcbiAgICBkcmFnQ2xhc3M6ICdzb3J0YWJsZS1kcmFnJyxcbiAgICBpZ25vcmU6ICdhLCBpbWcnLFxuICAgIGZpbHRlcjogbnVsbCxcbiAgICBwcmV2ZW50T25GaWx0ZXI6IHRydWUsXG4gICAgYW5pbWF0aW9uOiAwLFxuICAgIGVhc2luZzogbnVsbCxcbiAgICBzZXREYXRhOiBmdW5jdGlvbiBzZXREYXRhKGRhdGFUcmFuc2ZlciwgZHJhZ0VsKSB7XG4gICAgICBkYXRhVHJhbnNmZXIuc2V0RGF0YSgnVGV4dCcsIGRyYWdFbC50ZXh0Q29udGVudCk7XG4gICAgfSxcbiAgICBkcm9wQnViYmxlOiBmYWxzZSxcbiAgICBkcmFnb3ZlckJ1YmJsZTogZmFsc2UsXG4gICAgZGF0YUlkQXR0cjogJ2RhdGEtaWQnLFxuICAgIGRlbGF5OiAwLFxuICAgIGRlbGF5T25Ub3VjaE9ubHk6IGZhbHNlLFxuICAgIHRvdWNoU3RhcnRUaHJlc2hvbGQ6IChOdW1iZXIucGFyc2VJbnQgPyBOdW1iZXIgOiB3aW5kb3cpLnBhcnNlSW50KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLCAxMCkgfHwgMSxcbiAgICBmb3JjZUZhbGxiYWNrOiBmYWxzZSxcbiAgICBmYWxsYmFja0NsYXNzOiAnc29ydGFibGUtZmFsbGJhY2snLFxuICAgIGZhbGxiYWNrT25Cb2R5OiBmYWxzZSxcbiAgICBmYWxsYmFja1RvbGVyYW5jZTogMCxcbiAgICBmYWxsYmFja09mZnNldDoge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9LFxuICAgIHN1cHBvcnRQb2ludGVyOiBTb3J0YWJsZS5zdXBwb3J0UG9pbnRlciAhPT0gZmFsc2UgJiYgJ1BvaW50ZXJFdmVudCcgaW4gd2luZG93ICYmICFTYWZhcmksXG4gICAgZW1wdHlJbnNlcnRUaHJlc2hvbGQ6IDVcbiAgfTtcbiAgUGx1Z2luTWFuYWdlci5pbml0aWFsaXplUGx1Z2lucyh0aGlzLCBlbCwgZGVmYXVsdHMpOyAvLyBTZXQgZGVmYXVsdCBvcHRpb25zXG5cbiAgZm9yICh2YXIgbmFtZSBpbiBkZWZhdWx0cykge1xuICAgICEobmFtZSBpbiBvcHRpb25zKSAmJiAob3B0aW9uc1tuYW1lXSA9IGRlZmF1bHRzW25hbWVdKTtcbiAgfVxuXG4gIF9wcmVwYXJlR3JvdXAob3B0aW9ucyk7IC8vIEJpbmQgYWxsIHByaXZhdGUgbWV0aG9kc1xuXG5cbiAgZm9yICh2YXIgZm4gaW4gdGhpcykge1xuICAgIGlmIChmbi5jaGFyQXQoMCkgPT09ICdfJyAmJiB0eXBlb2YgdGhpc1tmbl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICB9XG4gIH0gLy8gU2V0dXAgZHJhZyBtb2RlXG5cblxuICB0aGlzLm5hdGl2ZURyYWdnYWJsZSA9IG9wdGlvbnMuZm9yY2VGYWxsYmFjayA/IGZhbHNlIDogc3VwcG9ydERyYWdnYWJsZTtcblxuICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAvLyBUb3VjaCBzdGFydCB0aHJlc2hvbGQgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbmF0aXZlIGRyYWdzdGFydCB0aHJlc2hvbGRcbiAgICB0aGlzLm9wdGlvbnMudG91Y2hTdGFydFRocmVzaG9sZCA9IDE7XG4gIH0gLy8gQmluZCBldmVudHNcblxuXG4gIGlmIChvcHRpb25zLnN1cHBvcnRQb2ludGVyKSB7XG4gICAgb24oZWwsICdwb2ludGVyZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuICB9IGVsc2Uge1xuICAgIG9uKGVsLCAnbW91c2Vkb3duJywgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgb24oZWwsICd0b3VjaHN0YXJ0JywgdGhpcy5fb25UYXBTdGFydCk7XG4gIH1cblxuICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICBvbihlbCwgJ2RyYWdvdmVyJywgdGhpcyk7XG4gICAgb24oZWwsICdkcmFnZW50ZXInLCB0aGlzKTtcbiAgfVxuXG4gIHNvcnRhYmxlcy5wdXNoKHRoaXMuZWwpOyAvLyBSZXN0b3JlIHNvcnRpbmdcblxuICBvcHRpb25zLnN0b3JlICYmIG9wdGlvbnMuc3RvcmUuZ2V0ICYmIHRoaXMuc29ydChvcHRpb25zLnN0b3JlLmdldCh0aGlzKSB8fCBbXSk7IC8vIEFkZCBhbmltYXRpb24gc3RhdGUgbWFuYWdlclxuXG4gIF9leHRlbmRzKHRoaXMsIEFuaW1hdGlvblN0YXRlTWFuYWdlcigpKTtcbn1cblxuU29ydGFibGUucHJvdG90eXBlID1cbi8qKiBAbGVuZHMgU29ydGFibGUucHJvdG90eXBlICovXG57XG4gIGNvbnN0cnVjdG9yOiBTb3J0YWJsZSxcbiAgX2lzT3V0c2lkZVRoaXNFbDogZnVuY3Rpb24gX2lzT3V0c2lkZVRoaXNFbCh0YXJnZXQpIHtcbiAgICBpZiAoIXRoaXMuZWwuY29udGFpbnModGFyZ2V0KSAmJiB0YXJnZXQgIT09IHRoaXMuZWwpIHtcbiAgICAgIGxhc3RUYXJnZXQgPSBudWxsO1xuICAgIH1cbiAgfSxcbiAgX2dldERpcmVjdGlvbjogZnVuY3Rpb24gX2dldERpcmVjdGlvbihldnQsIHRhcmdldCkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5vcHRpb25zLmRpcmVjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMub3B0aW9ucy5kaXJlY3Rpb24uY2FsbCh0aGlzLCBldnQsIHRhcmdldCwgZHJhZ0VsKSA6IHRoaXMub3B0aW9ucy5kaXJlY3Rpb247XG4gIH0sXG4gIF9vblRhcFN0YXJ0OiBmdW5jdGlvbiBfb25UYXBTdGFydChcbiAgLyoqIEV2ZW50fFRvdWNoRXZlbnQgKi9cbiAgZXZ0KSB7XG4gICAgaWYgKCFldnQuY2FuY2VsYWJsZSkgcmV0dXJuO1xuXG4gICAgdmFyIF90aGlzID0gdGhpcyxcbiAgICAgICAgZWwgPSB0aGlzLmVsLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBwcmV2ZW50T25GaWx0ZXIgPSBvcHRpb25zLnByZXZlbnRPbkZpbHRlcixcbiAgICAgICAgdHlwZSA9IGV2dC50eXBlLFxuICAgICAgICB0b3VjaCA9IGV2dC50b3VjaGVzICYmIGV2dC50b3VjaGVzWzBdIHx8IGV2dC5wb2ludGVyVHlwZSAmJiBldnQucG9pbnRlclR5cGUgPT09ICd0b3VjaCcgJiYgZXZ0LFxuICAgICAgICB0YXJnZXQgPSAodG91Y2ggfHwgZXZ0KS50YXJnZXQsXG4gICAgICAgIG9yaWdpbmFsVGFyZ2V0ID0gZXZ0LnRhcmdldC5zaGFkb3dSb290ICYmIChldnQucGF0aCAmJiBldnQucGF0aFswXSB8fCBldnQuY29tcG9zZWRQYXRoICYmIGV2dC5jb21wb3NlZFBhdGgoKVswXSkgfHwgdGFyZ2V0LFxuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcblxuICAgIF9zYXZlSW5wdXRDaGVja2VkU3RhdGUoZWwpOyAvLyBEb24ndCB0cmlnZ2VyIHN0YXJ0IGV2ZW50IHdoZW4gYW4gZWxlbWVudCBpcyBiZWVuIGRyYWdnZWQsIG90aGVyd2lzZSB0aGUgZXZ0Lm9sZGluZGV4IGFsd2F5cyB3cm9uZyB3aGVuIHNldCBvcHRpb24uZ3JvdXAuXG5cblxuICAgIGlmIChkcmFnRWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoL21vdXNlZG93bnxwb2ludGVyZG93bi8udGVzdCh0eXBlKSAmJiBldnQuYnV0dG9uICE9PSAwIHx8IG9wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjsgLy8gb25seSBsZWZ0IGJ1dHRvbiBhbmQgZW5hYmxlZFxuICAgIH0gLy8gY2FuY2VsIGRuZCBpZiBvcmlnaW5hbCB0YXJnZXQgaXMgY29udGVudCBlZGl0YWJsZVxuXG5cbiAgICBpZiAob3JpZ2luYWxUYXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFNhZmFyaSBpZ25vcmVzIGZ1cnRoZXIgZXZlbnQgaGFuZGxpbmcgYWZ0ZXIgbW91c2Vkb3duXG5cblxuICAgIGlmICghdGhpcy5uYXRpdmVEcmFnZ2FibGUgJiYgU2FmYXJpICYmIHRhcmdldCAmJiB0YXJnZXQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnU0VMRUNUJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRhcmdldCA9IGNsb3Nlc3QodGFyZ2V0LCBvcHRpb25zLmRyYWdnYWJsZSwgZWwsIGZhbHNlKTtcblxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmFuaW1hdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxhc3REb3duRWwgPT09IHRhcmdldCkge1xuICAgICAgLy8gSWdub3JpbmcgZHVwbGljYXRlIGBkb3duYFxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XG5cblxuICAgIG9sZEluZGV4ID0gaW5kZXgodGFyZ2V0KTtcbiAgICBvbGREcmFnZ2FibGVJbmRleCA9IGluZGV4KHRhcmdldCwgb3B0aW9ucy5kcmFnZ2FibGUpOyAvLyBDaGVjayBmaWx0ZXJcblxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZmlsdGVyLmNhbGwodGhpcywgZXZ0LCB0YXJnZXQsIHRoaXMpKSB7XG4gICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgICAgcm9vdEVsOiBvcmlnaW5hbFRhcmdldCxcbiAgICAgICAgICBuYW1lOiAnZmlsdGVyJyxcbiAgICAgICAgICB0YXJnZXRFbDogdGFyZ2V0LFxuICAgICAgICAgIHRvRWw6IGVsLFxuICAgICAgICAgIGZyb21FbDogZWxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcGx1Z2luRXZlbnQoJ2ZpbHRlcicsIF90aGlzLCB7XG4gICAgICAgICAgZXZ0OiBldnRcbiAgICAgICAgfSk7XG4gICAgICAgIHByZXZlbnRPbkZpbHRlciAmJiBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuOyAvLyBjYW5jZWwgZG5kXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWx0ZXIpIHtcbiAgICAgIGZpbHRlciA9IGZpbHRlci5zcGxpdCgnLCcpLnNvbWUoZnVuY3Rpb24gKGNyaXRlcmlhKSB7XG4gICAgICAgIGNyaXRlcmlhID0gY2xvc2VzdChvcmlnaW5hbFRhcmdldCwgY3JpdGVyaWEudHJpbSgpLCBlbCwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChjcml0ZXJpYSkge1xuICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiBfdGhpcyxcbiAgICAgICAgICAgIHJvb3RFbDogY3JpdGVyaWEsXG4gICAgICAgICAgICBuYW1lOiAnZmlsdGVyJyxcbiAgICAgICAgICAgIHRhcmdldEVsOiB0YXJnZXQsXG4gICAgICAgICAgICBmcm9tRWw6IGVsLFxuICAgICAgICAgICAgdG9FbDogZWxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBsdWdpbkV2ZW50KCdmaWx0ZXInLCBfdGhpcywge1xuICAgICAgICAgICAgZXZ0OiBldnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgcHJldmVudE9uRmlsdGVyICYmIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47IC8vIGNhbmNlbCBkbmRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5oYW5kbGUgJiYgIWNsb3Nlc3Qob3JpZ2luYWxUYXJnZXQsIG9wdGlvbnMuaGFuZGxlLCBlbCwgZmFsc2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBQcmVwYXJlIGBkcmFnc3RhcnRgXG5cblxuICAgIHRoaXMuX3ByZXBhcmVEcmFnU3RhcnQoZXZ0LCB0b3VjaCwgdGFyZ2V0KTtcbiAgfSxcbiAgX3ByZXBhcmVEcmFnU3RhcnQ6IGZ1bmN0aW9uIF9wcmVwYXJlRHJhZ1N0YXJ0KFxuICAvKiogRXZlbnQgKi9cbiAgZXZ0LFxuICAvKiogVG91Y2ggKi9cbiAgdG91Y2gsXG4gIC8qKiBIVE1MRWxlbWVudCAqL1xuICB0YXJnZXQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzLFxuICAgICAgICBlbCA9IF90aGlzLmVsLFxuICAgICAgICBvcHRpb25zID0gX3RoaXMub3B0aW9ucyxcbiAgICAgICAgb3duZXJEb2N1bWVudCA9IGVsLm93bmVyRG9jdW1lbnQsXG4gICAgICAgIGRyYWdTdGFydEZuO1xuXG4gICAgaWYgKHRhcmdldCAmJiAhZHJhZ0VsICYmIHRhcmdldC5wYXJlbnROb2RlID09PSBlbCkge1xuICAgICAgdmFyIGRyYWdSZWN0ID0gZ2V0UmVjdCh0YXJnZXQpO1xuICAgICAgcm9vdEVsID0gZWw7XG4gICAgICBkcmFnRWwgPSB0YXJnZXQ7XG4gICAgICBwYXJlbnRFbCA9IGRyYWdFbC5wYXJlbnROb2RlO1xuICAgICAgbmV4dEVsID0gZHJhZ0VsLm5leHRTaWJsaW5nO1xuICAgICAgbGFzdERvd25FbCA9IHRhcmdldDtcbiAgICAgIGFjdGl2ZUdyb3VwID0gb3B0aW9ucy5ncm91cDtcbiAgICAgIFNvcnRhYmxlLmRyYWdnZWQgPSBkcmFnRWw7XG4gICAgICB0YXBFdnQgPSB7XG4gICAgICAgIHRhcmdldDogZHJhZ0VsLFxuICAgICAgICBjbGllbnRYOiAodG91Y2ggfHwgZXZ0KS5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiAodG91Y2ggfHwgZXZ0KS5jbGllbnRZXG4gICAgICB9O1xuICAgICAgdGFwRGlzdGFuY2VMZWZ0ID0gdGFwRXZ0LmNsaWVudFggLSBkcmFnUmVjdC5sZWZ0O1xuICAgICAgdGFwRGlzdGFuY2VUb3AgPSB0YXBFdnQuY2xpZW50WSAtIGRyYWdSZWN0LnRvcDtcbiAgICAgIHRoaXMuX2xhc3RYID0gKHRvdWNoIHx8IGV2dCkuY2xpZW50WDtcbiAgICAgIHRoaXMuX2xhc3RZID0gKHRvdWNoIHx8IGV2dCkuY2xpZW50WTtcbiAgICAgIGRyYWdFbC5zdHlsZVsnd2lsbC1jaGFuZ2UnXSA9ICdhbGwnO1xuXG4gICAgICBkcmFnU3RhcnRGbiA9IGZ1bmN0aW9uIGRyYWdTdGFydEZuKCkge1xuICAgICAgICBwbHVnaW5FdmVudCgnZGVsYXlFbmRlZCcsIF90aGlzLCB7XG4gICAgICAgICAgZXZ0OiBldnRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgICBfdGhpcy5fb25Ecm9wKCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gRGVsYXllZCBkcmFnIGhhcyBiZWVuIHRyaWdnZXJlZFxuICAgICAgICAvLyB3ZSBjYW4gcmUtZW5hYmxlIHRoZSBldmVudHM6IHRvdWNobW92ZS9tb3VzZW1vdmVcblxuXG4gICAgICAgIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWdFdmVudHMoKTtcblxuICAgICAgICBpZiAoIUZpcmVGb3ggJiYgX3RoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgICAgZHJhZ0VsLmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgIH0gLy8gQmluZCB0aGUgZXZlbnRzOiBkcmFnc3RhcnQvZHJhZ2VuZFxuXG5cbiAgICAgICAgX3RoaXMuX3RyaWdnZXJEcmFnU3RhcnQoZXZ0LCB0b3VjaCk7IC8vIERyYWcgc3RhcnQgZXZlbnRcblxuXG4gICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgICAgbmFtZTogJ2Nob29zZScsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgIH0pOyAvLyBDaG9zZW4gaXRlbVxuXG5cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmNob3NlbkNsYXNzLCB0cnVlKTtcbiAgICAgIH07IC8vIERpc2FibGUgXCJkcmFnZ2FibGVcIlxuXG5cbiAgICAgIG9wdGlvbnMuaWdub3JlLnNwbGl0KCcsJykuZm9yRWFjaChmdW5jdGlvbiAoY3JpdGVyaWEpIHtcbiAgICAgICAgZmluZChkcmFnRWwsIGNyaXRlcmlhLnRyaW0oKSwgX2Rpc2FibGVEcmFnZ2FibGUpO1xuICAgICAgfSk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAnZHJhZ292ZXInLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2Vtb3ZlJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdtb3VzZXVwJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIF90aGlzLl9vbkRyb3ApOyAvLyBNYWtlIGRyYWdFbCBkcmFnZ2FibGUgKG11c3QgYmUgYmVmb3JlIGRlbGF5IGZvciBGaXJlRm94KVxuXG4gICAgICBpZiAoRmlyZUZveCAmJiB0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudG91Y2hTdGFydFRocmVzaG9sZCA9IDQ7XG4gICAgICAgIGRyYWdFbC5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBwbHVnaW5FdmVudCgnZGVsYXlTdGFydCcsIHRoaXMsIHtcbiAgICAgICAgZXZ0OiBldnRcbiAgICAgIH0pOyAvLyBEZWxheSBpcyBpbXBvc3NpYmxlIGZvciBuYXRpdmUgRG5EIGluIEVkZ2Ugb3IgSUVcblxuICAgICAgaWYgKG9wdGlvbnMuZGVsYXkgJiYgKCFvcHRpb25zLmRlbGF5T25Ub3VjaE9ubHkgfHwgdG91Y2gpICYmICghdGhpcy5uYXRpdmVEcmFnZ2FibGUgfHwgIShFZGdlIHx8IElFMTFPckxlc3MpKSkge1xuICAgICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgICAgIHRoaXMuX29uRHJvcCgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIElmIHRoZSB1c2VyIG1vdmVzIHRoZSBwb2ludGVyIG9yIGxldCBnbyB0aGUgY2xpY2sgb3IgdG91Y2hcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBkZWxheSBoYXMgYmVlbiByZWFjaGVkOlxuICAgICAgICAvLyBkaXNhYmxlIHRoZSBkZWxheWVkIGRyYWdcblxuXG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdtb3VzZXVwJywgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ21vdXNlbW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2htb3ZlJywgX3RoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICAgIG9wdGlvbnMuc3VwcG9ydFBvaW50ZXIgJiYgb24ob3duZXJEb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgX3RoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICAgIF90aGlzLl9kcmFnU3RhcnRUaW1lciA9IHNldFRpbWVvdXQoZHJhZ1N0YXJ0Rm4sIG9wdGlvbnMuZGVsYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhZ1N0YXJ0Rm4oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIF9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXI6IGZ1bmN0aW9uIF9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIoXG4gIC8qKiBUb3VjaEV2ZW50fFBvaW50ZXJFdmVudCAqKi9cbiAgZSkge1xuICAgIHZhciB0b3VjaCA9IGUudG91Y2hlcyA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICBpZiAoTWF0aC5tYXgoTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMuX2xhc3RYKSwgTWF0aC5hYnModG91Y2guY2xpZW50WSAtIHRoaXMuX2xhc3RZKSkgPj0gTWF0aC5mbG9vcih0aGlzLm9wdGlvbnMudG91Y2hTdGFydFRocmVzaG9sZCAvICh0aGlzLm5hdGl2ZURyYWdnYWJsZSAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSkpIHtcbiAgICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZygpO1xuICAgIH1cbiAgfSxcbiAgX2Rpc2FibGVEZWxheWVkRHJhZzogZnVuY3Rpb24gX2Rpc2FibGVEZWxheWVkRHJhZygpIHtcbiAgICBkcmFnRWwgJiYgX2Rpc2FibGVEcmFnZ2FibGUoZHJhZ0VsKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fZHJhZ1N0YXJ0VGltZXIpO1xuXG4gICAgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCk7XG4gIH0sXG4gIF9kaXNhYmxlRGVsYXllZERyYWdFdmVudHM6IGZ1bmN0aW9uIF9kaXNhYmxlRGVsYXllZERyYWdFdmVudHMoKSB7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSB0aGlzLmVsLm93bmVyRG9jdW1lbnQ7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCB0aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICB9LFxuICBfdHJpZ2dlckRyYWdTdGFydDogZnVuY3Rpb24gX3RyaWdnZXJEcmFnU3RhcnQoXG4gIC8qKiBFdmVudCAqL1xuICBldnQsXG4gIC8qKiBUb3VjaCAqL1xuICB0b3VjaCkge1xuICAgIHRvdWNoID0gdG91Y2ggfHwgZXZ0LnBvaW50ZXJUeXBlID09ICd0b3VjaCcgJiYgZXZ0O1xuXG4gICAgaWYgKCF0aGlzLm5hdGl2ZURyYWdnYWJsZSB8fCB0b3VjaCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgICAgICBvbihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgICAgfSBlbHNlIGlmICh0b3VjaCkge1xuICAgICAgICBvbihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvbihkcmFnRWwsICdkcmFnZW5kJywgdGhpcyk7XG4gICAgICBvbihyb290RWwsICdkcmFnc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChkb2N1bWVudC5zZWxlY3Rpb24pIHtcbiAgICAgICAgLy8gVGltZW91dCBuZWNjZXNzYXJ5IGZvciBJRTlcbiAgICAgICAgX25leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7fVxuICB9LFxuICBfZHJhZ1N0YXJ0ZWQ6IGZ1bmN0aW9uIF9kcmFnU3RhcnRlZChmYWxsYmFjaywgZXZ0KSB7XG5cbiAgICBhd2FpdGluZ0RyYWdTdGFydGVkID0gZmFsc2U7XG5cbiAgICBpZiAocm9vdEVsICYmIGRyYWdFbCkge1xuICAgICAgcGx1Z2luRXZlbnQoJ2RyYWdTdGFydGVkJywgdGhpcywge1xuICAgICAgICBldnQ6IGV2dFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICBvbihkb2N1bWVudCwgJ2RyYWdvdmVyJywgX2NoZWNrT3V0c2lkZVRhcmdldEVsKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7IC8vIEFwcGx5IGVmZmVjdFxuXG4gICAgICAhZmFsbGJhY2sgJiYgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmRyYWdDbGFzcywgZmFsc2UpO1xuICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmdob3N0Q2xhc3MsIHRydWUpO1xuICAgICAgU29ydGFibGUuYWN0aXZlID0gdGhpcztcbiAgICAgIGZhbGxiYWNrICYmIHRoaXMuX2FwcGVuZEdob3N0KCk7IC8vIERyYWcgc3RhcnQgZXZlbnRcblxuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgbmFtZTogJ3N0YXJ0JyxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbnVsbGluZygpO1xuICAgIH1cbiAgfSxcbiAgX2VtdWxhdGVEcmFnT3ZlcjogZnVuY3Rpb24gX2VtdWxhdGVEcmFnT3ZlcigpIHtcbiAgICBpZiAodG91Y2hFdnQpIHtcbiAgICAgIHRoaXMuX2xhc3RYID0gdG91Y2hFdnQuY2xpZW50WDtcbiAgICAgIHRoaXMuX2xhc3RZID0gdG91Y2hFdnQuY2xpZW50WTtcblxuICAgICAgX2hpZGVHaG9zdEZvclRhcmdldCgpO1xuXG4gICAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh0b3VjaEV2dC5jbGllbnRYLCB0b3VjaEV2dC5jbGllbnRZKTtcbiAgICAgIHZhciBwYXJlbnQgPSB0YXJnZXQ7XG5cbiAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0LnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnNoYWRvd1Jvb3QuZWxlbWVudEZyb21Qb2ludCh0b3VjaEV2dC5jbGllbnRYLCB0b3VjaEV2dC5jbGllbnRZKTtcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gcGFyZW50KSBicmVhaztcbiAgICAgICAgcGFyZW50ID0gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBkcmFnRWwucGFyZW50Tm9kZVtleHBhbmRvXS5faXNPdXRzaWRlVGhpc0VsKHRhcmdldCk7XG5cbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGlmIChwYXJlbnRbZXhwYW5kb10pIHtcbiAgICAgICAgICAgIHZhciBpbnNlcnRlZCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGluc2VydGVkID0gcGFyZW50W2V4cGFuZG9dLl9vbkRyYWdPdmVyKHtcbiAgICAgICAgICAgICAgY2xpZW50WDogdG91Y2hFdnQuY2xpZW50WCxcbiAgICAgICAgICAgICAgY2xpZW50WTogdG91Y2hFdnQuY2xpZW50WSxcbiAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICAgIHJvb3RFbDogcGFyZW50XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGluc2VydGVkICYmICF0aGlzLm9wdGlvbnMuZHJhZ292ZXJCdWJibGUpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFyZ2V0ID0gcGFyZW50OyAvLyBzdG9yZSBsYXN0IGVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG4gICAgICAgIHdoaWxlIChwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSk7XG4gICAgICB9XG5cbiAgICAgIF91bmhpZGVHaG9zdEZvclRhcmdldCgpO1xuICAgIH1cbiAgfSxcbiAgX29uVG91Y2hNb3ZlOiBmdW5jdGlvbiBfb25Ub3VjaE1vdmUoXG4gIC8qKlRvdWNoRXZlbnQqL1xuICBldnQpIHtcbiAgICBpZiAodGFwRXZ0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICBmYWxsYmFja1RvbGVyYW5jZSA9IG9wdGlvbnMuZmFsbGJhY2tUb2xlcmFuY2UsXG4gICAgICAgICAgZmFsbGJhY2tPZmZzZXQgPSBvcHRpb25zLmZhbGxiYWNrT2Zmc2V0LFxuICAgICAgICAgIHRvdWNoID0gZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCxcbiAgICAgICAgICBnaG9zdE1hdHJpeCA9IGdob3N0RWwgJiYgbWF0cml4KGdob3N0RWwsIHRydWUpLFxuICAgICAgICAgIHNjYWxlWCA9IGdob3N0RWwgJiYgZ2hvc3RNYXRyaXggJiYgZ2hvc3RNYXRyaXguYSxcbiAgICAgICAgICBzY2FsZVkgPSBnaG9zdEVsICYmIGdob3N0TWF0cml4ICYmIGdob3N0TWF0cml4LmQsXG4gICAgICAgICAgcmVsYXRpdmVTY3JvbGxPZmZzZXQgPSBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSAmJiBnaG9zdFJlbGF0aXZlUGFyZW50ICYmIGdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0KGdob3N0UmVsYXRpdmVQYXJlbnQpLFxuICAgICAgICAgIGR4ID0gKHRvdWNoLmNsaWVudFggLSB0YXBFdnQuY2xpZW50WCArIGZhbGxiYWNrT2Zmc2V0LngpIC8gKHNjYWxlWCB8fCAxKSArIChyZWxhdGl2ZVNjcm9sbE9mZnNldCA/IHJlbGF0aXZlU2Nyb2xsT2Zmc2V0WzBdIC0gZ2hvc3RSZWxhdGl2ZVBhcmVudEluaXRpYWxTY3JvbGxbMF0gOiAwKSAvIChzY2FsZVggfHwgMSksXG4gICAgICAgICAgZHkgPSAodG91Y2guY2xpZW50WSAtIHRhcEV2dC5jbGllbnRZICsgZmFsbGJhY2tPZmZzZXQueSkgLyAoc2NhbGVZIHx8IDEpICsgKHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID8gcmVsYXRpdmVTY3JvbGxPZmZzZXRbMV0gLSBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbFsxXSA6IDApIC8gKHNjYWxlWSB8fCAxKTsgLy8gb25seSBzZXQgdGhlIHN0YXR1cyB0byBkcmFnZ2luZywgd2hlbiB3ZSBhcmUgYWN0dWFsbHkgZHJhZ2dpbmdcblxuICAgICAgaWYgKCFTb3J0YWJsZS5hY3RpdmUgJiYgIWF3YWl0aW5nRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgaWYgKGZhbGxiYWNrVG9sZXJhbmNlICYmIE1hdGgubWF4KE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLl9sYXN0WCksIE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLl9sYXN0WSkpIDwgZmFsbGJhY2tUb2xlcmFuY2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vbkRyYWdTdGFydChldnQsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2hvc3RFbCkge1xuICAgICAgICBpZiAoZ2hvc3RNYXRyaXgpIHtcbiAgICAgICAgICBnaG9zdE1hdHJpeC5lICs9IGR4IC0gKGxhc3REeCB8fCAwKTtcbiAgICAgICAgICBnaG9zdE1hdHJpeC5mICs9IGR5IC0gKGxhc3REeSB8fCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnaG9zdE1hdHJpeCA9IHtcbiAgICAgICAgICAgIGE6IDEsXG4gICAgICAgICAgICBiOiAwLFxuICAgICAgICAgICAgYzogMCxcbiAgICAgICAgICAgIGQ6IDEsXG4gICAgICAgICAgICBlOiBkeCxcbiAgICAgICAgICAgIGY6IGR5XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjc3NNYXRyaXggPSBcIm1hdHJpeChcIi5jb25jYXQoZ2hvc3RNYXRyaXguYSwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5iLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmMsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguZCwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5lLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmYsIFwiKVwiKTtcbiAgICAgICAgY3NzKGdob3N0RWwsICd3ZWJraXRUcmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgJ21velRyYW5zZm9ybScsIGNzc01hdHJpeCk7XG4gICAgICAgIGNzcyhnaG9zdEVsLCAnbXNUcmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgJ3RyYW5zZm9ybScsIGNzc01hdHJpeCk7XG4gICAgICAgIGxhc3REeCA9IGR4O1xuICAgICAgICBsYXN0RHkgPSBkeTtcbiAgICAgICAgdG91Y2hFdnQgPSB0b3VjaDtcbiAgICAgIH1cblxuICAgICAgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9LFxuICBfYXBwZW5kR2hvc3Q6IGZ1bmN0aW9uIF9hcHBlbmRHaG9zdCgpIHtcbiAgICAvLyBCdWcgaWYgdXNpbmcgc2NhbGUoKTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjYzNzA1OFxuICAgIC8vIE5vdCBiZWluZyBhZGp1c3RlZCBmb3JcbiAgICBpZiAoIWdob3N0RWwpIHtcbiAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLm9wdGlvbnMuZmFsbGJhY2tPbkJvZHkgPyBkb2N1bWVudC5ib2R5IDogcm9vdEVsLFxuICAgICAgICAgIHJlY3QgPSBnZXRSZWN0KGRyYWdFbCwgdHJ1ZSwgUG9zaXRpb25HaG9zdEFic29sdXRlbHksIHRydWUsIGNvbnRhaW5lciksXG4gICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsgLy8gUG9zaXRpb24gYWJzb2x1dGVseVxuXG4gICAgICBpZiAoUG9zaXRpb25HaG9zdEFic29sdXRlbHkpIHtcbiAgICAgICAgLy8gR2V0IHJlbGF0aXZlbHkgcG9zaXRpb25lZCBwYXJlbnRcbiAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGNvbnRhaW5lcjtcblxuICAgICAgICB3aGlsZSAoY3NzKGdob3N0UmVsYXRpdmVQYXJlbnQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJyAmJiBjc3MoZ2hvc3RSZWxhdGl2ZVBhcmVudCwgJ3RyYW5zZm9ybScpID09PSAnbm9uZScgJiYgZ2hvc3RSZWxhdGl2ZVBhcmVudCAhPT0gZG9jdW1lbnQpIHtcbiAgICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50ID0gZ2hvc3RSZWxhdGl2ZVBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdob3N0UmVsYXRpdmVQYXJlbnQgIT09IGRvY3VtZW50LmJvZHkgJiYgZ2hvc3RSZWxhdGl2ZVBhcmVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKGdob3N0UmVsYXRpdmVQYXJlbnQgPT09IGRvY3VtZW50KSBnaG9zdFJlbGF0aXZlUGFyZW50ID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgICAgICAgIHJlY3QudG9wICs9IGdob3N0UmVsYXRpdmVQYXJlbnQuc2Nyb2xsVG9wO1xuICAgICAgICAgIHJlY3QubGVmdCArPSBnaG9zdFJlbGF0aXZlUGFyZW50LnNjcm9sbExlZnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsID0gZ2V0UmVsYXRpdmVTY3JvbGxPZmZzZXQoZ2hvc3RSZWxhdGl2ZVBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIGdob3N0RWwgPSBkcmFnRWwuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgdG9nZ2xlQ2xhc3MoZ2hvc3RFbCwgb3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG4gICAgICB0b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmZhbGxiYWNrQ2xhc3MsIHRydWUpO1xuICAgICAgdG9nZ2xlQ2xhc3MoZ2hvc3RFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIHRydWUpO1xuICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2l0aW9uJywgJycpO1xuICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ2JveC1zaXppbmcnLCAnYm9yZGVyLWJveCcpO1xuICAgICAgY3NzKGdob3N0RWwsICdtYXJnaW4nLCAwKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAndG9wJywgcmVjdC50b3ApO1xuICAgICAgY3NzKGdob3N0RWwsICdsZWZ0JywgcmVjdC5sZWZ0KTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnd2lkdGgnLCByZWN0LndpZHRoKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnaGVpZ2h0JywgcmVjdC5oZWlnaHQpO1xuICAgICAgY3NzKGdob3N0RWwsICdvcGFjaXR5JywgJzAuOCcpO1xuICAgICAgY3NzKGdob3N0RWwsICdwb3NpdGlvbicsIFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5ID8gJ2Fic29sdXRlJyA6ICdmaXhlZCcpO1xuICAgICAgY3NzKGdob3N0RWwsICd6SW5kZXgnLCAnMTAwMDAwJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3BvaW50ZXJFdmVudHMnLCAnbm9uZScpO1xuICAgICAgU29ydGFibGUuZ2hvc3QgPSBnaG9zdEVsO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGdob3N0RWwpOyAvLyBTZXQgdHJhbnNmb3JtLW9yaWdpblxuXG4gICAgICBjc3MoZ2hvc3RFbCwgJ3RyYW5zZm9ybS1vcmlnaW4nLCB0YXBEaXN0YW5jZUxlZnQgLyBwYXJzZUludChnaG9zdEVsLnN0eWxlLndpZHRoKSAqIDEwMCArICclICcgKyB0YXBEaXN0YW5jZVRvcCAvIHBhcnNlSW50KGdob3N0RWwuc3R5bGUuaGVpZ2h0KSAqIDEwMCArICclJyk7XG4gICAgfVxuICB9LFxuICBfb25EcmFnU3RhcnQ6IGZ1bmN0aW9uIF9vbkRyYWdTdGFydChcbiAgLyoqRXZlbnQqL1xuICBldnQsXG4gIC8qKmJvb2xlYW4qL1xuICBmYWxsYmFjaykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgZGF0YVRyYW5zZmVyID0gZXZ0LmRhdGFUcmFuc2ZlcjtcbiAgICB2YXIgb3B0aW9ucyA9IF90aGlzLm9wdGlvbnM7XG4gICAgcGx1Z2luRXZlbnQoJ2RyYWdTdGFydCcsIHRoaXMsIHtcbiAgICAgIGV2dDogZXZ0XG4gICAgfSk7XG5cbiAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgdGhpcy5fb25Ecm9wKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwbHVnaW5FdmVudCgnc2V0dXBDbG9uZScsIHRoaXMpO1xuXG4gICAgaWYgKCFTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICBjbG9uZUVsID0gY2xvbmUoZHJhZ0VsKTtcbiAgICAgIGNsb25lRWwuZHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICBjbG9uZUVsLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJyc7XG5cbiAgICAgIHRoaXMuX2hpZGVDbG9uZSgpO1xuXG4gICAgICB0b2dnbGVDbGFzcyhjbG9uZUVsLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTtcbiAgICAgIFNvcnRhYmxlLmNsb25lID0gY2xvbmVFbDtcbiAgICB9IC8vICMxMTQzOiBJRnJhbWUgc3VwcG9ydCB3b3JrYXJvdW5kXG5cblxuICAgIF90aGlzLmNsb25lSWQgPSBfbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgcGx1Z2luRXZlbnQoJ2Nsb25lJywgX3RoaXMpO1xuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybjtcblxuICAgICAgaWYgKCFfdGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlKSB7XG4gICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmVFbCwgZHJhZ0VsKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX2hpZGVDbG9uZSgpO1xuXG4gICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHNvcnRhYmxlOiBfdGhpcyxcbiAgICAgICAgbmFtZTogJ2Nsb25lJ1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgIWZhbGxiYWNrICYmIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIHRydWUpOyAvLyBTZXQgcHJvcGVyIGRyb3AgZXZlbnRzXG5cbiAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgIGlnbm9yZU5leHRDbGljayA9IHRydWU7XG4gICAgICBfdGhpcy5fbG9vcElkID0gc2V0SW50ZXJ2YWwoX3RoaXMuX2VtdWxhdGVEcmFnT3ZlciwgNTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVbmRvIHdoYXQgd2FzIHNldCBpbiBfcHJlcGFyZURyYWdTdGFydCBiZWZvcmUgZHJhZyBzdGFydGVkXG4gICAgICBvZmYoZG9jdW1lbnQsICdtb3VzZXVwJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaGVuZCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCBfdGhpcy5fb25Ecm9wKTtcblxuICAgICAgaWYgKGRhdGFUcmFuc2Zlcikge1xuICAgICAgICBkYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJztcbiAgICAgICAgb3B0aW9ucy5zZXREYXRhICYmIG9wdGlvbnMuc2V0RGF0YS5jYWxsKF90aGlzLCBkYXRhVHJhbnNmZXIsIGRyYWdFbCk7XG4gICAgICB9XG5cbiAgICAgIG9uKGRvY3VtZW50LCAnZHJvcCcsIF90aGlzKTsgLy8gIzEyNzYgZml4OlxuXG4gICAgICBjc3MoZHJhZ0VsLCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZVooMCknKTtcbiAgICB9XG5cbiAgICBhd2FpdGluZ0RyYWdTdGFydGVkID0gdHJ1ZTtcbiAgICBfdGhpcy5fZHJhZ1N0YXJ0SWQgPSBfbmV4dFRpY2soX3RoaXMuX2RyYWdTdGFydGVkLmJpbmQoX3RoaXMsIGZhbGxiYWNrLCBldnQpKTtcbiAgICBvbihkb2N1bWVudCwgJ3NlbGVjdHN0YXJ0JywgX3RoaXMpO1xuICAgIG1vdmVkID0gdHJ1ZTtcblxuICAgIGlmIChTYWZhcmkpIHtcbiAgICAgIGNzcyhkb2N1bWVudC5ib2R5LCAndXNlci1zZWxlY3QnLCAnbm9uZScpO1xuICAgIH1cbiAgfSxcbiAgLy8gUmV0dXJucyB0cnVlIC0gaWYgbm8gZnVydGhlciBhY3Rpb24gaXMgbmVlZGVkIChlaXRoZXIgaW5zZXJ0ZWQgb3IgYW5vdGhlciBjb25kaXRpb24pXG4gIF9vbkRyYWdPdmVyOiBmdW5jdGlvbiBfb25EcmFnT3ZlcihcbiAgLyoqRXZlbnQqL1xuICBldnQpIHtcbiAgICB2YXIgZWwgPSB0aGlzLmVsLFxuICAgICAgICB0YXJnZXQgPSBldnQudGFyZ2V0LFxuICAgICAgICBkcmFnUmVjdCxcbiAgICAgICAgdGFyZ2V0UmVjdCxcbiAgICAgICAgcmV2ZXJ0LFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBncm91cCA9IG9wdGlvbnMuZ3JvdXAsXG4gICAgICAgIGFjdGl2ZVNvcnRhYmxlID0gU29ydGFibGUuYWN0aXZlLFxuICAgICAgICBpc093bmVyID0gYWN0aXZlR3JvdXAgPT09IGdyb3VwLFxuICAgICAgICBjYW5Tb3J0ID0gb3B0aW9ucy5zb3J0LFxuICAgICAgICBmcm9tU29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCBhY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgdmVydGljYWwsXG4gICAgICAgIF90aGlzID0gdGhpcyxcbiAgICAgICAgY29tcGxldGVkRmlyZWQgPSBmYWxzZTtcblxuICAgIGlmIChfc2lsZW50KSByZXR1cm47XG5cbiAgICBmdW5jdGlvbiBkcmFnT3ZlckV2ZW50KG5hbWUsIGV4dHJhKSB7XG4gICAgICBwbHVnaW5FdmVudChuYW1lLCBfdGhpcywgX29iamVjdFNwcmVhZDIoe1xuICAgICAgICBldnQ6IGV2dCxcbiAgICAgICAgaXNPd25lcjogaXNPd25lcixcbiAgICAgICAgYXhpczogdmVydGljYWwgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnLFxuICAgICAgICByZXZlcnQ6IHJldmVydCxcbiAgICAgICAgZHJhZ1JlY3Q6IGRyYWdSZWN0LFxuICAgICAgICB0YXJnZXRSZWN0OiB0YXJnZXRSZWN0LFxuICAgICAgICBjYW5Tb3J0OiBjYW5Tb3J0LFxuICAgICAgICBmcm9tU29ydGFibGU6IGZyb21Tb3J0YWJsZSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIGNvbXBsZXRlZDogY29tcGxldGVkLFxuICAgICAgICBvbk1vdmU6IGZ1bmN0aW9uIG9uTW92ZSh0YXJnZXQsIGFmdGVyKSB7XG4gICAgICAgICAgcmV0dXJuIF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCBnZXRSZWN0KHRhcmdldCksIGV2dCwgYWZ0ZXIpO1xuICAgICAgICB9LFxuICAgICAgICBjaGFuZ2VkOiBjaGFuZ2VkXG4gICAgICB9LCBleHRyYSkpO1xuICAgIH0gLy8gQ2FwdHVyZSBhbmltYXRpb24gc3RhdGVcblxuXG4gICAgZnVuY3Rpb24gY2FwdHVyZSgpIHtcbiAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyQW5pbWF0aW9uQ2FwdHVyZScpO1xuXG4gICAgICBfdGhpcy5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcblxuICAgICAgaWYgKF90aGlzICE9PSBmcm9tU29ydGFibGUpIHtcbiAgICAgICAgZnJvbVNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgfVxuICAgIH0gLy8gUmV0dXJuIGludm9jYXRpb24gd2hlbiBkcmFnRWwgaXMgaW5zZXJ0ZWQgKG9yIGNvbXBsZXRlZClcblxuXG4gICAgZnVuY3Rpb24gY29tcGxldGVkKGluc2VydGlvbikge1xuICAgICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXJDb21wbGV0ZWQnLCB7XG4gICAgICAgIGluc2VydGlvbjogaW5zZXJ0aW9uXG4gICAgICB9KTtcblxuICAgICAgaWYgKGluc2VydGlvbikge1xuICAgICAgICAvLyBDbG9uZXMgbXVzdCBiZSBoaWRkZW4gYmVmb3JlIGZvbGRpbmcgYW5pbWF0aW9uIHRvIGNhcHR1cmUgZHJhZ1JlY3RBYnNvbHV0ZSBwcm9wZXJseVxuICAgICAgICBpZiAoaXNPd25lcikge1xuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9oaWRlQ2xvbmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKF90aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpcyAhPT0gZnJvbVNvcnRhYmxlKSB7XG4gICAgICAgICAgLy8gU2V0IGdob3N0IGNsYXNzIHRvIG5ldyBzb3J0YWJsZSdzIGdob3N0IGNsYXNzXG4gICAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBwdXRTb3J0YWJsZSA/IHB1dFNvcnRhYmxlLm9wdGlvbnMuZ2hvc3RDbGFzcyA6IGFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuZ2hvc3RDbGFzcywgZmFsc2UpO1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5naG9zdENsYXNzLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwdXRTb3J0YWJsZSAhPT0gX3RoaXMgJiYgX3RoaXMgIT09IFNvcnRhYmxlLmFjdGl2ZSkge1xuICAgICAgICAgIHB1dFNvcnRhYmxlID0gX3RoaXM7XG4gICAgICAgIH0gZWxzZSBpZiAoX3RoaXMgPT09IFNvcnRhYmxlLmFjdGl2ZSAmJiBwdXRTb3J0YWJsZSkge1xuICAgICAgICAgIHB1dFNvcnRhYmxlID0gbnVsbDtcbiAgICAgICAgfSAvLyBBbmltYXRpb25cblxuXG4gICAgICAgIGlmIChmcm9tU29ydGFibGUgPT09IF90aGlzKSB7XG4gICAgICAgICAgX3RoaXMuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID0gdGFyZ2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMuYW5pbWF0ZUFsbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZScpO1xuICAgICAgICAgIF90aGlzLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9IG51bGw7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChfdGhpcyAhPT0gZnJvbVNvcnRhYmxlKSB7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgICBmcm9tU29ydGFibGUuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBOdWxsIGxhc3RUYXJnZXQgaWYgaXQgaXMgbm90IGluc2lkZSBhIHByZXZpb3VzbHkgc3dhcHBlZCBlbGVtZW50XG5cblxuICAgICAgaWYgKHRhcmdldCA9PT0gZHJhZ0VsICYmICFkcmFnRWwuYW5pbWF0ZWQgfHwgdGFyZ2V0ID09PSBlbCAmJiAhdGFyZ2V0LmFuaW1hdGVkKSB7XG4gICAgICAgIGxhc3RUYXJnZXQgPSBudWxsO1xuICAgICAgfSAvLyBubyBidWJibGluZyBhbmQgbm90IGZhbGxiYWNrXG5cblxuICAgICAgaWYgKCFvcHRpb25zLmRyYWdvdmVyQnViYmxlICYmICFldnQucm9vdEVsICYmIHRhcmdldCAhPT0gZG9jdW1lbnQpIHtcbiAgICAgICAgZHJhZ0VsLnBhcmVudE5vZGVbZXhwYW5kb10uX2lzT3V0c2lkZVRoaXNFbChldnQudGFyZ2V0KTsgLy8gRG8gbm90IGRldGVjdCBmb3IgZW1wdHkgaW5zZXJ0IGlmIGFscmVhZHkgaW5zZXJ0ZWRcblxuXG4gICAgICAgICFpbnNlcnRpb24gJiYgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQoZXZ0KTtcbiAgICAgIH1cblxuICAgICAgIW9wdGlvbnMuZHJhZ292ZXJCdWJibGUgJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbiAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm4gY29tcGxldGVkRmlyZWQgPSB0cnVlO1xuICAgIH0gLy8gQ2FsbCB3aGVuIGRyYWdFbCBoYXMgYmVlbiBpbnNlcnRlZFxuXG5cbiAgICBmdW5jdGlvbiBjaGFuZ2VkKCkge1xuICAgICAgbmV3SW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcblxuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgIG5hbWU6ICdjaGFuZ2UnLFxuICAgICAgICB0b0VsOiBlbCxcbiAgICAgICAgbmV3SW5kZXg6IG5ld0luZGV4LFxuICAgICAgICBuZXdEcmFnZ2FibGVJbmRleDogbmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGV2dC5wcmV2ZW50RGVmYXVsdCAhPT0gdm9pZCAwKSB7XG4gICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSBjbG9zZXN0KHRhcmdldCwgb3B0aW9ucy5kcmFnZ2FibGUsIGVsLCB0cnVlKTtcbiAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlcicpO1xuICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm4gY29tcGxldGVkRmlyZWQ7XG5cbiAgICBpZiAoZHJhZ0VsLmNvbnRhaW5zKGV2dC50YXJnZXQpIHx8IHRhcmdldC5hbmltYXRlZCAmJiB0YXJnZXQuYW5pbWF0aW5nWCAmJiB0YXJnZXQuYW5pbWF0aW5nWSB8fCBfdGhpcy5faWdub3JlV2hpbGVBbmltYXRpbmcgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgaWdub3JlTmV4dENsaWNrID0gZmFsc2U7XG5cbiAgICBpZiAoYWN0aXZlU29ydGFibGUgJiYgIW9wdGlvbnMuZGlzYWJsZWQgJiYgKGlzT3duZXIgPyBjYW5Tb3J0IHx8IChyZXZlcnQgPSBwYXJlbnRFbCAhPT0gcm9vdEVsKSAvLyBSZXZlcnRpbmcgaXRlbSBpbnRvIHRoZSBvcmlnaW5hbCBsaXN0XG4gICAgOiBwdXRTb3J0YWJsZSA9PT0gdGhpcyB8fCAodGhpcy5sYXN0UHV0TW9kZSA9IGFjdGl2ZUdyb3VwLmNoZWNrUHVsbCh0aGlzLCBhY3RpdmVTb3J0YWJsZSwgZHJhZ0VsLCBldnQpKSAmJiBncm91cC5jaGVja1B1dCh0aGlzLCBhY3RpdmVTb3J0YWJsZSwgZHJhZ0VsLCBldnQpKSkge1xuICAgICAgdmVydGljYWwgPSB0aGlzLl9nZXREaXJlY3Rpb24oZXZ0LCB0YXJnZXQpID09PSAndmVydGljYWwnO1xuICAgICAgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCk7XG4gICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlclZhbGlkJyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuIGNvbXBsZXRlZEZpcmVkO1xuXG4gICAgICBpZiAocmV2ZXJ0KSB7XG4gICAgICAgIHBhcmVudEVsID0gcm9vdEVsOyAvLyBhY3R1YWxpemF0aW9uXG5cbiAgICAgICAgY2FwdHVyZSgpO1xuXG4gICAgICAgIHRoaXMuX2hpZGVDbG9uZSgpO1xuXG4gICAgICAgIGRyYWdPdmVyRXZlbnQoJ3JldmVydCcpO1xuXG4gICAgICAgIGlmICghU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgICAgIGlmIChuZXh0RWwpIHtcbiAgICAgICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBuZXh0RWwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb290RWwuYXBwZW5kQ2hpbGQoZHJhZ0VsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcGxldGVkKHRydWUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZWxMYXN0Q2hpbGQgPSBsYXN0Q2hpbGQoZWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcblxuICAgICAgaWYgKCFlbExhc3RDaGlsZCB8fCBfZ2hvc3RJc0xhc3QoZXZ0LCB2ZXJ0aWNhbCwgdGhpcykgJiYgIWVsTGFzdENoaWxkLmFuaW1hdGVkKSB7XG4gICAgICAgIC8vIEluc2VydCB0byBlbmQgb2YgbGlzdFxuICAgICAgICAvLyBJZiBhbHJlYWR5IGF0IGVuZCBvZiBsaXN0OiBEbyBub3QgaW5zZXJ0XG4gICAgICAgIGlmIChlbExhc3RDaGlsZCA9PT0gZHJhZ0VsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIH0gLy8gaWYgdGhlcmUgaXMgYSBsYXN0IGVsZW1lbnQsIGl0IGlzIHRoZSB0YXJnZXRcblxuXG4gICAgICAgIGlmIChlbExhc3RDaGlsZCAmJiBlbCA9PT0gZXZ0LnRhcmdldCkge1xuICAgICAgICAgIHRhcmdldCA9IGVsTGFzdENoaWxkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX29uTW92ZShyb290RWwsIGVsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXQsIHRhcmdldFJlY3QsIGV2dCwgISF0YXJnZXQpICE9PSBmYWxzZSkge1xuICAgICAgICAgIGNhcHR1cmUoKTtcbiAgICAgICAgICBlbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgICAgICAgIHBhcmVudEVsID0gZWw7IC8vIGFjdHVhbGl6YXRpb25cblxuICAgICAgICAgIGNoYW5nZWQoKTtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVsTGFzdENoaWxkICYmIF9naG9zdElzRmlyc3QoZXZ0LCB2ZXJ0aWNhbCwgdGhpcykpIHtcbiAgICAgICAgLy8gSW5zZXJ0IHRvIHN0YXJ0IG9mIGxpc3RcbiAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBnZXRDaGlsZChlbCwgMCwgb3B0aW9ucywgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKGZpcnN0Q2hpbGQgPT09IGRyYWdFbCkge1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0ID0gZmlyc3RDaGlsZDtcbiAgICAgICAgdGFyZ2V0UmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcblxuICAgICAgICBpZiAoX29uTW92ZShyb290RWwsIGVsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXQsIHRhcmdldFJlY3QsIGV2dCwgZmFsc2UpICE9PSBmYWxzZSkge1xuICAgICAgICAgIGNhcHR1cmUoKTtcbiAgICAgICAgICBlbC5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBmaXJzdENoaWxkKTtcbiAgICAgICAgICBwYXJlbnRFbCA9IGVsOyAvLyBhY3R1YWxpemF0aW9uXG5cbiAgICAgICAgICBjaGFuZ2VkKCk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YXJnZXQucGFyZW50Tm9kZSA9PT0gZWwpIHtcbiAgICAgICAgdGFyZ2V0UmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IDAsXG4gICAgICAgICAgICB0YXJnZXRCZWZvcmVGaXJzdFN3YXAsXG4gICAgICAgICAgICBkaWZmZXJlbnRMZXZlbCA9IGRyYWdFbC5wYXJlbnROb2RlICE9PSBlbCxcbiAgICAgICAgICAgIGRpZmZlcmVudFJvd0NvbCA9ICFfZHJhZ0VsSW5Sb3dDb2x1bW4oZHJhZ0VsLmFuaW1hdGVkICYmIGRyYWdFbC50b1JlY3QgfHwgZHJhZ1JlY3QsIHRhcmdldC5hbmltYXRlZCAmJiB0YXJnZXQudG9SZWN0IHx8IHRhcmdldFJlY3QsIHZlcnRpY2FsKSxcbiAgICAgICAgICAgIHNpZGUxID0gdmVydGljYWwgPyAndG9wJyA6ICdsZWZ0JyxcbiAgICAgICAgICAgIHNjcm9sbGVkUGFzdFRvcCA9IGlzU2Nyb2xsZWRQYXN0KHRhcmdldCwgJ3RvcCcsICd0b3AnKSB8fCBpc1Njcm9sbGVkUGFzdChkcmFnRWwsICd0b3AnLCAndG9wJyksXG4gICAgICAgICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxlZFBhc3RUb3AgPyBzY3JvbGxlZFBhc3RUb3Auc2Nyb2xsVG9wIDogdm9pZCAwO1xuXG4gICAgICAgIGlmIChsYXN0VGFyZ2V0ICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXRCZWZvcmVGaXJzdFN3YXAgPSB0YXJnZXRSZWN0W3NpZGUxXTtcbiAgICAgICAgICBwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggPSBmYWxzZTtcbiAgICAgICAgICBpc0NpcmN1bXN0YW50aWFsSW52ZXJ0ID0gIWRpZmZlcmVudFJvd0NvbCAmJiBvcHRpb25zLmludmVydFN3YXAgfHwgZGlmZmVyZW50TGV2ZWw7XG4gICAgICAgIH1cblxuICAgICAgICBkaXJlY3Rpb24gPSBfZ2V0U3dhcERpcmVjdGlvbihldnQsIHRhcmdldCwgdGFyZ2V0UmVjdCwgdmVydGljYWwsIGRpZmZlcmVudFJvd0NvbCA/IDEgOiBvcHRpb25zLnN3YXBUaHJlc2hvbGQsIG9wdGlvbnMuaW52ZXJ0ZWRTd2FwVGhyZXNob2xkID09IG51bGwgPyBvcHRpb25zLnN3YXBUaHJlc2hvbGQgOiBvcHRpb25zLmludmVydGVkU3dhcFRocmVzaG9sZCwgaXNDaXJjdW1zdGFudGlhbEludmVydCwgbGFzdFRhcmdldCA9PT0gdGFyZ2V0KTtcbiAgICAgICAgdmFyIHNpYmxpbmc7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiAhPT0gMCkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRhcmdldCBpcyBiZXNpZGUgZHJhZ0VsIGluIHJlc3BlY3RpdmUgZGlyZWN0aW9uIChpZ25vcmluZyBoaWRkZW4gZWxlbWVudHMpXG4gICAgICAgICAgdmFyIGRyYWdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG5cbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBkcmFnSW5kZXggLT0gZGlyZWN0aW9uO1xuICAgICAgICAgICAgc2libGluZyA9IHBhcmVudEVsLmNoaWxkcmVuW2RyYWdJbmRleF07XG4gICAgICAgICAgfSB3aGlsZSAoc2libGluZyAmJiAoY3NzKHNpYmxpbmcsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBzaWJsaW5nID09PSBnaG9zdEVsKSk7XG4gICAgICAgIH0gLy8gSWYgZHJhZ0VsIGlzIGFscmVhZHkgYmVzaWRlIHRhcmdldDogRG8gbm90IGluc2VydFxuXG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gMCB8fCBzaWJsaW5nID09PSB0YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RUYXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIGxhc3REaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgICAgIHZhciBuZXh0U2libGluZyA9IHRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmcsXG4gICAgICAgICAgICBhZnRlciA9IGZhbHNlO1xuICAgICAgICBhZnRlciA9IGRpcmVjdGlvbiA9PT0gMTtcblxuICAgICAgICB2YXIgbW92ZVZlY3RvciA9IF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCBldnQsIGFmdGVyKTtcblxuICAgICAgICBpZiAobW92ZVZlY3RvciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBpZiAobW92ZVZlY3RvciA9PT0gMSB8fCBtb3ZlVmVjdG9yID09PSAtMSkge1xuICAgICAgICAgICAgYWZ0ZXIgPSBtb3ZlVmVjdG9yID09PSAxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9zaWxlbnQgPSB0cnVlO1xuICAgICAgICAgIHNldFRpbWVvdXQoX3Vuc2lsZW50LCAzMCk7XG4gICAgICAgICAgY2FwdHVyZSgpO1xuXG4gICAgICAgICAgaWYgKGFmdGVyICYmICFuZXh0U2libGluZykge1xuICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoZHJhZ0VsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgYWZ0ZXIgPyBuZXh0U2libGluZyA6IHRhcmdldCk7XG4gICAgICAgICAgfSAvLyBVbmRvIGNocm9tZSdzIHNjcm9sbCBhZGp1c3RtZW50IChoYXMgbm8gZWZmZWN0IG9uIG90aGVyIGJyb3dzZXJzKVxuXG5cbiAgICAgICAgICBpZiAoc2Nyb2xsZWRQYXN0VG9wKSB7XG4gICAgICAgICAgICBzY3JvbGxCeShzY3JvbGxlZFBhc3RUb3AsIDAsIHNjcm9sbEJlZm9yZSAtIHNjcm9sbGVkUGFzdFRvcC5zY3JvbGxUb3ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEVsID0gZHJhZ0VsLnBhcmVudE5vZGU7IC8vIGFjdHVhbGl6YXRpb25cbiAgICAgICAgICAvLyBtdXN0IGJlIGRvbmUgYmVmb3JlIGFuaW1hdGlvblxuXG4gICAgICAgICAgaWYgKHRhcmdldEJlZm9yZUZpcnN0U3dhcCAhPT0gdW5kZWZpbmVkICYmICFpc0NpcmN1bXN0YW50aWFsSW52ZXJ0KSB7XG4gICAgICAgICAgICB0YXJnZXRNb3ZlRGlzdGFuY2UgPSBNYXRoLmFicyh0YXJnZXRCZWZvcmVGaXJzdFN3YXAgLSBnZXRSZWN0KHRhcmdldClbc2lkZTFdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaGFuZ2VkKCk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZWwuY29udGFpbnMoZHJhZ0VsKSkge1xuICAgICAgICByZXR1cm4gY29tcGxldGVkKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIF9pZ25vcmVXaGlsZUFuaW1hdGluZzogbnVsbCxcbiAgX29mZk1vdmVFdmVudHM6IGZ1bmN0aW9uIF9vZmZNb3ZlRXZlbnRzKCkge1xuICAgIG9mZihkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICBvZmYoZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgb2ZmKGRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgb2ZmKGRvY3VtZW50LCAnZHJhZ292ZXInLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgb2ZmKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgIG9mZihkb2N1bWVudCwgJ3RvdWNobW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgfSxcbiAgX29mZlVwRXZlbnRzOiBmdW5jdGlvbiBfb2ZmVXBFdmVudHMoKSB7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSB0aGlzLmVsLm93bmVyRG9jdW1lbnQ7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5fb25Ecm9wKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fb25Ecm9wKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3BvaW50ZXJ1cCcsIHRoaXMuX29uRHJvcCk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIHRoaXMuX29uRHJvcCk7XG4gICAgb2ZmKGRvY3VtZW50LCAnc2VsZWN0c3RhcnQnLCB0aGlzKTtcbiAgfSxcbiAgX29uRHJvcDogZnVuY3Rpb24gX29uRHJvcChcbiAgLyoqRXZlbnQqL1xuICBldnQpIHtcbiAgICB2YXIgZWwgPSB0aGlzLmVsLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zOyAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBkcmFnZ2VkIGVsZW1lbnQgd2l0aGluIGl0cyBwYXJlbnRcblxuICAgIG5ld0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcbiAgICBuZXdEcmFnZ2FibGVJbmRleCA9IGluZGV4KGRyYWdFbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuICAgIHBsdWdpbkV2ZW50KCdkcm9wJywgdGhpcywge1xuICAgICAgZXZ0OiBldnRcbiAgICB9KTtcbiAgICBwYXJlbnRFbCA9IGRyYWdFbCAmJiBkcmFnRWwucGFyZW50Tm9kZTsgLy8gR2V0IGFnYWluIGFmdGVyIHBsdWdpbiBldmVudFxuXG4gICAgbmV3SW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gaW5kZXgoZHJhZ0VsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG5cbiAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgdGhpcy5fbnVsbGluZygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSBmYWxzZTtcbiAgICBwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggPSBmYWxzZTtcbiAgICBjbGVhckludGVydmFsKHRoaXMuX2xvb3BJZCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2RyYWdTdGFydFRpbWVyKTtcblxuICAgIF9jYW5jZWxOZXh0VGljayh0aGlzLmNsb25lSWQpO1xuXG4gICAgX2NhbmNlbE5leHRUaWNrKHRoaXMuX2RyYWdTdGFydElkKTsgLy8gVW5iaW5kIGV2ZW50c1xuXG5cbiAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgIG9mZihkb2N1bWVudCwgJ2Ryb3AnLCB0aGlzKTtcbiAgICAgIG9mZihlbCwgJ2RyYWdzdGFydCcsIHRoaXMuX29uRHJhZ1N0YXJ0KTtcbiAgICB9XG5cbiAgICB0aGlzLl9vZmZNb3ZlRXZlbnRzKCk7XG5cbiAgICB0aGlzLl9vZmZVcEV2ZW50cygpO1xuXG4gICAgaWYgKFNhZmFyaSkge1xuICAgICAgY3NzKGRvY3VtZW50LmJvZHksICd1c2VyLXNlbGVjdCcsICcnKTtcbiAgICB9XG5cbiAgICBjc3MoZHJhZ0VsLCAndHJhbnNmb3JtJywgJycpO1xuXG4gICAgaWYgKGV2dCkge1xuICAgICAgaWYgKG1vdmVkKSB7XG4gICAgICAgIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAhb3B0aW9ucy5kcm9wQnViYmxlICYmIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgZ2hvc3RFbCAmJiBnaG9zdEVsLnBhcmVudE5vZGUgJiYgZ2hvc3RFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGdob3N0RWwpO1xuXG4gICAgICBpZiAocm9vdEVsID09PSBwYXJlbnRFbCB8fCBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSAhPT0gJ2Nsb25lJykge1xuICAgICAgICAvLyBSZW1vdmUgY2xvbmUocylcbiAgICAgICAgY2xvbmVFbCAmJiBjbG9uZUVsLnBhcmVudE5vZGUgJiYgY2xvbmVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lRWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICAgIG9mZihkcmFnRWwsICdkcmFnZW5kJywgdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBfZGlzYWJsZURyYWdnYWJsZShkcmFnRWwpO1xuXG4gICAgICAgIGRyYWdFbC5zdHlsZVsnd2lsbC1jaGFuZ2UnXSA9ICcnOyAvLyBSZW1vdmUgY2xhc3Nlc1xuICAgICAgICAvLyBnaG9zdENsYXNzIGlzIGFkZGVkIGluIGRyYWdTdGFydGVkXG5cbiAgICAgICAgaWYgKG1vdmVkICYmICFhd2FpdGluZ0RyYWdTdGFydGVkKSB7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBwdXRTb3J0YWJsZSA/IHB1dFNvcnRhYmxlLm9wdGlvbnMuZ2hvc3RDbGFzcyA6IHRoaXMub3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIHRoaXMub3B0aW9ucy5jaG9zZW5DbGFzcywgZmFsc2UpOyAvLyBEcmFnIHN0b3AgZXZlbnRcblxuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgbmFtZTogJ3VuY2hvb3NlJyxcbiAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICBuZXdJbmRleDogbnVsbCxcbiAgICAgICAgICBuZXdEcmFnZ2FibGVJbmRleDogbnVsbCxcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJvb3RFbCAhPT0gcGFyZW50RWwpIHtcbiAgICAgICAgICBpZiAobmV3SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgLy8gQWRkIGV2ZW50XG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHJvb3RFbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIG5hbWU6ICdhZGQnLFxuICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgZnJvbUVsOiByb290RWwsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgfSk7IC8vIFJlbW92ZSBldmVudFxuXG5cbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgIG5hbWU6ICdyZW1vdmUnLFxuICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTsgLy8gZHJhZyBmcm9tIG9uZSBsaXN0IGFuZCBkcm9wIGludG8gYW5vdGhlclxuXG5cbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgcm9vdEVsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgbmFtZTogJ3NvcnQnLFxuICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgZnJvbUVsOiByb290RWwsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgIG5hbWU6ICdzb3J0JyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHV0U29ydGFibGUgJiYgcHV0U29ydGFibGUuc2F2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChuZXdJbmRleCAhPT0gb2xkSW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChuZXdJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgIC8vIGRyYWcgJiBkcm9wIHdpdGhpbiB0aGUgc2FtZSBsaXN0XG4gICAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgICAgICBuYW1lOiAndXBkYXRlJyxcbiAgICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdzb3J0JyxcbiAgICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFNvcnRhYmxlLmFjdGl2ZSkge1xuICAgICAgICAgIC8qIGpzaGludCBlcW51bGw6dHJ1ZSAqL1xuICAgICAgICAgIGlmIChuZXdJbmRleCA9PSBudWxsIHx8IG5ld0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgbmV3SW5kZXggPSBvbGRJbmRleDtcbiAgICAgICAgICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICBuYW1lOiAnZW5kJyxcbiAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgfSk7IC8vIFNhdmUgc29ydGluZ1xuXG5cbiAgICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX251bGxpbmcoKTtcbiAgfSxcbiAgX251bGxpbmc6IGZ1bmN0aW9uIF9udWxsaW5nKCkge1xuICAgIHBsdWdpbkV2ZW50KCdudWxsaW5nJywgdGhpcyk7XG4gICAgcm9vdEVsID0gZHJhZ0VsID0gcGFyZW50RWwgPSBnaG9zdEVsID0gbmV4dEVsID0gY2xvbmVFbCA9IGxhc3REb3duRWwgPSBjbG9uZUhpZGRlbiA9IHRhcEV2dCA9IHRvdWNoRXZ0ID0gbW92ZWQgPSBuZXdJbmRleCA9IG5ld0RyYWdnYWJsZUluZGV4ID0gb2xkSW5kZXggPSBvbGREcmFnZ2FibGVJbmRleCA9IGxhc3RUYXJnZXQgPSBsYXN0RGlyZWN0aW9uID0gcHV0U29ydGFibGUgPSBhY3RpdmVHcm91cCA9IFNvcnRhYmxlLmRyYWdnZWQgPSBTb3J0YWJsZS5naG9zdCA9IFNvcnRhYmxlLmNsb25lID0gU29ydGFibGUuYWN0aXZlID0gbnVsbDtcbiAgICBzYXZlZElucHV0Q2hlY2tlZC5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgZWwuY2hlY2tlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgc2F2ZWRJbnB1dENoZWNrZWQubGVuZ3RoID0gbGFzdER4ID0gbGFzdER5ID0gMDtcbiAgfSxcbiAgaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KFxuICAvKipFdmVudCovXG4gIGV2dCkge1xuICAgIHN3aXRjaCAoZXZ0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ2Ryb3AnOlxuICAgICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgICAgIHRoaXMuX29uRHJvcChldnQpO1xuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgICAgY2FzZSAnZHJhZ292ZXInOlxuICAgICAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICAgICAgdGhpcy5fb25EcmFnT3ZlcihldnQpO1xuXG4gICAgICAgICAgX2dsb2JhbERyYWdPdmVyKGV2dCk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc2VsZWN0c3RhcnQnOlxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHRoZSBpdGVtIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5nLlxuICAgKiBAcmV0dXJucyB7U3RyaW5nW119XG4gICAqL1xuICB0b0FycmF5OiBmdW5jdGlvbiB0b0FycmF5KCkge1xuICAgIHZhciBvcmRlciA9IFtdLFxuICAgICAgICBlbCxcbiAgICAgICAgY2hpbGRyZW4gPSB0aGlzLmVsLmNoaWxkcmVuLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbiA9IGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgIGZvciAoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBlbCA9IGNoaWxkcmVuW2ldO1xuXG4gICAgICBpZiAoY2xvc2VzdChlbCwgb3B0aW9ucy5kcmFnZ2FibGUsIHRoaXMuZWwsIGZhbHNlKSkge1xuICAgICAgICBvcmRlci5wdXNoKGVsLmdldEF0dHJpYnV0ZShvcHRpb25zLmRhdGFJZEF0dHIpIHx8IF9nZW5lcmF0ZUlkKGVsKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTb3J0cyB0aGUgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBhcnJheS5cbiAgICogQHBhcmFtICB7U3RyaW5nW119ICBvcmRlciAgb3JkZXIgb2YgdGhlIGl0ZW1zXG4gICAqL1xuICBzb3J0OiBmdW5jdGlvbiBzb3J0KG9yZGVyLCB1c2VBbmltYXRpb24pIHtcbiAgICB2YXIgaXRlbXMgPSB7fSxcbiAgICAgICAgcm9vdEVsID0gdGhpcy5lbDtcbiAgICB0aGlzLnRvQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCwgaSkge1xuICAgICAgdmFyIGVsID0gcm9vdEVsLmNoaWxkcmVuW2ldO1xuXG4gICAgICBpZiAoY2xvc2VzdChlbCwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSwgcm9vdEVsLCBmYWxzZSkpIHtcbiAgICAgICAgaXRlbXNbaWRdID0gZWw7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gICAgdXNlQW5pbWF0aW9uICYmIHRoaXMuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgb3JkZXIuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGlmIChpdGVtc1tpZF0pIHtcbiAgICAgICAgcm9vdEVsLnJlbW92ZUNoaWxkKGl0ZW1zW2lkXSk7XG4gICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChpdGVtc1tpZF0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHVzZUFuaW1hdGlvbiAmJiB0aGlzLmFuaW1hdGVBbGwoKTtcbiAgfSxcblxuICAvKipcbiAgICogU2F2ZSB0aGUgY3VycmVudCBzb3J0aW5nXG4gICAqL1xuICBzYXZlOiBmdW5jdGlvbiBzYXZlKCkge1xuICAgIHZhciBzdG9yZSA9IHRoaXMub3B0aW9ucy5zdG9yZTtcbiAgICBzdG9yZSAmJiBzdG9yZS5zZXQgJiYgc3RvcmUuc2V0KHRoaXMpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQsIGdldCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yIGJ5IHRlc3RpbmcgdGhlIGVsZW1lbnQgaXRzZWxmIGFuZCB0cmF2ZXJzaW5nIHVwIHRocm91Z2ggaXRzIGFuY2VzdG9ycyBpbiB0aGUgRE9NIHRyZWUuXG4gICAqIEBwYXJhbSAgIHtIVE1MRWxlbWVudH0gIGVsXG4gICAqIEBwYXJhbSAgIHtTdHJpbmd9ICAgICAgIFtzZWxlY3Rvcl0gIGRlZmF1bHQ6IGBvcHRpb25zLmRyYWdnYWJsZWBcbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBjbG9zZXN0OiBmdW5jdGlvbiBjbG9zZXN0JDEoZWwsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWwsIHNlbGVjdG9yIHx8IHRoaXMub3B0aW9ucy5kcmFnZ2FibGUsIHRoaXMuZWwsIGZhbHNlKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0L2dldCBvcHRpb25cbiAgICogQHBhcmFtICAge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0gICB7Kn0gICAgICBbdmFsdWVdXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgb3B0aW9uOiBmdW5jdGlvbiBvcHRpb24obmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gb3B0aW9uc1tuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG1vZGlmaWVkVmFsdWUgPSBQbHVnaW5NYW5hZ2VyLm1vZGlmeU9wdGlvbih0aGlzLCBuYW1lLCB2YWx1ZSk7XG5cbiAgICAgIGlmICh0eXBlb2YgbW9kaWZpZWRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb3B0aW9uc1tuYW1lXSA9IG1vZGlmaWVkVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zW25hbWVdID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIF9wcmVwYXJlR3JvdXAob3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEZXN0cm95XG4gICAqL1xuICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIHBsdWdpbkV2ZW50KCdkZXN0cm95JywgdGhpcyk7XG4gICAgdmFyIGVsID0gdGhpcy5lbDtcbiAgICBlbFtleHBhbmRvXSA9IG51bGw7XG4gICAgb2ZmKGVsLCAnbW91c2Vkb3duJywgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgb2ZmKGVsLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgIG9mZihlbCwgJ3BvaW50ZXJkb3duJywgdGhpcy5fb25UYXBTdGFydCk7XG5cbiAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgIG9mZihlbCwgJ2RyYWdvdmVyJywgdGhpcyk7XG4gICAgICBvZmYoZWwsICdkcmFnZW50ZXInLCB0aGlzKTtcbiAgICB9IC8vIFJlbW92ZSBkcmFnZ2FibGUgYXR0cmlidXRlc1xuXG5cbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkcmFnZ2FibGVdJyksIGZ1bmN0aW9uIChlbCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2FibGUnKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX29uRHJvcCgpO1xuXG4gICAgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCk7XG5cbiAgICBzb3J0YWJsZXMuc3BsaWNlKHNvcnRhYmxlcy5pbmRleE9mKHRoaXMuZWwpLCAxKTtcbiAgICB0aGlzLmVsID0gZWwgPSBudWxsO1xuICB9LFxuICBfaGlkZUNsb25lOiBmdW5jdGlvbiBfaGlkZUNsb25lKCkge1xuICAgIGlmICghY2xvbmVIaWRkZW4pIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdoaWRlQ2xvbmUnLCB0aGlzKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm47XG4gICAgICBjc3MoY2xvbmVFbCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlICYmIGNsb25lRWwucGFyZW50Tm9kZSkge1xuICAgICAgICBjbG9uZUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmVFbCk7XG4gICAgICB9XG5cbiAgICAgIGNsb25lSGlkZGVuID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIF9zaG93Q2xvbmU6IGZ1bmN0aW9uIF9zaG93Q2xvbmUocHV0U29ydGFibGUpIHtcbiAgICBpZiAocHV0U29ydGFibGUubGFzdFB1dE1vZGUgIT09ICdjbG9uZScpIHtcbiAgICAgIHRoaXMuX2hpZGVDbG9uZSgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNsb25lSGlkZGVuKSB7XG4gICAgICBwbHVnaW5FdmVudCgnc2hvd0Nsb25lJywgdGhpcyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuOyAvLyBzaG93IGNsb25lIGF0IGRyYWdFbCBvciBvcmlnaW5hbCBwb3NpdGlvblxuXG4gICAgICBpZiAoZHJhZ0VsLnBhcmVudE5vZGUgPT0gcm9vdEVsICYmICF0aGlzLm9wdGlvbnMuZ3JvdXAucmV2ZXJ0Q2xvbmUpIHtcbiAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShjbG9uZUVsLCBkcmFnRWwpO1xuICAgICAgfSBlbHNlIGlmIChuZXh0RWwpIHtcbiAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShjbG9uZUVsLCBuZXh0RWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKGNsb25lRWwpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmdyb3VwLnJldmVydENsb25lKSB7XG4gICAgICAgIHRoaXMuYW5pbWF0ZShkcmFnRWwsIGNsb25lRWwpO1xuICAgICAgfVxuXG4gICAgICBjc3MoY2xvbmVFbCwgJ2Rpc3BsYXknLCAnJyk7XG4gICAgICBjbG9uZUhpZGRlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gX2dsb2JhbERyYWdPdmVyKFxuLyoqRXZlbnQqL1xuZXZ0KSB7XG4gIGlmIChldnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgZXZ0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xuICB9XG5cbiAgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG59XG5cbmZ1bmN0aW9uIF9vbk1vdmUoZnJvbUVsLCB0b0VsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXRFbCwgdGFyZ2V0UmVjdCwgb3JpZ2luYWxFdmVudCwgd2lsbEluc2VydEFmdGVyKSB7XG4gIHZhciBldnQsXG4gICAgICBzb3J0YWJsZSA9IGZyb21FbFtleHBhbmRvXSxcbiAgICAgIG9uTW92ZUZuID0gc29ydGFibGUub3B0aW9ucy5vbk1vdmUsXG4gICAgICByZXRWYWw7IC8vIFN1cHBvcnQgZm9yIG5ldyBDdXN0b21FdmVudCBmZWF0dXJlXG5cbiAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiAhSUUxMU9yTGVzcyAmJiAhRWRnZSkge1xuICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudCgnbW92ZScsIHtcbiAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZ0LmluaXRFdmVudCgnbW92ZScsIHRydWUsIHRydWUpO1xuICB9XG5cbiAgZXZ0LnRvID0gdG9FbDtcbiAgZXZ0LmZyb20gPSBmcm9tRWw7XG4gIGV2dC5kcmFnZ2VkID0gZHJhZ0VsO1xuICBldnQuZHJhZ2dlZFJlY3QgPSBkcmFnUmVjdDtcbiAgZXZ0LnJlbGF0ZWQgPSB0YXJnZXRFbCB8fCB0b0VsO1xuICBldnQucmVsYXRlZFJlY3QgPSB0YXJnZXRSZWN0IHx8IGdldFJlY3QodG9FbCk7XG4gIGV2dC53aWxsSW5zZXJ0QWZ0ZXIgPSB3aWxsSW5zZXJ0QWZ0ZXI7XG4gIGV2dC5vcmlnaW5hbEV2ZW50ID0gb3JpZ2luYWxFdmVudDtcbiAgZnJvbUVsLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICBpZiAob25Nb3ZlRm4pIHtcbiAgICByZXRWYWwgPSBvbk1vdmVGbi5jYWxsKHNvcnRhYmxlLCBldnQsIG9yaWdpbmFsRXZlbnQpO1xuICB9XG5cbiAgcmV0dXJuIHJldFZhbDtcbn1cblxuZnVuY3Rpb24gX2Rpc2FibGVEcmFnZ2FibGUoZWwpIHtcbiAgZWwuZHJhZ2dhYmxlID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIF91bnNpbGVudCgpIHtcbiAgX3NpbGVudCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBfZ2hvc3RJc0ZpcnN0KGV2dCwgdmVydGljYWwsIHNvcnRhYmxlKSB7XG4gIHZhciByZWN0ID0gZ2V0UmVjdChnZXRDaGlsZChzb3J0YWJsZS5lbCwgMCwgc29ydGFibGUub3B0aW9ucywgdHJ1ZSkpO1xuICB2YXIgc3BhY2VyID0gMTA7XG4gIHJldHVybiB2ZXJ0aWNhbCA/IGV2dC5jbGllbnRYIDwgcmVjdC5sZWZ0IC0gc3BhY2VyIHx8IGV2dC5jbGllbnRZIDwgcmVjdC50b3AgJiYgZXZ0LmNsaWVudFggPCByZWN0LnJpZ2h0IDogZXZ0LmNsaWVudFkgPCByZWN0LnRvcCAtIHNwYWNlciB8fCBldnQuY2xpZW50WSA8IHJlY3QuYm90dG9tICYmIGV2dC5jbGllbnRYIDwgcmVjdC5sZWZ0O1xufVxuXG5mdW5jdGlvbiBfZ2hvc3RJc0xhc3QoZXZ0LCB2ZXJ0aWNhbCwgc29ydGFibGUpIHtcbiAgdmFyIHJlY3QgPSBnZXRSZWN0KGxhc3RDaGlsZChzb3J0YWJsZS5lbCwgc29ydGFibGUub3B0aW9ucy5kcmFnZ2FibGUpKTtcbiAgdmFyIHNwYWNlciA9IDEwO1xuICByZXR1cm4gdmVydGljYWwgPyBldnQuY2xpZW50WCA+IHJlY3QucmlnaHQgKyBzcGFjZXIgfHwgZXZ0LmNsaWVudFggPD0gcmVjdC5yaWdodCAmJiBldnQuY2xpZW50WSA+IHJlY3QuYm90dG9tICYmIGV2dC5jbGllbnRYID49IHJlY3QubGVmdCA6IGV2dC5jbGllbnRYID4gcmVjdC5yaWdodCAmJiBldnQuY2xpZW50WSA+IHJlY3QudG9wIHx8IGV2dC5jbGllbnRYIDw9IHJlY3QucmlnaHQgJiYgZXZ0LmNsaWVudFkgPiByZWN0LmJvdHRvbSArIHNwYWNlcjtcbn1cblxuZnVuY3Rpb24gX2dldFN3YXBEaXJlY3Rpb24oZXZ0LCB0YXJnZXQsIHRhcmdldFJlY3QsIHZlcnRpY2FsLCBzd2FwVGhyZXNob2xkLCBpbnZlcnRlZFN3YXBUaHJlc2hvbGQsIGludmVydFN3YXAsIGlzTGFzdFRhcmdldCkge1xuICB2YXIgbW91c2VPbkF4aXMgPSB2ZXJ0aWNhbCA/IGV2dC5jbGllbnRZIDogZXZ0LmNsaWVudFgsXG4gICAgICB0YXJnZXRMZW5ndGggPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QuaGVpZ2h0IDogdGFyZ2V0UmVjdC53aWR0aCxcbiAgICAgIHRhcmdldFMxID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LnRvcCA6IHRhcmdldFJlY3QubGVmdCxcbiAgICAgIHRhcmdldFMyID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LmJvdHRvbSA6IHRhcmdldFJlY3QucmlnaHQsXG4gICAgICBpbnZlcnQgPSBmYWxzZTtcblxuICBpZiAoIWludmVydFN3YXApIHtcbiAgICAvLyBOZXZlciBpbnZlcnQgb3IgY3JlYXRlIGRyYWdFbCBzaGFkb3cgd2hlbiB0YXJnZXQgbW92ZW1lbmV0IGNhdXNlcyBtb3VzZSB0byBtb3ZlIHBhc3QgdGhlIGVuZCBvZiByZWd1bGFyIHN3YXBUaHJlc2hvbGRcbiAgICBpZiAoaXNMYXN0VGFyZ2V0ICYmIHRhcmdldE1vdmVEaXN0YW5jZSA8IHRhcmdldExlbmd0aCAqIHN3YXBUaHJlc2hvbGQpIHtcbiAgICAgIC8vIG11bHRpcGxpZWQgb25seSBieSBzd2FwVGhyZXNob2xkIGJlY2F1c2UgbW91c2Ugd2lsbCBhbHJlYWR5IGJlIGluc2lkZSB0YXJnZXQgYnkgKDEgLSB0aHJlc2hvbGQpICogdGFyZ2V0TGVuZ3RoIC8gMlxuICAgICAgLy8gY2hlY2sgaWYgcGFzdCBmaXJzdCBpbnZlcnQgdGhyZXNob2xkIG9uIHNpZGUgb3Bwb3NpdGUgb2YgbGFzdERpcmVjdGlvblxuICAgICAgaWYgKCFwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggJiYgKGxhc3REaXJlY3Rpb24gPT09IDEgPyBtb3VzZU9uQXhpcyA+IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMiA6IG1vdXNlT25BeGlzIDwgdGFyZ2V0UzIgLSB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyKSkge1xuICAgICAgICAvLyBwYXN0IGZpcnN0IGludmVydCB0aHJlc2hvbGQsIGRvIG5vdCByZXN0cmljdCBpbnZlcnRlZCB0aHJlc2hvbGQgdG8gZHJhZ0VsIHNoYWRvd1xuICAgICAgICBwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXBhc3RGaXJzdEludmVydFRocmVzaCkge1xuICAgICAgICAvLyBkcmFnRWwgc2hhZG93ICh0YXJnZXQgbW92ZSBkaXN0YW5jZSBzaGFkb3cpXG4gICAgICAgIGlmIChsYXN0RGlyZWN0aW9uID09PSAxID8gbW91c2VPbkF4aXMgPCB0YXJnZXRTMSArIHRhcmdldE1vdmVEaXN0YW5jZSAvLyBvdmVyIGRyYWdFbCBzaGFkb3dcbiAgICAgICAgOiBtb3VzZU9uQXhpcyA+IHRhcmdldFMyIC0gdGFyZ2V0TW92ZURpc3RhbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIC1sYXN0RGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnZlcnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZWd1bGFyXG4gICAgICBpZiAobW91c2VPbkF4aXMgPiB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAqICgxIC0gc3dhcFRocmVzaG9sZCkgLyAyICYmIG1vdXNlT25BeGlzIDwgdGFyZ2V0UzIgLSB0YXJnZXRMZW5ndGggKiAoMSAtIHN3YXBUaHJlc2hvbGQpIC8gMikge1xuICAgICAgICByZXR1cm4gX2dldEluc2VydERpcmVjdGlvbih0YXJnZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGludmVydCA9IGludmVydCB8fCBpbnZlcnRTd2FwO1xuXG4gIGlmIChpbnZlcnQpIHtcbiAgICAvLyBJbnZlcnQgb2YgcmVndWxhclxuICAgIGlmIChtb3VzZU9uQXhpcyA8IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMiB8fCBtb3VzZU9uQXhpcyA+IHRhcmdldFMyIC0gdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMikge1xuICAgICAgcmV0dXJuIG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggLyAyID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAwO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBkaXJlY3Rpb24gZHJhZ0VsIG11c3QgYmUgc3dhcHBlZCByZWxhdGl2ZSB0byB0YXJnZXQgaW4gb3JkZXIgdG8gbWFrZSBpdFxuICogc2VlbSB0aGF0IGRyYWdFbCBoYXMgYmVlbiBcImluc2VydGVkXCIgaW50byB0aGF0IGVsZW1lbnQncyBwb3NpdGlvblxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IHRhcmdldCAgICAgICBUaGUgdGFyZ2V0IHdob3NlIHBvc2l0aW9uIGRyYWdFbCBpcyBiZWluZyBpbnNlcnRlZCBhdFxuICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICAgICAgICAgICBEaXJlY3Rpb24gZHJhZ0VsIG11c3QgYmUgc3dhcHBlZFxuICovXG5cblxuZnVuY3Rpb24gX2dldEluc2VydERpcmVjdGlvbih0YXJnZXQpIHtcbiAgaWYgKGluZGV4KGRyYWdFbCkgPCBpbmRleCh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4vKipcbiAqIEdlbmVyYXRlIGlkXG4gKiBAcGFyYW0gICB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5cbmZ1bmN0aW9uIF9nZW5lcmF0ZUlkKGVsKSB7XG4gIHZhciBzdHIgPSBlbC50YWdOYW1lICsgZWwuY2xhc3NOYW1lICsgZWwuc3JjICsgZWwuaHJlZiArIGVsLnRleHRDb250ZW50LFxuICAgICAgaSA9IHN0ci5sZW5ndGgsXG4gICAgICBzdW0gPSAwO1xuXG4gIHdoaWxlIChpLS0pIHtcbiAgICBzdW0gKz0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gIH1cblxuICByZXR1cm4gc3VtLnRvU3RyaW5nKDM2KTtcbn1cblxuZnVuY3Rpb24gX3NhdmVJbnB1dENoZWNrZWRTdGF0ZShyb290KSB7XG4gIHNhdmVkSW5wdXRDaGVja2VkLmxlbmd0aCA9IDA7XG4gIHZhciBpbnB1dHMgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpO1xuICB2YXIgaWR4ID0gaW5wdXRzLmxlbmd0aDtcblxuICB3aGlsZSAoaWR4LS0pIHtcbiAgICB2YXIgZWwgPSBpbnB1dHNbaWR4XTtcbiAgICBlbC5jaGVja2VkICYmIHNhdmVkSW5wdXRDaGVja2VkLnB1c2goZWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9uZXh0VGljayhmbikge1xuICByZXR1cm4gc2V0VGltZW91dChmbiwgMCk7XG59XG5cbmZ1bmN0aW9uIF9jYW5jZWxOZXh0VGljayhpZCkge1xuICByZXR1cm4gY2xlYXJUaW1lb3V0KGlkKTtcbn0gLy8gRml4ZWQgIzk3MzpcblxuXG5pZiAoZG9jdW1lbnRFeGlzdHMpIHtcbiAgb24oZG9jdW1lbnQsICd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgaWYgKChTb3J0YWJsZS5hY3RpdmUgfHwgYXdhaXRpbmdEcmFnU3RhcnRlZCkgJiYgZXZ0LmNhbmNlbGFibGUpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSk7XG59IC8vIEV4cG9ydCB1dGlsc1xuXG5cblNvcnRhYmxlLnV0aWxzID0ge1xuICBvbjogb24sXG4gIG9mZjogb2ZmLFxuICBjc3M6IGNzcyxcbiAgZmluZDogZmluZCxcbiAgaXM6IGZ1bmN0aW9uIGlzKGVsLCBzZWxlY3Rvcikge1xuICAgIHJldHVybiAhIWNsb3Nlc3QoZWwsIHNlbGVjdG9yLCBlbCwgZmFsc2UpO1xuICB9LFxuICBleHRlbmQ6IGV4dGVuZCxcbiAgdGhyb3R0bGU6IHRocm90dGxlLFxuICBjbG9zZXN0OiBjbG9zZXN0LFxuICB0b2dnbGVDbGFzczogdG9nZ2xlQ2xhc3MsXG4gIGNsb25lOiBjbG9uZSxcbiAgaW5kZXg6IGluZGV4LFxuICBuZXh0VGljazogX25leHRUaWNrLFxuICBjYW5jZWxOZXh0VGljazogX2NhbmNlbE5leHRUaWNrLFxuICBkZXRlY3REaXJlY3Rpb246IF9kZXRlY3REaXJlY3Rpb24sXG4gIGdldENoaWxkOiBnZXRDaGlsZFxufTtcbi8qKlxuICogR2V0IHRoZSBTb3J0YWJsZSBpbnN0YW5jZSBvZiBhbiBlbGVtZW50XG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudFxuICogQHJldHVybiB7U29ydGFibGV8dW5kZWZpbmVkfSAgICAgICAgIFRoZSBpbnN0YW5jZSBvZiBTb3J0YWJsZVxuICovXG5cblNvcnRhYmxlLmdldCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50W2V4cGFuZG9dO1xufTtcbi8qKlxuICogTW91bnQgYSBwbHVnaW4gdG8gU29ydGFibGVcbiAqIEBwYXJhbSAgey4uLlNvcnRhYmxlUGx1Z2lufFNvcnRhYmxlUGx1Z2luW119IHBsdWdpbnMgICAgICAgUGx1Z2lucyBiZWluZyBtb3VudGVkXG4gKi9cblxuXG5Tb3J0YWJsZS5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHBsdWdpbnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcGx1Z2luc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChwbHVnaW5zWzBdLmNvbnN0cnVjdG9yID09PSBBcnJheSkgcGx1Z2lucyA9IHBsdWdpbnNbMF07XG4gIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgaWYgKCFwbHVnaW4ucHJvdG90eXBlIHx8ICFwbHVnaW4ucHJvdG90eXBlLmNvbnN0cnVjdG9yKSB7XG4gICAgICB0aHJvdyBcIlNvcnRhYmxlOiBNb3VudGVkIHBsdWdpbiBtdXN0IGJlIGEgY29uc3RydWN0b3IgZnVuY3Rpb24sIG5vdCBcIi5jb25jYXQoe30udG9TdHJpbmcuY2FsbChwbHVnaW4pKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLnV0aWxzKSBTb3J0YWJsZS51dGlscyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBTb3J0YWJsZS51dGlscyksIHBsdWdpbi51dGlscyk7XG4gICAgUGx1Z2luTWFuYWdlci5tb3VudChwbHVnaW4pO1xuICB9KTtcbn07XG4vKipcbiAqIENyZWF0ZSBzb3J0YWJsZSBpbnN0YW5jZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gIGVsXG4gKiBAcGFyYW0ge09iamVjdH0gICAgICBbb3B0aW9uc11cbiAqL1xuXG5cblNvcnRhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFNvcnRhYmxlKGVsLCBvcHRpb25zKTtcbn07IC8vIEV4cG9ydFxuXG5cblNvcnRhYmxlLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG52YXIgYXV0b1Njcm9sbHMgPSBbXSxcbiAgICBzY3JvbGxFbCxcbiAgICBzY3JvbGxSb290RWwsXG4gICAgc2Nyb2xsaW5nID0gZmFsc2UsXG4gICAgbGFzdEF1dG9TY3JvbGxYLFxuICAgIGxhc3RBdXRvU2Nyb2xsWSxcbiAgICB0b3VjaEV2dCQxLFxuICAgIHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsO1xuXG5mdW5jdGlvbiBBdXRvU2Nyb2xsUGx1Z2luKCkge1xuICBmdW5jdGlvbiBBdXRvU2Nyb2xsKCkge1xuICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICBzY3JvbGw6IHRydWUsXG4gICAgICBmb3JjZUF1dG9TY3JvbGxGYWxsYmFjazogZmFsc2UsXG4gICAgICBzY3JvbGxTZW5zaXRpdml0eTogMzAsXG4gICAgICBzY3JvbGxTcGVlZDogMTAsXG4gICAgICBidWJibGVTY3JvbGw6IHRydWVcbiAgICB9OyAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcblxuICAgIGZvciAodmFyIGZuIGluIHRoaXMpIHtcbiAgICAgIGlmIChmbi5jaGFyQXQoMCkgPT09ICdfJyAmJiB0eXBlb2YgdGhpc1tmbl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpc1tmbl0gPSB0aGlzW2ZuXS5iaW5kKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEF1dG9TY3JvbGwucHJvdG90eXBlID0ge1xuICAgIGRyYWdTdGFydGVkOiBmdW5jdGlvbiBkcmFnU3RhcnRlZChfcmVmKSB7XG4gICAgICB2YXIgb3JpZ2luYWxFdmVudCA9IF9yZWYub3JpZ2luYWxFdmVudDtcblxuICAgICAgaWYgKHRoaXMuc29ydGFibGUubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAnZHJhZ292ZXInLCB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbEV2ZW50LnRvdWNoZXMpIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb24oZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckNvbXBsZXRlZDogZnVuY3Rpb24gZHJhZ092ZXJDb21wbGV0ZWQoX3JlZjIpIHtcbiAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gX3JlZjIub3JpZ2luYWxFdmVudDtcblxuICAgICAgLy8gRm9yIHdoZW4gYnViYmxpbmcgaXMgY2FuY2VsZWQgYW5kIHVzaW5nIGZhbGxiYWNrIChmYWxsYmFjayAndG91Y2htb3ZlJyBhbHdheXMgcmVhY2hlZClcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmRyYWdPdmVyQnViYmxlICYmICFvcmlnaW5hbEV2ZW50LnJvb3RFbCkge1xuICAgICAgICB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKG9yaWdpbmFsRXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZHJvcDogZnVuY3Rpb24gZHJvcCgpIHtcbiAgICAgIGlmICh0aGlzLnNvcnRhYmxlLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICBvZmYoZG9jdW1lbnQsICdkcmFnb3ZlcicsIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICBvZmYoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgfVxuXG4gICAgICBjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKCk7XG4gICAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgICBjYW5jZWxUaHJvdHRsZSgpO1xuICAgIH0sXG4gICAgbnVsbGluZzogZnVuY3Rpb24gbnVsbGluZygpIHtcbiAgICAgIHRvdWNoRXZ0JDEgPSBzY3JvbGxSb290RWwgPSBzY3JvbGxFbCA9IHNjcm9sbGluZyA9IHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsID0gbGFzdEF1dG9TY3JvbGxYID0gbGFzdEF1dG9TY3JvbGxZID0gbnVsbDtcbiAgICAgIGF1dG9TY3JvbGxzLmxlbmd0aCA9IDA7XG4gICAgfSxcbiAgICBfaGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsOiBmdW5jdGlvbiBfaGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKGV2dCkge1xuICAgICAgdGhpcy5faGFuZGxlQXV0b1Njcm9sbChldnQsIHRydWUpO1xuICAgIH0sXG4gICAgX2hhbmRsZUF1dG9TY3JvbGw6IGZ1bmN0aW9uIF9oYW5kbGVBdXRvU2Nyb2xsKGV2dCwgZmFsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciB4ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFgsXG4gICAgICAgICAgeSA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRZLFxuICAgICAgICAgIGVsZW0gPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgICAgdG91Y2hFdnQkMSA9IGV2dDsgLy8gSUUgZG9lcyBub3Qgc2VlbSB0byBoYXZlIG5hdGl2ZSBhdXRvc2Nyb2xsLFxuICAgICAgLy8gRWRnZSdzIGF1dG9zY3JvbGwgc2VlbXMgdG9vIGNvbmRpdGlvbmFsLFxuICAgICAgLy8gTUFDT1MgU2FmYXJpIGRvZXMgbm90IGhhdmUgYXV0b3Njcm9sbCxcbiAgICAgIC8vIEZpcmVmb3ggYW5kIENocm9tZSBhcmUgZ29vZFxuXG4gICAgICBpZiAoZmFsbGJhY2sgfHwgdGhpcy5vcHRpb25zLmZvcmNlQXV0b1Njcm9sbEZhbGxiYWNrIHx8IEVkZ2UgfHwgSUUxMU9yTGVzcyB8fCBTYWZhcmkpIHtcbiAgICAgICAgYXV0b1Njcm9sbChldnQsIHRoaXMub3B0aW9ucywgZWxlbSwgZmFsbGJhY2spOyAvLyBMaXN0ZW5lciBmb3IgcG9pbnRlciBlbGVtZW50IGNoYW5nZVxuXG4gICAgICAgIHZhciBvZ0VsZW1TY3JvbGxlciA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsZW0sIHRydWUpO1xuXG4gICAgICAgIGlmIChzY3JvbGxpbmcgJiYgKCFwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCB8fCB4ICE9PSBsYXN0QXV0b1Njcm9sbFggfHwgeSAhPT0gbGFzdEF1dG9TY3JvbGxZKSkge1xuICAgICAgICAgIHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsICYmIGNsZWFyUG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwoKTsgLy8gRGV0ZWN0IGZvciBwb2ludGVyIGVsZW0gY2hhbmdlLCBlbXVsYXRpbmcgbmF0aXZlIERuRCBiZWhhdmlvdXJcblxuICAgICAgICAgIHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG5ld0VsZW0gPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHgsIHkpLCB0cnVlKTtcblxuICAgICAgICAgICAgaWYgKG5ld0VsZW0gIT09IG9nRWxlbVNjcm9sbGVyKSB7XG4gICAgICAgICAgICAgIG9nRWxlbVNjcm9sbGVyID0gbmV3RWxlbTtcbiAgICAgICAgICAgICAgY2xlYXJBdXRvU2Nyb2xscygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhdXRvU2Nyb2xsKGV2dCwgX3RoaXMub3B0aW9ucywgbmV3RWxlbSwgZmFsbGJhY2spO1xuICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgICBsYXN0QXV0b1Njcm9sbFggPSB4O1xuICAgICAgICAgIGxhc3RBdXRvU2Nyb2xsWSA9IHk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIERuRCBpcyBlbmFibGVkIChhbmQgYnJvd3NlciBoYXMgZ29vZCBhdXRvc2Nyb2xsaW5nKSwgZmlyc3QgYXV0b3Njcm9sbCB3aWxsIGFscmVhZHkgc2Nyb2xsLCBzbyBnZXQgcGFyZW50IGF1dG9zY3JvbGwgb2YgZmlyc3QgYXV0b3Njcm9sbFxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idWJibGVTY3JvbGwgfHwgZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgdHJ1ZSkgPT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkge1xuICAgICAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhdXRvU2Nyb2xsKGV2dCwgdGhpcy5vcHRpb25zLCBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbGVtLCBmYWxzZSksIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcyhBdXRvU2Nyb2xsLCB7XG4gICAgcGx1Z2luTmFtZTogJ3Njcm9sbCcsXG4gICAgaW5pdGlhbGl6ZUJ5RGVmYXVsdDogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gY2xlYXJBdXRvU2Nyb2xscygpIHtcbiAgYXV0b1Njcm9sbHMuZm9yRWFjaChmdW5jdGlvbiAoYXV0b1Njcm9sbCkge1xuICAgIGNsZWFySW50ZXJ2YWwoYXV0b1Njcm9sbC5waWQpO1xuICB9KTtcbiAgYXV0b1Njcm9sbHMgPSBbXTtcbn1cblxuZnVuY3Rpb24gY2xlYXJQb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCgpIHtcbiAgY2xlYXJJbnRlcnZhbChwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCk7XG59XG5cbnZhciBhdXRvU2Nyb2xsID0gdGhyb3R0bGUoZnVuY3Rpb24gKGV2dCwgb3B0aW9ucywgcm9vdEVsLCBpc0ZhbGxiYWNrKSB7XG4gIC8vIEJ1ZzogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTA1NTIxXG4gIGlmICghb3B0aW9ucy5zY3JvbGwpIHJldHVybjtcbiAgdmFyIHggPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WCxcbiAgICAgIHkgPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WSxcbiAgICAgIHNlbnMgPSBvcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5LFxuICAgICAgc3BlZWQgPSBvcHRpb25zLnNjcm9sbFNwZWVkLFxuICAgICAgd2luU2Nyb2xsZXIgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gIHZhciBzY3JvbGxUaGlzSW5zdGFuY2UgPSBmYWxzZSxcbiAgICAgIHNjcm9sbEN1c3RvbUZuOyAvLyBOZXcgc2Nyb2xsIHJvb3QsIHNldCBzY3JvbGxFbFxuXG4gIGlmIChzY3JvbGxSb290RWwgIT09IHJvb3RFbCkge1xuICAgIHNjcm9sbFJvb3RFbCA9IHJvb3RFbDtcbiAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgc2Nyb2xsRWwgPSBvcHRpb25zLnNjcm9sbDtcbiAgICBzY3JvbGxDdXN0b21GbiA9IG9wdGlvbnMuc2Nyb2xsRm47XG5cbiAgICBpZiAoc2Nyb2xsRWwgPT09IHRydWUpIHtcbiAgICAgIHNjcm9sbEVsID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQocm9vdEVsLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgbGF5ZXJzT3V0ID0gMDtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBzY3JvbGxFbDtcblxuICBkbyB7XG4gICAgdmFyIGVsID0gY3VycmVudFBhcmVudCxcbiAgICAgICAgcmVjdCA9IGdldFJlY3QoZWwpLFxuICAgICAgICB0b3AgPSByZWN0LnRvcCxcbiAgICAgICAgYm90dG9tID0gcmVjdC5ib3R0b20sXG4gICAgICAgIGxlZnQgPSByZWN0LmxlZnQsXG4gICAgICAgIHJpZ2h0ID0gcmVjdC5yaWdodCxcbiAgICAgICAgd2lkdGggPSByZWN0LndpZHRoLFxuICAgICAgICBoZWlnaHQgPSByZWN0LmhlaWdodCxcbiAgICAgICAgY2FuU2Nyb2xsWCA9IHZvaWQgMCxcbiAgICAgICAgY2FuU2Nyb2xsWSA9IHZvaWQgMCxcbiAgICAgICAgc2Nyb2xsV2lkdGggPSBlbC5zY3JvbGxXaWR0aCxcbiAgICAgICAgc2Nyb2xsSGVpZ2h0ID0gZWwuc2Nyb2xsSGVpZ2h0LFxuICAgICAgICBlbENTUyA9IGNzcyhlbCksXG4gICAgICAgIHNjcm9sbFBvc1ggPSBlbC5zY3JvbGxMZWZ0LFxuICAgICAgICBzY3JvbGxQb3NZID0gZWwuc2Nyb2xsVG9wO1xuXG4gICAgaWYgKGVsID09PSB3aW5TY3JvbGxlcikge1xuICAgICAgY2FuU2Nyb2xsWCA9IHdpZHRoIDwgc2Nyb2xsV2lkdGggJiYgKGVsQ1NTLm92ZXJmbG93WCA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WCA9PT0gJ3Njcm9sbCcgfHwgZWxDU1Mub3ZlcmZsb3dYID09PSAndmlzaWJsZScpO1xuICAgICAgY2FuU2Nyb2xsWSA9IGhlaWdodCA8IHNjcm9sbEhlaWdodCAmJiAoZWxDU1Mub3ZlcmZsb3dZID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dZID09PSAnc2Nyb2xsJyB8fCBlbENTUy5vdmVyZmxvd1kgPT09ICd2aXNpYmxlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhblNjcm9sbFggPSB3aWR0aCA8IHNjcm9sbFdpZHRoICYmIChlbENTUy5vdmVyZmxvd1ggPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1ggPT09ICdzY3JvbGwnKTtcbiAgICAgIGNhblNjcm9sbFkgPSBoZWlnaHQgPCBzY3JvbGxIZWlnaHQgJiYgKGVsQ1NTLm92ZXJmbG93WSA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WSA9PT0gJ3Njcm9sbCcpO1xuICAgIH1cblxuICAgIHZhciB2eCA9IGNhblNjcm9sbFggJiYgKE1hdGguYWJzKHJpZ2h0IC0geCkgPD0gc2VucyAmJiBzY3JvbGxQb3NYICsgd2lkdGggPCBzY3JvbGxXaWR0aCkgLSAoTWF0aC5hYnMobGVmdCAtIHgpIDw9IHNlbnMgJiYgISFzY3JvbGxQb3NYKTtcbiAgICB2YXIgdnkgPSBjYW5TY3JvbGxZICYmIChNYXRoLmFicyhib3R0b20gLSB5KSA8PSBzZW5zICYmIHNjcm9sbFBvc1kgKyBoZWlnaHQgPCBzY3JvbGxIZWlnaHQpIC0gKE1hdGguYWJzKHRvcCAtIHkpIDw9IHNlbnMgJiYgISFzY3JvbGxQb3NZKTtcblxuICAgIGlmICghYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbGF5ZXJzT3V0OyBpKyspIHtcbiAgICAgICAgaWYgKCFhdXRvU2Nyb2xsc1tpXSkge1xuICAgICAgICAgIGF1dG9TY3JvbGxzW2ldID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eCAhPSB2eCB8fCBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ5ICE9IHZ5IHx8IGF1dG9TY3JvbGxzW2xheWVyc091dF0uZWwgIT09IGVsKSB7XG4gICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLmVsID0gZWw7XG4gICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ4ID0gdng7XG4gICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ5ID0gdnk7XG4gICAgICBjbGVhckludGVydmFsKGF1dG9TY3JvbGxzW2xheWVyc091dF0ucGlkKTtcblxuICAgICAgaWYgKHZ4ICE9IDAgfHwgdnkgIT0gMCkge1xuICAgICAgICBzY3JvbGxUaGlzSW5zdGFuY2UgPSB0cnVlO1xuICAgICAgICAvKiBqc2hpbnQgbG9vcGZ1bmM6dHJ1ZSAqL1xuXG4gICAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0ucGlkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIGVtdWxhdGUgZHJhZyBvdmVyIGR1cmluZyBhdXRvc2Nyb2xsIChmYWxsYmFjayksIGVtdWxhdGluZyBuYXRpdmUgRG5EIGJlaGF2aW91clxuICAgICAgICAgIGlmIChpc0ZhbGxiYWNrICYmIHRoaXMubGF5ZXIgPT09IDApIHtcbiAgICAgICAgICAgIFNvcnRhYmxlLmFjdGl2ZS5fb25Ub3VjaE1vdmUodG91Y2hFdnQkMSk7IC8vIFRvIG1vdmUgZ2hvc3QgaWYgaXQgaXMgcG9zaXRpb25lZCBhYnNvbHV0ZWx5XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgc2Nyb2xsT2Zmc2V0WSA9IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ5ID8gYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0udnkgKiBzcGVlZCA6IDA7XG4gICAgICAgICAgdmFyIHNjcm9sbE9mZnNldFggPSBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eCA/IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ4ICogc3BlZWQgOiAwO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBzY3JvbGxDdXN0b21GbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHNjcm9sbEN1c3RvbUZuLmNhbGwoU29ydGFibGUuZHJhZ2dlZC5wYXJlbnROb2RlW2V4cGFuZG9dLCBzY3JvbGxPZmZzZXRYLCBzY3JvbGxPZmZzZXRZLCBldnQsIHRvdWNoRXZ0JDEsIGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLmVsKSAhPT0gJ2NvbnRpbnVlJykge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2Nyb2xsQnkoYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0uZWwsIHNjcm9sbE9mZnNldFgsIHNjcm9sbE9mZnNldFkpO1xuICAgICAgICB9LmJpbmQoe1xuICAgICAgICAgIGxheWVyOiBsYXllcnNPdXRcbiAgICAgICAgfSksIDI0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsYXllcnNPdXQrKztcbiAgfSB3aGlsZSAob3B0aW9ucy5idWJibGVTY3JvbGwgJiYgY3VycmVudFBhcmVudCAhPT0gd2luU2Nyb2xsZXIgJiYgKGN1cnJlbnRQYXJlbnQgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChjdXJyZW50UGFyZW50LCBmYWxzZSkpKTtcblxuICBzY3JvbGxpbmcgPSBzY3JvbGxUaGlzSW5zdGFuY2U7IC8vIGluIGNhc2UgYW5vdGhlciBmdW5jdGlvbiBjYXRjaGVzIHNjcm9sbGluZyBhcyBmYWxzZSBpbiBiZXR3ZWVuIHdoZW4gaXQgaXMgbm90XG59LCAzMCk7XG5cbnZhciBkcm9wID0gZnVuY3Rpb24gZHJvcChfcmVmKSB7XG4gIHZhciBvcmlnaW5hbEV2ZW50ID0gX3JlZi5vcmlnaW5hbEV2ZW50LFxuICAgICAgcHV0U29ydGFibGUgPSBfcmVmLnB1dFNvcnRhYmxlLFxuICAgICAgZHJhZ0VsID0gX3JlZi5kcmFnRWwsXG4gICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYuYWN0aXZlU29ydGFibGUsXG4gICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQgPSBfcmVmLmRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICAgIGhpZGVHaG9zdEZvclRhcmdldCA9IF9yZWYuaGlkZUdob3N0Rm9yVGFyZ2V0LFxuICAgICAgdW5oaWRlR2hvc3RGb3JUYXJnZXQgPSBfcmVmLnVuaGlkZUdob3N0Rm9yVGFyZ2V0O1xuICBpZiAoIW9yaWdpbmFsRXZlbnQpIHJldHVybjtcbiAgdmFyIHRvU29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCBhY3RpdmVTb3J0YWJsZTtcbiAgaGlkZUdob3N0Rm9yVGFyZ2V0KCk7XG4gIHZhciB0b3VjaCA9IG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPyBvcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogb3JpZ2luYWxFdmVudDtcbiAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQodG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSk7XG4gIHVuaGlkZUdob3N0Rm9yVGFyZ2V0KCk7XG5cbiAgaWYgKHRvU29ydGFibGUgJiYgIXRvU29ydGFibGUuZWwuY29udGFpbnModGFyZ2V0KSkge1xuICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCgnc3BpbGwnKTtcbiAgICB0aGlzLm9uU3BpbGwoe1xuICAgICAgZHJhZ0VsOiBkcmFnRWwsXG4gICAgICBwdXRTb3J0YWJsZTogcHV0U29ydGFibGVcbiAgICB9KTtcbiAgfVxufTtcblxuZnVuY3Rpb24gUmV2ZXJ0KCkge31cblxuUmV2ZXJ0LnByb3RvdHlwZSA9IHtcbiAgc3RhcnRJbmRleDogbnVsbCxcbiAgZHJhZ1N0YXJ0OiBmdW5jdGlvbiBkcmFnU3RhcnQoX3JlZjIpIHtcbiAgICB2YXIgb2xkRHJhZ2dhYmxlSW5kZXggPSBfcmVmMi5vbGREcmFnZ2FibGVJbmRleDtcbiAgICB0aGlzLnN0YXJ0SW5kZXggPSBvbGREcmFnZ2FibGVJbmRleDtcbiAgfSxcbiAgb25TcGlsbDogZnVuY3Rpb24gb25TcGlsbChfcmVmMykge1xuICAgIHZhciBkcmFnRWwgPSBfcmVmMy5kcmFnRWwsXG4gICAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjMucHV0U29ydGFibGU7XG4gICAgdGhpcy5zb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcblxuICAgIGlmIChwdXRTb3J0YWJsZSkge1xuICAgICAgcHV0U29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgfVxuXG4gICAgdmFyIG5leHRTaWJsaW5nID0gZ2V0Q2hpbGQodGhpcy5zb3J0YWJsZS5lbCwgdGhpcy5zdGFydEluZGV4LCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgaWYgKG5leHRTaWJsaW5nKSB7XG4gICAgICB0aGlzLnNvcnRhYmxlLmVsLmluc2VydEJlZm9yZShkcmFnRWwsIG5leHRTaWJsaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zb3J0YWJsZS5lbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgIH1cblxuICAgIHRoaXMuc29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuXG4gICAgaWYgKHB1dFNvcnRhYmxlKSB7XG4gICAgICBwdXRTb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gICAgfVxuICB9LFxuICBkcm9wOiBkcm9wXG59O1xuXG5fZXh0ZW5kcyhSZXZlcnQsIHtcbiAgcGx1Z2luTmFtZTogJ3JldmVydE9uU3BpbGwnXG59KTtcblxuZnVuY3Rpb24gUmVtb3ZlKCkge31cblxuUmVtb3ZlLnByb3RvdHlwZSA9IHtcbiAgb25TcGlsbDogZnVuY3Rpb24gb25TcGlsbChfcmVmNCkge1xuICAgIHZhciBkcmFnRWwgPSBfcmVmNC5kcmFnRWwsXG4gICAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjQucHV0U29ydGFibGU7XG4gICAgdmFyIHBhcmVudFNvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgdGhpcy5zb3J0YWJsZTtcbiAgICBwYXJlbnRTb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICBkcmFnRWwucGFyZW50Tm9kZSAmJiBkcmFnRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkcmFnRWwpO1xuICAgIHBhcmVudFNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgfSxcbiAgZHJvcDogZHJvcFxufTtcblxuX2V4dGVuZHMoUmVtb3ZlLCB7XG4gIHBsdWdpbk5hbWU6ICdyZW1vdmVPblNwaWxsJ1xufSk7XG5cbnZhciBsYXN0U3dhcEVsO1xuXG5mdW5jdGlvbiBTd2FwUGx1Z2luKCkge1xuICBmdW5jdGlvbiBTd2FwKCkge1xuICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICBzd2FwQ2xhc3M6ICdzb3J0YWJsZS1zd2FwLWhpZ2hsaWdodCdcbiAgICB9O1xuICB9XG5cbiAgU3dhcC5wcm90b3R5cGUgPSB7XG4gICAgZHJhZ1N0YXJ0OiBmdW5jdGlvbiBkcmFnU3RhcnQoX3JlZikge1xuICAgICAgdmFyIGRyYWdFbCA9IF9yZWYuZHJhZ0VsO1xuICAgICAgbGFzdFN3YXBFbCA9IGRyYWdFbDtcbiAgICB9LFxuICAgIGRyYWdPdmVyVmFsaWQ6IGZ1bmN0aW9uIGRyYWdPdmVyVmFsaWQoX3JlZjIpIHtcbiAgICAgIHZhciBjb21wbGV0ZWQgPSBfcmVmMi5jb21wbGV0ZWQsXG4gICAgICAgICAgdGFyZ2V0ID0gX3JlZjIudGFyZ2V0LFxuICAgICAgICAgIG9uTW92ZSA9IF9yZWYyLm9uTW92ZSxcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYyLmFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICAgIGNoYW5nZWQgPSBfcmVmMi5jaGFuZ2VkLFxuICAgICAgICAgIGNhbmNlbCA9IF9yZWYyLmNhbmNlbDtcbiAgICAgIGlmICghYWN0aXZlU29ydGFibGUub3B0aW9ucy5zd2FwKSByZXR1cm47XG4gICAgICB2YXIgZWwgPSB0aGlzLnNvcnRhYmxlLmVsLFxuICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBlbCkge1xuICAgICAgICB2YXIgcHJldlN3YXBFbCA9IGxhc3RTd2FwRWw7XG5cbiAgICAgICAgaWYgKG9uTW92ZSh0YXJnZXQpICE9PSBmYWxzZSkge1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKHRhcmdldCwgb3B0aW9ucy5zd2FwQ2xhc3MsIHRydWUpO1xuICAgICAgICAgIGxhc3RTd2FwRWwgPSB0YXJnZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGFzdFN3YXBFbCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldlN3YXBFbCAmJiBwcmV2U3dhcEVsICE9PSBsYXN0U3dhcEVsKSB7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3MocHJldlN3YXBFbCwgb3B0aW9ucy5zd2FwQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjaGFuZ2VkKCk7XG4gICAgICBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICBjYW5jZWwoKTtcbiAgICB9LFxuICAgIGRyb3A6IGZ1bmN0aW9uIGRyb3AoX3JlZjMpIHtcbiAgICAgIHZhciBhY3RpdmVTb3J0YWJsZSA9IF9yZWYzLmFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjMucHV0U29ydGFibGUsXG4gICAgICAgICAgZHJhZ0VsID0gX3JlZjMuZHJhZ0VsO1xuICAgICAgdmFyIHRvU29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCB0aGlzLnNvcnRhYmxlO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBsYXN0U3dhcEVsICYmIHRvZ2dsZUNsYXNzKGxhc3RTd2FwRWwsIG9wdGlvbnMuc3dhcENsYXNzLCBmYWxzZSk7XG5cbiAgICAgIGlmIChsYXN0U3dhcEVsICYmIChvcHRpb25zLnN3YXAgfHwgcHV0U29ydGFibGUgJiYgcHV0U29ydGFibGUub3B0aW9ucy5zd2FwKSkge1xuICAgICAgICBpZiAoZHJhZ0VsICE9PSBsYXN0U3dhcEVsKSB7XG4gICAgICAgICAgdG9Tb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgICBpZiAodG9Tb3J0YWJsZSAhPT0gYWN0aXZlU29ydGFibGUpIGFjdGl2ZVNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgICAgIHN3YXBOb2RlcyhkcmFnRWwsIGxhc3RTd2FwRWwpO1xuICAgICAgICAgIHRvU29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgICAgICAgIGlmICh0b1NvcnRhYmxlICE9PSBhY3RpdmVTb3J0YWJsZSkgYWN0aXZlU29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBudWxsaW5nOiBmdW5jdGlvbiBudWxsaW5nKCkge1xuICAgICAgbGFzdFN3YXBFbCA9IG51bGw7XG4gICAgfVxuICB9O1xuICByZXR1cm4gX2V4dGVuZHMoU3dhcCwge1xuICAgIHBsdWdpbk5hbWU6ICdzd2FwJyxcbiAgICBldmVudFByb3BlcnRpZXM6IGZ1bmN0aW9uIGV2ZW50UHJvcGVydGllcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN3YXBJdGVtOiBsYXN0U3dhcEVsXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHN3YXBOb2RlcyhuMSwgbjIpIHtcbiAgdmFyIHAxID0gbjEucGFyZW50Tm9kZSxcbiAgICAgIHAyID0gbjIucGFyZW50Tm9kZSxcbiAgICAgIGkxLFxuICAgICAgaTI7XG4gIGlmICghcDEgfHwgIXAyIHx8IHAxLmlzRXF1YWxOb2RlKG4yKSB8fCBwMi5pc0VxdWFsTm9kZShuMSkpIHJldHVybjtcbiAgaTEgPSBpbmRleChuMSk7XG4gIGkyID0gaW5kZXgobjIpO1xuXG4gIGlmIChwMS5pc0VxdWFsTm9kZShwMikgJiYgaTEgPCBpMikge1xuICAgIGkyKys7XG4gIH1cblxuICBwMS5pbnNlcnRCZWZvcmUobjIsIHAxLmNoaWxkcmVuW2kxXSk7XG4gIHAyLmluc2VydEJlZm9yZShuMSwgcDIuY2hpbGRyZW5baTJdKTtcbn1cblxudmFyIG11bHRpRHJhZ0VsZW1lbnRzID0gW10sXG4gICAgbXVsdGlEcmFnQ2xvbmVzID0gW10sXG4gICAgbGFzdE11bHRpRHJhZ1NlbGVjdCxcbiAgICAvLyBmb3Igc2VsZWN0aW9uIHdpdGggbW9kaWZpZXIga2V5IGRvd24gKFNISUZUKVxubXVsdGlEcmFnU29ydGFibGUsXG4gICAgaW5pdGlhbEZvbGRpbmcgPSBmYWxzZSxcbiAgICAvLyBJbml0aWFsIG11bHRpLWRyYWcgZm9sZCB3aGVuIGRyYWcgc3RhcnRlZFxuZm9sZGluZyA9IGZhbHNlLFxuICAgIC8vIEZvbGRpbmcgYW55IG90aGVyIHRpbWVcbmRyYWdTdGFydGVkID0gZmFsc2UsXG4gICAgZHJhZ0VsJDEsXG4gICAgY2xvbmVzRnJvbVJlY3QsXG4gICAgY2xvbmVzSGlkZGVuO1xuXG5mdW5jdGlvbiBNdWx0aURyYWdQbHVnaW4oKSB7XG4gIGZ1bmN0aW9uIE11bHRpRHJhZyhzb3J0YWJsZSkge1xuICAgIC8vIEJpbmQgYWxsIHByaXZhdGUgbWV0aG9kc1xuICAgIGZvciAodmFyIGZuIGluIHRoaXMpIHtcbiAgICAgIGlmIChmbi5jaGFyQXQoMCkgPT09ICdfJyAmJiB0eXBlb2YgdGhpc1tmbl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpc1tmbl0gPSB0aGlzW2ZuXS5iaW5kKHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzb3J0YWJsZS5vcHRpb25zLnN1cHBvcnRQb2ludGVyKSB7XG4gICAgICBvbihkb2N1bWVudCwgJ3BvaW50ZXJ1cCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb24oZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgb24oZG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICB9XG5cbiAgICBvbihkb2N1bWVudCwgJ2tleWRvd24nLCB0aGlzLl9jaGVja0tleURvd24pO1xuICAgIG9uKGRvY3VtZW50LCAna2V5dXAnLCB0aGlzLl9jaGVja0tleVVwKTtcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgc2VsZWN0ZWRDbGFzczogJ3NvcnRhYmxlLXNlbGVjdGVkJyxcbiAgICAgIG11bHRpRHJhZ0tleTogbnVsbCxcbiAgICAgIHNldERhdGE6IGZ1bmN0aW9uIHNldERhdGEoZGF0YVRyYW5zZmVyLCBkcmFnRWwpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAnJztcblxuICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoICYmIG11bHRpRHJhZ1NvcnRhYmxlID09PSBzb3J0YWJsZSkge1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQsIGkpIHtcbiAgICAgICAgICAgIGRhdGEgKz0gKCFpID8gJycgOiAnLCAnKSArIG11bHRpRHJhZ0VsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YSA9IGRyYWdFbC50ZXh0Q29udGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFUcmFuc2Zlci5zZXREYXRhKCdUZXh0JywgZGF0YSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIE11bHRpRHJhZy5wcm90b3R5cGUgPSB7XG4gICAgbXVsdGlEcmFnS2V5RG93bjogZmFsc2UsXG4gICAgaXNNdWx0aURyYWc6IGZhbHNlLFxuICAgIGRlbGF5U3RhcnRHbG9iYWw6IGZ1bmN0aW9uIGRlbGF5U3RhcnRHbG9iYWwoX3JlZikge1xuICAgICAgdmFyIGRyYWdnZWQgPSBfcmVmLmRyYWdFbDtcbiAgICAgIGRyYWdFbCQxID0gZHJhZ2dlZDtcbiAgICB9LFxuICAgIGRlbGF5RW5kZWQ6IGZ1bmN0aW9uIGRlbGF5RW5kZWQoKSB7XG4gICAgICB0aGlzLmlzTXVsdGlEcmFnID0gfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpO1xuICAgIH0sXG4gICAgc2V0dXBDbG9uZTogZnVuY3Rpb24gc2V0dXBDbG9uZShfcmVmMikge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjIuc29ydGFibGUsXG4gICAgICAgICAgY2FuY2VsID0gX3JlZjIuY2FuY2VsO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzLnB1c2goY2xvbmUobXVsdGlEcmFnRWxlbWVudHNbaV0pKTtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzW2ldLnNvcnRhYmxlSW5kZXggPSBtdWx0aURyYWdFbGVtZW50c1tpXS5zb3J0YWJsZUluZGV4O1xuICAgICAgICBtdWx0aURyYWdDbG9uZXNbaV0uZHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lc1tpXS5zdHlsZVsnd2lsbC1jaGFuZ2UnXSA9ICcnO1xuICAgICAgICB0b2dnbGVDbGFzcyhtdWx0aURyYWdDbG9uZXNbaV0sIHRoaXMub3B0aW9ucy5zZWxlY3RlZENsYXNzLCBmYWxzZSk7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzW2ldID09PSBkcmFnRWwkMSAmJiB0b2dnbGVDbGFzcyhtdWx0aURyYWdDbG9uZXNbaV0sIHRoaXMub3B0aW9ucy5jaG9zZW5DbGFzcywgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICBzb3J0YWJsZS5faGlkZUNsb25lKCk7XG5cbiAgICAgIGNhbmNlbCgpO1xuICAgIH0sXG4gICAgY2xvbmU6IGZ1bmN0aW9uIGNsb25lKF9yZWYzKSB7XG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmMy5zb3J0YWJsZSxcbiAgICAgICAgICByb290RWwgPSBfcmVmMy5yb290RWwsXG4gICAgICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50ID0gX3JlZjMuZGlzcGF0Y2hTb3J0YWJsZUV2ZW50LFxuICAgICAgICAgIGNhbmNlbCA9IF9yZWYzLmNhbmNlbDtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSkge1xuICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoICYmIG11bHRpRHJhZ1NvcnRhYmxlID09PSBzb3J0YWJsZSkge1xuICAgICAgICAgIGluc2VydE11bHRpRHJhZ0Nsb25lcyh0cnVlLCByb290RWwpO1xuICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCgnY2xvbmUnKTtcbiAgICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgc2hvd0Nsb25lOiBmdW5jdGlvbiBzaG93Q2xvbmUoX3JlZjQpIHtcbiAgICAgIHZhciBjbG9uZU5vd1Nob3duID0gX3JlZjQuY2xvbmVOb3dTaG93bixcbiAgICAgICAgICByb290RWwgPSBfcmVmNC5yb290RWwsXG4gICAgICAgICAgY2FuY2VsID0gX3JlZjQuY2FuY2VsO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG4gICAgICBpbnNlcnRNdWx0aURyYWdDbG9uZXMoZmFsc2UsIHJvb3RFbCk7XG4gICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgY3NzKGNsb25lLCAnZGlzcGxheScsICcnKTtcbiAgICAgIH0pO1xuICAgICAgY2xvbmVOb3dTaG93bigpO1xuICAgICAgY2xvbmVzSGlkZGVuID0gZmFsc2U7XG4gICAgICBjYW5jZWwoKTtcbiAgICB9LFxuICAgIGhpZGVDbG9uZTogZnVuY3Rpb24gaGlkZUNsb25lKF9yZWY1KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmNS5zb3J0YWJsZSxcbiAgICAgICAgICBjbG9uZU5vd0hpZGRlbiA9IF9yZWY1LmNsb25lTm93SGlkZGVuLFxuICAgICAgICAgIGNhbmNlbCA9IF9yZWY1LmNhbmNlbDtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuICAgICAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgIGNzcyhjbG9uZSwgJ2Rpc3BsYXknLCAnbm9uZScpO1xuXG4gICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlICYmIGNsb25lLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBjbG9uZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbG9uZU5vd0hpZGRlbigpO1xuICAgICAgY2xvbmVzSGlkZGVuID0gdHJ1ZTtcbiAgICAgIGNhbmNlbCgpO1xuICAgIH0sXG4gICAgZHJhZ1N0YXJ0R2xvYmFsOiBmdW5jdGlvbiBkcmFnU3RhcnRHbG9iYWwoX3JlZjYpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWY2LnNvcnRhYmxlO1xuXG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcgJiYgbXVsdGlEcmFnU29ydGFibGUpIHtcbiAgICAgICAgbXVsdGlEcmFnU29ydGFibGUubXVsdGlEcmFnLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuICAgICAgfVxuXG4gICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnQuc29ydGFibGVJbmRleCA9IGluZGV4KG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgfSk7IC8vIFNvcnQgbXVsdGktZHJhZyBlbGVtZW50c1xuXG4gICAgICBtdWx0aURyYWdFbGVtZW50cyA9IG11bHRpRHJhZ0VsZW1lbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEuc29ydGFibGVJbmRleCAtIGIuc29ydGFibGVJbmRleDtcbiAgICAgIH0pO1xuICAgICAgZHJhZ1N0YXJ0ZWQgPSB0cnVlO1xuICAgIH0sXG4gICAgZHJhZ1N0YXJ0ZWQ6IGZ1bmN0aW9uIGRyYWdTdGFydGVkKF9yZWY3KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjcuc29ydGFibGU7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zb3J0KSB7XG4gICAgICAgIC8vIENhcHR1cmUgcmVjdHMsXG4gICAgICAgIC8vIGhpZGUgbXVsdGkgZHJhZyBlbGVtZW50cyAoYnkgcG9zaXRpb25pbmcgdGhlbSBhYnNvbHV0ZSksXG4gICAgICAgIC8vIHNldCBtdWx0aSBkcmFnIGVsZW1lbnRzIHJlY3RzIHRvIGRyYWdSZWN0LFxuICAgICAgICAvLyBzaG93IG11bHRpIGRyYWcgZWxlbWVudHMsXG4gICAgICAgIC8vIGFuaW1hdGUgdG8gcmVjdHMsXG4gICAgICAgIC8vIHVuc2V0IHJlY3RzICYgcmVtb3ZlIGZyb20gRE9NXG4gICAgICAgIHNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgICAgICAgICBjc3MobXVsdGlEcmFnRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIGRyYWdSZWN0ID0gZ2V0UmVjdChkcmFnRWwkMSwgZmFsc2UsIHRydWUsIHRydWUpO1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgICAgICAgICAgc2V0UmVjdChtdWx0aURyYWdFbGVtZW50LCBkcmFnUmVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9sZGluZyA9IHRydWU7XG4gICAgICAgICAgaW5pdGlhbEZvbGRpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNvcnRhYmxlLmFuaW1hdGVBbGwoZnVuY3Rpb24gKCkge1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIGluaXRpYWxGb2xkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKF90aGlzMi5vcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHVuc2V0UmVjdChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSAvLyBSZW1vdmUgYWxsIGF1eGlsaWFyeSBtdWx0aWRyYWcgaXRlbXMgZnJvbSBlbCwgaWYgc29ydGluZyBlbmFibGVkXG5cblxuICAgICAgICBpZiAoX3RoaXMyLm9wdGlvbnMuc29ydCkge1xuICAgICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZHJhZ092ZXI6IGZ1bmN0aW9uIGRyYWdPdmVyKF9yZWY4KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gX3JlZjgudGFyZ2V0LFxuICAgICAgICAgIGNvbXBsZXRlZCA9IF9yZWY4LmNvbXBsZXRlZCxcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmOC5jYW5jZWw7XG5cbiAgICAgIGlmIChmb2xkaW5nICYmIH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKHRhcmdldCkpIHtcbiAgICAgICAgY29tcGxldGVkKGZhbHNlKTtcbiAgICAgICAgY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICByZXZlcnQ6IGZ1bmN0aW9uIHJldmVydChfcmVmOSkge1xuICAgICAgdmFyIGZyb21Tb3J0YWJsZSA9IF9yZWY5LmZyb21Tb3J0YWJsZSxcbiAgICAgICAgICByb290RWwgPSBfcmVmOS5yb290RWwsXG4gICAgICAgICAgc29ydGFibGUgPSBfcmVmOS5zb3J0YWJsZSxcbiAgICAgICAgICBkcmFnUmVjdCA9IF9yZWY5LmRyYWdSZWN0O1xuXG4gICAgICBpZiAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBTZXR1cCB1bmZvbGQgYW5pbWF0aW9uXG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICBzb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICB0YXJnZXQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgICByZWN0OiBmb2xkaW5nID8gZ2V0UmVjdChtdWx0aURyYWdFbGVtZW50KSA6IGRyYWdSZWN0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdW5zZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQuZnJvbVJlY3QgPSBkcmFnUmVjdDtcbiAgICAgICAgICBmcm9tU29ydGFibGUucmVtb3ZlQW5pbWF0aW9uU3RhdGUobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIGluc2VydE11bHRpRHJhZ0VsZW1lbnRzKCF0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUsIHJvb3RFbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckNvbXBsZXRlZDogZnVuY3Rpb24gZHJhZ092ZXJDb21wbGV0ZWQoX3JlZjEwKSB7XG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmMTAuc29ydGFibGUsXG4gICAgICAgICAgaXNPd25lciA9IF9yZWYxMC5pc093bmVyLFxuICAgICAgICAgIGluc2VydGlvbiA9IF9yZWYxMC5pbnNlcnRpb24sXG4gICAgICAgICAgYWN0aXZlU29ydGFibGUgPSBfcmVmMTAuYWN0aXZlU29ydGFibGUsXG4gICAgICAgICAgcGFyZW50RWwgPSBfcmVmMTAucGFyZW50RWwsXG4gICAgICAgICAgcHV0U29ydGFibGUgPSBfcmVmMTAucHV0U29ydGFibGU7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgaWYgKGluc2VydGlvbikge1xuICAgICAgICAvLyBDbG9uZXMgbXVzdCBiZSBoaWRkZW4gYmVmb3JlIGZvbGRpbmcgYW5pbWF0aW9uIHRvIGNhcHR1cmUgZHJhZ1JlY3RBYnNvbHV0ZSBwcm9wZXJseVxuICAgICAgICBpZiAoaXNPd25lcikge1xuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9oaWRlQ2xvbmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluaXRpYWxGb2xkaW5nID0gZmFsc2U7IC8vIElmIGxlYXZpbmcgc29ydDpmYWxzZSByb290LCBvciBhbHJlYWR5IGZvbGRpbmcgLSBGb2xkIHRvIG5ldyBsb2NhdGlvblxuXG4gICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGlvbiAmJiBtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggPiAxICYmIChmb2xkaW5nIHx8ICFpc093bmVyICYmICFhY3RpdmVTb3J0YWJsZS5vcHRpb25zLnNvcnQgJiYgIXB1dFNvcnRhYmxlKSkge1xuICAgICAgICAgIC8vIEZvbGQ6IFNldCBhbGwgbXVsdGkgZHJhZyBlbGVtZW50cydzIHJlY3RzIHRvIGRyYWdFbCdzIHJlY3Qgd2hlbiBtdWx0aS1kcmFnIGVsZW1lbnRzIGFyZSBpbnZpc2libGVcbiAgICAgICAgICB2YXIgZHJhZ1JlY3RBYnNvbHV0ZSA9IGdldFJlY3QoZHJhZ0VsJDEsIGZhbHNlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICAgICAgICAgIHNldFJlY3QobXVsdGlEcmFnRWxlbWVudCwgZHJhZ1JlY3RBYnNvbHV0ZSk7IC8vIE1vdmUgZWxlbWVudChzKSB0byBlbmQgb2YgcGFyZW50RWwgc28gdGhhdCBpdCBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCBtdWx0aS1kcmFnIGNsb25lcyBpbnNlcnRpb24gaWYgdGhleSBhcmUgaW5zZXJ0ZWRcbiAgICAgICAgICAgIC8vIHdoaWxlIGZvbGRpbmcsIGFuZCBzbyB0aGF0IHdlIGNhbiBjYXB0dXJlIHRoZW0gYWdhaW4gYmVjYXVzZSBvbGQgc29ydGFibGUgd2lsbCBubyBsb25nZXIgYmUgZnJvbVNvcnRhYmxlXG5cbiAgICAgICAgICAgIHBhcmVudEVsLmFwcGVuZENoaWxkKG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvbGRpbmcgPSB0cnVlO1xuICAgICAgICB9IC8vIENsb25lcyBtdXN0IGJlIHNob3duIChhbmQgY2hlY2sgdG8gcmVtb3ZlIG11bHRpIGRyYWdzKSBhZnRlciBmb2xkaW5nIHdoZW4gaW50ZXJmZXJpbmcgbXVsdGlEcmFnRWxlbWVudHMgYXJlIG1vdmVkIG91dFxuXG5cbiAgICAgICAgaWYgKCFpc093bmVyKSB7XG4gICAgICAgICAgLy8gT25seSByZW1vdmUgaWYgbm90IGZvbGRpbmcgKGZvbGRpbmcgd2lsbCByZW1vdmUgdGhlbSBhbnl3YXlzKVxuICAgICAgICAgIGlmICghZm9sZGluZykge1xuICAgICAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIGNsb25lc0hpZGRlbkJlZm9yZSA9IGNsb25lc0hpZGRlbjtcblxuICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShzb3J0YWJsZSk7IC8vIFVuZm9sZCBhbmltYXRpb24gZm9yIGNsb25lcyBpZiBzaG93aW5nIGZyb20gaGlkZGVuXG5cblxuICAgICAgICAgICAgaWYgKGFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuYW5pbWF0aW9uICYmICFjbG9uZXNIaWRkZW4gJiYgY2xvbmVzSGlkZGVuQmVmb3JlKSB7XG4gICAgICAgICAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLmFkZEFuaW1hdGlvblN0YXRlKHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldDogY2xvbmUsXG4gICAgICAgICAgICAgICAgICByZWN0OiBjbG9uZXNGcm9tUmVjdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNsb25lLmZyb21SZWN0ID0gY2xvbmVzRnJvbVJlY3Q7XG4gICAgICAgICAgICAgICAgY2xvbmUudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9zaG93Q2xvbmUoc29ydGFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ092ZXJBbmltYXRpb25DYXB0dXJlOiBmdW5jdGlvbiBkcmFnT3ZlckFuaW1hdGlvbkNhcHR1cmUoX3JlZjExKSB7XG4gICAgICB2YXIgZHJhZ1JlY3QgPSBfcmVmMTEuZHJhZ1JlY3QsXG4gICAgICAgICAgaXNPd25lciA9IF9yZWYxMS5pc093bmVyLFxuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZjExLmFjdGl2ZVNvcnRhYmxlO1xuICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuYW5pbWF0aW9uICYmICFpc093bmVyICYmIGFjdGl2ZVNvcnRhYmxlLm11bHRpRHJhZy5pc011bHRpRHJhZykge1xuICAgICAgICBjbG9uZXNGcm9tUmVjdCA9IF9leHRlbmRzKHt9LCBkcmFnUmVjdCk7XG4gICAgICAgIHZhciBkcmFnTWF0cml4ID0gbWF0cml4KGRyYWdFbCQxLCB0cnVlKTtcbiAgICAgICAgY2xvbmVzRnJvbVJlY3QudG9wIC09IGRyYWdNYXRyaXguZjtcbiAgICAgICAgY2xvbmVzRnJvbVJlY3QubGVmdCAtPSBkcmFnTWF0cml4LmU7XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckFuaW1hdGlvbkNvbXBsZXRlOiBmdW5jdGlvbiBkcmFnT3ZlckFuaW1hdGlvbkNvbXBsZXRlKCkge1xuICAgICAgaWYgKGZvbGRpbmcpIHtcbiAgICAgICAgZm9sZGluZyA9IGZhbHNlO1xuICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZHJvcDogZnVuY3Rpb24gZHJvcChfcmVmMTIpIHtcbiAgICAgIHZhciBldnQgPSBfcmVmMTIub3JpZ2luYWxFdmVudCxcbiAgICAgICAgICByb290RWwgPSBfcmVmMTIucm9vdEVsLFxuICAgICAgICAgIHBhcmVudEVsID0gX3JlZjEyLnBhcmVudEVsLFxuICAgICAgICAgIHNvcnRhYmxlID0gX3JlZjEyLnNvcnRhYmxlLFxuICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCA9IF9yZWYxMi5kaXNwYXRjaFNvcnRhYmxlRXZlbnQsXG4gICAgICAgICAgb2xkSW5kZXggPSBfcmVmMTIub2xkSW5kZXgsXG4gICAgICAgICAgcHV0U29ydGFibGUgPSBfcmVmMTIucHV0U29ydGFibGU7XG4gICAgICB2YXIgdG9Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IHRoaXMuc29ydGFibGU7XG4gICAgICBpZiAoIWV2dCkgcmV0dXJuO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnRFbC5jaGlsZHJlbjsgLy8gTXVsdGktZHJhZyBzZWxlY3Rpb25cblxuICAgICAgaWYgKCFkcmFnU3RhcnRlZCkge1xuICAgICAgICBpZiAob3B0aW9ucy5tdWx0aURyYWdLZXkgJiYgIXRoaXMubXVsdGlEcmFnS2V5RG93bikge1xuICAgICAgICAgIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwkMSwgb3B0aW9ucy5zZWxlY3RlZENsYXNzLCAhfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpKTtcblxuICAgICAgICBpZiAoIX5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKSkge1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnB1c2goZHJhZ0VsJDEpO1xuICAgICAgICAgIGRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlLFxuICAgICAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgICAgICBuYW1lOiAnc2VsZWN0JyxcbiAgICAgICAgICAgIHRhcmdldEVsOiBkcmFnRWwkMSxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZ0OiBldnRcbiAgICAgICAgICB9KTsgLy8gTW9kaWZpZXIgYWN0aXZhdGVkLCBzZWxlY3QgZnJvbSBsYXN0IHRvIGRyYWdFbFxuXG4gICAgICAgICAgaWYgKGV2dC5zaGlmdEtleSAmJiBsYXN0TXVsdGlEcmFnU2VsZWN0ICYmIHNvcnRhYmxlLmVsLmNvbnRhaW5zKGxhc3RNdWx0aURyYWdTZWxlY3QpKSB7XG4gICAgICAgICAgICB2YXIgbGFzdEluZGV4ID0gaW5kZXgobGFzdE11bHRpRHJhZ1NlbGVjdCksXG4gICAgICAgICAgICAgICAgY3VycmVudEluZGV4ID0gaW5kZXgoZHJhZ0VsJDEpO1xuXG4gICAgICAgICAgICBpZiAofmxhc3RJbmRleCAmJiB+Y3VycmVudEluZGV4ICYmIGxhc3RJbmRleCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgICAgICAgIC8vIE11c3QgaW5jbHVkZSBsYXN0TXVsdGlEcmFnU2VsZWN0IChzZWxlY3QgaXQpLCBpbiBjYXNlIG1vZGlmaWVkIHNlbGVjdGlvbiBmcm9tIG5vIHNlbGVjdGlvblxuICAgICAgICAgICAgICAvLyAoYnV0IHByZXZpb3VzIHNlbGVjdGlvbiBleGlzdGVkKVxuICAgICAgICAgICAgICB2YXIgbiwgaTtcblxuICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gbGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaSA9IGxhc3RJbmRleDtcbiAgICAgICAgICAgICAgICBuID0gY3VycmVudEluZGV4O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGkgPSBjdXJyZW50SW5kZXg7XG4gICAgICAgICAgICAgICAgbiA9IGxhc3RJbmRleCArIDE7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihjaGlsZHJlbltpXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKGNoaWxkcmVuW2ldLCBvcHRpb25zLnNlbGVjdGVkQ2xhc3MsIHRydWUpO1xuICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlLFxuICAgICAgICAgICAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnc2VsZWN0JyxcbiAgICAgICAgICAgICAgICAgIHRhcmdldEVsOiBjaGlsZHJlbltpXSxcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZ0OiBldnRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXN0TXVsdGlEcmFnU2VsZWN0ID0gZHJhZ0VsJDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbXVsdGlEcmFnU29ydGFibGUgPSB0b1NvcnRhYmxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnNwbGljZShtdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKSwgMSk7XG4gICAgICAgICAgbGFzdE11bHRpRHJhZ1NlbGVjdCA9IG51bGw7XG4gICAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgICAgICByb290RWw6IHJvb3RFbCxcbiAgICAgICAgICAgIG5hbWU6ICdkZXNlbGVjdCcsXG4gICAgICAgICAgICB0YXJnZXRFbDogZHJhZ0VsJDEsXG4gICAgICAgICAgICBvcmlnaW5hbEV2dDogZXZ0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gTXVsdGktZHJhZyBkcm9wXG5cblxuICAgICAgaWYgKGRyYWdTdGFydGVkICYmIHRoaXMuaXNNdWx0aURyYWcpIHtcbiAgICAgICAgZm9sZGluZyA9IGZhbHNlOyAvLyBEbyBub3QgXCJ1bmZvbGRcIiBhZnRlciBhcm91bmQgZHJhZ0VsIGlmIHJldmVydGVkXG5cbiAgICAgICAgaWYgKChwYXJlbnRFbFtleHBhbmRvXS5vcHRpb25zLnNvcnQgfHwgcGFyZW50RWwgIT09IHJvb3RFbCkgJiYgbXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHZhciBkcmFnUmVjdCA9IGdldFJlY3QoZHJhZ0VsJDEpLFxuICAgICAgICAgICAgICBtdWx0aURyYWdJbmRleCA9IGluZGV4KGRyYWdFbCQxLCAnOm5vdCguJyArIHRoaXMub3B0aW9ucy5zZWxlY3RlZENsYXNzICsgJyknKTtcbiAgICAgICAgICBpZiAoIWluaXRpYWxGb2xkaW5nICYmIG9wdGlvbnMuYW5pbWF0aW9uKSBkcmFnRWwkMS50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICAgIHRvU29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG5cbiAgICAgICAgICBpZiAoIWluaXRpYWxGb2xkaW5nKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgZHJhZ0VsJDEuZnJvbVJlY3QgPSBkcmFnUmVjdDtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ICE9PSBkcmFnRWwkMSkge1xuICAgICAgICAgICAgICAgICAgdmFyIHJlY3QgPSBmb2xkaW5nID8gZ2V0UmVjdChtdWx0aURyYWdFbGVtZW50KSA6IGRyYWdSZWN0O1xuICAgICAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudC5mcm9tUmVjdCA9IHJlY3Q7IC8vIFByZXBhcmUgdW5mb2xkIGFuaW1hdGlvblxuXG4gICAgICAgICAgICAgICAgICB0b1NvcnRhYmxlLmFkZEFuaW1hdGlvblN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICByZWN0OiByZWN0XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSAvLyBNdWx0aSBkcmFnIGVsZW1lbnRzIGFyZSBub3QgbmVjZXNzYXJpbHkgcmVtb3ZlZCBmcm9tIHRoZSBET00gb24gZHJvcCwgc28gdG8gcmVpbnNlcnRcbiAgICAgICAgICAgIC8vIHByb3Blcmx5IHRoZXkgbXVzdCBhbGwgYmUgcmVtb3ZlZFxuXG5cbiAgICAgICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgIGlmIChjaGlsZHJlblttdWx0aURyYWdJbmRleF0pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUobXVsdGlEcmFnRWxlbWVudCwgY2hpbGRyZW5bbXVsdGlEcmFnSW5kZXhdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG11bHRpRHJhZ0luZGV4Kys7XG4gICAgICAgICAgICB9KTsgLy8gSWYgaW5pdGlhbCBmb2xkaW5nIGlzIGRvbmUsIHRoZSBlbGVtZW50cyBtYXkgaGF2ZSBjaGFuZ2VkIHBvc2l0aW9uIGJlY2F1c2UgdGhleSBhcmUgbm93XG4gICAgICAgICAgICAvLyB1bmZvbGRpbmcgYXJvdW5kIGRyYWdFbCwgZXZlbiB0aG91Z2ggZHJhZ0VsIG1heSBub3QgaGF2ZSBoaXMgaW5kZXggY2hhbmdlZCwgc28gdXBkYXRlIGV2ZW50XG4gICAgICAgICAgICAvLyBtdXN0IGJlIGZpcmVkIGhlcmUgYXMgU29ydGFibGUgd2lsbCBub3QuXG5cbiAgICAgICAgICAgIGlmIChvbGRJbmRleCA9PT0gaW5kZXgoZHJhZ0VsJDEpKSB7XG4gICAgICAgICAgICAgIHZhciB1cGRhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggIT09IGluZGV4KG11bHRpRHJhZ0VsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICB1cGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCgndXBkYXRlJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIE11c3QgYmUgZG9uZSBhZnRlciBjYXB0dXJpbmcgaW5kaXZpZHVhbCByZWN0cyAoc2Nyb2xsIGJhcilcblxuXG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgdW5zZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRvU29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbXVsdGlEcmFnU29ydGFibGUgPSB0b1NvcnRhYmxlO1xuICAgICAgfSAvLyBSZW1vdmUgY2xvbmVzIGlmIG5lY2Vzc2FyeVxuXG5cbiAgICAgIGlmIChyb290RWwgPT09IHBhcmVudEVsIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlICE9PSAnY2xvbmUnKSB7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICAgIGNsb25lLnBhcmVudE5vZGUgJiYgY2xvbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgbnVsbGluZ0dsb2JhbDogZnVuY3Rpb24gbnVsbGluZ0dsb2JhbCgpIHtcbiAgICAgIHRoaXMuaXNNdWx0aURyYWcgPSBkcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgbXVsdGlEcmFnQ2xvbmVzLmxlbmd0aCA9IDA7XG4gICAgfSxcbiAgICBkZXN0cm95R2xvYmFsOiBmdW5jdGlvbiBkZXN0cm95R2xvYmFsKCkge1xuICAgICAgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcblxuICAgICAgb2ZmKGRvY3VtZW50LCAncG9pbnRlcnVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgb2ZmKGRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgb2ZmKGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuX2NoZWNrS2V5RG93bik7XG4gICAgICBvZmYoZG9jdW1lbnQsICdrZXl1cCcsIHRoaXMuX2NoZWNrS2V5VXApO1xuICAgIH0sXG4gICAgX2Rlc2VsZWN0TXVsdGlEcmFnOiBmdW5jdGlvbiBfZGVzZWxlY3RNdWx0aURyYWcoZXZ0KSB7XG4gICAgICBpZiAodHlwZW9mIGRyYWdTdGFydGVkICE9PSBcInVuZGVmaW5lZFwiICYmIGRyYWdTdGFydGVkKSByZXR1cm47IC8vIE9ubHkgZGVzZWxlY3QgaWYgc2VsZWN0aW9uIGlzIGluIHRoaXMgc29ydGFibGVcblxuICAgICAgaWYgKG11bHRpRHJhZ1NvcnRhYmxlICE9PSB0aGlzLnNvcnRhYmxlKSByZXR1cm47IC8vIE9ubHkgZGVzZWxlY3QgaWYgdGFyZ2V0IGlzIG5vdCBpdGVtIGluIHRoaXMgc29ydGFibGVcblxuICAgICAgaWYgKGV2dCAmJiBjbG9zZXN0KGV2dC50YXJnZXQsIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUsIHRoaXMuc29ydGFibGUuZWwsIGZhbHNlKSkgcmV0dXJuOyAvLyBPbmx5IGRlc2VsZWN0IGlmIGxlZnQgY2xpY2tcblxuICAgICAgaWYgKGV2dCAmJiBldnQuYnV0dG9uICE9PSAwKSByZXR1cm47XG5cbiAgICAgIHdoaWxlIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGVsID0gbXVsdGlEcmFnRWxlbWVudHNbMF07XG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5zaGlmdCgpO1xuICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZTogdGhpcy5zb3J0YWJsZSxcbiAgICAgICAgICByb290RWw6IHRoaXMuc29ydGFibGUuZWwsXG4gICAgICAgICAgbmFtZTogJ2Rlc2VsZWN0JyxcbiAgICAgICAgICB0YXJnZXRFbDogZWwsXG4gICAgICAgICAgb3JpZ2luYWxFdnQ6IGV2dFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9jaGVja0tleURvd246IGZ1bmN0aW9uIF9jaGVja0tleURvd24oZXZ0KSB7XG4gICAgICBpZiAoZXZ0LmtleSA9PT0gdGhpcy5vcHRpb25zLm11bHRpRHJhZ0tleSkge1xuICAgICAgICB0aGlzLm11bHRpRHJhZ0tleURvd24gPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgX2NoZWNrS2V5VXA6IGZ1bmN0aW9uIF9jaGVja0tleVVwKGV2dCkge1xuICAgICAgaWYgKGV2dC5rZXkgPT09IHRoaXMub3B0aW9ucy5tdWx0aURyYWdLZXkpIHtcbiAgICAgICAgdGhpcy5tdWx0aURyYWdLZXlEb3duID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gX2V4dGVuZHMoTXVsdGlEcmFnLCB7XG4gICAgLy8gU3RhdGljIG1ldGhvZHMgJiBwcm9wZXJ0aWVzXG4gICAgcGx1Z2luTmFtZTogJ211bHRpRHJhZycsXG4gICAgdXRpbHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0cyB0aGUgcHJvdmlkZWQgbXVsdGktZHJhZyBpdGVtXG4gICAgICAgKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgVGhlIGVsZW1lbnQgdG8gYmUgc2VsZWN0ZWRcbiAgICAgICAqL1xuICAgICAgc2VsZWN0OiBmdW5jdGlvbiBzZWxlY3QoZWwpIHtcbiAgICAgICAgdmFyIHNvcnRhYmxlID0gZWwucGFyZW50Tm9kZVtleHBhbmRvXTtcbiAgICAgICAgaWYgKCFzb3J0YWJsZSB8fCAhc29ydGFibGUub3B0aW9ucy5tdWx0aURyYWcgfHwgfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZWwpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKG11bHRpRHJhZ1NvcnRhYmxlICYmIG11bHRpRHJhZ1NvcnRhYmxlICE9PSBzb3J0YWJsZSkge1xuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlLm11bHRpRHJhZy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcblxuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gc29ydGFibGU7XG4gICAgICAgIH1cblxuICAgICAgICB0b2dnbGVDbGFzcyhlbCwgc29ydGFibGUub3B0aW9ucy5zZWxlY3RlZENsYXNzLCB0cnVlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMucHVzaChlbCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERlc2VsZWN0cyB0aGUgcHJvdmlkZWQgbXVsdGktZHJhZyBpdGVtXG4gICAgICAgKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgVGhlIGVsZW1lbnQgdG8gYmUgZGVzZWxlY3RlZFxuICAgICAgICovXG4gICAgICBkZXNlbGVjdDogZnVuY3Rpb24gZGVzZWxlY3QoZWwpIHtcbiAgICAgICAgdmFyIHNvcnRhYmxlID0gZWwucGFyZW50Tm9kZVtleHBhbmRvXSxcbiAgICAgICAgICAgIGluZGV4ID0gbXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihlbCk7XG4gICAgICAgIGlmICghc29ydGFibGUgfHwgIXNvcnRhYmxlLm9wdGlvbnMubXVsdGlEcmFnIHx8ICF+aW5kZXgpIHJldHVybjtcbiAgICAgICAgdG9nZ2xlQ2xhc3MoZWwsIHNvcnRhYmxlLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBldmVudFByb3BlcnRpZXMoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIG9sZEluZGljaWVzID0gW10sXG4gICAgICAgICAgbmV3SW5kaWNpZXMgPSBbXTtcbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgb2xkSW5kaWNpZXMucHVzaCh7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICBpbmRleDogbXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4XG4gICAgICAgIH0pOyAvLyBtdWx0aURyYWdFbGVtZW50cyB3aWxsIGFscmVhZHkgYmUgc29ydGVkIGlmIGZvbGRpbmdcblxuICAgICAgICB2YXIgbmV3SW5kZXg7XG5cbiAgICAgICAgaWYgKGZvbGRpbmcgJiYgbXVsdGlEcmFnRWxlbWVudCAhPT0gZHJhZ0VsJDEpIHtcbiAgICAgICAgICBuZXdJbmRleCA9IC0xO1xuICAgICAgICB9IGVsc2UgaWYgKGZvbGRpbmcpIHtcbiAgICAgICAgICBuZXdJbmRleCA9IGluZGV4KG11bHRpRHJhZ0VsZW1lbnQsICc6bm90KC4nICsgX3RoaXMzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcyArICcpJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3SW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0luZGljaWVzLnB1c2goe1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgaW5kZXg6IG5ld0luZGV4XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpdGVtczogX3RvQ29uc3VtYWJsZUFycmF5KG11bHRpRHJhZ0VsZW1lbnRzKSxcbiAgICAgICAgY2xvbmVzOiBbXS5jb25jYXQobXVsdGlEcmFnQ2xvbmVzKSxcbiAgICAgICAgb2xkSW5kaWNpZXM6IG9sZEluZGljaWVzLFxuICAgICAgICBuZXdJbmRpY2llczogbmV3SW5kaWNpZXNcbiAgICAgIH07XG4gICAgfSxcbiAgICBvcHRpb25MaXN0ZW5lcnM6IHtcbiAgICAgIG11bHRpRHJhZ0tleTogZnVuY3Rpb24gbXVsdGlEcmFnS2V5KGtleSkge1xuICAgICAgICBrZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoa2V5ID09PSAnY3RybCcpIHtcbiAgICAgICAgICBrZXkgPSAnQ29udHJvbCc7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRNdWx0aURyYWdFbGVtZW50cyhjbG9uZXNJbnNlcnRlZCwgcm9vdEVsKSB7XG4gIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQsIGkpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcm9vdEVsLmNoaWxkcmVuW211bHRpRHJhZ0VsZW1lbnQuc29ydGFibGVJbmRleCArIChjbG9uZXNJbnNlcnRlZCA/IE51bWJlcihpKSA6IDApXTtcblxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUobXVsdGlEcmFnRWxlbWVudCwgdGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgIH1cbiAgfSk7XG59XG4vKipcbiAqIEluc2VydCBtdWx0aS1kcmFnIGNsb25lc1xuICogQHBhcmFtICB7W0Jvb2xlYW5dfSBlbGVtZW50c0luc2VydGVkICBXaGV0aGVyIHRoZSBtdWx0aS1kcmFnIGVsZW1lbnRzIGFyZSBpbnNlcnRlZFxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IHJvb3RFbFxuICovXG5cblxuZnVuY3Rpb24gaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKGVsZW1lbnRzSW5zZXJ0ZWQsIHJvb3RFbCkge1xuICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUsIGkpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcm9vdEVsLmNoaWxkcmVuW2Nsb25lLnNvcnRhYmxlSW5kZXggKyAoZWxlbWVudHNJbnNlcnRlZCA/IE51bWJlcihpKSA6IDApXTtcblxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKSB7XG4gIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICBtdWx0aURyYWdFbGVtZW50LnBhcmVudE5vZGUgJiYgbXVsdGlEcmFnRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG11bHRpRHJhZ0VsZW1lbnQpO1xuICB9KTtcbn1cblxuU29ydGFibGUubW91bnQobmV3IEF1dG9TY3JvbGxQbHVnaW4oKSk7XG5Tb3J0YWJsZS5tb3VudChSZW1vdmUsIFJldmVydCk7XG5cbmV4cG9ydCBkZWZhdWx0IFNvcnRhYmxlO1xuZXhwb3J0IHsgTXVsdGlEcmFnUGx1Z2luIGFzIE11bHRpRHJhZywgU29ydGFibGUsIFN3YXBQbHVnaW4gYXMgU3dhcCB9O1xuIiwidmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2RlZlByb3BzID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXM7XG52YXIgX19nZXRPd25Qcm9wRGVzY3MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycztcbnZhciBfX2dldE93blByb3BTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fcHJvcElzRW51bSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgX19kZWZOb3JtYWxQcm9wID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4ga2V5IGluIG9iaiA/IF9fZGVmUHJvcChvYmosIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZSB9KSA6IG9ialtrZXldID0gdmFsdWU7XG52YXIgX19zcHJlYWRWYWx1ZXMgPSAoYSwgYikgPT4ge1xuICBmb3IgKHZhciBwcm9wIGluIGIgfHwgKGIgPSB7fSkpXG4gICAgaWYgKF9faGFzT3duUHJvcC5jYWxsKGIsIHByb3ApKVxuICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xuICBpZiAoX19nZXRPd25Qcm9wU3ltYm9scylcbiAgICBmb3IgKHZhciBwcm9wIG9mIF9fZ2V0T3duUHJvcFN5bWJvbHMoYikpIHtcbiAgICAgIGlmIChfX3Byb3BJc0VudW0uY2FsbChiLCBwcm9wKSlcbiAgICAgICAgX19kZWZOb3JtYWxQcm9wKGEsIHByb3AsIGJbcHJvcF0pO1xuICAgIH1cbiAgcmV0dXJuIGE7XG59O1xudmFyIF9fc3ByZWFkUHJvcHMgPSAoYSwgYikgPT4gX19kZWZQcm9wcyhhLCBfX2dldE93blByb3BEZXNjcyhiKSk7XG5pbXBvcnQgU29ydGFibGUgZnJvbSBcInNvcnRhYmxlanNcIjtcbmltcG9ydCB7IHJlc29sdmVDb21wb25lbnQsIFRyYW5zaXRpb25Hcm91cCwgZGVmaW5lQ29tcG9uZW50LCBoLCBuZXh0VGljayB9IGZyb20gXCJ2dWVcIjtcbmZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSkge1xuICBpZiAobm9kZS5wYXJlbnRFbGVtZW50ICE9PSBudWxsKSB7XG4gICAgbm9kZS5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnROb2RlQXQoZmF0aGVyTm9kZSwgbm9kZSwgcG9zaXRpb24pIHtcbiAgY29uc3QgcmVmTm9kZSA9IHBvc2l0aW9uID09PSAwID8gZmF0aGVyTm9kZS5jaGlsZHJlblswXSA6IGZhdGhlck5vZGUuY2hpbGRyZW5bcG9zaXRpb24gLSAxXS5uZXh0U2libGluZztcbiAgZmF0aGVyTm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgcmVmTm9kZSk7XG59XG5mdW5jdGlvbiBnZXRDb25zb2xlKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB3aW5kb3cuY29uc29sZTtcbiAgfVxuICByZXR1cm4gZ2xvYmFsLmNvbnNvbGU7XG59XG5jb25zdCBjb25zb2xlJDEgPSBnZXRDb25zb2xlKCk7XG5mdW5jdGlvbiBjYWNoZWQoZm4pIHtcbiAgY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZEZuKHN0cikge1xuICAgIGNvbnN0IGhpdCA9IGNhY2hlW3N0cl07XG4gICAgcmV0dXJuIGhpdCB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpO1xuICB9O1xufVxuY29uc3QgcmVnZXggPSAvLShcXHcpL2c7XG5jb25zdCBjYW1lbGl6ZSA9IGNhY2hlZCgoc3RyKSA9PiBzdHIucmVwbGFjZShyZWdleCwgKF8sIGMpID0+IGMudG9VcHBlckNhc2UoKSkpO1xuY29uc3QgbWFuYWdlQW5kRW1pdCQxID0gW1wiU3RhcnRcIiwgXCJBZGRcIiwgXCJSZW1vdmVcIiwgXCJVcGRhdGVcIiwgXCJFbmRcIl07XG5jb25zdCBlbWl0JDEgPSBbXCJDaG9vc2VcIiwgXCJVbmNob29zZVwiLCBcIlNvcnRcIiwgXCJGaWx0ZXJcIiwgXCJDbG9uZVwiXTtcbmNvbnN0IG1hbmFnZSQxID0gW1wiTW92ZVwiXTtcbmNvbnN0IGV2ZW50SGFuZGxlck5hbWVzID0gW21hbmFnZSQxLCBtYW5hZ2VBbmRFbWl0JDEsIGVtaXQkMV0uZmxhdE1hcCgoZXZlbnRzMikgPT4gZXZlbnRzMikubWFwKChldnQpID0+IGBvbiR7ZXZ0fWApO1xuY29uc3QgZXZlbnRzID0ge1xuICBtYW5hZ2U6IG1hbmFnZSQxLFxuICBtYW5hZ2VBbmRFbWl0OiBtYW5hZ2VBbmRFbWl0JDEsXG4gIGVtaXQ6IGVtaXQkMVxufTtcbmZ1bmN0aW9uIGlzUmVhZE9ubHkoZXZlbnROYW1lKSB7XG4gIHJldHVybiBldmVudEhhbmRsZXJOYW1lcy5pbmRleE9mKGV2ZW50TmFtZSkgIT09IC0xO1xufVxuY29uc3QgdGFncyA9IFtcbiAgXCJhXCIsXG4gIFwiYWJiclwiLFxuICBcImFkZHJlc3NcIixcbiAgXCJhcmVhXCIsXG4gIFwiYXJ0aWNsZVwiLFxuICBcImFzaWRlXCIsXG4gIFwiYXVkaW9cIixcbiAgXCJiXCIsXG4gIFwiYmFzZVwiLFxuICBcImJkaVwiLFxuICBcImJkb1wiLFxuICBcImJsb2NrcXVvdGVcIixcbiAgXCJib2R5XCIsXG4gIFwiYnJcIixcbiAgXCJidXR0b25cIixcbiAgXCJjYW52YXNcIixcbiAgXCJjYXB0aW9uXCIsXG4gIFwiY2l0ZVwiLFxuICBcImNvZGVcIixcbiAgXCJjb2xcIixcbiAgXCJjb2xncm91cFwiLFxuICBcImRhdGFcIixcbiAgXCJkYXRhbGlzdFwiLFxuICBcImRkXCIsXG4gIFwiZGVsXCIsXG4gIFwiZGV0YWlsc1wiLFxuICBcImRmblwiLFxuICBcImRpYWxvZ1wiLFxuICBcImRpdlwiLFxuICBcImRsXCIsXG4gIFwiZHRcIixcbiAgXCJlbVwiLFxuICBcImVtYmVkXCIsXG4gIFwiZmllbGRzZXRcIixcbiAgXCJmaWdjYXB0aW9uXCIsXG4gIFwiZmlndXJlXCIsXG4gIFwiZm9vdGVyXCIsXG4gIFwiZm9ybVwiLFxuICBcImgxXCIsXG4gIFwiaDJcIixcbiAgXCJoM1wiLFxuICBcImg0XCIsXG4gIFwiaDVcIixcbiAgXCJoNlwiLFxuICBcImhlYWRcIixcbiAgXCJoZWFkZXJcIixcbiAgXCJoZ3JvdXBcIixcbiAgXCJoclwiLFxuICBcImh0bWxcIixcbiAgXCJpXCIsXG4gIFwiaWZyYW1lXCIsXG4gIFwiaW1nXCIsXG4gIFwiaW5wdXRcIixcbiAgXCJpbnNcIixcbiAgXCJrYmRcIixcbiAgXCJsYWJlbFwiLFxuICBcImxlZ2VuZFwiLFxuICBcImxpXCIsXG4gIFwibGlua1wiLFxuICBcIm1haW5cIixcbiAgXCJtYXBcIixcbiAgXCJtYXJrXCIsXG4gIFwibWF0aFwiLFxuICBcIm1lbnVcIixcbiAgXCJtZW51aXRlbVwiLFxuICBcIm1ldGFcIixcbiAgXCJtZXRlclwiLFxuICBcIm5hdlwiLFxuICBcIm5vc2NyaXB0XCIsXG4gIFwib2JqZWN0XCIsXG4gIFwib2xcIixcbiAgXCJvcHRncm91cFwiLFxuICBcIm9wdGlvblwiLFxuICBcIm91dHB1dFwiLFxuICBcInBcIixcbiAgXCJwYXJhbVwiLFxuICBcInBpY3R1cmVcIixcbiAgXCJwcmVcIixcbiAgXCJwcm9ncmVzc1wiLFxuICBcInFcIixcbiAgXCJyYlwiLFxuICBcInJwXCIsXG4gIFwicnRcIixcbiAgXCJydGNcIixcbiAgXCJydWJ5XCIsXG4gIFwic1wiLFxuICBcInNhbXBcIixcbiAgXCJzY3JpcHRcIixcbiAgXCJzZWN0aW9uXCIsXG4gIFwic2VsZWN0XCIsXG4gIFwic2xvdFwiLFxuICBcInNtYWxsXCIsXG4gIFwic291cmNlXCIsXG4gIFwic3BhblwiLFxuICBcInN0cm9uZ1wiLFxuICBcInN0eWxlXCIsXG4gIFwic3ViXCIsXG4gIFwic3VtbWFyeVwiLFxuICBcInN1cFwiLFxuICBcInN2Z1wiLFxuICBcInRhYmxlXCIsXG4gIFwidGJvZHlcIixcbiAgXCJ0ZFwiLFxuICBcInRlbXBsYXRlXCIsXG4gIFwidGV4dGFyZWFcIixcbiAgXCJ0Zm9vdFwiLFxuICBcInRoXCIsXG4gIFwidGhlYWRcIixcbiAgXCJ0aW1lXCIsXG4gIFwidGl0bGVcIixcbiAgXCJ0clwiLFxuICBcInRyYWNrXCIsXG4gIFwidVwiLFxuICBcInVsXCIsXG4gIFwidmFyXCIsXG4gIFwidmlkZW9cIixcbiAgXCJ3YnJcIlxuXTtcbmZ1bmN0aW9uIGlzSHRtbFRhZyhuYW1lKSB7XG4gIHJldHVybiB0YWdzLmluY2x1ZGVzKG5hbWUpO1xufVxuZnVuY3Rpb24gaXNUcmFuc2l0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIFtcInRyYW5zaXRpb24tZ3JvdXBcIiwgXCJUcmFuc2l0aW9uR3JvdXBcIl0uaW5jbHVkZXMobmFtZSk7XG59XG5mdW5jdGlvbiBpc0h0bWxBdHRyaWJ1dGUodmFsdWUpIHtcbiAgcmV0dXJuIFtcImlkXCIsIFwiY2xhc3NcIiwgXCJyb2xlXCIsIFwic3R5bGVcIl0uaW5jbHVkZXModmFsdWUpIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCJkYXRhLVwiKSB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiYXJpYS1cIikgfHwgdmFsdWUuc3RhcnRzV2l0aChcIm9uXCIpO1xufVxuZnVuY3Rpb24gcHJvamVjdChlbnRyaWVzKSB7XG4gIHJldHVybiBlbnRyaWVzLnJlZHVjZSgocmVzLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiByZXM7XG4gIH0sIHt9KTtcbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudEF0dHJpYnV0ZXMoeyAkYXR0cnMsIGNvbXBvbmVudERhdGEgPSB7fSB9KSB7XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSBwcm9qZWN0KE9iamVjdC5lbnRyaWVzKCRhdHRycykuZmlsdGVyKChba2V5LCBfXSkgPT4gaXNIdG1sQXR0cmlidXRlKGtleSkpKTtcbiAgcmV0dXJuIF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHt9LCBhdHRyaWJ1dGVzKSwgY29tcG9uZW50RGF0YSk7XG59XG5mdW5jdGlvbiBjcmVhdGVTb3J0YWJsZU9wdGlvbih7ICRhdHRycywgY2FsbEJhY2tCdWlsZGVyIH0pIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHByb2plY3QoZ2V0VmFsaWRTb3J0YWJsZUVudHJpZXMoJGF0dHJzKSk7XG4gIE9iamVjdC5lbnRyaWVzKGNhbGxCYWNrQnVpbGRlcikuZm9yRWFjaCgoW2V2ZW50VHlwZSwgZXZlbnRCdWlsZGVyXSkgPT4ge1xuICAgIGV2ZW50c1tldmVudFR5cGVdLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICBvcHRpb25zW2BvbiR7ZXZlbnR9YF0gPSBldmVudEJ1aWxkZXIoZXZlbnQpO1xuICAgIH0pO1xuICB9KTtcbiAgY29uc3QgZHJhZ2dhYmxlID0gYFtkYXRhLWRyYWdnYWJsZV0ke29wdGlvbnMuZHJhZ2dhYmxlIHx8IFwiXCJ9YDtcbiAgcmV0dXJuIF9fc3ByZWFkUHJvcHMoX19zcHJlYWRWYWx1ZXMoe30sIG9wdGlvbnMpLCB7XG4gICAgZHJhZ2dhYmxlXG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0VmFsaWRTb3J0YWJsZUVudHJpZXModmFsdWUpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5maWx0ZXIoKFtrZXksIF9dKSA9PiAhaXNIdG1sQXR0cmlidXRlKGtleSkpLm1hcCgoW2tleSwgdmFsdWUyXSkgPT4gW2NhbWVsaXplKGtleSksIHZhbHVlMl0pLmZpbHRlcigoW2tleSwgX10pID0+ICFpc1JlYWRPbmx5KGtleSkpO1xufVxuY29uc3QgZ2V0SHRtbEVsZW1lbnRGcm9tTm9kZSA9IChub2RlKSA9PiB7XG4gIGNvbnN0IGVsID0gbm9kZS5lbCB8fCBBcnJheS5pc0FycmF5KG5vZGUuY2hpbGRyZW4pICYmIG5vZGUuY2hpbGRyZW5bMF0uZWwucGFyZW50Tm9kZTtcbiAgaWYgKCFlbCkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJcXHU0RjdGXFx1NzUyOCB0cmFuc2l0aW9uLWdyb3VwICwgXFx1OTcwMFxcdTg5ODFcXHU1NzI4c2xvdFxcdTRFMkR0ZW1wbGF0ZVxcdTUxODVcXHU4MUYzXFx1NUMxMTJcXHU1QzQyaHRtbFxcdTY4MDdcXHU3QjdFXCIpO1xuICB9XG4gIHJldHVybiBlbCB8fCB7fTtcbn07XG5jb25zdCBhZGRDb250ZXh0ID0gKGRvbUVsZW1lbnQsIGNvbnRleHQpID0+IGRvbUVsZW1lbnQuX19kcmFnZ2FibGVfY29udGV4dCA9IGNvbnRleHQ7XG5jb25zdCBnZXRDb250ZXh0ID0gKGRvbUVsZW1lbnQpID0+IGRvbUVsZW1lbnQuX19kcmFnZ2FibGVfY29udGV4dDtcbmNsYXNzIENvbXBvbmVudFN0cnVjdHVyZSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBub2RlczogeyBoZWFkZXIsIGRlZmF1bHQ6IGRlZmF1bHROb2RlcywgZm9vdGVyIH0sXG4gICAgcm9vdCxcbiAgICByZWFsTGlzdFxuICB9KSB7XG4gICAgdGhpcy5kZWZhdWx0Tm9kZXMgPSBkZWZhdWx0Tm9kZXM7XG4gICAgdGhpcy5jaGlsZHJlbiA9IFsuLi5oZWFkZXIsIC4uLmRlZmF1bHROb2RlcywgLi4uZm9vdGVyXTtcbiAgICB0aGlzLmV4dGVybmFsQ29tcG9uZW50ID0gcm9vdC5leHRlcm5hbENvbXBvbmVudDtcbiAgICB0aGlzLnJvb3RUcmFuc2l0aW9uID0gcm9vdC50cmFuc2l0aW9uO1xuICAgIHRoaXMudGFnID0gcm9vdC50YWc7XG4gICAgdGhpcy5yZWFsTGlzdCA9IHJlYWxMaXN0O1xuICB9XG4gIGdldCBfaXNSb290Q29tcG9uZW50KCkge1xuICAgIHJldHVybiB0aGlzLmV4dGVybmFsQ29tcG9uZW50IHx8IHRoaXMucm9vdFRyYW5zaXRpb247XG4gIH1cbiAgcmVuZGVyKGgyLCBhdHRyaWJ1dGVzKSB7XG4gICAgY29uc3QgeyB0YWcsIGNoaWxkcmVuLCBfaXNSb290Q29tcG9uZW50IH0gPSB0aGlzO1xuICAgIGNvbnN0IG9wdGlvbiA9ICFfaXNSb290Q29tcG9uZW50ID8gY2hpbGRyZW4gOiB7IGRlZmF1bHQ6ICgpID0+IGNoaWxkcmVuIH07XG4gICAgcmV0dXJuIGgyKHRhZywgYXR0cmlidXRlcywgb3B0aW9uKTtcbiAgfVxuICB1cGRhdGVkKCkge1xuICAgIGNvbnN0IHsgZGVmYXVsdE5vZGVzLCByZWFsTGlzdCB9ID0gdGhpcztcbiAgICBkZWZhdWx0Tm9kZXMuZm9yRWFjaCgobm9kZSwgaW5kZXgpID0+IHtcbiAgICAgIGFkZENvbnRleHQoZ2V0SHRtbEVsZW1lbnRGcm9tTm9kZShub2RlKSwge1xuICAgICAgICBlbGVtZW50OiByZWFsTGlzdFtpbmRleF0sXG4gICAgICAgIGluZGV4XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBnZXRVbmRlcmx5aW5nVm0oZG9tRWxlbWVudCkge1xuICAgIHJldHVybiBnZXRDb250ZXh0KGRvbUVsZW1lbnQpO1xuICB9XG4gIGdldFZtSW5kZXhGcm9tRG9tSW5kZXgoZG9tSW5kZXgsIGVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGRlZmF1bHROb2RlcyB9ID0gdGhpcztcbiAgICBjb25zdCB7IGxlbmd0aCB9ID0gZGVmYXVsdE5vZGVzO1xuICAgIGNvbnN0IGRvbUNoaWxkcmVuID0gZWxlbWVudC5jaGlsZHJlbjtcbiAgICBjb25zdCBkb21FbGVtZW50ID0gZG9tQ2hpbGRyZW4uaXRlbShkb21JbmRleCk7XG4gICAgaWYgKGRvbUVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KGRvbUVsZW1lbnQpO1xuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICByZXR1cm4gY29udGV4dC5pbmRleDtcbiAgICB9XG4gICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0RG9tTGlzdEVsZW1lbnQgPSBnZXRIdG1sRWxlbWVudEZyb21Ob2RlKGRlZmF1bHROb2Rlc1swXSk7XG4gICAgY29uc3QgaW5kZXhGaXJzdERvbUxpc3RFbGVtZW50ID0gWy4uLmRvbUNoaWxkcmVuXS5maW5kSW5kZXgoKGVsZW1lbnQyKSA9PiBlbGVtZW50MiA9PT0gZmlyc3REb21MaXN0RWxlbWVudCk7XG4gICAgcmV0dXJuIGRvbUluZGV4IDwgaW5kZXhGaXJzdERvbUxpc3RFbGVtZW50ID8gMCA6IGxlbmd0aDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U2xvdChzbG90cywga2V5KSB7XG4gIGNvbnN0IHNsb3RWYWx1ZSA9IHNsb3RzW2tleV07XG4gIHJldHVybiBzbG90VmFsdWUgPyBzbG90VmFsdWUoKSA6IFtdO1xufVxuZnVuY3Rpb24gY29tcHV0ZU5vZGVzKHsgJHNsb3RzLCByZWFsTGlzdCwgZ2V0S2V5IH0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZExpc3QgPSByZWFsTGlzdCB8fCBbXTtcbiAgY29uc3QgW2hlYWRlciwgZm9vdGVyXSA9IFtcImhlYWRlclwiLCBcImZvb3RlclwiXS5tYXAoKG5hbWUpID0+IGdldFNsb3QoJHNsb3RzLCBuYW1lKSk7XG4gIGNvbnN0IHsgaXRlbSB9ID0gJHNsb3RzO1xuICBpZiAoIWl0ZW0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJkcmFnZ2FibGUgZWxlbWVudCBtdXN0IGhhdmUgYW4gaXRlbSBzbG90XCIpO1xuICB9XG4gIGNvbnN0IGRlZmF1bHROb2RlcyA9IG5vcm1hbGl6ZWRMaXN0LmZsYXRNYXAoKGVsZW1lbnQsIGluZGV4KSA9PiBpdGVtKHsgZWxlbWVudCwgaW5kZXggfSkubWFwKChub2RlKSA9PiB7XG4gICAgbm9kZS5rZXkgPSBnZXRLZXkoZWxlbWVudCk7XG4gICAgbm9kZS5wcm9wcyA9IF9fc3ByZWFkUHJvcHMoX19zcHJlYWRWYWx1ZXMoe30sIG5vZGUucHJvcHMgfHwge30pLCB7IFwiZGF0YS1kcmFnZ2FibGVcIjogdHJ1ZSB9KTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfSkpO1xuICBpZiAoZGVmYXVsdE5vZGVzLmxlbmd0aCAhPT0gbm9ybWFsaXplZExpc3QubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSXRlbSBzbG90IG11c3QgaGF2ZSBvbmx5IG9uZSBjaGlsZFwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGhlYWRlcixcbiAgICBmb290ZXIsXG4gICAgZGVmYXVsdDogZGVmYXVsdE5vZGVzXG4gIH07XG59XG5mdW5jdGlvbiBnZXRSb290SW5mb3JtYXRpb24odGFnKSB7XG4gIGNvbnN0IHRyYW5zaXRpb24gPSBpc1RyYW5zaXRpb24odGFnKTtcbiAgY29uc3QgZXh0ZXJuYWxDb21wb25lbnQgPSAhaXNIdG1sVGFnKHRhZykgJiYgIXRyYW5zaXRpb247XG4gIHJldHVybiB7XG4gICAgdHJhbnNpdGlvbixcbiAgICBleHRlcm5hbENvbXBvbmVudCxcbiAgICB0YWc6IGV4dGVybmFsQ29tcG9uZW50ID8gcmVzb2x2ZUNvbXBvbmVudCh0YWcpIDogdHJhbnNpdGlvbiA/IFRyYW5zaXRpb25Hcm91cCA6IHRhZ1xuICB9O1xufVxuZnVuY3Rpb24gY29tcHV0ZUNvbXBvbmVudFN0cnVjdHVyZSh7ICRzbG90cywgdGFnLCByZWFsTGlzdCwgZ2V0S2V5IH0pIHtcbiAgY29uc3Qgbm9kZXMgPSBjb21wdXRlTm9kZXMoeyAkc2xvdHMsIHJlYWxMaXN0LCBnZXRLZXkgfSk7XG4gIGNvbnN0IHJvb3QgPSBnZXRSb290SW5mb3JtYXRpb24odGFnKTtcbiAgcmV0dXJuIG5ldyBDb21wb25lbnRTdHJ1Y3R1cmUoeyBub2Rlcywgcm9vdCwgcmVhbExpc3QgfSk7XG59XG5mdW5jdGlvbiBlbWl0KGV2dE5hbWUsIGV2dERhdGEpIHtcbiAgbmV4dFRpY2soKCkgPT4gdGhpcy4kZW1pdChldnROYW1lLnRvTG93ZXJDYXNlKCksIGV2dERhdGEpKTtcbn1cbmZ1bmN0aW9uIG1hbmFnZShldnROYW1lKSB7XG4gIHJldHVybiAoZXZ0RGF0YSwgb3JpZ2luYWxFbGVtZW50KSA9PiB7XG4gICAgaWYgKHRoaXMucmVhbExpc3QgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzW2BvbkRyYWcke2V2dE5hbWV9YF0oZXZ0RGF0YSwgb3JpZ2luYWxFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBtYW5hZ2VBbmRFbWl0KGV2dE5hbWUpIHtcbiAgY29uc3QgZGVsZWdhdGVDYWxsQmFjayA9IG1hbmFnZS5jYWxsKHRoaXMsIGV2dE5hbWUpO1xuICByZXR1cm4gKGV2dERhdGEsIG9yaWdpbmFsRWxlbWVudCkgPT4ge1xuICAgIGRlbGVnYXRlQ2FsbEJhY2suY2FsbCh0aGlzLCBldnREYXRhLCBvcmlnaW5hbEVsZW1lbnQpO1xuICAgIGVtaXQuY2FsbCh0aGlzLCBldnROYW1lLCBldnREYXRhKTtcbiAgfTtcbn1cbmxldCBkcmFnZ2luZ0VsZW1lbnQgPSBudWxsO1xuY29uc3QgcHJvcHMgPSB7XG4gIGxpc3Q6IHtcbiAgICB0eXBlOiBBcnJheSxcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgZGVmYXVsdDogbnVsbFxuICB9LFxuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogQXJyYXksXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGRlZmF1bHQ6IG51bGxcbiAgfSxcbiAgaXRlbUtleToge1xuICAgIHR5cGU6IFtTdHJpbmcsIEZ1bmN0aW9uXSxcbiAgICByZXF1aXJlZDogdHJ1ZVxuICB9LFxuICBjbG9uZToge1xuICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgIGRlZmF1bHQ6IChvcmlnaW5hbCkgPT4ge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsO1xuICAgIH1cbiAgfSxcbiAgdGFnOiB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIGRlZmF1bHQ6IFwiZGl2XCJcbiAgfSxcbiAgbW92ZToge1xuICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgIGRlZmF1bHQ6IG51bGxcbiAgfSxcbiAgY29tcG9uZW50RGF0YToge1xuICAgIHR5cGU6IE9iamVjdCxcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgZGVmYXVsdDogbnVsbFxuICB9XG59O1xuY29uc3QgZW1pdHMgPSBbXG4gIFwidXBkYXRlOm1vZGVsVmFsdWVcIixcbiAgXCJjaGFuZ2VcIixcbiAgLi4uWy4uLmV2ZW50cy5tYW5hZ2VBbmRFbWl0LCAuLi5ldmVudHMuZW1pdF0ubWFwKChldnQpID0+IGV2dC50b0xvd2VyQ2FzZSgpKVxuXTtcbmNvbnN0IGRyYWdnYWJsZUNvbXBvbmVudCA9IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiZHJhZ2dhYmxlXCIsXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG4gIHByb3BzLFxuICBlbWl0cyxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGZhbHNlXG4gICAgfTtcbiAgfSxcbiAgcmVuZGVyKCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVycm9yID0gZmFsc2U7XG4gICAgICBjb25zdCB7ICRzbG90cywgJGF0dHJzLCB0YWcsIGNvbXBvbmVudERhdGEsIHJlYWxMaXN0LCBnZXRLZXkgfSA9IHRoaXM7XG4gICAgICBjb25zdCBjb21wb25lbnRTdHJ1Y3R1cmUgPSBjb21wdXRlQ29tcG9uZW50U3RydWN0dXJlKHtcbiAgICAgICAgJHNsb3RzLFxuICAgICAgICB0YWcsXG4gICAgICAgIHJlYWxMaXN0LFxuICAgICAgICBnZXRLZXlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb21wb25lbnRTdHJ1Y3R1cmUgPSBjb21wb25lbnRTdHJ1Y3R1cmU7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZ2V0Q29tcG9uZW50QXR0cmlidXRlcyh7ICRhdHRycywgY29tcG9uZW50RGF0YSB9KTtcbiAgICAgIHJldHVybiBjb21wb25lbnRTdHJ1Y3R1cmUucmVuZGVyKGgsIGF0dHJpYnV0ZXMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvciA9IHRydWU7XG4gICAgICByZXR1cm4gaChcInByZVwiLCB7IHN0eWxlOiB7IGNvbG9yOiBcInJlZFwiIH0gfSwgZXJyLnN0YWNrKTtcbiAgICB9XG4gIH0sXG4gIGNyZWF0ZWQoKSB7XG4gICAgaWYgKHRoaXMubGlzdCAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUkMS5lcnJvcihcIm1vZGVsVmFsdWUgYW5kIGxpc3QgcHJvcHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSEgUGxlYXNlIHNldCBvbmUgb3IgYW5vdGhlci5cIik7XG4gICAgfVxuICB9LFxuICBtb3VudGVkKCkge1xuICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgJGF0dHJzLCAkZWwsIGNvbXBvbmVudFN0cnVjdHVyZSB9ID0gdGhpcztcbiAgICBjb21wb25lbnRTdHJ1Y3R1cmUudXBkYXRlZCgpO1xuICAgIGNvbnN0IHNvcnRhYmxlT3B0aW9ucyA9IGNyZWF0ZVNvcnRhYmxlT3B0aW9uKHtcbiAgICAgICRhdHRycyxcbiAgICAgIGNhbGxCYWNrQnVpbGRlcjoge1xuICAgICAgICBtYW5hZ2VBbmRFbWl0OiAoZXZlbnQpID0+IG1hbmFnZUFuZEVtaXQuY2FsbCh0aGlzLCBldmVudCksXG4gICAgICAgIGVtaXQ6IChldmVudCkgPT4gZW1pdC5iaW5kKHRoaXMsIGV2ZW50KSxcbiAgICAgICAgbWFuYWdlOiAoZXZlbnQpID0+IG1hbmFnZS5jYWxsKHRoaXMsIGV2ZW50KVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHRhcmdldERvbUVsZW1lbnQgPSAkZWwubm9kZVR5cGUgPT09IDEgPyAkZWwgOiAkZWwucGFyZW50RWxlbWVudDtcbiAgICB0aGlzLl9zb3J0YWJsZSA9IG5ldyBTb3J0YWJsZSh0YXJnZXREb21FbGVtZW50LCBzb3J0YWJsZU9wdGlvbnMpO1xuICAgIHRoaXMudGFyZ2V0RG9tRWxlbWVudCA9IHRhcmdldERvbUVsZW1lbnQ7XG4gICAgdGFyZ2V0RG9tRWxlbWVudC5fX2RyYWdnYWJsZV9jb21wb25lbnRfXyA9IHRoaXM7XG4gIH0sXG4gIHVwZGF0ZWQoKSB7XG4gICAgdGhpcy5jb21wb25lbnRTdHJ1Y3R1cmUudXBkYXRlZCgpO1xuICB9LFxuICBiZWZvcmVVbm1vdW50KCkge1xuICAgIGlmICh0aGlzLl9zb3J0YWJsZSAhPT0gdm9pZCAwKVxuICAgICAgdGhpcy5fc29ydGFibGUuZGVzdHJveSgpO1xuICB9LFxuICBjb21wdXRlZDoge1xuICAgIHJlYWxMaXN0KCkge1xuICAgICAgY29uc3QgeyBsaXN0IH0gPSB0aGlzO1xuICAgICAgcmV0dXJuIGxpc3QgPyBsaXN0IDogdGhpcy5tb2RlbFZhbHVlO1xuICAgIH0sXG4gICAgZ2V0S2V5KCkge1xuICAgICAgY29uc3QgeyBpdGVtS2V5IH0gPSB0aGlzO1xuICAgICAgaWYgKHR5cGVvZiBpdGVtS2V5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1LZXk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGVsZW1lbnQpID0+IGVsZW1lbnRbaXRlbUtleV07XG4gICAgfVxuICB9LFxuICB3YXRjaDoge1xuICAgICRhdHRyczoge1xuICAgICAgaGFuZGxlcihuZXdPcHRpb25WYWx1ZSkge1xuICAgICAgICBjb25zdCB7IF9zb3J0YWJsZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFfc29ydGFibGUpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBnZXRWYWxpZFNvcnRhYmxlRW50cmllcyhuZXdPcHRpb25WYWx1ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgX3NvcnRhYmxlLm9wdGlvbihrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZGVlcDogdHJ1ZVxuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIGdldFVuZGVybHlpbmdWbShkb21FbGVtZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTdHJ1Y3R1cmUuZ2V0VW5kZXJseWluZ1ZtKGRvbUVsZW1lbnQpIHx8IG51bGw7XG4gICAgfSxcbiAgICBnZXRVbmRlcmx5aW5nUG90ZW5jaWFsRHJhZ2dhYmxlQ29tcG9uZW50KGh0bUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBodG1FbGVtZW50Ll9fZHJhZ2dhYmxlX2NvbXBvbmVudF9fO1xuICAgIH0sXG4gICAgZW1pdENoYW5nZXMoZXZ0KSB7XG4gICAgICBuZXh0VGljaygoKSA9PiB0aGlzLiRlbWl0KFwiY2hhbmdlXCIsIGV2dCkpO1xuICAgIH0sXG4gICAgYWx0ZXJMaXN0KG9uTGlzdCkge1xuICAgICAgaWYgKHRoaXMubGlzdCkge1xuICAgICAgICBvbkxpc3QodGhpcy5saXN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3TGlzdCA9IFsuLi50aGlzLm1vZGVsVmFsdWVdO1xuICAgICAgb25MaXN0KG5ld0xpc3QpO1xuICAgICAgdGhpcy4kZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIG5ld0xpc3QpO1xuICAgIH0sXG4gICAgc3BsaWNlTGlzdCgpIHtcbiAgICAgIGNvbnN0IHNwbGljZUxpc3QgPSAobGlzdCkgPT4gbGlzdC5zcGxpY2UoLi4uYXJndW1lbnRzKTtcbiAgICAgIHRoaXMuYWx0ZXJMaXN0KHNwbGljZUxpc3QpO1xuICAgIH0sXG4gICAgdXBkYXRlUG9zaXRpb24ob2xkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgICBjb25zdCB1cGRhdGVQb3NpdGlvbiA9IChsaXN0KSA9PiBsaXN0LnNwbGljZShuZXdJbmRleCwgMCwgbGlzdC5zcGxpY2Uob2xkSW5kZXgsIDEpWzBdKTtcbiAgICAgIHRoaXMuYWx0ZXJMaXN0KHVwZGF0ZVBvc2l0aW9uKTtcbiAgICB9LFxuICAgIGdldFJlbGF0ZWRDb250ZXh0RnJvbU1vdmVFdmVudCh7IHRvLCByZWxhdGVkIH0pIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZ2V0VW5kZXJseWluZ1BvdGVuY2lhbERyYWdnYWJsZUNvbXBvbmVudCh0byk7XG4gICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4geyBjb21wb25lbnQgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxpc3QgPSBjb21wb25lbnQucmVhbExpc3Q7XG4gICAgICBjb25zdCBjb250ZXh0ID0geyBsaXN0LCBjb21wb25lbnQgfTtcbiAgICAgIGlmICh0byAhPT0gcmVsYXRlZCAmJiBsaXN0KSB7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gY29tcG9uZW50LmdldFVuZGVybHlpbmdWbShyZWxhdGVkKSB8fCB7fTtcbiAgICAgICAgcmV0dXJuIF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHt9LCBkZXN0aW5hdGlvbiksIGNvbnRleHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfSxcbiAgICBnZXRWbUluZGV4RnJvbURvbUluZGV4KGRvbUluZGV4KSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTdHJ1Y3R1cmUuZ2V0Vm1JbmRleEZyb21Eb21JbmRleChkb21JbmRleCwgdGhpcy50YXJnZXREb21FbGVtZW50KTtcbiAgICB9LFxuICAgIG9uRHJhZ1N0YXJ0KGV2dCkge1xuICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5nZXRVbmRlcmx5aW5nVm0oZXZ0Lml0ZW0pO1xuICAgICAgZXZ0Lml0ZW0uX3VuZGVybHlpbmdfdm1fID0gdGhpcy5jbG9uZSh0aGlzLmNvbnRleHQuZWxlbWVudCk7XG4gICAgICBkcmFnZ2luZ0VsZW1lbnQgPSBldnQuaXRlbTtcbiAgICB9LFxuICAgIG9uRHJhZ0FkZChldnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBldnQuaXRlbS5fdW5kZXJseWluZ192bV87XG4gICAgICBpZiAoZWxlbWVudCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlbW92ZU5vZGUoZXZ0Lml0ZW0pO1xuICAgICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmdldFZtSW5kZXhGcm9tRG9tSW5kZXgoZXZ0Lm5ld0luZGV4KTtcbiAgICAgIHRoaXMuc3BsaWNlTGlzdChuZXdJbmRleCwgMCwgZWxlbWVudCk7XG4gICAgICBjb25zdCBhZGRlZCA9IHsgZWxlbWVudCwgbmV3SW5kZXggfTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZXMoeyBhZGRlZCB9KTtcbiAgICB9LFxuICAgIG9uRHJhZ1JlbW92ZShldnQpIHtcbiAgICAgIGluc2VydE5vZGVBdCh0aGlzLiRlbCwgZXZ0Lml0ZW0sIGV2dC5vbGRJbmRleCk7XG4gICAgICBpZiAoZXZ0LnB1bGxNb2RlID09PSBcImNsb25lXCIpIHtcbiAgICAgICAgcmVtb3ZlTm9kZShldnQuY2xvbmUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IGluZGV4OiBvbGRJbmRleCwgZWxlbWVudCB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgdGhpcy5zcGxpY2VMaXN0KG9sZEluZGV4LCAxKTtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSB7IGVsZW1lbnQsIG9sZEluZGV4IH07XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VzKHsgcmVtb3ZlZCB9KTtcbiAgICB9LFxuICAgIG9uRHJhZ1VwZGF0ZShldnQpIHtcbiAgICAgIHJlbW92ZU5vZGUoZXZ0Lml0ZW0pO1xuICAgICAgaW5zZXJ0Tm9kZUF0KGV2dC5mcm9tLCBldnQuaXRlbSwgZXZ0Lm9sZEluZGV4KTtcbiAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy5jb250ZXh0LmluZGV4O1xuICAgICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLmdldFZtSW5kZXhGcm9tRG9tSW5kZXgoZXZ0Lm5ld0luZGV4KTtcbiAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24ob2xkSW5kZXgsIG5ld0luZGV4KTtcbiAgICAgIGNvbnN0IG1vdmVkID0geyBlbGVtZW50OiB0aGlzLmNvbnRleHQuZWxlbWVudCwgb2xkSW5kZXgsIG5ld0luZGV4IH07XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VzKHsgbW92ZWQgfSk7XG4gICAgfSxcbiAgICBjb21wdXRlRnV0dXJlSW5kZXgocmVsYXRlZENvbnRleHQsIGV2dCkge1xuICAgICAgaWYgKCFyZWxhdGVkQ29udGV4dC5lbGVtZW50KSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgY29uc3QgZG9tQ2hpbGRyZW4gPSBbLi4uZXZ0LnRvLmNoaWxkcmVuXS5maWx0ZXIoKGVsKSA9PiBlbC5zdHlsZVtcImRpc3BsYXlcIl0gIT09IFwibm9uZVwiKTtcbiAgICAgIGNvbnN0IGN1cnJlbnREb21JbmRleCA9IGRvbUNoaWxkcmVuLmluZGV4T2YoZXZ0LnJlbGF0ZWQpO1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gcmVsYXRlZENvbnRleHQuY29tcG9uZW50LmdldFZtSW5kZXhGcm9tRG9tSW5kZXgoY3VycmVudERvbUluZGV4KTtcbiAgICAgIGNvbnN0IGRyYWdnZWRJbkxpc3QgPSBkb21DaGlsZHJlbi5pbmRleE9mKGRyYWdnaW5nRWxlbWVudCkgIT09IC0xO1xuICAgICAgcmV0dXJuIGRyYWdnZWRJbkxpc3QgfHwgIWV2dC53aWxsSW5zZXJ0QWZ0ZXIgPyBjdXJyZW50SW5kZXggOiBjdXJyZW50SW5kZXggKyAxO1xuICAgIH0sXG4gICAgb25EcmFnTW92ZShldnQsIG9yaWdpbmFsRXZlbnQpIHtcbiAgICAgIGNvbnN0IHsgbW92ZSwgcmVhbExpc3QgfSA9IHRoaXM7XG4gICAgICBpZiAoIW1vdmUgfHwgIXJlYWxMaXN0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRlZENvbnRleHQgPSB0aGlzLmdldFJlbGF0ZWRDb250ZXh0RnJvbU1vdmVFdmVudChldnQpO1xuICAgICAgY29uc3QgZnV0dXJlSW5kZXggPSB0aGlzLmNvbXB1dGVGdXR1cmVJbmRleChyZWxhdGVkQ29udGV4dCwgZXZ0KTtcbiAgICAgIGNvbnN0IGRyYWdnZWRDb250ZXh0ID0gX19zcHJlYWRQcm9wcyhfX3NwcmVhZFZhbHVlcyh7fSwgdGhpcy5jb250ZXh0KSwge1xuICAgICAgICBmdXR1cmVJbmRleFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzZW5kRXZlbnQgPSBfX3NwcmVhZFByb3BzKF9fc3ByZWFkVmFsdWVzKHt9LCBldnQpLCB7XG4gICAgICAgIHJlbGF0ZWRDb250ZXh0LFxuICAgICAgICBkcmFnZ2VkQ29udGV4dFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbW92ZShzZW5kRXZlbnQsIG9yaWdpbmFsRXZlbnQpO1xuICAgIH0sXG4gICAgb25EcmFnRW5kKCkge1xuICAgICAgZHJhZ2dpbmdFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn0pO1xuZXhwb3J0IHsgZHJhZ2dhYmxlQ29tcG9uZW50IGFzIGRlZmF1bHQgfTtcbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudCA6aXM9XCJ1aS5idXR0b25Hcm91cC5uYW1lXCIgY2xhc3M9XCJmcy10YWJsZS1jb2x1bW5zLWZpeGVkLWNvbnRyb2xsZXJcIj5cbiAgICA8ZnMtYnV0dG9uXG4gICAgICB2LWZvcj1cIm9wdGlvbiBvZiBvcHRpb25zXCJcbiAgICAgIDprZXk9XCJvcHRpb24uaWNvblwiXG4gICAgICA6dHlwZT1cIm1vZGVsVmFsdWUgPT09IG9wdGlvbi52YWx1ZSA/ICdwcmltYXJ5JyA6ICdkZWZhdWx0J1wiXG4gICAgICA6aWNvbj1cIm9wdGlvbi5pY29uXCJcbiAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICBAY2xpY2s9XCJzdWJtaXQob3B0aW9uLnZhbHVlKVwiXG4gICAgLz5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgcmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdXNlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNUYWJsZUNvbHVtbnNGaXhlZENvbnRyb2xsZXJcIixcbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcInVwZGF0ZTptb2RlbFZhbHVlXCIsIFwiY2hhbmdlXCJdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCBvcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiBcImxlZnRcIixcbiAgICAgICAgICBpY29uOiB1aS5pY29ucy5sZWZ0IC8vICdlbC1pY29uLWFycm93LWxlZnQnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgICAgaWNvbjogdWkuaWNvbnMuY2xvc2UgLy8gJ2VsLWljb24tY2xvc2UnXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogXCJyaWdodFwiLFxuICAgICAgICAgIGljb246IHVpLmljb25zLnJpZ2h0IC8vICdlbC1pY29uLWFycm93LXJpZ2h0J1xuICAgICAgICB9XG4gICAgICBdO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gc3VibWl0KHZhbHVlOiBhbnkpIHtcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgdmFsdWUpO1xuICAgICAgY3R4LmVtaXQoXCJjaGFuZ2VcIiwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICBvcHRpb25zLFxuICAgICAgc3VibWl0XG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyIHtcbiAgLmZzLWJ1dHRvbiB7XG4gICAgcGFkZGluZzogMnB4ICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiAxMHB4O1xuICAgIG1pbi1oZWlnaHQ6IGF1dG87XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnQgOmlzPVwidWkuYnV0dG9uR3JvdXAubmFtZVwiIGNsYXNzPVwiZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyXCI+XG4gICAgPGZzLWJ1dHRvblxuICAgICAgdi1mb3I9XCJvcHRpb24gb2Ygb3B0aW9uc1wiXG4gICAgICA6a2V5PVwib3B0aW9uLmljb25cIlxuICAgICAgOnR5cGU9XCJtb2RlbFZhbHVlID09PSBvcHRpb24udmFsdWUgPyAncHJpbWFyeScgOiAnZGVmYXVsdCdcIlxuICAgICAgOmljb249XCJvcHRpb24uaWNvblwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgQGNsaWNrPVwic3VibWl0KG9wdGlvbi52YWx1ZSlcIlxuICAgIC8+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3VzZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzVGFibGVDb2x1bW5zRml4ZWRDb250cm9sbGVyXCIsXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZToge1xuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBcImNoYW5nZVwiXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogXCJsZWZ0XCIsXG4gICAgICAgICAgaWNvbjogdWkuaWNvbnMubGVmdCAvLyAnZWwtaWNvbi1hcnJvdy1sZWZ0J1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICAgIGljb246IHVpLmljb25zLmNsb3NlIC8vICdlbC1pY29uLWNsb3NlJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IFwicmlnaHRcIixcbiAgICAgICAgICBpY29uOiB1aS5pY29ucy5yaWdodCAvLyAnZWwtaWNvbi1hcnJvdy1yaWdodCdcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHN1Ym1pdCh2YWx1ZTogYW55KSB7XG4gICAgICBjdHguZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHN1Ym1pdFxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlciB7XG4gIC5mcy1idXR0b24ge1xuICAgIHBhZGRpbmc6IDJweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICBtaW4taGVpZ2h0OiBhdXRvO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZHJhZ2dhYmxlIDpsaXN0PVwiY29sdW1uc1wiIGl0ZW0ta2V5PVwia2V5XCIgOm1vdmU9XCJvbkRyYWdnYWJsZU1vdmVcIj5cbiAgICA8dGVtcGxhdGUgI2l0ZW09XCJ7IGVsZW1lbnQsIGluZGV4IH1cIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICB2LXNob3c9XCJvcmlnaW5hbENvbHVtbnNNYXBbZWxlbWVudC5fX2tleV0/Ll9fc2hvdyAhPT0gZmFsc2VcIlxuICAgICAgICAgIDp0aXRsZT1cImJ1aWxkVGV4dChlbGVtZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJjb21wb25lbnQtLWxpc3QtaXRlbVwiXG4gICAgICAgICAgZmxleD1cIm1haW46anVzdGlmeSBjcm9zczpjZW50ZXJcIlxuICAgICAgICAgIDppPVwiaW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgOmlzPVwidWkuY2hlY2tib3gubmFtZVwiXG4gICAgICAgICAgICA6W3VpLmNoZWNrYm94Lm1vZGVsVmFsdWVdPVwiZWxlbWVudC5zaG93XCJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cIm9yaWdpbmFsQ29sdW1uc01hcFtlbGVtZW50Ll9fa2V5XT8uX19kaXNhYmxlZCA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cIml0ZW0tbGFiZWxcIlxuICAgICAgICAgICAgOnRpdGxlPVwiYnVpbGRUZXh0KGVsZW1lbnQpXCJcbiAgICAgICAgICAgIEBbYnVpbGRVcGRhdGVLZXkodWkuY2hlY2tib3gubW9kZWxWYWx1ZSldPVwidXBkYXRlQ2hlY2tlZChlbGVtZW50KVwiXG4gICAgICAgICAgICBAY2hhbmdlPVwib25DaGVja0NoYW5nZWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGJ1aWxkVGV4dChlbGVtZW50KSB9fVxuICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLXJpZ2h0XCI+XG4gICAgICAgICAgICA8ZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyXG4gICAgICAgICAgICAgIHYtaWY9XCJpc1Jvb3RcIlxuICAgICAgICAgICAgICB2LW1vZGVsPVwiZWxlbWVudC5maXhlZFwiXG4gICAgICAgICAgICAgIGZsZXgtYm94PVwiMFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZDItbXItMTBcIlxuICAgICAgICAgICAgICBAY2hhbmdlPVwiZml4ZWRDaGFuZ2UoaW5kZXgsICRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgZmxleC1ib3g9XCIwXCIgY2xhc3M9XCJjb21wb25lbnQtLWxpc3QtaXRlbS1oYW5kbGUgaGFuZGxlXCI+XG4gICAgICAgICAgICAgIDxmcy1pY29uIDppY29uPVwidWkuaWNvbnMuc29ydFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMjBweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyBib3JkZXItbGVmdDogMXB4IHNvbGlkICNlZWVcIj5cbiAgICAgICAgICA8ZnMtY29sdW1ucy1maWx0ZXItbmVzdC1saXN0XG4gICAgICAgICAgICB2LWlmPVwiZWxlbWVudC5jaGlsZHJlblwiXG4gICAgICAgICAgICA6Y29sdW1ucz1cImVsZW1lbnQuY2hpbGRyZW5cIlxuICAgICAgICAgICAgQGNoZWNrLWNoYW5nZWQ9XCJvbkNoZWNrQ2hhbmdlZFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuICA8L2RyYWdnYWJsZT5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxuLy/kuI3opoHliKBcbi8vQHRzLWlnbm9yZVxuaW1wb3J0IGRyYWdnYWJsZSBmcm9tIFwidnVlZHJhZ2dhYmxlLWVzXCI7XG5pbXBvcnQgRnNUYWJsZUNvbHVtbnNGaXhlZENvbnRyb2xsZXIgZnJvbSBcIi4vZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyL2luZGV4LnZ1ZVwiO1xuaW1wb3J0IHsgQ29sdW1uc0ZpbHRlckNvbnRleHQsIENvbHVtbnNGaWx0ZXJJdGVtLCBDb2x1bW5zRmlsdGVyUHJvdmlkZUtleSB9IGZyb20gXCIuLi8uLi8uLi9kXCI7XG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCJAZmFzdC1jcnVkL3VpLWludGVyZmFjZVwiO1xuXG5jb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuY29uc3QgZW1pdHMgPSBkZWZpbmVFbWl0cyhbXCJjaGVjay1jaGFuZ2VkXCIsIFwiZml4ZWQtY2hhbmdlZFwiXSk7XG50eXBlIE5lc3RMaXN0UHJvcHMgPSB7XG4gIGNvbHVtbnM6IENvbHVtbnNGaWx0ZXJJdGVtW107XG4gIGlzUm9vdD86IGJvb2xlYW47XG59O1xuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoZGVmaW5lUHJvcHM8TmVzdExpc3RQcm9wcz4oKSwge1xuICBpc1Jvb3Q6IGZhbHNlXG59KTtcbmNvbnN0IHsgb3JpZ2luYWxDb2x1bW5zLCBjdXJyZW50Q29sdW1ucywgb3JpZ2luYWxDb2x1bW5zTWFwLCB0ZXh0LCBhY3RpdmUgfSA9XG4gIGluamVjdDxDb2x1bW5zRmlsdGVyQ29udGV4dD4oQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXkpO1xuZnVuY3Rpb24gYnVpbGRUZXh0KGVsZW1lbnQ6IGFueSkge1xuICByZXR1cm4gZWxlbWVudC5sYWJlbCB8fCBlbGVtZW50LnRpdGxlIHx8IGVsZW1lbnQua2V5IHx8IHRleHQudmFsdWUudW5uYW1lZDtcbn1cblxuZnVuY3Rpb24gb25EcmFnZ2FibGVNb3ZlKGU6IGFueSkge1xuICBjb25zdCBkcmFnZWQgPSBlLmRyYWdnZWRDb250ZXh0LmVsZW1lbnQ7XG4gIGNvbnN0IHRhcmdldCA9IGUucmVsYXRlZENvbnRleHQuZWxlbWVudDtcbiAgY29uc3Qgc29ydGVkOiBDb2x1bW5zRmlsdGVySXRlbVtdID0gW107XG4gIGZvciAoY29uc3QgaXRlbSBvZiBjdXJyZW50Q29sdW1ucy52YWx1ZSkge1xuICAgIGlmIChpdGVtLmtleSA9PT0gZHJhZ2VkLmtleSkge1xuICAgICAgc29ydGVkLnB1c2godGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0ua2V5ID09PSB0YXJnZXQua2V5KSB7XG4gICAgICBzb3J0ZWQucHVzaChkcmFnZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3J0ZWQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgLy/nnItrZXnnmoTmjpLliJfmmK/lkKbmraPluLhcbiAgbGV0IGxlZnRJbmRleCA9IDA7XG4gIGxldCByaWdodEluZGV4ID0gc29ydGVkLmxlbmd0aCAtIDE7XG4gIGxldCBtaW5Ob3RJbmRleCA9IHNvcnRlZC5sZW5ndGggLSAxO1xuICBsZXQgbWF4Tm90SW5kZXggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGl0ZW0gPSBzb3J0ZWRbaV07XG4gICAgaWYgKGl0ZW0uZml4ZWQgPT09IFwibGVmdFwiKSB7XG4gICAgICBsZWZ0SW5kZXggPSBpO1xuICAgIH0gZWxzZSBpZiAoaXRlbS5maXhlZCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICByaWdodEluZGV4ID0gcmlnaHRJbmRleCA+IGkgPyBpIDogcmlnaHRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgbWluTm90SW5kZXggPSBtaW5Ob3RJbmRleCA+IGkgPyBpIDogbWluTm90SW5kZXg7XG4gICAgICBtYXhOb3RJbmRleCA9IG1heE5vdEluZGV4IDwgaSA/IGkgOiBtYXhOb3RJbmRleDtcbiAgICB9XG4gIH1cblxuICBpZiAobWluTm90SW5kZXggPCBsZWZ0SW5kZXggfHwgbWF4Tm90SW5kZXggPiByaWdodEluZGV4KSB7XG4gICAgLy91aS5tZXNzYWdlLmVycm9yKFwi6Z2eZml4ZWTlrZfmrrXkuI3lvpfotorov4dmaXhlZOWtl+auteeahOmhuuW6j1wiKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGJ1aWxkVXBkYXRlS2V5KGtleSkge1xuICByZXR1cm4gXCJ1cGRhdGU6XCIgKyBrZXk7XG59XG5cbmZ1bmN0aW9uIGZpbmRGcm9tVHJlZSh0cmVlOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcbiAgZm9yIChjb25zdCBpdGVtIG9mIHRyZWUpIHtcbiAgICBpZiAoaXRlbS5rZXkgPT09IGtleSkge1xuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBmaW5kRnJvbVRyZWUoaXRlbS5jaGlsZHJlbiwga2V5KTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVDaGVja2VkKGVsZW1lbnQ6IGFueSkge1xuICBlbGVtZW50LnNob3cgPSAhZWxlbWVudC5zaG93O1xuICAvL+e6p+iBlOmAieS4reWSjOWPlua2iFxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuKGVsZW1lbnQ6IGFueSkge1xuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7XG4gICAgICBlbGVtZW50LmNoaWxkcmVuLmZvckVhY2goKGU6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWUuX19zaG93IHx8IGUuX19kaXNhYmxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlLnNob3cgPSBlbGVtZW50LnNob3c7XG4gICAgICAgIHVwZGF0ZUNoaWxkcmVuKGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZUNoaWxkcmVuKGVsZW1lbnQpO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZVBhcmVudChlbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQuX19wYXJlbnQpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQuX19wYXJlbnQ7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5zaG93ID0gcGFyZW50LmNoaWxkcmVuLmZpbHRlcigoZTogYW55KSA9PiBlLl9fc2hvdyAmJiBlLnNob3cgPT09IHRydWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIHVwZGF0ZVBhcmVudChwYXJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1cGRhdGVQYXJlbnQoZWxlbWVudCk7XG59XG5mdW5jdGlvbiBvbkNoZWNrQ2hhbmdlZCgpIHtcbiAgZW1pdHMoXCJjaGVjay1jaGFuZ2VkXCIpO1xufVxuZnVuY3Rpb24gZml4ZWRDaGFuZ2UoaW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSkge1xuICBlbWl0cyhcImZpeGVkLWNoYW5nZWRcIiwgaW5kZXgsIHZhbHVlKTtcbn1cbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50XG4gICAgOmlzPVwidWkuZHJhd2VyLm5hbWVcIlxuICAgIGNsYXNzPVwiZnMtY29sdW1ucy1maWx0ZXItbGF5b3V0LWRlZmF1bHRcIlxuICAgIDp0aXRsZT1cInRleHQudGl0bGVcIlxuICAgIHYtYmluZD1cImRyYXdlckJpbmRcIlxuICAgIGFwcGVuZC10by1ib2R5XG4gID5cbiAgICA8Y29tcG9uZW50XG4gICAgICA6aXM9XCJ1aS5kcmF3ZXIuaGFzQ29udGVudFdyYXAgfHwgJ2RpdidcIlxuICAgICAgY2xhc3M9XCJmcy1kcmF3ZXItd3JhcHBlciBmcy10YWJsZS1jb2x1bW5zLWZpbHRlclwiXG4gICAgICA6dGl0bGU9XCJ0ZXh0LnRpdGxlXCJcbiAgICA+XG4gICAgICA8Y29tcG9uZW50IDppcz1cInVpLmNhcmQubmFtZVwiIHNoYWRvdz1cIm5ldmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtLWxpc3RcIj5cbiAgICAgICAgICA8ZGl2IGtleT1cIl9fZmlyc3RfX1wiIGNsYXNzPVwiY29tcG9uZW50LS1saXN0LWl0ZW1cIiBmbGV4PVwibWFpbjpqdXN0aWZ5IGNyb3NzOmNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4gOnNwYW49XCIxMlwiPlxuICAgICAgICAgICAgICA8IS0tIOWFqOmAiSDlj43pgIkgLS0+XG4gICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuY2hlY2tib3gubmFtZVwiIDppbmRldGVybWluYXRlPVwiaXNJbmRldGVybWluYXRlXCIgdi1iaW5kPVwiY2hlY2tBbGxCaW5kXCI+XG4gICAgICAgICAgICAgICAge3sgc2hvd0xlbmd0aCB9fSAvIHt7IGFsbExlbmd0aCB9fVxuICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eyB0ZXh0LmZpeGVkIH19IC8ge3sgdGV4dC5vcmRlciB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxmcy1jb2x1bW5zLWZpbHRlci1uZXN0LWxpc3RcbiAgICAgICAgICAgIDpjb2x1bW5zPVwiY3VycmVudENvbHVtbnNcIlxuICAgICAgICAgICAgOmlzLXJvb3Q9XCJ0cnVlXCJcbiAgICAgICAgICAgIEBjaGVjay1jaGFuZ2VkPVwiYWxsQ2hlY2tlZFVwZGF0ZVwiXG4gICAgICAgICAgICBAZml4ZWQtY2hhbmdlZD1cImZpeGVkQ2hhbmdlXCJcbiAgICAgICAgICA+PC9mcy1jb2x1bW5zLWZpbHRlci1uZXN0LWxpc3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgICA8c2xvdCBuYW1lPVwiYnV0dG9uc1wiPjwvc2xvdD5cbiAgICA8L2NvbXBvbmVudD5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG4vL+S4jeimgeWIoFxuLy9AdHMtaWdub3JlXG5pbXBvcnQgZHJhZ2dhYmxlIGZyb20gXCJ2dWVkcmFnZ2FibGUtZXNcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uLy4uL3VzZVwiO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGluamVjdCwgcmVmLCB3YXRjaCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IENvbHVtbnNGaWx0ZXJQcm92aWRlS2V5LCBDb2x1bW5zRmlsdGVyQ29udGV4dCwgQ29sdW1uc0ZpbHRlckNvbnRhaW5lclByb3BzIH0gZnJvbSBcIi4uLy4uLy4uL2QvXCI7XG5pbXBvcnQgRnNDb2x1bW5zRmlsdGVyTmVzdExpc3QgZnJvbSBcIi4vZnMtY29sdW1ucy1maWx0ZXItbmVzdC1saXN0LnZ1ZVwiO1xuXG5jb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuXG5jb25zdCB7IG9yaWdpbmFsQ29sdW1ucywgY3VycmVudENvbHVtbnMsIHRleHQsIGFjdGl2ZSB9ID0gaW5qZWN0PENvbHVtbnNGaWx0ZXJDb250ZXh0PihDb2x1bW5zRmlsdGVyUHJvdmlkZUtleSk7XG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPENvbHVtbnNGaWx0ZXJDb250YWluZXJQcm9wcz4oKTtcbmNvbnN0IGRyYXdlckJpbmQgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiBtZXJnZShcbiAgICB7XG4gICAgICBbdWkuZHJhd2VyLnZpc2libGVdOiBhY3RpdmUudmFsdWUsXG4gICAgICBbXCJvblVwZGF0ZTpcIiArIHVpLmRyYXdlci52aXNpYmxlXTogKGU6IGFueSkgPT4ge1xuICAgICAgICBhY3RpdmUudmFsdWUgPSBlO1xuICAgICAgfSxcbiAgICAgIFt1aS5kcmF3ZXIud2lkdGhdOiBwcm9wcy53aWR0aCB8fCBcIjQwMHB4XCJcbiAgICB9LFxuICAgIHByb3BzLmRyYXdlclxuICApO1xufSk7XG5cbmNvbnN0IGNoZWNrQWxsID0gcmVmKGZhbHNlKTtcbi8vIOWFqOmAieWSjOWPjemAieWPkeeUn+WPmOWMluaXtuinpuWPkVxuZnVuY3Rpb24gb25DaGVja0FsbENoYW5nZSh2YWx1ZTogYW55KSB7XG4gIGNoZWNrQWxsLnZhbHVlID0gdmFsdWU7XG4gIGN1cnJlbnRDb2x1bW5zLnZhbHVlID0gY3VycmVudENvbHVtbnMudmFsdWUubWFwKChlOiBhbnkpID0+IHtcbiAgICBpZiAoIWUuX19zaG93IHx8IGUuX19kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIGUuc2hvdyA9IHZhbHVlO1xuICAgIHJldHVybiBlO1xuICB9KTtcbn1cblxuY29uc3QgY2hlY2tBbGxCaW5kID0gY29tcHV0ZWQoKCkgPT4ge1xuICByZXR1cm4ge1xuICAgIFt1aS5jaGVja2JveC5tb2RlbFZhbHVlXTogY2hlY2tBbGwudmFsdWUsXG4gICAgW1wib25VcGRhdGU6XCIgKyB1aS5jaGVja2JveC5tb2RlbFZhbHVlXTogKHY6IGFueSkgPT4ge1xuICAgICAgb25DaGVja0FsbENoYW5nZSh2KTtcbiAgICB9XG4gIH07XG59KTtcblxuY29uc3Qgc2hvd0xlbmd0aCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIGN1cnJlbnRDb2x1bW5zLnZhbHVlLmZpbHRlcigoZTogYW55KSA9PiBlLl9fc2hvdyAmJiBlLnNob3cgPT09IHRydWUpLmxlbmd0aDtcbn0pO1xuY29uc3QgYWxsTGVuZ3RoID0gY29tcHV0ZWQoKCkgPT4ge1xuICByZXR1cm4gY3VycmVudENvbHVtbnMudmFsdWUuZmlsdGVyKChlOiBhbnkpID0+IGUuX19zaG93KS5sZW5ndGg7XG59KTtcbmNvbnN0IGlzSW5kZXRlcm1pbmF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIHNob3dMZW5ndGgudmFsdWUgPiAwICYmIHNob3dMZW5ndGgudmFsdWUgPCBhbGxMZW5ndGgudmFsdWU7XG59KTtcblxud2F0Y2goXG4gICgpID0+IHtcbiAgICBjdXJyZW50Q29sdW1ucy52YWx1ZTtcbiAgfSxcbiAgKCkgPT4ge1xuICAgIGFsbENoZWNrZWRVcGRhdGUoKTtcbiAgfSxcbiAgeyBpbW1lZGlhdGU6IHRydWUgfVxuKTtcblxuLy8gZml4ZWQg5Y+Y5YyW5pe26Kem5Y+RXG5mdW5jdGlvbiBmaXhlZENoYW5nZShpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KSB7XG4gIGlmICh2YWx1ZSkge1xuICAgIGN1cnJlbnRDb2x1bW5zLnZhbHVlW2luZGV4XS5zaG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT09IFwibGVmdFwiKSB7XG4gICAgY3VycmVudENvbHVtbnMudmFsdWUudW5zaGlmdChjdXJyZW50Q29sdW1ucy52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpWzBdKTtcbiAgfVxuICBpZiAodmFsdWUgPT09IFwicmlnaHRcIikge1xuICAgIGN1cnJlbnRDb2x1bW5zLnZhbHVlLnB1c2goY3VycmVudENvbHVtbnMudmFsdWUuc3BsaWNlKGluZGV4LCAxKVswXSk7XG4gIH1cbiAgYWxsQ2hlY2tlZFVwZGF0ZSgpO1xufVxuZnVuY3Rpb24gYWxsQ2hlY2tlZFVwZGF0ZSgpIHtcbiAgY2hlY2tBbGwudmFsdWUgPSBzaG93TGVuZ3RoLnZhbHVlID09PSBhbGxMZW5ndGgudmFsdWU7XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+PC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLWJ0bnNcIj5cbiAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIj5cbiAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gYnV0dG9uc1wiIDprZXk9XCJpbmRleFwiPlxuICAgICAgICA8ZnMtYnV0dG9uIHYtaWY9XCJpdGVtLnNob3dcIiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrPVwiaXRlbS5fY2xpY2soJGV2ZW50KVwiIC8+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvY29tcG9uZW50PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNTZWFyY2hCdXR0b25zXCIsXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG4gIHByb3BzOiB7XG4gICAgYnV0dG9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfVxuICB9LFxuICBzZXR1cCgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIHJldHVybiB7IHVpIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1idG5zXCI+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGJ1dHRvbnNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgPGZzLWJ1dHRvbiB2LWlmPVwiaXRlbS5zaG93XCIgdi1iaW5kPVwiaXRlbVwiIEBjbGljaz1cIml0ZW0uX2NsaWNrKCRldmVudClcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2NvbXBvbmVudD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzU2VhcmNoQnV0dG9uc1wiLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wczoge1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH1cbiAgfSxcbiAgc2V0dXAoKSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICByZXR1cm4geyB1aSB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoIGZzLXNlYXJjaC12MlwiPlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkuY29sbGFwc2VUcmFuc2l0aW9uLm5hbWVcIj5cbiAgICAgIDxjb21wb25lbnRcbiAgICAgICAgOmlzPVwidWkuZm9ybS5uYW1lXCJcbiAgICAgICAgcmVmPVwic2VhcmNoRm9ybVJlZlwiXG4gICAgICAgIDptb2RlbD1cImZvcm1EYXRhXCJcbiAgICAgICAgb25zdWJtaXQ9XCJldmVudC5wcmV2ZW50RGVmYXVsdCgpO1wiXG4gICAgICAgIHYtYmluZD1cIm9wdGlvbnNcIlxuICAgICAgICA6cnVsZXM9XCJjb21wdXRlZFJ1bGVzXCJcbiAgICAgICAgY2xhc3M9XCJmcy1zZWFyY2gtZm9ybVwiXG4gICAgICA+XG4gICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICA6aXM9XCJjb250YWluZXI/LmlzIHx8ICdmcy1zZWFyY2gtbGF5b3V0LWRlZmF1bHQnXCJcbiAgICAgICAgICB2LWlmPVwic2hvdyAhPT0gZmFsc2VcIlxuICAgICAgICAgIHYtYmluZD1cImNvbnRhaW5lclwiXG4gICAgICAgICAgOmNvbHVtbnM9XCJjb21wdXRlZENvbHVtbnNcIlxuICAgICAgICAgIDpnZXQtY29udGV4dC1mbj1cImdldENvbnRleHRGblwiXG4gICAgICAgID5cbiAgICAgICAgICA8dGVtcGxhdGUgI3NlYXJjaC1idXR0b25zPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1idXR0b25zXCI+XG4gICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gY29tcHV0ZWRCdXR0b25zXCIgOmtleT1cImluZGV4XCI+XG4gICAgICAgICAgICAgICAgPGZzLWJ1dHRvbiB2LWlmPVwiaXRlbS5zaG93ICE9PSBmYWxzZVwiIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJpdGVtLl9jbGljaygpXCIgLz5cbiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG5cbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNsb3RzWydzZWFyY2gtbGVmdCddXCIgI3NlYXJjaC1sZWZ0PlxuICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtbGVmdCddXCIgOnNjb3BlPVwiZ2V0Q29udGV4dEZuKClcIiAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzbG90c1snc2VhcmNoLW1pZGRsZSddXCIgI3NlYXJjaC1taWRkbGU+XG4gICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1taWRkbGUnXVwiIDpzY29wZT1cImdldENvbnRleHRGbigpXCIgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2xvdHNbJ3NlYXJjaC1yaWdodCddXCIgI3NlYXJjaC1yaWdodD5cbiAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLXJpZ2h0J11cIiA6c2NvcGU9XCJnZXRDb250ZXh0Rm4oKVwiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICA8L2NvbXBvbmVudD5cbiAgICA8L2NvbXBvbmVudD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c3hcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCByZWFjdGl2ZSwgcmVmLCBSZWYsIHVucmVmLCB3YXRjaCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IGZvckVhY2gsIGNsb25lRGVlcCwgZWFjaCwga2V5cywgdW5zZXQsIHNldCwgc29ydEJ5LCBlbnRyaWVzLCBkZWJvdW5jZSwgZ2V0IGFzIExvZGFzaEdldCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IHVzZUNvbXB1dGUgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1jb21wdXRlXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IGxvZ2dlciBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5sb2dcIjtcbmltcG9ydCBGc1NlYXJjaEJ1dHRvbnMgZnJvbSBcIi4vYnV0dG9ucy52dWVcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgQnV0dG9uc1Byb3BzLFxuICBTZWFyY2hFdmVudENvbnRleHQsXG4gIFNlYXJjaEl0ZW1Qcm9wcyxcbiAgVHlwZU1hcCxcbiAgVmFsdWVDaGFuZ2VDb250ZXh0LFxuICBWYWx1ZUNoYW5nZUhhbmRsZVxufSBmcm9tIFwiLi4vLi4vZFwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS11aVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1tZXJnZVwiO1xuXG4vKipcbiAqIOafpeivouahhue7hOS7tlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzU2VhcmNoXCIsXG4gIGNvbXBvbmVudHM6IHsgRnNTZWFyY2hCdXR0b25zIH0sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5biD5bGA5a655ZmoXG4gICAgICovXG4gICAgY29udGFpbmVyOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWIneWni+afpeivouadoeS7tlxuICAgICAqIOeCueWHu+mHjee9ru+8jOS8mumHjee9ruaIkOivpeadoeS7tlxuICAgICAqL1xuICAgIGluaXRpYWxGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOagoemqjOWQjueahOafpeivouihqOWNleaVsOaNrlxuICAgICAqL1xuICAgIHZhbGlkYXRlZEZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6KGo5Y2V5Y+C5pWwXG4gICAgICog5pSv5oyBZWwtZm9ybSB8IGEtZm9ybeeahOWxnuaAp1xuICAgICAqL1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5p+l6K+i5a2X5q616YWN572uXG4gICAgICovXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmjInpkq7phY3nva4s5Y+v5Lul5qC55o2ub3JkZXLmjpLluo9cbiAgICAgKiBge3NlYXJjaDp7Li4uRnNCdXR0b259LHJlc2V0OnsuLi5Gc0J1dHRvbn19YFxuICAgICAqL1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog54K55Ye76YeN572u5ZCO5piv5ZCm56uL5Y2z6Kem5Y+R5p+l6K+iXG4gICAgICovXG4gICAgc2VhcmNoQWZ0ZXJSZXNldDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuW8gOWQr+iHquWKqOafpeivolxuICAgICAqL1xuICAgIGF1dG9TZWFyY2g6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDoh6rliqjmn6Xor6LvvIzpmLLmipborr7nva5cbiAgICAgKiDkvKBmYWxzZeWImeWFs+mXreiHquWKqOafpeivolxuICAgICAqL1xuICAgIGRlYm91bmNlOiB7XG4gICAgICB0eXBlOiBbQm9vbGVhbiwgT2JqZWN0XSxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5o+S5qe9XG4gICAgICovXG4gICAgc2xvdHM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuaYvuekuuafpeivouahhlxuICAgICAqL1xuICAgIHNob3c6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKblkK/nlKjmoKHpqoxcbiAgICAgKi9cbiAgICB2YWxpZGF0ZToge1xuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5piv5ZCm5Lu75oSP5YC85Y+Y5YyW5bCx6Kem5Y+R5qCh6aqMXG4gICAgICovXG4gICAgdmFsaWRhdGVPbkNoYW5nZToge1xuICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgIHR5cGU6IEJvb2xlYW5cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWIl+eahOWuveW6puiuvue9ru+8jHNwYW49eHhcbiAgICAgKi9cbiAgICBjb2w6IHt9LFxuXG4gICAgLyoqXG4gICAgICog57uf5LiA5a2X5q6155qEZm9ybUl0ZW3lsZ7mgKdcbiAgICAgKi9cbiAgICBmb3JtSXRlbToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuICBlbWl0czogW1xuICAgIC8qKlxuICAgICAqIOafpeivouS6i+S7tlxuICAgICAqKi9cbiAgICBcInNlYXJjaFwiLFxuICAgIC8qKlxuICAgICAqIOafpeivouS6i+S7tu+8jOatpOS6i+S7tuS+m+ezu+e7n+iwg+eUqFxuICAgICAqL1xuICAgIFwiX3NlYXJjaFwiLFxuICAgIC8qKlxuICAgICAqIOmHjee9ruS6i+S7tu+8jOS+m+eUqOaIt+S9v+eUqFxuICAgICAqKi9cbiAgICBcInJlc2V0XCIsXG4gICAgLyoqXG4gICAgICog6YeN572u5LqL5Lu277yM5q2k5LqL5Lu25L6b57O757uf6LCD55SoXG4gICAgICovXG4gICAgXCJfcmVzZXRcIixcbiAgICAvKipcbiAgICAgKiDmoKHpqozlpLHotKXkuovku7ZcbiAgICAgKi9cbiAgICBcInZhbGlkYXRlLWVycm9yXCIsXG4gICAgLyoqXG4gICAgICog5qCh6aqM5ZCO55qE6KGo5Y2V5pWw5o2u5Y+Y5YyWXG4gICAgICovXG4gICAgXCJ1cGRhdGU6dmFsaWRhdGVkRm9ybVwiXG4gIF0sXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eDogYW55KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IGRvTWVyZ2UgPSBtZXJnZTtcbiAgICBjb25zdCB7IGRvQ29tcHV0ZWQsIEFzeW5jQ29tcHV0ZVZhbHVlLCBDb21wdXRlVmFsdWUgfSA9IHVzZUNvbXB1dGUoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNldHVwLXByb3BzLWRlc3RydWN0dXJlXG4gICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0udmFsdWUgIT0gbnVsbCAmJiAoaXRlbS52YWx1ZSBpbnN0YW5jZW9mIEFzeW5jQ29tcHV0ZVZhbHVlIHx8IGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBDb21wdXRlVmFsdWUpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwic2VhcmNoLnZhbHVl6YWN572u5LiN5pSv5oyBQ29tcHV0ZVZhbHVlL0FzeW5jQ29tcHV0Zeexu+Wei+eahOWKqOaAgeiuoeeul1wiKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxGb3JtKCk6IGFueSB7XG4gICAgICAvL+m7mOiupOWAvFxuICAgICAgY29uc3QgZm9ybTogYW55ID0ge307XG5cbiAgICAgIGZvckVhY2gocHJvcHMuY29sdW1ucywgKGNvbHVtbiwga2V5KSA9PiB7XG4gICAgICAgIGlmIChjb2x1bW4udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZWYWx1ZSA9IHVucmVmKGNvbHVtbi52YWx1ZSk7XG4gICAgICAgIGlmIChkZWZWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbi5zaG93ICE9PSBmYWxzZSAmJiBjb2x1bW4uY29tcG9uZW50Py5zaG93ICE9PSBmYWxzZSkge1xuICAgICAgICAgIC8v6buY6K6k5YC8XG4gICAgICAgICAgZm9ybVtrZXldID0gZGVmVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY2xvbmVEZWVwKG1lcmdlKHt9LCBwcm9wcy5pbml0aWFsRm9ybSwgZm9ybSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1EYXRhID0gcmVhY3RpdmUoY3JlYXRlSW5pdGlhbEZvcm0oKSk7XG5cbiAgICBsZXQgYXV0b1NlYXJjaDogYW55ID0gbnVsbDtcblxuICAgIGNvbnN0IGNvbXB1dGVkQ29sdW1uczogUmVmPFR5cGVNYXA8U2VhcmNoSXRlbVByb3BzPj4gPSBkb0NvbXB1dGVkKFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMuY29sdW1ucztcbiAgICAgIH0sXG4gICAgICBnZXRDb250ZXh0Rm4sXG4gICAgICBudWxsLFxuICAgICAgKGNvbHVtbnM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBmb3JtSXRlbSA9IGNsb25lRGVlcChwcm9wcy5mb3JtSXRlbSB8fCB7fSk7XG4gICAgICAgIGZvckVhY2goY29sdW1ucywgKGl0ZW0pID0+IHtcbiAgICAgICAgICBtZXJnZShpdGVtLCBmb3JtSXRlbSwgaXRlbSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjb2x1bW5zID0gbWVyZ2UoZm9ybUl0ZW0sIGNvbHVtbnMpO1xuICAgICAgICBpZiAoIXByb3BzLnZhbGlkYXRlKSB7XG4gICAgICAgICAgLy/lpoLmnpzlhbPpl612YWxpZGF0ZeWImeWOu+aOiXJ1bGVzXG4gICAgICAgICAgZm9yRWFjaChjb2x1bW5zLCAoaXRlbSkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIGl0ZW0ucnVsZXM7XG4gICAgICAgICAgICBkZWxldGUgaXRlbS5ydWxlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIOWQiOW5tmNvbFxuICAgICAgICBpZiAocHJvcHMuY29sKSB7XG4gICAgICAgICAgZm9yRWFjaChjb2x1bW5zLCAodikgPT4ge1xuICAgICAgICAgICAgdi5jb2wgPSBtZXJnZSh7fSwgcHJvcHMuY29sLCB2LmNvbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NlbGxSZW5kZXJcbiAgICAgICAgZm9yRWFjaChjb2x1bW5zLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIGl0ZW0uX2NlbGxSZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2VsbFJlbmRlcihpdGVtKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvL+Wtl+auteaOkuW6j1xuICAgICAgICBsZXQgc29ydEFycjogU2VhcmNoSXRlbVByb3BzW10gPSBbXTtcbiAgICAgICAgZm9yRWFjaChjb2x1bW5zLCAodiwga2V5KSA9PiB7XG4gICAgICAgICAgdi5fa2V5ID0ga2V5O1xuICAgICAgICAgIHNvcnRBcnIucHVzaCh2KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW0pID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzb3J0ZWRDb2x1bW5zOiB7XG4gICAgICAgICAgW2tleTogc3RyaW5nXTogU2VhcmNoSXRlbVByb3BzO1xuICAgICAgICB9ID0ge307XG5cbiAgICAgICAgc29ydEFyci5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgbGV0IF9rZXkgPSBpdGVtLl9rZXk7XG4gICAgICAgICAgZGVsZXRlIGl0ZW0uX2tleTtcbiAgICAgICAgICBzb3J0ZWRDb2x1bW5zW19rZXldID0gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzb3J0ZWRDb2x1bW5zO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBvbkZvcm1WYWxpZGF0ZWQoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0ZWRGb3JtID0gY2xvbmVEZWVwKGZvcm1EYXRhKTtcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOnZhbGlkYXRlZEZvcm1cIiwgdmFsaWRhdGVkRm9ybSk7XG4gICAgfVxuXG4gICAgd2F0Y2goXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9wcy52YWxpZGF0ZWRGb3JtO1xuICAgICAgfSxcbiAgICAgICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm1EYXRhKSB7XG4gICAgICAgICAgZGVsZXRlIGZvcm1EYXRhW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgbWVyZ2UoZm9ybURhdGEsIHZhbHVlIHx8IHt9KTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRlZXA6IHRydWVcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgZ2V0ID0gKGZvcm06IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBMb2Rhc2hHZXQoZm9ybSwga2V5KTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gc3BsaXRLZXkoa2V5OiBzdHJpbmcpIHtcbiAgICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5LmluZGV4T2YoXCIuXCIpID49IDApIHtcbiAgICAgICAgcmV0dXJuIGtleS5zcGxpdChcIi5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cblxuICAgIC8vIGNvbnN0IGRlYm91bmNlVmFsaWRhdGUgPSBkZWJvdW5jZShhc3luYyAoKSA9PiB7XG4gICAgLy8gICBpZiAoYXdhaXQgZG9WYWxpZGF0ZSgpKSB7XG4gICAgLy8gICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xuICAgIC8vICAgfVxuICAgIC8vIH0sIDUwMCk7XG5cbiAgICBmdW5jdGlvbiBjZWxsUmVuZGVyKGl0ZW06IGFueSkge1xuICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XG5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIF9vblVwZGF0ZU1vZGVsVmFsdWUoJGV2ZW50OiBhbnkpIHtcbiAgICAgICAgLy8gYXdhaXQgZGVib3VuY2VWYWxpZGF0ZSgpO1xuICAgICAgICBvblZhbHVlQ2hhbmdlZCgkZXZlbnQsIGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfb25JbnB1dCgpIHtcbiAgICAgICAgb25JbnB1dChpdGVtKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25LZXl1cChpdGVtOiBhbnksIGtleTogYW55KSB7XG4gICAgICAgIGlmIChrZXkuY29kZSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgIT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBkZWZhdWx0U2xvdDogYW55ID0gbnVsbDtcbiAgICAgIGlmIChwcm9wcy5zbG90c1tcInNlYXJjaF9cIiArIGtleV0pIHtcbiAgICAgICAgZGVmYXVsdFNsb3QgPSA8ZnMtc2xvdC1yZW5kZXIgc2xvdHM9e3Byb3BzLnNsb3RzW1wic2VhcmNoX1wiICsga2V5XX0gc2NvcGU9e2J1aWxkRmllbGRDb250ZXh0KGtleSl9IC8+O1xuICAgICAgfSBlbHNlIGlmIChpdGVtLnJlbmRlcikge1xuICAgICAgICBkZWZhdWx0U2xvdCA9IDxmcy1yZW5kZXIgcmVuZGVyLWZ1bmM9e2l0ZW0ucmVuZGVyfSBzY29wZT17YnVpbGRGaWVsZENvbnRleHQoa2V5KX0gLz47XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcG9uZW50ICYmIGl0ZW0uY29tcG9uZW50LnNob3cgIT09IGZhbHNlKSB7XG4gICAgICAgIGRlZmF1bHRTbG90ID0gKFxuICAgICAgICAgIDxmcy1jb21wb25lbnQtcmVuZGVyXG4gICAgICAgICAgICByZWY9eyh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFJlbmRlclJlZnMudmFsdWVba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIG1vZGVsLXZhbHVlPXtnZXQoZm9ybURhdGEsIGtleSl9XG4gICAgICAgICAgICBvbktleXVwPXsoJGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgb25LZXl1cChpdGVtLCAkZXZlbnQpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHsuLi5pdGVtLmNvbXBvbmVudH1cbiAgICAgICAgICAgIHNjb3BlPXtidWlsZEZpZWxkQ29udGV4dChrZXkpfVxuICAgICAgICAgICAgb25VcGRhdGU6bW9kZWxWYWx1ZT17X29uVXBkYXRlTW9kZWxWYWx1ZX1cbiAgICAgICAgICAgIG9uSW5wdXQ9e19vbklucHV0fVxuICAgICAgICAgICAgb25Db21wb3NpdGlvbnN0YXJ0PXsoKSA9PiB7XG4gICAgICAgICAgICAgIGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBvbkNvbXBvc2l0aW9uZW5kPXsoKSA9PiB7XG4gICAgICAgICAgICAgIGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwbGl0ZWRLZXkgPSBzcGxpdEtleShrZXkpO1xuXG4gICAgICByZXR1cm4gdWkuZm9ybUl0ZW0ucmVuZGVyKHtcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIGxhYmVsOiBpdGVtLnRpdGxlLFxuICAgICAgICAgIFt1aS5mb3JtSXRlbS5wcm9wXTogc3BsaXRlZEtleSxcbiAgICAgICAgICBwYXRoOiBrZXksXG4gICAgICAgICAgcnVsZVBhdGg6IGtleVxuICAgICAgICB9LFxuICAgICAgICBzbG90czoge1xuICAgICAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFNsb3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hGb3JtUmVmID0gcmVmKCk7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG4gICAgY29uc3QgY29tcG9uZW50UmVuZGVyUmVmczogUmVmID0gcmVmKHt9KTtcblxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudFJlbmRlclJlZihrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZnMudmFsdWVba2V5XTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudFJlbmRlclJlZihrZXkpPy5nZXRUYXJnZXRSZWYoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb250ZXh0Rm4oKTogU2VhcmNoRXZlbnRDb250ZXh0IHtcbiAgICAgIHJldHVybiB7IGZvcm06IGZvcm1EYXRhLCB2YWxpZGF0ZWRGb3JtOiBwcm9wcy52YWxpZGF0ZWRGb3JtLCBnZXRDb21wb25lbnRSZWYsIGRvU2VhcmNoLCBkb1Jlc2V0LCBkb1ZhbGlkYXRlIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnVpbGRGaWVsZENvbnRleHQoa2V5OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiB7IC4uLmdldENvbnRleHRGbigpLCBrZXksIHZhbHVlOiBnZXQoZm9ybURhdGEsIGtleSkgfTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBkb1ZhbGlkYXRlKHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLCB0cmlnZ2VyOiBzdHJpbmcgPSBcInNlYXJjaFwiKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocHJvcHMudmFsaWRhdGUpIHtcbiAgICAgICAgICBhd2FpdCB1aS5mb3JtLnZhbGlkYXRlV3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgIGN0eC5lbWl0KFwidmFsaWRhdGUtZXJyb3JcIiwgeyAuLi5nZXRDb250ZXh0Rm4oKSwgZXJyb3I6IGUsIHRyaWdnZXIgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG9TZWFyY2goKSB7XG4gICAgICBpZiAoYXV0b1NlYXJjaCkge1xuICAgICAgICAvLyDpmLLmipbmn6Xor6Llj5bmtohcbiAgICAgICAgYXV0b1NlYXJjaC5jYW5jZWwoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xuICAgICAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAgICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICAgICAgY3R4LmVtaXQoXCJfc2VhcmNoXCIsIGdldENvbnRleHRGbigpKTtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWFyY2hcIiwgZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvUmVzZXQoKSB7XG4gICAgICAvLyB1aS5mb3JtLnJlc2V0V3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlLCB7IGZvcm0sIGluaXRpYWxGb3JtOiBjcmVhdGVJbml0aWFsRm9ybSgpIH0pO1xuICAgICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xuICAgICAgY29uc3QgZW50cmllc1JldCA9IGVudHJpZXMoZm9ybURhdGEpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzUmV0KSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IGdldChpbml0aWFsRm9ybSwgZW50cnlbMF0pO1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICB1bnNldChmb3JtRGF0YSwgZW50cnlbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldChmb3JtRGF0YSwgZW50cnlbMF0sIGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xuICAgICAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAgICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICAgICAgaWYgKHByb3BzLnJlc2V0KSB7XG4gICAgICAgICAgcHJvcHMucmVzZXQoZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOihqOWNlemHjee9ruS6i+S7tlxuICAgICAgICBjdHguZW1pdChcIl9yZXNldFwiLCBnZXRDb250ZXh0Rm4oKSk7XG4gICAgICAgIGN0eC5lbWl0KFwicmVzZXRcIiwgZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgICBpZiAocHJvcHMuc2VhcmNoQWZ0ZXJSZXNldCkge1xuICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZEJ1dHRvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBidG5zOiBhbnkgPSBbXTtcbiAgICAgIGNvbnN0IGRlZkJ0bk9wdGlvbnM6IEJ1dHRvbnNQcm9wczxTZWFyY2hFdmVudENvbnRleHQ+ID0ge1xuICAgICAgICBzZWFyY2g6IHtcbiAgICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgY2xpY2s6IChjb250ZXh0OiBTZWFyY2hFdmVudENvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmRlcjogMSxcbiAgICAgICAgICB0ZXh0OiB0KFwiZnMuc2VhcmNoLnNlYXJjaC50ZXh0XCIpIC8vICfmn6Xor6InLFxuICAgICAgICB9LFxuICAgICAgICByZXNldDoge1xuICAgICAgICAgIHNob3c6IHRydWUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICBjbGljazogKGNvbnRleHQ6IFNlYXJjaEV2ZW50Q29udGV4dCkgPT4ge1xuICAgICAgICAgICAgZG9SZXNldCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5yZXNldC50ZXh0XCIpLCAvLyAn6YeN572uJyxcbiAgICAgICAgICBvcmRlcjogMlxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbWVyZ2UoZGVmQnRuT3B0aW9ucywgcHJvcHMuYnV0dG9ucyk7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGVmQnRuT3B0aW9ucykge1xuICAgICAgICBjb25zdCBidG4gPSBkZWZCdG5PcHRpb25zW2tleV07XG4gICAgICAgIGJ0bi5fY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgYnRuLmNsaWNrKGdldENvbnRleHRGbigpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRucy5wdXNoKGJ0bik7XG4gICAgICB9XG5cbiAgICAgIGJ0bnMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYnRucztcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGluaXRBdXRvU2VhcmNoKCkge1xuICAgICAgaWYgKHByb3BzLmF1dG9TZWFyY2ggPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIOaehOW7uumYsuaKluafpeivouWHveaVsFxuICAgICAgaWYgKHByb3BzLmRlYm91bmNlICE9PSBmYWxzZSkge1xuICAgICAgICBsZXQgd2FpdCA9IHByb3BzLmRlYm91bmNlPy53YWl0IHx8IDUwMDtcbiAgICAgICAgYXV0b1NlYXJjaCA9IGRlYm91bmNlKGRvU2VhcmNoLCB3YWl0LCBwcm9wcy5kZWJvdW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5pdEF1dG9TZWFyY2goKTtcblxuICAgIGZ1bmN0aW9uIGdldEZvcm0oKSB7XG4gICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VmFsaWRhdGVkRm9ybSgpIHtcbiAgICAgIHJldHVybiBwcm9wcy52YWxpZGF0ZWRGb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuvue9rmZvcm3lgLxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRGb3JtKG5ld0Zvcm06IGFueSwgbWVyZ2UgPSB0cnVlKSB7XG4gICAgICBpZiAoIW1lcmdlKSB7XG4gICAgICAgIGVhY2goa2V5cyhmb3JtRGF0YSksIChpdGVtKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIGZvcm1EYXRhW2l0ZW1dO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRvTWVyZ2UoZm9ybURhdGEsIG5ld0Zvcm0pO1xuICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXRFdmVudERpc2FibGVkID0gcmVmKGZhbHNlKTtcblxuICAgIGNvbnN0IGRvQXV0b1NlYXJjaCA9ICgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImRvIGF1dG8gc2VhcmNoLGlucHV0RXZlbnREaXNhYmxlZDpcIiwgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlKTtcbiAgICAgIGlmIChpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUgIT09IHRydWUgJiYgYXV0b1NlYXJjaCkge1xuICAgICAgICAvLyDpmLLmipbmn6Xor6JcbiAgICAgICAgYXV0b1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbklucHV0ID0gKGl0ZW06IGFueSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IFwiaW5wdXRcIikge1xuICAgICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIOi+k+WFpeazleebkeWQrFxuICAgIGNvbnN0IGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCA9IChkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xuICAgICAgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlID0gZGlzYWJsZWQ7XG4gICAgICBjb25zb2xlLmxvZyhcImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZDpcIiwgZGlzYWJsZWQpO1xuICAgIH07XG5cbiAgICBhc3luYyBmdW5jdGlvbiBvblZhbHVlQ2hhbmdlZCh2YWx1ZTogYW55LCBpdGVtOiBTZWFyY2hJdGVtUHJvcHMpIHtcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xuICAgICAgc2V0KGZvcm1EYXRhLCBrZXksIHZhbHVlKTtcblxuICAgICAgY29uc3Qgc2lsZW50ID0gcHJvcHMudmFsaWRhdGVPbkNoYW5nZVNpbGVudDtcbiAgICAgIC8vIGlmIChwcm9wcy52YWxpZGF0ZU9uQ2hhbmdlICYmIChhd2FpdCBkb1ZhbGlkYXRlKHNpbGVudCwgXCJjaGFuZ2VcIikpKSB7XG4gICAgICAvLyAgIG9uRm9ybVZhbGlkYXRlZCgpO1xuICAgICAgLy8gfVxuXG4gICAgICBpZiAoaXRlbS52YWx1ZUNoYW5nZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtRGF0YVtrZXldO1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBnZXRDb21wb25lbnRSZWYoa2V5KTtcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2U6IFZhbHVlQ2hhbmdlSGFuZGxlID1cbiAgICAgICAgICBpdGVtLnZhbHVlQ2hhbmdlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBpdGVtLnZhbHVlQ2hhbmdlIDogaXRlbS52YWx1ZUNoYW5nZS5oYW5kbGU7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gZ2V0Q29udGV4dEZuKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlQ29udGV4dDogVmFsdWVDaGFuZ2VDb250ZXh0ID0ge1xuICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgIHJvdzogc2NvcGUuZm9ybSxcbiAgICAgICAgICBmb3JtOiBzY29wZS5mb3JtLFxuICAgICAgICAgIC4uLnNjb3BlLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBjb21wb25lbnRSZWYsXG4gICAgICAgICAgaW1tZWRpYXRlOiBmYWxzZSxcbiAgICAgICAgICBnZXRDb21wb25lbnRSZWYsXG4gICAgICAgICAgbW9kZTogXCJzZWFyY2hcIlxuICAgICAgICB9O1xuICAgICAgICB2YWx1ZUNoYW5nZSh2YWx1ZUNoYW5nZUNvbnRleHQpO1xuICAgICAgfVxuICAgICAgLy8gVE9ETyDnlLHkuo52YWxpZGF0ZWRGb3JtIOWPkeWwhOWHuuWOu+WQju+8jOS8muabtOaWsGZvcm1EYXRh55qE5pWw5o2u77yM5omA5Lul6KaB5pS+5ZyodmFsdWVDaGFuZ2XlkI7pnaIs5LiN54S25Lya5q275b6q546vXG4gICAgICBpZiAocHJvcHMudmFsaWRhdGVPbkNoYW5nZSAmJiAoYXdhaXQgZG9WYWxpZGF0ZShzaWxlbnQsIFwiY2hhbmdlXCIpKSkge1xuICAgICAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKFwiaXRlbS5hdXRvU2VhcmNoVHJpZ2dlcjpcIiwgaXRlbSwgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlKTtcbiAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09IG51bGwgfHwgaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gdHJ1ZSB8fCBpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSBcImNoYW5nZVwiKSB7XG4gICAgICAgIGRvQXV0b1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkUnVsZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAoIXByb3BzLnZhbGlkYXRlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wcy5vcHRpb25zLnJ1bGVzO1xuICAgIH0pO1xuXG4gICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldCxcbiAgICAgIHVpLFxuICAgICAgb25WYWx1ZUNoYW5nZWQsXG4gICAgICBkb1ZhbGlkYXRlLFxuICAgICAgZG9TZWFyY2gsXG4gICAgICBkb1Jlc2V0LFxuICAgICAgZm9ybURhdGEsXG4gICAgICBjb21wb25lbnRSZW5kZXJSZWZzLFxuICAgICAgZ2V0Q29tcG9uZW50UmVuZGVyUmVmLFxuICAgICAgZ2V0Q29tcG9uZW50UmVmLFxuICAgICAgZ2V0Rm9ybSxcbiAgICAgIGdldFZhbGlkYXRlZEZvcm0sXG4gICAgICBzZXRGb3JtLFxuICAgICAgc2VhcmNoRm9ybVJlZixcbiAgICAgIG9uSW5wdXQsXG4gICAgICBpbnB1dEV2ZW50RGlzYWJsZWQsXG4gICAgICBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQsXG4gICAgICBjb21wdXRlZENvbHVtbnMsXG4gICAgICBjb21wdXRlZEJ1dHRvbnMsXG4gICAgICBjb21wdXRlZFJ1bGVzLFxuICAgICAgYnVpbGRGaWVsZENvbnRleHQsXG4gICAgICBnZXRDb250ZXh0Rm5cbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtc2VhcmNoIHtcbiAgJi5mcy1zZWFyY2gtdjIge1xuICAgIC8vZGlzcGxheTogZmxleDtcbiAgICAvL2ZsZXgtd3JhcDogbm93cmFwO1xuICAgIC5mcy1zZWFyY2gtYnV0dG9ucyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgIH1cbiAgICAuc2VhcmNoLWxlZnQge1xuICAgIH1cblxuICAgIC5zZWFyY2gtcmlnaHQge1xuICAgICAgZmxleDogMTtcbiAgICB9XG5cbiAgICAuYW50LWZvcm0taW5saW5lIHtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICB9XG5cbiAgICAuZnMtc2VhcmNoLWZvcm0ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG5cbiAgICAgIC5hbnQtcGlja2VyLFxuICAgICAgLmFudC1zZWxlY3QsXG4gICAgICAubi1kYXRlLXBpY2tlcixcbiAgICAgIC5lbC1zZWxlY3QsXG4gICAgICAuZWwtZGF0ZS1lZGl0b3Ige1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLmVsLXJhbmdlLWVkaXRvci5lbC1pbnB1dF9fd3JhcHBlciB7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG5cbiAgICAgIC5hbnQtYnRuLWxvYWRpbmctaWNvbiB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgICAgfVxuXG4gICAgICAmLmVsLWZvcm0tLWxhYmVsLXRvcCB7XG4gICAgICAgIC5lbC1mb3JtLWl0ZW0ge1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC5lbC1mb3JtLWl0ZW0ge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIH1cblxuICAgICAgJi5lbC1mb3JtLS1pbmxpbmUge1xuICAgICAgICAuZWwtaW5wdXQge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC5lbC1mb3JtLWl0ZW1fX2NvbnRlbnQge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5mcy1zZWFyY2gtY29sIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIC8vIGFudGR2XG4gICAgICAuYW50LWZvcm0taXRlbS1leHBsYWluLFxuICAgICAgLmVsLWZvcm0taXRlbV9fZXJyb3Ige1xuICAgICAgICBmbG9hdDogbGVmdDtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBib3R0b206IDNweDtcbiAgICAgICAgcmlnaHQ6IDhweDtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHRvcDogYXV0bztcbiAgICAgICAgbGVmdDogYXV0bztcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgfVxuXG4gICAgICAuZWwtZm9ybS1pdGVtX19lcnJvciB7XG4gICAgICAgIGJvdHRvbTogMTBweDtcbiAgICAgIH1cblxuICAgICAgJjpob3ZlciB7XG4gICAgICAgIC5hbnQtZm9ybS1pdGVtLWV4cGxhaW4sXG4gICAgICAgIC5lbC1mb3JtLWl0ZW1fX2Vycm9yIHtcbiAgICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm4tZm9ybS1pdGVtLWJsYW5rIHtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNTc1cHgpIHtcbiAgLmZzLXNlYXJjaCB7XG4gICAgLmZzLXNlYXJjaC1mb3JtIHtcbiAgICAgIC5mcy1zZWFyY2gtY29sIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgZmxleDogMTAwJTtcbiAgICAgICAgLy9hbnRkdlxuICAgICAgICAuYW50LWZvcm0taXRlbS1sYWJlbCB7XG4gICAgICAgICAgd2lkdGg6IDEyMHB4O1xuICAgICAgICAgIGZsZXg6IG5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgLmFudC1mb3JtLWl0ZW0tY29udHJvbCB7XG4gICAgICAgICAgZmxleDogMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaCBmcy1zZWFyY2gtdjJcIj5cbiAgICA8Y29tcG9uZW50IDppcz1cInVpLmNvbGxhcHNlVHJhbnNpdGlvbi5uYW1lXCI+XG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLmZvcm0ubmFtZVwiXG4gICAgICAgIHJlZj1cInNlYXJjaEZvcm1SZWZcIlxuICAgICAgICA6bW9kZWw9XCJmb3JtRGF0YVwiXG4gICAgICAgIG9uc3VibWl0PVwiZXZlbnQucHJldmVudERlZmF1bHQoKTtcIlxuICAgICAgICB2LWJpbmQ9XCJvcHRpb25zXCJcbiAgICAgICAgOnJ1bGVzPVwiY29tcHV0ZWRSdWxlc1wiXG4gICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWZvcm1cIlxuICAgICAgPlxuICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgOmlzPVwiY29udGFpbmVyPy5pcyB8fCAnZnMtc2VhcmNoLWxheW91dC1kZWZhdWx0J1wiXG4gICAgICAgICAgdi1pZj1cInNob3cgIT09IGZhbHNlXCJcbiAgICAgICAgICB2LWJpbmQ9XCJjb250YWluZXJcIlxuICAgICAgICAgIDpjb2x1bW5zPVwiY29tcHV0ZWRDb2x1bW5zXCJcbiAgICAgICAgICA6Z2V0LWNvbnRleHQtZm49XCJnZXRDb250ZXh0Rm5cIlxuICAgICAgICA+XG4gICAgICAgICAgPHRlbXBsYXRlICNzZWFyY2gtYnV0dG9ucz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtYnV0dG9uc1wiPlxuICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNvbXB1dGVkQnV0dG9uc1wiIDprZXk9XCJpbmRleFwiPlxuICAgICAgICAgICAgICAgIDxmcy1idXR0b24gdi1pZj1cIml0ZW0uc2hvdyAhPT0gZmFsc2VcIiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrPVwiaXRlbS5fY2xpY2soKVwiIC8+XG4gICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuXG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzbG90c1snc2VhcmNoLWxlZnQnXVwiICNzZWFyY2gtbGVmdD5cbiAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLWxlZnQnXVwiIDpzY29wZT1cImdldENvbnRleHRGbigpXCIgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2xvdHNbJ3NlYXJjaC1taWRkbGUnXVwiICNzZWFyY2gtbWlkZGxlPlxuICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtbWlkZGxlJ11cIiA6c2NvcGU9XCJnZXRDb250ZXh0Rm4oKVwiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNsb3RzWydzZWFyY2gtcmlnaHQnXVwiICNzZWFyY2gtcmlnaHQ+XG4gICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1yaWdodCddXCIgOnNjb3BlPVwiZ2V0Q29udGV4dEZuKClcIiAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHN4XCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgcmVhY3RpdmUsIHJlZiwgUmVmLCB1bnJlZiwgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBmb3JFYWNoLCBjbG9uZURlZXAsIGVhY2gsIGtleXMsIHVuc2V0LCBzZXQsIHNvcnRCeSwgZW50cmllcywgZGVib3VuY2UsIGdldCBhcyBMb2Rhc2hHZXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtY29tcHV0ZVwiO1xuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgRnNTZWFyY2hCdXR0b25zIGZyb20gXCIuL2J1dHRvbnMudnVlXCI7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEJ1dHRvbnNQcm9wcyxcbiAgU2VhcmNoRXZlbnRDb250ZXh0LFxuICBTZWFyY2hJdGVtUHJvcHMsXG4gIFR5cGVNYXAsXG4gIFZhbHVlQ2hhbmdlQ29udGV4dCxcbiAgVmFsdWVDaGFuZ2VIYW5kbGVcbn0gZnJvbSBcIi4uLy4uL2RcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtdWlcIjtcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtbWVyZ2VcIjtcblxuLyoqXG4gKiDmn6Xor6LmoYbnu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1NlYXJjaFwiLFxuICBjb21wb25lbnRzOiB7IEZzU2VhcmNoQnV0dG9ucyB9LFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOW4g+WxgOWuueWZqFxuICAgICAqL1xuICAgIGNvbnRhaW5lcjoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliJ3lp4vmn6Xor6LmnaHku7ZcbiAgICAgKiDngrnlh7vph43nva7vvIzkvJrph43nva7miJDor6XmnaHku7ZcbiAgICAgKi9cbiAgICBpbml0aWFsRm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmoKHpqozlkI7nmoTmn6Xor6LooajljZXmlbDmja5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZWRGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOWNleWPguaVsFxuICAgICAqIOaUr+aMgWVsLWZvcm0gfCBhLWZvcm3nmoTlsZ7mgKdcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOafpeivouWtl+autemFjee9rlxuICAgICAqL1xuICAgIGNvbHVtbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uLOWPr+S7peagueaNrm9yZGVy5o6S5bqPXG4gICAgICogYHtzZWFyY2g6ey4uLkZzQnV0dG9ufSxyZXNldDp7Li4uRnNCdXR0b259fWBcbiAgICAgKi9cbiAgICBidXR0b25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOeCueWHu+mHjee9ruWQjuaYr+WQpueri+WNs+inpuWPkeafpeivolxuICAgICAqL1xuICAgIHNlYXJjaEFmdGVyUmVzZXQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKblvIDlkK/oh6rliqjmn6Xor6JcbiAgICAgKi9cbiAgICBhdXRvU2VhcmNoOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6Ieq5Yqo5p+l6K+i77yM6Ziy5oqW6K6+572uXG4gICAgICog5LygZmFsc2XliJnlhbPpl63oh6rliqjmn6Xor6JcbiAgICAgKi9cbiAgICBkZWJvdW5jZToge1xuICAgICAgdHlwZTogW0Jvb2xlYW4sIE9iamVjdF0sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaPkuanvVxuICAgICAqL1xuICAgIHNsb3RzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKbmmL7npLrmn6Xor6LmoYZcbiAgICAgKi9cbiAgICBzaG93OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5ZCv55So5qCh6aqMXG4gICAgICovXG4gICAgdmFsaWRhdGU6IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuS7u+aEj+WAvOWPmOWMluWwseinpuWPkeagoemqjFxuICAgICAqL1xuICAgIHZhbGlkYXRlT25DaGFuZ2U6IHtcbiAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICB0eXBlOiBCb29sZWFuXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliJfnmoTlrr3luqborr7nva7vvIxzcGFuPXh4XG4gICAgICovXG4gICAgY29sOiB7fSxcblxuICAgIC8qKlxuICAgICAqIOe7n+S4gOWtl+auteeahGZvcm1JdGVt5bGe5oCnXG4gICAgICovXG4gICAgZm9ybUl0ZW06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcbiAgICAvKipcbiAgICAgKiDmn6Xor6Lkuovku7ZcbiAgICAgKiovXG4gICAgXCJzZWFyY2hcIixcbiAgICAvKipcbiAgICAgKiDmn6Xor6Lkuovku7bvvIzmraTkuovku7bkvpvns7vnu5/osIPnlKhcbiAgICAgKi9cbiAgICBcIl9zZWFyY2hcIixcbiAgICAvKipcbiAgICAgKiDph43nva7kuovku7bvvIzkvpvnlKjmiLfkvb/nlKhcbiAgICAgKiovXG4gICAgXCJyZXNldFwiLFxuICAgIC8qKlxuICAgICAqIOmHjee9ruS6i+S7tu+8jOatpOS6i+S7tuS+m+ezu+e7n+iwg+eUqFxuICAgICAqL1xuICAgIFwiX3Jlc2V0XCIsXG4gICAgLyoqXG4gICAgICog5qCh6aqM5aSx6LSl5LqL5Lu2XG4gICAgICovXG4gICAgXCJ2YWxpZGF0ZS1lcnJvclwiLFxuICAgIC8qKlxuICAgICAqIOagoemqjOWQjueahOihqOWNleaVsOaNruWPmOWMllxuICAgICAqL1xuICAgIFwidXBkYXRlOnZhbGlkYXRlZEZvcm1cIlxuICBdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHg6IGFueSkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCBkb01lcmdlID0gbWVyZ2U7XG4gICAgY29uc3QgeyBkb0NvbXB1dGVkLCBBc3luY0NvbXB1dGVWYWx1ZSwgQ29tcHV0ZVZhbHVlIH0gPSB1c2VDb21wdXRlKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxuICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLnZhbHVlICE9IG51bGwgJiYgKGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBBc3luY0NvbXB1dGVWYWx1ZSB8fCBpdGVtLnZhbHVlIGluc3RhbmNlb2YgQ29tcHV0ZVZhbHVlKSkge1xuICAgICAgICBsb2dnZXIud2FybihcInNlYXJjaC52YWx1ZemFjee9ruS4jeaUr+aMgUNvbXB1dGVWYWx1ZS9Bc3luY0NvbXB1dGXnsbvlnovnmoTliqjmgIHorqHnrpdcIik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbml0aWFsRm9ybSgpOiBhbnkge1xuICAgICAgLy/pu5jorqTlgLxcbiAgICAgIGNvbnN0IGZvcm06IGFueSA9IHt9O1xuXG4gICAgICBmb3JFYWNoKHByb3BzLmNvbHVtbnMsIChjb2x1bW4sIGtleSkgPT4ge1xuICAgICAgICBpZiAoY29sdW1uLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVmVmFsdWUgPSB1bnJlZihjb2x1bW4udmFsdWUpO1xuICAgICAgICBpZiAoZGVmVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uc2hvdyAhPT0gZmFsc2UgJiYgY29sdW1uLmNvbXBvbmVudD8uc2hvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAvL+m7mOiupOWAvFxuICAgICAgICAgIGZvcm1ba2V5XSA9IGRlZlZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNsb25lRGVlcChtZXJnZSh7fSwgcHJvcHMuaW5pdGlhbEZvcm0sIGZvcm0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtRGF0YSA9IHJlYWN0aXZlKGNyZWF0ZUluaXRpYWxGb3JtKCkpO1xuXG4gICAgbGV0IGF1dG9TZWFyY2g6IGFueSA9IG51bGw7XG5cbiAgICBjb25zdCBjb21wdXRlZENvbHVtbnM6IFJlZjxUeXBlTWFwPFNlYXJjaEl0ZW1Qcm9wcz4+ID0gZG9Db21wdXRlZChcbiAgICAgICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHByb3BzLmNvbHVtbnM7XG4gICAgICB9LFxuICAgICAgZ2V0Q29udGV4dEZuLFxuICAgICAgbnVsbCxcbiAgICAgIChjb2x1bW5zOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybUl0ZW0gPSBjbG9uZURlZXAocHJvcHMuZm9ybUl0ZW0gfHwge30pO1xuICAgICAgICBmb3JFYWNoKGNvbHVtbnMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgbWVyZ2UoaXRlbSwgZm9ybUl0ZW0sIGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gY29sdW1ucyA9IG1lcmdlKGZvcm1JdGVtLCBjb2x1bW5zKTtcbiAgICAgICAgaWYgKCFwcm9wcy52YWxpZGF0ZSkge1xuICAgICAgICAgIC8v5aaC5p6c5YWz6ZetdmFsaWRhdGXliJnljrvmjolydWxlc1xuICAgICAgICAgIGZvckVhY2goY29sdW1ucywgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtLnJ1bGVzO1xuICAgICAgICAgICAgZGVsZXRlIGl0ZW0ucnVsZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyDlkIjlubZjb2xcbiAgICAgICAgaWYgKHByb3BzLmNvbCkge1xuICAgICAgICAgIGZvckVhY2goY29sdW1ucywgKHYpID0+IHtcbiAgICAgICAgICAgIHYuY29sID0gbWVyZ2Uoe30sIHByb3BzLmNvbCwgdi5jb2wpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jZWxsUmVuZGVyXG4gICAgICAgIGZvckVhY2goY29sdW1ucywgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpdGVtLl9jZWxsUmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxSZW5kZXIoaXRlbSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy/lrZfmrrXmjpLluo9cbiAgICAgICAgbGV0IHNvcnRBcnI6IFNlYXJjaEl0ZW1Qcm9wc1tdID0gW107XG4gICAgICAgIGZvckVhY2goY29sdW1ucywgKHYsIGtleSkgPT4ge1xuICAgICAgICAgIHYuX2tleSA9IGtleTtcbiAgICAgICAgICBzb3J0QXJyLnB1c2godik7XG4gICAgICAgIH0pO1xuICAgICAgICBzb3J0QXJyID0gc29ydEJ5KHNvcnRBcnIsIChpdGVtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc29ydGVkQ29sdW1uczoge1xuICAgICAgICAgIFtrZXk6IHN0cmluZ106IFNlYXJjaEl0ZW1Qcm9wcztcbiAgICAgICAgfSA9IHt9O1xuXG4gICAgICAgIHNvcnRBcnIuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGxldCBfa2V5ID0gaXRlbS5fa2V5O1xuICAgICAgICAgIGRlbGV0ZSBpdGVtLl9rZXk7XG4gICAgICAgICAgc29ydGVkQ29sdW1uc1tfa2V5XSA9IGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc29ydGVkQ29sdW1ucztcbiAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gb25Gb3JtVmFsaWRhdGVkKCkge1xuICAgICAgY29uc3QgdmFsaWRhdGVkRm9ybSA9IGNsb25lRGVlcChmb3JtRGF0YSk7XG4gICAgICBjdHguZW1pdChcInVwZGF0ZTp2YWxpZGF0ZWRGb3JtXCIsIHZhbGlkYXRlZEZvcm0pO1xuICAgIH1cblxuICAgIHdhdGNoKFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMudmFsaWRhdGVkRm9ybTtcbiAgICAgIH0sXG4gICAgICAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtRGF0YSkge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtRGF0YVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIG1lcmdlKGZvcm1EYXRhLCB2YWx1ZSB8fCB7fSk7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkZWVwOiB0cnVlXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGdldCA9IChmb3JtOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICByZXR1cm4gTG9kYXNoR2V0KGZvcm0sIGtleSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHNwbGl0S2V5KGtleTogc3RyaW5nKSB7XG4gICAgICBpZiAoa2V5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleS5pbmRleE9mKFwiLlwiKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBrZXkuc3BsaXQoXCIuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICAvLyBjb25zdCBkZWJvdW5jZVZhbGlkYXRlID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuICAgIC8vICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xuICAgIC8vICAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9LCA1MDApO1xuXG4gICAgZnVuY3Rpb24gY2VsbFJlbmRlcihpdGVtOiBhbnkpIHtcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBfb25VcGRhdGVNb2RlbFZhbHVlKCRldmVudDogYW55KSB7XG4gICAgICAgIC8vIGF3YWl0IGRlYm91bmNlVmFsaWRhdGUoKTtcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQoJGV2ZW50LCBpdGVtKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX29uSW5wdXQoKSB7XG4gICAgICAgIG9uSW5wdXQoaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uS2V5dXAoaXRlbTogYW55LCBrZXk6IGFueSkge1xuICAgICAgICBpZiAoa2V5LmNvZGUgPT09IFwiRW50ZXJcIikge1xuICAgICAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyICE9IGZhbHNlKSB7XG4gICAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgZGVmYXVsdFNsb3Q6IGFueSA9IG51bGw7XG4gICAgICBpZiAocHJvcHMuc2xvdHNbXCJzZWFyY2hfXCIgKyBrZXldKSB7XG4gICAgICAgIGRlZmF1bHRTbG90ID0gPGZzLXNsb3QtcmVuZGVyIHNsb3RzPXtwcm9wcy5zbG90c1tcInNlYXJjaF9cIiArIGtleV19IHNjb3BlPXtidWlsZEZpZWxkQ29udGV4dChrZXkpfSAvPjtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5yZW5kZXIpIHtcbiAgICAgICAgZGVmYXVsdFNsb3QgPSA8ZnMtcmVuZGVyIHJlbmRlci1mdW5jPXtpdGVtLnJlbmRlcn0gc2NvcGU9e2J1aWxkRmllbGRDb250ZXh0KGtleSl9IC8+O1xuICAgICAgfSBlbHNlIGlmIChpdGVtLmNvbXBvbmVudCAmJiBpdGVtLmNvbXBvbmVudC5zaG93ICE9PSBmYWxzZSkge1xuICAgICAgICBkZWZhdWx0U2xvdCA9IChcbiAgICAgICAgICA8ZnMtY29tcG9uZW50LXJlbmRlclxuICAgICAgICAgICAgcmVmPXsodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb21wb25lbnRSZW5kZXJSZWZzLnZhbHVlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBtb2RlbC12YWx1ZT17Z2V0KGZvcm1EYXRhLCBrZXkpfVxuICAgICAgICAgICAgb25LZXl1cD17KCRldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIG9uS2V5dXAoaXRlbSwgJGV2ZW50KTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB7Li4uaXRlbS5jb21wb25lbnR9XG4gICAgICAgICAgICBzY29wZT17YnVpbGRGaWVsZENvbnRleHQoa2V5KX1cbiAgICAgICAgICAgIG9uVXBkYXRlOm1vZGVsVmFsdWU9e19vblVwZGF0ZU1vZGVsVmFsdWV9XG4gICAgICAgICAgICBvbklucHV0PXtfb25JbnB1dH1cbiAgICAgICAgICAgIG9uQ29tcG9zaXRpb25zdGFydD17KCkgPT4ge1xuICAgICAgICAgICAgICBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgb25Db21wb3NpdGlvbmVuZD17KCkgPT4ge1xuICAgICAgICAgICAgICBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGxpdGVkS2V5ID0gc3BsaXRLZXkoa2V5KTtcblxuICAgICAgcmV0dXJuIHVpLmZvcm1JdGVtLnJlbmRlcih7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBsYWJlbDogaXRlbS50aXRsZSxcbiAgICAgICAgICBbdWkuZm9ybUl0ZW0ucHJvcF06IHNwbGl0ZWRLZXksXG4gICAgICAgICAgcGF0aDoga2V5LFxuICAgICAgICAgIHJ1bGVQYXRoOiBrZXlcbiAgICAgICAgfSxcbiAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICBkZWZhdWx0KCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRTbG90O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoRm9ybVJlZiA9IHJlZigpO1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlbmRlclJlZnM6IFJlZiA9IHJlZih7fSk7XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnRSZW5kZXJSZWZzLnZhbHVlW2tleV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5KT8uZ2V0VGFyZ2V0UmVmKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29udGV4dEZuKCk6IFNlYXJjaEV2ZW50Q29udGV4dCB7XG4gICAgICByZXR1cm4geyBmb3JtOiBmb3JtRGF0YSwgdmFsaWRhdGVkRm9ybTogcHJvcHMudmFsaWRhdGVkRm9ybSwgZ2V0Q29tcG9uZW50UmVmLCBkb1NlYXJjaCwgZG9SZXNldCwgZG9WYWxpZGF0ZSB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJ1aWxkRmllbGRDb250ZXh0KGtleTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4geyAuLi5nZXRDb250ZXh0Rm4oKSwga2V5LCB2YWx1ZTogZ2V0KGZvcm1EYXRhLCBrZXkpIH07XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG9WYWxpZGF0ZShzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSwgdHJpZ2dlcjogc3RyaW5nID0gXCJzZWFyY2hcIik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHByb3BzLnZhbGlkYXRlKSB7XG4gICAgICAgICAgYXdhaXQgdWkuZm9ybS52YWxpZGF0ZVdyYXAoc2VhcmNoRm9ybVJlZi52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICBjdHguZW1pdChcInZhbGlkYXRlLWVycm9yXCIsIHsgLi4uZ2V0Q29udGV4dEZuKCksIGVycm9yOiBlLCB0cmlnZ2VyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvU2VhcmNoKCkge1xuICAgICAgaWYgKGF1dG9TZWFyY2gpIHtcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+i5Y+W5raIXG4gICAgICAgIGF1dG9TZWFyY2guY2FuY2VsKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBkb1ZhbGlkYXRlKCkpIHtcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgICAgIGN0eC5lbWl0KFwiX3NlYXJjaFwiLCBnZXRDb250ZXh0Rm4oKSk7XG4gICAgICAgIGN0eC5lbWl0KFwic2VhcmNoXCIsIGdldENvbnRleHRGbigpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBkb1Jlc2V0KCkge1xuICAgICAgLy8gdWkuZm9ybS5yZXNldFdyYXAoc2VhcmNoRm9ybVJlZi52YWx1ZSwgeyBmb3JtLCBpbml0aWFsRm9ybTogY3JlYXRlSW5pdGlhbEZvcm0oKSB9KTtcbiAgICAgIGNvbnN0IGluaXRpYWxGb3JtID0gY3JlYXRlSW5pdGlhbEZvcm0oKTtcbiAgICAgIGNvbnN0IGVudHJpZXNSZXQgPSBlbnRyaWVzKGZvcm1EYXRhKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllc1JldCkge1xuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBnZXQoaW5pdGlhbEZvcm0sIGVudHJ5WzBdKTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgdW5zZXQoZm9ybURhdGEsIGVudHJ5WzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXQoZm9ybURhdGEsIGVudHJ5WzBdLCBpbml0aWFsVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBkb1ZhbGlkYXRlKCkpIHtcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgICAgIGlmIChwcm9wcy5yZXNldCkge1xuICAgICAgICAgIHByb3BzLnJlc2V0KGdldENvbnRleHRGbigpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDooajljZXph43nva7kuovku7ZcbiAgICAgICAgY3R4LmVtaXQoXCJfcmVzZXRcIiwgZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgICBjdHguZW1pdChcInJlc2V0XCIsIGdldENvbnRleHRGbigpKTtcbiAgICAgICAgaWYgKHByb3BzLnNlYXJjaEFmdGVyUmVzZXQpIHtcbiAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgYnRuczogYW55ID0gW107XG4gICAgICBjb25zdCBkZWZCdG5PcHRpb25zOiBCdXR0b25zUHJvcHM8U2VhcmNoRXZlbnRDb250ZXh0PiA9IHtcbiAgICAgICAgc2VhcmNoOiB7XG4gICAgICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBcInByaW1hcnlcIixcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgIGNsaWNrOiAoY29udGV4dDogU2VhcmNoRXZlbnRDb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5zZWFyY2gudGV4dFwiKSAvLyAn5p+l6K+iJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgY2xpY2s6IChjb250ZXh0OiBTZWFyY2hFdmVudENvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGRvUmVzZXQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRleHQ6IHQoXCJmcy5zZWFyY2gucmVzZXQudGV4dFwiKSwgLy8gJ+mHjee9ricsXG4gICAgICAgICAgb3JkZXI6IDJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG1lcmdlKGRlZkJ0bk9wdGlvbnMsIHByb3BzLmJ1dHRvbnMpO1xuICAgICAgZm9yIChsZXQga2V5IGluIGRlZkJ0bk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYnRuID0gZGVmQnRuT3B0aW9uc1trZXldO1xuICAgICAgICBidG4uX2NsaWNrID0gKCkgPT4ge1xuICAgICAgICAgIGJ0bi5jbGljayhnZXRDb250ZXh0Rm4oKSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0bnMucHVzaChidG4pO1xuICAgICAgfVxuXG4gICAgICBidG5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJ0bnM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBpbml0QXV0b1NlYXJjaCgpIHtcbiAgICAgIGlmIChwcm9wcy5hdXRvU2VhcmNoID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyDmnoTlu7rpmLLmipbmn6Xor6Llh73mlbBcbiAgICAgIGlmIChwcm9wcy5kZWJvdW5jZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHdhaXQgPSBwcm9wcy5kZWJvdW5jZT8ud2FpdCB8fCA1MDA7XG4gICAgICAgIGF1dG9TZWFyY2ggPSBkZWJvdW5jZShkb1NlYXJjaCwgd2FpdCwgcHJvcHMuZGVib3VuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGluaXRBdXRvU2VhcmNoKCk7XG5cbiAgICBmdW5jdGlvbiBnZXRGb3JtKCkge1xuICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFZhbGlkYXRlZEZvcm0oKSB7XG4gICAgICByZXR1cm4gcHJvcHMudmFsaWRhdGVkRm9ybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorr7nva5mb3Jt5YC8XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Rm9ybShuZXdGb3JtOiBhbnksIG1lcmdlID0gdHJ1ZSkge1xuICAgICAgaWYgKCFtZXJnZSkge1xuICAgICAgICBlYWNoKGtleXMoZm9ybURhdGEpLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtRGF0YVtpdGVtXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBkb01lcmdlKGZvcm1EYXRhLCBuZXdGb3JtKTtcbiAgICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0RXZlbnREaXNhYmxlZCA9IHJlZihmYWxzZSk7XG5cbiAgICBjb25zdCBkb0F1dG9TZWFyY2ggPSAoKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJkbyBhdXRvIHNlYXJjaCxpbnB1dEV2ZW50RGlzYWJsZWQ6XCIsIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSk7XG4gICAgICBpZiAoaW5wdXRFdmVudERpc2FibGVkLnZhbHVlICE9PSB0cnVlICYmIGF1dG9TZWFyY2gpIHtcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+iXG4gICAgICAgIGF1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25JbnB1dCA9IChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyDovpPlhaXms5Xnm5HlkKxcbiAgICBjb25zdCBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQgPSAoZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSA9IGRpc2FibGVkO1xuICAgICAgY29uc29sZS5sb2coXCJjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQ6XCIsIGRpc2FibGVkKTtcbiAgICB9O1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gb25WYWx1ZUNoYW5nZWQodmFsdWU6IGFueSwgaXRlbTogU2VhcmNoSXRlbVByb3BzKSB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcbiAgICAgIHNldChmb3JtRGF0YSwga2V5LCB2YWx1ZSk7XG5cbiAgICAgIGNvbnN0IHNpbGVudCA9IHByb3BzLnZhbGlkYXRlT25DaGFuZ2VTaWxlbnQ7XG4gICAgICAvLyBpZiAocHJvcHMudmFsaWRhdGVPbkNoYW5nZSAmJiAoYXdhaXQgZG9WYWxpZGF0ZShzaWxlbnQsIFwiY2hhbmdlXCIpKSkge1xuICAgICAgLy8gICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAgIC8vIH1cblxuICAgICAgaWYgKGl0ZW0udmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybURhdGFba2V5XTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gZ2V0Q29tcG9uZW50UmVmKGtleSk7XG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBWYWx1ZUNoYW5nZUhhbmRsZSA9XG4gICAgICAgICAgaXRlbS52YWx1ZUNoYW5nZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gaXRlbS52YWx1ZUNoYW5nZSA6IGl0ZW0udmFsdWVDaGFuZ2UuaGFuZGxlO1xuICAgICAgICBjb25zdCBzY29wZSA9IGdldENvbnRleHRGbigpO1xuICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZUNvbnRleHQ6IFZhbHVlQ2hhbmdlQ29udGV4dCA9IHtcbiAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICByb3c6IHNjb3BlLmZvcm0sXG4gICAgICAgICAgZm9ybTogc2NvcGUuZm9ybSxcbiAgICAgICAgICAuLi5zY29wZSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgY29tcG9uZW50UmVmLFxuICAgICAgICAgIGltbWVkaWF0ZTogZmFsc2UsXG4gICAgICAgICAgZ2V0Q29tcG9uZW50UmVmLFxuICAgICAgICAgIG1vZGU6IFwic2VhcmNoXCJcbiAgICAgICAgfTtcbiAgICAgICAgdmFsdWVDaGFuZ2UodmFsdWVDaGFuZ2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE8g55Sx5LqOdmFsaWRhdGVkRm9ybSDlj5HlsITlh7rljrvlkI7vvIzkvJrmm7TmlrBmb3JtRGF0YeeahOaVsOaNru+8jOaJgOS7peimgeaUvuWcqHZhbHVlQ2hhbmdl5ZCO6Z2iLOS4jeeEtuS8muatu+W+queOr1xuICAgICAgaWYgKHByb3BzLnZhbGlkYXRlT25DaGFuZ2UgJiYgKGF3YWl0IGRvVmFsaWRhdGUoc2lsZW50LCBcImNoYW5nZVwiKSkpIHtcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZyhcIml0ZW0uYXV0b1NlYXJjaFRyaWdnZXI6XCIsIGl0ZW0sIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSk7XG4gICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PSBudWxsIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IHRydWUgfHwgaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJjaGFuZ2VcIikge1xuICAgICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZFJ1bGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKCFwcm9wcy52YWxpZGF0ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9ucy5ydWxlcztcbiAgICB9KTtcblxuICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xuICAgIHJldHVybiB7XG4gICAgICBnZXQsXG4gICAgICB1aSxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkLFxuICAgICAgZG9WYWxpZGF0ZSxcbiAgICAgIGRvU2VhcmNoLFxuICAgICAgZG9SZXNldCxcbiAgICAgIGZvcm1EYXRhLFxuICAgICAgY29tcG9uZW50UmVuZGVyUmVmcyxcbiAgICAgIGdldENvbXBvbmVudFJlbmRlclJlZixcbiAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgIGdldEZvcm0sXG4gICAgICBnZXRWYWxpZGF0ZWRGb3JtLFxuICAgICAgc2V0Rm9ybSxcbiAgICAgIHNlYXJjaEZvcm1SZWYsXG4gICAgICBvbklucHV0LFxuICAgICAgaW5wdXRFdmVudERpc2FibGVkLFxuICAgICAgY2hhbmdlSW5wdXRFdmVudERpc2FibGVkLFxuICAgICAgY29tcHV0ZWRDb2x1bW5zLFxuICAgICAgY29tcHV0ZWRCdXR0b25zLFxuICAgICAgY29tcHV0ZWRSdWxlcyxcbiAgICAgIGJ1aWxkRmllbGRDb250ZXh0LFxuICAgICAgZ2V0Q29udGV4dEZuXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXNlYXJjaCB7XG4gICYuZnMtc2VhcmNoLXYyIHtcbiAgICAvL2Rpc3BsYXk6IGZsZXg7XG4gICAgLy9mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAuZnMtc2VhcmNoLWJ1dHRvbnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG4gICAgLnNlYXJjaC1sZWZ0IHtcbiAgICB9XG5cbiAgICAuc2VhcmNoLXJpZ2h0IHtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuXG4gICAgLmFudC1mb3JtLWlubGluZSB7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgfVxuXG4gICAgLmZzLXNlYXJjaC1mb3JtIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuXG4gICAgICAuYW50LXBpY2tlcixcbiAgICAgIC5hbnQtc2VsZWN0LFxuICAgICAgLm4tZGF0ZS1waWNrZXIsXG4gICAgICAuZWwtc2VsZWN0LFxuICAgICAgLmVsLWRhdGUtZWRpdG9yIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIC5lbC1yYW5nZS1lZGl0b3IuZWwtaW5wdXRfX3dyYXBwZXIge1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuXG4gICAgICAuYW50LWJ0bi1sb2FkaW5nLWljb24ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBtYXJnaW4tbGVmdDogMnB4O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgICAgIH1cblxuICAgICAgJi5lbC1mb3JtLS1sYWJlbC10b3Age1xuICAgICAgICAuZWwtZm9ybS1pdGVtIHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuZWwtZm9ybS1pdGVtIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgICYuZWwtZm9ybS0taW5saW5lIHtcbiAgICAgICAgLmVsLWlucHV0IHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuZWwtZm9ybS1pdGVtX19jb250ZW50IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZnMtc2VhcmNoLWNvbCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAvLyBhbnRkdlxuICAgICAgLmFudC1mb3JtLWl0ZW0tZXhwbGFpbixcbiAgICAgIC5lbC1mb3JtLWl0ZW1fX2Vycm9yIHtcbiAgICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgYm90dG9tOiAzcHg7XG4gICAgICAgIHJpZ2h0OiA4cHg7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB0b3A6IGF1dG87XG4gICAgICAgIGxlZnQ6IGF1dG87XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgLmVsLWZvcm0taXRlbV9fZXJyb3Ige1xuICAgICAgICBib3R0b206IDEwcHg7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICAuYW50LWZvcm0taXRlbS1leHBsYWluLFxuICAgICAgICAuZWwtZm9ybS1pdGVtX19lcnJvciB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5uLWZvcm0taXRlbS1ibGFuayB7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gIC5mcy1zZWFyY2gge1xuICAgIC5mcy1zZWFyY2gtZm9ybSB7XG4gICAgICAuZnMtc2VhcmNoLWNvbCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICAgIGZsZXg6IDEwMCU7XG4gICAgICAgIC8vYW50ZHZcbiAgICAgICAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgICAgICAgIHdpZHRoOiAxMjBweDtcbiAgICAgICAgICBmbGV4OiBub25lO1xuICAgICAgICB9XG4gICAgICAgIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnQgOmlzPVwidWkuY29sbGFwc2VUcmFuc2l0aW9uLm5hbWVcIj5cbiAgICA8ZGl2IHYtaWY9XCJzaG93ICE9PSBmYWxzZVwiIGNsYXNzPVwiZnMtc2VhcmNoXCIgOmNsYXNzPVwieyAnZnMtc2VhcmNoLW11bHRpLWxpbmUnOiBjb21wdXRlZElzTXVsdGlMaW5lIH1cIj5cbiAgICAgIDxjb21wb25lbnRcbiAgICAgICAgOmlzPVwidWkuZm9ybS5uYW1lXCJcbiAgICAgICAgcmVmPVwic2VhcmNoRm9ybVJlZlwiXG4gICAgICAgIDptb2RlbD1cImZvcm1cIlxuICAgICAgICB2LWJpbmQ9XCJvcHRpb25zXCJcbiAgICAgICAgOnJ1bGVzPVwiY29tcHV0ZWRSdWxlc1wiXG4gICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWZvcm1cIlxuICAgICAgICBAY29tcG9zaXRpb25zdGFydD1cImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCh0cnVlKVwiXG4gICAgICAgIEBjb21wb3NpdGlvbmVuZD1cImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZChmYWxzZSlcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWJveFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtbWFpblwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1jb2x1bW5zXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyAnZnMtc2VhcmNoLWNvbGxhcHNlJzogY29sbGFwc2UgfVwiXG4gICAgICAgICAgICAgIDpzdHlsZT1cInsgaGVpZ2h0OiBjb21wdXRlZENvbHVtbkJveEhlaWdodCB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yb3cubmFtZVwiIHJlZj1cImNvbHVtbnNSb3dSZWZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJzbG90c1snc2VhcmNoLWxlZnQnXVwiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbFwiPlxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLWxlZnQnXVwiIDpzY29wZT1cInNlYXJjaEV2ZW50Q29udGV4dFJlZlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwga2V5KSBpbiBjb21wdXRlZENvbHVtbnNcIiA6a2V5PVwia2V5XCI+XG4gICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cImNvbXB1dGVkQ29sTmFtZVwiIHYtaWY9XCJpdGVtLnNob3cgPT09IHRydWVcIiBjbGFzcz1cImZzLXNlYXJjaC1jb2xcIiB2LWJpbmQ9XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIiB2LWJpbmQ9XCJpdGVtXCIgOlt1aS5mb3JtSXRlbS5wcm9wXT1cImtleVwiIDpsYWJlbD1cIml0ZW0udGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNsb3RzWydzZWFyY2hfJyArIGtleV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoXycgKyBrZXldXCIgOnNjb3BlPVwieyAuLi5zZWFyY2hFdmVudENvbnRleHRSZWYsIGtleSB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZnMtY29tcG9uZW50LXJlbmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICB2LWlmPVwiaXRlbS5jb21wb25lbnQgJiYgaXRlbS5jb21wb25lbnQuc2hvdyAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6cmVmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRSZW5kZXJSZWZzW2l0ZW0ua2V5XSA9IGVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOm1vZGVsLXZhbHVlPVwiZ2V0KGZvcm0sIGtleSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2LWJpbmQ9XCJpdGVtLmNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDpzY29wZT1cInNlYXJjaEV2ZW50Q29udGV4dFJlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJvblZhbHVlQ2hhbmdlZCgkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlucHV0PVwib25JbnB1dChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cInNsb3RzWydzZWFyY2gtbWlkZGxlJ11cIiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLW1pZGRsZVwiPlxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLW1pZGRsZSddXCIgOnNjb3BlPVwic2VhcmNoRXZlbnRDb250ZXh0UmVmXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxmcy1zZWFyY2gtYnV0dG9ucyB2LWlmPVwiIWNvbXB1dGVkSXNNdWx0aUxpbmVcIiA6YnV0dG9ucz1cImNvbXB1dGVkQnV0dG9uc1wiPjwvZnMtc2VhcmNoLWJ1dHRvbnM+XG4gICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwic2xvdHNbJ3NlYXJjaC1yaWdodCddXCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLXJpZ2h0J11cIiA6c2NvcGU9XCJzZWFyY2hFdmVudENvbnRleHRSZWZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZnMtc2VhcmNoLWJ1dHRvbnMgdi1pZj1cImNvbXB1dGVkSXNNdWx0aUxpbmVcIiA6YnV0dG9ucz1cImNvbXB1dGVkQnV0dG9uc1wiPjwvZnMtc2VhcmNoLWJ1dHRvbnM+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJjb21wdXRlZElzTXVsdGlMaW5lXCIgY2xhc3M9XCJmcy1zZWFyY2gtYWN0aW9uXCI+XG4gICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIj5cbiAgICAgICAgICAgICAgPGZzLWJ1dHRvbiA6aWNvbj1cImNvbGxhcHNlID8gdWkuaWNvbnMuY2FyZXRVcCA6IHVpLmljb25zLmNhcmV0RG93blwiIEBjbGljaz1cInRvZ2dsZUNvbGxhcHNlXCIgLz5cbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvZGl2PlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgb25Nb3VudGVkLCByZWFjdGl2ZSwgcmVmLCBSZWYsIHVucmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZWFjaCwgZm9yRWFjaCwgc29ydEJ5LCBlbnRyaWVzLCB1bnNldCwgc2V0LCBrZXlzLCBnZXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtY29tcHV0ZVwiO1xuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgRnNTZWFyY2hCdXR0b25zIGZyb20gXCIuL2J1dHRvbnMudnVlXCI7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcbmltcG9ydCB7IEJ1dHRvbnNQcm9wcywgU2VhcmNoRXZlbnRDb250ZXh0LCBTZWFyY2hJdGVtUHJvcHMgfSBmcm9tIFwiLi4vLi4vZFwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS11aVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1tZXJnZVwiO1xuXG4vKipcbiAqIOafpeivouahhue7hOS7tlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzU2VhcmNoVjFcIixcbiAgY29tcG9uZW50czogeyBGc1NlYXJjaEJ1dHRvbnMgfSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDliJ3lp4vmn6Xor6LmnaHku7ZcbiAgICAgKiDngrnlh7vph43nva7vvIzkvJrph43nva7miJDor6XmnaHku7ZcbiAgICAgKi9cbiAgICBpbml0aWFsRm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDooajljZXlj4LmlbBcbiAgICAgKiDmlK/mjIFlbC1mb3JtIHwgYS1mb3Jt55qE5bGe5oCnXG4gICAgICovXG4gICAgb3B0aW9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmn6Xor6LlrZfmrrXphY3nva5cbiAgICAgKi9cbiAgICBjb2x1bW5zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHRhYnNcbiAgICAgKiB7IHNob3cgLCBvcHRpb25zLGtleSwgZGVmYXVsdH1cbiAgICAgKi9cbiAgICB0YWJzOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaMiemSrumFjee9rizlj6/ku6XmoLnmja5vcmRlcuaOkuW6j1xuICAgICAqIHtzZWFyY2g6ey4uLkZzQnV0dG9ufSxyZXNldDp7Li4uRnNCdXR0b259fVxuICAgICAqL1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog54K55Ye76YeN572u5ZCO5piv5ZCm56uL5Y2z6Kem5Y+R5p+l6K+iXG4gICAgICovXG4gICAgc2VhcmNoQWZ0ZXJSZXNldDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuW8gOWQr+iHquWKqOafpeivolxuICAgICAqL1xuICAgIGF1dG9TZWFyY2g6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDoh6rliqjmn6Xor6LvvIzpmLLmipborr7nva5cbiAgICAgKiDkvKBmYWxzZeWImeWFs+mXreiHquWKqOafpeivolxuICAgICAqL1xuICAgIGRlYm91bmNlOiB7XG4gICAgICB0eXBlOiBbQm9vbGVhbiwgT2JqZWN0XSxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5o+S5qe9XG4gICAgICovXG4gICAgc2xvdHM6IHtcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuaYvuekuuafpeivouahhlxuICAgICAqL1xuICAgIHNob3c6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKblkK/nlKjmoKHpqoxcbiAgICAgKi9cbiAgICB2YWxpZGF0ZToge1xuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW4g+WxgCwgc2luZ2xlLWxpbmUg5Y2V6KGM77yMIG11bHRpLWxpbmUg5aSa6KGM77yI5pSv5oyB5bGV5byA5pS26LW377yJXG4gICAgICovXG4gICAgbGF5b3V0OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcInNpbmdsZS1saW5lXCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWIl+eahOWuveW6puiuvue9ru+8jHNwYW49eHhcbiAgICAgKi9cbiAgICBjb2w6IHt9LFxuXG4gICAgLyoqXG4gICAgICog5piv5ZCm5oqY5Y+gXG4gICAgICovXG4gICAgY29sbGFwc2U6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcbiAgICAvKipcbiAgICAgKiDmn6Xor6Lkuovku7ZcbiAgICAgKiovXG4gICAgXCJzZWFyY2hcIixcbiAgICAvKipcbiAgICAgKiDph43nva7kuovku7ZcbiAgICAgKiovXG4gICAgXCJyZXNldFwiLFxuICAgIFwiY29sbGFwc2VcIixcbiAgICBcInVwZGF0ZTpjb2xsYXBzZVwiXG4gIF0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIC8vIOW8guatpXNldHVw6ZyA6KaB5pS+5Zyo56ys5LiA5LiqYXdhaXTkuYvliY1cbiAgICAvLyBvbk1vdW50ZWQgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBiZSBhc3NvY2lhdGVkIHdpdGguXG4gICAgLy/kuLrllaXkvJrmnInov5nkuKrorablkYpcbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgaWYgKGNvbXB1dGVkSXNNdWx0aUxpbmUudmFsdWUgJiYgY29sdW1uc1Jvd1JlZi52YWx1ZSkge1xuICAgICAgICBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID0gY29sdW1uc1Jvd1JlZi52YWx1ZS4kZWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBjb25zdCBjb2x1bW5zTGlzdCA9IGNvbHVtbnNSb3dSZWYudmFsdWUuJGVsLmNoaWxkcmVuO1xuICAgICAgICBpZiAoY29sdW1uc0xpc3QgJiYgY29sdW1uc0xpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGNvbHVtbnNMaW5lSGVpZ2h0UmVmLnZhbHVlID0gY29sdW1uc0xpc3RbMV0ub2Zmc2V0SGVpZ2h0ICsgMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IGF1dG9TZWFyY2g6IGFueSA9IG51bGw7XG4gICAgZnVuY3Rpb24gY3JlYXRlSW5pdGlhbEZvcm0oKSB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHJldHVybiBjbG9uZURlZXAocHJvcHMuaW5pdGlhbEZvcm0gfHwge30pO1xuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVhY3RpdmUoY3JlYXRlSW5pdGlhbEZvcm0oKSk7XG4gICAgY29uc3QgeyBkb0NvbXB1dGVkLCBBc3luY0NvbXB1dGVWYWx1ZSB9ID0gdXNlQ29tcHV0ZSgpO1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLnZhbHVlICE9IG51bGwgJiYgaXRlbS52YWx1ZSBpbnN0YW5jZW9mIEFzeW5jQ29tcHV0ZVZhbHVlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwic2VhcmNoLnZhbHVl6YWN572u5LiN5pSv5oyBQXN5bmNDb21wdXRl57G75Z6L55qE5Yqo5oCB6K6h566XXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgZG9NZXJnZSA9IG1lcmdlO1xuICAgIGNvbnN0IGNvbXB1dGVkQ29sdW1ucyA9IGRvQ29tcHV0ZWQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gcHJvcHMuY29sdW1ucztcbiAgICAgIH0sXG4gICAgICBnZXRDb250ZXh0Rm4sXG4gICAgICBudWxsLFxuICAgICAgKHZhbHVlKSA9PiB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBpZiAoIXByb3BzLnZhbGlkYXRlKSB7XG4gICAgICAgICAgLy/lpoLmnpzlhbPpl612YWxpZGF0ZeWImeWOu+aOiXJ1bGVzXG4gICAgICAgICAgZm9yRWFjaCh2YWx1ZSwgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtLnJ1bGVzO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIOWQiOW5tmNvbFxuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgaWYgKHByb3BzLmNvbCkge1xuICAgICAgICAgIGZvckVhY2godmFsdWUsICh2KSA9PiB7XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIHYuY29sID0gbWVyZ2Uoe30sIHByb3BzLmNvbCwgdi5jb2wpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/lrZfmrrXmjpLluo9cbiAgICAgICAgbGV0IHNvcnRBcnI6IFNlYXJjaEl0ZW1Qcm9wc1tdID0gW107XG4gICAgICAgIGZvckVhY2godmFsdWUsICh2LCBrZXkpID0+IHtcbiAgICAgICAgICB2Ll9rZXkgPSBrZXk7XG4gICAgICAgICAgc29ydEFyci5wdXNoKHYpO1xuICAgICAgICB9KTtcbiAgICAgICAgc29ydEFyciA9IHNvcnRCeShzb3J0QXJyLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLm9yZGVyID8/IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNvcnRlZENvbHVtbnM6IHtcbiAgICAgICAgICBba2V5OiBzdHJpbmddOiBTZWFyY2hJdGVtUHJvcHM7XG4gICAgICAgIH0gPSB7fTtcblxuICAgICAgICBzb3J0QXJyLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBsZXQgX2tleSA9IGl0ZW0uX2tleTtcbiAgICAgICAgICBkZWxldGUgaXRlbS5fa2V5O1xuICAgICAgICAgIHNvcnRlZENvbHVtbnNbX2tleV0gPSBpdGVtO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNvcnRlZENvbHVtbnM7XG4gICAgICB9XG4gICAgKTtcblxuICAgIC8v6buY6K6k5YC8XG4gICAgZm9yRWFjaChjb21wdXRlZENvbHVtbnMudmFsdWUsIChjb2x1bW4sIGtleSkgPT4ge1xuICAgICAgaWYgKGNvbHVtbi52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlZlZhbHVlID0gdW5yZWYoY29sdW1uLnZhbHVlKTtcbiAgICAgIGlmIChkZWZWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbi5zaG93ICE9PSBmYWxzZSAmJiBjb2x1bW4uY29tcG9uZW50Py5zaG93ICE9PSBmYWxzZSkge1xuICAgICAgICAvL+m7mOiupOWAvFxuICAgICAgICBmb3JtW2tleV0gPSBkZWZWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzZWFyY2hGb3JtUmVmID0gcmVmKCk7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG4gICAgY29uc3QgY29tcG9uZW50UmVuZGVyUmVmczogUmVmID0gcmVmKHt9KTtcbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnRSZW5kZXJSZWZzLnZhbHVlW2tleV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5KT8uJHJlZnM/LnRhcmdldFJlZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb250ZXh0Rm4oKTogU2VhcmNoRXZlbnRDb250ZXh0IHtcbiAgICAgIHJldHVybiB7IGZvcm0sIHZhbGlkYXRlZEZvcm06IGZvcm0sIGdldENvbXBvbmVudFJlZiwgZG9WYWxpZGF0ZTogbnVsbCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaEV2ZW50Q29udGV4dFJlZjogUmVmPFNlYXJjaEV2ZW50Q29udGV4dD4gPSByZWYoZ2V0Q29udGV4dEZuKCkpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG9TZWFyY2goKSB7XG4gICAgICBpZiAoYXV0b1NlYXJjaCkge1xuICAgICAgICAvLyDpmLLmipbmn6Xor6Llj5bmtohcbiAgICAgICAgYXV0b1NlYXJjaC5jYW5jZWwoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsaWQgPSBhd2FpdCB1aS5mb3JtLnZhbGlkYXRlV3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlKTtcbiAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICBjdHguZW1pdChcInNlYXJjaFwiLCBzZWFyY2hFdmVudENvbnRleHRSZWYudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWkubWVzc2FnZS5lcnJvcih7XG4gICAgICAgICAgbWVzc2FnZTogdChcImZzLnNlYXJjaC5lcnJvci5tZXNzYWdlXCIpXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9SZXNldCgpIHtcbiAgICAgIC8vIHVpLmZvcm0ucmVzZXRXcmFwKHNlYXJjaEZvcm1SZWYudmFsdWUsIHsgZm9ybSwgaW5pdGlhbEZvcm06IGNyZWF0ZUluaXRpYWxGb3JtKCkgfSk7XG4gICAgICBjb25zdCBpbml0aWFsRm9ybSA9IGNyZWF0ZUluaXRpYWxGb3JtKCk7XG4gICAgICBjb25zdCBlbnRyaWVzUmV0ID0gZW50cmllcyhmb3JtKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllc1JldCkge1xuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBnZXQoaW5pdGlhbEZvcm0sIGVudHJ5WzBdKTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgdW5zZXQoZm9ybSwgZW50cnlbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldChmb3JtLCBlbnRyeVswXSwgaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocHJvcHMucmVzZXQpIHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIHByb3BzLnJlc2V0KHNlYXJjaEV2ZW50Q29udGV4dFJlZi52YWx1ZSk7XG4gICAgICB9XG4gICAgICAvLyDooajljZXph43nva7kuovku7ZcbiAgICAgIGN0eC5lbWl0KFwicmVzZXRcIiwgZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocHJvcHMuc2VhcmNoQWZ0ZXJSZXNldCkge1xuICAgICAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgZG9TZWFyY2goKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkQnV0dG9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IGJ0bnM6IGFueSA9IFtdO1xuICAgICAgY29uc3QgZGVmQnRuT3B0aW9uczogQnV0dG9uc1Byb3BzPFNlYXJjaEV2ZW50Q29udGV4dD4gPSB7XG4gICAgICAgIHNlYXJjaDoge1xuICAgICAgICAgIHNob3c6IHRydWUsXG4gICAgICAgICAgdHlwZTogXCJwcmltYXJ5XCIsXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIGNsaWNrOiAoY29udGV4dDogU2VhcmNoRXZlbnRDb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5zZWFyY2gudGV4dFwiKSAvLyAn5p+l6K+iJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICBjbGljazogKGNvbnRleHQ6IFNlYXJjaEV2ZW50Q29udGV4dCkgPT4ge1xuICAgICAgICAgICAgZG9SZXNldCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5yZXNldC50ZXh0XCIpLCAvLyAn6YeN572uJyxcbiAgICAgICAgICBvcmRlcjogMlxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBtZXJnZShkZWZCdG5PcHRpb25zLCBwcm9wcy5idXR0b25zKTtcbiAgICAgIGZvciAobGV0IGtleSBpbiBkZWZCdG5PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJ0biA9IGRlZkJ0bk9wdGlvbnNba2V5XTtcbiAgICAgICAgYnRuLl9jbGljayA9ICgpID0+IHtcbiAgICAgICAgICBidG4uY2xpY2soZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgICB9O1xuICAgICAgICBidG5zLnB1c2goYnRuKTtcbiAgICAgIH1cblxuICAgICAgYnRucy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gYS5vcmRlciAtIGIub3JkZXI7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBidG5zO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gaW5pdEF1dG9TZWFyY2goKSB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmIChwcm9wcy5hdXRvU2VhcmNoID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyDmnoTlu7rpmLLmipbmn6Xor6Llh73mlbBcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHByb3BzLmRlYm91bmNlICE9PSBmYWxzZSkge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgbGV0IHdhaXQgPSBwcm9wcy5kZWJvdW5jZT8ud2FpdCB8fCA1MDA7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBhdXRvU2VhcmNoID0gZGVib3VuY2UoZG9TZWFyY2gsIHdhaXQsIHByb3BzLmRlYm91bmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0QXV0b1NlYXJjaCgpO1xuXG4gICAgZnVuY3Rpb24gZ2V0Rm9ybSgpIHtcbiAgICAgIHJldHVybiBmb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuvue9rmZvcm3lgLxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRGb3JtKG5ld0Zvcm06IGFueSwgbWVyZ2UgPSB0cnVlKSB7XG4gICAgICBpZiAoIW1lcmdlKSB7XG4gICAgICAgIGVhY2goa2V5cyhmb3JtKSwgKGl0ZW0pID0+IHtcbiAgICAgICAgICBkZWxldGUgZm9ybVtpdGVtXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBkb01lcmdlKGZvcm0sIG5ld0Zvcm0pO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0RXZlbnREaXNhYmxlZCA9IHJlZihmYWxzZSk7XG5cbiAgICBjb25zdCBkb0F1dG9TZWFyY2ggPSAoKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJkbyBhdXRvIHNlYXJjaCxpbnB1dEV2ZW50RGlzYWJsZWQ6XCIsIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSk7XG4gICAgICBpZiAoaW5wdXRFdmVudERpc2FibGVkLnZhbHVlICE9PSB0cnVlICYmIGF1dG9TZWFyY2gpIHtcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+iXG4gICAgICAgIGF1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25JbnB1dCA9IChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyDovpPlhaXms5Xnm5HlkKxcbiAgICBjb25zdCBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQgPSAoZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSA9IGRpc2FibGVkO1xuICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG9uVmFsdWVDaGFuZ2VkKHZhbHVlOiBhbnksIGl0ZW06IFNlYXJjaEl0ZW1Qcm9wcykge1xuICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XG4gICAgICBzZXQoZm9ybSwga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoaXRlbS52YWx1ZUNoYW5nZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtW2tleV07XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGdldENvbXBvbmVudFJlZihrZXkpO1xuICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZSA9IGl0ZW0udmFsdWVDaGFuZ2UgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGl0ZW0udmFsdWVDaGFuZ2UgOiBpdGVtLnZhbHVlQ2hhbmdlLmhhbmRsZTtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIHZhbHVlQ2hhbmdlKHsga2V5LCB2YWx1ZSwgY29tcG9uZW50UmVmLCAuLi5nZXRDb250ZXh0Rm4oKSwgaW1taWRpYXRlOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09IG51bGwgfHwgaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gdHJ1ZSB8fCBpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSBcImNoYW5nZVwiKSB7XG4gICAgICAgIGRvQXV0b1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkUnVsZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmICghcHJvcHMudmFsaWRhdGUpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9ucy5ydWxlcztcbiAgICB9KTtcblxuICAgIC8vLS0tLS3lpJrooYzmqKHlvI/mipjlj6BcblxuICAgIGNvbnN0IGNvbHVtbnNSb3dSZWYgPSByZWYoKTtcbiAgICBjb25zdCBjb2x1bW5zQm94SGVpZ2h0UmVmID0gcmVmKDApO1xuICAgIGNvbnN0IGNvbHVtbnNMaW5lSGVpZ2h0UmVmID0gcmVmKDApO1xuXG4gICAgY29uc3QgdG9nZ2xlQ29sbGFwc2UgPSAoKSA9PiB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOmNvbGxhcHNlXCIsICFwcm9wcy5jb2xsYXBzZSk7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGN0eC5lbWl0KFwiY29sbGFwc2VcIiwgIXByb3BzLmNvbGxhcHNlKTtcbiAgICB9O1xuXG4gICAgY29uc3QgY29tcHV0ZWRDb2xOYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocHJvcHMubGF5b3V0ID09PSBcIm11bHRpLWxpbmVcIikge1xuICAgICAgICByZXR1cm4gdWkuY29sLm5hbWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJkaXZcIjtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlZElzTXVsdGlMaW5lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICByZXR1cm4gcHJvcHMubGF5b3V0ID09PSBcIm11bHRpLWxpbmVcIjtcbiAgICAgIC8v5LiN6KaB6L+Z5Liq77yM5Lya5q275b6q546v77yMICYmIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPiBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKCFjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBcImF1dG9cIjtcbiAgICAgIH1cbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHByb3BzLmNvbGxhcHNlKSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZSA/IGNvbHVtbnNMaW5lSGVpZ2h0UmVmLnZhbHVlICsgXCJweFwiIDogXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID8gY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSArIFwicHhcIiA6IFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0OiAoZm9ybTogYW55LCBrZXk6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KGZvcm0sIGtleSk7XG4gICAgICB9LFxuICAgICAgdWksXG4gICAgICBvblZhbHVlQ2hhbmdlZCxcbiAgICAgIGRvU2VhcmNoLFxuICAgICAgZG9SZXNldCxcbiAgICAgIGZvcm0sXG4gICAgICBjb21wb25lbnRSZW5kZXJSZWZzLFxuICAgICAgZ2V0Q29tcG9uZW50UmVuZGVyUmVmLFxuICAgICAgZ2V0Q29tcG9uZW50UmVmLFxuICAgICAgZ2V0Rm9ybSxcbiAgICAgIHNldEZvcm0sXG4gICAgICBzZWFyY2hGb3JtUmVmLFxuICAgICAgb25JbnB1dCxcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZCxcbiAgICAgIGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCxcbiAgICAgIGNvbXB1dGVkQ29sdW1ucyxcbiAgICAgIGNvbXB1dGVkQnV0dG9ucyxcbiAgICAgIGNvbXB1dGVkUnVsZXMsXG4gICAgICBjb2x1bW5zUm93UmVmLFxuICAgICAgY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQsXG4gICAgICBjb21wdXRlZENvbE5hbWUsXG4gICAgICBjb21wdXRlZElzTXVsdGlMaW5lLFxuICAgICAgdG9nZ2xlQ29sbGFwc2UsXG4gICAgICBzZWFyY2hFdmVudENvbnRleHRSZWZcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtc2VhcmNoIHtcbiAgLy9kaXNwbGF5OiBmbGV4O1xuICAvL2ZsZXgtd3JhcDogbm93cmFwO1xuICAuc2VhcmNoLWxlZnQge1xuICB9XG4gIC5zZWFyY2gtcmlnaHQge1xuICAgIGZsZXg6IDE7XG4gIH1cbiAgLmFudC1mb3JtLWlubGluZSB7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICB9XG4gIC5mcy1zZWFyY2gtZm9ybSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAvLyYgPiAqIHtcbiAgICAvLyAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgIC8vICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgLy8gIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAvL31cblxuICAgIC5mcy1zZWFyY2gtYm94IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAuZnMtc2VhcmNoLW1haW4ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgIH1cbiAgICAuZnMtc2VhcmNoLWNvbCB7XG4gICAgICAmID4gKiB7XG4gICAgICAgIG1hcmdpbjogMHB4IDVweDtcbiAgICAgIH1cbiAgICAgIG1hcmdpbjogMXB4IDA7XG4gICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgLy8gbWFyZ2luLWxlZnQ6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmVsLWZvcm0taXRlbSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiA0cHg7XG4gICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG5cbiAgICAuZWwtZm9ybS0taW5saW5lIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cblxuICAgIC5lbC1mb3JtLWl0ZW1fX2NvbnRlbnQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICB9XG5cbiAgLmZzLXNlYXJjaC1idG5zIHtcbiAgICAuZnMtYnV0dG9uIHtcbiAgICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICAgIH1cbiAgfVxuXG4gICYuZnMtc2VhcmNoLW11bHRpLWxpbmUge1xuICAgIC5mcy1zZWFyY2gtYm94IHtcbiAgICAgIC5mcy1zZWFyY2gtbWFpbiB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIC5mcy1zZWFyY2gtY29sdW1ucyB7XG4gICAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAgIG92ZXJmbG93LXk6IGhpZGRlbjtcbiAgICAgICAgICAvLyB0cmFuc2l0aW9uOiBhbGwgMC4zcyBsaW5lYXI7XG4gICAgICAgICAgLy8gd2lsbC1jaGFuZ2U6IGhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICAuZnMtc2VhcmNoLWJ0bnMge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICAgICAgLmVsLWZvcm0taXRlbV9fY29udGVudCB7XG4gICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAubi1mb3JtLWl0ZW0tYmxhbmsge1xuICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAuZnMtc2VhcmNoLWFjdGlvbiB7XG4gICAgICAuYW50LWZvcm0taXRlbSB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4uZnMtc2VhcmNoIHtcbiAgLm4tZm9ybS1pdGVtLWJsYW5rIHtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jb2xsYXBzZVRyYW5zaXRpb24ubmFtZVwiPlxuICAgIDxkaXYgdi1pZj1cInNob3cgIT09IGZhbHNlXCIgY2xhc3M9XCJmcy1zZWFyY2hcIiA6Y2xhc3M9XCJ7ICdmcy1zZWFyY2gtbXVsdGktbGluZSc6IGNvbXB1dGVkSXNNdWx0aUxpbmUgfVwiPlxuICAgICAgPGNvbXBvbmVudFxuICAgICAgICA6aXM9XCJ1aS5mb3JtLm5hbWVcIlxuICAgICAgICByZWY9XCJzZWFyY2hGb3JtUmVmXCJcbiAgICAgICAgOm1vZGVsPVwiZm9ybVwiXG4gICAgICAgIHYtYmluZD1cIm9wdGlvbnNcIlxuICAgICAgICA6cnVsZXM9XCJjb21wdXRlZFJ1bGVzXCJcbiAgICAgICAgY2xhc3M9XCJmcy1zZWFyY2gtZm9ybVwiXG4gICAgICAgIEBjb21wb3NpdGlvbnN0YXJ0PVwiY2hhbmdlSW5wdXRFdmVudERpc2FibGVkKHRydWUpXCJcbiAgICAgICAgQGNvbXBvc2l0aW9uZW5kPVwiY2hhbmdlSW5wdXRFdmVudERpc2FibGVkKGZhbHNlKVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtYm94XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1tYWluXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWNvbHVtbnNcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7ICdmcy1zZWFyY2gtY29sbGFwc2UnOiBjb2xsYXBzZSB9XCJcbiAgICAgICAgICAgICAgOnN0eWxlPVwieyBoZWlnaHQ6IGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0IH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgcmVmPVwiY29sdW1uc1Jvd1JlZlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cInNsb3RzWydzZWFyY2gtbGVmdCddXCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sXCI+XG4gICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtbGVmdCddXCIgOnNjb3BlPVwic2VhcmNoRXZlbnRDb250ZXh0UmVmXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBrZXkpIGluIGNvbXB1dGVkQ29sdW1uc1wiIDprZXk9XCJrZXlcIj5cbiAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwiY29tcHV0ZWRDb2xOYW1lXCIgdi1pZj1cIml0ZW0uc2hvdyA9PT0gdHJ1ZVwiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbFwiIHYtYmluZD1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiIHYtYmluZD1cIml0ZW1cIiA6W3VpLmZvcm1JdGVtLnByb3BdPVwia2V5XCIgOmxhYmVsPVwiaXRlbS50aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2xvdHNbJ3NlYXJjaF8nICsga2V5XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2hfJyArIGtleV1cIiA6c2NvcGU9XCJ7IC4uLnNlYXJjaEV2ZW50Q29udGV4dFJlZiwga2V5IH1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxmcy1jb21wb25lbnQtcmVuZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHYtaWY9XCJpdGVtLmNvbXBvbmVudCAmJiBpdGVtLmNvbXBvbmVudC5zaG93ICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDpyZWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlbmRlclJlZnNbaXRlbS5rZXldID0gZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6bW9kZWwtdmFsdWU9XCJnZXQoZm9ybSwga2V5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHYtYmluZD1cIml0ZW0uY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOnNjb3BlPVwic2VhcmNoRXZlbnRDb250ZXh0UmVmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQHVwZGF0ZTptb2RlbC12YWx1ZT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaW5wdXQ9XCJvbklucHV0KGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwic2xvdHNbJ3NlYXJjaC1taWRkbGUnXVwiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtbWlkZGxlXCI+XG4gICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtbWlkZGxlJ11cIiA6c2NvcGU9XCJzZWFyY2hFdmVudENvbnRleHRSZWZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGZzLXNlYXJjaC1idXR0b25zIHYtaWY9XCIhY29tcHV0ZWRJc011bHRpTGluZVwiIDpidXR0b25zPVwiY29tcHV0ZWRCdXR0b25zXCI+PC9mcy1zZWFyY2gtYnV0dG9ucz5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJzbG90c1snc2VhcmNoLXJpZ2h0J11cIiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtcmlnaHQnXVwiIDpzY29wZT1cInNlYXJjaEV2ZW50Q29udGV4dFJlZlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxmcy1zZWFyY2gtYnV0dG9ucyB2LWlmPVwiY29tcHV0ZWRJc011bHRpTGluZVwiIDpidXR0b25zPVwiY29tcHV0ZWRCdXR0b25zXCI+PC9mcy1zZWFyY2gtYnV0dG9ucz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgdi1pZj1cImNvbXB1dGVkSXNNdWx0aUxpbmVcIiBjbGFzcz1cImZzLXNlYXJjaC1hY3Rpb25cIj5cbiAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxuICAgICAgICAgICAgICA8ZnMtYnV0dG9uIDppY29uPVwiY29sbGFwc2UgPyB1aS5pY29ucy5jYXJldFVwIDogdWkuaWNvbnMuY2FyZXREb3duXCIgQGNsaWNrPVwidG9nZ2xlQ29sbGFwc2VcIiAvPlxuICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgPC9kaXY+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCBvbk1vdW50ZWQsIHJlYWN0aXZlLCByZWYsIFJlZiwgdW5yZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBlYWNoLCBmb3JFYWNoLCBzb3J0QnksIGVudHJpZXMsIHVuc2V0LCBzZXQsIGtleXMsIGdldCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IHVzZUNvbXB1dGUgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1jb21wdXRlXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IGxvZ2dlciBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5sb2dcIjtcbmltcG9ydCBGc1NlYXJjaEJ1dHRvbnMgZnJvbSBcIi4vYnV0dG9ucy52dWVcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgQnV0dG9uc1Byb3BzLCBTZWFyY2hFdmVudENvbnRleHQsIFNlYXJjaEl0ZW1Qcm9wcyB9IGZyb20gXCIuLi8uLi9kXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLXVpXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLW1lcmdlXCI7XG5cbi8qKlxuICog5p+l6K+i5qGG57uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNTZWFyY2hWMVwiLFxuICBjb21wb25lbnRzOiB7IEZzU2VhcmNoQnV0dG9ucyB9LFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOWIneWni+afpeivouadoeS7tlxuICAgICAqIOeCueWHu+mHjee9ru+8jOS8mumHjee9ruaIkOivpeadoeS7tlxuICAgICAqL1xuICAgIGluaXRpYWxGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOWNleWPguaVsFxuICAgICAqIOaUr+aMgWVsLWZvcm0gfCBhLWZvcm3nmoTlsZ7mgKdcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOafpeivouWtl+autemFjee9rlxuICAgICAqL1xuICAgIGNvbHVtbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICogdGFic1xuICAgICAqIHsgc2hvdyAsIG9wdGlvbnMsa2V5LCBkZWZhdWx0fVxuICAgICAqL1xuICAgIHRhYnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uLOWPr+S7peagueaNrm9yZGVy5o6S5bqPXG4gICAgICoge3NlYXJjaDp7Li4uRnNCdXR0b259LHJlc2V0OnsuLi5Gc0J1dHRvbn19XG4gICAgICovXG4gICAgYnV0dG9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDngrnlh7vph43nva7lkI7mmK/lkKbnq4vljbPop6blj5Hmn6Xor6JcbiAgICAgKi9cbiAgICBzZWFyY2hBZnRlclJlc2V0OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5byA5ZCv6Ieq5Yqo5p+l6K+iXG4gICAgICovXG4gICAgYXV0b1NlYXJjaDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOiHquWKqOafpeivou+8jOmYsuaKluiuvue9rlxuICAgICAqIOS8oGZhbHNl5YiZ5YWz6Zet6Ieq5Yqo5p+l6K+iXG4gICAgICovXG4gICAgZGVib3VuY2U6IHtcbiAgICAgIHR5cGU6IFtCb29sZWFuLCBPYmplY3RdLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmj5Lmp71cbiAgICAgKi9cbiAgICBzbG90czoge1xuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5pi+56S65p+l6K+i5qGGXG4gICAgICovXG4gICAgc2hvdzoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuWQr+eUqOagoemqjFxuICAgICAqL1xuICAgIHZhbGlkYXRlOiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5biD5bGALCBzaW5nbGUtbGluZSDljZXooYzvvIwgbXVsdGktbGluZSDlpJrooYzvvIjmlK/mjIHlsZXlvIDmlLbotbfvvIlcbiAgICAgKi9cbiAgICBsYXlvdXQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IFwic2luZ2xlLWxpbmVcIlxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5YiX55qE5a695bqm6K6+572u77yMc3Bhbj14eFxuICAgICAqL1xuICAgIGNvbDoge30sXG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKbmipjlj6BcbiAgICAgKi9cbiAgICBjb2xsYXBzZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBlbWl0czogW1xuICAgIC8qKlxuICAgICAqIOafpeivouS6i+S7tlxuICAgICAqKi9cbiAgICBcInNlYXJjaFwiLFxuICAgIC8qKlxuICAgICAqIOmHjee9ruS6i+S7tlxuICAgICAqKi9cbiAgICBcInJlc2V0XCIsXG4gICAgXCJjb2xsYXBzZVwiLFxuICAgIFwidXBkYXRlOmNvbGxhcHNlXCJcbiAgXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgLy8g5byC5q2lc2V0dXDpnIDopoHmlL7lnKjnrKzkuIDkuKphd2FpdOS5i+WJjVxuICAgIC8vIG9uTW91bnRlZCBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAvL+S4uuWVpeS8muaciei/meS4quitpuWRilxuICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICBpZiAoY29tcHV0ZWRJc011bHRpTGluZS52YWx1ZSAmJiBjb2x1bW5zUm93UmVmLnZhbHVlKSB7XG4gICAgICAgIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPSBjb2x1bW5zUm93UmVmLnZhbHVlLiRlbC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGNvbHVtbnNMaXN0ID0gY29sdW1uc1Jvd1JlZi52YWx1ZS4kZWwuY2hpbGRyZW47XG4gICAgICAgIGlmIChjb2x1bW5zTGlzdCAmJiBjb2x1bW5zTGlzdC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgY29sdW1uc0xpbmVIZWlnaHRSZWYudmFsdWUgPSBjb2x1bW5zTGlzdFsxXS5vZmZzZXRIZWlnaHQgKyAyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgYXV0b1NlYXJjaDogYW55ID0gbnVsbDtcbiAgICBmdW5jdGlvbiBjcmVhdGVJbml0aWFsRm9ybSgpIHtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIGNsb25lRGVlcChwcm9wcy5pbml0aWFsRm9ybSB8fCB7fSk7XG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZWFjdGl2ZShjcmVhdGVJbml0aWFsRm9ybSgpKTtcbiAgICBjb25zdCB7IGRvQ29tcHV0ZWQsIEFzeW5jQ29tcHV0ZVZhbHVlIH0gPSB1c2VDb21wdXRlKCk7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0udmFsdWUgIT0gbnVsbCAmJiBpdGVtLnZhbHVlIGluc3RhbmNlb2YgQXN5bmNDb21wdXRlVmFsdWUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJzZWFyY2gudmFsdWXphY3nva7kuI3mlK/mjIFBc3luY0NvbXB1dGXnsbvlnovnmoTliqjmgIHorqHnrpdcIik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCBkb01lcmdlID0gbWVyZ2U7XG4gICAgY29uc3QgY29tcHV0ZWRDb2x1bW5zID0gZG9Db21wdXRlZChcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBwcm9wcy5jb2x1bW5zO1xuICAgICAgfSxcbiAgICAgIGdldENvbnRleHRGbixcbiAgICAgIG51bGwsXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGlmICghcHJvcHMudmFsaWRhdGUpIHtcbiAgICAgICAgICAvL+WmguaenOWFs+mXrXZhbGlkYXRl5YiZ5Y675o6JcnVsZXNcbiAgICAgICAgICBmb3JFYWNoKHZhbHVlLCAoaXRlbSkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIGl0ZW0ucnVsZXM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5ZCI5bm2Y29sXG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBpZiAocHJvcHMuY29sKSB7XG4gICAgICAgICAgZm9yRWFjaCh2YWx1ZSwgKHYpID0+IHtcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgdi5jb2wgPSBtZXJnZSh7fSwgcHJvcHMuY29sLCB2LmNvbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL+Wtl+auteaOkuW6j1xuICAgICAgICBsZXQgc29ydEFycjogU2VhcmNoSXRlbVByb3BzW10gPSBbXTtcbiAgICAgICAgZm9yRWFjaCh2YWx1ZSwgKHYsIGtleSkgPT4ge1xuICAgICAgICAgIHYuX2tleSA9IGtleTtcbiAgICAgICAgICBzb3J0QXJyLnB1c2godik7XG4gICAgICAgIH0pO1xuICAgICAgICBzb3J0QXJyID0gc29ydEJ5KHNvcnRBcnIsIChpdGVtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc29ydGVkQ29sdW1uczoge1xuICAgICAgICAgIFtrZXk6IHN0cmluZ106IFNlYXJjaEl0ZW1Qcm9wcztcbiAgICAgICAgfSA9IHt9O1xuXG4gICAgICAgIHNvcnRBcnIuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGxldCBfa2V5ID0gaXRlbS5fa2V5O1xuICAgICAgICAgIGRlbGV0ZSBpdGVtLl9rZXk7XG4gICAgICAgICAgc29ydGVkQ29sdW1uc1tfa2V5XSA9IGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc29ydGVkQ29sdW1ucztcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy/pu5jorqTlgLxcbiAgICBmb3JFYWNoKGNvbXB1dGVkQ29sdW1ucy52YWx1ZSwgKGNvbHVtbiwga2V5KSA9PiB7XG4gICAgICBpZiAoY29sdW1uLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVmVmFsdWUgPSB1bnJlZihjb2x1bW4udmFsdWUpO1xuICAgICAgaWYgKGRlZlZhbHVlICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLnNob3cgIT09IGZhbHNlICYmIGNvbHVtbi5jb21wb25lbnQ/LnNob3cgIT09IGZhbHNlKSB7XG4gICAgICAgIC8v6buY6K6k5YC8XG4gICAgICAgIGZvcm1ba2V5XSA9IGRlZlZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHNlYXJjaEZvcm1SZWYgPSByZWYoKTtcbiAgICBjb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcbiAgICBjb25zdCBjb21wb25lbnRSZW5kZXJSZWZzOiBSZWYgPSByZWYoe30pO1xuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudFJlbmRlclJlZihrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZnMudmFsdWVba2V5XTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudFJlbmRlclJlZihrZXkpPy4kcmVmcz8udGFyZ2V0UmVmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENvbnRleHRGbigpOiBTZWFyY2hFdmVudENvbnRleHQge1xuICAgICAgcmV0dXJuIHsgZm9ybSwgdmFsaWRhdGVkRm9ybTogZm9ybSwgZ2V0Q29tcG9uZW50UmVmLCBkb1ZhbGlkYXRlOiBudWxsIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoRXZlbnRDb250ZXh0UmVmOiBSZWY8U2VhcmNoRXZlbnRDb250ZXh0PiA9IHJlZihnZXRDb250ZXh0Rm4oKSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBkb1NlYXJjaCgpIHtcbiAgICAgIGlmIChhdXRvU2VhcmNoKSB7XG4gICAgICAgIC8vIOmYsuaKluafpeivouWPlua2iFxuICAgICAgICBhdXRvU2VhcmNoLmNhbmNlbCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWxpZCA9IGF3YWl0IHVpLmZvcm0udmFsaWRhdGVXcmFwKHNlYXJjaEZvcm1SZWYudmFsdWUpO1xuICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgIGN0eC5lbWl0KFwic2VhcmNoXCIsIHNlYXJjaEV2ZW50Q29udGV4dFJlZi52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1aS5tZXNzYWdlLmVycm9yKHtcbiAgICAgICAgICBtZXNzYWdlOiB0KFwiZnMuc2VhcmNoLmVycm9yLm1lc3NhZ2VcIilcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkb1Jlc2V0KCkge1xuICAgICAgLy8gdWkuZm9ybS5yZXNldFdyYXAoc2VhcmNoRm9ybVJlZi52YWx1ZSwgeyBmb3JtLCBpbml0aWFsRm9ybTogY3JlYXRlSW5pdGlhbEZvcm0oKSB9KTtcbiAgICAgIGNvbnN0IGluaXRpYWxGb3JtID0gY3JlYXRlSW5pdGlhbEZvcm0oKTtcbiAgICAgIGNvbnN0IGVudHJpZXNSZXQgPSBlbnRyaWVzKGZvcm0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzUmV0KSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IGdldChpbml0aWFsRm9ybSwgZW50cnlbMF0pO1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICB1bnNldChmb3JtLCBlbnRyeVswXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0KGZvcm0sIGVudHJ5WzBdLCBpbml0aWFsVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmIChwcm9wcy5yZXNldCkge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgcHJvcHMucmVzZXQoc2VhcmNoRXZlbnRDb250ZXh0UmVmLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIC8vIOihqOWNlemHjee9ruS6i+S7tlxuICAgICAgY3R4LmVtaXQoXCJyZXNldFwiLCBnZXRDb250ZXh0Rm4oKSk7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmIChwcm9wcy5zZWFyY2hBZnRlclJlc2V0KSB7XG4gICAgICAgIG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgYnRuczogYW55ID0gW107XG4gICAgICBjb25zdCBkZWZCdG5PcHRpb25zOiBCdXR0b25zUHJvcHM8U2VhcmNoRXZlbnRDb250ZXh0PiA9IHtcbiAgICAgICAgc2VhcmNoOiB7XG4gICAgICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBcInByaW1hcnlcIixcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgY2xpY2s6IChjb250ZXh0OiBTZWFyY2hFdmVudENvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmRlcjogMSxcbiAgICAgICAgICB0ZXh0OiB0KFwiZnMuc2VhcmNoLnNlYXJjaC50ZXh0XCIpIC8vICfmn6Xor6InLFxuICAgICAgICB9LFxuICAgICAgICByZXNldDoge1xuICAgICAgICAgIHNob3c6IHRydWUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIGNsaWNrOiAoY29udGV4dDogU2VhcmNoRXZlbnRDb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBkb1Jlc2V0KCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0ZXh0OiB0KFwiZnMuc2VhcmNoLnJlc2V0LnRleHRcIiksIC8vICfph43nva4nLFxuICAgICAgICAgIG9yZGVyOiAyXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIG1lcmdlKGRlZkJ0bk9wdGlvbnMsIHByb3BzLmJ1dHRvbnMpO1xuICAgICAgZm9yIChsZXQga2V5IGluIGRlZkJ0bk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYnRuID0gZGVmQnRuT3B0aW9uc1trZXldO1xuICAgICAgICBidG4uX2NsaWNrID0gKCkgPT4ge1xuICAgICAgICAgIGJ0bi5jbGljayhnZXRDb250ZXh0Rm4oKSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0bnMucHVzaChidG4pO1xuICAgICAgfVxuXG4gICAgICBidG5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJ0bnM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBpbml0QXV0b1NlYXJjaCgpIHtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHByb3BzLmF1dG9TZWFyY2ggPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIOaehOW7uumYsuaKluafpeivouWHveaVsFxuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocHJvcHMuZGVib3VuY2UgIT09IGZhbHNlKSB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBsZXQgd2FpdCA9IHByb3BzLmRlYm91bmNlPy53YWl0IHx8IDUwMDtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGF1dG9TZWFyY2ggPSBkZWJvdW5jZShkb1NlYXJjaCwgd2FpdCwgcHJvcHMuZGVib3VuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGluaXRBdXRvU2VhcmNoKCk7XG5cbiAgICBmdW5jdGlvbiBnZXRGb3JtKCkge1xuICAgICAgcmV0dXJuIGZvcm07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6+572uZm9ybeWAvFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldEZvcm0obmV3Rm9ybTogYW55LCBtZXJnZSA9IHRydWUpIHtcbiAgICAgIGlmICghbWVyZ2UpIHtcbiAgICAgICAgZWFjaChrZXlzKGZvcm0pLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtW2l0ZW1dO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRvTWVyZ2UoZm9ybSwgbmV3Rm9ybSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXRFdmVudERpc2FibGVkID0gcmVmKGZhbHNlKTtcblxuICAgIGNvbnN0IGRvQXV0b1NlYXJjaCA9ICgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImRvIGF1dG8gc2VhcmNoLGlucHV0RXZlbnREaXNhYmxlZDpcIiwgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlKTtcbiAgICAgIGlmIChpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUgIT09IHRydWUgJiYgYXV0b1NlYXJjaCkge1xuICAgICAgICAvLyDpmLLmipbmn6Xor6JcbiAgICAgICAgYXV0b1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbklucHV0ID0gKGl0ZW06IGFueSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IFwiaW5wdXRcIikge1xuICAgICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIOi+k+WFpeazleebkeWQrFxuICAgIGNvbnN0IGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCA9IChkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xuICAgICAgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlID0gZGlzYWJsZWQ7XG4gICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gb25WYWx1ZUNoYW5nZWQodmFsdWU6IGFueSwgaXRlbTogU2VhcmNoSXRlbVByb3BzKSB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcbiAgICAgIHNldChmb3JtLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmIChpdGVtLnZhbHVlQ2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1ba2V5XTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gZ2V0Q29tcG9uZW50UmVmKGtleSk7XG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlID0gaXRlbS52YWx1ZUNoYW5nZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gaXRlbS52YWx1ZUNoYW5nZSA6IGl0ZW0udmFsdWVDaGFuZ2UuaGFuZGxlO1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgdmFsdWVDaGFuZ2UoeyBrZXksIHZhbHVlLCBjb21wb25lbnRSZWYsIC4uLmdldENvbnRleHRGbigpLCBpbW1pZGlhdGU6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT0gbnVsbCB8fCBpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSB0cnVlIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IFwiY2hhbmdlXCIpIHtcbiAgICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRSdWxlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKCFwcm9wcy52YWxpZGF0ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHJldHVybiBwcm9wcy5vcHRpb25zLnJ1bGVzO1xuICAgIH0pO1xuXG4gICAgLy8tLS0tLeWkmuihjOaooeW8j+aKmOWPoFxuXG4gICAgY29uc3QgY29sdW1uc1Jvd1JlZiA9IHJlZigpO1xuICAgIGNvbnN0IGNvbHVtbnNCb3hIZWlnaHRSZWYgPSByZWYoMCk7XG4gICAgY29uc3QgY29sdW1uc0xpbmVIZWlnaHRSZWYgPSByZWYoMCk7XG5cbiAgICBjb25zdCB0b2dnbGVDb2xsYXBzZSA9ICgpID0+IHtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6Y29sbGFwc2VcIiwgIXByb3BzLmNvbGxhcHNlKTtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgY3R4LmVtaXQoXCJjb2xsYXBzZVwiLCAhcHJvcHMuY29sbGFwc2UpO1xuICAgIH07XG5cbiAgICBjb25zdCBjb21wdXRlZENvbE5hbWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmIChwcm9wcy5sYXlvdXQgPT09IFwibXVsdGktbGluZVwiKSB7XG4gICAgICAgIHJldHVybiB1aS5jb2wubmFtZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBcImRpdlwiO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXB1dGVkSXNNdWx0aUxpbmUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHJldHVybiBwcm9wcy5sYXlvdXQgPT09IFwibXVsdGktbGluZVwiO1xuICAgICAgLy/kuI3opoHov5nkuKrvvIzkvJrmrbvlvqrnjq/vvIwgJiYgY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA+IGNvbHVtbnNMaW5lSGVpZ2h0UmVmLnZhbHVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAoIWNvbXB1dGVkSXNNdWx0aUxpbmUudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIFwiYXV0b1wiO1xuICAgICAgfVxuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocHJvcHMuY29sbGFwc2UpIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnNMaW5lSGVpZ2h0UmVmLnZhbHVlID8gY29sdW1uc0xpbmVIZWlnaHRSZWYudmFsdWUgKyBcInB4XCIgOiBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPyBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlICsgXCJweFwiIDogXCJcIjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBnZXQ6IChmb3JtOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBnZXQoZm9ybSwga2V5KTtcbiAgICAgIH0sXG4gICAgICB1aSxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkLFxuICAgICAgZG9TZWFyY2gsXG4gICAgICBkb1Jlc2V0LFxuICAgICAgZm9ybSxcbiAgICAgIGNvbXBvbmVudFJlbmRlclJlZnMsXG4gICAgICBnZXRDb21wb25lbnRSZW5kZXJSZWYsXG4gICAgICBnZXRDb21wb25lbnRSZWYsXG4gICAgICBnZXRGb3JtLFxuICAgICAgc2V0Rm9ybSxcbiAgICAgIHNlYXJjaEZvcm1SZWYsXG4gICAgICBvbklucHV0LFxuICAgICAgaW5wdXRFdmVudERpc2FibGVkLFxuICAgICAgY2hhbmdlSW5wdXRFdmVudERpc2FibGVkLFxuICAgICAgY29tcHV0ZWRDb2x1bW5zLFxuICAgICAgY29tcHV0ZWRCdXR0b25zLFxuICAgICAgY29tcHV0ZWRSdWxlcyxcbiAgICAgIGNvbHVtbnNSb3dSZWYsXG4gICAgICBjb21wdXRlZENvbHVtbkJveEhlaWdodCxcbiAgICAgIGNvbXB1dGVkQ29sTmFtZSxcbiAgICAgIGNvbXB1dGVkSXNNdWx0aUxpbmUsXG4gICAgICB0b2dnbGVDb2xsYXBzZSxcbiAgICAgIHNlYXJjaEV2ZW50Q29udGV4dFJlZlxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1zZWFyY2gge1xuICAvL2Rpc3BsYXk6IGZsZXg7XG4gIC8vZmxleC13cmFwOiBub3dyYXA7XG4gIC5zZWFyY2gtbGVmdCB7XG4gIH1cbiAgLnNlYXJjaC1yaWdodCB7XG4gICAgZmxleDogMTtcbiAgfVxuICAuYW50LWZvcm0taW5saW5lIHtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gIH1cbiAgLmZzLXNlYXJjaC1mb3JtIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIC8vJiA+ICoge1xuICAgIC8vICBtYXJnaW4tYm90dG9tOiA0cHg7XG4gICAgLy8gIG1hcmdpbi10b3A6IDRweDtcbiAgICAvLyAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgIC8vfVxuXG4gICAgLmZzLXNlYXJjaC1ib3gge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIC5mcy1zZWFyY2gtbWFpbiB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgfVxuICAgIC5mcy1zZWFyY2gtY29sIHtcbiAgICAgICYgPiAqIHtcbiAgICAgICAgbWFyZ2luOiAwcHggNXB4O1xuICAgICAgfVxuICAgICAgbWFyZ2luOiAxcHggMDtcbiAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICAvLyBtYXJnaW4tbGVmdDogMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZWwtZm9ybS1pdGVtIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cblxuICAgIC5lbC1mb3JtLS1pbmxpbmUge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuXG4gICAgLmVsLWZvcm0taXRlbV9fY29udGVudCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG4gIH1cblxuICAuZnMtc2VhcmNoLWJ0bnMge1xuICAgIC5mcy1idXR0b24ge1xuICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gICAgfVxuICB9XG5cbiAgJi5mcy1zZWFyY2gtbXVsdGktbGluZSB7XG4gICAgLmZzLXNlYXJjaC1ib3gge1xuICAgICAgLmZzLXNlYXJjaC1tYWluIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgLmZzLXNlYXJjaC1jb2x1bW5zIHtcbiAgICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICAgICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgICAgICAgIC8vIHRyYW5zaXRpb246IGFsbCAwLjNzIGxpbmVhcjtcbiAgICAgICAgICAvLyB3aWxsLWNoYW5nZTogaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIC5mcy1zZWFyY2gtYnRucyB7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICAgICAgICAuZWwtZm9ybS1pdGVtX19jb250ZW50IHtcbiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC5uLWZvcm0taXRlbS1ibGFuayB7XG4gICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC5mcy1zZWFyY2gtYWN0aW9uIHtcbiAgICAgIC5hbnQtZm9ybS1pdGVtIHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi5mcy1zZWFyY2gge1xuICAubi1mb3JtLWl0ZW0tYmxhbmsge1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWxheW91dC1kZWZhdWx0XCIgOmNsYXNzPVwieyAnZnMtc2VhcmNoLW11bHRpLWxpbmUnOiBjb21wdXRlZElzTXVsdGlMaW5lIH1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWJveFwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1tYWluXCJcbiAgICAgICAgOmNsYXNzPVwieyAnZnMtc2VhcmNoLWNvbGxhcHNlJzogY29sbGFwc2UgfVwiXG4gICAgICAgIDpzdHlsZT1cInsgbWF4SGVpZ2h0OiBjb21wdXRlZENvbHVtbkJveEhlaWdodCB9XCJcbiAgICAgID5cbiAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yb3cubmFtZVwiIHJlZj1cImNvbHVtbnNSb3dSZWZcIiBjbGFzcz1cImZzLXNlYXJjaC1jb2x1bW5zXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1zbG90XCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLWxlZnRcIj48L3Nsb3Q+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwhLS0g5p+l6K+i5a2X5q61cmVuZGVy77yM6ZyA6KaB5a6a5LmJcHJvcHMuY29sdW1ucyAtLT5cbiAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwga2V5KSBvZiBjb2x1bW5zXCIgOmtleT1cImtleVwiPlxuICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jb2wubmFtZVwiIHYtaWY9XCJpdGVtLnNob3dcIiBjbGFzcz1cImZzLXNlYXJjaC1jb2xcIiB2LWJpbmQ9XCJtZXJnZUNvbChpdGVtLmNvbClcIj5cbiAgICAgICAgICAgICAgPGZzLXJlbmRlciA6cmVuZGVyLWZ1bmM9XCJpdGVtLl9jZWxsUmVuZGVyXCIgOnNjb3BlPVwiZ2V0Q29udGV4dEZuKClcIiAvPlxuICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLXNsb3RcIj5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2gtbWlkZGxlXCI+PC9zbG90PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICA6aXM9XCJ1aS5jb2wubmFtZVwiXG4gICAgICAgICAgICB2LWlmPVwiIWNvbXB1dGVkSXNNdWx0aUxpbmVcIlxuICAgICAgICAgICAgY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1idXR0b25zLWdyb3VwXCJcbiAgICAgICAgICAgIHYtYmluZD1cIm1lcmdlQ29sKGFjdGlvbj8uY29sKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCIgOlt1aS5mb3JtSXRlbS5sYWJlbF09XCJhY3Rpb24/LmxhYmVsXCI+XG4gICAgICAgICAgICAgIDwhLS0g5p+l6K+i5oyJ6ZKu5o+S5qe9LS0+XG4gICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2gtYnV0dG9uc1wiIHYtYmluZD1cImdldENvbnRleHRGbigpXCI+PC9zbG90PlxuICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1zbG90XCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLXJpZ2h0XCIgdi1iaW5kPVwiZ2V0Q29udGV4dEZuKClcIj48L3Nsb3Q+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiB2LWlmPVwiY29tcHV0ZWRJc011bHRpTGluZVwiIGNsYXNzPVwiZnMtc2VhcmNoLWJ1dHRvbnMtZ3JvdXAgZnMtc2VhcmNoLW11bHRpLWxpbmUtYnV0dG9uc1wiPlxuICAgICAgICA8IS0tIOWkmuihjOaooeW8j+aXtueahOafpeivouaMiemSri0tPlxuICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLWJ1dHRvbnNcIj48L3Nsb3Q+XG4gICAgICAgIDxmcy1idXR0b25cbiAgICAgICAgICB2LWlmPVwiY29sbGFwc2VCdXR0b24/LnNob3cgIT09IGZhbHNlXCJcbiAgICAgICAgICA6aWNvbj1cImNvbGxhcHNlID8gdWkuaWNvbnMuY2FyZXREb3duIDogdWkuaWNvbnMuY2FyZXRVcFwiXG4gICAgICAgICAgOnRleHQ9XCJcbiAgICAgICAgICAgIGNvbGxhcHNlXG4gICAgICAgICAgICAgID8gdCgnZnMuc2VhcmNoLmNvbnRhaW5lci5jb2xsYXBzZUJ1dHRvbi50ZXh0LmV4cGFuZCcpXG4gICAgICAgICAgICAgIDogdCgnZnMuc2VhcmNoLmNvbnRhaW5lci5jb2xsYXBzZUJ1dHRvbi50ZXh0LmNvbGxhcHNlJylcbiAgICAgICAgICBcIlxuICAgICAgICAgIHYtYmluZD1cImNvbGxhcHNlQnV0dG9uXCJcbiAgICAgICAgICBAY2xpY2s9XCJ0b2dnbGVDb2xsYXBzZVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgb25Nb3VudGVkLCByZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNTZWFyY2hMYXlvdXREZWZhdWx0XCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5piv5ZCm5pS257ypXG4gICAgICovXG4gICAgY29sbGFwc2U6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlsZXlvIDmjInpkq5cbiAgICAgKi9cbiAgICBjb2xsYXBzZUJ1dHRvbjoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcblxuICAgIGFjdGlvbjoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDluIPlsYDmqKHlvI9cbiAgICAgKi9cbiAgICBsYXlvdXQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IFwic2luZ2xlLWxpbmVcIlxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5p+l6K+i5a2X5q615YiX6KGo77yM5Y+v5Lul57K+57uG5YyW6Ieq5a6a5LmJ5p+l6K+i5a2X5q615biD5bGAXG4gICAgICovXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDpu5jorqTnmoRjb2zphY3nva5cbiAgICAgKi9cbiAgICBjb2w6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDojrflj5bmn6Xor6LkuIrkuIvmlodcbiAgICAgKi9cbiAgICBnZXRDb250ZXh0Rm46IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uXG4gICAgfVxuICB9LFxuICBlbWl0czogW1widXBkYXRlOmNvbGxhcHNlXCIsIFwiY29sbGFwc2VcIl0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IGNvbHVtbnNSb3dSZWYgPSByZWYoKTtcbiAgICBjb25zdCBjb21wdXRlZElzTXVsdGlMaW5lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLmxheW91dCA9PT0gXCJtdWx0aS1saW5lXCI7XG4gICAgICAvL+S4jeimgei/meS4qu+8jOS8muatu+W+queOr++8jCAmJiBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID4gY29sdW1uc0xpbmVIZWlnaHRSZWYudmFsdWU7XG4gICAgfSk7XG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIGlmIChjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlICYmIGNvbHVtbnNSb3dSZWYudmFsdWUpIHtcbiAgICAgICAgY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA9IGNvbHVtbnNSb3dSZWYudmFsdWUuJGVsLm9mZnNldEhlaWdodDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKCFjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlIHx8ICFwcm9wcy5jb2xsYXBzZSkge1xuICAgICAgICByZXR1cm4gXCJhdXRvXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA/IGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgKyBcInB4XCIgOiBcIlwiO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29sdW1uc0JveEhlaWdodFJlZiA9IHJlZigwKTtcblxuICAgIGNvbnN0IHRvZ2dsZUNvbGxhcHNlID0gKCkgPT4ge1xuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6Y29sbGFwc2VcIiwgIXByb3BzLmNvbGxhcHNlKTtcbiAgICAgIGN0eC5lbWl0KFwiY29sbGFwc2VcIiwgIXByb3BzLmNvbGxhcHNlKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbWVyZ2VDb2woY29sOiBhbnkpIHtcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuY29sLCBjb2wpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIGNvbHVtbnNSb3dSZWYsXG4gICAgICBjb21wdXRlZENvbHVtbkJveEhlaWdodCxcbiAgICAgIGNvbXB1dGVkSXNNdWx0aUxpbmUsXG4gICAgICB0b2dnbGVDb2xsYXBzZSxcbiAgICAgIG1lcmdlQ29sLFxuICAgICAgdFxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1zZWFyY2gtbGF5b3V0LWRlZmF1bHQge1xuICB3aWR0aDogMTAwJTtcblxuICAuZnMtc2VhcmNoLWJveCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIC5mcy1zZWFyY2gtbWFpbiB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBoZWlnaHQ6IGF1dG87XG5cbiAgICAgIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xuICAgICAgICB3aWR0aDogNTAlO1xuICAgICAgfVxuXG4gICAgICAuZnMtc2VhcmNoLWNvbHVtbnMge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICAgIHBhZGRpbmc6IDRweCAwIDRweCAwO1xuXG4gICAgICAgIC5mcy1zZWFyY2gtY29sIHtcbiAgICAgICAgICBtaW4td2lkdGg6IDE4MHB4O1xuICAgICAgICAgICYuZnMtc2VhcmNoLXNsb3Qge1xuICAgICAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICAmID4gKiB7XG4gICAgICAgICAgICBtYXJnaW46IDBweCA0cHg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbWFyZ2luOiA0cHggMDtcblxuICAgICAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgLy8gbWFyZ2luLWxlZnQ6IDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgICAgICAgICAgbWF4LXdpZHRoOiA1MCU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLmFudC1pbnB1dC1udW1iZXIsXG4gICAgICAgICAgLmFudC1waWNrZXIsXG4gICAgICAgICAgLmVsLWlucHV0LW51bWJlcixcbiAgICAgICAgICAuZWwtY2FzY2FkZXIsXG4gICAgICAgICAgLmVsLWRhdGUtZWRpdG9yLFxuICAgICAgICAgIC5uLXNlbGVjdCxcbiAgICAgICAgICAubi1kYXRlLXBpY2tlcixcbiAgICAgICAgICAubi1pbnB1dC1udW1iZXIge1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2ljb24ge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2Nsb3NlLWljb24ge1xuICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5mcy1zZWFyY2gtYnV0dG9ucy1ncm91cCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gICAgLmZzLWJ1dHRvbiB7XG4gICAgICBtYXJnaW46IDAgMnB4IDAgMnB4O1xuICAgIH1cbiAgfVxuXG4gICYuZnMtc2VhcmNoLW11bHRpLWxpbmUge1xuICAgIC5mcy1zZWFyY2gtYm94IHtcbiAgICAgIC5mcy1zZWFyY2gtbWFpbiB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjJzIGVhc2U7XG4gICAgICAgICYuZnMtc2VhcmNoLWNvbGxhcHNlIHtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiA0MnB4ICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAuYW50LWZvcm0taXRlbSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAuYW50LWZvcm0tcm93IHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICAuYW50LWZvcm0taXRlbS1yb3cge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICAgIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtbGF5b3V0LWRlZmF1bHRcIiA6Y2xhc3M9XCJ7ICdmcy1zZWFyY2gtbXVsdGktbGluZSc6IGNvbXB1dGVkSXNNdWx0aUxpbmUgfVwiPlxuICAgIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtYm94XCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLW1haW5cIlxuICAgICAgICA6Y2xhc3M9XCJ7ICdmcy1zZWFyY2gtY29sbGFwc2UnOiBjb2xsYXBzZSB9XCJcbiAgICAgICAgOnN0eWxlPVwieyBtYXhIZWlnaHQ6IGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0IH1cIlxuICAgICAgPlxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgcmVmPVwiY29sdW1uc1Jvd1JlZlwiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbHVtbnNcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLXNsb3RcIj5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2gtbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPCEtLSDmn6Xor6LlrZfmrrVyZW5kZXLvvIzpnIDopoHlrprkuYlwcm9wcy5jb2x1bW5zIC0tPlxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBrZXkpIG9mIGNvbHVtbnNcIiA6a2V5PVwia2V5XCI+XG4gICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmNvbC5uYW1lXCIgdi1pZj1cIml0ZW0uc2hvd1wiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbFwiIHYtYmluZD1cIm1lcmdlQ29sKGl0ZW0uY29sKVwiPlxuICAgICAgICAgICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cIml0ZW0uX2NlbGxSZW5kZXJcIiA6c2NvcGU9XCJnZXRDb250ZXh0Rm4oKVwiIC8+XG4gICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtc2xvdFwiPlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1taWRkbGVcIj48L3Nsb3Q+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICAgIDppcz1cInVpLmNvbC5uYW1lXCJcbiAgICAgICAgICAgIHYtaWY9XCIhY29tcHV0ZWRJc011bHRpTGluZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLWJ1dHRvbnMtZ3JvdXBcIlxuICAgICAgICAgICAgdi1iaW5kPVwibWVyZ2VDb2woYWN0aW9uPy5jb2wpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIiA6W3VpLmZvcm1JdGVtLmxhYmVsXT1cImFjdGlvbj8ubGFiZWxcIj5cbiAgICAgICAgICAgICAgPCEtLSDmn6Xor6LmjInpkq7mj5Lmp70tLT5cbiAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1idXR0b25zXCIgdi1iaW5kPVwiZ2V0Q29udGV4dEZuKClcIj48L3Nsb3Q+XG4gICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLXNlYXJjaC1jb2wgZnMtc2VhcmNoLXNsb3RcIj5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2gtcmlnaHRcIiB2LWJpbmQ9XCJnZXRDb250ZXh0Rm4oKVwiPjwvc2xvdD5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHYtaWY9XCJjb21wdXRlZElzTXVsdGlMaW5lXCIgY2xhc3M9XCJmcy1zZWFyY2gtYnV0dG9ucy1ncm91cCBmcy1zZWFyY2gtbXVsdGktbGluZS1idXR0b25zXCI+XG4gICAgICAgIDwhLS0g5aSa6KGM5qih5byP5pe255qE5p+l6K+i5oyJ6ZKuLS0+XG4gICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2gtYnV0dG9uc1wiPjwvc2xvdD5cbiAgICAgICAgPGZzLWJ1dHRvblxuICAgICAgICAgIHYtaWY9XCJjb2xsYXBzZUJ1dHRvbj8uc2hvdyAhPT0gZmFsc2VcIlxuICAgICAgICAgIDppY29uPVwiY29sbGFwc2UgPyB1aS5pY29ucy5jYXJldERvd24gOiB1aS5pY29ucy5jYXJldFVwXCJcbiAgICAgICAgICA6dGV4dD1cIlxuICAgICAgICAgICAgY29sbGFwc2VcbiAgICAgICAgICAgICAgPyB0KCdmcy5zZWFyY2guY29udGFpbmVyLmNvbGxhcHNlQnV0dG9uLnRleHQuZXhwYW5kJylcbiAgICAgICAgICAgICAgOiB0KCdmcy5zZWFyY2guY29udGFpbmVyLmNvbGxhcHNlQnV0dG9uLnRleHQuY29sbGFwc2UnKVxuICAgICAgICAgIFwiXG4gICAgICAgICAgdi1iaW5kPVwiY29sbGFwc2VCdXR0b25cIlxuICAgICAgICAgIEBjbGljaz1cInRvZ2dsZUNvbGxhcHNlXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBvbk1vdW50ZWQsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1NlYXJjaExheW91dERlZmF1bHRcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDmmK/lkKbmlLbnvKlcbiAgICAgKi9cbiAgICBjb2xsYXBzZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWxleW8gOaMiemSrlxuICAgICAqL1xuICAgIGNvbGxhcHNlQnV0dG9uOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuXG4gICAgYWN0aW9uOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW4g+WxgOaooeW8j1xuICAgICAqL1xuICAgIGxheW91dDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJzaW5nbGUtbGluZVwiXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmn6Xor6LlrZfmrrXliJfooajvvIzlj6/ku6Xnsr7nu4bljJboh6rlrprkuYnmn6Xor6LlrZfmrrXluIPlsYBcbiAgICAgKi9cbiAgICBjb2x1bW5zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOm7mOiupOeahGNvbOmFjee9rlxuICAgICAqL1xuICAgIGNvbDoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOiOt+WPluafpeivouS4iuS4i+aWh1xuICAgICAqL1xuICAgIGdldENvbnRleHRGbjoge1xuICAgICAgdHlwZTogRnVuY3Rpb25cbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJ1cGRhdGU6Y29sbGFwc2VcIiwgXCJjb2xsYXBzZVwiXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG4gICAgY29uc3QgY29sdW1uc1Jvd1JlZiA9IHJlZigpO1xuICAgIGNvbnN0IGNvbXB1dGVkSXNNdWx0aUxpbmUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMubGF5b3V0ID09PSBcIm11bHRpLWxpbmVcIjtcbiAgICAgIC8v5LiN6KaB6L+Z5Liq77yM5Lya5q275b6q546v77yMICYmIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPiBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZTtcbiAgICB9KTtcbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgaWYgKGNvbXB1dGVkSXNNdWx0aUxpbmUudmFsdWUgJiYgY29sdW1uc1Jvd1JlZi52YWx1ZSkge1xuICAgICAgICBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID0gY29sdW1uc1Jvd1JlZi52YWx1ZS4kZWwub2Zmc2V0SGVpZ2h0O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAoIWNvbXB1dGVkSXNNdWx0aUxpbmUudmFsdWUgfHwgIXByb3BzLmNvbGxhcHNlKSB7XG4gICAgICAgIHJldHVybiBcImF1dG9cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID8gY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSArIFwicHhcIiA6IFwiXCI7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb2x1bW5zQm94SGVpZ2h0UmVmID0gcmVmKDApO1xuXG4gICAgY29uc3QgdG9nZ2xlQ29sbGFwc2UgPSAoKSA9PiB7XG4gICAgICBjdHguZW1pdChcInVwZGF0ZTpjb2xsYXBzZVwiLCAhcHJvcHMuY29sbGFwc2UpO1xuICAgICAgY3R4LmVtaXQoXCJjb2xsYXBzZVwiLCAhcHJvcHMuY29sbGFwc2UpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBtZXJnZUNvbChjb2w6IGFueSkge1xuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5jb2wsIGNvbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgY29sdW1uc1Jvd1JlZixcbiAgICAgIGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0LFxuICAgICAgY29tcHV0ZWRJc011bHRpTGluZSxcbiAgICAgIHRvZ2dsZUNvbGxhcHNlLFxuICAgICAgbWVyZ2VDb2wsXG4gICAgICB0XG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXNlYXJjaC1sYXlvdXQtZGVmYXVsdCB7XG4gIHdpZHRoOiAxMDAlO1xuXG4gIC5mcy1zZWFyY2gtYm94IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICAgLmZzLXNlYXJjaC1tYWluIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGhlaWdodDogYXV0bztcblxuICAgICAgLmFudC1mb3JtLWl0ZW0tY29udHJvbCB7XG4gICAgICAgIHdpZHRoOiA1MCU7XG4gICAgICB9XG5cbiAgICAgIC5mcy1zZWFyY2gtY29sdW1ucyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgcGFkZGluZzogNHB4IDAgNHB4IDA7XG5cbiAgICAgICAgLmZzLXNlYXJjaC1jb2wge1xuICAgICAgICAgIG1pbi13aWR0aDogMTgwcHg7XG4gICAgICAgICAgJi5mcy1zZWFyY2gtc2xvdCB7XG4gICAgICAgICAgICBtaW4td2lkdGg6IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgICYgPiAqIHtcbiAgICAgICAgICAgIG1hcmdpbjogMHB4IDRweDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtYXJnaW46IDRweCAwO1xuXG4gICAgICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgICAvLyBtYXJnaW4tbGVmdDogMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAuYW50LWZvcm0taXRlbS1sYWJlbCB7XG4gICAgICAgICAgICBtYXgtd2lkdGg6IDUwJTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAuYW50LWlucHV0LW51bWJlcixcbiAgICAgICAgICAuYW50LXBpY2tlcixcbiAgICAgICAgICAuZWwtaW5wdXQtbnVtYmVyLFxuICAgICAgICAgIC5lbC1jYXNjYWRlcixcbiAgICAgICAgICAuZWwtZGF0ZS1lZGl0b3IsXG4gICAgICAgICAgLm4tc2VsZWN0LFxuICAgICAgICAgIC5uLWRhdGUtcGlja2VyLFxuICAgICAgICAgIC5uLWlucHV0LW51bWJlciB7XG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLmVsLWRhdGUtZWRpdG9yIC5lbC1yYW5nZV9faWNvbiB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLmVsLWRhdGUtZWRpdG9yIC5lbC1yYW5nZV9fY2xvc2UtaWNvbiB7XG4gICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLmZzLXNlYXJjaC1idXR0b25zLWdyb3VwIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgICAuZnMtYnV0dG9uIHtcbiAgICAgIG1hcmdpbjogMCAycHggMCAycHg7XG4gICAgfVxuICB9XG5cbiAgJi5mcy1zZWFyY2gtbXVsdGktbGluZSB7XG4gICAgLmZzLXNlYXJjaC1ib3gge1xuICAgICAgLmZzLXNlYXJjaC1tYWluIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuMnMgZWFzZTtcbiAgICAgICAgJi5mcy1zZWFyY2gtY29sbGFwc2Uge1xuICAgICAgICAgIG1heC1oZWlnaHQ6IDQycHggIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC5hbnQtZm9ybS1pdGVtIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIC5hbnQtZm9ybS1yb3cge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICAgIC5hbnQtZm9ybS1pdGVtLXJvdyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgICAgLmFudC1mb3JtLWl0ZW0tY29udHJvbCB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgYXMgX19NQUNST1NfZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qLyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzVGFic0ZpbHRlclwiLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlXG59KTtcbjwvc2NyaXB0PlxuPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtdGFicy1maWx0ZXJcIj5cbiAgICA8Y29tcG9uZW50IDppcz1cInVpLnRhYnMubmFtZVwiIHYtYmluZD1cImJpbmRpbmdcIj5cbiAgICAgIDxjb21wb25lbnRcbiAgICAgICAgOmlzPVwidWkudGFiUGFuZS5uYW1lXCJcbiAgICAgICAgdi1pZj1cImRlZmF1bHRPcHRpb24uc2hvd1wiXG4gICAgICAgIDpbdWkudGFiUGFuZS5rZXldPVwiX19ERUZBVUxUX19cIlxuICAgICAgICA6W3VpLnRhYlBhbmUudGFiXT1cImRlZmF1bHRPcHRpb24ubGFiZWxcIlxuICAgICAgLz5cbiAgICAgIDxjb21wb25lbnRcbiAgICAgICAgOmlzPVwidWkudGFiUGFuZS5uYW1lXCJcbiAgICAgICAgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIG9mIG9wdGlvbnNcIlxuICAgICAgICA6a2V5PVwiaW5kZXhcIlxuICAgICAgICA6W3VpLnRhYlBhbmUua2V5XT1cImdldFZhbHVlKGl0ZW0pXCJcbiAgICAgICAgOlt1aS50YWJQYW5lLnRhYl09XCJnZXRMYWJlbChpdGVtKVwiXG4gICAgICAvPlxuICAgIDwvY29tcG9uZW50PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxuaW1wb3J0IHsgY29tcHV0ZWQsIHVzZUF0dHJzIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UsIHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuO1xuXG50eXBlIFRhYnNGaWx0ZXJEZWZhdWx0T3B0aW9uID0geyBzaG93PzogYm9vbGVhbjsgdmFsdWU/OiBhbnk7IGxhYmVsPzogc3RyaW5nIH07XG50eXBlIFRhYnNGaWx0ZXJPcHRpb24gPSB7IHZhbHVlOiBhbnk7IGxhYmVsOiBzdHJpbmc7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuaW50ZXJmYWNlIFRhYnNGaWx0ZXJQcm9wcyB7XG4gIG5hbWU6IHN0cmluZzsgLy/mn6Xor6LlrZfmrrXnmoRrZXksc2VhcmNo5Y+C5pWwa2V5XG4gIHNob3c/OiBib29sZWFuO1xuICBkZWZhdWx0T3B0aW9uPzogVGFic0ZpbHRlckRlZmF1bHRPcHRpb247XG4gIG9wdGlvbnM6IFRhYnNGaWx0ZXJPcHRpb25bXTtcbiAgbW9kZWxWYWx1ZTogYW55O1xuICB2YWx1ZT86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbmNvbnN0IGF0dHJzID0gdXNlQXR0cnMoKTtcbmNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhkZWZpbmVQcm9wczxUYWJzRmlsdGVyUHJvcHM+KCksIHtcbiAgc2hvdzogZmFsc2UsXG4gIHZhbHVlOiBcInZhbHVlXCIsXG4gIGxhYmVsOiBcImxhYmVsXCIsXG4gIGRlZmF1bHRPcHRpb246IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogKCkgPT4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxufSk7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IGRlZiA9IHtcbiAgICBzaG93OiB0cnVlLFxuICAgIHZhbHVlOiBudWxsLFxuICAgIGxhYmVsOiBcIuWFqOmDqFwiXG4gIH0gYXMgVGFic0ZpbHRlckRlZmF1bHRPcHRpb247XG4gIHJldHVybiBtZXJnZShkZWYsIHByb3BzLmRlZmF1bHRPcHRpb24gfHwge30pO1xufSk7XG5cbmNvbnN0IF9fREVGQVVMVF9fID0gXCJfZGVmYXVsdF9rZXlfXCI7XG5jb25zdCBiaW5kaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCB2YWx1ZSA9XG4gICAgcHJvcHMubW9kZWxWYWx1ZSA9PSBudWxsIHx8IHByb3BzLm1vZGVsVmFsdWUgPT09IGRlZmF1bHRPcHRpb24udmFsdWUudmFsdWUgPyBfX0RFRkFVTFRfXyA6IHByb3BzLm1vZGVsVmFsdWU7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJjYXJkXCIsXG4gICAgLi4uYXR0cnMsXG4gICAgW3VpLnRhYnMubW9kZWxWYWx1ZV06IHZhbHVlLFxuICAgIFtcIm9uVXBkYXRlOlwiICsgdWkudGFicy5tb2RlbFZhbHVlXTogb25VcGRhdGVBY3RpdmVLZXlcbiAgfTtcbn0pO1xuXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoW1widXBkYXRlOm1vZGVsVmFsdWVcIiwgXCJjaGFuZ2VcIl0pO1xuXG5mdW5jdGlvbiBvblVwZGF0ZUFjdGl2ZUtleSh2YWx1ZTogYW55KSB7XG4gIGlmIChfX0RFRkFVTFRfXyA9PT0gdmFsdWUpIHtcbiAgICB2YWx1ZSA9IGRlZmF1bHRPcHRpb24udmFsdWUudmFsdWU7XG4gIH1cbiAgY29uc3Qgb2xkVmFsdWUgPSBwcm9wcy5tb2RlbFZhbHVlO1xuICBlbWl0KFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgdmFsdWUpO1xuICBpZiAob2xkVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUob3B0aW9uOiBUYWJzRmlsdGVyT3B0aW9uKSB7XG4gIHJldHVybiBvcHRpb25bcHJvcHMudmFsdWVdO1xufVxuZnVuY3Rpb24gZ2V0TGFiZWwob3B0aW9uOiBUYWJzRmlsdGVyT3B0aW9uKSB7XG4gIHJldHVybiBvcHRpb25bcHJvcHMubGFiZWxdO1xufVxuXG5jb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXRhYnMtZmlsdGVyIHtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgLy93aWR0aDogMTAwJTtcbiAgLmFudC10YWJzID4gLmFudC10YWJzLW5hdixcbiAgLmFudC10YWJzID4gZGl2ID4gLmFudC10YWJzLW5hdiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxuXG4gIC5lbC10YWJzLS1jYXJkID4gLmVsLXRhYnNfX2hlYWRlciB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxuXG4gIC5uLXRhYi1wYW5lIHtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IGFzIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi8gX19NQUNST1NfZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0ljb25TZWxlY3RvclwiXG59KTtcbjwvc2NyaXB0PlxuPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtaWNvbi1zZWxlY3RvclwiPlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkuaW5wdXQubmFtZVwiIHYtYmluZD1cImlucHV0QmluZGluZ1wiIGNsYXNzPVwiZnMtaWNvbi1zZWxlY3Rvci1zZWFyY2hcIiBAY2xpY2s9XCJoYW5kbGVPcGVuXCI+XG4gICAgICA8dGVtcGxhdGUgI3ByZWZpeD5cbiAgICAgICAgPGZzLWljb24gdi1pZj1cIm1vZGVsVmFsdWVcIiBjbGFzcz1cImZzLWljb24tc2VsZWN0b3ItaW5wdXQtcHJlZml4XCIgOmljb249XCJtb2RlbFZhbHVlXCI+PC9mcy1pY29uPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2NvbXBvbmVudD5cblxuICAgIDxkaXYgdi1pZj1cImRpYWxvZ09wZW5lZFwiIGNsYXNzPVwiZnMtaWNvbi1zZWxlY3Rvci1kaWFsb2dcIj5cbiAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZGlhbG9nLm5hbWVcIiBwcmVzZXQ9XCJkaWFsb2dcIiB0aXRsZT1cIumAieaLqeWbvuagh1wiIHYtYmluZD1cImNvbXB1dGVkRGlhbG9nXCIgOmZvb3Rlcj1cIm51bGxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWljb24tc2VsZWN0b3ItZGlhbG9nLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi10YWJzLWJveCBtdC0xMFwiPlxuICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS50YWJzLm5hbWVcIiB2LWJpbmQ9XCJjb21wdXRlVGFic1wiIHR5cGU9XCJjYXJkXCI+XG4gICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkudGFiUGFuZS5uYW1lXCIga2V5PVwiYWxsXCIgOlt1aS50YWJQYW5lLmtleV09XCInYWxsJ1wiIDpbdWkudGFiUGFuZS50YWJdPVwiJ+WFqOmDqCdcIj5cbiAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICAgICAgICA6aXM9XCJ1aS50YWJQYW5lLm5hbWVcIlxuICAgICAgICAgICAgICAgIHYtZm9yPVwic2V0IG9mIGljb25TZXRzXCJcbiAgICAgICAgICAgICAgICA6a2V5PVwic2V0XCJcbiAgICAgICAgICAgICAgICA6W3VpLnRhYlBhbmUua2V5XT1cInNldFwiXG4gICAgICAgICAgICAgICAgOlt1aS50YWJQYW5lLnRhYl09XCJzZXRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgPC9jb21wb25lbnQ+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYm94XCI+XG4gICAgICAgICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICAgICAgICA6aXM9XCJ1aS5pbnB1dC5uYW1lXCJcbiAgICAgICAgICAgICAgICB2LW1vZGVsOlt1aS5pbnB1dC5tb2RlbFZhbHVlXT1cInNlYXJjaEtleVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi5pCc57Si5Zu+5qCHLCDlj4zlh7vpgInmi6lcIlxuICAgICAgICAgICAgICAgIEBrZXlkb3duLmVudGVyPVwiaGFuZGxlU2VhcmNoXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjc3VmZml4PlxuICAgICAgICAgICAgICAgICAgPGZzLWJ1dHRvbiB0eXBlPVwicHJpbWFyeVwiIHNpemU9XCJzbWFsbFwiIDppY29uPVwidWkuaWNvbnMuc2VhcmNoXCIgQGNsaWNrPVwiaGFuZGxlU2VhcmNoXCI+PC9mcy1idXR0b24+XG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICDlm77moIfpopzoibLvvJpcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICB2LWZvcj1cImNvbG9ySXRlbSBpbiBjb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgOmtleT1cImNvbG9ySXRlbVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbG9yLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgOmNsYXNzPVwieyBhY3RpdmU6IGNvbG9ySXRlbSA9PT0gY3VycmVudENvbG9yIH1cIlxuICAgICAgICAgICAgICAgICAgOnN0eWxlPVwieyBiYWNrZ3JvdW5kQ29sb3I6IGNvbG9ySXRlbSB9XCJcbiAgICAgICAgICAgICAgICAgIEBjbGljaz1cImhhbmRsZUNvbG9yQ2hhbmdlKGNvbG9ySXRlbSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGNvbG9ySXRlbSA/IFwiXCIgOiBcIuaXoFwiIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgOmlzPVwidWkuaW5wdXQubmFtZVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDBweFwiXG4gICAgICAgICAgICAgICAgICA6aWNvbj1cInVpLmljb25zLnNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICA6W3VpLmlucHV0Lm1vZGVsVmFsdWVdPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgIEBpbnB1dD1cImhhbmRsZUNvbG9yQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgID48L2NvbXBvbmVudD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWxpc3RcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICB2LWZvcj1cImljb24gaW4gcGFnZXIucmVjb3Jkc1wiXG4gICAgICAgICAgICAgICAgICA6a2V5PVwiaWNvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24taXRlbVwiXG4gICAgICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IGFjdGl2ZTogaWNvbiA9PT0gY3VycmVudEljb24gfVwiXG4gICAgICAgICAgICAgICAgICA6dGl0bGU9XCJpY29uXCJcbiAgICAgICAgICAgICAgICAgIEBjbGljaz1cImhhbmRsZUljb25TZWxlY3QoaWNvbiwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgICAgIEBkYmxjbGljaz1cImhhbmRsZUljb25TZWxlY3QoaWNvbiwgdHJ1ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxmcy1pY29uIDppY29uPVwiY3VycmVudENvbG9yID8gYCR7aWNvbn06JHtjdXJyZW50Q29sb3J9YCA6IGljb25cIiBjbGFzcz1cInRleHQtMnhsXCI+PC9mcy1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZC1tb3JlXCI+XG4gICAgICAgICAgICAgICAgPGZzLWxvYWRpbmcgdi1pZj1cInBhZ2VyLmxvYWRpbmdcIiA6bG9hZGluZz1cInBhZ2VyLmxvYWRpbmdcIiB0ZXh0PVwi5Yqg6L295LitXCIgLz5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtZWxzZS1pZj1cInBhZ2VyLnRvdGFsID09IG51bGwgfHwgcGFnZXIudG90YWwgPT0gMFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdj7mmoLml6DmlbDmja48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtZWxzZS1pZj1cInBhZ2VyLnRvdGFsID4gcGFnZXIuc3RhcnQgKyBwYWdlci5saW1pdFwiIEBjbGljaz1cImxvYWRNb3JlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2PuWKoOi9veabtOWkmjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlclwiPlxuICAgICAgICAgICAgICA8ZnMtYnV0dG9uIHR5cGU9XCJwcmltYXJ5XCIgQGNsaWNrPVwib25Db25maXJtXCI+56Gu5a6aPC9mcy1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2NvbXBvbmVudD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiQGZhc3QtY3J1ZC91aS1pbnRlcmZhY2VcIjtcbmltcG9ydCB7IHJlZiwgdXNlQXR0cnMsIFJlZiwgY29tcHV0ZWQgfSBmcm9tIFwidnVlXCI7XG5cbjtcblxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFtcInVwZGF0ZTptb2RlbFZhbHVlXCJdKTtcbmNvbnN0IGRlZmF1bHRMaW1pdCA9IDEzNjtcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHMoe1xuICBtb2RlbFZhbHVlOiB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIGRlZmF1bHQ6IFwiXCJcbiAgfSxcbiAgZGlhbG9nOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcbiAgfSxcbiAgdGFiczoge1xuICAgIHR5cGU6IE9iamVjdCxcbiAgICBkZWZhdWx0OiAoKSA9PiAoe30pXG4gIH0sXG4gIC8vIOmZkOWItuavj+mhteaYvuekuuaVsOmHj1xuICBsaW1pdDoge1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBkZWZhdWx0OiAxMzZcbiAgfSxcbiAgaWNvblNldHM6IHtcbiAgICB0eXBlOiBBcnJheTxzdHJpbmc+LFxuICAgIGRlZmF1bHQ6ICgpID0+IFtcbiAgICAgIFwibG9nb3NcIixcbiAgICAgIFwiZmEtYnJhbmRzXCIsXG4gICAgICBcImZhLXNvbGlkXCIsXG4gICAgICBcImZhLXJlZ3VsYXJcIixcbiAgICAgIFwiY2FyYm9uXCIsXG4gICAgICBcImlvblwiLFxuICAgICAgXCJhbnQtZGVzaWduXCIsXG4gICAgICBcIm1kaVwiLFxuICAgICAgXCJ0d2Vtb2ppXCIsXG4gICAgICBcInN2Zy1zcGlubmVyc1wiXG4gICAgXVxuICB9LFxuICBhcGlQcm92aWRlcjoge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgICBkZWZhdWx0OiBcImh0dHBzOi8vYXBpLmljb25pZnkuZGVzaWduXCJcbiAgfSxcbiAgY29sb3JzOiB7XG4gICAgdHlwZTogQXJyYXk8c3RyaW5nPixcbiAgICBkZWZhdWx0OiAoKSA9PiBbXG4gICAgICBcIlwiLFxuICAgICAgXCIjMDA3QUZGXCIsXG4gICAgICBcIiMzNEM3NTlcIixcbiAgICAgIFwiI0ZGOTUwMFwiLFxuICAgICAgXCIjRkYzQjMwXCIsXG4gICAgICBcIiNGRkNDMDBcIixcbiAgICAgIFwiIzQyNDI0MlwiLFxuICAgICAgXCIjOEU4RTkzXCIsXG4gICAgICBcIiNBRjUyREVcIixcbiAgICAgIFwiIzVBQzhGQVwiLFxuICAgICAgXCIjQTI4NDVFXCJcbiAgICBdXG4gIH1cbn0pO1xuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcblxuY29uc3QgZGlhbG9nT3BlbmVkID0gcmVmKGZhbHNlKTtcbmNvbnN0IGNvbXB1dGVkRGlhbG9nID0gY29tcHV0ZWQoKCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiAxMDI0LFxuICAgIHN0eWxlOiB7XG4gICAgICB3aWR0aDogXCIxMDI0cHhcIlxuICAgIH0sXG4gICAgLi4ucHJvcHMuZGlhbG9nLFxuICAgIFt1aS5kaWFsb2cudmlzaWJsZV06IGRpYWxvZ09wZW5lZC52YWx1ZSxcbiAgICBbYG9uVXBkYXRlOiR7dWkuZGlhbG9nLnZpc2libGV9YF06ICh2YWw6IGJvb2xlYW4pID0+IHtcbiAgICAgIGRpYWxvZ09wZW5lZC52YWx1ZSA9IHZhbDtcbiAgICB9XG4gIH07XG59KTtcblxuY29uc3QgZm9ybUl0ZW1Db250ZXh0ID0gdWkuZm9ybUl0ZW0uaW5qZWN0Rm9ybUl0ZW1Db250ZXh0KCk7XG5jb25zdCBpbnB1dEJpbmRpbmcgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uYXR0cnMsXG4gICAgW3VpLmlucHV0Lm1vZGVsVmFsdWVdOiBwcm9wcy5tb2RlbFZhbHVlLFxuICAgIFtgb25VcGRhdGU6JHt1aS5pbnB1dC5tb2RlbFZhbHVlfWBdOiAodmFsOiBzdHJpbmcpID0+IHtcbiAgICAgIGVtaXRDaGFuZ2UodmFsKTtcbiAgICB9XG4gIH07XG59KTtcblxuY29uc3QgZW1pdENoYW5nZSA9ICh2YWw6IHN0cmluZykgPT4ge1xuICBlbWl0KFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgdmFsKTtcbiAgZm9ybUl0ZW1Db250ZXh0Py5vbkNoYW5nZSgpO1xufTtcblxuY29uc3QgaGFuZGxlT3BlbiA9ICgpID0+IHtcbiAgZGlhbG9nT3BlbmVkLnZhbHVlID0gdHJ1ZTtcbiAgaWYgKHByb3BzLmljb25TZXRzLmxlbmd0aCA+IDAgJiYgcGFnZXIudmFsdWUucmVjb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICBvblRhYkNoYW5nZShwcm9wcy5pY29uU2V0c1swXSBhcyBzdHJpbmcpO1xuICB9XG4gIC8v5Yid5aeL5YyWdmFsdWVcbiAgY29uc3QgYXJyID0gcHJvcHMubW9kZWxWYWx1ZT8uc3BsaXQoXCI6XCIpIHx8IFtdO1xuICBpZiAoYXJyLmxlbmd0aCA+PSAyKSB7XG4gICAgY3VycmVudEljb24udmFsdWUgPSBhcnJbMF0gKyBcIjpcIiArIGFyclsxXTtcbiAgICBjdXJyZW50Q29sb3IudmFsdWUgPSBhcnJbMl07XG4gIH0gZWxzZSB7XG4gICAgY3VycmVudEljb24udmFsdWUgPSBwcm9wcy5tb2RlbFZhbHVlO1xuICAgIGN1cnJlbnRDb2xvci52YWx1ZSA9IFwiXCI7XG4gIH1cbn07XG5cbmNvbnN0IGF0dHJzID0gdXNlQXR0cnMoKTtcblxuY29uc3QgYXBpID0ge1xuICBhc3luYyBnZXRDb2xsZWN0aW9ucygpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtwcm9wcy5hcGlQcm92aWRlcn0vY29sbGVjdGlvbnNgKTtcbiAgICByZXR1cm4gYXdhaXQgcmVzLmpzb24oKTtcbiAgfSxcbiAgYXN5bmMgZ2V0SWNvbnMocHJlZml4OiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtwcm9wcy5hcGlQcm92aWRlcn0vY29sbGVjdGlvbj9wcmVmaXg9JHtwcmVmaXh9YCk7XG4gICAgcmV0dXJuIGF3YWl0IHJlcy5qc29uKCk7XG4gIH0sXG4gIGFzeW5jIHNlYXJjaChxdWVyeTogc3RyaW5nLCBwYWdlcjogYW55KSB7XG4gICAgY29uc3Qgc3RhcnQgPSBwYWdlci5zdGFydCA/PyAwO1xuICAgIGNvbnN0IGxpbWl0ID0gcGFnZXIubGltaXQgPz8gNTA7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMuYXBpUHJvdmlkZXJ9L3NlYXJjaD9xdWVyeT0ke3F1ZXJ5fSZzdGFydD0ke3N0YXJ0fSZsaW1pdD0ke2xpbWl0fWApO1xuICAgIHJldHVybiBhd2FpdCByZXMuanNvbigpO1xuICB9XG59O1xuXG5jb25zdCBpY29uU3RvcmU6IFJlZiA9IHJlZih7fSk7XG5cbmNvbnN0IGxvYWRJY29uU2V0ID0gYXN5bmMgKHByZWZpeDogc3RyaW5nKSA9PiB7XG4gIGxldCBzZXRzID0gaWNvblN0b3JlLnZhbHVlW3ByZWZpeF07XG4gIGlmICghc2V0cykge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaS5nZXRJY29ucyhwcmVmaXgpO1xuICAgIGNvbnN0IHVuY2F0ZWdvcmllcyA9IHJlcy51bmNhdGVnb3JpemVkID8/IFtdO1xuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSByZXMuY2F0ZWdvcmllcyA/PyBbXTtcbiAgICBzZXRzID0gdW5jYXRlZ29yaWVzO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGNhdGVnb3JpZXMpIHtcbiAgICAgIHNldHMgPSBzZXRzLmNvbmNhdChjYXRlZ29yaWVzW2tleV0pO1xuICAgIH1cbiAgICBzZXRzID0gc2V0cy5tYXAoKGl0ZW06IGFueSkgPT4gYCR7cHJlZml4fToke2l0ZW19YCk7XG4gICAgaWNvblN0b3JlLnZhbHVlW3ByZWZpeF0gPSBzZXRzO1xuICB9XG4gIHJldHVybiBzZXRzO1xufTtcblxuY29uc3Qgc2VhcmNoS2V5ID0gcmVmKFwiXCIpO1xuY29uc3QgdGFiS2V5ID0gcmVmKFwiYWxsXCIpO1xuY29uc3Qgb25UYWJDaGFuZ2UgPSAoa2V5OiBzdHJpbmcpID0+IHtcbiAgdGFiS2V5LnZhbHVlID0ga2V5O1xuICBzZWFyY2hLZXkudmFsdWUgPSBcIlwiO1xuICByZXNldFBhZ2VyKCk7XG4gIGhhbmRsZVNlYXJjaCgpO1xufTtcblxuY29uc3QgcmVzZXRQYWdlciA9ICgpID0+IHtcbiAgcGFnZXIudmFsdWUuc3RhcnQgPSAwO1xuICBwYWdlci52YWx1ZS5yZWNvcmRzID0gW107XG4gIHBhZ2VyLnZhbHVlLnRvdGFsID0gMDtcbiAgcGFnZXIudmFsdWUubGltaXQgPSBwcm9wcy5saW1pdCA/PyBkZWZhdWx0TGltaXQ7XG59O1xuXG5jb25zdCBwYWdlciA9IHJlZih7XG4gIGxvYWRpbmc6IGZhbHNlLFxuICBzdGFydDogMCxcbiAgbGltaXQ6IHByb3BzLmxpbWl0ID8/IGRlZmF1bHRMaW1pdCxcbiAgdG90YWw6IG51bGwsXG4gIHF1ZXJ5OiBcIlwiLFxuICByZWNvcmRzOiBbXVxufSk7XG5cbmNvbnN0IGhhbmRsZVNlYXJjaCA9IGFzeW5jICgpID0+IHtcbiAgaWYgKHBhZ2VyLnZhbHVlLmxvYWRpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHBhZ2VyLnZhbHVlLnF1ZXJ5ICE9PSBzZWFyY2hLZXkudmFsdWUpIHtcbiAgICAvL+mHjee9rnN0YXJ0XG4gICAgcmVzZXRQYWdlcigpO1xuICB9XG5cbiAgcGFnZXIudmFsdWUubG9hZGluZyA9IHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZG9TZWFyY2goKTtcbiAgICBwYWdlci52YWx1ZS5yZWNvcmRzID0gcGFnZXIudmFsdWUucmVjb3Jkcy5jb25jYXQocmVzLmljb25zKTtcbiAgICBwYWdlci52YWx1ZS50b3RhbCA9IHJlcy50b3RhbDtcbiAgICBwYWdlci52YWx1ZS5saW1pdCA9IHJlcy5saW1pdDtcbiAgICBwYWdlci52YWx1ZS5xdWVyeSA9IHNlYXJjaEtleS52YWx1ZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwYWdlci52YWx1ZS5sb2FkaW5nID0gZmFsc2U7XG4gIH1cbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGRvU2VhcmNoKCkge1xuICBpZiAodGFiS2V5LnZhbHVlID09PSBcImFsbFwiKSB7XG4gICAgaWYgKCFzZWFyY2hLZXkudmFsdWUpIHtcbiAgICAgIHVpLm5vdGlmaWNhdGlvbi53YXJuKFwi6K+36L6T5YWl5pCc57Si5YWz6ZSu5a2XXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgYXBpLnNlYXJjaChzZWFyY2hLZXkudmFsdWUsIHBhZ2VyLnZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0UGFnZXJGcm9tSWNvblNldCh0YWJLZXkudmFsdWUpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBhZ2VyRnJvbUljb25TZXQocHJlZml4OiBzdHJpbmcpIHtcbiAgY29uc3QgaWNvbnMgPSBhd2FpdCBsb2FkSWNvblNldChwcmVmaXgpO1xuICBsZXQgZmlsdGVycyA9IGljb25zO1xuICBpZiAoc2VhcmNoS2V5LnZhbHVlKSB7XG4gICAgZmlsdGVycyA9IGljb25zLmZpbHRlcigoaWNvbjogc3RyaW5nKSA9PiBpY29uLmluY2x1ZGVzKHNlYXJjaEtleS52YWx1ZSkpO1xuICB9XG4gIGxldCBlbmQgPSBwYWdlci52YWx1ZS5zdGFydCArIHBhZ2VyLnZhbHVlLmxpbWl0O1xuICBpZiAoZW5kID4gZmlsdGVycy5sZW5ndGgpIHtcbiAgICBlbmQgPSBmaWx0ZXJzLmxlbmd0aDtcbiAgfVxuICBjb25zdCBwYWdlckljb25zID0gZmlsdGVycy5zbGljZShwYWdlci52YWx1ZS5zdGFydCwgZW5kKTtcbiAgcmV0dXJuIHtcbiAgICBpY29uczogcGFnZXJJY29ucyxcbiAgICB0b3RhbDogZmlsdGVycy5sZW5ndGgsXG4gICAgbGltaXQ6IHBhZ2VyLnZhbHVlLmxpbWl0LFxuICAgIHN0YXJ0OiBwYWdlci52YWx1ZS5zdGFydFxuICB9O1xufVxuXG5jb25zdCBjdXJyZW50SWNvbiA9IHJlZihcIlwiKTtcbmNvbnN0IGN1cnJlbnRDb2xvciA9IHJlZihcIlwiKTtcbmNvbnN0IGhhbmRsZUljb25TZWxlY3QgPSAoaWNvbjogc3RyaW5nLCBjb25maXJtID0gZmFsc2UpID0+IHtcbiAgY3VycmVudEljb24udmFsdWUgPSBpY29uO1xuICBpZiAoY29uZmlybSkge1xuICAgIG9uQ29uZmlybSgpO1xuICB9XG59O1xuXG5jb25zdCBvbkNvbmZpcm0gPSAoKSA9PiB7XG4gIGRpYWxvZ09wZW5lZC52YWx1ZSA9IGZhbHNlO1xuICBsZXQgdmFsdWUgPSBjdXJyZW50SWNvbi52YWx1ZTtcbiAgaWYgKGN1cnJlbnRDb2xvci52YWx1ZSkge1xuICAgIHZhbHVlID0gdmFsdWUgKyBcIjpcIiArIGN1cnJlbnRDb2xvci52YWx1ZTtcbiAgfVxuICBlbWl0Q2hhbmdlKHZhbHVlKTtcbn07XG5cbmNvbnN0IGhhbmRsZUNvbG9yQ2hhbmdlID0gKGNvbG9yOiBzdHJpbmcpID0+IHtcbiAgY3VycmVudENvbG9yLnZhbHVlID0gY29sb3I7XG59O1xuXG5jb25zdCBsb2FkTW9yZSA9IGFzeW5jICgpID0+IHtcbiAgcGFnZXIudmFsdWUuc3RhcnQgKz0gcGFnZXIudmFsdWUubGltaXQ7XG4gIGF3YWl0IGhhbmRsZVNlYXJjaCgpO1xufTtcblxuY29uc3QgY29tcHV0ZVRhYnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4ucHJvcHMudGFicyxcbiAgICBbdWkudGFicy5tb2RlbFZhbHVlXTogdGFiS2V5LnZhbHVlLFxuICAgIFtgb25VcGRhdGU6JHt1aS50YWJzLm1vZGVsVmFsdWV9YF06IG9uVGFiQ2hhbmdlXG4gIH07XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtaWNvbi1zZWxlY3RvciB7XG4gIC5mcy1pY29uLXNlbGVjdG9yLWlucHV0LXByZWZpeCB7XG4gICAgZm9udC1zaXplOiAxOHB4O1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG59XG4uZnMtaWNvbi1zZWxlY3Rvci1kaWFsb2ctY29udGVudCB7XG4gIC5pY29uLXRhYnMtYm94IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgbWluLWhlaWdodDogNTAwcHg7XG4gICAgbWF4LWhlaWdodDogNjB2aDtcblxuICAgIC5zZWFyY2gtYm94IHtcbiAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG5cbiAgICAgIC5zZWFyY2gtaW5wdXQge1xuICAgICAgICB3aWR0aDogMjAwcHg7XG4gICAgICAgIHBhZGRpbmc6IDAgNXB4O1xuICAgICAgfVxuXG4gICAgICAuY29sb3Itc2VsZWN0IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDVweDtcbiAgICAgICAgLmNvbG9yLWl0ZW0ge1xuICAgICAgICAgIHdpZHRoOiAzMHB4O1xuICAgICAgICAgIGhlaWdodDogMzBweDtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICAmOmhvdmVyIHtcbiAgICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICNhMmY3ZmY7XG4gICAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNXB4ICNhMmY3ZmY7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJi5hY3RpdmUge1xuICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgIzQwOWVmZjtcbiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggIzQwOWVmZjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAubG9hZC1tb3JlIHtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmZvb3RlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBlbmQ7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgcGFkZGluZzogMTBweDtcbiAgICB9XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAuaWNvbi1jb250YWluZXIge1xuICAgICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTRlN2VkO1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgLmljb24tbGlzdCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgICAgIC5pY29uLWl0ZW0ge1xuICAgICAgICAgIHdpZHRoOiA1MHB4O1xuICAgICAgICAgIGhlaWdodDogNTBweDtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgICAgIG1hcmdpbjogMnB4O1xuICAgICAgICAgICYuYWN0aXZlIHtcbiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM0MDllZmY7XG4gICAgICAgICAgICAvL3NoYWRvd1xuICAgICAgICAgICAgYm94LXNoYWRvdzogMCAwIDVweCAjNDA5ZWZmO1xuICAgICAgICAgIH1cbiAgICAgICAgICAmOmhvdmVyIHtcbiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM2Y2IzZjg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC5mcy1pY29uIHtcbiAgICAgICAgICBmb250LXNpemU6IDMwcHg7XG4gICAgICAgICAgbWF4LXdpZHRoOiA5NiU7XG4gICAgICAgICAgbWF4LWhlaWdodDogOTYlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50IDppcz1cInVpLnJhZGlvR3JvdXAubmFtZVwiIEBjaGFuZ2U9XCJvblNlbGVjdGVkQ2hhbmdlXCI+XG4gICAgPGNvbXBvbmVudFxuICAgICAgOmlzPVwiY29tcHV0ZWRSYWRpb05hbWVcIlxuICAgICAgdi1mb3I9XCJpdGVtIG9mIGNvbXB1dGVkT3B0aW9uc1wiXG4gICAgICByZWY9XCJyYWRpb1JlZlwiXG4gICAgICA6a2V5PVwiZ2V0VmFsdWUoaXRlbSlcIlxuICAgICAgOlt1aS5yYWRpby52YWx1ZV09XCJnZXRWYWx1ZShpdGVtKVwiXG4gICAgICB2LWJpbmQ9XCJvcHRpb25Qcm9wc1wiXG4gICAgPlxuICAgICAge3sgZ2V0TGFiZWwoaXRlbSkgfX1cbiAgICA8L2NvbXBvbmVudD5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyB1aUNvbnRleHQgfSBmcm9tIFwiLi4vLi4vdWlcIjtcbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuLyoqXG4gKiDlrZflhbjljZXpgInmoYZcbiAqIOaUr+aMgWVsLXJhZGlvLWdyb3VwfGEtcmFkaW8tZ3JvdXDnmoTlj4LmlbBcbiAqXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEaWN0UmFkaW9cIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDmlbDmja7lrZflhbjphY3nva5cbiAgICAgKi9cbiAgICBkaWN0OiB7fSxcbiAgICAvKipcbiAgICAgKiDlj6/pgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5IH0sXG5cbiAgICAvKipcbiAgICAgKiByYWRpb+e7hOS7tuWQjeensFxuICAgICAqIGFudGR25L2/55SoYnV0dG9u5qC35byP55qE5pe25YCZ5pyJ55SoXG4gICAgICog5Y2z5bCG5bqf5byDLOivt+S9v+eUqG9wdGlvbk5hbWVcbiAgICAgKi9cbiAgICByYWRpb05hbWU6IHt9LFxuXG4gICAgLyoqXG4gICAgICog6YCJ6aG555qE57uE5Lu25ZCN56ewXG4gICAgICovXG4gICAgb3B0aW9uTmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOmAiemhueeahOWxnuaAp1xuICAgICAqL1xuICAgIG9wdGlvblByb3BzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDovazmjaJEaWN0RGF0YVxuICAgICAqL1xuICAgIHRyYW5zZm9ybURpY3REYXRhOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcbiAgICAvKipcbiAgICAgKiDlrZflhbjmlbDmja7lj5jljJbkuovku7ZcbiAgICAgKi9cbiAgICBcImRpY3QtY2hhbmdlXCIsXG5cbiAgICAvKipcbiAgICAgKiDpgInkuK3lgLzlj5jljJbkuovku7bvvIzlj6/ku6Xojrflj5bliLDlvZPliY3pgInkuK3nmoRvcHRpb27lr7nosaFcbiAgICAgKi9cbiAgICBcInNlbGVjdGVkLWNoYW5nZVwiLFxuICAgIC8qKlxuICAgICAqIOWAvOWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiY2hhbmdlXCJcbiAgXSxcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4OiBhbnkpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuXG4gICAgaWYgKHByb3BzLnJhZGlvTmFtZSkge1xuICAgICAgY29uc29sZS53YXJuKFwi5Y+C5pWwcmFkaW9OYW1l5Y2z5bCG5bqf5byD77yM6K+35pS55oiQb3B0aW9uTmFtZVwiKTtcbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWRSYWRpb05hbWUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9uTmFtZSA/PyBwcm9wcy5yYWRpb05hbWUgPz8gdWkucmFkaW8ubmFtZTtcbiAgICB9KTtcblxuICAgIGxldCB1c2VkRGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCwgdWkucmFkaW9Hcm91cC5tb2RlbFZhbHVlKTtcbiAgICBjb25zdCBjb21wdXRlZE9wdGlvbnMgPSB1c2VkRGljdC5jcmVhdGVDb21wdXRlZE9wdGlvbnMoKTtcblxuICAgIGNvbnN0IG9uU2VsZWN0ZWRDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgY3R4LmVtaXQoXCJjaGFuZ2VcIiwgdmFsdWUpO1xuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRhcmdldCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRhcmdldC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XG4gICAgICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXAgJiYgZGljdC5kYXRhTWFwW3ZhbHVlXSkge1xuICAgICAgICBjb25zdCBvcHQgPSBkaWN0LmRhdGFNYXBbdmFsdWVdO1xuICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBvcHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIGNvbXB1dGVkUmFkaW9OYW1lLFxuICAgICAgLi4udXNlZERpY3QsXG4gICAgICBjb21wdXRlZE9wdGlvbnMsXG4gICAgICBvblNlbGVjdGVkQ2hhbmdlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yYWRpb0dyb3VwLm5hbWVcIiBAY2hhbmdlPVwib25TZWxlY3RlZENoYW5nZVwiPlxuICAgIDxjb21wb25lbnRcbiAgICAgIDppcz1cImNvbXB1dGVkUmFkaW9OYW1lXCJcbiAgICAgIHYtZm9yPVwiaXRlbSBvZiBjb21wdXRlZE9wdGlvbnNcIlxuICAgICAgcmVmPVwicmFkaW9SZWZcIlxuICAgICAgOmtleT1cImdldFZhbHVlKGl0ZW0pXCJcbiAgICAgIDpbdWkucmFkaW8udmFsdWVdPVwiZ2V0VmFsdWUoaXRlbSlcIlxuICAgICAgdi1iaW5kPVwib3B0aW9uUHJvcHNcIlxuICAgID5cbiAgICAgIHt7IGdldExhYmVsKGl0ZW0pIH19XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xuaW1wb3J0IHsgdWlDb250ZXh0IH0gZnJvbSBcIi4uLy4uL3VpXCI7XG5pbXBvcnQgeyByZWYsIGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbi8qKlxuICog5a2X5YW45Y2V6YCJ5qGGXG4gKiDmlK/mjIFlbC1yYWRpby1ncm91cHxhLXJhZGlvLWdyb3Vw55qE5Y+C5pWwXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRGljdFJhZGlvXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5pWw5o2u5a2X5YW46YWN572uXG4gICAgICovXG4gICAgZGljdDoge30sXG4gICAgLyoqXG4gICAgICog5Y+v6YCJ6aG577yM5q+UZGljdC5kYXRh5LyY5YWI57qn6auYXG4gICAgICovXG4gICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSB9LFxuXG4gICAgLyoqXG4gICAgICogcmFkaW/nu4Tku7blkI3np7BcbiAgICAgKiBhbnRkduS9v+eUqGJ1dHRvbuagt+W8j+eahOaXtuWAmeacieeUqFxuICAgICAqIOWNs+WwhuW6n+W8gyzor7fkvb/nlKhvcHRpb25OYW1lXG4gICAgICovXG4gICAgcmFkaW9OYW1lOiB7fSxcblxuICAgIC8qKlxuICAgICAqIOmAiemhueeahOe7hOS7tuWQjeensFxuICAgICAqL1xuICAgIG9wdGlvbk5hbWU6IHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDpgInpobnnmoTlsZ7mgKdcbiAgICAgKi9cbiAgICBvcHRpb25Qcm9wczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6L2s5o2iRGljdERhdGFcbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1EaWN0RGF0YToge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXG4gICAgLyoqXG4gICAgICog5a2X5YW45pWw5o2u5Y+Y5YyW5LqL5Lu2XG4gICAgICovXG4gICAgXCJkaWN0LWNoYW5nZVwiLFxuXG4gICAgLyoqXG4gICAgICog6YCJ5Lit5YC85Y+Y5YyW5LqL5Lu277yM5Y+v5Lul6I635Y+W5Yiw5b2T5YmN6YCJ5Lit55qEb3B0aW9u5a+56LGhXG4gICAgICovXG4gICAgXCJzZWxlY3RlZC1jaGFuZ2VcIixcbiAgICAvKipcbiAgICAgKiDlgLzlj5jljJbkuovku7ZcbiAgICAgKi9cbiAgICBcImNoYW5nZVwiXG4gIF0sXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eDogYW55KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcblxuICAgIGlmIChwcm9wcy5yYWRpb05hbWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIuWPguaVsHJhZGlvTmFtZeWNs+WwhuW6n+W8g++8jOivt+aUueaIkG9wdGlvbk5hbWVcIik7XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkUmFkaW9OYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLm9wdGlvbk5hbWUgPz8gcHJvcHMucmFkaW9OYW1lID8/IHVpLnJhZGlvLm5hbWU7XG4gICAgfSk7XG5cbiAgICBsZXQgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgsIHVpLnJhZGlvR3JvdXAubW9kZWxWYWx1ZSk7XG4gICAgY29uc3QgY29tcHV0ZWRPcHRpb25zID0gdXNlZERpY3QuY3JlYXRlQ29tcHV0ZWRPcHRpb25zKCk7XG5cbiAgICBjb25zdCBvblNlbGVjdGVkQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcbiAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50YXJnZXQpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50YXJnZXQudmFsdWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xuICAgICAgaWYgKGRpY3QgJiYgZGljdC5kYXRhTWFwICYmIGRpY3QuZGF0YU1hcFt2YWx1ZV0pIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gZGljdC5kYXRhTWFwW3ZhbHVlXTtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgb3B0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIG51bGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICBjb21wdXRlZFJhZGlvTmFtZSxcbiAgICAgIC4uLnVzZWREaWN0LFxuICAgICAgY29tcHV0ZWRPcHRpb25zLFxuICAgICAgb25TZWxlY3RlZENoYW5nZVxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG4iLCI8c2NyaXB0IGxhbmc9XCJ0c3hcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCBhcyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEaWN0U2VsZWN0XCJcbn0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gIDxyZW5kZXI+PC9yZW5kZXI+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHN4XCIgc2V0dXA+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCByZWYsIHJlc29sdmVEeW5hbWljQ29tcG9uZW50LCB1c2VBdHRycyB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5cbi8qKlxuICog5a2X5YW46YCJ5oup5qGGXG4gKiDmlK/mjIFlbC1zZWxlY3R8YS1zZWxlY3TnmoTlsZ7mgKfphY3nva5cbiAqL1xuXG47XG5cbnR5cGUgUHJvcHNUeXBlID0ge1xuICAvKipcbiAgICog5a2X5YW4XG4gICAqL1xuICBkaWN0PzogYW55O1xuICAvKipcbiAgICog5Y+v6YCJ6aG577yM5q+UZGljdC5kYXRh5LyY5YWI57qn6auYXG4gICAqL1xuICBvcHRpb25zPzogYW55W107XG5cbiAgLyoqXG4gICAqIHNlbGVjdOe7hOS7tueahOaPkuanvVxuICAgKi9cbiAgc2xvdHM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIOiHquWumuS5iWxhYmVs55qEcmVuZGVy5pa55rOVXG4gICAqL1xuICByZW5kZXJMYWJlbD86IChpdGVtOiBhbnkpID0+IGFueTtcbiAgLyoqXG4gICAqIOi9rOaNokRpY3REYXRhXG4gICAqL1xuICB0cmFuc2Zvcm1EaWN0RGF0YT86IChpdGVtOiBhbnkpID0+IGFueTtcbn07XG5cbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8UHJvcHNUeXBlPigpO1xuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFtcImRpY3QtY2hhbmdlXCIsIFwic2VsZWN0ZWQtY2hhbmdlXCIsIFwiY2hhbmdlXCJdKTtcblxuY29uc3Qgc2VsZWN0UmVmID0gcmVmKCk7XG5jb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcbmNvbnN0IGNvbXB1dGVkUGxhY2Vob2xkZXIgPSBjb21wdXRlZCgoKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHByb3BzLnBsYWNlaG9sZGVyIHx8IHQoXCJmcy5jb21wb25lbnQuc2VsZWN0LnBsYWNlaG9sZGVyXCIpO1xufSk7XG5cbmNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG5jb25zdCBhdHRycyA9IHVzZUF0dHJzKCk7XG5jb25zdCBjdHggPSB7XG4gIGVtaXQsXG4gIGF0dHJzXG59O1xuY29uc3QgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgsIHVpLnNlbGVjdC5tb2RlbFZhbHVlKTtcbmNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IHVzZWREaWN0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xuXG5jb25zdCBvblNlbGVjdGVkQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XG4gIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XG4gIC8v5aaC5p6c5piv5pWw57uEXG4gIGlmICh2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgb3B0cyA9IFtdO1xuICAgIGZvciAoY29uc3QgdiBvZiB2YWx1ZSkge1xuICAgICAgaWYgKGRpY3QgJiYgZGljdC5kYXRhTWFwICYmIGRpY3QuZGF0YU1hcFt2XSkge1xuICAgICAgICBvcHRzLnB1c2goZGljdC5kYXRhTWFwW3ZdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBvcHRzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXAgJiYgZGljdC5kYXRhTWFwW3ZhbHVlXSkge1xuICAgIGNvbnN0IG9wdCA9IGRpY3QuZGF0YU1hcFt2YWx1ZV07XG4gICAgZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBvcHQpO1xuICB9IGVsc2Uge1xuICAgIGVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgbnVsbCk7XG4gIH1cbn07XG5cbmNvbnN0IHRlbXBTbG90cyA9IGRlZmluZVNsb3RzKCk7XG5cbmRlZmluZUV4cG9zZSh7XG4gIHNlbGVjdFJlZixcbiAgY29tcHV0ZWRQbGFjZWhvbGRlcixcbiAgLi4udXNlZERpY3QsXG4gIGNvbXB1dGVkT3B0aW9ucyxcbiAgb25TZWxlY3RlZENoYW5nZVxufSk7XG5cbmNvbnN0IHJlbmRlciA9ICgpID0+IHtcbiAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgY29uc3Qgc2VsZWN0Q29tcCA9IHJlc29sdmVEeW5hbWljQ29tcG9uZW50KHVpLnNlbGVjdC5uYW1lKTtcbiAgY29uc3Qgdk1vZGVsID0gdWkuc2VsZWN0Lm1vZGVsVmFsdWU7XG4gIGlmICh1aS5vcHRpb24ubmFtZSA9PSBudWxsKSB7XG4gICAgLy9uYWl2ZSB1aVxuICAgIC8v5Lulb3B0aW9uc+WPguaVsOS9nOS4um9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zID0gY29tcHV0ZWRPcHRpb25zLnZhbHVlIHx8IFtdO1xuICAgIGNvbnN0IGJpbmRpbmc6IGFueSA9IHtcbiAgICAgIFtgb25VcGRhdGU6JHt2TW9kZWx9YF06ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLiRlbWl0KGBvblVwZGF0ZToke3ZNb2RlbH1gLCB2YWx1ZSk7XG4gICAgICAgIG9uU2VsZWN0ZWRDaGFuZ2UodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIC4uLmF0dHJzXG4gICAgfTtcbiAgICBjb25zdCB0aGlzU2xvdHMgPSB7XG4gICAgICAuLi50ZW1wU2xvdHMsXG4gICAgICAuLi5wcm9wcy5zbG90c1xuICAgIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxzZWxlY3RDb21wXG4gICAgICAgIHJlZj17XCJzZWxlY3RSZWZcIn1cbiAgICAgICAgcGxhY2Vob2xkZXI9e2NvbXB1dGVkUGxhY2Vob2xkZXIudmFsdWV9XG4gICAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICAgIHJlbmRlckxhYmVsPXtwcm9wcy5yZW5kZXJMYWJlbH1cbiAgICAgICAgdi1zbG90cz17dGhpc1Nsb3RzfVxuICAgICAgICB7Li4uYmluZGluZ31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuICAvLyBvcHRpb25zIOS4uuWtkOe7hOS7tlxuICBjb25zdCBvcHRpb25zID0gW107XG4gIGNvbnN0IG9wdGlvbkNvbXAgPSByZXNvbHZlRHluYW1pY0NvbXBvbmVudCh1aS5vcHRpb24ubmFtZSk7XG4gIGNvbnN0IGNvcyA9IGNvbXB1dGVkT3B0aW9ucy52YWx1ZSB8fCBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGNvcykge1xuICAgIGNvbnN0IG9wdGlvbiA9IChcbiAgICAgIDxvcHRpb25Db21wIHsuLi5pdGVtfSB2YWx1ZT17dXNlZERpY3QuZ2V0VmFsdWUoaXRlbSl9IGxhYmVsPXt1c2VkRGljdC5nZXRMYWJlbChpdGVtKX0+XG4gICAgICAgIHtwcm9wcy5yZW5kZXJMYWJlbCA/IHByb3BzLnJlbmRlckxhYmVsKGl0ZW0pIDogdXNlZERpY3QuZ2V0TGFiZWwoaXRlbSl9XG4gICAgICA8L29wdGlvbkNvbXA+XG4gICAgKTtcbiAgICBvcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgfVxuICBjb25zdCB0aGlzU2xvdHMgPSB7XG4gICAgZGVmYXVsdDogKCkgPT4gb3B0aW9ucyxcbiAgICAuLi50ZW1wU2xvdHMsXG4gICAgLi4ucHJvcHMuc2xvdHNcbiAgfTtcbiAgcmV0dXJuIChcbiAgICA8c2VsZWN0Q29tcFxuICAgICAgcmVmPXtcInNlbGVjdFJlZlwifVxuICAgICAgcGxhY2Vob2xkZXI9e2NvbXB1dGVkUGxhY2Vob2xkZXIudmFsdWV9XG4gICAgICB2LXNsb3RzPXt0aGlzU2xvdHN9XG4gICAgICBvbkNoYW5nZT17b25TZWxlY3RlZENoYW5nZX1cbiAgICAgIHsuLi5hdHRyc31cbiAgICAvPlxuICApO1xufTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uYW50LXNlbGVjdC1tdWx0aXBsZSB7XG4gIG1pbi13aWR0aDogMTAwcHg7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8c3BhbiBjbGFzcz1cImZzLXZhbHVlcy1mb3JtYXRcIj5cbiAgICA8dGVtcGxhdGUgdi1pZj1cIml0ZW1SZW5kZXJcIj5cbiAgICAgIDxmcy1yZW5kZXIgdi1mb3I9XCJpdGVtIGluIGNvbXB1dGVkVmFsdWVJdGVtc1wiIDprZXk9XCJnZXRWYWx1ZShpdGVtKVwiIDpyZW5kZXItZnVuYz1cIml0ZW1SZW5kZXJcIiA6c2NvcGU9XCJpdGVtXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJ0eXBlID09PSAndGV4dCdcIj5cbiAgICAgIDxzcGFuIHYtZm9yPVwiaXRlbSBpbiBjb21wdXRlZFZhbHVlSXRlbXNcIiA6a2V5PVwiZ2V0VmFsdWUoaXRlbSlcIiBAY2xpY2s9XCJkb0NsaWNrKGl0ZW0pXCI+e3sgZ2V0TGFiZWwoaXRlbSkgfX08L3NwYW4+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgdi1lbHNlPlxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjb21wdXRlZFZhbHVlSXRlbXNcIiA6a2V5PVwiZ2V0VmFsdWUoaXRlbSlcIj5cbiAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgIDppcz1cInVpLnRhZy5uYW1lXCJcbiAgICAgICAgICBjbGFzcz1cImZzLXRhZ1wiXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICA6Y2xvc2FibGU9XCJjbG9zYWJsZVwiXG4gICAgICAgICAgdi1iaW5kPVwiaXRlbVwiXG4gICAgICAgICAgOmljb249XCJudWxsXCJcbiAgICAgICAgICA6bmFtZT1cIm51bGxcIlxuICAgICAgICAgIEBjbG9zZT1cImRvQ2xvc2UoaW5kZXgsIGl0ZW0pXCJcbiAgICAgICAgICBAY2xpY2s9XCJkb0NsaWNrKGl0ZW0pXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXRlbS5pY29uXCI+XG4gICAgICAgICAgICA8ZnMtaWNvbiA6aWNvbj1cIml0ZW0uaWNvblwiIDpzcGluPVwiaXRlbS5pY29uU3BpblwiIGNsYXNzPVwiZnMtdGFnLWljb25cIiAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAge3sgZ2V0TGFiZWwoaXRlbSkgfX1cbiAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvc3Bhbj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBmb3JFYWNoLCBvbWl0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgUmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuZnVuY3Rpb24gZ2V0SGFzaENvZGUoc3RyOiBzdHJpbmcpIHtcbiAgaWYgKHN0ciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICBzdHIgPSBKU09OLnN0cmluZ2lmeShzdHIpO1xuICB9XG4gIGxldCBoYXNoID0gMDtcbiAgbGV0IGk7XG4gIGxldCBjaHI7XG4gIGxldCBsZW47XG4gIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gaGFzaDtcbiAgZm9yIChpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY2hyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNocjtcbiAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG4gIHJldHVybiBNYXRoLmFicyhoYXNoKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBcnJheVZhbHVlKHByb3BzOiBhbnkpIHtcbiAgbGV0IHZhbHVlQXJyID0gW107XG4gIGlmICh0eXBlb2YgcHJvcHMubW9kZWxWYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBwcm9wcy5tdWx0aXBsZSAmJiBwcm9wcy5zZXBhcmF0b3IgIT0gbnVsbCAmJiBwcm9wcy5zZXBhcmF0b3IgIT09IFwiXCIpIHtcbiAgICB2YWx1ZUFyciA9IHByb3BzLm1vZGVsVmFsdWUuc3BsaXQocHJvcHMuc2VwYXJhdG9yKTtcbiAgfSBlbHNlIGlmIChwcm9wcy5tb2RlbFZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAvLyDmnKzmnaXlsLHmmK/mlbDnu4TnmoRcbiAgICB2YWx1ZUFyciA9IHByb3BzLm1vZGVsVmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWVBcnIgPSBbcHJvcHMubW9kZWxWYWx1ZV07XG4gIH1cbiAgcmV0dXJuIHZhbHVlQXJyO1xufVxuXG4vKipcbiAqIHZhbHVl5qC85byP5YyW5bGV56S657uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNWYWx1ZXNGb3JtYXRcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDlgLxcbiAgICAgKi9cbiAgICBtb2RlbFZhbHVlOiB7fSxcbiAgICAvKipcbiAgICAgKiDlrZflhbjphY3nva5cbiAgICAgKi9cbiAgICBkaWN0OiB7fSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKblpJrpgIlcbiAgICAgKi9cbiAgICBtdWx0aXBsZTogeyBkZWZhdWx0OiB0cnVlIH0sXG4gICAgLyoqXG4gICAgICog5YiG6ZqU56ymPGJyLz5cbiAgICAgKiDlpJrpgInml7bvvIzlpoLmnpx2YWx1ZeS4unN0cmluZ++8jOWImeS7peivpeWIhumalOespuWIhuWJsuaIkOWkmuS4quWxleekujxici8+XG4gICAgICog5Lyg5YWl56m65a2X56ym5Liy77yM6KGo56S65LiN5YiG5YmyPGJyLz5cbiAgICAgKi9cbiAgICBzZXBhcmF0b3I6IHsgZGVmYXVsdDogXCIsXCIgfSxcblxuICAgIC8qKlxuICAgICAqIOminOiJslxuICAgICAqIGVsZW1lbnQ944CQYXV0bywgcHJpbWFyeSwgc3VjY2Vzcywgd2FybmluZywgZGFuZ2VyICxpbmZv44CRXG4gICAgICogYW50ZHY944CQYXV0bywgcHJpbWFyeSwgc3VjY2VzcywgYmx1ZSxyZWQsLi4u44CRXG4gICAgICog6YWN572uYXV0b++8jOWImeiHquWKqOagueaNrnZhbHVl5YC8aGFzaGNvZGXliIbphY3popzoibLlgLxcbiAgICAgKi9cbiAgICBjb2xvcjoge30sXG4gICAgLyoqXG4gICAgICog5pWI5p6c77yI5LuFZWxlbWVudO+8iVxuICAgICAqKi9cbiAgICBlZmZlY3Q6IHt9LFxuICAgIC8qKlxuICAgICAqIOiHquWKqOafk+iJsuminOiJsuWAvOWIl+ihqFxuICAgICAqL1xuICAgIGF1dG9Db2xvcnM6IHtcbiAgICAgIHR5cGU6IEFycmF5XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDoh6rliqjkuLvpopjliJfooajvvIjku4VlbGVtZW5077yJXG4gICAgICog44CQIGxpZ2h0LCBwbGFpbiDjgJFcbiAgICAgKi9cbiAgICBhdXRvRWZmZWN0czoge1xuICAgICAgdHlwZTogQXJyYXlcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYvuekuuexu+Wei++8muOAkHRleHQsIHRhZ+OAkVxuICAgICAqL1xuICAgIHR5cGU6IHtcbiAgICAgIGRlZmF1bHQ6IFwidGFnXCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWAvOeahOexu+Wei++8jOOAkCB2YWx1ZSB8IG9iamVjdOOAkVxuICAgICAqL1xuICAgIHZhbHVlVHlwZToge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlvZN2YWx1ZeWAvOS4jeWcqOWtl+WFuOS4reaXtum7mOiupOaYvuekuueahOaWh+acrFxuICAgICAqL1xuICAgIGRlZmF1bHRMYWJlbDoge30sXG5cbiAgICAvKipcbiAgICAgKiBsYWJlbOiHquWumuS5iXJlbmRlclxuICAgICAqL1xuICAgIGxhYmVsRm9ybWF0dGVyOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvblxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6Ieq5a6a5LmJ6YCJ6aG5cmVuZGVyXG4gICAgICovXG4gICAgaXRlbVJlbmRlcjoge1xuICAgICAgdHlwZTogRnVuY3Rpb25cbiAgICB9LFxuXG4gICAgY2xvc2FibGU6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcImNsaWNrXCIsIFwiZGljdC1jaGFuZ2VcIiwgXCJjbG9zZVwiLCBcInVwZGF0ZTptb2RlbFZhbHVlXCJdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHg6IGFueSkge1xuICAgIC8vIHRyYWNlLnRyYWNlKFwidmFsdWVzLWZvcm1hdFwiKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcInZhbHVlcy1mb3JtYXQgaW5pdFwiLCBwcm9wcy5tb2RlbFZhbHVlKTtcbiAgICAvL2NvbnN0IGRpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgQ09MT1JfTElTVCA9IHVpLnRhZy5jb2xvcnM7XG4gICAgY29uc3QgRUZGRUNUX0xJU1QgPSBbXCJwbGFpblwiLCBcImxpZ2h0XCJdO1xuXG4gICAgY29uc3QgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHsgZ2V0Q29sb3IsIGdldFZhbHVlLCByZW1vdmVQcm9wVmFsdWUgfSA9IHVzZWREaWN0O1xuICAgIHVzZWREaWN0LndhdGNoVmFsdWUoKTtcbiAgICBmdW5jdGlvbiBzZXRDb2xvcihwcm9wczogYW55LCBpdGVtOiBhbnkpIHtcbiAgICAgIGlmICghaXRlbS5lZmZlY3QgJiYgcHJvcHMuZWZmZWN0KSB7XG4gICAgICAgIGl0ZW0uZWZmZWN0ID0gcHJvcHMuZWZmZWN0O1xuICAgICAgfVxuICAgICAgY29uc3QgdHlwZUtleSA9IHVpLnRhZy50eXBlO1xuICAgICAgY29uc3QgY29sb3IgPSBnZXRDb2xvcihpdGVtKTtcbiAgICAgIGlmIChjb2xvciAhPSBudWxsKSB7XG4gICAgICAgIC8v5aaC5p6c5bey57uP6YWN572u5LqGY29sb3JcbiAgICAgICAgaWYgKHR5cGVvZiBjb2xvciAhPSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8v5bCG5Y6f5pyJ55qEY29sb3LlrZfmrrXliKDmjonvvIzpgb/lhY1uYWl2ZSBjb2xvcuaKpemUmVxuICAgICAgICByZW1vdmVQcm9wVmFsdWUoaXRlbSwgXCJjb2xvclwiKTtcbiAgICAgICAgaXRlbVt0eXBlS2V5XSA9IGNvbG9yO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuY29sb3IgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgIGNvbnN0IGhhc2hjb2RlID0gZ2V0SGFzaENvZGUoZ2V0VmFsdWUoaXRlbSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhcImhhc2hjb2RlXCIsIGdldFZhbHVlKGl0ZW0pLCBoYXNoY29kZSk7XG4gICAgICAgIGNvbnN0IGNvbG9ycyA9IHByb3BzLmF1dG9Db2xvcnMgPyBwcm9wcy5hdXRvQ29sb3JzIDogQ09MT1JfTElTVDtcbiAgICAgICAgaXRlbVt0eXBlS2V5XSA9IGNvbG9yc1toYXNoY29kZSAlIGNvbG9ycy5sZW5ndGhdO1xuICAgICAgICBjb25zdCBlZmZlY3RzID0gcHJvcHMuYXV0b0VmZmVjdHMgPyBwcm9wcy5hdXRvRWZmZWN0cyA6IEVGRkVDVF9MSVNUO1xuICAgICAgICBpdGVtLmVmZmVjdCA9IGVmZmVjdHNbTWF0aC5mbG9vcihoYXNoY29kZSAvIGNvbG9ycy5sZW5ndGgpICUgZWZmZWN0cy5sZW5ndGhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbVt0eXBlS2V5XSA9IHByb3BzLmNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkVmFsdWVJdGVtczogUmVmPGFueVtdPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChwcm9wcy52YWx1ZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKHByb3BzLm1vZGVsVmFsdWUgJiYgIUFycmF5LmlzQXJyYXkocHJvcHMubW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gW3Byb3BzLm1vZGVsVmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcy5tb2RlbFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xuICAgICAgaWYgKHByb3BzLm1vZGVsVmFsdWUgPT0gbnVsbCB8fCBwcm9wcy5tb2RlbFZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlQXJyID0gYnVpbGRBcnJheVZhbHVlKHByb3BzKTtcblxuICAgICAgbGV0IG9wdGlvbnMgPSBbXTtcblxuICAgICAgY29uc3QgdmFsdWVQcm9wID0gcHJvcHMuZGljdD8udmFsdWUgfHwgXCJ2YWx1ZVwiO1xuICAgICAgY29uc3QgbGFiZWxQcm9wID0gcHJvcHMuZGljdD8ubGFiZWwgfHwgXCJsYWJlbFwiO1xuXG4gICAgICBpZiAoZGljdCkge1xuICAgICAgICBvcHRpb25zID0gZGljdC5nZXROb2Rlc0Zyb21EYXRhTWFwKHZhbHVlQXJyKTtcbiAgICAgICAgLy/orr7nva7pu5jorqRsYWJlbFxuICAgICAgICBmb3JFYWNoKG9wdGlvbnMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW1bbGFiZWxQcm9wXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpdGVtW2xhYmVsUHJvcF0gPSBwcm9wcy5kZWZhdWx0TGFiZWwgfHwgaXRlbVt2YWx1ZVByb3BdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zID0gW107XG4gICAgICAgIGZvckVhY2godmFsdWVBcnIsIChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaChpdGVtKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgW3ZhbHVlUHJvcF06IGl0ZW0sXG4gICAgICAgICAgICAgIFtsYWJlbFByb3BdOiBpdGVtXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb2xvcmZ1bE9wdGlvbnM6IGFueSA9IFtdO1xuICAgICAgZm9yRWFjaChvcHRpb25zLCAoaXRlbSkgPT4ge1xuICAgICAgICBjb2xvcmZ1bE9wdGlvbnMucHVzaChvbWl0KGl0ZW0sIFwiY2hpbGRyZW5cIikpO1xuICAgICAgfSk7XG4gICAgICBmb3JFYWNoKGNvbG9yZnVsT3B0aW9ucywgKGl0ZW0pID0+IHtcbiAgICAgICAgc2V0Q29sb3IocHJvcHMsIGl0ZW0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29sb3JmdWxPcHRpb25zO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZG9DbGljayhpdGVtOiBhbnkpIHtcbiAgICAgIGN0eC5lbWl0KFwiY2xpY2tcIiwgeyBpdGVtOiBpdGVtIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkb0Nsb3NlKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgICAgY3R4LmVtaXQoXCJjbG9zZVwiLCB7IGl0ZW0sIGluZGV4IH0pO1xuICAgICAgY29uc3QgbmV3VmFsdWVzOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wdXRlZFZhbHVlSXRlbXMudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgIT09IGluZGV4KSB7XG4gICAgICAgICAgbmV3VmFsdWVzLnB1c2goZ2V0VmFsdWUoY29tcHV0ZWRWYWx1ZUl0ZW1zLnZhbHVlW2ldKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgbmV3VmFsdWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICAuLi51c2VkRGljdCxcbiAgICAgIGRvQ2xpY2ssXG4gICAgICBjb21wdXRlZFZhbHVlSXRlbXMsXG4gICAgICBkb0Nsb3NlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXZhbHVlcy1mb3JtYXQgLmZzLXRhZyB7XG4gIG1hcmdpbjogMnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC5mcy10YWctaWNvbiB7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxzcGFuIGNsYXNzPVwiZnMtdmFsdWVzLWZvcm1hdFwiPlxuICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXRlbVJlbmRlclwiPlxuICAgICAgPGZzLXJlbmRlciB2LWZvcj1cIml0ZW0gaW4gY29tcHV0ZWRWYWx1ZUl0ZW1zXCIgOmtleT1cImdldFZhbHVlKGl0ZW0pXCIgOnJlbmRlci1mdW5jPVwiaXRlbVJlbmRlclwiIDpzY29wZT1cIml0ZW1cIiAvPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlIHYtZWxzZS1pZj1cInR5cGUgPT09ICd0ZXh0J1wiPlxuICAgICAgPHNwYW4gdi1mb3I9XCJpdGVtIGluIGNvbXB1dGVkVmFsdWVJdGVtc1wiIDprZXk9XCJnZXRWYWx1ZShpdGVtKVwiIEBjbGljaz1cImRvQ2xpY2soaXRlbSlcIj57eyBnZXRMYWJlbChpdGVtKSB9fTwvc3Bhbj5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNvbXB1dGVkVmFsdWVJdGVtc1wiIDprZXk9XCJnZXRWYWx1ZShpdGVtKVwiPlxuICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgOmlzPVwidWkudGFnLm5hbWVcIlxuICAgICAgICAgIGNsYXNzPVwiZnMtdGFnXCJcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIDpjbG9zYWJsZT1cImNsb3NhYmxlXCJcbiAgICAgICAgICB2LWJpbmQ9XCJpdGVtXCJcbiAgICAgICAgICA6aWNvbj1cIm51bGxcIlxuICAgICAgICAgIDpuYW1lPVwibnVsbFwiXG4gICAgICAgICAgQGNsb3NlPVwiZG9DbG9zZShpbmRleCwgaXRlbSlcIlxuICAgICAgICAgIEBjbGljaz1cImRvQ2xpY2soaXRlbSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpdGVtLmljb25cIj5cbiAgICAgICAgICAgIDxmcy1pY29uIDppY29uPVwiaXRlbS5pY29uXCIgOnNwaW49XCJpdGVtLmljb25TcGluXCIgY2xhc3M9XCJmcy10YWctaWNvblwiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICB7eyBnZXRMYWJlbChpdGVtKSB9fVxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9zcGFuPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGZvckVhY2gsIG9taXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBSZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5mdW5jdGlvbiBnZXRIYXNoQ29kZShzdHI6IHN0cmluZykge1xuICBpZiAoc3RyID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgIHN0ciA9IEpTT04uc3RyaW5naWZ5KHN0cik7XG4gIH1cbiAgbGV0IGhhc2ggPSAwO1xuICBsZXQgaTtcbiAgbGV0IGNocjtcbiAgbGV0IGxlbjtcbiAgaWYgKHN0ci5sZW5ndGggPT09IDApIHJldHVybiBoYXNoO1xuICBmb3IgKGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjaHIgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgY2hyO1xuICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cbiAgcmV0dXJuIE1hdGguYWJzKGhhc2gpO1xufVxuXG5mdW5jdGlvbiBidWlsZEFycmF5VmFsdWUocHJvcHM6IGFueSkge1xuICBsZXQgdmFsdWVBcnIgPSBbXTtcbiAgaWYgKHR5cGVvZiBwcm9wcy5tb2RlbFZhbHVlID09PSBcInN0cmluZ1wiICYmIHByb3BzLm11bHRpcGxlICYmIHByb3BzLnNlcGFyYXRvciAhPSBudWxsICYmIHByb3BzLnNlcGFyYXRvciAhPT0gXCJcIikge1xuICAgIHZhbHVlQXJyID0gcHJvcHMubW9kZWxWYWx1ZS5zcGxpdChwcm9wcy5zZXBhcmF0b3IpO1xuICB9IGVsc2UgaWYgKHByb3BzLm1vZGVsVmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIC8vIOacrOadpeWwseaYr+aVsOe7hOeahFxuICAgIHZhbHVlQXJyID0gcHJvcHMubW9kZWxWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZUFyciA9IFtwcm9wcy5tb2RlbFZhbHVlXTtcbiAgfVxuICByZXR1cm4gdmFsdWVBcnI7XG59XG5cbi8qKlxuICogdmFsdWXmoLzlvI/ljJblsZXnpLrnu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1ZhbHVlc0Zvcm1hdFwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOWAvFxuICAgICAqL1xuICAgIG1vZGVsVmFsdWU6IHt9LFxuICAgIC8qKlxuICAgICAqIOWtl+WFuOmFjee9rlxuICAgICAqL1xuICAgIGRpY3Q6IHt9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuWkmumAiVxuICAgICAqL1xuICAgIG11bHRpcGxlOiB7IGRlZmF1bHQ6IHRydWUgfSxcbiAgICAvKipcbiAgICAgKiDliIbpmpTnrKY8YnIvPlxuICAgICAqIOWkmumAieaXtu+8jOWmguaenHZhbHVl5Li6c3RyaW5n77yM5YiZ5Lul6K+l5YiG6ZqU56ym5YiG5Ymy5oiQ5aSa5Liq5bGV56S6PGJyLz5cbiAgICAgKiDkvKDlhaXnqbrlrZfnrKbkuLLvvIzooajnpLrkuI3liIblibI8YnIvPlxuICAgICAqL1xuICAgIHNlcGFyYXRvcjogeyBkZWZhdWx0OiBcIixcIiB9LFxuXG4gICAgLyoqXG4gICAgICog6aKc6ImyXG4gICAgICogZWxlbWVudD3jgJBhdXRvLCBwcmltYXJ5LCBzdWNjZXNzLCB3YXJuaW5nLCBkYW5nZXIgLGluZm/jgJFcbiAgICAgKiBhbnRkdj3jgJBhdXRvLCBwcmltYXJ5LCBzdWNjZXNzLCBibHVlLHJlZCwuLi7jgJFcbiAgICAgKiDphY3nva5hdXRv77yM5YiZ6Ieq5Yqo5qC55o2udmFsdWXlgLxoYXNoY29kZeWIhumFjeminOiJsuWAvFxuICAgICAqL1xuICAgIGNvbG9yOiB7fSxcbiAgICAvKipcbiAgICAgKiDmlYjmnpzvvIjku4VlbGVtZW5077yJXG4gICAgICoqL1xuICAgIGVmZmVjdDoge30sXG4gICAgLyoqXG4gICAgICog6Ieq5Yqo5p+T6Imy6aKc6Imy5YC85YiX6KGoXG4gICAgICovXG4gICAgYXV0b0NvbG9yczoge1xuICAgICAgdHlwZTogQXJyYXlcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOiHquWKqOS4u+mimOWIl+ihqO+8iOS7hWVsZW1lbnTvvIlcbiAgICAgKiDjgJAgbGlnaHQsIHBsYWluIOOAkVxuICAgICAqL1xuICAgIGF1dG9FZmZlY3RzOiB7XG4gICAgICB0eXBlOiBBcnJheVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5pi+56S657G75Z6L77ya44CQdGV4dCwgdGFn44CRXG4gICAgICovXG4gICAgdHlwZToge1xuICAgICAgZGVmYXVsdDogXCJ0YWdcIlxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5YC855qE57G75Z6L77yM44CQIHZhbHVlIHwgb2JqZWN044CRXG4gICAgICovXG4gICAgdmFsdWVUeXBlOiB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW9k3ZhbHVl5YC85LiN5Zyo5a2X5YW45Lit5pe26buY6K6k5pi+56S655qE5paH5pysXG4gICAgICovXG4gICAgZGVmYXVsdExhYmVsOiB7fSxcblxuICAgIC8qKlxuICAgICAqIGxhYmVs6Ieq5a6a5LmJcmVuZGVyXG4gICAgICovXG4gICAgbGFiZWxGb3JtYXR0ZXI6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDoh6rlrprkuYnpgInpoblyZW5kZXJcbiAgICAgKi9cbiAgICBpdGVtUmVuZGVyOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvblxuICAgIH0sXG5cbiAgICBjbG9zYWJsZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBlbWl0czogW1wiY2xpY2tcIiwgXCJkaWN0LWNoYW5nZVwiLCBcImNsb3NlXCIsIFwidXBkYXRlOm1vZGVsVmFsdWVcIl0sXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eDogYW55KSB7XG4gICAgLy8gdHJhY2UudHJhY2UoXCJ2YWx1ZXMtZm9ybWF0XCIpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwidmFsdWVzLWZvcm1hdCBpbml0XCIsIHByb3BzLm1vZGVsVmFsdWUpO1xuICAgIC8vY29uc3QgZGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCk7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCBDT0xPUl9MSVNUID0gdWkudGFnLmNvbG9ycztcbiAgICBjb25zdCBFRkZFQ1RfTElTVCA9IFtcInBsYWluXCIsIFwibGlnaHRcIl07XG5cbiAgICBjb25zdCB1c2VkRGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCk7XG4gICAgY29uc3QgeyBnZXRDb2xvciwgZ2V0VmFsdWUsIHJlbW92ZVByb3BWYWx1ZSB9ID0gdXNlZERpY3Q7XG4gICAgdXNlZERpY3Qud2F0Y2hWYWx1ZSgpO1xuICAgIGZ1bmN0aW9uIHNldENvbG9yKHByb3BzOiBhbnksIGl0ZW06IGFueSkge1xuICAgICAgaWYgKCFpdGVtLmVmZmVjdCAmJiBwcm9wcy5lZmZlY3QpIHtcbiAgICAgICAgaXRlbS5lZmZlY3QgPSBwcm9wcy5lZmZlY3Q7XG4gICAgICB9XG4gICAgICBjb25zdCB0eXBlS2V5ID0gdWkudGFnLnR5cGU7XG4gICAgICBjb25zdCBjb2xvciA9IGdldENvbG9yKGl0ZW0pO1xuICAgICAgaWYgKGNvbG9yICE9IG51bGwpIHtcbiAgICAgICAgLy/lpoLmnpzlt7Lnu4/phY3nva7kuoZjb2xvclxuICAgICAgICBpZiAodHlwZW9mIGNvbG9yICE9IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy/lsIbljp/mnInnmoRjb2xvcuWtl+auteWIoOaOie+8jOmBv+WFjW5haXZlIGNvbG9y5oql6ZSZXG4gICAgICAgIHJlbW92ZVByb3BWYWx1ZShpdGVtLCBcImNvbG9yXCIpO1xuICAgICAgICBpdGVtW3R5cGVLZXldID0gY29sb3I7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5jb2xvciA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgY29uc3QgaGFzaGNvZGUgPSBnZXRIYXNoQ29kZShnZXRWYWx1ZShpdGVtKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiaGFzaGNvZGVcIiwgZ2V0VmFsdWUoaXRlbSksIGhhc2hjb2RlKTtcbiAgICAgICAgY29uc3QgY29sb3JzID0gcHJvcHMuYXV0b0NvbG9ycyA/IHByb3BzLmF1dG9Db2xvcnMgOiBDT0xPUl9MSVNUO1xuICAgICAgICBpdGVtW3R5cGVLZXldID0gY29sb3JzW2hhc2hjb2RlICUgY29sb3JzLmxlbmd0aF07XG4gICAgICAgIGNvbnN0IGVmZmVjdHMgPSBwcm9wcy5hdXRvRWZmZWN0cyA/IHByb3BzLmF1dG9FZmZlY3RzIDogRUZGRUNUX0xJU1Q7XG4gICAgICAgIGl0ZW0uZWZmZWN0ID0gZWZmZWN0c1tNYXRoLmZsb29yKGhhc2hjb2RlIC8gY29sb3JzLmxlbmd0aCkgJSBlZmZlY3RzLmxlbmd0aF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtW3R5cGVLZXldID0gcHJvcHMuY29sb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRWYWx1ZUl0ZW1zOiBSZWY8YW55W10+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKHByb3BzLnZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAocHJvcHMubW9kZWxWYWx1ZSAmJiAhQXJyYXkuaXNBcnJheShwcm9wcy5tb2RlbFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBbcHJvcHMubW9kZWxWYWx1ZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BzLm1vZGVsVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XG4gICAgICBpZiAocHJvcHMubW9kZWxWYWx1ZSA9PSBudWxsIHx8IHByb3BzLm1vZGVsVmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWVBcnIgPSBidWlsZEFycmF5VmFsdWUocHJvcHMpO1xuXG4gICAgICBsZXQgb3B0aW9ucyA9IFtdO1xuXG4gICAgICBjb25zdCB2YWx1ZVByb3AgPSBwcm9wcy5kaWN0Py52YWx1ZSB8fCBcInZhbHVlXCI7XG4gICAgICBjb25zdCBsYWJlbFByb3AgPSBwcm9wcy5kaWN0Py5sYWJlbCB8fCBcImxhYmVsXCI7XG5cbiAgICAgIGlmIChkaWN0KSB7XG4gICAgICAgIG9wdGlvbnMgPSBkaWN0LmdldE5vZGVzRnJvbURhdGFNYXAodmFsdWVBcnIpO1xuICAgICAgICAvL+iuvue9rum7mOiupGxhYmVsXG4gICAgICAgIGZvckVhY2gob3B0aW9ucywgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbVtsYWJlbFByb3BdID09IG51bGwpIHtcbiAgICAgICAgICAgIGl0ZW1bbGFiZWxQcm9wXSA9IHByb3BzLmRlZmF1bHRMYWJlbCB8fCBpdGVtW3ZhbHVlUHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yRWFjaCh2YWx1ZUFyciwgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICBbdmFsdWVQcm9wXTogaXRlbSxcbiAgICAgICAgICAgICAgW2xhYmVsUHJvcF06IGl0ZW1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbG9yZnVsT3B0aW9uczogYW55ID0gW107XG4gICAgICBmb3JFYWNoKG9wdGlvbnMsIChpdGVtKSA9PiB7XG4gICAgICAgIGNvbG9yZnVsT3B0aW9ucy5wdXNoKG9taXQoaXRlbSwgXCJjaGlsZHJlblwiKSk7XG4gICAgICB9KTtcbiAgICAgIGZvckVhY2goY29sb3JmdWxPcHRpb25zLCAoaXRlbSkgPT4ge1xuICAgICAgICBzZXRDb2xvcihwcm9wcywgaXRlbSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb2xvcmZ1bE9wdGlvbnM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBkb0NsaWNrKGl0ZW06IGFueSkge1xuICAgICAgY3R4LmVtaXQoXCJjbGlja1wiLCB7IGl0ZW06IGl0ZW0gfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRvQ2xvc2UoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSB7XG4gICAgICBjdHguZW1pdChcImNsb3NlXCIsIHsgaXRlbSwgaW5kZXggfSk7XG4gICAgICBjb25zdCBuZXdWYWx1ZXM6IGFueVtdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXB1dGVkVmFsdWVJdGVtcy52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gaW5kZXgpIHtcbiAgICAgICAgICBuZXdWYWx1ZXMucHVzaChnZXRWYWx1ZShjb21wdXRlZFZhbHVlSXRlbXMudmFsdWVbaV0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBuZXdWYWx1ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIC4uLnVzZWREaWN0LFxuICAgICAgZG9DbGljayxcbiAgICAgIGNvbXB1dGVkVmFsdWVJdGVtcyxcbiAgICAgIGRvQ2xvc2VcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtdmFsdWVzLWZvcm1hdCAuZnMtdGFnIHtcbiAgbWFyZ2luOiAycHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLmZzLXRhZy1pY29uIHtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPHNwYW4+XG4gICAgPHRlbXBsYXRlIHYtaWY9XCJjb21wdXRlZE11bHRpcGxlXCI+XG4gICAgICA8ZGl2IHYtZm9yPVwiKExhYmVscywgSW5kZXgpIGluIG11bHRpcGxlTGFiZWxzXCIgOmtleT1cIkluZGV4XCI+XG4gICAgICAgIDxzcGFuIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBMYWJlbHNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgICA8c3BhbiB2LWlmPVwiaW5kZXggIT09IDBcIj4gLyA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgZ2V0TGFiZWwoaXRlbSkgfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlIHYtZWxzZT5cbiAgICAgIDxzcGFuIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBsYWJlbHNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgPHNwYW4gdi1pZj1cImluZGV4ICE9PSAwXCI+IC8gPC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBnZXRMYWJlbChpdGVtKSB9fTwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L3RlbXBsYXRlPlxuICA8L3NwYW4+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG4vKipcbiAqIOe6p+iBlOaVsOaNruagvOW8j+WMluWxleekuue7hOS7tlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRGljdENhc2NhZGVyRm9ybWF0XCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICogICDlgLw8YnIvPlxuICAgICAqICAg5Y2V6YCJ5pe2ICcxLDIsMycg5oiWIFsxLDIsM108YnIvPlxuICAgICAqICAg5aSa6YCJW1sxLDIsM10sWzQsNSw2XV08YnIvPlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBtb2RlbFZhbHVlOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBBcnJheV0sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICByZXF1aXJlOiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiAgdmFsdWXnmoTliIbpmpTnrKY8YnIvPlxuICAgICAqICDlpJrpgInml7bvvIzlpoLmnpx2YWx1ZeS4unN0cmluZ++8jOWImeS7peivpeWIhumalOespuWIhuWJsuaIkOWkmuS4quWxleekujxici8+XG4gICAgICogIOS8oOWFpeepuuWtl+espuS4su+8jOihqOekuuS4jeWIhuWJsjxici8+XG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHNlcGFyYXRvcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IFwiLFwiLCByZXF1aXJlOiBmYWxzZSB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuWkmumAiVxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBtdWx0aXBsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIC8qKlxuICAgICAqIOaVsOaNruWtl+WFuFxuICAgICAqL1xuICAgIGRpY3Q6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgIHJlcXVpcmU6IGZhbHNlXG4gICAgfVxuICB9IGFzIGFueSxcbiAgZW1pdHM6IFtcImRpY3QtY2hhbmdlXCJdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgZGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChwcm9wcy5kaWN0Py5nZXROb2Rlc0J5VmFsdWVzKSB7XG4gICAgICBkaWN0LndhdGNoVmFsdWUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZE11bHRpcGxlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHByb3BzLm11bHRpcGxlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRpY3QsXG4gICAgICBjb21wdXRlZE11bHRpcGxlXG4gICAgfTtcbiAgfSxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge307XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgbGFiZWxzKCkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaWYgKHRoaXMubW9kZWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkVmFsdWVJdGVtKHRoaXMubW9kZWxWYWx1ZSk7XG4gICAgfSxcbiAgICBtdWx0aXBsZUxhYmVscygpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICh0aGlzLm1vZGVsVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBjb25zdCBhcnIgPSBbXTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhcnIucHVzaCh0aGlzLmJ1aWxkVmFsdWVJdGVtKGl0ZW0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgZ2V0VmFsdWVBcnIodmFsdWVzOiBhbnkpIHtcbiAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgdmFsdWVzID0gW107XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIGl0ZW0pIHtcbiAgICAgICAgICAgICAgdmFsdWVzLnB1c2goc3ViKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHZhbHVlcyA9IHRoaXMubW9kZWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGxldCBhcnIgPSBudWxsO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZXMgPT09IFwic3RyaW5nXCIgJiYgIXRoaXMubXVsdGlwbGUgJiYgdGhpcy5zZXBhcmF0b3IgIT0gbnVsbCAmJiB0aGlzLnNlcGFyYXRvciAhPT0gXCJcIikge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGFyciA9IHZhbHVlcy5zcGxpdCh0aGlzLnNlcGFyYXRvcik7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGFyciA9IHZhbHVlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyciA9IFt2YWx1ZXNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIGJ1aWxkVmFsdWVJdGVtKHZhbHVlczogYW55KSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCBhcnIgPSB0aGlzLmdldFZhbHVlQXJyKHZhbHVlcyk7XG5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGNvbnN0IGRpY3QgPSB0aGlzLmdldERpY3QoKTtcbiAgICAgIGlmIChkaWN0KSB7XG4gICAgICAgIHJldHVybiBkaWN0LmdldE5vZGVzRnJvbURhdGFNYXAoYXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxzcGFuPlxuICAgIDx0ZW1wbGF0ZSB2LWlmPVwiY29tcHV0ZWRNdWx0aXBsZVwiPlxuICAgICAgPGRpdiB2LWZvcj1cIihMYWJlbHMsIEluZGV4KSBpbiBtdWx0aXBsZUxhYmVsc1wiIDprZXk9XCJJbmRleFwiPlxuICAgICAgICA8c3BhbiB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gTGFiZWxzXCIgOmtleT1cImluZGV4XCI+XG4gICAgICAgICAgPHNwYW4gdi1pZj1cImluZGV4ICE9PSAwXCI+IC8gPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IGdldExhYmVsKGl0ZW0pIH19PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XG4gICAgICA8c3BhbiB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gbGFiZWxzXCIgOmtleT1cImluZGV4XCI+XG4gICAgICAgIDxzcGFuIHYtaWY9XCJpbmRleCAhPT0gMFwiPiAvIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4+e3sgZ2V0TGFiZWwoaXRlbSkgfX08L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9zcGFuPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuLyoqXG4gKiDnuqfogZTmlbDmja7moLzlvI/ljJblsZXnpLrnu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0RpY3RDYXNjYWRlckZvcm1hdFwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqICAg5YC8PGJyLz5cbiAgICAgKiAgIOWNlemAieaXtiAnMSwyLDMnIOaIliBbMSwyLDNdPGJyLz5cbiAgICAgKiAgIOWkmumAiVtbMSwyLDNdLFs0LDUsNl1dPGJyLz5cbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbW9kZWxWYWx1ZToge1xuICAgICAgdHlwZTogW1N0cmluZywgQXJyYXldLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICAgICAgcmVxdWlyZTogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogIHZhbHVl55qE5YiG6ZqU56ymPGJyLz5cbiAgICAgKiAg5aSa6YCJ5pe277yM5aaC5p6cdmFsdWXkuLpzdHJpbmfvvIzliJnku6Xor6XliIbpmpTnrKbliIblibLmiJDlpJrkuKrlsZXnpLo8YnIvPlxuICAgICAqICDkvKDlhaXnqbrlrZfnrKbkuLLvvIzooajnpLrkuI3liIblibI8YnIvPlxuICAgICAqL1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzZXBhcmF0b3I6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBcIixcIiwgcmVxdWlyZTogZmFsc2UgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKblpJrpgIlcbiAgICAgKi9cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbXVsdGlwbGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICAvKipcbiAgICAgKiDmlbDmja7lrZflhbhcbiAgICAgKi9cbiAgICBkaWN0OiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICByZXF1aXJlOiBmYWxzZVxuICAgIH1cbiAgfSBhcyBhbnksXG4gIGVtaXRzOiBbXCJkaWN0LWNoYW5nZVwiXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IGRpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAocHJvcHMuZGljdD8uZ2V0Tm9kZXNCeVZhbHVlcykge1xuICAgICAgZGljdC53YXRjaFZhbHVlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRNdWx0aXBsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiBwcm9wcy5tdWx0aXBsZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kaWN0LFxuICAgICAgY29tcHV0ZWRNdWx0aXBsZVxuICAgIH07XG4gIH0sXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9LFxuICBjb21wdXRlZDoge1xuICAgIGxhYmVscygpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICh0aGlzLm1vZGVsVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gdGhpcy5idWlsZFZhbHVlSXRlbSh0aGlzLm1vZGVsVmFsdWUpO1xuICAgIH0sXG4gICAgbXVsdGlwbGVMYWJlbHMoKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAodGhpcy5tb2RlbFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgYXJyLnB1c2godGhpcy5idWlsZFZhbHVlSXRlbShpdGVtKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH1cbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIGdldFZhbHVlQXJyKHZhbHVlczogYW55KSB7XG4gICAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIHZhbHVlcyA9IFtdO1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiBpdGVtKSB7XG4gICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHN1Yik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB2YWx1ZXMgPSB0aGlzLm1vZGVsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBsZXQgYXJyID0gbnVsbDtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICh0eXBlb2YgdmFsdWVzID09PSBcInN0cmluZ1wiICYmICF0aGlzLm11bHRpcGxlICYmIHRoaXMuc2VwYXJhdG9yICE9IG51bGwgJiYgdGhpcy5zZXBhcmF0b3IgIT09IFwiXCIpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhcnIgPSB2YWx1ZXMuc3BsaXQodGhpcy5zZXBhcmF0b3IpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBhcnIgPSB2YWx1ZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcnIgPSBbdmFsdWVzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICBidWlsZFZhbHVlSXRlbSh2YWx1ZXM6IGFueSkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgYXJyID0gdGhpcy5nZXRWYWx1ZUFycih2YWx1ZXMpO1xuXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCBkaWN0ID0gdGhpcy5nZXREaWN0KCk7XG4gICAgICBpZiAoZGljdCkge1xuICAgICAgICByZXR1cm4gZGljdC5nZXROb2Rlc0Zyb21EYXRhTWFwKGFycik7XG4gICAgICB9XG4gICAgfVxuICB9XG59KTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50XG4gICAgOmlzPVwidWkuY2FzY2FkZXIubmFtZVwiXG4gICAgcmVmPVwiY2FzY2FkZXJSZWZcIlxuICAgIDpvcHRpb25zPVwiY29tcHV0ZWRPcHRpb25zXCJcbiAgICB2LWJpbmQ9XCJmaWVsZE5hbWVzQmluZGVyXCJcbiAgICBAY2hhbmdlPVwib25TZWxlY3RDaGFuZ2VcIlxuICAvPlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbi8qKlxuICog5a2X5YW457qn6IGU57uE5Lu2XG4gKiDmlK/mjIFlbC1jYXNjYWRlcnxhLWNhc2NhZGVy57uE5Lu255qE5Y+C5pWwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEaWN0Q2FzY2FkZXJcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDlrZflhbjphY3nva5cbiAgICAgKi9cbiAgICBkaWN0OiB7fSxcbiAgICAvKipcbiAgICAgKiDpgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5IH0sXG4gICAgLyoqXG4gICAgICog6L2s5o2iRGljdERhdGFcbiAgICAgKi9cbiAgICB0cmFuc2Zvcm1EaWN0RGF0YToge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXG4gICAgLyoqXG4gICAgICog5a2X5YW45pWw5o2u5Y+Y5YyW5LqL5Lu2XG4gICAgICovXG4gICAgXCJkaWN0LWNoYW5nZVwiLFxuXG4gICAgLyoqXG4gICAgICog6YCJ5Lit5YC85Y+Y5YyW5LqL5Lu277yM5Y+v5Lul6I635Y+W5Yiw5b2T5YmN6YCJ5Lit55qEb3B0aW9u5a+56LGhXG4gICAgICovXG4gICAgXCJzZWxlY3RlZC1jaGFuZ2VcIixcbiAgICAvKipcbiAgICAgKiDlgLzlj5jljJbkuovku7ZcbiAgICAgKi9cbiAgICBcImNoYW5nZVwiXG4gIF0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCBjYXNjYWRlclJlZiA9IHJlZigpO1xuICAgIGNvbnN0IGRpY3RVc2VSZXQgPSB1c2VEaWN0KHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgZmllbGROYW1lc0JpbmRlciA9IHJlZigpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAocHJvcHMuZGljdCkge1xuICAgICAgZmllbGROYW1lc0JpbmRlci52YWx1ZSA9IHVpLmNhc2NhZGVyLmZpZWxkTmFtZXMoe1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHZhbHVlOiBwcm9wcy5kaWN0LnZhbHVlLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGxhYmVsOiBwcm9wcy5kaWN0LmxhYmVsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNoaWxkcmVuOiBwcm9wcy5kaWN0LmNoaWxkcmVuXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWRPcHRpb25zID0gZGljdFVzZVJldC5jcmVhdGVDb21wdXRlZE9wdGlvbnMoKTtcblxuICAgIGZ1bmN0aW9uIG9uU2VsZWN0Q2hhbmdlKHZhbHVlOiBhbnkpIHtcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb25zID0gW107XG4gICAgICAgIGNvbnN0IGRpY3QgPSBkaWN0VXNlUmV0LmdldERpY3QoKTtcbiAgICAgICAgaWYgKGRpY3QgJiYgZGljdC5kYXRhTWFwKSB7XG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0ID0gZGljdC5kYXRhTWFwW2l0ZW1dO1xuICAgICAgICAgICAgaWYgKG9wdCkge1xuICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMucHVzaChvcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBzZWxlY3RlZE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgY2FzY2FkZXJSZWYsXG4gICAgICAuLi5kaWN0VXNlUmV0LFxuICAgICAgZmllbGROYW1lc0JpbmRlcixcbiAgICAgIGNvbXB1dGVkT3B0aW9ucyxcbiAgICAgIG9uU2VsZWN0Q2hhbmdlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cInVpLmNhc2NhZGVyLm5hbWVcIlxuICAgIHJlZj1cImNhc2NhZGVyUmVmXCJcbiAgICA6b3B0aW9ucz1cImNvbXB1dGVkT3B0aW9uc1wiXG4gICAgdi1iaW5kPVwiZmllbGROYW1lc0JpbmRlclwiXG4gICAgQGNoYW5nZT1cIm9uU2VsZWN0Q2hhbmdlXCJcbiAgLz5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCByZWYgfSBmcm9tIFwidnVlXCI7XG4vKipcbiAqIOWtl+WFuOe6p+iBlOe7hOS7tlxuICog5pSv5oyBZWwtY2FzY2FkZXJ8YS1jYXNjYWRlcue7hOS7tueahOWPguaVsFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRGljdENhc2NhZGVyXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5a2X5YW46YWN572uXG4gICAgICovXG4gICAgZGljdDoge30sXG4gICAgLyoqXG4gICAgICog6YCJ6aG577yM5q+UZGljdC5kYXRh5LyY5YWI57qn6auYXG4gICAgICovXG4gICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSB9LFxuICAgIC8qKlxuICAgICAqIOi9rOaNokRpY3REYXRhXG4gICAgICovXG4gICAgdHJhbnNmb3JtRGljdERhdGE6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuICBlbWl0czogW1xuICAgIC8qKlxuICAgICAqIOWtl+WFuOaVsOaNruWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiZGljdC1jaGFuZ2VcIixcblxuICAgIC8qKlxuICAgICAqIOmAieS4reWAvOWPmOWMluS6i+S7tu+8jOWPr+S7peiOt+WPluWIsOW9k+WJjemAieS4reeahG9wdGlvbuWvueixoVxuICAgICAqL1xuICAgIFwic2VsZWN0ZWQtY2hhbmdlXCIsXG4gICAgLyoqXG4gICAgICog5YC85Y+Y5YyW5LqL5Lu2XG4gICAgICovXG4gICAgXCJjaGFuZ2VcIlxuICBdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgY2FzY2FkZXJSZWYgPSByZWYoKTtcbiAgICBjb25zdCBkaWN0VXNlUmV0ID0gdXNlRGljdChwcm9wcywgY3R4KTtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IGZpZWxkTmFtZXNCaW5kZXIgPSByZWYoKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHByb3BzLmRpY3QpIHtcbiAgICAgIGZpZWxkTmFtZXNCaW5kZXIudmFsdWUgPSB1aS5jYXNjYWRlci5maWVsZE5hbWVzKHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB2YWx1ZTogcHJvcHMuZGljdC52YWx1ZSxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsYWJlbDogcHJvcHMuZGljdC5sYWJlbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjaGlsZHJlbjogcHJvcHMuZGljdC5jaGlsZHJlblxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IGRpY3RVc2VSZXQuY3JlYXRlQ29tcHV0ZWRPcHRpb25zKCk7XG5cbiAgICBmdW5jdGlvbiBvblNlbGVjdENoYW5nZSh2YWx1ZTogYW55KSB7XG4gICAgICBjdHguZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICBjb25zdCBkaWN0ID0gZGljdFVzZVJldC5nZXREaWN0KCk7XG4gICAgICAgIGlmIChkaWN0ICYmIGRpY3QuZGF0YU1hcCkge1xuICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdCA9IGRpY3QuZGF0YU1hcFtpdGVtXTtcbiAgICAgICAgICAgIGlmIChvcHQpIHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25zLnB1c2gob3B0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgc2VsZWN0ZWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIGNhc2NhZGVyUmVmLFxuICAgICAgLi4uZGljdFVzZVJldCxcbiAgICAgIGZpZWxkTmFtZXNCaW5kZXIsXG4gICAgICBjb21wdXRlZE9wdGlvbnMsXG4gICAgICBvblNlbGVjdENoYW5nZVxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnQgOmlzPVwidWkuY2hlY2tib3hHcm91cC5uYW1lXCIgQGNoYW5nZT1cIm9uU2VsZWN0ZWRDaGFuZ2VcIj5cbiAgICA8Y29tcG9uZW50XG4gICAgICA6aXM9XCJvcHRpb25OYW1lIHx8IHVpLmNoZWNrYm94Lm5hbWVcIlxuICAgICAgdi1mb3I9XCJpdGVtIG9mIGNvbXB1dGVkT3B0aW9uc1wiXG4gICAgICByZWY9XCJjaGVja2JveFJlZlwiXG4gICAgICA6a2V5PVwiZ2V0VmFsdWUoaXRlbSlcIlxuICAgICAgOlt1aS5jaGVja2JveC52YWx1ZV09XCJnZXRWYWx1ZShpdGVtKVwiXG4gICAgICB2LWJpbmQ9XCJvcHRpb25Qcm9wc1wiXG4gICAgICA+e3sgZ2V0TGFiZWwoaXRlbSkgfX08L2NvbXBvbmVudFxuICAgID5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcblxuLyoqXG4gKiDlrZflhbhjaGVja2JveFxuICog5pSv5oyBZWwtY2hlY2tib3h8YS1jaGVja2JveOWPguaVsFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRGljdENoZWNrYm94XCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5a2X5YW4XG4gICAgICovXG4gICAgZGljdDoge30sXG4gICAgLyoqXG4gICAgICog6YCJ6aG577yM5q+UZGljdC5kYXRh5LyY5YWI57qn6auYXG4gICAgICovXG4gICAgb3B0aW9uczogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogdW5kZWZpbmVkLCByZXF1aXJlOiBmYWxzZSB9LFxuXG4gICAgLyoqXG4gICAgICog6YCJ6aG555qE57uE5Lu25ZCN56ewXG4gICAgICovXG4gICAgb3B0aW9uTmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOmAiemhueeahOWxnuaAp1xuICAgICAqL1xuICAgIG9wdGlvblByb3BzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDovazmjaJEaWN0RGF0YVxuICAgICAqL1xuICAgIHRyYW5zZm9ybURpY3REYXRhOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcbiAgICAvKipcbiAgICAgKiDlrZflhbjmlbDmja7lj5jljJbkuovku7ZcbiAgICAgKi9cbiAgICBcImRpY3QtY2hhbmdlXCIsXG5cbiAgICAvKipcbiAgICAgKiDpgInkuK3lgLzlj5jljJbkuovku7bvvIzlj6/ku6Xojrflj5bliLDlvZPliY3pgInkuK3nmoRvcHRpb27lr7nosaFcbiAgICAgKi9cbiAgICBcInNlbGVjdGVkLWNoYW5nZVwiLFxuICAgIC8qKlxuICAgICAqIOWAvOWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiY2hhbmdlXCJcbiAgXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgbGV0IHVzZWREaWN0ID0gdXNlRGljdChwcm9wcywgY3R4LCB1aS5jaGVja2JveEdyb3VwLm1vZGVsVmFsdWUpO1xuICAgIGNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IHVzZWREaWN0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xuICAgIGNvbnN0IG9uU2VsZWN0ZWRDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgY3R4LmVtaXQoXCJjaGFuZ2VcIiwgdmFsdWUpO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGxldCBzZWxlY3RlZE9wdGlvbnMgPSBbXTtcbiAgICAgICAgY29uc3QgZGljdCA9IHVzZWREaWN0LmdldERpY3QoKTtcbiAgICAgICAgaWYgKGRpY3QgJiYgZGljdC5kYXRhTWFwKSB7XG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0ID0gZGljdC5kYXRhTWFwW2l0ZW1dO1xuICAgICAgICAgICAgaWYgKG9wdCkge1xuICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMucHVzaChvcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBzZWxlY3RlZE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBudWxsKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgLi4udXNlZERpY3QsXG4gICAgICBjb21wdXRlZE9wdGlvbnMsXG4gICAgICBvblNlbGVjdGVkQ2hhbmdlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jaGVja2JveEdyb3VwLm5hbWVcIiBAY2hhbmdlPVwib25TZWxlY3RlZENoYW5nZVwiPlxuICAgIDxjb21wb25lbnRcbiAgICAgIDppcz1cIm9wdGlvbk5hbWUgfHwgdWkuY2hlY2tib3gubmFtZVwiXG4gICAgICB2LWZvcj1cIml0ZW0gb2YgY29tcHV0ZWRPcHRpb25zXCJcbiAgICAgIHJlZj1cImNoZWNrYm94UmVmXCJcbiAgICAgIDprZXk9XCJnZXRWYWx1ZShpdGVtKVwiXG4gICAgICA6W3VpLmNoZWNrYm94LnZhbHVlXT1cImdldFZhbHVlKGl0ZW0pXCJcbiAgICAgIHYtYmluZD1cIm9wdGlvblByb3BzXCJcbiAgICAgID57eyBnZXRMYWJlbChpdGVtKSB9fTwvY29tcG9uZW50XG4gICAgPlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgdXNlRGljdCB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWRpY3RcIjtcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG4vKipcbiAqIOWtl+WFuGNoZWNrYm94XG4gKiDmlK/mjIFlbC1jaGVja2JveHxhLWNoZWNrYm945Y+C5pWwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEaWN0Q2hlY2tib3hcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDlrZflhbhcbiAgICAgKi9cbiAgICBkaWN0OiB7fSxcbiAgICAvKipcbiAgICAgKiDpgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiB1bmRlZmluZWQsIHJlcXVpcmU6IGZhbHNlIH0sXG5cbiAgICAvKipcbiAgICAgKiDpgInpobnnmoTnu4Tku7blkI3np7BcbiAgICAgKi9cbiAgICBvcHRpb25OYW1lOiB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog6YCJ6aG555qE5bGe5oCnXG4gICAgICovXG4gICAgb3B0aW9uUHJvcHM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOi9rOaNokRpY3REYXRhXG4gICAgICovXG4gICAgdHJhbnNmb3JtRGljdERhdGE6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuICBlbWl0czogW1xuICAgIC8qKlxuICAgICAqIOWtl+WFuOaVsOaNruWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiZGljdC1jaGFuZ2VcIixcblxuICAgIC8qKlxuICAgICAqIOmAieS4reWAvOWPmOWMluS6i+S7tu+8jOWPr+S7peiOt+WPluWIsOW9k+WJjemAieS4reeahG9wdGlvbuWvueixoVxuICAgICAqL1xuICAgIFwic2VsZWN0ZWQtY2hhbmdlXCIsXG4gICAgLyoqXG4gICAgICog5YC85Y+Y5YyW5LqL5Lu2XG4gICAgICovXG4gICAgXCJjaGFuZ2VcIlxuICBdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBsZXQgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgsIHVpLmNoZWNrYm94R3JvdXAubW9kZWxWYWx1ZSk7XG4gICAgY29uc3QgY29tcHV0ZWRPcHRpb25zID0gdXNlZERpY3QuY3JlYXRlQ29tcHV0ZWRPcHRpb25zKCk7XG4gICAgY29uc3Qgb25TZWxlY3RlZENoYW5nZSA9ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICBjdHguZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xuICAgICAgICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXApIHtcbiAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBvcHQgPSBkaWN0LmRhdGFNYXBbaXRlbV07XG4gICAgICAgICAgICBpZiAob3B0KSB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9ucy5wdXNoKG9wdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIHNlbGVjdGVkT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIG51bGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICAuLi51c2VkRGljdCxcbiAgICAgIGNvbXB1dGVkT3B0aW9ucyxcbiAgICAgIG9uU2VsZWN0ZWRDaGFuZ2VcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50IDppcz1cInVpLnN3aXRjaC5uYW1lXCIgcmVmPVwic3dpdGNoUmVmXCIgdi1iaW5kPVwiYmluZGluZ1wiIC8+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyB1aUNvbnRleHQgfSBmcm9tIFwiLi4vLi4vdWlcIjtcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgUHJvcFR5cGUgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBEaWN0T3B0aW9ucywgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5cbi8qKlxuICog5a2X5YW45byA5YWzXG4gKiDmlK/mjIFlbC1zd2l0Y2h8YS1zd2l0Y2jnmoTlsZ7mgKdcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0RpY3RTd2l0Y2hcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDlrZflhbjnrKzkuIDkuKrkuLrlvIDlkK9cbiAgICAgKiDnrKzkuozkuKrkuLrlhbPpl61cbiAgICAgKi9cbiAgICBkaWN0OiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8RGljdE9wdGlvbnM8YW55Pj5cbiAgICB9LFxuICAgIG9wdGlvbnM6IHt9LFxuICAgIC8qKlxuICAgICAqIOi9rOaNokRpY3REYXRhXG4gICAgICovXG4gICAgdHJhbnNmb3JtRGljdERhdGE6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfVxuICB9IGFzIGFueSxcbiAgZW1pdHM6IFtcImRpY3QtY2hhbmdlXCJdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBsZXQgdXNlZERpY3QgPSB1c2VEaWN0KHByb3BzLCBjdHgsIHVpLnN3aXRjaC5tb2RlbFZhbHVlKTtcbiAgICBjb25zdCBjb21wdXRlZE9wdGlvbnMgPSB1c2VkRGljdC5jcmVhdGVDb21wdXRlZE9wdGlvbnMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICAuLi51c2VkRGljdCxcbiAgICAgIGNvbXB1dGVkT3B0aW9uc1xuICAgIH07XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgX2FjdGl2ZSgpIHtcbiAgICAgIGlmICh0aGlzLmNvbXB1dGVkT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVkT3B0aW9uc1swXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICAgIF9pbkFjdGl2ZSgpIHtcbiAgICAgIGlmICh0aGlzLmNvbXB1dGVkT3B0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVkT3B0aW9uc1sxXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICAgIGJpbmRpbmcoKSB7XG4gICAgICBjb25zdCB1aSA9IHVpQ29udGV4dC5nZXQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgW3VpLnN3aXRjaC5hY3RpdmVUZXh0XTogdGhpcy5fYWN0aXZlW3RoaXMuZGljdD8ubGFiZWwgfHwgXCJsYWJlbFwiXSxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBbdWkuc3dpdGNoLmluYWN0aXZlVGV4dF06IHRoaXMuX2luQWN0aXZlW3RoaXMuZGljdD8ubGFiZWwgfHwgXCJsYWJlbFwiXSxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBbdWkuc3dpdGNoLmFjdGl2ZUNvbG9yXTogdGhpcy5fYWN0aXZlW3RoaXMuZGljdD8uY29sb3IgfHwgXCJjb2xvclwiXSxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBbdWkuc3dpdGNoLmluYWN0aXZlQ29sb3JdOiB0aGlzLl9pbkFjdGl2ZVt0aGlzLmRpY3Q/LmNvbG9yIHx8IFwiY29sb3JcIl0sXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgW3VpLnN3aXRjaC5hY3RpdmVWYWx1ZV06IHRoaXMuX2FjdGl2ZVt0aGlzLmRpY3Q/LnZhbHVlIHx8IFwidmFsdWVcIl0sXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgW3VpLnN3aXRjaC5pbmFjdGl2ZVZhbHVlXTogdGhpcy5faW5BY3RpdmVbdGhpcy5kaWN0Py52YWx1ZSB8fCBcInZhbHVlXCJdXG4gICAgICB9O1xuICAgIH1cbiAgfVxufSk7XG48L3NjcmlwdD4iLCI8dGVtcGxhdGU+XG4gIDxzcGFuPnt7IGRvRm9ybWF0IH19PC9zcGFuPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbi8qKlxuICog5pel5pyf5qC85byP5YyW5bGV56S657uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEYXRlRm9ybWF0XCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5pel5pyf5pe26Ze05YC877yM5pSv5oyBbG9uZyxzdHJpbmcsZGF0Zeetie+8jOeUsWRheWpz6L2s5YyWXG4gICAgICovXG4gICAgbW9kZWxWYWx1ZTogeyByZXF1aXJlZDogZmFsc2UgfSxcbiAgICAvKipcbiAgICAgKiAg6L6T5YWl5qC85byP5YyW77yM5LiN5Lyg5YiZ55SxZGF5anPoh6rliqjovazljJZcbiAgICAgKi9cbiAgICB2YWx1ZUZvcm1hdDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IHVuZGVmaW5lZCwgcmVxdWlyZWQ6IGZhbHNlIH0sXG4gICAgLyoqXG4gICAgICogIOi+k+WHuuagvOW8j+WMllxuICAgICAqL1xuICAgIGZvcm1hdDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IFwiWVlZWS1NTS1ERCBISDptbTpzc1wiLCByZXF1aXJlZDogZmFsc2UgfVxuICB9LFxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpdGVtOiB7fVxuICAgIH07XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgZG9Gb3JtYXQoKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbFZhbHVlID09IG51bGwgfHwgdGhpcy5tb2RlbFZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgICAgbGV0IGRhdGUgPSBudWxsO1xuICAgICAgaWYgKHRoaXMudmFsdWVGb3JtYXQgIT0gbnVsbCkge1xuICAgICAgICBkYXRlID0gZGF5anModGhpcy5tb2RlbFZhbHVlLCB0aGlzLnZhbHVlRm9ybWF0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGUgPSBkYXlqcyh0aGlzLm1vZGVsVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGUuZm9ybWF0KHRoaXMuZm9ybWF0KTtcbiAgICB9XG4gIH0gYXMgYW55LFxuICBjcmVhdGVkKCkge30sXG4gIG1ldGhvZHM6IHt9XG59KTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50XG4gICAgOmlzPVwidWkudHJlZVNlbGVjdC5uYW1lXCJcbiAgICByZWY9XCJ0cmVlUmVmXCJcbiAgICA6W3VpLnRyZWVTZWxlY3Qub3B0aW9uc109XCJjb21wdXRlZE9wdGlvbnNcIlxuICAgIDpwbGFjZWhvbGRlcj1cImNvbXB1dGVkUGxhY2Vob2xkZXJcIlxuICAgIHYtYmluZD1cImNvbXB1dGVkQmluZGluZ1wiXG4gICAgQGNoYW5nZT1cIm9uU2VsZWN0ZWRDaGFuZ2VcIlxuICA+XG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKHZhbHVlLCBrZXkpIG9mIHNsb3RzXCIgOmtleT1cImtleVwiICNba2V5XT1cInNjb3BlXCI+XG4gICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwidmFsdWVcIiA6c2NvcGU9XCJzY29wZVwiPjwvZnMtc2xvdC1yZW5kZXI+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZURpY3QgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1kaWN0XCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5cbi8qKlxuICog5a2X5YW45qCR6YCJ5oup57uE5Lu2XG4gKiDmlK/mjIEgYS10cmVlLXNlbGVjdCDlj4LmlbBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0RpY3RUcmVlXCIsXG4gIGNvbXBvbmVudHM6IHt9LFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaVsOaNruWtl+WFuFxuICAgICAqL1xuICAgIGRpY3Q6IHt9LFxuICAgIC8qKlxuICAgICAqIOWPr+mAiemhue+8jOavlGRpY3QuZGF0YeS8mOWFiOe6p+mrmFxuICAgICAqL1xuICAgIG9wdGlvbnM6IHsgdHlwZTogQXJyYXkgfSxcbiAgICAvKipcbiAgICAgKiBwbGFjZWhvbGRlclxuICAgICAqL1xuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZyB9LFxuICAgIC8qKlxuICAgICAqIOi9rOaNokRpY3REYXRhXG4gICAgICovXG4gICAgdHJhbnNmb3JtRGljdERhdGE6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuICBlbWl0czogW1xuICAgIC8qKlxuICAgICAqIOWtl+WFuOaVsOaNruWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiZGljdC1jaGFuZ2VcIixcblxuICAgIC8qKlxuICAgICAqIOmAieS4reWAvOWPmOWMluS6i+S7tu+8jOWPr+S7peiOt+WPluWIsOW9k+WJjemAieS4reeahG9wdGlvbuWvueixoVxuICAgICAqL1xuICAgIFwic2VsZWN0ZWQtY2hhbmdlXCIsXG4gICAgLyoqXG4gICAgICog5YC85Y+Y5YyW5LqL5Lu2XG4gICAgICovXG4gICAgXCJjaGFuZ2VcIlxuICBdLFxuICAvLyByZW5kZXIgKCkge1xuICAvLyAgIHJldHVybiB0aGlzLnJlbmRlckZ1bmMoeyBkYXRhOiB0aGlzLmRhdGEsIGRhdGFNYXA6IHRoaXMuZGF0YU1hcCwgc2NvcGU6IHRoaXMuc2NvcGUsIGF0dHJzOiB0aGlzLiRhdHRycyB9KVxuICAvLyB9LFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCBjb21wdXRlZFBsYWNlaG9sZGVyID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLnBsYWNlaG9sZGVyIHx8IHQoXCJmcy5jb21wb25lbnQuc2VsZWN0LnBsYWNlaG9sZGVyXCIpO1xuICAgIH0pO1xuXG4gICAgbGV0IHVzZWREaWN0ID0gdXNlRGljdChwcm9wcywgY3R4KTtcblxuICAgIGNvbnN0IHNsb3RzID0gY3R4LnNsb3RzO1xuXG4gICAgY29uc3QgY29tcHV0ZWRPcHRpb25zID0gdXNlZERpY3QuY3JlYXRlQ29tcHV0ZWRPcHRpb25zKCk7XG5cbiAgICBjb25zdCBjb21wdXRlZEJpbmRpbmcgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xuICAgICAgcmV0dXJuIHVpLnRyZWVTZWxlY3QuYnVpbGRPcHRpb25LZXlzTmFtZUJpbmRpbmcoe1xuICAgICAgICBsYWJlbDogZGljdC5sYWJlbCxcbiAgICAgICAgdmFsdWU6IGRpY3QudmFsdWUsXG4gICAgICAgIGNoaWxkcmVuOiBkaWN0LmNoaWxkcmVuXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IG9uU2VsZWN0ZWRDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgY3R4LmVtaXQoXCJjaGFuZ2VcIiwgdmFsdWUpO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRpY3QgPSB1c2VkRGljdC5nZXREaWN0KCk7XG4gICAgICAgIGlmIChkaWN0ICYmIGRpY3QuZGF0YU1hcCkge1xuICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb25zID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9wdCA9IGRpY3QuZGF0YU1hcFtpdGVtXTtcbiAgICAgICAgICAgICAgaWYgKG9wdCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9ucy5wdXNoKG9wdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIHNlbGVjdGVkT3B0aW9ucyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIGRpY3QuZGF0YU1hcFt2YWx1ZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHRyZWVSZWYgPSByZWYoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICBjb21wdXRlZEJpbmRpbmcsXG4gICAgICBjb21wdXRlZFBsYWNlaG9sZGVyLFxuICAgICAgLi4udXNlZERpY3QsXG4gICAgICBjb21wdXRlZE9wdGlvbnMsXG4gICAgICBvblNlbGVjdGVkQ2hhbmdlLFxuICAgICAgc2xvdHMsXG4gICAgICB0cmVlUmVmXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cInVpLnRyZWVTZWxlY3QubmFtZVwiXG4gICAgcmVmPVwidHJlZVJlZlwiXG4gICAgOlt1aS50cmVlU2VsZWN0Lm9wdGlvbnNdPVwiY29tcHV0ZWRPcHRpb25zXCJcbiAgICA6cGxhY2Vob2xkZXI9XCJjb21wdXRlZFBsYWNlaG9sZGVyXCJcbiAgICB2LWJpbmQ9XCJjb21wdXRlZEJpbmRpbmdcIlxuICAgIEBjaGFuZ2U9XCJvblNlbGVjdGVkQ2hhbmdlXCJcbiAgPlxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIih2YWx1ZSwga2V5KSBvZiBzbG90c1wiIDprZXk9XCJrZXlcIiAjW2tleV09XCJzY29wZVwiPlxuICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInZhbHVlXCIgOnNjb3BlPVwic2NvcGVcIj48L2ZzLXNsb3QtcmVuZGVyPlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCByZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VEaWN0IH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtZGljdFwiO1xuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG4vKipcbiAqIOWtl+WFuOagkemAieaLqee7hOS7tlxuICog5pSv5oyBIGEtdHJlZS1zZWxlY3Qg5Y+C5pWwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNEaWN0VHJlZVwiLFxuICBjb21wb25lbnRzOiB7fSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDmlbDmja7lrZflhbhcbiAgICAgKi9cbiAgICBkaWN0OiB7fSxcbiAgICAvKipcbiAgICAgKiDlj6/pgInpobnvvIzmr5RkaWN0LmRhdGHkvJjlhYjnuqfpq5hcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7IHR5cGU6IEFycmF5IH0sXG4gICAgLyoqXG4gICAgICogcGxhY2Vob2xkZXJcbiAgICAgKi9cbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcgfSxcbiAgICAvKipcbiAgICAgKiDovazmjaJEaWN0RGF0YVxuICAgICAqL1xuICAgIHRyYW5zZm9ybURpY3REYXRhOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcbiAgICAvKipcbiAgICAgKiDlrZflhbjmlbDmja7lj5jljJbkuovku7ZcbiAgICAgKi9cbiAgICBcImRpY3QtY2hhbmdlXCIsXG5cbiAgICAvKipcbiAgICAgKiDpgInkuK3lgLzlj5jljJbkuovku7bvvIzlj6/ku6Xojrflj5bliLDlvZPliY3pgInkuK3nmoRvcHRpb27lr7nosaFcbiAgICAgKi9cbiAgICBcInNlbGVjdGVkLWNoYW5nZVwiLFxuICAgIC8qKlxuICAgICAqIOWAvOWPmOWMluS6i+S7tlxuICAgICAqL1xuICAgIFwiY2hhbmdlXCJcbiAgXSxcbiAgLy8gcmVuZGVyICgpIHtcbiAgLy8gICByZXR1cm4gdGhpcy5yZW5kZXJGdW5jKHsgZGF0YTogdGhpcy5kYXRhLCBkYXRhTWFwOiB0aGlzLmRhdGFNYXAsIHNjb3BlOiB0aGlzLnNjb3BlLCBhdHRyczogdGhpcy4kYXR0cnMgfSlcbiAgLy8gfSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgY29tcHV0ZWRQbGFjZWhvbGRlciA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBwcm9wcy5wbGFjZWhvbGRlciB8fCB0KFwiZnMuY29tcG9uZW50LnNlbGVjdC5wbGFjZWhvbGRlclwiKTtcbiAgICB9KTtcblxuICAgIGxldCB1c2VkRGljdCA9IHVzZURpY3QocHJvcHMsIGN0eCk7XG5cbiAgICBjb25zdCBzbG90cyA9IGN0eC5zbG90cztcblxuICAgIGNvbnN0IGNvbXB1dGVkT3B0aW9ucyA9IHVzZWREaWN0LmNyZWF0ZUNvbXB1dGVkT3B0aW9ucygpO1xuXG4gICAgY29uc3QgY29tcHV0ZWRCaW5kaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgZGljdCA9IHVzZWREaWN0LmdldERpY3QoKTtcbiAgICAgIHJldHVybiB1aS50cmVlU2VsZWN0LmJ1aWxkT3B0aW9uS2V5c05hbWVCaW5kaW5nKHtcbiAgICAgICAgbGFiZWw6IGRpY3QubGFiZWwsXG4gICAgICAgIHZhbHVlOiBkaWN0LnZhbHVlLFxuICAgICAgICBjaGlsZHJlbjogZGljdC5jaGlsZHJlblxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvblNlbGVjdGVkQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBjb25zdCBkaWN0ID0gdXNlZERpY3QuZ2V0RGljdCgpO1xuICAgICAgICBpZiAoZGljdCAmJiBkaWN0LmRhdGFNYXApIHtcbiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9ucyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCBvcHQgPSBkaWN0LmRhdGFNYXBbaXRlbV07XG4gICAgICAgICAgICAgIGlmIChvcHQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMucHVzaChvcHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBzZWxlY3RlZE9wdGlvbnMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdHguZW1pdChcInNlbGVjdGVkLWNoYW5nZVwiLCBkaWN0LmRhdGFNYXBbdmFsdWVdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eC5lbWl0KFwic2VsZWN0ZWQtY2hhbmdlXCIsIG51bGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB0cmVlUmVmID0gcmVmKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgY29tcHV0ZWRCaW5kaW5nLFxuICAgICAgY29tcHV0ZWRQbGFjZWhvbGRlcixcbiAgICAgIC4uLnVzZWREaWN0LFxuICAgICAgY29tcHV0ZWRPcHRpb25zLFxuICAgICAgb25TZWxlY3RlZENoYW5nZSxcbiAgICAgIHNsb3RzLFxuICAgICAgdHJlZVJlZlxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy10YWJsZS1zZWxlY3RcIj5cbiAgICA8dGVtcGxhdGUgdi1pZj1cIiFzbG90cz8uZGVmYXVsdCAmJiAhdmlld01vZGVcIj5cbiAgICAgIDxmcy1kaWN0LXNlbGVjdFxuICAgICAgICByZWY9XCJkaWN0U2VsZWN0UmVmXCJcbiAgICAgICAgdi1iaW5kPVwiY29tcHV0ZWRTZWxlY3RcIlxuICAgICAgICA6b3Blbj1cImZhbHNlXCJcbiAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICA6cmVhZG9ubHk9XCJyZWFkb25seVwiXG4gICAgICAgIDpkaWN0PVwiZGljdFwiXG4gICAgICAgIEBjbGljaz1cIm9wZW5UYWJsZVNlbGVjdFwiXG4gICAgICAvPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHNsb3Qgdi1iaW5kPVwic2NvcGVSZWZcIj48L3Nsb3Q+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5za2lwVmFsaWRhdGlvbldyYXBwZXJcIj5cbiAgICAgIDxmcy1mb3JtLXdyYXBwZXIgcmVmPVwiZm9ybVdyYXBwZXJSZWZcIiB2LWJpbmQ9XCJmb3JtV3JhcHBlck9wdGlvbnNcIiBAY2xvc2VkPVwib25DbG9zZVwiIEBvcGVuPVwib25PcGVuXCI+XG4gICAgICAgIDx0ZW1wbGF0ZSAjZm9ybS1ib2R5LXRvcD5cbiAgICAgICAgICA8ZGl2IHYtaWY9XCJkaWFsb2dPcGVuIHx8IGRlc3Ryb3lPbkNsb3NlID09PSBmYWxzZVwiIDpzdHlsZT1cInsgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiBoZWlnaHQgfHwgJzcwdmgnIH1cIj5cbiAgICAgICAgICAgIDxmcy1jcnVkIHJlZj1cImNydWRSZWZcIiB2LWJpbmQ9XCJjcnVkQmluZGluZ1wiPlxuICAgICAgICAgICAgICA8dGVtcGxhdGUgI2hlYWRlci10b3A+XG4gICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwic2hvd0N1cnJlbnQgIT09IGZhbHNlICYmICF2aWV3TW9kZVwiIGNsYXNzPVwiZnMtdGFibGUtc2VsZWN0LWN1cnJlbnRcIj5cbiAgICAgICAgICAgICAgICAgIOW9k+WJjemAieS4re+8mlxuICAgICAgICAgICAgICAgICAgPGZzLXZhbHVlcy1mb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgcmVmPVwidmFsdWVzRm9ybWF0UmVmXCJcbiAgICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cInNlbGVjdGVkUm93S2V5c1wiXG4gICAgICAgICAgICAgICAgICAgIDpkaWN0PVwiZGljdFwiXG4gICAgICAgICAgICAgICAgICAgIDpjbG9zYWJsZT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICB2LWJpbmQ9XCJjb21wdXRlZFZhbHVlc0Zvcm1hdFwiXG4gICAgICAgICAgICAgICAgICA+PC9mcy12YWx1ZXMtZm9ybWF0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgPC9mcy1jcnVkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9mcy1mb3JtLXdyYXBwZXI+XG4gICAgICA8IS0tICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5kaWFsb2cubmFtZVwiIHYtbW9kZWw6W3VpLmRpYWxvZy52aXNpYmxlXT1cImRpYWxvZ09wZW5cIiB2LWJpbmQ9XCJjb21wdXRlZERpYWxvZ0JpbmRpbmdcIj4tLT5cbiAgICAgIDwhLS0gICAgICAgIDx0ZW1wbGF0ZSAjW3VpLmRpYWxvZy5mb290ZXJTbG90TmFtZV0+LS0+XG4gICAgICA8IS0tICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuYnV0dG9uLm5hbWVcIiB2LWlmPVwiIXZpZXdNb2RlXCIgQGNsaWNrPVwiZGlhbG9nT3BlbiA9IGZhbHNlXCI+5Y+W5raIPC9jb21wb25lbnQ+LS0+XG4gICAgICA8IS0tICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuYnV0dG9uLm5hbWVcIiB0eXBlPVwicHJpbWFyeVwiIEBjbGljaz1cIm9uT2tcIj7noa7orqQ8L2NvbXBvbmVudD4tLT5cbiAgICAgIDwhLS0gICAgICAgIDwvdGVtcGxhdGU+LS0+XG4gICAgICA8IS0tICAgICAgPC9jb21wb25lbnQ+LS0+XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzeFwiIHNldHVwPlxuaW1wb3J0IHsgRGljdCwgdXNlQ29tcHV0ZSwgdXNlRnNBc3luYywgdXNlRnNSZWYsIHVzZU1lcmdlLCB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbmltcG9ydCB7IGNvbXB1dGVkLCBuZXh0VGljaywgcmVmLCBSZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgQ3JlYXRlQ3J1ZE9wdGlvbnMsIER5bmFtaWNhbGx5Q3J1ZE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vZFwiO1xuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcblxudHlwZSBGc1RhYmxlU2VsZWN0UHJvcHMgPSB7XG4gIC8qKlxuICAgKiBtb2RlbFZhbHVlXG4gICAqL1xuICBtb2RlbFZhbHVlOiBhbnk7XG4gIC8qKlxuICAgKiBjcnVkT3B0aW9uc+WIm+W7uuaWueazlVxuICAgKi9cbiAgY3JlYXRlQ3J1ZE9wdGlvbnM6IENyZWF0ZUNydWRPcHRpb25zO1xuICAvKipcbiAgICogY3J1ZE9wdGlvbnMg6KaG55uW6YWN572uXG4gICAqL1xuICBjcnVkT3B0aW9uc092ZXJyaWRlPzogRHluYW1pY2FsbHlDcnVkT3B0aW9ucztcblxuICAvKipcbiAgICog5omT5byA5a+56K+d5qGG5YmN77yM5Y+v5Lul5L+u5pS56YWN572uXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBiZWZvcmVPcGVuPzogKG9wdGlvbnM6IHtcbiAgICBjcnVkT3B0aW9uczogRHluYW1pY2FsbHlDcnVkT3B0aW9ucztcbiAgICBzZWxlY3RlZFJvd0tleXM6IGFueTtcbiAgICBvcGVuOiBhbnk7XG4gICAgb3BlbmVkOiBhbnk7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9KSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICog5pWw5o2u5a2X5YW4XG4gICAqIOW/hemgiOmFjee9rmBnZXROb2Rlc0J5VmFsdWVzYOWPguaVsCzkvaDpnIDopoHlrp7njrDvvJrmoLnmja5pZOWIl+ihqOWQkeWQjuWPsOivt+axguWkmuihjOaVsOaNruW5tui/lOWbnlxuICAgKiBgZGljdC52YWx1ZeW/hemhu+S4jnRhYmxlLnJvd0tleeS4gOiHtGBcbiAgICovXG4gIGRpY3Q6IERpY3Q7XG4gIC8qKlxuICAgKiDpgInmi6nmoYYgZnMtZGljdC1zZWxlY3TphY3nva5cbiAgICovXG4gIHNlbGVjdD86IGFueTtcblxuICAvKipcbiAgICog5piv5ZCm5pi+56S66YCJ5oup5qGGXG4gICAqIOacieaXtuWAmeS9oOWPquaYr+aDs+imgemCo+S4qumAieaLqeeahERpYWxvZ++8jOmCo+S5iOS9oOWPr+S7pemakOiXj3NlbGVjdO+8jOeEtuWQjuiHquWumuS5iea/gOa0u+aWueW8j1xuICAgKi9cbiAgc2hvd1NlbGVjdD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiDlr7nor53moYbphY3nva5cbiAgICovXG4gIGRpYWxvZz86IGFueTtcblxuICAvKipcbiAgICog5a+56K+d5qGG5Lit5piv5ZCm5pi+56S65b2T5YmN6YCJ5Lit5YC8XG4gICAqL1xuICBzaG93Q3VycmVudD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiDlvZPliY3pgInkuK3lgLwgZnMtdmFsdWVzLWZvcm1hdOe7hOS7tiDphY3nva5cbiAgICovXG4gIHZhbHVlc0Zvcm1hdD86IGFueTtcblxuICAvKipcbiAgICogY3J1ZOmrmOW6plxuICAgKi9cbiAgaGVpZ2h0Pzogc3RyaW5nO1xuICAvKipcbiAgICog5piv5ZCm5aSa6YCJXG4gICAqL1xuICBtdWx0aXBsZT86IGJvb2xlYW47IC8v5Y2V6YCJ6L+Y5piv5aSa6YCJXG4gIC8qKlxuICAgKiDot6jpobXpgInkuK1cbiAgICovXG4gIGNyb3NzUGFnZT86IGJvb2xlYW47IC8v6Leo6aG16YCJ5LitXG5cbiAgLyoqXG4gICAqIOWPr+mAiSxlbGVtZW50LXBsdXPlv4XkvKBcbiAgICovXG4gIHJvd0tleT86IHN0cmluZztcblxuICBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgcmVhZG9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiDlgLznsbvlnotcbiAgICovXG4gIHZhbHVlVHlwZT86IFwidmFsdWVcIiB8IFwib2JqZWN0XCI7XG5cbiAgLyoqXG4gICAqIOaYr+WQpuafpeeci+aooeW8j1xuICAgKi9cbiAgdmlld01vZGU/OiBib29sZWFuO1xuICAvKipcbiAgICog5p+l55yL5qih5byP5LiL5piv5ZCm6Kem5Y+RY2hhbmdl5LqL5Lu2XG4gICAqL1xuICBlbWl0T25WaWV3TW9kZWw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiB0YWJsZeaYr+WQpui3n+maj+eql+WPo+WFs+mXreiAjOmUgOavgVxuICAgKi9cbiAgZGVzdHJveU9uQ2xvc2U/OiBib29sZWFuO1xufTtcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKGRlZmluZVByb3BzPEZzVGFibGVTZWxlY3RQcm9wcz4oKSwge1xuICBjcm9zc1BhZ2U6IHRydWUsXG4gIHJvd0tleTogdW5kZWZpbmVkLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIHJlYWRvbmx5OiBmYWxzZSxcbiAgaGVpZ2h0OiB1bmRlZmluZWQsXG4gIHZhbHVlc0Zvcm1hdDogdW5kZWZpbmVkLFxuICBkaWFsb2c6IHVuZGVmaW5lZCxcbiAgc2VsZWN0OiB1bmRlZmluZWQsXG4gIGNydWRPcHRpb25zT3ZlcnJpZGU6IHVuZGVmaW5lZCxcbiAgdmFsdWVUeXBlOiBcInZhbHVlXCIsXG4gIHNob3dTZWxlY3Q6IHRydWUsXG4gIHNob3dDdXJyZW50OiB0cnVlLFxuICB2aWV3TW9kZTogZmFsc2UsXG4gIGVtaXRPblZpZXdNb2RlbDogdHJ1ZSxcbiAgZGVzdHJveU9uQ2xvc2U6IHRydWUsXG4gIC8qKlxuICAgKiBjcmVhdGVDcnVkT3B0aW9uc+aWueazleaYr+WQjOatpei/mOaYr+W8guatpVxuICAgKi9cbiAgSXNTeW5jQ3JlYXRlOiBmYWxzZVxufSk7XG5cbmNvbnN0IHNsb3RzID0gZGVmaW5lU2xvdHM8e1xuICAvKipgXG4gICAqIOm7mOiupOaPkuanvVxuICAgKiBgYGBqc1xuICAgKiBzY29wZSA9IHtcbiAgICogIC8v5piv5ZCm5bey5omT5byAXG4gICAqICBvcGVuZWQ6Ym9vbGVhbixcbiAgICogIC8v5omT5byA5pa55rOVXG4gICAqICBvcGVuOigpPT52b2lkXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBkZWZhdWx0OiBhbnk7XG59PigpO1xuXG5jb25zdCBlbWl0cyA9IGRlZmluZUVtaXRzKFtcbiAgXCJjaGFuZ2VcIixcbiAgXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLFxuICAvKiDpgInkuK3ooYzlj5jljJbkuovku7YgKi9cbiAgXCJzZWxlY3RlZC1jaGFuZ2VcIixcbiAgLyrlr7nor53moYbljbPlsIblhbPpl60qL1xuICBcImRpYWxvZy1jbG9zZVwiLFxuICAvKuWvueivneahhuW3suWFs+mXrSovXG4gIFwiZGlhbG9nLWNsb3NlZFwiLFxuICAvKuWvueivneahhuWFs+mXrSovXG4gIFwiY2xvc2VcIlxuXSk7XG5jb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG5jb25zdCBkaWN0U2VsZWN0UmVmID0gcmVmKCk7XG5jb25zdCB2YWx1ZXNGb3JtYXRSZWYgPSByZWYoKTtcbmNvbnN0IGRpYWxvZ09wZW4gPSByZWYoZmFsc2UpO1xuXG5mdW5jdGlvbiBvbkNsb3NlKCkge1xuICBkaWFsb2dPcGVuLnZhbHVlID0gZmFsc2U7XG4gIGVtaXRzKFwiY2xvc2VcIiwgZ2V0U2NvcGVDb250ZXh0KCkpO1xufVxuZnVuY3Rpb24gb25PcGVuKCkge1xuICBkaWFsb2dPcGVuLnZhbHVlID0gdHJ1ZTtcbn1cblxuY29uc3QgeyBjcnVkUmVmLCBjcnVkQmluZGluZywgY3J1ZEV4cG9zZSB9ID0gdXNlRnNSZWYoKTtcblxuZnVuY3Rpb24gaW5pdFNlbGVjdGVkS2V5cyhtb2RlbFZhbHVlOiBhbnkpIHtcbiAgaWYgKG1vZGVsVmFsdWUgPT0gbnVsbCB8fCAoQXJyYXkuaXNBcnJheShtb2RlbFZhbHVlKSAmJiBtb2RlbFZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHNlbGVjdGVkUm93S2V5cy52YWx1ZSA9IFtdO1xuICB9IGVsc2Uge1xuICAgIGlmIChwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgc2VsZWN0ZWRSb3dLZXlzLnZhbHVlID0gbW9kZWxWYWx1ZSB8fCBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0ZWRSb3dLZXlzLnZhbHVlID0gW21vZGVsVmFsdWVdO1xuICAgIH1cbiAgICBpZiAocHJvcHMudmFsdWVUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBzZWxlY3RlZFJvd0tleXMudmFsdWUgPSBzZWxlY3RlZFJvd0tleXMudmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9wcy5kaWN0LmdldFZhbHVlKGl0ZW0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGZvcm1XcmFwcGVyUmVmID0gcmVmKCk7XG5jb25zdCBmb3JtV3JhcHBlck9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgd3JhcHBlcjoge31cbiAgfTtcbn0pO1xuXG5jb25zdCBvcGVuVGFibGVTZWxlY3QgPSBhc3luYyAob3Blbk9wdGlvbnM6IHsgY3J1ZE9wdGlvbnM/OiBEeW5hbWljYWxseUNydWRPcHRpb25zOyBjb250ZXh0PzogYW55IH0gPSB7fSkgPT4ge1xuICBpZiAocHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMucmVhZG9ubHkgfHwgcHJvcHMuc2VsZWN0Py5kaXNhYmxlZCB8fCBwcm9wcy5zZWxlY3Q/LnJlYWRvbmx5KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9wcy5kaWN0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCLlv4XpobvphY3nva5kaWN077yM5LiU5b+F6aG76YWN572uZGljdC5nZXROb2Rlc0J5VmFsdWVzXCIpO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgdXNlRnNBc3luYyh7XG4gICAgY3J1ZEJpbmRpbmcsXG4gICAgY3J1ZFJlZixcbiAgICBjcmVhdGVDcnVkT3B0aW9uczogcHJvcHMuY3JlYXRlQ3J1ZE9wdGlvbnMsXG4gICAgY3J1ZE9wdGlvbnNPdmVycmlkZTogYnVpbGRNZXJnZWRDcnVkT3B0aW9ucygpLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIHQsXG4gICAgICB1aSxcbiAgICAgIC4uLm9wZW5PcHRpb25zPy5jb250ZXh0XG4gICAgfSxcbiAgICBjcnVkRXhwb3NlXG4gIH0pO1xuXG4gIGluaXRTZWxlY3RlZEtleXMocHJvcHMubW9kZWxWYWx1ZSk7XG4gIGlmIChwcm9wcy5iZWZvcmVPcGVuKSB7XG4gICAgYXdhaXQgcHJvcHMuYmVmb3JlT3Blbih7XG4gICAgICBjcnVkT3B0aW9uczogb3Blbk9wdGlvbnM/LmNydWRPcHRpb25zLFxuICAgICAgLi4uZ2V0U2NvcGVDb250ZXh0KClcbiAgICB9KTtcbiAgfVxuICBpZiAob3Blbk9wdGlvbnMpIHtcbiAgICByZXQuYXBwZW5kQ3J1ZE9wdGlvbnMob3Blbk9wdGlvbnM/LmNydWRPcHRpb25zKTtcbiAgfVxuICBjb25zdCB3cmFwcGVyT3B0aW9ucyA9IG1lcmdlKFxuICAgIHtcbiAgICAgIHdyYXBwZXI6IHtcbiAgICAgICAgdGl0bGU6IHByb3BzLnZpZXdNb2RlID8gdChcImZzLmV4dGVuZHMudGFibGVTZWxlY3Qudmlld1wiKSA6IHQoXCJmcy5leHRlbmRzLnRhYmxlU2VsZWN0LnNlbGVjdFwiKSxcbiAgICAgICAgd2lkdGg6IFwiODAlXCIsXG4gICAgICAgIGRyYWdnYWJsZTogdHJ1ZSxcbiAgICAgICAgaXM6IHVpLmRpYWxvZy5uYW1lLFxuICAgICAgICBmb290ZXI6IGZhbHNlLFxuICAgICAgICAuLi51aS5mb3JtV3JhcHBlci5idWlsZEluaXRCaW5kKHVpLmRpYWxvZy5uYW1lKSxcbiAgICAgICAgYnV0dG9uczoge1xuICAgICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgICBzaG93OiBmYWxzZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FuY2VsOiB7XG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMuZXh0ZW5kcy50YWJsZVNlbGVjdC5jYW5jZWxcIiksXG4gICAgICAgICAgICBhc3luYyBjbGljaygpIHtcbiAgICAgICAgICAgICAgZm9ybVdyYXBwZXJSZWYudmFsdWUuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9rOiB7XG4gICAgICAgICAgICB0eXBlOiBcInByaW1hcnlcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJmcy5leHRlbmRzLnRhYmxlU2VsZWN0Lm9rXCIpLFxuICAgICAgICAgICAgYXN5bmMgY2xpY2soKSB7XG4gICAgICAgICAgICAgIGF3YWl0IG9uT2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIHdyYXBwZXI6IHByb3BzLmRpYWxvZ1xuICAgIH1cbiAgKTtcbiAgZm9ybVdyYXBwZXJSZWYudmFsdWUub3Blbih3cmFwcGVyT3B0aW9ucyk7XG5cbiAgYXdhaXQgbmV4dFRpY2soKTtcbiAgYXdhaXQgY3J1ZEV4cG9zZS5kb1JlZnJlc2goKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbmNvbnN0IGNvbXB1dGVkVmFsdWVzRm9ybWF0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnByb3BzLnZhbHVlc0Zvcm1hdFxuICB9O1xufSk7XG5cbmNvbnN0IGNvbXB1dGVkU2VsZWN0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCB1cGRhdGVLZXkgPSBgb25VcGRhdGU6JHt1aS5zZWxlY3QubW9kZWxWYWx1ZX1gO1xuXG4gIGxldCB2YWx1ZSA9IHByb3BzLm1vZGVsVmFsdWU7XG4gIGlmIChwcm9wcy52YWx1ZVR5cGUgPT09IFwib2JqZWN0XCIgJiYgcHJvcHMubW9kZWxWYWx1ZSkge1xuICAgIGlmIChwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgdmFsdWUgPSBwcm9wcy5tb2RlbFZhbHVlLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9wcy5kaWN0LmdldFZhbHVlKGl0ZW0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gcHJvcHMuZGljdC5nZXRWYWx1ZShwcm9wcy5tb2RlbFZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBbdWkuc2VsZWN0Lm1vZGVsVmFsdWVdOiB2YWx1ZSxcbiAgICBbdXBkYXRlS2V5XTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGVtaXRzKFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgdmFsdWUpO1xuICAgIH0sXG4gICAgW3VpLnNlbGVjdC5jbGVhcmFibGVdOiB0cnVlLFxuICAgIC4uLnVpLnNlbGVjdC5idWlsZE11bHRpQmluZGluZyhwcm9wcy5tdWx0aXBsZSksXG4gICAgc2hvdzogZmFsc2UsXG4gICAgLi4ucHJvcHMuc2VsZWN0XG4gIH07XG59KTtcblxud2F0Y2goXG4gICgpID0+IHtcbiAgICByZXR1cm4gcHJvcHMubW9kZWxWYWx1ZTtcbiAgfSxcbiAgYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBzZWxlY3RlZFJvd0tleXMudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5pdFNlbGVjdGVkS2V5cyh2YWx1ZSk7XG4gICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICBhd2FpdCBwcm9wcy5kaWN0LmFwcGVuZEJ5VmFsdWVzKHNlbGVjdGVkUm93S2V5cy52YWx1ZSk7XG4gICAgLy8gZGljdFNlbGVjdFJlZi52YWx1ZS5yZWxvYWREaWN0KCk7XG4gIH1cbik7XG5jb25zdCBzZWxlY3RlZFJvd0tleXM6IFJlZjxhbnlbXT4gPSByZWYoW10pO1xuXG5mdW5jdGlvbiBnZXRSb3dLZXkoKSB7XG4gIHJldHVybiBwcm9wcy5yb3dLZXkgfHwgY3J1ZEJpbmRpbmcudmFsdWUudGFibGUucm93S2V5IHx8IFwiaWRcIjtcbn1cbmNvbnN0IHJlZnJlc2hpbmcgPSByZWYoZmFsc2UpO1xuXG5mdW5jdGlvbiBidWlsZE1lcmdlZENydWRPcHRpb25zKCkge1xuICBsZXQgdGFibGVDSSA9IHVpLnRhYmxlO1xuICBpZiAoY3J1ZEJpbmRpbmcudmFsdWU/LnRhYmxlPy50YWJsZVZlcnNpb24gPT09IFwidjJcIikge1xuICAgIHRhYmxlQ0kgPSB1aS50YWJsZVYyO1xuICB9XG4gIGxldCBzZWxlY3Rpb25PcHRpb25zID0gdGFibGVDSS5idWlsZFNlbGVjdGlvbkNydWRPcHRpb25zKHtcbiAgICBjcm9zc1BhZ2U6IHByb3BzLmNyb3NzUGFnZSxcbiAgICBzZWxlY3RPbkNsaWNrUm93OiB0cnVlLFxuICAgIGdldFJvd0tleSxcbiAgICBnZXRQYWdlRGF0YSgpIHtcbiAgICAgIHJldHVybiBjcnVkQmluZGluZy52YWx1ZS5kYXRhO1xuICAgIH0sXG4gICAgdXNlQ29tcHV0ZTogdXNlQ29tcHV0ZSxcbiAgICBtdWx0aXBsZTogcHJvcHMubXVsdGlwbGUsXG4gICAgc2VsZWN0ZWRSb3dLZXlzLFxuICAgIG9uU2VsZWN0ZWRLZXlzQ2hhbmdlZDogYXN5bmMgKGNoYW5nZWQpID0+IHtcbiAgICAgIHNlbGVjdGVkUm93S2V5cy52YWx1ZSA9IFsuLi5jaGFuZ2VkXTtcbiAgICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgICBhd2FpdCBwcm9wcy5kaWN0LmFwcGVuZEJ5VmFsdWVzKHNlbGVjdGVkUm93S2V5cy52YWx1ZSk7XG4gICAgICAvLyBpZiAodmFsdWVzRm9ybWF0UmVmLnZhbHVlKSB7XG4gICAgICAvLyAgIHZhbHVlc0Zvcm1hdFJlZi52YWx1ZS5yZWxvYWREaWN0KCk7XG4gICAgICAvLyB9XG4gICAgfVxuICB9KTtcbiAgY29uc3QgY3J1ZE9wdGlvbnMgPSB7XG4gICAgdGFibGU6IHtcbiAgICAgIGFzeW5jIG9uUmVmcmVzaGVkKCkge1xuICAgICAgICBpZiAodGFibGVDSS5zZXRTZWxlY3RlZFJvd3MpIHtcbiAgICAgICAgICByZWZyZXNoaW5nLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgICAgICAgY29uc3QgYmFzZVRhYmxlUmVmID0gY3J1ZEV4cG9zZS5nZXRCYXNlVGFibGVSZWYoKTtcbiAgICAgICAgICB0YWJsZUNJLnNldFNlbGVjdGVkUm93cyh7XG4gICAgICAgICAgICBnZXRSb3dLZXksXG4gICAgICAgICAgICBtdWx0aXBsZTogcHJvcHMubXVsdGlwbGUsXG4gICAgICAgICAgICB0YWJsZVJlZjogYmFzZVRhYmxlUmVmLFxuICAgICAgICAgICAgc2VsZWN0ZWRSb3dLZXlzXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVmcmVzaGluZy52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gbWVyZ2UoY3J1ZE9wdGlvbnMsIHNlbGVjdGlvbk9wdGlvbnMsIHByb3BzLmNydWRPcHRpb25zT3ZlcnJpZGUpO1xufVxuXG5jb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuXG5hc3luYyBmdW5jdGlvbiBvbk9rKCkge1xuICBpZiAocHJvcHMuZGljdC5sb2FkaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCB2YWx1ZSA9IG51bGw7XG4gIGxldCByb3dzID0gbnVsbDtcbiAgaWYgKHNlbGVjdGVkUm93S2V5cy52YWx1ZT8ubGVuZ3RoID4gMCkge1xuICAgIHZhbHVlID0gWy4uLnNlbGVjdGVkUm93S2V5cy52YWx1ZV07XG5cbiAgICByb3dzID0gdmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuZGljdC5nZXREaWN0TWFwKClbaXRlbV07XG4gICAgfSk7XG4gICAgaWYgKHByb3BzLnZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdmFsdWUgPSByb3dzO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5tdWx0aXBsZSAhPT0gdHJ1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlWzBdO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcHJvcHMudmlld01vZGUgfHwgcHJvcHMuZW1pdE9uVmlld01vZGVsKSB7XG4gICAgLy/pnZ52aWV35qih5byP5LiL77yM6ZyA6KaB5pu05pawdmFsdWVcbiAgICBlbWl0cyhcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICBlbWl0cyhcImNoYW5nZVwiLCB2YWx1ZSk7XG4gICAgZW1pdHMoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgcm93cyk7XG4gIH1cbiAgbGV0IHNjb3BlID0ge1xuICAgIHZhbHVlLFxuICAgIHJvd3MsXG4gICAgc2VsZWN0ZWRSb3dLZXlzOiBzZWxlY3RlZFJvd0tleXMudmFsdWVcbiAgfTtcbiAgZW1pdHMoXCJkaWFsb2ctY2xvc2VcIiwgc2NvcGUpO1xuICBhd2FpdCBuZXh0VGljaygpO1xuICBhd2FpdCBmb3JtV3JhcHBlclJlZi52YWx1ZS5jbG9zZSgpO1xuICBlbWl0cyhcImRpYWxvZy1jbG9zZWRcIiwgc2NvcGUpO1xufVxuXG5jb25zdCBnZXRTY29wZUNvbnRleHQgPSAoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgb3BlbmVkOiBkaWFsb2dPcGVuLFxuICAgIG9wZW46IG9wZW5UYWJsZVNlbGVjdCxcbiAgICBzZWxlY3RlZFJvd0tleXMsXG4gICAgZGljdFNlbGVjdFJlZixcbiAgICB2YWx1ZXNGb3JtYXRSZWYsXG4gICAgY3J1ZFJlZixcbiAgICBjcnVkQmluZGluZyxcbiAgICBjcnVkRXhwb3NlXG4gIH07XG59O1xuXG5jb25zdCBzY29wZVJlZiA9IHJlZihnZXRTY29wZUNvbnRleHQoKSk7XG5kZWZpbmVFeHBvc2Uoc2NvcGVSZWYudmFsdWUpO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy10YWJsZS1zZWxlY3Qge1xuICB3aWR0aDogMTAwJTtcbiAgLmVsLWRpYWxvZ19fYm9keSB7XG4gICAgcGFkZGluZy10b3A6IDA7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG4gIH1cbn1cbi5mcy10YWJsZS1zZWxlY3QtY3VycmVudCB7XG4gIC8vYm9yZGVyOiAxcHggc29saWQgI2VlZTtcbiAgLy9ib3JkZXItcmFkaXVzOiAzcHg7XG4gIHBhZGRpbmc6IDEwcHggMDtcbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IGFzIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi8gX19NQUNST1NfZGVmaW5lQ29tcG9uZW50KHtcbiAgLyoqXG4gICAqIOWPr+e8lui+kemAieaLqeWZqFxuICAgKi9cbiAgbmFtZTogXCJGc0VkaXRhYmxlU2VsZWN0XCJcbn0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1lZGl0YWJsZS1zZWxlY3RcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2VsZWN0XCI+XG4gICAgICA8ZnMtZGljdC1zZWxlY3QgOnZhbHVlPVwibW9kZWxWYWx1ZVwiIDpkaWN0PVwiZGljdFwiIHYtYmluZD1cImRpY3RTZWxlY3RcIiBAdXBkYXRlOnZhbHVlPVwiZG9VcGRhdGVcIj48L2ZzLWRpY3Qtc2VsZWN0PlxuICAgIDwvZGl2PlxuXG4gICAgPGZzLXRhYmxlLXNlbGVjdFxuICAgICAgY2xhc3M9XCJ0YWJsZS1zZWxlY3RcIlxuICAgICAgOm1vZGVsLXZhbHVlPVwibW9kZWxWYWx1ZVwiXG4gICAgICA6ZGljdD1cImRpY3RcIlxuICAgICAgOmRlc3Ryb3ktb24tY2xvc2U9XCJmYWxzZVwiXG4gICAgICBoZWlnaHQ9XCI0MDBweFwiXG4gICAgICB2LWJpbmQ9XCJ0YWJsZVNlbGVjdFwiXG4gICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwiZG9VcGRhdGVcIlxuICAgICAgQGRpYWxvZy1jbG9zZWQ9XCJkb1JlZnJlc2hcIlxuICAgID5cbiAgICAgIDx0ZW1wbGF0ZSAjZGVmYXVsdD1cInNjb3BlXCI+XG4gICAgICAgIDxmcy1idXR0b24gdHlwZT1cInByaW1hcnlcIiBpY29uPVwiYW50LWRlc2lnbjplZGl0LW91dGxpbmVkXCIgdi1iaW5kPVwiYnV0dG9uXCIgQGNsaWNrPVwic2NvcGUub3BlblwiPjwvZnMtYnV0dG9uPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2ZzLXRhYmxlLXNlbGVjdD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XG4gIC8qKlxuICAgKiDlgLxcbiAgICovXG4gIG1vZGVsVmFsdWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiDmlbDmja7lrZflhbhcbiAgICovXG4gIGRpY3Q6IGFueTtcbiAgLyoqXG4gICAqIHRhYmxlLXNlbGVjdOWPguaVsFxuICAgKi9cbiAgdGFibGVTZWxlY3Q6IGFueTtcbiAgLyoqXG4gICAqIGRpY3Qtc2VsZWN05Y+C5pWwXG4gICAqL1xuICBkaWN0U2VsZWN0PzogYW55O1xuICAvKipcbiAgICog5oyJ6ZKu5Y+C5pWwXG4gICAqL1xuICBidXR0b24/OiBhbnk7XG59PigpO1xuXG47XG5cbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0cyhbXG4gIC8qKlxuICAgKiDlhbPpl63lr7nor53moYbml7bop6blj5FcbiAgICovXG4gIFwicmVmcmVzaFwiLFxuICBcInVwZGF0ZTptb2RlbFZhbHVlXCJcbl0pO1xuZnVuY3Rpb24gZG9SZWZyZXNoKCkge1xuICBlbWl0KFwicmVmcmVzaFwiKTtcbiAgcHJvcHMuZGljdD8ucmVsb2FkRGljdCgpO1xufVxuXG5mdW5jdGlvbiBkb1VwZGF0ZSh2YWx1ZTogYW55KSB7XG4gIGVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCB2YWx1ZSk7XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtZWRpdGFibGUtc2VsZWN0IHtcbiAgZGlzcGxheTogZmxleDtcblxuICAuc2VsZWN0IHtcbiAgICBmbGV4OiAxO1xuICB9XG4gIC50YWJsZS1zZWxlY3Qge1xuICAgIGZsZXg6IDA7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsbnVsbF0sIm5hbWVzIjpbImdldENhbGxlckluZm8iLCJfYSIsImJsYW5rIiwiYXJncyIsImxvZ0luZm8iLCJsb2dXYXJuIiwibG9nRXJyb3IiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwiZGVidWciLCJjYWxsZXJJbmZvIiwibG9nIiwiY2FsbGVyIiwibG9nZ2VyIiwic2V0TG9nZ2VyIiwib3B0cyIsImxldmVsIiwiaXNFbXB0eSIsInZhbHVlIiwiaXNBbGxFbXB0eSIsInZhbHVlcyIsImhhc0VtcHR5IiwiU3RyaW5nVXRpbHMiLCJ0cmFjZSIsIm5hbWUiLCJlbmFibGUiLCJjcmVhdGVBc3luY0NvbXBvbmVudCIsImVzIiwiZGVmaW5lQXN5bmNDb21wb25lbnQiLCJyZXRyeSIsImZhaWwiLCJhdHRlbXB0cyIsImluc3RhbGxBc3luY0NvbXBvbmVudCIsImFwcCIsIm9wdGlvbnMiLCJhc3luY0NvbXBvbmVudCIsImluc3RhbGxBc3luY0NvbXBvbmVudHMiLCJtb2R1bGVzIiwiZXhjbHVkZXMiLCJwaWNrTmFtZUV4cCIsInRyYW5zZm9ybSIsImltcG9ydHMiLCJ0cmFuc2Zvcm1Gcm9tR2xvYiIsImZvckVhY2giLCJpdGVtIiwia2V5IiwiaW5zdGFsbFN5bmNDb21wb25lbnRzIiwiY29tcG9uZW50cyIsInJlc3VsdCIsImNhbWVsQ2FzZSIsInVwcGVyRmlyc3QiLCJsb2FkQXN5bmNDb21wb25lbnRGcm9tR2xvYiIsIm1hcCIsImxvYWRDb21wb25lbnRGcm9tR2xvYiIsInZpdGUiLCJUYWJsZVN0b3JlIiwiX19wdWJsaWNGaWVsZCIsInRhYmxlTmFtZSIsInByZWZpeCIsInRhYmxlSWQiLCJzYXZlZCIsInRhYmxlIiwiJHJvdXRlIiwia2V5VHlwZSIsInJ4QXJySW5kZXgiLCJyeFZhck5hbWUiLCJyeFF1b3QiLCJqb2luUGF0aHMiLCJwYXRocyIsImFjYyIsInAiLCJnZXRQYXRoVG9TdHJpbmciLCJfIiwicGF0aFRvU3RyaW5nIiwicGF0aCIsInByZWZpeGVzIiwidHlwZSIsImhhcyIsImlzT2JqZWN0IiwiZ2V0SXRlcmF0ZSIsIml0ZXJhdGUiLCJvYmoiLCJjYWxsYmFjayIsImJyb2tlbiIsImJyZWFrSXQiLCJkZXNjcmliZVZhbHVlIiwicGFyZW50IiwiY3AiLCJpIiwiY2hpbGRyZW4iLCJjb250ZXh0UmVhZGVyIiwiQ29udGV4dFJlYWRlciIsImVyciIsInNjcCIsImdldEVsZW1lbnRzIiwiZ2V0T3duQ2hpbGRyZW4iLCJjaGlsZHJlblBhdGgiLCJzdHJDaGlsZHJlblBhdGgiLCJzdHJDaGlsZFBhdGhQcmVmaXgiLCJyZXMiLCJ2YWwiLCJzdHJDaGlsZFBhdGgiLCJwYXRoRm9ybWF0U3RyaW5nIiwiY2hpbGRLZXkiLCJhZnRlckl0ZXJhdGUiLCJjdXJQYXJlbnQiLCJpc09iamVjdEVtcHR5Iiwib3duUHJvcGVydGllc09ubHkiLCJnZXRFYWNoRGVlcCIsImVhY2hEZWVwIiwiaWRlbnRpdHkiLCJtZXJnZSIsImlzU3RyaW5nIiwidG9QYXRoIiwiZm9yRWFjaERlZXAiLCJkZWVwZGFzaCIsImRhc2giLCJyZWYiLCJza2lwcyIsImtleXMiLCJwQXR0cnMiLCJjb3B5VG9DbGlwYm9hcmRUcmFkaXRpb25hbCIsInRleHQiLCJ0ZXh0QXJlYSIsInN1Y2Nlc3NmdWwiLCJjb3B5VG9DbGlwYm9hcmQiLCJyZWFkRnJvbUNsaXBib2FyZFRyYWRpdGlvbmFsIiwicmVzb2x2ZSIsInJlamVjdCIsInJlYWRUb0NsaXBib2FyZCIsIm1lbW9yeUNsaXBib2FyZCIsInJlYWN0aXZlIiwiY29weVRvTWVtb3J5IiwicmVhZFRvTWVtb3J5IiwiY2xlYXJNZW1vcnlDbGlwYm9hcmQiLCJ1dGlscyIsInN0cmluZ3MiLCJzdG9yZSIsImNsaXBib2FyZCIsImRlZmF1bHRDcnVkT3B0aW9ucyIsImN0eCIsImNydWRPcHRpb25zUmVmIiwiY3QiLCJjb21wdXRlZCIsInVpIiwidWlDb250ZXh0IiwidHJpZ2dlciIsImZvcm0iLCJfYiIsImNsaXBib2FyZERhdGEiLCJlIiwiZG9DbG9zZSIsInJlc2V0Iiwic3VibWl0IiwidG90YWwiLCJhbnRkdkNvbHNwYW4iLCJsYWJlbFNwYW4iLCJhc3Npc3QiLCJ1c2VVaSIsImJ1dHRvbiIsImNhc2NhZGVyIiwiemhDTiIsImVuIiwidCIsImdldCIsImFyZyIsImluZGV4IiwiSTE4biIsImluc3RhbmNlIiwibG9jYWxlcyIsIm1lc3NhZ2UiLCJmc0Nsb25lIiwiY2xvbmVEZWVwIiwiaTE4biIsInVzZUkxOG4iLCJtb2R1bGUiLCJ0aGlzIiwibiIsInIiLCJzIiwiYSIsImRheWpzIiwiYWR2YW5jZWRGb3JtYXQiLCJkb0Zvcm1hdCIsImRhdGUiLCJmb3JtYXQiLCJkYXRlRm9ybWF0dGVyIiwiZGF0ZXJhbmdlRm9ybWF0dGVyIiwiZGF0ZXRpbWVyYW5nZUZvcm1hdHRlciIsImYiLCJvIiwidSIsImQiLCJ3ZWVrZGF5IiwibG9jYWxlRGF0YSIsIndlZWtPZlllYXIiLCJkYXRlJDEiLCJidWlsZERhdGVWYWx1ZSIsInNjb3BlIiwicm93IiwiZWwiLCJpY29uIiwibnVtYmVyJDEiLCJwaG9uZSIsImNvbHVtbiIsInJldCIsInNlbGVjdCIsInRyZWUiLCJ0eXBlTGlzdCIsImRlZmF1bHRUeXBlQ3JlYXRvcnMiLCJkZWZhdWx0VHlwZXMiLCJnZXRUeXBlcyIsImdldFR5cGUiLCJhZGRUeXBlcyIsIm5ld1R5cGVzIiwidHlwZXMkMSIsImNyZWF0b3IiLCJfc2ZjX21haW4kRCIsImRlZmluZUNvbXBvbmVudCIsInBhZ2VSZWYiLCJvbk1vdW50ZWQiLCJfaG9pc3RlZF8xIiwiX2hvaXN0ZWRfMiIsIl9ob2lzdGVkXzQiLCIkc2xvdHMiLCJfY3R4IiwiX2NhY2hlIiwiJHByb3BzIiwiJHNldHVwIiwiJGRhdGEiLCIkb3B0aW9ucyIsIl9vcGVuQmxvY2siLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwiX2NyZWF0ZUNvbW1lbnRWTm9kZSIsIl9jcmVhdGVFbGVtZW50Vk5vZGUiLCJfaG9pc3RlZF8zIiwiaXNVbk1lcmdlYWJsZSIsInNyY1ZhbHVlIiwiVW5NZXJnZWFibGUiLCJpc1JlZiIsImlzU2hhbGxvdyIsImlzVW5DbG9uZWFibGUiLCJ0YXJnZXQiLCJzb3VyY2VzIiwiY3VzdG9taXplciIsIm9ialZhbHVlIiwiaXNBcnJheSIsImZvdW5kIiwibWVyZ2VXaXRoIiwiY2xvbmVEZWVwV2l0aCIsIlVuTWVyZ2VhYmxlJDEiLCJjbG9uZWFibGUiLCJ1c2VNZXJnZSIsImlzQXN5bmNDb21wdXRlIiwiQXN5bmNDb21wdXRlVmFsdWUiLCJpc1N5bmNDb21wdXRlIiwiQ29tcHV0ZVZhbHVlIiwiZmluZENvbXB1dGVWYWx1ZXMiLCJpc0FzeW5jIiwiZm91bmRNYXAiLCJjaGVja0Z1bmMiLCJjb250ZXh0IiwiZXhjbHVkZSIsImRvQXN5bmNDb21wdXRlIiwiZGVwZW5kQXN5bmNWYWx1ZXMiLCJnZXRDb250ZXh0Rm4iLCJhc3luY1ZhbHVlTWFwIiwic2V0QXN5bmNDb21wdXRlVmFsdWUiLCJhc3luY1ZhbHVlc01hcCIsInZhbHVlUmVmIiwic2V0IiwiZG9Db21wdXRlZCIsImdldFRhcmdldEZ1bmMiLCJ1c2VyQ29tcHV0ZWRGbiIsImRlcGVuZFZhbHVlcyIsImFzeW5jQ291bnQiLCJzeW5jQ291bnQiLCJjb21wdXRlRm4iLCJjb21wdXRlIiwiYXN5bmNGbiIsImRlZmF1bHRWYWx1ZSIsImFzeW5jUmVmIiwiY29tcHV0ZWRWYWx1ZSIsIndhdGNoIiwiYXN5bmNDb21wdXRlIiwidXNlQ29tcHV0ZSIsIkNvbnN0YW50cyIsIm1lcmdlQ29sdW1uUGx1Z2lucyIsInJlZ2lzdGVyTWVyZ2VDb2x1bW5QbHVnaW4iLCJwbHVnaW4iLCJyZW1vdmUiLCJwdXNoIiwic29ydCIsImIiLCJvcmRlciIsIm1lcmdlQ29sdW1uRGljdCIsImRpY3QiLCJjb21wb25lbnQiLCJzaGFsbG93UmVhY3RpdmUiLCJtZXJnZUNvbHVtblR5cGUiLCJ0eXBlQ2hhaW4iLCJBcnJheSIsImJhc2UiLCJ0eXBlT3B0aW9ucyIsInR5cGVzIiwibWVyZ2VQbHVnaW5zIiwiaGFuZGxlIiwiY29sdW1uUHJvcHMiLCJjcnVkT3B0aW9ucyIsInNldHRpbmdzIiwidmlld0Zvcm1Vc2VDZWxsQ29tcG9uZW50Iiwidmlld0Zvcm1Db2x1bW4iLCJpbmNsdWRlcyIsInJlbmRlciIsIl9jcmVhdGVWTm9kZSIsInZpZXdGb3JtIiwiYWRkRm9ybSIsInJ1bGVzIiwicnVsZSIsImVkaXRGb3JtIiwic2VhcmNoIiwibWVyZ2VQbHVnaW4iLCJzZXR1cE9wdGlvbnNDb2x1bW5zIiwiY29sdW1ucyIsInVzZXJPcHRpb25zIiwiaW5pdGVkQ29sdW1ucyIsImJ1aWxkT3B0aW9uc0NvbHVtbnNGbGF0TWFwIiwiYnVpbGRUYWJsZUNvbHVtbnNGbGF0TWFwIiwiYnVpbGRUYWJsZUNvbHVtbiIsImNvbFRlbXBsYXRlIiwidGFibGVDb2x1bW4iLCJ0aXRsZSIsImJ1aWxkVGFibGVDb2x1bW5zIiwid3JhcHBlckN1c3RvbUNvbXBvbmVudCIsInNoYWxsb3dSZWYiLCJ0YWJsZUNvbHVtbnMiLCJkb0NvbHVtbnNTb3J0IiwiZG9BcnJheVNvcnQiLCJhcnIiLCJzb3J0QnkiLCJvcmRlckRlZmF1bHQiLCJsaXN0Iiwic2l6ZSIsImNvbHVtbnNBcnIiLCJjb2x1bW5zTWFwIiwiYnVpbGRGb3JtQ29sdW1ucyIsImNvbHVtbnNGbGF0TWFwIiwiZm9ybVR5cGUiLCJmb3JtQ29sdW1ucyIsImZvcm1Db2x1bW4iLCJidWlsZEZvcm0iLCJiYXNlT3B0aW9ucyIsIm9uQ29tcGxldGUiLCJidWlsZFNlYXJjaEZvcm0iLCJzZWFyY2hDb2x1bW5zIiwiZm9ybUNvbHVtbnNGb3JTZWFyY2giLCJjb3B5UHJvcHMiLCJzZWFyY2hDb3B5Rm9ybVByb3BzIiwiY29weUZyb21Db21wb3NpdGlvbkNvbHVtbiIsImZpZWxkIiwiY29tbW9uIiwiZGVmIiwicGljayIsImJ1aWxkRm9ybU9wdGlvbnMiLCJtb2RlIiwiZGVmYXVsdE9wdGlvbnMiLCJjb21tb25PcHRpb25zIiwiY3J1ZEV4cG9zZSIsImJ1aWxkQ29sdW1ucyIsInRvb2xiYXIiLCJjb2x1bW5zRmlsdGVyIiwib3JpZ2luYWxDb2x1bW5zIiwiZGlzYWJsZWQiLCJlZGl0YWJsZSIsImZvckVhY2hUYWJsZUNvbHVtbnMiLCJmb3JFYWNoQ29sdW1ucyIsInVzZUNvbHVtbnMiLCJzZWVkIiwiRnNGb3JtV3JhcHBlckxpc3QiLCJjcmVhdGVGb3JtV3JhcHBlciIsImlkIiwiY29udGFpbmVyIiwidk5vZGUiLCJjcmVhdGVWTm9kZSIsIkZzRm9ybVdyYXBwZXIiLCJ2bSIsInVzZUZvcm1XcmFwcGVyIiwicGQiLCJpbmplY3QiLCJvcGVuRGlhbG9nIiwib3BlbkNydWRGb3JtRGlhbG9nIiwiZm9ybU9wdGlvbnMiLCJkb01lcmdlIiwidXNlRWRpdGFibGUiLCJwcm9wcyIsImNydWRCaW5kaW5nIiwiX2MiLCJjdXN0b21Sb3dIYW5kbGVBY3RpdmUiLCJfZCIsIl9lIiwib25FbmFibGVkIiwiZWRpdGFibGVPcHRzIiwiZWRpdGFibGVJZCIsImVkaXRhYmxlUm93IiwiaXNBZGQiLCJzZXREYXRhIiwicm93RGF0YSIsImRhdGEiLCJ1c2VFeHBvc2UiLCJjcnVkUmVmIiwiZm9ybVdyYXBwZXJQcm92aWRlciIsImNoZWNrQ3J1ZFJlZiIsImNoZWNrQ3J1ZEJpbmRpbmdSZWYiLCJmb3JtV3JhcHBlclJlZiIsImZvcm1SZWYiLCJyZWNvcmRzIiwidG9SYXciLCJ2YWx1ZUJ1aWxkZXJDb2x1bW5zIiwiY29sIiwicGFnZVF1ZXJ5IiwicGFnZSIsInNlYXJjaEZvcm1EYXRhIiwicXVlcnkiLCJ1c2VyUGFnZVF1ZXJ5IiwidXNlclBhZ2VSZXMiLCJkaXNhYmxlTG9hZGluZyIsInVucmVmIiwicGFnZVJlcyIsImN1cnJlbnRQYWdlIiwicGFnZVNpemUiLCJmc1RhYmxlUmVmIiwibm8iLCJ0YWJsZVJlZiIsInJvd0tleSIsInJlbW92ZUJpbmRpbmciLCJpc0xvY2FsIiwicmVtb3ZlU2NvcGUiLCJmb3JtT3B0cyIsInh4Rm9ybSIsImxvYWRGc0V4cG9ydFV0aWwiLCJlYWNoIiwibG9hZEZzSW1wb3J0VXRpbCIsImRlZmF1bHREYXRhRm9ybWF0dGVyIiwib3JpZ2luYWxSb3ciLCJub2RlcyIsImxhYmVsIiwibm9kZSIsImV4cG9ydFRhYmxlIiwiZXhwb3J0Q29sIiwiZXhwb3J0VXRpbCIsIm9yaWdpbmFsRGF0YSIsInNlYXJjaFBhcmFtcyIsImNsb25lIiwibWFwcGluZyIsImV4cE9wdHMiLCJpbXBvcnRUYWJsZSIsImltcG9ydERhdGEiLCJpc0VkaXRhYmxlIiwiY3J1ZE9wdGlvbnNQbHVnaW5zIiwicmVnaXN0ZXJDcnVkT3B0aW9uc1BsdWdpbiIsImdldENydWRPcHRpb25zUGx1Z2luIiwic2VsZWN0aW9uIiwiZ2V0Um93S2V5IiwidGFibGVDSSIsImNoYW5nZWQiLCJzZWxlY3RlZFJvd0tleXMiLCJuZXh0VGljayIsIm1vYmlsZUFkYXB0b3IiLCJyb3dIYW5kbGUiLCJidXR0b25zIiwibmV3QnV0dG9ucyIsImJ1dHRvbnNLZXkiLCJ3aWR0aFJlZiIsInVzZUNydWQiLCJleHBvc2UiLCJkb1JlZnJlc2giLCJkb1ZhbHVlUmVzb2x2ZSIsInVzZVBhZ2luYXRpb24iLCJjdXJyZW50IiwidXNlRm9ybVN1Ym1pdCIsInVzZVJvd0hhbmRsZSIsInVzZVNlYXJjaCIsImJhc2VUYWJsZVJlZiIsInVzZVRhYnMiLCJmb3JtRGF0YSIsInVzZVRvb2xiYXIiLCJleHBvcnRpbmciLCJvcmlnaW5hbCIsInVwZGF0ZUNvbHVtbnMiLCJvbGQiLCJvbGRDb2x1bW4iLCJuZXdDb2x1bW4iLCJuZXdDb2x1bW5zIiwidXNlVGFibGUiLCJzb3J0Q2hhbmdlIiwiaXNTZXJ2ZXJTb3J0IiwicHJvcCIsImFzYyIsIm9sZFNvcnQiLCJ1c2VBY3Rpb25iYXIiLCJhY3RpdmVSb3dzIiwiYWZ0ZXJVc2VDcnVkIiwiYmluZGluZ3MiLCJyZWJ1aWxkQ3J1ZEJpbmRpbmdzIiwiaW5wdXRPcHRzIiwidXNlck9wdHMiLCJwbHVnaW5zIiwicGx1ZyIsImJlZm9yZSIsInBsdWdpbk9wdGlvbnMiLCJyZXNldENydWRPcHRpb25zIiwiYXBwZW5kQ3J1ZE9wdGlvbnMiLCJvdmVyT3B0aW9ucyIsIm5ld09wdGlvbnMiLCJhcHBlbmRDcnVkQmluZGluZyIsInVzZUZzSW1wbCIsImNyZWF0ZUNydWRPcHRpb25zIiwiY3J1ZEV4cG9zZVJlZiIsImNyZWF0ZUNydWRPcHRpb25zUmV0IiwiaW5pdENydWQiLCJ1c2VDcnVkUHJvcHMiLCJ1c2VDcnVkUmV0IiwidXNlRnMiLCJ1c2VGc0FzeW5jIiwidXNlRnNSZWYiLCJ1c2VEaWN0Iiwidk1vZGVsIiwiY3JlYXRlQ29tcHV0ZWRPcHRpb25zIiwib3B0aW9uIiwiZ2V0VmFsdWUiLCJnZXRMYWJlbCIsImdldERpY3QiLCJnZXRTY29wZSIsImdldEN1cnJlbnRTY29wZSIsInByb3h5IiwiZ2V0Q3VycmVudEluc3RhbmNlIiwibG9hZERpY3QiLCJyZWxvYWQiLCJyZWxvYWREaWN0IiwiY2xlYXJEaWN0Iiwid2F0Y2hWYWx1ZSIsImdldERpY3REYXRhIiwiZ2V0UHJvcFZhbHVlIiwiYXR0ciIsInJlbW92ZVByb3BWYWx1ZSIsImdldENoaWxkcmVuIiwicGVyZiIsIndhcm5lZCIsIlBST0NFU1MiLCJlbWl0V2FybmluZyIsIm1zZyIsImNvZGUiLCJmbiIsIkFDIiwiQVMiLCJ3YXJuQUNQb2x5ZmlsbCIsInJlYXNvbiIsInByaW50QUNQb2x5ZmlsbFdhcm5pbmciLCJzaG91bGRXYXJuIiwiaXNQb3NJbnQiLCJnZXRVaW50QXJyYXkiLCJtYXgiLCJaZXJvQXJyYXkiLCJfU3RhY2siLCJIZWFwQ2xzIiwiX19wcml2YXRlR2V0IiwiX2NvbnN0cnVjdGluZyIsIl9fcHJpdmF0ZVNldCIsIl9fcHJpdmF0ZUFkZCIsIlN0YWNrIiwiX0xSVUNhY2hlIiwiX2luaXRpYWxpemVUVExUcmFja2luZyIsIl9pbml0aWFsaXplU2l6ZVRyYWNraW5nIiwiX2luZGV4ZXMiLCJfcmluZGV4ZXMiLCJfaXNWYWxpZEluZGV4IiwiX2V2aWN0IiwiX2JhY2tncm91bmRGZXRjaCIsIl9pc0JhY2tncm91bmRGZXRjaCIsIl9jb25uZWN0IiwiX21vdmVUb1RhaWwiLCJfZGVsZXRlIiwiX2NsZWFyIiwiX21heCIsIl9tYXhTaXplIiwiX2Rpc3Bvc2UiLCJfZGlzcG9zZUFmdGVyIiwiX2ZldGNoTWV0aG9kIiwiX21lbW9NZXRob2QiLCJfc2l6ZSIsIl9jYWxjdWxhdGVkU2l6ZSIsIl9rZXlNYXAiLCJfa2V5TGlzdCIsIl92YWxMaXN0IiwiX25leHQiLCJfcHJldiIsIl9oZWFkIiwiX3RhaWwiLCJfZnJlZSIsIl9kaXNwb3NlZCIsIl9zaXplcyIsIl9zdGFydHMiLCJfdHRscyIsIl9oYXNEaXNwb3NlIiwiX2hhc0ZldGNoTWV0aG9kIiwiX2hhc0Rpc3Bvc2VBZnRlciIsIl91cGRhdGVJdGVtQWdlIiwiX3N0YXR1c1RUTCIsIl9zZXRJdGVtVFRMIiwiX2lzU3RhbGUiLCJfcmVtb3ZlSXRlbVNpemUiLCJfaSIsIl9hZGRJdGVtU2l6ZSIsIl9zIiwiX3N0IiwiX3JlcXVpcmVTaXplIiwiX2siLCJfdiIsInNpemVDYWxjdWxhdGlvbiIsInR0bCIsInR0bFJlc29sdXRpb24iLCJ0dGxBdXRvcHVyZ2UiLCJ1cGRhdGVBZ2VPbkdldCIsInVwZGF0ZUFnZU9uSGFzIiwiYWxsb3dTdGFsZSIsImRpc3Bvc2UiLCJkaXNwb3NlQWZ0ZXIiLCJub0Rpc3Bvc2VPblNldCIsIm5vVXBkYXRlVFRMIiwibWF4U2l6ZSIsIm1heEVudHJ5U2l6ZSIsImZldGNoTWV0aG9kIiwibWVtb01ldGhvZCIsIm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiIsIm5vRGVsZXRlT25TdGFsZUdldCIsImFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uIiwiYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCIsImlnbm9yZUZldGNoQWJvcnQiLCJVaW50QXJyYXkiLCJfX3ByaXZhdGVNZXRob2QiLCJpbml0aWFsaXplU2l6ZVRyYWNraW5nX2ZuIiwiaW5pdGlhbGl6ZVRUTFRyYWNraW5nX2ZuIiwiYyIsImlzQmFja2dyb3VuZEZldGNoX2ZuIiwiayIsImJhY2tncm91bmRGZXRjaF9mbiIsIm1vdmVUb1RhaWxfZm4iLCJpbmRleGVzX2ZuIiwicmluZGV4ZXNfZm4iLCJnZXRPcHRpb25zIiwidiIsInRoaXNwIiwiZGVsZXRlZCIsImRlbGV0ZV9mbiIsImVudHJ5Iiwic3RhcnQiLCJyZW1haW4iLCJhZ2UiLCJzZXRPcHRpb25zIiwic3RhdHVzIiwiZXZpY3RfZm4iLCJfX3ByaXZhdGVXcmFwcGVyIiwib2xkVmFsIiwib2xkVmFsdWUiLCJkdCIsInRhc2siLCJoYXNPcHRpb25zIiwicGVla09wdGlvbnMiLCJmZXRjaE9wdGlvbnMiLCJmb3JjZVJlZnJlc2giLCJzaWduYWwiLCJzdGFsZSIsImlzU3RhbGUiLCJzdGFsZVZhbCIsIm1lbW9PcHRpb25zIiwidnYiLCJmZXRjaGluZyIsImNsZWFyX2ZuIiwidHRscyIsInN0YXJ0cyIsImNhY2hlZE5vdyIsImdldE5vdyIsInNpemVzIiwiaXNWYWxpZEluZGV4X2ZuIiwiZnJlZSIsImhlYWQiLCJhYyIsImZldGNoT3B0cyIsImNiIiwidXBkYXRlQ2FjaGUiLCJhYm9ydGVkIiwiaWdub3JlQWJvcnQiLCJmZXRjaEZhaWwiLCJiZiIsImViIiwiZXIiLCJhbGxvd1N0YWxlQWJvcnRlZCIsIm5vRGVsZXRlIiwicGNhbGwiLCJyZWoiLCJmbXAiLCJjb25uZWN0X2ZuIiwicGkiLCJuaSIsIkxSVUNhY2hlIiwiRGljdEdsb2JhbENhY2hlIiwic2V0RGljdFJlcXVlc3QiLCJyZXF1ZXN0IiwiZGljdFJlcXVlc3QiLCJEaWN0IiwiY2FjaGVLZXkiLCJjYWNoZWQiLCJjYWxsIiwibm90aWZ5IiwidG9GZXRjaFZhbHVlcyIsImdldEZyb21SZW1vdGUiLCJ1cmwiLCJtYXliZUFyciIsImRpY3REYXRhIiwiY29uZmlnIiwidXNlRGljdERlZmluZSIsInVzZVR5cGVzIiwiZHJhZ01vZGFsRm9yQW50ZHYiLCJkaWFsb2dFbCIsImRpYWxvZ0hlYWRlckVsIiwiZHJhZ0RvbSIsInN0eSIsIlgiLCJZIiwic3R5TCIsInN0eVQiLCJsIiwiZHJhZ01vZGFsRm9yTmFpdmUiLCJkcmFnTW9kYWwiLCJ1c2VEcmFnIiwiR2xvYmFsQ29uZmlnIiwiX3NmY19tYWluJEMiLCJjb21wdXRlZElubmVyU3R5bGUiLCJjb21wdXRlZEJvZHlTdHlsZSIsIl9zZmNfcmVuZGVyIiwiX25vcm1hbGl6ZVN0eWxlIiwiX3JlbmRlclNsb3QiLCJfc2ZjX21haW4kQiIsIl9jb21wb25lbnRfZnNfY29udGFpbmVyIiwiX3Jlc29sdmVDb21wb25lbnQiLCJfY3JlYXRlQmxvY2siLCJfd2l0aEN0eCIsIl9ob2lzdGVkXzUiLCJfc2ZjX21haW4kQSIsImdldENydWRCaW5kaW5nIiwic2VhcmNoU2hvdyIsImNhcmRDb21wb25lbnROYW1lIiwiX3Jlc29sdmVEeW5hbWljQ29tcG9uZW50IiwiX2lzU2xvdCIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiX2lzVk5vZGUiLCJpbmhlcml0QXR0cnMiLCJTdHJpbmciLCJkZWZhdWx0IiwicmVxdWlyZWQiLCJGdW5jdGlvbiIsImljb25SaWdodCIsImNpcmNsZSIsIkJvb2xlYW4iLCJ0b29sdGlwIiwidW5kZWZpbmVkIiwiYmFkZ2UiLCJidXR0b25Qcm9wcyIsImNsYXNzTmFtZSIsImxvYWRpbmciLCJlbWl0cyIsInNldHVwIiwibG9hZGluZ1JlZiIsImNvbXB1dGVkTG9hZGluZyIsImljb25SZW5kZXIiLCJpY29uQ2xhc3MiLCJfbWVyZ2VQcm9wcyIsInJlbmRlckJ0biIsImlzSWNvblNsb3QiLCJpc0ljb25Qcm9wIiwiaWNvblByb3AiLCJzbG90cyIsImlzQ2lyY2xlIiwiYnV0dG9uQ29tcCIsInJlc29sdmVEeW5hbWljQ29tcG9uZW50Iiwib25DbGljayIsIiRldmVudCIsImVtaXQiLCJidG5Qcm9wcyIsImNsYXNzIiwiYXR0cnMiLCJoIiwib3JpZ2luUmVuZGVyQnRuIiwiYmFkZ2VDb21wIiwiX3Nsb3QiLCJ0b29sdGlwQ29tcCIsImNvbXB1dGVUb29sdGlwUHJvcHMiLCJvbWl0IiwidHJpZ2dlclNsb3ROYW1lIiwicmVxdWlyZSIsImJhc2VVcmwiLCJjb21wdXRlZFJlbmRlckZ1bmMiLCJpbmRleE9mIiwic3RhcnRzV2l0aCIsInJlcGxhY2UiLCJJY29uQ29tcCIsInNwbGl0IiwiY29sb3IiLCJsZW5ndGgiLCJpc0NvbXBvbmVudCIsIl9zZmNfbWFpbiR6IiwiSWNvbiIsIl9ub3JtYWxpemVDbGFzcyIsIl9zZmNfbWFpbiR5Iiwic3ltYm9sSWQiLCJnZXRTdHlsZSIsInNwaW4iLCJfc2ZjX21haW4keCIsImxhYmVsQXR0cnMiLCJfY3JlYXRlVGV4dFZOb2RlIiwiX3RvRGlzcGxheVN0cmluZyIsIl9fZGVmYXVsdF9fIiwiX19NQUNST1NfZGVmaW5lQ29tcG9uZW50IiwiX2NvbXBvbmVudF9mc19pY29uIiwiX3VucmVmIiwiX3NmY19tYWluJHYiLCJtZXJnZUV2ZW50SGFuZGxlcyIsImV2ZW50TmFtZSIsImV2ZW50cyIsImV2ZW50IiwiaHRtbFRhZ3MiLCJtb2RlbFZhbHVlIiwib24iLCJ1bmRlZmluZVRvTnVsbCIsInByb3ZpZGUiLCJ0YXJnZXRSZWYiLCJhbGxBdHRycyIsInRyaW0iLCJudW1iZXIiLCJvblVwZGF0ZU1vZGVsVmFsdWVOYW1lIiwidG1wIiwiTnVtYmVyIiwiaXNOYU4iLCJoYW5kbGVyIiwiY2hpbGRyZW5SZW5kZXIiLCJjcmVhdGVDaGlsZHJlbiIsImNvbXB1dGVkSW5wdXRDb21wIiwiY29uc29sZSIsImlucHV0IiwiaXNBc3luY0NvbXBvbmVudCIsImlucHV0Q29tcCIsInJlc29sdmVDb21wb25lbnQiLCJjaGlsZHJlblJlbmRlcmVkIiwiZ2V0VGFyZ2V0UmVmIiwiZ2V0VGFyZ2V0UmVmQXN5bmMiLCJnZXRUYXJnZXRSZWZTeW5jIiwiUHJvbWlzZSIsImdldFRhcmdldFJlZkRlbGF5IiwiY291bnQiLCJzZXRUaW1lb3V0IiwiRXJyb3IiLCJtZXJnZWQiLCJtZXJnZVByb3BzIiwiZnVuY3Rpb25hbCIsInJlbmRlckZ1bmMiLCJfc2ZjX21haW4kdSIsImNyZWF0ZUluaXRpYWxGb3JtIiwiZGVmVmFsdWUiLCJpbml0aWFsRm9ybSIsInNldEZvcm1EYXRhIiwiZ2V0Q29tcG9uZW50UmVmIiwiY29tcHV0ZWRDb2x1bW5zIiwiZG9WYWx1ZUJ1aWxkZXIiLCJnZXRGb3JtRGF0YSIsInZhbHVlQ2hhbmdlIiwiZG9WYWx1ZUNoYW5nZSIsIm1lcmdlQ29sIiwiYnVpbGRJdGVtU2NvcGUiLCJmb3JtSXRlbVJlZnMiLCJnZXRGb3JtSXRlbVJlZiIsImdyb3VwQWN0aXZlS2V5IiwiZ3JvdXBJdGVtIiwiY29tcHV0ZWRHcm91cCIsImdyb3VwIiwiZ3JvdXBlZEtleXMiLCJ3cmFwcGVyIiwiY29tcHV0ZWREZWZhdWx0Q29sdW1ucyIsImdldEZvcm1SZWYiLCJlbnRyaWVzUmV0IiwiZW50cmllcyIsImluaXRpYWxWYWx1ZSIsInVuc2V0IiwidmFsaWRSZWYiLCJlcnJvcnNSZWYiLCJmaWxsR3JvdXBFcnJvciIsImZpZWxkRXJyb3JzIiwidmFsaWRhdGUiLCJ2YWxpZGF0ZVNjb3BlIiwidmFsaWRhdGVFcnJvcnMiLCJzdWJtaXRTY29wZSIsImZvcm1JdGVtU2hvdyIsImdyb3VwSXRlbVNob3ciLCJuZXdWYWwiLCJpc0RpcnR5IiwiYWZ0ZXIiLCJtZXJnZWRTbG90cyIsImRpc3BsYXkiLCJfRnJhZ21lbnQiLCJfcmVuZGVyTGlzdCIsImhlbHBlciIsImdyb3VwS2V5IiwiX2NyZWF0ZVNsb3RzIiwiX2NvbXBvbmVudF9mc19mb3JtX2l0ZW1fY29sIiwic2xvdE5hbWUiLCJfY29tcG9uZW50X2ZzX3JlbmRlciIsIl9zZmNfbWFpbiR0IiwiRnNSZW5kZXIiLCJjb21wb25lbnRSZW5kZXJSZWYiLCJzY29wZUZ1bmMiLCJ1cGRhdGVNb2RlbFZhbHVlIiwiY29tcHV0ZWRJdGVtIiwiY29tcHV0ZWRIZWxwZXJQb3NpdGlvbiIsImNvbXB1dGVkSGVscGVyVG9vbHRpcCIsImNvbXB1dGVkS2V5IiwiY29tcHV0ZWRMYWJlbCIsImNvbXB1dGVkTGFiZWxJc1JlbmRlciIsIl9jb21wb25lbnRfZnNfY29tcG9uZW50X3JlbmRlciIsIl9ub3JtYWxpemVQcm9wcyIsIl9ob2lzdGVkXzYiLCJmb3JtU2xvdCIsIl9ob2lzdGVkXzciLCJfY29tcG9uZW50X2ZzX3Nsb3RfcmVuZGVyIiwiX2NvbXBvbmVudF9mc19mb3JtX2hlbHBlciIsIl9fcHJvcHMiLCJ1c2VBdHRycyIsImZvcm1JdGVtUmVmIiwiX19leHBvc2UiLCJfY29tcG9uZW50X2ZzX2Zvcm1faXRlbSIsIl9zZmNfbWFpbiRyIiwiaW5uZXIiLCJpbm5lcldyYXBwZXIiLCJ6SW5kZXgiLCJmb3JtV3JhcHBlck9wZW4iLCJmb3JtV3JhcHBlcklzIiwiZm9ybVdyYXBwZXJCaW5kIiwiZm9ybVdyYXBwZXJPcHRzIiwiZW1pdE9uQ2xvc2VkIiwiZW1pdE9uT3BlbmVkIiwiYmVmb3JlQ2xvc2VDdXN0b20iLCJmb3JtV3JhcHBlcklkIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwiZm9ybVdyYXBwZXJJZENsYXNzIiwiZm9ybVdyYXBwZXJTbG90cyIsImJ1aWxkRXZlbnQiLCJjbG9zZSIsIm9uQ2xvc2VkIiwib25PcGVuZWQiLCJvcGVuIiwiZnVsbHNjcmVlbkVuYWJsZWQiLCJmdWxsc2NyZWVuIiwiY29tcHV0ZWRCdXR0b25zIiwib25WYWx1ZUNoYW5nZSIsImlubmVyQmluZCIsIndyYXBwZXJCaW5kUmVmIiwiZm9ybU9wdGlvbnNSZWYiLCJ0b2dnbGVGdWxsc2NyZWVuIiwib25PcGVuIiwiaXMiLCJjdXN0b21DbGFzc0tleSIsImZvcm1XcmFwcGVyIiwiY3VzdG9tQ2xhc3MiLCJiZWZvcmVDbG9zZSIsImRvU2F2ZVJlbWluZCIsInNhdmVSZW1pbmQiLCJuZWVkU2F2ZSIsIm1lc3NhZ2VCb3giLCJjb25maXJtIiwiY29uZmlybUJ1dHRvblRleHQiLCJjYW5jZWxCdXR0b25UZXh0Iiwicm91dGUiLCJ1c2VSb3V0ZSIsImRyYWZ0U3RvcmUiLCJnZXREcmFmdFN0b3JlIiwic2F2ZURyYWZ0IiwiJHJvdXRlciIsImRvU2F2ZURyYWZ0IiwidXBkYXRlVGFibGVWYWx1ZSIsImNsZWFyRHJhZnQiLCJjbGVhclRhYmxlVmFsdWUiLCJsb2FkRHJhZnQiLCJkcmFmdCIsImdldFRhYmxlVmFsdWUiLCJtZXJnZUZvcm0iLCJzYXZlZERyYWZ0IiwiZWxlbWVudEJlZm9yZUNsb3NlRml4IiwiZG9uZSIsImRyYWdnYWJsZSIsImRyYWdlbmFibGVkIiwiZ2V0TW9kYWwiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJnZXRDb21wdXRlQ29udGV4dCIsImNvbXB1dGVkQ3VzdG9tQnV0dG9ucyIsImRlZkJ0bnMiLCJjYW5jZWwiLCJvayIsImJ1dHRvbnNBcnIiLCJjbGljayIsImV4cG9zZWQiLCJlbmRzV2l0aCIsImJ1aWxkSW5uZXJCaW5kIiwiZ2V0SW5uZXJXcmFwcGVyIiwiaW5uZXJDb250YWluZXJTZWxlY3RvciIsImNsYXNzTGlzdCIsImFkZCIsInVzZVNsb3RzIiwiX3Nsb3RzIiwic2xvdHNSZW5kZXIiLCJfc2VsZiIsInRpdGxlU2xvdE5hbWUiLCJmdWxsU2NyZWVuSWNvbiIsImljb25zIiwiZnVsbFNjcmVlbiIsInVuRnVsbFNjcmVlbiIsInNob3ciLCJoYXNDb250ZW50V3JhcCIsImNvbnRlbnRXcmFwIiwic3ViQ2hpbGRyZW4iLCJjb250ZW50V3JhcENvbXAiLCJjb250ZW50UHJvcHMiLCJ2aXNpYmxlIiwidkNsb3NlZCIsImJ1aWxkT25DbG9zZWRCaW5kIiwidkN1c3RvbUNsYXNzIiwidkZ1bGxTY3JlZW4iLCJ2U3R5bGUiLCJmb3JtV3JhcHBlckNvbXAiLCJmb3JtV3JhcHBlckxpc3QiLCJmb3JtV3JhcHBlckNvbnRleHQiLCJ1c2VQcm92aWRlcnMiLCJzZWFyY2hSZWYiLCJnZXRTZWFyY2hSZWYiLCJnZXRTZWFyY2hGb3JtRGF0YSIsImdldFNlYXJjaFZhbGlkYXRlZEZvcm1EYXRhIiwic2V0U2VhcmNoRm9ybURhdGEiLCJzZWFyY2hSZXQiLCJkZWZhdWx0VGFicyIsIl9nIiwiX2YiLCJzbG90RmlsdGVyIiwiY3R4U2xvdHMiLCJrZXlQcmVmaXgiLCJ1c2VGaXhlZEhlaWdodCIsImNvbnRhaW5lclJlZiIsIm1heEhlaWdodFJlZiIsImNvbXB1dGVCb2R5SGVpZ2h0IiwidGFibGVEb20iLCJoZWFkRG9tIiwidGFibGVIZWlnaHQiLCJoZWFkSGVpZ2h0IiwidXRpbExvZyIsIndhdGNoQm9keUhlaWdodENoYW5nZSIsInRhYmxlV3JhcHBlckRvbSIsInRvb2xiYXJSZWYiLCJ0YWJsZVByb3BSZWYiLCJ0b1JlZiIsImNvbXB1dGVkVGFibGUiLCJmaXhlZEhlaWdodCIsImNvbXB1dGVkVG9vbGJhciIsImNvbXB1dGVkQ2VsbFNsb3RzIiwiY29tcHV0ZWRGb3JtU2xvdHMiLCJjb21wdXRlZFNlYXJjaFNsb3RzIiwiY29tcHV0ZWRUb29sYmFyU2xvdHMiLCJjb21wdXRlZENsYXNzIiwiY2xhenoiLCJpbm5lcldyYXBwZXJSZWYiLCJpc0Zvcm1Jbm5lciIsIl9zZmNfbWFpbiRwIiwidGFicyIsIl9jb21wb25lbnRfZnNfYWN0aW9uYmFyIiwiX2d1YXJkUmVhY3RpdmVQcm9wcyIsIl9jb21wb25lbnRfZnNfdGFic19maWx0ZXIiLCJ0YWJzQmluZGluZyIsIl9jb21wb25lbnRfZnNfdGFibGUiLCJfc2ZjX21haW4kbyIsInNjb3BlUmVmIiwiZG9DbGljayIsInBpY2tlZFByb3BzIiwiY29tcHV0ZVByb3BzIiwiY29tcHV0ZWRIYW5kbGVCdG5zIiwibWVyZ2VkQnRucyIsImJ0bnMiLCJjb21wdXRlZERyb3Bkb3duQXRMZWFzdCIsImlzRHJvcGRvd25CdG4iLCJoYXNEcm9wZG93bkJ0biIsImRvRHJvcGRvd25JdGVtQ2xpY2siLCJidG4iLCJjb21wdXRlZERyb3Bkb3duQmluZGluZyIsImJpbmRpbmciLCJfY29tcG9uZW50X2ZzX2J1dHRvbiIsIl9leHRlbmRzIiwic291cmNlIiwiX2luaGVyaXRzTG9vc2UiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJfc2V0UHJvdG90eXBlT2YiLCJfZ2V0UHJvdG90eXBlT2YiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiX2NvbnN0cnVjdCIsIlBhcmVudCIsIkNsYXNzIiwiQ29uc3RydWN0b3IiLCJfaXNOYXRpdmVGdW5jdGlvbiIsIl93cmFwTmF0aXZlU3VwZXIiLCJXcmFwcGVyIiwiZm9ybWF0UmVnRXhwIiwid2FybmluZyIsImVycm9ycyIsImNvbnZlcnRGaWVsZHNFcnJvciIsImZpZWxkcyIsInRlbXBsYXRlIiwiX2xlbiIsIl9rZXkiLCJsZW4iLCJzdHIiLCJ4IiwiaXNOYXRpdmVTdHJpbmdUeXBlIiwiaXNFbXB0eVZhbHVlIiwiYXN5bmNQYXJhbGxlbEFycmF5IiwiZnVuYyIsInJlc3VsdHMiLCJhcnJMZW5ndGgiLCJhc3luY1NlcmlhbEFycmF5IiwibmV4dCIsImZsYXR0ZW5PYmpBcnIiLCJvYmpBcnIiLCJBc3luY1ZhbGlkYXRpb25FcnJvciIsIl9FcnJvciIsIl90aGlzIiwiYXN5bmNNYXAiLCJfcGVuZGluZyIsImZsYXR0ZW5BcnIiLCJmaXJzdEZpZWxkcyIsIm9iakFycktleXMiLCJvYmpBcnJMZW5ndGgiLCJwZW5kaW5nIiwiaXNFcnJvck9iaiIsImNvbXBsZW1lbnRFcnJvciIsIm9lIiwiZmllbGRWYWx1ZSIsImRlZXBNZXJnZSIsInJlcXVpcmVkJDEiLCJ3aGl0ZXNwYWNlIiwidXJsUmVnIiwiZ2V0VXJsUmVnZXgiLCJ3b3JkIiwidjQiLCJ2NnNlZyIsInY2IiwidjQ2RXhhY3QiLCJ2NGV4YWN0IiwidjZleGFjdCIsImlwIiwicHJvdG9jb2wiLCJhdXRoIiwiaXB2NCIsImlwdjYiLCJob3N0IiwiZG9tYWluIiwidGxkIiwicG9ydCIsInJlZ2V4IiwicGF0dGVybiQyIiwidHlwZSQxIiwiY3VzdG9tIiwicnVsZVR5cGUiLCJyYW5nZSIsIm1pbiIsInNwUmVnZXhwIiwibnVtIiwiRU5VTSQxIiwiZW51bWVyYWJsZSQxIiwicGF0dGVybiQxIiwiX3BhdHRlcm4iLCJzdHJpbmciLCJtZXRob2QiLCJfYm9vbGVhbiIsInJlZ2V4cCIsImludGVnZXIiLCJmbG9hdEZuIiwiYXJyYXkiLCJvYmplY3QiLCJFTlVNIiwiZW51bWVyYWJsZSIsInBhdHRlcm4iLCJkYXRlT2JqZWN0IiwiYW55IiwidmFsaWRhdG9ycyIsIm5ld01lc3NhZ2VzIiwiY2xvbmVkIiwibWVzc2FnZXMiLCJTY2hlbWEiLCJkZXNjcmlwdG9yIiwiX3Byb3RvIiwiX21lc3NhZ2VzIiwic291cmNlXyIsIm9jIiwiX3RoaXMyIiwiY29tcGxldGUiLCJfZXJyb3JzIiwibWVzc2FnZXMkMSIsInNlcmllcyIsInoiLCJlcnJvckZpZWxkcyIsImRvSXQiLCJkZWVwIiwiYWRkRnVsbEZpZWxkIiwic2NoZW1hIiwiZXJyb3JMaXN0IiwiZmlsbGVkRXJyb3JzIiwiZmllbGRzU2NoZW1hIiwicGFyZWRGaWVsZHNTY2hlbWEiLCJmaWVsZFNjaGVtYSIsImZpZWxkU2NoZW1hTGlzdCIsImVycnMiLCJmaW5hbEVycm9ycyIsIm1lc3NhZ2VJbmRleCIsInZhbGlkYXRvciIsImNyZWF0ZVZhbGlkYXRvciIsImVkaXRhYmxlQ2VsbHMiLCJjdXJEZXNjIiwiZWFjaFRyZWUiLCJ1c2VUYWJsZURhdGEiLCJnZXREYXRhIiwidGFibGVEYXRhIiwiZWRpdGFibGVSb3dzIiwiZ2V0SWRGcm9tUm93IiwiZ2V0RWRpdGFibGVJZEZyb21Sb3ciLCJlZGl0YWJsZUVhY2hSb3dzIiwiY2VsbHMiLCJlZGl0YWJsZUVhY2hDZWxscyIsImNlbGwiLCJjcmVhdGVFZGl0YWJsZUNlbGwiLCJ0YWJsZVJvdyIsInNldFZhbHVlIiwidXBkYXRlQ2VsbCIsInNob3dBY3Rpb24iLCJlbmFibGVkIiwiZm9ybUl0ZW0iLCJzZXREZWZhdWx0VmFsdWUiLCJyb3dLZXlWYWx1ZSIsImNyZWF0ZUVkaXRhYmxlUm93IiwiZG9TYXZlIiwibmV3Um93Iiwic2F2ZVJvdyIsInAzIiwiY2hpbGQiLCJuZXh0RWRpdGFibGVJZCIsImVkaXRhYmxlSWRHZW4iLCJzZXR1cEVkaXRhYmxlIiwidG1wUm93cyIsImZvck93biIsImJ1aWxkVGhpbkRhdGEiLCJ0aGluRGF0YSIsInRoaW5Sb3ciLCJvbGRUaGluRGF0YSIsImdldEVkaXRhYmxlQ2VsbCIsImFjdGl2ZSIsImluYWN0aXZlIiwic2F2ZUVhY2giLCJjYW5jZWxBbGwiLCJwZXJzaXN0IiwicmVzdW1lIiwiaGFzRGlydHkiLCJkaXJ0eSIsImFkZEluZGV4Iiwic2V0RGVmYXVsdEZvcm0iLCJmb3JtQ29sdW1uQ29uZmlncyIsImFkZFJvdyIsImdldEVkaXRhYmxlUm93IiwicmVtb3ZlVGFibGVSb3dCeUVkaXRhYmxlSWQiLCJyZW1vdmVSb3ciLCJhY3RpdmVDb2xzIiwiY29scyIsImdldEFjdGl2ZVJvd3MiLCJyb3dzIiwiaGFzRXJyb3IiLCJyZW1vdmVEYXRhRWRpdGFibGVJZCIsImdldENsZWFuVGFibGVEYXRhIiwidXNlQ29tcG9uZW50UmVmUHJvdmlkZXIiLCJjb21wb25lbnRzUmVmIiwiZ2V0dGVyIiwic2V0dGVyIiwiYnVpbGRUYWJsZVNsb3RzIiwic29ydGVkQ29sdW1ucyIsInJlbmRlclJvd0hhbmRsZSIsInJlbmRlckNlbGxDb21wb25lbnQiLCJjb21wb25lbnREZWZpbmVzIiwidGFibGVDb21wIiwidGFibGVDb2x1bW5Db21wIiwidGFibGVDb2x1bW5Hcm91cENvbXAiLCJ0YWJsZVNsb3RzIiwiYnVpbGRDb2x1bW4iLCJjZWxsU2xvdHMiLCJjb2x1bW5TbG90cyIsImNlbGxTbG90TmFtZSIsImN1cnJlbnRUYWJsZUNvbHVtbkNvbXAiLCJzdWJDb2x1bW5zIiwic3ViQ29sdW1uIiwibmV3SXRlbSIsInJvd0hhbmRsZVNsb3RzIiwidGFibGVWZXJzaW9uIiwidGFibGVWMiIsIl9wYXJlbnQiLCJkYXRhSW5kZXgiLCJjaGlsZE9wdGlvbnMiLCJjdXN0b21SZW5kZXIiLCJyZW5kZXJNZXRob2QiLCJuZXdDb2wiLCJyZWJ1aWxkUmVuZGVyU2NvcGUiLCJjZWxsUmVuZGVyIiwiY29uZGl0aW9uYWxSZW5kZXIiLCJjb21wb25lbnRSZWZzIiwiY2VsbFJlZiIsImN1cnJlbnRSZWYiLCJ0YWJsZUNvbHVtbkNJIiwidGFibGVDb2x1bW5WMiIsInNjcm9sbFRvIiwidG9wIiwiZWRpdGFibGVXcmFwIiwib25Sb3dIYW5kbGUiLCJvbkNoYW5nZSIsIm9uU29ydENoYW5nZSIsInNvcnRlciIsIm9uRmlsdGVyQ2hhbmdlIiwiZmlsdGVycyIsIm9uUGFnaW5hdGlvbiIsImJ1YmJsZVVwIiwicm93SGFuZGxlU2xvdHNOYW1lIiwibmV3U2NvcGUiLCJzZXRSZWYiLCJyb3dSZWZzIiwiZWRpdGFibGVDZWxsIiwicmVhZG9ubHkiLCJyZW5kZXJNb2RlIiwiZGF0YVNvdXJjZSIsImNvbXB1dGVkQmluZGluZyIsInRhYmxlQ29sdW1uR3JvdXAiLCJjb21wdXRlZFRhYmxlU2xvdHMiLCJ0YWJsZVJlbmRlciIsInZMb2FkaW5nIiwicmVzb2x2ZURpcmVjdGl2ZSIsIndpdGhEaXJlY3RpdmVzIiwiY29tcHV0ZWRGbGF0Q29sdW1ucyIsImZsYXRDb2x1bW5zIiwiZmxhdENvbHVtbnNGbiIsImNvbXB1dGVkTXVsdGlIZWFkZXJzIiwiYnVpbGRNdWx0aUhlYWRlcnNCaW5kIiwidHJlZUNvbHVtbnMiLCJiaW5kIiwiaXNGbGF0IiwiY29sdW1uc0lzRmxhdCIsImNyZWF0ZVRhYmxlSW5zdGFuY2UiLCJ3aWR0aCIsImhlaWdodCIsImNvbXB1dGVkQ29tcG9uZW50IiwiY29tcHV0ZWRQcm9wc0NvbXBvbmVudCIsImNvbXB1dGVkVGl0bGUiLCJzaG93VGl0bGUiLCJjb21wdXRlZENlbGxDb250ZW50UmVuZGVyIiwic2xvdCIsImxhc3RSZW5kZXIiLCJjZWxsQ29udGVudFJlbmRlciIsIm1hdGNoIiwiZm9ybWF0dGVyIiwidG9vbHRpcFByb3BzIiwidG9vbHRpcFNsb3RzIiwiY29udGVudCIsImNvbHVtbktleSIsImNvbXB1dGVkRm9ybSIsImdldEZvcm1SZWZGdW5jIiwiZ2V0Rm9ybSIsImNvbXB1dGVkSXNFZGl0YWJsZSIsImVkaXRpbmdVcGRhdGUiLCJvblN1Ym1pdCIsInNhdmUiLCJvbkNhbmNlbCIsImlzQ2hhbmdlZCIsImVkaXQiLCJpbnB1dENvbXBvbmVudCIsImlzRWRpdGluZyIsImFjdGl2ZVRyaWdnZXIiLCJtZXRob2RzIiwiJHJlZnMiLCJ0YXJnZXRJbnB1dFJlZiIsIl9fZW1pdCIsImRvU3VibWl0IiwiZG9DYW5jZWwiLCJnZXRWYWxpZGF0ZUVycm9yTWVzc2FnZSIsImVkaXRpbmciLCJfc2ZjX21haW4kbSIsInNvcnRBcnIiLCJzb3J0ZWRCdXR0b25zIiwiU2V0Rm9ybURhdGFPcHRpb25zIiwiQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXkiLCJ0cmFuc2Zvcm1Db2x1bW5zVHJlZSIsImN1cnJlbnRDb2x1bW5zIiwib3JpZ2luYWxDb2x1bW5zTWFwIiwiX3RleHQiLCJidWlsZENvbHVtbkZpbHRlckl0ZW0iLCJ0cmFuc2Zvcm1Ub1RhYmxlQ29sdW1ucyIsInNldEN1cnJlbnRWYWx1ZSIsImRvX3NhdmUiLCJjbGVhclRoaXNTdG9yYWdlIiwibm9TYXZlIiwic2F2ZU9wdGlvbnNUb1N0b3JhZ2UiLCJkb0VtaXQiLCJjb21wdXRlZE9yaWdpbmFsQ29sdW1ucyIsInNpbXBsZVN1Ym1pdCIsInNpbXBsZVJlc2V0Iiwic3RvcmFnZVRhYmxlU3RvcmUiLCJnZXRTdG9yYWdlVGFibGUiLCJyZW1vdGVTdG9yYWdlIiwic3RvcmVkT3B0aW9ucyIsImdldE9wdGlvbnNGcm9tU3RvcmFnZSIsImdldENvbHVtbnNIYXNoIiwiaGFzaCIsImluaXQiLCJzdG9yZUhhc2giLCJ1cGRhdGUiLCJjaGFuZ2UiLCJidWlsZFRleHQiLCJlbGVtZW50IiwiX3dpdGhEaXJlY3RpdmVzIiwiX3ZTaG93IiwiX3NmY19tYWluJGsiLCJGc1RhYmxlQ29sdW1uc0ZpbHRlciIsImNvbHVtbnNGaWx0ZXJSZWYiLCJkZWZhdWx0QnV0dG9ucyIsImRlZmF1bHRCdXR0b25zS2V5IiwicG9wb3ZlclZpc2libGUiLCJzdG9yYWdlIiwib3duS2V5cyIsImVudW1lcmFibGVPbmx5Iiwic3ltYm9scyIsInN5bSIsIl9vYmplY3RTcHJlYWQyIiwiX2RlZmluZVByb3BlcnR5IiwiX3R5cGVvZiIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIiwiZXhjbHVkZWQiLCJzb3VyY2VLZXlzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwic291cmNlU3ltYm9sS2V5cyIsInZlcnNpb24iLCJ1c2VyQWdlbnQiLCJJRTExT3JMZXNzIiwiRWRnZSIsIkZpcmVGb3giLCJTYWZhcmkiLCJJT1MiLCJDaHJvbWVGb3JBbmRyb2lkIiwiY2FwdHVyZU1vZGUiLCJvZmYiLCJtYXRjaGVzIiwic2VsZWN0b3IiLCJnZXRQYXJlbnRPckhvc3QiLCJjbG9zZXN0IiwiaW5jbHVkZUNUWCIsIlJfU1BBQ0UiLCJ0b2dnbGVDbGFzcyIsInN0YXRlIiwiY3NzIiwic3R5bGUiLCJtYXRyaXgiLCJzZWxmT25seSIsImFwcGxpZWRUcmFuc2Zvcm1zIiwibWF0cml4Rm4iLCJmaW5kIiwidGFnTmFtZSIsIml0ZXJhdG9yIiwiZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCIsInNjcm9sbGluZ0VsZW1lbnQiLCJnZXRSZWN0IiwicmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jayIsInJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQiLCJ1bmRvU2NhbGUiLCJlbFJlY3QiLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiLCJjb250YWluZXJSZWN0IiwiZWxNYXRyaXgiLCJzY2FsZVgiLCJzY2FsZVkiLCJpc1Njcm9sbGVkUGFzdCIsImVsU2lkZSIsInBhcmVudFNpZGUiLCJnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudCIsImVsU2lkZVZhbCIsInBhcmVudFNpZGVWYWwiLCJnZXRDaGlsZCIsImNoaWxkTnVtIiwiaW5jbHVkZURyYWdFbCIsImN1cnJlbnRDaGlsZCIsIlNvcnRhYmxlIiwibGFzdENoaWxkIiwibGFzdCIsImdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0Iiwib2Zmc2V0TGVmdCIsIm9mZnNldFRvcCIsIndpblNjcm9sbGVyIiwiaW5kZXhPZk9iamVjdCIsImluY2x1ZGVTZWxmIiwiZWxlbSIsImdvdFNlbGYiLCJlbGVtQ1NTIiwiZXh0ZW5kIiwiZHN0Iiwic3JjIiwiaXNSZWN0RXF1YWwiLCJyZWN0MSIsInJlY3QyIiwiX3Rocm90dGxlVGltZW91dCIsInRocm90dGxlIiwibXMiLCJjYW5jZWxUaHJvdHRsZSIsInNjcm9sbEJ5IiwieSIsIlBvbHltZXIiLCIkIiwiZXhwYW5kbyIsIkFuaW1hdGlvblN0YXRlTWFuYWdlciIsImFuaW1hdGlvblN0YXRlcyIsImFuaW1hdGlvbkNhbGxiYWNrSWQiLCJmcm9tUmVjdCIsImNoaWxkTWF0cml4IiwiYW5pbWF0aW5nIiwiYW5pbWF0aW9uVGltZSIsInRpbWUiLCJ0b1JlY3QiLCJwcmV2RnJvbVJlY3QiLCJwcmV2VG9SZWN0IiwiYW5pbWF0aW5nUmVjdCIsInRhcmdldE1hdHJpeCIsImNhbGN1bGF0ZVJlYWxUaW1lIiwiY3VycmVudFJlY3QiLCJkdXJhdGlvbiIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwicmVwYWludCIsImRlZmF1bHRzIiwiUGx1Z2luTWFuYWdlciIsInNvcnRhYmxlIiwiZXZ0IiwiZXZlbnROYW1lR2xvYmFsIiwicGx1Z2luTmFtZSIsImluaXRpYWxpemVkIiwibW9kaWZpZWQiLCJldmVudFByb3BlcnRpZXMiLCJtb2RpZmllZFZhbHVlIiwiZGlzcGF0Y2hFdmVudCIsIl9yZWYiLCJyb290RWwiLCJ0YXJnZXRFbCIsImNsb25lRWwiLCJ0b0VsIiwiZnJvbUVsIiwib2xkSW5kZXgiLCJuZXdJbmRleCIsIm9sZERyYWdnYWJsZUluZGV4IiwibmV3RHJhZ2dhYmxlSW5kZXgiLCJvcmlnaW5hbEV2ZW50IiwicHV0U29ydGFibGUiLCJleHRyYUV2ZW50UHJvcGVydGllcyIsIm9uTmFtZSIsImFsbEV2ZW50UHJvcGVydGllcyIsIl9leGNsdWRlZCIsInBsdWdpbkV2ZW50IiwiZHJhZ0VsIiwicGFyZW50RWwiLCJnaG9zdEVsIiwibmV4dEVsIiwibGFzdERvd25FbCIsImNsb25lSGlkZGVuIiwibW92ZWQiLCJfaGlkZUdob3N0Rm9yVGFyZ2V0IiwiX3VuaGlkZUdob3N0Rm9yVGFyZ2V0IiwiX2Rpc3BhdGNoRXZlbnQiLCJhY3RpdmVHcm91cCIsImF3YWl0aW5nRHJhZ1N0YXJ0ZWQiLCJpZ25vcmVOZXh0Q2xpY2siLCJzb3J0YWJsZXMiLCJ0YXBFdnQiLCJ0b3VjaEV2dCIsImxhc3REeCIsImxhc3REeSIsInRhcERpc3RhbmNlTGVmdCIsInRhcERpc3RhbmNlVG9wIiwibGFzdFRhcmdldCIsImxhc3REaXJlY3Rpb24iLCJwYXN0Rmlyc3RJbnZlcnRUaHJlc2giLCJpc0NpcmN1bXN0YW50aWFsSW52ZXJ0IiwidGFyZ2V0TW92ZURpc3RhbmNlIiwiZ2hvc3RSZWxhdGl2ZVBhcmVudCIsImdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsIiwiX3NpbGVudCIsInNhdmVkSW5wdXRDaGVja2VkIiwiZG9jdW1lbnRFeGlzdHMiLCJQb3NpdGlvbkdob3N0QWJzb2x1dGVseSIsIkNTU0Zsb2F0UHJvcGVydHkiLCJzdXBwb3J0RHJhZ2dhYmxlIiwic3VwcG9ydENzc1BvaW50ZXJFdmVudHMiLCJfZGV0ZWN0RGlyZWN0aW9uIiwiZWxDU1MiLCJlbFdpZHRoIiwiY2hpbGQxIiwiY2hpbGQyIiwiZmlyc3RDaGlsZENTUyIsInNlY29uZENoaWxkQ1NTIiwiZmlyc3RDaGlsZFdpZHRoIiwic2Vjb25kQ2hpbGRXaWR0aCIsInRvdWNoaW5nU2lkZUNoaWxkMiIsIl9kcmFnRWxJblJvd0NvbHVtbiIsImRyYWdSZWN0IiwidGFyZ2V0UmVjdCIsInZlcnRpY2FsIiwiZHJhZ0VsUzFPcHAiLCJkcmFnRWxTMk9wcCIsImRyYWdFbE9wcExlbmd0aCIsInRhcmdldFMxT3BwIiwidGFyZ2V0UzJPcHAiLCJ0YXJnZXRPcHBMZW5ndGgiLCJfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUiLCJ0aHJlc2hvbGQiLCJyZWN0IiwiaW5zaWRlSG9yaXpvbnRhbGx5IiwiaW5zaWRlVmVydGljYWxseSIsIl9wcmVwYXJlR3JvdXAiLCJ0b0ZuIiwicHVsbCIsInRvIiwiZnJvbSIsInNhbWVHcm91cCIsIm90aGVyR3JvdXAiLCJvcmlnaW5hbEdyb3VwIiwibmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQiLCJuZWFyZXN0IiwiX2NoZWNrT3V0c2lkZVRhcmdldEVsIiwiZGF0YVRyYW5zZmVyIiwicHJldmVudE9uRmlsdGVyIiwidG91Y2giLCJvcmlnaW5hbFRhcmdldCIsImZpbHRlciIsIl9zYXZlSW5wdXRDaGVja2VkU3RhdGUiLCJjcml0ZXJpYSIsIm93bmVyRG9jdW1lbnQiLCJkcmFnU3RhcnRGbiIsIl9kaXNhYmxlRHJhZ2dhYmxlIiwiX25leHRUaWNrIiwiZmFsbGJhY2siLCJpbnNlcnRlZCIsImZhbGxiYWNrVG9sZXJhbmNlIiwiZmFsbGJhY2tPZmZzZXQiLCJnaG9zdE1hdHJpeCIsInJlbGF0aXZlU2Nyb2xsT2Zmc2V0IiwiZHgiLCJkeSIsImNzc01hdHJpeCIsInJldmVydCIsImFjdGl2ZVNvcnRhYmxlIiwiaXNPd25lciIsImNhblNvcnQiLCJmcm9tU29ydGFibGUiLCJjb21wbGV0ZWRGaXJlZCIsImRyYWdPdmVyRXZlbnQiLCJleHRyYSIsImNvbXBsZXRlZCIsIl9vbk1vdmUiLCJjYXB0dXJlIiwiaW5zZXJ0aW9uIiwiZWxMYXN0Q2hpbGQiLCJfZ2hvc3RJc0xhc3QiLCJfZ2hvc3RJc0ZpcnN0IiwiZmlyc3RDaGlsZCIsImRpcmVjdGlvbiIsInRhcmdldEJlZm9yZUZpcnN0U3dhcCIsImRpZmZlcmVudExldmVsIiwiZGlmZmVyZW50Um93Q29sIiwic2lkZTEiLCJzY3JvbGxlZFBhc3RUb3AiLCJzY3JvbGxCZWZvcmUiLCJfZ2V0U3dhcERpcmVjdGlvbiIsInNpYmxpbmciLCJkcmFnSW5kZXgiLCJuZXh0U2libGluZyIsIm1vdmVWZWN0b3IiLCJfdW5zaWxlbnQiLCJfY2FuY2VsTmV4dFRpY2siLCJfZ2xvYmFsRHJhZ092ZXIiLCJfZ2VuZXJhdGVJZCIsInVzZUFuaW1hdGlvbiIsIml0ZW1zIiwid2lsbEluc2VydEFmdGVyIiwib25Nb3ZlRm4iLCJyZXRWYWwiLCJzcGFjZXIiLCJzd2FwVGhyZXNob2xkIiwiaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIiwiaW52ZXJ0U3dhcCIsImlzTGFzdFRhcmdldCIsIm1vdXNlT25BeGlzIiwidGFyZ2V0TGVuZ3RoIiwidGFyZ2V0UzEiLCJ0YXJnZXRTMiIsImludmVydCIsIl9nZXRJbnNlcnREaXJlY3Rpb24iLCJzdW0iLCJyb290IiwiaW5wdXRzIiwiaWR4IiwiYXV0b1Njcm9sbHMiLCJzY3JvbGxFbCIsInNjcm9sbFJvb3RFbCIsInNjcm9sbGluZyIsImxhc3RBdXRvU2Nyb2xsWCIsImxhc3RBdXRvU2Nyb2xsWSIsInRvdWNoRXZ0JDEiLCJwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCIsIkF1dG9TY3JvbGxQbHVnaW4iLCJBdXRvU2Nyb2xsIiwiX3JlZjIiLCJjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsIiwiY2xlYXJBdXRvU2Nyb2xscyIsImF1dG9TY3JvbGwiLCJvZ0VsZW1TY3JvbGxlciIsIm5ld0VsZW0iLCJpc0ZhbGxiYWNrIiwic2VucyIsInNwZWVkIiwic2Nyb2xsVGhpc0luc3RhbmNlIiwic2Nyb2xsQ3VzdG9tRm4iLCJsYXllcnNPdXQiLCJjdXJyZW50UGFyZW50IiwiY2FuU2Nyb2xsWCIsImNhblNjcm9sbFkiLCJzY3JvbGxXaWR0aCIsInNjcm9sbEhlaWdodCIsInNjcm9sbFBvc1giLCJzY3JvbGxQb3NZIiwidngiLCJ2eSIsInNjcm9sbE9mZnNldFkiLCJzY3JvbGxPZmZzZXRYIiwiZHJvcCIsImRpc3BhdGNoU29ydGFibGVFdmVudCIsImhpZGVHaG9zdEZvclRhcmdldCIsInVuaGlkZUdob3N0Rm9yVGFyZ2V0IiwidG9Tb3J0YWJsZSIsIlJldmVydCIsIl9yZWYzIiwiUmVtb3ZlIiwiX3JlZjQiLCJwYXJlbnRTb3J0YWJsZSIsIl9fZGVmUHJvcCIsIl9fZGVmUHJvcHMiLCJfX2dldE93blByb3BEZXNjcyIsIl9fZ2V0T3duUHJvcFN5bWJvbHMiLCJfX2hhc093blByb3AiLCJfX3Byb3BJc0VudW0iLCJfX2RlZk5vcm1hbFByb3AiLCJfX3NwcmVhZFZhbHVlcyIsIl9fc3ByZWFkUHJvcHMiLCJyZW1vdmVOb2RlIiwiaW5zZXJ0Tm9kZUF0IiwiZmF0aGVyTm9kZSIsInBvc2l0aW9uIiwicmVmTm9kZSIsImdldENvbnNvbGUiLCJjb25zb2xlJDEiLCJjYWNoZSIsImNhbWVsaXplIiwibWFuYWdlQW5kRW1pdCQxIiwiZW1pdCQxIiwibWFuYWdlJDEiLCJldmVudEhhbmRsZXJOYW1lcyIsImV2ZW50czIiLCJpc1JlYWRPbmx5IiwidGFncyIsImlzSHRtbFRhZyIsImlzVHJhbnNpdGlvbiIsImlzSHRtbEF0dHJpYnV0ZSIsInByb2plY3QiLCJnZXRDb21wb25lbnRBdHRyaWJ1dGVzIiwiJGF0dHJzIiwiY29tcG9uZW50RGF0YSIsImF0dHJpYnV0ZXMiLCJjcmVhdGVTb3J0YWJsZU9wdGlvbiIsImNhbGxCYWNrQnVpbGRlciIsImdldFZhbGlkU29ydGFibGVFbnRyaWVzIiwiZXZlbnRUeXBlIiwiZXZlbnRCdWlsZGVyIiwidmFsdWUyIiwiZ2V0SHRtbEVsZW1lbnRGcm9tTm9kZSIsImFkZENvbnRleHQiLCJkb21FbGVtZW50IiwiZ2V0Q29udGV4dCIsIkNvbXBvbmVudFN0cnVjdHVyZSIsImhlYWRlciIsImRlZmF1bHROb2RlcyIsImZvb3RlciIsInJlYWxMaXN0IiwiaDIiLCJ0YWciLCJfaXNSb290Q29tcG9uZW50IiwiZG9tSW5kZXgiLCJkb21DaGlsZHJlbiIsImZpcnN0RG9tTGlzdEVsZW1lbnQiLCJpbmRleEZpcnN0RG9tTGlzdEVsZW1lbnQiLCJlbGVtZW50MiIsImdldFNsb3QiLCJzbG90VmFsdWUiLCJjb21wdXRlTm9kZXMiLCJnZXRLZXkiLCJub3JtYWxpemVkTGlzdCIsImdldFJvb3RJbmZvcm1hdGlvbiIsInRyYW5zaXRpb24iLCJleHRlcm5hbENvbXBvbmVudCIsIlRyYW5zaXRpb25Hcm91cCIsImNvbXB1dGVDb21wb25lbnRTdHJ1Y3R1cmUiLCJldnROYW1lIiwiZXZ0RGF0YSIsIm1hbmFnZSIsIm9yaWdpbmFsRWxlbWVudCIsIm1hbmFnZUFuZEVtaXQiLCJkZWxlZ2F0ZUNhbGxCYWNrIiwiZHJhZ2dpbmdFbGVtZW50IiwiZHJhZ2dhYmxlQ29tcG9uZW50IiwiY29tcG9uZW50U3RydWN0dXJlIiwiJGVsIiwic29ydGFibGVPcHRpb25zIiwidGFyZ2V0RG9tRWxlbWVudCIsIml0ZW1LZXkiLCJuZXdPcHRpb25WYWx1ZSIsIl9zb3J0YWJsZSIsImh0bUVsZW1lbnQiLCJvbkxpc3QiLCJuZXdMaXN0Iiwic3BsaWNlTGlzdCIsInVwZGF0ZVBvc2l0aW9uIiwicmVsYXRlZCIsImRlc3RpbmF0aW9uIiwiYWRkZWQiLCJyZW1vdmVkIiwicmVsYXRlZENvbnRleHQiLCJjdXJyZW50RG9tSW5kZXgiLCJjdXJyZW50SW5kZXgiLCJtb3ZlIiwiZnV0dXJlSW5kZXgiLCJkcmFnZ2VkQ29udGV4dCIsInNlbmRFdmVudCIsIl9zZmNfbWFpbiRqIiwib25EcmFnZ2FibGVNb3ZlIiwiZHJhZ2VkIiwic29ydGVkIiwibGVmdEluZGV4IiwicmlnaHRJbmRleCIsIm1pbk5vdEluZGV4IiwibWF4Tm90SW5kZXgiLCJidWlsZFVwZGF0ZUtleSIsInVwZGF0ZUNoZWNrZWQiLCJ1cGRhdGVDaGlsZHJlbiIsInVwZGF0ZVBhcmVudCIsIm9uQ2hlY2tDaGFuZ2VkIiwiZml4ZWRDaGFuZ2UiLCJpc1Jvb3QiLCJGc1RhYmxlQ29sdW1uc0ZpeGVkQ29udHJvbGxlciIsIl9jb21wb25lbnRfZnNfY29sdW1uc19maWx0ZXJfbmVzdF9saXN0IiwiZHJhd2VyQmluZCIsImNoZWNrQWxsIiwib25DaGVja0FsbENoYW5nZSIsImNoZWNrQWxsQmluZCIsInNob3dMZW5ndGgiLCJhbGxMZW5ndGgiLCJpc0luZGV0ZXJtaW5hdGUiLCJhbGxDaGVja2VkVXBkYXRlIiwiRnNDb2x1bW5zRmlsdGVyTmVzdExpc3QiLCJfc2ZjX21haW4kZyIsIkZzU2VhcmNoQnV0dG9ucyIsInZhbGlkYXRlZEZvcm0iLCJzZWFyY2hBZnRlclJlc2V0IiwiYXV0b1NlYXJjaCIsImRlYm91bmNlIiwidmFsaWRhdGVPbkNoYW5nZSIsIl9jZWxsUmVuZGVyIiwib25Gb3JtVmFsaWRhdGVkIiwiTG9kYXNoR2V0Iiwic3BsaXRLZXkiLCJfb25VcGRhdGVNb2RlbFZhbHVlIiwib25WYWx1ZUNoYW5nZWQiLCJfb25JbnB1dCIsIm9uSW5wdXQiLCJvbktleXVwIiwiYXV0b1NlYXJjaFRyaWdnZXIiLCJkb1NlYXJjaCIsImRlZmF1bHRTbG90IiwiYnVpbGRGaWVsZENvbnRleHQiLCJjb21wb25lbnRSZW5kZXJSZWZzIiwib25Db21wb3NpdGlvbnN0YXJ0IiwiY2hhbmdlSW5wdXRFdmVudERpc2FibGVkIiwib25Db21wb3NpdGlvbmVuZCIsInNwbGl0ZWRLZXkiLCJydWxlUGF0aCIsInNlYXJjaEZvcm1SZWYiLCJnZXRDb21wb25lbnRSZW5kZXJSZWYiLCJkb1Jlc2V0IiwiZG9WYWxpZGF0ZSIsInNpbGVudCIsInZhbGlkYXRlV3JhcCIsImRlZkJ0bk9wdGlvbnMiLCJfY2xpY2siLCJpbml0QXV0b1NlYXJjaCIsIndhaXQiLCJnZXRWYWxpZGF0ZWRGb3JtIiwic2V0Rm9ybSIsIm5ld0Zvcm0iLCJpbnB1dEV2ZW50RGlzYWJsZWQiLCJkb0F1dG9TZWFyY2giLCJ2YWxpZGF0ZU9uQ2hhbmdlU2lsZW50IiwiY29tcG9uZW50UmVmIiwidmFsdWVDaGFuZ2VDb250ZXh0IiwiaW1tZWRpYXRlIiwiY29tcHV0ZWRSdWxlcyIsIl9zZmNfbWFpbiRlIiwiY29tcHV0ZWRJc011bHRpTGluZSIsImNvbHVtbnNSb3dSZWYiLCJjb2x1bW5zQm94SGVpZ2h0UmVmIiwiY29sdW1uc0xpc3QiLCJjb2x1bW5zTGluZUhlaWdodFJlZiIsInNlYXJjaEV2ZW50Q29udGV4dFJlZiIsInRvZ2dsZUNvbGxhcHNlIiwiY29tcHV0ZWRDb2xOYW1lIiwiY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQiLCJfY29tcG9uZW50X2ZzX3NlYXJjaF9idXR0b25zIiwiY29sbGFwc2UiLCJfc2ZjX21haW4kZCIsImNvbGxhcHNlQnV0dG9uIiwiZGVmYXVsdE9wdGlvbiIsIl9fREVGQVVMVF9fIiwib25VcGRhdGVBY3RpdmVLZXkiLCJkZWZhdWx0TGltaXQiLCJkaWFsb2dPcGVuZWQiLCJjb21wdXRlZERpYWxvZyIsImZvcm1JdGVtQ29udGV4dCIsImlucHV0QmluZGluZyIsImVtaXRDaGFuZ2UiLCJoYW5kbGVPcGVuIiwicGFnZXIiLCJvblRhYkNoYW5nZSIsImN1cnJlbnRJY29uIiwiY3VycmVudENvbG9yIiwiYXBpIiwibGltaXQiLCJpY29uU3RvcmUiLCJsb2FkSWNvblNldCIsInNldHMiLCJ1bmNhdGVnb3JpZXMiLCJjYXRlZ29yaWVzIiwic2VhcmNoS2V5IiwidGFiS2V5IiwicmVzZXRQYWdlciIsImhhbmRsZVNlYXJjaCIsImdldFBhZ2VyRnJvbUljb25TZXQiLCJlbmQiLCJoYW5kbGVJY29uU2VsZWN0Iiwib25Db25maXJtIiwiaGFuZGxlQ29sb3JDaGFuZ2UiLCJsb2FkTW9yZSIsImNvbXB1dGVUYWJzIiwiY29sb3JJdGVtIiwiX2hvaXN0ZWRfOCIsIl9ob2lzdGVkXzkiLCJfaG9pc3RlZF8xMSIsIl9jb21wb25lbnRfZnNfbG9hZGluZyIsIl9ob2lzdGVkXzEyIiwiX2hvaXN0ZWRfMTMiLCJfc2ZjX21haW4kYSIsImNvbXB1dGVkUmFkaW9OYW1lIiwidXNlZERpY3QiLCJjb21wdXRlZE9wdGlvbnMiLCJvcHQiLCJvcHRpb25Qcm9wcyIsInNlbGVjdFJlZiIsImNvbXB1dGVkUGxhY2Vob2xkZXIiLCJwbGFjZWhvbGRlciIsIm9uU2VsZWN0ZWRDaGFuZ2UiLCJkYXRhTWFwIiwidGVtcFNsb3RzIiwiX3VzZVNsb3RzIiwic2VsZWN0Q29tcCIsIiRlbWl0IiwidGhpc1Nsb3RzIiwicmVuZGVyTGFiZWwiLCJvcHRpb25Db21wIiwiY29zIiwiZ2V0SGFzaENvZGUiLCJjaHIiLCJidWlsZEFycmF5VmFsdWUiLCJ2YWx1ZUFyciIsIl9zZmNfbWFpbiQ4IiwiQ09MT1JfTElTVCIsIkVGRkVDVF9MSVNUIiwiZ2V0Q29sb3IiLCJzZXRDb2xvciIsInR5cGVLZXkiLCJoYXNoY29kZSIsImNvbG9ycyIsImVmZmVjdHMiLCJjb21wdXRlZFZhbHVlSXRlbXMiLCJ2YWx1ZVByb3AiLCJsYWJlbFByb3AiLCJjb2xvcmZ1bE9wdGlvbnMiLCJuZXdWYWx1ZXMiLCJfc2ZjX21haW4kNyIsImNvbXB1dGVkTXVsdGlwbGUiLCJzdWIiLCJMYWJlbHMiLCJJbmRleCIsIl9zZmNfbWFpbiQ2IiwiY2FzY2FkZXJSZWYiLCJkaWN0VXNlUmV0IiwiZmllbGROYW1lc0JpbmRlciIsIm9uU2VsZWN0Q2hhbmdlIiwic2VsZWN0ZWRPcHRpb25zIiwiX3NmY19tYWluJDUiLCJfc2ZjX21haW4kNCIsIl9zZmNfbWFpbiQzIiwiX3NmY19tYWluJDIiLCJ0cmVlUmVmIiwiZGljdFNlbGVjdFJlZiIsInZhbHVlc0Zvcm1hdFJlZiIsImRpYWxvZ09wZW4iLCJvbkNsb3NlIiwiZ2V0U2NvcGVDb250ZXh0IiwiaW5pdFNlbGVjdGVkS2V5cyIsIm11bHRpcGxlIiwidmFsdWVUeXBlIiwiZm9ybVdyYXBwZXJPcHRpb25zIiwib3BlblRhYmxlU2VsZWN0Iiwib3Blbk9wdGlvbnMiLCJjcnVkT3B0aW9uc092ZXJyaWRlIiwiYnVpbGRNZXJnZWRDcnVkT3B0aW9ucyIsImJlZm9yZU9wZW4iLCJ3cmFwcGVyT3B0aW9ucyIsInZpZXdNb2RlIiwiZGlhbG9nIiwiYnVpbGRJbml0QmluZCIsIm9uT2siLCJjb21wdXRlZFZhbHVlc0Zvcm1hdCIsInZhbHVlc0Zvcm1hdCIsImNvbXB1dGVkU2VsZWN0IiwidXBkYXRlS2V5IiwiY2xlYXJhYmxlIiwiYnVpbGRNdWx0aUJpbmRpbmciLCJhcHBlbmRCeVZhbHVlcyIsInJlZnJlc2hpbmciLCJzZWxlY3Rpb25PcHRpb25zIiwiYnVpbGRTZWxlY3Rpb25DcnVkT3B0aW9ucyIsImNyb3NzUGFnZSIsInNlbGVjdE9uQ2xpY2tSb3ciLCJnZXRQYWdlRGF0YSIsIm9uU2VsZWN0ZWRLZXlzQ2hhbmdlZCIsIm9uUmVmcmVzaGVkIiwic2V0U2VsZWN0ZWRSb3dzIiwiZ2V0QmFzZVRhYmxlUmVmIiwiZ2V0RGljdE1hcCIsImVtaXRPblZpZXdNb2RlbCIsIm9wZW5lZCIsIl9jb21wb25lbnRfZnNfZGljdF9zZWxlY3QiLCJza2lwVmFsaWRhdGlvbldyYXBwZXIiLCJfY29tcG9uZW50X2ZzX2Zvcm1fd3JhcHBlciIsImRlc3Ryb3lPbkNsb3NlIiwiX2NvbXBvbmVudF9mc19jcnVkIiwic2hvd0N1cnJlbnQiLCJfY29tcG9uZW50X2ZzX3ZhbHVlc19mb3JtYXQiLCJjbG9zYWJsZSIsImRvVXBkYXRlIiwiZGljdFNlbGVjdCIsIl9jb21wb25lbnRfZnNfdGFibGVfc2VsZWN0IiwidGFibGVTZWxlY3QiLCJGYXN0Q3J1ZCIsImN1c3RvbUNvbXBvbmVudHMiLCJjb20iLCJwcmludFdhcm5pbmdMb2dnZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxTQUFTQSxLQUFhOztBQUVwQixVQUFPQyxJQURHLElBQUksUUFDTCxVQUFGLGdCQUFBQSxFQUFTLE1BQU07QUFBQSxHQUFNO0FBQzlCO0FBRUEsTUFBTUMsS0FBUSxJQUFJQyxNQUFlO0FBQUE7QUFFakMsU0FBU0MsTUFBV0QsR0FBUztBQUczQixVQUFRLElBQU8sTUFBTSxNQUFNLFNBQVM7QUFDdEM7QUFDQSxTQUFTRSxNQUFXRixHQUFTO0FBR25CLFVBQUEsS0FBSyxNQUFNLE1BQU0sU0FBUztBQUNwQztBQUNBLFNBQVNHLE1BQVlILEdBQVM7QUFHcEIsVUFBQSxNQUFNLE1BQU0sTUFBTSxTQUFTO0FBQ3JDO0FBQ0EsTUFBTUksS0FBUSxJQUFJSixNQUFhO0FBQ3BCLEVBQUFHLEdBQUEsY0FBYyxxQkFBcUIsR0FBR0gsQ0FBSTtBQUNyRCxHQUNNSyxLQUFPLElBQUlMLE1BQWE7QUFDcEIsRUFBQUUsR0FBQSxhQUFhLHFCQUFxQixHQUFHRixDQUFJO0FBQ25ELEdBQ01NLEtBQU8sSUFBSU4sTUFBYTtBQUNwQixFQUFBQyxHQUFBLGFBQWEscUJBQXFCLEdBQUdELENBQUk7QUFDbkQsR0FDTU8sS0FBUSxJQUFJUCxNQUFhO0FBQ3pCLE1BQUEsQ0FBQyxRQUFRO0FBQ1g7QUFFRixRQUFNUSxJQUFhWDtBQUNJO0FBQ3JCLFVBQU1ZLElBQU0sQ0FBQyxjQUFjLHFCQUFxQixHQUFHVCxDQUFJO0FBQ3ZELElBQUFDLEdBQVEsR0FBR1EsQ0FBRztBQUNkLFVBQU1DLElBQVMsQ0FBQyxRQUFRRixHQUFZLFlBQVk7QUFDaEQsSUFB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QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7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QUFtQjdnRSxFQUFRLG9CQUFvQjtBQUNyRCxlQUFXVyxLQUFPRSxJQUFZO0FBRTVCLFlBQU1pZ0UsSUFBTUQsRUFBaUJsZ0UsQ0FBRyxLQUFLRSxHQUFXRixDQUFHO0FBQy9DLE1BQUFaLEVBQUEsVUFBVVksR0FBS21nRSxDQUFHO0FBQUEsSUFDdkI7QUFFRCxJQUFBaHJELEdBQWMsV0FBVy9WLEVBQUksVUFFN0IrUSxHQUFNLFFBQU8sR0FFYi9RLEVBQUksT0FBTyxpQkFBaUIsUUFBUWdILEdBQVUsSUFBRyxHQUUzQ2xDLEVBQUFnbkIsR0FBYSxRQUFRN3JCLEVBQVEsTUFBTSxHQUN6QytnRSxHQUFtQi9nRSxFQUFRLE1BQU07QUFBQSxFQUNuQzs7QUFHRixTQUFTK2dFLEdBQW1CcGlFLEdBQXFCOztBQUMzQyxJQUFBYixJQUFBYSxLQUFBLGdCQUFBQSxFQUFRLFFBQVIsZ0JBQUFiLEVBQWEsa0JBQWlCLE1BQ2hDLFFBQVEsS0FDTjtBQUFBLHlFQUNtRTtBQUd6RTsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMTksMjEsMjIsMjMsNDUsODMsOTgsOTldfQ==
|