import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/projects/ProjectDashboardCard.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/node_modules/nuxt/dist/app/components/nuxt-link.js?v=e4f18c29"; import { UserAvatarGroup as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_3 } from "/_nuxt/components/workspace/Avatar.vue"; import { default as __nuxt_component_4 } from "/_nuxt/components/project/page/models/Card.vue"; import { default as __nuxt_component_5 } from "/_nuxt/components/project/CardImportFileArea.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createBlock as __createBlock,createVNode as __createVNode,createElementBlock as __createElementBlock,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 _createBlock(...args) { return _interopVNode(__createBlock(...args)) } function _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...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 { Roles } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { FormButton } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { projectRoute, allProjectModelsRoute } from "/_nuxt/lib/common/helpers/route.ts"; import { useGeneralProjectPageUpdateTracking } from "/_nuxt/lib/projects/composables/projectPages.ts"; import { ChevronRightIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_20_solid.js?v=e4f18c29"; import { workspaceRoute } from "/_nuxt/lib/common/helpers/route.ts"; import { RoleInfo } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { getModelItemRoute } from "/_nuxt/lib/projects/helpers/models.ts"; import { useRouter } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29"; import { useIsWorkspacesEnabled } from "/_nuxt/composables/globals.ts"; import { useDateFormatters } from "/_nuxt/composables/dates.ts"; import { ref, computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ProjectsProjectDashboardCard", props: { project: { type: Object, required: true }, showWorkspaceLink: { type: Boolean, required: false }, workspacePage: { type: Boolean, required: false } }, emits: ["moveProject"], setup(__props, { expose: __expose }) { __expose(); const props = __props; const router = useRouter(); const isWorkspacesEnabled = useIsWorkspacesEnabled(); const { formattedRelativeDate, formattedFullDate } = useDateFormatters(); const isModelUploading = ref(false); const isOwner = computed(() => props.project.role === Roles.Stream.Owner); const projectId = computed(() => props.project.id); const updatedAt = computed(() => { return { full: formattedFullDate(props.project.updatedAt), relative: formattedRelativeDate(props.project.updatedAt, { prefix: true }) }; }); useGeneralProjectPageUpdateTracking( { projectId }, { redirectHomeOnProjectDeletion: false } ); const teamUsers = computed(() => props.project.team.map((t) => t.user)); const pendingModels = computed(() => props.project.pendingImportedModels); const models = computed(() => { const items = props.project.models?.items || []; return items.slice(0, Math.max(0, 3 - pendingModels.value.length)); }); const hasNoModels = computed(() => !models.value.length && !pendingModels.value.length); const modelItemTotalCount = computed( () => props.project.models.totalCount + pendingModels.value.length ); const gridClasses = computed(() => [ // Base classes "grid", "gap-2", "flex-grow", "col-span-4", "xl:col-span-3", "w-full", // Grid columns "grid-cols-1", "sm:grid-cols-2", props.workspacePage && "lg:grid-cols-1", props.workspacePage ? "xl:grid-cols-2" : "xl:grid-cols-3", props.workspacePage && "2xl:grid-cols-3", // Visibility rules "sm:[&>*:nth-child(n+3)]:hidden", props.workspacePage && "lg:[&>*:nth-child(n+2)]:hidden", props.workspacePage && "xl:[&>*:nth-child(n+2)]:block", !props.workspacePage && "xl:[&>*:nth-child(n+3)]:block", props.workspacePage && "2xl:[&>*:nth-child(n+2)]:block", "2xl:[&>*:nth-child(n+3)]:block" ]); const onModelUploading = (payload) => { isModelUploading.value = payload.isUploading; }; const __returned__ = { props, router, isWorkspacesEnabled, formattedRelativeDate, formattedFullDate, isModelUploading, isOwner, projectId, updatedAt, teamUsers, pendingModels, models, hasNoModels, modelItemTotalCount, gridClasses, onModelUploading, get FormButton() { return FormButton; }, get projectRoute() { return projectRoute; }, get allProjectModelsRoute() { return allProjectModelsRoute; }, get ChevronRightIcon() { return ChevronRightIcon; }, get workspaceRoute() { return workspaceRoute; }, get RoleInfo() { return RoleInfo; }, get getModelItemRoute() { return getModelItemRoute; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, resolveDirective as _resolveDirective, withCtx as _withCtx, openBlock as _openBlock, withDirectives as _withDirectives, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, normalizeClass as _normalizeClass } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { "data-v-inspector": "components/projects/ProjectDashboardCard.vue:2:3" }; const _hoisted_2 = { class: "relative group flex flex-col items-stretch md:flex-row md:space-x-2 border border-outline-3 rounded-xl p-4 transition bg-foundation", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:3:5" }; const _hoisted_3 = { class: "w-full md:w-56 flex flex-col justify-between col-span-3 lg:col-span-1 mb-4 md:mb-0 flex-shrink-0 space-y-1 pl-2 pr-6 py-2", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:6:7" }; const _hoisted_4 = { class: "flex flex-col", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:9:9" }; const _hoisted_5 = { class: "text-body-3xs mb-1 text-foreground-2 select-none", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:24:11" }; const _hoisted_6 = { key: 1, class: "text-body-3xs capitalize mb-2 text-foreground-2 select-none", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:31:11" }; const _hoisted_7 = { class: "pt-3", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:39:9" }; const _hoisted_8 = { class: "text-body-2xs text-foreground ml-2 line-clamp-2", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:50:13" }; const _hoisted_9 = { class: "flex gap-2", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:54:11" }; const _hoisted_10 = { key: 0, "data-v-inspector": "components/projects/ProjectDashboardCard.vue:67:13" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_CommonBadge = __nuxt_component_0; const _component_NuxtLink = __nuxt_component_1; const _component_UserAvatarGroup = __nuxt_component_2; const _component_WorkspaceAvatar = __nuxt_component_3; const _component_ProjectPageModelsCard = __nuxt_component_4; const _component_ProjectCardImportFileArea = __nuxt_component_5; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createElementBlock("div", _hoisted_1, [ _createElementVNode("div", _hoisted_2, [ _createElementVNode("div", _hoisted_3, [ _createElementVNode("div", _hoisted_4, [ !$props.project.workspace?.id && $setup.isWorkspacesEnabled && $setup.isOwner ? _withDirectives((_openBlock(), _createBlock(_component_CommonBadge, { key: 0, class: "mb-2 max-w-max", rounded: "", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:10:11" }, { default: _withCtx(() => [..._cache[1] || (_cache[1] = [ _createTextVNode( " Ready to move ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ })), [ [_directive_tippy, "As the project owner you can move this project to a workspace"] ]) : _createCommentVNode("v-if", true), _createVNode(_component_NuxtLink, { to: $setup.projectRoute($props.project.id), class: "break-words hover:text-primary text-heading mb-2", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:18:11" }, { default: _withCtx(() => [ _createTextVNode( _toDisplayString($props.project.name), 1 /* TEXT */ ) ]), _: 1 /* STABLE */ }, 8, ["to"]), _withDirectives((_openBlock(), _createElementBlock("span", _hoisted_5, [ _createTextVNode( " Updated " + _toDisplayString($setup.updatedAt.relative), 1 /* TEXT */ ) ])), [ [_directive_tippy, $setup.updatedAt.full] ]), $props.project.role ? (_openBlock(), _createElementBlock( "span", _hoisted_6, _toDisplayString($setup.RoleInfo.Stream[$props.project.role].title), 1 /* TEXT */ )) : _createCommentVNode("v-if", true), _createVNode(_component_UserAvatarGroup, { users: $setup.teamUsers, "max-count": 2, "data-v-inspector": "components/projects/ProjectDashboardCard.vue:37:11" }, null, 8, ["users"]) ]), _createElementVNode("div", _hoisted_7, [ $props.project.workspace && $props.showWorkspaceLink && $setup.isWorkspacesEnabled ? (_openBlock(), _createBlock(_component_NuxtLink, { key: 0, to: $setup.workspaceRoute($props.project.workspace.slug), class: "my-3 flex items-center", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:40:11" }, { default: _withCtx(() => [ _createVNode(_component_WorkspaceAvatar, { logo: $props.project.workspace.logo, name: $props.project.workspace.name, size: "sm", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:45:13" }, null, 8, ["logo", "name"]), _createElementVNode( "p", _hoisted_8, _toDisplayString($props.project.workspace.name), 1 /* TEXT */ ) ]), _: 1 /* STABLE */ }, 8, ["to"])) : _createCommentVNode("v-if", true), _createElementVNode("div", _hoisted_9, [ _createVNode($setup["FormButton"], { to: $setup.allProjectModelsRoute($props.project.id) + "/", size: "sm", color: "outline", "icon-right": $setup.ChevronRightIcon, "data-v-inspector": "components/projects/ProjectDashboardCard.vue:55:13" }, { default: _withCtx(() => [ _createTextVNode( _toDisplayString(`${$setup.modelItemTotalCount} ${$setup.modelItemTotalCount === 1 ? "model" : "models"}`), 1 /* TEXT */ ) ]), _: 1 /* STABLE */ }, 8, ["to", "icon-right"]), !$props.project.workspace?.id && $setup.isWorkspacesEnabled ? _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_10, [ _createVNode($setup["FormButton"], { size: "sm", color: "outline", disabled: !$setup.isOwner, onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("moveProject")), "data-v-inspector": "components/projects/ProjectDashboardCard.vue:75:15" }, { default: _withCtx(() => [..._cache[2] || (_cache[2] = [ _createTextVNode( " Move project ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["disabled"]) ])), [ [ _directive_tippy, !$setup.isOwner ? "Only the project owner can move this project into a workspace" : void 0 ] ]) : _createCommentVNode("v-if", true) ]) ]) ]), _createElementVNode( "div", { class: _normalizeClass($setup.gridClasses), "data-v-inspector": "components/projects/ProjectDashboardCard.vue:87:7" }, [ !$setup.isModelUploading ? (_openBlock(), _createElementBlock( _Fragment, { key: 0 }, [ (_openBlock(true), _createElementBlock( _Fragment, null, _renderList($setup.pendingModels, (pendingModel) => { return _openBlock(), _createBlock(_component_ProjectPageModelsCard, { key: pendingModel.id, model: pendingModel, project: $props.project, "show-versions": "", "project-id": $props.project.id, height: "h-48", "show-actions": "", "data-v-inspector": "components/projects/ProjectDashboardCard.vue:89:11" }, null, 8, ["model", "project", "project-id"]); }), 128 /* KEYED_FRAGMENT */ )), (_openBlock(true), _createElementBlock( _Fragment, null, _renderList($setup.models, (model) => { return _openBlock(), _createBlock(_component_ProjectPageModelsCard, { key: model.id, model, project: $props.project, "show-versions": "", "show-actions": "", "project-id": $props.project.id, height: "h-48", onClick: ($event) => $setup.router.push($setup.getModelItemRoute(model)), "data-v-inspector": "components/projects/ProjectDashboardCard.vue:99:11" }, null, 8, ["model", "project", "project-id", "onClick"]); }), 128 /* KEYED_FRAGMENT */ )) ], 64 /* STABLE_FRAGMENT */ )) : _createCommentVNode("v-if", true), $setup.hasNoModels || $setup.isModelUploading ? (_openBlock(), _createBlock(_component_ProjectCardImportFileArea, { key: 1, "empty-state-variant": "modelsSection", project: $props.project, class: "h-28 col-span-4", onUploading: $setup.onModelUploading, "data-v-inspector": "components/projects/ProjectDashboardCard.vue:111:9" }, null, 8, ["project"])) : _createCommentVNode("v-if", true) ], 2 /* CLASS */ ) ]) ]); } _sfc_main.__hmrId = "00852025"; 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/projects/ProjectDashboardCard.vue"]]); //# sourceMappingURL=data:application/json;base64,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ZCxhQVVFO0FBQUEsb0JBUkMsS0FBSyxNQUFNO0FBQUEsb0JBQ1g7QUFBQSxvQkFDQSxTQUFTO0FBQUEsb0JBQ1Y7QUFBQSxvQkFDQTtBQUFBLG9CQUNDLGNBQVksZUFBUTtBQUFBLG9CQUNyQixRQUFPO0FBQUEsb0JBQ04sU0FBSyxZQUFFLGNBQU8sS0FBSyx5QkFBa0IsS0FBSztBQUFBLG9CQUFJLG9CQUFpQjtBQUFBOzs7Ozs7Ozs7VUFJNUQsc0JBQWUseUNBRHZCLGFBTUU7QUFBQTtZQUpBLHVCQUFvQjtBQUFBLFlBQ25CLFNBQVM7QUFBQSxZQUNWLE9BQU07QUFBQSxZQUNMLGFBQVc7QUFBQSxZQUFrQixvQkFBaUI7QUFBQSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiUHJvamVjdERhc2hib2FyZENhcmQudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL1Byb2plY3REYXNoYm9hcmRDYXJkLnZ1ZToyOjNcIj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBncm91cCBmbGV4IGZsZXgtY29sIGl0ZW1zLXN0cmV0Y2ggbWQ6ZmxleC1yb3cgbWQ6c3BhY2UteC0yIGJvcmRlciBib3JkZXItb3V0bGluZS0zIHJvdW5kZWQteGwgcC00IHRyYW5zaXRpb24gYmctZm91bmRhdGlvblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL1Byb2plY3REYXNoYm9hcmRDYXJkLnZ1ZTozOjVcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgbWQ6dy01NiBmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiBjb2wtc3Bhbi0zIGxnOmNvbC1zcGFuLTEgbWItNCBtZDptYi0wIGZsZXgtc2hyaW5rLTAgc3BhY2UteS0xIHBsLTIgcHItNiBweS0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvUHJvamVjdERhc2hib2FyZENhcmQudnVlOjY6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL1Byb2plY3REYXNoYm9hcmRDYXJkLnZ1ZTo5OjlcIj5cclxuICAgICAgICAgIDxDb21tb25CYWRnZVxyXG4gICAgICAgICAgICB2LWlmPVwiIXByb2plY3Qud29ya3NwYWNlPy5pZCAmJiBpc1dvcmtzcGFjZXNFbmFibGVkICYmIGlzT3duZXJcIlxyXG4gICAgICAgICAgICB2LXRpcHB5PVwiJ0FzIHRoZSBwcm9qZWN0IG93bmVyIHlvdSBjYW4gbW92ZSB0aGlzIHByb2plY3QgdG8gYSB3b3Jrc3BhY2UnXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJtYi0yIG1heC13LW1heFwiXHJcbiAgICAgICAgICAgIHJvdW5kZWQgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvUHJvamVjdERhc2hib2FyZENhcmQudnVlOjEwOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgUmVhZHkgdG8gbW92ZVxyXG4gICAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICAgIDxOdXh0TGlua1xyXG4gICAgICAgICAgICA6dG89XCJwcm9qZWN0Um91dGUocHJvamVjdC5pZClcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJyZWFrLXdvcmRzIGhvdmVyOnRleHQtcHJpbWFyeSB0ZXh0LWhlYWRpbmcgbWItMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL1Byb2plY3REYXNoYm9hcmRDYXJkLnZ1ZToxODoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IHByb2plY3QubmFtZSB9fVxyXG4gICAgICAgICAgPC9OdXh0TGluaz5cclxuICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCJ1cGRhdGVkQXQuZnVsbFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTN4cyBtYi0xIHRleHQtZm9yZWdyb3VuZC0yIHNlbGVjdC1ub25lXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvUHJvamVjdERhc2hib2FyZENhcmQudnVlOjI0OjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgVXBkYXRlZFxyXG4gICAgICAgICAgICB7eyB1cGRhdGVkQXQucmVsYXRpdmUgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgIHYtaWY9XCJwcm9qZWN0LnJvbGVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtYm9keS0zeHMgY2FwaXRhbGl6ZSBtYi0yIHRleHQtZm9yZWdyb3VuZC0yIHNlbGVjdC1ub25lXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvUHJvamVjdERhc2hib2FyZENhcmQudnVlOjMxOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgUm9sZUluZm8uU3RyZWFtW3Byb2plY3Qucm9sZSBhcyBTdHJlYW1Sb2xlc10udGl0bGUgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxVc2VyQXZhdGFyR3JvdXAgOnVzZXJzPVwidGVhbVVzZXJzXCIgOm1heC1jb3VudD1cIjJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9Qcm9qZWN0RGFzaGJvYXJkQ2FyZC52dWU6Mzc6MTFcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdC0zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvUHJvamVjdERhc2hib2FyZENhcmQudnVlOjM5OjlcIj5cclxuICAgICAgICAgIDxOdXh0TGlua1xyXG4gICAgICAgICAgICB2LWlmPVwicHJvamVjdC53b3Jrc3BhY2UgJiYgc2hvd1dvcmtzcGFjZUxpbmsgJiYgaXNXb3Jrc3BhY2VzRW5hYmxlZFwiXHJcbiAgICAgICAgICAgIDp0bz1cIndvcmtzcGFjZVJvdXRlKHByb2plY3Qud29ya3NwYWNlLnNsdWcpXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJteS0zIGZsZXggaXRlbXMtY2VudGVyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvUHJvamVjdERhc2hib2FyZENhcmQudnVlOjQwOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPFdvcmtzcGFjZUF2YXRhclxyXG4gICAgICAgICAgICAgIDpsb2dvPVwicHJvamVjdC53b3Jrc3BhY2UubG9nb1wiXHJcbiAgICAgICAgICAgICAgOm5hbWU9XCJwcm9qZWN0LndvcmtzcGFjZS5uYW1lXCJcclxuICAgICAgICAgICAgICBzaXplPVwic21cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9Qcm9qZWN0RGFzaGJvYXJkQ2FyZC52dWU6NDU6MTNcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kIG1sLTIgbGluZS1jbGFtcC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvUHJvamVjdERhc2hib2FyZENhcmQudnVlOjUwOjEzXCI+XHJcbiAgICAgICAgICAgICAge3sgcHJvamVjdC53b3Jrc3BhY2UubmFtZSB9fVxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICA8L051eHRMaW5rPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9Qcm9qZWN0RGFzaGJvYXJkQ2FyZC52dWU6NTQ6MTFcIj5cclxuICAgICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgICA6dG89XCJhbGxQcm9qZWN0TW9kZWxzUm91dGUocHJvamVjdC5pZCkgKyAnLydcIlxyXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgICA6aWNvbi1yaWdodD1cIkNoZXZyb25SaWdodEljb25cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9Qcm9qZWN0RGFzaGJvYXJkQ2FyZC52dWU6NTU6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgIGAke21vZGVsSXRlbVRvdGFsQ291bnR9ICR7XHJcbiAgICAgICAgICAgICAgICAgIG1vZGVsSXRlbVRvdGFsQ291bnQgPT09IDEgPyAnbW9kZWwnIDogJ21vZGVscydcclxuICAgICAgICAgICAgICAgIH1gXHJcbiAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgdi1pZj1cIiFwcm9qZWN0LndvcmtzcGFjZT8uaWQgJiYgaXNXb3Jrc3BhY2VzRW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgdi10aXBweT1cIlxyXG4gICAgICAgICAgICAgICAgIWlzT3duZXJcclxuICAgICAgICAgICAgICAgICAgPyAnT25seSB0aGUgcHJvamVjdCBvd25lciBjYW4gbW92ZSB0aGlzIHByb2plY3QgaW50byBhIHdvcmtzcGFjZSdcclxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9Qcm9qZWN0RGFzaGJvYXJkQ2FyZC52dWU6Njc6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiIWlzT3duZXJcIlxyXG4gICAgICAgICAgICAgICAgQGNsaWNrPVwiJGVtaXQoJ21vdmVQcm9qZWN0JylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9Qcm9qZWN0RGFzaGJvYXJkQ2FyZC52dWU6NzU6MTVcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIE1vdmUgcHJvamVjdFxyXG4gICAgICAgICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgOmNsYXNzPVwiZ3JpZENsYXNzZXNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9Qcm9qZWN0RGFzaGJvYXJkQ2FyZC52dWU6ODc6N1wiPlxyXG4gICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiIWlzTW9kZWxVcGxvYWRpbmdcIj5cclxuICAgICAgICAgIDxQcm9qZWN0UGFnZU1vZGVsc0NhcmRcclxuICAgICAgICAgICAgdi1mb3I9XCJwZW5kaW5nTW9kZWwgaW4gcGVuZGluZ01vZGVsc1wiXHJcbiAgICAgICAgICAgIDprZXk9XCJwZW5kaW5nTW9kZWwuaWRcIlxyXG4gICAgICAgICAgICA6bW9kZWw9XCJwZW5kaW5nTW9kZWxcIlxyXG4gICAgICAgICAgICA6cHJvamVjdD1cInByb2plY3RcIlxyXG4gICAgICAgICAgICBzaG93LXZlcnNpb25zXHJcbiAgICAgICAgICAgIDpwcm9qZWN0LWlkPVwicHJvamVjdC5pZFwiXHJcbiAgICAgICAgICAgIGhlaWdodD1cImgtNDhcIlxyXG4gICAgICAgICAgICBzaG93LWFjdGlvbnMgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvUHJvamVjdERhc2hib2FyZENhcmQudnVlOjg5OjExXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8UHJvamVjdFBhZ2VNb2RlbHNDYXJkXHJcbiAgICAgICAgICAgIHYtZm9yPVwibW9kZWwgaW4gbW9kZWxzXCJcclxuICAgICAgICAgICAgOmtleT1cIm1vZGVsLmlkXCJcclxuICAgICAgICAgICAgOm1vZGVsPVwibW9kZWxcIlxyXG4gICAgICAgICAgICA6cHJvamVjdD1cInByb2plY3RcIlxyXG4gICAgICAgICAgICBzaG93LXZlcnNpb25zXHJcbiAgICAgICAgICAgIHNob3ctYWN0aW9uc1xyXG4gICAgICAgICAgICA6cHJvamVjdC1pZD1cInByb2plY3QuaWRcIlxyXG4gICAgICAgICAgICBoZWlnaHQ9XCJoLTQ4XCJcclxuICAgICAgICAgICAgQGNsaWNrPVwicm91dGVyLnB1c2goZ2V0TW9kZWxJdGVtUm91dGUobW9kZWwpKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL1Byb2plY3REYXNoYm9hcmRDYXJkLnZ1ZTo5OToxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPFByb2plY3RDYXJkSW1wb3J0RmlsZUFyZWFcclxuICAgICAgICAgIHYtaWY9XCJoYXNOb01vZGVscyB8fCBpc01vZGVsVXBsb2FkaW5nXCJcclxuICAgICAgICAgIGVtcHR5LXN0YXRlLXZhcmlhbnQ9XCJtb2RlbHNTZWN0aW9uXCJcclxuICAgICAgICAgIDpwcm9qZWN0PVwicHJvamVjdFwiXHJcbiAgICAgICAgICBjbGFzcz1cImgtMjggY29sLXNwYW4tNFwiXHJcbiAgICAgICAgICBAdXBsb2FkaW5nPVwib25Nb2RlbFVwbG9hZGluZ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL1Byb2plY3REYXNoYm9hcmRDYXJkLnZ1ZToxMTE6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBsYW5nPVwidHNcIiBzZXR1cD5cclxuaW1wb3J0IHsgUm9sZXMgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IEZvcm1CdXR0b24gfSBmcm9tICdAc3BlY2tsZS91aS1jb21wb25lbnRzJ1xyXG5pbXBvcnQgdHlwZSB7IFByb2plY3REYXNoYm9hcmRJdGVtRnJhZ21lbnQgfSBmcm9tICd+fi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwvZ3JhcGhxbCdcclxuaW1wb3J0IHsgcHJvamVjdFJvdXRlLCBhbGxQcm9qZWN0TW9kZWxzUm91dGUgfSBmcm9tICd+fi9saWIvY29tbW9uL2hlbHBlcnMvcm91dGUnXHJcbmltcG9ydCB7IHVzZUdlbmVyYWxQcm9qZWN0UGFnZVVwZGF0ZVRyYWNraW5nIH0gZnJvbSAnfn4vbGliL3Byb2plY3RzL2NvbXBvc2FibGVzL3Byb2plY3RQYWdlcydcclxuaW1wb3J0IHsgQ2hldnJvblJpZ2h0SWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzIwL3NvbGlkJ1xyXG5pbXBvcnQgeyB3b3Jrc3BhY2VSb3V0ZSB9IGZyb20gJ34vbGliL2NvbW1vbi9oZWxwZXJzL3JvdXRlJ1xyXG5pbXBvcnQgeyBSb2xlSW5mbywgdHlwZSBTdHJlYW1Sb2xlcyB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHR5cGUgeyBGaWxlQXJlYVVwbG9hZGluZ1BheWxvYWQgfSBmcm9tICd+L2xpYi9mb3JtL2hlbHBlcnMvZmlsZVVwbG9hZCdcclxuaW1wb3J0IHsgZ2V0TW9kZWxJdGVtUm91dGUgfSBmcm9tICd+L2xpYi9wcm9qZWN0cy9oZWxwZXJzL21vZGVscydcclxuXHJcbmRlZmluZUVtaXRzPHtcclxuICAoZTogJ21vdmVQcm9qZWN0Jyk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgcHJvamVjdDogUHJvamVjdERhc2hib2FyZEl0ZW1GcmFnbWVudFxyXG4gIHNob3dXb3Jrc3BhY2VMaW5rPzogYm9vbGVhblxyXG4gIHdvcmtzcGFjZVBhZ2U/OiBib29sZWFuXHJcbn0+KClcclxuXHJcbmNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpXHJcbmNvbnN0IGlzV29ya3NwYWNlc0VuYWJsZWQgPSB1c2VJc1dvcmtzcGFjZXNFbmFibGVkKClcclxuY29uc3QgeyBmb3JtYXR0ZWRSZWxhdGl2ZURhdGUsIGZvcm1hdHRlZEZ1bGxEYXRlIH0gPSB1c2VEYXRlRm9ybWF0dGVycygpXHJcblxyXG5jb25zdCBpc01vZGVsVXBsb2FkaW5nID0gcmVmKGZhbHNlKVxyXG5cclxuY29uc3QgaXNPd25lciA9IGNvbXB1dGVkKCgpID0+IHByb3BzLnByb2plY3Qucm9sZSA9PT0gUm9sZXMuU3RyZWFtLk93bmVyKVxyXG5jb25zdCBwcm9qZWN0SWQgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy5wcm9qZWN0LmlkKVxyXG5jb25zdCB1cGRhdGVkQXQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGZ1bGw6IGZvcm1hdHRlZEZ1bGxEYXRlKHByb3BzLnByb2plY3QudXBkYXRlZEF0KSxcclxuICAgIHJlbGF0aXZlOiBmb3JtYXR0ZWRSZWxhdGl2ZURhdGUocHJvcHMucHJvamVjdC51cGRhdGVkQXQsIHsgcHJlZml4OiB0cnVlIH0pXHJcbiAgfVxyXG59KVxyXG5cclxuLy8gVHJhY2tpbmcgdXBkYXRlcyB0byBwcm9qZWN0LCBpdHMgbW9kZWxzIGFuZCB2ZXJzaW9uc1xyXG51c2VHZW5lcmFsUHJvamVjdFBhZ2VVcGRhdGVUcmFja2luZyhcclxuICB7IHByb2plY3RJZCB9LFxyXG4gIHsgcmVkaXJlY3RIb21lT25Qcm9qZWN0RGVsZXRpb246IGZhbHNlIH1cclxuKVxyXG5cclxuY29uc3QgdGVhbVVzZXJzID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMucHJvamVjdC50ZWFtLm1hcCgodCkgPT4gdC51c2VyKSlcclxuY29uc3QgcGVuZGluZ01vZGVscyA9IGNvbXB1dGVkKCgpID0+IHByb3BzLnByb2plY3QucGVuZGluZ0ltcG9ydGVkTW9kZWxzKVxyXG5jb25zdCBtb2RlbHMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgaXRlbXMgPSBwcm9wcy5wcm9qZWN0Lm1vZGVscz8uaXRlbXMgfHwgW11cclxuICByZXR1cm4gaXRlbXMuc2xpY2UoMCwgTWF0aC5tYXgoMCwgMyAtIHBlbmRpbmdNb2RlbHMudmFsdWUubGVuZ3RoKSlcclxufSlcclxuXHJcbmNvbnN0IGhhc05vTW9kZWxzID0gY29tcHV0ZWQoKCkgPT4gIW1vZGVscy52YWx1ZS5sZW5ndGggJiYgIXBlbmRpbmdNb2RlbHMudmFsdWUubGVuZ3RoKVxyXG5jb25zdCBtb2RlbEl0ZW1Ub3RhbENvdW50ID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMucHJvamVjdC5tb2RlbHMudG90YWxDb3VudCArIHBlbmRpbmdNb2RlbHMudmFsdWUubGVuZ3RoXHJcbilcclxuXHJcbmNvbnN0IGdyaWRDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4gW1xyXG4gIC8vIEJhc2UgY2xhc3Nlc1xyXG4gICdncmlkJyxcclxuICAnZ2FwLTInLFxyXG4gICdmbGV4LWdyb3cnLFxyXG4gICdjb2wtc3Bhbi00JyxcclxuICAneGw6Y29sLXNwYW4tMycsXHJcbiAgJ3ctZnVsbCcsXHJcblxyXG4gIC8vIEdyaWQgY29sdW1uc1xyXG4gICdncmlkLWNvbHMtMScsXHJcbiAgJ3NtOmdyaWQtY29scy0yJyxcclxuICBwcm9wcy53b3Jrc3BhY2VQYWdlICYmICdsZzpncmlkLWNvbHMtMScsXHJcbiAgcHJvcHMud29ya3NwYWNlUGFnZSA/ICd4bDpncmlkLWNvbHMtMicgOiAneGw6Z3JpZC1jb2xzLTMnLFxyXG4gIHByb3BzLndvcmtzcGFjZVBhZ2UgJiYgJzJ4bDpncmlkLWNvbHMtMycsXHJcblxyXG4gIC8vIFZpc2liaWxpdHkgcnVsZXNcclxuICAnc206WyY+KjpudGgtY2hpbGQobiszKV06aGlkZGVuJyxcclxuICBwcm9wcy53b3Jrc3BhY2VQYWdlICYmICdsZzpbJj4qOm50aC1jaGlsZChuKzIpXTpoaWRkZW4nLFxyXG4gIHByb3BzLndvcmtzcGFjZVBhZ2UgJiYgJ3hsOlsmPio6bnRoLWNoaWxkKG4rMildOmJsb2NrJyxcclxuICAhcHJvcHMud29ya3NwYWNlUGFnZSAmJiAneGw6WyY+KjpudGgtY2hpbGQobiszKV06YmxvY2snLFxyXG4gIHByb3BzLndvcmtzcGFjZVBhZ2UgJiYgJzJ4bDpbJj4qOm50aC1jaGlsZChuKzIpXTpibG9jaycsXHJcbiAgJzJ4bDpbJj4qOm50aC1jaGlsZChuKzMpXTpibG9jaydcclxuXSlcclxuXHJcbmNvbnN0IG9uTW9kZWxVcGxvYWRpbmcgPSAocGF5bG9hZDogRmlsZUFyZWFVcGxvYWRpbmdQYXlsb2FkKSA9PiB7XHJcbiAgaXNNb2RlbFVwbG9hZGluZy52YWx1ZSA9IHBheWxvYWQuaXNVcGxvYWRpbmdcclxufVxyXG48L3NjcmlwdD5cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2NvbXBvbmVudHMvcHJvamVjdHMvUHJvamVjdERhc2hib2FyZENhcmQudnVlIn0=