Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_000169
T

244 lines
23 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/anchored-point/thread/CommentAttachments.vue");import { LayoutDialog as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
/* Injection by vite-plugin-vue-inspector Start */
import { createElementBlock as __createElementBlock,createVNode as __createVNode,createElementVNode as __createElementVNode } 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 _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
/* Injection by vite-plugin-vue-inspector End */
import { defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { ensureError } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import { prettyFileSize } from "/_nuxt/lib/core/helpers/file.ts";
import { useFileDownload } from "/_nuxt/lib/core/composables/fileUpload.ts";
import { ToastNotificationType, useGlobalToast } from "/_nuxt/lib/common/composables/toast.ts";
import { Download, Paperclip, TriangleAlert } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29";
import { ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ViewerAnchoredPointThreadCommentAttachments",
props: {
attachments: { type: Object, required: true },
projectId: { type: String, required: true }
},
setup(__props, { expose: __expose }) {
__expose();
graphql(`
fragment ThreadCommentAttachment on Comment {
text {
attachments {
id
fileName
fileType
fileSize
}
}
}
`);
const props = __props;
const { getBlobUrl, download } = useFileDownload();
const { triggerNotification } = useGlobalToast();
const dialogOpen = ref(false);
const dialogAttachment = ref(null);
const dialogAttachmentError = ref(null);
const dialogAttachmentObjectUrl = ref(null);
const isImage = (attachment) => {
switch (attachment.fileType) {
case "jpg":
case "jpeg":
case "png":
case "gif":
return true;
default:
return false;
}
};
const onAttachmentClick = (attachment) => {
dialogAttachment.value = attachment;
dialogOpen.value = true;
};
const onDownloadClick = async () => {
if (!dialogAttachment.value) return;
try {
const { id, fileName } = dialogAttachment.value;
await download({ blobId: id, fileName, projectId: props.projectId });
} catch (e) {
triggerNotification({
type: ToastNotificationType.Danger,
title: "Download failed",
description: ensureError(e).message
});
}
};
const attachmentList = computed(() => props.attachments?.text?.attachments || []);
const dialogButtons = computed(() => {
if (!dialogAttachment.value) return void 0;
const button = {
text: dialogAttachment.value.fileSize ? prettyFileSize(dialogAttachment.value.fileSize) : "Download",
props: {
iconLeft: Download,
color: "outline"
},
onClick: () => {
onDownloadClick();
}
};
return [button];
});
watch(dialogOpen, (newIsOpen) => {
if (!newIsOpen) {
dialogAttachmentError.value = null;
if (dialogAttachmentObjectUrl.value) {
URL.revokeObjectURL(dialogAttachmentObjectUrl.value);
dialogAttachmentObjectUrl.value = null;
}
} else if (dialogAttachment.value) {
if (isImage(dialogAttachment.value)) {
getBlobUrl({ blobId: dialogAttachment.value.id, projectId: props.projectId }).then((url) => {
dialogAttachmentObjectUrl.value = url;
}).catch((err) => {
dialogAttachmentError.value = ensureError(err);
});
}
}
});
const __returned__ = { props, getBlobUrl, download, triggerNotification, dialogOpen, dialogAttachment, dialogAttachmentError, dialogAttachmentObjectUrl, isImage, onAttachmentClick, onDownloadClick, attachmentList, dialogButtons, get Paperclip() {
return Paperclip;
}, get TriangleAlert() {
return TriangleAlert;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, toDisplayString as _toDisplayString, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = { "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:2:3" };
const _hoisted_2 = {
key: 0,
class: "flex flex-col gap-y-1 pt-2",
"data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:3:5"
};
const _hoisted_3 = ["onClick"];
const _hoisted_4 = {
class: "truncate relative text-body-3xs",
"data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:11:9"
};
const _hoisted_5 = {
key: 0,
class: "flex flex-col space-y-2",
"data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:22:9"
};
const _hoisted_6 = {
class: "flex justify-center text-foreground text-body-xs py-4",
"data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:23:11"
};
const _hoisted_7 = {
key: 0,
class: "inline-flex space-x-2 items-center",
"data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:24:13"
};
const _hoisted_8 = ["src"];
const _hoisted_9 = {
key: 2,
class: "inline-flex space-x-4 items-center",
"data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:36:15"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_LayoutDialog = __nuxt_component_0;
return _openBlock(), _createElementBlock("div", _hoisted_1, [
$setup.attachmentList.length > 0 ? (_openBlock(), _createElementBlock("div", _hoisted_2, [
(_openBlock(true), _createElementBlock(
_Fragment,
null,
_renderList($setup.attachmentList, (attachment) => {
return _openBlock(), _createElementBlock("button", {
key: attachment.id,
class: "text-foreground hover:text-foreground-2 flex items-center gap-x-1",
onClick: () => $setup.onAttachmentClick(attachment),
"data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:4:7"
}, [
_createVNode($setup["Paperclip"], {
class: "size-3",
"data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:10:9"
}),
_createElementVNode(
"span",
_hoisted_4,
_toDisplayString(attachment.fileName),
1
/* TEXT */
)
], 8, _hoisted_3);
}),
128
/* KEYED_FRAGMENT */
))
])) : _createCommentVNode("v-if", true),
_createVNode(_component_LayoutDialog, {
open: $setup.dialogOpen,
"onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.dialogOpen = $event),
"max-width": "lg",
buttons: $setup.dialogButtons,
"data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:17:5"
}, {
header: _withCtx(() => [
_createTextVNode(
_toDisplayString($setup.dialogAttachment ? $setup.dialogAttachment.fileName : "Attachment"),
1
/* TEXT */
)
]),
default: _withCtx(() => [
$setup.dialogAttachment ? (_openBlock(), _createElementBlock("div", _hoisted_5, [
_createElementVNode("div", _hoisted_6, [
$setup.dialogAttachmentError ? (_openBlock(), _createElementBlock("span", _hoisted_7, " Failed to load attachment preview ")) : $setup.isImage($setup.dialogAttachment) && $setup.dialogAttachmentObjectUrl ? (_openBlock(), _createElementBlock("img", {
key: 1,
src: $setup.dialogAttachmentObjectUrl,
alt: "Attachment preview",
"data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:33:15"
}, null, 8, _hoisted_8)) : (_openBlock(), _createElementBlock("span", _hoisted_9, [
_createVNode($setup["TriangleAlert"], {
class: "w-6 h-6",
"data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:37:17"
}),
_cache[1] || (_cache[1] = _createElementVNode(
"span",
{ "data-v-inspector": "components/viewer/anchored-point/thread/CommentAttachments.vue:38:17" },
" Please note: This file is user-uploaded and has not been scanned for security. Download at your own discretion. ",
-1
/* CACHED */
))
]))
])
])) : _createCommentVNode("v-if", true)
]),
_: 1
/* STABLE */
}, 8, ["open", "buttons"])
]);
}
_sfc_main.__hmrId = "6effd946";
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/viewer/anchored-point/thread/CommentAttachments.vue"]]);
//# sourceMappingURL=data:application/json;base64,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WUFNTztBQUFBLGNBTEwsYUFBeUg7QUFBQSxnQkFBMUcsT0FBTTtBQUFBLGdCQUFVLG9CQUFpQjtBQUFBO3dDQUNoRDtBQUFBLGdCQUdPO0FBQUEsa0JBSEQsb0JBQWlCLHVFQUFzRTtBQUFBLGdCQUFDO0FBQUEsZ0JBRzlGO0FBQUE7QUFBQTtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJDb21tZW50QXR0YWNobWVudHMudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC90aHJlYWQvQ29tbWVudEF0dGFjaG1lbnRzLnZ1ZToyOjNcIj5cclxuICAgIDxkaXYgdi1pZj1cImF0dGFjaG1lbnRMaXN0Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLXktMSBwdC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L3RocmVhZC9Db21tZW50QXR0YWNobWVudHMudnVlOjM6NVwiPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdi1mb3I9XCJhdHRhY2htZW50IGluIGF0dGFjaG1lbnRMaXN0XCJcclxuICAgICAgICA6a2V5PVwiYXR0YWNobWVudC5pZFwiXHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kLTIgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMVwiXHJcbiAgICAgICAgQGNsaWNrPVwiKCkgPT4gb25BdHRhY2htZW50Q2xpY2soYXR0YWNobWVudClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6NDo3XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxQYXBlcmNsaXAgY2xhc3M9XCJzaXplLTNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6MTA6OVwiIC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZSByZWxhdGl2ZSB0ZXh0LWJvZHktM3hzXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L3RocmVhZC9Db21tZW50QXR0YWNobWVudHMudnVlOjExOjlcIj5cclxuICAgICAgICAgIHt7IGF0dGFjaG1lbnQuZmlsZU5hbWUgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPExheW91dERpYWxvZyB2LW1vZGVsOm9wZW49XCJkaWFsb2dPcGVuXCIgbWF4LXdpZHRoPVwibGdcIiA6YnV0dG9ucz1cImRpYWxvZ0J1dHRvbnNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6MTc6NVwiPlxyXG4gICAgICA8dGVtcGxhdGUgI2hlYWRlcj5cclxuICAgICAgICB7eyBkaWFsb2dBdHRhY2htZW50ID8gZGlhbG9nQXR0YWNobWVudC5maWxlTmFtZSA6ICdBdHRhY2htZW50JyB9fVxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cImRpYWxvZ0F0dGFjaG1lbnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBzcGFjZS15LTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6MjI6OVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgdGV4dC1mb3JlZ3JvdW5kIHRleHQtYm9keS14cyBweS00XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L3RocmVhZC9Db21tZW50QXR0YWNobWVudHMudnVlOjIzOjExXCI+XHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgdi1pZj1cImRpYWxvZ0F0dGFjaG1lbnRFcnJvclwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBzcGFjZS14LTIgaXRlbXMtY2VudGVyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L3RocmVhZC9Db21tZW50QXR0YWNobWVudHMudnVlOjI0OjEzXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIEZhaWxlZCB0byBsb2FkIGF0dGFjaG1lbnQgcHJldmlld1xyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDx0ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgIHYtZWxzZS1pZj1cImlzSW1hZ2UoZGlhbG9nQXR0YWNobWVudCkgJiYgZGlhbG9nQXR0YWNobWVudE9iamVjdFVybFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8aW1nIDpzcmM9XCJkaWFsb2dBdHRhY2htZW50T2JqZWN0VXJsXCIgYWx0PVwiQXR0YWNobWVudCBwcmV2aWV3XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L3RocmVhZC9Db21tZW50QXR0YWNobWVudHMudnVlOjMzOjE1XCIgLz5cclxuICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPHRlbXBsYXRlIHYtZWxzZT5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlubGluZS1mbGV4IHNwYWNlLXgtNCBpdGVtcy1jZW50ZXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6MzY6MTVcIj5cclxuICAgICAgICAgICAgICAgIDxUcmlhbmdsZUFsZXJ0IGNsYXNzPVwidy02IGgtNlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC90aHJlYWQvQ29tbWVudEF0dGFjaG1lbnRzLnZ1ZTozNzoxN1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWU6Mzg6MTdcIj5cclxuICAgICAgICAgICAgICAgICAgUGxlYXNlIG5vdGU6IFRoaXMgZmlsZSBpcyB1c2VyLXVwbG9hZGVkIGFuZCBoYXMgbm90IGJlZW4gc2Nhbm5lZCBmb3JcclxuICAgICAgICAgICAgICAgICAgc2VjdXJpdHkuIERvd25sb2FkIGF0IHlvdXIgb3duIGRpc2NyZXRpb24uXHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8L0xheW91dERpYWxvZz5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHR5cGUgeyBHZXQgfSBmcm9tICd0eXBlLWZlc3QnXHJcbmltcG9ydCB7IGVuc3VyZUVycm9yIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHR5cGUgeyBUaHJlYWRDb21tZW50QXR0YWNobWVudEZyYWdtZW50IH0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB7IHByZXR0eUZpbGVTaXplIH0gZnJvbSAnfn4vbGliL2NvcmUvaGVscGVycy9maWxlJ1xyXG5pbXBvcnQgeyB1c2VGaWxlRG93bmxvYWQgfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9maWxlVXBsb2FkJ1xyXG5pbXBvcnQgeyBUb2FzdE5vdGlmaWNhdGlvblR5cGUsIHVzZUdsb2JhbFRvYXN0IH0gZnJvbSAnfn4vbGliL2NvbW1vbi9jb21wb3NhYmxlcy90b2FzdCdcclxuaW1wb3J0IHR5cGUgeyBMYXlvdXREaWFsb2dCdXR0b24gfSBmcm9tICdAc3BlY2tsZS91aS1jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyBEb3dubG9hZCwgUGFwZXJjbGlwLCBUcmlhbmdsZUFsZXJ0IH0gZnJvbSAnbHVjaWRlLXZ1ZS1uZXh0J1xyXG5cclxudHlwZSBBdHRhY2htZW50RmlsZSA9IE5vbk51bGxhYmxlPFxyXG4gIEdldDxUaHJlYWRDb21tZW50QXR0YWNobWVudEZyYWdtZW50LCAndGV4dC5hdHRhY2htZW50c1swXSc+XHJcbj5cclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFRocmVhZENvbW1lbnRBdHRhY2htZW50IG9uIENvbW1lbnQge1xyXG4gICAgdGV4dCB7XHJcbiAgICAgIGF0dGFjaG1lbnRzIHtcclxuICAgICAgICBpZFxyXG4gICAgICAgIGZpbGVOYW1lXHJcbiAgICAgICAgZmlsZVR5cGVcclxuICAgICAgICBmaWxlU2l6ZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgYXR0YWNobWVudHM6IFRocmVhZENvbW1lbnRBdHRhY2htZW50RnJhZ21lbnRcclxuICBwcm9qZWN0SWQ6IHN0cmluZ1xyXG59PigpXHJcblxyXG5jb25zdCB7IGdldEJsb2JVcmwsIGRvd25sb2FkIH0gPSB1c2VGaWxlRG93bmxvYWQoKVxyXG5jb25zdCB7IHRyaWdnZXJOb3RpZmljYXRpb24gfSA9IHVzZUdsb2JhbFRvYXN0KClcclxuXHJcbmNvbnN0IGRpYWxvZ09wZW4gPSByZWYoZmFsc2UpXHJcbmNvbnN0IGRpYWxvZ0F0dGFjaG1lbnQgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxBdHRhY2htZW50RmlsZT4pXHJcbmNvbnN0IGRpYWxvZ0F0dGFjaG1lbnRFcnJvciA9IHJlZihudWxsIGFzIE51bGxhYmxlPEVycm9yPilcclxuY29uc3QgZGlhbG9nQXR0YWNobWVudE9iamVjdFVybCA9IHJlZihudWxsIGFzIE51bGxhYmxlPHN0cmluZz4pXHJcblxyXG5jb25zdCBpc0ltYWdlID0gKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRGaWxlKSA9PiB7XHJcbiAgc3dpdGNoIChhdHRhY2htZW50LmZpbGVUeXBlKSB7XHJcbiAgICBjYXNlICdqcGcnOlxyXG4gICAgY2FzZSAnanBlZyc6XHJcbiAgICBjYXNlICdwbmcnOlxyXG4gICAgY2FzZSAnZ2lmJzpcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgb25BdHRhY2htZW50Q2xpY2sgPSAoYXR0YWNobWVudDogQXR0YWNobWVudEZpbGUpID0+IHtcclxuICBkaWFsb2dBdHRhY2htZW50LnZhbHVlID0gYXR0YWNobWVudFxyXG4gIGRpYWxvZ09wZW4udmFsdWUgPSB0cnVlXHJcbn1cclxuXHJcbmNvbnN0IG9uRG93bmxvYWRDbGljayA9IGFzeW5jICgpID0+IHtcclxuICBpZiAoIWRpYWxvZ0F0dGFjaG1lbnQudmFsdWUpIHJldHVyblxyXG5cclxuICB0cnkge1xyXG4gICAgY29uc3QgeyBpZCwgZmlsZU5hbWUgfSA9IGRpYWxvZ0F0dGFjaG1lbnQudmFsdWVcclxuICAgIGF3YWl0IGRvd25sb2FkKHsgYmxvYklkOiBpZCwgZmlsZU5hbWUsIHByb2plY3RJZDogcHJvcHMucHJvamVjdElkIH0pXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgdHJpZ2dlck5vdGlmaWNhdGlvbih7XHJcbiAgICAgIHR5cGU6IFRvYXN0Tm90aWZpY2F0aW9uVHlwZS5EYW5nZXIsXHJcbiAgICAgIHRpdGxlOiAnRG93bmxvYWQgZmFpbGVkJyxcclxuICAgICAgZGVzY3JpcHRpb246IGVuc3VyZUVycm9yKGUpLm1lc3NhZ2VcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBhdHRhY2htZW50TGlzdCA9IGNvbXB1dGVkKCgpID0+IHByb3BzLmF0dGFjaG1lbnRzPy50ZXh0Py5hdHRhY2htZW50cyB8fCBbXSlcclxuXHJcbmNvbnN0IGRpYWxvZ0J1dHRvbnMgPSBjb21wdXRlZCgoKTogT3B0aW9uYWw8TGF5b3V0RGlhbG9nQnV0dG9uW10+ID0+IHtcclxuICBpZiAoIWRpYWxvZ0F0dGFjaG1lbnQudmFsdWUpIHJldHVybiB1bmRlZmluZWRcclxuXHJcbiAgY29uc3QgYnV0dG9uOiBMYXlvdXREaWFsb2dCdXR0b24gPSB7XHJcbiAgICB0ZXh0OiBkaWFsb2dBdHRhY2htZW50LnZhbHVlLmZpbGVTaXplXHJcbiAgICAgID8gcHJldHR5RmlsZVNpemUoZGlhbG9nQXR0YWNobWVudC52YWx1ZS5maWxlU2l6ZSlcclxuICAgICAgOiAnRG93bmxvYWQnLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgaWNvbkxlZnQ6IERvd25sb2FkLFxyXG4gICAgICBjb2xvcjogJ291dGxpbmUnXHJcbiAgICB9LFxyXG4gICAgb25DbGljazogKCkgPT4ge1xyXG4gICAgICBvbkRvd25sb2FkQ2xpY2soKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIFtidXR0b25dXHJcbn0pXHJcblxyXG53YXRjaChkaWFsb2dPcGVuLCAobmV3SXNPcGVuKSA9PiB7XHJcbiAgaWYgKCFuZXdJc09wZW4pIHtcclxuICAgIGRpYWxvZ0F0dGFjaG1lbnRFcnJvci52YWx1ZSA9IG51bGxcclxuXHJcbiAgICBpZiAoZGlhbG9nQXR0YWNobWVudE9iamVjdFVybC52YWx1ZSkge1xyXG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGRpYWxvZ0F0dGFjaG1lbnRPYmplY3RVcmwudmFsdWUpXHJcbiAgICAgIGRpYWxvZ0F0dGFjaG1lbnRPYmplY3RVcmwudmFsdWUgPSBudWxsXHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChkaWFsb2dBdHRhY2htZW50LnZhbHVlKSB7XHJcbiAgICBpZiAoaXNJbWFnZShkaWFsb2dBdHRhY2htZW50LnZhbHVlKSkge1xyXG4gICAgICBnZXRCbG9iVXJsKHsgYmxvYklkOiBkaWFsb2dBdHRhY2htZW50LnZhbHVlLmlkLCBwcm9qZWN0SWQ6IHByb3BzLnByb2plY3RJZCB9KVxyXG4gICAgICAgIC50aGVuKCh1cmwpID0+IHtcclxuICAgICAgICAgIGRpYWxvZ0F0dGFjaG1lbnRPYmplY3RVcmwudmFsdWUgPSB1cmxcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICBkaWFsb2dBdHRhY2htZW50RXJyb3IudmFsdWUgPSBlbnN1cmVFcnJvcihlcnIpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbn0pXHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvdGhyZWFkL0NvbW1lbnRBdHRhY2htZW50cy52dWUifQ==