@whoj/box-vue
Version:
Box Ui Elements as Vue (2 & 3) Component
342 lines • 54.2 kB
JavaScript
/**
* @module @whoj/box-vue
* @version 1.0.0-beta.8
* @copyright 2023 Jonson B. All rights reserved.
*/
'use strict';
const utils = require('@whoj/utils');
const vueDemi = require('vue-demi');
const core = require('@vueuse/core');
const vue = require('@unhead/vue');
const vue$1 = require('vue');
function useCdn(boxEl, {
cdn,
style,
onload,
version,
disposeOnUnmount = true
}) {
version = version || (boxEl === "preview" ? "2.91.0" : "17.0.0");
const element = boxEl === "preview" ? "preview" : "elements";
const {
css,
js
} = cdn || {
css: `https://cdn01.boxcdn.net/platform/${element}/${version}/en-US/${boxEl}.css`,
js: `https://cdn01.boxcdn.net/platform/${element}/${version}/en-US/${boxEl}.js`
};
const loaded = vueDemi.ref(false);
const head = vue.useHead({
link: [{
href: css,
rel: "stylesheet",
key: `whoj-box-vue__${boxEl}-css`
}],
script: [{
src: js,
fetchpriority: "high",
type: "text/javascript",
key: `whoj-box-vue__${boxEl}-js`,
onload(e) {
loaded.value = true;
utils.isDef(onload) && onload(e);
}
}],
style: style ? [{
innerHTML: vueDemi.unref(style),
key: `whoj-box-vue__${boxEl}-style`
}] : void 0
});
core.tryOnUnmounted(() => {
if (disposeOnUnmount) {
head.dispose();
}
});
const newBoxEl = () => {
if (!loaded.value) {
return void 0;
}
return new (utils.getProperty(utils.getGlobal().Box, BoxUiElements[boxEl]))();
};
return {
head,
loaded,
newBoxEl
};
}
let _counter = 0;
class BoxElementFactory {
constructor(name) {
this.name = name;
}
props = {
/**
* File/Folder ID depending on the Element you're using
*/
modelValue: {
type: String,
required: true
},
/**
* Auth Access Token to use for request
*/
accessToken: {
type: String,
required: true
},
/**
* Custom CDN links to use for specific element/component
*/
cdn: {
type: Object,
required: false
},
/**
* Options
*/
options: {
type: null,
default: () => ({})
},
/**
* Version of box-ui-elements to use.
* It will have no effect when using custom cdn links
*/
version: {
type: String,
required: false
},
/**
* Whether to dispose the Head on unmount
*/
height: {
type: String,
default: "350px"
},
/**
* Whether to dispose the Head on unmount
*/
disposeOnUnmount: {
type: Boolean,
default: true
},
/**
* Whether to render the component immediately after load
*/
immediate: {
type: Boolean,
default: true
},
/**
* Whether to dispose the Head on unmount
*/
show: {
type: Boolean,
default: true
}
};
create(name, events) {
return vueDemi.defineComponent({
name: this.name,
props: this.props,
emits: events,
expose: ["instance"],
setup(props, {
attrs,
emit,
expose
}) {
const fid = core.useVModel(props, "modelValue", emit);
const id = attrs.id || `box__${name}__wrapper${++_counter}`;
const {
getInstance,
instance,
loaded
} = useBoxElement(
fid,
props.accessToken,
// @ts-ignore
{
...props.options || {},
cdn: props.cdn,
el: name,
disposeOnUnmount: props.disposeOnUnmount,
immediate: props.immediate,
container: `#${id}`,
version: props.version,
style: `.box-ui-element-wrapper > :first-child { height: ${props.height}; }`,
listeners: utils.objectKeys(events).filter((name2) => !["update:model-value"].includes(name2)).reduce((evt, name2) => ({
...evt,
[name2]: (args) => {
emit(name2, args);
}
}), {})
}
);
expose({
instance: vueDemi.readonly(instance.value)
});
vueDemi.watchEffect(() => {
if (loaded && getInstance()?.show) {
emit("initiated", getInstance());
try {
if (fid.value?.length) {
getInstance().show(fid.value, props.accessToken, {
...props.options,
container: `#${id}`
});
} else {
getInstance().hide();
}
} catch (e) {
}
}
});
return () => vue$1.createVNode("div", vue$1.mergeProps(attrs, {
"id": id,
"className": "box-ui-element-wrapper"
}), null);
}
});
}
}
function GenericBoxElement(name, events) {
const _events = {
...events,
"initiated": (args) => true,
"update:model-value": (args) => true
};
const component = new BoxElementFactory(utils.template("Box{0}", BoxUiElements[name]));
return component.create(name, _events);
}
var BoxUiElements = /* @__PURE__ */ ((BoxUiElements2) => {
BoxUiElements2["explorer"] = "ContentExplorer";
BoxUiElements2["picker"] = "FilePicker";
BoxUiElements2["preview"] = "Preview";
BoxUiElements2["sidebar"] = "ContentSidebar";
BoxUiElements2["uploader"] = "ContentUploader";
return BoxUiElements2;
})(BoxUiElements || {});
function useBoxElement(id, accessToken, {
cdn,
disposeOnUnmount,
el,
immediate = true,
listeners,
onload,
version,
style,
...options
}) {
const instance = vueDemi.ref();
const getInstance = () => instance.value;
const {
loaded,
newBoxEl
} = useCdn(el, {
cdn,
style,
version,
onload,
disposeOnUnmount
});
core.whenever(() => loaded.value, () => {
if (!getInstance() || !utils.hasProperty(getInstance(), "addListener")) {
instance.value = newBoxEl();
}
if (listeners) {
utils.objectEntries(listeners).forEach(([event, listener]) => {
getInstance().addListener(event, listener);
});
}
if (immediate) {
getInstance().show(utils.unrefOf(id), utils.unrefOf(accessToken), options || {});
}
});
return {
loaded,
instance,
newBoxEl,
getInstance
};
}
const EXPLORER_EVENTS = {
select: (payload) => utils.isArray(payload),
rename: (payload) => utils.isDef(payload),
preview: (payload) => utils.isDef(payload),
download: (payload) => utils.isArray(payload),
delete: (payload) => utils.isArray(payload),
upload: (payload) => utils.isArray(payload),
navigate: (payload) => utils.isDef(payload),
create: (payload) => utils.isDef(payload)
};
function useBoxContentExplorer(fileId, accessToken, options) {
return useBoxElement(fileId, accessToken, {
disposeOnUnmount: true,
...options || {},
el: "explorer"
});
}
const BoxContentExplorer = /* @__PURE__ */ GenericBoxElement("explorer", EXPLORER_EVENTS);
const PREVIEW_EVENTS = {
viewer: (args) => utils.isDef(args),
load: (args) => utils.isDef(args),
navigate: (args) => utils.isDef(args),
notification: (args) => utils.isDef(args),
viewerevent: (args) => utils.isDef(args)
};
function useBoxPreview(fileId, accessToken, options) {
return useBoxElement(fileId, accessToken, {
disposeOnUnmount: true,
...options || {},
el: "preview"
});
}
const BoxPreview = /* @__PURE__ */ GenericBoxElement("preview", PREVIEW_EVENTS);
const PICKER_EVENTS = {
choose: (args) => utils.isDef(args),
cancel: () => true
};
function useBoxFilePicker(fileId, accessToken, options) {
return useBoxElement(fileId, accessToken, {
disposeOnUnmount: true,
...options || {},
el: "picker"
});
}
const BoxFilePicker = /* @__PURE__ */ GenericBoxElement("picker", PICKER_EVENTS);
const SIDEBAR_EVENTS = {};
function useBoxContentSidebar(fileId, accessToken, options) {
return useBoxElement(fileId, accessToken, {
disposeOnUnmount: true,
...options || {},
el: "sidebar"
});
}
const BoxContentSidebar = /* @__PURE__ */ GenericBoxElement("sidebar", SIDEBAR_EVENTS);
const UPLOADER_EVENTS = {
close: () => true,
complete: (payload) => utils.isArray(payload),
error: (args) => utils.isDef(args),
upload: (payload) => utils.isDef(payload)
};
function useBoxContentUploader(fileId, accessToken, options) {
return useBoxElement(fileId, accessToken, {
disposeOnUnmount: true,
...options || {},
el: "uploader"
});
}
const BoxContentUploader = /* @__PURE__ */ GenericBoxElement("uploader", UPLOADER_EVENTS);
exports.BoxContentExplorer = BoxContentExplorer;
exports.BoxContentSidebar = BoxContentSidebar;
exports.BoxContentUploader = BoxContentUploader;
exports.BoxFilePicker = BoxFilePicker;
exports.BoxPreview = BoxPreview;
exports.useBoxContentExplorer = useBoxContentExplorer;
exports.useBoxContentSidebar = useBoxContentSidebar;
exports.useBoxContentUploader = useBoxContentUploader;
exports.useBoxFilePicker = useBoxFilePicker;
exports.useBoxPreview = useBoxPreview;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29tcG9uZW50cy91aS1lbGVtZW50cy9jZG4udHMiLCIuLi9zcmMvY29tcG9uZW50cy91aS1lbGVtZW50cy9ib3gtZWxlbWVudC50c3giLCIuLi9zcmMvY29tcG9uZW50cy91aS1lbGVtZW50cy91c2VCb3hFbGVtZW50LnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvdWktZWxlbWVudHMvZXhwbG9yZXIudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvdWktZWxlbWVudHMvcHJldmlldy50c3giLCIuLi9zcmMvY29tcG9uZW50cy91aS1lbGVtZW50cy9waWNrZXIudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvdWktZWxlbWVudHMvc2lkZWJhci50c3giLCIuLi9zcmMvY29tcG9uZW50cy91aS1lbGVtZW50cy91cGxvYWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUtZGVtaSc7XG5pbXBvcnQgeyB1c2VIZWFkIH0gZnJvbSAnQHVuaGVhZC92dWUnO1xuaW1wb3J0IHsgcmVmLCB1bnJlZiB9IGZyb20gJ3Z1ZS1kZW1pJztcbmltcG9ydCB7IHRyeU9uVW5tb3VudGVkIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJztcbmltcG9ydCB7IGdldEdsb2JhbCwgZ2V0UHJvcGVydHksIGlzRGVmIH0gZnJvbSAnQHdob2ovdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciwgRnVuYywgTWF5YmVSZWYgfSBmcm9tICdAd2hvai91dGlscyc7XG5cbmltcG9ydCB0eXBlIHsgQ2RuT3B0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQm94VWlFbGVtZW50cyB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQ2RuT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDdXN0b20gQ0ROIGxpbmtzIHRvIHVzZSBmb3Igc3BlY2lmaWMgZWxlbWVudC9jb21wb25lbnRcbiAgICovXG4gIGNkbj86IENkbk9wdGlvbjtcblxuICAvKipcbiAgICogVmVyc2lvbiBvZiBib3gtdWktZWxlbWVudHMgdG8gdXNlLlxuICAgKiBJdCB3aWxsIGhhdmUgbm8gZWZmZWN0IHdoZW4gdXNpbmcgY3VzdG9tIGNkbiBsaW5rc1xuICAgKi9cbiAgdmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBkaXNwb3NlIHRoZSBIZWFkIG9uIHVubW91bnRcbiAgICovXG4gIGRpc3Bvc2VPblVubW91bnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTY3JpcHQgb25sb2FkIGhhbmRsZXJcbiAgICovXG4gIG9ubG9hZD86IEZ1bmM8RXZlbnQsIHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDc3MgQ29kZSBhcyBzdHJpbmdcbiAgICovXG4gIHN0eWxlPzogTWF5YmVSZWY8c3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFVzZUNkblJldHVybjxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PiB7XG4gIGhlYWQ6IEV4Y2x1ZGU8UmV0dXJuVHlwZTx0eXBlb2YgdXNlSGVhZD4sIHZvaWQ+O1xuICBsb2FkZWQ6IFJlZjxib29sZWFuPjtcbiAgbmV3Qm94RWwoKTogVCB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNkbjxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PihcbiAgYm94RWw6IGtleW9mIHR5cGVvZiBCb3hVaUVsZW1lbnRzLFxuICB7IGNkbiwgc3R5bGUsIG9ubG9hZCwgdmVyc2lvbiwgZGlzcG9zZU9uVW5tb3VudCA9IHRydWUgfTogVXNlQ2RuT3B0aW9uc1xuKTogVXNlQ2RuUmV0dXJuPFQ+IHtcbiAgdmVyc2lvbiA9IHZlcnNpb24gfHwgKGJveEVsID09PSAncHJldmlldycgPyAnMi45MS4wJyA6ICcxNy4wLjAnKTtcbiAgY29uc3QgZWxlbWVudCA9IGJveEVsID09PSAncHJldmlldycgPyAncHJldmlldycgOiAnZWxlbWVudHMnO1xuXG4gIGNvbnN0IHsgY3NzLCBqcyB9ID0gY2RuIHx8IHtcbiAgICBjc3M6IGBodHRwczovL2NkbjAxLmJveGNkbi5uZXQvcGxhdGZvcm0vJHtlbGVtZW50fS8ke3ZlcnNpb259L2VuLVVTLyR7Ym94RWx9LmNzc2AsXG4gICAganM6IGBodHRwczovL2NkbjAxLmJveGNkbi5uZXQvcGxhdGZvcm0vJHtlbGVtZW50fS8ke3ZlcnNpb259L2VuLVVTLyR7Ym94RWx9LmpzYFxuICB9O1xuXG4gIGNvbnN0IGxvYWRlZCA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IGhlYWQgPSB1c2VIZWFkKHtcbiAgICBsaW5rOiBbXG4gICAgICB7XG4gICAgICAgIGhyZWY6IGNzcyxcbiAgICAgICAgcmVsOiAnc3R5bGVzaGVldCcsXG4gICAgICAgIGtleTogYHdob2otYm94LXZ1ZV9fJHtib3hFbH0tY3NzYFxuICAgICAgfVxuICAgIF0sXG4gICAgc2NyaXB0OiBbXG4gICAgICB7XG4gICAgICAgIHNyYzoganMsXG4gICAgICAgIGZldGNocHJpb3JpdHk6ICdoaWdoJyxcbiAgICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcsXG4gICAgICAgIGtleTogYHdob2otYm94LXZ1ZV9fJHtib3hFbH0tanNgLFxuICAgICAgICBvbmxvYWQoZSkge1xuICAgICAgICAgIGxvYWRlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgaXNEZWYob25sb2FkKSAmJiBvbmxvYWQoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdLFxuICAgIHN0eWxlOiBzdHlsZVxuICAgICAgPyBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5uZXJIVE1MOiB1bnJlZihzdHlsZSksXG4gICAgICAgICAgICBrZXk6IGB3aG9qLWJveC12dWVfXyR7Ym94RWx9LXN0eWxlYFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgOiB1bmRlZmluZWRcbiAgfSkgYXMgVXNlQ2RuUmV0dXJuWydoZWFkJ107XG5cbiAgdHJ5T25Vbm1vdW50ZWQoKCkgPT4ge1xuICAgIGlmIChkaXNwb3NlT25Vbm1vdW50KSB7XG4gICAgICBoZWFkLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5ld0JveEVsID0gKCkgPT4ge1xuICAgIGlmICghbG9hZGVkLnZhbHVlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IChnZXRQcm9wZXJ0eShnZXRHbG9iYWwoKS5Cb3gsIEJveFVpRWxlbWVudHNbYm94RWxdKSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFQ+KSgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgaGVhZCxcbiAgICBsb2FkZWQsXG4gICAgbmV3Qm94RWxcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50T3B0aW9uc01peGluLFxuICBPYmplY3RFbWl0c09wdGlvbnMsXG4gIFByb3BUeXBlXG59IGZyb20gJ3Z1ZS1kZW1pJztcbmltcG9ydCB7IHVzZVZNb2RlbCB9IGZyb20gJ0B2dWV1c2UvY29yZSc7XG5pbXBvcnQgeyBvYmplY3RLZXlzLCB0ZW1wbGF0ZSB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgcmVhZG9ubHksIHdhdGNoRWZmZWN0IH0gZnJvbSAndnVlLWRlbWknO1xuXG5pbXBvcnQgeyBCb3hVaUVsZW1lbnRzLCB1c2VCb3hFbGVtZW50IH0gZnJvbSAnLi91c2VCb3hFbGVtZW50JztcbmltcG9ydCB0eXBlIHsgQm94VWlFbGVtZW50TmFtZSB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgdHlwZSB7IEJhc2VFbCwgQ2RuT3B0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5sZXQgX2NvdW50ZXIgPSAwO1xuXG4vKipcbiAqIEBjbGFzcyBCb3hFbGVtZW50RmFjdG9yeVxuICovXG5jbGFzcyBCb3hFbGVtZW50RmFjdG9yeTxFbCBleHRlbmRzIEJhc2VFbDxPcHQsIEV2dD4sIE9wdCBleHRlbmRzIG9iamVjdCwgRXZ0IGV4dGVuZHMgT2JqZWN0RW1pdHNPcHRpb25zPiB7XG4gIHJlYWRvbmx5IHByb3BzID0ge1xuICAgIC8qKlxuICAgICAqIEZpbGUvRm9sZGVyIElEIGRlcGVuZGluZyBvbiB0aGUgRWxlbWVudCB5b3UncmUgdXNpbmdcbiAgICAgKi9cbiAgICBtb2RlbFZhbHVlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8c3RyaW5nIHwgbnVsbD4sXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBdXRoIEFjY2VzcyBUb2tlbiB0byB1c2UgZm9yIHJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NUb2tlbjoge1xuICAgICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPHN0cmluZz4sXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ0ROIGxpbmtzIHRvIHVzZSBmb3Igc3BlY2lmaWMgZWxlbWVudC9jb21wb25lbnRcbiAgICAgKi9cbiAgICBjZG46IHtcbiAgICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxDZG5PcHRpb24+LFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbnNcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7XG4gICAgICB0eXBlOiBudWxsIGFzIHVua25vd24gYXMgUHJvcFR5cGU8T3B0PixcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBvZiBib3gtdWktZWxlbWVudHMgdG8gdXNlLlxuICAgICAqIEl0IHdpbGwgaGF2ZSBubyBlZmZlY3Qgd2hlbiB1c2luZyBjdXN0b20gY2RuIGxpbmtzXG4gICAgICovXG4gICAgdmVyc2lvbjoge1xuICAgICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPHN0cmluZz4sXG4gICAgICByZXF1aXJlZDogZmFsc2VcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBkaXNwb3NlIHRoZSBIZWFkIG9uIHVubW91bnRcbiAgICAgKi9cbiAgICBoZWlnaHQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxDU1NTdHlsZURlY2xhcmF0aW9uWydoZWlnaHQnXT4sXG4gICAgICBkZWZhdWx0OiAnMzUwcHgnXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZGlzcG9zZSB0aGUgSGVhZCBvbiB1bm1vdW50XG4gICAgICovXG4gICAgZGlzcG9zZU9uVW5tb3VudDoge1xuICAgICAgdHlwZTogQm9vbGVhbiBhcyBQcm9wVHlwZTxib29sZWFuPixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byByZW5kZXIgdGhlIGNvbXBvbmVudCBpbW1lZGlhdGVseSBhZnRlciBsb2FkXG4gICAgICovXG4gICAgaW1tZWRpYXRlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuIGFzIFByb3BUeXBlPGJvb2xlYW4+LFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGRpc3Bvc2UgdGhlIEhlYWQgb24gdW5tb3VudFxuICAgICAqL1xuICAgIHNob3c6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4gYXMgUHJvcFR5cGU8Ym9vbGVhbj4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nKSB7fVxuXG4gIGNyZWF0ZTxVaU5hbWUgZXh0ZW5kcyBCb3hVaUVsZW1lbnROYW1lPihuYW1lOiBVaU5hbWUsIGV2ZW50czogRXZ0KSB7XG4gICAgdHlwZSBfUHJvcHMgPSB0eXBlb2YgdGhpcy5wcm9wcztcblxuICAgIHJldHVybiBkZWZpbmVDb21wb25lbnQ8X1Byb3BzLCB7IGluc3RhbmNlOiBSZWFkb25seTxFbD4gfSwgdW5rbm93biwge30sIHt9LCBDb21wb25lbnRPcHRpb25zTWl4aW4sIENvbXBvbmVudE9wdGlvbnNNaXhpbiwgRXZ0Pih7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBwcm9wczogdGhpcy5wcm9wcyxcbiAgICAgIGVtaXRzOiBldmVudHMsXG4gICAgICBleHBvc2U6IFsnaW5zdGFuY2UnXSxcbiAgICAgIHNldHVwKHByb3BzLCB7IGF0dHJzLCBlbWl0LCBleHBvc2UgfSkge1xuICAgICAgICBjb25zdCBmaWQgPSB1c2VWTW9kZWwocHJvcHMsICdtb2RlbFZhbHVlJywgZW1pdCk7XG5cbiAgICAgICAgY29uc3QgaWQgPSAoYXR0cnMuaWQgfHwgYGJveF9fJHtuYW1lfV9fd3JhcHBlciR7KytfY291bnRlcn1gKSBhcyBzdHJpbmc7XG5cbiAgICAgICAgY29uc3QgeyBnZXRJbnN0YW5jZSwgaW5zdGFuY2UsIGxvYWRlZCB9ID0gdXNlQm94RWxlbWVudDxFbCwgT3B0LCBFdnQ+KFxuICAgICAgICAgIGZpZCxcbiAgICAgICAgICBwcm9wcy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uKHByb3BzLm9wdGlvbnMgfHwge30pLFxuICAgICAgICAgICAgY2RuOiBwcm9wcy5jZG4sXG4gICAgICAgICAgICBlbDogbmFtZSxcbiAgICAgICAgICAgIGRpc3Bvc2VPblVubW91bnQ6IHByb3BzLmRpc3Bvc2VPblVubW91bnQsXG4gICAgICAgICAgICBpbW1lZGlhdGU6IHByb3BzLmltbWVkaWF0ZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcjogYCMke2lkfWAsXG4gICAgICAgICAgICB2ZXJzaW9uOiBwcm9wcy52ZXJzaW9uLFxuICAgICAgICAgICAgc3R5bGU6IGAuYm94LXVpLWVsZW1lbnQtd3JhcHBlciA+IDpmaXJzdC1jaGlsZCB7IGhlaWdodDogJHtwcm9wcy5oZWlnaHR9OyB9YCxcbiAgICAgICAgICAgIGxpc3RlbmVyczogb2JqZWN0S2V5cyhldmVudHMpXG4gICAgICAgICAgICAgIC5maWx0ZXIobmFtZSA9PiAhWyd1cGRhdGU6bW9kZWwtdmFsdWUnXS5pbmNsdWRlcyhuYW1lIGFzIHN0cmluZykpXG4gICAgICAgICAgICAgIC5yZWR1Y2UoKGV2dCwgbmFtZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5ldnQsXG4gICAgICAgICAgICAgICAgW25hbWVdOiAoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgIGVtaXQobmFtZSwgYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSwge30pXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGV4cG9zZSh7IGluc3RhbmNlOiByZWFkb25seShpbnN0YW5jZS52YWx1ZSkgfSk7XG5cbiAgICAgICAgd2F0Y2hFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgIGlmIChsb2FkZWQgJiYgZ2V0SW5zdGFuY2UoKT8uc2hvdykge1xuICAgICAgICAgICAgZW1pdCgnaW5pdGlhdGVkJywgZ2V0SW5zdGFuY2UoKSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoZmlkLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBnZXRJbnN0YW5jZSgpLnNob3coZmlkLnZhbHVlLCBwcm9wcy5hY2Nlc3NUb2tlbiwgeyAuLi5wcm9wcy5vcHRpb25zLCBjb250YWluZXI6IGAjJHtpZH1gIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBnZXRJbnN0YW5jZSgpLmhpZGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiAoPGRpdiB7IC4uLmF0dHJzIH0gaWQ9e2lkfSBjbGFzc05hbWU9XCJib3gtdWktZWxlbWVudC13cmFwcGVyXCI+PC9kaXY+KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gR2VuZXJpY0JveEVsZW1lbnQ8RWwgZXh0ZW5kcyBCYXNlRWw8T3B0LCBFdnQ+LCBPcHQgZXh0ZW5kcyBvYmplY3QsIEV2dCBleHRlbmRzIE9iamVjdEVtaXRzT3B0aW9ucywgVCBleHRlbmRzIEJveFVpRWxlbWVudE5hbWUgPSBCb3hVaUVsZW1lbnROYW1lPihcbiAgbmFtZTogVCxcbiAgLy8gdXNlRWxlbWVudDogdHlwZW9mIHVzZUJveEVsZW1lbnQ8RWwsIE9wdCwgRXZ0PixcbiAgZXZlbnRzOiBFdnRcbikge1xuICBjb25zdCBfZXZlbnRzID0ge1xuICAgIC4uLmV2ZW50cyxcbiAgICAnaW5pdGlhdGVkJzogKGFyZ3M6IEVsKSA9PiB0cnVlLFxuICAgICd1cGRhdGU6bW9kZWwtdmFsdWUnOiAoYXJnczogc3RyaW5nIHwgbnVsbCkgPT4gdHJ1ZVxuICB9O1xuXG4gIHR5cGUgX0V2ZW50cyA9IHR5cGVvZiBfZXZlbnRzICYgRXZ0O1xuXG4gIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBCb3hFbGVtZW50RmFjdG9yeTxFbCwgT3B0LCBfRXZlbnRzPih0ZW1wbGF0ZSgnQm94ezB9JywgQm94VWlFbGVtZW50c1tuYW1lXSkpO1xuXG4gIHJldHVybiBjb21wb25lbnQuY3JlYXRlKG5hbWUsIF9ldmVudHMpO1xufVxuIiwiaW1wb3J0IHsgcmVmIH0gZnJvbSAndnVlLWRlbWknO1xuaW1wb3J0IHsgd2hlbmV2ZXIgfSBmcm9tICdAdnVldXNlL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBNYXliZVJlZiB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgRnVuYyB9IGZyb20gJ0B3aG9qL3V0aWxzLXR5cGVzJztcbmltcG9ydCB7IGhhc1Byb3BlcnR5LCBvYmplY3RFbnRyaWVzLCB1bnJlZk9mIH0gZnJvbSAnQHdob2ovdXRpbHMnO1xuXG5pbXBvcnQgeyB1c2VDZG4gfSBmcm9tICcuL2Nkbic7XG5pbXBvcnQgdHlwZSB7IFVzZUNkbk9wdGlvbnMgfSBmcm9tICcuL2Nkbic7XG5pbXBvcnQgdHlwZSB7IEJhc2VFbCwgVW5PYmogfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmV4cG9ydCBlbnVtIEJveFVpRWxlbWVudHMge1xuICBleHBsb3JlciA9ICdDb250ZW50RXhwbG9yZXInLFxuICBwaWNrZXIgPSAnRmlsZVBpY2tlcicsXG4gIHByZXZpZXcgPSAnUHJldmlldycsXG4gIHNpZGViYXIgPSAnQ29udGVudFNpZGViYXInLFxuICB1cGxvYWRlciA9ICdDb250ZW50VXBsb2FkZXInXG59XG5cbmV4cG9ydCB0eXBlIEJveFVpRWxlbWVudE5hbWUgPSBrZXlvZiB0eXBlb2YgQm94VWlFbGVtZW50cztcbmV4cG9ydCB0eXBlIEdsb2JhbEJveFVpRWxlbWVudHMgPSBSZXZlcnNlTWFwPHR5cGVvZiBCb3hVaUVsZW1lbnRzPjtcblxuZXhwb3J0IHR5cGUgUmV2ZXJzZU1hcDxUIGV4dGVuZHMgUmVjb3JkPGtleW9mIFQsIGFueT4+ID0ge1xuICBbViBpbiBUW2tleW9mIFRdXToge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgViA/IEsgOiBuZXZlcjtcbiAgfVtrZXlvZiBUXTtcbn07XG5cbmV4cG9ydCB0eXBlIFVzZUJveEVsZW1lbnRzT3B0aW9uczxPcHQsIEUgZXh0ZW5kcyBvYmplY3QgPSBhbnk+ID0gT3B0ICYgVXNlQ2RuT3B0aW9ucyAmIHtcbiAgbGlzdGVuZXJzPzogRSxcbiAgaW1tZWRpYXRlPzogYm9vbGVhblxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUJveEVsZW1lbnQ8VCBleHRlbmRzIEJhc2VFbDxPcHQsIEU+LCBPcHQgZXh0ZW5kcyBVbk9iaiwgRSBleHRlbmRzIHsgW3A6IHN0cmluZ106IEZ1bmM8YW55LCB2b2lkPiB9PihcbiAgaWQ6IE1heWJlUmVmPHN0cmluZz4sXG4gIGFjY2Vzc1Rva2VuOiBNYXliZVJlZjxzdHJpbmc+LFxuICB7XG4gICAgY2RuLFxuICAgIGRpc3Bvc2VPblVubW91bnQsXG4gICAgZWwsXG4gICAgaW1tZWRpYXRlID0gdHJ1ZSxcbiAgICBsaXN0ZW5lcnMsXG4gICAgb25sb2FkLFxuICAgIHZlcnNpb24sXG4gICAgc3R5bGUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBVc2VCb3hFbGVtZW50c09wdGlvbnM8T3B0LCBFPiAmIHsgZWw6IGtleW9mIHR5cGVvZiBCb3hVaUVsZW1lbnRzIH1cbikge1xuICBjb25zdCBpbnN0YW5jZSA9IHJlZjxUPigpO1xuICBjb25zdCBnZXRJbnN0YW5jZSA9ICgpID0+IGluc3RhbmNlLnZhbHVlO1xuXG4gIGNvbnN0IHsgbG9hZGVkLCBuZXdCb3hFbCB9ID0gdXNlQ2RuPFQ+KGVsLCB7XG4gICAgY2RuLFxuICAgIHN0eWxlLFxuICAgIHZlcnNpb24sXG4gICAgb25sb2FkLFxuICAgIGRpc3Bvc2VPblVubW91bnRcbiAgfSk7XG5cbiAgd2hlbmV2ZXIoKCkgPT4gbG9hZGVkLnZhbHVlLCAoKSA9PiB7XG4gICAgaWYgKCFnZXRJbnN0YW5jZSgpIHx8ICFoYXNQcm9wZXJ0eShnZXRJbnN0YW5jZSgpLCAnYWRkTGlzdGVuZXInKSkge1xuICAgICAgaW5zdGFuY2UudmFsdWUgPSBuZXdCb3hFbCgpO1xuICAgIH1cblxuICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgIG9iamVjdEVudHJpZXM8RT4obGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBnZXRJbnN0YW5jZSgpIS5hZGRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIhKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgIGdldEluc3RhbmNlKCkhLnNob3codW5yZWZPZihpZCksIHVucmVmT2YoYWNjZXNzVG9rZW4pLCAob3B0aW9ucyB8fCB7fSkgYXMgdW5rbm93biBhcyBPcHQpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBsb2FkZWQsXG4gICAgaW5zdGFuY2UsXG4gICAgbmV3Qm94RWwsXG4gICAgZ2V0SW5zdGFuY2VcbiAgfTtcbn1cblxuZXhwb3J0ICogZnJvbSAnLi9ib3gtZWxlbWVudCc7XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBpc0RlZiB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgRnVuYywgTWF5YmVSZWYgfSBmcm9tICdAd2hvai91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFVzZUJveEVsZW1lbnRzT3B0aW9ucyB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgeyBHZW5lcmljQm94RWxlbWVudCwgdXNlQm94RWxlbWVudCB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgdHlwZSB7IEF4aW9zUmVxdWVzdENvbmZpZywgQXhpb3NSZXNwb25zZSB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCB0eXBlIHsgQmFzZUVsLCBCb3hVaU9wdGlvbnMsIEZpbGUsIEZvbGRlciwgTWFwVG9SZXR1cm5Wb2lkLCBNYXliZVByb21pc2UsIFdlYkxpbmsgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmNvbnN0IEVYUExPUkVSX0VWRU5UUyA9IHtcbiAgc2VsZWN0OiAocGF5bG9hZDogQXJyYXk8RmlsZSB8IEZvbGRlciB8IFdlYkxpbms+KSA9PiBpc0FycmF5KHBheWxvYWQpLFxuICByZW5hbWU6IChwYXlsb2FkOiBGaWxlIHwgRm9sZGVyIHwgV2ViTGluaykgPT4gaXNEZWYocGF5bG9hZCksXG4gIHByZXZpZXc6IChwYXlsb2FkOiBGaWxlKSA9PiBpc0RlZihwYXlsb2FkKSxcbiAgZG93bmxvYWQ6IChwYXlsb2FkOiBGaWxlW10pID0+IGlzQXJyYXkocGF5bG9hZCksXG4gIGRlbGV0ZTogKHBheWxvYWQ6IEZpbGVbXSkgPT4gaXNBcnJheShwYXlsb2FkKSxcbiAgdXBsb2FkOiAocGF5bG9hZDogRmlsZVtdKSA9PiBpc0FycmF5KHBheWxvYWQpLFxuICBuYXZpZ2F0ZTogKHBheWxvYWQ6IEZvbGRlcikgPT4gaXNEZWYocGF5bG9hZCksXG4gIGNyZWF0ZTogKHBheWxvYWQ6IEZvbGRlcikgPT4gaXNEZWYocGF5bG9hZClcbn07XG5cbmRlY2xhcmUgdHlwZSBFeHBsb3JlckV2ZW50cyA9IE1hcFRvUmV0dXJuVm9pZDx0eXBlb2YgRVhQTE9SRVJfRVZFTlRTPjtcblxuZXhwb3J0IGludGVyZmFjZSBFeHBsb3Jlck9wdGlvbnMgZXh0ZW5kcyBCb3hVaU9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdG8gdGhlIGNvbnRlbnQgZXhwbG9yZXIgdG8gZml0IHdpdGhpbiBhIHNtYWxsIG9yIGxhcmdlIHdpZHRoIGNvbnRhaW5lci5cbiAgICogSWYgYWJzZW50IHRoZSBVSSBFbGVtZW50IHdpbGwgYWRhcHQgdG8gaXRzIGNvbnRhaW5lclxuICAgKiBhbmQgYXV0b21hdGljYWxseSBzd2l0Y2ggYmV0d2VlbiBzbWFsbCB3aWR0aCBvciBsYXJnZSB3aWR0aCBtb2RlLlxuICAgKi9cbiAgc2l6ZT86ICdzbWFsbCcgfCAnbGFyZ2UnO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBzb3J0IGJ5IG9wdGlvbiBmb3IgdGhlIGNvbnRlbnQgbGlzdC5cbiAgICovXG4gIHNvcnRCeT86ICdpZCcgfCAnbmFtZScgfCAnZGF0ZScgfCAnc2l6ZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHNvcnQgZGlyZWN0aW9uIG9wdGlvbiBmb3IgdGhlIGNvbnRlbnQgbGlzdC5cbiAgICovXG4gIHNvcnREaXJlY3Rpb24/OiAnQVNDJyB8ICdERVNDJztcblxuICAvKipcbiAgICogV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGl0ZW0gZ3JpZCB3aWxsIGdldCBmb2N1cyBvbiBpbml0aWFsIGxvYWQuXG4gICAqL1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuXG4gIGNhbkNyZWF0ZU5ld0ZvbGRlcj86IGJvb2xlYW47XG5cbiAgY2FuRGVsZXRlPzogYm9vbGVhbjtcblxuICBjYW5Eb3dubG9hZD86IGJvb2xlYW47XG5cbiAgY2FuUHJldmlldz86IGJvb2xlYW47XG5cbiAgY2FuUmVuYW1lPzogYm9vbGVhbjtcblxuICBjYW5TZXRTaGFyZUFjY2Vzcz86IGJvb2xlYW47XG5cbiAgY2FuU2hhcmU/OiBib29sZWFuO1xuXG4gIGNhblVwbG9hZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0byB0aGUgY29udGVudCBleHBsb3JlciB0aGF0IGl0IGlzIGJlaW5nIHJlbmRlcmVkIG9uIGEgdG91Y2ggZW5hYmxlZCBkZXZpY2UuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBicm93c2VyIGFuZCBkZXZpY2UncyBkZWZhdWx0IHRvdWNoIHN1cHBvcnRcbiAgICovXG4gIGlzVG91Y2g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIHNldCB0byByZWNlbnRzLCBieSBkZWZhdWx0IHlvdSB3aWxsIHNlZSByZWNlbnQgaXRlbXMgaW5zdGVhZCBvZiB0aGUgcmVndWxhciBmaWxlL2ZvbGRlciBzdHJ1Y3R1cmUuXG4gICAqL1xuICBkZWZhdWx0Vmlldz86ICdmaWxlcycgfCAncmVjZW50cyc7XG5cbiAgLyoqXG4gICAqIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXhpb3MvYXhpb3MjaW50ZXJjZXB0b3JzXG4gICAqL1xuICByZXF1ZXN0SW50ZXJjZXB0b3I/OiBGdW5jPEF4aW9zUmVxdWVzdENvbmZpZywgTWF5YmVQcm9taXNlPGFueSB8IHZvaWQ+PjtcblxuICAvKipcbiAgICogLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9heGlvcy9heGlvcyNpbnRlcmNlcHRvcnNcbiAgICovXG4gIHJlc3BvbnNlSW50ZXJjZXB0b3I/OiBGdW5jPEF4aW9zUmVzcG9uc2UsIE1heWJlUHJvbWlzZTxBeGlvc1Jlc3BvbnNlIHwgdm9pZD4+O1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgeW91IHRvIHNob3cgdGhlIE9wZW4gV2l0aCBFbGVtZW50IHdoZW4gcHJldmlld2luZyB2aWEgdGhlIGV4cGxvcmVyLlxuICAgKi9cbiAgQ29udGVudE9wZW5XaXRoUHJvcHM/OiB7XG4gICAgc2hvdz86IGJvb2xlYW4sXG4gICAgW3A6IHN0cmluZ106IGFueVxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGxvcmVyIGV4dGVuZHMgQmFzZUVsPEV4cGxvcmVyT3B0aW9ucywgRXhwbG9yZXJFdmVudHM+IHtcbiAgLyoqXG4gICAqIENsZWFycyBvdXQgdGhlIGludGVybmFsIGluLW1lbW9yeVxuICAgKiBjYWNoZSBmb3IgdGhlIGNvbnRlbnQgZXhwbG9yZXIgZm9yY2luZ1xuICAgKiByZS1sb2FkIG9mIGl0ZW1zIHZpYSB0aGUgQVBJLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBjbGVhckNhY2hlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VCb3hDb250ZW50RXhwbG9yZXIoZmlsZUlkOiBNYXliZVJlZjxzdHJpbmc+LCBhY2Nlc3NUb2tlbjogTWF5YmVSZWY8c3RyaW5nPiwgb3B0aW9uczogVXNlQm94RWxlbWVudHNPcHRpb25zPEV4cGxvcmVyT3B0aW9ucywgRXhwbG9yZXJFdmVudHM+KSB7XG4gIHJldHVybiB1c2VCb3hFbGVtZW50PEV4cGxvcmVyLCBFeHBsb3Jlck9wdGlvbnMsIEV4cGxvcmVyRXZlbnRzPihcbiAgICBmaWxlSWQsXG4gICAgYWNjZXNzVG9rZW4sXG4gICAge1xuICAgICAgZGlzcG9zZU9uVW5tb3VudDogdHJ1ZSxcbiAgICAgIC4uLihvcHRpb25zIHx8IHt9KSxcbiAgICAgIGVsOiAnZXhwbG9yZXInXG4gICAgfVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgQm94Q29udGVudEV4cGxvcmVyID0gLyogQF9fUFVSRV9fICovIEdlbmVyaWNCb3hFbGVtZW50PEV4cGxvcmVyLCBFeHBsb3Jlck9wdGlvbnMsIHR5cGVvZiBFWFBMT1JFUl9FVkVOVFM+KFxuICAnZXhwbG9yZXInLFxuICBFWFBMT1JFUl9FVkVOVFNcbik7XG4iLCJpbXBvcnQgeyBpc0RlZiB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZWYgfSBmcm9tICdAd2hvai91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFVzZUJveEVsZW1lbnRzT3B0aW9ucyB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgeyBHZW5lcmljQm94RWxlbWVudCwgdXNlQm94RWxlbWVudCB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgdHlwZSB7IEJhc2VFbCwgQm94VWlPcHRpb25zLCBNYXBUb1JldHVyblZvaWQgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmNvbnN0IFBSRVZJRVdfRVZFTlRTID0ge1xuICB2aWV3ZXI6IChhcmdzOiBhbnkpID0+IGlzRGVmKGFyZ3MpLFxuICBsb2FkOiAoYXJnczogYW55KSA9PiBpc0RlZihhcmdzKSxcbiAgbmF2aWdhdGU6IChhcmdzOiBhbnkpID0+IGlzRGVmKGFyZ3MpLFxuICBub3RpZmljYXRpb246IChhcmdzOiBhbnkpID0+IGlzRGVmKGFyZ3MpLFxuICB2aWV3ZXJldmVudDogKGFyZ3M6IGFueSkgPT4gaXNEZWYoYXJncylcbn07XG5cbmV4cG9ydCB0eXBlIFByZXZpZXdFdmVudHMgPSBNYXBUb1JldHVyblZvaWQ8dHlwZW9mIFBSRVZJRVdfRVZFTlRTPjtcblxuZXhwb3J0IGludGVyZmFjZSBQcmV2aWV3T3B0aW9ucyBleHRlbmRzIEJveFVpT3B0aW9ucyB7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZmlsZSBJRHMgdG8gcHJldmlldyBvdmVyLlxuICAgKi9cbiAgY29sbGVjdGlvbj86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBWYWx1ZXMgdGhhdCBjb250cm9sIGhlYWRlciB2aXNpYmlsaXR5IGFuZCBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKiBVc2Ugbm9uZSBmb3Igbm8gaGVhZGVyLFxuICAgKiBsaWdodCBmb3IgYSBsaWdodCBoZWFkZXIgYW5kIGJhY2tncm91bmQsXG4gICAqIGFuZCBkYXJrIGZvciBhIGRhcmsgaGVhZGVyIGFuZCBiYWNrZ3JvdW5kXG4gICAqIEBkZWZhdWx0IGAnbGlnaHQnYFxuICAgKi9cbiAgaGVhZGVyPzogJ25vbmUnIHwgJ2xpZ2h0JyB8ICdkYXJrJztcblxuICAvKipcbiAgICogV2hldGhlciBhbm5vdGF0aW9uIGJ1dHRvbiBpbiBoZWFkZXIgYW5kIGFubm90YXRpb25zIG9uIGNvbnRlbnQgYXJlIHNob3duXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHNob3dBbm5vdGF0aW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZG93bmxvYWQgYnV0dG9uIGlzIHNob3duIGluIGhlYWRlci5cbiAgICogV2lsbCBhbHNvIGNvbnRyb2wgcHJpbnQgYnV0dG9uIHZpc2liaWxpdHkgaW4gdmlld2VycyB0aGF0IHN1cHBvcnQgcHJpbnQuXG4gICAqIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiB3aWxsIG5vdCBvdmVycmlkZSBkb3dubG9hZCBwZXJtaXNzaW9ucyBvbiB0aGUgYWNjZXNzIHRva2VuLlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBzaG93RG93bmxvYWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXZpZXcgZXh0ZW5kcyBCYXNlRWw8UHJldmlld09wdGlvbnMsIFByZXZpZXdFdmVudHM+IHtcbiAgLyoqXG4gICAqIFByaW50cyB0aGUgY3VycmVudCBmaWxlLCBpZiBwcmludGFibGUuXG4gICAqXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBwcmludCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBEb3dubG9hZHMgdGhlIGN1cnJlbnQgZmlsZS5cbiAgICpcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGRvd25sb2FkKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlc2l6ZXMgdGhlIGN1cnJlbnQgcHJldmlldywgaWYgYXBwbGljYWJsZS4gVGhpcyBmdW5jdGlvbiBvbmx5IG5lZWRzIHRvXG4gICAqIGJlIGNhbGxlZCB3aGVuIHByZXZpZXcncyB2aWV3cG9ydCBoYXMgY2hhbmdlZCB3aGlsZSB0aGUgd2luZG93IGhhcyBub3QuXG4gICAqIElmIHRoZSB3aW5kb3cgaXMgcmVzaXppbmcsIHRoZW4gcHJldmlldyB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzaXplIGl0c2VsZi5cbiAgICpcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHJlc2l6ZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQm94UHJldmlldyhmaWxlSWQ6IE1heWJlUmVmPHN0cmluZz4sIGFjY2Vzc1Rva2VuOiBNYXliZVJlZjxzdHJpbmc+LCBvcHRpb25zOiBVc2VCb3hFbGVtZW50c09wdGlvbnM8UHJldmlld09wdGlvbnMsIFByZXZpZXdFdmVudHM+KSB7XG4gIHJldHVybiB1c2VCb3hFbGVtZW50PFByZXZpZXcsIFByZXZpZXdPcHRpb25zLCBQcmV2aWV3RXZlbnRzPihcbiAgICBmaWxlSWQsXG4gICAgYWNjZXNzVG9rZW4sXG4gICAge1xuICAgICAgZGlzcG9zZU9uVW5tb3VudDogdHJ1ZSxcbiAgICAgIC4uLihvcHRpb25zIHx8IHt9KSxcbiAgICAgIGVsOiAncHJldmlldydcbiAgICB9XG4gICk7XG59XG5cbmV4cG9ydCBjb25zdCBCb3hQcmV2aWV3ID0gLyogQF9fUFVSRV9fICovIEdlbmVyaWNCb3hFbGVtZW50PFByZXZpZXcsIFByZXZpZXdPcHRpb25zLCB0eXBlb2YgUFJFVklFV19FVkVOVFM+KFxuICAncHJldmlldycsXG4gIFBSRVZJRVdfRVZFTlRTXG4pO1xuIiwiaW1wb3J0IHsgaXNEZWYgfSBmcm9tICdAd2hvai91dGlscyc7XG5pbXBvcnQgdHlwZSB7IEZ1bmMsIE1heWJlUmVmIH0gZnJvbSAnQHdob2ovdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBVc2VCb3hFbGVtZW50c09wdGlvbnMgfSBmcm9tICcuL3VzZUJveEVsZW1lbnQnO1xuaW1wb3J0IHR5cGUgeyBCYXNlRWwsIEZpbGUsIEZvbGRlciwgTWFwVG9SZXR1cm5Wb2lkLCBXZWJMaW5rIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBFeHBsb3Jlck9wdGlvbnMgfSBmcm9tICcuL2V4cGxvcmVyJztcbmltcG9ydCB7IEdlbmVyaWNCb3hFbGVtZW50LCB1c2VCb3hFbGVtZW50IH0gZnJvbSAnLi91c2VCb3hFbGVtZW50JztcblxuY29uc3QgUElDS0VSX0VWRU5UUyA9IHtcbiAgY2hvb3NlOiAoYXJnczogQXJyYXk8RmlsZSB8IEZvbGRlciB8IFdlYkxpbms+KSA9PiBpc0RlZihhcmdzKSxcbiAgY2FuY2VsOiAoKSA9PiB0cnVlXG59O1xuXG5leHBvcnQgdHlwZSBGaWxlUGlja2VyRXZlbnRzID0gTWFwVG9SZXR1cm5Wb2lkPHR5cGVvZiBQSUNLRVJfRVZFTlRTPjtcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlUGlja2VyT3B0aW9ucyBleHRlbmRzIE9taXQ8RXhwbG9yZXJPcHRpb25zLCAnY2FuRGVsZXRlJyB8ICdjYW5Eb3dubG9hZCcgfCAnY2FuUHJldmlldycgfCAnY2FuUmVuYW1lJyB8ICdjYW5TaGFyZSc+IHtcbiAgLyoqXG4gICAqIEFycmF5IG9mIGZpbGUgZXh0ZW5zaW9ucyB0byBiZSBhbGxvd2VkIGZvciBzZWxlY3Rpb25cbiAgICogQGV4YW1wbGUgYFsnZG9jJywgJ3BwdCddYFxuICAgKi9cbiAgZXh0ZW5zaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZmlsZXMgb3IgZm9sZGVycyB0aGF0IGNhbiBiZSBzZWxlY3RlZC5cbiAgICogU3BlY2lmeSAxIGlmIHlvdSB3YW50IG9ubHkgMSBmaWxlIG9yIGZvbGRlciBzZWxlY3RlZC5cbiAgICogQGRlZmF1bHQgYEluZmluaXR5YFxuICAgKi9cbiAgbWF4U2VsZWN0YWJsZT86IG51bWJlcjtcblxuICBtb2RhbD86IHtcbiAgICBidXR0b25MYWJlbD86IHN0cmluZywgLy9cdFx0TGFiZWwgZm9yIHRoZSBidXR0b25cbiAgICBidXR0b25DbGFzc05hbWU/OiBzdHJpbmcsIC8vXHRCb3ggQmx1ZSBCdXR0b25cdENTUyBjbGFzcyB0byBkZWNvcmF0ZSB0aGUgYnV0dG9uXG4gICAgbW9kYWxDbGFzc05hbWU/OiBzdHJpbmcsIC8vXHRcdENTUyBjbGFzcyB0byBkZWNvcmF0ZSB0aGUgbW9kYWwgcG9wdXAgY29udGVudFxuICAgIG92ZXJsYXlDbGFzc05hbWU/OiBzdHJpbmcgLy9cdFx0Q1NTIGNsYXNzIHRvIGRlY29yYXRlIHRoZSBtb2RhbCBwb3B1cCBvdmVybGF5XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVBpY2tlciBleHRlbmRzIEJhc2VFbDxGaWxlUGlja2VyT3B0aW9ucywgRmlsZVBpY2tlckV2ZW50cz4ge1xuICAvKipcbiAgICogQ2xlYXJzIG91dCB0aGUgaW50ZXJuYWwgaW4tbWVtb3J5XG4gICAqIGNhY2hlIGZvciB0aGUgY29udGVudCBleHBsb3JlciBmb3JjaW5nXG4gICAqIHJlLWxvYWQgb2YgaXRlbXMgdmlhIHRoZSBBUEkuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGNsZWFyQ2FjaGUoKTogdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUJveEZpbGVQaWNrZXIoZmlsZUlkOiBNYXliZVJlZjxzdHJpbmc+LCBhY2Nlc3NUb2tlbjogTWF5YmVSZWY8c3RyaW5nPiwgb3B0aW9uczogVXNlQm94RWxlbWVudHNPcHRpb25zPEZpbGVQaWNrZXJPcHRpb25zLCBGaWxlUGlja2VyRXZlbnRzPikge1xuICByZXR1cm4gdXNlQm94RWxlbWVudDxGaWxlUGlja2VyLCBGaWxlUGlja2VyT3B0aW9ucywgRmlsZVBpY2tlckV2ZW50cz4oXG4gICAgZmlsZUlkLFxuICAgIGFjY2Vzc1Rva2VuLFxuICAgIHtcbiAgICAgIGRpc3Bvc2VPblVubW91bnQ6IHRydWUsXG4gICAgICAuLi4ob3B0aW9ucyB8fCB7fSksXG4gICAgICBlbDogJ3BpY2tlcidcbiAgICB9XG4gICk7XG59XG5cbmV4cG9ydCBjb25zdCBCb3hGaWxlUGlja2VyID0gLyogQF9fUFVSRV9fICovIEdlbmVyaWNCb3hFbGVtZW50PEZpbGVQaWNrZXIsIEZpbGVQaWNrZXJPcHRpb25zLCB0eXBlb2YgUElDS0VSX0VWRU5UUz4oXG4gICdwaWNrZXInLFxuICBQSUNLRVJfRVZFTlRTXG4pO1xuIiwiaW1wb3J0IHR5cGUgeyBNYXliZVJlZiB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgRXhwbG9yZXJPcHRpb25zIH0gZnJvbSAnLi9leHBsb3Jlcic7XG5pbXBvcnQgdHlwZSB7IFVzZUJveEVsZW1lbnRzT3B0aW9ucyB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgdHlwZSB7IEJhc2VFbCwgTWFwVG9SZXR1cm5Wb2lkIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgR2VuZXJpY0JveEVsZW1lbnQsIHVzZUJveEVsZW1lbnQgfSBmcm9tICcuL3VzZUJveEVsZW1lbnQnO1xuXG5jb25zdCBTSURFQkFSX0VWRU5UUyA9IHt9O1xuXG5leHBvcnQgdHlwZSBTaWRlYmFyRXZlbnRzID0gTWFwVG9SZXR1cm5Wb2lkPHR5cGVvZiBTSURFQkFSX0VWRU5UUz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lkZWJhck9wdGlvbnMgZXh0ZW5kcyBQaWNrPEV4cGxvcmVyT3B0aW9ucywgJ2NvbnRhaW5lcicgfCAncmVxdWVzdEludGVyY2VwdG9yJyB8ICdyZXNwb25zZUludGVyY2VwdG9yJz4ge1xuICAvKipcbiAgICogU2V0IHRvIHRydWUgdG8gc2hvdyB0aGUgYWN0aXZpdHkgZmVlZCB0aGF0IGluY2x1ZGVzIHZlcnNpb25zLCBjb21tZW50cyBhbmQgdGFza3MuXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIGhhc0FjdGl2aXR5RmVlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHRvIHNob3cgYm94IG1ldGFkYXRhIGZvciB0aGUgZmlsZS5cbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgaGFzTWV0YWRhdGE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB0byBzaG93IHRoZSBmaWxlIHNraWxscyBkYXRhLlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBoYXNTa2lsbHM/OiBib29sZWFuO1xuXG4gIGRldGFpbHNTaWRlYmFyUHJvcHM/OiB7XG4gICAgaGFzUHJvcGVydGllcz86IGJvb2xlYW4sIC8vIFx0ZmFsc2VcdFNldCB0byB0cnVlIHRvIHNob3cgZmlsZSBwcm9wZXJ0aWVzIGluIHRoZSBkZXRhaWxzIHNpZGViYXIuXG4gICAgaGFzQWNjZXNzU3RhdHM/OiBib29sZWFuLCAvLyBcdGZhbHNlXHRTZXQgdG8gdHJ1ZSB0byBzaG93IGZpbGUgYWNjZXNzIHN0YXRzIGluIHRoZSBkZXRhaWxzIHNpZGViYXIuXG4gICAgaGFzVmVyc2lvbnM/OiBib29sZWFuLCAvLyBcdGZhbHNlXHRTZXQgdG8gdHJ1ZSB0byBzaG93IGZpbGUgdmVyc2lvbnMgaW4gdGhlIGRldGFpbHMgc2lkZWJhci5cbiAgICBoYXNOb3RpY2VzPzogYm9vbGVhbiAvLyBcdGZhbHNlXHRTZXQgdG8gdHJ1ZSB0byBzaG93IGZpbGUgcmVsYXRlZCBub3RpY2VzIGluIHRoZSBkZXRhaWxzIHNpZGViYXIuXG5cbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWRlYmFyIGV4dGVuZHMgQmFzZUVsPFNpZGViYXJPcHRpb25zLCBTaWRlYmFyRXZlbnRzPiB7XG4gIC8qKlxuICAgKiBDbGVhcnMgb3V0IHRoZSBpbnRlcm5hbCBpbi1tZW1vcnlcbiAgICogY2FjaGUgZm9yIHRoZSBjb250ZW50IGV4cGxvcmVyIGZvcmNpbmdcbiAgICogcmUtbG9hZCBvZiBpdGVtcyB2aWEgdGhlIEFQSS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgY2xlYXJDYWNoZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQm94Q29udGVudFNpZGViYXIoZmlsZUlkOiBNYXliZVJlZjxzdHJpbmc+LCBhY2Nlc3NUb2tlbjogTWF5YmVSZWY8c3RyaW5nPiwgb3B0aW9uczogVXNlQm94RWxlbWVudHNPcHRpb25zPFNpZGViYXJPcHRpb25zLCBTaWRlYmFyRXZlbnRzPikge1xuICByZXR1cm4gdXNlQm94RWxlbWVudDxTaWRlYmFyLCBTaWRlYmFyT3B0aW9ucywgU2lkZWJhckV2ZW50cz4oXG4gICAgZmlsZUlkLFxuICAgIGFjY2Vzc1Rva2VuLFxuICAgIHtcbiAgICAgIGRpc3Bvc2VPblVubW91bnQ6IHRydWUsXG4gICAgICAuLi4ob3B0aW9ucyB8fCB7fSksXG4gICAgICBlbDogJ3NpZGViYXInXG4gICAgfVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgQm94Q29udGVudFNpZGViYXIgPSAvKiBAX19QVVJFX18gKi8gR2VuZXJpY0JveEVsZW1lbnQ8U2lkZWJhciwgU2lkZWJhck9wdGlvbnMsIHR5cGVvZiBTSURFQkFSX0VWRU5UUz4oXG4gICdzaWRlYmFyJyxcbiAgU0lERUJBUl9FVkVOVFNcbik7XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBpc0RlZiB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZWYgfSBmcm9tICdAd2hvai91dGlscyc7XG5pbXBvcnQgdHlwZSB7IEV4cGxvcmVyT3B0aW9ucyB9IGZyb20gJy4vZXhwbG9yZXInO1xuaW1wb3J0IHR5cGUgeyBVc2VCb3hFbGVtZW50c09wdGlvbnMgfSBmcm9tICcuL3VzZUJveEVsZW1lbnQnO1xuaW1wb3J0IHR5cGUgeyBCYXNlRWwsIEZpbGUsIE1hcFRvUmV0dXJuVm9pZCB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEdlbmVyaWNCb3hFbGVtZW50LCB1c2VCb3hFbGVtZW50IH0gZnJvbSAnLi91c2VCb3hFbGVtZW50JztcblxuY29uc3QgVVBMT0FERVJfRVZFTlRTID0ge1xuICBjbG9zZTogKCkgPT4gdHJ1ZSxcbiAgY29tcGxldGU6IChwYXlsb2FkOiBGaWxlW10pID0+IGlzQXJyYXkocGF5bG9hZCksXG4gIGVycm9yOiAoYXJnczogRXJyb3IpID0+IGlzRGVmKGFyZ3MpLFxuICB1cGxvYWQ6IChwYXlsb2FkOiBGaWxlKSA9PiBpc0RlZihwYXlsb2FkKVxufTtcblxuZXhwb3J0IHR5cGUgVXBsb2FkZXJFdmVudHMgPSBNYXBUb1JldHVyblZvaWQ8dHlwZW9mIFVQTE9BREVSX0VWRU5UUz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkZXJPcHRpb25zIGV4dGVuZHMgUGljazxFeHBsb3Jlck9wdGlvbnMsICdjb250YWluZXInIHwgJ3JlcXVlc3RJbnRlcmNlcHRvcicgfCAncmVzcG9uc2VJbnRlcmNlcHRvcicgfCAnc2hhcmVkTGluaycgfCAnc2hhcmVkTGlua1Bhc3N3b3JkJyB8ICdzaXplJyB8ICdpc1RvdWNoJz4ge1xuICAvKipcbiAgICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yICdDbG9zZScgYnV0dG9uLFxuICAgKiB3aGljaCB3aWxsIGFwcGVhciB3aGVuIHRoZXJlIGFyZSBubyBmaWxlcyB0byB1cGxvYWQgb3Igd2hlbiBhbGwgdXBsb2FkcyBhcmUgY29tcGxldGUuXG4gICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgbnVsbGAgdGhlIGJ1dHRvbiB3aWxsIG5vdCBhcHBlYXIuXG4gICAqL1xuICBvbkNsb3NlPzogbnVsbCB8ICgoKSA9PiB2b2lkKTtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGZpbGVzIG9yIGZvbGRlcnMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqIFNwZWNpZnkgMSBpZiB5b3Ugd2FudCBvbmx5IDEgZmlsZSBvciBmb2xkZXIgc2VsZWN0ZWQuXG4gICAqIEBkZWZhdWx0IGAxMDBgXG4gICAqL1xuICBmaWxlTGltaXQ/OiBudW1iZXI7XG5cbiAgbW9kYWw/OiB7XG4gICAgYnV0dG9uTGFiZWw/OiBzdHJpbmcsIC8vXHRcdExhYmVsIGZvciB0aGUgYnV0dG9uXG4gICAgYnV0dG9uQ2xhc3NOYW1lPzogc3RyaW5nLCAvL1x0Qm94IEJsdWUgQnV0dG9uXHRDU1MgY2xhc3MgdG8gZGVjb3JhdGUgdGhlIGJ1dHRvblxuICAgIG1vZGFsQ2xhc3NOYW1lPzogc3RyaW5nLCAvL1x0XHRDU1MgY2xhc3MgdG8gZGVjb3JhdGUgdGhlIG1vZGFsIHBvcHVwIGNvbnRlbnRcbiAgICBvdmVybGF5Q2xhc3NOYW1lPzogc3RyaW5nIC8vXHRcdENTUyBjbGFzcyB0byBkZWNvcmF0ZSB0aGUgbW9kYWwgcG9wdXAgb3ZlcmxheVxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZGVyIGV4dGVuZHMgQmFzZUVsPFVwbG9hZGVyT3B0aW9ucywgVXBsb2FkZXJFdmVudHM+IHtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQm94Q29udGVudFVwbG9hZGVyKGZpbGVJZDogTWF5YmVSZWY8c3RyaW5nPiwgYWNjZXNzVG9rZW46IE1heWJlUmVmPHN0cmluZz4sIG9wdGlvbnM6IFVzZUJveEVsZW1lbnRzT3B0aW9uczxVcGxvYWRlck9wdGlvbnMsIFVwbG9hZGVyRXZlbnRzPikge1xuICByZXR1cm4gdXNlQm94RWxlbWVudDxVcGxvYWRlciwgVXBsb2FkZXJPcHRpb25zLCBVcGxvYWRlckV2ZW50cz4oXG4gICAgZmlsZUlkLFxuICAgIGFjY2Vzc1Rva2VuLFxuICAgIHtcbiAgICAgIGRpc3Bvc2VPblVubW91bnQ6IHRydWUsXG4gICAgICAuLi4ob3B0aW9ucyB8fCB7fSksXG4gICAgICBlbDogJ3VwbG9hZGVyJ1xuICAgIH1cbiAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IEJveENvbnRlbnRVcGxvYWRlciA9IC8qIEBfX1BVUkVfXyAqLyBHZW5lcmljQm94RWxlbWVudDxVcGxvYWRlciwgVXBsb2FkZXJPcHRpb25zLCB0eXBlb2YgVVBMT0FERVJfRVZFTlRTPihcbiAgJ3VwbG9hZGVyJyxcbiAgVVBMT0FERVJfRVZFTlRTXG4pO1xuIl0sIm5hbWVzIjpbInVzZUNkbiIsImJveEVsIiwiY2RuIiwic3R5bGUiLCJvbmxvYWQiLCJ2ZXJzaW9uIiwiZGlzcG9zZU9uVW5tb3VudCIsImVsZW1lbnQiLCJjc3MiLCJqcyIsImxvYWRlZCIsInJlZiIsImhlYWQiLCJ1c2VIZWFkIiwibGluayIsImhyZWYiLCJyZWwiLCJrZXkiLCJzY3JpcHQiLCJzcmMiLCJmZXRjaHByaW9yaXR5IiwidHlwZSIsImUiLCJ2YWx1ZSIsImlzRGVmIiwiaW5uZXJIVE1MIiwidW5yZWYiLCJ1bmRlZmluZWQiLCJ0cnlPblVubW91bnRlZCIsImRpc3Bvc2UiLCJuZXdCb3hFbCIsImdldFByb3BlcnR5IiwiZ2V0R2xvYmFsIiwiQm94IiwiQm94VWlFbGVtZW50cyIsIl9jb3VudGVyIiwiQm94RWxlbWVudEZhY3RvcnkiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJwcm9wcyIsIm1vZGVsVmFsdWUiLCJTdHJpbmciLCJyZXF1aXJlZCIsImFjY2Vzc1Rva2VuIiwiT2JqZWN0Iiwib3B0aW9ucyIsImRlZmF1bHQiLCJoZWlnaHQiLCJCb29sZWFuIiwiaW1tZWRpYXRlIiwic2hvdyIsImNyZWF0ZSIsImV2ZW50cyIsImRlZmluZUNvbXBvbmVudCIsImVtaXRzIiwiZXhwb3NlIiwic2V0dXAiLCJhdHRycyIsImVtaXQiLCJmaWQiLCJ1c2VWTW9kZWwiLCJpZCIsImdldEluc3RhbmNlIiwiaW5zdGFuY2UiLCJ1c2VCb3hFbGVtZW50IiwiZWwiLCJjb250YWluZXIiLCJsaXN0ZW5lcnMiLCJvYmplY3RLZXlzIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJyZWR1Y2UiLCJldnQiLCJhcmdzIiwicmVhZG9ubHkiLCJ3YXRjaEVmZmVjdCIsImxlbmd0aCIsImhpZGUiLCJfY3JlYXRlVk5vZGUiLCJfbWVyZ2VQcm9wcyIsIkdlbmVyaWNCb3hFbGVtZW50IiwiX2V2ZW50cyIsImluaXRpYXRlZCIsInVwZGF0ZTptb2RlbC12YWx1ZSIsImNvbXBvbmVudCIsInRlbXBsYXRlIiwiZXhwbG9yZXIiLCJwaWNrZXIiLCJwcmV2aWV3Iiwic2lkZWJhciIsInVwbG9hZGVyIiwid2hlbmV2ZXIiLCJoYXNQcm9wZXJ0eSIsIm9iamVjdEVudHJpZXMiLCJmb3JFYWNoIiwiZXZlbnQiLCJsaXN0ZW5lciIsImFkZExpc3RlbmVyIiwidW5yZWZPZiIsIkVYUExPUkVSX0VWRU5UUyIsInNlbGVjdCIsInBheWxvYWQiLCJpc0FycmF5IiwicmVuYW1lIiwiZG93bmxvYWQiLCJkZWxldGUiLCJ1cGxvYWQiLCJuYXZpZ2F0ZSIsInVzZUJveENvbnRlbnRFeHBsb3JlciIsImZpbGVJZCIsIkJveENvbnRlbnRFeHBsb3JlciIsIlBSRVZJRVdfRVZFTlRTIiwidmlld2VyIiwibG9hZCIsIm5vdGlmaWNhdGlvbiIsInZpZXdlcmV2ZW50IiwidXNlQm94UHJldmlldyIsIkJveFByZXZpZXciLCJQSUNLRVJfRVZFTlRTIiwiY2hvb3NlIiwiY2FuY2VsIiwidXNlQm94RmlsZVBpY2tlciIsIkJveEZpbGVQaWNrZXIiLCJTSURFQkFSX0VWRU5UUyIsInVzZUJveENvbnRlbnRTaWRlYmFyIiwiQm94Q29udGVudFNpZGViYXIiLCJVUExPQURFUl9FVkVOVFMiLCJjbG9zZSIsImNvbXBsZXRlIiwiZXJyb3IiLCJ1c2VCb3hDb250ZW50VXBsb2FkZXIiLCJCb3hDb250ZW50VXBsb2FkZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBNENPLFNBQVNBLE9BQ2RDLEtBQ0EsRUFBQTtBQUFBLEVBQUVDLEdBQUFBO0FBQUFBLEVBQUtDLEtBQUFBO0FBQUFBLEVBQU9DLE1BQUFBO0FBQUFBLEVBQVFDLE9BQUFBO0FBQUFBLEVBQVNDLGdCQUFtQixHQUFBLElBQUE7QUFBb0IsQ0FDckQsRUFBQTtBQUNqQkQsRUFBVUEsT0FBQUEsR0FBQUEsT0FBQUEsS0FBWUosS0FBVSxLQUFBLFNBQUEsR0FBWSxRQUFXLEdBQUEsUUFBQSxDQUFBLENBQUE7QUFDdkQsRUFBTU0sTUFBQUEsT0FBQUEsR0FBVU4sS0FBVSxLQUFBLFNBQUEsR0FBWSxTQUFZLEdBQUEsVUFBQSxDQUFBO0FB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