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

295 lines
34 KiB
Plaintext

import { isUngroupedGroup } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/saved-views/index.js";
import { useApolloClient, useSubscription } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
import { useLock } from "/_nuxt/lib/common/composables/singleton.ts";
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import {
ProjectSavedViewsUpdatedMessageType,
SortDirection
} from "/_nuxt/lib/common/generated/gql/graphql.ts";
import {
getCachedObjectKeys
} from "/_nuxt/lib/common/helpers/graphql.ts";
import {
filterKeys,
onGroupViewRemovalCacheUpdates,
onNewGroupViewCacheUpdates
} from "/_nuxt/lib/viewer/helpers/savedViews/cache.ts";
import { useActiveUser, useGlobalToast } from "/_nuxt/composables/globals.ts";
import { computed, unref, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { getCacheId, ToastNotificationType, modifyObjectField, iterateObjectField } from "/_nuxt/utils/globals.ts";
const onProjectSavedViewsUpdatedSubscription = graphql(`
subscription OnProjectSavedViewsUpdated($projectId: ID!) {
projectSavedViewsUpdated(projectId: $projectId) {
type
id
savedView {
id
resourceIds
group {
id
groupId
resourceIds
}
...ViewerSavedViewsPanelView_SavedView
}
beforeChangeSavedView {
groupId
resourceIds
groupResourceIds
position
}
}
}
`);
export const useOnProjectSavedViewsUpdated = (params) => {
const { projectId } = params;
const { userId } = useActiveUser();
const { triggerNotification } = useGlobalToast();
const apollo = useApolloClient().client;
const { hasLock } = useLock(
computed(() => `useOnProjectSavedViewsUpdated-${unref(projectId)}`)
);
const isEnabled = computed(() => hasLock.value);
const { onResult: onViewsUpdated } = useSubscription(
onProjectSavedViewsUpdatedSubscription,
() => ({
projectId: unref(projectId)
}),
() => ({ enabled: !!(isEnabled.value && userId.value), errorPolicy: "all" })
);
onViewsUpdated((res) => {
if (!res.data?.projectSavedViewsUpdated || !hasLock.value) return;
const event = res.data.projectSavedViewsUpdated;
const cache = apollo.cache;
const beforeChangeView = event.beforeChangeSavedView;
if (event.type === ProjectSavedViewsUpdatedMessageType.Deleted && beforeChangeView) {
onGroupViewRemovalCacheUpdates({
cache,
viewId: event.id,
projectId: unref(projectId),
...beforeChangeView.groupId ? {
group: {
id: beforeChangeView.groupId,
resourceIds: beforeChangeView.groupResourceIds
}
} : {
view: {
resourceIds: beforeChangeView.resourceIds
}
}
});
cache.evict({
id: getCacheId("SavedView", event.id)
});
} else if (event.type === ProjectSavedViewsUpdatedMessageType.Created && event.savedView) {
onNewGroupViewCacheUpdates({
cache,
viewId: event.id,
projectId: unref(projectId),
...event.savedView.group.groupId ? {
group: {
id: event.savedView.group.groupId,
resourceIds: event.savedView.group.resourceIds
}
} : {
view: {
resourceIds: event.savedView.resourceIds
}
}
});
triggerNotification({
title: "New view created",
type: ToastNotificationType.Success
});
} else if (event.type === ProjectSavedViewsUpdatedMessageType.Updated && event.savedView && event.beforeChangeSavedView) {
const oldGroupId = event.beforeChangeSavedView.groupId;
const newGroupId = event.savedView.group.groupId;
const groupChanged = oldGroupId !== newGroupId;
const positionChanged = groupChanged || event.beforeChangeSavedView.position !== event.savedView.position;
if (groupChanged) {
onGroupViewRemovalCacheUpdates({
cache,
viewId: event.savedView.id,
projectId: event.savedView.projectId,
...oldGroupId ? {
group: {
id: oldGroupId,
resourceIds: event.beforeChangeSavedView.groupResourceIds
}
} : {
view: {
resourceIds: event.beforeChangeSavedView.resourceIds
}
}
});
onNewGroupViewCacheUpdates({
cache,
viewId: event.savedView.id,
projectId: event.savedView.projectId,
...newGroupId ? {
group: {
id: newGroupId,
resourceIds: event.savedView.group.resourceIds
}
} : {
view: {
resourceIds: event.savedView.resourceIds
}
}
});
}
if (event.savedView.isHomeView && event.savedView.groupResourceIds.length === 1) {
const allSavedViewKeys = getCachedObjectKeys(cache, "SavedView");
const modelId = event.savedView.groupResourceIds[0];
for (const savedViewKey of allSavedViewKeys) {
modifyObjectField(
cache,
savedViewKey,
"isHomeView",
({ value: isHomeView, helpers: { readObject } }) => {
const view = readObject();
const groupIds = view.groupResourceIds;
const viewId = view.id;
const projectId2 = view.projectId;
if (viewId === event.savedView.id) return;
if (event.savedView.projectId !== projectId2) return;
if (isHomeView && groupIds?.length === 1 && groupIds[0] === modelId) {
return false;
}
}
);
}
}
if (positionChanged) {
iterateObjectField(
cache,
getCacheId("Project", unref(projectId)),
"savedViewGroups",
({ value, helpers: { fromRef } }) => {
const items = value.items;
if (!items) return;
items.forEach((groupRef) => {
const parsed = fromRef(groupRef);
modifyObjectField(
cache,
getCacheId("SavedViewGroup", parsed.id),
"views",
({ helpers: { createUpdatedValue, readField }, variables }) => {
const sortDir = variables.input.sortDirection || SortDirection.Desc;
const sortBy = variables.input.sortBy || "position";
return createUpdatedValue(({ update }) => {
update("items", (items2) => {
const newItems = items2.slice().sort((a, b) => {
const process = (ref) => {
const val = readField(ref, sortBy);
if (!val) return -1;
if (sortBy === "updatedAt") {
return new Date(val).getTime();
}
return val;
};
const aVal = process(a);
const bVal = process(b);
if (aVal < bVal) return sortDir === SortDirection.Asc ? -1 : 1;
if (aVal > bVal) return sortDir === SortDirection.Asc ? 1 : -1;
return 0;
});
return newItems;
});
});
}
);
});
}
);
}
}
});
};
const onProjectSavedViewGroupsUpdatedSubscription = graphql(`
subscription OnProjectSavedViewGroupsUpdated($projectId: ID!) {
projectSavedViewGroupsUpdated(projectId: $projectId) {
type
id
savedViewGroup {
id
projectId
author {
id
}
}
}
}
`);
export const useOnProjectSavedViewGroupsUpdated = (params) => {
const { projectId } = params;
const { userId } = useActiveUser();
const apollo = useApolloClient().client;
const { hasLock } = useLock(
computed(() => `useOnProjectSavedViewGroupsUpdated-${unref(projectId)}`)
);
const isEnabled = computed(() => hasLock.value);
const { onResult: onGroupsUpdated } = useSubscription(
onProjectSavedViewGroupsUpdatedSubscription,
() => ({
projectId: unref(projectId)
}),
() => ({ enabled: !!(isEnabled.value && userId.value), errorPolicy: "all" })
);
onGroupsUpdated((res) => {
if (!res.data?.projectSavedViewGroupsUpdated || !hasLock.value) return;
const event = res.data.projectSavedViewGroupsUpdated;
const { id } = event;
const cache = apollo.cache;
const group = event.savedViewGroup;
if (event.type === ProjectSavedViewsUpdatedMessageType.Deleted) {
modifyObjectField(
cache,
getCacheId("Project", unref(projectId)),
"savedViewGroups",
({ helpers: { evict } }) => evict()
);
modifyObjectField(
cache,
getCacheId("Project", unref(projectId)),
"savedViewGroup",
({ helpers: { evict, fromRef }, value }) => {
const { id: id2 } = fromRef(value);
if (isUngroupedGroup(id2)) return evict();
}
);
cache.evict({
id: getCacheId("SavedViewGroup", id)
});
} else if (event.type === ProjectSavedViewsUpdatedMessageType.Created && group) {
const isOwner = group.author?.id === userId.value;
if (isOwner) {
modifyObjectField(
cache,
getCacheId("Project", group.projectId),
"savedViewGroups",
({ helpers: { createUpdatedValue, fromRef, ref } }) => createUpdatedValue(({ update }) => {
update("totalCount", (totalCount) => totalCount + 1);
update("items", (items) => {
const newItems = items.slice();
const defaultIdx = newItems.findIndex(
(i) => isUngroupedGroup(fromRef(i).id)
);
newItems.splice(defaultIdx + 1, 0, ref("SavedViewGroup", group.id));
return newItems;
});
}),
{ autoEvictFiltered: filterKeys }
);
}
} else if (event.type === ProjectSavedViewsUpdatedMessageType.Updated) {
}
});
};
export const useProjectSavedViewsUpdateTracking = (params) => {
useOnProjectSavedViewsUpdated(params);
useOnProjectSavedViewGroupsUpdated(params);
};
//# sourceMappingURL=data:application/json;base64,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QUFTO0FBQUEsZ0JBQVUsQ0FBQyxNQUNyQyxpQkFBaUIsUUFBUSxDQUFDLEVBQUUsRUFBRTtBQUFBLGNBQ2hDO0FBRUEsdUJBQVMsT0FBTyxhQUFhLEdBQUcsR0FBRyxJQUFJLGtCQUFrQixNQUFNLEVBQUUsQ0FBQztBQUVsRSxxQkFBTztBQUFBLFlBQ1QsQ0FBQztBQUFBLFVBQ0gsQ0FBQztBQUFBLFVBQ0gsRUFBRSxtQkFBbUIsV0FBVztBQUFBLFFBQ2xDO0FBQUEsTUFDRjtBQUFBLElBQ0YsV0FBVyxNQUFNLFNBQVMsb0NBQW9DLFNBQVM7QUFBQSxJQUV2RTtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBRU8sYUFBTSxxQ0FBcUMsQ0FBQyxXQUU3QztBQUNKLGdDQUE4QixNQUFNO0FBQ3BDLHFDQUFtQyxNQUFNO0FBQzNDIiwibmFtZXMiOlsicHJvamVjdElkIiwiaXRlbXMiLCJpZCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJzdWJzY3JpcHRpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzVW5ncm91cGVkR3JvdXAgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvc2F2ZWQtdmlld3MnXHJcbmltcG9ydCB7IHVzZUFwb2xsb0NsaWVudCwgdXNlU3Vic2NyaXB0aW9uIH0gZnJvbSAnQHZ1ZS9hcG9sbG8tY29tcG9zYWJsZSdcclxuaW1wb3J0IHsgdXNlTG9jayB9IGZyb20gJ34vbGliL2NvbW1vbi9jb21wb3NhYmxlcy9zaW5nbGV0b24nXHJcbmltcG9ydCB7IGdyYXBocWwgfSBmcm9tICd+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHtcclxuICBQcm9qZWN0U2F2ZWRWaWV3c1VwZGF0ZWRNZXNzYWdlVHlwZSxcclxuICBTb3J0RGlyZWN0aW9uXHJcbn0gZnJvbSAnfi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwvZ3JhcGhxbCdcclxuaW1wb3J0IHtcclxuICBnZXRDYWNoZWRPYmplY3RLZXlzLFxyXG4gIHR5cGUgQ2FjaGVPYmplY3RSZWZlcmVuY2VcclxufSBmcm9tICd+L2xpYi9jb21tb24vaGVscGVycy9ncmFwaHFsJ1xyXG5pbXBvcnQge1xyXG4gIGZpbHRlcktleXMsXHJcbiAgb25Hcm91cFZpZXdSZW1vdmFsQ2FjaGVVcGRhdGVzLFxyXG4gIG9uTmV3R3JvdXBWaWV3Q2FjaGVVcGRhdGVzXHJcbn0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvc2F2ZWRWaWV3cy9jYWNoZSdcclxuXHJcbmNvbnN0IG9uUHJvamVjdFNhdmVkVmlld3NVcGRhdGVkU3Vic2NyaXB0aW9uID0gZ3JhcGhxbChgXHJcbiAgc3Vic2NyaXB0aW9uIE9uUHJvamVjdFNhdmVkVmlld3NVcGRhdGVkKCRwcm9qZWN0SWQ6IElEISkge1xyXG4gICAgcHJvamVjdFNhdmVkVmlld3NVcGRhdGVkKHByb2plY3RJZDogJHByb2plY3RJZCkge1xyXG4gICAgICB0eXBlXHJcbiAgICAgIGlkXHJcbiAgICAgIHNhdmVkVmlldyB7XHJcbiAgICAgICAgaWRcclxuICAgICAgICByZXNvdXJjZUlkc1xyXG4gICAgICAgIGdyb3VwIHtcclxuICAgICAgICAgIGlkXHJcbiAgICAgICAgICBncm91cElkXHJcbiAgICAgICAgICByZXNvdXJjZUlkc1xyXG4gICAgICAgIH1cclxuICAgICAgICAuLi5WaWV3ZXJTYXZlZFZpZXdzUGFuZWxWaWV3X1NhdmVkVmlld1xyXG4gICAgICB9XHJcbiAgICAgIGJlZm9yZUNoYW5nZVNhdmVkVmlldyB7XHJcbiAgICAgICAgZ3JvdXBJZFxyXG4gICAgICAgIHJlc291cmNlSWRzXHJcbiAgICAgICAgZ3JvdXBSZXNvdXJjZUlkc1xyXG4gICAgICAgIHBvc2l0aW9uXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5leHBvcnQgY29uc3QgdXNlT25Qcm9qZWN0U2F2ZWRWaWV3c1VwZGF0ZWQgPSAocGFyYW1zOiB7XHJcbiAgcHJvamVjdElkOiBNYXliZVJlZjxzdHJpbmc+XHJcbn0pID0+IHtcclxuICBjb25zdCB7IHByb2plY3RJZCB9ID0gcGFyYW1zXHJcblxyXG4gIGNvbnN0IHsgdXNlcklkIH0gPSB1c2VBY3RpdmVVc2VyKClcclxuICBjb25zdCB7IHRyaWdnZXJOb3RpZmljYXRpb24gfSA9IHVzZUdsb2JhbFRvYXN0KClcclxuICBjb25zdCBhcG9sbG8gPSB1c2VBcG9sbG9DbGllbnQoKS5jbGllbnRcclxuICBjb25zdCB7IGhhc0xvY2sgfSA9IHVzZUxvY2soXHJcbiAgICBjb21wdXRlZCgoKSA9PiBgdXNlT25Qcm9qZWN0U2F2ZWRWaWV3c1VwZGF0ZWQtJHt1bnJlZihwcm9qZWN0SWQpfWApXHJcbiAgKVxyXG4gIGNvbnN0IGlzRW5hYmxlZCA9IGNvbXB1dGVkKCgpID0+IGhhc0xvY2sudmFsdWUpXHJcbiAgY29uc3QgeyBvblJlc3VsdDogb25WaWV3c1VwZGF0ZWQgfSA9IHVzZVN1YnNjcmlwdGlvbihcclxuICAgIG9uUHJvamVjdFNhdmVkVmlld3NVcGRhdGVkU3Vic2NyaXB0aW9uLFxyXG4gICAgKCkgPT4gKHtcclxuICAgICAgcHJvamVjdElkOiB1bnJlZihwcm9qZWN0SWQpXHJcbiAgICB9KSxcclxuICAgICgpID0+ICh7IGVuYWJsZWQ6ICEhKGlzRW5hYmxlZC52YWx1ZSAmJiB1c2VySWQudmFsdWUpLCBlcnJvclBvbGljeTogJ2FsbCcgfSlcclxuICApXHJcblxyXG4gIG9uVmlld3NVcGRhdGVkKChyZXMpID0+IHtcclxuICAgIGlmICghcmVzLmRhdGE/LnByb2plY3RTYXZlZFZpZXdzVXBkYXRlZCB8fCAhaGFzTG9jay52YWx1ZSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3QgZXZlbnQgPSByZXMuZGF0YS5wcm9qZWN0U2F2ZWRWaWV3c1VwZGF0ZWRcclxuICAgIGNvbnN0IGNhY2hlID0gYXBvbGxvLmNhY2hlXHJcbiAgICBjb25zdCBiZWZvcmVDaGFuZ2VWaWV3ID0gZXZlbnQuYmVmb3JlQ2hhbmdlU2F2ZWRWaWV3XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBldmVudC50eXBlID09PSBQcm9qZWN0U2F2ZWRWaWV3c1VwZGF0ZWRNZXNzYWdlVHlwZS5EZWxldGVkICYmXHJcbiAgICAgIGJlZm9yZUNoYW5nZVZpZXdcclxuICAgICkge1xyXG4gICAgICBvbkdyb3VwVmlld1JlbW92YWxDYWNoZVVwZGF0ZXMoe1xyXG4gICAgICAgIGNhY2hlLFxyXG4gICAgICAgIHZpZXdJZDogZXZlbnQuaWQsXHJcbiAgICAgICAgcHJvamVjdElkOiB1bnJlZihwcm9qZWN0SWQpLFxyXG4gICAgICAgIC4uLihiZWZvcmVDaGFuZ2VWaWV3Lmdyb3VwSWRcclxuICAgICAgICAgID8ge1xyXG4gICAgICAgICAgICAgIGdyb3VwOiB7XHJcbiAgICAgICAgICAgICAgICBpZDogYmVmb3JlQ2hhbmdlVmlldy5ncm91cElkLFxyXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VJZHM6IGJlZm9yZUNoYW5nZVZpZXcuZ3JvdXBSZXNvdXJjZUlkc1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgOiB7XHJcbiAgICAgICAgICAgICAgdmlldzoge1xyXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VJZHM6IGJlZm9yZUNoYW5nZVZpZXcucmVzb3VyY2VJZHNcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBjYWNoZS5ldmljdCh7XHJcbiAgICAgICAgaWQ6IGdldENhY2hlSWQoJ1NhdmVkVmlldycsIGV2ZW50LmlkKVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgZXZlbnQudHlwZSA9PT0gUHJvamVjdFNhdmVkVmlld3NVcGRhdGVkTWVzc2FnZVR5cGUuQ3JlYXRlZCAmJlxyXG4gICAgICBldmVudC5zYXZlZFZpZXdcclxuICAgICkge1xyXG4gICAgICBvbk5ld0dyb3VwVmlld0NhY2hlVXBkYXRlcyh7XHJcbiAgICAgICAgY2FjaGUsXHJcbiAgICAgICAgdmlld0lkOiBldmVudC5pZCxcclxuICAgICAgICBwcm9qZWN0SWQ6IHVucmVmKHByb2plY3RJZCksXHJcbiAgICAgICAgLi4uKGV2ZW50LnNhdmVkVmlldy5ncm91cC5ncm91cElkXHJcbiAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICBncm91cDoge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGV2ZW50LnNhdmVkVmlldy5ncm91cC5ncm91cElkLFxyXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VJZHM6IGV2ZW50LnNhdmVkVmlldy5ncm91cC5yZXNvdXJjZUlkc1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgOiB7XHJcbiAgICAgICAgICAgICAgdmlldzoge1xyXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VJZHM6IGV2ZW50LnNhdmVkVmlldy5yZXNvdXJjZUlkc1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICAgIHRpdGxlOiAnTmV3IHZpZXcgY3JlYXRlZCcsXHJcbiAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3NcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIGV2ZW50LnR5cGUgPT09IFByb2plY3RTYXZlZFZpZXdzVXBkYXRlZE1lc3NhZ2VUeXBlLlVwZGF0ZWQgJiZcclxuICAgICAgZXZlbnQuc2F2ZWRWaWV3ICYmXHJcbiAgICAgIGV2ZW50LmJlZm9yZUNoYW5nZVNhdmVkVmlld1xyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IG9sZEdyb3VwSWQgPSBldmVudC5iZWZvcmVDaGFuZ2VTYXZlZFZpZXcuZ3JvdXBJZFxyXG4gICAgICBjb25zdCBuZXdHcm91cElkID0gZXZlbnQuc2F2ZWRWaWV3Lmdyb3VwLmdyb3VwSWRcclxuICAgICAgY29uc3QgZ3JvdXBDaGFuZ2VkID0gb2xkR3JvdXBJZCAhPT0gbmV3R3JvdXBJZFxyXG4gICAgICBjb25zdCBwb3NpdGlvbkNoYW5nZWQgPVxyXG4gICAgICAgIGdyb3VwQ2hhbmdlZCB8fFxyXG4gICAgICAgIGV2ZW50LmJlZm9yZUNoYW5nZVNhdmVkVmlldy5wb3NpdGlvbiAhPT0gZXZlbnQuc2F2ZWRWaWV3LnBvc2l0aW9uXHJcblxyXG4gICAgICBpZiAoZ3JvdXBDaGFuZ2VkKSB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gb2xkIGdyb3VwLCBhZGQgdG8gbmV3IG9uZVxyXG4gICAgICAgIG9uR3JvdXBWaWV3UmVtb3ZhbENhY2hlVXBkYXRlcyh7XHJcbiAgICAgICAgICBjYWNoZSxcclxuICAgICAgICAgIHZpZXdJZDogZXZlbnQuc2F2ZWRWaWV3LmlkLFxyXG4gICAgICAgICAgcHJvamVjdElkOiBldmVudC5zYXZlZFZpZXcucHJvamVjdElkLFxyXG4gICAgICAgICAgLi4uKG9sZEdyb3VwSWRcclxuICAgICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgICBncm91cDoge1xyXG4gICAgICAgICAgICAgICAgICBpZDogb2xkR3JvdXBJZCxcclxuICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJZHM6IGV2ZW50LmJlZm9yZUNoYW5nZVNhdmVkVmlldy5ncm91cFJlc291cmNlSWRzXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA6IHtcclxuICAgICAgICAgICAgICAgIHZpZXc6IHtcclxuICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJZHM6IGV2ZW50LmJlZm9yZUNoYW5nZVNhdmVkVmlldy5yZXNvdXJjZUlkc1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgb25OZXdHcm91cFZpZXdDYWNoZVVwZGF0ZXMoe1xyXG4gICAgICAgICAgY2FjaGUsXHJcbiAgICAgICAgICB2aWV3SWQ6IGV2ZW50LnNhdmVkVmlldy5pZCxcclxuICAgICAgICAgIHByb2plY3RJZDogZXZlbnQuc2F2ZWRWaWV3LnByb2plY3RJZCxcclxuICAgICAgICAgIC4uLihuZXdHcm91cElkXHJcbiAgICAgICAgICAgID8ge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXA6IHtcclxuICAgICAgICAgICAgICAgICAgaWQ6IG5ld0dyb3VwSWQsXHJcbiAgICAgICAgICAgICAgICAgIHJlc291cmNlSWRzOiBldmVudC5zYXZlZFZpZXcuZ3JvdXAucmVzb3VyY2VJZHNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDoge1xyXG4gICAgICAgICAgICAgICAgdmlldzoge1xyXG4gICAgICAgICAgICAgICAgICByZXNvdXJjZUlkczogZXZlbnQuc2F2ZWRWaWV3LnJlc291cmNlSWRzXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJZiBzZXQgdG8gaG9tZSB2aWV3LCBjbGVhciBob21lIHZpZXcgb24gYWxsIG90aGVyIHZpZXdzIHJlbGF0ZWQgdG8gdGhlIHNhbWUgcmVzb3VyY2VJZFN0cmluZ1xyXG4gICAgICBpZiAoZXZlbnQuc2F2ZWRWaWV3LmlzSG9tZVZpZXcgJiYgZXZlbnQuc2F2ZWRWaWV3Lmdyb3VwUmVzb3VyY2VJZHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgY29uc3QgYWxsU2F2ZWRWaWV3S2V5cyA9IGdldENhY2hlZE9iamVjdEtleXMoY2FjaGUsICdTYXZlZFZpZXcnKVxyXG4gICAgICAgIGNvbnN0IG1vZGVsSWQgPSBldmVudC5zYXZlZFZpZXcuZ3JvdXBSZXNvdXJjZUlkc1swXVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHNhdmVkVmlld0tleSBvZiBhbGxTYXZlZFZpZXdLZXlzKSB7XHJcbiAgICAgICAgICBtb2RpZnlPYmplY3RGaWVsZChcclxuICAgICAgICAgICAgY2FjaGUsXHJcbiAgICAgICAgICAgIHNhdmVkVmlld0tleSxcclxuICAgICAgICAgICAgJ2lzSG9tZVZpZXcnLFxyXG4gICAgICAgICAgICAoeyB2YWx1ZTogaXNIb21lVmlldywgaGVscGVyczogeyByZWFkT2JqZWN0IH0gfSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSByZWFkT2JqZWN0KClcclxuICAgICAgICAgICAgICBjb25zdCBncm91cElkcyA9IHZpZXcuZ3JvdXBSZXNvdXJjZUlkc1xyXG4gICAgICAgICAgICAgIGNvbnN0IHZpZXdJZCA9IHZpZXcuaWRcclxuICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0SWQgPSB2aWV3LnByb2plY3RJZFxyXG4gICAgICAgICAgICAgIGlmICh2aWV3SWQgPT09IGV2ZW50LnNhdmVkVmlldyEuaWQpIHJldHVyblxyXG4gICAgICAgICAgICAgIGlmIChldmVudC5zYXZlZFZpZXchLnByb2plY3RJZCAhPT0gcHJvamVjdElkKSByZXR1cm5cclxuXHJcbiAgICAgICAgICAgICAgaWYgKGlzSG9tZVZpZXcgJiYgZ3JvdXBJZHM/Lmxlbmd0aCA9PT0gMSAmJiBncm91cElkc1swXSA9PT0gbW9kZWxJZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJZiBwb3NpdGlvbiBjaGFuZ2VkLCByZWNhbGN1bGF0ZSBpdCBhY2NvcmRpbmcgdG8gc29ydCBkaXIgaW4gdmFyc1xyXG4gICAgICBpZiAocG9zaXRpb25DaGFuZ2VkKSB7XHJcbiAgICAgICAgLy8gR28gdGhyb3VnaCBhbGwgU2F2ZWRWaWV3R3JvdXAudmlld3MsIHdoZXJlIHRoaXMgdmlldyBleGlzdHMgYW5kIHVwZGF0ZSBhcnJheSBwb3NpdGlvblxyXG4gICAgICAgIGl0ZXJhdGVPYmplY3RGaWVsZChcclxuICAgICAgICAgIGNhY2hlLFxyXG4gICAgICAgICAgZ2V0Q2FjaGVJZCgnUHJvamVjdCcsIHVucmVmKHByb2plY3RJZCkpLFxyXG4gICAgICAgICAgJ3NhdmVkVmlld0dyb3VwcycsXHJcbiAgICAgICAgICAoeyB2YWx1ZSwgaGVscGVyczogeyBmcm9tUmVmIH0gfSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHZhbHVlLml0ZW1zXHJcbiAgICAgICAgICAgIGlmICghaXRlbXMpIHJldHVyblxyXG5cclxuICAgICAgICAgICAgaXRlbXMuZm9yRWFjaCgoZ3JvdXBSZWYpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBmcm9tUmVmKGdyb3VwUmVmKVxyXG4gICAgICAgICAgICAgIG1vZGlmeU9iamVjdEZpZWxkKFxyXG4gICAgICAgICAgICAgICAgY2FjaGUsXHJcbiAgICAgICAgICAgICAgICBnZXRDYWNoZUlkKCdTYXZlZFZpZXdHcm91cCcsIHBhcnNlZC5pZCksXHJcbiAgICAgICAgICAgICAgICAndmlld3MnLFxyXG4gICAgICAgICAgICAgICAgKHsgaGVscGVyczogeyBjcmVhdGVVcGRhdGVkVmFsdWUsIHJlYWRGaWVsZCB9LCB2YXJpYWJsZXMgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBzb3J0RGlyID0gdmFyaWFibGVzLmlucHV0LnNvcnREaXJlY3Rpb24gfHwgU29ydERpcmVjdGlvbi5EZXNjXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRCeSA9ICh2YXJpYWJsZXMuaW5wdXQuc29ydEJ5IHx8ICdwb3NpdGlvbicpIGFzXHJcbiAgICAgICAgICAgICAgICAgICAgfCAncG9zaXRpb24nXHJcbiAgICAgICAgICAgICAgICAgICAgfCAndXBkYXRlZEF0J1xyXG5cclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVVwZGF0ZWRWYWx1ZSgoeyB1cGRhdGUgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgnaXRlbXMnLCAoaXRlbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gaXRlbXMuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3MgPSAocmVmOiBDYWNoZU9iamVjdFJlZmVyZW5jZTwnU2F2ZWRWaWV3Jz4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSByZWFkRmllbGQocmVmLCBzb3J0QnkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWwpIHJldHVybiAtMVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29ydEJ5ID09PSAndXBkYXRlZEF0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbCkuZ2V0VGltZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwgYXMgbnVtYmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFWYWwgPSBwcm9jZXNzKGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJWYWwgPSBwcm9jZXNzKGIpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVZhbCA8IGJWYWwpIHJldHVybiBzb3J0RGlyID09PSBTb3J0RGlyZWN0aW9uLkFzYyA/IC0xIDogMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVZhbCA+IGJWYWwpIHJldHVybiBzb3J0RGlyID09PSBTb3J0RGlyZWN0aW9uLkFzYyA/IDEgOiAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdJdGVtc1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IG9uUHJvamVjdFNhdmVkVmlld0dyb3Vwc1VwZGF0ZWRTdWJzY3JpcHRpb24gPSBncmFwaHFsKGBcclxuICBzdWJzY3JpcHRpb24gT25Qcm9qZWN0U2F2ZWRWaWV3R3JvdXBzVXBkYXRlZCgkcHJvamVjdElkOiBJRCEpIHtcclxuICAgIHByb2plY3RTYXZlZFZpZXdHcm91cHNVcGRhdGVkKHByb2plY3RJZDogJHByb2plY3RJZCkge1xyXG4gICAgICB0eXBlXHJcbiAgICAgIGlkXHJcbiAgICAgIHNhdmVkVmlld0dyb3VwIHtcclxuICAgICAgICBpZFxyXG4gICAgICAgIHByb2plY3RJZFxyXG4gICAgICAgIGF1dGhvciB7XHJcbiAgICAgICAgICBpZFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuYClcclxuXHJcbmV4cG9ydCBjb25zdCB1c2VPblByb2plY3RTYXZlZFZpZXdHcm91cHNVcGRhdGVkID0gKHBhcmFtczoge1xyXG4gIHByb2plY3RJZDogTWF5YmVSZWY8c3RyaW5nPlxyXG59KSA9PiB7XHJcbiAgY29uc3QgeyBwcm9qZWN0SWQgfSA9IHBhcmFtc1xyXG5cclxuICBjb25zdCB7IHVzZXJJZCB9ID0gdXNlQWN0aXZlVXNlcigpXHJcbiAgY29uc3QgYXBvbGxvID0gdXNlQXBvbGxvQ2xpZW50KCkuY2xpZW50XHJcbiAgY29uc3QgeyBoYXNMb2NrIH0gPSB1c2VMb2NrKFxyXG4gICAgY29tcHV0ZWQoKCkgPT4gYHVzZU9uUHJvamVjdFNhdmVkVmlld0dyb3Vwc1VwZGF0ZWQtJHt1bnJlZihwcm9qZWN0SWQpfWApXHJcbiAgKVxyXG4gIGNvbnN0IGlzRW5hYmxlZCA9IGNvbXB1dGVkKCgpID0+IGhhc0xvY2sudmFsdWUpXHJcbiAgY29uc3QgeyBvblJlc3VsdDogb25Hcm91cHNVcGRhdGVkIH0gPSB1c2VTdWJzY3JpcHRpb24oXHJcbiAgICBvblByb2plY3RTYXZlZFZpZXdHcm91cHNVcGRhdGVkU3Vic2NyaXB0aW9uLFxyXG4gICAgKCkgPT4gKHtcclxuICAgICAgcHJvamVjdElkOiB1bnJlZihwcm9qZWN0SWQpXHJcbiAgICB9KSxcclxuICAgICgpID0+ICh7IGVuYWJsZWQ6ICEhKGlzRW5hYmxlZC52YWx1ZSAmJiB1c2VySWQudmFsdWUpLCBlcnJvclBvbGljeTogJ2FsbCcgfSlcclxuICApXHJcblxyXG4gIG9uR3JvdXBzVXBkYXRlZCgocmVzKSA9PiB7XHJcbiAgICBpZiAoIXJlcy5kYXRhPy5wcm9qZWN0U2F2ZWRWaWV3R3JvdXBzVXBkYXRlZCB8fCAhaGFzTG9jay52YWx1ZSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3QgZXZlbnQgPSByZXMuZGF0YS5wcm9qZWN0U2F2ZWRWaWV3R3JvdXBzVXBkYXRlZFxyXG4gICAgY29uc3QgeyBpZCB9ID0gZXZlbnRcclxuICAgIGNvbnN0IGNhY2hlID0gYXBvbGxvLmNhY2hlXHJcbiAgICBjb25zdCBncm91cCA9IGV2ZW50LnNhdmVkVmlld0dyb3VwXHJcblxyXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IFByb2plY3RTYXZlZFZpZXdzVXBkYXRlZE1lc3NhZ2VUeXBlLkRlbGV0ZWQpIHtcclxuICAgICAgLy8gVmlld3MgY2FuIGJlIG1vdmVkIGFyb3VuZCwganVzdCBlYXNpZXIgdG8gZXZpY3QgUHJvamVjdCBncm91cHNcclxuICAgICAgbW9kaWZ5T2JqZWN0RmllbGQoXHJcbiAgICAgICAgY2FjaGUsXHJcbiAgICAgICAgZ2V0Q2FjaGVJZCgnUHJvamVjdCcsIHVucmVmKHByb2plY3RJZCkpLFxyXG4gICAgICAgICdzYXZlZFZpZXdHcm91cHMnLFxyXG4gICAgICAgICh7IGhlbHBlcnM6IHsgZXZpY3QgfSB9KSA9PiBldmljdCgpXHJcbiAgICAgIClcclxuXHJcbiAgICAgIC8vIEV2aWN0IGFsbCAnZGVmYXVsdCcgZ3JvdXBzIC0gaXRlbXMgd2lsbCBmYWxsIGluIHRoZXJlXHJcbiAgICAgIG1vZGlmeU9iamVjdEZpZWxkKFxyXG4gICAgICAgIGNhY2hlLFxyXG4gICAgICAgIGdldENhY2hlSWQoJ1Byb2plY3QnLCB1bnJlZihwcm9qZWN0SWQpKSxcclxuICAgICAgICAnc2F2ZWRWaWV3R3JvdXAnLFxyXG4gICAgICAgICh7IGhlbHBlcnM6IHsgZXZpY3QsIGZyb21SZWYgfSwgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgeyBpZCB9ID0gZnJvbVJlZih2YWx1ZSlcclxuICAgICAgICAgIGlmIChpc1VuZ3JvdXBlZEdyb3VwKGlkKSkgcmV0dXJuIGV2aWN0KClcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuXHJcbiAgICAgIC8vIEV2aWN0XHJcbiAgICAgIGNhY2hlLmV2aWN0KHtcclxuICAgICAgICBpZDogZ2V0Q2FjaGVJZCgnU2F2ZWRWaWV3R3JvdXAnLCBpZClcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gUHJvamVjdFNhdmVkVmlld3NVcGRhdGVkTWVzc2FnZVR5cGUuQ3JlYXRlZCAmJiBncm91cCkge1xyXG4gICAgICAvLyBQcm9qZWN0LnNhdmVkVmlld0dyb3VwcyArMSwgYnV0IG9ubHkgaWYgb3duZWQgT1Igbm90IGVtcHR5XHJcbiAgICAgIC8vIChhbmQgaXRzIGdvbm5hIGJlIGVtcHR5IG9uIGNyZWF0ZSlcclxuICAgICAgY29uc3QgaXNPd25lciA9IGdyb3VwLmF1dGhvcj8uaWQgPT09IHVzZXJJZC52YWx1ZVxyXG4gICAgICBpZiAoaXNPd25lcikge1xyXG4gICAgICAgIG1vZGlmeU9iamVjdEZpZWxkKFxyXG4gICAgICAgICAgY2FjaGUsXHJcbiAgICAgICAgICBnZXRDYWNoZUlkKCdQcm9qZWN0JywgZ3JvdXAucHJvamVjdElkKSxcclxuICAgICAgICAgICdzYXZlZFZpZXdHcm91cHMnLFxyXG4gICAgICAgICAgKHsgaGVscGVyczogeyBjcmVhdGVVcGRhdGVkVmFsdWUsIGZyb21SZWYsIHJlZiB9IH0pID0+XHJcbiAgICAgICAgICAgIGNyZWF0ZVVwZGF0ZWRWYWx1ZSgoeyB1cGRhdGUgfSkgPT4ge1xyXG4gICAgICAgICAgICAgIHVwZGF0ZSgndG90YWxDb3VudCcsICh0b3RhbENvdW50KSA9PiB0b3RhbENvdW50ICsgMSlcclxuICAgICAgICAgICAgICB1cGRhdGUoJ2l0ZW1zJywgKGl0ZW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdJdGVtcyA9IGl0ZW1zLnNsaWNlKClcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGNvbWVzIGZpcnN0LCB0aGVuIG5ldyBncm91cFxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdElkeCA9IG5ld0l0ZW1zLmZpbmRJbmRleCgoaSkgPT5cclxuICAgICAgICAgICAgICAgICAgaXNVbmdyb3VwZWRHcm91cChmcm9tUmVmKGkpLmlkKVxyXG4gICAgICAgICAgICAgICAgKVxyXG5cclxuICAgICAgICAgICAgICAgIG5ld0l0ZW1zLnNwbGljZShkZWZhdWx0SWR4ICsgMSwgMCwgcmVmKCdTYXZlZFZpZXdHcm91cCcsIGdyb3VwLmlkKSlcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3SXRlbXNcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgIHsgYXV0b0V2aWN0RmlsdGVyZWQ6IGZpbHRlcktleXMgfVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBQcm9qZWN0U2F2ZWRWaWV3c1VwZGF0ZWRNZXNzYWdlVHlwZS5VcGRhdGVkKSB7XHJcbiAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZSBmb3Igbm93IC0gZmllbGRzIGFyZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgaW4gY2FjaGVcclxuICAgIH1cclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgdXNlUHJvamVjdFNhdmVkVmlld3NVcGRhdGVUcmFja2luZyA9IChwYXJhbXM6IHtcclxuICBwcm9qZWN0SWQ6IE1heWJlUmVmPHN0cmluZz5cclxufSkgPT4ge1xyXG4gIHVzZU9uUHJvamVjdFNhdmVkVmlld3NVcGRhdGVkKHBhcmFtcylcclxuICB1c2VPblByb2plY3RTYXZlZFZpZXdHcm91cHNVcGRhdGVkKHBhcmFtcylcclxufVxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zYXZlZFZpZXdzL3N1YnNjcmlwdGlvbnMudHMifQ==