146 lines
17 KiB
Plaintext
146 lines
17 KiB
Plaintext
import { isSerializedViewerState } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/viewer/helpers/state.js";
|
|
import { useViewerRealtimeActivityTracker } from "/_nuxt/lib/viewer/composables/activity.ts";
|
|
import {
|
|
StateApplyMode,
|
|
useApplySerializedState
|
|
} from "/_nuxt/lib/viewer/composables/serialization.ts";
|
|
import {
|
|
useInjectedViewerState
|
|
} from "/_nuxt/lib/viewer/composables/setup.ts";
|
|
import { useEmbedState } from "/_nuxt/lib/viewer/composables/setup/embed.ts";
|
|
import { ViewerRenderPageType } from "/_nuxt/lib/viewer/helpers/state.ts";
|
|
|
|
import { useEventBus } from "/_nuxt/composables/globals.ts";
|
|
import { ViewerEventBusKeys } from "/_nuxt/utils/globals.ts";
|
|
import { watch, ref, onUnmounted } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
export const useViewerSavedViewIntegration = () => {
|
|
const {
|
|
pageType,
|
|
resources: {
|
|
request: {
|
|
savedView: { id: savedViewId, loadOriginal }
|
|
},
|
|
response: { savedView }
|
|
},
|
|
urlHashState: { savedView: urlHashStateSavedViewSettings },
|
|
ui: {
|
|
savedViews: { savedViewStateId }
|
|
}
|
|
} = useInjectedViewerState();
|
|
const applyState = useApplySerializedState();
|
|
const { serializedStateId } = useViewerRealtimeActivityTracker();
|
|
const { on, emit } = useEventBus();
|
|
const { embedOptions } = useEmbedState();
|
|
const validState = (state) => isSerializedViewerState(state) ? state : null;
|
|
const apply = async () => {
|
|
const state = validState(savedView.value?.viewerState);
|
|
if (!state) return;
|
|
await applyState(state, StateApplyMode.SavedView, {
|
|
loadOriginal: loadOriginal.value
|
|
});
|
|
savedViewStateId.value = serializedStateId.value;
|
|
};
|
|
const resetUrlHashState = async () => {
|
|
await urlHashStateSavedViewSettings.update(null);
|
|
};
|
|
const update = async (params) => {
|
|
const { settings } = params;
|
|
let reapplyState = true;
|
|
if (settings.id && settings.id !== savedViewId.value) {
|
|
if (embedOptions.value?.isEnabled) {
|
|
await urlHashStateSavedViewSettings.update({ id: settings.id });
|
|
} else {
|
|
await resetUrlHashState();
|
|
savedViewId.value = settings.id;
|
|
}
|
|
savedViewStateId.value = void 0;
|
|
reapplyState = false;
|
|
}
|
|
if ((settings.loadOriginal || false) !== loadOriginal.value) {
|
|
loadOriginal.value = settings.loadOriginal || false;
|
|
}
|
|
if (reapplyState && settings.id === savedViewId.value) {
|
|
const state = validState(savedView.value?.viewerState);
|
|
if (!state) return;
|
|
await apply();
|
|
}
|
|
};
|
|
const reset = async () => {
|
|
if (pageType.value === ViewerRenderPageType.Presentation) return;
|
|
savedViewId.value = null;
|
|
loadOriginal.value = false;
|
|
savedViewStateId.value = void 0;
|
|
await resetUrlHashState();
|
|
};
|
|
on(ViewerEventBusKeys.ApplySavedView, async (settings) => {
|
|
await update({ settings });
|
|
});
|
|
watch(
|
|
savedView,
|
|
async (newVal, oldVal) => {
|
|
if (!newVal || newVal.id === oldVal?.id) return;
|
|
const state = validState(newVal.viewerState);
|
|
if (!state) return;
|
|
await apply();
|
|
},
|
|
{ immediate: true }
|
|
);
|
|
watch(
|
|
() => serializedStateId.value,
|
|
async (newVal, oldVal) => {
|
|
if (newVal === oldVal) return;
|
|
if (embedOptions.value?.isEnabled) return;
|
|
if (savedViewStateId.value && newVal !== savedViewStateId.value) {
|
|
if (savedViewId.value)
|
|
emit(ViewerEventBusKeys.UserChangedOpenedView, { viewId: savedViewId.value });
|
|
await reset();
|
|
}
|
|
},
|
|
{ immediate: true }
|
|
);
|
|
};
|
|
export const useBuildSavedViewsUIState = () => {
|
|
const openedGroupState = ref(/* @__PURE__ */ new Map());
|
|
const savedViewStateId = ref();
|
|
onUnmounted(() => {
|
|
openedGroupState.value = /* @__PURE__ */ new Map();
|
|
});
|
|
return {
|
|
/**
|
|
* Groups that should currently be expanded/open
|
|
*/
|
|
openedGroupState,
|
|
/**
|
|
* A kind of a "viewer snapshot" ID associated w/ the saved view being loaded. Helps track
|
|
* if user has changed the view since loading the saved view
|
|
*/
|
|
savedViewStateId
|
|
};
|
|
};
|
|
export const useBuildSavedViewsCoreState = (state, initParams) => {
|
|
const {
|
|
urlHashState: { savedView: urlHashStateSavedViewSettings }
|
|
} = state;
|
|
const savedViewId = initParams?.savedView?.id || ref(void 0);
|
|
const loadOriginal = initParams?.savedView?.loadOriginal || ref(false);
|
|
if (state.pageType.value !== ViewerRenderPageType.Presentation) {
|
|
watch(
|
|
urlHashStateSavedViewSettings,
|
|
async (newVal) => {
|
|
if ((newVal?.id || null) !== (savedViewId.value || null)) {
|
|
savedViewId.value = newVal?.id || null;
|
|
}
|
|
if ((newVal?.loadOriginal || false) !== loadOriginal.value) {
|
|
loadOriginal.value = newVal?.loadOriginal || false;
|
|
}
|
|
},
|
|
{ immediate: true }
|
|
);
|
|
}
|
|
return {
|
|
id: savedViewId,
|
|
loadOriginal
|
|
};
|
|
};
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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QjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQUEsSUFDTCxJQUFJO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFDRiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsic3RhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNTZXJpYWxpemVkVmlld2VyU3RhdGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvdmlld2VyL3N0YXRlJ1xyXG5pbXBvcnQgeyB1c2VWaWV3ZXJSZWFsdGltZUFjdGl2aXR5VHJhY2tlciB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9hY3Rpdml0eSdcclxuaW1wb3J0IHtcclxuICBTdGF0ZUFwcGx5TW9kZSxcclxuICB1c2VBcHBseVNlcmlhbGl6ZWRTdGF0ZVxyXG59IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXJpYWxpemF0aW9uJ1xyXG5pbXBvcnQge1xyXG4gIHVzZUluamVjdGVkVmlld2VyU3RhdGUsXHJcbiAgdHlwZSBJbml0aWFsU2V0dXBTdGF0ZSxcclxuICB0eXBlIFVzZVNldHVwVmlld2VyUGFyYW1zXHJcbn0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgeyB1c2VFbWJlZFN0YXRlIH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwL2VtYmVkJ1xyXG5pbXBvcnQgdHlwZSB7IFNhdmVkVmlld1VybFNldHRpbmdzIH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvc2F2ZWRWaWV3cydcclxuaW1wb3J0IHsgVmlld2VyUmVuZGVyUGFnZVR5cGUgfSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9zdGF0ZSdcclxuXHJcbi8qKlxyXG4gKiBJbnZva2UgaW4gcG9zdFNldHVwXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgdXNlVmlld2VyU2F2ZWRWaWV3SW50ZWdyYXRpb24gPSAoKSA9PiB7XHJcbiAgY29uc3Qge1xyXG4gICAgcGFnZVR5cGUsXHJcbiAgICByZXNvdXJjZXM6IHtcclxuICAgICAgcmVxdWVzdDoge1xyXG4gICAgICAgIHNhdmVkVmlldzogeyBpZDogc2F2ZWRWaWV3SWQsIGxvYWRPcmlnaW5hbCB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHJlc3BvbnNlOiB7IHNhdmVkVmlldyB9XHJcbiAgICB9LFxyXG4gICAgdXJsSGFzaFN0YXRlOiB7IHNhdmVkVmlldzogdXJsSGFzaFN0YXRlU2F2ZWRWaWV3U2V0dGluZ3MgfSxcclxuICAgIHVpOiB7XHJcbiAgICAgIHNhdmVkVmlld3M6IHsgc2F2ZWRWaWV3U3RhdGVJZCB9XHJcbiAgICB9XHJcbiAgfSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIGNvbnN0IGFwcGx5U3RhdGUgPSB1c2VBcHBseVNlcmlhbGl6ZWRTdGF0ZSgpXHJcbiAgY29uc3QgeyBzZXJpYWxpemVkU3RhdGVJZCB9ID0gdXNlVmlld2VyUmVhbHRpbWVBY3Rpdml0eVRyYWNrZXIoKVxyXG4gIGNvbnN0IHsgb24sIGVtaXQgfSA9IHVzZUV2ZW50QnVzKClcclxuICBjb25zdCB7IGVtYmVkT3B0aW9ucyB9ID0gdXNlRW1iZWRTdGF0ZSgpXHJcblxyXG4gIGNvbnN0IHZhbGlkU3RhdGUgPSAoc3RhdGU6IHVua25vd24pID0+IChpc1NlcmlhbGl6ZWRWaWV3ZXJTdGF0ZShzdGF0ZSkgPyBzdGF0ZSA6IG51bGwpXHJcblxyXG4gIGNvbnN0IGFwcGx5ID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgY29uc3Qgc3RhdGUgPSB2YWxpZFN0YXRlKHNhdmVkVmlldy52YWx1ZT8udmlld2VyU3RhdGUpXHJcbiAgICBpZiAoIXN0YXRlKSByZXR1cm5cclxuXHJcbiAgICBhd2FpdCBhcHBseVN0YXRlKHN0YXRlLCBTdGF0ZUFwcGx5TW9kZS5TYXZlZFZpZXcsIHtcclxuICAgICAgbG9hZE9yaWdpbmFsOiBsb2FkT3JpZ2luYWwudmFsdWVcclxuICAgIH0pXHJcbiAgICBzYXZlZFZpZXdTdGF0ZUlkLnZhbHVlID0gc2VyaWFsaXplZFN0YXRlSWQudmFsdWVcclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc2V0VXJsSGFzaFN0YXRlID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgYXdhaXQgdXJsSGFzaFN0YXRlU2F2ZWRWaWV3U2V0dGluZ3MudXBkYXRlKG51bGwpXHJcbiAgfVxyXG5cclxuICBjb25zdCB1cGRhdGUgPSBhc3luYyAocGFyYW1zOiB7IHNldHRpbmdzOiBTYXZlZFZpZXdVcmxTZXR0aW5ncyB9KSA9PiB7XHJcbiAgICBjb25zdCB7IHNldHRpbmdzIH0gPSBwYXJhbXNcclxuXHJcbiAgICBsZXQgcmVhcHBseVN0YXRlID0gdHJ1ZVxyXG5cclxuICAgIC8vIElmIHBhc3NpbmcgaW4gdmlld0lkIGFuZCBpdCBkaWZmZXJzLCBhcHBseSBhbmQgd2FpdCBmb3IgdGhhdCB0byBmaW5pc2hcclxuICAgIGlmIChzZXR0aW5ncy5pZCAmJiBzZXR0aW5ncy5pZCAhPT0gc2F2ZWRWaWV3SWQudmFsdWUpIHtcclxuICAgICAgaWYgKGVtYmVkT3B0aW9ucy52YWx1ZT8uaXNFbmFibGVkKSB7XHJcbiAgICAgICAgLy8gaW4gZW1iZWQgbW9kZSB3ZSB3YW50IGNsaWNraW5nIHZpZXdzIHRvIGFjdHVhbGx5IHNob3cgc2VsZWN0ZWQgdmlldyBpbiB0aGUgVVJMXHJcbiAgICAgICAgYXdhaXQgdXJsSGFzaFN0YXRlU2F2ZWRWaWV3U2V0dGluZ3MudXBkYXRlKHsgaWQ6IHNldHRpbmdzLmlkIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gd2lwZSBoYXNoIHN0YXRlLCBpZiBhbnkgZXhpc3RzLCBvdGhlcndpc2UgdGhlIHN0YXRlIHdpbGwgYmUgc3RhbGVcclxuICAgICAgICBhd2FpdCByZXNldFVybEhhc2hTdGF0ZSgpXHJcbiAgICAgICAgc2F2ZWRWaWV3SWQudmFsdWUgPSBzZXR0aW5ncy5pZFxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB0aGlzIGFjdHMgYXMgYSByZXNldCBvZiB0aGUgc3RhdGUgaWQgdG9vLCBjYXVzZSBpdCBvbmx5IGFwcGxpZXMgdG8gYWN0aXZlIHZpZXdcclxuICAgICAgc2F2ZWRWaWV3U3RhdGVJZC52YWx1ZSA9IHVuZGVmaW5lZFxyXG4gICAgICByZWFwcGx5U3RhdGUgPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIGNoYW5naW5nIGxvYWRPcmlnaW5hbCB2YWx1ZSwgYXBwbHkgYW5kIHdhaXQgZm9yIHRoYXQgdG8gZmluaXNoXHJcbiAgICBpZiAoKHNldHRpbmdzLmxvYWRPcmlnaW5hbCB8fCBmYWxzZSkgIT09IGxvYWRPcmlnaW5hbC52YWx1ZSkge1xyXG4gICAgICBsb2FkT3JpZ2luYWwudmFsdWUgPSBzZXR0aW5ncy5sb2FkT3JpZ2luYWwgfHwgZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZS1hcHBseSBjdXJyZW50IHN0YXRlLCBpZiBxdWV1ZWRcclxuICAgIGlmIChyZWFwcGx5U3RhdGUgJiYgc2V0dGluZ3MuaWQgPT09IHNhdmVkVmlld0lkLnZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IHN0YXRlID0gdmFsaWRTdGF0ZShzYXZlZFZpZXcudmFsdWU/LnZpZXdlclN0YXRlKVxyXG4gICAgICBpZiAoIXN0YXRlKSByZXR1cm5cclxuICAgICAgYXdhaXQgYXBwbHkoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgcmVzZXQgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAvLyBObyBzdWNoIHRoaW5nIGFzIGEgcmVzZXQgaW4gcHJlc2VudGF0aW9uIG1vZGUgLSB3ZSBhbHdheXMgaGF2ZSBhIHZpZXcgYWN0aXZlXHJcbiAgICBpZiAocGFnZVR5cGUudmFsdWUgPT09IFZpZXdlclJlbmRlclBhZ2VUeXBlLlByZXNlbnRhdGlvbikgcmV0dXJuXHJcblxyXG4gICAgc2F2ZWRWaWV3SWQudmFsdWUgPSBudWxsXHJcbiAgICBsb2FkT3JpZ2luYWwudmFsdWUgPSBmYWxzZVxyXG4gICAgc2F2ZWRWaWV3U3RhdGVJZC52YWx1ZSA9IHVuZGVmaW5lZFxyXG4gICAgYXdhaXQgcmVzZXRVcmxIYXNoU3RhdGUoKVxyXG4gIH1cclxuXHJcbiAgLy8gQWxsb3cgZm9yY2UgdXBkYXRlXHJcbiAgb24oVmlld2VyRXZlbnRCdXNLZXlzLkFwcGx5U2F2ZWRWaWV3LCBhc3luYyAoc2V0dGluZ3MpID0+IHtcclxuICAgIGF3YWl0IHVwZGF0ZSh7IHNldHRpbmdzIH0pXHJcbiAgfSlcclxuXHJcbiAgLy8gU2F2ZWQgdmlldyBjaGFuZ2VkLCBhcHBseVxyXG4gIHdhdGNoKFxyXG4gICAgc2F2ZWRWaWV3LFxyXG4gICAgYXN5bmMgKG5ld1ZhbCwgb2xkVmFsKSA9PiB7XHJcbiAgICAgIGlmICghbmV3VmFsIHx8IG5ld1ZhbC5pZCA9PT0gb2xkVmFsPy5pZCkgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBzdGF0ZSA9IHZhbGlkU3RhdGUobmV3VmFsLnZpZXdlclN0YXRlKVxyXG4gICAgICBpZiAoIXN0YXRlKSByZXR1cm5cclxuXHJcbiAgICAgIC8vIElmIHRoZSBzYXZlZCB2aWV3IGhhcyBjaGFuZ2VkLCBhcHBseSBpdFxyXG4gICAgICBhd2FpdCBhcHBseSgpXHJcbiAgICB9LFxyXG4gICAgeyBpbW1lZGlhdGU6IHRydWUgfVxyXG4gIClcclxuXHJcbiAgd2F0Y2goXHJcbiAgICAoKSA9PiBzZXJpYWxpemVkU3RhdGVJZC52YWx1ZSxcclxuICAgIGFzeW5jIChuZXdWYWwsIG9sZFZhbCkgPT4ge1xyXG4gICAgICBpZiAobmV3VmFsID09PSBvbGRWYWwpIHJldHVyblxyXG4gICAgICBpZiAoZW1iZWRPcHRpb25zLnZhbHVlPy5pc0VuYWJsZWQpIHJldHVybiAvLyB3ZSBuZXZlciByZXNldCBpbiBlbWJlZCBtb2RlXHJcblxyXG4gICAgICAvLyBJZiB0aGUgc2F2ZWQgdmlldyBzdGF0ZSBJRCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzZXJpYWxpemVkIHN0YXRlIElEICh1c2VyIGludGVyYWN0aW9uKSAtXHJcbiAgICAgIC8vIHVzZXIgaGFzIGNoYW5nZWQgdGhlIHN0YXRlIGZyb20gdGhlIHZpZXcncyBzdGF0ZVxyXG4gICAgICBpZiAoc2F2ZWRWaWV3U3RhdGVJZC52YWx1ZSAmJiBuZXdWYWwgIT09IHNhdmVkVmlld1N0YXRlSWQudmFsdWUpIHtcclxuICAgICAgICAvLyBlbWl0IGV2ZW50IHRoYXQgdGhpcyBoYXBwZW5lZFxyXG4gICAgICAgIGlmIChzYXZlZFZpZXdJZC52YWx1ZSlcclxuICAgICAgICAgIGVtaXQoVmlld2VyRXZlbnRCdXNLZXlzLlVzZXJDaGFuZ2VkT3BlbmVkVmlldywgeyB2aWV3SWQ6IHNhdmVkVmlld0lkLnZhbHVlIH0pXHJcblxyXG4gICAgICAgIC8vIHJlc2V0IHRoZSBzYXZlZCB2aWV3IC0gaXRzIG5vIGxvbmdlciBhY3RpdmVcclxuICAgICAgICBhd2FpdCByZXNldCgpXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7IGltbWVkaWF0ZTogdHJ1ZSB9XHJcbiAgKVxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBTYXZlZFZpZXdzVUlTdGF0ZSA9IFJldHVyblR5cGU8dHlwZW9mIHVzZUJ1aWxkU2F2ZWRWaWV3c1VJU3RhdGU+XHJcblxyXG5leHBvcnQgY29uc3QgdXNlQnVpbGRTYXZlZFZpZXdzVUlTdGF0ZSA9ICgpID0+IHtcclxuICBjb25zdCBvcGVuZWRHcm91cFN0YXRlID0gcmVmPE1hcDxzdHJpbmcsIHRydWU+PihuZXcgTWFwKCkpXHJcbiAgY29uc3Qgc2F2ZWRWaWV3U3RhdGVJZCA9IHJlZjxzdHJpbmc+KClcclxuXHJcbiAgb25Vbm1vdW50ZWQoKCkgPT4ge1xyXG4gICAgb3BlbmVkR3JvdXBTdGF0ZS52YWx1ZSA9IG5ldyBNYXAoKVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICAvKipcclxuICAgICAqIEdyb3VwcyB0aGF0IHNob3VsZCBjdXJyZW50bHkgYmUgZXhwYW5kZWQvb3BlblxyXG4gICAgICovXHJcbiAgICBvcGVuZWRHcm91cFN0YXRlLFxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGtpbmQgb2YgYSBcInZpZXdlciBzbmFwc2hvdFwiIElEIGFzc29jaWF0ZWQgdy8gdGhlIHNhdmVkIHZpZXcgYmVpbmcgbG9hZGVkLiBIZWxwcyB0cmFja1xyXG4gICAgICogaWYgdXNlciBoYXMgY2hhbmdlZCB0aGUgdmlldyBzaW5jZSBsb2FkaW5nIHRoZSBzYXZlZCB2aWV3XHJcbiAgICAgKi9cclxuICAgIHNhdmVkVmlld1N0YXRlSWRcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCB1c2VCdWlsZFNhdmVkVmlld3NDb3JlU3RhdGUgPSAoXHJcbiAgc3RhdGU6IEluaXRpYWxTZXR1cFN0YXRlLFxyXG4gIGluaXRQYXJhbXM6IFVzZVNldHVwVmlld2VyUGFyYW1zXHJcbikgPT4ge1xyXG4gIGNvbnN0IHtcclxuICAgIHVybEhhc2hTdGF0ZTogeyBzYXZlZFZpZXc6IHVybEhhc2hTdGF0ZVNhdmVkVmlld1NldHRpbmdzIH1cclxuICB9ID0gc3RhdGVcclxuXHJcbiAgY29uc3Qgc2F2ZWRWaWV3SWQgPVxyXG4gICAgaW5pdFBhcmFtcz8uc2F2ZWRWaWV3Py5pZCB8fCByZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxyXG4gIGNvbnN0IGxvYWRPcmlnaW5hbCA9IGluaXRQYXJhbXM/LnNhdmVkVmlldz8ubG9hZE9yaWdpbmFsIHx8IHJlZjxib29sZWFuPihmYWxzZSlcclxuXHJcbiAgLy8gRG9udCBjYXJlIGFib3V0IHVybEhhc2hTdGF0ZSBpbiBwcmVzZW50YXRpb24gbW9kZVxyXG4gIGlmIChzdGF0ZS5wYWdlVHlwZS52YWx1ZSAhPT0gVmlld2VyUmVuZGVyUGFnZVR5cGUuUHJlc2VudGF0aW9uKSB7XHJcbiAgICAvLyBVc3VhbGx5IHRoaXMgd2F0Y2hlciB3b3VsZCBoYXBwZW4gaW4gcG9zdC1zZXR1cCwgYnV0IGl0cyBjcml0aWNhbCB0aGF0IHRoaXMgaXMgZmlyZWRcclxuICAgIC8vIGVhcmx5LCBiZWZvcmUgYW55IG9mIHRoZSBHUUwgcXVlcmllcyBmaXJlOlxyXG4gICAgLy8gVXJsIGhhc2ggc3RhdGUgLT4gY29yZSBzb3VyY2Ugb2YgdHJ1dGggc3luY1xyXG4gICAgd2F0Y2goXHJcbiAgICAgIHVybEhhc2hTdGF0ZVNhdmVkVmlld1NldHRpbmdzLFxyXG4gICAgICBhc3luYyAobmV3VmFsKSA9PiB7XHJcbiAgICAgICAgaWYgKChuZXdWYWw/LmlkIHx8IG51bGwpICE9PSAoc2F2ZWRWaWV3SWQudmFsdWUgfHwgbnVsbCkpIHtcclxuICAgICAgICAgIHNhdmVkVmlld0lkLnZhbHVlID0gbmV3VmFsPy5pZCB8fCBudWxsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoKG5ld1ZhbD8ubG9hZE9yaWdpbmFsIHx8IGZhbHNlKSAhPT0gbG9hZE9yaWdpbmFsLnZhbHVlKSB7XHJcbiAgICAgICAgICBsb2FkT3JpZ2luYWwudmFsdWUgPSBuZXdWYWw/LmxvYWRPcmlnaW5hbCB8fCBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgeyBpbW1lZGlhdGU6IHRydWUgfVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGlkOiBzYXZlZFZpZXdJZCxcclxuICAgIGxvYWRPcmlnaW5hbFxyXG4gIH1cclxufVxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zYXZlZFZpZXdzL3N0YXRlLnRzIn0= |