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==