215 lines
28 KiB
Plaintext
215 lines
28 KiB
Plaintext
import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts";
|
|
import { CameraEvent, ViewerEvent } from "/_nuxt/@fs/D:/speckle-server/packages/viewer/dist/index.js";
|
|
import { isArray, throttle } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29";
|
|
import { until } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29";
|
|
import { TIME_MS, timeoutAt, TimeoutError } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
|
|
import { Vector3 } from "/_nuxt/node_modules/.cache/vite/client/deps/three.js?v=e4f18c29";
|
|
import { areVectorsLooselyEqual } from "/_nuxt/lib/viewer/helpers/three.ts";
|
|
import {
|
|
CameraController
|
|
} from "/_nuxt/@fs/D:/speckle-server/packages/viewer/dist/index.js";
|
|
|
|
import { onMounted, onBeforeUnmount, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import { useApiOrigin } from "/_nuxt/composables/env.ts";
|
|
import { useLogger } from "/_nuxt/composables/logging.ts";
|
|
const cacheTimeoutMs = 250;
|
|
let hitCache = null;
|
|
let lastCacheRefresh = Date.now();
|
|
function getFirstVisibleSelectionHit({ hits }, state) {
|
|
const {
|
|
viewer: {
|
|
metadata: { filteringState }
|
|
}
|
|
} = state;
|
|
if (Date.now() - lastCacheRefresh < cacheTimeoutMs && hitCache) {
|
|
return hitCache;
|
|
}
|
|
hitCache = null;
|
|
lastCacheRefresh = Date.now();
|
|
const hasHiddenObjects = (filteringState.value?.hiddenObjects || []).length !== 0;
|
|
const hasIsolatedObjects = !!filteringState.value?.isolatedObjects && filteringState.value?.isolatedObjects.length !== 0;
|
|
for (const hit of hits) {
|
|
if (hasHiddenObjects) {
|
|
if (!filteringState.value?.hiddenObjects?.includes(
|
|
hit.node.model.raw.id
|
|
)) {
|
|
hitCache = hit;
|
|
return hitCache;
|
|
}
|
|
} else if (hasIsolatedObjects) {
|
|
if (filteringState.value.isolatedObjects?.includes(
|
|
hit.node.model.raw.id
|
|
)) {
|
|
hitCache = hit;
|
|
return hitCache;
|
|
}
|
|
} else {
|
|
hitCache = hit;
|
|
return hitCache;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
export function useViewerEventListener(name, listener, options) {
|
|
const {
|
|
viewer: { instance }
|
|
} = options?.state || useInjectedViewerState();
|
|
const names = isArray(name) ? name : [name];
|
|
const unmount = () => {
|
|
for (const n of names) {
|
|
instance.removeListener(n, listener);
|
|
}
|
|
};
|
|
onMounted(() => {
|
|
for (const n of names) {
|
|
instance.on(n, listener);
|
|
}
|
|
});
|
|
onBeforeUnmount(() => {
|
|
unmount();
|
|
});
|
|
return unmount;
|
|
}
|
|
export function useViewerCameraTracker(callback, options) {
|
|
const {
|
|
viewer: { instance }
|
|
} = useInjectedViewerState();
|
|
const { throttleWait = 50, onlyInvokeOnMeaningfulChanges } = options || {};
|
|
const lastPos = ref(null);
|
|
const lastTarget = ref(null);
|
|
const callbackChangeTrackerWrapper = (changed) => {
|
|
if (!changed) return;
|
|
if (!onlyInvokeOnMeaningfulChanges) {
|
|
return callback();
|
|
}
|
|
const extension = instance.getExtension(CameraController);
|
|
const viewerPos = new Vector3().copy(extension.renderingCamera.position);
|
|
const viewerTarget = new Vector3().copy(extension.getTarget());
|
|
let meaningfulChangeFound = false;
|
|
if (!lastPos.value || !areVectorsLooselyEqual(lastPos.value, viewerPos)) {
|
|
meaningfulChangeFound = true;
|
|
}
|
|
if (!lastTarget.value || !areVectorsLooselyEqual(lastTarget.value, viewerTarget)) {
|
|
meaningfulChangeFound = true;
|
|
}
|
|
if (meaningfulChangeFound) {
|
|
lastPos.value = viewerPos.clone();
|
|
lastTarget.value = viewerTarget.clone();
|
|
callback();
|
|
}
|
|
};
|
|
const finalCallback = throttleWait ? throttle(callbackChangeTrackerWrapper, throttleWait) : callbackChangeTrackerWrapper;
|
|
onMounted(() => {
|
|
const extension = instance.getExtension(CameraController);
|
|
extension.on(CameraEvent.LateFrameUpdate, finalCallback);
|
|
});
|
|
onBeforeUnmount(() => {
|
|
instance.getExtension(CameraController).removeListener(CameraEvent.LateFrameUpdate, finalCallback);
|
|
});
|
|
}
|
|
export function useViewerCameraControlStartTracker(callback) {
|
|
const {
|
|
viewer: { instance }
|
|
} = useInjectedViewerState();
|
|
const removeListener = () => instance.getExtension(CameraController).removeListener(CameraEvent.InteractionStarted, callback);
|
|
onMounted(() => {
|
|
instance.getExtension(CameraController).on(CameraEvent.InteractionStarted, callback);
|
|
});
|
|
onBeforeUnmount(() => {
|
|
removeListener();
|
|
});
|
|
return removeListener;
|
|
}
|
|
export function useViewerCameraRestTracker(callback) {
|
|
const {
|
|
viewer: { instance }
|
|
} = useInjectedViewerState();
|
|
const removeListener = () => {
|
|
const extension = instance.getExtension(CameraController);
|
|
extension.removeListener(CameraEvent.Stationary, callback);
|
|
};
|
|
onMounted(() => {
|
|
instance.getExtension(CameraController).on(CameraEvent.Stationary, callback);
|
|
});
|
|
onBeforeUnmount(() => {
|
|
removeListener();
|
|
});
|
|
return removeListener;
|
|
}
|
|
export function useViewerCameraControlEndTracker(callback) {
|
|
const {
|
|
viewer: { instance }
|
|
} = useInjectedViewerState();
|
|
const removeListener = () => instance.getExtension(CameraController).removeListener(CameraEvent.Stationary, callback);
|
|
onMounted(() => {
|
|
instance.getExtension(CameraController).on(CameraEvent.Stationary, callback);
|
|
});
|
|
onBeforeUnmount(() => {
|
|
removeListener();
|
|
});
|
|
return removeListener;
|
|
}
|
|
export function useSelectionEvents(params, options) {
|
|
if (false) return;
|
|
const { singleClickCallback, doubleClickCallback } = params;
|
|
const state = options?.state || useInjectedViewerState();
|
|
const {
|
|
viewer: { instance }
|
|
} = state;
|
|
const handleSingleClick = singleClickCallback ? (event) => {
|
|
const firstVisibleSelectionHit = event ? getFirstVisibleSelectionHit(event, state) : null;
|
|
return singleClickCallback(event, { firstVisibleSelectionHit });
|
|
} : void 0;
|
|
const handleDoubleClick = doubleClickCallback ? (event) => {
|
|
const firstVisibleSelectionHit = event ? getFirstVisibleSelectionHit(event, state) : null;
|
|
return doubleClickCallback(event, { firstVisibleSelectionHit });
|
|
} : void 0;
|
|
onMounted(() => {
|
|
if (handleDoubleClick) {
|
|
instance.on(ViewerEvent.ObjectDoubleClicked, handleDoubleClick);
|
|
}
|
|
if (handleSingleClick) {
|
|
instance.on(ViewerEvent.ObjectClicked, handleSingleClick);
|
|
}
|
|
});
|
|
onBeforeUnmount(() => {
|
|
if (handleDoubleClick) {
|
|
instance.removeListener(ViewerEvent.ObjectDoubleClicked, handleDoubleClick);
|
|
}
|
|
if (handleSingleClick) {
|
|
instance.removeListener(ViewerEvent.ObjectClicked, handleSingleClick);
|
|
}
|
|
});
|
|
}
|
|
export function useGetObjectUrl() {
|
|
const apiOrigin = useApiOrigin({ forcePublic: true });
|
|
return (projectId, objectId) => `${apiOrigin}/streams/${projectId}/objects/${objectId}`;
|
|
}
|
|
export function useOnViewerLoadComplete(listener, options) {
|
|
const {
|
|
ui: { loading: isLoading }
|
|
} = useInjectedViewerState();
|
|
const logger = useLogger();
|
|
const { initialOnly, waitForLoadingOver = true } = options || {};
|
|
const hasRun = ref(false);
|
|
const cancel = useViewerEventListener(ViewerEvent.LoadComplete, async () => {
|
|
if (initialOnly && hasRun.value) {
|
|
cancel();
|
|
return;
|
|
}
|
|
try {
|
|
await (waitForLoadingOver ? Promise.race([
|
|
until(isLoading).toBe(false),
|
|
timeoutAt(TIME_MS.second, "Waiting for loading to complete timed out")
|
|
]) : Promise.resolve());
|
|
} catch (e) {
|
|
if (!(e instanceof TimeoutError)) throw e;
|
|
logger.warn(e.message);
|
|
}
|
|
listener({ isInitial: !hasRun.value });
|
|
hasRun.value = true;
|
|
if (initialOnly) cancel();
|
|
});
|
|
}
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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S0FBSyxFQUFFLE9BQU87QUFBQSxJQUN2QjtBQUVBLGFBQVMsRUFBRSxXQUFXLENBQUMsT0FBTyxNQUFNLENBQUM7QUFDckMsV0FBTyxRQUFRO0FBRWYsUUFBSSxZQUFhLFFBQU87QUFBQSxFQUMxQixDQUFDO0FBQ0giLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbInZpZXdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VJbmplY3RlZFZpZXdlclN0YXRlIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cCdcclxuaW1wb3J0IHR5cGUge1xyXG4gIEluaXRpYWxTdGF0ZVdpdGhSZXF1ZXN0QW5kUmVzcG9uc2UsXHJcbiAgSW5qZWN0YWJsZVZpZXdlclN0YXRlXHJcbn0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cCdcclxuaW1wb3J0IHsgQ2FtZXJhRXZlbnQsIFZpZXdlckV2ZW50IH0gZnJvbSAnQHNwZWNrbGUvdmlld2VyJ1xyXG5pbXBvcnQgeyBpc0FycmF5LCB0aHJvdHRsZSB9IGZyb20gJ2xvZGFzaC1lcydcclxuaW1wb3J0IHsgdW50aWwgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7IFRJTUVfTVMsIHRpbWVvdXRBdCwgVGltZW91dEVycm9yIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IE1heWJlQXN5bmMsIE51bGxhYmxlIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBWZWN0b3IzIH0gZnJvbSAndGhyZWUnXHJcbmltcG9ydCB7IGFyZVZlY3RvcnNMb29zZWx5RXF1YWwgfSBmcm9tICd+fi9saWIvdmlld2VyL2hlbHBlcnMvdGhyZWUnXHJcbmltcG9ydCB7XHJcbiAgQ2FtZXJhQ29udHJvbGxlcixcclxuICB0eXBlIFZpZXdlckV2ZW50UGF5bG9hZCxcclxuICB0eXBlIFNlbGVjdGlvbkV2ZW50LFxyXG4gIHR5cGUgVHJlZU5vZGVcclxufSBmcm9tICdAc3BlY2tsZS92aWV3ZXInXHJcbmltcG9ydCB0eXBlIHsgU3BlY2tsZU9iamVjdCB9IGZyb20gJ34vbGliL3ZpZXdlci9oZWxwZXJzL3NjZW5lRXhwbG9yZXInXHJcblxyXG4vLyBOT1RFOiB0aGlzIGlzIGEgcHJlZm9ybWFuY2Ugb3B0aW1pc2F0aW9uIC0gdGhpcyBmdW5jdGlvbiBpcyBob3QsIGFuZCBoYXMgdG8gZG9cclxuLy8gcG90ZW50aWFsbHkgbGFyZ2Ugc2VhcmNoZXMgaWYgbWFueSBlbGVtZW50cyBhcmUgaGlkZGVuL2lzb2xhdGVkLiBXZSBjYWNoZSB0aGVcclxuLy8gcmVzdWx0IGZvciAyNTBtcywgd2hpY2ggcmVwcmVzZW50cyBhIHNpbmdsZSBjbGljay5cclxuLy8gTk9URTogaW4gdGhlIG5lYXIgZnV0dXJlLCB0aGlzIHdpbGwgaG9wZWZ1bGx5IG5vdCBiZSBuZWVkZWQgYXMgd2UnbGwgaGF2ZVxyXG4vLyB2aWV3ZXIgYm91bmQgbW9kdWxlcyB0byBoZWxwIHVzIHdpdGggc2VsZWN0aW9uIGFuZCB2aXNpYmlsaXR5IHN0YXRlIG1hbmFnZW1lbnQuXHJcbmNvbnN0IGNhY2hlVGltZW91dE1zID0gMjUwXHJcbmxldCBoaXRDYWNoZTogTnVsbGFibGU8e1xyXG4gIG5vZGU6IFRyZWVOb2RlXHJcbiAgcG9pbnQ6IFZlY3RvcjNcclxufT4gPSBudWxsXHJcbmxldCBsYXN0Q2FjaGVSZWZyZXNoOiBudW1iZXIgPSBEYXRlLm5vdygpXHJcblxyXG5mdW5jdGlvbiBnZXRGaXJzdFZpc2libGVTZWxlY3Rpb25IaXQoXHJcbiAgeyBoaXRzIH06IFNlbGVjdGlvbkV2ZW50LFxyXG4gIHN0YXRlOiBQaWNrPEluamVjdGFibGVWaWV3ZXJTdGF0ZSwgJ3ZpZXdlcic+XHJcbikge1xyXG4gIGNvbnN0IHtcclxuICAgIHZpZXdlcjoge1xyXG4gICAgICBtZXRhZGF0YTogeyBmaWx0ZXJpbmdTdGF0ZSB9XHJcbiAgICB9XHJcbiAgfSA9IHN0YXRlXHJcblxyXG4gIGlmIChEYXRlLm5vdygpIC0gbGFzdENhY2hlUmVmcmVzaCA8IGNhY2hlVGltZW91dE1zICYmIGhpdENhY2hlKSB7XHJcbiAgICByZXR1cm4gaGl0Q2FjaGVcclxuICB9XHJcbiAgaGl0Q2FjaGUgPSBudWxsXHJcbiAgbGFzdENhY2hlUmVmcmVzaCA9IERhdGUubm93KClcclxuXHJcbiAgY29uc3QgaGFzSGlkZGVuT2JqZWN0cyA9IChmaWx0ZXJpbmdTdGF0ZS52YWx1ZT8uaGlkZGVuT2JqZWN0cyB8fCBbXSkubGVuZ3RoICE9PSAwXHJcbiAgY29uc3QgaGFzSXNvbGF0ZWRPYmplY3RzID1cclxuICAgICEhZmlsdGVyaW5nU3RhdGUudmFsdWU/Lmlzb2xhdGVkT2JqZWN0cyAmJlxyXG4gICAgZmlsdGVyaW5nU3RhdGUudmFsdWU/Lmlzb2xhdGVkT2JqZWN0cy5sZW5ndGggIT09IDBcclxuXHJcbiAgZm9yIChjb25zdCBoaXQgb2YgaGl0cykge1xyXG4gICAgaWYgKGhhc0hpZGRlbk9iamVjdHMpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgICFmaWx0ZXJpbmdTdGF0ZS52YWx1ZT8uaGlkZGVuT2JqZWN0cz8uaW5jbHVkZXMoXHJcbiAgICAgICAgICAoKGhpdC5ub2RlLm1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5yYXcgYXMgU3BlY2tsZU9iamVjdClcclxuICAgICAgICAgICAgLmlkIGFzIHN0cmluZ1xyXG4gICAgICAgIClcclxuICAgICAgKSB7XHJcbiAgICAgICAgaGl0Q2FjaGUgPSBoaXRcclxuICAgICAgICByZXR1cm4gaGl0Q2FjaGVcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChoYXNJc29sYXRlZE9iamVjdHMpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIGZpbHRlcmluZ1N0YXRlLnZhbHVlLmlzb2xhdGVkT2JqZWN0cz8uaW5jbHVkZXMoXHJcbiAgICAgICAgICAoKGhpdC5ub2RlLm1vZGVsIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5yYXcgYXMgU3BlY2tsZU9iamVjdClcclxuICAgICAgICAgICAgLmlkIGFzIHN0cmluZ1xyXG4gICAgICAgIClcclxuICAgICAgKSB7XHJcbiAgICAgICAgaGl0Q2FjaGUgPSBoaXRcclxuICAgICAgICByZXR1cm4gaGl0Q2FjaGVcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaGl0Q2FjaGUgPSBoaXRcclxuICAgICAgcmV0dXJuIGhpdENhY2hlXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBudWxsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VWaWV3ZXJFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBWaWV3ZXJFdmVudD4oXHJcbiAgbmFtZTogSyB8IEtbXSxcclxuICBsaXN0ZW5lcjogKGFyZ3M6IFZpZXdlckV2ZW50UGF5bG9hZFtLXSkgPT4gTWF5YmVBc3luYzx2b2lkPixcclxuICBvcHRpb25zPzogUGFydGlhbDx7XHJcbiAgICBzdGF0ZTogSW5pdGlhbFN0YXRlV2l0aFJlcXVlc3RBbmRSZXNwb25zZVxyXG4gIH0+XHJcbikge1xyXG4gIGNvbnN0IHtcclxuICAgIHZpZXdlcjogeyBpbnN0YW5jZSB9XHJcbiAgfSA9IG9wdGlvbnM/LnN0YXRlIHx8IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIGNvbnN0IG5hbWVzID0gaXNBcnJheShuYW1lKSA/IG5hbWUgOiBbbmFtZV1cclxuXHJcbiAgY29uc3QgdW5tb3VudCA9ICgpID0+IHtcclxuICAgIGZvciAoY29uc3QgbiBvZiBuYW1lcykge1xyXG4gICAgICBpbnN0YW5jZS5yZW1vdmVMaXN0ZW5lcihuLCBsaXN0ZW5lcilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTW91bnRlZCgoKSA9PiB7XHJcbiAgICBmb3IgKGNvbnN0IG4gb2YgbmFtZXMpIHtcclxuICAgICAgaW5zdGFuY2Uub24obiwgbGlzdGVuZXIpXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgb25CZWZvcmVVbm1vdW50KCgpID0+IHtcclxuICAgIHVubW91bnQoKVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB1bm1vdW50XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VWaWV3ZXJDYW1lcmFUcmFja2VyKFxyXG4gIGNhbGxiYWNrOiAoKSA9PiB2b2lkLFxyXG4gIG9wdGlvbnM/OiBQYXJ0aWFsPHtcclxuICAgIHRocm90dGxlV2FpdDogbnVtYmVyXHJcbiAgICBvbmx5SW52b2tlT25NZWFuaW5nZnVsQ2hhbmdlczogYm9vbGVhblxyXG4gIH0+XHJcbik6IHZvaWQge1xyXG4gIGNvbnN0IHtcclxuICAgIHZpZXdlcjogeyBpbnN0YW5jZSB9XHJcbiAgfSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIGNvbnN0IHsgdGhyb3R0bGVXYWl0ID0gNTAsIG9ubHlJbnZva2VPbk1lYW5pbmdmdWxDaGFuZ2VzIH0gPSBvcHRpb25zIHx8IHt9XHJcblxyXG4gIGNvbnN0IGxhc3RQb3MgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxWZWN0b3IzPilcclxuICBjb25zdCBsYXN0VGFyZ2V0ID0gcmVmKG51bGwgYXMgTnVsbGFibGU8VmVjdG9yMz4pXHJcblxyXG4gIGNvbnN0IGNhbGxiYWNrQ2hhbmdlVHJhY2tlcldyYXBwZXIgPSAoY2hhbmdlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgaWYgKCFjaGFuZ2VkKSByZXR1cm5cclxuXHJcbiAgICBpZiAoIW9ubHlJbnZva2VPbk1lYW5pbmdmdWxDaGFuZ2VzKSB7XHJcbiAgICAgIHJldHVybiBjYWxsYmFjaygpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gT25seSBpbnZva2UgY2FsbGJhY2sgaWYgcG9zaXRpb24vdGFyZ2V0IGNoYW5nZWQgaW4gYSBtZWFuaW5nZnVsIHdheVxyXG4gICAgY29uc3QgZXh0ZW5zaW9uOiBDYW1lcmFDb250cm9sbGVyID0gaW5zdGFuY2UuZ2V0RXh0ZW5zaW9uKENhbWVyYUNvbnRyb2xsZXIpXHJcbiAgICBjb25zdCB2aWV3ZXJQb3MgPSBuZXcgVmVjdG9yMygpLmNvcHkoZXh0ZW5zaW9uLnJlbmRlcmluZ0NhbWVyYS5wb3NpdGlvbilcclxuICAgIGNvbnN0IHZpZXdlclRhcmdldCA9IG5ldyBWZWN0b3IzKCkuY29weShleHRlbnNpb24uZ2V0VGFyZ2V0KCkpXHJcblxyXG4gICAgbGV0IG1lYW5pbmdmdWxDaGFuZ2VGb3VuZCA9IGZhbHNlXHJcbiAgICBpZiAoIWxhc3RQb3MudmFsdWUgfHwgIWFyZVZlY3RvcnNMb29zZWx5RXF1YWwobGFzdFBvcy52YWx1ZSwgdmlld2VyUG9zKSkge1xyXG4gICAgICBtZWFuaW5nZnVsQ2hhbmdlRm91bmQgPSB0cnVlXHJcbiAgICB9XHJcbiAgICBpZiAoIWxhc3RUYXJnZXQudmFsdWUgfHwgIWFyZVZlY3RvcnNMb29zZWx5RXF1YWwobGFzdFRhcmdldC52YWx1ZSwgdmlld2VyVGFyZ2V0KSkge1xyXG4gICAgICBtZWFuaW5nZnVsQ2hhbmdlRm91bmQgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1lYW5pbmdmdWxDaGFuZ2VGb3VuZCkge1xyXG4gICAgICBsYXN0UG9zLnZhbHVlID0gdmlld2VyUG9zLmNsb25lKClcclxuICAgICAgbGFzdFRhcmdldC52YWx1ZSA9IHZpZXdlclRhcmdldC5jbG9uZSgpXHJcbiAgICAgIGNhbGxiYWNrKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IGZpbmFsQ2FsbGJhY2sgPSB0aHJvdHRsZVdhaXRcclxuICAgID8gdGhyb3R0bGUoY2FsbGJhY2tDaGFuZ2VUcmFja2VyV3JhcHBlciwgdGhyb3R0bGVXYWl0KVxyXG4gICAgOiBjYWxsYmFja0NoYW5nZVRyYWNrZXJXcmFwcGVyXHJcblxyXG4gIG9uTW91bnRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBleHRlbnNpb24gPSBpbnN0YW5jZS5nZXRFeHRlbnNpb24oQ2FtZXJhQ29udHJvbGxlcilcclxuICAgIGV4dGVuc2lvbi5vbihDYW1lcmFFdmVudC5MYXRlRnJhbWVVcGRhdGUsIGZpbmFsQ2FsbGJhY2spXHJcbiAgfSlcclxuXHJcbiAgb25CZWZvcmVVbm1vdW50KCgpID0+IHtcclxuICAgIGluc3RhbmNlXHJcbiAgICAgIC5nZXRFeHRlbnNpb24oQ2FtZXJhQ29udHJvbGxlcilcclxuICAgICAgLnJlbW92ZUxpc3RlbmVyKENhbWVyYUV2ZW50LkxhdGVGcmFtZVVwZGF0ZSwgZmluYWxDYWxsYmFjaylcclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlVmlld2VyQ2FtZXJhQ29udHJvbFN0YXJ0VHJhY2tlcihjYWxsYmFjazogKCkgPT4gdm9pZCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHZpZXdlcjogeyBpbnN0YW5jZSB9XHJcbiAgfSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIC8vIE1pZ2h0IG5lZWQgZGlmZmVyZW50IGV2ZW50XHJcbiAgY29uc3QgcmVtb3ZlTGlzdGVuZXIgPSAoKSA9PlxyXG4gICAgaW5zdGFuY2VcclxuICAgICAgLmdldEV4dGVuc2lvbihDYW1lcmFDb250cm9sbGVyKVxyXG4gICAgICAucmVtb3ZlTGlzdGVuZXIoQ2FtZXJhRXZlbnQuSW50ZXJhY3Rpb25TdGFydGVkLCBjYWxsYmFjaylcclxuXHJcbiAgb25Nb3VudGVkKCgpID0+IHtcclxuICAgIGluc3RhbmNlLmdldEV4dGVuc2lvbihDYW1lcmFDb250cm9sbGVyKS5vbihDYW1lcmFFdmVudC5JbnRlcmFjdGlvblN0YXJ0ZWQsIGNhbGxiYWNrKVxyXG4gIH0pXHJcblxyXG4gIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XHJcbiAgICByZW1vdmVMaXN0ZW5lcigpXHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIHJlbW92ZUxpc3RlbmVyXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VWaWV3ZXJDYW1lcmFSZXN0VHJhY2tlcihjYWxsYmFjazogKCkgPT4gdm9pZCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHZpZXdlcjogeyBpbnN0YW5jZSB9XHJcbiAgfSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG5cclxuICBjb25zdCByZW1vdmVMaXN0ZW5lciA9ICgpID0+IHtcclxuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGluc3RhbmNlLmdldEV4dGVuc2lvbihDYW1lcmFDb250cm9sbGVyKVxyXG4gICAgZXh0ZW5zaW9uLnJlbW92ZUxpc3RlbmVyKENhbWVyYUV2ZW50LlN0YXRpb25hcnksIGNhbGxiYWNrKVxyXG4gIH1cclxuXHJcbiAgb25Nb3VudGVkKCgpID0+IHtcclxuICAgIGluc3RhbmNlLmdldEV4dGVuc2lvbihDYW1lcmFDb250cm9sbGVyKS5vbihDYW1lcmFFdmVudC5TdGF0aW9uYXJ5LCBjYWxsYmFjaylcclxuICB9KVxyXG5cclxuICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xyXG4gICAgcmVtb3ZlTGlzdGVuZXIoKVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiByZW1vdmVMaXN0ZW5lclxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlVmlld2VyQ2FtZXJhQ29udHJvbEVuZFRyYWNrZXIoY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcclxuICBjb25zdCB7XHJcbiAgICB2aWV3ZXI6IHsgaW5zdGFuY2UgfVxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuICAvLyBNaWdodCBuZWVkIGRpZmZlcmVudCBldmVudFxyXG4gIGNvbnN0IHJlbW92ZUxpc3RlbmVyID0gKCkgPT5cclxuICAgIGluc3RhbmNlXHJcbiAgICAgIC5nZXRFeHRlbnNpb24oQ2FtZXJhQ29udHJvbGxlcilcclxuICAgICAgLnJlbW92ZUxpc3RlbmVyKENhbWVyYUV2ZW50LlN0YXRpb25hcnksIGNhbGxiYWNrKVxyXG5cclxuICBvbk1vdW50ZWQoKCkgPT4ge1xyXG4gICAgaW5zdGFuY2UuZ2V0RXh0ZW5zaW9uKENhbWVyYUNvbnRyb2xsZXIpLm9uKENhbWVyYUV2ZW50LlN0YXRpb25hcnksIGNhbGxiYWNrKVxyXG4gIH0pXHJcblxyXG4gIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB7XHJcbiAgICByZW1vdmVMaXN0ZW5lcigpXHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIHJlbW92ZUxpc3RlbmVyXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VTZWxlY3Rpb25FdmVudHMoXHJcbiAgcGFyYW1zOiB7XHJcbiAgICBzaW5nbGVDbGlja0NhbGxiYWNrPzogKFxyXG4gICAgICBldmVudDogTnVsbGFibGU8U2VsZWN0aW9uRXZlbnQ+LFxyXG4gICAgICBleHRyYTogeyBmaXJzdFZpc2libGVTZWxlY3Rpb25IaXQ6IE51bGxhYmxlPFNlbGVjdGlvbkV2ZW50WydoaXRzJ11bMF0+IH1cclxuICAgICkgPT4gdm9pZFxyXG4gICAgZG91YmxlQ2xpY2tDYWxsYmFjaz86IChcclxuICAgICAgZXZlbnQ6IE51bGxhYmxlPFNlbGVjdGlvbkV2ZW50PixcclxuICAgICAgZXh0cmE6IHsgZmlyc3RWaXNpYmxlU2VsZWN0aW9uSGl0OiBOdWxsYWJsZTxTZWxlY3Rpb25FdmVudFsnaGl0cyddWzBdPiB9XHJcbiAgICApID0+IHZvaWRcclxuICB9LFxyXG4gIG9wdGlvbnM/OiBQYXJ0aWFsPHtcclxuICAgIHN0YXRlOiBJbml0aWFsU3RhdGVXaXRoUmVxdWVzdEFuZFJlc3BvbnNlXHJcbiAgfT5cclxuKSB7XHJcbiAgaWYgKGltcG9ydC5tZXRhLnNlcnZlcikgcmV0dXJuXHJcbiAgY29uc3QgeyBzaW5nbGVDbGlja0NhbGxiYWNrLCBkb3VibGVDbGlja0NhbGxiYWNrIH0gPSBwYXJhbXNcclxuICBjb25zdCBzdGF0ZSA9IG9wdGlvbnM/LnN0YXRlIHx8IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIGNvbnN0IHtcclxuICAgIHZpZXdlcjogeyBpbnN0YW5jZSB9XHJcbiAgfSA9IHN0YXRlXHJcblxyXG4gIGNvbnN0IGhhbmRsZVNpbmdsZUNsaWNrID0gc2luZ2xlQ2xpY2tDYWxsYmFja1xyXG4gICAgPyAoZXZlbnQ6IE51bGxhYmxlPFNlbGVjdGlvbkV2ZW50PikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZVNlbGVjdGlvbkhpdCA9IGV2ZW50XHJcbiAgICAgICAgICA/IGdldEZpcnN0VmlzaWJsZVNlbGVjdGlvbkhpdChldmVudCwgc3RhdGUpXHJcbiAgICAgICAgICA6IG51bGxcclxuICAgICAgICByZXR1cm4gc2luZ2xlQ2xpY2tDYWxsYmFjayhldmVudCwgeyBmaXJzdFZpc2libGVTZWxlY3Rpb25IaXQgfSlcclxuICAgICAgfVxyXG4gICAgOiB1bmRlZmluZWRcclxuICBjb25zdCBoYW5kbGVEb3VibGVDbGljayA9IGRvdWJsZUNsaWNrQ2FsbGJhY2tcclxuICAgID8gKGV2ZW50OiBOdWxsYWJsZTxTZWxlY3Rpb25FdmVudD4pID0+IHtcclxuICAgICAgICBjb25zdCBmaXJzdFZpc2libGVTZWxlY3Rpb25IaXQgPSBldmVudFxyXG4gICAgICAgICAgPyBnZXRGaXJzdFZpc2libGVTZWxlY3Rpb25IaXQoZXZlbnQsIHN0YXRlKVxyXG4gICAgICAgICAgOiBudWxsXHJcbiAgICAgICAgcmV0dXJuIGRvdWJsZUNsaWNrQ2FsbGJhY2soZXZlbnQsIHsgZmlyc3RWaXNpYmxlU2VsZWN0aW9uSGl0IH0pXHJcbiAgICAgIH1cclxuICAgIDogdW5kZWZpbmVkXHJcblxyXG4gIG9uTW91bnRlZCgoKSA9PiB7XHJcbiAgICBpZiAoaGFuZGxlRG91YmxlQ2xpY2spIHtcclxuICAgICAgaW5zdGFuY2Uub24oVmlld2VyRXZlbnQuT2JqZWN0RG91YmxlQ2xpY2tlZCwgaGFuZGxlRG91YmxlQ2xpY2spXHJcbiAgICB9XHJcbiAgICBpZiAoaGFuZGxlU2luZ2xlQ2xpY2spIHtcclxuICAgICAgaW5zdGFuY2Uub24oVmlld2VyRXZlbnQuT2JqZWN0Q2xpY2tlZCwgaGFuZGxlU2luZ2xlQ2xpY2spXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgb25CZWZvcmVVbm1vdW50KCgpID0+IHtcclxuICAgIGlmIChoYW5kbGVEb3VibGVDbGljaykge1xyXG4gICAgICBpbnN0YW5jZS5yZW1vdmVMaXN0ZW5lcihWaWV3ZXJFdmVudC5PYmplY3REb3VibGVDbGlja2VkLCBoYW5kbGVEb3VibGVDbGljaylcclxuICAgIH1cclxuICAgIGlmIChoYW5kbGVTaW5nbGVDbGljaykge1xyXG4gICAgICBpbnN0YW5jZS5yZW1vdmVMaXN0ZW5lcihWaWV3ZXJFdmVudC5PYmplY3RDbGlja2VkLCBoYW5kbGVTaW5nbGVDbGljaylcclxuICAgIH1cclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlR2V0T2JqZWN0VXJsKCkge1xuICBjb25zdCBhcGlPcmlnaW4gPSB1c2VBcGlPcmlnaW4oeyBmb3JjZVB1YmxpYzogdHJ1ZSB9KVxuICByZXR1cm4gKHByb2plY3RJZDogc3RyaW5nLCBvYmplY3RJZDogc3RyaW5nKSA9PlxuICAgIGAke2FwaU9yaWdpbn0vc3RyZWFtcy8ke3Byb2plY3RJZH0vb2JqZWN0cy8ke29iamVjdElkfWBcbn1cblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlT25WaWV3ZXJMb2FkQ29tcGxldGUoXHJcbiAgbGlzdGVuZXI6IChwYXJhbXM6IHsgaXNJbml0aWFsOiBib29sZWFuIH0pID0+IE1heWJlQXN5bmM8dm9pZD4sXHJcbiAgb3B0aW9ucz86IFBhcnRpYWw8e1xyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRvIG9ubHkgaW52b2tlIHRoZSBsaXN0ZW5lciBvbmNlIG9uIHRoZSB2ZXJ5IGZpcnN0IExvYWRDb21wbGV0ZSBldmVudC4gRGVmYXVsdDogZmFsc2VcclxuICAgICAqL1xyXG4gICAgaW5pdGlhbE9ubHk6IGJvb2xlYW5cclxuICAgIC8qKlxyXG4gICAgICogSWYgdHJ1ZSwgd2lsbCB0cmlnZ2VyIHRoZSBsaXN0ZW5lciBhZnRlciB0aGUgbmV4dCBsb2FkaW5nPWZhbHNlIGV2ZW50IHRoYXQgY29tZXMgYWZ0ZXIgTG9hZENvbXBsZXRlLiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgKi9cclxuICAgIHdhaXRGb3JMb2FkaW5nT3ZlcjogYm9vbGVhblxyXG4gIH0+XHJcbikge1xyXG4gIGNvbnN0IHtcclxuICAgIHVpOiB7IGxvYWRpbmc6IGlzTG9hZGluZyB9XHJcbiAgfSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIGNvbnN0IGxvZ2dlciA9IHVzZUxvZ2dlcigpXHJcbiAgY29uc3QgeyBpbml0aWFsT25seSwgd2FpdEZvckxvYWRpbmdPdmVyID0gdHJ1ZSB9ID0gb3B0aW9ucyB8fCB7fVxyXG5cclxuICBjb25zdCBoYXNSdW4gPSByZWYoZmFsc2UpXHJcblxyXG4gIGNvbnN0IGNhbmNlbCA9IHVzZVZpZXdlckV2ZW50TGlzdGVuZXIoVmlld2VyRXZlbnQuTG9hZENvbXBsZXRlLCBhc3luYyAoKSA9PiB7XHJcbiAgICBpZiAoaW5pdGlhbE9ubHkgJiYgaGFzUnVuLnZhbHVlKSB7XHJcbiAgICAgIGNhbmNlbCgpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0ICh3YWl0Rm9yTG9hZGluZ092ZXJcclxuICAgICAgICA/IFByb21pc2UucmFjZShbXHJcbiAgICAgICAgICAgIHVudGlsKGlzTG9hZGluZykudG9CZShmYWxzZSksXHJcbiAgICAgICAgICAgIHRpbWVvdXRBdChUSU1FX01TLnNlY29uZCwgJ1dhaXRpbmcgZm9yIGxvYWRpbmcgdG8gY29tcGxldGUgdGltZWQgb3V0JylcclxuICAgICAgICAgIF0pXHJcbiAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKSlcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikpIHRocm93IGVcclxuICAgICAgbG9nZ2VyLndhcm4oZS5tZXNzYWdlKVxyXG4gICAgfVxyXG5cclxuICAgIGxpc3RlbmVyKHsgaXNJbml0aWFsOiAhaGFzUnVuLnZhbHVlIH0pXHJcbiAgICBoYXNSdW4udmFsdWUgPSB0cnVlXHJcblxyXG4gICAgaWYgKGluaXRpYWxPbmx5KSBjYW5jZWwoKVxyXG4gIH0pXHJcbn1cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvdmlld2VyLnRzIn0= |