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

326 lines
30 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/invite/dialog/Server.vue");import { FormTextInput as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_1 } from "/_nuxt/components/form/select/ServerRoles.vue";
import { default as __nuxt_component_2 } from "/_nuxt/components/form/select/Projects.vue";
import { CommonTextLink as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { FormButton as __nuxt_component_4 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { LayoutDialog as __nuxt_component_5 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
/* Injection by vite-plugin-vue-inspector Start */
import { createElementBlock as __createElementBlock,createVNode as __createVNode,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 _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
function _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
/* Injection by vite-plugin-vue-inspector End */
import { useModel as _useModel, defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { useMutationLoading } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
import { useForm, useFieldArray } from "/_nuxt/node_modules/.cache/vite/client/deps/vee-validate.js?v=e4f18c29";
import { useActiveUser } from "/_nuxt/lib/auth/composables/activeUser.ts";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import { useServerInfo } from "/_nuxt/lib/core/composables/server.ts";
import { useInviteUserToProject } from "/_nuxt/lib/projects/composables/projectManagement.ts";
import { useInviteUserToServer } from "/_nuxt/lib/server/composables/invites.ts";
import { PlusIcon, TrashIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29";
import { emptyInviteServerItem } from "/_nuxt/lib/invites/helpers/constants.ts";
import { isEmail } from "/_nuxt/lib/common/helpers/validation.ts";
import { useGlobalToast } from "/_nuxt/lib/common/composables/toast.ts";
import { computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { ToastNotificationType } from "/_nuxt/utils/globals.ts";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "InviteDialogServer",
props: {
"open": { type: Boolean, ...{ required: true } },
"openModifiers": {}
},
emits: ["update:open"],
setup(__props, { expose: __expose }) {
__expose();
const isOpen = _useModel(__props, "open");
const { handleSubmit } = useForm({
initialValues: {
fields: [
{
...emptyInviteServerItem
}
]
}
});
const {
fields,
replace: replaceFields,
push: pushInvite,
remove: removeInvite
} = useFieldArray("fields");
const { mutate: inviteUserToServer } = useInviteUserToServer();
const inviteUserToProject = useInviteUserToProject();
const anyMutationsLoading = useMutationLoading();
const { isAdmin } = useActiveUser();
const { isGuestMode } = useServerInfo();
const mixpanel = useMixpanel();
const { triggerNotification } = useGlobalToast();
const allowServerRoleSelect = computed(() => isAdmin.value || isGuestMode.value);
const dialogButtons = computed(() => [
{
text: "Cancel",
props: { color: "outline" },
onClick: () => {
isOpen.value = false;
}
},
{
text: "Invite",
props: {
submit: true,
disabled: anyMutationsLoading.value
},
onClick: onSubmit
}
]);
const addInviteItem = () => {
pushInvite({ ...emptyInviteServerItem });
};
const removeInviteItem = (index) => {
removeInvite(index);
};
const onSubmit = handleSubmit(async () => {
const invites = fields.value.filter((invite) => invite.value.email);
try {
await Promise.all(
invites.map(
(invite) => invite.value.project ? inviteUserToProject(
invite.value.project.id,
[{ email: invite.value.email, serverRole: invite.value.serverRole }],
{ hideToasts: true }
) : inviteUserToServer(
[{ email: invite.value.email, serverRole: invite.value.serverRole }],
{ hideToasts: true }
)
)
);
triggerNotification({
type: ToastNotificationType.Success,
title: invites.length > 1 ? "Invites successfully send" : `Invite successfully sent to ${invites[0].value.email}`
});
mixpanel.track("Invite Action", {
type: "server invite",
name: "send",
multiple: fields.value.length !== 1,
count: fields.value.length,
hasProject: !!fields.value.some((invite) => invite.value.project),
to: "email"
});
isOpen.value = false;
} catch {
triggerNotification({
type: ToastNotificationType.Danger,
title: invites.length > 1 ? "One or more invites failed to send" : `Failed to send invite to ${invites[0].value.email}`
});
}
});
watch(isOpen, (newVal, oldVal) => {
if (newVal && !oldVal) {
replaceFields([
{
...emptyInviteServerItem
}
]);
}
});
const __returned__ = { isOpen, handleSubmit, fields, replaceFields, pushInvite, removeInvite, inviteUserToServer, inviteUserToProject, anyMutationsLoading, isAdmin, isGuestMode, mixpanel, triggerNotification, allowServerRoleSelect, dialogButtons, addInviteItem, removeInviteItem, onSubmit, get PlusIcon() {
return PlusIcon;
}, get TrashIcon() {
return TrashIcon;
}, get isEmail() {
return isEmail;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, withCtx as _withCtx } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = {
class: "flex flex-col gap-y-5 text-foreground",
"data-v-inspector": "components/invite/dialog/Server.vue:5:7"
};
const _hoisted_2 = {
class: "flex flex-col gap-y-3 flex-1",
"data-v-inspector": "components/invite/dialog/Server.vue:7:11"
};
const _hoisted_3 = {
key: 0,
class: "border-outline-3",
"data-v-inspector": "components/invite/dialog/Server.vue:8:13"
};
const _hoisted_4 = {
class: "flex flex-row gap-x-3 items-center",
"data-v-inspector": "components/invite/dialog/Server.vue:9:13"
};
const _hoisted_5 = {
class: "flex-1",
"data-v-inspector": "components/invite/dialog/Server.vue:10:15"
};
const _hoisted_6 = {
class: "relative w-4",
"data-v-inspector": "components/invite/dialog/Server.vue:48:11"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_FormTextInput = __nuxt_component_0;
const _component_FormSelectServerRoles = __nuxt_component_1;
const _component_FormSelectProjects = __nuxt_component_2;
const _component_CommonTextLink = __nuxt_component_3;
const _component_FormButton = __nuxt_component_4;
const _component_LayoutDialog = __nuxt_component_5;
return _openBlock(), _createBlock(_component_LayoutDialog, {
open: $setup.isOpen,
"onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.isOpen = $event),
"max-width": "md",
buttons: $setup.dialogButtons,
"data-v-inspector": "components/invite/dialog/Server.vue:2:3"
}, {
header: _withCtx(() => [..._cache[2] || (_cache[2] = [
_createTextVNode(
"Invite to Speckle",
-1
/* CACHED */
)
])]),
default: _withCtx(() => [
_createElementVNode(
"form",
{
onSubmit: _cache[0] || (_cache[0] = (...args) => $setup.onSubmit && $setup.onSubmit(...args)),
"data-v-inspector": "components/invite/dialog/Server.vue:4:5"
},
[
_createElementVNode("div", _hoisted_1, [
(_openBlock(true), _createElementBlock(
_Fragment,
null,
_renderList($setup.fields, (item, index) => {
return _openBlock(), _createElementBlock("div", {
key: item.key,
class: "flex gap-x-3",
"data-v-inspector": "components/invite/dialog/Server.vue:6:9"
}, [
_createElementVNode("div", _hoisted_2, [
index !== 0 ? (_openBlock(), _createElementBlock("hr", _hoisted_3)) : _createCommentVNode("v-if", true),
_createElementVNode("div", _hoisted_4, [
_createElementVNode("div", _hoisted_5, [
_createVNode(_component_FormTextInput, {
modelValue: item.value.email,
"onUpdate:modelValue": ($event) => item.value.email = $event,
name: `email-${item.key}`,
color: "foundation",
placeholder: "Email address",
"show-clear": "",
"full-width": "",
"use-label-in-errors": "",
"show-label": "",
label: "Email",
rules: [$setup.isEmail],
"data-v-inspector": "components/invite/dialog/Server.vue:11:17"
}, null, 8, ["modelValue", "onUpdate:modelValue", "name", "rules"])
]),
$setup.allowServerRoleSelect ? (_openBlock(), _createBlock(_component_FormSelectServerRoles, {
key: 0,
modelValue: item.value.serverRole,
"onUpdate:modelValue": ($event) => item.value.serverRole = $event,
label: "Select role",
name: `role-${item.key}`,
class: "sm:w-48",
"show-label": "",
disabled: $setup.anyMutationsLoading,
"allow-guest": $setup.isGuestMode,
"allow-admin": $setup.isAdmin,
"mount-menu-on-body": "",
"data-v-inspector": "components/invite/dialog/Server.vue:24:15"
}, null, 8, ["modelValue", "onUpdate:modelValue", "name", "disabled", "allow-guest", "allow-admin"])) : _createCommentVNode("v-if", true)
]),
_createVNode(_component_FormSelectProjects, {
modelValue: item.value.project,
"onUpdate:modelValue": ($event) => item.value.project = $event,
label: "Select project",
class: "w-full",
"owned-only": "",
"show-optional": "",
"mount-menu-on-body": "",
"show-label": "",
name: `project-${index}`,
"data-v-inspector": "components/invite/dialog/Server.vue:37:13"
}, null, 8, ["modelValue", "onUpdate:modelValue", "name"])
]),
_createElementVNode("div", _hoisted_6, [
$setup.fields.length > 1 ? (_openBlock(), _createBlock(_component_CommonTextLink, {
key: 0,
class: _normalizeClass(["top-10 absolute right-0", { "top-7": index === 0 }]),
onClick: ($event) => $setup.removeInviteItem(index),
"data-v-inspector": "components/invite/dialog/Server.vue:49:13"
}, {
default: _withCtx(() => [
_createVNode($setup["TrashIcon"], {
class: "h-4 w-4 text-foreground-2",
"data-v-inspector": "components/invite/dialog/Server.vue:55:15"
})
]),
_: 2
/* DYNAMIC */
}, 1032, ["class", "onClick"])) : _createCommentVNode("v-if", true)
])
]);
}),
128
/* KEYED_FRAGMENT */
)),
_createVNode(_component_FormButton, {
color: "subtle",
"icon-left": $setup.PlusIcon,
disabled: $setup.anyMutationsLoading,
onClick: $setup.addInviteItem,
"data-v-inspector": "components/invite/dialog/Server.vue:59:9"
}, {
default: _withCtx(() => [..._cache[3] || (_cache[3] = [
_createTextVNode(
" Invite another user ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
}, 8, ["icon-left", "disabled"])
])
],
32
/* NEED_HYDRATION */
)
]),
_: 1
/* STABLE */
}, 8, ["open", "buttons"]);
}
_sfc_main.__hmrId = "669bb4ae";
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/Server.vue"]]);
//# sourceMappingURL=data:application/json;base64,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QUE7O2tCQUdoRCxvQkFTTSxPQVROLFlBU007QUFBQSxvQkFQSSxjQUFPLFNBQU0sbUJBRHJCLGFBT2lCO0FBQUE7c0JBTGYsT0FBSyxpQkFBQywyQkFBeUIsV0FDWixVQUFLO0FBQUEsc0JBQ3ZCLFNBQUssWUFBRSx3QkFBaUIsS0FBSztBQUFBLHNCQUFHLG9CQUFpQjtBQUFBO3dDQUVsRCxNQUE0RztBQUFBLHdCQUE1RyxhQUE0RztBQUFBLDBCQUFqRyxPQUFNO0FBQUEsMEJBQTRCLG9CQUFpQjtBQUFBOzs7Ozs7Ozs7OztZQUlwRSxhQU9hO0FBQUEsY0FOWCxPQUFNO0FBQUEsY0FDTCxhQUFXO0FBQUEsY0FDWCxVQUFVO0FBQUEsY0FDVixTQUFPO0FBQUEsY0FBZSxvQkFBaUI7QUFBQTtnQ0FDekMsTUFFRDtBQUFBO2tCQUZDO0FBQUEsa0JBRUQ7QUFBQTtBQUFBO0FBQUEiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIlNlcnZlci52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxyXG4gIDxMYXlvdXREaWFsb2cgdi1tb2RlbDpvcGVuPVwiaXNPcGVuXCIgbWF4LXdpZHRoPVwibWRcIiA6YnV0dG9ucz1cImRpYWxvZ0J1dHRvbnNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6MjozXCI+XHJcbiAgICA8dGVtcGxhdGUgI2hlYWRlcj5JbnZpdGUgdG8gU3BlY2tsZTwvdGVtcGxhdGU+XHJcbiAgICA8Zm9ybSBAc3VibWl0PVwib25TdWJtaXRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6NDo1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC15LTUgdGV4dC1mb3JlZ3JvdW5kXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9TZXJ2ZXIudnVlOjU6N1wiPlxyXG4gICAgICAgIDxkaXYgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGZpZWxkc1wiIDprZXk9XCJpdGVtLmtleVwiIGNsYXNzPVwiZmxleCBnYXAteC0zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9TZXJ2ZXIudnVlOjY6OVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLXktMyBmbGV4LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6NzoxMVwiPlxyXG4gICAgICAgICAgICA8aHIgdi1pZj1cImluZGV4ICE9PSAwXCIgY2xhc3M9XCJib3JkZXItb3V0bGluZS0zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9TZXJ2ZXIudnVlOjg6MTNcIiAvPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAteC0zIGl0ZW1zLWNlbnRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL2ludml0ZS9kaWFsb2cvU2VydmVyLnZ1ZTo5OjEzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL2ludml0ZS9kaWFsb2cvU2VydmVyLnZ1ZToxMDoxNVwiPlxyXG4gICAgICAgICAgICAgICAgPEZvcm1UZXh0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgdi1tb2RlbD1cIml0ZW0udmFsdWUuZW1haWxcIlxyXG4gICAgICAgICAgICAgICAgICA6bmFtZT1cImBlbWFpbC0ke2l0ZW0ua2V5fWBcIlxyXG4gICAgICAgICAgICAgICAgICBjb2xvcj1cImZvdW5kYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVtYWlsIGFkZHJlc3NcIlxyXG4gICAgICAgICAgICAgICAgICBzaG93LWNsZWFyXHJcbiAgICAgICAgICAgICAgICAgIGZ1bGwtd2lkdGhcclxuICAgICAgICAgICAgICAgICAgdXNlLWxhYmVsLWluLWVycm9yc1xyXG4gICAgICAgICAgICAgICAgICBzaG93LWxhYmVsXHJcbiAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRW1haWxcIlxyXG4gICAgICAgICAgICAgICAgICA6cnVsZXM9XCJbaXNFbWFpbF1cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6MTE6MTdcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8Rm9ybVNlbGVjdFNlcnZlclJvbGVzXHJcbiAgICAgICAgICAgICAgICB2LWlmPVwiYWxsb3dTZXJ2ZXJSb2xlU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgIHYtbW9kZWw9XCJpdGVtLnZhbHVlLnNlcnZlclJvbGVcIlxyXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJTZWxlY3Qgcm9sZVwiXHJcbiAgICAgICAgICAgICAgICA6bmFtZT1cImByb2xlLSR7aXRlbS5rZXl9YFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtOnctNDhcIlxyXG4gICAgICAgICAgICAgICAgc2hvdy1sYWJlbFxyXG4gICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiYW55TXV0YXRpb25zTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICA6YWxsb3ctZ3Vlc3Q9XCJpc0d1ZXN0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICA6YWxsb3ctYWRtaW49XCJpc0FkbWluXCJcclxuICAgICAgICAgICAgICAgIG1vdW50LW1lbnUtb24tYm9keSBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6MjQ6MTVcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8Rm9ybVNlbGVjdFByb2plY3RzXHJcbiAgICAgICAgICAgICAgdi1tb2RlbD1cIml0ZW0udmFsdWUucHJvamVjdFwiXHJcbiAgICAgICAgICAgICAgbGFiZWw9XCJTZWxlY3QgcHJvamVjdFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGxcIlxyXG4gICAgICAgICAgICAgIG93bmVkLW9ubHlcclxuICAgICAgICAgICAgICBzaG93LW9wdGlvbmFsXHJcbiAgICAgICAgICAgICAgbW91bnQtbWVudS1vbi1ib2R5XHJcbiAgICAgICAgICAgICAgc2hvdy1sYWJlbFxyXG4gICAgICAgICAgICAgIDpuYW1lPVwiYHByb2plY3QtJHtpbmRleH1gXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9TZXJ2ZXIudnVlOjM3OjEzXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHctNFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL2ludml0ZS9kaWFsb2cvU2VydmVyLnZ1ZTo0ODoxMVwiPlxyXG4gICAgICAgICAgICA8Q29tbW9uVGV4dExpbmtcclxuICAgICAgICAgICAgICB2LWlmPVwiZmllbGRzLmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidG9wLTEwIGFic29sdXRlIHJpZ2h0LTBcIlxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgJ3RvcC03JzogaW5kZXggPT09IDAgfVwiXHJcbiAgICAgICAgICAgICAgQGNsaWNrPVwicmVtb3ZlSW52aXRlSXRlbShpbmRleClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6NDk6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPFRyYXNoSWNvbiBjbGFzcz1cImgtNCB3LTQgdGV4dC1mb3JlZ3JvdW5kLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6NTU6MTVcIiAvPlxyXG4gICAgICAgICAgICA8L0NvbW1vblRleHRMaW5rPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIGNvbG9yPVwic3VidGxlXCJcclxuICAgICAgICAgIDppY29uLWxlZnQ9XCJQbHVzSWNvblwiXHJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJhbnlNdXRhdGlvbnNMb2FkaW5nXCJcclxuICAgICAgICAgIEBjbGljaz1cImFkZEludml0ZUl0ZW1cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9pbnZpdGUvZGlhbG9nL1NlcnZlci52dWU6NTk6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgSW52aXRlIGFub3RoZXIgdXNlclxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbiAgPC9MYXlvdXREaWFsb2c+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0RGlhbG9nQnV0dG9uIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuaW1wb3J0IHsgdXNlTXV0YXRpb25Mb2FkaW5nIH0gZnJvbSAnQHZ1ZS9hcG9sbG8tY29tcG9zYWJsZSdcclxuaW1wb3J0IHsgdXNlRm9ybSwgdXNlRmllbGRBcnJheSB9IGZyb20gJ3ZlZS12YWxpZGF0ZSdcclxuaW1wb3J0IHsgdXNlQWN0aXZlVXNlciB9IGZyb20gJ35+L2xpYi9hdXRoL2NvbXBvc2FibGVzL2FjdGl2ZVVzZXInXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfn4vbGliL2NvcmUvY29tcG9zYWJsZXMvbXAnXHJcbmltcG9ydCB7IHVzZVNlcnZlckluZm8gfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9zZXJ2ZXInXHJcbmltcG9ydCB7IHVzZUludml0ZVVzZXJUb1Byb2plY3QgfSBmcm9tICd+fi9saWIvcHJvamVjdHMvY29tcG9zYWJsZXMvcHJvamVjdE1hbmFnZW1lbnQnXHJcbmltcG9ydCB7IHVzZUludml0ZVVzZXJUb1NlcnZlciB9IGZyb20gJ35+L2xpYi9zZXJ2ZXIvY29tcG9zYWJsZXMvaW52aXRlcydcclxuaW1wb3J0IHsgUGx1c0ljb24sIFRyYXNoSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L291dGxpbmUnXHJcbmltcG9ydCB0eXBlIHsgSW52aXRlU2VydmVyRm9ybSwgSW52aXRlU2VydmVySXRlbSB9IGZyb20gJ35+L2xpYi9pbnZpdGVzL2hlbHBlcnMvdHlwZXMnXHJcbmltcG9ydCB7IGVtcHR5SW52aXRlU2VydmVySXRlbSB9IGZyb20gJ35+L2xpYi9pbnZpdGVzL2hlbHBlcnMvY29uc3RhbnRzJ1xyXG5pbXBvcnQgeyBpc0VtYWlsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9oZWxwZXJzL3ZhbGlkYXRpb24nXHJcbmltcG9ydCB7IHVzZUdsb2JhbFRvYXN0IH0gZnJvbSAnfn4vbGliL2NvbW1vbi9jb21wb3NhYmxlcy90b2FzdCdcclxuXHJcbmNvbnN0IGlzT3BlbiA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KCdvcGVuJywgeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG5cclxuY29uc3QgeyBoYW5kbGVTdWJtaXQgfSA9IHVzZUZvcm08SW52aXRlU2VydmVyRm9ybT4oe1xyXG4gIGluaXRpYWxWYWx1ZXM6IHtcclxuICAgIGZpZWxkczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgLi4uZW1wdHlJbnZpdGVTZXJ2ZXJJdGVtXHJcbiAgICAgIH1cclxuICAgIF1cclxuICB9XHJcbn0pXHJcbmNvbnN0IHtcclxuICBmaWVsZHMsXHJcbiAgcmVwbGFjZTogcmVwbGFjZUZpZWxkcyxcclxuICBwdXNoOiBwdXNoSW52aXRlLFxyXG4gIHJlbW92ZTogcmVtb3ZlSW52aXRlXHJcbn0gPSB1c2VGaWVsZEFycmF5PEludml0ZVNlcnZlckl0ZW0+KCdmaWVsZHMnKVxyXG5jb25zdCB7IG11dGF0ZTogaW52aXRlVXNlclRvU2VydmVyIH0gPSB1c2VJbnZpdGVVc2VyVG9TZXJ2ZXIoKVxyXG5jb25zdCBpbnZpdGVVc2VyVG9Qcm9qZWN0ID0gdXNlSW52aXRlVXNlclRvUHJvamVjdCgpXHJcbmNvbnN0IGFueU11dGF0aW9uc0xvYWRpbmcgPSB1c2VNdXRhdGlvbkxvYWRpbmcoKVxyXG5jb25zdCB7IGlzQWRtaW4gfSA9IHVzZUFjdGl2ZVVzZXIoKVxyXG5jb25zdCB7IGlzR3Vlc3RNb2RlIH0gPSB1c2VTZXJ2ZXJJbmZvKClcclxuY29uc3QgbWl4cGFuZWwgPSB1c2VNaXhwYW5lbCgpXHJcbmNvbnN0IHsgdHJpZ2dlck5vdGlmaWNhdGlvbiB9ID0gdXNlR2xvYmFsVG9hc3QoKVxyXG5cclxuY29uc3QgYWxsb3dTZXJ2ZXJSb2xlU2VsZWN0ID0gY29tcHV0ZWQoKCkgPT4gaXNBZG1pbi52YWx1ZSB8fCBpc0d1ZXN0TW9kZS52YWx1ZSlcclxuY29uc3QgZGlhbG9nQnV0dG9ucyA9IGNvbXB1dGVkKCgpOiBMYXlvdXREaWFsb2dCdXR0b25bXSA9PiBbXHJcbiAge1xyXG4gICAgdGV4dDogJ0NhbmNlbCcsXHJcbiAgICBwcm9wczogeyBjb2xvcjogJ291dGxpbmUnIH0sXHJcbiAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgIGlzT3Blbi52YWx1ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuICB7XHJcbiAgICB0ZXh0OiAnSW52aXRlJyxcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIHN1Ym1pdDogdHJ1ZSxcclxuICAgICAgZGlzYWJsZWQ6IGFueU11dGF0aW9uc0xvYWRpbmcudmFsdWVcclxuICAgIH0sXHJcbiAgICBvbkNsaWNrOiBvblN1Ym1pdFxyXG4gIH1cclxuXSlcclxuXHJcbmNvbnN0IGFkZEludml0ZUl0ZW0gPSAoKSA9PiB7XHJcbiAgcHVzaEludml0ZSh7IC4uLmVtcHR5SW52aXRlU2VydmVySXRlbSB9KVxyXG59XHJcblxyXG5jb25zdCByZW1vdmVJbnZpdGVJdGVtID0gKGluZGV4OiBudW1iZXIpID0+IHtcclxuICByZW1vdmVJbnZpdGUoaW5kZXgpXHJcbn1cclxuXHJcbmNvbnN0IG9uU3VibWl0ID0gaGFuZGxlU3VibWl0KGFzeW5jICgpID0+IHtcclxuICBjb25zdCBpbnZpdGVzID0gZmllbGRzLnZhbHVlLmZpbHRlcigoaW52aXRlKSA9PiBpbnZpdGUudmFsdWUuZW1haWwpXHJcblxyXG4gIHRyeSB7XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgaW52aXRlcy5tYXAoKGludml0ZSkgPT5cclxuICAgICAgICBpbnZpdGUudmFsdWUucHJvamVjdFxyXG4gICAgICAgICAgPyBpbnZpdGVVc2VyVG9Qcm9qZWN0KFxyXG4gICAgICAgICAgICAgIGludml0ZS52YWx1ZS5wcm9qZWN0LmlkLFxyXG4gICAgICAgICAgICAgIFt7IGVtYWlsOiBpbnZpdGUudmFsdWUuZW1haWwsIHNlcnZlclJvbGU6IGludml0ZS52YWx1ZS5zZXJ2ZXJSb2xlIH1dLFxyXG4gICAgICAgICAgICAgIHsgaGlkZVRvYXN0czogdHJ1ZSB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIDogaW52aXRlVXNlclRvU2VydmVyKFxyXG4gICAgICAgICAgICAgIFt7IGVtYWlsOiBpbnZpdGUudmFsdWUuZW1haWwsIHNlcnZlclJvbGU6IGludml0ZS52YWx1ZS5zZXJ2ZXJSb2xlIH1dLFxyXG4gICAgICAgICAgICAgIHsgaGlkZVRvYXN0czogdHJ1ZSB9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgKVxyXG4gICAgKVxyXG5cclxuICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuU3VjY2VzcyxcclxuICAgICAgdGl0bGU6XHJcbiAgICAgICAgaW52aXRlcy5sZW5ndGggPiAxXHJcbiAgICAgICAgICA/ICdJbnZpdGVzIHN1Y2Nlc3NmdWxseSBzZW5kJ1xyXG4gICAgICAgICAgOiBgSW52aXRlIHN1Y2Nlc3NmdWxseSBzZW50IHRvICR7aW52aXRlc1swXS52YWx1ZS5lbWFpbH1gXHJcbiAgICB9KVxyXG5cclxuICAgIG1peHBhbmVsLnRyYWNrKCdJbnZpdGUgQWN0aW9uJywge1xyXG4gICAgICB0eXBlOiAnc2VydmVyIGludml0ZScsXHJcbiAgICAgIG5hbWU6ICdzZW5kJyxcclxuICAgICAgbXVsdGlwbGU6IGZpZWxkcy52YWx1ZS5sZW5ndGggIT09IDEsXHJcbiAgICAgIGNvdW50OiBmaWVsZHMudmFsdWUubGVuZ3RoLFxyXG4gICAgICBoYXNQcm9qZWN0OiAhIWZpZWxkcy52YWx1ZS5zb21lKChpbnZpdGUpID0+IGludml0ZS52YWx1ZS5wcm9qZWN0KSxcclxuICAgICAgdG86ICdlbWFpbCdcclxuICAgIH0pXHJcblxyXG4gICAgaXNPcGVuLnZhbHVlID0gZmFsc2VcclxuICB9IGNhdGNoIHtcclxuICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuRGFuZ2VyLFxyXG4gICAgICB0aXRsZTpcclxuICAgICAgICBpbnZpdGVzLmxlbmd0aCA+IDFcclxuICAgICAgICAgID8gJ09uZSBvciBtb3JlIGludml0ZXMgZmFpbGVkIHRvIHNlbmQnXHJcbiAgICAgICAgICA6IGBGYWlsZWQgdG8gc2VuZCBpbnZpdGUgdG8gJHtpbnZpdGVzWzBdLnZhbHVlLmVtYWlsfWBcclxuICAgIH0pXHJcbiAgfVxyXG59KVxyXG5cclxud2F0Y2goaXNPcGVuLCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICBpZiAobmV3VmFsICYmICFvbGRWYWwpIHtcclxuICAgIHJlcGxhY2VGaWVsZHMoW1xyXG4gICAgICB7XHJcbiAgICAgICAgLi4uZW1wdHlJbnZpdGVTZXJ2ZXJJdGVtXHJcbiAgICAgIH1cclxuICAgIF0pXHJcbiAgfVxyXG59KVxyXG48L3NjcmlwdD5cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2NvbXBvbmVudHMvaW52aXRlL2RpYWxvZy9TZXJ2ZXIudnVlIn0=