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

286 lines
29 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/invite/dialog/Workspace.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/invite/dialog/workspace/SelectRole.vue";
import { default as __nuxt_component_1 } from "/_nuxt/components/form/select/Projects.vue";
import { default as __nuxt_component_2 } from "/_nuxt/components/invite/dialog/shared/SelectUsers.vue";
import { LayoutDialog as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_4 } from "/_nuxt/components/workspace/AdditionalSeatsChargeDisclaimer.vue";
/* Injection by vite-plugin-vue-inspector Start */
import { createBlock as __createBlock,createVNode as __createVNode,createElementBlock as __createElementBlock } 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)) }
/* 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 { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import { emptyInviteWorkspaceItem } from "/_nuxt/lib/invites/helpers/constants.ts";
import {
Roles,
SeatTypes
} from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import { mapMainRoleToGqlWorkspaceRole } from "/_nuxt/lib/workspaces/helpers/roles.ts";
import { useInviteUserToWorkspace } from "/_nuxt/lib/workspaces/composables/management.ts";
import { getRoleLabel } from "/_nuxt/lib/settings/helpers/utils.ts";
import { matchesDomainPolicy } from "/_nuxt/lib/invites/helpers/validation.ts";
import { useInviteUserToProject } from "/_nuxt/lib/projects/composables/projectManagement.ts";
import { useWorkspacePlan } from "/_nuxt/lib/workspaces/composables/plan.ts";
import { computed, ref, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "InviteDialogWorkspace",
props: /* @__PURE__ */ _mergeModels({
workspace: { type: null, required: false }
}, {
"open": { type: Boolean, ...{ required: true } },
"openModifiers": {}
}),
emits: ["update:open"],
setup(__props, { expose: __expose }) {
__expose();
graphql(`
fragment InviteDialogWorkspace_Workspace on Workspace {
id
name
slug
domainBasedMembershipProtectionEnabled
defaultSeatType
domains {
domain
id
}
seats {
editors {
available
}
}
...InviteDialogSharedSelectUsers_Workspace
...WorkspacesPlan_Workspace
}
`);
const props = __props;
const isOpen = _useModel(__props, "open");
const mixpanel = useMixpanel();
const inviteToWorkspace = useInviteUserToWorkspace();
const inviteToProject = useInviteUserToProject();
const workspaceSlug = computed(() => props.workspace?.slug || "");
const { isPaidPlan } = useWorkspacePlan(workspaceSlug);
const showAdditionalSeatsDisclaimer = ref(false);
const isSelectingRole = ref(true);
const selectedRole = ref(Roles.Workspace.Member);
const project = ref();
const invites = ref([]);
const selectUsers = ref();
const dialogButtons = computed(() => [
{
text: backButtonText.value,
props: { color: "outline" },
onClick: () => onBack()
},
{
text: nextButtonText.value,
onClick: () => onSubmit()
}
]);
const title = computed(
() => isSelectingRole.value ? "Who are you inviting to the workspace?" : `Invite ${getRoleLabel(selectedRole.value).title.toLowerCase()}s to the workspace`
);
const backButtonText = computed(() => isSelectingRole.value ? "Cancel" : "Back");
const nextButtonText = computed(() => isSelectingRole.value ? "Continue" : "Invite");
const allowedDomains = computed(
() => props.workspace?.domainBasedMembershipProtectionEnabled ? props.workspace.domains?.map((d) => d.domain) : null
);
const purchasableEditorCount = computed(() => {
if (!isPaidPlan.value) return 0;
const seatsAvailable = props.workspace?.seats?.editors?.available || 0;
const editorSeatsToAdd = invites.value.filter(
(i) => i.seatType === SeatTypes.Editor
).length;
return Math.max(0, editorSeatsToAdd - seatsAvailable);
});
const onBack = () => {
if (isSelectingRole.value) {
isOpen.value = false;
} else {
isSelectingRole.value = true;
}
};
const onSubmit = async () => {
if (isSelectingRole.value) {
isSelectingRole.value = false;
} else {
const newInvites = await selectUsers.value?.submitForm();
if (newInvites?.length) {
invites.value = newInvites;
if (purchasableEditorCount.value > 0) {
showAdditionalSeatsDisclaimer.value = true;
} else {
onSelectUsersSubmit();
}
}
}
};
const canBeMember = (email) => matchesDomainPolicy(email, allowedDomains.value);
const onSelectUsersSubmit = async () => {
if (!invites.value.length || !props.workspace?.id) return;
if (selectedRole.value === Roles.Workspace.Guest && project.value) {
const inputs = invites.value.map((invite) => ({
role: invite.seatType === SeatTypes.Editor ? Roles.Stream.Contributor : Roles.Stream.Reviewer,
email: invite.email,
workspaceRole: selectedRole.value,
seatType: invite.seatType
}));
await inviteToProject(project.value.id, inputs);
} else {
const inputs = invites.value.map((invite) => ({
role: canBeMember(invite.email) ? mapMainRoleToGqlWorkspaceRole(selectedRole.value) : mapMainRoleToGqlWorkspaceRole(Roles.Workspace.Guest),
email: invite.email,
seatType: invite.seatType
}));
await inviteToWorkspace({ workspaceId: props.workspace.id, inputs });
}
isOpen.value = false;
mixpanel.track("Invite Action", {
type: "workspace invite",
name: "send",
multiple: invites.value.length !== 1,
count: invites.value.length,
to: "email",
hasProject: !!project.value,
workspaceRole: selectedRole.value,
// eslint-disable-next-line camelcase
workspace_id: props.workspace.id
});
};
const initInvites = () => {
invites.value = [
{
...emptyInviteWorkspaceItem,
seatType: props.workspace?.defaultSeatType || SeatTypes.Viewer,
workspaceRole: selectedRole.value,
serverRole: Roles.Server.User
}
];
};
watch(isOpen, (newVal) => {
if (newVal) {
isSelectingRole.value = true;
selectedRole.value = Roles.Workspace.Member;
project.value = void 0;
initInvites();
}
});
watch(
() => props.workspace,
(newVal) => {
if (newVal) {
initInvites();
}
}
);
const __returned__ = { props, isOpen, mixpanel, inviteToWorkspace, inviteToProject, workspaceSlug, isPaidPlan, showAdditionalSeatsDisclaimer, isSelectingRole, selectedRole, project, invites, selectUsers, dialogButtons, title, backButtonText, nextButtonText, allowedDomains, purchasableEditorCount, onBack, onSubmit, canBeMember, onSelectUsersSubmit, initInvites, get Roles() {
return Roles;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, withCtx as _withCtx, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = { "data-v-inspector": "components/invite/dialog/Workspace.vue:2:3" };
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_InviteDialogWorkspaceSelectRole = __nuxt_component_0;
const _component_FormSelectProjects = __nuxt_component_1;
const _component_InviteDialogSharedSelectUsers = __nuxt_component_2;
const _component_LayoutDialog = __nuxt_component_3;
const _component_WorkspaceAdditionalSeatsChargeDisclaimer = __nuxt_component_4;
return _openBlock(), _createElementBlock("div", _hoisted_1, [
$props.workspace ? (_openBlock(), _createBlock(_component_LayoutDialog, {
key: 0,
open: $setup.isOpen,
"onUpdate:open": [
_cache[2] || (_cache[2] = ($event) => $setup.isOpen = $event),
_cache[3] || (_cache[3] = ($event) => $setup.isOpen = false)
],
buttons: $setup.dialogButtons,
"prevent-close-on-click-outside": "",
"max-width": "md",
"data-v-inspector": "components/invite/dialog/Workspace.vue:3:5"
}, {
header: _withCtx(() => [
_createTextVNode(
_toDisplayString($setup.title),
1
/* TEXT */
)
]),
default: _withCtx(() => [
$setup.isSelectingRole ? (_openBlock(), _createBlock(_component_InviteDialogWorkspaceSelectRole, {
key: 0,
"selected-role": $setup.selectedRole,
"onUpdate:selectedRole": _cache[0] || (_cache[0] = ($event) => $setup.selectedRole = $event),
"workspace-name": $props.workspace?.name || "",
"data-v-inspector": "components/invite/dialog/Workspace.vue:12:7"
}, null, 8, ["selected-role", "workspace-name"])) : (_openBlock(), _createBlock(_component_InviteDialogSharedSelectUsers, {
key: 1,
ref: "selectUsers",
invites: $setup.invites,
"allowed-domains": $setup.allowedDomains,
"target-role": $setup.selectedRole,
workspace: $props.workspace,
"data-v-inspector": "components/invite/dialog/Workspace.vue:17:7"
}, {
project: _withCtx(() => [
$setup.selectedRole === $setup.Roles.Workspace.Guest ? (_openBlock(), _createBlock(_component_FormSelectProjects, {
key: 0,
modelValue: $setup.project,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $setup.project = $event),
label: "Project (optional)",
"show-label": "",
"mount-menu-on-body": "",
"allow-unset": "",
"workspace-id": $props.workspace?.id,
class: "mb-4",
"data-v-inspector": "components/invite/dialog/Workspace.vue:26:11"
}, null, 8, ["modelValue", "workspace-id"])) : _createCommentVNode("v-if", true)
]),
_: 1
/* STABLE */
}, 8, ["invites", "allowed-domains", "target-role", "workspace"]))
]),
_: 1
/* STABLE */
}, 8, ["open", "buttons"])) : _createCommentVNode("v-if", true),
_createVNode(_component_WorkspaceAdditionalSeatsChargeDisclaimer, {
open: $setup.showAdditionalSeatsDisclaimer,
"onUpdate:open": _cache[4] || (_cache[4] = ($event) => $setup.showAdditionalSeatsDisclaimer = $event),
"editor-count": $setup.purchasableEditorCount,
"workspace-slug": $props.workspace?.slug || "",
onConfirm: $setup.onSelectUsersSubmit,
"data-v-inspector": "components/invite/dialog/Workspace.vue:39:5"
}, null, 8, ["open", "editor-count", "workspace-slug"])
]);
}
_sfc_main.__hmrId = "a1e14d1f";
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/invite/dialog/Workspace.vue"]]);
//# sourceMappingURL=data:application/json;base64,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QUFpQjtBQUFBLFVBQ2pCLGVBQWE7QUFBQSxVQUNiLFdBQVc7QUFBQSxVQUFXLG9CQUFpQjtBQUFBO1VBRTdCLFNBQU8sU0FRUixNQVdsQjtBQUFBLFlBakJrQix3QkFBaUIsYUFBTSxVQUFVLHVCQUR6QyxhQVNFO0FBQUE7MEJBUFM7QUFBQSw0RkFBTztBQUFBLGNBQ2hCLE9BQU07QUFBQSxjQUNOO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNDLGdCQUFjLGtCQUFXO0FBQUEsY0FDMUIsT0FBTTtBQUFBLGNBQU8sb0JBQWlCO0FBQUE7Ozs7Ozs7OztJQUt0QyxhQUtFO0FBQUEsTUFKUSxNQUFNO0FBQUEsb0dBQTZCO0FBQUEsTUFDMUMsZ0JBQWM7QUFBQSxNQUNkLGtCQUFnQixrQkFBVyxRQUFJO0FBQUEsTUFDL0IsV0FBUztBQUFBLE1BQXFCLG9CQUFpQjtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJXb3Jrc3BhY2UudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL2ludml0ZS9kaWFsb2cvV29ya3NwYWNlLnZ1ZToyOjNcIj5cclxuICAgIDxMYXlvdXREaWFsb2dcclxuICAgICAgdi1pZj1cIndvcmtzcGFjZVwiXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cImlzT3BlblwiXHJcbiAgICAgIDpidXR0b25zPVwiZGlhbG9nQnV0dG9uc1wiXHJcbiAgICAgIHByZXZlbnQtY2xvc2Utb24tY2xpY2stb3V0c2lkZVxyXG4gICAgICBtYXgtd2lkdGg9XCJtZFwiXHJcbiAgICAgIEB1cGRhdGU6b3Blbj1cImlzT3BlbiA9IGZhbHNlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9Xb3Jrc3BhY2UudnVlOjM6NVwiXHJcbiAgICA+XHJcbiAgICAgIDx0ZW1wbGF0ZSAjaGVhZGVyPnt7IHRpdGxlIH19PC90ZW1wbGF0ZT5cclxuICAgICAgPEludml0ZURpYWxvZ1dvcmtzcGFjZVNlbGVjdFJvbGVcclxuICAgICAgICB2LWlmPVwiaXNTZWxlY3RpbmdSb2xlXCJcclxuICAgICAgICB2LW1vZGVsOnNlbGVjdGVkLXJvbGU9XCJzZWxlY3RlZFJvbGVcIlxyXG4gICAgICAgIDp3b3Jrc3BhY2UtbmFtZT1cIndvcmtzcGFjZT8ubmFtZSB8fCAnJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL2ludml0ZS9kaWFsb2cvV29ya3NwYWNlLnZ1ZToxMjo3XCJcclxuICAgICAgLz5cclxuICAgICAgPEludml0ZURpYWxvZ1NoYXJlZFNlbGVjdFVzZXJzXHJcbiAgICAgICAgdi1lbHNlXHJcbiAgICAgICAgcmVmPVwic2VsZWN0VXNlcnNcIlxyXG4gICAgICAgIDppbnZpdGVzPVwiaW52aXRlc1wiXHJcbiAgICAgICAgOmFsbG93ZWQtZG9tYWlucz1cImFsbG93ZWREb21haW5zXCJcclxuICAgICAgICA6dGFyZ2V0LXJvbGU9XCJzZWxlY3RlZFJvbGVcIlxyXG4gICAgICAgIDp3b3Jrc3BhY2U9XCJ3b3Jrc3BhY2VcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1dvcmtzcGFjZS52dWU6MTc6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8dGVtcGxhdGUgI3Byb2plY3Q+XHJcbiAgICAgICAgICA8Rm9ybVNlbGVjdFByb2plY3RzXHJcbiAgICAgICAgICAgIHYtaWY9XCJzZWxlY3RlZFJvbGUgPT09IFJvbGVzLldvcmtzcGFjZS5HdWVzdFwiXHJcbiAgICAgICAgICAgIHYtbW9kZWw9XCJwcm9qZWN0XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJQcm9qZWN0IChvcHRpb25hbClcIlxyXG4gICAgICAgICAgICBzaG93LWxhYmVsXHJcbiAgICAgICAgICAgIG1vdW50LW1lbnUtb24tYm9keVxyXG4gICAgICAgICAgICBhbGxvdy11bnNldFxyXG4gICAgICAgICAgICA6d29ya3NwYWNlLWlkPVwid29ya3NwYWNlPy5pZFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibWItNFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL2ludml0ZS9kaWFsb2cvV29ya3NwYWNlLnZ1ZToyNjoxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDwvSW52aXRlRGlhbG9nU2hhcmVkU2VsZWN0VXNlcnM+XHJcbiAgICA8L0xheW91dERpYWxvZz5cclxuICAgIDxXb3Jrc3BhY2VBZGRpdGlvbmFsU2VhdHNDaGFyZ2VEaXNjbGFpbWVyXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dBZGRpdGlvbmFsU2VhdHNEaXNjbGFpbWVyXCJcclxuICAgICAgOmVkaXRvci1jb3VudD1cInB1cmNoYXNhYmxlRWRpdG9yQ291bnRcIlxyXG4gICAgICA6d29ya3NwYWNlLXNsdWc9XCJ3b3Jrc3BhY2U/LnNsdWcgfHwgJydcIlxyXG4gICAgICBAY29uZmlybT1cIm9uU2VsZWN0VXNlcnNTdWJtaXRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1dvcmtzcGFjZS52dWU6Mzk6NVwiXHJcbiAgICAvPlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHR5cGUgeyBMYXlvdXREaWFsb2dCdXR0b24gfSBmcm9tICdAc3BlY2tsZS91aS1jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyBncmFwaHFsIH0gZnJvbSAnfi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwnXHJcbmltcG9ydCB0eXBlIHtcclxuICBJbnZpdGVEaWFsb2dXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnQsXHJcbiAgV29ya3NwYWNlSW52aXRlQ3JlYXRlSW5wdXQsXHJcbiAgRm9ybVNlbGVjdFByb2plY3RzX1Byb2plY3RGcmFnbWVudCxcclxuICBXb3Jrc3BhY2VQcm9qZWN0SW52aXRlQ3JlYXRlSW5wdXRcclxufSBmcm9tICd+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbC9ncmFwaHFsJ1xyXG5pbXBvcnQgdHlwZSB7IEludml0ZVdvcmtzcGFjZUl0ZW0gfSBmcm9tICd+fi9saWIvaW52aXRlcy9oZWxwZXJzL3R5cGVzJ1xyXG5pbXBvcnQgeyBlbXB0eUludml0ZVdvcmtzcGFjZUl0ZW0gfSBmcm9tICd+fi9saWIvaW52aXRlcy9oZWxwZXJzL2NvbnN0YW50cydcclxuaW1wb3J0IHtcclxuICBSb2xlcyxcclxuICBTZWF0VHlwZXMsXHJcbiAgdHlwZSBNYXliZU51bGxPclVuZGVmaW5lZCxcclxuICB0eXBlIFdvcmtzcGFjZVJvbGVzXHJcbn0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VNaXhwYW5lbCB9IGZyb20gJ34vbGliL2NvcmUvY29tcG9zYWJsZXMvbXAnXHJcbmltcG9ydCB7IG1hcE1haW5Sb2xlVG9HcWxXb3Jrc3BhY2VSb2xlIH0gZnJvbSAnfi9saWIvd29ya3NwYWNlcy9oZWxwZXJzL3JvbGVzJ1xyXG5pbXBvcnQgeyB1c2VJbnZpdGVVc2VyVG9Xb3Jrc3BhY2UgfSBmcm9tICd+L2xpYi93b3Jrc3BhY2VzL2NvbXBvc2FibGVzL21hbmFnZW1lbnQnXHJcbmltcG9ydCB7IGdldFJvbGVMYWJlbCB9IGZyb20gJ35+L2xpYi9zZXR0aW5ncy9oZWxwZXJzL3V0aWxzJ1xyXG5pbXBvcnQgeyBtYXRjaGVzRG9tYWluUG9saWN5IH0gZnJvbSAnfi9saWIvaW52aXRlcy9oZWxwZXJzL3ZhbGlkYXRpb24nXHJcbmltcG9ydCB7IHVzZUludml0ZVVzZXJUb1Byb2plY3QgfSBmcm9tICd+fi9saWIvcHJvamVjdHMvY29tcG9zYWJsZXMvcHJvamVjdE1hbmFnZW1lbnQnXHJcbmltcG9ydCB7IHVzZVdvcmtzcGFjZVBsYW4gfSBmcm9tICd+L2xpYi93b3Jrc3BhY2VzL2NvbXBvc2FibGVzL3BsYW4nXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBJbnZpdGVEaWFsb2dXb3Jrc3BhY2VfV29ya3NwYWNlIG9uIFdvcmtzcGFjZSB7XHJcbiAgICBpZFxyXG4gICAgbmFtZVxyXG4gICAgc2x1Z1xyXG4gICAgZG9tYWluQmFzZWRNZW1iZXJzaGlwUHJvdGVjdGlvbkVuYWJsZWRcclxuICAgIGRlZmF1bHRTZWF0VHlwZVxyXG4gICAgZG9tYWlucyB7XHJcbiAgICAgIGRvbWFpblxyXG4gICAgICBpZFxyXG4gICAgfVxyXG4gICAgc2VhdHMge1xyXG4gICAgICBlZGl0b3JzIHtcclxuICAgICAgICBhdmFpbGFibGVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLi4uSW52aXRlRGlhbG9nU2hhcmVkU2VsZWN0VXNlcnNfV29ya3NwYWNlXHJcbiAgICAuLi5Xb3Jrc3BhY2VzUGxhbl9Xb3Jrc3BhY2VcclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICB3b3Jrc3BhY2U/OiBNYXliZU51bGxPclVuZGVmaW5lZDxJbnZpdGVEaWFsb2dXb3Jrc3BhY2VfV29ya3NwYWNlRnJhZ21lbnQ+XHJcbn0+KClcclxuY29uc3QgaXNPcGVuID0gZGVmaW5lTW9kZWw8Ym9vbGVhbj4oJ29wZW4nLCB7IHJlcXVpcmVkOiB0cnVlIH0pXHJcblxyXG5jb25zdCBtaXhwYW5lbCA9IHVzZU1peHBhbmVsKClcclxuY29uc3QgaW52aXRlVG9Xb3Jrc3BhY2UgPSB1c2VJbnZpdGVVc2VyVG9Xb3Jrc3BhY2UoKVxyXG5jb25zdCBpbnZpdGVUb1Byb2plY3QgPSB1c2VJbnZpdGVVc2VyVG9Qcm9qZWN0KClcclxuXHJcbmNvbnN0IHdvcmtzcGFjZVNsdWcgPSBjb21wdXRlZCgoKSA9PiBwcm9wcy53b3Jrc3BhY2U/LnNsdWcgfHwgJycpXHJcbmNvbnN0IHsgaXNQYWlkUGxhbiB9ID0gdXNlV29ya3NwYWNlUGxhbih3b3Jrc3BhY2VTbHVnKVxyXG5cclxuY29uc3Qgc2hvd0FkZGl0aW9uYWxTZWF0c0Rpc2NsYWltZXIgPSByZWYoZmFsc2UpXHJcbmNvbnN0IGlzU2VsZWN0aW5nUm9sZSA9IHJlZih0cnVlKVxyXG5jb25zdCBzZWxlY3RlZFJvbGUgPSByZWY8V29ya3NwYWNlUm9sZXM+KFJvbGVzLldvcmtzcGFjZS5NZW1iZXIpXHJcbmNvbnN0IHByb2plY3QgPSByZWY8Rm9ybVNlbGVjdFByb2plY3RzX1Byb2plY3RGcmFnbWVudD4oKVxyXG5jb25zdCBpbnZpdGVzID0gcmVmPEludml0ZVdvcmtzcGFjZUl0ZW1bXT4oW10pXHJcbmNvbnN0IHNlbGVjdFVzZXJzID0gcmVmPHtcclxuICBzdWJtaXRGb3JtOiAoKSA9PiBQcm9taXNlPEludml0ZVdvcmtzcGFjZUl0ZW1bXT5cclxufT4oKVxyXG5cclxuY29uc3QgZGlhbG9nQnV0dG9ucyA9IGNvbXB1dGVkKCgpOiBMYXlvdXREaWFsb2dCdXR0b25bXSA9PiBbXHJcbiAge1xyXG4gICAgdGV4dDogYmFja0J1dHRvblRleHQudmFsdWUsXHJcbiAgICBwcm9wczogeyBjb2xvcjogJ291dGxpbmUnIH0sXHJcbiAgICBvbkNsaWNrOiAoKSA9PiBvbkJhY2soKVxyXG4gIH0sXHJcbiAge1xyXG4gICAgdGV4dDogbmV4dEJ1dHRvblRleHQudmFsdWUsXHJcbiAgICBvbkNsaWNrOiAoKSA9PiBvblN1Ym1pdCgpXHJcbiAgfVxyXG5dKVxyXG5cclxuY29uc3QgdGl0bGUgPSBjb21wdXRlZCgoKSA9PlxyXG4gIGlzU2VsZWN0aW5nUm9sZS52YWx1ZVxyXG4gICAgPyAnV2hvIGFyZSB5b3UgaW52aXRpbmcgdG8gdGhlIHdvcmtzcGFjZT8nXHJcbiAgICA6IGBJbnZpdGUgJHtnZXRSb2xlTGFiZWwoc2VsZWN0ZWRSb2xlLnZhbHVlKS50aXRsZS50b0xvd2VyQ2FzZSgpfXMgdG8gdGhlIHdvcmtzcGFjZWBcclxuKVxyXG5cclxuY29uc3QgYmFja0J1dHRvblRleHQgPSBjb21wdXRlZCgoKSA9PiAoaXNTZWxlY3RpbmdSb2xlLnZhbHVlID8gJ0NhbmNlbCcgOiAnQmFjaycpKVxyXG5jb25zdCBuZXh0QnV0dG9uVGV4dCA9IGNvbXB1dGVkKCgpID0+IChpc1NlbGVjdGluZ1JvbGUudmFsdWUgPyAnQ29udGludWUnIDogJ0ludml0ZScpKVxyXG5jb25zdCBhbGxvd2VkRG9tYWlucyA9IGNvbXB1dGVkKCgpID0+XHJcbiAgcHJvcHMud29ya3NwYWNlPy5kb21haW5CYXNlZE1lbWJlcnNoaXBQcm90ZWN0aW9uRW5hYmxlZFxyXG4gICAgPyBwcm9wcy53b3Jrc3BhY2UuZG9tYWlucz8ubWFwKChkKSA9PiBkLmRvbWFpbilcclxuICAgIDogbnVsbFxyXG4pXHJcblxyXG5jb25zdCBwdXJjaGFzYWJsZUVkaXRvckNvdW50ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmICghaXNQYWlkUGxhbi52YWx1ZSkgcmV0dXJuIDBcclxuICBjb25zdCBzZWF0c0F2YWlsYWJsZSA9IHByb3BzLndvcmtzcGFjZT8uc2VhdHM/LmVkaXRvcnM/LmF2YWlsYWJsZSB8fCAwXHJcbiAgY29uc3QgZWRpdG9yU2VhdHNUb0FkZCA9IGludml0ZXMudmFsdWUuZmlsdGVyKFxyXG4gICAgKGkpID0+IGkuc2VhdFR5cGUgPT09IFNlYXRUeXBlcy5FZGl0b3JcclxuICApLmxlbmd0aFxyXG4gIHJldHVybiBNYXRoLm1heCgwLCBlZGl0b3JTZWF0c1RvQWRkIC0gc2VhdHNBdmFpbGFibGUpXHJcbn0pXHJcblxyXG5jb25zdCBvbkJhY2sgPSAoKSA9PiB7XHJcbiAgaWYgKGlzU2VsZWN0aW5nUm9sZS52YWx1ZSkge1xyXG4gICAgaXNPcGVuLnZhbHVlID0gZmFsc2VcclxuICB9IGVsc2Uge1xyXG4gICAgaXNTZWxlY3RpbmdSb2xlLnZhbHVlID0gdHJ1ZVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgb25TdWJtaXQgPSBhc3luYyAoKSA9PiB7XHJcbiAgaWYgKGlzU2VsZWN0aW5nUm9sZS52YWx1ZSkge1xyXG4gICAgaXNTZWxlY3RpbmdSb2xlLnZhbHVlID0gZmFsc2VcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgbmV3SW52aXRlcyA9IGF3YWl0IHNlbGVjdFVzZXJzLnZhbHVlPy5zdWJtaXRGb3JtKClcclxuICAgIGlmIChuZXdJbnZpdGVzPy5sZW5ndGgpIHtcclxuICAgICAgaW52aXRlcy52YWx1ZSA9IG5ld0ludml0ZXNcclxuXHJcbiAgICAgIGlmIChwdXJjaGFzYWJsZUVkaXRvckNvdW50LnZhbHVlID4gMCkge1xyXG4gICAgICAgIHNob3dBZGRpdGlvbmFsU2VhdHNEaXNjbGFpbWVyLnZhbHVlID0gdHJ1ZVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG9uU2VsZWN0VXNlcnNTdWJtaXQoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBjYW5CZU1lbWJlciA9IChlbWFpbDogc3RyaW5nKSA9PiBtYXRjaGVzRG9tYWluUG9saWN5KGVtYWlsLCBhbGxvd2VkRG9tYWlucy52YWx1ZSlcclxuXHJcbmNvbnN0IG9uU2VsZWN0VXNlcnNTdWJtaXQgPSBhc3luYyAoKSA9PiB7XHJcbiAgaWYgKCFpbnZpdGVzLnZhbHVlLmxlbmd0aCB8fCAhcHJvcHMud29ya3NwYWNlPy5pZCkgcmV0dXJuXHJcblxyXG4gIGlmIChzZWxlY3RlZFJvbGUudmFsdWUgPT09IFJvbGVzLldvcmtzcGFjZS5HdWVzdCAmJiBwcm9qZWN0LnZhbHVlKSB7XHJcbiAgICBjb25zdCBpbnB1dHM6IFdvcmtzcGFjZVByb2plY3RJbnZpdGVDcmVhdGVJbnB1dFtdID0gaW52aXRlcy52YWx1ZS5tYXAoKGludml0ZSkgPT4gKHtcclxuICAgICAgcm9sZTpcclxuICAgICAgICBpbnZpdGUuc2VhdFR5cGUgPT09IFNlYXRUeXBlcy5FZGl0b3JcclxuICAgICAgICAgID8gUm9sZXMuU3RyZWFtLkNvbnRyaWJ1dG9yXHJcbiAgICAgICAgICA6IFJvbGVzLlN0cmVhbS5SZXZpZXdlcixcclxuICAgICAgZW1haWw6IGludml0ZS5lbWFpbCxcclxuICAgICAgd29ya3NwYWNlUm9sZTogc2VsZWN0ZWRSb2xlLnZhbHVlLFxyXG4gICAgICBzZWF0VHlwZTogaW52aXRlLnNlYXRUeXBlXHJcbiAgICB9KSlcclxuXHJcbiAgICBhd2FpdCBpbnZpdGVUb1Byb2plY3QocHJvamVjdC52YWx1ZS5pZCwgaW5wdXRzKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpbnB1dHM6IFdvcmtzcGFjZUludml0ZUNyZWF0ZUlucHV0W10gPSBpbnZpdGVzLnZhbHVlLm1hcCgoaW52aXRlKSA9PiAoe1xyXG4gICAgICByb2xlOiBjYW5CZU1lbWJlcihpbnZpdGUuZW1haWwpXHJcbiAgICAgICAgPyBtYXBNYWluUm9sZVRvR3FsV29ya3NwYWNlUm9sZShzZWxlY3RlZFJvbGUudmFsdWUpXHJcbiAgICAgICAgOiBtYXBNYWluUm9sZVRvR3FsV29ya3NwYWNlUm9sZShSb2xlcy5Xb3Jrc3BhY2UuR3Vlc3QpLFxyXG4gICAgICBlbWFpbDogaW52aXRlLmVtYWlsLFxyXG4gICAgICBzZWF0VHlwZTogaW52aXRlLnNlYXRUeXBlXHJcbiAgICB9KSlcclxuXHJcbiAgICBhd2FpdCBpbnZpdGVUb1dvcmtzcGFjZSh7IHdvcmtzcGFjZUlkOiBwcm9wcy53b3Jrc3BhY2UuaWQsIGlucHV0cyB9KVxyXG4gIH1cclxuXHJcbiAgaXNPcGVuLnZhbHVlID0gZmFsc2VcclxuICBtaXhwYW5lbC50cmFjaygnSW52aXRlIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICd3b3Jrc3BhY2UgaW52aXRlJyxcclxuICAgIG5hbWU6ICdzZW5kJyxcclxuICAgIG11bHRpcGxlOiBpbnZpdGVzLnZhbHVlLmxlbmd0aCAhPT0gMSxcclxuICAgIGNvdW50OiBpbnZpdGVzLnZhbHVlLmxlbmd0aCxcclxuICAgIHRvOiAnZW1haWwnLFxyXG4gICAgaGFzUHJvamVjdDogISFwcm9qZWN0LnZhbHVlLFxyXG4gICAgd29ya3NwYWNlUm9sZTogc2VsZWN0ZWRSb2xlLnZhbHVlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZVxyXG4gICAgd29ya3NwYWNlX2lkOiBwcm9wcy53b3Jrc3BhY2UuaWRcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBpbml0SW52aXRlcyA9ICgpID0+IHtcclxuICBpbnZpdGVzLnZhbHVlID0gW1xyXG4gICAge1xyXG4gICAgICAuLi5lbXB0eUludml0ZVdvcmtzcGFjZUl0ZW0sXHJcbiAgICAgIHNlYXRUeXBlOiBwcm9wcy53b3Jrc3BhY2U/LmRlZmF1bHRTZWF0VHlwZSB8fCBTZWF0VHlwZXMuVmlld2VyLFxyXG4gICAgICB3b3Jrc3BhY2VSb2xlOiBzZWxlY3RlZFJvbGUudmFsdWUsXHJcbiAgICAgIHNlcnZlclJvbGU6IFJvbGVzLlNlcnZlci5Vc2VyXHJcbiAgICB9XHJcbiAgXVxyXG59XHJcblxyXG53YXRjaChpc09wZW4sIChuZXdWYWwpID0+IHtcclxuICBpZiAobmV3VmFsKSB7XHJcbiAgICBpc1NlbGVjdGluZ1JvbGUudmFsdWUgPSB0cnVlXHJcbiAgICBzZWxlY3RlZFJvbGUudmFsdWUgPSBSb2xlcy5Xb3Jrc3BhY2UuTWVtYmVyXHJcbiAgICBwcm9qZWN0LnZhbHVlID0gdW5kZWZpbmVkXHJcbiAgICBpbml0SW52aXRlcygpXHJcbiAgfVxyXG59KVxyXG5cclxud2F0Y2goXHJcbiAgKCkgPT4gcHJvcHMud29ya3NwYWNlLFxyXG4gIChuZXdWYWwpID0+IHtcclxuICAgIGlmIChuZXdWYWwpIHtcclxuICAgICAgaW5pdEludml0ZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuKVxyXG48L3NjcmlwdD5cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2NvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9Xb3Jrc3BhY2UudnVlIn0=