import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/workspace/invite/Block.vue");import { UserAvatar as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { FormButton as __nuxt_component_1 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; /* Injection by vite-plugin-vue-inspector Start */ import { createElementVNode as __createElementVNode,createElementBlock as __createElementBlock,createVNode as __createVNode,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 _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) } function _createVNode(...args) { return _interopVNode(__createVNode(...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 { RelativeURL } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { useAuthManager } from "/_nuxt/lib/auth/composables/auth.ts"; import { usePostAuthRedirect } from "/_nuxt/lib/auth/composables/postAuthRedirect.ts"; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { useNavigateToLogin, useNavigateToRegistration } from "/_nuxt/lib/common/helpers/route.ts"; import { useWorkspaceInviteManager } from "/_nuxt/lib/workspaces/composables/management.ts"; import { useWorkspacePublicSsoCheck } from "/_nuxt/lib/workspaces/composables/sso.ts"; import { useActiveUser } from "/_nuxt/composables/globals.ts"; import { useRoute, useRouter } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29"; import { useLogger } from "/_nuxt/composables/logging.ts"; import { computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "WorkspaceInviteBlock", props: { invite: { type: Object, required: true } }, setup(__props, { expose: __expose }) { __expose(); graphql(` fragment WorkspaceInviteBlock_PendingWorkspaceCollaborator on PendingWorkspaceCollaborator { id workspace { id name logo } token user { id name ...LimitedUserAvatar } title email ...UseWorkspaceInviteManager_PendingWorkspaceCollaborator } `); const props = __props; const { activeUser } = useActiveUser(); const route = useRoute(); const router = useRouter(); const logger = useLogger(); const postAuthRedirect = usePostAuthRedirect(); const { logout } = useAuthManager(); const goToLogin = useNavigateToLogin(); const goToRegister = useNavigateToRegistration(); const { loading, accept, decline, token, isCurrentUserTarget, targetUser } = useWorkspaceInviteManager({ invite: computed(() => props.invite) }); const workspaceSlug = computed(() => props.invite.workspace.slug ?? ""); const { hasSsoEnabled } = useWorkspacePublicSsoCheck(workspaceSlug); const buildPostAuthRedirectUrl = (params) => { const currentRoute = new RelativeURL(route.fullPath); if (params.addNewEmail) { currentRoute.searchParams.set("addNewEmail", "true"); } if (params.autoAccept) { currentRoute.searchParams.set("accept", "true"); } if (token.value) { currentRoute.searchParams.set("token", token.value); } return currentRoute.toString(); }; const signOutGoToLogin = async (params) => { const postAuthRedirectUrl = buildPostAuthRedirectUrl({ addNewEmail: params?.addNewEmail || false, autoAccept: true }); await logout({ skipRedirect: true }); postAuthRedirect.set(postAuthRedirectUrl, true); await goToLogin({ query: { token: token.value } }); }; const signOutGoToRegister = async () => { try { if (!props.invite.workspace.slug) { logger.warn( "No workspace slug found in invite, falling back to regular registration" ); goToRegister({ query: { token: token.value } }); return; } const postAuthRedirectUrl = buildPostAuthRedirectUrl({ addNewEmail: true, autoAccept: true }); await logout({ skipRedirect: true }); postAuthRedirect.set(postAuthRedirectUrl, true); if (hasSsoEnabled.value) { router.push({ path: `/workspaces/${props.invite.workspace.slug}/sso/register`, query: { token: token.value, register: "true" } }); } else { goToRegister({ query: { token: token.value } }); } } catch (error) { logger.error("Error during SSO check:", error); goToRegister({ query: { token: token.value } }); } }; const acceptAndAddEmail = () => accept({ addNewEmail: true }); const __returned__ = { props, activeUser, route, router, logger, postAuthRedirect, logout, goToLogin, goToRegister, loading, accept, decline, token, isCurrentUserTarget, targetUser, workspaceSlug, hasSsoEnabled, buildPostAuthRedirectUrl, signOutGoToLogin, signOutGoToRegister, acceptAndAddEmail }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, Fragment as _Fragment, openBlock as _openBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { class: "space-y-8 max-w-96", "data-v-inspector": "components/workspace/invite/Block.vue:2:3" }; const _hoisted_2 = { class: "p-4 border border-outline-2 rounded text-body-xs", "data-v-inspector": "components/workspace/invite/Block.vue:4:5" }; const _hoisted_3 = { class: "font-medium", "data-v-inspector": "components/workspace/invite/Block.vue:6:7" }; const _hoisted_4 = { class: "inline-flex items-center font-medium", "data-v-inspector": "components/workspace/invite/Block.vue:13:13" }; const _hoisted_5 = { class: "font-medium", "data-v-inspector": "components/workspace/invite/Block.vue:22:11" }; const _hoisted_6 = { class: "flex flex-col space-y-4", "data-v-inspector": "components/workspace/invite/Block.vue:27:5" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_UserAvatar = __nuxt_component_0; const _component_FormButton = __nuxt_component_1; return _openBlock(), _createElementBlock("div", _hoisted_1, [ _cache[13] || (_cache[13] = _createElementVNode( "h1", { class: "text-heading-xl text-center", "data-v-inspector": "components/workspace/invite/Block.vue:3:5" }, "Join workspace", -1 /* CACHED */ )), _createElementVNode("div", _hoisted_2, [ _cache[8] || (_cache[8] = _createTextVNode( " You're accepting an invitation to join ", -1 /* CACHED */ )), _createElementVNode( "span", _hoisted_3, _toDisplayString($props.invite.workspace.name), 1 /* TEXT */ ), $setup.isCurrentUserTarget ? (_openBlock(), _createElementBlock( _Fragment, { key: 0 }, [ _createTextVNode(".") ], 64 /* STABLE_FRAGMENT */ )) : (_openBlock(), _createElementBlock( _Fragment, { key: 1 }, [ $setup.targetUser ? (_openBlock(), _createElementBlock( _Fragment, { key: 0 }, [ _createCommentVNode(" prettier-ignore "), $setup.activeUser ? (_openBlock(), _createElementBlock( _Fragment, { key: 0 }, [ _cache[4] || (_cache[4] = _createTextVNode( " however the invitation was sent to ", -1 /* CACHED */ )), _createElementVNode("span", _hoisted_4, [ _createVNode(_component_UserAvatar, { user: $setup.targetUser, size: "sm", class: "mr-1", "data-v-inspector": "components/workspace/invite/Block.vue:14:15" }, null, 8, ["user"]), _createTextVNode( " " + _toDisplayString($setup.targetUser.name), 1 /* TEXT */ ) ]), _cache[5] || (_cache[5] = _createTextVNode( ". You have to sign out from the current account to proceed. ", -1 /* CACHED */ )) ], 64 /* STABLE_FRAGMENT */ )) : (_openBlock(), _createElementBlock( _Fragment, { key: 1 }, [ _createTextVNode(". Please sign in to proceed.") ], 64 /* STABLE_FRAGMENT */ )) ], 64 /* STABLE_FRAGMENT */ )) : (_openBlock(), _createElementBlock( _Fragment, { key: 1 }, [ _cache[6] || (_cache[6] = _createTextVNode( " using the ", -1 /* CACHED */ )), _createElementVNode( "span", _hoisted_5, _toDisplayString($props.invite.email), 1 /* TEXT */ ), _cache[7] || (_cache[7] = _createTextVNode( " email address. ", -1 /* CACHED */ )) ], 64 /* STABLE_FRAGMENT */ )) ], 64 /* STABLE_FRAGMENT */ )) ]), _createElementVNode("div", _hoisted_6, [ $setup.isCurrentUserTarget ? (_openBlock(), _createElementBlock( _Fragment, { key: 0 }, [ _createVNode(_component_FormButton, { color: "primary", size: "lg", "full-width": "", disabled: $setup.loading, onClick: _cache[0] || (_cache[0] = () => $setup.accept()), "data-v-inspector": "components/workspace/invite/Block.vue:29:9" }, { default: _withCtx(() => [..._cache[9] || (_cache[9] = [ _createTextVNode( " Accept ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["disabled"]), _createVNode(_component_FormButton, { color: "outline", size: "lg", "full-width": "", disabled: $setup.loading, onClick: _cache[1] || (_cache[1] = () => $setup.decline()), "data-v-inspector": "components/workspace/invite/Block.vue:38:9" }, { default: _withCtx(() => [..._cache[10] || (_cache[10] = [ _createTextVNode( " Decline ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["disabled"]) ], 64 /* STABLE_FRAGMENT */ )) : (_openBlock(), _createElementBlock( _Fragment, { key: 1 }, [ $setup.targetUser ? (_openBlock(), _createBlock(_component_FormButton, { key: 0, color: "primary", size: "lg", "full-width": "", disabled: $setup.loading, onClick: _cache[2] || (_cache[2] = () => $setup.signOutGoToLogin()), "data-v-inspector": "components/workspace/invite/Block.vue:50:11" }, { default: _withCtx(() => [ _createTextVNode( _toDisplayString($setup.activeUser ? "Sign out to continue" : "Sign in to continue"), 1 /* TEXT */ ) ]), _: 1 /* STABLE */ }, 8, ["disabled"])) : (_openBlock(), _createElementBlock( _Fragment, { key: 1 }, [ _createVNode(_component_FormButton, { color: "outline", size: "lg", "full-width": "", disabled: $setup.loading, onClick: $setup.signOutGoToRegister, "data-v-inspector": "components/workspace/invite/Block.vue:61:11" }, { default: _withCtx(() => [..._cache[11] || (_cache[11] = [ _createTextVNode( " Create new account ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["disabled"]), _createVNode(_component_FormButton, { color: "primary", size: "lg", "full-width": "", disabled: $setup.loading, onClick: _cache[3] || (_cache[3] = () => $setup.activeUser ? $setup.acceptAndAddEmail() : $setup.signOutGoToLogin({ addNewEmail: true })), "data-v-inspector": "components/workspace/invite/Block.vue:70:11" }, { default: _withCtx(() => [..._cache[12] || (_cache[12] = [ _createTextVNode( " Add new email to existing account ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["disabled"]) ], 64 /* STABLE_FRAGMENT */ )) ], 64 /* STABLE_FRAGMENT */ )) ]) ]); } _sfc_main.__hmrId = "d28416b4"; 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/invite/Block.vue"]]); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUZBLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsZUFBZTtBQUV4QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsa0NBQWtDOzs7Ozs7Ozs7Ozs7O0FBRTNDLFlBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsQ0FrQlA7QUFFRCxVQUFNLFFBQVE7QUFJZCxVQUFNLEVBQUUsV0FBVyxJQUFJLGNBQWM7QUFDckMsVUFBTSxRQUFRLFNBQVM7QUFDdkIsVUFBTSxTQUFTLFVBQVU7QUFDekIsVUFBTSxTQUFTLFVBQVU7QUFDekIsVUFBTSxtQkFBbUIsb0JBQW9CO0FBQzdDLFVBQU0sRUFBRSxPQUFPLElBQUksZUFBZTtBQUNsQyxVQUFNLFlBQVksbUJBQW1CO0FBQ3JDLFVBQU0sZUFBZSwwQkFBMEI7QUFDL0MsVUFBTSxFQUFFLFNBQVMsUUFBUSxTQUFTLE9BQU8scUJBQXFCLFdBQVcsSUFDdkUsMEJBQTBCO0FBQUEsTUFDeEIsUUFBUSxTQUFTLE1BQU0sTUFBTSxNQUFNO0FBQUEsSUFDckMsQ0FBQztBQUVILFVBQU0sZ0JBQWdCLFNBQVMsTUFBTSxNQUFNLE9BQU8sVUFBVSxRQUFRLEVBQUU7QUFDdEUsVUFBTSxFQUFFLGNBQWMsSUFBSSwyQkFBMkIsYUFBYTtBQUVsRSxVQUFNLDJCQUEyQixDQUFDLFdBRzVCO0FBQ0osWUFBTSxlQUFlLElBQUksWUFBWSxNQUFNLFFBQVE7QUFDbkQsVUFBSSxPQUFPLGFBQWE7QUFDdEIscUJBQWEsYUFBYSxJQUFJLGVBQWUsTUFBTTtBQUFBLE1BQ3JEO0FBQ0EsVUFBSSxPQUFPLFlBQVk7QUFDckIscUJBQWEsYUFBYSxJQUFJLFVBQVUsTUFBTTtBQUFBLE1BQ2hEO0FBQ0EsVUFBSSxNQUFNLE9BQU87QUFDZixxQkFBYSxhQUFhLElBQUksU0FBUyxNQUFNLEtBQUs7QUFBQSxNQUNwRDtBQUVBLGFBQU8sYUFBYSxTQUFTO0FBQUEsSUFDL0I7QUFFQSxVQUFNLG1CQUFtQixPQUFPLFdBQXVDO0FBQ3JFLFlBQU0sc0JBQXNCLHlCQUF5QjtBQUFBLFFBQ25ELGFBQWEsUUFBUSxlQUFlO0FBQUEsUUFDcEMsWUFBWTtBQUFBLE1BQ2QsQ0FBQztBQUVELFlBQU0sT0FBTyxFQUFFLGNBQWMsS0FBSyxDQUFDO0FBQ25DLHVCQUFpQixJQUFJLHFCQUFxQixJQUFJO0FBQzlDLFlBQU0sVUFBVTtBQUFBLFFBQ2QsT0FBTztBQUFBLFVBQ0wsT0FBTyxNQUFNO0FBQUEsUUFDZjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFNQSxVQUFNLHNCQUFzQixZQUFZO0FBQ3RDLFVBQUk7QUFDRixZQUFJLENBQUMsTUFBTSxPQUFPLFVBQVUsTUFBTTtBQUNoQyxpQkFBTztBQUFBLFlBQ0w7QUFBQSxVQUNGO0FBQ0EsdUJBQWEsRUFBRSxPQUFPLEVBQUUsT0FBTyxNQUFNLE1BQU0sRUFBRSxDQUFDO0FBQzlDO0FBQUEsUUFDRjtBQUVBLGNBQU0sc0JBQXNCLHlCQUF5QjtBQUFBLFVBQ25ELGFBQWE7QUFBQSxVQUNiLFlBQVk7QUFBQSxRQUNkLENBQUM7QUFFRCxjQUFNLE9BQU8sRUFBRSxjQUFjLEtBQUssQ0FBQztBQUNuQyx5QkFBaUIsSUFBSSxxQkFBcUIsSUFBSTtBQUU5QyxZQUFJLGNBQWMsT0FBTztBQUN2QixpQkFBTyxLQUFLO0FBQUEsWUFDVixNQUFNLGVBQWUsTUFBTSxPQUFPLFVBQVUsSUFBSTtBQUFBLFlBQ2hELE9BQU87QUFBQSxjQUNMLE9BQU8sTUFBTTtBQUFBLGNBQ2IsVUFBVTtBQUFBLFlBQ1o7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNILE9BQU87QUFDTCx1QkFBYSxFQUFFLE9BQU8sRUFBRSxPQUFPLE1BQU0sTUFBTSxFQUFFLENBQUM7QUFBQSxRQUNoRDtBQUFBLE1BQ0YsU0FBUyxPQUFPO0FBQ2QsZUFBTyxNQUFNLDJCQUEyQixLQUFLO0FBQzdDLHFCQUFhLEVBQUUsT0FBTyxFQUFFLE9BQU8sTUFBTSxNQUFNLEVBQUUsQ0FBQztBQUFBLE1BQ2hEO0FBQUEsSUFDRjtBQUVBLFVBQU0sb0JBQW9CLE1BQU0sT0FBTyxFQUFFLGFBQWEsS0FBSyxDQUFDOzs7Ozs7OztFQXBOckQsT0FBTTtBQUFBLEVBQXFCLG9CQUFpQjs7O0VBRTFDLE9BQU07QUFBQSxFQUFtRCxvQkFBaUI7OztFQUV2RSxPQUFNO0FBQUEsRUFBYyxvQkFBaUI7OztFQU8vQixPQUFNO0FBQUEsRUFBdUMsb0JBQWlCOzs7RUFTaEUsT0FBTTtBQUFBLEVBQWMsb0JBQWlCOzs7RUFLNUMsT0FBTTtBQUFBLEVBQTBCLG9CQUFpQjs7Ozs7dUJBekJ4RCxvQkFxRk0sT0FyRk4sWUFxRk07QUFBQSxnQ0FwRko7QUFBQSxNQUF3SDtBQUFBO0FBQUEsUUFBcEgsT0FBTTtBQUFBLFFBQThCLG9CQUFpQjtBQUFBO01BQTRDO0FBQUEsTUFBYztBQUFBO0FBQUE7QUFBQSxJQUNuSCxvQkFzQk0sT0F0Qk4sWUFzQk07QUFBQTtRQXRCcUg7QUFBQSxRQUV6SDtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBQXlIO0FBQUEsUUFBekg7QUFBQSxRQUF5SCxpQkFBL0IsY0FBTyxVQUFVLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUMvRiw0Q0FBaEI7QUFBQSxRQUFpRDtBQUFBO0FBQUE7QUFBQSwyQkFBWixHQUFDO0FBQUE7OzswQkFDdEM7QUFBQSxRQWlCVztBQUFBO0FBQUE7QUFBQSxVQWhCTyxtQ0FBaEI7QUFBQSxZQVVXO0FBQUE7QUFBQTtBQUFBLGNBVFQ7QUFBQSxjQUNnQixtQ0FBaEI7QUFBQSxnQkFNVztBQUFBO0FBQUE7QUFBQTtvQkFOaUI7QUFBQSxvQkFFMUI7QUFBQTtBQUFBO0FBQUEsc0NBR08sUUFIUCxZQUdPO0FBQUEsb0JBRkwsYUFBdUg7QUFBQSxzQkFBMUcsTUFBTTtBQUFBLHNCQUFZLE1BQUs7QUFBQSxzQkFBSyxPQUFNO0FBQUEsc0JBQU8sb0JBQWlCO0FBQUE7O3NCQUFnRCxNQUN2SCxpQkFBRyxrQkFBVyxJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUE7O29CQUNiO0FBQUEsb0JBQ1Q7QUFBQTtBQUFBO0FBQUE7OztrQ0FDQTtBQUFBLGdCQUF3RDtBQUFBO0FBQUE7QUFBQSxtQ0FBdkMsOEJBQTRCO0FBQUE7Ozs7Ozs7OEJBRS9DO0FBQUEsWUFJVztBQUFBO0FBQUE7QUFBQTtnQkFKTTtBQUFBLGdCQUVmO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBQWtIO0FBQUEsZ0JBQWxIO0FBQUEsZ0JBQWtILGlCQUF0QixjQUFPLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQTtnQkFBVTtBQUFBLGdCQUVwSDtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7O0lBR0osb0JBMkRNLE9BM0ROLFlBMkRNO0FBQUEsTUExRFksNENBQWhCO0FBQUEsUUFtQlc7QUFBQTtBQUFBO0FBQUEsVUFsQlQsYUFRYTtBQUFBLFlBUFgsT0FBTTtBQUFBLFlBQ04sTUFBSztBQUFBLFlBQ0w7QUFBQSxZQUNDLFVBQVU7QUFBQSxZQUNWLFNBQUssZ0NBQVEsY0FBTTtBQUFBLFlBQUksb0JBQWlCO0FBQUE7OEJBQzFDLE1BRUQ7QUFBQTtnQkFGQztBQUFBLGdCQUVEO0FBQUE7QUFBQTtBQUFBOzs7O1VBQ0EsYUFRYTtBQUFBLFlBUFgsT0FBTTtBQUFBLFlBQ04sTUFBSztBQUFBLFlBQ0w7QUFBQSxZQUNDLFVBQVU7QUFBQSxZQUNWLFNBQUssZ0NBQVEsZUFBTztBQUFBLFlBQUksb0JBQWlCO0FBQUE7OEJBQzNDLE1BRUQ7QUFBQTtnQkFGQztBQUFBLGdCQUVEO0FBQUE7QUFBQTtBQUFBOzs7Ozs7OzBCQUVGO0FBQUEsUUFxQ1c7QUFBQTtBQUFBO0FBQUEsVUFwQ08sbUNBQ2QsYUFRYTtBQUFBO1lBUFgsT0FBTTtBQUFBLFlBQ04sTUFBSztBQUFBLFlBQ0w7QUFBQSxZQUNDLFVBQVU7QUFBQSxZQUNWLFNBQUssZ0NBQVEsd0JBQWdCO0FBQUEsWUFBSSxvQkFBaUI7QUFBQTs4QkFFbkQsTUFBaUU7QUFBQTtpQ0FBOUQsb0JBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O2dEQUdqQjtBQUFBLFlBd0JXO0FBQUE7QUFBQTtBQUFBLGNBdkJULGFBUWE7QUFBQSxnQkFQWCxPQUFNO0FBQUEsZ0JBQ04sTUFBSztBQUFBLGdCQUNMO0FBQUEsZ0JBQ0MsVUFBVTtBQUFBLGdCQUNWLFNBQU87QUFBQSxnQkFBcUIsb0JBQWlCO0FBQUE7a0NBQy9DLE1BRUQ7QUFBQTtvQkFGQztBQUFBLG9CQUVEO0FBQUE7QUFBQTtBQUFBOzs7O2NBQ0EsYUFhYTtBQUFBLGdCQVpYLE9BQU07QUFBQSxnQkFDTixNQUFLO0FBQUEsZ0JBQ0w7QUFBQSxnQkFDQyxVQUFVO0FBQUEsZ0JBQ1YsU0FBSyxnQ0FBeUMsb0JBQWdDLHlCQUFpQixJQUF3Qix3QkFBZ0I7QUFBQSxnQkFLdEksb0JBQWlCO0FBQUE7a0NBQ3BCLE1BRUQ7QUFBQTtvQkFGQztBQUFBLG9CQUVEO0FBQUE7QUFBQTtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJCbG9jay52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJzcGFjZS15LTggbWF4LXctOTZcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvaW52aXRlL0Jsb2NrLnZ1ZToyOjNcIj5cclxuICAgIDxoMSBjbGFzcz1cInRleHQtaGVhZGluZy14bCB0ZXh0LWNlbnRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjM6NVwiPkpvaW4gd29ya3NwYWNlPC9oMT5cclxuICAgIDxkaXYgY2xhc3M9XCJwLTQgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTIgcm91bmRlZCB0ZXh0LWJvZHkteHNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvaW52aXRlL0Jsb2NrLnZ1ZTo0OjVcIj5cclxuICAgICAgWW91J3JlIGFjY2VwdGluZyBhbiBpbnZpdGF0aW9uIHRvIGpvaW5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJmb250LW1lZGl1bVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjY6N1wiPnt7IGludml0ZS53b3Jrc3BhY2UubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpc0N1cnJlbnRVc2VyVGFyZ2V0XCI+LjwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJ0YXJnZXRVc2VyXCI+XHJcbiAgICAgICAgICA8IS0tIHByZXR0aWVyLWlnbm9yZSAtLT5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiYWN0aXZlVXNlclwiPlxyXG4gICAgICAgICAgICBob3dldmVyIHRoZSBpbnZpdGF0aW9uIHdhcyBzZW50IHRvXHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGZvbnQtbWVkaXVtXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL2ludml0ZS9CbG9jay52dWU6MTM6MTNcIj5cclxuICAgICAgICAgICAgICA8VXNlckF2YXRhciA6dXNlcj1cInRhcmdldFVzZXJcIiBzaXplPVwic21cIiBjbGFzcz1cIm1yLTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvaW52aXRlL0Jsb2NrLnZ1ZToxNDoxNVwiIC8+XHJcbiAgICAgICAgICAgICAge3sgdGFyZ2V0VXNlci5uYW1lIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj4uIFlvdSBoYXZlIHRvIHNpZ24gb3V0IGZyb20gdGhlIGN1cnJlbnQgYWNjb3VudCB0byBwcm9jZWVkLlxyXG4gICAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+LiBQbGVhc2Ugc2lnbiBpbiB0byBwcm9jZWVkLjwvdGVtcGxhdGU+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgdXNpbmcgdGhlXHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtbWVkaXVtXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL2ludml0ZS9CbG9jay52dWU6MjI6MTFcIj57eyBpbnZpdGUuZW1haWwgfX08L3NwYW4+XHJcbiAgICAgICAgICBlbWFpbCBhZGRyZXNzLlxyXG4gICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHNwYWNlLXktNFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjI3OjVcIj5cclxuICAgICAgPHRlbXBsYXRlIHYtaWY9XCJpc0N1cnJlbnRVc2VyVGFyZ2V0XCI+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICBzaXplPVwibGdcIlxyXG4gICAgICAgICAgZnVsbC13aWR0aFxyXG4gICAgICAgICAgOmRpc2FibGVkPVwibG9hZGluZ1wiXHJcbiAgICAgICAgICBAY2xpY2s9XCIoKSA9PiBhY2NlcHQoKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjI5OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIEFjY2VwdFxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgIHNpemU9XCJsZ1wiXHJcbiAgICAgICAgICBmdWxsLXdpZHRoXHJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJsb2FkaW5nXCJcclxuICAgICAgICAgIEBjbGljaz1cIigpID0+IGRlY2xpbmUoKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjM4OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIERlY2xpbmVcclxuICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSB2LWVsc2U+XHJcbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCJ0YXJnZXRVc2VyXCI+XHJcbiAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICBzaXplPVwibGdcIlxyXG4gICAgICAgICAgICBmdWxsLXdpZHRoXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cImxvYWRpbmdcIlxyXG4gICAgICAgICAgICBAY2xpY2s9XCIoKSA9PiBzaWduT3V0R29Ub0xvZ2luKClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy93b3Jrc3BhY2UvaW52aXRlL0Jsb2NrLnZ1ZTo1MDoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGFjdGl2ZVVzZXIgPyAnU2lnbiBvdXQgdG8gY29udGludWUnIDogJ1NpZ24gaW4gdG8gY29udGludWUnIH19XHJcbiAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgc2l6ZT1cImxnXCJcclxuICAgICAgICAgICAgZnVsbC13aWR0aFxyXG4gICAgICAgICAgICA6ZGlzYWJsZWQ9XCJsb2FkaW5nXCJcclxuICAgICAgICAgICAgQGNsaWNrPVwic2lnbk91dEdvVG9SZWdpc3RlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3dvcmtzcGFjZS9pbnZpdGUvQmxvY2sudnVlOjYxOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgQ3JlYXRlIG5ldyBhY2NvdW50XHJcbiAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICBzaXplPVwibGdcIlxyXG4gICAgICAgICAgICBmdWxsLXdpZHRoXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cImxvYWRpbmdcIlxyXG4gICAgICAgICAgICBAY2xpY2s9XCJcclxuICAgICAgICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgICAgICAgYWN0aXZlVXNlclxyXG4gICAgICAgICAgICAgICAgICA/IGFjY2VwdEFuZEFkZEVtYWlsKClcclxuICAgICAgICAgICAgICAgICAgOiBzaWduT3V0R29Ub0xvZ2luKHsgYWRkTmV3RW1haWw6IHRydWUgfSlcclxuICAgICAgICAgICAgXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvd29ya3NwYWNlL2ludml0ZS9CbG9jay52dWU6NzA6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBBZGQgbmV3IGVtYWlsIHRvIGV4aXN0aW5nIGFjY291bnRcclxuICAgICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IFJlbGF0aXZlVVJMIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VBdXRoTWFuYWdlciB9IGZyb20gJ34vbGliL2F1dGgvY29tcG9zYWJsZXMvYXV0aCdcclxuaW1wb3J0IHsgdXNlUG9zdEF1dGhSZWRpcmVjdCB9IGZyb20gJ34vbGliL2F1dGgvY29tcG9zYWJsZXMvcG9zdEF1dGhSZWRpcmVjdCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUludml0ZUJsb2NrX1BlbmRpbmdXb3Jrc3BhY2VDb2xsYWJvcmF0b3JGcmFnbWVudCB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB7XHJcbiAgdXNlTmF2aWdhdGVUb0xvZ2luLFxyXG4gIHVzZU5hdmlnYXRlVG9SZWdpc3RyYXRpb25cclxufSBmcm9tICd+L2xpYi9jb21tb24vaGVscGVycy9yb3V0ZSdcclxuaW1wb3J0IHsgdXNlV29ya3NwYWNlSW52aXRlTWFuYWdlciB9IGZyb20gJ34vbGliL3dvcmtzcGFjZXMvY29tcG9zYWJsZXMvbWFuYWdlbWVudCdcclxuaW1wb3J0IHsgdXNlV29ya3NwYWNlUHVibGljU3NvQ2hlY2sgfSBmcm9tICd+L2xpYi93b3Jrc3BhY2VzL2NvbXBvc2FibGVzL3NzbydcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFdvcmtzcGFjZUludml0ZUJsb2NrX1BlbmRpbmdXb3Jrc3BhY2VDb2xsYWJvcmF0b3Igb24gUGVuZGluZ1dvcmtzcGFjZUNvbGxhYm9yYXRvciB7XHJcbiAgICBpZFxyXG4gICAgd29ya3NwYWNlIHtcclxuICAgICAgaWRcclxuICAgICAgbmFtZVxyXG4gICAgICBsb2dvXHJcbiAgICB9XHJcbiAgICB0b2tlblxyXG4gICAgdXNlciB7XHJcbiAgICAgIGlkXHJcbiAgICAgIG5hbWVcclxuICAgICAgLi4uTGltaXRlZFVzZXJBdmF0YXJcclxuICAgIH1cclxuICAgIHRpdGxlXHJcbiAgICBlbWFpbFxyXG4gICAgLi4uVXNlV29ya3NwYWNlSW52aXRlTWFuYWdlcl9QZW5kaW5nV29ya3NwYWNlQ29sbGFib3JhdG9yXHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgaW52aXRlOiBXb3Jrc3BhY2VJbnZpdGVCbG9ja19QZW5kaW5nV29ya3NwYWNlQ29sbGFib3JhdG9yRnJhZ21lbnRcclxufT4oKVxyXG5cclxuY29uc3QgeyBhY3RpdmVVc2VyIH0gPSB1c2VBY3RpdmVVc2VyKClcclxuY29uc3Qgcm91dGUgPSB1c2VSb3V0ZSgpXHJcbmNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpXHJcbmNvbnN0IGxvZ2dlciA9IHVzZUxvZ2dlcigpXHJcbmNvbnN0IHBvc3RBdXRoUmVkaXJlY3QgPSB1c2VQb3N0QXV0aFJlZGlyZWN0KClcclxuY29uc3QgeyBsb2dvdXQgfSA9IHVzZUF1dGhNYW5hZ2VyKClcclxuY29uc3QgZ29Ub0xvZ2luID0gdXNlTmF2aWdhdGVUb0xvZ2luKClcclxuY29uc3QgZ29Ub1JlZ2lzdGVyID0gdXNlTmF2aWdhdGVUb1JlZ2lzdHJhdGlvbigpXHJcbmNvbnN0IHsgbG9hZGluZywgYWNjZXB0LCBkZWNsaW5lLCB0b2tlbiwgaXNDdXJyZW50VXNlclRhcmdldCwgdGFyZ2V0VXNlciB9ID1cclxuICB1c2VXb3Jrc3BhY2VJbnZpdGVNYW5hZ2VyKHtcclxuICAgIGludml0ZTogY29tcHV0ZWQoKCkgPT4gcHJvcHMuaW52aXRlKVxyXG4gIH0pXHJcblxyXG5jb25zdCB3b3Jrc3BhY2VTbHVnID0gY29tcHV0ZWQoKCkgPT4gcHJvcHMuaW52aXRlLndvcmtzcGFjZS5zbHVnID8/ICcnKVxyXG5jb25zdCB7IGhhc1Nzb0VuYWJsZWQgfSA9IHVzZVdvcmtzcGFjZVB1YmxpY1Nzb0NoZWNrKHdvcmtzcGFjZVNsdWcpXHJcblxyXG5jb25zdCBidWlsZFBvc3RBdXRoUmVkaXJlY3RVcmwgPSAocGFyYW1zOiB7XHJcbiAgYXV0b0FjY2VwdD86IGJvb2xlYW5cclxuICBhZGROZXdFbWFpbD86IGJvb2xlYW5cclxufSkgPT4ge1xyXG4gIGNvbnN0IGN1cnJlbnRSb3V0ZSA9IG5ldyBSZWxhdGl2ZVVSTChyb3V0ZS5mdWxsUGF0aClcclxuICBpZiAocGFyYW1zLmFkZE5ld0VtYWlsKSB7XHJcbiAgICBjdXJyZW50Um91dGUuc2VhcmNoUGFyYW1zLnNldCgnYWRkTmV3RW1haWwnLCAndHJ1ZScpXHJcbiAgfVxyXG4gIGlmIChwYXJhbXMuYXV0b0FjY2VwdCkge1xyXG4gICAgY3VycmVudFJvdXRlLnNlYXJjaFBhcmFtcy5zZXQoJ2FjY2VwdCcsICd0cnVlJylcclxuICB9XHJcbiAgaWYgKHRva2VuLnZhbHVlKSB7XHJcbiAgICBjdXJyZW50Um91dGUuc2VhcmNoUGFyYW1zLnNldCgndG9rZW4nLCB0b2tlbi52YWx1ZSlcclxuICB9XHJcblxyXG4gIHJldHVybiBjdXJyZW50Um91dGUudG9TdHJpbmcoKVxyXG59XHJcblxyXG5jb25zdCBzaWduT3V0R29Ub0xvZ2luID0gYXN5bmMgKHBhcmFtcz86IHsgYWRkTmV3RW1haWw/OiBib29sZWFuIH0pID0+IHtcclxuICBjb25zdCBwb3N0QXV0aFJlZGlyZWN0VXJsID0gYnVpbGRQb3N0QXV0aFJlZGlyZWN0VXJsKHtcclxuICAgIGFkZE5ld0VtYWlsOiBwYXJhbXM/LmFkZE5ld0VtYWlsIHx8IGZhbHNlLFxyXG4gICAgYXV0b0FjY2VwdDogdHJ1ZVxyXG4gIH0pXHJcblxyXG4gIGF3YWl0IGxvZ291dCh7IHNraXBSZWRpcmVjdDogdHJ1ZSB9KVxyXG4gIHBvc3RBdXRoUmVkaXJlY3Quc2V0KHBvc3RBdXRoUmVkaXJlY3RVcmwsIHRydWUpXHJcbiAgYXdhaXQgZ29Ub0xvZ2luKHtcclxuICAgIHF1ZXJ5OiB7XHJcbiAgICAgIHRva2VuOiB0b2tlbi52YWx1ZVxyXG4gICAgfVxyXG4gIH0pXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHbyB0byByZWdpc3RlciBhbmQgc2V0IHBvc3QtYXV0aCByZWRpcmVjdCB0byBhY2NlcHRpbmcgdGhlIGludml0ZVxyXG4gKiBhbmQgYWRkaW5nIHRoZSB0YXJnZXQgZW1haWwgdG8gdGhlIGFjY291bnRcclxuICovXHJcbmNvbnN0IHNpZ25PdXRHb1RvUmVnaXN0ZXIgPSBhc3luYyAoKSA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIGlmICghcHJvcHMuaW52aXRlLndvcmtzcGFjZS5zbHVnKSB7XHJcbiAgICAgIGxvZ2dlci53YXJuKFxyXG4gICAgICAgICdObyB3b3Jrc3BhY2Ugc2x1ZyBmb3VuZCBpbiBpbnZpdGUsIGZhbGxpbmcgYmFjayB0byByZWd1bGFyIHJlZ2lzdHJhdGlvbidcclxuICAgICAgKVxyXG4gICAgICBnb1RvUmVnaXN0ZXIoeyBxdWVyeTogeyB0b2tlbjogdG9rZW4udmFsdWUgfSB9KVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwb3N0QXV0aFJlZGlyZWN0VXJsID0gYnVpbGRQb3N0QXV0aFJlZGlyZWN0VXJsKHtcclxuICAgICAgYWRkTmV3RW1haWw6IHRydWUsXHJcbiAgICAgIGF1dG9BY2NlcHQ6IHRydWVcclxuICAgIH0pXHJcblxyXG4gICAgYXdhaXQgbG9nb3V0KHsgc2tpcFJlZGlyZWN0OiB0cnVlIH0pXHJcbiAgICBwb3N0QXV0aFJlZGlyZWN0LnNldChwb3N0QXV0aFJlZGlyZWN0VXJsLCB0cnVlKVxyXG5cclxuICAgIGlmIChoYXNTc29FbmFibGVkLnZhbHVlKSB7XHJcbiAgICAgIHJvdXRlci5wdXNoKHtcclxuICAgICAgICBwYXRoOiBgL3dvcmtzcGFjZXMvJHtwcm9wcy5pbnZpdGUud29ya3NwYWNlLnNsdWd9L3Nzby9yZWdpc3RlcmAsXHJcbiAgICAgICAgcXVlcnk6IHtcclxuICAgICAgICAgIHRva2VuOiB0b2tlbi52YWx1ZSxcclxuICAgICAgICAgIHJlZ2lzdGVyOiAndHJ1ZSdcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBnb1RvUmVnaXN0ZXIoeyBxdWVyeTogeyB0b2tlbjogdG9rZW4udmFsdWUgfSB9KVxyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBTU08gY2hlY2s6JywgZXJyb3IpXHJcbiAgICBnb1RvUmVnaXN0ZXIoeyBxdWVyeTogeyB0b2tlbjogdG9rZW4udmFsdWUgfSB9KVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgYWNjZXB0QW5kQWRkRW1haWwgPSAoKSA9PiBhY2NlcHQoeyBhZGROZXdFbWFpbDogdHJ1ZSB9KVxyXG48L3NjcmlwdD5cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2NvbXBvbmVudHMvd29ya3NwYWNlL2ludml0ZS9CbG9jay52dWUifQ==