import { clamp, isString } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29"; import { BaseError } from "/_nuxt/lib/core/errors/base.ts"; import { BlobUploadStatus } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/blobs/index.js"; import { reactive } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; export class BlobRetrievalError extends BaseError { static defaultMessage = "An error occurred while trying to retrieve the blob"; } export function isSuccessfullyUploaded(upload) { return !!upload.result?.blobId; } export async function downloadBlobWithUrl(params) { const { blobId, principal, apiOrigin } = params; const dlUrl = new URL(`/api/stream/${principal.streamId}/blob/${blobId}`, apiOrigin); const dlAnchor = document.createElement("a"); dlAnchor.href = dlUrl.toString(); dlAnchor.target = "_blank"; dlAnchor.rel = "noopener noreferrer"; dlAnchor.style.display = "none"; document.body.appendChild(dlAnchor); dlAnchor.click(); dlAnchor.remove(); } export async function getBlobUrl(params) { const { blobId, principal, apiOrigin } = params; const url = new URL(`/api/stream/${principal.streamId}/blob/${blobId}`, apiOrigin); return url.toString(); } export function uploadFile(params) { const { file, principal, authToken, callback, apiOrigin } = params; const cbWrapper = callback ? (files) => callback(Object.values(files)[0]) : void 0; const results = uploadFiles({ files: [file], principal, authToken, callback: cbWrapper, apiOrigin }); return Object.values(results)[0]; } export function uploadFiles(params) { const { files, principal, authToken, callback, apiOrigin } = params; const formData = new FormData(); const uploadFiles2 = {}; for (const file of files) { const hasError = file.error; if (!hasError && !uploadFiles2[file.id]) { formData.append(file.id, file.file); } uploadFiles2[file.id] = reactive({ ...file, result: void 0, progress: 0 }); } if (![...formData.keys()].length) return uploadFiles2; const req = new XMLHttpRequest(); req.open("POST", new URL(`/api/stream/${principal.streamId}/blob`, apiOrigin)); req.responseType = "json"; if (authToken) { req.setRequestHeader("Authorization", `Bearer ${authToken}`); } req.upload.addEventListener("progress", (e) => { const newProgress = clamp(Math.floor(e.loaded / e.total * 100), 0, 100); for (const resultItem of Object.values(uploadFiles2)) { if (resultItem.error) continue; resultItem.progress = newProgress; } }); const getErrorMessage = (fallbackMessage) => { if (req.response?.error && isString(req.response.error)) { return req.response.error; } if (req.status === 403) { return "You do not have permissions to do this"; } return fallbackMessage; }; req.addEventListener("load", () => { const uploadResults = req.response?.uploadResults || []; for (const uploadFile2 of Object.values(uploadFiles2)) { if (uploadFile2.error) continue; uploadFile2.progress = 100; uploadFile2.result = uploadResults.find((r) => r.formKey === uploadFile2.id) || { uploadError: getErrorMessage("Unable to resolve upload results"), uploadStatus: BlobUploadStatus.Error, formKey: uploadFile2.id }; } if (callback) callback(uploadFiles2); }); req.addEventListener("error", () => { const uploadResults = req.response?.uploadResults || []; for (const uploadFile2 of Object.values(uploadFiles2)) { if (uploadFile2.error) continue; uploadFile2.progress = 100; uploadFile2.result = uploadResults.find((r) => r.formKey === uploadFile2.id) || { uploadError: getErrorMessage("Upload request failed unexpectedly"), uploadStatus: BlobUploadStatus.Error, formKey: uploadFile2.id }; } if (callback) callback(uploadFiles2); }); req.send(formData); return uploadFiles2; } export class BlobDeleteFailedError extends BaseError { static defaultMessage = "Unable to delete the file"; } export async function deleteBlob(params) { const { blobId, principal, authToken, apiOrigin } = params; const { streamId } = principal; const res = await fetch( new URL(`/api/stream/${streamId}/blob/${blobId}`, apiOrigin), { method: "DELETE", headers: { ...authToken ? { Authorization: `Bearer ${authToken}` } : {} } } ); if (res.status !== 204) { throw new BlobDeleteFailedError(); } } export { BlobUploadStatus }; //# sourceMappingURL=data:application/json;base64,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QkFBc0IsV0FBVyxRQUs5QjtBQUNELFFBQU0sRUFBRSxRQUFRLFdBQVcsV0FBVyxVQUFVLElBQUk7QUFDcEQsUUFBTSxFQUFFLFNBQVMsSUFBSTtBQUVyQixRQUFNLE1BQU0sTUFBTTtBQUFBLElBQ2hCLElBQUksSUFBSSxlQUFlLFFBQVEsU0FBUyxNQUFNLElBQUksU0FBUztBQUFBLElBQzNEO0FBQUEsTUFDRSxRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsUUFDUCxHQUFJLFlBQVksRUFBRSxlQUFlLFVBQVUsU0FBUyxHQUFHLElBQUksQ0FBQztBQUFBLE1BQzlEO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLElBQUksV0FBVyxLQUFLO0FBQ3RCLFVBQU0sSUFBSSxzQkFBc0I7QUFBQSxFQUNsQztBQUNGO0FBRUEsU0FBUyIsIm5hbWVzIjpbInVwbG9hZEZpbGVzIiwidXBsb2FkRmlsZSJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJibG9iU3RvcmFnZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbGFtcCwgaXNTdHJpbmcgfSBmcm9tICdsb2Rhc2gnXHJcbmltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gJ35+L2xpYi9jb3JlL2Vycm9ycy9iYXNlJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgVXBsb2FkYWJsZUZpbGVJdGVtLFxyXG4gIFVwbG9hZEZpbGVJdGVtXHJcbn0gZnJvbSAnfn4vbGliL2Zvcm0vY29tcG9zYWJsZXMvZmlsZVVwbG9hZCdcclxuaW1wb3J0IHR5cGUgeyBPcHRpb25hbCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHR5cGUgeyBNZXJnZSwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnXHJcbmltcG9ydCB7IEJsb2JVcGxvYWRTdGF0dXMgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvYmxvYnMnXHJcbmltcG9ydCB0eXBlIHsgQmxvYlBvc3RSZXN1bHRJdGVtIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuXHJcbmV4cG9ydCB0eXBlIEJsb2JVcGxvYWRQcmluY2lwYWwgPSB7XHJcbiAgc3RyZWFtSWQ6IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBTdWNjZXNzZnVsbHlVcGxvYWRlZEZpbGVJdGVtID0gTWVyZ2U8XHJcbiAgVXBsb2FkRmlsZUl0ZW0sXHJcbiAgeyByZXN1bHQ6IFNldFJlcXVpcmVkPEJsb2JQb3N0UmVzdWx0SXRlbSwgJ2Jsb2JJZCc+IH1cclxuPlxyXG5cclxuZXhwb3J0IGNsYXNzIEJsb2JSZXRyaWV2YWxFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XHJcbiAgc3RhdGljIG92ZXJyaWRlIGRlZmF1bHRNZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZXRyaWV2ZSB0aGUgYmxvYidcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3VjY2Vzc2Z1bGx5VXBsb2FkZWQoXHJcbiAgdXBsb2FkOiBVcGxvYWRGaWxlSXRlbVxyXG4pOiB1cGxvYWQgaXMgU3VjY2Vzc2Z1bGx5VXBsb2FkZWRGaWxlSXRlbSB7XHJcbiAgcmV0dXJuICEhdXBsb2FkLnJlc3VsdD8uYmxvYklkXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbml0aWF0ZSBhIGJyb3dzZXIgZmlsZSBkb3dubG9hZCBvZiB0aGUgc3BlY2lmaWVkIGJsb2JcclxuICogQHBhcmFtIGJsb2JJZFxyXG4gKiBAcGFyYW0gZmlsZU5hbWUgRG93bmxvYWQgZmlsZW5hbWVcclxuICogQHBhcmFtIHByaW5jaXBhbCBPd25lciBvZiB0aGUgYmxvYlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQmxvYldpdGhVcmwocGFyYW1zOiB7XHJcbiAgYmxvYklkOiBzdHJpbmdcclxuICBmaWxlTmFtZTogc3RyaW5nXHJcbiAgcHJpbmNpcGFsOiBCbG9iVXBsb2FkUHJpbmNpcGFsXHJcbiAgdG9rZW4/OiBzdHJpbmdcclxuICBhcGlPcmlnaW46IHN0cmluZ1xyXG59KSB7XHJcbiAgY29uc3QgeyBibG9iSWQsIHByaW5jaXBhbCwgYXBpT3JpZ2luIH0gPSBwYXJhbXNcclxuXHJcbiAgLy8gQ3JlYXRlIGFuY2hvciB3LyB0YXJnZXQgX2JsYW5rIGFuZCB0cmlnZ2VyIGNsaWNrIHRvIGRvd25sb2FkIHRoZSBmaWxlXHJcbiAgLy8gTm90IHVzaW5nIGZldGNoKCkgaGVyZSBjYXVzZSB0aGF0IHdvdWxkIGRvd25sb2FkIHRoZSBlbnRpcmUgZmlsZSBpbnRvIG1lbW9yeSBiZWZvcmUgZXZlbiBzaG93aW5nIHRoZSBicm93c2VyIGRvd25sb2FkIGRpYWxvZ1xyXG4gIGNvbnN0IGRsVXJsID0gbmV3IFVSTChgL2FwaS9zdHJlYW0vJHtwcmluY2lwYWwuc3RyZWFtSWR9L2Jsb2IvJHtibG9iSWR9YCwgYXBpT3JpZ2luKVxyXG4gIGNvbnN0IGRsQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXHJcbiAgZGxBbmNob3IuaHJlZiA9IGRsVXJsLnRvU3RyaW5nKClcclxuICBkbEFuY2hvci50YXJnZXQgPSAnX2JsYW5rJ1xyXG4gIGRsQW5jaG9yLnJlbCA9ICdub29wZW5lciBub3JlZmVycmVyJ1xyXG4gIGRsQW5jaG9yLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRsQW5jaG9yKVxyXG5cclxuICBkbEFuY2hvci5jbGljaygpXHJcbiAgZGxBbmNob3IucmVtb3ZlKClcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBzdHJpbmcgd2l0aCBhIFVSTCByZXByZXNlbnRpbmcgdGhlIGJsb2IuIFVzZSB0byBkaXNwbGF5IGltYWdlIHByZXZpZXdzLCBldGMuXHJcbiAqIEBwYXJhbSBibG9iSWRcclxuICogQHBhcmFtIGZpbGVOYW1lIERvd25sb2FkIGZpbGVuYW1lXHJcbiAqIEBwYXJhbSBwcmluY2lwYWwgT3duZXIgb2YgdGhlIGJsb2JcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCbG9iVXJsKHBhcmFtczoge1xyXG4gIGJsb2JJZDogc3RyaW5nXHJcbiAgcHJpbmNpcGFsOiBCbG9iVXBsb2FkUHJpbmNpcGFsXHJcbiAgdG9rZW4/OiBzdHJpbmdcclxuICBhcGlPcmlnaW46IHN0cmluZ1xyXG59KSB7XHJcbiAgY29uc3QgeyBibG9iSWQsIHByaW5jaXBhbCwgYXBpT3JpZ2luIH0gPSBwYXJhbXNcclxuXHJcbiAgY29uc3QgdXJsID0gbmV3IFVSTChgL2FwaS9zdHJlYW0vJHtwcmluY2lwYWwuc3RyZWFtSWR9L2Jsb2IvJHtibG9iSWR9YCwgYXBpT3JpZ2luKVxyXG4gIHJldHVybiB1cmwudG9TdHJpbmcoKVxyXG59XHJcblxyXG4vKipcclxuICogVXBsb2FkIGEgc2luZ2xlIGZpbGUgYW5kIHJldHVybiBhbiBVcGxvYWRGaWxlSXRlbVxyXG4gKiBAcGFyYW0gZmlsZSBGaWxlIGVtaXR0ZWQgZnJvbSBGaWxlVXBsb2FkWm9uZVxyXG4gKiBAcGFyYW0gcHJpbmNpcGFsIFdoYXQgZW50aXR5IHNob3VsZCB0aGUgZmlsZSBiZSBhdHRhY2hlZCB0byBvbiB0aGUgc2VydmVyXHJcbiAqIEByZXR1cm5zIEEgVnVlIE9ic2VydmFibGUgVXBsb2FkRmlsZUl0ZW0sIGl0J3MgcmVhY3RpdmUgc28geW91IGNhbiB3YXRjaCBpdCBldGMuIGluc2lkZVxyXG4gKiB5b3VyIFZ1ZSBjb21wb25lbnRzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkRmlsZShwYXJhbXM6IHtcclxuICBmaWxlOiBVcGxvYWRGaWxlSXRlbVxyXG4gIHByaW5jaXBhbDogQmxvYlVwbG9hZFByaW5jaXBhbFxyXG4gIGFwaU9yaWdpbjogc3RyaW5nXHJcbiAgYXV0aFRva2VuPzogc3RyaW5nXHJcbiAgY2FsbGJhY2s/OiAoZmlsZTogVXBsb2FkRmlsZUl0ZW0pID0+IHZvaWRcclxufSk6IFVwbG9hZEZpbGVJdGVtIHtcclxuICBjb25zdCB7IGZpbGUsIHByaW5jaXBhbCwgYXV0aFRva2VuLCBjYWxsYmFjaywgYXBpT3JpZ2luIH0gPSBwYXJhbXNcclxuICBjb25zdCBjYldyYXBwZXIgPSBjYWxsYmFja1xyXG4gICAgPyAoZmlsZXM6IFJlY29yZDxzdHJpbmcsIFVwbG9hZEZpbGVJdGVtPikgPT4gY2FsbGJhY2soT2JqZWN0LnZhbHVlcyhmaWxlcylbMF0pXHJcbiAgICA6IHVuZGVmaW5lZFxyXG4gIGNvbnN0IHJlc3VsdHMgPSB1cGxvYWRGaWxlcyh7XHJcbiAgICBmaWxlczogW2ZpbGVdLFxyXG4gICAgcHJpbmNpcGFsLFxyXG4gICAgYXV0aFRva2VuLFxyXG4gICAgY2FsbGJhY2s6IGNiV3JhcHBlcixcclxuICAgIGFwaU9yaWdpblxyXG4gIH0pXHJcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVzdWx0cylbMF1cclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUG9zdEJsb2JSZXNwb25zZSA9IHtcclxuICB1cGxvYWRSZXN1bHRzOiBCbG9iUG9zdFJlc3VsdEl0ZW1bXVxyXG59XHJcblxyXG4vKipcclxuICogVXBsb2FkIGZpbGVzIGFuZCByZXR1cm4gYW4gVXBsb2FkRmlsZUl0ZW0gZm9yIGVhY2ggZmlsZSAoa2V5ZWQgYnkgZmlsZSBJRClcclxuICogQHBhcmFtIGZpbGVzIEZpbGVzIGVtaXR0ZWQgZnJvbSBGaWxlVXBsb2FkWm9uZVxyXG4gKiBAcGFyYW0gcHJpbmNpcGFsIFdoYXQgZW50aXR5IHNob3VsZCB0aGUgZmlsZSBiZSBhdHRhY2hlZCB0byBvbiB0aGUgc2VydmVyXHJcbiAqIEByZXR1cm5zIEEgbWFwIG9mIFZ1ZSBvYnNlcnZhYmxlIFVwbG9hZEZpbGVJdGVtcyAodGhleSdyZSByZWFjdGl2ZSksIGtleWVkIGJ5XHJcbiAqIGZpbGUuaWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGxvYWRGaWxlcyhwYXJhbXM6IHtcclxuICBmaWxlczogVXBsb2FkYWJsZUZpbGVJdGVtW11cclxuICBwcmluY2lwYWw6IEJsb2JVcGxvYWRQcmluY2lwYWxcclxuICBhcGlPcmlnaW46IHN0cmluZ1xyXG4gIGF1dGhUb2tlbj86IHN0cmluZ1xyXG4gIGNhbGxiYWNrPzogKGZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBVcGxvYWRGaWxlSXRlbT4pID0+IHZvaWRcclxufSk6IFJlY29yZDxzdHJpbmcsIFVwbG9hZEZpbGVJdGVtPiB7XHJcbiAgY29uc3QgeyBmaWxlcywgcHJpbmNpcGFsLCBhdXRoVG9rZW4sIGNhbGxiYWNrLCBhcGlPcmlnaW4gfSA9IHBhcmFtc1xyXG4gIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcclxuICBjb25zdCB1cGxvYWRGaWxlczogUmVjb3JkPHN0cmluZywgVXBsb2FkRmlsZUl0ZW0+ID0ge31cclxuXHJcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcbiAgICAvLyBBY3R1YWxseSB1cGxvYWQgdGhlIGZpbGUgb25seSBpZiBpdCBkb2Vzbid0IGhhdmUgYW4gYXR0YWNoZWQgZXJyb3JcclxuICAgIC8vICYgaWYgaXQgaXNuJ3QgYWxyZWFkeSBhZGRlZFxyXG4gICAgY29uc3QgaGFzRXJyb3IgPSBmaWxlLmVycm9yXHJcbiAgICBpZiAoIWhhc0Vycm9yICYmICF1cGxvYWRGaWxlc1tmaWxlLmlkXSkge1xyXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoZmlsZS5pZCwgZmlsZS5maWxlKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlYWN0aXZlIHNvIHRoYXQgd2hvZXZlciB1c2VzIHRoZSByZXN1bHQgc3RydWN0dXJlcyBjYW4gdHJhY2sgY2hhbmdlcyB0b1xyXG4gICAgLy8gdGhlbSB3L28gY2FsbGJhY2tzIChlLmcuIHByb2dyZXNzIGluY3JlYXNlKVxyXG4gICAgdXBsb2FkRmlsZXNbZmlsZS5pZF0gPSByZWFjdGl2ZSh7XHJcbiAgICAgIC4uLmZpbGUsXHJcbiAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxyXG4gICAgICBwcm9ncmVzczogMFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8vIE5vdGhpbmcgdG8gdXBsb2FkLCByZXR1cm5cclxuICBpZiAoIVsuLi5mb3JtRGF0YS5rZXlzKCldLmxlbmd0aCkgcmV0dXJuIHVwbG9hZEZpbGVzXHJcblxyXG4gIC8vIEluaXQgcmVxXHJcbiAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcclxuICByZXEub3BlbignUE9TVCcsIG5ldyBVUkwoYC9hcGkvc3RyZWFtLyR7cHJpbmNpcGFsLnN0cmVhbUlkfS9ibG9iYCwgYXBpT3JpZ2luKSlcclxuICByZXEucmVzcG9uc2VUeXBlID0gJ2pzb24nXHJcblxyXG4gIGlmIChhdXRoVG9rZW4pIHtcclxuICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgYEJlYXJlciAke2F1dGhUb2tlbn1gKVxyXG4gIH1cclxuXHJcbiAgcmVxLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIChlKSA9PiB7XHJcbiAgICBjb25zdCBuZXdQcm9ncmVzcyA9IGNsYW1wKE1hdGguZmxvb3IoKGUubG9hZGVkIC8gZS50b3RhbCkgKiAxMDApLCAwLCAxMDApXHJcblxyXG4gICAgZm9yIChjb25zdCByZXN1bHRJdGVtIG9mIE9iamVjdC52YWx1ZXModXBsb2FkRmlsZXMpKSB7XHJcbiAgICAgIGlmIChyZXN1bHRJdGVtLmVycm9yKSBjb250aW51ZVxyXG5cclxuICAgICAgcmVzdWx0SXRlbS5wcm9ncmVzcyA9IG5ld1Byb2dyZXNzXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKGZhbGxiYWNrTWVzc2FnZTogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAocmVxLnJlc3BvbnNlPy5lcnJvciAmJiBpc1N0cmluZyhyZXEucmVzcG9uc2UuZXJyb3IpKSB7XHJcbiAgICAgIHJldHVybiByZXEucmVzcG9uc2UuZXJyb3JcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVxLnN0YXR1cyA9PT0gNDAzKSB7XHJcbiAgICAgIHJldHVybiAnWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb25zIHRvIGRvIHRoaXMnXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbGxiYWNrTWVzc2FnZVxyXG4gIH1cclxuXHJcbiAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XHJcbiAgICBjb25zdCB1cGxvYWRSZXN1bHRzID1cclxuICAgICAgKHJlcS5yZXNwb25zZSBhcyBPcHRpb25hbDxQb3N0QmxvYlJlc3BvbnNlPik/LnVwbG9hZFJlc3VsdHMgfHwgW11cclxuICAgIGZvciAoY29uc3QgdXBsb2FkRmlsZSBvZiBPYmplY3QudmFsdWVzKHVwbG9hZEZpbGVzKSkge1xyXG4gICAgICBpZiAodXBsb2FkRmlsZS5lcnJvcikgY29udGludWVcclxuXHJcbiAgICAgIHVwbG9hZEZpbGUucHJvZ3Jlc3MgPSAxMDBcclxuICAgICAgdXBsb2FkRmlsZS5yZXN1bHQgPSB1cGxvYWRSZXN1bHRzLmZpbmQoKHIpID0+IHIuZm9ybUtleSA9PT0gdXBsb2FkRmlsZS5pZCkgfHwge1xyXG4gICAgICAgIHVwbG9hZEVycm9yOiBnZXRFcnJvck1lc3NhZ2UoJ1VuYWJsZSB0byByZXNvbHZlIHVwbG9hZCByZXN1bHRzJyksXHJcbiAgICAgICAgdXBsb2FkU3RhdHVzOiBCbG9iVXBsb2FkU3RhdHVzLkVycm9yLFxyXG4gICAgICAgIGZvcm1LZXk6IHVwbG9hZEZpbGUuaWRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sodXBsb2FkRmlsZXMpXHJcbiAgfSlcclxuXHJcbiAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xyXG4gICAgY29uc3QgdXBsb2FkUmVzdWx0cyA9XHJcbiAgICAgIChyZXEucmVzcG9uc2UgYXMgT3B0aW9uYWw8UG9zdEJsb2JSZXNwb25zZT4pPy51cGxvYWRSZXN1bHRzIHx8IFtdXHJcbiAgICBmb3IgKGNvbnN0IHVwbG9hZEZpbGUgb2YgT2JqZWN0LnZhbHVlcyh1cGxvYWRGaWxlcykpIHtcclxuICAgICAgaWYgKHVwbG9hZEZpbGUuZXJyb3IpIGNvbnRpbnVlXHJcblxyXG4gICAgICB1cGxvYWRGaWxlLnByb2dyZXNzID0gMTAwXHJcbiAgICAgIHVwbG9hZEZpbGUucmVzdWx0ID0gdXBsb2FkUmVzdWx0cy5maW5kKChyKSA9PiByLmZvcm1LZXkgPT09IHVwbG9hZEZpbGUuaWQpIHx8IHtcclxuICAgICAgICB1cGxvYWRFcnJvcjogZ2V0RXJyb3JNZXNzYWdlKCdVcGxvYWQgcmVxdWVzdCBmYWlsZWQgdW5leHBlY3RlZGx5JyksXHJcbiAgICAgICAgdXBsb2FkU3RhdHVzOiBCbG9iVXBsb2FkU3RhdHVzLkVycm9yLFxyXG4gICAgICAgIGZvcm1LZXk6IHVwbG9hZEZpbGUuaWRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sodXBsb2FkRmlsZXMpXHJcbiAgfSlcclxuXHJcbiAgcmVxLnNlbmQoZm9ybURhdGEpXHJcblxyXG4gIHJldHVybiB1cGxvYWRGaWxlc1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQmxvYkRlbGV0ZUZhaWxlZEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcclxuICBzdGF0aWMgb3ZlcnJpZGUgZGVmYXVsdE1lc3NhZ2UgPSAnVW5hYmxlIHRvIGRlbGV0ZSB0aGUgZmlsZSdcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJsb2IocGFyYW1zOiB7XHJcbiAgYmxvYklkOiBzdHJpbmdcclxuICBwcmluY2lwYWw6IEJsb2JVcGxvYWRQcmluY2lwYWxcclxuICBhcGlPcmlnaW46IHN0cmluZ1xyXG4gIGF1dGhUb2tlbj86IHN0cmluZ1xyXG59KSB7XHJcbiAgY29uc3QgeyBibG9iSWQsIHByaW5jaXBhbCwgYXV0aFRva2VuLCBhcGlPcmlnaW4gfSA9IHBhcmFtc1xyXG4gIGNvbnN0IHsgc3RyZWFtSWQgfSA9IHByaW5jaXBhbFxyXG5cclxuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcclxuICAgIG5ldyBVUkwoYC9hcGkvc3RyZWFtLyR7c3RyZWFtSWR9L2Jsb2IvJHtibG9iSWR9YCwgYXBpT3JpZ2luKSxcclxuICAgIHtcclxuICAgICAgbWV0aG9kOiAnREVMRVRFJyxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIC4uLihhdXRoVG9rZW4gPyB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoVG9rZW59YCB9IDoge30pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICApXHJcblxyXG4gIGlmIChyZXMuc3RhdHVzICE9PSAyMDQpIHtcclxuICAgIHRocm93IG5ldyBCbG9iRGVsZXRlRmFpbGVkRXJyb3IoKVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IHsgQmxvYlVwbG9hZFN0YXR1cyB9XHJcbmV4cG9ydCB0eXBlIHsgQmxvYlBvc3RSZXN1bHRJdGVtIH1cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2xpYi9jb3JlL2FwaS9ibG9iU3RvcmFnZS50cyJ9