@dwelle/excalidraw 0.3.17 → 0.3.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/README_NEXT.md +2 -17
- package/dist/excalidraw-assets/image-0db17e06143a31f9772b.js +1 -0
- package/dist/excalidraw-assets/image-6f8d3b9873832b5f7a67.js +1 -0
- package/dist/excalidraw-assets/image-a26261fb8a718f15853e.js +1 -0
- package/dist/excalidraw-assets/vendor-64ea3ed78bc76a895e61.js +2 -0
- package/dist/excalidraw-assets/vendor-64ea3ed78bc76a895e61.js.LICENSE.txt +14 -0
- package/dist/excalidraw-assets/vendor-ce466849186c701b6c48.js +2 -0
- package/dist/excalidraw-assets/vendor-ce466849186c701b6c48.js.LICENSE.txt +14 -0
- package/dist/excalidraw-assets/vendor-e5c6cd57013e8e575a61.js +1 -0
- package/dist/excalidraw-assets-dev/image-469d5bd946743969995a.js +42 -0
- package/dist/excalidraw-assets-dev/image-821afe7d20de2d2ca898.js +42 -0
- package/dist/excalidraw-assets-dev/vendor-a449655791956f151f51.js +344 -0
- package/dist/excalidraw.development.js +252 -91
- package/dist/excalidraw.production.min.js +1 -2
- package/dist/excalidraw.production.min.js.LICENSE.txt +9 -0
- package/package.json +11 -8
- package/types/actions/manager.d.ts +0 -1
- package/types/actions/types.d.ts +0 -1
- package/types/appState.d.ts +5 -5
- package/types/clipboard.d.ts +0 -2
- package/types/components/Actions.d.ts +0 -1
- package/types/components/App.d.ts +0 -1
- package/types/components/Avatar.d.ts +0 -1
- package/types/components/ButtonIconSelect.d.ts +0 -1
- package/types/components/CheckboxItem.d.ts +2 -1
- package/types/components/ClearCanvas.d.ts +0 -1
- package/types/components/ConfirmDialog.d.ts +11 -0
- package/types/components/ContextMenu.d.ts +0 -2
- package/types/components/Dialog.d.ts +4 -2
- package/types/components/Island.d.ts +0 -1
- package/types/components/JSONExportDialog.d.ts +0 -1
- package/types/components/LayerUI.d.ts +0 -1
- package/types/components/LibraryMenu.d.ts +18 -0
- package/types/components/LibraryMenuItems.d.ts +22 -0
- package/types/components/LibraryUnit.d.ts +6 -4
- package/types/components/MobileMenu.d.ts +0 -1
- package/types/components/Modal.d.ts +1 -0
- package/types/components/PasteChartDialog.d.ts +1 -1
- package/types/components/Popover.d.ts +0 -1
- package/types/components/PublishLibrary.d.ts +17 -0
- package/types/components/Section.d.ts +0 -1
- package/types/components/SingleLibraryItem.d.ts +11 -0
- package/types/components/ToolButton.d.ts +5 -0
- package/types/components/Tooltip.d.ts +2 -1
- package/types/components/icons.d.ts +1 -1
- package/types/constants.d.ts +5 -0
- package/types/data/blob.d.ts +5 -3
- package/types/data/encryption.d.ts +3 -4
- package/types/data/filesystem.d.ts +2 -3
- package/types/data/json.d.ts +2 -2
- package/types/data/library.d.ts +1 -1
- package/types/data/restore.d.ts +2 -1
- package/types/data/types.d.ts +7 -4
- package/types/element/binding.d.ts +0 -2
- package/types/element/bounds.d.ts +8 -1
- package/types/element/image.d.ts +0 -2
- package/types/element/index.d.ts +0 -3
- package/types/element/linearElementEditor.d.ts +0 -1
- package/types/element/mutateElement.d.ts +1 -1
- package/types/element/newElement.d.ts +1 -1
- package/types/element/textWysiwyg.d.ts +0 -2
- package/types/element/types.d.ts +2 -0
- package/types/errors.d.ts +0 -1
- package/types/i18n.d.ts +1 -1
- package/types/keys.d.ts +0 -2
- package/types/packages/excalidraw/dist/excalidraw-assets/image-0db17e06143a31f9772b.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/image-6f8d3b9873832b5f7a67.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/image-a26261fb8a718f15853e.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-64ea3ed78bc76a895e61.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-ce466849186c701b6c48.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets/vendor-e5c6cd57013e8e575a61.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/image-469d5bd946743969995a.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/image-821afe7d20de2d2ca898.d.ts +0 -0
- package/types/packages/excalidraw/dist/excalidraw-assets-dev/vendor-a449655791956f151f51.d.ts +0 -0
- package/types/packages/excalidraw/env.d.ts +1 -0
- package/types/packages/excalidraw/index.d.ts +1 -1
- package/types/packages/excalidraw/webpack.dev.config.d.ts +1 -1
- package/types/packages/excalidraw/webpack.prod.config.d.ts +0 -2
- package/types/packages/utils.d.ts +5 -6
- package/types/renderer/renderElement.d.ts +4 -6
- package/types/renderer/renderScene.d.ts +4 -11
- package/types/renderer/roundRect.d.ts +0 -1
- package/types/scene/export.d.ts +0 -2
- package/types/scene/scroll.d.ts +0 -2
- package/types/scene/types.d.ts +15 -8
- package/types/scene/zoom.d.ts +0 -1
- package/types/types.d.ts +14 -2
- package/types/utils.d.ts +10 -2
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* ATTENTION: An "eval-source-map" devtool has been used.
|
|
4
|
+
* This devtool is neither made for production nor for readable output files.
|
|
5
|
+
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
|
6
|
+
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
7
|
+
* or disable the default devtool with "devtool: false".
|
|
8
|
+
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
9
|
+
*/
|
|
10
|
+
(globalThis["webpackChunkExcalidraw"] = globalThis["webpackChunkExcalidraw"] || []).push([["image"],{
|
|
11
|
+
|
|
12
|
+
/***/ "../../data/encode.ts":
|
|
13
|
+
/*!****************************!*\
|
|
14
|
+
!*** ../../data/encode.ts ***!
|
|
15
|
+
\****************************/
|
|
16
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
17
|
+
|
|
18
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"toByteString\": () => (/* binding */ toByteString),\n/* harmony export */ \"stringToBase64\": () => (/* binding */ stringToBase64),\n/* harmony export */ \"base64ToString\": () => (/* binding */ base64ToString),\n/* harmony export */ \"encode\": () => (/* binding */ encode),\n/* harmony export */ \"decode\": () => (/* binding */ decode),\n/* harmony export */ \"compressData\": () => (/* binding */ compressData),\n/* harmony export */ \"decompressData\": () => (/* binding */ decompressData)\n/* harmony export */ });\n/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! pako */ \"../../../node_modules/pako/index.js\");\n/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(pako__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _encryption__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./encryption */ \"../../data/encryption.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n// -----------------------------------------------------------------------------\r\n// byte (binary) strings\r\n// -----------------------------------------------------------------------------\r\n// fast, Buffer-compatible implem\r\nconst toByteString = (data) => {\r\n return new Promise((resolve, reject) => {\r\n const blob = typeof data === \"string\"\r\n ? new Blob([new TextEncoder().encode(data)])\r\n : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n if (!event.target || typeof event.target.result !== \"string\") {\r\n return reject(new Error(\"couldn't convert to byte string\"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsBinaryString(blob);\r\n });\r\n};\r\nconst byteStringToArrayBuffer = (byteString) => {\r\n const buffer = new ArrayBuffer(byteString.length);\r\n const bufferView = new Uint8Array(buffer);\r\n for (let i = 0, len = byteString.length; i < len; i++) {\r\n bufferView[i] = byteString.charCodeAt(i);\r\n }\r\n return buffer;\r\n};\r\nconst byteStringToString = (byteString) => {\r\n return new TextDecoder(\"utf-8\").decode(byteStringToArrayBuffer(byteString));\r\n};\r\n// -----------------------------------------------------------------------------\r\n// base64\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * @param isByteString set to true if already byte string to prevent bloat\r\n * due to reencoding\r\n */\r\nconst stringToBase64 = (str, isByteString = false) => __awaiter(void 0, void 0, void 0, function* () {\r\n return isByteString ? window.btoa(str) : window.btoa(yield toByteString(str));\r\n});\r\n// async to align with stringToBase64\r\nconst base64ToString = (base64, isByteString = false) => __awaiter(void 0, void 0, void 0, function* () {\r\n return isByteString\r\n ? window.atob(base64)\r\n : byteStringToString(window.atob(base64));\r\n});\r\n/**\r\n * Encodes (and potentially compresses via zlib) text to byte string\r\n */\r\nconst encode = ({ text, compress, }) => __awaiter(void 0, void 0, void 0, function* () {\r\n let deflated;\r\n if (compress !== false) {\r\n try {\r\n deflated = yield toByteString((0,pako__WEBPACK_IMPORTED_MODULE_0__.deflate)(text));\r\n }\r\n catch (error) {\r\n console.error(\"encode: cannot deflate\", error);\r\n }\r\n }\r\n return {\r\n version: \"1\",\r\n encoding: \"bstring\",\r\n compressed: !!deflated,\r\n encoded: deflated || (yield toByteString(text)),\r\n };\r\n});\r\nconst decode = (data) => __awaiter(void 0, void 0, void 0, function* () {\r\n let decoded;\r\n switch (data.encoding) {\r\n case \"bstring\":\r\n // if compressed, do not double decode the bstring\r\n decoded = data.compressed\r\n ? data.encoded\r\n : yield byteStringToString(data.encoded);\r\n break;\r\n default:\r\n throw new Error(`decode: unknown encoding \"${data.encoding}\"`);\r\n }\r\n if (data.compressed) {\r\n return (0,pako__WEBPACK_IMPORTED_MODULE_0__.inflate)(new Uint8Array(byteStringToArrayBuffer(decoded)), {\r\n to: \"string\",\r\n });\r\n }\r\n return decoded;\r\n});\r\n// -----------------------------------------------------------------------------\r\nconst CONCAT_BUFFERS_VERSION = 1;\r\n/** how many bytes we use to encode how many bytes the next chunk has.\r\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\r\n *\r\n * NOTE ! values must not be changed, which would be backwards incompatible !\r\n */\r\nconst VERSION_DATAVIEW_BYTES = 4;\r\nconst NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4;\r\n// -----------------------------------------------------------------------------\r\nconst DATA_VIEW_BITS_MAP = { 1: 8, 2: 16, 4: 32 };\r\n/**\r\n * abstraction over DataView that serves as a typed getter/setter in case\r\n * you're using constants for the byte size and want to ensure there's no\r\n * discrepenancy in the encoding across refactors.\r\n *\r\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\r\n */\r\nfunction dataView(buffer, bytes, offset, value) {\r\n if (value != null) {\r\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\r\n throw new Error(`attempting to set value higher than the allocated bytes (value: ${value}, bytes: ${bytes})`);\r\n }\r\n const method = `setUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n new DataView(buffer.buffer)[method](offset, value);\r\n return buffer;\r\n }\r\n const method = `getUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n return new DataView(buffer.buffer)[method](offset);\r\n}\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * Resulting concatenated buffer has this format:\r\n *\r\n * [\r\n * VERSION chunk (4 bytes)\r\n * LENGTH chunk 1 (4 bytes)\r\n * DATA chunk 1 (up to 2^32 bits)\r\n * LENGTH chunk 2 (4 bytes)\r\n * DATA chunk 2 (up to 2^32 bits)\r\n * ...\r\n * ]\r\n *\r\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\r\n */\r\nconst concatBuffers = (...buffers) => {\r\n const bufferView = new Uint8Array(VERSION_DATAVIEW_BYTES +\r\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length +\r\n buffers.reduce((acc, buffer) => acc + buffer.byteLength, 0));\r\n let cursor = 0;\r\n // as the first chunk we'll encode the version for backwards compatibility\r\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n for (const buffer of buffers) {\r\n dataView(bufferView, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor, buffer.byteLength);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n bufferView.set(buffer, cursor);\r\n cursor += buffer.byteLength;\r\n }\r\n return bufferView;\r\n};\r\n/** can only be used on buffers created via `concatBuffers()` */\r\nconst splitBuffers = (concatenatedBuffer) => {\r\n const buffers = [];\r\n let cursor = 0;\r\n // first chunk is the version\r\n const version = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n // If version is outside of the supported versions, throw an error.\r\n // This usually means the buffer wasn't encoded using this API, so we'd only\r\n // waste compute.\r\n if (version > CONCAT_BUFFERS_VERSION) {\r\n throw new Error(`invalid version ${version}`);\r\n }\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n while (true) {\r\n const chunkSize = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\r\n cursor += chunkSize;\r\n if (cursor >= concatenatedBuffer.byteLength) {\r\n break;\r\n }\r\n }\r\n return buffers;\r\n};\r\n// helpers for (de)compressing data with JSON metadata including encryption\r\n// -----------------------------------------------------------------------------\r\n/** @private */\r\nconst _encryptAndCompress = (data, encryptionKey) => __awaiter(void 0, void 0, void 0, function* () {\r\n const { encryptedBuffer, iv } = yield (0,_encryption__WEBPACK_IMPORTED_MODULE_1__.encryptData)(encryptionKey, (0,pako__WEBPACK_IMPORTED_MODULE_0__.deflate)(data));\r\n return { iv, buffer: new Uint8Array(encryptedBuffer) };\r\n});\r\n/**\r\n * The returned buffer has following format:\r\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\r\n *\r\n * [\r\n * encodingMetadataBuffer,\r\n * iv,\r\n * [\r\n * contentsMetadataBuffer\r\n * contentsBuffer\r\n * ]\r\n * ]\r\n */\r\nconst compressData = (dataBuffer, options) => __awaiter(void 0, void 0, void 0, function* () {\r\n const fileInfo = {\r\n version: 2,\r\n compression: \"pako@1\",\r\n encryption: \"AES-GCM\",\r\n };\r\n const encodingMetadataBuffer = new TextEncoder().encode(JSON.stringify(fileInfo));\r\n const contentsMetadataBuffer = new TextEncoder().encode(JSON.stringify(options.metadata || null));\r\n const { iv, buffer } = yield _encryptAndCompress(concatBuffers(contentsMetadataBuffer, dataBuffer), options.encryptionKey);\r\n return concatBuffers(encodingMetadataBuffer, iv, buffer);\r\n});\r\n/** @private */\r\nconst _decryptAndDecompress = (iv, decryptedBuffer, decryptionKey, isCompressed) => __awaiter(void 0, void 0, void 0, function* () {\r\n decryptedBuffer = new Uint8Array(yield (0,_encryption__WEBPACK_IMPORTED_MODULE_1__.decryptData)(iv, decryptedBuffer, decryptionKey));\r\n if (isCompressed) {\r\n return (0,pako__WEBPACK_IMPORTED_MODULE_0__.inflate)(decryptedBuffer);\r\n }\r\n return decryptedBuffer;\r\n});\r\nconst decompressData = (bufferView, options) => __awaiter(void 0, void 0, void 0, function* () {\r\n // first chunk is encoding metadata (ignored for now)\r\n const [encodingMetadataBuffer, iv, buffer] = splitBuffers(bufferView);\r\n const encodingMetadata = JSON.parse(new TextDecoder().decode(encodingMetadataBuffer));\r\n try {\r\n const [contentsMetadataBuffer, contentsBuffer] = splitBuffers(yield _decryptAndDecompress(iv, buffer, options.decryptionKey, !!encodingMetadata.compression));\r\n const metadata = JSON.parse(new TextDecoder().decode(contentsMetadataBuffer));\r\n return {\r\n /** metadata source is always JSON so we can decode it here */\r\n metadata,\r\n /** data can be anything so the caller must decode it */\r\n data: contentsBuffer,\r\n };\r\n }\r\n catch (error) {\r\n console.error(`Error during decompressing and decrypting the file.`, encodingMetadata);\r\n throw error;\r\n }\r\n});\r\n// -----------------------------------------------------------------------------\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUssQ0FDbkQsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FDakQsQ0FBQztJQUVGLElBQUk7UUFDRixNQUFNLENBQUMsc0JBQXNCLEVBQUUsY0FBYyxDQUFDLEdBQUcsWUFBWSxDQUMzRCxNQUFNLHFCQUFxQixDQUN6QixFQUFFLEVBQ0YsTUFBTSxFQUNOLE9BQU8sQ0FBQyxhQUFhLEVBQ3JCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQy9CLENBQ0YsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQ3pCLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQzVDLENBQUM7UUFFUCxPQUFPO1lBQ0wsOERBQThEO1lBQzlELFFBQVE7WUFDUix3REFBd0Q7WUFDeEQsSUFBSSxFQUFFLGNBQWM7U0FDckIsQ0FBQztLQUNIO0lBQUMsT0FBTyxLQUFVLEVBQUU7UUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FDWCxxREFBcUQsRUFDckQsZ0JBQWdCLENBQ2pCLENBQUM7UUFDRixNQUFNLEtBQUssQ0FBQztLQUNiO0FBQ0gsQ0FBQyxFQUFDO0FBRUYsZ0ZBQWdGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2RhdGEvZW5jb2RlLnRzPzliOGUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmbGF0ZSwgaW5mbGF0ZSB9IGZyb20gXCJwYWtvXCI7XG5pbXBvcnQgeyBlbmNyeXB0RGF0YSwgZGVjcnlwdERhdGEgfSBmcm9tIFwiLi9lbmNyeXB0aW9uXCI7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBieXRlIChiaW5hcnkpIHN0cmluZ3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIGZhc3QsIEJ1ZmZlci1jb21wYXRpYmxlIGltcGxlbVxuZXhwb3J0IGNvbnN0IHRvQnl0ZVN0cmluZyA9IChcbiAgZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSB8IEFycmF5QnVmZmVyLFxuKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBibG9iID1cbiAgICAgIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gbmV3IEJsb2IoW25ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKV0pXG4gICAgICAgIDogbmV3IEJsb2IoW2RhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gZGF0YSA6IG5ldyBVaW50OEFycmF5KGRhdGEpXSk7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWV2ZW50LnRhcmdldCB8fCB0eXBlb2YgZXZlbnQudGFyZ2V0LnJlc3VsdCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcImNvdWxkbid0IGNvbnZlcnQgdG8gYnl0ZSBzdHJpbmdcIikpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0KTtcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7XG4gIH0pO1xufTtcblxuY29uc3QgYnl0ZVN0cmluZ1RvQXJyYXlCdWZmZXIgPSAoYnl0ZVN0cmluZzogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XG4gIGNvbnN0IGJ1ZmZlclZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBmb3IgKGxldCBpID0gMCwgbGVuID0gYnl0ZVN0cmluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGJ1ZmZlclZpZXdbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIGJ1ZmZlcjtcbn07XG5cbmNvbnN0IGJ5dGVTdHJpbmdUb1N0cmluZyA9IChieXRlU3RyaW5nOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpLmRlY29kZShieXRlU3RyaW5nVG9BcnJheUJ1ZmZlcihieXRlU3RyaW5nKSk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gYmFzZTY0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEBwYXJhbSBpc0J5dGVTdHJpbmcgc2V0IHRvIHRydWUgaWYgYWxyZWFkeSBieXRlIHN0cmluZyB0byBwcmV2ZW50IGJsb2F0XG4gKiAgZHVlIHRvIHJlZW5jb2RpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmluZ1RvQmFzZTY0ID0gYXN5bmMgKHN0cjogc3RyaW5nLCBpc0J5dGVTdHJpbmcgPSBmYWxzZSkgPT4ge1xuICByZXR1cm4gaXNCeXRlU3RyaW5nID8gd2luZG93LmJ0b2Eoc3RyKSA6IHdpbmRvdy5idG9hKGF3YWl0IHRvQnl0ZVN0cmluZyhzdHIpKTtcbn07XG5cbi8vIGFzeW5jIHRvIGFsaWduIHdpdGggc3RyaW5nVG9CYXNlNjRcbmV4cG9ydCBjb25zdCBiYXNlNjRUb1N0cmluZyA9IGFzeW5jIChiYXNlNjQ6IHN0cmluZywgaXNCeXRlU3RyaW5nID0gZmFsc2UpID0+IHtcbiAgcmV0dXJuIGlzQnl0ZVN0cmluZ1xuICAgID8gd2luZG93LmF0b2IoYmFzZTY0KVxuICAgIDogYnl0ZVN0cmluZ1RvU3RyaW5nKHdpbmRvdy5hdG9iKGJhc2U2NCkpO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIHRleHQgZW5jb2Rpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgRW5jb2RlZERhdGEgPSB7XG4gIGVuY29kZWQ6IHN0cmluZztcbiAgZW5jb2Rpbmc6IFwiYnN0cmluZ1wiO1xuICAvKiogd2hldGhlciB0ZXh0IGlzIGNvbXByZXNzZWQgKHpsaWIpICovXG4gIGNvbXByZXNzZWQ6IGJvb2xlYW47XG4gIC8qKiB2ZXJzaW9uIGZvciBwb3RlbnRpYWwgbWlncmF0aW9uIHB1cnBvc2VzICovXG4gIHZlcnNpb24/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEVuY29kZXMgKGFuZCBwb3RlbnRpYWxseSBjb21wcmVzc2VzIHZpYSB6bGliKSB0ZXh0IHRvIGJ5dGUgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBlbmNvZGUgPSBhc3luYyAoe1xuICB0ZXh0LFxuICBjb21wcmVzcyxcbn06IHtcbiAgdGV4dDogc3RyaW5nO1xuICAvKiogZGVmYXVsdHMgdG8gYHRydWVgLiBJZiBjb21wcmVzc2lvbiBmYWlscywgZmFsbHMgYmFjayB0byBic3RyaW5nIGFsb25lLiAqL1xuICBjb21wcmVzcz86IGJvb2xlYW47XG59KTogUHJvbWlzZTxFbmNvZGVkRGF0YT4gPT4ge1xuICBsZXQgZGVmbGF0ZWQhOiBzdHJpbmc7XG4gIGlmIChjb21wcmVzcyAhPT0gZmFsc2UpIHtcbiAgICB0cnkge1xuICAgICAgZGVmbGF0ZWQgPSBhd2FpdCB0b0J5dGVTdHJpbmcoZGVmbGF0ZSh0ZXh0KSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihcImVuY29kZTogY2Fubm90IGRlZmxhdGVcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHZlcnNpb246IFwiMVwiLFxuICAgIGVuY29kaW5nOiBcImJzdHJpbmdcIixcbiAgICBjb21wcmVzc2VkOiAhIWRlZmxhdGVkLFxuICAgIGVuY29kZWQ6IGRlZmxhdGVkIHx8IChhd2FpdCB0b0J5dGVTdHJpbmcodGV4dCkpLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGRlY29kZSA9IGFzeW5jIChkYXRhOiBFbmNvZGVkRGF0YSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGxldCBkZWNvZGVkOiBzdHJpbmc7XG5cbiAgc3dpdGNoIChkYXRhLmVuY29kaW5nKSB7XG4gICAgY2FzZSBcImJzdHJpbmdcIjpcbiAgICAgIC8vIGlmIGNvbXByZXNzZWQsIGRvIG5vdCBkb3VibGUgZGVjb2RlIHRoZSBic3RyaW5nXG4gICAgICBkZWNvZGVkID0gZGF0YS5jb21wcmVzc2VkXG4gICAgICAgID8gZGF0YS5lbmNvZGVkXG4gICAgICAgIDogYXdhaXQgYnl0ZVN0cmluZ1RvU3RyaW5nKGRhdGEuZW5jb2RlZCk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkZWNvZGU6IHVua25vd24gZW5jb2RpbmcgXCIke2RhdGEuZW5jb2Rpbmd9XCJgKTtcbiAgfVxuXG4gIGlmIChkYXRhLmNvbXByZXNzZWQpIHtcbiAgICByZXR1cm4gaW5mbGF0ZShuZXcgVWludDhBcnJheShieXRlU3RyaW5nVG9BcnJheUJ1ZmZlcihkZWNvZGVkKSksIHtcbiAgICAgIHRvOiBcInN0cmluZ1wiLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGRlY29kZWQ7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gYmluYXJ5IGVuY29kaW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIEZpbGVFbmNvZGluZ0luZm8gPSB7XG4gIC8qIHZlcnNpb24gMiBpcyB0aGUgdmVyc2lvbiB3ZSdyZSBzaGlwcGluZyB0aGUgaW5pdGlhbCBpbWFnZSBzdXBwb3J0IHdpdGguXG4gICAgdmVyc2lvbiAxIHdhcyBhIFBSIHZlcnNpb24gdGhhdCBhIGxvdCBvZiBwZW9wbGUgd2VyZSB1c2luZyBhbnl3YXkuXG4gICAgVGh1cywgaWYgdGhlcmUgYXJlIGlzc3VlcyB3ZSBjYW4gY2hlY2sgd2hldGhlciB0aGV5J3JlIG5vdCB1c2luZyB0aGVcbiAgICB1bm9mZmljIHZlcnNpb24gKi9cbiAgdmVyc2lvbjogMSB8IDI7XG4gIGNvbXByZXNzaW9uOiBcInBha29AMVwiIHwgbnVsbDtcbiAgZW5jcnlwdGlvbjogXCJBRVMtR0NNXCIgfCBudWxsO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IENPTkNBVF9CVUZGRVJTX1ZFUlNJT04gPSAxO1xuLyoqIGhvdyBtYW55IGJ5dGVzIHdlIHVzZSB0byBlbmNvZGUgaG93IG1hbnkgYnl0ZXMgdGhlIG5leHQgY2h1bmsgaGFzLlxuICogQ29ycmVzcG9uZHMgdG8gRGF0YVZpZXcgc2V0dGVyIG1ldGhvZHMgKHNldFVpbnQzMiwgc2V0VWludDE2LCBldGMpLlxuICpcbiAqIE5PVEUgISB2YWx1ZXMgbXVzdCBub3QgYmUgY2hhbmdlZCwgd2hpY2ggd291bGQgYmUgYmFja3dhcmRzIGluY29tcGF0aWJsZSAhXG4gKi9cbmNvbnN0IFZFUlNJT05fREFUQVZJRVdfQllURVMgPSA0O1xuY29uc3QgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTID0gNDtcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IERBVEFfVklFV19CSVRTX01BUCA9IHsgMTogOCwgMjogMTYsIDQ6IDMyIH0gYXMgY29uc3Q7XG5cbi8vIGdldHRlclxuZnVuY3Rpb24gZGF0YVZpZXcoYnVmZmVyOiBVaW50OEFycmF5LCBieXRlczogMSB8IDIgfCA0LCBvZmZzZXQ6IG51bWJlcik6IG51bWJlcjtcbi8vIHNldHRlclxuZnVuY3Rpb24gZGF0YVZpZXcoXG4gIGJ1ZmZlcjogVWludDhBcnJheSxcbiAgYnl0ZXM6IDEgfCAyIHwgNCxcbiAgb2Zmc2V0OiBudW1iZXIsXG4gIHZhbHVlOiBudW1iZXIsXG4pOiBVaW50OEFycmF5O1xuLyoqXG4gKiBhYnN0cmFjdGlvbiBvdmVyIERhdGFWaWV3IHRoYXQgc2VydmVzIGFzIGEgdHlwZWQgZ2V0dGVyL3NldHRlciBpbiBjYXNlXG4gKiB5b3UncmUgdXNpbmcgY29uc3RhbnRzIGZvciB0aGUgYnl0ZSBzaXplIGFuZCB3YW50IHRvIGVuc3VyZSB0aGVyZSdzIG5vXG4gKiBkaXNjcmVwZW5hbmN5IGluIHRoZSBlbmNvZGluZyBhY3Jvc3MgcmVmYWN0b3JzLlxuICpcbiAqIERhdGFWaWV3IHNlcnZlcyBmb3IgYW4gZW5kaWFuLWFnbm9zdGljIGhhbmRsaW5nIG9mIG51bWJlcnMgaW4gQXJyYXlCdWZmZXJzLlxuICovXG5mdW5jdGlvbiBkYXRhVmlldyhcbiAgYnVmZmVyOiBVaW50OEFycmF5LFxuICBieXRlczogMSB8IDIgfCA0LFxuICBvZmZzZXQ6IG51bWJlcixcbiAgdmFsdWU/OiBudW1iZXIsXG4pOiBVaW50OEFycmF5IHwgbnVtYmVyIHtcbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICBpZiAodmFsdWUgPiBNYXRoLnBvdygyLCBEQVRBX1ZJRVdfQklUU19NQVBbYnl0ZXNdKSAtIDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGF0dGVtcHRpbmcgdG8gc2V0IHZhbHVlIGhpZ2hlciB0aGFuIHRoZSBhbGxvY2F0ZWQgYnl0ZXMgKHZhbHVlOiAke3ZhbHVlfSwgYnl0ZXM6ICR7Ynl0ZXN9KWAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSBgc2V0VWludCR7REFUQV9WSUVXX0JJVFNfTUFQW2J5dGVzXX1gIGFzIGNvbnN0O1xuICAgIG5ldyBEYXRhVmlldyhidWZmZXIuYnVmZmVyKVttZXRob2RdKG9mZnNldCwgdmFsdWUpO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH1cbiAgY29uc3QgbWV0aG9kID0gYGdldFVpbnQke0RBVEFfVklFV19CSVRTX01BUFtieXRlc119YCBhcyBjb25zdDtcbiAgcmV0dXJuIG5ldyBEYXRhVmlldyhidWZmZXIuYnVmZmVyKVttZXRob2RdKG9mZnNldCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmVzdWx0aW5nIGNvbmNhdGVuYXRlZCBidWZmZXIgaGFzIHRoaXMgZm9ybWF0OlxuICpcbiAqIFtcbiAqICAgVkVSU0lPTiBjaHVuayAoNCBieXRlcylcbiAqICAgTEVOR1RIIGNodW5rIDEgKDQgYnl0ZXMpXG4gKiAgIERBVEEgY2h1bmsgMSAodXAgdG8gMl4zMiBiaXRzKVxuICogICBMRU5HVEggY2h1bmsgMiAoNCBieXRlcylcbiAqICAgREFUQSBjaHVuayAyICh1cCB0byAyXjMyIGJpdHMpXG4gKiAgIC4uLlxuICogXVxuICpcbiAqIEBwYXJhbSBidWZmZXJzIGVhY2ggYnVmZmVyIChjaHVuaykgbXVzdCBiZSBhdCBtb3N0IDJeMzIgYml0cyBsYXJnZSAofjRHQilcbiAqL1xuY29uc3QgY29uY2F0QnVmZmVycyA9ICguLi5idWZmZXJzOiBVaW50OEFycmF5W10pID0+IHtcbiAgY29uc3QgYnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KFxuICAgIFZFUlNJT05fREFUQVZJRVdfQllURVMgK1xuICAgICAgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTICogYnVmZmVycy5sZW5ndGggK1xuICAgICAgYnVmZmVycy5yZWR1Y2UoKGFjYywgYnVmZmVyKSA9PiBhY2MgKyBidWZmZXIuYnl0ZUxlbmd0aCwgMCksXG4gICk7XG5cbiAgbGV0IGN1cnNvciA9IDA7XG5cbiAgLy8gYXMgdGhlIGZpcnN0IGNodW5rIHdlJ2xsIGVuY29kZSB0aGUgdmVyc2lvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgZGF0YVZpZXcoYnVmZmVyVmlldywgVkVSU0lPTl9EQVRBVklFV19CWVRFUywgY3Vyc29yLCBDT05DQVRfQlVGRkVSU19WRVJTSU9OKTtcbiAgY3Vyc29yICs9IFZFUlNJT05fREFUQVZJRVdfQllURVM7XG5cbiAgZm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVycykge1xuICAgIGRhdGFWaWV3KFxuICAgICAgYnVmZmVyVmlldyxcbiAgICAgIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUyxcbiAgICAgIGN1cnNvcixcbiAgICAgIGJ1ZmZlci5ieXRlTGVuZ3RoLFxuICAgICk7XG4gICAgY3Vyc29yICs9IE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUztcblxuICAgIGJ1ZmZlclZpZXcuc2V0KGJ1ZmZlciwgY3Vyc29yKTtcbiAgICBjdXJzb3IgKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XG4gIH1cblxuICByZXR1cm4gYnVmZmVyVmlldztcbn07XG5cbi8qKiBjYW4gb25seSBiZSB1c2VkIG9uIGJ1ZmZlcnMgY3JlYXRlZCB2aWEgYGNvbmNhdEJ1ZmZlcnMoKWAgKi9cbmNvbnN0IHNwbGl0QnVmZmVycyA9IChjb25jYXRlbmF0ZWRCdWZmZXI6IFVpbnQ4QXJyYXkpID0+IHtcbiAgY29uc3QgYnVmZmVycyA9IFtdO1xuXG4gIGxldCBjdXJzb3IgPSAwO1xuXG4gIC8vIGZpcnN0IGNodW5rIGlzIHRoZSB2ZXJzaW9uXG4gIGNvbnN0IHZlcnNpb24gPSBkYXRhVmlldyhcbiAgICBjb25jYXRlbmF0ZWRCdWZmZXIsXG4gICAgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTLFxuICAgIGN1cnNvcixcbiAgKTtcbiAgLy8gSWYgdmVyc2lvbiBpcyBvdXRzaWRlIG9mIHRoZSBzdXBwb3J0ZWQgdmVyc2lvbnMsIHRocm93IGFuIGVycm9yLlxuICAvLyBUaGlzIHVzdWFsbHkgbWVhbnMgdGhlIGJ1ZmZlciB3YXNuJ3QgZW5jb2RlZCB1c2luZyB0aGlzIEFQSSwgc28gd2UnZCBvbmx5XG4gIC8vIHdhc3RlIGNvbXB1dGUuXG4gIGlmICh2ZXJzaW9uID4gQ09OQ0FUX0JVRkZFUlNfVkVSU0lPTikge1xuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2ZXJzaW9uICR7dmVyc2lvbn1gKTtcbiAgfVxuXG4gIGN1cnNvciArPSBWRVJTSU9OX0RBVEFWSUVXX0JZVEVTO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgY2h1bmtTaXplID0gZGF0YVZpZXcoXG4gICAgICBjb25jYXRlbmF0ZWRCdWZmZXIsXG4gICAgICBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMsXG4gICAgICBjdXJzb3IsXG4gICAgKTtcbiAgICBjdXJzb3IgKz0gTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTO1xuXG4gICAgYnVmZmVycy5wdXNoKGNvbmNhdGVuYXRlZEJ1ZmZlci5zbGljZShjdXJzb3IsIGN1cnNvciArIGNodW5rU2l6ZSkpO1xuICAgIGN1cnNvciArPSBjaHVua1NpemU7XG4gICAgaWYgKGN1cnNvciA+PSBjb25jYXRlbmF0ZWRCdWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZmZlcnM7XG59O1xuXG4vLyBoZWxwZXJzIGZvciAoZGUpY29tcHJlc3NpbmcgZGF0YSB3aXRoIEpTT04gbWV0YWRhdGEgaW5jbHVkaW5nIGVuY3J5cHRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBAcHJpdmF0ZSAqL1xuY29uc3QgX2VuY3J5cHRBbmRDb21wcmVzcyA9IGFzeW5jIChcbiAgZGF0YTogVWludDhBcnJheSB8IHN0cmluZyxcbiAgZW5jcnlwdGlvbktleTogc3RyaW5nLFxuKSA9PiB7XG4gIGNvbnN0IHsgZW5jcnlwdGVkQnVmZmVyLCBpdiB9ID0gYXdhaXQgZW5jcnlwdERhdGEoXG4gICAgZW5jcnlwdGlvbktleSxcbiAgICBkZWZsYXRlKGRhdGEpLFxuICApO1xuXG4gIHJldHVybiB7IGl2LCBidWZmZXI6IG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZEJ1ZmZlcikgfTtcbn07XG5cbi8qKlxuICogVGhlIHJldHVybmVkIGJ1ZmZlciBoYXMgZm9sbG93aW5nIGZvcm1hdDpcbiAqIGBbXWAgcmVmZXJzIHRvIGEgYnVmZmVycyB3cmFwcGVyIChzZWUgYGNvbmNhdEJ1ZmZlcnNgKVxuICpcbiAqIFtcbiAqICAgZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlcixcbiAqICAgaXYsXG4gKiAgIFtcbiAqICAgICAgY29udGVudHNNZXRhZGF0YUJ1ZmZlclxuICogICAgICBjb250ZW50c0J1ZmZlclxuICogICBdXG4gKiBdXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wcmVzc0RhdGEgPSBhc3luYyA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcj4oXG4gIGRhdGFCdWZmZXI6IFVpbnQ4QXJyYXksXG4gIG9wdGlvbnM6IHtcbiAgICBlbmNyeXB0aW9uS2V5OiBzdHJpbmc7XG4gIH0gJiAoW1RdIGV4dGVuZHMgW25ldmVyXVxuICAgID8ge1xuICAgICAgICBtZXRhZGF0YT86IFQ7XG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIG1ldGFkYXRhOiBUO1xuICAgICAgfSksXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+ID0+IHtcbiAgY29uc3QgZmlsZUluZm86IEZpbGVFbmNvZGluZ0luZm8gPSB7XG4gICAgdmVyc2lvbjogMixcbiAgICBjb21wcmVzc2lvbjogXCJwYWtvQDFcIixcbiAgICBlbmNyeXB0aW9uOiBcIkFFUy1HQ01cIixcbiAgfTtcblxuICBjb25zdCBlbmNvZGluZ01ldGFkYXRhQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFxuICAgIEpTT04uc3RyaW5naWZ5KGZpbGVJbmZvKSxcbiAgKTtcblxuICBjb25zdCBjb250ZW50c01ldGFkYXRhQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFxuICAgIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMubWV0YWRhdGEgfHwgbnVsbCksXG4gICk7XG5cbiAgY29uc3QgeyBpdiwgYnVmZmVyIH0gPSBhd2FpdCBfZW5jcnlwdEFuZENvbXByZXNzKFxuICAgIGNvbmNhdEJ1ZmZlcnMoY29udGVudHNNZXRhZGF0YUJ1ZmZlciwgZGF0YUJ1ZmZlciksXG4gICAgb3B0aW9ucy5lbmNyeXB0aW9uS2V5LFxuICApO1xuXG4gIHJldHVybiBjb25jYXRCdWZmZXJzKGVuY29kaW5nTWV0YWRhdGFCdWZmZXIsIGl2LCBidWZmZXIpO1xufTtcblxuLyoqIEBwcml2YXRlICovXG5jb25zdCBfZGVjcnlwdEFuZERlY29tcHJlc3MgPSBhc3luYyAoXG4gIGl2OiBVaW50OEFycmF5LFxuICBkZWNyeXB0ZWRCdWZmZXI6IFVpbnQ4QXJyYXksXG4gIGRlY3J5cHRpb25LZXk6IHN0cmluZyxcbiAgaXNDb21wcmVzc2VkOiBib29sZWFuLFxuKSA9PiB7XG4gIGRlY3J5cHRlZEJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KFxuICAgIGF3YWl0IGRlY3J5cHREYXRhKGl2LCBkZWNyeXB0ZWRCdWZmZXIsIGRlY3J5cHRpb25LZXkpLFxuICApO1xuXG4gIGlmIChpc0NvbXByZXNzZWQpIHtcbiAgICByZXR1cm4gaW5mbGF0ZShkZWNyeXB0ZWRCdWZmZXIpO1xuICB9XG5cbiAgcmV0dXJuIGRlY3J5cHRlZEJ1ZmZlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzRGF0YSA9IGFzeW5jIDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIGJ1ZmZlclZpZXc6IFVpbnQ4QXJyYXksXG4gIG9wdGlvbnM6IHsgZGVjcnlwdGlvbktleTogc3RyaW5nIH0sXG4pID0+IHtcbiAgLy8gZmlyc3QgY2h1bmsgaXMgZW5jb2RpbmcgbWV0YWRhdGEgKGlnbm9yZWQgZm9yIG5vdylcbiAgY29uc3QgW2VuY29kaW5nTWV0YWRhdGFCdWZmZXIsIGl2LCBidWZmZXJdID0gc3BsaXRCdWZmZXJzKGJ1ZmZlclZpZXcpO1xuXG4gIGNvbnN0IGVuY29kaW5nTWV0YWRhdGE6IEZpbGVFbmNvZGluZ0luZm8gPSBKU09OLnBhcnNlKFxuICAgIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShlbmNvZGluZ01ldGFkYXRhQnVmZmVyKSxcbiAgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IFtjb250ZW50c01ldGFkYXRhQnVmZmVyLCBjb250ZW50c0J1ZmZlcl0gPSBzcGxpdEJ1ZmZlcnMoXG4gICAgICBhd2FpdCBfZGVjcnlwdEFuZERlY29tcHJlc3MoXG4gICAgICAgIGl2LFxuICAgICAgICBidWZmZXIsXG4gICAgICAgIG9wdGlvbnMuZGVjcnlwdGlvbktleSxcbiAgICAgICAgISFlbmNvZGluZ01ldGFkYXRhLmNvbXByZXNzaW9uLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWV0YWRhdGEgPSBKU09OLnBhcnNlKFxuICAgICAgbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnRzTWV0YWRhdGFCdWZmZXIpLFxuICAgICkgYXMgVDtcblxuICAgIHJldHVybiB7XG4gICAgICAvKiogbWV0YWRhdGEgc291cmNlIGlzIGFsd2F5cyBKU09OIHNvIHdlIGNhbiBkZWNvZGUgaXQgaGVyZSAqL1xuICAgICAgbWV0YWRhdGEsXG4gICAgICAvKiogZGF0YSBjYW4gYmUgYW55dGhpbmcgc28gdGhlIGNhbGxlciBtdXN0IGRlY29kZSBpdCAqL1xuICAgICAgZGF0YTogY29udGVudHNCdWZmZXIsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgRXJyb3IgZHVyaW5nIGRlY29tcHJlc3NpbmcgYW5kIGRlY3J5cHRpbmcgdGhlIGZpbGUuYCxcbiAgICAgIGVuY29kaW5nTWV0YWRhdGEsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../data/encode.ts\n");
|
|
19
|
+
|
|
20
|
+
/***/ }),
|
|
21
|
+
|
|
22
|
+
/***/ "../../data/encryption.ts":
|
|
23
|
+
/*!********************************!*\
|
|
24
|
+
!*** ../../data/encryption.ts ***!
|
|
25
|
+
\********************************/
|
|
26
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
27
|
+
|
|
28
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"IV_LENGTH_BYTES\": () => (/* binding */ IV_LENGTH_BYTES),\n/* harmony export */ \"createIV\": () => (/* binding */ createIV),\n/* harmony export */ \"generateEncryptionKey\": () => (/* binding */ generateEncryptionKey),\n/* harmony export */ \"getCryptoKey\": () => (/* binding */ getCryptoKey),\n/* harmony export */ \"encryptData\": () => (/* binding */ encryptData),\n/* harmony export */ \"decryptData\": () => (/* binding */ decryptData)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\nconst IV_LENGTH_BYTES = 12;\r\nconst createIV = () => {\r\n const arr = new Uint8Array(IV_LENGTH_BYTES);\r\n return window.crypto.getRandomValues(arr);\r\n};\r\nconst generateEncryptionKey = (returnAs) => __awaiter(void 0, void 0, void 0, function* () {\r\n const key = yield window.crypto.subtle.generateKey({\r\n name: \"AES-GCM\",\r\n length: _constants__WEBPACK_IMPORTED_MODULE_0__.ENCRYPTION_KEY_BITS,\r\n }, true, // extractable\r\n [\"encrypt\", \"decrypt\"]);\r\n return (returnAs === \"cryptoKey\"\r\n ? key\r\n : (yield window.crypto.subtle.exportKey(\"jwk\", key)).k);\r\n});\r\nconst getCryptoKey = (key, usage) => window.crypto.subtle.importKey(\"jwk\", {\r\n alg: \"A128GCM\",\r\n ext: true,\r\n k: key,\r\n key_ops: [\"encrypt\", \"decrypt\"],\r\n kty: \"oct\",\r\n}, {\r\n name: \"AES-GCM\",\r\n length: _constants__WEBPACK_IMPORTED_MODULE_0__.ENCRYPTION_KEY_BITS,\r\n}, false, // extractable\r\n[usage]);\r\nconst encryptData = (key, data) => __awaiter(void 0, void 0, void 0, function* () {\r\n const importedKey = typeof key === \"string\" ? yield getCryptoKey(key, \"encrypt\") : key;\r\n const iv = createIV();\r\n const buffer = typeof data === \"string\"\r\n ? new TextEncoder().encode(data)\r\n : data instanceof Uint8Array\r\n ? data\r\n : data instanceof Blob\r\n ? yield data.arrayBuffer()\r\n : data;\r\n // We use symmetric encryption. AES-GCM is the recommended algorithm and\r\n // includes checks that the ciphertext has not been modified by an attacker.\r\n const encryptedBuffer = yield window.crypto.subtle.encrypt({\r\n name: \"AES-GCM\",\r\n iv,\r\n }, importedKey, buffer);\r\n return { encryptedBuffer, iv };\r\n});\r\nconst decryptData = (iv, encrypted, privateKey) => __awaiter(void 0, void 0, void 0, function* () {\r\n const key = yield getCryptoKey(privateKey, \"decrypt\");\r\n return window.crypto.subtle.decrypt({\r\n name: \"AES-GCM\",\r\n iv,\r\n }, key, encrypted);\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0lBQ3RELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNqQztRQUNFLElBQUksRUFBRSxTQUFTO1FBQ2YsRUFBRTtLQUNILEVBQ0QsR0FBRyxFQUNILFNBQVMsQ0FDVixDQUFDO0FBQ0osQ0FBQyxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2RhdGEvZW5jcnlwdGlvbi50cz9hZDMxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOQ1JZUFRJT05fS0VZX0JJVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBJVl9MRU5HVEhfQllURVMgPSAxMjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlWID0gKCkgPT4ge1xuICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheShJVl9MRU5HVEhfQllURVMpO1xuICByZXR1cm4gd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUVuY3J5cHRpb25LZXkgPSBhc3luYyA8XG4gIFQgZXh0ZW5kcyBcInN0cmluZ1wiIHwgXCJjcnlwdG9LZXlcIiA9IFwic3RyaW5nXCIsXG4+KFxuICByZXR1cm5Bcz86IFQsXG4pOiBQcm9taXNlPFQgZXh0ZW5kcyBcImNyeXB0b0tleVwiID8gQ3J5cHRvS2V5IDogc3RyaW5nPiA9PiB7XG4gIGNvbnN0IGtleSA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgIHtcbiAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgbGVuZ3RoOiBFTkNSWVBUSU9OX0tFWV9CSVRTLFxuICAgIH0sXG4gICAgdHJ1ZSwgLy8gZXh0cmFjdGFibGVcbiAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXSxcbiAgKTtcbiAgcmV0dXJuIChcbiAgICByZXR1cm5BcyA9PT0gXCJjcnlwdG9LZXlcIlxuICAgICAgPyBrZXlcbiAgICAgIDogKGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleShcImp3a1wiLCBrZXkpKS5rXG4gICkgYXMgVCBleHRlbmRzIFwiY3J5cHRvS2V5XCIgPyBDcnlwdG9LZXkgOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3J5cHRvS2V5ID0gKGtleTogc3RyaW5nLCB1c2FnZTogS2V5VXNhZ2UpID0+XG4gIHdpbmRvdy5jcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICBcImp3a1wiLFxuICAgIHtcbiAgICAgIGFsZzogXCJBMTI4R0NNXCIsXG4gICAgICBleHQ6IHRydWUsXG4gICAgICBrOiBrZXksXG4gICAgICBrZXlfb3BzOiBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXSxcbiAgICAgIGt0eTogXCJvY3RcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgbGVuZ3RoOiBFTkNSWVBUSU9OX0tFWV9CSVRTLFxuICAgIH0sXG4gICAgZmFsc2UsIC8vIGV4dHJhY3RhYmxlXG4gICAgW3VzYWdlXSxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGVuY3J5cHREYXRhID0gYXN5bmMgKFxuICBrZXk6IHN0cmluZyB8IENyeXB0b0tleSxcbiAgZGF0YTogVWludDhBcnJheSB8IEFycmF5QnVmZmVyIHwgQmxvYiB8IEZpbGUgfCBzdHJpbmcsXG4pOiBQcm9taXNlPHsgZW5jcnlwdGVkQnVmZmVyOiBBcnJheUJ1ZmZlcjsgaXY6IFVpbnQ4QXJyYXkgfT4gPT4ge1xuICBjb25zdCBpbXBvcnRlZEtleSA9XG4gICAgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiA/IGF3YWl0IGdldENyeXB0b0tleShrZXksIFwiZW5jcnlwdFwiKSA6IGtleTtcbiAgY29uc3QgaXYgPSBjcmVhdGVJVigpO1xuICBjb25zdCBidWZmZXI6IEFycmF5QnVmZmVyIHwgVWludDhBcnJheSA9XG4gICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGRhdGEpXG4gICAgICA6IGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5XG4gICAgICA/IGRhdGFcbiAgICAgIDogZGF0YSBpbnN0YW5jZW9mIEJsb2JcbiAgICAgID8gYXdhaXQgZGF0YS5hcnJheUJ1ZmZlcigpXG4gICAgICA6IGRhdGE7XG5cbiAgLy8gV2UgdXNlIHN5bW1ldHJpYyBlbmNyeXB0aW9uLiBBRVMtR0NNIGlzIHRoZSByZWNvbW1lbmRlZCBhbGdvcml0aG0gYW5kXG4gIC8vIGluY2x1ZGVzIGNoZWNrcyB0aGF0IHRoZSBjaXBoZXJ0ZXh0IGhhcyBub3QgYmVlbiBtb2RpZmllZCBieSBhbiBhdHRhY2tlci5cbiAgY29uc3QgZW5jcnlwdGVkQnVmZmVyID0gYXdhaXQgd2luZG93LmNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICB7XG4gICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgIGl2LFxuICAgIH0sXG4gICAgaW1wb3J0ZWRLZXksXG4gICAgYnVmZmVyIGFzIEFycmF5QnVmZmVyIHwgVWludDhBcnJheSxcbiAgKTtcblxuICByZXR1cm4geyBlbmNyeXB0ZWRCdWZmZXIsIGl2IH07XG59O1xuXG5leHBvcnQgY29uc3QgZGVjcnlwdERhdGEgPSBhc3luYyAoXG4gIGl2OiBVaW50OEFycmF5LFxuICBlbmNyeXB0ZWQ6IFVpbnQ4QXJyYXkgfCBBcnJheUJ1ZmZlcixcbiAgcHJpdmF0ZUtleTogc3RyaW5nLFxuKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4gPT4ge1xuICBjb25zdCBrZXkgPSBhd2FpdCBnZXRDcnlwdG9LZXkocHJpdmF0ZUtleSwgXCJkZWNyeXB0XCIpO1xuICByZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICB7XG4gICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgIGl2LFxuICAgIH0sXG4gICAga2V5LFxuICAgIGVuY3J5cHRlZCxcbiAgKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../data/encryption.ts\n");
|
|
29
|
+
|
|
30
|
+
/***/ }),
|
|
31
|
+
|
|
32
|
+
/***/ "../../data/image.ts":
|
|
33
|
+
/*!***************************!*\
|
|
34
|
+
!*** ../../data/image.ts ***!
|
|
35
|
+
\***************************/
|
|
36
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
37
|
+
|
|
38
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTEXtChunk\": () => (/* binding */ getTEXtChunk),\n/* harmony export */ \"encodePngMetadata\": () => (/* binding */ encodePngMetadata),\n/* harmony export */ \"decodePngMetadata\": () => (/* binding */ decodePngMetadata),\n/* harmony export */ \"encodeSvgMetadata\": () => (/* binding */ encodeSvgMetadata),\n/* harmony export */ \"decodeSvgMetadata\": () => (/* binding */ decodeSvgMetadata)\n/* harmony export */ });\n/* harmony import */ var png_chunks_extract__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! png-chunks-extract */ \"../../../node_modules/png-chunks-extract/index.js\");\n/* harmony import */ var png_chunks_extract__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(png_chunks_extract__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var png_chunk_text__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! png-chunk-text */ \"../../../node_modules/png-chunk-text/index.js\");\n/* harmony import */ var png_chunks_encode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! png-chunks-encode */ \"../../../node_modules/png-chunks-encode/index.js\");\n/* harmony import */ var png_chunks_encode__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(png_chunks_encode__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _encode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./encode */ \"../../data/encode.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n// -----------------------------------------------------------------------------\r\n// PNG\r\n// -----------------------------------------------------------------------------\r\nconst blobToArrayBuffer = (blob) => {\r\n if (\"arrayBuffer\" in blob) {\r\n return blob.arrayBuffer();\r\n }\r\n // Safari\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n var _a;\r\n if (!((_a = event.target) === null || _a === void 0 ? void 0 : _a.result)) {\r\n return reject(new Error(\"couldn't convert blob to ArrayBuffer\"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n};\r\nconst getTEXtChunk = (blob) => __awaiter(void 0, void 0, void 0, function* () {\r\n const chunks = png_chunks_extract__WEBPACK_IMPORTED_MODULE_0___default()(new Uint8Array(yield blobToArrayBuffer(blob)));\r\n const metadataChunk = chunks.find((chunk) => chunk.name === \"tEXt\");\r\n if (metadataChunk) {\r\n return png_chunk_text__WEBPACK_IMPORTED_MODULE_1__.decode(metadataChunk.data);\r\n }\r\n return null;\r\n});\r\nconst encodePngMetadata = ({ blob, metadata, }) => __awaiter(void 0, void 0, void 0, function* () {\r\n const chunks = png_chunks_extract__WEBPACK_IMPORTED_MODULE_0___default()(new Uint8Array(yield blobToArrayBuffer(blob)));\r\n const metadataChunk = png_chunk_text__WEBPACK_IMPORTED_MODULE_1__.encode(_constants__WEBPACK_IMPORTED_MODULE_4__.MIME_TYPES.excalidraw, JSON.stringify(yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.encode)({\r\n text: metadata,\r\n compress: true,\r\n })));\r\n // insert metadata before last chunk (iEND)\r\n chunks.splice(-1, 0, metadataChunk);\r\n return new Blob([png_chunks_encode__WEBPACK_IMPORTED_MODULE_2___default()(chunks)], { type: _constants__WEBPACK_IMPORTED_MODULE_4__.MIME_TYPES.png });\r\n});\r\nconst decodePngMetadata = (blob) => __awaiter(void 0, void 0, void 0, function* () {\r\n const metadata = yield getTEXtChunk(blob);\r\n if ((metadata === null || metadata === void 0 ? void 0 : metadata.keyword) === _constants__WEBPACK_IMPORTED_MODULE_4__.MIME_TYPES.excalidraw) {\r\n try {\r\n const encodedData = JSON.parse(metadata.text);\r\n if (!(\"encoded\" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if (\"type\" in encodedData &&\r\n encodedData.type === _constants__WEBPACK_IMPORTED_MODULE_4__.EXPORT_DATA_TYPES.excalidraw) {\r\n return metadata.text;\r\n }\r\n throw new Error(\"FAILED\");\r\n }\r\n return yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.decode)(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error(\"FAILED\");\r\n }\r\n }\r\n throw new Error(\"INVALID\");\r\n});\r\n// -----------------------------------------------------------------------------\r\n// SVG\r\n// -----------------------------------------------------------------------------\r\nconst encodeSvgMetadata = ({ text }) => __awaiter(void 0, void 0, void 0, function* () {\r\n const base64 = yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.stringToBase64)(JSON.stringify(yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.encode)({ text })), true /* is already byte string */);\r\n let metadata = \"\";\r\n metadata += `<!-- payload-type:${_constants__WEBPACK_IMPORTED_MODULE_4__.MIME_TYPES.excalidraw} -->`;\r\n metadata += `<!-- payload-version:2 -->`;\r\n metadata += \"<!-- payload-start -->\";\r\n metadata += base64;\r\n metadata += \"<!-- payload-end -->\";\r\n return metadata;\r\n});\r\nconst decodeSvgMetadata = ({ svg }) => __awaiter(void 0, void 0, void 0, function* () {\r\n if (svg.includes(`payload-type:${_constants__WEBPACK_IMPORTED_MODULE_4__.MIME_TYPES.excalidraw}`)) {\r\n const match = svg.match(/<!-- payload-start -->(.+?)<!-- payload-end -->/);\r\n if (!match) {\r\n throw new Error(\"INVALID\");\r\n }\r\n const versionMatch = svg.match(/<!-- payload-version:(\\d+) -->/);\r\n const version = (versionMatch === null || versionMatch === void 0 ? void 0 : versionMatch[1]) || \"1\";\r\n const isByteString = version !== \"1\";\r\n try {\r\n const json = yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.base64ToString)(match[1], isByteString);\r\n const encodedData = JSON.parse(json);\r\n if (!(\"encoded\" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if (\"type\" in encodedData &&\r\n encodedData.type === _constants__WEBPACK_IMPORTED_MODULE_4__.EXPORT_DATA_TYPES.excalidraw) {\r\n return json;\r\n }\r\n throw new Error(\"FAILED\");\r\n }\r\n return yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.decode)(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error(\"FAILED\");\r\n }\r\n }\r\n throw new Error(\"INVALID\");\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Oi8vLy4uLy4uL2RhdGEvaW1hZ2UudHM/MjUwMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZGVjb2RlUG5nIGZyb20gXCJwbmctY2h1bmtzLWV4dHJhY3RcIjtcbmltcG9ydCB0RVh0IGZyb20gXCJwbmctY2h1bmstdGV4dFwiO1xuaW1wb3J0IGVuY29kZVBuZyBmcm9tIFwicG5nLWNodW5rcy1lbmNvZGVcIjtcbmltcG9ydCB7IHN0cmluZ1RvQmFzZTY0LCBlbmNvZGUsIGRlY29kZSwgYmFzZTY0VG9TdHJpbmcgfSBmcm9tIFwiLi9lbmNvZGVcIjtcbmltcG9ydCB7IEVYUE9SVF9EQVRBX1RZUEVTLCBNSU1FX1RZUEVTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUE5HXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBibG9iVG9BcnJheUJ1ZmZlciA9IChibG9iOiBCbG9iKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4gPT4ge1xuICBpZiAoXCJhcnJheUJ1ZmZlclwiIGluIGJsb2IpIHtcbiAgICByZXR1cm4gYmxvYi5hcnJheUJ1ZmZlcigpO1xuICB9XG4gIC8vIFNhZmFyaVxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xuICAgICAgaWYgKCFldmVudC50YXJnZXQ/LnJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcImNvdWxkbid0IGNvbnZlcnQgYmxvYiB0byBBcnJheUJ1ZmZlclwiKSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQgYXMgQXJyYXlCdWZmZXIpO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRURVh0Q2h1bmsgPSBhc3luYyAoXG4gIGJsb2I6IEJsb2IsXG4pOiBQcm9taXNlPHsga2V5d29yZDogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfSB8IG51bGw+ID0+IHtcbiAgY29uc3QgY2h1bmtzID0gZGVjb2RlUG5nKG5ldyBVaW50OEFycmF5KGF3YWl0IGJsb2JUb0FycmF5QnVmZmVyKGJsb2IpKSk7XG4gIGNvbnN0IG1ldGFkYXRhQ2h1bmsgPSBjaHVua3MuZmluZCgoY2h1bmspID0+IGNodW5rLm5hbWUgPT09IFwidEVYdFwiKTtcbiAgaWYgKG1ldGFkYXRhQ2h1bmspIHtcbiAgICByZXR1cm4gdEVYdC5kZWNvZGUobWV0YWRhdGFDaHVuay5kYXRhKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBlbmNvZGVQbmdNZXRhZGF0YSA9IGFzeW5jICh7XG4gIGJsb2IsXG4gIG1ldGFkYXRhLFxufToge1xuICBibG9iOiBCbG9iO1xuICBtZXRhZGF0YTogc3RyaW5nO1xufSkgPT4ge1xuICBjb25zdCBjaHVua3MgPSBkZWNvZGVQbmcobmV3IFVpbnQ4QXJyYXkoYXdhaXQgYmxvYlRvQXJyYXlCdWZmZXIoYmxvYikpKTtcblxuICBjb25zdCBtZXRhZGF0YUNodW5rID0gdEVYdC5lbmNvZGUoXG4gICAgTUlNRV9UWVBFUy5leGNhbGlkcmF3LFxuICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgYXdhaXQgZW5jb2RlKHtcbiAgICAgICAgdGV4dDogbWV0YWRhdGEsXG4gICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgfSksXG4gICAgKSxcbiAgKTtcbiAgLy8gaW5zZXJ0IG1ldGFkYXRhIGJlZm9yZSBsYXN0IGNodW5rIChpRU5EKVxuICBjaHVua3Muc3BsaWNlKC0xLCAwLCBtZXRhZGF0YUNodW5rKTtcblxuICByZXR1cm4gbmV3IEJsb2IoW2VuY29kZVBuZyhjaHVua3MpXSwgeyB0eXBlOiBNSU1FX1RZUEVTLnBuZyB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWNvZGVQbmdNZXRhZGF0YSA9IGFzeW5jIChibG9iOiBCbG9iKSA9PiB7XG4gIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgZ2V0VEVYdENodW5rKGJsb2IpO1xuICBpZiAobWV0YWRhdGE/LmtleXdvcmQgPT09IE1JTUVfVFlQRVMuZXhjYWxpZHJhdykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbmNvZGVkRGF0YSA9IEpTT04ucGFyc2UobWV0YWRhdGEudGV4dCk7XG4gICAgICBpZiAoIShcImVuY29kZWRcIiBpbiBlbmNvZGVkRGF0YSkpIHtcbiAgICAgICAgLy8gbGVnYWN5LCB1bi1lbmNvZGVkIHNjZW5lIEpTT05cbiAgICAgICAgaWYgKFxuICAgICAgICAgIFwidHlwZVwiIGluIGVuY29kZWREYXRhICYmXG4gICAgICAgICAgZW5jb2RlZERhdGEudHlwZSA9PT0gRVhQT1JUX0RBVEFfVFlQRVMuZXhjYWxpZHJhd1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gbWV0YWRhdGEudGV4dDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXdhaXQgZGVjb2RlKGVuY29kZWREYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZBSUxFRFwiKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRFwiKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTVkdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBlbmNvZGVTdmdNZXRhZGF0YSA9IGFzeW5jICh7IHRleHQgfTogeyB0ZXh0OiBzdHJpbmcgfSkgPT4ge1xuICBjb25zdCBiYXNlNjQgPSBhd2FpdCBzdHJpbmdUb0Jhc2U2NChcbiAgICBKU09OLnN0cmluZ2lmeShhd2FpdCBlbmNvZGUoeyB0ZXh0IH0pKSxcbiAgICB0cnVlIC8qIGlzIGFscmVhZHkgYnl0ZSBzdHJpbmcgKi8sXG4gICk7XG5cbiAgbGV0IG1ldGFkYXRhID0gXCJcIjtcbiAgbWV0YWRhdGEgKz0gYDwhLS0gcGF5bG9hZC10eXBlOiR7TUlNRV9UWVBFUy5leGNhbGlkcmF3fSAtLT5gO1xuICBtZXRhZGF0YSArPSBgPCEtLSBwYXlsb2FkLXZlcnNpb246MiAtLT5gO1xuICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC1zdGFydCAtLT5cIjtcbiAgbWV0YWRhdGEgKz0gYmFzZTY0O1xuICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC1lbmQgLS0+XCI7XG4gIHJldHVybiBtZXRhZGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWNvZGVTdmdNZXRhZGF0YSA9IGFzeW5jICh7IHN2ZyB9OiB7IHN2Zzogc3RyaW5nIH0pID0+IHtcbiAgaWYgKHN2Zy5pbmNsdWRlcyhgcGF5bG9hZC10eXBlOiR7TUlNRV9UWVBFUy5leGNhbGlkcmF3fWApKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBzdmcubWF0Y2goLzwhLS0gcGF5bG9hZC1zdGFydCAtLT4oLis/KTwhLS0gcGF5bG9hZC1lbmQgLS0+Lyk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRFwiKTtcbiAgICB9XG4gICAgY29uc3QgdmVyc2lvbk1hdGNoID0gc3ZnLm1hdGNoKC88IS0tIHBheWxvYWQtdmVyc2lvbjooXFxkKykgLS0+Lyk7XG4gICAgY29uc3QgdmVyc2lvbiA9IHZlcnNpb25NYXRjaD8uWzFdIHx8IFwiMVwiO1xuICAgIGNvbnN0IGlzQnl0ZVN0cmluZyA9IHZlcnNpb24gIT09IFwiMVwiO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCBiYXNlNjRUb1N0cmluZyhtYXRjaFsxXSwgaXNCeXRlU3RyaW5nKTtcbiAgICAgIGNvbnN0IGVuY29kZWREYXRhID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgIGlmICghKFwiZW5jb2RlZFwiIGluIGVuY29kZWREYXRhKSkge1xuICAgICAgICAvLyBsZWdhY3ksIHVuLWVuY29kZWQgc2NlbmUgSlNPTlxuICAgICAgICBpZiAoXG4gICAgICAgICAgXCJ0eXBlXCIgaW4gZW5jb2RlZERhdGEgJiZcbiAgICAgICAgICBlbmNvZGVkRGF0YS50eXBlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNhbGlkcmF3XG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZBSUxFRFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCBkZWNvZGUoZW5jb2RlZERhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEXCIpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../data/image.ts\n");
|
|
39
|
+
|
|
40
|
+
/***/ })
|
|
41
|
+
|
|
42
|
+
}]);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* ATTENTION: An "eval-source-map" devtool has been used.
|
|
4
|
+
* This devtool is neither made for production nor for readable output files.
|
|
5
|
+
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
|
6
|
+
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
7
|
+
* or disable the default devtool with "devtool: false".
|
|
8
|
+
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
9
|
+
*/
|
|
10
|
+
(globalThis["webpackChunkExcalidraw"] = globalThis["webpackChunkExcalidraw"] || []).push([["image"],{
|
|
11
|
+
|
|
12
|
+
/***/ "../../data/encode.ts":
|
|
13
|
+
/*!****************************!*\
|
|
14
|
+
!*** ../../data/encode.ts ***!
|
|
15
|
+
\****************************/
|
|
16
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
17
|
+
|
|
18
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"toByteString\": () => (/* binding */ toByteString),\n/* harmony export */ \"stringToBase64\": () => (/* binding */ stringToBase64),\n/* harmony export */ \"base64ToString\": () => (/* binding */ base64ToString),\n/* harmony export */ \"encode\": () => (/* binding */ encode),\n/* harmony export */ \"decode\": () => (/* binding */ decode),\n/* harmony export */ \"compressData\": () => (/* binding */ compressData),\n/* harmony export */ \"decompressData\": () => (/* binding */ decompressData)\n/* harmony export */ });\n/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! pako */ \"../../../node_modules/pako/index.js\");\n/* harmony import */ var pako__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(pako__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _encryption__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./encryption */ \"../../data/encryption.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n// -----------------------------------------------------------------------------\r\n// byte (binary) strings\r\n// -----------------------------------------------------------------------------\r\n// fast, Buffer-compatible implem\r\nconst toByteString = (data) => {\r\n return new Promise((resolve, reject) => {\r\n const blob = typeof data === \"string\"\r\n ? new Blob([new TextEncoder().encode(data)])\r\n : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n if (!event.target || typeof event.target.result !== \"string\") {\r\n return reject(new Error(\"couldn't convert to byte string\"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsBinaryString(blob);\r\n });\r\n};\r\nconst byteStringToArrayBuffer = (byteString) => {\r\n const buffer = new ArrayBuffer(byteString.length);\r\n const bufferView = new Uint8Array(buffer);\r\n for (let i = 0, len = byteString.length; i < len; i++) {\r\n bufferView[i] = byteString.charCodeAt(i);\r\n }\r\n return buffer;\r\n};\r\nconst byteStringToString = (byteString) => {\r\n return new TextDecoder(\"utf-8\").decode(byteStringToArrayBuffer(byteString));\r\n};\r\n// -----------------------------------------------------------------------------\r\n// base64\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * @param isByteString set to true if already byte string to prevent bloat\r\n * due to reencoding\r\n */\r\nconst stringToBase64 = (str, isByteString = false) => __awaiter(void 0, void 0, void 0, function* () {\r\n return isByteString ? window.btoa(str) : window.btoa(yield toByteString(str));\r\n});\r\n// async to align with stringToBase64\r\nconst base64ToString = (base64, isByteString = false) => __awaiter(void 0, void 0, void 0, function* () {\r\n return isByteString\r\n ? window.atob(base64)\r\n : byteStringToString(window.atob(base64));\r\n});\r\n/**\r\n * Encodes (and potentially compresses via zlib) text to byte string\r\n */\r\nconst encode = ({ text, compress, }) => __awaiter(void 0, void 0, void 0, function* () {\r\n let deflated;\r\n if (compress !== false) {\r\n try {\r\n deflated = yield toByteString((0,pako__WEBPACK_IMPORTED_MODULE_0__.deflate)(text));\r\n }\r\n catch (error) {\r\n console.error(\"encode: cannot deflate\", error);\r\n }\r\n }\r\n return {\r\n version: \"1\",\r\n encoding: \"bstring\",\r\n compressed: !!deflated,\r\n encoded: deflated || (yield toByteString(text)),\r\n };\r\n});\r\nconst decode = (data) => __awaiter(void 0, void 0, void 0, function* () {\r\n let decoded;\r\n switch (data.encoding) {\r\n case \"bstring\":\r\n // if compressed, do not double decode the bstring\r\n decoded = data.compressed\r\n ? data.encoded\r\n : yield byteStringToString(data.encoded);\r\n break;\r\n default:\r\n throw new Error(`decode: unknown encoding \"${data.encoding}\"`);\r\n }\r\n if (data.compressed) {\r\n return (0,pako__WEBPACK_IMPORTED_MODULE_0__.inflate)(new Uint8Array(byteStringToArrayBuffer(decoded)), {\r\n to: \"string\",\r\n });\r\n }\r\n return decoded;\r\n});\r\n// -----------------------------------------------------------------------------\r\nconst CONCAT_BUFFERS_VERSION = 1;\r\n/** how many bytes we use to encode how many bytes the next chunk has.\r\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\r\n *\r\n * NOTE ! values must not be changed, which would be backwards incompatible !\r\n */\r\nconst VERSION_DATAVIEW_BYTES = 4;\r\nconst NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4;\r\n// -----------------------------------------------------------------------------\r\nconst DATA_VIEW_BITS_MAP = { 1: 8, 2: 16, 4: 32 };\r\n/**\r\n * abstraction over DataView that serves as a typed getter/setter in case\r\n * you're using constants for the byte size and want to ensure there's no\r\n * discrepenancy in the encoding across refactors.\r\n *\r\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\r\n */\r\nfunction dataView(buffer, bytes, offset, value) {\r\n if (value != null) {\r\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\r\n throw new Error(`attempting to set value higher than the allocated bytes (value: ${value}, bytes: ${bytes})`);\r\n }\r\n const method = `setUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n new DataView(buffer.buffer)[method](offset, value);\r\n return buffer;\r\n }\r\n const method = `getUint${DATA_VIEW_BITS_MAP[bytes]}`;\r\n return new DataView(buffer.buffer)[method](offset);\r\n}\r\n// -----------------------------------------------------------------------------\r\n/**\r\n * Resulting concatenated buffer has this format:\r\n *\r\n * [\r\n * VERSION chunk (4 bytes)\r\n * LENGTH chunk 1 (4 bytes)\r\n * DATA chunk 1 (up to 2^32 bits)\r\n * LENGTH chunk 2 (4 bytes)\r\n * DATA chunk 2 (up to 2^32 bits)\r\n * ...\r\n * ]\r\n *\r\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\r\n */\r\nconst concatBuffers = (...buffers) => {\r\n const bufferView = new Uint8Array(VERSION_DATAVIEW_BYTES +\r\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length +\r\n buffers.reduce((acc, buffer) => acc + buffer.byteLength, 0));\r\n let cursor = 0;\r\n // as the first chunk we'll encode the version for backwards compatibility\r\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n for (const buffer of buffers) {\r\n dataView(bufferView, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor, buffer.byteLength);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n bufferView.set(buffer, cursor);\r\n cursor += buffer.byteLength;\r\n }\r\n return bufferView;\r\n};\r\n/** can only be used on buffers created via `concatBuffers()` */\r\nconst splitBuffers = (concatenatedBuffer) => {\r\n const buffers = [];\r\n let cursor = 0;\r\n // first chunk is the version (ignored for now)\r\n cursor += VERSION_DATAVIEW_BYTES;\r\n while (true) {\r\n const chunkSize = dataView(concatenatedBuffer, NEXT_CHUNK_SIZE_DATAVIEW_BYTES, cursor);\r\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\r\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\r\n cursor += chunkSize;\r\n if (cursor >= concatenatedBuffer.byteLength) {\r\n break;\r\n }\r\n }\r\n return buffers;\r\n};\r\n// helpers for (de)compressing data with JSON metadata including encryption\r\n// -----------------------------------------------------------------------------\r\n/** @private */\r\nconst _encryptAndCompress = (data, encryptionKey) => __awaiter(void 0, void 0, void 0, function* () {\r\n const { encryptedBuffer, iv } = yield (0,_encryption__WEBPACK_IMPORTED_MODULE_1__.encryptData)(encryptionKey, (0,pako__WEBPACK_IMPORTED_MODULE_0__.deflate)(data));\r\n return { iv, buffer: new Uint8Array(encryptedBuffer) };\r\n});\r\n/**\r\n * The returned buffer has following format:\r\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\r\n *\r\n * [\r\n * encodingMetadataBuffer,\r\n * iv,\r\n * [\r\n * contentsMetadataBuffer\r\n * contentsBuffer\r\n * ]\r\n * ]\r\n */\r\nconst compressData = (dataBuffer, options) => __awaiter(void 0, void 0, void 0, function* () {\r\n const fileInfo = {\r\n version: 2,\r\n compression: \"pako@1\",\r\n encryption: \"AES-GCM\",\r\n };\r\n const encodingMetadataBuffer = new TextEncoder().encode(JSON.stringify(fileInfo));\r\n const contentsMetadataBuffer = new TextEncoder().encode(JSON.stringify(options.metadata || null));\r\n const { iv, buffer } = yield _encryptAndCompress(concatBuffers(contentsMetadataBuffer, dataBuffer), options.encryptionKey);\r\n return concatBuffers(encodingMetadataBuffer, iv, buffer);\r\n});\r\n/** @private */\r\nconst _decryptAndDecompress = (iv, decryptedBuffer, decryptionKey, isCompressed) => __awaiter(void 0, void 0, void 0, function* () {\r\n decryptedBuffer = new Uint8Array(yield (0,_encryption__WEBPACK_IMPORTED_MODULE_1__.decryptData)(iv, decryptedBuffer, decryptionKey));\r\n if (isCompressed) {\r\n return (0,pako__WEBPACK_IMPORTED_MODULE_0__.inflate)(decryptedBuffer);\r\n }\r\n return decryptedBuffer;\r\n});\r\nconst decompressData = (bufferView, options) => __awaiter(void 0, void 0, void 0, function* () {\r\n // first chunk is encoding metadata (ignored for now)\r\n const [encodingMetadataBuffer, iv, buffer] = splitBuffers(bufferView);\r\n const encodingMetadata = JSON.parse(new TextDecoder().decode(encodingMetadataBuffer));\r\n try {\r\n const [contentsMetadataBuffer, contentsBuffer] = splitBuffers(yield _decryptAndDecompress(iv, buffer, options.decryptionKey, !!encodingMetadata.compression));\r\n const metadata = JSON.parse(new TextDecoder().decode(contentsMetadataBuffer));\r\n return {\r\n /** metadata source is always JSON so we can decode it here */\r\n metadata,\r\n /** data can be anything so the caller must decode it */\r\n data: contentsBuffer,\r\n };\r\n }\r\n catch (error) {\r\n console.error(`Error during decompressing and decrypting the file.`, encodingMetadata);\r\n throw error;\r\n }\r\n});\r\n// -----------------------------------------------------------------------------\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDLFdBQVcsQ0FDL0IsQ0FDRixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDekIsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FDNUMsQ0FBQztRQUVQLE9BQU87WUFDTCw4REFBOEQ7WUFDOUQsUUFBUTtZQUNSLHdEQUF3RDtZQUN4RCxJQUFJLEVBQUUsY0FBYztTQUNyQixDQUFDO0tBQ0g7SUFBQyxPQUFPLEtBQVUsRUFBRTtRQUNuQixPQUFPLENBQUMsS0FBSyxDQUNYLHFEQUFxRCxFQUNyRCxnQkFBZ0IsQ0FDakIsQ0FBQztRQUNGLE1BQU0sS0FBSyxDQUFDO0tBQ2I7QUFDSCxDQUFDLEVBQUM7QUFFRixnRkFBZ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9lbmNvZGUudHM/OWI4ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWZsYXRlLCBpbmZsYXRlIH0gZnJvbSBcInBha29cIjtcbmltcG9ydCB7IGVuY3J5cHREYXRhLCBkZWNyeXB0RGF0YSB9IGZyb20gXCIuL2VuY3J5cHRpb25cIjtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIGJ5dGUgKGJpbmFyeSkgc3RyaW5nc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gZmFzdCwgQnVmZmVyLWNvbXBhdGlibGUgaW1wbGVtXG5leHBvcnQgY29uc3QgdG9CeXRlU3RyaW5nID0gKFxuICBkYXRhOiBzdHJpbmcgfCBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIsXG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGJsb2IgPVxuICAgICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBuZXcgQmxvYihbbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGRhdGEpXSlcbiAgICAgICAgOiBuZXcgQmxvYihbZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBkYXRhIDogbmV3IFVpbnQ4QXJyYXkoZGF0YSldKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgIGlmICghZXZlbnQudGFyZ2V0IHx8IHR5cGVvZiBldmVudC50YXJnZXQucmVzdWx0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKFwiY291bGRuJ3QgY29udmVydCB0byBieXRlIHN0cmluZ1wiKSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQpO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhibG9iKTtcbiAgfSk7XG59O1xuXG5jb25zdCBieXRlU3RyaW5nVG9BcnJheUJ1ZmZlciA9IChieXRlU3RyaW5nOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmcubGVuZ3RoKTtcbiAgY29uc3QgYnVmZmVyVmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBieXRlU3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYnVmZmVyVmlld1tpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmZmVyO1xufTtcblxuY29uc3QgYnl0ZVN0cmluZ1RvU3RyaW5nID0gKGJ5dGVTdHJpbmc6IHN0cmluZykgPT4ge1xuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKFwidXRmLThcIikuZGVjb2RlKGJ5dGVTdHJpbmdUb0FycmF5QnVmZmVyKGJ5dGVTdHJpbmcpKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBiYXNlNjRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQHBhcmFtIGlzQnl0ZVN0cmluZyBzZXQgdG8gdHJ1ZSBpZiBhbHJlYWR5IGJ5dGUgc3RyaW5nIHRvIHByZXZlbnQgYmxvYXRcbiAqICBkdWUgdG8gcmVlbmNvZGluZ1xuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9CYXNlNjQgPSBhc3luYyAoc3RyOiBzdHJpbmcsIGlzQnl0ZVN0cmluZyA9IGZhbHNlKSA9PiB7XG4gIHJldHVybiBpc0J5dGVTdHJpbmcgPyB3aW5kb3cuYnRvYShzdHIpIDogd2luZG93LmJ0b2EoYXdhaXQgdG9CeXRlU3RyaW5nKHN0cikpO1xufTtcblxuLy8gYXN5bmMgdG8gYWxpZ24gd2l0aCBzdHJpbmdUb0Jhc2U2NFxuZXhwb3J0IGNvbnN0IGJhc2U2NFRvU3RyaW5nID0gYXN5bmMgKGJhc2U2NDogc3RyaW5nLCBpc0J5dGVTdHJpbmcgPSBmYWxzZSkgPT4ge1xuICByZXR1cm4gaXNCeXRlU3RyaW5nXG4gICAgPyB3aW5kb3cuYXRvYihiYXNlNjQpXG4gICAgOiBieXRlU3RyaW5nVG9TdHJpbmcod2luZG93LmF0b2IoYmFzZTY0KSk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gdGV4dCBlbmNvZGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBFbmNvZGVkRGF0YSA9IHtcbiAgZW5jb2RlZDogc3RyaW5nO1xuICBlbmNvZGluZzogXCJic3RyaW5nXCI7XG4gIC8qKiB3aGV0aGVyIHRleHQgaXMgY29tcHJlc3NlZCAoemxpYikgKi9cbiAgY29tcHJlc3NlZDogYm9vbGVhbjtcbiAgLyoqIHZlcnNpb24gZm9yIHBvdGVudGlhbCBtaWdyYXRpb24gcHVycG9zZXMgKi9cbiAgdmVyc2lvbj86IHN0cmluZztcbn07XG5cbi8qKlxuICogRW5jb2RlcyAoYW5kIHBvdGVudGlhbGx5IGNvbXByZXNzZXMgdmlhIHpsaWIpIHRleHQgdG8gYnl0ZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGVuY29kZSA9IGFzeW5jICh7XG4gIHRleHQsXG4gIGNvbXByZXNzLFxufToge1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKiBkZWZhdWx0cyB0byBgdHJ1ZWAuIElmIGNvbXByZXNzaW9uIGZhaWxzLCBmYWxscyBiYWNrIHRvIGJzdHJpbmcgYWxvbmUuICovXG4gIGNvbXByZXNzPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPEVuY29kZWREYXRhPiA9PiB7XG4gIGxldCBkZWZsYXRlZCE6IHN0cmluZztcbiAgaWYgKGNvbXByZXNzICE9PSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICBkZWZsYXRlZCA9IGF3YWl0IHRvQnl0ZVN0cmluZyhkZWZsYXRlKHRleHQpKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiZW5jb2RlOiBjYW5ub3QgZGVmbGF0ZVwiLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogXCIxXCIsXG4gICAgZW5jb2Rpbmc6IFwiYnN0cmluZ1wiLFxuICAgIGNvbXByZXNzZWQ6ICEhZGVmbGF0ZWQsXG4gICAgZW5jb2RlZDogZGVmbGF0ZWQgfHwgKGF3YWl0IHRvQnl0ZVN0cmluZyh0ZXh0KSksXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZGVjb2RlID0gYXN5bmMgKGRhdGE6IEVuY29kZWREYXRhKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgbGV0IGRlY29kZWQ6IHN0cmluZztcblxuICBzd2l0Y2ggKGRhdGEuZW5jb2RpbmcpIHtcbiAgICBjYXNlIFwiYnN0cmluZ1wiOlxuICAgICAgLy8gaWYgY29tcHJlc3NlZCwgZG8gbm90IGRvdWJsZSBkZWNvZGUgdGhlIGJzdHJpbmdcbiAgICAgIGRlY29kZWQgPSBkYXRhLmNvbXByZXNzZWRcbiAgICAgICAgPyBkYXRhLmVuY29kZWRcbiAgICAgICAgOiBhd2FpdCBieXRlU3RyaW5nVG9TdHJpbmcoZGF0YS5lbmNvZGVkKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRlY29kZTogdW5rbm93biBlbmNvZGluZyBcIiR7ZGF0YS5lbmNvZGluZ31cImApO1xuICB9XG5cbiAgaWYgKGRhdGEuY29tcHJlc3NlZCkge1xuICAgIHJldHVybiBpbmZsYXRlKG5ldyBVaW50OEFycmF5KGJ5dGVTdHJpbmdUb0FycmF5QnVmZmVyKGRlY29kZWQpKSwge1xuICAgICAgdG86IFwic3RyaW5nXCIsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZGVjb2RlZDtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBiaW5hcnkgZW5jb2Rpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgRmlsZUVuY29kaW5nSW5mbyA9IHtcbiAgLyogdmVyc2lvbiAyIGlzIHRoZSB2ZXJzaW9uIHdlJ3JlIHNoaXBwaW5nIHRoZSBpbml0aWFsIGltYWdlIHN1cHBvcnQgd2l0aC5cbiAgICB2ZXJzaW9uIDEgd2FzIGEgUFIgdmVyc2lvbiB0aGF0IGEgbG90IG9mIHBlb3BsZSB3ZXJlIHVzaW5nIGFueXdheS5cbiAgICBUaHVzLCBpZiB0aGVyZSBhcmUgaXNzdWVzIHdlIGNhbiBjaGVjayB3aGV0aGVyIHRoZXkncmUgbm90IHVzaW5nIHRoZVxuICAgIHVub2ZmaWMgdmVyc2lvbiAqL1xuICB2ZXJzaW9uOiAxIHwgMjtcbiAgY29tcHJlc3Npb246IFwicGFrb0AxXCIgfCBudWxsO1xuICBlbmNyeXB0aW9uOiBcIkFFUy1HQ01cIiB8IG51bGw7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgQ09OQ0FUX0JVRkZFUlNfVkVSU0lPTiA9IDE7XG4vKiogaG93IG1hbnkgYnl0ZXMgd2UgdXNlIHRvIGVuY29kZSBob3cgbWFueSBieXRlcyB0aGUgbmV4dCBjaHVuayBoYXMuXG4gKiBDb3JyZXNwb25kcyB0byBEYXRhVmlldyBzZXR0ZXIgbWV0aG9kcyAoc2V0VWludDMyLCBzZXRVaW50MTYsIGV0YykuXG4gKlxuICogTk9URSAhIHZhbHVlcyBtdXN0IG5vdCBiZSBjaGFuZ2VkLCB3aGljaCB3b3VsZCBiZSBiYWNrd2FyZHMgaW5jb21wYXRpYmxlICFcbiAqL1xuY29uc3QgVkVSU0lPTl9EQVRBVklFV19CWVRFUyA9IDQ7XG5jb25zdCBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMgPSA0O1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgREFUQV9WSUVXX0JJVFNfTUFQID0geyAxOiA4LCAyOiAxNiwgNDogMzIgfSBhcyBjb25zdDtcblxuLy8gZ2V0dGVyXG5mdW5jdGlvbiBkYXRhVmlldyhidWZmZXI6IFVpbnQ4QXJyYXksIGJ5dGVzOiAxIHwgMiB8IDQsIG9mZnNldDogbnVtYmVyKTogbnVtYmVyO1xuLy8gc2V0dGVyXG5mdW5jdGlvbiBkYXRhVmlldyhcbiAgYnVmZmVyOiBVaW50OEFycmF5LFxuICBieXRlczogMSB8IDIgfCA0LFxuICBvZmZzZXQ6IG51bWJlcixcbiAgdmFsdWU6IG51bWJlcixcbik6IFVpbnQ4QXJyYXk7XG4vKipcbiAqIGFic3RyYWN0aW9uIG92ZXIgRGF0YVZpZXcgdGhhdCBzZXJ2ZXMgYXMgYSB0eXBlZCBnZXR0ZXIvc2V0dGVyIGluIGNhc2VcbiAqIHlvdSdyZSB1c2luZyBjb25zdGFudHMgZm9yIHRoZSBieXRlIHNpemUgYW5kIHdhbnQgdG8gZW5zdXJlIHRoZXJlJ3Mgbm9cbiAqIGRpc2NyZXBlbmFuY3kgaW4gdGhlIGVuY29kaW5nIGFjcm9zcyByZWZhY3RvcnMuXG4gKlxuICogRGF0YVZpZXcgc2VydmVzIGZvciBhbiBlbmRpYW4tYWdub3N0aWMgaGFuZGxpbmcgb2YgbnVtYmVycyBpbiBBcnJheUJ1ZmZlcnMuXG4gKi9cbmZ1bmN0aW9uIGRhdGFWaWV3KFxuICBidWZmZXI6IFVpbnQ4QXJyYXksXG4gIGJ5dGVzOiAxIHwgMiB8IDQsXG4gIG9mZnNldDogbnVtYmVyLFxuICB2YWx1ZT86IG51bWJlcixcbik6IFVpbnQ4QXJyYXkgfCBudW1iZXIge1xuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIGlmICh2YWx1ZSA+IE1hdGgucG93KDIsIERBVEFfVklFV19CSVRTX01BUFtieXRlc10pIC0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYXR0ZW1wdGluZyB0byBzZXQgdmFsdWUgaGlnaGVyIHRoYW4gdGhlIGFsbG9jYXRlZCBieXRlcyAodmFsdWU6ICR7dmFsdWV9LCBieXRlczogJHtieXRlc30pYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9IGBzZXRVaW50JHtEQVRBX1ZJRVdfQklUU19NQVBbYnl0ZXNdfWAgYXMgY29uc3Q7XG4gICAgbmV3IERhdGFWaWV3KGJ1ZmZlci5idWZmZXIpW21ldGhvZF0ob2Zmc2V0LCB2YWx1ZSk7XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbiAgfVxuICBjb25zdCBtZXRob2QgPSBgZ2V0VWludCR7REFUQV9WSUVXX0JJVFNfTUFQW2J5dGVzXX1gIGFzIGNvbnN0O1xuICByZXR1cm4gbmV3IERhdGFWaWV3KGJ1ZmZlci5idWZmZXIpW21ldGhvZF0ob2Zmc2V0KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXN1bHRpbmcgY29uY2F0ZW5hdGVkIGJ1ZmZlciBoYXMgdGhpcyBmb3JtYXQ6XG4gKlxuICogW1xuICogICBWRVJTSU9OIGNodW5rICg0IGJ5dGVzKVxuICogICBMRU5HVEggY2h1bmsgMSAoNCBieXRlcylcbiAqICAgREFUQSBjaHVuayAxICh1cCB0byAyXjMyIGJpdHMpXG4gKiAgIExFTkdUSCBjaHVuayAyICg0IGJ5dGVzKVxuICogICBEQVRBIGNodW5rIDIgKHVwIHRvIDJeMzIgYml0cylcbiAqICAgLi4uXG4gKiBdXG4gKlxuICogQHBhcmFtIGJ1ZmZlcnMgZWFjaCBidWZmZXIgKGNodW5rKSBtdXN0IGJlIGF0IG1vc3QgMl4zMiBiaXRzIGxhcmdlICh+NEdCKVxuICovXG5jb25zdCBjb25jYXRCdWZmZXJzID0gKC4uLmJ1ZmZlcnM6IFVpbnQ4QXJyYXlbXSkgPT4ge1xuICBjb25zdCBidWZmZXJWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgVkVSU0lPTl9EQVRBVklFV19CWVRFUyArXG4gICAgICBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVMgKiBidWZmZXJzLmxlbmd0aCArXG4gICAgICBidWZmZXJzLnJlZHVjZSgoYWNjLCBidWZmZXIpID0+IGFjYyArIGJ1ZmZlci5ieXRlTGVuZ3RoLCAwKSxcbiAgKTtcblxuICBsZXQgY3Vyc29yID0gMDtcblxuICAvLyBhcyB0aGUgZmlyc3QgY2h1bmsgd2UnbGwgZW5jb2RlIHRoZSB2ZXJzaW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBkYXRhVmlldyhidWZmZXJWaWV3LCBWRVJTSU9OX0RBVEFWSUVXX0JZVEVTLCBjdXJzb3IsIENPTkNBVF9CVUZGRVJTX1ZFUlNJT04pO1xuICBjdXJzb3IgKz0gVkVSU0lPTl9EQVRBVklFV19CWVRFUztcblxuICBmb3IgKGNvbnN0IGJ1ZmZlciBvZiBidWZmZXJzKSB7XG4gICAgZGF0YVZpZXcoXG4gICAgICBidWZmZXJWaWV3LFxuICAgICAgTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTLFxuICAgICAgY3Vyc29yLFxuICAgICAgYnVmZmVyLmJ5dGVMZW5ndGgsXG4gICAgKTtcbiAgICBjdXJzb3IgKz0gTkVYVF9DSFVOS19TSVpFX0RBVEFWSUVXX0JZVEVTO1xuXG4gICAgYnVmZmVyVmlldy5zZXQoYnVmZmVyLCBjdXJzb3IpO1xuICAgIGN1cnNvciArPSBidWZmZXIuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBidWZmZXJWaWV3O1xufTtcblxuLyoqIGNhbiBvbmx5IGJlIHVzZWQgb24gYnVmZmVycyBjcmVhdGVkIHZpYSBgY29uY2F0QnVmZmVycygpYCAqL1xuY29uc3Qgc3BsaXRCdWZmZXJzID0gKGNvbmNhdGVuYXRlZEJ1ZmZlcjogVWludDhBcnJheSkgPT4ge1xuICBjb25zdCBidWZmZXJzID0gW107XG5cbiAgbGV0IGN1cnNvciA9IDA7XG5cbiAgLy8gZmlyc3QgY2h1bmsgaXMgdGhlIHZlcnNpb24gKGlnbm9yZWQgZm9yIG5vdylcbiAgY3Vyc29yICs9IFZFUlNJT05fREFUQVZJRVdfQllURVM7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBjaHVua1NpemUgPSBkYXRhVmlldyhcbiAgICAgIGNvbmNhdGVuYXRlZEJ1ZmZlcixcbiAgICAgIE5FWFRfQ0hVTktfU0laRV9EQVRBVklFV19CWVRFUyxcbiAgICAgIGN1cnNvcixcbiAgICApO1xuICAgIGN1cnNvciArPSBORVhUX0NIVU5LX1NJWkVfREFUQVZJRVdfQllURVM7XG5cbiAgICBidWZmZXJzLnB1c2goY29uY2F0ZW5hdGVkQnVmZmVyLnNsaWNlKGN1cnNvciwgY3Vyc29yICsgY2h1bmtTaXplKSk7XG4gICAgY3Vyc29yICs9IGNodW5rU2l6ZTtcbiAgICBpZiAoY3Vyc29yID49IGNvbmNhdGVuYXRlZEJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmZmVycztcbn07XG5cbi8vIGhlbHBlcnMgZm9yIChkZSljb21wcmVzc2luZyBkYXRhIHdpdGggSlNPTiBtZXRhZGF0YSBpbmNsdWRpbmcgZW5jcnlwdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEBwcml2YXRlICovXG5jb25zdCBfZW5jcnlwdEFuZENvbXByZXNzID0gYXN5bmMgKFxuICBkYXRhOiBVaW50OEFycmF5IHwgc3RyaW5nLFxuICBlbmNyeXB0aW9uS2V5OiBzdHJpbmcsXG4pID0+IHtcbiAgY29uc3QgeyBlbmNyeXB0ZWRCdWZmZXIsIGl2IH0gPSBhd2FpdCBlbmNyeXB0RGF0YShcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIGRlZmxhdGUoZGF0YSksXG4gICk7XG5cbiAgcmV0dXJuIHsgaXYsIGJ1ZmZlcjogbmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkQnVmZmVyKSB9O1xufTtcblxuLyoqXG4gKiBUaGUgcmV0dXJuZWQgYnVmZmVyIGhhcyBmb2xsb3dpbmcgZm9ybWF0OlxuICogYFtdYCByZWZlcnMgdG8gYSBidWZmZXJzIHdyYXBwZXIgKHNlZSBgY29uY2F0QnVmZmVyc2ApXG4gKlxuICogW1xuICogICBlbmNvZGluZ01ldGFkYXRhQnVmZmVyLFxuICogICBpdixcbiAqICAgW1xuICogICAgICBjb250ZW50c01ldGFkYXRhQnVmZmVyXG4gKiAgICAgIGNvbnRlbnRzQnVmZmVyXG4gKiAgIF1cbiAqIF1cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXByZXNzRGF0YSA9IGFzeW5jIDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyPihcbiAgZGF0YUJ1ZmZlcjogVWludDhBcnJheSxcbiAgb3B0aW9uczoge1xuICAgIGVuY3J5cHRpb25LZXk6IHN0cmluZztcbiAgfSAmIChbVF0gZXh0ZW5kcyBbbmV2ZXJdXG4gICAgPyB7XG4gICAgICAgIG1ldGFkYXRhPzogVDtcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgbWV0YWRhdGE6IFQ7XG4gICAgICB9KSxcbik6IFByb21pc2U8VWludDhBcnJheT4gPT4ge1xuICBjb25zdCBmaWxlSW5mbzogRmlsZUVuY29kaW5nSW5mbyA9IHtcbiAgICB2ZXJzaW9uOiAyLFxuICAgIGNvbXByZXNzaW9uOiBcInBha29AMVwiLFxuICAgIGVuY3J5cHRpb246IFwiQUVTLUdDTVwiLFxuICB9O1xuXG4gIGNvbnN0IGVuY29kaW5nTWV0YWRhdGFCdWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoXG4gICAgSlNPTi5zdHJpbmdpZnkoZmlsZUluZm8pLFxuICApO1xuXG4gIGNvbnN0IGNvbnRlbnRzTWV0YWRhdGFCdWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoXG4gICAgSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5tZXRhZGF0YSB8fCBudWxsKSxcbiAgKTtcblxuICBjb25zdCB7IGl2LCBidWZmZXIgfSA9IGF3YWl0IF9lbmNyeXB0QW5kQ29tcHJlc3MoXG4gICAgY29uY2F0QnVmZmVycyhjb250ZW50c01ldGFkYXRhQnVmZmVyLCBkYXRhQnVmZmVyKSxcbiAgICBvcHRpb25zLmVuY3J5cHRpb25LZXksXG4gICk7XG5cbiAgcmV0dXJuIGNvbmNhdEJ1ZmZlcnMoZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciwgaXYsIGJ1ZmZlcik7XG59O1xuXG4vKiogQHByaXZhdGUgKi9cbmNvbnN0IF9kZWNyeXB0QW5kRGVjb21wcmVzcyA9IGFzeW5jIChcbiAgaXY6IFVpbnQ4QXJyYXksXG4gIGRlY3J5cHRlZEJ1ZmZlcjogVWludDhBcnJheSxcbiAgZGVjcnlwdGlvbktleTogc3RyaW5nLFxuICBpc0NvbXByZXNzZWQ6IGJvb2xlYW4sXG4pID0+IHtcbiAgZGVjcnlwdGVkQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgYXdhaXQgZGVjcnlwdERhdGEoaXYsIGRlY3J5cHRlZEJ1ZmZlciwgZGVjcnlwdGlvbktleSksXG4gICk7XG5cbiAgaWYgKGlzQ29tcHJlc3NlZCkge1xuICAgIHJldHVybiBpbmZsYXRlKGRlY3J5cHRlZEJ1ZmZlcik7XG4gIH1cblxuICByZXR1cm4gZGVjcnlwdGVkQnVmZmVyO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NEYXRhID0gYXN5bmMgPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgYnVmZmVyVmlldzogVWludDhBcnJheSxcbiAgb3B0aW9uczogeyBkZWNyeXB0aW9uS2V5OiBzdHJpbmcgfSxcbikgPT4ge1xuICAvLyBmaXJzdCBjaHVuayBpcyBlbmNvZGluZyBtZXRhZGF0YSAoaWdub3JlZCBmb3Igbm93KVxuICBjb25zdCBbZW5jb2RpbmdNZXRhZGF0YUJ1ZmZlciwgaXYsIGJ1ZmZlcl0gPSBzcGxpdEJ1ZmZlcnMoYnVmZmVyVmlldyk7XG5cbiAgY29uc3QgZW5jb2RpbmdNZXRhZGF0YTogRmlsZUVuY29kaW5nSW5mbyA9IEpTT04ucGFyc2UoXG4gICAgbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGVuY29kaW5nTWV0YWRhdGFCdWZmZXIpLFxuICApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgW2NvbnRlbnRzTWV0YWRhdGFCdWZmZXIsIGNvbnRlbnRzQnVmZmVyXSA9IHNwbGl0QnVmZmVycyhcbiAgICAgIGF3YWl0IF9kZWNyeXB0QW5kRGVjb21wcmVzcyhcbiAgICAgICAgaXYsXG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgb3B0aW9ucy5kZWNyeXB0aW9uS2V5LFxuICAgICAgICAhIWVuY29kaW5nTWV0YWRhdGEuY29tcHJlc3Npb24sXG4gICAgICApLFxuICAgICk7XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IEpTT04ucGFyc2UoXG4gICAgICBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoY29udGVudHNNZXRhZGF0YUJ1ZmZlciksXG4gICAgKSBhcyBUO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKiBtZXRhZGF0YSBzb3VyY2UgaXMgYWx3YXlzIEpTT04gc28gd2UgY2FuIGRlY29kZSBpdCBoZXJlICovXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIC8qKiBkYXRhIGNhbiBiZSBhbnl0aGluZyBzbyB0aGUgY2FsbGVyIG11c3QgZGVjb2RlIGl0ICovXG4gICAgICBkYXRhOiBjb250ZW50c0J1ZmZlcixcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBFcnJvciBkdXJpbmcgZGVjb21wcmVzc2luZyBhbmQgZGVjcnlwdGluZyB0aGUgZmlsZS5gLFxuICAgICAgZW5jb2RpbmdNZXRhZGF0YSxcbiAgICApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../data/encode.ts\n");
|
|
19
|
+
|
|
20
|
+
/***/ }),
|
|
21
|
+
|
|
22
|
+
/***/ "../../data/encryption.ts":
|
|
23
|
+
/*!********************************!*\
|
|
24
|
+
!*** ../../data/encryption.ts ***!
|
|
25
|
+
\********************************/
|
|
26
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
27
|
+
|
|
28
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"IV_LENGTH_BYTES\": () => (/* binding */ IV_LENGTH_BYTES),\n/* harmony export */ \"createIV\": () => (/* binding */ createIV),\n/* harmony export */ \"generateEncryptionKey\": () => (/* binding */ generateEncryptionKey),\n/* harmony export */ \"getCryptoKey\": () => (/* binding */ getCryptoKey),\n/* harmony export */ \"encryptData\": () => (/* binding */ encryptData),\n/* harmony export */ \"decryptData\": () => (/* binding */ decryptData)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\nconst IV_LENGTH_BYTES = 12;\r\nconst createIV = () => {\r\n const arr = new Uint8Array(IV_LENGTH_BYTES);\r\n return window.crypto.getRandomValues(arr);\r\n};\r\nconst generateEncryptionKey = (returnAs) => __awaiter(void 0, void 0, void 0, function* () {\r\n const key = yield window.crypto.subtle.generateKey({\r\n name: \"AES-GCM\",\r\n length: _constants__WEBPACK_IMPORTED_MODULE_0__.ENCRYPTION_KEY_BITS,\r\n }, true, // extractable\r\n [\"encrypt\", \"decrypt\"]);\r\n return (returnAs === \"cryptoKey\"\r\n ? key\r\n : (yield window.crypto.subtle.exportKey(\"jwk\", key)).k);\r\n});\r\nconst getCryptoKey = (key, usage) => window.crypto.subtle.importKey(\"jwk\", {\r\n alg: \"A128GCM\",\r\n ext: true,\r\n k: key,\r\n key_ops: [\"encrypt\", \"decrypt\"],\r\n kty: \"oct\",\r\n}, {\r\n name: \"AES-GCM\",\r\n length: _constants__WEBPACK_IMPORTED_MODULE_0__.ENCRYPTION_KEY_BITS,\r\n}, false, // extractable\r\n[usage]);\r\nconst encryptData = (key, data) => __awaiter(void 0, void 0, void 0, function* () {\r\n const importedKey = typeof key === \"string\" ? yield getCryptoKey(key, \"encrypt\") : key;\r\n const iv = createIV();\r\n const buffer = typeof data === \"string\"\r\n ? new TextEncoder().encode(data)\r\n : data instanceof Uint8Array\r\n ? data\r\n : data instanceof Blob\r\n ? yield data.arrayBuffer()\r\n : data;\r\n // We use symmetric encryption. AES-GCM is the recommended algorithm and\r\n // includes checks that the ciphertext has not been modified by an attacker.\r\n const encryptedBuffer = yield window.crypto.subtle.encrypt({\r\n name: \"AES-GCM\",\r\n iv,\r\n }, importedKey, buffer);\r\n return { encryptedBuffer, iv };\r\n});\r\nconst decryptData = (iv, encrypted, privateKey) => __awaiter(void 0, void 0, void 0, function* () {\r\n const key = yield getCryptoKey(privateKey, \"decrypt\");\r\n return window.crypto.subtle.decrypt({\r\n name: \"AES-GCM\",\r\n iv,\r\n }, key, encrypted);\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0lBQ3RELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNqQztRQUNFLElBQUksRUFBRSxTQUFTO1FBQ2YsRUFBRTtLQUNILEVBQ0QsR0FBRyxFQUNILFNBQVMsQ0FDVixDQUFDO0FBQ0osQ0FBQyxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2RhdGEvZW5jcnlwdGlvbi50cz9hZDMxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOQ1JZUFRJT05fS0VZX0JJVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBJVl9MRU5HVEhfQllURVMgPSAxMjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlWID0gKCkgPT4ge1xuICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheShJVl9MRU5HVEhfQllURVMpO1xuICByZXR1cm4gd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUVuY3J5cHRpb25LZXkgPSBhc3luYyA8XG4gIFQgZXh0ZW5kcyBcInN0cmluZ1wiIHwgXCJjcnlwdG9LZXlcIiA9IFwic3RyaW5nXCIsXG4+KFxuICByZXR1cm5Bcz86IFQsXG4pOiBQcm9taXNlPFQgZXh0ZW5kcyBcImNyeXB0b0tleVwiID8gQ3J5cHRvS2V5IDogc3RyaW5nPiA9PiB7XG4gIGNvbnN0IGtleSA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgIHtcbiAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgbGVuZ3RoOiBFTkNSWVBUSU9OX0tFWV9CSVRTLFxuICAgIH0sXG4gICAgdHJ1ZSwgLy8gZXh0cmFjdGFibGVcbiAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXSxcbiAgKTtcbiAgcmV0dXJuIChcbiAgICByZXR1cm5BcyA9PT0gXCJjcnlwdG9LZXlcIlxuICAgICAgPyBrZXlcbiAgICAgIDogKGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleShcImp3a1wiLCBrZXkpKS5rXG4gICkgYXMgVCBleHRlbmRzIFwiY3J5cHRvS2V5XCIgPyBDcnlwdG9LZXkgOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3J5cHRvS2V5ID0gKGtleTogc3RyaW5nLCB1c2FnZTogS2V5VXNhZ2UpID0+XG4gIHdpbmRvdy5jcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICBcImp3a1wiLFxuICAgIHtcbiAgICAgIGFsZzogXCJBMTI4R0NNXCIsXG4gICAgICBleHQ6IHRydWUsXG4gICAgICBrOiBrZXksXG4gICAgICBrZXlfb3BzOiBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXSxcbiAgICAgIGt0eTogXCJvY3RcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgbGVuZ3RoOiBFTkNSWVBUSU9OX0tFWV9CSVRTLFxuICAgIH0sXG4gICAgZmFsc2UsIC8vIGV4dHJhY3RhYmxlXG4gICAgW3VzYWdlXSxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGVuY3J5cHREYXRhID0gYXN5bmMgKFxuICBrZXk6IHN0cmluZyB8IENyeXB0b0tleSxcbiAgZGF0YTogVWludDhBcnJheSB8IEFycmF5QnVmZmVyIHwgQmxvYiB8IEZpbGUgfCBzdHJpbmcsXG4pOiBQcm9taXNlPHsgZW5jcnlwdGVkQnVmZmVyOiBBcnJheUJ1ZmZlcjsgaXY6IFVpbnQ4QXJyYXkgfT4gPT4ge1xuICBjb25zdCBpbXBvcnRlZEtleSA9XG4gICAgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiA/IGF3YWl0IGdldENyeXB0b0tleShrZXksIFwiZW5jcnlwdFwiKSA6IGtleTtcbiAgY29uc3QgaXYgPSBjcmVhdGVJVigpO1xuICBjb25zdCBidWZmZXI6IEFycmF5QnVmZmVyIHwgVWludDhBcnJheSA9XG4gICAgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGRhdGEpXG4gICAgICA6IGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5XG4gICAgICA/IGRhdGFcbiAgICAgIDogZGF0YSBpbnN0YW5jZW9mIEJsb2JcbiAgICAgID8gYXdhaXQgZGF0YS5hcnJheUJ1ZmZlcigpXG4gICAgICA6IGRhdGE7XG5cbiAgLy8gV2UgdXNlIHN5bW1ldHJpYyBlbmNyeXB0aW9uLiBBRVMtR0NNIGlzIHRoZSByZWNvbW1lbmRlZCBhbGdvcml0aG0gYW5kXG4gIC8vIGluY2x1ZGVzIGNoZWNrcyB0aGF0IHRoZSBjaXBoZXJ0ZXh0IGhhcyBub3QgYmVlbiBtb2RpZmllZCBieSBhbiBhdHRhY2tlci5cbiAgY29uc3QgZW5jcnlwdGVkQnVmZmVyID0gYXdhaXQgd2luZG93LmNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICB7XG4gICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgIGl2LFxuICAgIH0sXG4gICAgaW1wb3J0ZWRLZXksXG4gICAgYnVmZmVyIGFzIEFycmF5QnVmZmVyIHwgVWludDhBcnJheSxcbiAgKTtcblxuICByZXR1cm4geyBlbmNyeXB0ZWRCdWZmZXIsIGl2IH07XG59O1xuXG5leHBvcnQgY29uc3QgZGVjcnlwdERhdGEgPSBhc3luYyAoXG4gIGl2OiBVaW50OEFycmF5LFxuICBlbmNyeXB0ZWQ6IFVpbnQ4QXJyYXkgfCBBcnJheUJ1ZmZlcixcbiAgcHJpdmF0ZUtleTogc3RyaW5nLFxuKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4gPT4ge1xuICBjb25zdCBrZXkgPSBhd2FpdCBnZXRDcnlwdG9LZXkocHJpdmF0ZUtleSwgXCJkZWNyeXB0XCIpO1xuICByZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICB7XG4gICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgIGl2LFxuICAgIH0sXG4gICAga2V5LFxuICAgIGVuY3J5cHRlZCxcbiAgKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../data/encryption.ts\n");
|
|
29
|
+
|
|
30
|
+
/***/ }),
|
|
31
|
+
|
|
32
|
+
/***/ "../../data/image.ts":
|
|
33
|
+
/*!***************************!*\
|
|
34
|
+
!*** ../../data/image.ts ***!
|
|
35
|
+
\***************************/
|
|
36
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
37
|
+
|
|
38
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getTEXtChunk\": () => (/* binding */ getTEXtChunk),\n/* harmony export */ \"encodePngMetadata\": () => (/* binding */ encodePngMetadata),\n/* harmony export */ \"decodePngMetadata\": () => (/* binding */ decodePngMetadata),\n/* harmony export */ \"encodeSvgMetadata\": () => (/* binding */ encodeSvgMetadata),\n/* harmony export */ \"decodeSvgMetadata\": () => (/* binding */ decodeSvgMetadata)\n/* harmony export */ });\n/* harmony import */ var png_chunks_extract__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! png-chunks-extract */ \"../../../node_modules/png-chunks-extract/index.js\");\n/* harmony import */ var png_chunks_extract__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(png_chunks_extract__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var png_chunk_text__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! png-chunk-text */ \"../../../node_modules/png-chunk-text/index.js\");\n/* harmony import */ var png_chunks_encode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! png-chunks-encode */ \"../../../node_modules/png-chunks-encode/index.js\");\n/* harmony import */ var png_chunks_encode__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(png_chunks_encode__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _encode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./encode */ \"../../data/encode.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n// -----------------------------------------------------------------------------\r\n// PNG\r\n// -----------------------------------------------------------------------------\r\nconst blobToArrayBuffer = (blob) => {\r\n if (\"arrayBuffer\" in blob) {\r\n return blob.arrayBuffer();\r\n }\r\n // Safari\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n var _a;\r\n if (!((_a = event.target) === null || _a === void 0 ? void 0 : _a.result)) {\r\n return reject(new Error(\"couldn't convert blob to ArrayBuffer\"));\r\n }\r\n resolve(event.target.result);\r\n };\r\n reader.readAsArrayBuffer(blob);\r\n });\r\n};\r\nconst getTEXtChunk = (blob) => __awaiter(void 0, void 0, void 0, function* () {\r\n const chunks = png_chunks_extract__WEBPACK_IMPORTED_MODULE_0___default()(new Uint8Array(yield blobToArrayBuffer(blob)));\r\n const metadataChunk = chunks.find((chunk) => chunk.name === \"tEXt\");\r\n if (metadataChunk) {\r\n return png_chunk_text__WEBPACK_IMPORTED_MODULE_1__.decode(metadataChunk.data);\r\n }\r\n return null;\r\n});\r\nconst encodePngMetadata = ({ blob, metadata, }) => __awaiter(void 0, void 0, void 0, function* () {\r\n const chunks = png_chunks_extract__WEBPACK_IMPORTED_MODULE_0___default()(new Uint8Array(yield blobToArrayBuffer(blob)));\r\n const metadataChunk = png_chunk_text__WEBPACK_IMPORTED_MODULE_1__.encode(_constants__WEBPACK_IMPORTED_MODULE_4__.MIME_TYPES.excalidraw, JSON.stringify(yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.encode)({\r\n text: metadata,\r\n compress: true,\r\n })));\r\n // insert metadata before last chunk (iEND)\r\n chunks.splice(-1, 0, metadataChunk);\r\n return new Blob([png_chunks_encode__WEBPACK_IMPORTED_MODULE_2___default()(chunks)], { type: _constants__WEBPACK_IMPORTED_MODULE_4__.MIME_TYPES.png });\r\n});\r\nconst decodePngMetadata = (blob) => __awaiter(void 0, void 0, void 0, function* () {\r\n const metadata = yield getTEXtChunk(blob);\r\n if ((metadata === null || metadata === void 0 ? void 0 : metadata.keyword) === _constants__WEBPACK_IMPORTED_MODULE_4__.MIME_TYPES.excalidraw) {\r\n try {\r\n const encodedData = JSON.parse(metadata.text);\r\n if (!(\"encoded\" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if (\"type\" in encodedData &&\r\n encodedData.type === _constants__WEBPACK_IMPORTED_MODULE_4__.EXPORT_DATA_TYPES.excalidraw) {\r\n return metadata.text;\r\n }\r\n throw new Error(\"FAILED\");\r\n }\r\n return yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.decode)(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error(\"FAILED\");\r\n }\r\n }\r\n throw new Error(\"INVALID\");\r\n});\r\n// -----------------------------------------------------------------------------\r\n// SVG\r\n// -----------------------------------------------------------------------------\r\nconst encodeSvgMetadata = ({ text }) => __awaiter(void 0, void 0, void 0, function* () {\r\n const base64 = yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.stringToBase64)(JSON.stringify(yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.encode)({ text })), true /* is already byte string */);\r\n let metadata = \"\";\r\n metadata += `<!-- payload-type:${_constants__WEBPACK_IMPORTED_MODULE_4__.MIME_TYPES.excalidraw} -->`;\r\n metadata += `<!-- payload-version:2 -->`;\r\n metadata += \"<!-- payload-start -->\";\r\n metadata += base64;\r\n metadata += \"<!-- payload-end -->\";\r\n return metadata;\r\n});\r\nconst decodeSvgMetadata = ({ svg }) => __awaiter(void 0, void 0, void 0, function* () {\r\n if (svg.includes(`payload-type:${_constants__WEBPACK_IMPORTED_MODULE_4__.MIME_TYPES.excalidraw}`)) {\r\n const match = svg.match(/<!-- payload-start -->(.+?)<!-- payload-end -->/);\r\n if (!match) {\r\n throw new Error(\"INVALID\");\r\n }\r\n const versionMatch = svg.match(/<!-- payload-version:(\\d+) -->/);\r\n const version = (versionMatch === null || versionMatch === void 0 ? void 0 : versionMatch[1]) || \"1\";\r\n const isByteString = version !== \"1\";\r\n try {\r\n const json = yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.base64ToString)(match[1], isByteString);\r\n const encodedData = JSON.parse(json);\r\n if (!(\"encoded\" in encodedData)) {\r\n // legacy, un-encoded scene JSON\r\n if (\"type\" in encodedData &&\r\n encodedData.type === _constants__WEBPACK_IMPORTED_MODULE_4__.EXPORT_DATA_TYPES.excalidraw) {\r\n return json;\r\n }\r\n throw new Error(\"FAILED\");\r\n }\r\n return yield (0,_encode__WEBPACK_IMPORTED_MODULE_3__.decode)(encodedData);\r\n }\r\n catch (error) {\r\n console.error(error);\r\n throw new Error(\"FAILED\");\r\n }\r\n }\r\n throw new Error(\"INVALID\");\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Oi8vLy4uLy4uL2RhdGEvaW1hZ2UudHM/MjUwMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZGVjb2RlUG5nIGZyb20gXCJwbmctY2h1bmtzLWV4dHJhY3RcIjtcbmltcG9ydCB0RVh0IGZyb20gXCJwbmctY2h1bmstdGV4dFwiO1xuaW1wb3J0IGVuY29kZVBuZyBmcm9tIFwicG5nLWNodW5rcy1lbmNvZGVcIjtcbmltcG9ydCB7IHN0cmluZ1RvQmFzZTY0LCBlbmNvZGUsIGRlY29kZSwgYmFzZTY0VG9TdHJpbmcgfSBmcm9tIFwiLi9lbmNvZGVcIjtcbmltcG9ydCB7IEVYUE9SVF9EQVRBX1RZUEVTLCBNSU1FX1RZUEVTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUE5HXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBibG9iVG9BcnJheUJ1ZmZlciA9IChibG9iOiBCbG9iKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4gPT4ge1xuICBpZiAoXCJhcnJheUJ1ZmZlclwiIGluIGJsb2IpIHtcbiAgICByZXR1cm4gYmxvYi5hcnJheUJ1ZmZlcigpO1xuICB9XG4gIC8vIFNhZmFyaVxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xuICAgICAgaWYgKCFldmVudC50YXJnZXQ/LnJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcImNvdWxkbid0IGNvbnZlcnQgYmxvYiB0byBBcnJheUJ1ZmZlclwiKSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQgYXMgQXJyYXlCdWZmZXIpO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRURVh0Q2h1bmsgPSBhc3luYyAoXG4gIGJsb2I6IEJsb2IsXG4pOiBQcm9taXNlPHsga2V5d29yZDogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfSB8IG51bGw+ID0+IHtcbiAgY29uc3QgY2h1bmtzID0gZGVjb2RlUG5nKG5ldyBVaW50OEFycmF5KGF3YWl0IGJsb2JUb0FycmF5QnVmZmVyKGJsb2IpKSk7XG4gIGNvbnN0IG1ldGFkYXRhQ2h1bmsgPSBjaHVua3MuZmluZCgoY2h1bmspID0+IGNodW5rLm5hbWUgPT09IFwidEVYdFwiKTtcbiAgaWYgKG1ldGFkYXRhQ2h1bmspIHtcbiAgICByZXR1cm4gdEVYdC5kZWNvZGUobWV0YWRhdGFDaHVuay5kYXRhKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBlbmNvZGVQbmdNZXRhZGF0YSA9IGFzeW5jICh7XG4gIGJsb2IsXG4gIG1ldGFkYXRhLFxufToge1xuICBibG9iOiBCbG9iO1xuICBtZXRhZGF0YTogc3RyaW5nO1xufSkgPT4ge1xuICBjb25zdCBjaHVua3MgPSBkZWNvZGVQbmcobmV3IFVpbnQ4QXJyYXkoYXdhaXQgYmxvYlRvQXJyYXlCdWZmZXIoYmxvYikpKTtcblxuICBjb25zdCBtZXRhZGF0YUNodW5rID0gdEVYdC5lbmNvZGUoXG4gICAgTUlNRV9UWVBFUy5leGNhbGlkcmF3LFxuICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgYXdhaXQgZW5jb2RlKHtcbiAgICAgICAgdGV4dDogbWV0YWRhdGEsXG4gICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgfSksXG4gICAgKSxcbiAgKTtcbiAgLy8gaW5zZXJ0IG1ldGFkYXRhIGJlZm9yZSBsYXN0IGNodW5rIChpRU5EKVxuICBjaHVua3Muc3BsaWNlKC0xLCAwLCBtZXRhZGF0YUNodW5rKTtcblxuICByZXR1cm4gbmV3IEJsb2IoW2VuY29kZVBuZyhjaHVua3MpXSwgeyB0eXBlOiBNSU1FX1RZUEVTLnBuZyB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWNvZGVQbmdNZXRhZGF0YSA9IGFzeW5jIChibG9iOiBCbG9iKSA9PiB7XG4gIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgZ2V0VEVYdENodW5rKGJsb2IpO1xuICBpZiAobWV0YWRhdGE/LmtleXdvcmQgPT09IE1JTUVfVFlQRVMuZXhjYWxpZHJhdykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbmNvZGVkRGF0YSA9IEpTT04ucGFyc2UobWV0YWRhdGEudGV4dCk7XG4gICAgICBpZiAoIShcImVuY29kZWRcIiBpbiBlbmNvZGVkRGF0YSkpIHtcbiAgICAgICAgLy8gbGVnYWN5LCB1bi1lbmNvZGVkIHNjZW5lIEpTT05cbiAgICAgICAgaWYgKFxuICAgICAgICAgIFwidHlwZVwiIGluIGVuY29kZWREYXRhICYmXG4gICAgICAgICAgZW5jb2RlZERhdGEudHlwZSA9PT0gRVhQT1JUX0RBVEFfVFlQRVMuZXhjYWxpZHJhd1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gbWV0YWRhdGEudGV4dDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGQUlMRURcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXdhaXQgZGVjb2RlKGVuY29kZWREYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZBSUxFRFwiKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRFwiKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTVkdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBlbmNvZGVTdmdNZXRhZGF0YSA9IGFzeW5jICh7IHRleHQgfTogeyB0ZXh0OiBzdHJpbmcgfSkgPT4ge1xuICBjb25zdCBiYXNlNjQgPSBhd2FpdCBzdHJpbmdUb0Jhc2U2NChcbiAgICBKU09OLnN0cmluZ2lmeShhd2FpdCBlbmNvZGUoeyB0ZXh0IH0pKSxcbiAgICB0cnVlIC8qIGlzIGFscmVhZHkgYnl0ZSBzdHJpbmcgKi8sXG4gICk7XG5cbiAgbGV0IG1ldGFkYXRhID0gXCJcIjtcbiAgbWV0YWRhdGEgKz0gYDwhLS0gcGF5bG9hZC10eXBlOiR7TUlNRV9UWVBFUy5leGNhbGlkcmF3fSAtLT5gO1xuICBtZXRhZGF0YSArPSBgPCEtLSBwYXlsb2FkLXZlcnNpb246MiAtLT5gO1xuICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC1zdGFydCAtLT5cIjtcbiAgbWV0YWRhdGEgKz0gYmFzZTY0O1xuICBtZXRhZGF0YSArPSBcIjwhLS0gcGF5bG9hZC1lbmQgLS0+XCI7XG4gIHJldHVybiBtZXRhZGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWNvZGVTdmdNZXRhZGF0YSA9IGFzeW5jICh7IHN2ZyB9OiB7IHN2Zzogc3RyaW5nIH0pID0+IHtcbiAgaWYgKHN2Zy5pbmNsdWRlcyhgcGF5bG9hZC10eXBlOiR7TUlNRV9UWVBFUy5leGNhbGlkcmF3fWApKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBzdmcubWF0Y2goLzwhLS0gcGF5bG9hZC1zdGFydCAtLT4oLis/KTwhLS0gcGF5bG9hZC1lbmQgLS0+Lyk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSU5WQUxJRFwiKTtcbiAgICB9XG4gICAgY29uc3QgdmVyc2lvbk1hdGNoID0gc3ZnLm1hdGNoKC88IS0tIHBheWxvYWQtdmVyc2lvbjooXFxkKykgLS0+Lyk7XG4gICAgY29uc3QgdmVyc2lvbiA9IHZlcnNpb25NYXRjaD8uWzFdIHx8IFwiMVwiO1xuICAgIGNvbnN0IGlzQnl0ZVN0cmluZyA9IHZlcnNpb24gIT09IFwiMVwiO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCBiYXNlNjRUb1N0cmluZyhtYXRjaFsxXSwgaXNCeXRlU3RyaW5nKTtcbiAgICAgIGNvbnN0IGVuY29kZWREYXRhID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgIGlmICghKFwiZW5jb2RlZFwiIGluIGVuY29kZWREYXRhKSkge1xuICAgICAgICAvLyBsZWdhY3ksIHVuLWVuY29kZWQgc2NlbmUgSlNPTlxuICAgICAgICBpZiAoXG4gICAgICAgICAgXCJ0eXBlXCIgaW4gZW5jb2RlZERhdGEgJiZcbiAgICAgICAgICBlbmNvZGVkRGF0YS50eXBlID09PSBFWFBPUlRfREFUQV9UWVBFUy5leGNhbGlkcmF3XG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZBSUxFRFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCBkZWNvZGUoZW5jb2RlZERhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRkFJTEVEXCIpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJJTlZBTElEXCIpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../data/image.ts\n");
|
|
39
|
+
|
|
40
|
+
/***/ })
|
|
41
|
+
|
|
42
|
+
}]);
|