377 lines
34 KiB
Plaintext
377 lines
34 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/project/page/models/UploadsDialog.vue");import { CommonBadge as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { default as __nuxt_component_1 } from "/_nuxt/components/common/CopyButton.vue";
|
|
import { FormButton as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { InfiniteLoading as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { LayoutTable as __nuxt_component_4 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { LayoutDialog as __nuxt_component_5 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
/* Injection by vite-plugin-vue-inspector Start */
|
|
import { createElementVNode as __createElementVNode,createElementBlock as __createElementBlock,createBlock as __createBlock,createVNode as __createVNode } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"
|
|
function _interopVNode(vnode) {
|
|
if (vnode && vnode.props && 'data-v-inspector' in vnode.props) {
|
|
const data = vnode.props['data-v-inspector']
|
|
delete vnode.props['data-v-inspector']
|
|
Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false })
|
|
}
|
|
return vnode
|
|
}
|
|
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
|
|
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
|
|
function _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
|
|
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
|
|
/* Injection by vite-plugin-vue-inspector End */
|
|
import { useModel as _useModel, mergeModels as _mergeModels, defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import { ArrowDownTrayIcon, ArrowRightIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29";
|
|
import {
|
|
FileUploadConvertedStatus,
|
|
fileUploadConvertedStatusLabels
|
|
} from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/blobs/index.js";
|
|
import { resourceBuilder } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/viewer/helpers/route.js";
|
|
import { usePaginatedQuery } from "/_nuxt/lib/common/composables/graphql.ts";
|
|
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
|
|
import { viewerRoute } from "/_nuxt/lib/common/helpers/route.ts";
|
|
import { useFailedFileImportJobUtils } from "/_nuxt/lib/core/composables/fileImport.ts";
|
|
import { useFileDownload } from "/_nuxt/lib/core/composables/fileUpload.ts";
|
|
import { prettyFileSize } from "/_nuxt/lib/core/helpers/file.ts";
|
|
|
|
import { useClipboard } from "/_nuxt/composables/browser.ts";
|
|
import { useDateFormatters } from "/_nuxt/composables/dates.ts";
|
|
import { computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "ProjectPageModelsUploadsDialog",
|
|
props: /* @__PURE__ */ _mergeModels({
|
|
projectId: { type: String, required: true },
|
|
modelId: { type: String, required: true }
|
|
}, {
|
|
"open": { type: Boolean, ...{ required: true } },
|
|
"openModifiers": {}
|
|
}),
|
|
emits: ["update:open"],
|
|
setup(__props, { expose: __expose }) {
|
|
__expose();
|
|
graphql(`
|
|
fragment ProjectPageModelsUploadsDialog_FileUpload on FileUpload {
|
|
id
|
|
convertedStatus
|
|
convertedMessage
|
|
fileName
|
|
fileSize
|
|
convertedLastUpdate
|
|
convertedVersionId
|
|
uploadDate
|
|
uploadComplete
|
|
branchName
|
|
...UseFailedFileImportJobUtils_FileUpload
|
|
}
|
|
`);
|
|
const getModelUploadsQuery = graphql(`
|
|
query GetModelUploads(
|
|
$projectId: String!
|
|
$modelId: String!
|
|
$input: GetModelUploadsInput!
|
|
) {
|
|
project(id: $projectId) {
|
|
id
|
|
model(id: $modelId) {
|
|
id
|
|
uploads(input: $input) {
|
|
totalCount
|
|
cursor
|
|
items {
|
|
id
|
|
...ProjectPageModelsUploadsDialog_FileUpload
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`);
|
|
const props = __props;
|
|
const open = _useModel(__props, "open");
|
|
const { copy } = useClipboard();
|
|
const { formattedRelativeDate, formattedFullDate } = useDateFormatters();
|
|
const { getErrorMessage, convertUploadToFailedJob } = useFailedFileImportJobUtils();
|
|
const {
|
|
identifier,
|
|
onInfiniteLoad,
|
|
query: { result },
|
|
isVeryFirstLoading
|
|
} = usePaginatedQuery({
|
|
query: getModelUploadsQuery,
|
|
baseVariables: computed(() => ({
|
|
projectId: props.projectId,
|
|
modelId: props.modelId,
|
|
input: {
|
|
cursor: null
|
|
}
|
|
})),
|
|
options: {
|
|
enabled: open,
|
|
// reload query when dialog opens
|
|
fetchPolicy: "cache-and-network"
|
|
},
|
|
resolveKey: (vars) => [vars.projectId, vars.modelId],
|
|
resolveCurrentResult: (res) => res?.project.model.uploads,
|
|
resolveNextPageVariables: (baseVars, cursor) => ({
|
|
...baseVars,
|
|
input: {
|
|
...baseVars.input,
|
|
cursor
|
|
}
|
|
}),
|
|
resolveCursorFromVariables: (vars) => vars.input.cursor
|
|
});
|
|
const { download } = useFileDownload();
|
|
const items = computed(() => result.value?.project.model.uploads.items);
|
|
const buttons = computed(() => [
|
|
{
|
|
text: "Close",
|
|
onClick: () => {
|
|
open.value = false;
|
|
}
|
|
}
|
|
]);
|
|
const getStatusOptions = (item) => {
|
|
let colorClasses = void 0;
|
|
switch (item.convertedStatus) {
|
|
case FileUploadConvertedStatus.Error:
|
|
colorClasses = "bg-danger text-foundation";
|
|
break;
|
|
case FileUploadConvertedStatus.Converting:
|
|
colorClasses = "bg-primary text-foundation";
|
|
break;
|
|
case FileUploadConvertedStatus.Completed:
|
|
colorClasses = "bg-success text-foundation";
|
|
break;
|
|
case FileUploadConvertedStatus.Queued:
|
|
colorClasses = "bg-info text-foundation";
|
|
break;
|
|
}
|
|
return {
|
|
label: fileUploadConvertedStatusLabels[item.convertedStatus],
|
|
tooltip: item.convertedStatus === FileUploadConvertedStatus.Error ? {
|
|
content: getErrorMessage(convertUploadToFailedJob(item)) + ` Error: ${item.convertedMessage}`
|
|
} : void 0,
|
|
colorClasses,
|
|
isErrorStatus: item.convertedStatus === FileUploadConvertedStatus.Error
|
|
};
|
|
};
|
|
const onDownload = async (item) => {
|
|
await download({
|
|
blobId: item.id,
|
|
fileName: item.fileName,
|
|
projectId: props.projectId
|
|
});
|
|
};
|
|
const buildUploadedVersionUrl = (item) => {
|
|
if (!item.convertedVersionId || !item.modelId) return void 0;
|
|
return viewerRoute(
|
|
props.projectId,
|
|
resourceBuilder().addModel(item.modelId, item.convertedVersionId).toString()
|
|
);
|
|
};
|
|
const onErrorBadgeClick = async (item) => {
|
|
if (getStatusOptions(item).isErrorStatus) {
|
|
await copy(getStatusOptions(item).tooltip?.content || "", {
|
|
successMessage: "Error message copied"
|
|
});
|
|
}
|
|
};
|
|
const __returned__ = { getModelUploadsQuery, props, open, copy, formattedRelativeDate, formattedFullDate, getErrorMessage, convertUploadToFailedJob, identifier, onInfiniteLoad, result, isVeryFirstLoading, download, items, buttons, getStatusOptions, onDownload, buildUploadedVersionUrl, onErrorBadgeClick, get ArrowDownTrayIcon() {
|
|
return ArrowDownTrayIcon;
|
|
}, get ArrowRightIcon() {
|
|
return ArrowRightIcon;
|
|
}, get prettyFileSize() {
|
|
return prettyFileSize;
|
|
} };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, withDirectives as _withDirectives, resolveComponent as _resolveComponent, withCtx as _withCtx, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = {
|
|
class: "text-foreground-2",
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:24:9"
|
|
};
|
|
const _hoisted_2 = {
|
|
class: "truncate text-foreground",
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:27:9"
|
|
};
|
|
const _hoisted_3 = {
|
|
class: "text-foreground-2",
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:39:9"
|
|
};
|
|
const _hoisted_4 = ["onClick"];
|
|
const _hoisted_5 = {
|
|
class: "text-foreground-2",
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:63:9"
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_CommonBadge = __nuxt_component_0;
|
|
const _component_CommonCopyButton = __nuxt_component_1;
|
|
const _component_FormButton = __nuxt_component_2;
|
|
const _component_InfiniteLoading = __nuxt_component_3;
|
|
const _component_LayoutTable = __nuxt_component_4;
|
|
const _component_LayoutDialog = __nuxt_component_5;
|
|
const _directive_tippy = _resolveDirective("tippy");
|
|
const _directive_keyboard_clickable = _resolveDirective("keyboard-clickable");
|
|
return _openBlock(), _createBlock(_component_LayoutDialog, {
|
|
open: $setup.open,
|
|
"onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.open = $event),
|
|
title: "Model upload history",
|
|
buttons: $setup.buttons,
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:4:3"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createVNode(_component_LayoutTable, {
|
|
columns: [
|
|
{ id: "job", header: "Job #", classes: "col-span-1" },
|
|
{ id: "file", header: "File", classes: "col-span-4" },
|
|
{ id: "status", header: "Status", classes: "col-span-2" },
|
|
{ id: "size", header: "Size", classes: "col-span-2" },
|
|
{ id: "date", header: "Date", classes: "col-span-2" },
|
|
{
|
|
id: "actions",
|
|
header: "",
|
|
classes: "col-span-1 flex items-center justify-end gap-0.5"
|
|
}
|
|
],
|
|
items: $setup.items,
|
|
loading: $setup.isVeryFirstLoading,
|
|
"empty-message": "This model has no uploads",
|
|
style: { "max-height": "300px" },
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:5:5"
|
|
}, {
|
|
job: _withCtx(({ item }) => [
|
|
_createElementVNode(
|
|
"span",
|
|
_hoisted_1,
|
|
_toDisplayString(item.id),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
]),
|
|
file: _withCtx(({ item }) => [
|
|
_withDirectives((_openBlock(), _createElementBlock("div", _hoisted_2, [
|
|
_createTextVNode(
|
|
_toDisplayString(item.fileName),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
])), [
|
|
[_directive_tippy, {
|
|
content: item.fileName.length > 35 ? item.fileName : void 0,
|
|
placement: "top-start",
|
|
delay: 300
|
|
}]
|
|
])
|
|
]),
|
|
size: _withCtx(({ item }) => [
|
|
_createElementVNode(
|
|
"span",
|
|
_hoisted_3,
|
|
_toDisplayString($setup.prettyFileSize(item.fileSize)),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
]),
|
|
status: _withCtx(({ item }) => [
|
|
_withDirectives((_openBlock(), _createElementBlock("div", {
|
|
class: _normalizeClass([
|
|
"flex items-center gap-2",
|
|
$setup.getStatusOptions(item).isErrorStatus ? "group hover:cursor-pointer" : ""
|
|
]),
|
|
onClick: ($event) => $setup.onErrorBadgeClick(item),
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:42:9"
|
|
}, [
|
|
_withDirectives((_openBlock(), _createBlock(_component_CommonBadge, {
|
|
"color-classes": $setup.getStatusOptions(item).colorClasses,
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:50:11"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createTextVNode(
|
|
_toDisplayString($setup.getStatusOptions(item).label),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
]),
|
|
_: 2
|
|
/* DYNAMIC */
|
|
}, 1032, ["color-classes"])), [
|
|
[_directive_tippy, $setup.getStatusOptions(item).tooltip]
|
|
]),
|
|
$setup.getStatusOptions(item).isErrorStatus ? (_openBlock(), _createBlock(_component_CommonCopyButton, {
|
|
key: 0,
|
|
class: "group-hover:text-foreground",
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:56:11"
|
|
})) : _createCommentVNode("v-if", true)
|
|
], 10, _hoisted_4)), [
|
|
[_directive_keyboard_clickable]
|
|
])
|
|
]),
|
|
date: _withCtx(({ item }) => [
|
|
_withDirectives((_openBlock(), _createElementBlock("span", _hoisted_5, [
|
|
_createTextVNode(
|
|
_toDisplayString($setup.formattedRelativeDate(item.convertedLastUpdate || item.uploadDate)),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
])), [
|
|
[_directive_tippy, $setup.formattedFullDate(item.convertedLastUpdate || item.uploadDate)]
|
|
])
|
|
]),
|
|
actions: _withCtx(({ item }) => [
|
|
item.convertedVersionId && item.modelId ? (_openBlock(), _createBlock(_component_FormButton, {
|
|
key: 0,
|
|
"icon-left": $setup.ArrowRightIcon,
|
|
"hide-text": "",
|
|
size: "sm",
|
|
color: "outline",
|
|
class: "shrink-0",
|
|
to: $setup.buildUploadedVersionUrl(item),
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:71:9"
|
|
}, null, 8, ["icon-left", "to"])) : _createCommentVNode("v-if", true),
|
|
_createVNode(_component_FormButton, {
|
|
"icon-left": $setup.ArrowDownTrayIcon,
|
|
"hide-text": "",
|
|
size: "sm",
|
|
color: "outline",
|
|
class: "shrink-0",
|
|
onClick: ($event) => $setup.onDownload(item),
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:80:9"
|
|
}, null, 8, ["icon-left", "onClick"])
|
|
]),
|
|
loader: _withCtx(() => [
|
|
$setup.items?.length ? (_openBlock(), _createBlock(_component_InfiniteLoading, {
|
|
key: 0,
|
|
settings: { identifier: $setup.identifier },
|
|
"hide-when-complete": "",
|
|
onInfinite: $setup.onInfiniteLoad,
|
|
"data-v-inspector": "components/project/page/models/UploadsDialog.vue:90:9"
|
|
}, null, 8, ["settings", "onInfinite"])) : _createCommentVNode("v-if", true)
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["items", "loading"])
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["open", "buttons"]);
|
|
}
|
|
_sfc_main.__hmrId = "b371045e";
|
|
typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main);
|
|
import.meta.hot.on("file-changed", ({ file }) => {
|
|
__VUE_HMR_RUNTIME__.CHANGED_FILE = file;
|
|
});
|
|
import.meta.hot.accept((mod) => {
|
|
if (!mod) return;
|
|
const { default: updated, _rerender_only } = mod;
|
|
if (_rerender_only) {
|
|
__VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render);
|
|
} else {
|
|
__VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated);
|
|
}
|
|
});
|
|
import _export_sfc from "/_nuxt/@id/__x00__plugin-vue:export-helper";
|
|
export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "D:/speckle-server/packages/frontend-2/components/project/page/models/UploadsDialog.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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QUgzRCx5QkFBa0IsS0FBSyx1QkFBdUIsS0FBSyxVQUFVO0FBQUE7O1FBTS9ELFNBQU8sU0F3QmIsQ0FZSSxFQXBDYSxLQUFJO0FBQUEsVUFFaEIsS0FBSyxzQkFBc0IsS0FBSyx5QkFEeEMsYUFRRTtBQUFBO1lBTkMsYUFBVztBQUFBLFlBQ1o7QUFBQSxZQUNBLE1BQUs7QUFBQSxZQUNMLE9BQU07QUFBQSxZQUNOLE9BQU07QUFBQSxZQUNMLElBQUksK0JBQXdCLElBQUk7QUFBQSxZQUFHLG9CQUFpQjtBQUFBO1VBRXZELGFBT0U7QUFBQSxZQU5DLGFBQVc7QUFBQSxZQUNaO0FBQUEsWUFDQSxNQUFLO0FBQUEsWUFDTCxPQUFNO0FBQUEsWUFDTixPQUFNO0FBQUEsWUFDTCxTQUFLLFlBQUUsa0JBQVcsSUFBSTtBQUFBLFlBQUcsb0JBQWlCO0FBQUE7O1FBR3BDLFFBQU0sU0FxQjJFLE1BSTlFO0FBQUEsVUF2QkosY0FBTyx3QkFEZixhQUtFO0FBQUE7WUFIQyxVQUFRLGNBQUksa0JBQVU7QUFBQSxZQUN2QjtBQUFBLFlBQ0MsWUFBVTtBQUFBLFlBQWdCLG9CQUFpQjtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJVcGxvYWRzRGlhbG9nLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuPHRlbXBsYXRlPlxyXG4gIDxMYXlvdXREaWFsb2cgdi1tb2RlbDpvcGVuPVwib3BlblwiIHRpdGxlPVwiTW9kZWwgdXBsb2FkIGhpc3RvcnlcIiA6YnV0dG9ucz1cImJ1dHRvbnNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlOjQ6M1wiPlxyXG4gICAgPExheW91dFRhYmxlXHJcbiAgICAgIDpjb2x1bW5zPVwiW1xyXG4gICAgICAgIHsgaWQ6ICdqb2InLCBoZWFkZXI6ICdKb2IgIycsIGNsYXNzZXM6ICdjb2wtc3Bhbi0xJyB9LFxyXG4gICAgICAgIHsgaWQ6ICdmaWxlJywgaGVhZGVyOiAnRmlsZScsIGNsYXNzZXM6ICdjb2wtc3Bhbi00JyB9LFxyXG4gICAgICAgIHsgaWQ6ICdzdGF0dXMnLCBoZWFkZXI6ICdTdGF0dXMnLCBjbGFzc2VzOiAnY29sLXNwYW4tMicgfSxcclxuICAgICAgICB7IGlkOiAnc2l6ZScsIGhlYWRlcjogJ1NpemUnLCBjbGFzc2VzOiAnY29sLXNwYW4tMicgfSxcclxuICAgICAgICB7IGlkOiAnZGF0ZScsIGhlYWRlcjogJ0RhdGUnLCBjbGFzc2VzOiAnY29sLXNwYW4tMicgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZDogJ2FjdGlvbnMnLFxyXG4gICAgICAgICAgaGVhZGVyOiAnJyxcclxuICAgICAgICAgIGNsYXNzZXM6ICdjb2wtc3Bhbi0xIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGdhcC0wLjUnXHJcbiAgICAgICAgfVxyXG4gICAgICBdXCJcclxuICAgICAgOml0ZW1zPVwiaXRlbXNcIlxyXG4gICAgICA6bG9hZGluZz1cImlzVmVyeUZpcnN0TG9hZGluZ1wiXHJcbiAgICAgIGVtcHR5LW1lc3NhZ2U9XCJUaGlzIG1vZGVsIGhhcyBubyB1cGxvYWRzXCJcclxuICAgICAgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzMDBweFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvVXBsb2Fkc0RpYWxvZy52dWU6NTo1XCJcclxuICAgID5cclxuICAgICAgPHRlbXBsYXRlICNqb2I9XCJ7IGl0ZW0gfVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlOjI0OjlcIj57eyBpdGVtLmlkIH19PC9zcGFuPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8dGVtcGxhdGUgI2ZpbGU9XCJ7IGl0ZW0gfVwiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtdGlwcHk9XCJ7XHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGl0ZW0uZmlsZU5hbWUubGVuZ3RoID4gMzUgPyBpdGVtLmZpbGVOYW1lIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBwbGFjZW1lbnQ6ICd0b3Atc3RhcnQnLFxyXG4gICAgICAgICAgICBkZWxheTogMzAwXHJcbiAgICAgICAgICB9XCJcclxuICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGUgdGV4dC1mb3JlZ3JvdW5kXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9VcGxvYWRzRGlhbG9nLnZ1ZToyNzo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBpdGVtLmZpbGVOYW1lIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSAjc2l6ZT1cInsgaXRlbSB9XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvVXBsb2Fkc0RpYWxvZy52dWU6Mzk6OVwiPnt7IHByZXR0eUZpbGVTaXplKGl0ZW0uZmlsZVNpemUpIH19PC9zcGFuPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8dGVtcGxhdGUgI3N0YXR1cz1cInsgaXRlbSB9XCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgdi1rZXlib2FyZC1jbGlja2FibGVcclxuICAgICAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGdhcC0yJyxcclxuICAgICAgICAgICAgZ2V0U3RhdHVzT3B0aW9ucyhpdGVtKS5pc0Vycm9yU3RhdHVzID8gJ2dyb3VwIGhvdmVyOmN1cnNvci1wb2ludGVyJyA6ICcnXHJcbiAgICAgICAgICBdXCJcclxuICAgICAgICAgIEBjbGljaz1cIm9uRXJyb3JCYWRnZUNsaWNrKGl0ZW0pXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9VcGxvYWRzRGlhbG9nLnZ1ZTo0Mjo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8Q29tbW9uQmFkZ2VcclxuICAgICAgICAgICAgdi10aXBweT1cImdldFN0YXR1c09wdGlvbnMoaXRlbSkudG9vbHRpcFwiXHJcbiAgICAgICAgICAgIDpjb2xvci1jbGFzc2VzPVwiZ2V0U3RhdHVzT3B0aW9ucyhpdGVtKS5jb2xvckNsYXNzZXNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlOjUwOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0U3RhdHVzT3B0aW9ucyhpdGVtKS5sYWJlbCB9fVxyXG4gICAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICAgIDxDb21tb25Db3B5QnV0dG9uXHJcbiAgICAgICAgICAgIHYtaWY9XCJnZXRTdGF0dXNPcHRpb25zKGl0ZW0pLmlzRXJyb3JTdGF0dXNcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImdyb3VwLWhvdmVyOnRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvVXBsb2Fkc0RpYWxvZy52dWU6NTY6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPHRlbXBsYXRlICNkYXRlPVwieyBpdGVtIH1cIj5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgdi10aXBweT1cImZvcm1hdHRlZEZ1bGxEYXRlKGl0ZW0uY29udmVydGVkTGFzdFVwZGF0ZSB8fCBpdGVtLnVwbG9hZERhdGUpXCJcclxuICAgICAgICAgIGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlOjYzOjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGZvcm1hdHRlZFJlbGF0aXZlRGF0ZShpdGVtLmNvbnZlcnRlZExhc3RVcGRhdGUgfHwgaXRlbS51cGxvYWREYXRlKSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPHRlbXBsYXRlICNhY3Rpb25zPVwieyBpdGVtIH1cIj5cclxuICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgdi1pZj1cIml0ZW0uY29udmVydGVkVmVyc2lvbklkICYmIGl0ZW0ubW9kZWxJZFwiXHJcbiAgICAgICAgICA6aWNvbi1sZWZ0PVwiQXJyb3dSaWdodEljb25cIlxyXG4gICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgIGNsYXNzPVwic2hyaW5rLTBcIlxyXG4gICAgICAgICAgOnRvPVwiYnVpbGRVcGxvYWRlZFZlcnNpb25VcmwoaXRlbSlcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlOjcxOjlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIDppY29uLWxlZnQ9XCJBcnJvd0Rvd25UcmF5SWNvblwiXHJcbiAgICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgY2xhc3M9XCJzaHJpbmstMFwiXHJcbiAgICAgICAgICBAY2xpY2s9XCJvbkRvd25sb2FkKGl0ZW0pXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9VcGxvYWRzRGlhbG9nLnZ1ZTo4MDo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8dGVtcGxhdGUgI2xvYWRlcj5cclxuICAgICAgICA8SW5maW5pdGVMb2FkaW5nXHJcbiAgICAgICAgICB2LWlmPVwiaXRlbXM/Lmxlbmd0aFwiXHJcbiAgICAgICAgICA6c2V0dGluZ3M9XCJ7IGlkZW50aWZpZXIgfVwiXHJcbiAgICAgICAgICBoaWRlLXdoZW4tY29tcGxldGVcclxuICAgICAgICAgIEBpbmZpbml0ZT1cIm9uSW5maW5pdGVMb2FkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9VcGxvYWRzRGlhbG9nLnZ1ZTo5MDo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC9MYXlvdXRUYWJsZT5cclxuICA8L0xheW91dERpYWxvZz5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgQXJyb3dEb3duVHJheUljb24sIEFycm93UmlnaHRJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHtcclxuICBGaWxlVXBsb2FkQ29udmVydGVkU3RhdHVzLFxyXG4gIGZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXNMYWJlbHNcclxufSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvYmxvYnMnXHJcbmltcG9ydCB7IHJlc291cmNlQnVpbGRlciB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZC92aWV3ZXIvcm91dGUnXHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0RGlhbG9nQnV0dG9uIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuaW1wb3J0IHsgdXNlUGFnaW5hdGVkUXVlcnkgfSBmcm9tICd+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvZ3JhcGhxbCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgdHlwZSB7IFByb2plY3RQYWdlTW9kZWxzVXBsb2Fkc0RpYWxvZ19GaWxlVXBsb2FkRnJhZ21lbnQgfSBmcm9tICd+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbC9ncmFwaHFsJ1xyXG5pbXBvcnQgeyB2aWV3ZXJSb3V0ZSB9IGZyb20gJ34vbGliL2NvbW1vbi9oZWxwZXJzL3JvdXRlJ1xyXG5pbXBvcnQgeyB1c2VGYWlsZWRGaWxlSW1wb3J0Sm9iVXRpbHMgfSBmcm9tICd+L2xpYi9jb3JlL2NvbXBvc2FibGVzL2ZpbGVJbXBvcnQnXHJcbmltcG9ydCB7IHVzZUZpbGVEb3dubG9hZCB9IGZyb20gJ34vbGliL2NvcmUvY29tcG9zYWJsZXMvZmlsZVVwbG9hZCdcclxuaW1wb3J0IHsgcHJldHR5RmlsZVNpemUgfSBmcm9tICd+fi9saWIvY29yZS9oZWxwZXJzL2ZpbGUnXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBQcm9qZWN0UGFnZU1vZGVsc1VwbG9hZHNEaWFsb2dfRmlsZVVwbG9hZCBvbiBGaWxlVXBsb2FkIHtcclxuICAgIGlkXHJcbiAgICBjb252ZXJ0ZWRTdGF0dXNcclxuICAgIGNvbnZlcnRlZE1lc3NhZ2VcclxuICAgIGZpbGVOYW1lXHJcbiAgICBmaWxlU2l6ZVxyXG4gICAgY29udmVydGVkTGFzdFVwZGF0ZVxyXG4gICAgY29udmVydGVkVmVyc2lvbklkXHJcbiAgICB1cGxvYWREYXRlXHJcbiAgICB1cGxvYWRDb21wbGV0ZVxyXG4gICAgYnJhbmNoTmFtZVxyXG4gICAgLi4uVXNlRmFpbGVkRmlsZUltcG9ydEpvYlV0aWxzX0ZpbGVVcGxvYWRcclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBnZXRNb2RlbFVwbG9hZHNRdWVyeSA9IGdyYXBocWwoYFxyXG4gIHF1ZXJ5IEdldE1vZGVsVXBsb2FkcyhcclxuICAgICRwcm9qZWN0SWQ6IFN0cmluZyFcclxuICAgICRtb2RlbElkOiBTdHJpbmchXHJcbiAgICAkaW5wdXQ6IEdldE1vZGVsVXBsb2Fkc0lucHV0IVxyXG4gICkge1xyXG4gICAgcHJvamVjdChpZDogJHByb2plY3RJZCkge1xyXG4gICAgICBpZFxyXG4gICAgICBtb2RlbChpZDogJG1vZGVsSWQpIHtcclxuICAgICAgICBpZFxyXG4gICAgICAgIHVwbG9hZHMoaW5wdXQ6ICRpbnB1dCkge1xyXG4gICAgICAgICAgdG90YWxDb3VudFxyXG4gICAgICAgICAgY3Vyc29yXHJcbiAgICAgICAgICBpdGVtcyB7XHJcbiAgICAgICAgICAgIGlkXHJcbiAgICAgICAgICAgIC4uLlByb2plY3RQYWdlTW9kZWxzVXBsb2Fkc0RpYWxvZ19GaWxlVXBsb2FkXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgcHJvamVjdElkOiBzdHJpbmdcclxuICBtb2RlbElkOiBzdHJpbmdcclxufT4oKVxyXG5cclxuY29uc3Qgb3BlbiA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KCdvcGVuJywgeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG5jb25zdCB7IGNvcHkgfSA9IHVzZUNsaXBib2FyZCgpXHJcbmNvbnN0IHsgZm9ybWF0dGVkUmVsYXRpdmVEYXRlLCBmb3JtYXR0ZWRGdWxsRGF0ZSB9ID0gdXNlRGF0ZUZvcm1hdHRlcnMoKVxyXG5cclxuY29uc3QgeyBnZXRFcnJvck1lc3NhZ2UsIGNvbnZlcnRVcGxvYWRUb0ZhaWxlZEpvYiB9ID0gdXNlRmFpbGVkRmlsZUltcG9ydEpvYlV0aWxzKClcclxuY29uc3Qge1xyXG4gIGlkZW50aWZpZXIsXHJcbiAgb25JbmZpbml0ZUxvYWQsXHJcbiAgcXVlcnk6IHsgcmVzdWx0IH0sXHJcbiAgaXNWZXJ5Rmlyc3RMb2FkaW5nXHJcbn0gPSB1c2VQYWdpbmF0ZWRRdWVyeSh7XHJcbiAgcXVlcnk6IGdldE1vZGVsVXBsb2Fkc1F1ZXJ5LFxyXG4gIGJhc2VWYXJpYWJsZXM6IGNvbXB1dGVkKCgpID0+ICh7XHJcbiAgICBwcm9qZWN0SWQ6IHByb3BzLnByb2plY3RJZCxcclxuICAgIG1vZGVsSWQ6IHByb3BzLm1vZGVsSWQsXHJcbiAgICBpbnB1dDoge1xyXG4gICAgICBjdXJzb3I6IG51bGwgYXMgc3RyaW5nIHwgbnVsbFxyXG4gICAgfVxyXG4gIH0pKSxcclxuICBvcHRpb25zOiB7XHJcbiAgICBlbmFibGVkOiBvcGVuLFxyXG4gICAgLy8gcmVsb2FkIHF1ZXJ5IHdoZW4gZGlhbG9nIG9wZW5zXHJcbiAgICBmZXRjaFBvbGljeTogJ2NhY2hlLWFuZC1uZXR3b3JrJ1xyXG4gIH0sXHJcbiAgcmVzb2x2ZUtleTogKHZhcnMpID0+IFt2YXJzLnByb2plY3RJZCwgdmFycy5tb2RlbElkXSxcclxuICByZXNvbHZlQ3VycmVudFJlc3VsdDogKHJlcykgPT4gcmVzPy5wcm9qZWN0Lm1vZGVsLnVwbG9hZHMsXHJcbiAgcmVzb2x2ZU5leHRQYWdlVmFyaWFibGVzOiAoYmFzZVZhcnMsIGN1cnNvcikgPT4gKHtcclxuICAgIC4uLmJhc2VWYXJzLFxyXG4gICAgaW5wdXQ6IHtcclxuICAgICAgLi4uYmFzZVZhcnMuaW5wdXQsXHJcbiAgICAgIGN1cnNvclxyXG4gICAgfVxyXG4gIH0pLFxyXG4gIHJlc29sdmVDdXJzb3JGcm9tVmFyaWFibGVzOiAodmFycykgPT4gdmFycy5pbnB1dC5jdXJzb3JcclxufSlcclxuXHJcbmNvbnN0IHsgZG93bmxvYWQgfSA9IHVzZUZpbGVEb3dubG9hZCgpXHJcblxyXG5jb25zdCBpdGVtcyA9IGNvbXB1dGVkKCgpID0+IHJlc3VsdC52YWx1ZT8ucHJvamVjdC5tb2RlbC51cGxvYWRzLml0ZW1zKVxyXG5cclxuY29uc3QgYnV0dG9ucyA9IGNvbXB1dGVkKCgpOiBMYXlvdXREaWFsb2dCdXR0b25bXSA9PiBbXHJcbiAge1xyXG4gICAgdGV4dDogJ0Nsb3NlJyxcclxuICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgb3Blbi52YWx1ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5dKVxyXG5cclxuY29uc3QgZ2V0U3RhdHVzT3B0aW9ucyA9IChpdGVtOiBQcm9qZWN0UGFnZU1vZGVsc1VwbG9hZHNEaWFsb2dfRmlsZVVwbG9hZEZyYWdtZW50KSA9PiB7XHJcbiAgbGV0IGNvbG9yQ2xhc3Nlczogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXHJcbiAgc3dpdGNoIChpdGVtLmNvbnZlcnRlZFN0YXR1cykge1xyXG4gICAgY2FzZSBGaWxlVXBsb2FkQ29udmVydGVkU3RhdHVzLkVycm9yOlxyXG4gICAgICBjb2xvckNsYXNzZXMgPSAnYmctZGFuZ2VyIHRleHQtZm91bmRhdGlvbidcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgRmlsZVVwbG9hZENvbnZlcnRlZFN0YXR1cy5Db252ZXJ0aW5nOlxyXG4gICAgICBjb2xvckNsYXNzZXMgPSAnYmctcHJpbWFyeSB0ZXh0LWZvdW5kYXRpb24nXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlIEZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXMuQ29tcGxldGVkOlxyXG4gICAgICBjb2xvckNsYXNzZXMgPSAnYmctc3VjY2VzcyB0ZXh0LWZvdW5kYXRpb24nXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlIEZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXMuUXVldWVkOlxyXG4gICAgICBjb2xvckNsYXNzZXMgPSAnYmctaW5mbyB0ZXh0LWZvdW5kYXRpb24nXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgbGFiZWw6XHJcbiAgICAgIGZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXNMYWJlbHNbXHJcbiAgICAgICAgaXRlbS5jb252ZXJ0ZWRTdGF0dXMgYXMgRmlsZVVwbG9hZENvbnZlcnRlZFN0YXR1c1xyXG4gICAgICBdLFxyXG4gICAgdG9vbHRpcDpcclxuICAgICAgaXRlbS5jb252ZXJ0ZWRTdGF0dXMgPT09IEZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXMuRXJyb3JcclxuICAgICAgICA/IHtcclxuICAgICAgICAgICAgY29udGVudDpcclxuICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2UoY29udmVydFVwbG9hZFRvRmFpbGVkSm9iKGl0ZW0pKSArXHJcbiAgICAgICAgICAgICAgYCBFcnJvcjogJHtpdGVtLmNvbnZlcnRlZE1lc3NhZ2V9YFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgY29sb3JDbGFzc2VzLFxyXG4gICAgaXNFcnJvclN0YXR1czogaXRlbS5jb252ZXJ0ZWRTdGF0dXMgPT09IEZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXMuRXJyb3JcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG9uRG93bmxvYWQgPSBhc3luYyAoaXRlbTogUHJvamVjdFBhZ2VNb2RlbHNVcGxvYWRzRGlhbG9nX0ZpbGVVcGxvYWRGcmFnbWVudCkgPT4ge1xyXG4gIGF3YWl0IGRvd25sb2FkKHtcclxuICAgIGJsb2JJZDogaXRlbS5pZCxcclxuICAgIGZpbGVOYW1lOiBpdGVtLmZpbGVOYW1lLFxyXG4gICAgcHJvamVjdElkOiBwcm9wcy5wcm9qZWN0SWRcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBidWlsZFVwbG9hZGVkVmVyc2lvblVybCA9IChcclxuICBpdGVtOiBQcm9qZWN0UGFnZU1vZGVsc1VwbG9hZHNEaWFsb2dfRmlsZVVwbG9hZEZyYWdtZW50XHJcbikgPT4ge1xyXG4gIGlmICghaXRlbS5jb252ZXJ0ZWRWZXJzaW9uSWQgfHwgIWl0ZW0ubW9kZWxJZCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gIHJldHVybiB2aWV3ZXJSb3V0ZShcclxuICAgIHByb3BzLnByb2plY3RJZCxcclxuICAgIHJlc291cmNlQnVpbGRlcigpLmFkZE1vZGVsKGl0ZW0ubW9kZWxJZCwgaXRlbS5jb252ZXJ0ZWRWZXJzaW9uSWQpLnRvU3RyaW5nKClcclxuICApXHJcbn1cclxuXHJcbmNvbnN0IG9uRXJyb3JCYWRnZUNsaWNrID0gYXN5bmMgKFxyXG4gIGl0ZW06IFByb2plY3RQYWdlTW9kZWxzVXBsb2Fkc0RpYWxvZ19GaWxlVXBsb2FkRnJhZ21lbnRcclxuKSA9PiB7XHJcbiAgaWYgKGdldFN0YXR1c09wdGlvbnMoaXRlbSkuaXNFcnJvclN0YXR1cykge1xyXG4gICAgYXdhaXQgY29weShnZXRTdGF0dXNPcHRpb25zKGl0ZW0pLnRvb2x0aXA/LmNvbnRlbnQgfHwgJycsIHtcclxuICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdFcnJvciBtZXNzYWdlIGNvcGllZCdcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlIn0= |