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

118 lines
21 KiB
Plaintext

import { err, ok } from "/_nuxt/node_modules/.cache/vite/client/deps/true-myth_result.js?v=e4f18c29";
import { ProjectNotEnoughPermissionsError, SavedViewGroupNotFoundError, SavedViewNoAccessError, SavedViewNotFoundError, UngroupedSavedViewGroupLockError } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/authz/domain/authErrors.js";
import { SavedViewVisibility } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/authz/domain/savedViews/types.js";
import { ensureCanUseProjectWorkspacePlanFeatureFragment, ensureImplicitProjectMemberWithWriteAccessFragment } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/authz/fragments/projects.js";
import { Roles } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/core/constants.js";
import { WorkspacePlanFeatures } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/workspaces/index.js";
import { isUngroupedGroup } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/saved-views/index.js";
import { StringEnum, throwUncoveredError } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/core/index.js";
export const WriteTypes = StringEnum([
'UpdateGeneral',
'MoveView',
'EditTitle',
'EditDescription',
'SetHomeView'
]);
/**
* Ensure the user can access the view
*/
export const ensureCanAccessSavedViewFragment = (loaders) => async ({ userId, projectId, savedViewId, access, allowNonExistent }) => {
const canUseSavedViews = await ensureCanUseProjectWorkspacePlanFeatureFragment(loaders)({
projectId,
feature: WorkspacePlanFeatures.SavedViews
});
if (canUseSavedViews.isErr)
return err(canUseSavedViews.error);
const savedView = await loaders.getSavedView({ projectId, savedViewId });
if (!savedView) {
if (allowNonExistent)
return ok();
return err(new SavedViewNotFoundError());
}
const isPublic = savedView.visibility === SavedViewVisibility.public;
const isAuthor = savedView.authorId === userId;
// Validate read access
if (access === 'read') {
if (isAuthor || isPublic) {
return ok();
}
else {
return err(new SavedViewNoAccessError({
message: 'You do not have permission to read this saved view.'
}));
}
}
// Validate write access
// Check for write access to project first
const ensuredWriteAccess = await ensureImplicitProjectMemberWithWriteAccessFragment(loaders)({
userId,
projectId
});
if (ensuredWriteAccess.isErr) {
if (ensuredWriteAccess.error.code === ProjectNotEnoughPermissionsError.code)
return err(new ProjectNotEnoughPermissionsError({
message: "Your role on this project doesn't give you permission to update views."
}));
return err(ensuredWriteAccess.error);
}
if (isAuthor) {
// authors can write whatever
return ok();
}
// Non-author project writers can make specific changes
switch (access) {
case WriteTypes.MoveView:
case WriteTypes.EditTitle:
case WriteTypes.EditDescription:
case WriteTypes.SetHomeView:
return ok();
case WriteTypes.UpdateGeneral:
return err(new SavedViewNoAccessError({
message: 'You do not have permission to edit the view in this way'
}));
default:
throwUncoveredError(access);
}
};
/**
* Ensure the user can access the view group
*/
export const ensureCanAccessSavedViewGroupFragment = (loaders) => async ({ userId, projectId, savedViewGroupId, access }) => {
const canUseSavedViews = await ensureCanUseProjectWorkspacePlanFeatureFragment(loaders)({
projectId,
feature: WorkspacePlanFeatures.SavedViews
});
if (canUseSavedViews.isErr)
return err(canUseSavedViews.error);
const savedViewGroup = await loaders.getSavedViewGroup({
projectId,
groupId: savedViewGroupId
});
if (!savedViewGroup)
return err(new SavedViewGroupNotFoundError());
if (access === 'read') {
return ok(); // read access available to everyone who has access to project
}
// Prevent default group updates (as it doesnt exist)
if (isUngroupedGroup(savedViewGroup.id)) {
return err(new UngroupedSavedViewGroupLockError());
}
// groups have no visibility (yet), so authors AND project owners can mutate
const isAuthor = savedViewGroup.authorId === userId;
const expectedProjectRole = isAuthor ? Roles.Stream.Contributor : Roles.Stream.Owner;
const ensuredWriteAccess = await ensureImplicitProjectMemberWithWriteAccessFragment(loaders)({
userId,
projectId,
role: expectedProjectRole
});
if (ensuredWriteAccess.isErr) {
if (ensuredWriteAccess.error.code === ProjectNotEnoughPermissionsError.code)
return err(new ProjectNotEnoughPermissionsError({
message: "Your role on this project doesn't give you permission to update view groups."
}));
return err(ensuredWriteAccess.error);
}
return ok();
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWRWaWV3cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hdXRoei9mcmFnbWVudHMvc2F2ZWRWaWV3cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzFDLE9BQU8sRUFFTCxnQ0FBZ0MsRUFFaEMsMkJBQTJCLEVBQzNCLHNCQUFzQixFQUN0QixzQkFBc0IsRUFJdEIsZ0NBQWdDLEVBT2pDLE1BQU0seUJBQXlCLENBQUE7QUFTaEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFDbkUsT0FBTyxFQUNMLCtDQUErQyxFQUMvQyxrREFBa0QsRUFDbkQsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQW9CLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFdkYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUNuQyxlQUFlO0lBQ2YsVUFBVTtJQUNWLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsYUFBYTtDQUNkLENBQUMsQ0FBQTtBQUdGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBc0MzQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ1osS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRTtJQUNyRSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sK0NBQStDLENBQzVFLE9BQU8sQ0FDUixDQUFDO1FBQ0EsU0FBUztR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LEVBQUUsQ0FBQTtBQUNiLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVyciwgb2sgfSBmcm9tICd0cnVlLW15dGgvcmVzdWx0J1xyXG5pbXBvcnQge1xyXG4gIFByb2plY3ROb0FjY2Vzc0Vycm9yLFxyXG4gIFByb2plY3ROb3RFbm91Z2hQZXJtaXNzaW9uc0Vycm9yLFxyXG4gIFByb2plY3ROb3RGb3VuZEVycm9yLFxyXG4gIFNhdmVkVmlld0dyb3VwTm90Rm91bmRFcnJvcixcclxuICBTYXZlZFZpZXdOb0FjY2Vzc0Vycm9yLFxyXG4gIFNhdmVkVmlld05vdEZvdW5kRXJyb3IsXHJcbiAgU2VydmVyTm9BY2Nlc3NFcnJvcixcclxuICBTZXJ2ZXJOb1Nlc3Npb25FcnJvcixcclxuICBTZXJ2ZXJOb3RFbm91Z2hQZXJtaXNzaW9uc0Vycm9yLFxyXG4gIFVuZ3JvdXBlZFNhdmVkVmlld0dyb3VwTG9ja0Vycm9yLFxyXG4gIFdvcmtzcGFjZU5vQWNjZXNzRXJyb3IsXHJcbiAgV29ya3NwYWNlTm90RW5vdWdoUGVybWlzc2lvbnNFcnJvcixcclxuICBXb3Jrc3BhY2VQbGFuTm9GZWF0dXJlQWNjZXNzRXJyb3IsXHJcbiAgV29ya3NwYWNlUmVhZE9ubHlFcnJvcixcclxuICBXb3Jrc3BhY2VzTm90RW5hYmxlZEVycm9yLFxyXG4gIFdvcmtzcGFjZVNzb1Nlc3Npb25Ob0FjY2Vzc0Vycm9yXHJcbn0gZnJvbSAnLi4vZG9tYWluL2F1dGhFcnJvcnMuanMnXHJcbmltcG9ydCB7XHJcbiAgTWF5YmVVc2VyQ29udGV4dCxcclxuICBQcm9qZWN0Q29udGV4dCxcclxuICBTYXZlZFZpZXdDb250ZXh0LFxyXG4gIFNhdmVkVmlld0dyb3VwQ29udGV4dFxyXG59IGZyb20gJy4uL2RvbWFpbi9jb250ZXh0LmpzJ1xyXG5pbXBvcnQgeyBMb2FkZXJzIH0gZnJvbSAnLi4vZG9tYWluL2xvYWRlcnMuanMnXHJcbmltcG9ydCB7IEF1dGhQb2xpY3lFbnN1cmVGcmFnbWVudCB9IGZyb20gJy4uL2RvbWFpbi9wb2xpY2llcy5qcydcclxuaW1wb3J0IHsgU2F2ZWRWaWV3VmlzaWJpbGl0eSB9IGZyb20gJy4uL2RvbWFpbi9zYXZlZFZpZXdzL3R5cGVzLmpzJ1xyXG5pbXBvcnQge1xyXG4gIGVuc3VyZUNhblVzZVByb2plY3RXb3Jrc3BhY2VQbGFuRmVhdHVyZUZyYWdtZW50LFxyXG4gIGVuc3VyZUltcGxpY2l0UHJvamVjdE1lbWJlcldpdGhXcml0ZUFjY2Vzc0ZyYWdtZW50XHJcbn0gZnJvbSAnLi9wcm9qZWN0cy5qcydcclxuaW1wb3J0IHsgUm9sZXMgfSBmcm9tICcuLi8uLi9jb3JlL2NvbnN0YW50cy5qcydcclxuaW1wb3J0IHsgV29ya3NwYWNlUGxhbkZlYXR1cmVzIH0gZnJvbSAnLi4vLi4vd29ya3NwYWNlcy9pbmRleC5qcydcclxuaW1wb3J0IHsgaXNVbmdyb3VwZWRHcm91cCB9IGZyb20gJy4uLy4uL3NhdmVkLXZpZXdzL2luZGV4LmpzJ1xyXG5pbXBvcnQgeyBTdHJpbmdFbnVtLCBTdHJpbmdFbnVtVmFsdWVzLCB0aHJvd1VuY292ZXJlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29yZS9pbmRleC5qcydcclxuXHJcbmV4cG9ydCBjb25zdCBXcml0ZVR5cGVzID0gU3RyaW5nRW51bShbXHJcbiAgJ1VwZGF0ZUdlbmVyYWwnLFxyXG4gICdNb3ZlVmlldycsXHJcbiAgJ0VkaXRUaXRsZScsXHJcbiAgJ0VkaXREZXNjcmlwdGlvbicsXHJcbiAgJ1NldEhvbWVWaWV3J1xyXG5dKVxyXG5leHBvcnQgdHlwZSBXcml0ZVR5cGVzID0gU3RyaW5nRW51bVZhbHVlczx0eXBlb2YgV3JpdGVUeXBlcz5cclxuXHJcbi8qKlxyXG4gKiBFbnN1cmUgdGhlIHVzZXIgY2FuIGFjY2VzcyB0aGUgdmlld1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGVuc3VyZUNhbkFjY2Vzc1NhdmVkVmlld0ZyYWdtZW50OiBBdXRoUG9saWN5RW5zdXJlRnJhZ21lbnQ8XHJcbiAgfCB0eXBlb2YgTG9hZGVycy5nZXRTYXZlZFZpZXdcclxuICB8IHR5cGVvZiBMb2FkZXJzLmdldFByb2plY3RcclxuICB8IHR5cGVvZiBMb2FkZXJzLmdldEVudlxyXG4gIHwgdHlwZW9mIExvYWRlcnMuZ2V0U2VydmVyUm9sZVxyXG4gIHwgdHlwZW9mIExvYWRlcnMuZ2V0V29ya3NwYWNlUm9sZVxyXG4gIHwgdHlwZW9mIExvYWRlcnMuZ2V0V29ya3NwYWNlXHJcbiAgfCB0eXBlb2YgTG9hZGVycy5nZXRXb3Jrc3BhY2VQbGFuXHJcbiAgfCB0eXBlb2YgTG9hZGVycy5nZXRXb3Jrc3BhY2VTc29Qcm92aWRlclxyXG4gIHwgdHlwZW9mIExvYWRlcnMuZ2V0V29ya3NwYWNlU3NvU2Vzc2lvblxyXG4gIHwgdHlwZW9mIExvYWRlcnMuZ2V0QWRtaW5PdmVycmlkZUVuYWJsZWRcclxuICB8IHR5cGVvZiBMb2FkZXJzLmdldFByb2plY3RSb2xlLFxyXG4gIE1heWJlVXNlckNvbnRleHQgJlxyXG4gICAgUHJvamVjdENvbnRleHQgJlxyXG4gICAgU2F2ZWRWaWV3Q29udGV4dCAmIHtcclxuICAgICAgYWNjZXNzOiAncmVhZCcgfCBXcml0ZVR5cGVzXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBJbiBzb21lIGNhc2VzIHdlIHdhbnQgdG8ganVzdCBpZ25vcmUgYSB2aWV3IGJlaW5nIG5vbi1leGlzdGFudCwgaW5zdGVhZCBvZiB0aHJvd2luZ1xyXG4gICAgICAgKi9cclxuICAgICAgYWxsb3dOb25FeGlzdGVudD86IGJvb2xlYW5cclxuICAgIH0sXHJcbiAgSW5zdGFuY2VUeXBlPFxyXG4gICAgfCB0eXBlb2YgU2F2ZWRWaWV3Tm90Rm91bmRFcnJvclxyXG4gICAgfCB0eXBlb2YgU2F2ZWRWaWV3Tm9BY2Nlc3NFcnJvclxyXG4gICAgfCB0eXBlb2YgUHJvamVjdE5vdEZvdW5kRXJyb3JcclxuICAgIHwgdHlwZW9mIFNlcnZlck5vQWNjZXNzRXJyb3JcclxuICAgIHwgdHlwZW9mIFNlcnZlck5vU2Vzc2lvbkVycm9yXHJcbiAgICB8IHR5cGVvZiBQcm9qZWN0Tm9BY2Nlc3NFcnJvclxyXG4gICAgfCB0eXBlb2YgV29ya3NwYWNlTm9BY2Nlc3NFcnJvclxyXG4gICAgfCB0eXBlb2YgV29ya3NwYWNlU3NvU2Vzc2lvbk5vQWNjZXNzRXJyb3JcclxuICAgIHwgdHlwZW9mIFNlcnZlck5vdEVub3VnaFBlcm1pc3Npb25zRXJyb3JcclxuICAgIHwgdHlwZW9mIFByb2plY3ROb3RFbm91Z2hQZXJtaXNzaW9uc0Vycm9yXHJcbiAgICB8IHR5cGVvZiBXb3Jrc3BhY2VOb3RFbm91Z2hQZXJtaXNzaW9uc0Vycm9yXHJcbiAgICB8IHR5cGVvZiBXb3Jrc3BhY2VzTm90RW5hYmxlZEVycm9yXHJcbiAgICB8IHR5cGVvZiBXb3Jrc3BhY2VSZWFkT25seUVycm9yXHJcbiAgICB8IHR5cGVvZiBXb3Jrc3BhY2VQbGFuTm9GZWF0dXJlQWNjZXNzRXJyb3JcclxuICA+XHJcbj4gPVxyXG4gIChsb2FkZXJzKSA9PlxyXG4gIGFzeW5jICh7IHVzZXJJZCwgcHJvamVjdElkLCBzYXZlZFZpZXdJZCwgYWNjZXNzLCBhbGxvd05vbkV4aXN0ZW50IH0pID0+IHtcclxuICAgIGNvbnN0IGNhblVzZVNhdmVkVmlld3MgPSBhd2FpdCBlbnN1cmVDYW5Vc2VQcm9qZWN0V29ya3NwYWNlUGxhbkZlYXR1cmVGcmFnbWVudChcclxuICAgICAgbG9hZGVyc1xyXG4gICAgKSh7XHJcbiAgICAgIHByb2plY3RJZCxcclxuICAgICAgZmVhdHVyZTogV29ya3NwYWNlUGxhbkZlYXR1cmVzLlNhdmVkVmlld3NcclxuICAgIH0pXHJcbiAgICBpZiAoY2FuVXNlU2F2ZWRWaWV3cy5pc0VycikgcmV0dXJuIGVycihjYW5Vc2VTYXZlZFZpZXdzLmVycm9yKVxyXG5cclxuICAgIGNvbnN0IHNhdmVkVmlldyA9IGF3YWl0IGxvYWRlcnMuZ2V0U2F2ZWRWaWV3KHsgcHJvamVjdElkLCBzYXZlZFZpZXdJZCB9KVxyXG4gICAgaWYgKCFzYXZlZFZpZXcpIHtcclxuICAgICAgaWYgKGFsbG93Tm9uRXhpc3RlbnQpIHJldHVybiBvaygpXHJcbiAgICAgIHJldHVybiBlcnIobmV3IFNhdmVkVmlld05vdEZvdW5kRXJyb3IoKSlcclxuICAgIH1cclxuICAgIGNvbnN0IGlzUHVibGljID0gc2F2ZWRWaWV3LnZpc2liaWxpdHkgPT09IFNhdmVkVmlld1Zpc2liaWxpdHkucHVibGljXHJcbiAgICBjb25zdCBpc0F1dGhvciA9IHNhdmVkVmlldy5hdXRob3JJZCA9PT0gdXNlcklkXHJcblxyXG4gICAgLy8gVmFsaWRhdGUgcmVhZCBhY2Nlc3NcclxuICAgIGlmIChhY2Nlc3MgPT09ICdyZWFkJykge1xyXG4gICAgICBpZiAoaXNBdXRob3IgfHwgaXNQdWJsaWMpIHtcclxuICAgICAgICByZXR1cm4gb2soKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBlcnIoXHJcbiAgICAgICAgICBuZXcgU2F2ZWRWaWV3Tm9BY2Nlc3NFcnJvcih7XHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byByZWFkIHRoaXMgc2F2ZWQgdmlldy4nXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFZhbGlkYXRlIHdyaXRlIGFjY2Vzc1xyXG4gICAgLy8gQ2hlY2sgZm9yIHdyaXRlIGFjY2VzcyB0byBwcm9qZWN0IGZpcnN0XHJcbiAgICBjb25zdCBlbnN1cmVkV3JpdGVBY2Nlc3MgPSBhd2FpdCBlbnN1cmVJbXBsaWNpdFByb2plY3RNZW1iZXJXaXRoV3JpdGVBY2Nlc3NGcmFnbWVudChcclxuICAgICAgbG9hZGVyc1xyXG4gICAgKSh7XHJcbiAgICAgIHVzZXJJZCxcclxuICAgICAgcHJvamVjdElkXHJcbiAgICB9KVxyXG4gICAgaWYgKGVuc3VyZWRXcml0ZUFjY2Vzcy5pc0Vycikge1xyXG4gICAgICBpZiAoZW5zdXJlZFdyaXRlQWNjZXNzLmVycm9yLmNvZGUgPT09IFByb2plY3ROb3RFbm91Z2hQZXJtaXNzaW9uc0Vycm9yLmNvZGUpXHJcbiAgICAgICAgcmV0dXJuIGVycihcclxuICAgICAgICAgIG5ldyBQcm9qZWN0Tm90RW5vdWdoUGVybWlzc2lvbnNFcnJvcih7XHJcbiAgICAgICAgICAgIG1lc3NhZ2U6XHJcbiAgICAgICAgICAgICAgXCJZb3VyIHJvbGUgb24gdGhpcyBwcm9qZWN0IGRvZXNuJ3QgZ2l2ZSB5b3UgcGVybWlzc2lvbiB0byB1cGRhdGUgdmlld3MuXCJcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKVxyXG4gICAgICByZXR1cm4gZXJyKGVuc3VyZWRXcml0ZUFjY2Vzcy5lcnJvcilcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNBdXRob3IpIHtcclxuICAgICAgLy8gYXV0aG9ycyBjYW4gd3JpdGUgd2hhdGV2ZXJcclxuICAgICAgcmV0dXJuIG9rKClcclxuICAgIH1cclxuXHJcbiAgICAvLyBOb24tYXV0aG9yIHByb2plY3Qgd3JpdGVycyBjYW4gbWFrZSBzcGVjaWZpYyBjaGFuZ2VzXHJcbiAgICBzd2l0Y2ggKGFjY2Vzcykge1xyXG4gICAgICBjYXNlIFdyaXRlVHlwZXMuTW92ZVZpZXc6XHJcbiAgICAgIGNhc2UgV3JpdGVUeXBlcy5FZGl0VGl0bGU6XHJcbiAgICAgIGNhc2UgV3JpdGVUeXBlcy5FZGl0RGVzY3JpcHRpb246XHJcbiAgICAgIGNhc2UgV3JpdGVUeXBlcy5TZXRIb21lVmlldzpcclxuICAgICAgICByZXR1cm4gb2soKVxyXG4gICAgICBjYXNlIFdyaXRlVHlwZXMuVXBkYXRlR2VuZXJhbDpcclxuICAgICAgICByZXR1cm4gZXJyKFxyXG4gICAgICAgICAgbmV3IFNhdmVkVmlld05vQWNjZXNzRXJyb3Ioe1xyXG4gICAgICAgICAgICBtZXNzYWdlOiAnWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gZWRpdCB0aGUgdmlldyBpbiB0aGlzIHdheSdcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93VW5jb3ZlcmVkRXJyb3IoYWNjZXNzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8qKlxyXG4gKiBFbnN1cmUgdGhlIHVzZXIgY2FuIGFjY2VzcyB0aGUgdmlldyBncm91cFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGVuc3VyZUNhbkFjY2Vzc1NhdmVkVmlld0dyb3VwRnJhZ21lbnQ6IEF1dGhQb2xpY3lFbnN1cmVGcmFnbWVudDxcclxuICB8IHR5cGVvZiBMb2FkZXJzLmdldFNhdmVkVmlld0dyb3VwXHJcbiAgfCB0eXBlb2YgTG9hZGVycy5nZXRQcm9qZWN0XHJcbiAgfCB0eXBlb2YgTG9hZGVycy5nZXRFbnZcclxuICB8IHR5cGVvZiBMb2FkZXJzLmdldFNlcnZlclJvbGVcclxuICB8IHR5cGVvZiBMb2FkZXJzLmdldFdvcmtzcGFjZVJvbGVcclxuICB8IHR5cGVvZiBMb2FkZXJzLmdldFdvcmtzcGFjZVxyXG4gIHwgdHlwZW9mIExvYWRlcnMuZ2V0V29ya3NwYWNlUGxhblxyXG4gIHwgdHlwZW9mIExvYWRlcnMuZ2V0V29ya3NwYWNlU3NvUHJvdmlkZXJcclxuICB8IHR5cGVvZiBMb2FkZXJzLmdldFdvcmtzcGFjZVNzb1Nlc3Npb25cclxuICB8IHR5cGVvZiBMb2FkZXJzLmdldFByb2plY3RSb2xlLFxyXG4gIE1heWJlVXNlckNvbnRleHQgJlxyXG4gICAgUHJvamVjdENvbnRleHQgJlxyXG4gICAgU2F2ZWRWaWV3R3JvdXBDb250ZXh0ICYge1xyXG4gICAgICBhY2Nlc3M6ICdyZWFkJyB8ICd3cml0ZSdcclxuICAgIH0sXHJcbiAgSW5zdGFuY2VUeXBlPFxyXG4gICAgfCB0eXBlb2YgU2F2ZWRWaWV3R3JvdXBOb3RGb3VuZEVycm9yXHJcbiAgICB8IHR5cGVvZiBQcm9qZWN0Tm90Rm91bmRFcnJvclxyXG4gICAgfCB0eXBlb2YgU2VydmVyTm9BY2Nlc3NFcnJvclxyXG4gICAgfCB0eXBlb2YgU2VydmVyTm9TZXNzaW9uRXJyb3JcclxuICAgIHwgdHlwZW9mIFByb2plY3ROb0FjY2Vzc0Vycm9yXHJcbiAgICB8IHR5cGVvZiBXb3Jrc3BhY2VOb0FjY2Vzc0Vycm9yXHJcbiAgICB8IHR5cGVvZiBXb3Jrc3BhY2VTc29TZXNzaW9uTm9BY2Nlc3NFcnJvclxyXG4gICAgfCB0eXBlb2YgU2VydmVyTm90RW5vdWdoUGVybWlzc2lvbnNFcnJvclxyXG4gICAgfCB0eXBlb2YgUHJvamVjdE5vdEVub3VnaFBlcm1pc3Npb25zRXJyb3JcclxuICAgIHwgdHlwZW9mIFdvcmtzcGFjZU5vdEVub3VnaFBlcm1pc3Npb25zRXJyb3JcclxuICAgIHwgdHlwZW9mIFdvcmtzcGFjZXNOb3RFbmFibGVkRXJyb3JcclxuICAgIHwgdHlwZW9mIFdvcmtzcGFjZVJlYWRPbmx5RXJyb3JcclxuICAgIHwgdHlwZW9mIFdvcmtzcGFjZVBsYW5Ob0ZlYXR1cmVBY2Nlc3NFcnJvclxyXG4gICAgfCB0eXBlb2YgVW5ncm91cGVkU2F2ZWRWaWV3R3JvdXBMb2NrRXJyb3JcclxuICA+XHJcbj4gPVxyXG4gIChsb2FkZXJzKSA9PlxyXG4gIGFzeW5jICh7IHVzZXJJZCwgcHJvamVjdElkLCBzYXZlZFZpZXdHcm91cElkLCBhY2Nlc3MgfSkgPT4ge1xyXG4gICAgY29uc3QgY2FuVXNlU2F2ZWRWaWV3cyA9IGF3YWl0IGVuc3VyZUNhblVzZVByb2plY3RXb3Jrc3BhY2VQbGFuRmVhdHVyZUZyYWdtZW50KFxyXG4gICAgICBsb2FkZXJzXHJcbiAgICApKHtcclxuICAgICAgcHJvamVjdElkLFxyXG4gICAgICBmZWF0dXJlOiBXb3Jrc3BhY2VQbGFuRmVhdHVyZXMuU2F2ZWRWaWV3c1xyXG4gICAgfSlcclxuICAgIGlmIChjYW5Vc2VTYXZlZFZpZXdzLmlzRXJyKSByZXR1cm4gZXJyKGNhblVzZVNhdmVkVmlld3MuZXJyb3IpXHJcblxyXG4gICAgY29uc3Qgc2F2ZWRWaWV3R3JvdXAgPSBhd2FpdCBsb2FkZXJzLmdldFNhdmVkVmlld0dyb3VwKHtcclxuICAgICAgcHJvamVjdElkLFxyXG4gICAgICBncm91cElkOiBzYXZlZFZpZXdHcm91cElkXHJcbiAgICB9KVxyXG4gICAgaWYgKCFzYXZlZFZpZXdHcm91cCkgcmV0dXJuIGVycihuZXcgU2F2ZWRWaWV3R3JvdXBOb3RGb3VuZEVycm9yKCkpXHJcblxyXG4gICAgaWYgKGFjY2VzcyA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgIHJldHVybiBvaygpIC8vIHJlYWQgYWNjZXNzIGF2YWlsYWJsZSB0byBldmVyeW9uZSB3aG8gaGFzIGFjY2VzcyB0byBwcm9qZWN0XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJldmVudCBkZWZhdWx0IGdyb3VwIHVwZGF0ZXMgKGFzIGl0IGRvZXNudCBleGlzdClcclxuICAgIGlmIChpc1VuZ3JvdXBlZEdyb3VwKHNhdmVkVmlld0dyb3VwLmlkKSkge1xyXG4gICAgICByZXR1cm4gZXJyKG5ldyBVbmdyb3VwZWRTYXZlZFZpZXdHcm91cExvY2tFcnJvcigpKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGdyb3VwcyBoYXZlIG5vIHZpc2liaWxpdHkgKHlldCksIHNvIGF1dGhvcnMgQU5EIHByb2plY3Qgb3duZXJzIGNhbiBtdXRhdGVcclxuICAgIGNvbnN0IGlzQXV0aG9yID0gc2F2ZWRWaWV3R3JvdXAuYXV0aG9ySWQgPT09IHVzZXJJZFxyXG4gICAgY29uc3QgZXhwZWN0ZWRQcm9qZWN0Um9sZSA9IGlzQXV0aG9yID8gUm9sZXMuU3RyZWFtLkNvbnRyaWJ1dG9yIDogUm9sZXMuU3RyZWFtLk93bmVyXHJcblxyXG4gICAgY29uc3QgZW5zdXJlZFdyaXRlQWNjZXNzID0gYXdhaXQgZW5zdXJlSW1wbGljaXRQcm9qZWN0TWVtYmVyV2l0aFdyaXRlQWNjZXNzRnJhZ21lbnQoXHJcbiAgICAgIGxvYWRlcnNcclxuICAgICkoe1xyXG4gICAgICB1c2VySWQsXHJcbiAgICAgIHByb2plY3RJZCxcclxuICAgICAgcm9sZTogZXhwZWN0ZWRQcm9qZWN0Um9sZVxyXG4gICAgfSlcclxuICAgIGlmIChlbnN1cmVkV3JpdGVBY2Nlc3MuaXNFcnIpIHtcclxuICAgICAgaWYgKGVuc3VyZWRXcml0ZUFjY2Vzcy5lcnJvci5jb2RlID09PSBQcm9qZWN0Tm90RW5vdWdoUGVybWlzc2lvbnNFcnJvci5jb2RlKVxyXG4gICAgICAgIHJldHVybiBlcnIoXHJcbiAgICAgICAgICBuZXcgUHJvamVjdE5vdEVub3VnaFBlcm1pc3Npb25zRXJyb3Ioe1xyXG4gICAgICAgICAgICBtZXNzYWdlOlxyXG4gICAgICAgICAgICAgIFwiWW91ciByb2xlIG9uIHRoaXMgcHJvamVjdCBkb2Vzbid0IGdpdmUgeW91IHBlcm1pc3Npb24gdG8gdXBkYXRlIHZpZXcgZ3JvdXBzLlwiXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgcmV0dXJuIGVycihlbnN1cmVkV3JpdGVBY2Nlc3MuZXJyb3IpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9rKClcclxuICB9XHJcbiJdfQ==