13955 lines
1.7 MiB
13955 lines
1.7 MiB
var Xi = Object.defineProperty;
|
||
var Qi = (e, t, n) => t in e ? Xi(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
|
||
var ae = (e, t, n) => (Qi(e, typeof t != "symbol" ? t + "" : t, n), n), tr = (e, t, n) => {
|
||
if (!t.has(e))
|
||
throw TypeError("Cannot " + n);
|
||
};
|
||
var g = (e, t, n) => (tr(e, t, "read from private field"), n ? n.call(e) : t.get(e)), pe = (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);
|
||
}, fe = (e, t, n, o) => (tr(e, t, "write to private field"), o ? o.call(e, n) : t.set(e, n), n);
|
||
var bo = (e, t, n, o) => ({
|
||
set _(r) {
|
||
fe(e, t, r, n);
|
||
},
|
||
get _() {
|
||
return g(e, t, o);
|
||
}
|
||
}), ee = (e, t, n) => (tr(e, t, "access private method"), n);
|
||
import { uiContext as qe, useUi as we } from "@fast-crud/ui-interface";
|
||
import { computed as M, onRenderTriggered as Ji, defineAsyncComponent as Zi, defineComponent as le, ref as K, onMounted as _n, openBlock as w, createElementBlock as j, renderSlot as re, createCommentVNode as oe, createElementVNode as te, isRef as Mo, watch as it, isShallow as es, shallowReactive as Bo, createVNode as x, reactive as yn, shallowRef as ts, inject as jn, render as ns, toRaw as Ln, unref as q, nextTick as Be, getCurrentInstance as Go, normalizeStyle as to, resolveComponent as G, createBlock as I, withCtx as B, resolveDynamicComponent as H, isVNode as xr, h as vr, mergeProps as z, normalizeClass as St, createTextVNode as Vt, toDisplayString as We, provide as sn, markRaw as os, Fragment as be, renderList as Te, createSlots as Lr, normalizeProps as xe, useAttrs as Xo, useSlots as qr, toRef as la, guardReactiveProps as Lt, withModifiers as rs, resolveDirective as as, withDirectives as Hr, vShow as ja, TransitionGroup as is, toHandlerKey as ss, withKeys as ls } from "vue";
|
||
import { forEach as Y, camelCase as Na, upperFirst as us, merge as ho, isString as br, toPath as cs, identity as ds, cloneDeep as dt, get as st, mergeWith as fs, cloneDeepWith as hs, isArray as jo, set as tt, remove as xa, size as ms, sortBy as Cn, pick as La, includes as ps, each as bt, map as gs, omit as wn, entries as zr, unset as No, forOwn as vs, toString as bs, debounce as ys, keys as qa } from "lodash-es";
|
||
import et from "dayjs";
|
||
import { Icon as ws } from "@iconify/vue";
|
||
import { useRoute as Ha } from "vue-router";
|
||
const no = {
|
||
commonOptions(e) {
|
||
return {};
|
||
},
|
||
defaultOptions(e) {
|
||
const { t } = e, n = (r) => M(() => t(r)), o = qe.get();
|
||
return {
|
||
settings: {
|
||
plugins: {
|
||
mobile: {
|
||
enabled: !0,
|
||
props: {
|
||
isMobile: M(() => window.innerWidth < 768)
|
||
}
|
||
}
|
||
}
|
||
},
|
||
mode: {},
|
||
status: {},
|
||
search: {
|
||
container: {
|
||
is: "fs-search-layout-default",
|
||
collapse: !0,
|
||
col: {
|
||
span: 4
|
||
}
|
||
},
|
||
formItem: {
|
||
wrapperCol: {
|
||
style: {
|
||
// width: "50%"
|
||
}
|
||
}
|
||
},
|
||
options: {
|
||
...o.form.inlineLayout,
|
||
// n-form 是否显示校验反馈
|
||
showFeedback: !1
|
||
},
|
||
onValidateError({ trigger: r }) {
|
||
r === "search" && o.notification.error({ message: t("fs.search.error.message") });
|
||
},
|
||
collapse: !0,
|
||
show: !0,
|
||
buttons: {
|
||
search: {
|
||
className: {
|
||
"fs-search-btn-search": !0
|
||
},
|
||
icon: o.icons.search
|
||
},
|
||
reset: {
|
||
className: {
|
||
"fs-search-btn-reset": !0
|
||
},
|
||
icon: o.icons.refresh
|
||
}
|
||
}
|
||
},
|
||
form: {
|
||
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: o.dialog.name,
|
||
...o.formWrapper.buildWidthBind(o.dialog.name, "960px"),
|
||
...o.formWrapper.buildInitBind(o.dialog.name),
|
||
dragenabled: !0,
|
||
destroyOnClose: !0,
|
||
...o.dialog.footer(),
|
||
buttons: {
|
||
cancel: {
|
||
text: n("fs.form.cancel"),
|
||
order: 1,
|
||
click: ({ doClose: r }) => {
|
||
r();
|
||
}
|
||
},
|
||
reset: {
|
||
text: n("fs.form.reset"),
|
||
order: 1,
|
||
click: ({ reset: r }) => {
|
||
r();
|
||
}
|
||
},
|
||
ok: {
|
||
text: n("fs.form.ok"),
|
||
order: 1,
|
||
type: "primary",
|
||
click: async ({ submit: r }) => {
|
||
await r();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
addForm: {
|
||
mode: "add",
|
||
wrapper: {
|
||
title: n("fs.addForm.title")
|
||
}
|
||
},
|
||
editForm: {
|
||
mode: "edit",
|
||
wrapper: {
|
||
title: n("fs.editForm.title")
|
||
}
|
||
},
|
||
viewForm: {
|
||
mode: "view",
|
||
wrapper: {
|
||
title: n("fs.viewForm.title"),
|
||
buttons: {
|
||
reset: {
|
||
show: !1
|
||
},
|
||
cancel: {
|
||
show: !1
|
||
}
|
||
}
|
||
}
|
||
},
|
||
rowHandle: {
|
||
width: 250,
|
||
title: n("fs.rowHandle.title"),
|
||
order: 1e3,
|
||
dropdown: {
|
||
// 操作列折叠
|
||
more: {
|
||
text: null,
|
||
type: "primary",
|
||
icon: o.icons.more
|
||
}
|
||
}
|
||
},
|
||
pagination: {
|
||
background: !0,
|
||
pageSize: 20,
|
||
[o.pagination.currentPage]: 1,
|
||
[o.pagination.total]: 1,
|
||
pageSizes: [5, 10, 20, 50],
|
||
layout: "total, sizes, prev, pager, next, jumper",
|
||
showSizeChanger: !0,
|
||
showQuickJumper: !0,
|
||
showSizePicker: !0,
|
||
showTotal: (r) => t("fs.pagination.showTotal", [r])
|
||
//antdv
|
||
},
|
||
table: {
|
||
show: !0,
|
||
height: "100%",
|
||
rowKey: o.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: n("fs.actionbar.add")
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
};
|
||
function _s() {
|
||
var t;
|
||
return (t = new Error().stack) == null ? void 0 : t.split(`
|
||
`)[3];
|
||
}
|
||
const qt = (...e) => {
|
||
};
|
||
function yr(...e) {
|
||
console.log.apply(this, arguments);
|
||
}
|
||
function Cs(...e) {
|
||
console.warn.apply(this, arguments);
|
||
}
|
||
function Ss(...e) {
|
||
console.error.apply(this, arguments);
|
||
}
|
||
const Fs = (...e) => {
|
||
Ss("%c [error]", "font-weight: 600;", ...e);
|
||
}, Rs = (...e) => {
|
||
Cs("%c [warn]", "font-weight: 600;", ...e);
|
||
}, ua = (...e) => {
|
||
yr("%c [info]", "font-weight: 600;", ...e);
|
||
}, Ds = (...e) => {
|
||
if (!console.log)
|
||
return;
|
||
const t = _s();
|
||
{
|
||
const n = ["%c [debug]", "font-weight: 600;", ...e];
|
||
yr(...n);
|
||
const o = ["%c " + t, "color:#999"];
|
||
yr(...o);
|
||
}
|
||
}, ce = {
|
||
debug: qt,
|
||
info: qt,
|
||
warn: qt,
|
||
error: qt,
|
||
log: qt
|
||
};
|
||
function ks(e = {}) {
|
||
const t = (e == null ? void 0 : e.level) || "info";
|
||
switch (ce.debug = qt, ce.info = qt, ce.warn = qt, ce.error = qt, ce.log = qt, t) {
|
||
case "debug":
|
||
ce.debug = Ds;
|
||
case "info":
|
||
ce.info = ua, ce.log = ua;
|
||
case "warn":
|
||
ce.warn = Rs;
|
||
case "error":
|
||
ce.error = Fs;
|
||
break;
|
||
}
|
||
}
|
||
ks();
|
||
function $s(e) {
|
||
return e == null || e === "";
|
||
}
|
||
function Os(...e) {
|
||
for (const t of e)
|
||
if (!(t == null || t === ""))
|
||
return !1;
|
||
return !1;
|
||
}
|
||
function Es(...e) {
|
||
for (const t of e)
|
||
if (t == null || t === "")
|
||
return !0;
|
||
return !1;
|
||
}
|
||
const Wr = {
|
||
isEmpty: $s,
|
||
isAllEmpty: Os,
|
||
hasEmpty: Es
|
||
};
|
||
function Ts(e, t = !1) {
|
||
t && Ji((n) => {
|
||
n.key, n.target, n.type;
|
||
});
|
||
}
|
||
function Ur(e) {
|
||
return Zi({
|
||
loader: e,
|
||
onError(t, n, o, r) {
|
||
console.error("load error", t), t.message.match(/fetch/) && r <= 3 ? n() : o();
|
||
}
|
||
});
|
||
}
|
||
function Is(e, t, n, o) {
|
||
const r = Ur(n);
|
||
e.component(t, r, o);
|
||
}
|
||
function As(e, t, n, o, r) {
|
||
const a = mo(t, o, r);
|
||
Y(a, (i, s) => {
|
||
n && n.indexOf(s) != -1 || Is(e, s, i, null);
|
||
});
|
||
}
|
||
function Vs(e, t, n, o, r) {
|
||
const a = mo(t, o, r);
|
||
Y(a, (i, s) => {
|
||
n && n.indexOf(s) || e.component(s, i.default);
|
||
});
|
||
}
|
||
function mo(e, t, n) {
|
||
const o = {};
|
||
return t == null && (t = /.*\/(.+).(vue|jsx|tsx)/), Y(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 = Na(s), s = us(s), n && (r = n(r)), o[s] = r;
|
||
}), o;
|
||
}
|
||
function Ps(e) {
|
||
const t = mo(e), n = {};
|
||
return Y(t, (o, r) => {
|
||
n[r] = Ur(o);
|
||
}), n;
|
||
}
|
||
function Ms(e) {
|
||
const t = mo(e), n = {};
|
||
return Y(t, (o, r) => {
|
||
n[r] = o.default;
|
||
}), n;
|
||
}
|
||
const Bs = {
|
||
transformFromGlob: mo,
|
||
installAsyncComponents: As,
|
||
installSyncComponents: Vs,
|
||
createAsyncComponent: Ur,
|
||
loadAsyncComponentFromGlob: Ps,
|
||
loadComponentFromGlob: Ms
|
||
};
|
||
class Kr {
|
||
constructor(t) {
|
||
ae(this, "remoteStorage");
|
||
ae(this, "$router");
|
||
ae(this, "tableName");
|
||
ae(this, "keyType");
|
||
ae(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 js = /\D/, Ns = /^[a-zA-Z_$]+([\w_$]*)$/, xs = /"/g;
|
||
function ca(...e) {
|
||
return e.reduce((t, n) => t ? !n || n.startsWith("[") ? `${t}${n}` : `${t}.${n}` : n, "");
|
||
}
|
||
function za(e) {
|
||
function t(n, ...o) {
|
||
if (o = o.filter((r) => r !== void 0), e.isString(n))
|
||
return ca(...o, n);
|
||
if (Array.isArray(n))
|
||
return o = ca(...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 ? js.test(a) ? Ns.test(a) ? r ? `${r}.${a}` : `${r}${a}` : `${r}["${a.replace(xs, '\\"')}"]` : `${r}[${a}]` : `${r}[""]`;
|
||
}, o);
|
||
}
|
||
return t;
|
||
}
|
||
za.notChainable = !0;
|
||
const Ls = /^[a-zA-Z_$]+([\w_$]*)$/, qs = /"/g, Wa = Object.prototype.hasOwnProperty;
|
||
function Hs(e) {
|
||
const t = typeof e;
|
||
return e != null && (t == "object" || t == "function");
|
||
}
|
||
function zs(e) {
|
||
const t = za(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 = fa(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, f) => {
|
||
const h = e.get(a.value, d), v = fa(h, i.ownPropertiesOnly);
|
||
v.isEmpty || a.children.push([d, i.strChildrenPath[f], h, 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 da(s, i, c);
|
||
d.setItem(a, !1);
|
||
try {
|
||
a.res = u(a.value, a.key, a.parent && a.parent.value, d);
|
||
} catch (f) {
|
||
throw f.message && (f.message += `
|
||
callback failed before deep iterate at:
|
||
` + t(a.path)), f;
|
||
}
|
||
}
|
||
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, f, h, v]) => {
|
||
a.childrenItems = [
|
||
...a.childrenItems,
|
||
...v.isArray ? o(a, h, i, d, f) : r(a, h, i, d, f)
|
||
];
|
||
})) : 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 da(s, i, c);
|
||
d.setItem(a, !0);
|
||
try {
|
||
u(a.value, a.key, a.parent && a.parent.value, d);
|
||
} catch (f) {
|
||
throw f.message && (f.message += `
|
||
callback failed after deep iterate at:
|
||
` + t(a.path)), f;
|
||
}
|
||
}
|
||
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 f = 0; f < i.length; f++) {
|
||
const h = i[f];
|
||
if (h === void 0 && !(f in i))
|
||
continue;
|
||
let v;
|
||
const p = !s.pathFormatArray;
|
||
p && (v = `${c}[${f}]`), d.push({
|
||
value: h,
|
||
key: f + "",
|
||
path: [...a.path || [], ...u, f + ""],
|
||
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 = [], f = !s.pathFormatArray;
|
||
for (const h in i) {
|
||
if (s.ownPropertiesOnly && !Wa.call(i, h))
|
||
continue;
|
||
let v;
|
||
f && (Ls.test(h) ? c ? v = `${c}.${h}` : v = `${h}` : v = `${c}["${h.replace(qs, '\\"')}"]`), d.push({
|
||
value: i[h],
|
||
key: h,
|
||
path: [...a.path || [], ...u, h],
|
||
strPath: v,
|
||
depth: a.depth + 1,
|
||
parent: {
|
||
value: a.value,
|
||
key: a.key,
|
||
path: f ? 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 da {
|
||
constructor(t, n, o) {
|
||
ae(this, "_item");
|
||
ae(this, "obj");
|
||
ae(this, "_options");
|
||
ae(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 Ws(e, t) {
|
||
for (const n in e)
|
||
if (!t || Wa.call(e, n))
|
||
return !1;
|
||
return !0;
|
||
}
|
||
function fa(e, t) {
|
||
const n = { isObject: Hs(e) };
|
||
return n.isArray = n.isObject && Array.isArray(e), n.isEmpty = n.isArray ? !e.length : n.isObject ? Ws(e, t) : !0, n;
|
||
}
|
||
function Us(e) {
|
||
const t = zs(e);
|
||
function n(o, r, a) {
|
||
if (r === void 0 && (r = ds), a = ho({
|
||
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)), !br(a.childrenPath) && !Array.isArray(a.childrenPath))
|
||
throw Error("childrenPath can be string or array");
|
||
br(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] = cs(a.strChildrenPath[i]);
|
||
}
|
||
return t({
|
||
value: o,
|
||
callback: r,
|
||
options: a,
|
||
obj: o
|
||
}), o;
|
||
}
|
||
return n;
|
||
}
|
||
const Ks = Us({ isString: br }), Ua = {
|
||
forEachDeep: Ks
|
||
}, Ys = {
|
||
/**
|
||
* 重构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;
|
||
}
|
||
}, _t = {
|
||
logger: ce,
|
||
strings: Wr,
|
||
trace: Ts,
|
||
vite: Bs,
|
||
store: Kr,
|
||
deepdash: Ua,
|
||
dash: Ys
|
||
};
|
||
function nr(e, t) {
|
||
return e.type !== "antdv" ? {} : { labelCol: { span: t }, wrapperCol: { span: 23 - t } };
|
||
}
|
||
function Gs() {
|
||
const { ui: e } = we();
|
||
return {
|
||
colspan: {
|
||
//跨列
|
||
form: {
|
||
col: { span: 24 },
|
||
...nr(e, 2)
|
||
}
|
||
},
|
||
colspan3: {
|
||
//跨列
|
||
form: {
|
||
col: { span: 24 },
|
||
...nr(e, 3)
|
||
}
|
||
},
|
||
colspan4: {
|
||
//跨列
|
||
form: {
|
||
col: { span: 24 },
|
||
...nr(e, 4)
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const Xs = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Gs
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Qs() {
|
||
const e = qe.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 Js = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Qs
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Zs() {
|
||
const e = qe.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 el = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Zs
|
||
}, Symbol.toStringTag, { value: "Module" })), Ka = {
|
||
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: "保存"
|
||
}
|
||
},
|
||
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: "还有文件正在上传,请等待上传完成,或删除它"
|
||
}
|
||
}
|
||
}
|
||
}, tl = {
|
||
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"
|
||
}
|
||
},
|
||
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 nl(e, t) {
|
||
let n = st(Ka, e);
|
||
return n == null ? e : t instanceof Array ? (Y(t, (o, r) => {
|
||
n = n.replace("{" + r + "}", o);
|
||
}), n) : n.replace("{n}", t);
|
||
}
|
||
class ol {
|
||
constructor() {
|
||
ae(this, "vueI18nInstance", null);
|
||
}
|
||
t(t, n) {
|
||
return nl(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: Ka.fs }), t.mergeLocaleMessage(o, { fs: a });
|
||
} else if (o.startsWith("en")) {
|
||
const r = t.getLocaleMessage(o), a = dt(r.fs || {});
|
||
t.mergeLocaleMessage(o, { fs: tl.fs }), t.mergeLocaleMessage(o, { fs: a });
|
||
}
|
||
ce.debug("i18n", t.getLocaleMessage(o));
|
||
}
|
||
this.vueI18nInstance = t;
|
||
}
|
||
}
|
||
const Do = new ol();
|
||
function lt() {
|
||
return Do.vueI18nInstance != null ? {
|
||
// @ts-ignore
|
||
t: Do.vueI18nInstance.t
|
||
} : { t: Do.t };
|
||
}
|
||
var Qo = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
|
||
function Jo(e) {
|
||
return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
|
||
}
|
||
var Ya = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(Qo, 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);
|
||
};
|
||
};
|
||
});
|
||
})(Ya);
|
||
var rl = Ya.exports;
|
||
const al = /* @__PURE__ */ Jo(rl);
|
||
et.extend(al);
|
||
function or(e, t) {
|
||
if (!Wr.isEmpty(e))
|
||
return et(e).format(t);
|
||
}
|
||
function Ga(e, t = "YYYY-MM-DD HH:mm:ss") {
|
||
if (e != null && e instanceof Array && e.length > 1) {
|
||
if (Wr.hasEmpty(e))
|
||
return;
|
||
const { t: n } = lt();
|
||
return `${or(e[0], t)} ${n("fs.date.formatter.to")} ${or(e[1], t)}`;
|
||
}
|
||
return or(e, t);
|
||
}
|
||
function il(e) {
|
||
const { value: t } = e;
|
||
return Ga(t, "YYYY-MM-DD");
|
||
}
|
||
function sl(e) {
|
||
const { value: t } = e;
|
||
return Ga(t, "YYYY-MM-DD HH:mm:ss");
|
||
}
|
||
var Xa = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(Qo, 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 f = i(this).startOf(o).date(l).startOf(n).subtract(1, "millisecond"), h = this.diff(f, n, !0);
|
||
return h < 0 ? i(this).startOf("week").week() : Math.ceil(h);
|
||
}, s.weeks = function(u) {
|
||
return u === void 0 && (u = null), this.week(u);
|
||
};
|
||
};
|
||
});
|
||
})(Xa);
|
||
var ll = Xa.exports;
|
||
const ul = /* @__PURE__ */ Jo(ll);
|
||
var Qa = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(Qo, 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");
|
||
};
|
||
};
|
||
});
|
||
})(Qa);
|
||
var cl = Qa.exports;
|
||
const dl = /* @__PURE__ */ Jo(cl);
|
||
var Ja = { exports: {} };
|
||
(function(e, t) {
|
||
(function(n, o) {
|
||
e.exports = o();
|
||
})(Qo, function() {
|
||
return function(n, o, r) {
|
||
var a = o.prototype, i = function(d) {
|
||
return d && (d.indexOf ? d : d.s);
|
||
}, s = function(d, f, h, v, p) {
|
||
var y = d.name ? d : d.$locale(), b = i(y[f]), R = i(y[h]), D = b || R.map(function(T) {
|
||
return T.slice(0, v);
|
||
});
|
||
if (!p)
|
||
return D;
|
||
var $ = y.weekStart;
|
||
return D.map(function(T, E) {
|
||
return D[(E + ($ || 0)) % 7];
|
||
});
|
||
}, u = function() {
|
||
return r.Ls[r.locale()];
|
||
}, l = function(d, f) {
|
||
return d.formats[f] || function(h) {
|
||
return h.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(v, p, y) {
|
||
return p || y.slice(1);
|
||
});
|
||
}(d.formats[f.toUpperCase()]);
|
||
}, c = function() {
|
||
var d = this;
|
||
return { months: function(f) {
|
||
return f ? f.format("MMMM") : s(d, "months");
|
||
}, monthsShort: function(f) {
|
||
return f ? f.format("MMM") : s(d, "monthsShort", "months", 3);
|
||
}, firstDayOfWeek: function() {
|
||
return d.$locale().weekStart || 0;
|
||
}, weekdays: function(f) {
|
||
return f ? f.format("dddd") : s(d, "weekdays");
|
||
}, weekdaysMin: function(f) {
|
||
return f ? f.format("dd") : s(d, "weekdaysMin", "weekdays", 2);
|
||
}, weekdaysShort: function(f) {
|
||
return f ? f.format("ddd") : s(d, "weekdaysShort", "weekdays", 3);
|
||
}, longDateFormat: function(f) {
|
||
return l(d.$locale(), f);
|
||
}, 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(f) {
|
||
return l(d, f);
|
||
}, 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);
|
||
};
|
||
};
|
||
});
|
||
})(Ja);
|
||
var fl = Ja.exports;
|
||
const hl = /* @__PURE__ */ Jo(fl);
|
||
et.extend(dl);
|
||
et.extend(hl);
|
||
et.extend(ul);
|
||
function ml() {
|
||
const e = qe.get();
|
||
function t(o) {
|
||
const { row: r, key: a, value: i } = o;
|
||
i != null && (e.type === "naive" ? r[a] = et(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: il },
|
||
valueBuilder({ row: o, key: r, value: a }) {
|
||
a != null && Array.isArray(a) && a.length === 2 && a != null && (e.type === "naive" ? o[r] = [et(a[0]).valueOf(), et(a[1]).valueOf()] : o[r] = [et(a[0]), et(a[1])]);
|
||
}
|
||
},
|
||
datetimerange: {
|
||
form: {
|
||
component: {
|
||
...e.datePicker.buildDateType("datetimerange"),
|
||
vModel: e.datePicker.modelValue
|
||
}
|
||
},
|
||
column: {
|
||
width: 340,
|
||
formatter: sl
|
||
},
|
||
valueBuilder({ row: o, key: r, value: a }) {
|
||
a != null && Array.isArray(a) && a.length === 2 && (e.type === "naive" ? o[r] = [et(a[0]).valueOf(), et(a[1]).valueOf()] : o[r] = [et(a[0]), et(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 pl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: ml
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function gl() {
|
||
const { ui: e } = we();
|
||
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 vl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: gl
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function bl() {
|
||
return {
|
||
icon: {
|
||
form: {
|
||
component: {
|
||
name: "fs-icon-selector",
|
||
vModel: "modelValue",
|
||
[qe.get().input.clearable]: !0
|
||
}
|
||
},
|
||
column: {
|
||
component: {
|
||
name: "fs-icon",
|
||
vModel: "icon",
|
||
style: "font-size:18px"
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const yl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: bl
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function wl() {
|
||
const e = qe.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: wl
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Cl() {
|
||
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 Sl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Cl
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Fl() {
|
||
const e = qe.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 Rl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Fl
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function Dl() {
|
||
const e = qe.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 kl = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: Dl
|
||
}, Symbol.toStringTag, { value: "Module" }));
|
||
function $l() {
|
||
const e = qe.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 Ol = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
default: $l
|
||
}, Symbol.toStringTag, { value: "Module" })), El = /* @__PURE__ */ Object.assign({ "./list/assist.ts": Xs, "./list/button.ts": Js, "./list/cascader.ts": el, "./list/date.ts": pl, "./list/el.ts": vl, "./list/icon.ts": yl, "./list/number.ts": _l, "./list/phone.ts": Sl, "./list/select.ts": Rl, "./list/text.ts": kl, "./list/tree.ts": Ol }), Za = [];
|
||
Y(El, (e) => {
|
||
Za.push(e.default);
|
||
});
|
||
const oo = {};
|
||
function Tl() {
|
||
return oo;
|
||
}
|
||
function Il(e) {
|
||
return oo[e];
|
||
}
|
||
function Al(e) {
|
||
for (const t in e)
|
||
oo[t] = e[t];
|
||
}
|
||
const $n = {
|
||
getType: Il,
|
||
addTypes: Al,
|
||
getTypes: Tl,
|
||
install() {
|
||
for (const e of Za)
|
||
Y(e(), (t, n) => {
|
||
oo[n] = t;
|
||
});
|
||
ce.debug("types installed:", oo);
|
||
}
|
||
}, Vl = le({
|
||
name: "FsPage",
|
||
setup() {
|
||
const e = K();
|
||
return _n(() => {
|
||
window.getComputedStyle(e.value.parentNode).getPropertyValue("position") !== "relative" && _t.logger.warn(
|
||
"fs-page父节点的position建议为relative,因为fs-page为相对定位(position:absolute),如果样式没有异常,你可以忽略此警告"
|
||
);
|
||
}), {
|
||
pageRef: e
|
||
};
|
||
}
|
||
});
|
||
const Oe = (e, t) => {
|
||
const n = e.__vccOpts || e;
|
||
for (const [o, r] of t)
|
||
n[o] = r;
|
||
return n;
|
||
}, Pl = {
|
||
ref: "pageRef",
|
||
class: "fs-page"
|
||
}, Ml = {
|
||
key: 0,
|
||
class: "fs-page-header"
|
||
}, Bl = { class: "fs-page-content" }, jl = {
|
||
key: 1,
|
||
class: "fs-page-footer"
|
||
};
|
||
function Nl(e, t, n, o, r, a) {
|
||
return w(), j("div", Pl, [
|
||
e.$slots.header != null ? (w(), j("div", Ml, [
|
||
re(e.$slots, "header")
|
||
])) : oe("", !0),
|
||
te("div", Bl, [
|
||
re(e.$slots, "default")
|
||
]),
|
||
e.$slots.footer != null ? (w(), j("div", jl, [
|
||
re(e.$slots, "footer")
|
||
])) : oe("", !0)
|
||
], 512);
|
||
}
|
||
const xl = /* @__PURE__ */ Oe(Vl, [["render", Nl]]);
|
||
function wr(e) {
|
||
return e != null && (e instanceof ei || Mo(e));
|
||
}
|
||
function ha(e) {
|
||
return wr(e) && !e.cloneable;
|
||
}
|
||
function Ll(e, ...t) {
|
||
function n(r, a) {
|
||
if (a != null && (jo(r) || wr(a)))
|
||
return a;
|
||
}
|
||
let o = null;
|
||
for (const r of t)
|
||
wr(r) && (o = r);
|
||
return o || fs(e, ...t, n);
|
||
}
|
||
function ql(e) {
|
||
if (ha(e))
|
||
return e;
|
||
function t(n) {
|
||
if (ha(n))
|
||
return n;
|
||
}
|
||
return hs(e, t);
|
||
}
|
||
let ei = class {
|
||
constructor() {
|
||
ae(this, "cloneable", !1);
|
||
}
|
||
setCloneable(t) {
|
||
this.cloneable = t;
|
||
}
|
||
};
|
||
function $e() {
|
||
return {
|
||
merge: Ll,
|
||
cloneDeep: ql,
|
||
UnMergeable: ei
|
||
};
|
||
}
|
||
const { cloneDeep: Hl } = $e();
|
||
function zl(e) {
|
||
return e instanceof Yr;
|
||
}
|
||
function Wl(e) {
|
||
return e instanceof Zo;
|
||
}
|
||
function ma(e, t, n) {
|
||
const o = {};
|
||
if (e == null)
|
||
return o;
|
||
const r = n ? zl : Wl;
|
||
return Ua.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 !es(a);
|
||
}, {
|
||
// https://deepdash.io/#eachdeep-foreachdeep
|
||
checkCircular: !0
|
||
}), o;
|
||
}
|
||
function Ul(e, t) {
|
||
if (e == null || Object.keys(e).length <= 0)
|
||
return null;
|
||
const n = {};
|
||
return Y(e, (o, r) => {
|
||
n[r] = o.buildAsyncRef(t);
|
||
}), n;
|
||
}
|
||
function Kl(e, t) {
|
||
t == null || Object.keys(t).length <= 0 || Y(t, (n, o) => {
|
||
tt(e, o, n.value == null ? null : n.value);
|
||
});
|
||
}
|
||
function Yl(e, t, n, o) {
|
||
const r = M(() => {
|
||
const s = e();
|
||
return ma(s, n, !1);
|
||
}), a = M(() => {
|
||
const s = e();
|
||
return ma(s, n, !0);
|
||
}), i = Ul(a.value, t);
|
||
return M(() => {
|
||
let s = e();
|
||
const u = Object.keys(a.value).length, l = Object.keys(r.value).length;
|
||
if (u > 0 || l > 0) {
|
||
if (s = Hl(s), l > 0) {
|
||
const c = t ? t() : {};
|
||
Y(r.value, (d, f) => {
|
||
tt(s, f, d.computeFn(c));
|
||
});
|
||
}
|
||
u > 0 && Kl(s, i);
|
||
}
|
||
return o ? o(s) : s;
|
||
});
|
||
}
|
||
class Zo {
|
||
constructor(t) {
|
||
ae(this, "computeFn");
|
||
this.computeFn = t;
|
||
}
|
||
}
|
||
function Gl(e) {
|
||
return new Zo(e);
|
||
}
|
||
class Yr {
|
||
constructor(t) {
|
||
ae(this, "watch");
|
||
ae(this, "asyncFn");
|
||
ae(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 = M(() => this.watch ? this.watch(t()) : null);
|
||
return it(() => o.value, async (r) => {
|
||
n.value = await this.asyncFn(r, t());
|
||
}, { immediate: !0 }), n;
|
||
}
|
||
}
|
||
function Xl(e) {
|
||
return new Yr(e);
|
||
}
|
||
function Pt() {
|
||
return {
|
||
ComputeValue: Zo,
|
||
compute: Gl,
|
||
AsyncComputeValue: Yr,
|
||
asyncCompute: Xl,
|
||
doComputed: Yl
|
||
};
|
||
}
|
||
const ln = {
|
||
orderDefault: 1
|
||
}, {
|
||
merge: At,
|
||
cloneDeep: Ut
|
||
} = $e(), qn = [];
|
||
function ti(e) {
|
||
xa(qn, (t) => t.name === e.name), qn.push(e), qn.sort((t, n) => t.order - n.order), ce.debug("mergeColumnPlugin register success: current:", e, "registered:", qn);
|
||
}
|
||
function Ql(e) {
|
||
var t, n;
|
||
if (e.dict) {
|
||
if ((t = e.column) != null && t.component) {
|
||
const o = Bo(Ut(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 = Bo(Ut(e.dict));
|
||
o.cloneable && (o.cloneable = !1), e.form.component.dict = At(o, e.form.component.dict);
|
||
}
|
||
}
|
||
return e;
|
||
}
|
||
function Jl(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 Nn = [];
|
||
Nn.push({
|
||
name: "type",
|
||
handle: Jl,
|
||
order: -2
|
||
});
|
||
Nn.push({
|
||
name: "dict",
|
||
handle: Ql,
|
||
order: -1
|
||
});
|
||
Nn.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 = (i) => {
|
||
const {
|
||
value: s
|
||
} = i;
|
||
return x("span", null, [s]);
|
||
}), At(e, {
|
||
viewForm: o
|
||
}), e;
|
||
}
|
||
});
|
||
Nn.push({
|
||
name: "NaiveFormRuleFix",
|
||
order: 10,
|
||
handle: (e = {}, t = {}) => {
|
||
var o, r, a, i, s;
|
||
const {
|
||
ui: n
|
||
} = we();
|
||
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;
|
||
}
|
||
});
|
||
Nn.push({
|
||
name: "DefaultOrder",
|
||
order: 0,
|
||
handle: (e = {}, t = {}, n) => (st(e, "column.order") == null && tt(e, "column.order", n), st(e, "form.order") == null && tt(e, "form.order", n), e)
|
||
});
|
||
for (const e of Nn)
|
||
ti(e);
|
||
function Gr(e, t) {
|
||
const n = {};
|
||
let o = 0;
|
||
return Y(e, (r, a) => {
|
||
if (r.key = a, r.children)
|
||
r.children = Gr(r.children, t);
|
||
else
|
||
for (const i of qn)
|
||
r = i.handle(r, t, o);
|
||
n[a] = r, o++;
|
||
}), n;
|
||
}
|
||
function Xr(e = {}, t) {
|
||
return Y(t, (n, o) => {
|
||
n.children ? Xr(e, n.children) : e[o] = n;
|
||
}), e;
|
||
}
|
||
function Qr(e = {}, t) {
|
||
return Y(t, (n, o) => {
|
||
n.children ? Qr(e, n.children) : e[o] = n;
|
||
}), e;
|
||
}
|
||
function Zl(e) {
|
||
const t = e, n = t.column || {};
|
||
return n.title == null && (n.title = t.title), n.key = t.key, t.children && (n.children = oi(t.children)), ni(n), yn(n);
|
||
}
|
||
function ni(e) {
|
||
var t;
|
||
e && (t = e.component) != null && t.name && typeof e.component.name != "string" && (Mo(e.component.name) || (e.component.name = ts(e.component.name)));
|
||
}
|
||
function oi(e) {
|
||
let t = {};
|
||
return Y(e, (n, o) => {
|
||
t[o] = Zl(n);
|
||
}), t = Jr(t), t;
|
||
}
|
||
function eu(e) {
|
||
return Cn(e, (t) => t.order ?? ln.orderDefault);
|
||
}
|
||
function Jr(e) {
|
||
const t = [];
|
||
for (const r in e) {
|
||
const a = e[r];
|
||
a.key = r, a.children && ms(a.children) > 0 && (a.children = Jr(a.children)), t.push(a);
|
||
}
|
||
const n = eu(t), o = {};
|
||
for (const r of n)
|
||
o[r.key] = r;
|
||
return o;
|
||
}
|
||
function ri(e, t) {
|
||
const n = {};
|
||
return Y(e, (o) => {
|
||
const r = Ut(o[t]) || {};
|
||
t === "form" && r.title == null && (r.title = o.title), r.key = o.key, n[o.key] = r, ni(r);
|
||
}), n;
|
||
}
|
||
function Hn(e, t, n, o) {
|
||
const r = ri(n, t), a = At(Ut(e.form), e[t], {
|
||
columns: r
|
||
});
|
||
return o && o(a), a;
|
||
}
|
||
function tu(e, t = "search", n) {
|
||
var s;
|
||
const o = ri(n, t), r = {}, a = ((s = e.settings) == null ? void 0 : s.searchCopyFormProps) ?? ["component", "valueChange", "title", "key", "label", "render"];
|
||
function i(u, l, c) {
|
||
if (ps(a, c) && e.columns[l]) {
|
||
const f = e.columns[l][c];
|
||
f && (u[c] = f);
|
||
}
|
||
}
|
||
return Y(Ut(e.form.columns), (u, l) => {
|
||
const c = {};
|
||
i(c, l, "valueResolve"), i(c, l, "valueBuilder"), r[l] = At(c, La(u, a));
|
||
}), At({
|
||
columns: r
|
||
}, {
|
||
columns: o
|
||
}, e.search);
|
||
}
|
||
function nu(e, t, n = "form") {
|
||
const {
|
||
t: o
|
||
} = lt(), {
|
||
merge: r
|
||
} = $e();
|
||
t = t || {};
|
||
const a = r(no.defaultOptions({
|
||
t: o
|
||
}), no.commonOptions({
|
||
crudOptions: e,
|
||
context: t,
|
||
crudExpose: null
|
||
}), e), i = Gr(Ut(a.columns), a), s = Xr({}, i), u = n === "form" ? "form" : `${n}Form`;
|
||
return Hn(a, u, s);
|
||
}
|
||
function ou(e) {
|
||
Y(e.columns, (o, r) => {
|
||
o.key = r;
|
||
});
|
||
const t = Gr(Ut(e.columns), e);
|
||
e.columns = t;
|
||
const n = Xr({}, t);
|
||
return e.table.columns = oi(Ut(t)), e.table.columnsMap = Qr({}, e.table.columns), At(e.toolbar, {
|
||
columnsFilter: {
|
||
originalColumns: Ut(e.table.columns)
|
||
}
|
||
}), e.form = Hn(e, "form", n), e.addForm = Hn(e, "addForm", n), e.editForm = Hn(e, "editForm", n), e.viewForm = Hn(e, "viewForm", n, (o) => {
|
||
Y(o.columns, (r) => {
|
||
r.component || (r.component = {}), r.component.disabled = !0;
|
||
});
|
||
}), e.search = tu(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 _r(e, t) {
|
||
Y(e, (n, o) => {
|
||
n.key || (n.key = o), n.children ? _r(n.children, t) : t(n, o);
|
||
});
|
||
}
|
||
function xo(e, t) {
|
||
Y(e, (n, o) => {
|
||
n.key || (n.key = o), n.children ? xo(n.children, t) : t(n, o);
|
||
});
|
||
}
|
||
function Zr() {
|
||
return {
|
||
buildFormOptions: nu,
|
||
buildColumns: ou,
|
||
registerMergeColumnPlugin: ti,
|
||
forEachColumns: xo,
|
||
doColumnsSort: Jr
|
||
};
|
||
}
|
||
let ru = 0;
|
||
const rr = {};
|
||
async function au(e) {
|
||
const t = e.id || `${ru++}`, n = document.createElement("div");
|
||
return new Promise((o, r) => {
|
||
let a = rr[t];
|
||
a != null && (a.vm.exposed.open(e), o(a));
|
||
const i = x(ro, {
|
||
id: t,
|
||
onClosed() {
|
||
e.id || delete rr[t];
|
||
}
|
||
});
|
||
i.appContext = ro._context, ns(i, n), document.body.appendChild(n);
|
||
const u = i.component;
|
||
a = {
|
||
id: t,
|
||
vNode: i,
|
||
vm: u,
|
||
props: i.component.props
|
||
}, rr[t] = a, a.vm.exposed.open(e), o(a.vm.exposed);
|
||
});
|
||
}
|
||
function iu() {
|
||
let e = null;
|
||
try {
|
||
e = jn("use:form:wrapper", () => {
|
||
})();
|
||
} catch (o) {
|
||
ce.warn("cant inject use:form:wrapper,建议在App.vue中使用<fs-form-provider>组件包裹<router-view/>", o);
|
||
}
|
||
let t = null;
|
||
e == null ? t = async (o) => await au(o) : t = async (o) => await e.open(o);
|
||
async function n(o) {
|
||
const { buildFormOptions: r } = Zr(), a = r(o.crudOptions, o.context);
|
||
return await t(a);
|
||
}
|
||
return {
|
||
openDialog: t,
|
||
openCrudFormDialog: n
|
||
};
|
||
}
|
||
const { merge: ai } = $e(), su = ai;
|
||
function lu(e) {
|
||
const { crudExpose: t } = e, { crudBinding: n } = t;
|
||
we(), lt();
|
||
const { merge: o } = $e();
|
||
it(() => {
|
||
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 h, v;
|
||
const { isAdd: l, row: c, setData: d } = u, f = c;
|
||
if (((v = (h = n.value) == null ? void 0 : h.mode) == null ? void 0 : v.name) !== "local")
|
||
try {
|
||
if (s.loading = !0, l) {
|
||
const p = await n.value.request.addRequest({ form: f });
|
||
d(p);
|
||
} else
|
||
await n.value.request.editRequest({ form: f, row: f });
|
||
} 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 ii(e) {
|
||
const { crudRef: t, crudBinding: n } = e, { ui: o } = we(), { t: r } = lt(), a = iu();
|
||
function i() {
|
||
t.value == null && ce.warn("crudRef还未初始化,请在onMounted之后调用");
|
||
}
|
||
function s() {
|
||
n.value == null && ce.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) {
|
||
ce.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 = Ln(n.value.columns)), ce.debug("doValueBuilder ,columns=", c);
|
||
const d = [];
|
||
xo(c, (f) => {
|
||
f.valueBuilder != null && d.push(f);
|
||
}), d.length !== 0 && (Y(l, (f, h) => {
|
||
Y(d, (v) => {
|
||
v.valueBuilder({
|
||
value: f[v.key],
|
||
row: f,
|
||
form: f,
|
||
index: h,
|
||
key: v.key,
|
||
column: v
|
||
});
|
||
}), f.children && jo(f.children) && u.doValueBuilder(f.children, c);
|
||
}), ce.debug("valueBuilder success:", l));
|
||
},
|
||
doValueResolve({ form: l }, c) {
|
||
c == null && (c = Ln(n.value.columns));
|
||
const d = [];
|
||
xo(c, (f) => {
|
||
f.valueResolve != null && d.push(f);
|
||
}), d.length !== 0 && (ce.debug("doValueResolve ,columns=", c), Y(d, (f) => {
|
||
const h = f.key;
|
||
f.valueResolve({
|
||
value: l[h],
|
||
row: l,
|
||
form: l,
|
||
key: h,
|
||
column: f
|
||
});
|
||
}), ce.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 }, Ln(n.value.search.columns)));
|
||
let f = l.sort;
|
||
f == null && (f = n.value.table.sort || {});
|
||
const h = { page: c, form: d, sort: f };
|
||
let v = h;
|
||
return n.value.request.transformQuery && (v = n.value.request.transformQuery(h)), v;
|
||
},
|
||
async search(l, c = {}) {
|
||
const d = u.buildPageQuery(l);
|
||
let f;
|
||
const h = q(n.value.table.disableLoading);
|
||
try {
|
||
c.silence !== !0 && h !== !0 && (n.value.table.loading = !0), ce.debug("pageRequest", d), f = await n.value.request.pageRequest(d);
|
||
} finally {
|
||
n.value.table.loading = !1;
|
||
}
|
||
if (f == null) {
|
||
ce.warn("pageRequest返回结果不能为空");
|
||
return;
|
||
}
|
||
let v = f;
|
||
return n.value.request.transformRes && (v = n.value.request.transformRes({
|
||
res: f,
|
||
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;
|
||
ce.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) {
|
||
ce.error("pageRequest返回结构不正确,请配置正确的request.transformRes,期望:{currentPage>0, pageSize>0, total, records:[]},实际返回:", d);
|
||
return;
|
||
}
|
||
const { currentPage: f = c.currentPage || 1, pageSize: h = c.pageSize, total: v } = d, { records: p } = d;
|
||
if (p == null || !(p instanceof Array) || v == null || f == null || f <= 0 || isNaN(f) || h == null || h <= 0 || isNaN(h)) {
|
||
ce.error("pageRequest返回结构不正确,请配置正确的request.transformRes,期望:{currentPage>0, pageSize>0, total, records:[]},实际返回:", d), ce.info("如果你的不需要分页,也需要按照上面的格式返回,可以让pageSize=99999,然后配置crudOptions.pagination.show=false来隐藏分页组件");
|
||
return;
|
||
}
|
||
if (n.value.data = p, n.value.pagination && (n.value.pagination[o.pagination.currentPage] = f, n.value.pagination.pageSize = h, n.value.pagination[o.pagination.total] = v || p.length), (l == null ? void 0 : l.scrollTop) ?? n.value.table.scrollTopOnRefreshed) {
|
||
const R = u.getTableRef();
|
||
R == null || R.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) {
|
||
ce.debug("do search:", l), l = ai({ 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) {
|
||
ce.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] = su(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 f = c[d];
|
||
if (f[n.value.table.rowKey] === l)
|
||
return c.splice(d, 1), !0;
|
||
if (f.children && jo(f.children) && u.removeTableRowByRowKey(l, f.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 f = null;
|
||
const h = ((p = n.value.mode) == null ? void 0 : p.name) === "local";
|
||
if (c != null && c.handle ? f = await c.handle(l) : h ? u.removeTableRow(l == null ? void 0 : l.index) : f = await n.value.request.delRequest(l), f === !1)
|
||
return;
|
||
const v = { ...l, res: f };
|
||
if (d.afterRemove && await d.afterRemove(v) === !1)
|
||
return !1;
|
||
d.showSuccessNotification !== !1 && o.notification.success(r("fs.rowHandle.remove.success")), h || d.refreshTable !== !1 && await u.doRefresh({ scrollTop: !1 }), d.onRemoved && await d.onRemoved({ ...l, res: f });
|
||
},
|
||
/**
|
||
*
|
||
* 打开表单对话框
|
||
* @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: f } = $e();
|
||
let h = c.row || c[o.tableColumn.row];
|
||
delete c.row, h == null && c.index != null && (h = u.getTableDataRow(c.index)), (b = (y = n.value) == null ? void 0 : y.request) != null && b.infoRequest && (h = await n.value.request.infoRequest({ mode: l, row: h }));
|
||
const v = {
|
||
mode: l
|
||
}, p = Ln(n.value[l + "Form"]);
|
||
return f(v, p, { initialForm: h }, 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 = lu({ crudExpose: u }), { expose: u, crudExpose: u };
|
||
}
|
||
async function uu() {
|
||
const e = await /* @__PURE__ */ Object.assign({ "./lib/index.ts": () => import("./index-88684a06.mjs") });
|
||
let t = null;
|
||
return bt(e, (o) => {
|
||
t = o;
|
||
}), (await t()).exportUtil;
|
||
}
|
||
async function cu() {
|
||
const e = await /* @__PURE__ */ Object.assign({ "./lib/index.ts": () => import("./index-88684a06.mjs") });
|
||
let t = null;
|
||
return bt(e, (o) => {
|
||
t = o;
|
||
}), (await t()).importUtil;
|
||
}
|
||
function du({ 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 = gs(s, (l) => a.getLabel(l) || a.getValue(l)).join("|");
|
||
u != null && u !== "" && (t[n] = u);
|
||
}
|
||
}
|
||
return t;
|
||
}
|
||
async function fu(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 uu(), 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 f = d.columnProps, h = {
|
||
row: c,
|
||
originalRow: l,
|
||
key: d.key,
|
||
col: f,
|
||
exportCol: d
|
||
};
|
||
t.autoUseDictLabel !== !1 && du(h), t.dataFormatter && t.dataFormatter(h);
|
||
}), 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 up(e, t) {
|
||
const o = await (await cu()).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 si = {};
|
||
function li(e, t, n = {}) {
|
||
si[e] = {
|
||
handle: t,
|
||
opts: n
|
||
};
|
||
}
|
||
function hu(e) {
|
||
return si[e];
|
||
}
|
||
li("rowSelection", (e, t, n) => {
|
||
const r = t.crudExpose.crudBinding;
|
||
function a() {
|
||
return r.value.table.rowKey || "id";
|
||
}
|
||
const { ui: i } = we();
|
||
if (!e) {
|
||
ce.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: () => Pt(),
|
||
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 Be(), e.onSelectedChanged && e.onSelectedChanged(l.value);
|
||
}
|
||
});
|
||
}, {
|
||
before: !0,
|
||
order: -2
|
||
});
|
||
li("mobile", (e, t, n) => {
|
||
const o = n.rowHandle, r = o.buttons;
|
||
let a = {};
|
||
for (const s in r) {
|
||
const u = r[s];
|
||
Mo(u.dropdown) ? a = u : a[s] = {
|
||
...u,
|
||
dropdown: M(() => e.isMobile.value ? !0 : u.dropdown)
|
||
};
|
||
}
|
||
let i = o.width;
|
||
return (i == null || !Mo(i)) && (i = M(() => {
|
||
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: Xt } = $e();
|
||
function mu(e) {
|
||
e.context == null && (e.context = {});
|
||
const t = qe.get(), { t: n } = lt(), o = (F) => M(() => n(F));
|
||
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(V) {
|
||
s.value.pagination[t.pagination.currentPage] = V;
|
||
},
|
||
setPageSize(V) {
|
||
s.value.pagination.pageSize = V, s.value.pagination[t.pagination.currentPage] = 1;
|
||
},
|
||
async doAfterChange() {
|
||
return await u();
|
||
}
|
||
})
|
||
}
|
||
};
|
||
}
|
||
function d() {
|
||
return {
|
||
form: {
|
||
async doSubmit(F) {
|
||
var V, ne, L, A;
|
||
if (F.mode === "edit")
|
||
if (l(F), ((V = r.mode) == null ? void 0 : V.name) === "local")
|
||
i.updateTableRow(F.index, F.form, r.mode.isMergeWhenUpdate);
|
||
else
|
||
return (ne = s.value.request) != null && ne.editRequest || ce.warn("request.editRequest 未定义,无法保存"), await s.value.request.editRequest(F);
|
||
else if (F.mode === "add")
|
||
if (l(F), ((L = r.mode) == null ? void 0 : L.name) === "local") {
|
||
const k = r.mode.isAppendWhenAdd ? i.getTableData().length : 0;
|
||
i.insertTableRow(k, F.form);
|
||
} else
|
||
return (A = s.value.request) != null && A.addRequest || ce.warn("request.addRequest 未定义,无法保存"), await s.value.request.addRequest(F);
|
||
},
|
||
async onSuccess({ mode: F }) {
|
||
F === "edit" ? await u({ scrollTop: !1 }) : F === "add" ? await u({ scrollTop: !0, goFirstPage: !0 }) : await u();
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function f() {
|
||
return {
|
||
rowHandle: {
|
||
buttons: {
|
||
remove: {
|
||
click: async (F) => {
|
||
F.row = F[t.tableColumn.row], await i.doRemove(F);
|
||
}
|
||
},
|
||
copy: {
|
||
show: !1,
|
||
click: async (F) => {
|
||
F.row = F[t.tableColumn.row], await i.openCopy({
|
||
row: F.row,
|
||
index: F.index
|
||
});
|
||
}
|
||
},
|
||
edit: {
|
||
click: async (F) => {
|
||
F.row = F[t.tableColumn.row], await i.openEdit({
|
||
row: F.row,
|
||
index: F.index
|
||
});
|
||
}
|
||
},
|
||
view: {
|
||
click: async (F) => {
|
||
F.row = F[t.tableColumn.row], await i.openView({
|
||
row: F.row,
|
||
index: F.index
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function h() {
|
||
return {
|
||
search: {
|
||
buttons: {
|
||
search: {
|
||
loading: M(() => {
|
||
var F, V;
|
||
return (V = (F = s.value) == null ? void 0 : F.table) == null ? void 0 : V.loading;
|
||
})
|
||
}
|
||
},
|
||
on_reset() {
|
||
s.value.table.sort = {}, _r(s.value.table.columns, (V) => {
|
||
V.sortOrder = !1;
|
||
});
|
||
const F = a.getBaseTableRef();
|
||
F != null && F.clearSort && F.clearSort();
|
||
},
|
||
on_search() {
|
||
a.doRefresh({ goFirstPage: !0 });
|
||
},
|
||
"onUpdate:form": (F) => {
|
||
s.value.search.form = F;
|
||
},
|
||
"onUpdate:validatedForm": (F) => {
|
||
s.value.search.validatedForm = F;
|
||
},
|
||
"onUpdate:collapse": (F) => {
|
||
s.value.search.collapse = F;
|
||
},
|
||
container: {
|
||
collapse: !0,
|
||
"onUpdate:collapse": (F) => {
|
||
s.value.search.container.collapse = F;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function v() {
|
||
return {
|
||
tabs: {},
|
||
onTabChange(F) {
|
||
a.setSearchFormData({ form: F, mergeForm: !0 }), u();
|
||
}
|
||
};
|
||
}
|
||
function p() {
|
||
const F = 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: M(() => 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: M(() => 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: F,
|
||
title: o("fs.toolbar.export.title"),
|
||
circle: !0,
|
||
click: async () => {
|
||
F.value = !0;
|
||
try {
|
||
await fu(a, s.value.toolbar.export);
|
||
} finally {
|
||
F.value = !1;
|
||
}
|
||
}
|
||
},
|
||
columns: {
|
||
type: "primary",
|
||
icon: t.icons.columnsFilter,
|
||
title: o("fs.toolbar.columns.title"),
|
||
circle: !0,
|
||
order: 5
|
||
}
|
||
},
|
||
"onUpdate:columns"(V) {
|
||
const ne = s.value.table.columns;
|
||
function L(k, N) {
|
||
const J = {};
|
||
return Y(N, (ue) => {
|
||
const Z = k[ue.key];
|
||
if (Z) {
|
||
if (Z.columnSetShow === !1) {
|
||
J[ue.key] = Z;
|
||
return;
|
||
}
|
||
delete Z.order;
|
||
const Se = Xt({ ...Z }, ue);
|
||
J[ue.key] = Se, Z.children && (Se.children = L(Z.children, ue.children));
|
||
}
|
||
}), J;
|
||
}
|
||
const A = L(ne, V);
|
||
s.value.table.columns = A, s.value.table.columnsMap = Qr({}, A);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function y() {
|
||
return {
|
||
table: {
|
||
onSortChange(F) {
|
||
const { isServerSort: V, prop: ne, asc: L, order: A } = F;
|
||
_r(s.value.table.columns, (N) => {
|
||
N.key === ne ? N.sortOrder = A : N.sortOrder = !1;
|
||
});
|
||
const k = s.value.table.sort;
|
||
s.value.table.sort = V ? { prop: ne, order: A, asc: L } : null, (V || k != null) && i.doRefresh();
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function b() {
|
||
return {
|
||
actionbar: {
|
||
buttons: {
|
||
add: {
|
||
click() {
|
||
i.openAdd({});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function R() {
|
||
const { compute: F } = Pt();
|
||
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 (V) => {
|
||
const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey];
|
||
await i.editable.doRemoveRow({ editableId: A, row: L });
|
||
}
|
||
}
|
||
},
|
||
editRow: {
|
||
edit: {
|
||
text: "编辑",
|
||
loading: F((V) => {
|
||
const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey], k = i.editable.getEditableRow(A);
|
||
return !!(k != null && k.loading);
|
||
}),
|
||
click: async (V) => {
|
||
var k;
|
||
const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey];
|
||
if (s.value.table.editable.exclusive) {
|
||
const N = i.editable.getActiveRows();
|
||
Y(N, (J) => {
|
||
s.value.table.editable.exclusiveEffect === "save" ? i.editable.doSaveRow({ row: J.rowData }) : i.editable.doCancelRow({ row: J.rowData });
|
||
});
|
||
}
|
||
(k = i.editable.getEditableRow(A)) == null || k.active();
|
||
},
|
||
show: F((V) => {
|
||
var k, N;
|
||
const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey];
|
||
return !((N = (k = i.editable) == null ? void 0 : k.getEditableRow(A)) != null && N.isEditing);
|
||
})
|
||
},
|
||
save: {
|
||
text: "保存",
|
||
loading: !1,
|
||
click: async (V) => {
|
||
const { index: ne, row: L } = V;
|
||
await i.editable.doSaveRow({ row: L });
|
||
},
|
||
show: F((V) => {
|
||
var k, N;
|
||
const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey];
|
||
return !!((N = (k = i.editable) == null ? void 0 : k.getEditableRow(A)) != null && N.isEditing);
|
||
})
|
||
},
|
||
cancel: {
|
||
text: "取消",
|
||
click: async (V) => {
|
||
var A;
|
||
const { index: ne, row: L } = V;
|
||
await ((A = i.editable) == null ? void 0 : A.doCancelRow({ row: L }));
|
||
},
|
||
show: F((V) => {
|
||
var k, N;
|
||
const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey];
|
||
return !!((N = (k = i.editable) == null ? void 0 : k.getEditableRow(A)) != null && N.isEditing);
|
||
})
|
||
},
|
||
remove: {
|
||
text: "删除",
|
||
...t.button.colors("danger"),
|
||
click: async (V) => {
|
||
var k;
|
||
const { index: ne, row: L } = V, A = L[s.value.table.editable.rowKey];
|
||
await ((k = i.editable) == null ? void 0 : k.doRemoveRow({ row: L, editableId: A }));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
}
|
||
const { cloneDeep: D } = $e();
|
||
function $(F) {
|
||
F.search.validatedForm = D(F.search.initialForm);
|
||
}
|
||
function T(F) {
|
||
let V = D(F);
|
||
const ne = no.commonOptions(e), L = no.defaultOptions({ t: n });
|
||
r = Xt({}, L, ne, V);
|
||
const A = q(r.settings);
|
||
if (A) {
|
||
const ue = q(A.plugins);
|
||
Y(ue, (Z, Se) => {
|
||
if (Z.enabled === !1)
|
||
return;
|
||
let ke = Z.handle, m = {};
|
||
if (ke == null) {
|
||
const S = hu(Se);
|
||
S != null && (ke = S.handle, m = S.opts);
|
||
}
|
||
if (ke == null)
|
||
return;
|
||
const C = Z.before ?? m.before, _ = ke(Z.props, e, r);
|
||
C !== !1 ? V = Xt(_, V) : V = Xt(V, _);
|
||
});
|
||
}
|
||
const k = Xt(L, c(), d(), f(), h(), v(), p(), y(), b(), R(), ne, V), { buildColumns: N } = Zr(), J = N(k);
|
||
return $(J), J;
|
||
}
|
||
function E(F) {
|
||
s.value = T(F), ce.info("fast-crud inited, crudBinding=", s.value);
|
||
}
|
||
function P(F) {
|
||
const V = Xt({}, r, F);
|
||
return E(V), r = V, V;
|
||
}
|
||
E(r);
|
||
function W(F) {
|
||
Xt(s.value, F);
|
||
}
|
||
return {
|
||
appendCrudOptions: P,
|
||
resetCrudOptions: E,
|
||
appendCrudBinding: W,
|
||
rebuildCrudBindings: T
|
||
};
|
||
}
|
||
function ui(e) {
|
||
const { createCrudOptions: t, crudExposeRef: n } = e, o = e.crudRef || K(), r = e.crudBinding || K({});
|
||
let a = e.crudExpose;
|
||
a || (a = ii({ 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 };
|
||
Xt(l.crudOptions, e.crudOptionsOverride);
|
||
const d = mu(c);
|
||
return {
|
||
...l,
|
||
...d,
|
||
crudRef: o,
|
||
crudExpose: a,
|
||
crudBinding: r,
|
||
context: i
|
||
};
|
||
}
|
||
return s instanceof Promise ? s.then((l) => u(l)) : u(s);
|
||
}
|
||
function cp(e) {
|
||
return ui(e);
|
||
}
|
||
function pu(e) {
|
||
return ui(e);
|
||
}
|
||
function gu() {
|
||
const e = K(), t = K(), n = {}, { crudExpose: o } = ii({ crudBinding: t, crudRef: e });
|
||
return {
|
||
crudRef: e,
|
||
crudBinding: t,
|
||
context: n,
|
||
crudExpose: o
|
||
};
|
||
}
|
||
function un(e, t, n = "modelValue") {
|
||
const o = qe.get();
|
||
let r = e.dict;
|
||
r && r.prototype && (r.clear(), r = Bo(dt(e.dict)), r.cloneable = !1, r.clear());
|
||
function a() {
|
||
return M(() => {
|
||
let E = [];
|
||
if (e.options ? E = e.options : r && r.data != null && (r.data instanceof Array || _t.logger.warn("dict.data类型错误,期望为数组,实际:", r.data), E = r.data, e.transformDictData && (E = e.transformDictData(dt(r.data)))), o.type === "naive") {
|
||
const P = [];
|
||
for (const W of E)
|
||
P.push({
|
||
...W,
|
||
value: R(W),
|
||
label: $(W)
|
||
});
|
||
return P;
|
||
}
|
||
return E;
|
||
});
|
||
}
|
||
function i() {
|
||
return r;
|
||
}
|
||
const s = jn("get:scope", function() {
|
||
});
|
||
function u() {
|
||
const E = e[n] || t.attrs[n];
|
||
return {
|
||
...s(),
|
||
componentRef: l,
|
||
value: E
|
||
};
|
||
}
|
||
const { proxy: l } = Go(), c = async (E = !1) => {
|
||
if (!r)
|
||
return;
|
||
if (r.getNodesByValues) {
|
||
const W = u();
|
||
if (W.value == null)
|
||
return;
|
||
let F = W.value;
|
||
Array.isArray(W.value) || (F = [W.value]), await r.appendByValues(F);
|
||
return;
|
||
}
|
||
if (r.loading)
|
||
return;
|
||
const P = u();
|
||
if (E) {
|
||
await r.reloadDict(P);
|
||
return;
|
||
}
|
||
await r.loadDict(P);
|
||
};
|
||
c();
|
||
const d = async () => {
|
||
await c(!0);
|
||
}, f = () => {
|
||
r && r.clear();
|
||
}, h = () => {
|
||
r != null && (!r.prototype && !r.cloneable || it(() => e[n], () => {
|
||
d();
|
||
}));
|
||
};
|
||
(() => {
|
||
it(() => r == null ? void 0 : r.data, () => {
|
||
const E = u();
|
||
t.attrs.onDictChange, t.emit("dict-change", { dict: r, ...E });
|
||
}, {
|
||
immediate: !0
|
||
});
|
||
})();
|
||
const p = () => {
|
||
var E;
|
||
return (E = i()) == null ? void 0 : E.data;
|
||
}, y = (E, P) => {
|
||
let W = P;
|
||
return i() && (W = i()[P]), E[W];
|
||
}, b = (E, P) => {
|
||
let W = P;
|
||
i() && (W = i()[P]), delete E[W];
|
||
}, R = (E) => y(E, "value"), D = (E) => y(E, "children"), $ = (E) => {
|
||
if (e.labelFormatter)
|
||
return e.labelFormatter(E);
|
||
const P = y(E, "label");
|
||
return P == null ? "" : String(P);
|
||
};
|
||
return {
|
||
createComputedOptions: a,
|
||
loadDict: c,
|
||
reloadDict: d,
|
||
clearDict: f,
|
||
getDictData: p,
|
||
getDict: i,
|
||
watchValue: h,
|
||
getValue: R,
|
||
getLabel: $,
|
||
getChildren: D,
|
||
getColor: (E) => y(E, "color"),
|
||
removePropValue: b,
|
||
curDict: r
|
||
};
|
||
}
|
||
const Sn = typeof performance == "object" && performance && typeof performance.now == "function" ? performance : Date, ci = /* @__PURE__ */ new Set(), Cr = typeof process == "object" && process ? process : {}, di = (e, t, n, o) => {
|
||
typeof Cr.emitWarning == "function" ? Cr.emitWarning(e, t, n, o) : console.error(`[${n}] ${t}: ${e}`);
|
||
};
|
||
let Lo = globalThis.AbortController, pa = globalThis.AbortSignal;
|
||
var Ba;
|
||
if (typeof Lo > "u") {
|
||
pa = class {
|
||
constructor() {
|
||
ae(this, "onabort");
|
||
ae(this, "_onabort", []);
|
||
ae(this, "reason");
|
||
ae(this, "aborted", !1);
|
||
}
|
||
addEventListener(o, r) {
|
||
this._onabort.push(r);
|
||
}
|
||
}, Lo = class {
|
||
constructor() {
|
||
ae(this, "signal", new pa());
|
||
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 = ((Ba = Cr.env) == null ? void 0 : Ba.LRU_CACHE_IGNORE_AC_WARNING) !== "1";
|
||
const t = () => {
|
||
e && (e = !1, di("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 vu = (e) => !ci.has(e), Qt = (e) => e && e === Math.floor(e) && e > 0 && isFinite(e), fi = (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 ? ko : null : null;
|
||
class ko extends Array {
|
||
constructor(t) {
|
||
super(t), this.fill(0);
|
||
}
|
||
}
|
||
var Tn;
|
||
const mn = class mn {
|
||
constructor(t, n) {
|
||
ae(this, "heap");
|
||
ae(this, "length");
|
||
if (!g(mn, Tn))
|
||
throw new TypeError("instantiate Stack using Stack.create(n)");
|
||
this.heap = new n(t), this.length = 0;
|
||
}
|
||
static create(t) {
|
||
const n = fi(t);
|
||
if (!n)
|
||
return [];
|
||
fe(mn, Tn, !0);
|
||
const o = new mn(t, n);
|
||
return fe(mn, Tn, !1), o;
|
||
}
|
||
push(t) {
|
||
this.heap[this.length++] = t;
|
||
}
|
||
pop() {
|
||
return this.heap[--this.length];
|
||
}
|
||
};
|
||
Tn = new WeakMap(), // private constructor
|
||
pe(mn, Tn, !1);
|
||
let Sr = mn;
|
||
var Rt, mt, Dt, kt, In, An, Ue, $t, ze, Ae, ge, rt, pt, Ze, Ge, Ot, Xe, Et, Tt, gt, It, on, at, io, Rr, gn, Wt, so, vt, Yo, hi, vn, Vn, lo, jt, Jt, Nt, Zt, uo, Dr, Zm, Pn, $o, Mn, Oo, Ee, Ie, co, kr, bn, zn, xt, en, fo, $r;
|
||
const ra = class ra {
|
||
constructor(t) {
|
||
pe(this, io);
|
||
pe(this, Yo);
|
||
pe(this, jt);
|
||
pe(this, Nt);
|
||
pe(this, uo);
|
||
pe(this, Pn);
|
||
pe(this, Mn);
|
||
pe(this, Ee);
|
||
pe(this, co);
|
||
pe(this, bn);
|
||
pe(this, xt);
|
||
pe(this, fo);
|
||
// options that cannot be changed without disaster
|
||
pe(this, Rt, void 0);
|
||
pe(this, mt, void 0);
|
||
pe(this, Dt, void 0);
|
||
pe(this, kt, void 0);
|
||
pe(this, In, void 0);
|
||
pe(this, An, void 0);
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ttl}
|
||
*/
|
||
ae(this, "ttl");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ttlResolution}
|
||
*/
|
||
ae(this, "ttlResolution");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ttlAutopurge}
|
||
*/
|
||
ae(this, "ttlAutopurge");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.updateAgeOnGet}
|
||
*/
|
||
ae(this, "updateAgeOnGet");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.updateAgeOnHas}
|
||
*/
|
||
ae(this, "updateAgeOnHas");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.allowStale}
|
||
*/
|
||
ae(this, "allowStale");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noDisposeOnSet}
|
||
*/
|
||
ae(this, "noDisposeOnSet");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noUpdateTTL}
|
||
*/
|
||
ae(this, "noUpdateTTL");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.maxEntrySize}
|
||
*/
|
||
ae(this, "maxEntrySize");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.sizeCalculation}
|
||
*/
|
||
ae(this, "sizeCalculation");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}
|
||
*/
|
||
ae(this, "noDeleteOnFetchRejection");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.noDeleteOnStaleGet}
|
||
*/
|
||
ae(this, "noDeleteOnStaleGet");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}
|
||
*/
|
||
ae(this, "allowStaleOnFetchAbort");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}
|
||
*/
|
||
ae(this, "allowStaleOnFetchRejection");
|
||
/**
|
||
* {@link LRUCache.OptionsBase.ignoreFetchAbort}
|
||
*/
|
||
ae(this, "ignoreFetchAbort");
|
||
// computed properties
|
||
pe(this, Ue, void 0);
|
||
pe(this, $t, void 0);
|
||
pe(this, ze, void 0);
|
||
pe(this, Ae, void 0);
|
||
pe(this, ge, void 0);
|
||
pe(this, rt, void 0);
|
||
pe(this, pt, void 0);
|
||
pe(this, Ze, void 0);
|
||
pe(this, Ge, void 0);
|
||
pe(this, Ot, void 0);
|
||
pe(this, Xe, void 0);
|
||
pe(this, Et, void 0);
|
||
pe(this, Tt, void 0);
|
||
pe(this, gt, void 0);
|
||
pe(this, It, void 0);
|
||
pe(this, on, void 0);
|
||
pe(this, at, void 0);
|
||
// conditionally set private methods related to TTL
|
||
pe(this, gn, () => {
|
||
});
|
||
pe(this, Wt, () => {
|
||
});
|
||
pe(this, so, () => {
|
||
});
|
||
/* c8 ignore stop */
|
||
pe(this, vt, () => !1);
|
||
pe(this, vn, (t) => {
|
||
});
|
||
pe(this, Vn, (t, n, o) => {
|
||
});
|
||
pe(this, lo, (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`.
|
||
*/
|
||
ae(this, Zm, "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: f, maxSize: h = 0, maxEntrySize: v = 0, sizeCalculation: p, fetchMethod: y, memoMethod: b, noDeleteOnFetchRejection: R, noDeleteOnStaleGet: D, allowStaleOnFetchRejection: $, allowStaleOnFetchAbort: T, ignoreFetchAbort: E } = t;
|
||
if (n !== 0 && !Qt(n))
|
||
throw new TypeError("max option must be a nonnegative integer");
|
||
const P = n ? fi(n) : Array;
|
||
if (!P)
|
||
throw new Error("invalid max value: " + n);
|
||
if (fe(this, Rt, n), fe(this, mt, h), 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 (fe(this, An, b), y !== void 0 && typeof y != "function")
|
||
throw new TypeError("fetchMethod must be a function if specified");
|
||
if (fe(this, In, y), fe(this, on, !!y), fe(this, ze, /* @__PURE__ */ new Map()), fe(this, Ae, new Array(n).fill(void 0)), fe(this, ge, new Array(n).fill(void 0)), fe(this, rt, new P(n)), fe(this, pt, new P(n)), fe(this, Ze, 0), fe(this, Ge, 0), fe(this, Ot, Sr.create(n)), fe(this, Ue, 0), fe(this, $t, 0), typeof l == "function" && fe(this, Dt, l), typeof c == "function" ? (fe(this, kt, c), fe(this, Xe, [])) : (fe(this, kt, void 0), fe(this, Xe, void 0)), fe(this, It, !!g(this, Dt)), fe(this, at, !!g(this, kt)), this.noDisposeOnSet = !!d, this.noUpdateTTL = !!f, this.noDeleteOnFetchRejection = !!R, this.allowStaleOnFetchRejection = !!$, this.allowStaleOnFetchAbort = !!T, this.ignoreFetchAbort = !!E, 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");
|
||
ee(this, Yo, hi).call(this);
|
||
}
|
||
if (this.allowStale = !!u, this.noDeleteOnStaleGet = !!D, 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");
|
||
ee(this, io, Rr).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";
|
||
vu(W) && (ci.add(W), di("TTL caching without ttlAutopurge, max, or maxSize can result in unbounded memory consumption.", "UnboundedCacheWarning", W, ra));
|
||
}
|
||
}
|
||
/**
|
||
* 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, Ae),
|
||
valList: g(t, ge),
|
||
next: g(t, rt),
|
||
prev: g(t, pt),
|
||
get head() {
|
||
return g(t, Ze);
|
||
},
|
||
get tail() {
|
||
return g(t, Ge);
|
||
},
|
||
free: g(t, Ot),
|
||
// methods
|
||
isBackgroundFetch: (n) => {
|
||
var o;
|
||
return ee(o = t, Ee, Ie).call(o, n);
|
||
},
|
||
backgroundFetch: (n, o, r, a) => {
|
||
var i;
|
||
return ee(i = t, Mn, Oo).call(i, n, o, r, a);
|
||
},
|
||
moveToTail: (n) => {
|
||
var o;
|
||
return ee(o = t, bn, zn).call(o, n);
|
||
},
|
||
indexes: (n) => {
|
||
var o;
|
||
return ee(o = t, jt, Jt).call(o, n);
|
||
},
|
||
rindexes: (n) => {
|
||
var o;
|
||
return ee(o = t, Nt, Zt).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, $t);
|
||
}
|
||
/**
|
||
* 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, In);
|
||
}
|
||
get memoMethod() {
|
||
return g(this, An);
|
||
}
|
||
/**
|
||
* {@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 ee(this, jt, Jt).call(this))
|
||
g(this, ge)[t] !== void 0 && g(this, Ae)[t] !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[t]) && (yield [g(this, Ae)[t], g(this, ge)[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 ee(this, Nt, Zt).call(this))
|
||
g(this, ge)[t] !== void 0 && g(this, Ae)[t] !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[t]) && (yield [g(this, Ae)[t], g(this, ge)[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 ee(this, jt, Jt).call(this)) {
|
||
const n = g(this, Ae)[t];
|
||
n !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[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 ee(this, Nt, Zt).call(this)) {
|
||
const n = g(this, Ae)[t];
|
||
n !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[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 ee(this, jt, Jt).call(this))
|
||
g(this, ge)[t] !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[t]) && (yield g(this, ge)[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 ee(this, Nt, Zt).call(this))
|
||
g(this, ge)[t] !== void 0 && !ee(this, Ee, Ie).call(this, g(this, ge)[t]) && (yield g(this, ge)[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 ee(this, jt, Jt).call(this)) {
|
||
const r = g(this, ge)[o], a = ee(this, Ee, Ie).call(this, r) ? r.__staleWhileFetching : r;
|
||
if (a !== void 0 && t(a, g(this, Ae)[o], this))
|
||
return this.get(g(this, Ae)[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 ee(this, jt, Jt).call(this)) {
|
||
const r = g(this, ge)[o], a = ee(this, Ee, Ie).call(this, r) ? r.__staleWhileFetching : r;
|
||
a !== void 0 && t.call(n, a, g(this, Ae)[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 ee(this, Nt, Zt).call(this)) {
|
||
const r = g(this, ge)[o], a = ee(this, Ee, Ie).call(this, r) ? r.__staleWhileFetching : r;
|
||
a !== void 0 && t.call(n, a, g(this, Ae)[o], this);
|
||
}
|
||
}
|
||
/**
|
||
* Delete any stale entries. Returns true if anything was removed,
|
||
* false otherwise.
|
||
*/
|
||
purgeStale() {
|
||
let t = !1;
|
||
for (const n of ee(this, Nt, Zt).call(this, { allowStale: !0 }))
|
||
g(this, vt).call(this, n) && (ee(this, xt, en).call(this, g(this, Ae)[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, ge)[n], r = ee(this, Ee, Ie).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 - (Sn.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 ee(this, jt, Jt).call(this, { allowStale: !0 })) {
|
||
const o = g(this, Ae)[n], r = g(this, ge)[n], a = ee(this, Ee, Ie).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 = Sn.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 = Sn.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 f, h, 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, lo).call(this, t, n, o.size || 0, s);
|
||
if (this.maxEntrySize && c > this.maxEntrySize)
|
||
return u && (u.set = "miss", u.maxEntrySizeExceeded = !0), ee(this, xt, en).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, Ge) : g(this, Ot).length !== 0 ? g(this, Ot).pop() : g(this, Ue) === g(this, Rt) ? ee(this, Pn, $o).call(this, !1) : g(this, Ue), g(this, Ae)[d] = t, g(this, ge)[d] = n, g(this, ze).set(t, d), g(this, rt)[g(this, Ge)] = d, g(this, pt)[d] = g(this, Ge), fe(this, Ge, d), bo(this, Ue)._++, g(this, Vn).call(this, d, c, u), u && (u.set = "add"), l = !1;
|
||
else {
|
||
ee(this, bn, zn).call(this, d);
|
||
const b = g(this, ge)[d];
|
||
if (n !== b) {
|
||
if (g(this, on) && ee(this, Ee, Ie).call(this, b)) {
|
||
b.__abortController.abort(new Error("replaced"));
|
||
const { __staleWhileFetching: R } = b;
|
||
R !== void 0 && !i && (g(this, It) && ((f = g(this, Dt)) == null || f.call(this, R, t, "set")), g(this, at) && ((h = g(this, Xe)) == null || h.push([R, t, "set"])));
|
||
} else
|
||
i || (g(this, It) && ((v = g(this, Dt)) == null || v.call(this, b, t, "set")), g(this, at) && ((p = g(this, Xe)) == null || p.push([b, t, "set"])));
|
||
if (g(this, vn).call(this, d), g(this, Vn).call(this, d, c, u), g(this, ge)[d] = n, u) {
|
||
u.set = "replace";
|
||
const R = b && ee(this, Ee, Ie).call(this, b) ? b.__staleWhileFetching : b;
|
||
R !== void 0 && (u.oldValue = R);
|
||
}
|
||
} else
|
||
u && (u.set = "update");
|
||
}
|
||
if (r !== 0 && !g(this, gt) && ee(this, io, Rr).call(this), g(this, gt) && (l || g(this, so).call(this, d, r, a), u && g(this, Wt).call(this, u, d)), !i && g(this, at) && g(this, Xe)) {
|
||
const b = g(this, Xe);
|
||
let R;
|
||
for (; R = b == null ? void 0 : b.shift(); )
|
||
(y = g(this, kt)) == null || y.call(this, ...R);
|
||
}
|
||
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, ge)[g(this, Ze)];
|
||
if (ee(this, Pn, $o).call(this, !0), ee(this, Ee, Ie).call(this, n)) {
|
||
if (n.__staleWhileFetching)
|
||
return n.__staleWhileFetching;
|
||
} else if (n !== void 0)
|
||
return n;
|
||
}
|
||
} finally {
|
||
if (g(this, at) && g(this, Xe)) {
|
||
const n = g(this, Xe);
|
||
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, ge)[a];
|
||
if (ee(this, Ee, Ie).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, gn).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, ge)[r];
|
||
return ee(this, Ee, Ie).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: f = this.allowStaleOnFetchRejection,
|
||
ignoreFetchAbort: h = this.ignoreFetchAbort,
|
||
allowStaleOnFetchAbort: v = this.allowStaleOnFetchAbort,
|
||
context: p,
|
||
forceRefresh: y = !1,
|
||
status: b,
|
||
signal: R
|
||
} = n;
|
||
if (!g(this, on))
|
||
return b && (b.fetch = "get"), this.get(t, {
|
||
allowStale: o,
|
||
updateAgeOnGet: r,
|
||
noDeleteOnStaleGet: a,
|
||
status: b
|
||
});
|
||
const D = {
|
||
allowStale: o,
|
||
updateAgeOnGet: r,
|
||
noDeleteOnStaleGet: a,
|
||
ttl: i,
|
||
noDisposeOnSet: s,
|
||
size: u,
|
||
sizeCalculation: l,
|
||
noUpdateTTL: c,
|
||
noDeleteOnFetchRejection: d,
|
||
allowStaleOnFetchRejection: f,
|
||
allowStaleOnFetchAbort: v,
|
||
ignoreFetchAbort: h,
|
||
status: b,
|
||
signal: R
|
||
};
|
||
let $ = g(this, ze).get(t);
|
||
if ($ === void 0) {
|
||
b && (b.fetch = "miss");
|
||
const T = ee(this, Mn, Oo).call(this, t, $, D, p);
|
||
return T.__returned = T;
|
||
} else {
|
||
const T = g(this, ge)[$];
|
||
if (ee(this, Ee, Ie).call(this, T)) {
|
||
const V = o && T.__staleWhileFetching !== void 0;
|
||
return b && (b.fetch = "inflight", V && (b.returnedStale = !0)), V ? T.__staleWhileFetching : T.__returned = T;
|
||
}
|
||
const E = g(this, vt).call(this, $);
|
||
if (!y && !E)
|
||
return b && (b.fetch = "hit"), ee(this, bn, zn).call(this, $), r && g(this, gn).call(this, $), b && g(this, Wt).call(this, b, $), T;
|
||
const P = ee(this, Mn, Oo).call(this, t, $, D, p), F = P.__staleWhileFetching !== void 0 && o;
|
||
return b && (b.fetch = E ? "stale" : "refresh", F && E && (b.returnedStale = !0)), F ? 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, An);
|
||
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, ge)[s], l = ee(this, Ee, Ie).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 || ee(this, xt, en).call(this, t, "expire"), i && o && (i.returnedStale = !0), o ? u : void 0)) : (i && (i.get = "hit"), l ? u.__staleWhileFetching : (ee(this, bn, zn).call(this, s), r && g(this, gn).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 ee(this, xt, en).call(this, t, "delete");
|
||
}
|
||
/**
|
||
* Clear the cache entirely, throwing away all values.
|
||
*/
|
||
clear() {
|
||
return ee(this, fo, $r).call(this, "delete");
|
||
}
|
||
};
|
||
Zm = Symbol.toStringTag, Rt = new WeakMap(), mt = new WeakMap(), Dt = new WeakMap(), kt = new WeakMap(), In = new WeakMap(), An = new WeakMap(), Ue = new WeakMap(), $t = new WeakMap(), ze = new WeakMap(), Ae = new WeakMap(), ge = new WeakMap(), rt = new WeakMap(), pt = new WeakMap(), Ze = new WeakMap(), Ge = new WeakMap(), Ot = new WeakMap(), Xe = new WeakMap(), Et = new WeakMap(), Tt = new WeakMap(), gt = new WeakMap(), It = new WeakMap(), on = new WeakMap(), at = new WeakMap(), io = new WeakSet(), Rr = function() {
|
||
const t = new ko(g(this, Rt)), n = new ko(g(this, Rt));
|
||
fe(this, gt, t), fe(this, Tt, n), fe(this, so, (a, i, s = Sn.now()) => {
|
||
if (n[a] = i !== 0 ? s : 0, t[a] = i, i !== 0 && this.ttlAutopurge) {
|
||
const u = setTimeout(() => {
|
||
g(this, vt).call(this, a) && ee(this, xt, en).call(this, g(this, Ae)[a], "expire");
|
||
}, i + 1);
|
||
u.unref && u.unref();
|
||
}
|
||
}), fe(this, gn, (a) => {
|
||
n[a] = t[a] !== 0 ? Sn.now() : 0;
|
||
}), fe(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 = Sn.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;
|
||
}, fe(this, vt, (a) => {
|
||
const i = n[a], s = t[a];
|
||
return !!s && !!i && (o || r()) - i > s;
|
||
});
|
||
}, gn = new WeakMap(), Wt = new WeakMap(), so = new WeakMap(), vt = new WeakMap(), Yo = new WeakSet(), hi = function() {
|
||
const t = new ko(g(this, Rt));
|
||
fe(this, $t, 0), fe(this, Et, t), fe(this, vn, (n) => {
|
||
fe(this, $t, g(this, $t) - t[n]), t[n] = 0;
|
||
}), fe(this, lo, (n, o, r, a) => {
|
||
if (ee(this, Ee, Ie).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;
|
||
}), fe(this, Vn, (n, o, r) => {
|
||
if (t[n] = o, g(this, mt)) {
|
||
const a = g(this, mt) - t[n];
|
||
for (; g(this, $t) > a; )
|
||
ee(this, Pn, $o).call(this, !0);
|
||
}
|
||
fe(this, $t, g(this, $t) + t[n]), r && (r.entrySize = o, r.totalCalculatedSize = g(this, $t));
|
||
});
|
||
}, vn = new WeakMap(), Vn = new WeakMap(), lo = new WeakMap(), jt = new WeakSet(), Jt = function* ({ allowStale: t = this.allowStale } = {}) {
|
||
if (g(this, Ue))
|
||
for (let n = g(this, Ge); !(!ee(this, uo, Dr).call(this, n) || ((t || !g(this, vt).call(this, n)) && (yield n), n === g(this, Ze))); )
|
||
n = g(this, pt)[n];
|
||
}, Nt = new WeakSet(), Zt = function* ({ allowStale: t = this.allowStale } = {}) {
|
||
if (g(this, Ue))
|
||
for (let n = g(this, Ze); !(!ee(this, uo, Dr).call(this, n) || ((t || !g(this, vt).call(this, n)) && (yield n), n === g(this, Ge))); )
|
||
n = g(this, rt)[n];
|
||
}, uo = new WeakSet(), Dr = function(t) {
|
||
return t !== void 0 && g(this, ze).get(g(this, Ae)[t]) === t;
|
||
}, Pn = new WeakSet(), $o = function(t) {
|
||
var a, i;
|
||
const n = g(this, Ze), o = g(this, Ae)[n], r = g(this, ge)[n];
|
||
return g(this, on) && ee(this, Ee, Ie).call(this, r) ? r.__abortController.abort(new Error("evicted")) : (g(this, It) || g(this, at)) && (g(this, It) && ((a = g(this, Dt)) == null || a.call(this, r, o, "evict")), g(this, at) && ((i = g(this, Xe)) == null || i.push([r, o, "evict"]))), g(this, vn).call(this, n), t && (g(this, Ae)[n] = void 0, g(this, ge)[n] = void 0, g(this, Ot).push(n)), g(this, Ue) === 1 ? (fe(this, Ze, fe(this, Ge, 0)), g(this, Ot).length = 0) : fe(this, Ze, g(this, rt)[n]), g(this, ze).delete(o), bo(this, Ue)._--, n;
|
||
}, Mn = new WeakSet(), Oo = function(t, n, o, r) {
|
||
const a = n === void 0 ? void 0 : g(this, ge)[n];
|
||
if (ee(this, Ee, Ie).call(this, a))
|
||
return a;
|
||
const i = new Lo(), { 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, R = o.ignoreFetchAbort && p !== void 0;
|
||
if (o.status && (b && !y ? (o.status.fetchAborted = !0, o.status.fetchError = i.signal.reason, R && (o.status.fetchAbortIgnored = !0)) : o.status.fetchResolved = !0), b && !R && !y)
|
||
return d(i.signal.reason);
|
||
const D = h;
|
||
return g(this, ge)[n] === h && (p === void 0 ? D.__staleWhileFetching ? g(this, ge)[n] = D.__staleWhileFetching : ee(this, xt, en).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, R = b || o.allowStaleOnFetchRejection, D = R || o.noDeleteOnFetchRejection, $ = h;
|
||
if (g(this, ge)[n] === h && (!D || $.__staleWhileFetching === void 0 ? ee(this, xt, en).call(this, t, "fetch") : b || (g(this, ge)[n] = $.__staleWhileFetching)), R)
|
||
return o.status && $.__staleWhileFetching !== void 0 && (o.status.returnedStale = !0), $.__staleWhileFetching;
|
||
if ($.__returned === $)
|
||
throw p;
|
||
}, f = (p, y) => {
|
||
var R;
|
||
const b = (R = g(this, In)) == null ? void 0 : R.call(this, t, a, u);
|
||
b && b instanceof Promise && b.then((D) => p(D === void 0 ? void 0 : D), y), i.signal.addEventListener("abort", () => {
|
||
(!o.ignoreFetchAbort || o.allowStaleOnFetchAbort) && (p(void 0), o.allowStaleOnFetchAbort && (p = (D) => l(D, !0)));
|
||
});
|
||
};
|
||
o.status && (o.status.fetchDispatched = !0);
|
||
const h = new Promise(f).then(l, c), v = Object.assign(h, {
|
||
__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, ge)[n] = v, v;
|
||
}, Ee = new WeakSet(), Ie = function(t) {
|
||
if (!g(this, on))
|
||
return !1;
|
||
const n = t;
|
||
return !!n && n instanceof Promise && n.hasOwnProperty("__staleWhileFetching") && n.__abortController instanceof Lo;
|
||
}, co = new WeakSet(), kr = function(t, n) {
|
||
g(this, pt)[n] = t, g(this, rt)[t] = n;
|
||
}, bn = new WeakSet(), zn = function(t) {
|
||
t !== g(this, Ge) && (t === g(this, Ze) ? fe(this, Ze, g(this, rt)[t]) : ee(this, co, kr).call(this, g(this, pt)[t], g(this, rt)[t]), ee(this, co, kr).call(this, g(this, Ge), t), fe(this, Ge, t));
|
||
}, xt = new WeakSet(), en = 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)
|
||
ee(this, fo, $r).call(this, n);
|
||
else {
|
||
g(this, vn).call(this, u);
|
||
const l = g(this, ge)[u];
|
||
if (ee(this, Ee, Ie).call(this, l) ? l.__abortController.abort(new Error("deleted")) : (g(this, It) || g(this, at)) && (g(this, It) && ((r = g(this, Dt)) == null || r.call(this, l, t, n)), g(this, at) && ((a = g(this, Xe)) == null || a.push([l, t, n]))), g(this, ze).delete(t), g(this, Ae)[u] = void 0, g(this, ge)[u] = void 0, u === g(this, Ge))
|
||
fe(this, Ge, g(this, pt)[u]);
|
||
else if (u === g(this, Ze))
|
||
fe(this, Ze, g(this, rt)[u]);
|
||
else {
|
||
const c = g(this, pt)[u];
|
||
g(this, rt)[c] = g(this, rt)[u];
|
||
const d = g(this, rt)[u];
|
||
g(this, pt)[d] = g(this, pt)[u];
|
||
}
|
||
bo(this, Ue)._--, g(this, Ot).push(u);
|
||
}
|
||
}
|
||
if (g(this, at) && ((i = g(this, Xe)) != null && i.length)) {
|
||
const u = g(this, Xe);
|
||
let l;
|
||
for (; l = u == null ? void 0 : u.shift(); )
|
||
(s = g(this, kt)) == null || s.call(this, ...l);
|
||
}
|
||
return o;
|
||
}, fo = new WeakSet(), $r = function(t) {
|
||
var n, o, r;
|
||
for (const a of ee(this, Nt, Zt).call(this, { allowStale: !0 })) {
|
||
const i = g(this, ge)[a];
|
||
if (ee(this, Ee, Ie).call(this, i))
|
||
i.__abortController.abort(new Error("deleted"));
|
||
else {
|
||
const s = g(this, Ae)[a];
|
||
g(this, It) && ((n = g(this, Dt)) == null || n.call(this, i, s, t)), g(this, at) && ((o = g(this, Xe)) == null || o.push([i, s, t]));
|
||
}
|
||
}
|
||
if (g(this, ze).clear(), g(this, ge).fill(void 0), g(this, Ae).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), fe(this, Ze, 0), fe(this, Ge, 0), g(this, Ot).length = 0, fe(this, $t, 0), fe(this, Ue, 0), g(this, at) && g(this, Xe)) {
|
||
const a = g(this, Xe);
|
||
let i;
|
||
for (; i = a == null ? void 0 : a.shift(); )
|
||
(r = g(this, kt)) == null || r.call(this, ...i);
|
||
}
|
||
};
|
||
let Fr = ra;
|
||
const yo = new Fr({
|
||
max: 500,
|
||
maxSize: 5e3,
|
||
ttl: 1e3 * 60 * 30,
|
||
sizeCalculation: (e, t) => 1
|
||
}), { UnMergeable: bu } = $e();
|
||
function yu(e) {
|
||
mi = e;
|
||
}
|
||
let mi = async (e) => (ce.warn("请配置 app.use(FsCrud,{dictRequest:(context)=>{ 你的字典请求方法 }})"), []);
|
||
class pi extends bu {
|
||
//loadDict成功后的通知
|
||
constructor(n) {
|
||
super();
|
||
ae(this, "cache", !1);
|
||
// 获取到结果是否进行全局缓存
|
||
ae(this, "prototype", !1);
|
||
// 是否原型配置
|
||
ae(this, "immediate", !0);
|
||
//是否立即请求
|
||
ae(this, "url");
|
||
ae(this, "getData");
|
||
ae(this, "value", "value");
|
||
ae(this, "label", "label");
|
||
ae(this, "labelBuilder");
|
||
ae(this, "children", "children");
|
||
ae(this, "color", "color");
|
||
ae(this, "isTree", !1);
|
||
ae(this, "_data", null);
|
||
ae(this, "originalData");
|
||
ae(this, "dataMap", {});
|
||
ae(this, "loading", !1);
|
||
ae(this, "custom", {});
|
||
ae(this, "getNodesByValues");
|
||
ae(this, "onReady");
|
||
ae(this, "notifies", []);
|
||
ae(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, ho(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 = yo.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)) {
|
||
ce.error("getNodesByValues需要返回数组,当前返回值:", o);
|
||
return;
|
||
}
|
||
r && yo.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 && (Y(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) {
|
||
ce.warn("请配置getNodesByValues");
|
||
return;
|
||
}
|
||
for (const r of n)
|
||
this.dataMap[r] || this._unfetchValues[r] || (this._unfetchValues[r] = {
|
||
loading: !1,
|
||
value: r
|
||
});
|
||
await Be(), await Be(), await Be();
|
||
const o = [];
|
||
if (Y(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 mi({ url: a, dict: this });
|
||
return Array.isArray(i) ? i : [];
|
||
};
|
||
else
|
||
return [];
|
||
if (this.cache && r) {
|
||
let i = yo.get(r);
|
||
if (i == null)
|
||
i = {
|
||
loaded: !1,
|
||
loading: !0,
|
||
data: void 0,
|
||
callback: []
|
||
}, yo.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 || ce.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, ce.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) {
|
||
Y(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 [];
|
||
jo(n) || (n = [n]);
|
||
const o = [];
|
||
return Y(n, (r) => {
|
||
const a = this.dataMap[r];
|
||
a ? o.push(a) : o.push({ [this.value]: r });
|
||
}), o;
|
||
}
|
||
}
|
||
function wu(e) {
|
||
const t = Bo(new pi(e));
|
||
return !t.prototype && t.immediate && t.loadDict(), t;
|
||
}
|
||
function _u() {
|
||
return {
|
||
dict: wu,
|
||
setDictRequest: yu,
|
||
Dict: pi
|
||
};
|
||
}
|
||
function hp() {
|
||
return {
|
||
addTypes: $n.addTypes,
|
||
getType: $n.getType,
|
||
getTypes: $n.getTypes,
|
||
install: $n.install
|
||
};
|
||
}
|
||
async function Cu(e) {
|
||
await Be();
|
||
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 f = d.clientX - s, h = d.clientY - u;
|
||
o.style.left = `${f + l}px`, o.style.top = `${h + c}px`;
|
||
}, document.onmouseup = function(d) {
|
||
document.onmousemove = null, document.onmouseup = null;
|
||
};
|
||
};
|
||
}
|
||
async function Su(e) {
|
||
await Be();
|
||
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 f = d.clientX - s, h = d.clientY - u;
|
||
o.style.left = `${f + l}px`, o.style.top = `${h + c}px`;
|
||
}, document.onmouseup = function(d) {
|
||
document.onmousemove = null, document.onmouseup = null;
|
||
};
|
||
};
|
||
}
|
||
async function Fu(e) {
|
||
const { ui: t } = we();
|
||
t.type === "antdv" ? await Cu(e) : t.type === "element" || await Su(e);
|
||
}
|
||
function Ru() {
|
||
return {
|
||
dragModal: Fu
|
||
};
|
||
}
|
||
const Du = {
|
||
logger: {
|
||
off: {
|
||
tableColumns: !1
|
||
}
|
||
}
|
||
}, ku = le({
|
||
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 = M(() => e.fixedHeight === !1 ? n({ position: "relative" }, e.innerStyle) : e.innerStyle), r = M(() => e.fixedHeight === !1 ? n({ flex: "unset" }, e.bodyStyle) : e.bodyStyle);
|
||
return {
|
||
computedInnerStyle: o,
|
||
computedBodyStyle: r
|
||
};
|
||
}
|
||
});
|
||
const $u = { class: "fs-container" }, Ou = { class: "box" }, Eu = { class: "header" }, Tu = { class: "footer" };
|
||
function Iu(e, t, n, o, r, a) {
|
||
return w(), j("div", $u, [
|
||
te("div", Ou, [
|
||
te("div", {
|
||
class: "inner",
|
||
style: to(e.computedInnerStyle)
|
||
}, [
|
||
te("div", Eu, [
|
||
re(e.$slots, "header")
|
||
]),
|
||
te("div", {
|
||
class: "body",
|
||
style: to(e.computedBodyStyle)
|
||
}, [
|
||
re(e.$slots, "default")
|
||
], 4),
|
||
te("div", Tu, [
|
||
re(e.$slots, "footer")
|
||
])
|
||
], 4)
|
||
]),
|
||
re(e.$slots, "box")
|
||
]);
|
||
}
|
||
const Au = /* @__PURE__ */ Oe(ku, [["render", Iu]]), Vu = le({
|
||
name: "FsLayoutDefault"
|
||
});
|
||
const Pu = { class: "fs-crud-header" }, Mu = { class: "fs-header-top" }, Bu = { class: "fs-header-middle" }, ju = { class: "fs-header-bottom" }, Nu = { class: "fs-crud-footer" };
|
||
function xu(e, t, n, o, r, a) {
|
||
const i = G("fs-container");
|
||
return w(), I(i, { class: "fs-layout-default" }, {
|
||
header: B(() => [
|
||
te("div", Pu, [
|
||
te("div", Mu, [
|
||
re(e.$slots, "header-top")
|
||
]),
|
||
re(e.$slots, "search"),
|
||
te("div", Bu, [
|
||
re(e.$slots, "header-middle")
|
||
]),
|
||
re(e.$slots, "actionbar"),
|
||
re(e.$slots, "toolbar"),
|
||
te("div", ju, [
|
||
re(e.$slots, "header-bottom")
|
||
]),
|
||
re(e.$slots, "tabs")
|
||
])
|
||
]),
|
||
footer: B(() => [
|
||
te("div", Nu, [
|
||
re(e.$slots, "footer-top"),
|
||
re(e.$slots, "pagination"),
|
||
re(e.$slots, "footer-bottom")
|
||
])
|
||
]),
|
||
default: B(() => [
|
||
re(e.$slots, "default"),
|
||
re(e.$slots, "table"),
|
||
re(e.$slots, "form")
|
||
]),
|
||
_: 3
|
||
});
|
||
}
|
||
const Lu = /* @__PURE__ */ Oe(Vu, [["render", xu]]), qu = le({
|
||
name: "FsLayoutCard",
|
||
setup() {
|
||
const e = jn("get:crudBinding"), t = M(() => {
|
||
var r, a;
|
||
return e == null ? !0 : (a = (r = e()) == null ? void 0 : r.search) == null ? void 0 : a.show;
|
||
}), { ui: n } = we(), o = K(n.card.name);
|
||
return {
|
||
searchShow: t,
|
||
cardComponentName: o
|
||
};
|
||
}
|
||
});
|
||
const Hu = { class: "fs-header-top" }, zu = { class: "fs-header-bottom" }, Wu = { class: "top-bar" }, Uu = { class: "top-bar" }, Ku = { class: "fs-crud-footer" };
|
||
function Yu(e, t, n, o, r, a) {
|
||
const i = G("fs-container");
|
||
return w(), I(i, { class: "fs-layout-card" }, {
|
||
header: B(() => [
|
||
te("div", Hu, [
|
||
re(e.$slots, "header-top")
|
||
]),
|
||
e.searchShow ? (w(), I(H(e.cardComponentName), { key: 0 }, {
|
||
default: B(() => [
|
||
re(e.$slots, "search")
|
||
]),
|
||
_: 3
|
||
})) : oe("", !0),
|
||
te("div", zu, [
|
||
re(e.$slots, "header-bottom")
|
||
])
|
||
]),
|
||
default: B(() => [
|
||
x(i, null, {
|
||
header: B(() => [
|
||
re(e.$slots, "tabs")
|
||
]),
|
||
default: B(() => [
|
||
(w(), I(H(e.cardComponentName), { class: "fs-layout-card-body" }, {
|
||
title: B(() => [
|
||
te("div", Wu, [
|
||
re(e.$slots, "actionbar"),
|
||
re(e.$slots, "toolbar")
|
||
])
|
||
]),
|
||
header: B(() => [
|
||
te("div", Uu, [
|
||
re(e.$slots, "actionbar"),
|
||
re(e.$slots, "toolbar")
|
||
])
|
||
]),
|
||
default: B(() => [
|
||
x(i, null, {
|
||
footer: B(() => [
|
||
te("div", Ku, [
|
||
re(e.$slots, "footer-top"),
|
||
re(e.$slots, "pagination"),
|
||
re(e.$slots, "footer-bottom")
|
||
])
|
||
]),
|
||
default: B(() => [
|
||
re(e.$slots, "default"),
|
||
re(e.$slots, "table"),
|
||
re(e.$slots, "form")
|
||
]),
|
||
_: 3
|
||
})
|
||
]),
|
||
_: 3
|
||
}))
|
||
]),
|
||
_: 3
|
||
})
|
||
]),
|
||
_: 3
|
||
});
|
||
}
|
||
const Gu = /* @__PURE__ */ Oe(qu, [["render", Yu]]);
|
||
function Xu(e) {
|
||
return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !xr(e);
|
||
}
|
||
const Qu = /* @__PURE__ */ le({
|
||
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
|
||
},
|
||
/**
|
||
* x-button的配置,当x-button的配置与fs-button的配置有冲突时可以配置在此处
|
||
* 比如:n-button的text
|
||
*/
|
||
buttonProps: {
|
||
type: Object,
|
||
default: void 0
|
||
},
|
||
className: {}
|
||
},
|
||
setup(e, t) {
|
||
const {
|
||
ui: n
|
||
} = we(), {
|
||
merge: o
|
||
} = $e(), r = (l, c = "fs-button-icon") => {
|
||
if (l != null)
|
||
return typeof l == "string" ? x(G("fs-icon"), {
|
||
icon: l,
|
||
class: c
|
||
}, null) : typeof l == "function" ? l() : x(G("fs-icon"), z(l, {
|
||
class: c
|
||
}), null);
|
||
}, a = () => {
|
||
const l = e.icon, c = e.iconRight, d = n.type !== "element", f = !d;
|
||
let h;
|
||
const v = {
|
||
...t.slots
|
||
};
|
||
(l && !d && !f || t.slots.default || e.text || c) && (v.default = () => {
|
||
const R = [];
|
||
return l && !d && !f && R.push(r(l)), t.slots.default && R.push(t.slots.default()), e.text && R.push(e.text), c && R.push(r(c, "fs-button-icon-right")), R;
|
||
}), l && (d && !v.icon ? v.icon = () => r(l) : f && !v.icon && (h = r(l)));
|
||
const p = e.circle ? n.button.circle : {}, y = H(n.button.name), b = o({
|
||
...p,
|
||
//icon,
|
||
class: {
|
||
"fs-button": !0,
|
||
"is-thin": !e.text && !t.slots.default
|
||
}
|
||
}, {
|
||
class: e.className,
|
||
...t.attrs,
|
||
...e.buttonProps
|
||
});
|
||
return h && (b.icon = h), vr(y, b, v);
|
||
};
|
||
if (!e.tooltip)
|
||
return a;
|
||
const i = H(n.tooltip.name), s = M(() => wn(e.tooltip, "slots")), u = n.tooltip.trigger;
|
||
return () => {
|
||
var c;
|
||
const l = {
|
||
...(c = e.tooltip) == null ? void 0 : c.slots,
|
||
[u]: a
|
||
};
|
||
return x(i, s.value, Xu(l) ? l : {
|
||
default: () => [l]
|
||
});
|
||
};
|
||
}
|
||
}), Ju = /* @__PURE__ */ le({
|
||
name: "FsIcon",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* icon名称
|
||
*/
|
||
icon: {
|
||
type: String,
|
||
default: void 0,
|
||
require: !0
|
||
}
|
||
},
|
||
setup(e, t) {
|
||
const {
|
||
ui: n
|
||
} = we(), o = M(() => {
|
||
var a;
|
||
if (e.icon && ((a = e.icon) == null ? void 0 : a.indexOf(":")) >= 0) {
|
||
if (e.icon.startsWith("svg:")) {
|
||
const s = H("FsIconSvg");
|
||
return () => {
|
||
const u = e.icon.replace("svg:", "");
|
||
return x(s, z({
|
||
class: "fs-icon",
|
||
icon: u
|
||
}, t.attrs), null);
|
||
};
|
||
}
|
||
const i = H("FsIconify");
|
||
return () => x(i, z({
|
||
class: "fs-icon",
|
||
icon: e.icon
|
||
}, t.attrs), null);
|
||
}
|
||
const r = H(e.icon);
|
||
return typeof r == "string" ? () => x("span", {
|
||
title: "error icon name"
|
||
}, [r]) : n.icon.isComponent ? () => x(r, z({
|
||
class: "fs-icon"
|
||
}, t.attrs), null) : () => x(G("el-icon"), z({
|
||
class: "fs-icon"
|
||
}, t.attrs), {
|
||
default: () => [x(r, null, null)]
|
||
});
|
||
});
|
||
return () => o.value();
|
||
}
|
||
}), Zu = le({
|
||
name: "FsIconify",
|
||
components: { Icon: ws },
|
||
props: {
|
||
/**
|
||
* 图标名称
|
||
*/
|
||
icon: {
|
||
type: String
|
||
},
|
||
/**
|
||
* 旋转
|
||
*/
|
||
spin: {
|
||
type: Boolean,
|
||
default: !1
|
||
}
|
||
},
|
||
setup(e, t) {
|
||
return { iconifyRef: K(null) };
|
||
}
|
||
});
|
||
function ec(e, t, n, o, r, a) {
|
||
const i = G("Icon");
|
||
return w(), j("span", {
|
||
class: St(["fs-iconify", { "fs-iconify-spin": e.spin }])
|
||
}, [
|
||
x(i, {
|
||
ref: "iconifyRef",
|
||
icon: e.icon,
|
||
inline: !0
|
||
}, null, 8, ["icon"])
|
||
], 2);
|
||
}
|
||
const tc = /* @__PURE__ */ Oe(Zu, [["render", ec]]), nc = le({
|
||
name: "FsSvgIcon",
|
||
props: {
|
||
icon: {
|
||
type: String,
|
||
required: !0
|
||
},
|
||
size: {
|
||
type: [Number, String],
|
||
default: 16
|
||
},
|
||
spin: {
|
||
type: Boolean,
|
||
default: !1
|
||
}
|
||
},
|
||
setup(e) {
|
||
const t = M(() => `#${e.icon}`), n = M(() => {
|
||
const { size: o } = e;
|
||
let r = `${o}`;
|
||
return r = `${r.replace("px", "")}px`, {
|
||
width: r,
|
||
height: r
|
||
};
|
||
});
|
||
return { symbolId: t, getStyle: n };
|
||
}
|
||
});
|
||
const oc = {
|
||
class: "fs-icon-svg-content",
|
||
"aria-hidden": "true"
|
||
}, rc = ["xlink:href"];
|
||
function ac(e, t, n, o, r, a) {
|
||
return w(), j("span", {
|
||
class: St(["fs-icon-svg", e.spin && "fs-icon-spin"])
|
||
}, [
|
||
(w(), j("svg", oc, [
|
||
te("use", { "xlink:href": e.symbolId }, null, 8, rc)
|
||
]))
|
||
], 2);
|
||
}
|
||
const ic = /* @__PURE__ */ Oe(nc, [["render", ac]]), sc = le({
|
||
name: "FsLabel",
|
||
props: {
|
||
label: {
|
||
type: String,
|
||
default: ""
|
||
},
|
||
labelAttrs: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
contentAttrs: {
|
||
type: Object,
|
||
default: () => ({})
|
||
}
|
||
}
|
||
});
|
||
const lc = { class: "fs-label" };
|
||
function uc(e, t, n, o, r, a) {
|
||
return w(), j("div", lc, [
|
||
te("div", z({ class: "label" }, e.labelAttrs), [
|
||
Vt(We(e.label) + " ", 1),
|
||
re(e.$slots, "label")
|
||
], 16),
|
||
te("div", z({ class: "content" }, e.contentAttrs), [
|
||
re(e.$slots, "default")
|
||
], 16)
|
||
]);
|
||
}
|
||
const cc = /* @__PURE__ */ Oe(sc, [["render", uc]]), dc = {
|
||
key: 0,
|
||
class: "fs-loading"
|
||
}, fc = { key: 0 }, hc = le({
|
||
name: "FsLoading"
|
||
}), mc = /* @__PURE__ */ le({
|
||
...hc,
|
||
props: {
|
||
loading: { type: Boolean },
|
||
icon: {},
|
||
text: {}
|
||
},
|
||
setup(e) {
|
||
const { ui: t } = we();
|
||
return (n, o) => {
|
||
const r = G("fs-icon");
|
||
return n.loading ? (w(), j("div", dc, [
|
||
x(r, {
|
||
class: "fs-icon-spin",
|
||
icon: n.icon ?? q(t).icons.refresh
|
||
}, null, 8, ["icon"]),
|
||
n.text ? (w(), j("span", fc, We(n.text), 1)) : oe("", !0)
|
||
])) : oe("", !0);
|
||
};
|
||
}
|
||
});
|
||
const pc = le({
|
||
name: "FsBox"
|
||
}), gc = { class: "fs-box" };
|
||
function vc(e, t, n, o, r, a) {
|
||
return w(), j("div", gc, [
|
||
re(e.$slots, "default")
|
||
]);
|
||
}
|
||
const bc = /* @__PURE__ */ Oe(pc, [["render", vc]]);
|
||
function yc(e) {
|
||
return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !xr(e);
|
||
}
|
||
function ga(e, t) {
|
||
if (e[t] instanceof Array) {
|
||
const n = e[t];
|
||
e[t] = (o) => {
|
||
for (const r of n)
|
||
r(o);
|
||
};
|
||
}
|
||
}
|
||
const wc = ["div", "span", "a", "p", "pre", "li", "ol", "ul"], _c = /* @__PURE__ */ le({
|
||
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) {
|
||
_t.trace("fs-component-render");
|
||
const {
|
||
ui: n
|
||
} = we(), {
|
||
merge: o
|
||
} = $e();
|
||
sn("get:scope", () => e.scope), _n(() => {
|
||
t.emit("mounted", e.scope);
|
||
});
|
||
const r = K(), a = M(() => {
|
||
const h = {
|
||
name: "modelValue",
|
||
trim: !1,
|
||
number: !1,
|
||
transform: void 0
|
||
};
|
||
e.vModel && (typeof e.vModel == "string" ? h.name = e.vModel : o(h, e.vModel));
|
||
const v = e.modelValue ?? (n.type === "antdv" ? void 0 : null), p = "onUpdate:" + h.name, y = {
|
||
ref: r,
|
||
// scope: props.scope,
|
||
// fix element display false bug
|
||
[h.name]: v,
|
||
[p]: (R) => {
|
||
if (R && (h.trim && (R = R.trim()), h.number)) {
|
||
const D = Number(R);
|
||
isNaN(D) || (R = D);
|
||
}
|
||
h.transform && (R = h.transform(R)), R === void 0 && e.undefineToNull && (R = null), t.emit("update:modelValue", R);
|
||
},
|
||
...e.props
|
||
}, b = {
|
||
...e.events,
|
||
...e.on
|
||
};
|
||
return Y(b, (R, D) => {
|
||
const $ = R;
|
||
D.startsWith("on") || (D = Na("on_" + D)), y[D] = (T) => $({
|
||
...e.scope,
|
||
$event: T
|
||
});
|
||
}), y;
|
||
}), i = () => {
|
||
const h = {}, v = (p, y) => {
|
||
p instanceof Function ? h[y] = (b) => p({
|
||
...e.scope,
|
||
scope: b
|
||
}) : h[y] = () => p;
|
||
};
|
||
return Y(e.children, v), Y(e.slots, v), h;
|
||
}, s = M(() => {
|
||
const h = {
|
||
isAsyncComponent: !1,
|
||
component: q(e.name) || n.input.name
|
||
};
|
||
let v = h.component;
|
||
return wc.includes(v) || (typeof v == "string" && (v = G(v)), (v == null ? void 0 : v.name) === "AsyncComponentWrapper" && (h.isAsyncComponent = !0)), h.component = v, h;
|
||
}), u = i;
|
||
function l() {
|
||
return s.value.isAsyncComponent ? d() : c();
|
||
}
|
||
function c() {
|
||
return r.value;
|
||
}
|
||
async function d() {
|
||
const h = c();
|
||
return h ?? new Promise((v, p) => {
|
||
f(v, p, 0);
|
||
});
|
||
}
|
||
function f(h, v, p) {
|
||
setTimeout(() => {
|
||
const y = c();
|
||
if (y != null) {
|
||
h(y);
|
||
return;
|
||
}
|
||
if (p++, p > 20) {
|
||
v(new Error("异步组件加载超时"));
|
||
return;
|
||
}
|
||
f(h, v, p);
|
||
}, 200);
|
||
}
|
||
return t.expose({
|
||
props: e,
|
||
getTargetRefSync: c,
|
||
getTargetRef: l,
|
||
getTargetRefAsync: d
|
||
}), () => {
|
||
let h;
|
||
const v = z(a.value, t.attrs);
|
||
if (ga(v, "onChange"), ga(v, "onBlur"), e.render)
|
||
return e.render({
|
||
...e.scope,
|
||
attrs: v
|
||
});
|
||
const p = os(s.value.component);
|
||
return x(p, v, yc(h = u()) ? h : {
|
||
default: () => [h]
|
||
});
|
||
};
|
||
}
|
||
}), Cc = /* @__PURE__ */ le({
|
||
name: "FsSlotRender",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {
|
||
type: Function
|
||
},
|
||
/**
|
||
* 上下文
|
||
*/
|
||
scope: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup(e) {
|
||
return _t.trace("fs-slot-render"), () => e.slots(e.scope);
|
||
}
|
||
}), gi = /* @__PURE__ */ le({
|
||
name: "FsRender",
|
||
functional: !0,
|
||
props: {
|
||
renderFunc: {
|
||
type: Function
|
||
},
|
||
scope: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup() {
|
||
_t.trace("fs-render");
|
||
},
|
||
render() {
|
||
return this.renderFunc(this.scope);
|
||
}
|
||
}), Sc = le({
|
||
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 } = we(), { AsyncComputeValue: r, doComputed: a } = Pt(), i = K(), s = yn({}), { proxy: u } = Go();
|
||
_t.trace("fs-form"), bt(e.columns, (_) => {
|
||
_.value != null && (_.value instanceof r || _.value instanceof Zo) && ce.warn("form.value配置不支持Compute/AsyncCompute类型的动态计算");
|
||
});
|
||
function l() {
|
||
const _ = {};
|
||
return bt(e.columns, (S, O) => {
|
||
const Q = q(S.value);
|
||
Q !== void 0 && tt(_, O, Q);
|
||
}), n(_, dt(e.initialForm)), _;
|
||
}
|
||
const c = l();
|
||
y(c);
|
||
const d = M(() => ({
|
||
row: c,
|
||
form: s,
|
||
index: e.index,
|
||
mode: e.mode || "add",
|
||
attrs: t.attrs,
|
||
getComponentRef: E
|
||
}));
|
||
function f() {
|
||
return d.value;
|
||
}
|
||
const h = M(() => e.columns);
|
||
function v(_) {
|
||
_ != null && bt(e.columns, (S, O) => {
|
||
let Q = st(_, O);
|
||
S.valueBuilder && S.valueBuilder({
|
||
value: Q,
|
||
key: O,
|
||
row: c,
|
||
form: _,
|
||
index: e.index,
|
||
mode: e.mode
|
||
});
|
||
});
|
||
}
|
||
function p() {
|
||
return s;
|
||
}
|
||
function y(_, S = {}) {
|
||
if (v(_), S.mergeForm === !1)
|
||
for (const Q in s)
|
||
delete s[Q];
|
||
n(s, _);
|
||
const { valueChange: O } = S;
|
||
O && Y(e.columns, (Q, se) => {
|
||
const ie = s[se];
|
||
D(se, ie);
|
||
});
|
||
}
|
||
function b(..._) {
|
||
return n({}, e.col, ..._);
|
||
}
|
||
function R(_) {
|
||
return { key: _.key, ...d.value };
|
||
}
|
||
function D(_, S) {
|
||
const O = { key: _, value: S, formRef: u, ...d.value, immediate: !1 };
|
||
t.emit("value-change", O);
|
||
let Q = e.columns[_].valueChange;
|
||
Q && (Q instanceof Function ? Q(O) : Q.handle && Q.handle(O));
|
||
}
|
||
const $ = K({});
|
||
function T(_) {
|
||
return $.value[_].getFormItemRef();
|
||
}
|
||
function E(_, S = !1) {
|
||
var O;
|
||
return (O = T(_)) == null ? void 0 : O.getComponentRef(S);
|
||
}
|
||
const P = K([]);
|
||
Y((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,
|
||
f,
|
||
null,
|
||
(_ = {}) => {
|
||
const S = {};
|
||
Y(_ == null ? void 0 : _.groups, (se, ie) => {
|
||
Y(se.columns, (de) => {
|
||
if (h.value[de] == null) {
|
||
_t.logger.warn("无效的分组字段:" + de);
|
||
return;
|
||
}
|
||
S[de] = ie;
|
||
});
|
||
});
|
||
const O = _.groupType;
|
||
let Q = {
|
||
parent: o.collapse.name,
|
||
child: o.collapseItem.name
|
||
};
|
||
return O === "tabs" && (Q.parent = o.tabs.name, Q.child = o.tabPane.name), n(
|
||
{
|
||
wrapper: Q,
|
||
groupedKeys: S
|
||
},
|
||
_
|
||
);
|
||
}
|
||
), F = M(() => {
|
||
const _ = [];
|
||
return Y(h.value, (S, O) => {
|
||
var se, ie;
|
||
const Q = dt(e.formItem || {});
|
||
S = n(Q, S), S.key = O, S.order == null && (S.order = ln.orderDefault), (((se = W.value) == null ? void 0 : se.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 V() {
|
||
return i.value;
|
||
}
|
||
async function ne() {
|
||
const _ = l(), S = zr(s);
|
||
for (const O of S) {
|
||
const Q = st(_, O[0]);
|
||
Q == null ? No(s, O[0]) : tt(s, O[0], Q);
|
||
}
|
||
e.doReset && await e.doReset(d.value), t.emit("reset");
|
||
}
|
||
const L = K(), A = K({});
|
||
function k(_) {
|
||
var S, O;
|
||
if ((S = W.value) != null && S.groupedKeys)
|
||
for (let Q in _) {
|
||
const se = (O = W.value) == null ? void 0 : O.groupedKeys[Q];
|
||
se != null && (_["group." + se] = !0);
|
||
}
|
||
}
|
||
async function N() {
|
||
const _ = { ...d.value, form: s };
|
||
if (_.mode !== "view") {
|
||
if (e.beforeValidate && await e.beforeValidate(_) === !1)
|
||
return !1;
|
||
try {
|
||
A.value = {}, await o.form.validateWrap(i.value), L.value = !0;
|
||
} catch (S) {
|
||
L.value = !1;
|
||
const O = o.form.transformValidateErrors(S);
|
||
throw k(O), A.value = O, t.emit("validationError", d.value), S;
|
||
}
|
||
}
|
||
}
|
||
async function J() {
|
||
await N();
|
||
const _ = dt(Ln(s)), S = { ...d.value, form: _ };
|
||
if (ce.debug("form submit", JSON.stringify(s)), bt(e.columns, (O, Q) => {
|
||
let se = st(_, Q);
|
||
O.valueResolve && O.valueResolve({
|
||
value: se,
|
||
key: Q,
|
||
...S
|
||
});
|
||
}), e.beforeSubmit && await e.beforeSubmit(S) === !1)
|
||
return !1;
|
||
if (bt(e.columns, (O, Q) => {
|
||
O.submit === !1 ? No(_, Q) : O.submit === !0 && tt(_, Q, _[Q]);
|
||
}), 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);
|
||
}
|
||
_n(() => {
|
||
Y(h.value, (_, S) => {
|
||
if (_.valueChange == null)
|
||
return;
|
||
let O = _.valueChange;
|
||
if (O && O.immediate === !0 && O.handle) {
|
||
const Q = { key: S, value: s[S], formRef: u, ...d.value, immediate: !0 };
|
||
O.handle && O.handle(Q);
|
||
}
|
||
});
|
||
});
|
||
function ue(_) {
|
||
return !!(_ && q(_.show) !== !1);
|
||
}
|
||
function Z(_) {
|
||
if (!_.columns || q(_.show) === !1)
|
||
return !1;
|
||
for (let S of _.columns) {
|
||
if (h.value[S] == null)
|
||
continue;
|
||
if (ue(h.value[S]))
|
||
return !0;
|
||
}
|
||
return !1;
|
||
}
|
||
e.watch && it(
|
||
() => s,
|
||
(_, S) => {
|
||
e.watch && e.watch(d.value);
|
||
},
|
||
{
|
||
deep: !0,
|
||
immediate: !0
|
||
}
|
||
);
|
||
function Se() {
|
||
const _ = JSON.stringify(c), S = JSON.stringify(s);
|
||
return _ !== S;
|
||
}
|
||
const ke = M(() => n({}, e.slots, t.slots));
|
||
return t.emit("init", d.value), {
|
||
get: (_, S) => st(_, S),
|
||
set: (_, S, O) => {
|
||
tt(_, S, O), D(S, O);
|
||
},
|
||
ui: o,
|
||
validRef: L,
|
||
errorsRef: A,
|
||
formRef: i,
|
||
computedColumns: h,
|
||
computedDefaultColumns: F,
|
||
submit: J,
|
||
reset: ne,
|
||
getFormRef: V,
|
||
scope: d,
|
||
buildItemScope: R,
|
||
groupActiveKey: P,
|
||
form: s,
|
||
formItemRefs: $,
|
||
getFormData: p,
|
||
setFormData: y,
|
||
getComponentRef: E,
|
||
mergeCol: b,
|
||
validate: N,
|
||
computedGroup: W,
|
||
getContextFn: f,
|
||
formItemShow: ue,
|
||
groupItemShow: Z,
|
||
isDirty: Se,
|
||
mergedSlots: ke
|
||
};
|
||
}
|
||
});
|
||
function Fc(e, t, n, o, r, a) {
|
||
const i = G("fs-form-item-col"), s = G("fs-render");
|
||
return w(), I(H(e.ui.form.name), {
|
||
ref: "formRef",
|
||
class: St(["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: B(() => [
|
||
(w(), I(H(e.ui.row.name), z({ class: "fs-row" }, e.row), {
|
||
default: B(() => [
|
||
(w(!0), j(be, null, Te(e.computedDefaultColumns, (u) => (w(), I(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(), I(H(e.computedGroup.wrapper.parent), z({
|
||
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: B(() => [
|
||
(w(!0), j(be, null, Te(e.computedGroup.groups, (u, l) => (w(), j(be, { key: l }, [
|
||
e.groupItemShow(u) ? (w(), I(H(e.computedGroup.wrapper.child), z({
|
||
key: 0,
|
||
[e.ui.collapse.keyName || ""]: l
|
||
}, { ref_for: !0 }, u, {
|
||
class: { "fs-form-group-error": e.errorsRef["group." + l] }
|
||
}), Lr({
|
||
default: B(() => [
|
||
(w(), I(H(e.ui.row.name), z({ class: "fs-row" }, { ref_for: !0 }, e.row), {
|
||
default: B(() => [
|
||
(w(!0), j(be, null, Te(u.columns, (c) => (w(), j(be, { key: c }, [
|
||
e.computedColumns[c] ? (w(), I(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"])) : oe("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 2
|
||
}, 1040))
|
||
]),
|
||
_: 2
|
||
}, [
|
||
Te(u.slots, (c, d) => ({
|
||
name: d,
|
||
fn: B((f) => [
|
||
x(s, {
|
||
"render-func": c,
|
||
scope: { ...f, hasError: e.errorsRef["group." + l] }
|
||
}, null, 8, ["render-func", "scope"])
|
||
])
|
||
}))
|
||
]), 1040, ["class"])) : oe("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16)) : oe("", !0)
|
||
]),
|
||
_: 1
|
||
}, 8, ["class", "model"]);
|
||
}
|
||
const Rc = /* @__PURE__ */ Oe(Sc, [["render", Fc]]), Dc = le({
|
||
name: "FsFormItem",
|
||
components: { FsRender: gi },
|
||
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 } = we(), { merge: o } = $e(), r = K();
|
||
_t.trace("fs-form-item");
|
||
const 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 = M(() => {
|
||
const p = {
|
||
...e.item
|
||
};
|
||
return delete p.title, delete p.label, p;
|
||
}), l = M(() => {
|
||
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 = M(() => {
|
||
var p, y;
|
||
return o({}, (p = e.item.helper) == null ? void 0 : p.tooltip, (y = e.helper) == null ? void 0 : y.tooltip);
|
||
}), d = M(() => {
|
||
if (e.item != null)
|
||
return e.item.key.indexOf(".") >= 0 ? e.item.key.split(".") : e.item.key;
|
||
}), f = M(() => e.item.label || e.item.title), h = M(() => f.value instanceof Function);
|
||
return {
|
||
ui: n,
|
||
updateModelValue: i,
|
||
scopeFunc: a,
|
||
getComponentRef: s,
|
||
componentRenderRef: r,
|
||
computedHelperPosition: l,
|
||
computedHelperTooltip: c,
|
||
computedKey: d,
|
||
computedLabelIsRender: h,
|
||
computedLabel: f,
|
||
computedLabelRender: () => f.value(a()),
|
||
computedItem: u
|
||
};
|
||
}
|
||
});
|
||
const kc = {
|
||
key: 0,
|
||
class: "fs-form-item-label-text"
|
||
}, $c = ["title"], Oc = { class: "fs-form-helper-tooltip" }, Ec = { class: "fs-form-item-label-icon" }, Tc = { class: "fs-form-item-content" }, Ic = { class: "fs-form-item-render" }, Ac = { class: "fs-form-item-component" };
|
||
function Vc(e, t, n, o, r, a) {
|
||
const i = G("fs-render"), s = G("fs-form-helper"), u = G("fs-icon"), l = G("fs-slot-render"), c = G("fs-component-render");
|
||
return e.computedItem ? (w(), I(H(e.ui.formItem.name), z({
|
||
key: 0,
|
||
class: "fs-form-item",
|
||
[e.ui.formItem.prop || ""]: e.computedKey
|
||
}, e.computedItem, {
|
||
path: e.computedItem.key,
|
||
"rule-path": e.computedItem.key
|
||
}), {
|
||
label: B(() => [
|
||
e.computedLabelIsRender ? (w(), j("span", kc, [
|
||
x(i, { "render-func": e.computedLabelRender }, null, 8, ["render-func"])
|
||
])) : (w(), j("span", {
|
||
key: 1,
|
||
class: "fs-form-item-label-text",
|
||
title: e.computedLabel
|
||
}, We(e.computedLabel), 9, $c)),
|
||
e.computedItem.helper && e.computedHelperPosition === "label" ? (w(), I(H(e.ui.tooltip.name), xe(z({ key: 2 }, e.computedHelperTooltip)), {
|
||
[e.ui.tooltip.content]: B(() => [
|
||
te("span", Oc, [
|
||
x(s, {
|
||
helper: e.computedItem.helper,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["helper", "scope"])
|
||
])
|
||
]),
|
||
[e.ui.tooltip.trigger]: B(() => [
|
||
te("span", Ec, [
|
||
x(u, {
|
||
class: "fs-form-item-label-icon-inner",
|
||
icon: e.ui.icons.question
|
||
}, null, 8, ["icon"])
|
||
])
|
||
]),
|
||
_: 2
|
||
}, 1040)) : oe("", !0)
|
||
]),
|
||
default: B(() => {
|
||
var d;
|
||
return [
|
||
te("div", Tc, [
|
||
e.computedItem.topRender ? (w(), I(i, {
|
||
key: 0,
|
||
"render-func": e.computedItem.topRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : oe("", !0),
|
||
te("div", Ic, [
|
||
e.computedItem.prefixRender ? (w(), I(i, {
|
||
key: 0,
|
||
"render-func": e.computedItem.prefixRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : oe("", !0),
|
||
te("div", Ac, [
|
||
e.formSlot ? (w(), I(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(be, { key: 1 }, [
|
||
e.computedItem.conditionalRender && e.computedItem.conditionalRender.match && e.computedItem.conditionalRender.match(e.scopeFunc()) ? (w(), I(i, {
|
||
key: 0,
|
||
"render-func": e.computedItem.conditionalRender.render,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : e.computedItem.render ? (w(), I(i, {
|
||
key: 1,
|
||
"render-func": e.computedItem.render,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : (w(), I(c, z({
|
||
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)) : oe("", !0)
|
||
]),
|
||
e.computedItem.suffixRender ? (w(), I(i, {
|
||
key: 1,
|
||
"render-func": e.computedItem.suffixRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : oe("", !0)
|
||
]),
|
||
e.computedItem.bottomRender ? (w(), I(i, {
|
||
key: 1,
|
||
"render-func": e.computedItem.bottomRender,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["render-func", "scope"])) : oe("", !0),
|
||
e.computedItem.helper && e.computedHelperPosition !== "label" ? (w(), I(s, {
|
||
key: 2,
|
||
helper: e.computedItem.helper,
|
||
scope: e.scopeFunc()
|
||
}, null, 8, ["helper", "scope"])) : oe("", !0)
|
||
])
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 16, ["path", "rule-path"])) : oe("", !0);
|
||
}
|
||
const Pc = /* @__PURE__ */ Oe(Dc, [["render", Vc]]), Mc = /* @__PURE__ */ le({
|
||
__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 } = we(), o = e, { doComputed: r } = Pt(), a = r(
|
||
() => o.item,
|
||
() => o.getContextFn()
|
||
), i = Xo(), s = K();
|
||
function u() {
|
||
return s.value;
|
||
}
|
||
return t({
|
||
getFormItemRef: u
|
||
}), (l, c) => {
|
||
var f;
|
||
const d = G("fs-form-item");
|
||
return q(a) && q(a).show !== !1 ? (w(), I(H(q(n).col.name), z({
|
||
key: 0,
|
||
class: "fs-col"
|
||
}, q(ho)(e.col, (f = q(a)) == null ? void 0 : f.col)), {
|
||
default: B(() => {
|
||
var h;
|
||
return [
|
||
q(a) && ((h = q(a)) == null ? void 0 : h.blank) !== !0 ? (w(), I(d, z({
|
||
key: 0,
|
||
ref_key: "formItemRef",
|
||
ref: s,
|
||
item: q(a),
|
||
"form-slot": e.slots,
|
||
"get-context-fn": e.getContextFn,
|
||
helper: e.helper
|
||
}, q(i)), null, 16, ["item", "form-slot", "get-context-fn", "helper"])) : oe("", !0)
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 16)) : oe("", !0);
|
||
};
|
||
}
|
||
});
|
||
const Bc = le({
|
||
name: "FsFormHelper",
|
||
props: {
|
||
/**
|
||
* 帮助说明, text: 说明文字, render: function(scope) 自定义渲染
|
||
*/
|
||
helper: {
|
||
type: [
|
||
/**
|
||
* text: 说明文字,
|
||
* render: function , 自定义render
|
||
*/
|
||
Object,
|
||
/**
|
||
* 说明文本
|
||
*/
|
||
String
|
||
]
|
||
},
|
||
scope: {}
|
||
},
|
||
setup(e) {
|
||
_t.trace("fs-form-item");
|
||
}
|
||
});
|
||
const jc = { class: "fs-form-helper" }, Nc = { key: 0 }, xc = { key: 2 };
|
||
function Lc(e, t, n, o, r, a) {
|
||
const i = G("fs-render");
|
||
return w(), j("div", jc, [
|
||
typeof e.helper == "string" ? (w(), j("pre", Nc, We(e.helper), 1)) : e.helper.render ? (w(), I(i, {
|
||
key: 1,
|
||
"render-func": e.helper.render,
|
||
scope: e.scope
|
||
}, null, 8, ["render-func", "scope"])) : e.helper.text ? (w(), j("pre", xc, We(e.helper.text), 1)) : oe("", !0)
|
||
]);
|
||
}
|
||
const qc = /* @__PURE__ */ Oe(Bc, [["render", Lc]]);
|
||
function Hc(e) {
|
||
return typeof e == "function" || Object.prototype.toString.call(e) === "[object Object]" && !xr(e);
|
||
}
|
||
const ro = /* @__PURE__ */ le({
|
||
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 Le;
|
||
_t.trace("fs-form-wrapper");
|
||
const {
|
||
t: n
|
||
} = lt(), {
|
||
merge: o
|
||
} = $e(), r = K(!1), a = K(), i = K(), s = K(), u = K(), l = K(), c = K(!1), d = K(), f = K(), h = K(), v = K(), p = e.id || Math.floor(Math.random() * 1e6) + "", y = "fs-form-wrapper_" + p, b = K({});
|
||
function R() {
|
||
var X;
|
||
return {
|
||
formWrapperId: p,
|
||
formWrapperIdClass: y,
|
||
close: A,
|
||
doClose: k,
|
||
onClosed: N,
|
||
onOpened: J,
|
||
open: D,
|
||
title: v,
|
||
fullscreenEnabled: se,
|
||
fullscreen: Q,
|
||
formWrapperIs: a,
|
||
formWrapperOpen: r,
|
||
formWrapperBind: s,
|
||
computedButtons: O,
|
||
onValueChange: ue,
|
||
innerBind: _e,
|
||
formWrapperSlots: b,
|
||
wrapper: s.value,
|
||
options: i.value,
|
||
formRef: l.value,
|
||
form: ke(),
|
||
wrapperBindRef: s,
|
||
formOptionsRef: i,
|
||
setFormData: m,
|
||
getFormData: ke,
|
||
reset: Se,
|
||
loading: c,
|
||
toggleFullscreen: ie,
|
||
submit: Z,
|
||
mode: (X = i.value) == null ? void 0 : X.mode
|
||
};
|
||
}
|
||
const D = async (X) => {
|
||
var ut;
|
||
const {
|
||
wrapper: ye
|
||
} = X;
|
||
ye.onOpen && ye.onOpen(X), v.value = q(ye.title), a.value = X.wrapper.is, u.value = ye;
|
||
const Me = de.formWrapper.customClass(a.value), Re = `fs-form-wrapper ${y} ${ye[Me] || ""} `;
|
||
return s.value = {
|
||
...wn(ye, "title", "onOpen", "onClosed", "onOpened", "is", "inner", "beforeClose"),
|
||
[Me]: Re
|
||
}, i.value = {
|
||
...wn(X, "wrapper", "slots"),
|
||
slots: {
|
||
...e.slots,
|
||
...X.slots,
|
||
...t.slots
|
||
}
|
||
}, b.value = {
|
||
...e.slots,
|
||
...(ut = X.wrapper) == null ? void 0 : ut.slots,
|
||
...t.slots
|
||
}, t.emit("open", R()), d.value = () => {
|
||
ye.onClosed && ye.onClosed(R());
|
||
}, f.value = () => {
|
||
ye.onOpened && ye.onOpened(R());
|
||
}, h.value = ye.beforeClose, ye.fullscreen != null && (Q.value = ye.fullscreen), t.emit("inner-change", !!u.value.inner), await Be(), r.value = !0, await Be(), J(), R();
|
||
};
|
||
async function $() {
|
||
var Me;
|
||
const X = u.value.saveRemind;
|
||
if (((Me = l.value) == null ? void 0 : Me.isDirty()) && X) {
|
||
let Re = !1;
|
||
if (X instanceof Function)
|
||
Re = await X();
|
||
else
|
||
try {
|
||
await de.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")
|
||
}), Re = !0;
|
||
} catch {
|
||
Re = !1;
|
||
}
|
||
Re && await Z();
|
||
}
|
||
}
|
||
const T = Ha();
|
||
let E = null;
|
||
function P() {
|
||
return u.value.saveDraft ? (E == null && (E = new Kr({
|
||
$router: T,
|
||
tableName: "addFormDraft",
|
||
keyType: e.id || "0"
|
||
})), E) : null;
|
||
}
|
||
async function W() {
|
||
var Re;
|
||
const X = u.value.saveDraft, ye = (Re = l.value) == null ? void 0 : Re.isDirty(), Me = i.value.mode == "add";
|
||
return ye && X && Me ? (await P().updateTableValue(ke()), !0) : !1;
|
||
}
|
||
async function F() {
|
||
const X = P();
|
||
X && await X.clearTableValue();
|
||
}
|
||
async function V() {
|
||
const X = P();
|
||
if (X) {
|
||
const ye = await X.getTableValue();
|
||
ye && m(ye, {
|
||
mergeForm: !0
|
||
});
|
||
}
|
||
}
|
||
async function ne() {
|
||
let X = !1;
|
||
return u.value.saveDraft && (X = await W()), h.value && h.value(R()) == !1 ? !1 : (X || await $(), !0);
|
||
}
|
||
const L = M(() => de.type == "element" ? {
|
||
beforeClose: (X) => {
|
||
k();
|
||
}
|
||
} : {}), A = async () => {
|
||
r.value = !1;
|
||
}, k = async () => await ne() == !1 ? !1 : (A(), !0), N = () => {
|
||
d.value && d.value(), t.emit("closed"), i.value = null;
|
||
}, J = () => {
|
||
if (u.value.saveDraft && V(), t.emit("opened"), f.value && f.value(), s.value.draggable || s.value.dragenabled) {
|
||
const {
|
||
dragModal: X
|
||
} = Ru();
|
||
X({
|
||
getModal: () => document.querySelector(`.${y}`)
|
||
});
|
||
}
|
||
}, ue = (X) => {
|
||
t.emit("value-change", X);
|
||
};
|
||
async function Z() {
|
||
c.value = !0;
|
||
try {
|
||
if (await l.value.submit() === !1)
|
||
return;
|
||
await F(), A();
|
||
} finally {
|
||
c.value = !1;
|
||
}
|
||
}
|
||
async function Se() {
|
||
await l.value.reset();
|
||
}
|
||
function ke() {
|
||
var X;
|
||
return (X = l.value) == null ? void 0 : X.getFormData();
|
||
}
|
||
function m(X, ye) {
|
||
var Me;
|
||
(Me = l.value) == null || Me.setFormData(X, ye);
|
||
}
|
||
const {
|
||
doComputed: C
|
||
} = Pt();
|
||
function _() {
|
||
var X, ye, Me;
|
||
return {
|
||
row: (X = i.value) == null ? void 0 : X.initialForm,
|
||
form: ke(),
|
||
index: (ye = i.value) == null ? void 0 : ye.index,
|
||
mode: (Me = i.value) == null ? void 0 : Me.mode,
|
||
attrs: i.value,
|
||
getComponentRef(...Re) {
|
||
var ut;
|
||
(ut = l.value) == null || ut.getComponentRef(...Re);
|
||
}
|
||
};
|
||
}
|
||
const S = C(() => {
|
||
var X;
|
||
return (X = s.value) == null ? void 0 : X.buttons;
|
||
}, _), O = M(() => {
|
||
const X = {
|
||
cancel: {},
|
||
reset: {},
|
||
ok: {
|
||
loading: c.value
|
||
}
|
||
}, ye = o(X, S.value), Me = [];
|
||
return Y(ye, (Re, ut) => {
|
||
Re.key = ut, Me.push(Re), Re.onClick == null && Re.click != null && (Re.onClick = () => {
|
||
Re.click(R());
|
||
});
|
||
}), Cn(Me, (Re) => Re.order ?? ln.orderDefault);
|
||
});
|
||
_n(async () => {
|
||
e.options != null && await D(e.options), t.emit("mounted", Go().exposed);
|
||
});
|
||
const Q = K(!1), se = M(() => {
|
||
var X;
|
||
return !((X = a.value) != null && X.endsWith("drawer"));
|
||
});
|
||
function ie() {
|
||
Q.value = !Q.value;
|
||
}
|
||
const de = qe.get(), _e = M(() => u.value.inner ? de.formWrapper.buildInnerBind({
|
||
getInnerWrapper() {
|
||
if (u.value.innerContainerSelector) {
|
||
const X = document.querySelector(u.value.innerContainerSelector);
|
||
if (X)
|
||
return X.classList.add("fs-form-inner-wrapper"), X;
|
||
console.error(`找不到选择器为${u.value.innerContainerSelector}的元素`);
|
||
}
|
||
return e.innerWrapper;
|
||
}
|
||
}) : {});
|
||
t.expose({
|
||
formWrapperId: p,
|
||
formWrapperIdClass: y,
|
||
close: A,
|
||
doClose: k,
|
||
onClosed: N,
|
||
onOpened: J,
|
||
open: D,
|
||
title: v,
|
||
fullscreenEnabled: se,
|
||
fullscreen: Q,
|
||
toggleFullscreen: ie,
|
||
formOptions: i,
|
||
formWrapperIs: a,
|
||
formWrapperOpen: r,
|
||
formWrapperBind: s,
|
||
formRef: l,
|
||
submit: Z,
|
||
reset: Se,
|
||
computedButtons: O,
|
||
loading: c,
|
||
getFormData: ke,
|
||
setFormData: m,
|
||
onValueChange: ue,
|
||
innerBind: _e,
|
||
formWrapperSlots: b,
|
||
form: ke(),
|
||
wrapperBindRef: s,
|
||
formOptionsRef: i,
|
||
mode: (Le = i.value) == null ? void 0 : Le.mode
|
||
});
|
||
const Pe = qr();
|
||
return () => {
|
||
if (!s.value)
|
||
return null;
|
||
const X = qe.get();
|
||
let ye = {};
|
||
const Me = {
|
||
...Pe,
|
||
...b.value
|
||
}, Re = (Mt, cn, nt = Me) => nt[Mt] ? nt[Mt](cn) : null, ut = a.value || "el-dialog";
|
||
if (i.value) {
|
||
const {
|
||
index: Mt,
|
||
mode: cn
|
||
} = i.value || {}, nt = {
|
||
_self: this,
|
||
index: Mt,
|
||
mode: cn,
|
||
getFormData: ke
|
||
};
|
||
ye = {
|
||
[X.formWrapper.titleSlotName]: () => {
|
||
let xn = null;
|
||
return se.value && (xn = x(G("fs-icon"), {
|
||
class: "fs-fullscreen-icon",
|
||
onClick: ie,
|
||
icon: Q.value ? X.icons.fullScreen : X.icons.unFullScreen
|
||
}, null)), x("div", {
|
||
class: "fs-form-header"
|
||
}, [x("div", {
|
||
class: "fs-form-header-left"
|
||
}, [Re("form-header-left", nt), v.value, Re("form-header-right", nt)]), x("div", {
|
||
class: "fs-form-header-action"
|
||
}, [Re("form-header-action-left", nt), xn, Re("form-header-action-right", nt)])]);
|
||
},
|
||
default: () => {
|
||
const xn = [];
|
||
return Y(O.value, (sa) => {
|
||
sa.show !== !1 && xn.push(x(G("fs-button"), sa, null));
|
||
}), x("div", {
|
||
class: "fs-form-wrapper-body"
|
||
}, [x("div", {
|
||
class: "fs-form-body"
|
||
}, [Re("form-body-top", nt), x("div", {
|
||
class: "fs-form-content"
|
||
}, [Re("form-body-left", nt), x(G("fs-form"), z({
|
||
ref: l
|
||
}, i.value, {
|
||
onValueChange: ue
|
||
}), null), Re("form-body-right", nt)]), Re("form-body-bottom", nt)]), x("div", {
|
||
class: "fs-form-footer-btns"
|
||
}, [Re("form-footer-left", nt), xn, Re("form-footer-right", nt)])]);
|
||
}
|
||
};
|
||
}
|
||
if (X.formWrapper.hasContentWrap) {
|
||
const Mt = X.formWrapper.hasContentWrap(ut), cn = ye;
|
||
if (Mt) {
|
||
const nt = H(Mt);
|
||
ye = {
|
||
default: () => x(nt, null, Hc(cn) ? cn : {
|
||
default: () => [cn]
|
||
})
|
||
};
|
||
}
|
||
}
|
||
const aa = X.formWrapper.visible, Hi = {
|
||
[aa]: r.value,
|
||
["onUpdate:" + aa]: async (Mt) => {
|
||
if (Mt === !1 && r.value)
|
||
return await k();
|
||
r.value = Mt;
|
||
}
|
||
}, zi = X.formWrapper.buildOnClosedBind(ut, N), ia = X.formWrapper.customClass(ut), Wi = `${Q.value ? "fs-fullscreen" : ""} ${s.value[ia] || ""}`, Ui = {
|
||
[ia]: Wi
|
||
}, Ki = {
|
||
fullscreen: Q.value
|
||
}, Yi = {
|
||
zIndex: s.value.zIndex || e.zIndex
|
||
}, Gi = H(ut);
|
||
return x(Gi, z(s.value, Ui, Hi, zi, Ki, _e.value, Yi, L.value), ye);
|
||
};
|
||
}
|
||
}), zc = le({
|
||
name: "FsFormProvider"
|
||
}), Wc = /* @__PURE__ */ le({
|
||
...zc,
|
||
setup(e) {
|
||
const t = K({});
|
||
return sn("use:form:wrapper", () => ({
|
||
open(n) {
|
||
const o = n.id || Math.floor(Math.random() * 1e6) + "";
|
||
return new Promise((r, a) => {
|
||
t.value[o] = {
|
||
id: o,
|
||
// zIndex: getMaxZIndex() + 1,
|
||
async onMounted(i) {
|
||
await i.open(n), r(i);
|
||
},
|
||
onClosed() {
|
||
n.id || delete t.value[o];
|
||
}
|
||
};
|
||
});
|
||
}
|
||
})), (n, o) => (w(), j(be, null, [
|
||
re(n.$slots, "default"),
|
||
(w(!0), j(be, null, Te(t.value, (r) => (w(), I(q(ro), z({
|
||
key: r.id
|
||
}, { ref_for: !0 }, r), null, 16))), 128))
|
||
], 64));
|
||
}
|
||
});
|
||
_t.trace("fs-table");
|
||
function Uc(e, t) {
|
||
sn("get:columns", () => e.table.columns), sn("update:columns", (n) => {
|
||
t.emit("update:columns", n);
|
||
}), sn("get:crudBinding", () => e);
|
||
}
|
||
function Kc(e, t) {
|
||
const n = K(), o = () => n.value, r = () => n.value ? n.value.getForm() : (ce.warn("请使用expose.getSearchFormData代替"), {}), a = () => n.value ? n.value.getValidatedForm() : (ce.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 Yc(e, t, n) {
|
||
return {
|
||
tabsBinding: M(() => {
|
||
var r, a, i, s, u, l, c;
|
||
if (t.tabs && t.tabs.show && t.tabs.name) {
|
||
let d = null;
|
||
const f = { ...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, f.value == null && (f.value = d.value), f.label == null && (f.label = d.label), f.options == null && (f.options = d.data || [])), {
|
||
...f,
|
||
modelValue: t.search.validatedForm && t.search.validatedForm[t.tabs.name],
|
||
"onUpdate:modelValue": (h) => {
|
||
n.emit("tab-change", { [t.tabs.name]: h });
|
||
}
|
||
};
|
||
}
|
||
return {
|
||
show: !1
|
||
};
|
||
})
|
||
};
|
||
}
|
||
function wo(e, t) {
|
||
if (!e)
|
||
return {};
|
||
const n = {};
|
||
return Y(e, (o, r) => {
|
||
r.startsWith(t) && (n[r] = o);
|
||
}), n;
|
||
}
|
||
function Gc(e, t, { tableRef: n, containerRef: o }) {
|
||
var l;
|
||
const r = qe.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 f = c.getBoundingClientRect().height, h = d.getBoundingClientRect().height;
|
||
i.value = f - h - 2 + (e.table.maxHeightAdjust || 0), ce.debug("table max height recomputed ", i.value);
|
||
}
|
||
function u() {
|
||
var h;
|
||
const c = (h = n == null ? void 0 : n.value) == null ? void 0 : h.$el;
|
||
if (c == null)
|
||
return;
|
||
const d = c.parentNode;
|
||
new ResizeObserver(function(v) {
|
||
ce.debug("table resized", v), v.length > 0 && v[0].contentRect.height > 0 && (s(), setTimeout(() => {
|
||
s();
|
||
}, 200), setTimeout(() => {
|
||
s();
|
||
}, 500));
|
||
}).observe(d);
|
||
}
|
||
return _n(async () => {
|
||
await Be(), await Be(), u();
|
||
}), { maxHeightRef: i, computeBodyHeight: s };
|
||
}
|
||
function Xc(e, t) {
|
||
const n = qe.get(), o = K(), r = K(), a = K(), { maxHeightRef: i, computeBodyHeight: s } = Gc(e, t, { tableRef: o, containerRef: a }), { merge: u } = $e(), l = la(e, "table"), c = M(() => {
|
||
var P;
|
||
let T = {};
|
||
if ((i == null ? void 0 : i.value) != null) {
|
||
let W = n.table;
|
||
((P = e.table) == null ? void 0 : P.tableVersion) === "v2" && (W = n.tableV2), T = W.buildMaxHeight(i.value);
|
||
}
|
||
const E = _t.dash.omit(l, "loading", "columns", "columnsMap");
|
||
return u(T, { ...t.attrs, ...E });
|
||
}), d = la(e, "toolbar"), f = M(() => wo(t.slots, "cell")), h = M(() => wo(t.slots, "form")), v = M(() => wo(t.slots, "search")), p = M(() => wo(t.slots, "toolbar")), y = K(), b = M(() => {
|
||
const T = { compact: e.toolbar.compact !== !1 };
|
||
return e.customClass && (T[e.customClass] = !0), T;
|
||
}), R = K(), D = K(!1);
|
||
return {
|
||
tableRef: o,
|
||
containerRef: a,
|
||
toolbarRef: r,
|
||
computedTable: c,
|
||
computedToolbar: d,
|
||
computedCellSlots: f,
|
||
formWrapperRef: y,
|
||
isFormInner: D,
|
||
onFormInnerChange: (T) => {
|
||
D.value = T;
|
||
},
|
||
computedFormSlots: h,
|
||
computedSearchSlots: v,
|
||
computedToolbarSlots: p,
|
||
computeBodyHeight: s,
|
||
computedClass: b,
|
||
innerWrapperRef: R
|
||
};
|
||
}
|
||
const Qc = le({
|
||
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 } = we();
|
||
Uc(e, t);
|
||
const o = Kc(), r = Yc(o, e, t), a = Xc(e, t);
|
||
return {
|
||
ui: n,
|
||
...o,
|
||
...a,
|
||
...r
|
||
};
|
||
}
|
||
});
|
||
const Jc = { class: "fs-crud-search" }, Zc = {
|
||
key: 0,
|
||
class: "fs-crud-actionbar"
|
||
}, ed = {
|
||
key: 0,
|
||
class: "fs-crud-toolbar"
|
||
}, td = { class: "fs-crud-pagination" }, nd = { class: "fs-pagination-left" }, od = { class: "fs-pagination" }, rd = { class: "fs-pagination-right" };
|
||
function ad(e, t, n, o, r, a) {
|
||
var d;
|
||
const i = G("fs-actionbar"), s = G("fs-toolbar"), u = G("fs-tabs-filter"), l = G("fs-table"), c = G("fs-form-wrapper");
|
||
return w(), I(H(((d = e.container) == null ? void 0 : d.is) || "fs-layout-default"), z({
|
||
ref: "containerRef",
|
||
class: "fs-crud-container"
|
||
}, e.container, { class: e.computedClass }), {
|
||
"header-top": B(() => [
|
||
re(e.$slots, "header-top")
|
||
]),
|
||
"header-bottom": B(() => [
|
||
re(e.$slots, "header-bottom")
|
||
]),
|
||
"header-middle": B(() => [
|
||
re(e.$slots, "header-middle")
|
||
]),
|
||
search: B(() => [
|
||
te("div", Jc, [
|
||
(w(), I(H(e.search.is || "fs-search"), z({ ref: "searchRef" }, e.search, { slots: e.computedSearchSlots }), null, 16, ["slots"]))
|
||
])
|
||
]),
|
||
actionbar: B(() => [
|
||
e.actionbar && e.actionbar.show !== !1 ? (w(), j("div", Zc, [
|
||
re(e.$slots, "actionbar-left"),
|
||
x(i, xe(Lt(e.actionbar)), null, 16),
|
||
re(e.$slots, "actionbar-right")
|
||
])) : oe("", !0)
|
||
]),
|
||
toolbar: B(() => [
|
||
e.toolbar && e.toolbar.show !== !1 ? (w(), j("div", ed, [
|
||
re(e.$slots, "toolbar-left"),
|
||
x(s, z({ ref: "toolbarRef" }, e.toolbar, {
|
||
slots: e.computedToolbarSlots,
|
||
columns: e.table.columns
|
||
}), null, 16, ["slots", "columns"]),
|
||
re(e.$slots, "toolbar-right")
|
||
])) : oe("", !0)
|
||
]),
|
||
tabs: B(() => [
|
||
e.tabsBinding.show ? (w(), I(u, z({
|
||
key: 0,
|
||
ref: "tabsRef",
|
||
class: "fs-tabs"
|
||
}, e.tabsBinding), null, 16)) : oe("", !0)
|
||
]),
|
||
table: B(() => [
|
||
x(l, z({
|
||
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: B(() => [
|
||
te("div", {
|
||
ref: "innerWrapperRef",
|
||
class: St(["fs-form-wrapper-container", { "fs-form-inner-wrapper": e.isFormInner }])
|
||
}, [
|
||
x(c, {
|
||
ref: "formWrapperRef",
|
||
slots: e.computedFormSlots,
|
||
"inner-wrapper": e.innerWrapperRef,
|
||
onInnerChange: e.onFormInnerChange,
|
||
onValueChange: t[0] || (t[0] = (f) => e.$emit("form-value-change", f))
|
||
}, null, 8, ["slots", "inner-wrapper", "onInnerChange"])
|
||
], 2)
|
||
]),
|
||
pagination: B(() => [
|
||
te("div", td, [
|
||
te("div", nd, [
|
||
re(e.$slots, "pagination-left")
|
||
]),
|
||
te("div", od, [
|
||
e.pagination.show !== !1 ? (w(), I(H(e.ui.pagination.name), xe(z({ key: 0 }, e.pagination)), null, 16)) : oe("", !0)
|
||
]),
|
||
te("div", rd, [
|
||
re(e.$slots, "pagination-right")
|
||
])
|
||
])
|
||
]),
|
||
"footer-top": B(() => [
|
||
re(e.$slots, "footer-top")
|
||
]),
|
||
"footer-bottom": B(() => [
|
||
re(e.$slots, "footer-bottom")
|
||
]),
|
||
default: B(() => [
|
||
re(e.$slots, "default")
|
||
]),
|
||
_: 3
|
||
}, 16, ["class"]);
|
||
}
|
||
const id = /* @__PURE__ */ Oe(Qc, [["render", ad]]), sd = le({
|
||
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 } = we(), { merge: o } = $e(), { t: r } = lt(), a = M(() => ({
|
||
...e.scope,
|
||
row: e.scope[n.tableColumn.row],
|
||
index: e.scope[n.tableColumn.index]
|
||
})), i = (y) => {
|
||
const b = e.scope[n.tableColumn.index], R = e.scope[n.tableColumn.row], D = { key: y.key, row: R, btn: y, index: b, ...e.scope };
|
||
if (y.click)
|
||
return y.click(D);
|
||
t.emit("handle", D);
|
||
}, { doComputed: s } = Pt(), u = M(() => ({
|
||
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 = M(() => {
|
||
let y = null;
|
||
if (l.value.active == null || l.value.active === "default") {
|
||
const R = {
|
||
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(R, l.value.buttons);
|
||
} else
|
||
y = l.value.group[l.value.active];
|
||
const b = [];
|
||
return Y(y, (R, D) => {
|
||
R.key = D, R.show !== !1 && b.push(R);
|
||
}), Cn(b, (R) => R.order ?? ln.orderDefault);
|
||
}), d = M(() => 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 f(y, b) {
|
||
return y.dropdown === !0 || d.value > 0 && d.value < b;
|
||
}
|
||
const h = M(() => {
|
||
let y = 0;
|
||
for (const b of c.value) {
|
||
if (f(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 = M(() => {
|
||
const y = {};
|
||
if (n.dropdown.renderMode !== "slot") {
|
||
const b = c.value, R = [];
|
||
Y(b, (D, $) => {
|
||
D.show !== !1 && f(D, $) && R.push({
|
||
[n.dropdown.value]: D.key,
|
||
[n.dropdown.label]: D.text,
|
||
title: D.title
|
||
});
|
||
}), y.options = R;
|
||
}
|
||
return {
|
||
...wn(e.dropdown, "more", "atLeast"),
|
||
...n.dropdown.command(v),
|
||
...y
|
||
};
|
||
});
|
||
return {
|
||
ui: n,
|
||
hasDropdownBtn: h,
|
||
computedHandleBtns: c,
|
||
doDropdownItemClick: v,
|
||
computedDropdownAtLeast: d,
|
||
doClick: i,
|
||
isDropdownBtn: f,
|
||
scopeRef: a,
|
||
computedDropdownBinding: p
|
||
};
|
||
}
|
||
});
|
||
const ld = { class: "fs-row-handle" }, ud = {
|
||
key: 0,
|
||
class: "row-handle-btn fs-handle-row-dropdown"
|
||
};
|
||
function cd(e, t, n, o, r, a) {
|
||
const i = G("fs-render"), s = G("fs-button"), u = G("fs-icon");
|
||
return w(), j("div", ld, [
|
||
re(e.$slots, "cell-rowHandle-left", xe(Lt(e.scopeRef))),
|
||
(w(!0), j(be, null, Te(e.computedHandleBtns, (l, c) => (w(), j(be, { key: c }, [
|
||
l.show !== !1 && !e.isDropdownBtn(l, c) ? (w(), j(be, { key: 0 }, [
|
||
l.render ? (w(), I(i, {
|
||
key: 0,
|
||
"render-func": l.render,
|
||
scope: e.scopeRef
|
||
}, null, 8, ["render-func", "scope"])) : (w(), I(s, z({
|
||
key: 1,
|
||
class: "row-handle-btn"
|
||
}, { ref_for: !0 }, l, {
|
||
onClick: rs((d) => e.doClick(l), ["stop"])
|
||
}), null, 16, ["onClick"]))
|
||
], 64)) : oe("", !0)
|
||
], 64))), 128)),
|
||
re(e.$slots, "cell-rowHandle-middle", xe(Lt(e.scope))),
|
||
e.hasDropdownBtn ? (w(), j("span", ud, [
|
||
(w(), I(H(e.ui.dropdown.name), xe(Lt(e.computedDropdownBinding)), {
|
||
[e.ui.dropdown.slotName]: B(() => [
|
||
e.ui.dropdown.renderMode === "slot" ? (w(), I(H(e.ui.dropdownMenu.name), xe(z({ key: 0 }, e.ui.dropdownMenu.command(e.doDropdownItemClick))), {
|
||
default: B(() => [
|
||
(w(!0), j(be, null, Te(e.computedHandleBtns, (l, c) => (w(), j(be, { key: c }, [
|
||
l.show !== !1 && e.isDropdownBtn(l, c) ? (w(), I(H(e.ui.dropdownItem.name), z({
|
||
key: 0,
|
||
[e.ui.dropdownItem.command || ""]: l.key
|
||
}, { ref_for: !0 }, l.dropdownItem, {
|
||
disabled: l.disabled
|
||
}), {
|
||
default: B(() => [
|
||
te("div", z({ class: "fs-row-handle-dropdown-item" }, { ref_for: !0 }, l), [
|
||
l.icon ? (w(), I(u, {
|
||
key: 0,
|
||
icon: l.icon
|
||
}, null, 8, ["icon"])) : oe("", !0),
|
||
Vt(" " + We(l.text || l.title), 1)
|
||
], 16)
|
||
]),
|
||
_: 2
|
||
}, 1040, ["disabled"])) : oe("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16)) : oe("", !0)
|
||
]),
|
||
default: B(() => [
|
||
x(s, xe(Lt(e.dropdown.more)), null, 16)
|
||
]),
|
||
_: 2
|
||
}, 1040))
|
||
])) : oe("", !0),
|
||
re(e.$slots, "cell-rowHandle-right", xe(Lt(e.scope)))
|
||
]);
|
||
}
|
||
const dd = /* @__PURE__ */ Oe(sd, [["render", cd]]);
|
||
function pn() {
|
||
return pn = 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;
|
||
}, pn.apply(this, arguments);
|
||
}
|
||
function fd(e, t) {
|
||
e.prototype = Object.create(t.prototype), e.prototype.constructor = e, ao(e, t);
|
||
}
|
||
function Or(e) {
|
||
return Or = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(n) {
|
||
return n.__proto__ || Object.getPrototypeOf(n);
|
||
}, Or(e);
|
||
}
|
||
function ao(e, t) {
|
||
return ao = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(o, r) {
|
||
return o.__proto__ = r, o;
|
||
}, ao(e, t);
|
||
}
|
||
function hd() {
|
||
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 Eo(e, t, n) {
|
||
return hd() ? Eo = Reflect.construct.bind() : Eo = function(r, a, i) {
|
||
var s = [null];
|
||
s.push.apply(s, a);
|
||
var u = Function.bind.apply(r, s), l = new u();
|
||
return i && ao(l, i.prototype), l;
|
||
}, Eo.apply(null, arguments);
|
||
}
|
||
function md(e) {
|
||
return Function.toString.call(e).indexOf("[native code]") !== -1;
|
||
}
|
||
function Er(e) {
|
||
var t = typeof Map == "function" ? /* @__PURE__ */ new Map() : void 0;
|
||
return Er = function(o) {
|
||
if (o === null || !md(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 Eo(o, arguments, Or(this).constructor);
|
||
}
|
||
return r.prototype = Object.create(o.prototype, {
|
||
constructor: {
|
||
value: r,
|
||
enumerable: !1,
|
||
writable: !0,
|
||
configurable: !0
|
||
}
|
||
}), ao(r, o);
|
||
}, Er(e);
|
||
}
|
||
var pd = /%[sdj%]/g, vi = function() {
|
||
};
|
||
typeof process < "u" && process.env && process.env.NODE_ENV !== "production" && typeof window < "u" && typeof document < "u" && (vi = 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 Tr(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(pd, 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 gd(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 || gd(t) && typeof e == "string" && !e);
|
||
}
|
||
function vd(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 va(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 bd(e) {
|
||
var t = [];
|
||
return Object.keys(e).forEach(function(n) {
|
||
t.push.apply(t, e[n] || []);
|
||
}), t;
|
||
}
|
||
var ba = /* @__PURE__ */ function(e) {
|
||
fd(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__ */ Er(Error));
|
||
function yd(e, t, n, o, r) {
|
||
if (t.first) {
|
||
var a = new Promise(function(f, h) {
|
||
var v = function(b) {
|
||
return o(b), b.length ? h(new ba(b, Tr(b))) : f(r);
|
||
}, p = bd(e);
|
||
va(p, n, v);
|
||
});
|
||
return a.catch(function(f) {
|
||
return f;
|
||
}), 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(f, h) {
|
||
var v = function(y) {
|
||
if (c.push.apply(c, y), l++, l === u)
|
||
return o(c), c.length ? h(new ba(c, Tr(c))) : f(r);
|
||
};
|
||
s.length || (o(c), f(r)), s.forEach(function(p) {
|
||
var y = e[p];
|
||
i.indexOf(p) !== -1 ? va(y, n, v) : vd(y, n, v);
|
||
});
|
||
});
|
||
return d.catch(function(f) {
|
||
return f;
|
||
}), d;
|
||
}
|
||
function wd(e) {
|
||
return !!(e && e.message !== void 0);
|
||
}
|
||
function _d(e, t) {
|
||
for (var n = e, o = 0; o < t.length; o++) {
|
||
if (n == null)
|
||
return n;
|
||
n = n[t[o]];
|
||
}
|
||
return n;
|
||
}
|
||
function ya(e, t) {
|
||
return function(n) {
|
||
var o;
|
||
return e.fullFields ? o = _d(t, e.fullFields) : o = t[n.field || e.fullField], wd(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 wa(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] = pn({}, e[n], o) : e[n] = o;
|
||
}
|
||
}
|
||
return e;
|
||
}
|
||
var bi = 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));
|
||
}, Cd = function(t, n, o, r, a) {
|
||
(/^\s+$/.test(n) || n === "") && r.push(wt(a.messages.whitespace, t.fullField));
|
||
}, _o, Sd = function() {
|
||
if (_o)
|
||
return _o;
|
||
var e = "[a-fA-F\\d:]", t = function($) {
|
||
return $ && $.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($) {
|
||
return $ && $.exact ? a : new RegExp("(?:" + t($) + n + t($) + ")|(?:" + t($) + r + t($) + ")", "g");
|
||
};
|
||
u.v4 = function(D) {
|
||
return D && D.exact ? i : new RegExp("" + t(D) + n + t(D), "g");
|
||
}, u.v6 = function(D) {
|
||
return D && D.exact ? s : new RegExp("" + t(D) + r + t(D), "g");
|
||
};
|
||
var l = "(?:(?:[a-z]+:)?//)", c = "(?:\\S+(?::\\S*)?@)?", d = u.v4().source, f = u.v6().source, h = "(?:(?:[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"]*)?', R = "(?:" + l + "|www\\.)" + c + "(?:localhost|" + d + "|" + f + "|" + h + v + p + ")" + y + b;
|
||
return _o = new RegExp("(?:^" + R + "$)", "i"), _o;
|
||
}, _a = {
|
||
// 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
|
||
}, Wn = {
|
||
integer: function(t) {
|
||
return Wn.number(t) && parseInt(t, 10) === t;
|
||
},
|
||
float: function(t) {
|
||
return Wn.number(t) && !Wn.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" && !Wn.array(t);
|
||
},
|
||
method: function(t) {
|
||
return typeof t == "function";
|
||
},
|
||
email: function(t) {
|
||
return typeof t == "string" && t.length <= 320 && !!t.match(_a.email);
|
||
},
|
||
url: function(t) {
|
||
return typeof t == "string" && t.length <= 2048 && !!t.match(Sd());
|
||
},
|
||
hex: function(t) {
|
||
return typeof t == "string" && !!t.match(_a.hex);
|
||
}
|
||
}, Fd = function(t, n, o, r, a) {
|
||
if (t.required && n === void 0) {
|
||
bi(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 ? Wn[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));
|
||
}, Rd = 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, f = typeof n == "number", h = typeof n == "string", v = Array.isArray(n);
|
||
if (f ? d = "number" : h ? d = "string" : v && (d = "array"), !d)
|
||
return !1;
|
||
v && (c = n.length), h && (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));
|
||
}, Fn = "enum", Dd = function(t, n, o, r, a) {
|
||
t[Fn] = Array.isArray(t[Fn]) ? t[Fn] : [], t[Fn].indexOf(n) === -1 && r.push(wt(a.messages[Fn], t.fullField, t[Fn].join(", ")));
|
||
}, kd = 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));
|
||
}
|
||
}
|
||
}, Ce = {
|
||
required: bi,
|
||
whitespace: Cd,
|
||
type: Fd,
|
||
range: Rd,
|
||
enum: Dd,
|
||
pattern: kd
|
||
}, $d = 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();
|
||
Ce.required(t, n, r, i, a, "string"), Ye(n, "string") || (Ce.type(t, n, r, i, a), Ce.range(t, n, r, i, a), Ce.pattern(t, n, r, i, a), t.whitespace === !0 && Ce.whitespace(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, Od = 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();
|
||
Ce.required(t, n, r, i, a), n !== void 0 && Ce.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Ed = 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();
|
||
Ce.required(t, n, r, i, a), n !== void 0 && (Ce.type(t, n, r, i, a), Ce.range(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, Td = 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();
|
||
Ce.required(t, n, r, i, a), n !== void 0 && Ce.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Id = 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();
|
||
Ce.required(t, n, r, i, a), Ye(n) || Ce.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Ad = 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();
|
||
Ce.required(t, n, r, i, a), n !== void 0 && (Ce.type(t, n, r, i, a), Ce.range(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, Vd = 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();
|
||
Ce.required(t, n, r, i, a), n !== void 0 && (Ce.type(t, n, r, i, a), Ce.range(t, n, r, i, a));
|
||
}
|
||
o(i);
|
||
}, Pd = 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();
|
||
Ce.required(t, n, r, i, a, "array"), n != null && (Ce.type(t, n, r, i, a), Ce.range(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();
|
||
Ce.required(t, n, r, i, a), n !== void 0 && Ce.type(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Bd = "enum", 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();
|
||
Ce.required(t, n, r, i, a), n !== void 0 && Ce[Bd](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, "string") && !t.required)
|
||
return o();
|
||
Ce.required(t, n, r, i, a), Ye(n, "string") || Ce.pattern(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, "date") && !t.required)
|
||
return o();
|
||
if (Ce.required(t, n, r, i, a), !Ye(n, "date")) {
|
||
var u;
|
||
n instanceof Date ? u = n : u = new Date(n), Ce.type(t, u, r, i, a), u && Ce.range(t, u.getTime(), r, i, a);
|
||
}
|
||
}
|
||
o(i);
|
||
}, Ld = function(t, n, o, r, a) {
|
||
var i = [], s = Array.isArray(n) ? "array" : typeof n;
|
||
Ce.required(t, n, r, i, a, s), o(i);
|
||
}, ar = 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();
|
||
Ce.required(t, n, r, s, a, i), Ye(n, i) || Ce.type(t, n, r, s, a);
|
||
}
|
||
o(s);
|
||
}, qd = 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();
|
||
Ce.required(t, n, r, i, a);
|
||
}
|
||
o(i);
|
||
}, Gn = {
|
||
string: $d,
|
||
method: Od,
|
||
number: Ed,
|
||
boolean: Td,
|
||
regexp: Id,
|
||
integer: Ad,
|
||
float: Vd,
|
||
array: Pd,
|
||
object: Md,
|
||
enum: jd,
|
||
pattern: Nd,
|
||
date: xd,
|
||
url: ar,
|
||
hex: ar,
|
||
email: ar,
|
||
required: Ld,
|
||
any: qd
|
||
};
|
||
function Ir() {
|
||
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 Ar = Ir(), po = /* @__PURE__ */ function() {
|
||
function e(n) {
|
||
this.rules = null, this._messages = Ar, 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 = wa(Ir(), 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 R($) {
|
||
if (Array.isArray($)) {
|
||
var T;
|
||
y = (T = y).concat.apply(T, $);
|
||
} else
|
||
y.push($);
|
||
}
|
||
for (var D = 0; D < p.length; D++)
|
||
R(p[D]);
|
||
y.length ? (b = Tr(y), l(y, b)) : l(null, s);
|
||
}
|
||
if (u.messages) {
|
||
var d = this.messages();
|
||
d === Ar && (d = Ir()), wa(d, u.messages), u.messages = d;
|
||
} else
|
||
u.messages = this.messages();
|
||
var f = {}, h = u.keys || Object.keys(this.rules);
|
||
h.forEach(function(p) {
|
||
var y = i.rules[p], b = s[p];
|
||
y.forEach(function(R) {
|
||
var D = R;
|
||
typeof D.transform == "function" && (s === o && (s = pn({}, s)), b = s[p] = D.transform(b)), typeof D == "function" ? D = {
|
||
validator: D
|
||
} : D = pn({}, D), D.validator = i.getValidationMethod(D), D.validator && (D.field = p, D.fullField = D.fullField || p, D.type = i.getType(D), f[p] = f[p] || [], f[p].push({
|
||
rule: D,
|
||
value: b,
|
||
source: s,
|
||
field: p
|
||
}));
|
||
});
|
||
});
|
||
var v = {};
|
||
return yd(f, u, function(p, y) {
|
||
var b = p.rule, R = (b.type === "object" || b.type === "array") && (typeof b.fields == "object" || typeof b.defaultField == "object");
|
||
R = R && (b.required || !b.required && p.value), b.field = p.field;
|
||
function D(E, P) {
|
||
return pn({}, P, {
|
||
fullField: b.fullField + "." + E,
|
||
fullFields: b.fullFields ? [].concat(b.fullFields, [E]) : [E]
|
||
});
|
||
}
|
||
function $(E) {
|
||
E === void 0 && (E = []);
|
||
var P = Array.isArray(E) ? E : [E];
|
||
!u.suppressWarning && P.length && e.warning("async-validator:", P), P.length && b.message !== void 0 && (P = [].concat(b.message));
|
||
var W = P.map(ya(b, s));
|
||
if (u.first && W.length)
|
||
return v[b.field] = 1, y(W);
|
||
if (!R)
|
||
y(W);
|
||
else {
|
||
if (b.required && !p.value)
|
||
return b.message !== void 0 ? W = [].concat(b.message).map(ya(b, s)) : u.error && (W = [u.error(b, wt(u.messages.required, b.field))]), y(W);
|
||
var F = {};
|
||
b.defaultField && Object.keys(p.value).map(function(L) {
|
||
F[L] = b.defaultField;
|
||
}), F = pn({}, F, p.rule.fields);
|
||
var V = {};
|
||
Object.keys(F).forEach(function(L) {
|
||
var A = F[L], k = Array.isArray(A) ? A : [A];
|
||
V[L] = k.map(D.bind(null, L));
|
||
});
|
||
var ne = new e(V);
|
||
ne.messages(u.messages), p.rule.options && (p.rule.options.messages = u.messages, p.rule.options.error = u.error), ne.validate(p.value, p.rule.options || u, function(L) {
|
||
var A = [];
|
||
W && W.length && A.push.apply(A, W), L && L.length && A.push.apply(A, L), y(A.length ? A : null);
|
||
});
|
||
}
|
||
}
|
||
var T;
|
||
if (b.asyncValidator)
|
||
T = b.asyncValidator(b, p.value, $, p.source, u);
|
||
else if (b.validator) {
|
||
try {
|
||
T = b.validator(b, p.value, $, p.source, u);
|
||
} catch (E) {
|
||
console.error == null || console.error(E), u.suppressValidatorError || setTimeout(function() {
|
||
throw E;
|
||
}, 0), $(E.message);
|
||
}
|
||
T === !0 ? $() : T === !1 ? $(typeof b.message == "function" ? b.message(b.fullField || b.field) : b.message || (b.fullField || b.field) + " fails") : T instanceof Array ? $(T) : T instanceof Error && $(T.message);
|
||
}
|
||
T && T.then && T.then(function() {
|
||
return $();
|
||
}, function(E) {
|
||
return $(E);
|
||
});
|
||
}, 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 && !Gn.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" ? Gn.required : Gn[this.getType(o)] || void 0;
|
||
}, e;
|
||
}();
|
||
po.register = function(t, n) {
|
||
if (typeof n != "function")
|
||
throw new Error("Cannot register a validator by type, validator is not a function");
|
||
Gn[t] = n;
|
||
};
|
||
po.warning = vi;
|
||
po.messages = Ar;
|
||
po.validators = Gn;
|
||
function Hd(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 po(t);
|
||
}
|
||
function Vr(e, t) {
|
||
Y(e, (n) => {
|
||
n.children ? Vr(n.children, t) : t(n);
|
||
});
|
||
}
|
||
function zd(e, t) {
|
||
const n = qe.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 Wd(e, t, n) {
|
||
const o = zd(e, n), r = yn([]);
|
||
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 }) => {
|
||
Y(S, (O, Q) => {
|
||
m({ rowData: C, row: _, cells: S, cell: O, key: Q });
|
||
});
|
||
});
|
||
}
|
||
const { merge: l } = $e(), c = M(() => 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(_e) {
|
||
return st(m, _e);
|
||
}
|
||
function Q(_e, Pe) {
|
||
tt(m, _e, Pe);
|
||
}
|
||
const se = M(() => {
|
||
var _e;
|
||
return ((_e = S.editable) == null ? void 0 : _e.updateCell) || c.value.updateCell;
|
||
}), ie = M(() => {
|
||
var _e;
|
||
return ((_e = S.editable) == null ? void 0 : _e.showAction) || c.value.showAction;
|
||
}), de = yn({
|
||
mode: _ < 0 ? "add" : "edit",
|
||
oldValue: void 0,
|
||
newValue: void 0,
|
||
loading: !1,
|
||
isEditing: c.value.activeDefault,
|
||
activeTrigger: c.value.activeTrigger,
|
||
column: S,
|
||
updateCell: se,
|
||
showAction: ie,
|
||
isEditable: () => {
|
||
var Le;
|
||
let _e = (Le = S == null ? void 0 : S.editable) == null ? void 0 : Le.disabled;
|
||
_e instanceof Function && (_e = _e({ column: S, editableId: _, row: m }));
|
||
let Pe = null;
|
||
return _e != null && (Pe = !_e), Pe ?? (c.value.isEditable({ editableId: _, key: C, row: m }) || !1);
|
||
},
|
||
isChanged: () => de.newValue !== de.oldValue,
|
||
getForm: () => {
|
||
let _e = c.value[de.mode + "Form"];
|
||
return _e == null && (_e = c.value.editForm), _e[C];
|
||
},
|
||
active: (_e = {}) => {
|
||
(_e.exclusive ?? c.value.exclusive) && ((_e.exclusiveEffect ?? c.value.exclusiveEffect) === "save" ? $() : T()), de.isEditing = !0, de.oldValue = O(C);
|
||
const Le = c.value.editForm[C];
|
||
Le && ne(Le, m);
|
||
},
|
||
inactive: () => {
|
||
de.isEditing = !1, de.newValue = O(C);
|
||
},
|
||
resume: () => {
|
||
de.isEditing && (de.isEditing = !1, Q(C, de.oldValue), delete de.newValue, delete de.oldValue);
|
||
},
|
||
cancel: () => {
|
||
de.resume();
|
||
},
|
||
persist: () => {
|
||
de.isEditing = !1, delete de.newValue, delete de.oldValue;
|
||
},
|
||
save: async () => {
|
||
const _e = q(de.updateCell);
|
||
if (!_e) {
|
||
ce.warn("没有配置table.editable.updateCell方法,无法保存,相关文档:http://fast-crud.docmirror.cn/api/crud-options/table.html#editable");
|
||
return;
|
||
}
|
||
de.loading = !0;
|
||
try {
|
||
const Pe = await _e({ editableId: _, row: m, key: C, value: O(C) }), Le = m[c.value.rowKey];
|
||
(Le == null || Le <= 0) && ((Pe && Pe[c.value.rowKey]) == null ? ce.error(`对于添加的行,updateCell方法需要返回{'id':value},如果你配置了别的rowKey,需要返回{[rowKey]:id}。
|
||
当前返回值:${JSON.stringify(Pe)}`) : m[c.value.rowKey] = Pe[c.value.rowKey]), de.persist();
|
||
} finally {
|
||
de.loading = !1;
|
||
}
|
||
}
|
||
});
|
||
return de;
|
||
}
|
||
function f(m, C) {
|
||
const _ = {};
|
||
Vr(e.columns, (ie) => {
|
||
_[ie.key] = d(C, ie.key, m, ie);
|
||
});
|
||
const S = M(() => Hd(_)), O = a(C), Q = O == null || O < 0, se = yn({
|
||
isAdd: Q,
|
||
rowData: C,
|
||
editableId: m,
|
||
isEditing: !1,
|
||
loading: !1,
|
||
cells: _,
|
||
validator: S,
|
||
inactive: () => {
|
||
se.isEditing = !1, Y(se.cells, (ie) => {
|
||
ie.isEditing && ie.inactive();
|
||
});
|
||
},
|
||
active: () => {
|
||
se.isEditing = !0, Y(se.cells, (ie) => {
|
||
ie.active({ exclusive: !1 });
|
||
});
|
||
},
|
||
persist: () => {
|
||
se.isEditing = !1, se.inactive(), delete se.isAdd, Y(se.cells, (ie) => {
|
||
ie.persist();
|
||
});
|
||
},
|
||
resume: () => {
|
||
se.isEditing = !1, Y(se.cells, (ie) => {
|
||
ie.resume();
|
||
});
|
||
},
|
||
cancel: () => {
|
||
se.resume();
|
||
},
|
||
validate: async (ie) => {
|
||
try {
|
||
return Y(se.cells, (de, _e) => {
|
||
de.validateErrors = [];
|
||
}), ie == null && (ie = se.rowData), await se.validator.validate(ie), !0;
|
||
} catch (de) {
|
||
const { errors: _e, fields: Pe } = de;
|
||
return Y(Pe, (Le, X) => {
|
||
const ye = se.cells[X];
|
||
ye && (ye.validateErrors = Le);
|
||
}), Pe;
|
||
}
|
||
},
|
||
getRowData: () => {
|
||
const ie = dt(se.rowData);
|
||
return delete ie[e.editable.rowKey], delete ie.children, ie;
|
||
},
|
||
save: async (ie) => {
|
||
const { doSave: de } = ie, _e = se.rowData, { merge: Pe } = $e();
|
||
if (await se.validate() !== !0)
|
||
return;
|
||
function X(Me) {
|
||
Me && (a(Me) == null && console.error("保存接口没有返回rowKey,无法更新该行的id,newRow:", Me), Pe(_e, Me));
|
||
}
|
||
se.loading = !0;
|
||
const ye = se.getRowData();
|
||
try {
|
||
await de({ isAdd: se.isAdd, row: ye, setData: X }), se.persist();
|
||
} finally {
|
||
se.loading = !1;
|
||
}
|
||
}
|
||
});
|
||
if (it(() => C, async (ie, de, _e) => {
|
||
await se.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 de = ie[e.editable.rowKey];
|
||
r[de] = f(de, ie);
|
||
}
|
||
return Q && se.active(), se;
|
||
}
|
||
let h = 0;
|
||
function v() {
|
||
return h++, h;
|
||
}
|
||
function p(m) {
|
||
m == null && (m = o.getData());
|
||
const C = Object.assign({}, r);
|
||
vs(r, (_, S) => {
|
||
delete r[S];
|
||
}), Y(m, (_) => {
|
||
_[e.editable.rowKey] || (_[e.editable.rowKey] = v());
|
||
const S = _[e.editable.rowKey];
|
||
C[S] ? r[S] = C[S] : r[S] = f(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 _;
|
||
}
|
||
it(() => {
|
||
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
|
||
}), it(() => 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
|
||
}), it(() => 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 R(m = {}) {
|
||
u(({ cell: C }) => {
|
||
C.active({ ...m, exclusive: !1 });
|
||
});
|
||
}
|
||
function D() {
|
||
u(({ cell: m }) => {
|
||
m.isEditing && m.inactive();
|
||
});
|
||
}
|
||
async function $() {
|
||
u(({ cell: m }) => {
|
||
m.isEditing && m.save();
|
||
});
|
||
}
|
||
function T() {
|
||
u(({ cell: m }) => {
|
||
m.isEditing && m.cancel();
|
||
});
|
||
}
|
||
function E() {
|
||
D(), 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 }) => {
|
||
Y(C, (_) => {
|
||
if (_.isChanged())
|
||
return m = !0, "break";
|
||
});
|
||
}), m;
|
||
}
|
||
let F = 0;
|
||
function V(m, C) {
|
||
Vr(m, (_) => {
|
||
ne(_, C);
|
||
});
|
||
}
|
||
function ne(m, C) {
|
||
const _ = st(C, m.key), S = q(m.value);
|
||
S != null && _ == null && tt(C, m.key, S);
|
||
}
|
||
async function L(m = { row: void 0, active: !0 }) {
|
||
let C = m.row || { [c.value.rowKey]: --F, [e.rowKey]: F };
|
||
if (V(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 Be();
|
||
const _ = i(C), S = J(_);
|
||
S && S.active();
|
||
}
|
||
}
|
||
function A(m, C) {
|
||
for (let _ = 0; _ < C.length; _++) {
|
||
const S = C[_];
|
||
if (i(S) === m)
|
||
return xa(C, S), !0;
|
||
if (S.children && S.children.length > 0 && A(m, S.children))
|
||
return;
|
||
}
|
||
return !1;
|
||
}
|
||
function k(m) {
|
||
delete r[m], A(m, o.getData());
|
||
}
|
||
function N(m) {
|
||
const { cols: C } = m;
|
||
s(({ cells: _ }) => {
|
||
Y(C, (S) => {
|
||
_[S].active({ ...m, exclusive: !1 });
|
||
});
|
||
});
|
||
}
|
||
function J(m) {
|
||
return r[m];
|
||
}
|
||
function ue() {
|
||
const m = [];
|
||
return s(({ row: C }) => {
|
||
C.isEditing && m.push(C);
|
||
}), m;
|
||
}
|
||
async function Z() {
|
||
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 Se(m) {
|
||
for (const C of m)
|
||
delete C[e.editable.rowKey], C.children && C.children.length > 0 && Se(C.children);
|
||
return m;
|
||
}
|
||
function ke(m) {
|
||
return m == null && (m = dt(o.getData())), m == null ? [] : Se(m);
|
||
}
|
||
return {
|
||
editable: {
|
||
options: c,
|
||
setupEditable: p,
|
||
inactive: D,
|
||
active: R,
|
||
persist: E,
|
||
saveEach: $,
|
||
cancelAll: T,
|
||
resume: P,
|
||
addRow: L,
|
||
removeRow: k,
|
||
getEditableRow: J,
|
||
activeCols: N,
|
||
hasDirty: W,
|
||
getEditableCell: b,
|
||
eachRows: s,
|
||
eachCells: u,
|
||
validate: Z,
|
||
getCleanTableData: ke,
|
||
getActiveRows: ue
|
||
}
|
||
};
|
||
}
|
||
function Ud(e) {
|
||
const t = (o, r) => st(e, `value[${o}].${r}`);
|
||
sn("componentRef:get", t);
|
||
const n = (o, r, a) => tt(e, `value[${o}].${r}`, a);
|
||
return sn("componentRef:set", n), {
|
||
getter: t,
|
||
setter: n
|
||
};
|
||
}
|
||
function Kd({
|
||
props: e,
|
||
ui: t,
|
||
sortedColumns: n,
|
||
renderRowHandle: o,
|
||
renderCellComponent: r
|
||
}) {
|
||
H(t.table.name);
|
||
const a = H(t.tableColumn.name), i = H(t.tableColumnGroup.name);
|
||
t.tableColumn;
|
||
const s = {}, u = (l) => {
|
||
const c = {
|
||
...l.columnSlots
|
||
}, d = "cell_" + l.key;
|
||
let f = a;
|
||
if (l.children)
|
||
c.default = () => {
|
||
const v = [];
|
||
return Y(l.children, (p) => {
|
||
p.show !== !1 && v.push(u(p));
|
||
}), v;
|
||
}, f = i;
|
||
else if (l.type != null) {
|
||
ce.debug("cell render column.type:", l.type);
|
||
const v = e.cellSlots && e.cellSlots[d];
|
||
v && (c.default = v);
|
||
} else
|
||
c.default = (v) => r(l, v);
|
||
const h = {
|
||
...l
|
||
};
|
||
return delete h.children, x(f, z({
|
||
ref: "tableColumnRef"
|
||
}, h, {
|
||
label: l.title,
|
||
prop: l.key,
|
||
dataIndex: l.key
|
||
}), c);
|
||
};
|
||
return s.default = () => {
|
||
var c;
|
||
const l = [];
|
||
if (Y(n, (d) => {
|
||
d.show !== !1 && l.push(u(d));
|
||
}), e.rowHandle && e.rowHandle.show !== !1) {
|
||
const d = {
|
||
default: o,
|
||
...(c = e.rowHandle) == null ? void 0 : c.columnSlots
|
||
};
|
||
l.push(x(a, z({
|
||
ref: "tableColumnRef"
|
||
}, e.rowHandle, {
|
||
label: e.rowHandle.title,
|
||
prop: e.rowHandle.key || "rowHandle"
|
||
}), d));
|
||
}
|
||
return l;
|
||
}, e.slots && Y(e.slots, (l, c) => {
|
||
s[c] = l;
|
||
}), s;
|
||
}
|
||
function yi(e, t) {
|
||
var c;
|
||
const {
|
||
props: n,
|
||
renderRowHandle: o,
|
||
renderCellComponent: r,
|
||
sortedColumns: a
|
||
} = e, {
|
||
ui: i
|
||
} = we(), s = a ?? {}, u = [];
|
||
let l = i.table;
|
||
n.tableVersion === "v2" && (l = i.tableV2);
|
||
for (const d in s) {
|
||
const f = s[d];
|
||
if (f.show === !1)
|
||
continue;
|
||
const h = {
|
||
...f
|
||
};
|
||
if (h._parent = t, h.dataIndex = f.key, u.push(h), f.children != null) {
|
||
const p = {
|
||
...e,
|
||
sortedColumns: f.children
|
||
};
|
||
delete p.renderRowHandle, h.children = yi(p, h);
|
||
} else if (f.type == null) {
|
||
const p = h[l.renderMethod], y = {
|
||
...h
|
||
};
|
||
delete y[l.renderMethod], p ? h[l.renderMethod] = (b, R, D) => {
|
||
const $ = l.rebuildRenderScope(b, R, D);
|
||
return p($, () => r(y, $));
|
||
} : h[l.renderMethod] = (b, R, D) => {
|
||
const $ = l.rebuildRenderScope(b, R, D);
|
||
return r(y, $);
|
||
};
|
||
}
|
||
}
|
||
if (o && ((c = n.rowHandle) == null ? void 0 : c.show) !== !1) {
|
||
const d = {
|
||
key: "_rowHandle",
|
||
...n.rowHandle
|
||
};
|
||
d[l.renderMethod] = (f, h, v) => {
|
||
const p = l.rebuildRenderScope(f, h, v);
|
||
return o(p);
|
||
}, u.push(d);
|
||
}
|
||
return ce.debug("table columns:", u), u;
|
||
}
|
||
const Yd = /* @__PURE__ */ le({
|
||
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) {
|
||
_t.trace("fs-table");
|
||
const n = K(), o = K([]);
|
||
Ud(o);
|
||
const r = (F, V) => {
|
||
if (!V || F == null || F > o.value.length)
|
||
return;
|
||
const L = o.value[F][V];
|
||
return L == null ? void 0 : L.getTargetRef();
|
||
}, {
|
||
ui: a
|
||
} = we(), i = Go();
|
||
it(() => e.data, (F) => {
|
||
t.emit("data-change", {
|
||
data: F
|
||
});
|
||
});
|
||
let s = a.table, u = a.tableColumn;
|
||
e.tableVersion === "v2" && (s = a.tableV2, u = a.tableColumnV2);
|
||
function l(F = 0) {
|
||
s.scrollTo({
|
||
top: F,
|
||
tableRef: n,
|
||
fsTableRef: i
|
||
});
|
||
}
|
||
const c = H(s.name), d = Wd(e, t, n), f = (F, V) => {
|
||
const ne = V[u.row], L = ne, A = V[u.index];
|
||
return V.index = A, {
|
||
...V,
|
||
key: F.key,
|
||
value: st(ne, F.key),
|
||
row: ne,
|
||
form: L,
|
||
getComponentRef: (k) => r(A, k)
|
||
};
|
||
};
|
||
function h(F) {
|
||
t.emit("row-handle", F);
|
||
}
|
||
const v = s.onChange({
|
||
onSortChange: (F) => {
|
||
t.emit("sort-change", F);
|
||
},
|
||
onFilterChange: (F) => {
|
||
t.emit("filter-change", F);
|
||
},
|
||
onPagination: () => {
|
||
},
|
||
bubbleUp: (F) => {
|
||
F(t.attrs);
|
||
}
|
||
}), p = (F) => {
|
||
F.index = F[u.index];
|
||
const V = "cell-rowHandle", ne = {};
|
||
if (e.cellSlots)
|
||
for (const L in e.cellSlots)
|
||
L.startsWith(V) && (ne[L] = e.cellSlots[L]);
|
||
return x(G("fs-row-handle"), z(e.rowHandle, {
|
||
scope: F,
|
||
onHandle: h
|
||
}), ne);
|
||
}, y = (F, V) => {
|
||
var Se, ke, m, C, _, S, O, Q, se, ie, de, _e;
|
||
const ne = "cell_" + F.key, L = V.row = V[u.row], A = {
|
||
modelValue: st(V[u.row], F.key),
|
||
"onUpdate:modelValue": (Pe) => {
|
||
var X;
|
||
tt(V[u.row], F.key, Pe);
|
||
const Le = f(F, V);
|
||
t.emit("value-change", Le), F.valueChange && (F.valueChange instanceof Function ? F.valueChange(Le) : (X = F.valueChange) == null || X.handle(Le));
|
||
}
|
||
}, k = (Pe) => {
|
||
const Le = V[u.index], X = F.key;
|
||
let ye = o.value[Le];
|
||
ye == null && (o.value[Le] = ye = {}), ye[X] = Pe;
|
||
}, N = V[u.index], J = L[(Se = e.editable) == null ? void 0 : Se.rowKey], ue = e.cellSlots && e.cellSlots[ne], Z = f(F, V);
|
||
if (((C = (m = (ke = d.editable) == null ? void 0 : ke.options) == null ? void 0 : m.value) == null ? void 0 : C.enabled) === !0) {
|
||
const Pe = d.editable.getEditableCell(J, F.key);
|
||
return x(G("fs-editable-cell"), z({
|
||
ref: k,
|
||
key: F.key,
|
||
columnKey: F.key,
|
||
index: N,
|
||
editableId: J,
|
||
item: F,
|
||
editableCell: Pe,
|
||
editableOpts: (S = (_ = d.editable) == null ? void 0 : _.options) == null ? void 0 : S.value,
|
||
scope: Z,
|
||
slots: ue,
|
||
disabled: (se = (Q = (O = d.editable) == null ? void 0 : O.options) == null ? void 0 : Q.value) == null ? void 0 : se.disabled,
|
||
readonly: (_e = (de = (ie = d.editable) == null ? void 0 : ie.options) == null ? void 0 : de.value) == null ? void 0 : _e.readonly
|
||
}, A), null);
|
||
} else
|
||
return x(G("fs-cell"), z({
|
||
ref: k,
|
||
key: F.key,
|
||
item: F,
|
||
scope: Z,
|
||
slots: ue
|
||
}, A, {
|
||
conditionalRender: e.conditionalRender
|
||
}), null);
|
||
}, {
|
||
expose: b
|
||
} = t;
|
||
b({
|
||
tableRef: n,
|
||
componentRefs: o,
|
||
getComponentRef: r,
|
||
...d,
|
||
scrollTo: l
|
||
});
|
||
const {
|
||
doColumnsSort: R
|
||
} = Zr(), D = s.renderMode, $ = M(() => ({
|
||
[s.data]: e.data
|
||
})), {
|
||
merge: T,
|
||
cloneDeep: E
|
||
} = $e(), P = M(() => {
|
||
let F = e.rowKey;
|
||
return a.type === "naive" && typeof e.rowKey == "string" && (F = (V) => V[e.rowKey]), T({
|
||
rowKey: F
|
||
}, t.attrs, v);
|
||
}), W = M(() => R(E(e.columns)));
|
||
if (D === "slot") {
|
||
const F = M(() => Kd({
|
||
props: e,
|
||
ui: a,
|
||
sortedColumns: W.value,
|
||
renderRowHandle: p,
|
||
renderCellComponent: y
|
||
}));
|
||
return () => {
|
||
if (e.show === !1)
|
||
return;
|
||
const V = x(c, z({
|
||
ref: n,
|
||
loading: e.loading
|
||
}, P.value, $.value), F.value);
|
||
if (typeof s.vLoading == "string") {
|
||
const ne = as(s.vLoading);
|
||
return Hr(V, [[ne, e.loading]]);
|
||
}
|
||
return V;
|
||
};
|
||
} else {
|
||
const F = M(() => yi({
|
||
props: e,
|
||
ctx: t,
|
||
ui: a,
|
||
getContextFn: f,
|
||
sortedColumns: W.value,
|
||
componentRefs: o,
|
||
renderRowHandle: p,
|
||
renderCellComponent: y,
|
||
columns: e.columns
|
||
})), V = M(() => {
|
||
const L = [];
|
||
function A(k) {
|
||
k.forEach((N) => {
|
||
N.children ? A(N.children) : L.push(N);
|
||
});
|
||
}
|
||
return A(F.value), L;
|
||
}), ne = M(() => s.buildMultiHeadersBind ? s.buildMultiHeadersBind({
|
||
treeColumns: F.value,
|
||
flatColumns: V.value
|
||
}) : {
|
||
bind: {},
|
||
slots: {}
|
||
});
|
||
return () => {
|
||
var N;
|
||
if (e.show === !1)
|
||
return;
|
||
const L = {
|
||
...e.slots,
|
||
...(N = ne.value) == null ? void 0 : N.slots
|
||
}, A = s.columnsIsFlat, k = (J = {}) => {
|
||
var ue;
|
||
return x(c, z({
|
||
ref: n,
|
||
loading: e.loading
|
||
}, P.value, {
|
||
columns: A ? V.value : F.value
|
||
}, $.value, (ue = ne.value) == null ? void 0 : ue.bind, J), L);
|
||
};
|
||
if (e.tableVersion === "v2" && a.type === "element") {
|
||
const J = {
|
||
default({
|
||
width: ue,
|
||
height: Z
|
||
}) {
|
||
return k({
|
||
width: ue,
|
||
height: Z
|
||
});
|
||
}
|
||
};
|
||
return x(G("el-auto-resizer"), null, J);
|
||
}
|
||
return k();
|
||
};
|
||
}
|
||
}
|
||
}), Gd = /* @__PURE__ */ le({
|
||
name: "FsCell",
|
||
props: {
|
||
item: {},
|
||
/**
|
||
* scope
|
||
*/
|
||
scope: {
|
||
default() {
|
||
return {};
|
||
}
|
||
},
|
||
/**
|
||
* 插槽
|
||
*/
|
||
slots: {},
|
||
/**
|
||
* 条件渲染,符合条件的情况下优先渲染
|
||
*/
|
||
conditionalRender: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup(e, t) {
|
||
const {
|
||
doComputed: n
|
||
} = Pt(), {
|
||
ui: o
|
||
} = we(), i = n(() => e.item.component, () => e.scope), s = K();
|
||
function u() {
|
||
return s.value.getTargetRef();
|
||
}
|
||
t.expose({
|
||
getTargetRef: u,
|
||
targetRef: s
|
||
});
|
||
const l = M(() => {
|
||
let f = e.item.showTitle;
|
||
const h = e.scope.value;
|
||
return f === !0 && (f = h), f;
|
||
}), c = M(() => (h) => x("span", {
|
||
class: "fs-cell",
|
||
title: l.value
|
||
}, [h])), d = () => {
|
||
var y, b;
|
||
const f = e.scope.value, h = c.value, v = {
|
||
...e.scope,
|
||
props: e.item
|
||
}, p = e.item.conditionalRender ?? e.conditionalRender;
|
||
if (p && p.match && p.match(v))
|
||
return h(p.render(v));
|
||
if (e.slots)
|
||
return h(e.slots(v));
|
||
if (e.item.formatter)
|
||
return h(e.item.formatter(v));
|
||
if (e.item.cellRender)
|
||
return h(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 : x(G("fs-component-render"), z({
|
||
title: l.value,
|
||
ref: s
|
||
}, i.value, {
|
||
scope: v
|
||
}), null) : h(bs(f));
|
||
};
|
||
if (e.item.tooltip) {
|
||
const f = H(o.tooltip.name);
|
||
return () => {
|
||
let h = {}, v = {};
|
||
typeof e.item.tooltip == "object" ? (h = wn(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.item.tooltip;
|
||
const p = {
|
||
...v,
|
||
[o.tooltip.trigger]: () => d()
|
||
};
|
||
return x(f, h, p);
|
||
};
|
||
} else
|
||
return d;
|
||
}
|
||
}), Xd = /* @__PURE__ */ le({
|
||
name: "FsEditableCell",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
/**
|
||
* 组件配置
|
||
*/
|
||
item: {},
|
||
scope: {},
|
||
index: {},
|
||
editableId: {},
|
||
columnKey: {},
|
||
editableCell: {
|
||
type: Object
|
||
},
|
||
editableOpts: {
|
||
type: Object
|
||
},
|
||
slots: {},
|
||
disabled: {},
|
||
readonly: {}
|
||
},
|
||
setup(e, t) {
|
||
qe.get();
|
||
const {
|
||
doComputed: n
|
||
} = Pt();
|
||
if (e.index === -1)
|
||
return () => {
|
||
};
|
||
const r = n(() => {
|
||
var h;
|
||
return (h = e.editableCell) == null ? void 0 : h.getForm();
|
||
}, () => e.scope), a = M(() => {
|
||
var h;
|
||
return r.value && r.value.show !== !1 && ((h = e.editableCell) == null ? void 0 : h.isEditable());
|
||
});
|
||
function i(h) {
|
||
h && a.value && e.editableCell.active();
|
||
}
|
||
async function s() {
|
||
var h;
|
||
if (((h = e.editableOpts) == null ? void 0 : h.mode) === "free") {
|
||
await e.editableCell.persist();
|
||
return;
|
||
}
|
||
await e.editableCell.save();
|
||
}
|
||
function u() {
|
||
e.editableCell.cancel();
|
||
}
|
||
const l = M(() => {
|
||
var h, v;
|
||
return (((h = e.editableOpts) == null ? void 0 : h.mode) === "cell" || ((v = e.editableOpts) == null ? void 0 : v.mode) === "free") && e.editableCell.showAction !== !1;
|
||
}), c = M(() => e.editableCell.isChanged && e.editableCell.isChanged()), d = () => e.scope, f = {
|
||
default: () => x(G("fs-cell"), z({
|
||
ref: "targetRef",
|
||
item: e.item,
|
||
scope: e.scope,
|
||
slots: e.slots
|
||
}, t.attrs), null),
|
||
edit: () => {
|
||
var v, p;
|
||
let h = null;
|
||
return (v = e.editableCell) != null && v.isEditing && (r.value.blank === !1 || ((p = r.value.component) == null ? void 0 : p.show) === !1 ? h = null : r.value.conditionalRender && r.value.conditionalRender.match && r.value.conditionalRender.match(d()) ? h = x(G("fs-render"), z({
|
||
"render-func": r.value.conditionalRender.render,
|
||
scope: d()
|
||
}, t.attrs), null) : r.value.render ? h = x(G("fs-render"), z({
|
||
"render-func": r.value.render,
|
||
scope: d()
|
||
}, t.attrs), null) : h = x(G("fs-component-render"), z({
|
||
ref: "targetInputRef"
|
||
}, r.value.component, t.attrs, {
|
||
scope: e.scope
|
||
}), null)), h;
|
||
}
|
||
};
|
||
return () => {
|
||
var p;
|
||
if (!a.value || e.disabled || e.readonly)
|
||
return x(G("fs-cell"), z({
|
||
ref: "targetRef",
|
||
item: e.item,
|
||
scope: e.scope
|
||
}, t.attrs), null);
|
||
const h = e.editableCell, v = l.value ? (p = e.editableOpts) == null ? void 0 : p.activeTrigger : !1;
|
||
return x(G("fs-editable"), {
|
||
ref: "editableRef",
|
||
class: "fs-editable-cell",
|
||
editing: h == null ? void 0 : h.isEditing,
|
||
showAction: l.value,
|
||
dirty: c.value,
|
||
"onUpdate:editing": i,
|
||
onSubmit: s,
|
||
onCancel: u,
|
||
loading: h == null ? void 0 : h.loading,
|
||
trigger: v,
|
||
validateErrors: h == null ? void 0 : h.validateErrors
|
||
}, f);
|
||
};
|
||
},
|
||
methods: {
|
||
getTargetRef() {
|
||
var e;
|
||
return ((e = this.$refs.targetInputRef) == null ? void 0 : e.getTargetRef()) || this.$refs.targetRef;
|
||
}
|
||
}
|
||
}), Qd = { class: "fs-editable" }, Jd = { class: "fs-editable-input" }, Zd = {
|
||
key: 0,
|
||
class: "fs-editable-dirty"
|
||
}, ef = {
|
||
key: 0,
|
||
class: "fs-editable-action fs-editable-icon"
|
||
}, tf = { class: "fs-editable-input" }, nf = { class: "fs-editable-action" }, of = { class: "error-icon" }, rf = /* @__PURE__ */ le({
|
||
__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 } = we(), r = t, a = M(() => 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((f) => f.message).join(",");
|
||
}
|
||
return (c, d) => {
|
||
const f = G("fs-icon");
|
||
return w(), j("div", Qd, [
|
||
!c.editing || c.disabled ? (w(), j("div", z({
|
||
key: 0,
|
||
class: "fs-editable-inner fs-editable-pointer"
|
||
}, a.value), [
|
||
te("div", Jd, [
|
||
c.dirty ? (w(), j("div", Zd)) : oe("", !0),
|
||
re(c.$slots, "default")
|
||
]),
|
||
c.trigger && !c.disabled ? (w(), j("div", ef, [
|
||
x(f, {
|
||
icon: q(o).icons.edit
|
||
}, null, 8, ["icon"])
|
||
])) : oe("", !0)
|
||
], 16)) : (w(), j("div", {
|
||
key: 1,
|
||
class: St(["fs-editable-inner", { "fs-validate-error": u() }])
|
||
}, [
|
||
te("div", tf, [
|
||
re(c.$slots, "edit")
|
||
]),
|
||
te("div", nf, [
|
||
(w(), I(H(q(o).tooltip.name), null, {
|
||
[q(o).tooltip.content]: B(() => [
|
||
te("span", of, We(l()), 1)
|
||
]),
|
||
[q(o).tooltip.trigger]: B(() => [
|
||
x(f, {
|
||
class: St({ hidden: !u(), "error-icon": !0 }),
|
||
size: "mini",
|
||
icon: q(o).icons.info
|
||
}, null, 8, ["class", "icon"])
|
||
]),
|
||
_: 2
|
||
}, 1024)),
|
||
c.showAction ? (w(), j(be, { key: 0 }, [
|
||
c.loading ? (w(), I(f, {
|
||
key: 0,
|
||
size: "mini",
|
||
spin: !0,
|
||
icon: q(o).icons.refresh
|
||
}, null, 8, ["icon"])) : (w(), I(f, {
|
||
key: 1,
|
||
size: "mini",
|
||
icon: q(o).icons.check,
|
||
onClick: i
|
||
}, null, 8, ["icon"])),
|
||
x(f, {
|
||
class: St({ hidden: c.loading }),
|
||
size: "mini",
|
||
icon: q(o).icons.close,
|
||
onClick: s
|
||
}, null, 8, ["class", "icon"])
|
||
], 64)) : oe("", !0)
|
||
])
|
||
], 2))
|
||
]);
|
||
};
|
||
}
|
||
});
|
||
const af = le({
|
||
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 };
|
||
if (a.click) {
|
||
a.click(s);
|
||
return;
|
||
}
|
||
if (a.onClick) {
|
||
a.onClick(s);
|
||
return;
|
||
}
|
||
t.emit("action", s);
|
||
}
|
||
const o = M(() => {
|
||
let r = [];
|
||
for (let i in e.buttons)
|
||
r.push({
|
||
// @ts-ignore
|
||
...e.buttons[i],
|
||
_key: i
|
||
});
|
||
r = Cn(r, (i) => i.order ?? ln.orderDefault);
|
||
const a = {};
|
||
return r.forEach((i) => {
|
||
let s = i._key;
|
||
delete i._key, a[s] = i;
|
||
}), a;
|
||
});
|
||
return {
|
||
onClick: n,
|
||
computedButtons: o
|
||
};
|
||
}
|
||
});
|
||
const sf = { class: "fs-actionbar" };
|
||
function lf(e, t, n, o, r, a) {
|
||
const i = G("fs-button");
|
||
return w(), j("div", sf, [
|
||
(w(!0), j(be, null, Te(e.computedButtons, (s, u) => (w(), j(be, { key: u }, [
|
||
s.show !== !1 ? (w(), I(i, z({
|
||
key: 0,
|
||
ref_for: !0
|
||
}, s, {
|
||
onClick: (l) => e.onClick(u, s, l)
|
||
}), null, 16, ["onClick"])) : oe("", !0)
|
||
], 64))), 128))
|
||
]);
|
||
}
|
||
const uf = /* @__PURE__ */ Oe(af, [["render", lf]]);
|
||
class mp {
|
||
constructor() {
|
||
/**
|
||
* 是否执行valueChange
|
||
*/
|
||
ae(this, "valueChange");
|
||
ae(this, "mergeForm");
|
||
}
|
||
}
|
||
const ea = "ColumnsFilterContext", cf = /* @__PURE__ */ le({
|
||
__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 } = lt(), i = qe.get(), s = K(!1), u = () => {
|
||
s.value = !0;
|
||
}, l = M(() => R(o.originalColumns)), c = K([]), d = M(() => {
|
||
const m = {};
|
||
return p(l.value, (C) => {
|
||
m[C.__key] = C;
|
||
}), m;
|
||
}), { merge: f, cloneDeep: h } = $e(), v = M(() => {
|
||
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 f(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 Y(m, (_) => {
|
||
const S = wn(_, "children", "__show", "__disabled", "__parent", "__key");
|
||
_.children && _.children.length > 0 && (S.children = b(_.children)), C[_.key] = S;
|
||
}), C;
|
||
}
|
||
function R(m, C) {
|
||
const _ = [];
|
||
return Y(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 = R(S.children, O));
|
||
}), _;
|
||
}
|
||
function D(m) {
|
||
c.value = R(m);
|
||
}
|
||
async function $() {
|
||
c.value = R(o.originalColumns), await T(!0), await J(), r("reset");
|
||
}
|
||
async function T(m = !1) {
|
||
m || await k(c.value);
|
||
const C = h(c.value);
|
||
return p(C, (_) => {
|
||
_ && (delete _.__disabled, delete _.__show, delete _.__parent, delete _.__key);
|
||
}), V(C), s.value = !1, C;
|
||
}
|
||
async function E(m = !1) {
|
||
const C = await T(m);
|
||
r("submit", { columns: C });
|
||
}
|
||
const P = M(() => o.originalColumns);
|
||
sn(ea, {
|
||
originalColumns: P,
|
||
originalColumnsMap: d,
|
||
currentColumns: c,
|
||
text: v,
|
||
active: s,
|
||
submit: E,
|
||
reset: $
|
||
});
|
||
async function W() {
|
||
await E(!1), r("update:show", !1);
|
||
}
|
||
async function F() {
|
||
await $(), r("update:show", !1);
|
||
}
|
||
function V(m) {
|
||
r("update:columns", b(m));
|
||
}
|
||
const ne = jn("get:crudBinding", () => ({ id: "" })), L = K();
|
||
function A() {
|
||
const m = typeof o.storage == "object" ? o.storage : null, C = typeof o.storage == "string" ? o.storage : "";
|
||
if (L.value == null) {
|
||
const _ = Ha();
|
||
L.value = new Kr({
|
||
$router: _,
|
||
tableName: "columnsFilter",
|
||
keyType: C,
|
||
remoteStorage: m
|
||
});
|
||
}
|
||
return L.value.id = ne().id, L.value;
|
||
}
|
||
async function k(m) {
|
||
if (o.storage === !1)
|
||
return;
|
||
const C = h(m);
|
||
p(C, (_) => {
|
||
delete _.__parent;
|
||
}), await A().updateTableValue(C);
|
||
}
|
||
async function N() {
|
||
if (o.storage !== !1)
|
||
return await A().getTableValue();
|
||
}
|
||
async function J() {
|
||
await A().clearTableValue();
|
||
}
|
||
function ue(m) {
|
||
const C = [];
|
||
p(m, (S) => {
|
||
const O = La(S, "key", "__show", "__disabled");
|
||
C.push(JSON.stringify(O));
|
||
}), C.sort();
|
||
let _ = "";
|
||
for (const S of C)
|
||
_ += S;
|
||
return _;
|
||
}
|
||
it(
|
||
() => o.columns,
|
||
(m) => {
|
||
D(m);
|
||
}
|
||
);
|
||
const Z = async () => {
|
||
D(o.columns);
|
||
const m = await N();
|
||
if (m) {
|
||
const C = ue(m);
|
||
if (ue(l.value) !== C)
|
||
return;
|
||
c.value = m, await Be(), await E(!0);
|
||
}
|
||
};
|
||
async function Se(m) {
|
||
await m(c), await T();
|
||
}
|
||
it(
|
||
() => l.value,
|
||
async (m) => {
|
||
await Z();
|
||
},
|
||
{
|
||
immediate: !0
|
||
}
|
||
), t({
|
||
start: u,
|
||
save: T,
|
||
update: Se,
|
||
original: l,
|
||
columns: c
|
||
});
|
||
function ke(m) {
|
||
return m.label || m.title || m.key || v.value.unnamed;
|
||
}
|
||
return (m, C) => {
|
||
var S;
|
||
const _ = G("fs-button");
|
||
return m.mode === "simple" ? (w(), j(be, { key: 0 }, [
|
||
(w(), I(H(q(i).row.name), { class: "fs-table-columns-filter-simple" }, {
|
||
default: B(() => [
|
||
(w(!0), j(be, null, Te(c.value, (O, Q) => {
|
||
var se;
|
||
return Hr((w(), I(H(q(i).col.name), {
|
||
key: Q,
|
||
span: 6
|
||
}, {
|
||
default: B(() => {
|
||
var ie;
|
||
return [
|
||
(w(), I(H(q(i).checkbox.name), xe({
|
||
[q(i).checkbox.modelValue]: O.show,
|
||
["onUpdate:" + q(i).checkbox.modelValue]: (de) => O.show = de,
|
||
disabled: ((ie = l.value[O.key]) == null ? void 0 : ie.__disabled) === !0,
|
||
class: "item-label",
|
||
title: ke(O)
|
||
}), {
|
||
default: B(() => [
|
||
Vt(We(ke(O)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040, ["disabled", "title"]))
|
||
];
|
||
}),
|
||
_: 2
|
||
}, 1024)), [
|
||
[ja, ((se = l.value[O.key]) == null ? void 0 : se.__show) !== !1]
|
||
]);
|
||
}), 128))
|
||
]),
|
||
_: 1
|
||
})),
|
||
(w(), I(H(q(i).divider.name))),
|
||
(w(), I(H(q(i).row.name), null, {
|
||
default: B(() => [
|
||
x(_, {
|
||
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"]),
|
||
x(_, {
|
||
icon: q(i).icons.refresh,
|
||
text: v.value.reset,
|
||
onClick: F
|
||
}, null, 8, ["icon", "text"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
], 64)) : (w(), I(H(((S = m.container) == null ? void 0 : S.is) || "fs-columns-filter-layout-default"), xe(z({ key: 1 }, m.container)), {
|
||
buttons: B(() => [
|
||
(w(), I(H(q(i).row.name), {
|
||
class: "fs-drawer-footer",
|
||
gutter: 10
|
||
}, {
|
||
default: B(() => [
|
||
(w(), I(H(q(i).col.name), { span: 12 }, {
|
||
default: B(() => [
|
||
x(_, {
|
||
icon: q(i).icons.refresh,
|
||
text: v.value.reset,
|
||
block: "",
|
||
onClick: $
|
||
}, null, 8, ["icon", "text"])
|
||
]),
|
||
_: 1
|
||
})),
|
||
(w(), I(H(q(i).col.name), { span: 12 }, {
|
||
default: B(() => [
|
||
x(_, {
|
||
type: "primary",
|
||
icon: q(i).icons.check,
|
||
text: v.value.confirm,
|
||
block: "",
|
||
onClick: C[1] || (C[1] = (O) => E(!1))
|
||
}, null, 8, ["icon", "text"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
]),
|
||
_: 1
|
||
}))
|
||
]),
|
||
_: 1
|
||
}, 16));
|
||
};
|
||
}
|
||
});
|
||
const df = le({
|
||
name: "FsToolbar",
|
||
components: { FsTableColumnsFilter: cf },
|
||
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) {
|
||
lt();
|
||
const n = K(), { ui: o } = we(), { merge: r } = $e(), a = M(() => {
|
||
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 = Cn(l, (d) => d.order ?? ln.orderDefault);
|
||
const c = {};
|
||
return l.forEach((d) => {
|
||
let f = d._key;
|
||
delete d._key, c[f] = d;
|
||
}), c;
|
||
}), i = K(!1);
|
||
return {
|
||
ui: o,
|
||
columnsFilterRef: n,
|
||
computedButtons: a,
|
||
popoverVisible: i,
|
||
handleSimpleClick: () => {
|
||
o.type !== "element" && (i.value = !i.value);
|
||
}
|
||
};
|
||
}
|
||
});
|
||
const ff = { class: "fs-toolbar" };
|
||
function hf(e, t, n, o, r, a) {
|
||
var s;
|
||
const i = G("fs-button");
|
||
return w(), j("div", ff, [
|
||
(w(!0), j(be, null, Te(e.computedButtons, (u, l) => {
|
||
var c;
|
||
return w(), j(be, { key: l }, [
|
||
u.show !== !1 ? (w(), j(be, { key: 0 }, [
|
||
l === "columns" && e.columnsFilter && ((c = e.columnsFilter) == null ? void 0 : c.mode) === "simple" ? (w(), I(H(e.ui.popover.name), xe({
|
||
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]: B(() => [
|
||
x(i, z({ ref_for: !0 }, u, { onClick: e.handleSimpleClick }), null, 16, ["onClick"])
|
||
]),
|
||
[e.ui.popover.contentSlotName]: B(() => [
|
||
e.columns ? (w(), I(H(e.columnsFilter.is || "fs-table-columns-filter"), z({
|
||
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"])) : oe("", !0)
|
||
]),
|
||
_: 2
|
||
}, 1040)) : (w(), I(i, z({
|
||
key: 1,
|
||
ref_for: !0
|
||
}, u, {
|
||
onClick: (d) => u.click()
|
||
}), null, 16, ["onClick"]))
|
||
], 64)) : oe("", !0)
|
||
], 64);
|
||
}), 128)),
|
||
e.columns && ((s = e.columnsFilter) == null ? void 0 : s.mode) !== "simple" ? (w(), I(H(e.columnsFilter.is || "fs-table-columns-filter"), z({
|
||
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"])) : oe("", !0)
|
||
]);
|
||
}
|
||
const mf = /* @__PURE__ */ Oe(df, [["render", hf]]);
|
||
/**!
|
||
* Sortable 1.14.0
|
||
* @author RubaXa <trash@rubaxa.org>
|
||
* @author owenm <owen23355@gmail.com>
|
||
* @license MIT
|
||
*/
|
||
function Ca(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 zt(e) {
|
||
for (var t = 1; t < arguments.length; t++) {
|
||
var n = arguments[t] != null ? arguments[t] : {};
|
||
t % 2 ? Ca(Object(n), !0).forEach(function(o) {
|
||
pf(e, o, n[o]);
|
||
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : Ca(Object(n)).forEach(function(o) {
|
||
Object.defineProperty(e, o, Object.getOwnPropertyDescriptor(n, o));
|
||
});
|
||
}
|
||
return e;
|
||
}
|
||
function To(e) {
|
||
"@babel/helpers - typeof";
|
||
return typeof Symbol == "function" && typeof Symbol.iterator == "symbol" ? To = function(t) {
|
||
return typeof t;
|
||
} : To = function(t) {
|
||
return t && typeof Symbol == "function" && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t;
|
||
}, To(e);
|
||
}
|
||
function pf(e, t, n) {
|
||
return t in e ? Object.defineProperty(e, t, {
|
||
value: n,
|
||
enumerable: !0,
|
||
configurable: !0,
|
||
writable: !0
|
||
}) : e[t] = n, e;
|
||
}
|
||
function Yt() {
|
||
return Yt = 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;
|
||
}, Yt.apply(this, arguments);
|
||
}
|
||
function gf(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 vf(e, t) {
|
||
if (e == null)
|
||
return {};
|
||
var n = gf(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 bf = "1.14.0";
|
||
function Kt(e) {
|
||
if (typeof window < "u" && window.navigator)
|
||
return !!/* @__PURE__ */ navigator.userAgent.match(e);
|
||
}
|
||
var Gt = Kt(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i), go = Kt(/Edge/i), Sa = Kt(/firefox/i), Xn = Kt(/safari/i) && !Kt(/chrome/i) && !Kt(/android/i), wi = Kt(/iP(ad|od|hone)/i), yf = Kt(/chrome/i) && Kt(/android/i), _i = {
|
||
capture: !1,
|
||
passive: !1
|
||
};
|
||
function De(e, t, n) {
|
||
e.addEventListener(t, n, !Gt && _i);
|
||
}
|
||
function Fe(e, t, n) {
|
||
e.removeEventListener(t, n, !Gt && _i);
|
||
}
|
||
function qo(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 wf(e) {
|
||
return e.host && e !== document && e.host.nodeType ? e.host : e.parentNode;
|
||
}
|
||
function Bt(e, t, n, o) {
|
||
if (e) {
|
||
n = n || document;
|
||
do {
|
||
if (t != null && (t[0] === ">" ? e.parentNode === n && qo(e, t) : qo(e, t)) || o && e === n)
|
||
return e;
|
||
if (e === n)
|
||
break;
|
||
} while (e = wf(e));
|
||
}
|
||
return null;
|
||
}
|
||
var Fa = /\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(Fa, " ").replace(" " + t + " ", " ");
|
||
e.className = (o + (n ? " " + t : "")).replace(Fa, " ");
|
||
}
|
||
}
|
||
function he(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 En(e, t) {
|
||
var n = "";
|
||
if (typeof e == "string")
|
||
n = e;
|
||
else
|
||
do {
|
||
var o = he(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 Ci(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 Ht() {
|
||
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 !== Ht() ? (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, !Gt))
|
||
do
|
||
if (r && r.getBoundingClientRect && (he(r, "transform") !== "none" || n && he(r, "position") !== "static")) {
|
||
var f = r.getBoundingClientRect();
|
||
i -= f.top + parseInt(he(r, "border-top-width")), s -= f.left + parseInt(he(r, "border-left-width")), u = i + a.height, l = s + a.width;
|
||
break;
|
||
}
|
||
while (r = r.parentNode);
|
||
if (o && e !== window) {
|
||
var h = En(r || e), v = h && h.a, p = h && h.d;
|
||
h && (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 Ra(e, t, n) {
|
||
for (var o = rn(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 === Ht())
|
||
break;
|
||
o = rn(o, !1);
|
||
}
|
||
return !1;
|
||
}
|
||
function Bn(e, t, n, o) {
|
||
for (var r = 0, a = 0, i = e.children; a < i.length; ) {
|
||
if (i[a].style.display !== "none" && i[a] !== me.ghost && (o || i[a] !== me.dragged) && Bt(i[a], n.draggable, e, !1)) {
|
||
if (r === t)
|
||
return i[a];
|
||
r++;
|
||
}
|
||
a++;
|
||
}
|
||
return null;
|
||
}
|
||
function ta(e, t) {
|
||
for (var n = e.lastElementChild; n && (n === me.ghost || he(n, "display") === "none" || t && !qo(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 !== me.clone && (!t || qo(e, t)) && n++;
|
||
return n;
|
||
}
|
||
function Da(e) {
|
||
var t = 0, n = 0, o = Ht();
|
||
if (e)
|
||
do {
|
||
var r = En(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 _f(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 rn(e, t) {
|
||
if (!e || !e.getBoundingClientRect)
|
||
return Ht();
|
||
var n = e, o = !1;
|
||
do
|
||
if (n.clientWidth < n.scrollWidth || n.clientHeight < n.scrollHeight) {
|
||
var r = he(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 Ht();
|
||
if (o || t)
|
||
return n;
|
||
o = !0;
|
||
}
|
||
}
|
||
while (n = n.parentNode);
|
||
return Ht();
|
||
}
|
||
function Cf(e, t) {
|
||
if (e && t)
|
||
for (var n in t)
|
||
t.hasOwnProperty(n) && (e[n] = t[n]);
|
||
return e;
|
||
}
|
||
function ir(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 Qn;
|
||
function Si(e, t) {
|
||
return function() {
|
||
if (!Qn) {
|
||
var n = arguments, o = this;
|
||
n.length === 1 ? e.call(o, n[0]) : e.apply(o, n), Qn = setTimeout(function() {
|
||
Qn = void 0;
|
||
}, t);
|
||
}
|
||
};
|
||
}
|
||
function Sf() {
|
||
clearTimeout(Qn), Qn = void 0;
|
||
}
|
||
function Fi(e, t, n) {
|
||
e.scrollLeft += t, e.scrollTop += n;
|
||
}
|
||
function Ri(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 Ff() {
|
||
var e = [], t;
|
||
return {
|
||
captureAnimationState: function() {
|
||
if (e = [], !!this.options.animation) {
|
||
var o = [].slice.call(this.el.children);
|
||
o.forEach(function(r) {
|
||
if (!(he(r, "display") === "none" || r === me.ghost)) {
|
||
e.push({
|
||
target: r,
|
||
rect: Ke(r)
|
||
});
|
||
var a = zt({}, e[e.length - 1].rect);
|
||
if (r.thisAnimationDuration) {
|
||
var i = En(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(_f(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), f = l.prevFromRect, h = l.prevToRect, v = s.rect, p = En(l, !0);
|
||
p && (d.top -= p.f, d.left -= p.e), l.toRect = d, l.thisAnimationDuration && ir(f, d) && !ir(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 = Df(v, f, h, r.options)), ir(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) {
|
||
he(o, "transition", ""), he(o, "transform", "");
|
||
var s = En(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, he(o, "transform", "translate3d(" + c + "px," + d + "px,0)"), this.forRepaintDummy = Rf(o), he(o, "transition", "transform " + i + "ms" + (this.options.easing ? " " + this.options.easing : "")), he(o, "transform", "translate3d(0,0,0)"), typeof o.animated == "number" && clearTimeout(o.animated), o.animated = setTimeout(function() {
|
||
he(o, "transition", ""), he(o, "transform", ""), o.animated = !1, o.animatingX = !1, o.animatingY = !1;
|
||
}, i);
|
||
}
|
||
}
|
||
};
|
||
}
|
||
function Rf(e) {
|
||
return e.offsetWidth;
|
||
}
|
||
function Df(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 Rn = [], sr = {
|
||
initializeByDefault: !0
|
||
}, vo = {
|
||
mount: function(t) {
|
||
for (var n in sr)
|
||
sr.hasOwnProperty(n) && !(n in t) && (t[n] = sr[n]);
|
||
Rn.forEach(function(o) {
|
||
if (o.pluginName === t.pluginName)
|
||
throw "Sortable: Cannot mount plugin ".concat(t.pluginName, " more than once");
|
||
}), Rn.push(t);
|
||
},
|
||
pluginEvent: function(t, n, o) {
|
||
var r = this;
|
||
this.eventCanceled = !1, o.cancel = function() {
|
||
r.eventCanceled = !0;
|
||
};
|
||
var a = t + "Global";
|
||
Rn.forEach(function(i) {
|
||
n[i.pluginName] && (n[i.pluginName][a] && n[i.pluginName][a](zt({
|
||
sortable: n
|
||
}, o)), n.options[i.pluginName] && n[i.pluginName][t] && n[i.pluginName][t](zt({
|
||
sortable: n
|
||
}, o)));
|
||
});
|
||
},
|
||
initializePlugins: function(t, n, o, r) {
|
||
Rn.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, Yt(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 Rn.forEach(function(r) {
|
||
typeof r.eventProperties == "function" && Yt(o, r.eventProperties.call(n[r.pluginName], t));
|
||
}), o;
|
||
},
|
||
modifyOption: function(t, n, o) {
|
||
var r;
|
||
return Rn.forEach(function(a) {
|
||
t[a.pluginName] && a.optionListeners && typeof a.optionListeners[n] == "function" && (r = a.optionListeners[n].call(t[a.pluginName], o));
|
||
}), r;
|
||
}
|
||
};
|
||
function kf(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, f = e.originalEvent, h = 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 && !Gt && !go ? 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 = f, p.pullMode = h ? h.lastPutMode : void 0;
|
||
var R = zt(zt({}, v), vo.getEventProperties(o, t));
|
||
for (var D in R)
|
||
p[D] = R[D];
|
||
n && n.dispatchEvent(p), y[b] && y[b].call(t, p);
|
||
}
|
||
}
|
||
var $f = ["evt"], ct = function(t, n) {
|
||
var o = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, r = o.evt, a = vf(o, $f);
|
||
vo.pluginEvent.bind(me)(t, n, zt({
|
||
dragEl: U,
|
||
parentEl: je,
|
||
ghostEl: ve,
|
||
rootEl: Ve,
|
||
nextEl: hn,
|
||
lastDownEl: Io,
|
||
cloneEl: Ne,
|
||
cloneHidden: nn,
|
||
dragStarted: Un,
|
||
putSortable: Qe,
|
||
activeSortable: me.active,
|
||
originalEvent: r,
|
||
oldIndex: On,
|
||
oldDraggableIndex: Jn,
|
||
newIndex: ht,
|
||
newDraggableIndex: tn,
|
||
hideGhostForTarget: Oi,
|
||
unhideGhostForTarget: Ei,
|
||
cloneNowHidden: function() {
|
||
nn = !0;
|
||
},
|
||
cloneNowShown: function() {
|
||
nn = !1;
|
||
},
|
||
dispatchSortableEvent: function(s) {
|
||
ot({
|
||
sortable: n,
|
||
name: s,
|
||
originalEvent: r
|
||
});
|
||
}
|
||
}, a));
|
||
};
|
||
function ot(e) {
|
||
kf(zt({
|
||
putSortable: Qe,
|
||
cloneEl: Ne,
|
||
targetEl: U,
|
||
rootEl: Ve,
|
||
oldIndex: On,
|
||
oldDraggableIndex: Jn,
|
||
newIndex: ht,
|
||
newDraggableIndex: tn
|
||
}, e));
|
||
}
|
||
var U, je, ve, Ve, hn, Io, Ne, nn, On, ht, Jn, tn, Co, Qe, kn = !1, Ho = !1, zo = [], dn, Ft, lr, ur, ka, $a, Un, Dn, Zn, eo = !1, So = !1, Ao, Je, cr = [], Pr = !1, Wo = [], er = typeof document < "u", Fo = wi, Oa = go || Gt ? "cssFloat" : "float", Of = er && !yf && !wi && "draggable" in document.createElement("div"), Di = function() {
|
||
if (er) {
|
||
if (Gt)
|
||
return !1;
|
||
var e = document.createElement("x");
|
||
return e.style.cssText = "pointer-events:auto", e.style.pointerEvents === "auto";
|
||
}
|
||
}(), ki = function(t, n) {
|
||
var o = he(t), r = parseInt(o.width) - parseInt(o.paddingLeft) - parseInt(o.paddingRight) - parseInt(o.borderLeftWidth) - parseInt(o.borderRightWidth), a = Bn(t, 0, n), i = Bn(t, 1, n), s = a && he(a), u = i && he(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[Oa] === "none" || i && o[Oa] === "none" && l + c > r) ? "vertical" : "horizontal";
|
||
}, Ef = 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;
|
||
}, Tf = function(t, n) {
|
||
var o;
|
||
return zo.some(function(r) {
|
||
var a = r[yt].options.emptyInsertThreshold;
|
||
if (!(!a || ta(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;
|
||
}, $i = 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 f = (i ? s : u).options.group.name;
|
||
return a === !0 || typeof a == "string" && a === f || a.join && a.indexOf(f) > -1;
|
||
};
|
||
}
|
||
var o = {}, r = t.group;
|
||
(!r || To(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;
|
||
}, Oi = function() {
|
||
!Di && ve && he(ve, "display", "none");
|
||
}, Ei = function() {
|
||
!Di && ve && he(ve, "display", "");
|
||
};
|
||
er && document.addEventListener("click", function(e) {
|
||
if (Ho)
|
||
return e.preventDefault(), e.stopPropagation && e.stopPropagation(), e.stopImmediatePropagation && e.stopImmediatePropagation(), Ho = !1, !1;
|
||
}, !0);
|
||
var fn = function(t) {
|
||
if (U) {
|
||
t = t.touches ? t.touches[0] : t;
|
||
var n = Tf(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);
|
||
}
|
||
}
|
||
}, If = function(t) {
|
||
U && U.parentNode[yt]._isOutsideThisEl(t.target);
|
||
};
|
||
function me(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 = Yt({}, 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 ki(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: me.supportPointer !== !1 && "PointerEvent" in window && !Xn,
|
||
emptyInsertThreshold: 5
|
||
};
|
||
vo.initializePlugins(this, e, n);
|
||
for (var o in n)
|
||
!(o in t) && (t[o] = n[o]);
|
||
$i(t);
|
||
for (var r in this)
|
||
r.charAt(0) === "_" && typeof this[r] == "function" && (this[r] = this[r].bind(this));
|
||
this.nativeDraggable = t.forceFallback ? !1 : Of, this.nativeDraggable && (this.options.touchStartThreshold = 1), t.supportPointer ? De(e, "pointerdown", this._onTapStart) : (De(e, "mousedown", this._onTapStart), De(e, "touchstart", this._onTapStart)), this.nativeDraggable && (De(e, "dragover", this), De(e, "dragenter", this)), zo.push(this.el), t.store && t.store.get && this.sort(t.store.get(this) || []), Yt(this, Ff());
|
||
}
|
||
me.prototype = /** @lends Sortable.prototype */
|
||
{
|
||
constructor: me,
|
||
_isOutsideThisEl: function(t) {
|
||
!this.el.contains(t) && t !== this.el && (Dn = 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 (xf(o), !U && !(/mousedown|pointerdown/.test(i) && t.button !== 0 || r.disabled) && !l.isContentEditable && !(!this.nativeDraggable && Xn && u && u.tagName.toUpperCase() === "SELECT") && (u = Bt(u, r.draggable, o, !1), !(u && u.animated) && Io !== u)) {
|
||
if (On = Ct(u), Jn = Ct(u, r.draggable), typeof c == "function") {
|
||
if (c.call(this, t, u, this)) {
|
||
ot({
|
||
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 = Bt(l, d.trim(), o, !1), d)
|
||
return ot({
|
||
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 && !Bt(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 (Ve = a, U = o, je = U.parentNode, hn = U.nextSibling, Io = o, Co = i.group, me.dragged = U, dn = {
|
||
target: U,
|
||
clientX: (n || t).clientX,
|
||
clientY: (n || t).clientY
|
||
}, ka = dn.clientX - l.left, $a = dn.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
|
||
}), me.eventCanceled) {
|
||
r._onDrop();
|
||
return;
|
||
}
|
||
r._disableDelayedDragEvents(), !Sa && r.nativeDraggable && (U.draggable = !0), r._triggerDragStart(t, n), ot({
|
||
sortable: r,
|
||
name: "choose",
|
||
originalEvent: t
|
||
}), ft(U, i.chosenClass, !0);
|
||
}, i.ignore.split(",").forEach(function(c) {
|
||
Ci(U, c.trim(), dr);
|
||
}), De(s, "dragover", fn), De(s, "mousemove", fn), De(s, "touchmove", fn), De(s, "mouseup", r._onDrop), De(s, "touchend", r._onDrop), De(s, "touchcancel", r._onDrop), Sa && this.nativeDraggable && (this.options.touchStartThreshold = 4, U.draggable = !0), ct("delayStart", this, {
|
||
evt: t
|
||
}), i.delay && (!i.delayOnTouchOnly || n) && (!this.nativeDraggable || !(go || Gt))) {
|
||
if (me.eventCanceled) {
|
||
this._onDrop();
|
||
return;
|
||
}
|
||
De(s, "mouseup", r._disableDelayedDrag), De(s, "touchend", r._disableDelayedDrag), De(s, "touchcancel", r._disableDelayedDrag), De(s, "mousemove", r._delayedDragTouchMoveHandler), De(s, "touchmove", r._delayedDragTouchMoveHandler), i.supportPointer && De(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 && dr(U), clearTimeout(this._dragStartTimer), this._disableDelayedDragEvents();
|
||
},
|
||
_disableDelayedDragEvents: function() {
|
||
var t = this.el.ownerDocument;
|
||
Fe(t, "mouseup", this._disableDelayedDrag), Fe(t, "touchend", this._disableDelayedDrag), Fe(t, "touchcancel", this._disableDelayedDrag), Fe(t, "mousemove", this._delayedDragTouchMoveHandler), Fe(t, "touchmove", this._delayedDragTouchMoveHandler), Fe(t, "pointermove", this._delayedDragTouchMoveHandler);
|
||
},
|
||
_triggerDragStart: function(t, n) {
|
||
n = n || t.pointerType == "touch" && t, !this.nativeDraggable || n ? this.options.supportPointer ? De(document, "pointermove", this._onTouchMove) : n ? De(document, "touchmove", this._onTouchMove) : De(document, "mousemove", this._onTouchMove) : (De(U, "dragend", this), De(Ve, "dragstart", this._onDragStart));
|
||
try {
|
||
document.selection ? Vo(function() {
|
||
document.selection.empty();
|
||
}) : window.getSelection().removeAllRanges();
|
||
} catch {
|
||
}
|
||
},
|
||
_dragStarted: function(t, n) {
|
||
if (kn = !1, Ve && U) {
|
||
ct("dragStarted", this, {
|
||
evt: n
|
||
}), this.nativeDraggable && De(document, "dragover", If);
|
||
var o = this.options;
|
||
!t && ft(U, o.dragClass, !1), ft(U, o.ghostClass, !0), me.active = this, t && this._appendGhost(), ot({
|
||
sortable: this,
|
||
name: "start",
|
||
originalEvent: n
|
||
});
|
||
} else
|
||
this._nulling();
|
||
},
|
||
_emulateDragOver: function() {
|
||
if (Ft) {
|
||
this._lastX = Ft.clientX, this._lastY = Ft.clientY, Oi();
|
||
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);
|
||
Ei();
|
||
}
|
||
},
|
||
_onTouchMove: function(t) {
|
||
if (dn) {
|
||
var n = this.options, o = n.fallbackTolerance, r = n.fallbackOffset, a = t.touches ? t.touches[0] : t, i = ve && En(ve, !0), s = ve && i && i.a, u = ve && i && i.d, l = Fo && Je && Da(Je), c = (a.clientX - dn.clientX + r.x) / (s || 1) + (l ? l[0] - cr[0] : 0) / (s || 1), d = (a.clientY - dn.clientY + r.y) / (u || 1) + (l ? l[1] - cr[1] : 0) / (u || 1);
|
||
if (!me.active && !kn) {
|
||
if (o && Math.max(Math.abs(a.clientX - this._lastX), Math.abs(a.clientY - this._lastY)) < o)
|
||
return;
|
||
this._onDragStart(t, !0);
|
||
}
|
||
if (ve) {
|
||
i ? (i.e += c - (lr || 0), i.f += d - (ur || 0)) : i = {
|
||
a: 1,
|
||
b: 0,
|
||
c: 0,
|
||
d: 1,
|
||
e: c,
|
||
f: d
|
||
};
|
||
var f = "matrix(".concat(i.a, ",").concat(i.b, ",").concat(i.c, ",").concat(i.d, ",").concat(i.e, ",").concat(i.f, ")");
|
||
he(ve, "webkitTransform", f), he(ve, "mozTransform", f), he(ve, "msTransform", f), he(ve, "transform", f), lr = c, ur = d, Ft = a;
|
||
}
|
||
t.cancelable && t.preventDefault();
|
||
}
|
||
},
|
||
_appendGhost: function() {
|
||
if (!ve) {
|
||
var t = this.options.fallbackOnBody ? document.body : Ve, n = Ke(U, !0, Fo, !0, t), o = this.options;
|
||
if (Fo) {
|
||
for (Je = t; he(Je, "position") === "static" && he(Je, "transform") === "none" && Je !== document; )
|
||
Je = Je.parentNode;
|
||
Je !== document.body && Je !== document.documentElement ? (Je === document && (Je = Ht()), n.top += Je.scrollTop, n.left += Je.scrollLeft) : Je = Ht(), cr = Da(Je);
|
||
}
|
||
ve = U.cloneNode(!0), ft(ve, o.ghostClass, !1), ft(ve, o.fallbackClass, !0), ft(ve, o.dragClass, !0), he(ve, "transition", ""), he(ve, "transform", ""), he(ve, "box-sizing", "border-box"), he(ve, "margin", 0), he(ve, "top", n.top), he(ve, "left", n.left), he(ve, "width", n.width), he(ve, "height", n.height), he(ve, "opacity", "0.8"), he(ve, "position", Fo ? "absolute" : "fixed"), he(ve, "zIndex", "100000"), he(ve, "pointerEvents", "none"), me.ghost = ve, t.appendChild(ve), he(ve, "transform-origin", ka / parseInt(ve.style.width) * 100 + "% " + $a / parseInt(ve.style.height) * 100 + "%");
|
||
}
|
||
},
|
||
_onDragStart: function(t, n) {
|
||
var o = this, r = t.dataTransfer, a = o.options;
|
||
if (ct("dragStart", this, {
|
||
evt: t
|
||
}), me.eventCanceled) {
|
||
this._onDrop();
|
||
return;
|
||
}
|
||
ct("setupClone", this), me.eventCanceled || (Ne = Ri(U), Ne.draggable = !1, Ne.style["will-change"] = "", this._hideClone(), ft(Ne, this.options.chosenClass, !1), me.clone = Ne), o.cloneId = Vo(function() {
|
||
ct("clone", o), !me.eventCanceled && (o.options.removeCloneOnHide || Ve.insertBefore(Ne, U), o._hideClone(), ot({
|
||
sortable: o,
|
||
name: "clone"
|
||
}));
|
||
}), !n && ft(U, a.dragClass, !0), n ? (Ho = !0, o._loopId = setInterval(o._emulateDragOver, 50)) : (Fe(document, "mouseup", o._onDrop), Fe(document, "touchend", o._onDrop), Fe(document, "touchcancel", o._onDrop), r && (r.effectAllowed = "move", a.setData && a.setData.call(o, r, U)), De(document, "drop", o), he(U, "transform", "translateZ(0)")), kn = !0, o._dragStartId = Vo(o._dragStarted.bind(o, n, t)), De(document, "selectstart", o), Un = !0, Xn && he(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 = me.active, c = Co === u, d = s.sort, f = Qe || l, h, v = this, p = !1;
|
||
if (Pr)
|
||
return;
|
||
function y(Z, Se) {
|
||
ct(Z, v, zt({
|
||
evt: t,
|
||
isOwner: c,
|
||
axis: h ? "vertical" : "horizontal",
|
||
revert: i,
|
||
dragRect: r,
|
||
targetRect: a,
|
||
canSort: d,
|
||
fromSortable: f,
|
||
target: o,
|
||
completed: R,
|
||
onMove: function(m, C) {
|
||
return Ro(Ve, n, U, r, m, Ke(m), t, C);
|
||
},
|
||
changed: D
|
||
}, Se));
|
||
}
|
||
function b() {
|
||
y("dragOverAnimationCapture"), v.captureAnimationState(), v !== f && f.captureAnimationState();
|
||
}
|
||
function R(Z) {
|
||
return y("dragOverCompleted", {
|
||
insertion: Z
|
||
}), Z && (c ? l._hideClone() : l._showClone(v), v !== f && (ft(U, Qe ? Qe.options.ghostClass : l.options.ghostClass, !1), ft(U, s.ghostClass, !0)), Qe !== v && v !== me.active ? Qe = v : v === me.active && Qe && (Qe = null), f === v && (v._ignoreWhileAnimating = o), v.animateAll(function() {
|
||
y("dragOverAnimationComplete"), v._ignoreWhileAnimating = null;
|
||
}), v !== f && (f.animateAll(), f._ignoreWhileAnimating = null)), (o === U && !U.animated || o === n && !o.animated) && (Dn = null), !s.dragoverBubble && !t.rootEl && o !== document && (U.parentNode[yt]._isOutsideThisEl(t.target), !Z && fn(t)), !s.dragoverBubble && t.stopPropagation && t.stopPropagation(), p = !0;
|
||
}
|
||
function D() {
|
||
ht = Ct(U), tn = Ct(U, s.draggable), ot({
|
||
sortable: v,
|
||
name: "change",
|
||
toEl: n,
|
||
newIndex: ht,
|
||
newDraggableIndex: tn,
|
||
originalEvent: t
|
||
});
|
||
}
|
||
if (t.preventDefault !== void 0 && t.cancelable && t.preventDefault(), o = Bt(o, s.draggable, n, !0), y("dragOver"), me.eventCanceled)
|
||
return p;
|
||
if (U.contains(t.target) || o.animated && o.animatingX && o.animatingY || v._ignoreWhileAnimating === o)
|
||
return R(!1);
|
||
if (Ho = !1, l && !s.disabled && (c ? d || (i = je !== Ve) : Qe === this || (this.lastPutMode = Co.checkPull(this, l, U, t)) && u.checkPut(this, l, U, t))) {
|
||
if (h = this._getDirection(t, o) === "vertical", r = Ke(U), y("dragOverValid"), me.eventCanceled)
|
||
return p;
|
||
if (i)
|
||
return je = Ve, b(), this._hideClone(), y("revert"), me.eventCanceled || (hn ? Ve.insertBefore(U, hn) : Ve.appendChild(U)), R(!0);
|
||
var $ = ta(n, s.draggable);
|
||
if (!$ || Mf(t, h, this) && !$.animated) {
|
||
if ($ === U)
|
||
return R(!1);
|
||
if ($ && n === t.target && (o = $), o && (a = Ke(o)), Ro(Ve, n, U, r, o, a, t, !!o) !== !1)
|
||
return b(), n.appendChild(U), je = n, D(), R(!0);
|
||
} else if ($ && Pf(t, h, this)) {
|
||
var T = Bn(n, 0, s, !0);
|
||
if (T === U)
|
||
return R(!1);
|
||
if (o = T, a = Ke(o), Ro(Ve, n, U, r, o, a, t, !1) !== !1)
|
||
return b(), n.insertBefore(U, T), je = n, D(), R(!0);
|
||
} else if (o.parentNode === n) {
|
||
a = Ke(o);
|
||
var E = 0, P, W = U.parentNode !== n, F = !Ef(U.animated && U.toRect || r, o.animated && o.toRect || a, h), V = h ? "top" : "left", ne = Ra(o, "top", "top") || Ra(U, "top", "top"), L = ne ? ne.scrollTop : void 0;
|
||
Dn !== o && (P = a[V], eo = !1, So = !F && s.invertSwap || W), E = Bf(t, o, a, h, F ? 1 : s.swapThreshold, s.invertedSwapThreshold == null ? s.swapThreshold : s.invertedSwapThreshold, So, Dn === o);
|
||
var A;
|
||
if (E !== 0) {
|
||
var k = Ct(U);
|
||
do
|
||
k -= E, A = je.children[k];
|
||
while (A && (he(A, "display") === "none" || A === ve));
|
||
}
|
||
if (E === 0 || A === o)
|
||
return R(!1);
|
||
Dn = o, Zn = E;
|
||
var N = o.nextElementSibling, J = !1;
|
||
J = E === 1;
|
||
var ue = Ro(Ve, n, U, r, o, a, t, J);
|
||
if (ue !== !1)
|
||
return (ue === 1 || ue === -1) && (J = ue === 1), Pr = !0, setTimeout(Vf, 30), b(), J && !N ? n.appendChild(U) : o.parentNode.insertBefore(U, J ? N : o), ne && Fi(ne, 0, L - ne.scrollTop), je = U.parentNode, P !== void 0 && !So && (Ao = Math.abs(P - Ke(o)[V])), D(), R(!0);
|
||
}
|
||
if (n.contains(U))
|
||
return R(!1);
|
||
}
|
||
return !1;
|
||
},
|
||
_ignoreWhileAnimating: null,
|
||
_offMoveEvents: function() {
|
||
Fe(document, "mousemove", this._onTouchMove), Fe(document, "touchmove", this._onTouchMove), Fe(document, "pointermove", this._onTouchMove), Fe(document, "dragover", fn), Fe(document, "mousemove", fn), Fe(document, "touchmove", fn);
|
||
},
|
||
_offUpEvents: function() {
|
||
var t = this.el.ownerDocument;
|
||
Fe(t, "mouseup", this._onDrop), Fe(t, "touchend", this._onDrop), Fe(t, "pointerup", this._onDrop), Fe(t, "touchcancel", this._onDrop), Fe(document, "selectstart", this);
|
||
},
|
||
_onDrop: function(t) {
|
||
var n = this.el, o = this.options;
|
||
if (ht = Ct(U), tn = Ct(U, o.draggable), ct("drop", this, {
|
||
evt: t
|
||
}), je = U && U.parentNode, ht = Ct(U), tn = Ct(U, o.draggable), me.eventCanceled) {
|
||
this._nulling();
|
||
return;
|
||
}
|
||
kn = !1, So = !1, eo = !1, clearInterval(this._loopId), clearTimeout(this._dragStartTimer), Mr(this.cloneId), Mr(this._dragStartId), this.nativeDraggable && (Fe(document, "drop", this), Fe(n, "dragstart", this._onDragStart)), this._offMoveEvents(), this._offUpEvents(), Xn && he(document.body, "user-select", ""), he(U, "transform", ""), t && (Un && (t.cancelable && t.preventDefault(), !o.dropBubble && t.stopPropagation()), ve && ve.parentNode && ve.parentNode.removeChild(ve), (Ve === je || Qe && Qe.lastPutMode !== "clone") && Ne && Ne.parentNode && Ne.parentNode.removeChild(Ne), U && (this.nativeDraggable && Fe(U, "dragend", this), dr(U), U.style["will-change"] = "", Un && !kn && ft(U, Qe ? Qe.options.ghostClass : this.options.ghostClass, !1), ft(U, this.options.chosenClass, !1), ot({
|
||
sortable: this,
|
||
name: "unchoose",
|
||
toEl: je,
|
||
newIndex: null,
|
||
newDraggableIndex: null,
|
||
originalEvent: t
|
||
}), Ve !== je ? (ht >= 0 && (ot({
|
||
rootEl: je,
|
||
name: "add",
|
||
toEl: je,
|
||
fromEl: Ve,
|
||
originalEvent: t
|
||
}), ot({
|
||
sortable: this,
|
||
name: "remove",
|
||
toEl: je,
|
||
originalEvent: t
|
||
}), ot({
|
||
rootEl: je,
|
||
name: "sort",
|
||
toEl: je,
|
||
fromEl: Ve,
|
||
originalEvent: t
|
||
}), ot({
|
||
sortable: this,
|
||
name: "sort",
|
||
toEl: je,
|
||
originalEvent: t
|
||
})), Qe && Qe.save()) : ht !== On && ht >= 0 && (ot({
|
||
sortable: this,
|
||
name: "update",
|
||
toEl: je,
|
||
originalEvent: t
|
||
}), ot({
|
||
sortable: this,
|
||
name: "sort",
|
||
toEl: je,
|
||
originalEvent: t
|
||
})), me.active && ((ht == null || ht === -1) && (ht = On, tn = Jn), ot({
|
||
sortable: this,
|
||
name: "end",
|
||
toEl: je,
|
||
originalEvent: t
|
||
}), this.save()))), this._nulling();
|
||
},
|
||
_nulling: function() {
|
||
ct("nulling", this), Ve = U = je = ve = hn = Ne = Io = nn = dn = Ft = Un = ht = tn = On = Jn = Dn = Zn = Qe = Co = me.dragged = me.ghost = me.clone = me.active = null, Wo.forEach(function(t) {
|
||
t.checked = !0;
|
||
}), Wo.length = lr = ur = 0;
|
||
},
|
||
handleEvent: function(t) {
|
||
switch (t.type) {
|
||
case "drop":
|
||
case "dragend":
|
||
this._onDrop(t);
|
||
break;
|
||
case "dragenter":
|
||
case "dragover":
|
||
U && (this._onDragOver(t), Af(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], Bt(n, i.draggable, this.el, !1) && t.push(n.getAttribute(i.dataIdAttr) || Nf(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];
|
||
Bt(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 Bt(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 = vo.modifyOption(this, t, n);
|
||
typeof r < "u" ? o[t] = r : o[t] = n, t === "group" && $i(o);
|
||
},
|
||
/**
|
||
* Destroy
|
||
*/
|
||
destroy: function() {
|
||
ct("destroy", this);
|
||
var t = this.el;
|
||
t[yt] = null, Fe(t, "mousedown", this._onTapStart), Fe(t, "touchstart", this._onTapStart), Fe(t, "pointerdown", this._onTapStart), this.nativeDraggable && (Fe(t, "dragover", this), Fe(t, "dragenter", this)), Array.prototype.forEach.call(t.querySelectorAll("[draggable]"), function(n) {
|
||
n.removeAttribute("draggable");
|
||
}), this._onDrop(), this._disableDelayedDragEvents(), zo.splice(zo.indexOf(this.el), 1), this.el = t = null;
|
||
},
|
||
_hideClone: function() {
|
||
if (!nn) {
|
||
if (ct("hideClone", this), me.eventCanceled)
|
||
return;
|
||
he(Ne, "display", "none"), this.options.removeCloneOnHide && Ne.parentNode && Ne.parentNode.removeChild(Ne), nn = !0;
|
||
}
|
||
},
|
||
_showClone: function(t) {
|
||
if (t.lastPutMode !== "clone") {
|
||
this._hideClone();
|
||
return;
|
||
}
|
||
if (nn) {
|
||
if (ct("showClone", this), me.eventCanceled)
|
||
return;
|
||
U.parentNode == Ve && !this.options.group.revertClone ? Ve.insertBefore(Ne, U) : hn ? Ve.insertBefore(Ne, hn) : Ve.appendChild(Ne), this.options.group.revertClone && this.animate(U, Ne), he(Ne, "display", ""), nn = !1;
|
||
}
|
||
}
|
||
};
|
||
function Af(e) {
|
||
e.dataTransfer && (e.dataTransfer.dropEffect = "move"), e.cancelable && e.preventDefault();
|
||
}
|
||
function Ro(e, t, n, o, r, a, i, s) {
|
||
var u, l = e[yt], c = l.options.onMove, d;
|
||
return window.CustomEvent && !Gt && !go ? 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 dr(e) {
|
||
e.draggable = !1;
|
||
}
|
||
function Vf() {
|
||
Pr = !1;
|
||
}
|
||
function Pf(e, t, n) {
|
||
var o = Ke(Bn(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 Mf(e, t, n) {
|
||
var o = Ke(ta(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 Bf(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, f = !1;
|
||
if (!i) {
|
||
if (s && Ao < l * r) {
|
||
if (!eo && (Zn === 1 ? u > c + l * a / 2 : u < d - l * a / 2) && (eo = !0), eo)
|
||
f = !0;
|
||
else if (Zn === 1 ? u < c + Ao : u > d - Ao)
|
||
return -Zn;
|
||
} else if (u > c + l * (1 - r) / 2 && u < d - l * (1 - r) / 2)
|
||
return jf(t);
|
||
}
|
||
return f = f || i, f && (u < c + l * a / 2 || u > d - l * a / 2) ? u > c + l / 2 ? 1 : -1 : 0;
|
||
}
|
||
function jf(e) {
|
||
return Ct(U) < Ct(e) ? 1 : -1;
|
||
}
|
||
function Nf(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 xf(e) {
|
||
Wo.length = 0;
|
||
for (var t = e.getElementsByTagName("input"), n = t.length; n--; ) {
|
||
var o = t[n];
|
||
o.checked && Wo.push(o);
|
||
}
|
||
}
|
||
function Vo(e) {
|
||
return setTimeout(e, 0);
|
||
}
|
||
function Mr(e) {
|
||
return clearTimeout(e);
|
||
}
|
||
er && De(document, "touchmove", function(e) {
|
||
(me.active || kn) && e.cancelable && e.preventDefault();
|
||
});
|
||
me.utils = {
|
||
on: De,
|
||
off: Fe,
|
||
css: he,
|
||
find: Ci,
|
||
is: function(t, n) {
|
||
return !!Bt(t, n, t, !1);
|
||
},
|
||
extend: Cf,
|
||
throttle: Si,
|
||
closest: Bt,
|
||
toggleClass: ft,
|
||
clone: Ri,
|
||
index: Ct,
|
||
nextTick: Vo,
|
||
cancelNextTick: Mr,
|
||
detectDirection: ki,
|
||
getChild: Bn
|
||
};
|
||
me.get = function(e) {
|
||
return e[yt];
|
||
};
|
||
me.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 && (me.utils = zt(zt({}, me.utils), o.utils)), vo.mount(o);
|
||
});
|
||
};
|
||
me.create = function(e, t) {
|
||
return new me(e, t);
|
||
};
|
||
me.version = bf;
|
||
var He = [], Kn, Br, jr = !1, fr, hr, Uo, Yn;
|
||
function Lf() {
|
||
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 ? De(document, "dragover", this._handleAutoScroll) : this.options.supportPointer ? De(document, "pointermove", this._handleFallbackAutoScroll) : o.touches ? De(document, "touchmove", this._handleFallbackAutoScroll) : De(document, "mousemove", this._handleFallbackAutoScroll);
|
||
},
|
||
dragOverCompleted: function(n) {
|
||
var o = n.originalEvent;
|
||
!this.options.dragOverBubble && !o.rootEl && this._handleAutoScroll(o);
|
||
},
|
||
drop: function() {
|
||
this.sortable.nativeDraggable ? Fe(document, "dragover", this._handleAutoScroll) : (Fe(document, "pointermove", this._handleFallbackAutoScroll), Fe(document, "touchmove", this._handleFallbackAutoScroll), Fe(document, "mousemove", this._handleFallbackAutoScroll)), Ea(), Po(), Sf();
|
||
},
|
||
nulling: function() {
|
||
Uo = Br = Kn = jr = Yn = fr = hr = 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 (Uo = n, o || this.options.forceAutoScrollFallback || go || Gt || Xn) {
|
||
mr(n, this.options, s, o);
|
||
var u = rn(s, !0);
|
||
jr && (!Yn || a !== fr || i !== hr) && (Yn && Ea(), Yn = setInterval(function() {
|
||
var l = rn(document.elementFromPoint(a, i), !0);
|
||
l !== u && (u = l, Po()), mr(n, r.options, l, o);
|
||
}, 10), fr = a, hr = i);
|
||
} else {
|
||
if (!this.options.bubbleScroll || rn(s, !0) === Ht()) {
|
||
Po();
|
||
return;
|
||
}
|
||
mr(n, this.options, rn(s, !1), !1);
|
||
}
|
||
}
|
||
}, Yt(e, {
|
||
pluginName: "scroll",
|
||
initializeByDefault: !0
|
||
});
|
||
}
|
||
function Po() {
|
||
He.forEach(function(e) {
|
||
clearInterval(e.pid);
|
||
}), He = [];
|
||
}
|
||
function Ea() {
|
||
clearInterval(Yn);
|
||
}
|
||
var mr = Si(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 = Ht(), l = !1, c;
|
||
Br !== n && (Br = n, Po(), Kn = t.scroll, c = t.scrollFn, Kn === !0 && (Kn = rn(n, !0)));
|
||
var d = 0, f = Kn;
|
||
do {
|
||
var h = f, v = Ke(h), p = v.top, y = v.bottom, b = v.left, R = v.right, D = v.width, $ = v.height, T = void 0, E = void 0, P = h.scrollWidth, W = h.scrollHeight, F = he(h), V = h.scrollLeft, ne = h.scrollTop;
|
||
h === u ? (T = D < P && (F.overflowX === "auto" || F.overflowX === "scroll" || F.overflowX === "visible"), E = $ < W && (F.overflowY === "auto" || F.overflowY === "scroll" || F.overflowY === "visible")) : (T = D < P && (F.overflowX === "auto" || F.overflowX === "scroll"), E = $ < W && (F.overflowY === "auto" || F.overflowY === "scroll"));
|
||
var L = T && (Math.abs(R - r) <= i && V + D < P) - (Math.abs(b - r) <= i && !!V), A = E && (Math.abs(y - a) <= i && ne + $ < W) - (Math.abs(p - a) <= i && !!ne);
|
||
if (!He[d])
|
||
for (var k = 0; k <= d; k++)
|
||
He[k] || (He[k] = {});
|
||
(He[d].vx != L || He[d].vy != A || He[d].el !== h) && (He[d].el = h, He[d].vx = L, He[d].vy = A, clearInterval(He[d].pid), (L != 0 || A != 0) && (l = !0, He[d].pid = setInterval((function() {
|
||
o && this.layer === 0 && me.active._onTouchMove(Uo);
|
||
var N = He[this.layer].vy ? He[this.layer].vy * s : 0, J = He[this.layer].vx ? He[this.layer].vx * s : 0;
|
||
typeof c == "function" && c.call(me.dragged.parentNode[yt], J, N, e, Uo, He[this.layer].el) !== "continue" || Fi(He[this.layer].el, J, N);
|
||
}).bind({
|
||
layer: d
|
||
}), 24))), d++;
|
||
} while (t.bubbleScroll && f !== u && (f = rn(f, !1)));
|
||
jr = l;
|
||
}
|
||
}, 30), Ti = 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 na() {
|
||
}
|
||
na.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 = Bn(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: Ti
|
||
};
|
||
Yt(na, {
|
||
pluginName: "revertOnSpill"
|
||
});
|
||
function oa() {
|
||
}
|
||
oa.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: Ti
|
||
};
|
||
Yt(oa, {
|
||
pluginName: "removeOnSpill"
|
||
});
|
||
me.mount(new Lf());
|
||
me.mount(oa, na);
|
||
var qf = Object.defineProperty, Hf = Object.defineProperties, zf = Object.getOwnPropertyDescriptors, Ta = Object.getOwnPropertySymbols, Wf = Object.prototype.hasOwnProperty, Uf = Object.prototype.propertyIsEnumerable, Ia = (e, t, n) => t in e ? qf(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n, an = (e, t) => {
|
||
for (var n in t || (t = {}))
|
||
Wf.call(t, n) && Ia(e, n, t[n]);
|
||
if (Ta)
|
||
for (var n of Ta(t))
|
||
Uf.call(t, n) && Ia(e, n, t[n]);
|
||
return e;
|
||
}, Ko = (e, t) => Hf(e, zf(t));
|
||
function pr(e) {
|
||
e.parentElement !== null && e.parentElement.removeChild(e);
|
||
}
|
||
function Aa(e, t, n) {
|
||
const o = n === 0 ? e.children[0] : e.children[n - 1].nextSibling;
|
||
e.insertBefore(t, o);
|
||
}
|
||
function Kf() {
|
||
return typeof window < "u" ? window.console : global.console;
|
||
}
|
||
const Yf = Kf();
|
||
function Gf(e) {
|
||
const t = /* @__PURE__ */ Object.create(null);
|
||
return function(o) {
|
||
return t[o] || (t[o] = e(o));
|
||
};
|
||
}
|
||
const Xf = /-(\w)/g, Qf = Gf((e) => e.replace(Xf, (t, n) => n.toUpperCase())), Ii = ["Start", "Add", "Remove", "Update", "End"], Ai = ["Choose", "Unchoose", "Sort", "Filter", "Clone"], Vi = ["Move"], Jf = [Vi, Ii, Ai].flatMap((e) => e).map((e) => `on${e}`), Nr = {
|
||
manage: Vi,
|
||
manageAndEmit: Ii,
|
||
emit: Ai
|
||
};
|
||
function Zf(e) {
|
||
return Jf.indexOf(e) !== -1;
|
||
}
|
||
const eh = [
|
||
"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 th(e) {
|
||
return eh.includes(e);
|
||
}
|
||
function nh(e) {
|
||
return ["transition-group", "TransitionGroup"].includes(e);
|
||
}
|
||
function Pi(e) {
|
||
return ["id", "class", "role", "style"].includes(e) || e.startsWith("data-") || e.startsWith("aria-") || e.startsWith("on");
|
||
}
|
||
function Mi(e) {
|
||
return e.reduce((t, [n, o]) => (t[n] = o, t), {});
|
||
}
|
||
function oh({ $attrs: e, componentData: t = {} }) {
|
||
const n = Mi(Object.entries(e).filter(([o, r]) => Pi(o)));
|
||
return an(an({}, n), t);
|
||
}
|
||
function rh({ $attrs: e, callBackBuilder: t }) {
|
||
const n = Mi(Bi(e));
|
||
Object.entries(t).forEach(([r, a]) => {
|
||
Nr[r].forEach((i) => {
|
||
n[`on${i}`] = a(i);
|
||
});
|
||
});
|
||
const o = `[data-draggable]${n.draggable || ""}`;
|
||
return Ko(an({}, n), {
|
||
draggable: o
|
||
});
|
||
}
|
||
function Bi(e) {
|
||
return Object.entries(e).filter(([t, n]) => !Pi(t)).map(([t, n]) => [Qf(t), n]).filter(([t, n]) => !Zf(t));
|
||
}
|
||
const Va = (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 || {};
|
||
}, ah = (e, t) => e.__draggable_context = t, Pa = (e) => e.__draggable_context;
|
||
class ih {
|
||
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) => {
|
||
ah(Va(o), {
|
||
element: n[r],
|
||
index: r
|
||
});
|
||
});
|
||
}
|
||
getUnderlyingVm(t) {
|
||
return Pa(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 = Pa(i);
|
||
if (s)
|
||
return s.index;
|
||
if (r === 0)
|
||
return 0;
|
||
const u = Va(o[0]), l = [...a].findIndex((c) => c === u);
|
||
return t < l ? 0 : r;
|
||
}
|
||
}
|
||
function sh(e, t) {
|
||
const n = e[t];
|
||
return n ? n() : [];
|
||
}
|
||
function lh({ $slots: e, realList: t, getKey: n }) {
|
||
const o = t || [], [r, a] = ["header", "footer"].map((u) => sh(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 = Ko(an({}, 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 uh(e) {
|
||
const t = nh(e), n = !th(e) && !t;
|
||
return {
|
||
transition: t,
|
||
externalComponent: n,
|
||
tag: n ? G(e) : t ? is : e
|
||
};
|
||
}
|
||
function ch({ $slots: e, tag: t, realList: n, getKey: o }) {
|
||
const r = lh({ $slots: e, realList: n, getKey: o }), a = uh(t);
|
||
return new ih({ nodes: r, root: a, realList: n });
|
||
}
|
||
function ji(e, t) {
|
||
Be(() => this.$emit(e.toLowerCase(), t));
|
||
}
|
||
function Ni(e) {
|
||
return (t, n) => {
|
||
if (this.realList !== null)
|
||
return this[`onDrag${e}`](t, n);
|
||
};
|
||
}
|
||
function dh(e) {
|
||
const t = Ni.call(this, e);
|
||
return (n, o) => {
|
||
t.call(this, n, o), ji.call(this, e, n);
|
||
};
|
||
}
|
||
let gr = null;
|
||
const fh = {
|
||
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
|
||
}
|
||
}, hh = [
|
||
"update:modelValue",
|
||
"change",
|
||
...[...Nr.manageAndEmit, ...Nr.emit].map((e) => e.toLowerCase())
|
||
], mh = le({
|
||
name: "draggable",
|
||
inheritAttrs: !1,
|
||
props: fh,
|
||
emits: hh,
|
||
data() {
|
||
return {
|
||
error: !1
|
||
};
|
||
},
|
||
render() {
|
||
try {
|
||
this.error = !1;
|
||
const { $slots: e, $attrs: t, tag: n, componentData: o, realList: r, getKey: a } = this, i = ch({
|
||
$slots: e,
|
||
tag: n,
|
||
realList: r,
|
||
getKey: a
|
||
});
|
||
this.componentStructure = i;
|
||
const s = oh({ $attrs: t, componentData: o });
|
||
return i.render(vr, s);
|
||
} catch (e) {
|
||
return this.error = !0, vr("pre", { style: { color: "red" } }, e.stack);
|
||
}
|
||
},
|
||
created() {
|
||
this.list !== null && this.modelValue !== null && Yf.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 = rh({
|
||
$attrs: e,
|
||
callBackBuilder: {
|
||
manageAndEmit: (a) => dh.call(this, a),
|
||
emit: (a) => ji.bind(this, a),
|
||
manage: (a) => Ni.call(this, a)
|
||
}
|
||
}), r = t.nodeType === 1 ? t : t.parentElement;
|
||
this._sortable = new me(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 && Bi(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) {
|
||
Be(() => 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 an(an({}, 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), gr = e.item;
|
||
},
|
||
onDragAdd(e) {
|
||
const t = e.item._underlying_vm_;
|
||
if (t === void 0)
|
||
return;
|
||
pr(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 (Aa(this.$el, e.item, e.oldIndex), e.pullMode === "clone") {
|
||
pr(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) {
|
||
pr(e.item), Aa(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(gr) !== -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 = Ko(an({}, this.context), {
|
||
futureIndex: a
|
||
}), s = Ko(an({}, e), {
|
||
relatedContext: r,
|
||
draggedContext: i
|
||
});
|
||
return n(s, t);
|
||
},
|
||
onDragEnd() {
|
||
gr = null;
|
||
}
|
||
}
|
||
}), ph = le({
|
||
name: "FsTableColumnsFixedController",
|
||
props: {
|
||
modelValue: {
|
||
default: !1
|
||
}
|
||
},
|
||
emits: ["update:modelValue", "change"],
|
||
setup(e, t) {
|
||
const { ui: n } = we(), o = M(() => [
|
||
{
|
||
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 gh(e, t, n, o, r, a) {
|
||
const i = G("fs-button");
|
||
return w(), I(H(e.ui.buttonGroup.name), { class: "fs-table-columns-fixed-controller" }, {
|
||
default: B(() => [
|
||
(w(!0), j(be, null, Te(e.options, (s) => (w(), I(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 xi = /* @__PURE__ */ Oe(ph, [["render", gh]]), vh = ["title", "i"], bh = { class: "item-right" }, yh = {
|
||
"flex-box": "0",
|
||
class: "component--list-item-handle handle"
|
||
}, wh = { style: { "margin-left": "20px", "padding-left": "10px", "border-left": "1px solid #eee" } }, Li = /* @__PURE__ */ le({
|
||
__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 } = we(), o = t, { originalColumns: r, currentColumns: a, originalColumnsMap: i, text: s, active: u } = jn(ea);
|
||
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, R = [];
|
||
for (const P of a.value)
|
||
P.key === y.key ? R.push(b) : P.key === b.key ? R.push(y) : R.push(P);
|
||
let D = 0, $ = R.length - 1, T = R.length - 1, E = 0;
|
||
for (let P = 0; P < R.length; P++) {
|
||
const W = R[P];
|
||
W.fixed === "left" ? D = P : W.fixed === "right" ? $ = $ > P ? P : $ : (T = T > P ? P : T, E = E < P ? P : E);
|
||
}
|
||
if (T < D || E > $)
|
||
return !1;
|
||
}
|
||
function d(p) {
|
||
return "update:" + p;
|
||
}
|
||
function f(p) {
|
||
p.show = !p.show;
|
||
function y(R) {
|
||
R.children && R.children.forEach((D) => {
|
||
!D.__show || D.__disabled || (D.show = R.show, y(D));
|
||
});
|
||
}
|
||
y(p);
|
||
function b(R) {
|
||
if (R.__parent) {
|
||
const D = R.__parent;
|
||
D && (D.show = D.children.filter(($) => $.__show && $.show === !0).length > 0, b(D));
|
||
}
|
||
}
|
||
b(p);
|
||
}
|
||
function h() {
|
||
o("check-changed");
|
||
}
|
||
function v(p, y) {
|
||
o("fixed-changed", p, y);
|
||
}
|
||
return (p, y) => {
|
||
const b = G("fs-icon"), R = G("fs-columns-filter-nest-list", !0);
|
||
return w(), I(q(mh), {
|
||
list: p.columns,
|
||
"item-key": "key",
|
||
move: c
|
||
}, {
|
||
item: B(({ element: D, index: $ }) => {
|
||
var T, E;
|
||
return [
|
||
te("div", null, [
|
||
Hr(te("div", {
|
||
title: l(D),
|
||
class: "component--list-item",
|
||
flex: "main:justify cross:center",
|
||
i: $
|
||
}, [
|
||
(w(), I(H(q(n).checkbox.name), z({
|
||
[q(n).checkbox.modelValue || ""]: D.show,
|
||
disabled: ((T = q(i)[D.__key]) == null ? void 0 : T.__disabled) === !0,
|
||
class: "item-label",
|
||
title: l(D)
|
||
}, {
|
||
[ss(d(q(n).checkbox.modelValue))]: (P) => f(D)
|
||
}, { onChange: h }), {
|
||
default: B(() => [
|
||
Vt(We(l(D)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040, ["disabled", "title"])),
|
||
te("div", bh, [
|
||
p.isRoot ? (w(), I(xi, {
|
||
key: 0,
|
||
modelValue: D.fixed,
|
||
"onUpdate:modelValue": (P) => D.fixed = P,
|
||
"flex-box": "0",
|
||
class: "d2-mr-10",
|
||
onChange: (P) => v($, P)
|
||
}, null, 8, ["modelValue", "onUpdate:modelValue", "onChange"])) : oe("", !0),
|
||
te("div", yh, [
|
||
x(b, {
|
||
icon: q(n).icons.sort
|
||
}, null, 8, ["icon"])
|
||
])
|
||
])
|
||
], 8, vh), [
|
||
[ja, ((E = q(i)[D.__key]) == null ? void 0 : E.__show) !== !1]
|
||
]),
|
||
te("div", wh, [
|
||
D.children ? (w(), I(R, {
|
||
key: 0,
|
||
columns: D.children,
|
||
onCheckChanged: h
|
||
}, null, 8, ["columns"])) : oe("", !0)
|
||
])
|
||
])
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 8, ["list"]);
|
||
};
|
||
}
|
||
}), _h = { class: "component--list" }, Ch = {
|
||
key: "__first__",
|
||
class: "component--list-item",
|
||
flex: "main:justify cross:center"
|
||
}, Sh = { span: 12 }, Fh = { class: "title" }, Rh = /* @__PURE__ */ le({
|
||
__name: "fs-columns-filter-layout-default",
|
||
props: {
|
||
width: {},
|
||
drawer: {}
|
||
},
|
||
setup(e) {
|
||
const { ui: t } = we(), { originalColumns: n, currentColumns: o, text: r, active: a } = jn(ea), i = e, s = M(() => ho(
|
||
{
|
||
[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 = M(() => ({
|
||
[t.checkbox.modelValue]: u.value,
|
||
["onUpdate:" + t.checkbox.modelValue]: (y) => {
|
||
l(y);
|
||
}
|
||
})), d = M(() => o.value.filter((y) => y.__show && y.show === !0).length), f = M(() => o.value.filter((y) => y.__show).length), h = M(() => d.value > 0 && d.value < f.value);
|
||
it(
|
||
() => {
|
||
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 === f.value;
|
||
}
|
||
return (y, b) => (w(), I(H(q(t).drawer.name), z({
|
||
class: "fs-columns-filter-layout-default",
|
||
title: q(r).title
|
||
}, s.value, { "append-to-body": "" }), {
|
||
default: B(() => [
|
||
(w(), I(H(q(t).drawer.hasContentWrap || "div"), {
|
||
class: "fs-drawer-wrapper fs-table-columns-filter",
|
||
title: q(r).title
|
||
}, {
|
||
default: B(() => [
|
||
(w(), I(H(q(t).card.name), { shadow: "never" }, {
|
||
default: B(() => [
|
||
te("div", _h, [
|
||
te("div", Ch, [
|
||
te("span", Sh, [
|
||
(w(), I(H(q(t).checkbox.name), z({ indeterminate: h.value }, c.value), {
|
||
default: B(() => [
|
||
Vt(We(d.value) + " / " + We(f.value), 1)
|
||
]),
|
||
_: 1
|
||
}, 16, ["indeterminate"]))
|
||
]),
|
||
te("span", Fh, We(q(r).fixed) + " / " + We(q(r).order), 1)
|
||
]),
|
||
x(Li, {
|
||
columns: q(o),
|
||
"is-root": !0,
|
||
onCheckChanged: p,
|
||
onFixedChanged: v
|
||
}, null, 8, ["columns"])
|
||
])
|
||
]),
|
||
_: 1
|
||
})),
|
||
re(y.$slots, "buttons")
|
||
]),
|
||
_: 3
|
||
}, 8, ["title"]))
|
||
]),
|
||
_: 3
|
||
}, 16, ["title"]));
|
||
}
|
||
}), Dh = le({
|
||
name: "FsSearchButtons",
|
||
inheritAttrs: !1,
|
||
props: {
|
||
buttons: {
|
||
type: Object
|
||
}
|
||
},
|
||
setup() {
|
||
const { ui: e } = we();
|
||
return { ui: e };
|
||
}
|
||
}), kh = { class: "fs-search-col fs-search-btns" };
|
||
function $h(e, t, n, o, r, a) {
|
||
const i = G("fs-button");
|
||
return w(), j("div", kh, [
|
||
(w(), I(H(e.ui.formItem.name), null, {
|
||
default: B(() => [
|
||
(w(!0), j(be, null, Te(e.buttons, (s, u) => (w(), j(be, { key: u }, [
|
||
s.show ? (w(), I(i, z({
|
||
key: 0,
|
||
ref_for: !0
|
||
}, s, {
|
||
onClick: (l) => s._click()
|
||
}), null, 16, ["onClick"])) : oe("", !0)
|
||
], 64))), 128))
|
||
]),
|
||
_: 1
|
||
}))
|
||
]);
|
||
}
|
||
const qi = /* @__PURE__ */ Oe(Dh, [["render", $h]]), Oh = /* @__PURE__ */ le({
|
||
name: "FsSearch",
|
||
components: {
|
||
FsSearchButtons: qi
|
||
},
|
||
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
|
||
} = we(), {
|
||
merge: o
|
||
} = $e(), r = o, {
|
||
doComputed: a,
|
||
AsyncComputeValue: i,
|
||
ComputeValue: s
|
||
} = Pt();
|
||
bt(e.columns, (m) => {
|
||
m.value != null && (m.value instanceof i || m.value instanceof s) && ce.warn("search.value配置不支持ComputeValue/AsyncCompute类型的动态计算");
|
||
});
|
||
function u() {
|
||
const m = {};
|
||
return Y(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 = yn(u());
|
||
let c = null;
|
||
const d = a(() => e.columns, T, null, (m) => {
|
||
const C = dt(e.formItem || {});
|
||
Y(m, (O) => {
|
||
o(O, C, O);
|
||
}), e.validate || Y(m, (O) => {
|
||
delete O.rules, delete O.rule;
|
||
}), e.col && Y(m, (O) => {
|
||
O.col = o({}, e.col, O.col);
|
||
}), Y(m, (O) => {
|
||
O._cellRender = () => p(O);
|
||
});
|
||
let _ = [];
|
||
Y(m, (O, Q) => {
|
||
O._key = Q, _.push(O);
|
||
}), _ = Cn(_, (O) => O.order ?? ln.orderDefault);
|
||
const S = {};
|
||
return _.forEach((O) => {
|
||
let Q = O._key;
|
||
delete O._key, S[Q] = O;
|
||
}), S;
|
||
});
|
||
function f() {
|
||
const m = dt(l);
|
||
t.emit("update:validatedForm", m);
|
||
}
|
||
it(() => e.validatedForm, (m) => {
|
||
for (const C in l)
|
||
delete l[C];
|
||
o(l, m || {});
|
||
}, {
|
||
deep: !0
|
||
});
|
||
const h = (m, C) => st(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) {
|
||
Se(ie, m);
|
||
}
|
||
function S() {
|
||
ue(m);
|
||
}
|
||
function O(ie, de) {
|
||
de.code === "Enter" && ie.autoSearchTrigger === "enter" && W();
|
||
}
|
||
let Q = null;
|
||
e.slots["search_" + C] ? Q = x(G("fs-slot-render"), {
|
||
slots: e.slots["search_" + C],
|
||
scope: E(C)
|
||
}, null) : m.render ? Q = x(G("fs-render"), {
|
||
"render-func": m.render,
|
||
scope: E(C)
|
||
}, null) : m.component && m.component.show !== !1 && (Q = x(G("fs-component-render"), z({
|
||
ref: (ie) => {
|
||
R.value[C] = ie;
|
||
},
|
||
"model-value": h(l, C),
|
||
onKeyup: (ie) => {
|
||
O(m, ie);
|
||
}
|
||
}, m.component, {
|
||
scope: E(C),
|
||
"onUpdate:modelValue": _,
|
||
onInput: S
|
||
}), null));
|
||
const se = v(C);
|
||
return n.formItem.render({
|
||
props: {
|
||
...m,
|
||
label: m.title,
|
||
[n.formItem.prop]: se,
|
||
path: C,
|
||
rulePath: C
|
||
},
|
||
slots: {
|
||
default() {
|
||
return Q;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
const y = K(), {
|
||
t: b
|
||
} = lt(), R = K({});
|
||
function D(m) {
|
||
return R.value[m];
|
||
}
|
||
function $(m) {
|
||
var C;
|
||
return (C = D(m)) == null ? void 0 : C.getTargetRef();
|
||
}
|
||
function T() {
|
||
return {
|
||
form: l,
|
||
validatedForm: e.validatedForm,
|
||
getComponentRef: $,
|
||
doSearch: W,
|
||
doReset: F,
|
||
doValidate: P
|
||
};
|
||
}
|
||
function E(m) {
|
||
return {
|
||
...T(),
|
||
key: m,
|
||
value: h(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", {
|
||
...T(),
|
||
error: _,
|
||
trigger: C
|
||
}), !1;
|
||
}
|
||
}
|
||
async function W() {
|
||
c && c.cancel(), await P() && (f(), await Be(), t.emit("_search", T()), t.emit("search", T()));
|
||
}
|
||
async function F() {
|
||
const m = u(), C = zr(l);
|
||
for (const _ of C) {
|
||
const S = h(m, _[0]);
|
||
S == null ? No(l, _[0]) : tt(l, _[0], S);
|
||
}
|
||
await P() && (f(), await Be(), e.reset && e.reset(T()), t.emit("_reset", T()), t.emit("reset", T()), e.searchAfterReset && W());
|
||
}
|
||
const V = M(() => {
|
||
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: (_) => {
|
||
F();
|
||
},
|
||
text: b("fs.search.reset.text"),
|
||
// '重置',
|
||
order: 2
|
||
}
|
||
};
|
||
o(C, e.buttons);
|
||
for (let _ in C) {
|
||
const S = C[_];
|
||
S._click = () => {
|
||
S.click(T());
|
||
}, m.push(S);
|
||
}
|
||
return m.sort((_, S) => _.order - S.order), m;
|
||
});
|
||
function ne() {
|
||
var m;
|
||
if (e.autoSearch !== !1 && e.debounce !== !1) {
|
||
let C = ((m = e.debounce) == null ? void 0 : m.wait) || 500;
|
||
c = ys(W, C, e.debounce);
|
||
}
|
||
}
|
||
ne();
|
||
function L() {
|
||
return l;
|
||
}
|
||
function A() {
|
||
return e.validatedForm;
|
||
}
|
||
function k(m, C = !0) {
|
||
C || bt(qa(l), (_) => {
|
||
delete l[_];
|
||
}), r(l, m), f();
|
||
}
|
||
const N = K(!1), J = () => {
|
||
ce.debug("do auto search,inputEventDisabled:", N.value), N.value !== !0 && c && c();
|
||
}, ue = (m) => {
|
||
m.autoSearchTrigger === "input" && J();
|
||
}, Z = (m) => {
|
||
N.value = m, J();
|
||
};
|
||
async function Se(m, C) {
|
||
const _ = C.key;
|
||
tt(l, _, m);
|
||
const S = e.validateOnChangeSilent;
|
||
if (C.valueChange) {
|
||
const O = C.key, Q = l[O], se = $(O), ie = C.valueChange instanceof Function ? C.valueChange : C.valueChange.handle, de = T(), _e = {
|
||
index: 0,
|
||
row: de.form,
|
||
form: de.form,
|
||
...de,
|
||
key: O,
|
||
value: Q,
|
||
componentRef: se,
|
||
immediate: !1,
|
||
getComponentRef: $,
|
||
mode: "search"
|
||
};
|
||
ie(_e);
|
||
}
|
||
e.validateOnChange && await P(S, "change") && f(), (C.autoSearchTrigger == null || C.autoSearchTrigger === !0 || C.autoSearchTrigger === "change") && J();
|
||
}
|
||
const ke = M(() => e.validate ? e.options.rules : []);
|
||
return f(), {
|
||
get: h,
|
||
ui: n,
|
||
onValueChanged: Se,
|
||
doValidate: P,
|
||
doSearch: W,
|
||
doReset: F,
|
||
formData: l,
|
||
componentRenderRefs: R,
|
||
getComponentRenderRef: D,
|
||
getComponentRef: $,
|
||
getForm: L,
|
||
getValidatedForm: A,
|
||
setForm: k,
|
||
searchFormRef: y,
|
||
onInput: ue,
|
||
inputEventDisabled: N,
|
||
changeInputEventDisabled: Z,
|
||
computedColumns: d,
|
||
computedButtons: V,
|
||
computedRules: ke,
|
||
buildFieldContext: E,
|
||
getContextFn: T
|
||
};
|
||
}
|
||
});
|
||
const Eh = { class: "fs-search fs-search-v2" }, Th = { class: "fs-search-buttons" };
|
||
function Ih(e, t, n, o, r, a) {
|
||
const i = G("fs-button"), s = G("fs-slot-render");
|
||
return w(), j("div", Eh, [
|
||
(w(), I(H(e.ui.collapseTransition.name), null, {
|
||
default: B(() => [
|
||
(w(), I(H(e.ui.form.name), z({
|
||
ref: "searchFormRef",
|
||
model: e.formData,
|
||
onsubmit: "event.preventDefault();"
|
||
}, e.options, {
|
||
rules: e.computedRules,
|
||
class: "fs-search-form",
|
||
onCompositionstart: t[0] || (t[0] = (u) => e.changeInputEventDisabled(!0)),
|
||
onCompositionend: t[1] || (t[1] = (u) => e.changeInputEventDisabled(!1))
|
||
}), {
|
||
default: B(() => {
|
||
var u;
|
||
return [
|
||
e.show !== !1 ? (w(), I(H(((u = e.container) == null ? void 0 : u.is) || "fs-search-layout-default"), z({ key: 0 }, e.container, {
|
||
columns: e.computedColumns,
|
||
"get-context-fn": e.getContextFn
|
||
}), Lr({
|
||
"search-buttons": B(() => [
|
||
te("div", Th, [
|
||
(w(!0), j(be, null, Te(e.computedButtons, (l, c) => (w(), j(be, { key: c }, [
|
||
l.show !== !1 ? (w(), I(i, z({
|
||
key: 0,
|
||
ref_for: !0
|
||
}, l, {
|
||
onClick: (d) => l._click()
|
||
}), null, 16, ["onClick"])) : oe("", !0)
|
||
], 64))), 128))
|
||
])
|
||
]),
|
||
_: 2
|
||
}, [
|
||
e.slots["search-left"] ? {
|
||
name: "search-left",
|
||
fn: B(() => [
|
||
x(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: B(() => [
|
||
x(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: B(() => [
|
||
x(s, {
|
||
slots: e.slots["search-right"],
|
||
scope: e.getContextFn()
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
key: "2"
|
||
} : void 0
|
||
]), 1040, ["columns", "get-context-fn"])) : oe("", !0)
|
||
];
|
||
}),
|
||
_: 1
|
||
}, 16, ["model", "rules"]))
|
||
]),
|
||
_: 1
|
||
}))
|
||
]);
|
||
}
|
||
const Ah = /* @__PURE__ */ Oe(Oh, [["render", Ih]]), Vh = le({
|
||
name: "FsSearchV1",
|
||
components: { FsSearchButtons: qi },
|
||
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 } = we();
|
||
_n(() => {
|
||
if (Se.value && k.value) {
|
||
N.value = k.value.$el.offsetHeight;
|
||
const m = k.value.$el.children;
|
||
m && m.length > 1 && (J.value = m[1].offsetHeight + 2);
|
||
}
|
||
});
|
||
let o = null;
|
||
function r() {
|
||
return cloneDeep(e.initialForm || {});
|
||
}
|
||
const a = yn(r()), { doComputed: i, AsyncComputeValue: s } = Pt();
|
||
bt(e.columns, (m) => {
|
||
m.value != null && m.value instanceof s && ce.warn("search.value配置不支持AsyncCompute类型的动态计算");
|
||
});
|
||
const { merge: u } = $e(), l = u, c = i(
|
||
() => e.columns,
|
||
y,
|
||
null,
|
||
(m) => {
|
||
e.validate || Y(m, (S) => {
|
||
delete S.rules;
|
||
}), e.col && Y(m, (S) => {
|
||
S.col = u({}, e.col, S.col);
|
||
});
|
||
let C = [];
|
||
Y(m, (S, O) => {
|
||
S._key = O, C.push(S);
|
||
}), C = Cn(C, (S) => S.order ?? ln.orderDefault);
|
||
const _ = {};
|
||
return C.forEach((S) => {
|
||
let O = S._key;
|
||
delete S._key, _[O] = S;
|
||
}), _;
|
||
}
|
||
);
|
||
Y(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: f } = lt(), h = K({});
|
||
function v(m) {
|
||
return h.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 R() {
|
||
if (o && o.cancel(), await n.form.validateWrap(d.value))
|
||
t.emit("search", b.value);
|
||
else
|
||
return n.message.error({
|
||
message: f("fs.search.error.message")
|
||
}), !1;
|
||
}
|
||
function D() {
|
||
const m = r(), C = zr(a);
|
||
for (const _ of C) {
|
||
const S = st(m, _[0]);
|
||
S == null ? No(a, _[0]) : tt(a, _[0], S);
|
||
}
|
||
e.reset && e.reset(b.value), t.emit("reset", y()), e.searchAfterReset && Be(() => {
|
||
R();
|
||
});
|
||
}
|
||
const $ = M(() => {
|
||
const m = [], C = {
|
||
search: {
|
||
show: !0,
|
||
type: "primary",
|
||
disabled: !1,
|
||
click: (_) => {
|
||
R();
|
||
},
|
||
order: 1,
|
||
text: f("fs.search.search.text")
|
||
// '查询',
|
||
},
|
||
reset: {
|
||
show: !0,
|
||
disabled: !1,
|
||
click: (_) => {
|
||
D();
|
||
},
|
||
text: f("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 T() {
|
||
var m;
|
||
if (e.autoSearch !== !1 && e.debounce !== !1) {
|
||
let C = ((m = e.debounce) == null ? void 0 : m.wait) || 500;
|
||
o = debounce(R, C, e.debounce);
|
||
}
|
||
}
|
||
T();
|
||
function E() {
|
||
return a;
|
||
}
|
||
function P(m, C = !0) {
|
||
C || bt(qa(a), (_) => {
|
||
delete a[_];
|
||
}), l(a, m);
|
||
}
|
||
const W = K(!1), F = () => {
|
||
ce.debug("do auto search,inputEventDisabled:", W.value), W.value !== !0 && o && o();
|
||
}, V = (m) => {
|
||
m.autoSearchTrigger === "input" && F();
|
||
}, ne = (m) => {
|
||
W.value = m, F();
|
||
};
|
||
function L(m, C) {
|
||
const _ = C.key;
|
||
if (tt(a, _, m), C.valueChange) {
|
||
const S = C.key, O = a[S], Q = p(S);
|
||
(C.valueChange instanceof Function ? C.valueChange : C.valueChange.handle)({ key: S, value: O, componentRef: Q, ...y(), immidiate: !1 });
|
||
}
|
||
(C.autoSearchTrigger == null || C.autoSearchTrigger === !0 || C.autoSearchTrigger === "change") && F();
|
||
}
|
||
const A = M(() => e.validate ? e.options.rules : []), k = K(), N = K(0), J = K(0), ue = () => {
|
||
t.emit("update:collapse", !e.collapse), t.emit("collapse", !e.collapse);
|
||
}, Z = M(() => e.layout === "multi-line" ? n.col.name : "div"), Se = M(() => e.layout === "multi-line"), ke = M(() => Se.value ? e.collapse ? J.value ? J.value + "px" : "" : N.value ? N.value + "px" : "" : "auto");
|
||
return {
|
||
get: (m, C) => st(m, C),
|
||
ui: n,
|
||
onValueChanged: L,
|
||
doSearch: R,
|
||
doReset: D,
|
||
form: a,
|
||
componentRenderRefs: h,
|
||
getComponentRenderRef: v,
|
||
getComponentRef: p,
|
||
getForm: E,
|
||
setForm: P,
|
||
searchFormRef: d,
|
||
onInput: V,
|
||
inputEventDisabled: W,
|
||
changeInputEventDisabled: ne,
|
||
computedColumns: c,
|
||
computedButtons: $,
|
||
computedRules: A,
|
||
columnsRowRef: k,
|
||
computedColumnBoxHeight: ke,
|
||
computedColName: Z,
|
||
computedIsMultiLine: Se,
|
||
toggleCollapse: ue,
|
||
searchEventContextRef: b
|
||
};
|
||
}
|
||
});
|
||
const Ph = { class: "fs-search-box" }, Mh = { class: "fs-search-main" }, Bh = {
|
||
key: 0,
|
||
class: "fs-search-col"
|
||
}, jh = {
|
||
key: 1,
|
||
class: "fs-search-col fs-search-middle"
|
||
}, Nh = {
|
||
key: 3,
|
||
class: "fs-search-col fs-search-right"
|
||
}, xh = {
|
||
key: 0,
|
||
class: "fs-search-action"
|
||
};
|
||
function Lh(e, t, n, o, r, a) {
|
||
const i = G("fs-slot-render"), s = G("fs-component-render"), u = G("fs-search-buttons"), l = G("fs-button");
|
||
return w(), I(H(e.ui.collapseTransition.name), null, {
|
||
default: B(() => [
|
||
e.show !== !1 ? (w(), j("div", {
|
||
key: 0,
|
||
class: St(["fs-search", { "fs-search-multi-line": e.computedIsMultiLine }])
|
||
}, [
|
||
(w(), I(H(e.ui.form.name), z({
|
||
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: B(() => [
|
||
te("div", Ph, [
|
||
te("div", Mh, [
|
||
te("div", {
|
||
class: St(["fs-search-columns", { "fs-search-collapse": e.collapse }]),
|
||
style: to({ height: e.computedColumnBoxHeight })
|
||
}, [
|
||
(w(), I(H(e.ui.row.name), { ref: "columnsRowRef" }, {
|
||
default: B(() => [
|
||
e.slots["search-left"] ? (w(), j("div", Bh, [
|
||
(w(), I(H(e.ui.formItem.name), null, {
|
||
default: B(() => [
|
||
x(i, {
|
||
slots: e.slots["search-left"],
|
||
scope: e.searchEventContextRef
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : oe("", !0),
|
||
(w(!0), j(be, null, Te(e.computedColumns, (c, d) => (w(), j(be, { key: d }, [
|
||
c.show === !0 ? (w(), I(H(e.computedColName), z({
|
||
key: 0,
|
||
class: "fs-search-col"
|
||
}, { ref_for: !0 }, c.col), {
|
||
default: B(() => [
|
||
(w(), I(H(e.ui.formItem.name), z({ ref_for: !0 }, c, {
|
||
[e.ui.formItem.prop || ""]: d,
|
||
label: c.title
|
||
}), {
|
||
default: B(() => [
|
||
e.slots["search_" + d] ? (w(), I(i, {
|
||
key: 0,
|
||
slots: e.slots["search_" + d],
|
||
scope: { ...e.searchEventContextRef, key: d }
|
||
}, null, 8, ["slots", "scope"])) : (w(), j(be, { key: 1 }, [
|
||
c.component && c.component.show !== !1 ? (w(), I(s, z({
|
||
key: 0,
|
||
ref_for: !0,
|
||
ref: (f) => {
|
||
f && (e.componentRenderRefs[c.key] = f);
|
||
},
|
||
"model-value": e.get(e.form, d)
|
||
}, { ref_for: !0 }, c.component, {
|
||
scope: e.searchEventContextRef,
|
||
"onUpdate:modelValue": (f) => e.onValueChanged(f, c),
|
||
onInput: (f) => e.onInput(c)
|
||
}), null, 16, ["model-value", "scope", "onUpdate:modelValue", "onInput"])) : oe("", !0)
|
||
], 64))
|
||
]),
|
||
_: 2
|
||
}, 1040, ["label"]))
|
||
]),
|
||
_: 2
|
||
}, 1040)) : oe("", !0)
|
||
], 64))), 128)),
|
||
e.slots["search-middle"] ? (w(), j("div", jh, [
|
||
(w(), I(H(e.ui.formItem.name), null, {
|
||
default: B(() => [
|
||
x(i, {
|
||
slots: e.slots["search-middle"],
|
||
scope: e.searchEventContextRef
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : oe("", !0),
|
||
e.computedIsMultiLine ? oe("", !0) : (w(), I(u, {
|
||
key: 2,
|
||
buttons: e.computedButtons
|
||
}, null, 8, ["buttons"])),
|
||
e.slots["search-right"] ? (w(), j("div", Nh, [
|
||
(w(), I(H(e.ui.formItem.name), null, {
|
||
default: B(() => [
|
||
x(i, {
|
||
slots: e.slots["search-right"],
|
||
scope: e.searchEventContextRef
|
||
}, null, 8, ["slots", "scope"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : oe("", !0)
|
||
]),
|
||
_: 1
|
||
}, 512))
|
||
], 6),
|
||
e.computedIsMultiLine ? (w(), I(u, {
|
||
key: 0,
|
||
buttons: e.computedButtons
|
||
}, null, 8, ["buttons"])) : oe("", !0)
|
||
]),
|
||
e.computedIsMultiLine ? (w(), j("div", xh, [
|
||
(w(), I(H(e.ui.formItem.name), null, {
|
||
default: B(() => [
|
||
x(l, {
|
||
icon: e.collapse ? e.ui.icons.caretUp : e.ui.icons.caretDown,
|
||
onClick: e.toggleCollapse
|
||
}, null, 8, ["icon", "onClick"])
|
||
]),
|
||
_: 1
|
||
}))
|
||
])) : oe("", !0)
|
||
])
|
||
]),
|
||
_: 1
|
||
}, 16, ["model", "rules"]))
|
||
], 2)) : oe("", !0)
|
||
]),
|
||
_: 1
|
||
});
|
||
}
|
||
const qh = /* @__PURE__ */ Oe(Vh, [["render", Lh]]), Hh = le({
|
||
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 } = we(), { t: o } = lt(), r = K(), a = M(() => e.layout === "multi-line");
|
||
_n(() => {
|
||
a.value && r.value && (s.value = r.value.$el.offsetHeight);
|
||
});
|
||
const i = M(() => !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 ho({}, e.col, c);
|
||
}
|
||
return {
|
||
ui: n,
|
||
columnsRowRef: r,
|
||
computedColumnBoxHeight: i,
|
||
computedIsMultiLine: a,
|
||
toggleCollapse: u,
|
||
mergeCol: l,
|
||
t: o
|
||
};
|
||
}
|
||
});
|
||
const zh = { class: "fs-search-box" }, Wh = { class: "fs-search-col fs-search-slot" }, Uh = { class: "fs-search-col fs-search-slot" }, Kh = { class: "fs-search-col fs-search-slot" }, Yh = {
|
||
key: 0,
|
||
class: "fs-search-buttons-group fs-search-multi-line-buttons"
|
||
};
|
||
function Gh(e, t, n, o, r, a) {
|
||
var u;
|
||
const i = G("fs-render"), s = G("fs-button");
|
||
return w(), j("div", {
|
||
class: St(["fs-search-layout-default", { "fs-search-multi-line": e.computedIsMultiLine }])
|
||
}, [
|
||
te("div", zh, [
|
||
te("div", {
|
||
class: St(["fs-search-main", { "fs-search-collapse": e.collapse }]),
|
||
style: to({ maxHeight: e.computedColumnBoxHeight })
|
||
}, [
|
||
(w(), I(H(e.ui.row.name), {
|
||
ref: "columnsRowRef",
|
||
class: "fs-search-columns"
|
||
}, {
|
||
default: B(() => {
|
||
var l;
|
||
return [
|
||
te("span", Wh, [
|
||
re(e.$slots, "search-left")
|
||
]),
|
||
(w(!0), j(be, null, Te(e.columns, (c, d) => (w(), j(be, { key: d }, [
|
||
c.show ? (w(), I(H(e.ui.col.name), z({
|
||
key: 0,
|
||
class: "fs-search-col"
|
||
}, { ref_for: !0 }, e.mergeCol(c.col)), {
|
||
default: B(() => [
|
||
x(i, {
|
||
"render-func": c._cellRender,
|
||
scope: e.getContextFn()
|
||
}, null, 8, ["render-func", "scope"])
|
||
]),
|
||
_: 2
|
||
}, 1040)) : oe("", !0)
|
||
], 64))), 128)),
|
||
te("span", Uh, [
|
||
re(e.$slots, "search-middle")
|
||
]),
|
||
e.computedIsMultiLine ? oe("", !0) : (w(), I(H(e.ui.col.name), z({
|
||
key: 0,
|
||
class: "fs-search-col fs-search-buttons-group"
|
||
}, e.mergeCol((l = e.action) == null ? void 0 : l.col)), {
|
||
default: B(() => {
|
||
var c;
|
||
return [
|
||
(w(), I(H(e.ui.formItem.name), xe({
|
||
[e.ui.formItem.label || ""]: (c = e.action) == null ? void 0 : c.label
|
||
}), {
|
||
default: B(() => [
|
||
re(e.$slots, "search-buttons", xe(Lt(e.getContextFn())))
|
||
]),
|
||
_: 3
|
||
}, 16))
|
||
];
|
||
}),
|
||
_: 3
|
||
}, 16)),
|
||
te("span", Kh, [
|
||
re(e.$slots, "search-right", xe(Lt(e.getContextFn())))
|
||
])
|
||
];
|
||
}),
|
||
_: 3
|
||
}, 512))
|
||
], 6),
|
||
e.computedIsMultiLine ? (w(), j("div", Yh, [
|
||
re(e.$slots, "search-buttons"),
|
||
((u = e.collapseButton) == null ? void 0 : u.show) !== !1 ? (w(), I(s, z({
|
||
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"])) : oe("", !0)
|
||
])) : oe("", !0)
|
||
])
|
||
], 2);
|
||
}
|
||
const Xh = /* @__PURE__ */ Oe(Hh, [["render", Gh]]), Qh = { class: "fs-tabs-filter" }, Jh = le({
|
||
name: "FsTabsFilter",
|
||
inheritAttrs: !1
|
||
}), Zh = /* @__PURE__ */ le({
|
||
...Jh,
|
||
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 = Xo(), { merge: o } = $e(), r = e, a = M(() => o({
|
||
show: !0,
|
||
value: null,
|
||
label: "全部"
|
||
}, r.defaultOption || {})), i = "_default_key_", s = M(() => {
|
||
const h = r.modelValue == null || r.modelValue === a.value.value ? i : r.modelValue;
|
||
return {
|
||
type: "card",
|
||
...n,
|
||
[f.tabs.modelValue]: h,
|
||
["onUpdate:" + f.tabs.modelValue]: l
|
||
};
|
||
}), u = t;
|
||
function l(h) {
|
||
i === h && (h = a.value.value);
|
||
const v = r.modelValue;
|
||
u("update:modelValue", h), v !== h && u("change", h);
|
||
}
|
||
function c(h) {
|
||
return h[r.value];
|
||
}
|
||
function d(h) {
|
||
return h[r.label];
|
||
}
|
||
const { ui: f } = we();
|
||
return (h, v) => (w(), j("div", Qh, [
|
||
(w(), I(H(q(f).tabs.name), xe(Lt(s.value)), {
|
||
default: B(() => [
|
||
a.value.show ? (w(), I(H(q(f).tabPane.name), xe({
|
||
key: 0,
|
||
[q(f).tabPane.key || ""]: i,
|
||
[q(f).tabPane.tab || ""]: a.value.label
|
||
}), null, 16)) : oe("", !0),
|
||
(w(!0), j(be, null, Te(h.options, (p, y) => (w(), I(H(q(f).tabPane.name), xe({
|
||
key: y,
|
||
[q(f).tabPane.key || ""]: c(p),
|
||
[q(f).tabPane.tab || ""]: d(p)
|
||
}), null, 16))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16))
|
||
]));
|
||
}
|
||
});
|
||
const em = { class: "fs-icon-selector" }, tm = {
|
||
key: 0,
|
||
class: "fs-icon-selector-dialog"
|
||
}, nm = { class: "fs-icon-selector-dialog-content mb-4" }, om = { class: "icon-tabs-box mt-10 mb-10" }, rm = { class: "icon-container" }, am = { class: "icon-list" }, im = ["title", "onClick", "onDblclick"], sm = { class: "load-more" }, lm = { key: 1 }, um = { class: "footer" }, cm = le({
|
||
name: "FsIconSelector"
|
||
}), dm = /* @__PURE__ */ le({
|
||
...cm,
|
||
props: {
|
||
modelValue: {
|
||
type: String,
|
||
default: ""
|
||
},
|
||
dialog: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
tabs: {
|
||
type: Object,
|
||
default: () => ({})
|
||
},
|
||
// 限制每页显示数量
|
||
limit: {
|
||
type: Number,
|
||
default: 136
|
||
},
|
||
iconSets: {
|
||
type: Array,
|
||
default: () => ["carbon", "ion", "ant-design", "fa-solid", "fa-brands", "fa-regular", "mdi"]
|
||
},
|
||
apiProvider: {
|
||
type: String,
|
||
default: "https://api.iconify.design"
|
||
}
|
||
},
|
||
emits: ["update:modelValue"],
|
||
setup(e, { emit: t }) {
|
||
const n = t, o = 136, r = e, { ui: a } = we(), i = K(!1), s = M(() => ({
|
||
width: 1024,
|
||
style: {
|
||
width: "1024px"
|
||
},
|
||
...r.dialog,
|
||
[a.dialog.visible]: i.value,
|
||
[`onUpdate:${a.dialog.visible}`]: (A) => {
|
||
i.value = A;
|
||
}
|
||
})), u = a.formItem.injectFormItemContext(), l = M(() => ({
|
||
...f,
|
||
[a.input.modelValue]: r.modelValue,
|
||
[`onUpdate:${a.input.modelValue}`]: (A) => {
|
||
c(A);
|
||
}
|
||
})), c = (A) => {
|
||
n("update:modelValue", A), u == null || u.onChange();
|
||
}, d = () => {
|
||
i.value = !0, r.iconSets.length > 0 && $.value.records.length === 0 && R(r.iconSets[0]);
|
||
}, f = Xo(), h = {
|
||
async getCollections() {
|
||
return await (await fetch(`${r.apiProvider}/collections`)).json();
|
||
},
|
||
async getIcons(A) {
|
||
return await (await fetch(`${r.apiProvider}/collection?prefix=${A}`)).json();
|
||
},
|
||
async search(A, k) {
|
||
const N = k.start ?? 0, J = k.limit ?? 50;
|
||
return await (await fetch(`${r.apiProvider}/search?query=${A}&start=${N}&limit=${J}`)).json();
|
||
}
|
||
}, v = K({}), p = async (A) => {
|
||
let k = v.value[A];
|
||
if (!k) {
|
||
const N = await h.getIcons(A), J = N.uncategorized ?? [], ue = N.categories ?? [];
|
||
k = J;
|
||
for (const Z in ue)
|
||
k = k.concat(ue[Z]);
|
||
k = k.map((Z) => `${A}:${Z}`), v.value[A] = k;
|
||
}
|
||
return k;
|
||
}, y = K(""), b = K("all"), R = (A) => {
|
||
b.value = A, y.value = "", D(), T();
|
||
}, D = () => {
|
||
$.value.start = 0, $.value.records = [], $.value.total = 0, $.value.limit = r.limit ?? o;
|
||
}, $ = K({
|
||
loading: !1,
|
||
start: 0,
|
||
limit: r.limit ?? o,
|
||
total: null,
|
||
query: "",
|
||
records: []
|
||
}), T = async () => {
|
||
if (!$.value.loading) {
|
||
$.value.query !== y.value && D(), $.value.loading = !0;
|
||
try {
|
||
const A = await E();
|
||
$.value.records = $.value.records.concat(A.icons), $.value.total = A.total, $.value.limit = A.limit, $.value.query = y.value;
|
||
} finally {
|
||
$.value.loading = !1;
|
||
}
|
||
}
|
||
};
|
||
async function E() {
|
||
if (b.value === "all") {
|
||
if (!y.value) {
|
||
a.notification.warn("请输入搜索关键字");
|
||
return;
|
||
}
|
||
return await h.search(y.value, $.value);
|
||
} else
|
||
return await P(b.value);
|
||
}
|
||
async function P(A) {
|
||
const k = await p(A);
|
||
let N = k;
|
||
y.value && (N = k.filter((Z) => Z.includes(y.value)));
|
||
let J = $.value.start + $.value.limit;
|
||
return J > N.length && (J = N.length), {
|
||
icons: N.slice($.value.start, J),
|
||
total: N.length,
|
||
limit: $.value.limit,
|
||
start: $.value.start
|
||
};
|
||
}
|
||
const W = K(r.modelValue), F = (A, k = !1) => {
|
||
W.value = A, k && V();
|
||
}, V = () => {
|
||
i.value = !1, c(W.value);
|
||
}, ne = async () => {
|
||
$.value.start += $.value.limit, await T();
|
||
}, L = M(() => ({
|
||
...r.tabs,
|
||
[a.tabs.modelValue]: b.value,
|
||
[`onUpdate:${a.tabs.modelValue}`]: R
|
||
}));
|
||
return (A, k) => {
|
||
const N = G("fs-icon"), J = G("fs-button"), ue = G("fs-loading");
|
||
return w(), j("div", em, [
|
||
(w(), I(H(q(a).input.name), z(l.value, { onClick: d }), {
|
||
prefix: B(() => [
|
||
e.modelValue ? (w(), I(N, {
|
||
key: 0,
|
||
class: "fs-icon-selector-input-prefix",
|
||
icon: e.modelValue
|
||
}, null, 8, ["icon"])) : oe("", !0)
|
||
]),
|
||
_: 1
|
||
}, 16)),
|
||
i.value ? (w(), j("div", tm, [
|
||
(w(), I(H(q(a).dialog.name), z({ preset: "dialog" }, s.value, { footer: null }), {
|
||
[q(a).dialog.titleSlotName]: B(() => [
|
||
x(N, {
|
||
icon: "icon-select",
|
||
class: "mr-2"
|
||
}),
|
||
k[1] || (k[1] = Vt(" 选择图标 ", -1))
|
||
]),
|
||
default: B(() => [
|
||
te("div", nm, [
|
||
te("div", om, [
|
||
(w(), I(H(q(a).tabs.name), z(L.value, { type: "card" }), {
|
||
default: B(() => [
|
||
(w(), I(H(q(a).tabPane.name), xe({
|
||
key: "all",
|
||
[q(a).tabPane.key || ""]: "all",
|
||
[q(a).tabPane.tab || ""]: "全部"
|
||
}), null, 16)),
|
||
(w(!0), j(be, null, Te(e.iconSets, (Z) => (w(), I(H(q(a).tabPane.name), xe({
|
||
key: Z,
|
||
[q(a).tabPane.key || ""]: Z,
|
||
[q(a).tabPane.tab || ""]: Z
|
||
}), null, 16))), 128))
|
||
]),
|
||
_: 1
|
||
}, 16)),
|
||
(w(), I(H(q(a).input.name), xe({
|
||
[q(a).input.modelValue]: y.value,
|
||
["onUpdate:" + q(a).input.modelValue]: k[0] || (k[0] = (Z) => y.value = Z),
|
||
class: "ml-2",
|
||
placeholder: "搜索图标, 双击选择",
|
||
onKeydown: ls(T, ["enter"])
|
||
}), {
|
||
suffix: B(() => [
|
||
x(J, {
|
||
type: "primary",
|
||
size: "small",
|
||
icon: q(a).icons.search,
|
||
onClick: T
|
||
}, null, 8, ["icon"])
|
||
]),
|
||
_: 1
|
||
}, 16)),
|
||
te("div", rm, [
|
||
te("div", am, [
|
||
(w(!0), j(be, null, Te($.value.records, (Z) => (w(), j("div", {
|
||
key: Z,
|
||
class: St(["icon-item", { active: Z === W.value }]),
|
||
title: Z,
|
||
onClick: (Se) => F(Z, !1),
|
||
onDblclick: (Se) => F(Z, !0)
|
||
}, [
|
||
x(N, {
|
||
icon: Z,
|
||
class: "text-2xl"
|
||
}, null, 8, ["icon"])
|
||
], 42, im))), 128))
|
||
]),
|
||
te("div", sm, [
|
||
$.value.loading ? (w(), I(ue, {
|
||
key: 0,
|
||
loading: $.value.loading,
|
||
text: "加载中"
|
||
}, null, 8, ["loading"])) : $.value.total == null || $.value.total == 0 ? (w(), j("div", lm, k[2] || (k[2] = [
|
||
te("div", null, "暂无数据", -1)
|
||
]))) : $.value.total > $.value.start + $.value.limit ? (w(), j("div", {
|
||
key: 2,
|
||
onClick: ne
|
||
}, k[3] || (k[3] = [
|
||
te("div", null, "加载更多", -1)
|
||
]))) : oe("", !0)
|
||
])
|
||
]),
|
||
te("div", um, [
|
||
x(J, {
|
||
type: "primary",
|
||
onClick: V
|
||
}, {
|
||
default: B(() => k[4] || (k[4] = [
|
||
Vt("确定", -1)
|
||
])),
|
||
_: 1,
|
||
__: [4]
|
||
})
|
||
])
|
||
])
|
||
])
|
||
]),
|
||
_: 2
|
||
}, 1040))
|
||
])) : oe("", !0)
|
||
]);
|
||
};
|
||
}
|
||
});
|
||
const fm = le({
|
||
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 } = we();
|
||
e.radioName && console.warn("参数radioName即将废弃,请改成optionName");
|
||
const o = M(() => e.optionName ?? e.radioName ?? n.radio.name);
|
||
let r = un(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 hm(e, t, n, o, r, a) {
|
||
return w(), I(H(e.ui.radioGroup.name), { onChange: e.onSelectedChange }, {
|
||
default: B(() => [
|
||
(w(!0), j(be, null, Te(e.computedOptions, (i) => (w(), I(H(e.computedRadioName), z({
|
||
ref_for: !0,
|
||
ref: "radioRef",
|
||
key: e.getValue(i),
|
||
[e.ui.radio.value || ""]: e.getValue(i)
|
||
}, { ref_for: !0 }, e.optionProps), {
|
||
default: B(() => [
|
||
Vt(We(e.getLabel(i)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040))), 128))
|
||
]),
|
||
_: 1
|
||
}, 40, ["onChange"]);
|
||
}
|
||
const mm = /* @__PURE__ */ Oe(fm, [["render", hm]]), pm = le({
|
||
name: "FsDictSelect"
|
||
}), gm = /* @__PURE__ */ le({
|
||
...pm,
|
||
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
|
||
} = lt(), s = M(() => o.placeholder || i("fs.component.select.placeholder")), {
|
||
ui: u
|
||
} = we(), l = Xo(), d = un(o, {
|
||
emit: r,
|
||
attrs: l
|
||
}, u.select.modelValue), f = d.createComputedOptions(), h = (y) => {
|
||
r("change", y);
|
||
const b = d.getDict();
|
||
if (y && Array.isArray(y) && y.length > 0) {
|
||
const R = [];
|
||
for (const D of y)
|
||
b && b.dataMap && b.dataMap[D] && R.push(b.dataMap[D]);
|
||
r("selected-change", R);
|
||
return;
|
||
}
|
||
if (b && b.dataMap && b.dataMap[y]) {
|
||
const R = b.dataMap[y];
|
||
r("selected-change", R);
|
||
} else
|
||
r("selected-change", null);
|
||
}, v = qr();
|
||
t({
|
||
selectRef: a,
|
||
computedPlaceholder: s,
|
||
...d,
|
||
computedOptions: f,
|
||
onSelectedChange: h
|
||
});
|
||
const p = () => {
|
||
const {
|
||
ui: y
|
||
} = we(), b = H(y.select.name), R = y.select.modelValue;
|
||
if (y.option.name == null) {
|
||
const P = f.value || [], W = {
|
||
[`onUpdate:${R}`]: (V) => {
|
||
this.$emit(`onUpdate:${R}`, V), h(V);
|
||
},
|
||
...l
|
||
}, F = {
|
||
...v,
|
||
...o.slots
|
||
};
|
||
return x(b, z({
|
||
ref: "selectRef",
|
||
placeholder: s.value,
|
||
options: P,
|
||
renderLabel: o.renderLabel
|
||
}, W), F);
|
||
}
|
||
const D = [], $ = H(y.option.name), T = f.value || [];
|
||
for (const P of T) {
|
||
const W = x($, z(P, {
|
||
value: d.getValue(P),
|
||
label: d.getLabel(P)
|
||
}), {
|
||
default: () => [o.renderLabel ? o.renderLabel(P) : d.getLabel(P)]
|
||
});
|
||
D.push(W);
|
||
}
|
||
const E = {
|
||
default: () => D,
|
||
...v,
|
||
...o.slots
|
||
};
|
||
return x(b, z({
|
||
ref: "selectRef",
|
||
placeholder: s.value,
|
||
onChange: h
|
||
}, l), E);
|
||
};
|
||
return (y, b) => (w(), I(p));
|
||
}
|
||
});
|
||
function vm(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 bm(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 ym = le({
|
||
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 } = we(), o = n.tag.colors, r = ["plain", "light"], a = un(e, t), { getColor: i, getValue: s, removePropValue: u } = a;
|
||
a.watchValue();
|
||
function l(h, v) {
|
||
!v.effect && h.effect && (v.effect = h.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 (h.color === "auto") {
|
||
const b = vm(s(v));
|
||
s(v);
|
||
const R = h.autoColors ? h.autoColors : o;
|
||
v[p] = R[b % R.length];
|
||
const D = h.autoEffects ? h.autoEffects : r;
|
||
v.effect = D[Math.floor(b / R.length) % D.length];
|
||
} else
|
||
v[p] = h.color;
|
||
}
|
||
const c = M(() => {
|
||
var D, $;
|
||
if (e.valueType === "object")
|
||
return e.modelValue && !Array.isArray(e.modelValue) ? [e.modelValue] : e.modelValue;
|
||
const h = a.getDict();
|
||
if (e.modelValue == null || e.modelValue === "")
|
||
return [];
|
||
const v = bm(e);
|
||
let p = [];
|
||
const y = ((D = e.dict) == null ? void 0 : D.value) || "value", b = (($ = e.dict) == null ? void 0 : $.label) || "label";
|
||
h ? (p = h.getNodesFromDataMap(v), Y(p, (T) => {
|
||
T[b] == null && (T[b] = e.defaultLabel || T[y]);
|
||
})) : (p = [], Y(v, (T) => {
|
||
T instanceof Object ? p.push(T) : p.push({
|
||
[y]: T,
|
||
[b]: T
|
||
});
|
||
}));
|
||
const R = [];
|
||
return Y(p, (T) => {
|
||
R.push(wn(T, "children"));
|
||
}), Y(R, (T) => {
|
||
l(e, T);
|
||
}), R;
|
||
});
|
||
function d(h) {
|
||
t.emit("click", { item: h });
|
||
}
|
||
function f(h, v) {
|
||
t.emit("close", { item: v, index: h });
|
||
const p = [];
|
||
for (let y = 0; y < c.value.length; y++)
|
||
y !== h && p.push(s(c.value[y]));
|
||
t.emit("update:modelValue", p);
|
||
}
|
||
return {
|
||
ui: n,
|
||
...a,
|
||
doClick: d,
|
||
computedValueItems: c,
|
||
doClose: f
|
||
};
|
||
}
|
||
});
|
||
const wm = { class: "fs-values-format" }, _m = ["onClick"];
|
||
function Cm(e, t, n, o, r, a) {
|
||
const i = G("fs-render"), s = G("fs-icon");
|
||
return w(), j("span", wm, [
|
||
e.itemRender ? (w(!0), j(be, { key: 0 }, Te(e.computedValueItems, (u) => (w(), I(i, {
|
||
key: e.getValue(u),
|
||
"render-func": e.itemRender,
|
||
scope: u
|
||
}, null, 8, ["render-func", "scope"]))), 128)) : e.type === "text" ? (w(!0), j(be, { key: 1 }, Te(e.computedValueItems, (u) => (w(), j("span", {
|
||
key: e.getValue(u),
|
||
onClick: (l) => e.doClick(u)
|
||
}, We(e.getLabel(u)), 9, _m))), 128)) : (w(!0), j(be, { key: 2 }, Te(e.computedValueItems, (u, l) => (w(), I(H(e.ui.tag.name), z({
|
||
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: B(() => [
|
||
u.icon ? (w(), I(s, {
|
||
key: 0,
|
||
icon: u.icon,
|
||
spin: u.iconSpin,
|
||
class: "fs-tag-icon"
|
||
}, null, 8, ["icon", "spin"])) : oe("", !0),
|
||
Vt(" " + We(e.getLabel(u)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040, ["closable", "onClose", "onClick"]))), 128))
|
||
]);
|
||
}
|
||
const Sm = /* @__PURE__ */ Oe(ym, [["render", Cm]]), Fm = le({
|
||
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 = un(e, t);
|
||
(r = e.dict) != null && r.getNodesByValues && n.watchValue();
|
||
const o = M(() => 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);
|
||
}
|
||
}
|
||
}), Rm = { key: 0 }, Dm = { key: 0 };
|
||
function km(e, t, n, o, r, a) {
|
||
return w(), j("span", null, [
|
||
e.computedMultiple ? (w(!0), j(be, { key: 0 }, Te(e.multipleLabels, (i, s) => (w(), j("div", { key: s }, [
|
||
(w(!0), j(be, null, Te(i, (u, l) => (w(), j("span", { key: l }, [
|
||
l !== 0 ? (w(), j("span", Rm, " / ")) : oe("", !0),
|
||
te("span", null, We(e.getLabel(u)), 1)
|
||
]))), 128))
|
||
]))), 128)) : (w(!0), j(be, { key: 1 }, Te(e.labels, (i, s) => (w(), j("span", { key: s }, [
|
||
s !== 0 ? (w(), j("span", Dm, " / ")) : oe("", !0),
|
||
te("span", null, We(e.getLabel(i)), 1)
|
||
]))), 128))
|
||
]);
|
||
}
|
||
const $m = /* @__PURE__ */ Oe(Fm, [["render", km]]), Om = le({
|
||
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 = un(e, t), { ui: r } = we(), 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 f = c.dataMap[d];
|
||
f && l.push(f);
|
||
}
|
||
t.emit("selected-change", l);
|
||
}
|
||
} else
|
||
t.emit("selected-change", null);
|
||
}
|
||
return {
|
||
ui: r,
|
||
cascaderRef: n,
|
||
...o,
|
||
fieldNamesBinder: a,
|
||
computedOptions: i,
|
||
onSelectChange: s
|
||
};
|
||
}
|
||
});
|
||
function Em(e, t, n, o, r, a) {
|
||
return w(), I(H(e.ui.cascader.name), z({
|
||
ref: "cascaderRef",
|
||
options: e.computedOptions
|
||
}, e.fieldNamesBinder, { onChange: e.onSelectChange }), null, 16, ["options", "onChange"]);
|
||
}
|
||
const Tm = /* @__PURE__ */ Oe(Om, [["render", Em]]), Im = le({
|
||
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 } = we();
|
||
let o = un(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 Am(e, t, n, o, r, a) {
|
||
return w(), I(H(e.ui.checkboxGroup.name), { onChange: e.onSelectedChange }, {
|
||
default: B(() => [
|
||
(w(!0), j(be, null, Te(e.computedOptions, (i) => (w(), I(H(e.optionName || e.ui.checkbox.name), z({
|
||
ref_for: !0,
|
||
ref: "checkboxRef",
|
||
key: e.getValue(i),
|
||
[e.ui.checkbox.value || ""]: e.getValue(i)
|
||
}, { ref_for: !0 }, e.optionProps), {
|
||
default: B(() => [
|
||
Vt(We(e.getLabel(i)), 1)
|
||
]),
|
||
_: 2
|
||
}, 1040))), 128))
|
||
]),
|
||
_: 1
|
||
}, 40, ["onChange"]);
|
||
}
|
||
const Vm = /* @__PURE__ */ Oe(Im, [["render", Am]]), Pm = le({
|
||
name: "FsDictSwitch",
|
||
props: {
|
||
/**
|
||
* 字典第一个为开启
|
||
* 第二个为关闭
|
||
*/
|
||
dict: {
|
||
type: Object
|
||
},
|
||
options: {},
|
||
/**
|
||
* 转换DictData
|
||
*/
|
||
transformDictData: {
|
||
type: Function,
|
||
default: void 0
|
||
}
|
||
},
|
||
emits: ["dict-change"],
|
||
setup(e, t) {
|
||
const { ui: n } = we();
|
||
let o = un(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 = qe.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 Mm(e, t, n, o, r, a) {
|
||
return w(), I(H(e.ui.switch.name), z({ ref: "switchRef" }, e.binding), null, 16);
|
||
}
|
||
const Bm = /* @__PURE__ */ Oe(Pm, [["render", Mm]]), jm = le({
|
||
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 = et(this.modelValue, this.valueFormat) : e = et(this.modelValue), e.format(this.format);
|
||
}
|
||
},
|
||
created() {
|
||
},
|
||
methods: {}
|
||
});
|
||
function Nm(e, t, n, o, r, a) {
|
||
return w(), j("span", null, We(e.doFormat), 1);
|
||
}
|
||
const xm = /* @__PURE__ */ Oe(jm, [["render", Nm]]), Lm = le({
|
||
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 } = lt(), { ui: o } = we(), r = M(() => e.placeholder || n("fs.component.select.placeholder"));
|
||
let a = un(e, t);
|
||
const i = t.slots, s = a.createComputedOptions(), u = M(() => {
|
||
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 f = a.getDict();
|
||
if (f && f.dataMap)
|
||
if (d instanceof Array) {
|
||
let h = [];
|
||
for (let v of d) {
|
||
const p = f.dataMap[v];
|
||
p && h.push(p);
|
||
}
|
||
t.emit("selected-change", h);
|
||
} else
|
||
t.emit("selected-change", f.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 = G("fs-slot-render");
|
||
return w(), I(H(e.ui.treeSelect.name), z({
|
||
ref: "treeRef",
|
||
[e.ui.treeSelect.options || ""]: e.computedOptions,
|
||
placeholder: e.computedPlaceholder
|
||
}, e.computedBinding, { onChange: e.onSelectedChange }), Lr({ _: 2 }, [
|
||
Te(e.slots, (s, u) => ({
|
||
name: u,
|
||
fn: B((l) => [
|
||
x(i, {
|
||
slots: s,
|
||
scope: l
|
||
}, null, 8, ["slots", "scope"])
|
||
])
|
||
}))
|
||
]), 1040, ["placeholder", "onChange"]);
|
||
}
|
||
const Hm = /* @__PURE__ */ Oe(Lm, [["render", qm]]), zm = {
|
||
class: "fs-table-select"
|
||
}, Wm = {
|
||
key: 0,
|
||
class: "fs-table-select-current"
|
||
}, Um = /* @__PURE__ */ le({
|
||
__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"
|
||
],
|
||
setup(e, {
|
||
expose: t,
|
||
emit: n
|
||
}) {
|
||
const o = e, r = qr(), a = n, {
|
||
ui: i
|
||
} = we(), {
|
||
t: s
|
||
} = lt(), u = K(), l = K(), c = K(!1);
|
||
function d() {
|
||
c.value = !1;
|
||
}
|
||
function f() {
|
||
c.value = !0;
|
||
}
|
||
const {
|
||
crudRef: h,
|
||
crudBinding: v,
|
||
crudExpose: p
|
||
} = gu();
|
||
function y(k) {
|
||
k == null || Array.isArray(k) && k.length == 0 ? E.value = [] : (o.multiple ? E.value = k || [] : E.value = [k], o.valueType === "object" && (E.value = E.value.map((N) => o.dict.getValue(N))));
|
||
}
|
||
const b = K(), R = M(() => ({
|
||
wrapper: {}
|
||
})), D = async (k = {}) => {
|
||
var ue, Z;
|
||
if (o.disabled || o.readonly || (ue = o.select) != null && ue.disabled || (Z = o.select) != null && Z.readonly)
|
||
return;
|
||
if (o.dict == null)
|
||
throw new Error("必须配置dict,且必须配置dict.getNodesByValues");
|
||
const N = await pu({
|
||
crudBinding: v,
|
||
crudRef: h,
|
||
createCrudOptions: o.createCrudOptions,
|
||
crudOptionsOverride: F(),
|
||
context: {
|
||
t: s,
|
||
ui: i,
|
||
...k == null ? void 0 : k.context
|
||
},
|
||
crudExpose: p
|
||
});
|
||
y(o.modelValue), o.beforeOpen && await o.beforeOpen({
|
||
crudOptions: k == null ? void 0 : k.crudOptions,
|
||
...L()
|
||
}), k && N.appendCrudOptions(k == null ? void 0 : k.crudOptions);
|
||
const J = V({
|
||
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 ne();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}, {
|
||
wrapper: o.dialog
|
||
});
|
||
return b.value.open(J), await Be(), await p.doRefresh(), N;
|
||
}, $ = M(() => ({
|
||
...o.valuesFormat
|
||
})), T = M(() => {
|
||
const k = `onUpdate:${i.select.modelValue}`;
|
||
let N = o.modelValue;
|
||
return o.valueType === "object" && o.modelValue && (o.multiple ? N = o.modelValue.map((J) => o.dict.getValue(J)) : N = o.dict.getValue(o.modelValue)), {
|
||
[i.select.modelValue]: N,
|
||
[k]: (J) => {
|
||
a("update:modelValue", J);
|
||
},
|
||
[i.select.clearable]: !0,
|
||
...i.select.buildMultiBinding(o.multiple),
|
||
show: !1,
|
||
...o.select
|
||
};
|
||
});
|
||
it(() => o.modelValue, async (k) => {
|
||
k !== E.value && (y(k), await Be(), await o.dict.appendByValues(E.value));
|
||
});
|
||
const E = K([]);
|
||
function P() {
|
||
return o.rowKey || v.value.table.rowKey || "id";
|
||
}
|
||
const W = K(!1);
|
||
function F() {
|
||
var ue, Z;
|
||
let k = i.table;
|
||
((Z = (ue = v.value) == null ? void 0 : ue.table) == null ? void 0 : Z.tableVersion) === "v2" && (k = i.tableV2);
|
||
let N = k.buildSelectionCrudOptions({
|
||
crossPage: o.crossPage,
|
||
selectOnClickRow: !0,
|
||
getRowKey: P,
|
||
getPageData() {
|
||
return v.value.data;
|
||
},
|
||
useCompute: Pt,
|
||
multiple: o.multiple,
|
||
selectedRowKeys: E,
|
||
onSelectedKeysChanged: async (Se) => {
|
||
E.value = [...Se], await Be(), await o.dict.appendByValues(E.value);
|
||
}
|
||
});
|
||
return V({
|
||
table: {
|
||
async onRefreshed() {
|
||
if (k.setSelectedRows) {
|
||
W.value = !0, await Be(), await Be();
|
||
const Se = p.getBaseTableRef();
|
||
k.setSelectedRows({
|
||
getRowKey: P,
|
||
multiple: o.multiple,
|
||
tableRef: Se,
|
||
selectedRowKeys: E
|
||
}), W.value = !1;
|
||
}
|
||
}
|
||
}
|
||
}, N, o.crudOptionsOverride);
|
||
}
|
||
const {
|
||
merge: V
|
||
} = $e();
|
||
async function ne() {
|
||
var ue;
|
||
if (o.dict.loading)
|
||
return;
|
||
let k = null, N = null;
|
||
((ue = E.value) == null ? void 0 : ue.length) > 0 && (k = [...E.value], N = k.map((Z) => o.dict.getDictMap()[Z]), o.valueType === "object" && (k = N), o.multiple !== !0 && k.length > 0 && (k = k[0])), (!o.viewMode || o.emitOnViewModel) && (a("update:modelValue", k), a("change", k), a("selected-change", N));
|
||
let J = {
|
||
value: k,
|
||
rows: N,
|
||
selectedRowKeys: E.value
|
||
};
|
||
a("dialog-close", J), await Be(), await b.value.close(), c.value, a("dialog-closed", J);
|
||
}
|
||
const L = () => ({
|
||
opened: c,
|
||
open: D,
|
||
selectedRowKeys: E,
|
||
dictSelectRef: u,
|
||
valuesFormatRef: l,
|
||
crudRef: h,
|
||
crudBinding: v,
|
||
crudExpose: p
|
||
}), A = K(L());
|
||
return t(A.value), (k, N) => {
|
||
const J = G("fs-dict-select"), ue = G("fs-values-format"), Z = G("fs-crud"), Se = G("fs-form-wrapper");
|
||
return w(), j("div", zm, [!(r != null && r.default) && !k.viewMode ? (w(), I(J, z({
|
||
key: 0,
|
||
ref_key: "dictSelectRef",
|
||
ref: u
|
||
}, T.value, {
|
||
open: !1,
|
||
disabled: k.disabled,
|
||
readonly: k.readonly,
|
||
dict: k.dict,
|
||
onClick: D
|
||
}), null, 16, ["disabled", "readonly", "dict"])) : oe("", !0), re(k.$slots, "default", xe(Lt(A.value))), (w(), I(H(q(i).formItem.skipValidationWrapper), null, {
|
||
default: B(() => [x(Se, z({
|
||
ref_key: "formWrapperRef",
|
||
ref: b
|
||
}, R.value, {
|
||
onClosed: d,
|
||
onOpen: f
|
||
}), {
|
||
"form-body-top": B(() => [c.value || k.destroyOnClose === !1 ? (w(), j("div", {
|
||
key: 0,
|
||
style: to({
|
||
width: "100%",
|
||
height: k.height || "70vh"
|
||
})
|
||
}, [x(Z, z({
|
||
ref_key: "crudRef",
|
||
ref: h
|
||
}, q(v)), {
|
||
"header-top": B(() => [k.showCurrent !== !1 && !k.viewMode ? (w(), j("div", Wm, [N[1] || (N[1] = Vt(" 当前选中: ", -1)), x(ue, z({
|
||
ref_key: "valuesFormatRef",
|
||
ref: l,
|
||
modelValue: E.value,
|
||
"onUpdate:modelValue": N[0] || (N[0] = (ke) => E.value = ke),
|
||
dict: k.dict,
|
||
closable: !0
|
||
}, $.value), null, 16, ["modelValue", "dict"])])) : oe("", !0)]),
|
||
_: 1
|
||
}, 16)], 4)) : oe("", !0)]),
|
||
_: 1
|
||
}, 16)]),
|
||
_: 1
|
||
}))]);
|
||
};
|
||
}
|
||
});
|
||
const Km = { class: "fs-editable-select" }, Ym = { class: "select" }, Gm = le({
|
||
/**
|
||
* 可编辑选择器
|
||
*/
|
||
name: "FsEditableSelect"
|
||
}), Xm = /* @__PURE__ */ le({
|
||
...Gm,
|
||
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 = G("fs-dict-select"), l = G("fs-button"), c = G("fs-table-select");
|
||
return w(), j("div", Km, [
|
||
te("div", Ym, [
|
||
x(u, z({
|
||
value: i.modelValue,
|
||
dict: i.dict
|
||
}, i.dictSelect, { "onUpdate:value": a }), null, 16, ["value", "dict"])
|
||
]),
|
||
x(c, z({
|
||
class: "table-select",
|
||
"model-value": i.modelValue,
|
||
dict: i.dict,
|
||
"destroy-on-close": !1,
|
||
height: "400px"
|
||
}, i.tableSelect, {
|
||
"onUpdate:modelValue": a,
|
||
onDialogClosed: r
|
||
}), {
|
||
default: B((d) => [
|
||
x(l, z({
|
||
type: "primary",
|
||
icon: "ant-design:edit-outlined"
|
||
}, i.button, {
|
||
onClick: d.open
|
||
}), null, 16, ["onClick"])
|
||
]),
|
||
_: 1
|
||
}, 16, ["model-value", "dict"])
|
||
]);
|
||
};
|
||
}
|
||
});
|
||
const Ma = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
||
__proto__: null,
|
||
FsActionbar: uf,
|
||
FsBox: bc,
|
||
FsButton: Qu,
|
||
FsCell: Gd,
|
||
FsColumnsFilterLayoutDefault: Rh,
|
||
FsComponentRender: _c,
|
||
FsContainer: Au,
|
||
FsCrud: id,
|
||
FsDateFormat: xm,
|
||
FsDictCascader: Tm,
|
||
FsDictCascaderFormat: $m,
|
||
FsDictCheckbox: Vm,
|
||
FsDictRadio: mm,
|
||
FsDictSelect: gm,
|
||
FsDictSwitch: Bm,
|
||
FsDictTree: Hm,
|
||
FsEditable: rf,
|
||
FsEditableCell: Xd,
|
||
FsEditableSelect: Xm,
|
||
FsForm: Rc,
|
||
FsFormHelper: qc,
|
||
FsFormItem: Pc,
|
||
FsFormItemCol: Mc,
|
||
FsFormProvider: Wc,
|
||
FsFormWrapper: ro,
|
||
FsIcon: Ju,
|
||
FsIconSelector: dm,
|
||
FsIconSvg: ic,
|
||
FsIconify: tc,
|
||
FsLabel: cc,
|
||
FsLayoutCard: Gu,
|
||
FsLayoutDefault: Lu,
|
||
FsLoading: mc,
|
||
FsPage: xl,
|
||
FsRender: gi,
|
||
FsRowHandle: dd,
|
||
FsSearch: Ah,
|
||
FsSearchLayoutDefault: Xh,
|
||
FsSearchV1: qh,
|
||
FsSlotRender: Cc,
|
||
FsTable: Yd,
|
||
FsTableColumnsFixedController: xi,
|
||
FsTableSelect: Um,
|
||
FsTabsFilter: Zh,
|
||
FsToolbar: mf,
|
||
FsValuesFormat: Sm,
|
||
fsColumnsFilterNestList: Li
|
||
}, Symbol.toStringTag, { value: "Module" })), { setDictRequest: Qm } = _u(), pp = {
|
||
install(e, t = {}) {
|
||
t.ui && qe.set(t.ui);
|
||
const { merge: n } = $e();
|
||
t.commonOptions && (no.commonOptions = t.commonOptions), t.dictRequest && Qm(t.dictRequest), t.i18n && Do.setVueI18n(t.i18n);
|
||
const o = t.customComponents || {};
|
||
for (const r in Ma) {
|
||
const a = o[r] || Ma[r];
|
||
e.component(r, a);
|
||
}
|
||
ro._context = e._context, $n.install(), e.config.globalProperties.$fsui = qe.get(), n(Du.logger, t.logger), Jm(t.logger);
|
||
}
|
||
};
|
||
function Jm(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 {
|
||
id as $,
|
||
Yr as A,
|
||
li as B,
|
||
Zo as C,
|
||
pi as D,
|
||
hu as E,
|
||
pp as F,
|
||
Du as G,
|
||
xl as H,
|
||
Au as I,
|
||
Lu as J,
|
||
Gu as K,
|
||
_c as L,
|
||
Cc as M,
|
||
gi as N,
|
||
Qu as O,
|
||
Ju as P,
|
||
tc as Q,
|
||
ic as R,
|
||
dm as S,
|
||
cc as T,
|
||
Rc as U,
|
||
Pc as V,
|
||
Mc as W,
|
||
qc as X,
|
||
ro as Y,
|
||
Wc as Z,
|
||
mc as _,
|
||
lt as a,
|
||
Yd as a0,
|
||
Gd as a1,
|
||
Xd as a2,
|
||
rf as a3,
|
||
dd as a4,
|
||
Ah as a5,
|
||
qh as a6,
|
||
Xh as a7,
|
||
Zh as a8,
|
||
uf as a9,
|
||
mf as aa,
|
||
Rh as ab,
|
||
Li as ac,
|
||
xi as ad,
|
||
mm as ae,
|
||
gm as af,
|
||
Sm as ag,
|
||
$m as ah,
|
||
Tm as ai,
|
||
Vm as aj,
|
||
Bm as ak,
|
||
xm as al,
|
||
bc as am,
|
||
Hm as an,
|
||
Um as ao,
|
||
Xm as ap,
|
||
mp as aq,
|
||
ea as ar,
|
||
uu as as,
|
||
cu as at,
|
||
fu as au,
|
||
up as av,
|
||
mu as b,
|
||
Qo as c,
|
||
cp as d,
|
||
pu as e,
|
||
gu as f,
|
||
Jo as g,
|
||
Gl as h,
|
||
Xl as i,
|
||
Pt as j,
|
||
un as k,
|
||
wu as l,
|
||
_u as m,
|
||
hp as n,
|
||
ii as o,
|
||
$e as p,
|
||
Qr as q,
|
||
ti as r,
|
||
ks as s,
|
||
_r as t,
|
||
_t as u,
|
||
xo as v,
|
||
Zr as w,
|
||
Ru as x,
|
||
iu as y,
|
||
si as z
|
||
};
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtODYxNGY0ODQubWpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXNlL2RlZmF1bHQtY3J1ZC1vcHRpb25zLnRzIiwiLi4vLi4vc3JjL3V0aWxzL3V0aWwubG9nLnRzIiwiLi4vLi4vc3JjL3V0aWxzL3V0aWwuc3RyaW5nLnRzIiwiLi4vLi4vc3JjL3V0aWxzL3V0aWwudHJhY2UudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC52aXRlLnRzIiwiLi4vLi4vc3JjL3V0aWxzL3V0aWwuc3RvcmUudHMiLCIuLi8uLi9zcmMvdXRpbHMvZGVlcGRhc2gvcHJpdmF0ZS9nZXRQYXRoVG9TdHJpbmcudHMiLCIuLi8uLi9zcmMvdXRpbHMvZGVlcGRhc2gvcHJpdmF0ZS9nZXRJdGVyYXRlLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2RlZXBkYXNoL2dldC1lYWNoLWRlZXAudHMiLCIuLi8uLi9zcmMvdXRpbHMvZGVlcGRhc2gvaW5kZXgudHMiLCIuLi8uLi9zcmMvdXRpbHMvdXRpbC5kYXNoLnRzIiwiLi4vLi4vc3JjL3V0aWxzL2luZGV4LnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvYXNzaXN0LnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvYnV0dG9uLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvY2FzY2FkZXIudHMiLCIuLi8uLi9zcmMvbG9jYWxlL2xhbmcvemgtY24udHMiLCIuLi8uLi9zcmMvbG9jYWxlL2xhbmcvZW4udHMiLCIuLi8uLi9zcmMvbG9jYWxlL2luZGV4LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2RheWpzQDEuMTEuMTMvbm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9hZHZhbmNlZEZvcm1hdC5qcyIsIi4uLy4uL3NyYy90eXBlcy9mdW5jdGlvbnMudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3dlZWtPZlllYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3dlZWtkYXkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xMy9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL2xvY2FsZURhdGEuanMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9kYXRlLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvZWwudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9pY29uLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvbnVtYmVyLnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvcGhvbmUudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC9zZWxlY3QudHMiLCIuLi8uLi9zcmMvdHlwZXMvbGlzdC90ZXh0LnRzIiwiLi4vLi4vc3JjL3R5cGVzL2xpc3QvdHJlZS50cyIsIi4uLy4uL3NyYy90eXBlcy9pbmRleC50cyIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1wYWdlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1wYWdlLnZ1ZSIsIi4uLy4uL3NyYy91c2UvdXNlLW1lcmdlLnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtY29tcHV0ZS50cyIsIi4uLy4uL3NyYy91dGlscy91dGlsLmNvbnN0YW50cy50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWNvbHVtbnMudHN4IiwiLi4vLi4vc3JjL3VzZS91c2UtZm9ybS50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWV4cG9zZS50cyIsIi4uLy4uL3NyYy9saWIvZnMtZXhwb3J0L2luZGV4LnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtcGx1Z2lucy50cyIsIi4uLy4uL3NyYy91c2UvdXNlLWNydWQudHMiLCIuLi8uLi9zcmMvdXNlL3VzZS1kaWN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2xydS1jYWNoZUAxMC40LjMvbm9kZV9tb2R1bGVzL2xydS1jYWNoZS9kaXN0L2VzbS9pbmRleC5qcyIsIi4uLy4uL3NyYy91c2UvdXNlLWRpY3QtZGVmaW5lLnRzIiwiLi4vLi4vc3JjL3VzZS91c2UtdHlwZXMudHMiLCIuLi8uLi9zcmMvdXNlL3VzZS1kcmFnLnRzIiwiLi4vLi4vc3JjL3VzZS9jb25maWcudHMiLCIuLi9zcmMvY29tcG9uZW50cy9jb250YWluZXIvZnMtY29udGFpbmVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1jb250YWluZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY29udGFpbmVyL2ZzLWxheW91dC1kZWZhdWx0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NvbnRhaW5lci9mcy1sYXlvdXQtZGVmYXVsdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jb250YWluZXIvZnMtbGF5b3V0LWNhcmQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY29udGFpbmVyL2ZzLWxheW91dC1jYXJkLnZ1ZSIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWJ1dHRvbi50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWljb25pZnkudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvYmFzaWMvZnMtaWNvbmlmeS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLXN2Zy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1pY29uLXN2Zy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sYWJlbC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sYWJlbC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1sb2FkaW5nLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2Jhc2ljL2ZzLWJveC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9iYXNpYy9mcy1ib3gudnVlIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvcmVuZGVyL2ZzLWNvbXBvbmVudC1yZW5kZXIudHN4IiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvcmVuZGVyL2ZzLXNsb3QtcmVuZGVyLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL3JlbmRlci9mcy1yZW5kZXIudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1mb3JtLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taXRlbS1jb2wudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1mb3JtLWhlbHBlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLWZvcm0taGVscGVyLnZ1ZSIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS13cmFwcGVyLnRzeCIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtZm9ybS1wcm92aWRlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9mcy1jcnVkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2ZzLWNydWQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9mcy1yb3ctaGFuZGxlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtcm93LWhhbmRsZS52dWUiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vYXN5bmMtdmFsaWRhdG9yQDQuMi41L25vZGVfbW9kdWxlcy9hc3luYy12YWxpZGF0b3IvZGlzdC13ZWIvaW5kZXguanMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9jcnVkL2VkaXRhYmxlL3ZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvZWRpdGFibGUvdXNlLWVkaXRhYmxlLnRzIiwiLi4vLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC91c2UvcHJvdmlkZXIudHMiLCIuLi8uLi9zcmMvY29tcG9uZW50cy9jcnVkL2ZzLXRhYmxlLnRzeCIsIi4uLy4uL3NyYy9jb21wb25lbnRzL2NydWQvZnMtY2VsbC50c3giLCIuLi8uLi9zcmMvY29tcG9uZW50cy9jcnVkL2VkaXRhYmxlL2ZzLWVkaXRhYmxlLWNlbGwudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvY3J1ZC9lZGl0YWJsZS9mcy1lZGl0YWJsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9hY3Rpb25iYXIvaW5kZXgudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvYWN0aW9uYmFyL2luZGV4LnZ1ZSIsIi4uLy4uL3NyYy9kL2V4cG9zZS50cyIsIi4uLy4uL3NyYy9kL2NvbHVtbnMtZmlsdGVyLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvdG9vbGJhci9mcy10YWJsZS1jb2x1bW5zLWZpbHRlci9pbmRleC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy90b29sYmFyL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvaW5kZXgudnVlIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3NvcnRhYmxlanNAMS4xNC4wL25vZGVfbW9kdWxlcy9zb3J0YWJsZWpzL21vZHVsYXIvc29ydGFibGUuZXNtLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Z1ZWRyYWdnYWJsZS1lc0A0LjEuMV92dWVAMy41LjE4X3R5cGVzY3JpcHRANS4xLjZfL25vZGVfbW9kdWxlcy92dWVkcmFnZ2FibGUtZXMvZGlzdC9pbmRleC5lcy5qcyIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtY29sdW1ucy1maWx0ZXItbmVzdC1saXN0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3Rvb2xiYXIvZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvZnMtY29sdW1ucy1maWx0ZXItbGF5b3V0LWRlZmF1bHQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2J1dHRvbnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2J1dHRvbnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9pbmRleC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9zZWFyY2gvc2VhcmNoX3YxLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9zZWFyY2hfdjEudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL2xheW91dC1kZWZhdWx0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9sYXlvdXQtZGVmYXVsdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9zZWFyY2gvdGFicy1maWx0ZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1pY29uLXNlbGVjdG9yL2luZGV4LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1yYWRpby52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtcmFkaW8udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LXNlbGVjdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLXZhbHVlcy1mb3JtYXQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy12YWx1ZXMtZm9ybWF0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1jYXNjYWRlci1mb3JtYXQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LWNhc2NhZGVyLWZvcm1hdC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtY2FzY2FkZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LWNhc2NhZGVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC1jaGVja2JveC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRpY3QtY2hlY2tib3gudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvZXh0ZW5kcy9mcy1kaWN0LXN3aXRjaC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9leHRlbmRzL2ZzLWRhdGUtZm9ybWF0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC10cmVlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZGljdC10cmVlLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtdGFibGUtc2VsZWN0LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL2V4dGVuZHMvZnMtZWRpdGFibGUtc2VsZWN0LnZ1ZSIsIi4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOmV8fHNlbGYpLmRheWpzX3BsdWdpbl9hZHZhbmNlZEZvcm1hdD10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIHI9dC5wcm90b3R5cGUsbj1yLmZvcm1hdDtyLmZvcm1hdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLHI9dGhpcy4kbG9jYWxlKCk7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBuLmJpbmQodGhpcykoZSk7dmFyIHM9dGhpcy4kdXRpbHMoKSxhPShlfHxcIllZWVktTU0tRERUSEg6bW06c3NaXCIpLnJlcGxhY2UoL1xcWyhbXlxcXV0rKV18UXx3b3x3d3x3fFdXfFd8enp6fHp8Z2dnZ3xHR0dHfERvfFh8eHxrezEsMn18Uy9nLChmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZVwiUVwiOnJldHVybiBNYXRoLmNlaWwoKHQuJE0rMSkvMyk7Y2FzZVwiRG9cIjpyZXR1cm4gci5vcmRpbmFsKHQuJEQpO2Nhc2VcImdnZ2dcIjpyZXR1cm4gdC53ZWVrWWVhcigpO2Nhc2VcIkdHR0dcIjpyZXR1cm4gdC5pc29XZWVrWWVhcigpO2Nhc2VcIndvXCI6cmV0dXJuIHIub3JkaW5hbCh0LndlZWsoKSxcIldcIik7Y2FzZVwid1wiOmNhc2VcInd3XCI6cmV0dXJuIHMucyh0LndlZWsoKSxcIndcIj09PWU/MToyLFwiMFwiKTtjYXNlXCJXXCI6Y2FzZVwiV1dcIjpyZXR1cm4gcy5zKHQuaXNvV2VlaygpLFwiV1wiPT09ZT8xOjIsXCIwXCIpO2Nhc2VcImtcIjpjYXNlXCJra1wiOnJldHVybiBzLnMoU3RyaW5nKDA9PT10LiRIPzI0OnQuJEgpLFwia1wiPT09ZT8xOjIsXCIwXCIpO2Nhc2VcIlhcIjpyZXR1cm4gTWF0aC5mbG9vcih0LiRkLmdldFRpbWUoKS8xZTMpO2Nhc2VcInhcIjpyZXR1cm4gdC4kZC5nZXRUaW1lKCk7Y2FzZVwielwiOnJldHVyblwiW1wiK3Qub2Zmc2V0TmFtZSgpK1wiXVwiO2Nhc2VcInp6elwiOnJldHVyblwiW1wiK3Qub2Zmc2V0TmFtZShcImxvbmdcIikrXCJdXCI7ZGVmYXVsdDpyZXR1cm4gZX19KSk7cmV0dXJuIG4uYmluZCh0aGlzKShhKX19fSkpOyIsbnVsbCwiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5kYXlqc19wbHVnaW5fd2Vla09mWWVhcj10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9XCJ3ZWVrXCIsdD1cInllYXJcIjtyZXR1cm4gZnVuY3Rpb24oaSxuLHIpe3ZhciBmPW4ucHJvdG90eXBlO2Yud2Vlaz1mdW5jdGlvbihpKXtpZih2b2lkIDA9PT1pJiYoaT1udWxsKSxudWxsIT09aSlyZXR1cm4gdGhpcy5hZGQoNyooaS10aGlzLndlZWsoKSksXCJkYXlcIik7dmFyIG49dGhpcy4kbG9jYWxlKCkueWVhclN0YXJ0fHwxO2lmKDExPT09dGhpcy5tb250aCgpJiZ0aGlzLmRhdGUoKT4yNSl7dmFyIGY9cih0aGlzKS5zdGFydE9mKHQpLmFkZCgxLHQpLmRhdGUobikscz1yKHRoaXMpLmVuZE9mKGUpO2lmKGYuaXNCZWZvcmUocykpcmV0dXJuIDF9dmFyIGE9cih0aGlzKS5zdGFydE9mKHQpLmRhdGUobikuc3RhcnRPZihlKS5zdWJ0cmFjdCgxLFwibWlsbGlzZWNvbmRcIiksbz10aGlzLmRpZmYoYSxlLCEwKTtyZXR1cm4gbzwwP3IodGhpcykuc3RhcnRPZihcIndlZWtcIikud2VlaygpOk1hdGguY2VpbChvKX0sZi53ZWVrcz1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bnVsbCksdGhpcy53ZWVrKGUpfX19KSk7IiwiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5kYXlqc19wbHVnaW5fd2Vla2RheT10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dC5wcm90b3R5cGUud2Vla2RheT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnR8fDAsaT10aGlzLiRXLG49KGk8dD9pKzc6aSktdDtyZXR1cm4gdGhpcy4kdXRpbHMoKS51KGUpP246dGhpcy5zdWJ0cmFjdChuLFwiZGF5XCIpLmFkZChlLFwiZGF5XCIpfX19KSk7IiwiIWZ1bmN0aW9uKG4sZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KG49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczpufHxzZWxmKS5kYXlqc19wbHVnaW5fbG9jYWxlRGF0YT1lKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7cmV0dXJuIGZ1bmN0aW9uKG4sZSx0KXt2YXIgcj1lLnByb3RvdHlwZSxvPWZ1bmN0aW9uKG4pe3JldHVybiBuJiYobi5pbmRleE9mP246bi5zKX0sdT1mdW5jdGlvbihuLGUsdCxyLHUpe3ZhciBpPW4ubmFtZT9uOm4uJGxvY2FsZSgpLGE9byhpW2VdKSxzPW8oaVt0XSksZj1hfHxzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIG4uc2xpY2UoMCxyKX0pKTtpZighdSlyZXR1cm4gZjt2YXIgZD1pLndlZWtTdGFydDtyZXR1cm4gZi5tYXAoKGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGZbKGUrKGR8fDApKSU3XX0pKX0saT1mdW5jdGlvbigpe3JldHVybiB0LkxzW3QubG9jYWxlKCldfSxhPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG4uZm9ybWF0c1tlXXx8ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvKFxcW1teXFxdXStdKXwoTU1NTXxNTXxERHxkZGRkKS9nLChmdW5jdGlvbihuLGUsdCl7cmV0dXJuIGV8fHQuc2xpY2UoMSl9KSl9KG4uZm9ybWF0c1tlLnRvVXBwZXJDYXNlKCldKX0scz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJue21vbnRoczpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLmZvcm1hdChcIk1NTU1cIik6dShuLFwibW9udGhzXCIpfSxtb250aHNTaG9ydDpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLmZvcm1hdChcIk1NTVwiKTp1KG4sXCJtb250aHNTaG9ydFwiLFwibW9udGhzXCIsMyl9LGZpcnN0RGF5T2ZXZWVrOmZ1bmN0aW9uKCl7cmV0dXJuIG4uJGxvY2FsZSgpLndlZWtTdGFydHx8MH0sd2Vla2RheXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/ZS5mb3JtYXQoXCJkZGRkXCIpOnUobixcIndlZWtkYXlzXCIpfSx3ZWVrZGF5c01pbjpmdW5jdGlvbihlKXtyZXR1cm4gZT9lLmZvcm1hdChcImRkXCIpOnUobixcIndlZWtkYXlzTWluXCIsXCJ3ZWVrZGF5c1wiLDIpfSx3ZWVrZGF5c1Nob3J0OmZ1bmN0aW9uKGUpe3JldHVybiBlP2UuZm9ybWF0KFwiZGRkXCIpOnUobixcIndlZWtkYXlzU2hvcnRcIixcIndlZWtkYXlzXCIsMyl9LGxvbmdEYXRlRm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiBhKG4uJGxvY2FsZSgpLGUpfSxtZXJpZGllbTp0aGlzLiRsb2NhbGUoKS5tZXJpZGllbSxvcmRpbmFsOnRoaXMuJGxvY2FsZSgpLm9yZGluYWx9fTtyLmxvY2FsZURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gcy5iaW5kKHRoaXMpKCl9LHQubG9jYWxlRGF0YT1mdW5jdGlvbigpe3ZhciBuPWkoKTtyZXR1cm57Zmlyc3REYXlPZldlZWs6ZnVuY3Rpb24oKXtyZXR1cm4gbi53ZWVrU3RhcnR8fDB9LHdlZWtkYXlzOmZ1bmN0aW9uKCl7cmV0dXJuIHQud2Vla2RheXMoKX0sd2Vla2RheXNTaG9ydDpmdW5jdGlvbigpe3JldHVybiB0LndlZWtkYXlzU2hvcnQoKX0sd2Vla2RheXNNaW46ZnVuY3Rpb24oKXtyZXR1cm4gdC53ZWVrZGF5c01pbigpfSxtb250aHM6ZnVuY3Rpb24oKXtyZXR1cm4gdC5tb250aHMoKX0sbW9udGhzU2hvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5tb250aHNTaG9ydCgpfSxsb25nRGF0ZUZvcm1hdDpmdW5jdGlvbihlKXtyZXR1cm4gYShuLGUpfSxtZXJpZGllbTpuLm1lcmlkaWVtLG9yZGluYWw6bi5vcmRpbmFsfX0sdC5tb250aHM9ZnVuY3Rpb24oKXtyZXR1cm4gdShpKCksXCJtb250aHNcIil9LHQubW9udGhzU2hvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdShpKCksXCJtb250aHNTaG9ydFwiLFwibW9udGhzXCIsMyl9LHQud2Vla2RheXM9ZnVuY3Rpb24obil7cmV0dXJuIHUoaSgpLFwid2Vla2RheXNcIixudWxsLG51bGwsbil9LHQud2Vla2RheXNTaG9ydD1mdW5jdGlvbihuKXtyZXR1cm4gdShpKCksXCJ3ZWVrZGF5c1Nob3J0XCIsXCJ3ZWVrZGF5c1wiLDMsbil9LHQud2Vla2RheXNNaW49ZnVuY3Rpb24obil7cmV0dXJuIHUoaSgpLFwid2Vla2RheXNNaW5cIixcIndlZWtkYXlzXCIsMixuKX19fSkpOyIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIjx0ZW1wbGF0ZT5cbiAgPGRpdiByZWY9XCJwYWdlUmVmXCIgY2xhc3M9XCJmcy1wYWdlXCI+XG4gICAgPGRpdiB2LWlmPVwiJHNsb3RzLmhlYWRlciAhPSBudWxsXCIgY2xhc3M9XCJmcy1wYWdlLWhlYWRlclwiPlxuICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiPjwvc2xvdD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdlLWNvbnRlbnRcIj5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHYtaWY9XCIkc2xvdHMuZm9vdGVyICE9IG51bGxcIiBjbGFzcz1cImZzLXBhZ2UtZm9vdGVyXCI+XG4gICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyXCI+PC9zbG90PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIG9uTW91bnRlZCwgcmVmLCBSZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1BhZ2VcIixcbiAgc2V0dXAoKSB7XG4gICAgY29uc3QgcGFnZVJlZjogUmVmID0gcmVmKCk7XG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhZ2VSZWYudmFsdWUucGFyZW50Tm9kZSk7XG4gICAgICBjb25zdCBwb3NpdGlvblZhbHVlID0gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXCJwb3NpdGlvblwiKTtcbiAgICAgIGlmIChwb3NpdGlvblZhbHVlICE9PSBcInJlbGF0aXZlXCIpIHtcbiAgICAgICAgdXRpbHMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgXCJmcy1wYWdl54i26IqC54K555qEcG9zaXRpb27lu7rorq7kuLpyZWxhdGl2ZSzlm6DkuLpmcy1wYWdl5Li655u45a+55a6a5L2N77yIcG9zaXRpb246YWJzb2x1dGXvvInvvIzlpoLmnpzmoLflvI/msqHmnInlvILluLjvvIzkvaDlj6/ku6Xlv73nlaXmraTorablkYpcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlUmVmXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtcGFnZSB7XG4gIHdpZHRoOiAxMDAlO1xuICB0b3A6IDA7XG4gIGJvdHRvbTogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG4gIC5mcy1wYWdlLWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICAgID4gLnRpdGxlIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBqdXN0aWZ5LXNlbGY6IGZsZXgtc3RhcnQ7XG4gICAgICBwYWRkaW5nOiAxOHB4O1xuICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICBjb2xvcjogIzQ0NDtcblxuICAgICAgLnN1YiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY29sb3I6IGdyYXk7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xuICAgICAgICBmb250LXdlaWdodDogbGlnaHRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgPiAubW9yZSB7XG4gICAgICBqdXN0aWZ5LXNlbGY6IGZsZXgtZW5kO1xuICAgICAgbWFyZ2luLXJpZ2h0OiAxOHB4O1xuICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG4gIH1cbiAgLmZzLXBhZ2UtY29udGVudCB7XG4gICAgZmxleDogMTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiByZWY9XCJwYWdlUmVmXCIgY2xhc3M9XCJmcy1wYWdlXCI+XG4gICAgPGRpdiB2LWlmPVwiJHNsb3RzLmhlYWRlciAhPSBudWxsXCIgY2xhc3M9XCJmcy1wYWdlLWhlYWRlclwiPlxuICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiPjwvc2xvdD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdlLWNvbnRlbnRcIj5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHYtaWY9XCIkc2xvdHMuZm9vdGVyICE9IG51bGxcIiBjbGFzcz1cImZzLXBhZ2UtZm9vdGVyXCI+XG4gICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyXCI+PC9zbG90PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIG9uTW91bnRlZCwgcmVmLCBSZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1BhZ2VcIixcbiAgc2V0dXAoKSB7XG4gICAgY29uc3QgcGFnZVJlZjogUmVmID0gcmVmKCk7XG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhZ2VSZWYudmFsdWUucGFyZW50Tm9kZSk7XG4gICAgICBjb25zdCBwb3NpdGlvblZhbHVlID0gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXCJwb3NpdGlvblwiKTtcbiAgICAgIGlmIChwb3NpdGlvblZhbHVlICE9PSBcInJlbGF0aXZlXCIpIHtcbiAgICAgICAgdXRpbHMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgXCJmcy1wYWdl54i26IqC54K555qEcG9zaXRpb27lu7rorq7kuLpyZWxhdGl2ZSzlm6DkuLpmcy1wYWdl5Li655u45a+55a6a5L2N77yIcG9zaXRpb246YWJzb2x1dGXvvInvvIzlpoLmnpzmoLflvI/msqHmnInlvILluLjvvIzkvaDlj6/ku6Xlv73nlaXmraTorablkYpcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlUmVmXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtcGFnZSB7XG4gIHdpZHRoOiAxMDAlO1xuICB0b3A6IDA7XG4gIGJvdHRvbTogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG4gIC5mcy1wYWdlLWhlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICAgID4gLnRpdGxlIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBqdXN0aWZ5LXNlbGY6IGZsZXgtc3RhcnQ7XG4gICAgICBwYWRkaW5nOiAxOHB4O1xuICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgICBjb2xvcjogIzQ0NDtcblxuICAgICAgLnN1YiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY29sb3I6IGdyYXk7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xuICAgICAgICBmb250LXdlaWdodDogbGlnaHRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgPiAubW9yZSB7XG4gICAgICBqdXN0aWZ5LXNlbGY6IGZsZXgtZW5kO1xuICAgICAgbWFyZ2luLXJpZ2h0OiAxOHB4O1xuICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG4gIH1cbiAgLmZzLXBhZ2UtY29udGVudCB7XG4gICAgZmxleDogMTtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgfVxufVxuPC9zdHlsZT5cbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiLyoqXG4gKiBAbW9kdWxlIExSVUNhY2hlXG4gKi9cbmNvbnN0IHBlcmYgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmXG4gICAgcGVyZm9ybWFuY2UgJiZcbiAgICB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nXG4gICAgPyBwZXJmb3JtYW5jZVxuICAgIDogRGF0ZTtcbmNvbnN0IHdhcm5lZCA9IG5ldyBTZXQoKTtcbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuY29uc3QgUFJPQ0VTUyA9ICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgISFwcm9jZXNzID8gcHJvY2VzcyA6IHt9KTtcbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuY29uc3QgZW1pdFdhcm5pbmcgPSAobXNnLCB0eXBlLCBjb2RlLCBmbikgPT4ge1xuICAgIHR5cGVvZiBQUk9DRVNTLmVtaXRXYXJuaW5nID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gUFJPQ0VTUy5lbWl0V2FybmluZyhtc2csIHR5cGUsIGNvZGUsIGZuKVxuICAgICAgICA6IGNvbnNvbGUuZXJyb3IoYFske2NvZGV9XSAke3R5cGV9OiAke21zZ31gKTtcbn07XG5sZXQgQUMgPSBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlcjtcbmxldCBBUyA9IGdsb2JhbFRoaXMuQWJvcnRTaWduYWw7XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmlmICh0eXBlb2YgQUMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy9AdHMtaWdub3JlXG4gICAgQVMgPSBjbGFzcyBBYm9ydFNpZ25hbCB7XG4gICAgICAgIG9uYWJvcnQ7XG4gICAgICAgIF9vbmFib3J0ID0gW107XG4gICAgICAgIHJlYXNvbjtcbiAgICAgICAgYWJvcnRlZCA9IGZhbHNlO1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKF8sIGZuKSB7XG4gICAgICAgICAgICB0aGlzLl9vbmFib3J0LnB1c2goZm4pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBBQyA9IGNsYXNzIEFib3J0Q29udHJvbGxlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgd2FybkFDUG9seWZpbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYWwgPSBuZXcgQVMoKTtcbiAgICAgICAgYWJvcnQocmVhc29uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaWduYWwuYWJvcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMuc2lnbmFsLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5zaWduYWwuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGZvciAoY29uc3QgZm4gb2YgdGhpcy5zaWduYWwuX29uYWJvcnQpIHtcbiAgICAgICAgICAgICAgICBmbihyZWFzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zaWduYWwub25hYm9ydD8uKHJlYXNvbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGxldCBwcmludEFDUG9seWZpbGxXYXJuaW5nID0gUFJPQ0VTUy5lbnY/LkxSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORyAhPT0gJzEnO1xuICAgIGNvbnN0IHdhcm5BQ1BvbHlmaWxsID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXByaW50QUNQb2x5ZmlsbFdhcm5pbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHByaW50QUNQb2x5ZmlsbFdhcm5pbmcgPSBmYWxzZTtcbiAgICAgICAgZW1pdFdhcm5pbmcoJ0Fib3J0Q29udHJvbGxlciBpcyBub3QgZGVmaW5lZC4gSWYgdXNpbmcgbHJ1LWNhY2hlIGluICcgK1xuICAgICAgICAgICAgJ25vZGUgMTQsIGxvYWQgYW4gQWJvcnRDb250cm9sbGVyIHBvbHlmaWxsIGZyb20gdGhlICcgK1xuICAgICAgICAgICAgJ2Bub2RlLWFib3J0LWNvbnRyb2xsZXJgIHBhY2thZ2UuIEEgbWluaW1hbCBwb2x5ZmlsbCBpcyAnICtcbiAgICAgICAgICAgICdwcm92aWRlZCBmb3IgdXNlIGJ5IExSVUNhY2hlLmZldGNoKCksIGJ1dCBpdCBzaG91bGQgbm90IGJlICcgK1xuICAgICAgICAgICAgJ3JlbGllZCB1cG9uIGluIG90aGVyIGNvbnRleHRzIChlZywgcGFzc2luZyBpdCB0byBvdGhlciBBUElzIHRoYXQgJyArXG4gICAgICAgICAgICAndXNlIEFib3J0Q29udHJvbGxlci9BYm9ydFNpZ25hbCBtaWdodCBoYXZlIHVuZGVzaXJhYmxlIGVmZmVjdHMpLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGRpc2FibGUgdGhpcyB3aXRoIExSVV9DQUNIRV9JR05PUkVfQUNfV0FSTklORz0xIGluIHRoZSBlbnYuJywgJ05PX0FCT1JUX0NPTlRST0xMRVInLCAnRU5PVFNVUCcsIHdhcm5BQ1BvbHlmaWxsKTtcbiAgICB9O1xufVxuLyogYzggaWdub3JlIHN0b3AgKi9cbmNvbnN0IHNob3VsZFdhcm4gPSAoY29kZSkgPT4gIXdhcm5lZC5oYXMoY29kZSk7XG5jb25zdCBUWVBFID0gU3ltYm9sKCd0eXBlJyk7XG5jb25zdCBpc1Bvc0ludCA9IChuKSA9PiBuICYmIG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+IDAgJiYgaXNGaW5pdGUobik7XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbi8vIFRoaXMgaXMgYSBsaXR0bGUgYml0IHJpZGljdWxvdXMsIHRiaC5cbi8vIFRoZSBtYXhpbXVtIGFycmF5IGxlbmd0aCBpcyAyXjMyLTEgb3IgdGhlcmVhYm91dHMgb24gbW9zdCBKUyBpbXBscy5cbi8vIEFuZCB3ZWxsIGJlZm9yZSB0aGF0IHBvaW50LCB5b3UncmUgY2FjaGluZyB0aGUgZW50aXJlIHdvcmxkLCBJIG1lYW4sXG4vLyB0aGF0J3MgfjMyR0Igb2YganVzdCBpbnRlZ2VycyBmb3IgdGhlIG5leHQvcHJldiBsaW5rcywgcGx1cyB3aGF0ZXZlclxuLy8gZWxzZSB0byBob2xkIHRoYXQgbWFueSBrZXlzIGFuZCB2YWx1ZXMuICBKdXN0IGZpbGxpbmcgdGhlIG1lbW9yeSB3aXRoXG4vLyB6ZXJvZXMgYXQgaW5pdCB0aW1lIGlzIGJydXRhbCB3aGVuIHlvdSBnZXQgdGhhdCBiaWcuXG4vLyBCdXQgd2h5IG5vdCBiZSBjb21wbGV0ZT9cbi8vIE1heWJlIGluIHRoZSBmdXR1cmUsIHRoZXNlIGxpbWl0cyB3aWxsIGhhdmUgZXhwYW5kZWQuXG5jb25zdCBnZXRVaW50QXJyYXkgPSAobWF4KSA9PiAhaXNQb3NJbnQobWF4KVxuICAgID8gbnVsbFxuICAgIDogbWF4IDw9IE1hdGgucG93KDIsIDgpXG4gICAgICAgID8gVWludDhBcnJheVxuICAgICAgICA6IG1heCA8PSBNYXRoLnBvdygyLCAxNilcbiAgICAgICAgICAgID8gVWludDE2QXJyYXlcbiAgICAgICAgICAgIDogbWF4IDw9IE1hdGgucG93KDIsIDMyKVxuICAgICAgICAgICAgICAgID8gVWludDMyQXJyYXlcbiAgICAgICAgICAgICAgICA6IG1heCA8PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICAgICAgICAgICAgICAgICAgICA/IFplcm9BcnJheVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4vKiBjOCBpZ25vcmUgc3RvcCAqL1xuY2xhc3MgWmVyb0FycmF5IGV4dGVuZHMgQXJyYXkge1xuICAgIGNvbnN0cnVjdG9yKHNpemUpIHtcbiAgICAgICAgc3VwZXIoc2l6ZSk7XG4gICAgICAgIHRoaXMuZmlsbCgwKTtcbiAgICB9XG59XG5jbGFzcyBTdGFjayB7XG4gICAgaGVhcDtcbiAgICBsZW5ndGg7XG4gICAgLy8gcHJpdmF0ZSBjb25zdHJ1Y3RvclxuICAgIHN0YXRpYyAjY29uc3RydWN0aW5nID0gZmFsc2U7XG4gICAgc3RhdGljIGNyZWF0ZShtYXgpIHtcbiAgICAgICAgY29uc3QgSGVhcENscyA9IGdldFVpbnRBcnJheShtYXgpO1xuICAgICAgICBpZiAoIUhlYXBDbHMpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIFN0YWNrLiNjb25zdHJ1Y3RpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBzID0gbmV3IFN0YWNrKG1heCwgSGVhcENscyk7XG4gICAgICAgIFN0YWNrLiNjb25zdHJ1Y3RpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG1heCwgSGVhcENscykge1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKCFTdGFjay4jY29uc3RydWN0aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnN0YW50aWF0ZSBTdGFjayB1c2luZyBTdGFjay5jcmVhdGUobiknKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB0aGlzLmhlYXAgPSBuZXcgSGVhcENscyhtYXgpO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIHB1c2gobikge1xuICAgICAgICB0aGlzLmhlYXBbdGhpcy5sZW5ndGgrK10gPSBuO1xuICAgIH1cbiAgICBwb3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhlYXBbLS10aGlzLmxlbmd0aF07XG4gICAgfVxufVxuLyoqXG4gKiBEZWZhdWx0IGV4cG9ydCwgdGhlIHRoaW5nIHlvdSdyZSB1c2luZyB0aGlzIG1vZHVsZSB0byBnZXQuXG4gKlxuICogVGhlIGBLYCBhbmQgYFZgIHR5cGVzIGRlZmluZSB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlcywgcmVzcGVjdGl2ZWx5LiBUaGVcbiAqIG9wdGlvbmFsIGBGQ2AgdHlwZSBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBgY29udGV4dGAgb2JqZWN0IHBhc3NlZCB0b1xuICogYGNhY2hlLmZldGNoKClgIGFuZCBgY2FjaGUubWVtbygpYC5cbiAqXG4gKiBLZXlzIGFuZCB2YWx1ZXMgKiptdXN0IG5vdCoqIGJlIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBBbGwgcHJvcGVydGllcyBmcm9tIHRoZSBvcHRpb25zIG9iamVjdCAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIGBtYXhgLFxuICogYG1heFNpemVgLCBgZmV0Y2hNZXRob2RgLCBgbWVtb01ldGhvZGAsIGBkaXNwb3NlYCBhbmQgYGRpc3Bvc2VBZnRlcmApIGFyZVxuICogYWRkZWQgYXMgbm9ybWFsIHB1YmxpYyBtZW1iZXJzLiAoVGhlIGxpc3RlZCBvcHRpb25zIGFyZSByZWFkLW9ubHkgZ2V0dGVycy4pXG4gKlxuICogQ2hhbmdpbmcgYW55IG9mIHRoZXNlIHdpbGwgYWx0ZXIgdGhlIGRlZmF1bHRzIGZvciBzdWJzZXF1ZW50IG1ldGhvZCBjYWxscy5cbiAqL1xuZXhwb3J0IGNsYXNzIExSVUNhY2hlIHtcbiAgICAvLyBvcHRpb25zIHRoYXQgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dCBkaXNhc3RlclxuICAgICNtYXg7XG4gICAgI21heFNpemU7XG4gICAgI2Rpc3Bvc2U7XG4gICAgI2Rpc3Bvc2VBZnRlcjtcbiAgICAjZmV0Y2hNZXRob2Q7XG4gICAgI21lbW9NZXRob2Q7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnR0bH1cbiAgICAgKi9cbiAgICB0dGw7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnR0bFJlc29sdXRpb259XG4gICAgICovXG4gICAgdHRsUmVzb2x1dGlvbjtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudHRsQXV0b3B1cmdlfVxuICAgICAqL1xuICAgIHR0bEF1dG9wdXJnZTtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25HZXR9XG4gICAgICovXG4gICAgdXBkYXRlQWdlT25HZXQ7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnVwZGF0ZUFnZU9uSGFzfVxuICAgICAqL1xuICAgIHVwZGF0ZUFnZU9uSGFzO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlfVxuICAgICAqL1xuICAgIGFsbG93U3RhbGU7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vRGlzcG9zZU9uU2V0fVxuICAgICAqL1xuICAgIG5vRGlzcG9zZU9uU2V0O1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5ub1VwZGF0ZVRUTH1cbiAgICAgKi9cbiAgICBub1VwZGF0ZVRUTDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UubWF4RW50cnlTaXplfVxuICAgICAqL1xuICAgIG1heEVudHJ5U2l6ZTtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uuc2l6ZUNhbGN1bGF0aW9ufVxuICAgICAqL1xuICAgIHNpemVDYWxjdWxhdGlvbjtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9EZWxldGVPbkZldGNoUmVqZWN0aW9ufVxuICAgICAqL1xuICAgIG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbjtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9EZWxldGVPblN0YWxlR2V0fVxuICAgICAqL1xuICAgIG5vRGVsZXRlT25TdGFsZUdldDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydH1cbiAgICAgKi9cbiAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0O1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbn1cbiAgICAgKi9cbiAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbjtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuaWdub3JlRmV0Y2hBYm9ydH1cbiAgICAgKi9cbiAgICBpZ25vcmVGZXRjaEFib3J0O1xuICAgIC8vIGNvbXB1dGVkIHByb3BlcnRpZXNcbiAgICAjc2l6ZTtcbiAgICAjY2FsY3VsYXRlZFNpemU7XG4gICAgI2tleU1hcDtcbiAgICAja2V5TGlzdDtcbiAgICAjdmFsTGlzdDtcbiAgICAjbmV4dDtcbiAgICAjcHJldjtcbiAgICAjaGVhZDtcbiAgICAjdGFpbDtcbiAgICAjZnJlZTtcbiAgICAjZGlzcG9zZWQ7XG4gICAgI3NpemVzO1xuICAgICNzdGFydHM7XG4gICAgI3R0bHM7XG4gICAgI2hhc0Rpc3Bvc2U7XG4gICAgI2hhc0ZldGNoTWV0aG9kO1xuICAgICNoYXNEaXNwb3NlQWZ0ZXI7XG4gICAgLyoqXG4gICAgICogRG8gbm90IGNhbGwgdGhpcyBtZXRob2QgdW5sZXNzIHlvdSBuZWVkIHRvIGluc3BlY3QgdGhlXG4gICAgICogaW5uZXIgd29ya2luZ3Mgb2YgdGhlIGNhY2hlLiAgSWYgYW55dGhpbmcgcmV0dXJuZWQgYnkgdGhpc1xuICAgICAqIG9iamVjdCBpcyBtb2RpZmllZCBpbiBhbnkgd2F5LCBzdHJhbmdlIGJyZWFrYWdlIG1heSBvY2N1ci5cbiAgICAgKlxuICAgICAqIFRoZXNlIGZpZWxkcyBhcmUgcHJpdmF0ZSBmb3IgYSByZWFzb24hXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzdGF0aWMgdW5zYWZlRXhwb3NlSW50ZXJuYWxzKGMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8vIHByb3BlcnRpZXNcbiAgICAgICAgICAgIHN0YXJ0czogYy4jc3RhcnRzLFxuICAgICAgICAgICAgdHRsczogYy4jdHRscyxcbiAgICAgICAgICAgIHNpemVzOiBjLiNzaXplcyxcbiAgICAgICAgICAgIGtleU1hcDogYy4ja2V5TWFwLFxuICAgICAgICAgICAga2V5TGlzdDogYy4ja2V5TGlzdCxcbiAgICAgICAgICAgIHZhbExpc3Q6IGMuI3ZhbExpc3QsXG4gICAgICAgICAgICBuZXh0OiBjLiNuZXh0LFxuICAgICAgICAgICAgcHJldjogYy4jcHJldixcbiAgICAgICAgICAgIGdldCBoZWFkKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjLiNoZWFkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCB0YWlsKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjLiN0YWlsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZyZWU6IGMuI2ZyZWUsXG4gICAgICAgICAgICAvLyBtZXRob2RzXG4gICAgICAgICAgICBpc0JhY2tncm91bmRGZXRjaDogKHApID0+IGMuI2lzQmFja2dyb3VuZEZldGNoKHApLFxuICAgICAgICAgICAgYmFja2dyb3VuZEZldGNoOiAoaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpID0+IGMuI2JhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dCksXG4gICAgICAgICAgICBtb3ZlVG9UYWlsOiAoaW5kZXgpID0+IGMuI21vdmVUb1RhaWwoaW5kZXgpLFxuICAgICAgICAgICAgaW5kZXhlczogKG9wdGlvbnMpID0+IGMuI2luZGV4ZXMob3B0aW9ucyksXG4gICAgICAgICAgICByaW5kZXhlczogKG9wdGlvbnMpID0+IGMuI3JpbmRleGVzKG9wdGlvbnMpLFxuICAgICAgICAgICAgaXNTdGFsZTogKGluZGV4KSA9PiBjLiNpc1N0YWxlKGluZGV4KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gUHJvdGVjdGVkIHJlYWQtb25seSBtZW1iZXJzXG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1heH0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgbWF4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWF4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UubWF4U2l6ZX0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgbWF4U2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21heFNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjb21wdXRlZCBzaXplIG9mIGl0ZW1zIGluIHRoZSBjYWNoZSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBjYWxjdWxhdGVkU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NhbGN1bGF0ZWRTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHN0b3JlZCBpbiB0aGUgY2FjaGUgKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5mZXRjaE1ldGhvZH0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgZmV0Y2hNZXRob2QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmZXRjaE1ldGhvZDtcbiAgICB9XG4gICAgZ2V0IG1lbW9NZXRob2QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNtZW1vTWV0aG9kO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZGlzcG9zZX0gKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgZGlzcG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5kaXNwb3NlQWZ0ZXJ9IChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IGRpc3Bvc2VBZnRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VBZnRlcjtcbiAgICB9XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IG1heCA9IDAsIHR0bCwgdHRsUmVzb2x1dGlvbiA9IDEsIHR0bEF1dG9wdXJnZSwgdXBkYXRlQWdlT25HZXQsIHVwZGF0ZUFnZU9uSGFzLCBhbGxvd1N0YWxlLCBkaXNwb3NlLCBkaXNwb3NlQWZ0ZXIsIG5vRGlzcG9zZU9uU2V0LCBub1VwZGF0ZVRUTCwgbWF4U2l6ZSA9IDAsIG1heEVudHJ5U2l6ZSA9IDAsIHNpemVDYWxjdWxhdGlvbiwgZmV0Y2hNZXRob2QsIG1lbW9NZXRob2QsIG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiwgbm9EZWxldGVPblN0YWxlR2V0LCBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiwgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCwgaWdub3JlRmV0Y2hBYm9ydCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChtYXggIT09IDAgJiYgIWlzUG9zSW50KG1heCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBvcHRpb24gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBVaW50QXJyYXkgPSBtYXggPyBnZXRVaW50QXJyYXkobWF4KSA6IEFycmF5O1xuICAgICAgICBpZiAoIVVpbnRBcnJheSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCB2YWx1ZTogJyArIG1heCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jbWF4ID0gbWF4O1xuICAgICAgICB0aGlzLiNtYXhTaXplID0gbWF4U2l6ZTtcbiAgICAgICAgdGhpcy5tYXhFbnRyeVNpemUgPSBtYXhFbnRyeVNpemUgfHwgdGhpcy4jbWF4U2l6ZTtcbiAgICAgICAgdGhpcy5zaXplQ2FsY3VsYXRpb24gPSBzaXplQ2FsY3VsYXRpb247XG4gICAgICAgIGlmICh0aGlzLnNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLiNtYXhTaXplICYmICF0aGlzLm1heEVudHJ5U2l6ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Nhbm5vdCBzZXQgc2l6ZUNhbGN1bGF0aW9uIHdpdGhvdXQgc2V0dGluZyBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpemVDYWxjdWxhdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemVDYWxjdWxhdGlvbiBzZXQgdG8gbm9uLWZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lbW9NZXRob2QgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIG1lbW9NZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21lbW9NZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIGlmIGRlZmluZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNtZW1vTWV0aG9kID0gbWVtb01ldGhvZDtcbiAgICAgICAgaWYgKGZldGNoTWV0aG9kICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBmZXRjaE1ldGhvZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmV0Y2hNZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIGlmIHNwZWNpZmllZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2ZldGNoTWV0aG9kID0gZmV0Y2hNZXRob2Q7XG4gICAgICAgIHRoaXMuI2hhc0ZldGNoTWV0aG9kID0gISFmZXRjaE1ldGhvZDtcbiAgICAgICAgdGhpcy4ja2V5TWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLiNrZXlMaXN0ID0gbmV3IEFycmF5KG1heCkuZmlsbCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLiN2YWxMaXN0ID0gbmV3IEFycmF5KG1heCkuZmlsbCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLiNuZXh0ID0gbmV3IFVpbnRBcnJheShtYXgpO1xuICAgICAgICB0aGlzLiNwcmV2ID0gbmV3IFVpbnRBcnJheShtYXgpO1xuICAgICAgICB0aGlzLiNoZWFkID0gMDtcbiAgICAgICAgdGhpcy4jdGFpbCA9IDA7XG4gICAgICAgIHRoaXMuI2ZyZWUgPSBTdGFjay5jcmVhdGUobWF4KTtcbiAgICAgICAgdGhpcy4jc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplID0gMDtcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlID0gZGlzcG9zZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2VBZnRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyID0gZGlzcG9zZUFmdGVyO1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2hhc0Rpc3Bvc2UgPSAhIXRoaXMuI2Rpc3Bvc2U7XG4gICAgICAgIHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciA9ICEhdGhpcy4jZGlzcG9zZUFmdGVyO1xuICAgICAgICB0aGlzLm5vRGlzcG9zZU9uU2V0ID0gISFub0Rpc3Bvc2VPblNldDtcbiAgICAgICAgdGhpcy5ub1VwZGF0ZVRUTCA9ICEhbm9VcGRhdGVUVEw7XG4gICAgICAgIHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gISFub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgICAgIHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24gPSAhIWFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uO1xuICAgICAgICB0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQgPSAhIWFsbG93U3RhbGVPbkZldGNoQWJvcnQ7XG4gICAgICAgIHRoaXMuaWdub3JlRmV0Y2hBYm9ydCA9ICEhaWdub3JlRmV0Y2hBYm9ydDtcbiAgICAgICAgLy8gTkI6IG1heEVudHJ5U2l6ZSBpcyBzZXQgdG8gbWF4U2l6ZSBpZiBpdCdzIHNldFxuICAgICAgICBpZiAodGhpcy5tYXhFbnRyeVNpemUgIT09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNtYXhTaXplICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLiNtYXhTaXplKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXhTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQb3NJbnQodGhpcy5tYXhFbnRyeVNpemUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZVNpemVUcmFja2luZygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb3dTdGFsZSA9ICEhYWxsb3dTdGFsZTtcbiAgICAgICAgdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQgPSAhIW5vRGVsZXRlT25TdGFsZUdldDtcbiAgICAgICAgdGhpcy51cGRhdGVBZ2VPbkdldCA9ICEhdXBkYXRlQWdlT25HZXQ7XG4gICAgICAgIHRoaXMudXBkYXRlQWdlT25IYXMgPSAhIXVwZGF0ZUFnZU9uSGFzO1xuICAgICAgICB0aGlzLnR0bFJlc29sdXRpb24gPVxuICAgICAgICAgICAgaXNQb3NJbnQodHRsUmVzb2x1dGlvbikgfHwgdHRsUmVzb2x1dGlvbiA9PT0gMFxuICAgICAgICAgICAgICAgID8gdHRsUmVzb2x1dGlvblxuICAgICAgICAgICAgICAgIDogMTtcbiAgICAgICAgdGhpcy50dGxBdXRvcHVyZ2UgPSAhIXR0bEF1dG9wdXJnZTtcbiAgICAgICAgdGhpcy50dGwgPSB0dGwgfHwgMDtcbiAgICAgICAgaWYgKHRoaXMudHRsKSB7XG4gICAgICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMudHRsKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3R0bCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVUVExUcmFja2luZygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvIG5vdCBhbGxvdyBjb21wbGV0ZWx5IHVuYm91bmRlZCBjYWNoZXNcbiAgICAgICAgaWYgKHRoaXMuI21heCA9PT0gMCAmJiB0aGlzLnR0bCA9PT0gMCAmJiB0aGlzLiNtYXhTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBdCBsZWFzdCBvbmUgb2YgbWF4LCBtYXhTaXplLCBvciB0dGwgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHRsQXV0b3B1cmdlICYmICF0aGlzLiNtYXggJiYgIXRoaXMuI21heFNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSAnTFJVX0NBQ0hFX1VOQk9VTkRFRCc7XG4gICAgICAgICAgICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgICAgICAgICAgICAgIHdhcm5lZC5hZGQoY29kZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gJ1RUTCBjYWNoaW5nIHdpdGhvdXQgdHRsQXV0b3B1cmdlLCBtYXgsIG9yIG1heFNpemUgY2FuICcgK1xuICAgICAgICAgICAgICAgICAgICAncmVzdWx0IGluIHVuYm91bmRlZCBtZW1vcnkgY29uc3VtcHRpb24uJztcbiAgICAgICAgICAgICAgICBlbWl0V2FybmluZyhtc2csICdVbmJvdW5kZWRDYWNoZVdhcm5pbmcnLCBjb2RlLCBMUlVDYWNoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbXMgbGVmdCBpbiB0aGUgaXRlbSdzIFRUTC4gSWYgaXRlbSBpcyBub3QgaW4gY2FjaGUsXG4gICAgICogcmV0dXJucyBgMGAuIFJldHVybnMgYEluZmluaXR5YCBpZiBpdGVtIGlzIGluIGNhY2hlIHdpdGhvdXQgYSBkZWZpbmVkIFRUTC5cbiAgICAgKi9cbiAgICBnZXRSZW1haW5pbmdUVEwoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNrZXlNYXAuaGFzKGtleSkgPyBJbmZpbml0eSA6IDA7XG4gICAgfVxuICAgICNpbml0aWFsaXplVFRMVHJhY2tpbmcoKSB7XG4gICAgICAgIGNvbnN0IHR0bHMgPSBuZXcgWmVyb0FycmF5KHRoaXMuI21heCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0cyA9IG5ldyBaZXJvQXJyYXkodGhpcy4jbWF4KTtcbiAgICAgICAgdGhpcy4jdHRscyA9IHR0bHM7XG4gICAgICAgIHRoaXMuI3N0YXJ0cyA9IHN0YXJ0cztcbiAgICAgICAgdGhpcy4jc2V0SXRlbVRUTCA9IChpbmRleCwgdHRsLCBzdGFydCA9IHBlcmYubm93KCkpID0+IHtcbiAgICAgICAgICAgIHN0YXJ0c1tpbmRleF0gPSB0dGwgIT09IDAgPyBzdGFydCA6IDA7XG4gICAgICAgICAgICB0dGxzW2luZGV4XSA9IHR0bDtcbiAgICAgICAgICAgIGlmICh0dGwgIT09IDAgJiYgdGhpcy50dGxBdXRvcHVyZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc1N0YWxlKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKHRoaXMuI2tleUxpc3RbaW5kZXhdLCAnZXhwaXJlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB0dGwgKyAxKTtcbiAgICAgICAgICAgICAgICAvLyB1bnJlZigpIG5vdCBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3Jtc1xuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgICAgIGlmICh0LnVucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHQudW5yZWYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZSA9IGluZGV4ID0+IHtcbiAgICAgICAgICAgIHN0YXJ0c1tpbmRleF0gPSB0dGxzW2luZGV4XSAhPT0gMCA/IHBlcmYubm93KCkgOiAwO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzdGF0dXNUVEwgPSAoc3RhdHVzLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR0bHNbaW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHRsID0gdHRsc1tpbmRleF07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICAgICAgaWYgKCF0dGwgfHwgIXN0YXJ0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgc3RhdHVzLnR0bCA9IHR0bDtcbiAgICAgICAgICAgICAgICBzdGF0dXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgICAgICBzdGF0dXMubm93ID0gY2FjaGVkTm93IHx8IGdldE5vdygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFnZSA9IHN0YXR1cy5ub3cgLSBzdGFydDtcbiAgICAgICAgICAgICAgICBzdGF0dXMucmVtYWluaW5nVFRMID0gdHRsIC0gYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBkZWJvdW5jZSBjYWxscyB0byBwZXJmLm5vdygpIHRvIDFzIHNvIHdlJ3JlIG5vdCBoaXR0aW5nXG4gICAgICAgIC8vIHRoYXQgY29zdGx5IGNhbGwgcmVwZWF0ZWRseS5cbiAgICAgICAgbGV0IGNhY2hlZE5vdyA9IDA7XG4gICAgICAgIGNvbnN0IGdldE5vdyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBwZXJmLm5vdygpO1xuICAgICAgICAgICAgaWYgKHRoaXMudHRsUmVzb2x1dGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICBjYWNoZWROb3cgPSBuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBzZXRUaW1lb3V0KCgpID0+IChjYWNoZWROb3cgPSAwKSwgdGhpcy50dGxSZXNvbHV0aW9uKTtcbiAgICAgICAgICAgICAgICAvLyBub3QgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXNcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICBpZiAodC51bnJlZikge1xuICAgICAgICAgICAgICAgICAgICB0LnVucmVmKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRSZW1haW5pbmdUVEwgPSBrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHRsID0gdHRsc1tpbmRleF07XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHN0YXJ0c1tpbmRleF07XG4gICAgICAgICAgICBpZiAoIXR0bCB8fCAhc3RhcnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhZ2UgPSAoY2FjaGVkTm93IHx8IGdldE5vdygpKSAtIHN0YXJ0O1xuICAgICAgICAgICAgcmV0dXJuIHR0bCAtIGFnZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jaXNTdGFsZSA9IGluZGV4ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBzdGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgdCA9IHR0bHNbaW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuICEhdCAmJiAhIXMgJiYgKGNhY2hlZE5vdyB8fCBnZXROb3coKSkgLSBzID4gdDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gY29uZGl0aW9uYWxseSBzZXQgcHJpdmF0ZSBtZXRob2RzIHJlbGF0ZWQgdG8gVFRMXG4gICAgI3VwZGF0ZUl0ZW1BZ2UgPSAoKSA9PiB7IH07XG4gICAgI3N0YXR1c1RUTCA9ICgpID0+IHsgfTtcbiAgICAjc2V0SXRlbVRUTCA9ICgpID0+IHsgfTtcbiAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICNpc1N0YWxlID0gKCkgPT4gZmFsc2U7XG4gICAgI2luaXRpYWxpemVTaXplVHJhY2tpbmcoKSB7XG4gICAgICAgIGNvbnN0IHNpemVzID0gbmV3IFplcm9BcnJheSh0aGlzLiNtYXgpO1xuICAgICAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuI3NpemVzID0gc2l6ZXM7XG4gICAgICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplID0gaW5kZXggPT4ge1xuICAgICAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgLT0gc2l6ZXNbaW5kZXhdO1xuICAgICAgICAgICAgc2l6ZXNbaW5kZXhdID0gMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jcmVxdWlyZVNpemUgPSAoaywgdiwgc2l6ZSwgc2l6ZUNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAvLyBwcm92aXNpb25hbGx5IGFjY2VwdCBiYWNrZ3JvdW5kIGZldGNoZXMuXG4gICAgICAgICAgICAvLyBhY3R1YWwgdmFsdWUgc2l6ZSB3aWxsIGJlIGNoZWNrZWQgd2hlbiB0aGV5IHJldHVybi5cbiAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1Bvc0ludChzaXplKSkge1xuICAgICAgICAgICAgICAgIGlmIChzaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzaXplQ2FsY3VsYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemVDYWxjdWxhdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzaXplID0gc2l6ZUNhbGN1bGF0aW9uKHYsIGspO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUG9zSW50KHNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHNpemUgdmFsdWUgKG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcikuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1doZW4gbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUgaXMgdXNlZCwgc2l6ZUNhbGN1bGF0aW9uICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ29yIHNpemUgbXVzdCBiZSBzZXQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI2FkZEl0ZW1TaXplID0gKGluZGV4LCBzaXplLCBzdGF0dXMpID0+IHtcbiAgICAgICAgICAgIHNpemVzW2luZGV4XSA9IHNpemU7XG4gICAgICAgICAgICBpZiAodGhpcy4jbWF4U2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSB0aGlzLiNtYXhTaXplIC0gc2l6ZXNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLiNjYWxjdWxhdGVkU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZXZpY3QodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgKz0gc2l6ZXNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5lbnRyeVNpemUgPSBzaXplO1xuICAgICAgICAgICAgICAgIHN0YXR1cy50b3RhbENhbGN1bGF0ZWRTaXplID0gdGhpcy4jY2FsY3VsYXRlZFNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgICNyZW1vdmVJdGVtU2l6ZSA9IF9pID0+IHsgfTtcbiAgICAjYWRkSXRlbVNpemUgPSAoX2ksIF9zLCBfc3QpID0+IHsgfTtcbiAgICAjcmVxdWlyZVNpemUgPSAoX2ssIF92LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pID0+IHtcbiAgICAgICAgaWYgKHNpemUgfHwgc2l6ZUNhbGN1bGF0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcbiAgICAqI2luZGV4ZXMoeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgICAgICBpZiAodGhpcy4jc2l6ZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuI3RhaWw7IHRydWU7KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLiNpc1ZhbGlkSW5kZXgoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd1N0YWxlIHx8ICF0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpID09PSB0aGlzLiNoZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI3ByZXZbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICojcmluZGV4ZXMoeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgICAgICBpZiAodGhpcy4jc2l6ZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuI2hlYWQ7IHRydWU7KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLiNpc1ZhbGlkSW5kZXgoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd1N0YWxlIHx8ICF0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpID09PSB0aGlzLiN0YWlsKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuI25leHRbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICNpc1ZhbGlkSW5kZXgoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIChpbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0aGlzLiNrZXlNYXAuZ2V0KHRoaXMuI2tleUxpc3RbaW5kZXhdKSA9PT0gaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgYFtrZXksIHZhbHVlXWAgcGFpcnMsXG4gICAgICogaW4gb3JkZXIgZnJvbSBtb3N0IHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqZW50cmllcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbExpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIFt0aGlzLiNrZXlMaXN0W2ldLCB0aGlzLiN2YWxMaXN0W2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZlcnNlIG9yZGVyIHZlcnNpb24gb2Yge0BsaW5rIExSVUNhY2hlLmVudHJpZXN9XG4gICAgICpcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgYFtrZXksIHZhbHVlXWAgcGFpcnMsXG4gICAgICogaW4gb3JkZXIgZnJvbSBsZWFzdCByZWNlbnRseSB1c2VkIHRvIG1vc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqcmVudHJpZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jdmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgdGhpcy4ja2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgW3RoaXMuI2tleUxpc3RbaV0sIHRoaXMuI3ZhbExpc3RbaV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyB0aGUga2V5cyBpbiB0aGUgY2FjaGUsXG4gICAgICogaW4gb3JkZXIgZnJvbSBtb3N0IHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqa2V5cygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaV07XG4gICAgICAgICAgICBpZiAoayAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZlcnNlIG9yZGVyIHZlcnNpb24gb2Yge0BsaW5rIExSVUNhY2hlLmtleXN9XG4gICAgICpcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIGtleXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbGVhc3QgcmVjZW50bHkgdXNlZCB0byBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnJrZXlzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaV07XG4gICAgICAgICAgICBpZiAoayAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIHZhbHVlcyBpbiB0aGUgY2FjaGUsXG4gICAgICogaW4gb3JkZXIgZnJvbSBtb3N0IHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKi9cbiAgICAqdmFsdWVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludmVyc2Ugb3JkZXIgdmVyc2lvbiBvZiB7QGxpbmsgTFJVQ2FjaGUudmFsdWVzfVxuICAgICAqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSB2YWx1ZXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbGVhc3QgcmVjZW50bHkgdXNlZCB0byBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnJ2YWx1ZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcygpKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGluZyBvdmVyIHRoZSBjYWNoZSBpdHNlbGYgeWllbGRzIHRoZSBzYW1lIHJlc3VsdHMgYXNcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuZW50cmllc31cbiAgICAgKi9cbiAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIFN0cmluZyB2YWx1ZSB0aGF0IGlzIHVzZWQgaW4gdGhlIGNyZWF0aW9uIG9mIHRoZSBkZWZhdWx0IHN0cmluZ1xuICAgICAqIGRlc2NyaXB0aW9uIG9mIGFuIG9iamVjdC4gQ2FsbGVkIGJ5IHRoZSBidWlsdC1pbiBtZXRob2RcbiAgICAgKiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAgICovXG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnTFJVQ2FjaGUnO1xuICAgIC8qKlxuICAgICAqIEZpbmQgYSB2YWx1ZSBmb3Igd2hpY2ggdGhlIHN1cHBsaWVkIGZuIG1ldGhvZCByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLFxuICAgICAqIHNpbWlsYXIgdG8gYEFycmF5LmZpbmQoKWAuIGZuIGlzIGNhbGxlZCBhcyBgZm4odmFsdWUsIGtleSwgY2FjaGUpYC5cbiAgICAgKi9cbiAgICBmaW5kKGZuLCBnZXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZm4odmFsdWUsIHRoaXMuI2tleUxpc3RbaV0sIHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMuI2tleUxpc3RbaV0sIGdldE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIG9uIGVhY2ggaXRlbSBpbiB0aGUgY2FjaGUsIGluIG9yZGVyIGZyb20gbW9zdFxuICAgICAqIHJlY2VudGx5IHVzZWQgdG8gbGVhc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgKlxuICAgICAqIGBmbmAgaXMgY2FsbGVkIGFzIGBmbih2YWx1ZSwga2V5LCBjYWNoZSlgLlxuICAgICAqXG4gICAgICogSWYgYHRoaXNwYCBpcyBwcm92aWRlZCwgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGB0aGlzYC1jb250ZXh0IG9mXG4gICAgICogdGhlIHByb3ZpZGVkIG9iamVjdCwgb3IgdGhlIGNhY2hlIGlmIG5vIGB0aGlzcGAgb2JqZWN0IGlzIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogRG9lcyBub3QgdXBkYXRlIGFnZSBvciByZWNlbnR5IG9mIHVzZSwgb3IgaXRlcmF0ZSBvdmVyIHN0YWxlIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmb3JFYWNoKGZuLCB0aGlzcCA9IHRoaXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmbi5jYWxsKHRoaXNwLCB2YWx1ZSwgdGhpcy4ja2V5TGlzdFtpXSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMge0BsaW5rIExSVUNhY2hlLmZvckVhY2h9IGJ1dCBpdGVtcyBhcmUgaXRlcmF0ZWQgb3ZlciBpblxuICAgICAqIHJldmVyc2Ugb3JkZXIuICAoaWUsIGxlc3MgcmVjZW50bHkgdXNlZCBpdGVtcyBhcmUgaXRlcmF0ZWQgb3ZlciBmaXJzdC4pXG4gICAgICovXG4gICAgcmZvckVhY2goZm4sIHRoaXNwID0gdGhpcykge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmbi5jYWxsKHRoaXNwLCB2YWx1ZSwgdGhpcy4ja2V5TGlzdFtpXSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIGFueSBzdGFsZSBlbnRyaWVzLiBSZXR1cm5zIHRydWUgaWYgYW55dGhpbmcgd2FzIHJlbW92ZWQsXG4gICAgICogZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1cmdlU3RhbGUoKSB7XG4gICAgICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNyaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpc1N0YWxlKGkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKHRoaXMuI2tleUxpc3RbaV0sICdleHBpcmUnKTtcbiAgICAgICAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsZXRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBleHRlbmRlZCBpbmZvIGFib3V0IGEgZ2l2ZW4gZW50cnksIHRvIGdldCBpdHMgdmFsdWUsIHNpemUsIGFuZFxuICAgICAqIFRUTCBpbmZvIHNpbXVsdGFuZW91c2x5LiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBrZXkgaXMgbm90IHByZXNlbnQuXG4gICAgICpcbiAgICAgKiBVbmxpa2Uge0BsaW5rIExSVUNhY2hlI2R1bXB9LCB3aGljaCBpcyBkZXNpZ25lZCB0byBiZSBwb3J0YWJsZSBhbmQgc3Vydml2ZVxuICAgICAqIHNlcmlhbGl6YXRpb24sIHRoZSBgc3RhcnRgIHZhbHVlIGlzIGFsd2F5cyB0aGUgY3VycmVudCB0aW1lc3RhbXAsIGFuZCB0aGVcbiAgICAgKiBgdHRsYCBpcyBhIGNhbGN1bGF0ZWQgcmVtYWluaW5nIHRpbWUgdG8gbGl2ZSAobmVnYXRpdmUgaWYgZXhwaXJlZCkuXG4gICAgICpcbiAgICAgKiBBbHdheXMgcmV0dXJucyBzdGFsZSB2YWx1ZXMsIGlmIHRoZWlyIGluZm8gaXMgZm91bmQgaW4gdGhlIGNhY2hlLCBzbyBiZVxuICAgICAqIHN1cmUgdG8gY2hlY2sgZm9yIGV4cGlyYXRpb25zIChpZSwgYSBuZWdhdGl2ZSB7QGxpbmsgTFJVQ2FjaGUuRW50cnkjdHRsfSlcbiAgICAgKiBpZiByZWxldmFudC5cbiAgICAgKi9cbiAgICBpbmZvKGtleSkge1xuICAgICAgICBjb25zdCBpID0gdGhpcy4ja2V5TWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoaSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgOiB2O1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0geyB2YWx1ZSB9O1xuICAgICAgICBpZiAodGhpcy4jdHRscyAmJiB0aGlzLiNzdGFydHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHR0bCA9IHRoaXMuI3R0bHNbaV07XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuI3N0YXJ0c1tpXTtcbiAgICAgICAgICAgIGlmICh0dGwgJiYgc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1haW4gPSB0dGwgLSAocGVyZi5ub3coKSAtIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICBlbnRyeS50dGwgPSByZW1haW47XG4gICAgICAgICAgICAgICAgZW50cnkuc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgICAgICAgZW50cnkuc2l6ZSA9IHRoaXMuI3NpemVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIGFycmF5IG9mIFtrZXksIHtAbGluayBMUlVDYWNoZS5FbnRyeX1dIHR1cGxlcyB3aGljaCBjYW4gYmVcbiAgICAgKiBwYXNzZWQgdG8ge0BsaW5rIExSTFVDYWNoZSNsb2FkfS5cbiAgICAgKlxuICAgICAqIFRoZSBgc3RhcnRgIGZpZWxkcyBhcmUgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlIGBEYXRlLm5vdygpYFxuICAgICAqIHRpbWVzdGFtcCwgZXZlbiBpZiBgcGVyZm9ybWFuY2Uubm93KClgIGlzIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIFN0YWxlIGVudHJpZXMgYXJlIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgYGR1bXBgLCBldmVuIGlmXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGV9IGlzIGZhbHNlLlxuICAgICAqXG4gICAgICogTm90ZTogdGhpcyByZXR1cm5zIGFuIGFjdHVhbCBhcnJheSwgbm90IGEgZ2VuZXJhdG9yLCBzbyBpdCBjYW4gYmUgbW9yZVxuICAgICAqIGVhc2lseSBwYXNzZWQgYXJvdW5kLlxuICAgICAqL1xuICAgIGR1bXAoKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuI2tleUxpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgICAgICA6IHY7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBrZXkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0geyB2YWx1ZSB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuI3R0bHMgJiYgdGhpcy4jc3RhcnRzKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHRsID0gdGhpcy4jdHRsc1tpXTtcbiAgICAgICAgICAgICAgICAvLyBhbHdheXMgZHVtcCB0aGUgc3RhcnQgcmVsYXRpdmUgdG8gYSBwb3J0YWJsZSB0aW1lc3RhbXBcbiAgICAgICAgICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgICAgICAgICBjb25zdCBhZ2UgPSBwZXJmLm5vdygpIC0gdGhpcy4jc3RhcnRzW2ldO1xuICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC0gYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgICAgICAgICAgIGVudHJ5LnNpemUgPSB0aGlzLiNzaXplc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyci51bnNoaWZ0KFtrZXksIGVudHJ5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzZXQgdGhlIGNhY2hlIGFuZCBsb2FkIGluIHRoZSBpdGVtcyBpbiBlbnRyaWVzIGluIHRoZSBvcmRlciBsaXN0ZWQuXG4gICAgICpcbiAgICAgKiBUaGUgc2hhcGUgb2YgdGhlIHJlc3VsdGluZyBjYWNoZSBtYXkgYmUgZGlmZmVyZW50IGlmIHRoZSBzYW1lIG9wdGlvbnMgYXJlXG4gICAgICogbm90IHVzZWQgaW4gYm90aCBjYWNoZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYHN0YXJ0YCBmaWVsZHMgYXJlIGFzc3VtZWQgdG8gYmUgY2FsY3VsYXRlZCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlXG4gICAgICogYERhdGUubm93KClgIHRpbWVzdGFtcCwgZXZlbiBpZiBgcGVyZm9ybWFuY2Uubm93KClgIGlzIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBsb2FkKGFycikge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIGFycikge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgLy8gZW50cnkuc3RhcnQgaXMgYSBwb3J0YWJsZSB0aW1lc3RhbXAsIGJ1dCB3ZSBtYXkgYmUgdXNpbmdcbiAgICAgICAgICAgICAgICAvLyBub2RlJ3MgcGVyZm9ybWFuY2Uubm93KCksIHNvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gd2UgZ2V0IHRoZSBpbnRlbmRlZCByZW1haW5pbmcgVFRMLCBubyBtYXR0ZXIgaG93IGxvbmcgaXQnc1xuICAgICAgICAgICAgICAgIC8vIGJlZW4gb24gaWNlLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaXQncyBvayBmb3IgdGhpcyB0byBiZSBhIGJpdCBzbG93LCBpdCdzIGEgcmFyZSBvcGVyYXRpb24uXG4gICAgICAgICAgICAgICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGVudHJ5LnN0YXJ0O1xuICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0ID0gcGVyZi5ub3coKSAtIGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgZW50cnkudmFsdWUsIGVudHJ5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSB2YWx1ZSB0byB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBOb3RlOiBpZiBgdW5kZWZpbmVkYCBpcyBzcGVjaWZpZWQgYXMgYSB2YWx1ZSwgdGhpcyBpcyBhbiBhbGlhcyBmb3JcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUjZGVsZXRlfVxuICAgICAqXG4gICAgICogRmllbGRzIG9uIHRoZSB7QGxpbmsgTFJVQ2FjaGUuU2V0T3B0aW9uc30gb3B0aW9ucyBwYXJhbSB3aWxsIG92ZXJyaWRlXG4gICAgICogdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMgZm9yIHRoZSBzY29wZVxuICAgICAqIG9mIHRoaXMgc2luZ2xlIGBzZXQoKWAgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogSWYgYHN0YXJ0YCBpcyBwcm92aWRlZCwgdGhlbiB0aGF0IHdpbGwgc2V0IHRoZSBlZmZlY3RpdmUgc3RhcnRcbiAgICAgKiB0aW1lIGZvciB0aGUgVFRMIGNhbGN1bGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBtdXN0IGJlIGEgcHJldmlvdXNcbiAgICAgKiB2YWx1ZSBvZiBgcGVyZm9ybWFuY2Uubm93KClgIGlmIHN1cHBvcnRlZCwgb3IgYSBwcmV2aW91cyB2YWx1ZSBvZlxuICAgICAqIGBEYXRlLm5vdygpYCBpZiBub3QuXG4gICAgICpcbiAgICAgKiBPcHRpb25zIG9iamVjdCBtYXkgYWxzbyBpbmNsdWRlIGBzaXplYCwgd2hpY2ggd2lsbCBwcmV2ZW50XG4gICAgICogY2FsbGluZyB0aGUgYHNpemVDYWxjdWxhdGlvbmAgZnVuY3Rpb24gYW5kIGp1c3QgdXNlIHRoZSBzcGVjaWZpZWRcbiAgICAgKiBudW1iZXIgaWYgaXQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBhbmQgYG5vRGlzcG9zZU9uU2V0YCB3aGljaFxuICAgICAqIHdpbGwgcHJldmVudCBjYWxsaW5nIGEgYGRpc3Bvc2VgIGZ1bmN0aW9uIGluIHRoZSBjYXNlIG9mXG4gICAgICogb3ZlcndyaXRlcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBgc2l6ZWAgKG9yIHJldHVybiB2YWx1ZSBvZiBgc2l6ZUNhbGN1bGF0aW9uYCkgZm9yIGEgZ2l2ZW5cbiAgICAgKiBlbnRyeSBpcyBncmVhdGVyIHRoYW4gYG1heEVudHJ5U2l6ZWAsIHRoZW4gdGhlIGl0ZW0gd2lsbCBub3QgYmVcbiAgICAgKiBhZGRlZCB0byB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBXaWxsIHVwZGF0ZSB0aGUgcmVjZW5jeSBvZiB0aGUgZW50cnkuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgdmFsdWUgaXMgYHVuZGVmaW5lZGAsIHRoZW4gdGhpcyBpcyBhbiBhbGlhcyBmb3JcbiAgICAgKiBgY2FjaGUuZGVsZXRlKGtleSlgLiBgdW5kZWZpbmVkYCBpcyBuZXZlciBzdG9yZWQgaW4gdGhlIGNhY2hlLlxuICAgICAqL1xuICAgIHNldChrLCB2LCBzZXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGUoayk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHR0bCA9IHRoaXMudHRsLCBzdGFydCwgbm9EaXNwb3NlT25TZXQgPSB0aGlzLm5vRGlzcG9zZU9uU2V0LCBzaXplQ2FsY3VsYXRpb24gPSB0aGlzLnNpemVDYWxjdWxhdGlvbiwgc3RhdHVzLCB9ID0gc2V0T3B0aW9ucztcbiAgICAgICAgbGV0IHsgbm9VcGRhdGVUVEwgPSB0aGlzLm5vVXBkYXRlVFRMIH0gPSBzZXRPcHRpb25zO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy4jcmVxdWlyZVNpemUoaywgdiwgc2V0T3B0aW9ucy5zaXplIHx8IDAsIHNpemVDYWxjdWxhdGlvbik7XG4gICAgICAgIC8vIGlmIHRoZSBpdGVtIGRvZXNuJ3QgZml0LCBkb24ndCBkbyBhbnl0aGluZ1xuICAgICAgICAvLyBOQjogbWF4RW50cnlTaXplIHNldCB0byBtYXhTaXplIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKHRoaXMubWF4RW50cnlTaXplICYmIHNpemUgPiB0aGlzLm1heEVudHJ5U2l6ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQgPSAnbWlzcyc7XG4gICAgICAgICAgICAgICAgc3RhdHVzLm1heEVudHJ5U2l6ZUV4Y2VlZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhhdmUgdG8gZGVsZXRlLCBpbiBjYXNlIHNvbWV0aGluZyBpcyB0aGVyZSBhbHJlYWR5LlxuICAgICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdzZXQnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuI3NpemUgPT09IDAgPyB1bmRlZmluZWQgOiB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gYWRkaXRpb25cbiAgICAgICAgICAgIGluZGV4ID0gKHRoaXMuI3NpemUgPT09IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMuI3RhaWxcbiAgICAgICAgICAgICAgICA6IHRoaXMuI2ZyZWUubGVuZ3RoICE9PSAwXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy4jZnJlZS5wb3AoKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuI3NpemUgPT09IHRoaXMuI21heFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLiNldmljdChmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy4jc2l6ZSk7XG4gICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2luZGV4XSA9IGs7XG4gICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IHY7XG4gICAgICAgICAgICB0aGlzLiNrZXlNYXAuc2V0KGssIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuI25leHRbdGhpcy4jdGFpbF0gPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMuI3ByZXZbaW5kZXhdID0gdGhpcy4jdGFpbDtcbiAgICAgICAgICAgIHRoaXMuI3RhaWwgPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMuI3NpemUrKztcbiAgICAgICAgICAgIHRoaXMuI2FkZEl0ZW1TaXplKGluZGV4LCBzaXplLCBzdGF0dXMpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICBzdGF0dXMuc2V0ID0gJ2FkZCc7XG4gICAgICAgICAgICBub1VwZGF0ZVRUTCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gdXBkYXRlXG4gICAgICAgICAgICB0aGlzLiNtb3ZlVG9UYWlsKGluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHYgIT09IG9sZFZhbCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNGZXRjaE1ldGhvZCAmJiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaChvbGRWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZFZhbC5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ3JlcGxhY2VkJykpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IF9fc3RhbGVXaGlsZUZldGNoaW5nOiBzIH0gPSBvbGRWYWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzICE9PSB1bmRlZmluZWQgJiYgIW5vRGlzcG9zZU9uU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2U/LihzLCBrLCAnc2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3MsIGssICdzZXQnXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIW5vRGlzcG9zZU9uU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4ob2xkVmFsLCBrLCAnc2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW29sZFZhbCwgaywgJ3NldCddKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLiNyZW1vdmVJdGVtU2l6ZShpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jYWRkSXRlbVNpemUoaW5kZXgsIHNpemUsIHN0YXR1cyk7XG4gICAgICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSB2O1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldCA9ICdyZXBsYWNlJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBvbGRWYWwgJiYgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2gob2xkVmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBvbGRWYWwuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogb2xkVmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5vbGRWYWx1ZSA9IG9sZFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQgPSAndXBkYXRlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHRsICE9PSAwICYmICF0aGlzLiN0dGxzKSB7XG4gICAgICAgICAgICB0aGlzLiNpbml0aWFsaXplVFRMVHJhY2tpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jdHRscykge1xuICAgICAgICAgICAgaWYgKCFub1VwZGF0ZVRUTCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI3NldEl0ZW1UVEwoaW5kZXgsIHR0bCwgc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFub0Rpc3Bvc2VPblNldCAmJiB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWQ7XG4gICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmljdCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtLCByZXR1cm5pbmcgaXRzIHZhbHVlIG9yXG4gICAgICogYHVuZGVmaW5lZGAgaWYgY2FjaGUgaXMgZW1wdHkuXG4gICAgICovXG4gICAgcG9wKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuI3NpemUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLiN2YWxMaXN0W3RoaXMuI2hlYWRdO1xuICAgICAgICAgICAgICAgIHRoaXMuI2V2aWN0KHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuX19zdGFsZVdoaWxlRmV0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZDtcbiAgICAgICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICNldmljdChmcmVlKSB7XG4gICAgICAgIGNvbnN0IGhlYWQgPSB0aGlzLiNoZWFkO1xuICAgICAgICBjb25zdCBrID0gdGhpcy4ja2V5TGlzdFtoZWFkXTtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaGVhZF07XG4gICAgICAgIGlmICh0aGlzLiNoYXNGZXRjaE1ldGhvZCAmJiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2V2aWN0ZWQnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy4jaGFzRGlzcG9zZSB8fCB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYsIGssICdldmljdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFt2LCBrLCAnZXZpY3QnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUoaGVhZCk7XG4gICAgICAgIC8vIGlmIHdlIGFyZW4ndCBhYm91dCB0byB1c2UgdGhlIGluZGV4LCB0aGVuIG51bGwgdGhlc2Ugb3V0XG4gICAgICAgIGlmIChmcmVlKSB7XG4gICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2hlYWRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtoZWFkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuI2ZyZWUucHVzaChoZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc2l6ZSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI3RhaWwgPSAwO1xuICAgICAgICAgICAgdGhpcy4jZnJlZS5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI25leHRbaGVhZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4ja2V5TWFwLmRlbGV0ZShrKTtcbiAgICAgICAgdGhpcy4jc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaGVhZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBrZXkgaXMgaW4gdGhlIGNhY2hlLCB3aXRob3V0IHVwZGF0aW5nIHRoZSByZWNlbmN5IG9mIHVzZS5cbiAgICAgKiBXaWxsIHJldHVybiBmYWxzZSBpZiB0aGUgaXRlbSBpcyBzdGFsZSwgZXZlbiB0aG91Z2ggaXQgaXMgdGVjaG5pY2FsbHlcbiAgICAgKiBpbiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBDaGVjayBpZiBhIGtleSBpcyBpbiB0aGUgY2FjaGUsIHdpdGhvdXQgdXBkYXRpbmcgdGhlIHJlY2VuY3kgb2ZcbiAgICAgKiB1c2UuIEFnZSBpcyB1cGRhdGVkIGlmIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkhhc30gaXMgc2V0XG4gICAgICogdG8gYHRydWVgIGluIGVpdGhlciB0aGUgb3B0aW9ucyBvciB0aGUgY29uc3RydWN0b3IuXG4gICAgICpcbiAgICAgKiBXaWxsIHJldHVybiBgZmFsc2VgIGlmIHRoZSBpdGVtIGlzIHN0YWxlLCBldmVuIHRob3VnaCBpdCBpcyB0ZWNobmljYWxseSBpblxuICAgICAqIHRoZSBjYWNoZS4gVGhlIGRpZmZlcmVuY2UgY2FuIGJlIGRldGVybWluZWQgKGlmIGl0IG1hdHRlcnMpIGJ5IHVzaW5nIGFcbiAgICAgKiBgc3RhdHVzYCBhcmd1bWVudCwgYW5kIGluc3BlY3RpbmcgdGhlIGBoYXNgIGZpZWxkLlxuICAgICAqXG4gICAgICogV2lsbCBub3QgdXBkYXRlIGl0ZW0gYWdlIHVubGVzc1xuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkhhc30gaXMgc2V0LlxuICAgICAqL1xuICAgIGhhcyhrLCBoYXNPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyB1cGRhdGVBZ2VPbkhhcyA9IHRoaXMudXBkYXRlQWdlT25IYXMsIHN0YXR1cyB9ID0gaGFzT3B0aW9ucztcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpICYmXG4gICAgICAgICAgICAgICAgdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLiNpc1N0YWxlKGluZGV4KSkge1xuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVBZ2VPbkhhcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiN1cGRhdGVJdGVtQWdlKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuaGFzID0gJ2hpdCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuaGFzID0gJ3N0YWxlJztcbiAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBzdGF0dXMuaGFzID0gJ21pc3MnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlrZSB7QGxpbmsgTFJVQ2FjaGUjZ2V0fSBidXQgZG9lc24ndCB1cGRhdGUgcmVjZW5jeSBvciBkZWxldGUgc3RhbGVcbiAgICAgKiBpdGVtcy5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGl0ZW0gaXMgc3RhbGUsIHVubGVzc1xuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlfSBpcyBzZXQuXG4gICAgICovXG4gICAgcGVlayhrLCBwZWVrT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0gcGVla09wdGlvbnM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICghYWxsb3dTdGFsZSAmJiB0aGlzLiNpc1N0YWxlKGluZGV4KSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgIC8vIGVpdGhlciBzdGFsZSBhbmQgYWxsb3dlZCwgb3IgZm9yY2luZyBhIHJlZnJlc2ggb2Ygbm9uLXN0YWxlIHZhbHVlXG4gICAgICAgIHJldHVybiB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiB2O1xuICAgIH1cbiAgICAjYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHYgPSBpbmRleCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWMgPSBuZXcgQUMoKTtcbiAgICAgICAgY29uc3QgeyBzaWduYWwgfSA9IG9wdGlvbnM7XG4gICAgICAgIC8vIHdoZW4vaWYgb3VyIEFDIHNpZ25hbHMsIHRoZW4gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlaXJzLlxuICAgICAgICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gYWMuYWJvcnQoc2lnbmFsLnJlYXNvbiksIHtcbiAgICAgICAgICAgIHNpZ25hbDogYWMuc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZmV0Y2hPcHRzID0ge1xuICAgICAgICAgICAgc2lnbmFsOiBhYy5zaWduYWwsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2IgPSAodiwgdXBkYXRlQ2FjaGUgPSBmYWxzZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhYm9ydGVkIH0gPSBhYy5zaWduYWw7XG4gICAgICAgICAgICBjb25zdCBpZ25vcmVBYm9ydCA9IG9wdGlvbnMuaWdub3JlRmV0Y2hBYm9ydCAmJiB2ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWJvcnRlZCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hBYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hFcnJvciA9IGFjLnNpZ25hbC5yZWFzb247XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVBYm9ydClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoQWJvcnRJZ25vcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhYm9ydGVkICYmICFpZ25vcmVBYm9ydCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2hGYWlsKGFjLnNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWl0aGVyIHdlIGRpZG4ndCBhYm9ydCwgYW5kIGFyZSBzdGlsbCBoZXJlLCBvciB3ZSBkaWQsIGFuZCBpZ25vcmVkXG4gICAgICAgICAgICBjb25zdCBiZiA9IHA7XG4gICAgICAgICAgICBpZiAodGhpcy4jdmFsTGlzdFtpbmRleF0gPT09IHApIHtcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiZi5fX3N0YWxlV2hpbGVGZXRjaGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZShrLCAnZmV0Y2gnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoaywgdiwgZmV0Y2hPcHRzLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlYiA9IChlcikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hFcnJvciA9IGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZldGNoRmFpbChlcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZldGNoRmFpbCA9IChlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhYm9ydGVkIH0gPSBhYy5zaWduYWw7XG4gICAgICAgICAgICBjb25zdCBhbGxvd1N0YWxlQWJvcnRlZCA9IGFib3J0ZWQgJiYgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0O1xuICAgICAgICAgICAgY29uc3QgYWxsb3dTdGFsZSA9IGFsbG93U3RhbGVBYm9ydGVkIHx8IG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgICAgICAgICBjb25zdCBub0RlbGV0ZSA9IGFsbG93U3RhbGUgfHwgb3B0aW9ucy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgICAgICAgICBjb25zdCBiZiA9IHA7XG4gICAgICAgICAgICBpZiAodGhpcy4jdmFsTGlzdFtpbmRleF0gPT09IHApIHtcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhbGxvdyBzdGFsZSBvbiBmZXRjaCByZWplY3Rpb25zLCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgICAgICAgICAvLyB0aGUgc3RhbGUgdmFsdWUgaXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUgd2hlbiB0aGUgZmV0Y2ggZmFpbHMuXG4gICAgICAgICAgICAgICAgY29uc3QgZGVsID0gIW5vRGVsZXRlIHx8IGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGRlbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNkZWxldGUoaywgJ2ZldGNoJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFhbGxvd1N0YWxlQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCByZXBsYWNlIHRoZSAqcHJvbWlzZSogd2l0aCB0aGUgc3RhbGUgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGFyZSBkb25lIHdpdGggdGhlIHByb21pc2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICAgICAgLy8gbGVhdmUgaXQgdW50b3VjaGVkIGlmIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIGFuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFib3J0ZWQgYmFja2dyb3VuZCBmZXRjaCB0aGF0IGhhc24ndCB5ZXQgcmV0dXJuZWQuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbG93U3RhbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMgJiYgYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmYuX19yZXR1cm5lZCA9PT0gYmYpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGNhbGwgPSAocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZtcCA9IHRoaXMuI2ZldGNoTWV0aG9kPy4oaywgdiwgZmV0Y2hPcHRzKTtcbiAgICAgICAgICAgIGlmIChmbXAgJiYgZm1wIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIGZtcC50aGVuKHYgPT4gcmVzKHYgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHYpLCByZWopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWdub3JlZCwgd2UgZ28gdW50aWwgd2UgZmluaXNoLCByZWdhcmRsZXNzLlxuICAgICAgICAgICAgLy8gZGVmZXIgY2hlY2sgdW50aWwgd2UgYXJlIGFjdHVhbGx5IGFib3J0aW5nLFxuICAgICAgICAgICAgLy8gc28gZmV0Y2hNZXRob2QgY2FuIG92ZXJyaWRlLlxuICAgICAgICAgICAgYWMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0IHx8XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCkge1xuICAgICAgICAgICAgICAgICAgICByZXModW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBpdCBldmVudHVhbGx5IHJlc29sdmVzLCB1cGRhdGUgdGhlIGNhY2hlLlxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB2ID0+IGNiKHYsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zLnN0YXR1cylcbiAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoRGlzcGF0Y2hlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShwY2FsbCkudGhlbihjYiwgZWIpO1xuICAgICAgICBjb25zdCBiZiA9IE9iamVjdC5hc3NpZ24ocCwge1xuICAgICAgICAgICAgX19hYm9ydENvbnRyb2xsZXI6IGFjLFxuICAgICAgICAgICAgX19zdGFsZVdoaWxlRmV0Y2hpbmc6IHYsXG4gICAgICAgICAgICBfX3JldHVybmVkOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gaW50ZXJuYWwsIGRvbid0IGV4cG9zZSBzdGF0dXMuXG4gICAgICAgICAgICB0aGlzLnNldChrLCBiZiwgeyAuLi5mZXRjaE9wdHMub3B0aW9ucywgc3RhdHVzOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IGJmO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZjtcbiAgICB9XG4gICAgI2lzQmFja2dyb3VuZEZldGNoKHApIHtcbiAgICAgICAgaWYgKCF0aGlzLiNoYXNGZXRjaE1ldGhvZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgYiA9IHA7XG4gICAgICAgIHJldHVybiAoISFiICYmXG4gICAgICAgICAgICBiIGluc3RhbmNlb2YgUHJvbWlzZSAmJlxuICAgICAgICAgICAgYi5oYXNPd25Qcm9wZXJ0eSgnX19zdGFsZVdoaWxlRmV0Y2hpbmcnKSAmJlxuICAgICAgICAgICAgYi5fX2Fib3J0Q29udHJvbGxlciBpbnN0YW5jZW9mIEFDKTtcbiAgICB9XG4gICAgYXN5bmMgZmV0Y2goaywgZmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBcbiAgICAgICAgLy8gZ2V0IG9wdGlvbnNcbiAgICAgICAgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSwgdXBkYXRlQWdlT25HZXQgPSB0aGlzLnVwZGF0ZUFnZU9uR2V0LCBub0RlbGV0ZU9uU3RhbGVHZXQgPSB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCwgXG4gICAgICAgIC8vIHNldCBvcHRpb25zXG4gICAgICAgIHR0bCA9IHRoaXMudHRsLCBub0Rpc3Bvc2VPblNldCA9IHRoaXMubm9EaXNwb3NlT25TZXQsIHNpemUgPSAwLCBzaXplQ2FsY3VsYXRpb24gPSB0aGlzLnNpemVDYWxjdWxhdGlvbiwgbm9VcGRhdGVUVEwgPSB0aGlzLm5vVXBkYXRlVFRMLCBcbiAgICAgICAgLy8gZmV0Y2ggZXhjbHVzaXZlIG9wdGlvbnNcbiAgICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sIGFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiwgaWdub3JlRmV0Y2hBYm9ydCA9IHRoaXMuaWdub3JlRmV0Y2hBYm9ydCwgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCwgY29udGV4dCwgZm9yY2VSZWZyZXNoID0gZmFsc2UsIHN0YXR1cywgc2lnbmFsLCB9ID0gZmV0Y2hPcHRpb25zO1xuICAgICAgICBpZiAoIXRoaXMuI2hhc0ZldGNoTWV0aG9kKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdnZXQnO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGssIHtcbiAgICAgICAgICAgICAgICBhbGxvd1N0YWxlLFxuICAgICAgICAgICAgICAgIHVwZGF0ZUFnZU9uR2V0LFxuICAgICAgICAgICAgICAgIG5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgYWxsb3dTdGFsZSxcbiAgICAgICAgICAgIHVwZGF0ZUFnZU9uR2V0LFxuICAgICAgICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgICAgICAgdHRsLFxuICAgICAgICAgICAgbm9EaXNwb3NlT25TZXQsXG4gICAgICAgICAgICBzaXplLFxuICAgICAgICAgICAgc2l6ZUNhbGN1bGF0aW9uLFxuICAgICAgICAgICAgbm9VcGRhdGVUVEwsXG4gICAgICAgICAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICAgICAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbixcbiAgICAgICAgICAgIGFsbG93U3RhbGVPbkZldGNoQWJvcnQsXG4gICAgICAgICAgICBpZ25vcmVGZXRjaEFib3J0LFxuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSAnbWlzcyc7XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy4jYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KTtcbiAgICAgICAgICAgIHJldHVybiAocC5fX3JldHVybmVkID0gcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbiBjYWNoZSwgbWF5YmUgYWxyZWFkeSBmZXRjaGluZ1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhbGUgPSBhbGxvd1N0YWxlICYmIHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdpbmZsaWdodCc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWxlID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6ICh2Ll9fcmV0dXJuZWQgPSB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHdlIGZvcmNlIGEgcmVmcmVzaCwgdGhhdCBtZWFucyBkbyBOT1Qgc2VydmUgdGhlIGNhY2hlZCB2YWx1ZSxcbiAgICAgICAgICAgIC8vIHVubGVzcyB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiByZWZyZXNoaW5nIHRoZSBjYWNoZS5cbiAgICAgICAgICAgIGNvbnN0IGlzU3RhbGUgPSB0aGlzLiNpc1N0YWxlKGluZGV4KTtcbiAgICAgICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmICFpc1N0YWxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmZldGNoID0gJ2hpdCc7XG4gICAgICAgICAgICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UoaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBvaywgaXQgaXMgc3RhbGUgb3IgYSBmb3JjZWQgcmVmcmVzaCwgYW5kIG5vdCBhbHJlYWR5IGZldGNoaW5nLlxuICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgY2FjaGUuXG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy4jYmFja2dyb3VuZEZldGNoKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IGhhc1N0YWxlID0gcC5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc3RhbGVWYWwgPSBoYXNTdGFsZSAmJiBhbGxvd1N0YWxlO1xuICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9IGlzU3RhbGUgPyAnc3RhbGUnIDogJ3JlZnJlc2gnO1xuICAgICAgICAgICAgICAgIGlmIChzdGFsZVZhbCAmJiBpc1N0YWxlKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhbGVWYWwgPyBwLl9fc3RhbGVXaGlsZUZldGNoaW5nIDogKHAuX19yZXR1cm5lZCA9IHApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGZvcmNlRmV0Y2goaywgZmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgdiA9IGF3YWl0IHRoaXMuZmV0Y2goaywgZmV0Y2hPcHRpb25zKTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmV0Y2goKSByZXR1cm5lZCB1bmRlZmluZWQnKTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIG1lbW8oaywgbWVtb09wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBtZW1vTWV0aG9kID0gdGhpcy4jbWVtb01ldGhvZDtcbiAgICAgICAgaWYgKCFtZW1vTWV0aG9kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIG1lbW9NZXRob2QgcHJvdmlkZWQgdG8gY29uc3RydWN0b3InKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGNvbnRleHQsIGZvcmNlUmVmcmVzaCwgLi4ub3B0aW9ucyB9ID0gbWVtb09wdGlvbnM7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLmdldChrLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgdiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNvbnN0IHZ2ID0gbWVtb01ldGhvZChrLCB2LCB7XG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0KGssIHZ2LCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHZ2O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB2YWx1ZSBmcm9tIHRoZSBjYWNoZS4gV2lsbCB1cGRhdGUgdGhlIHJlY2VuY3kgb2YgdGhlIGNhY2hlXG4gICAgICogZW50cnkgZm91bmQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgZ2V0KCkgd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZ2V0KGssIGdldE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUsIHVwZGF0ZUFnZU9uR2V0ID0gdGhpcy51cGRhdGVBZ2VPbkdldCwgbm9EZWxldGVPblN0YWxlR2V0ID0gdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQsIHN0YXR1cywgfSA9IGdldE9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBmZXRjaGluZyA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmdldCA9ICdzdGFsZSc7XG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlIG9ubHkgaWYgbm90IGFuIGluLWZsaWdodCBiYWNrZ3JvdW5kIGZldGNoXG4gICAgICAgICAgICAgICAgaWYgKCFmZXRjaGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vRGVsZXRlT25TdGFsZUdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdleHBpcmUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYmIGFsbG93U3RhbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd1N0YWxlID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1N0YWxlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93U3RhbGUgPyB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0ID0gJ2hpdCc7XG4gICAgICAgICAgICAgICAgLy8gaWYgd2UncmUgY3VycmVudGx5IGZldGNoaW5nIGl0LCB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIGl0IHlldFxuICAgICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHN0YWxlLCB3aGljaCBtZWFucyB0aGlzIGlzbid0IGEgc3RhbGVXaGlsZVJlZmV0Y2hpbmcuXG4gICAgICAgICAgICAgICAgLy8gSWYgaXQncyBub3Qgc3RhbGUsIGFuZCBmZXRjaGluZywgQU5EIGhhcyBhIF9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUsIHRoZW4gdGhhdCBtZWFucyB0aGUgdXNlciBmZXRjaGVkIHdpdGgge2ZvcmNlUmVmcmVzaDp0cnVlfSxcbiAgICAgICAgICAgICAgICAvLyBzbyBpdCdzIHNhZmUgdG8gcmV0dXJuIHRoYXQgdmFsdWUuXG4gICAgICAgICAgICAgICAgaWYgKGZldGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UoaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBzdGF0dXMuZ2V0ID0gJ21pc3MnO1xuICAgICAgICB9XG4gICAgfVxuICAgICNjb25uZWN0KHAsIG4pIHtcbiAgICAgICAgdGhpcy4jcHJldltuXSA9IHA7XG4gICAgICAgIHRoaXMuI25leHRbcF0gPSBuO1xuICAgIH1cbiAgICAjbW92ZVRvVGFpbChpbmRleCkge1xuICAgICAgICAvLyBpZiB0YWlsIGFscmVhZHksIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgLy8gaWYgaGVhZCwgbW92ZSBoZWFkIHRvIG5leHRbaW5kZXhdXG4gICAgICAgIC8vIGVsc2VcbiAgICAgICAgLy8gICBtb3ZlIG5leHRbcHJldltpbmRleF1dIHRvIG5leHRbaW5kZXhdIChoZWFkIGhhcyBubyBwcmV2KVxuICAgICAgICAvLyAgIG1vdmUgcHJldltuZXh0W2luZGV4XV0gdG8gcHJldltpbmRleF1cbiAgICAgICAgLy8gcHJldltpbmRleF0gPSB0YWlsXG4gICAgICAgIC8vIG5leHRbdGFpbF0gPSBpbmRleFxuICAgICAgICAvLyB0YWlsID0gaW5kZXhcbiAgICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLiN0YWlsKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuI2hlYWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNoZWFkID0gdGhpcy4jbmV4dFtpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb25uZWN0KHRoaXMuI3ByZXZbaW5kZXhdLCB0aGlzLiNuZXh0W2luZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNjb25uZWN0KHRoaXMuI3RhaWwsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuI3RhaWwgPSBpbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGEga2V5IG91dCBvZiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSB3YXMgZGVsZXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGRlbGV0ZShrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWxldGUoaywgJ2RlbGV0ZScpO1xuICAgIH1cbiAgICAjZGVsZXRlKGssIHJlYXNvbikge1xuICAgICAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy4jc2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jc2l6ZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNjbGVhcihyZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gdGhpcy4jdmFsTGlzdFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2RlbGV0ZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy4jaGFzRGlzcG9zZSB8fCB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYsIGssIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3YsIGssIHJlYXNvbl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2tleU1hcC5kZWxldGUoayk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaW5kZXhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLiN0YWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiN0YWlsID0gdGhpcy4jcHJldltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuI2hlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2hlYWQgPSB0aGlzLiNuZXh0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpID0gdGhpcy4jcHJldltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNuZXh0W3BpXSA9IHRoaXMuI25leHRbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmkgPSB0aGlzLiNuZXh0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3ByZXZbbmldID0gdGhpcy4jcHJldltpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jc2l6ZS0tO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNmcmVlLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWQ7XG4gICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWxldGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgY2FjaGUgZW50aXJlbHksIHRocm93aW5nIGF3YXkgYWxsIHZhbHVlcy5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NsZWFyKCdkZWxldGUnKTtcbiAgICB9XG4gICAgI2NsZWFyKHJlYXNvbikge1xuICAgICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHRoaXMuI3JpbmRleGVzKHsgYWxsb3dTdGFsZTogdHJ1ZSB9KSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2RlbGV0ZWQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0gdGhpcy4ja2V5TGlzdFtpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKHYsIGssIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZWQ/LnB1c2goW3YsIGssIHJlYXNvbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNrZXlNYXAuY2xlYXIoKTtcbiAgICAgICAgdGhpcy4jdmFsTGlzdC5maWxsKHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuI2tleUxpc3QuZmlsbCh1bmRlZmluZWQpO1xuICAgICAgICBpZiAodGhpcy4jdHRscyAmJiB0aGlzLiNzdGFydHMpIHtcbiAgICAgICAgICAgIHRoaXMuI3R0bHMuZmlsbCgwKTtcbiAgICAgICAgICAgIHRoaXMuI3N0YXJ0cy5maWxsKDApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzaXplcykge1xuICAgICAgICAgICAgdGhpcy4jc2l6ZXMuZmlsbCgwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNoZWFkID0gMDtcbiAgICAgICAgdGhpcy4jdGFpbCA9IDA7XG4gICAgICAgIHRoaXMuI2ZyZWUubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgPSAwO1xuICAgICAgICB0aGlzLiNzaXplID0gMDtcbiAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciAmJiB0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgY29uc3QgZHQgPSB0aGlzLiNkaXNwb3NlZDtcbiAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZUFmdGVyPy4oLi4udGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLG51bGwsbnVsbCxudWxsLG51bGwsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbm5lclwiIDpzdHlsZT1cImNvbXB1dGVkSW5uZXJTdHlsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgPCEtLSBoZWFkZXIgLS0+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib2R5XCIgOnN0eWxlPVwiY29tcHV0ZWRCb2R5U3R5bGVcIj5cbiAgICAgICAgICA8IS0tIGJvZHksIOmrmOW6puiHqumAguW6lCAtLT5cbiAgICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgICAgICAgPCEtLSBmb290ZXIgLS0+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImZvb3RlclwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8c2xvdCBuYW1lPVwiYm94XCI+PC9zbG90PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIGNvbXB1dGVkIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG4vKipcbiAqIGNydWTnmoTlrrnlmajvvIzmoLnmja7lpJbpg6jpq5jluqboh6rpgILlupRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0NvbnRhaW5lclwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaYr+WQpuWbuuWumumrmOW6plxuICAgICAqL1xuICAgIGZpeGVkSGVpZ2h0OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogYm9keeeahOagt+W8j1xuICAgICAqL1xuICAgIGJvZHlTdHlsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBpbm5lcueahOagt+W8j1xuICAgICAqL1xuICAgIGlubmVyU3R5bGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgY29tcHV0ZWRJbm5lclN0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKHByb3BzLmZpeGVkSGVpZ2h0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbWVyZ2UoeyBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiIH0sIHByb3BzLmlubmVyU3R5bGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BzLmlubmVyU3R5bGU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZEJvZHlTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChwcm9wcy5maXhlZEhlaWdodCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKHsgZmxleDogXCJ1bnNldFwiIH0sIHByb3BzLmJvZHlTdHlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMuYm9keVN0eWxlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXB1dGVkSW5uZXJTdHlsZSxcbiAgICAgIGNvbXB1dGVkQm9keVN0eWxlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtY29udGFpbmVyIHtcbiAgJi5jb21wYWN0IHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG4gIHBhZGRpbmc6IDAgMjBweDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAuYm94IHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBmbGV4OiAxO1xuICAgIC5pbm5lciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHRvcDogMDtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgLmhlYWRlciB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuICAgICAgLmJvZHkge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgfVxuICAgICAgLmZvb3RlciB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbm5lclwiIDpzdHlsZT1cImNvbXB1dGVkSW5uZXJTdHlsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgPCEtLSBoZWFkZXIgLS0+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlclwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib2R5XCIgOnN0eWxlPVwiY29tcHV0ZWRCb2R5U3R5bGVcIj5cbiAgICAgICAgICA8IS0tIGJvZHksIOmrmOW6puiHqumAguW6lCAtLT5cbiAgICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgICAgICAgPCEtLSBmb290ZXIgLS0+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImZvb3RlclwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8c2xvdCBuYW1lPVwiYm94XCI+PC9zbG90PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIGNvbXB1dGVkIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG4vKipcbiAqIGNydWTnmoTlrrnlmajvvIzmoLnmja7lpJbpg6jpq5jluqboh6rpgILlupRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0NvbnRhaW5lclwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaYr+WQpuWbuuWumumrmOW6plxuICAgICAqL1xuICAgIGZpeGVkSGVpZ2h0OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogYm9keeeahOagt+W8j1xuICAgICAqL1xuICAgIGJvZHlTdHlsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBpbm5lcueahOagt+W8j1xuICAgICAqL1xuICAgIGlubmVyU3R5bGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgY29tcHV0ZWRJbm5lclN0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKHByb3BzLmZpeGVkSGVpZ2h0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbWVyZ2UoeyBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiIH0sIHByb3BzLmlubmVyU3R5bGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BzLmlubmVyU3R5bGU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZEJvZHlTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChwcm9wcy5maXhlZEhlaWdodCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKHsgZmxleDogXCJ1bnNldFwiIH0sIHByb3BzLmJvZHlTdHlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMuYm9keVN0eWxlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXB1dGVkSW5uZXJTdHlsZSxcbiAgICAgIGNvbXB1dGVkQm9keVN0eWxlXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtY29udGFpbmVyIHtcbiAgJi5jb21wYWN0IHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG4gIHBhZGRpbmc6IDAgMjBweDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAuYm94IHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBmbGV4OiAxO1xuICAgIC5pbm5lciB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHRvcDogMDtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgLmhlYWRlciB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuICAgICAgLmJvZHkge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgfVxuICAgICAgLmZvb3RlciB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGZzLWNvbnRhaW5lciBjbGFzcz1cImZzLWxheW91dC1kZWZhdWx0XCI+XG4gICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci10b3BcIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLXRvcFwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2hcIj48L3Nsb3Q+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItbWlkZGxlXCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci1taWRkbGVcIj48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyXCI+PC9zbG90PlxuICAgICAgICA8c2xvdCBuYW1lPVwidG9vbGJhclwiPjwvc2xvdD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci1ib3R0b21cIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0YWJzXCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDwhLS0g6buY6K6k5o+S5qe9IC0tPlxuICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8IS0tIHRhYmxlIC0tPlxuICAgIDxzbG90IG5hbWU9XCJ0YWJsZVwiPjwvc2xvdD5cblxuICAgIDxzbG90IG5hbWU9XCJmb3JtXCI+IDwvc2xvdD5cblxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWNydWQtZm9vdGVyXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxuICAgICAgICA8c2xvdCBuYW1lPVwicGFnaW5hdGlvblwiPjwvc2xvdD5cbiAgICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuICA8L2ZzLWNvbnRhaW5lcj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG4vKipcbiAqIOm7mOiupOW4g+WxgFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzTGF5b3V0RGVmYXVsdFwiXG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1sYXlvdXQtZGVmYXVsdCB7XG4gIC5mcy10YWJzLWZpbHRlciB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGZzLWNvbnRhaW5lciBjbGFzcz1cImZzLWxheW91dC1kZWZhdWx0XCI+XG4gICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY3J1ZC1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci10b3BcIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLXRvcFwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IG5hbWU9XCJzZWFyY2hcIj48L3Nsb3Q+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1oZWFkZXItbWlkZGxlXCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci1taWRkbGVcIj48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c2xvdCBuYW1lPVwiYWN0aW9uYmFyXCI+PC9zbG90PlxuICAgICAgICA8c2xvdCBuYW1lPVwidG9vbGJhclwiPjwvc2xvdD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci1ib3R0b21cIj5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0YWJzXCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDwhLS0g6buY6K6k5o+S5qe9IC0tPlxuICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8IS0tIHRhYmxlIC0tPlxuICAgIDxzbG90IG5hbWU9XCJ0YWJsZVwiPjwvc2xvdD5cblxuICAgIDxzbG90IG5hbWU9XCJmb3JtXCI+IDwvc2xvdD5cblxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWNydWQtZm9vdGVyXCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxuICAgICAgICA8c2xvdCBuYW1lPVwicGFnaW5hdGlvblwiPjwvc2xvdD5cbiAgICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuICA8L2ZzLWNvbnRhaW5lcj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG4vKipcbiAqIOm7mOiupOW4g+WxgFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzTGF5b3V0RGVmYXVsdFwiXG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1sYXlvdXQtZGVmYXVsdCB7XG4gIC5mcy10YWJzLWZpbHRlciB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGZzLWNvbnRhaW5lciBjbGFzcz1cImZzLWxheW91dC1jYXJkXCI+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+XG4iLCI8dGVtcGxhdGU+XG4gIDxmcy1jb250YWluZXIgY2xhc3M9XCJmcy1sYXlvdXQtY2FyZFwiPlxuICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWhlYWRlci10b3BcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci10b3BcIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjb21wb25lbnQgOmlzPVwiY2FyZENvbXBvbmVudE5hbWVcIiB2LWlmPVwic2VhcmNoU2hvd1wiPlxuICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoXCI+PC9zbG90PlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtaGVhZGVyLWJvdHRvbVwiPlxuICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8ZnMtY29udGFpbmVyPlxuICAgICAgPHRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0YWJzXCI+PC9zbG90PlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDxjb21wb25lbnQgOmlzPVwiY2FyZENvbXBvbmVudE5hbWVcIiBjbGFzcz1cImZzLWxheW91dC1jYXJkLWJvZHlcIj5cbiAgICAgICAgPHRlbXBsYXRlICN0aXRsZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLWJhclwiPlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvbmJhclwiPjwvc2xvdD5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyXCI+PC9zbG90PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLWJhclwiPlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvbmJhclwiPjwvc2xvdD5cbiAgICAgICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyXCI+PC9zbG90PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8ZnMtY29udGFpbmVyPlxuICAgICAgICAgIDwhLS0g6buY6K6k5o+S5qe9IC0tPlxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgICA8IS0tIHRhYmxlIC0tPlxuICAgICAgICAgIDxzbG90IG5hbWU9XCJ0YWJsZVwiPjwvc2xvdD5cbiAgICAgICAgICA8c2xvdCBuYW1lPVwiZm9ybVwiPjwvc2xvdD5cbiAgICAgICAgICA8dGVtcGxhdGUgI2Zvb3Rlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLWZvb3RlclwiPlxuICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwiZm9vdGVyLXRvcFwiPjwvc2xvdD5cbiAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cInBhZ2luYXRpb25cIj48L3Nsb3Q+XG4gICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItYm90dG9tXCI+PC9zbG90PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9mcy1jb250YWluZXI+XG4gICAgICA8L2NvbXBvbmVudD5cbiAgICA8L2ZzLWNvbnRhaW5lcj5cbiAgPC9mcy1jb250YWluZXI+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgaW5qZWN0LCByZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLXVpXCI7XG4vKipcbiAqIGNhcmTluIPlsYBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0xheW91dENhcmRcIixcbiAgc2V0dXAoKSB7XG4gICAgY29uc3QgZ2V0Q3J1ZEJpbmRpbmcgPSBpbmplY3QoXCJnZXQ6Y3J1ZEJpbmRpbmdcIik7XG4gICAgY29uc3Qgc2VhcmNoU2hvdyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChnZXRDcnVkQmluZGluZyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIGdldENydWRCaW5kaW5nKCk/LnNlYXJjaD8uc2hvdztcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG5cbiAgICBjb25zdCBjYXJkQ29tcG9uZW50TmFtZSA9IHJlZih1aS5jYXJkLm5hbWUpO1xuICAgIHJldHVybiB7XG4gICAgICBzZWFyY2hTaG93LFxuICAgICAgY2FyZENvbXBvbmVudE5hbWVcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1sYXlvdXQtY2FyZCB7XG4gICYgPiAuYm94ID4gLmlubmVyID4gLmhlYWRlciB7XG4gICAgbWFyZ2luOiAxMHB4IDEwcHggNXB4IDEwcHg7XG4gIH1cbiAgJiA+IC5ib3ggPiAuaW5uZXIgPiAuYm9keSB7XG4gICAgbWFyZ2luOiA1cHggMTBweCAxMHB4IDEwcHg7XG4gIH1cbiAgLnRvcC1iYXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICB9XG4gIC5mcy1jb250YWluZXIge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgLmJveCB7XG4gICAgICAuaW5uZXIge1xuICAgICAgICAuaGVhZGVyIHtcbiAgICAgICAgICAuYW50LWNhcmQtYm9keSB7XG4gICAgICAgICAgICBwYWRkaW5nOiAxNHB4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAuZnMtbGF5b3V0LWNhcmQtYm9keSB7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgIC5hbnQtY2FyZC1oZWFkIHtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICBwYWRkaW5nOiAwcHg7XG4gICAgICAuYW50LWNhcmQtaGVhZC10aXRsZSB7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmVsLWNhcmRfX2hlYWRlciB7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgIH1cblxuICAgIC5uLWNhcmQtaGVhZGVyIHtcbiAgICAgIHBhZGRpbmc6IDBweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlO1xuICAgIH1cbiAgICAubi1jYXJkX19jb250ZW50IHtcbiAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtYWN0aW9uYmFyIHtcbiAgICAgIG1hcmdpbjogMTBweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cbiAgICAuZnMtY3J1ZC10b29sYmFyIHtcbiAgICAgIG1hcmdpbjogMTBweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cblxuICAgIC5hbnQtY2FyZC1ib2R5IHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgIH1cbiAgICAuZWwtY2FyZF9fYm9keSB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgcGFkZGluZzogMTBweDtcbiAgICB9XG4gIH1cblxuICAuZnMtdGFicy1maWx0ZXIge1xuICAgIG1hcmdpbi1ib3R0b206IC0xcHg7XG4gICAgLm4tdGFicyAubi10YWJzLW5hdi5uLXRhYnMtbmF2LS1jYXJkLXR5cGUgLm4tdGFicy10YWIge1xuICAgICAgJi5uLXRhYnMtdGFiLS1hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgICAgfVxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjYwO1xuICAgIH1cblxuICAgIC5lbC10YWJzLS1jYXJkID4gLmVsLXRhYnNfX2hlYWRlciAuZWwtdGFic19faXRlbSB7XG4gICAgICAmLmlzLWFjdGl2ZSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgICB9XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmODA7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIixudWxsLG51bGwsIjx0ZW1wbGF0ZT5cbiAgPHNwYW4gY2xhc3M9XCJmcy1pY29uaWZ5XCIgOmNsYXNzPVwieyAnZnMtaWNvbmlmeS1zcGluJzogc3BpbiB9XCI+XG4gICAgPEljb24gcmVmPVwiaWNvbmlmeVJlZlwiIDppY29uPVwiaWNvblwiIDppbmxpbmU9XCJ0cnVlXCIgLz5cbiAgPC9zcGFuPlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCBvbk1vdW50ZWQsIHJlZiwgdW5yZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgSWNvbiB9IGZyb20gXCJAaWNvbmlmeS92dWVcIjtcbi8qKlxuICogaWNvbmlmeSDmjInpnIDliqDovb3lm77moIfnu4Tku7ZcbiAqIGh0dHBzOi8vaWNvbmlmeS5kZXNpZ24vaWNvbi1zZXRzL2lvbi9cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0ljb25pZnlcIixcbiAgY29tcG9uZW50czogeyBJY29uIH0sXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5Zu+5qCH5ZCN56ewXG4gICAgICovXG4gICAgaWNvbjoge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDml4vovaxcbiAgICAgKi9cbiAgICBzcGluOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCBpY29uaWZ5UmVmID0gcmVmKG51bGwpO1xuICAgIHJldHVybiB7IGljb25pZnlSZWYgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWljb25pZnkge1xuICAvL2Rpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAmLXNwaW4ge1xuICAgIHN2ZyB7XG4gICAgICBhbmltYXRpb246IGZzTG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XG4gICAgfVxuICB9XG5cbiAgJi5mcy1pY29uIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIGZzTG9hZGluZ0NpcmNsZSB7XG4gIGZyb20ge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG4gIHRvIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICB9XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyBmc0xvYWRpbmdDaXJjbGUge1xuICBmcm9tIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgfVxuICB0byB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxufVxuXG4vL3NwYW4uaWNvbmlmeSB7XG4vLyAgZGlzcGxheTogYmxvY2s7XG4vLyAgbWluLXdpZHRoOiAxZW07XG4vLyAgbWluLWhlaWdodDogMWVtO1xuLy8gIC8vIGJhY2tncm91bmQtY29sb3I6IEBpY29uaWZ5LWJnLWNvbG9yO1xuLy8gIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4vL31cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxzcGFuIGNsYXNzPVwiZnMtaWNvbmlmeVwiIDpjbGFzcz1cInsgJ2ZzLWljb25pZnktc3Bpbic6IHNwaW4gfVwiPlxuICAgIDxJY29uIHJlZj1cImljb25pZnlSZWZcIiA6aWNvbj1cImljb25cIiA6aW5saW5lPVwidHJ1ZVwiIC8+XG4gIDwvc3Bhbj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBuZXh0VGljaywgb25Nb3VudGVkLCByZWYsIHVucmVmLCB3YXRjaCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IEljb24gfSBmcm9tIFwiQGljb25pZnkvdnVlXCI7XG4vKipcbiAqIGljb25pZnkg5oyJ6ZyA5Yqg6L295Zu+5qCH57uE5Lu2XG4gKiBodHRwczovL2ljb25pZnkuZGVzaWduL2ljb24tc2V0cy9pb24vXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNJY29uaWZ5XCIsXG4gIGNvbXBvbmVudHM6IHsgSWNvbiB9LFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOWbvuagh+WQjeensFxuICAgICAqL1xuICAgIGljb246IHtcbiAgICAgIHR5cGU6IFN0cmluZ1xuICAgIH0sXG4gICAgLyoqXG4gICAgICog5peL6L2sXG4gICAgICovXG4gICAgc3Bpbjoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgaWNvbmlmeVJlZiA9IHJlZihudWxsKTtcbiAgICByZXR1cm4geyBpY29uaWZ5UmVmIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1pY29uaWZ5IHtcbiAgLy9kaXNwbGF5OiBpbmxpbmUtZmxleCAhaW1wb3J0YW50O1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgJi1zcGluIHtcbiAgICBzdmcge1xuICAgICAgYW5pbWF0aW9uOiBmc0xvYWRpbmdDaXJjbGUgMXMgaW5maW5pdGUgbGluZWFyO1xuICAgIH1cbiAgfVxuXG4gICYuZnMtaWNvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBmc0xvYWRpbmdDaXJjbGUge1xuICBmcm9tIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgfVxuICB0byB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgZnNMb2FkaW5nQ2lyY2xlIHtcbiAgZnJvbSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgdG8ge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gIH1cbn1cblxuLy9zcGFuLmljb25pZnkge1xuLy8gIGRpc3BsYXk6IGJsb2NrO1xuLy8gIG1pbi13aWR0aDogMWVtO1xuLy8gIG1pbi1oZWlnaHQ6IDFlbTtcbi8vICAvLyBiYWNrZ3JvdW5kLWNvbG9yOiBAaWNvbmlmeS1iZy1jb2xvcjtcbi8vICBib3JkZXItcmFkaXVzOiAxMDAlO1xuLy99XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8c3BhbiA6Y2xhc3M9XCJbJ2ZzLWljb24tc3ZnJywgc3BpbiAmJiAnZnMtaWNvbi1zcGluJ11cIj5cbiAgICA8c3ZnIGNsYXNzPVwiZnMtaWNvbi1zdmctY29udGVudFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgPHVzZSA6eGxpbms6aHJlZj1cInN5bWJvbElkXCI+PC91c2U+XG4gICAgPC9zdmc+XG4gIDwvc3Bhbj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHR5cGUgeyBDU1NQcm9wZXJ0aWVzIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBjb21wdXRlZCB9IGZyb20gXCJ2dWVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1N2Z0ljb25cIixcbiAgcHJvcHM6IHtcbiAgICBpY29uOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgc2l6ZToge1xuICAgICAgdHlwZTogW051bWJlciwgU3RyaW5nXSxcbiAgICAgIGRlZmF1bHQ6IDE2XG4gICAgfSxcbiAgICBzcGluOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHNldHVwKHByb3BzKSB7XG4gICAgY29uc3Qgc3ltYm9sSWQgPSBjb21wdXRlZCgoKSA9PiBgIyR7cHJvcHMuaWNvbn1gKTtcblxuICAgIGNvbnN0IGdldFN0eWxlID0gY29tcHV0ZWQoKCk6IENTU1Byb3BlcnRpZXMgPT4ge1xuICAgICAgY29uc3QgeyBzaXplIH0gPSBwcm9wcztcbiAgICAgIGxldCBzID0gYCR7c2l6ZX1gO1xuICAgICAgcyA9IGAke3MucmVwbGFjZShcInB4XCIsIFwiXCIpfXB4YDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiBzLFxuICAgICAgICBoZWlnaHQ6IHNcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3ltYm9sSWQsIGdldFN0eWxlIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1pY29uLXN2ZyB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgJi5mcy1pY29uLXNwaW4ge1xuICAgIGFuaW1hdGlvbjogbG9hZGluZ0NpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XG4gIH1cblxuICAuZnMtaWNvbi1zdmctY29udGVudCB7XG4gICAgd2lkdGg6IDFlbTtcbiAgICBoZWlnaHQ6IDFlbTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTVlbTtcbiAgICBmaWxsOiBjdXJyZW50Q29sb3I7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPHNwYW4gOmNsYXNzPVwiWydmcy1pY29uLXN2ZycsIHNwaW4gJiYgJ2ZzLWljb24tc3BpbiddXCI+XG4gICAgPHN2ZyBjbGFzcz1cImZzLWljb24tc3ZnLWNvbnRlbnRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDx1c2UgOnhsaW5rOmhyZWY9XCJzeW1ib2xJZFwiPjwvdXNlPlxuICAgIDwvc3ZnPlxuICA8L3NwYW4+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcyB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgY29tcHV0ZWQgfSBmcm9tIFwidnVlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNTdmdJY29uXCIsXG4gIHByb3BzOiB7XG4gICAgaWNvbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIHNpemU6IHtcbiAgICAgIHR5cGU6IFtOdW1iZXIsIFN0cmluZ10sXG4gICAgICBkZWZhdWx0OiAxNlxuICAgIH0sXG4gICAgc3Bpbjoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBzZXR1cChwcm9wcykge1xuICAgIGNvbnN0IHN5bWJvbElkID0gY29tcHV0ZWQoKCkgPT4gYCMke3Byb3BzLmljb259YCk7XG5cbiAgICBjb25zdCBnZXRTdHlsZSA9IGNvbXB1dGVkKCgpOiBDU1NQcm9wZXJ0aWVzID0+IHtcbiAgICAgIGNvbnN0IHsgc2l6ZSB9ID0gcHJvcHM7XG4gICAgICBsZXQgcyA9IGAke3NpemV9YDtcbiAgICAgIHMgPSBgJHtzLnJlcGxhY2UoXCJweFwiLCBcIlwiKX1weGA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogcyxcbiAgICAgICAgaGVpZ2h0OiBzXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB7IHN5bWJvbElkLCBnZXRTdHlsZSB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtaWNvbi1zdmcge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICYuZnMtaWNvbi1zcGluIHtcbiAgICBhbmltYXRpb246IGxvYWRpbmdDaXJjbGUgMXMgaW5maW5pdGUgbGluZWFyO1xuICB9XG5cbiAgLmZzLWljb24tc3ZnLWNvbnRlbnQge1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gICAgdmVydGljYWwtYWxpZ246IC0wLjE1ZW07XG4gICAgZmlsbDogY3VycmVudENvbG9yO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1sYWJlbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJsYWJlbFwiIHYtYmluZD1cImxhYmVsQXR0cnNcIj5cbiAgICAgIHt7IGxhYmVsIH19XG4gICAgICA8c2xvdCBuYW1lPVwibGFiZWxcIj48L3Nsb3Q+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIiB2LWJpbmQ9XCJjb250ZW50QXR0cnNcIj5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcblxuLyoqXG4gKiBsYWJlbOe7hOS7tlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzTGFiZWxcIixcbiAgcHJvcHM6IHtcbiAgICBsYWJlbDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJcIlxuICAgIH0sXG4gICAgbGFiZWxBdHRyczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHt9KVxuICAgIH0sXG4gICAgY29udGVudEF0dHJzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe30pXG4gICAgfVxuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtbGFiZWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAubGFiZWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgIG1pbi13aWR0aDogMTAwcHg7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgfVxuICAuY29udGVudCB7XG4gICAgZmxleDogMTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG1pbi13aWR0aDogMTAwcHg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWxhYmVsXCI+XG4gICAgPGRpdiBjbGFzcz1cImxhYmVsXCIgdi1iaW5kPVwibGFiZWxBdHRyc1wiPlxuICAgICAge3sgbGFiZWwgfX1cbiAgICAgIDxzbG90IG5hbWU9XCJsYWJlbFwiPjwvc2xvdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiIHYtYmluZD1cImNvbnRlbnRBdHRyc1wiPlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuXG4vKipcbiAqIGxhYmVs57uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNMYWJlbFwiLFxuICBwcm9wczoge1xuICAgIGxhYmVsOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcIlwiXG4gICAgfSxcbiAgICBsYWJlbEF0dHJzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe30pXG4gICAgfSxcbiAgICBjb250ZW50QXR0cnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcbiAgICB9XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1sYWJlbCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIC5sYWJlbCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICB9XG4gIC5jb250ZW50IHtcbiAgICBmbGV4OiAxO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCBhcyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNMb2FkaW5nXCJcbn0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gIDxkaXYgdi1pZj1cImxvYWRpbmdcIiBjbGFzcz1cImZzLWxvYWRpbmdcIj5cbiAgICA8ZnMtaWNvbiBjbGFzcz1cImZzLWljb24tc3BpblwiIDppY29uPVwiaWNvbiA/PyB1aS5pY29ucy5yZWZyZXNoXCI+PC9mcy1pY29uPlxuICAgIDxzcGFuIHYtaWY9XCJ0ZXh0XCI+e3sgdGV4dCB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG47XG5jb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICBpY29uPzogc3RyaW5nO1xuICB0ZXh0Pzogc3RyaW5nO1xufT4oKTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtbG9hZGluZyB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAuZnMtaWNvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHdpZHRoOiA5MCU7XG4gICAgaGVpZ2h0OiA5MCU7XG4gICAgbWF4LXdpZHRoOiA1MHB4O1xuICAgIG1heC1oZWlnaHQ6IDUwcHg7XG4gICAgJi5mcy1pY29uLXNwaW4ge1xuICAgICAgc3ZnIHtcbiAgICAgICAgYW5pbWF0aW9uOiBmcy1sb2FkaW5nLWNpcmNsZSAxcyBpbmZpbml0ZSBsaW5lYXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQC13ZWJraXQta2V5ZnJhbWVzIGZzLWxvYWRpbmctY2lyY2xlIHtcbiAgICBmcm9tIHtcbiAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgIH1cbiAgICB0byB7XG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWJveFwiPlxuICAgIDxzbG90Pjwvc2xvdD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcblxuLyoqXG4gKiDljZXnuq/nmoTljIXoo7nkuIDkuKrlrZDnu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0JveFwiXG59KTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtYm94XCI+XG4gICAgPHNsb3Q+PC9zbG90PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuXG4vKipcbiAqIOWNlee6r+eahOWMheijueS4gOS4quWtkOe7hOS7tlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQm94XCJcbn0pO1xuPC9zY3JpcHQ+XG4iLG51bGwsbnVsbCxudWxsLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnRcbiAgICA6aXM9XCJ1aS5mb3JtLm5hbWVcIlxuICAgIHJlZj1cImZvcm1SZWZcIlxuICAgIGNsYXNzPVwiZnMtZm9ybVwiXG4gICAgOmNsYXNzPVwie1xuICAgICAgJ2ZzLWZvcm0tZ3JpZCc6IGRpc3BsYXkgPT09ICdncmlkJyxcbiAgICAgICdmcy1mb3JtLWZsZXgnOiBkaXNwbGF5ID09PSAnZmxleCcsXG4gICAgICAnZnMtZm9ybS1pbnZhbGlkJzogdmFsaWRSZWYgPT09IGZhbHNlXG4gICAgfVwiXG4gICAgb25zdWJtaXQ9XCJldmVudC5wcmV2ZW50RGVmYXVsdCgpO1wiXG4gICAgOm1vZGVsPVwiZm9ybVwiXG4gID5cbiAgICA8IS0tIHJvdyAtLT5cbiAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgY2xhc3M9XCJmcy1yb3dcIiB2LWJpbmQ9XCJyb3dcIj5cbiAgICAgIDwhLS0gY29sIC0tPlxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiaXRlbSBpbiBjb21wdXRlZERlZmF1bHRDb2x1bW5zXCIgOmtleT1cIml0ZW0/LmtleVwiPlxuICAgICAgICA8ZnMtZm9ybS1pdGVtLWNvbFxuICAgICAgICAgIDpyZWY9XCJcbiAgICAgICAgICAgIChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIGZvcm1JdGVtUmVmc1tpdGVtLmtleV0gPSBlbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIFwiXG4gICAgICAgICAgOmNvbD1cIm1lcmdlQ29sKGl0ZW0uY29sKVwiXG4gICAgICAgICAgOml0ZW09XCJpdGVtXCJcbiAgICAgICAgICA6aGVscGVyPVwiaGVscGVyXCJcbiAgICAgICAgICA6bW9kZWwtdmFsdWU9XCJnZXQoZm9ybSwgaXRlbS5rZXkpXCJcbiAgICAgICAgICA6c2xvdHM9XCJtZXJnZWRTbG90c1snZm9ybV8nICsgaXRlbS5rZXldXCJcbiAgICAgICAgICA6Z2V0LWNvbnRleHQtZm49XCJnZXRDb250ZXh0Rm5cIlxuICAgICAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJzZXQoZm9ybSwgaXRlbS5rZXksICRldmVudClcIlxuICAgICAgICAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2NvbXBvbmVudD5cbiAgICA8Y29tcG9uZW50XG4gICAgICA6aXM9XCJjb21wdXRlZEdyb3VwLndyYXBwZXIucGFyZW50XCJcbiAgICAgIHYtaWY9XCJjb21wdXRlZEdyb3VwLndyYXBwZXJcIlxuICAgICAgdi1tb2RlbDpbdWkuY29sbGFwc2UubW9kZWxWYWx1ZV09XCJncm91cEFjdGl2ZUtleVwiXG4gICAgICBzdHlsZT1cIndpZHRoOiAxMDAlXCJcbiAgICAgIHYtYmluZD1cImNvbXB1dGVkR3JvdXBcIlxuICAgID5cbiAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihncm91cEl0ZW0sIGdyb3VwS2V5KSBvZiBjb21wdXRlZEdyb3VwLmdyb3Vwc1wiIDprZXk9XCJncm91cEtleVwiPlxuICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgOmlzPVwiY29tcHV0ZWRHcm91cC53cmFwcGVyLmNoaWxkXCJcbiAgICAgICAgICB2LWlmPVwiZ3JvdXBJdGVtU2hvdyhncm91cEl0ZW0pXCJcbiAgICAgICAgICA6W3VpLmNvbGxhcHNlLmtleU5hbWVdPVwiZ3JvdXBLZXlcIlxuICAgICAgICAgIHYtYmluZD1cImdyb3VwSXRlbVwiXG4gICAgICAgICAgOmNsYXNzPVwieyAnZnMtZm9ybS1ncm91cC1lcnJvcic6IGVycm9yc1JlZlsnZ3JvdXAuJyArIGdyb3VwS2V5XSB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBzbG90TmFtZSkgb2YgZ3JvdXBJdGVtLnNsb3RzXCIgOmtleT1cInNsb3ROYW1lXCIgI1tzbG90TmFtZV09XCJzY29wZVwiPlxuICAgICAgICAgICAgPGZzLXJlbmRlciA6cmVuZGVyLWZ1bmM9XCJpdGVtXCIgOnNjb3BlPVwieyAuLi5zY29wZSwgaGFzRXJyb3I6IGVycm9yc1JlZlsnZ3JvdXAuJyArIGdyb3VwS2V5XSB9XCIgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDwhLS0gcm93IC0tPlxuICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiBjbGFzcz1cImZzLXJvd1wiIHYtYmluZD1cInJvd1wiPlxuICAgICAgICAgICAgPCEtLSBjb2wgLS0+XG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCJrZXkgaW4gZ3JvdXBJdGVtLmNvbHVtbnNcIiA6a2V5PVwia2V5XCI+XG4gICAgICAgICAgICAgIDxmcy1mb3JtLWl0ZW0tY29sXG4gICAgICAgICAgICAgICAgdi1pZj1cImNvbXB1dGVkQ29sdW1uc1trZXldXCJcbiAgICAgICAgICAgICAgICA6cmVmPVwiXG4gICAgICAgICAgICAgICAgICAoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtSXRlbVJlZnNba2V5XSA9IGVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA6Y29sPVwibWVyZ2VDb2woY29tcHV0ZWRDb2x1bW5zW2tleV0uY29sKVwiXG4gICAgICAgICAgICAgICAgOml0ZW09XCJjb21wdXRlZENvbHVtbnNba2V5XVwiXG4gICAgICAgICAgICAgICAgOm1vZGVsLXZhbHVlPVwiZ2V0KGZvcm0sIGtleSlcIlxuICAgICAgICAgICAgICAgIDpzbG90cz1cIm1lcmdlZFNsb3RzWydmb3JtXycgKyBrZXldXCJcbiAgICAgICAgICAgICAgICA6Z2V0LWNvbnRleHQtZm49XCJnZXRDb250ZXh0Rm5cIlxuICAgICAgICAgICAgICAgIDpoZWxwZXI9XCJoZWxwZXJcIlxuICAgICAgICAgICAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJzZXQoZm9ybSwga2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2NvbXBvbmVudD5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHtcbiAgY29tcHV0ZWQsXG4gIGRlZmluZUNvbXBvbmVudCxcbiAgZ2V0Q3VycmVudEluc3RhbmNlLFxuICBvbk1vdW50ZWQsXG4gIHJlYWN0aXZlLFxuICBSZWYsXG4gIHJlZixcbiAgdG9SYXcsXG4gIHVucmVmLFxuICBVbndyYXBOZXN0ZWRSZWZzLFxuICB3YXRjaFxufSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBlYWNoLCBzZXQsIGNsb25lRGVlcCwgZW50cmllcywgZ2V0LCB1bnNldCwgZm9yRWFjaCwgbWVyZ2UgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBDb21wdXRlVmFsdWUsIHVzZUNvbXB1dGUgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1jb21wdXRlXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuLi8uLi91dGlscy91dGlsLmxvZ1wiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS1tZXJnZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBGb3JtU2NvcGVDb250ZXh0LCBTZXRGb3JtRGF0YU9wdGlvbnMsIHVzZVVpLCB1dGlscyB9IGZyb20gXCIuLi8uLi9pbmRleFwiO1xuXG4vKipcbiAqIOmFjee9ruWMlueahOihqOWNlee7hOS7tlxuICog5pq06Zyy55qE5pa55rOV77yaXG4gKiByZWYuc3VibWl0KCkgPSDmj5DkuqTooajljZVcbiAqIHJlZi5yZXNldCgpID0g6YeN572u6KGo5Y2VXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNGb3JtXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5Yid5aeL6KGo5Y2V5pWw5o2uXG4gICAgICoqL1xuICAgIGluaXRpYWxGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlrZfmrrXmqKHniYhcbiAgICAgKiB7XG4gICAgICogICBrZXk6e1xuICAgICAqICAgICB0aXRsZTogXCLlrZfmrrXlkI3np7BcIixcbiAgICAgKiAgICAgY29tcG9uZW50OntcbiAgICAgKiAgICAgICBuYW1lOlwi57uE5Lu25ZCN56ewXCJcbiAgICAgKiAgICAgICAuLi7nu4Tku7blj4LmlbBcbiAgICAgKiAgICAgfVxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiAqL1xuICAgIGNvbHVtbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5a2X5q615YiG57uEXG4gICAgICoge1xuICAgICAqICAgdHlwZToneHh4JywgLy/liIbnu4TlsZXnpLrnsbvlnotcbiAgICAgKiAgIGdyb3Vwczp7IC8v5YiG57uE5pWw5o2uXG4gICAgICogICAgIGdyb3VwS2V5OnsgdGl0bGU6J3h4eCcsY29sdW1uczpbJ2ZpZWxkS2V5JywnZmllbGRLZXknXX1cbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICovXG4gICAgZ3JvdXA6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6YeN572u6KGo5Y2V5ZCO55qE5pON5L2cXG4gICAgICovXG4gICAgZG9SZXNldDoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOeCueWHu+S/neWtmOaMiemSru+8jOihqOWNleagoemqjOWJjeaJp+ihjOaTjeS9nO+8iGFzeW5j77yJXG4gICAgICovXG4gICAgYmVmb3JlVmFsaWRhdGU6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDooajljZXmoKHpqozlrozlrozmiJDlkI7vvIzmj5DkuqTliY3lpITnkIbvvIhhc3luY++8iVxuICAgICAqL1xuICAgIGJlZm9yZVN1Ym1pdDoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOeCueWHu+S/neWtmOaMiemSruaXtuaJp+ihjOaTjeS9nO+8iGFzeW5j77yJXG4gICAgICovXG4gICAgZG9TdWJtaXQ6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDooajljZXmj5DkuqTlkI7lpITnkIbvvIhhc3luY++8iVxuICAgICAqL1xuICAgIGFmdGVyU3VibWl0OiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5o+S5qe95YaF5a65XG4gICAgICovXG4gICAgc2xvdHM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5biD5bGA5pa55byP44CQZmxleHxncmlk44CRXG4gICAgICovXG4gICAgZGlzcGxheToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJmbGV4XCIgLy8gZmxleFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5bqP5Y+377yM57yW6L6R5pe25Lya5Lyg5YWlXG4gICAgICovXG4gICAgaW5kZXg6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5qih5byPIFthZGQsZWRpdCx2aWV3LOiHquWumuS5iV1cbiAgICAgKi9cbiAgICBtb2RlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGEtcm936YWN572uXG4gICAgICovXG4gICAgcm93OiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGVsLWNvbHxhLWNvbOmFjee9ru+8jOWPr+mFjee9rui3qOWIl1xuICAgICAqL1xuICAgIGNvbDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBmb3JtSXRlbeeahOWFrOWFsemFjee9rlxuICAgICAqL1xuICAgIGZvcm1JdGVtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGhlbHBlcuS9jee9ru+8mntwb3NpdGlvbjonbGFiZWwnfVxuICAgICAqL1xuICAgIGhlbHBlcjoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcblxuICAgIHdhdGNoOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvbixcbiAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJyZXNldFwiLCBcInN1Ym1pdFwiLCBcInN1Y2Nlc3NcIiwgXCJ2YWxpZGF0aW9uRXJyb3JcIiwgXCJ2YWx1ZS1jaGFuZ2VcIiwgXCJpbml0XCJdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgQXN5bmNDb21wdXRlVmFsdWUsIGRvQ29tcHV0ZWQgfSA9IHVzZUNvbXB1dGUoKTtcbiAgICBjb25zdCBmb3JtUmVmID0gcmVmKCk7XG4gICAgY29uc3QgZm9ybTogVW53cmFwTmVzdGVkUmVmczxhbnk+ID0gcmVhY3RpdmUoe30pO1xuICAgIGNvbnN0IHsgcHJveHkgfSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuXG4gICAgdXRpbHMudHJhY2UoXCJmcy1mb3JtXCIpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxuICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgaWYgKGl0ZW0udmFsdWUgIT0gbnVsbCAmJiAoaXRlbS52YWx1ZSBpbnN0YW5jZW9mIEFzeW5jQ29tcHV0ZVZhbHVlIHx8IGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBDb21wdXRlVmFsdWUpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiZm9ybS52YWx1ZemFjee9ruS4jeaUr+aMgUNvbXB1dGUvQXN5bmNDb21wdXRl57G75Z6L55qE5Yqo5oCB6K6h566XXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxGb3JtKCkge1xuICAgICAgY29uc3QgZm9ybSA9IHt9O1xuICAgICAgLy8g5Yid5aeL5pWw5o2u6LWL5YC8XG4gICAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZlZhbHVlID0gdW5yZWYoaXRlbS52YWx1ZSk7XG4gICAgICAgIGlmIChkZWZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0KGZvcm0sIGtleSwgZGVmVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG1lcmdlKGZvcm0sIGNsb25lRGVlcChwcm9wcy5pbml0aWFsRm9ybSkpO1xuICAgICAgcmV0dXJuIGZvcm07XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xuICAgIHNldEZvcm1EYXRhKGluaXRpYWxGb3JtKTtcblxuICAgIGNvbnN0IHNjb3BlOiBSZWY8Rm9ybVNjb3BlQ29udGV4dD4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByb3c6IGluaXRpYWxGb3JtLFxuICAgICAgICBmb3JtLFxuICAgICAgICBpbmRleDogcHJvcHMuaW5kZXgsXG4gICAgICAgIG1vZGU6IHByb3BzLm1vZGUgfHwgXCJhZGRcIixcbiAgICAgICAgYXR0cnM6IGN0eC5hdHRycyxcbiAgICAgICAgZ2V0Q29tcG9uZW50UmVmXG4gICAgICB9IGFzIEZvcm1TY29wZUNvbnRleHQ7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBnZXRDb250ZXh0Rm4oKSB7XG4gICAgICByZXR1cm4gc2NvcGUudmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLmNvbHVtbnM7XG4gICAgfSk7XG4gICAgLy9mb3JtLnZhbHVlQnVpbGRlclxuXG4gICAgZnVuY3Rpb24gZG9WYWx1ZUJ1aWxkZXIoZm9ybTogYW55KSB7XG4gICAgICBpZiAoZm9ybSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gZ2V0KGZvcm0sIGtleSk7XG4gICAgICAgIGlmIChpdGVtLnZhbHVlQnVpbGRlcikge1xuICAgICAgICAgIGl0ZW0udmFsdWVCdWlsZGVyKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcm93OiBpbml0aWFsRm9ybSxcbiAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICBpbmRleDogcHJvcHMuaW5kZXgsXG4gICAgICAgICAgICBtb2RlOiBwcm9wcy5tb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEZvcm1EYXRhKCkge1xuICAgICAgcmV0dXJuIGZvcm07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldEZvcm1EYXRhKGZvcm1EYXRhOiBhbnksIG9wdGlvbnM6IFNldEZvcm1EYXRhT3B0aW9ucyA9IHt9KSB7XG4gICAgICBkb1ZhbHVlQnVpbGRlcihmb3JtRGF0YSk7XG5cbiAgICAgIGlmIChvcHRpb25zLm1lcmdlRm9ybSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybSkge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1lcmdlKGZvcm0sIGZvcm1EYXRhKTtcbiAgICAgIGNvbnN0IHsgdmFsdWVDaGFuZ2UgfSA9IG9wdGlvbnM7XG4gICAgICBpZiAodmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgZm9yRWFjaChwcm9wcy5jb2x1bW5zLCAoY29sdW1uOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtW2tleV07XG4gICAgICAgICAgZG9WYWx1ZUNoYW5nZShrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VDb2woLi4uY29sOiBhbnkpIHtcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuY29sLCAuLi5jb2wpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJ1aWxkSXRlbVNjb3BlKGl0ZW06IGFueSk6IEZvcm1TY29wZUNvbnRleHQge1xuICAgICAgcmV0dXJuIHsga2V5OiBpdGVtLmtleSwgLi4uc2NvcGUudmFsdWUgfTtcbiAgICB9XG5cbiAgICAvLyBkb1ZhbHVlQnVpbGRlcihmb3JtKTtcblxuICAgIC8vIHdhdGNoKFxuICAgIC8vICAgKCkgPT4gcHJvcHMuaW5pdGlhbEZvcm0sXG4gICAgLy8gICAoKSA9PiB7XG4gICAgLy8gICAgIHNldEZvcm1EYXRhKGNyZWF0ZUluaXRpYWxGb3JtKCksIHsgbWVyZ2VGb3JtOiBmYWxzZSB9KTtcbiAgICAvLyAgIH1cbiAgICAvLyApO1xuXG4gICAgZnVuY3Rpb24gZG9WYWx1ZUNoYW5nZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgY29uc3QgZXZlbnQgPSB7IGtleSwgdmFsdWUsIGZvcm1SZWY6IHByb3h5LCAuLi5zY29wZS52YWx1ZSwgaW1tZWRpYXRlOiBmYWxzZSB9O1xuICAgICAgY3R4LmVtaXQoXCJ2YWx1ZS1jaGFuZ2VcIiwgZXZlbnQpO1xuICAgICAgbGV0IHZhbHVlQ2hhbmdlID0gcHJvcHMuY29sdW1uc1trZXldLnZhbHVlQ2hhbmdlO1xuICAgICAgaWYgKHZhbHVlQ2hhbmdlKSB7XG4gICAgICAgIGlmICh2YWx1ZUNoYW5nZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgdmFsdWVDaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlQ2hhbmdlLmhhbmRsZSkge1xuICAgICAgICAgIHZhbHVlQ2hhbmdlLmhhbmRsZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmb3JtSXRlbVJlZnM6IFJlZiA9IHJlZih7fSk7XG5cbiAgICBmdW5jdGlvbiBnZXRGb3JtSXRlbVJlZihrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGZvcm1JdGVtUmVmcy52YWx1ZVtrZXldLmdldEZvcm1JdGVtUmVmKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGtleTogc3RyaW5nLCBpc0FzeW5jID0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBnZXRGb3JtSXRlbVJlZihrZXkpPy5nZXRDb21wb25lbnRSZWYoaXNBc3luYyk7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBBY3RpdmVLZXkgPSByZWYoW10pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxuICAgIGZvckVhY2gocHJvcHMuZ3JvdXA/Lmdyb3VwcywgKGdyb3VwSXRlbTogYW55LCBrZXk6IGFueSkgPT4ge1xuICAgICAgaWYgKGdyb3VwSXRlbS5jb2xsYXBzZWQgIT09IHRydWUpIHtcbiAgICAgICAgZ3JvdXBBY3RpdmVLZXkudmFsdWUucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2V0dXAtcHJvcHMtZGVzdHJ1Y3R1cmVcbiAgICBpZiAocHJvcHMuZ3JvdXA/Lmdyb3VwVHlwZSA9PT0gXCJ0YWJzXCIpIHtcbiAgICAgIGdyb3VwQWN0aXZlS2V5LnZhbHVlID0gZ3JvdXBBY3RpdmVLZXkudmFsdWUubGVuZ3RoID4gMCA/IGdyb3VwQWN0aXZlS2V5LnZhbHVlWzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvL+aehOW7uuWIhue7hOaVsOaNrlxuICAgIGNvbnN0IGNvbXB1dGVkR3JvdXAgPSBkb0NvbXB1dGVkKFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMuZ3JvdXA7XG4gICAgICB9LFxuICAgICAgZ2V0Q29udGV4dEZuLFxuICAgICAgbnVsbCxcbiAgICAgIChncm91cCA9IHt9KSA9PiB7XG4gICAgICAgIC8v5om+5Ye65rKh5pyJ5re75Yqg6L+b5YiG57uE55qE5a2X5q61XG4gICAgICAgIGNvbnN0IGdyb3VwZWRLZXlzOiBhbnkgPSB7fTtcbiAgICAgICAgZm9yRWFjaChncm91cD8uZ3JvdXBzLCAoZ3JvdXBJdGVtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgZm9yRWFjaChncm91cEl0ZW0uY29sdW1ucywgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXB1dGVkQ29sdW1ucy52YWx1ZVtpdGVtXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHV0aWxzLmxvZ2dlci53YXJuKFwi5peg5pWI55qE5YiG57uE5a2X5q6177yaXCIgKyBpdGVtKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JvdXBlZEtleXNbaXRlbV0gPSBrZXk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHR5cGUgPSBncm91cC5ncm91cFR5cGU7XG4gICAgICAgIGxldCB3cmFwcGVyID0ge1xuICAgICAgICAgIHBhcmVudDogdWkuY29sbGFwc2UubmFtZSxcbiAgICAgICAgICBjaGlsZDogdWkuY29sbGFwc2VJdGVtLm5hbWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGUgPT09IFwidGFic1wiKSB7XG4gICAgICAgICAgd3JhcHBlci5wYXJlbnQgPSB1aS50YWJzLm5hbWU7XG4gICAgICAgICAgd3JhcHBlci5jaGlsZCA9IHVpLnRhYlBhbmUubmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAge1xuICAgICAgICAgICAgd3JhcHBlcixcbiAgICAgICAgICAgIGdyb3VwZWRLZXlzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBncm91cFxuICAgICAgICApO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBjb21wdXRlZERlZmF1bHRDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgY29sdW1uczogYW55ID0gW107XG4gICAgICAvL2RlZmF1bHQgY29sdW1uc+aOkuW6j1xuICAgICAgZm9yRWFjaChjb21wdXRlZENvbHVtbnMudmFsdWUsICh2YWx1ZTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gY2xvbmVEZWVwKHByb3BzLmZvcm1JdGVtIHx8IHt9KTtcbiAgICAgICAgdmFsdWUgPSBtZXJnZShpdGVtLCB2YWx1ZSk7XG4gICAgICAgIHZhbHVlLmtleSA9IGtleTtcbiAgICAgICAgaWYgKHZhbHVlLm9yZGVyID09IG51bGwpIHtcbiAgICAgICAgICB2YWx1ZS5vcmRlciA9IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzID09IG51bGwgfHwgY29tcHV0ZWRHcm91cC52YWx1ZT8uZ3JvdXBlZEtleXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgY29sdW1ucy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZS5jb2wgPSBtZXJnZUNvbCh2YWx1ZS5jb2wpO1xuICAgICAgfSk7XG4gICAgICAvL+aOkuW6j1xuICAgICAgY29sdW1ucy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gYS5vcmRlciAtIGIub3JkZXI7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBnZXRGb3JtUmVmKCkge1xuICAgICAgcmV0dXJuIGZvcm1SZWYudmFsdWU7XG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgLy8gdWkuZm9ybS5yZXNldFdyYXAoZm9ybVJlZi52YWx1ZSwgeyBmb3JtLCBpbml0aWFsRm9ybTogY3JlYXRlSW5pdGlhbEZvcm0oKSB9KTtcbiAgICAgIGNvbnN0IGluaXRpYWxGb3JtID0gY3JlYXRlSW5pdGlhbEZvcm0oKTtcbiAgICAgIGNvbnN0IGVudHJpZXNSZXQgPSBlbnRyaWVzKGZvcm0pO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzUmV0KSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IGdldChpbml0aWFsRm9ybSwgZW50cnlbMF0pO1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICB1bnNldChmb3JtLCBlbnRyeVswXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0KGZvcm0sIGVudHJ5WzBdLCBpbml0aWFsVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wcy5kb1Jlc2V0KSB7XG4gICAgICAgIGF3YWl0IHByb3BzLmRvUmVzZXQoc2NvcGUudmFsdWUpO1xuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJyZXNldFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZFJlZjogUmVmID0gcmVmKCk7XG4gICAgY29uc3QgZXJyb3JzUmVmOiBSZWYgPSByZWYoe30pO1xuXG4gICAgZnVuY3Rpb24gZmlsbEdyb3VwRXJyb3IoZmllbGRFcnJvcnM6IGFueSkge1xuICAgICAgaWYgKCFjb21wdXRlZEdyb3VwLnZhbHVlPy5ncm91cGVkS2V5cykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZmllbGRFcnJvcnMpIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBjb21wdXRlZEdyb3VwLnZhbHVlPy5ncm91cGVkS2V5c1trZXldO1xuICAgICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkge1xuICAgICAgICAgIGZpZWxkRXJyb3JzW1wiZ3JvdXAuXCIgKyBncm91cF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0ZVNjb3BlID0geyAuLi5zY29wZS52YWx1ZSwgZm9ybSB9O1xuICAgICAgaWYgKHZhbGlkYXRlU2NvcGUubW9kZSA9PT0gXCJ2aWV3XCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmJlZm9yZVZhbGlkYXRlKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IHByb3BzLmJlZm9yZVZhbGlkYXRlKHZhbGlkYXRlU2NvcGUpO1xuICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBlcnJvcnNSZWYudmFsdWUgPSB7fTtcbiAgICAgICAgYXdhaXQgdWkuZm9ybS52YWxpZGF0ZVdyYXAoZm9ybVJlZi52YWx1ZSk7XG4gICAgICAgIHZhbGlkUmVmLnZhbHVlID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICB2YWxpZFJlZi52YWx1ZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWxpZGF0ZUVycm9ycyA9IHVpLmZvcm0udHJhbnNmb3JtVmFsaWRhdGVFcnJvcnMoZSk7XG4gICAgICAgIGZpbGxHcm91cEVycm9yKHZhbGlkYXRlRXJyb3JzKTtcbiAgICAgICAgZXJyb3JzUmVmLnZhbHVlID0gdmFsaWRhdGVFcnJvcnM7XG4gICAgICAgIGN0eC5lbWl0KFwidmFsaWRhdGlvbkVycm9yXCIsIHNjb3BlLnZhbHVlKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gc3VibWl0KCkge1xuICAgICAgYXdhaXQgdmFsaWRhdGUoKTtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gY2xvbmVEZWVwKHRvUmF3KGZvcm0pKTtcbiAgICAgIGNvbnN0IHN1Ym1pdFNjb3BlID0geyAuLi5zY29wZS52YWx1ZSwgZm9ybTogZm9ybURhdGEgfTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImZvcm0gc3VibWl0XCIsIEpTT04uc3RyaW5naWZ5KGZvcm0pKTtcbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gZ2V0KGZvcm1EYXRhLCBrZXkpO1xuICAgICAgICBpZiAoaXRlbS52YWx1ZVJlc29sdmUpIHtcbiAgICAgICAgICBpdGVtLnZhbHVlUmVzb2x2ZSh7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIC4uLnN1Ym1pdFNjb3BlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocHJvcHMuYmVmb3JlU3VibWl0KSB7XG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IHByb3BzLmJlZm9yZVN1Ym1pdChzdWJtaXRTY29wZSk7XG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8v56e76Zmk5LiN5YWB6K645o+Q5Lqk55qE5a2X5q61XG4gICAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnN1Ym1pdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB1bnNldChmb3JtRGF0YSwga2V5KTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnN1Ym1pdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIC8v6K6+572u5by65Yi25o+Q5Lqk55qE5a2X5q61XG4gICAgICAgICAgc2V0KGZvcm1EYXRhLCBrZXksIGZvcm1EYXRhW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHByb3BzLmRvU3VibWl0KSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHByb3BzLmRvU3VibWl0KHN1Ym1pdFNjb3BlKTtcbiAgICAgICAgc3VibWl0U2NvcGUucmVzID0gcmVzO1xuICAgICAgICBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJzdWJtaXRcIiwgc3VibWl0U2NvcGUpO1xuICAgICAgaWYgKHByb3BzLmFmdGVyU3VibWl0KSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBwcm9wcy5hZnRlclN1Ym1pdChzdWJtaXRTY29wZSk7XG4gICAgICAgIGlmIChzdWNjZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJzdWNjZXNzXCIsIHN1Ym1pdFNjb3BlKTtcblxuICAgICAgcmV0dXJuIHN1Ym1pdFNjb3BlO1xuICAgIH1cblxuICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICAvLyBpbW1lZGlhdGUgdmFsdWVDaGFuZ2Xop6blj5FcbiAgICAgIGZvckVhY2goY29tcHV0ZWRDb2x1bW5zLnZhbHVlLCAoaXRlbTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoaXRlbS52YWx1ZUNoYW5nZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZUNoYW5nZSA9IGl0ZW0udmFsdWVDaGFuZ2U7XG4gICAgICAgIGlmICh2YWx1ZUNoYW5nZSAmJiB2YWx1ZUNoYW5nZS5pbW1lZGlhdGUgPT09IHRydWUgJiYgdmFsdWVDaGFuZ2UuaGFuZGxlKSB7XG4gICAgICAgICAgY29uc3QgZXZlbnQgPSB7IGtleSwgdmFsdWU6IGZvcm1ba2V5XSwgZm9ybVJlZjogcHJveHksIC4uLnNjb3BlLnZhbHVlLCBpbW1lZGlhdGU6IHRydWUgfTtcbiAgICAgICAgICBpZiAodmFsdWVDaGFuZ2UuaGFuZGxlKSB7XG4gICAgICAgICAgICB2YWx1ZUNoYW5nZS5oYW5kbGUoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBmb3JtSXRlbVNob3coaXRlbTogYW55KSB7XG4gICAgICBpZiAoaXRlbSAmJiB1bnJlZihpdGVtLnNob3cpICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ3JvdXBJdGVtU2hvdyhncm91cEl0ZW06IGFueSkge1xuICAgICAgaWYgKCFncm91cEl0ZW0uY29sdW1ucykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodW5yZWYoZ3JvdXBJdGVtLnNob3cpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGtleSBvZiBncm91cEl0ZW0uY29sdW1ucykge1xuICAgICAgICBpZiAoY29tcHV0ZWRDb2x1bW5zLnZhbHVlW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRmllbGRTaG93ID0gZm9ybUl0ZW1TaG93KGNvbXB1dGVkQ29sdW1ucy52YWx1ZVtrZXldKTtcbiAgICAgICAgaWYgKGlzRmllbGRTaG93KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMud2F0Y2gpIHtcbiAgICAgIHdhdGNoKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZvcm07XG4gICAgICAgIH0sXG4gICAgICAgIChuZXdWYWwsIG9sZFZhbCkgPT4ge1xuICAgICAgICAgIGlmIChwcm9wcy53YXRjaCkge1xuICAgICAgICAgICAgcHJvcHMud2F0Y2goc2NvcGUudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGRlZXA6IHRydWUsXG4gICAgICAgICAgaW1tZWRpYXRlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEaXJ0eSgpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IEpTT04uc3RyaW5naWZ5KGluaXRpYWxGb3JtKTtcbiAgICAgIGNvbnN0IGFmdGVyID0gSlNPTi5zdHJpbmdpZnkoZm9ybSk7XG4gICAgICByZXR1cm4gYmVmb3JlICE9PSBhZnRlcjtcbiAgICB9XG5cbiAgICBjb25zdCBtZXJnZWRTbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuc2xvdHMsIGN0eC5zbG90cyk7XG4gICAgfSk7XG5cbiAgICBjdHguZW1pdChcImluaXRcIiwgc2NvcGUudmFsdWUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdldDogKGZvcm06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldChmb3JtLCBrZXkpO1xuICAgICAgfSxcbiAgICAgIHNldDogKGZvcm06IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgc2V0KGZvcm0sIGtleSwgdmFsdWUpO1xuICAgICAgICBkb1ZhbHVlQ2hhbmdlKGtleSwgdmFsdWUpO1xuICAgICAgfSxcbiAgICAgIHVpLFxuICAgICAgdmFsaWRSZWYsXG4gICAgICBlcnJvcnNSZWYsXG4gICAgICBmb3JtUmVmLFxuICAgICAgY29tcHV0ZWRDb2x1bW5zLFxuICAgICAgY29tcHV0ZWREZWZhdWx0Q29sdW1ucyxcbiAgICAgIHN1Ym1pdCxcbiAgICAgIHJlc2V0LFxuICAgICAgZ2V0Rm9ybVJlZixcbiAgICAgIHNjb3BlLFxuICAgICAgYnVpbGRJdGVtU2NvcGUsXG4gICAgICBncm91cEFjdGl2ZUtleSxcbiAgICAgIGZvcm0sXG4gICAgICBmb3JtSXRlbVJlZnMsXG4gICAgICBnZXRGb3JtRGF0YSxcbiAgICAgIHNldEZvcm1EYXRhLFxuICAgICAgZ2V0Q29tcG9uZW50UmVmLFxuICAgICAgbWVyZ2VDb2wsXG4gICAgICB2YWxpZGF0ZSxcbiAgICAgIGNvbXB1dGVkR3JvdXAsXG4gICAgICBnZXRDb250ZXh0Rm4sXG4gICAgICBmb3JtSXRlbVNob3csXG4gICAgICBncm91cEl0ZW1TaG93LFxuICAgICAgaXNEaXJ0eSxcbiAgICAgIG1lcmdlZFNsb3RzXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtZm9ybSB7XG4gIC5lbC1jb2xsYXBzZS1pdGVtX19jb250ZW50IHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgIHBhZGRpbmctbGVmdDogMzBweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAzMHB4O1xuICB9XG5cbiAgLmZzLWZvcm0taW52YWxpZCB7XG4gIH1cblxuICAuZnMtZm9ybS1pdGVtLWNvbXBvbmVudCB7XG4gICAgLmFudC1waWNrZXIsXG4gICAgLmFudC1pbnB1dC1hZmZpeC13cmFwcGVyLFxuICAgIC5hbnQtaW5wdXQtbnVtYmVyLFxuICAgIC5lbC1jYXNjYWRlcixcbiAgICAuZWwtZGF0ZS1lZGl0b3IsXG4gICAgLmVsLWlucHV0LW51bWJlcixcbiAgICAuZWwtaW5wdXQsXG4gICAgPiAuZWwtc2VsZWN0LFxuICAgID4gLm4tc2VsZWN0LFxuICAgIC5uLWRhdGUtcGlja2VyLFxuICAgIC5uLWlucHV0LW51bWJlciB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19pY29uIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIH1cbiAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19jbG9zZS1pY29uIHtcbiAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICB9XG5cbiAgICAuZWwtcmFuZ2UtZWRpdG9yLmVsLWlucHV0X193cmFwcGVyIHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuICB9XG5cbiAgLy8uZWwtZGF0ZS1lZGl0b3IuZWwtaW5wdXRfX3dyYXBwZXIge1xuICAvLyAgd2lkdGg6IDEwMCU7XG4gIC8vfVxufVxuXG4uZnMtZm9ybS1ncmlkIHtcbiAgLmZzLXJvdyB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDUwJSA1MCU7XG4gICAgLy8gZ2FwOiAwIDIwcHg7IC8v5YiX6Ze06LedIDIwcHhcbiAgICAuZnMtY29sIHtcbiAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgIC8vIGFudGR2XG4gICAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgICAgd2lkdGg6IDEwMHB4O1xuICAgICAgZmxleDogbm9uZTtcbiAgICAgIG1heC13aWR0aDogbm9uZTtcbiAgICB9XG4gICAgLmFudC1mb3JtLWl0ZW0tY29udHJvbC13cmFwcGVyIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBtYXgtd2lkdGg6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgLy8gZWxlbWVudFxuICAuZWwtcm93OjphZnRlcixcbiAgLmVsLXJvdzo6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG4uZnMtZm9ybS1mbGV4IHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgLmZzLXJvdyB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XG4gIC5mcy1mb3JtLWZsZXgge1xuICAgIC5mcy1yb3cge1xuICAgICAgLmZzLWNvbCB7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGZsZXg6IDAgMCAxMDAlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNTc1cHgpIHtcbiAgLmZzLWZvcm0tZmxleCB7XG4gICAgLmZzLXJvdyB7XG4gICAgICAuZnMtY29sIHtcbiAgICAgICAgLy8uYW50LWZvcm0taXRlbS1sYWJlbCB7XG4gICAgICAgIC8vICBmbGV4OiBub25lO1xuICAgICAgICAvL31cbiAgICAgICAgLy8uYW50LWZvcm0taXRlbSAuYW50LWZvcm0taXRlbS1jb250cm9sIHtcbiAgICAgICAgLy8gIGZsZXg6IDE7XG4gICAgICAgIC8vICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICAgIC8vfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cInVpLmZvcm0ubmFtZVwiXG4gICAgcmVmPVwiZm9ybVJlZlwiXG4gICAgY2xhc3M9XCJmcy1mb3JtXCJcbiAgICA6Y2xhc3M9XCJ7XG4gICAgICAnZnMtZm9ybS1ncmlkJzogZGlzcGxheSA9PT0gJ2dyaWQnLFxuICAgICAgJ2ZzLWZvcm0tZmxleCc6IGRpc3BsYXkgPT09ICdmbGV4JyxcbiAgICAgICdmcy1mb3JtLWludmFsaWQnOiB2YWxpZFJlZiA9PT0gZmFsc2VcbiAgICB9XCJcbiAgICBvbnN1Ym1pdD1cImV2ZW50LnByZXZlbnREZWZhdWx0KCk7XCJcbiAgICA6bW9kZWw9XCJmb3JtXCJcbiAgPlxuICAgIDwhLS0gcm93IC0tPlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiBjbGFzcz1cImZzLXJvd1wiIHYtYmluZD1cInJvd1wiPlxuICAgICAgPCEtLSBjb2wgLS0+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+v6YWN572u6Leo5YiXXG4gICAgICovXG4gICAgY29sOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIGZvcm1JdGVt55qE5YWs5YWx6YWN572uXG4gICAgICovXG4gICAgZm9ybUl0ZW06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICogaGVscGVy5L2N572u77yae3Bvc2l0aW9uOidsYWJlbCd9XG4gICAgICovXG4gICAgaGVscGVyOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuXG4gICAgd2F0Y2g6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcInJlc2V0XCIsIFwic3VibWl0XCIsIFwic3VjY2Vzc1wiLCBcInZhbGlkYXRpb25FcnJvclwiLCBcInZhbHVlLWNoYW5nZVwiLCBcImluaXRcIl0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgeyBBc3luY0NvbXB1dGVWYWx1ZSwgZG9Db21wdXRlZCB9ID0gdXNlQ29tcHV0ZSgpO1xuICAgIGNvbnN0IGZvcm1SZWYgPSByZWYoKTtcbiAgICBjb25zdCBmb3JtOiBVbndyYXBOZXN0ZWRSZWZzPGFueT4gPSByZWFjdGl2ZSh7fSk7XG4gICAgY29uc3QgeyBwcm94eSB9ID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cbiAgICB1dGlscy50cmFjZShcImZzLWZvcm1cIik7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNldHVwLXByb3BzLWRlc3RydWN0dXJlXG4gICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55KSA9PiB7XG4gICAgICBpZiAoaXRlbS52YWx1ZSAhPSBudWxsICYmIChpdGVtLnZhbHVlIGluc3RhbmNlb2YgQXN5bmNDb21wdXRlVmFsdWUgfHwgaXRlbS52YWx1ZSBpbnN0YW5jZW9mIENvbXB1dGVWYWx1ZSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJmb3JtLnZhbHVl6YWN572u5LiN5pSv5oyBQ29tcHV0ZS9Bc3luY0NvbXB1dGXnsbvlnovnmoTliqjmgIHorqHnrpdcIik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gY3JlYXRlSW5pdGlhbEZvcm0oKSB7XG4gICAgICBjb25zdCBmb3JtID0ge307XG4gICAgICAvLyDliJ3lp4vmlbDmja7otYvlgLxcbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZGVmVmFsdWUgPSB1bnJlZihpdGVtLnZhbHVlKTtcbiAgICAgICAgaWYgKGRlZlZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzZXQoZm9ybSwga2V5LCBkZWZWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbWVyZ2UoZm9ybSwgY2xvbmVEZWVwKHByb3BzLmluaXRpYWxGb3JtKSk7XG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsRm9ybSA9IGNyZWF0ZUluaXRpYWxGb3JtKCk7XG4gICAgc2V0Rm9ybURhdGEoaW5pdGlhbEZvcm0pO1xuXG4gICAgY29uc3Qgc2NvcGU6IFJlZjxGb3JtU2NvcGVDb250ZXh0PiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJvdzogaW5pdGlhbEZvcm0sXG4gICAgICAgIGZvcm0sXG4gICAgICAgIGluZGV4OiBwcm9wcy5pbmRleCxcbiAgICAgICAgbW9kZTogcHJvcHMubW9kZSB8fCBcImFkZFwiLFxuICAgICAgICBhdHRyczogY3R4LmF0dHJzLFxuICAgICAgICBnZXRDb21wb25lbnRSZWZcbiAgICAgIH0gYXMgRm9ybVNjb3BlQ29udGV4dDtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGdldENvbnRleHRGbigpIHtcbiAgICAgIHJldHVybiBzY29wZS52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuY29sdW1ucztcbiAgICB9KTtcbiAgICAvL2Zvcm0udmFsdWVCdWlsZGVyXG5cbiAgICBmdW5jdGlvbiBkb1ZhbHVlQnVpbGRlcihmb3JtOiBhbnkpIHtcbiAgICAgIGlmIChmb3JtID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55LCBrZXk6IGFueSkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBnZXQoZm9ybSwga2V5KTtcbiAgICAgICAgaWYgKGl0ZW0udmFsdWVCdWlsZGVyKSB7XG4gICAgICAgICAgaXRlbS52YWx1ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICByb3c6IGluaXRpYWxGb3JtLFxuICAgICAgICAgICAgZm9ybSxcbiAgICAgICAgICAgIGluZGV4OiBwcm9wcy5pbmRleCxcbiAgICAgICAgICAgIG1vZGU6IHByb3BzLm1vZGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Rm9ybURhdGEoKSB7XG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0Rm9ybURhdGEoZm9ybURhdGE6IGFueSwgb3B0aW9uczogU2V0Rm9ybURhdGFPcHRpb25zID0ge30pIHtcbiAgICAgIGRvVmFsdWVCdWlsZGVyKGZvcm1EYXRhKTtcblxuICAgICAgaWYgKG9wdGlvbnMubWVyZ2VGb3JtID09PSBmYWxzZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtKSB7XG4gICAgICAgICAgZGVsZXRlIGZvcm1ba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWVyZ2UoZm9ybSwgZm9ybURhdGEpO1xuICAgICAgY29uc3QgeyB2YWx1ZUNoYW5nZSB9ID0gb3B0aW9ucztcbiAgICAgIGlmICh2YWx1ZUNoYW5nZSkge1xuICAgICAgICBmb3JFYWNoKHByb3BzLmNvbHVtbnMsIChjb2x1bW46IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1ba2V5XTtcbiAgICAgICAgICBkb1ZhbHVlQ2hhbmdlKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUNvbCguLi5jb2w6IGFueSkge1xuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5jb2wsIC4uLmNvbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnVpbGRJdGVtU2NvcGUoaXRlbTogYW55KTogRm9ybVNjb3BlQ29udGV4dCB7XG4gICAgICByZXR1cm4geyBrZXk6IGl0ZW0ua2V5LCAuLi5zY29wZS52YWx1ZSB9O1xuICAgIH1cblxuICAgIC8vIGRvVmFsdWVCdWlsZGVyKGZvcm0pO1xuXG4gICAgLy8gd2F0Y2goXG4gICAgLy8gICAoKSA9PiBwcm9wcy5pbml0aWFsRm9ybSxcbiAgICAvLyAgICgpID0+IHtcbiAgICAvLyAgICAgc2V0Rm9ybURhdGEoY3JlYXRlSW5pdGlhbEZvcm0oKSwgeyBtZXJnZUZvcm06IGZhbHNlIH0pO1xuICAgIC8vICAgfVxuICAgIC8vICk7XG5cbiAgICBmdW5jdGlvbiBkb1ZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICBjb25zdCBldmVudCA9IHsga2V5LCB2YWx1ZSwgZm9ybVJlZjogcHJveHksIC4uLnNjb3BlLnZhbHVlLCBpbW1lZGlhdGU6IGZhbHNlIH07XG4gICAgICBjdHguZW1pdChcInZhbHVlLWNoYW5nZVwiLCBldmVudCk7XG4gICAgICBsZXQgdmFsdWVDaGFuZ2UgPSBwcm9wcy5jb2x1bW5zW2tleV0udmFsdWVDaGFuZ2U7XG4gICAgICBpZiAodmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICB2YWx1ZUNoYW5nZShldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVDaGFuZ2UuaGFuZGxlKSB7XG4gICAgICAgICAgdmFsdWVDaGFuZ2UuaGFuZGxlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZvcm1JdGVtUmVmczogUmVmID0gcmVmKHt9KTtcblxuICAgIGZ1bmN0aW9uIGdldEZvcm1JdGVtUmVmKGtleTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZm9ybUl0ZW1SZWZzLnZhbHVlW2tleV0uZ2V0Rm9ybUl0ZW1SZWYoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoa2V5OiBzdHJpbmcsIGlzQXN5bmMgPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGdldEZvcm1JdGVtUmVmKGtleSk/LmdldENvbXBvbmVudFJlZihpc0FzeW5jKTtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cEFjdGl2ZUtleSA9IHJlZihbXSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNldHVwLXByb3BzLWRlc3RydWN0dXJlXG4gICAgZm9yRWFjaChwcm9wcy5ncm91cD8uZ3JvdXBzLCAoZ3JvdXBJdGVtOiBhbnksIGtleTogYW55KSA9PiB7XG4gICAgICBpZiAoZ3JvdXBJdGVtLmNvbGxhcHNlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBncm91cEFjdGl2ZUtleS52YWx1ZS5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zZXR1cC1wcm9wcy1kZXN0cnVjdHVyZVxuICAgIGlmIChwcm9wcy5ncm91cD8uZ3JvdXBUeXBlID09PSBcInRhYnNcIikge1xuICAgICAgZ3JvdXBBY3RpdmVLZXkudmFsdWUgPSBncm91cEFjdGl2ZUtleS52YWx1ZS5sZW5ndGggPiAwID8gZ3JvdXBBY3RpdmVLZXkudmFsdWVbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIC8v5p6E5bu65YiG57uE5pWw5o2uXG4gICAgY29uc3QgY29tcHV0ZWRHcm91cCA9IGRvQ29tcHV0ZWQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9wcy5ncm91cDtcbiAgICAgIH0sXG4gICAgICBnZXRDb250ZXh0Rm4sXG4gICAgICBudWxsLFxuICAgICAgKGdyb3VwID0ge30pID0+IHtcbiAgICAgICAgLy/mib7lh7rmsqHmnInmt7vliqDov5vliIbnu4TnmoTlrZfmrrVcbiAgICAgICAgY29uc3QgZ3JvdXBlZEtleXM6IGFueSA9IHt9O1xuICAgICAgICBmb3JFYWNoKGdyb3VwPy5ncm91cHMsIChncm91cEl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBmb3JFYWNoKGdyb3VwSXRlbS5jb2x1bW5zLCAoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcHV0ZWRDb2x1bW5zLnZhbHVlW2l0ZW1dID09IG51bGwpIHtcbiAgICAgICAgICAgICAgdXRpbHMubG9nZ2VyLndhcm4oXCLml6DmlYjnmoTliIbnu4TlrZfmrrXvvJpcIiArIGl0ZW0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cGVkS2V5c1tpdGVtXSA9IGtleTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdHlwZSA9IGdyb3VwLmdyb3VwVHlwZTtcbiAgICAgICAgbGV0IHdyYXBwZXIgPSB7XG4gICAgICAgICAgcGFyZW50OiB1aS5jb2xsYXBzZS5uYW1lLFxuICAgICAgICAgIGNoaWxkOiB1aS5jb2xsYXBzZUl0ZW0ubmFtZVxuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJ0YWJzXCIpIHtcbiAgICAgICAgICB3cmFwcGVyLnBhcmVudCA9IHVpLnRhYnMubmFtZTtcbiAgICAgICAgICB3cmFwcGVyLmNoaWxkID0gdWkudGFiUGFuZS5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3cmFwcGVyLFxuICAgICAgICAgICAgZ3JvdXBlZEtleXNcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdyb3VwXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGNvbXB1dGVkRGVmYXVsdENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5zOiBhbnkgPSBbXTtcbiAgICAgIC8vZGVmYXVsdCBjb2x1bW5z5o6S5bqPXG4gICAgICBmb3JFYWNoKGNvbXB1dGVkQ29sdW1ucy52YWx1ZSwgKHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBjbG9uZURlZXAocHJvcHMuZm9ybUl0ZW0gfHwge30pO1xuICAgICAgICB2YWx1ZSA9IG1lcmdlKGl0ZW0sIHZhbHVlKTtcbiAgICAgICAgdmFsdWUua2V5ID0ga2V5O1xuICAgICAgICBpZiAodmFsdWUub3JkZXIgPT0gbnVsbCkge1xuICAgICAgICAgIHZhbHVlLm9yZGVyID0gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHV0ZWRHcm91cC52YWx1ZT8uZ3JvdXBlZEtleXMgPT0gbnVsbCB8fCBjb21wdXRlZEdyb3VwLnZhbHVlPy5ncm91cGVkS2V5c1trZXldID09IG51bGwpIHtcbiAgICAgICAgICBjb2x1bW5zLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlLmNvbCA9IG1lcmdlQ29sKHZhbHVlLmNvbCk7XG4gICAgICB9KTtcbiAgICAgIC8v5o6S5bqPXG4gICAgICBjb2x1bW5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY29sdW1ucztcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGdldEZvcm1SZWYoKSB7XG4gICAgICByZXR1cm4gZm9ybVJlZi52YWx1ZTtcbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAvLyB1aS5mb3JtLnJlc2V0V3JhcChmb3JtUmVmLnZhbHVlLCB7IGZvcm0sIGluaXRpYWxGb3JtOiBjcmVhdGVJbml0aWFsRm9ybSgpIH0pO1xuICAgICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xuICAgICAgY29uc3QgZW50cmllc1JldCA9IGVudHJpZXMoZm9ybSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXNSZXQpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gZ2V0KGluaXRpYWxGb3JtLCBlbnRyeVswXSk7XG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIHVuc2V0KGZvcm0sIGVudHJ5WzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXQoZm9ybSwgZW50cnlbMF0sIGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmRvUmVzZXQpIHtcbiAgICAgICAgYXdhaXQgcHJvcHMuZG9SZXNldChzY29wZS52YWx1ZSk7XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcInJlc2V0XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkUmVmOiBSZWYgPSByZWYoKTtcbiAgICBjb25zdCBlcnJvcnNSZWY6IFJlZiA9IHJlZih7fSk7XG5cbiAgICBmdW5jdGlvbiBmaWxsR3JvdXBFcnJvcihmaWVsZEVycm9yczogYW55KSB7XG4gICAgICBpZiAoIWNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGtleSBpbiBmaWVsZEVycm9ycykge1xuICAgICAgICBjb25zdCBncm91cCA9IGNvbXB1dGVkR3JvdXAudmFsdWU/Lmdyb3VwZWRLZXlzW2tleV07XG4gICAgICAgIGlmIChncm91cCAhPSBudWxsKSB7XG4gICAgICAgICAgZmllbGRFcnJvcnNbXCJncm91cC5cIiArIGdyb3VwXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlU2NvcGUgPSB7IC4uLnNjb3BlLnZhbHVlLCBmb3JtIH07XG4gICAgICBpZiAodmFsaWRhdGVTY29wZS5tb2RlID09PSBcInZpZXdcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuYmVmb3JlVmFsaWRhdGUpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgcHJvcHMuYmVmb3JlVmFsaWRhdGUodmFsaWRhdGVTY29wZSk7XG4gICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGVycm9yc1JlZi52YWx1ZSA9IHt9O1xuICAgICAgICBhd2FpdCB1aS5mb3JtLnZhbGlkYXRlV3JhcChmb3JtUmVmLnZhbHVlKTtcbiAgICAgICAgdmFsaWRSZWYudmFsdWUgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHZhbGlkUmVmLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlRXJyb3JzID0gdWkuZm9ybS50cmFuc2Zvcm1WYWxpZGF0ZUVycm9ycyhlKTtcbiAgICAgICAgZmlsbEdyb3VwRXJyb3IodmFsaWRhdGVFcnJvcnMpO1xuICAgICAgICBlcnJvcnNSZWYudmFsdWUgPSB2YWxpZGF0ZUVycm9ycztcbiAgICAgICAgY3R4LmVtaXQoXCJ2YWxpZGF0aW9uRXJyb3JcIiwgc2NvcGUudmFsdWUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBmdW5jdGlvbiBzdWJtaXQoKSB7XG4gICAgICBhd2FpdCB2YWxpZGF0ZSgpO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBjbG9uZURlZXAodG9SYXcoZm9ybSkpO1xuICAgICAgY29uc3Qgc3VibWl0U2NvcGUgPSB7IC4uLnNjb3BlLnZhbHVlLCBmb3JtOiBmb3JtRGF0YSB9O1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiZm9ybSBzdWJtaXRcIiwgSlNPTi5zdHJpbmdpZnkoZm9ybSkpO1xuICAgICAgZWFjaChwcm9wcy5jb2x1bW5zLCAoaXRlbTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBnZXQoZm9ybURhdGEsIGtleSk7XG4gICAgICAgIGlmIChpdGVtLnZhbHVlUmVzb2x2ZSkge1xuICAgICAgICAgIGl0ZW0udmFsdWVSZXNvbHZlKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgLi4uc3VibWl0U2NvcGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChwcm9wcy5iZWZvcmVTdWJtaXQpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgcHJvcHMuYmVmb3JlU3VibWl0KHN1Ym1pdFNjb3BlKTtcbiAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy/np7vpmaTkuI3lhYHorrjmj5DkuqTnmoTlrZfmrrVcbiAgICAgIGVhY2gocHJvcHMuY29sdW1ucywgKGl0ZW06IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uc3VibWl0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHVuc2V0KGZvcm1EYXRhLCBrZXkpO1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uc3VibWl0ID09PSB0cnVlKSB7XG4gICAgICAgICAgLy/orr7nva7lvLrliLbmj5DkuqTnmoTlrZfmrrVcbiAgICAgICAgICBzZXQoZm9ybURhdGEsIGtleSwgZm9ybURhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocHJvcHMuZG9TdWJtaXQpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcHJvcHMuZG9TdWJtaXQoc3VibWl0U2NvcGUpO1xuICAgICAgICBzdWJtaXRTY29wZS5yZXMgPSByZXM7XG4gICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcInN1Ym1pdFwiLCBzdWJtaXRTY29wZSk7XG4gICAgICBpZiAocHJvcHMuYWZ0ZXJTdWJtaXQpIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IHByb3BzLmFmdGVyU3VibWl0KHN1Ym1pdFNjb3BlKTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcInN1Y2Nlc3NcIiwgc3VibWl0U2NvcGUpO1xuXG4gICAgICByZXR1cm4gc3VibWl0U2NvcGU7XG4gICAgfVxuXG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIC8vIGltbWVkaWF0ZSB2YWx1ZUNoYW5nZeinpuWPkVxuICAgICAgZm9yRWFjaChjb21wdXRlZENvbHVtbnMudmFsdWUsIChpdGVtOiBhbnksIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnZhbHVlQ2hhbmdlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlQ2hhbmdlID0gaXRlbS52YWx1ZUNoYW5nZTtcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlICYmIHZhbHVlQ2hhbmdlLmltbWVkaWF0ZSA9PT0gdHJ1ZSAmJiB2YWx1ZUNoYW5nZS5oYW5kbGUpIHtcbiAgICAgICAgICBjb25zdCBldmVudCA9IHsga2V5LCB2YWx1ZTogZm9ybVtrZXldLCBmb3JtUmVmOiBwcm94eSwgLi4uc2NvcGUudmFsdWUsIGltbWVkaWF0ZTogdHJ1ZSB9O1xuICAgICAgICAgIGlmICh2YWx1ZUNoYW5nZS5oYW5kbGUpIHtcbiAgICAgICAgICAgIHZhbHVlQ2hhbmdlLmhhbmRsZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGZvcm1JdGVtU2hvdyhpdGVtOiBhbnkpIHtcbiAgICAgIGlmIChpdGVtICYmIHVucmVmKGl0ZW0uc2hvdykgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBncm91cEl0ZW1TaG93KGdyb3VwSXRlbTogYW55KSB7XG4gICAgICBpZiAoIWdyb3VwSXRlbS5jb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh1bnJlZihncm91cEl0ZW0uc2hvdykgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQga2V5IG9mIGdyb3VwSXRlbS5jb2x1bW5zKSB7XG4gICAgICAgIGlmIChjb21wdXRlZENvbHVtbnMudmFsdWVba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNGaWVsZFNob3cgPSBmb3JtSXRlbVNob3coY29tcHV0ZWRDb2x1bW5zLnZhbHVlW2tleV0pO1xuICAgICAgICBpZiAoaXNGaWVsZFNob3cpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy53YXRjaCkge1xuICAgICAgd2F0Y2goXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gZm9ybTtcbiAgICAgICAgfSxcbiAgICAgICAgKG5ld1ZhbCwgb2xkVmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHByb3BzLndhdGNoKSB7XG4gICAgICAgICAgICBwcm9wcy53YXRjaChzY29wZS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgICAgICBpbW1lZGlhdGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RpcnR5KCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gSlNPTi5zdHJpbmdpZnkoaW5pdGlhbEZvcm0pO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBKU09OLnN0cmluZ2lmeShmb3JtKTtcbiAgICAgIHJldHVybiBiZWZvcmUgIT09IGFmdGVyO1xuICAgIH1cblxuICAgIGNvbnN0IG1lcmdlZFNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5zbG90cywgY3R4LnNsb3RzKTtcbiAgICB9KTtcblxuICAgIGN0eC5lbWl0KFwiaW5pdFwiLCBzY29wZS52YWx1ZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0OiAoZm9ybTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KGZvcm0sIGtleSk7XG4gICAgICB9LFxuICAgICAgc2V0OiAoZm9ybTogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICBzZXQoZm9ybSwga2V5LCB2YWx1ZSk7XG4gICAgICAgIGRvVmFsdWVDaGFuZ2Uoa2V5LCB2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgdWksXG4gICAgICB2YWxpZFJlZixcbiAgICAgIGVycm9yc1JlZixcbiAgICAgIGZvcm1SZWYsXG4gICAgICBjb21wdXRlZENvbHVtbnMsXG4gICAgICBjb21wdXRlZERlZmF1bHRDb2x1bW5zLFxuICAgICAgc3VibWl0LFxuICAgICAgcmVzZXQsXG4gICAgICBnZXRGb3JtUmVmLFxuICAgICAgc2NvcGUsXG4gICAgICBidWlsZEl0ZW1TY29wZSxcbiAgICAgIGdyb3VwQWN0aXZlS2V5LFxuICAgICAgZm9ybSxcbiAgICAgIGZvcm1JdGVtUmVmcyxcbiAgICAgIGdldEZvcm1EYXRhLFxuICAgICAgc2V0Rm9ybURhdGEsXG4gICAgICBnZXRDb21wb25lbnRSZWYsXG4gICAgICBtZXJnZUNvbCxcbiAgICAgIHZhbGlkYXRlLFxuICAgICAgY29tcHV0ZWRHcm91cCxcbiAgICAgIGdldENvbnRleHRGbixcbiAgICAgIGZvcm1JdGVtU2hvdyxcbiAgICAgIGdyb3VwSXRlbVNob3csXG4gICAgICBpc0RpcnR5LFxuICAgICAgbWVyZ2VkU2xvdHNcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1mb3JtIHtcbiAgLmVsLWNvbGxhcHNlLWl0ZW1fX2NvbnRlbnQge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgcGFkZGluZy1sZWZ0OiAzMHB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDMwcHg7XG4gIH1cblxuICAuZnMtZm9ybS1pbnZhbGlkIHtcbiAgfVxuXG4gIC5mcy1mb3JtLWl0ZW0tY29tcG9uZW50IHtcbiAgICAuYW50LXBpY2tlcixcbiAgICAuYW50LWlucHV0LWFmZml4LXdyYXBwZXIsXG4gICAgLmFudC1pbnB1dC1udW1iZXIsXG4gICAgLmVsLWNhc2NhZGVyLFxuICAgIC5lbC1kYXRlLWVkaXRvcixcbiAgICAuZWwtaW5wdXQtbnVtYmVyLFxuICAgIC5lbC1pbnB1dCxcbiAgICA+IC5lbC1zZWxlY3QsXG4gICAgPiAubi1zZWxlY3QsXG4gICAgLm4tZGF0ZS1waWNrZXIsXG4gICAgLm4taW5wdXQtbnVtYmVyIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2ljb24ge1xuICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgfVxuICAgIC5lbC1kYXRlLWVkaXRvciAuZWwtcmFuZ2VfX2Nsb3NlLWljb24ge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgIH1cblxuICAgIC5lbC1yYW5nZS1lZGl0b3IuZWwtaW5wdXRfX3dyYXBwZXIge1xuICAgICAgcGFkZGluZzogMDtcbiAgICB9XG4gIH1cblxuICAvLy5lbC1kYXRlLWVkaXRvci5lbC1pbnB1dF9fd3JhcHBlciB7XG4gIC8vICB3aWR0aDogMTAwJTtcbiAgLy99XG59XG5cbi5mcy1mb3JtLWdyaWQge1xuICAuZnMtcm93IHtcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNTAlIDUwJTtcbiAgICAvLyBnYXA6IDAgMjBweDsgLy/liJfpl7Tot50gMjBweFxuICAgIC5mcy1jb2wge1xuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLy8gYW50ZHZcbiAgICAuYW50LWZvcm0taXRlbS1sYWJlbCB7XG4gICAgICB3aWR0aDogMTAwcHg7XG4gICAgICBmbGV4OiBub25lO1xuICAgICAgbWF4LXdpZHRoOiBub25lO1xuICAgIH1cbiAgICAuYW50LWZvcm0taXRlbS1jb250cm9sLXdyYXBwZXIge1xuICAgICAgZmxleDogMTtcbiAgICAgIG1heC13aWR0aDogbm9uZTtcbiAgICB9XG4gIH1cblxuICAvLyBlbGVtZW50XG4gIC5lbC1yb3c6OmFmdGVyLFxuICAuZWwtcm93OjpiZWZvcmUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cbi5mcy1mb3JtLWZsZXgge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbiAgZmxleC13cmFwOiB3cmFwO1xuICAuZnMtcm93IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgLmZzLWZvcm0tZmxleCB7XG4gICAgLmZzLXJvdyB7XG4gICAgICAuZnMtY29sIHtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgZmxleDogMCAwIDEwMCU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA1NzVweCkge1xuICAuZnMtZm9ybS1mbGV4IHtcbiAgICAuZnMtcm93IHtcbiAgICAgIC5mcy1jb2wge1xuICAgICAgICAvLy5hbnQtZm9ybS1pdGVtLWxhYmVsIHtcbiAgICAgICAgLy8gIGZsZXg6IG5vbmU7XG4gICAgICAgIC8vfVxuICAgICAgICAvLy5hbnQtZm9ybS1pdGVtIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xuICAgICAgICAvLyAgZmxleDogMTtcbiAgICAgICAgLy8gIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgLy99XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50XG4gICAgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiXG4gICAgdi1pZj1cImNvbXB1dGVkSXRlbVwiXG4gICAgY2xhc3M9XCJmcy1mb3JtLWl0ZW1cIlxuICAgIDpbdWkuZm9ybUl0ZW0ucHJvcF09XCJjb21wdXRlZEtleVwiXG4gICAgdi1iaW5kPVwiY29tcHV0ZWRJdGVtXCJcbiAgICA6cGF0aD1cImNvbXB1dGVkSXRlbS5rZXlcIlxuICAgIDpydWxlLXBhdGg9XCJjb21wdXRlZEl0ZW0ua2V5XCJcbiAgPlxuICAgIDx0ZW1wbGF0ZSAjbGFiZWw+XG4gICAgICA8c3BhbiB2LWlmPVwiY29tcHV0ZWRMYWJlbElzUmVuZGVyXCIgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtdGV4dFwiPlxuICAgICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkTGFiZWxSZW5kZXJcIj48L2ZzLXJlbmRlcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIHYtZWxzZSBjbGFzcz1cImZzLWZvcm0taXRlbS1sYWJlbC10ZXh0XCIgOnRpdGxlPVwiY29tcHV0ZWRMYWJlbFwiPlxuICAgICAgICB7eyBjb21wdXRlZExhYmVsIH19XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxjb21wb25lbnRcbiAgICAgICAgOmlzPVwidWkudG9vbHRpcC5uYW1lXCJcbiAgICAgICAgdi1pZj1cImNvbXB1dGVkSXRlbS5oZWxwZXIgJiYgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbiA9PT0gJ2xhYmVsJ1wiXG4gICAgICAgIHYtYmluZD1cImNvbXB1dGVkSGVscGVyVG9vbHRpcFwiXG4gICAgICA+XG4gICAgICAgIDx0ZW1wbGF0ZSAjW3VpLnRvb2x0aXAuY29udGVudF0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1mb3JtLWhlbHBlci10b29sdGlwXCI+XG4gICAgICAgICAgICA8ZnMtZm9ybS1oZWxwZXIgOmhlbHBlcj1cImNvbXB1dGVkSXRlbS5oZWxwZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8dGVtcGxhdGUgI1t1aS50b29sdGlwLnRyaWdnZXJdPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtZm9ybS1pdGVtLWxhYmVsLWljb25cIj5cbiAgICAgICAgICAgIDxmcy1pY29uIGNsYXNzPVwiZnMtZm9ybS1pdGVtLWxhYmVsLWljb24taW5uZXJcIiA6aWNvbj1cInVpLmljb25zLnF1ZXN0aW9uXCI+PC9mcy1pY29uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cImZzLWZvcm0taXRlbS1jb250ZW50XCI+XG4gICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJjb21wdXRlZEl0ZW0udG9wUmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLnRvcFJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tcmVuZGVyXCI+XG4gICAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS5wcmVmaXhSZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0ucHJlZml4UmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1pdGVtLWNvbXBvbmVudFwiPlxuICAgICAgICAgIDxmcy1zbG90LXJlbmRlciB2LWlmPVwiZm9ybVNsb3RcIiA6c2xvdHM9XCJmb3JtU2xvdFwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwiY29tcHV0ZWRJdGVtLmNvbXBvbmVudD8uc2hvdyAhPT0gZmFsc2VcIj5cbiAgICAgICAgICAgIDxmcy1yZW5kZXJcbiAgICAgICAgICAgICAgdi1pZj1cIlxuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXRlbS5jb25kaXRpb25hbFJlbmRlciAmJlxuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXRlbS5jb25kaXRpb25hbFJlbmRlci5tYXRjaCAmJlxuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXRlbS5jb25kaXRpb25hbFJlbmRlci5tYXRjaChzY29wZUZ1bmMoKSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLmNvbmRpdGlvbmFsUmVuZGVyLnJlbmRlclwiXG4gICAgICAgICAgICAgIDpzY29wZT1cInNjb3BlRnVuYygpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZnMtcmVuZGVyIHYtZWxzZS1pZj1cImNvbXB1dGVkSXRlbS5yZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0ucmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgICAgICAgPGZzLWNvbXBvbmVudC1yZW5kZXJcbiAgICAgICAgICAgICAgdi1lbHNlXG4gICAgICAgICAgICAgIHJlZj1cImNvbXBvbmVudFJlbmRlclJlZlwiXG4gICAgICAgICAgICAgIHYtYmluZD1cImNvbXB1dGVkSXRlbS5jb21wb25lbnRcIlxuICAgICAgICAgICAgICA6bW9kZWwtdmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICAgICAgICAgICAgOnNjb3BlPVwic2NvcGVGdW5jKClcIlxuICAgICAgICAgICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwidXBkYXRlTW9kZWxWYWx1ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJjb21wdXRlZEl0ZW0uc3VmZml4UmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLnN1ZmZpeFJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGZzLXJlbmRlciB2LWlmPVwiY29tcHV0ZWRJdGVtLmJvdHRvbVJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5ib3R0b21SZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICA8dGVtcGxhdGUgdi1pZj1cImNvbXB1dGVkSXRlbS5oZWxwZXIgJiYgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbiAhPT0gJ2xhYmVsJ1wiPlxuICAgICAgICA8ZnMtZm9ybS1oZWxwZXIgOmhlbHBlcj1cImNvbXB1dGVkSXRlbS5oZWxwZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvZGl2PlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgcmVmLCBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBSZWYsIFByb3BUeXBlIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IEZzUmVuZGVyIGZyb20gXCIuLi9yZW5kZXIvZnMtcmVuZGVyLmpzXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSwgdXNlVWksIHVzZUNvbXB1dGUgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG4vKipcbiAqIGZvcm0taXRlbee7hOS7tuWwgeijhVxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRm9ybUl0ZW1cIixcbiAgY29tcG9uZW50czogeyBGc1JlbmRlciB9LFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOihqOWNleWtl+auteWAvCh2LW1vZGVsKVxuICAgICAqL1xuICAgIG1vZGVsVmFsdWU6IHt9LFxuICAgIC8qKlxuICAgICAqIOWtl+autemFjee9rlxuICAgICAqL1xuICAgIGl0ZW06IHtcbiAgICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxhbnk+LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlrZfmrrXnu4Tku7bmj5Lmp71cbiAgICAgKi9cbiAgICBmb3JtU2xvdDoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIGdldENvbnRleHRGbjoge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIGhlbHBlcjoge1xuICAgICAgdHlwZTogW1N0cmluZywgT2JqZWN0XVxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcInVwZGF0ZTptb2RlbFZhbHVlXCJdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlbmRlclJlZiA9IHJlZigpO1xuXG4gICAgY29uc3QgeyBkb0NvbXB1dGVkIH0gPSB1c2VDb21wdXRlKCk7XG5cbiAgICB1dGlscy50cmFjZShcImZzLWZvcm0taXRlbVwiKTtcbiAgICAvLyBjb25zdCBzY29wZUNvbXB1dGVkOiBSZWY8U2NvcGVDb250ZXh0PiA9IGNvbXB1dGVkKCgpID0+IHt9KTtcblxuICAgIGNvbnN0IHNjb3BlRnVuYyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNjb3BlID0gcHJvcHMuZ2V0Q29udGV4dEZuID8gcHJvcHMuZ2V0Q29udGV4dEZuKCkgOiB7fTtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBwcm9wcy5tb2RlbFZhbHVlLCBrZXk6IHByb3BzLml0ZW0ua2V5LCAuLi5zY29wZSB9O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVNb2RlbFZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgdmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoaXNBc3luYyA9IGZhbHNlKSB7XG4gICAgICBpZiAoaXNBc3luYykge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50UmVuZGVyUmVmLnZhbHVlPy5nZXRUYXJnZXRSZWZBc3luYygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZi52YWx1ZT8uZ2V0VGFyZ2V0UmVmKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRJdGVtID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0ge1xuICAgICAgICAuLi5wcm9wcy5pdGVtXG4gICAgICB9O1xuICAgICAgZGVsZXRlIHJlcy50aXRsZTtcbiAgICAgIGRlbGV0ZSByZXMubGFiZWw7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBwcm9wcy5pdGVtPy5oZWxwZXI/LnBvc2l0aW9uIHx8IChwcm9wcy5oZWxwZXIgYXMgYW55KT8ucG9zaXRpb247XG4gICAgfSk7XG4gICAgY29uc3QgY29tcHV0ZWRIZWxwZXJUb29sdGlwID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIG1lcmdlKHt9LCBwcm9wcy5pdGVtLmhlbHBlcj8udG9vbHRpcCwgKHByb3BzLmhlbHBlciBhcyBhbnkpPy50b29sdGlwKTtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlZEtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChwcm9wcy5pdGVtID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLml0ZW0ua2V5LmluZGV4T2YoXCIuXCIpID49IDApIHtcbiAgICAgICAgcmV0dXJuIHByb3BzLml0ZW0ua2V5LnNwbGl0KFwiLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wcy5pdGVtLmtleTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkTGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuaXRlbS5sYWJlbCB8fCBwcm9wcy5pdGVtLnRpdGxlO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXB1dGVkTGFiZWxJc1JlbmRlciA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBjb21wdXRlZExhYmVsLnZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZExhYmVsUmVuZGVyID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIGNvbXB1dGVkTGFiZWwudmFsdWUoc2NvcGVGdW5jKCkpO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICB1cGRhdGVNb2RlbFZhbHVlLFxuICAgICAgc2NvcGVGdW5jLFxuICAgICAgZ2V0Q29tcG9uZW50UmVmLFxuICAgICAgY29tcG9uZW50UmVuZGVyUmVmLFxuICAgICAgY29tcHV0ZWRIZWxwZXJQb3NpdGlvbixcbiAgICAgIGNvbXB1dGVkSGVscGVyVG9vbHRpcCxcbiAgICAgIGNvbXB1dGVkS2V5LFxuICAgICAgY29tcHV0ZWRMYWJlbElzUmVuZGVyLFxuICAgICAgY29tcHV0ZWRMYWJlbCxcbiAgICAgIGNvbXB1dGVkTGFiZWxSZW5kZXIsXG4gICAgICBjb21wdXRlZEl0ZW1cbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1mb3JtLWl0ZW0ge1xuICAuYW50LWZvcm0taXRlbS1sYWJlbCB7XG4gICAgLy9saW5lLWhlaWdodDogMTtcbiAgICAuZnMtZm9ybS1pdGVtLWxhYmVsLXRleHQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cbiAgfVxuICAuZWwtZm9ybS1pdGVtIHtcbiAgICAuZnMtZm9ybS1pdGVtLWxhYmVsLWljb24ge1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICBoZWlnaHQ6IGluaGVyaXQ7XG4gICAgfVxuICB9XG4gIC5mcy1mb3JtLWl0ZW0tbGFiZWwtaWNvbiB7XG4gICAgbWFyZ2luOiAwIDJweDtcbiAgICAuZnMtZm9ybS1pdGVtLWxhYmVsLWljb24taW5uZXIge1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgICBoZWlnaHQ6IGluaGVyaXQ7XG4gICAgfVxuICB9XG4gIC5mcy1mb3JtLWl0ZW0tY29udGVudCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZsZXg6IDE7XG4gICAgLmZzLWZvcm0taXRlbS1yZW5kZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgICAuZnMtZm9ybS1pdGVtLWNvbXBvbmVudCB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi5mcy1mb3JtLWhlbHBlci10b29sdGlwIHtcbiAgLmZzLWZvcm0taGVscGVyIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cInVpLmZvcm1JdGVtLm5hbWVcIlxuICAgIHYtaWY9XCJjb21wdXRlZEl0ZW1cIlxuICAgIGNsYXNzPVwiZnMtZm9ybS1pdGVtXCJcbiAgICA6W3VpLmZvcm1JdGVtLnByb3BdPVwiY29tcHV0ZWRLZXlcIlxuICAgIHYtYmluZD1cImNvbXB1dGVkSXRlbVwiXG4gICAgOnBhdGg9XCJjb21wdXRlZEl0ZW0ua2V5XCJcbiAgICA6cnVsZS1wYXRoPVwiY29tcHV0ZWRJdGVtLmtleVwiXG4gID5cbiAgICA8dGVtcGxhdGUgI2xhYmVsPlxuICAgICAgPHNwYW4gdi1pZj1cImNvbXB1dGVkTGFiZWxJc1JlbmRlclwiIGNsYXNzPVwiZnMtZm9ybS1pdGVtLWxhYmVsLXRleHRcIj5cbiAgICAgICAgPGZzLXJlbmRlciA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZExhYmVsUmVuZGVyXCI+PC9mcy1yZW5kZXI+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiB2LWVsc2UgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tbGFiZWwtdGV4dFwiIDp0aXRsZT1cImNvbXB1dGVkTGFiZWxcIj5cbiAgICAgICAge3sgY29tcHV0ZWRMYWJlbCB9fVxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLnRvb2x0aXAubmFtZVwiXG4gICAgICAgIHYtaWY9XCJjb21wdXRlZEl0ZW0uaGVscGVyICYmIGNvbXB1dGVkSGVscGVyUG9zaXRpb24gPT09ICdsYWJlbCdcIlxuICAgICAgICB2LWJpbmQ9XCJjb21wdXRlZEhlbHBlclRvb2x0aXBcIlxuICAgICAgPlxuICAgICAgICA8dGVtcGxhdGUgI1t1aS50b29sdGlwLmNvbnRlbnRdPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtZm9ybS1oZWxwZXItdG9vbHRpcFwiPlxuICAgICAgICAgICAgPGZzLWZvcm0taGVscGVyIDpoZWxwZXI9XCJjb21wdXRlZEl0ZW0uaGVscGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPHRlbXBsYXRlICNbdWkudG9vbHRpcC50cmlnZ2VyXT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZzLWZvcm0taXRlbS1sYWJlbC1pY29uXCI+XG4gICAgICAgICAgICA8ZnMtaWNvbiBjbGFzcz1cImZzLWZvcm0taXRlbS1sYWJlbC1pY29uLWlubmVyXCIgOmljb249XCJ1aS5pY29ucy5xdWVzdGlvblwiPjwvZnMtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L2NvbXBvbmVudD5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLWl0ZW0tY29udGVudFwiPlxuICAgICAgPGZzLXJlbmRlciB2LWlmPVwiY29tcHV0ZWRJdGVtLnRvcFJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS50b3BSZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1pdGVtLXJlbmRlclwiPlxuICAgICAgICA8ZnMtcmVuZGVyIHYtaWY9XCJjb21wdXRlZEl0ZW0ucHJlZml4UmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLnByZWZpeFJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLWZvcm0taXRlbS1jb21wb25lbnRcIj5cbiAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgdi1pZj1cImZvcm1TbG90XCIgOnNsb3RzPVwiZm9ybVNsb3RcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZS1pZj1cImNvbXB1dGVkSXRlbS5jb21wb25lbnQ/LnNob3cgIT09IGZhbHNlXCI+XG4gICAgICAgICAgICA8ZnMtcmVuZGVyXG4gICAgICAgICAgICAgIHYtaWY9XCJcbiAgICAgICAgICAgICAgICBjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIgJiZcbiAgICAgICAgICAgICAgICBjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIubWF0Y2ggJiZcbiAgICAgICAgICAgICAgICBjb21wdXRlZEl0ZW0uY29uZGl0aW9uYWxSZW5kZXIubWF0Y2goc2NvcGVGdW5jKCkpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5jb25kaXRpb25hbFJlbmRlci5yZW5kZXJcIlxuICAgICAgICAgICAgICA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGZzLXJlbmRlciB2LWVsc2UtaWY9XCJjb21wdXRlZEl0ZW0ucmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiY29tcHV0ZWRJdGVtLnJlbmRlclwiIDpzY29wZT1cInNjb3BlRnVuYygpXCIgLz5cbiAgICAgICAgICAgIDxmcy1jb21wb25lbnQtcmVuZGVyXG4gICAgICAgICAgICAgIHYtZWxzZVxuICAgICAgICAgICAgICByZWY9XCJjb21wb25lbnRSZW5kZXJSZWZcIlxuICAgICAgICAgICAgICB2LWJpbmQ9XCJjb21wdXRlZEl0ZW0uY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgOm1vZGVsLXZhbHVlPVwibW9kZWxWYWx1ZVwiXG4gICAgICAgICAgICAgIDpzY29wZT1cInNjb3BlRnVuYygpXCJcbiAgICAgICAgICAgICAgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInVwZGF0ZU1vZGVsVmFsdWVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGZzLXJlbmRlciB2LWlmPVwiY29tcHV0ZWRJdGVtLnN1ZmZpeFJlbmRlclwiIDpyZW5kZXItZnVuYz1cImNvbXB1dGVkSXRlbS5zdWZmaXhSZW5kZXJcIiA6c2NvcGU9XCJzY29wZUZ1bmMoKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxmcy1yZW5kZXIgdi1pZj1cImNvbXB1dGVkSXRlbS5ib3R0b21SZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJjb21wdXRlZEl0ZW0uYm90dG9tUmVuZGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJjb21wdXRlZEl0ZW0uaGVscGVyICYmIGNvbXB1dGVkSGVscGVyUG9zaXRpb24gIT09ICdsYWJlbCdcIj5cbiAgICAgICAgPGZzLWZvcm0taGVscGVyIDpoZWxwZXI9XCJjb21wdXRlZEl0ZW0uaGVscGVyXCIgOnNjb3BlPVwic2NvcGVGdW5jKClcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHJlZiwgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgUmVmLCBQcm9wVHlwZSB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCBGc1JlbmRlciBmcm9tIFwiLi4vcmVuZGVyL2ZzLXJlbmRlci5qc1wiO1xuaW1wb3J0IHsgdXNlTWVyZ2UsIHVzZVVpLCB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi8uLi91dGlsc1wiO1xuLyoqXG4gKiBmb3JtLWl0ZW3nu4Tku7blsIHoo4VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0Zvcm1JdGVtXCIsXG4gIGNvbXBvbmVudHM6IHsgRnNSZW5kZXIgfSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDooajljZXlrZfmrrXlgLwodi1tb2RlbClcbiAgICAgKi9cbiAgICBtb2RlbFZhbHVlOiB7fSxcbiAgICAvKipcbiAgICAgKiDlrZfmrrXphY3nva5cbiAgICAgKi9cbiAgICBpdGVtOiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8YW55PixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5a2X5q6157uE5Lu25o+S5qe9XG4gICAgICovXG4gICAgZm9ybVNsb3Q6IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICBnZXRDb250ZXh0Rm46IHtcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICBoZWxwZXI6IHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE9iamVjdF1cbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCBjb21wb25lbnRSZW5kZXJSZWYgPSByZWYoKTtcblxuICAgIGNvbnN0IHsgZG9Db21wdXRlZCB9ID0gdXNlQ29tcHV0ZSgpO1xuXG4gICAgdXRpbHMudHJhY2UoXCJmcy1mb3JtLWl0ZW1cIik7XG4gICAgLy8gY29uc3Qgc2NvcGVDb21wdXRlZDogUmVmPFNjb3BlQ29udGV4dD4gPSBjb21wdXRlZCgoKSA9PiB7fSk7XG5cbiAgICBjb25zdCBzY29wZUZ1bmMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IHByb3BzLmdldENvbnRleHRGbiA/IHByb3BzLmdldENvbnRleHRGbigpIDoge307XG4gICAgICByZXR1cm4geyB2YWx1ZTogcHJvcHMubW9kZWxWYWx1ZSwga2V5OiBwcm9wcy5pdGVtLmtleSwgLi4uc2NvcGUgfTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdXBkYXRlTW9kZWxWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICBjdHguZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGlzQXN5bmMgPSBmYWxzZSkge1xuICAgICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZi52YWx1ZT8uZ2V0VGFyZ2V0UmVmQXN5bmMoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21wb25lbnRSZW5kZXJSZWYudmFsdWU/LmdldFRhcmdldFJlZigpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkSXRlbSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IHtcbiAgICAgICAgLi4ucHJvcHMuaXRlbVxuICAgICAgfTtcbiAgICAgIGRlbGV0ZSByZXMudGl0bGU7XG4gICAgICBkZWxldGUgcmVzLmxhYmVsO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXB1dGVkSGVscGVyUG9zaXRpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuaXRlbT8uaGVscGVyPy5wb3NpdGlvbiB8fCAocHJvcHMuaGVscGVyIGFzIGFueSk/LnBvc2l0aW9uO1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXB1dGVkSGVscGVyVG9vbHRpcCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBtZXJnZSh7fSwgcHJvcHMuaXRlbS5oZWxwZXI/LnRvb2x0aXAsIChwcm9wcy5oZWxwZXIgYXMgYW55KT8udG9vbHRpcCk7XG4gICAgfSk7XG4gICAgY29uc3QgY29tcHV0ZWRLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAocHJvcHMuaXRlbSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5pdGVtLmtleS5pbmRleE9mKFwiLlwiKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiBwcm9wcy5pdGVtLmtleS5zcGxpdChcIi5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMuaXRlbS5rZXk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZExhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb3BzLml0ZW0ubGFiZWwgfHwgcHJvcHMuaXRlbS50aXRsZTtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlZExhYmVsSXNSZW5kZXIgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gY29tcHV0ZWRMYWJlbC52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcHV0ZWRMYWJlbFJlbmRlciA9ICgpID0+IHtcbiAgICAgIHJldHVybiBjb21wdXRlZExhYmVsLnZhbHVlKHNjb3BlRnVuYygpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgdXBkYXRlTW9kZWxWYWx1ZSxcbiAgICAgIHNjb3BlRnVuYyxcbiAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgIGNvbXBvbmVudFJlbmRlclJlZixcbiAgICAgIGNvbXB1dGVkSGVscGVyUG9zaXRpb24sXG4gICAgICBjb21wdXRlZEhlbHBlclRvb2x0aXAsXG4gICAgICBjb21wdXRlZEtleSxcbiAgICAgIGNvbXB1dGVkTGFiZWxJc1JlbmRlcixcbiAgICAgIGNvbXB1dGVkTGFiZWwsXG4gICAgICBjb21wdXRlZExhYmVsUmVuZGVyLFxuICAgICAgY29tcHV0ZWRJdGVtXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtZm9ybS1pdGVtIHtcbiAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgIC8vbGluZS1oZWlnaHQ6IDE7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC10ZXh0IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG4gIH1cbiAgLmVsLWZvcm0taXRlbSB7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC1pY29uIHtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgIH1cbiAgfVxuICAuZnMtZm9ybS1pdGVtLWxhYmVsLWljb24ge1xuICAgIG1hcmdpbjogMCAycHg7XG4gICAgLmZzLWZvcm0taXRlbS1sYWJlbC1pY29uLWlubmVyIHtcbiAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgIH1cbiAgfVxuICAuZnMtZm9ybS1pdGVtLWNvbnRlbnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBmbGV4OiAxO1xuICAgIC5mcy1mb3JtLWl0ZW0tcmVuZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgICAgLmZzLWZvcm0taXRlbS1jb21wb25lbnQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4uZnMtZm9ybS1oZWxwZXItdG9vbHRpcCB7XG4gIC5mcy1mb3JtLWhlbHBlciB7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnRcbiAgICA6aXM9XCJ1aS5jb2wubmFtZVwiXG4gICAgdi1pZj1cImNvbXB1dGVkSXRlbSAmJiBjb21wdXRlZEl0ZW0uc2hvdyAhPT0gZmFsc2VcIlxuICAgIGNsYXNzPVwiZnMtY29sXCJcbiAgICB2LWJpbmQ9XCJtZXJnZShjb2wsIGNvbXB1dGVkSXRlbT8uY29sKVwiXG4gID5cbiAgICA8ZnMtZm9ybS1pdGVtXG4gICAgICB2LWlmPVwiY29tcHV0ZWRJdGVtICYmIGNvbXB1dGVkSXRlbT8uYmxhbmsgIT09IHRydWVcIlxuICAgICAgcmVmPVwiZm9ybUl0ZW1SZWZcIlxuICAgICAgOml0ZW09XCJjb21wdXRlZEl0ZW1cIlxuICAgICAgOmZvcm0tc2xvdD1cInNsb3RzXCJcbiAgICAgIDpnZXQtY29udGV4dC1mbj1cImdldENvbnRleHRGblwiXG4gICAgICA6aGVscGVyPVwiaGVscGVyXCJcbiAgICAgIHYtYmluZD1cImF0dHJzXCJcbiAgICAvPlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiIHNldHVwPlxuaW1wb3J0IHsgdXNlQXR0cnMsIGRlZmluZVByb3BzLCBQcm9wVHlwZSwgcmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiQGZhc3QtY3J1ZC91aS1pbnRlcmZhY2VcIjtcbmNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzKHtcbiAgLyoqXG4gICAqIOWtl+autemFjee9rlxuICAgKi9cbiAgaXRlbToge1xuICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxhbnk+LFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICB9LFxuICAvKipcbiAgICog5a2X5q6157uE5Lu25o+S5qe9XG4gICAqL1xuICBzbG90czoge1xuICAgIHR5cGU6IEZ1bmN0aW9uLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICB9LFxuICBnZXRDb250ZXh0Rm46IHtcbiAgICB0eXBlOiBGdW5jdGlvbixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgfSxcbiAgY29sOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH0sXG4gIGhlbHBlcjoge1xuICAgIHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gIH1cbn0pO1xuY29uc3QgeyBkb0NvbXB1dGVkIH0gPSB1c2VDb21wdXRlKCk7XG5jb25zdCBjb21wdXRlZEl0ZW0gPSBkb0NvbXB1dGVkKFxuICAoKSA9PiB7XG4gICAgcmV0dXJuIHByb3BzLml0ZW07XG4gIH0sXG4gICgpID0+IHtcbiAgICByZXR1cm4gcHJvcHMuZ2V0Q29udGV4dEZuKCk7XG4gIH1cbik7XG5cbmNvbnN0IGF0dHJzID0gdXNlQXR0cnMoKTtcbmNvbnN0IGZvcm1JdGVtUmVmID0gcmVmKCk7XG5mdW5jdGlvbiBnZXRGb3JtSXRlbVJlZigpIHtcbiAgcmV0dXJuIGZvcm1JdGVtUmVmLnZhbHVlO1xufVxuXG5kZWZpbmVFeHBvc2Uoe1xuICBnZXRGb3JtSXRlbVJlZlxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtZm9ybS1pdGVtLWNvbCB7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtZm9ybS1oZWxwZXJcIj5cbiAgICA8cHJlIHYtaWY9XCJ0eXBlb2YgaGVscGVyID09PSAnc3RyaW5nJ1wiPnt7IGhlbHBlciB9fTwvcHJlPlxuICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCJoZWxwZXIucmVuZGVyXCI+XG4gICAgICA8ZnMtcmVuZGVyIDpyZW5kZXItZnVuYz1cImhlbHBlci5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZVwiIC8+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8cHJlIHYtZWxzZS1pZj1cImhlbHBlci50ZXh0XCI+e3sgaGVscGVyLnRleHQgfX08L3ByZT5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB1dGlscyBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcblxuLyoqXG4gKiDooajljZXlrZfmrrXluK7liqnor7TmmI7nu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc0Zvcm1IZWxwZXJcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDluK7liqnor7TmmI4sIHRleHQ6IOivtOaYjuaWh+WtlywgcmVuZGVyOiBmdW5jdGlvbihzY29wZSkg6Ieq5a6a5LmJ5riy5p+TXG4gICAgICovXG4gICAgaGVscGVyOiB7XG4gICAgICB0eXBlOiBbXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0ZXh0OiDor7TmmI7mloflrZcsXG4gICAgICAgICAqIHJlbmRlcjogZnVuY3Rpb24gLCDoh6rlrprkuYlyZW5kZXJcbiAgICAgICAgICovXG4gICAgICAgIE9iamVjdCxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOivtOaYjuaWh+acrFxuICAgICAgICAgKi9cbiAgICAgICAgU3RyaW5nXG4gICAgICBdXG4gICAgfSxcbiAgICBzY29wZToge31cbiAgfSxcbiAgc2V0dXAocHJvcHMpIHtcbiAgICB1dGlscy50cmFjZShcImZzLWZvcm0taXRlbVwiKTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWZvcm0taGVscGVyIHtcbiAgY29sb3I6ICM3ZTdlN2U7XG4gIGxpbmUtaGVpZ2h0OiAxLjM7XG4gIG1hcmdpbi10b3A6IDRweDtcbiAgbWFyZ2luLWJvdHRvbTogNnB4O1xuXG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgcHJlIHtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgIG1hcmdpbi1ib3R0b206IDBweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWZvcm0taGVscGVyXCI+XG4gICAgPHByZSB2LWlmPVwidHlwZW9mIGhlbHBlciA9PT0gJ3N0cmluZydcIj57eyBoZWxwZXIgfX08L3ByZT5cbiAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwiaGVscGVyLnJlbmRlclwiPlxuICAgICAgPGZzLXJlbmRlciA6cmVuZGVyLWZ1bmM9XCJoZWxwZXIucmVuZGVyXCIgOnNjb3BlPVwic2NvcGVcIiAvPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHByZSB2LWVsc2UtaWY9XCJoZWxwZXIudGV4dFwiPnt7IGhlbHBlci50ZXh0IH19PC9wcmU+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5cbi8qKlxuICog6KGo5Y2V5a2X5q615biu5Yqp6K+05piO57uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNGb3JtSGVscGVyXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5biu5Yqp6K+05piOLCB0ZXh0OiDor7TmmI7mloflrZcsIHJlbmRlcjogZnVuY3Rpb24oc2NvcGUpIOiHquWumuS5iea4suafk1xuICAgICAqL1xuICAgIGhlbHBlcjoge1xuICAgICAgdHlwZTogW1xuICAgICAgICAvKipcbiAgICAgICAgICogdGV4dDog6K+05piO5paH5a2XLFxuICAgICAgICAgKiByZW5kZXI6IGZ1bmN0aW9uICwg6Ieq5a6a5LmJcmVuZGVyXG4gICAgICAgICAqL1xuICAgICAgICBPYmplY3QsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDor7TmmI7mlofmnKxcbiAgICAgICAgICovXG4gICAgICAgIFN0cmluZ1xuICAgICAgXVxuICAgIH0sXG4gICAgc2NvcGU6IHt9XG4gIH0sXG4gIHNldHVwKHByb3BzKSB7XG4gICAgdXRpbHMudHJhY2UoXCJmcy1mb3JtLWl0ZW1cIik7XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1mb3JtLWhlbHBlciB7XG4gIGNvbG9yOiAjN2U3ZTdlO1xuICBsaW5lLWhlaWdodDogMS4zO1xuICBtYXJnaW4tdG9wOiA0cHg7XG4gIG1hcmdpbi1ib3R0b206IDZweDtcblxuICBmb250LXNpemU6IDEycHg7XG4gIHByZSB7XG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLG51bGwsIjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgYXMgX19NQUNST1NfZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qLyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzRm9ybVByb3ZpZGVyXCJcbn0pO1xuPC9zY3JpcHQ+XG48dGVtcGxhdGU+XG4gIDxzbG90Pjwvc2xvdD5cbiAgPGZzLWZvcm0td3JhcHBlciB2LWZvcj1cIml0ZW0gb2YgZm9ybVdyYXBwZXJMaXN0XCIgOmtleT1cIml0ZW0uaWRcIiB2LWJpbmQ9XCJpdGVtXCIgLz5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBwcm92aWRlLCBSZWYsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCBGc0Zvcm1XcmFwcGVyIGZyb20gXCIuL2ZzLWZvcm0td3JhcHBlci5qc1wiO1xuaW1wb3J0IHsgT3BlbkRpYWxvZ1Byb3BzIH0gZnJvbSBcIi4uLy4uL2RcIjtcblxuO1xuXG5jb25zdCBmb3JtV3JhcHBlckxpc3Q6IFJlZiA9IHJlZih7fSk7XG5cbmZ1bmN0aW9uIGdldE1heFpJbmRleCgpOiBudW1iZXIge1xuICBsZXQgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiKlwiKTtcbiAgbGV0IG1heFppbmRleCA9IDEwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG1heFppbmRleCA9IE1hdGgubWF4KG1heFppbmRleCwgZWxlbWVudHNbaV0uc3R5bGUuekluZGV4IHx8IDApO1xuICB9XG4gIHJldHVybiBtYXhaaW5kZXg7XG59XG5cbnByb3ZpZGUoXCJ1c2U6Zm9ybTp3cmFwcGVyXCIsICgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvcGVuKG9wdHM6IE9wZW5EaWFsb2dQcm9wcykge1xuICAgICAgY29uc3QgaWQgPSBvcHRzLmlkIHx8IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApICsgXCJcIjtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGZvcm1XcmFwcGVyTGlzdC52YWx1ZVtpZF0gPSB7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgLy8gekluZGV4OiBnZXRNYXhaSW5kZXgoKSArIDEsXG4gICAgICAgICAgYXN5bmMgb25Nb3VudGVkKGluc3RhbmNlOiBhbnkpIHtcbiAgICAgICAgICAgIGF3YWl0IGluc3RhbmNlLm9wZW4ob3B0cyk7XG4gICAgICAgICAgICByZXNvbHZlKGluc3RhbmNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ2xvc2VkKCkge1xuICAgICAgICAgICAgaWYgKCFvcHRzLmlkKSB7XG4gICAgICAgICAgICAgIC8v5aaC5p6c5LiN5piv5Zu65a6aaWTvvIzliJnlhbPpl63lkI7plIDmr4FcbiAgICAgICAgICAgICAgZGVsZXRlIGZvcm1XcmFwcGVyTGlzdC52YWx1ZVtpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cImNvbnRhaW5lcj8uaXMgfHwgJ2ZzLWxheW91dC1kZWZhdWx0J1wiXG4gICAgcmVmPVwiY29udGFpbmVyUmVmXCJcbiAgICBjbGFzcz1cImZzLWNydWQtY29udGFpbmVyXCJcbiAgICB2LWJpbmQ9XCJjb250YWluZXJcIlxuICAgIDpjbGFzcz1cImNvbXB1dGVkQ2xhc3NcIlxuICA+XG4gICAgPHNsb3Q+PC9zbG90PlxuXG4gICAgPHRlbXBsYXRlICNoZWFkZXItdG9wPlxuICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci10b3BcIj48L3Nsb3Q+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgI2hlYWRlci1ib3R0b20+XG4gICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSAjaGVhZGVyLW1pZGRsZT5cbiAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItbWlkZGxlXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgI3NlYXJjaD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLXNlYXJjaFwiPlxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInNlYXJjaC5pcyB8fCAnZnMtc2VhcmNoJ1wiIHJlZj1cInNlYXJjaFJlZlwiIHYtYmluZD1cInNlYXJjaFwiIDpzbG90cz1cImNvbXB1dGVkU2VhcmNoU2xvdHNcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjYWN0aW9uYmFyPlxuICAgICAgPGRpdiB2LWlmPVwiYWN0aW9uYmFyICYmIGFjdGlvbmJhci5zaG93ICE9PSBmYWxzZVwiIGNsYXNzPVwiZnMtY3J1ZC1hY3Rpb25iYXJcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvbmJhci1sZWZ0XCI+PC9zbG90PlxuICAgICAgICA8ZnMtYWN0aW9uYmFyIHYtYmluZD1cImFjdGlvbmJhclwiIC8+XG4gICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXItcmlnaHRcIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICN0b29sYmFyPlxuICAgICAgPGRpdiB2LWlmPVwidG9vbGJhciAmJiB0b29sYmFyLnNob3cgIT09IGZhbHNlXCIgY2xhc3M9XCJmcy1jcnVkLXRvb2xiYXJcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cInRvb2xiYXItbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgPGZzLXRvb2xiYXIgcmVmPVwidG9vbGJhclJlZlwiIHYtYmluZD1cInRvb2xiYXJcIiA6c2xvdHM9XCJjb21wdXRlZFRvb2xiYXJTbG90c1wiIDpjb2x1bW5zPVwidGFibGUuY29sdW1uc1wiIC8+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyLXJpZ2h0XCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgI3RhYnM+XG4gICAgICA8ZnMtdGFicy1maWx0ZXIgdi1pZj1cInRhYnNCaW5kaW5nLnNob3dcIiByZWY9XCJ0YWJzUmVmXCIgY2xhc3M9XCJmcy10YWJzXCIgdi1iaW5kPVwidGFic0JpbmRpbmdcIiAvPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICN0YWJsZT5cbiAgICAgIDxmcy10YWJsZVxuICAgICAgICByZWY9XCJ0YWJsZVJlZlwiXG4gICAgICAgIGNsYXNzPVwiZnMtY3J1ZC10YWJsZVwiXG4gICAgICAgIHYtYmluZD1cImNvbXB1dGVkVGFibGVcIlxuICAgICAgICA6Y29sdW1ucz1cInRhYmxlLmNvbHVtbnNcIlxuICAgICAgICA6bG9hZGluZz1cInRhYmxlLmxvYWRpbmdcIlxuICAgICAgICA6cm93LWhhbmRsZT1cInJvd0hhbmRsZVwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgIDpjZWxsLXNsb3RzPVwiY29tcHV0ZWRDZWxsU2xvdHNcIlxuICAgICAgLz5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICNmb3JtPlxuICAgICAgPGRpdiByZWY9XCJpbm5lcldyYXBwZXJSZWZcIiBjbGFzcz1cImZzLWZvcm0td3JhcHBlci1jb250YWluZXJcIiA6Y2xhc3M9XCJ7ICdmcy1mb3JtLWlubmVyLXdyYXBwZXInOiBpc0Zvcm1Jbm5lciB9XCI+XG4gICAgICAgIDxmcy1mb3JtLXdyYXBwZXJcbiAgICAgICAgICByZWY9XCJmb3JtV3JhcHBlclJlZlwiXG4gICAgICAgICAgOnNsb3RzPVwiY29tcHV0ZWRGb3JtU2xvdHNcIlxuICAgICAgICAgIDppbm5lci13cmFwcGVyPVwiaW5uZXJXcmFwcGVyUmVmXCJcbiAgICAgICAgICBAaW5uZXItY2hhbmdlPVwib25Gb3JtSW5uZXJDaGFuZ2VcIlxuICAgICAgICAgIEB2YWx1ZS1jaGFuZ2U9XCIkZW1pdCgnZm9ybS12YWx1ZS1jaGFuZ2UnLCAkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPCEtLSDnvJbovpHlr7nor53moYYgLS0+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICNwYWdpbmF0aW9uPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWNydWQtcGFnaW5hdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcGFnaW5hdGlvbi1sZWZ0XCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInBhZ2luYXRpb24tbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdpbmF0aW9uXCI+XG4gICAgICAgICAgPCEtLSBwYWdpbmF0aW9uLmN1cnJlbnRQYWdlIOWmguaenOS4uuepuu+8jCBlbGVtZW505Lya5Ye66K2m5ZGKIC0tPlxuICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucGFnaW5hdGlvbi5uYW1lXCIgdi1pZj1cInBhZ2luYXRpb24uc2hvdyAhPT0gZmFsc2VcIiB2LWJpbmQ9XCJwYWdpbmF0aW9uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdpbmF0aW9uLXJpZ2h0XCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInBhZ2luYXRpb24tcmlnaHRcIj48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyLXRvcD5cbiAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICNmb290ZXItYm90dG9tPlxuICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCBvbk1vdW50ZWQsIFByb3BUeXBlLCBwcm92aWRlLCByZWYsIFNldHVwQ29udGV4dCwgdG9SZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgdWlDb250ZXh0IH0gZnJvbSBcIi4uL3VpXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi91c2UvdXNlLW1lcmdlXCI7XG5pbXBvcnQgdXRpbExvZyBmcm9tIFwiLi4vdXRpbHMvdXRpbC5sb2dcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgeyBSb3dTZWxlY3Rpb25Qcm9wcywgU2V0U2VhcmNoRm9ybURhdGFQcm9wcyB9IGZyb20gXCIuLi9kXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi91c2VcIjtcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbnV0aWxzLnRyYWNlKFwiZnMtdGFibGVcIik7XG5jb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuXG5mdW5jdGlvbiB1c2VQcm92aWRlcnMocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcbiAgcHJvdmlkZShcImdldDpjb2x1bW5zXCIsICgpID0+IHtcbiAgICByZXR1cm4gcHJvcHMudGFibGUuY29sdW1ucztcbiAgfSk7XG4gIHByb3ZpZGUoXCJ1cGRhdGU6Y29sdW1uc1wiLCAoY29sdW1uczogYW55KSA9PiB7XG4gICAgY3R4LmVtaXQoXCJ1cGRhdGU6Y29sdW1uc1wiLCBjb2x1bW5zKTtcbiAgfSk7XG5cbiAgcHJvdmlkZShcImdldDpjcnVkQmluZGluZ1wiLCAoKSA9PiB7XG4gICAgcmV0dXJuIHByb3BzO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXNlU2VhcmNoKHByb3BzOiBhbnksIGN0eDogU2V0dXBDb250ZXh0KSB7XG4gIGNvbnN0IHNlYXJjaFJlZiA9IHJlZigpO1xuICBjb25zdCBnZXRTZWFyY2hSZWYgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHNlYXJjaFJlZi52YWx1ZTtcbiAgfTtcblxuICBjb25zdCBnZXRTZWFyY2hGb3JtRGF0YSA9ICgpID0+IHtcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XG4gICAgICByZXR1cm4gc2VhcmNoUmVmLnZhbHVlLmdldEZvcm0oKTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oXCLor7fkvb/nlKhleHBvc2UuZ2V0U2VhcmNoRm9ybURhdGHku6Pmm79cIik7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuXG4gIGNvbnN0IGdldFNlYXJjaFZhbGlkYXRlZEZvcm1EYXRhID0gKCkgPT4ge1xuICAgIGlmIChzZWFyY2hSZWYudmFsdWUpIHtcbiAgICAgIHJldHVybiBzZWFyY2hSZWYudmFsdWUuZ2V0VmFsaWRhdGVkRm9ybSgpO1xuICAgIH1cbiAgICBsb2dnZXIud2FybihcIuivt+S9v+eUqGV4cG9zZS5nZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YeS7o+abv1wiKTtcbiAgICByZXR1cm4ge307XG4gIH07XG5cbiAgLyoqXG4gICAqIOiuvue9rmZvcm3lgLxcbiAgICogQHBhcmFtIGZvcm0gZm9ybeWvueixoVxuICAgKiBAcGFyYW0gb3B0cyA9IHtcbiAgICogICAgaXNNZXJnZTpmYWxzZSDmmK/lkKbkuI7ljp/mnIlmb3Jt5YC85ZCI5bm2LFxuICAgKiB9XG4gICAqL1xuICBmdW5jdGlvbiBzZXRTZWFyY2hGb3JtRGF0YSh7IGZvcm0sIG1lcmdlRm9ybSA9IGZhbHNlIH06IFNldFNlYXJjaEZvcm1EYXRhUHJvcHMpIHtcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XG4gICAgICBzZWFyY2hSZWYudmFsdWUuc2V0Rm9ybShmb3JtLCBtZXJnZUZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VhcmNoUmVmLFxuICAgIGdldFNlYXJjaFJlZixcbiAgICBnZXRTZWFyY2hGb3JtRGF0YSxcbiAgICBzZXRTZWFyY2hGb3JtRGF0YSxcbiAgICBnZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YVxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VUYWJzKHNlYXJjaFJldDogYW55LCBwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCkge1xuICBjb25zdCB0YWJzQmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAocHJvcHMudGFicyAmJiBwcm9wcy50YWJzLnNob3cgJiYgcHJvcHMudGFicy5uYW1lKSB7XG4gICAgICBsZXQgZGljdCA9IG51bGw7XG4gICAgICBjb25zdCBkZWZhdWx0VGFicyA9IHsgLi4ucHJvcHMudGFicyB9O1xuICAgICAgaWYgKHByb3BzLnNlYXJjaD8uY29sdW1ucyAmJiBwcm9wcy5zZWFyY2g/LmNvbHVtbnNbcHJvcHMudGFicy5uYW1lXT8uY29tcG9uZW50Py5kaWN0KSB7XG4gICAgICAgIGRpY3QgPSBwcm9wcy5zZWFyY2g/LmNvbHVtbnNbcHJvcHMudGFicy5uYW1lXT8uY29tcG9uZW50Py5kaWN0O1xuICAgICAgICBpZiAoZGVmYXVsdFRhYnMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIGRlZmF1bHRUYWJzLnZhbHVlID0gZGljdC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFRhYnMubGFiZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGRlZmF1bHRUYWJzLmxhYmVsID0gZGljdC5sYWJlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFRhYnMub3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgZGVmYXVsdFRhYnMub3B0aW9ucyA9IGRpY3QuZGF0YSB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWZhdWx0VGFicyxcbiAgICAgICAgbW9kZWxWYWx1ZTogcHJvcHMuc2VhcmNoLnZhbGlkYXRlZEZvcm0gJiYgcHJvcHMuc2VhcmNoLnZhbGlkYXRlZEZvcm1bcHJvcHMudGFicy5uYW1lXSxcbiAgICAgICAgXCJvblVwZGF0ZTptb2RlbFZhbHVlXCI6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgY3R4LmVtaXQoXCJ0YWItY2hhbmdlXCIsIHsgW3Byb3BzLnRhYnMubmFtZV06IHZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2hvdzogZmFsc2VcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB0YWJzQmluZGluZ1xuICB9O1xufVxuXG5mdW5jdGlvbiBzbG90RmlsdGVyKGN0eFNsb3RzOiBhbnksIGtleVByZWZpeDogc3RyaW5nKSB7XG4gIGlmICghY3R4U2xvdHMpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgY29uc3Qgc2xvdHM6IGFueSA9IHt9O1xuICBmb3JFYWNoKGN0eFNsb3RzLCAodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChrZXlQcmVmaXgpKSB7XG4gICAgICBzbG90c1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHNsb3RzO1xufVxuXG5mdW5jdGlvbiB1c2VGaXhlZEhlaWdodChwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCwgeyB0YWJsZVJlZiwgY29udGFpbmVyUmVmIH06IGFueSkge1xuICBjb25zdCB1aSA9IHVpQ29udGV4dC5nZXQoKTtcbiAgbGV0IHRhYmxlQ0kgPSB1aS50YWJsZTtcbiAgaWYgKHByb3BzLnRhYmxlPy50YWJsZVZlcnNpb24gPT09IFwidjJcIikge1xuICAgIHRhYmxlQ0kgPSB1aS50YWJsZVYyO1xuICB9XG4gIGlmICh0YWJsZUNJLmhhc01heEhlaWdodChwcm9wcy50YWJsZSkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKCF0YWJsZUNJLmZpeGVkSGVhZGVyTmVlZENvbXB1dGVCb2R5SGVpZ2h0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGNvbnN0IG1heEhlaWdodFJlZiA9IHJlZihudWxsKTtcblxuICBmdW5jdGlvbiBjb21wdXRlQm9keUhlaWdodCgpIHtcbiAgICBjb25zdCB0YWJsZURvbSA9IHRhYmxlUmVmPy52YWx1ZT8uJGVsO1xuICAgIGlmICh0YWJsZURvbSA9PSBudWxsIHx8IHRhYmxlRG9tLnF1ZXJ5U2VsZWN0b3IgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoZWFkRG9tID0gdGFibGVEb20ucXVlcnlTZWxlY3Rvcih0YWJsZUNJLmhlYWRlckRvbVNlbGVjdG9yKTtcbiAgICBpZiAoaGVhZERvbSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlSGVpZ2h0ID0gdGFibGVEb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIGNvbnN0IGhlYWRIZWlnaHQgPSBoZWFkRG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBtYXhIZWlnaHRSZWYudmFsdWUgPSB0YWJsZUhlaWdodCAtIGhlYWRIZWlnaHQgLSAyICsgKHByb3BzLnRhYmxlLm1heEhlaWdodEFkanVzdCB8fCAwKTtcblxuICAgIHV0aWxMb2cuZGVidWcoXCJ0YWJsZSBtYXggaGVpZ2h0IHJlY29tcHV0ZWQgXCIsIG1heEhlaWdodFJlZi52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiB3YXRjaEJvZHlIZWlnaHRDaGFuZ2UoKSB7XG4gICAgY29uc3QgdGFibGVEb20gPSB0YWJsZVJlZj8udmFsdWU/LiRlbDtcbiAgICBpZiAodGFibGVEb20gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZVdyYXBwZXJEb20gPSB0YWJsZURvbS5wYXJlbnROb2RlO1xuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICAgIHV0aWxMb2cuZGVidWcoXCJ0YWJsZSByZXNpemVkXCIsIGVudHJpZXMpO1xuICAgICAgLy8g5q+P5qyh6KKr6KeC5rWL55qE5YWD57Sg5bC65a+45Y+R55Sf5pS55Y+Y6L+Z6YeM6YO95Lya5omn6KGMXG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIGVudHJpZXNbMF0uY29udGVudFJlY3QuaGVpZ2h0ID4gMCkge1xuICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUodGFibGVXcmFwcGVyRG9tKTsgLy8g6KeC5rWLRE9N5YWD57SgXG4gIH1cblxuICBvbk1vdW50ZWQoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICB3YXRjaEJvZHlIZWlnaHRDaGFuZ2UoKTtcbiAgfSk7XG4gIHJldHVybiB7IG1heEhlaWdodFJlZiwgY29tcHV0ZUJvZHlIZWlnaHQgfTtcbn1cblxuZnVuY3Rpb24gdXNlVGFibGUocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcbiAgY29uc3QgdWkgPSB1aUNvbnRleHQuZ2V0KCk7XG4gIGNvbnN0IHRhYmxlUmVmID0gcmVmKCk7XG4gIGNvbnN0IHRvb2xiYXJSZWYgPSByZWYoKTtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gcmVmKCk7XG4gIGNvbnN0IHsgbWF4SGVpZ2h0UmVmLCBjb21wdXRlQm9keUhlaWdodCB9ID0gdXNlRml4ZWRIZWlnaHQocHJvcHMsIGN0eCwgeyB0YWJsZVJlZiwgY29udGFpbmVyUmVmIH0pO1xuICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICBjb25zdCB0YWJsZVByb3BSZWYgPSB0b1JlZihwcm9wcywgXCJ0YWJsZVwiKTtcbiAgY29uc3QgY29tcHV0ZWRUYWJsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAvLyBhbnRkdiBuYWl2ZSDpq5jluqboh6rpgILlupTvvIwg5aaC5p6c55So5oi35pyJ6YWN572uc2Nyb2xs77yM5YiZ5LyY5YWI5L2/55So55So5oi36YWN572u55qEXG4gICAgbGV0IGZpeGVkSGVpZ2h0ID0ge307XG4gICAgaWYgKG1heEhlaWdodFJlZj8udmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHRhYmxlQ0kgPSB1aS50YWJsZTtcbiAgICAgIGlmIChwcm9wcy50YWJsZT8udGFibGVWZXJzaW9uID09PSBcInYyXCIpIHtcbiAgICAgICAgdGFibGVDSSA9IHVpLnRhYmxlVjI7XG4gICAgICB9XG4gICAgICBmaXhlZEhlaWdodCA9IHRhYmxlQ0kuYnVpbGRNYXhIZWlnaHQobWF4SGVpZ2h0UmVmLnZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgcEF0dHJzID0gdXRpbHMuZGFzaC5vbWl0KHRhYmxlUHJvcFJlZiwgXCJsb2FkaW5nXCIsIFwiY29sdW1uc1wiLCBcImNvbHVtbnNNYXBcIik7XG5cbiAgICByZXR1cm4gbWVyZ2UoZml4ZWRIZWlnaHQsIHsgLi4uY3R4LmF0dHJzLCAuLi5wQXR0cnMgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IGNvbXB1dGVkVG9vbGJhciA9IHRvUmVmKHByb3BzLCBcInRvb2xiYXJcIik7XG5cbiAgY29uc3QgY29tcHV0ZWRDZWxsU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHNsb3RGaWx0ZXIoY3R4LnNsb3RzLCBcImNlbGxcIik7XG4gIH0pO1xuXG4gIGNvbnN0IGNvbXB1dGVkRm9ybVNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBzbG90RmlsdGVyKGN0eC5zbG90cywgXCJmb3JtXCIpO1xuICB9KTtcbiAgY29uc3QgY29tcHV0ZWRTZWFyY2hTbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gc2xvdEZpbHRlcihjdHguc2xvdHMsIFwic2VhcmNoXCIpO1xuICB9KTtcbiAgY29uc3QgY29tcHV0ZWRUb29sYmFyU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHNsb3RGaWx0ZXIoY3R4LnNsb3RzLCBcInRvb2xiYXJcIik7XG4gIH0pO1xuXG4gIGNvbnN0IGZvcm1XcmFwcGVyUmVmID0gcmVmKCk7XG5cbiAgY29uc3QgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjbGF6ejogYW55ID0geyBjb21wYWN0OiBwcm9wcy50b29sYmFyLmNvbXBhY3QgIT09IGZhbHNlIH07XG4gICAgaWYgKHByb3BzLmN1c3RvbUNsYXNzKSB7XG4gICAgICBjbGF6eltwcm9wcy5jdXN0b21DbGFzc10gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gY2xheno7XG4gIH0pO1xuXG4gIGNvbnN0IGlubmVyV3JhcHBlclJlZiA9IHJlZigpO1xuXG4gIGNvbnN0IGlzRm9ybUlubmVyID0gcmVmKGZhbHNlKTtcbiAgY29uc3Qgb25Gb3JtSW5uZXJDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgIGlzRm9ybUlubmVyLnZhbHVlID0gdmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICB0YWJsZVJlZixcbiAgICBjb250YWluZXJSZWYsXG4gICAgdG9vbGJhclJlZixcbiAgICBjb21wdXRlZFRhYmxlLFxuICAgIGNvbXB1dGVkVG9vbGJhcixcbiAgICBjb21wdXRlZENlbGxTbG90cyxcbiAgICBmb3JtV3JhcHBlclJlZixcbiAgICBpc0Zvcm1Jbm5lcixcbiAgICBvbkZvcm1Jbm5lckNoYW5nZSxcbiAgICBjb21wdXRlZEZvcm1TbG90cyxcbiAgICBjb21wdXRlZFNlYXJjaFNsb3RzLFxuICAgIGNvbXB1dGVkVG9vbGJhclNsb3RzLFxuICAgIGNvbXB1dGVCb2R5SGVpZ2h0LFxuICAgIGNvbXB1dGVkQ2xhc3MsXG4gICAgaW5uZXJXcmFwcGVyUmVmXG4gIH07XG59XG5cbi8qKlxuICogZnMtY3J1ZFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQ3J1ZFwiLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOihqOagvGlkXG4gICAgICovXG4gICAgaWQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IFwiXCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOagvOmFjee9ru+8jOingUZzVGFibGVcbiAgICAgKi9cbiAgICB0YWJsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6KGo5qC85pWw5o2uXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9yZXF1aXJlLWRlZmF1bHQtcHJvcFxuICAgIGRhdGE6IHtcbiAgICAgIHR5cGU6IEFycmF5XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmk43kvZzliJfphY3nva7vvIzop4FGc1Jvd0hhbmRsZVxuICAgICAqL1xuICAgIHJvd0hhbmRsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5p+l6K+i5qGG6YWN572u77yM6KeBRnNTZWFyY2hcbiAgICAgKi9cbiAgICBzZWFyY2g6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW3peWFt+adoemFjee9ru+8jOingUZzVG9vbGJhclxuICAgICAqL1xuICAgIHRvb2xiYXI6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWKqOS9nOadoemFjee9ru+8jOingUZzQWN0aW9uYmFyXG4gICAgICovXG4gICAgYWN0aW9uYmFyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiB0YWJzIGZpbHRlclxuICAgICAqL1xuICAgIHRhYnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOa3u+WKoOihqOWNleWvueivneahhumFjee9ru+8jOingUZzRm9ybVdyYXBwZXJcbiAgICAgKi9cbiAgICBhZGRGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDnvJbovpHooajljZXlr7nor53moYbphY3nva7vvIzop4FGc0Zvcm1XcmFwcGVyXG4gICAgICovXG4gICAgZWRpdEZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOafpeeci+ihqOWNleWvueivneahhumFjee9ru+8jOingUZzRm9ybVdyYXBwZXJcbiAgICAgKi9cbiAgICB2aWV3Rm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog57+76aG16YWN572uLOaUr+aMgWVsLXBhZ2luYXRpb258YS1wYWdpbmF0aW9u6YWN572uXG4gICAgICovXG4gICAgcGFnaW5hdGlvbjoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHsgc2hvdzogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWuueWZqOmFjee9ru+8jOingUZzQ29udGFpbmVyXG4gICAgICovXG4gICAgY29udGFpbmVyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNydWTljIXoo7nlrrnlmajnmoRjbGFzc1xuICAgICAqL1xuICAgIGN1c3RvbUNsYXNzOiB7fSxcbiAgICAvKipcbiAgICAgKiDkuI3opoHkvKDliLBmcy10YWJsZeWOu1xuICAgICAqL1xuICAgIGZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5Y+v6YCJ5oupXG4gICAgICovXG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8Um93U2VsZWN0aW9uUHJvcHM+LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHsgc2hvdzogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJ1cGRhdGU6c2VhcmNoXCIsIFwidXBkYXRlOmNvbXBhY3RcIiwgXCJ1cGRhdGU6Y29sdW1uc1wiLCBcImZvcm0tdmFsdWUtY2hhbmdlXCIsIFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgXCJ0YWItY2hhbmdlXCJdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHg6IGFueSkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgdXNlUHJvdmlkZXJzKHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHNlYXJjaCA9IHVzZVNlYXJjaChwcm9wcywgY3R4KTtcbiAgICBjb25zdCB0YWJzID0gdXNlVGFicyhzZWFyY2gsIHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHRhYmxlID0gdXNlVGFibGUocHJvcHMsIGN0eCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgLi4uc2VhcmNoLFxuICAgICAgLi4udGFibGUsXG4gICAgICAuLi50YWJzXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLy/kvZzkuLrmlbDmja7ooajmoLzkvb/nlKjnmoTpooTorr7moLflvI/vvIzpmpDol49mb290ZXLvvIzooajmoLzpq5jluqbnoo7orrDlvZXmlbDlop7liqDogIzlop7liqBcbi5mcy1jcnVkLWFzLXRhYmxlIHtcbiAgbWluLWhlaWdodDogMCAhaW1wb3J0YW50O1xuICBoZWlnaHQ6IHVuc2V0O1xuXG4gIC5mcy1jcnVkLWZvb3RlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC5ib3ggLmlubmVyIHtcbiAgICBwb3NpdGlvbjogc3RhdGljO1xuICB9XG59XG5cbi5mcy1jcnVkLWNvbnRhaW5lciB7XG4gIG1pbi1oZWlnaHQ6IDMwMHB4O1xuXG4gICYuY29tcGFjdCB7XG4gICAgLmVsLXRhYmxlLS1ib3JkZXIge1xuICAgICAgYm9yZGVyLWxlZnQ6IDA7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtaGVhZGVyIHtcbiAgICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtZm9vdGVyIHtcbiAgICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgfVxuICB9XG5cbiAgLmZzLWNydWQtaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHBhZGRpbmc6IDEwcHggMDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG5cbiAgICAuZnMtaGVhZGVyLXRvcCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC1zZWFyY2gge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBncmlkLWNvbHVtbjogc3BhbiAyO1xuICAgICAgcGFkZGluZy1ib3R0b206IDVweDtcbiAgICB9XG5cbiAgICAuZnMtaGVhZGVyLW1pZGRsZSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtaGVhZGVyLWJvdHRvbSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC1hY3Rpb25iYXIge1xuICAgICAgLy8gcGFkZGluZy10b3A6IDVweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4OiAxMDAwMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBtaW4td2lkdGg6IDFweDtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC10b29sYmFyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuICB9XG5cbiAgLmZzLWNydWQtdGFibGUge1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC5mcy1jcnVkLWZvb3RlciB7XG4gICAgcGFkZGluZzogMTBweCAwO1xuXG4gICAgLmZzLWNydWQtcGFnaW5hdGlvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgICAgLmZzLXBhZ2luYXRpb24tbGVmdCB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgIH1cblxuICAgICAgLmZzLXBhZ2luYXRpb24tcmlnaHQge1xuICAgICAgICBmbGV4OiAwO1xuICAgICAgfVxuXG4gICAgICAuZnMtcGFnaW5hdGlvbiB7XG4gICAgICAgIGZsZXg6IDE7XG5cbiAgICAgICAgLmFudC1wYWdpbmF0aW9uLW9wdGlvbnMge1xuICAgICAgICAgIC5hbnQtc2VsZWN0IHtcbiAgICAgICAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC5lbC1wYWdpbmF0aW9uIHtcbiAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICAgICAgcGFkZGluZy1yaWdodDogMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuZnMtcGFnaW5hdGlvbi1yaWdodCB7XG4gICAgICAgIGZsZXg6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAuZnMtY3J1ZC1jb250YWluZXIge1xuICAgIC5ib2R5IHtcbiAgICAgIG92ZXJmbG93LXk6IHVuc2V0ICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC5hbnQtdGFibGUtYm9keSB7XG4gICAgICBtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC5uLWRhdGEtdGFibGUtYmFzZS10YWJsZS1ib2R5IHtcbiAgICAgIG1heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtaGVhZGVyIC5mcy1jcnVkLWFjdGlvbmJhciB7XG4gICAgICBmbGV4OiB1bnNldCAhaW1wb3J0YW50O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMnB4O1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cImNvbnRhaW5lcj8uaXMgfHwgJ2ZzLWxheW91dC1kZWZhdWx0J1wiXG4gICAgcmVmPVwiY29udGFpbmVyUmVmXCJcbiAgICBjbGFzcz1cImZzLWNydWQtY29udGFpbmVyXCJcbiAgICB2LWJpbmQ9XCJjb250YWluZXJcIlxuICAgIDpjbGFzcz1cImNvbXB1dGVkQ2xhc3NcIlxuICA+XG4gICAgPHNsb3Q+PC9zbG90PlxuXG4gICAgPHRlbXBsYXRlICNoZWFkZXItdG9wPlxuICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci10b3BcIj48L3Nsb3Q+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgI2hlYWRlci1ib3R0b20+XG4gICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWJvdHRvbVwiPjwvc2xvdD5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDx0ZW1wbGF0ZSAjaGVhZGVyLW1pZGRsZT5cbiAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItbWlkZGxlXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgI3NlYXJjaD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1jcnVkLXNlYXJjaFwiPlxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInNlYXJjaC5pcyB8fCAnZnMtc2VhcmNoJ1wiIHJlZj1cInNlYXJjaFJlZlwiIHYtYmluZD1cInNlYXJjaFwiIDpzbG90cz1cImNvbXB1dGVkU2VhcmNoU2xvdHNcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjYWN0aW9uYmFyPlxuICAgICAgPGRpdiB2LWlmPVwiYWN0aW9uYmFyICYmIGFjdGlvbmJhci5zaG93ICE9PSBmYWxzZVwiIGNsYXNzPVwiZnMtY3J1ZC1hY3Rpb25iYXJcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cImFjdGlvbmJhci1sZWZ0XCI+PC9zbG90PlxuICAgICAgICA8ZnMtYWN0aW9uYmFyIHYtYmluZD1cImFjdGlvbmJhclwiIC8+XG4gICAgICAgIDxzbG90IG5hbWU9XCJhY3Rpb25iYXItcmlnaHRcIj48L3Nsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICN0b29sYmFyPlxuICAgICAgPGRpdiB2LWlmPVwidG9vbGJhciAmJiB0b29sYmFyLnNob3cgIT09IGZhbHNlXCIgY2xhc3M9XCJmcy1jcnVkLXRvb2xiYXJcIj5cbiAgICAgICAgPHNsb3QgbmFtZT1cInRvb2xiYXItbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgPGZzLXRvb2xiYXIgcmVmPVwidG9vbGJhclJlZlwiIHYtYmluZD1cInRvb2xiYXJcIiA6c2xvdHM9XCJjb21wdXRlZFRvb2xiYXJTbG90c1wiIDpjb2x1bW5zPVwidGFibGUuY29sdW1uc1wiIC8+XG4gICAgICAgIDxzbG90IG5hbWU9XCJ0b29sYmFyLXJpZ2h0XCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgI3RhYnM+XG4gICAgICA8ZnMtdGFicy1maWx0ZXIgdi1pZj1cInRhYnNCaW5kaW5nLnNob3dcIiByZWY9XCJ0YWJzUmVmXCIgY2xhc3M9XCJmcy10YWJzXCIgdi1iaW5kPVwidGFic0JpbmRpbmdcIiAvPlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICN0YWJsZT5cbiAgICAgIDxmcy10YWJsZVxuICAgICAgICByZWY9XCJ0YWJsZVJlZlwiXG4gICAgICAgIGNsYXNzPVwiZnMtY3J1ZC10YWJsZVwiXG4gICAgICAgIHYtYmluZD1cImNvbXB1dGVkVGFibGVcIlxuICAgICAgICA6Y29sdW1ucz1cInRhYmxlLmNvbHVtbnNcIlxuICAgICAgICA6bG9hZGluZz1cInRhYmxlLmxvYWRpbmdcIlxuICAgICAgICA6cm93LWhhbmRsZT1cInJvd0hhbmRsZVwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgIDpjZWxsLXNsb3RzPVwiY29tcHV0ZWRDZWxsU2xvdHNcIlxuICAgICAgLz5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICNmb3JtPlxuICAgICAgPGRpdiByZWY9XCJpbm5lcldyYXBwZXJSZWZcIiBjbGFzcz1cImZzLWZvcm0td3JhcHBlci1jb250YWluZXJcIiA6Y2xhc3M9XCJ7ICdmcy1mb3JtLWlubmVyLXdyYXBwZXInOiBpc0Zvcm1Jbm5lciB9XCI+XG4gICAgICAgIDxmcy1mb3JtLXdyYXBwZXJcbiAgICAgICAgICByZWY9XCJmb3JtV3JhcHBlclJlZlwiXG4gICAgICAgICAgOnNsb3RzPVwiY29tcHV0ZWRGb3JtU2xvdHNcIlxuICAgICAgICAgIDppbm5lci13cmFwcGVyPVwiaW5uZXJXcmFwcGVyUmVmXCJcbiAgICAgICAgICBAaW5uZXItY2hhbmdlPVwib25Gb3JtSW5uZXJDaGFuZ2VcIlxuICAgICAgICAgIEB2YWx1ZS1jaGFuZ2U9XCIkZW1pdCgnZm9ybS12YWx1ZS1jaGFuZ2UnLCAkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPCEtLSDnvJbovpHlr7nor53moYYgLS0+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlICNwYWdpbmF0aW9uPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWNydWQtcGFnaW5hdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcGFnaW5hdGlvbi1sZWZ0XCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInBhZ2luYXRpb24tbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdpbmF0aW9uXCI+XG4gICAgICAgICAgPCEtLSBwYWdpbmF0aW9uLmN1cnJlbnRQYWdlIOWmguaenOS4uuepuu+8jCBlbGVtZW505Lya5Ye66K2m5ZGKIC0tPlxuICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucGFnaW5hdGlvbi5uYW1lXCIgdi1pZj1cInBhZ2luYXRpb24uc2hvdyAhPT0gZmFsc2VcIiB2LWJpbmQ9XCJwYWdpbmF0aW9uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1wYWdpbmF0aW9uLXJpZ2h0XCI+XG4gICAgICAgICAgPHNsb3QgbmFtZT1cInBhZ2luYXRpb24tcmlnaHRcIj48L3Nsb3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDx0ZW1wbGF0ZSAjZm9vdGVyLXRvcD5cbiAgICAgIDxzbG90IG5hbWU9XCJmb290ZXItdG9wXCI+PC9zbG90PlxuICAgIDwvdGVtcGxhdGU+XG4gICAgPHRlbXBsYXRlICNmb290ZXItYm90dG9tPlxuICAgICAgPHNsb3QgbmFtZT1cImZvb3Rlci1ib3R0b21cIj48L3Nsb3Q+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCBvbk1vdW50ZWQsIFByb3BUeXBlLCBwcm92aWRlLCByZWYsIFNldHVwQ29udGV4dCwgdG9SZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgdWlDb250ZXh0IH0gZnJvbSBcIi4uL3VpXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi91c2UvdXNlLW1lcmdlXCI7XG5pbXBvcnQgdXRpbExvZyBmcm9tIFwiLi4vdXRpbHMvdXRpbC5sb2dcIjtcbmltcG9ydCBsb2dnZXIgZnJvbSBcIi4uL3V0aWxzL3V0aWwubG9nXCI7XG5pbXBvcnQgeyBSb3dTZWxlY3Rpb25Qcm9wcywgU2V0U2VhcmNoRm9ybURhdGFQcm9wcyB9IGZyb20gXCIuLi9kXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi91c2VcIjtcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbnV0aWxzLnRyYWNlKFwiZnMtdGFibGVcIik7XG5jb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuXG5mdW5jdGlvbiB1c2VQcm92aWRlcnMocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcbiAgcHJvdmlkZShcImdldDpjb2x1bW5zXCIsICgpID0+IHtcbiAgICByZXR1cm4gcHJvcHMudGFibGUuY29sdW1ucztcbiAgfSk7XG4gIHByb3ZpZGUoXCJ1cGRhdGU6Y29sdW1uc1wiLCAoY29sdW1uczogYW55KSA9PiB7XG4gICAgY3R4LmVtaXQoXCJ1cGRhdGU6Y29sdW1uc1wiLCBjb2x1bW5zKTtcbiAgfSk7XG5cbiAgcHJvdmlkZShcImdldDpjcnVkQmluZGluZ1wiLCAoKSA9PiB7XG4gICAgcmV0dXJuIHByb3BzO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdXNlU2VhcmNoKHByb3BzOiBhbnksIGN0eDogU2V0dXBDb250ZXh0KSB7XG4gIGNvbnN0IHNlYXJjaFJlZiA9IHJlZigpO1xuICBjb25zdCBnZXRTZWFyY2hSZWYgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHNlYXJjaFJlZi52YWx1ZTtcbiAgfTtcblxuICBjb25zdCBnZXRTZWFyY2hGb3JtRGF0YSA9ICgpID0+IHtcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XG4gICAgICByZXR1cm4gc2VhcmNoUmVmLnZhbHVlLmdldEZvcm0oKTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oXCLor7fkvb/nlKhleHBvc2UuZ2V0U2VhcmNoRm9ybURhdGHku6Pmm79cIik7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuXG4gIGNvbnN0IGdldFNlYXJjaFZhbGlkYXRlZEZvcm1EYXRhID0gKCkgPT4ge1xuICAgIGlmIChzZWFyY2hSZWYudmFsdWUpIHtcbiAgICAgIHJldHVybiBzZWFyY2hSZWYudmFsdWUuZ2V0VmFsaWRhdGVkRm9ybSgpO1xuICAgIH1cbiAgICBsb2dnZXIud2FybihcIuivt+S9v+eUqGV4cG9zZS5nZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YeS7o+abv1wiKTtcbiAgICByZXR1cm4ge307XG4gIH07XG5cbiAgLyoqXG4gICAqIOiuvue9rmZvcm3lgLxcbiAgICogQHBhcmFtIGZvcm0gZm9ybeWvueixoVxuICAgKiBAcGFyYW0gb3B0cyA9IHtcbiAgICogICAgaXNNZXJnZTpmYWxzZSDmmK/lkKbkuI7ljp/mnIlmb3Jt5YC85ZCI5bm2LFxuICAgKiB9XG4gICAqL1xuICBmdW5jdGlvbiBzZXRTZWFyY2hGb3JtRGF0YSh7IGZvcm0sIG1lcmdlRm9ybSA9IGZhbHNlIH06IFNldFNlYXJjaEZvcm1EYXRhUHJvcHMpIHtcbiAgICBpZiAoc2VhcmNoUmVmLnZhbHVlKSB7XG4gICAgICBzZWFyY2hSZWYudmFsdWUuc2V0Rm9ybShmb3JtLCBtZXJnZUZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VhcmNoUmVmLFxuICAgIGdldFNlYXJjaFJlZixcbiAgICBnZXRTZWFyY2hGb3JtRGF0YSxcbiAgICBzZXRTZWFyY2hGb3JtRGF0YSxcbiAgICBnZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YVxuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VUYWJzKHNlYXJjaFJldDogYW55LCBwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCkge1xuICBjb25zdCB0YWJzQmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAocHJvcHMudGFicyAmJiBwcm9wcy50YWJzLnNob3cgJiYgcHJvcHMudGFicy5uYW1lKSB7XG4gICAgICBsZXQgZGljdCA9IG51bGw7XG4gICAgICBjb25zdCBkZWZhdWx0VGFicyA9IHsgLi4ucHJvcHMudGFicyB9O1xuICAgICAgaWYgKHByb3BzLnNlYXJjaD8uY29sdW1ucyAmJiBwcm9wcy5zZWFyY2g/LmNvbHVtbnNbcHJvcHMudGFicy5uYW1lXT8uY29tcG9uZW50Py5kaWN0KSB7XG4gICAgICAgIGRpY3QgPSBwcm9wcy5zZWFyY2g/LmNvbHVtbnNbcHJvcHMudGFicy5uYW1lXT8uY29tcG9uZW50Py5kaWN0O1xuICAgICAgICBpZiAoZGVmYXVsdFRhYnMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIGRlZmF1bHRUYWJzLnZhbHVlID0gZGljdC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFRhYnMubGFiZWwgPT0gbnVsbCkge1xuICAgICAgICAgIGRlZmF1bHRUYWJzLmxhYmVsID0gZGljdC5sYWJlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdFRhYnMub3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgZGVmYXVsdFRhYnMub3B0aW9ucyA9IGRpY3QuZGF0YSB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWZhdWx0VGFicyxcbiAgICAgICAgbW9kZWxWYWx1ZTogcHJvcHMuc2VhcmNoLnZhbGlkYXRlZEZvcm0gJiYgcHJvcHMuc2VhcmNoLnZhbGlkYXRlZEZvcm1bcHJvcHMudGFicy5uYW1lXSxcbiAgICAgICAgXCJvblVwZGF0ZTptb2RlbFZhbHVlXCI6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgY3R4LmVtaXQoXCJ0YWItY2hhbmdlXCIsIHsgW3Byb3BzLnRhYnMubmFtZV06IHZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2hvdzogZmFsc2VcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICB0YWJzQmluZGluZ1xuICB9O1xufVxuXG5mdW5jdGlvbiBzbG90RmlsdGVyKGN0eFNsb3RzOiBhbnksIGtleVByZWZpeDogc3RyaW5nKSB7XG4gIGlmICghY3R4U2xvdHMpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgY29uc3Qgc2xvdHM6IGFueSA9IHt9O1xuICBmb3JFYWNoKGN0eFNsb3RzLCAodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChrZXlQcmVmaXgpKSB7XG4gICAgICBzbG90c1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHNsb3RzO1xufVxuXG5mdW5jdGlvbiB1c2VGaXhlZEhlaWdodChwcm9wczogYW55LCBjdHg6IFNldHVwQ29udGV4dCwgeyB0YWJsZVJlZiwgY29udGFpbmVyUmVmIH06IGFueSkge1xuICBjb25zdCB1aSA9IHVpQ29udGV4dC5nZXQoKTtcbiAgbGV0IHRhYmxlQ0kgPSB1aS50YWJsZTtcbiAgaWYgKHByb3BzLnRhYmxlPy50YWJsZVZlcnNpb24gPT09IFwidjJcIikge1xuICAgIHRhYmxlQ0kgPSB1aS50YWJsZVYyO1xuICB9XG4gIGlmICh0YWJsZUNJLmhhc01heEhlaWdodChwcm9wcy50YWJsZSkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKCF0YWJsZUNJLmZpeGVkSGVhZGVyTmVlZENvbXB1dGVCb2R5SGVpZ2h0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGNvbnN0IG1heEhlaWdodFJlZiA9IHJlZihudWxsKTtcblxuICBmdW5jdGlvbiBjb21wdXRlQm9keUhlaWdodCgpIHtcbiAgICBjb25zdCB0YWJsZURvbSA9IHRhYmxlUmVmPy52YWx1ZT8uJGVsO1xuICAgIGlmICh0YWJsZURvbSA9PSBudWxsIHx8IHRhYmxlRG9tLnF1ZXJ5U2VsZWN0b3IgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoZWFkRG9tID0gdGFibGVEb20ucXVlcnlTZWxlY3Rvcih0YWJsZUNJLmhlYWRlckRvbVNlbGVjdG9yKTtcbiAgICBpZiAoaGVhZERvbSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlSGVpZ2h0ID0gdGFibGVEb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgIGNvbnN0IGhlYWRIZWlnaHQgPSBoZWFkRG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBtYXhIZWlnaHRSZWYudmFsdWUgPSB0YWJsZUhlaWdodCAtIGhlYWRIZWlnaHQgLSAyICsgKHByb3BzLnRhYmxlLm1heEhlaWdodEFkanVzdCB8fCAwKTtcblxuICAgIHV0aWxMb2cuZGVidWcoXCJ0YWJsZSBtYXggaGVpZ2h0IHJlY29tcHV0ZWQgXCIsIG1heEhlaWdodFJlZi52YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiB3YXRjaEJvZHlIZWlnaHRDaGFuZ2UoKSB7XG4gICAgY29uc3QgdGFibGVEb20gPSB0YWJsZVJlZj8udmFsdWU/LiRlbDtcbiAgICBpZiAodGFibGVEb20gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZVdyYXBwZXJEb20gPSB0YWJsZURvbS5wYXJlbnROb2RlO1xuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKGVudHJpZXMpIHtcbiAgICAgIHV0aWxMb2cuZGVidWcoXCJ0YWJsZSByZXNpemVkXCIsIGVudHJpZXMpO1xuICAgICAgLy8g5q+P5qyh6KKr6KeC5rWL55qE5YWD57Sg5bC65a+45Y+R55Sf5pS55Y+Y6L+Z6YeM6YO95Lya5omn6KGMXG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwICYmIGVudHJpZXNbMF0uY29udGVudFJlY3QuaGVpZ2h0ID4gMCkge1xuICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wdXRlQm9keUhlaWdodCgpO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUodGFibGVXcmFwcGVyRG9tKTsgLy8g6KeC5rWLRE9N5YWD57SgXG4gIH1cblxuICBvbk1vdW50ZWQoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICB3YXRjaEJvZHlIZWlnaHRDaGFuZ2UoKTtcbiAgfSk7XG4gIHJldHVybiB7IG1heEhlaWdodFJlZiwgY29tcHV0ZUJvZHlIZWlnaHQgfTtcbn1cblxuZnVuY3Rpb24gdXNlVGFibGUocHJvcHM6IGFueSwgY3R4OiBTZXR1cENvbnRleHQpIHtcbiAgY29uc3QgdWkgPSB1aUNvbnRleHQuZ2V0KCk7XG4gIGNvbnN0IHRhYmxlUmVmID0gcmVmKCk7XG4gIGNvbnN0IHRvb2xiYXJSZWYgPSByZWYoKTtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gcmVmKCk7XG4gIGNvbnN0IHsgbWF4SGVpZ2h0UmVmLCBjb21wdXRlQm9keUhlaWdodCB9ID0gdXNlRml4ZWRIZWlnaHQocHJvcHMsIGN0eCwgeyB0YWJsZVJlZiwgY29udGFpbmVyUmVmIH0pO1xuICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICBjb25zdCB0YWJsZVByb3BSZWYgPSB0b1JlZihwcm9wcywgXCJ0YWJsZVwiKTtcbiAgY29uc3QgY29tcHV0ZWRUYWJsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAvLyBhbnRkdiBuYWl2ZSDpq5jluqboh6rpgILlupTvvIwg5aaC5p6c55So5oi35pyJ6YWN572uc2Nyb2xs77yM5YiZ5LyY5YWI5L2/55So55So5oi36YWN572u55qEXG4gICAgbGV0IGZpeGVkSGVpZ2h0ID0ge307XG4gICAgaWYgKG1heEhlaWdodFJlZj8udmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHRhYmxlQ0kgPSB1aS50YWJsZTtcbiAgICAgIGlmIChwcm9wcy50YWJsZT8udGFibGVWZXJzaW9uID09PSBcInYyXCIpIHtcbiAgICAgICAgdGFibGVDSSA9IHVpLnRhYmxlVjI7XG4gICAgICB9XG4gICAgICBmaXhlZEhlaWdodCA9IHRhYmxlQ0kuYnVpbGRNYXhIZWlnaHQobWF4SGVpZ2h0UmVmLnZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgcEF0dHJzID0gdXRpbHMuZGFzaC5vbWl0KHRhYmxlUHJvcFJlZiwgXCJsb2FkaW5nXCIsIFwiY29sdW1uc1wiLCBcImNvbHVtbnNNYXBcIik7XG5cbiAgICByZXR1cm4gbWVyZ2UoZml4ZWRIZWlnaHQsIHsgLi4uY3R4LmF0dHJzLCAuLi5wQXR0cnMgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IGNvbXB1dGVkVG9vbGJhciA9IHRvUmVmKHByb3BzLCBcInRvb2xiYXJcIik7XG5cbiAgY29uc3QgY29tcHV0ZWRDZWxsU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHNsb3RGaWx0ZXIoY3R4LnNsb3RzLCBcImNlbGxcIik7XG4gIH0pO1xuXG4gIGNvbnN0IGNvbXB1dGVkRm9ybVNsb3RzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBzbG90RmlsdGVyKGN0eC5zbG90cywgXCJmb3JtXCIpO1xuICB9KTtcbiAgY29uc3QgY29tcHV0ZWRTZWFyY2hTbG90cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gc2xvdEZpbHRlcihjdHguc2xvdHMsIFwic2VhcmNoXCIpO1xuICB9KTtcbiAgY29uc3QgY29tcHV0ZWRUb29sYmFyU2xvdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHNsb3RGaWx0ZXIoY3R4LnNsb3RzLCBcInRvb2xiYXJcIik7XG4gIH0pO1xuXG4gIGNvbnN0IGZvcm1XcmFwcGVyUmVmID0gcmVmKCk7XG5cbiAgY29uc3QgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjbGF6ejogYW55ID0geyBjb21wYWN0OiBwcm9wcy50b29sYmFyLmNvbXBhY3QgIT09IGZhbHNlIH07XG4gICAgaWYgKHByb3BzLmN1c3RvbUNsYXNzKSB7XG4gICAgICBjbGF6eltwcm9wcy5jdXN0b21DbGFzc10gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gY2xheno7XG4gIH0pO1xuXG4gIGNvbnN0IGlubmVyV3JhcHBlclJlZiA9IHJlZigpO1xuXG4gIGNvbnN0IGlzRm9ybUlubmVyID0gcmVmKGZhbHNlKTtcbiAgY29uc3Qgb25Gb3JtSW5uZXJDaGFuZ2UgPSAodmFsdWU6IGFueSkgPT4ge1xuICAgIGlzRm9ybUlubmVyLnZhbHVlID0gdmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICB0YWJsZVJlZixcbiAgICBjb250YWluZXJSZWYsXG4gICAgdG9vbGJhclJlZixcbiAgICBjb21wdXRlZFRhYmxlLFxuICAgIGNvbXB1dGVkVG9vbGJhcixcbiAgICBjb21wdXRlZENlbGxTbG90cyxcbiAgICBmb3JtV3JhcHBlclJlZixcbiAgICBpc0Zvcm1Jbm5lcixcbiAgICBvbkZvcm1Jbm5lckNoYW5nZSxcbiAgICBjb21wdXRlZEZvcm1TbG90cyxcbiAgICBjb21wdXRlZFNlYXJjaFNsb3RzLFxuICAgIGNvbXB1dGVkVG9vbGJhclNsb3RzLFxuICAgIGNvbXB1dGVCb2R5SGVpZ2h0LFxuICAgIGNvbXB1dGVkQ2xhc3MsXG4gICAgaW5uZXJXcmFwcGVyUmVmXG4gIH07XG59XG5cbi8qKlxuICogZnMtY3J1ZFxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQ3J1ZFwiLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOihqOagvGlkXG4gICAgICovXG4gICAgaWQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IFwiXCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOihqOagvOmFjee9ru+8jOingUZzVGFibGVcbiAgICAgKi9cbiAgICB0YWJsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6KGo5qC85pWw5o2uXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9yZXF1aXJlLWRlZmF1bHQtcHJvcFxuICAgIGRhdGE6IHtcbiAgICAgIHR5cGU6IEFycmF5XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmk43kvZzliJfphY3nva7vvIzop4FGc1Jvd0hhbmRsZVxuICAgICAqL1xuICAgIHJvd0hhbmRsZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5p+l6K+i5qGG6YWN572u77yM6KeBRnNTZWFyY2hcbiAgICAgKi9cbiAgICBzZWFyY2g6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW3peWFt+adoemFjee9ru+8jOingUZzVG9vbGJhclxuICAgICAqL1xuICAgIHRvb2xiYXI6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWKqOS9nOadoemFjee9ru+8jOingUZzQWN0aW9uYmFyXG4gICAgICovXG4gICAgYWN0aW9uYmFyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiB0YWJzIGZpbHRlclxuICAgICAqL1xuICAgIHRhYnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOa3u+WKoOihqOWNleWvueivneahhumFjee9ru+8jOingUZzRm9ybVdyYXBwZXJcbiAgICAgKi9cbiAgICBhZGRGb3JtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDnvJbovpHooajljZXlr7nor53moYbphY3nva7vvIzop4FGc0Zvcm1XcmFwcGVyXG4gICAgICovXG4gICAgZWRpdEZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOafpeeci+ihqOWNleWvueivneahhumFjee9ru+8jOingUZzRm9ybVdyYXBwZXJcbiAgICAgKi9cbiAgICB2aWV3Rm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog57+76aG16YWN572uLOaUr+aMgWVsLXBhZ2luYXRpb258YS1wYWdpbmF0aW9u6YWN572uXG4gICAgICovXG4gICAgcGFnaW5hdGlvbjoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHsgc2hvdzogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOWuueWZqOmFjee9ru+8jOingUZzQ29udGFpbmVyXG4gICAgICovXG4gICAgY29udGFpbmVyOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIGNydWTljIXoo7nlrrnlmajnmoRjbGFzc1xuICAgICAqL1xuICAgIGN1c3RvbUNsYXNzOiB7fSxcbiAgICAvKipcbiAgICAgKiDkuI3opoHkvKDliLBmcy10YWJsZeWOu1xuICAgICAqL1xuICAgIGZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5Y+v6YCJ5oupXG4gICAgICovXG4gICAgc2VsZWN0aW9uOiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8Um93U2VsZWN0aW9uUHJvcHM+LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHsgc2hvdzogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJ1cGRhdGU6c2VhcmNoXCIsIFwidXBkYXRlOmNvbXBhY3RcIiwgXCJ1cGRhdGU6Y29sdW1uc1wiLCBcImZvcm0tdmFsdWUtY2hhbmdlXCIsIFwidXBkYXRlOm1vZGVsVmFsdWVcIiwgXCJ0YWItY2hhbmdlXCJdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHg6IGFueSkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgdXNlUHJvdmlkZXJzKHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHNlYXJjaCA9IHVzZVNlYXJjaChwcm9wcywgY3R4KTtcbiAgICBjb25zdCB0YWJzID0gdXNlVGFicyhzZWFyY2gsIHByb3BzLCBjdHgpO1xuICAgIGNvbnN0IHRhYmxlID0gdXNlVGFibGUocHJvcHMsIGN0eCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgLi4uc2VhcmNoLFxuICAgICAgLi4udGFibGUsXG4gICAgICAuLi50YWJzXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLy/kvZzkuLrmlbDmja7ooajmoLzkvb/nlKjnmoTpooTorr7moLflvI/vvIzpmpDol49mb290ZXLvvIzooajmoLzpq5jluqbnoo7orrDlvZXmlbDlop7liqDogIzlop7liqBcbi5mcy1jcnVkLWFzLXRhYmxlIHtcbiAgbWluLWhlaWdodDogMCAhaW1wb3J0YW50O1xuICBoZWlnaHQ6IHVuc2V0O1xuXG4gIC5mcy1jcnVkLWZvb3RlciB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC5ib3ggLmlubmVyIHtcbiAgICBwb3NpdGlvbjogc3RhdGljO1xuICB9XG59XG5cbi5mcy1jcnVkLWNvbnRhaW5lciB7XG4gIG1pbi1oZWlnaHQ6IDMwMHB4O1xuXG4gICYuY29tcGFjdCB7XG4gICAgLmVsLXRhYmxlLS1ib3JkZXIge1xuICAgICAgYm9yZGVyLWxlZnQ6IDA7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtaGVhZGVyIHtcbiAgICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtZm9vdGVyIHtcbiAgICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgfVxuICB9XG5cbiAgLmZzLWNydWQtaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIHBhZGRpbmc6IDEwcHggMDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG5cbiAgICAuZnMtaGVhZGVyLXRvcCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC1zZWFyY2gge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBncmlkLWNvbHVtbjogc3BhbiAyO1xuICAgICAgcGFkZGluZy1ib3R0b206IDVweDtcbiAgICB9XG5cbiAgICAuZnMtaGVhZGVyLW1pZGRsZSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtaGVhZGVyLWJvdHRvbSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC1hY3Rpb25iYXIge1xuICAgICAgLy8gcGFkZGluZy10b3A6IDVweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4OiAxMDAwMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBtaW4td2lkdGg6IDFweDtcbiAgICB9XG5cbiAgICAuZnMtY3J1ZC10b29sYmFyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuICB9XG5cbiAgLmZzLWNydWQtdGFibGUge1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC5mcy1jcnVkLWZvb3RlciB7XG4gICAgcGFkZGluZzogMTBweCAwO1xuXG4gICAgLmZzLWNydWQtcGFnaW5hdGlvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgICAgLmZzLXBhZ2luYXRpb24tbGVmdCB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgIH1cblxuICAgICAgLmZzLXBhZ2luYXRpb24tcmlnaHQge1xuICAgICAgICBmbGV4OiAwO1xuICAgICAgfVxuXG4gICAgICAuZnMtcGFnaW5hdGlvbiB7XG4gICAgICAgIGZsZXg6IDE7XG5cbiAgICAgICAgLmFudC1wYWdpbmF0aW9uLW9wdGlvbnMge1xuICAgICAgICAgIC5hbnQtc2VsZWN0IHtcbiAgICAgICAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC5lbC1wYWdpbmF0aW9uIHtcbiAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICAgICAgcGFkZGluZy1yaWdodDogMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuZnMtcGFnaW5hdGlvbi1yaWdodCB7XG4gICAgICAgIGZsZXg6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAuZnMtY3J1ZC1jb250YWluZXIge1xuICAgIC5ib2R5IHtcbiAgICAgIG92ZXJmbG93LXk6IHVuc2V0ICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC5hbnQtdGFibGUtYm9keSB7XG4gICAgICBtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC5uLWRhdGEtdGFibGUtYmFzZS10YWJsZS1ib2R5IHtcbiAgICAgIG1heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG92ZXJmbG93OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLmZzLWNydWQtaGVhZGVyIC5mcy1jcnVkLWFjdGlvbmJhciB7XG4gICAgICBmbGV4OiB1bnNldCAhaW1wb3J0YW50O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMnB4O1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXJvdy1oYW5kbGVcIj5cbiAgICA8c2xvdCBuYW1lPVwiY2VsbC1yb3dIYW5kbGUtbGVmdFwiIHYtYmluZD1cInNjb3BlUmVmXCI+PC9zbG90PlxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBpbmRleCkgaW4gY29tcHV0ZWRIYW5kbGVCdG5zXCIgOmtleT1cImluZGV4XCI+XG4gICAgICA8dGVtcGxhdGUgdi1pZj1cIml0ZW0uc2hvdyAhPT0gZmFsc2UgJiYgIWlzRHJvcGRvd25CdG4oaXRlbSwgaW5kZXgpXCI+XG4gICAgICAgIDxmcy1yZW5kZXIgdi1pZj1cIml0ZW0ucmVuZGVyXCIgOnJlbmRlci1mdW5jPVwiaXRlbS5yZW5kZXJcIiA6c2NvcGU9XCJzY29wZVJlZlwiIC8+XG4gICAgICAgIDxmcy1idXR0b24gdi1lbHNlIGNsYXNzPVwicm93LWhhbmRsZS1idG5cIiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrLnN0b3A9XCJkb0NsaWNrKGl0ZW0pXCIgLz5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8c2xvdCBuYW1lPVwiY2VsbC1yb3dIYW5kbGUtbWlkZGxlXCIgdi1iaW5kPVwic2NvcGVcIj48L3Nsb3Q+XG4gICAgPCEtLSDkuIvmi4nmjInpkq7oj5zljZUgLS0+XG4gICAgPHNwYW4gdi1pZj1cImhhc0Ryb3Bkb3duQnRuXCIgY2xhc3M9XCJyb3ctaGFuZGxlLWJ0biBmcy1oYW5kbGUtcm93LWRyb3Bkb3duXCI+XG4gICAgICA8Y29tcG9uZW50IDppcz1cInVpLmRyb3Bkb3duLm5hbWVcIiB2LWJpbmQ9XCJjb21wdXRlZERyb3Bkb3duQmluZGluZ1wiPlxuICAgICAgICA8ZnMtYnV0dG9uIHYtYmluZD1cImRyb3Bkb3duLm1vcmVcIiAvPlxuICAgICAgICA8dGVtcGxhdGUgI1t1aS5kcm9wZG93bi5zbG90TmFtZV0+XG4gICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgOmlzPVwidWkuZHJvcGRvd25NZW51Lm5hbWVcIlxuICAgICAgICAgICAgdi1pZj1cInVpLmRyb3Bkb3duLnJlbmRlck1vZGUgPT09ICdzbG90J1wiXG4gICAgICAgICAgICB2LWJpbmQ9XCJ1aS5kcm9wZG93bk1lbnUuY29tbWFuZChkb0Ryb3Bkb3duSXRlbUNsaWNrKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjb21wdXRlZEhhbmRsZUJ0bnNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIDppcz1cInVpLmRyb3Bkb3duSXRlbS5uYW1lXCJcbiAgICAgICAgICAgICAgICB2LWlmPVwiaXRlbS5zaG93ICE9PSBmYWxzZSAmJiBpc0Ryb3Bkb3duQnRuKGl0ZW0sIGluZGV4KVwiXG4gICAgICAgICAgICAgICAgOlt1aS5kcm9wZG93bkl0ZW0uY29tbWFuZF09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICAgICAgdi1iaW5kPVwiaXRlbS5kcm9wZG93bkl0ZW1cIlxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLXJvdy1oYW5kbGUtZHJvcGRvd24taXRlbVwiIHYtYmluZD1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgIDxmcy1pY29uIHYtaWY9XCJpdGVtLmljb25cIiA6aWNvbj1cIml0ZW0uaWNvblwiIC8+IHt7IGl0ZW0udGV4dCB8fCBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvc3Bhbj5cbiAgICA8c2xvdCBuYW1lPVwiY2VsbC1yb3dIYW5kbGUtcmlnaHRcIiB2LWJpbmQ9XCJzY29wZVwiPjwvc2xvdD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBmb3JFYWNoLCBzb3J0QnksIG9taXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlL3VzZS11aVwiO1xuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgQnV0dG9uUHJvcHMsIFNjb3BlQ29udGV4dCB9IGZyb20gXCIuLi8uLi9kXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2VcIjtcblxuLyoqXG4gKiDmk43kvZzliJfphY3nva5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1Jvd0hhbmRsZVwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaMiemSruaKmOWPoOmFjee9rlxuICAgICAqL1xuICAgIGRyb3Bkb3duOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaMiemSrumFjee9rlxuICAgICAqIHtcbiAgICAgKiAgIHZpZXc6ey4uLkZzQnV0dG9uLGNsaWNrOkZ1bmN0aW9uLG9yZGVyOjF9LFxuICAgICAqICAgZWRpdDp7Li4uRnNCdXR0b24sY2xpY2s6RnVuY3Rpb24sb3JkZXI6Mn0sXG4gICAgICogICByZW1vdmU6ey4uLkZzQnV0dG9uLGNsaWNrOkZ1bmN0aW9uLG9yZGVyOjN9LFxuICAgICAqICAgLi4u6Ieq5a6a5LmJXG4gICAgICogfVxuICAgICAqL1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5oyJ6ZKu5YiG57uELOS4iumdoueahGJ1dHRvbnPkuLrpu5jorqTliIbnu4RcbiAgICAgKiAge1xuICAgICAqICAgIGdyb3VwS2V5OntidXR0b25LZXk6e30sYnV0dG9uS2V5Mjp7fX1cbiAgICAgKiAgfVxuICAgICAqL1xuICAgIGdyb3VwOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW9k+WJjea/gOa0u+WIhue7hFxuICAgICAqL1xuICAgIGFjdGl2ZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHNjb3BlXG4gICAgICovXG4gICAgc2NvcGU6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcImhhbmRsZVwiXSxcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuXG4gICAgY29uc3Qgc2NvcGVSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wcm9wcy5zY29wZSxcbiAgICAgICAgcm93OiBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5yb3ddLFxuICAgICAgICBpbmRleDogcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4uaW5kZXhdXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IGRvQ2xpY2sgPSAoaXRlbTogYW55KSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLmluZGV4XTtcbiAgICAgIGNvbnN0IHJvdyA9IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLnJvd107XG4gICAgICBjb25zdCBlOiBTY29wZUNvbnRleHQgPSB7IGtleTogaXRlbS5rZXksIHJvdywgYnRuOiBpdGVtLCBpbmRleCwgLi4ucHJvcHMuc2NvcGUgfTtcbiAgICAgIGlmIChpdGVtLmNsaWNrKSB7XG4gICAgICAgIHJldHVybiBpdGVtLmNsaWNrKGUpO1xuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJoYW5kbGVcIiwgZSk7XG4gICAgfTtcbiAgICBjb25zdCB7IGRvQ29tcHV0ZWQgfSA9IHVzZUNvbXB1dGUoKTtcbiAgICBjb25zdCBwaWNrZWRQcm9wcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRyb3Bkb3duOiBwcm9wcy5kcm9wZG93bixcbiAgICAgICAgYnV0dG9uczogcHJvcHMuYnV0dG9ucyxcbiAgICAgICAgYWN0aXZlOiBwcm9wcy5hY3RpdmUsXG4gICAgICAgIGdyb3VwOiBwcm9wcy5ncm91cFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBjb21wdXRlUHJvcHMgPSBkb0NvbXB1dGVkKFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gcGlja2VkUHJvcHMudmFsdWU7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLmluZGV4XTtcbiAgICAgICAgY29uc3Qgcm93ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4ucm93XTtcbiAgICAgICAgcmV0dXJuIHsgLi4ucHJvcHMuc2NvcGUsIGluZGV4LCByb3cgfTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy9jb25zdCBjb21wdXRlUHJvcHMgPSB7IHZhbHVlOiBwcm9wcyB9O1xuICAgIGNvbnN0IGNvbXB1dGVkSGFuZGxlQnRucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGxldCBtZXJnZWRCdG5zID0gbnVsbDtcbiAgICAgIGlmIChjb21wdXRlUHJvcHMudmFsdWUuYWN0aXZlID09IG51bGwgfHwgY29tcHV0ZVByb3BzLnZhbHVlLmFjdGl2ZSA9PT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgY29uc3QgZGVmQnRucyA9IHtcbiAgICAgICAgICB2aWV3OiB7XG4gICAgICAgICAgICBrZXk6IFwidmlld1wiLFxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS52aWV3LnRleHRcIiksXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS52aWV3LnRleHRcIilcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvcHk6IHtcbiAgICAgICAgICAgIGtleTogXCJjb3B5XCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMucm93SGFuZGxlLmNvcHkudGV4dFwiKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLmNvcHkudGV4dFwiKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZWRpdDoge1xuICAgICAgICAgICAga2V5OiBcImVkaXRcIixcbiAgICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS5lZGl0LnRleHRcIiksXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS5lZGl0LnRleHRcIilcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlbW92ZToge1xuICAgICAgICAgICAga2V5OiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgLi4udWkuYnV0dG9uLmNvbG9ycyhcImRhbmdlclwiKSxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJmcy5yb3dIYW5kbGUucmVtb3ZlLnRleHRcIiksXG4gICAgICAgICAgICB0aXRsZTogdChcImZzLnJvd0hhbmRsZS5yZW1vdmUudGV4dFwiKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbWVyZ2VkQnRucyA9IG1lcmdlKGRlZkJ0bnMsIGNvbXB1dGVQcm9wcy52YWx1ZS5idXR0b25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lcmdlZEJ0bnMgPSBjb21wdXRlUHJvcHMudmFsdWUuZ3JvdXBbY29tcHV0ZVByb3BzLnZhbHVlLmFjdGl2ZV07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ0bnM6IEJ1dHRvblByb3BzW10gPSBbXTtcbiAgICAgIGZvckVhY2gobWVyZ2VkQnRucywgKGl0ZW0sIGtleSkgPT4ge1xuICAgICAgICBpdGVtLmtleSA9IGtleTtcbiAgICAgICAgaWYgKGl0ZW0uc2hvdyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnRucy5wdXNoKGl0ZW0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzb3J0QnkoYnRucywgKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcHV0ZWREcm9wZG93bkF0TGVhc3QgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93biA9PSBudWxsIHx8XG4gICAgICAgIGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93bi5hdExlYXN0ID09IG51bGwgfHxcbiAgICAgICAgY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3QgPD0gMCB8fFxuICAgICAgICBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWUubGVuZ3RoIDw9IGNvbXB1dGVQcm9wcy52YWx1ZS5kcm9wZG93bi5hdExlYXN0XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3QgfHwgMDtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpc0Ryb3Bkb3duQnRuKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgaWYgKGl0ZW0uZHJvcGRvd24gPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY29tcHV0ZWREcm9wZG93bkF0TGVhc3QudmFsdWUgPiAwICYmIGNvbXB1dGVkRHJvcGRvd25BdExlYXN0LnZhbHVlIDwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGhhc0Ryb3Bkb3duQnRuID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWUpIHtcbiAgICAgICAgY29uc3QgaXMgPSBpc0Ryb3Bkb3duQnRuKGl0ZW0sIGluZGV4KTtcbiAgICAgICAgaWYgKGlzKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGRvRHJvcGRvd25JdGVtQ2xpY2soJGV2ZW50OiBhbnkpIHtcbiAgICAgIGZvciAobGV0IGJ0biBvZiBjb21wdXRlZEhhbmRsZUJ0bnMudmFsdWUpIHtcbiAgICAgICAgaWYgKCRldmVudCA9PT0gYnRuLmtleSkge1xuICAgICAgICAgIGRvQ2xpY2soYnRuKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZERyb3Bkb3duQmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IGJpbmRpbmc6IGFueSA9IHt9O1xuICAgICAgaWYgKHVpLmRyb3Bkb3duLnJlbmRlck1vZGUgIT09IFwic2xvdFwiKSB7XG4gICAgICAgIC8vIG5haXZlIOmAmui/h29wdGlvbnPphY3nva7mnaXmmL7npLrlrZDpoblcbiAgICAgICAgY29uc3QgYnRucyA9IGNvbXB1dGVkSGFuZGxlQnRucy52YWx1ZTtcbiAgICAgICAgY29uc3Qgb3B0czogQnV0dG9uUHJvcHNbXSA9IFtdO1xuICAgICAgICBmb3JFYWNoKGJ0bnMsICh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAodmFsdWUuc2hvdyAhPT0gZmFsc2UgJiYgaXNEcm9wZG93bkJ0bih2YWx1ZSwgaW5kZXgpKSB7XG4gICAgICAgICAgICBvcHRzLnB1c2goe1xuICAgICAgICAgICAgICBbdWkuZHJvcGRvd24udmFsdWVdOiB2YWx1ZS5rZXksXG4gICAgICAgICAgICAgIFt1aS5kcm9wZG93bi5sYWJlbF06IHZhbHVlLnRleHQsXG4gICAgICAgICAgICAgIHRpdGxlOiB2YWx1ZS50aXRsZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYmluZGluZy5vcHRpb25zID0gb3B0cztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9taXQocHJvcHMuZHJvcGRvd24sIFwibW9yZVwiLCBcImF0TGVhc3RcIiksXG4gICAgICAgIC4uLnVpLmRyb3Bkb3duLmNvbW1hbmQoZG9Ecm9wZG93bkl0ZW1DbGljayksXG4gICAgICAgIC4uLmJpbmRpbmdcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICBoYXNEcm9wZG93bkJ0bixcbiAgICAgIGNvbXB1dGVkSGFuZGxlQnRucyxcbiAgICAgIGRvRHJvcGRvd25JdGVtQ2xpY2ssXG4gICAgICBjb21wdXRlZERyb3Bkb3duQXRMZWFzdCxcbiAgICAgIGRvQ2xpY2ssXG4gICAgICBpc0Ryb3Bkb3duQnRuLFxuICAgICAgc2NvcGVSZWYsXG4gICAgICBjb21wdXRlZERyb3Bkb3duQmluZGluZ1xuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXJvdy1oYW5kbGUge1xuICAvLyBkaXNwbGF5OiBmbGV4IDsgLy8g6L+Z6YeM5LiN6IO955SoZmxleO+8jOWQpuWImeS8muegtOWdj2FsaWduOmNlbnRlcumFjee9rlxuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAuZWwtYnV0dG9uICsgLmVsLWJ1dHRvbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDJweDtcbiAgfVxuICAmID4gKiB7XG4gICAgbWFyZ2luOiAycHg7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxuICAuZnMtcm93LWhhbmRsZS1kcm9wZG93bi1pdGVtIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgLm4tYnV0dG9uIHtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG1hcmdpbjogMnB4O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtcm93LWhhbmRsZVwiPlxuICAgIDxzbG90IG5hbWU9XCJjZWxsLXJvd0hhbmRsZS1sZWZ0XCIgdi1iaW5kPVwic2NvcGVSZWZcIj48L3Nsb3Q+XG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjb21wdXRlZEhhbmRsZUJ0bnNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXRlbS5zaG93ICE9PSBmYWxzZSAmJiAhaXNEcm9wZG93bkJ0bihpdGVtLCBpbmRleClcIj5cbiAgICAgICAgPGZzLXJlbmRlciB2LWlmPVwiaXRlbS5yZW5kZXJcIiA6cmVuZGVyLWZ1bmM9XCJpdGVtLnJlbmRlclwiIDpzY29wZT1cInNjb3BlUmVmXCIgLz5cbiAgICAgICAgPGZzLWJ1dHRvbiB2LWVsc2UgY2xhc3M9XCJyb3ctaGFuZGxlLWJ0blwiIHYtYmluZD1cIml0ZW1cIiBAY2xpY2suc3RvcD1cImRvQ2xpY2soaXRlbSlcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDxzbG90IG5hbWU9XCJjZWxsLXJvd0hhbmRsZS1taWRkbGVcIiB2LWJpbmQ9XCJzY29wZVwiPjwvc2xvdD5cbiAgICA8IS0tIOS4i+aLieaMiemSruiPnOWNlSAtLT5cbiAgICA8c3BhbiB2LWlmPVwiaGFzRHJvcGRvd25CdG5cIiBjbGFzcz1cInJvdy1oYW5kbGUtYnRuIGZzLWhhbmRsZS1yb3ctZHJvcGRvd25cIj5cbiAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZHJvcGRvd24ubmFtZVwiIHYtYmluZD1cImNvbXB1dGVkRHJvcGRvd25CaW5kaW5nXCI+XG4gICAgICAgIDxmcy1idXR0b24gdi1iaW5kPVwiZHJvcGRvd24ubW9yZVwiIC8+XG4gICAgICAgIDx0ZW1wbGF0ZSAjW3VpLmRyb3Bkb3duLnNsb3ROYW1lXT5cbiAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICA6aXM9XCJ1aS5kcm9wZG93bk1lbnUubmFtZVwiXG4gICAgICAgICAgICB2LWlmPVwidWkuZHJvcGRvd24ucmVuZGVyTW9kZSA9PT0gJ3Nsb3QnXCJcbiAgICAgICAgICAgIHYtYmluZD1cInVpLmRyb3Bkb3duTWVudS5jb21tYW5kKGRvRHJvcGRvd25JdGVtQ2xpY2spXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNvbXB1dGVkSGFuZGxlQnRuc1wiIDprZXk9XCJpbmRleFwiPlxuICAgICAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICAgICAgOmlzPVwidWkuZHJvcGRvd25JdGVtLm5hbWVcIlxuICAgICAgICAgICAgICAgIHYtaWY9XCJpdGVtLnNob3cgIT09IGZhbHNlICYmIGlzRHJvcGRvd25CdG4oaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICAgICAgICA6W3VpLmRyb3Bkb3duSXRlbS5jb21tYW5kXT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgICAgICB2LWJpbmQ9XCJpdGVtLmRyb3Bkb3duSXRlbVwiXG4gICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LWhhbmRsZS1kcm9wZG93bi1pdGVtXCIgdi1iaW5kPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgPGZzLWljb24gdi1pZj1cIml0ZW0uaWNvblwiIDppY29uPVwiaXRlbS5pY29uXCIgLz4ge3sgaXRlbS50ZXh0IHx8IGl0ZW0udGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9jb21wb25lbnQ+XG4gICAgPC9zcGFuPlxuICAgIDxzbG90IG5hbWU9XCJjZWxsLXJvd0hhbmRsZS1yaWdodFwiIHYtYmluZD1cInNjb3BlXCI+PC9zbG90PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IGZvckVhY2gsIHNvcnRCeSwgb21pdCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLXVpXCI7XG5pbXBvcnQgeyB1c2VDb21wdXRlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtY29tcHV0ZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBCdXR0b25Qcm9wcywgU2NvcGVDb250ZXh0IH0gZnJvbSBcIi4uLy4uL2RcIjtcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG4vKipcbiAqIOaTjeS9nOWIl+mFjee9rlxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzUm93SGFuZGxlXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5oyJ6ZKu5oqY5Y+g6YWN572uXG4gICAgICovXG4gICAgZHJvcGRvd246IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uXG4gICAgICoge1xuICAgICAqICAgdmlldzp7Li4uRnNCdXR0b24sY2xpY2s6RnVuY3Rpb24sb3JkZXI6MX0sXG4gICAgICogICBlZGl0OnsuLi5Gc0J1dHRvbixjbGljazpGdW5jdGlvbixvcmRlcjoyfSxcbiAgICAgKiAgIHJlbW92ZTp7Li4uRnNCdXR0b24sY2xpY2s6RnVuY3Rpb24sb3JkZXI6M30sXG4gICAgICogICAuLi7oh6rlrprkuYlcbiAgICAgKiB9XG4gICAgICovXG4gICAgYnV0dG9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmjInpkq7liIbnu4Qs5LiK6Z2i55qEYnV0dG9uc+S4uum7mOiupOWIhue7hFxuICAgICAqICB7XG4gICAgICogICAgZ3JvdXBLZXk6e2J1dHRvbktleTp7fSxidXR0b25LZXkyOnt9fVxuICAgICAqICB9XG4gICAgICovXG4gICAgZ3JvdXA6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5b2T5YmN5r+A5rS75YiG57uEXG4gICAgICovXG4gICAgYWN0aXZlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIlxuICAgIH0sXG4gICAgLyoqXG4gICAgICogc2NvcGVcbiAgICAgKi9cbiAgICBzY29wZToge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBlbWl0czogW1wiaGFuZGxlXCJdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG5cbiAgICBjb25zdCBzY29wZVJlZiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByb3BzLnNjb3BlLFxuICAgICAgICByb3c6IHByb3BzLnNjb3BlW3VpLnRhYmxlQ29sdW1uLnJvd10sXG4gICAgICAgIGluZGV4OiBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5pbmRleF1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgZG9DbGljayA9IChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4uaW5kZXhdO1xuICAgICAgY29uc3Qgcm93ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4ucm93XTtcbiAgICAgIGNvbnN0IGU6IFNjb3BlQ29udGV4dCA9IHsga2V5OiBpdGVtLmtleSwgcm93LCBidG46IGl0ZW0sIGluZGV4LCAuLi5wcm9wcy5zY29wZSB9O1xuICAgICAgaWYgKGl0ZW0uY2xpY2spIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uY2xpY2soZSk7XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcImhhbmRsZVwiLCBlKTtcbiAgICB9O1xuICAgIGNvbnN0IHsgZG9Db21wdXRlZCB9ID0gdXNlQ29tcHV0ZSgpO1xuICAgIGNvbnN0IHBpY2tlZFByb3BzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZHJvcGRvd246IHByb3BzLmRyb3Bkb3duLFxuICAgICAgICBidXR0b25zOiBwcm9wcy5idXR0b25zLFxuICAgICAgICBhY3RpdmU6IHByb3BzLmFjdGl2ZSxcbiAgICAgICAgZ3JvdXA6IHByb3BzLmdyb3VwXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IGNvbXB1dGVQcm9wcyA9IGRvQ29tcHV0ZWQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBwaWNrZWRQcm9wcy52YWx1ZTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcHJvcHMuc2NvcGVbdWkudGFibGVDb2x1bW4uaW5kZXhdO1xuICAgICAgICBjb25zdCByb3cgPSBwcm9wcy5zY29wZVt1aS50YWJsZUNvbHVtbi5yb3ddO1xuICAgICAgICByZXR1cm4geyAuLi5wcm9wcy5zY29wZSwgaW5kZXgsIHJvdyB9O1xuICAgICAgfVxuICAgICk7XG5cbiAgICAvL2NvbnN0IGNvbXB1dGVQcm9wcyA9IHsgdmFsdWU6IHByb3BzIH07XG4gICAgY29uc3QgY29tcHV0ZWRIYW5kbGVCdG5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgbGV0IG1lcmdlZEJ0bnMgPSBudWxsO1xuICAgICAgaWYgKGNvbXB1dGVQcm9wcy52YWx1ZS5hY3RpdmUgPT0gbnVsbCB8fCBjb21wdXRlUHJvcHMudmFsdWUuYWN0aXZlID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICBjb25zdCBkZWZCdG5zID0ge1xuICAgICAgICAgIHZpZXc6IHtcbiAgICAgICAgICAgIGtleTogXCJ2aWV3XCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMucm93SGFuZGxlLnZpZXcudGV4dFwiKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLnZpZXcudGV4dFwiKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29weToge1xuICAgICAgICAgICAga2V5OiBcImNvcHlcIixcbiAgICAgICAgICAgIHRleHQ6IHQoXCJmcy5yb3dIYW5kbGUuY29weS50ZXh0XCIpLFxuICAgICAgICAgICAgdGl0bGU6IHQoXCJmcy5yb3dIYW5kbGUuY29weS50ZXh0XCIpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlZGl0OiB7XG4gICAgICAgICAgICBrZXk6IFwiZWRpdFwiLFxuICAgICAgICAgICAgdHlwZTogXCJwcmltYXJ5XCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMucm93SGFuZGxlLmVkaXQudGV4dFwiKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLmVkaXQudGV4dFwiKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVtb3ZlOiB7XG4gICAgICAgICAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgICAgICAgICAuLi51aS5idXR0b24uY29sb3JzKFwiZGFuZ2VyXCIpLFxuICAgICAgICAgICAgdGV4dDogdChcImZzLnJvd0hhbmRsZS5yZW1vdmUudGV4dFwiKSxcbiAgICAgICAgICAgIHRpdGxlOiB0KFwiZnMucm93SGFuZGxlLnJlbW92ZS50ZXh0XCIpXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBtZXJnZWRCdG5zID0gbWVyZ2UoZGVmQnRucywgY29tcHV0ZVByb3BzLnZhbHVlLmJ1dHRvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVyZ2VkQnRucyA9IGNvbXB1dGVQcm9wcy52YWx1ZS5ncm91cFtjb21wdXRlUHJvcHMudmFsdWUuYWN0aXZlXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnRuczogQnV0dG9uUHJvcHNbXSA9IFtdO1xuICAgICAgZm9yRWFjaChtZXJnZWRCdG5zLCAoaXRlbSwga2V5KSA9PiB7XG4gICAgICAgIGl0ZW0ua2V5ID0ga2V5O1xuICAgICAgICBpZiAoaXRlbS5zaG93ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBidG5zLnB1c2goaXRlbSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNvcnRCeShidG5zLCAoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZERyb3Bkb3duQXRMZWFzdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duID09IG51bGwgfHxcbiAgICAgICAgY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3QgPT0gbnVsbCB8fFxuICAgICAgICBjb21wdXRlUHJvcHMudmFsdWUuZHJvcGRvd24uYXRMZWFzdCA8PSAwIHx8XG4gICAgICAgIGNvbXB1dGVkSGFuZGxlQnRucy52YWx1ZS5sZW5ndGggPD0gY29tcHV0ZVByb3BzLnZhbHVlLmRyb3Bkb3duLmF0TGVhc3RcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21wdXRlUHJvcHMudmFsdWUuZHJvcGRvd24uYXRMZWFzdCB8fCAwO1xuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzRHJvcGRvd25CdG4oaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICBpZiAoaXRlbS5kcm9wZG93biA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wdXRlZERyb3Bkb3duQXRMZWFzdC52YWx1ZSA+IDAgJiYgY29tcHV0ZWREcm9wZG93bkF0TGVhc3QudmFsdWUgPCBpbmRleCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaGFzRHJvcGRvd25CdG4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbXB1dGVkSGFuZGxlQnRucy52YWx1ZSkge1xuICAgICAgICBjb25zdCBpcyA9IGlzRHJvcGRvd25CdG4oaXRlbSwgaW5kZXgpO1xuICAgICAgICBpZiAoaXMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZG9Ecm9wZG93bkl0ZW1DbGljaygkZXZlbnQ6IGFueSkge1xuICAgICAgZm9yIChsZXQgYnRuIG9mIGNvbXB1dGVkSGFuZGxlQnRucy52YWx1ZSkge1xuICAgICAgICBpZiAoJGV2ZW50ID09PSBidG4ua2V5KSB7XG4gICAgICAgICAgZG9DbGljayhidG4pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXB1dGVkRHJvcGRvd25CaW5kaW5nID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgYmluZGluZzogYW55ID0ge307XG4gICAgICBpZiAodWkuZHJvcGRvd24ucmVuZGVyTW9kZSAhPT0gXCJzbG90XCIpIHtcbiAgICAgICAgLy8gbmFpdmUg6YCa6L+Hb3B0aW9uc+mFjee9ruadpeaYvuekuuWtkOmhuVxuICAgICAgICBjb25zdCBidG5zID0gY29tcHV0ZWRIYW5kbGVCdG5zLnZhbHVlO1xuICAgICAgICBjb25zdCBvcHRzOiBCdXR0b25Qcm9wc1tdID0gW107XG4gICAgICAgIGZvckVhY2goYnRucywgKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmICh2YWx1ZS5zaG93ICE9PSBmYWxzZSAmJiBpc0Ryb3Bkb3duQnRuKHZhbHVlLCBpbmRleCkpIHtcbiAgICAgICAgICAgIG9wdHMucHVzaCh7XG4gICAgICAgICAgICAgIFt1aS5kcm9wZG93bi52YWx1ZV06IHZhbHVlLmtleSxcbiAgICAgICAgICAgICAgW3VpLmRyb3Bkb3duLmxhYmVsXTogdmFsdWUudGV4dCxcbiAgICAgICAgICAgICAgdGl0bGU6IHZhbHVlLnRpdGxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBiaW5kaW5nLm9wdGlvbnMgPSBvcHRzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub21pdChwcm9wcy5kcm9wZG93biwgXCJtb3JlXCIsIFwiYXRMZWFzdFwiKSxcbiAgICAgICAgLi4udWkuZHJvcGRvd24uY29tbWFuZChkb0Ryb3Bkb3duSXRlbUNsaWNrKSxcbiAgICAgICAgLi4uYmluZGluZ1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIGhhc0Ryb3Bkb3duQnRuLFxuICAgICAgY29tcHV0ZWRIYW5kbGVCdG5zLFxuICAgICAgZG9Ecm9wZG93bkl0ZW1DbGljayxcbiAgICAgIGNvbXB1dGVkRHJvcGRvd25BdExlYXN0LFxuICAgICAgZG9DbGljayxcbiAgICAgIGlzRHJvcGRvd25CdG4sXG4gICAgICBzY29wZVJlZixcbiAgICAgIGNvbXB1dGVkRHJvcGRvd25CaW5kaW5nXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtcm93LWhhbmRsZSB7XG4gIC8vIGRpc3BsYXk6IGZsZXggOyAvLyDov5nph4zkuI3og73nlKhmbGV477yM5ZCm5YiZ5Lya56C05Z2PYWxpZ246Y2VudGVy6YWN572uXG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIC5lbC1idXR0b24gKyAuZWwtYnV0dG9uIHtcbiAgICBtYXJnaW4tbGVmdDogMnB4O1xuICB9XG4gICYgPiAqIHtcbiAgICBtYXJnaW46IDJweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG4gIC5mcy1yb3ctaGFuZGxlLWRyb3Bkb3duLWl0ZW0ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gIH1cblxuICAubi1idXR0b24ge1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgbWFyZ2luOiAycHg7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcblxuICBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9O1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpIDogZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSkge1xuICAgIF9jb25zdHJ1Y3QgPSBSZWZsZWN0LmNvbnN0cnVjdC5iaW5kKCk7XG4gIH0gZWxzZSB7XG4gICAgX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSBGdW5jdGlvbi5iaW5kLmFwcGx5KFBhcmVudCwgYSk7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAgIGlmIChDbGFzcykgX3NldFByb3RvdHlwZU9mKGluc3RhbmNlLCBDbGFzcy5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2NvbnN0cnVjdC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVGdW5jdGlvbihmbikge1xuICByZXR1cm4gRnVuY3Rpb24udG9TdHJpbmcuY2FsbChmbikuaW5kZXhPZihcIltuYXRpdmUgY29kZV1cIikgIT09IC0xO1xufVxuXG5mdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gIHZhciBfY2FjaGUgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgPyBuZXcgTWFwKCkgOiB1bmRlZmluZWQ7XG5cbiAgX3dyYXBOYXRpdmVTdXBlciA9IGZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHtcbiAgICBpZiAoQ2xhc3MgPT09IG51bGwgfHwgIV9pc05hdGl2ZUZ1bmN0aW9uKENsYXNzKSkgcmV0dXJuIENsYXNzO1xuXG4gICAgaWYgKHR5cGVvZiBDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBfY2FjaGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChfY2FjaGUuaGFzKENsYXNzKSkgcmV0dXJuIF9jYWNoZS5nZXQoQ2xhc3MpO1xuXG4gICAgICBfY2FjaGUuc2V0KENsYXNzLCBXcmFwcGVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXcmFwcGVyKCkge1xuICAgICAgcmV0dXJuIF9jb25zdHJ1Y3QoQ2xhc3MsIGFyZ3VtZW50cywgX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yKTtcbiAgICB9XG5cbiAgICBXcmFwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogV3JhcHBlcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gX3NldFByb3RvdHlwZU9mKFdyYXBwZXIsIENsYXNzKTtcbiAgfTtcblxuICByZXR1cm4gX3dyYXBOYXRpdmVTdXBlcihDbGFzcyk7XG59XG5cbi8qIGVzbGludCBuby1jb25zb2xlOjAgKi9cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xudmFyIHdhcm5pbmcgPSBmdW5jdGlvbiB3YXJuaW5nKCkge307IC8vIGRvbid0IHByaW50IHdhcm5pbmcgbWVzc2FnZSB3aGVuIGluIHByb2R1Y3Rpb24gZW52IG9yIG5vZGUgcnVudGltZVxuXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZyh0eXBlLCBlcnJvcnMpIHtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUud2FybiAmJiB0eXBlb2YgQVNZTkNfVkFMSURBVE9SX05PX1dBUk5JTkcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoZXJyb3JzLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ3N0cmluZyc7XG4gICAgICB9KSkge1xuICAgICAgICBjb25zb2xlLndhcm4odHlwZSwgZXJyb3JzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGaWVsZHNFcnJvcihlcnJvcnMpIHtcbiAgaWYgKCFlcnJvcnMgfHwgIWVycm9ycy5sZW5ndGgpIHJldHVybiBudWxsO1xuICB2YXIgZmllbGRzID0ge307XG4gIGVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgIHZhciBmaWVsZCA9IGVycm9yLmZpZWxkO1xuICAgIGZpZWxkc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdIHx8IFtdO1xuICAgIGZpZWxkc1tmaWVsZF0ucHVzaChlcnJvcik7XG4gIH0pO1xuICByZXR1cm4gZmllbGRzO1xufVxuZnVuY3Rpb24gZm9ybWF0KHRlbXBsYXRlKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBpID0gMDtcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuXG4gIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdGVtcGxhdGUuYXBwbHkobnVsbCwgYXJncyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnc3RyaW5nJykge1xuICAgIHZhciBzdHIgPSB0ZW1wbGF0ZS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24gKHgpIHtcbiAgICAgIGlmICh4ID09PSAnJSUnKSB7XG4gICAgICAgIHJldHVybiAnJSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpID49IGxlbikge1xuICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh4KSB7XG4gICAgICAgIGNhc2UgJyVzJzpcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG5cbiAgICAgICAgY2FzZSAnJWQnOlxuICAgICAgICAgIHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcblxuICAgICAgICBjYXNlICclaic6XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBsYXRlO1xufVxuXG5mdW5jdGlvbiBpc05hdGl2ZVN0cmluZ1R5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ3VybCcgfHwgdHlwZSA9PT0gJ2hleCcgfHwgdHlwZSA9PT0gJ2VtYWlsJyB8fCB0eXBlID09PSAnZGF0ZScgfHwgdHlwZSA9PT0gJ3BhdHRlcm4nO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5VmFsdWUodmFsdWUsIHR5cGUpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSAnYXJyYXknICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpc05hdGl2ZVN0cmluZ1R5cGUodHlwZSkgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhdmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYXN5bmNQYXJhbGxlbEFycmF5KGFyciwgZnVuYywgY2FsbGJhY2spIHtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIHRvdGFsID0gMDtcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gY291bnQoZXJyb3JzKSB7XG4gICAgcmVzdWx0cy5wdXNoLmFwcGx5KHJlc3VsdHMsIGVycm9ycyB8fCBbXSk7XG4gICAgdG90YWwrKztcblxuICAgIGlmICh0b3RhbCA9PT0gYXJyTGVuZ3RoKSB7XG4gICAgICBjYWxsYmFjayhyZXN1bHRzKTtcbiAgICB9XG4gIH1cblxuICBhcnIuZm9yRWFjaChmdW5jdGlvbiAoYSkge1xuICAgIGZ1bmMoYSwgY291bnQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXN5bmNTZXJpYWxBcnJheShhcnIsIGZ1bmMsIGNhbGxiYWNrKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIG5leHQoZXJyb3JzKSB7XG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoKSB7XG4gICAgICBjYWxsYmFjayhlcnJvcnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBvcmlnaW5hbCA9IGluZGV4O1xuICAgIGluZGV4ID0gaW5kZXggKyAxO1xuXG4gICAgaWYgKG9yaWdpbmFsIDwgYXJyTGVuZ3RoKSB7XG4gICAgICBmdW5jKGFycltvcmlnaW5hbF0sIG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhbXSk7XG4gICAgfVxuICB9XG5cbiAgbmV4dChbXSk7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5PYmpBcnIob2JqQXJyKSB7XG4gIHZhciByZXQgPSBbXTtcbiAgT2JqZWN0LmtleXMob2JqQXJyKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgcmV0LnB1c2guYXBwbHkocmV0LCBvYmpBcnJba10gfHwgW10pO1xuICB9KTtcbiAgcmV0dXJuIHJldDtcbn1cblxudmFyIEFzeW5jVmFsaWRhdGlvbkVycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRXJyb3IpIHtcbiAgX2luaGVyaXRzTG9vc2UoQXN5bmNWYWxpZGF0aW9uRXJyb3IsIF9FcnJvcik7XG5cbiAgZnVuY3Rpb24gQXN5bmNWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLCBmaWVsZHMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9FcnJvci5jYWxsKHRoaXMsICdBc3luYyBWYWxpZGF0aW9uIEVycm9yJykgfHwgdGhpcztcbiAgICBfdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgX3RoaXMuZmllbGRzID0gZmllbGRzO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBBc3luY1ZhbGlkYXRpb25FcnJvcjtcbn0oIC8qI19fUFVSRV9fKi9fd3JhcE5hdGl2ZVN1cGVyKEVycm9yKSk7XG5mdW5jdGlvbiBhc3luY01hcChvYmpBcnIsIG9wdGlvbiwgZnVuYywgY2FsbGJhY2ssIHNvdXJjZSkge1xuICBpZiAob3B0aW9uLmZpcnN0KSB7XG4gICAgdmFyIF9wZW5kaW5nID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIG5leHQgPSBmdW5jdGlvbiBuZXh0KGVycm9ycykge1xuICAgICAgICBjYWxsYmFjayhlcnJvcnMpO1xuICAgICAgICByZXR1cm4gZXJyb3JzLmxlbmd0aCA/IHJlamVjdChuZXcgQXN5bmNWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLCBjb252ZXJ0RmllbGRzRXJyb3IoZXJyb3JzKSkpIDogcmVzb2x2ZShzb3VyY2UpO1xuICAgICAgfTtcblxuICAgICAgdmFyIGZsYXR0ZW5BcnIgPSBmbGF0dGVuT2JqQXJyKG9iakFycik7XG4gICAgICBhc3luY1NlcmlhbEFycmF5KGZsYXR0ZW5BcnIsIGZ1bmMsIG5leHQpO1xuICAgIH0pO1xuXG4gICAgX3BlbmRpbmdbXCJjYXRjaFwiXShmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIGU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3BlbmRpbmc7XG4gIH1cblxuICB2YXIgZmlyc3RGaWVsZHMgPSBvcHRpb24uZmlyc3RGaWVsZHMgPT09IHRydWUgPyBPYmplY3Qua2V5cyhvYmpBcnIpIDogb3B0aW9uLmZpcnN0RmllbGRzIHx8IFtdO1xuICB2YXIgb2JqQXJyS2V5cyA9IE9iamVjdC5rZXlzKG9iakFycik7XG4gIHZhciBvYmpBcnJMZW5ndGggPSBvYmpBcnJLZXlzLmxlbmd0aDtcbiAgdmFyIHRvdGFsID0gMDtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIG5leHQgPSBmdW5jdGlvbiBuZXh0KGVycm9ycykge1xuICAgICAgcmVzdWx0cy5wdXNoLmFwcGx5KHJlc3VsdHMsIGVycm9ycyk7XG4gICAgICB0b3RhbCsrO1xuXG4gICAgICBpZiAodG90YWwgPT09IG9iakFyckxlbmd0aCkge1xuICAgICAgICBjYWxsYmFjayhyZXN1bHRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHMubGVuZ3RoID8gcmVqZWN0KG5ldyBBc3luY1ZhbGlkYXRpb25FcnJvcihyZXN1bHRzLCBjb252ZXJ0RmllbGRzRXJyb3IocmVzdWx0cykpKSA6IHJlc29sdmUoc291cmNlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKCFvYmpBcnJLZXlzLmxlbmd0aCkge1xuICAgICAgY2FsbGJhY2socmVzdWx0cyk7XG4gICAgICByZXNvbHZlKHNvdXJjZSk7XG4gICAgfVxuXG4gICAgb2JqQXJyS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBhcnIgPSBvYmpBcnJba2V5XTtcblxuICAgICAgaWYgKGZpcnN0RmllbGRzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcbiAgICAgICAgYXN5bmNTZXJpYWxBcnJheShhcnIsIGZ1bmMsIG5leHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXN5bmNQYXJhbGxlbEFycmF5KGFyciwgZnVuYywgbmV4dCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBwZW5kaW5nW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGUpIHtcbiAgICByZXR1cm4gZTtcbiAgfSk7XG4gIHJldHVybiBwZW5kaW5nO1xufVxuXG5mdW5jdGlvbiBpc0Vycm9yT2JqKG9iaikge1xuICByZXR1cm4gISEob2JqICYmIG9iai5tZXNzYWdlICE9PSB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZSh2YWx1ZSwgcGF0aCkge1xuICB2YXIgdiA9IHZhbHVlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGlmICh2ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHY7XG4gICAgfVxuXG4gICAgdiA9IHZbcGF0aFtpXV07XG4gIH1cblxuICByZXR1cm4gdjtcbn1cblxuZnVuY3Rpb24gY29tcGxlbWVudEVycm9yKHJ1bGUsIHNvdXJjZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKG9lKSB7XG4gICAgdmFyIGZpZWxkVmFsdWU7XG5cbiAgICBpZiAocnVsZS5mdWxsRmllbGRzKSB7XG4gICAgICBmaWVsZFZhbHVlID0gZ2V0VmFsdWUoc291cmNlLCBydWxlLmZ1bGxGaWVsZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZFZhbHVlID0gc291cmNlW29lLmZpZWxkIHx8IHJ1bGUuZnVsbEZpZWxkXTtcbiAgICB9XG5cbiAgICBpZiAoaXNFcnJvck9iaihvZSkpIHtcbiAgICAgIG9lLmZpZWxkID0gb2UuZmllbGQgfHwgcnVsZS5mdWxsRmllbGQ7XG4gICAgICBvZS5maWVsZFZhbHVlID0gZmllbGRWYWx1ZTtcbiAgICAgIHJldHVybiBvZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogdHlwZW9mIG9lID09PSAnZnVuY3Rpb24nID8gb2UoKSA6IG9lLFxuICAgICAgZmllbGRWYWx1ZTogZmllbGRWYWx1ZSxcbiAgICAgIGZpZWxkOiBvZS5maWVsZCB8fCBydWxlLmZ1bGxGaWVsZFxuICAgIH07XG4gIH07XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSkge1xuICAgIGZvciAodmFyIHMgaW4gc291cmNlKSB7XG4gICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KHMpKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtzXTtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdGFyZ2V0W3NdID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRhcmdldFtzXSA9IF9leHRlbmRzKHt9LCB0YXJnZXRbc10sIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRbc10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbnZhciByZXF1aXJlZCQxID0gZnVuY3Rpb24gcmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCB0eXBlKSB7XG4gIGlmIChydWxlLnJlcXVpcmVkICYmICghc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpIHx8IGlzRW1wdHlWYWx1ZSh2YWx1ZSwgdHlwZSB8fCBydWxlLnR5cGUpKSkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnJlcXVpcmVkLCBydWxlLmZ1bGxGaWVsZCkpO1xuICB9XG59O1xuXG4vKipcbiAqICBSdWxlIGZvciB2YWxpZGF0aW5nIHdoaXRlc3BhY2UuXG4gKlxuICogIEBwYXJhbSBydWxlIFRoZSB2YWxpZGF0aW9uIHJ1bGUuXG4gKiAgQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb24gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiAgQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBiZWluZyB2YWxpZGF0ZWQuXG4gKiAgQHBhcmFtIGVycm9ycyBBbiBhcnJheSBvZiBlcnJvcnMgdGhhdCB0aGlzIHJ1bGUgbWF5IGFkZFxuICogIHZhbGlkYXRpb24gZXJyb3JzIHRvLlxuICogIEBwYXJhbSBvcHRpb25zIFRoZSB2YWxpZGF0aW9uIG9wdGlvbnMuXG4gKiAgQHBhcmFtIG9wdGlvbnMubWVzc2FnZXMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gKi9cblxudmFyIHdoaXRlc3BhY2UgPSBmdW5jdGlvbiB3aGl0ZXNwYWNlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBpZiAoL15cXHMrJC8udGVzdCh2YWx1ZSkgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMud2hpdGVzcGFjZSwgcnVsZS5mdWxsRmllbGQpKTtcbiAgfVxufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2tldnZhL3VybC1yZWdleC9ibG9iL21hc3Rlci9pbmRleC5qc1xudmFyIHVybFJlZztcbnZhciBnZXRVcmxSZWdleCA9IChmdW5jdGlvbiAoKSB7XG4gIGlmICh1cmxSZWcpIHtcbiAgICByZXR1cm4gdXJsUmVnO1xuICB9XG5cbiAgdmFyIHdvcmQgPSAnW2EtZkEtRlxcXFxkOl0nO1xuXG4gIHZhciBiID0gZnVuY3Rpb24gYihvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNsdWRlQm91bmRhcmllcyA/IFwiKD86KD88PVxcXFxzfF4pKD89XCIgKyB3b3JkICsgXCIpfCg/PD1cIiArIHdvcmQgKyBcIikoPz1cXFxcc3wkKSlcIiA6ICcnO1xuICB9O1xuXG4gIHZhciB2NCA9ICcoPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKD86XFxcXC4oPzoyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldXFxcXGR8XFxcXGQpKXszfSc7XG4gIHZhciB2NnNlZyA9ICdbYS1mQS1GXFxcXGRdezEsNH0nO1xuICB2YXIgdjYgPSAoXCJcXG4oPzpcXG4oPzpcIiArIHY2c2VnICsgXCI6KXs3fSg/OlwiICsgdjZzZWcgKyBcInw6KXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxOjI6Mzo0OjU6Njo3OjogIDE6MjozOjQ6NTo2Ojc6OFxcbig/OlwiICsgdjZzZWcgKyBcIjopezZ9KD86XCIgKyB2NCArIFwifDpcIiArIHY2c2VnICsgXCJ8Oil8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxOjI6Mzo0OjU6Njo6ICAgIDE6MjozOjQ6NTo2Ojo4ICAgMToyOjM6NDo1OjY6OjggIDE6MjozOjQ6NTo2OjoxLjIuMy40XFxuKD86XCIgKyB2NnNlZyArIFwiOil7NX0oPzo6XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsMn18Oil8ICAgICAgICAgICAgICAgICAgIC8vIDE6MjozOjQ6NTo6ICAgICAgMToyOjM6NDo1Ojo3OjggICAxOjI6Mzo0OjU6OjggICAgMToyOjM6NDo1Ojo3OjEuMi4zLjRcXG4oPzpcIiArIHY2c2VnICsgXCI6KXs0fSg/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsMX06XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsM318Oil8IC8vIDE6MjozOjQ6OiAgICAgICAgMToyOjM6NDo6Njo3OjggICAxOjI6Mzo0Ojo4ICAgICAgMToyOjM6NDo6Njo3OjEuMi4zLjRcXG4oPzpcIiArIHY2c2VnICsgXCI6KXszfSg/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsMn06XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsNH18Oil8IC8vIDE6MjozOjogICAgICAgICAgMToyOjM6OjU6Njo3OjggICAxOjI6Mzo6OCAgICAgICAgMToyOjM6OjU6Njo3OjEuMi4zLjRcXG4oPzpcIiArIHY2c2VnICsgXCI6KXsyfSg/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsM306XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsNX18Oil8IC8vIDE6Mjo6ICAgICAgICAgICAgMToyOjo0OjU6Njo3OjggICAxOjI6OjggICAgICAgICAgMToyOjo0OjU6Njo3OjEuMi4zLjRcXG4oPzpcIiArIHY2c2VnICsgXCI6KXsxfSg/Oig/OjpcIiArIHY2c2VnICsgXCIpezAsNH06XCIgKyB2NCArIFwifCg/OjpcIiArIHY2c2VnICsgXCIpezEsNn18Oil8IC8vIDE6OiAgICAgICAgICAgICAgMTo6Mzo0OjU6Njo3OjggICAxOjo4ICAgICAgICAgICAgMTo6Mzo0OjU6Njo3OjEuMi4zLjRcXG4oPzo6KD86KD86OlwiICsgdjZzZWcgKyBcIil7MCw1fTpcIiArIHY0ICsgXCJ8KD86OlwiICsgdjZzZWcgKyBcIil7MSw3fXw6KSkgICAgICAgICAgICAgLy8gOjoyOjM6NDo1OjY6Nzo4ICA6OjI6Mzo0OjU6Njo3OjggIDo6OCAgICAgICAgICAgICA6OjEuMi4zLjRcXG4pKD86JVswLTlhLXpBLVpdezEsfSk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJWV0aDAgICAgICAgICAgICAlMVxcblwiKS5yZXBsYWNlKC9cXHMqXFwvXFwvLiokL2dtLCAnJykucmVwbGFjZSgvXFxuL2csICcnKS50cmltKCk7IC8vIFByZS1jb21waWxlIG9ubHkgdGhlIGV4YWN0IHJlZ2V4ZXMgYmVjYXVzZSBhZGRpbmcgYSBnbG9iYWwgZmxhZyBtYWtlIHJlZ2V4ZXMgc3RhdGVmdWxcblxuICB2YXIgdjQ2RXhhY3QgPSBuZXcgUmVnRXhwKFwiKD86XlwiICsgdjQgKyBcIiQpfCg/Ol5cIiArIHY2ICsgXCIkKVwiKTtcbiAgdmFyIHY0ZXhhY3QgPSBuZXcgUmVnRXhwKFwiXlwiICsgdjQgKyBcIiRcIik7XG4gIHZhciB2NmV4YWN0ID0gbmV3IFJlZ0V4cChcIl5cIiArIHY2ICsgXCIkXCIpO1xuXG4gIHZhciBpcCA9IGZ1bmN0aW9uIGlwKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmV4YWN0ID8gdjQ2RXhhY3QgOiBuZXcgUmVnRXhwKFwiKD86XCIgKyBiKG9wdGlvbnMpICsgdjQgKyBiKG9wdGlvbnMpICsgXCIpfCg/OlwiICsgYihvcHRpb25zKSArIHY2ICsgYihvcHRpb25zKSArIFwiKVwiLCAnZycpO1xuICB9O1xuXG4gIGlwLnY0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmV4YWN0ID8gdjRleGFjdCA6IG5ldyBSZWdFeHAoXCJcIiArIGIob3B0aW9ucykgKyB2NCArIGIob3B0aW9ucyksICdnJyk7XG4gIH07XG5cbiAgaXAudjYgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuZXhhY3QgPyB2NmV4YWN0IDogbmV3IFJlZ0V4cChcIlwiICsgYihvcHRpb25zKSArIHY2ICsgYihvcHRpb25zKSwgJ2cnKTtcbiAgfTtcblxuICB2YXIgcHJvdG9jb2wgPSBcIig/Oig/OlthLXpdKzopPy8vKVwiO1xuICB2YXIgYXV0aCA9ICcoPzpcXFxcUysoPzo6XFxcXFMqKT9AKT8nO1xuICB2YXIgaXB2NCA9IGlwLnY0KCkuc291cmNlO1xuICB2YXIgaXB2NiA9IGlwLnY2KCkuc291cmNlO1xuICB2YXIgaG9zdCA9IFwiKD86KD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldWy1fXSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspXCI7XG4gIHZhciBkb21haW4gPSBcIig/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmYwLTldLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKlwiO1xuICB2YXIgdGxkID0gXCIoPzpcXFxcLig/OlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmXXsyLH0pKVwiO1xuICB2YXIgcG9ydCA9ICcoPzo6XFxcXGR7Miw1fSk/JztcbiAgdmFyIHBhdGggPSAnKD86Wy8/I11bXlxcXFxzXCJdKik/JztcbiAgdmFyIHJlZ2V4ID0gXCIoPzpcIiArIHByb3RvY29sICsgXCJ8d3d3XFxcXC4pXCIgKyBhdXRoICsgXCIoPzpsb2NhbGhvc3R8XCIgKyBpcHY0ICsgXCJ8XCIgKyBpcHY2ICsgXCJ8XCIgKyBob3N0ICsgZG9tYWluICsgdGxkICsgXCIpXCIgKyBwb3J0ICsgcGF0aDtcbiAgdXJsUmVnID0gbmV3IFJlZ0V4cChcIig/Ol5cIiArIHJlZ2V4ICsgXCIkKVwiLCAnaScpO1xuICByZXR1cm4gdXJsUmVnO1xufSk7XG5cbi8qIGVzbGludCBtYXgtbGVuOjAgKi9cblxudmFyIHBhdHRlcm4kMiA9IHtcbiAgLy8gaHR0cDovL2VtYWlscmVnZXguY29tL1xuICBlbWFpbDogL14oKFtePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSsoXFwuW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XSl8KChbYS16QS1aXFwtMC05XFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXStcXC4pK1thLXpBLVpcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdezIsfSkpJC8sXG4gIC8vIHVybDogbmV3IFJlZ0V4cChcbiAgLy8gICAnXig/IW1haWx0bzopKD86KD86aHR0cHxodHRwc3xmdHApOi8vfC8vKSg/OlxcXFxTKyg/OjpcXFxcUyopP0ApPyg/Oig/Oig/OlsxLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMDFdXFxcXGR8MjJbMC0zXSkoPzpcXFxcLig/OjE/XFxcXGR7MSwyfXwyWzAtNF1cXFxcZHwyNVswLTVdKSl7Mn0oPzpcXFxcLig/OlswLTldXFxcXGQ/fDFcXFxcZFxcXFxkfDJbMC00XVxcXFxkfDI1WzAtNF0pKXwoPzooPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKD86XFxcXC4oPzpbYS16XFxcXHUwMGExLVxcXFx1ZmZmZjAtOV0rLSopKlthLXpcXFxcdTAwYTEtXFxcXHVmZmZmMC05XSspKig/OlxcXFwuKD86W2EtelxcXFx1MDBhMS1cXFxcdWZmZmZdezIsfSkpKXxsb2NhbGhvc3QpKD86OlxcXFxkezIsNX0pPyg/OigvfFxcXFw/fCMpW15cXFxcc10qKT8kJyxcbiAgLy8gICAnaScsXG4gIC8vICksXG4gIGhleDogL14jPyhbYS1mMC05XXs2fXxbYS1mMC05XXszfSkkL2lcbn07XG52YXIgdHlwZXMgPSB7XG4gIGludGVnZXI6IGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZXMubnVtYmVyKHZhbHVlKSAmJiBwYXJzZUludCh2YWx1ZSwgMTApID09PSB2YWx1ZTtcbiAgfSxcbiAgXCJmbG9hdFwiOiBmdW5jdGlvbiBmbG9hdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlcy5udW1iZXIodmFsdWUpICYmICF0eXBlcy5pbnRlZ2VyKHZhbHVlKTtcbiAgfSxcbiAgYXJyYXk6IGZ1bmN0aW9uIGFycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9LFxuICByZWdleHA6IGZ1bmN0aW9uIHJlZ2V4cCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIW5ldyBSZWdFeHAodmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIGRhdGU6IGZ1bmN0aW9uIGRhdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlLmdldFRpbWUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlLmdldE1vbnRoID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS5nZXRZZWFyID09PSAnZnVuY3Rpb24nICYmICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9LFxuICBudW1iZXI6IGZ1bmN0aW9uIG51bWJlcih2YWx1ZSkge1xuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbiAgfSxcbiAgb2JqZWN0OiBmdW5jdGlvbiBvYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhdHlwZXMuYXJyYXkodmFsdWUpO1xuICB9LFxuICBtZXRob2Q6IGZ1bmN0aW9uIG1ldGhvZCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG4gIH0sXG4gIGVtYWlsOiBmdW5jdGlvbiBlbWFpbCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA8PSAzMjAgJiYgISF2YWx1ZS5tYXRjaChwYXR0ZXJuJDIuZW1haWwpO1xuICB9LFxuICB1cmw6IGZ1bmN0aW9uIHVybCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA8PSAyMDQ4ICYmICEhdmFsdWUubWF0Y2goZ2V0VXJsUmVnZXgoKSk7XG4gIH0sXG4gIGhleDogZnVuY3Rpb24gaGV4KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgISF2YWx1ZS5tYXRjaChwYXR0ZXJuJDIuaGV4KTtcbiAgfVxufTtcblxudmFyIHR5cGUkMSA9IGZ1bmN0aW9uIHR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKSB7XG4gIGlmIChydWxlLnJlcXVpcmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXF1aXJlZCQxKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1c3RvbSA9IFsnaW50ZWdlcicsICdmbG9hdCcsICdhcnJheScsICdyZWdleHAnLCAnb2JqZWN0JywgJ21ldGhvZCcsICdlbWFpbCcsICdudW1iZXInLCAnZGF0ZScsICd1cmwnLCAnaGV4J107XG4gIHZhciBydWxlVHlwZSA9IHJ1bGUudHlwZTtcblxuICBpZiAoY3VzdG9tLmluZGV4T2YocnVsZVR5cGUpID4gLTEpIHtcbiAgICBpZiAoIXR5cGVzW3J1bGVUeXBlXSh2YWx1ZSkpIHtcbiAgICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnR5cGVzW3J1bGVUeXBlXSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUudHlwZSkpO1xuICAgIH0gLy8gc3RyYWlnaHQgdHlwZW9mIGNoZWNrXG5cbiAgfSBlbHNlIGlmIChydWxlVHlwZSAmJiB0eXBlb2YgdmFsdWUgIT09IHJ1bGUudHlwZSkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzLnR5cGVzW3J1bGVUeXBlXSwgcnVsZS5mdWxsRmllbGQsIHJ1bGUudHlwZSkpO1xuICB9XG59O1xuXG52YXIgcmFuZ2UgPSBmdW5jdGlvbiByYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbiA9IHR5cGVvZiBydWxlLmxlbiA9PT0gJ251bWJlcic7XG4gIHZhciBtaW4gPSB0eXBlb2YgcnVsZS5taW4gPT09ICdudW1iZXInO1xuICB2YXIgbWF4ID0gdHlwZW9mIHJ1bGUubWF4ID09PSAnbnVtYmVyJzsgLy8g5q2j5YiZ5Yy56YWN56CB54K56IyD5Zu05LuOVSswMTAwMDDkuIDnm7TliLBVKzEwRkZGRueahOaWh+Wtl++8iOihpeWFheW5s+mdolN1cHBsZW1lbnRhcnkgUGxhbmXvvIlcblxuICB2YXIgc3BSZWdleHAgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nO1xuICB2YXIgdmFsID0gdmFsdWU7XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgbnVtID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbiAgdmFyIHN0ciA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gIHZhciBhcnIgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcblxuICBpZiAobnVtKSB7XG4gICAga2V5ID0gJ251bWJlcic7XG4gIH0gZWxzZSBpZiAoc3RyKSB7XG4gICAga2V5ID0gJ3N0cmluZyc7XG4gIH0gZWxzZSBpZiAoYXJyKSB7XG4gICAga2V5ID0gJ2FycmF5JztcbiAgfSAvLyBpZiB0aGUgdmFsdWUgaXMgbm90IG9mIGEgc3VwcG9ydGVkIHR5cGUgZm9yIHJhbmdlIHZhbGlkYXRpb25cbiAgLy8gdGhlIHZhbGlkYXRpb24gcnVsZSBydWxlIHNob3VsZCB1c2UgdGhlXG4gIC8vIHR5cGUgcHJvcGVydHkgdG8gYWxzbyB0ZXN0IGZvciBhIHBhcnRpY3VsYXIgdHlwZVxuXG5cbiAgaWYgKCFrZXkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoYXJyKSB7XG4gICAgdmFsID0gdmFsdWUubGVuZ3RoO1xuICB9XG5cbiAgaWYgKHN0cikge1xuICAgIC8vIOWkhOeQhueggeeCueWkp+S6jlUrMDEwMDAw55qE5paH5a2XbGVuZ3Ro5bGe5oCn5LiN5YeG56Gu55qEYnVn77yM5aaCXCLwoK638KCut/CgrrdcIi5sZW5naHQgIT09IDNcbiAgICB2YWwgPSB2YWx1ZS5yZXBsYWNlKHNwUmVnZXhwLCAnXycpLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChsZW4pIHtcbiAgICBpZiAodmFsICE9PSBydWxlLmxlbikge1xuICAgICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXNba2V5XS5sZW4sIHJ1bGUuZnVsbEZpZWxkLCBydWxlLmxlbikpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChtaW4gJiYgIW1heCAmJiB2YWwgPCBydWxlLm1pbikge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ubWluLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5taW4pKTtcbiAgfSBlbHNlIGlmIChtYXggJiYgIW1pbiAmJiB2YWwgPiBydWxlLm1heCkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW2tleV0ubWF4LCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5tYXgpKTtcbiAgfSBlbHNlIGlmIChtaW4gJiYgbWF4ICYmICh2YWwgPCBydWxlLm1pbiB8fCB2YWwgPiBydWxlLm1heCkpIHtcbiAgICBlcnJvcnMucHVzaChmb3JtYXQob3B0aW9ucy5tZXNzYWdlc1trZXldLnJhbmdlLCBydWxlLmZ1bGxGaWVsZCwgcnVsZS5taW4sIHJ1bGUubWF4KSk7XG4gIH1cbn07XG5cbnZhciBFTlVNJDEgPSAnZW51bSc7XG5cbnZhciBlbnVtZXJhYmxlJDEgPSBmdW5jdGlvbiBlbnVtZXJhYmxlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucykge1xuICBydWxlW0VOVU0kMV0gPSBBcnJheS5pc0FycmF5KHJ1bGVbRU5VTSQxXSkgPyBydWxlW0VOVU0kMV0gOiBbXTtcblxuICBpZiAocnVsZVtFTlVNJDFdLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgIGVycm9ycy5wdXNoKGZvcm1hdChvcHRpb25zLm1lc3NhZ2VzW0VOVU0kMV0sIHJ1bGUuZnVsbEZpZWxkLCBydWxlW0VOVU0kMV0uam9pbignLCAnKSkpO1xuICB9XG59O1xuXG52YXIgcGF0dGVybiQxID0gZnVuY3Rpb24gcGF0dGVybihydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpIHtcbiAgaWYgKHJ1bGUucGF0dGVybikge1xuICAgIGlmIChydWxlLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIGlmIGEgUmVnRXhwIGluc3RhbmNlIGlzIHBhc3NlZCwgcmVzZXQgYGxhc3RJbmRleGAgaW4gY2FzZSBpdHMgYGdsb2JhbGBcbiAgICAgIC8vIGZsYWcgaXMgYWNjaWRlbnRhbGx5IHNldCB0byBgdHJ1ZWAsIHdoaWNoIGluIGEgdmFsaWRhdGlvbiBzY2VuYXJpb1xuICAgICAgLy8gaXMgbm90IG5lY2Vzc2FyeSBhbmQgdGhlIHJlc3VsdCBtaWdodCBiZSBtaXNsZWFkaW5nXG4gICAgICBydWxlLnBhdHRlcm4ubGFzdEluZGV4ID0gMDtcblxuICAgICAgaWYgKCFydWxlLnBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMucGF0dGVybi5taXNtYXRjaCwgcnVsZS5mdWxsRmllbGQsIHZhbHVlLCBydWxlLnBhdHRlcm4pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBydWxlLnBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgX3BhdHRlcm4gPSBuZXcgUmVnRXhwKHJ1bGUucGF0dGVybik7XG5cbiAgICAgIGlmICghX3BhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMucGF0dGVybi5taXNtYXRjaCwgcnVsZS5mdWxsRmllbGQsIHZhbHVlLCBydWxlLnBhdHRlcm4pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnZhciBydWxlcyA9IHtcbiAgcmVxdWlyZWQ6IHJlcXVpcmVkJDEsXG4gIHdoaXRlc3BhY2U6IHdoaXRlc3BhY2UsXG4gIHR5cGU6IHR5cGUkMSxcbiAgcmFuZ2U6IHJhbmdlLFxuICBcImVudW1cIjogZW51bWVyYWJsZSQxLFxuICBwYXR0ZXJuOiBwYXR0ZXJuJDFcbn07XG5cbnZhciBzdHJpbmcgPSBmdW5jdGlvbiBzdHJpbmcocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlLCAnc3RyaW5nJykgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgJ3N0cmluZycpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgICAgcnVsZXMucmFuZ2UocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnBhdHRlcm4ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgICAgaWYgKHJ1bGUud2hpdGVzcGFjZSA9PT0gdHJ1ZSkge1xuICAgICAgICBydWxlcy53aGl0ZXNwYWNlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBtZXRob2QgPSBmdW5jdGlvbiBtZXRob2QocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBudW1iZXIgPSBmdW5jdGlvbiBudW1iZXIocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgX2Jvb2xlYW4gPSBmdW5jdGlvbiBfYm9vbGVhbihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHJlZ2V4cCA9IGZ1bmN0aW9uIHJlZ2V4cChydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUpKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBpbnRlZ2VyID0gZnVuY3Rpb24gaW50ZWdlcihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBmbG9hdEZuID0gZnVuY3Rpb24gZmxvYXRGbihydWxlLCB2YWx1ZSwgY2FsbGJhY2ssIHNvdXJjZSwgb3B0aW9ucykge1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bGVzLnR5cGUocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBhcnJheSA9IGZ1bmN0aW9uIGFycmF5KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCAnYXJyYXknKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICBydWxlcy5yYW5nZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgb2JqZWN0ID0gZnVuY3Rpb24gb2JqZWN0KHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXMudHlwZShydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgRU5VTSA9ICdlbnVtJztcblxudmFyIGVudW1lcmFibGUgPSBmdW5jdGlvbiBlbnVtZXJhYmxlKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVsZXNbRU5VTV0ocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBjYWxsYmFjayhlcnJvcnMpO1xufTtcblxudmFyIHBhdHRlcm4gPSBmdW5jdGlvbiBwYXR0ZXJuKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHZhbGlkYXRlID0gcnVsZS5yZXF1aXJlZCB8fCAhcnVsZS5yZXF1aXJlZCAmJiBzb3VyY2UuaGFzT3duUHJvcGVydHkocnVsZS5maWVsZCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ3N0cmluZycpICYmICFydWxlLnJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBydWxlcy5yZXF1aXJlZChydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpc0VtcHR5VmFsdWUodmFsdWUsICdzdHJpbmcnKSkge1xuICAgICAgcnVsZXMucGF0dGVybihydWxlLCB2YWx1ZSwgc291cmNlLCBlcnJvcnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgZGF0ZSA9IGZ1bmN0aW9uIGRhdGUocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgLy8gY29uc29sZS5sb2coJ2ludGVnZXIgcnVsZSBjYWxsZWQgJWonLCBydWxlKTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTsgLy8gY29uc29sZS5sb2coJ3ZhbGlkYXRlIG9uICVzIHZhbHVlJywgdmFsdWUpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsICdkYXRlJykgJiYgIXJ1bGUucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICBpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgJ2RhdGUnKSkge1xuICAgICAgdmFyIGRhdGVPYmplY3Q7XG5cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgZGF0ZU9iamVjdCA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0ZU9iamVjdCA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcnVsZXMudHlwZShydWxlLCBkYXRlT2JqZWN0LCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG5cbiAgICAgIGlmIChkYXRlT2JqZWN0KSB7XG4gICAgICAgIHJ1bGVzLnJhbmdlKHJ1bGUsIGRhdGVPYmplY3QuZ2V0VGltZSgpLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciByZXF1aXJlZCA9IGZ1bmN0aW9uIHJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaywgc291cmNlLCBvcHRpb25zKSB7XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgdmFyIHR5cGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdhcnJheScgOiB0eXBlb2YgdmFsdWU7XG4gIHJ1bGVzLnJlcXVpcmVkKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucywgdHlwZSk7XG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgdHlwZSA9IGZ1bmN0aW9uIHR5cGUocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIHJ1bGVUeXBlID0gcnVsZS50eXBlO1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZGF0ZSA9IHJ1bGUucmVxdWlyZWQgfHwgIXJ1bGUucmVxdWlyZWQgJiYgc291cmNlLmhhc093blByb3BlcnR5KHJ1bGUuZmllbGQpO1xuXG4gIGlmICh2YWxpZGF0ZSkge1xuICAgIGlmIChpc0VtcHR5VmFsdWUodmFsdWUsIHJ1bGVUeXBlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zLCBydWxlVHlwZSk7XG5cbiAgICBpZiAoIWlzRW1wdHlWYWx1ZSh2YWx1ZSwgcnVsZVR5cGUpKSB7XG4gICAgICBydWxlcy50eXBlKHJ1bGUsIHZhbHVlLCBzb3VyY2UsIGVycm9ycywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soZXJyb3JzKTtcbn07XG5cbnZhciBhbnkgPSBmdW5jdGlvbiBhbnkocnVsZSwgdmFsdWUsIGNhbGxiYWNrLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWRhdGUgPSBydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShydWxlLmZpZWxkKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSAmJiAhcnVsZS5yZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcnVsZXMucmVxdWlyZWQocnVsZSwgdmFsdWUsIHNvdXJjZSwgZXJyb3JzLCBvcHRpb25zKTtcbiAgfVxuXG4gIGNhbGxiYWNrKGVycm9ycyk7XG59O1xuXG52YXIgdmFsaWRhdG9ycyA9IHtcbiAgc3RyaW5nOiBzdHJpbmcsXG4gIG1ldGhvZDogbWV0aG9kLFxuICBudW1iZXI6IG51bWJlcixcbiAgXCJib29sZWFuXCI6IF9ib29sZWFuLFxuICByZWdleHA6IHJlZ2V4cCxcbiAgaW50ZWdlcjogaW50ZWdlcixcbiAgXCJmbG9hdFwiOiBmbG9hdEZuLFxuICBhcnJheTogYXJyYXksXG4gIG9iamVjdDogb2JqZWN0LFxuICBcImVudW1cIjogZW51bWVyYWJsZSxcbiAgcGF0dGVybjogcGF0dGVybixcbiAgZGF0ZTogZGF0ZSxcbiAgdXJsOiB0eXBlLFxuICBoZXg6IHR5cGUsXG4gIGVtYWlsOiB0eXBlLFxuICByZXF1aXJlZDogcmVxdWlyZWQsXG4gIGFueTogYW55XG59O1xuXG5mdW5jdGlvbiBuZXdNZXNzYWdlcygpIHtcbiAgcmV0dXJuIHtcbiAgICBcImRlZmF1bHRcIjogJ1ZhbGlkYXRpb24gZXJyb3Igb24gZmllbGQgJXMnLFxuICAgIHJlcXVpcmVkOiAnJXMgaXMgcmVxdWlyZWQnLFxuICAgIFwiZW51bVwiOiAnJXMgbXVzdCBiZSBvbmUgb2YgJXMnLFxuICAgIHdoaXRlc3BhY2U6ICclcyBjYW5ub3QgYmUgZW1wdHknLFxuICAgIGRhdGU6IHtcbiAgICAgIGZvcm1hdDogJyVzIGRhdGUgJXMgaXMgaW52YWxpZCBmb3IgZm9ybWF0ICVzJyxcbiAgICAgIHBhcnNlOiAnJXMgZGF0ZSBjb3VsZCBub3QgYmUgcGFyc2VkLCAlcyBpcyBpbnZhbGlkICcsXG4gICAgICBpbnZhbGlkOiAnJXMgZGF0ZSAlcyBpcyBpbnZhbGlkJ1xuICAgIH0sXG4gICAgdHlwZXM6IHtcbiAgICAgIHN0cmluZzogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIG1ldGhvZDogJyVzIGlzIG5vdCBhICVzIChmdW5jdGlvbiknLFxuICAgICAgYXJyYXk6ICclcyBpcyBub3QgYW4gJXMnLFxuICAgICAgb2JqZWN0OiAnJXMgaXMgbm90IGFuICVzJyxcbiAgICAgIG51bWJlcjogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIGRhdGU6ICclcyBpcyBub3QgYSAlcycsXG4gICAgICBcImJvb2xlYW5cIjogJyVzIGlzIG5vdCBhICVzJyxcbiAgICAgIGludGVnZXI6ICclcyBpcyBub3QgYW4gJXMnLFxuICAgICAgXCJmbG9hdFwiOiAnJXMgaXMgbm90IGEgJXMnLFxuICAgICAgcmVnZXhwOiAnJXMgaXMgbm90IGEgdmFsaWQgJXMnLFxuICAgICAgZW1haWw6ICclcyBpcyBub3QgYSB2YWxpZCAlcycsXG4gICAgICB1cmw6ICclcyBpcyBub3QgYSB2YWxpZCAlcycsXG4gICAgICBoZXg6ICclcyBpcyBub3QgYSB2YWxpZCAlcydcbiAgICB9LFxuICAgIHN0cmluZzoge1xuICAgICAgbGVuOiAnJXMgbXVzdCBiZSBleGFjdGx5ICVzIGNoYXJhY3RlcnMnLFxuICAgICAgbWluOiAnJXMgbXVzdCBiZSBhdCBsZWFzdCAlcyBjaGFyYWN0ZXJzJyxcbiAgICAgIG1heDogJyVzIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAlcyBjaGFyYWN0ZXJzJyxcbiAgICAgIHJhbmdlOiAnJXMgbXVzdCBiZSBiZXR3ZWVuICVzIGFuZCAlcyBjaGFyYWN0ZXJzJ1xuICAgIH0sXG4gICAgbnVtYmVyOiB7XG4gICAgICBsZW46ICclcyBtdXN0IGVxdWFsICVzJyxcbiAgICAgIG1pbjogJyVzIGNhbm5vdCBiZSBsZXNzIHRoYW4gJXMnLFxuICAgICAgbWF4OiAnJXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAlcycsXG4gICAgICByYW5nZTogJyVzIG11c3QgYmUgYmV0d2VlbiAlcyBhbmQgJXMnXG4gICAgfSxcbiAgICBhcnJheToge1xuICAgICAgbGVuOiAnJXMgbXVzdCBiZSBleGFjdGx5ICVzIGluIGxlbmd0aCcsXG4gICAgICBtaW46ICclcyBjYW5ub3QgYmUgbGVzcyB0aGFuICVzIGluIGxlbmd0aCcsXG4gICAgICBtYXg6ICclcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICVzIGluIGxlbmd0aCcsXG4gICAgICByYW5nZTogJyVzIG11c3QgYmUgYmV0d2VlbiAlcyBhbmQgJXMgaW4gbGVuZ3RoJ1xuICAgIH0sXG4gICAgcGF0dGVybjoge1xuICAgICAgbWlzbWF0Y2g6ICclcyB2YWx1ZSAlcyBkb2VzIG5vdCBtYXRjaCBwYXR0ZXJuICVzJ1xuICAgIH0sXG4gICAgY2xvbmU6IGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgdmFyIGNsb25lZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcykpO1xuICAgICAgY2xvbmVkLmNsb25lID0gdGhpcy5jbG9uZTtcbiAgICAgIHJldHVybiBjbG9uZWQ7XG4gICAgfVxuICB9O1xufVxudmFyIG1lc3NhZ2VzID0gbmV3TWVzc2FnZXMoKTtcblxuLyoqXG4gKiAgRW5jYXBzdWxhdGVzIGEgdmFsaWRhdGlvbiBzY2hlbWEuXG4gKlxuICogIEBwYXJhbSBkZXNjcmlwdG9yIEFuIG9iamVjdCBkZWNsYXJpbmcgdmFsaWRhdGlvbiBydWxlc1xuICogIGZvciB0aGlzIHNjaGVtYS5cbiAqL1xuXG52YXIgU2NoZW1hID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBTdGF0aWMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gSW5zdGFuY2UgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIGZ1bmN0aW9uIFNjaGVtYShkZXNjcmlwdG9yKSB7XG4gICAgdGhpcy5ydWxlcyA9IG51bGw7XG4gICAgdGhpcy5fbWVzc2FnZXMgPSBtZXNzYWdlcztcbiAgICB0aGlzLmRlZmluZShkZXNjcmlwdG9yKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTY2hlbWEucHJvdG90eXBlO1xuXG4gIF9wcm90by5kZWZpbmUgPSBmdW5jdGlvbiBkZWZpbmUocnVsZXMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCFydWxlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29uZmlndXJlIGEgc2NoZW1hIHdpdGggbm8gcnVsZXMnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJ1bGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJ1bGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdWxlcyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhydWxlcykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGl0ZW0gPSBydWxlc1tuYW1lXTtcbiAgICAgIF90aGlzLnJ1bGVzW25hbWVdID0gQXJyYXkuaXNBcnJheShpdGVtKSA/IGl0ZW0gOiBbaXRlbV07XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLm1lc3NhZ2VzID0gZnVuY3Rpb24gbWVzc2FnZXMoX21lc3NhZ2VzKSB7XG4gICAgaWYgKF9tZXNzYWdlcykge1xuICAgICAgdGhpcy5fbWVzc2FnZXMgPSBkZWVwTWVyZ2UobmV3TWVzc2FnZXMoKSwgX21lc3NhZ2VzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZXM7XG4gIH07XG5cbiAgX3Byb3RvLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoc291cmNlXywgbywgb2MpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmIChvID09PSB2b2lkIDApIHtcbiAgICAgIG8gPSB7fTtcbiAgICB9XG5cbiAgICBpZiAob2MgPT09IHZvaWQgMCkge1xuICAgICAgb2MgPSBmdW5jdGlvbiBvYygpIHt9O1xuICAgIH1cblxuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VfO1xuICAgIHZhciBvcHRpb25zID0gbztcbiAgICB2YXIgY2FsbGJhY2sgPSBvYztcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5ydWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLnJ1bGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBzb3VyY2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNvdXJjZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcGxldGUocmVzdWx0cykge1xuICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgdmFyIGZpZWxkcyA9IHt9O1xuXG4gICAgICBmdW5jdGlvbiBhZGQoZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgICAgIHZhciBfZXJyb3JzO1xuXG4gICAgICAgICAgZXJyb3JzID0gKF9lcnJvcnMgPSBlcnJvcnMpLmNvbmNhdC5hcHBseShfZXJyb3JzLCBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWRkKHJlc3VsdHNbaV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgc291cmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkcyA9IGNvbnZlcnRGaWVsZHNFcnJvcihlcnJvcnMpO1xuICAgICAgICBjYWxsYmFjayhlcnJvcnMsIGZpZWxkcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWVzc2FnZXMpIHtcbiAgICAgIHZhciBtZXNzYWdlcyQxID0gdGhpcy5tZXNzYWdlcygpO1xuXG4gICAgICBpZiAobWVzc2FnZXMkMSA9PT0gbWVzc2FnZXMpIHtcbiAgICAgICAgbWVzc2FnZXMkMSA9IG5ld01lc3NhZ2VzKCk7XG4gICAgICB9XG5cbiAgICAgIGRlZXBNZXJnZShtZXNzYWdlcyQxLCBvcHRpb25zLm1lc3NhZ2VzKTtcbiAgICAgIG9wdGlvbnMubWVzc2FnZXMgPSBtZXNzYWdlcyQxO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zLm1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcygpO1xuICAgIH1cblxuICAgIHZhciBzZXJpZXMgPSB7fTtcbiAgICB2YXIga2V5cyA9IG9wdGlvbnMua2V5cyB8fCBPYmplY3Qua2V5cyh0aGlzLnJ1bGVzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKHopIHtcbiAgICAgIHZhciBhcnIgPSBfdGhpczIucnVsZXNbel07XG4gICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vbel07XG4gICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiAocikge1xuICAgICAgICB2YXIgcnVsZSA9IHI7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBydWxlLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlmIChzb3VyY2UgPT09IHNvdXJjZV8pIHtcbiAgICAgICAgICAgIHNvdXJjZSA9IF9leHRlbmRzKHt9LCBzb3VyY2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhbHVlID0gc291cmNlW3pdID0gcnVsZS50cmFuc2Zvcm0odmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcnVsZSA9IHtcbiAgICAgICAgICAgIHZhbGlkYXRvcjogcnVsZVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcnVsZSA9IF9leHRlbmRzKHt9LCBydWxlKTtcbiAgICAgICAgfSAvLyBGaWxsIHZhbGlkYXRvci4gU2tpcCBpZiBub3RoaW5nIG5lZWQgdG8gdmFsaWRhdGVcblxuXG4gICAgICAgIHJ1bGUudmFsaWRhdG9yID0gX3RoaXMyLmdldFZhbGlkYXRpb25NZXRob2QocnVsZSk7XG5cbiAgICAgICAgaWYgKCFydWxlLnZhbGlkYXRvcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bGUuZmllbGQgPSB6O1xuICAgICAgICBydWxlLmZ1bGxGaWVsZCA9IHJ1bGUuZnVsbEZpZWxkIHx8IHo7XG4gICAgICAgIHJ1bGUudHlwZSA9IF90aGlzMi5nZXRUeXBlKHJ1bGUpO1xuICAgICAgICBzZXJpZXNbel0gPSBzZXJpZXNbel0gfHwgW107XG4gICAgICAgIHNlcmllc1t6XS5wdXNoKHtcbiAgICAgICAgICBydWxlOiBydWxlLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICBmaWVsZDogelxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHZhciBlcnJvckZpZWxkcyA9IHt9O1xuICAgIHJldHVybiBhc3luY01hcChzZXJpZXMsIG9wdGlvbnMsIGZ1bmN0aW9uIChkYXRhLCBkb0l0KSB7XG4gICAgICB2YXIgcnVsZSA9IGRhdGEucnVsZTtcbiAgICAgIHZhciBkZWVwID0gKHJ1bGUudHlwZSA9PT0gJ29iamVjdCcgfHwgcnVsZS50eXBlID09PSAnYXJyYXknKSAmJiAodHlwZW9mIHJ1bGUuZmllbGRzID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcnVsZS5kZWZhdWx0RmllbGQgPT09ICdvYmplY3QnKTtcbiAgICAgIGRlZXAgPSBkZWVwICYmIChydWxlLnJlcXVpcmVkIHx8ICFydWxlLnJlcXVpcmVkICYmIGRhdGEudmFsdWUpO1xuICAgICAgcnVsZS5maWVsZCA9IGRhdGEuZmllbGQ7XG5cbiAgICAgIGZ1bmN0aW9uIGFkZEZ1bGxGaWVsZChrZXksIHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHNjaGVtYSwge1xuICAgICAgICAgIGZ1bGxGaWVsZDogcnVsZS5mdWxsRmllbGQgKyBcIi5cIiArIGtleSxcbiAgICAgICAgICBmdWxsRmllbGRzOiBydWxlLmZ1bGxGaWVsZHMgPyBbXS5jb25jYXQocnVsZS5mdWxsRmllbGRzLCBba2V5XSkgOiBba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY2IoZSkge1xuICAgICAgICBpZiAoZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGVycm9yTGlzdCA9IEFycmF5LmlzQXJyYXkoZSkgPyBlIDogW2VdO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5zdXBwcmVzc1dhcm5pbmcgJiYgZXJyb3JMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgIFNjaGVtYS53YXJuaW5nKCdhc3luYy12YWxpZGF0b3I6JywgZXJyb3JMaXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvckxpc3QubGVuZ3RoICYmIHJ1bGUubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZXJyb3JMaXN0ID0gW10uY29uY2F0KHJ1bGUubWVzc2FnZSk7XG4gICAgICAgIH0gLy8gRmlsbCBlcnJvciBpbmZvXG5cblxuICAgICAgICB2YXIgZmlsbGVkRXJyb3JzID0gZXJyb3JMaXN0Lm1hcChjb21wbGVtZW50RXJyb3IocnVsZSwgc291cmNlKSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZmlyc3QgJiYgZmlsbGVkRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgIGVycm9yRmllbGRzW3J1bGUuZmllbGRdID0gMTtcbiAgICAgICAgICByZXR1cm4gZG9JdChmaWxsZWRFcnJvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkZWVwKSB7XG4gICAgICAgICAgZG9JdChmaWxsZWRFcnJvcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIHJ1bGUgaXMgcmVxdWlyZWQgYnV0IHRoZSB0YXJnZXQgb2JqZWN0XG4gICAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgZmFpbCBhdCB0aGUgcnVsZSBsZXZlbCBhbmQgZG9uJ3RcbiAgICAgICAgICAvLyBnbyBkZWVwZXJcbiAgICAgICAgICBpZiAocnVsZS5yZXF1aXJlZCAmJiAhZGF0YS52YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHJ1bGUubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGZpbGxlZEVycm9ycyA9IFtdLmNvbmNhdChydWxlLm1lc3NhZ2UpLm1hcChjb21wbGVtZW50RXJyb3IocnVsZSwgc291cmNlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZXJyb3IpIHtcbiAgICAgICAgICAgICAgZmlsbGVkRXJyb3JzID0gW29wdGlvbnMuZXJyb3IocnVsZSwgZm9ybWF0KG9wdGlvbnMubWVzc2FnZXMucmVxdWlyZWQsIHJ1bGUuZmllbGQpKV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkb0l0KGZpbGxlZEVycm9ycyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGZpZWxkc1NjaGVtYSA9IHt9O1xuXG4gICAgICAgICAgaWYgKHJ1bGUuZGVmYXVsdEZpZWxkKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhLnZhbHVlKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICBmaWVsZHNTY2hlbWFba2V5XSA9IHJ1bGUuZGVmYXVsdEZpZWxkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmllbGRzU2NoZW1hID0gX2V4dGVuZHMoe30sIGZpZWxkc1NjaGVtYSwgZGF0YS5ydWxlLmZpZWxkcyk7XG4gICAgICAgICAgdmFyIHBhcmVkRmllbGRzU2NoZW1hID0ge307XG4gICAgICAgICAgT2JqZWN0LmtleXMoZmllbGRzU2NoZW1hKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICAgICAgdmFyIGZpZWxkU2NoZW1hID0gZmllbGRzU2NoZW1hW2ZpZWxkXTtcbiAgICAgICAgICAgIHZhciBmaWVsZFNjaGVtYUxpc3QgPSBBcnJheS5pc0FycmF5KGZpZWxkU2NoZW1hKSA/IGZpZWxkU2NoZW1hIDogW2ZpZWxkU2NoZW1hXTtcbiAgICAgICAgICAgIHBhcmVkRmllbGRzU2NoZW1hW2ZpZWxkXSA9IGZpZWxkU2NoZW1hTGlzdC5tYXAoYWRkRnVsbEZpZWxkLmJpbmQobnVsbCwgZmllbGQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgc2NoZW1hID0gbmV3IFNjaGVtYShwYXJlZEZpZWxkc1NjaGVtYSk7XG4gICAgICAgICAgc2NoZW1hLm1lc3NhZ2VzKG9wdGlvbnMubWVzc2FnZXMpO1xuXG4gICAgICAgICAgaWYgKGRhdGEucnVsZS5vcHRpb25zKSB7XG4gICAgICAgICAgICBkYXRhLnJ1bGUub3B0aW9ucy5tZXNzYWdlcyA9IG9wdGlvbnMubWVzc2FnZXM7XG4gICAgICAgICAgICBkYXRhLnJ1bGUub3B0aW9ucy5lcnJvciA9IG9wdGlvbnMuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZW1hLnZhbGlkYXRlKGRhdGEudmFsdWUsIGRhdGEucnVsZS5vcHRpb25zIHx8IG9wdGlvbnMsIGZ1bmN0aW9uIChlcnJzKSB7XG4gICAgICAgICAgICB2YXIgZmluYWxFcnJvcnMgPSBbXTtcblxuICAgICAgICAgICAgaWYgKGZpbGxlZEVycm9ycyAmJiBmaWxsZWRFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGZpbmFsRXJyb3JzLnB1c2guYXBwbHkoZmluYWxFcnJvcnMsIGZpbGxlZEVycm9ycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnJzICYmIGVycnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGZpbmFsRXJyb3JzLnB1c2guYXBwbHkoZmluYWxFcnJvcnMsIGVycnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb0l0KGZpbmFsRXJyb3JzLmxlbmd0aCA/IGZpbmFsRXJyb3JzIDogbnVsbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHJlcztcblxuICAgICAgaWYgKHJ1bGUuYXN5bmNWYWxpZGF0b3IpIHtcbiAgICAgICAgcmVzID0gcnVsZS5hc3luY1ZhbGlkYXRvcihydWxlLCBkYXRhLnZhbHVlLCBjYiwgZGF0YS5zb3VyY2UsIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmIChydWxlLnZhbGlkYXRvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlcyA9IHJ1bGUudmFsaWRhdG9yKHJ1bGUsIGRhdGEudmFsdWUsIGNiLCBkYXRhLnNvdXJjZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvciA9PSBudWxsID8gdm9pZCAwIDogY29uc29sZS5lcnJvcihlcnJvcik7IC8vIHJldGhyb3cgdG8gcmVwb3J0IGVycm9yXG5cbiAgICAgICAgICBpZiAoIW9wdGlvbnMuc3VwcHJlc3NWYWxpZGF0b3JFcnJvcikge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzID09PSB0cnVlKSB7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgY2IodHlwZW9mIHJ1bGUubWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyA/IHJ1bGUubWVzc2FnZShydWxlLmZ1bGxGaWVsZCB8fCBydWxlLmZpZWxkKSA6IHJ1bGUubWVzc2FnZSB8fCAocnVsZS5mdWxsRmllbGQgfHwgcnVsZS5maWVsZCkgKyBcIiBmYWlsc1wiKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGNiKHJlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBjYihyZXMubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlcyAmJiByZXMudGhlbikge1xuICAgICAgICByZXMudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgY29tcGxldGUocmVzdWx0cyk7XG4gICAgfSwgc291cmNlKTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0VHlwZSA9IGZ1bmN0aW9uIGdldFR5cGUocnVsZSkge1xuICAgIGlmIChydWxlLnR5cGUgPT09IHVuZGVmaW5lZCAmJiBydWxlLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIHJ1bGUudHlwZSA9ICdwYXR0ZXJuJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJ1bGUudmFsaWRhdG9yICE9PSAnZnVuY3Rpb24nICYmIHJ1bGUudHlwZSAmJiAhdmFsaWRhdG9ycy5oYXNPd25Qcm9wZXJ0eShydWxlLnR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZm9ybWF0KCdVbmtub3duIHJ1bGUgdHlwZSAlcycsIHJ1bGUudHlwZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBydWxlLnR5cGUgfHwgJ3N0cmluZyc7XG4gIH07XG5cbiAgX3Byb3RvLmdldFZhbGlkYXRpb25NZXRob2QgPSBmdW5jdGlvbiBnZXRWYWxpZGF0aW9uTWV0aG9kKHJ1bGUpIHtcbiAgICBpZiAodHlwZW9mIHJ1bGUudmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcnVsZS52YWxpZGF0b3I7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhydWxlKTtcbiAgICB2YXIgbWVzc2FnZUluZGV4ID0ga2V5cy5pbmRleE9mKCdtZXNzYWdlJyk7XG5cbiAgICBpZiAobWVzc2FnZUluZGV4ICE9PSAtMSkge1xuICAgICAga2V5cy5zcGxpY2UobWVzc2FnZUluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDEgJiYga2V5c1swXSA9PT0gJ3JlcXVpcmVkJykge1xuICAgICAgcmV0dXJuIHZhbGlkYXRvcnMucmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvcnNbdGhpcy5nZXRUeXBlKHJ1bGUpXSB8fCB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIFNjaGVtYTtcbn0oKTtcblxuU2NoZW1hLnJlZ2lzdGVyID0gZnVuY3Rpb24gcmVnaXN0ZXIodHlwZSwgdmFsaWRhdG9yKSB7XG4gIGlmICh0eXBlb2YgdmFsaWRhdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVnaXN0ZXIgYSB2YWxpZGF0b3IgYnkgdHlwZSwgdmFsaWRhdG9yIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICB2YWxpZGF0b3JzW3R5cGVdID0gdmFsaWRhdG9yO1xufTtcblxuU2NoZW1hLndhcm5pbmcgPSB3YXJuaW5nO1xuU2NoZW1hLm1lc3NhZ2VzID0gbWVzc2FnZXM7XG5TY2hlbWEudmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7XG5cbmV4cG9ydCB7IFNjaGVtYSBhcyBkZWZhdWx0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWVkaXRhYmxlXCI+XG4gICAgPGRpdiB2LWlmPVwiIWVkaXRpbmcgfHwgZGlzYWJsZWRcIiBjbGFzcz1cImZzLWVkaXRhYmxlLWlubmVyIGZzLWVkaXRhYmxlLXBvaW50ZXJcIiB2LWJpbmQ9XCJhY3RpdmVUcmlnZ2VyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtZWRpdGFibGUtaW5wdXRcIj5cbiAgICAgICAgPGRpdiB2LWlmPVwiZGlydHlcIiBjbGFzcz1cImZzLWVkaXRhYmxlLWRpcnR5XCIgLz5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHYtaWY9XCJ0cmlnZ2VyICYmICFkaXNhYmxlZFwiIGNsYXNzPVwiZnMtZWRpdGFibGUtYWN0aW9uIGZzLWVkaXRhYmxlLWljb25cIj5cbiAgICAgICAgPGZzLWljb24gOmljb249XCJ1aS5pY29ucy5lZGl0XCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgdi1lbHNlIGNsYXNzPVwiZnMtZWRpdGFibGUtaW5uZXJcIiA6Y2xhc3M9XCJ7ICdmcy12YWxpZGF0ZS1lcnJvcic6IGhhc0Vycm9yKCkgfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWVkaXRhYmxlLWlucHV0XCI+XG4gICAgICAgIDxzbG90IG5hbWU9XCJlZGl0XCI+PC9zbG90PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtZWRpdGFibGUtYWN0aW9uXCI+XG4gICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkudG9vbHRpcC5uYW1lXCI+XG4gICAgICAgICAgPHRlbXBsYXRlICNbdWkudG9vbHRpcC5jb250ZW50XT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3ItaWNvblwiPlxuICAgICAgICAgICAgICB7eyBnZXRWYWxpZGF0ZUVycm9yTWVzc2FnZSgpIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8dGVtcGxhdGUgI1t1aS50b29sdGlwLnRyaWdnZXJdPlxuICAgICAgICAgICAgPGZzLWljb24gOmNsYXNzPVwieyBoaWRkZW46ICFoYXNFcnJvcigpLCAnZXJyb3ItaWNvbic6IHRydWUgfVwiIHNpemU9XCJtaW5pXCIgOmljb249XCJ1aS5pY29ucy5pbmZvXCIgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzaG93QWN0aW9uXCI+XG4gICAgICAgICAgPGZzLWljb24gdi1pZj1cImxvYWRpbmdcIiBzaXplPVwibWluaVwiIDpzcGluPVwidHJ1ZVwiIDppY29uPVwidWkuaWNvbnMucmVmcmVzaFwiIC8+XG4gICAgICAgICAgPGZzLWljb24gdi1lbHNlIHNpemU9XCJtaW5pXCIgOmljb249XCJ1aS5pY29ucy5jaGVja1wiIEBjbGljaz1cImRvU3VibWl0XCIgLz5cbiAgICAgICAgICA8ZnMtaWNvbiA6Y2xhc3M9XCJ7IGhpZGRlbjogbG9hZGluZyB9XCIgc2l6ZT1cIm1pbmlcIiA6aWNvbj1cInVpLmljb25zLmNsb3NlXCIgQGNsaWNrPVwiZG9DYW5jZWxcIiAvPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIkBmYXN0LWNydWQvdWktaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBjb21wdXRlZCB9IGZyb20gXCJ2dWVcIjtcblxudHlwZSBGc0VkaXRhYmxlUHJvcHMgPSB7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgZWRpdGluZzogYm9vbGVhbjtcbiAgZGlydHk/OiBib29sZWFuO1xuICB0cmlnZ2VyPzogXCJvbkNsaWNrXCIgfCBcIm9uRGJDbGlja1wiIHwgZmFsc2U7XG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICBzaG93QWN0aW9uPzogYm9vbGVhbjtcbiAgdmFsaWRhdGVFcnJvcnM/OiBhbnlbXTtcbn07XG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhkZWZpbmVQcm9wczxGc0VkaXRhYmxlUHJvcHM+KCksIHtcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBlZGl0aW5nOiBmYWxzZSxcbiAgZGlydHk6IGZhbHNlLFxuICBsb2FkaW5nOiBmYWxzZSxcbiAgc2hvd0FjdGlvbjogdHJ1ZSxcbiAgdHJpZ2dlcjogXCJvbkNsaWNrXCIsXG4gIHZhbGlkYXRlRXJyb3JzOiAoKSA9PiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59KTtcblxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbmNvbnN0IGVtaXRzID0gZGVmaW5lRW1pdHMoW1widXBkYXRlOmVkaXRpbmdcIiwgXCJzdWJtaXRcIiwgXCJjYW5jZWxcIl0pO1xuY29uc3QgYWN0aXZlVHJpZ2dlciA9IGNvbXB1dGVkKCgpID0+IHtcbiAgaWYgKCFwcm9wcy50cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgW3Byb3BzLnRyaWdnZXJdOiAoKSA9PiB7XG4gICAgICBlbWl0cyhcInVwZGF0ZTplZGl0aW5nXCIsIHRydWUpO1xuICAgIH1cbiAgfTtcbn0pO1xuZnVuY3Rpb24gZG9TdWJtaXQoKSB7XG4gIGVtaXRzKFwic3VibWl0XCIpO1xufVxuZnVuY3Rpb24gZG9DYW5jZWwoKSB7XG4gIGVtaXRzKFwiY2FuY2VsXCIpO1xufVxuZnVuY3Rpb24gaGFzRXJyb3IoKSB7XG4gIHJldHVybiBwcm9wcy52YWxpZGF0ZUVycm9ycz8ubGVuZ3RoID4gMDtcbn1cbmZ1bmN0aW9uIGdldFZhbGlkYXRlRXJyb3JNZXNzYWdlKCkge1xuICBpZiAocHJvcHMudmFsaWRhdGVFcnJvcnM/Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gcHJvcHMudmFsaWRhdGVFcnJvcnM/Lm1hcCgoaXRlbSkgPT4gaXRlbS5tZXNzYWdlKS5qb2luKFwiLFwiKTtcbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1lZGl0YWJsZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHdpZHRoOiAxMDAlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAuZnMtZWRpdGFibGUtcG9pbnRlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG4gIC5mcy1lZGl0YWJsZS1pbm5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG1pbi1oZWlnaHQ6IDIzcHg7XG4gICAgLmZzLWVkaXRhYmxlLWRpcnR5IHtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwMHB4O1xuICAgICAgd2lkdGg6IDVweDtcbiAgICAgIGhlaWdodDogNXB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IC01cHg7XG4gICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgfVxuICAgIC5mcy1lZGl0YWJsZS1pbnB1dCB7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cbiAgICAuZnMtZWRpdGFibGUtYWN0aW9uIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgICAgaSxcbiAgICAgIC5hbnRpY29uIHtcbiAgICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB9XG4gICAgICAuaGlkZGVuIHtcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5mcy1lZGl0YWJsZS1pY29uIHtcbiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICB9XG4gICAgJjpob3ZlciAuZnMtZWRpdGFibGUtaWNvbiB7XG4gICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIH1cblxuICAgIC5lbC1yYWRpbyB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgICAgIC5lbC1yYWRpb19fbGFiZWwge1xuICAgICAgICBwYWRkaW5nOiAycHg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi5mcy12YWxpZGF0ZS1lcnJvciB7XG4gICAgICAuZXJyb3ItaWNvbiB7XG4gICAgICAgIGNvbG9yOiAjZmY0ZDRmO1xuICAgICAgfVxuICAgICAgLmFudC1pbnB1dC1hZmZpeC13cmFwcGVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAjZmY0ZDRmO1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiKDI1NSAzOCA1IC8gNiUpO1xuICAgICAgfVxuICAgICAgLmVsLWlucHV0X193cmFwcGVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAjZmY0ZDRmICFpbXBvcnRhbnQ7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCAjZmY0ZDRmIGluc2V0ICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgICAubi1pbnB1dCAubi1pbnB1dF9fc3RhdGUtYm9yZGVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAjZmY0ZDRmICFpbXBvcnRhbnQ7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2IoMjU1IDM4IDUgLyA2JSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtYWN0aW9uYmFyXCI+XG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKHZhbHVlLCBrZXkpIGluIGNvbXB1dGVkQnV0dG9uc1wiIDprZXk9XCJrZXlcIj5cbiAgICAgIDxmcy1idXR0b24gdi1pZj1cInZhbHVlLnNob3cgIT09IGZhbHNlXCIgdi1iaW5kPVwidmFsdWVcIiBAY2xpY2s9XCJvbkNsaWNrKGtleSwgdmFsdWUsICRldmVudClcIiAvPlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQsIGNvbXB1dGVkLCBSZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBzb3J0QnkgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbC5jb25zdGFudHNcIjtcbmltcG9ydCB7IEFjdGlvbmJhckNsaWNrRXZlbnQsIEJ1dHRvbnNQcm9wcyB9IGZyb20gXCIuLi8uLi9kXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNBY3Rpb25iYXJcIixcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDmjInpkq7phY3nva5cbiAgICAgKiB7XG4gICAgICogIGFkZDp7XG4gICAgICogICAgLi4uRnNCdXR0b24sXG4gICAgICogICAgc2hvdzp0cnVlXG4gICAgICogIH0sXG4gICAgICogIGN1c3RvbTp7Li4ufVxuICAgICAqIH1cbiAgICAgKi9cbiAgICBidXR0b25zOiB7fVxuICB9IGFzIGFueSxcbiAgZW1pdHM6IFtcImFjdGlvblwiXSxcbiAgc2V0dXAocHJvcHMsIGN0eDogYW55KSB7XG4gICAgZnVuY3Rpb24gb25DbGljayhrZXk6IGFueSwgYnRuOiBhbnksICRldmVudDogYW55KSB7XG4gICAgICBjb25zdCBlID0geyBrZXksIGJ0biwgJGV2ZW50IH07XG4gICAgICBpZiAoYnRuLmNsaWNrKSB7XG4gICAgICAgIGJ0bi5jbGljayhlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGJ0bi5vbkNsaWNrKSB7XG4gICAgICAgIGJ0bi5vbkNsaWNrKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdHguZW1pdChcImFjdGlvblwiLCBlKTtcbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zOiBSZWYgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBsZXQgc29ydEFyciA9IFtdO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yIChsZXQga2V5IGluIHByb3BzLmJ1dHRvbnMpIHtcbiAgICAgICAgc29ydEFyci5wdXNoKHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgLi4ucHJvcHMuYnV0dG9uc1trZXldLFxuICAgICAgICAgIF9rZXk6IGtleVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNvcnRlZEJ1dHRvbnM6IEJ1dHRvbnNQcm9wczxBY3Rpb25iYXJDbGlja0V2ZW50PiA9IHt9O1xuXG4gICAgICBzb3J0QXJyLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBsZXQgX2tleSA9IGl0ZW0uX2tleTtcbiAgICAgICAgZGVsZXRlIGl0ZW0uX2tleTtcbiAgICAgICAgc29ydGVkQnV0dG9uc1tfa2V5XSA9IGl0ZW07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3J0ZWRCdXR0b25zO1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBvbkNsaWNrLFxuICAgICAgY29tcHV0ZWRCdXR0b25zXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLWFjdGlvbmJhciB7XG4gIC5mcy1idXR0b24ge1xuICAgIG1hcmdpbjogMnB4OyAvLyDmjaLooYzkuYvlkI7kuZ/opoHmnInkuIDngrnpl7TpmpRcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWFjdGlvbmJhclwiPlxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIih2YWx1ZSwga2V5KSBpbiBjb21wdXRlZEJ1dHRvbnNcIiA6a2V5PVwia2V5XCI+XG4gICAgICA8ZnMtYnV0dG9uIHYtaWY9XCJ2YWx1ZS5zaG93ICE9PSBmYWxzZVwiIHYtYmluZD1cInZhbHVlXCIgQGNsaWNrPVwib25DbGljayhrZXksIHZhbHVlLCAkZXZlbnQpXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCBjb21wdXRlZCwgUmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgc29ydEJ5IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBY3Rpb25iYXJDbGlja0V2ZW50LCBCdXR0b25zUHJvcHMgfSBmcm9tIFwiLi4vLi4vZFwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzQWN0aW9uYmFyXCIsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uXG4gICAgICoge1xuICAgICAqICBhZGQ6e1xuICAgICAqICAgIC4uLkZzQnV0dG9uLFxuICAgICAqICAgIHNob3c6dHJ1ZVxuICAgICAqICB9LFxuICAgICAqICBjdXN0b206ey4uLn1cbiAgICAgKiB9XG4gICAgICovXG4gICAgYnV0dG9uczoge31cbiAgfSBhcyBhbnksXG4gIGVtaXRzOiBbXCJhY3Rpb25cIl0sXG4gIHNldHVwKHByb3BzLCBjdHg6IGFueSkge1xuICAgIGZ1bmN0aW9uIG9uQ2xpY2soa2V5OiBhbnksIGJ0bjogYW55LCAkZXZlbnQ6IGFueSkge1xuICAgICAgY29uc3QgZSA9IHsga2V5LCBidG4sICRldmVudCB9O1xuICAgICAgaWYgKGJ0bi5jbGljaykge1xuICAgICAgICBidG4uY2xpY2soZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChidG4ub25DbGljaykge1xuICAgICAgICBidG4ub25DbGljayhlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3R4LmVtaXQoXCJhY3Rpb25cIiwgZSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkQnV0dG9uczogUmVmID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgbGV0IHNvcnRBcnIgPSBbXTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvciAobGV0IGtleSBpbiBwcm9wcy5idXR0b25zKSB7XG4gICAgICAgIHNvcnRBcnIucHVzaCh7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIC4uLnByb3BzLmJ1dHRvbnNba2V5XSxcbiAgICAgICAgICBfa2V5OiBrZXlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzb3J0QXJyID0gc29ydEJ5KHNvcnRBcnIsIChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzb3J0ZWRCdXR0b25zOiBCdXR0b25zUHJvcHM8QWN0aW9uYmFyQ2xpY2tFdmVudD4gPSB7fTtcblxuICAgICAgc29ydEFyci5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IF9rZXkgPSBpdGVtLl9rZXk7XG4gICAgICAgIGRlbGV0ZSBpdGVtLl9rZXk7XG4gICAgICAgIHNvcnRlZEJ1dHRvbnNbX2tleV0gPSBpdGVtO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc29ydGVkQnV0dG9ucztcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgb25DbGljayxcbiAgICAgIGNvbXB1dGVkQnV0dG9uc1xuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1hY3Rpb25iYXIge1xuICAuZnMtYnV0dG9uIHtcbiAgICBtYXJnaW46IDJweDsgLy8g5o2i6KGM5LmL5ZCO5Lmf6KaB5pyJ5LiA54K56Ze06ZqUXG4gIH1cbn1cbjwvc3R5bGU+XG4iLG51bGwsbnVsbCwiPHRlbXBsYXRlPlxuICA8IS0tIOeugOWNleaooeW8jyAtLT5cbiAgPHRlbXBsYXRlIHYtaWY9XCJtb2RlID09PSAnc2ltcGxlJ1wiPlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiBjbGFzcz1cImZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyLXNpbXBsZVwiPlxuICAgICAgPGNvbXBvbmVudFxuICAgICAgICA6aXM9XCJ1aS5jb2wubmFtZVwiXG4gICAgICAgIHYtZm9yPVwiKGVsZW1lbnQsIGtleSkgaW4gY3VycmVudENvbHVtbnNcIlxuICAgICAgICB2LXNob3c9XCJvcmlnaW5hbFtlbGVtZW50LmtleV0/Ll9fc2hvdyAhPT0gZmFsc2VcIlxuICAgICAgICA6a2V5PVwia2V5XCJcbiAgICAgICAgOnNwYW49XCI2XCJcbiAgICAgID5cbiAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgIDppcz1cInVpLmNoZWNrYm94Lm5hbWVcIlxuICAgICAgICAgIHYtbW9kZWw6W3VpLmNoZWNrYm94Lm1vZGVsVmFsdWVdPVwiZWxlbWVudC5zaG93XCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJvcmlnaW5hbFtlbGVtZW50LmtleV0/Ll9fZGlzYWJsZWQgPT09IHRydWVcIlxuICAgICAgICAgIGNsYXNzPVwiaXRlbS1sYWJlbFwiXG4gICAgICAgICAgOnRpdGxlPVwiYnVpbGRUZXh0KGVsZW1lbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGJ1aWxkVGV4dChlbGVtZW50KSB9fVxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvY29tcG9uZW50PlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkuZGl2aWRlci5uYW1lXCIgLz5cbiAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCI+XG4gICAgICA8ZnMtYnV0dG9uXG4gICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA1cHhcIlxuICAgICAgICB0eXBlPVwicHJpbWFyeVwiXG4gICAgICAgIDppY29uPVwidWkuaWNvbnMuY2hlY2tcIlxuICAgICAgICA6dGV4dD1cIl90ZXh0LmNvbmZpcm1cIlxuICAgICAgICBAY2xpY2s9XCJzaW1wbGVTdWJtaXQoKVwiXG4gICAgICAvPlxuICAgICAgPGZzLWJ1dHRvbiA6aWNvbj1cInVpLmljb25zLnJlZnJlc2hcIiA6dGV4dD1cIl90ZXh0LnJlc2V0XCIgQGNsaWNrPVwic2ltcGxlUmVzZXRcIiAvPlxuICAgIDwvY29tcG9uZW50PlxuICA8L3RlbXBsYXRlPlxuICA8IS0tIOWujOWFqOaooeW8jyAtLT5cblxuICA8Y29tcG9uZW50IDppcz1cImNvbnRhaW5lcj8uaXMgfHwgJ2ZzLWNvbHVtbnMtZmlsdGVyLWxheW91dC1kZWZhdWx0J1wiIHYtZWxzZSB2LWJpbmQ9XCJjb250YWluZXJcIj5cbiAgICA8dGVtcGxhdGUgI2J1dHRvbnM+XG4gICAgICA8Y29tcG9uZW50IDppcz1cInVpLnJvdy5uYW1lXCIgY2xhc3M9XCJmcy1kcmF3ZXItZm9vdGVyXCIgOmd1dHRlcj1cIjEwXCI+XG4gICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuY29sLm5hbWVcIiA6c3Bhbj1cIjEyXCI+XG4gICAgICAgICAgPGZzLWJ1dHRvbiA6aWNvbj1cInVpLmljb25zLnJlZnJlc2hcIiA6dGV4dD1cIl90ZXh0LnJlc2V0XCIgYmxvY2sgQGNsaWNrPVwicmVzZXRcIiAvPlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jb2wubmFtZVwiIDpzcGFuPVwiMTJcIj5cbiAgICAgICAgICA8ZnMtYnV0dG9uIHR5cGU9XCJwcmltYXJ5XCIgOmljb249XCJ1aS5pY29ucy5jaGVja1wiIDp0ZXh0PVwiX3RleHQuY29uZmlybVwiIGJsb2NrIEBjbGljaz1cInN1Ym1pdChmYWxzZSlcIiAvPlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIiBzZXR1cD5cbi8qKlxuICogRnNUYWJsZUNvbHVtbnNGaWx0ZXLvvIzliJforr7nva7nu4Tku7ZcbiAqL1xuaW1wb3J0IHsgb21pdCwgZm9yRWFjaCwgcGljayB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCBUYWJsZVN0b3JlIGZyb20gXCIuLi8uLi8uLi91dGlscy91dGlsLnN0b3JlXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGluamVjdCwgbmV4dFRpY2ssIHByb3ZpZGUsIFJlZiwgcmVmLCB3YXRjaCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVpQ29udGV4dCB9IGZyb20gXCIuLi8uLi8uLi91aVwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UgfSBmcm9tIFwiLi4vLi4vLi4vdXNlL3VzZS1tZXJnZVwiO1xuaW1wb3J0IHsgdXNlUm91dGUgfSBmcm9tIFwidnVlLXJvdXRlclwiO1xuaW1wb3J0IHtcbiAgQ29sdW1uUHJvcHMsXG4gIENvbHVtbnNGaWx0ZXJDb21wb25lbnRQcm9wcyxcbiAgQ29sdW1uc0ZpbHRlckl0ZW0sXG4gIENvbHVtbnNGaWx0ZXJQcm92aWRlS2V5LFxuICBUYWJsZUNvbHVtbnNQcm9wc1xufSBmcm9tIFwiLi4vLi4vLi4vZFwiO1xuXG5jb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cyhkZWZpbmVQcm9wczxDb2x1bW5zRmlsdGVyQ29tcG9uZW50UHJvcHM+KCksIHtcbiAgc3RvcmFnZTogdHJ1ZSxcbiAgbW9kZTogXCJkZWZhdWx0XCIsXG4gIGNvbnRhaW5lcjogKCkgPT4ge1xuICAgIHJldHVybiB7IGlzOiBcImZzLWNvbHVtbnMtZmlsdGVyLWxheW91dC1kZWZhdWx0XCIgfTtcbiAgfVxufSk7XG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoW1widXBkYXRlOmNvbHVtbnNcIiwgXCJ1cGRhdGU6c2hvd1wiLCBcInJlc2V0XCIsIFwic3VibWl0XCJdKTtcblxuY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG5jb25zdCB1aSA9IHVpQ29udGV4dC5nZXQoKTtcbmNvbnN0IGFjdGl2ZSA9IHJlZihmYWxzZSk7XG5jb25zdCBzdGFydCA9ICgpID0+IHtcbiAgYWN0aXZlLnZhbHVlID0gdHJ1ZTtcbn07XG5cbi8vIOaVsOe7hOW9ouW8j+eahOWOn+Wni3RyZWVcbmNvbnN0IG9yaWdpbmFsOiBSZWY8Q29sdW1uc0ZpbHRlckl0ZW1bXT4gPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiB0cmFuc2Zvcm1Db2x1bW5zVHJlZShwcm9wcy5vcmlnaW5hbENvbHVtbnMpO1xufSk7XG4vL+aVsOe7hOW9ouW8j+eahHRyZWVcbmNvbnN0IGN1cnJlbnRDb2x1bW5zOiBSZWY8Q29sdW1uc0ZpbHRlckl0ZW1bXT4gPSByZWYoW10pO1xuXG5jb25zdCBvcmlnaW5hbENvbHVtbnNNYXA6IFJlZjxSZWNvcmQ8c3RyaW5nLCBDb2x1bW5zRmlsdGVySXRlbT4+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIENvbHVtbnNGaWx0ZXJJdGVtPiA9IHt9O1xuICBlYWNoVHJlZShvcmlnaW5hbC52YWx1ZSwgKGl0ZW06IENvbHVtbnNGaWx0ZXJJdGVtKSA9PiB7XG4gICAgbWFwW2l0ZW0uX19rZXldID0gaXRlbTtcbiAgfSk7XG4gIHJldHVybiBtYXA7XG59KTtcbmNvbnN0IHsgbWVyZ2UsIGNsb25lRGVlcCB9ID0gdXNlTWVyZ2UoKTtcblxuY29uc3QgX3RleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gIGNvbnN0IGRlZiA9IHtcbiAgICB0aXRsZTogdChcImZzLnRvb2xiYXIuY29sdW1uRmlsdGVyLnRpdGxlXCIpLFxuICAgIGZpeGVkOiB0KFwiZnMudG9vbGJhci5jb2x1bW5GaWx0ZXIuZml4ZWRcIiksXG4gICAgb3JkZXI6IHQoXCJmcy50b29sYmFyLmNvbHVtbkZpbHRlci5vcmRlclwiKSxcbiAgICByZXNldDogdChcImZzLnRvb2xiYXIuY29sdW1uRmlsdGVyLnJlc2V0XCIpLFxuICAgIGNvbmZpcm06IHQoXCJmcy50b29sYmFyLmNvbHVtbkZpbHRlci5jb25maXJtXCIpLFxuICAgIHVubmFtZWQ6IHQoXCJmcy50b29sYmFyLmNvbHVtbkZpbHRlci51bm5hbWVkXCIpXG4gIH07XG4gIG1lcmdlKGRlZiwgcHJvcHMudGV4dCk7XG4gIHJldHVybiBkZWY7XG59KTtcblxuZnVuY3Rpb24gZWFjaFRyZWUodHJlZTogYW55LCBjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgaWYgKCF0cmVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHRyZWUpKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRyZWUpIHtcbiAgICAgIGNhbGxiYWNrKGl0ZW0pO1xuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgZWFjaFRyZWUoaXRlbS5jaGlsZHJlbiwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0cmVlKSB7XG4gICAgICBjb25zdCBpdGVtID0gdHJlZVtrZXldO1xuICAgICAgY2FsbGJhY2soaXRlbSk7XG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xuICAgICAgICBlYWNoVHJlZShpdGVtLmNoaWxkcmVuLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29sdW1uRmlsdGVySXRlbShpdGVtOiBDb2x1bW5Qcm9wcyk6IENvbHVtbnNGaWx0ZXJJdGVtIHtcbiAgcmV0dXJuIHtcbiAgICBrZXk6IGl0ZW0ua2V5LFxuICAgIHRpdGxlOiBpdGVtLnRpdGxlLFxuICAgIGZpeGVkOiBpdGVtLmZpeGVkID8/IGZhbHNlLFxuICAgIHNob3c6IGl0ZW0uc2hvdyA/PyB0cnVlLFxuICAgIF9fc2hvdzogaXRlbS5jb2x1bW5TZXRTaG93ICE9PSBmYWxzZSxcbiAgICBfX2Rpc2FibGVkOiBpdGVtLmNvbHVtblNldERpc2FibGVkID8/IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVRvVGFibGVDb2x1bW5zKHJlc3VsdDogQ29sdW1uc0ZpbHRlckl0ZW1bXSkge1xuICBjb25zdCBjb2x1bW5zOiBUYWJsZUNvbHVtbnNQcm9wcyA9IHt9O1xuICBmb3JFYWNoKHJlc3VsdCwgKGl0ZW0pID0+IHtcbiAgICBjb25zdCBjb2x1bW46IENvbHVtblByb3BzID0gb21pdChpdGVtLCBcImNoaWxkcmVuXCIsIFwiX19zaG93XCIsIFwiX19kaXNhYmxlZFwiLCBcIl9fcGFyZW50XCIsIFwiX19rZXlcIik7XG4gICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBjb2x1bW4uY2hpbGRyZW4gPSB0cmFuc2Zvcm1Ub1RhYmxlQ29sdW1ucyhpdGVtLmNoaWxkcmVuKTtcbiAgICB9XG4gICAgY29sdW1uc1tpdGVtLmtleV0gPSBjb2x1bW47XG4gIH0pO1xuICByZXR1cm4gY29sdW1ucztcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtQ29sdW1uc1RyZWUodmFsdWU6IFRhYmxlQ29sdW1uc1Byb3BzLCBwYXJlbnQ/OiBDb2x1bW5zRmlsdGVySXRlbSk6IENvbHVtbnNGaWx0ZXJJdGVtW10ge1xuICBjb25zdCBjb2x1bW5zOiBDb2x1bW5zRmlsdGVySXRlbVtdID0gW107XG4gIGZvckVhY2godmFsdWUsIChpdGVtKSA9PiB7XG4gICAgY29uc3QgY29sdW1uID0gYnVpbGRDb2x1bW5GaWx0ZXJJdGVtKGl0ZW0pO1xuICAgIGNvbHVtbi5fX3BhcmVudCA9IHBhcmVudDtcbiAgICBjb2x1bW4uX19rZXkgPSBgJHtwYXJlbnQ/LmtleSB8fCBcIlwifS4ke2l0ZW0ua2V5fWA7XG4gICAgY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgIGNvbHVtbi5jaGlsZHJlbiA9IHRyYW5zZm9ybUNvbHVtbnNUcmVlKGl0ZW0uY2hpbGRyZW4sIGNvbHVtbik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNvbHVtbnM7XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRWYWx1ZSh2YWx1ZTogYW55KSB7XG4gIGN1cnJlbnRDb2x1bW5zLnZhbHVlID0gdHJhbnNmb3JtQ29sdW1uc1RyZWUodmFsdWUpO1xufVxuXG4vLyDov5jljp9cbmFzeW5jIGZ1bmN0aW9uIHJlc2V0KCkge1xuICBjdXJyZW50Q29sdW1ucy52YWx1ZSA9IHRyYW5zZm9ybUNvbHVtbnNUcmVlKHByb3BzLm9yaWdpbmFsQ29sdW1ucyk7XG4gIGF3YWl0IGRvX3NhdmUodHJ1ZSk7XG4gIGF3YWl0IGNsZWFyVGhpc1N0b3JhZ2UoKTtcbiAgZW1pdChcInJlc2V0XCIpO1xufVxuXG4vLyDnoa7orqRcbmFzeW5jIGZ1bmN0aW9uIGRvX3NhdmUobm9TYXZlID0gZmFsc2UpIHtcbiAgaWYgKCFub1NhdmUpIHtcbiAgICBhd2FpdCBzYXZlT3B0aW9uc1RvU3RvcmFnZShjdXJyZW50Q29sdW1ucy52YWx1ZSk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2xvbmVEZWVwKGN1cnJlbnRDb2x1bW5zLnZhbHVlKTtcblxuICAvL+ino+WGs25haXZlIHVp5LiO5YiX6K6+572u5Yay56qB55qE6Zeu6aKYXG4gIGVhY2hUcmVlKHJlc3VsdCwgKGl0ZW06IGFueSkgPT4ge1xuICAgIGlmIChpdGVtKSB7XG4gICAgICBkZWxldGUgaXRlbS5fX2Rpc2FibGVkO1xuICAgICAgZGVsZXRlIGl0ZW0uX19zaG93O1xuICAgICAgZGVsZXRlIGl0ZW0uX19wYXJlbnQ7XG4gICAgICBkZWxldGUgaXRlbS5fX2tleTtcbiAgICB9XG4gIH0pO1xuXG4gIGRvRW1pdChyZXN1bHQpO1xuICBhY3RpdmUudmFsdWUgPSBmYWxzZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3VibWl0KG5vU2F2ZSA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbHVtbnMgPSBhd2FpdCBkb19zYXZlKG5vU2F2ZSk7XG4gIGVtaXQoXCJzdWJtaXRcIiwgeyBjb2x1bW5zIH0pO1xufVxuY29uc3QgY29tcHV0ZWRPcmlnaW5hbENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiBwcm9wcy5vcmlnaW5hbENvbHVtbnM7XG59KTtcbnByb3ZpZGUoQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXksIHtcbiAgb3JpZ2luYWxDb2x1bW5zOiBjb21wdXRlZE9yaWdpbmFsQ29sdW1ucyxcbiAgb3JpZ2luYWxDb2x1bW5zTWFwOiBvcmlnaW5hbENvbHVtbnNNYXAsXG4gIGN1cnJlbnRDb2x1bW5zLFxuICB0ZXh0OiBfdGV4dCxcbiAgYWN0aXZlLFxuICBzdWJtaXQsXG4gIHJlc2V0XG59KTtcblxuYXN5bmMgZnVuY3Rpb24gc2ltcGxlU3VibWl0KCkge1xuICBhd2FpdCBzdWJtaXQoZmFsc2UpO1xuICBlbWl0KFwidXBkYXRlOnNob3dcIiwgZmFsc2UpO1xufVxuYXN5bmMgZnVuY3Rpb24gc2ltcGxlUmVzZXQoKSB7XG4gIGF3YWl0IHJlc2V0KCk7XG4gIGVtaXQoXCJ1cGRhdGU6c2hvd1wiLCBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIGRvRW1pdChyZXN1bHQ6IENvbHVtbnNGaWx0ZXJJdGVtW10pIHtcbiAgZW1pdChcInVwZGF0ZTpjb2x1bW5zXCIsIHRyYW5zZm9ybVRvVGFibGVDb2x1bW5zKHJlc3VsdCkpO1xufVxuXG5jb25zdCBnZXRDcnVkQmluZGluZyA9IGluamVjdChcImdldDpjcnVkQmluZGluZ1wiLCAoKSA9PiB7XG4gIHJldHVybiB7IGlkOiBcIlwiIH07XG59KTtcblxuY29uc3Qgc3RvcmFnZVRhYmxlU3RvcmUgPSByZWYoKTtcbmZ1bmN0aW9uIGdldFN0b3JhZ2VUYWJsZSgpIHtcbiAgLy9wcm9wcy5zdG9yYWdl5piv5ZCm5a6e546w5LqGQ29sdW1uRmlsdGVyU3RvcmFnZSDmjqXlj6NcbiAgY29uc3QgcmVtb3RlU3RvcmFnZSA9IHR5cGVvZiBwcm9wcy5zdG9yYWdlID09PSBcIm9iamVjdFwiID8gcHJvcHMuc3RvcmFnZSA6IG51bGw7XG4gIGNvbnN0IGtleVR5cGUgPSB0eXBlb2YgcHJvcHMuc3RvcmFnZSA9PT0gXCJzdHJpbmdcIiA/IHByb3BzLnN0b3JhZ2UgOiBcIlwiO1xuICBpZiAoc3RvcmFnZVRhYmxlU3RvcmUudmFsdWUgPT0gbnVsbCkge1xuICAgIGNvbnN0IHJvdXRlID0gdXNlUm91dGUoKTtcbiAgICBzdG9yYWdlVGFibGVTdG9yZS52YWx1ZSA9IG5ldyBUYWJsZVN0b3JlKHtcbiAgICAgICRyb3V0ZXI6IHJvdXRlLFxuICAgICAgdGFibGVOYW1lOiBcImNvbHVtbnNGaWx0ZXJcIixcbiAgICAgIGtleVR5cGU6IGtleVR5cGUsXG4gICAgICByZW1vdGVTdG9yYWdlXG4gICAgfSk7XG4gIH1cbiAgc3RvcmFnZVRhYmxlU3RvcmUudmFsdWUuaWQgPSBnZXRDcnVkQmluZGluZygpLmlkO1xuICByZXR1cm4gc3RvcmFnZVRhYmxlU3RvcmUudmFsdWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVPcHRpb25zVG9TdG9yYWdlKHZhbHVlOiBhbnkpIHtcbiAgaWYgKHByb3BzLnN0b3JhZ2UgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHN0b3JlZE9wdGlvbnM6IGFueSA9IGNsb25lRGVlcCh2YWx1ZSk7XG4gIC8v5Yig6ZmkcGFyZW505byV55SoXG4gIGVhY2hUcmVlKHN0b3JlZE9wdGlvbnMsIChpdGVtOiBhbnkpID0+IHtcbiAgICBkZWxldGUgaXRlbS5fX3BhcmVudDtcbiAgfSk7XG5cbiAgYXdhaXQgZ2V0U3RvcmFnZVRhYmxlKCkudXBkYXRlVGFibGVWYWx1ZShzdG9yZWRPcHRpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9uc0Zyb21TdG9yYWdlKCkge1xuICBpZiAocHJvcHMuc3RvcmFnZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIGF3YWl0IGdldFN0b3JhZ2VUYWJsZSgpLmdldFRhYmxlVmFsdWUoKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNsZWFyVGhpc1N0b3JhZ2UoKSB7XG4gIGF3YWl0IGdldFN0b3JhZ2VUYWJsZSgpLmNsZWFyVGFibGVWYWx1ZSgpO1xufVxuXG5mdW5jdGlvbiBnZXRDb2x1bW5zSGFzaChjb2x1bW5zOiBhbnkpIHtcbiAgY29uc3Qga2V5czogYW55ID0gW107XG4gIGVhY2hUcmVlKGNvbHVtbnMsIChpdGVtOiBhbnkpID0+IHtcbiAgICBjb25zdCB0YXJnZXQgPSBwaWNrKGl0ZW0sIFwia2V5XCIsIFwiX19zaG93XCIsIFwiX19kaXNhYmxlZFwiKTtcbiAgICBrZXlzLnB1c2goSlNPTi5zdHJpbmdpZnkodGFyZ2V0KSk7XG4gIH0pO1xuICBrZXlzLnNvcnQoKTtcbiAgbGV0IGhhc2ggPSBcIlwiO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaGFzaCArPSBrZXk7XG4gIH1cbiAgcmV0dXJuIGhhc2g7XG59XG53YXRjaChcbiAgKCkgPT4ge1xuICAgIHJldHVybiBwcm9wcy5jb2x1bW5zO1xuICB9LFxuICAodmFsdWUpID0+IHtcbiAgICBzZXRDdXJyZW50VmFsdWUodmFsdWUpO1xuICB9XG4pO1xuXG5jb25zdCBpbml0ID0gYXN5bmMgKCkgPT4ge1xuICBzZXRDdXJyZW50VmFsdWUocHJvcHMuY29sdW1ucyk7XG4gIGNvbnN0IHN0b3JlZE9wdGlvbnMgPSBhd2FpdCBnZXRPcHRpb25zRnJvbVN0b3JhZ2UoKTtcbiAgaWYgKHN0b3JlZE9wdGlvbnMpIHtcbiAgICBjb25zdCBzdG9yZUhhc2ggPSBnZXRDb2x1bW5zSGFzaChzdG9yZWRPcHRpb25zKTtcbiAgICBjb25zdCBvcHRpb25IYXNoID0gZ2V0Q29sdW1uc0hhc2gob3JpZ2luYWwudmFsdWUpO1xuICAgIGlmIChvcHRpb25IYXNoICE9PSBzdG9yZUhhc2gpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiY29sdW1ucyBjaGFuZ2VkLCBpZ25vcmUgbG9jYWwgc3RvcmFnZVwiKTtcbiAgICAgIC8vIOWmguaenOWtl+auteWIl+aciei/h+S/ruaUue+8jOWImeS4jeS9v+eUqOacrOWcsOiuvue9rlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjdXJyZW50Q29sdW1ucy52YWx1ZSA9IHN0b3JlZE9wdGlvbnM7XG4gICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICBhd2FpdCBzdWJtaXQodHJ1ZSk7XG4gIH1cbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZShjaGFuZ2U6IChjdXJyZW50Q29sdW1uczogUmVmPENvbHVtbnNGaWx0ZXJJdGVtW10+KSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gIGF3YWl0IGNoYW5nZShjdXJyZW50Q29sdW1ucyk7XG4gIGF3YWl0IGRvX3NhdmUoKTtcbn1cblxud2F0Y2goXG4gICgpID0+IHtcbiAgICByZXR1cm4gb3JpZ2luYWwudmFsdWU7XG4gIH0sXG4gIGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgIGF3YWl0IGluaXQoKTtcbiAgfSxcbiAge1xuICAgIGltbWVkaWF0ZTogdHJ1ZVxuICB9XG4pO1xuXG5kZWZpbmVFeHBvc2Uoe1xuICBzdGFydCxcbiAgc2F2ZTogZG9fc2F2ZSxcbiAgdXBkYXRlLFxuICBvcmlnaW5hbCxcbiAgY29sdW1uczogY3VycmVudENvbHVtbnNcbn0pO1xuXG5mdW5jdGlvbiBidWlsZFRleHQoZWxlbWVudDogYW55KSB7XG4gIHJldHVybiBlbGVtZW50LmxhYmVsIHx8IGVsZW1lbnQudGl0bGUgfHwgZWxlbWVudC5rZXkgfHwgX3RleHQudmFsdWUudW5uYW1lZDtcbn1cbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtdGFibGUtY29sdW1ucy1maWx0ZXItc2ltcGxlIHtcbiAgbWluLXdpZHRoOiA3NjBweDtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG59XG5cbi5mcy10YWJsZS1jb2x1bW5zLWZpbHRlciB7XG4gIDpmb2N1cyB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxuXG4gIFtmbGV4fj1cImNyb3NzOmNlbnRlclwiXSB7XG4gICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG5cbiAgW2ZsZXh+PVwibWFpbjpqdXN0aWZ5XCJdIHtcbiAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgfVxuXG4gIFtmbGV4XSB7XG4gICAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuXG4gIFtmbGV4LWJveD1cIjFcIl0ge1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgICBmbGV4LXNocmluazogMTtcbiAgfVxuXG4gIFtmbGV4XSA+ICoge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gIH1cblxuICAuZWwtZHJhd2VyX19ib2R5IHtcbiAgICBoZWlnaHQ6IDA7XG4gIH1cblxuICAuZnMtZHJhd2VyLXdyYXBwZXIge1xuICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gIH1cblxuICAuZnMtZHJhd2VyLWZvb3RlciB7XG4gICAgcGFkZGluZzogMjBweDtcbiAgfVxuXG4gIC5jb21wb25lbnQtLWxpc3Qge1xuICAgIG1hcmdpbjogLTIwcHg7XG5cbiAgICAuaXRlbS1sYWJlbCB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgbWluLXdpZHRoOiAwO1xuXG4gICAgICAuYW50LWNoZWNrYm94ICsgc3BhbiB7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgfVxuICAgIH1cbiAgICAuaXRlbS1yaWdodCB7XG4gICAgICBmbGV4LXNocmluazogMTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgfVxuXG4gICAgLnRpdGxlIHtcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICB9XG5cbiAgICAuY29tcG9uZW50LS1saXN0LWl0ZW0ge1xuICAgICAgcGFkZGluZzogMTBweDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDFweDtcblxuICAgICAgJi5naG9zdCB7XG4gICAgICAgIG9wYWNpdHk6IDAuNTtcbiAgICAgIH1cblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICAgICAgfVxuXG4gICAgICAuY29tcG9uZW50LS1saXN0LWl0ZW0taGFuZGxlIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgICAgIGN1cnNvcjogbW92ZTtcblxuICAgICAgICAmLmRpc2FibGVkIHtcbiAgICAgICAgICBvcGFjaXR5OiAwLjM7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtdG9vbGJhclwiPlxuICAgIDx0ZW1wbGF0ZSB2LWZvcj1cIihpdGVtLCBrZXkpIG9mIGNvbXB1dGVkQnV0dG9uc1wiIDprZXk9XCJrZXlcIj5cbiAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXRlbS5zaG93ICE9PSBmYWxzZVwiPlxuICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgOmlzPVwidWkucG9wb3Zlci5uYW1lXCJcbiAgICAgICAgICB2LWlmPVwia2V5ID09PSAnY29sdW1ucycgJiYgY29sdW1uc0ZpbHRlciAmJiBjb2x1bW5zRmlsdGVyPy5tb2RlID09PSAnc2ltcGxlJ1wiXG4gICAgICAgICAgdi1tb2RlbDpbdWkucG9wb3Zlci52aXNpYmxlXT1cInBvcG92ZXJWaXNpYmxlXCJcbiAgICAgICAgICBkaXNwbGF5LWRpcmVjdGl2ZT1cInNob3dcIlxuICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgOndpZHRoPVwiNzYwXCJcbiAgICAgICAgICB0cmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICA+XG4gICAgICAgICAgPHRlbXBsYXRlICNbdWkucG9wb3Zlci50cmlnZ2VyU2xvdE5hbWVdPlxuICAgICAgICAgICAgPGZzLWJ1dHRvbiB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrPVwiaGFuZGxlU2ltcGxlQ2xpY2tcIiAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPHRlbXBsYXRlICNbdWkucG9wb3Zlci5jb250ZW50U2xvdE5hbWVdPlxuICAgICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgICA6aXM9XCJjb2x1bW5zRmlsdGVyLmlzIHx8ICdmcy10YWJsZS1jb2x1bW5zLWZpbHRlcidcIlxuICAgICAgICAgICAgICB2LWlmPVwiY29sdW1uc1wiXG4gICAgICAgICAgICAgIHJlZj1cImNvbHVtbnNGaWx0ZXJSZWZcIlxuICAgICAgICAgICAgICB2LW1vZGVsOnNob3c9XCJwb3BvdmVyVmlzaWJsZVwiXG4gICAgICAgICAgICAgIG1vZGU9XCJzaW1wbGVcIlxuICAgICAgICAgICAgICB2LWJpbmQ9XCJjb2x1bW5zRmlsdGVyXCJcbiAgICAgICAgICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgICAgICAgICAgOnN0b3JhZ2U9XCJzdG9yYWdlXCJcbiAgICAgICAgICAgICAgQHVwZGF0ZTpjb2x1bW5zPVwiJGVtaXQoJ3VwZGF0ZTpjb2x1bW5zJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICA8ZnMtYnV0dG9uIHYtZWxzZSB2LWJpbmQ9XCJpdGVtXCIgQGNsaWNrPVwiaXRlbS5jbGljaygpXCIgLz5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8Y29tcG9uZW50XG4gICAgICA6aXM9XCJjb2x1bW5zRmlsdGVyLmlzIHx8ICdmcy10YWJsZS1jb2x1bW5zLWZpbHRlcidcIlxuICAgICAgdi1pZj1cImNvbHVtbnMgJiYgY29sdW1uc0ZpbHRlcj8ubW9kZSAhPT0gJ3NpbXBsZSdcIlxuICAgICAgcmVmPVwiY29sdW1uc0ZpbHRlclJlZlwiXG4gICAgICA6c3RvcmFnZT1cInN0b3JhZ2VcIlxuICAgICAgdi1iaW5kPVwiY29sdW1uc0ZpbHRlclwiXG4gICAgICA6Y29sdW1ucz1cImNvbHVtbnNcIlxuICAgICAgQHVwZGF0ZTpjb2x1bW5zPVwiJGVtaXQoJ3VwZGF0ZTpjb2x1bW5zJywgJGV2ZW50KVwiXG4gICAgLz5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IEZzVGFibGVDb2x1bW5zRmlsdGVyIGZyb20gXCIuL2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyL2luZGV4LnZ1ZVwiO1xuaW1wb3J0IHsgc29ydEJ5IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgUHJvcFR5cGUsIHJlZiwgUmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlSTE4biB9IGZyb20gXCIuLi8uLi9sb2NhbGVcIjtcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgQnV0dG9uUHJvcHMsIEJ1dHRvbnNQcm9wcywgVGFibGVDb2x1bW5zUHJvcHMgfSBmcm9tIFwiLi4vLi4vZFwiO1xuaW1wb3J0IHsgdXNlTWVyZ2UsIHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuLyoqXG4gKiDlt6XlhbfmnaFcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1Rvb2xiYXJcIixcbiAgY29tcG9uZW50czogeyBGc1RhYmxlQ29sdW1uc0ZpbHRlciB9LFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaMiemSrumFjee9rlxuICAgICAqe1xuICAgICAqICAgc2VhcmNoOnt9LCDmn6Xor6JcbiAgICAgKiAgIHJlZnJlc2g6e30sIOWIt+aWsFxuICAgICAqICAgY29tcGFjdDp7fSwg57Sn5YeR5qih5byPXG4gICAgICogICBleHBvcnQ6e30sIOWvvOWHulxuICAgICAqICAgY29sdW1uczp7fSDliJforr7nva5cbiAgICAgKn1cbiAgICAgKiovXG4gICAgYnV0dG9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDlvZPliY3mmK/lkKbntKflh5HmqKHlvI9cbiAgICAgKi9cbiAgICBjb21wYWN0OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5YiX6YWN572uXG4gICAgICovXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogT2JqZWN0IGFzIFByb3BUeXBlPFRhYmxlQ29sdW1uc1Byb3BzPixcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5L+d5a2Y55So5oi35YiX6K6+572uXG4gICAgICog5Lygc3RyaW5n5YiZ6KGo56S65Lyg5YWl57yT5a2Y55qE5Li7a2V5XG4gICAgICovXG4gICAgc3RvcmFnZToge1xuICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmj5Lmp71cbiAgICAgKi9cbiAgICBzbG90czoge30sXG5cbiAgICAvKipcbiAgICAgKiDliJforr7nva7phY3nva5cbiAgICAgKi9cbiAgICBjb2x1bW5zRmlsdGVyOiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8YW55PlxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcInVwZGF0ZTpjb2x1bW5zXCJdLFxuICBzZXR1cChwcm9wczogYW55LCBjdHgpIHtcbiAgICBjb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcbiAgICBjb25zdCBjb2x1bW5zRmlsdGVyUmVmOiBSZWYgPSByZWYoKTtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgZGVmYXVsdEJ1dHRvbnM6IEJ1dHRvbnNQcm9wczx2b2lkPiA9IHtcbiAgICAgICAgY29sdW1uczoge1xuICAgICAgICAgIGNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBjb2x1bW5zRmlsdGVyUmVmLnZhbHVlLnN0YXJ0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBtZXJnZShkZWZhdWx0QnV0dG9ucywgcHJvcHMuYnV0dG9ucyk7XG4gICAgICAvLyBpZiAoZGVmYXVsdEJ1dHRvbnMuc2VhcmNoKSB7XG4gICAgICAvLyAgIGRlZmF1bHRCdXR0b25zLnNlYXJjaC50eXBlID0gcHJvcHMuc2VhcmNoID8gXCJwcmltYXJ5XCIgOiBcImRlZmF1bHRcIjtcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmIChkZWZhdWx0QnV0dG9ucy5jb21wYWN0KSB7XG4gICAgICAvLyAgIGRlZmF1bHRCdXR0b25zLmNvbXBhY3QudHlwZSA9IHByb3BzLmNvbXBhY3QgPyBcInByaW1hcnlcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgLy8gfVxuXG4gICAgICBsZXQgc29ydEFycjogQnV0dG9uUHJvcHNbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgZGVmYXVsdEJ1dHRvbnNLZXkgaW4gZGVmYXVsdEJ1dHRvbnMpIHtcbiAgICAgICAgc29ydEFyci5wdXNoKHtcbiAgICAgICAgICAuLi5kZWZhdWx0QnV0dG9uc1tkZWZhdWx0QnV0dG9uc0tleV0sXG4gICAgICAgICAgX2tleTogZGVmYXVsdEJ1dHRvbnNLZXlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzb3J0QXJyID0gc29ydEJ5KHNvcnRBcnIsIChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLm9yZGVyID8/IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc29ydGVkQnV0dG9uczogQnV0dG9uc1Byb3BzPHZvaWQ+ID0ge307XG5cbiAgICAgIHNvcnRBcnIuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBsZXQgX2tleSA9IGl0ZW0uX2tleTtcbiAgICAgICAgZGVsZXRlIGl0ZW0uX2tleTtcbiAgICAgICAgc29ydGVkQnV0dG9uc1tfa2V5XSA9IGl0ZW07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3J0ZWRCdXR0b25zO1xuICAgIH0pO1xuICAgIGNvbnN0IHBvcG92ZXJWaXNpYmxlID0gcmVmKGZhbHNlKTtcbiAgICBjb25zdCBoYW5kbGVTaW1wbGVDbGljayA9ICgpID0+IHtcbiAgICAgIGlmICh1aS50eXBlID09PSBcImVsZW1lbnRcIikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwb3BvdmVyVmlzaWJsZS52YWx1ZSA9ICFwb3BvdmVyVmlzaWJsZS52YWx1ZTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIGNvbHVtbnNGaWx0ZXJSZWYsXG4gICAgICBjb21wdXRlZEJ1dHRvbnMsXG4gICAgICBwb3BvdmVyVmlzaWJsZSxcbiAgICAgIGhhbmRsZVNpbXBsZUNsaWNrXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXRvb2xiYXIge1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5mcy1idXR0b24ge1xuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy10b29sYmFyXCI+XG4gICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGtleSkgb2YgY29tcHV0ZWRCdXR0b25zXCIgOmtleT1cImtleVwiPlxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpdGVtLnNob3cgIT09IGZhbHNlXCI+XG4gICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICA6aXM9XCJ1aS5wb3BvdmVyLm5hbWVcIlxuICAgICAgICAgIHYtaWY9XCJrZXkgPT09ICdjb2x1bW5zJyAmJiBjb2x1bW5zRmlsdGVyICYmIGNvbHVtbnNGaWx0ZXI/Lm1vZGUgPT09ICdzaW1wbGUnXCJcbiAgICAgICAgICB2LW1vZGVsOlt1aS5wb3BvdmVyLnZpc2libGVdPVwicG9wb3ZlclZpc2libGVcIlxuICAgICAgICAgIGRpc3BsYXktZGlyZWN0aXZlPVwic2hvd1wiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICA6d2lkdGg9XCI3NjBcIlxuICAgICAgICAgIHRyaWdnZXI9XCJjbGlja1wiXG4gICAgICAgID5cbiAgICAgICAgICA8dGVtcGxhdGUgI1t1aS5wb3BvdmVyLnRyaWdnZXJTbG90TmFtZV0+XG4gICAgICAgICAgICA8ZnMtYnV0dG9uIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJoYW5kbGVTaW1wbGVDbGlja1wiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8dGVtcGxhdGUgI1t1aS5wb3BvdmVyLmNvbnRlbnRTbG90TmFtZV0+XG4gICAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICAgIDppcz1cImNvbHVtbnNGaWx0ZXIuaXMgfHwgJ2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyJ1wiXG4gICAgICAgICAgICAgIHYtaWY9XCJjb2x1bW5zXCJcbiAgICAgICAgICAgICAgcmVmPVwiY29sdW1uc0ZpbHRlclJlZlwiXG4gICAgICAgICAgICAgIHYtbW9kZWw6c2hvdz1cInBvcG92ZXJWaXNpYmxlXCJcbiAgICAgICAgICAgICAgbW9kZT1cInNpbXBsZVwiXG4gICAgICAgICAgICAgIHYtYmluZD1cImNvbHVtbnNGaWx0ZXJcIlxuICAgICAgICAgICAgICA6Y29sdW1ucz1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICA6c3RvcmFnZT1cInN0b3JhZ2VcIlxuICAgICAgICAgICAgICBAdXBkYXRlOmNvbHVtbnM9XCIkZW1pdCgndXBkYXRlOmNvbHVtbnMnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgIDxmcy1idXR0b24gdi1lbHNlIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJpdGVtLmNsaWNrKClcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L3RlbXBsYXRlPlxuICAgIDxjb21wb25lbnRcbiAgICAgIDppcz1cImNvbHVtbnNGaWx0ZXIuaXMgfHwgJ2ZzLXRhYmxlLWNvbHVtbnMtZmlsdGVyJ1wiXG4gICAgICB2LWlmPVwiY29sdW1ucyAmJiBjb2x1bW5zRmlsdGVyPy5tb2RlICE9PSAnc2ltcGxlJ1wiXG4gICAgICByZWY9XCJjb2x1bW5zRmlsdGVyUmVmXCJcbiAgICAgIDpzdG9yYWdlPVwic3RvcmFnZVwiXG4gICAgICB2LWJpbmQ9XCJjb2x1bW5zRmlsdGVyXCJcbiAgICAgIDpjb2x1bW5zPVwiY29sdW1uc1wiXG4gICAgICBAdXBkYXRlOmNvbHVtbnM9XCIkZW1pdCgndXBkYXRlOmNvbHVtbnMnLCAkZXZlbnQpXCJcbiAgICAvPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgRnNUYWJsZUNvbHVtbnNGaWx0ZXIgZnJvbSBcIi4vZnMtdGFibGUtY29sdW1ucy1maWx0ZXIvaW5kZXgudnVlXCI7XG5pbXBvcnQgeyBzb3J0QnkgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCBQcm9wVHlwZSwgcmVmLCBSZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBCdXR0b25Qcm9wcywgQnV0dG9uc1Byb3BzLCBUYWJsZUNvbHVtbnNQcm9wcyB9IGZyb20gXCIuLi8uLi9kXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSwgdXNlVWkgfSBmcm9tIFwiLi4vLi4vdXNlXCI7XG4vKipcbiAqIOW3peWFt+adoVxuICovXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzVG9vbGJhclwiLFxuICBjb21wb25lbnRzOiB7IEZzVGFibGVDb2x1bW5zRmlsdGVyIH0sXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5oyJ6ZKu6YWN572uXG4gICAgICp7XG4gICAgICogICBzZWFyY2g6e30sIOafpeivolxuICAgICAqICAgcmVmcmVzaDp7fSwg5Yi35pawXG4gICAgICogICBjb21wYWN0Ont9LCDntKflh5HmqKHlvI9cbiAgICAgKiAgIGV4cG9ydDp7fSwg5a+85Ye6XG4gICAgICogICBjb2x1bW5zOnt9IOWIl+iuvue9rlxuICAgICAqfVxuICAgICAqKi9cbiAgICBidXR0b25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOW9k+WJjeaYr+WQpue0p+WHkeaooeW8j1xuICAgICAqL1xuICAgIGNvbXBhY3Q6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliJfphY3nva5cbiAgICAgKi9cbiAgICBjb2x1bW5zOiB7XG4gICAgICB0eXBlOiBPYmplY3QgYXMgUHJvcFR5cGU8VGFibGVDb2x1bW5zUHJvcHM+LFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKbkv53lrZjnlKjmiLfliJforr7nva5cbiAgICAgKiDkvKBzdHJpbmfliJnooajnpLrkvKDlhaXnvJPlrZjnmoTkuLtrZXlcbiAgICAgKi9cbiAgICBzdG9yYWdlOiB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBCb29sZWFuXSxcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaPkuanvVxuICAgICAqL1xuICAgIHNsb3RzOiB7fSxcblxuICAgIC8qKlxuICAgICAqIOWIl+iuvue9rumFjee9rlxuICAgICAqL1xuICAgIGNvbHVtbnNGaWx0ZXI6IHtcbiAgICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxhbnk+XG4gICAgfVxuICB9LFxuICBlbWl0czogW1widXBkYXRlOmNvbHVtbnNcIl0sXG4gIHNldHVwKHByb3BzOiBhbnksIGN0eCkge1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IGNvbHVtbnNGaWx0ZXJSZWY6IFJlZiA9IHJlZigpO1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3QgeyBtZXJnZSB9ID0gdXNlTWVyZ2UoKTtcbiAgICBjb25zdCBjb21wdXRlZEJ1dHRvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBkZWZhdWx0QnV0dG9uczogQnV0dG9uc1Byb3BzPHZvaWQ+ID0ge1xuICAgICAgICBjb2x1bW5zOiB7XG4gICAgICAgICAgY2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbHVtbnNGaWx0ZXJSZWYudmFsdWUuc3RhcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG1lcmdlKGRlZmF1bHRCdXR0b25zLCBwcm9wcy5idXR0b25zKTtcbiAgICAgIC8vIGlmIChkZWZhdWx0QnV0dG9ucy5zZWFyY2gpIHtcbiAgICAgIC8vICAgZGVmYXVsdEJ1dHRvbnMuc2VhcmNoLnR5cGUgPSBwcm9wcy5zZWFyY2ggPyBcInByaW1hcnlcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgLy8gfVxuICAgICAgLy8gaWYgKGRlZmF1bHRCdXR0b25zLmNvbXBhY3QpIHtcbiAgICAgIC8vICAgZGVmYXVsdEJ1dHRvbnMuY29tcGFjdC50eXBlID0gcHJvcHMuY29tcGFjdCA/IFwicHJpbWFyeVwiIDogXCJkZWZhdWx0XCI7XG4gICAgICAvLyB9XG5cbiAgICAgIGxldCBzb3J0QXJyOiBCdXR0b25Qcm9wc1tdID0gW107XG4gICAgICBmb3IgKGxldCBkZWZhdWx0QnV0dG9uc0tleSBpbiBkZWZhdWx0QnV0dG9ucykge1xuICAgICAgICBzb3J0QXJyLnB1c2goe1xuICAgICAgICAgIC4uLmRlZmF1bHRCdXR0b25zW2RlZmF1bHRCdXR0b25zS2V5XSxcbiAgICAgICAgICBfa2V5OiBkZWZhdWx0QnV0dG9uc0tleVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JkZXIgPz8gQ29uc3RhbnRzLm9yZGVyRGVmYXVsdDtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzb3J0ZWRCdXR0b25zOiBCdXR0b25zUHJvcHM8dm9pZD4gPSB7fTtcblxuICAgICAgc29ydEFyci5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGxldCBfa2V5ID0gaXRlbS5fa2V5O1xuICAgICAgICBkZWxldGUgaXRlbS5fa2V5O1xuICAgICAgICBzb3J0ZWRCdXR0b25zW19rZXldID0gaXRlbTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvcnRlZEJ1dHRvbnM7XG4gICAgfSk7XG4gICAgY29uc3QgcG9wb3ZlclZpc2libGUgPSByZWYoZmFsc2UpO1xuICAgIGNvbnN0IGhhbmRsZVNpbXBsZUNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHVpLnR5cGUgPT09IFwiZWxlbWVudFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHBvcG92ZXJWaXNpYmxlLnZhbHVlID0gIXBvcG92ZXJWaXNpYmxlLnZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgY29sdW1uc0ZpbHRlclJlZixcbiAgICAgIGNvbXB1dGVkQnV0dG9ucyxcbiAgICAgIHBvcG92ZXJWaXNpYmxlLFxuICAgICAgaGFuZGxlU2ltcGxlQ2xpY2tcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtdG9vbGJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgLmZzLWJ1dHRvbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIi8qKiFcbiAqIFNvcnRhYmxlIDEuMTQuMFxuICogQGF1dGhvclx0UnViYVhhICAgPHRyYXNoQHJ1YmF4YS5vcmc+XG4gKiBAYXV0aG9yXHRvd2VubSAgICA8b3dlbjIzMzU1QGdtYWlsLmNvbT5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG5cbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHtcbiAgICAgIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuXG4gIHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTtcblxuICB2YXIga2V5LCBpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTtcbiAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KGFycik7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbnZhciB2ZXJzaW9uID0gXCIxLjE0LjBcIjtcblxuZnVuY3Rpb24gdXNlckFnZW50KHBhdHRlcm4pIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5uYXZpZ2F0b3IpIHtcbiAgICByZXR1cm4gISEgLypAX19QVVJFX18qL25hdmlnYXRvci51c2VyQWdlbnQubWF0Y2gocGF0dGVybik7XG4gIH1cbn1cblxudmFyIElFMTFPckxlc3MgPSB1c2VyQWdlbnQoLyg/OlRyaWRlbnQuKnJ2WyA6XT8xMVxcLnxtc2llfGllbW9iaWxlfFdpbmRvd3MgUGhvbmUpL2kpO1xudmFyIEVkZ2UgPSB1c2VyQWdlbnQoL0VkZ2UvaSk7XG52YXIgRmlyZUZveCA9IHVzZXJBZ2VudCgvZmlyZWZveC9pKTtcbnZhciBTYWZhcmkgPSB1c2VyQWdlbnQoL3NhZmFyaS9pKSAmJiAhdXNlckFnZW50KC9jaHJvbWUvaSkgJiYgIXVzZXJBZ2VudCgvYW5kcm9pZC9pKTtcbnZhciBJT1MgPSB1c2VyQWdlbnQoL2lQKGFkfG9kfGhvbmUpL2kpO1xudmFyIENocm9tZUZvckFuZHJvaWQgPSB1c2VyQWdlbnQoL2Nocm9tZS9pKSAmJiB1c2VyQWdlbnQoL2FuZHJvaWQvaSk7XG5cbnZhciBjYXB0dXJlTW9kZSA9IHtcbiAgY2FwdHVyZTogZmFsc2UsXG4gIHBhc3NpdmU6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBvbihlbCwgZXZlbnQsIGZuKSB7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCAhSUUxMU9yTGVzcyAmJiBjYXB0dXJlTW9kZSk7XG59XG5cbmZ1bmN0aW9uIG9mZihlbCwgZXZlbnQsIGZuKSB7XG4gIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCAhSUUxMU9yTGVzcyAmJiBjYXB0dXJlTW9kZSk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXMoXG4vKipIVE1MRWxlbWVudCovXG5lbCxcbi8qKlN0cmluZyovXG5zZWxlY3Rvcikge1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm47XG4gIHNlbGVjdG9yWzBdID09PSAnPicgJiYgKHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyaW5nKDEpKTtcblxuICBpZiAoZWwpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGVsLm1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIGVsLm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmIChlbC5tc01hdGNoZXNTZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZWwubXNNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmIChlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50T3JIb3N0KGVsKSB7XG4gIHJldHVybiBlbC5ob3N0ICYmIGVsICE9PSBkb2N1bWVudCAmJiBlbC5ob3N0Lm5vZGVUeXBlID8gZWwuaG9zdCA6IGVsLnBhcmVudE5vZGU7XG59XG5cbmZ1bmN0aW9uIGNsb3Nlc3QoXG4vKipIVE1MRWxlbWVudCovXG5lbCxcbi8qKlN0cmluZyovXG5zZWxlY3Rvcixcbi8qKkhUTUxFbGVtZW50Ki9cbmN0eCwgaW5jbHVkZUNUWCkge1xuICBpZiAoZWwpIHtcbiAgICBjdHggPSBjdHggfHwgZG9jdW1lbnQ7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCAmJiAoc2VsZWN0b3JbMF0gPT09ICc+JyA/IGVsLnBhcmVudE5vZGUgPT09IGN0eCAmJiBtYXRjaGVzKGVsLCBzZWxlY3RvcikgOiBtYXRjaGVzKGVsLCBzZWxlY3RvcikpIHx8IGluY2x1ZGVDVFggJiYgZWwgPT09IGN0eCkge1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbCA9PT0gY3R4KSBicmVhaztcbiAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgICB9IHdoaWxlIChlbCA9IGdldFBhcmVudE9ySG9zdChlbCkpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBSX1NQQUNFID0gL1xccysvZztcblxuZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWwsIG5hbWUsIHN0YXRlKSB7XG4gIGlmIChlbCAmJiBuYW1lKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdCkge1xuICAgICAgZWwuY2xhc3NMaXN0W3N0YXRlID8gJ2FkZCcgOiAncmVtb3ZlJ10obmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjbGFzc05hbWUgPSAoJyAnICsgZWwuY2xhc3NOYW1lICsgJyAnKS5yZXBsYWNlKFJfU1BBQ0UsICcgJykucmVwbGFjZSgnICcgKyBuYW1lICsgJyAnLCAnICcpO1xuICAgICAgZWwuY2xhc3NOYW1lID0gKGNsYXNzTmFtZSArIChzdGF0ZSA/ICcgJyArIG5hbWUgOiAnJykpLnJlcGxhY2UoUl9TUEFDRSwgJyAnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3NzKGVsLCBwcm9wLCB2YWwpIHtcbiAgdmFyIHN0eWxlID0gZWwgJiYgZWwuc3R5bGU7XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgaWYgKHZhbCA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgICAgICB2YWwgPSBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsLCAnJyk7XG4gICAgICB9IGVsc2UgaWYgKGVsLmN1cnJlbnRTdHlsZSkge1xuICAgICAgICB2YWwgPSBlbC5jdXJyZW50U3R5bGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9wID09PSB2b2lkIDAgPyB2YWwgOiB2YWxbcHJvcF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKHByb3AgaW4gc3R5bGUpICYmIHByb3AuaW5kZXhPZignd2Via2l0JykgPT09IC0xKSB7XG4gICAgICAgIHByb3AgPSAnLXdlYmtpdC0nICsgcHJvcDtcbiAgICAgIH1cblxuICAgICAgc3R5bGVbcHJvcF0gPSB2YWwgKyAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyAnJyA6ICdweCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXRyaXgoZWwsIHNlbGZPbmx5KSB7XG4gIHZhciBhcHBsaWVkVHJhbnNmb3JtcyA9ICcnO1xuXG4gIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgYXBwbGllZFRyYW5zZm9ybXMgPSBlbDtcbiAgfSBlbHNlIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdHJhbnNmb3JtID0gY3NzKGVsLCAndHJhbnNmb3JtJyk7XG5cbiAgICAgIGlmICh0cmFuc2Zvcm0gJiYgdHJhbnNmb3JtICE9PSAnbm9uZScpIHtcbiAgICAgICAgYXBwbGllZFRyYW5zZm9ybXMgPSB0cmFuc2Zvcm0gKyAnICcgKyBhcHBsaWVkVHJhbnNmb3JtcztcbiAgICAgIH1cbiAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuICAgIH0gd2hpbGUgKCFzZWxmT25seSAmJiAoZWwgPSBlbC5wYXJlbnROb2RlKSk7XG4gIH1cblxuICB2YXIgbWF0cml4Rm4gPSB3aW5kb3cuRE9NTWF0cml4IHx8IHdpbmRvdy5XZWJLaXRDU1NNYXRyaXggfHwgd2luZG93LkNTU01hdHJpeCB8fCB3aW5kb3cuTVNDU1NNYXRyaXg7XG4gIC8qanNoaW50IC1XMDU2ICovXG5cbiAgcmV0dXJuIG1hdHJpeEZuICYmIG5ldyBtYXRyaXhGbihhcHBsaWVkVHJhbnNmb3Jtcyk7XG59XG5cbmZ1bmN0aW9uIGZpbmQoY3R4LCB0YWdOYW1lLCBpdGVyYXRvcikge1xuICBpZiAoY3R4KSB7XG4gICAgdmFyIGxpc3QgPSBjdHguZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSksXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBuID0gbGlzdC5sZW5ndGg7XG5cbiAgICBpZiAoaXRlcmF0b3IpIHtcbiAgICAgIGZvciAoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdG9yKGxpc3RbaV0sIGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCkge1xuICB2YXIgc2Nyb2xsaW5nRWxlbWVudCA9IGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQ7XG5cbiAgaWYgKHNjcm9sbGluZ0VsZW1lbnQpIHtcbiAgICByZXR1cm4gc2Nyb2xsaW5nRWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIFwiYm91bmRpbmcgY2xpZW50IHJlY3RcIiBvZiBnaXZlbiBlbGVtZW50XG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgICAgICAgICAgICAgICAgIFRoZSBlbGVtZW50IHdob3NlIGJvdW5kaW5nQ2xpZW50UmVjdCBpcyB3YW50ZWRcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gcmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jayAgV2hldGhlciB0aGUgcmVjdCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2sgb2YgKGluY2x1ZGluZykgdGhlIGNvbnRhaW5lclxuICogQHBhcmFtICB7W0Jvb2xlYW5dfSByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50ICBXaGV0aGVyIHRoZSByZWN0IHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcmVsYXRpdmUgcGFyZW50IG9mIChpbmNsdWRpbmcpIHRoZSBjb250YWllbnJcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gdW5kb1NjYWxlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgY29udGFpbmVyJ3Mgc2NhbGUoKSBzaG91bGQgYmUgdW5kb25lXG4gKiBAcGFyYW0gIHtbSFRNTEVsZW1lbnRdfSBjb250YWluZXIgICAgICAgICAgICAgIFRoZSBwYXJlbnQgdGhlIGVsZW1lbnQgd2lsbCBiZSBwbGFjZWQgaW5cbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJvdW5kaW5nQ2xpZW50UmVjdCBvZiBlbCwgd2l0aCBzcGVjaWZpZWQgYWRqdXN0bWVudHNcbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFJlY3QoZWwsIHJlbGF0aXZlVG9Db250YWluaW5nQmxvY2ssIHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQsIHVuZG9TY2FsZSwgY29udGFpbmVyKSB7XG4gIGlmICghZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmIGVsICE9PSB3aW5kb3cpIHJldHVybjtcbiAgdmFyIGVsUmVjdCwgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCBoZWlnaHQsIHdpZHRoO1xuXG4gIGlmIChlbCAhPT0gd2luZG93ICYmIGVsLnBhcmVudE5vZGUgJiYgZWwgIT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkge1xuICAgIGVsUmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRvcCA9IGVsUmVjdC50b3A7XG4gICAgbGVmdCA9IGVsUmVjdC5sZWZ0O1xuICAgIGJvdHRvbSA9IGVsUmVjdC5ib3R0b207XG4gICAgcmlnaHQgPSBlbFJlY3QucmlnaHQ7XG4gICAgaGVpZ2h0ID0gZWxSZWN0LmhlaWdodDtcbiAgICB3aWR0aCA9IGVsUmVjdC53aWR0aDtcbiAgfSBlbHNlIHtcbiAgICB0b3AgPSAwO1xuICAgIGxlZnQgPSAwO1xuICAgIGJvdHRvbSA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICByaWdodCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICB9XG5cbiAgaWYgKChyZWxhdGl2ZVRvQ29udGFpbmluZ0Jsb2NrIHx8IHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQpICYmIGVsICE9PSB3aW5kb3cpIHtcbiAgICAvLyBBZGp1c3QgZm9yIHRyYW5zbGF0ZSgpXG4gICAgY29udGFpbmVyID0gY29udGFpbmVyIHx8IGVsLnBhcmVudE5vZGU7IC8vIHNvbHZlcyAjMTEyMyAoc2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzc5NTM4MDYvNjA4ODMxMilcbiAgICAvLyBOb3QgbmVlZGVkIG9uIDw9IElFMTFcblxuICAgIGlmICghSUUxMU9yTGVzcykge1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoY29udGFpbmVyICYmIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QgJiYgKGNzcyhjb250YWluZXIsICd0cmFuc2Zvcm0nKSAhPT0gJ25vbmUnIHx8IHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQgJiYgY3NzKGNvbnRhaW5lciwgJ3Bvc2l0aW9uJykgIT09ICdzdGF0aWMnKSkge1xuICAgICAgICAgIHZhciBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyAvLyBTZXQgcmVsYXRpdmUgdG8gZWRnZXMgb2YgcGFkZGluZyBib3ggb2YgY29udGFpbmVyXG5cbiAgICAgICAgICB0b3AgLT0gY29udGFpbmVyUmVjdC50b3AgKyBwYXJzZUludChjc3MoY29udGFpbmVyLCAnYm9yZGVyLXRvcC13aWR0aCcpKTtcbiAgICAgICAgICBsZWZ0IC09IGNvbnRhaW5lclJlY3QubGVmdCArIHBhcnNlSW50KGNzcyhjb250YWluZXIsICdib3JkZXItbGVmdC13aWR0aCcpKTtcbiAgICAgICAgICBib3R0b20gPSB0b3AgKyBlbFJlY3QuaGVpZ2h0O1xuICAgICAgICAgIHJpZ2h0ID0gbGVmdCArIGVsUmVjdC53aWR0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG5cbiAgICAgIH0gd2hpbGUgKGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodW5kb1NjYWxlICYmIGVsICE9PSB3aW5kb3cpIHtcbiAgICAvLyBBZGp1c3QgZm9yIHNjYWxlKClcbiAgICB2YXIgZWxNYXRyaXggPSBtYXRyaXgoY29udGFpbmVyIHx8IGVsKSxcbiAgICAgICAgc2NhbGVYID0gZWxNYXRyaXggJiYgZWxNYXRyaXguYSxcbiAgICAgICAgc2NhbGVZID0gZWxNYXRyaXggJiYgZWxNYXRyaXguZDtcblxuICAgIGlmIChlbE1hdHJpeCkge1xuICAgICAgdG9wIC89IHNjYWxlWTtcbiAgICAgIGxlZnQgLz0gc2NhbGVYO1xuICAgICAgd2lkdGggLz0gc2NhbGVYO1xuICAgICAgaGVpZ2h0IC89IHNjYWxlWTtcbiAgICAgIGJvdHRvbSA9IHRvcCArIGhlaWdodDtcbiAgICAgIHJpZ2h0ID0gbGVmdCArIHdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiB0b3AsXG4gICAgbGVmdDogbGVmdCxcbiAgICBib3R0b206IGJvdHRvbSxcbiAgICByaWdodDogcmlnaHQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59XG4vKipcbiAqIENoZWNrcyBpZiBhIHNpZGUgb2YgYW4gZWxlbWVudCBpcyBzY3JvbGxlZCBwYXN0IGEgc2lkZSBvZiBpdHMgcGFyZW50c1xuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICBlbCAgICAgICAgICAgVGhlIGVsZW1lbnQgd2hvJ3Mgc2lkZSBiZWluZyBzY3JvbGxlZCBvdXQgb2YgdmlldyBpcyBpbiBxdWVzdGlvblxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICBlbFNpZGUgICAgICAgU2lkZSBvZiB0aGUgZWxlbWVudCBpbiBxdWVzdGlvbiAoJ3RvcCcsICdsZWZ0JywgJ3JpZ2h0JywgJ2JvdHRvbScpXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgIHBhcmVudFNpZGUgICBTaWRlIG9mIHRoZSBwYXJlbnQgaW4gcXVlc3Rpb24gKCd0b3AnLCAnbGVmdCcsICdyaWdodCcsICdib3R0b20nKVxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgICAgICAgICAgICAgVGhlIHBhcmVudCBzY3JvbGwgZWxlbWVudCB0aGF0IHRoZSBlbCdzIHNpZGUgaXMgc2Nyb2xsZWQgcGFzdCwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIGlzU2Nyb2xsZWRQYXN0KGVsLCBlbFNpZGUsIHBhcmVudFNpZGUpIHtcbiAgdmFyIHBhcmVudCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsLCB0cnVlKSxcbiAgICAgIGVsU2lkZVZhbCA9IGdldFJlY3QoZWwpW2VsU2lkZV07XG4gIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuICB3aGlsZSAocGFyZW50KSB7XG4gICAgdmFyIHBhcmVudFNpZGVWYWwgPSBnZXRSZWN0KHBhcmVudClbcGFyZW50U2lkZV0sXG4gICAgICAgIHZpc2libGUgPSB2b2lkIDA7XG5cbiAgICBpZiAocGFyZW50U2lkZSA9PT0gJ3RvcCcgfHwgcGFyZW50U2lkZSA9PT0gJ2xlZnQnKSB7XG4gICAgICB2aXNpYmxlID0gZWxTaWRlVmFsID49IHBhcmVudFNpZGVWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2libGUgPSBlbFNpZGVWYWwgPD0gcGFyZW50U2lkZVZhbDtcbiAgICB9XG5cbiAgICBpZiAoIXZpc2libGUpIHJldHVybiBwYXJlbnQ7XG4gICAgaWYgKHBhcmVudCA9PT0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpKSBicmVhaztcbiAgICBwYXJlbnQgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChwYXJlbnQsIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogR2V0cyBudGggY2hpbGQgb2YgZWwsIGlnbm9yaW5nIGhpZGRlbiBjaGlsZHJlbiwgc29ydGFibGUncyBlbGVtZW50cyAoZG9lcyBub3QgaWdub3JlIGNsb25lIGlmIGl0J3MgdmlzaWJsZSlcbiAqIGFuZCBub24tZHJhZ2dhYmxlIGVsZW1lbnRzXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgVGhlIHBhcmVudCBlbGVtZW50XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGNoaWxkTnVtICAgICAgVGhlIGluZGV4IG9mIHRoZSBjaGlsZFxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zICAgICAgIFBhcmVudCBTb3J0YWJsZSdzIG9wdGlvbnNcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICBUaGUgY2hpbGQgYXQgaW5kZXggY2hpbGROdW0sIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRDaGlsZChlbCwgY2hpbGROdW0sIG9wdGlvbnMsIGluY2x1ZGVEcmFnRWwpIHtcbiAgdmFyIGN1cnJlbnRDaGlsZCA9IDAsXG4gICAgICBpID0gMCxcbiAgICAgIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47XG5cbiAgd2hpbGUgKGkgPCBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBpZiAoY2hpbGRyZW5baV0uc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnICYmIGNoaWxkcmVuW2ldICE9PSBTb3J0YWJsZS5naG9zdCAmJiAoaW5jbHVkZURyYWdFbCB8fCBjaGlsZHJlbltpXSAhPT0gU29ydGFibGUuZHJhZ2dlZCkgJiYgY2xvc2VzdChjaGlsZHJlbltpXSwgb3B0aW9ucy5kcmFnZ2FibGUsIGVsLCBmYWxzZSkpIHtcbiAgICAgIGlmIChjdXJyZW50Q2hpbGQgPT09IGNoaWxkTnVtKSB7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbltpXTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudENoaWxkKys7XG4gICAgfVxuXG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEdldHMgdGhlIGxhc3QgY2hpbGQgaW4gdGhlIGVsLCBpZ25vcmluZyBnaG9zdEVsIG9yIGludmlzaWJsZSBlbGVtZW50cyAoY2xvbmVzKVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgICAgIFBhcmVudCBlbGVtZW50XG4gKiBAcGFyYW0gIHtzZWxlY3Rvcn0gc2VsZWN0b3IgICAgQW55IG90aGVyIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWRcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICBUaGUgbGFzdCBjaGlsZCwgaWdub3JpbmcgZ2hvc3RFbFxuICovXG5cblxuZnVuY3Rpb24gbGFzdENoaWxkKGVsLCBzZWxlY3Rvcikge1xuICB2YXIgbGFzdCA9IGVsLmxhc3RFbGVtZW50Q2hpbGQ7XG5cbiAgd2hpbGUgKGxhc3QgJiYgKGxhc3QgPT09IFNvcnRhYmxlLmdob3N0IHx8IGNzcyhsYXN0LCAnZGlzcGxheScpID09PSAnbm9uZScgfHwgc2VsZWN0b3IgJiYgIW1hdGNoZXMobGFzdCwgc2VsZWN0b3IpKSkge1xuICAgIGxhc3QgPSBsYXN0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbGFzdCB8fCBudWxsO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBhbiBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50IGZvciBhIHNlbGVjdGVkIHNldCBvZlxuICogZWxlbWVudHNcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbFxuICogQHBhcmFtICB7c2VsZWN0b3J9IHNlbGVjdG9yXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cblxuXG5mdW5jdGlvbiBpbmRleChlbCwgc2VsZWN0b3IpIHtcbiAgdmFyIGluZGV4ID0gMDtcblxuICBpZiAoIWVsIHx8ICFlbC5wYXJlbnROb2RlKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuXG4gIHdoaWxlIChlbCA9IGVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHtcbiAgICBpZiAoZWwubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gJ1RFTVBMQVRFJyAmJiBlbCAhPT0gU29ydGFibGUuY2xvbmUgJiYgKCFzZWxlY3RvciB8fCBtYXRjaGVzKGVsLCBzZWxlY3RvcikpKSB7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmRleDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgc2Nyb2xsIG9mZnNldCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgYWRkZWQgd2l0aCBhbGwgdGhlIHNjcm9sbCBvZmZzZXRzIG9mIHBhcmVudCBlbGVtZW50cy5cbiAqIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBpbiByZWFsIHBpeGVscy5cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbFxuICogQHJldHVybiB7QXJyYXl9ICAgICAgICAgICAgIE9mZnNldHMgaW4gdGhlIGZvcm1hdCBvZiBbbGVmdCwgdG9wXVxuICovXG5cblxuZnVuY3Rpb24gZ2V0UmVsYXRpdmVTY3JvbGxPZmZzZXQoZWwpIHtcbiAgdmFyIG9mZnNldExlZnQgPSAwLFxuICAgICAgb2Zmc2V0VG9wID0gMCxcbiAgICAgIHdpblNjcm9sbGVyID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuXG4gIGlmIChlbCkge1xuICAgIGRvIHtcbiAgICAgIHZhciBlbE1hdHJpeCA9IG1hdHJpeChlbCksXG4gICAgICAgICAgc2NhbGVYID0gZWxNYXRyaXguYSxcbiAgICAgICAgICBzY2FsZVkgPSBlbE1hdHJpeC5kO1xuICAgICAgb2Zmc2V0TGVmdCArPSBlbC5zY3JvbGxMZWZ0ICogc2NhbGVYO1xuICAgICAgb2Zmc2V0VG9wICs9IGVsLnNjcm9sbFRvcCAqIHNjYWxlWTtcbiAgICB9IHdoaWxlIChlbCAhPT0gd2luU2Nyb2xsZXIgJiYgKGVsID0gZWwucGFyZW50Tm9kZSkpO1xuICB9XG5cbiAgcmV0dXJuIFtvZmZzZXRMZWZ0LCBvZmZzZXRUb3BdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IHdpdGhpbiB0aGUgZ2l2ZW4gYXJyYXlcbiAqIEBwYXJhbSAge0FycmF5fSBhcnIgICBBcnJheSB0aGF0IG1heSBvciBtYXkgbm90IGhvbGQgdGhlIG9iamVjdFxuICogQHBhcmFtICB7T2JqZWN0fSBvYmogIEFuIG9iamVjdCB0aGF0IGhhcyBhIGtleS12YWx1ZSBwYWlyIHVuaXF1ZSB0byBhbmQgaWRlbnRpY2FsIHRvIGEga2V5LXZhbHVlIHBhaXIgaW4gdGhlIG9iamVjdCB5b3Ugd2FudCB0byBmaW5kXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgVGhlIGluZGV4IG9mIHRoZSBvYmplY3QgaW4gdGhlIGFycmF5LCBvciAtMVxuICovXG5cblxuZnVuY3Rpb24gaW5kZXhPZk9iamVjdChhcnIsIG9iaikge1xuICBmb3IgKHZhciBpIGluIGFycikge1xuICAgIGlmICghYXJyLmhhc093blByb3BlcnR5KGkpKSBjb250aW51ZTtcblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSAmJiBvYmpba2V5XSA9PT0gYXJyW2ldW2tleV0pIHJldHVybiBOdW1iZXIoaSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbCwgaW5jbHVkZVNlbGYpIHtcbiAgLy8gc2tpcCB0byB3aW5kb3dcbiAgaWYgKCFlbCB8fCAhZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICB2YXIgZWxlbSA9IGVsO1xuICB2YXIgZ290U2VsZiA9IGZhbHNlO1xuXG4gIGRvIHtcbiAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGdldCBlbGVtIGNzcyBpZiBpdCBpc24ndCBldmVuIG92ZXJmbG93aW5nIGluIHRoZSBmaXJzdCBwbGFjZSAocGVyZm9ybWFuY2UpXG4gICAgaWYgKGVsZW0uY2xpZW50V2lkdGggPCBlbGVtLnNjcm9sbFdpZHRoIHx8IGVsZW0uY2xpZW50SGVpZ2h0IDwgZWxlbS5zY3JvbGxIZWlnaHQpIHtcbiAgICAgIHZhciBlbGVtQ1NTID0gY3NzKGVsZW0pO1xuXG4gICAgICBpZiAoZWxlbS5jbGllbnRXaWR0aCA8IGVsZW0uc2Nyb2xsV2lkdGggJiYgKGVsZW1DU1Mub3ZlcmZsb3dYID09ICdhdXRvJyB8fCBlbGVtQ1NTLm92ZXJmbG93WCA9PSAnc2Nyb2xsJykgfHwgZWxlbS5jbGllbnRIZWlnaHQgPCBlbGVtLnNjcm9sbEhlaWdodCAmJiAoZWxlbUNTUy5vdmVyZmxvd1kgPT0gJ2F1dG8nIHx8IGVsZW1DU1Mub3ZlcmZsb3dZID09ICdzY3JvbGwnKSkge1xuICAgICAgICBpZiAoIWVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0IHx8IGVsZW0gPT09IGRvY3VtZW50LmJvZHkpIHJldHVybiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgICAgIGlmIChnb3RTZWxmIHx8IGluY2x1ZGVTZWxmKSByZXR1cm4gZWxlbTtcbiAgICAgICAgZ290U2VsZiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cblxuICB9IHdoaWxlIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKTtcblxuICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xufVxuXG5mdW5jdGlvbiBleHRlbmQoZHN0LCBzcmMpIHtcbiAgaWYgKGRzdCAmJiBzcmMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICBpZiAoc3JjLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgZHN0W2tleV0gPSBzcmNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZHN0O1xufVxuXG5mdW5jdGlvbiBpc1JlY3RFcXVhbChyZWN0MSwgcmVjdDIpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQocmVjdDEudG9wKSA9PT0gTWF0aC5yb3VuZChyZWN0Mi50b3ApICYmIE1hdGgucm91bmQocmVjdDEubGVmdCkgPT09IE1hdGgucm91bmQocmVjdDIubGVmdCkgJiYgTWF0aC5yb3VuZChyZWN0MS5oZWlnaHQpID09PSBNYXRoLnJvdW5kKHJlY3QyLmhlaWdodCkgJiYgTWF0aC5yb3VuZChyZWN0MS53aWR0aCkgPT09IE1hdGgucm91bmQocmVjdDIud2lkdGgpO1xufVxuXG52YXIgX3Rocm90dGxlVGltZW91dDtcblxuZnVuY3Rpb24gdGhyb3R0bGUoY2FsbGJhY2ssIG1zKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFfdGhyb3R0bGVUaW1lb3V0KSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjYWxsYmFjay5jYWxsKF90aGlzLCBhcmdzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KF90aGlzLCBhcmdzKTtcbiAgICAgIH1cblxuICAgICAgX3Rocm90dGxlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhyb3R0bGVUaW1lb3V0ID0gdm9pZCAwO1xuICAgICAgfSwgbXMpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2FuY2VsVGhyb3R0bGUoKSB7XG4gIGNsZWFyVGltZW91dChfdGhyb3R0bGVUaW1lb3V0KTtcbiAgX3Rocm90dGxlVGltZW91dCA9IHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gc2Nyb2xsQnkoZWwsIHgsIHkpIHtcbiAgZWwuc2Nyb2xsTGVmdCArPSB4O1xuICBlbC5zY3JvbGxUb3AgKz0geTtcbn1cblxuZnVuY3Rpb24gY2xvbmUoZWwpIHtcbiAgdmFyIFBvbHltZXIgPSB3aW5kb3cuUG9seW1lcjtcbiAgdmFyICQgPSB3aW5kb3cualF1ZXJ5IHx8IHdpbmRvdy5aZXB0bztcblxuICBpZiAoUG9seW1lciAmJiBQb2x5bWVyLmRvbSkge1xuICAgIHJldHVybiBQb2x5bWVyLmRvbShlbCkuY2xvbmVOb2RlKHRydWUpO1xuICB9IGVsc2UgaWYgKCQpIHtcbiAgICByZXR1cm4gJChlbCkuY2xvbmUodHJ1ZSlbMF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVsLmNsb25lTm9kZSh0cnVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZWN0KGVsLCByZWN0KSB7XG4gIGNzcyhlbCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gIGNzcyhlbCwgJ3RvcCcsIHJlY3QudG9wKTtcbiAgY3NzKGVsLCAnbGVmdCcsIHJlY3QubGVmdCk7XG4gIGNzcyhlbCwgJ3dpZHRoJywgcmVjdC53aWR0aCk7XG4gIGNzcyhlbCwgJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KTtcbn1cblxuZnVuY3Rpb24gdW5zZXRSZWN0KGVsKSB7XG4gIGNzcyhlbCwgJ3Bvc2l0aW9uJywgJycpO1xuICBjc3MoZWwsICd0b3AnLCAnJyk7XG4gIGNzcyhlbCwgJ2xlZnQnLCAnJyk7XG4gIGNzcyhlbCwgJ3dpZHRoJywgJycpO1xuICBjc3MoZWwsICdoZWlnaHQnLCAnJyk7XG59XG5cbnZhciBleHBhbmRvID0gJ1NvcnRhYmxlJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG5mdW5jdGlvbiBBbmltYXRpb25TdGF0ZU1hbmFnZXIoKSB7XG4gIHZhciBhbmltYXRpb25TdGF0ZXMgPSBbXSxcbiAgICAgIGFuaW1hdGlvbkNhbGxiYWNrSWQ7XG4gIHJldHVybiB7XG4gICAgY2FwdHVyZUFuaW1hdGlvblN0YXRlOiBmdW5jdGlvbiBjYXB0dXJlQW5pbWF0aW9uU3RhdGUoKSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMgPSBbXTtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFuaW1hdGlvbikgcmV0dXJuO1xuICAgICAgdmFyIGNoaWxkcmVuID0gW10uc2xpY2UuY2FsbCh0aGlzLmVsLmNoaWxkcmVuKTtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmIChjc3MoY2hpbGQsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBjaGlsZCA9PT0gU29ydGFibGUuZ2hvc3QpIHJldHVybjtcbiAgICAgICAgYW5pbWF0aW9uU3RhdGVzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogY2hpbGQsXG4gICAgICAgICAgcmVjdDogZ2V0UmVjdChjaGlsZClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGZyb21SZWN0ID0gX29iamVjdFNwcmVhZDIoe30sIGFuaW1hdGlvblN0YXRlc1thbmltYXRpb25TdGF0ZXMubGVuZ3RoIC0gMV0ucmVjdCk7IC8vIElmIGFuaW1hdGluZzogY29tcGVuc2F0ZSBmb3IgY3VycmVudCBhbmltYXRpb25cblxuXG4gICAgICAgIGlmIChjaGlsZC50aGlzQW5pbWF0aW9uRHVyYXRpb24pIHtcbiAgICAgICAgICB2YXIgY2hpbGRNYXRyaXggPSBtYXRyaXgoY2hpbGQsIHRydWUpO1xuXG4gICAgICAgICAgaWYgKGNoaWxkTWF0cml4KSB7XG4gICAgICAgICAgICBmcm9tUmVjdC50b3AgLT0gY2hpbGRNYXRyaXguZjtcbiAgICAgICAgICAgIGZyb21SZWN0LmxlZnQgLT0gY2hpbGRNYXRyaXguZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZC5mcm9tUmVjdCA9IGZyb21SZWN0O1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBhZGRBbmltYXRpb25TdGF0ZTogZnVuY3Rpb24gYWRkQW5pbWF0aW9uU3RhdGUoc3RhdGUpIHtcbiAgICAgIGFuaW1hdGlvblN0YXRlcy5wdXNoKHN0YXRlKTtcbiAgICB9LFxuICAgIHJlbW92ZUFuaW1hdGlvblN0YXRlOiBmdW5jdGlvbiByZW1vdmVBbmltYXRpb25TdGF0ZSh0YXJnZXQpIHtcbiAgICAgIGFuaW1hdGlvblN0YXRlcy5zcGxpY2UoaW5kZXhPZk9iamVjdChhbmltYXRpb25TdGF0ZXMsIHtcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICAgIH0pLCAxKTtcbiAgICB9LFxuICAgIGFuaW1hdGVBbGw6IGZ1bmN0aW9uIGFuaW1hdGVBbGwoY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICBjbGVhclRpbWVvdXQoYW5pbWF0aW9uQ2FsbGJhY2tJZCk7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGFuaW1hdGluZyA9IGZhbHNlLFxuICAgICAgICAgIGFuaW1hdGlvblRpbWUgPSAwO1xuICAgICAgYW5pbWF0aW9uU3RhdGVzLmZvckVhY2goZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHZhciB0aW1lID0gMCxcbiAgICAgICAgICAgIHRhcmdldCA9IHN0YXRlLnRhcmdldCxcbiAgICAgICAgICAgIGZyb21SZWN0ID0gdGFyZ2V0LmZyb21SZWN0LFxuICAgICAgICAgICAgdG9SZWN0ID0gZ2V0UmVjdCh0YXJnZXQpLFxuICAgICAgICAgICAgcHJldkZyb21SZWN0ID0gdGFyZ2V0LnByZXZGcm9tUmVjdCxcbiAgICAgICAgICAgIHByZXZUb1JlY3QgPSB0YXJnZXQucHJldlRvUmVjdCxcbiAgICAgICAgICAgIGFuaW1hdGluZ1JlY3QgPSBzdGF0ZS5yZWN0LFxuICAgICAgICAgICAgdGFyZ2V0TWF0cml4ID0gbWF0cml4KHRhcmdldCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKHRhcmdldE1hdHJpeCkge1xuICAgICAgICAgIC8vIENvbXBlbnNhdGUgZm9yIGN1cnJlbnQgYW5pbWF0aW9uXG4gICAgICAgICAgdG9SZWN0LnRvcCAtPSB0YXJnZXRNYXRyaXguZjtcbiAgICAgICAgICB0b1JlY3QubGVmdCAtPSB0YXJnZXRNYXRyaXguZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldC50b1JlY3QgPSB0b1JlY3Q7XG5cbiAgICAgICAgaWYgKHRhcmdldC50aGlzQW5pbWF0aW9uRHVyYXRpb24pIHtcbiAgICAgICAgICAvLyBDb3VsZCBhbHNvIGNoZWNrIGlmIGFuaW1hdGluZ1JlY3QgaXMgYmV0d2VlbiBmcm9tUmVjdCBhbmQgdG9SZWN0XG4gICAgICAgICAgaWYgKGlzUmVjdEVxdWFsKHByZXZGcm9tUmVjdCwgdG9SZWN0KSAmJiAhaXNSZWN0RXF1YWwoZnJvbVJlY3QsIHRvUmVjdCkgJiYgLy8gTWFrZSBzdXJlIGFuaW1hdGluZ1JlY3QgaXMgb24gbGluZSBiZXR3ZWVuIHRvUmVjdCAmIGZyb21SZWN0XG4gICAgICAgICAgKGFuaW1hdGluZ1JlY3QudG9wIC0gdG9SZWN0LnRvcCkgLyAoYW5pbWF0aW5nUmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQpID09PSAoZnJvbVJlY3QudG9wIC0gdG9SZWN0LnRvcCkgLyAoZnJvbVJlY3QubGVmdCAtIHRvUmVjdC5sZWZ0KSkge1xuICAgICAgICAgICAgLy8gSWYgcmV0dXJuaW5nIHRvIHNhbWUgcGxhY2UgYXMgc3RhcnRlZCBmcm9tIGFuaW1hdGlvbiBhbmQgb24gc2FtZSBheGlzXG4gICAgICAgICAgICB0aW1lID0gY2FsY3VsYXRlUmVhbFRpbWUoYW5pbWF0aW5nUmVjdCwgcHJldkZyb21SZWN0LCBwcmV2VG9SZWN0LCBfdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gaWYgZnJvbVJlY3QgIT0gdG9SZWN0OiBhbmltYXRlXG5cblxuICAgICAgICBpZiAoIWlzUmVjdEVxdWFsKHRvUmVjdCwgZnJvbVJlY3QpKSB7XG4gICAgICAgICAgdGFyZ2V0LnByZXZGcm9tUmVjdCA9IGZyb21SZWN0O1xuICAgICAgICAgIHRhcmdldC5wcmV2VG9SZWN0ID0gdG9SZWN0O1xuXG4gICAgICAgICAgaWYgKCF0aW1lKSB7XG4gICAgICAgICAgICB0aW1lID0gX3RoaXMub3B0aW9ucy5hbmltYXRpb247XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMuYW5pbWF0ZSh0YXJnZXQsIGFuaW1hdGluZ1JlY3QsIHRvUmVjdCwgdGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGltZSkge1xuICAgICAgICAgIGFuaW1hdGluZyA9IHRydWU7XG4gICAgICAgICAgYW5pbWF0aW9uVGltZSA9IE1hdGgubWF4KGFuaW1hdGlvblRpbWUsIHRpbWUpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0YXJnZXQuYW5pbWF0aW9uUmVzZXRUaW1lcik7XG4gICAgICAgICAgdGFyZ2V0LmFuaW1hdGlvblJlc2V0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRhcmdldC5hbmltYXRpb25UaW1lID0gMDtcbiAgICAgICAgICAgIHRhcmdldC5wcmV2RnJvbVJlY3QgPSBudWxsO1xuICAgICAgICAgICAgdGFyZ2V0LmZyb21SZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRhcmdldC5wcmV2VG9SZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRhcmdldC50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICAgIH0sIHRpbWUpO1xuICAgICAgICAgIHRhcmdldC50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSB0aW1lO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNsZWFyVGltZW91dChhbmltYXRpb25DYWxsYmFja0lkKTtcblxuICAgICAgaWYgKCFhbmltYXRpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFuaW1hdGlvbkNhbGxiYWNrSWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgICB9LCBhbmltYXRpb25UaW1lKTtcbiAgICAgIH1cblxuICAgICAgYW5pbWF0aW9uU3RhdGVzID0gW107XG4gICAgfSxcbiAgICBhbmltYXRlOiBmdW5jdGlvbiBhbmltYXRlKHRhcmdldCwgY3VycmVudFJlY3QsIHRvUmVjdCwgZHVyYXRpb24pIHtcbiAgICAgIGlmIChkdXJhdGlvbikge1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNpdGlvbicsICcnKTtcbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICcnKTtcbiAgICAgICAgdmFyIGVsTWF0cml4ID0gbWF0cml4KHRoaXMuZWwpLFxuICAgICAgICAgICAgc2NhbGVYID0gZWxNYXRyaXggJiYgZWxNYXRyaXguYSxcbiAgICAgICAgICAgIHNjYWxlWSA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmQsXG4gICAgICAgICAgICB0cmFuc2xhdGVYID0gKGN1cnJlbnRSZWN0LmxlZnQgLSB0b1JlY3QubGVmdCkgLyAoc2NhbGVYIHx8IDEpLFxuICAgICAgICAgICAgdHJhbnNsYXRlWSA9IChjdXJyZW50UmVjdC50b3AgLSB0b1JlY3QudG9wKSAvIChzY2FsZVkgfHwgMSk7XG4gICAgICAgIHRhcmdldC5hbmltYXRpbmdYID0gISF0cmFuc2xhdGVYO1xuICAgICAgICB0YXJnZXQuYW5pbWF0aW5nWSA9ICEhdHJhbnNsYXRlWTtcbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUzZCgnICsgdHJhbnNsYXRlWCArICdweCwnICsgdHJhbnNsYXRlWSArICdweCwwKScpO1xuICAgICAgICB0aGlzLmZvclJlcGFpbnREdW1teSA9IHJlcGFpbnQodGFyZ2V0KTsgLy8gcmVwYWludFxuXG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2l0aW9uJywgJ3RyYW5zZm9ybSAnICsgZHVyYXRpb24gKyAnbXMnICsgKHRoaXMub3B0aW9ucy5lYXNpbmcgPyAnICcgKyB0aGlzLm9wdGlvbnMuZWFzaW5nIDogJycpKTtcbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUzZCgwLDAsMCknKTtcbiAgICAgICAgdHlwZW9mIHRhcmdldC5hbmltYXRlZCA9PT0gJ251bWJlcicgJiYgY2xlYXJUaW1lb3V0KHRhcmdldC5hbmltYXRlZCk7XG4gICAgICAgIHRhcmdldC5hbmltYXRlZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2l0aW9uJywgJycpO1xuICAgICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgICAgICAgdGFyZ2V0LmFuaW1hdGVkID0gZmFsc2U7XG4gICAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1ggPSBmYWxzZTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0aW5nWSA9IGZhbHNlO1xuICAgICAgICB9LCBkdXJhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiByZXBhaW50KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0Lm9mZnNldFdpZHRoO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVSZWFsVGltZShhbmltYXRpbmdSZWN0LCBmcm9tUmVjdCwgdG9SZWN0LCBvcHRpb25zKSB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coZnJvbVJlY3QudG9wIC0gYW5pbWF0aW5nUmVjdC50b3AsIDIpICsgTWF0aC5wb3coZnJvbVJlY3QubGVmdCAtIGFuaW1hdGluZ1JlY3QubGVmdCwgMikpIC8gTWF0aC5zcXJ0KE1hdGgucG93KGZyb21SZWN0LnRvcCAtIHRvUmVjdC50b3AsIDIpICsgTWF0aC5wb3coZnJvbVJlY3QubGVmdCAtIHRvUmVjdC5sZWZ0LCAyKSkgKiBvcHRpb25zLmFuaW1hdGlvbjtcbn1cblxudmFyIHBsdWdpbnMgPSBbXTtcbnZhciBkZWZhdWx0cyA9IHtcbiAgaW5pdGlhbGl6ZUJ5RGVmYXVsdDogdHJ1ZVxufTtcbnZhciBQbHVnaW5NYW5hZ2VyID0ge1xuICBtb3VudDogZnVuY3Rpb24gbW91bnQocGx1Z2luKSB7XG4gICAgLy8gU2V0IGRlZmF1bHQgc3RhdGljIHByb3BlcnRpZXNcbiAgICBmb3IgKHZhciBvcHRpb24gaW4gZGVmYXVsdHMpIHtcbiAgICAgIGlmIChkZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShvcHRpb24pICYmICEob3B0aW9uIGluIHBsdWdpbikpIHtcbiAgICAgICAgcGx1Z2luW29wdGlvbl0gPSBkZWZhdWx0c1tvcHRpb25dO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKHAucGx1Z2luTmFtZSA9PT0gcGx1Z2luLnBsdWdpbk5hbWUpIHtcbiAgICAgICAgdGhyb3cgXCJTb3J0YWJsZTogQ2Fubm90IG1vdW50IHBsdWdpbiBcIi5jb25jYXQocGx1Z2luLnBsdWdpbk5hbWUsIFwiIG1vcmUgdGhhbiBvbmNlXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHBsdWdpbnMucHVzaChwbHVnaW4pO1xuICB9LFxuICBwbHVnaW5FdmVudDogZnVuY3Rpb24gcGx1Z2luRXZlbnQoZXZlbnROYW1lLCBzb3J0YWJsZSwgZXZ0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuZXZlbnRDYW5jZWxlZCA9IGZhbHNlO1xuXG4gICAgZXZ0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmV2ZW50Q2FuY2VsZWQgPSB0cnVlO1xuICAgIH07XG5cbiAgICB2YXIgZXZlbnROYW1lR2xvYmFsID0gZXZlbnROYW1lICsgJ0dsb2JhbCc7XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIGlmICghc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdKSByZXR1cm47IC8vIEZpcmUgZ2xvYmFsIGV2ZW50cyBpZiBpdCBleGlzdHMgaW4gdGhpcyBzb3J0YWJsZVxuXG4gICAgICBpZiAoc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdW2V2ZW50TmFtZUdsb2JhbF0pIHtcbiAgICAgICAgc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdW2V2ZW50TmFtZUdsb2JhbF0oX29iamVjdFNwcmVhZDIoe1xuICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZVxuICAgICAgICB9LCBldnQpKTtcbiAgICAgIH0gLy8gT25seSBmaXJlIHBsdWdpbiBldmVudCBpZiBwbHVnaW4gaXMgZW5hYmxlZCBpbiB0aGlzIHNvcnRhYmxlLFxuICAgICAgLy8gYW5kIHBsdWdpbiBoYXMgZXZlbnQgZGVmaW5lZFxuXG5cbiAgICAgIGlmIChzb3J0YWJsZS5vcHRpb25zW3BsdWdpbi5wbHVnaW5OYW1lXSAmJiBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lXSkge1xuICAgICAgICBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lXShfb2JqZWN0U3ByZWFkMih7XG4gICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlXG4gICAgICAgIH0sIGV2dCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICBpbml0aWFsaXplUGx1Z2luczogZnVuY3Rpb24gaW5pdGlhbGl6ZVBsdWdpbnMoc29ydGFibGUsIGVsLCBkZWZhdWx0cywgb3B0aW9ucykge1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICB2YXIgcGx1Z2luTmFtZSA9IHBsdWdpbi5wbHVnaW5OYW1lO1xuICAgICAgaWYgKCFzb3J0YWJsZS5vcHRpb25zW3BsdWdpbk5hbWVdICYmICFwbHVnaW4uaW5pdGlhbGl6ZUJ5RGVmYXVsdCkgcmV0dXJuO1xuICAgICAgdmFyIGluaXRpYWxpemVkID0gbmV3IHBsdWdpbihzb3J0YWJsZSwgZWwsIHNvcnRhYmxlLm9wdGlvbnMpO1xuICAgICAgaW5pdGlhbGl6ZWQuc29ydGFibGUgPSBzb3J0YWJsZTtcbiAgICAgIGluaXRpYWxpemVkLm9wdGlvbnMgPSBzb3J0YWJsZS5vcHRpb25zO1xuICAgICAgc29ydGFibGVbcGx1Z2luTmFtZV0gPSBpbml0aWFsaXplZDsgLy8gQWRkIGRlZmF1bHQgb3B0aW9ucyBmcm9tIHBsdWdpblxuXG4gICAgICBfZXh0ZW5kcyhkZWZhdWx0cywgaW5pdGlhbGl6ZWQuZGVmYXVsdHMpO1xuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgb3B0aW9uIGluIHNvcnRhYmxlLm9wdGlvbnMpIHtcbiAgICAgIGlmICghc29ydGFibGUub3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHRpb24pKSBjb250aW51ZTtcbiAgICAgIHZhciBtb2RpZmllZCA9IHRoaXMubW9kaWZ5T3B0aW9uKHNvcnRhYmxlLCBvcHRpb24sIHNvcnRhYmxlLm9wdGlvbnNbb3B0aW9uXSk7XG5cbiAgICAgIGlmICh0eXBlb2YgbW9kaWZpZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvcnRhYmxlLm9wdGlvbnNbb3B0aW9uXSA9IG1vZGlmaWVkO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZ2V0RXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBnZXRFdmVudFByb3BlcnRpZXMobmFtZSwgc29ydGFibGUpIHtcbiAgICB2YXIgZXZlbnRQcm9wZXJ0aWVzID0ge307XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIGlmICh0eXBlb2YgcGx1Z2luLmV2ZW50UHJvcGVydGllcyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuXG4gICAgICBfZXh0ZW5kcyhldmVudFByb3BlcnRpZXMsIHBsdWdpbi5ldmVudFByb3BlcnRpZXMuY2FsbChzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0sIG5hbWUpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZXZlbnRQcm9wZXJ0aWVzO1xuICB9LFxuICBtb2RpZnlPcHRpb246IGZ1bmN0aW9uIG1vZGlmeU9wdGlvbihzb3J0YWJsZSwgbmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgbW9kaWZpZWRWYWx1ZTtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgLy8gUGx1Z2luIG11c3QgZXhpc3Qgb24gdGhlIFNvcnRhYmxlXG4gICAgICBpZiAoIXNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSkgcmV0dXJuOyAvLyBJZiBzdGF0aWMgb3B0aW9uIGxpc3RlbmVyIGV4aXN0cyBmb3IgdGhpcyBvcHRpb24sIGNhbGwgaW4gdGhlIGNvbnRleHQgb2YgdGhlIFNvcnRhYmxlJ3MgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW5cblxuICAgICAgaWYgKHBsdWdpbi5vcHRpb25MaXN0ZW5lcnMgJiYgdHlwZW9mIHBsdWdpbi5vcHRpb25MaXN0ZW5lcnNbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbW9kaWZpZWRWYWx1ZSA9IHBsdWdpbi5vcHRpb25MaXN0ZW5lcnNbbmFtZV0uY2FsbChzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbW9kaWZpZWRWYWx1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChfcmVmKSB7XG4gIHZhciBzb3J0YWJsZSA9IF9yZWYuc29ydGFibGUsXG4gICAgICByb290RWwgPSBfcmVmLnJvb3RFbCxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICB0YXJnZXRFbCA9IF9yZWYudGFyZ2V0RWwsXG4gICAgICBjbG9uZUVsID0gX3JlZi5jbG9uZUVsLFxuICAgICAgdG9FbCA9IF9yZWYudG9FbCxcbiAgICAgIGZyb21FbCA9IF9yZWYuZnJvbUVsLFxuICAgICAgb2xkSW5kZXggPSBfcmVmLm9sZEluZGV4LFxuICAgICAgbmV3SW5kZXggPSBfcmVmLm5ld0luZGV4LFxuICAgICAgb2xkRHJhZ2dhYmxlSW5kZXggPSBfcmVmLm9sZERyYWdnYWJsZUluZGV4LFxuICAgICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBfcmVmLm5ld0RyYWdnYWJsZUluZGV4LFxuICAgICAgb3JpZ2luYWxFdmVudCA9IF9yZWYub3JpZ2luYWxFdmVudCxcbiAgICAgIHB1dFNvcnRhYmxlID0gX3JlZi5wdXRTb3J0YWJsZSxcbiAgICAgIGV4dHJhRXZlbnRQcm9wZXJ0aWVzID0gX3JlZi5leHRyYUV2ZW50UHJvcGVydGllcztcbiAgc29ydGFibGUgPSBzb3J0YWJsZSB8fCByb290RWwgJiYgcm9vdEVsW2V4cGFuZG9dO1xuICBpZiAoIXNvcnRhYmxlKSByZXR1cm47XG4gIHZhciBldnQsXG4gICAgICBvcHRpb25zID0gc29ydGFibGUub3B0aW9ucyxcbiAgICAgIG9uTmFtZSA9ICdvbicgKyBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zdWJzdHIoMSk7IC8vIFN1cHBvcnQgZm9yIG5ldyBDdXN0b21FdmVudCBmZWF0dXJlXG5cbiAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiAhSUUxMU9yTGVzcyAmJiAhRWRnZSkge1xuICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2dC5pbml0RXZlbnQobmFtZSwgdHJ1ZSwgdHJ1ZSk7XG4gIH1cblxuICBldnQudG8gPSB0b0VsIHx8IHJvb3RFbDtcbiAgZXZ0LmZyb20gPSBmcm9tRWwgfHwgcm9vdEVsO1xuICBldnQuaXRlbSA9IHRhcmdldEVsIHx8IHJvb3RFbDtcbiAgZXZ0LmNsb25lID0gY2xvbmVFbDtcbiAgZXZ0Lm9sZEluZGV4ID0gb2xkSW5kZXg7XG4gIGV2dC5uZXdJbmRleCA9IG5ld0luZGV4O1xuICBldnQub2xkRHJhZ2dhYmxlSW5kZXggPSBvbGREcmFnZ2FibGVJbmRleDtcbiAgZXZ0Lm5ld0RyYWdnYWJsZUluZGV4ID0gbmV3RHJhZ2dhYmxlSW5kZXg7XG4gIGV2dC5vcmlnaW5hbEV2ZW50ID0gb3JpZ2luYWxFdmVudDtcbiAgZXZ0LnB1bGxNb2RlID0gcHV0U29ydGFibGUgPyBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSA6IHVuZGVmaW5lZDtcblxuICB2YXIgYWxsRXZlbnRQcm9wZXJ0aWVzID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGV4dHJhRXZlbnRQcm9wZXJ0aWVzKSwgUGx1Z2luTWFuYWdlci5nZXRFdmVudFByb3BlcnRpZXMobmFtZSwgc29ydGFibGUpKTtcblxuICBmb3IgKHZhciBvcHRpb24gaW4gYWxsRXZlbnRQcm9wZXJ0aWVzKSB7XG4gICAgZXZ0W29wdGlvbl0gPSBhbGxFdmVudFByb3BlcnRpZXNbb3B0aW9uXTtcbiAgfVxuXG4gIGlmIChyb290RWwpIHtcbiAgICByb290RWwuZGlzcGF0Y2hFdmVudChldnQpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnNbb25OYW1lXSkge1xuICAgIG9wdGlvbnNbb25OYW1lXS5jYWxsKHNvcnRhYmxlLCBldnQpO1xuICB9XG59XG5cbnZhciBfZXhjbHVkZWQgPSBbXCJldnRcIl07XG5cbnZhciBwbHVnaW5FdmVudCA9IGZ1bmN0aW9uIHBsdWdpbkV2ZW50KGV2ZW50TmFtZSwgc29ydGFibGUpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9LFxuICAgICAgb3JpZ2luYWxFdmVudCA9IF9yZWYuZXZ0LFxuICAgICAgZGF0YSA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIFBsdWdpbk1hbmFnZXIucGx1Z2luRXZlbnQuYmluZChTb3J0YWJsZSkoZXZlbnROYW1lLCBzb3J0YWJsZSwgX29iamVjdFNwcmVhZDIoe1xuICAgIGRyYWdFbDogZHJhZ0VsLFxuICAgIHBhcmVudEVsOiBwYXJlbnRFbCxcbiAgICBnaG9zdEVsOiBnaG9zdEVsLFxuICAgIHJvb3RFbDogcm9vdEVsLFxuICAgIG5leHRFbDogbmV4dEVsLFxuICAgIGxhc3REb3duRWw6IGxhc3REb3duRWwsXG4gICAgY2xvbmVFbDogY2xvbmVFbCxcbiAgICBjbG9uZUhpZGRlbjogY2xvbmVIaWRkZW4sXG4gICAgZHJhZ1N0YXJ0ZWQ6IG1vdmVkLFxuICAgIHB1dFNvcnRhYmxlOiBwdXRTb3J0YWJsZSxcbiAgICBhY3RpdmVTb3J0YWJsZTogU29ydGFibGUuYWN0aXZlLFxuICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnQsXG4gICAgb2xkSW5kZXg6IG9sZEluZGV4LFxuICAgIG9sZERyYWdnYWJsZUluZGV4OiBvbGREcmFnZ2FibGVJbmRleCxcbiAgICBuZXdJbmRleDogbmV3SW5kZXgsXG4gICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4LFxuICAgIGhpZGVHaG9zdEZvclRhcmdldDogX2hpZGVHaG9zdEZvclRhcmdldCxcbiAgICB1bmhpZGVHaG9zdEZvclRhcmdldDogX3VuaGlkZUdob3N0Rm9yVGFyZ2V0LFxuICAgIGNsb25lTm93SGlkZGVuOiBmdW5jdGlvbiBjbG9uZU5vd0hpZGRlbigpIHtcbiAgICAgIGNsb25lSGlkZGVuID0gdHJ1ZTtcbiAgICB9LFxuICAgIGNsb25lTm93U2hvd246IGZ1bmN0aW9uIGNsb25lTm93U2hvd24oKSB7XG4gICAgICBjbG9uZUhpZGRlbiA9IGZhbHNlO1xuICAgIH0sXG4gICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50OiBmdW5jdGlvbiBkaXNwYXRjaFNvcnRhYmxlRXZlbnQobmFtZSkge1xuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgZGF0YSkpO1xufTtcblxuZnVuY3Rpb24gX2Rpc3BhdGNoRXZlbnQoaW5mbykge1xuICBkaXNwYXRjaEV2ZW50KF9vYmplY3RTcHJlYWQyKHtcbiAgICBwdXRTb3J0YWJsZTogcHV0U29ydGFibGUsXG4gICAgY2xvbmVFbDogY2xvbmVFbCxcbiAgICB0YXJnZXRFbDogZHJhZ0VsLFxuICAgIHJvb3RFbDogcm9vdEVsLFxuICAgIG9sZEluZGV4OiBvbGRJbmRleCxcbiAgICBvbGREcmFnZ2FibGVJbmRleDogb2xkRHJhZ2dhYmxlSW5kZXgsXG4gICAgbmV3SW5kZXg6IG5ld0luZGV4LFxuICAgIG5ld0RyYWdnYWJsZUluZGV4OiBuZXdEcmFnZ2FibGVJbmRleFxuICB9LCBpbmZvKSk7XG59XG5cbnZhciBkcmFnRWwsXG4gICAgcGFyZW50RWwsXG4gICAgZ2hvc3RFbCxcbiAgICByb290RWwsXG4gICAgbmV4dEVsLFxuICAgIGxhc3REb3duRWwsXG4gICAgY2xvbmVFbCxcbiAgICBjbG9uZUhpZGRlbixcbiAgICBvbGRJbmRleCxcbiAgICBuZXdJbmRleCxcbiAgICBvbGREcmFnZ2FibGVJbmRleCxcbiAgICBuZXdEcmFnZ2FibGVJbmRleCxcbiAgICBhY3RpdmVHcm91cCxcbiAgICBwdXRTb3J0YWJsZSxcbiAgICBhd2FpdGluZ0RyYWdTdGFydGVkID0gZmFsc2UsXG4gICAgaWdub3JlTmV4dENsaWNrID0gZmFsc2UsXG4gICAgc29ydGFibGVzID0gW10sXG4gICAgdGFwRXZ0LFxuICAgIHRvdWNoRXZ0LFxuICAgIGxhc3REeCxcbiAgICBsYXN0RHksXG4gICAgdGFwRGlzdGFuY2VMZWZ0LFxuICAgIHRhcERpc3RhbmNlVG9wLFxuICAgIG1vdmVkLFxuICAgIGxhc3RUYXJnZXQsXG4gICAgbGFzdERpcmVjdGlvbixcbiAgICBwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggPSBmYWxzZSxcbiAgICBpc0NpcmN1bXN0YW50aWFsSW52ZXJ0ID0gZmFsc2UsXG4gICAgdGFyZ2V0TW92ZURpc3RhbmNlLFxuICAgIC8vIEZvciBwb3NpdGlvbmluZyBnaG9zdCBhYnNvbHV0ZWx5XG5naG9zdFJlbGF0aXZlUGFyZW50LFxuICAgIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsID0gW10sXG4gICAgLy8gKGxlZnQsIHRvcClcbl9zaWxlbnQgPSBmYWxzZSxcbiAgICBzYXZlZElucHV0Q2hlY2tlZCA9IFtdO1xuLyoqIEBjb25zdCAqL1xuXG52YXIgZG9jdW1lbnRFeGlzdHMgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnLFxuICAgIFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5ID0gSU9TLFxuICAgIENTU0Zsb2F0UHJvcGVydHkgPSBFZGdlIHx8IElFMTFPckxlc3MgPyAnY3NzRmxvYXQnIDogJ2Zsb2F0JyxcbiAgICAvLyBUaGlzIHdpbGwgbm90IHBhc3MgZm9yIElFOSwgYmVjYXVzZSBJRTkgRG5EIG9ubHkgd29ya3Mgb24gYW5jaG9yc1xuc3VwcG9ydERyYWdnYWJsZSA9IGRvY3VtZW50RXhpc3RzICYmICFDaHJvbWVGb3JBbmRyb2lkICYmICFJT1MgJiYgJ2RyYWdnYWJsZScgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gICAgc3VwcG9ydENzc1BvaW50ZXJFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghZG9jdW1lbnRFeGlzdHMpIHJldHVybjsgLy8gZmFsc2Ugd2hlbiA8PSBJRTExXG5cbiAgaWYgKElFMTFPckxlc3MpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd4Jyk7XG4gIGVsLnN0eWxlLmNzc1RleHQgPSAncG9pbnRlci1ldmVudHM6YXV0byc7XG4gIHJldHVybiBlbC5zdHlsZS5wb2ludGVyRXZlbnRzID09PSAnYXV0byc7XG59KCksXG4gICAgX2RldGVjdERpcmVjdGlvbiA9IGZ1bmN0aW9uIF9kZXRlY3REaXJlY3Rpb24oZWwsIG9wdGlvbnMpIHtcbiAgdmFyIGVsQ1NTID0gY3NzKGVsKSxcbiAgICAgIGVsV2lkdGggPSBwYXJzZUludChlbENTUy53aWR0aCkgLSBwYXJzZUludChlbENTUy5wYWRkaW5nTGVmdCkgLSBwYXJzZUludChlbENTUy5wYWRkaW5nUmlnaHQpIC0gcGFyc2VJbnQoZWxDU1MuYm9yZGVyTGVmdFdpZHRoKSAtIHBhcnNlSW50KGVsQ1NTLmJvcmRlclJpZ2h0V2lkdGgpLFxuICAgICAgY2hpbGQxID0gZ2V0Q2hpbGQoZWwsIDAsIG9wdGlvbnMpLFxuICAgICAgY2hpbGQyID0gZ2V0Q2hpbGQoZWwsIDEsIG9wdGlvbnMpLFxuICAgICAgZmlyc3RDaGlsZENTUyA9IGNoaWxkMSAmJiBjc3MoY2hpbGQxKSxcbiAgICAgIHNlY29uZENoaWxkQ1NTID0gY2hpbGQyICYmIGNzcyhjaGlsZDIpLFxuICAgICAgZmlyc3RDaGlsZFdpZHRoID0gZmlyc3RDaGlsZENTUyAmJiBwYXJzZUludChmaXJzdENoaWxkQ1NTLm1hcmdpbkxlZnQpICsgcGFyc2VJbnQoZmlyc3RDaGlsZENTUy5tYXJnaW5SaWdodCkgKyBnZXRSZWN0KGNoaWxkMSkud2lkdGgsXG4gICAgICBzZWNvbmRDaGlsZFdpZHRoID0gc2Vjb25kQ2hpbGRDU1MgJiYgcGFyc2VJbnQoc2Vjb25kQ2hpbGRDU1MubWFyZ2luTGVmdCkgKyBwYXJzZUludChzZWNvbmRDaGlsZENTUy5tYXJnaW5SaWdodCkgKyBnZXRSZWN0KGNoaWxkMikud2lkdGg7XG5cbiAgaWYgKGVsQ1NTLmRpc3BsYXkgPT09ICdmbGV4Jykge1xuICAgIHJldHVybiBlbENTUy5mbGV4RGlyZWN0aW9uID09PSAnY29sdW1uJyB8fCBlbENTUy5mbGV4RGlyZWN0aW9uID09PSAnY29sdW1uLXJldmVyc2UnID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgfVxuXG4gIGlmIChlbENTUy5kaXNwbGF5ID09PSAnZ3JpZCcpIHtcbiAgICByZXR1cm4gZWxDU1MuZ3JpZFRlbXBsYXRlQ29sdW1ucy5zcGxpdCgnICcpLmxlbmd0aCA8PSAxID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgfVxuXG4gIGlmIChjaGlsZDEgJiYgZmlyc3RDaGlsZENTU1tcImZsb2F0XCJdICYmIGZpcnN0Q2hpbGRDU1NbXCJmbG9hdFwiXSAhPT0gJ25vbmUnKSB7XG4gICAgdmFyIHRvdWNoaW5nU2lkZUNoaWxkMiA9IGZpcnN0Q2hpbGRDU1NbXCJmbG9hdFwiXSA9PT0gJ2xlZnQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICByZXR1cm4gY2hpbGQyICYmIChzZWNvbmRDaGlsZENTUy5jbGVhciA9PT0gJ2JvdGgnIHx8IHNlY29uZENoaWxkQ1NTLmNsZWFyID09PSB0b3VjaGluZ1NpZGVDaGlsZDIpID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgfVxuXG4gIHJldHVybiBjaGlsZDEgJiYgKGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ2Jsb2NrJyB8fCBmaXJzdENoaWxkQ1NTLmRpc3BsYXkgPT09ICdmbGV4JyB8fCBmaXJzdENoaWxkQ1NTLmRpc3BsYXkgPT09ICd0YWJsZScgfHwgZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAnZ3JpZCcgfHwgZmlyc3RDaGlsZFdpZHRoID49IGVsV2lkdGggJiYgZWxDU1NbQ1NTRmxvYXRQcm9wZXJ0eV0gPT09ICdub25lJyB8fCBjaGlsZDIgJiYgZWxDU1NbQ1NTRmxvYXRQcm9wZXJ0eV0gPT09ICdub25lJyAmJiBmaXJzdENoaWxkV2lkdGggKyBzZWNvbmRDaGlsZFdpZHRoID4gZWxXaWR0aCkgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xufSxcbiAgICBfZHJhZ0VsSW5Sb3dDb2x1bW4gPSBmdW5jdGlvbiBfZHJhZ0VsSW5Sb3dDb2x1bW4oZHJhZ1JlY3QsIHRhcmdldFJlY3QsIHZlcnRpY2FsKSB7XG4gIHZhciBkcmFnRWxTMU9wcCA9IHZlcnRpY2FsID8gZHJhZ1JlY3QubGVmdCA6IGRyYWdSZWN0LnRvcCxcbiAgICAgIGRyYWdFbFMyT3BwID0gdmVydGljYWwgPyBkcmFnUmVjdC5yaWdodCA6IGRyYWdSZWN0LmJvdHRvbSxcbiAgICAgIGRyYWdFbE9wcExlbmd0aCA9IHZlcnRpY2FsID8gZHJhZ1JlY3Qud2lkdGggOiBkcmFnUmVjdC5oZWlnaHQsXG4gICAgICB0YXJnZXRTMU9wcCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5sZWZ0IDogdGFyZ2V0UmVjdC50b3AsXG4gICAgICB0YXJnZXRTMk9wcCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5yaWdodCA6IHRhcmdldFJlY3QuYm90dG9tLFxuICAgICAgdGFyZ2V0T3BwTGVuZ3RoID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LndpZHRoIDogdGFyZ2V0UmVjdC5oZWlnaHQ7XG4gIHJldHVybiBkcmFnRWxTMU9wcCA9PT0gdGFyZ2V0UzFPcHAgfHwgZHJhZ0VsUzJPcHAgPT09IHRhcmdldFMyT3BwIHx8IGRyYWdFbFMxT3BwICsgZHJhZ0VsT3BwTGVuZ3RoIC8gMiA9PT0gdGFyZ2V0UzFPcHAgKyB0YXJnZXRPcHBMZW5ndGggLyAyO1xufSxcblxuLyoqXG4gKiBEZXRlY3RzIGZpcnN0IG5lYXJlc3QgZW1wdHkgc29ydGFibGUgdG8gWCBhbmQgWSBwb3NpdGlvbiB1c2luZyBlbXB0eUluc2VydFRocmVzaG9sZC5cbiAqIEBwYXJhbSAge051bWJlcn0geCAgICAgIFggcG9zaXRpb25cbiAqIEBwYXJhbSAge051bWJlcn0geSAgICAgIFkgcG9zaXRpb25cbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgIEVsZW1lbnQgb2YgdGhlIGZpcnN0IGZvdW5kIG5lYXJlc3QgU29ydGFibGVcbiAqL1xuX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlID0gZnVuY3Rpb24gX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlKHgsIHkpIHtcbiAgdmFyIHJldDtcbiAgc29ydGFibGVzLnNvbWUoZnVuY3Rpb24gKHNvcnRhYmxlKSB7XG4gICAgdmFyIHRocmVzaG9sZCA9IHNvcnRhYmxlW2V4cGFuZG9dLm9wdGlvbnMuZW1wdHlJbnNlcnRUaHJlc2hvbGQ7XG4gICAgaWYgKCF0aHJlc2hvbGQgfHwgbGFzdENoaWxkKHNvcnRhYmxlKSkgcmV0dXJuO1xuICAgIHZhciByZWN0ID0gZ2V0UmVjdChzb3J0YWJsZSksXG4gICAgICAgIGluc2lkZUhvcml6b250YWxseSA9IHggPj0gcmVjdC5sZWZ0IC0gdGhyZXNob2xkICYmIHggPD0gcmVjdC5yaWdodCArIHRocmVzaG9sZCxcbiAgICAgICAgaW5zaWRlVmVydGljYWxseSA9IHkgPj0gcmVjdC50b3AgLSB0aHJlc2hvbGQgJiYgeSA8PSByZWN0LmJvdHRvbSArIHRocmVzaG9sZDtcblxuICAgIGlmIChpbnNpZGVIb3Jpem9udGFsbHkgJiYgaW5zaWRlVmVydGljYWxseSkge1xuICAgICAgcmV0dXJuIHJldCA9IHNvcnRhYmxlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXQ7XG59LFxuICAgIF9wcmVwYXJlR3JvdXAgPSBmdW5jdGlvbiBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpIHtcbiAgZnVuY3Rpb24gdG9Gbih2YWx1ZSwgcHVsbCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodG8sIGZyb20sIGRyYWdFbCwgZXZ0KSB7XG4gICAgICB2YXIgc2FtZUdyb3VwID0gdG8ub3B0aW9ucy5ncm91cC5uYW1lICYmIGZyb20ub3B0aW9ucy5ncm91cC5uYW1lICYmIHRvLm9wdGlvbnMuZ3JvdXAubmFtZSA9PT0gZnJvbS5vcHRpb25zLmdyb3VwLm5hbWU7XG5cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIChwdWxsIHx8IHNhbWVHcm91cCkpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBwdWxsIHZhbHVlXG4gICAgICAgIC8vIERlZmF1bHQgcHVsbCBhbmQgcHV0IHZhbHVlIGlmIHNhbWUgZ3JvdXBcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAocHVsbCAmJiB2YWx1ZSA9PT0gJ2Nsb25lJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdG9Gbih2YWx1ZSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpLCBwdWxsKSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG90aGVyR3JvdXAgPSAocHVsbCA/IHRvIDogZnJvbSkub3B0aW9ucy5ncm91cC5uYW1lO1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSA9PT0gb3RoZXJHcm91cCB8fCB2YWx1ZS5qb2luICYmIHZhbHVlLmluZGV4T2Yob3RoZXJHcm91cCkgPiAtMTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGdyb3VwID0ge307XG4gIHZhciBvcmlnaW5hbEdyb3VwID0gb3B0aW9ucy5ncm91cDtcblxuICBpZiAoIW9yaWdpbmFsR3JvdXAgfHwgX3R5cGVvZihvcmlnaW5hbEdyb3VwKSAhPSAnb2JqZWN0Jykge1xuICAgIG9yaWdpbmFsR3JvdXAgPSB7XG4gICAgICBuYW1lOiBvcmlnaW5hbEdyb3VwXG4gICAgfTtcbiAgfVxuXG4gIGdyb3VwLm5hbWUgPSBvcmlnaW5hbEdyb3VwLm5hbWU7XG4gIGdyb3VwLmNoZWNrUHVsbCA9IHRvRm4ob3JpZ2luYWxHcm91cC5wdWxsLCB0cnVlKTtcbiAgZ3JvdXAuY2hlY2tQdXQgPSB0b0ZuKG9yaWdpbmFsR3JvdXAucHV0KTtcbiAgZ3JvdXAucmV2ZXJ0Q2xvbmUgPSBvcmlnaW5hbEdyb3VwLnJldmVydENsb25lO1xuICBvcHRpb25zLmdyb3VwID0gZ3JvdXA7XG59LFxuICAgIF9oaWRlR2hvc3RGb3JUYXJnZXQgPSBmdW5jdGlvbiBfaGlkZUdob3N0Rm9yVGFyZ2V0KCkge1xuICBpZiAoIXN1cHBvcnRDc3NQb2ludGVyRXZlbnRzICYmIGdob3N0RWwpIHtcbiAgICBjc3MoZ2hvc3RFbCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xuICB9XG59LFxuICAgIF91bmhpZGVHaG9zdEZvclRhcmdldCA9IGZ1bmN0aW9uIF91bmhpZGVHaG9zdEZvclRhcmdldCgpIHtcbiAgaWYgKCFzdXBwb3J0Q3NzUG9pbnRlckV2ZW50cyAmJiBnaG9zdEVsKSB7XG4gICAgY3NzKGdob3N0RWwsICdkaXNwbGF5JywgJycpO1xuICB9XG59OyAvLyAjMTE4NCBmaXggLSBQcmV2ZW50IGNsaWNrIGV2ZW50IG9uIGZhbGxiYWNrIGlmIGRyYWdnZWQgYnV0IGl0ZW0gbm90IGNoYW5nZWQgcG9zaXRpb25cblxuXG5pZiAoZG9jdW1lbnRFeGlzdHMpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgaWYgKGlnbm9yZU5leHRDbGljaykge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldnQuc3RvcFByb3BhZ2F0aW9uICYmIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gJiYgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgaWdub3JlTmV4dENsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB0cnVlKTtcbn1cblxudmFyIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50ID0gZnVuY3Rpb24gbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQoZXZ0KSB7XG4gIGlmIChkcmFnRWwpIHtcbiAgICBldnQgPSBldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0O1xuXG4gICAgdmFyIG5lYXJlc3QgPSBfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcblxuICAgIGlmIChuZWFyZXN0KSB7XG4gICAgICAvLyBDcmVhdGUgaW1pdGF0aW9uIGV2ZW50XG4gICAgICB2YXIgZXZlbnQgPSB7fTtcblxuICAgICAgZm9yICh2YXIgaSBpbiBldnQpIHtcbiAgICAgICAgaWYgKGV2dC5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgIGV2ZW50W2ldID0gZXZ0W2ldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV2ZW50LnRhcmdldCA9IGV2ZW50LnJvb3RFbCA9IG5lYXJlc3Q7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCA9IHZvaWQgMDtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IHZvaWQgMDtcblxuICAgICAgbmVhcmVzdFtleHBhbmRvXS5fb25EcmFnT3ZlcihldmVudCk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgX2NoZWNrT3V0c2lkZVRhcmdldEVsID0gZnVuY3Rpb24gX2NoZWNrT3V0c2lkZVRhcmdldEVsKGV2dCkge1xuICBpZiAoZHJhZ0VsKSB7XG4gICAgZHJhZ0VsLnBhcmVudE5vZGVbZXhwYW5kb10uX2lzT3V0c2lkZVRoaXNFbChldnQudGFyZ2V0KTtcbiAgfVxufTtcbi8qKlxuICogQGNsYXNzICBTb3J0YWJsZVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICBlbFxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICBbb3B0aW9uc11cbiAqL1xuXG5cbmZ1bmN0aW9uIFNvcnRhYmxlKGVsLCBvcHRpb25zKSB7XG4gIGlmICghKGVsICYmIGVsLm5vZGVUeXBlICYmIGVsLm5vZGVUeXBlID09PSAxKSkge1xuICAgIHRocm93IFwiU29ydGFibGU6IGBlbGAgbXVzdCBiZSBhbiBIVE1MRWxlbWVudCwgbm90IFwiLmNvbmNhdCh7fS50b1N0cmluZy5jYWxsKGVsKSk7XG4gIH1cblxuICB0aGlzLmVsID0gZWw7IC8vIHJvb3QgZWxlbWVudFxuXG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgb3B0aW9ucyk7IC8vIEV4cG9ydCBpbnN0YW5jZVxuXG4gIGVsW2V4cGFuZG9dID0gdGhpcztcbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIGdyb3VwOiBudWxsLFxuICAgIHNvcnQ6IHRydWUsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHN0b3JlOiBudWxsLFxuICAgIGhhbmRsZTogbnVsbCxcbiAgICBkcmFnZ2FibGU6IC9eW3VvXWwkL2kudGVzdChlbC5ub2RlTmFtZSkgPyAnPmxpJyA6ICc+KicsXG4gICAgc3dhcFRocmVzaG9sZDogMSxcbiAgICAvLyBwZXJjZW50YWdlOyAwIDw9IHggPD0gMVxuICAgIGludmVydFN3YXA6IGZhbHNlLFxuICAgIC8vIGludmVydCBhbHdheXNcbiAgICBpbnZlcnRlZFN3YXBUaHJlc2hvbGQ6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgdG8gc2FtZSBhcyBzd2FwVGhyZXNob2xkIGlmIGRlZmF1bHRcbiAgICByZW1vdmVDbG9uZU9uSGlkZTogdHJ1ZSxcbiAgICBkaXJlY3Rpb246IGZ1bmN0aW9uIGRpcmVjdGlvbigpIHtcbiAgICAgIHJldHVybiBfZGV0ZWN0RGlyZWN0aW9uKGVsLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0sXG4gICAgZ2hvc3RDbGFzczogJ3NvcnRhYmxlLWdob3N0JyxcbiAgICBjaG9zZW5DbGFzczogJ3NvcnRhYmxlLWNob3NlbicsXG4gICAgZHJhZ0NsYXNzOiAnc29ydGFibGUtZHJhZycsXG4gICAgaWdub3JlOiAnYSwgaW1nJyxcbiAgICBmaWx0ZXI6IG51bGwsXG4gICAgcHJldmVudE9uRmlsdGVyOiB0cnVlLFxuICAgIGFuaW1hdGlvbjogMCxcbiAgICBlYXNpbmc6IG51bGwsXG4gICAgc2V0RGF0YTogZnVuY3Rpb24gc2V0RGF0YShkYXRhVHJhbnNmZXIsIGRyYWdFbCkge1xuICAgICAgZGF0YVRyYW5zZmVyLnNldERhdGEoJ1RleHQnLCBkcmFnRWwudGV4dENvbnRlbnQpO1xuICAgIH0sXG4gICAgZHJvcEJ1YmJsZTogZmFsc2UsXG4gICAgZHJhZ292ZXJCdWJibGU6IGZhbHNlLFxuICAgIGRhdGFJZEF0dHI6ICdkYXRhLWlkJyxcbiAgICBkZWxheTogMCxcbiAgICBkZWxheU9uVG91Y2hPbmx5OiBmYWxzZSxcbiAgICB0b3VjaFN0YXJ0VGhyZXNob2xkOiAoTnVtYmVyLnBhcnNlSW50ID8gTnVtYmVyIDogd2luZG93KS5wYXJzZUludCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMTApIHx8IDEsXG4gICAgZm9yY2VGYWxsYmFjazogZmFsc2UsXG4gICAgZmFsbGJhY2tDbGFzczogJ3NvcnRhYmxlLWZhbGxiYWNrJyxcbiAgICBmYWxsYmFja09uQm9keTogZmFsc2UsXG4gICAgZmFsbGJhY2tUb2xlcmFuY2U6IDAsXG4gICAgZmFsbGJhY2tPZmZzZXQ6IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfSxcbiAgICBzdXBwb3J0UG9pbnRlcjogU29ydGFibGUuc3VwcG9ydFBvaW50ZXIgIT09IGZhbHNlICYmICdQb2ludGVyRXZlbnQnIGluIHdpbmRvdyAmJiAhU2FmYXJpLFxuICAgIGVtcHR5SW5zZXJ0VGhyZXNob2xkOiA1XG4gIH07XG4gIFBsdWdpbk1hbmFnZXIuaW5pdGlhbGl6ZVBsdWdpbnModGhpcywgZWwsIGRlZmF1bHRzKTsgLy8gU2V0IGRlZmF1bHQgb3B0aW9uc1xuXG4gIGZvciAodmFyIG5hbWUgaW4gZGVmYXVsdHMpIHtcbiAgICAhKG5hbWUgaW4gb3B0aW9ucykgJiYgKG9wdGlvbnNbbmFtZV0gPSBkZWZhdWx0c1tuYW1lXSk7XG4gIH1cblxuICBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpOyAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcblxuXG4gIGZvciAodmFyIGZuIGluIHRoaXMpIHtcbiAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgfVxuICB9IC8vIFNldHVwIGRyYWcgbW9kZVxuXG5cbiAgdGhpcy5uYXRpdmVEcmFnZ2FibGUgPSBvcHRpb25zLmZvcmNlRmFsbGJhY2sgPyBmYWxzZSA6IHN1cHBvcnREcmFnZ2FibGU7XG5cbiAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgLy8gVG91Y2ggc3RhcnQgdGhyZXNob2xkIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG5hdGl2ZSBkcmFnc3RhcnQgdGhyZXNob2xkXG4gICAgdGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgPSAxO1xuICB9IC8vIEJpbmQgZXZlbnRzXG5cblxuICBpZiAob3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgIG9uKGVsLCAncG9pbnRlcmRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgfSBlbHNlIHtcbiAgICBvbihlbCwgJ21vdXNlZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgIG9uKGVsLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVGFwU3RhcnQpO1xuICB9XG5cbiAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgb24oZWwsICdkcmFnb3ZlcicsIHRoaXMpO1xuICAgIG9uKGVsLCAnZHJhZ2VudGVyJywgdGhpcyk7XG4gIH1cblxuICBzb3J0YWJsZXMucHVzaCh0aGlzLmVsKTsgLy8gUmVzdG9yZSBzb3J0aW5nXG5cbiAgb3B0aW9ucy5zdG9yZSAmJiBvcHRpb25zLnN0b3JlLmdldCAmJiB0aGlzLnNvcnQob3B0aW9ucy5zdG9yZS5nZXQodGhpcykgfHwgW10pOyAvLyBBZGQgYW5pbWF0aW9uIHN0YXRlIG1hbmFnZXJcblxuICBfZXh0ZW5kcyh0aGlzLCBBbmltYXRpb25TdGF0ZU1hbmFnZXIoKSk7XG59XG5cblNvcnRhYmxlLnByb3RvdHlwZSA9XG4vKiogQGxlbmRzIFNvcnRhYmxlLnByb3RvdHlwZSAqL1xue1xuICBjb25zdHJ1Y3RvcjogU29ydGFibGUsXG4gIF9pc091dHNpZGVUaGlzRWw6IGZ1bmN0aW9uIF9pc091dHNpZGVUaGlzRWwodGFyZ2V0KSB7XG4gICAgaWYgKCF0aGlzLmVsLmNvbnRhaW5zKHRhcmdldCkgJiYgdGFyZ2V0ICE9PSB0aGlzLmVsKSB7XG4gICAgICBsYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICB9XG4gIH0sXG4gIF9nZXREaXJlY3Rpb246IGZ1bmN0aW9uIF9nZXREaXJlY3Rpb24oZXZ0LCB0YXJnZXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMub3B0aW9ucy5kaXJlY3Rpb24gPT09ICdmdW5jdGlvbicgPyB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uLmNhbGwodGhpcywgZXZ0LCB0YXJnZXQsIGRyYWdFbCkgOiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICB9LFxuICBfb25UYXBTdGFydDogZnVuY3Rpb24gX29uVGFwU3RhcnQoXG4gIC8qKiBFdmVudHxUb3VjaEV2ZW50ICovXG4gIGV2dCkge1xuICAgIGlmICghZXZ0LmNhbmNlbGFibGUpIHJldHVybjtcblxuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICAgIGVsID0gdGhpcy5lbCxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgcHJldmVudE9uRmlsdGVyID0gb3B0aW9ucy5wcmV2ZW50T25GaWx0ZXIsXG4gICAgICAgIHR5cGUgPSBldnQudHlwZSxcbiAgICAgICAgdG91Y2ggPSBldnQudG91Y2hlcyAmJiBldnQudG91Y2hlc1swXSB8fCBldnQucG9pbnRlclR5cGUgJiYgZXZ0LnBvaW50ZXJUeXBlID09PSAndG91Y2gnICYmIGV2dCxcbiAgICAgICAgdGFyZ2V0ID0gKHRvdWNoIHx8IGV2dCkudGFyZ2V0LFxuICAgICAgICBvcmlnaW5hbFRhcmdldCA9IGV2dC50YXJnZXQuc2hhZG93Um9vdCAmJiAoZXZ0LnBhdGggJiYgZXZ0LnBhdGhbMF0gfHwgZXZ0LmNvbXBvc2VkUGF0aCAmJiBldnQuY29tcG9zZWRQYXRoKClbMF0pIHx8IHRhcmdldCxcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG5cbiAgICBfc2F2ZUlucHV0Q2hlY2tlZFN0YXRlKGVsKTsgLy8gRG9uJ3QgdHJpZ2dlciBzdGFydCBldmVudCB3aGVuIGFuIGVsZW1lbnQgaXMgYmVlbiBkcmFnZ2VkLCBvdGhlcndpc2UgdGhlIGV2dC5vbGRpbmRleCBhbHdheXMgd3Jvbmcgd2hlbiBzZXQgb3B0aW9uLmdyb3VwLlxuXG5cbiAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKC9tb3VzZWRvd258cG9pbnRlcmRvd24vLnRlc3QodHlwZSkgJiYgZXZ0LmJ1dHRvbiAhPT0gMCB8fCBvcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47IC8vIG9ubHkgbGVmdCBidXR0b24gYW5kIGVuYWJsZWRcbiAgICB9IC8vIGNhbmNlbCBkbmQgaWYgb3JpZ2luYWwgdGFyZ2V0IGlzIGNvbnRlbnQgZWRpdGFibGVcblxuXG4gICAgaWYgKG9yaWdpbmFsVGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBTYWZhcmkgaWdub3JlcyBmdXJ0aGVyIGV2ZW50IGhhbmRsaW5nIGFmdGVyIG1vdXNlZG93blxuXG5cbiAgICBpZiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlICYmIFNhZmFyaSAmJiB0YXJnZXQgJiYgdGFyZ2V0LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSBjbG9zZXN0KHRhcmdldCwgb3B0aW9ucy5kcmFnZ2FibGUsIGVsLCBmYWxzZSk7XG5cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5hbmltYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsYXN0RG93bkVsID09PSB0YXJnZXQpIHtcbiAgICAgIC8vIElnbm9yaW5nIGR1cGxpY2F0ZSBgZG93bmBcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGRyYWdnZWQgZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudFxuXG5cbiAgICBvbGRJbmRleCA9IGluZGV4KHRhcmdldCk7XG4gICAgb2xkRHJhZ2dhYmxlSW5kZXggPSBpbmRleCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlKTsgLy8gQ2hlY2sgZmlsdGVyXG5cbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGZpbHRlci5jYWxsKHRoaXMsIGV2dCwgdGFyZ2V0LCB0aGlzKSkge1xuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgIHJvb3RFbDogb3JpZ2luYWxUYXJnZXQsXG4gICAgICAgICAgbmFtZTogJ2ZpbHRlcicsXG4gICAgICAgICAgdGFyZ2V0RWw6IHRhcmdldCxcbiAgICAgICAgICB0b0VsOiBlbCxcbiAgICAgICAgICBmcm9tRWw6IGVsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBsdWdpbkV2ZW50KCdmaWx0ZXInLCBfdGhpcywge1xuICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgIH0pO1xuICAgICAgICBwcmV2ZW50T25GaWx0ZXIgJiYgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjsgLy8gY2FuY2VsIGRuZFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSBmaWx0ZXIuc3BsaXQoJywnKS5zb21lKGZ1bmN0aW9uIChjcml0ZXJpYSkge1xuICAgICAgICBjcml0ZXJpYSA9IGNsb3Nlc3Qob3JpZ2luYWxUYXJnZXQsIGNyaXRlcmlhLnRyaW0oKSwgZWwsIGZhbHNlKTtcblxuICAgICAgICBpZiAoY3JpdGVyaWEpIHtcbiAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgICAgICByb290RWw6IGNyaXRlcmlhLFxuICAgICAgICAgICAgbmFtZTogJ2ZpbHRlcicsXG4gICAgICAgICAgICB0YXJnZXRFbDogdGFyZ2V0LFxuICAgICAgICAgICAgZnJvbUVsOiBlbCxcbiAgICAgICAgICAgIHRvRWw6IGVsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwbHVnaW5FdmVudCgnZmlsdGVyJywgX3RoaXMsIHtcbiAgICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgIHByZXZlbnRPbkZpbHRlciAmJiBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuOyAvLyBjYW5jZWwgZG5kXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaGFuZGxlICYmICFjbG9zZXN0KG9yaWdpbmFsVGFyZ2V0LCBvcHRpb25zLmhhbmRsZSwgZWwsIGZhbHNlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gUHJlcGFyZSBgZHJhZ3N0YXJ0YFxuXG5cbiAgICB0aGlzLl9wcmVwYXJlRHJhZ1N0YXJ0KGV2dCwgdG91Y2gsIHRhcmdldCk7XG4gIH0sXG4gIF9wcmVwYXJlRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfcHJlcGFyZURyYWdTdGFydChcbiAgLyoqIEV2ZW50ICovXG4gIGV2dCxcbiAgLyoqIFRvdWNoICovXG4gIHRvdWNoLFxuICAvKiogSFRNTEVsZW1lbnQgKi9cbiAgdGFyZ2V0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcyxcbiAgICAgICAgZWwgPSBfdGhpcy5lbCxcbiAgICAgICAgb3B0aW9ucyA9IF90aGlzLm9wdGlvbnMsXG4gICAgICAgIG93bmVyRG9jdW1lbnQgPSBlbC5vd25lckRvY3VtZW50LFxuICAgICAgICBkcmFnU3RhcnRGbjtcblxuICAgIGlmICh0YXJnZXQgJiYgIWRyYWdFbCAmJiB0YXJnZXQucGFyZW50Tm9kZSA9PT0gZWwpIHtcbiAgICAgIHZhciBkcmFnUmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgIHJvb3RFbCA9IGVsO1xuICAgICAgZHJhZ0VsID0gdGFyZ2V0O1xuICAgICAgcGFyZW50RWwgPSBkcmFnRWwucGFyZW50Tm9kZTtcbiAgICAgIG5leHRFbCA9IGRyYWdFbC5uZXh0U2libGluZztcbiAgICAgIGxhc3REb3duRWwgPSB0YXJnZXQ7XG4gICAgICBhY3RpdmVHcm91cCA9IG9wdGlvbnMuZ3JvdXA7XG4gICAgICBTb3J0YWJsZS5kcmFnZ2VkID0gZHJhZ0VsO1xuICAgICAgdGFwRXZ0ID0ge1xuICAgICAgICB0YXJnZXQ6IGRyYWdFbCxcbiAgICAgICAgY2xpZW50WDogKHRvdWNoIHx8IGV2dCkuY2xpZW50WCxcbiAgICAgICAgY2xpZW50WTogKHRvdWNoIHx8IGV2dCkuY2xpZW50WVxuICAgICAgfTtcbiAgICAgIHRhcERpc3RhbmNlTGVmdCA9IHRhcEV2dC5jbGllbnRYIC0gZHJhZ1JlY3QubGVmdDtcbiAgICAgIHRhcERpc3RhbmNlVG9wID0gdGFwRXZ0LmNsaWVudFkgLSBkcmFnUmVjdC50b3A7XG4gICAgICB0aGlzLl9sYXN0WCA9ICh0b3VjaCB8fCBldnQpLmNsaWVudFg7XG4gICAgICB0aGlzLl9sYXN0WSA9ICh0b3VjaCB8fCBldnQpLmNsaWVudFk7XG4gICAgICBkcmFnRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnYWxsJztcblxuICAgICAgZHJhZ1N0YXJ0Rm4gPSBmdW5jdGlvbiBkcmFnU3RhcnRGbigpIHtcbiAgICAgICAgcGx1Z2luRXZlbnQoJ2RlbGF5RW5kZWQnLCBfdGhpcywge1xuICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgX3RoaXMuX29uRHJvcCgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIERlbGF5ZWQgZHJhZyBoYXMgYmVlbiB0cmlnZ2VyZWRcbiAgICAgICAgLy8gd2UgY2FuIHJlLWVuYWJsZSB0aGUgZXZlbnRzOiB0b3VjaG1vdmUvbW91c2Vtb3ZlXG5cblxuICAgICAgICBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCk7XG5cbiAgICAgICAgaWYgKCFGaXJlRm94ICYmIF90aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICAgIGRyYWdFbC5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB9IC8vIEJpbmQgdGhlIGV2ZW50czogZHJhZ3N0YXJ0L2RyYWdlbmRcblxuXG4gICAgICAgIF90aGlzLl90cmlnZ2VyRHJhZ1N0YXJ0KGV2dCwgdG91Y2gpOyAvLyBEcmFnIHN0YXJ0IGV2ZW50XG5cblxuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgIG5hbWU6ICdjaG9vc2UnLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICB9KTsgLy8gQ2hvc2VuIGl0ZW1cblxuXG4gICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5jaG9zZW5DbGFzcywgdHJ1ZSk7XG4gICAgICB9OyAvLyBEaXNhYmxlIFwiZHJhZ2dhYmxlXCJcblxuXG4gICAgICBvcHRpb25zLmlnbm9yZS5zcGxpdCgnLCcpLmZvckVhY2goZnVuY3Rpb24gKGNyaXRlcmlhKSB7XG4gICAgICAgIGZpbmQoZHJhZ0VsLCBjcml0ZXJpYS50cmltKCksIF9kaXNhYmxlRHJhZ2dhYmxlKTtcbiAgICAgIH0pO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ2RyYWdvdmVyJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ21vdXNlbW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaG1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoZW5kJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCBfdGhpcy5fb25Ecm9wKTsgLy8gTWFrZSBkcmFnRWwgZHJhZ2dhYmxlIChtdXN0IGJlIGJlZm9yZSBkZWxheSBmb3IgRmlyZUZveClcblxuICAgICAgaWYgKEZpcmVGb3ggJiYgdGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgPSA0O1xuICAgICAgICBkcmFnRWwuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcGx1Z2luRXZlbnQoJ2RlbGF5U3RhcnQnLCB0aGlzLCB7XG4gICAgICAgIGV2dDogZXZ0XG4gICAgICB9KTsgLy8gRGVsYXkgaXMgaW1wb3NzaWJsZSBmb3IgbmF0aXZlIERuRCBpbiBFZGdlIG9yIElFXG5cbiAgICAgIGlmIChvcHRpb25zLmRlbGF5ICYmICghb3B0aW9ucy5kZWxheU9uVG91Y2hPbmx5IHx8IHRvdWNoKSAmJiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlIHx8ICEoRWRnZSB8fCBJRTExT3JMZXNzKSkpIHtcbiAgICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgICB0aGlzLl9vbkRyb3AoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBJZiB0aGUgdXNlciBtb3ZlcyB0aGUgcG9pbnRlciBvciBsZXQgZ28gdGhlIGNsaWNrIG9yIHRvdWNoXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgZGVsYXkgaGFzIGJlZW4gcmVhY2hlZDpcbiAgICAgICAgLy8gZGlzYWJsZSB0aGUgZGVsYXllZCBkcmFnXG5cblxuICAgICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCBfdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBvcHRpb25zLnN1cHBvcnRQb2ludGVyICYmIG9uKG93bmVyRG9jdW1lbnQsICdwb2ludGVybW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBfdGhpcy5fZHJhZ1N0YXJ0VGltZXIgPSBzZXRUaW1lb3V0KGRyYWdTdGFydEZuLCBvcHRpb25zLmRlbGF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdTdGFydEZuKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBfZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyOiBmdW5jdGlvbiBfZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKFxuICAvKiogVG91Y2hFdmVudHxQb2ludGVyRXZlbnQgKiovXG4gIGUpIHtcbiAgICB2YXIgdG91Y2ggPSBlLnRvdWNoZXMgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgaWYgKE1hdGgubWF4KE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLl9sYXN0WCksIE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLl9sYXN0WSkpID49IE1hdGguZmxvb3IodGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgLyAodGhpcy5uYXRpdmVEcmFnZ2FibGUgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkpKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcoKTtcbiAgICB9XG4gIH0sXG4gIF9kaXNhYmxlRGVsYXllZERyYWc6IGZ1bmN0aW9uIF9kaXNhYmxlRGVsYXllZERyYWcoKSB7XG4gICAgZHJhZ0VsICYmIF9kaXNhYmxlRHJhZ2dhYmxlKGRyYWdFbCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2RyYWdTdGFydFRpbWVyKTtcblxuICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpO1xuICB9LFxuICBfZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzOiBmdW5jdGlvbiBfZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCkge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gdGhpcy5lbC5vd25lckRvY3VtZW50O1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgfSxcbiAgX3RyaWdnZXJEcmFnU3RhcnQ6IGZ1bmN0aW9uIF90cmlnZ2VyRHJhZ1N0YXJ0KFxuICAvKiogRXZlbnQgKi9cbiAgZXZ0LFxuICAvKiogVG91Y2ggKi9cbiAgdG91Y2gpIHtcbiAgICB0b3VjaCA9IHRvdWNoIHx8IGV2dC5wb2ludGVyVHlwZSA9PSAndG91Y2gnICYmIGV2dDtcblxuICAgIGlmICghdGhpcy5uYXRpdmVEcmFnZ2FibGUgfHwgdG91Y2gpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH0gZWxzZSBpZiAodG91Y2gpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbihkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb24oZHJhZ0VsLCAnZHJhZ2VuZCcsIHRoaXMpO1xuICAgICAgb24ocm9vdEVsLCAnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7XG4gICAgICAgIC8vIFRpbWVvdXQgbmVjY2Vzc2FyeSBmb3IgSUU5XG4gICAgICAgIF9uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge31cbiAgfSxcbiAgX2RyYWdTdGFydGVkOiBmdW5jdGlvbiBfZHJhZ1N0YXJ0ZWQoZmFsbGJhY2ssIGV2dCkge1xuXG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHJvb3RFbCAmJiBkcmFnRWwpIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdkcmFnU3RhcnRlZCcsIHRoaXMsIHtcbiAgICAgICAgZXZ0OiBldnRcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdkcmFnb3ZlcicsIF9jaGVja091dHNpZGVUYXJnZXRFbCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOyAvLyBBcHBseSBlZmZlY3RcblxuICAgICAgIWZhbGxiYWNrICYmIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIGZhbHNlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5naG9zdENsYXNzLCB0cnVlKTtcbiAgICAgIFNvcnRhYmxlLmFjdGl2ZSA9IHRoaXM7XG4gICAgICBmYWxsYmFjayAmJiB0aGlzLl9hcHBlbmRHaG9zdCgpOyAvLyBEcmFnIHN0YXJ0IGV2ZW50XG5cbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgIG5hbWU6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX251bGxpbmcoKTtcbiAgICB9XG4gIH0sXG4gIF9lbXVsYXRlRHJhZ092ZXI6IGZ1bmN0aW9uIF9lbXVsYXRlRHJhZ092ZXIoKSB7XG4gICAgaWYgKHRvdWNoRXZ0KSB7XG4gICAgICB0aGlzLl9sYXN0WCA9IHRvdWNoRXZ0LmNsaWVudFg7XG4gICAgICB0aGlzLl9sYXN0WSA9IHRvdWNoRXZ0LmNsaWVudFk7XG5cbiAgICAgIF9oaWRlR2hvc3RGb3JUYXJnZXQoKTtcblxuICAgICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQodG91Y2hFdnQuY2xpZW50WCwgdG91Y2hFdnQuY2xpZW50WSk7XG4gICAgICB2YXIgcGFyZW50ID0gdGFyZ2V0O1xuXG4gICAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC5zaGFkb3dSb290KSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5zaGFkb3dSb290LmVsZW1lbnRGcm9tUG9pbnQodG91Y2hFdnQuY2xpZW50WCwgdG91Y2hFdnQuY2xpZW50WSk7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IHBhcmVudCkgYnJlYWs7XG4gICAgICAgIHBhcmVudCA9IHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgZHJhZ0VsLnBhcmVudE5vZGVbZXhwYW5kb10uX2lzT3V0c2lkZVRoaXNFbCh0YXJnZXQpO1xuXG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAocGFyZW50W2V4cGFuZG9dKSB7XG4gICAgICAgICAgICB2YXIgaW5zZXJ0ZWQgPSB2b2lkIDA7XG4gICAgICAgICAgICBpbnNlcnRlZCA9IHBhcmVudFtleHBhbmRvXS5fb25EcmFnT3Zlcih7XG4gICAgICAgICAgICAgIGNsaWVudFg6IHRvdWNoRXZ0LmNsaWVudFgsXG4gICAgICAgICAgICAgIGNsaWVudFk6IHRvdWNoRXZ0LmNsaWVudFksXG4gICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICByb290RWw6IHBhcmVudFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChpbnNlcnRlZCAmJiAhdGhpcy5vcHRpb25zLmRyYWdvdmVyQnViYmxlKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRhcmdldCA9IHBhcmVudDsgLy8gc3RvcmUgbGFzdCBlbGVtZW50XG4gICAgICAgIH1cbiAgICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuICAgICAgICB3aGlsZSAocGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGUpO1xuICAgICAgfVxuXG4gICAgICBfdW5oaWRlR2hvc3RGb3JUYXJnZXQoKTtcbiAgICB9XG4gIH0sXG4gIF9vblRvdWNoTW92ZTogZnVuY3Rpb24gX29uVG91Y2hNb3ZlKFxuICAvKipUb3VjaEV2ZW50Ki9cbiAgZXZ0KSB7XG4gICAgaWYgKHRhcEV2dCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgZmFsbGJhY2tUb2xlcmFuY2UgPSBvcHRpb25zLmZhbGxiYWNrVG9sZXJhbmNlLFxuICAgICAgICAgIGZhbGxiYWNrT2Zmc2V0ID0gb3B0aW9ucy5mYWxsYmFja09mZnNldCxcbiAgICAgICAgICB0b3VjaCA9IGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQsXG4gICAgICAgICAgZ2hvc3RNYXRyaXggPSBnaG9zdEVsICYmIG1hdHJpeChnaG9zdEVsLCB0cnVlKSxcbiAgICAgICAgICBzY2FsZVggPSBnaG9zdEVsICYmIGdob3N0TWF0cml4ICYmIGdob3N0TWF0cml4LmEsXG4gICAgICAgICAgc2NhbGVZID0gZ2hvc3RFbCAmJiBnaG9zdE1hdHJpeCAmJiBnaG9zdE1hdHJpeC5kLFxuICAgICAgICAgIHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID0gUG9zaXRpb25HaG9zdEFic29sdXRlbHkgJiYgZ2hvc3RSZWxhdGl2ZVBhcmVudCAmJiBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChnaG9zdFJlbGF0aXZlUGFyZW50KSxcbiAgICAgICAgICBkeCA9ICh0b3VjaC5jbGllbnRYIC0gdGFwRXZ0LmNsaWVudFggKyBmYWxsYmFja09mZnNldC54KSAvIChzY2FsZVggfHwgMSkgKyAocmVsYXRpdmVTY3JvbGxPZmZzZXQgPyByZWxhdGl2ZVNjcm9sbE9mZnNldFswXSAtIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsWzBdIDogMCkgLyAoc2NhbGVYIHx8IDEpLFxuICAgICAgICAgIGR5ID0gKHRvdWNoLmNsaWVudFkgLSB0YXBFdnQuY2xpZW50WSArIGZhbGxiYWNrT2Zmc2V0LnkpIC8gKHNjYWxlWSB8fCAxKSArIChyZWxhdGl2ZVNjcm9sbE9mZnNldCA/IHJlbGF0aXZlU2Nyb2xsT2Zmc2V0WzFdIC0gZ2hvc3RSZWxhdGl2ZVBhcmVudEluaXRpYWxTY3JvbGxbMV0gOiAwKSAvIChzY2FsZVkgfHwgMSk7IC8vIG9ubHkgc2V0IHRoZSBzdGF0dXMgdG8gZHJhZ2dpbmcsIHdoZW4gd2UgYXJlIGFjdHVhbGx5IGRyYWdnaW5nXG5cbiAgICAgIGlmICghU29ydGFibGUuYWN0aXZlICYmICFhd2FpdGluZ0RyYWdTdGFydGVkKSB7XG4gICAgICAgIGlmIChmYWxsYmFja1RvbGVyYW5jZSAmJiBNYXRoLm1heChNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy5fbGFzdFgpLCBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy5fbGFzdFkpKSA8IGZhbGxiYWNrVG9sZXJhbmNlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25EcmFnU3RhcnQoZXZ0LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdob3N0RWwpIHtcbiAgICAgICAgaWYgKGdob3N0TWF0cml4KSB7XG4gICAgICAgICAgZ2hvc3RNYXRyaXguZSArPSBkeCAtIChsYXN0RHggfHwgMCk7XG4gICAgICAgICAgZ2hvc3RNYXRyaXguZiArPSBkeSAtIChsYXN0RHkgfHwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2hvc3RNYXRyaXggPSB7XG4gICAgICAgICAgICBhOiAxLFxuICAgICAgICAgICAgYjogMCxcbiAgICAgICAgICAgIGM6IDAsXG4gICAgICAgICAgICBkOiAxLFxuICAgICAgICAgICAgZTogZHgsXG4gICAgICAgICAgICBmOiBkeVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY3NzTWF0cml4ID0gXCJtYXRyaXgoXCIuY29uY2F0KGdob3N0TWF0cml4LmEsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguYiwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5jLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmQsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguZSwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5mLCBcIilcIik7XG4gICAgICAgIGNzcyhnaG9zdEVsLCAnd2Via2l0VHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICdtb3pUcmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgJ21zVHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBsYXN0RHggPSBkeDtcbiAgICAgICAgbGFzdER5ID0gZHk7XG4gICAgICAgIHRvdWNoRXZ0ID0gdG91Y2g7XG4gICAgICB9XG5cbiAgICAgIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSxcbiAgX2FwcGVuZEdob3N0OiBmdW5jdGlvbiBfYXBwZW5kR2hvc3QoKSB7XG4gICAgLy8gQnVnIGlmIHVzaW5nIHNjYWxlKCk6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI2MzcwNThcbiAgICAvLyBOb3QgYmVpbmcgYWRqdXN0ZWQgZm9yXG4gICAgaWYgKCFnaG9zdEVsKSB7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5vcHRpb25zLmZhbGxiYWNrT25Cb2R5ID8gZG9jdW1lbnQuYm9keSA6IHJvb3RFbCxcbiAgICAgICAgICByZWN0ID0gZ2V0UmVjdChkcmFnRWwsIHRydWUsIFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5LCB0cnVlLCBjb250YWluZXIpLFxuICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7IC8vIFBvc2l0aW9uIGFic29sdXRlbHlcblxuICAgICAgaWYgKFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5KSB7XG4gICAgICAgIC8vIEdldCByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgcGFyZW50XG4gICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBjb250YWluZXI7XG5cbiAgICAgICAgd2hpbGUgKGNzcyhnaG9zdFJlbGF0aXZlUGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycgJiYgY3NzKGdob3N0UmVsYXRpdmVQYXJlbnQsICd0cmFuc2Zvcm0nKSA9PT0gJ25vbmUnICYmIGdob3N0UmVsYXRpdmVQYXJlbnQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdob3N0UmVsYXRpdmVQYXJlbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmIGdob3N0UmVsYXRpdmVQYXJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgIGlmIChnaG9zdFJlbGF0aXZlUGFyZW50ID09PSBkb2N1bWVudCkgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAgICAgICByZWN0LnRvcCArPSBnaG9zdFJlbGF0aXZlUGFyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICByZWN0LmxlZnQgKz0gZ2hvc3RSZWxhdGl2ZVBhcmVudC5zY3JvbGxMZWZ0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbCA9IGdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0KGdob3N0UmVsYXRpdmVQYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICBnaG9zdEVsID0gZHJhZ0VsLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGdob3N0RWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgZmFsc2UpO1xuICAgICAgdG9nZ2xlQ2xhc3MoZ2hvc3RFbCwgb3B0aW9ucy5mYWxsYmFja0NsYXNzLCB0cnVlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGdob3N0RWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCB0cnVlKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAndHJhbnNpdGlvbicsICcnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAndHJhbnNmb3JtJywgJycpO1xuICAgICAgY3NzKGdob3N0RWwsICdib3gtc2l6aW5nJywgJ2JvcmRlci1ib3gnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnbWFyZ2luJywgMCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3RvcCcsIHJlY3QudG9wKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnbGVmdCcsIHJlY3QubGVmdCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3dpZHRoJywgcmVjdC53aWR0aCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnb3BhY2l0eScsICcwLjgnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAncG9zaXRpb24nLCBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSA/ICdhYnNvbHV0ZScgOiAnZml4ZWQnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnekluZGV4JywgJzEwMDAwMCcpO1xuICAgICAgY3NzKGdob3N0RWwsICdwb2ludGVyRXZlbnRzJywgJ25vbmUnKTtcbiAgICAgIFNvcnRhYmxlLmdob3N0ID0gZ2hvc3RFbDtcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChnaG9zdEVsKTsgLy8gU2V0IHRyYW5zZm9ybS1vcmlnaW5cblxuICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0tb3JpZ2luJywgdGFwRGlzdGFuY2VMZWZ0IC8gcGFyc2VJbnQoZ2hvc3RFbC5zdHlsZS53aWR0aCkgKiAxMDAgKyAnJSAnICsgdGFwRGlzdGFuY2VUb3AgLyBwYXJzZUludChnaG9zdEVsLnN0eWxlLmhlaWdodCkgKiAxMDAgKyAnJScpO1xuICAgIH1cbiAgfSxcbiAgX29uRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfb25EcmFnU3RhcnQoXG4gIC8qKkV2ZW50Ki9cbiAgZXZ0LFxuICAvKipib29sZWFuKi9cbiAgZmFsbGJhY2spIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGRhdGFUcmFuc2ZlciA9IGV2dC5kYXRhVHJhbnNmZXI7XG4gICAgdmFyIG9wdGlvbnMgPSBfdGhpcy5vcHRpb25zO1xuICAgIHBsdWdpbkV2ZW50KCdkcmFnU3RhcnQnLCB0aGlzLCB7XG4gICAgICBldnQ6IGV2dFxuICAgIH0pO1xuXG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIHRoaXMuX29uRHJvcCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGx1Z2luRXZlbnQoJ3NldHVwQ2xvbmUnLCB0aGlzKTtcblxuICAgIGlmICghU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgY2xvbmVFbCA9IGNsb25lKGRyYWdFbCk7XG4gICAgICBjbG9uZUVsLmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgY2xvbmVFbC5zdHlsZVsnd2lsbC1jaGFuZ2UnXSA9ICcnO1xuXG4gICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgdG9nZ2xlQ2xhc3MoY2xvbmVFbCwgdGhpcy5vcHRpb25zLmNob3NlbkNsYXNzLCBmYWxzZSk7XG4gICAgICBTb3J0YWJsZS5jbG9uZSA9IGNsb25lRWw7XG4gICAgfSAvLyAjMTE0MzogSUZyYW1lIHN1cHBvcnQgd29ya2Fyb3VuZFxuXG5cbiAgICBfdGhpcy5jbG9uZUlkID0gX25leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdjbG9uZScsIF90aGlzKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm47XG5cbiAgICAgIGlmICghX3RoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSkge1xuICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIGRyYWdFbCk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgIG5hbWU6ICdjbG9uZSdcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgICFmYWxsYmFjayAmJiB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCB0cnVlKTsgLy8gU2V0IHByb3BlciBkcm9wIGV2ZW50c1xuXG4gICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICBpZ25vcmVOZXh0Q2xpY2sgPSB0cnVlO1xuICAgICAgX3RoaXMuX2xvb3BJZCA9IHNldEludGVydmFsKF90aGlzLl9lbXVsYXRlRHJhZ092ZXIsIDUwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5kbyB3aGF0IHdhcyBzZXQgaW4gX3ByZXBhcmVEcmFnU3RhcnQgYmVmb3JlIGRyYWcgc3RhcnRlZFxuICAgICAgb2ZmKGRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2hlbmQnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgX3RoaXMuX29uRHJvcCk7XG5cbiAgICAgIGlmIChkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XG4gICAgICAgIG9wdGlvbnMuc2V0RGF0YSAmJiBvcHRpb25zLnNldERhdGEuY2FsbChfdGhpcywgZGF0YVRyYW5zZmVyLCBkcmFnRWwpO1xuICAgICAgfVxuXG4gICAgICBvbihkb2N1bWVudCwgJ2Ryb3AnLCBfdGhpcyk7IC8vICMxMjc2IGZpeDpcblxuICAgICAgY3NzKGRyYWdFbCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGVaKDApJyk7XG4gICAgfVxuXG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgX3RoaXMuX2RyYWdTdGFydElkID0gX25leHRUaWNrKF90aGlzLl9kcmFnU3RhcnRlZC5iaW5kKF90aGlzLCBmYWxsYmFjaywgZXZ0KSk7XG4gICAgb24oZG9jdW1lbnQsICdzZWxlY3RzdGFydCcsIF90aGlzKTtcbiAgICBtb3ZlZCA9IHRydWU7XG5cbiAgICBpZiAoU2FmYXJpKSB7XG4gICAgICBjc3MoZG9jdW1lbnQuYm9keSwgJ3VzZXItc2VsZWN0JywgJ25vbmUnKTtcbiAgICB9XG4gIH0sXG4gIC8vIFJldHVybnMgdHJ1ZSAtIGlmIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIG5lZWRlZCAoZWl0aGVyIGluc2VydGVkIG9yIGFub3RoZXIgY29uZGl0aW9uKVxuICBfb25EcmFnT3ZlcjogZnVuY3Rpb24gX29uRHJhZ092ZXIoXG4gIC8qKkV2ZW50Ki9cbiAgZXZ0KSB7XG4gICAgdmFyIGVsID0gdGhpcy5lbCxcbiAgICAgICAgdGFyZ2V0ID0gZXZ0LnRhcmdldCxcbiAgICAgICAgZHJhZ1JlY3QsXG4gICAgICAgIHRhcmdldFJlY3QsXG4gICAgICAgIHJldmVydCxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZ3JvdXAgPSBvcHRpb25zLmdyb3VwLFxuICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IFNvcnRhYmxlLmFjdGl2ZSxcbiAgICAgICAgaXNPd25lciA9IGFjdGl2ZUdyb3VwID09PSBncm91cCxcbiAgICAgICAgY2FuU29ydCA9IG9wdGlvbnMuc29ydCxcbiAgICAgICAgZnJvbVNvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgYWN0aXZlU29ydGFibGUsXG4gICAgICAgIHZlcnRpY2FsLFxuICAgICAgICBfdGhpcyA9IHRoaXMsXG4gICAgICAgIGNvbXBsZXRlZEZpcmVkID0gZmFsc2U7XG5cbiAgICBpZiAoX3NpbGVudCkgcmV0dXJuO1xuXG4gICAgZnVuY3Rpb24gZHJhZ092ZXJFdmVudChuYW1lLCBleHRyYSkge1xuICAgICAgcGx1Z2luRXZlbnQobmFtZSwgX3RoaXMsIF9vYmplY3RTcHJlYWQyKHtcbiAgICAgICAgZXZ0OiBldnQsXG4gICAgICAgIGlzT3duZXI6IGlzT3duZXIsXG4gICAgICAgIGF4aXM6IHZlcnRpY2FsID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJyxcbiAgICAgICAgcmV2ZXJ0OiByZXZlcnQsXG4gICAgICAgIGRyYWdSZWN0OiBkcmFnUmVjdCxcbiAgICAgICAgdGFyZ2V0UmVjdDogdGFyZ2V0UmVjdCxcbiAgICAgICAgY2FuU29ydDogY2FuU29ydCxcbiAgICAgICAgZnJvbVNvcnRhYmxlOiBmcm9tU29ydGFibGUsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBjb21wbGV0ZWQ6IGNvbXBsZXRlZCxcbiAgICAgICAgb25Nb3ZlOiBmdW5jdGlvbiBvbk1vdmUodGFyZ2V0LCBhZnRlcikge1xuICAgICAgICAgIHJldHVybiBfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgZ2V0UmVjdCh0YXJnZXQpLCBldnQsIGFmdGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hhbmdlZDogY2hhbmdlZFxuICAgICAgfSwgZXh0cmEpKTtcbiAgICB9IC8vIENhcHR1cmUgYW5pbWF0aW9uIHN0YXRlXG5cblxuICAgIGZ1bmN0aW9uIGNhcHR1cmUoKSB7XG4gICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlckFuaW1hdGlvbkNhcHR1cmUnKTtcblxuICAgICAgX3RoaXMuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG5cbiAgICAgIGlmIChfdGhpcyAhPT0gZnJvbVNvcnRhYmxlKSB7XG4gICAgICAgIGZyb21Tb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9IC8vIFJldHVybiBpbnZvY2F0aW9uIHdoZW4gZHJhZ0VsIGlzIGluc2VydGVkIChvciBjb21wbGV0ZWQpXG5cblxuICAgIGZ1bmN0aW9uIGNvbXBsZXRlZChpbnNlcnRpb24pIHtcbiAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyQ29tcGxldGVkJywge1xuICAgICAgICBpbnNlcnRpb246IGluc2VydGlvblxuICAgICAgfSk7XG5cbiAgICAgIGlmIChpbnNlcnRpb24pIHtcbiAgICAgICAgLy8gQ2xvbmVzIG11c3QgYmUgaGlkZGVuIGJlZm9yZSBmb2xkaW5nIGFuaW1hdGlvbiB0byBjYXB0dXJlIGRyYWdSZWN0QWJzb2x1dGUgcHJvcGVybHlcbiAgICAgICAgaWYgKGlzT3duZXIpIHtcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5faGlkZUNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShfdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXMgIT09IGZyb21Tb3J0YWJsZSkge1xuICAgICAgICAgIC8vIFNldCBnaG9zdCBjbGFzcyB0byBuZXcgc29ydGFibGUncyBnaG9zdCBjbGFzc1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgcHV0U29ydGFibGUgPyBwdXRTb3J0YWJsZS5vcHRpb25zLmdob3N0Q2xhc3MgOiBhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmdob3N0Q2xhc3MsIGZhbHNlKTtcbiAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHV0U29ydGFibGUgIT09IF90aGlzICYmIF90aGlzICE9PSBTb3J0YWJsZS5hY3RpdmUpIHtcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IF90aGlzO1xuICAgICAgICB9IGVsc2UgaWYgKF90aGlzID09PSBTb3J0YWJsZS5hY3RpdmUgJiYgcHV0U29ydGFibGUpIHtcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IG51bGw7XG4gICAgICAgIH0gLy8gQW5pbWF0aW9uXG5cblxuICAgICAgICBpZiAoZnJvbVNvcnRhYmxlID09PSBfdGhpcykge1xuICAgICAgICAgIF90aGlzLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9IHRhcmdldDtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLmFuaW1hdGVBbGwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGUnKTtcbiAgICAgICAgICBfdGhpcy5faWdub3JlV2hpbGVBbmltYXRpbmcgPSBudWxsO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoX3RoaXMgIT09IGZyb21Tb3J0YWJsZSkge1xuICAgICAgICAgIGZyb21Tb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gTnVsbCBsYXN0VGFyZ2V0IGlmIGl0IGlzIG5vdCBpbnNpZGUgYSBwcmV2aW91c2x5IHN3YXBwZWQgZWxlbWVudFxuXG5cbiAgICAgIGlmICh0YXJnZXQgPT09IGRyYWdFbCAmJiAhZHJhZ0VsLmFuaW1hdGVkIHx8IHRhcmdldCA9PT0gZWwgJiYgIXRhcmdldC5hbmltYXRlZCkge1xuICAgICAgICBsYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICAgIH0gLy8gbm8gYnViYmxpbmcgYW5kIG5vdCBmYWxsYmFja1xuXG5cbiAgICAgIGlmICghb3B0aW9ucy5kcmFnb3ZlckJ1YmJsZSAmJiAhZXZ0LnJvb3RFbCAmJiB0YXJnZXQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwoZXZ0LnRhcmdldCk7IC8vIERvIG5vdCBkZXRlY3QgZm9yIGVtcHR5IGluc2VydCBpZiBhbHJlYWR5IGluc2VydGVkXG5cblxuICAgICAgICAhaW5zZXJ0aW9uICYmIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KGV2dCk7XG4gICAgICB9XG5cbiAgICAgICFvcHRpb25zLmRyYWdvdmVyQnViYmxlICYmIGV2dC5zdG9wUHJvcGFnYXRpb24gJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuIGNvbXBsZXRlZEZpcmVkID0gdHJ1ZTtcbiAgICB9IC8vIENhbGwgd2hlbiBkcmFnRWwgaGFzIGJlZW4gaW5zZXJ0ZWRcblxuXG4gICAgZnVuY3Rpb24gY2hhbmdlZCgpIHtcbiAgICAgIG5ld0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcbiAgICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gaW5kZXgoZHJhZ0VsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG5cbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICBuYW1lOiAnY2hhbmdlJyxcbiAgICAgICAgdG9FbDogZWwsXG4gICAgICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4LFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChldnQucHJldmVudERlZmF1bHQgIT09IHZvaWQgMCkge1xuICAgICAgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gY2xvc2VzdCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCwgdHJ1ZSk7XG4gICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXInKTtcbiAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuIGNvbXBsZXRlZEZpcmVkO1xuXG4gICAgaWYgKGRyYWdFbC5jb250YWlucyhldnQudGFyZ2V0KSB8fCB0YXJnZXQuYW5pbWF0ZWQgJiYgdGFyZ2V0LmFuaW1hdGluZ1ggJiYgdGFyZ2V0LmFuaW1hdGluZ1kgfHwgX3RoaXMuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID09PSB0YXJnZXQpIHtcbiAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgIH1cblxuICAgIGlnbm9yZU5leHRDbGljayA9IGZhbHNlO1xuXG4gICAgaWYgKGFjdGl2ZVNvcnRhYmxlICYmICFvcHRpb25zLmRpc2FibGVkICYmIChpc093bmVyID8gY2FuU29ydCB8fCAocmV2ZXJ0ID0gcGFyZW50RWwgIT09IHJvb3RFbCkgLy8gUmV2ZXJ0aW5nIGl0ZW0gaW50byB0aGUgb3JpZ2luYWwgbGlzdFxuICAgIDogcHV0U29ydGFibGUgPT09IHRoaXMgfHwgKHRoaXMubGFzdFB1dE1vZGUgPSBhY3RpdmVHcm91cC5jaGVja1B1bGwodGhpcywgYWN0aXZlU29ydGFibGUsIGRyYWdFbCwgZXZ0KSkgJiYgZ3JvdXAuY2hlY2tQdXQodGhpcywgYWN0aXZlU29ydGFibGUsIGRyYWdFbCwgZXZ0KSkpIHtcbiAgICAgIHZlcnRpY2FsID0gdGhpcy5fZ2V0RGlyZWN0aW9uKGV2dCwgdGFyZ2V0KSA9PT0gJ3ZlcnRpY2FsJztcbiAgICAgIGRyYWdSZWN0ID0gZ2V0UmVjdChkcmFnRWwpO1xuICAgICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXJWYWxpZCcpO1xuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybiBjb21wbGV0ZWRGaXJlZDtcblxuICAgICAgaWYgKHJldmVydCkge1xuICAgICAgICBwYXJlbnRFbCA9IHJvb3RFbDsgLy8gYWN0dWFsaXphdGlvblxuXG4gICAgICAgIGNhcHR1cmUoKTtcblxuICAgICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgICBkcmFnT3ZlckV2ZW50KCdyZXZlcnQnKTtcblxuICAgICAgICBpZiAoIVNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgICBpZiAobmV4dEVsKSB7XG4gICAgICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgbmV4dEVsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVsTGFzdENoaWxkID0gbGFzdENoaWxkKGVsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG5cbiAgICAgIGlmICghZWxMYXN0Q2hpbGQgfHwgX2dob3N0SXNMYXN0KGV2dCwgdmVydGljYWwsIHRoaXMpICYmICFlbExhc3RDaGlsZC5hbmltYXRlZCkge1xuICAgICAgICAvLyBJbnNlcnQgdG8gZW5kIG9mIGxpc3RcbiAgICAgICAgLy8gSWYgYWxyZWFkeSBhdCBlbmQgb2YgbGlzdDogRG8gbm90IGluc2VydFxuICAgICAgICBpZiAoZWxMYXN0Q2hpbGQgPT09IGRyYWdFbCkge1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICB9IC8vIGlmIHRoZXJlIGlzIGEgbGFzdCBlbGVtZW50LCBpdCBpcyB0aGUgdGFyZ2V0XG5cblxuICAgICAgICBpZiAoZWxMYXN0Q2hpbGQgJiYgZWwgPT09IGV2dC50YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXQgPSBlbExhc3RDaGlsZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXRSZWN0ID0gZ2V0UmVjdCh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCBldnQsICEhdGFyZ2V0KSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjYXB0dXJlKCk7XG4gICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoZHJhZ0VsKTtcbiAgICAgICAgICBwYXJlbnRFbCA9IGVsOyAvLyBhY3R1YWxpemF0aW9uXG5cbiAgICAgICAgICBjaGFuZ2VkKCk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbExhc3RDaGlsZCAmJiBfZ2hvc3RJc0ZpcnN0KGV2dCwgdmVydGljYWwsIHRoaXMpKSB7XG4gICAgICAgIC8vIEluc2VydCB0byBzdGFydCBvZiBsaXN0XG4gICAgICAgIHZhciBmaXJzdENoaWxkID0gZ2V0Q2hpbGQoZWwsIDAsIG9wdGlvbnMsIHRydWUpO1xuXG4gICAgICAgIGlmIChmaXJzdENoaWxkID09PSBkcmFnRWwpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldCA9IGZpcnN0Q2hpbGQ7XG4gICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG5cbiAgICAgICAgaWYgKF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCBldnQsIGZhbHNlKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjYXB0dXJlKCk7XG4gICAgICAgICAgZWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgZmlyc3RDaGlsZCk7XG4gICAgICAgICAgcGFyZW50RWwgPSBlbDsgLy8gYWN0dWFsaXphdGlvblxuXG4gICAgICAgICAgY2hhbmdlZCgpO1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LnBhcmVudE5vZGUgPT09IGVsKSB7XG4gICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSAwLFxuICAgICAgICAgICAgdGFyZ2V0QmVmb3JlRmlyc3RTd2FwLFxuICAgICAgICAgICAgZGlmZmVyZW50TGV2ZWwgPSBkcmFnRWwucGFyZW50Tm9kZSAhPT0gZWwsXG4gICAgICAgICAgICBkaWZmZXJlbnRSb3dDb2wgPSAhX2RyYWdFbEluUm93Q29sdW1uKGRyYWdFbC5hbmltYXRlZCAmJiBkcmFnRWwudG9SZWN0IHx8IGRyYWdSZWN0LCB0YXJnZXQuYW5pbWF0ZWQgJiYgdGFyZ2V0LnRvUmVjdCB8fCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCksXG4gICAgICAgICAgICBzaWRlMSA9IHZlcnRpY2FsID8gJ3RvcCcgOiAnbGVmdCcsXG4gICAgICAgICAgICBzY3JvbGxlZFBhc3RUb3AgPSBpc1Njcm9sbGVkUGFzdCh0YXJnZXQsICd0b3AnLCAndG9wJykgfHwgaXNTY3JvbGxlZFBhc3QoZHJhZ0VsLCAndG9wJywgJ3RvcCcpLFxuICAgICAgICAgICAgc2Nyb2xsQmVmb3JlID0gc2Nyb2xsZWRQYXN0VG9wID8gc2Nyb2xsZWRQYXN0VG9wLnNjcm9sbFRvcCA6IHZvaWQgMDtcblxuICAgICAgICBpZiAobGFzdFRhcmdldCAhPT0gdGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0QmVmb3JlRmlyc3RTd2FwID0gdGFyZ2V0UmVjdFtzaWRlMV07XG4gICAgICAgICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2U7XG4gICAgICAgICAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9ICFkaWZmZXJlbnRSb3dDb2wgJiYgb3B0aW9ucy5pbnZlcnRTd2FwIHx8IGRpZmZlcmVudExldmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlyZWN0aW9uID0gX2dldFN3YXBEaXJlY3Rpb24oZXZ0LCB0YXJnZXQsIHRhcmdldFJlY3QsIHZlcnRpY2FsLCBkaWZmZXJlbnRSb3dDb2wgPyAxIDogb3B0aW9ucy5zd2FwVGhyZXNob2xkLCBvcHRpb25zLmludmVydGVkU3dhcFRocmVzaG9sZCA9PSBudWxsID8gb3B0aW9ucy5zd2FwVGhyZXNob2xkIDogb3B0aW9ucy5pbnZlcnRlZFN3YXBUaHJlc2hvbGQsIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQsIGxhc3RUYXJnZXQgPT09IHRhcmdldCk7XG4gICAgICAgIHZhciBzaWJsaW5nO1xuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0YXJnZXQgaXMgYmVzaWRlIGRyYWdFbCBpbiByZXNwZWN0aXZlIGRpcmVjdGlvbiAoaWdub3JpbmcgaGlkZGVuIGVsZW1lbnRzKVxuICAgICAgICAgIHZhciBkcmFnSW5kZXggPSBpbmRleChkcmFnRWwpO1xuXG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgZHJhZ0luZGV4IC09IGRpcmVjdGlvbjtcbiAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnRFbC5jaGlsZHJlbltkcmFnSW5kZXhdO1xuICAgICAgICAgIH0gd2hpbGUgKHNpYmxpbmcgJiYgKGNzcyhzaWJsaW5nLCAnZGlzcGxheScpID09PSAnbm9uZScgfHwgc2libGluZyA9PT0gZ2hvc3RFbCkpO1xuICAgICAgICB9IC8vIElmIGRyYWdFbCBpcyBhbHJlYWR5IGJlc2lkZSB0YXJnZXQ6IERvIG5vdCBpbnNlcnRcblxuXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IDAgfHwgc2libGluZyA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICBsYXN0RGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICB2YXIgbmV4dFNpYmxpbmcgPSB0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nLFxuICAgICAgICAgICAgYWZ0ZXIgPSBmYWxzZTtcbiAgICAgICAgYWZ0ZXIgPSBkaXJlY3Rpb24gPT09IDE7XG5cbiAgICAgICAgdmFyIG1vdmVWZWN0b3IgPSBfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgdGFyZ2V0UmVjdCwgZXZ0LCBhZnRlcik7XG5cbiAgICAgICAgaWYgKG1vdmVWZWN0b3IgIT09IGZhbHNlKSB7XG4gICAgICAgICAgaWYgKG1vdmVWZWN0b3IgPT09IDEgfHwgbW92ZVZlY3RvciA9PT0gLTEpIHtcbiAgICAgICAgICAgIGFmdGVyID0gbW92ZVZlY3RvciA9PT0gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfc2lsZW50ID0gdHJ1ZTtcbiAgICAgICAgICBzZXRUaW1lb3V0KF91bnNpbGVudCwgMzApO1xuICAgICAgICAgIGNhcHR1cmUoKTtcblxuICAgICAgICAgIGlmIChhZnRlciAmJiAhbmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkcmFnRWwsIGFmdGVyID8gbmV4dFNpYmxpbmcgOiB0YXJnZXQpO1xuICAgICAgICAgIH0gLy8gVW5kbyBjaHJvbWUncyBzY3JvbGwgYWRqdXN0bWVudCAoaGFzIG5vIGVmZmVjdCBvbiBvdGhlciBicm93c2VycylcblxuXG4gICAgICAgICAgaWYgKHNjcm9sbGVkUGFzdFRvcCkge1xuICAgICAgICAgICAgc2Nyb2xsQnkoc2Nyb2xsZWRQYXN0VG9wLCAwLCBzY3JvbGxCZWZvcmUgLSBzY3JvbGxlZFBhc3RUb3Auc2Nyb2xsVG9wKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJlbnRFbCA9IGRyYWdFbC5wYXJlbnROb2RlOyAvLyBhY3R1YWxpemF0aW9uXG4gICAgICAgICAgLy8gbXVzdCBiZSBkb25lIGJlZm9yZSBhbmltYXRpb25cblxuICAgICAgICAgIGlmICh0YXJnZXRCZWZvcmVGaXJzdFN3YXAgIT09IHVuZGVmaW5lZCAmJiAhaXNDaXJjdW1zdGFudGlhbEludmVydCkge1xuICAgICAgICAgICAgdGFyZ2V0TW92ZURpc3RhbmNlID0gTWF0aC5hYnModGFyZ2V0QmVmb3JlRmlyc3RTd2FwIC0gZ2V0UmVjdCh0YXJnZXQpW3NpZGUxXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2hhbmdlZCgpO1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGVsLmNvbnRhaW5zKGRyYWdFbCkpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBfaWdub3JlV2hpbGVBbmltYXRpbmc6IG51bGwsXG4gIF9vZmZNb3ZlRXZlbnRzOiBmdW5jdGlvbiBfb2ZmTW92ZUV2ZW50cygpIHtcbiAgICBvZmYoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ2RyYWdvdmVyJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgIG9mZihkb2N1bWVudCwgJ21vdXNlbW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICBvZmYoZG9jdW1lbnQsICd0b3VjaG1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gIH0sXG4gIF9vZmZVcEV2ZW50czogZnVuY3Rpb24gX29mZlVwRXZlbnRzKCkge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gdGhpcy5lbC5vd25lckRvY3VtZW50O1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX29uRHJvcCk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX29uRHJvcCk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihkb2N1bWVudCwgJ3NlbGVjdHN0YXJ0JywgdGhpcyk7XG4gIH0sXG4gIF9vbkRyb3A6IGZ1bmN0aW9uIF9vbkRyb3AoXG4gIC8qKkV2ZW50Ki9cbiAgZXZ0KSB7XG4gICAgdmFyIGVsID0gdGhpcy5lbCxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XG5cbiAgICBuZXdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG4gICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICBwbHVnaW5FdmVudCgnZHJvcCcsIHRoaXMsIHtcbiAgICAgIGV2dDogZXZ0XG4gICAgfSk7XG4gICAgcGFyZW50RWwgPSBkcmFnRWwgJiYgZHJhZ0VsLnBhcmVudE5vZGU7IC8vIEdldCBhZ2FpbiBhZnRlciBwbHVnaW4gZXZlbnRcblxuICAgIG5ld0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcbiAgICBuZXdEcmFnZ2FibGVJbmRleCA9IGluZGV4KGRyYWdFbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuXG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIHRoaXMuX251bGxpbmcoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICBpc0NpcmN1bXN0YW50aWFsSW52ZXJ0ID0gZmFsc2U7XG4gICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2U7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9sb29wSWQpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9kcmFnU3RhcnRUaW1lcik7XG5cbiAgICBfY2FuY2VsTmV4dFRpY2sodGhpcy5jbG9uZUlkKTtcblxuICAgIF9jYW5jZWxOZXh0VGljayh0aGlzLl9kcmFnU3RhcnRJZCk7IC8vIFVuYmluZCBldmVudHNcblxuXG4gICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICBvZmYoZG9jdW1lbnQsICdkcm9wJywgdGhpcyk7XG4gICAgICBvZmYoZWwsICdkcmFnc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydCk7XG4gICAgfVxuXG4gICAgdGhpcy5fb2ZmTW92ZUV2ZW50cygpO1xuXG4gICAgdGhpcy5fb2ZmVXBFdmVudHMoKTtcblxuICAgIGlmIChTYWZhcmkpIHtcbiAgICAgIGNzcyhkb2N1bWVudC5ib2R5LCAndXNlci1zZWxlY3QnLCAnJyk7XG4gICAgfVxuXG4gICAgY3NzKGRyYWdFbCwgJ3RyYW5zZm9ybScsICcnKTtcblxuICAgIGlmIChldnQpIHtcbiAgICAgIGlmIChtb3ZlZCkge1xuICAgICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgIW9wdGlvbnMuZHJvcEJ1YmJsZSAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIGdob3N0RWwgJiYgZ2hvc3RFbC5wYXJlbnROb2RlICYmIGdob3N0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChnaG9zdEVsKTtcblxuICAgICAgaWYgKHJvb3RFbCA9PT0gcGFyZW50RWwgfHwgcHV0U29ydGFibGUgJiYgcHV0U29ydGFibGUubGFzdFB1dE1vZGUgIT09ICdjbG9uZScpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGNsb25lKHMpXG4gICAgICAgIGNsb25lRWwgJiYgY2xvbmVFbC5wYXJlbnROb2RlICYmIGNsb25lRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZUVsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdFbCkge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgICBvZmYoZHJhZ0VsLCAnZHJhZ2VuZCcsIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2Rpc2FibGVEcmFnZ2FibGUoZHJhZ0VsKTtcblxuICAgICAgICBkcmFnRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnJzsgLy8gUmVtb3ZlIGNsYXNzZXNcbiAgICAgICAgLy8gZ2hvc3RDbGFzcyBpcyBhZGRlZCBpbiBkcmFnU3RhcnRlZFxuXG4gICAgICAgIGlmIChtb3ZlZCAmJiAhYXdhaXRpbmdEcmFnU3RhcnRlZCkge1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgcHV0U29ydGFibGUgPyBwdXRTb3J0YWJsZS5vcHRpb25zLmdob3N0Q2xhc3MgOiB0aGlzLm9wdGlvbnMuZ2hvc3RDbGFzcywgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTsgLy8gRHJhZyBzdG9wIGV2ZW50XG5cbiAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgIG5hbWU6ICd1bmNob29zZScsXG4gICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgbmV3SW5kZXg6IG51bGwsXG4gICAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG51bGwsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyb290RWwgIT09IHBhcmVudEVsKSB7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ID49IDApIHtcbiAgICAgICAgICAgIC8vIEFkZCBldmVudFxuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICByb290RWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBuYW1lOiAnYWRkJyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIGZyb21FbDogcm9vdEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pOyAvLyBSZW1vdmUgZXZlbnRcblxuXG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICBuYW1lOiAncmVtb3ZlJyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgfSk7IC8vIGRyYWcgZnJvbSBvbmUgbGlzdCBhbmQgZHJvcCBpbnRvIGFub3RoZXJcblxuXG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHJvb3RFbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIG5hbWU6ICdzb3J0JyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIGZyb21FbDogcm9vdEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICBuYW1lOiAnc29ydCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLnNhdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobmV3SW5kZXggIT09IG9sZEluZGV4KSB7XG4gICAgICAgICAgICBpZiAobmV3SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAvLyBkcmFnICYgZHJvcCB3aXRoaW4gdGhlIHNhbWUgbGlzdFxuICAgICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmFtZTogJ3VwZGF0ZScsXG4gICAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnc29ydCcsXG4gICAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChTb3J0YWJsZS5hY3RpdmUpIHtcbiAgICAgICAgICAvKiBqc2hpbnQgZXFudWxsOnRydWUgKi9cbiAgICAgICAgICBpZiAobmV3SW5kZXggPT0gbnVsbCB8fCBuZXdJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIG5ld0luZGV4ID0gb2xkSW5kZXg7XG4gICAgICAgICAgICBuZXdEcmFnZ2FibGVJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgbmFtZTogJ2VuZCcsXG4gICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgIH0pOyAvLyBTYXZlIHNvcnRpbmdcblxuXG4gICAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9udWxsaW5nKCk7XG4gIH0sXG4gIF9udWxsaW5nOiBmdW5jdGlvbiBfbnVsbGluZygpIHtcbiAgICBwbHVnaW5FdmVudCgnbnVsbGluZycsIHRoaXMpO1xuICAgIHJvb3RFbCA9IGRyYWdFbCA9IHBhcmVudEVsID0gZ2hvc3RFbCA9IG5leHRFbCA9IGNsb25lRWwgPSBsYXN0RG93bkVsID0gY2xvbmVIaWRkZW4gPSB0YXBFdnQgPSB0b3VjaEV2dCA9IG1vdmVkID0gbmV3SW5kZXggPSBuZXdEcmFnZ2FibGVJbmRleCA9IG9sZEluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXggPSBsYXN0VGFyZ2V0ID0gbGFzdERpcmVjdGlvbiA9IHB1dFNvcnRhYmxlID0gYWN0aXZlR3JvdXAgPSBTb3J0YWJsZS5kcmFnZ2VkID0gU29ydGFibGUuZ2hvc3QgPSBTb3J0YWJsZS5jbG9uZSA9IFNvcnRhYmxlLmFjdGl2ZSA9IG51bGw7XG4gICAgc2F2ZWRJbnB1dENoZWNrZWQuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGVsLmNoZWNrZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHNhdmVkSW5wdXRDaGVja2VkLmxlbmd0aCA9IGxhc3REeCA9IGxhc3REeSA9IDA7XG4gIH0sXG4gIGhhbmRsZUV2ZW50OiBmdW5jdGlvbiBoYW5kbGVFdmVudChcbiAgLyoqRXZlbnQqL1xuICBldnQpIHtcbiAgICBzd2l0Y2ggKGV2dC50eXBlKSB7XG4gICAgICBjYXNlICdkcm9wJzpcbiAgICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgICAgICB0aGlzLl9vbkRyb3AoZXZ0KTtcblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICAgICAgaWYgKGRyYWdFbCkge1xuICAgICAgICAgIHRoaXMuX29uRHJhZ092ZXIoZXZ0KTtcblxuICAgICAgICAgIF9nbG9iYWxEcmFnT3ZlcihldnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NlbGVjdHN0YXJ0JzpcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU2VyaWFsaXplcyB0aGUgaXRlbSBpbnRvIGFuIGFycmF5IG9mIHN0cmluZy5cbiAgICogQHJldHVybnMge1N0cmluZ1tdfVxuICAgKi9cbiAgdG9BcnJheTogZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICB2YXIgb3JkZXIgPSBbXSxcbiAgICAgICAgZWwsXG4gICAgICAgIGNoaWxkcmVuID0gdGhpcy5lbC5jaGlsZHJlbixcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIG4gPSBjaGlsZHJlbi5sZW5ndGgsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBmb3IgKDsgaSA8IG47IGkrKykge1xuICAgICAgZWwgPSBjaGlsZHJlbltpXTtcblxuICAgICAgaWYgKGNsb3Nlc3QoZWwsIG9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLmVsLCBmYWxzZSkpIHtcbiAgICAgICAgb3JkZXIucHVzaChlbC5nZXRBdHRyaWJ1dGUob3B0aW9ucy5kYXRhSWRBdHRyKSB8fCBfZ2VuZXJhdGVJZChlbCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcmRlcjtcbiAgfSxcblxuICAvKipcbiAgICogU29ydHMgdGhlIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgYXJyYXkuXG4gICAqIEBwYXJhbSAge1N0cmluZ1tdfSAgb3JkZXIgIG9yZGVyIG9mIHRoZSBpdGVtc1xuICAgKi9cbiAgc29ydDogZnVuY3Rpb24gc29ydChvcmRlciwgdXNlQW5pbWF0aW9uKSB7XG4gICAgdmFyIGl0ZW1zID0ge30sXG4gICAgICAgIHJvb3RFbCA9IHRoaXMuZWw7XG4gICAgdGhpcy50b0FycmF5KCkuZm9yRWFjaChmdW5jdGlvbiAoaWQsIGkpIHtcbiAgICAgIHZhciBlbCA9IHJvb3RFbC5jaGlsZHJlbltpXTtcblxuICAgICAgaWYgKGNsb3Nlc3QoZWwsIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUsIHJvb3RFbCwgZmFsc2UpKSB7XG4gICAgICAgIGl0ZW1zW2lkXSA9IGVsO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICAgIHVzZUFuaW1hdGlvbiAmJiB0aGlzLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIG9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoaXRlbXNbaWRdKSB7XG4gICAgICAgIHJvb3RFbC5yZW1vdmVDaGlsZChpdGVtc1tpZF0pO1xuICAgICAgICByb290RWwuYXBwZW5kQ2hpbGQoaXRlbXNbaWRdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1c2VBbmltYXRpb24gJiYgdGhpcy5hbmltYXRlQWxsKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIGN1cnJlbnQgc29ydGluZ1xuICAgKi9cbiAgc2F2ZTogZnVuY3Rpb24gc2F2ZSgpIHtcbiAgICB2YXIgc3RvcmUgPSB0aGlzLm9wdGlvbnMuc3RvcmU7XG4gICAgc3RvcmUgJiYgc3RvcmUuc2V0ICYmIHN0b3JlLnNldCh0aGlzKTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0LCBnZXQgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciBieSB0ZXN0aW5nIHRoZSBlbGVtZW50IGl0c2VsZiBhbmQgdHJhdmVyc2luZyB1cCB0aHJvdWdoIGl0cyBhbmNlc3RvcnMgaW4gdGhlIERPTSB0cmVlLlxuICAgKiBAcGFyYW0gICB7SFRNTEVsZW1lbnR9ICBlbFxuICAgKiBAcGFyYW0gICB7U3RyaW5nfSAgICAgICBbc2VsZWN0b3JdICBkZWZhdWx0OiBgb3B0aW9ucy5kcmFnZ2FibGVgXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgY2xvc2VzdDogZnVuY3Rpb24gY2xvc2VzdCQxKGVsLCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBjbG9zZXN0KGVsLCBzZWxlY3RvciB8fCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLmVsLCBmYWxzZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldC9nZXQgb3B0aW9uXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtICAgeyp9ICAgICAgW3ZhbHVlXVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIG9wdGlvbjogZnVuY3Rpb24gb3B0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnNbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtb2RpZmllZFZhbHVlID0gUGx1Z2luTWFuYWdlci5tb2RpZnlPcHRpb24odGhpcywgbmFtZSwgdmFsdWUpO1xuXG4gICAgICBpZiAodHlwZW9mIG1vZGlmaWVkVmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9wdGlvbnNbbmFtZV0gPSBtb2RpZmllZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmFtZSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRGVzdHJveVxuICAgKi9cbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICBwbHVnaW5FdmVudCgnZGVzdHJveScsIHRoaXMpO1xuICAgIHZhciBlbCA9IHRoaXMuZWw7XG4gICAgZWxbZXhwYW5kb10gPSBudWxsO1xuICAgIG9mZihlbCwgJ21vdXNlZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgIG9mZihlbCwgJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgICBvZmYoZWwsICdwb2ludGVyZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuXG4gICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICBvZmYoZWwsICdkcmFnb3ZlcicsIHRoaXMpO1xuICAgICAgb2ZmKGVsLCAnZHJhZ2VudGVyJywgdGhpcyk7XG4gICAgfSAvLyBSZW1vdmUgZHJhZ2dhYmxlIGF0dHJpYnV0ZXNcblxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbC5xdWVyeVNlbGVjdG9yQWxsKCdbZHJhZ2dhYmxlXScpLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dhYmxlJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9vbkRyb3AoKTtcblxuICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpO1xuXG4gICAgc29ydGFibGVzLnNwbGljZShzb3J0YWJsZXMuaW5kZXhPZih0aGlzLmVsKSwgMSk7XG4gICAgdGhpcy5lbCA9IGVsID0gbnVsbDtcbiAgfSxcbiAgX2hpZGVDbG9uZTogZnVuY3Rpb24gX2hpZGVDbG9uZSgpIHtcbiAgICBpZiAoIWNsb25lSGlkZGVuKSB7XG4gICAgICBwbHVnaW5FdmVudCgnaGlkZUNsb25lJywgdGhpcyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuO1xuICAgICAgY3NzKGNsb25lRWwsICdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSAmJiBjbG9uZUVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgY2xvbmVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lRWwpO1xuICAgICAgfVxuXG4gICAgICBjbG9uZUhpZGRlbiA9IHRydWU7XG4gICAgfVxuICB9LFxuICBfc2hvd0Nsb25lOiBmdW5jdGlvbiBfc2hvd0Nsb25lKHB1dFNvcnRhYmxlKSB7XG4gICAgaWYgKHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlICE9PSAnY2xvbmUnKSB7XG4gICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjbG9uZUhpZGRlbikge1xuICAgICAgcGx1Z2luRXZlbnQoJ3Nob3dDbG9uZScsIHRoaXMpO1xuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybjsgLy8gc2hvdyBjbG9uZSBhdCBkcmFnRWwgb3Igb3JpZ2luYWwgcG9zaXRpb25cblxuICAgICAgaWYgKGRyYWdFbC5wYXJlbnROb2RlID09IHJvb3RFbCAmJiAhdGhpcy5vcHRpb25zLmdyb3VwLnJldmVydENsb25lKSB7XG4gICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmVFbCwgZHJhZ0VsKTtcbiAgICAgIH0gZWxzZSBpZiAobmV4dEVsKSB7XG4gICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmVFbCwgbmV4dEVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChjbG9uZUVsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncm91cC5yZXZlcnRDbG9uZSkge1xuICAgICAgICB0aGlzLmFuaW1hdGUoZHJhZ0VsLCBjbG9uZUVsKTtcbiAgICAgIH1cblxuICAgICAgY3NzKGNsb25lRWwsICdkaXNwbGF5JywgJycpO1xuICAgICAgY2xvbmVIaWRkZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9nbG9iYWxEcmFnT3Zlcihcbi8qKkV2ZW50Ki9cbmV2dCkge1xuICBpZiAoZXZ0LmRhdGFUcmFuc2Zlcikge1xuICAgIGV2dC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcbiAgfVxuXG4gIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG5mdW5jdGlvbiBfb25Nb3ZlKGZyb21FbCwgdG9FbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0RWwsIHRhcmdldFJlY3QsIG9yaWdpbmFsRXZlbnQsIHdpbGxJbnNlcnRBZnRlcikge1xuICB2YXIgZXZ0LFxuICAgICAgc29ydGFibGUgPSBmcm9tRWxbZXhwYW5kb10sXG4gICAgICBvbk1vdmVGbiA9IHNvcnRhYmxlLm9wdGlvbnMub25Nb3ZlLFxuICAgICAgcmV0VmFsOyAvLyBTdXBwb3J0IGZvciBuZXcgQ3VzdG9tRXZlbnQgZmVhdHVyZVxuXG4gIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgIUlFMTFPckxlc3MgJiYgIUVkZ2UpIHtcbiAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ21vdmUnLCB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2dC5pbml0RXZlbnQoJ21vdmUnLCB0cnVlLCB0cnVlKTtcbiAgfVxuXG4gIGV2dC50byA9IHRvRWw7XG4gIGV2dC5mcm9tID0gZnJvbUVsO1xuICBldnQuZHJhZ2dlZCA9IGRyYWdFbDtcbiAgZXZ0LmRyYWdnZWRSZWN0ID0gZHJhZ1JlY3Q7XG4gIGV2dC5yZWxhdGVkID0gdGFyZ2V0RWwgfHwgdG9FbDtcbiAgZXZ0LnJlbGF0ZWRSZWN0ID0gdGFyZ2V0UmVjdCB8fCBnZXRSZWN0KHRvRWwpO1xuICBldnQud2lsbEluc2VydEFmdGVyID0gd2lsbEluc2VydEFmdGVyO1xuICBldnQub3JpZ2luYWxFdmVudCA9IG9yaWdpbmFsRXZlbnQ7XG4gIGZyb21FbC5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cbiAgaWYgKG9uTW92ZUZuKSB7XG4gICAgcmV0VmFsID0gb25Nb3ZlRm4uY2FsbChzb3J0YWJsZSwgZXZ0LCBvcmlnaW5hbEV2ZW50KTtcbiAgfVxuXG4gIHJldHVybiByZXRWYWw7XG59XG5cbmZ1bmN0aW9uIF9kaXNhYmxlRHJhZ2dhYmxlKGVsKSB7XG4gIGVsLmRyYWdnYWJsZSA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBfdW5zaWxlbnQoKSB7XG4gIF9zaWxlbnQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gX2dob3N0SXNGaXJzdChldnQsIHZlcnRpY2FsLCBzb3J0YWJsZSkge1xuICB2YXIgcmVjdCA9IGdldFJlY3QoZ2V0Q2hpbGQoc29ydGFibGUuZWwsIDAsIHNvcnRhYmxlLm9wdGlvbnMsIHRydWUpKTtcbiAgdmFyIHNwYWNlciA9IDEwO1xuICByZXR1cm4gdmVydGljYWwgPyBldnQuY2xpZW50WCA8IHJlY3QubGVmdCAtIHNwYWNlciB8fCBldnQuY2xpZW50WSA8IHJlY3QudG9wICYmIGV2dC5jbGllbnRYIDwgcmVjdC5yaWdodCA6IGV2dC5jbGllbnRZIDwgcmVjdC50b3AgLSBzcGFjZXIgfHwgZXZ0LmNsaWVudFkgPCByZWN0LmJvdHRvbSAmJiBldnQuY2xpZW50WCA8IHJlY3QubGVmdDtcbn1cblxuZnVuY3Rpb24gX2dob3N0SXNMYXN0KGV2dCwgdmVydGljYWwsIHNvcnRhYmxlKSB7XG4gIHZhciByZWN0ID0gZ2V0UmVjdChsYXN0Q2hpbGQoc29ydGFibGUuZWwsIHNvcnRhYmxlLm9wdGlvbnMuZHJhZ2dhYmxlKSk7XG4gIHZhciBzcGFjZXIgPSAxMDtcbiAgcmV0dXJuIHZlcnRpY2FsID8gZXZ0LmNsaWVudFggPiByZWN0LnJpZ2h0ICsgc3BhY2VyIHx8IGV2dC5jbGllbnRYIDw9IHJlY3QucmlnaHQgJiYgZXZ0LmNsaWVudFkgPiByZWN0LmJvdHRvbSAmJiBldnQuY2xpZW50WCA+PSByZWN0LmxlZnQgOiBldnQuY2xpZW50WCA+IHJlY3QucmlnaHQgJiYgZXZ0LmNsaWVudFkgPiByZWN0LnRvcCB8fCBldnQuY2xpZW50WCA8PSByZWN0LnJpZ2h0ICYmIGV2dC5jbGllbnRZID4gcmVjdC5ib3R0b20gKyBzcGFjZXI7XG59XG5cbmZ1bmN0aW9uIF9nZXRTd2FwRGlyZWN0aW9uKGV2dCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCwgc3dhcFRocmVzaG9sZCwgaW52ZXJ0ZWRTd2FwVGhyZXNob2xkLCBpbnZlcnRTd2FwLCBpc0xhc3RUYXJnZXQpIHtcbiAgdmFyIG1vdXNlT25BeGlzID0gdmVydGljYWwgPyBldnQuY2xpZW50WSA6IGV2dC5jbGllbnRYLFxuICAgICAgdGFyZ2V0TGVuZ3RoID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LmhlaWdodCA6IHRhcmdldFJlY3Qud2lkdGgsXG4gICAgICB0YXJnZXRTMSA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC50b3AgOiB0YXJnZXRSZWN0LmxlZnQsXG4gICAgICB0YXJnZXRTMiA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5ib3R0b20gOiB0YXJnZXRSZWN0LnJpZ2h0LFxuICAgICAgaW52ZXJ0ID0gZmFsc2U7XG5cbiAgaWYgKCFpbnZlcnRTd2FwKSB7XG4gICAgLy8gTmV2ZXIgaW52ZXJ0IG9yIGNyZWF0ZSBkcmFnRWwgc2hhZG93IHdoZW4gdGFyZ2V0IG1vdmVtZW5ldCBjYXVzZXMgbW91c2UgdG8gbW92ZSBwYXN0IHRoZSBlbmQgb2YgcmVndWxhciBzd2FwVGhyZXNob2xkXG4gICAgaWYgKGlzTGFzdFRhcmdldCAmJiB0YXJnZXRNb3ZlRGlzdGFuY2UgPCB0YXJnZXRMZW5ndGggKiBzd2FwVGhyZXNob2xkKSB7XG4gICAgICAvLyBtdWx0aXBsaWVkIG9ubHkgYnkgc3dhcFRocmVzaG9sZCBiZWNhdXNlIG1vdXNlIHdpbGwgYWxyZWFkeSBiZSBpbnNpZGUgdGFyZ2V0IGJ5ICgxIC0gdGhyZXNob2xkKSAqIHRhcmdldExlbmd0aCAvIDJcbiAgICAgIC8vIGNoZWNrIGlmIHBhc3QgZmlyc3QgaW52ZXJ0IHRocmVzaG9sZCBvbiBzaWRlIG9wcG9zaXRlIG9mIGxhc3REaXJlY3Rpb25cbiAgICAgIGlmICghcGFzdEZpcnN0SW52ZXJ0VGhyZXNoICYmIChsYXN0RGlyZWN0aW9uID09PSAxID8gbW91c2VPbkF4aXMgPiB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIgOiBtb3VzZU9uQXhpcyA8IHRhcmdldFMyIC0gdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMikpIHtcbiAgICAgICAgLy8gcGFzdCBmaXJzdCBpbnZlcnQgdGhyZXNob2xkLCBkbyBub3QgcmVzdHJpY3QgaW52ZXJ0ZWQgdGhyZXNob2xkIHRvIGRyYWdFbCBzaGFkb3dcbiAgICAgICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwYXN0Rmlyc3RJbnZlcnRUaHJlc2gpIHtcbiAgICAgICAgLy8gZHJhZ0VsIHNoYWRvdyAodGFyZ2V0IG1vdmUgZGlzdGFuY2Ugc2hhZG93KVxuICAgICAgICBpZiAobGFzdERpcmVjdGlvbiA9PT0gMSA/IG1vdXNlT25BeGlzIDwgdGFyZ2V0UzEgKyB0YXJnZXRNb3ZlRGlzdGFuY2UgLy8gb3ZlciBkcmFnRWwgc2hhZG93XG4gICAgICAgIDogbW91c2VPbkF4aXMgPiB0YXJnZXRTMiAtIHRhcmdldE1vdmVEaXN0YW5jZSkge1xuICAgICAgICAgIHJldHVybiAtbGFzdERpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW52ZXJ0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVndWxhclxuICAgICAgaWYgKG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggKiAoMSAtIHN3YXBUaHJlc2hvbGQpIC8gMiAmJiBtb3VzZU9uQXhpcyA8IHRhcmdldFMyIC0gdGFyZ2V0TGVuZ3RoICogKDEgLSBzd2FwVGhyZXNob2xkKSAvIDIpIHtcbiAgICAgICAgcmV0dXJuIF9nZXRJbnNlcnREaXJlY3Rpb24odGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpbnZlcnQgPSBpbnZlcnQgfHwgaW52ZXJ0U3dhcDtcblxuICBpZiAoaW52ZXJ0KSB7XG4gICAgLy8gSW52ZXJ0IG9mIHJlZ3VsYXJcbiAgICBpZiAobW91c2VPbkF4aXMgPCB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIgfHwgbW91c2VPbkF4aXMgPiB0YXJnZXRTMiAtIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIpIHtcbiAgICAgIHJldHVybiBtb3VzZU9uQXhpcyA+IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoIC8gMiA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cbi8qKlxuICogR2V0cyB0aGUgZGlyZWN0aW9uIGRyYWdFbCBtdXN0IGJlIHN3YXBwZWQgcmVsYXRpdmUgdG8gdGFyZ2V0IGluIG9yZGVyIHRvIG1ha2UgaXRcbiAqIHNlZW0gdGhhdCBkcmFnRWwgaGFzIGJlZW4gXCJpbnNlcnRlZFwiIGludG8gdGhhdCBlbGVtZW50J3MgcG9zaXRpb25cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSB0YXJnZXQgICAgICAgVGhlIHRhcmdldCB3aG9zZSBwb3NpdGlvbiBkcmFnRWwgaXMgYmVpbmcgaW5zZXJ0ZWQgYXRcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGRyYWdFbCBtdXN0IGJlIHN3YXBwZWRcbiAqL1xuXG5cbmZ1bmN0aW9uIF9nZXRJbnNlcnREaXJlY3Rpb24odGFyZ2V0KSB7XG4gIGlmIChpbmRleChkcmFnRWwpIDwgaW5kZXgodGFyZ2V0KSkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAtMTtcbiAgfVxufVxuLyoqXG4gKiBHZW5lcmF0ZSBpZFxuICogQHBhcmFtICAge0hUTUxFbGVtZW50fSBlbFxuICogQHJldHVybnMge1N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuXG5mdW5jdGlvbiBfZ2VuZXJhdGVJZChlbCkge1xuICB2YXIgc3RyID0gZWwudGFnTmFtZSArIGVsLmNsYXNzTmFtZSArIGVsLnNyYyArIGVsLmhyZWYgKyBlbC50ZXh0Q29udGVudCxcbiAgICAgIGkgPSBzdHIubGVuZ3RoLFxuICAgICAgc3VtID0gMDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgc3VtICs9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICB9XG5cbiAgcmV0dXJuIHN1bS50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIF9zYXZlSW5wdXRDaGVja2VkU3RhdGUocm9vdCkge1xuICBzYXZlZElucHV0Q2hlY2tlZC5sZW5ndGggPSAwO1xuICB2YXIgaW5wdXRzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTtcbiAgdmFyIGlkeCA9IGlucHV0cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGlkeC0tKSB7XG4gICAgdmFyIGVsID0gaW5wdXRzW2lkeF07XG4gICAgZWwuY2hlY2tlZCAmJiBzYXZlZElucHV0Q2hlY2tlZC5wdXNoKGVsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfbmV4dFRpY2soZm4pIHtcbiAgcmV0dXJuIHNldFRpbWVvdXQoZm4sIDApO1xufVxuXG5mdW5jdGlvbiBfY2FuY2VsTmV4dFRpY2soaWQpIHtcbiAgcmV0dXJuIGNsZWFyVGltZW91dChpZCk7XG59IC8vIEZpeGVkICM5NzM6XG5cblxuaWYgKGRvY3VtZW50RXhpc3RzKSB7XG4gIG9uKGRvY3VtZW50LCAndG91Y2htb3ZlJywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGlmICgoU29ydGFibGUuYWN0aXZlIHx8IGF3YWl0aW5nRHJhZ1N0YXJ0ZWQpICYmIGV2dC5jYW5jZWxhYmxlKSB7XG4gICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0pO1xufSAvLyBFeHBvcnQgdXRpbHNcblxuXG5Tb3J0YWJsZS51dGlscyA9IHtcbiAgb246IG9uLFxuICBvZmY6IG9mZixcbiAgY3NzOiBjc3MsXG4gIGZpbmQ6IGZpbmQsXG4gIGlzOiBmdW5jdGlvbiBpcyhlbCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gISFjbG9zZXN0KGVsLCBzZWxlY3RvciwgZWwsIGZhbHNlKTtcbiAgfSxcbiAgZXh0ZW5kOiBleHRlbmQsXG4gIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgY2xvc2VzdDogY2xvc2VzdCxcbiAgdG9nZ2xlQ2xhc3M6IHRvZ2dsZUNsYXNzLFxuICBjbG9uZTogY2xvbmUsXG4gIGluZGV4OiBpbmRleCxcbiAgbmV4dFRpY2s6IF9uZXh0VGljayxcbiAgY2FuY2VsTmV4dFRpY2s6IF9jYW5jZWxOZXh0VGljayxcbiAgZGV0ZWN0RGlyZWN0aW9uOiBfZGV0ZWN0RGlyZWN0aW9uLFxuICBnZXRDaGlsZDogZ2V0Q2hpbGRcbn07XG4vKipcbiAqIEdldCB0aGUgU29ydGFibGUgaW5zdGFuY2Ugb2YgYW4gZWxlbWVudFxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnRcbiAqIEByZXR1cm4ge1NvcnRhYmxlfHVuZGVmaW5lZH0gICAgICAgICBUaGUgaW5zdGFuY2Ugb2YgU29ydGFibGVcbiAqL1xuXG5Tb3J0YWJsZS5nZXQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudFtleHBhbmRvXTtcbn07XG4vKipcbiAqIE1vdW50IGEgcGx1Z2luIHRvIFNvcnRhYmxlXG4gKiBAcGFyYW0gIHsuLi5Tb3J0YWJsZVBsdWdpbnxTb3J0YWJsZVBsdWdpbltdfSBwbHVnaW5zICAgICAgIFBsdWdpbnMgYmVpbmcgbW91bnRlZFxuICovXG5cblxuU29ydGFibGUubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwbHVnaW5zID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHBsdWdpbnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICBpZiAocGx1Z2luc1swXS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHBsdWdpbnMgPSBwbHVnaW5zWzBdO1xuICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgIGlmICghcGx1Z2luLnByb3RvdHlwZSB8fCAhcGx1Z2luLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcikge1xuICAgICAgdGhyb3cgXCJTb3J0YWJsZTogTW91bnRlZCBwbHVnaW4gbXVzdCBiZSBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCBub3QgXCIuY29uY2F0KHt9LnRvU3RyaW5nLmNhbGwocGx1Z2luKSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbi51dGlscykgU29ydGFibGUudXRpbHMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgU29ydGFibGUudXRpbHMpLCBwbHVnaW4udXRpbHMpO1xuICAgIFBsdWdpbk1hbmFnZXIubW91bnQocGx1Z2luKTtcbiAgfSk7XG59O1xuLyoqXG4gKiBDcmVhdGUgc29ydGFibGUgaW5zdGFuY2VcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9ICBlbFxuICogQHBhcmFtIHtPYmplY3R9ICAgICAgW29wdGlvbnNdXG4gKi9cblxuXG5Tb3J0YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBTb3J0YWJsZShlbCwgb3B0aW9ucyk7XG59OyAvLyBFeHBvcnRcblxuXG5Tb3J0YWJsZS52ZXJzaW9uID0gdmVyc2lvbjtcblxudmFyIGF1dG9TY3JvbGxzID0gW10sXG4gICAgc2Nyb2xsRWwsXG4gICAgc2Nyb2xsUm9vdEVsLFxuICAgIHNjcm9sbGluZyA9IGZhbHNlLFxuICAgIGxhc3RBdXRvU2Nyb2xsWCxcbiAgICBsYXN0QXV0b1Njcm9sbFksXG4gICAgdG91Y2hFdnQkMSxcbiAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbDtcblxuZnVuY3Rpb24gQXV0b1Njcm9sbFBsdWdpbigpIHtcbiAgZnVuY3Rpb24gQXV0b1Njcm9sbCgpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgc2Nyb2xsOiB0cnVlLFxuICAgICAgZm9yY2VBdXRvU2Nyb2xsRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgc2Nyb2xsU2Vuc2l0aXZpdHk6IDMwLFxuICAgICAgc2Nyb2xsU3BlZWQ6IDEwLFxuICAgICAgYnViYmxlU2Nyb2xsOiB0cnVlXG4gICAgfTsgLy8gQmluZCBhbGwgcHJpdmF0ZSBtZXRob2RzXG5cbiAgICBmb3IgKHZhciBmbiBpbiB0aGlzKSB7XG4gICAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBBdXRvU2Nyb2xsLnByb3RvdHlwZSA9IHtcbiAgICBkcmFnU3RhcnRlZDogZnVuY3Rpb24gZHJhZ1N0YXJ0ZWQoX3JlZikge1xuICAgICAgdmFyIG9yaWdpbmFsRXZlbnQgPSBfcmVmLm9yaWdpbmFsRXZlbnQ7XG5cbiAgICAgIGlmICh0aGlzLnNvcnRhYmxlLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICBvbihkb2N1bWVudCwgJ2RyYWdvdmVyJywgdGhpcy5faGFuZGxlQXV0b1Njcm9sbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN1cHBvcnRQb2ludGVyKSB7XG4gICAgICAgICAgb24oZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3JpZ2luYWxFdmVudC50b3VjaGVzKSB7XG4gICAgICAgICAgb24oZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ092ZXJDb21wbGV0ZWQ6IGZ1bmN0aW9uIGRyYWdPdmVyQ29tcGxldGVkKF9yZWYyKSB7XG4gICAgICB2YXIgb3JpZ2luYWxFdmVudCA9IF9yZWYyLm9yaWdpbmFsRXZlbnQ7XG5cbiAgICAgIC8vIEZvciB3aGVuIGJ1YmJsaW5nIGlzIGNhbmNlbGVkIGFuZCB1c2luZyBmYWxsYmFjayAoZmFsbGJhY2sgJ3RvdWNobW92ZScgYWx3YXlzIHJlYWNoZWQpXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5kcmFnT3ZlckJ1YmJsZSAmJiAhb3JpZ2luYWxFdmVudC5yb290RWwpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlQXV0b1Njcm9sbChvcmlnaW5hbEV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyb3A6IGZ1bmN0aW9uIGRyb3AoKSB7XG4gICAgICBpZiAodGhpcy5zb3J0YWJsZS5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAnZHJhZ292ZXInLCB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgIH1cblxuICAgICAgY2xlYXJQb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCgpO1xuICAgICAgY2xlYXJBdXRvU2Nyb2xscygpO1xuICAgICAgY2FuY2VsVGhyb3R0bGUoKTtcbiAgICB9LFxuICAgIG51bGxpbmc6IGZ1bmN0aW9uIG51bGxpbmcoKSB7XG4gICAgICB0b3VjaEV2dCQxID0gc2Nyb2xsUm9vdEVsID0gc2Nyb2xsRWwgPSBzY3JvbGxpbmcgPSBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCA9IGxhc3RBdXRvU2Nyb2xsWCA9IGxhc3RBdXRvU2Nyb2xsWSA9IG51bGw7XG4gICAgICBhdXRvU2Nyb2xscy5sZW5ndGggPSAwO1xuICAgIH0sXG4gICAgX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbDogZnVuY3Rpb24gX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbChldnQpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwoZXZ0LCB0cnVlKTtcbiAgICB9LFxuICAgIF9oYW5kbGVBdXRvU2Nyb2xsOiBmdW5jdGlvbiBfaGFuZGxlQXV0b1Njcm9sbChldnQsIGZhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgeCA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRYLFxuICAgICAgICAgIHkgPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WSxcbiAgICAgICAgICBlbGVtID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcbiAgICAgIHRvdWNoRXZ0JDEgPSBldnQ7IC8vIElFIGRvZXMgbm90IHNlZW0gdG8gaGF2ZSBuYXRpdmUgYXV0b3Njcm9sbCxcbiAgICAgIC8vIEVkZ2UncyBhdXRvc2Nyb2xsIHNlZW1zIHRvbyBjb25kaXRpb25hbCxcbiAgICAgIC8vIE1BQ09TIFNhZmFyaSBkb2VzIG5vdCBoYXZlIGF1dG9zY3JvbGwsXG4gICAgICAvLyBGaXJlZm94IGFuZCBDaHJvbWUgYXJlIGdvb2RcblxuICAgICAgaWYgKGZhbGxiYWNrIHx8IHRoaXMub3B0aW9ucy5mb3JjZUF1dG9TY3JvbGxGYWxsYmFjayB8fCBFZGdlIHx8IElFMTFPckxlc3MgfHwgU2FmYXJpKSB7XG4gICAgICAgIGF1dG9TY3JvbGwoZXZ0LCB0aGlzLm9wdGlvbnMsIGVsZW0sIGZhbGxiYWNrKTsgLy8gTGlzdGVuZXIgZm9yIHBvaW50ZXIgZWxlbWVudCBjaGFuZ2VcblxuICAgICAgICB2YXIgb2dFbGVtU2Nyb2xsZXIgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbGVtLCB0cnVlKTtcblxuICAgICAgICBpZiAoc2Nyb2xsaW5nICYmICghcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgfHwgeCAhPT0gbGFzdEF1dG9TY3JvbGxYIHx8IHkgIT09IGxhc3RBdXRvU2Nyb2xsWSkpIHtcbiAgICAgICAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCAmJiBjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKCk7IC8vIERldGVjdCBmb3IgcG9pbnRlciBlbGVtIGNoYW5nZSwgZW11bGF0aW5nIG5hdGl2ZSBEbkQgYmVoYXZpb3VyXG5cbiAgICAgICAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuZXdFbGVtID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmIChuZXdFbGVtICE9PSBvZ0VsZW1TY3JvbGxlcikge1xuICAgICAgICAgICAgICBvZ0VsZW1TY3JvbGxlciA9IG5ld0VsZW07XG4gICAgICAgICAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXV0b1Njcm9sbChldnQsIF90aGlzLm9wdGlvbnMsIG5ld0VsZW0sIGZhbGxiYWNrKTtcbiAgICAgICAgICB9LCAxMCk7XG4gICAgICAgICAgbGFzdEF1dG9TY3JvbGxYID0geDtcbiAgICAgICAgICBsYXN0QXV0b1Njcm9sbFkgPSB5O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBEbkQgaXMgZW5hYmxlZCAoYW5kIGJyb3dzZXIgaGFzIGdvb2QgYXV0b3Njcm9sbGluZyksIGZpcnN0IGF1dG9zY3JvbGwgd2lsbCBhbHJlYWR5IHNjcm9sbCwgc28gZ2V0IHBhcmVudCBhdXRvc2Nyb2xsIG9mIGZpcnN0IGF1dG9zY3JvbGxcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnViYmxlU2Nyb2xsIHx8IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsZW0sIHRydWUpID09PSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCkpIHtcbiAgICAgICAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0b1Njcm9sbChldnQsIHRoaXMub3B0aW9ucywgZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgZmFsc2UpLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gX2V4dGVuZHMoQXV0b1Njcm9sbCwge1xuICAgIHBsdWdpbk5hbWU6ICdzY3JvbGwnLFxuICAgIGluaXRpYWxpemVCeURlZmF1bHQ6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyQXV0b1Njcm9sbHMoKSB7XG4gIGF1dG9TY3JvbGxzLmZvckVhY2goZnVuY3Rpb24gKGF1dG9TY3JvbGwpIHtcbiAgICBjbGVhckludGVydmFsKGF1dG9TY3JvbGwucGlkKTtcbiAgfSk7XG4gIGF1dG9TY3JvbGxzID0gW107XG59XG5cbmZ1bmN0aW9uIGNsZWFyUG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwoKSB7XG4gIGNsZWFySW50ZXJ2YWwocG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwpO1xufVxuXG52YXIgYXV0b1Njcm9sbCA9IHRocm90dGxlKGZ1bmN0aW9uIChldnQsIG9wdGlvbnMsIHJvb3RFbCwgaXNGYWxsYmFjaykge1xuICAvLyBCdWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTUyMVxuICBpZiAoIW9wdGlvbnMuc2Nyb2xsKSByZXR1cm47XG4gIHZhciB4ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFgsXG4gICAgICB5ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFksXG4gICAgICBzZW5zID0gb3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eSxcbiAgICAgIHNwZWVkID0gb3B0aW9ucy5zY3JvbGxTcGVlZCxcbiAgICAgIHdpblNjcm9sbGVyID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICB2YXIgc2Nyb2xsVGhpc0luc3RhbmNlID0gZmFsc2UsXG4gICAgICBzY3JvbGxDdXN0b21GbjsgLy8gTmV3IHNjcm9sbCByb290LCBzZXQgc2Nyb2xsRWxcblxuICBpZiAoc2Nyb2xsUm9vdEVsICE9PSByb290RWwpIHtcbiAgICBzY3JvbGxSb290RWwgPSByb290RWw7XG4gICAgY2xlYXJBdXRvU2Nyb2xscygpO1xuICAgIHNjcm9sbEVsID0gb3B0aW9ucy5zY3JvbGw7XG4gICAgc2Nyb2xsQ3VzdG9tRm4gPSBvcHRpb25zLnNjcm9sbEZuO1xuXG4gICAgaWYgKHNjcm9sbEVsID09PSB0cnVlKSB7XG4gICAgICBzY3JvbGxFbCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KHJvb3RFbCwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxheWVyc091dCA9IDA7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gc2Nyb2xsRWw7XG5cbiAgZG8ge1xuICAgIHZhciBlbCA9IGN1cnJlbnRQYXJlbnQsXG4gICAgICAgIHJlY3QgPSBnZXRSZWN0KGVsKSxcbiAgICAgICAgdG9wID0gcmVjdC50b3AsXG4gICAgICAgIGJvdHRvbSA9IHJlY3QuYm90dG9tLFxuICAgICAgICBsZWZ0ID0gcmVjdC5sZWZ0LFxuICAgICAgICByaWdodCA9IHJlY3QucmlnaHQsXG4gICAgICAgIHdpZHRoID0gcmVjdC53aWR0aCxcbiAgICAgICAgaGVpZ2h0ID0gcmVjdC5oZWlnaHQsXG4gICAgICAgIGNhblNjcm9sbFggPSB2b2lkIDAsXG4gICAgICAgIGNhblNjcm9sbFkgPSB2b2lkIDAsXG4gICAgICAgIHNjcm9sbFdpZHRoID0gZWwuc2Nyb2xsV2lkdGgsXG4gICAgICAgIHNjcm9sbEhlaWdodCA9IGVsLnNjcm9sbEhlaWdodCxcbiAgICAgICAgZWxDU1MgPSBjc3MoZWwpLFxuICAgICAgICBzY3JvbGxQb3NYID0gZWwuc2Nyb2xsTGVmdCxcbiAgICAgICAgc2Nyb2xsUG9zWSA9IGVsLnNjcm9sbFRvcDtcblxuICAgIGlmIChlbCA9PT0gd2luU2Nyb2xsZXIpIHtcbiAgICAgIGNhblNjcm9sbFggPSB3aWR0aCA8IHNjcm9sbFdpZHRoICYmIChlbENTUy5vdmVyZmxvd1ggPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1ggPT09ICdzY3JvbGwnIHx8IGVsQ1NTLm92ZXJmbG93WCA9PT0gJ3Zpc2libGUnKTtcbiAgICAgIGNhblNjcm9sbFkgPSBoZWlnaHQgPCBzY3JvbGxIZWlnaHQgJiYgKGVsQ1NTLm92ZXJmbG93WSA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WSA9PT0gJ3Njcm9sbCcgfHwgZWxDU1Mub3ZlcmZsb3dZID09PSAndmlzaWJsZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW5TY3JvbGxYID0gd2lkdGggPCBzY3JvbGxXaWR0aCAmJiAoZWxDU1Mub3ZlcmZsb3dYID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dYID09PSAnc2Nyb2xsJyk7XG4gICAgICBjYW5TY3JvbGxZID0gaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0ICYmIChlbENTUy5vdmVyZmxvd1kgPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1kgPT09ICdzY3JvbGwnKTtcbiAgICB9XG5cbiAgICB2YXIgdnggPSBjYW5TY3JvbGxYICYmIChNYXRoLmFicyhyaWdodCAtIHgpIDw9IHNlbnMgJiYgc2Nyb2xsUG9zWCArIHdpZHRoIDwgc2Nyb2xsV2lkdGgpIC0gKE1hdGguYWJzKGxlZnQgLSB4KSA8PSBzZW5zICYmICEhc2Nyb2xsUG9zWCk7XG4gICAgdmFyIHZ5ID0gY2FuU2Nyb2xsWSAmJiAoTWF0aC5hYnMoYm90dG9tIC0geSkgPD0gc2VucyAmJiBzY3JvbGxQb3NZICsgaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0KSAtIChNYXRoLmFicyh0b3AgLSB5KSA8PSBzZW5zICYmICEhc2Nyb2xsUG9zWSk7XG5cbiAgICBpZiAoIWF1dG9TY3JvbGxzW2xheWVyc091dF0pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGxheWVyc091dDsgaSsrKSB7XG4gICAgICAgIGlmICghYXV0b1Njcm9sbHNbaV0pIHtcbiAgICAgICAgICBhdXRvU2Nyb2xsc1tpXSA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF1dG9TY3JvbGxzW2xheWVyc091dF0udnggIT0gdnggfHwgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eSAhPSB2eSB8fCBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLmVsICE9PSBlbCkge1xuICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5lbCA9IGVsO1xuICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eCA9IHZ4O1xuICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eSA9IHZ5O1xuICAgICAgY2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnBpZCk7XG5cbiAgICAgIGlmICh2eCAhPSAwIHx8IHZ5ICE9IDApIHtcbiAgICAgICAgc2Nyb2xsVGhpc0luc3RhbmNlID0gdHJ1ZTtcbiAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOnRydWUgKi9cblxuICAgICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnBpZCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBlbXVsYXRlIGRyYWcgb3ZlciBkdXJpbmcgYXV0b3Njcm9sbCAoZmFsbGJhY2spLCBlbXVsYXRpbmcgbmF0aXZlIERuRCBiZWhhdmlvdXJcbiAgICAgICAgICBpZiAoaXNGYWxsYmFjayAmJiB0aGlzLmxheWVyID09PSAwKSB7XG4gICAgICAgICAgICBTb3J0YWJsZS5hY3RpdmUuX29uVG91Y2hNb3ZlKHRvdWNoRXZ0JDEpOyAvLyBUbyBtb3ZlIGdob3N0IGlmIGl0IGlzIHBvc2l0aW9uZWQgYWJzb2x1dGVseVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHNjcm9sbE9mZnNldFkgPSBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eSA/IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ5ICogc3BlZWQgOiAwO1xuICAgICAgICAgIHZhciBzY3JvbGxPZmZzZXRYID0gYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0udnggPyBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eCAqIHNwZWVkIDogMDtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygc2Nyb2xsQ3VzdG9tRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmIChzY3JvbGxDdXN0b21Gbi5jYWxsKFNvcnRhYmxlLmRyYWdnZWQucGFyZW50Tm9kZVtleHBhbmRvXSwgc2Nyb2xsT2Zmc2V0WCwgc2Nyb2xsT2Zmc2V0WSwgZXZ0LCB0b3VjaEV2dCQxLCBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS5lbCkgIT09ICdjb250aW51ZScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjcm9sbEJ5KGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLmVsLCBzY3JvbGxPZmZzZXRYLCBzY3JvbGxPZmZzZXRZKTtcbiAgICAgICAgfS5iaW5kKHtcbiAgICAgICAgICBsYXllcjogbGF5ZXJzT3V0XG4gICAgICAgIH0pLCAyNCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGF5ZXJzT3V0Kys7XG4gIH0gd2hpbGUgKG9wdGlvbnMuYnViYmxlU2Nyb2xsICYmIGN1cnJlbnRQYXJlbnQgIT09IHdpblNjcm9sbGVyICYmIChjdXJyZW50UGFyZW50ID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoY3VycmVudFBhcmVudCwgZmFsc2UpKSk7XG5cbiAgc2Nyb2xsaW5nID0gc2Nyb2xsVGhpc0luc3RhbmNlOyAvLyBpbiBjYXNlIGFub3RoZXIgZnVuY3Rpb24gY2F0Y2hlcyBzY3JvbGxpbmcgYXMgZmFsc2UgaW4gYmV0d2VlbiB3aGVuIGl0IGlzIG5vdFxufSwgMzApO1xuXG52YXIgZHJvcCA9IGZ1bmN0aW9uIGRyb3AoX3JlZikge1xuICB2YXIgb3JpZ2luYWxFdmVudCA9IF9yZWYub3JpZ2luYWxFdmVudCxcbiAgICAgIHB1dFNvcnRhYmxlID0gX3JlZi5wdXRTb3J0YWJsZSxcbiAgICAgIGRyYWdFbCA9IF9yZWYuZHJhZ0VsLFxuICAgICAgYWN0aXZlU29ydGFibGUgPSBfcmVmLmFjdGl2ZVNvcnRhYmxlLFxuICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50ID0gX3JlZi5kaXNwYXRjaFNvcnRhYmxlRXZlbnQsXG4gICAgICBoaWRlR2hvc3RGb3JUYXJnZXQgPSBfcmVmLmhpZGVHaG9zdEZvclRhcmdldCxcbiAgICAgIHVuaGlkZUdob3N0Rm9yVGFyZ2V0ID0gX3JlZi51bmhpZGVHaG9zdEZvclRhcmdldDtcbiAgaWYgKCFvcmlnaW5hbEV2ZW50KSByZXR1cm47XG4gIHZhciB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgYWN0aXZlU29ydGFibGU7XG4gIGhpZGVHaG9zdEZvclRhcmdldCgpO1xuICB2YXIgdG91Y2ggPSBvcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID8gb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXSA6IG9yaWdpbmFsRXZlbnQ7XG4gIHZhciB0YXJnZXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpO1xuICB1bmhpZGVHaG9zdEZvclRhcmdldCgpO1xuXG4gIGlmICh0b1NvcnRhYmxlICYmICF0b1NvcnRhYmxlLmVsLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoJ3NwaWxsJyk7XG4gICAgdGhpcy5vblNwaWxsKHtcbiAgICAgIGRyYWdFbDogZHJhZ0VsLFxuICAgICAgcHV0U29ydGFibGU6IHB1dFNvcnRhYmxlXG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFJldmVydCgpIHt9XG5cblJldmVydC5wcm90b3R5cGUgPSB7XG4gIHN0YXJ0SW5kZXg6IG51bGwsXG4gIGRyYWdTdGFydDogZnVuY3Rpb24gZHJhZ1N0YXJ0KF9yZWYyKSB7XG4gICAgdmFyIG9sZERyYWdnYWJsZUluZGV4ID0gX3JlZjIub2xkRHJhZ2dhYmxlSW5kZXg7XG4gICAgdGhpcy5zdGFydEluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXg7XG4gIH0sXG4gIG9uU3BpbGw6IGZ1bmN0aW9uIG9uU3BpbGwoX3JlZjMpIHtcbiAgICB2YXIgZHJhZ0VsID0gX3JlZjMuZHJhZ0VsLFxuICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYzLnB1dFNvcnRhYmxlO1xuICAgIHRoaXMuc29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG5cbiAgICBpZiAocHV0U29ydGFibGUpIHtcbiAgICAgIHB1dFNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIH1cblxuICAgIHZhciBuZXh0U2libGluZyA9IGdldENoaWxkKHRoaXMuc29ydGFibGUuZWwsIHRoaXMuc3RhcnRJbmRleCwgdGhpcy5vcHRpb25zKTtcblxuICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgdGhpcy5zb3J0YWJsZS5lbC5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBuZXh0U2libGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydGFibGUuZWwuYXBwZW5kQ2hpbGQoZHJhZ0VsKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcblxuICAgIGlmIChwdXRTb3J0YWJsZSkge1xuICAgICAgcHV0U29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgIH1cbiAgfSxcbiAgZHJvcDogZHJvcFxufTtcblxuX2V4dGVuZHMoUmV2ZXJ0LCB7XG4gIHBsdWdpbk5hbWU6ICdyZXZlcnRPblNwaWxsJ1xufSk7XG5cbmZ1bmN0aW9uIFJlbW92ZSgpIHt9XG5cblJlbW92ZS5wcm90b3R5cGUgPSB7XG4gIG9uU3BpbGw6IGZ1bmN0aW9uIG9uU3BpbGwoX3JlZjQpIHtcbiAgICB2YXIgZHJhZ0VsID0gX3JlZjQuZHJhZ0VsLFxuICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWY0LnB1dFNvcnRhYmxlO1xuICAgIHZhciBwYXJlbnRTb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IHRoaXMuc29ydGFibGU7XG4gICAgcGFyZW50U29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgZHJhZ0VsLnBhcmVudE5vZGUgJiYgZHJhZ0VsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZHJhZ0VsKTtcbiAgICBwYXJlbnRTb3J0YWJsZS5hbmltYXRlQWxsKCk7XG4gIH0sXG4gIGRyb3A6IGRyb3Bcbn07XG5cbl9leHRlbmRzKFJlbW92ZSwge1xuICBwbHVnaW5OYW1lOiAncmVtb3ZlT25TcGlsbCdcbn0pO1xuXG52YXIgbGFzdFN3YXBFbDtcblxuZnVuY3Rpb24gU3dhcFBsdWdpbigpIHtcbiAgZnVuY3Rpb24gU3dhcCgpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgc3dhcENsYXNzOiAnc29ydGFibGUtc3dhcC1oaWdobGlnaHQnXG4gICAgfTtcbiAgfVxuXG4gIFN3YXAucHJvdG90eXBlID0ge1xuICAgIGRyYWdTdGFydDogZnVuY3Rpb24gZHJhZ1N0YXJ0KF9yZWYpIHtcbiAgICAgIHZhciBkcmFnRWwgPSBfcmVmLmRyYWdFbDtcbiAgICAgIGxhc3RTd2FwRWwgPSBkcmFnRWw7XG4gICAgfSxcbiAgICBkcmFnT3ZlclZhbGlkOiBmdW5jdGlvbiBkcmFnT3ZlclZhbGlkKF9yZWYyKSB7XG4gICAgICB2YXIgY29tcGxldGVkID0gX3JlZjIuY29tcGxldGVkLFxuICAgICAgICAgIHRhcmdldCA9IF9yZWYyLnRhcmdldCxcbiAgICAgICAgICBvbk1vdmUgPSBfcmVmMi5vbk1vdmUsXG4gICAgICAgICAgYWN0aXZlU29ydGFibGUgPSBfcmVmMi5hY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgICBjaGFuZ2VkID0gX3JlZjIuY2hhbmdlZCxcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmMi5jYW5jZWw7XG4gICAgICBpZiAoIWFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuc3dhcCkgcmV0dXJuO1xuICAgICAgdmFyIGVsID0gdGhpcy5zb3J0YWJsZS5lbCxcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gZWwpIHtcbiAgICAgICAgdmFyIHByZXZTd2FwRWwgPSBsYXN0U3dhcEVsO1xuXG4gICAgICAgIGlmIChvbk1vdmUodGFyZ2V0KSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICB0b2dnbGVDbGFzcyh0YXJnZXQsIG9wdGlvbnMuc3dhcENsYXNzLCB0cnVlKTtcbiAgICAgICAgICBsYXN0U3dhcEVsID0gdGFyZ2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3RTd2FwRWwgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZTd2FwRWwgJiYgcHJldlN3YXBFbCAhPT0gbGFzdFN3YXBFbCkge1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKHByZXZTd2FwRWwsIG9wdGlvbnMuc3dhcENsYXNzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2hhbmdlZCgpO1xuICAgICAgY29tcGxldGVkKHRydWUpO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKF9yZWYzKSB7XG4gICAgICB2YXIgYWN0aXZlU29ydGFibGUgPSBfcmVmMy5hY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYzLnB1dFNvcnRhYmxlLFxuICAgICAgICAgIGRyYWdFbCA9IF9yZWYzLmRyYWdFbDtcbiAgICAgIHZhciB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgdGhpcy5zb3J0YWJsZTtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgbGFzdFN3YXBFbCAmJiB0b2dnbGVDbGFzcyhsYXN0U3dhcEVsLCBvcHRpb25zLnN3YXBDbGFzcywgZmFsc2UpO1xuXG4gICAgICBpZiAobGFzdFN3YXBFbCAmJiAob3B0aW9ucy5zd2FwIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLm9wdGlvbnMuc3dhcCkpIHtcbiAgICAgICAgaWYgKGRyYWdFbCAhPT0gbGFzdFN3YXBFbCkge1xuICAgICAgICAgIHRvU29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgICAgICAgaWYgKHRvU29ydGFibGUgIT09IGFjdGl2ZVNvcnRhYmxlKSBhY3RpdmVTb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgICBzd2FwTm9kZXMoZHJhZ0VsLCBsYXN0U3dhcEVsKTtcbiAgICAgICAgICB0b1NvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgICBpZiAodG9Tb3J0YWJsZSAhPT0gYWN0aXZlU29ydGFibGUpIGFjdGl2ZVNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbnVsbGluZzogZnVuY3Rpb24gbnVsbGluZygpIHtcbiAgICAgIGxhc3RTd2FwRWwgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzKFN3YXAsIHtcbiAgICBwbHVnaW5OYW1lOiAnc3dhcCcsXG4gICAgZXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBldmVudFByb3BlcnRpZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzd2FwSXRlbTogbGFzdFN3YXBFbFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzd2FwTm9kZXMobjEsIG4yKSB7XG4gIHZhciBwMSA9IG4xLnBhcmVudE5vZGUsXG4gICAgICBwMiA9IG4yLnBhcmVudE5vZGUsXG4gICAgICBpMSxcbiAgICAgIGkyO1xuICBpZiAoIXAxIHx8ICFwMiB8fCBwMS5pc0VxdWFsTm9kZShuMikgfHwgcDIuaXNFcXVhbE5vZGUobjEpKSByZXR1cm47XG4gIGkxID0gaW5kZXgobjEpO1xuICBpMiA9IGluZGV4KG4yKTtcblxuICBpZiAocDEuaXNFcXVhbE5vZGUocDIpICYmIGkxIDwgaTIpIHtcbiAgICBpMisrO1xuICB9XG5cbiAgcDEuaW5zZXJ0QmVmb3JlKG4yLCBwMS5jaGlsZHJlbltpMV0pO1xuICBwMi5pbnNlcnRCZWZvcmUobjEsIHAyLmNoaWxkcmVuW2kyXSk7XG59XG5cbnZhciBtdWx0aURyYWdFbGVtZW50cyA9IFtdLFxuICAgIG11bHRpRHJhZ0Nsb25lcyA9IFtdLFxuICAgIGxhc3RNdWx0aURyYWdTZWxlY3QsXG4gICAgLy8gZm9yIHNlbGVjdGlvbiB3aXRoIG1vZGlmaWVyIGtleSBkb3duIChTSElGVClcbm11bHRpRHJhZ1NvcnRhYmxlLFxuICAgIGluaXRpYWxGb2xkaW5nID0gZmFsc2UsXG4gICAgLy8gSW5pdGlhbCBtdWx0aS1kcmFnIGZvbGQgd2hlbiBkcmFnIHN0YXJ0ZWRcbmZvbGRpbmcgPSBmYWxzZSxcbiAgICAvLyBGb2xkaW5nIGFueSBvdGhlciB0aW1lXG5kcmFnU3RhcnRlZCA9IGZhbHNlLFxuICAgIGRyYWdFbCQxLFxuICAgIGNsb25lc0Zyb21SZWN0LFxuICAgIGNsb25lc0hpZGRlbjtcblxuZnVuY3Rpb24gTXVsdGlEcmFnUGx1Z2luKCkge1xuICBmdW5jdGlvbiBNdWx0aURyYWcoc29ydGFibGUpIHtcbiAgICAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcbiAgICBmb3IgKHZhciBmbiBpbiB0aGlzKSB7XG4gICAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc29ydGFibGUub3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgICAgb24oZG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uKGRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9uKGRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgfVxuXG4gICAgb24oZG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5fY2hlY2tLZXlEb3duKTtcbiAgICBvbihkb2N1bWVudCwgJ2tleXVwJywgdGhpcy5fY2hlY2tLZXlVcCk7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIHNlbGVjdGVkQ2xhc3M6ICdzb3J0YWJsZS1zZWxlY3RlZCcsXG4gICAgICBtdWx0aURyYWdLZXk6IG51bGwsXG4gICAgICBzZXREYXRhOiBmdW5jdGlvbiBzZXREYXRhKGRhdGFUcmFuc2ZlciwgZHJhZ0VsKSB7XG4gICAgICAgIHZhciBkYXRhID0gJyc7XG5cbiAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCAmJiBtdWx0aURyYWdTb3J0YWJsZSA9PT0gc29ydGFibGUpIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50LCBpKSB7XG4gICAgICAgICAgICBkYXRhICs9ICghaSA/ICcnIDogJywgJykgKyBtdWx0aURyYWdFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGEgPSBkcmFnRWwudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhVHJhbnNmZXIuc2V0RGF0YSgnVGV4dCcsIGRhdGEpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBNdWx0aURyYWcucHJvdG90eXBlID0ge1xuICAgIG11bHRpRHJhZ0tleURvd246IGZhbHNlLFxuICAgIGlzTXVsdGlEcmFnOiBmYWxzZSxcbiAgICBkZWxheVN0YXJ0R2xvYmFsOiBmdW5jdGlvbiBkZWxheVN0YXJ0R2xvYmFsKF9yZWYpIHtcbiAgICAgIHZhciBkcmFnZ2VkID0gX3JlZi5kcmFnRWw7XG4gICAgICBkcmFnRWwkMSA9IGRyYWdnZWQ7XG4gICAgfSxcbiAgICBkZWxheUVuZGVkOiBmdW5jdGlvbiBkZWxheUVuZGVkKCkge1xuICAgICAgdGhpcy5pc011bHRpRHJhZyA9IH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKTtcbiAgICB9LFxuICAgIHNldHVwQ2xvbmU6IGZ1bmN0aW9uIHNldHVwQ2xvbmUoX3JlZjIpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYyLnNvcnRhYmxlLFxuICAgICAgICAgIGNhbmNlbCA9IF9yZWYyLmNhbmNlbDtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lcy5wdXNoKGNsb25lKG11bHRpRHJhZ0VsZW1lbnRzW2ldKSk7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lc1tpXS5zb3J0YWJsZUluZGV4ID0gbXVsdGlEcmFnRWxlbWVudHNbaV0uc29ydGFibGVJbmRleDtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzW2ldLmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgICBtdWx0aURyYWdDbG9uZXNbaV0uc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnJztcbiAgICAgICAgdG9nZ2xlQ2xhc3MobXVsdGlEcmFnQ2xvbmVzW2ldLCB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50c1tpXSA9PT0gZHJhZ0VsJDEgJiYgdG9nZ2xlQ2xhc3MobXVsdGlEcmFnQ2xvbmVzW2ldLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgc29ydGFibGUuX2hpZGVDbG9uZSgpO1xuXG4gICAgICBjYW5jZWwoKTtcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZShfcmVmMykge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjMuc29ydGFibGUsXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjMucm9vdEVsLFxuICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCA9IF9yZWYzLmRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmMy5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUpIHtcbiAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCAmJiBtdWx0aURyYWdTb3J0YWJsZSA9PT0gc29ydGFibGUpIHtcbiAgICAgICAgICBpbnNlcnRNdWx0aURyYWdDbG9uZXModHJ1ZSwgcm9vdEVsKTtcbiAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoJ2Nsb25lJyk7XG4gICAgICAgICAgY2FuY2VsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHNob3dDbG9uZTogZnVuY3Rpb24gc2hvd0Nsb25lKF9yZWY0KSB7XG4gICAgICB2YXIgY2xvbmVOb3dTaG93biA9IF9yZWY0LmNsb25lTm93U2hvd24sXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjQucm9vdEVsLFxuICAgICAgICAgIGNhbmNlbCA9IF9yZWY0LmNhbmNlbDtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuICAgICAgaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKGZhbHNlLCByb290RWwpO1xuICAgICAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgIGNzcyhjbG9uZSwgJ2Rpc3BsYXknLCAnJyk7XG4gICAgICB9KTtcbiAgICAgIGNsb25lTm93U2hvd24oKTtcbiAgICAgIGNsb25lc0hpZGRlbiA9IGZhbHNlO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBoaWRlQ2xvbmU6IGZ1bmN0aW9uIGhpZGVDbG9uZShfcmVmNSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjUuc29ydGFibGUsXG4gICAgICAgICAgY2xvbmVOb3dIaWRkZW4gPSBfcmVmNS5jbG9uZU5vd0hpZGRlbixcbiAgICAgICAgICBjYW5jZWwgPSBfcmVmNS5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICBjc3MoY2xvbmUsICdkaXNwbGF5JywgJ25vbmUnKTtcblxuICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSAmJiBjbG9uZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgY2xvbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2xvbmVOb3dIaWRkZW4oKTtcbiAgICAgIGNsb25lc0hpZGRlbiA9IHRydWU7XG4gICAgICBjYW5jZWwoKTtcbiAgICB9LFxuICAgIGRyYWdTdGFydEdsb2JhbDogZnVuY3Rpb24gZHJhZ1N0YXJ0R2xvYmFsKF9yZWY2KSB7XG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmNi5zb3J0YWJsZTtcblxuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnICYmIG11bHRpRHJhZ1NvcnRhYmxlKSB7XG4gICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlLm11bHRpRHJhZy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcbiAgICAgIH1cblxuICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgIH0pOyAvLyBTb3J0IG11bHRpLWRyYWcgZWxlbWVudHNcblxuICAgICAgbXVsdGlEcmFnRWxlbWVudHMgPSBtdWx0aURyYWdFbGVtZW50cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnNvcnRhYmxlSW5kZXggLSBiLnNvcnRhYmxlSW5kZXg7XG4gICAgICB9KTtcbiAgICAgIGRyYWdTdGFydGVkID0gdHJ1ZTtcbiAgICB9LFxuICAgIGRyYWdTdGFydGVkOiBmdW5jdGlvbiBkcmFnU3RhcnRlZChfcmVmNykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWY3LnNvcnRhYmxlO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc29ydCkge1xuICAgICAgICAvLyBDYXB0dXJlIHJlY3RzLFxuICAgICAgICAvLyBoaWRlIG11bHRpIGRyYWcgZWxlbWVudHMgKGJ5IHBvc2l0aW9uaW5nIHRoZW0gYWJzb2x1dGUpLFxuICAgICAgICAvLyBzZXQgbXVsdGkgZHJhZyBlbGVtZW50cyByZWN0cyB0byBkcmFnUmVjdCxcbiAgICAgICAgLy8gc2hvdyBtdWx0aSBkcmFnIGVsZW1lbnRzLFxuICAgICAgICAvLyBhbmltYXRlIHRvIHJlY3RzLFxuICAgICAgICAvLyB1bnNldCByZWN0cyAmIHJlbW92ZSBmcm9tIERPTVxuICAgICAgICBzb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgICAgICAgICAgY3NzKG11bHRpRHJhZ0VsZW1lbnQsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBkcmFnUmVjdCA9IGdldFJlY3QoZHJhZ0VsJDEsIGZhbHNlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICAgICAgICAgIHNldFJlY3QobXVsdGlEcmFnRWxlbWVudCwgZHJhZ1JlY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvbGRpbmcgPSB0cnVlO1xuICAgICAgICAgIGluaXRpYWxGb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzb3J0YWJsZS5hbmltYXRlQWxsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9sZGluZyA9IGZhbHNlO1xuICAgICAgICBpbml0aWFsRm9sZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gLy8gUmVtb3ZlIGFsbCBhdXhpbGlhcnkgbXVsdGlkcmFnIGl0ZW1zIGZyb20gZWwsIGlmIHNvcnRpbmcgZW5hYmxlZFxuXG5cbiAgICAgICAgaWYgKF90aGlzMi5vcHRpb25zLnNvcnQpIHtcbiAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGRyYWdPdmVyOiBmdW5jdGlvbiBkcmFnT3ZlcihfcmVmOCkge1xuICAgICAgdmFyIHRhcmdldCA9IF9yZWY4LnRhcmdldCxcbiAgICAgICAgICBjb21wbGV0ZWQgPSBfcmVmOC5jb21wbGV0ZWQsXG4gICAgICAgICAgY2FuY2VsID0gX3JlZjguY2FuY2VsO1xuXG4gICAgICBpZiAoZm9sZGluZyAmJiB+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZih0YXJnZXQpKSB7XG4gICAgICAgIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIGNhbmNlbCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmV2ZXJ0OiBmdW5jdGlvbiByZXZlcnQoX3JlZjkpIHtcbiAgICAgIHZhciBmcm9tU29ydGFibGUgPSBfcmVmOS5mcm9tU29ydGFibGUsXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjkucm9vdEVsLFxuICAgICAgICAgIHNvcnRhYmxlID0gX3JlZjkuc29ydGFibGUsXG4gICAgICAgICAgZHJhZ1JlY3QgPSBfcmVmOS5kcmFnUmVjdDtcblxuICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gU2V0dXAgdW5mb2xkIGFuaW1hdGlvblxuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgc29ydGFibGUuYWRkQW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgdGFyZ2V0OiBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgICAgcmVjdDogZm9sZGluZyA/IGdldFJlY3QobXVsdGlEcmFnRWxlbWVudCkgOiBkcmFnUmVjdFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHVuc2V0UmVjdChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LmZyb21SZWN0ID0gZHJhZ1JlY3Q7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLnJlbW92ZUFuaW1hdGlvblN0YXRlKG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgZm9sZGluZyA9IGZhbHNlO1xuICAgICAgICBpbnNlcnRNdWx0aURyYWdFbGVtZW50cyghdGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlLCByb290RWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ092ZXJDb21wbGV0ZWQ6IGZ1bmN0aW9uIGRyYWdPdmVyQ29tcGxldGVkKF9yZWYxMCkge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjEwLnNvcnRhYmxlLFxuICAgICAgICAgIGlzT3duZXIgPSBfcmVmMTAuaXNPd25lcixcbiAgICAgICAgICBpbnNlcnRpb24gPSBfcmVmMTAuaW5zZXJ0aW9uLFxuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZjEwLmFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICAgIHBhcmVudEVsID0gX3JlZjEwLnBhcmVudEVsLFxuICAgICAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjEwLnB1dFNvcnRhYmxlO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIGlmIChpbnNlcnRpb24pIHtcbiAgICAgICAgLy8gQ2xvbmVzIG11c3QgYmUgaGlkZGVuIGJlZm9yZSBmb2xkaW5nIGFuaW1hdGlvbiB0byBjYXB0dXJlIGRyYWdSZWN0QWJzb2x1dGUgcHJvcGVybHlcbiAgICAgICAgaWYgKGlzT3duZXIpIHtcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5faGlkZUNsb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbml0aWFsRm9sZGluZyA9IGZhbHNlOyAvLyBJZiBsZWF2aW5nIHNvcnQ6ZmFsc2Ugcm9vdCwgb3IgYWxyZWFkeSBmb2xkaW5nIC0gRm9sZCB0byBuZXcgbG9jYXRpb25cblxuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24gJiYgbXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSAmJiAoZm9sZGluZyB8fCAhaXNPd25lciAmJiAhYWN0aXZlU29ydGFibGUub3B0aW9ucy5zb3J0ICYmICFwdXRTb3J0YWJsZSkpIHtcbiAgICAgICAgICAvLyBGb2xkOiBTZXQgYWxsIG11bHRpIGRyYWcgZWxlbWVudHMncyByZWN0cyB0byBkcmFnRWwncyByZWN0IHdoZW4gbXVsdGktZHJhZyBlbGVtZW50cyBhcmUgaW52aXNpYmxlXG4gICAgICAgICAgdmFyIGRyYWdSZWN0QWJzb2x1dGUgPSBnZXRSZWN0KGRyYWdFbCQxLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgICAgICAgICBzZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQsIGRyYWdSZWN0QWJzb2x1dGUpOyAvLyBNb3ZlIGVsZW1lbnQocykgdG8gZW5kIG9mIHBhcmVudEVsIHNvIHRoYXQgaXQgZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggbXVsdGktZHJhZyBjbG9uZXMgaW5zZXJ0aW9uIGlmIHRoZXkgYXJlIGluc2VydGVkXG4gICAgICAgICAgICAvLyB3aGlsZSBmb2xkaW5nLCBhbmQgc28gdGhhdCB3ZSBjYW4gY2FwdHVyZSB0aGVtIGFnYWluIGJlY2F1c2Ugb2xkIHNvcnRhYmxlIHdpbGwgbm8gbG9uZ2VyIGJlIGZyb21Tb3J0YWJsZVxuXG4gICAgICAgICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgfSAvLyBDbG9uZXMgbXVzdCBiZSBzaG93biAoYW5kIGNoZWNrIHRvIHJlbW92ZSBtdWx0aSBkcmFncykgYWZ0ZXIgZm9sZGluZyB3aGVuIGludGVyZmVyaW5nIG11bHRpRHJhZ0VsZW1lbnRzIGFyZSBtb3ZlZCBvdXRcblxuXG4gICAgICAgIGlmICghaXNPd25lcikge1xuICAgICAgICAgIC8vIE9ubHkgcmVtb3ZlIGlmIG5vdCBmb2xkaW5nIChmb2xkaW5nIHdpbGwgcmVtb3ZlIHRoZW0gYW55d2F5cylcbiAgICAgICAgICBpZiAoIWZvbGRpbmcpIHtcbiAgICAgICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBjbG9uZXNIaWRkZW5CZWZvcmUgPSBjbG9uZXNIaWRkZW47XG5cbiAgICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9zaG93Q2xvbmUoc29ydGFibGUpOyAvLyBVbmZvbGQgYW5pbWF0aW9uIGZvciBjbG9uZXMgaWYgc2hvd2luZyBmcm9tIGhpZGRlblxuXG5cbiAgICAgICAgICAgIGlmIChhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmFuaW1hdGlvbiAmJiAhY2xvbmVzSGlkZGVuICYmIGNsb25lc0hpZGRlbkJlZm9yZSkge1xuICAgICAgICAgICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICAgICAgICB0YXJnZXQ6IGNsb25lLFxuICAgICAgICAgICAgICAgICAgcmVjdDogY2xvbmVzRnJvbVJlY3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjbG9uZS5mcm9tUmVjdCA9IGNsb25lc0Zyb21SZWN0O1xuICAgICAgICAgICAgICAgIGNsb25lLnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKHNvcnRhYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQW5pbWF0aW9uQ2FwdHVyZTogZnVuY3Rpb24gZHJhZ092ZXJBbmltYXRpb25DYXB0dXJlKF9yZWYxMSkge1xuICAgICAgdmFyIGRyYWdSZWN0ID0gX3JlZjExLmRyYWdSZWN0LFxuICAgICAgICAgIGlzT3duZXIgPSBfcmVmMTEuaXNPd25lcixcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYxMS5hY3RpdmVTb3J0YWJsZTtcbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudC50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmFuaW1hdGlvbiAmJiAhaXNPd25lciAmJiBhY3RpdmVTb3J0YWJsZS5tdWx0aURyYWcuaXNNdWx0aURyYWcpIHtcbiAgICAgICAgY2xvbmVzRnJvbVJlY3QgPSBfZXh0ZW5kcyh7fSwgZHJhZ1JlY3QpO1xuICAgICAgICB2YXIgZHJhZ01hdHJpeCA9IG1hdHJpeChkcmFnRWwkMSwgdHJ1ZSk7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0LnRvcCAtPSBkcmFnTWF0cml4LmY7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0LmxlZnQgLT0gZHJhZ01hdHJpeC5lO1xuICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZTogZnVuY3Rpb24gZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZSgpIHtcbiAgICAgIGlmIChmb2xkaW5nKSB7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyb3A6IGZ1bmN0aW9uIGRyb3AoX3JlZjEyKSB7XG4gICAgICB2YXIgZXZ0ID0gX3JlZjEyLm9yaWdpbmFsRXZlbnQsXG4gICAgICAgICAgcm9vdEVsID0gX3JlZjEyLnJvb3RFbCxcbiAgICAgICAgICBwYXJlbnRFbCA9IF9yZWYxMi5wYXJlbnRFbCxcbiAgICAgICAgICBzb3J0YWJsZSA9IF9yZWYxMi5zb3J0YWJsZSxcbiAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQgPSBfcmVmMTIuZGlzcGF0Y2hTb3J0YWJsZUV2ZW50LFxuICAgICAgICAgIG9sZEluZGV4ID0gX3JlZjEyLm9sZEluZGV4LFxuICAgICAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjEyLnB1dFNvcnRhYmxlO1xuICAgICAgdmFyIHRvU29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCB0aGlzLnNvcnRhYmxlO1xuICAgICAgaWYgKCFldnQpIHJldHVybjtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGNoaWxkcmVuID0gcGFyZW50RWwuY2hpbGRyZW47IC8vIE11bHRpLWRyYWcgc2VsZWN0aW9uXG5cbiAgICAgIGlmICghZHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubXVsdGlEcmFnS2V5ICYmICF0aGlzLm11bHRpRHJhZ0tleURvd24pIHtcbiAgICAgICAgICB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsJDEsIG9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgIX5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKSk7XG5cbiAgICAgICAgaWYgKCF+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSkpIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5wdXNoKGRyYWdFbCQxKTtcbiAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICAgICAgbmFtZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICB0YXJnZXRFbDogZHJhZ0VsJDEsXG4gICAgICAgICAgICBvcmlnaW5hbEV2dDogZXZ0XG4gICAgICAgICAgfSk7IC8vIE1vZGlmaWVyIGFjdGl2YXRlZCwgc2VsZWN0IGZyb20gbGFzdCB0byBkcmFnRWxcblxuICAgICAgICAgIGlmIChldnQuc2hpZnRLZXkgJiYgbGFzdE11bHRpRHJhZ1NlbGVjdCAmJiBzb3J0YWJsZS5lbC5jb250YWlucyhsYXN0TXVsdGlEcmFnU2VsZWN0KSkge1xuICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IGluZGV4KGxhc3RNdWx0aURyYWdTZWxlY3QpLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4KGRyYWdFbCQxKTtcblxuICAgICAgICAgICAgaWYgKH5sYXN0SW5kZXggJiYgfmN1cnJlbnRJbmRleCAmJiBsYXN0SW5kZXggIT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgICAgICAvLyBNdXN0IGluY2x1ZGUgbGFzdE11bHRpRHJhZ1NlbGVjdCAoc2VsZWN0IGl0KSwgaW4gY2FzZSBtb2RpZmllZCBzZWxlY3Rpb24gZnJvbSBubyBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgLy8gKGJ1dCBwcmV2aW91cyBzZWxlY3Rpb24gZXhpc3RlZClcbiAgICAgICAgICAgICAgdmFyIG4sIGk7XG5cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgIGkgPSBsYXN0SW5kZXg7XG4gICAgICAgICAgICAgICAgbiA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gY3VycmVudEluZGV4O1xuICAgICAgICAgICAgICAgIG4gPSBsYXN0SW5kZXggKyAxO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yICg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAofm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoY2hpbGRyZW5baV0pKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0b2dnbGVDbGFzcyhjaGlsZHJlbltpXSwgb3B0aW9ucy5zZWxlY3RlZENsYXNzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgICAgICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICAgICAgICAgICAgbmFtZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgICAgICB0YXJnZXRFbDogY2hpbGRyZW5baV0sXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2dDogZXZ0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdE11bHRpRHJhZ1NlbGVjdCA9IGRyYWdFbCQxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gdG9Tb3J0YWJsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5zcGxpY2UobXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSksIDEpO1xuICAgICAgICAgIGxhc3RNdWx0aURyYWdTZWxlY3QgPSBudWxsO1xuICAgICAgICAgIGRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlLFxuICAgICAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgICAgICBuYW1lOiAnZGVzZWxlY3QnLFxuICAgICAgICAgICAgdGFyZ2V0RWw6IGRyYWdFbCQxLFxuICAgICAgICAgICAgb3JpZ2luYWxFdnQ6IGV2dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IC8vIE11bHRpLWRyYWcgZHJvcFxuXG5cbiAgICAgIGlmIChkcmFnU3RhcnRlZCAmJiB0aGlzLmlzTXVsdGlEcmFnKSB7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTsgLy8gRG8gbm90IFwidW5mb2xkXCIgYWZ0ZXIgYXJvdW5kIGRyYWdFbCBpZiByZXZlcnRlZFxuXG4gICAgICAgIGlmICgocGFyZW50RWxbZXhwYW5kb10ub3B0aW9ucy5zb3J0IHx8IHBhcmVudEVsICE9PSByb290RWwpICYmIG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCQxKSxcbiAgICAgICAgICAgICAgbXVsdGlEcmFnSW5kZXggPSBpbmRleChkcmFnRWwkMSwgJzpub3QoLicgKyB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcyArICcpJyk7XG4gICAgICAgICAgaWYgKCFpbml0aWFsRm9sZGluZyAmJiBvcHRpb25zLmFuaW1hdGlvbikgZHJhZ0VsJDEudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgICB0b1NvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuXG4gICAgICAgICAgaWYgKCFpbml0aWFsRm9sZGluZykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgIGRyYWdFbCQxLmZyb21SZWN0ID0gZHJhZ1JlY3Q7XG4gICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCAhPT0gZHJhZ0VsJDEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciByZWN0ID0gZm9sZGluZyA/IGdldFJlY3QobXVsdGlEcmFnRWxlbWVudCkgOiBkcmFnUmVjdDtcbiAgICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQuZnJvbVJlY3QgPSByZWN0OyAvLyBQcmVwYXJlIHVuZm9sZCBhbmltYXRpb25cblxuICAgICAgICAgICAgICAgICAgdG9Tb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcmVjdDogcmVjdFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gLy8gTXVsdGkgZHJhZyBlbGVtZW50cyBhcmUgbm90IG5lY2Vzc2FyaWx5IHJlbW92ZWQgZnJvbSB0aGUgRE9NIG9uIGRyb3AsIHNvIHRvIHJlaW5zZXJ0XG4gICAgICAgICAgICAvLyBwcm9wZXJseSB0aGV5IG11c3QgYWxsIGJlIHJlbW92ZWRcblxuXG4gICAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5bbXVsdGlEcmFnSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50RWwuaW5zZXJ0QmVmb3JlKG11bHRpRHJhZ0VsZW1lbnQsIGNoaWxkcmVuW211bHRpRHJhZ0luZGV4XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBtdWx0aURyYWdJbmRleCsrO1xuICAgICAgICAgICAgfSk7IC8vIElmIGluaXRpYWwgZm9sZGluZyBpcyBkb25lLCB0aGUgZWxlbWVudHMgbWF5IGhhdmUgY2hhbmdlZCBwb3NpdGlvbiBiZWNhdXNlIHRoZXkgYXJlIG5vd1xuICAgICAgICAgICAgLy8gdW5mb2xkaW5nIGFyb3VuZCBkcmFnRWwsIGV2ZW4gdGhvdWdoIGRyYWdFbCBtYXkgbm90IGhhdmUgaGlzIGluZGV4IGNoYW5nZWQsIHNvIHVwZGF0ZSBldmVudFxuICAgICAgICAgICAgLy8gbXVzdCBiZSBmaXJlZCBoZXJlIGFzIFNvcnRhYmxlIHdpbGwgbm90LlxuXG4gICAgICAgICAgICBpZiAob2xkSW5kZXggPT09IGluZGV4KGRyYWdFbCQxKSkge1xuICAgICAgICAgICAgICB2YXIgdXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4ICE9PSBpbmRleChtdWx0aURyYWdFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgdXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoJ3VwZGF0ZScpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSAvLyBNdXN0IGJlIGRvbmUgYWZ0ZXIgY2FwdHVyaW5nIGluZGl2aWR1YWwgcmVjdHMgKHNjcm9sbCBiYXIpXG5cblxuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHVuc2V0UmVjdChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0b1NvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gdG9Tb3J0YWJsZTtcbiAgICAgIH0gLy8gUmVtb3ZlIGNsb25lcyBpZiBuZWNlc3NhcnlcblxuXG4gICAgICBpZiAocm9vdEVsID09PSBwYXJlbnRFbCB8fCBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSAhPT0gJ2Nsb25lJykge1xuICAgICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICBjbG9uZS5wYXJlbnROb2RlICYmIGNsb25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG51bGxpbmdHbG9iYWw6IGZ1bmN0aW9uIG51bGxpbmdHbG9iYWwoKSB7XG4gICAgICB0aGlzLmlzTXVsdGlEcmFnID0gZHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5sZW5ndGggPSAwO1xuICAgIH0sXG4gICAgZGVzdHJveUdsb2JhbDogZnVuY3Rpb24gZGVzdHJveUdsb2JhbCgpIHtcbiAgICAgIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG5cbiAgICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJ1cCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ2tleWRvd24nLCB0aGlzLl9jaGVja0tleURvd24pO1xuICAgICAgb2ZmKGRvY3VtZW50LCAna2V5dXAnLCB0aGlzLl9jaGVja0tleVVwKTtcbiAgICB9LFxuICAgIF9kZXNlbGVjdE11bHRpRHJhZzogZnVuY3Rpb24gX2Rlc2VsZWN0TXVsdGlEcmFnKGV2dCkge1xuICAgICAgaWYgKHR5cGVvZiBkcmFnU3RhcnRlZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkcmFnU3RhcnRlZCkgcmV0dXJuOyAvLyBPbmx5IGRlc2VsZWN0IGlmIHNlbGVjdGlvbiBpcyBpbiB0aGlzIHNvcnRhYmxlXG5cbiAgICAgIGlmIChtdWx0aURyYWdTb3J0YWJsZSAhPT0gdGhpcy5zb3J0YWJsZSkgcmV0dXJuOyAvLyBPbmx5IGRlc2VsZWN0IGlmIHRhcmdldCBpcyBub3QgaXRlbSBpbiB0aGlzIHNvcnRhYmxlXG5cbiAgICAgIGlmIChldnQgJiYgY2xvc2VzdChldnQudGFyZ2V0LCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLnNvcnRhYmxlLmVsLCBmYWxzZSkpIHJldHVybjsgLy8gT25seSBkZXNlbGVjdCBpZiBsZWZ0IGNsaWNrXG5cbiAgICAgIGlmIChldnQgJiYgZXZ0LmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuXG4gICAgICB3aGlsZSAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbCA9IG11bHRpRHJhZ0VsZW1lbnRzWzBdO1xuICAgICAgICB0b2dnbGVDbGFzcyhlbCwgdGhpcy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc2hpZnQoKTtcbiAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IHRoaXMuc29ydGFibGUsXG4gICAgICAgICAgcm9vdEVsOiB0aGlzLnNvcnRhYmxlLmVsLFxuICAgICAgICAgIG5hbWU6ICdkZXNlbGVjdCcsXG4gICAgICAgICAgdGFyZ2V0RWw6IGVsLFxuICAgICAgICAgIG9yaWdpbmFsRXZ0OiBldnRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBfY2hlY2tLZXlEb3duOiBmdW5jdGlvbiBfY2hlY2tLZXlEb3duKGV2dCkge1xuICAgICAgaWYgKGV2dC5rZXkgPT09IHRoaXMub3B0aW9ucy5tdWx0aURyYWdLZXkpIHtcbiAgICAgICAgdGhpcy5tdWx0aURyYWdLZXlEb3duID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9jaGVja0tleVVwOiBmdW5jdGlvbiBfY2hlY2tLZXlVcChldnQpIHtcbiAgICAgIGlmIChldnQua2V5ID09PSB0aGlzLm9wdGlvbnMubXVsdGlEcmFnS2V5KSB7XG4gICAgICAgIHRoaXMubXVsdGlEcmFnS2V5RG93biA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzKE11bHRpRHJhZywge1xuICAgIC8vIFN0YXRpYyBtZXRob2RzICYgcHJvcGVydGllc1xuICAgIHBsdWdpbk5hbWU6ICdtdWx0aURyYWcnLFxuICAgIHV0aWxzOiB7XG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdHMgdGhlIHByb3ZpZGVkIG11bHRpLWRyYWcgaXRlbVxuICAgICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgIFRoZSBlbGVtZW50IHRvIGJlIHNlbGVjdGVkXG4gICAgICAgKi9cbiAgICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KGVsKSB7XG4gICAgICAgIHZhciBzb3J0YWJsZSA9IGVsLnBhcmVudE5vZGVbZXhwYW5kb107XG4gICAgICAgIGlmICghc29ydGFibGUgfHwgIXNvcnRhYmxlLm9wdGlvbnMubXVsdGlEcmFnIHx8IH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGVsKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChtdWx0aURyYWdTb3J0YWJsZSAmJiBtdWx0aURyYWdTb3J0YWJsZSAhPT0gc29ydGFibGUpIHtcbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZS5tdWx0aURyYWcuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG5cbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHNvcnRhYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZWwsIHNvcnRhYmxlLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgdHJ1ZSk7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEZXNlbGVjdHMgdGhlIHByb3ZpZGVkIG11bHRpLWRyYWcgaXRlbVxuICAgICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgIFRoZSBlbGVtZW50IHRvIGJlIGRlc2VsZWN0ZWRcbiAgICAgICAqL1xuICAgICAgZGVzZWxlY3Q6IGZ1bmN0aW9uIGRlc2VsZWN0KGVsKSB7XG4gICAgICAgIHZhciBzb3J0YWJsZSA9IGVsLnBhcmVudE5vZGVbZXhwYW5kb10sXG4gICAgICAgICAgICBpbmRleCA9IG11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZWwpO1xuICAgICAgICBpZiAoIXNvcnRhYmxlIHx8ICFzb3J0YWJsZS5vcHRpb25zLm11bHRpRHJhZyB8fCAhfmluZGV4KSByZXR1cm47XG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCBzb3J0YWJsZS5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV2ZW50UHJvcGVydGllczogZnVuY3Rpb24gZXZlbnRQcm9wZXJ0aWVzKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBvbGRJbmRpY2llcyA9IFtdLFxuICAgICAgICAgIG5ld0luZGljaWVzID0gW107XG4gICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgIG9sZEluZGljaWVzLnB1c2goe1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgaW5kZXg6IG11bHRpRHJhZ0VsZW1lbnQuc29ydGFibGVJbmRleFxuICAgICAgICB9KTsgLy8gbXVsdGlEcmFnRWxlbWVudHMgd2lsbCBhbHJlYWR5IGJlIHNvcnRlZCBpZiBmb2xkaW5nXG5cbiAgICAgICAgdmFyIG5ld0luZGV4O1xuXG4gICAgICAgIGlmIChmb2xkaW5nICYmIG11bHRpRHJhZ0VsZW1lbnQgIT09IGRyYWdFbCQxKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChmb2xkaW5nKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50LCAnOm5vdCguJyArIF90aGlzMy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MgKyAnKScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdJbmRpY2llcy5wdXNoKHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50OiBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgIGluZGV4OiBuZXdJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXRlbXM6IF90b0NvbnN1bWFibGVBcnJheShtdWx0aURyYWdFbGVtZW50cyksXG4gICAgICAgIGNsb25lczogW10uY29uY2F0KG11bHRpRHJhZ0Nsb25lcyksXG4gICAgICAgIG9sZEluZGljaWVzOiBvbGRJbmRpY2llcyxcbiAgICAgICAgbmV3SW5kaWNpZXM6IG5ld0luZGljaWVzXG4gICAgICB9O1xuICAgIH0sXG4gICAgb3B0aW9uTGlzdGVuZXJzOiB7XG4gICAgICBtdWx0aURyYWdLZXk6IGZ1bmN0aW9uIG11bHRpRHJhZ0tleShrZXkpIHtcbiAgICAgICAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ2N0cmwnKSB7XG4gICAgICAgICAga2V5ID0gJ0NvbnRyb2wnO1xuICAgICAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAga2V5ID0ga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cigxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0TXVsdGlEcmFnRWxlbWVudHMoY2xvbmVzSW5zZXJ0ZWQsIHJvb3RFbCkge1xuICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50LCBpKSB7XG4gICAgdmFyIHRhcmdldCA9IHJvb3RFbC5jaGlsZHJlblttdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggKyAoY2xvbmVzSW5zZXJ0ZWQgPyBOdW1iZXIoaSkgOiAwKV07XG5cbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICByb290RWwuaW5zZXJ0QmVmb3JlKG11bHRpRHJhZ0VsZW1lbnQsIHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgICB9XG4gIH0pO1xufVxuLyoqXG4gKiBJbnNlcnQgbXVsdGktZHJhZyBjbG9uZXNcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gZWxlbWVudHNJbnNlcnRlZCAgV2hldGhlciB0aGUgbXVsdGktZHJhZyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWRcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSByb290RWxcbiAqL1xuXG5cbmZ1bmN0aW9uIGluc2VydE11bHRpRHJhZ0Nsb25lcyhlbGVtZW50c0luc2VydGVkLCByb290RWwpIHtcbiAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lLCBpKSB7XG4gICAgdmFyIHRhcmdldCA9IHJvb3RFbC5jaGlsZHJlbltjbG9uZS5zb3J0YWJsZUluZGV4ICsgKGVsZW1lbnRzSW5zZXJ0ZWQgPyBOdW1iZXIoaSkgOiAwKV07XG5cbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lLCB0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByb290RWwuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCkge1xuICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgbXVsdGlEcmFnRWxlbWVudC5wYXJlbnROb2RlICYmIG11bHRpRHJhZ0VsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgfSk7XG59XG5cblNvcnRhYmxlLm1vdW50KG5ldyBBdXRvU2Nyb2xsUGx1Z2luKCkpO1xuU29ydGFibGUubW91bnQoUmVtb3ZlLCBSZXZlcnQpO1xuXG5leHBvcnQgZGVmYXVsdCBTb3J0YWJsZTtcbmV4cG9ydCB7IE11bHRpRHJhZ1BsdWdpbiBhcyBNdWx0aURyYWcsIFNvcnRhYmxlLCBTd2FwUGx1Z2luIGFzIFN3YXAgfTtcbiIsInZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19kZWZQcm9wcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzO1xudmFyIF9fZ2V0T3duUHJvcERlc2NzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbnZhciBfX3NwcmVhZFByb3BzID0gKGEsIGIpID0+IF9fZGVmUHJvcHMoYSwgX19nZXRPd25Qcm9wRGVzY3MoYikpO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gXCJzb3J0YWJsZWpzXCI7XG5pbXBvcnQgeyByZXNvbHZlQ29tcG9uZW50LCBUcmFuc2l0aW9uR3JvdXAsIGRlZmluZUNvbXBvbmVudCwgaCwgbmV4dFRpY2sgfSBmcm9tIFwidnVlXCI7XG5mdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUpIHtcbiAgaWYgKG5vZGUucGFyZW50RWxlbWVudCAhPT0gbnVsbCkge1xuICAgIG5vZGUucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTtcbiAgfVxufVxuZnVuY3Rpb24gaW5zZXJ0Tm9kZUF0KGZhdGhlck5vZGUsIG5vZGUsIHBvc2l0aW9uKSB7XG4gIGNvbnN0IHJlZk5vZGUgPSBwb3NpdGlvbiA9PT0gMCA/IGZhdGhlck5vZGUuY2hpbGRyZW5bMF0gOiBmYXRoZXJOb2RlLmNoaWxkcmVuW3Bvc2l0aW9uIC0gMV0ubmV4dFNpYmxpbmc7XG4gIGZhdGhlck5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHJlZk5vZGUpO1xufVxuZnVuY3Rpb24gZ2V0Q29uc29sZSgpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gd2luZG93LmNvbnNvbGU7XG4gIH1cbiAgcmV0dXJuIGdsb2JhbC5jb25zb2xlO1xufVxuY29uc3QgY29uc29sZSQxID0gZ2V0Q29uc29sZSgpO1xuZnVuY3Rpb24gY2FjaGVkKGZuKSB7XG4gIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiBmdW5jdGlvbiBjYWNoZWRGbihzdHIpIHtcbiAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdO1xuICAgIHJldHVybiBoaXQgfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKTtcbiAgfTtcbn1cbmNvbnN0IHJlZ2V4ID0gLy0oXFx3KS9nO1xuY29uc3QgY2FtZWxpemUgPSBjYWNoZWQoKHN0cikgPT4gc3RyLnJlcGxhY2UocmVnZXgsIChfLCBjKSA9PiBjLnRvVXBwZXJDYXNlKCkpKTtcbmNvbnN0IG1hbmFnZUFuZEVtaXQkMSA9IFtcIlN0YXJ0XCIsIFwiQWRkXCIsIFwiUmVtb3ZlXCIsIFwiVXBkYXRlXCIsIFwiRW5kXCJdO1xuY29uc3QgZW1pdCQxID0gW1wiQ2hvb3NlXCIsIFwiVW5jaG9vc2VcIiwgXCJTb3J0XCIsIFwiRmlsdGVyXCIsIFwiQ2xvbmVcIl07XG5jb25zdCBtYW5hZ2UkMSA9IFtcIk1vdmVcIl07XG5jb25zdCBldmVudEhhbmRsZXJOYW1lcyA9IFttYW5hZ2UkMSwgbWFuYWdlQW5kRW1pdCQxLCBlbWl0JDFdLmZsYXRNYXAoKGV2ZW50czIpID0+IGV2ZW50czIpLm1hcCgoZXZ0KSA9PiBgb24ke2V2dH1gKTtcbmNvbnN0IGV2ZW50cyA9IHtcbiAgbWFuYWdlOiBtYW5hZ2UkMSxcbiAgbWFuYWdlQW5kRW1pdDogbWFuYWdlQW5kRW1pdCQxLFxuICBlbWl0OiBlbWl0JDFcbn07XG5mdW5jdGlvbiBpc1JlYWRPbmx5KGV2ZW50TmFtZSkge1xuICByZXR1cm4gZXZlbnRIYW5kbGVyTmFtZXMuaW5kZXhPZihldmVudE5hbWUpICE9PSAtMTtcbn1cbmNvbnN0IHRhZ3MgPSBbXG4gIFwiYVwiLFxuICBcImFiYnJcIixcbiAgXCJhZGRyZXNzXCIsXG4gIFwiYXJlYVwiLFxuICBcImFydGljbGVcIixcbiAgXCJhc2lkZVwiLFxuICBcImF1ZGlvXCIsXG4gIFwiYlwiLFxuICBcImJhc2VcIixcbiAgXCJiZGlcIixcbiAgXCJiZG9cIixcbiAgXCJibG9ja3F1b3RlXCIsXG4gIFwiYm9keVwiLFxuICBcImJyXCIsXG4gIFwiYnV0dG9uXCIsXG4gIFwiY2FudmFzXCIsXG4gIFwiY2FwdGlvblwiLFxuICBcImNpdGVcIixcbiAgXCJjb2RlXCIsXG4gIFwiY29sXCIsXG4gIFwiY29sZ3JvdXBcIixcbiAgXCJkYXRhXCIsXG4gIFwiZGF0YWxpc3RcIixcbiAgXCJkZFwiLFxuICBcImRlbFwiLFxuICBcImRldGFpbHNcIixcbiAgXCJkZm5cIixcbiAgXCJkaWFsb2dcIixcbiAgXCJkaXZcIixcbiAgXCJkbFwiLFxuICBcImR0XCIsXG4gIFwiZW1cIixcbiAgXCJlbWJlZFwiLFxuICBcImZpZWxkc2V0XCIsXG4gIFwiZmlnY2FwdGlvblwiLFxuICBcImZpZ3VyZVwiLFxuICBcImZvb3RlclwiLFxuICBcImZvcm1cIixcbiAgXCJoMVwiLFxuICBcImgyXCIsXG4gIFwiaDNcIixcbiAgXCJoNFwiLFxuICBcImg1XCIsXG4gIFwiaDZcIixcbiAgXCJoZWFkXCIsXG4gIFwiaGVhZGVyXCIsXG4gIFwiaGdyb3VwXCIsXG4gIFwiaHJcIixcbiAgXCJodG1sXCIsXG4gIFwiaVwiLFxuICBcImlmcmFtZVwiLFxuICBcImltZ1wiLFxuICBcImlucHV0XCIsXG4gIFwiaW5zXCIsXG4gIFwia2JkXCIsXG4gIFwibGFiZWxcIixcbiAgXCJsZWdlbmRcIixcbiAgXCJsaVwiLFxuICBcImxpbmtcIixcbiAgXCJtYWluXCIsXG4gIFwibWFwXCIsXG4gIFwibWFya1wiLFxuICBcIm1hdGhcIixcbiAgXCJtZW51XCIsXG4gIFwibWVudWl0ZW1cIixcbiAgXCJtZXRhXCIsXG4gIFwibWV0ZXJcIixcbiAgXCJuYXZcIixcbiAgXCJub3NjcmlwdFwiLFxuICBcIm9iamVjdFwiLFxuICBcIm9sXCIsXG4gIFwib3B0Z3JvdXBcIixcbiAgXCJvcHRpb25cIixcbiAgXCJvdXRwdXRcIixcbiAgXCJwXCIsXG4gIFwicGFyYW1cIixcbiAgXCJwaWN0dXJlXCIsXG4gIFwicHJlXCIsXG4gIFwicHJvZ3Jlc3NcIixcbiAgXCJxXCIsXG4gIFwicmJcIixcbiAgXCJycFwiLFxuICBcInJ0XCIsXG4gIFwicnRjXCIsXG4gIFwicnVieVwiLFxuICBcInNcIixcbiAgXCJzYW1wXCIsXG4gIFwic2NyaXB0XCIsXG4gIFwic2VjdGlvblwiLFxuICBcInNlbGVjdFwiLFxuICBcInNsb3RcIixcbiAgXCJzbWFsbFwiLFxuICBcInNvdXJjZVwiLFxuICBcInNwYW5cIixcbiAgXCJzdHJvbmdcIixcbiAgXCJzdHlsZVwiLFxuICBcInN1YlwiLFxuICBcInN1bW1hcnlcIixcbiAgXCJzdXBcIixcbiAgXCJzdmdcIixcbiAgXCJ0YWJsZVwiLFxuICBcInRib2R5XCIsXG4gIFwidGRcIixcbiAgXCJ0ZW1wbGF0ZVwiLFxuICBcInRleHRhcmVhXCIsXG4gIFwidGZvb3RcIixcbiAgXCJ0aFwiLFxuICBcInRoZWFkXCIsXG4gIFwidGltZVwiLFxuICBcInRpdGxlXCIsXG4gIFwidHJcIixcbiAgXCJ0cmFja1wiLFxuICBcInVcIixcbiAgXCJ1bFwiLFxuICBcInZhclwiLFxuICBcInZpZGVvXCIsXG4gIFwid2JyXCJcbl07XG5mdW5jdGlvbiBpc0h0bWxUYWcobmFtZSkge1xuICByZXR1cm4gdGFncy5pbmNsdWRlcyhuYW1lKTtcbn1cbmZ1bmN0aW9uIGlzVHJhbnNpdGlvbihuYW1lKSB7XG4gIHJldHVybiBbXCJ0cmFuc2l0aW9uLWdyb3VwXCIsIFwiVHJhbnNpdGlvbkdyb3VwXCJdLmluY2x1ZGVzKG5hbWUpO1xufVxuZnVuY3Rpb24gaXNIdG1sQXR0cmlidXRlKHZhbHVlKSB7XG4gIHJldHVybiBbXCJpZFwiLCBcImNsYXNzXCIsIFwicm9sZVwiLCBcInN0eWxlXCJdLmluY2x1ZGVzKHZhbHVlKSB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiZGF0YS1cIikgfHwgdmFsdWUuc3RhcnRzV2l0aChcImFyaWEtXCIpIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCJvblwiKTtcbn1cbmZ1bmN0aW9uIHByb2plY3QoZW50cmllcykge1xuICByZXR1cm4gZW50cmllcy5yZWR1Y2UoKHJlcywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgcmVzW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gcmVzO1xuICB9LCB7fSk7XG59XG5mdW5jdGlvbiBnZXRDb21wb25lbnRBdHRyaWJ1dGVzKHsgJGF0dHJzLCBjb21wb25lbnREYXRhID0ge30gfSkge1xuICBjb25zdCBhdHRyaWJ1dGVzID0gcHJvamVjdChPYmplY3QuZW50cmllcygkYXR0cnMpLmZpbHRlcigoW2tleSwgX10pID0+IGlzSHRtbEF0dHJpYnV0ZShrZXkpKSk7XG4gIHJldHVybiBfX3NwcmVhZFZhbHVlcyhfX3NwcmVhZFZhbHVlcyh7fSwgYXR0cmlidXRlcyksIGNvbXBvbmVudERhdGEpO1xufVxuZnVuY3Rpb24gY3JlYXRlU29ydGFibGVPcHRpb24oeyAkYXR0cnMsIGNhbGxCYWNrQnVpbGRlciB9KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwcm9qZWN0KGdldFZhbGlkU29ydGFibGVFbnRyaWVzKCRhdHRycykpO1xuICBPYmplY3QuZW50cmllcyhjYWxsQmFja0J1aWxkZXIpLmZvckVhY2goKFtldmVudFR5cGUsIGV2ZW50QnVpbGRlcl0pID0+IHtcbiAgICBldmVudHNbZXZlbnRUeXBlXS5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgb3B0aW9uc1tgb24ke2V2ZW50fWBdID0gZXZlbnRCdWlsZGVyKGV2ZW50KTtcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IGRyYWdnYWJsZSA9IGBbZGF0YS1kcmFnZ2FibGVdJHtvcHRpb25zLmRyYWdnYWJsZSB8fCBcIlwifWA7XG4gIHJldHVybiBfX3NwcmVhZFByb3BzKF9fc3ByZWFkVmFsdWVzKHt9LCBvcHRpb25zKSwge1xuICAgIGRyYWdnYWJsZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldFZhbGlkU29ydGFibGVFbnRyaWVzKHZhbHVlKSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh2YWx1ZSkuZmlsdGVyKChba2V5LCBfXSkgPT4gIWlzSHRtbEF0dHJpYnV0ZShrZXkpKS5tYXAoKFtrZXksIHZhbHVlMl0pID0+IFtjYW1lbGl6ZShrZXkpLCB2YWx1ZTJdKS5maWx0ZXIoKFtrZXksIF9dKSA9PiAhaXNSZWFkT25seShrZXkpKTtcbn1cbmNvbnN0IGdldEh0bWxFbGVtZW50RnJvbU5vZGUgPSAobm9kZSkgPT4ge1xuICBjb25zdCBlbCA9IG5vZGUuZWwgfHwgQXJyYXkuaXNBcnJheShub2RlLmNoaWxkcmVuKSAmJiBub2RlLmNoaWxkcmVuWzBdLmVsLnBhcmVudE5vZGU7XG4gIGlmICghZWwpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiXFx1NEY3RlxcdTc1MjggdHJhbnNpdGlvbi1ncm91cCAsIFxcdTk3MDBcXHU4OTgxXFx1NTcyOHNsb3RcXHU0RTJEdGVtcGxhdGVcXHU1MTg1XFx1ODFGM1xcdTVDMTEyXFx1NUM0Mmh0bWxcXHU2ODA3XFx1N0I3RVwiKTtcbiAgfVxuICByZXR1cm4gZWwgfHwge307XG59O1xuY29uc3QgYWRkQ29udGV4dCA9IChkb21FbGVtZW50LCBjb250ZXh0KSA9PiBkb21FbGVtZW50Ll9fZHJhZ2dhYmxlX2NvbnRleHQgPSBjb250ZXh0O1xuY29uc3QgZ2V0Q29udGV4dCA9IChkb21FbGVtZW50KSA9PiBkb21FbGVtZW50Ll9fZHJhZ2dhYmxlX2NvbnRleHQ7XG5jbGFzcyBDb21wb25lbnRTdHJ1Y3R1cmUge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgbm9kZXM6IHsgaGVhZGVyLCBkZWZhdWx0OiBkZWZhdWx0Tm9kZXMsIGZvb3RlciB9LFxuICAgIHJvb3QsXG4gICAgcmVhbExpc3RcbiAgfSkge1xuICAgIHRoaXMuZGVmYXVsdE5vZGVzID0gZGVmYXVsdE5vZGVzO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbLi4uaGVhZGVyLCAuLi5kZWZhdWx0Tm9kZXMsIC4uLmZvb3Rlcl07XG4gICAgdGhpcy5leHRlcm5hbENvbXBvbmVudCA9IHJvb3QuZXh0ZXJuYWxDb21wb25lbnQ7XG4gICAgdGhpcy5yb290VHJhbnNpdGlvbiA9IHJvb3QudHJhbnNpdGlvbjtcbiAgICB0aGlzLnRhZyA9IHJvb3QudGFnO1xuICAgIHRoaXMucmVhbExpc3QgPSByZWFsTGlzdDtcbiAgfVxuICBnZXQgX2lzUm9vdENvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5leHRlcm5hbENvbXBvbmVudCB8fCB0aGlzLnJvb3RUcmFuc2l0aW9uO1xuICB9XG4gIHJlbmRlcihoMiwgYXR0cmlidXRlcykge1xuICAgIGNvbnN0IHsgdGFnLCBjaGlsZHJlbiwgX2lzUm9vdENvbXBvbmVudCB9ID0gdGhpcztcbiAgICBjb25zdCBvcHRpb24gPSAhX2lzUm9vdENvbXBvbmVudCA/IGNoaWxkcmVuIDogeyBkZWZhdWx0OiAoKSA9PiBjaGlsZHJlbiB9O1xuICAgIHJldHVybiBoMih0YWcsIGF0dHJpYnV0ZXMsIG9wdGlvbik7XG4gIH1cbiAgdXBkYXRlZCgpIHtcbiAgICBjb25zdCB7IGRlZmF1bHROb2RlcywgcmVhbExpc3QgfSA9IHRoaXM7XG4gICAgZGVmYXVsdE5vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBhZGRDb250ZXh0KGdldEh0bWxFbGVtZW50RnJvbU5vZGUobm9kZSksIHtcbiAgICAgICAgZWxlbWVudDogcmVhbExpc3RbaW5kZXhdLFxuICAgICAgICBpbmRleFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0VW5kZXJseWluZ1ZtKGRvbUVsZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0Q29udGV4dChkb21FbGVtZW50KTtcbiAgfVxuICBnZXRWbUluZGV4RnJvbURvbUluZGV4KGRvbUluZGV4LCBlbGVtZW50KSB7XG4gICAgY29uc3QgeyBkZWZhdWx0Tm9kZXMgfSA9IHRoaXM7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGRlZmF1bHROb2RlcztcbiAgICBjb25zdCBkb21DaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW47XG4gICAgY29uc3QgZG9tRWxlbWVudCA9IGRvbUNoaWxkcmVuLml0ZW0oZG9tSW5kZXgpO1xuICAgIGlmIChkb21FbGVtZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dChkb21FbGVtZW50KTtcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZXg7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBmaXJzdERvbUxpc3RFbGVtZW50ID0gZ2V0SHRtbEVsZW1lbnRGcm9tTm9kZShkZWZhdWx0Tm9kZXNbMF0pO1xuICAgIGNvbnN0IGluZGV4Rmlyc3REb21MaXN0RWxlbWVudCA9IFsuLi5kb21DaGlsZHJlbl0uZmluZEluZGV4KChlbGVtZW50MikgPT4gZWxlbWVudDIgPT09IGZpcnN0RG9tTGlzdEVsZW1lbnQpO1xuICAgIHJldHVybiBkb21JbmRleCA8IGluZGV4Rmlyc3REb21MaXN0RWxlbWVudCA/IDAgOiBsZW5ndGg7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFNsb3Qoc2xvdHMsIGtleSkge1xuICBjb25zdCBzbG90VmFsdWUgPSBzbG90c1trZXldO1xuICByZXR1cm4gc2xvdFZhbHVlID8gc2xvdFZhbHVlKCkgOiBbXTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVOb2Rlcyh7ICRzbG90cywgcmVhbExpc3QsIGdldEtleSB9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRMaXN0ID0gcmVhbExpc3QgfHwgW107XG4gIGNvbnN0IFtoZWFkZXIsIGZvb3Rlcl0gPSBbXCJoZWFkZXJcIiwgXCJmb290ZXJcIl0ubWFwKChuYW1lKSA9PiBnZXRTbG90KCRzbG90cywgbmFtZSkpO1xuICBjb25zdCB7IGl0ZW0gfSA9ICRzbG90cztcbiAgaWYgKCFpdGVtKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZHJhZ2dhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGFuIGl0ZW0gc2xvdFwiKTtcbiAgfVxuICBjb25zdCBkZWZhdWx0Tm9kZXMgPSBub3JtYWxpemVkTGlzdC5mbGF0TWFwKChlbGVtZW50LCBpbmRleCkgPT4gaXRlbSh7IGVsZW1lbnQsIGluZGV4IH0pLm1hcCgobm9kZSkgPT4ge1xuICAgIG5vZGUua2V5ID0gZ2V0S2V5KGVsZW1lbnQpO1xuICAgIG5vZGUucHJvcHMgPSBfX3NwcmVhZFByb3BzKF9fc3ByZWFkVmFsdWVzKHt9LCBub2RlLnByb3BzIHx8IHt9KSwgeyBcImRhdGEtZHJhZ2dhYmxlXCI6IHRydWUgfSk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH0pKTtcbiAgaWYgKGRlZmF1bHROb2Rlcy5sZW5ndGggIT09IG5vcm1hbGl6ZWRMaXN0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkl0ZW0gc2xvdCBtdXN0IGhhdmUgb25seSBvbmUgY2hpbGRcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBoZWFkZXIsXG4gICAgZm9vdGVyLFxuICAgIGRlZmF1bHQ6IGRlZmF1bHROb2Rlc1xuICB9O1xufVxuZnVuY3Rpb24gZ2V0Um9vdEluZm9ybWF0aW9uKHRhZykge1xuICBjb25zdCB0cmFuc2l0aW9uID0gaXNUcmFuc2l0aW9uKHRhZyk7XG4gIGNvbnN0IGV4dGVybmFsQ29tcG9uZW50ID0gIWlzSHRtbFRhZyh0YWcpICYmICF0cmFuc2l0aW9uO1xuICByZXR1cm4ge1xuICAgIHRyYW5zaXRpb24sXG4gICAgZXh0ZXJuYWxDb21wb25lbnQsXG4gICAgdGFnOiBleHRlcm5hbENvbXBvbmVudCA/IHJlc29sdmVDb21wb25lbnQodGFnKSA6IHRyYW5zaXRpb24gPyBUcmFuc2l0aW9uR3JvdXAgOiB0YWdcbiAgfTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVDb21wb25lbnRTdHJ1Y3R1cmUoeyAkc2xvdHMsIHRhZywgcmVhbExpc3QsIGdldEtleSB9KSB7XG4gIGNvbnN0IG5vZGVzID0gY29tcHV0ZU5vZGVzKHsgJHNsb3RzLCByZWFsTGlzdCwgZ2V0S2V5IH0pO1xuICBjb25zdCByb290ID0gZ2V0Um9vdEluZm9ybWF0aW9uKHRhZyk7XG4gIHJldHVybiBuZXcgQ29tcG9uZW50U3RydWN0dXJlKHsgbm9kZXMsIHJvb3QsIHJlYWxMaXN0IH0pO1xufVxuZnVuY3Rpb24gZW1pdChldnROYW1lLCBldnREYXRhKSB7XG4gIG5leHRUaWNrKCgpID0+IHRoaXMuJGVtaXQoZXZ0TmFtZS50b0xvd2VyQ2FzZSgpLCBldnREYXRhKSk7XG59XG5mdW5jdGlvbiBtYW5hZ2UoZXZ0TmFtZSkge1xuICByZXR1cm4gKGV2dERhdGEsIG9yaWdpbmFsRWxlbWVudCkgPT4ge1xuICAgIGlmICh0aGlzLnJlYWxMaXN0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpc1tgb25EcmFnJHtldnROYW1lfWBdKGV2dERhdGEsIG9yaWdpbmFsRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gbWFuYWdlQW5kRW1pdChldnROYW1lKSB7XG4gIGNvbnN0IGRlbGVnYXRlQ2FsbEJhY2sgPSBtYW5hZ2UuY2FsbCh0aGlzLCBldnROYW1lKTtcbiAgcmV0dXJuIChldnREYXRhLCBvcmlnaW5hbEVsZW1lbnQpID0+IHtcbiAgICBkZWxlZ2F0ZUNhbGxCYWNrLmNhbGwodGhpcywgZXZ0RGF0YSwgb3JpZ2luYWxFbGVtZW50KTtcbiAgICBlbWl0LmNhbGwodGhpcywgZXZ0TmFtZSwgZXZ0RGF0YSk7XG4gIH07XG59XG5sZXQgZHJhZ2dpbmdFbGVtZW50ID0gbnVsbDtcbmNvbnN0IHByb3BzID0ge1xuICBsaXN0OiB7XG4gICAgdHlwZTogQXJyYXksXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGRlZmF1bHQ6IG51bGxcbiAgfSxcbiAgbW9kZWxWYWx1ZToge1xuICAgIHR5cGU6IEFycmF5LFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICBkZWZhdWx0OiBudWxsXG4gIH0sXG4gIGl0ZW1LZXk6IHtcbiAgICB0eXBlOiBbU3RyaW5nLCBGdW5jdGlvbl0sXG4gICAgcmVxdWlyZWQ6IHRydWVcbiAgfSxcbiAgY2xvbmU6IHtcbiAgICB0eXBlOiBGdW5jdGlvbixcbiAgICBkZWZhdWx0OiAob3JpZ2luYWwpID0+IHtcbiAgICAgIHJldHVybiBvcmlnaW5hbDtcbiAgICB9XG4gIH0sXG4gIHRhZzoge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgICBkZWZhdWx0OiBcImRpdlwiXG4gIH0sXG4gIG1vdmU6IHtcbiAgICB0eXBlOiBGdW5jdGlvbixcbiAgICBkZWZhdWx0OiBudWxsXG4gIH0sXG4gIGNvbXBvbmVudERhdGE6IHtcbiAgICB0eXBlOiBPYmplY3QsXG4gICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIGRlZmF1bHQ6IG51bGxcbiAgfVxufTtcbmNvbnN0IGVtaXRzID0gW1xuICBcInVwZGF0ZTptb2RlbFZhbHVlXCIsXG4gIFwiY2hhbmdlXCIsXG4gIC4uLlsuLi5ldmVudHMubWFuYWdlQW5kRW1pdCwgLi4uZXZlbnRzLmVtaXRdLm1hcCgoZXZ0KSA9PiBldnQudG9Mb3dlckNhc2UoKSlcbl07XG5jb25zdCBkcmFnZ2FibGVDb21wb25lbnQgPSBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcImRyYWdnYWJsZVwiLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wcyxcbiAgZW1pdHMsXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiBmYWxzZVxuICAgIH07XG4gIH0sXG4gIHJlbmRlcigpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5lcnJvciA9IGZhbHNlO1xuICAgICAgY29uc3QgeyAkc2xvdHMsICRhdHRycywgdGFnLCBjb21wb25lbnREYXRhLCByZWFsTGlzdCwgZ2V0S2V5IH0gPSB0aGlzO1xuICAgICAgY29uc3QgY29tcG9uZW50U3RydWN0dXJlID0gY29tcHV0ZUNvbXBvbmVudFN0cnVjdHVyZSh7XG4gICAgICAgICRzbG90cyxcbiAgICAgICAgdGFnLFxuICAgICAgICByZWFsTGlzdCxcbiAgICAgICAgZ2V0S2V5XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29tcG9uZW50U3RydWN0dXJlID0gY29tcG9uZW50U3RydWN0dXJlO1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGdldENvbXBvbmVudEF0dHJpYnV0ZXMoeyAkYXR0cnMsIGNvbXBvbmVudERhdGEgfSk7XG4gICAgICByZXR1cm4gY29tcG9uZW50U3RydWN0dXJlLnJlbmRlcihoLCBhdHRyaWJ1dGVzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuZXJyb3IgPSB0cnVlO1xuICAgICAgcmV0dXJuIGgoXCJwcmVcIiwgeyBzdHlsZTogeyBjb2xvcjogXCJyZWRcIiB9IH0sIGVyci5zdGFjayk7XG4gICAgfVxuICB9LFxuICBjcmVhdGVkKCkge1xuICAgIGlmICh0aGlzLmxpc3QgIT09IG51bGwgJiYgdGhpcy5tb2RlbFZhbHVlICE9PSBudWxsKSB7XG4gICAgICBjb25zb2xlJDEuZXJyb3IoXCJtb2RlbFZhbHVlIGFuZCBsaXN0IHByb3BzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUhIFBsZWFzZSBzZXQgb25lIG9yIGFub3RoZXIuXCIpO1xuICAgIH1cbiAgfSxcbiAgbW91bnRlZCgpIHtcbiAgICBpZiAodGhpcy5lcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7ICRhdHRycywgJGVsLCBjb21wb25lbnRTdHJ1Y3R1cmUgfSA9IHRoaXM7XG4gICAgY29tcG9uZW50U3RydWN0dXJlLnVwZGF0ZWQoKTtcbiAgICBjb25zdCBzb3J0YWJsZU9wdGlvbnMgPSBjcmVhdGVTb3J0YWJsZU9wdGlvbih7XG4gICAgICAkYXR0cnMsXG4gICAgICBjYWxsQmFja0J1aWxkZXI6IHtcbiAgICAgICAgbWFuYWdlQW5kRW1pdDogKGV2ZW50KSA9PiBtYW5hZ2VBbmRFbWl0LmNhbGwodGhpcywgZXZlbnQpLFxuICAgICAgICBlbWl0OiAoZXZlbnQpID0+IGVtaXQuYmluZCh0aGlzLCBldmVudCksXG4gICAgICAgIG1hbmFnZTogKGV2ZW50KSA9PiBtYW5hZ2UuY2FsbCh0aGlzLCBldmVudClcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXREb21FbGVtZW50ID0gJGVsLm5vZGVUeXBlID09PSAxID8gJGVsIDogJGVsLnBhcmVudEVsZW1lbnQ7XG4gICAgdGhpcy5fc29ydGFibGUgPSBuZXcgU29ydGFibGUodGFyZ2V0RG9tRWxlbWVudCwgc29ydGFibGVPcHRpb25zKTtcbiAgICB0aGlzLnRhcmdldERvbUVsZW1lbnQgPSB0YXJnZXREb21FbGVtZW50O1xuICAgIHRhcmdldERvbUVsZW1lbnQuX19kcmFnZ2FibGVfY29tcG9uZW50X18gPSB0aGlzO1xuICB9LFxuICB1cGRhdGVkKCkge1xuICAgIHRoaXMuY29tcG9uZW50U3RydWN0dXJlLnVwZGF0ZWQoKTtcbiAgfSxcbiAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICBpZiAodGhpcy5fc29ydGFibGUgIT09IHZvaWQgMClcbiAgICAgIHRoaXMuX3NvcnRhYmxlLmRlc3Ryb3koKTtcbiAgfSxcbiAgY29tcHV0ZWQ6IHtcbiAgICByZWFsTGlzdCgpIHtcbiAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdGhpcztcbiAgICAgIHJldHVybiBsaXN0ID8gbGlzdCA6IHRoaXMubW9kZWxWYWx1ZTtcbiAgICB9LFxuICAgIGdldEtleSgpIHtcbiAgICAgIGNvbnN0IHsgaXRlbUtleSB9ID0gdGhpcztcbiAgICAgIGlmICh0eXBlb2YgaXRlbUtleSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVtS2V5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIChlbGVtZW50KSA9PiBlbGVtZW50W2l0ZW1LZXldO1xuICAgIH1cbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICAkYXR0cnM6IHtcbiAgICAgIGhhbmRsZXIobmV3T3B0aW9uVmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBfc29ydGFibGUgfSA9IHRoaXM7XG4gICAgICAgIGlmICghX3NvcnRhYmxlKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZ2V0VmFsaWRTb3J0YWJsZUVudHJpZXMobmV3T3B0aW9uVmFsdWUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIF9zb3J0YWJsZS5vcHRpb24oa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGRlZXA6IHRydWVcbiAgICB9XG4gIH0sXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRVbmRlcmx5aW5nVm0oZG9tRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U3RydWN0dXJlLmdldFVuZGVybHlpbmdWbShkb21FbGVtZW50KSB8fCBudWxsO1xuICAgIH0sXG4gICAgZ2V0VW5kZXJseWluZ1BvdGVuY2lhbERyYWdnYWJsZUNvbXBvbmVudChodG1FbGVtZW50KSB7XG4gICAgICByZXR1cm4gaHRtRWxlbWVudC5fX2RyYWdnYWJsZV9jb21wb25lbnRfXztcbiAgICB9LFxuICAgIGVtaXRDaGFuZ2VzKGV2dCkge1xuICAgICAgbmV4dFRpY2soKCkgPT4gdGhpcy4kZW1pdChcImNoYW5nZVwiLCBldnQpKTtcbiAgICB9LFxuICAgIGFsdGVyTGlzdChvbkxpc3QpIHtcbiAgICAgIGlmICh0aGlzLmxpc3QpIHtcbiAgICAgICAgb25MaXN0KHRoaXMubGlzdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld0xpc3QgPSBbLi4udGhpcy5tb2RlbFZhbHVlXTtcbiAgICAgIG9uTGlzdChuZXdMaXN0KTtcbiAgICAgIHRoaXMuJGVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBuZXdMaXN0KTtcbiAgICB9LFxuICAgIHNwbGljZUxpc3QoKSB7XG4gICAgICBjb25zdCBzcGxpY2VMaXN0ID0gKGxpc3QpID0+IGxpc3Quc3BsaWNlKC4uLmFyZ3VtZW50cyk7XG4gICAgICB0aGlzLmFsdGVyTGlzdChzcGxpY2VMaXN0KTtcbiAgICB9LFxuICAgIHVwZGF0ZVBvc2l0aW9uKG9sZEluZGV4LCBuZXdJbmRleCkge1xuICAgICAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSAobGlzdCkgPT4gbGlzdC5zcGxpY2UobmV3SW5kZXgsIDAsIGxpc3Quc3BsaWNlKG9sZEluZGV4LCAxKVswXSk7XG4gICAgICB0aGlzLmFsdGVyTGlzdCh1cGRhdGVQb3NpdGlvbik7XG4gICAgfSxcbiAgICBnZXRSZWxhdGVkQ29udGV4dEZyb21Nb3ZlRXZlbnQoeyB0bywgcmVsYXRlZCB9KSB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmdldFVuZGVybHlpbmdQb3RlbmNpYWxEcmFnZ2FibGVDb21wb25lbnQodG8pO1xuICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIHsgY29tcG9uZW50IH07XG4gICAgICB9XG4gICAgICBjb25zdCBsaXN0ID0gY29tcG9uZW50LnJlYWxMaXN0O1xuICAgICAgY29uc3QgY29udGV4dCA9IHsgbGlzdCwgY29tcG9uZW50IH07XG4gICAgICBpZiAodG8gIT09IHJlbGF0ZWQgJiYgbGlzdCkge1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGNvbXBvbmVudC5nZXRVbmRlcmx5aW5nVm0ocmVsYXRlZCkgfHwge307XG4gICAgICAgIHJldHVybiBfX3NwcmVhZFZhbHVlcyhfX3NwcmVhZFZhbHVlcyh7fSwgZGVzdGluYXRpb24pLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH0sXG4gICAgZ2V0Vm1JbmRleEZyb21Eb21JbmRleChkb21JbmRleCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50U3RydWN0dXJlLmdldFZtSW5kZXhGcm9tRG9tSW5kZXgoZG9tSW5kZXgsIHRoaXMudGFyZ2V0RG9tRWxlbWVudCk7XG4gICAgfSxcbiAgICBvbkRyYWdTdGFydChldnQpIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IHRoaXMuZ2V0VW5kZXJseWluZ1ZtKGV2dC5pdGVtKTtcbiAgICAgIGV2dC5pdGVtLl91bmRlcmx5aW5nX3ZtXyA9IHRoaXMuY2xvbmUodGhpcy5jb250ZXh0LmVsZW1lbnQpO1xuICAgICAgZHJhZ2dpbmdFbGVtZW50ID0gZXZ0Lml0ZW07XG4gICAgfSxcbiAgICBvbkRyYWdBZGQoZXZ0KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZXZ0Lml0ZW0uX3VuZGVybHlpbmdfdm1fO1xuICAgICAgaWYgKGVsZW1lbnQgPT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZW1vdmVOb2RlKGV2dC5pdGVtKTtcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5nZXRWbUluZGV4RnJvbURvbUluZGV4KGV2dC5uZXdJbmRleCk7XG4gICAgICB0aGlzLnNwbGljZUxpc3QobmV3SW5kZXgsIDAsIGVsZW1lbnQpO1xuICAgICAgY29uc3QgYWRkZWQgPSB7IGVsZW1lbnQsIG5ld0luZGV4IH07XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VzKHsgYWRkZWQgfSk7XG4gICAgfSxcbiAgICBvbkRyYWdSZW1vdmUoZXZ0KSB7XG4gICAgICBpbnNlcnROb2RlQXQodGhpcy4kZWwsIGV2dC5pdGVtLCBldnQub2xkSW5kZXgpO1xuICAgICAgaWYgKGV2dC5wdWxsTW9kZSA9PT0gXCJjbG9uZVwiKSB7XG4gICAgICAgIHJlbW92ZU5vZGUoZXZ0LmNsb25lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBpbmRleDogb2xkSW5kZXgsIGVsZW1lbnQgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgIHRoaXMuc3BsaWNlTGlzdChvbGRJbmRleCwgMSk7XG4gICAgICBjb25zdCByZW1vdmVkID0geyBlbGVtZW50LCBvbGRJbmRleCB9O1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlcyh7IHJlbW92ZWQgfSk7XG4gICAgfSxcbiAgICBvbkRyYWdVcGRhdGUoZXZ0KSB7XG4gICAgICByZW1vdmVOb2RlKGV2dC5pdGVtKTtcbiAgICAgIGluc2VydE5vZGVBdChldnQuZnJvbSwgZXZ0Lml0ZW0sIGV2dC5vbGRJbmRleCk7XG4gICAgICBjb25zdCBvbGRJbmRleCA9IHRoaXMuY29udGV4dC5pbmRleDtcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gdGhpcy5nZXRWbUluZGV4RnJvbURvbUluZGV4KGV2dC5uZXdJbmRleCk7XG4gICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKG9sZEluZGV4LCBuZXdJbmRleCk7XG4gICAgICBjb25zdCBtb3ZlZCA9IHsgZWxlbWVudDogdGhpcy5jb250ZXh0LmVsZW1lbnQsIG9sZEluZGV4LCBuZXdJbmRleCB9O1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlcyh7IG1vdmVkIH0pO1xuICAgIH0sXG4gICAgY29tcHV0ZUZ1dHVyZUluZGV4KHJlbGF0ZWRDb250ZXh0LCBldnQpIHtcbiAgICAgIGlmICghcmVsYXRlZENvbnRleHQuZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRvbUNoaWxkcmVuID0gWy4uLmV2dC50by5jaGlsZHJlbl0uZmlsdGVyKChlbCkgPT4gZWwuc3R5bGVbXCJkaXNwbGF5XCJdICE9PSBcIm5vbmVcIik7XG4gICAgICBjb25zdCBjdXJyZW50RG9tSW5kZXggPSBkb21DaGlsZHJlbi5pbmRleE9mKGV2dC5yZWxhdGVkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHJlbGF0ZWRDb250ZXh0LmNvbXBvbmVudC5nZXRWbUluZGV4RnJvbURvbUluZGV4KGN1cnJlbnREb21JbmRleCk7XG4gICAgICBjb25zdCBkcmFnZ2VkSW5MaXN0ID0gZG9tQ2hpbGRyZW4uaW5kZXhPZihkcmFnZ2luZ0VsZW1lbnQpICE9PSAtMTtcbiAgICAgIHJldHVybiBkcmFnZ2VkSW5MaXN0IHx8ICFldnQud2lsbEluc2VydEFmdGVyID8gY3VycmVudEluZGV4IDogY3VycmVudEluZGV4ICsgMTtcbiAgICB9LFxuICAgIG9uRHJhZ01vdmUoZXZ0LCBvcmlnaW5hbEV2ZW50KSB7XG4gICAgICBjb25zdCB7IG1vdmUsIHJlYWxMaXN0IH0gPSB0aGlzO1xuICAgICAgaWYgKCFtb3ZlIHx8ICFyZWFsTGlzdCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0ZWRDb250ZXh0ID0gdGhpcy5nZXRSZWxhdGVkQ29udGV4dEZyb21Nb3ZlRXZlbnQoZXZ0KTtcbiAgICAgIGNvbnN0IGZ1dHVyZUluZGV4ID0gdGhpcy5jb21wdXRlRnV0dXJlSW5kZXgocmVsYXRlZENvbnRleHQsIGV2dCk7XG4gICAgICBjb25zdCBkcmFnZ2VkQ29udGV4dCA9IF9fc3ByZWFkUHJvcHMoX19zcHJlYWRWYWx1ZXMoe30sIHRoaXMuY29udGV4dCksIHtcbiAgICAgICAgZnV0dXJlSW5kZXhcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2VuZEV2ZW50ID0gX19zcHJlYWRQcm9wcyhfX3NwcmVhZFZhbHVlcyh7fSwgZXZ0KSwge1xuICAgICAgICByZWxhdGVkQ29udGV4dCxcbiAgICAgICAgZHJhZ2dlZENvbnRleHRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1vdmUoc2VuZEV2ZW50LCBvcmlnaW5hbEV2ZW50KTtcbiAgICB9LFxuICAgIG9uRHJhZ0VuZCgpIHtcbiAgICAgIGRyYWdnaW5nRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG59KTtcbmV4cG9ydCB7IGRyYWdnYWJsZUNvbXBvbmVudCBhcyBkZWZhdWx0IH07XG4iLCI8dGVtcGxhdGU+XG4gIDxjb21wb25lbnQgOmlzPVwidWkuYnV0dG9uR3JvdXAubmFtZVwiIGNsYXNzPVwiZnMtdGFibGUtY29sdW1ucy1maXhlZC1jb250cm9sbGVyXCI+XG4gICAgPGZzLWJ1dHRvblxuICAgICAgdi1mb3I9XCJvcHRpb24gb2Ygb3B0aW9uc1wiXG4gICAgICA6a2V5PVwib3B0aW9uLmljb25cIlxuICAgICAgOnR5cGU9XCJtb2RlbFZhbHVlID09PSBvcHRpb24udmFsdWUgPyAncHJpbWFyeScgOiAnZGVmYXVsdCdcIlxuICAgICAgOmljb249XCJvcHRpb24uaWNvblwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgQGNsaWNrPVwic3VibWl0KG9wdGlvbi52YWx1ZSlcIlxuICAgIC8+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIHJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3VzZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzVGFibGVDb2x1bW5zRml4ZWRDb250cm9sbGVyXCIsXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZToge1xuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCBcImNoYW5nZVwiXSxcbiAgc2V0dXAocHJvcHMsIGN0eCkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogXCJsZWZ0XCIsXG4gICAgICAgICAgaWNvbjogdWkuaWNvbnMubGVmdCAvLyAnZWwtaWNvbi1hcnJvdy1sZWZ0J1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICAgIGljb246IHVpLmljb25zLmNsb3NlIC8vICdlbC1pY29uLWNsb3NlJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IFwicmlnaHRcIixcbiAgICAgICAgICBpY29uOiB1aS5pY29ucy5yaWdodCAvLyAnZWwtaWNvbi1hcnJvdy1yaWdodCdcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHN1Ym1pdCh2YWx1ZTogYW55KSB7XG4gICAgICBjdHguZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICAgIGN0eC5lbWl0KFwiY2hhbmdlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHN1Ym1pdFxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlciB7XG4gIC5mcy1idXR0b24ge1xuICAgIHBhZGRpbmc6IDJweCAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICBtaW4taGVpZ2h0OiBhdXRvO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50IDppcz1cInVpLmJ1dHRvbkdyb3VwLm5hbWVcIiBjbGFzcz1cImZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlclwiPlxuICAgIDxmcy1idXR0b25cbiAgICAgIHYtZm9yPVwib3B0aW9uIG9mIG9wdGlvbnNcIlxuICAgICAgOmtleT1cIm9wdGlvbi5pY29uXCJcbiAgICAgIDp0eXBlPVwibW9kZWxWYWx1ZSA9PT0gb3B0aW9uLnZhbHVlID8gJ3ByaW1hcnknIDogJ2RlZmF1bHQnXCJcbiAgICAgIDppY29uPVwib3B0aW9uLmljb25cIlxuICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgIEBjbGljaz1cInN1Ym1pdChvcHRpb24udmFsdWUpXCJcbiAgICAvPlxuICA8L2NvbXBvbmVudD5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50LCByZWYgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi8uLi8uLi91c2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1RhYmxlQ29sdW1uc0ZpeGVkQ29udHJvbGxlclwiLFxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBlbWl0czogW1widXBkYXRlOm1vZGVsVmFsdWVcIiwgXCJjaGFuZ2VcIl0sXG4gIHNldHVwKHByb3BzLCBjdHgpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IFwibGVmdFwiLFxuICAgICAgICAgIGljb246IHVpLmljb25zLmxlZnQgLy8gJ2VsLWljb24tYXJyb3ctbGVmdCdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgICAgICBpY29uOiB1aS5pY29ucy5jbG9zZSAvLyAnZWwtaWNvbi1jbG9zZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiBcInJpZ2h0XCIsXG4gICAgICAgICAgaWNvbjogdWkuaWNvbnMucmlnaHQgLy8gJ2VsLWljb24tYXJyb3ctcmlnaHQnXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBzdWJtaXQodmFsdWU6IGFueSkge1xuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCB2YWx1ZSk7XG4gICAgICBjdHguZW1pdChcImNoYW5nZVwiLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1aSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzdWJtaXRcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy10YWJsZS1jb2x1bW5zLWZpeGVkLWNvbnRyb2xsZXIge1xuICAuZnMtYnV0dG9uIHtcbiAgICBwYWRkaW5nOiAycHggIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IDEwcHg7XG4gICAgbWluLWhlaWdodDogYXV0bztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRyYWdnYWJsZSA6bGlzdD1cImNvbHVtbnNcIiBpdGVtLWtleT1cImtleVwiIDptb3ZlPVwib25EcmFnZ2FibGVNb3ZlXCI+XG4gICAgPHRlbXBsYXRlICNpdGVtPVwieyBlbGVtZW50LCBpbmRleCB9XCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgdi1zaG93PVwib3JpZ2luYWxDb2x1bW5zTWFwW2VsZW1lbnQuX19rZXldPy5fX3Nob3cgIT09IGZhbHNlXCJcbiAgICAgICAgICA6dGl0bGU9XCJidWlsZFRleHQoZWxlbWVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY29tcG9uZW50LS1saXN0LWl0ZW1cIlxuICAgICAgICAgIGZsZXg9XCJtYWluOmp1c3RpZnkgY3Jvc3M6Y2VudGVyXCJcbiAgICAgICAgICA6aT1cImluZGV4XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjb21wb25lbnRcbiAgICAgICAgICAgIDppcz1cInVpLmNoZWNrYm94Lm5hbWVcIlxuICAgICAgICAgICAgOlt1aS5jaGVja2JveC5tb2RlbFZhbHVlXT1cImVsZW1lbnQuc2hvd1wiXG4gICAgICAgICAgICA6ZGlzYWJsZWQ9XCJvcmlnaW5hbENvbHVtbnNNYXBbZWxlbWVudC5fX2tleV0/Ll9fZGlzYWJsZWQgPT09IHRydWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJpdGVtLWxhYmVsXCJcbiAgICAgICAgICAgIDp0aXRsZT1cImJ1aWxkVGV4dChlbGVtZW50KVwiXG4gICAgICAgICAgICBAW2J1aWxkVXBkYXRlS2V5KHVpLmNoZWNrYm94Lm1vZGVsVmFsdWUpXT1cInVwZGF0ZUNoZWNrZWQoZWxlbWVudClcIlxuICAgICAgICAgICAgQGNoYW5nZT1cIm9uQ2hlY2tDaGFuZ2VkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBidWlsZFRleHQoZWxlbWVudCkgfX1cbiAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1yaWdodFwiPlxuICAgICAgICAgICAgPGZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlclxuICAgICAgICAgICAgICB2LWlmPVwiaXNSb290XCJcbiAgICAgICAgICAgICAgdi1tb2RlbD1cImVsZW1lbnQuZml4ZWRcIlxuICAgICAgICAgICAgICBmbGV4LWJveD1cIjBcIlxuICAgICAgICAgICAgICBjbGFzcz1cImQyLW1yLTEwXCJcbiAgICAgICAgICAgICAgQGNoYW5nZT1cImZpeGVkQ2hhbmdlKGluZGV4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGZsZXgtYm94PVwiMFwiIGNsYXNzPVwiY29tcG9uZW50LS1saXN0LWl0ZW0taGFuZGxlIGhhbmRsZVwiPlxuICAgICAgICAgICAgICA8ZnMtaWNvbiA6aWNvbj1cInVpLmljb25zLnNvcnRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDIwcHg7IHBhZGRpbmctbGVmdDogMTBweDsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZWVlXCI+XG4gICAgICAgICAgPGZzLWNvbHVtbnMtZmlsdGVyLW5lc3QtbGlzdFxuICAgICAgICAgICAgdi1pZj1cImVsZW1lbnQuY2hpbGRyZW5cIlxuICAgICAgICAgICAgOmNvbHVtbnM9XCJlbGVtZW50LmNoaWxkcmVuXCJcbiAgICAgICAgICAgIEBjaGVjay1jaGFuZ2VkPVwib25DaGVja0NoYW5nZWRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9kcmFnZ2FibGU+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cbi8v5LiN6KaB5YigXG4vL0B0cy1pZ25vcmVcbmltcG9ydCBkcmFnZ2FibGUgZnJvbSBcInZ1ZWRyYWdnYWJsZS1lc1wiO1xuaW1wb3J0IEZzVGFibGVDb2x1bW5zRml4ZWRDb250cm9sbGVyIGZyb20gXCIuL2ZzLXRhYmxlLWNvbHVtbnMtZml4ZWQtY29udHJvbGxlci9pbmRleC52dWVcIjtcbmltcG9ydCB7IENvbHVtbnNGaWx0ZXJDb250ZXh0LCBDb2x1bW5zRmlsdGVySXRlbSwgQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXkgfSBmcm9tIFwiLi4vLi4vLi4vZFwiO1xuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgdXNlVWkgfSBmcm9tIFwiQGZhc3QtY3J1ZC91aS1pbnRlcmZhY2VcIjtcblxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbmNvbnN0IGVtaXRzID0gZGVmaW5lRW1pdHMoW1wiY2hlY2stY2hhbmdlZFwiLCBcImZpeGVkLWNoYW5nZWRcIl0pO1xudHlwZSBOZXN0TGlzdFByb3BzID0ge1xuICBjb2x1bW5zOiBDb2x1bW5zRmlsdGVySXRlbVtdO1xuICBpc1Jvb3Q/OiBib29sZWFuO1xufTtcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKGRlZmluZVByb3BzPE5lc3RMaXN0UHJvcHM+KCksIHtcbiAgaXNSb290OiBmYWxzZVxufSk7XG5jb25zdCB7IG9yaWdpbmFsQ29sdW1ucywgY3VycmVudENvbHVtbnMsIG9yaWdpbmFsQ29sdW1uc01hcCwgdGV4dCwgYWN0aXZlIH0gPVxuICBpbmplY3Q8Q29sdW1uc0ZpbHRlckNvbnRleHQ+KENvbHVtbnNGaWx0ZXJQcm92aWRlS2V5KTtcbmZ1bmN0aW9uIGJ1aWxkVGV4dChlbGVtZW50OiBhbnkpIHtcbiAgcmV0dXJuIGVsZW1lbnQubGFiZWwgfHwgZWxlbWVudC50aXRsZSB8fCBlbGVtZW50LmtleSB8fCB0ZXh0LnZhbHVlLnVubmFtZWQ7XG59XG5cbmZ1bmN0aW9uIG9uRHJhZ2dhYmxlTW92ZShlOiBhbnkpIHtcbiAgY29uc3QgZHJhZ2VkID0gZS5kcmFnZ2VkQ29udGV4dC5lbGVtZW50O1xuICBjb25zdCB0YXJnZXQgPSBlLnJlbGF0ZWRDb250ZXh0LmVsZW1lbnQ7XG4gIGNvbnN0IHNvcnRlZDogQ29sdW1uc0ZpbHRlckl0ZW1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgY3VycmVudENvbHVtbnMudmFsdWUpIHtcbiAgICBpZiAoaXRlbS5rZXkgPT09IGRyYWdlZC5rZXkpIHtcbiAgICAgIHNvcnRlZC5wdXNoKHRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLmtleSA9PT0gdGFyZ2V0LmtleSkge1xuICAgICAgc29ydGVkLnB1c2goZHJhZ2VkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc29ydGVkLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIC8v55yLa2V555qE5o6S5YiX5piv5ZCm5q2j5bi4XG4gIGxldCBsZWZ0SW5kZXggPSAwO1xuICBsZXQgcmlnaHRJbmRleCA9IHNvcnRlZC5sZW5ndGggLSAxO1xuICBsZXQgbWluTm90SW5kZXggPSBzb3J0ZWQubGVuZ3RoIC0gMTtcbiAgbGV0IG1heE5vdEluZGV4ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gc29ydGVkW2ldO1xuICAgIGlmIChpdGVtLmZpeGVkID09PSBcImxlZnRcIikge1xuICAgICAgbGVmdEluZGV4ID0gaTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0uZml4ZWQgPT09IFwicmlnaHRcIikge1xuICAgICAgcmlnaHRJbmRleCA9IHJpZ2h0SW5kZXggPiBpID8gaSA6IHJpZ2h0SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pbk5vdEluZGV4ID0gbWluTm90SW5kZXggPiBpID8gaSA6IG1pbk5vdEluZGV4O1xuICAgICAgbWF4Tm90SW5kZXggPSBtYXhOb3RJbmRleCA8IGkgPyBpIDogbWF4Tm90SW5kZXg7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1pbk5vdEluZGV4IDwgbGVmdEluZGV4IHx8IG1heE5vdEluZGV4ID4gcmlnaHRJbmRleCkge1xuICAgIC8vdWkubWVzc2FnZS5lcnJvcihcIumdnmZpeGVk5a2X5q615LiN5b6X6LaK6L+HZml4ZWTlrZfmrrXnmoTpobrluo9cIik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBidWlsZFVwZGF0ZUtleShrZXkpIHtcbiAgcmV0dXJuIFwidXBkYXRlOlwiICsga2V5O1xufVxuXG5mdW5jdGlvbiBmaW5kRnJvbVRyZWUodHJlZTogYW55W10sIGtleTogc3RyaW5nKSB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiB0cmVlKSB7XG4gICAgaWYgKGl0ZW0ua2V5ID09PSBrZXkpIHtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZmluZEZyb21UcmVlKGl0ZW0uY2hpbGRyZW4sIGtleSk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlQ2hlY2tlZChlbGVtZW50OiBhbnkpIHtcbiAgZWxlbWVudC5zaG93ID0gIWVsZW1lbnQuc2hvdztcbiAgLy/nuqfogZTpgInkuK3lkozlj5bmtohcblxuICBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbihlbGVtZW50OiBhbnkpIHtcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikge1xuICAgICAgZWxlbWVudC5jaGlsZHJlbi5mb3JFYWNoKChlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFlLl9fc2hvdyB8fCBlLl9fZGlzYWJsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZS5zaG93ID0gZWxlbWVudC5zaG93O1xuICAgICAgICB1cGRhdGVDaGlsZHJlbihlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICB1cGRhdGVDaGlsZHJlbihlbGVtZW50KTtcblxuICBmdW5jdGlvbiB1cGRhdGVQYXJlbnQoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50Ll9fcGFyZW50KSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50Ll9fcGFyZW50O1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwYXJlbnQuc2hvdyA9IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoKGU6IGFueSkgPT4gZS5fX3Nob3cgJiYgZS5zaG93ID09PSB0cnVlKS5sZW5ndGggPiAwO1xuICAgICAgICB1cGRhdGVQYXJlbnQocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdXBkYXRlUGFyZW50KGVsZW1lbnQpO1xufVxuZnVuY3Rpb24gb25DaGVja0NoYW5nZWQoKSB7XG4gIGVtaXRzKFwiY2hlY2stY2hhbmdlZFwiKTtcbn1cbmZ1bmN0aW9uIGZpeGVkQ2hhbmdlKGluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcbiAgZW1pdHMoXCJmaXhlZC1jaGFuZ2VkXCIsIGluZGV4LCB2YWx1ZSk7XG59XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGNvbXBvbmVudFxuICAgIDppcz1cInVpLmRyYXdlci5uYW1lXCJcbiAgICBjbGFzcz1cImZzLWNvbHVtbnMtZmlsdGVyLWxheW91dC1kZWZhdWx0XCJcbiAgICA6dGl0bGU9XCJ0ZXh0LnRpdGxlXCJcbiAgICB2LWJpbmQ9XCJkcmF3ZXJCaW5kXCJcbiAgICBhcHBlbmQtdG8tYm9keVxuICA+XG4gICAgPGNvbXBvbmVudFxuICAgICAgOmlzPVwidWkuZHJhd2VyLmhhc0NvbnRlbnRXcmFwIHx8ICdkaXYnXCJcbiAgICAgIGNsYXNzPVwiZnMtZHJhd2VyLXdyYXBwZXIgZnMtdGFibGUtY29sdW1ucy1maWx0ZXJcIlxuICAgICAgOnRpdGxlPVwidGV4dC50aXRsZVwiXG4gICAgPlxuICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jYXJkLm5hbWVcIiBzaGFkb3c9XCJuZXZlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LS1saXN0XCI+XG4gICAgICAgICAgPGRpdiBrZXk9XCJfX2ZpcnN0X19cIiBjbGFzcz1cImNvbXBvbmVudC0tbGlzdC1pdGVtXCIgZmxleD1cIm1haW46anVzdGlmeSBjcm9zczpjZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIDpzcGFuPVwiMTJcIj5cbiAgICAgICAgICAgICAgPCEtLSDlhajpgIkg5Y+N6YCJIC0tPlxuICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLmNoZWNrYm94Lm5hbWVcIiA6aW5kZXRlcm1pbmF0ZT1cImlzSW5kZXRlcm1pbmF0ZVwiIHYtYmluZD1cImNoZWNrQWxsQmluZFwiPlxuICAgICAgICAgICAgICAgIHt7IHNob3dMZW5ndGggfX0gLyB7eyBhbGxMZW5ndGggfX1cbiAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3sgdGV4dC5maXhlZCB9fSAvIHt7IHRleHQub3JkZXIgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZnMtY29sdW1ucy1maWx0ZXItbmVzdC1saXN0XG4gICAgICAgICAgICA6Y29sdW1ucz1cImN1cnJlbnRDb2x1bW5zXCJcbiAgICAgICAgICAgIDppcy1yb290PVwidHJ1ZVwiXG4gICAgICAgICAgICBAY2hlY2stY2hhbmdlZD1cImFsbENoZWNrZWRVcGRhdGVcIlxuICAgICAgICAgICAgQGZpeGVkLWNoYW5nZWQ9XCJmaXhlZENoYW5nZVwiXG4gICAgICAgICAgPjwvZnMtY29sdW1ucy1maWx0ZXItbmVzdC1saXN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgICAgPHNsb3QgbmFtZT1cImJ1dHRvbnNcIj48L3Nsb3Q+XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvY29tcG9uZW50PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHNcIiBzZXR1cD5cbmltcG9ydCB7IG1lcmdlIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuLy/kuI3opoHliKBcbi8vQHRzLWlnbm9yZVxuaW1wb3J0IGRyYWdnYWJsZSBmcm9tIFwidnVlZHJhZ2dhYmxlLWVzXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi8uLi91c2VcIjtcbmltcG9ydCB7IGNvbXB1dGVkLCBpbmplY3QsIHJlZiwgd2F0Y2ggfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyBDb2x1bW5zRmlsdGVyUHJvdmlkZUtleSwgQ29sdW1uc0ZpbHRlckNvbnRleHQsIENvbHVtbnNGaWx0ZXJDb250YWluZXJQcm9wcyB9IGZyb20gXCIuLi8uLi8uLi9kL1wiO1xuaW1wb3J0IEZzQ29sdW1uc0ZpbHRlck5lc3RMaXN0IGZyb20gXCIuL2ZzLWNvbHVtbnMtZmlsdGVyLW5lc3QtbGlzdC52dWVcIjtcblxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcblxuY29uc3QgeyBvcmlnaW5hbENvbHVtbnMsIGN1cnJlbnRDb2x1bW5zLCB0ZXh0LCBhY3RpdmUgfSA9IGluamVjdDxDb2x1bW5zRmlsdGVyQ29udGV4dD4oQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXkpO1xuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczxDb2x1bW5zRmlsdGVyQ29udGFpbmVyUHJvcHM+KCk7XG5jb25zdCBkcmF3ZXJCaW5kID0gY29tcHV0ZWQoKCkgPT4ge1xuICByZXR1cm4gbWVyZ2UoXG4gICAge1xuICAgICAgW3VpLmRyYXdlci52aXNpYmxlXTogYWN0aXZlLnZhbHVlLFxuICAgICAgW1wib25VcGRhdGU6XCIgKyB1aS5kcmF3ZXIudmlzaWJsZV06IChlOiBhbnkpID0+IHtcbiAgICAgICAgYWN0aXZlLnZhbHVlID0gZTtcbiAgICAgIH0sXG4gICAgICBbdWkuZHJhd2VyLndpZHRoXTogcHJvcHMud2lkdGggfHwgXCI0MDBweFwiXG4gICAgfSxcbiAgICBwcm9wcy5kcmF3ZXJcbiAgKTtcbn0pO1xuXG5jb25zdCBjaGVja0FsbCA9IHJlZihmYWxzZSk7XG4vLyDlhajpgInlkozlj43pgInlj5HnlJ/lj5jljJbml7bop6blj5FcbmZ1bmN0aW9uIG9uQ2hlY2tBbGxDaGFuZ2UodmFsdWU6IGFueSkge1xuICBjaGVja0FsbC52YWx1ZSA9IHZhbHVlO1xuICBjdXJyZW50Q29sdW1ucy52YWx1ZSA9IGN1cnJlbnRDb2x1bW5zLnZhbHVlLm1hcCgoZTogYW55KSA9PiB7XG4gICAgaWYgKCFlLl9fc2hvdyB8fCBlLl9fZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICBlLnNob3cgPSB2YWx1ZTtcbiAgICByZXR1cm4gZTtcbiAgfSk7XG59XG5cbmNvbnN0IGNoZWNrQWxsQmluZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBbdWkuY2hlY2tib3gubW9kZWxWYWx1ZV06IGNoZWNrQWxsLnZhbHVlLFxuICAgIFtcIm9uVXBkYXRlOlwiICsgdWkuY2hlY2tib3gubW9kZWxWYWx1ZV06ICh2OiBhbnkpID0+IHtcbiAgICAgIG9uQ2hlY2tBbGxDaGFuZ2Uodik7XG4gICAgfVxuICB9O1xufSk7XG5cbmNvbnN0IHNob3dMZW5ndGggPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiBjdXJyZW50Q29sdW1ucy52YWx1ZS5maWx0ZXIoKGU6IGFueSkgPT4gZS5fX3Nob3cgJiYgZS5zaG93ID09PSB0cnVlKS5sZW5ndGg7XG59KTtcbmNvbnN0IGFsbExlbmd0aCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIGN1cnJlbnRDb2x1bW5zLnZhbHVlLmZpbHRlcigoZTogYW55KSA9PiBlLl9fc2hvdykubGVuZ3RoO1xufSk7XG5jb25zdCBpc0luZGV0ZXJtaW5hdGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiBzaG93TGVuZ3RoLnZhbHVlID4gMCAmJiBzaG93TGVuZ3RoLnZhbHVlIDwgYWxsTGVuZ3RoLnZhbHVlO1xufSk7XG5cbndhdGNoKFxuICAoKSA9PiB7XG4gICAgY3VycmVudENvbHVtbnMudmFsdWU7XG4gIH0sXG4gICgpID0+IHtcbiAgICBhbGxDaGVja2VkVXBkYXRlKCk7XG4gIH0sXG4gIHsgaW1tZWRpYXRlOiB0cnVlIH1cbik7XG5cbi8vIGZpeGVkIOWPmOWMluaXtuinpuWPkVxuZnVuY3Rpb24gZml4ZWRDaGFuZ2UoaW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSkge1xuICBpZiAodmFsdWUpIHtcbiAgICBjdXJyZW50Q29sdW1ucy52YWx1ZVtpbmRleF0uc2hvdyA9IHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09PSBcImxlZnRcIikge1xuICAgIGN1cnJlbnRDb2x1bW5zLnZhbHVlLnVuc2hpZnQoY3VycmVudENvbHVtbnMudmFsdWUuc3BsaWNlKGluZGV4LCAxKVswXSk7XG4gIH1cbiAgaWYgKHZhbHVlID09PSBcInJpZ2h0XCIpIHtcbiAgICBjdXJyZW50Q29sdW1ucy52YWx1ZS5wdXNoKGN1cnJlbnRDb2x1bW5zLnZhbHVlLnNwbGljZShpbmRleCwgMSlbMF0pO1xuICB9XG4gIGFsbENoZWNrZWRVcGRhdGUoKTtcbn1cbmZ1bmN0aW9uIGFsbENoZWNrZWRVcGRhdGUoKSB7XG4gIGNoZWNrQWxsLnZhbHVlID0gc2hvd0xlbmd0aC52YWx1ZSA9PT0gYWxsTGVuZ3RoLnZhbHVlO1xufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1idG5zXCI+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XG4gICAgICA8dGVtcGxhdGUgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGJ1dHRvbnNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgPGZzLWJ1dHRvbiB2LWlmPVwiaXRlbS5zaG93XCIgdi1iaW5kPVwiaXRlbVwiIEBjbGljaz1cIml0ZW0uX2NsaWNrKClcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICA8L2NvbXBvbmVudD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzU2VhcmNoQnV0dG9uc1wiLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuICBwcm9wczoge1xuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH1cbiAgfSxcbiAgc2V0dXAoKSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICByZXR1cm4geyB1aSB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtYnRuc1wiPlxuICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBidXR0b25zXCIgOmtleT1cImluZGV4XCI+XG4gICAgICAgIDxmcy1idXR0b24gdi1pZj1cIml0ZW0uc2hvd1wiIHYtYmluZD1cIml0ZW1cIiBAY2xpY2s9XCJpdGVtLl9jbGljaygpXCIgLz5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1NlYXJjaEJ1dHRvbnNcIixcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcbiAgcHJvcHM6IHtcbiAgICBidXR0b25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9XG4gIH0sXG4gIHNldHVwKCkge1xuICAgIGNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG4gICAgcmV0dXJuIHsgdWkgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaCBmcy1zZWFyY2gtdjJcIj5cbiAgICA8Y29tcG9uZW50IDppcz1cInVpLmNvbGxhcHNlVHJhbnNpdGlvbi5uYW1lXCI+XG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLmZvcm0ubmFtZVwiXG4gICAgICAgIHJlZj1cInNlYXJjaEZvcm1SZWZcIlxuICAgICAgICA6bW9kZWw9XCJmb3JtRGF0YVwiXG4gICAgICAgIG9uc3VibWl0PVwiZXZlbnQucHJldmVudERlZmF1bHQoKTtcIlxuICAgICAgICB2LWJpbmQ9XCJvcHRpb25zXCJcbiAgICAgICAgOnJ1bGVzPVwiY29tcHV0ZWRSdWxlc1wiXG4gICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWZvcm1cIlxuICAgICAgICBAY29tcG9zaXRpb25zdGFydD1cImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCh0cnVlKVwiXG4gICAgICAgIEBjb21wb3NpdGlvbmVuZD1cImNoYW5nZUlucHV0RXZlbnREaXNhYmxlZChmYWxzZSlcIlxuICAgICAgPlxuICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgOmlzPVwiY29udGFpbmVyPy5pcyB8fCAnZnMtc2VhcmNoLWxheW91dC1kZWZhdWx0J1wiXG4gICAgICAgICAgdi1pZj1cInNob3cgIT09IGZhbHNlXCJcbiAgICAgICAgICB2LWJpbmQ9XCJjb250YWluZXJcIlxuICAgICAgICAgIDpjb2x1bW5zPVwiY29tcHV0ZWRDb2x1bW5zXCJcbiAgICAgICAgICA6Z2V0LWNvbnRleHQtZm49XCJnZXRDb250ZXh0Rm5cIlxuICAgICAgICA+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+PSAwKSB7XG4gICAgICAgIHJldHVybiBrZXkuc3BsaXQoXCIuXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICAvLyBjb25zdCBkZWJvdW5jZVZhbGlkYXRlID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuICAgIC8vICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xuICAgIC8vICAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9LCA1MDApO1xuXG4gICAgZnVuY3Rpb24gY2VsbFJlbmRlcihpdGVtOiBhbnkpIHtcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBfb25VcGRhdGVNb2RlbFZhbHVlKCRldmVudDogYW55KSB7XG4gICAgICAgIC8vIGF3YWl0IGRlYm91bmNlVmFsaWRhdGUoKTtcbiAgICAgICAgb25WYWx1ZUNoYW5nZWQoJGV2ZW50LCBpdGVtKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX29uSW5wdXQoKSB7XG4gICAgICAgIG9uSW5wdXQoaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uS2V5dXAoaXRlbTogYW55LCBrZXk6IGFueSkge1xuICAgICAgICBpZiAoa2V5LmNvZGUgPT09IFwiRW50ZXJcIikge1xuICAgICAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSBcImVudGVyXCIpIHtcbiAgICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBkZWZhdWx0U2xvdDogYW55ID0gbnVsbDtcbiAgICAgIGlmIChwcm9wcy5zbG90c1tcInNlYXJjaF9cIiArIGtleV0pIHtcbiAgICAgICAgZGVmYXVsdFNsb3QgPSA8ZnMtc2xvdC1yZW5kZXIgc2xvdHM9e3Byb3BzLnNsb3RzW1wic2VhcmNoX1wiICsga2V5XX0gc2NvcGU9e2J1aWxkRmllbGRDb250ZXh0KGtleSl9IC8+O1xuICAgICAgfSBlbHNlIGlmIChpdGVtLnJlbmRlcikge1xuICAgICAgICBkZWZhdWx0U2xvdCA9IDxmcy1yZW5kZXIgcmVuZGVyLWZ1bmM9e2l0ZW0ucmVuZGVyfSBzY29wZT17YnVpbGRGaWVsZENvbnRleHQoa2V5KX0gLz47XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcG9uZW50ICYmIGl0ZW0uY29tcG9uZW50LnNob3cgIT09IGZhbHNlKSB7XG4gICAgICAgIGRlZmF1bHRTbG90ID0gKFxuICAgICAgICAgIDxmcy1jb21wb25lbnQtcmVuZGVyXG4gICAgICAgICAgICByZWY9eyh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudFJlbmRlclJlZnMudmFsdWVba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIG1vZGVsLXZhbHVlPXtnZXQoZm9ybURhdGEsIGtleSl9XG4gICAgICAgICAgICBvbktleXVwPXsoJGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgb25LZXl1cChpdGVtLCAkZXZlbnQpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHsuLi5pdGVtLmNvbXBvbmVudH1cbiAgICAgICAgICAgIHNjb3BlPXtidWlsZEZpZWxkQ29udGV4dChrZXkpfVxuICAgICAgICAgICAgb25VcGRhdGU6bW9kZWxWYWx1ZT17X29uVXBkYXRlTW9kZWxWYWx1ZX1cbiAgICAgICAgICAgIG9uSW5wdXQ9e19vbklucHV0fVxuICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwbGl0ZWRLZXkgPSBzcGxpdEtleShrZXkpO1xuXG4gICAgICByZXR1cm4gdWkuZm9ybUl0ZW0ucmVuZGVyKHtcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIGxhYmVsOiBpdGVtLnRpdGxlLFxuICAgICAgICAgIFt1aS5mb3JtSXRlbS5wcm9wXTogc3BsaXRlZEtleSxcbiAgICAgICAgICBwYXRoOiBrZXksXG4gICAgICAgICAgcnVsZVBhdGg6IGtleVxuICAgICAgICB9LFxuICAgICAgICBzbG90czoge1xuICAgICAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFNsb3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hGb3JtUmVmID0gcmVmKCk7XG4gICAgY29uc3QgeyB0IH0gPSB1c2VJMThuKCk7XG4gICAgY29uc3QgY29tcG9uZW50UmVuZGVyUmVmczogUmVmID0gcmVmKHt9KTtcblxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudFJlbmRlclJlZihrZXk6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudFJlbmRlclJlZnMudmFsdWVba2V5XTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZWYoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudFJlbmRlclJlZihrZXkpPy5nZXRUYXJnZXRSZWYoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb250ZXh0Rm4oKTogU2VhcmNoRXZlbnRDb250ZXh0IHtcbiAgICAgIHJldHVybiB7IGZvcm06IGZvcm1EYXRhLCB2YWxpZGF0ZWRGb3JtOiBwcm9wcy52YWxpZGF0ZWRGb3JtLCBnZXRDb21wb25lbnRSZWYsIGRvU2VhcmNoLCBkb1Jlc2V0LCBkb1ZhbGlkYXRlIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnVpbGRGaWVsZENvbnRleHQoa2V5OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiB7IC4uLmdldENvbnRleHRGbigpLCBrZXksIHZhbHVlOiBnZXQoZm9ybURhdGEsIGtleSkgfTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBkb1ZhbGlkYXRlKHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLCB0cmlnZ2VyOiBzdHJpbmcgPSBcInNlYXJjaFwiKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocHJvcHMudmFsaWRhdGUpIHtcbiAgICAgICAgICBhd2FpdCB1aS5mb3JtLnZhbGlkYXRlV3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgIGN0eC5lbWl0KFwidmFsaWRhdGUtZXJyb3JcIiwgeyAuLi5nZXRDb250ZXh0Rm4oKSwgZXJyb3I6IGUsIHRyaWdnZXIgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG9TZWFyY2goKSB7XG4gICAgICBpZiAoYXV0b1NlYXJjaCkge1xuICAgICAgICAvLyDpmLLmipbmn6Xor6Llj5bmtohcbiAgICAgICAgYXV0b1NlYXJjaC5jYW5jZWwoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xuICAgICAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAgICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICAgICAgY3R4LmVtaXQoXCJfc2VhcmNoXCIsIGdldENvbnRleHRGbigpKTtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWFyY2hcIiwgZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvUmVzZXQoKSB7XG4gICAgICAvLyB1aS5mb3JtLnJlc2V0V3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlLCB7IGZvcm0sIGluaXRpYWxGb3JtOiBjcmVhdGVJbml0aWFsRm9ybSgpIH0pO1xuICAgICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xuICAgICAgY29uc3QgZW50cmllc1JldCA9IGVudHJpZXMoZm9ybURhdGEpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzUmV0KSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IGdldChpbml0aWFsRm9ybSwgZW50cnlbMF0pO1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICB1bnNldChmb3JtRGF0YSwgZW50cnlbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldChmb3JtRGF0YSwgZW50cnlbMF0sIGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGRvVmFsaWRhdGUoKSkge1xuICAgICAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAgICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICAgICAgaWYgKHByb3BzLnJlc2V0KSB7XG4gICAgICAgICAgcHJvcHMucmVzZXQoZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOihqOWNlemHjee9ruS6i+S7tlxuICAgICAgICBjdHguZW1pdChcIl9yZXNldFwiLCBnZXRDb250ZXh0Rm4oKSk7XG4gICAgICAgIGN0eC5lbWl0KFwicmVzZXRcIiwgZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgICBpZiAocHJvcHMuc2VhcmNoQWZ0ZXJSZXNldCkge1xuICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZEJ1dHRvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBidG5zOiBhbnkgPSBbXTtcbiAgICAgIGNvbnN0IGRlZkJ0bk9wdGlvbnM6IEJ1dHRvbnNQcm9wczxTZWFyY2hFdmVudENvbnRleHQ+ID0ge1xuICAgICAgICBzZWFyY2g6IHtcbiAgICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgY2xpY2s6IChjb250ZXh0OiBTZWFyY2hFdmVudENvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmRlcjogMSxcbiAgICAgICAgICB0ZXh0OiB0KFwiZnMuc2VhcmNoLnNlYXJjaC50ZXh0XCIpIC8vICfmn6Xor6InLFxuICAgICAgICB9LFxuICAgICAgICByZXNldDoge1xuICAgICAgICAgIHNob3c6IHRydWUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICBjbGljazogKGNvbnRleHQ6IFNlYXJjaEV2ZW50Q29udGV4dCkgPT4ge1xuICAgICAgICAgICAgZG9SZXNldCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5yZXNldC50ZXh0XCIpLCAvLyAn6YeN572uJyxcbiAgICAgICAgICBvcmRlcjogMlxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbWVyZ2UoZGVmQnRuT3B0aW9ucywgcHJvcHMuYnV0dG9ucyk7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGVmQnRuT3B0aW9ucykge1xuICAgICAgICBjb25zdCBidG4gPSBkZWZCdG5PcHRpb25zW2tleV07XG4gICAgICAgIGJ0bi5fY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgYnRuLmNsaWNrKGdldENvbnRleHRGbigpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRucy5wdXNoKGJ0bik7XG4gICAgICB9XG5cbiAgICAgIGJ0bnMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYnRucztcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGluaXRBdXRvU2VhcmNoKCkge1xuICAgICAgaWYgKHByb3BzLmF1dG9TZWFyY2ggPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIOaehOW7uumYsuaKluafpeivouWHveaVsFxuICAgICAgaWYgKHByb3BzLmRlYm91bmNlICE9PSBmYWxzZSkge1xuICAgICAgICBsZXQgd2FpdCA9IHByb3BzLmRlYm91bmNlPy53YWl0IHx8IDUwMDtcbiAgICAgICAgYXV0b1NlYXJjaCA9IGRlYm91bmNlKGRvU2VhcmNoLCB3YWl0LCBwcm9wcy5kZWJvdW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5pdEF1dG9TZWFyY2goKTtcblxuICAgIGZ1bmN0aW9uIGdldEZvcm0oKSB7XG4gICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VmFsaWRhdGVkRm9ybSgpIHtcbiAgICAgIHJldHVybiBwcm9wcy52YWxpZGF0ZWRGb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuvue9rmZvcm3lgLxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRGb3JtKG5ld0Zvcm06IGFueSwgbWVyZ2UgPSB0cnVlKSB7XG4gICAgICBpZiAoIW1lcmdlKSB7XG4gICAgICAgIGVhY2goa2V5cyhmb3JtRGF0YSksIChpdGVtKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIGZvcm1EYXRhW2l0ZW1dO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRvTWVyZ2UoZm9ybURhdGEsIG5ld0Zvcm0pO1xuICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXRFdmVudERpc2FibGVkID0gcmVmKGZhbHNlKTtcblxuICAgIGNvbnN0IGRvQXV0b1NlYXJjaCA9ICgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImRvIGF1dG8gc2VhcmNoLGlucHV0RXZlbnREaXNhYmxlZDpcIiwgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlKTtcbiAgICAgIGlmIChpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUgIT09IHRydWUgJiYgYXV0b1NlYXJjaCkge1xuICAgICAgICAvLyDpmLLmipbmn6Xor6JcbiAgICAgICAgYXV0b1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbklucHV0ID0gKGl0ZW06IGFueSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IFwiaW5wdXRcIikge1xuICAgICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIOi+k+WFpeazleebkeWQrFxuICAgIGNvbnN0IGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCA9IChkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xuICAgICAgaW5wdXRFdmVudERpc2FibGVkLnZhbHVlID0gZGlzYWJsZWQ7XG4gICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICB9O1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gb25WYWx1ZUNoYW5nZWQodmFsdWU6IGFueSwgaXRlbTogU2VhcmNoSXRlbVByb3BzKSB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcbiAgICAgIHNldChmb3JtRGF0YSwga2V5LCB2YWx1ZSk7XG5cbiAgICAgIGNvbnN0IHNpbGVudCA9IHByb3BzLnZhbGlkYXRlT25DaGFuZ2VTaWxlbnQ7XG4gICAgICAvLyBpZiAocHJvcHMudmFsaWRhdGVPbkNoYW5nZSAmJiAoYXdhaXQgZG9WYWxpZGF0ZShzaWxlbnQsIFwiY2hhbmdlXCIpKSkge1xuICAgICAgLy8gICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICAgIC8vIH1cblxuICAgICAgaWYgKGl0ZW0udmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybURhdGFba2V5XTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gZ2V0Q29tcG9uZW50UmVmKGtleSk7XG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBWYWx1ZUNoYW5nZUhhbmRsZSA9XG4gICAgICAgICAgaXRlbS52YWx1ZUNoYW5nZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gaXRlbS52YWx1ZUNoYW5nZSA6IGl0ZW0udmFsdWVDaGFuZ2UuaGFuZGxlO1xuICAgICAgICBjb25zdCBzY29wZSA9IGdldENvbnRleHRGbigpO1xuICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZUNvbnRleHQ6IFZhbHVlQ2hhbmdlQ29udGV4dCA9IHtcbiAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICByb3c6IHNjb3BlLmZvcm0sXG4gICAgICAgICAgZm9ybTogc2NvcGUuZm9ybSxcbiAgICAgICAgICAuLi5zY29wZSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgY29tcG9uZW50UmVmLFxuICAgICAgICAgIGltbWVkaWF0ZTogZmFsc2UsXG4gICAgICAgICAgZ2V0Q29tcG9uZW50UmVmLFxuICAgICAgICAgIG1vZGU6IFwic2VhcmNoXCJcbiAgICAgICAgfTtcbiAgICAgICAgdmFsdWVDaGFuZ2UodmFsdWVDaGFuZ2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE8g55Sx5LqOdmFsaWRhdGVkRm9ybSDlj5HlsITlh7rljrvlkI7vvIzkvJrmm7TmlrBmb3JtRGF0YeeahOaVsOaNru+8jOaJgOS7peimgeaUvuWcqHZhbHVlQ2hhbmdl5ZCO6Z2iLOS4jeeEtuS8muatu+W+queOr1xuICAgICAgaWYgKHByb3BzLnZhbGlkYXRlT25DaGFuZ2UgJiYgKGF3YWl0IGRvVmFsaWRhdGUoc2lsZW50LCBcImNoYW5nZVwiKSkpIHtcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PSBudWxsIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IHRydWUgfHwgaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJjaGFuZ2VcIikge1xuICAgICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZFJ1bGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgaWYgKCFwcm9wcy52YWxpZGF0ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9ucy5ydWxlcztcbiAgICB9KTtcblxuICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xuICAgIHJldHVybiB7XG4gICAgICBnZXQsXG4gICAgICB1aSxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkLFxuICAgICAgZG9WYWxpZGF0ZSxcbiAgICAgIGRvU2VhcmNoLFxuICAgICAgZG9SZXNldCxcbiAgICAgIGZvcm1EYXRhLFxuICAgICAgY29tcG9uZW50UmVuZGVyUmVmcyxcbiAgICAgIGdldENvbXBvbmVudFJlbmRlclJlZixcbiAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgIGdldEZvcm0sXG4gICAgICBnZXRWYWxpZGF0ZWRGb3JtLFxuICAgICAgc2V0Rm9ybSxcbiAgICAgIHNlYXJjaEZvcm1SZWYsXG4gICAgICBvbklucHV0LFxuICAgICAgaW5wdXRFdmVudERpc2FibGVkLFxuICAgICAgY2hhbmdlSW5wdXRFdmVudERpc2FibGVkLFxuICAgICAgY29tcHV0ZWRDb2x1bW5zLFxuICAgICAgY29tcHV0ZWRCdXR0b25zLFxuICAgICAgY29tcHV0ZWRSdWxlcyxcbiAgICAgIGJ1aWxkRmllbGRDb250ZXh0LFxuICAgICAgZ2V0Q29udGV4dEZuXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXNlYXJjaCB7XG4gICYuZnMtc2VhcmNoLXYyIHtcbiAgICAvL2Rpc3BsYXk6IGZsZXg7XG4gICAgLy9mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAuZnMtc2VhcmNoLWJ1dHRvbnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG4gICAgLnNlYXJjaC1sZWZ0IHtcbiAgICB9XG5cbiAgICAuc2VhcmNoLXJpZ2h0IHtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuXG4gICAgLmFudC1mb3JtLWlubGluZSB7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgfVxuXG4gICAgLmZzLXNlYXJjaC1mb3JtIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuXG4gICAgICAuYW50LXBpY2tlcixcbiAgICAgIC5hbnQtc2VsZWN0LFxuICAgICAgLm4tZGF0ZS1waWNrZXIsXG4gICAgICAuZWwtc2VsZWN0LFxuICAgICAgLmVsLWRhdGUtZWRpdG9yIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIC5lbC1yYW5nZS1lZGl0b3IuZWwtaW5wdXRfX3dyYXBwZXIge1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuXG4gICAgICAuYW50LWJ0bi1sb2FkaW5nLWljb24ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBtYXJnaW4tbGVmdDogMnB4O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgICAgIH1cblxuICAgICAgJi5lbC1mb3JtLS1sYWJlbC10b3Age1xuICAgICAgICAuZWwtZm9ybS1pdGVtIHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuZWwtZm9ybS1pdGVtIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgICYuZWwtZm9ybS0taW5saW5lIHtcbiAgICAgICAgLmVsLWlucHV0IHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuZWwtZm9ybS1pdGVtX19jb250ZW50IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZnMtc2VhcmNoLWNvbCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAvLyBhbnRkdlxuICAgICAgLmFudC1mb3JtLWl0ZW0tZXhwbGFpbixcbiAgICAgIC5lbC1mb3JtLWl0ZW1fX2Vycm9yIHtcbiAgICAgICAgZmxvYXQ6IGxlZnQ7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgYm90dG9tOiAzcHg7XG4gICAgICAgIHJpZ2h0OiA4cHg7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB0b3A6IGF1dG87XG4gICAgICAgIGxlZnQ6IGF1dG87XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgLmVsLWZvcm0taXRlbV9fZXJyb3Ige1xuICAgICAgICBib3R0b206IDEwcHg7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICAuYW50LWZvcm0taXRlbS1leHBsYWluLFxuICAgICAgICAuZWwtZm9ybS1pdGVtX19lcnJvciB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5uLWZvcm0taXRlbS1ibGFuayB7XG4gIH1cbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gIC5mcy1zZWFyY2gge1xuICAgIC5mcy1zZWFyY2gtZm9ybSB7XG4gICAgICAuZnMtc2VhcmNoLWNvbCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICAgIGZsZXg6IDEwMCU7XG4gICAgICAgIC8vYW50ZHZcbiAgICAgICAgLmFudC1mb3JtLWl0ZW0tbGFiZWwge1xuICAgICAgICAgIHdpZHRoOiAxMjBweDtcbiAgICAgICAgICBmbGV4OiBub25lO1xuICAgICAgICB9XG4gICAgICAgIC5hbnQtZm9ybS1pdGVtLWNvbnRyb2wge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmcy1zZWFyY2ggZnMtc2VhcmNoLXYyXCI+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5jb2xsYXBzZVRyYW5zaXRpb24ubmFtZVwiPlxuICAgICAgPGNvbXBvbmVudFxuICAgICAgICA6aXM9XCJ1aS5mb3JtLm5hbWVcIlxuICAgICAgICByZWY9XCJzZWFyY2hGb3JtUmVmXCJcbiAgICAgICAgOm1vZGVsPVwiZm9ybURhdGFcIlxuICAgICAgICBvbnN1Ym1pdD1cImV2ZW50LnByZXZlbnREZWZhdWx0KCk7XCJcbiAgICAgICAgdi1iaW5kPVwib3B0aW9uc1wiXG4gICAgICAgIDpydWxlcz1cImNvbXB1dGVkUnVsZXNcIlxuICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1mb3JtXCJcbiAgICAgICAgQGNvbXBvc2l0aW9uc3RhcnQ9XCJjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQodHJ1ZSlcIlxuICAgICAgICBAY29tcG9zaXRpb25lbmQ9XCJjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQoZmFsc2UpXCJcbiAgICAgID5cbiAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgIDppcz1cImNvbnRhaW5lcj8uaXMgfHwgJ2ZzLXNlYXJjaC1sYXlvdXQtZGVmYXVsdCdcIlxuICAgICAgICAgIHYtaWY9XCJzaG93ICE9PSBmYWxzZVwiXG4gICAgICAgICAgdi1iaW5kPVwiY29udGFpbmVyXCJcbiAgICAgICAgICA6Y29sdW1ucz1cImNvbXB1dGVkQ29sdW1uc1wiXG4gICAgICAgICAgOmdldC1jb250ZXh0LWZuPVwiZ2V0Q29udGV4dEZuXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0ZW1wbGF0ZSAjc2VhcmNoLWJ1dHRvbnM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBjb21wdXRlZEJ1dHRvbnNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8ZnMtYnV0dG9uIHYtaWY9XCJpdGVtLnNob3cgIT09IGZhbHNlXCIgdi1iaW5kPVwiaXRlbVwiIEBjbGljaz1cIml0ZW0uX2NsaWNrKClcIiAvPlxuICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cblxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2xvdHNbJ3NlYXJjaC1sZWZ0J11cIiAjc2VhcmNoLWxlZnQ+XG4gICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1sZWZ0J11cIiA6c2NvcGU9XCJnZXRDb250ZXh0Rm4oKVwiIC8+XG4gICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cInNsb3RzWydzZWFyY2gtbWlkZGxlJ11cIiAjc2VhcmNoLW1pZGRsZT5cbiAgICAgICAgICAgIDxmcy1zbG90LXJlbmRlciA6c2xvdHM9XCJzbG90c1snc2VhcmNoLW1pZGRsZSddXCIgOnNjb3BlPVwiZ2V0Q29udGV4dEZuKClcIiAvPlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzbG90c1snc2VhcmNoLXJpZ2h0J11cIiAjc2VhcmNoLXJpZ2h0PlxuICAgICAgICAgICAgPGZzLXNsb3QtcmVuZGVyIDpzbG90cz1cInNsb3RzWydzZWFyY2gtcmlnaHQnXVwiIDpzY29wZT1cImdldENvbnRleHRGbigpXCIgLz5cbiAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvY29tcG9uZW50PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzeFwiPlxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIHJlYWN0aXZlLCByZWYsIFJlZiwgdW5yZWYsIHdhdGNoIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgZm9yRWFjaCwgY2xvbmVEZWVwLCBlYWNoLCBrZXlzLCB1bnNldCwgc2V0LCBzb3J0QnksIGVudHJpZXMsIGRlYm91bmNlLCBnZXQgYXMgTG9kYXNoR2V0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuLi8uLi91dGlscy91dGlsLmxvZ1wiO1xuaW1wb3J0IEZzU2VhcmNoQnV0dG9ucyBmcm9tIFwiLi9idXR0b25zLnZ1ZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBCdXR0b25zUHJvcHMsXG4gIFNlYXJjaEV2ZW50Q29udGV4dCxcbiAgU2VhcmNoSXRlbVByb3BzLFxuICBUeXBlTWFwLFxuICBWYWx1ZUNoYW5nZUNvbnRleHQsXG4gIFZhbHVlQ2hhbmdlSGFuZGxlXG59IGZyb20gXCIuLi8uLi9kXCI7XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLXVpXCI7XG5pbXBvcnQgeyB1c2VNZXJnZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLW1lcmdlXCI7XG5cbi8qKlxuICog5p+l6K+i5qGG57uE5Lu2XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNTZWFyY2hcIixcbiAgY29tcG9uZW50czogeyBGc1NlYXJjaEJ1dHRvbnMgfSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcbiAgcHJvcHM6IHtcbiAgICAvKipcbiAgICAgKiDluIPlsYDlrrnlmahcbiAgICAgKi9cbiAgICBjb250YWluZXI6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5Yid5aeL5p+l6K+i5p2h5Lu2XG4gICAgICog54K55Ye76YeN572u77yM5Lya6YeN572u5oiQ6K+l5p2h5Lu2XG4gICAgICovXG4gICAgaW5pdGlhbEZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5qCh6aqM5ZCO55qE5p+l6K+i6KGo5Y2V5pWw5o2uXG4gICAgICovXG4gICAgdmFsaWRhdGVkRm9ybToge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDooajljZXlj4LmlbBcbiAgICAgKiDmlK/mjIFlbC1mb3JtIHwgYS1mb3Jt55qE5bGe5oCnXG4gICAgICovXG4gICAgb3B0aW9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmn6Xor6LlrZfmrrXphY3nva5cbiAgICAgKi9cbiAgICBjb2x1bW5zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaMiemSrumFjee9rizlj6/ku6XmoLnmja5vcmRlcuaOkuW6j1xuICAgICAqIGB7c2VhcmNoOnsuLi5Gc0J1dHRvbn0scmVzZXQ6ey4uLkZzQnV0dG9ufX1gXG4gICAgICovXG4gICAgYnV0dG9uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDngrnlh7vph43nva7lkI7mmK/lkKbnq4vljbPop6blj5Hmn6Xor6JcbiAgICAgKi9cbiAgICBzZWFyY2hBZnRlclJlc2V0OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5byA5ZCv6Ieq5Yqo5p+l6K+iXG4gICAgICovXG4gICAgYXV0b1NlYXJjaDoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOiHquWKqOafpeivou+8jOmYsuaKluiuvue9rlxuICAgICAqIOS8oGZhbHNl5YiZ5YWz6Zet6Ieq5Yqo5p+l6K+iXG4gICAgICovXG4gICAgZGVib3VuY2U6IHtcbiAgICAgIHR5cGU6IFtCb29sZWFuLCBPYmplY3RdLFxuICAgICAgZGVmYXVsdDogdW5kZWZpbmVkXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmj5Lmp71cbiAgICAgKi9cbiAgICBzbG90czoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5pi+56S65p+l6K+i5qGGXG4gICAgICovXG4gICAgc2hvdzoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuWQr+eUqOagoemqjFxuICAgICAqL1xuICAgIHZhbGlkYXRlOiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKbku7vmhI/lgLzlj5jljJblsLHop6blj5HmoKHpqoxcbiAgICAgKi9cbiAgICB2YWxpZGF0ZU9uQ2hhbmdlOiB7XG4gICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgdHlwZTogQm9vbGVhblxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5YiX55qE5a695bqm6K6+572u77yMc3Bhbj14eFxuICAgICAqL1xuICAgIGNvbDoge30sXG5cbiAgICAvKipcbiAgICAgKiDnu5/kuIDlrZfmrrXnmoRmb3JtSXRlbeWxnuaAp1xuICAgICAqL1xuICAgIGZvcm1JdGVtOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXG4gICAgLyoqXG4gICAgICog5p+l6K+i5LqL5Lu2XG4gICAgICoqL1xuICAgIFwic2VhcmNoXCIsXG4gICAgLyoqXG4gICAgICog5p+l6K+i5LqL5Lu277yM5q2k5LqL5Lu25L6b57O757uf6LCD55SoXG4gICAgICovXG4gICAgXCJfc2VhcmNoXCIsXG4gICAgLyoqXG4gICAgICog6YeN572u5LqL5Lu277yM5L6b55So5oi35L2/55SoXG4gICAgICoqL1xuICAgIFwicmVzZXRcIixcbiAgICAvKipcbiAgICAgKiDph43nva7kuovku7bvvIzmraTkuovku7bkvpvns7vnu5/osIPnlKhcbiAgICAgKi9cbiAgICBcIl9yZXNldFwiLFxuICAgIC8qKlxuICAgICAqIOagoemqjOWksei0peS6i+S7tlxuICAgICAqL1xuICAgIFwidmFsaWRhdGUtZXJyb3JcIixcbiAgICAvKipcbiAgICAgKiDmoKHpqozlkI7nmoTooajljZXmlbDmja7lj5jljJZcbiAgICAgKi9cbiAgICBcInVwZGF0ZTp2YWxpZGF0ZWRGb3JtXCJcbiAgXSxcbiAgc2V0dXAocHJvcHM6IGFueSwgY3R4OiBhbnkpIHtcbiAgICBjb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuICAgIGNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG4gICAgY29uc3QgZG9NZXJnZSA9IG1lcmdlO1xuICAgIGNvbnN0IHsgZG9Db21wdXRlZCwgQXN5bmNDb21wdXRlVmFsdWUsIENvbXB1dGVWYWx1ZSB9ID0gdXNlQ29tcHV0ZSgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2V0dXAtcHJvcHMtZGVzdHJ1Y3R1cmVcbiAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS52YWx1ZSAhPSBudWxsICYmIChpdGVtLnZhbHVlIGluc3RhbmNlb2YgQXN5bmNDb21wdXRlVmFsdWUgfHwgaXRlbS52YWx1ZSBpbnN0YW5jZW9mIENvbXB1dGVWYWx1ZSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJzZWFyY2gudmFsdWXphY3nva7kuI3mlK/mjIFDb21wdXRlVmFsdWUvQXN5bmNDb21wdXRl57G75Z6L55qE5Yqo5oCB6K6h566XXCIpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW5pdGlhbEZvcm0oKTogYW55IHtcbiAgICAgIC8v6buY6K6k5YC8XG4gICAgICBjb25zdCBmb3JtOiBhbnkgPSB7fTtcblxuICAgICAgZm9yRWFjaChwcm9wcy5jb2x1bW5zLCAoY29sdW1uLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlZlZhbHVlID0gdW5yZWYoY29sdW1uLnZhbHVlKTtcbiAgICAgICAgaWYgKGRlZlZhbHVlICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLnNob3cgIT09IGZhbHNlICYmIGNvbHVtbi5jb21wb25lbnQ/LnNob3cgIT09IGZhbHNlKSB7XG4gICAgICAgICAgLy/pu5jorqTlgLxcbiAgICAgICAgICBmb3JtW2tleV0gPSBkZWZWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjbG9uZURlZXAobWVyZ2Uoe30sIHByb3BzLmluaXRpYWxGb3JtLCBmb3JtKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybURhdGEgPSByZWFjdGl2ZShjcmVhdGVJbml0aWFsRm9ybSgpKTtcblxuICAgIGxldCBhdXRvU2VhcmNoOiBhbnkgPSBudWxsO1xuXG4gICAgY29uc3QgY29tcHV0ZWRDb2x1bW5zOiBSZWY8VHlwZU1hcDxTZWFyY2hJdGVtUHJvcHM+PiA9IGRvQ29tcHV0ZWQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9wcy5jb2x1bW5zO1xuICAgICAgfSxcbiAgICAgIGdldENvbnRleHRGbixcbiAgICAgIG51bGwsXG4gICAgICAoY29sdW1uczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1JdGVtID0gY2xvbmVEZWVwKHByb3BzLmZvcm1JdGVtIHx8IHt9KTtcbiAgICAgICAgZm9yRWFjaChjb2x1bW5zLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIG1lcmdlKGl0ZW0sIGZvcm1JdGVtLCBpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbHVtbnMgPSBtZXJnZShmb3JtSXRlbSwgY29sdW1ucyk7XG4gICAgICAgIGlmICghcHJvcHMudmFsaWRhdGUpIHtcbiAgICAgICAgICAvL+WmguaenOWFs+mXrXZhbGlkYXRl5YiZ5Y675o6JcnVsZXNcbiAgICAgICAgICBmb3JFYWNoKGNvbHVtbnMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgaXRlbS5ydWxlcztcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtLnJ1bGU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5ZCI5bm2Y29sXG4gICAgICAgIGlmIChwcm9wcy5jb2wpIHtcbiAgICAgICAgICBmb3JFYWNoKGNvbHVtbnMsICh2KSA9PiB7XG4gICAgICAgICAgICB2LmNvbCA9IG1lcmdlKHt9LCBwcm9wcy5jb2wsIHYuY29sKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2VsbFJlbmRlclxuICAgICAgICBmb3JFYWNoKGNvbHVtbnMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgaXRlbS5fY2VsbFJlbmRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjZWxsUmVuZGVyKGl0ZW0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8v5a2X5q615o6S5bqPXG4gICAgICAgIGxldCBzb3J0QXJyOiBTZWFyY2hJdGVtUHJvcHNbXSA9IFtdO1xuICAgICAgICBmb3JFYWNoKGNvbHVtbnMsICh2LCBrZXkpID0+IHtcbiAgICAgICAgICB2Ll9rZXkgPSBrZXk7XG4gICAgICAgICAgc29ydEFyci5wdXNoKHYpO1xuICAgICAgICB9KTtcbiAgICAgICAgc29ydEFyciA9IHNvcnRCeShzb3J0QXJyLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLm9yZGVyID8/IENvbnN0YW50cy5vcmRlckRlZmF1bHQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNvcnRlZENvbHVtbnM6IHtcbiAgICAgICAgICBba2V5OiBzdHJpbmddOiBTZWFyY2hJdGVtUHJvcHM7XG4gICAgICAgIH0gPSB7fTtcblxuICAgICAgICBzb3J0QXJyLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBsZXQgX2tleSA9IGl0ZW0uX2tleTtcbiAgICAgICAgICBkZWxldGUgaXRlbS5fa2V5O1xuICAgICAgICAgIHNvcnRlZENvbHVtbnNbX2tleV0gPSBpdGVtO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNvcnRlZENvbHVtbnM7XG4gICAgICB9XG4gICAgKTtcblxuICAgIGZ1bmN0aW9uIG9uRm9ybVZhbGlkYXRlZCgpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZEZvcm0gPSBjbG9uZURlZXAoZm9ybURhdGEpO1xuICAgICAgY3R4LmVtaXQoXCJ1cGRhdGU6dmFsaWRhdGVkRm9ybVwiLCB2YWxpZGF0ZWRGb3JtKTtcbiAgICB9XG5cbiAgICB3YXRjaChcbiAgICAgICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHByb3BzLnZhbGlkYXRlZEZvcm07XG4gICAgICB9LFxuICAgICAgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybURhdGEpIHtcbiAgICAgICAgICBkZWxldGUgZm9ybURhdGFba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBtZXJnZShmb3JtRGF0YSwgdmFsdWUgfHwge30pO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGVlcDogdHJ1ZVxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBnZXQgPSAoZm9ybTogYW55LCBrZXk6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIExvZGFzaEdldChmb3JtLCBrZXkpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBzcGxpdEtleShrZXk6IHN0cmluZykge1xuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChrZXkuaW5kZXhPZihcIi5cIikgPj0gMCkge1xuICAgICAgICByZXR1cm4ga2V5LnNwbGl0KFwiLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuXG4gICAgLy8gY29uc3QgZGVib3VuY2VWYWxpZGF0ZSA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcbiAgICAvLyAgIGlmIChhd2FpdCBkb1ZhbGlkYXRlKCkpIHtcbiAgICAvLyAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgLy8gICB9XG4gICAgLy8gfSwgNTAwKTtcblxuICAgIGZ1bmN0aW9uIGNlbGxSZW5kZXIoaXRlbTogYW55KSB7XG4gICAgICBjb25zdCBrZXkgPSBpdGVtLmtleTtcblxuICAgICAgYXN5bmMgZnVuY3Rpb24gX29uVXBkYXRlTW9kZWxWYWx1ZSgkZXZlbnQ6IGFueSkge1xuICAgICAgICAvLyBhd2FpdCBkZWJvdW5jZVZhbGlkYXRlKCk7XG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkKCRldmVudCwgaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF9vbklucHV0KCkge1xuICAgICAgICBvbklucHV0KGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvbktleXVwKGl0ZW06IGFueSwga2V5OiBhbnkpIHtcbiAgICAgICAgaWYgKGtleS5jb2RlID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJlbnRlclwiKSB7XG4gICAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgZGVmYXVsdFNsb3Q6IGFueSA9IG51bGw7XG4gICAgICBpZiAocHJvcHMuc2xvdHNbXCJzZWFyY2hfXCIgKyBrZXldKSB7XG4gICAgICAgIGRlZmF1bHRTbG90ID0gPGZzLXNsb3QtcmVuZGVyIHNsb3RzPXtwcm9wcy5zbG90c1tcInNlYXJjaF9cIiArIGtleV19IHNjb3BlPXtidWlsZEZpZWxkQ29udGV4dChrZXkpfSAvPjtcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5yZW5kZXIpIHtcbiAgICAgICAgZGVmYXVsdFNsb3QgPSA8ZnMtcmVuZGVyIHJlbmRlci1mdW5jPXtpdGVtLnJlbmRlcn0gc2NvcGU9e2J1aWxkRmllbGRDb250ZXh0KGtleSl9IC8+O1xuICAgICAgfSBlbHNlIGlmIChpdGVtLmNvbXBvbmVudCAmJiBpdGVtLmNvbXBvbmVudC5zaG93ICE9PSBmYWxzZSkge1xuICAgICAgICBkZWZhdWx0U2xvdCA9IChcbiAgICAgICAgICA8ZnMtY29tcG9uZW50LXJlbmRlclxuICAgICAgICAgICAgcmVmPXsodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb21wb25lbnRSZW5kZXJSZWZzLnZhbHVlW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBtb2RlbC12YWx1ZT17Z2V0KGZvcm1EYXRhLCBrZXkpfVxuICAgICAgICAgICAgb25LZXl1cD17KCRldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgIG9uS2V5dXAoaXRlbSwgJGV2ZW50KTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB7Li4uaXRlbS5jb21wb25lbnR9XG4gICAgICAgICAgICBzY29wZT17YnVpbGRGaWVsZENvbnRleHQoa2V5KX1cbiAgICAgICAgICAgIG9uVXBkYXRlOm1vZGVsVmFsdWU9e19vblVwZGF0ZU1vZGVsVmFsdWV9XG4gICAgICAgICAgICBvbklucHV0PXtfb25JbnB1dH1cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGxpdGVkS2V5ID0gc3BsaXRLZXkoa2V5KTtcblxuICAgICAgcmV0dXJuIHVpLmZvcm1JdGVtLnJlbmRlcih7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICBsYWJlbDogaXRlbS50aXRsZSxcbiAgICAgICAgICBbdWkuZm9ybUl0ZW0ucHJvcF06IHNwbGl0ZWRLZXksXG4gICAgICAgICAgcGF0aDoga2V5LFxuICAgICAgICAgIHJ1bGVQYXRoOiBrZXlcbiAgICAgICAgfSxcbiAgICAgICAgc2xvdHM6IHtcbiAgICAgICAgICBkZWZhdWx0KCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRTbG90O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoRm9ybVJlZiA9IHJlZigpO1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlbmRlclJlZnM6IFJlZiA9IHJlZih7fSk7XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnRSZW5kZXJSZWZzLnZhbHVlW2tleV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVmKGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiBnZXRDb21wb25lbnRSZW5kZXJSZWYoa2V5KT8uZ2V0VGFyZ2V0UmVmKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29udGV4dEZuKCk6IFNlYXJjaEV2ZW50Q29udGV4dCB7XG4gICAgICByZXR1cm4geyBmb3JtOiBmb3JtRGF0YSwgdmFsaWRhdGVkRm9ybTogcHJvcHMudmFsaWRhdGVkRm9ybSwgZ2V0Q29tcG9uZW50UmVmLCBkb1NlYXJjaCwgZG9SZXNldCwgZG9WYWxpZGF0ZSB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJ1aWxkRmllbGRDb250ZXh0KGtleTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4geyAuLi5nZXRDb250ZXh0Rm4oKSwga2V5LCB2YWx1ZTogZ2V0KGZvcm1EYXRhLCBrZXkpIH07XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZG9WYWxpZGF0ZShzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSwgdHJpZ2dlcjogc3RyaW5nID0gXCJzZWFyY2hcIik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHByb3BzLnZhbGlkYXRlKSB7XG4gICAgICAgICAgYXdhaXQgdWkuZm9ybS52YWxpZGF0ZVdyYXAoc2VhcmNoRm9ybVJlZi52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICBjdHguZW1pdChcInZhbGlkYXRlLWVycm9yXCIsIHsgLi4uZ2V0Q29udGV4dEZuKCksIGVycm9yOiBlLCB0cmlnZ2VyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvU2VhcmNoKCkge1xuICAgICAgaWYgKGF1dG9TZWFyY2gpIHtcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+i5Y+W5raIXG4gICAgICAgIGF1dG9TZWFyY2guY2FuY2VsKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBkb1ZhbGlkYXRlKCkpIHtcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgICAgIGN0eC5lbWl0KFwiX3NlYXJjaFwiLCBnZXRDb250ZXh0Rm4oKSk7XG4gICAgICAgIGN0eC5lbWl0KFwic2VhcmNoXCIsIGdldENvbnRleHRGbigpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBkb1Jlc2V0KCkge1xuICAgICAgLy8gdWkuZm9ybS5yZXNldFdyYXAoc2VhcmNoRm9ybVJlZi52YWx1ZSwgeyBmb3JtLCBpbml0aWFsRm9ybTogY3JlYXRlSW5pdGlhbEZvcm0oKSB9KTtcbiAgICAgIGNvbnN0IGluaXRpYWxGb3JtID0gY3JlYXRlSW5pdGlhbEZvcm0oKTtcbiAgICAgIGNvbnN0IGVudHJpZXNSZXQgPSBlbnRyaWVzKGZvcm1EYXRhKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllc1JldCkge1xuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBnZXQoaW5pdGlhbEZvcm0sIGVudHJ5WzBdKTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgdW5zZXQoZm9ybURhdGEsIGVudHJ5WzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXQoZm9ybURhdGEsIGVudHJ5WzBdLCBpbml0aWFsVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBkb1ZhbGlkYXRlKCkpIHtcbiAgICAgICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgICAgIGlmIChwcm9wcy5yZXNldCkge1xuICAgICAgICAgIHByb3BzLnJlc2V0KGdldENvbnRleHRGbigpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyDooajljZXph43nva7kuovku7ZcbiAgICAgICAgY3R4LmVtaXQoXCJfcmVzZXRcIiwgZ2V0Q29udGV4dEZuKCkpO1xuICAgICAgICBjdHguZW1pdChcInJlc2V0XCIsIGdldENvbnRleHRGbigpKTtcbiAgICAgICAgaWYgKHByb3BzLnNlYXJjaEFmdGVyUmVzZXQpIHtcbiAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRCdXR0b25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgYnRuczogYW55ID0gW107XG4gICAgICBjb25zdCBkZWZCdG5PcHRpb25zOiBCdXR0b25zUHJvcHM8U2VhcmNoRXZlbnRDb250ZXh0PiA9IHtcbiAgICAgICAgc2VhcmNoOiB7XG4gICAgICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBcInByaW1hcnlcIixcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgIGNsaWNrOiAoY29udGV4dDogU2VhcmNoRXZlbnRDb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBkb1NlYXJjaCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgdGV4dDogdChcImZzLnNlYXJjaC5zZWFyY2gudGV4dFwiKSAvLyAn5p+l6K+iJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgY2xpY2s6IChjb250ZXh0OiBTZWFyY2hFdmVudENvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGRvUmVzZXQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRleHQ6IHQoXCJmcy5zZWFyY2gucmVzZXQudGV4dFwiKSwgLy8gJ+mHjee9ricsXG4gICAgICAgICAgb3JkZXI6IDJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG1lcmdlKGRlZkJ0bk9wdGlvbnMsIHByb3BzLmJ1dHRvbnMpO1xuICAgICAgZm9yIChsZXQga2V5IGluIGRlZkJ0bk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYnRuID0gZGVmQnRuT3B0aW9uc1trZXldO1xuICAgICAgICBidG4uX2NsaWNrID0gKCkgPT4ge1xuICAgICAgICAgIGJ0bi5jbGljayhnZXRDb250ZXh0Rm4oKSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ0bnMucHVzaChidG4pO1xuICAgICAgfVxuXG4gICAgICBidG5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGJ0bnM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBpbml0QXV0b1NlYXJjaCgpIHtcbiAgICAgIGlmIChwcm9wcy5hdXRvU2VhcmNoID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyDmnoTlu7rpmLLmipbmn6Xor6Llh73mlbBcbiAgICAgIGlmIChwcm9wcy5kZWJvdW5jZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHdhaXQgPSBwcm9wcy5kZWJvdW5jZT8ud2FpdCB8fCA1MDA7XG4gICAgICAgIGF1dG9TZWFyY2ggPSBkZWJvdW5jZShkb1NlYXJjaCwgd2FpdCwgcHJvcHMuZGVib3VuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGluaXRBdXRvU2VhcmNoKCk7XG5cbiAgICBmdW5jdGlvbiBnZXRGb3JtKCkge1xuICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFZhbGlkYXRlZEZvcm0oKSB7XG4gICAgICByZXR1cm4gcHJvcHMudmFsaWRhdGVkRm9ybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorr7nva5mb3Jt5YC8XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Rm9ybShuZXdGb3JtOiBhbnksIG1lcmdlID0gdHJ1ZSkge1xuICAgICAgaWYgKCFtZXJnZSkge1xuICAgICAgICBlYWNoKGtleXMoZm9ybURhdGEpLCAoaXRlbSkgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtRGF0YVtpdGVtXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBkb01lcmdlKGZvcm1EYXRhLCBuZXdGb3JtKTtcbiAgICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0RXZlbnREaXNhYmxlZCA9IHJlZihmYWxzZSk7XG5cbiAgICBjb25zdCBkb0F1dG9TZWFyY2ggPSAoKSA9PiB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJkbyBhdXRvIHNlYXJjaCxpbnB1dEV2ZW50RGlzYWJsZWQ6XCIsIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSk7XG4gICAgICBpZiAoaW5wdXRFdmVudERpc2FibGVkLnZhbHVlICE9PSB0cnVlICYmIGF1dG9TZWFyY2gpIHtcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+iXG4gICAgICAgIGF1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25JbnB1dCA9IChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmIChpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICAvLyDovpPlhaXms5Xnm5HlkKxcbiAgICBjb25zdCBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQgPSAoZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSA9IGRpc2FibGVkO1xuICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgfTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIG9uVmFsdWVDaGFuZ2VkKHZhbHVlOiBhbnksIGl0ZW06IFNlYXJjaEl0ZW1Qcm9wcykge1xuICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XG4gICAgICBzZXQoZm9ybURhdGEsIGtleSwgdmFsdWUpO1xuXG4gICAgICBjb25zdCBzaWxlbnQgPSBwcm9wcy52YWxpZGF0ZU9uQ2hhbmdlU2lsZW50O1xuICAgICAgLy8gaWYgKHByb3BzLnZhbGlkYXRlT25DaGFuZ2UgJiYgKGF3YWl0IGRvVmFsaWRhdGUoc2lsZW50LCBcImNoYW5nZVwiKSkpIHtcbiAgICAgIC8vICAgb25Gb3JtVmFsaWRhdGVkKCk7XG4gICAgICAvLyB9XG5cbiAgICAgIGlmIChpdGVtLnZhbHVlQ2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1EYXRhW2tleV07XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGdldENvbXBvbmVudFJlZihrZXkpO1xuICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZTogVmFsdWVDaGFuZ2VIYW5kbGUgPVxuICAgICAgICAgIGl0ZW0udmFsdWVDaGFuZ2UgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGl0ZW0udmFsdWVDaGFuZ2UgOiBpdGVtLnZhbHVlQ2hhbmdlLmhhbmRsZTtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBnZXRDb250ZXh0Rm4oKTtcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2VDb250ZXh0OiBWYWx1ZUNoYW5nZUNvbnRleHQgPSB7XG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgcm93OiBzY29wZS5mb3JtLFxuICAgICAgICAgIGZvcm06IHNjb3BlLmZvcm0sXG4gICAgICAgICAgLi4uc2NvcGUsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGNvbXBvbmVudFJlZixcbiAgICAgICAgICBpbW1lZGlhdGU6IGZhbHNlLFxuICAgICAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgICAgICBtb2RlOiBcInNlYXJjaFwiXG4gICAgICAgIH07XG4gICAgICAgIHZhbHVlQ2hhbmdlKHZhbHVlQ2hhbmdlQ29udGV4dCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPIOeUseS6jnZhbGlkYXRlZEZvcm0g5Y+R5bCE5Ye65Y675ZCO77yM5Lya5pu05pawZm9ybURhdGHnmoTmlbDmja7vvIzmiYDku6XopoHmlL7lnKh2YWx1ZUNoYW5nZeWQjumdoizkuI3nhLbkvJrmrbvlvqrnjq9cbiAgICAgIGlmIChwcm9wcy52YWxpZGF0ZU9uQ2hhbmdlICYmIChhd2FpdCBkb1ZhbGlkYXRlKHNpbGVudCwgXCJjaGFuZ2VcIikpKSB7XG4gICAgICAgIG9uRm9ybVZhbGlkYXRlZCgpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT0gbnVsbCB8fCBpdGVtLmF1dG9TZWFyY2hUcmlnZ2VyID09PSB0cnVlIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IFwiY2hhbmdlXCIpIHtcbiAgICAgICAgZG9BdXRvU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcHV0ZWRSdWxlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmICghcHJvcHMudmFsaWRhdGUpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BzLm9wdGlvbnMucnVsZXM7XG4gICAgfSk7XG5cbiAgICBvbkZvcm1WYWxpZGF0ZWQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0LFxuICAgICAgdWksXG4gICAgICBvblZhbHVlQ2hhbmdlZCxcbiAgICAgIGRvVmFsaWRhdGUsXG4gICAgICBkb1NlYXJjaCxcbiAgICAgIGRvUmVzZXQsXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGNvbXBvbmVudFJlbmRlclJlZnMsXG4gICAgICBnZXRDb21wb25lbnRSZW5kZXJSZWYsXG4gICAgICBnZXRDb21wb25lbnRSZWYsXG4gICAgICBnZXRGb3JtLFxuICAgICAgZ2V0VmFsaWRhdGVkRm9ybSxcbiAgICAgIHNldEZvcm0sXG4gICAgICBzZWFyY2hGb3JtUmVmLFxuICAgICAgb25JbnB1dCxcbiAgICAgIGlucHV0RXZlbnREaXNhYmxlZCxcbiAgICAgIGNoYW5nZUlucHV0RXZlbnREaXNhYmxlZCxcbiAgICAgIGNvbXB1dGVkQ29sdW1ucyxcbiAgICAgIGNvbXB1dGVkQnV0dG9ucyxcbiAgICAgIGNvbXB1dGVkUnVsZXMsXG4gICAgICBidWlsZEZpZWxkQ29udGV4dCxcbiAgICAgIGdldENvbnRleHRGblxuICAgIH07XG4gIH1cbn0pO1xuPC9zY3JpcHQ+XG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1zZWFyY2gge1xuICAmLmZzLXNlYXJjaC12MiB7XG4gICAgLy9kaXNwbGF5OiBmbGV4O1xuICAgIC8vZmxleC13cmFwOiBub3dyYXA7XG4gICAgLmZzLXNlYXJjaC1idXR0b25zIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgfVxuICAgIC5zZWFyY2gtbGVmdCB7XG4gICAgfVxuXG4gICAgLnNlYXJjaC1yaWdodCB7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cblxuICAgIC5hbnQtZm9ybS1pbmxpbmUge1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgIH1cblxuICAgIC5mcy1zZWFyY2gtZm9ybSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcblxuICAgICAgLmFudC1waWNrZXIsXG4gICAgICAuYW50LXNlbGVjdCxcbiAgICAgIC5uLWRhdGUtcGlja2VyLFxuICAgICAgLmVsLXNlbGVjdCxcbiAgICAgIC5lbC1kYXRlLWVkaXRvciB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuXG4gICAgICAuZWwtcmFuZ2UtZWRpdG9yLmVsLWlucHV0X193cmFwcGVyIHtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgIH1cblxuICAgICAgLmFudC1idG4tbG9hZGluZy1pY29uIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDJweDtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAycHg7XG4gICAgICB9XG5cbiAgICAgICYuZWwtZm9ybS0tbGFiZWwtdG9wIHtcbiAgICAgICAgLmVsLWZvcm0taXRlbSB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLmVsLWZvcm0taXRlbSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICAgICAgbWFyZ2luLXRvcDogNHB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICAmLmVsLWZvcm0tLWlubGluZSB7XG4gICAgICAgIC5lbC1pbnB1dCB7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLmVsLWZvcm0taXRlbV9fY29udGVudCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmZzLXNlYXJjaC1jb2wge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgLy8gYW50ZHZcbiAgICAgIC5hbnQtZm9ybS1pdGVtLWV4cGxhaW4sXG4gICAgICAuZWwtZm9ybS1pdGVtX19lcnJvciB7XG4gICAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGJvdHRvbTogM3B4O1xuICAgICAgICByaWdodDogOHB4O1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdG9wOiBhdXRvO1xuICAgICAgICBsZWZ0OiBhdXRvO1xuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC5lbC1mb3JtLWl0ZW1fX2Vycm9yIHtcbiAgICAgICAgYm90dG9tOiAxMHB4O1xuICAgICAgfVxuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgLmFudC1mb3JtLWl0ZW0tZXhwbGFpbixcbiAgICAgICAgLmVsLWZvcm0taXRlbV9fZXJyb3Ige1xuICAgICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAubi1mb3JtLWl0ZW0tYmxhbmsge1xuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA1NzVweCkge1xuICAuZnMtc2VhcmNoIHtcbiAgICAuZnMtc2VhcmNoLWZvcm0ge1xuICAgICAgLmZzLXNlYXJjaC1jb2wge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICBmbGV4OiAxMDAlO1xuICAgICAgICAvL2FudGR2XG4gICAgICAgIC5hbnQtZm9ybS1pdGVtLWxhYmVsIHtcbiAgICAgICAgICB3aWR0aDogMTIwcHg7XG4gICAgICAgICAgZmxleDogbm9uZTtcbiAgICAgICAgfVxuICAgICAgICAuYW50LWZvcm0taXRlbS1jb250cm9sIHtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50IDppcz1cInVpLmNvbGxhcHNlVHJhbnNpdGlvbi5uYW1lXCI+XG4gICAgPGRpdiB2LWlmPVwic2hvdyAhPT0gZmFsc2VcIiBjbGFzcz1cImZzLXNlYXJjaFwiIDpjbGFzcz1cInsgJ2ZzLXNlYXJjaC1tdWx0aS1saW5lJzogY29tcHV0ZWRJc011bHRpTGluZSB9XCI+XG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLmZvcm0ubmFtZVwiXG4gICAgICAgIHJlZj1cInNlYXJjaEZvcm1SZWZcIlxuICAgICAgICA6bW9kZWw9XCJmb3JtXCJcbiAgICAgICAgdi1iaW5kPVwib3B0aW9uc1wiXG4gICAgICAgIDpydWxlcz1cImNvbXB1dGVkUnVsZXNcIlxuICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1mb3JtXCJcbiAgICAgICAgQGNvbXBvc2l0aW9uc3RhcnQ9XCJjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQodHJ1ZSlcIlxuICAgICAgICBAY29tcG9zaXRpb25lbmQ9XCJjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQoZmFsc2UpXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1ib3hcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLW1haW5cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmcy1zZWFyY2gtY29sdW1uc1wiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgJ2ZzLXNlYXJjaC1jb2xsYXBzZSc6IGNvbGxhcHNlIH1cIlxuICAgICAgICAgICAgICA6c3R5bGU9XCJ7IGhlaWdodDogY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiByZWY9XCJjb2x1bW5zUm93UmVmXCI+XG4gICAgICAgICAgICAgICAgPGRpdiB2LWlmPVwic2xvdHNbJ3NlYXJjaC1sZWZ0J11cIiBjbGFzcz1cImZzLXNlYXJjaC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1sZWZ0J11cIiA6c2NvcGU9XCJzZWFyY2hFdmVudENvbnRleHRSZWZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGtleSkgaW4gY29tcHV0ZWRDb2x1bW5zXCIgOmtleT1cImtleVwiPlxuICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJjb21wdXRlZENvbE5hbWVcIiB2LWlmPVwiaXRlbS5zaG93ID09PSB0cnVlXCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sXCIgdi1iaW5kPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCIgdi1iaW5kPVwiaXRlbVwiIDpbdWkuZm9ybUl0ZW0ucHJvcF09XCJrZXlcIiA6bGFiZWw9XCJpdGVtLnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJzbG90c1snc2VhcmNoXycgKyBrZXldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaF8nICsga2V5XVwiIDpzY29wZT1cInsgLi4uc2VhcmNoRXZlbnRDb250ZXh0UmVmLCBrZXkgfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGZzLWNvbXBvbmVudC1yZW5kZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdi1pZj1cIml0ZW0uY29tcG9uZW50ICYmIGl0ZW0uY29tcG9uZW50LnNob3cgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOnJlZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UmVuZGVyUmVmc1tpdGVtLmtleV0gPSBlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDptb2RlbC12YWx1ZT1cImdldChmb3JtLCBrZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdi1iaW5kPVwiaXRlbS5jb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6c2NvcGU9XCJzZWFyY2hFdmVudENvbnRleHRSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAdXBkYXRlOm1vZGVsLXZhbHVlPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpbnB1dD1cIm9uSW5wdXQoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IHYtaWY9XCJzbG90c1snc2VhcmNoLW1pZGRsZSddXCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1taWRkbGVcIj5cbiAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1taWRkbGUnXVwiIDpzY29wZT1cInNlYXJjaEV2ZW50Q29udGV4dFJlZlwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZnMtc2VhcmNoLWJ1dHRvbnMgdi1pZj1cIiFjb21wdXRlZElzTXVsdGlMaW5lXCIgOmJ1dHRvbnM9XCJjb21wdXRlZEJ1dHRvbnNcIj48L2ZzLXNlYXJjaC1idXR0b25zPlxuICAgICAgICAgICAgICAgIDxkaXYgdi1pZj1cInNsb3RzWydzZWFyY2gtcmlnaHQnXVwiIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZnMtc2xvdC1yZW5kZXIgOnNsb3RzPVwic2xvdHNbJ3NlYXJjaC1yaWdodCddXCIgOnNjb3BlPVwic2VhcmNoRXZlbnRDb250ZXh0UmVmXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGZzLXNlYXJjaC1idXR0b25zIHYtaWY9XCJjb21wdXRlZElzTXVsdGlMaW5lXCIgOmJ1dHRvbnM9XCJjb21wdXRlZEJ1dHRvbnNcIj48L2ZzLXNlYXJjaC1idXR0b25zPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiB2LWlmPVwiY29tcHV0ZWRJc011bHRpTGluZVwiIGNsYXNzPVwiZnMtc2VhcmNoLWFjdGlvblwiPlxuICAgICAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5mb3JtSXRlbS5uYW1lXCI+XG4gICAgICAgICAgICAgIDxmcy1idXR0b24gOmljb249XCJjb2xsYXBzZSA/IHVpLmljb25zLmNhcmV0VXAgOiB1aS5pY29ucy5jYXJldERvd25cIiBAY2xpY2s9XCJ0b2dnbGVDb2xsYXBzZVwiIC8+XG4gICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2NvbXBvbmVudD5cbiAgICA8L2Rpdj5cbiAgPC9jb21wb25lbnQ+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIG9uTW91bnRlZCwgcmVhY3RpdmUsIHJlZiwgUmVmLCB1bnJlZiB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IGVhY2gsIGZvckVhY2gsIHNvcnRCeSwgZW50cmllcywgdW5zZXQsIHNldCwga2V5cywgZ2V0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgdXNlQ29tcHV0ZSB9IGZyb20gXCIuLi8uLi91c2UvdXNlLWNvbXB1dGVcIjtcbmltcG9ydCB7IHVzZUkxOG4gfSBmcm9tIFwiLi4vLi4vbG9jYWxlXCI7XG5pbXBvcnQgbG9nZ2VyIGZyb20gXCIuLi8uLi91dGlscy91dGlsLmxvZ1wiO1xuaW1wb3J0IEZzU2VhcmNoQnV0dG9ucyBmcm9tIFwiLi9idXR0b25zLnZ1ZVwiO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWwuY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBCdXR0b25zUHJvcHMsIFNlYXJjaEV2ZW50Q29udGV4dCwgU2VhcmNoSXRlbVByb3BzIH0gZnJvbSBcIi4uLy4uL2RcIjtcbmltcG9ydCB7IHVzZVVpIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtdWlcIjtcbmltcG9ydCB7IHVzZU1lcmdlIH0gZnJvbSBcIi4uLy4uL3VzZS91c2UtbWVyZ2VcIjtcblxuLyoqXG4gKiDmn6Xor6LmoYbnu4Tku7ZcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1NlYXJjaFYxXCIsXG4gIGNvbXBvbmVudHM6IHsgRnNTZWFyY2hCdXR0b25zIH0sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG4gIHByb3BzOiB7XG4gICAgLyoqXG4gICAgICog5Yid5aeL5p+l6K+i5p2h5Lu2XG4gICAgICog54K55Ye76YeN572u77yM5Lya6YeN572u5oiQ6K+l5p2h5Lu2XG4gICAgICovXG4gICAgaW5pdGlhbEZvcm06IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6KGo5Y2V5Y+C5pWwXG4gICAgICog5pSv5oyBZWwtZm9ybSB8IGEtZm9ybeeahOWxnuaAp1xuICAgICAqL1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5p+l6K+i5a2X5q616YWN572uXG4gICAgICovXG4gICAgY29sdW1uczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiB0YWJzXG4gICAgICogeyBzaG93ICwgb3B0aW9ucyxrZXksIGRlZmF1bHR9XG4gICAgICovXG4gICAgdGFiczoge1xuICAgICAgdHlwZTogT2JqZWN0XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmjInpkq7phY3nva4s5Y+v5Lul5qC55o2ub3JkZXLmjpLluo9cbiAgICAgKiB7c2VhcmNoOnsuLi5Gc0J1dHRvbn0scmVzZXQ6ey4uLkZzQnV0dG9ufX1cbiAgICAgKi9cbiAgICBidXR0b25zOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOeCueWHu+mHjee9ruWQjuaYr+WQpueri+WNs+inpuWPkeafpeivolxuICAgICAqL1xuICAgIHNlYXJjaEFmdGVyUmVzZXQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKblvIDlkK/oh6rliqjmn6Xor6JcbiAgICAgKi9cbiAgICBhdXRvU2VhcmNoOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6Ieq5Yqo5p+l6K+i77yM6Ziy5oqW6K6+572uXG4gICAgICog5LygZmFsc2XliJnlhbPpl63oh6rliqjmn6Xor6JcbiAgICAgKi9cbiAgICBkZWJvdW5jZToge1xuICAgICAgdHlwZTogW0Jvb2xlYW4sIE9iamVjdF0sXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOaPkuanvVxuICAgICAqL1xuICAgIHNsb3RzOiB7XG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDmmK/lkKbmmL7npLrmn6Xor6LmoYZcbiAgICAgKi9cbiAgICBzaG93OiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5piv5ZCm5ZCv55So5qCh6aqMXG4gICAgICovXG4gICAgdmFsaWRhdGU6IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDluIPlsYAsIHNpbmdsZS1saW5lIOWNleihjO+8jCBtdWx0aS1saW5lIOWkmuihjO+8iOaUr+aMgeWxleW8gOaUtui1t++8iVxuICAgICAqL1xuICAgIGxheW91dDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogXCJzaW5nbGUtbGluZVwiXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliJfnmoTlrr3luqborr7nva7vvIxzcGFuPXh4XG4gICAgICovXG4gICAgY29sOiB7fSxcblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuaKmOWPoFxuICAgICAqL1xuICAgIGNvbGxhcHNlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGVtaXRzOiBbXG4gICAgLyoqXG4gICAgICog5p+l6K+i5LqL5Lu2XG4gICAgICoqL1xuICAgIFwic2VhcmNoXCIsXG4gICAgLyoqXG4gICAgICog6YeN572u5LqL5Lu2XG4gICAgICoqL1xuICAgIFwicmVzZXRcIixcbiAgICBcImNvbGxhcHNlXCIsXG4gICAgXCJ1cGRhdGU6Y29sbGFwc2VcIlxuICBdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICAvLyDlvILmraVzZXR1cOmcgOimgeaUvuWcqOesrOS4gOS4qmF3YWl05LmL5YmNXG4gICAgLy8gb25Nb3VudGVkIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLlxuICAgIC8v5Li65ZWl5Lya5pyJ6L+Z5Liq6K2m5ZGKXG4gICAgb25Nb3VudGVkKCgpID0+IHtcbiAgICAgIGlmIChjb21wdXRlZElzTXVsdGlMaW5lLnZhbHVlICYmIGNvbHVtbnNSb3dSZWYudmFsdWUpIHtcbiAgICAgICAgY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA9IGNvbHVtbnNSb3dSZWYudmFsdWUuJGVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgY29uc3QgY29sdW1uc0xpc3QgPSBjb2x1bW5zUm93UmVmLnZhbHVlLiRlbC5jaGlsZHJlbjtcbiAgICAgICAgaWYgKGNvbHVtbnNMaXN0ICYmIGNvbHVtbnNMaXN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZSA9IGNvbHVtbnNMaXN0WzFdLm9mZnNldEhlaWdodCArIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCBhdXRvU2VhcmNoOiBhbnkgPSBudWxsO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxGb3JtKCkge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICByZXR1cm4gY2xvbmVEZWVwKHByb3BzLmluaXRpYWxGb3JtIHx8IHt9KTtcbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlYWN0aXZlKGNyZWF0ZUluaXRpYWxGb3JtKCkpO1xuICAgIGNvbnN0IHsgZG9Db21wdXRlZCwgQXN5bmNDb21wdXRlVmFsdWUgfSA9IHVzZUNvbXB1dGUoKTtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBlYWNoKHByb3BzLmNvbHVtbnMsIChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS52YWx1ZSAhPSBudWxsICYmIGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBBc3luY0NvbXB1dGVWYWx1ZSkge1xuICAgICAgICBsb2dnZXIud2FybihcInNlYXJjaC52YWx1ZemFjee9ruS4jeaUr+aMgUFzeW5jQ29tcHV0Zeexu+Wei+eahOWKqOaAgeiuoeeul1wiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuICAgIGNvbnN0IGRvTWVyZ2UgPSBtZXJnZTtcbiAgICBjb25zdCBjb21wdXRlZENvbHVtbnMgPSBkb0NvbXB1dGVkKFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIHByb3BzLmNvbHVtbnM7XG4gICAgICB9LFxuICAgICAgZ2V0Q29udGV4dEZuLFxuICAgICAgbnVsbCxcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgaWYgKCFwcm9wcy52YWxpZGF0ZSkge1xuICAgICAgICAgIC8v5aaC5p6c5YWz6ZetdmFsaWRhdGXliJnljrvmjolydWxlc1xuICAgICAgICAgIGZvckVhY2godmFsdWUsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgaXRlbS5ydWxlcztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyDlkIjlubZjb2xcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGlmIChwcm9wcy5jb2wpIHtcbiAgICAgICAgICBmb3JFYWNoKHZhbHVlLCAodikgPT4ge1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICB2LmNvbCA9IG1lcmdlKHt9LCBwcm9wcy5jb2wsIHYuY29sKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v5a2X5q615o6S5bqPXG4gICAgICAgIGxldCBzb3J0QXJyOiBTZWFyY2hJdGVtUHJvcHNbXSA9IFtdO1xuICAgICAgICBmb3JFYWNoKHZhbHVlLCAodiwga2V5KSA9PiB7XG4gICAgICAgICAgdi5fa2V5ID0ga2V5O1xuICAgICAgICAgIHNvcnRBcnIucHVzaCh2KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvcnRBcnIgPSBzb3J0Qnkoc29ydEFyciwgKGl0ZW0pID0+IHtcbiAgICAgICAgICByZXR1cm4gaXRlbS5vcmRlciA/PyBDb25zdGFudHMub3JkZXJEZWZhdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzb3J0ZWRDb2x1bW5zOiB7XG4gICAgICAgICAgW2tleTogc3RyaW5nXTogU2VhcmNoSXRlbVByb3BzO1xuICAgICAgICB9ID0ge307XG5cbiAgICAgICAgc29ydEFyci5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgbGV0IF9rZXkgPSBpdGVtLl9rZXk7XG4gICAgICAgICAgZGVsZXRlIGl0ZW0uX2tleTtcbiAgICAgICAgICBzb3J0ZWRDb2x1bW5zW19rZXldID0gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzb3J0ZWRDb2x1bW5zO1xuICAgICAgfVxuICAgICk7XG5cbiAgICAvL+m7mOiupOWAvFxuICAgIGZvckVhY2goY29tcHV0ZWRDb2x1bW5zLnZhbHVlLCAoY29sdW1uLCBrZXkpID0+IHtcbiAgICAgIGlmIChjb2x1bW4udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkZWZWYWx1ZSA9IHVucmVmKGNvbHVtbi52YWx1ZSk7XG4gICAgICBpZiAoZGVmVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uc2hvdyAhPT0gZmFsc2UgJiYgY29sdW1uLmNvbXBvbmVudD8uc2hvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgLy/pu5jorqTlgLxcbiAgICAgICAgZm9ybVtrZXldID0gZGVmVmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc2VhcmNoRm9ybVJlZiA9IHJlZigpO1xuICAgIGNvbnN0IHsgdCB9ID0gdXNlSTE4bigpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlbmRlclJlZnM6IFJlZiA9IHJlZih7fSk7XG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UmVuZGVyUmVmKGtleTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50UmVuZGVyUmVmcy52YWx1ZVtrZXldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudFJlZihrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgICByZXR1cm4gZ2V0Q29tcG9uZW50UmVuZGVyUmVmKGtleSk/LiRyZWZzPy50YXJnZXRSZWY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q29udGV4dEZuKCk6IFNlYXJjaEV2ZW50Q29udGV4dCB7XG4gICAgICByZXR1cm4geyBmb3JtLCB2YWxpZGF0ZWRGb3JtOiBmb3JtLCBnZXRDb21wb25lbnRSZWYsIGRvVmFsaWRhdGU6IG51bGwgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hFdmVudENvbnRleHRSZWY6IFJlZjxTZWFyY2hFdmVudENvbnRleHQ+ID0gcmVmKGdldENvbnRleHRGbigpKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGRvU2VhcmNoKCkge1xuICAgICAgaWYgKGF1dG9TZWFyY2gpIHtcbiAgICAgICAgLy8g6Ziy5oqW5p+l6K+i5Y+W5raIXG4gICAgICAgIGF1dG9TZWFyY2guY2FuY2VsKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbGlkID0gYXdhaXQgdWkuZm9ybS52YWxpZGF0ZVdyYXAoc2VhcmNoRm9ybVJlZi52YWx1ZSk7XG4gICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgY3R4LmVtaXQoXCJzZWFyY2hcIiwgc2VhcmNoRXZlbnRDb250ZXh0UmVmLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVpLm1lc3NhZ2UuZXJyb3Ioe1xuICAgICAgICAgIG1lc3NhZ2U6IHQoXCJmcy5zZWFyY2guZXJyb3IubWVzc2FnZVwiKVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRvUmVzZXQoKSB7XG4gICAgICAvLyB1aS5mb3JtLnJlc2V0V3JhcChzZWFyY2hGb3JtUmVmLnZhbHVlLCB7IGZvcm0sIGluaXRpYWxGb3JtOiBjcmVhdGVJbml0aWFsRm9ybSgpIH0pO1xuICAgICAgY29uc3QgaW5pdGlhbEZvcm0gPSBjcmVhdGVJbml0aWFsRm9ybSgpO1xuICAgICAgY29uc3QgZW50cmllc1JldCA9IGVudHJpZXMoZm9ybSk7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXNSZXQpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbFZhbHVlID0gZ2V0KGluaXRpYWxGb3JtLCBlbnRyeVswXSk7XG4gICAgICAgIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIHVuc2V0KGZvcm0sIGVudHJ5WzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXQoZm9ybSwgZW50cnlbMF0sIGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHByb3BzLnJlc2V0KSB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBwcm9wcy5yZXNldChzZWFyY2hFdmVudENvbnRleHRSZWYudmFsdWUpO1xuICAgICAgfVxuICAgICAgLy8g6KGo5Y2V6YeN572u5LqL5Lu2XG4gICAgICBjdHguZW1pdChcInJlc2V0XCIsIGdldENvbnRleHRGbigpKTtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHByb3BzLnNlYXJjaEFmdGVyUmVzZXQpIHtcbiAgICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb21wdXRlZEJ1dHRvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBidG5zOiBhbnkgPSBbXTtcbiAgICAgIGNvbnN0IGRlZkJ0bk9wdGlvbnM6IEJ1dHRvbnNQcm9wczxTZWFyY2hFdmVudENvbnRleHQ+ID0ge1xuICAgICAgICBzZWFyY2g6IHtcbiAgICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAgIHR5cGU6IFwicHJpbWFyeVwiLFxuICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICBjbGljazogKGNvbnRleHQ6IFNlYXJjaEV2ZW50Q29udGV4dCkgPT4ge1xuICAgICAgICAgICAgZG9TZWFyY2goKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9yZGVyOiAxLFxuICAgICAgICAgIHRleHQ6IHQoXCJmcy5zZWFyY2guc2VhcmNoLnRleHRcIikgLy8gJ+afpeivoicsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc2V0OiB7XG4gICAgICAgICAgc2hvdzogdHJ1ZSxcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgY2xpY2s6IChjb250ZXh0OiBTZWFyY2hFdmVudENvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGRvUmVzZXQoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRleHQ6IHQoXCJmcy5zZWFyY2gucmVzZXQudGV4dFwiKSwgLy8gJ+mHjee9ricsXG4gICAgICAgICAgb3JkZXI6IDJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgbWVyZ2UoZGVmQnRuT3B0aW9ucywgcHJvcHMuYnV0dG9ucyk7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGVmQnRuT3B0aW9ucykge1xuICAgICAgICBjb25zdCBidG4gPSBkZWZCdG5PcHRpb25zW2tleV07XG4gICAgICAgIGJ0bi5fY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgYnRuLmNsaWNrKGdldENvbnRleHRGbigpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnRucy5wdXNoKGJ0bik7XG4gICAgICB9XG5cbiAgICAgIGJ0bnMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGEub3JkZXIgLSBiLm9yZGVyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYnRucztcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGluaXRBdXRvU2VhcmNoKCkge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAocHJvcHMuYXV0b1NlYXJjaCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8g5p6E5bu66Ziy5oqW5p+l6K+i5Ye95pWwXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmIChwcm9wcy5kZWJvdW5jZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGxldCB3YWl0ID0gcHJvcHMuZGVib3VuY2U/LndhaXQgfHwgNTAwO1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgYXV0b1NlYXJjaCA9IGRlYm91bmNlKGRvU2VhcmNoLCB3YWl0LCBwcm9wcy5kZWJvdW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5pdEF1dG9TZWFyY2goKTtcblxuICAgIGZ1bmN0aW9uIGdldEZvcm0oKSB7XG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorr7nva5mb3Jt5YC8XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Rm9ybShuZXdGb3JtOiBhbnksIG1lcmdlID0gdHJ1ZSkge1xuICAgICAgaWYgKCFtZXJnZSkge1xuICAgICAgICBlYWNoKGtleXMoZm9ybSksIChpdGVtKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIGZvcm1baXRlbV07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZG9NZXJnZShmb3JtLCBuZXdGb3JtKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dEV2ZW50RGlzYWJsZWQgPSByZWYoZmFsc2UpO1xuXG4gICAgY29uc3QgZG9BdXRvU2VhcmNoID0gKCkgPT4ge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiZG8gYXV0byBzZWFyY2gsaW5wdXRFdmVudERpc2FibGVkOlwiLCBpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUpO1xuICAgICAgaWYgKGlucHV0RXZlbnREaXNhYmxlZC52YWx1ZSAhPT0gdHJ1ZSAmJiBhdXRvU2VhcmNoKSB7XG4gICAgICAgIC8vIOmYsuaKluafpeivolxuICAgICAgICBhdXRvU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uSW5wdXQgPSAoaXRlbTogYW55KSA9PiB7XG4gICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgIGRvQXV0b1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8g6L6T5YWl5rOV55uR5ZCsXG4gICAgY29uc3QgY2hhbmdlSW5wdXRFdmVudERpc2FibGVkID0gKGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgICBpbnB1dEV2ZW50RGlzYWJsZWQudmFsdWUgPSBkaXNhYmxlZDtcbiAgICAgIGRvQXV0b1NlYXJjaCgpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvblZhbHVlQ2hhbmdlZCh2YWx1ZTogYW55LCBpdGVtOiBTZWFyY2hJdGVtUHJvcHMpIHtcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5O1xuICAgICAgc2V0KGZvcm0sIGtleSwgdmFsdWUpO1xuICAgICAgaWYgKGl0ZW0udmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybVtrZXldO1xuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBnZXRDb21wb25lbnRSZWYoa2V5KTtcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2UgPSBpdGVtLnZhbHVlQ2hhbmdlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBpdGVtLnZhbHVlQ2hhbmdlIDogaXRlbS52YWx1ZUNoYW5nZS5oYW5kbGU7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICB2YWx1ZUNoYW5nZSh7IGtleSwgdmFsdWUsIGNvbXBvbmVudFJlZiwgLi4uZ2V0Q29udGV4dEZuKCksIGltbWlkaWF0ZTogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PSBudWxsIHx8IGl0ZW0uYXV0b1NlYXJjaFRyaWdnZXIgPT09IHRydWUgfHwgaXRlbS5hdXRvU2VhcmNoVHJpZ2dlciA9PT0gXCJjaGFuZ2VcIikge1xuICAgICAgICBkb0F1dG9TZWFyY2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wdXRlZFJ1bGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBpZiAoIXByb3BzLnZhbGlkYXRlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHByb3BzLm9wdGlvbnMucnVsZXM7XG4gICAgfSk7XG5cbiAgICAvLy0tLS0t5aSa6KGM5qih5byP5oqY5Y+gXG5cbiAgICBjb25zdCBjb2x1bW5zUm93UmVmID0gcmVmKCk7XG4gICAgY29uc3QgY29sdW1uc0JveEhlaWdodFJlZiA9IHJlZigwKTtcbiAgICBjb25zdCBjb2x1bW5zTGluZUhlaWdodFJlZiA9IHJlZigwKTtcblxuICAgIGNvbnN0IHRvZ2dsZUNvbGxhcHNlID0gKCkgPT4ge1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBjdHguZW1pdChcInVwZGF0ZTpjb2xsYXBzZVwiLCAhcHJvcHMuY29sbGFwc2UpO1xuICAgICAgLy9AdHMtaWdub3JlXG4gICAgICBjdHguZW1pdChcImNvbGxhcHNlXCIsICFwcm9wcy5jb2xsYXBzZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbXB1dGVkQ29sTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgaWYgKHByb3BzLmxheW91dCA9PT0gXCJtdWx0aS1saW5lXCIpIHtcbiAgICAgICAgcmV0dXJuIHVpLmNvbC5uYW1lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFwiZGl2XCI7XG4gICAgfSk7XG4gICAgY29uc3QgY29tcHV0ZWRJc011bHRpTGluZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHByb3BzLmxheW91dCA9PT0gXCJtdWx0aS1saW5lXCI7XG4gICAgICAvL+S4jeimgei/meS4qu+8jOS8muatu+W+queOr++8jCAmJiBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlID4gY29sdW1uc0xpbmVIZWlnaHRSZWYudmFsdWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZENvbHVtbkJveEhlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmICghY29tcHV0ZWRJc011bHRpTGluZS52YWx1ZSkge1xuICAgICAgICByZXR1cm4gXCJhdXRvXCI7XG4gICAgICB9XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIGlmIChwcm9wcy5jb2xsYXBzZSkge1xuICAgICAgICByZXR1cm4gY29sdW1uc0xpbmVIZWlnaHRSZWYudmFsdWUgPyBjb2x1bW5zTGluZUhlaWdodFJlZi52YWx1ZSArIFwicHhcIiA6IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA/IGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgKyBcInB4XCIgOiBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdldDogKGZvcm06IGFueSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldChmb3JtLCBrZXkpO1xuICAgICAgfSxcbiAgICAgIHVpLFxuICAgICAgb25WYWx1ZUNoYW5nZWQsXG4gICAgICBkb1NlYXJjaCxcbiAgICAgIGRvUmVzZXQsXG4gICAgICBmb3JtLFxuICAgICAgY29tcG9uZW50UmVuZGVyUmVmcyxcbiAgICAgIGdldENvbXBvbmVudFJlbmRlclJlZixcbiAgICAgIGdldENvbXBvbmVudFJlZixcbiAgICAgIGdldEZvcm0sXG4gICAgICBzZXRGb3JtLFxuICAgICAgc2VhcmNoRm9ybVJlZixcbiAgICAgIG9uSW5wdXQsXG4gICAgICBpbnB1dEV2ZW50RGlzYWJsZWQsXG4gICAgICBjaGFuZ2VJbnB1dEV2ZW50RGlzYWJsZWQsXG4gICAgICBjb21wdXRlZENvbHVtbnMsXG4gICAgICBjb21wdXRlZEJ1dHRvbnMsXG4gICAgICBjb21wdXRlZFJ1bGVzLFxuICAgICAgY29sdW1uc1Jvd1JlZixcbiAgICAgIGNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0LFxuICAgICAgY29tcHV0ZWRDb2xOYW1lLFxuICAgICAgY29tcHV0ZWRJc011bHRpTGluZSxcbiAgICAgIHRvZ2dsZUNvbGxhcHNlLFxuICAgICAgc2VhcmNoRXZlbnRDb250ZXh0UmVmXG4gICAgfTtcbiAgfVxufSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXNlYXJjaCB7XG4gIC8vZGlzcGxheTogZmxleDtcbiAgLy9mbGV4LXdyYXA6IG5vd3JhcDtcbiAgLnNlYXJjaC1sZWZ0IHtcbiAgfVxuICAuc2VhcmNoLXJpZ2h0IHtcbiAgICBmbGV4OiAxO1xuICB9XG4gIC5hbnQtZm9ybS1pbmxpbmUge1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgfVxuICAuZnMtc2VhcmNoLWZvcm0ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgLy8mID4gKiB7XG4gICAgLy8gIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICAvLyAgbWFyZ2luLXRvcDogNHB4O1xuICAgIC8vICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgLy99XG5cbiAgICAuZnMtc2VhcmNoLWJveCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgLmZzLXNlYXJjaC1tYWluIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICB9XG4gICAgLmZzLXNlYXJjaC1jb2wge1xuICAgICAgJiA+ICoge1xuICAgICAgICBtYXJnaW46IDBweCA1cHg7XG4gICAgICB9XG4gICAgICBtYXJnaW46IDFweCAwO1xuICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIC8vIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5lbC1mb3JtLWl0ZW0ge1xuICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgICAgbWFyZ2luLXRvcDogNHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuXG4gICAgLmVsLWZvcm0tLWlubGluZSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG5cbiAgICAuZWwtZm9ybS1pdGVtX19jb250ZW50IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cbiAgfVxuXG4gIC5mcy1zZWFyY2gtYnRucyB7XG4gICAgLmZzLWJ1dHRvbiB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgICB9XG4gIH1cblxuICAmLmZzLXNlYXJjaC1tdWx0aS1saW5lIHtcbiAgICAuZnMtc2VhcmNoLWJveCB7XG4gICAgICAuZnMtc2VhcmNoLW1haW4ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAuZnMtc2VhcmNoLWNvbHVtbnMge1xuICAgICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgICBvdmVyZmxvdy15OiBoaWRkZW47XG4gICAgICAgICAgLy8gdHJhbnNpdGlvbjogYWxsIDAuM3MgbGluZWFyO1xuICAgICAgICAgIC8vIHdpbGwtY2hhbmdlOiBoZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgLmZzLXNlYXJjaC1idG5zIHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgbWFyZ2luLXRvcDogNHB4O1xuICAgICAgICAgIC5lbC1mb3JtLWl0ZW1fX2NvbnRlbnQge1xuICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLm4tZm9ybS1pdGVtLWJsYW5rIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLmZzLXNlYXJjaC1hY3Rpb24ge1xuICAgICAgLmFudC1mb3JtLWl0ZW0ge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDJweDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLmZzLXNlYXJjaCB7XG4gIC5uLWZvcm0taXRlbS1ibGFuayB7XG4gIH1cbn1cbjwvc3R5bGU+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+XG4uZnMtc2VhcmNoIHtcbiAgLy9kaXNwbGF5OiBmbGV4O1xuICAvL2ZsZXgtd3JhcDogbm93cmFwO1xuICAuc2VhcmNoLWxlZnQge1xuICB9XG4gIC5zZWFyY2gtcmlnaHQge1xuICAgIGZsZXg6IDE7XG4gIH1cbiAgLmFudC1mb3JtLWlubGluZSB7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICB9XG4gIC5mcy1zZWFyY2gtZm9ybSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAvLyYgPiAqIHtcbiAgICAvLyAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgIC8vICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgLy8gIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAvL31cblxuICAgIC5mcy1zZWFyY2gtYm94IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAuZnMtc2VhcmNoLW1haW4ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgIH1cbiAgICAuZnMtc2VhcmNoLWNvbCB7XG4gICAgICAmID4gKiB7XG4gICAgICAgIG1hcmdpbjogMHB4IDVweDtcbiAgICAgIH1cbiAgICAgIG1hcmdpbjogMXB4IDA7XG4gICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgLy8gbWFyZ2luLWxlZnQ6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmVsLWZvcm0taXRlbSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiA0cHg7XG4gICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG5cbiAgICAuZWwtZm9ybS0taW5saW5lIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cblxuICAgIC5lbC1mb3JtLWl0ZW1fX2NvbnRlbnQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICB9XG5cbiAgLmZzLXNlYXJjaC1idG5zIHtcbiAgICAuZnMtYnV0dG9uIHtcbiAgICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICAgIH1cbiAgfVxuXG4gICYuZnMtc2VhcmNoLW11bHRpLWxpbmUge1xuICAgIC5mcy1zZWFyY2gtYm94IHtcbiAgICAgIC5mcy1zZWFyY2gtbWFpbiB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIC5mcy1zZWFyY2gtY29sdW1ucyB7XG4gICAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAgIG92ZXJmbG93LXk6IGhpZGRlbjtcbiAgICAgICAgICAvLyB0cmFuc2l0aW9uOiBhbGwgMC4zcyBsaW5lYXI7XG4gICAgICAgICAgLy8gd2lsbC1jaGFuZ2U6IGhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICAuZnMtc2VhcmNoLWJ0bnMge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICAgICAgLmVsLWZvcm0taXRlbV9fY29udGVudCB7XG4gICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAubi1mb3JtLWl0ZW0tYmxhbmsge1xuICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAuZnMtc2VhcmNoLWFjdGlvbiB7XG4gICAgICAuYW50LWZvcm0taXRlbSB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4uZnMtc2VhcmNoIHtcbiAgLm4tZm9ybS1pdGVtLWJsYW5rIHtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1sYXlvdXQtZGVmYXVsdFwiIDpjbGFzcz1cInsgJ2ZzLXNlYXJjaC1tdWx0aS1saW5lJzogY29tcHV0ZWRJc011bHRpTGluZSB9XCI+XG4gICAgPGRpdiBjbGFzcz1cImZzLXNlYXJjaC1ib3hcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmcy1zZWFyY2gtbWFpblwiXG4gICAgICAgIDpjbGFzcz1cInsgJ2ZzLXNlYXJjaC1jb2xsYXBzZSc6IGNvbGxhcHNlIH1cIlxuICAgICAgICA6c3R5bGU9XCJ7IG1heEhlaWdodDogY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQgfVwiXG4gICAgICA+XG4gICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkucm93Lm5hbWVcIiByZWY9XCJjb2x1bW5zUm93UmVmXCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sdW1uc1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtc2xvdFwiPlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1sZWZ0XCI+PC9zbG90PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8IS0tIOafpeivouWtl+autXJlbmRlcu+8jOmcgOimgeWumuS5iXByb3BzLmNvbHVtbnMgLS0+XG4gICAgICAgICAgPHRlbXBsYXRlIHYtZm9yPVwiKGl0ZW0sIGtleSkgb2YgY29sdW1uc1wiIDprZXk9XCJrZXlcIj5cbiAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuY29sLm5hbWVcIiB2LWlmPVwiaXRlbS5zaG93XCIgY2xhc3M9XCJmcy1zZWFyY2gtY29sXCIgdi1iaW5kPVwibWVyZ2VDb2woaXRlbS5jb2wpXCI+XG4gICAgICAgICAgICAgIDxmcy1yZW5kZXIgOnJlbmRlci1mdW5jPVwiaXRlbS5fY2VsbFJlbmRlclwiIDpzY29wZT1cImdldENvbnRleHRGbigpXCIgLz5cbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmcy1zZWFyY2gtY29sIGZzLXNlYXJjaC1zbG90XCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLW1pZGRsZVwiPjwvc2xvdD5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGNvbXBvbmVudFxuICAgICAgICAgICAgOmlzPVwidWkuY29sLm5hbWVcIlxuICAgICAgICAgICAgdi1pZj1cIiFjb21wdXRlZElzTXVsdGlMaW5lXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtYnV0dG9ucy1ncm91cFwiXG4gICAgICAgICAgICB2LWJpbmQ9XCJtZXJnZUNvbChhY3Rpb24/LmNvbClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkuZm9ybUl0ZW0ubmFtZVwiIDpbdWkuZm9ybUl0ZW0ubGFiZWxdPVwiYWN0aW9uPy5sYWJlbFwiPlxuICAgICAgICAgICAgICA8IS0tIOafpeivouaMiemSruaPkuanvS0tPlxuICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwic2VhcmNoLWJ1dHRvbnNcIiB2LWJpbmQ9XCJnZXRDb250ZXh0Rm4oKVwiPjwvc2xvdD5cbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtc2VhcmNoLWNvbCBmcy1zZWFyY2gtc2xvdFwiPlxuICAgICAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1yaWdodFwiIHYtYmluZD1cImdldENvbnRleHRGbigpXCI+PC9zbG90PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9jb21wb25lbnQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgdi1pZj1cImNvbXB1dGVkSXNNdWx0aUxpbmVcIiBjbGFzcz1cImZzLXNlYXJjaC1idXR0b25zLWdyb3VwIGZzLXNlYXJjaC1tdWx0aS1saW5lLWJ1dHRvbnNcIj5cbiAgICAgICAgPCEtLSDlpJrooYzmqKHlvI/ml7bnmoTmn6Xor6LmjInpkq4tLT5cbiAgICAgICAgPHNsb3QgbmFtZT1cInNlYXJjaC1idXR0b25zXCI+PC9zbG90PlxuICAgICAgICA8ZnMtYnV0dG9uXG4gICAgICAgICAgdi1pZj1cImNvbGxhcHNlQnV0dG9uPy5zaG93ICE9PSBmYWxzZVwiXG4gICAgICAgICAgOmljb249XCJjb2xsYXBzZSA/IHVpLmljb25zLmNhcmV0RG93biA6IHVpLmljb25zLmNhcmV0VXBcIlxuICAgICAgICAgIDp0ZXh0PVwiXG4gICAgICAgICAgICBjb2xsYXBzZVxuICAgICAgICAgICAgICA/IHQoJ2ZzLnNlYXJjaC5jb250YWluZXIuY29sbGFwc2VCdXR0b24udGV4dC5leHBhbmQnKVxuICAgICAgICAgICAgICA6IHQoJ2ZzLnNlYXJjaC5jb250YWluZXIuY29sbGFwc2VCdXR0b24udGV4dC5jb2xsYXBzZScpXG4gICAgICAgICAgXCJcbiAgICAgICAgICB2LWJpbmQ9XCJjb2xsYXBzZUJ1dHRvblwiXG4gICAgICAgICAgQGNsaWNrPVwidG9nZ2xlQ29sbGFwc2VcIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbmltcG9ydCB7IGNvbXB1dGVkLCBkZWZpbmVDb21wb25lbnQsIG9uTW91bnRlZCwgcmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyB1c2VJMThuIH0gZnJvbSBcIi4uLy4uL2xvY2FsZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIkZzU2VhcmNoTGF5b3V0RGVmYXVsdFwiLFxuICBwcm9wczoge1xuICAgIC8qKlxuICAgICAqIOaYr+WQpuaUtue8qVxuICAgICAqL1xuICAgIGNvbGxhcHNlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5bGV5byA5oyJ6ZKuXG4gICAgICovXG4gICAgY29sbGFwc2VCdXR0b246IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG5cbiAgICBhY3Rpb246IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog5biD5bGA5qih5byPXG4gICAgICovXG4gICAgbGF5b3V0OiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcInNpbmdsZS1saW5lXCJcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOafpeivouWtl+auteWIl+ihqO+8jOWPr+S7peeyvue7huWMluiHquWumuS5ieafpeivouWtl+auteW4g+WxgFxuICAgICAqL1xuICAgIGNvbHVtbnM6IHtcbiAgICAgIHR5cGU6IE9iamVjdFxuICAgIH0sXG4gICAgLyoqXG4gICAgICog6buY6K6k55qEY29s6YWN572uXG4gICAgICovXG4gICAgY29sOiB7XG4gICAgICB0eXBlOiBPYmplY3RcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog6I635Y+W5p+l6K+i5LiK5LiL5paHXG4gICAgICovXG4gICAgZ2V0Q29udGV4dEZuOiB7XG4gICAgICB0eXBlOiBGdW5jdGlvblxuICAgIH1cbiAgfSxcbiAgZW1pdHM6IFtcInVwZGF0ZTpjb2xsYXBzZVwiLCBcImNvbGxhcHNlXCJdLFxuICBzZXR1cChwcm9wcywgY3R4KSB7XG4gICAgY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbiAgICBjb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcbiAgICBjb25zdCBjb2x1bW5zUm93UmVmID0gcmVmKCk7XG4gICAgY29uc3QgY29tcHV0ZWRJc011bHRpTGluZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHJldHVybiBwcm9wcy5sYXlvdXQgPT09IFwibXVsdGktbGluZVwiO1xuICAgICAgLy/kuI3opoHov5nkuKrvvIzkvJrmrbvlvqrnjq/vvIwgJiYgY29sdW1uc0JveEhlaWdodFJlZi52YWx1ZSA+IGNvbHVtbnNMaW5lSGVpZ2h0UmVmLnZhbHVlO1xuICAgIH0pO1xuICAgIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgICBpZiAoY29tcHV0ZWRJc011bHRpTGluZS52YWx1ZSAmJiBjb2x1bW5zUm93UmVmLnZhbHVlKSB7XG4gICAgICAgIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPSBjb2x1bW5zUm93UmVmLnZhbHVlLiRlbC5vZmZzZXRIZWlnaHQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21wdXRlZENvbHVtbkJveEhlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmICghY29tcHV0ZWRJc011bHRpTGluZS52YWx1ZSB8fCAhcHJvcHMuY29sbGFwc2UpIHtcbiAgICAgICAgcmV0dXJuIFwiYXV0b1wiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbHVtbnNCb3hIZWlnaHRSZWYudmFsdWUgPyBjb2x1bW5zQm94SGVpZ2h0UmVmLnZhbHVlICsgXCJweFwiIDogXCJcIjtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbHVtbnNCb3hIZWlnaHRSZWYgPSByZWYoMCk7XG5cbiAgICBjb25zdCB0b2dnbGVDb2xsYXBzZSA9ICgpID0+IHtcbiAgICAgIGN0eC5lbWl0KFwidXBkYXRlOmNvbGxhcHNlXCIsICFwcm9wcy5jb2xsYXBzZSk7XG4gICAgICBjdHguZW1pdChcImNvbGxhcHNlXCIsICFwcm9wcy5jb2xsYXBzZSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29sKGNvbDogYW55KSB7XG4gICAgICByZXR1cm4gbWVyZ2Uoe30sIHByb3BzLmNvbCwgY29sKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdWksXG4gICAgICBjb2x1bW5zUm93UmVmLFxuICAgICAgY29tcHV0ZWRDb2x1bW5Cb3hIZWlnaHQsXG4gICAgICBjb21wdXRlZElzTXVsdGlMaW5lLFxuICAgICAgdG9nZ2xlQ29sbGFwc2UsXG4gICAgICBtZXJnZUNvbCxcbiAgICAgIHRcbiAgICB9O1xuICB9XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtc2VhcmNoLWxheW91dC1kZWZhdWx0IHtcbiAgd2lkdGg6IDEwMCU7XG5cbiAgLmZzLXNlYXJjaC1ib3gge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgICAuZnMtc2VhcmNoLW1haW4ge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgaGVpZ2h0OiBhdXRvO1xuXG4gICAgICAuYW50LWZvcm0taXRlbS1jb250cm9sIHtcbiAgICAgICAgd2lkdGg6IDUwJTtcbiAgICAgIH1cblxuICAgICAgLmZzLXNlYXJjaC1jb2x1bW5zIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICBwYWRkaW5nOiA0cHggMCA0cHggMDtcblxuICAgICAgICAuZnMtc2VhcmNoLWNvbCB7XG4gICAgICAgICAgbWluLXdpZHRoOiAxODBweDtcbiAgICAgICAgICAmLmZzLXNlYXJjaC1zbG90IHtcbiAgICAgICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgJiA+ICoge1xuICAgICAgICAgICAgbWFyZ2luOiAwcHggNHB4O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1hcmdpbjogNHB4IDA7XG5cbiAgICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIC8vIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC5hbnQtZm9ybS1pdGVtLWxhYmVsIHtcbiAgICAgICAgICAgIG1heC13aWR0aDogNTAlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC5hbnQtaW5wdXQtbnVtYmVyLFxuICAgICAgICAgIC5hbnQtcGlja2VyLFxuICAgICAgICAgIC5lbC1pbnB1dC1udW1iZXIsXG4gICAgICAgICAgLmVsLWNhc2NhZGVyLFxuICAgICAgICAgIC5lbC1kYXRlLWVkaXRvcixcbiAgICAgICAgICAubi1zZWxlY3QsXG4gICAgICAgICAgLm4tZGF0ZS1waWNrZXIsXG4gICAgICAgICAgLm4taW5wdXQtbnVtYmVyIHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19pY29uIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAuZWwtZGF0ZS1lZGl0b3IgLmVsLXJhbmdlX19jbG9zZS1pY29uIHtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuZnMtc2VhcmNoLWJ1dHRvbnMtZ3JvdXAge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIC5mcy1idXR0b24ge1xuICAgICAgbWFyZ2luOiAwIDJweCAwIDJweDtcbiAgICB9XG4gIH1cblxuICAmLmZzLXNlYXJjaC1tdWx0aS1saW5lIHtcbiAgICAuZnMtc2VhcmNoLWJveCB7XG4gICAgICAuZnMtc2VhcmNoLW1haW4ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICAgIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMC4ycyBlYXNlO1xuICAgICAgICAmLmZzLXNlYXJjaC1jb2xsYXBzZSB7XG4gICAgICAgICAgbWF4LWhlaWdodDogNDJweCAhaW1wb3J0YW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmFudC1mb3JtLWl0ZW0ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgLmFudC1mb3JtLXJvdyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgICAgLmFudC1mb3JtLWl0ZW0tcm93IHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICAuYW50LWZvcm0taXRlbS1jb250cm9sIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWxheW91dC1kZWZhdWx0XCIgOmNsYXNzPVwieyAnZnMtc2VhcmNoLW11bHRpLWxpbmUnOiBjb21wdXRlZElzTXVsdGlMaW5lIH1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZnMtc2VhcmNoLWJveFwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZzLXNlYXJjaC1tYWluXCJcbiAgICAgICAgOmNsYXNzPVwieyAnZnMtc2VhcmNoLWNvbGxhcHNlJzogY29sbGFwc2UgfVwiXG4gICAgICAgIDpzdHlsZT1cInsgbWF4SGVpZ2h0OiBjb21wdXRlZENvbHVtbkJveEhlaWdodCB9XCJcbiAgICAgID5cbiAgICAgICAgPGNvbXBvbmVudCA6aXM9XCJ1aS5yb3cubmFtZVwiIHJlZj1cImNvbHVtbnNSb3dSZWZcIiBjbGFzcz1cImZzLXNlYXJjaC1jb2x1bW5zXCI+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+XG4iLCI8c2NyaXB0IGxhbmc9XCJ0c1wiPlxuaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50IGFzIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIjtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi8gX19NQUNST1NfZGVmaW5lQ29tcG9uZW50KHtcbiAgbmFtZTogXCJGc1RhYnNGaWx0ZXJcIixcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZVxufSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLXRhYnMtZmlsdGVyXCI+XG4gICAgPGNvbXBvbmVudCA6aXM9XCJ1aS50YWJzLm5hbWVcIiB2LWJpbmQ9XCJiaW5kaW5nXCI+XG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLnRhYlBhbmUubmFtZVwiXG4gICAgICAgIHYtaWY9XCJkZWZhdWx0T3B0aW9uLnNob3dcIlxuICAgICAgICA6W3VpLnRhYlBhbmUua2V5XT1cIl9fREVGQVVMVF9fXCJcbiAgICAgICAgOlt1aS50YWJQYW5lLnRhYl09XCJkZWZhdWx0T3B0aW9uLmxhYmVsXCJcbiAgICAgIC8+XG4gICAgICA8Y29tcG9uZW50XG4gICAgICAgIDppcz1cInVpLnRhYlBhbmUubmFtZVwiXG4gICAgICAgIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBvZiBvcHRpb25zXCJcbiAgICAgICAgOmtleT1cImluZGV4XCJcbiAgICAgICAgOlt1aS50YWJQYW5lLmtleV09XCJnZXRWYWx1ZShpdGVtKVwiXG4gICAgICAgIDpbdWkudGFiUGFuZS50YWJdPVwiZ2V0TGFiZWwoaXRlbSlcIlxuICAgICAgLz5cbiAgICA8L2NvbXBvbmVudD5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBsYW5nPVwidHNcIiBzZXR1cD5cbmltcG9ydCB7IGNvbXB1dGVkLCB1c2VBdHRycyB9IGZyb20gXCJ2dWVcIjtcbmltcG9ydCB7IHVzZU1lcmdlLCB1c2VVaSB9IGZyb20gXCIuLi8uLi91c2VcIjtcbjtcblxudHlwZSBUYWJzRmlsdGVyRGVmYXVsdE9wdGlvbiA9IHsgc2hvdz86IGJvb2xlYW47IHZhbHVlPzogYW55OyBsYWJlbD86IHN0cmluZyB9O1xudHlwZSBUYWJzRmlsdGVyT3B0aW9uID0geyB2YWx1ZTogYW55OyBsYWJlbDogc3RyaW5nOyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbmludGVyZmFjZSBUYWJzRmlsdGVyUHJvcHMge1xuICBuYW1lOiBzdHJpbmc7IC8v5p+l6K+i5a2X5q6155qEa2V5LHNlYXJjaOWPguaVsGtleVxuICBzaG93PzogYm9vbGVhbjtcbiAgZGVmYXVsdE9wdGlvbj86IFRhYnNGaWx0ZXJEZWZhdWx0T3B0aW9uO1xuICBvcHRpb25zOiBUYWJzRmlsdGVyT3B0aW9uW107XG4gIG1vZGVsVmFsdWU6IGFueTtcbiAgdmFsdWU/OiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xufVxuXG5jb25zdCBhdHRycyA9IHVzZUF0dHJzKCk7XG5jb25zdCB7IG1lcmdlIH0gPSB1c2VNZXJnZSgpO1xuY29uc3QgcHJvcHMgPSB3aXRoRGVmYXVsdHMoZGVmaW5lUHJvcHM8VGFic0ZpbHRlclByb3BzPigpLCB7XG4gIHNob3c6IGZhbHNlLFxuICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICBsYWJlbDogXCJsYWJlbFwiLFxuICBkZWZhdWx0T3B0aW9uOiB1bmRlZmluZWQsXG4gIG9wdGlvbnM6ICgpID0+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbn0pO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuICBjb25zdCBkZWYgPSB7XG4gICAgc2hvdzogdHJ1ZSxcbiAgICB2YWx1ZTogbnVsbCxcbiAgICBsYWJlbDogXCLlhajpg6hcIlxuICB9IGFzIFRhYnNGaWx0ZXJEZWZhdWx0T3B0aW9uO1xuICByZXR1cm4gbWVyZ2UoZGVmLCBwcm9wcy5kZWZhdWx0T3B0aW9uIHx8IHt9KTtcbn0pO1xuXG5jb25zdCBfX0RFRkFVTFRfXyA9IFwiX2RlZmF1bHRfa2V5X1wiO1xuY29uc3QgYmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3QgdmFsdWUgPVxuICAgIHByb3BzLm1vZGVsVmFsdWUgPT0gbnVsbCB8fCBwcm9wcy5tb2RlbFZhbHVlID09PSBkZWZhdWx0T3B0aW9uLnZhbHVlLnZhbHVlID8gX19ERUZBVUxUX18gOiBwcm9wcy5tb2RlbFZhbHVlO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwiY2FyZFwiLFxuICAgIC4uLmF0dHJzLFxuICAgIFt1aS50YWJzLm1vZGVsVmFsdWVdOiB2YWx1ZSxcbiAgICBbXCJvblVwZGF0ZTpcIiArIHVpLnRhYnMubW9kZWxWYWx1ZV06IG9uVXBkYXRlQWN0aXZlS2V5XG4gIH07XG59KTtcblxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFtcInVwZGF0ZTptb2RlbFZhbHVlXCIsIFwiY2hhbmdlXCJdKTtcblxuZnVuY3Rpb24gb25VcGRhdGVBY3RpdmVLZXkodmFsdWU6IGFueSkge1xuICBpZiAoX19ERUZBVUxUX18gPT09IHZhbHVlKSB7XG4gICAgdmFsdWUgPSBkZWZhdWx0T3B0aW9uLnZhbHVlLnZhbHVlO1xuICB9XG4gIGNvbnN0IG9sZFZhbHVlID0gcHJvcHMubW9kZWxWYWx1ZTtcbiAgZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgaWYgKG9sZFZhbHVlICE9PSB2YWx1ZSkge1xuICAgIGVtaXQoXCJjaGFuZ2VcIiwgdmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKG9wdGlvbjogVGFic0ZpbHRlck9wdGlvbikge1xuICByZXR1cm4gb3B0aW9uW3Byb3BzLnZhbHVlXTtcbn1cbmZ1bmN0aW9uIGdldExhYmVsKG9wdGlvbjogVGFic0ZpbHRlck9wdGlvbikge1xuICByZXR1cm4gb3B0aW9uW3Byb3BzLmxhYmVsXTtcbn1cblxuY29uc3QgeyB1aSB9ID0gdXNlVWkoKTtcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy10YWJzLWZpbHRlciB7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIC8vd2lkdGg6IDEwMCU7XG4gIC5hbnQtdGFicyA+IC5hbnQtdGFicy1uYXYsXG4gIC5hbnQtdGFicyA+IGRpdiA+IC5hbnQtdGFicy1uYXYge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cblxuICAuZWwtdGFicy0tY2FyZCA+IC5lbC10YWJzX19oZWFkZXIge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cblxuICAubi10YWItcGFuZSB7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHNjcmlwdCBsYW5nPVwidHNcIj5cbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCBhcyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQgfSBmcm9tIFwidnVlXCI7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovIF9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCh7XG4gIG5hbWU6IFwiRnNJY29uU2VsZWN0b3JcIlxufSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWljb24tc2VsZWN0b3JcIj5cbiAgICA8Y29tcG9uZW50IDppcz1cInVpLmlucHV0Lm5hbWVcIiB2LWJpbmQ9XCJpbnB1dEJpbmRpbmdcIiBAY2xpY2s9XCJoYW5kbGVDbGlja1wiPlxuICAgICAgPHRlbXBsYXRlICNwcmVmaXg+XG4gICAgICAgIDxmcy1pY29uIHYtaWY9XCJtb2RlbFZhbHVlXCIgY2xhc3M9XCJmcy1pY29uLXNlbGVjdG9yLWlucHV0LXByZWZpeFwiIDppY29uPVwibW9kZWxWYWx1ZVwiPjwvZnMtaWNvbj5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9jb21wb25lbnQ+XG5cbiAgICA8ZGl2IHYtaWY9XCJkaWFsb2dPcGVuZWRcIiBjbGFzcz1cImZzLWljb24tc2VsZWN0b3ItZGlhbG9nXCI+XG4gICAgICA8Y29tcG9uZW50IDppcz1cInVpLmRpYWxvZy5uYW1lXCIgcHJlc2V0PVwiZGlhbG9nXCIgdi1iaW5kPVwiY29tcHV0ZWREaWFsb2dcIiA6Zm9vdGVyPVwibnVsbFwiPlxuICAgICAgICA8dGVtcGxhdGUgI1t1aS5kaWFsb2cudGl0bGVTbG90TmFtZV0+XG4gICAgICAgICAgPGZzLWljb24gaWNvbj1cImljb24tc2VsZWN0XCIgY2xhc3M9XCJtci0yXCI+PC9mcy1pY29uPlxuICAgICAgICAgIOmAieaLqeWbvuagh1xuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtaWNvbi1zZWxlY3Rvci1kaWFsb2ctY29udGVudCBtYi00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tdGFicy1ib3ggbXQtMTAgbWItMTBcIj5cbiAgICAgICAgICAgIDxjb21wb25lbnQgOmlzPVwidWkudGFicy5uYW1lXCIgdi1iaW5kPVwiY29tcHV0ZVRhYnNcIiB0eXBlPVwiY2FyZFwiPlxuICAgICAgICAgICAgICA8Y29tcG9uZW50IDppcz1cInVpLnRhYlBhbmUubmFtZVwiIGtleT1cImFsbFwiIDpbdWkudGFiUGFuZS5rZXldPVwiJ2FsbCdcIiA6W3VpLnRhYlBhbmUudGFiXT1cIiflhajpg6gnXCI+XG4gICAgICAgICAgICAgIDwvY29tcG9uZW50PlxuICAgICAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICAgICAgOmlzPVwidWkudGFiUGFuZS5uYW1lXCJcbiAgICAgICAgICAgICAgICB2LWZvcj1cInNldCBvZiBpY29uU2V0c1wiXG4gICAgICAgICAgICAgICAgOmtleT1cInNldFwiXG4gICAgICAgICAgICAgICAgOlt1aS50YWJQYW5lLmtleV09XCJzZXRcIlxuICAgICAgICAgICAgICAgIDpbdWkudGFiUGFuZS50YWJdPVwic2V0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2NvbXBvbmVudD5cbiAgICAgICAgICAgIDwvY29tcG9uZW50PlxuXG4gICAgICAgICAgICA8Y29tcG9uZW50XG4gICAgICAgICAgICAgIDppcz1cInVpLmlucHV0Lm5hbWVcIlxuICAgICAgICAgICAgICB2LW1vZGVsOlt1aS5pbnB1dC5tb2RlbFZhbHVlXT1cInNlYXJjaEtleVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi5pCc57Si5Zu+5qCHLCDlj4zlh7vpgInmi6lcIlxuICAgICAgICAgICAgICBAa2V5ZG93bi5lbnRlcj1cImhhbmRsZVNlYXJjaFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjc3VmZml4PlxuICAgICAgICAgICAgICAgIDxmcy1idXR0b24gdHlwZT1cInByaW1hcnlcIiBzaXplPVwic21hbGxcIiA6aWNvbj1cInVpLmljb25zLnNlYXJjaFwiIEBjbGljaz1cImhhbmRsZVNlYXJjaFwiPjwvZnMtYnV0dG9uPlxuICAgICAgICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgICAgICAgPC9jb21wb25lbnQ+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgdi1mb3I9XCJpY29uIGluIHBhZ2VyLnJlY29yZHNcIlxuICAgICAgICAgICAgICAgICAgOmtleT1cImljb25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgOmNsYXNzPVwieyBhY3RpdmU6IGljb24gPT09IGN1cnJlbnQgfVwiXG4gICAgICAgICAgICAgICAgICA6dGl0bGU9XCJpY29uXCJcbiAgICAgICAgICAgICAgICAgIEBjbGljaz1cImhhbmRsZUljb25TZWxlY3QoaWNvbiwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgICAgIEBkYmxjbGljaz1cImhhbmRsZUljb25TZWxlY3QoaWNvbiwgdHJ1ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxmcy1pY29uIDppY29uPVwiaWNvblwiIGNsYXNzPVwidGV4dC0yeGxcIj48L2ZzLWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkLW1vcmVcIj5cbiAgICAgICAgICAgICAgICA8ZnMtbG9hZGluZyB2LWlmPVwicGFnZXIubG9hZGluZ1wiIDpsb2FkaW5nPVwicGFnZXIubG9hZGluZ1wiIHRleHQ9XCLliqDovb3kuK1cIiAvPlxuICAgICAgICAgICAgICAgIDxkaXYgdi1lbHNlLWlmPVwicGFnZXIudG90YWwgPT0gbnVsbCB8fCBwYWdlci50b3RhbCA9PSAwXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2PuaaguaXoOaVsOaNrjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgdi1lbHNlLWlmPVwicGFnZXIudG90YWwgPiBwYWdlci5zdGFydCArIHBhZ2VyLmxpbWl0XCIgQGNsaWNrPVwibG9hZE1vcmVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+5Yqg6L295pu05aSaPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgICAgICAgICAgIDxmcy1idXR0b24gdHlwZT1cInByaW1hcnlcIiBAY2xpY2s9XCJvbkNvbmZpcm1cIj7noa7lrpo8L2ZzLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvY29tcG9uZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInRzXCIgc2V0dXA+XG5pbXBvcnQgeyB1c2VVaSB9IGZyb20gXCJAZmFzdC1jcnVkL3VpLWludGVyZmFjZVwiO1xuaW1wb3J0IHsgcmVmLCB1c2VBdHRycywgUmVmLCBjb21wdXRlZCB9IGZyb20gXCJ2dWVcIjtcblxuO1xuXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHMoW1widXBkYXRlOm1vZGVsVmFsdWVcIl0pO1xuY29uc3QgZGVmYXVsdExpbWl0ID0gMTM2O1xuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wcyh7XG4gIG1vZGVsVmFsdWU6IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgZGVmYXVsdDogXCJcIlxuICB9LFxuICBkaWFsb2c6IHtcbiAgICB0eXBlOiBPYmplY3QsXG4gICAgZGVmYXVsdDogKCkgPT4gKHt9KVxuICB9LFxuICB0YWJzOiB7XG4gICAgdHlwZTogT2JqZWN0LFxuICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcbiAgfSxcbiAgLy8g6ZmQ5Yi25q+P6aG15pi+56S65pWw6YePXG4gIGxpbWl0OiB7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGRlZmF1bHQ6IDEzNlxuICB9LFxuICBpY29uU2V0czoge1xuICAgIHR5cGU6IEFycmF5PHN0cmluZz4sXG4gICAgZGVmYXVsdDogKCkgPT4gW1wiY2FyYm9uXCIsIFwiaW9uXCIsIFwiYW50LWRlc2lnblwiLCBcImZhLXNvbGlkXCIsIFwiZmEtYnJhbmRzXCIsIFwiZmEtcmVndWxhclwiLCBcIm1kaVwiXVxuICB9LFxuICBhcGlQcm92aWRlcjoge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgICBkZWZhdWx0OiBcImh0dHBzOi8vYXBpLmljb25pZnkuZGVzaWduXCJcbiAgfVxufSk7XG5jb25zdCB7IHVpIH0gPSB1c2VVaSgpO1xuXG5jb25zdCBkaWFsb2dPcGVuZWQgPSByZWYoZmFsc2UpO1xuY29uc3QgY29tcHV0ZWREaWFsb2cgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IDEwMjQsXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBcIjEwMjRweFwiXG4gICAgfSxcbiAgICAuLi5wcm9wcy5kaWFsb2csXG4gICAgW3VpLmRpYWxvZy52aXNpYmxlXTogZGlhbG9nT3BlbmVkLnZhbHVlLFxuICAgIFtgb25VcGRhdGU6JHt1aS5kaWFsb2cudmlzaWJsZX1gXTogKHZhbDogYm9vbGVhbikgPT4ge1xuICAgICAgZGlhbG9nT3BlbmVkLnZhbHVlID0gdmFsO1xuICAgIH1cbiAgfTtcbn0pO1xuXG5jb25zdCBmb3JtSXRlbUNvbnRleHQgPSB1aS5mb3JtSXRlbS5pbmplY3RGb3JtSXRlbUNvbnRleHQoKTtcbmNvbnN0IGlucHV0QmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5hdHRycyxcbiAgICBbdWkuaW5wdXQubW9kZWxWYWx1ZV06IHByb3BzLm1vZGVsVmFsdWUsXG4gICAgW2BvblVwZGF0ZToke3VpLmlucHV0Lm1vZGVsVmFsdWV9YF06ICh2YWw6IHN0cmluZykgPT4ge1xuICAgICAgZW1pdENoYW5nZSh2YWwpO1xuICAgIH1cbiAgfTtcbn0pO1xuXG5jb25zdCBlbWl0Q2hhbmdlID0gKHZhbDogc3RyaW5nKSA9PiB7XG4gIGVtaXQoXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiLCB2YWwpO1xuICBmb3JtSXRlbUNvbnRleHQ/Lm9uQ2hhbmdlKCk7XG59O1xuXG5jb25zdCBoYW5kbGVDbGljayA9ICgpID0+IHtcbiAgZGlhbG9nT3BlbmVkLnZhbHVlID0gdHJ1ZTtcbiAgaWYgKHByb3BzLmljb25TZXRzLmxlbmd0aCA+IDAgJiYgcGFnZXIudmFsdWUucmVjb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICBvblRhYkNoYW5nZShwcm9wcy5pY29uU2V0c1swXSBhcyBzdHJpbmcpO1xuICB9XG59O1xuXG5jb25zdCBhdHRycyA9IHVzZUF0dHJzKCk7XG5cbmNvbnN0IGFwaSA9IHtcbiAgYXN5bmMgZ2V0Q29sbGVjdGlvbnMoKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMuYXBpUHJvdmlkZXJ9L2NvbGxlY3Rpb25zYCk7XG4gICAgcmV0dXJuIGF3YWl0IHJlcy5qc29uKCk7XG4gIH0sXG4gIGFzeW5jIGdldEljb25zKHByZWZpeDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMuYXBpUHJvdmlkZXJ9L2NvbGxlY3Rpb24/cHJlZml4PSR7cHJlZml4fWApO1xuICAgIHJldHVybiBhd2FpdCByZXMuanNvbigpO1xuICB9LFxuICBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZywgcGFnZXI6IGFueSkge1xuICAgIGNvbnN0IHN0YXJ0ID0gcGFnZXIuc3RhcnQgPz8gMDtcbiAgICBjb25zdCBsaW1pdCA9IHBhZ2VyLmxpbWl0ID8/IDUwO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3Byb3BzLmFwaVByb3ZpZGVyfS9zZWFyY2g/cXVlcnk9JHtxdWVyeX0mc3RhcnQ9JHtzdGFydH0mbGltaXQ9JHtsaW1pdH1gKTtcbiAgICByZXR1cm4gYXdhaXQgcmVzLmpzb24oKTtcbiAgfVxufTtcblxuY29uc3QgaWNvblN0b3JlOiBSZWYgPSByZWYoe30pO1xuXG5jb25zdCBsb2FkSWNvblNldCA9IGFzeW5jIChwcmVmaXg6IHN0cmluZykgPT4ge1xuICBsZXQgc2V0cyA9IGljb25TdG9yZS52YWx1ZVtwcmVmaXhdO1xuICBpZiAoIXNldHMpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkuZ2V0SWNvbnMocHJlZml4KTtcbiAgICBjb25zdCB1bmNhdGVnb3JpZXMgPSByZXMudW5jYXRlZ29yaXplZCA/PyBbXTtcbiAgICBjb25zdCBjYXRlZ29yaWVzID0gcmVzLmNhdGVnb3JpZXMgPz8gW107XG4gICAgc2V0cyA9IHVuY2F0ZWdvcmllcztcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjYXRlZ29yaWVzKSB7XG4gICAgICBzZXRzID0gc2V0cy5jb25jYXQoY2F0ZWdvcmllc1trZXldKTtcbiAgICB9XG4gICAgc2V0cyA9IHNldHMubWFwKChpdGVtOiBhbnkpID0+IGAke3ByZWZpeH06JHtpdGVtfWApO1xuICAgIGljb25TdG9yZS52YWx1ZVtwcmVmaXhdID0gc2V0cztcbiAgfVxuICByZXR1cm4gc2V0cztcbn07XG5cbmNvbnN0IHNlYXJjaEtleSA9IHJlZihcIlwiKTtcbmNvbnN0IHRhYktleSA9IHJlZihcImFsbFwiKTtcbmNvbnN0IG9uVGFiQ2hhbmdlID0gKGtleTogc3RyaW5nKSA9PiB7XG4gIHRhYktleS52YWx1ZSA9IGtleTtcbiAgc2VhcmNoS2V5LnZhbHVlID0gXCJcIjtcbiAgcmVzZXRQYWdlcigpO1xuICBoYW5kbGVTZWFyY2goKTtcbn07XG5cbmNvbnN0IHJlc2V0UGFnZXIgPSAoKSA9PiB7XG4gIHBhZ2VyLnZhbHVlLnN0YXJ0ID0gMDtcbiAgcGFnZXIudmFsdWUucmVjb3JkcyA9IFtdO1xuICBwYWdlci52YWx1ZS50b3RhbCA9IDA7XG4gIHBhZ2VyLnZhbHVlLmxpbWl0ID0gcHJvcHMubGltaXQgPz8gZGVmYXVsdExpbWl0O1xufTtcblxuY29uc3QgcGFnZXIgPSByZWYoe1xuICBsb2FkaW5nOiBmYWxzZSxcbiAgc3RhcnQ6IDAsXG4gIGxpbWl0OiBwcm9wcy5saW1pdCA/PyBkZWZhdWx0TGltaXQsXG4gIHRvdGFsOiBudWxsLFxuICBxdWVyeTogXCJcIixcbiAgcmVjb3JkczogW11cbn0pO1xuXG5jb25zdCBoYW5kbGVTZWFyY2ggPSBhc3luYyAoKSA9PiB7XG4gIGlmIChwYWdlci52YWx1ZS5sb2FkaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwYWdlci52YWx1ZS5xdWVyeSAhPT0gc2VhcmNoS2V5LnZhbHVlKSB7XG4gICAgLy/ph43nva5zdGFydFxuICAgIHJlc2V0UGFnZXIoKTtcbiAgfVxuXG4gIHBhZ2VyLnZhbHVlLmxvYWRpbmcgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGRvU2VhcmNoKCk7XG4gICAgcGFnZXIudmFsdWUucmVjb3JkcyA9IHBhZ2VyLnZhbHVlLnJlY29yZHMuY29uY2F0KHJlcy5pY29ucyk7XG4gICAgcGFnZXIudmFsdWUudG90YWwgPSByZXMudG90YWw7XG4gICAgcGFnZXIudmFsdWUubGltaXQgPSByZXMubGltaXQ7XG4gICAgcGFnZXIudmFsdWUucXVlcnkgPSBzZWFyY2hLZXkudmFsdWU7XG4gIH0gZmluYWxseSB7XG4gICAgcGFnZXIudmFsdWUubG9hZGluZyA9IGZhbHNlO1xuICB9XG59O1xuXG5hc3luYyBmdW5jdGlvbiBkb1NlYXJjaCgpIHtcbiAgaWYgKHRhYktleS52YWx1ZSA9PT0gXCJhbGxcIikge1xuICAgIGlmICghc2VhcmNoS2V5LnZhbHVlKSB7XG4gICAgICB1aS5ub3RpZmljYXRpb24ud2FybihcIuivt+i+k+WFpeaQnOe0ouWFs+mUruWtl1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGFwaS5zZWFyY2goc2VhcmNoS2V5LnZhbHVlLCBwYWdlci52YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGF3YWl0IGdldFBhZ2VyRnJvbUljb25TZXQodGFiS2V5LnZhbHVlKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQYWdlckZyb21JY29uU2V0KHByZWZpeDogc3RyaW5nKSB7XG4gIGNvbnN0IGljb25zID0gYXdhaXQgbG9hZEljb25TZXQocHJlZml4KTtcbiAgbGV0IGZpbHRlcnMgPSBpY29ucztcbiAgaWYgKHNlYXJjaEtleS52YWx1ZSkge1xuICAgIGZpbHRlcnMgPSBpY29ucy5maWx0ZXIoKGljb246IHN0cmluZykgPT4gaWNvbi5pbmNsdWRlcyhzZWFyY2hLZXkudmFsdWUpKTtcbiAgfVxuICBsZXQgZW5kID0gcGFnZXIudmFsdWUuc3RhcnQgKyBwYWdlci52YWx1ZS5saW1pdDtcbiAgaWYgKGVuZCA+IGZpbHRlcnMubGVuZ3RoKSB7XG4gICAgZW5kID0gZmlsdGVycy5sZW5ndGg7XG4gIH1cbiAgY29uc3QgcGFnZXJJY29ucyA9IGZpbHRlcnMuc2xpY2UocGFnZXIudmFsdWUuc3RhcnQsIGVuZCk7XG4gIHJldHVybiB7XG4gICAgaWNvbnM6IHBhZ2VySWNvbnMsXG4gICAgdG90YWw6IGZpbHRlcnMubGVuZ3RoLFxuICAgIGxpbWl0OiBwYWdlci52YWx1ZS5saW1pdCxcbiAgICBzdGFydDogcGFnZXIudmFsdWUuc3RhcnRcbiAgfTtcbn1cblxuY29uc3QgY3VycmVudCA9IHJlZihwcm9wcy5tb2RlbFZhbHVlKTtcbmNvbnN0IGhhbmRsZUljb25TZWxlY3QgPSAoaWNvbjogc3RyaW5nLCBjb25maXJtID0gZmFsc2UpID0+IHtcbiAgY3VycmVudC52YWx1ZSA9IGljb247XG4gIGlmIChjb25maXJtKSB7XG4gICAgb25Db25maXJtKCk7XG4gIH1cbn07XG5cbmNvbnN0IG9uQ29uZmlybSA9ICgpID0+IHtcbiAgZGlhbG9nT3BlbmVkLnZhbHVlID0gZmFsc2U7XG4gIGVtaXRDaGFuZ2UoY3VycmVudC52YWx1ZSk7XG59O1xuXG5jb25zdCBsb2FkTW9yZSA9IGFzeW5jICgpID0+IHtcbiAgcGFnZXIudmFsdWUuc3RhcnQgKz0gcGFnZXIudmFsdWUubGltaXQ7XG4gIGF3YWl0IGhhbmRsZVNlYXJjaCgpO1xufTtcblxuY29uc3QgY29tcHV0ZVRhYnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4ucHJvcHMudGFicyxcbiAgICBbdWkudGFicy5tb2RlbFZhbHVlXTogdGFiS2V5LnZhbHVlLFxuICAgIFtgb25VcGRhdGU6JHt1aS50YWJzLm1vZGVsVmFsdWV9YF06IG9uVGFiQ2hhbmdlXG4gIH07XG59KTtcbjwvc2NyaXB0PlxuPHN0eWxlIGxhbmc9XCJsZXNzXCI+XG4uZnMtaWNvbi1zZWxlY3RvciB7XG4gIC5mcy1pY29uLXNlbGVjdG9yLWlucHV0LXByZWZpeCB7XG4gICAgZm9udC1zaXplOiAxOHB4O1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG59XG4uZnMtaWNvbi1zZWxlY3Rvci1kaWFsb2ctY29udGVudCB7XG4gIC5pY29uLXRhYnMtYm94IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgbWluLWhlaWdodDogNTAwcHg7XG4gICAgbWF4LWhlaWdodDogNjB2aDtcblxuICAgIC5sb2FkLW1vcmUge1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHBhZGRpbmc6IDEwcHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAuZm9vdGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGVuZDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgIH1cbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC5pY29uLWNvbnRhaW5lciB7XG4gICAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgICAgZmxleDogMTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgIC5pY29uLWxpc3Qge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgICAuaWNvbi1pdGVtIHtcbiAgICAgICAgICB3aWR0aDogNTBweDtcbiAgICAgICAgICBoZWlnaHQ6IDUwcHg7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgICAgICBtYXJnaW46IDJweDtcbiAgICAgICAgICAmLmFjdGl2ZSB7XG4gICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjNDA5ZWZmO1xuICAgICAgICAgIH1cbiAgICAgICAgICAmOmhvdmVyIHtcbiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM2Y2IzZjg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC5mcy1pY29uIHtcbiAgICAgICAgICBmb250LXNpemU6IDMwcHg7XG4gICAgICAgICAgbWF4LXdpZHRoOiA5NiU7XG4gICAgICAgICAgbWF4LWhlaWdodDogOTYlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlPlxuICA8Y29tcG9uZW50IDppcz1cInVpLnJhZGlvR3JvdXAubmFtZVwiIEBjaGFuZ2U9XCJvblNlbGVjdGVkQ2hhbmdlXCI+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+mXrSovXG4gIFwiZGlhbG9nLWNsb3NlZFwiXG5dKTtcbmNvbnN0IHsgdWkgfSA9IHVzZVVpKCk7XG5jb25zdCB7IHQgfSA9IHVzZUkxOG4oKTtcbmNvbnN0IGRpY3RTZWxlY3RSZWYgPSByZWYoKTtcbmNvbnN0IHZhbHVlc0Zvcm1hdFJlZiA9IHJlZigpO1xuY29uc3QgZGlhbG9nT3BlbiA9IHJlZihmYWxzZSk7XG5cbmZ1bmN0aW9uIG9uQ2xvc2UoKSB7XG4gIGRpYWxvZ09wZW4udmFsdWUgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIG9uT3BlbigpIHtcbiAgZGlhbG9nT3Blbi52YWx1ZSA9IHRydWU7XG59XG5cbmNvbnN0IHsgY3J1ZFJlZiwgY3J1ZEJpbmRpbmcsIGNydWRFeHBvc2UgfSA9IHVzZUZzUmVmKCk7XG5cbmZ1bmN0aW9uIGluaXRTZWxlY3RlZEtleXMobW9kZWxWYWx1ZTogYW55KSB7XG4gIGlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgKEFycmF5LmlzQXJyYXkobW9kZWxWYWx1ZSkgJiYgbW9kZWxWYWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICBzZWxlY3RlZFJvd0tleXMudmFsdWUgPSBbXTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcbiAgICAgIHNlbGVjdGVkUm93S2V5cy52YWx1ZSA9IG1vZGVsVmFsdWUgfHwgW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGVkUm93S2V5cy52YWx1ZSA9IFttb2RlbFZhbHVlXTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgc2VsZWN0ZWRSb3dLZXlzLnZhbHVlID0gc2VsZWN0ZWRSb3dLZXlzLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMuZGljdC5nZXRWYWx1ZShpdGVtKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBmb3JtV3JhcHBlclJlZiA9IHJlZigpO1xuY29uc3QgZm9ybVdyYXBwZXJPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHdyYXBwZXI6IHt9XG4gIH07XG59KTtcblxuY29uc3Qgb3BlblRhYmxlU2VsZWN0ID0gYXN5bmMgKG9wZW5PcHRpb25zOiB7IGNydWRPcHRpb25zPzogRHluYW1pY2FsbHlDcnVkT3B0aW9uczsgY29udGV4dD86IGFueSB9ID0ge30pID0+IHtcbiAgaWYgKHByb3BzLmRpc2FibGVkIHx8IHByb3BzLnJlYWRvbmx5IHx8IHByb3BzLnNlbGVjdD8uZGlzYWJsZWQgfHwgcHJvcHMuc2VsZWN0Py5yZWFkb25seSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvcHMuZGljdCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwi5b+F6aG76YWN572uZGljdO+8jOS4lOW/hemhu+mFjee9rmRpY3QuZ2V0Tm9kZXNCeVZhbHVlc1wiKTtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IGF3YWl0IHVzZUZzQXN5bmMoe1xuICAgIGNydWRCaW5kaW5nLFxuICAgIGNydWRSZWYsXG4gICAgY3JlYXRlQ3J1ZE9wdGlvbnM6IHByb3BzLmNyZWF0ZUNydWRPcHRpb25zLFxuICAgIGNydWRPcHRpb25zT3ZlcnJpZGU6IGJ1aWxkTWVyZ2VkQ3J1ZE9wdGlvbnMoKSxcbiAgICBjb250ZXh0OiB7XG4gICAgICB0LFxuICAgICAgdWksXG4gICAgICAuLi5vcGVuT3B0aW9ucz8uY29udGV4dFxuICAgIH0sXG4gICAgY3J1ZEV4cG9zZVxuICB9KTtcblxuICBpbml0U2VsZWN0ZWRLZXlzKHByb3BzLm1vZGVsVmFsdWUpO1xuICBpZiAocHJvcHMuYmVmb3JlT3Blbikge1xuICAgIGF3YWl0IHByb3BzLmJlZm9yZU9wZW4oe1xuICAgICAgY3J1ZE9wdGlvbnM6IG9wZW5PcHRpb25zPy5jcnVkT3B0aW9ucyxcbiAgICAgIC4uLmdldFNjb3BlQ29udGV4dCgpXG4gICAgfSk7XG4gIH1cbiAgaWYgKG9wZW5PcHRpb25zKSB7XG4gICAgcmV0LmFwcGVuZENydWRPcHRpb25zKG9wZW5PcHRpb25zPy5jcnVkT3B0aW9ucyk7XG4gIH1cbiAgY29uc3Qgd3JhcHBlck9wdGlvbnMgPSBtZXJnZShcbiAgICB7XG4gICAgICB3cmFwcGVyOiB7XG4gICAgICAgIHRpdGxlOiBwcm9wcy52aWV3TW9kZSA/IHQoXCJmcy5leHRlbmRzLnRhYmxlU2VsZWN0LnZpZXdcIikgOiB0KFwiZnMuZXh0ZW5kcy50YWJsZVNlbGVjdC5zZWxlY3RcIiksXG4gICAgICAgIHdpZHRoOiBcIjgwJVwiLFxuICAgICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICAgIGlzOiB1aS5kaWFsb2cubmFtZSxcbiAgICAgICAgZm9vdGVyOiBmYWxzZSxcbiAgICAgICAgLi4udWkuZm9ybVdyYXBwZXIuYnVpbGRJbml0QmluZCh1aS5kaWFsb2cubmFtZSksXG4gICAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgc2hvdzogZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgICAgdGV4dDogdChcImZzLmV4dGVuZHMudGFibGVTZWxlY3QuY2FuY2VsXCIpLFxuICAgICAgICAgICAgYXN5bmMgY2xpY2soKSB7XG4gICAgICAgICAgICAgIGZvcm1XcmFwcGVyUmVmLnZhbHVlLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvazoge1xuICAgICAgICAgICAgdHlwZTogXCJwcmltYXJ5XCIsXG4gICAgICAgICAgICB0ZXh0OiB0KFwiZnMuZXh0ZW5kcy50YWJsZVNlbGVjdC5va1wiKSxcbiAgICAgICAgICAgIGFzeW5jIGNsaWNrKCkge1xuICAgICAgICAgICAgICBhd2FpdCBvbk9rKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICB3cmFwcGVyOiBwcm9wcy5kaWFsb2dcbiAgICB9XG4gICk7XG4gIGZvcm1XcmFwcGVyUmVmLnZhbHVlLm9wZW4od3JhcHBlck9wdGlvbnMpO1xuXG4gIGF3YWl0IG5leHRUaWNrKCk7XG4gIGF3YWl0IGNydWRFeHBvc2UuZG9SZWZyZXNoKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5jb25zdCBjb21wdXRlZFZhbHVlc0Zvcm1hdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcm9wcy52YWx1ZXNGb3JtYXRcbiAgfTtcbn0pO1xuXG5jb25zdCBjb21wdXRlZFNlbGVjdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgY29uc3QgdXBkYXRlS2V5ID0gYG9uVXBkYXRlOiR7dWkuc2VsZWN0Lm1vZGVsVmFsdWV9YDtcblxuICBsZXQgdmFsdWUgPSBwcm9wcy5tb2RlbFZhbHVlO1xuICBpZiAocHJvcHMudmFsdWVUeXBlID09PSBcIm9iamVjdFwiICYmIHByb3BzLm1vZGVsVmFsdWUpIHtcbiAgICBpZiAocHJvcHMubXVsdGlwbGUpIHtcbiAgICAgIHZhbHVlID0gcHJvcHMubW9kZWxWYWx1ZS5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvcHMuZGljdC5nZXRWYWx1ZShpdGVtKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHByb3BzLmRpY3QuZ2V0VmFsdWUocHJvcHMubW9kZWxWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgW3VpLnNlbGVjdC5tb2RlbFZhbHVlXTogdmFsdWUsXG4gICAgW3VwZGF0ZUtleV06ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICBlbWl0cyhcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICB9LFxuICAgIFt1aS5zZWxlY3QuY2xlYXJhYmxlXTogdHJ1ZSxcbiAgICAuLi51aS5zZWxlY3QuYnVpbGRNdWx0aUJpbmRpbmcocHJvcHMubXVsdGlwbGUpLFxuICAgIHNob3c6IGZhbHNlLFxuICAgIC4uLnByb3BzLnNlbGVjdFxuICB9O1xufSk7XG5cbi8vIGNvbnN0IGNvbXB1dGVkRGlhbG9nQmluZGluZyA9IGNvbXB1dGVkKCgpID0+IHtcbi8vICAgY29uc3QgYmFzZSA9IHVpLmRpYWxvZy5idWlsZFByb3BzKHtcbi8vICAgICB0aXRsZTogcHJvcHMudmlld01vZGUgPyB0KFwiZnMuZXh0ZW5kcy50YWJsZVNlbGVjdC52aWV3XCIpIDogdChcImZzLmV4dGVuZHMudGFibGVTZWxlY3Quc2VsZWN0XCIpLFxuLy8gICAgIHdpZHRoOiBcIjgwJVwiXG4vLyAgIH0pO1xuLy8gICByZXR1cm4gbWVyZ2UoYmFzZSwgcHJvcHMuZGlhbG9nKTtcbi8vIH0pO1xuXG53YXRjaChcbiAgKCkgPT4ge1xuICAgIHJldHVybiBwcm9wcy5tb2RlbFZhbHVlO1xuICB9LFxuICBhc3luYyAodmFsdWUpID0+IHtcbiAgICBpZiAodmFsdWUgPT09IHNlbGVjdGVkUm93S2V5cy52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbml0U2VsZWN0ZWRLZXlzKHZhbHVlKTtcbiAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgIGF3YWl0IHByb3BzLmRpY3QuYXBwZW5kQnlWYWx1ZXMoc2VsZWN0ZWRSb3dLZXlzLnZhbHVlKTtcbiAgICAvLyBkaWN0U2VsZWN0UmVmLnZhbHVlLnJlbG9hZERpY3QoKTtcbiAgfVxuKTtcbmNvbnN0IHNlbGVjdGVkUm93S2V5czogUmVmPGFueVtdPiA9IHJlZihbXSk7XG5cbmZ1bmN0aW9uIGdldFJvd0tleSgpIHtcbiAgcmV0dXJuIHByb3BzLnJvd0tleSB8fCBjcnVkQmluZGluZy52YWx1ZS50YWJsZS5yb3dLZXkgfHwgXCJpZFwiO1xufVxuY29uc3QgcmVmcmVzaGluZyA9IHJlZihmYWxzZSk7XG5cbmZ1bmN0aW9uIGJ1aWxkTWVyZ2VkQ3J1ZE9wdGlvbnMoKSB7XG4gIGxldCB0YWJsZUNJID0gdWkudGFibGU7XG4gIGlmIChjcnVkQmluZGluZy52YWx1ZT8udGFibGU/LnRhYmxlVmVyc2lvbiA9PT0gXCJ2MlwiKSB7XG4gICAgdGFibGVDSSA9IHVpLnRhYmxlVjI7XG4gIH1cbiAgbGV0IHNlbGVjdGlvbk9wdGlvbnMgPSB0YWJsZUNJLmJ1aWxkU2VsZWN0aW9uQ3J1ZE9wdGlvbnMoe1xuICAgIGNyb3NzUGFnZTogcHJvcHMuY3Jvc3NQYWdlLFxuICAgIHNlbGVjdE9uQ2xpY2tSb3c6IHRydWUsXG4gICAgZ2V0Um93S2V5LFxuICAgIGdldFBhZ2VEYXRhKCkge1xuICAgICAgcmV0dXJuIGNydWRCaW5kaW5nLnZhbHVlLmRhdGE7XG4gICAgfSxcbiAgICB1c2VDb21wdXRlOiB1c2VDb21wdXRlLFxuICAgIG11bHRpcGxlOiBwcm9wcy5tdWx0aXBsZSxcbiAgICBzZWxlY3RlZFJvd0tleXMsXG4gICAgb25TZWxlY3RlZEtleXNDaGFuZ2VkOiBhc3luYyAoY2hhbmdlZCkgPT4ge1xuICAgICAgc2VsZWN0ZWRSb3dLZXlzLnZhbHVlID0gWy4uLmNoYW5nZWRdO1xuICAgICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICAgIGF3YWl0IHByb3BzLmRpY3QuYXBwZW5kQnlWYWx1ZXMoc2VsZWN0ZWRSb3dLZXlzLnZhbHVlKTtcbiAgICAgIC8vIGlmICh2YWx1ZXNGb3JtYXRSZWYudmFsdWUpIHtcbiAgICAgIC8vICAgdmFsdWVzRm9ybWF0UmVmLnZhbHVlLnJlbG9hZERpY3QoKTtcbiAgICAgIC8vIH1cbiAgICB9XG4gIH0pO1xuICBjb25zdCBjcnVkT3B0aW9ucyA9IHtcbiAgICB0YWJsZToge1xuICAgICAgYXN5bmMgb25SZWZyZXNoZWQoKSB7XG4gICAgICAgIGlmICh0YWJsZUNJLnNldFNlbGVjdGVkUm93cykge1xuICAgICAgICAgIHJlZnJlc2hpbmcudmFsdWUgPSB0cnVlO1xuICAgICAgICAgIGF3YWl0IG5leHRUaWNrKCk7XG4gICAgICAgICAgYXdhaXQgbmV4dFRpY2soKTtcbiAgICAgICAgICBjb25zdCBiYXNlVGFibGVSZWYgPSBjcnVkRXhwb3NlLmdldEJhc2VUYWJsZVJlZigpO1xuICAgICAgICAgIHRhYmxlQ0kuc2V0U2VsZWN0ZWRSb3dzKHtcbiAgICAgICAgICAgIGdldFJvd0tleSxcbiAgICAgICAgICAgIG11bHRpcGxlOiBwcm9wcy5tdWx0aXBsZSxcbiAgICAgICAgICAgIHRhYmxlUmVmOiBiYXNlVGFibGVSZWYsXG4gICAgICAgICAgICBzZWxlY3RlZFJvd0tleXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZWZyZXNoaW5nLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBtZXJnZShjcnVkT3B0aW9ucywgc2VsZWN0aW9uT3B0aW9ucywgcHJvcHMuY3J1ZE9wdGlvbnNPdmVycmlkZSk7XG59XG5cbmNvbnN0IHsgbWVyZ2UgfSA9IHVzZU1lcmdlKCk7XG5cbi8vIHdhdGNoKFxuLy8gICAoKSA9PiB7XG4vLyAgICAgcmV0dXJuIHByb3BzLmNydWRPcHRpb25zT3ZlcnJpZGU7XG4vLyAgIH0sXG4vLyAgIGFzeW5jICh2YWx1ZSwgb2xkVmFsdWUpID0+IHtcbi8vICAgICBpZiAoSlNPTi5zdHJpbmdpZnkodmFsdWUpID09PSBKU09OLnN0cmluZ2lmeShvbGRWYWx1ZSkpIHtcbi8vICAgICAgIHJldHVybjtcbi8vICAgICB9XG4vLyAgICAgY29uc3QgY3VyID0gY3J1ZEJpbmRpbmcudmFsdWU/LnBhZ2luYXRpb25bdWkucGFnaW5hdGlvbi5jdXJyZW50UGFnZV07XG4vLyAgICAgYXBwZW5kQ3J1ZE9wdGlvbnModmFsdWUpO1xuLy8gICAgIGlmIChjcnVkUmVmLnZhbHVlKSB7XG4vLyAgICAgICBjcnVkQmluZGluZy52YWx1ZS5wYWdpbmF0aW9uW3VpLnBhZ2luYXRpb24uY3VycmVudFBhZ2VdID0gY3VyO1xuLy8gICAgICAgYXdhaXQgY3J1ZEV4cG9zZS5kb1JlZnJlc2goeyBnb0ZpcnN0UGFnZTogZmFsc2UgfSk7XG4vLyAgICAgfVxuLy8gICB9XG4vLyApO1xuXG5hc3luYyBmdW5jdGlvbiBvbk9rKCkge1xuICBpZiAocHJvcHMuZGljdC5sb2FkaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCB2YWx1ZSA9IG51bGw7XG4gIGxldCByb3dzID0gbnVsbDtcbiAgaWYgKHNlbGVjdGVkUm93S2V5cy52YWx1ZT8ubGVuZ3RoID4gMCkge1xuICAgIHZhbHVlID0gWy4uLnNlbGVjdGVkUm93S2V5cy52YWx1ZV07XG5cbiAgICByb3dzID0gdmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4gcHJvcHMuZGljdC5nZXREaWN0TWFwKClbaXRlbV07XG4gICAgfSk7XG4gICAgaWYgKHByb3BzLnZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdmFsdWUgPSByb3dzO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5tdWx0aXBsZSAhPT0gdHJ1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlWzBdO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcHJvcHMudmlld01vZGUgfHwgcHJvcHMuZW1pdE9uVmlld01vZGVsKSB7XG4gICAgLy/pnZ52aWV35qih5byP5LiL77yM6ZyA6KaB5pu05pawdmFsdWVcbiAgICBlbWl0cyhcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbiAgICBlbWl0cyhcImNoYW5nZVwiLCB2YWx1ZSk7XG4gICAgZW1pdHMoXCJzZWxlY3RlZC1jaGFuZ2VcIiwgcm93cyk7XG4gIH1cbiAgbGV0IHNjb3BlID0ge1xuICAgIHZhbHVlLFxuICAgIHJvd3MsXG4gICAgc2VsZWN0ZWRSb3dLZXlzOiBzZWxlY3RlZFJvd0tleXMudmFsdWVcbiAgfTtcbiAgZW1pdHMoXCJkaWFsb2ctY2xvc2VcIiwgc2NvcGUpO1xuICBhd2FpdCBuZXh0VGljaygpO1xuICBhd2FpdCBmb3JtV3JhcHBlclJlZi52YWx1ZS5jbG9zZSgpO1xuICBjb25zb2xlLmxvZyhcImRpYWxvZ09wZW5cIiwgZGlhbG9nT3Blbi52YWx1ZSk7XG4gIGVtaXRzKFwiZGlhbG9nLWNsb3NlZFwiLCBzY29wZSk7XG59XG5cbmNvbnN0IGdldFNjb3BlQ29udGV4dCA9ICgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvcGVuZWQ6IGRpYWxvZ09wZW4sXG4gICAgb3Blbjogb3BlblRhYmxlU2VsZWN0LFxuICAgIHNlbGVjdGVkUm93S2V5cyxcbiAgICBkaWN0U2VsZWN0UmVmLFxuICAgIHZhbHVlc0Zvcm1hdFJlZixcbiAgICBjcnVkUmVmLFxuICAgIGNydWRCaW5kaW5nLFxuICAgIGNydWRFeHBvc2VcbiAgfTtcbn07XG5cbmNvbnN0IHNjb3BlUmVmID0gcmVmKGdldFNjb3BlQ29udGV4dCgpKTtcbmRlZmluZUV4cG9zZShzY29wZVJlZi52YWx1ZSk7XG48L3NjcmlwdD5cbjxzdHlsZSBsYW5nPVwibGVzc1wiPlxuLmZzLXRhYmxlLXNlbGVjdCB7XG4gIHdpZHRoOiAxMDAlO1xuICAuZWwtZGlhbG9nX19ib2R5IHtcbiAgICBwYWRkaW5nLXRvcDogMDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgfVxufVxuLmZzLXRhYmxlLXNlbGVjdC1jdXJyZW50IHtcbiAgLy9ib3JkZXI6IDFweCBzb2xpZCAjZWVlO1xuICAvL2JvcmRlci1yYWRpdXM6IDNweDtcbiAgcGFkZGluZzogMTBweCAwO1xufVxuPC9zdHlsZT5cbiIsIjxzY3JpcHQgbGFuZz1cInRzXCI+XG5pbXBvcnQgeyBkZWZpbmVDb21wb25lbnQgYXMgX19NQUNST1NfZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuZXhwb3J0IGRlZmF1bHQgLyojX19QVVJFX18qLyBfX01BQ1JPU19kZWZpbmVDb21wb25lbnQoe1xuICAvKipcbiAgICog5Y+v57yW6L6R6YCJ5oup5ZmoXG4gICAqL1xuICBuYW1lOiBcIkZzRWRpdGFibGVTZWxlY3RcIlxufSk7XG48L3NjcmlwdD5cbjx0ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZzLWVkaXRhYmxlLXNlbGVjdFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cbiAgICAgIDxmcy1kaWN0LXNlbGVjdCA6dmFsdWU9XCJtb2RlbFZhbHVlXCIgOmRpY3Q9XCJkaWN0XCIgdi1iaW5kPVwiZGljdFNlbGVjdFwiIEB1cGRhdGU6dmFsdWU9XCJkb1VwZGF0ZVwiPjwvZnMtZGljdC1zZWxlY3Q+XG4gICAgPC9kaXY+XG5cbiAgICA8ZnMtdGFibGUtc2VsZWN0XG4gICAgICBjbGFzcz1cInRhYmxlLXNlbGVjdFwiXG4gICAgICA6bW9kZWwtdmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICAgIDpkaWN0PVwiZGljdFwiXG4gICAgICA6ZGVzdHJveS1vbi1jbG9zZT1cImZhbHNlXCJcbiAgICAgIGhlaWdodD1cIjQwMHB4XCJcbiAgICAgIHYtYmluZD1cInRhYmxlU2VsZWN0XCJcbiAgICAgIEB1cGRhdGU6bW9kZWwtdmFsdWU9XCJkb1VwZGF0ZVwiXG4gICAgICBAZGlhbG9nLWNsb3NlZD1cImRvUmVmcmVzaFwiXG4gICAgPlxuICAgICAgPHRlbXBsYXRlICNkZWZhdWx0PVwic2NvcGVcIj5cbiAgICAgICAgPGZzLWJ1dHRvbiB0eXBlPVwicHJpbWFyeVwiIGljb249XCJhbnQtZGVzaWduOmVkaXQtb3V0bGluZWRcIiB2LWJpbmQ9XCJidXR0b25cIiBAY2xpY2s9XCJzY29wZS5vcGVuXCI+PC9mcy1idXR0b24+XG4gICAgICA8L3RlbXBsYXRlPlxuICAgIDwvZnMtdGFibGUtc2VsZWN0PlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcbiAgLyoqXG4gICAqIOWAvFxuICAgKi9cbiAgbW9kZWxWYWx1ZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIOaVsOaNruWtl+WFuFxuICAgKi9cbiAgZGljdDogYW55O1xuICAvKipcbiAgICogdGFibGUtc2VsZWN05Y+C5pWwXG4gICAqL1xuICB0YWJsZVNlbGVjdDogYW55O1xuICAvKipcbiAgICogZGljdC1zZWxlY3Tlj4LmlbBcbiAgICovXG4gIGRpY3RTZWxlY3Q/OiBhbnk7XG4gIC8qKlxuICAgKiDmjInpkq7lj4LmlbBcbiAgICovXG4gIGJ1dHRvbj86IGFueTtcbn0+KCk7XG5cbjtcblxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzKFtcbiAgLyoqXG4gICAqIOWFs+mXreWvueivneahhuaXtuinpuWPkVxuICAgKi9cbiAgXCJyZWZyZXNoXCIsXG4gIFwidXBkYXRlOm1vZGVsVmFsdWVcIlxuXSk7XG5mdW5jdGlvbiBkb1JlZnJlc2goKSB7XG4gIGVtaXQoXCJyZWZyZXNoXCIpO1xuICBwcm9wcy5kaWN0Py5yZWxvYWREaWN0KCk7XG59XG5cbmZ1bmN0aW9uIGRvVXBkYXRlKHZhbHVlOiBhbnkpIHtcbiAgZW1pdChcInVwZGF0ZTptb2RlbFZhbHVlXCIsIHZhbHVlKTtcbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cImxlc3NcIj5cbi5mcy1lZGl0YWJsZS1zZWxlY3Qge1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5zZWxlY3Qge1xuICAgIGZsZXg6IDE7XG4gIH1cbiAgLnRhYmxlLXNlbGVjdCB7XG4gICAgZmxleDogMDtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICB9XG59XG48L3N0eWxlPlxuIixudWxsXSwibmFtZXMiOlsiZGVmYXVsdENydWRPcHRpb25zIiwiY3R4Iiwib3B0cyIsImN0IiwibmFtZSIsImNvbXB1dGVkIiwidWkiLCJ1aUNvbnRleHQiLCJ0cmlnZ2VyIiwiZG9DbG9zZSIsInJlc2V0Iiwic3VibWl0IiwidG90YWwiLCJnZXRDYWxsZXJJbmZvIiwiX2EiLCJibGFuayIsImFyZ3MiLCJsb2dJbmZvIiwibG9nV2FybiIsImxvZ0Vycm9yIiwiZXJyb3IiLCJ3YXJuIiwiaW5mbyIsImRlYnVnIiwiY2FsbGVySW5mbyIsImxvZyIsImNhbGxlciIsImxvZ2dlciIsInNldExvZ2dlciIsImxldmVsIiwiaXNFbXB0eSIsInZhbHVlIiwiaXNBbGxFbXB0eSIsInZhbHVlcyIsImhhc0VtcHR5IiwiU3RyaW5nVXRpbHMiLCJ0cmFjZSIsImVuYWJsZSIsIm9uUmVuZGVyVHJpZ2dlcmVkIiwiZXZlbnQiLCJjcmVhdGVBc3luY0NvbXBvbmVudCIsImVzIiwiZGVmaW5lQXN5bmNDb21wb25lbnQiLCJyZXRyeSIsImZhaWwiLCJhdHRlbXB0cyIsImluc3RhbGxBc3luY0NvbXBvbmVudCIsImFwcCIsIm9wdGlvbnMiLCJhc3luY0NvbXBvbmVudCIsImluc3RhbGxBc3luY0NvbXBvbmVudHMiLCJtb2R1bGVzIiwiZXhjbHVkZXMiLCJwaWNrTmFtZUV4cCIsInRyYW5zZm9ybSIsImltcG9ydHMiLCJ0cmFuc2Zvcm1Gcm9tR2xvYiIsImZvckVhY2giLCJpdGVtIiwia2V5IiwiaW5zdGFsbFN5bmNDb21wb25lbnRzIiwiY29tcG9uZW50cyIsInJlc3VsdCIsImNhbWVsQ2FzZSIsInVwcGVyRmlyc3QiLCJsb2FkQXN5bmNDb21wb25lbnRGcm9tR2xvYiIsIm1hcCIsImxvYWRDb21wb25lbnRGcm9tR2xvYiIsInZpdGUiLCJUYWJsZVN0b3JlIiwiX19wdWJsaWNGaWVsZCIsInRhYmxlTmFtZSIsInByZWZpeCIsInRhYmxlSWQiLCJzYXZlZCIsInRhYmxlIiwiJHJvdXRlIiwia2V5VHlwZSIsInJ4QXJySW5kZXgiLCJyeFZhck5hbWUiLCJyeFF1b3QiLCJqb2luUGF0aHMiLCJwYXRocyIsImFjYyIsInAiLCJnZXRQYXRoVG9TdHJpbmciLCJfIiwicGF0aFRvU3RyaW5nIiwicGF0aCIsInByZWZpeGVzIiwidHlwZSIsImhhcyIsImlzT2JqZWN0IiwiZ2V0SXRlcmF0ZSIsIml0ZXJhdGUiLCJvYmoiLCJjYWxsYmFjayIsImJyb2tlbiIsImJyZWFrSXQiLCJkZXNjcmliZVZhbHVlIiwicGFyZW50IiwiY3AiLCJpIiwiY2hpbGRyZW4iLCJjb250ZXh0UmVhZGVyIiwiQ29udGV4dFJlYWRlciIsImVyciIsInNjcCIsImdldEVsZW1lbnRzIiwiZ2V0T3duQ2hpbGRyZW4iLCJjaGlsZHJlblBhdGgiLCJzdHJDaGlsZHJlblBhdGgiLCJzdHJDaGlsZFBhdGhQcmVmaXgiLCJyZXMiLCJ2YWwiLCJzdHJDaGlsZFBhdGgiLCJwYXRoRm9ybWF0U3RyaW5nIiwiY2hpbGRLZXkiLCJhZnRlckl0ZXJhdGUiLCJjdXJQYXJlbnQiLCJpc09iamVjdEVtcHR5Iiwib3duUHJvcGVydGllc09ubHkiLCJnZXRFYWNoRGVlcCIsImVhY2hEZWVwIiwiaWRlbnRpdHkiLCJtZXJnZSIsImlzU3RyaW5nIiwidG9QYXRoIiwiZm9yRWFjaERlZXAiLCJkZWVwZGFzaCIsImRhc2giLCJyZWYiLCJza2lwcyIsImtleXMiLCJwQXR0cnMiLCJ1dGlscyIsInN0cmluZ3MiLCJzdG9yZSIsImFudGR2Q29sc3BhbiIsImxhYmVsU3BhbiIsImFzc2lzdCIsInVzZVVpIiwiYnV0dG9uIiwiY2FzY2FkZXIiLCJ6aENOIiwiZW4iLCJ0IiwiZ2V0IiwiYXJnIiwiaW5kZXgiLCJJMThuIiwiaW5zdGFuY2UiLCJsb2NhbGVzIiwibWVzc2FnZSIsImZzQ2xvbmUiLCJjbG9uZURlZXAiLCJpMThuIiwidXNlSTE4biIsImUiLCJtb2R1bGUiLCJ0aGlzIiwibiIsInIiLCJzIiwiYSIsImRheWpzIiwiYWR2YW5jZWRGb3JtYXQiLCJkb0Zvcm1hdCIsImRhdGUiLCJmb3JtYXQiLCJkYXRlRm9ybWF0dGVyIiwiZGF0ZXJhbmdlRm9ybWF0dGVyIiwiZGF0ZXRpbWVyYW5nZUZvcm1hdHRlciIsImYiLCJvIiwidSIsImQiLCJ3ZWVrZGF5IiwibG9jYWxlRGF0YSIsIndlZWtPZlllYXIiLCJkYXRlJDEiLCJidWlsZERhdGVWYWx1ZSIsInNjb3BlIiwicm93IiwiZWwiLCJpY29uIiwibnVtYmVyJDEiLCJwaG9uZSIsImNvbHVtbiIsInJldCIsInNlbGVjdCIsInRleHQiLCJ0cmVlIiwidHlwZUxpc3QiLCJkZWZhdWx0VHlwZUNyZWF0b3JzIiwiZGVmYXVsdFR5cGVzIiwiZ2V0VHlwZXMiLCJnZXRUeXBlIiwiYWRkVHlwZXMiLCJuZXdUeXBlcyIsInR5cGVzJDEiLCJjcmVhdG9yIiwiX3NmY19tYWluJEQiLCJkZWZpbmVDb21wb25lbnQiLCJwYWdlUmVmIiwib25Nb3VudGVkIiwiX2hvaXN0ZWRfMSIsIl9ob2lzdGVkXzIiLCJfaG9pc3RlZF80IiwiJHNsb3RzIiwiX2N0eCIsIl9jYWNoZSIsIiRwcm9wcyIsIiRzZXR1cCIsIiRkYXRhIiwiJG9wdGlvbnMiLCJfb3BlbkJsb2NrIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9jcmVhdGVDb21tZW50Vk5vZGUiLCJfY3JlYXRlRWxlbWVudFZOb2RlIiwiX2hvaXN0ZWRfMyIsImlzVW5NZXJnZWFibGUiLCJzcmNWYWx1ZSIsIlVuTWVyZ2VhYmxlIiwiaXNSZWYiLCJpc1VuQ2xvbmVhYmxlIiwidGFyZ2V0Iiwic291cmNlcyIsImN1c3RvbWl6ZXIiLCJvYmpWYWx1ZSIsImlzQXJyYXkiLCJmb3VuZCIsIm1lcmdlV2l0aCIsImNsb25lRGVlcFdpdGgiLCJVbk1lcmdlYWJsZSQxIiwiY2xvbmVhYmxlIiwidXNlTWVyZ2UiLCJpc0FzeW5jQ29tcHV0ZSIsIkFzeW5jQ29tcHV0ZVZhbHVlIiwiaXNTeW5jQ29tcHV0ZSIsIkNvbXB1dGVWYWx1ZSIsImZpbmRDb21wdXRlVmFsdWVzIiwiaXNBc3luYyIsImZvdW5kTWFwIiwiY2hlY2tGdW5jIiwiY29udGV4dCIsImV4Y2x1ZGUiLCJpc1NoYWxsb3ciLCJkb0FzeW5jQ29tcHV0ZSIsImRlcGVuZEFzeW5jVmFsdWVzIiwiZ2V0Q29udGV4dEZuIiwiYXN5bmNWYWx1ZU1hcCIsInNldEFzeW5jQ29tcHV0ZVZhbHVlIiwiYXN5bmNWYWx1ZXNNYXAiLCJ2YWx1ZVJlZiIsInNldCIsImRvQ29tcHV0ZWQiLCJnZXRUYXJnZXRGdW5jIiwidXNlckNvbXB1dGVkRm4iLCJkZXBlbmRWYWx1ZXMiLCJhc3luY0NvdW50Iiwic3luY0NvdW50IiwiY29tcHV0ZUZuIiwiY29tcHV0ZSIsImFzeW5jRm4iLCJkZWZhdWx0VmFsdWUiLCJhc3luY1JlZiIsImNvbXB1dGVkVmFsdWUiLCJ3YXRjaCIsImFzeW5jQ29tcHV0ZSIsInVzZUNvbXB1dGUiLCJDb25zdGFudHMiLCJtZXJnZUNvbHVtblBsdWdpbnMiLCJyZWdpc3Rlck1lcmdlQ29sdW1uUGx1Z2luIiwicGx1Z2luIiwicmVtb3ZlIiwicHVzaCIsInNvcnQiLCJiIiwib3JkZXIiLCJtZXJnZUNvbHVtbkRpY3QiLCJkaWN0IiwiY29tcG9uZW50Iiwic2hhbGxvd1JlYWN0aXZlIiwiZm9ybSIsIm1lcmdlQ29sdW1uVHlwZSIsInR5cGVDaGFpbiIsIkFycmF5IiwiYmFzZSIsInR5cGVPcHRpb25zIiwidHlwZXMiLCJtZXJnZVBsdWdpbnMiLCJoYW5kbGUiLCJjb2x1bW5Qcm9wcyIsImNydWRPcHRpb25zIiwic2V0dGluZ3MiLCJ2aWV3Rm9ybVVzZUNlbGxDb21wb25lbnQiLCJ2aWV3Rm9ybUNvbHVtbiIsImluY2x1ZGVzIiwicmVuZGVyIiwiX2NyZWF0ZVZOb2RlIiwidmlld0Zvcm0iLCJhZGRGb3JtIiwicnVsZXMiLCJydWxlIiwiZWRpdEZvcm0iLCJzZWFyY2giLCJtZXJnZVBsdWdpbiIsInNldHVwT3B0aW9uc0NvbHVtbnMiLCJjb2x1bW5zIiwidXNlck9wdGlvbnMiLCJpbml0ZWRDb2x1bW5zIiwiYnVpbGRPcHRpb25zQ29sdW1uc0ZsYXRNYXAiLCJidWlsZFRhYmxlQ29sdW1uc0ZsYXRNYXAiLCJidWlsZFRhYmxlQ29sdW1uIiwiY29sVGVtcGxhdGUiLCJ0YWJsZUNvbHVtbiIsInRpdGxlIiwiYnVpbGRUYWJsZUNvbHVtbnMiLCJ3cmFwcGVyQ3VzdG9tQ29tcG9uZW50IiwicmVhY3RpdmUiLCJzaGFsbG93UmVmIiwidGFibGVDb2x1bW5zIiwiZG9Db2x1bW5zU29ydCIsImRvQXJyYXlTb3J0IiwiYXJyIiwic29ydEJ5Iiwib3JkZXJEZWZhdWx0IiwibGlzdCIsInNpemUiLCJjb2x1bW5zQXJyIiwiY29sdW1uc01hcCIsImJ1aWxkRm9ybUNvbHVtbnMiLCJjb2x1bW5zRmxhdE1hcCIsImZvcm1UeXBlIiwiZm9ybUNvbHVtbnMiLCJmb3JtQ29sdW1uIiwiYnVpbGRGb3JtIiwiYmFzZU9wdGlvbnMiLCJvbkNvbXBsZXRlIiwiYnVpbGRTZWFyY2hGb3JtIiwic2VhcmNoQ29sdW1ucyIsImZvcm1Db2x1bW5zRm9yU2VhcmNoIiwiY29weVByb3BzIiwic2VhcmNoQ29weUZvcm1Qcm9wcyIsImNvcHlGcm9tQ29tcG9zaXRpb25Db2x1bW4iLCJmaWVsZCIsImNvbW1vbiIsImRlZiIsInBpY2siLCJidWlsZEZvcm1PcHRpb25zIiwibW9kZSIsImRlZmF1bHRPcHRpb25zIiwiY29tbW9uT3B0aW9ucyIsImNydWRFeHBvc2UiLCJidWlsZENvbHVtbnMiLCJ0b29sYmFyIiwiY29sdW1uc0ZpbHRlciIsIm9yaWdpbmFsQ29sdW1ucyIsImRpc2FibGVkIiwiZWRpdGFibGUiLCJmb3JFYWNoVGFibGVDb2x1bW5zIiwiZm9yRWFjaENvbHVtbnMiLCJ1c2VDb2x1bW5zIiwic2VlZCIsIkZzRm9ybVdyYXBwZXJMaXN0IiwiY3JlYXRlRm9ybVdyYXBwZXIiLCJpZCIsImNvbnRhaW5lciIsInJlc29sdmUiLCJyZWplY3QiLCJ2Tm9kZSIsImNyZWF0ZVZOb2RlIiwiRnNGb3JtV3JhcHBlciIsInZtIiwidXNlRm9ybVdyYXBwZXIiLCJwZCIsImluamVjdCIsIm9wZW5EaWFsb2ciLCJvcGVuQ3J1ZEZvcm1EaWFsb2ciLCJmb3JtT3B0aW9ucyIsImRvTWVyZ2UiLCJ1c2VFZGl0YWJsZSIsInByb3BzIiwiY3J1ZEJpbmRpbmciLCJfYyIsIl9iIiwiY3VzdG9tUm93SGFuZGxlQWN0aXZlIiwiX2QiLCJfZSIsIm9uRW5hYmxlZCIsImVkaXRhYmxlT3B0cyIsImVkaXRhYmxlSWQiLCJlZGl0YWJsZVJvdyIsImlzQWRkIiwic2V0RGF0YSIsInJvd0RhdGEiLCJkYXRhIiwidXNlRXhwb3NlIiwiY3J1ZFJlZiIsImZvcm1XcmFwcGVyUHJvdmlkZXIiLCJjaGVja0NydWRSZWYiLCJjaGVja0NydWRCaW5kaW5nUmVmIiwiZm9ybVdyYXBwZXJSZWYiLCJmb3JtUmVmIiwicmVjb3JkcyIsInRvUmF3IiwidmFsdWVCdWlsZGVyQ29sdW1ucyIsImNvbCIsInBhZ2VRdWVyeSIsInBhZ2UiLCJzZWFyY2hGb3JtRGF0YSIsInF1ZXJ5IiwidXNlclBhZ2VRdWVyeSIsInVzZXJQYWdlUmVzIiwiZGlzYWJsZUxvYWRpbmciLCJ1bnJlZiIsInBhZ2VSZXMiLCJjdXJyZW50UGFnZSIsInBhZ2VTaXplIiwiZnNUYWJsZVJlZiIsIm5vIiwidGFibGVSZWYiLCJyb3dLZXkiLCJyZW1vdmVCaW5kaW5nIiwiaXNMb2NhbCIsInJlbW92ZVNjb3BlIiwiZm9ybU9wdHMiLCJ4eEZvcm0iLCJsb2FkRnNFeHBvcnRVdGlsIiwiZWFjaCIsImxvYWRGc0ltcG9ydFV0aWwiLCJkZWZhdWx0RGF0YUZvcm1hdHRlciIsIm9yaWdpbmFsUm93Iiwibm9kZXMiLCJsYWJlbCIsIm5vZGUiLCJleHBvcnRUYWJsZSIsImV4cG9ydENvbCIsImV4cG9ydFV0aWwiLCJvcmlnaW5hbERhdGEiLCJzZWFyY2hQYXJhbXMiLCJjbG9uZSIsIm1hcHBpbmciLCJleHBPcHRzIiwiaW1wb3J0VGFibGUiLCJpbXBvcnREYXRhIiwiaXNFZGl0YWJsZSIsImNydWRPcHRpb25zUGx1Z2lucyIsInJlZ2lzdGVyQ3J1ZE9wdGlvbnNQbHVnaW4iLCJnZXRDcnVkT3B0aW9uc1BsdWdpbiIsInNlbGVjdGlvbiIsImdldFJvd0tleSIsInRhYmxlQ0kiLCJjaGFuZ2VkIiwic2VsZWN0ZWRSb3dLZXlzIiwibmV4dFRpY2siLCJtb2JpbGVBZGFwdG9yIiwicm93SGFuZGxlIiwiYnV0dG9ucyIsIm5ld0J1dHRvbnMiLCJidXR0b25zS2V5Iiwid2lkdGhSZWYiLCJ1c2VDcnVkIiwiZXhwb3NlIiwiZG9SZWZyZXNoIiwiZG9WYWx1ZVJlc29sdmUiLCJ1c2VQYWdpbmF0aW9uIiwiY3VycmVudCIsInVzZUZvcm1TdWJtaXQiLCJ1c2VSb3dIYW5kbGUiLCJ1c2VTZWFyY2giLCJiYXNlVGFibGVSZWYiLCJ1c2VUYWJzIiwiZm9ybURhdGEiLCJ1c2VUb29sYmFyIiwiZXhwb3J0aW5nIiwib3JpZ2luYWwiLCJ1cGRhdGVDb2x1bW5zIiwib2xkIiwib2xkQ29sdW1uIiwibmV3Q29sdW1uIiwibmV3Q29sdW1ucyIsInVzZVRhYmxlIiwic29ydENoYW5nZSIsImlzU2VydmVyU29ydCIsInByb3AiLCJhc2MiLCJvbGRTb3J0IiwidXNlQWN0aW9uYmFyIiwiYWN0aXZlUm93cyIsImFmdGVyVXNlQ3J1ZCIsImJpbmRpbmdzIiwicmVidWlsZENydWRCaW5kaW5ncyIsImlucHV0T3B0cyIsInVzZXJPcHRzIiwicGx1Z2lucyIsInBsdWciLCJiZWZvcmUiLCJwbHVnaW5PcHRpb25zIiwicmVzZXRDcnVkT3B0aW9ucyIsImFwcGVuZENydWRPcHRpb25zIiwib3Zlck9wdGlvbnMiLCJuZXdPcHRpb25zIiwiYXBwZW5kQ3J1ZEJpbmRpbmciLCJ1c2VGc0ltcGwiLCJjcmVhdGVDcnVkT3B0aW9ucyIsImNydWRFeHBvc2VSZWYiLCJjcmVhdGVDcnVkT3B0aW9uc1JldCIsImluaXRDcnVkIiwidXNlQ3J1ZFByb3BzIiwidXNlQ3J1ZFJldCIsInVzZUZzIiwidXNlRnNBc3luYyIsInVzZUZzUmVmIiwidXNlRGljdCIsInZNb2RlbCIsImNyZWF0ZUNvbXB1dGVkT3B0aW9ucyIsIm9wdGlvbiIsImdldFZhbHVlIiwiZ2V0TGFiZWwiLCJnZXREaWN0IiwiZ2V0U2NvcGUiLCJnZXRDdXJyZW50U2NvcGUiLCJwcm94eSIsImdldEN1cnJlbnRJbnN0YW5jZSIsImxvYWREaWN0IiwicmVsb2FkIiwicmVsb2FkRGljdCIsImNsZWFyRGljdCIsIndhdGNoVmFsdWUiLCJnZXREaWN0RGF0YSIsImdldFByb3BWYWx1ZSIsImF0dHIiLCJyZW1vdmVQcm9wVmFsdWUiLCJnZXRDaGlsZHJlbiIsInBlcmYiLCJ3YXJuZWQiLCJQUk9DRVNTIiwiZW1pdFdhcm5pbmciLCJtc2ciLCJjb2RlIiwiZm4iLCJBQyIsIkFTIiwid2FybkFDUG9seWZpbGwiLCJyZWFzb24iLCJwcmludEFDUG9seWZpbGxXYXJuaW5nIiwic2hvdWxkV2FybiIsImlzUG9zSW50IiwiZ2V0VWludEFycmF5IiwibWF4IiwiWmVyb0FycmF5IiwiX1N0YWNrIiwiSGVhcENscyIsIl9fcHJpdmF0ZUdldCIsIl9jb25zdHJ1Y3RpbmciLCJfX3ByaXZhdGVTZXQiLCJfX3ByaXZhdGVBZGQiLCJTdGFjayIsIl9MUlVDYWNoZSIsIl9pbml0aWFsaXplVFRMVHJhY2tpbmciLCJfaW5pdGlhbGl6ZVNpemVUcmFja2luZyIsIl9pbmRleGVzIiwiX3JpbmRleGVzIiwiX2lzVmFsaWRJbmRleCIsIl9ldmljdCIsIl9iYWNrZ3JvdW5kRmV0Y2giLCJfaXNCYWNrZ3JvdW5kRmV0Y2giLCJfY29ubmVjdCIsIl9tb3ZlVG9UYWlsIiwiX2RlbGV0ZSIsIl9jbGVhciIsIl9tYXgiLCJfbWF4U2l6ZSIsIl9kaXNwb3NlIiwiX2Rpc3Bvc2VBZnRlciIsIl9mZXRjaE1ldGhvZCIsIl9tZW1vTWV0aG9kIiwiX3NpemUiLCJfY2FsY3VsYXRlZFNpemUiLCJfa2V5TWFwIiwiX2tleUxpc3QiLCJfdmFsTGlzdCIsIl9uZXh0IiwiX3ByZXYiLCJfaGVhZCIsIl90YWlsIiwiX2ZyZWUiLCJfZGlzcG9zZWQiLCJfc2l6ZXMiLCJfc3RhcnRzIiwiX3R0bHMiLCJfaGFzRGlzcG9zZSIsIl9oYXNGZXRjaE1ldGhvZCIsIl9oYXNEaXNwb3NlQWZ0ZXIiLCJfdXBkYXRlSXRlbUFnZSIsIl9zdGF0dXNUVEwiLCJfc2V0SXRlbVRUTCIsIl9pc1N0YWxlIiwiX3JlbW92ZUl0ZW1TaXplIiwiX2kiLCJfYWRkSXRlbVNpemUiLCJfcyIsIl9zdCIsIl9yZXF1aXJlU2l6ZSIsIl9rIiwiX3YiLCJzaXplQ2FsY3VsYXRpb24iLCJ0dGwiLCJ0dGxSZXNvbHV0aW9uIiwidHRsQXV0b3B1cmdlIiwidXBkYXRlQWdlT25HZXQiLCJ1cGRhdGVBZ2VPbkhhcyIsImFsbG93U3RhbGUiLCJkaXNwb3NlIiwiZGlzcG9zZUFmdGVyIiwibm9EaXNwb3NlT25TZXQiLCJub1VwZGF0ZVRUTCIsIm1heFNpemUiLCJtYXhFbnRyeVNpemUiLCJmZXRjaE1ldGhvZCIsIm1lbW9NZXRob2QiLCJub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24iLCJub0RlbGV0ZU9uU3RhbGVHZXQiLCJhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiIsImFsbG93U3RhbGVPbkZldGNoQWJvcnQiLCJpZ25vcmVGZXRjaEFib3J0IiwiVWludEFycmF5IiwiX19wcml2YXRlTWV0aG9kIiwiaW5pdGlhbGl6ZVNpemVUcmFja2luZ19mbiIsImluaXRpYWxpemVUVExUcmFja2luZ19mbiIsImMiLCJpc0JhY2tncm91bmRGZXRjaF9mbiIsImsiLCJiYWNrZ3JvdW5kRmV0Y2hfZm4iLCJtb3ZlVG9UYWlsX2ZuIiwiaW5kZXhlc19mbiIsInJpbmRleGVzX2ZuIiwiZ2V0T3B0aW9ucyIsInYiLCJ0aGlzcCIsImRlbGV0ZWQiLCJkZWxldGVfZm4iLCJlbnRyeSIsInN0YXJ0IiwicmVtYWluIiwiYWdlIiwic2V0T3B0aW9ucyIsInN0YXR1cyIsImV2aWN0X2ZuIiwiX19wcml2YXRlV3JhcHBlciIsIm9sZFZhbCIsIm9sZFZhbHVlIiwiZHQiLCJ0YXNrIiwiaGFzT3B0aW9ucyIsInBlZWtPcHRpb25zIiwiZmV0Y2hPcHRpb25zIiwiZm9yY2VSZWZyZXNoIiwic2lnbmFsIiwic3RhbGUiLCJpc1N0YWxlIiwic3RhbGVWYWwiLCJtZW1vT3B0aW9ucyIsInZ2IiwiZmV0Y2hpbmciLCJjbGVhcl9mbiIsInR0bHMiLCJzdGFydHMiLCJjYWNoZWROb3ciLCJnZXROb3ciLCJzaXplcyIsImlzVmFsaWRJbmRleF9mbiIsImZyZWUiLCJoZWFkIiwiYWMiLCJmZXRjaE9wdHMiLCJjYiIsInVwZGF0ZUNhY2hlIiwiYWJvcnRlZCIsImlnbm9yZUFib3J0IiwiZmV0Y2hGYWlsIiwiYmYiLCJlYiIsImVyIiwiYWxsb3dTdGFsZUFib3J0ZWQiLCJub0RlbGV0ZSIsInBjYWxsIiwicmVqIiwiZm1wIiwiY29ubmVjdF9mbiIsInBpIiwibmkiLCJMUlVDYWNoZSIsIkRpY3RHbG9iYWxDYWNoZSIsInNldERpY3RSZXF1ZXN0IiwicmVxdWVzdCIsImRpY3RSZXF1ZXN0IiwiRGljdCIsImNhY2hlS2V5IiwiY2FjaGVkIiwiY2FsbCIsIm5vdGlmeSIsInRvRmV0Y2hWYWx1ZXMiLCJnZXRGcm9tUmVtb3RlIiwidXJsIiwibWF5YmVBcnIiLCJkaWN0RGF0YSIsImNvbmZpZyIsInVzZURpY3REZWZpbmUiLCJ1c2VUeXBlcyIsImRyYWdNb2RhbEZvckFudGR2IiwiZGlhbG9nRWwiLCJkaWFsb2dIZWFkZXJFbCIsImRyYWdEb20iLCJzdHkiLCJYIiwiWSIsInN0eUwiLCJzdHlUIiwibCIsImRyYWdNb2RhbEZvck5haXZlIiwiZHJhZ01vZGFsIiwidXNlRHJhZyIsIkdsb2JhbENvbmZpZyIsIl9zZmNfbWFpbiRDIiwiY29tcHV0ZWRJbm5lclN0eWxlIiwiY29tcHV0ZWRCb2R5U3R5bGUiLCJfc2ZjX3JlbmRlciIsIl9ub3JtYWxpemVTdHlsZSIsIl9yZW5kZXJTbG90IiwiX3NmY19tYWluJEIiLCJfY29tcG9uZW50X2ZzX2NvbnRhaW5lciIsIl9yZXNvbHZlQ29tcG9uZW50IiwiX2NyZWF0ZUJsb2NrIiwiX3dpdGhDdHgiLCJfaG9pc3RlZF81IiwiX3NmY19tYWluJEEiLCJnZXRDcnVkQmluZGluZyIsInNlYXJjaFNob3ciLCJjYXJkQ29tcG9uZW50TmFtZSIsIl9yZXNvbHZlRHluYW1pY0NvbXBvbmVudCIsIl9pc1Nsb3QiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsIl9pc1ZOb2RlIiwiaW5oZXJpdEF0dHJzIiwiU3RyaW5nIiwiZGVmYXVsdCIsInJlcXVpcmVkIiwiRnVuY3Rpb24iLCJpY29uUmlnaHQiLCJjaXJjbGUiLCJCb29sZWFuIiwidG9vbHRpcCIsInVuZGVmaW5lZCIsImJ1dHRvblByb3BzIiwiY2xhc3NOYW1lIiwic2V0dXAiLCJpY29uUmVuZGVyIiwiaWNvbkNsYXNzIiwiX21lcmdlUHJvcHMiLCJyZW5kZXJCdG4iLCJpc0ljb25TbG90IiwiaXNJY29uUHJvcCIsImljb25Qcm9wIiwic2xvdHMiLCJpc0NpcmNsZSIsImJ1dHRvbkNvbXAiLCJyZXNvbHZlRHluYW1pY0NvbXBvbmVudCIsImJ0blByb3BzIiwiY2xhc3MiLCJhdHRycyIsImgiLCJ0b29sdGlwQ29tcCIsImNvbXB1dGVUb29sdGlwUHJvcHMiLCJvbWl0IiwidHJpZ2dlclNsb3ROYW1lIiwicmVxdWlyZSIsImNvbXB1dGVkUmVuZGVyRnVuYyIsImluZGV4T2YiLCJzdGFydHNXaXRoIiwiSWNvbkNvbXAiLCJyZXBsYWNlIiwiaXNDb21wb25lbnQiLCJfc2ZjX21haW4keiIsIkljb24iLCJfbm9ybWFsaXplQ2xhc3MiLCJfc2ZjX21haW4keSIsInN5bWJvbElkIiwiZ2V0U3R5bGUiLCJzcGluIiwiX3NmY19tYWluJHgiLCJsYWJlbEF0dHJzIiwiX2NyZWF0ZVRleHRWTm9kZSIsIl90b0Rpc3BsYXlTdHJpbmciLCJfX2RlZmF1bHRfXyIsIl9fTUFDUk9TX2RlZmluZUNvbXBvbmVudCIsImxvYWRpbmciLCJfY29tcG9uZW50X2ZzX2ljb24iLCJfdW5yZWYiLCJfc2ZjX21haW4kdiIsIm1lcmdlRXZlbnRIYW5kbGVzIiwiZXZlbnROYW1lIiwiZXZlbnRzIiwiJGV2ZW50IiwiaHRtbFRhZ3MiLCJtb2RlbFZhbHVlIiwib24iLCJ1bmRlZmluZVRvTnVsbCIsImVtaXRzIiwicHJvdmlkZSIsImVtaXQiLCJ0YXJnZXRSZWYiLCJhbGxBdHRycyIsInRyaW0iLCJudW1iZXIiLCJvblVwZGF0ZU1vZGVsVmFsdWVOYW1lIiwidG1wIiwiTnVtYmVyIiwiaXNOYU4iLCJoYW5kbGVyIiwiY2hpbGRyZW5SZW5kZXIiLCJjcmVhdGVDaGlsZHJlbiIsImNvbXB1dGVkSW5wdXRDb21wIiwiaXNBc3luY0NvbXBvbmVudCIsImlucHV0IiwiaW5wdXRDb21wIiwicmVzb2x2ZUNvbXBvbmVudCIsImNoaWxkcmVuUmVuZGVyZWQiLCJnZXRUYXJnZXRSZWYiLCJnZXRUYXJnZXRSZWZBc3luYyIsImdldFRhcmdldFJlZlN5bmMiLCJQcm9taXNlIiwiZ2V0VGFyZ2V0UmVmRGVsYXkiLCJjb3VudCIsInNldFRpbWVvdXQiLCJFcnJvciIsIl9zbG90IiwibWVyZ2VkIiwibWVyZ2VQcm9wcyIsIm1hcmtSYXciLCJmdW5jdGlvbmFsIiwicmVuZGVyRnVuYyIsIl9zZmNfbWFpbiR1IiwiY3JlYXRlSW5pdGlhbEZvcm0iLCJkZWZWYWx1ZSIsImluaXRpYWxGb3JtIiwic2V0Rm9ybURhdGEiLCJnZXRDb21wb25lbnRSZWYiLCJjb21wdXRlZENvbHVtbnMiLCJkb1ZhbHVlQnVpbGRlciIsImdldEZvcm1EYXRhIiwidmFsdWVDaGFuZ2UiLCJkb1ZhbHVlQ2hhbmdlIiwibWVyZ2VDb2wiLCJidWlsZEl0ZW1TY29wZSIsImZvcm1JdGVtUmVmcyIsImdldEZvcm1JdGVtUmVmIiwiZ3JvdXBBY3RpdmVLZXkiLCJncm91cEl0ZW0iLCJjb21wdXRlZEdyb3VwIiwiZ3JvdXAiLCJncm91cGVkS2V5cyIsIndyYXBwZXIiLCJjb21wdXRlZERlZmF1bHRDb2x1bW5zIiwiZ2V0Rm9ybVJlZiIsImVudHJpZXNSZXQiLCJlbnRyaWVzIiwiaW5pdGlhbFZhbHVlIiwidW5zZXQiLCJ2YWxpZFJlZiIsImVycm9yc1JlZiIsImZpbGxHcm91cEVycm9yIiwiZmllbGRFcnJvcnMiLCJ2YWxpZGF0ZSIsInZhbGlkYXRlU2NvcGUiLCJ2YWxpZGF0ZUVycm9ycyIsInN1Ym1pdFNjb3BlIiwiZm9ybUl0ZW1TaG93IiwiZ3JvdXBJdGVtU2hvdyIsIm5ld1ZhbCIsImlzRGlydHkiLCJhZnRlciIsIm1lcmdlZFNsb3RzIiwiZGlzcGxheSIsIl9GcmFnbWVudCIsIl9yZW5kZXJMaXN0IiwiaGVscGVyIiwiZ3JvdXBLZXkiLCJfY3JlYXRlU2xvdHMiLCJfY29tcG9uZW50X2ZzX2Zvcm1faXRlbV9jb2wiLCJzbG90TmFtZSIsIl9jb21wb25lbnRfZnNfcmVuZGVyIiwiX3NmY19tYWluJHQiLCJGc1JlbmRlciIsImNvbXBvbmVudFJlbmRlclJlZiIsInNjb3BlRnVuYyIsInVwZGF0ZU1vZGVsVmFsdWUiLCJjb21wdXRlZEl0ZW0iLCJjb21wdXRlZEhlbHBlclBvc2l0aW9uIiwiY29tcHV0ZWRIZWxwZXJUb29sdGlwIiwiY29tcHV0ZWRLZXkiLCJjb21wdXRlZExhYmVsIiwiY29tcHV0ZWRMYWJlbElzUmVuZGVyIiwiX2NvbXBvbmVudF9mc19jb21wb25lbnRfcmVuZGVyIiwiX25vcm1hbGl6ZVByb3BzIiwiX2hvaXN0ZWRfNiIsImZvcm1TbG90IiwiX2hvaXN0ZWRfNyIsIl9jb21wb25lbnRfZnNfc2xvdF9yZW5kZXIiLCJfY29tcG9uZW50X2ZzX2Zvcm1faGVscGVyIiwiX19wcm9wcyIsInVzZUF0dHJzIiwiZm9ybUl0ZW1SZWYiLCJfX2V4cG9zZSIsIl9jb21wb25lbnRfZnNfZm9ybV9pdGVtIiwiX3NmY19tYWluJHIiLCJpbm5lciIsImlubmVyV3JhcHBlciIsInpJbmRleCIsImZvcm1XcmFwcGVyT3BlbiIsImZvcm1XcmFwcGVySXMiLCJmb3JtV3JhcHBlckJpbmQiLCJmb3JtV3JhcHBlck9wdHMiLCJlbWl0T25DbG9zZWQiLCJlbWl0T25PcGVuZWQiLCJiZWZvcmVDbG9zZUN1c3RvbSIsImZvcm1XcmFwcGVySWQiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJmb3JtV3JhcHBlcklkQ2xhc3MiLCJmb3JtV3JhcHBlclNsb3RzIiwiYnVpbGRFdmVudCIsImNsb3NlIiwib25DbG9zZWQiLCJvbk9wZW5lZCIsIm9wZW4iLCJmdWxsc2NyZWVuRW5hYmxlZCIsImZ1bGxzY3JlZW4iLCJjb21wdXRlZEJ1dHRvbnMiLCJvblZhbHVlQ2hhbmdlIiwiaW5uZXJCaW5kIiwid3JhcHBlckJpbmRSZWYiLCJmb3JtT3B0aW9uc1JlZiIsInRvZ2dsZUZ1bGxzY3JlZW4iLCJvbk9wZW4iLCJpcyIsImN1c3RvbUNsYXNzS2V5IiwiZm9ybVdyYXBwZXIiLCJjdXN0b21DbGFzcyIsImJlZm9yZUNsb3NlIiwiZG9TYXZlUmVtaW5kIiwic2F2ZVJlbWluZCIsIm5lZWRTYXZlIiwibWVzc2FnZUJveCIsImNvbmZpcm0iLCJjb25maXJtQnV0dG9uVGV4dCIsImNhbmNlbEJ1dHRvblRleHQiLCJyb3V0ZSIsInVzZVJvdXRlIiwiZHJhZnRTdG9yZSIsImdldERyYWZ0U3RvcmUiLCJzYXZlRHJhZnQiLCIkcm91dGVyIiwiZG9TYXZlRHJhZnQiLCJ1cGRhdGVUYWJsZVZhbHVlIiwiY2xlYXJEcmFmdCIsImNsZWFyVGFibGVWYWx1ZSIsImxvYWREcmFmdCIsImRyYWZ0IiwiZ2V0VGFibGVWYWx1ZSIsIm1lcmdlRm9ybSIsInNhdmVkRHJhZnQiLCJlbGVtZW50QmVmb3JlQ2xvc2VGaXgiLCJkb25lIiwiZHJhZ2dhYmxlIiwiZHJhZ2VuYWJsZWQiLCJnZXRNb2RhbCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsImdldENvbXB1dGVDb250ZXh0IiwiY29tcHV0ZWRDdXN0b21CdXR0b25zIiwiZGVmQnRucyIsImNhbmNlbCIsIm9rIiwiYnV0dG9uc0FyciIsIm9uQ2xpY2siLCJjbGljayIsImV4cG9zZWQiLCJlbmRzV2l0aCIsImJ1aWxkSW5uZXJCaW5kIiwiZ2V0SW5uZXJXcmFwcGVyIiwiaW5uZXJDb250YWluZXJTZWxlY3RvciIsImNsYXNzTGlzdCIsImFkZCIsImNvbnNvbGUiLCJ1c2VTbG90cyIsIl9zbG90cyIsInNsb3RzUmVuZGVyIiwiX3NlbGYiLCJ0aXRsZVNsb3ROYW1lIiwiZnVsbFNjcmVlbkljb24iLCJpY29ucyIsImZ1bGxTY3JlZW4iLCJ1bkZ1bGxTY3JlZW4iLCJzaG93IiwiaGFzQ29udGVudFdyYXAiLCJjb250ZW50V3JhcCIsInN1YkNoaWxkcmVuIiwiY29udGVudFdyYXBDb21wIiwidmlzaWJsZSIsInZDbG9zZWQiLCJidWlsZE9uQ2xvc2VkQmluZCIsInZDdXN0b21DbGFzcyIsInZGdWxsU2NyZWVuIiwidlN0eWxlIiwiZm9ybVdyYXBwZXJDb21wIiwiZm9ybVdyYXBwZXJMaXN0IiwidXNlUHJvdmlkZXJzIiwic2VhcmNoUmVmIiwiZ2V0U2VhcmNoUmVmIiwiZ2V0U2VhcmNoRm9ybURhdGEiLCJnZXRTZWFyY2hWYWxpZGF0ZWRGb3JtRGF0YSIsInNldFNlYXJjaEZvcm1EYXRhIiwic2VhcmNoUmV0IiwiZGVmYXVsdFRhYnMiLCJfZyIsIl9mIiwic2xvdEZpbHRlciIsImN0eFNsb3RzIiwia2V5UHJlZml4IiwidXNlRml4ZWRIZWlnaHQiLCJjb250YWluZXJSZWYiLCJtYXhIZWlnaHRSZWYiLCJjb21wdXRlQm9keUhlaWdodCIsInRhYmxlRG9tIiwiaGVhZERvbSIsInRhYmxlSGVpZ2h0IiwiaGVhZEhlaWdodCIsInV0aWxMb2ciLCJ3YXRjaEJvZHlIZWlnaHRDaGFuZ2UiLCJ0YWJsZVdyYXBwZXJEb20iLCJ0b29sYmFyUmVmIiwidGFibGVQcm9wUmVmIiwidG9SZWYiLCJjb21wdXRlZFRhYmxlIiwiZml4ZWRIZWlnaHQiLCJjb21wdXRlZFRvb2xiYXIiLCJjb21wdXRlZENlbGxTbG90cyIsImNvbXB1dGVkRm9ybVNsb3RzIiwiY29tcHV0ZWRTZWFyY2hTbG90cyIsImNvbXB1dGVkVG9vbGJhclNsb3RzIiwiY29tcHV0ZWRDbGFzcyIsImNsYXp6IiwiaW5uZXJXcmFwcGVyUmVmIiwiaXNGb3JtSW5uZXIiLCJfc2ZjX21haW4kcCIsInRhYnMiLCJfY29tcG9uZW50X2ZzX2FjdGlvbmJhciIsIl9ndWFyZFJlYWN0aXZlUHJvcHMiLCJfY29tcG9uZW50X2ZzX3RhYnNfZmlsdGVyIiwidGFic0JpbmRpbmciLCJfY29tcG9uZW50X2ZzX3RhYmxlIiwiX3NmY19tYWluJG8iLCJzY29wZVJlZiIsImRvQ2xpY2siLCJwaWNrZWRQcm9wcyIsImNvbXB1dGVQcm9wcyIsImNvbXB1dGVkSGFuZGxlQnRucyIsIm1lcmdlZEJ0bnMiLCJidG5zIiwiY29tcHV0ZWREcm9wZG93bkF0TGVhc3QiLCJpc0Ryb3Bkb3duQnRuIiwiaGFzRHJvcGRvd25CdG4iLCJkb0Ryb3Bkb3duSXRlbUNsaWNrIiwiYnRuIiwiY29tcHV0ZWREcm9wZG93bkJpbmRpbmciLCJiaW5kaW5nIiwiX2NvbXBvbmVudF9mc19idXR0b24iLCJfZXh0ZW5kcyIsInNvdXJjZSIsIl9pbmhlcml0c0xvb3NlIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiX3NldFByb3RvdHlwZU9mIiwiX2dldFByb3RvdHlwZU9mIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIl9jb25zdHJ1Y3QiLCJQYXJlbnQiLCJDbGFzcyIsIkNvbnN0cnVjdG9yIiwiX2lzTmF0aXZlRnVuY3Rpb24iLCJfd3JhcE5hdGl2ZVN1cGVyIiwiV3JhcHBlciIsImZvcm1hdFJlZ0V4cCIsIndhcm5pbmciLCJlcnJvcnMiLCJjb252ZXJ0RmllbGRzRXJyb3IiLCJmaWVsZHMiLCJ0ZW1wbGF0ZSIsIl9sZW4iLCJfa2V5IiwibGVuIiwic3RyIiwieCIsImlzTmF0aXZlU3RyaW5nVHlwZSIsImlzRW1wdHlWYWx1ZSIsImFzeW5jUGFyYWxsZWxBcnJheSIsImZ1bmMiLCJyZXN1bHRzIiwiYXJyTGVuZ3RoIiwiYXN5bmNTZXJpYWxBcnJheSIsIm5leHQiLCJmbGF0dGVuT2JqQXJyIiwib2JqQXJyIiwiQXN5bmNWYWxpZGF0aW9uRXJyb3IiLCJfRXJyb3IiLCJfdGhpcyIsImFzeW5jTWFwIiwiX3BlbmRpbmciLCJmbGF0dGVuQXJyIiwiZmlyc3RGaWVsZHMiLCJvYmpBcnJLZXlzIiwib2JqQXJyTGVuZ3RoIiwicGVuZGluZyIsImlzRXJyb3JPYmoiLCJjb21wbGVtZW50RXJyb3IiLCJvZSIsImZpZWxkVmFsdWUiLCJkZWVwTWVyZ2UiLCJyZXF1aXJlZCQxIiwid2hpdGVzcGFjZSIsInVybFJlZyIsImdldFVybFJlZ2V4Iiwid29yZCIsInY0IiwidjZzZWciLCJ2NiIsInY0NkV4YWN0IiwidjRleGFjdCIsInY2ZXhhY3QiLCJpcCIsInByb3RvY29sIiwiYXV0aCIsImlwdjQiLCJpcHY2IiwiaG9zdCIsImRvbWFpbiIsInRsZCIsInBvcnQiLCJyZWdleCIsInBhdHRlcm4kMiIsInR5cGUkMSIsImN1c3RvbSIsInJ1bGVUeXBlIiwicmFuZ2UiLCJtaW4iLCJzcFJlZ2V4cCIsIm51bSIsIkVOVU0kMSIsImVudW1lcmFibGUkMSIsInBhdHRlcm4kMSIsIl9wYXR0ZXJuIiwic3RyaW5nIiwibWV0aG9kIiwiX2Jvb2xlYW4iLCJyZWdleHAiLCJpbnRlZ2VyIiwiZmxvYXRGbiIsImFycmF5Iiwib2JqZWN0IiwiRU5VTSIsImVudW1lcmFibGUiLCJwYXR0ZXJuIiwiZGF0ZU9iamVjdCIsImFueSIsInZhbGlkYXRvcnMiLCJuZXdNZXNzYWdlcyIsImNsb25lZCIsIm1lc3NhZ2VzIiwiU2NoZW1hIiwiZGVzY3JpcHRvciIsIl9wcm90byIsIl9tZXNzYWdlcyIsInNvdXJjZV8iLCJvYyIsIl90aGlzMiIsImNvbXBsZXRlIiwiX2Vycm9ycyIsIm1lc3NhZ2VzJDEiLCJzZXJpZXMiLCJ6IiwiZXJyb3JGaWVsZHMiLCJkb0l0IiwiZGVlcCIsImFkZEZ1bGxGaWVsZCIsInNjaGVtYSIsImVycm9yTGlzdCIsImZpbGxlZEVycm9ycyIsImZpZWxkc1NjaGVtYSIsInBhcmVkRmllbGRzU2NoZW1hIiwiZmllbGRTY2hlbWEiLCJmaWVsZFNjaGVtYUxpc3QiLCJlcnJzIiwiZmluYWxFcnJvcnMiLCJtZXNzYWdlSW5kZXgiLCJ2YWxpZGF0b3IiLCJjcmVhdGVWYWxpZGF0b3IiLCJlZGl0YWJsZUNlbGxzIiwiY3VyRGVzYyIsImVhY2hUcmVlIiwidXNlVGFibGVEYXRhIiwiZ2V0RGF0YSIsInRhYmxlRGF0YSIsImVkaXRhYmxlUm93cyIsImdldElkRnJvbVJvdyIsImdldEVkaXRhYmxlSWRGcm9tUm93IiwiZWRpdGFibGVFYWNoUm93cyIsImNlbGxzIiwiZWRpdGFibGVFYWNoQ2VsbHMiLCJjZWxsIiwiY3JlYXRlRWRpdGFibGVDZWxsIiwidGFibGVSb3ciLCJzZXRWYWx1ZSIsInVwZGF0ZUNlbGwiLCJzaG93QWN0aW9uIiwiZW5hYmxlZCIsImZvcm1JdGVtIiwic2V0RGVmYXVsdFZhbHVlIiwicm93S2V5VmFsdWUiLCJjcmVhdGVFZGl0YWJsZVJvdyIsImRvU2F2ZSIsIm5ld1JvdyIsInNhdmVSb3ciLCJwMyIsImNoaWxkIiwibmV4dEVkaXRhYmxlSWQiLCJlZGl0YWJsZUlkR2VuIiwic2V0dXBFZGl0YWJsZSIsInRtcFJvd3MiLCJmb3JPd24iLCJidWlsZFRoaW5EYXRhIiwidGhpbkRhdGEiLCJ0aGluUm93Iiwib2xkVGhpbkRhdGEiLCJnZXRFZGl0YWJsZUNlbGwiLCJhY3RpdmUiLCJpbmFjdGl2ZSIsInNhdmVFYWNoIiwiY2FuY2VsQWxsIiwicGVyc2lzdCIsInJlc3VtZSIsImhhc0RpcnR5IiwiZGlydHkiLCJhZGRJbmRleCIsInNldERlZmF1bHRGb3JtIiwiZm9ybUNvbHVtbkNvbmZpZ3MiLCJhZGRSb3ciLCJnZXRFZGl0YWJsZVJvdyIsInJlbW92ZVRhYmxlUm93QnlFZGl0YWJsZUlkIiwicmVtb3ZlUm93IiwiYWN0aXZlQ29scyIsImNvbHMiLCJnZXRBY3RpdmVSb3dzIiwicm93cyIsImhhc0Vycm9yIiwicmVtb3ZlRGF0YUVkaXRhYmxlSWQiLCJnZXRDbGVhblRhYmxlRGF0YSIsInVzZUNvbXBvbmVudFJlZlByb3ZpZGVyIiwiY29tcG9uZW50c1JlZiIsImdldHRlciIsInNldHRlciIsImJ1aWxkVGFibGVTbG90cyIsInNvcnRlZENvbHVtbnMiLCJyZW5kZXJSb3dIYW5kbGUiLCJyZW5kZXJDZWxsQ29tcG9uZW50IiwidGFibGVDb2x1bW5Db21wIiwidGFibGVDb2x1bW5Hcm91cENvbXAiLCJ0YWJsZUNvbHVtbkdyb3VwIiwidGFibGVTbG90cyIsImJ1aWxkQ29sdW1uIiwiY2VsbFNsb3RzIiwiY29sdW1uU2xvdHMiLCJjZWxsU2xvdE5hbWUiLCJjdXJyZW50VGFibGVDb2x1bW5Db21wIiwic3ViQ29sdW1ucyIsInN1YkNvbHVtbiIsIm5ld0l0ZW0iLCJyb3dIYW5kbGVTbG90cyIsInRhYmxlVmVyc2lvbiIsInRhYmxlVjIiLCJfcGFyZW50IiwiZGF0YUluZGV4IiwiY2hpbGRPcHRpb25zIiwiY3VzdG9tUmVuZGVyIiwicmVuZGVyTWV0aG9kIiwibmV3Q29sIiwicmVidWlsZFJlbmRlclNjb3BlIiwiY2VsbFJlbmRlciIsImNvbmRpdGlvbmFsUmVuZGVyIiwiY29tcG9uZW50UmVmcyIsImxlbmd0aCIsImNlbGxSZWYiLCJjdXJyZW50UmVmIiwidGFibGVDb2x1bW5DSSIsInRhYmxlQ29sdW1uVjIiLCJzY3JvbGxUbyIsInRvcCIsInRhYmxlQ29tcCIsImVkaXRhYmxlV3JhcCIsIm9uUm93SGFuZGxlIiwib25DaGFuZ2UiLCJvblNvcnRDaGFuZ2UiLCJzb3J0ZXIiLCJvbkZpbHRlckNoYW5nZSIsImZpbHRlcnMiLCJvblBhZ2luYXRpb24iLCJidWJibGVVcCIsInJvd0hhbmRsZVNsb3RzTmFtZSIsIm5ld1Njb3BlIiwic2V0UmVmIiwicm93UmVmcyIsImVkaXRhYmxlQ2VsbCIsInJlYWRvbmx5IiwicmVuZGVyTW9kZSIsImRhdGFTb3VyY2UiLCJjb21wdXRlZEJpbmRpbmciLCJjb21wdXRlZFRhYmxlU2xvdHMiLCJ0YWJsZVJlbmRlciIsInZMb2FkaW5nIiwicmVzb2x2ZURpcmVjdGl2ZSIsIndpdGhEaXJlY3RpdmVzIiwiY29tcHV0ZWRGbGF0Q29sdW1ucyIsImZsYXRDb2x1bW5zIiwiZmxhdENvbHVtbnNGbiIsImNvbXB1dGVkTXVsdGlIZWFkZXJzIiwiYnVpbGRNdWx0aUhlYWRlcnNCaW5kIiwidHJlZUNvbHVtbnMiLCJiaW5kIiwiaXNGbGF0IiwiY29sdW1uc0lzRmxhdCIsImNyZWF0ZVRhYmxlSW5zdGFuY2UiLCJ3aWR0aCIsImhlaWdodCIsImNvbXB1dGVkQ29tcG9uZW50IiwiY29tcHV0ZWRQcm9wc0NvbXBvbmVudCIsImNvbXB1dGVkVGl0bGUiLCJzaG93VGl0bGUiLCJjb21wdXRlZENlbGxDb250ZW50UmVuZGVyIiwic2xvdCIsImxhc3RSZW5kZXIiLCJjZWxsQ29udGVudFJlbmRlciIsIm1hdGNoIiwiZm9ybWF0dGVyIiwidG9vbHRpcFByb3BzIiwidG9vbHRpcFNsb3RzIiwiY29udGVudCIsImNvbHVtbktleSIsImNvbXB1dGVkRm9ybSIsImdldEZvcm1SZWZGdW5jIiwiZ2V0Rm9ybSIsImNvbXB1dGVkSXNFZGl0YWJsZSIsImVkaXRpbmdVcGRhdGUiLCJvblN1Ym1pdCIsInNhdmUiLCJvbkNhbmNlbCIsImlzQ2hhbmdlZCIsImVkaXQiLCJpbnB1dENvbXBvbmVudCIsImlzRWRpdGluZyIsImFjdGl2ZVRyaWdnZXIiLCJtZXRob2RzIiwiJHJlZnMiLCJ0YXJnZXRJbnB1dFJlZiIsIl9fZW1pdCIsImRvU3VibWl0IiwiZG9DYW5jZWwiLCJnZXRWYWxpZGF0ZUVycm9yTWVzc2FnZSIsImVkaXRpbmciLCJfc2ZjX21haW4kbSIsInNvcnRBcnIiLCJzb3J0ZWRCdXR0b25zIiwiU2V0Rm9ybURhdGFPcHRpb25zIiwiQ29sdW1uc0ZpbHRlclByb3ZpZGVLZXkiLCJ0cmFuc2Zvcm1Db2x1bW5zVHJlZSIsImN1cnJlbnRDb2x1bW5zIiwib3JpZ2luYWxDb2x1bW5zTWFwIiwiX3RleHQiLCJidWlsZENvbHVtbkZpbHRlckl0ZW0iLCJ0cmFuc2Zvcm1Ub1RhYmxlQ29sdW1ucyIsInNldEN1cnJlbnRWYWx1ZSIsImRvX3NhdmUiLCJjbGVhclRoaXNTdG9yYWdlIiwibm9TYXZlIiwic2F2ZU9wdGlvbnNUb1N0b3JhZ2UiLCJkb0VtaXQiLCJjb21wdXRlZE9yaWdpbmFsQ29sdW1ucyIsInNpbXBsZVN1Ym1pdCIsInNpbXBsZVJlc2V0Iiwic3RvcmFnZVRhYmxlU3RvcmUiLCJnZXRTdG9yYWdlVGFibGUiLCJyZW1vdGVTdG9yYWdlIiwic3RvcmVkT3B0aW9ucyIsImdldE9wdGlvbnNGcm9tU3RvcmFnZSIsImdldENvbHVtbnNIYXNoIiwiaGFzaCIsImluaXQiLCJzdG9yZUhhc2giLCJ1cGRhdGUiLCJjaGFuZ2UiLCJidWlsZFRleHQiLCJlbGVtZW50IiwiX3dpdGhEaXJlY3RpdmVzIiwiX3ZTaG93IiwiX3NmY19tYWluJGsiLCJGc1RhYmxlQ29sdW1uc0ZpbHRlciIsImNvbHVtbnNGaWx0ZXJSZWYiLCJkZWZhdWx0QnV0dG9ucyIsImRlZmF1bHRCdXR0b25zS2V5IiwicG9wb3ZlclZpc2libGUiLCJzdG9yYWdlIiwib3duS2V5cyIsImVudW1lcmFibGVPbmx5Iiwic3ltYm9scyIsInN5bSIsIl9vYmplY3RTcHJlYWQyIiwiX2RlZmluZVByb3BlcnR5IiwiX3R5cGVvZiIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIiwiZXhjbHVkZWQiLCJzb3VyY2VLZXlzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwic291cmNlU3ltYm9sS2V5cyIsInZlcnNpb24iLCJ1c2VyQWdlbnQiLCJJRTExT3JMZXNzIiwiRWRnZSIsIkZpcmVGb3giLCJTYWZhcmkiLCJJT1MiLCJDaHJvbWVGb3JBbmRyb2lkIiwiY2FwdHVyZU1vZGUiLCJvZmYiLCJtYXRjaGVzIiwic2VsZWN0b3IiLCJnZXRQYXJlbnRPckhvc3QiLCJjbG9zZXN0IiwiaW5jbHVkZUNUWCIsIlJfU1BBQ0UiLCJ0b2dnbGVDbGFzcyIsInN0YXRlIiwiY3NzIiwic3R5bGUiLCJtYXRyaXgiLCJzZWxmT25seSIsImFwcGxpZWRUcmFuc2Zvcm1zIiwibWF0cml4Rm4iLCJmaW5kIiwidGFnTmFtZSIsIml0ZXJhdG9yIiwiZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCIsInNjcm9sbGluZ0VsZW1lbnQiLCJnZXRSZWN0IiwicmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jayIsInJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQiLCJ1bmRvU2NhbGUiLCJlbFJlY3QiLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiLCJjb250YWluZXJSZWN0IiwiZWxNYXRyaXgiLCJzY2FsZVgiLCJzY2FsZVkiLCJpc1Njcm9sbGVkUGFzdCIsImVsU2lkZSIsInBhcmVudFNpZGUiLCJnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudCIsImVsU2lkZVZhbCIsInBhcmVudFNpZGVWYWwiLCJnZXRDaGlsZCIsImNoaWxkTnVtIiwiaW5jbHVkZURyYWdFbCIsImN1cnJlbnRDaGlsZCIsIlNvcnRhYmxlIiwibGFzdENoaWxkIiwibGFzdCIsImdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0Iiwib2Zmc2V0TGVmdCIsIm9mZnNldFRvcCIsIndpblNjcm9sbGVyIiwiaW5kZXhPZk9iamVjdCIsImluY2x1ZGVTZWxmIiwiZWxlbSIsImdvdFNlbGYiLCJlbGVtQ1NTIiwiZXh0ZW5kIiwiZHN0Iiwic3JjIiwiaXNSZWN0RXF1YWwiLCJyZWN0MSIsInJlY3QyIiwiX3Rocm90dGxlVGltZW91dCIsInRocm90dGxlIiwibXMiLCJjYW5jZWxUaHJvdHRsZSIsInNjcm9sbEJ5IiwieSIsIlBvbHltZXIiLCIkIiwiZXhwYW5kbyIsIkFuaW1hdGlvblN0YXRlTWFuYWdlciIsImFuaW1hdGlvblN0YXRlcyIsImFuaW1hdGlvbkNhbGxiYWNrSWQiLCJmcm9tUmVjdCIsImNoaWxkTWF0cml4IiwiYW5pbWF0aW5nIiwiYW5pbWF0aW9uVGltZSIsInRpbWUiLCJ0b1JlY3QiLCJwcmV2RnJvbVJlY3QiLCJwcmV2VG9SZWN0IiwiYW5pbWF0aW5nUmVjdCIsInRhcmdldE1hdHJpeCIsImNhbGN1bGF0ZVJlYWxUaW1lIiwiY3VycmVudFJlY3QiLCJkdXJhdGlvbiIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwicmVwYWludCIsImRlZmF1bHRzIiwiUGx1Z2luTWFuYWdlciIsInNvcnRhYmxlIiwiZXZ0IiwiZXZlbnROYW1lR2xvYmFsIiwicGx1Z2luTmFtZSIsImluaXRpYWxpemVkIiwibW9kaWZpZWQiLCJldmVudFByb3BlcnRpZXMiLCJtb2RpZmllZFZhbHVlIiwiZGlzcGF0Y2hFdmVudCIsIl9yZWYiLCJyb290RWwiLCJ0YXJnZXRFbCIsImNsb25lRWwiLCJ0b0VsIiwiZnJvbUVsIiwib2xkSW5kZXgiLCJuZXdJbmRleCIsIm9sZERyYWdnYWJsZUluZGV4IiwibmV3RHJhZ2dhYmxlSW5kZXgiLCJvcmlnaW5hbEV2ZW50IiwicHV0U29ydGFibGUiLCJleHRyYUV2ZW50UHJvcGVydGllcyIsIm9uTmFtZSIsImFsbEV2ZW50UHJvcGVydGllcyIsIl9leGNsdWRlZCIsInBsdWdpbkV2ZW50IiwiZHJhZ0VsIiwicGFyZW50RWwiLCJnaG9zdEVsIiwibmV4dEVsIiwibGFzdERvd25FbCIsImNsb25lSGlkZGVuIiwibW92ZWQiLCJfaGlkZUdob3N0Rm9yVGFyZ2V0IiwiX3VuaGlkZUdob3N0Rm9yVGFyZ2V0IiwiX2Rpc3BhdGNoRXZlbnQiLCJhY3RpdmVHcm91cCIsImF3YWl0aW5nRHJhZ1N0YXJ0ZWQiLCJpZ25vcmVOZXh0Q2xpY2siLCJzb3J0YWJsZXMiLCJ0YXBFdnQiLCJ0b3VjaEV2dCIsImxhc3REeCIsImxhc3REeSIsInRhcERpc3RhbmNlTGVmdCIsInRhcERpc3RhbmNlVG9wIiwibGFzdFRhcmdldCIsImxhc3REaXJlY3Rpb24iLCJwYXN0Rmlyc3RJbnZlcnRUaHJlc2giLCJpc0NpcmN1bXN0YW50aWFsSW52ZXJ0IiwidGFyZ2V0TW92ZURpc3RhbmNlIiwiZ2hvc3RSZWxhdGl2ZVBhcmVudCIsImdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsIiwiX3NpbGVudCIsInNhdmVkSW5wdXRDaGVja2VkIiwiZG9jdW1lbnRFeGlzdHMiLCJQb3NpdGlvbkdob3N0QWJzb2x1dGVseSIsIkNTU0Zsb2F0UHJvcGVydHkiLCJzdXBwb3J0RHJhZ2dhYmxlIiwic3VwcG9ydENzc1BvaW50ZXJFdmVudHMiLCJfZGV0ZWN0RGlyZWN0aW9uIiwiZWxDU1MiLCJlbFdpZHRoIiwiY2hpbGQxIiwiY2hpbGQyIiwiZmlyc3RDaGlsZENTUyIsInNlY29uZENoaWxkQ1NTIiwiZmlyc3RDaGlsZFdpZHRoIiwic2Vjb25kQ2hpbGRXaWR0aCIsInRvdWNoaW5nU2lkZUNoaWxkMiIsIl9kcmFnRWxJblJvd0NvbHVtbiIsImRyYWdSZWN0IiwidGFyZ2V0UmVjdCIsInZlcnRpY2FsIiwiZHJhZ0VsUzFPcHAiLCJkcmFnRWxTMk9wcCIsImRyYWdFbE9wcExlbmd0aCIsInRhcmdldFMxT3BwIiwidGFyZ2V0UzJPcHAiLCJ0YXJnZXRPcHBMZW5ndGgiLCJfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUiLCJ0aHJlc2hvbGQiLCJyZWN0IiwiaW5zaWRlSG9yaXpvbnRhbGx5IiwiaW5zaWRlVmVydGljYWxseSIsIl9wcmVwYXJlR3JvdXAiLCJ0b0ZuIiwicHVsbCIsInRvIiwiZnJvbSIsInNhbWVHcm91cCIsIm90aGVyR3JvdXAiLCJvcmlnaW5hbEdyb3VwIiwibmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQiLCJuZWFyZXN0IiwiX2NoZWNrT3V0c2lkZVRhcmdldEVsIiwiZGF0YVRyYW5zZmVyIiwicHJldmVudE9uRmlsdGVyIiwidG91Y2giLCJvcmlnaW5hbFRhcmdldCIsImZpbHRlciIsIl9zYXZlSW5wdXRDaGVja2VkU3RhdGUiLCJjcml0ZXJpYSIsIm93bmVyRG9jdW1lbnQiLCJkcmFnU3RhcnRGbiIsIl9kaXNhYmxlRHJhZ2dhYmxlIiwiX25leHRUaWNrIiwiZmFsbGJhY2siLCJpbnNlcnRlZCIsImZhbGxiYWNrVG9sZXJhbmNlIiwiZmFsbGJhY2tPZmZzZXQiLCJnaG9zdE1hdHJpeCIsInJlbGF0aXZlU2Nyb2xsT2Zmc2V0IiwiZHgiLCJkeSIsImNzc01hdHJpeCIsInJldmVydCIsImFjdGl2ZVNvcnRhYmxlIiwiaXNPd25lciIsImNhblNvcnQiLCJmcm9tU29ydGFibGUiLCJjb21wbGV0ZWRGaXJlZCIsImRyYWdPdmVyRXZlbnQiLCJleHRyYSIsImNvbXBsZXRlZCIsIl9vbk1vdmUiLCJjYXB0dXJlIiwiaW5zZXJ0aW9uIiwiZWxMYXN0Q2hpbGQiLCJfZ2hvc3RJc0xhc3QiLCJfZ2hvc3RJc0ZpcnN0IiwiZmlyc3RDaGlsZCIsImRpcmVjdGlvbiIsInRhcmdldEJlZm9yZUZpcnN0U3dhcCIsImRpZmZlcmVudExldmVsIiwiZGlmZmVyZW50Um93Q29sIiwic2lkZTEiLCJzY3JvbGxlZFBhc3RUb3AiLCJzY3JvbGxCZWZvcmUiLCJfZ2V0U3dhcERpcmVjdGlvbiIsInNpYmxpbmciLCJkcmFnSW5kZXgiLCJuZXh0U2libGluZyIsIm1vdmVWZWN0b3IiLCJfdW5zaWxlbnQiLCJfY2FuY2VsTmV4dFRpY2siLCJfZ2xvYmFsRHJhZ092ZXIiLCJfZ2VuZXJhdGVJZCIsInVzZUFuaW1hdGlvbiIsIml0ZW1zIiwid2lsbEluc2VydEFmdGVyIiwib25Nb3ZlRm4iLCJyZXRWYWwiLCJzcGFjZXIiLCJzd2FwVGhyZXNob2xkIiwiaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIiwiaW52ZXJ0U3dhcCIsImlzTGFzdFRhcmdldCIsIm1vdXNlT25BeGlzIiwidGFyZ2V0TGVuZ3RoIiwidGFyZ2V0UzEiLCJ0YXJnZXRTMiIsImludmVydCIsIl9nZXRJbnNlcnREaXJlY3Rpb24iLCJzdW0iLCJyb290IiwiaW5wdXRzIiwiaWR4IiwiYXV0b1Njcm9sbHMiLCJzY3JvbGxFbCIsInNjcm9sbFJvb3RFbCIsInNjcm9sbGluZyIsImxhc3RBdXRvU2Nyb2xsWCIsImxhc3RBdXRvU2Nyb2xsWSIsInRvdWNoRXZ0JDEiLCJwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCIsIkF1dG9TY3JvbGxQbHVnaW4iLCJBdXRvU2Nyb2xsIiwiX3JlZjIiLCJjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsIiwiY2xlYXJBdXRvU2Nyb2xscyIsImF1dG9TY3JvbGwiLCJvZ0VsZW1TY3JvbGxlciIsIm5ld0VsZW0iLCJpc0ZhbGxiYWNrIiwic2VucyIsInNwZWVkIiwic2Nyb2xsVGhpc0luc3RhbmNlIiwic2Nyb2xsQ3VzdG9tRm4iLCJsYXllcnNPdXQiLCJjdXJyZW50UGFyZW50IiwiY2FuU2Nyb2xsWCIsImNhblNjcm9sbFkiLCJzY3JvbGxXaWR0aCIsInNjcm9sbEhlaWdodCIsInNjcm9sbFBvc1giLCJzY3JvbGxQb3NZIiwidngiLCJ2eSIsInNjcm9sbE9mZnNldFkiLCJzY3JvbGxPZmZzZXRYIiwiZHJvcCIsImRpc3BhdGNoU29ydGFibGVFdmVudCIsImhpZGVHaG9zdEZvclRhcmdldCIsInVuaGlkZUdob3N0Rm9yVGFyZ2V0IiwidG9Tb3J0YWJsZSIsIlJldmVydCIsIl9yZWYzIiwiUmVtb3ZlIiwiX3JlZjQiLCJwYXJlbnRTb3J0YWJsZSIsIl9fZGVmUHJvcCIsIl9fZGVmUHJvcHMiLCJfX2dldE93blByb3BEZXNjcyIsIl9fZ2V0T3duUHJvcFN5bWJvbHMiLCJfX2hhc093blByb3AiLCJfX3Byb3BJc0VudW0iLCJfX2RlZk5vcm1hbFByb3AiLCJfX3NwcmVhZFZhbHVlcyIsIl9fc3ByZWFkUHJvcHMiLCJyZW1vdmVOb2RlIiwiaW5zZXJ0Tm9kZUF0IiwiZmF0aGVyTm9kZSIsInBvc2l0aW9uIiwicmVmTm9kZSIsImdldENvbnNvbGUiLCJjb25zb2xlJDEiLCJjYWNoZSIsImNhbWVsaXplIiwibWFuYWdlQW5kRW1pdCQxIiwiZW1pdCQxIiwibWFuYWdlJDEiLCJldmVudEhhbmRsZXJOYW1lcyIsImV2ZW50czIiLCJpc1JlYWRPbmx5IiwidGFncyIsImlzSHRtbFRhZyIsImlzVHJhbnNpdGlvbiIsImlzSHRtbEF0dHJpYnV0ZSIsInByb2plY3QiLCJnZXRDb21wb25lbnRBdHRyaWJ1dGVzIiwiJGF0dHJzIiwiY29tcG9uZW50RGF0YSIsImF0dHJpYnV0ZXMiLCJjcmVhdGVTb3J0YWJsZU9wdGlvbiIsImNhbGxCYWNrQnVpbGRlciIsImdldFZhbGlkU29ydGFibGVFbnRyaWVzIiwiZXZlbnRUeXBlIiwiZXZlbnRCdWlsZGVyIiwidmFsdWUyIiwiZ2V0SHRtbEVsZW1lbnRGcm9tTm9kZSIsImFkZENvbnRleHQiLCJkb21FbGVtZW50IiwiZ2V0Q29udGV4dCIsIkNvbXBvbmVudFN0cnVjdHVyZSIsImhlYWRlciIsImRlZmF1bHROb2RlcyIsImZvb3RlciIsInJlYWxMaXN0IiwiaDIiLCJ0YWciLCJfaXNSb290Q29tcG9uZW50IiwiZG9tSW5kZXgiLCJkb21DaGlsZHJlbiIsImZpcnN0RG9tTGlzdEVsZW1lbnQiLCJpbmRleEZpcnN0RG9tTGlzdEVsZW1lbnQiLCJlbGVtZW50MiIsImdldFNsb3QiLCJzbG90VmFsdWUiLCJjb21wdXRlTm9kZXMiLCJnZXRLZXkiLCJub3JtYWxpemVkTGlzdCIsImdldFJvb3RJbmZvcm1hdGlvbiIsInRyYW5zaXRpb24iLCJleHRlcm5hbENvbXBvbmVudCIsIlRyYW5zaXRpb25Hcm91cCIsImNvbXB1dGVDb21wb25lbnRTdHJ1Y3R1cmUiLCJldnROYW1lIiwiZXZ0RGF0YSIsIm1hbmFnZSIsIm9yaWdpbmFsRWxlbWVudCIsIm1hbmFnZUFuZEVtaXQiLCJkZWxlZ2F0ZUNhbGxCYWNrIiwiZHJhZ2dpbmdFbGVtZW50IiwiZHJhZ2dhYmxlQ29tcG9uZW50IiwiY29tcG9uZW50U3RydWN0dXJlIiwiJGVsIiwic29ydGFibGVPcHRpb25zIiwidGFyZ2V0RG9tRWxlbWVudCIsIml0ZW1LZXkiLCJuZXdPcHRpb25WYWx1ZSIsIl9zb3J0YWJsZSIsImh0bUVsZW1lbnQiLCJvbkxpc3QiLCJuZXdMaXN0Iiwic3BsaWNlTGlzdCIsInVwZGF0ZVBvc2l0aW9uIiwicmVsYXRlZCIsImRlc3RpbmF0aW9uIiwiYWRkZWQiLCJyZW1vdmVkIiwicmVsYXRlZENvbnRleHQiLCJjdXJyZW50RG9tSW5kZXgiLCJjdXJyZW50SW5kZXgiLCJtb3ZlIiwiZnV0dXJlSW5kZXgiLCJkcmFnZ2VkQ29udGV4dCIsInNlbmRFdmVudCIsIl9zZmNfbWFpbiRqIiwib25EcmFnZ2FibGVNb3ZlIiwiZHJhZ2VkIiwic29ydGVkIiwibGVmdEluZGV4IiwicmlnaHRJbmRleCIsIm1pbk5vdEluZGV4IiwibWF4Tm90SW5kZXgiLCJidWlsZFVwZGF0ZUtleSIsInVwZGF0ZUNoZWNrZWQiLCJ1cGRhdGVDaGlsZHJlbiIsInVwZGF0ZVBhcmVudCIsIm9uQ2hlY2tDaGFuZ2VkIiwiZml4ZWRDaGFuZ2UiLCJpc1Jvb3QiLCJGc1RhYmxlQ29sdW1uc0ZpeGVkQ29udHJvbGxlciIsIl9jb21wb25lbnRfZnNfY29sdW1uc19maWx0ZXJfbmVzdF9saXN0IiwiZHJhd2VyQmluZCIsImNoZWNrQWxsIiwib25DaGVja0FsbENoYW5nZSIsImNoZWNrQWxsQmluZCIsInNob3dMZW5ndGgiLCJhbGxMZW5ndGgiLCJpc0luZGV0ZXJtaW5hdGUiLCJhbGxDaGVja2VkVXBkYXRlIiwiRnNDb2x1bW5zRmlsdGVyTmVzdExpc3QiLCJfc2ZjX21haW4kZyIsIkZzU2VhcmNoQnV0dG9ucyIsInZhbGlkYXRlZEZvcm0iLCJzZWFyY2hBZnRlclJlc2V0IiwiYXV0b1NlYXJjaCIsImRlYm91bmNlIiwidmFsaWRhdGVPbkNoYW5nZSIsIl9jZWxsUmVuZGVyIiwib25Gb3JtVmFsaWRhdGVkIiwiTG9kYXNoR2V0Iiwic3BsaXRLZXkiLCJzcGxpdCIsIl9vblVwZGF0ZU1vZGVsVmFsdWUiLCJvblZhbHVlQ2hhbmdlZCIsIl9vbklucHV0Iiwib25JbnB1dCIsIm9uS2V5dXAiLCJhdXRvU2VhcmNoVHJpZ2dlciIsImRvU2VhcmNoIiwiZGVmYXVsdFNsb3QiLCJidWlsZEZpZWxkQ29udGV4dCIsImNvbXBvbmVudFJlbmRlclJlZnMiLCJzcGxpdGVkS2V5IiwicnVsZVBhdGgiLCJzZWFyY2hGb3JtUmVmIiwiZ2V0Q29tcG9uZW50UmVuZGVyUmVmIiwiZG9SZXNldCIsImRvVmFsaWRhdGUiLCJzaWxlbnQiLCJ2YWxpZGF0ZVdyYXAiLCJkZWZCdG5PcHRpb25zIiwiX2NsaWNrIiwiaW5pdEF1dG9TZWFyY2giLCJ3YWl0IiwiZ2V0VmFsaWRhdGVkRm9ybSIsInNldEZvcm0iLCJuZXdGb3JtIiwiaW5wdXRFdmVudERpc2FibGVkIiwiZG9BdXRvU2VhcmNoIiwiY2hhbmdlSW5wdXRFdmVudERpc2FibGVkIiwidmFsaWRhdGVPbkNoYW5nZVNpbGVudCIsImNvbXBvbmVudFJlZiIsInZhbHVlQ2hhbmdlQ29udGV4dCIsImltbWVkaWF0ZSIsImNvbXB1dGVkUnVsZXMiLCJfc2ZjX21haW4kZSIsImNvbXB1dGVkSXNNdWx0aUxpbmUiLCJjb2x1bW5zUm93UmVmIiwiY29sdW1uc0JveEhlaWdodFJlZiIsImNvbHVtbnNMaXN0IiwiY29sdW1uc0xpbmVIZWlnaHRSZWYiLCJzZWFyY2hFdmVudENvbnRleHRSZWYiLCJ0b2dnbGVDb2xsYXBzZSIsImNvbXB1dGVkQ29sTmFtZSIsImNvbXB1dGVkQ29sdW1uQm94SGVpZ2h0IiwiX2NvbXBvbmVudF9mc19zZWFyY2hfYnV0dG9ucyIsImNvbGxhcHNlIiwiX3NmY19tYWluJGQiLCJjb2xsYXBzZUJ1dHRvbiIsImRlZmF1bHRPcHRpb24iLCJfX0RFRkFVTFRfXyIsIm9uVXBkYXRlQWN0aXZlS2V5IiwiZGVmYXVsdExpbWl0IiwiZGlhbG9nT3BlbmVkIiwiY29tcHV0ZWREaWFsb2ciLCJmb3JtSXRlbUNvbnRleHQiLCJpbnB1dEJpbmRpbmciLCJlbWl0Q2hhbmdlIiwiaGFuZGxlQ2xpY2siLCJwYWdlciIsIm9uVGFiQ2hhbmdlIiwiYXBpIiwibGltaXQiLCJpY29uU3RvcmUiLCJsb2FkSWNvblNldCIsInNldHMiLCJ1bmNhdGVnb3JpZXMiLCJjYXRlZ29yaWVzIiwic2VhcmNoS2V5IiwidGFiS2V5IiwicmVzZXRQYWdlciIsImhhbmRsZVNlYXJjaCIsImdldFBhZ2VyRnJvbUljb25TZXQiLCJlbmQiLCJoYW5kbGVJY29uU2VsZWN0Iiwib25Db25maXJtIiwibG9hZE1vcmUiLCJjb21wdXRlVGFicyIsIl9ob2lzdGVkXzgiLCJfY29tcG9uZW50X2ZzX2xvYWRpbmciLCJfaG9pc3RlZF85IiwiX2hvaXN0ZWRfMTAiLCJfc2ZjX21haW4kYSIsImNvbXB1dGVkUmFkaW9OYW1lIiwidXNlZERpY3QiLCJjb21wdXRlZE9wdGlvbnMiLCJvcHQiLCJvcHRpb25Qcm9wcyIsInNlbGVjdFJlZiIsImNvbXB1dGVkUGxhY2Vob2xkZXIiLCJwbGFjZWhvbGRlciIsIm9uU2VsZWN0ZWRDaGFuZ2UiLCJkYXRhTWFwIiwidGVtcFNsb3RzIiwiX3VzZVNsb3RzIiwic2VsZWN0Q29tcCIsIiRlbWl0IiwidGhpc1Nsb3RzIiwicmVuZGVyTGFiZWwiLCJvcHRpb25Db21wIiwiY29zIiwiZ2V0SGFzaENvZGUiLCJjaHIiLCJidWlsZEFycmF5VmFsdWUiLCJ2YWx1ZUFyciIsIl9zZmNfbWFpbiQ4IiwiQ09MT1JfTElTVCIsIkVGRkVDVF9MSVNUIiwiZ2V0Q29sb3IiLCJzZXRDb2xvciIsInR5cGVLZXkiLCJjb2xvciIsImhhc2hjb2RlIiwiY29sb3JzIiwiZWZmZWN0cyIsImNvbXB1dGVkVmFsdWVJdGVtcyIsInZhbHVlUHJvcCIsImxhYmVsUHJvcCIsImNvbG9yZnVsT3B0aW9ucyIsIm5ld1ZhbHVlcyIsIl9zZmNfbWFpbiQ3IiwiY29tcHV0ZWRNdWx0aXBsZSIsInN1YiIsIkxhYmVscyIsIkluZGV4IiwiX3NmY19tYWluJDYiLCJjYXNjYWRlclJlZiIsImRpY3RVc2VSZXQiLCJmaWVsZE5hbWVzQmluZGVyIiwib25TZWxlY3RDaGFuZ2UiLCJzZWxlY3RlZE9wdGlvbnMiLCJfc2ZjX21haW4kNSIsIl9zZmNfbWFpbiQ0IiwiX3NmY19tYWluJDMiLCJfc2ZjX21haW4kMiIsInRyZWVSZWYiLCJkaWN0U2VsZWN0UmVmIiwidmFsdWVzRm9ybWF0UmVmIiwiZGlhbG9nT3BlbiIsIm9uQ2xvc2UiLCJpbml0U2VsZWN0ZWRLZXlzIiwibXVsdGlwbGUiLCJ2YWx1ZVR5cGUiLCJmb3JtV3JhcHBlck9wdGlvbnMiLCJvcGVuVGFibGVTZWxlY3QiLCJvcGVuT3B0aW9ucyIsImNydWRPcHRpb25zT3ZlcnJpZGUiLCJidWlsZE1lcmdlZENydWRPcHRpb25zIiwiYmVmb3JlT3BlbiIsImdldFNjb3BlQ29udGV4dCIsIndyYXBwZXJPcHRpb25zIiwidmlld01vZGUiLCJkaWFsb2ciLCJidWlsZEluaXRCaW5kIiwib25PayIsImNvbXB1dGVkVmFsdWVzRm9ybWF0IiwidmFsdWVzRm9ybWF0IiwiY29tcHV0ZWRTZWxlY3QiLCJ1cGRhdGVLZXkiLCJjbGVhcmFibGUiLCJidWlsZE11bHRpQmluZGluZyIsImFwcGVuZEJ5VmFsdWVzIiwicmVmcmVzaGluZyIsInNlbGVjdGlvbk9wdGlvbnMiLCJidWlsZFNlbGVjdGlvbkNydWRPcHRpb25zIiwiY3Jvc3NQYWdlIiwic2VsZWN0T25DbGlja1JvdyIsImdldFBhZ2VEYXRhIiwib25TZWxlY3RlZEtleXNDaGFuZ2VkIiwib25SZWZyZXNoZWQiLCJzZXRTZWxlY3RlZFJvd3MiLCJnZXRCYXNlVGFibGVSZWYiLCJnZXREaWN0TWFwIiwiZW1pdE9uVmlld01vZGVsIiwib3BlbmVkIiwiX2NvbXBvbmVudF9mc19kaWN0X3NlbGVjdCIsInNraXBWYWxpZGF0aW9uV3JhcHBlciIsIl9jb21wb25lbnRfZnNfZm9ybV93cmFwcGVyIiwiZGVzdHJveU9uQ2xvc2UiLCJfY29tcG9uZW50X2ZzX2NydWQiLCJzaG93Q3VycmVudCIsIl9jb21wb25lbnRfZnNfdmFsdWVzX2Zvcm1hdCIsImNsb3NhYmxlIiwiZG9VcGRhdGUiLCJkaWN0U2VsZWN0IiwiX2NvbXBvbmVudF9mc190YWJsZV9zZWxlY3QiLCJ0YWJsZVNlbGVjdCIsIkZhc3RDcnVkIiwiY3VzdG9tQ29tcG9uZW50cyIsImNvbSIsInByaW50V2FybmluZ0xvZ2dlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlBLE1BQU1BLEtBQXFCO0FBQUEsRUFDekIsY0FBY0MsR0FBNEI7QUFDeEMsV0FBTztFQUNUO0FBQUEsRUFDQSxlQUFlQyxHQUFnQjtBQUN2QixVQUFBLEVBQUUsRUFBTSxJQUFBQSxHQUNSQyxJQUFLLENBQUNDLE1BQ0hDLEVBQVMsTUFDUCxFQUFFRCxDQUFJLENBQ2QsR0FFR0UsSUFBS0MsR0FBVTtBQUNkLFdBQUE7QUFBQSxNQUNMLFVB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QUNSLGVBQWVGO0FBQUEsRUFDZixNQUFNQztBQUNSO0FBQ0EsU0FBU0ksR0FBV3I4QixHQUFXO0FBQzdCLFNBQU9tOEIsR0FBa0IsUUFBUW44QixDQUFTLE1BQU07QUFDbEQ7QUFDQSxNQUFNczhCLEtBQU87QUFBQSxFQUNYO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUNBLFNBQVNDLEdBQVV4dUQsR0FBTTtBQUN2QixTQUFPdXVELEdBQUssU0FBU3Z1RCxDQUFJO0FBQzNCO0FBQ0EsU0FBU3l1RCxHQUFhenVELEdBQU07QUFDMUIsU0FBTyxDQUFDLG9CQUFvQixpQkFBaUIsRUFBRSxTQUFTQSxDQUFJO0FBQzlEO0FBQ0EsU0FBUzB1RCxHQUFnQi9zRCxHQUFPO0FBQzlCLFNBQU8sQ0FBQyxNQUFNLFNBQVMsUUFBUSxPQUFPLEVBQUUsU0FBU0EsQ0FBSyxLQUFLQSxFQUFNLFdBQVcsT0FBTyxLQUFLQSxFQUFNLFdBQVcsT0FBTyxLQUFLQSxFQUFNLFdBQVcsSUFBSTtBQUM1STtBQUNBLFNBQVNndEQsR0FBUXo0QixHQUFTO0FBQ3hCLFNBQU9BLEVBQVEsT0FBTyxDQUFDcnZCLEdBQUssQ0FBQ3RELEdBQUs1QixDQUFLLE9BQ3JDa0YsRUFBSXRELENBQUcsSUFBSTVCLEdBQ0prRixJQUNOLENBQUUsQ0FBQTtBQUNQO0FBQ0EsU0FBUytuRCxHQUF1QixFQUFFLFFBQUFDLEdBQVEsZUFBQUMsSUFBZ0IsQ0FBRSxFQUFBLEdBQUk7QUFDOUQsUUFBTUMsSUFBYUosR0FBUSxPQUFPLFFBQVFFLENBQU0sRUFBRSxPQUFPLENBQUMsQ0FBQ3RyRCxHQUFLMkIsQ0FBQyxNQUFNd3BELEdBQWdCbnJELENBQUcsQ0FBQyxDQUFDO0FBQzVGLFNBQU8rcEQsR0FBZUEsR0FBZSxDQUFBLEdBQUl5QixDQUFVLEdBQUdELENBQWE7QUFDckU7QUFDQSxTQUFTRSxHQUFxQixFQUFFLFFBQUFILEdBQVEsaUJBQUFJLEtBQW1CO0FBQ3pELFFBQU1yc0QsSUFBVStyRCxHQUFRTyxHQUF3QkwsQ0FBTSxDQUFDO0FBQ3ZELFNBQU8sUUFBUUksQ0FBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDRSxHQUFXQyxDQUFZLE1BQU07QUFDckUsSUFBQWw5QixHQUFPaTlCLENBQVMsRUFBRSxRQUFRLENBQUNodEQsTUFBVTtBQUNuQyxNQUFBUyxFQUFRLEtBQUtULENBQUssRUFBRSxJQUFJaXRELEVBQWFqdEQsQ0FBSztBQUFBLElBQ2hELENBQUs7QUFBQSxFQUNMLENBQUc7QUFDRCxRQUFNNDZCLElBQVksbUJBQW1CbjZCLEVBQVEsYUFBYSxFQUFFO0FBQzVELFNBQU8ycUQsR0FBY0QsR0FBZSxDQUFFLEdBQUUxcUQsQ0FBTyxHQUFHO0FBQUEsSUFDaEQsV0FBQW02QjtBQUFBLEVBQ0osQ0FBRztBQUNIO0FBQ0EsU0FBU215QixHQUF3QnZ0RCxHQUFPO0FBQ3RDLFNBQU8sT0FBTyxRQUFRQSxDQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM0QixHQUFLMkIsQ0FBQyxNQUFNLENBQUN3cEQsR0FBZ0JuckQsQ0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUNBLEdBQUs4ckQsQ0FBTSxNQUFNLENBQUNyQixHQUFTenFELENBQUcsR0FBRzhyRCxDQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQzlyRCxHQUFLMkIsQ0FBQyxNQUFNLENBQUNvcEQsR0FBVy9xRCxDQUFHLENBQUM7QUFDaEs7QUFDQSxNQUFNK3JELEtBQXlCLENBQUN0MEMsTUFBUztBQUN2QyxRQUFNNVAsSUFBSzRQLEVBQUssTUFBTSxNQUFNLFFBQVFBLEVBQUssUUFBUSxLQUFLQSxFQUFLLFNBQVMsQ0FBQyxFQUFFLEdBQUc7QUFDMUUsU0FBSzVQLEtBQ0gsUUFBUSxNQUFNLG1EQUErRyxHQUV4SEEsS0FBTSxDQUFBO0FBQ2YsR0FDTW1rRCxLQUFhLENBQUNDLEdBQVl2Z0QsTUFBWXVnRCxFQUFXLHNCQUFzQnZnRCxHQUN2RXdnRCxLQUFhLENBQUNELE1BQWVBLEVBQVc7QUFDOUMsTUFBTUUsR0FBbUI7QUFBQSxFQUN2QixZQUFZO0FBQUEsSUFDVixPQUFPLEVBQUUsUUFBQUMsR0FBUSxTQUFTQyxHQUFjLFFBQUFDLEVBQVE7QUFBQSxJQUNoRCxNQUFBNUY7QUFBQSxJQUNBLFVBQUE2RjtBQUFBLEVBQ0osR0FBSztBQUNELFNBQUssZUFBZUYsR0FDcEIsS0FBSyxXQUFXLENBQUMsR0FBR0QsR0FBUSxHQUFHQyxHQUFjLEdBQUdDLENBQU0sR0FDdEQsS0FBSyxvQkFBb0I1RixFQUFLLG1CQUM5QixLQUFLLGlCQUFpQkEsRUFBSyxZQUMzQixLQUFLLE1BQU1BLEVBQUssS0FDaEIsS0FBSyxXQUFXNkY7QUFBQSxFQUNqQjtBQUFBLEVBQ0QsSUFBSSxtQkFBbUI7QUFDckIsV0FBTyxLQUFLLHFCQUFxQixLQUFLO0FBQUEsRUFDdkM7QUFBQSxFQUNELE9BQU9DLEdBQUloQixHQUFZO0FBQ3JCLFVBQU0sRUFBRSxLQUFBaUIsR0FBSyxVQUFBN3BELEdBQVUsa0JBQUE4cEQsRUFBZ0IsSUFBSztBQUU1QyxXQUFPRixFQUFHQyxHQUFLakIsR0FEQ2tCLElBQThCLEVBQUUsU0FBUyxNQUFNOXBELE1BQTVCQSxDQUNGO0FBQUEsRUFDbEM7QUFBQSxFQUNELFVBQVU7QUFDUixVQUFNLEVBQUUsY0FBQXlwRCxHQUFjLFVBQUFFLEVBQVUsSUFBRztBQUNuQyxJQUFBRixFQUFhLFFBQVEsQ0FBQzUwQyxHQUFNL1IsTUFBVTtBQUNwQyxNQUFBc21ELEdBQVdELEdBQXVCdDBDLENBQUksR0FBRztBQUFBLFFBQ3ZDLFNBQVM4MEMsRUFBUzdtRCxDQUFLO0FBQUEsUUFDdkIsT0FBQUE7QUFBQSxNQUNSLENBQU87QUFBQSxJQUNQLENBQUs7QUFBQSxFQUNGO0FBQUEsRUFDRCxnQkFBZ0J1bUQsR0FBWTtBQUMxQixXQUFPQyxHQUFXRCxDQUFVO0FBQUEsRUFDN0I7QUFBQSxFQUNELHVCQUF1QlUsR0FBVS9YLEdBQVM7QUFDeEMsVUFBTSxFQUFFLGNBQUF5WCxFQUFjLElBQUcsTUFDbkIsRUFBRSxRQUFBdmUsRUFBUSxJQUFHdWUsR0FDYk8sSUFBY2hZLEVBQVEsVUFDdEJxWCxJQUFhVyxFQUFZLEtBQUtELENBQVE7QUFDNUMsUUFBSVYsTUFBZTtBQUNqQixhQUFPbmU7QUFFVCxVQUFNcGlDLElBQVV3Z0QsR0FBV0QsQ0FBVTtBQUNyQyxRQUFJdmdEO0FBQ0YsYUFBT0EsRUFBUTtBQUVqQixRQUFJb2lDLE1BQVc7QUFDYixhQUFPO0FBRVQsVUFBTStlLElBQXNCZCxHQUF1Qk0sRUFBYSxDQUFDLENBQUMsR0FDNURTLElBQTJCLENBQUMsR0FBR0YsQ0FBVyxFQUFFLFVBQVUsQ0FBQ0csTUFBYUEsTUFBYUYsQ0FBbUI7QUFDMUcsV0FBT0YsSUFBV0csSUFBMkIsSUFBSWhmO0FBQUEsRUFDbEQ7QUFDSDtBQUNBLFNBQVNrZixHQUFRM2dDLEdBQU9yc0IsR0FBSztBQUMzQixRQUFNaXRELElBQVk1Z0MsRUFBTXJzQixDQUFHO0FBQzNCLFNBQU9pdEQsSUFBWUEsRUFBVyxJQUFHO0FBQ25DO0FBQ0EsU0FBU0MsR0FBYSxFQUFFLFFBQUE1akQsR0FBUSxVQUFBaWpELEdBQVUsUUFBQVksRUFBTSxHQUFJO0FBQ2xELFFBQU1DLElBQWlCYixLQUFZLElBQzdCLENBQUNILEdBQVFFLENBQU0sSUFBSSxDQUFDLFVBQVUsUUFBUSxFQUFFLElBQUksQ0FBQzd2RCxNQUFTdXdELEdBQVExakQsR0FBUTdNLENBQUksQ0FBQyxHQUMzRSxFQUFFLE1BQUFzRCxFQUFNLElBQUd1SjtBQUNqQixNQUFJLENBQUN2SjtBQUNILFVBQU0sSUFBSSxNQUFNLDBDQUEwQztBQUU1RCxRQUFNc3NELElBQWVlLEVBQWUsUUFBUSxDQUFDeFksR0FBU2x2QyxNQUFVM0YsRUFBSyxFQUFFLFNBQUE2MEMsR0FBUyxPQUFBbHZDLEVBQUssQ0FBRSxFQUFFLElBQUksQ0FBQytSLE9BQzVGQSxFQUFLLE1BQU0wMUMsRUFBT3ZZLENBQU8sR0FDekJuOUIsRUFBSyxRQUFRdXlDLEdBQWNELEdBQWUsQ0FBQSxHQUFJdHlDLEVBQUssU0FBUyxDQUFFLENBQUEsR0FBRyxFQUFFLGtCQUFrQixHQUFNLENBQUEsR0FDcEZBLEVBQ1IsQ0FBQztBQUNGLE1BQUk0MEMsRUFBYSxXQUFXZSxFQUFlO0FBQ3pDLFVBQU0sSUFBSSxNQUFNLG9DQUFvQztBQUV0RCxTQUFPO0FBQUEsSUFDTCxRQUFBaEI7QUFBQSxJQUNBLFFBQUFFO0FBQUEsSUFDQSxTQUFTRDtBQUFBLEVBQ2I7QUFDQTtBQUNBLFNBQVNnQixHQUFtQlosR0FBSztBQUMvQixRQUFNYSxJQUFhcEMsR0FBYXVCLENBQUcsR0FDN0JjLElBQW9CLENBQUN0QyxHQUFVd0IsQ0FBRyxLQUFLLENBQUNhO0FBQzlDLFNBQU87QUFBQSxJQUNMLFlBQUFBO0FBQUEsSUFDQSxtQkFBQUM7QUFBQSxJQUNBLEtBQUtBLElBQW9CcDlCLEVBQWlCczhCLENBQUcsSUFBSWEsSUFBYUUsS0FBa0JmO0FBQUEsRUFDcEY7QUFDQTtBQUNBLFNBQVNnQixHQUEwQixFQUFFLFFBQUFua0QsR0FBUSxLQUFBbWpELEdBQUssVUFBQUYsR0FBVSxRQUFBWSxFQUFNLEdBQUk7QUFDcEUsUUFBTTUxQyxJQUFRMjFDLEdBQWEsRUFBRSxRQUFBNWpELEdBQVEsVUFBQWlqRCxHQUFVLFFBQUFZLEVBQU0sQ0FBRSxHQUNqRHpHLElBQU8yRyxHQUFtQlosQ0FBRztBQUNuQyxTQUFPLElBQUlOLEdBQW1CLEVBQUUsT0FBQTUwQyxHQUFPLE1BQUFtdkMsR0FBTSxVQUFBNkYsRUFBVSxDQUFBO0FBQ3pEO0FBQ0EsU0FBU3A5QixHQUFLdStCLEdBQVNDLEdBQVM7QUFDOUIsRUFBQTkwQyxHQUFTLE1BQU0sS0FBSyxNQUFNNjBDLEVBQVEsWUFBYSxHQUFFQyxDQUFPLENBQUM7QUFDM0Q7QUFDQSxTQUFTQyxHQUFPRixHQUFTO0FBQ3ZCLFNBQU8sQ0FBQ0MsR0FBU0UsTUFBb0I7QUFDbkMsUUFBSSxLQUFLLGFBQWE7QUFDcEIsYUFBTyxLQUFLLFNBQVNILENBQU8sRUFBRSxFQUFFQyxHQUFTRSxDQUFlO0FBQUEsRUFFOUQ7QUFDQTtBQUNBLFNBQVNDLEdBQWNKLEdBQVM7QUFDOUIsUUFBTUssSUFBbUJILEdBQU8sS0FBSyxNQUFNRixDQUFPO0FBQ2xELFNBQU8sQ0FBQ0MsR0FBU0UsTUFBb0I7QUFDbkMsSUFBQUUsRUFBaUIsS0FBSyxNQUFNSixHQUFTRSxDQUFlLEdBQ3BEMStCLEdBQUssS0FBSyxNQUFNdStCLEdBQVNDLENBQU87QUFBQSxFQUNwQztBQUNBO0FBQ0EsSUFBSUssS0FBa0I7QUFDdEIsTUFBTTU1QyxLQUFRO0FBQUEsRUFDWixNQUFNO0FBQUEsSUFDSixNQUFNO0FBQUEsSUFDTixVQUFVO0FBQUEsSUFDVixTQUFTO0FBQUEsRUFDVjtBQUFBLEVBQ0QsWUFBWTtBQUFBLElBQ1YsTUFBTTtBQUFBLElBQ04sVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLEVBQ1Y7QUFBQSxFQUNELFNBQVM7QUFBQSxJQUNQLE1BQU0sQ0FBQyxRQUFRLFFBQVE7QUFBQSxJQUN2QixVQUFVO0FBQUEsRUFDWDtBQUFBLEVBQ0QsT0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLElBQ04sU0FBUyxDQUFDOEYsTUFDREE7QUFBQSxFQUVWO0FBQUEsRUFDRCxLQUFLO0FBQUEsSUFDSCxNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsRUFDVjtBQUFBLEVBQ0QsTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sU0FBUztBQUFBLEVBQ1Y7QUFBQSxFQUNELGVBQWU7QUFBQSxJQUNiLE1BQU07QUFBQSxJQUNOLFVBQVU7QUFBQSxJQUNWLFNBQVM7QUFBQSxFQUNWO0FBQ0gsR0FDTStVLEtBQVE7QUFBQSxFQUNaO0FBQUEsRUFDQTtBQUFBLEVBQ0EsR0FBRyxDQUFDLEdBQUdOLEdBQU8sZUFBZSxHQUFHQSxHQUFPLElBQUksRUFBRSxJQUFJLENBQUMydEIsTUFBUUEsRUFBSSxZQUFXLENBQUU7QUFDN0UsR0FDTTJSLEtBQXFCamxELEdBQWdCO0FBQUEsRUFDekMsTUFBTTtBQUFBLEVBQ04sY0FBYztBQUFBLEVBQ2QsT0FBQW9MO0FBQUEsRUFDQSxPQUFBNmE7QUFBQSxFQUNBLE9BQU87QUFDTCxXQUFPO0FBQUEsTUFDTCxPQUFPO0FBQUEsSUFDYjtBQUFBLEVBQ0c7QUFBQSxFQUNELFNBQVM7QUFDUCxRQUFJO0FBQ0YsV0FBSyxRQUFRO0FBQ2IsWUFBTSxFQUFFLFFBQUEzbEIsR0FBUSxRQUFBZ2lELEdBQVEsS0FBQW1CLEdBQUssZUFBQWxCLEdBQWUsVUFBQWdCLEdBQVUsUUFBQVksRUFBUSxJQUFHLE1BQzNEZSxJQUFxQlQsR0FBMEI7QUFBQSxRQUNuRCxRQUFBbmtEO0FBQUEsUUFDQSxLQUFBbWpEO0FBQUEsUUFDQSxVQUFBRjtBQUFBLFFBQ0EsUUFBQVk7QUFBQSxNQUNSLENBQU87QUFDRCxXQUFLLHFCQUFxQmU7QUFDMUIsWUFBTTFDLElBQWFILEdBQXVCLEVBQUUsUUFBQUMsR0FBUSxlQUFBQyxFQUFlLENBQUE7QUFDbkUsYUFBTzJDLEVBQW1CLE9BQU90aEMsSUFBRzQrQixDQUFVO0FBQUEsSUFDL0MsU0FBUXpvRCxHQUFLO0FBQ1osa0JBQUssUUFBUSxJQUNONnBCLEdBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLFFBQVMsR0FBRTdwQixFQUFJLEtBQUs7QUFBQSxJQUN2RDtBQUFBLEVBQ0Y7QUFBQSxFQUNELFVBQVU7QUFDUixJQUFJLEtBQUssU0FBUyxRQUFRLEtBQUssZUFBZSxRQUM1Q3duRCxHQUFVLE1BQU0sOEVBQThFO0FBQUEsRUFFakc7QUFBQSxFQUNELFVBQVU7QUFDUixRQUFJLEtBQUs7QUFDUDtBQUVGLFVBQU0sRUFBRSxRQUFBZSxHQUFRLEtBQUE2QyxHQUFLLG9CQUFBRCxFQUFrQixJQUFLO0FBQzVDLElBQUFBLEVBQW1CLFFBQU87QUFDMUIsVUFBTUUsSUFBa0IzQyxHQUFxQjtBQUFBLE1BQzNDLFFBQUFIO0FBQUEsTUFDQSxpQkFBaUI7QUFBQSxRQUNmLGVBQWUsQ0FBQzFzRCxNQUFVa3ZELEdBQWMsS0FBSyxNQUFNbHZELENBQUs7QUFBQSxRQUN4RCxNQUFNLENBQUNBLE1BQVV1d0IsR0FBSyxLQUFLLE1BQU12d0IsQ0FBSztBQUFBLFFBQ3RDLFFBQVEsQ0FBQ0EsTUFBVWd2RCxHQUFPLEtBQUssTUFBTWh2RCxDQUFLO0FBQUEsTUFDM0M7QUFBQSxJQUNQLENBQUssR0FDS3l2RCxJQUFtQkYsRUFBSSxhQUFhLElBQUlBLElBQU1BLEVBQUk7QUFDeEQsU0FBSyxZQUFZLElBQUk5VSxHQUFTZ1YsR0FBa0JELENBQWUsR0FDL0QsS0FBSyxtQkFBbUJDLEdBQ3hCQSxFQUFpQiwwQkFBMEI7QUFBQSxFQUM1QztBQUFBLEVBQ0QsVUFBVTtBQUNSLFNBQUssbUJBQW1CO0VBQ3pCO0FBQUEsRUFDRCxnQkFBZ0I7QUFDZCxJQUFJLEtBQUssY0FBYyxVQUNyQixLQUFLLFVBQVU7RUFDbEI7QUFBQSxFQUNELFVBQVU7QUFBQSxJQUNSLFdBQVc7QUFDVCxZQUFNLEVBQUUsTUFBQXg5QyxFQUFNLElBQUc7QUFDakIsYUFBT0EsS0FBYyxLQUFLO0FBQUEsSUFDM0I7QUFBQSxJQUNELFNBQVM7QUFDUCxZQUFNLEVBQUUsU0FBQXk5QyxFQUFTLElBQUc7QUFDcEIsYUFBSSxPQUFPQSxLQUFZLGFBQ2RBLElBRUYsQ0FBQzFaLE1BQVlBLEVBQVEwWixDQUFPO0FBQUEsSUFDcEM7QUFBQSxFQUNGO0FBQUEsRUFDRCxPQUFPO0FBQUEsSUFDTCxRQUFRO0FBQUEsTUFDTixRQUFRQyxHQUFnQjtBQUN0QixjQUFNLEVBQUUsV0FBQUMsRUFBVyxJQUFHO0FBQ3RCLFFBQUtBLEtBRUw3QyxHQUF3QjRDLENBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQ3Z1RCxHQUFLNUIsQ0FBSyxNQUFNO0FBQ2hFLFVBQUFvd0QsRUFBVSxPQUFPeHVELEdBQUs1QixDQUFLO0FBQUEsUUFDckMsQ0FBUztBQUFBLE1BQ0Y7QUFBQSxNQUNELE1BQU07QUFBQSxJQUNQO0FBQUEsRUFDRjtBQUFBLEVBQ0QsU0FBUztBQUFBLElBQ1AsZ0JBQWdCNnRELEdBQVk7QUFDMUIsYUFBTyxLQUFLLG1CQUFtQixnQkFBZ0JBLENBQVUsS0FBSztBQUFBLElBQy9EO0FBQUEsSUFDRCx5Q0FBeUN3QyxHQUFZO0FBQ25ELGFBQU9BLEVBQVc7QUFBQSxJQUNuQjtBQUFBLElBQ0QsWUFBWW5TLEdBQUs7QUFDZixNQUFBempDLEdBQVMsTUFBTSxLQUFLLE1BQU0sVUFBVXlqQyxDQUFHLENBQUM7QUFBQSxJQUN6QztBQUFBLElBQ0QsVUFBVW9TLEdBQVE7QUFDaEIsVUFBSSxLQUFLLE1BQU07QUFDYixRQUFBQSxFQUFPLEtBQUssSUFBSTtBQUNoQjtBQUFBLE1BQ0Q7QUFDRCxZQUFNQyxJQUFVLENBQUMsR0FBRyxLQUFLLFVBQVU7QUFDbkMsTUFBQUQsRUFBT0MsQ0FBTyxHQUNkLEtBQUssTUFBTSxxQkFBcUJBLENBQU87QUFBQSxJQUN4QztBQUFBLElBQ0QsYUFBYTtBQUNYLFlBQU1DLElBQWEsQ0FBQy85QyxNQUFTQSxFQUFLLE9BQU8sR0FBRyxTQUFTO0FBQ3JELFdBQUssVUFBVSs5QyxDQUFVO0FBQUEsSUFDMUI7QUFBQSxJQUNELGVBQWV4UixHQUFVQyxHQUFVO0FBQ2pDLFlBQU13UixJQUFpQixDQUFDaCtDLE1BQVNBLEVBQUssT0FBT3dzQyxHQUFVLEdBQUd4c0MsRUFBSyxPQUFPdXNDLEdBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyRixXQUFLLFVBQVV5UixDQUFjO0FBQUEsSUFDOUI7QUFBQSxJQUNELCtCQUErQixFQUFFLElBQUFoTixHQUFJLFNBQUFpTixLQUFXO0FBQzlDLFlBQU0vZ0QsSUFBWSxLQUFLLHlDQUF5Qzh6QyxDQUFFO0FBQ2xFLFVBQUksQ0FBQzl6QztBQUNILGVBQU8sRUFBRSxXQUFBQSxFQUFTO0FBRXBCLFlBQU04QyxJQUFPOUMsRUFBVSxVQUNqQnJDLElBQVUsRUFBRSxNQUFBbUYsR0FBTSxXQUFBOUM7QUFDeEIsVUFBSTh6QyxNQUFPaU4sS0FBV2orQyxHQUFNO0FBQzFCLGNBQU1rK0MsSUFBY2hoRCxFQUFVLGdCQUFnQitnRCxDQUFPLEtBQUssQ0FBQTtBQUMxRCxlQUFPL0UsR0FBZUEsR0FBZSxDQUFBLEdBQUlnRixDQUFXLEdBQUdyakQsQ0FBTztBQUFBLE1BQy9EO0FBQ0QsYUFBT0E7QUFBQSxJQUNSO0FBQUEsSUFDRCx1QkFBdUJpaEQsR0FBVTtBQUMvQixhQUFPLEtBQUssbUJBQW1CLHVCQUF1QkEsR0FBVSxLQUFLLGdCQUFnQjtBQUFBLElBQ3RGO0FBQUEsSUFDRCxZQUFZclEsR0FBSztBQUNmLFdBQUssVUFBVSxLQUFLLGdCQUFnQkEsRUFBSSxJQUFJLEdBQzVDQSxFQUFJLEtBQUssa0JBQWtCLEtBQUssTUFBTSxLQUFLLFFBQVEsT0FBTyxHQUMxRDBSLEtBQWtCMVIsRUFBSTtBQUFBLElBQ3ZCO0FBQUEsSUFDRCxVQUFVQSxHQUFLO0FBQ2IsWUFBTTFILElBQVUwSCxFQUFJLEtBQUs7QUFDekIsVUFBSTFILE1BQVk7QUFDZDtBQUVGLE1BQUFxVixHQUFXM04sRUFBSSxJQUFJO0FBQ25CLFlBQU1lLElBQVcsS0FBSyx1QkFBdUJmLEVBQUksUUFBUTtBQUN6RCxXQUFLLFdBQVdlLEdBQVUsR0FBR3pJLENBQU87QUFDcEMsWUFBTW9hLElBQVEsRUFBRSxTQUFBcGEsR0FBUyxVQUFBeUk7QUFDekIsV0FBSyxZQUFZLEVBQUUsT0FBQTJSLEVBQUssQ0FBRTtBQUFBLElBQzNCO0FBQUEsSUFDRCxhQUFhMVMsR0FBSztBQUVoQixVQURBNE4sR0FBYSxLQUFLLEtBQUs1TixFQUFJLE1BQU1BLEVBQUksUUFBUSxHQUN6Q0EsRUFBSSxhQUFhLFNBQVM7QUFDNUIsUUFBQTJOLEdBQVczTixFQUFJLEtBQUs7QUFDcEI7QUFBQSxNQUNEO0FBQ0QsWUFBTSxFQUFFLE9BQU9jLEdBQVUsU0FBQXhJLEVBQU8sSUFBSyxLQUFLO0FBQzFDLFdBQUssV0FBV3dJLEdBQVUsQ0FBQztBQUMzQixZQUFNNlIsSUFBVSxFQUFFLFNBQUFyYSxHQUFTLFVBQUF3STtBQUMzQixXQUFLLFlBQVksRUFBRSxTQUFBNlIsRUFBTyxDQUFFO0FBQUEsSUFDN0I7QUFBQSxJQUNELGFBQWEzUyxHQUFLO0FBQ2hCLE1BQUEyTixHQUFXM04sRUFBSSxJQUFJLEdBQ25CNE4sR0FBYTVOLEVBQUksTUFBTUEsRUFBSSxNQUFNQSxFQUFJLFFBQVE7QUFDN0MsWUFBTWMsSUFBVyxLQUFLLFFBQVEsT0FDeEJDLElBQVcsS0FBSyx1QkFBdUJmLEVBQUksUUFBUTtBQUN6RCxXQUFLLGVBQWVjLEdBQVVDLENBQVE7QUFDdEMsWUFBTWdCLElBQVEsRUFBRSxTQUFTLEtBQUssUUFBUSxTQUFTLFVBQUFqQixHQUFVLFVBQUFDO0FBQ3pELFdBQUssWUFBWSxFQUFFLE9BQUFnQixFQUFLLENBQUU7QUFBQSxJQUMzQjtBQUFBLElBQ0QsbUJBQW1CNlEsR0FBZ0I1UyxHQUFLO0FBQ3RDLFVBQUksQ0FBQzRTLEVBQWU7QUFDbEIsZUFBTztBQUVULFlBQU10QyxJQUFjLENBQUMsR0FBR3RRLEVBQUksR0FBRyxRQUFRLEVBQUUsT0FBTyxDQUFDejBDLE1BQU9BLEVBQUcsTUFBTSxZQUFlLE1BQU0sR0FDaEZzbkQsSUFBa0J2QyxFQUFZLFFBQVF0USxFQUFJLE9BQU8sR0FDakQ4UyxJQUFlRixFQUFlLFVBQVUsdUJBQXVCQyxDQUFlO0FBRXBGLGFBRHNCdkMsRUFBWSxRQUFRb0IsRUFBZSxNQUFNLE1BQ3ZDLENBQUMxUixFQUFJLGtCQUFrQjhTLElBQWVBLElBQWU7QUFBQSxJQUM5RTtBQUFBLElBQ0QsV0FBVzlTLEdBQUtrQixHQUFlO0FBQzdCLFlBQU0sRUFBRSxNQUFBNlIsR0FBTSxVQUFBOUMsRUFBVSxJQUFHO0FBQzNCLFVBQUksQ0FBQzhDLEtBQVEsQ0FBQzlDO0FBQ1osZUFBTztBQUVULFlBQU0yQyxJQUFpQixLQUFLLCtCQUErQjVTLENBQUcsR0FDeERnVCxJQUFjLEtBQUssbUJBQW1CSixHQUFnQjVTLENBQUcsR0FDekRpVCxJQUFpQnZGLEdBQWNELEdBQWUsQ0FBQSxHQUFJLEtBQUssT0FBTyxHQUFHO0FBQUEsUUFDckUsYUFBQXVGO0FBQUEsTUFDUixDQUFPLEdBQ0tFLElBQVl4RixHQUFjRCxHQUFlLENBQUUsR0FBRXpOLENBQUcsR0FBRztBQUFBLFFBQ3ZELGdCQUFBNFM7QUFBQSxRQUNBLGdCQUFBSztBQUFBLE1BQ1IsQ0FBTztBQUNELGFBQU9GLEVBQUtHLEdBQVdoUyxDQUFhO0FBQUEsSUFDckM7QUFBQSxJQUNELFlBQVk7QUFDVixNQUFBd1EsS0FBa0I7QUFBQSxJQUNuQjtBQUFBLEVBQ0Y7QUFDSCxDQUFDLEdDbmlCRHlCLEtBQWV6bUQsR0FBZ0I7QUFBQSxFQUM3QixNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsSUFDTCxZQUFZO0FBQUEsTUFDVixTQUFTO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE9BQU8sQ0FBQyxxQkFBcUIsUUFBUTtBQUFBLEVBQ3JDLE1BQU1vTCxHQUFPOVgsR0FBSztBQUNWLFVBQUEsRUFBRSxJQUFBSyxNQUFPdUksTUFDVDdGLElBQVUzQyxFQUFTLE1BQ2hCO0FBQUEsTUFDTDtBQUFBLFFBQ0UsT0FBTztBQUFBLFFBQ1AsTUFBTUMsRUFBRyxNQUFNO0FBQUE7QUFBQSxNQUNqQjtBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU87QUFBQSxRQUNQLE1BQU1BLEVBQUcsTUFBTTtBQUFBO0FBQUEsTUFDakI7QUFBQSxNQUNBO0FBQUEsUUFDRSxPQUFPO0FBQUEsUUFDUCxNQUFNQSxFQUFHLE1BQU07QUFBQTtBQUFBLE1BQ2pCO0FBQUEsSUFBQSxDQUVIO0FBRUQsYUFBU0ssRUFBT29CLEdBQVk7QUFDdEIsTUFBQTlCLEVBQUEsS0FBSyxxQkFBcUI4QixDQUFLLEdBQy9COUIsRUFBQSxLQUFLLFVBQVU4QixDQUFLO0FBQUEsSUFDMUI7QUFDTyxXQUFBO0FBQUEsTUFDTCxJQUFBekI7QUFBQSxNQUNBLFNBQUEwQztBQUFBLE1BQ0EsUUFBQXJDO0FBQUEsSUFBQTtBQUFBLEVBRUo7QUFDRixDQUFDOztZQ3JEQ210QixFQVNZLFdBQUE7Z0JBUlZRLEVBT0VwaEIsRUFBQSxHQUFBLFlBTmlCbEssSUFBTyxHQUFqQixFQUFNLE9BQUEsb0NBQUEsR0FBQTtBQUFBLElBQUEsU0FBQWdyQixFQUFBLE1BQUE7QUFBQSxPQUNQeGdCLEVBQUEsRUFBTyxHQUFJQyxFQUFBK3BCLElBQUEsTUFBQUMsR0FBQXZxQixFQUFBLFNBQUEsQ0FBQW9ULE9BQ1ZtUyxFQUFBQSxHQUFBQSxFQUFzQmlSLEdBQUs7QUFBQSxRQUNqQyxLQUFJcGpCLEVBQVE7QUFBQSxRQUNiLE1BQUtwVCxFQUFPLGVBQUFvVCxFQUFBLFFBQUEsWUFBQTtBQUFBLFFBQ1gsTUFBS0EsRUFBQTtBQUFBLFFBQUEsTUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztBQytDTixVQUFBLEVBQUUsSUFBQWhnQixNQUFPdUksTUFDVCtwQixJQUFRc2pCLEdBUVIsRUFBRSxpQkFBQTUvQixHQUFpQixnQkFBQXVnQyxHQUFnQixvQkFBQUMsR0FBb0IsTUFBQS9xQyxHQUFNLFFBQUFtaUMsRUFBTyxJQUN4RXoyQixHQUE2QmsvQixFQUF1QjtBQUN0RCxhQUFTMkIsRUFBVUMsR0FBYztBQUMvQixhQUFPQSxFQUFRLFNBQVNBLEVBQVEsU0FBU0EsRUFBUSxPQUFPeHNDLEVBQUssTUFBTTtBQUFBLElBQ3JFO0FBRUEsYUFBU3NuRCxFQUFnQnZwRCxHQUFRO0FBQ3pCLFlBQUF3cEQsSUFBU3hwRCxFQUFFLGVBQWUsU0FDMUJvRSxJQUFTcEUsRUFBRSxlQUFlLFNBQzFCeXBELElBQThCLENBQUE7QUFDekIsaUJBQUE3dkQsS0FBUW16QyxFQUFlO0FBQzVCLFFBQUFuekMsRUFBSyxRQUFRNHZELEVBQU8sTUFDdEJDLEVBQU8sS0FBS3JsRCxDQUFNLElBQ1R4SyxFQUFLLFFBQVF3SyxFQUFPLE1BQzdCcWxELEVBQU8sS0FBS0QsQ0FBTSxJQUVsQkMsRUFBTyxLQUFLN3ZELENBQUk7QUFJcEIsVUFBSTh2RCxJQUFZLEdBQ1pDLElBQWFGLEVBQU8sU0FBUyxHQUM3QkcsSUFBY0gsRUFBTyxTQUFTLEdBQzlCSSxJQUFjO0FBQ2xCLGVBQVNydEQsSUFBSSxHQUFHQSxJQUFJaXRELEVBQU8sUUFBUWp0RCxLQUFLO0FBQ2hDLGNBQUE1QyxJQUFPNnZELEVBQU9qdEQsQ0FBQztBQUNqQixRQUFBNUMsRUFBSyxVQUFVLFNBQ0w4dkQsSUFBQWx0RCxJQUNINUMsRUFBSyxVQUFVLFVBQ1grdkQsSUFBQUEsSUFBYW50RCxJQUFJQSxJQUFJbXRELEtBRXBCQyxJQUFBQSxJQUFjcHRELElBQUlBLElBQUlvdEQsR0FDdEJDLElBQUFBLElBQWNydEQsSUFBSUEsSUFBSXF0RDtBQUFBLE1BRXhDO0FBRUksVUFBQUQsSUFBY0YsS0FBYUcsSUFBY0Y7QUFFcEMsZUFBQTtBQUFBLElBRVg7QUFDQSxhQUFTRyxFQUFlandELEdBQUs7QUFDM0IsYUFBTyxZQUFZQTtBQUFBLElBQ3JCO0FBZ0JBLGFBQVNrd0QsRUFBY3RiLEdBQWM7QUFDM0IsTUFBQUEsRUFBQSxPQUFPLENBQUNBLEVBQVE7QUFHeEIsZUFBU3ViLEVBQWV2YixHQUFjO0FBQ3BDLFFBQUlBLEVBQVEsWUFDVkEsRUFBUSxTQUFTLFFBQVEsQ0FBQ3p1QyxNQUFXO0FBQ25DLFVBQUksQ0FBQ0EsRUFBRSxVQUFVQSxFQUFFLGVBR25CQSxFQUFFLE9BQU95dUMsRUFBUSxNQUNqQnViLEVBQWVocUQsQ0FBQztBQUFBLFFBQUEsQ0FDakI7QUFBQSxNQUVMO0FBQ0EsTUFBQWdxRCxFQUFldmIsQ0FBTztBQUV0QixlQUFTd2IsRUFBYXhiLEdBQVM7QUFDN0IsWUFBSUEsRUFBUSxVQUFVO0FBQ3BCLGdCQUFNbnlDLElBQVNteUMsRUFBUTtBQUN2QixVQUFJbnlDLE1BQ0ZBLEVBQU8sT0FBT0EsRUFBTyxTQUFTLE9BQU8sQ0FBQzBELE1BQVdBLEVBQUUsVUFBVUEsRUFBRSxTQUFTLEVBQUksRUFBRSxTQUFTLEdBQ3ZGaXFELEVBQWEzdEQsQ0FBTTtBQUFBLFFBRXZCO0FBQUEsTUFDRjtBQUNBLE1BQUEydEQsRUFBYXhiLENBQU87QUFBQSxJQUN0QjtBQUNBLGFBQVN5YixJQUFpQjtBQUN4QixNQUFBcGhDLEVBQU0sZUFBZTtBQUFBLElBQ3ZCO0FBQ1MsYUFBQXFoQyxFQUFZNXFELEdBQWV0SCxHQUFZO0FBQ3hDLE1BQUE2d0IsRUFBQSxpQkFBaUJ2cEIsR0FBT3RILENBQUs7QUFBQSxJQUNyQzs7O2tCQTNKRWdzQixFQTJDWW1FLEVBQUFpTCxFQUFBLEdBQUE7QUFBQSxRQTNDQSxNQUFNOXBCLEVBQU87QUFBQSxRQUFFLFlBQVM7QUFBQSxRQUFPLE1BQU1nZ0Q7QUFBQSxNQUFBO1FBQ3BDLE1BQ1RybEMsRUFBQSxDQXVDTSxFQXhDVyxTQUFBdXFCLEdBQVMsT0FBQWx2QyxRQUFLOztBQUFBO0FBQUEsWUFDL0JzRSxHQXVDTSxPQUFBLE1BQUE7QUFBQSxpQkF0Q0pBLEdBOEJNLE9BQUE7QUFBQSxnQkE1QkgsT0FBTzJxQyxFQUFVQyxDQUFPO0FBQUEsZ0JBQ3pCLE9BQU07QUFBQSxnQkFDTixNQUFLO0FBQUEsZ0JBQ0osR0FBR2x2QztBQUFBLGNBQUE7aUJBRUptRSxFQUFBLEdBQUF1Z0IsRUFVWU8sRUFUTDRELEVBQUU1eEIsQ0FBQSxFQUFDLFNBQVMsSUFBSSxHQUR2QnF2QixFQVVZO0FBQUEsa0JBUlQsQ0FBQXVDLEVBQUE1eEIsQ0FBQSxFQUFHLFNBQVMsY0FBYyxFQUFBLEdBQUFpNEMsRUFBUTtBQUFBLGtCQUNsQyxZQUFVcm1CLElBQUFBLEVBQWtCNGtCLENBQUEsRUFBQ3lCLEVBQVEsS0FBSyxNQUFoQ3JtQixnQkFBQUEsRUFBbUMsZ0JBQVU7QUFBQSxrQkFDeEQsT0FBTTtBQUFBLGtCQUNMLE9BQU9vbUIsRUFBVUMsQ0FBTztBQUFBLGdCQUFBO3NCQUN4QnFiLEVBQWUxaEMsS0FBRyxTQUFTLFVBQVUsQ0FBQSxDQUFBLEdBQUEsQ0FBQUssTUFBS3NoQyxFQUFjdGIsQ0FBTztBQUFBLGdCQUFBLEdBQy9ELEVBQUEsVUFBUXliLEVBQUEsQ0FBYyxHQUFBO0FBQUEsNkJBRXZCLE1BQXdCO0FBQUEsb0JBQXJCcGlDLEdBQUFDLEdBQUF5bUIsRUFBVUMsQ0FBTyxDQUFBLEdBQUEsQ0FBQTtBQUFBLGtCQUFBOzs7Z0JBRXRCNXFDLEdBV00sT0FYTlosSUFXTTtBQUFBLGtCQVRJbW5ELEVBQU0sZUFEZG5tQyxFQU1Fb21DLElBQUE7QUFBQTtvQkFKUyxZQUFBNWIsRUFBUTtBQUFBLG9CQUFSLHVCQUFBLENBQUFobUIsTUFBQWdtQixFQUFRLFFBQUtobUI7QUFBQSxvQkFDdEIsWUFBUztBQUFBLG9CQUNULE9BQU07QUFBQSxvQkFDTCxVQUFRLENBQUFBLE1BQUEwaEMsRUFBWTVxRCxHQUFPa3BCLENBQU07QUFBQSxrQkFBQTtrQkFFcEM1a0IsR0FFTSxPQUZOQyxJQUVNO0FBQUEsb0JBREpnRixFQUFpQ3FmLEdBQUE7QUFBQSxzQkFBdkIsTUFBTUMsRUFBQTV4QixDQUFBLEVBQUcsTUFBTTtBQUFBOzs7O2dCQTFCckIsQ0FBQW00QyxNQUFBdm1CLElBQUFBLEVBQUE0a0IsQ0FBQSxFQUFtQnlCLEVBQVEsS0FBSyxNQUFoQ3JtQixnQkFBQUEsRUFBbUMsWUFBTSxFQUFBO0FBQUEsY0FBQTtjQThCbkR2a0IsR0FNTSxPQU5OWCxJQU1NO0FBQUEsZ0JBSkl1ckMsRUFBUSxpQkFEaEJ4cUIsRUFJRXFtQyxHQUFBO0FBQUE7a0JBRkMsU0FBUzdiLEVBQVE7QUFBQSxrQkFDakIsZ0JBQUF5YjtBQUFBLGdCQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1NQLFVBQUEsRUFBRSxJQUFBMXpELE1BQU91SSxNQUVULEVBQUUsaUJBQUF5TixHQUFpQixnQkFBQXVnQyxHQUFnQixNQUFBOXFDLEdBQU0sUUFBQW1pQyxNQUFXejJCLEdBQTZCay9CLEVBQXVCLEdBQ3hHNStCLElBQVFtaEIsR0FDUm03QixJQUFhaDBELEVBQVMsTUFDbkJ3SDtBQUFBQSxNQUNMO0FBQUEsUUFDRSxDQUFDdkgsRUFBRyxPQUFPLE9BQU8sR0FBRzR0QyxFQUFPO0FBQUEsUUFDNUIsQ0FBQyxjQUFjNXRDLEVBQUcsT0FBTyxPQUFPLEdBQUcsQ0FBQ3dKLE1BQVc7QUFDN0MsVUFBQW9rQyxFQUFPLFFBQVFwa0M7QUFBQSxRQUNqQjtBQUFBLFFBQ0EsQ0FBQ3hKLEVBQUcsT0FBTyxLQUFLLEdBQUd5WCxFQUFNLFNBQVM7QUFBQSxNQUNwQztBQUFBLE1BQ0FBLEVBQU07QUFBQSxJQUFBLENBRVQsR0FFS3U4QyxJQUFXbnNELEVBQUksRUFBSztBQUUxQixhQUFTb3NELEVBQWlCeHlELEdBQVk7QUFDcEMsTUFBQXV5RCxFQUFTLFFBQVF2eUQsR0FDakI4MEMsRUFBZSxRQUFRQSxFQUFlLE1BQU0sSUFBSSxDQUFDL3NDLE9BQzNDLENBQUNBLEVBQUUsVUFBVUEsRUFBRSxlQUduQkEsRUFBRSxPQUFPL0gsSUFDRitILEVBQ1I7QUFBQSxJQUNIO0FBRU0sVUFBQTBxRCxJQUFlbjBELEVBQVMsT0FDckI7QUFBQSxNQUNMLENBQUNDLEVBQUcsU0FBUyxVQUFVLEdBQUdnMEQsRUFBUztBQUFBLE1BQ25DLENBQUMsY0FBY2gwRCxFQUFHLFNBQVMsVUFBVSxHQUFHLENBQUMwbkIsTUFBVztBQUNsRCxRQUFBdXNDLEVBQWlCdnNDLENBQUM7QUFBQSxNQUNwQjtBQUFBLElBQUEsRUFFSCxHQUVLeXNDLElBQWFwMEQsRUFBUyxNQUNuQncyQyxFQUFlLE1BQU0sT0FBTyxDQUFDL3NDLE1BQVdBLEVBQUUsVUFBVUEsRUFBRSxTQUFTLEVBQUksRUFBRSxNQUM3RSxHQUNLNHFELElBQVlyMEQsRUFBUyxNQUNsQncyQyxFQUFlLE1BQU0sT0FBTyxDQUFDL3NDLE1BQVdBLEVBQUUsTUFBTSxFQUFFLE1BQzFELEdBQ0s2cUQsSUFBa0J0MEQsRUFBUyxNQUN4Qm8wRCxFQUFXLFFBQVEsS0FBS0EsRUFBVyxRQUFRQyxFQUFVLEtBQzdEO0FBRUQsSUFBQTlqRDtBQUFBLE1BQ0UsTUFBTTtBQUNXLFFBQUFpbUMsRUFBQTtBQUFBLE1BQ2pCO0FBQUEsTUFDQSxNQUFNO0FBQ2EsUUFBQStkO01BQ25CO0FBQUEsTUFDQSxFQUFFLFdBQVcsR0FBSztBQUFBLElBQUE7QUFJWCxhQUFBWCxFQUFZNXFELEdBQWV0SCxHQUFZO0FBQzlDLE1BQUlBLE1BQ2E4MEMsRUFBQSxNQUFNeHRDLENBQUssRUFBRSxPQUFPLEtBRWpDdEgsTUFBVSxVQUNHODBDLEVBQUEsTUFBTSxRQUFRQSxFQUFlLE1BQU0sT0FBT3h0QyxHQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsR0FFbkV0SCxNQUFVLFdBQ0c4MEMsRUFBQSxNQUFNLEtBQUtBLEVBQWUsTUFBTSxPQUFPeHRDLEdBQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUVuRHVyRDtJQUNuQjtBQUNBLGFBQVNBLElBQW1CO0FBQ2pCLE1BQUFOLEVBQUEsUUFBUUcsRUFBVyxVQUFVQyxFQUFVO0FBQUEsSUFDbEQ7c0JBekhFbG5ELEVBQUEsR0FBQXVnQixFQWtDWU8sRUFqQ0w0RCxFQUFFNXhCLENBQUEsRUFBQyxPQUFPLElBQUksR0FEckJxdkIsRUFrQ1k7QUFBQSxNQWhDVixPQUFNO0FBQUEsTUFDTCxPQUFPdUMsRUFBSW5tQixDQUFBLEVBQUM7QUFBQSxPQUNMc29ELEVBQVUsT0FBQSxFQUNsQixrQkFBQSxHQUFjLENBQUEsR0FBQTtBQUFBLGlCQUVkLE1BMEJZO0FBQUEsU0ExQlo3bUQsRUFBQSxHQUFBdWdCLEVBMEJZTyxFQXpCTDRELEVBQUE1eEIsQ0FBQSxFQUFHLE9BQU8sa0JBQWMsS0FBQSxHQUFBO0FBQUEsVUFDN0IsT0FBTTtBQUFBLFVBQ0wsT0FBTzR4QixFQUFJbm1CLENBQUEsRUFBQztBQUFBLFFBQUE7cUJBRWIsTUFtQlk7QUFBQSxrQkFuQlpnaUIsRUFtQllPLEVBbkJJNEQsS0FBRyxLQUFLLElBQUksR0FBQSxFQUFFLFFBQU8sV0FBTztBQUFBLHlCQUMxQyxNQWlCTTtBQUFBLGdCQWpCTnZrQixHQWlCTSxPQWpCTmIsSUFpQk07QUFBQSxrQkFoQkphLEdBUU0sT0FSTlosSUFRTTtBQUFBLG9CQVBKWSxHQUtPLFFBTFBDLElBS087QUFBQSx1QkFITEosS0FBQXVnQixFQUVZTyxFQUZJNEQsRUFBQTV4QixDQUFBLEVBQUcsU0FBUyxJQUFJLEdBQWhDcXZCLEVBRVksRUFGdUIsZUFBZWdsQyxFQUFBLFNBQXlCSCxFQUFZLEtBQUEsR0FBQTtBQUFBLG1DQUNyRixNQUFnQjtBQUFBLGdDQUFiQyxFQUFVLEtBQUEsSUFBRyxRQUFHNWlDLEdBQUc2aUMsRUFBUyxLQUFBLEdBQUEsQ0FBQTtBQUFBLHdCQUFBOzs7O29CQUduQy9tRCxHQUE4RCxRQUE5RFgsSUFBOEQ2a0IsR0FBdkNLLEVBQUlubUIsQ0FBQSxFQUFDLEtBQUssSUFBRyxRQUFHOGxCLEdBQUdLLEVBQUlubUIsQ0FBQSxFQUFDLEtBQUssR0FBQSxDQUFBO0FBQUEsa0JBQUE7a0JBR3RENkcsRUFLK0JpaUQsSUFBQTtBQUFBLG9CQUo1QixTQUFTM2lDLEVBQWMya0IsQ0FBQTtBQUFBLG9CQUN2QixXQUFTO0FBQUEsb0JBQ1QsZ0JBQWUrZDtBQUFBLG9CQUNmLGdCQUFlWDtBQUFBOzs7OztZQUl0QnRtQyxHQUE0QnpnQixFQUFBLFFBQUEsU0FBQTtBQUFBLFVBQUE7Ozs7Ozs7SUNwQmxDNG5ELEtBQWVub0QsR0FBZ0I7QUFBQSxFQUM3QixNQUFNO0FBQUEsRUFDTixjQUFjO0FBQUEsRUFDZCxPQUFPO0FBQUEsSUFDTCxTQUFTO0FBQUEsTUFDUCxNQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFFBQVE7QUFDQSxVQUFBLEVBQUUsSUFBQXJNLE1BQU91STtBQUNmLFdBQU8sRUFBRSxJQUFBdkksRUFBRztBQUFBLEVBQ2Q7QUFDRixDQUFDOztBQ3hCQyxRQUFBb2pDLElBQUE1VixFQU1NLFdBTk47Y0FFY3JnQixFQUFnQyxPQUFBWCxJQUFBO0FBQUEsS0FBQVUsRUFBQSxHQUFBdWdCLEVBQTFDTyxFQUVXcGhCLEVBRnVCeVAsR0FBQUEsU0FBQUEsSUFBQUEsR0FBQUEsTUFBQUE7QUFBQUEsTUFBQUEsU0FBQUEsRUFBQUEsTUFBQUE7QUFBQUEsV0FDVixFQUFJLEdBQUFsUCxFQUFBK3BCLElBQUEsTUFBQUMsR0FBQXZxQixFQUFBLFNBQUEsQ0FBQXhKLEdBQUEyRixPQUExQm1FLEVBQUEsR0FBQUMsRUFBbUUrcEIsV0FBbkVudUIsS0FBbUU7QUFBQSxVQUFBM0YsRUFBQSxRQUFBOEosRUFBQSxHQUFBdWdCLEVBQUEyVixHQUFBL1QsRUFBQTtBQUFBLFlBQTNCLEtBQUE7QUFBQSxZQUFHLFNBQUs7QUFBQSxVQUFBLEdBQUFqc0IsR0FBQTtBQUFBOzs7Ozs7OztxREM4RHpDaUosd0JBQWdCO0FBQUEsRUFDN0J2TSxNQUFNO0FBQUEsRUFDTnlELFlBQVk7QUFBQSxJQUFFa3hELGlCQUFBQTtBQUFBQSxFQUFpQjtBQUFBLEVBQy9Cbm1DLGNBQWM7QUFBQSxFQUNkN1csT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUxmLFdBQVc7QUFBQSxNQUNUdFIsTUFBTThvQjtBQUFBQSxJQUNQO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtEeUcsYUFBYTtBQUFBLE1BQ1h2dkIsTUFBTThvQjtBQUFBQSxJQUNQO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJRHdtQyxlQUFlO0FBQUEsTUFDYnR2RCxNQUFNOG9CO0FBQUFBLElBQ1A7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS0R4ckIsU0FBUztBQUFBLE1BQ1AwQyxNQUFNOG9CO0FBQUFBLElBQ1A7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlEbmIsU0FBUztBQUFBLE1BQ1AzTixNQUFNOG9CO0FBQUFBLElBQ1A7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS0Q3UixTQUFTO0FBQUEsTUFDUGpYLE1BQU04b0I7QUFBQUEsSUFDUDtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUR5bUMsa0JBQWtCO0FBQUEsTUFDaEJ2dkQsTUFBTXlwQjtBQUFBQSxNQUNOTCxTQUFTO0FBQUEsSUFDVjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSURvbUMsWUFBWTtBQUFBLE1BQ1Z4dkQsTUFBTXlwQjtBQUFBQSxNQUNOTCxTQUFTO0FBQUEsSUFDVjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLRHFtQyxVQUFVO0FBQUEsTUFDUnp2RCxNQUFNLENBQUN5cEIsU0FBU1gsTUFBTTtBQUFBLE1BQ3RCTSxTQUFTTztBQUFBQSxJQUNWO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJRFcsT0FBTztBQUFBLE1BQ0x0cUIsTUFBTThvQjtBQUFBQSxNQUNOTSxVQUFVO0FBQ1IsZUFBTztNQUNUO0FBQUEsSUFDRDtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSURtUSxNQUFNO0FBQUEsTUFDSnY1QixNQUFNeXBCO0FBQUFBLE1BQ05MLFNBQVM7QUFBQSxJQUNWO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJRCtILFVBQVU7QUFBQSxNQUNSL0gsU0FBUztBQUFBLElBQ1Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtEc21DLGtCQUFrQjtBQUFBLE1BQ2hCdG1DLFNBQVM7QUFBQSxNQUNUcHBCLE1BQU15cEI7QUFBQUEsSUFDUDtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUQzVixLQUFLLENBQUU7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtQdXpCLFVBQVU7QUFBQSxNQUNScm5DLE1BQU04b0I7QUFBQUEsTUFDTk0sU0FBU087QUFBQUEsSUFDWDtBQUFBLEVBQ0Q7QUFBQSxFQUNEdUQsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUw7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJQTtBQUFBLEVBQXFCO0FBQUEsRUFFdkJwRCxNQUFNelgsR0FBWTlYLEdBQVU7QUFDMUIsVUFBTTtBQUFBLE1BQUVLLElBQUFBO0FBQUFBLElBQUssSUFBRXVJLEdBQUssR0FDZDtBQUFBLE1BQUVoQixPQUFBQTtBQUFBQSxRQUFVK0csR0FBUSxHQUNwQmlKLElBQVVoUSxHQUNWO0FBQUEsTUFBRW1JLFlBQUFBO0FBQUFBLE1BQVlsQixtQkFBQUE7QUFBQUEsTUFBbUJFLGNBQUFBO0FBQUFBLElBQWEsSUFBSThCLEdBQVU7QUFFbEVnSyxJQUFBQSxHQUFLL0MsRUFBTTFFLFNBQVUzUCxDQUFBQSxNQUFTO0FBQzVCLE1BQUlBLEVBQUszQixTQUFTLFNBQVMyQixFQUFLM0IsaUJBQWlCK00sS0FBcUJwTCxFQUFLM0IsaUJBQWlCaU4sTUFDMUZyTixHQUFPTixLQUFLLG1EQUFtRDtBQUFBLElBRW5FLENBQUM7QUFFRCxhQUFTMHpCLElBQXlCO0FBRWhDLFlBQU1uakIsSUFBWSxDQUFBO0FBRWxCbk8sYUFBQUEsRUFBUXNVLEVBQU0xRSxTQUFTLENBQUN6SCxHQUFRakksTUFBUTs7QUFDdEMsWUFBSWlJLEVBQU83SixVQUFVc3RCO0FBQ25CO0FBRUYsY0FBTTJGLElBQVdoYixFQUFNcE8sRUFBTzdKLEtBQUs7QUFDbkMsUUFBSWl6QixNQUFhM0YsVUFBYXpqQixFQUFPcXpCLFNBQVMsUUFBU3J6QixJQUFBQSxFQUFPOEYsY0FBUDlGLGdCQUFBQSxFQUFrQnF6QixVQUFTLE9BRWhGcnRCLEVBQUtqTyxDQUFHLElBQUlxeEI7QUFBQUEsTUFFaEIsQ0FBQyxHQUVNcnJCLEdBQVU5QixFQUFNLENBQUUsR0FBRWtRLEVBQU1rZCxhQUFhcmpCLENBQUksQ0FBQztBQUFBLElBQ3JEO0FBRUEsVUFBTThMLElBQVcxSixHQUFTK2dCLEVBQWlCLENBQUU7QUFFN0MsUUFBSW1nQyxJQUFrQjtBQUV0QixVQUFNOS9CLElBQWlEcGxCLEVBQ3JELE1BQ1MrSCxFQUFNMUUsU0FFZjNELEdBQ0EsTUFDQzJELENBQUFBLE1BQWlCO0FBQ2hCLFlBQU0wNUIsSUFBV3BqQyxHQUFVb08sRUFBTWcxQixZQUFZLENBQUUsQ0FBQTtBQUMvQ3RwQyxNQUFBQSxFQUFRNFAsR0FBVTNQLENBQUFBLE1BQVM7QUFDekJtRSxRQUFBQSxFQUFNbkUsR0FBTXFwQyxHQUFVcnBDLENBQUk7QUFBQSxNQUM1QixDQUFDLEdBRUlxVSxFQUFNOGUsWUFFVHB6QixFQUFRNFAsR0FBVTNQLENBQUFBLE1BQVM7QUFDekIsZUFBT0EsRUFBS3FQLE9BQ1osT0FBT3JQLEVBQUtzUDtBQUFBQSxNQUNkLENBQUMsR0FHQytFLEVBQU15QixPQUNSL1YsRUFBUTRQLEdBQVUyVSxDQUFBQSxNQUFNO0FBQ3RCQSxRQUFBQSxFQUFFeE8sTUFBTTNSLEVBQU0sQ0FBRSxHQUFFa1EsRUFBTXlCLEtBQUt3TyxFQUFFeE8sR0FBRztBQUFBLE1BQ3BDLENBQUMsR0FJSC9WLEVBQVE0UCxHQUFVM1AsQ0FBQUEsTUFBUztBQUN6QkEsUUFBQUEsRUFBSzJ4RCxjQUFjLE1BQ1YvakIsRUFBVzV0QyxDQUFJO0FBQUEsTUFFMUIsQ0FBQztBQUdELFVBQUk4eUMsSUFBNkIsQ0FBQTtBQUNqQy95QyxNQUFBQSxFQUFRNFAsR0FBUyxDQUFDMlUsR0FBR3JrQixNQUFRO0FBQzNCcWtCLFFBQUFBLEVBQUVpZCxPQUFPdGhDLEdBQ1Q2eUMsRUFBUXBsQyxLQUFLNFcsQ0FBQztBQUFBLE1BQ2hCLENBQUMsR0FDRHd1QixJQUFVbGlDLEdBQU9raUMsR0FBVTl5QyxDQUFBQSxNQUNsQkEsRUFBSzZOLFNBQVNSLEdBQVV3RCxZQUNoQztBQUVELFlBQU1zN0IsSUFFRixDQUFBO0FBRUoyRyxhQUFBQSxFQUFRL3lDLFFBQVNDLENBQUFBLE1BQVM7QUFDeEIsWUFBSXVoQyxJQUFPdmhDLEVBQUt1aEM7QUFDaEIsZUFBT3ZoQyxFQUFLdWhDLE1BQ1o0SyxFQUFjNUssQ0FBSSxJQUFJdmhDO0FBQUFBLE1BQ3hCLENBQUMsR0FDTW1zQztBQUFBQSxJQUNULENBQ0Y7QUFFQSxhQUFTeWxCLElBQWtCO0FBQ3pCLFlBQU1OLElBQWdCcnJELEdBQVUrVCxDQUFRO0FBQ3hDemQsTUFBQUEsRUFBSTZ5QixLQUFLLHdCQUF3QmtpQyxDQUFhO0FBQUEsSUFDaEQ7QUFFQXBrRCxJQUFBQSxHQUNFLE1BQ1NtSCxFQUFNaTlDLGVBRWRqekQsQ0FBQUEsTUFBZTtBQUNkLGlCQUFXNEIsS0FBTytaO0FBQ2hCLGVBQU9BLEVBQVMvWixDQUFHO0FBRXJCa0UsTUFBQUEsRUFBTTZWLEdBQVUzYixLQUFTLENBQUEsQ0FBRTtBQUFBLElBQzdCLEdBQ0E7QUFBQSxNQUNFK29DLE1BQU07QUFBQSxJQUNSLENBQ0Y7QUFFQSxVQUFNM2hDLElBQU1BLENBQUN5SSxHQUFXak8sTUFDZjR4RCxHQUFVM2pELEdBQU1qTyxDQUFHO0FBRzVCLGFBQVM2eEQsRUFBUzd4RCxHQUFhO0FBQzdCLFVBQUlBLEtBQU87QUFHWCxlQUFJQSxFQUFJbXRCLFFBQVEsR0FBRyxLQUFLLElBQ2ZudEIsRUFBSTh4RCxNQUFNLEdBQUcsSUFFZjl4RDtBQUFBQSxJQUNUO0FBUUEsYUFBUzJ0QyxFQUFXNXRDLEdBQVc7QUFDN0IsWUFBTUMsSUFBTUQsRUFBS0M7QUFFakIscUJBQWUreEQsRUFBb0JuakMsSUFBYTtBQUU5Q29qQyxRQUFBQSxHQUFlcGpDLElBQVE3dUIsQ0FBSTtBQUFBLE1BQzdCO0FBRUEsZUFBU2t5RCxJQUFXO0FBQ2xCQyxRQUFBQSxHQUFRbnlELENBQUk7QUFBQSxNQUNkO0FBRUEsZUFBU295RCxFQUFRcHlELElBQVdDLElBQVU7QUFDcEMsUUFBSUEsR0FBSWtlLFNBQVMsV0FDWG5lLEdBQUtxeUQsc0JBQXNCLFdBQzdCQztNQUdOO0FBRUEsVUFBSUMsSUFBbUI7QUFDdkIsTUFBSWwrQyxFQUFNaVksTUFBTSxZQUFZcnNCLENBQUcsSUFDN0JzeUQ7ZUFBcUNsK0MsRUFBTWlZLE1BQU0sWUFBWXJzQixDQUFHO0FBQUEsUUFBQyxPQUFTdXlELEVBQWtCdnlELENBQUc7QUFBQSxNQUFLLEdBQUEsSUFBQSxJQUMzRkQsRUFBS2lQLFNBQ2RzakQsSUFBVXJqRCxFQUFBa2IsRUFBQSxXQUFBLEdBQUE7QUFBQSxRQUFBLGVBQTRCcHFCLEVBQUtpUDtBQUFBQSxRQUFNLE9BQVN1akQsRUFBa0J2eUQsQ0FBRztBQUFBLE1BQUssR0FBQSxJQUFBLElBQzNFRCxFQUFLZ08sYUFBYWhPLEVBQUtnTyxVQUFVdXRCLFNBQVMsT0FDbkRnM0IsSUFBVXJqRCxFQUFBa2IsMEJBQUE2QixFQUFBO0FBQUEsUUFBQSxLQUVBNXRCLENBQUFBLE9BQWU7QUFDbkJvMEQsVUFBQUEsRUFBb0JwMEQsTUFBTTRCLENBQUcsSUFBSTVCO0FBQUFBLFFBQ2xDO0FBQUEsUUFBQSxlQUNZb0gsRUFBSXVVLEdBQVUvWixDQUFHO0FBQUEsUUFBQyxTQUNyQjR1QixDQUFBQSxPQUFnQjtBQUN4QnVqQyxVQUFBQSxFQUFRcHlELEdBQU02dUIsRUFBTTtBQUFBLFFBQ3RCO0FBQUEsU0FDSTd1QixFQUFLZ08sV0FBUztBQUFBLFFBQUEsT0FDWHdrRCxFQUFrQnZ5RCxDQUFHO0FBQUEsUUFBQyx1QkFDUit4RDtBQUFBQSxRQUFtQixTQUMvQkU7QUFBQUEsT0FFWixHQUFBLElBQUE7QUFHSCxZQUFNUSxLQUFhWixFQUFTN3hELENBQUc7QUFFL0IsYUFBT3JELEVBQUd5c0MsU0FBU3A2QixPQUFPO0FBQUEsUUFDeEJvRixPQUFPO0FBQUEsVUFDTCxHQUFHclU7QUFBQUEsVUFDSHlYLE9BQU96WCxFQUFLbVE7QUFBQUEsVUFDWixDQUFDdlQsRUFBR3lzQyxTQUFTenVCLElBQUksR0FBRzgzQztBQUFBQSxVQUNwQjV3RCxNQUFNN0I7QUFBQUEsVUFDTjB5RCxVQUFVMXlEO0FBQUFBLFFBQ1g7QUFBQSxRQUNEcXNCLE9BQU87QUFBQSxVQUNMbEIsVUFBVTtBQUNSLG1CQUFPbW5DO0FBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUVBLFVBQU1LLElBQWdCbnVELEtBQ2hCO0FBQUEsTUFBRWUsR0FBQUE7QUFBQUEsSUFBSSxJQUFFVyxHQUFPLEdBQ2Zzc0QsSUFBMkJodUQsRUFBSSxDQUFBLENBQUU7QUFFdkMsYUFBU291RCxFQUFzQjV5RCxHQUFhO0FBQzFDLGFBQU93eUQsRUFBb0JwMEQsTUFBTTRCLENBQUc7QUFBQSxJQUN0QztBQUVBLGFBQVN3eEIsRUFBZ0J4eEIsR0FBa0I7O0FBQ3pDLGNBQU80eUQsSUFBQUEsRUFBc0I1eUQsQ0FBRyxNQUF6QjR5RCxnQkFBQUEsRUFBNEJ2aUM7QUFBQUEsSUFDckM7QUFFQSxhQUFTdGtCLElBQW1DO0FBQzFDLGFBQU87QUFBQSxRQUFFa0MsTUFBTThMO0FBQUFBLFFBQVVzM0MsZUFBZWo5QyxFQUFNaTlDO0FBQUFBLFFBQWU3L0IsaUJBQUFBO0FBQUFBLFFBQWlCNmdDLFVBQUFBO0FBQUFBLFFBQVVRLFNBQUFBO0FBQUFBLFFBQVNDLFlBQUFBO0FBQUFBO0lBQ25HO0FBRUEsYUFBU1AsRUFBa0J2eUQsR0FBYTtBQUN0QyxhQUFPO0FBQUEsUUFBRSxHQUFHK0wsRUFBYztBQUFBLFFBQUUvTCxLQUFBQTtBQUFBQSxRQUFLNUIsT0FBT29ILEVBQUl1VSxHQUFVL1osQ0FBRztBQUFBO0lBQzNEO0FBRUEsbUJBQWU4eUQsRUFBV0MsSUFBa0IsSUFBT2wyRCxJQUFrQixVQUE0QjtBQUMvRixVQUFJO0FBQ0YsZUFBSXVYLEVBQU04ZSxZQUNSLE1BQU12MkIsRUFBR3NSLEtBQUsra0QsYUFBYUwsRUFBY3YwRCxLQUFLLEdBRXpDO0FBQUEsTUFDUCxTQUFPK0gsR0FBUTtBQUNmLGVBQUs0c0QsS0FDSHoyRCxFQUFJNnlCLEtBQUssa0JBQWtCO0FBQUEsVUFBRSxHQUFHcGpCLEVBQWM7QUFBQSxVQUFFdE8sT0FBTzBJO0FBQUFBLFVBQUd0SixTQUFBQTtBQUFBQSxRQUFRLENBQUMsR0FHOUQ7QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUVBLG1CQUFldzFELElBQVc7QUFDeEIsTUFBSWQsS0FFRkEsRUFBV3YzQixPQUFNLEdBR2YsTUFBTTg0QixFQUFVLE1BQ2xCbkIsS0FDQSxNQUFNOTRDLEdBQVEsR0FDZHZjLEVBQUk2eUIsS0FBSyxXQUFXcGpCLEVBQWMsQ0FBQSxHQUNsQ3pQLEVBQUk2eUIsS0FBSyxVQUFVcGpCLEVBQWMsQ0FBQTtBQUFBLElBRXJDO0FBRUEsbUJBQWU4bUQsSUFBVTtBQUV2QixZQUFNdmhDLElBQWNGLEtBQ2RzQixJQUFhQyxHQUFRNVksQ0FBUTtBQUNuQyxpQkFBVzBLLEtBQVNpTyxHQUFZO0FBQzlCLGNBQU1FLElBQWVwdEIsRUFBSThyQixHQUFhN00sRUFBTSxDQUFDLENBQUM7QUFDOUMsUUFBSW1PLEtBQWdCLE9BQ2xCQyxHQUFNOVksR0FBVTBLLEVBQU0sQ0FBQyxDQUFDLElBRXhCclksR0FBSTJOLEdBQVUwSyxFQUFNLENBQUMsR0FBR21PLENBQVk7QUFBQSxNQUV4QztBQUVBLE1BQUksTUFBTWtnQyxFQUFVLE1BQ2xCbkIsS0FDQSxNQUFNOTRDLEdBQVEsR0FDVnpFLEVBQU1yWCxTQUNScVgsRUFBTXJYLE1BQU1nUCxFQUFZLENBQUUsR0FHNUJ6UCxFQUFJNnlCLEtBQUssVUFBVXBqQixFQUFjLENBQUEsR0FDakN6UCxFQUFJNnlCLEtBQUssU0FBU3BqQixFQUFjLENBQUEsR0FDNUJxSSxFQUFNazlDLG9CQUNSZTtJQUdOO0FBRUEsVUFBTWo3QixJQUFrQjE2QixFQUFTLE1BQU07QUFDckMsWUFBTTZpQyxJQUFZLENBQUEsR0FDWjB6QixJQUFrRDtBQUFBLFFBQ3REMWpELFFBQVE7QUFBQSxVQUNOK3JCLE1BQU07QUFBQSxVQUNOdjVCLE1BQU07QUFBQSxVQUNONlEsVUFBVTtBQUFBO0FBQUEsVUFFVnduQixPQUFRMXVCLENBQUFBLE1BQWdDO0FBQ3RDMm1ELFlBQUFBO1VBQ0Q7QUFBQSxVQUNEemtELE9BQU87QUFBQSxVQUNQeEYsTUFBTTdDLEVBQUUsdUJBQXVCO0FBQUE7QUFBQSxRQUNoQztBQUFBLFFBQ0R4SSxPQUFPO0FBQUEsVUFDTHUrQixNQUFNO0FBQUEsVUFDTjFvQixVQUFVO0FBQUE7QUFBQSxVQUVWd25CLE9BQVExdUIsQ0FBQUEsTUFBZ0M7QUFDdENtbkQsWUFBQUE7VUFDRDtBQUFBLFVBQ0R6cUQsTUFBTTdDLEVBQUUsc0JBQXNCO0FBQUE7QUFBQSxVQUM5QnFJLE9BQU87QUFBQSxRQUNUO0FBQUE7QUFFRjFKLE1BQUFBLEVBQU0rdUQsR0FBZTcrQyxFQUFNNEUsT0FBTztBQUNsQyxlQUFTaFosS0FBT2l6RCxHQUFlO0FBQzdCLGNBQU1yekIsSUFBTXF6QixFQUFjanpELENBQUc7QUFDN0I0L0IsUUFBQUEsRUFBSXN6QixTQUFTLE1BQU07QUFDakJ0ekIsVUFBQUEsRUFBSXhGLE1BQU1ydUIsRUFBWSxDQUFFO0FBQUEsV0FFMUJ3ekIsRUFBSzl4QixLQUFLbXlCLENBQUc7QUFBQSxNQUNmO0FBRUFMLGFBQUFBLEVBQUs3eEIsS0FBSyxDQUFDakgsR0FBUWtILE1BQ1ZsSCxFQUFFbUgsUUFBUUQsRUFBRUMsS0FDcEIsR0FDTTJ4QjtBQUFBQSxJQUNULENBQUM7QUFFRCxhQUFTNHpCLEtBQWlCOztBQUN4QixVQUFJLytDLEVBQU1tOUMsZUFBZSxNQUlyQm45QyxFQUFNbzlDLGFBQWEsSUFBTztBQUM1QixZQUFJNEIsTUFBT2gvQyxJQUFBQSxFQUFNbzlDLGFBQU5wOUMsZ0JBQUFBLEVBQWdCZy9DLFNBQVE7QUFDbkM3QixRQUFBQSxJQUFhQyxHQUFTYSxHQUFVZSxHQUFNaC9DLEVBQU1vOUMsUUFBUTtBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUVBMkIsSUFBQUE7QUFFQSxhQUFTMWhCLElBQVU7QUFDakIsYUFBTzEzQjtBQUFBQSxJQUNUO0FBRUEsYUFBU3M1QyxJQUFtQjtBQUMxQixhQUFPai9DLEVBQU1pOUM7QUFBQUEsSUFDZjtBQUtBLGFBQVNpQyxFQUFRQyxHQUFjcnZELElBQVEsSUFBTTtBQUMzQyxNQUFLQSxLQUNIaVQsR0FBS3pTLEdBQUtxVixDQUFRLEdBQUloYSxDQUFBQSxNQUFTO0FBQzdCLGVBQU9nYSxFQUFTaGEsQ0FBSTtBQUFBLE1BQ3RCLENBQUMsR0FFSG1VLEVBQVE2RixHQUFVdzVDLENBQU8sR0FDekI1QjtJQUNGO0FBRUEsVUFBTTZCLElBQXFCaHZELEVBQUksRUFBSyxHQUU5Qml2RCxJQUFlQSxNQUFNO0FBQ3pCejFELE1BQUFBLEdBQU9KLE1BQU0sc0NBQXNDNDFELEVBQW1CcDFELEtBQUssR0FDdkVvMUQsRUFBbUJwMUQsVUFBVSxNQUFRbXpELEtBRXZDQTtPQUlFVyxLQUFXbnlELENBQUFBLE1BQWM7QUFDN0IsTUFBSUEsRUFBS3F5RCxzQkFBc0IsV0FDN0JxQjtPQUlFQyxJQUE0QjlnRCxDQUFBQSxNQUFzQjtBQUN0RDRnRCxNQUFBQSxFQUFtQnAxRCxRQUFRd1UsR0FDM0I2Z0Q7O0FBR0YsbUJBQWV6QixHQUFlNXpELEdBQVkyQixHQUF1QjtBQUMvRCxZQUFNQyxJQUFNRCxFQUFLQztBQUNqQm9NLE1BQUFBLEdBQUkyTixHQUFVL1osR0FBSzVCLENBQUs7QUFFeEIsWUFBTTIwRCxJQUFTMytDLEVBQU11L0M7QUFLckIsVUFBSTV6RCxFQUFLNnhCLGFBQWE7QUFDcEIsY0FBTTV4QixJQUFNRCxFQUFLQyxLQUNYNUIsSUFBUTJiLEVBQVMvWixDQUFHLEdBQ3BCNHpELEtBQWVwaUMsRUFBZ0J4eEIsQ0FBRyxHQUNsQzR4QixLQUNKN3hCLEVBQUs2eEIsdUJBQXVCdkcsV0FBV3RyQixFQUFLNnhCLGNBQWM3eEIsRUFBSzZ4QixZQUFZbmpCLFFBQ3ZFOUcsS0FBUW9FLEtBQ1I4bkQsS0FBeUM7QUFBQSxVQUM3Q251RCxPQUFPO0FBQUEsVUFDUGtDLEtBQUtELEdBQU1zRztBQUFBQSxVQUNYQSxNQUFNdEcsR0FBTXNHO0FBQUFBLFVBQ1osR0FBR3RHO0FBQUFBLFVBQ0gzSCxLQUFBQTtBQUFBQSxVQUNBNUIsT0FBQUE7QUFBQUEsVUFDQXcxRCxjQUFBQTtBQUFBQSxVQUNBRSxXQUFXO0FBQUEsVUFDWHRpQyxpQkFBQUE7QUFBQUEsVUFDQXBmLE1BQU07QUFBQTtBQUVSd2YsUUFBQUEsR0FBWWlpQyxFQUFrQjtBQUFBLE1BQ2hDO0FBRUEsTUFBSXovQyxFQUFNcTlDLG9CQUFxQixNQUFNcUIsRUFBV0MsR0FBUSxRQUFRLEtBQzlEcEIsTUFFRTV4RCxFQUFLcXlELHFCQUFxQixRQUFRcnlELEVBQUtxeUQsc0JBQXNCLE1BQVFyeUQsRUFBS3F5RCxzQkFBc0IsYUFDbEdxQjtJQUVKO0FBRUEsVUFBTU0sS0FBZ0JyM0QsRUFBUyxNQUN4QjBYLEVBQU04ZSxXQUdKOWUsRUFBTS9VLFFBQVErUCxRQUZaLEVBR1Y7QUFFRHVpRCxXQUFBQSxLQUNPO0FBQUEsV0FDTG5zRDtBQUFBQSxNQUNBN0ksSUFBQUE7QUFBQUEsTUFDQXExRCxnQkFBQUE7QUFBQUEsTUFDQWMsWUFBQUE7QUFBQUEsTUFDQVQsVUFBQUE7QUFBQUEsTUFDQVEsU0FBQUE7QUFBQUEsTUFDQTk0QyxVQUFBQTtBQUFBQSxNQUNBeTRDLHFCQUFBQTtBQUFBQSxNQUNBSSx1QkFBQUE7QUFBQUEsTUFDQXBoQyxpQkFBQUE7QUFBQUEsTUFDQWlnQixTQUFBQTtBQUFBQSxNQUNBNGhCLGtCQUFBQTtBQUFBQSxNQUNBQyxTQUFBQTtBQUFBQSxNQUNBWCxlQUFBQTtBQUFBQSxNQUNBVCxTQUFBQTtBQUFBQSxNQUNBc0Isb0JBQUFBO0FBQUFBLE1BQ0FFLDBCQUFBQTtBQUFBQSxNQUNBamlDLGlCQUFBQTtBQUFBQSxNQUNBMkYsaUJBQUFBO0FBQUFBLE1BQ0EyOEIsZUFBQUE7QUFBQUEsTUFDQXhCLG1CQUFBQTtBQUFBQSxNQUNBeG1ELGNBQUFBO0FBQUFBO0VBRUo7QUFDRixDQUFDOzs7Z0NDM25CQ29lLEVBd0NNLGdCQUFBO2NBdENGcmdCLEVBb0NZLE9BQUFYLElBQUE7QUFBQSxLQXBDWlUsRUFBQSxHQUFBdWdCLEVBQUFPLEVBb0NZcGhCLEVBbkNMNU0sR0FBQUEsbUJBRFAsSUFvQ1ksR0FBQSxNQUFBO0FBQUEsTUFBQSxTQWxDTjB0QixFQUFlLE1BQUE7QUFBQSxTQUFBeGdCLEVBQ0gsR0FBQXVnQixFQUFBTyxFQUFBcGhCLEVBQUEsR0FBQSxLQUFBLElBQUEsR0FBQXlpQixFQUFBO0FBQUEsVUFDaEIsS0FBQTtBQUFBLFVBQ1Ezc0IsT0FBQUEsRUFBQUE7QUFBQUEsVUFDUCxVQUFPMDBEO0FBQUFBLFFBQUFBLEdBQ1J4cUQsRUFBSyxTQUFDO0FBQUEsVUFDTCxPQUFBQSxFQUFBO0FBQUEsVUFDQSxPQUFBO0FBQUEsVUFBQSxvQkFBQUMsRUFBQSxDQUFBLE1BQUFBLEVBQUEsQ0FBQSxJQUFBLENBQUFvbEIsTUFBQXJsQixFQUFBLHlCQUFBLEVBQUE7QUFBQSw0QkFFREMsRUF3QlksQ0FBQSxNQUFBQSxFQUFBLENBQUEsSUFBQSxDQUFBb2xCLE1BQUFybEIsRUFBQSx5QkFBQSxFQUFBO0FBQUEsUUFBQSxDQUFBLEdBQUE7QUFBQSxVQXhCWixTQUFBOGdCLEVBQUEsTUFBQTs7QUFBQTtBQUFBLGNBSUc5Z0IsRUFBQSxTQUFTa29CLE1BQ1Q1bkIsRUFBQSxHQUFBdWdCLEVBQWdCcmUsSUFBWTVPLElBQUFvTSxFQUFBLGNBQUEsZ0JBQUFwTSxFQUFBLE9BQUEsMEJBQUEsR0FBQTZ1QixFQUFBLEVBQUEsS0FBQSxFQUFBLEdBQUF6aUIsRUFBQSxXQUFBO0FBQUEsZ0JBQUEsU0FBQUEsRUFBQTtBQUFBLGdCQUVsQixrQkFBY0EsRUFBQTtBQUFBLGNBQ3ZCLENBQUEsR0FBQTBxQixHQUFBO0FBQUEsZ0JBQ0Usa0JBQUE1SixFQUFBLE1BQUE7QUFBQSxrQkFBQXJnQixHQUFBLE9BQUFaLElBQUE7QUFBQSx1QkFDd0IsRUFBSSxHQUFBVSxFQUFBK3BCLElBQUEsTUFBQUMsR0FBQXZxQixFQUFBLGlCQUFBLENBQUF4SixHQUFBMkYsT0FBMUJtRSxFQUFBLEdBQUFDLEVBQTZFK3BCLFdBQTdFbnVCLEtBQTZFO0FBQUEsc0JBQUEzRixFQUFBLFNBQUEsTUFBQThKLEVBQUEsR0FBQXVnQixFQUFBMlYsR0FBQS9ULEVBQUE7QUFBQSx3QkFBM0IsS0FBQTtBQUFBLHdCQUFHLFNBQUs7QUFBQSxzQkFBQSxHQUFBanNCLEdBQUE7QUFBQTs7Ozs7Z0JBS2hEc3NCLEdBQUFBO0FBQUFBLGNBQUFBLEdBQUFBO0FBQUFBLHdCQUF1QixhQUFXLElBQUE7QUFBQSxrQkFDaEQsTUFBQTtBQUFBLGtCQUFBLElBQWlCaEMsRUFBT2dDLE1BQUFBO0FBQUFBLG9CQUFBQSxFQUE4QnRnQixHQUFZO0FBQUEsc0JBQUEsT0FBQXhDLEVBQUEsTUFBQSxhQUFBO0FBQUE7Ozs7Z0JBRXBEOGlCLElBQUFBO0FBQUFBLHdCQUF5QixlQUFhLElBQUE7QUFBQSxrQkFDcEQsTUFBQTtBQUFBLGtCQUFBLElBQWlCaEMsRUFBT2dDLE1BQUFBO0FBQUFBLG9CQUFBQSxFQUFnQ3RnQixHQUFZO0FBQUEsc0JBQUEsT0FBQXhDLEVBQUEsTUFBQSxlQUFBO0FBQUE7Ozs7Z0JBRXREOGlCLElBQUFBO0FBQUFBLHdCQUF3QixjQUFZLElBQUE7QUFBQSxrQkFDbEQsTUFBQTtBQUFBLGtCQUFBLElBQWlCaEMsRUFBT2dDLE1BQUFBO0FBQUFBLG9CQUFBQSxFQUErQnRnQixHQUFZO0FBQUEsc0JBQUEsT0FBQXhDLEVBQUEsTUFBQSxjQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztxREMyRC9FeXFELEtBQWVockQsR0FBZ0I7QUFBQSxFQUM3QixNQUFNO0FBQUEsRUFDTixZQUFZLEVBQUUsaUJBQUFvb0QsR0FBZ0I7QUFBQSxFQUM5QixjQUFjO0FBQUEsRUFDZCxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtMLGFBQWE7QUFBQSxNQUNYLE1BQU07QUFBQSxJQUNSO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtBLFNBQVM7QUFBQSxNQUNQLE1BQU07QUFBQSxJQUNSO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJQSxTQUFTO0FBQUEsTUFDUCxNQUFNO0FBQUEsSUFDUjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLQSxNQUFNO0FBQUEsTUFDSixNQUFNO0FBQUEsSUFDUjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLQSxTQUFTO0FBQUEsTUFDUCxNQUFNO0FBQUEsSUFDUjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUEsa0JBQWtCO0FBQUEsTUFDaEIsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLElBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBLFlBQVk7QUFBQSxNQUNWLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxJQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtBLFVBQVU7QUFBQSxNQUNSLE1BQU0sQ0FBQyxTQUFTLE1BQU07QUFBQSxNQUN0QixTQUFTO0FBQUEsSUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUEsT0FBTztBQUFBLE1BQ0wsVUFBVTtBQUNSLGVBQU87TUFDVDtBQUFBLElBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBLE1BQU07QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxJQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJQSxVQUFVO0FBQUEsTUFDUixTQUFTO0FBQUEsSUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUEsUUFBUTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLElBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBLEtBQUssQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBLElBS04sVUFBVTtBQUFBLE1BQ1IsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLElBQ1g7QUFBQSxFQUNGO0FBQUEsRUFDQSxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJTDtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUE7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU1oOUMsR0FBTzlYLEdBQUs7QUFDVixVQUFBLEVBQUUsSUFBQUssTUFBT3VJO0FBSWYsSUFBQWdFLEdBQVUsTUFBTTtBQUNWLFVBQUErcUQsR0FBb0IsU0FBU0MsRUFBYyxPQUFPO0FBQ2hDLFFBQUFDLEVBQUEsUUFBUUQsRUFBYyxNQUFNLElBQUk7QUFDOUMsY0FBQUUsSUFBY0YsRUFBYyxNQUFNLElBQUk7QUFDeEMsUUFBQUUsS0FBZUEsRUFBWSxTQUFTLE1BQ3RDQyxFQUFxQixRQUFRRCxFQUFZLENBQUMsRUFBRSxlQUFlO0FBQUEsTUFFL0Q7QUFBQSxJQUFBLENBQ0Q7QUFFRCxRQUFJN0MsSUFBa0I7QUFDdEIsYUFBU25nQyxJQUFvQjtBQUUzQixhQUFPLFVBQVVoZCxFQUFNLGVBQWUsQ0FBRSxDQUFBO0FBQUEsSUFDMUM7QUFDTSxVQUFBbkcsSUFBT29DLEdBQVMrZ0IsRUFBQSxDQUFtQixHQUNuQyxFQUFFLFlBQUEva0IsR0FBWSxtQkFBQWxCLEVBQWtCLElBQUlnQyxHQUFXO0FBRWhELElBQUFnSyxHQUFBL0MsRUFBTSxTQUFTLENBQUNyVSxNQUFTO0FBQzVCLE1BQUlBLEVBQUssU0FBUyxRQUFRQSxFQUFLLGlCQUFpQm9MLEtBQzlDbk4sR0FBTyxLQUFLLHNDQUFzQztBQUFBLElBQ3BELENBQ0Q7QUFDSyxVQUFBLEVBQUUsT0FBQWtHLE1BQVUrRyxNQUNaaUosSUFBVWhRLEdBQ1Z1dEIsSUFBa0JwbEI7QUFBQSxNQUN0QixNQUVTK0gsRUFBTTtBQUFBLE1BRWZySTtBQUFBLE1BQ0E7QUFBQSxNQUNBLENBQUMzTixNQUFVO0FBRUwsUUFBQ2dXLEVBQU0sWUFFRHRVLEVBQUExQixHQUFPLENBQUMyQixNQUFTO0FBQ3ZCLGlCQUFPQSxFQUFLO0FBQUEsUUFBQSxDQUNiLEdBSUNxVSxFQUFNLE9BQ0F0VSxFQUFBMUIsR0FBTyxDQUFDaW1CLE1BQU07QUFFcEIsVUFBQUEsRUFBRSxNQUFNbmdCLEVBQU0sSUFBSWtRLEVBQU0sS0FBS2lRLEVBQUUsR0FBRztBQUFBLFFBQUEsQ0FDbkM7QUFJSCxZQUFJd3VCLElBQTZCLENBQUE7QUFDekIsUUFBQS95QyxFQUFBMUIsR0FBTyxDQUFDaW1CLEdBQUdya0IsTUFBUTtBQUN6QixVQUFBcWtCLEVBQUUsT0FBT3JrQixHQUNUNnlDLEVBQVEsS0FBS3h1QixDQUFDO0FBQUEsUUFBQSxDQUNmLEdBQ1N3dUIsSUFBQWxpQyxHQUFPa2lDLEdBQVMsQ0FBQzl5QyxNQUNsQkEsRUFBSyxTQUFTcU4sR0FBVSxZQUNoQztBQUVELGNBQU04K0IsSUFFRixDQUFBO0FBRUksZUFBQTJHLEVBQUEsUUFBUSxDQUFDOXlDLE1BQVM7QUFDeEIsY0FBSXVoQyxJQUFPdmhDLEVBQUs7QUFDaEIsaUJBQU9BLEVBQUssTUFDWm1zQyxFQUFjNUssQ0FBSSxJQUFJdmhDO0FBQUEsUUFBQSxDQUN2QixHQUNNbXNDO0FBQUEsTUFDVDtBQUFBLElBQUE7QUFJRixJQUFBcHNDLEVBQVEyeEIsRUFBZ0IsT0FBTyxDQUFDeHBCLEdBQVFqSSxNQUFROztBQUMxQyxVQUFBaUksRUFBTyxVQUFVO0FBQ25CO0FBRUksWUFBQW9wQixJQUFXaGIsRUFBTXBPLEVBQU8sS0FBSztBQUMvQixNQUFBb3BCLE1BQWEsVUFBYXBwQixFQUFPLFNBQVMsUUFBUzlLLElBQUE4SyxFQUFPLGNBQVAsZ0JBQUE5SyxFQUFrQixVQUFTLE9BRWhGOFEsRUFBS2pPLENBQUcsSUFBSXF4QjtBQUFBLElBQ2QsQ0FDRDtBQUNELFVBQU1zaEMsSUFBZ0JudUQsS0FDaEIsRUFBRSxHQUFBZSxNQUFNVyxNQUNSc3NELElBQTJCaHVELEVBQUksQ0FBQSxDQUFFO0FBQ3ZDLGFBQVNvdUQsRUFBc0I1eUQsR0FBYTtBQUNuQyxhQUFBd3lELEVBQW9CLE1BQU14eUQsQ0FBRztBQUFBLElBQ3RDO0FBRUEsYUFBU3d4QixFQUFnQnh4QixHQUFrQjs7QUFDbEMsY0FBQXVVLEtBQUFwWCxJQUFBeTFELEVBQXNCNXlELENBQUcsTUFBekIsZ0JBQUE3QyxFQUE0QixVQUE1QixnQkFBQW9YLEVBQW1DO0FBQUEsSUFDNUM7QUFFQSxhQUFTeEksSUFBbUM7QUFDMUMsYUFBTyxFQUFFLE1BQUFrQyxHQUFNLGVBQWVBLEdBQU0saUJBQUF1akIsR0FBaUIsWUFBWTtJQUNuRTtBQUVNLFVBQUE4aUMsSUFBaUQ5dkQsRUFBSXVILEVBQUEsQ0FBYztBQUV6RSxtQkFBZXNtRCxJQUFXO0FBT3hCLFVBTklkLEtBRUZBLEVBQVcsT0FBTyxHQUdOLE1BQU01MEQsRUFBRyxLQUFLLGFBQWFnMkQsRUFBYyxLQUFLO0FBRXRELFFBQUFyMkQsRUFBQSxLQUFLLFVBQVVnNEQsRUFBc0IsS0FBSztBQUFBO0FBRTlDLGVBQUEzM0QsRUFBRyxRQUFRLE1BQU07QUFBQSxVQUNmLFNBQVM0SSxFQUFFLHlCQUF5QjtBQUFBLFFBQUEsQ0FDckMsR0FDTTtBQUFBLElBRVg7QUFFQSxhQUFTc3RELElBQVU7QUFFakIsWUFBTXZoQyxJQUFjRixLQUNkc0IsSUFBYUMsR0FBUTFrQixDQUFJO0FBQy9CLGlCQUFXd1csS0FBU2lPLEdBQVk7QUFDOUIsY0FBTUUsSUFBZXB0QixHQUFJOHJCLEdBQWE3TSxFQUFNLENBQUMsQ0FBQztBQUM5QyxRQUFJbU8sS0FBZ0IsT0FDWkMsR0FBQTVrQixHQUFNd1csRUFBTSxDQUFDLENBQUMsSUFFcEJyWSxHQUFJNkIsR0FBTXdXLEVBQU0sQ0FBQyxHQUFHbU8sQ0FBWTtBQUFBLE1BRXBDO0FBRUEsTUFBSXhlLEVBQU0sU0FFRkEsRUFBQSxNQUFNa2dELEVBQXNCLEtBQUssR0FHckNoNEQsRUFBQSxLQUFLLFNBQVN5UCxFQUFjLENBQUEsR0FFNUJxSSxFQUFNLG9CQUNSeUUsR0FBUyxNQUFNO0FBQ0osUUFBQXc1QztNQUFBLENBQ1Y7QUFBQSxJQUVMO0FBQ00sVUFBQWo3QixJQUFrQjE2QixFQUFTLE1BQU07QUFDckMsWUFBTTZpQyxJQUFZLENBQUEsR0FDWjB6QixJQUFrRDtBQUFBLFFBQ3RELFFBQVE7QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLE9BQU8sQ0FBQ3ZuRCxNQUFnQztBQUM3QixZQUFBMm1EO1VBQ1g7QUFBQSxVQUNBLE9BQU87QUFBQSxVQUNQLE1BQU05c0QsRUFBRSx1QkFBdUI7QUFBQTtBQUFBLFFBQ2pDO0FBQUEsUUFDQSxPQUFPO0FBQUEsVUFDTCxNQUFNO0FBQUEsVUFDTixVQUFVO0FBQUEsVUFDVixPQUFPLENBQUNtRyxNQUFnQztBQUM5QixZQUFBbW5EO1VBQ1Y7QUFBQSxVQUNBLE1BQU10dEQsRUFBRSxzQkFBc0I7QUFBQTtBQUFBLFVBQzlCLE9BQU87QUFBQSxRQUNUO0FBQUEsTUFBQTtBQUdJLE1BQUFyQixFQUFBK3VELEdBQWU3K0MsRUFBTSxPQUFPO0FBQ2xDLGVBQVNwVSxLQUFPaXpELEdBQWU7QUFDdkIsY0FBQXJ6QixJQUFNcXpCLEVBQWNqekQsQ0FBRztBQUM3QixRQUFBNC9CLEVBQUksU0FBUyxNQUFNO0FBQ2IsVUFBQUEsRUFBQSxNQUFNN3pCLEdBQWM7QUFBQSxRQUFBLEdBRTFCd3pCLEVBQUssS0FBS0ssQ0FBRztBQUFBLE1BQ2Y7QUFFSyxhQUFBTCxFQUFBLEtBQUssQ0FBQzk0QixHQUFRa0gsTUFDVmxILEVBQUUsUUFBUWtILEVBQUUsS0FDcEIsR0FDTTR4QjtBQUFBLElBQUEsQ0FDUjtBQUVELGFBQVM0ekIsSUFBaUI7O0FBRXBCLFVBQUEvK0MsRUFBTSxlQUFlLE1BS3JCQSxFQUFNLGFBQWEsSUFBTztBQUV4QixZQUFBZy9DLE1BQU9qMkQsSUFBQWlYLEVBQU0sYUFBTixnQkFBQWpYLEVBQWdCLFNBQVE7QUFFbkMsUUFBQW8wRCxJQUFhLFNBQVNjLEdBQVVlLEdBQU1oL0MsRUFBTSxRQUFRO0FBQUEsTUFDdEQ7QUFBQSxJQUNGO0FBRWUsSUFBQSsrQztBQUVmLGFBQVMxaEIsSUFBVTtBQUNWLGFBQUF4akM7QUFBQSxJQUNUO0FBS1MsYUFBQXFsRCxFQUFRQyxHQUFjcnZELElBQVEsSUFBTTtBQUMzQyxNQUFLQSxLQUNIaVQsR0FBS3pTLEdBQUt1SixDQUFJLEdBQUcsQ0FBQ2xPLE1BQVM7QUFDekIsZUFBT2tPLEVBQUtsTyxDQUFJO0FBQUEsTUFBQSxDQUNqQixHQUVIbVUsRUFBUWpHLEdBQU1zbEQsQ0FBTztBQUFBLElBQ3ZCO0FBRU0sVUFBQUMsSUFBcUJodkQsRUFBSSxFQUFLLEdBRTlCaXZELElBQWUsTUFBTTtBQUNsQixNQUFBejFELEdBQUEsTUFBTSxzQ0FBc0N3MUQsRUFBbUIsS0FBSyxHQUN2RUEsRUFBbUIsVUFBVSxNQUFRakMsS0FFNUJBO0lBQ2IsR0FHSVcsSUFBVSxDQUFDbnlELE1BQWM7QUFDekIsTUFBQUEsRUFBSyxzQkFBc0IsV0FDaEIwekQ7SUFDZixHQUdJQyxLQUEyQixDQUFDOWdELE1BQXNCO0FBQ3RELE1BQUE0Z0QsRUFBbUIsUUFBUTVnRCxHQUNkNmdEO0lBQUE7QUFHTixhQUFBekIsRUFBZTV6RCxHQUFZMkIsR0FBdUI7QUFDekQsWUFBTUMsSUFBTUQsRUFBSztBQUVqQixVQURJcU0sR0FBQTZCLEdBQU1qTyxHQUFLNUIsQ0FBSyxHQUNoQjJCLEVBQUssYUFBYTtBQUNwQixjQUFNQyxJQUFNRCxFQUFLLEtBQ1gzQixJQUFRNlAsRUFBS2pPLENBQUcsR0FDaEI0ekQsSUFBZXBpQyxFQUFnQnh4QixDQUFHO0FBRzVCLFNBRlFELEVBQUssdUJBQXVCLFdBQVdBLEVBQUssY0FBY0EsRUFBSyxZQUFZLFFBRW5GLEVBQUUsS0FBQUMsR0FBSyxPQUFBNUIsR0FBTyxjQUFBdzFELEdBQWMsR0FBRzduRCxFQUFhLEdBQUcsV0FBVyxHQUFPLENBQUE7QUFBQSxNQUMvRTtBQUNJLE9BQUFoTSxFQUFLLHFCQUFxQixRQUFRQSxFQUFLLHNCQUFzQixNQUFRQSxFQUFLLHNCQUFzQixhQUNyRjB6RDtJQUVqQjtBQUVNLFVBQUFNLElBQWdCcjNELEVBQVMsTUFFeEIwWCxFQUFNLFdBSUpBLEVBQU0sUUFBUSxRQUhaLEVBSVYsR0FJSzgvQyxJQUFnQjF2RCxLQUNoQjJ2RCxJQUFzQjN2RCxFQUFJLENBQUMsR0FDM0I2dkQsSUFBdUI3dkQsRUFBSSxDQUFDLEdBRTVCK3ZELEtBQWlCLE1BQU07QUFFM0IsTUFBQWo0RCxFQUFJLEtBQUssbUJBQW1CLENBQUM4WCxFQUFNLFFBQVEsR0FFM0M5WCxFQUFJLEtBQUssWUFBWSxDQUFDOFgsRUFBTSxRQUFRO0FBQUEsSUFBQSxHQUdoQ29nRCxJQUFrQjkzRCxFQUFTLE1BRTNCMFgsRUFBTSxXQUFXLGVBQ1p6WCxFQUFHLElBQUksT0FFVCxLQUNSLEdBQ0tzM0QsS0FBc0J2M0QsRUFBUyxNQUU1QjBYLEVBQU0sV0FBVyxZQUV6QixHQUVLcWdELEtBQTBCLzNELEVBQVMsTUFDbEN1M0QsR0FBb0IsUUFJckI3L0MsRUFBTSxXQUNEaWdELEVBQXFCLFFBQVFBLEVBQXFCLFFBQVEsT0FBTyxLQUVqRUYsRUFBb0IsUUFBUUEsRUFBb0IsUUFBUSxPQUFPLEtBTi9ELE1BUVY7QUFFTSxXQUFBO0FBQUEsTUFDTCxLQUFLLENBQUNsbUQsR0FBV2pPLE1BQ1J3RixHQUFJeUksR0FBTWpPLENBQUc7QUFBQSxNQUV0QixJQUFBckQ7QUFBQSxNQUNBLGdCQUFBcTFEO0FBQUEsTUFDQSxVQUFBSztBQUFBLE1BQ0EsU0FBQVE7QUFBQSxNQUNBLE1BQUE1a0Q7QUFBQSxNQUNBLHFCQUFBdWtEO0FBQUEsTUFDQSx1QkFBQUk7QUFBQSxNQUNBLGlCQUFBcGhDO0FBQUEsTUFDQSxTQUFBaWdCO0FBQUEsTUFDQSxTQUFBNmhCO0FBQUEsTUFDQSxlQUFBWDtBQUFBLE1BQ0EsU0FBQVQ7QUFBQSxNQUNBLG9CQUFBc0I7QUFBQSxNQUNBLDBCQUFBRTtBQUFBLE1BQ0EsaUJBQUFqaUM7QUFBQSxNQUNBLGlCQUFBMkY7QUFBQSxNQUNBLGVBQUEyOEI7QUFBQSxNQUNBLGVBQUFHO0FBQUEsTUFDQSx5QkFBQU87QUFBQSxNQUNBLGlCQUFBRDtBQUFBLE1BQ0EscUJBQUFQO0FBQUEsTUFDQSxnQkFBQU07QUFBQSxNQUNBLHVCQUFBRDtBQUFBLElBQUE7QUFBQSxFQUVKO0FBQ0YsQ0FBQzt5RUN6Z0JnRHJxRCxLQUFNO0FBQUEsRUFBQSxLQUFBO0FBQUE7R0FnQ0paLEtBQU07QUFBQSxFQUFBLEtBQUE7QUFBQTtHQU1QaWhCLEtBQU07QUFBQSxFQUFBLEtBQUE7QUFBQTtHQVVkNEssS0FBTTtBQUFBLEVBQUEsS0FBQTtBQUFBOzs7K0ZBcEU5Qy9LLEVBNEVZLFdBQUE7U0EzRUNtUixFQUFJLEdBQUFsUixFQUFBTyxFQUFBcGhCLEVBQUEsR0FBQSxtQkFBQSxJQUFBLEdBQUEsTUFBQTtBQUFBLElBQWYsU0FBQThnQixFQUFBLE1BQUE7QUFBQSxNQUFBOWdCLEVBQUEsU0FBQSxNQUFBTSxFQUFBLEtBQWlDLE9BQVc7QUFBQSxRQUFBLEtBQUE7QUFBQSxrQkFDMUMsQ0F3RVksYUFBQSxFQUFBLHdCQXZFRk4sRUFBSyxvQkF1RUgsQ0FBQSxDQUFBO0FBQUEsTUFBQSxHQUFBO0FBQUEsV0FyRUUsR0FBQTZnQixFQUFBTyxFQUFBcGhCLEVBQUEsR0FBQSxLQUFBLElBQUEsR0FBQXlpQixFQUFBO0FBQUEsVUFDSjNzQixLQUFBQTtBQUFBQSxVQUNQLE9BQU8wMEQsRUFBQUE7QUFBQUEsUUFBQUEsR0FDUnhxRCxFQUFLLFNBQUM7QUFBQSxVQUNMLE9BQUFBLEVBQUE7QUFBQSxVQUNBLE9BQUE7QUFBQSxVQUFBLG9CQUFBQyxFQUFBLENBQUEsTUFBQUEsRUFBQSxDQUFBLElBQUEsQ0FBQW9sQixNQUFBcmxCLEVBQUEseUJBQUEsRUFBQTtBQUFBLDRCQUVEQyxFQTZETSxDQUFBLE1BQUFBLEVBQUEsQ0FBQSxJQUFBLENBQUFvbEIsTUFBQXJsQixFQUFBLHlCQUFBLEVBQUE7QUFBQSxRQUFBLENBN0ROLEdBQUE7QUFBQSxVQUFBLFNBQ0U4Z0IsRUFxRE0sTUFBQTtBQUFBLFlBQUFyZ0IsR0FwREosT0FrRE1iLElBQUE7QUFBQSxjQUFBYSxHQWpEQyxPQUFDWixJQUFBO0FBQUEsZ0JBRUFZLEdBQUEsT0FBQTtBQUFBLGtCQUFBLE9BQUEwakIsR0FBQSxDQUFBLHFCQUFBLEVBQUEsc0JBQUFua0IsRUFBQSxTQUFBLENBQUEsQ0FBQTtBQUFBLGtCQUVOLE9BQUF3Z0IsR0FBQSxFQUFBLFFBNENZeGdCLEVBNUNPLHdCQUFBLENBQUE7QUFBQSxnQkFBQSxHQUFBO0FBQUEsd0JBQ0Q2Z0IsRUFBQU8sRUFBQXBoQixFQUFBLEdBQUEsSUFBQSxJQUFBLEdBQUEsRUFBQSxLQUFBLGdCQUFBLEdBQUE7QUFBQSxvQkFBaEIsU0FBQThnQixFQUFBLE1BQUE7QUFBQSxzQkFBQTlnQixFQUFBLE1BQUEsYUFDRSxLQUNpRk0sRUFBQSxHQUFBQyxFQUFBLE9BQUFHLElBQUE7QUFBQSx5QkFBQUosRUFBQSxHQUFBdWdCLEVBQUFPLEVBQUFwaEIsRUFBQSxHQUFBLFNBQUEsSUFBQSxHQUFBLE1BQUE7QUFBQSwwQkFBQSxTQUF6RDhnQixFQUFFZ0MsTUFBSztBQUFBLDRCQUFBcGQsRUFBeUJxbEQsR0FBcUI7QUFBQSw4QkFBQSxPQUFBL3FELEVBQUEsTUFBQSxhQUFBO0FBQUE7Ozs7Ozt5QkFJakMsRUFBSSxHQUFBTyxFQUFBK3BCLElBQUEsTUFBQUMsR0FBQXZxQixFQUFBLGlCQUFBLENBQUF4SixHQUFBQyxPQUFoRDZKLEVBQUEsR0FBQUMsRUF1QlkrcEIsSUF2QkkyZ0MsRUFBQUEsS0FBQUEsRUFBQUEsR0FBQUE7QUFBQUEsd0JBQUFBLEVBQUFBLFNBQUFBLE1BQUFBLEVBQWdFLEdBQUFwcUMsRUFBQU8sRUFBQXBoQixFQUFBLGVBQUEsR0FBQXlpQixFQUFBO0FBQUEsMEJBQUEsS0FBQTtBQUFBO3lDQXNCbEUsR0FBQWpzQixFQUFBLEdBQUEsR0FBQTtBQUFBLDBCQUFBLFNBckJxQ3BELEVBQUcsTUFBUztBQUFBLDZCQUFBa04sS0FBMEJ1Z0IsRUFBS08sRUFBQXBoQixFQUFBLEdBQUEsU0FBQSxJQUFBLEdBQUF5aUIsRUFBQSxFQUFBLFNBQUEsR0FBQSxHQUFBanNCLEdBQUE7QUFBQSw4QkFBQSxDQUFBd0osRUFBQSxHQUFBLFNBQUEsUUFBQSxFQUFBLEdBQUF2SjtBQUFBOzs4QkFFeEYsU0FBQXFxQixFQUFBLE1BQUE7QUFBQSxnQ0FBQTlnQixFQUFBLE1BQUEsWUFBQXZKLENBQUEsS0FBQTZKLE9BQTZCd3JCLEdBQWdCO0FBQUEsa0NBQUksS0FBSztBQUFBLGtDQUFBLE9BQUE5ckIsRUFBQSxNQUFBLFlBQUF2SixDQUFBO0FBQUEsZ0RBRXhELHVCQWdCVyxLQUFBQSxFQUFBO0FBQUEsZ0NBZEQsR0FBQSxNQUFLLEdBQWEsQ0FBQSxTQUFBLE9BQUssQ0FhN0IsTUFBQTZKLEVBQUEsR0FBQUMsRUFBQStwQixJQUFBLEVBQUEsS0FBQSxFQUFBLEdBQUE7QUFBQSxrQ0FBQTl6QixFQUFBLGFBQUFBLEVBQUEsVUFBQSxTQUFBLE1BQUE4SixLQUFBdWdCLEVBQUE0SyxHQUFBaEosRUFBQTtBQUFBLG9DQVpDLEtBQUc7QUFBQSxvQ0FBdUMsU0FBQTtBQUFBLG9DQUEyQyxLQUFvQ3dtQyxDQUFBQSxNQUFBQTs7O29DQVN6SCxlQUFPOEIsRUFBcUIsSUFBQS9xRCxFQUFBLE1BQUF2SixDQUFBO0FBQUEsa0NBQUEsR0FDNUIsbUJBQWtCLFdBQUVneUQ7QUFBQUEsb0NBQ3BCLE9BQUt6b0QsRUFBQTtBQUFBLG9DQUFBLHVCQUFBLENBQUFxbEIsTUFBQXJsQixFQUFBLGVBQUFxbEIsR0FBQTd1QixDQUFBO0FBQUE7Ozs7Ozs7OztzQkFPTHNzQixHQUFBQSxFQUFBQSxFQUFBQSxHQUFBQSxHQUFBQTtBQUFBQSw2Q0FDVCxLQUNtRnhpQixFQUFBLEdBQUFDLEVBQUEsT0FBQVQsSUFBQTtBQUFBLHlCQUFBUSxFQUFBLEdBQUF1Z0IsRUFBQU8sRUFBQXBoQixFQUFBLEdBQUEsU0FBQSxJQUFBLEdBQUEsTUFBQTtBQUFBLDBCQUFBLFNBQTNEOGdCLEVBQUVnQyxNQUFLO0FBQUEsNEJBQUFwZCxFQUEyQnFsRCxHQUFxQjtBQUFBLDhCQUFBLE9BQUEvcUQsRUFBQSxNQUFBLGVBQUE7QUFBQTs7Ozs7c0JBR3ZEMHFELENBQUFBLEtBQUFBLEdBQTFCLElBQThGLEVBQUE7QUFBQSxzQkFBQTFxRCxFQUFBLHNCQUM5RlEsR0FBQSxJQUFBLEVBQUEsS0FEOEZGLEVBQUEsR0FBdEJ1Z0IsRUFBQXNxQyxHQUFBO0FBQUEsd0JBQUEsS0FBQTtBQUFBO3NCQUM3RHJvQyxHQUFBQSxNQUFLLEdBQWhCLENBQUEsU0FBQSxDQUFBO0FBQUEsc0JBQUE5aUIsRUFBQSxNQUFBLGNBQ0UsS0FDa0ZNLEVBQUEsR0FBQUMsRUFBQSxPQUFBd2dCLElBQUE7QUFBQSx5QkFBQXpnQixFQUFBLEdBQUF1Z0IsRUFBQU8sRUFBQXBoQixFQUFBLEdBQUEsU0FBQSxJQUFBLEdBQUEsTUFBQTtBQUFBLDBCQUFBLFNBQTFEOGdCLEVBQUVnQyxNQUFLO0FBQUEsNEJBQUFwZCxFQUEwQnFsRCxHQUFxQjtBQUFBLDhCQUFBLE9BQUEvcUQsRUFBQSxNQUFBLGNBQUE7QUFBQTs7Ozs7Ozs7a0JBSzNEMHFELEdBQUFBLEdBQUFBO0FBQUFBLGdCQUFBQSxHQUFBQSxDQUFBQTtBQUFBQSw4Q0FBOEM3cEMsRUFBQXNxQyxHQUFBO0FBQUEsa0JBQUEsS0FBQTtBQUFBOzRDQUc5RFQsR0FBbUIsSUFBQSxFQUFBO0FBQUEsY0FBQSxDQUFBO0FBQUEsY0FFb0UxcUQsRUFBQSx1QkFBQU0sRUFBQSxHQUFBQyxFQUFBLE9BQUFvckIsSUFBQTtBQUFBLGlCQUFBcnJCLEVBQUEsR0FBQXVnQixFQUFBTyxFQUFBcGhCLEVBQUEsR0FBQSxTQUFBLElBQUEsR0FBQSxNQUFBO0FBQUEsa0JBQUEsU0FBOUU4Z0IsRUFBRXNxQyxNQUFRO0FBQUEsb0JBQUExbEQsRUFBa0RzbEQsR0FBYztBQUFBLHNCQUFBLE1BQUFockQsRUFBQSxXQUFBQSxFQUFBLEdBQUEsTUFBQSxVQUFBQSxFQUFBLEdBQUEsTUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7cURDVnhHcXJELEtBQWU1ckQsR0FBZ0I7QUFBQSxFQUM3QixNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJTCxVQUFVO0FBQUEsTUFDUixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUEsZ0JBQWdCO0FBQUEsTUFDZCxNQUFNO0FBQUEsSUFDUjtBQUFBLElBRUEsUUFBUTtBQUFBLE1BQ04sTUFBTTtBQUFBLElBQ1I7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBLFFBQVE7QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxJQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJQSxTQUFTO0FBQUEsTUFDUCxNQUFNO0FBQUEsSUFDUjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUEsS0FBSztBQUFBLE1BQ0gsTUFBTTtBQUFBLElBQ1I7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtBLGNBQWM7QUFBQSxNQUNaLE1BQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUFBLEVBQ0EsT0FBTyxDQUFDLG1CQUFtQixVQUFVO0FBQUEsRUFDckMsTUFBTW9MLEdBQU85WCxHQUFLO0FBQ1YsVUFBQSxFQUFFLElBQUFLLE1BQU91SSxNQUNULEVBQUUsR0FBQUssTUFBTVcsTUFDUmd1RCxJQUFnQjF2RCxLQUNoQnl2RCxJQUFzQnYzRCxFQUFTLE1BQzVCMFgsRUFBTSxXQUFXLFlBRXpCO0FBQ0QsSUFBQWxMLEdBQVUsTUFBTTtBQUNWLE1BQUErcUQsRUFBb0IsU0FBU0MsRUFBYyxVQUN6QkMsRUFBQSxRQUFRRCxFQUFjLE1BQU0sSUFBSTtBQUFBLElBQ3RELENBQ0Q7QUFFSyxVQUFBTyxJQUEwQi8zRCxFQUFTLE1BQ25DLENBQUN1M0QsRUFBb0IsU0FBUyxDQUFDNy9DLEVBQU0sV0FDaEMsU0FFRisvQyxFQUFvQixRQUFRQSxFQUFvQixRQUFRLE9BQU8sRUFDdkUsR0FFS0EsSUFBc0IzdkQsRUFBSSxDQUFDLEdBRTNCK3ZELElBQWlCLE1BQU07QUFDM0IsTUFBQWo0RCxFQUFJLEtBQUssbUJBQW1CLENBQUM4WCxFQUFNLFFBQVEsR0FDM0M5WCxFQUFJLEtBQUssWUFBWSxDQUFDOFgsRUFBTSxRQUFRO0FBQUEsSUFBQTtBQUd0QyxhQUFTMGQsRUFBU2pjLEdBQVU7QUFDMUIsYUFBTzNSLEdBQU0sQ0FBSSxHQUFBa1EsRUFBTSxLQUFLeUIsQ0FBRztBQUFBLElBQ2pDO0FBRU8sV0FBQTtBQUFBLE1BQ0wsSUFBQWxaO0FBQUEsTUFDQSxlQUFBdTNEO0FBQUEsTUFDQSx5QkFBQU87QUFBQSxNQUNBLHFCQUFBUjtBQUFBLE1BQ0EsZ0JBQUFNO0FBQUEsTUFDQSxVQUFBemlDO0FBQUEsTUFDQSxHQUFBdnNCO0FBQUEsSUFBQTtBQUFBLEVBRUo7QUFDRixDQUFDO2FDckllLE9BQU0sbUJBY042RCxLQUFBLEVBQUEsT0FBTSxrSUFLZ0JraEIsS0FBTTtBQUFBLEVBQUEsS0FBQTtBQUFBOzs7O2dDQXBDMUNILEVBb0RNLFdBQUE7O0lBbkRKLE9Ba0RNdUQsR0FBQSxDQUFBLDRCQUFBLEVBQUEsd0JBQUFua0IsRUFBQSxvQkFBQSxDQUFBLENBQUE7QUFBQSxFQUFBLEdBQUE7QUFBQSxPQWhERyxPQUFDSixJQUFBO0FBQUEsTUFFQWEsR0FBQSxPQUFBO0FBQUEsUUFBQSxPQUFBMGpCLEdBQUEsQ0FBQSxrQkFBQSxFQUFBLHNCQUFBbmtCLEVBQUEsU0FBQSxDQUFBLENBQUE7QUFBQSxRQUVOLE9BQUF3Z0IsR0FBQSxFQUFBLFdBMkJZeGdCLEVBM0JXLHdCQUFBLENBQUE7QUFBQSxNQUFBLEdBQUE7QUFBQSxjQUFtRDZnQixFQUFBTyxFQUFBcGhCLEVBQUEsR0FBQSxJQUFBLElBQUEsR0FBQTtBQUFBLFVBQUEsS0FBQTtBQUFBOzttQkFFdEU4Z0IsRUFBZ0MsTUFBQTs7QUFBQTtBQUFBLGNBQUFyZ0IsR0FBQSxRQUFBWixJQUFBO0FBQUEscUJBR2xDLFFBSVcsYUFBQTtBQUFBLGNBQUEsQ0FBQTtBQUFBLGlCQUgrQixFQUFJLEdBQUFVLEVBQUErcEIsSUFBQSxNQUFBQyxHQUFBdnFCLEVBQUEsU0FBQSxDQUFBeEosR0FBQUMsT0FBNUM2SixFQUFBLEdBQUFDLEVBRVkrcEIsZ0JBRk87QUFBQSxnQkFBQTl6QixFQUFBLFFBQUE4SixFQUFnRCxHQUFBdWdCLEVBQUFPLEVBQUFwaEIsRUFBQSxHQUFBLElBQUEsSUFBQSxHQUFBeWlCLEVBQUE7QUFBQSxrQkFBQSxLQUFBO0FBQUE7cUJBQ2pFLFNBQXFFLE1BQUF6aUIsRUFBQSxTQUFBeEosRUFBQSxHQUFBLENBQUEsR0FBQTtBQUFBLGtCQUFBLFNBQXpEc3FCLEVBQVcsTUFBTztBQUFBLG9CQUFBcGIsRUFBcUJsRCxHQUFZO0FBQUEsc0JBQUEsZUFBQWhNLEVBQUE7QUFBQTs7Ozs7Y0FHbkUsR0FBQSxFQUFBLEVBQ0UsR0FBQSxHQUFBO0FBQUEsY0FBQWlLLEdBQUEsUUFBQUMsSUFBQTtBQUFBLGdCQUlPZ3FELEdBQW1CMXFELEVBQUEsUUFBQSxlQUFBO0FBQUEsY0FBQSxDQUFBO0FBQUEsc0NBVTFCUSxHQUF5RCxJQUFBLEVBQUEsVUFUWnFnQixFQUFBTyxFQUFBcGhCLEVBQUEsR0FBQSxJQUFBLElBQUEsR0FBQXlpQixFQUFBO0FBQUEsZ0JBQ3JDOEYsS0FBQUE7QUFBQUEsZ0JBQUFBLE9BQUFBO0FBQUFBLG1DQUVSLDZCQUdZLEdBQUEsQ0FBQSxHQUFBO0FBQUEsZ0JBQUEsU0FIdUJuMUIsRUFBRyxNQUFTOztBQUFBO0FBQUEscUJBQUFrTixFQUFBLEdBQUF1Z0IsRUFBQU8sRUFBQXBoQixFQUFBLEdBQUEsU0FBQSxJQUFBLEdBQUEwckIsR0FBQTtBQUFBLHNCQUVjLENBQUExckIsRUFBQSxHQUFBLFNBQUEsU0FBQSxFQUFBLElBQUFwTSxJQUFBb00sRUFBQSxXQUFBLGdCQUFBcE0sRUFBQTtBQUFBLG9CQUFBLENBQTNELEdBQUE7QUFBQSxzQkFBQSxTQUFBa3RCLEVBQUEsTUFBQTtBQUFBOzs7Ozs7O2NBR0osR0FBQSxFQUFBO0FBQUEsY0FDMkRyZ0IsR0FBQSxRQUFBWCxJQUFBO0FBQUE7Ozs7O1FBSXBENHFELEdBQUFBLEdBQUFBO0FBQUFBLE1BQUFBLEdBQUFBLENBQUFBO0FBQUFBLE1BRVQxcUQsRUFBQSx1QkFBQU0sRUFBQSxHQUU0QkMsRUFBQSxPQUFBd2dCLElBQUE7QUFBQSxRQUFBTixHQUFBemdCLEVBQUEsUUFENUIsZ0JBVUU7QUFBQSxVQVJPb3JELElBQUFBLEVBQUFBLG1CQUFBQSxnQkFBQUEsRUFBQUEsVUFBQUEsTUFBQUEsRUFBQUEsR0FBQUEsRUFBV2g0RCxHQUFxQkEsRUFBRztBQUFBLFVBQ3pDLEtBQUk7QUFBQSxVQUFlZzRELE1BQVFwckQsRUFBQSxXQUFBQSxFQUFBLEdBQUEsTUFBQSxZQUFBQSxFQUFBLEdBQUEsTUFBQTtBQUFBLFVBQWlCaEUsTUFBQUEsRUFBb0VBLHFFQUt6R3N2RCxFQUNjLGtEQUFBO0FBQUEsUUFBQSxHQUFBdHJELEVBQUEsZ0JBQUEsRUFBQSxTQUFBQSxFQUFBLGVBQUEsQ0FBQSxHQUFBLE1BQUEsSUFBQSxDQUFBLFFBQUEsUUFBQSxTQUFBLENBQUEsS0FBQVEsR0FBQSxJQUFBLEVBQUE7QUFBQTs7Ozt1RkMvQ0hva0IsS0FBQUMsR0FBeUI7QUFBQSxFQUNwRCxNQUFNO0FBQUEsRUFDTixjQUFjO0FBQ2hCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFzQ0QsVUFBTXpCLElBQVE2SSxNQUNSLEVBQUUsT0FBQXR4QixNQUFVK0csTUFDWm1KLElBQVFtaEIsR0FVUnUvQixJQUFnQnA0RCxFQUFTLE1BTXRCd0gsRUFMSztBQUFBLE1BQ1YsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLElBQUEsR0FFU2tRLEVBQU0saUJBQWlCLENBQUUsQ0FBQSxDQUM1QyxHQUVLMmdELElBQWMsaUJBQ2RqMUIsSUFBVXBqQyxFQUFTLE1BQU07QUFDdkIsWUFBQTBCLElBQ0pnVyxFQUFNLGNBQWMsUUFBUUEsRUFBTSxlQUFlMGdELEVBQWMsTUFBTSxRQUFRQyxJQUFjM2dELEVBQU07QUFDNUYsYUFBQTtBQUFBLFFBQ0wsTUFBTTtBQUFBLFFBQ04sR0FBR3VZO0FBQUEsUUFDSCxDQUFDaHdCLEVBQUcsS0FBSyxVQUFVLEdBQUd5QjtBQUFBLFFBQ3RCLENBQUMsY0FBY3pCLEVBQUcsS0FBSyxVQUFVLEdBQUdxNEQ7QUFBQSxNQUFBO0FBQUEsSUFDdEMsQ0FDRCxHQUVLN2xDLElBQU9vakI7QUFFYixhQUFTeWlCLEVBQWtCNTJELEdBQVk7QUFDckMsTUFBSTIyRCxNQUFnQjMyRCxNQUNsQkEsSUFBUTAyRCxFQUFjLE1BQU07QUFFOUIsWUFBTTV2QyxJQUFXOVEsRUFBTTtBQUN2QixNQUFBK2EsRUFBSyxxQkFBcUIvd0IsQ0FBSyxHQUMzQjhtQixNQUFhOW1CLEtBQ2Yrd0IsRUFBSyxVQUFVL3dCLENBQUs7QUFBQSxJQUV4QjtBQUVBLGFBQVN3ZSxFQUFTRCxHQUEwQjtBQUNuQyxhQUFBQSxFQUFPdkksRUFBTSxLQUFLO0FBQUEsSUFDM0I7QUFDQSxhQUFTeUksRUFBU0YsR0FBMEI7QUFDbkMsYUFBQUEsRUFBT3ZJLEVBQU0sS0FBSztBQUFBLElBQzNCO0FBRU0sVUFBQSxFQUFFLElBQUF6WCxNQUFPdUk7c0JBeEZiMkUsRUFBQSxHQUFBQyxFQWdCTSxPQWhCTlgsSUFnQk07QUFBQSxPQWZKVSxFQUFBLEdBQUF1Z0IsRUFjWU8sRUFkSTRELEVBQUU1eEIsQ0FBQSxFQUFDLEtBQUssSUFBSSxTQUFVbWpDLEVBQU8sS0FBQSxDQUFBLEdBQUE7QUFBQSxtQkFDcEMsTUFLUDtBQUFBLFVBSFFnMUIsRUFBQSxNQUFjLFFBRnRCanJELEVBQUEsR0FBQXVnQixFQUtFTyxFQUpLNEQsRUFBQTV4QixDQUFBLEVBQUcsUUFBUSxJQUFJLEdBQUFzNEIsR0FBQTtBQUFBO1lBRW5CLENBQUExRyxFQUFBNXhCLENBQUEsRUFBRyxRQUFRLFlBQU9vNEQ7QUFBQSxZQUNsQixDQUFBeG1DLEVBQUE1eEIsQ0FBQSxFQUFHLFFBQVEsT0FBTyxFQUFBLEdBQUFtNEQsRUFBQSxNQUFjO0FBQUEsVUFBQTtXQUVuQ2pyRCxFQUFBLEVBQUEsR0FBQUMsRUFNRStwQixJQUp3QngwQixNQUFBQSxHQUFBQSxFQUFBQSxTQUFoQixDQUFBVSxHQUFNMkYsT0FGaEJtRSxFQUFBLEdBQUF1Z0IsRUFNRU8sRUFMSzRELEVBQUE1eEIsQ0FBQSxFQUFHLFFBQVEsSUFBSSxHQUFBczRCLEdBQUE7QUFBQSxZQUVuQixLQUFLdnZCO0FBQUEsWUFDTCxDQUFBNm9CLEVBQUE1eEIsQ0FBQSxFQUFHLFFBQVEsT0FBTyxFQUFBLEdBQUFpZ0IsRUFBUzdjLENBQUk7QUFBQSxZQUMvQixDQUFBd3VCLEVBQUE1eEIsQ0FBQSxFQUFHLFFBQVEsT0FBTyxFQUFBLEdBQUFrZ0IsRUFBUzljLENBQUk7QUFBQSxVQUFBOzs7Ozs7Ozs7O3dSQ25CWG91QixLQUFBQyxHQUF5QjtBQUFBLEVBQ3BELE1BQU07QUFDUixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0ZELFVBQU1lLElBQU9vakIsR0FDUDBpQixJQUFlLEtBQ2Y3Z0QsSUFBUW1oQixHQTJCUixFQUFFLElBQUE1NEIsTUFBT3VJLE1BRVRnd0QsSUFBZTF3RCxFQUFJLEVBQUssR0FDeEIyd0QsSUFBaUJ6NEQsRUFBUyxPQUN2QjtBQUFBLE1BQ0wsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLFFBQ0wsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLEdBQUcwWCxFQUFNO0FBQUEsTUFDVCxDQUFDelgsRUFBRyxPQUFPLE9BQU8sR0FBR3U0RCxFQUFhO0FBQUEsTUFDbEMsQ0FBQyxZQUFZdjRELEVBQUcsT0FBTyxPQUFPLEVBQUUsR0FBRyxDQUFDNEcsTUFBaUI7QUFDbkQsUUFBQTJ4RCxFQUFhLFFBQVEzeEQ7QUFBQSxNQUN2QjtBQUFBLElBQUEsRUFFSCxHQUVLNnhELElBQWtCejRELEVBQUcsU0FBUyxzQkFBc0IsR0FDcEQwNEQsSUFBZTM0RCxFQUFTLE9BQ3JCO0FBQUEsTUFDTCxHQUFHaXdCO0FBQUEsTUFDSCxDQUFDaHdCLEVBQUcsTUFBTSxVQUFVLEdBQUd5WCxFQUFNO0FBQUEsTUFDN0IsQ0FBQyxZQUFZelgsRUFBRyxNQUFNLFVBQVUsRUFBRSxHQUFHLENBQUM0RyxNQUFnQjtBQUNwRCxRQUFBK3hELEVBQVcveEQsQ0FBRztBQUFBLE1BQ2hCO0FBQUEsSUFBQSxFQUVILEdBRUsreEQsSUFBYSxDQUFDL3hELE1BQWdCO0FBQ2xDLE1BQUE0ckIsRUFBSyxxQkFBcUI1ckIsQ0FBRyxHQUM3QjZ4RCxLQUFBLFFBQUFBLEVBQWlCO0FBQUEsSUFBUyxHQUd0QkcsSUFBYyxNQUFNO0FBQ3hCLE1BQUFMLEVBQWEsUUFBUSxJQUNqQjlnRCxFQUFNLFNBQVMsU0FBUyxLQUFLb2hELEVBQU0sTUFBTSxRQUFRLFdBQVcsS0FDbERDLEVBQUFyaEQsRUFBTSxTQUFTLENBQUMsQ0FBVztBQUFBLElBQ3pDLEdBR0l1WSxJQUFRNkksTUFFUmtnQyxJQUFNO0FBQUEsTUFDVixNQUFNLGlCQUFpQjtBQUVkLGVBQUEsT0FESyxNQUFNLE1BQU0sR0FBR3RoRCxFQUFNLFdBQVcsY0FBYyxHQUN6QztNQUNuQjtBQUFBLE1BQ0EsTUFBTSxTQUFTdlQsR0FBZ0I7QUFFdEIsZUFBQSxPQURLLE1BQU0sTUFBTSxHQUFHdVQsRUFBTSxXQUFXLHNCQUFzQnZULENBQU0sRUFBRSxHQUN6RDtNQUNuQjtBQUFBLE1BQ0EsTUFBTSxPQUFPb1YsR0FBZXUvQyxHQUFZO0FBQ2hDLGNBQUE5d0MsSUFBUTh3QyxFQUFNLFNBQVMsR0FDdkJHLElBQVFILEVBQU0sU0FBUztBQUV0QixlQUFBLE9BREssTUFBTSxNQUFNLEdBQUdwaEQsRUFBTSxXQUFXLGlCQUFpQjZCLENBQUssVUFBVXlPLENBQUssVUFBVWl4QyxDQUFLLEVBQUUsR0FDakY7TUFDbkI7QUFBQSxJQUFBLEdBR0lDLElBQWlCcHhELEVBQUksQ0FBQSxDQUFFLEdBRXZCcXhELElBQWMsT0FBT2gxRCxNQUFtQjtBQUN4QyxVQUFBaTFELElBQU9GLEVBQVUsTUFBTS8wRCxDQUFNO0FBQ2pDLFVBQUksQ0FBQ2kxRCxHQUFNO0FBQ1QsY0FBTXh5RCxJQUFNLE1BQU1veUQsRUFBSSxTQUFTNzBELENBQU0sR0FDL0JrMUQsSUFBZXp5RCxFQUFJLGlCQUFpQixJQUNwQzB5RCxLQUFhMXlELEVBQUksY0FBYztBQUM5QixRQUFBd3lELElBQUFDO0FBQ1AsbUJBQVcvMUQsS0FBT2cyRDtBQUNoQixVQUFBRixJQUFPQSxFQUFLLE9BQU9FLEdBQVdoMkQsQ0FBRyxDQUFDO0FBRTdCLFFBQUE4MUQsSUFBQUEsRUFBSyxJQUFJLENBQUMvMUQsTUFBYyxHQUFHYyxDQUFNLElBQUlkLENBQUksRUFBRSxHQUN4QzYxRCxFQUFBLE1BQU0vMEQsQ0FBTSxJQUFJaTFEO0FBQUEsTUFDNUI7QUFDTyxhQUFBQTtBQUFBLElBQUEsR0FHSEcsSUFBWXp4RCxFQUFJLEVBQUUsR0FDbEIweEQsSUFBUzF4RCxFQUFJLEtBQUssR0FDbEJpeEQsSUFBYyxDQUFDejFELE1BQWdCO0FBQ25DLE1BQUFrMkQsRUFBTyxRQUFRbDJELEdBQ2ZpMkQsRUFBVSxRQUFRLElBQ1BFLEtBQ0VDO0lBQUEsR0FHVEQsSUFBYSxNQUFNO0FBQ3ZCLE1BQUFYLEVBQU0sTUFBTSxRQUFRLEdBQ2RBLEVBQUEsTUFBTSxVQUFVLElBQ3RCQSxFQUFNLE1BQU0sUUFBUSxHQUNkQSxFQUFBLE1BQU0sUUFBUXBoRCxFQUFNLFNBQVM2Z0Q7QUFBQSxJQUFBLEdBRy9CTyxJQUFRaHhELEVBQUk7QUFBQSxNQUNoQixTQUFTO0FBQUEsTUFDVCxPQUFPO0FBQUEsTUFDUCxPQUFPNFAsRUFBTSxTQUFTNmdEO0FBQUEsTUFDdEIsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsU0FBUyxDQUFDO0FBQUEsSUFBQSxDQUNYLEdBRUttQixJQUFlLFlBQVk7QUFDM0IsVUFBQSxDQUFBWixFQUFNLE1BQU0sU0FHaEI7QUFBQSxRQUFJQSxFQUFNLE1BQU0sVUFBVVMsRUFBVSxTQUV2QkUsS0FHYlgsRUFBTSxNQUFNLFVBQVU7QUFDbEIsWUFBQTtBQUNJLGdCQUFBbHlELElBQU0sTUFBTSt1RDtBQUNsQixVQUFBbUQsRUFBTSxNQUFNLFVBQVVBLEVBQU0sTUFBTSxRQUFRLE9BQU9seUQsRUFBSSxLQUFLLEdBQ3BEa3lELEVBQUEsTUFBTSxRQUFRbHlELEVBQUksT0FDbEJreUQsRUFBQSxNQUFNLFFBQVFseUQsRUFBSSxPQUNsQmt5RCxFQUFBLE1BQU0sUUFBUVMsRUFBVTtBQUFBLFFBQUEsVUFDOUI7QUFDQSxVQUFBVCxFQUFNLE1BQU0sVUFBVTtBQUFBLFFBQ3hCO0FBQUE7QUFBQSxJQUFBO0FBR0YsbUJBQWVuRCxJQUFXO0FBQ3BCLFVBQUE2RCxFQUFPLFVBQVUsT0FBTztBQUN0QixZQUFBLENBQUNELEVBQVUsT0FBTztBQUNqQixVQUFBdDVELEVBQUEsYUFBYSxLQUFLLFVBQVU7QUFDL0I7QUFBQSxRQUNGO0FBQ0EsZUFBTyxNQUFNKzRELEVBQUksT0FBT08sRUFBVSxPQUFPVCxFQUFNLEtBQUs7QUFBQSxNQUFBO0FBRTdDLGVBQUEsTUFBTWEsRUFBb0JILEVBQU8sS0FBSztBQUFBLElBRWpEO0FBRUEsbUJBQWVHLEVBQW9CeDFELEdBQWdCO0FBQzNDLFlBQUFzNkIsSUFBUSxNQUFNMDZCLEVBQVloMUQsQ0FBTTtBQUN0QyxVQUFJK3RDLElBQVV6VDtBQUNkLE1BQUk4NkIsRUFBVSxVQUNGcm5CLElBQUF6VCxFQUFNLE9BQU8sQ0FBQ3J6QixNQUFpQkEsRUFBSyxTQUFTbXVELEVBQVUsS0FBSyxDQUFDO0FBRXpFLFVBQUlLLElBQU1kLEVBQU0sTUFBTSxRQUFRQSxFQUFNLE1BQU07QUFDdEMsYUFBQWMsSUFBTTFuQixFQUFRLFdBQ2hCMG5CLElBQU0xbkIsRUFBUSxTQUdUO0FBQUEsUUFDTCxPQUZpQkEsRUFBUSxNQUFNNG1CLEVBQU0sTUFBTSxPQUFPYyxDQUFHO0FBQUEsUUFHckQsT0FBTzFuQixFQUFRO0FBQUEsUUFDZixPQUFPNG1CLEVBQU0sTUFBTTtBQUFBLFFBQ25CLE9BQU9BLEVBQU0sTUFBTTtBQUFBLE1BQUE7QUFBQSxJQUV2QjtBQUVNLFVBQUEvN0MsSUFBVWpWLEVBQUk0UCxFQUFNLFVBQVUsR0FDOUJtaUQsSUFBbUIsQ0FBQ3p1RCxHQUFjc3dCLElBQVUsT0FBVTtBQUMxRCxNQUFBM2UsRUFBUSxRQUFRM1IsR0FDWnN3QixLQUNRbytCO0lBQ1osR0FHSUEsSUFBWSxNQUFNO0FBQ3RCLE1BQUF0QixFQUFhLFFBQVEsSUFDckJJLEVBQVc3N0MsRUFBUSxLQUFLO0FBQUEsSUFBQSxHQUdwQmc5QyxLQUFXLFlBQVk7QUFDckIsTUFBQWpCLEVBQUEsTUFBTSxTQUFTQSxFQUFNLE1BQU0sT0FDakMsTUFBTVksRUFBYTtBQUFBLElBQUEsR0FHZk0sSUFBY2g2RCxFQUFTLE9BQ3BCO0FBQUEsTUFDTCxHQUFHMFgsRUFBTTtBQUFBLE1BQ1QsQ0FBQ3pYLEVBQUcsS0FBSyxVQUFVLEdBQUd1NUQsRUFBTztBQUFBLE1BQzdCLENBQUMsWUFBWXY1RCxFQUFHLEtBQUssVUFBVSxFQUFFLEdBQUc4NEQ7QUFBQSxJQUFBLEVBRXZDOzs7QUFoU0MsYUFBQTVyRCxFQUFBLEdBQUFDLEVBd0VNLE9BeEVOWCxJQXdFTTtBQUFBLFNBdkVKVSxLQUFBdWdCLEVBSVlPLEVBSkk0RCxFQUFBNXhCLENBQUEsRUFBRyxNQUFNLElBQUksR0FBN0JxdkIsRUFBdUNxcEMsRUFJM0IsT0FKMEMsRUFBQSxTQUFPRSxFQUFBLENBQVcsR0FBQTtBQUFBLFVBQzNELFVBRGlDLE1BQ2dDO0FBQUEsWUFDM0RoZ0MsRUFBVSxtQkFBekJuTCxFQUE4RmtFLEdBQUE7QUFBQTtjQUFuRSxPQUFNO0FBQUEsY0FBaUMsTUFBTWlILEVBQVU7QUFBQSxZQUFBOzs7O1FBSTNFMi9CLEVBQVksU0FBdkJyckQsRUFBQSxHQUFBQyxFQWdFTSxPQWhFTlYsSUFnRU07QUFBQSxXQS9ESlMsRUFBQSxHQUFBdWdCLEVBOERZTyxFQTlESTRELEVBQUU1eEIsQ0FBQSxFQUFDLE9BQU8sSUFBSSxHQUE5QnF2QixFQThEWSxFQTlEb0IsUUFBTyxZQUFpQm1wQyxTQUFpQixFQUFBLFFBQVEsS0FBSSxDQUFBLEdBQUE7QUFBQSxZQUN4RSxDQUFBNW1DLEVBQUE1eEIsQ0FBQSxFQUFHLE9BQU8sYUFBYSxLQUNoQyxNQUFtRDtBQUFBLGNBQW5Ec1MsRUFBbURxZixHQUFBO0FBQUEsZ0JBQTFDLE1BQUs7QUFBQSxnQkFBYyxPQUFNO0FBQUEsY0FBQTtpQ0FBaUIsVUFFckQsRUFBQTtBQUFBLFlBQUE7dUJBQ0EsTUF3RE07QUFBQSxjQXhETnRrQixHQXdETSxPQXhETkMsSUF3RE07QUFBQSxnQkF2REpELEdBc0RNLE9BdEROWCxJQXNETTtBQUFBLG1CQXJESlEsS0FBQXVnQixFQVdZTyxFQVhJNEQsRUFBQTV4QixDQUFBLEVBQUcsS0FBSyxJQUFJLEdBQTVCcXZCLEVBQXNDMHFDLEVBVzFCLE9BWHVDLEVBQUEsTUFBSyxPQUFBLENBQU0sR0FBQTtBQUFBLCtCQUM1RCxNQUNZO0FBQUEsdUJBRFo3c0QsRUFBQSxHQUFBdWdCLEVBQ1lPLEVBREk0RCxFQUFBNXhCLENBQUEsRUFBRyxRQUFRLElBQUksR0FBQXM0QixHQUFBO0FBQUEsd0JBQUUsS0FBSTtBQUFBLHdCQUFPLENBQUExRyxFQUFBNXhCLENBQUEsRUFBRyxRQUFRLFlBQU87QUFBQSx3QkFBUSxDQUFBNHhCLEVBQUE1eEIsQ0FBQSxFQUFHLFFBQVEsWUFBTztBQUFBLHNCQUFBOzhCQUV4Rm1OLEVBT1krcEIsSUFBQSxNQUFBQyxHQUxJeUIsRUFBUSxVQUFBLENBQWZucEIsT0FGVHZDLEVBQUEsR0FBQXVnQixFQU9ZTyxFQU5MNEQsRUFBQTV4QixDQUFBLEVBQUcsUUFBUSxJQUFJLEdBQUFzNEIsR0FBQTtBQUFBLHdCQUVuQixLQUFLN29CO0FBQUEsd0JBQ0wsQ0FBQW1pQixFQUFBNXhCLENBQUEsRUFBRyxRQUFRLFlBQU95UDtBQUFBLHdCQUNsQixDQUFBbWlCLEVBQUE1eEIsQ0FBQSxFQUFHLFFBQVEsWUFBT3lQO0FBQUEsc0JBQUE7Ozs7bUJBS3ZCdkMsRUFBQSxHQUFBdWdCLEVBVVlPLEVBVEw0RCxFQUFBNXhCLENBQUEsRUFBRyxNQUFNLElBQUksR0FBQXM0QixHQUFBO0FBQUEsb0JBQ1YsQ0FBQTFHLEVBQUE1eEIsQ0FBQSxFQUFHLE1BQU0sVUFBVSxHQUFJczVELEVBQVM7QUFBQSxvQkFBaEMsQ0FBQSxjQUFBMW5DLEVBQUE1eEIsQ0FBQSxFQUFHLE1BQU0sVUFBVSwwQkFBSXM1RCxFQUFTLFFBQUFybkM7QUFBQSxvQkFDeEMsT0FBTTtBQUFBLG9CQUNOLGFBQVk7QUFBQSxvQkFDWCxjQUFld25DLEdBQVksQ0FBQSxPQUFBLENBQUE7QUFBQSxrQkFBQTtvQkFFakIsVUFDVCxNQUFpRztBQUFBLHNCQUFqR25uRCxFQUFpRzh3QixHQUFBO0FBQUEsd0JBQXRGLE1BQUs7QUFBQSx3QkFBVSxNQUFLO0FBQUEsd0JBQVMsTUFBTXhSLEVBQUE1eEIsQ0FBQSxFQUFHLE1BQU07QUFBQSx3QkFBUyxTQUFPeTVEO0FBQUE7Ozs7a0JBSTNFcHNELEdBd0JNLE9BeEJOc2dCLElBd0JNO0FBQUEsb0JBdkJKdGdCLEdBWU0sT0FaTmtyQixJQVlNO0FBQUEsdUJBWEpyckIsRUFBQSxFQUFBLEdBQUFDLEVBVU0rcEIsSUFUVyxNQUFBQyxHQUFBMGhDLEVBQUEsTUFBTSxVQUFkMXRELFlBRFRnQyxFQVVNLE9BQUE7QUFBQSx3QkFSSCxLQUFLaEM7QUFBQSx3QkFDTixPQUFNNGxCLEdBQUEsQ0FBQSxhQUNZLEVBQUEsUUFBQTVsQixNQUFTMlIsRUFBTyxNQUFBLENBQUEsQ0FBQTtBQUFBLHdCQUNqQyxPQUFPM1I7QUFBQSx3QkFDUCxTQUFLLENBQUE4bUIsT0FBRTJuQyxFQUFpQnp1RCxHQUFJLEVBQUE7QUFBQSx3QkFDNUIsWUFBUSxDQUFBOG1CLE9BQUUybkMsRUFBaUJ6dUQsR0FBSSxFQUFBO0FBQUEsc0JBQUE7d0JBRWhDbUgsRUFBaURxZixHQUFBO0FBQUEsMEJBQXZDLE1BQUF4bUI7QUFBQSwwQkFBWSxPQUFNO0FBQUE7OztvQkFJaENrQyxHQVFNLE9BUk4yc0QsSUFRTTtBQUFBLHNCQVBjbkIsRUFBQSxNQUFNLGdCQUF4QnByQyxFQUF1RXdzQyxJQUFBO0FBQUE7d0JBQXJDLFNBQVNwQixFQUFLLE1BQUM7QUFBQSx3QkFBUyxNQUFLO0FBQUEsa0RBQy9DQSxFQUFBLE1BQU0sU0FBaUIsUUFBQUEsRUFBQSxNQUFNLFNBQUssVUFBbEQxckQsRUFFTSxPQUFBK3NELElBQUFydEQsRUFBQSxDQUFBLE1BQUFBLEVBQUEsQ0FBQSxJQUFBO0FBQUEsd0JBREpRLEdBQWUsYUFBVixRQUFJLEVBQUE7QUFBQSw2QkFFS3dyRCxFQUFLLE1BQUMsUUFBUUEsRUFBQSxNQUFNLFFBQVFBLEVBQUssTUFBQyxjQUFsRDFyRCxFQUVNLE9BQUE7QUFBQTt3QkFGb0QsU0FBTzJzRDtBQUFBO3dCQUMvRHpzRCxHQUFlLGFBQVYsUUFBSSxFQUFBO0FBQUE7OztrQkFJZkEsR0FFTSxPQUZOOHNELElBRU07QUFBQSxvQkFESjduRCxFQUEyRDh3QixHQUFBO0FBQUEsc0JBQWhELE1BQUs7QUFBQSxzQkFBVyxTQUFPeTJCO0FBQUEsb0JBQUE7aUNBQVcsTUFBRWh0RCxFQUFBLENBQUEsTUFBQUEsRUFBQSxDQUFBLElBQUE7QUFBQSwyQkFBRixNQUFFLEVBQUE7QUFBQSxzQkFBQTs7Ozs7Ozs7Ozs7Ozs7O0FDakQ3RCxNQUFBdXRELEtBQWUvdEQsR0FBZ0I7QUFBQSxFQUM3QixNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJTCxNQUFNLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlQLFNBQVMsRUFBRSxNQUFNLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFPdkIsV0FBVyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLWixZQUFZO0FBQUEsTUFDVixNQUFNO0FBQUEsSUFDUjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS0EsYUFBYTtBQUFBLE1BQ1gsTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUNSLGVBQU87TUFDVDtBQUFBLElBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBLG1CQUFtQjtBQUFBLE1BQ2pCLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxJQUNYO0FBQUEsRUFDRjtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUw7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJQTtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU1vTCxHQUFZOVgsR0FBVTtBQUNwQixVQUFBLEVBQUUsSUFBQUssTUFBT3VJO0FBRWYsSUFBSWtQLEVBQU0sYUFDUixRQUFRLEtBQUssK0JBQStCO0FBRXhDLFVBQUE0aUQsSUFBb0J0NkQsRUFBUyxNQUMxQjBYLEVBQU0sY0FBY0EsRUFBTSxhQUFhelgsRUFBRyxNQUFNLElBQ3hEO0FBRUQsUUFBSXM2RCxJQUFXejZDLEdBQVFwSSxHQUFPOVgsR0FBS0ssRUFBRyxXQUFXLFVBQVU7QUFDckQsVUFBQXU2RCxJQUFrQkQsRUFBUztBQWdCMUIsV0FBQTtBQUFBLE1BQ0wsSUFBQXQ2RDtBQUFBLE1BQ0EsbUJBQUFxNkQ7QUFBQSxNQUNBLEdBQUdDO0FBQUEsTUFDSCxpQkFBQUM7QUFBQSxNQUNBLGtCQW5CdUIsQ0FBQzk0RCxNQUFlO0FBQ25DLFFBQUE5QixFQUFBLEtBQUssVUFBVThCLENBQUssR0FDcEJBLEtBQVNBLEVBQU0sV0FDakJBLElBQVFBLEVBQU0sT0FBTztBQUVqQixjQUFBMFAsSUFBT21wRCxFQUFTO0FBQ3RCLFlBQUlucEQsS0FBUUEsRUFBSyxXQUFXQSxFQUFLLFFBQVExUCxDQUFLLEdBQUc7QUFDekMsZ0JBQUErNEQsSUFBTXJwRCxFQUFLLFFBQVExUCxDQUFLO0FBQzFCLFVBQUE5QixFQUFBLEtBQUssbUJBQW1CNjZELENBQUc7QUFBQSxRQUFBO0FBRTNCLFVBQUE3NkQsRUFBQSxLQUFLLG1CQUFtQixJQUFJO0FBQUEsTUFDbEM7QUFBQSxJQVFBO0FBQUEsRUFFSjtBQUNGLENBQUM7QUNqSG9DLFNBQUF3dEIsR0FBQXZnQixHQUFBQyxHQUFBQyxHQUFBQyxHQUFBQyxHQUFBQyxHQUFBO2dCQUZqQytnQixFQVNZcGhCLEVBQUEsR0FBQSxXQVBLMnRELG1CQUFSM3RELEVBQUksaUJBQUEsR0FBQTtBQUFBLElBQUEsU0FBQThnQixFQUFBLE1BQUE7QUFBQSx3REFDUHhnQixFQUFVLEdBQUF1Z0IsRUFBQU8sRUFBQXBoQixFQUFBLGlCQUFBLEdBQUF5aUIsRUFBQTtBQUFBLFFBQ2IsU0FBS3BQO0FBQUFBLFFBQ0xqZ0IsS0FBQUE7QUFBQUEsUUFDT3k2RCxLQUFBQSxFQUFBQSxTQUFBQSxDQUFBQTtBQUFBQSxRQUVZLENBQUE3dEQsRUFBQSxHQUFBLE1BQUEsU0FBQSxFQUFBLEdBQUFBLEVBQUEsU0FBQXhKLENBQUE7QUFBQSxNQUFqQjhjLEdBQUFBLEVBQUFBLFNBQUFBLEdBQUFBLEdBQUFBLEVBQUFBLFdBQUFBLEdBQUFBO0FBQUFBLFFBQUFBLFNBQUFBLEVBQUFBLE1BQUFBO0FBQUFBOzs7Ozs7OztxRENSb0JzUixLQUFBQyxHQUF5QjtBQUFBLEVBQ3BEM3hCLE1BQU07QUFDUixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQ0QsVUFBTTJYLElBQVFtaEIsR0FDUnBHLElBQU9vakIsR0FFUDhrQixJQUFZN3lELEtBQ1o7QUFBQSxNQUFFZSxHQUFBQTtBQUFBQSxJQUFHLElBQUdXLEdBQU8sR0FDZm94RCxJQUFzQjU2RCxFQUFTLE1BRTVCMFgsRUFBTW1qRCxlQUFlaHlELEVBQUUsaUNBQWlDLENBQ2hFLEdBRUs7QUFBQSxNQUFFNUksSUFBQUE7QUFBQUEsSUFBSSxJQUFHdUksR0FBSyxHQUNkeW5CLElBQVE2SSxNQUtSeWhDLElBQVd6NkMsR0FBUXBJLEdBSmI7QUFBQSxNQUNWK2EsTUFBQUE7QUFBQUEsTUFDQXhDLE9BQUFBO0FBQUFBLE9BRW1DaHdCLEVBQUd3TCxPQUFPMm1CLFVBQVUsR0FDbkRvb0MsSUFBa0JELEVBQVN2NkMseUJBRTNCODZDLElBQW9CcDVELENBQUFBLE1BQWU7QUFDdkMrd0IsTUFBQUEsRUFBSyxVQUFVL3dCLENBQUs7QUFDcEIsWUFBTTBQLElBQU9tcEQsRUFBU242QztBQUV0QixVQUFJMWUsS0FBU2dRLE1BQU16RCxRQUFRdk0sQ0FBSyxLQUFLQSxFQUFNMHZDLFNBQVMsR0FBRztBQUNyRCxjQUFNdnhDLElBQU8sQ0FBQTtBQUNiLG1CQUFXOG5CLEtBQUtqbUI7QUFDZCxVQUFJMFAsS0FBUUEsRUFBSzJwRCxXQUFXM3BELEVBQUsycEQsUUFBUXB6QyxDQUFDLEtBQ3hDOW5CLEVBQUtrUixLQUFLSyxFQUFLMnBELFFBQVFwekMsQ0FBQyxDQUFDO0FBRzdCOEssUUFBQUEsRUFBSyxtQkFBbUI1eUIsQ0FBSTtBQUM1QjtBQUFBLE1BQ0Y7QUFFQSxVQUFJdVIsS0FBUUEsRUFBSzJwRCxXQUFXM3BELEVBQUsycEQsUUFBUXI1RCxDQUFLLEdBQUc7QUFDL0MsY0FBTSs0RCxJQUFNcnBELEVBQUsycEQsUUFBUXI1RCxDQUFLO0FBQzlCK3dCLFFBQUFBLEVBQUssbUJBQW1CZ29DLENBQUc7QUFBQSxNQUM3QjtBQUNFaG9DLFFBQUFBLEVBQUssbUJBQW1CLElBQUk7QUFBQSxPQUkxQnVvQyxJQUFZQztBQUVsQmppQyxJQUFBQSxFQUFhO0FBQUEsTUFDWDJoQyxXQUFBQTtBQUFBQSxNQUNBQyxxQkFBQUE7QUFBQUEsTUFDQSxHQUFHTDtBQUFBQSxNQUNIQyxpQkFBQUE7QUFBQUEsTUFDQU0sa0JBQUFBO0FBQUFBLElBQ0YsQ0FBQztBQUVELFVBQU14b0QsSUFBU0EsTUFBTTtBQUNuQixZQUFNO0FBQUEsUUFBRXJTLElBQUFBO0FBQUFBLE1BQUksSUFBR3VJLEdBQUssR0FDZDB5RCxJQUFhcHJDLEVBQXdCN3ZCLEVBQUd3TCxPQUFPMUwsSUFBSSxHQUNuRGdnQixJQUFTOWYsRUFBR3dMLE9BQU8ybUI7QUFDekIsVUFBSW55QixFQUFHZ2dCLE9BQU9sZ0IsUUFBUSxNQUFNO0FBRzFCLGNBQU00QyxJQUFVNjNELEVBQWdCOTRELFNBQVMsSUFDbkMwaEMsSUFBZTtBQUFBLFVBQ25CLENBQUMsWUFBWXJqQixDQUFNLEVBQUUsR0FBSXJlLENBQUFBLE1BQWU7QUFFdEMsaUJBQUt5NUQsTUFBTSxZQUFZcDdDLENBQU0sSUFBSXJlLENBQUssR0FDdENvNUQsRUFBaUJwNUQsQ0FBSztBQUFBLFVBQ3ZCO0FBQUEsVUFDRCxHQUFHdXVCO0FBQUFBLFdBRUNtckMsSUFBWTtBQUFBLFVBQ2hCLEdBQUdKO0FBQUFBLFVBQ0gsR0FBR3RqRCxFQUFNaVk7QUFBQUE7QUFFWCxlQUFBcGQsRUFBQTJvRCxHQUFBNXJDLEVBQUE7QUFBQSxVQUFBLEtBRVM7QUFBQSxVQUFXLGFBQ0hzckMsRUFBb0JsNUQ7QUFBQUEsVUFBSyxTQUM3QmlCO0FBQUFBLFVBQU8sYUFDSCtVLEVBQU0yakQ7QUFBQUEsV0FFZmo0QixDQUFPLEdBREZnNEIsQ0FBUztBQUFBLE1BSXhCO0FBRUEsWUFBTXo0RCxJQUFVLENBQUEsR0FDVjI0RCxJQUFheHJDLEVBQXdCN3ZCLEVBQUdnZ0IsT0FBT2xnQixJQUFJLEdBQ25EdzdELElBQU1mLEVBQWdCOTRELFNBQVM7QUFDckMsaUJBQVcyQixLQUFRazRELEdBQUs7QUFDdEIsY0FBTXQ3QyxJQUFNMU4sRUFBQStvRCxHQUFBaHNDLEVBQ01qc0IsR0FBSTtBQUFBLFVBQUEsT0FBU2szRCxFQUFTcjZDLFNBQVM3YyxDQUFJO0FBQUEsVUFBQyxPQUFTazNELEVBQVNwNkMsU0FBUzljLENBQUk7QUFBQSxRQUFDLENBQUEsR0FBQTtBQUFBLFVBQUFvckIsU0FBQUEsTUFBQSxDQUNqRi9XLEVBQU0yakQsY0FBYzNqRCxFQUFNMmpELFlBQVloNEQsQ0FBSSxJQUFJazNELEVBQVNwNkMsU0FBUzljLENBQUksQ0FBQztBQUFBLFNBRXpFO0FBQ0RWLFFBQUFBLEVBQVFvTyxLQUFLa1AsQ0FBTTtBQUFBLE1BQ3JCO0FBQ0EsWUFBTW03QyxJQUFZO0FBQUEsUUFDaEIzc0MsU0FBU0EsTUFBTTlyQjtBQUFBQSxRQUNmLEdBQUdxNEQ7QUFBQUEsUUFDSCxHQUFHdGpELEVBQU1pWTtBQUFBQTtBQUVYLGFBQUFwZCxFQUFBMm9ELEdBQUE1ckMsRUFBQTtBQUFBLFFBQUEsS0FFUztBQUFBLFFBQVcsYUFDSHNyQyxFQUFvQmw1RDtBQUFBQSxRQUFLLFVBRTVCbzVEO0FBQUFBLFNBQ043cUMsQ0FBSyxHQUZBbXJDLENBQVM7QUFBQTsyQkFoSnRCMXRDLEVBQWlCcGIsQ0FBQTtBQUFBOztBQzZCbkIsU0FBU2twRCxHQUFZMTJCLEdBQWE7QUFDaEMsTUFBSUEsS0FBTztBQUNGLFdBQUE7QUFFTCxFQUFBLE9BQU9BLEtBQVEsYUFDWEEsSUFBQSxLQUFLLFVBQVVBLENBQUc7QUFFMUIsTUFBSThTLElBQU8sR0FDUDN4QyxHQUNBdzFELEdBQ0E1MkI7QUFDSixNQUFJQyxFQUFJLFdBQVc7QUFBVSxXQUFBOFM7QUFDN0IsT0FBSzN4QyxJQUFJLEdBQUc0K0IsSUFBTUMsRUFBSSxRQUFRNytCLElBQUk0K0IsR0FBSzUrQjtBQUMvQixJQUFBdzFELElBQUEzMkIsRUFBSSxXQUFXNytCLENBQUMsR0FDZDJ4QyxLQUFBQSxLQUFRLEtBQUtBLElBQU82akIsR0FDcEI3akIsS0FBQTtBQUVILFNBQUEsS0FBSyxJQUFJQSxDQUFJO0FBQ3RCO0FBRUEsU0FBUzhqQixHQUFnQmhrRCxHQUFZO0FBQ25DLE1BQUlpa0QsSUFBVyxDQUFBO0FBQ1gsU0FBQSxPQUFPamtELEVBQU0sY0FBZSxZQUFZQSxFQUFNLFlBQVlBLEVBQU0sYUFBYSxRQUFRQSxFQUFNLGNBQWMsS0FDM0dpa0QsSUFBV2prRCxFQUFNLFdBQVcsTUFBTUEsRUFBTSxTQUFTLElBQ3hDQSxFQUFNLHNCQUFzQixRQUVyQ2lrRCxJQUFXamtELEVBQU0sYUFFTmlrRCxJQUFBLENBQUNqa0QsRUFBTSxVQUFVLEdBRXZCaWtEO0FBQ1Q7QUFLQSxNQUFBQyxLQUFldHZELEdBQWdCO0FBQUEsRUFDN0IsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUwsWUFBWSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJYixNQUFNLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlQLFVBQVUsRUFBRSxTQUFTLEdBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFNMUIsV0FBVyxFQUFFLFNBQVMsSUFBSTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBUTFCLE9BQU8sQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSVIsUUFBUSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJVCxZQUFZO0FBQUEsTUFDVixNQUFNO0FBQUEsSUFDUjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLQSxhQUFhO0FBQUEsTUFDWCxNQUFNO0FBQUEsSUFDUjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUEsTUFBTTtBQUFBLE1BQ0osU0FBUztBQUFBLElBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBLFdBQVc7QUFBQSxNQUNULE1BQU07QUFBQSxJQUNSO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJQSxjQUFjLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtmLGdCQUFnQjtBQUFBLE1BQ2QsTUFBTTtBQUFBLElBQ1I7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBLFlBQVk7QUFBQSxNQUNWLE1BQU07QUFBQSxJQUNSO0FBQUEsSUFFQSxVQUFVO0FBQUEsTUFDUixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE9BQU8sQ0FBQyxTQUFTLGVBQWUsU0FBUyxtQkFBbUI7QUFBQSxFQUM1RCxNQUFNb0wsR0FBWTlYLEdBQVU7QUFJcEIsVUFBQSxFQUFFLElBQUFLLE1BQU91SSxNQUNUcXpELElBQWE1N0QsRUFBRyxJQUFJLFFBQ3BCNjdELElBQWMsQ0FBQyxTQUFTLE9BQU8sR0FFL0J2QixJQUFXejZDLEdBQVFwSSxHQUFPOVgsQ0FBRyxHQUM3QixFQUFFLFVBQUFtOEQsR0FBVSxVQUFBNzdDLEdBQVUsaUJBQUFlLEVBQUEsSUFBb0JzNUM7QUFDaEQsSUFBQUEsRUFBUyxXQUFXO0FBQ1gsYUFBQXlCLEVBQVN0a0QsR0FBWXJVLEdBQVc7QUFDdkMsTUFBSSxDQUFDQSxFQUFLLFVBQVVxVSxFQUFNLFdBQ3hCclUsRUFBSyxTQUFTcVUsRUFBTTtBQUVoQixZQUFBdWtELElBQVVoOEQsRUFBRyxJQUFJLE1BQ2pCaThELElBQVFILEVBQVMxNEQsQ0FBSTtBQUMzQixVQUFJNjRELEtBQVMsTUFBTTtBQUViLFlBQUEsT0FBT0EsS0FBUztBQUNsQjtBQUdGLFFBQUFqN0MsRUFBZ0I1ZCxHQUFNLE9BQU8sR0FDN0JBLEVBQUs0NEQsQ0FBTyxJQUFJQztBQUNoQjtBQUFBLE1BQ0Y7QUFDSXhrRCxVQUFBQSxFQUFNLFVBQVUsUUFBUTtBQUMxQixjQUFNeWtELElBQVdYLEdBQVl0N0MsRUFBUzdjLENBQUksQ0FBQztBQUMzQyxRQUF3QjZjLEVBQVM3YyxDQUFJO0FBQ3JDLGNBQU0rNEQsSUFBUzFrRCxFQUFNLGFBQWFBLEVBQU0sYUFBYW1rRDtBQUNyRCxRQUFBeDRELEVBQUs0NEQsQ0FBTyxJQUFJRyxFQUFPRCxJQUFXQyxFQUFPLE1BQU07QUFDL0MsY0FBTUMsSUFBVTNrRCxFQUFNLGNBQWNBLEVBQU0sY0FBY29rRDtBQUNuRCxRQUFBejRELEVBQUEsU0FBU2c1RCxFQUFRLEtBQUssTUFBTUYsSUFBV0MsRUFBTyxNQUFNLElBQUlDLEVBQVEsTUFBTTtBQUFBLE1BQUE7QUFFdEUsUUFBQWg1RCxFQUFBNDRELENBQU8sSUFBSXZrRCxFQUFNO0FBQUEsSUFFMUI7QUFFTSxVQUFBNGtELElBQWlDdDhELEVBQVMsTUFBTTs7QUFDaEQsVUFBQTBYLEVBQU0sY0FBYztBQUN0QixlQUFJQSxFQUFNLGNBQWMsQ0FBQyxNQUFNLFFBQVFBLEVBQU0sVUFBVSxJQUM5QyxDQUFDQSxFQUFNLFVBQVUsSUFFbkJBLEVBQU07QUFHVCxZQUFBdEcsSUFBT21wRCxFQUFTO0FBQ3RCLFVBQUk3aUQsRUFBTSxjQUFjLFFBQVFBLEVBQU0sZUFBZTtBQUNuRCxlQUFPO0FBRUgsWUFBQWlrRCxJQUFXRCxHQUFnQmhrRCxDQUFLO0FBRXRDLFVBQUkvVSxJQUFVLENBQUE7QUFFUixZQUFBNDVELE1BQVk5N0QsSUFBQWlYLEVBQU0sU0FBTixnQkFBQWpYLEVBQVksVUFBUyxTQUNqQys3RCxNQUFZM2tELElBQUFILEVBQU0sU0FBTixnQkFBQUcsRUFBWSxVQUFTO0FBRXZDLE1BQUl6RyxLQUNRek8sSUFBQXlPLEVBQUssb0JBQW9CdXFELENBQVEsR0FFbkN2NEQsRUFBQVQsR0FBUyxDQUFDVSxNQUFTO0FBQ3JCLFFBQUFBLEVBQUttNUQsQ0FBUyxLQUFLLFNBQ3JCbjVELEVBQUttNUQsQ0FBUyxJQUFJOWtELEVBQU0sZ0JBQWdCclUsRUFBS2s1RCxDQUFTO0FBQUEsTUFDeEQsQ0FDRCxNQUVENTVELElBQVUsQ0FBQSxHQUNGUyxFQUFBdTRELEdBQVUsQ0FBQ3Q0RCxNQUFTO0FBQzFCLFFBQUlBLGFBQWdCLFNBQ2xCVixFQUFRLEtBQUtVLENBQUksSUFFakJWLEVBQVEsS0FBSztBQUFBLFVBQ1gsQ0FBQzQ1RCxDQUFTLEdBQUdsNUQ7QUFBQSxVQUNiLENBQUNtNUQsQ0FBUyxHQUFHbjVEO0FBQUEsUUFBQSxDQUNkO0FBQUEsTUFDSCxDQUNEO0FBR0gsWUFBTW81RCxJQUF1QixDQUFBO0FBQ3JCLGFBQUFyNUQsRUFBQVQsR0FBUyxDQUFDVSxNQUFTO0FBQ3pCLFFBQUFvNUQsRUFBZ0IsS0FBS3BzQyxHQUFLaHRCLEdBQU0sVUFBVSxDQUFDO0FBQUEsTUFBQSxDQUM1QyxHQUNPRCxFQUFBcTVELEdBQWlCLENBQUNwNUQsTUFBUztBQUNqQyxRQUFBMjRELEVBQVN0a0QsR0FBT3JVLENBQUk7QUFBQSxNQUFBLENBQ3JCLEdBQ01vNUQ7QUFBQSxJQUFBLENBQ1I7QUFFRCxhQUFTajZCLEVBQVFuL0IsR0FBVztBQUMxQixNQUFBekQsRUFBSSxLQUFLLFNBQVMsRUFBRSxNQUFBeUQsRUFBWSxDQUFBO0FBQUEsSUFDbEM7QUFDUyxhQUFBakQsRUFBUTRJLEdBQWUzRixHQUFXO0FBQ3pDLE1BQUF6RCxFQUFJLEtBQUssU0FBUyxFQUFFLE1BQUF5RCxHQUFNLE9BQUEyRixFQUFPLENBQUE7QUFDakMsWUFBTTB6RCxJQUFtQixDQUFBO0FBQ3pCLGVBQVN6MkQsSUFBSSxHQUFHQSxJQUFJcTJELEVBQW1CLE1BQU0sUUFBUXIyRDtBQUNuRCxRQUFJQSxNQUFNK0MsS0FDUjB6RCxFQUFVLEtBQUt4OEMsRUFBU284QyxFQUFtQixNQUFNcjJELENBQUMsQ0FBQyxDQUFDO0FBR3BELE1BQUFyRyxFQUFBLEtBQUsscUJBQXFCODhELENBQVM7QUFBQSxJQUN6QztBQUVPLFdBQUE7QUFBQSxNQUNMLElBQUF6OEQ7QUFBQSxNQUNBLEdBQUdzNkQ7QUFBQSxNQUNILFNBQUEvM0I7QUFBQSxNQUNBLG9CQUFBODVCO0FBQUEsTUFDQSxTQUFBbDhEO0FBQUEsSUFBQTtBQUFBLEVBRUo7QUFDRixDQUFDOzs7NEJDelFDd3hCLElBQUFuRSxFQTJCTyxTQTNCUDtnQkFFSSxRQUE4R2hoQixJQUFBO0FBQUEsSUFBQUksRUFBQSxjQUFBTSxFQUExRCtTLEVBQWEsR0FBQTlTLEVBQUErcEIsSUFBQSxFQUFBLEtBQUEsRUFBQSxHQUFBQyxHQUFBdnFCLEVBQUEsb0JBQUEsQ0FBQXhKLE9BQUk4SixFQUFBLEdBQXVCdWdCLEVBQUFnSyxHQUFBO0FBQUEsTUFBRyxLQUFLN3FCLEVBQUUsU0FBSXhKLENBQUE7QUFBQSxNQUFBLGVBQUF3SixFQUFBO0FBQUE7SUFFbkYsR0FBQSxNQUFBLEdBQUEsQ0FBQSxlQUFBLE9BQUEsQ0FBQSxFQUFBLEdBQUEsR0FBQSxLQUFBQSxFQUFBLFNBQUEsVUFBQU0sRUFDd0IrUyxFQUFhLEdBQUE5UyxFQUFBK3BCLElBQUEsRUFBQSxLQUFBLEVBQUEsR0FBQUMsR0FBQXZxQixFQUFBLG9CQUFBLENBQUF4SixPQUFJOEosRUFBQSxHQUFPcTFCLEVBQVksUUFBQTtBQUFBLE1BQU1yaUIsS0FBQUEsRUFBQUEsU0FBQUEsQ0FBQUE7QUFBQUEsTUFBQUEsU0FBQUEsQ0FBQUEsTUFBQUEsRUFBQUEsUUFBQUEsQ0FBQUE7QUFBQUEsVUFHekZ0VCxFQWlCVyxTQUFBeEosQ0FBQSxDQUFBLEdBQUEsR0FBQXFKLEVBQUEsRUFBQSxHQUFBLEdBQUEsTUFBQVMsRUFqQmlEK1MsRUFBYSxHQUFBOVMsRUFBQStwQixJQUFBLEVBQUEsS0FBQSxFQUFBLEdBQUFDLEdBQUF2cUIsRUFBQSxvQkFBQSxDQUFBeEosR0FBQTJGLE9BR2hFbUUsRUFBUyxHQUFBdWdCLEVBQUFPLEVBQUFwaEIsRUFBQSxHQUFBLElBQUEsSUFBQSxHQUFBeWlCLEVBQUE7QUFBQSxNQUNkLEtBQUl6aUIsRUFBQyxTQUFPeEosQ0FBQTtBQUFBLE1BQ1gsT0FBQTtBQUFBLE1BQUEsTUFBQTtBQUFBLE1BRUEsVUFBVXdKLEVBQUE7QUFBQSxJQUFBLEdBQ1YsRUFBVSxTQUFBLEdBQUEsR0FBQXhKLEdBQUE7QUFBQSxNQUNWLE1BQUE7QUFBQSxNQUNBLE1BQUE7QUFBQSxNQUFBLFNBQUEsQ0FBQTZ1QixNQUFBcmxCLEVBQUEsUUFBQTdELEdBQUEzRixDQUFBO0FBQUEsTUFJVSxTQUFBLENBQUE2dUIsTUFBQXJsQixFQUFBLFFBQUF4SixDQUFBO0FBQUEsSUFBQSxDQUFBLEdBQUE7QUFBQSxNQURULFNBQUFzcUIsRUFBQSxNQUFBO0FBQUEsUUFBQXRxQixFQUFBLFFBQUE4SixLQUFxQnVnQixFQUFJa0UsR0FBQTtBQUFBLFVBQUcsS0FBSTtBQUFBLFVBQWlCLE1BQUt2dUIsRUFBQztBQUFBLFVBQUEsTUFBQUEsRUFBQTtBQUFBO3FCQUM5QyxRQUNYLE1BQUEsQ0FBQSxLQUFBZ0ssR0FBQSxJQUFBLEVBQUE7QUFBQTs7Ozs7O3FEQ0NWc3ZELEtBQWVyd0QsR0FBZ0I7QUFBQSxFQUM3QixNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFPTCxZQUFZO0FBQUEsTUFDVixNQUFNLENBQUMsUUFBUSxLQUFLO0FBQUEsTUFDcEIsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLElBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU9BLFdBQVcsRUFBRSxNQUFNLFFBQVEsU0FBUyxLQUFLLFNBQVMsR0FBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLeEQsVUFBVSxFQUFFLE1BQU0sU0FBUyxTQUFTLEdBQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUkxQyxNQUFNO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsTUFDVCxTQUFTO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE9BQU8sQ0FBQyxhQUFhO0FBQUEsRUFDckIsTUFBTW9MLEdBQU85WCxHQUFLOztBQUNWLFVBQUF3UixJQUFPME8sR0FBUXBJLEdBQU85WCxDQUFHO0FBRTNCLEtBQUFhLElBQUFpWCxFQUFNLFNBQU4sUUFBQWpYLEVBQVksb0JBQ2QyUSxFQUFLLFdBQVc7QUFHWixVQUFBd3JELElBQW1CNThELEVBQVMsTUFFekIwWCxFQUFNLFFBQ2Q7QUFFTSxXQUFBO0FBQUEsTUFDTCxHQUFHdEc7QUFBQSxNQUNILGtCQUFBd3JEO0FBQUEsSUFBQTtBQUFBLEVBRUo7QUFBQSxFQUNBLE9BQU87QUFDTCxXQUFPO0VBQ1Q7QUFBQSxFQUNBLFVBQVU7QUFBQSxJQUNSLFNBQVM7QUFFSCxhQUFBLEtBQUssY0FBYyxPQUNkLEtBR0YsS0FBSyxlQUFlLEtBQUssVUFBVTtBQUFBLElBQzVDO0FBQUEsSUFDQSxpQkFBaUI7QUFFWCxVQUFBLEtBQUssY0FBYztBQUNyQixlQUFPO0FBRVQsWUFBTTVvRCxJQUFNLENBQUE7QUFFRCxpQkFBQTNRLEtBQVEsS0FBSztBQUV0QixRQUFBMlEsRUFBSSxLQUFLLEtBQUssZUFBZTNRLENBQUksQ0FBQztBQUU3QixhQUFBMlE7QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1AsWUFBWXBTLEdBQWE7QUFDdkIsVUFBSUEsS0FBVTtBQUVaLFlBQUksS0FBSyxVQUFVO0FBQ2pCLFVBQUFBLElBQVMsQ0FBQTtBQUVFLHFCQUFBeUIsS0FBUSxLQUFLO0FBQ3RCLHVCQUFXdzVELEtBQU94NUQ7QUFDaEIsY0FBQXpCLEVBQU8sS0FBS2k3RCxDQUFHO0FBQUEsUUFFbkI7QUFHQSxVQUFBajdELElBQVMsS0FBSztBQUdsQixVQUFJQSxLQUFVO0FBQ1osZUFBTztBQUVULFVBQUlvUyxJQUFNO0FBRU4sYUFBQSxPQUFPcFMsS0FBVyxZQUFZLENBQUMsS0FBSyxZQUFZLEtBQUssYUFBYSxRQUFRLEtBQUssY0FBYyxLQUV6Rm9TLElBQUFwUyxFQUFPLE1BQU0sS0FBSyxTQUFTLElBQ3hCQSxhQUFrQixRQUNyQm9TLElBQUFwUyxJQUVOb1MsSUFBTSxDQUFDcFMsQ0FBTSxHQUVSb1M7QUFBQSxJQUNUO0FBQUEsSUFDQSxlQUFlcFMsR0FBYTtBQUVwQixZQUFBb1MsSUFBTSxLQUFLLFlBQVlwUyxDQUFNLEdBRzdCd1AsSUFBTyxLQUFLO0FBQ2xCLFVBQUlBO0FBQ0ssZUFBQUEsRUFBSyxvQkFBb0I0QyxDQUFHO0FBQUEsSUFFdkM7QUFBQSxFQUNGO0FBQ0YsQ0FBQztTQ2pKbUI0b0QsR0FBZ0IvdkQsR0FBQUMsR0FBQUMsR0FBQUMsR0FBQUMsR0FBQUMsR0FBQTtnQkFDOUIsUUFLTSxNQUFBO0FBQUEsSUFKSkwsRUFBQSxvQkFBQU0sRUFBQSxFQUFBLEdBQUFDLEVBQUErcEIsSUFHTyxFQUh1QixLQUFBLEVBQUEsR0FBQUMsR0FBQXZxQixFQUFNLGdCQUFYLENBQUFpd0QsR0FBQUMsT0FBekI1dkQsRUFBQSxHQUFBQyxFQUFBLE9BR08sT0FIZ0MydkQsS0FBSztBQUFBLE9BQ3pCNXZELEVBQUEsRUFBQSxHQUFBQyxFQUFBK3BCLElBQUEsTUFBQUMsR0FBQTBsQyxHQUFBLENBQUF6NUQsR0FBQTJGLE9BQWpCbUUsRUFBQSxHQUFBQyxFQUFtQyxvQkFBUDtBQUFBLFFBQzVCcEUsTUFBQSxLQUFBbUUsRUFBQSxHQUFBQyxFQUFpQyxZQUF4QitTLEtBQVEsS0FBQTlTLEdBQUEsSUFBQSxFQUFBO0FBQUE7O09BTUYsR0FBQSxHQUFBLE1BQUFGLEVBQUEsRUFBQSxHQUFBQyxFQUFBK3BCLElBQUEsRUFBQSxLQUFBLEVBQUEsR0FBQUMsR0FBQXZxQixFQUFBLFFBQUEsQ0FBQXhKLEdBQUEyRixPQUFqQm1FLEVBQUEsR0FBQUMsRUFBbUMsb0JBQVA7QUFBQSxNQUM1QnBFLE1BQUEsS0FBQW1FLEVBQUEsR0FBQUMsRUFBaUMsWUFBeEIrUyxLQUFRLEtBQUE5UyxHQUFBLElBQUEsRUFBQTtBQUFBOzs7O3FEQ0l6QjJ2RCxLQUFlMXdELEdBQWdCO0FBQUEsRUFDN0IsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUwsTUFBTSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJUCxTQUFTLEVBQUUsTUFBTSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJdkIsbUJBQW1CO0FBQUEsTUFDakIsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLElBQ1g7QUFBQSxFQUNGO0FBQUEsRUFDQSxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJTDtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBO0FBQUEsRUFDRjtBQUFBLEVBQ0EsTUFBTW9MLEdBQU85WCxHQUFLO0FBQ2hCLFVBQU1xOUQsSUFBY24xRCxLQUNkbzFELElBQWFwOUMsR0FBUXBJLEdBQU85WCxDQUFHLEdBQy9CLEVBQUUsSUFBQUssTUFBT3VJLE1BQ1QyMEQsSUFBbUJyMUQ7QUFFekIsSUFBSTRQLEVBQU0sU0FDU3lsRCxFQUFBLFFBQVFsOUQsRUFBRyxTQUFTLFdBQVc7QUFBQTtBQUFBLE1BRTlDLE9BQU95WCxFQUFNLEtBQUs7QUFBQTtBQUFBLE1BRWxCLE9BQU9BLEVBQU0sS0FBSztBQUFBO0FBQUEsTUFFbEIsVUFBVUEsRUFBTSxLQUFLO0FBQUEsSUFBQSxDQUN0QjtBQUVHLFVBQUE4aUQsSUFBa0IwQyxFQUFXO0FBRW5DLGFBQVNFLEVBQWUxN0QsR0FBWTtBQUVsQyxVQURJOUIsRUFBQSxLQUFLLFVBQVU4QixDQUFLLEdBQ3BCQSxHQUFPO0FBQ1QsWUFBSTI3RCxJQUFrQixDQUFBO0FBQ2hCLGNBQUFqc0QsSUFBTzhyRCxFQUFXO0FBQ3BCLFlBQUE5ckQsS0FBUUEsRUFBSyxTQUFTO0FBQ3hCLG1CQUFTL04sS0FBUTNCLEdBQU87QUFDaEIsa0JBQUErNEQsSUFBTXJwRCxFQUFLLFFBQVEvTixDQUFJO0FBQzdCLFlBQUlvM0QsS0FDRjRDLEVBQWdCLEtBQUs1QyxDQUFHO0FBQUEsVUFFNUI7QUFDSSxVQUFBNzZELEVBQUEsS0FBSyxtQkFBbUJ5OUQsQ0FBZTtBQUFBLFFBQzdDO0FBQUEsTUFBQTtBQUVJLFFBQUF6OUQsRUFBQSxLQUFLLG1CQUFtQixJQUFJO0FBQUEsSUFFcEM7QUFDTyxXQUFBO0FBQUEsTUFDTCxJQUFBSztBQUFBLE1BQ0EsYUFBQWc5RDtBQUFBLE1BQ0EsR0FBR0M7QUFBQSxNQUNILGtCQUFBQztBQUFBLE1BQ0EsaUJBQUEzQztBQUFBLE1BQ0EsZ0JBQUE0QztBQUFBLElBQUE7QUFBQSxFQUVKO0FBQ0YsQ0FBQztTQzdGT2h3QyxHQUFhdmdCLEdBQUFDLEdBQUFDLEdBQUFDLEdBQUFDLEdBQUFDLEdBQUE7QUFDaEIsU0FBQUMsRUFBQSxHQUF3QnVnQixFQUFBTyxFQUFBcGhCLEVBQUEsR0FBQSxTQUFBLElBQUEsR0FBQXlpQixFQUFBO0FBQUEsSUFDakI2dEMsS0FBQUE7QUFBQUEsSUFBQUEsU0FBQUEsRUFBQUE7QUFBQUE7O3FEQ2lCWkcsS0FBZWh4RCxHQUFnQjtBQUFBLEVBQzdCLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlMLE1BQU0sQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSVAsU0FBUyxFQUFFLE1BQU0sT0FBTyxTQUFTLFFBQVcsU0FBUyxHQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLM0QsWUFBWTtBQUFBLE1BQ1YsTUFBTTtBQUFBLElBQ1I7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtBLGFBQWE7QUFBQSxNQUNYLE1BQU07QUFBQSxNQUNOLFVBQVU7QUFDUixlQUFPO01BQ1Q7QUFBQSxJQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJQSxtQkFBbUI7QUFBQSxNQUNqQixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlMO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUE7QUFBQSxFQUNGO0FBQUEsRUFDQSxNQUFNb0wsR0FBTzlYLEdBQUs7QUFDVixVQUFBLEVBQUUsSUFBQUssTUFBT3VJO0FBQ2YsUUFBSSt4RCxJQUFXejZDLEdBQVFwSSxHQUFPOVgsR0FBS0ssRUFBRyxjQUFjLFVBQVU7QUFDeEQsVUFBQXU2RCxJQUFrQkQsRUFBUztBQW9CMUIsV0FBQTtBQUFBLE1BQ0wsSUFBQXQ2RDtBQUFBLE1BQ0EsR0FBR3M2RDtBQUFBLE1BQ0gsaUJBQUFDO0FBQUEsTUFDQSxrQkF2QnVCLENBQUM5NEQsTUFBZTtBQUV2QyxZQURJOUIsRUFBQSxLQUFLLFVBQVU4QixDQUFLLEdBQ3BCQSxHQUFPO0FBQ1QsY0FBSTI3RCxJQUFrQixDQUFBO0FBQ2hCLGdCQUFBanNELElBQU9tcEQsRUFBUztBQUNsQixjQUFBbnBELEtBQVFBLEVBQUssU0FBUztBQUN4QixxQkFBUy9OLEtBQVEzQixHQUFPO0FBQ2hCLG9CQUFBKzRELElBQU1ycEQsRUFBSyxRQUFRL04sQ0FBSTtBQUM3QixjQUFJbzNELEtBQ0Y0QyxFQUFnQixLQUFLNUMsQ0FBRztBQUFBLFlBRTVCO0FBQ0ksWUFBQTc2RCxFQUFBLEtBQUssbUJBQW1CeTlELENBQWU7QUFBQSxVQUM3QztBQUFBLFFBQUE7QUFFSSxVQUFBejlELEVBQUEsS0FBSyxtQkFBbUIsSUFBSTtBQUFBLE1BQ2xDO0FBQUEsSUFPQTtBQUFBLEVBRUo7QUFDRixDQUFDO0FDbkdvQyxTQUFBd3RCLEdBQUF2Z0IsR0FBQUMsR0FBQUMsR0FBQUMsR0FBQUMsR0FBQUMsR0FBQTtBQUZqQyxTQUFBQyxFQUFBLEdBQUF1Z0IsRUFBQU8sRUFRQ3BoQixtQkFOZ0IydEQsSUFBSixHQUFBLEVBQUEsVUFBQTN0RCxFQUFBLGlCQUFBLEdBQUE7QUFBQSxJQUFBLFNBQUE4Z0IsRUFBQSxNQUFBO0FBQUEsd0RBQ1B4Z0IsRUFBYSxHQUFBdWdCLEVBQUFPLEVBQUFwaEIsRUFBQSxjQUFBQSxFQUFBLEdBQUEsU0FBQSxJQUFBLEdBQUF5aUIsRUFBQTtBQUFBLFFBQ2hCLFNBQUtwUDtBQUFBQSxRQUNMamdCLEtBQUFBO0FBQUFBLFFBQ095NkQsS0FBQUEsRUFBQUEsU0FBQUEsQ0FBQUE7QUFBQUEsUUFDYSxDQUFBN3RELEVBQUEsR0FBQSxTQUFBLFNBQUEsRUFBQSxHQUFBQSxFQUFBLFNBQUF4SixDQUFBO0FBQUEsTUFBakI4YyxHQUFBQSxFQUFBQSxTQUFBQSxHQUFBQSxHQUFBQSxFQUFBQSxXQUFBQSxHQUFBQTtBQUFBQSxRQUFBQSxTQUFBQSxFQUFBQSxNQUFBQTtBQUFBQTs7Ozs7Ozs7cURDSVZvOUMsS0FBZWp4RCxHQUFnQjtBQUFBLEVBQzdCLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS0wsTUFBTTtBQUFBLE1BQ0osTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBLFNBQVMsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSVYsbUJBQW1CO0FBQUEsTUFDakIsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLElBQ1g7QUFBQSxFQUNGO0FBQUEsRUFDQSxPQUFPLENBQUMsYUFBYTtBQUFBLEVBQ3JCLE1BQU1vTCxHQUFPOVgsR0FBSztBQUNWLFVBQUEsRUFBRSxJQUFBSyxNQUFPdUk7QUFDZixRQUFJK3hELElBQVd6NkMsR0FBUXBJLEdBQU85WCxHQUFLSyxFQUFHLE9BQU8sVUFBVTtBQUNqRCxVQUFBdTZELElBQWtCRCxFQUFTO0FBQzFCLFdBQUE7QUFBQSxNQUNMLElBQUF0NkQ7QUFBQSxNQUNBLEdBQUdzNkQ7QUFBQSxNQUNILGlCQUFBQztBQUFBLElBQUE7QUFBQSxFQUVKO0FBQUEsRUFDQSxVQUFVO0FBQUEsSUFDUixVQUFVO0FBQ0osYUFBQSxLQUFLLGdCQUFnQixTQUFTLElBQ3pCLEtBQUssZ0JBQWdCLENBQUMsSUFFeEI7SUFDVDtBQUFBLElBQ0EsWUFBWTtBQUNOLGFBQUEsS0FBSyxnQkFBZ0IsU0FBUyxJQUN6QixLQUFLLGdCQUFnQixDQUFDLElBRXhCO0lBQ1Q7QUFBQSxJQUNBLFVBQVU7O0FBQ0YsWUFBQXY2RCxJQUFLQyxHQUFVO0FBQ2QsYUFBQTtBQUFBO0FBQUEsUUFFTCxDQUFDRCxFQUFHLE9BQU8sVUFBVSxHQUFHLEtBQUssVUFBUVEsSUFBQSxLQUFLLFNBQUwsZ0JBQUFBLEVBQVcsVUFBUyxPQUFPO0FBQUE7QUFBQSxRQUVoRSxDQUFDUixFQUFHLE9BQU8sWUFBWSxHQUFHLEtBQUssWUFBVTRYLElBQUEsS0FBSyxTQUFMLGdCQUFBQSxFQUFXLFVBQVMsT0FBTztBQUFBO0FBQUEsUUFFcEUsQ0FBQzVYLEVBQUcsT0FBTyxXQUFXLEdBQUcsS0FBSyxVQUFRMlgsSUFBQSxLQUFLLFNBQUwsZ0JBQUFBLEVBQVcsVUFBUyxPQUFPO0FBQUE7QUFBQSxRQUVqRSxDQUFDM1gsRUFBRyxPQUFPLGFBQWEsR0FBRyxLQUFLLFlBQVU4WCxJQUFBLEtBQUssU0FBTCxnQkFBQUEsRUFBVyxVQUFTLE9BQU87QUFBQTtBQUFBLFFBRXJFLENBQUM5WCxFQUFHLE9BQU8sV0FBVyxHQUFHLEtBQUssVUFBUStYLElBQUEsS0FBSyxTQUFMLGdCQUFBQSxFQUFXLFVBQVMsT0FBTztBQUFBO0FBQUEsUUFFakUsQ0FBQy9YLEVBQUcsT0FBTyxhQUFhLEdBQUcsS0FBSyxZQUFVaWdDLElBQUEsS0FBSyxTQUFMLGdCQUFBQSxFQUFXLFVBQVMsT0FBTztBQUFBLE1BQUE7QUFBQSxJQUV6RTtBQUFBLEVBQ0Y7QUFDRixDQUFDOzs7O3FEQ2hFRHM5QixLQUFlbHhELEdBQWdCO0FBQUEsRUFDN0IsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUwsWUFBWSxFQUFFLFVBQVUsR0FBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSTlCLGFBQWEsRUFBRSxNQUFNLFFBQVEsU0FBUyxRQUFXLFVBQVUsR0FBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSWpFLFFBQVEsRUFBRSxNQUFNLFFBQVEsU0FBUyx1QkFBdUIsVUFBVSxHQUFNO0FBQUEsRUFDMUU7QUFBQSxFQUNBLE9BQU87QUFDRSxXQUFBO0FBQUEsTUFDTCxNQUFNLENBQUM7QUFBQSxJQUFBO0FBQUEsRUFFWDtBQUFBLEVBQ0EsVUFBVTtBQUFBLElBQ1IsV0FBVztBQUNULFVBQUksS0FBSyxjQUFjLFFBQVEsS0FBSyxlQUFlO0FBQzFDLGVBQUE7QUFFVCxVQUFJbkMsSUFBTztBQUNQLGFBQUEsS0FBSyxlQUFlLE9BQ3RCQSxJQUFPSCxHQUFNLEtBQUssWUFBWSxLQUFLLFdBQVcsSUFFdkNHLElBQUFILEdBQU0sS0FBSyxVQUFVLEdBRXZCRyxFQUFLLE9BQU8sS0FBSyxNQUFNO0FBQUEsSUFDaEM7QUFBQSxFQUNGO0FBQUEsRUFDQSxVQUFVO0FBQUEsRUFBQztBQUFBLEVBQ1gsU0FBUyxDQUFDO0FBQ1osQ0FBQzs7OztxREN2QkRzekQsS0FBZW54RCxHQUFnQjtBQUFBLEVBQzdCLE1BQU07QUFBQSxFQUNOLFlBQVksQ0FBQztBQUFBLEVBQ2IsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUwsTUFBTSxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJUCxTQUFTLEVBQUUsTUFBTSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJdkIsYUFBYSxFQUFFLE1BQU0sT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSTVCLG1CQUFtQjtBQUFBLE1BQ2pCLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxJQUNYO0FBQUEsRUFDRjtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUw7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJQTtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBLE1BQU1vTCxHQUFPOVgsR0FBSztBQUNWLFVBQUEsRUFBRSxHQUFBaUosTUFBTVcsTUFDUixFQUFFLElBQUF2SixNQUFPdUksTUFDVG95RCxJQUFzQjU2RCxFQUFTLE1BQzVCMFgsRUFBTSxlQUFlN08sRUFBRSxpQ0FBaUMsQ0FDaEU7QUFFRyxRQUFBMHhELElBQVd6NkMsR0FBUXBJLEdBQU85WCxDQUFHO0FBRWpDLFVBQU0rdkIsSUFBUS92QixFQUFJLE9BRVo0NkQsSUFBa0JELEVBQVMseUJBRTNCMW5CLElBQWtCN3lDLEVBQVMsTUFBTTtBQUMvQixZQUFBb1IsSUFBT21wRCxFQUFTO0FBQ2YsYUFBQXQ2RCxFQUFHLFdBQVcsMkJBQTJCO0FBQUEsUUFDOUMsT0FBT21SLEVBQUs7QUFBQSxRQUNaLE9BQU9BLEVBQUs7QUFBQSxRQUNaLFVBQVVBLEVBQUs7QUFBQSxNQUFBLENBQ2hCO0FBQUEsSUFBQSxDQUNGLEdBRUswcEQsSUFBbUIsQ0FBQ3A1RCxNQUFlO0FBRXZDLFVBREk5QixFQUFBLEtBQUssVUFBVThCLENBQUssR0FDcEJBLEdBQU87QUFDSCxjQUFBMFAsSUFBT21wRCxFQUFTO0FBQ2xCLFlBQUFucEQsS0FBUUEsRUFBSztBQUNmLGNBQUkxUCxhQUFpQixPQUFPO0FBQzFCLGdCQUFJMjdELElBQWtCLENBQUE7QUFDdEIscUJBQVNoNkQsS0FBUTNCLEdBQU87QUFDaEIsb0JBQUErNEQsSUFBTXJwRCxFQUFLLFFBQVEvTixDQUFJO0FBQzdCLGNBQUlvM0QsS0FDRjRDLEVBQWdCLEtBQUs1QyxDQUFHO0FBQUEsWUFFNUI7QUFDSSxZQUFBNzZELEVBQUEsS0FBSyxtQkFBbUJ5OUQsQ0FBZTtBQUFBLFVBQUE7QUFFM0MsWUFBQXo5RCxFQUFJLEtBQUssbUJBQW1Cd1IsRUFBSyxRQUFRMVAsQ0FBSyxDQUFDO0FBQUEsTUFFbkQ7QUFFSSxRQUFBOUIsRUFBQSxLQUFLLG1CQUFtQixJQUFJO0FBQUEsSUFDbEMsR0FHSTg5RCxJQUFVNTFEO0FBQ1QsV0FBQTtBQUFBLE1BQ0wsSUFBQTdIO0FBQUEsTUFDQSxpQkFBQTR5QztBQUFBLE1BQ0EscUJBQUErbkI7QUFBQSxNQUNBLEdBQUdMO0FBQUEsTUFDSCxpQkFBQUM7QUFBQSxNQUNBLGtCQUFBTTtBQUFBLE1BQ0EsT0FBQW5yQztBQUFBLE1BQ0EsU0FBQSt0QztBQUFBLElBQUE7QUFBQSxFQUVKO0FBQ0YsQ0FBQzs7QUMxSEMsUUFBQS9rQyxJQUFBbEwsRUFXWSxnQkFWRjtTQUVQeHRCLEVBQUcsR0FBVXl0QixFQUFRTyxFQUFtQnBoQixFQUFBLEdBQUEsV0FBQSxJQUFBLEdBQUF5aUIsRUFBQTtBQUFBLElBQ3hDLEtBQUE7QUFBQSxJQUNPdWpCLENBQUFBLEVBQUFBLEdBQUFBLFdBQWUsV0FDaEIsRUFBRWlvQixHQUFBQSxFQUFBQTtBQUFBQSxJQUV3Qm5yQyxhQUFBQSxFQUFBQTtBQUFBQSxFQUFBQSxHQUFBQSxFQUFBQSxpQkFBQUEsRUFBQUEsVUFBQUEsRUFBQUEsaUJBQUFBLENBQUFBLEdBQUFBLEdBQUFBLEVBQUFBLEdBQUFBLEVBQUFBLEdBQUFBO0FBQUFBLE9BQW1COWlCLEVBQUssT0FBQSxDQUFBbkwsR0FBQTRCO01BQ3ZELE1BQUFBO0FBQUEsTUFBQSxJQUFpQnFxQixFQUFPLENBQUsxaUIsTUFBQTtBQUFBLFFBQUFzSCxFQUFVb21CLEdBQUs7QUFBQSxVQUFBLE9BQUFqM0I7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN3SWxELFVBQU1nVyxJQUFRbWhCLEdBc0JSbEosSUFBUXNyQyxNQWVSMW9DLElBQVFzakIsR0FVUjtBQUFBLE1BQUU1MUMsSUFBQUE7QUFBQUEsSUFBSSxJQUFHdUksR0FBSyxHQUNkO0FBQUEsTUFBRUssR0FBQUE7QUFBQUEsSUFBRyxJQUFHVyxHQUFPLEdBQ2ZtMEQsSUFBZ0I3MUQsS0FDaEI4MUQsSUFBa0I5MUQsS0FDbEIrMUQsSUFBYS8xRCxFQUFJLEVBQUs7QUFFNUIsYUFBU2cyRCxJQUFVO0FBQ2pCRCxNQUFBQSxFQUFXbjhELFFBQVE7QUFBQSxJQUNyQjtBQUNBLGFBQVNzNUIsSUFBUztBQUNoQjZpQyxNQUFBQSxFQUFXbjhELFFBQVE7QUFBQSxJQUNyQjtBQUVBLFVBQU07QUFBQSxNQUFFZ1gsU0FBQUE7QUFBQUEsTUFBU2YsYUFBQUE7QUFBQUEsTUFBYTlCLFlBQUFBO0FBQUFBLElBQVksSUFBR2dLLEdBQVE7QUFFckQsYUFBU2srQyxFQUFpQjNyQyxHQUFpQjtBQUN6QyxNQUFJQSxLQUFjLFFBQVMxZ0IsTUFBTXpELFFBQVFta0IsQ0FBVSxLQUFLQSxFQUFXZ2YsVUFBVSxJQUMzRWwxQixFQUFnQnhhLFFBQVEsTUFFcEJnVyxFQUFNc21ELFdBQ1I5aEQsRUFBZ0J4YSxRQUFRMHdCLEtBQWMsS0FFdENsVyxFQUFnQnhhLFFBQVEsQ0FBQzB3QixDQUFVLEdBRWpDMWEsRUFBTXVtRCxjQUFjLGFBQ3RCL2hELEVBQWdCeGEsUUFBUXdhLEVBQWdCeGEsTUFBTW1DLElBQUtSLENBQUFBLE1BQzFDcVUsRUFBTXRHLEtBQUs4TyxTQUFTN2MsQ0FBSSxDQUNoQztBQUFBLElBR1A7QUFFQSxVQUFNeVYsSUFBaUJoUixLQUNqQm8yRCxJQUFxQmwrRCxFQUFTLE9BQzNCO0FBQUEsTUFDTDYxQixTQUFTLENBQUM7QUFBQSxNQUViLEdBRUtzb0MsSUFBa0IsT0FBT0MsSUFBdUUsT0FBTzs7QUFDM0csVUFBSTFtRCxFQUFNeEIsWUFBWXdCLEVBQU1nN0IsYUFBWWg3QixLQUFBQSxFQUFNak0sV0FBTmlNLFFBQUFBLEdBQWN4QixhQUFZd0IsSUFBQUEsRUFBTWpNLFdBQU5pTSxRQUFBQSxFQUFjZzdCO0FBQzlFO0FBRUYsVUFBSWg3QixFQUFNdEcsUUFBUTtBQUNoQixjQUFNLElBQUk4aUIsTUFBTSxxQ0FBcUM7QUFHdkQsWUFBTTFvQixJQUFNLE1BQU1vVSxHQUFXO0FBQUEsUUFDM0JqSSxhQUFBQTtBQUFBQSxRQUNBZSxTQUFBQTtBQUFBQSxRQUNBMkcsbUJBQW1CM0gsRUFBTTJIO0FBQUFBLFFBQ3pCZy9DLHFCQUFxQkMsRUFBd0I7QUFBQSxRQUM3Q3R2RCxTQUFTO0FBQUEsVUFDUG5HLEdBQUFBO0FBQUFBLFVBQ0E1SSxJQUFBQTtBQUFBQSxVQUNBLEdBQUdtK0QsS0FBQUEsZ0JBQUFBLEVBQWFwdkQ7QUFBQUEsUUFDakI7QUFBQSxRQUNENkcsWUFBQUE7QUFBQUEsTUFDRixDQUFDO0FBRURrb0QsTUFBQUEsRUFBaUJybUQsRUFBTTBhLFVBQVUsR0FDN0IxYSxFQUFNNm1ELGNBQ1IsTUFBTTdtRCxFQUFNNm1ELFdBQVc7QUFBQSxRQUNyQnRzRCxhQUFhbXNELEtBQUFBLGdCQUFBQSxFQUFhbnNEO0FBQUFBLFFBQzFCLEdBQUd1c0QsRUFBZ0I7QUFBQSxNQUNyQixDQUFDLEdBRUNKLEtBQ0Y1eUQsRUFBSXdULGtCQUFrQm8vQyxLQUFBQSxnQkFBQUEsRUFBYW5zRCxXQUFXO0FBRWhELFlBQU13c0QsSUFBaUJqM0QsRUFDckI7QUFBQSxRQUNFcXVCLFNBQVM7QUFBQSxVQUNQcmlCLE9BQU9rRSxFQUFNZ25ELFdBQVc3MUQsRUFBRSw2QkFBNkIsSUFBSUEsRUFBRSwrQkFBK0I7QUFBQSxVQUM1RmdyQyxPQUFPO0FBQUEsVUFDUC9XLFdBQVc7QUFBQSxVQUNYN0IsSUFBSWg3QixFQUFHMCtELE9BQU81K0Q7QUFBQUEsVUFDZDZ2RCxRQUFRO0FBQUEsVUFDUixHQUFHM3ZELEVBQUdrN0IsWUFBWXlqQyxjQUFjMytELEVBQUcwK0QsT0FBTzUrRCxJQUFJO0FBQUEsVUFDOUN1YyxTQUFTO0FBQUEsWUFDUGpjLE9BQU87QUFBQSxjQUNMdStCLE1BQU07QUFBQSxZQUNQO0FBQUEsWUFDRHRCLFFBQVE7QUFBQSxjQUNONXhCLE1BQU03QyxFQUFFLCtCQUErQjtBQUFBLGNBQ3ZDLE1BQU02MEIsUUFBUTtBQUNaNWtCLGdCQUFBQSxFQUFlcFgsTUFBTTA0QjtjQUN2QjtBQUFBLFlBQ0Q7QUFBQSxZQUNEbUQsSUFBSTtBQUFBLGNBQ0ZsNEIsTUFBTTtBQUFBLGNBQ05xRyxNQUFNN0MsRUFBRSwyQkFBMkI7QUFBQSxjQUNuQyxNQUFNNjBCLFFBQVE7QUFDWixzQkFBTW1oQyxHQUFJO0FBQUEsY0FDWjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0YsR0FDQTtBQUFBLFFBQ0VocEMsU0FBU25lLEVBQU1pbkQ7QUFBQUEsTUFDakIsQ0FDRjtBQUNBN2xELGFBQUFBLEVBQWVwWCxNQUFNNjRCLEtBQUtra0MsQ0FBYyxHQUV4QyxNQUFNdGlELEdBQVEsR0FDZCxNQUFNdEcsRUFBVytHLGFBQ1ZwUjtBQUFBQSxPQUdIc3pELElBQXVCOStELEVBQVMsT0FDN0I7QUFBQSxNQUNMLEdBQUcwWCxFQUFNcW5EO0FBQUFBLE1BRVosR0FFS0MsSUFBaUJoL0QsRUFBUyxNQUFNO0FBQ3BDLFlBQU1pL0QsSUFBWSxZQUFZaC9ELEVBQUd3TCxPQUFPMm1CLFVBQVU7QUFFbEQsVUFBSTF3QixJQUFRZ1csRUFBTTBhO0FBQ2xCLGFBQUkxYSxFQUFNdW1ELGNBQWMsWUFBWXZtRCxFQUFNMGEsZUFDcEMxYSxFQUFNc21ELFdBQ1J0OEQsSUFBUWdXLEVBQU0wYSxXQUFXdnVCLElBQUtSLENBQUFBLE1BQ3JCcVUsRUFBTXRHLEtBQUs4TyxTQUFTN2MsQ0FBSSxDQUNoQyxJQUVEM0IsSUFBUWdXLEVBQU10RyxLQUFLOE8sU0FBU3hJLEVBQU0wYSxVQUFVLElBR3pDO0FBQUEsUUFDTCxDQUFDbnlCLEVBQUd3TCxPQUFPMm1CLFVBQVUsR0FBRzF3QjtBQUFBQSxRQUN4QixDQUFDdTlELENBQVMsR0FBSXY5RCxDQUFBQSxNQUFlO0FBQzNCNndCLFVBQUFBLEVBQU0scUJBQXFCN3dCLENBQUs7QUFBQSxRQUNqQztBQUFBLFFBQ0QsQ0FBQ3pCLEVBQUd3TCxPQUFPeXpELFNBQVMsR0FBRztBQUFBLFFBQ3ZCLEdBQUdqL0QsRUFBR3dMLE9BQU8wekQsa0JBQWtCem5ELEVBQU1zbUQsUUFBUTtBQUFBLFFBQzdDcC9CLE1BQU07QUFBQSxRQUNOLEdBQUdsbkIsRUFBTWpNO0FBQUFBO0lBRWIsQ0FBQztBQVVEOEUsSUFBQUEsR0FDRSxNQUNTbUgsRUFBTTBhLFlBRWYsT0FBTzF3QixNQUFVO0FBQ2YsTUFBSUEsTUFBVXdhLEVBQWdCeGEsVUFHOUJxOEQsRUFBaUJyOEQsQ0FBSyxHQUN0QixNQUFNeWEsR0FBUSxHQUNkLE1BQU16RSxFQUFNdEcsS0FBS2d1RCxlQUFlbGpELEVBQWdCeGEsS0FBSztBQUFBLElBRXZELENBQ0Y7QUFDQSxVQUFNd2EsSUFBOEJwVSxFQUFJLENBQUEsQ0FBRTtBQUUxQyxhQUFTaVUsSUFBWTtBQUNuQixhQUFPckUsRUFBTXdDLFVBQVV2QyxFQUFZalcsTUFBTTRDLE1BQU00VixVQUFVO0FBQUEsSUFDM0Q7QUFDQSxVQUFNbWxELElBQWF2M0QsRUFBSSxFQUFLO0FBRTVCLGFBQVN3MkQsSUFBeUI7O0FBQ2hDLFVBQUl0aUQsSUFBVS9iLEVBQUdxRTtBQUNqQixRQUFJcVQsS0FBQUEsS0FBQUEsRUFBWWpXLFVBQVppVyxnQkFBQUEsR0FBbUJyVCxVQUFuQnFULGdCQUFBQSxFQUEwQjY0QixrQkFBaUIsU0FDN0N4MEIsSUFBVS9iLEVBQUd3d0M7QUFFZixVQUFJNnVCLElBQW1CdGpELEVBQVF1akQsMEJBQTBCO0FBQUEsUUFDdkRDLFdBQVc5bkQsRUFBTThuRDtBQUFBQSxRQUNqQkMsa0JBQWtCO0FBQUEsUUFDbEIxakQsV0FBQUE7QUFBQUEsUUFDQTJqRCxjQUFjO0FBQ1osaUJBQU8vbkQsRUFBWWpXLE1BQU04VztBQUFBQSxRQUMxQjtBQUFBLFFBQ0QvSCxZQUFZQTtBQUFBQSxRQUNadXRELFVBQVV0bUQsRUFBTXNtRDtBQUFBQSxRQUNoQjloRCxpQkFBQUE7QUFBQUEsUUFDQXlqRCx1QkFBdUIsT0FBTzFqRCxPQUFZO0FBQ3hDQyxVQUFBQSxFQUFnQnhhLFFBQVEsQ0FBQyxHQUFHdWEsRUFBTyxHQUNuQyxNQUFNRSxHQUFRLEdBQ2QsTUFBTXpFLEVBQU10RyxLQUFLZ3VELGVBQWVsakQsRUFBZ0J4YSxLQUFLO0FBQUEsUUFJdkQ7QUFBQSxNQUNGLENBQUM7QUFvQkQsYUFBTzhGLEVBbkJhO0FBQUEsUUFDbEJsRCxPQUFPO0FBQUEsVUFDTCxNQUFNczdELGNBQWM7QUFDbEIsZ0JBQUk1akQsRUFBUTZqRCxpQkFBaUI7QUFDM0JSLGNBQUFBLEVBQVczOUQsUUFBUSxJQUNuQixNQUFNeWEsR0FBUSxHQUNkLE1BQU1BLEdBQVE7QUFDZCxvQkFBTWdCLEtBQWV0SCxFQUFXaXFEO0FBQ2hDOWpELGNBQUFBLEVBQVE2akQsZ0JBQWdCO0FBQUEsZ0JBQ3RCOWpELFdBQUFBO0FBQUFBLGdCQUNBaWlELFVBQVV0bUQsRUFBTXNtRDtBQUFBQSxnQkFDaEIvakQsVUFBVWtEO0FBQUFBLGdCQUNWakIsaUJBQUFBO0FBQUFBLGNBQ0YsQ0FBQyxHQUNEbWpELEVBQVczOUQsUUFBUTtBQUFBLFlBQ3JCO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxTQUV3QjQ5RCxHQUFrQjVuRCxFQUFNMm1ELG1CQUFtQjtBQUFBLElBQ3ZFO0FBRUEsVUFBTTtBQUFBLE1BQUU3MkQsT0FBQUE7QUFBQUEsSUFBTyxJQUFHK0csR0FBUTtBQW1CMUIsbUJBQWVzd0QsS0FBTzs7QUFDcEIsVUFBSW5uRCxFQUFNdEcsS0FBS3VnQjtBQUNiO0FBRUYsVUFBSWp3QixJQUFRLE1BQ1JxdEMsSUFBTztBQUNYLFFBQUk3eUIsS0FBQUEsRUFBZ0J4YSxVQUFoQndhLGdCQUFBQSxHQUF1QmsxQixVQUFTLE1BQ2xDMXZDLElBQVEsQ0FBQyxHQUFHd2EsRUFBZ0J4YSxLQUFLLEdBRWpDcXRDLElBQU9ydEMsRUFBTW1DLElBQUtSLENBQUFBLE1BQ1RxVSxFQUFNdEcsS0FBSzJ1RCxXQUFZLEVBQUMxOEQsQ0FBSSxDQUNwQyxHQUNHcVUsRUFBTXVtRCxjQUFjLGFBQ3RCdjhELElBQVFxdEMsSUFHTnIzQixFQUFNc21ELGFBQWEsTUFBUXQ4RCxFQUFNMHZDLFNBQVMsTUFDNUMxdkMsSUFBUUEsRUFBTSxDQUFDLE1BSWYsQ0FBQ2dXLEVBQU1nbkQsWUFBWWhuRCxFQUFNc29ELHFCQUUzQnp0QyxFQUFNLHFCQUFxQjd3QixDQUFLLEdBQ2hDNndCLEVBQU0sVUFBVTd3QixDQUFLLEdBQ3JCNndCLEVBQU0sbUJBQW1Cd2MsQ0FBSTtBQUUvQixVQUFJOWpDLElBQVE7QUFBQSxRQUNWdkosT0FBQUE7QUFBQUEsUUFDQXF0QyxNQUFBQTtBQUFBQSxRQUNBN3lCLGlCQUFpQkEsRUFBZ0J4YTtBQUFBQTtBQUVuQzZ3QixNQUFBQSxFQUFNLGdCQUFnQnRuQixDQUFLLEdBQzNCLE1BQU1rUixHQUFRLEdBQ2QsTUFBTXJELEVBQWVwWCxNQUFNMDRCLFNBQ0R5akMsRUFBV244RCxPQUNyQzZ3QixFQUFNLGlCQUFpQnRuQixDQUFLO0FBQUEsSUFDOUI7QUFFQSxVQUFNdXpELElBQWtCQSxPQUNmO0FBQUEsTUFDTHlCLFFBQVFwQztBQUFBQSxNQUNSdGpDLE1BQU00akM7QUFBQUEsTUFDTmppRCxpQkFBQUE7QUFBQUEsTUFDQXloRCxlQUFBQTtBQUFBQSxNQUNBQyxpQkFBQUE7QUFBQUEsTUFDQWxsRCxTQUFBQTtBQUFBQSxNQUNBZixhQUFBQTtBQUFBQSxNQUNBOUIsWUFBQUE7QUFBQUEsUUFJRTBzQixJQUFXejZCLEVBQUkwMkQsRUFBZSxDQUFFO0FBQ3RDeGxDLFdBQUFBLEVBQWF1SixFQUFTN2dDLEtBQUs7O0FBaGV6QixhQUFBeUwsRUFBQSxHQUFBQyxFQXlDTSxPQXpDTlgsSUF5Q00sR0F4Q2FrakIsS0FBQUEsUUFBQUEsRUFBT2xCLFlBQU8sQ0FBS2l3QyxFQUFRQSxZQUMxQ3Z4RCxFQUFBLEdBQUF1Z0IsRUFRRXd5QyxHQVJGNXdDLEVBUUU7QUFBQTtpQkFQSTtBQUFBLFFBQUp4bkIsS0FBSTYxRDtBQUFBQSxTQUNJcUIsRUFBY3Q5RCxPQUFBO0FBQUEsUUFDckI2NEIsTUFBTTtBQUFBLFFBQ05ya0IsVUFBVUEsRUFBUUE7QUFBQUEsUUFDbEJ3OEIsVUFBVUEsRUFBUUE7QUFBQUEsUUFDbEJ0aEMsTUFBTUEsRUFBSUE7QUFBQUEsUUFDVnFzQixTQUFPMGdDO0FBQUFBLHFFQUdaN3dDLEdBQStCemdCLDJCQUFqQjAxQixFQUFRN2dDLEtBQUEsQ0FBQSxDQUFBLElBQ3RCeUwsRUFBQSxHQUFBdWdCLEVBMkJZTyxFQTNCSTRELEVBQUE1eEIsQ0FBQSxFQUFHeXNDLFNBQVN5ekIscUJBQXFCLEdBQUEsTUFBQTtBQUFBLG1CQUMvQyxNQW1Ca0IsQ0FuQmxCNXRELEVBbUJrQjZ0RCxJQW5CbEI5d0MsRUFtQmtCO0FBQUEsbUJBbkJHO0FBQUEsVUFBSnhuQixLQUFJZ1I7QUFBQUEsV0FBeUJvbEQsRUFBa0J4OEQsT0FBQTtBQUFBLFVBQUcyNEIsVUFBUXlqQztBQUFBQSxVQUFVOWlDLFFBQU1BO0FBQUFBO1VBQzlFLG1CQUNULE1BZU0sQ0FmSzZpQyxFQUFBbjhELFNBQWMyK0QsRUFBY0EsbUJBQUEsV0FBdkNqekQsRUFlTSxPQUFBO0FBQUE7WUFmOEN1dEM7O3NCQUFnQzdHLEVBQU1BLFVBQUE7QUFBQSxhQUFBO0FBQUEsY0FDeEZ2aEMsRUFhVSt0RCxHQWJWaHhDLEVBYVU7QUFBQSxxQkFiRztBQUFBLFlBQUp4bkIsS0FBSTRRO0FBQUFBLGFBQWtCbVosRUFBV2xhLENBQUEsQ0FBQSxHQUFBO0FBQUEsWUFDN0IsZ0JBQ1QsTUFTTSxDQVRLNG9ELEVBQUFBLHVCQUEwQjdCLEVBQVFBLFlBQTdDdnhELEtBQUFDLEVBU00sT0FUTlYsSUFTTSxvQkFUeUUsV0FFN0UsRUFBQSxJQUFBNkYsRUFNb0JpdUQsSUFOcEJseEMsRUFNb0I7QUFBQSx1QkFMZDtBQUFBLGNBQUp4bkIsS0FBSTgxRDtBQUFBQSwwQkFDSzFoRCxFQUFleGE7QUFBQUEsNkRBQWZ3YSxFQUFleGEsUUFBQXd3QjtBQUFBQSxjQUN2QjlnQixNQUFNQSxFQUFJQTtBQUFBQSxjQUNWcXZELFVBQVU7QUFBQSxlQUNIM0IsRUFBb0JwOUQsS0FBQSxHQUFBLE1BQUEsSUFBQSxDQUFBLGNBQUEsTUFBQSxDQUFBLENBQUE7Ozs7Ozs7Ozs7c0VDekJuQit2QixLQUFBQyxHQUF5QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXBELE1BQU07QUFDUixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQTBCRCxVQUFNaGEsSUFBUW1oQixHQXlCUnBHLElBQU9vakI7QUFPYixhQUFTajVCLElBQVk7O0FBQ25CLE1BQUE2VixFQUFLLFNBQVMsSUFDZGh5QixJQUFBaVgsRUFBTSxTQUFOLFFBQUFqWCxFQUFZO0FBQUEsSUFDZDtBQUVBLGFBQVNpZ0UsRUFBU2gvRCxHQUFZO0FBQzVCLE1BQUErd0IsRUFBSyxxQkFBcUIvd0IsQ0FBSztBQUFBLElBQ2pDOzs7QUE5REUsYUFBQXlMLEVBQUEsR0FBQUMsRUFtQk0sT0FuQk5YLElBbUJNO0FBQUEsUUFsQkphLEdBRU0sT0FGTlosSUFFTTtBQUFBLFVBREo2RixFQUErRzJ0RCxHQUEvRzV3QyxFQUErRztBQUFBLFlBQTlGLE9BQU84QyxFQUFVO0FBQUEsWUFBRyxNQUFNaGhCLEVBQUk7QUFBQSxVQUFVdXZELEdBQUFBLEVBQVUsWUFBQSxFQUFHLGtCQUFjRCxFQUFBLENBQVEsR0FBQSxNQUFBLElBQUEsQ0FBQSxTQUFBLE1BQUEsQ0FBQTtBQUFBLFFBQUE7UUFHOUZudUQsRUFha0JxdUQsR0FibEJ0eEMsRUFha0I7QUFBQSxVQVpoQixPQUFNO0FBQUEsVUFDTCxlQUFhOEMsRUFBVTtBQUFBLFVBQ3ZCLE1BQU1oaEIsRUFBSTtBQUFBLFVBQ1Ysb0JBQWtCO0FBQUEsVUFDbkIsUUFBTztBQUFBLFFBQUEsR0FDQ3l2RCxFQUFXLGFBQUE7QUFBQSxVQUNsQix1QkFBb0JIO0FBQUEsVUFDcEIsZ0JBQWU5akQ7QUFBQSxRQUFBO1VBRUwsU0FBTytRLEVBQ2hCLENBQTBHMWlCLE1BRG5GO0FBQUEsWUFDdkJzSCxFQUEwRzh3QixHQUExRy9ULEVBQTBHO0FBQUEsY0FBL0YsTUFBSztBQUFBLGNBQVUsTUFBSztBQUFBLFlBQUEsR0FBbUM3bUIsRUFBTSxRQUFBO0FBQUEsY0FBRyxTQUFPd0MsRUFBTTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OENDWDFGLEVBQUUsZ0JBQUFrZ0IsR0FBYyxJQUFLYyxNQUlkNjBDLEtBQVc7QUFBQSxFQUN0QixRQUFRcCtELEdBQVVDLElBQTBCLElBQUU7QUFDNUMsSUFBSUEsRUFBUSxNQUNBekMsR0FBQSxJQUFJeUMsRUFBUSxFQUFFO0FBRXBCLFVBQUEsRUFBRSxPQUFBNkUsTUFBVStHO0FBQ2xCLElBQUk1TCxFQUFRLGtCQUNWaEQsR0FBbUIsZ0JBQWdCZ0QsRUFBUSxnQkFFekNBLEVBQVEsZUFDVndvQixHQUFleG9CLEVBQVEsV0FBVyxHQUdoQ0EsRUFBUSxRQUNMNEcsR0FBQSxXQUFXNUcsRUFBUSxJQUFJO0FBR3hCLFVBQUFvK0QsSUFBbUJwK0QsRUFBUSxvQkFBb0I7QUFDckQsZUFBV1csS0FBT0UsSUFBWTtBQUU1QixZQUFNdzlELElBQU1ELEVBQWlCejlELENBQUcsS0FBS0UsR0FBV0YsQ0FBRztBQUMvQyxNQUFBWixFQUFBLFVBQVVZLEdBQUswOUQsQ0FBRztBQUFBLElBQ3ZCO0FBRUQsSUFBQWhxRCxHQUFjLFdBQVd0VSxFQUFJLFVBRTdCbVAsR0FBTSxRQUFPLEdBRWJuUCxFQUFJLE9BQU8saUJBQWlCLFFBQVF4QyxHQUFVLElBQUcsR0FFM0NzSCxFQUFBd2xCLEdBQWEsUUFBUXJxQixFQUFRLE1BQU0sR0FDekNzK0QsR0FBbUJ0K0QsRUFBUSxNQUFNO0FBQUEsRUFDbkM7O0FBR0YsU0FBU3MrRCxHQUFtQjMvRCxHQUFxQjs7QUFDM0MsSUFBQWIsSUFBQWEsS0FBQSxnQkFBQUEsRUFBUSxRQUFSLGdCQUFBYixFQUFhLGtCQUFpQixNQUNoQyxRQUFRLEtBQ047QUFBQSx5RUFDbUU7QUFHekU7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzE4LDIwLDIxLDIyLDQ0LDgyLDk3LDk4XX0=
|