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

345 lines
34 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/projects/Dashboard.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/projects/MoveToWorkspaceAlert.vue";
import { FormTextInput 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/form/select/ProjectRoles.vue";
import { FormCheckbox 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 { CommonLoadingBar as __nuxt_component_5 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_6 } from "/_nuxt/components/projects/HiddenProjectWarning.vue";
import { default as __nuxt_component_7 } from "/_nuxt/components/projects/DashboardEmptyState.vue";
import { default as __nuxt_component_8 } from "/_nuxt/components/projects/DashboardFilled.vue";
import { InfiniteLoading as __nuxt_component_9 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_10 } from "/_nuxt/components/common/EmptySearchState.vue";
import { default as __nuxt_component_11 } from "/_nuxt/components/projects/Add.vue";
import { default as __nuxt_component_12 } from "/_nuxt/components/workspace/moveProject/index.vue";
/* Injection by vite-plugin-vue-inspector Start */
import { createVNode as __createVNode,createBlock as __createBlock,createElementVNode as __createElementVNode,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 _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
function _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...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 { useQuery, useQueryLoading } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
import { projectsDashboardQuery } from "/_nuxt/lib/projects/graphql/queries.ts";
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import { useDebouncedTextInput } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { MagnifyingGlassIcon, Squares2X2Icon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29";
import { useUserProjectsUpdatedTracking } from "/_nuxt/lib/user/composables/projectUpdates.ts";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import { useCanCreatePersonalProject } from "/_nuxt/lib/projects/composables/permissions.ts";
import { useLogger } from "/_nuxt/composables/logging.ts";
import { ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { useIsWorkspacesEnabled } from "/_nuxt/composables/globals.ts";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ProjectsDashboard",
setup(__props, { expose: __expose }) {
__expose();
graphql(`
fragment ProjectsDashboard_UserProjectCollection on UserProjectCollection {
numberOfHidden
}
`);
graphql(`
fragment ProjectsDashboard_User on User {
...ProjectsAdd_User
permissions {
canCreatePersonalProject {
...FullPermissionCheckResult
}
}
}
`);
const logger = useLogger();
const infiniteLoaderId = ref("");
const cursor = ref(null);
const selectedRoles = ref(void 0);
const filterProjectsToMove = ref(false);
const showLoadingBar = ref(false);
const showMoveProjectDialog = ref(false);
const emittedProject = ref();
const areQueriesLoading = useQueryLoading();
const isWorkspacesEnabled = useIsWorkspacesEnabled();
const showCreateNewProjectDialog = ref(false);
useUserProjectsUpdatedTracking();
const {
on,
bind,
value: search
} = useDebouncedTextInput({
debouncedBy: 800
});
const {
result: projectsPanelResult,
fetchMore: fetchMoreProjects,
onResult: onProjectsResult,
variables: projectsVariables
} = useQuery(projectsDashboardQuery, () => ({
filter: {
search: (search.value || "").trim() || null,
onlyWithRoles: filterProjectsToMove.value ? ["stream:owner"] : selectedRoles.value?.length ? selectedRoles.value : null,
personalOnly: isWorkspacesEnabled.value
},
cursor: null
}));
const { canClickCreate } = useCanCreatePersonalProject({
activeUser: computed(() => projectsPanelResult.value?.activeUser)
});
onProjectsResult((res) => {
cursor.value = res.data?.activeUser?.projects.cursor || null;
infiniteLoaderId.value = JSON.stringify(projectsVariables.value?.filter || {});
});
const projects = computed(() => projectsPanelResult.value?.activeUser?.projects);
const showEmptyState = computed(() => {
const isFiltering = projectsVariables.value?.filter?.onlyWithRoles?.length || projectsVariables.value?.filter?.search?.length;
if (isFiltering) return false;
return projects.value && !projects.value.items.length;
});
const moreToLoad = computed(
() => (!projects.value || projects.value.items.length < projects.value.totalCount) && cursor.value
);
const infiniteLoad = async (state) => {
if (!moreToLoad.value) return state.complete();
try {
await fetchMoreProjects({
variables: {
cursor: cursor.value
}
});
} catch (e) {
logger.error(e);
state.error();
return;
}
state.loaded();
if (!moreToLoad.value) {
state.complete();
}
};
const mixpanel = useMixpanel();
const onMoveProject = (projectId, location) => {
const project = projectId ? projects.value?.items.find((p) => p.id === projectId) : void 0;
emittedProject.value = project || void 0;
mixpanel.track("Move Project CTA Clicked", {
location,
// eslint-disable-next-line camelcase
workspace_id: project?.workspace?.id || void 0
});
showMoveProjectDialog.value = true;
};
watch(search, (newVal) => {
if (newVal) showLoadingBar.value = true;
else showLoadingBar.value = false;
});
watch(areQueriesLoading, (newVal) => showLoadingBar.value = newVal);
const clearSearch = () => {
search.value = "";
selectedRoles.value = [];
};
const onClickCreate = () => {
showCreateNewProjectDialog.value = true;
};
const __returned__ = { logger, infiniteLoaderId, cursor, selectedRoles, filterProjectsToMove, showLoadingBar, showMoveProjectDialog, emittedProject, areQueriesLoading, isWorkspacesEnabled, showCreateNewProjectDialog, on, bind, search, projectsPanelResult, fetchMoreProjects, onProjectsResult, projectsVariables, canClickCreate, projects, showEmptyState, moreToLoad, infiniteLoad, mixpanel, onMoveProject, clearSearch, onClickCreate, get MagnifyingGlassIcon() {
return MagnifyingGlassIcon;
}, get Squares2X2Icon() {
return Squares2X2Icon;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, toHandlers as _toHandlers, mergeProps as _mergeProps, createTextVNode as _createTextVNode, withCtx as _withCtx, Fragment as _Fragment } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = { "data-v-inspector": "components/projects/Dashboard.vue:2:3" };
const _hoisted_2 = {
key: 0,
class: "flex flex-col gap-4",
"data-v-inspector": "components/projects/Dashboard.vue:4:5"
};
const _hoisted_3 = {
class: "flex items-center gap-2 mb-2",
"data-v-inspector": "components/projects/Dashboard.vue:9:7"
};
const _hoisted_4 = {
class: "flex flex-col lg:flex-row gap-2 lg:items-center justify-between",
"data-v-inspector": "components/projects/Dashboard.vue:14:7"
};
const _hoisted_5 = {
class: "flex flex-col md:flex-row gap-2",
"data-v-inspector": "components/projects/Dashboard.vue:15:9"
};
const _hoisted_6 = {
key: 1,
class: "md:mt-1",
"data-v-inspector": "components/projects/Dashboard.vue:35:11"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_Portal = _resolveComponent("Portal");
const _component_ProjectsMoveToWorkspaceAlert = __nuxt_component_0;
const _component_FormTextInput = __nuxt_component_1;
const _component_FormSelectProjectRoles = __nuxt_component_2;
const _component_FormCheckbox = __nuxt_component_3;
const _component_FormButton = __nuxt_component_4;
const _component_CommonLoadingBar = __nuxt_component_5;
const _component_ProjectsHiddenProjectWarning = __nuxt_component_6;
const _component_ProjectsDashboardEmptyState = __nuxt_component_7;
const _component_ProjectsDashboardFilled = __nuxt_component_8;
const _component_InfiniteLoading = __nuxt_component_9;
const _component_CommonEmptySearchState = __nuxt_component_10;
const _component_ProjectsAdd = __nuxt_component_11;
const _component_WorkspaceMoveProject = __nuxt_component_12;
return _openBlock(), _createElementBlock("div", _hoisted_1, [
_createVNode(_component_Portal, {
to: "primary-actions",
"data-v-inspector": "components/projects/Dashboard.vue:3:5"
}),
!$setup.showEmptyState ? (_openBlock(), _createElementBlock("div", _hoisted_2, [
$setup.isWorkspacesEnabled ? (_openBlock(), _createBlock(_component_ProjectsMoveToWorkspaceAlert, {
key: 0,
onMoveProject: _cache[0] || (_cache[0] = (id) => $setup.onMoveProject(id, "projects")),
"data-v-inspector": "components/projects/Dashboard.vue:5:7"
})) : _createCommentVNode("v-if", true),
_createElementVNode("div", _hoisted_3, [
_createVNode($setup["Squares2X2Icon"], {
class: "h-5 w-5",
"data-v-inspector": "components/projects/Dashboard.vue:10:9"
}),
_cache[6] || (_cache[6] = _createElementVNode(
"h1",
{
class: "text-heading-lg",
"data-v-inspector": "components/projects/Dashboard.vue:11:9"
},
"Projects",
-1
/* CACHED */
))
]),
_createElementVNode("div", _hoisted_4, [
_createElementVNode("div", _hoisted_5, [
_createVNode(_component_FormTextInput, _mergeProps({
name: "modelsearch",
"show-label": false,
placeholder: "Search...",
"custom-icon": $setup.MagnifyingGlassIcon,
color: "foundation",
"wrapper-classes": "grow md:grow-0 md:w-60",
"show-clear": !!$setup.search
}, $setup.bind, _toHandlers($setup.on), { "data-v-inspector": "components/projects/Dashboard.vue:16:11" }), null, 16, ["custom-icon", "show-clear"]),
!$setup.showEmptyState ? (_openBlock(), _createBlock(_component_FormSelectProjectRoles, {
key: 0,
modelValue: $setup.selectedRoles,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $setup.selectedRoles = $event),
class: "md:w-56 grow md:grow-0",
"allow-unset": "",
"fixed-height": "",
clearable: "",
"data-v-inspector": "components/projects/Dashboard.vue:27:11"
}, null, 8, ["modelValue"])) : _createCommentVNode("v-if", true),
!$setup.showEmptyState && $setup.isWorkspacesEnabled ? (_openBlock(), _createElementBlock("div", _hoisted_6, [
_createVNode(_component_FormCheckbox, {
id: "projects-to-move",
modelValue: $setup.filterProjectsToMove,
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $setup.filterProjectsToMove = $event),
"label-classes": "!font-normal select-none",
name: "Projects to move",
"data-v-inspector": "components/projects/Dashboard.vue:36:13"
}, null, 8, ["modelValue"])
])) : _createCommentVNode("v-if", true)
]),
$setup.canClickCreate ? (_openBlock(), _createBlock(_component_FormButton, {
key: 0,
onClick: $setup.onClickCreate,
"data-v-inspector": "components/projects/Dashboard.vue:44:9"
}, {
default: _withCtx(() => [..._cache[7] || (_cache[7] = [
_createTextVNode(
" New project ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
})) : _createCommentVNode("v-if", true)
])
])) : _createCommentVNode("v-if", true),
_createVNode(_component_CommonLoadingBar, {
loading: $setup.showLoadingBar,
class: "my-2",
"data-v-inspector": "components/projects/Dashboard.vue:49:5"
}, null, 8, ["loading"]),
$setup.projectsPanelResult?.activeUser && $setup.projects?.numberOfHidden ? (_openBlock(), _createBlock(_component_ProjectsHiddenProjectWarning, {
key: 1,
"hidden-item-count": $setup.projectsPanelResult.activeUser.projects.numberOfHidden,
user: $setup.projectsPanelResult.activeUser,
"data-v-inspector": "components/projects/Dashboard.vue:51:5"
}, null, 8, ["hidden-item-count", "user"])) : _createCommentVNode("v-if", true),
$setup.showEmptyState ? (_openBlock(), _createBlock(_component_ProjectsDashboardEmptyState, {
key: 2,
"can-create-project": $setup.canClickCreate,
onCreateProject: $setup.onClickCreate,
"data-v-inspector": "components/projects/Dashboard.vue:57:5"
}, null, 8, ["can-create-project"])) : $setup.projects?.items?.length ? (_openBlock(), _createElementBlock(
_Fragment,
{ key: 3 },
[
_createVNode(_component_ProjectsDashboardFilled, {
projects: $setup.projects,
"show-workspace-link": "",
onMoveProject: _cache[3] || (_cache[3] = (id) => $setup.onMoveProject(id, "project_card")),
"data-v-inspector": "components/projects/Dashboard.vue:63:7"
}, null, 8, ["projects"]),
_createVNode(_component_InfiniteLoading, {
settings: { identifier: $setup.infiniteLoaderId },
onInfinite: $setup.infiniteLoad,
"data-v-inspector": "components/projects/Dashboard.vue:68:7"
}, null, 8, ["settings"])
],
64
/* STABLE_FRAGMENT */
)) : !$setup.showLoadingBar ? (_openBlock(), _createBlock(_component_CommonEmptySearchState, {
key: 4,
onClearSearch: $setup.clearSearch,
"data-v-inspector": "components/projects/Dashboard.vue:73:5"
})) : _createCommentVNode("v-if", true),
$setup.projectsPanelResult?.activeUser ? (_openBlock(), _createBlock(_component_ProjectsAdd, {
key: 5,
open: $setup.showCreateNewProjectDialog,
"onUpdate:open": _cache[4] || (_cache[4] = ($event) => $setup.showCreateNewProjectDialog = $event),
"data-v-inspector": "components/projects/Dashboard.vue:74:5"
}, null, 8, ["open"])) : _createCommentVNode("v-if", true),
$setup.showMoveProjectDialog ? (_openBlock(), _createBlock(_component_WorkspaceMoveProject, {
key: 6,
open: $setup.showMoveProjectDialog,
"onUpdate:open": _cache[5] || (_cache[5] = ($event) => $setup.showMoveProjectDialog = $event),
project: $setup.emittedProject,
"data-v-inspector": "components/projects/Dashboard.vue:78:5"
}, null, 8, ["open", "project"])) : _createCommentVNode("v-if", true)
]);
}
_sfc_main.__hmrId = "fbbf1a1a";
typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main);
import.meta.hot.on("file-changed", ({ file }) => {
__VUE_HMR_RUNTIME__.CHANGED_FILE = file;
});
import.meta.hot.accept((mod) => {
if (!mod) return;
const { default: updated, _rerender_only } = mod;
if (_rerender_only) {
__VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render);
} else {
__VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated);
}
});
import _export_sfc from "/_nuxt/@id/__x00__plugin-vue:export-helper";
export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "D:/speckle-server/packages/frontend-2/components/projects/Dashboard.vue"]]);
//# sourceMappingURL=data:application/json;base64,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QUFBQTtJQUdsRSw0QkFBcUIsY0FBYyxpQkFBVSxnQ0FEckQsYUFJRTtBQUFBO01BRkMscUJBQW1CLDJCQUFvQixXQUFXLFNBQVM7QUFBQSxNQUMzRCxNQUFNLDJCQUFvQjtBQUFBLE1BQVksb0JBQWlCO0FBQUE7SUFJbEQsdUNBRFIsYUFJRTtBQUFBO01BRkMsc0JBQW9CO0FBQUEsTUFDcEIsaUJBQWdCO0FBQUEsTUFBZSxvQkFBaUI7QUFBQSwyQ0FFOUIsaUJBQVUsT0FBTyx3QkFBdEM7QUFBQSxNQVVXO0FBQUE7QUFBQTtBQUFBLFFBVFQsYUFJRTtBQUFBLFVBSEMsVUFBVTtBQUFBLFVBQ1g7QUFBQSxVQUNDLGVBQVksMkJBQUcsT0FBTyxxQkFBYyxJQUFFO0FBQUEsVUFBbUIsb0JBQWlCO0FBQUE7UUFFN0UsYUFHRTtBQUFBLFVBRkMsVUFBUSxjQUFnQix3QkFBZ0I7QUFBQSxVQUN4QyxZQUFVO0FBQUEsVUFBYyxvQkFBaUI7QUFBQTs7OztVQUdWLHVDQUFwQyxhQUE0STtBQUFBO01BQXZGLGVBQWM7QUFBQSxNQUFhLG9CQUFpQjtBQUFBO0lBRXpGLDRCQUFxQiw0QkFEN0IsYUFHRTtBQUFBO01BRFEsTUFBTTtBQUFBLGlHQUEwQjtBQUFBLE1BQUUsb0JBQWlCO0FBQUE7SUFHckQsOENBRFIsYUFJRTtBQUFBO01BRlEsTUFBTTtBQUFBLDRGQUFxQjtBQUFBLE1BQ2xDLFNBQVM7QUFBQSxNQUFnQixvQkFBaUI7QUFBQSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiRGFzaGJvYXJkLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPGRpdiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjI6M1wiPlxyXG4gICAgPFBvcnRhbCB0bz1cInByaW1hcnktYWN0aW9uc1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6Mzo1XCI+PC9Qb3J0YWw+XHJcbiAgICA8ZGl2IHYtaWY9XCIhc2hvd0VtcHR5U3RhdGVcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjQ6NVwiPlxyXG4gICAgICA8UHJvamVjdHNNb3ZlVG9Xb3Jrc3BhY2VBbGVydFxyXG4gICAgICAgIHYtaWY9XCJpc1dvcmtzcGFjZXNFbmFibGVkXCJcclxuICAgICAgICBAbW92ZS1wcm9qZWN0PVwiKGlkKSA9PiBvbk1vdmVQcm9qZWN0KGlkLCAncHJvamVjdHMnKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6NTo3XCJcclxuICAgICAgLz5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIG1iLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjk6N1wiPlxyXG4gICAgICAgIDxTcXVhcmVzMlgySWNvbiBjbGFzcz1cImgtNSB3LTVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjEwOjlcIiAvPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cInRleHQtaGVhZGluZy1sZ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6MTE6OVwiPlByb2plY3RzPC9oMT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBsZzpmbGV4LXJvdyBnYXAtMiBsZzppdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZToxNDo3XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgbWQ6ZmxleC1yb3cgZ2FwLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjE1OjlcIj5cclxuICAgICAgICAgIDxGb3JtVGV4dElucHV0XHJcbiAgICAgICAgICAgIG5hbWU9XCJtb2RlbHNlYXJjaFwiXHJcbiAgICAgICAgICAgIDpzaG93LWxhYmVsPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiXHJcbiAgICAgICAgICAgIDpjdXN0b20taWNvbj1cIk1hZ25pZnlpbmdHbGFzc0ljb25cIlxyXG4gICAgICAgICAgICBjb2xvcj1cImZvdW5kYXRpb25cIlxyXG4gICAgICAgICAgICB3cmFwcGVyLWNsYXNzZXM9XCJncm93IG1kOmdyb3ctMCBtZDp3LTYwXCJcclxuICAgICAgICAgICAgOnNob3ctY2xlYXI9XCIhIXNlYXJjaFwiXHJcbiAgICAgICAgICAgIHYtYmluZD1cImJpbmRcIlxyXG4gICAgICAgICAgICB2LW9uPVwib25cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjE2OjExXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8Rm9ybVNlbGVjdFByb2plY3RSb2xlc1xyXG4gICAgICAgICAgICB2LWlmPVwiIXNob3dFbXB0eVN0YXRlXCJcclxuICAgICAgICAgICAgdi1tb2RlbD1cInNlbGVjdGVkUm9sZXNcIlxyXG4gICAgICAgICAgICBjbGFzcz1cIm1kOnctNTYgZ3JvdyBtZDpncm93LTBcIlxyXG4gICAgICAgICAgICBhbGxvdy11bnNldFxyXG4gICAgICAgICAgICBmaXhlZC1oZWlnaHRcclxuICAgICAgICAgICAgY2xlYXJhYmxlIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6Mjc6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxkaXYgdi1pZj1cIiFzaG93RW1wdHlTdGF0ZSAmJiBpc1dvcmtzcGFjZXNFbmFibGVkXCIgY2xhc3M9XCJtZDptdC0xXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTozNToxMVwiPlxyXG4gICAgICAgICAgICA8Rm9ybUNoZWNrYm94XHJcbiAgICAgICAgICAgICAgaWQ9XCJwcm9qZWN0cy10by1tb3ZlXCJcclxuICAgICAgICAgICAgICB2LW1vZGVsPVwiZmlsdGVyUHJvamVjdHNUb01vdmVcIlxyXG4gICAgICAgICAgICAgIGxhYmVsLWNsYXNzZXM9XCIhZm9udC1ub3JtYWwgc2VsZWN0LW5vbmVcIlxyXG4gICAgICAgICAgICAgIG5hbWU9XCJQcm9qZWN0cyB0byBtb3ZlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTozNjoxM1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8Rm9ybUJ1dHRvbiB2LWlmPVwiY2FuQ2xpY2tDcmVhdGVcIiBAY2xpY2s9XCJvbkNsaWNrQ3JlYXRlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo0NDo5XCI+XHJcbiAgICAgICAgICBOZXcgcHJvamVjdFxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxDb21tb25Mb2FkaW5nQmFyIDpsb2FkaW5nPVwic2hvd0xvYWRpbmdCYXJcIiBjbGFzcz1cIm15LTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjQ5OjVcIiAvPlxyXG5cclxuICAgIDxQcm9qZWN0c0hpZGRlblByb2plY3RXYXJuaW5nXHJcbiAgICAgIHYtaWY9XCJwcm9qZWN0c1BhbmVsUmVzdWx0Py5hY3RpdmVVc2VyICYmIHByb2plY3RzPy5udW1iZXJPZkhpZGRlblwiXHJcbiAgICAgIDpoaWRkZW4taXRlbS1jb3VudD1cInByb2plY3RzUGFuZWxSZXN1bHQuYWN0aXZlVXNlci5wcm9qZWN0cy5udW1iZXJPZkhpZGRlblwiXHJcbiAgICAgIDp1c2VyPVwicHJvamVjdHNQYW5lbFJlc3VsdC5hY3RpdmVVc2VyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo1MTo1XCJcclxuICAgIC8+XHJcblxyXG4gICAgPFByb2plY3RzRGFzaGJvYXJkRW1wdHlTdGF0ZVxyXG4gICAgICB2LWlmPVwic2hvd0VtcHR5U3RhdGVcIlxyXG4gICAgICA6Y2FuLWNyZWF0ZS1wcm9qZWN0PVwiY2FuQ2xpY2tDcmVhdGVcIlxyXG4gICAgICBAY3JlYXRlLXByb2plY3Q9XCJvbkNsaWNrQ3JlYXRlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo1Nzo1XCJcclxuICAgIC8+XHJcbiAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwicHJvamVjdHM/Lml0ZW1zPy5sZW5ndGhcIj5cclxuICAgICAgPFByb2plY3RzRGFzaGJvYXJkRmlsbGVkXHJcbiAgICAgICAgOnByb2plY3RzPVwicHJvamVjdHNcIlxyXG4gICAgICAgIHNob3ctd29ya3NwYWNlLWxpbmtcclxuICAgICAgICBAbW92ZS1wcm9qZWN0PVwiKGlkKSA9PiBvbk1vdmVQcm9qZWN0KGlkLCAncHJvamVjdF9jYXJkJylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjYzOjdcIlxyXG4gICAgICAvPlxyXG4gICAgICA8SW5maW5pdGVMb2FkaW5nXHJcbiAgICAgICAgOnNldHRpbmdzPVwieyBpZGVudGlmaWVyOiBpbmZpbml0ZUxvYWRlcklkIH1cIlxyXG4gICAgICAgIEBpbmZpbml0ZT1cImluZmluaXRlTG9hZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6Njg6N1wiXHJcbiAgICAgIC8+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPENvbW1vbkVtcHR5U2VhcmNoU3RhdGUgdi1lbHNlLWlmPVwiIXNob3dMb2FkaW5nQmFyXCIgQGNsZWFyLXNlYXJjaD1cImNsZWFyU2VhcmNoXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo3Mzo1XCIgLz5cclxuICAgIDxQcm9qZWN0c0FkZFxyXG4gICAgICB2LWlmPVwicHJvamVjdHNQYW5lbFJlc3VsdD8uYWN0aXZlVXNlclwiXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dDcmVhdGVOZXdQcm9qZWN0RGlhbG9nXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo3NDo1XCJcclxuICAgIC8+XHJcbiAgICA8V29ya3NwYWNlTW92ZVByb2plY3RcclxuICAgICAgdi1pZj1cInNob3dNb3ZlUHJvamVjdERpYWxvZ1wiXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dNb3ZlUHJvamVjdERpYWxvZ1wiXHJcbiAgICAgIDpwcm9qZWN0PVwiZW1pdHRlZFByb2plY3RcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjc4OjVcIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IHVzZVF1ZXJ5LCB1c2VRdWVyeUxvYWRpbmcgfSBmcm9tICdAdnVlL2Fwb2xsby1jb21wb3NhYmxlJ1xyXG5pbXBvcnQgeyBwcm9qZWN0c0Rhc2hib2FyZFF1ZXJ5IH0gZnJvbSAnfn4vbGliL3Byb2plY3RzL2dyYXBocWwvcXVlcmllcydcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSwgT3B0aW9uYWwsIFN0cmVhbVJvbGVzIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VEZWJvdW5jZWRUZXh0SW5wdXQsIHR5cGUgSW5maW5pdGVMb2FkZXJTdGF0ZSB9IGZyb20gJ0BzcGVja2xlL3VpLWNvbXBvbmVudHMnXHJcbmltcG9ydCB7IE1hZ25pZnlpbmdHbGFzc0ljb24sIFNxdWFyZXMyWDJJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHsgdXNlVXNlclByb2plY3RzVXBkYXRlZFRyYWNraW5nIH0gZnJvbSAnfn4vbGliL3VzZXIvY29tcG9zYWJsZXMvcHJvamVjdFVwZGF0ZXMnXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgdXNlQ2FuQ3JlYXRlUGVyc29uYWxQcm9qZWN0IH0gZnJvbSAnfn4vbGliL3Byb2plY3RzL2NvbXBvc2FibGVzL3Blcm1pc3Npb25zJ1xyXG5pbXBvcnQgdHlwZSB7IFByb2plY3RzRGFzaGJvYXJkUXVlcnlRdWVyeSB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB0eXBlIHsgR2V0IH0gZnJvbSAndHlwZS1mZXN0J1xyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgUHJvamVjdHNEYXNoYm9hcmRfVXNlclByb2plY3RDb2xsZWN0aW9uIG9uIFVzZXJQcm9qZWN0Q29sbGVjdGlvbiB7XHJcbiAgICBudW1iZXJPZkhpZGRlblxyXG4gIH1cclxuYClcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFByb2plY3RzRGFzaGJvYXJkX1VzZXIgb24gVXNlciB7XHJcbiAgICAuLi5Qcm9qZWN0c0FkZF9Vc2VyXHJcbiAgICBwZXJtaXNzaW9ucyB7XHJcbiAgICAgIGNhbkNyZWF0ZVBlcnNvbmFsUHJvamVjdCB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgbG9nZ2VyID0gdXNlTG9nZ2VyKClcclxuXHJcbmNvbnN0IGluZmluaXRlTG9hZGVySWQgPSByZWYoJycpXHJcbmNvbnN0IGN1cnNvciA9IHJlZihudWxsIGFzIE51bGxhYmxlPHN0cmluZz4pXHJcbmNvbnN0IHNlbGVjdGVkUm9sZXMgPSByZWYodW5kZWZpbmVkIGFzIE9wdGlvbmFsPFN0cmVhbVJvbGVzW10+KVxyXG5jb25zdCBmaWx0ZXJQcm9qZWN0c1RvTW92ZSA9IHJlZihmYWxzZSlcclxuY29uc3Qgc2hvd0xvYWRpbmdCYXIgPSByZWYoZmFsc2UpXHJcbmNvbnN0IHNob3dNb3ZlUHJvamVjdERpYWxvZyA9IHJlZihmYWxzZSlcclxuY29uc3QgZW1pdHRlZFByb2plY3QgPVxyXG4gIHJlZjxHZXQ8UHJvamVjdHNEYXNoYm9hcmRRdWVyeVF1ZXJ5LCAnYWN0aXZlVXNlci5wcm9qZWN0cy5pdGVtc1swXSc+PigpXHJcbmNvbnN0IGFyZVF1ZXJpZXNMb2FkaW5nID0gdXNlUXVlcnlMb2FkaW5nKClcclxuY29uc3QgaXNXb3Jrc3BhY2VzRW5hYmxlZCA9IHVzZUlzV29ya3NwYWNlc0VuYWJsZWQoKVxyXG5jb25zdCBzaG93Q3JlYXRlTmV3UHJvamVjdERpYWxvZyA9IHJlZihmYWxzZSlcclxudXNlVXNlclByb2plY3RzVXBkYXRlZFRyYWNraW5nKClcclxuXHJcbmNvbnN0IHtcclxuICBvbixcclxuICBiaW5kLFxyXG4gIHZhbHVlOiBzZWFyY2hcclxufSA9IHVzZURlYm91bmNlZFRleHRJbnB1dCh7XHJcbiAgZGVib3VuY2VkQnk6IDgwMFxyXG59KVxyXG5cclxuY29uc3Qge1xyXG4gIHJlc3VsdDogcHJvamVjdHNQYW5lbFJlc3VsdCxcclxuICBmZXRjaE1vcmU6IGZldGNoTW9yZVByb2plY3RzLFxyXG4gIG9uUmVzdWx0OiBvblByb2plY3RzUmVzdWx0LFxyXG4gIHZhcmlhYmxlczogcHJvamVjdHNWYXJpYWJsZXNcclxufSA9IHVzZVF1ZXJ5KHByb2plY3RzRGFzaGJvYXJkUXVlcnksICgpID0+ICh7XHJcbiAgZmlsdGVyOiB7XHJcbiAgICBzZWFyY2g6IChzZWFyY2gudmFsdWUgfHwgJycpLnRyaW0oKSB8fCBudWxsLFxyXG4gICAgb25seVdpdGhSb2xlczogZmlsdGVyUHJvamVjdHNUb01vdmUudmFsdWVcclxuICAgICAgPyBbJ3N0cmVhbTpvd25lciddXHJcbiAgICAgIDogc2VsZWN0ZWRSb2xlcy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgID8gc2VsZWN0ZWRSb2xlcy52YWx1ZVxyXG4gICAgICA6IG51bGwsXHJcbiAgICBwZXJzb25hbE9ubHk6IGlzV29ya3NwYWNlc0VuYWJsZWQudmFsdWVcclxuICB9LFxyXG4gIGN1cnNvcjogbnVsbCBhcyBOdWxsYWJsZTxzdHJpbmc+XHJcbn0pKVxyXG5cclxuY29uc3QgeyBjYW5DbGlja0NyZWF0ZSB9ID0gdXNlQ2FuQ3JlYXRlUGVyc29uYWxQcm9qZWN0KHtcclxuICBhY3RpdmVVc2VyOiBjb21wdXRlZCgoKSA9PiBwcm9qZWN0c1BhbmVsUmVzdWx0LnZhbHVlPy5hY3RpdmVVc2VyKVxyXG59KVxyXG5cclxub25Qcm9qZWN0c1Jlc3VsdCgocmVzKSA9PiB7XHJcbiAgY3Vyc29yLnZhbHVlID0gcmVzLmRhdGE/LmFjdGl2ZVVzZXI/LnByb2plY3RzLmN1cnNvciB8fCBudWxsXHJcbiAgaW5maW5pdGVMb2FkZXJJZC52YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHByb2plY3RzVmFyaWFibGVzLnZhbHVlPy5maWx0ZXIgfHwge30pXHJcbn0pXHJcblxyXG5jb25zdCBwcm9qZWN0cyA9IGNvbXB1dGVkKCgpID0+IHByb2plY3RzUGFuZWxSZXN1bHQudmFsdWU/LmFjdGl2ZVVzZXI/LnByb2plY3RzKVxyXG5jb25zdCBzaG93RW1wdHlTdGF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBpc0ZpbHRlcmluZyA9XHJcbiAgICBwcm9qZWN0c1ZhcmlhYmxlcy52YWx1ZT8uZmlsdGVyPy5vbmx5V2l0aFJvbGVzPy5sZW5ndGggfHxcclxuICAgIHByb2plY3RzVmFyaWFibGVzLnZhbHVlPy5maWx0ZXI/LnNlYXJjaD8ubGVuZ3RoXHJcbiAgaWYgKGlzRmlsdGVyaW5nKSByZXR1cm4gZmFsc2VcclxuXHJcbiAgcmV0dXJuIHByb2plY3RzLnZhbHVlICYmICFwcm9qZWN0cy52YWx1ZS5pdGVtcy5sZW5ndGhcclxufSlcclxuXHJcbmNvbnN0IG1vcmVUb0xvYWQgPSBjb21wdXRlZChcclxuICAoKSA9PlxyXG4gICAgKCFwcm9qZWN0cy52YWx1ZSB8fCBwcm9qZWN0cy52YWx1ZS5pdGVtcy5sZW5ndGggPCBwcm9qZWN0cy52YWx1ZS50b3RhbENvdW50KSAmJlxyXG4gICAgY3Vyc29yLnZhbHVlXHJcbilcclxuXHJcbmNvbnN0IGluZmluaXRlTG9hZCA9IGFzeW5jIChzdGF0ZTogSW5maW5pdGVMb2FkZXJTdGF0ZSkgPT4ge1xyXG4gIGlmICghbW9yZVRvTG9hZC52YWx1ZSkgcmV0dXJuIHN0YXRlLmNvbXBsZXRlKClcclxuXHJcbiAgdHJ5IHtcclxuICAgIGF3YWl0IGZldGNoTW9yZVByb2plY3RzKHtcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgY3Vyc29yOiBjdXJzb3IudmFsdWVcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICBsb2dnZXIuZXJyb3IoZSlcclxuICAgIHN0YXRlLmVycm9yKClcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgc3RhdGUubG9hZGVkKClcclxuICBpZiAoIW1vcmVUb0xvYWQudmFsdWUpIHtcclxuICAgIHN0YXRlLmNvbXBsZXRlKClcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG1peHBhbmVsID0gdXNlTWl4cGFuZWwoKVxyXG5cclxuY29uc3Qgb25Nb3ZlUHJvamVjdCA9IChwcm9qZWN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgbG9jYXRpb246IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0SWRcclxuICAgID8gcHJvamVjdHMudmFsdWU/Lml0ZW1zLmZpbmQoKHApID0+IHAuaWQgPT09IHByb2plY3RJZClcclxuICAgIDogdW5kZWZpbmVkXHJcbiAgZW1pdHRlZFByb2plY3QudmFsdWUgPSBwcm9qZWN0IHx8IHVuZGVmaW5lZFxyXG5cclxuICBtaXhwYW5lbC50cmFjaygnTW92ZSBQcm9qZWN0IENUQSBDbGlja2VkJywge1xyXG4gICAgbG9jYXRpb24sXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXHJcbiAgICB3b3Jrc3BhY2VfaWQ6IHByb2plY3Q/LndvcmtzcGFjZT8uaWQgfHwgdW5kZWZpbmVkXHJcbiAgfSlcclxuICBzaG93TW92ZVByb2plY3REaWFsb2cudmFsdWUgPSB0cnVlXHJcbn1cclxuXHJcbndhdGNoKHNlYXJjaCwgKG5ld1ZhbCkgPT4ge1xyXG4gIGlmIChuZXdWYWwpIHNob3dMb2FkaW5nQmFyLnZhbHVlID0gdHJ1ZVxyXG4gIGVsc2Ugc2hvd0xvYWRpbmdCYXIudmFsdWUgPSBmYWxzZVxyXG59KVxyXG5cclxud2F0Y2goYXJlUXVlcmllc0xvYWRpbmcsIChuZXdWYWwpID0+IChzaG93TG9hZGluZ0Jhci52YWx1ZSA9IG5ld1ZhbCkpXHJcblxyXG5jb25zdCBjbGVhclNlYXJjaCA9ICgpID0+IHtcclxuICBzZWFyY2gudmFsdWUgPSAnJ1xyXG4gIHNlbGVjdGVkUm9sZXMudmFsdWUgPSBbXVxyXG59XHJcblxyXG5jb25zdCBvbkNsaWNrQ3JlYXRlID0gKCkgPT4ge1xyXG4gIHNob3dDcmVhdGVOZXdQcm9qZWN0RGlhbG9nLnZhbHVlID0gdHJ1ZVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlIn0=