328 lines
32 KiB
Plaintext
328 lines
32 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/workspace/moveProject/SelectWorkspace.vue");import { CommonLoadingIcon as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { CommonBadge as __nuxt_component_1 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { default as __nuxt_component_2 } from "/_nuxt/components/workspace/Card.vue";
|
|
import { default as __nuxt_component_3 } from "/_nuxt/components/workspace/plan/ProjectModelLimitReachedDialog.vue";
|
|
/* Injection by vite-plugin-vue-inspector Start */
|
|
import { createVNode as __createVNode,createElementBlock as __createElementBlock,createElementVNode as __createElementVNode,createBlock as __createBlock } 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 _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
|
|
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
|
|
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
|
|
function _createBlock(...args) { return _interopVNode(__createBlock(...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 { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
|
|
import { useQuery } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
|
|
import { UserAvatarGroup } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { workspaceMoveProjectManagerUserQuery } from "/_nuxt/lib/workspaces/graphql/queries.ts";
|
|
import { formatName } from "/_nuxt/lib/billing/helpers/plan.ts";
|
|
import { Roles } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
|
|
import {
|
|
WorkspaceLimitsReachedError,
|
|
WorkspaceSsoSessionNoAccessError
|
|
} from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/authz/index.js";
|
|
|
|
import { computed, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "WorkspaceMoveProjectSelectWorkspace",
|
|
props: {
|
|
project: { type: null, required: true },
|
|
checker: { type: Function, required: true },
|
|
subheading: { type: String, required: false }
|
|
},
|
|
emits: ["workspace-selected"],
|
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
__expose();
|
|
graphql(`
|
|
fragment WorkspaceMoveProjectSelectWorkspace_Workspace on Workspace {
|
|
id
|
|
name
|
|
role
|
|
slug
|
|
plan {
|
|
name
|
|
}
|
|
permissions {
|
|
canMoveProjectToWorkspace(projectId: $projectId) {
|
|
...FullPermissionCheckResult
|
|
}
|
|
canCreateProject {
|
|
...FullPermissionCheckResult
|
|
}
|
|
}
|
|
}
|
|
`);
|
|
graphql(`
|
|
fragment WorkspaceMoveProjectSelectWorkspace_User on User {
|
|
workspaces {
|
|
items {
|
|
...WorkspaceMoveProjectManager_Workspace
|
|
}
|
|
}
|
|
projects(cursor: $cursor, filter: $filter, sortBy: $sortBy) {
|
|
items {
|
|
...WorkspaceMoveProjectManager_Project
|
|
}
|
|
cursor
|
|
totalCount
|
|
}
|
|
}
|
|
`);
|
|
const props = __props;
|
|
const emit = __emit;
|
|
const { result, loading: initialLoading } = useQuery(
|
|
workspaceMoveProjectManagerUserQuery,
|
|
() => ({
|
|
cursor: null,
|
|
filter: {},
|
|
projectId: props.project?.id
|
|
})
|
|
);
|
|
const workspaces = computed(() => result.value?.activeUser?.workspaces.items ?? []);
|
|
const hasWorkspaces = computed(() => workspaces.value.length > 0);
|
|
const showLoading = computed(
|
|
() => initialLoading.value && workspaces.value.length === 0
|
|
);
|
|
const showLimitDialog = ref(false);
|
|
const limitReachedWorkspace = ref(null);
|
|
const isWorkspaceAdmin = computed(
|
|
() => (workspace) => {
|
|
if (!workspace) return false;
|
|
return workspace.role === Roles.Workspace.Admin;
|
|
}
|
|
);
|
|
const isWorkspaceDisabled = (workspace) => {
|
|
if (!isWorkspaceAdmin.value(workspace)) {
|
|
return true;
|
|
}
|
|
const permission = props.checker(workspace);
|
|
return !permission?.authorized && permission?.code !== WorkspaceLimitsReachedError.code;
|
|
};
|
|
const getWorkspaceTooltip = (workspace) => {
|
|
const permission = props.checker(workspace);
|
|
if (permission.authorized) {
|
|
return void 0;
|
|
}
|
|
if (permission.code === WorkspaceLimitsReachedError.code) {
|
|
return void 0;
|
|
}
|
|
return permission?.message;
|
|
};
|
|
const sortedWorkspaces = computed(() => {
|
|
return [...workspaces.value].sort((a, b) => {
|
|
const aEnabled = props.checker(a).authorized || props.checker(a).code === WorkspaceLimitsReachedError.code;
|
|
const bEnabled = props.checker(b).authorized || props.checker(b).code === WorkspaceLimitsReachedError.code;
|
|
if (aEnabled && !bEnabled) return -1;
|
|
if (!aEnabled && bEnabled) return 1;
|
|
return 0;
|
|
});
|
|
});
|
|
const handleWorkspaceClick = (workspace) => {
|
|
const permission = props.checker(workspace);
|
|
if (permission?.code === WorkspaceLimitsReachedError.code) {
|
|
limitReachedWorkspace.value = workspace;
|
|
showLimitDialog.value = true;
|
|
return;
|
|
}
|
|
if (permission?.authorized) {
|
|
emit("workspace-selected", workspace);
|
|
}
|
|
};
|
|
const isSsoRequired = (workspace) => {
|
|
return props.checker(workspace).code === WorkspaceSsoSessionNoAccessError.code;
|
|
};
|
|
const __returned__ = { props, emit, result, initialLoading, workspaces, hasWorkspaces, showLoading, showLimitDialog, limitReachedWorkspace, isWorkspaceAdmin, isWorkspaceDisabled, getWorkspaceTooltip, sortedWorkspaces, handleWorkspaceClick, isSsoRequired, get UserAvatarGroup() {
|
|
return UserAvatarGroup;
|
|
}, get formatName() {
|
|
return formatName;
|
|
} };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment, createTextVNode as _createTextVNode, withCtx as _withCtx, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = { "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:2:3" };
|
|
const _hoisted_2 = {
|
|
key: 0,
|
|
class: "py-4 flex items-center justify-center w-full h-32",
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:3:5"
|
|
};
|
|
const _hoisted_3 = {
|
|
key: 0,
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:7:7"
|
|
};
|
|
const _hoisted_4 = {
|
|
class: "mb-4",
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:8:9"
|
|
};
|
|
const _hoisted_5 = {
|
|
class: "flex flex-col gap-2",
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:11:9"
|
|
};
|
|
const _hoisted_6 = ["disabled", "onClick"];
|
|
const _hoisted_7 = {
|
|
class: "flex flex-col gap-2 items-start",
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:29:19"
|
|
};
|
|
const _hoisted_8 = { "data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:38:21" };
|
|
const _hoisted_9 = {
|
|
key: 1,
|
|
class: "text-body-xs text-foreground",
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:59:7"
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_CommonLoadingIcon = __nuxt_component_0;
|
|
const _component_CommonBadge = __nuxt_component_1;
|
|
const _component_WorkspaceCard = __nuxt_component_2;
|
|
const _component_WorkspacePlanProjectModelLimitReachedDialog = __nuxt_component_3;
|
|
const _directive_tippy = _resolveDirective("tippy");
|
|
return _openBlock(), _createElementBlock("div", _hoisted_1, [
|
|
$setup.showLoading ? (_openBlock(), _createElementBlock("div", _hoisted_2, [
|
|
_createVNode(_component_CommonLoadingIcon, {
|
|
size: "sm",
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:4:7"
|
|
})
|
|
])) : (_openBlock(), _createElementBlock(
|
|
_Fragment,
|
|
{ key: 1 },
|
|
[
|
|
$setup.hasWorkspaces ? (_openBlock(), _createElementBlock("div", _hoisted_3, [
|
|
_createElementVNode(
|
|
"p",
|
|
_hoisted_4,
|
|
_toDisplayString($props.subheading || "Select an existing workspace or create a new one."),
|
|
1
|
|
/* TEXT */
|
|
),
|
|
_createElementVNode("div", _hoisted_5, [
|
|
(_openBlock(true), _createElementBlock(
|
|
_Fragment,
|
|
null,
|
|
_renderList($setup.sortedWorkspaces, (ws) => {
|
|
return _withDirectives((_openBlock(), _createElementBlock("div", {
|
|
key: `${ws.id}-${ws.permissions?.canMoveProjectToWorkspace?.code}`,
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:12:11"
|
|
}, [
|
|
_createElementVNode("button", {
|
|
class: _normalizeClass(["w-full", !$setup.isWorkspaceDisabled(ws) ? "cursor-not-allowed" : ""]),
|
|
disabled: $setup.isWorkspaceDisabled(ws),
|
|
onClick: ($event) => $setup.handleWorkspaceClick(ws),
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:17:13"
|
|
}, [
|
|
_createVNode(_component_WorkspaceCard, {
|
|
logo: ws.logo ?? "",
|
|
name: ws.name,
|
|
clickable: !$setup.isWorkspaceDisabled(ws),
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:23:15"
|
|
}, {
|
|
text: _withCtx(() => [
|
|
_createElementVNode("div", _hoisted_7, [
|
|
$setup.isSsoRequired(ws) ? (_openBlock(), _createBlock(_component_CommonBadge, {
|
|
key: 0,
|
|
color: "secondary",
|
|
class: "capitalize",
|
|
rounded: "",
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:30:21"
|
|
}, {
|
|
default: _withCtx(() => [..._cache[1] || (_cache[1] = [
|
|
_createTextVNode(
|
|
" SSO login required ",
|
|
-1
|
|
/* CACHED */
|
|
)
|
|
])]),
|
|
_: 1
|
|
/* STABLE */
|
|
})) : _createCommentVNode("v-if", true),
|
|
_createElementVNode(
|
|
"p",
|
|
_hoisted_8,
|
|
_toDisplayString(ws.plan?.usage.projectCount) + " projects, " + _toDisplayString(ws.plan?.usage.modelCount) + " models ",
|
|
1
|
|
/* TEXT */
|
|
),
|
|
_createVNode($setup["UserAvatarGroup"], {
|
|
users: ws.team.items.map((t) => t.user),
|
|
"max-count": 6,
|
|
size: "sm",
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:42:21"
|
|
}, null, 8, ["users"])
|
|
])
|
|
]),
|
|
actions: _withCtx(() => [
|
|
_createVNode(
|
|
_component_CommonBadge,
|
|
{
|
|
color: "secondary",
|
|
rounded: "",
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:50:19"
|
|
},
|
|
{
|
|
default: _withCtx(() => [
|
|
_createTextVNode(
|
|
_toDisplayString($setup.formatName(ws.plan?.name)),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
]),
|
|
_: 2
|
|
/* DYNAMIC */
|
|
},
|
|
1024
|
|
/* DYNAMIC_SLOTS */
|
|
)
|
|
]),
|
|
_: 2
|
|
/* DYNAMIC */
|
|
}, 1032, ["logo", "name", "clickable"])
|
|
], 10, _hoisted_6)
|
|
])), [
|
|
[_directive_tippy, $setup.getWorkspaceTooltip(ws)]
|
|
]);
|
|
}),
|
|
128
|
|
/* KEYED_FRAGMENT */
|
|
))
|
|
])
|
|
])) : (_openBlock(), _createElementBlock("p", _hoisted_9, " Looks like you haven't created any workspaces yet. Workspaces help you easily organise and control your digital projects. Create one to move your project into. "))
|
|
],
|
|
64
|
|
/* STABLE_FRAGMENT */
|
|
)),
|
|
_createVNode(_component_WorkspacePlanProjectModelLimitReachedDialog, {
|
|
open: $setup.showLimitDialog,
|
|
"onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.showLimitDialog = $event),
|
|
"workspace-name": $setup.limitReachedWorkspace?.name,
|
|
plan: $setup.limitReachedWorkspace?.plan?.name,
|
|
"workspace-role": $setup.limitReachedWorkspace?.role,
|
|
"workspace-slug": $setup.limitReachedWorkspace?.slug || "",
|
|
location: "move_project_dialog",
|
|
"data-v-inspector": "components/workspace/moveProject/SelectWorkspace.vue:66:5"
|
|
}, null, 8, ["open", "workspace-name", "plan", "workspace-role", "workspace-slug"])
|
|
]);
|
|
}
|
|
_sfc_main.__hmrId = "254d4d03";
|
|
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/workspace/moveProject/SelectWorkspace.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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Q3ZDLE1BQU0sOEJBQXVCLE1BQU07QUFBQSxNQUNuQyxrQkFBZ0IsOEJBQXVCO0FBQUEsTUFDdkMsa0JBQWdCLDhCQUF1QixRQUFJO0FBQUEsTUFDNUMsVUFBUztBQUFBLE1BQXNCLG9CQUFpQjtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJTZWxlY3RXb3Jrc3BhY2UudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjI6M1wiPlxyXG4gICAgPGRpdiB2LWlmPVwic2hvd0xvYWRpbmdcIiBjbGFzcz1cInB5LTQgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtMzJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTozOjVcIj5cclxuICAgICAgPENvbW1vbkxvYWRpbmdJY29uIHNpemU9XCJzbVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjQ6N1wiIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgIDxkaXYgdi1pZj1cImhhc1dvcmtzcGFjZXNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo3OjdcIj5cclxuICAgICAgICA8cCBjbGFzcz1cIm1iLTRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo4OjlcIj5cclxuICAgICAgICAgIHt7IHN1YmhlYWRpbmcgfHwgJ1NlbGVjdCBhbiBleGlzdGluZyB3b3Jrc3BhY2Ugb3IgY3JlYXRlIGEgbmV3IG9uZS4nIH19XHJcbiAgICAgICAgPC9wPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6MTE6OVwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICB2LWZvcj1cIndzIGluIHNvcnRlZFdvcmtzcGFjZXNcIlxyXG4gICAgICAgICAgICA6a2V5PVwiYCR7d3MuaWR9LSR7d3MucGVybWlzc2lvbnM/LmNhbk1vdmVQcm9qZWN0VG9Xb3Jrc3BhY2U/LmNvZGV9YFwiXHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCJnZXRXb3Jrc3BhY2VUb29sdGlwKHdzKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjEyOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsXCJcclxuICAgICAgICAgICAgICA6Y2xhc3M9XCIhaXNXb3Jrc3BhY2VEaXNhYmxlZCh3cykgPyAnY3Vyc29yLW5vdC1hbGxvd2VkJyA6ICcnXCJcclxuICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJpc1dvcmtzcGFjZURpc2FibGVkKHdzKVwiXHJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiaGFuZGxlV29ya3NwYWNlQ2xpY2sod3MpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6MTc6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPFdvcmtzcGFjZUNhcmRcclxuICAgICAgICAgICAgICAgIDpsb2dvPVwid3MubG9nbyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICAgICA6bmFtZT1cIndzLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgOmNsaWNrYWJsZT1cIiFpc1dvcmtzcGFjZURpc2FibGVkKHdzKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjIzOjE1XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgI3RleHQ+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIGl0ZW1zLXN0YXJ0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6Mjk6MTlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Q29tbW9uQmFkZ2VcclxuICAgICAgICAgICAgICAgICAgICAgIHYtaWY9XCJpc1Nzb1JlcXVpcmVkKHdzKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcGl0YWxpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcm91bmRlZCBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTozMDoyMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgU1NPIGxvZ2luIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICAgICAgICAgICAgICA8cCBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTozODoyMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgd3MucGxhbj8udXNhZ2UucHJvamVjdENvdW50IH19IHByb2plY3RzLFxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgd3MucGxhbj8udXNhZ2UubW9kZWxDb3VudCB9fSBtb2RlbHNcclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPFVzZXJBdmF0YXJHcm91cFxyXG4gICAgICAgICAgICAgICAgICAgICAgOnVzZXJzPVwid3MudGVhbS5pdGVtcy5tYXAoKHQpID0+IHQudXNlcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgOm1heC1jb3VudD1cIjZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL21vdmVQcm9qZWN0L1NlbGVjdFdvcmtzcGFjZS52dWU6NDI6MjFcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSAjYWN0aW9ucz5cclxuICAgICAgICAgICAgICAgICAgPENvbW1vbkJhZGdlIGNvbG9yPVwic2Vjb25kYXJ5XCIgcm91bmRlZCBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo1MDoxOVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdE5hbWUod3MucGxhbj8ubmFtZSkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9Xb3Jrc3BhY2VDYXJkPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPHAgdi1lbHNlIGNsYXNzPVwidGV4dC1ib2R5LXhzIHRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlOjU5OjdcIj5cclxuICAgICAgICBMb29rcyBsaWtlIHlvdSBoYXZlbid0IGNyZWF0ZWQgYW55IHdvcmtzcGFjZXMgeWV0LiBXb3Jrc3BhY2VzIGhlbHAgeW91IGVhc2lseVxyXG4gICAgICAgIG9yZ2FuaXNlIGFuZCBjb250cm9sIHlvdXIgZGlnaXRhbCBwcm9qZWN0cy4gQ3JlYXRlIG9uZSB0byBtb3ZlIHlvdXIgcHJvamVjdFxyXG4gICAgICAgIGludG8uXHJcbiAgICAgIDwvcD5cclxuICAgIDwvdGVtcGxhdGU+XHJcblxyXG4gICAgPFdvcmtzcGFjZVBsYW5Qcm9qZWN0TW9kZWxMaW1pdFJlYWNoZWREaWFsb2dcclxuICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd0xpbWl0RGlhbG9nXCJcclxuICAgICAgOndvcmtzcGFjZS1uYW1lPVwibGltaXRSZWFjaGVkV29ya3NwYWNlPy5uYW1lXCJcclxuICAgICAgOnBsYW49XCJsaW1pdFJlYWNoZWRXb3Jrc3BhY2U/LnBsYW4/Lm5hbWVcIlxyXG4gICAgICA6d29ya3NwYWNlLXJvbGU9XCJsaW1pdFJlYWNoZWRXb3Jrc3BhY2U/LnJvbGVcIlxyXG4gICAgICA6d29ya3NwYWNlLXNsdWc9XCJsaW1pdFJlYWNoZWRXb3Jrc3BhY2U/LnNsdWcgfHwgJydcIlxyXG4gICAgICBsb2NhdGlvbj1cIm1vdmVfcHJvamVjdF9kaWFsb2dcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvbW92ZVByb2plY3QvU2VsZWN0V29ya3NwYWNlLnZ1ZTo2Njo1XCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBncmFwaHFsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdEZyYWdtZW50LFxyXG4gIFdvcmtzcGFjZU1vdmVQcm9qZWN0TWFuYWdlcl9Qcm9qZWN0RnJhZ21lbnQsXHJcbiAgV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxufSBmcm9tICd+fi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwvZ3JhcGhxbCdcclxuaW1wb3J0IHsgdXNlUXVlcnkgfSBmcm9tICdAdnVlL2Fwb2xsby1jb21wb3NhYmxlJ1xyXG5pbXBvcnQgeyBVc2VyQXZhdGFyR3JvdXAgfSBmcm9tICdAc3BlY2tsZS91aS1jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyB3b3Jrc3BhY2VNb3ZlUHJvamVjdE1hbmFnZXJVc2VyUXVlcnkgfSBmcm9tICd+L2xpYi93b3Jrc3BhY2VzL2dyYXBocWwvcXVlcmllcydcclxuaW1wb3J0IHsgZm9ybWF0TmFtZSB9IGZyb20gJ34vbGliL2JpbGxpbmcvaGVscGVycy9wbGFuJ1xyXG5pbXBvcnQgeyBSb2xlcywgdHlwZSBNYXliZU51bGxPclVuZGVmaW5lZCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHtcclxuICBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IsXHJcbiAgV29ya3NwYWNlU3NvU2Vzc2lvbk5vQWNjZXNzRXJyb3JcclxufSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvYXV0aHonXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBXb3Jrc3BhY2VNb3ZlUHJvamVjdFNlbGVjdFdvcmtzcGFjZV9Xb3Jrc3BhY2Ugb24gV29ya3NwYWNlIHtcclxuICAgIGlkXHJcbiAgICBuYW1lXHJcbiAgICByb2xlXHJcbiAgICBzbHVnXHJcbiAgICBwbGFuIHtcclxuICAgICAgbmFtZVxyXG4gICAgfVxyXG4gICAgcGVybWlzc2lvbnMge1xyXG4gICAgICBjYW5Nb3ZlUHJvamVjdFRvV29ya3NwYWNlKHByb2plY3RJZDogJHByb2plY3RJZCkge1xyXG4gICAgICAgIC4uLkZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRcclxuICAgICAgfVxyXG4gICAgICBjYW5DcmVhdGVQcm9qZWN0IHtcclxuICAgICAgICAuLi5GdWxsUGVybWlzc2lvbkNoZWNrUmVzdWx0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBXb3Jrc3BhY2VNb3ZlUHJvamVjdFNlbGVjdFdvcmtzcGFjZV9Vc2VyIG9uIFVzZXIge1xyXG4gICAgd29ya3NwYWNlcyB7XHJcbiAgICAgIGl0ZW1zIHtcclxuICAgICAgICAuLi5Xb3Jrc3BhY2VNb3ZlUHJvamVjdE1hbmFnZXJfV29ya3NwYWNlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHByb2plY3RzKGN1cnNvcjogJGN1cnNvciwgZmlsdGVyOiAkZmlsdGVyLCBzb3J0Qnk6ICRzb3J0QnkpIHtcclxuICAgICAgaXRlbXMge1xyXG4gICAgICAgIC4uLldvcmtzcGFjZU1vdmVQcm9qZWN0TWFuYWdlcl9Qcm9qZWN0XHJcbiAgICAgIH1cclxuICAgICAgY3Vyc29yXHJcbiAgICAgIHRvdGFsQ291bnRcclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBwcm9qZWN0OiBNYXliZU51bGxPclVuZGVmaW5lZDxXb3Jrc3BhY2VNb3ZlUHJvamVjdE1hbmFnZXJfUHJvamVjdEZyYWdtZW50PlxyXG4gIGNoZWNrZXI6IChcclxuICAgIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuICApID0+IEZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRGcmFnbWVudFxyXG4gIHN1YmhlYWRpbmc/OiBzdHJpbmdcclxufT4oKVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoXHJcbiAgICBlOiAnd29ya3NwYWNlLXNlbGVjdGVkJyxcclxuICAgIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuICApOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHsgcmVzdWx0LCBsb2FkaW5nOiBpbml0aWFsTG9hZGluZyB9ID0gdXNlUXVlcnkoXHJcbiAgd29ya3NwYWNlTW92ZVByb2plY3RNYW5hZ2VyVXNlclF1ZXJ5LFxyXG4gICgpID0+ICh7XHJcbiAgICBjdXJzb3I6IG51bGwsXHJcbiAgICBmaWx0ZXI6IHt9LFxyXG4gICAgcHJvamVjdElkOiBwcm9wcy5wcm9qZWN0Py5pZFxyXG4gIH0pXHJcbilcclxuXHJcbmNvbnN0IHdvcmtzcGFjZXMgPSBjb21wdXRlZCgoKSA9PiByZXN1bHQudmFsdWU/LmFjdGl2ZVVzZXI/LndvcmtzcGFjZXMuaXRlbXMgPz8gW10pXHJcbmNvbnN0IGhhc1dvcmtzcGFjZXMgPSBjb21wdXRlZCgoKSA9PiB3b3Jrc3BhY2VzLnZhbHVlLmxlbmd0aCA+IDApXHJcbmNvbnN0IHNob3dMb2FkaW5nID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gaW5pdGlhbExvYWRpbmcudmFsdWUgJiYgd29ya3NwYWNlcy52YWx1ZS5sZW5ndGggPT09IDBcclxuKVxyXG5cclxuY29uc3Qgc2hvd0xpbWl0RGlhbG9nID0gcmVmKGZhbHNlKVxyXG5jb25zdCBsaW1pdFJlYWNoZWRXb3Jrc3BhY2UgPVxyXG4gIHJlZjxXb3Jrc3BhY2VNb3ZlUHJvamVjdFNlbGVjdFdvcmtzcGFjZV9Xb3Jrc3BhY2VGcmFnbWVudCB8IG51bGw+KG51bGwpXHJcblxyXG5jb25zdCBpc1dvcmtzcGFjZUFkbWluID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gKHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnQgfCBudWxsKSA9PiB7XHJcbiAgICBpZiAoIXdvcmtzcGFjZSkgcmV0dXJuIGZhbHNlXHJcbiAgICByZXR1cm4gd29ya3NwYWNlLnJvbGUgPT09IFJvbGVzLldvcmtzcGFjZS5BZG1pblxyXG4gIH1cclxuKVxyXG5cclxuY29uc3QgaXNXb3Jrc3BhY2VEaXNhYmxlZCA9IChcclxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZU1vdmVQcm9qZWN0U2VsZWN0V29ya3NwYWNlX1dvcmtzcGFjZUZyYWdtZW50XHJcbikgPT4ge1xyXG4gIGlmICghaXNXb3Jrc3BhY2VBZG1pbi52YWx1ZSh3b3Jrc3BhY2UpKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgY29uc3QgcGVybWlzc2lvbiA9IHByb3BzLmNoZWNrZXIod29ya3NwYWNlKVxyXG4gIHJldHVybiAoXHJcbiAgICAhcGVybWlzc2lvbj8uYXV0aG9yaXplZCAmJiBwZXJtaXNzaW9uPy5jb2RlICE9PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZVxyXG4gIClcclxufVxyXG5cclxuY29uc3QgZ2V0V29ya3NwYWNlVG9vbHRpcCA9IChcclxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZU1vdmVQcm9qZWN0U2VsZWN0V29ya3NwYWNlX1dvcmtzcGFjZUZyYWdtZW50XHJcbikgPT4ge1xyXG4gIGNvbnN0IHBlcm1pc3Npb24gPSBwcm9wcy5jaGVja2VyKHdvcmtzcGFjZSlcclxuICBpZiAocGVybWlzc2lvbi5hdXRob3JpemVkKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfVxyXG4gIGlmIChwZXJtaXNzaW9uLmNvZGUgPT09IFdvcmtzcGFjZUxpbWl0c1JlYWNoZWRFcnJvci5jb2RlKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGVybWlzc2lvbj8ubWVzc2FnZVxyXG59XHJcblxyXG5jb25zdCBzb3J0ZWRXb3Jrc3BhY2VzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiBbLi4ud29ya3NwYWNlcy52YWx1ZV0uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgY29uc3QgYUVuYWJsZWQgPVxyXG4gICAgICBwcm9wcy5jaGVja2VyKGEpLmF1dGhvcml6ZWQgfHxcclxuICAgICAgcHJvcHMuY2hlY2tlcihhKS5jb2RlID09PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZVxyXG4gICAgY29uc3QgYkVuYWJsZWQgPVxyXG4gICAgICBwcm9wcy5jaGVja2VyKGIpLmF1dGhvcml6ZWQgfHxcclxuICAgICAgcHJvcHMuY2hlY2tlcihiKS5jb2RlID09PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZVxyXG5cclxuICAgIGlmIChhRW5hYmxlZCAmJiAhYkVuYWJsZWQpIHJldHVybiAtMVxyXG4gICAgaWYgKCFhRW5hYmxlZCAmJiBiRW5hYmxlZCkgcmV0dXJuIDFcclxuICAgIHJldHVybiAwXHJcbiAgfSlcclxufSlcclxuXHJcbmNvbnN0IGhhbmRsZVdvcmtzcGFjZUNsaWNrID0gKFxyXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuKSA9PiB7XHJcbiAgY29uc3QgcGVybWlzc2lvbiA9IHByb3BzLmNoZWNrZXIod29ya3NwYWNlKVxyXG4gIGlmIChwZXJtaXNzaW9uPy5jb2RlID09PSBXb3Jrc3BhY2VMaW1pdHNSZWFjaGVkRXJyb3IuY29kZSkge1xyXG4gICAgbGltaXRSZWFjaGVkV29ya3NwYWNlLnZhbHVlID0gd29ya3NwYWNlXHJcbiAgICBzaG93TGltaXREaWFsb2cudmFsdWUgPSB0cnVlXHJcbiAgICByZXR1cm5cclxuICB9XHJcblxyXG4gIGlmIChwZXJtaXNzaW9uPy5hdXRob3JpemVkKSB7XHJcbiAgICBlbWl0KCd3b3Jrc3BhY2Utc2VsZWN0ZWQnLCB3b3Jrc3BhY2UpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBpc1Nzb1JlcXVpcmVkID0gKFxyXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlTW92ZVByb2plY3RTZWxlY3RXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnRcclxuKSA9PiB7XHJcbiAgcmV0dXJuIHByb3BzLmNoZWNrZXIod29ya3NwYWNlKS5jb2RlID09PSBXb3Jrc3BhY2VTc29TZXNzaW9uTm9BY2Nlc3NFcnJvci5jb2RlXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3dvcmtzcGFjZS9tb3ZlUHJvamVjdC9TZWxlY3RXb3Jrc3BhY2UudnVlIn0= |