@excalidraw/excalidraw 0.17.1-a38e82f → 0.17.1-b7babe5

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.
Files changed (40) hide show
  1. package/CHANGELOG.md +5 -1
  2. package/dist/browser/dev/excalidraw-assets-dev/{chunk-IM4WTX2M.js → chunk-6NMK7JTV.js} +2 -1
  3. package/dist/browser/dev/excalidraw-assets-dev/chunk-6NMK7JTV.js.map +7 -0
  4. package/dist/browser/dev/excalidraw-assets-dev/{chunk-5VWQDKDR.js → chunk-CX3RATXT.js} +50 -5
  5. package/dist/browser/dev/excalidraw-assets-dev/chunk-CX3RATXT.js.map +7 -0
  6. package/dist/browser/dev/excalidraw-assets-dev/{en-IOBA4CS2.js → en-BZY7JRTM.js} +2 -2
  7. package/dist/browser/dev/excalidraw-assets-dev/{image-VKDAL6BQ.js → image-CVN3YKRW.js} +2 -2
  8. package/dist/browser/dev/index.js +332 -76
  9. package/dist/browser/dev/index.js.map +4 -4
  10. package/dist/browser/prod/excalidraw-assets/{chunk-N2C5DK3B.js → chunk-VJAIK3AX.js} +15 -15
  11. package/dist/browser/prod/excalidraw-assets/{chunk-LIG3S5TN.js → chunk-YYO5DFUW.js} +3 -3
  12. package/dist/browser/prod/excalidraw-assets/{en-WFZVQ7I6.js → en-O2YCQM2W.js} +1 -1
  13. package/dist/browser/prod/excalidraw-assets/image-6FKY54X5.js +1 -0
  14. package/dist/browser/prod/index.js +16 -16
  15. package/dist/{prod/en-TDNWCAOT.json → dev/en-EY7E2L5O.json} +1 -0
  16. package/dist/dev/index.js +372 -77
  17. package/dist/dev/index.js.map +3 -3
  18. package/dist/excalidraw/data/library.d.ts +60 -8
  19. package/dist/excalidraw/data/library.js +302 -33
  20. package/dist/excalidraw/element/index.d.ts +8 -0
  21. package/dist/excalidraw/element/index.js +23 -0
  22. package/dist/excalidraw/element/textElement.d.ts +16 -1
  23. package/dist/excalidraw/element/textElement.js +10 -3
  24. package/dist/excalidraw/index.d.ts +2 -2
  25. package/dist/excalidraw/index.js +2 -2
  26. package/dist/excalidraw/locales/en.json +1 -0
  27. package/dist/excalidraw/queue.d.ts +9 -0
  28. package/dist/excalidraw/queue.js +27 -0
  29. package/dist/excalidraw/types.d.ts +6 -6
  30. package/dist/excalidraw/utility-types.d.ts +2 -0
  31. package/dist/excalidraw/utils.d.ts +3 -1
  32. package/dist/excalidraw/utils.js +6 -0
  33. package/dist/{dev/en-TDNWCAOT.json → prod/en-EY7E2L5O.json} +1 -0
  34. package/dist/prod/index.js +26 -26
  35. package/package.json +1 -1
  36. package/dist/browser/dev/excalidraw-assets-dev/chunk-5VWQDKDR.js.map +0 -7
  37. package/dist/browser/dev/excalidraw-assets-dev/chunk-IM4WTX2M.js.map +0 -7
  38. package/dist/browser/prod/excalidraw-assets/image-4AT7LYMR.js +0 -1
  39. /package/dist/browser/dev/excalidraw-assets-dev/{en-IOBA4CS2.js.map → en-BZY7JRTM.js.map} +0 -0
  40. /package/dist/browser/dev/excalidraw-assets-dev/{image-VKDAL6BQ.js.map → image-CVN3YKRW.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../node_modules/crc-32/crc32.js", "../../../../../../node_modules/png-chunks-extract/index.js", "../../../../../../node_modules/png-chunk-text/encode.js", "../../../../../../node_modules/png-chunk-text/decode.js", "../../../../../../node_modules/png-chunk-text/index.js", "../../../../../../node_modules/sliced/index.js", "../../../../../../node_modules/png-chunks-encode/index.js", "../../../../../../node_modules/pako/lib/utils/common.js", "../../../../../../node_modules/pako/lib/zlib/trees.js", "../../../../../../node_modules/pako/lib/zlib/adler32.js", "../../../../../../node_modules/pako/lib/zlib/crc32.js", "../../../../../../node_modules/pako/lib/zlib/messages.js", "../../../../../../node_modules/pako/lib/zlib/deflate.js", "../../../../../../node_modules/pako/lib/utils/strings.js", "../../../../../../node_modules/pako/lib/zlib/zstream.js", "../../../../../../node_modules/pako/lib/deflate.js", "../../../../../../node_modules/pako/lib/zlib/inffast.js", "../../../../../../node_modules/pako/lib/zlib/inftrees.js", "../../../../../../node_modules/pako/lib/zlib/inflate.js", "../../../../../../node_modules/pako/lib/zlib/constants.js", "../../../../../../node_modules/pako/lib/zlib/gzheader.js", "../../../../../../node_modules/pako/lib/inflate.js", "../../../../../../node_modules/pako/index.js", "../../../../../../node_modules/@braintree/sanitize-url/dist/index.js", "../../../../data/image.ts", "../../../../data/encode.ts", "../../../../data/encryption.ts", "../../../../constants.ts", "../../../../css/variables.module.scss", "../../../../colors.ts", "../../../../../../node_modules/open-color/open-color.json", "../../../../data/blob.ts", "../../../../node_modules/nanoid/index.browser.js", "../../../../node_modules/nanoid/url-alphabet/index.js", "../../../../appState.ts", "../../../../element/index.ts", "../../../../element/sizeHelpers.ts", "../../../../element/mutateElement.ts", "../../../../scene/Scene.ts", "../../../../element/typeChecks.ts", "../../../../utils.ts", "../../../../scene/selection.ts", "../../../../frame.ts", "../../../../math.ts", "../../../../element/bounds.ts", "../../../../../../node_modules/roughjs/bin/rough.js", "../../../../../../node_modules/roughjs/bin/canvas.js", "../../../../../../node_modules/roughjs/bin/generator.js", "../../../../../../node_modules/roughjs/bin/renderer.js", "../../../../../../node_modules/roughjs/bin/fillers/filler.js", "../../../../../../node_modules/roughjs/bin/fillers/hachure-filler.js", "../../../../../../node_modules/roughjs/bin/fillers/scan-line-hachure.js", "../../../../../../node_modules/hachure-fill/bin/hachure.js", "../../../../../../node_modules/roughjs/bin/fillers/zigzag-filler.js", "../../../../../../node_modules/roughjs/bin/geometry.js", "../../../../../../node_modules/roughjs/bin/fillers/hatch-filler.js", "../../../../../../node_modules/roughjs/bin/fillers/dot-filler.js", "../../../../../../node_modules/roughjs/bin/fillers/dashed-filler.js", "../../../../../../node_modules/roughjs/bin/fillers/zigzag-line-filler.js", "../../../../../../node_modules/roughjs/bin/math.js", "../../../../../../node_modules/path-data-parser/lib/index.js", "../../../../../../node_modules/path-data-parser/lib/parser.js", "../../../../../../node_modules/path-data-parser/lib/absolutize.js", "../../../../../../node_modules/path-data-parser/lib/normalize.js", "../../../../../../node_modules/points-on-curve/lib/curve-to-bezier.js", "../../../../../../node_modules/points-on-curve/lib/index.js", "../../../../../../node_modules/points-on-path/lib/index.js", "../../../../../../node_modules/roughjs/bin/svg.js", "../../../../../../node_modules/roughjs/bin/core.js", "../../../../scene/Shape.ts", "../../../../renderer/renderElement.ts", "../../../../../../node_modules/perfect-freehand/dist/esm/index.js", "../../../../element/textElement.ts", "../../../../element/linearElementEditor.ts", "../../../../element/binding.ts", "../../../../scene/index.ts", "../../../../scene/scroll.ts", "../../../../scene/comparisons.ts", "../../../../scene/zoom.ts", "../../../../element/collision.ts", "../../../../ga.ts", "../../../../gapoints.ts", "../../../../galines.ts", "../../../../gadirections.ts", "../../../../gatransforms.ts", "../../../../node_modules/points-on-curve/lib/index.js", "../../../../element/transformHandles.ts", "../../../../scene/ShapeCache.ts", "../../../../keys.ts", "../../../../element/containerCache.ts", "../../../../points.ts", "../../../../groups.ts", "../../../../../utils/index.ts", "../../../../../utils/export.ts", "../../../../scene/export.ts", "../../../../renderer/staticSvgScene.ts", "../../../../data/url.ts", "../../../../element/embeddable.ts", "../../../../actions/register.ts", "../../../../cursor.ts", "../../../../element/newElement.ts", "../../../../random.ts", "../../../../data/json.ts", "../../../../data/filesystem.ts", "../../../../../../node_modules/browser-fs-access/dist/index.mjs", "../../../../errors.ts", "../../../../element/image.ts", "../../../../renderer/staticScene.ts", "../../../../components/hyperlink/helpers.ts", "../../../../renderer/helpers.ts", "../../../../data/restore.ts", "../../../../clipboard.ts", "../../../../charts.ts", "../../../../../utils/withinBounds.ts", "../../../../../utils/bbox.ts", "../../../../element/resizeTest.ts", "../../../../element/resizeElements.ts", "../../../../element/dragElements.ts", "../../../../element/showSelectedShapeActions.ts"],
4
+ "sourcesContent": ["/* crc32.js (C) 2014-2015 SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\nvar CRC32;\n(function (factory) {\n\tif(typeof DO_NOT_EXPORT_CRC === 'undefined') {\n\t\tif('object' === typeof exports) {\n\t\t\tfactory(exports);\n\t\t} else if ('function' === typeof define && define.amd) {\n\t\t\tdefine(function () {\n\t\t\t\tvar module = {};\n\t\t\t\tfactory(module);\n\t\t\t\treturn module;\n\t\t\t});\n\t\t} else {\n\t\t factory(CRC32 = {});\n\t\t}\n\t} else {\n\t\tfactory(CRC32 = {});\n\t}\n}(function(CRC32) {\nCRC32.version = '0.3.0';\n/* see perf/crc32table.js */\nfunction signed_crc_table() {\n\tvar c = 0, table = new Array(256);\n\n\tfor(var n =0; n != 256; ++n){\n\t\tc = n;\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\ttable[n] = c;\n\t}\n\n\treturn typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;\n}\n\nvar table = signed_crc_table();\n/* charCodeAt is the best approach for binary strings */\nvar use_buffer = typeof Buffer !== 'undefined';\nfunction crc32_bstr(bstr) {\n\tif(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr));\n\tvar crc = -1, L = bstr.length - 1;\n\tfor(var i = 0; i < L;) {\n\t\tcrc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);\n\t\tcrc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);\n\t}\n\tif(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF];\n\treturn crc ^ -1;\n}\n\nfunction crc32_buf(buf) {\n\tif(buf.length > 10000) return crc32_buf_8(buf);\n\tfor(var crc = -1, i = 0, L=buf.length-3; i < L;) {\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t}\n\twhile(i < L+3) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\treturn crc ^ -1;\n}\n\nfunction crc32_buf_8(buf) {\n\tfor(var crc = -1, i = 0, L=buf.length-7; i < L;) {\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t}\n\twhile(i < L+7) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\treturn crc ^ -1;\n}\n\n/* much much faster to intertwine utf8 and crc */\nfunction crc32_str(str) {\n\tfor(var crc = -1, i = 0, L=str.length, c, d; i < L;) {\n\t\tc = str.charCodeAt(i++);\n\t\tif(c < 0x80) {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF];\n\t\t} else if(c < 0x800) {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (192|((c>>6)&31))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF];\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64; d = str.charCodeAt(i++) & 1023;\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (240|((c>>8)&7))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((c>>2)&63))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((d>>6)&15)|(c&3))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF];\n\t\t} else {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (224|((c>>12)&15))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((c>>6)&63))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF];\n\t\t}\n\t}\n\treturn crc ^ -1;\n}\nCRC32.table = table;\nCRC32.bstr = crc32_bstr;\nCRC32.buf = crc32_buf;\nCRC32.str = crc32_str;\n}));\n", "var crc32 = require('crc-32')\n\nmodule.exports = extractChunks\n\n// Used for fast-ish conversion between uint8s and uint32s/int32s.\n// Also required in order to remain agnostic for both Node Buffers and\n// Uint8Arrays.\nvar uint8 = new Uint8Array(4)\nvar int32 = new Int32Array(uint8.buffer)\nvar uint32 = new Uint32Array(uint8.buffer)\n\nfunction extractChunks (data) {\n if (data[0] !== 0x89) throw new Error('Invalid .png file header')\n if (data[1] !== 0x50) throw new Error('Invalid .png file header')\n if (data[2] !== 0x4E) throw new Error('Invalid .png file header')\n if (data[3] !== 0x47) throw new Error('Invalid .png file header')\n if (data[4] !== 0x0D) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n if (data[5] !== 0x0A) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n if (data[6] !== 0x1A) throw new Error('Invalid .png file header')\n if (data[7] !== 0x0A) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n\n var ended = false\n var chunks = []\n var idx = 8\n\n while (idx < data.length) {\n // Read the length of the current chunk,\n // which is stored as a Uint32.\n uint8[3] = data[idx++]\n uint8[2] = data[idx++]\n uint8[1] = data[idx++]\n uint8[0] = data[idx++]\n\n // Chunk includes name/type for CRC check (see below).\n var length = uint32[0] + 4\n var chunk = new Uint8Array(length)\n chunk[0] = data[idx++]\n chunk[1] = data[idx++]\n chunk[2] = data[idx++]\n chunk[3] = data[idx++]\n\n // Get the name in ASCII for identification.\n var name = (\n String.fromCharCode(chunk[0]) +\n String.fromCharCode(chunk[1]) +\n String.fromCharCode(chunk[2]) +\n String.fromCharCode(chunk[3])\n )\n\n // The IHDR header MUST come first.\n if (!chunks.length && name !== 'IHDR') {\n throw new Error('IHDR header missing')\n }\n\n // The IEND header marks the end of the file,\n // so on discovering it break out of the loop.\n if (name === 'IEND') {\n ended = true\n chunks.push({\n name: name,\n data: new Uint8Array(0)\n })\n\n break\n }\n\n // Read the contents of the chunk out of the main buffer.\n for (var i = 4; i < length; i++) {\n chunk[i] = data[idx++]\n }\n\n // Read out the CRC value for comparison.\n // It's stored as an Int32.\n uint8[3] = data[idx++]\n uint8[2] = data[idx++]\n uint8[1] = data[idx++]\n uint8[0] = data[idx++]\n\n var crcActual = int32[0]\n var crcExpect = crc32.buf(chunk)\n if (crcExpect !== crcActual) {\n throw new Error(\n 'CRC values for ' + name + ' header do not match, PNG file is likely corrupted'\n )\n }\n\n // The chunk data is now copied to remove the 4 preceding\n // bytes used for the chunk name/type.\n var chunkData = new Uint8Array(chunk.buffer.slice(4))\n\n chunks.push({\n name: name,\n data: chunkData\n })\n }\n\n if (!ended) {\n throw new Error('.png file ended prematurely: no IEND header was found')\n }\n\n return chunks\n}\n", "module.exports = encode\n\nfunction encode (keyword, content) {\n keyword = String(keyword)\n content = String(content)\n\n if (!/^[\\x00-\\xFF]+$/.test(keyword) || !/^[\\x00-\\xFF]+$/.test(content)) {\n throw new Error('Only Latin-1 characters are permitted in PNG tEXt chunks. You might want to consider base64 encoding and/or zEXt compression')\n }\n\n if (keyword.length >= 80) {\n throw new Error('Keyword \"' + keyword + '\" is longer than the 79-character limit imposed by the PNG specification')\n }\n\n var totalSize = keyword.length + content.length + 1\n var output = new Uint8Array(totalSize)\n var idx = 0\n var code\n\n for (var i = 0; i < keyword.length; i++) {\n if (!(code = keyword.charCodeAt(i))) {\n throw new Error('0x00 character is not permitted in tEXt keywords')\n }\n\n output[idx++] = code\n }\n\n output[idx++] = 0\n\n for (var j = 0; j < content.length; j++) {\n if (!(code = content.charCodeAt(j))) {\n throw new Error('0x00 character is not permitted in tEXt content')\n }\n\n output[idx++] = code\n }\n\n return {\n name: 'tEXt',\n data: output\n }\n}\n", "module.exports = decode\n\nfunction decode (data) {\n if (data.data && data.name) {\n data = data.data\n }\n\n var naming = true\n var text = ''\n var name = ''\n\n for (var i = 0; i < data.length; i++) {\n var code = data[i]\n\n if (naming) {\n if (code) {\n name += String.fromCharCode(code)\n } else {\n naming = false\n }\n } else {\n if (code) {\n text += String.fromCharCode(code)\n } else {\n throw new Error('Invalid NULL character found. 0x00 character is not permitted in tEXt content')\n }\n }\n }\n\n return {\n keyword: name,\n text: text\n }\n}\n", "exports.encode = require('./encode')\nexports.decode = require('./decode')\n", "\n/**\n * An Array.prototype.slice.call(arguments) alternative\n *\n * @param {Object} args something with a length\n * @param {Number} slice\n * @param {Number} sliceEnd\n * @api public\n */\n\nmodule.exports = function (args, slice, sliceEnd) {\n var ret = [];\n var len = args.length;\n\n if (0 === len) return ret;\n\n var start = slice < 0\n ? Math.max(0, slice + len)\n : slice || 0;\n\n if (sliceEnd !== undefined) {\n len = sliceEnd < 0\n ? sliceEnd + len\n : sliceEnd\n }\n\n while (len-- > start) {\n ret[len - start] = args[len];\n }\n\n return ret;\n}\n\n", "var sliced = require('sliced')\nvar crc32 = require('crc-32')\n\nmodule.exports = encodeChunks\n\n// Used for fast-ish conversion between uint8s and uint32s/int32s.\n// Also required in order to remain agnostic for both Node Buffers and\n// Uint8Arrays.\nvar uint8 = new Uint8Array(4)\nvar int32 = new Int32Array(uint8.buffer)\nvar uint32 = new Uint32Array(uint8.buffer)\n\nfunction encodeChunks (chunks) {\n var totalSize = 8\n var idx = totalSize\n var i\n\n for (i = 0; i < chunks.length; i++) {\n totalSize += chunks[i].data.length\n totalSize += 12\n }\n\n var output = new Uint8Array(totalSize)\n\n output[0] = 0x89\n output[1] = 0x50\n output[2] = 0x4E\n output[3] = 0x47\n output[4] = 0x0D\n output[5] = 0x0A\n output[6] = 0x1A\n output[7] = 0x0A\n\n for (i = 0; i < chunks.length; i++) {\n var chunk = chunks[i]\n var name = chunk.name\n var data = chunk.data\n var size = data.length\n var nameChars = [\n name.charCodeAt(0),\n name.charCodeAt(1),\n name.charCodeAt(2),\n name.charCodeAt(3)\n ]\n\n uint32[0] = size\n output[idx++] = uint8[3]\n output[idx++] = uint8[2]\n output[idx++] = uint8[1]\n output[idx++] = uint8[0]\n\n output[idx++] = nameChars[0]\n output[idx++] = nameChars[1]\n output[idx++] = nameChars[2]\n output[idx++] = nameChars[3]\n\n for (var j = 0; j < size;) {\n output[idx++] = data[j++]\n }\n\n var crcCheck = nameChars.concat(sliced(data))\n var crc = crc32.buf(crcCheck)\n\n int32[0] = crc\n output[idx++] = uint8[3]\n output[idx++] = uint8[2]\n output[idx++] = uint8[1]\n output[idx++] = uint8[0]\n }\n\n return output\n}\n", "'use strict';\n\n\nvar TYPED_OK = (typeof Uint8Array !== 'undefined') &&\n (typeof Uint16Array !== 'undefined') &&\n (typeof Int32Array !== 'undefined');\n\nfunction _has(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n var source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (var p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n if (buf.length === size) { return buf; }\n if (buf.subarray) { return buf.subarray(0, size); }\n buf.length = size;\n return buf;\n};\n\n\nvar fnTyped = {\n arraySet: function (dest, src, src_offs, len, dest_offs) {\n if (src.subarray && dest.subarray) {\n dest.set(src.subarray(src_offs, src_offs + len), dest_offs);\n return;\n }\n // Fallback to ordinary array\n for (var i = 0; i < len; i++) {\n dest[dest_offs + i] = src[src_offs + i];\n }\n },\n // Join array of chunks to single array.\n flattenChunks: function (chunks) {\n var i, l, len, pos, chunk, result;\n\n // calculate data length\n len = 0;\n for (i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n result = new Uint8Array(len);\n pos = 0;\n for (i = 0, l = chunks.length; i < l; i++) {\n chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n }\n};\n\nvar fnUntyped = {\n arraySet: function (dest, src, src_offs, len, dest_offs) {\n for (var i = 0; i < len; i++) {\n dest[dest_offs + i] = src[src_offs + i];\n }\n },\n // Join array of chunks to single array.\n flattenChunks: function (chunks) {\n return [].concat.apply([], chunks);\n }\n};\n\n\n// Enable/Disable typed arrays use, for testing\n//\nexports.setTyped = function (on) {\n if (on) {\n exports.Buf8 = Uint8Array;\n exports.Buf16 = Uint16Array;\n exports.Buf32 = Int32Array;\n exports.assign(exports, fnTyped);\n } else {\n exports.Buf8 = Array;\n exports.Buf16 = Array;\n exports.Buf32 = Array;\n exports.assign(exports, fnUntyped);\n }\n};\n\nexports.setTyped(TYPED_OK);\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\nvar utils = require('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED = 1;\n//var Z_HUFFMAN_ONLY = 2;\n//var Z_RLE = 3;\nvar Z_FIXED = 4;\n//var Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY = 0;\nvar Z_TEXT = 1;\n//var Z_ASCII = 1; // = Z_TEXT\nvar Z_UNKNOWN = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES = 30;\n/* number of distance codes */\n\nvar BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK = 256;\n/* end of block literal code */\n\nvar REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nvar extra_lbits = /* extra bits for each length code */\n [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits = /* extra bits for each distance code */\n [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits = /* extra bits for each bit length code */\n [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\n\n\n\nfunction d_code(dist) {\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short(s, w) {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n}\n\n\nfunction send_code(s, c, tree) {\n send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n var res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nfunction gen_bitlen(s, desc)\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n var tree = desc.dyn_tree;\n var max_code = desc.max_code;\n var stree = desc.stat_desc.static_tree;\n var has_stree = desc.stat_desc.has_stree;\n var extra = desc.stat_desc.extra_bits;\n var base = desc.stat_desc.extra_base;\n var max_length = desc.stat_desc.max_length;\n var h; /* heap index */\n var n, m; /* iterate over the tree elements */\n var bits; /* bit length */\n var xbits; /* extra bits */\n var f; /* frequency */\n var overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Trace((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n tree[m * 2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n{\n var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n var code = 0; /* running code value */\n var bits; /* bit index */\n var n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS; bits++) {\n next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n // \"inconsistent bit counts\");\n //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n for (n = 0; n <= max_code; n++) {\n var len = tree[n * 2 + 1]/*.Len*/;\n if (len === 0) { continue; }\n /* Now reverse the bits */\n tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n }\n}\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nfunction tr_static_init() {\n var n; /* iterates over tree elements */\n var bits; /* bit counter */\n var length; /* length value */\n var code; /* code value */\n var dist; /* distance index */\n var bl_count = new Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1 << extra_lbits[code]); n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1 << extra_dbits[code]); n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES; n++) {\n static_dtree[n * 2 + 1]/*.Len*/ = 5;\n static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);\n\n //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n var n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf *buf; /* the input data */\n//unsigned len; /* its length */\n//int header; /* true if block header must be written */\n{\n bi_windup(s); /* align on byte boundary */\n\n if (header) {\n put_short(s, len);\n put_short(s, ~len);\n }\n// while (len--) {\n// put_byte(s, *buf++);\n// }\n utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n var _n2 = n * 2;\n var _m2 = m * 2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n{\n var v = s.heap[k];\n var j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n{\n var dist; /* distance of matched string */\n var lc; /* match length or unmatched char (if dist == 0) */\n var lx = 0; /* running index in l_buf */\n var code; /* the code to send */\n var extra; /* number of extra bits to send */\n\n if (s.last_lit !== 0) {\n do {\n dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n lc = s.pending_buf[s.l_buf + lx];\n lx++;\n\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n // \"pendingBuf overflow\");\n\n } while (lx < s.last_lit);\n }\n\n send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n var tree = desc.dyn_tree;\n var stree = desc.stat_desc.static_tree;\n var has_stree = desc.stat_desc.has_stree;\n var elems = desc.stat_desc.elems;\n var n, m; /* iterate over heap elements */\n var max_code = -1; /* largest code with non zero frequency */\n var node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n * 2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n var n; /* iterates over all tree elements */\n var prevlen = -1; /* last emitted length */\n var curlen; /* length of current code */\n\n var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n var count = 0; /* repeat count of the current code */\n var max_count = 7; /* max repeat count */\n var min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n var n; /* iterates over all tree elements */\n var prevlen = -1; /* last emitted length */\n var curlen; /* length of current code */\n\n var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n var count = 0; /* repeat count of the current code */\n var max_count = 7; /* max repeat count */\n var min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n var max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n var rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"black list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n /* black_mask is the bit mask of black-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n var black_mask = 0xf3ffc07f;\n var n;\n\n /* Check for non-textual (\"black-listed\") bytes. */\n for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"white-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"black-listed\" or \"white-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n var opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n var max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->last_lit));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n //var out_length, in_length, dcode;\n\n s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;\n s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n s.last_lit++;\n\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n// /* Try to guess if it is profitable to stop the current block here */\n// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n// /* Compute an upper bound for the compressed length */\n// out_length = s.last_lit*8;\n// in_length = s.strstart - s.block_start;\n//\n// for (dcode = 0; dcode < D_CODES; dcode++) {\n// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n// }\n// out_length >>>= 3;\n// //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n// // s->last_lit, in_length, out_length,\n// // 100L - out_length*100L/in_length));\n// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n// return true;\n// }\n// }\n//#endif\n\n return (s.last_lit === s.lit_bufsize - 1);\n /* We avoid equality with lit_bufsize because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n}\n\nexports._tr_init = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n", "'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction adler32(adler, buf, len, pos) {\n var s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n", "'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n var c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n var t = crcTable,\n end = pos + len;\n\n crc ^= -1;\n\n for (var i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = require('../utils/common');\nvar trees = require('./trees');\nvar adler32 = require('./adler32');\nvar crc32 = require('./crc32');\nvar msg = require('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH = 2;\nvar Z_FULL_FLUSH = 3;\nvar Z_FINISH = 4;\nvar Z_BLOCK = 5;\n//var Z_TREES = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\n//var Z_NEED_DICT = 2;\n//var Z_ERRNO = -1;\nvar Z_STREAM_ERROR = -2;\nvar Z_DATA_ERROR = -3;\n//var Z_MEM_ERROR = -4;\nvar Z_BUF_ERROR = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION = 0;\n//var Z_BEST_SPEED = 1;\n//var Z_BEST_COMPRESSION = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED = 1;\nvar Z_HUFFMAN_ONLY = 2;\nvar Z_RLE = 3;\nvar Z_FIXED = 4;\nvar Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY = 0;\n//var Z_TEXT = 1;\n//var Z_ASCII = 1; // = Z_TEXT\nvar Z_UNKNOWN = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES = 30;\n/* number of distance codes */\nvar BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n strm.msg = msg[errorCode];\n return errorCode;\n}\n\nfunction rank(f) {\n return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n var s = strm.state;\n\n //_tr_flush_bits(s);\n var len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n}\n\n\nfunction flush_block_only(s, last) {\n trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n// put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n var len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n utils.arraySet(buf, strm.input, strm.next_in, len, start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n var chain_length = s.max_chain_length; /* max hash chain length */\n var scan = s.strstart; /* current string */\n var match; /* matched string */\n var len; /* length of current match */\n var best_len = s.prev_length; /* best match length so far */\n var nice_match = s.nice_match; /* stop if match long enough */\n var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n var _win = s.window; // shortcut\n\n var wmask = s.w_mask;\n var prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n var strend = s.strstart + MAX_MATCH;\n var scan_end1 = _win[scan + best_len - 1];\n var scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH - (strend - scan);\n scan = strend - MAX_MATCH;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nfunction fill_window(s) {\n var _w_size = s.w_size;\n var p, n, m, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n\n /* Slide the hash table (could be avoided with 32 bit values\n at the expense of memory usage). We slide even when level == 0\n to keep the hash table consistent if we switch back to level > 0\n later. (Using level 0 permanently is not an optimal usage of\n zlib, so we don't care about this pathological case.)\n */\n\n n = s.hash_size;\n p = n;\n do {\n m = s.head[--p];\n s.head[p] = (m >= _w_size ? m - _w_size : 0);\n } while (--n);\n\n n = _w_size;\n p = n;\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// var curr = s.strstart + s.lookahead;\n// var init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n * to pending_buf_size, and each stored block has a 5 byte header:\n */\n var max_block_size = 0xffff;\n\n if (max_block_size > s.pending_buf_size - 5) {\n max_block_size = s.pending_buf_size - 5;\n }\n\n /* Copy as much as possible from input to output: */\n for (;;) {\n /* Fill the window as much as possible: */\n if (s.lookahead <= 1) {\n\n //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n // s->block_start >= (long)s->w_size, \"slide too late\");\n// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n// s.block_start >= s.w_size)) {\n// throw new Error(\"slide too late\");\n// }\n\n fill_window(s);\n if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n\n if (s.lookahead === 0) {\n break;\n }\n /* flush the current block */\n }\n //Assert(s->block_start >= 0L, \"block gone\");\n// if (s.block_start < 0) throw new Error(\"block gone\");\n\n s.strstart += s.lookahead;\n s.lookahead = 0;\n\n /* Emit a stored block if pending_buf will be full: */\n var max_start = s.block_start + max_block_size;\n\n if (s.strstart === 0 || s.strstart >= max_start) {\n /* strstart == 0 is possible when wraparound on 16-bit machine */\n s.lookahead = s.strstart - max_start;\n s.strstart = max_start;\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n\n\n }\n /* Flush if we may have to slide, otherwise block_start may become\n * negative and the data will be gone:\n */\n if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n\n s.insert = 0;\n\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n\n if (s.strstart > s.block_start) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n var hash_head; /* head of the hash chain */\n var bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n var hash_head; /* head of hash chain */\n var bflush; /* set if current block must be flushed */\n\n var max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH - 1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH - 1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n var bflush; /* set if current block must be flushed */\n var prev; /* byte at distance one to match */\n var scan, strend; /* scan goes up to strend for length of run */\n\n var _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n var bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\n\nvar configuration_table;\n\nconfiguration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2);\n this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2);\n this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2);\n zero(this.dyn_ltree);\n zero(this.dyn_dtree);\n zero(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new utils.Buf16(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new utils.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */\n zero(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n zero(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.l_buf = 0; /* buffer index for literals or lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.last_lit = 0; /* running index in l_buf */\n\n this.d_buf = 0;\n /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n * the same number of elements. To use different lengths, an extra flag\n * array would be necessary.\n */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\nfunction deflateResetKeep(strm) {\n var s;\n\n if (!strm || !strm.state) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN;\n\n s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = Z_NO_FLUSH;\n trees._tr_init(s);\n return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n var ret = deflateResetKeep(strm);\n if (ret === Z_OK) {\n lm_init(strm.state);\n }\n return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n strm.state.gzhead = head;\n return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR;\n }\n var wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n var s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n s.window = new utils.Buf8(s.w_size * 2);\n s.head = new utils.Buf16(s.hash_size);\n s.prev = new utils.Buf16(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n\n //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n //s->pending_buf = (uchf *) overlay;\n s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n s.d_buf = 1 * s.lit_bufsize;\n\n //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n s.l_buf = (1 + 2) * s.lit_bufsize;\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n var old_flush, s;\n var beg, val; // for gzip header write only\n\n if (!strm || !strm.state ||\n flush > Z_BLOCK || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n }\n\n s = strm.state;\n\n if (!strm.output ||\n (!strm.input && strm.avail_in !== 0) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n }\n\n s.strm = strm; /* just in case */\n old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Write the header */\n if (s.status === INIT_STATE) {\n\n if (s.wrap === 2) { // GZIP header\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n else // DEFLATE header\n {\n var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n var level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n s.status = BUSY_STATE;\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n }\n }\n\n//#ifdef GZIP\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n\n while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n break;\n }\n }\n put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n s.gzindex++;\n }\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (s.gzindex === s.gzhead.extra.length) {\n s.gzindex = 0;\n s.status = NAME_STATE;\n }\n }\n else {\n s.status = NAME_STATE;\n }\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.gzindex = 0;\n s.status = COMMENT_STATE;\n }\n }\n else {\n s.status = COMMENT_STATE;\n }\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.status = HCRC_STATE;\n }\n }\n else {\n s.status = HCRC_STATE;\n }\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n }\n if (s.pending + 2 <= s.pending_buf_size) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n }\n }\n else {\n s.status = BUSY_STATE;\n }\n }\n//#endif\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush));\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n trees._tr_align(s);\n }\n else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n trees._tr_stored_block(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK;\n }\n }\n }\n //Assert(strm->avail_out > 0, \"bug2\");\n //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n if (flush !== Z_FINISH) { return Z_OK; }\n if (s.wrap <= 0) { return Z_STREAM_END; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n var status;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n status = strm.state.status;\n if (status !== INIT_STATE &&\n status !== EXTRA_STATE &&\n status !== NAME_STATE &&\n status !== COMMENT_STATE &&\n status !== HCRC_STATE &&\n status !== BUSY_STATE &&\n status !== FINISH_STATE\n ) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nfunction deflateSetDictionary(strm, dictionary) {\n var dictLength = dictionary.length;\n\n var s;\n var str, n;\n var wrap;\n var avail;\n var next;\n var input;\n var tmpDict;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n s = strm.state;\n wrap = s.wrap;\n\n if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n return Z_STREAM_ERROR;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32(strm.adler, dictionary, dictLength, 0);\n }\n\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) { /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n tmpDict = new utils.Buf8(s.w_size);\n utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n avail = strm.avail_in;\n next = strm.next_in;\n input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH) {\n str = s.strstart;\n n = s.lookahead - (MIN_MATCH - 1);\n do {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n s.head[s.ins_h] = str;\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK;\n}\n\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n", "// String encode/decode helpers\n'use strict';\n\n\nvar utils = require('./common');\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nvar STR_APPLY_OK = true;\nvar STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new utils.Buf8(256);\nfor (var q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new utils.Buf8(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n }\n }\n\n var result = '';\n for (var i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n var buf = new utils.Buf8(str.length);\n for (var i = 0, len = buf.length; i < len; i++) {\n buf[i] = str.charCodeAt(i);\n }\n return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n var i, out, c, c_len;\n var len = max || buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n var utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n var pos;\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nmodule.exports = ZStream;\n", "'use strict';\n\n\nvar zlib_deflate = require('./zlib/deflate');\nvar utils = require('./utils/common');\nvar strings = require('./utils/strings');\nvar msg = require('./zlib/messages');\nvar ZStream = require('./zlib/zstream');\n\nvar toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH = 0;\nvar Z_FINISH = 4;\n\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\nvar Z_SYNC_FLUSH = 2;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY = 0;\n\nvar Z_DEFLATED = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Deflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n * (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n if (!(this instanceof Deflate)) return new Deflate(options);\n\n this.options = utils.assign({\n level: Z_DEFAULT_COMPRESSION,\n method: Z_DEFLATED,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY,\n to: ''\n }, options || {});\n\n var opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new ZStream();\n this.strm.avail_out = 0;\n\n var status = zlib_deflate.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK) {\n throw new Error(msg[status]);\n }\n\n if (opt.header) {\n zlib_deflate.deflateSetHeader(this.strm, opt.header);\n }\n\n if (opt.dictionary) {\n var dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n\n status = zlib_deflate.deflateSetDictionary(this.strm, dict);\n\n if (status !== Z_OK) {\n throw new Error(msg[status]);\n }\n\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the compression context.\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, mode) {\n var strm = this.strm;\n var chunkSize = this.options.chunkSize;\n var status, _mode;\n\n if (this.ended) { return false; }\n\n _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n do {\n if (strm.avail_out === 0) {\n strm.output = new utils.Buf8(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n status = zlib_deflate.deflate(strm, _mode); /* no bad return value */\n\n if (status !== Z_STREAM_END && status !== Z_OK) {\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {\n if (this.options.to === 'string') {\n this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n } else {\n this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n }\n }\n } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n // Finalize on the last chunk.\n if (_mode === Z_FINISH) {\n status = zlib_deflate.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK;\n }\n\n // callback interim results if Z_SYNC_FLUSH.\n if (_mode === Z_SYNC_FLUSH) {\n this.onEnd(Z_OK);\n strm.avail_out = 0;\n return true;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n * on js engine support. When string output requested, each chunk\n * will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = utils.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n * (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n var deflator = new Deflate(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg || msg[deflator.err]; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n var state;\n var _in; /* local strm.input */\n var last; /* have enough input while in < last */\n var _out; /* local strm.output */\n var beg; /* inflate()'s initial strm.output */\n var end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n var dmax; /* maximum distance from zlib header */\n//#endif\n var wsize; /* window size or zero if not using window */\n var whave; /* valid bytes in the window */\n var wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n var s_window; /* allocated sliding window, if wsize != 0 */\n var hold; /* local strm.hold */\n var bits; /* local strm.bits */\n var lcode; /* local strm.lencode */\n var dcode; /* local strm.distcode */\n var lmask; /* mask for first level of length codes */\n var dmask; /* mask for first level of distance codes */\n var here; /* retrieved table entry */\n var op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n var len; /* match length, unused bytes */\n var dist; /* match distance */\n var from; /* where to copy match from */\n var from_source;\n\n\n var input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = require('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n var bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n var len = 0; /* a code's length in bits */\n var sym = 0; /* index of code symbols */\n var min = 0, max = 0; /* minimum and maximum code lengths */\n var root = 0; /* number of index bits for root table */\n var curr = 0; /* number of index bits for current table */\n var drop = 0; /* code bits to drop for sub-table */\n var left = 0; /* number of prefix codes available */\n var used = 0; /* code entries in table used */\n var huff = 0; /* Huffman code */\n var incr; /* for incrementing code, index */\n var fill; /* index for replicating entries */\n var low; /* low bits for current root entry */\n var mask; /* mask for low root bits */\n var next; /* next available space in table */\n var base = null; /* base value table to use */\n var base_index = 0;\n// var shoextra; /* extra bits table to use */\n var end; /* use base and extra for symbol > end */\n var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n var extra = null;\n var extra_index = 0;\n\n var here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = require('../utils/common');\nvar adler32 = require('./adler32');\nvar crc32 = require('./crc32');\nvar inflate_fast = require('./inffast');\nvar inflate_table = require('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH = 2;\n//var Z_FULL_FLUSH = 3;\nvar Z_FINISH = 4;\nvar Z_BLOCK = 5;\nvar Z_TREES = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\nvar Z_NEED_DICT = 2;\n//var Z_ERRNO = -1;\nvar Z_STREAM_ERROR = -2;\nvar Z_DATA_ERROR = -3;\nvar Z_MEM_ERROR = -4;\nvar Z_BUF_ERROR = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar HEAD = 1; /* i: waiting for magic header */\nvar FLAGS = 2; /* i: waiting for method and flags (gzip) */\nvar TIME = 3; /* i: waiting for modification time (gzip) */\nvar OS = 4; /* i: waiting for extra flags and operating system (gzip) */\nvar EXLEN = 5; /* i: waiting for extra length (gzip) */\nvar EXTRA = 6; /* i: waiting for extra bytes (gzip) */\nvar NAME = 7; /* i: waiting for end of file name (gzip) */\nvar COMMENT = 8; /* i: waiting for end of comment (gzip) */\nvar HCRC = 9; /* i: waiting for header crc (gzip) */\nvar DICTID = 10; /* i: waiting for dictionary check value */\nvar DICT = 11; /* waiting for inflateSetDictionary() call */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\nvar TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\nvar STORED = 14; /* i: waiting for stored size (length and complement) */\nvar COPY_ = 15; /* i/o: same as COPY below, but only first time in */\nvar COPY = 16; /* i/o: waiting for input or output to copy stored block */\nvar TABLE = 17; /* i: waiting for dynamic block table lengths */\nvar LENLENS = 18; /* i: waiting for code length code lengths */\nvar CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\nvar LEN_ = 20; /* i: same as LEN below, but only first time in */\nvar LEN = 21; /* i: waiting for length/lit/eob code */\nvar LENEXT = 22; /* i: waiting for length extra bits */\nvar DIST = 23; /* i: waiting for distance code */\nvar DISTEXT = 24; /* i: waiting for distance extra bits */\nvar MATCH = 25; /* o: waiting for output space to copy string */\nvar LIT = 26; /* o: waiting for output space to write literal */\nvar CHECK = 27; /* i: waiting for 32-bit check value */\nvar LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\nvar DONE = 29; /* finished check, done -- remain here until reset */\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar MEM = 31; /* got an inflate() memory error -- remain here until reset */\nvar SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n this.work = new utils.Buf16(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK;\n}\n\nfunction inflateReset(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n var wrap;\n var state;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n var ret;\n var state;\n\n if (!strm) { return Z_STREAM_ERROR; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n}\n\nfunction inflateInit(strm) {\n return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n var sym;\n\n lenfix = new utils.Buf32(512);\n distfix = new utils.Buf32(32);\n\n /* literal/length table */\n sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n var dist;\n var state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new utils.Buf8(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n utils.arraySet(state.window, src, end - copy, copy, 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n}\n\nfunction inflate(strm, flush) {\n var state;\n var input, output; // input/output buffers\n var next; /* next input INDEX */\n var put; /* next output INDEX */\n var have, left; /* available input and output */\n var hold; /* bit buffer */\n var bits; /* bits in bit buffer */\n var _in, _out; /* save starting available input and output */\n var copy; /* number of stored or match bytes to copy */\n var from; /* where to copy match bytes from */\n var from_source;\n var here = 0; /* current decoding table entry */\n var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //var last; /* parent table entry */\n var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n var len; /* length to copy for repeats, bits to drop */\n var ret; /* return code */\n var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */\n var opts;\n\n var n; // temporary var for NEED_BITS\n\n var order = /* permutation of code lengths */\n [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n state.dmax = 1 << len;\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Array(state.head.extra_len);\n }\n utils.arraySet(\n state.head.extra,\n input,\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n copy,\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n utils.arraySet(output, input, next, copy, put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inflate_fast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n}\n\nfunction inflateEnd(strm) {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR;\n }\n\n var state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n var state;\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n var dictLength = dictionary.length;\n\n var state;\n var dictid;\n var ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n //Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n", "'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nmodule.exports = GZheader;\n", "'use strict';\n\n\nvar zlib_inflate = require('./zlib/inflate');\nvar utils = require('./utils/common');\nvar strings = require('./utils/strings');\nvar c = require('./zlib/constants');\nvar msg = require('./zlib/messages');\nvar ZStream = require('./zlib/zstream');\nvar GZheader = require('./zlib/gzheader');\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n if (!(this instanceof Inflate)) return new Inflate(options);\n\n this.options = utils.assign({\n chunkSize: 16384,\n windowBits: 0,\n to: ''\n }, options || {});\n\n var opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new ZStream();\n this.strm.avail_out = 0;\n\n var status = zlib_inflate.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== c.Z_OK) {\n throw new Error(msg[status]);\n }\n\n this.header = new GZheader();\n\n zlib_inflate.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== c.Z_OK) {\n throw new Error(msg[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n var strm = this.strm;\n var chunkSize = this.options.chunkSize;\n var dictionary = this.options.dictionary;\n var status, _mode;\n var next_out_utf8, tail, utf8str;\n\n // Flag to properly process Z_BUF_ERROR on testing inflate call\n // when we check that all output data was flushed.\n var allowBufError = false;\n\n if (this.ended) { return false; }\n _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n // Convert data if needed\n if (typeof data === 'string') {\n // Only binary strings can be decompressed on practice\n strm.input = strings.binstring2buf(data);\n } else if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n do {\n if (strm.avail_out === 0) {\n strm.output = new utils.Buf8(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */\n\n if (status === c.Z_NEED_DICT && dictionary) {\n status = zlib_inflate.inflateSetDictionary(this.strm, dictionary);\n }\n\n if (status === c.Z_BUF_ERROR && allowBufError === true) {\n status = c.Z_OK;\n allowBufError = false;\n }\n\n if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n if (this.options.to === 'string') {\n\n next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n tail = strm.next_out - next_out_utf8;\n utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n this.onData(utf8str);\n\n } else {\n this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n }\n }\n }\n\n // When no more input data, we should check that internal inflate buffers\n // are flushed. The only way to do it when avail_out = 0 - run one more\n // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n // Here we set flag to process this error properly.\n //\n // NOTE. Deflate does not return error in this case and does not needs such\n // logic.\n if (strm.avail_in === 0 && strm.avail_out === 0) {\n allowBufError = true;\n }\n\n } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n if (status === c.Z_STREAM_END) {\n _mode = c.Z_FINISH;\n }\n\n // Finalize on the last chunk.\n if (_mode === c.Z_FINISH) {\n status = zlib_inflate.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === c.Z_OK;\n }\n\n // callback interim results if Z_SYNC_FLUSH.\n if (_mode === c.Z_SYNC_FLUSH) {\n this.onEnd(c.Z_OK);\n strm.avail_out = 0;\n return true;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n * on js engine support. When string output requested, each chunk\n * will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === c.Z_OK) {\n if (this.options.to === 'string') {\n // Glue & convert here, until we teach pako to send\n // utf8 aligned strings to onData\n this.result = this.chunks.join('');\n } else {\n this.result = utils.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n * , output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err)\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n var inflator = new Inflate(options);\n\n inflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) { throw inflator.msg || msg[inflator.err]; }\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip = inflate;\n", "// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign = require('./lib/utils/common').assign;\n\nvar deflate = require('./lib/deflate');\nvar inflate = require('./lib/inflate');\nvar constants = require('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sanitizeUrl = void 0;\nvar invalidProtocolRegex = /^([^\\w]*)(javascript|data|vbscript)/im;\nvar htmlEntitiesRegex = /&#(\\w+)(^\\w|;)?/g;\nvar htmlCtrlEntityRegex = /&(newline|tab);/gi;\nvar ctrlCharactersRegex = /[\\u0000-\\u001F\\u007F-\\u009F\\u2000-\\u200D\\uFEFF]/gim;\nvar urlSchemeRegex = /^.+(:|&colon;)/gim;\nvar relativeFirstCharacters = [\".\", \"/\"];\nfunction isRelativeUrlWithoutProtocol(url) {\n return relativeFirstCharacters.indexOf(url[0]) > -1;\n}\n// adapted from https://stackoverflow.com/a/29824550/2601552\nfunction decodeHtmlCharacters(str) {\n return str.replace(htmlEntitiesRegex, function (match, dec) {\n return String.fromCharCode(dec);\n });\n}\nfunction sanitizeUrl(url) {\n var sanitizedUrl = decodeHtmlCharacters(url || \"\")\n .replace(htmlCtrlEntityRegex, \"\")\n .replace(ctrlCharactersRegex, \"\")\n .trim();\n if (!sanitizedUrl) {\n return \"about:blank\";\n }\n if (isRelativeUrlWithoutProtocol(sanitizedUrl)) {\n return sanitizedUrl;\n }\n var urlSchemeParseResults = sanitizedUrl.match(urlSchemeRegex);\n if (!urlSchemeParseResults) {\n return sanitizedUrl;\n }\n var urlScheme = urlSchemeParseResults[0];\n if (invalidProtocolRegex.test(urlScheme)) {\n return \"about:blank\";\n }\n return sanitizedUrl;\n}\nexports.sanitizeUrl = sanitizeUrl;\n", "import decodePng from \"png-chunks-extract\";\nimport tEXt from \"png-chunk-text\";\nimport encodePng from \"png-chunks-encode\";\nimport { stringToBase64, encode, decode, base64ToString } from \"./encode\";\nimport { EXPORT_DATA_TYPES, MIME_TYPES } from \"../constants\";\nimport { blobToArrayBuffer } from \"./blob\";\n\n// -----------------------------------------------------------------------------\n// PNG\n// -----------------------------------------------------------------------------\n\nexport const getTEXtChunk = async (\n blob: Blob,\n): Promise<{ keyword: string; text: string } | null> => {\n const chunks = decodePng(new Uint8Array(await blobToArrayBuffer(blob)));\n const metadataChunk = chunks.find((chunk) => chunk.name === \"tEXt\");\n if (metadataChunk) {\n return tEXt.decode(metadataChunk.data);\n }\n return null;\n};\n\nexport const encodePngMetadata = async ({\n blob,\n metadata,\n}: {\n blob: Blob;\n metadata: string;\n}) => {\n const chunks = decodePng(new Uint8Array(await blobToArrayBuffer(blob)));\n\n const metadataChunk = tEXt.encode(\n MIME_TYPES.excalidraw,\n JSON.stringify(\n await encode({\n text: metadata,\n compress: true,\n }),\n ),\n );\n // insert metadata before last chunk (iEND)\n chunks.splice(-1, 0, metadataChunk);\n\n return new Blob([encodePng(chunks)], { type: MIME_TYPES.png });\n};\n\nexport const decodePngMetadata = async (blob: Blob) => {\n const metadata = await getTEXtChunk(blob);\n if (metadata?.keyword === MIME_TYPES.excalidraw) {\n try {\n const encodedData = JSON.parse(metadata.text);\n if (!(\"encoded\" in encodedData)) {\n // legacy, un-encoded scene JSON\n if (\n \"type\" in encodedData &&\n encodedData.type === EXPORT_DATA_TYPES.excalidraw\n ) {\n return metadata.text;\n }\n throw new Error(\"FAILED\");\n }\n return await decode(encodedData);\n } catch (error: any) {\n console.error(error);\n throw new Error(\"FAILED\");\n }\n }\n throw new Error(\"INVALID\");\n};\n\n// -----------------------------------------------------------------------------\n// SVG\n// -----------------------------------------------------------------------------\n\nexport const encodeSvgMetadata = async ({ text }: { text: string }) => {\n const base64 = await stringToBase64(\n JSON.stringify(await encode({ text })),\n true /* is already byte string */,\n );\n\n let metadata = \"\";\n metadata += `<!-- payload-type:${MIME_TYPES.excalidraw} -->`;\n metadata += `<!-- payload-version:2 -->`;\n metadata += \"<!-- payload-start -->\";\n metadata += base64;\n metadata += \"<!-- payload-end -->\";\n return metadata;\n};\n\nexport const decodeSvgMetadata = async ({ svg }: { svg: string }) => {\n if (svg.includes(`payload-type:${MIME_TYPES.excalidraw}`)) {\n const match = svg.match(\n /<!-- payload-start -->\\s*(.+?)\\s*<!-- payload-end -->/,\n );\n if (!match) {\n throw new Error(\"INVALID\");\n }\n const versionMatch = svg.match(/<!-- payload-version:(\\d+) -->/);\n const version = versionMatch?.[1] || \"1\";\n const isByteString = version !== \"1\";\n\n try {\n const json = await base64ToString(match[1], isByteString);\n const encodedData = JSON.parse(json);\n if (!(\"encoded\" in encodedData)) {\n // legacy, un-encoded scene JSON\n if (\n \"type\" in encodedData &&\n encodedData.type === EXPORT_DATA_TYPES.excalidraw\n ) {\n return json;\n }\n throw new Error(\"FAILED\");\n }\n return await decode(encodedData);\n } catch (error: any) {\n console.error(error);\n throw new Error(\"FAILED\");\n }\n }\n throw new Error(\"INVALID\");\n};\n", "import { deflate, inflate } from \"pako\";\nimport { encryptData, decryptData } from \"./encryption\";\n\n// -----------------------------------------------------------------------------\n// byte (binary) strings\n// -----------------------------------------------------------------------------\n\n// fast, Buffer-compatible implem\nexport const toByteString = (\n data: string | Uint8Array | ArrayBuffer,\n): Promise<string> => {\n return new Promise((resolve, reject) => {\n const blob =\n typeof data === \"string\"\n ? new Blob([new TextEncoder().encode(data)])\n : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\n const reader = new FileReader();\n reader.onload = (event) => {\n if (!event.target || typeof event.target.result !== \"string\") {\n return reject(new Error(\"couldn't convert to byte string\"));\n }\n resolve(event.target.result);\n };\n reader.readAsBinaryString(blob);\n });\n};\n\nconst byteStringToArrayBuffer = (byteString: string) => {\n const buffer = new ArrayBuffer(byteString.length);\n const bufferView = new Uint8Array(buffer);\n for (let i = 0, len = byteString.length; i < len; i++) {\n bufferView[i] = byteString.charCodeAt(i);\n }\n return buffer;\n};\n\nconst byteStringToString = (byteString: string) => {\n return new TextDecoder(\"utf-8\").decode(byteStringToArrayBuffer(byteString));\n};\n\n// -----------------------------------------------------------------------------\n// base64\n// -----------------------------------------------------------------------------\n\n/**\n * @param isByteString set to true if already byte string to prevent bloat\n * due to reencoding\n */\nexport const stringToBase64 = async (str: string, isByteString = false) => {\n return isByteString ? window.btoa(str) : window.btoa(await toByteString(str));\n};\n\n// async to align with stringToBase64\nexport const base64ToString = async (base64: string, isByteString = false) => {\n return isByteString\n ? window.atob(base64)\n : byteStringToString(window.atob(base64));\n};\n\n// -----------------------------------------------------------------------------\n// text encoding\n// -----------------------------------------------------------------------------\n\ntype EncodedData = {\n encoded: string;\n encoding: \"bstring\";\n /** whether text is compressed (zlib) */\n compressed: boolean;\n /** version for potential migration purposes */\n version?: string;\n};\n\n/**\n * Encodes (and potentially compresses via zlib) text to byte string\n */\nexport const encode = async ({\n text,\n compress,\n}: {\n text: string;\n /** defaults to `true`. If compression fails, falls back to bstring alone. */\n compress?: boolean;\n}): Promise<EncodedData> => {\n let deflated!: string;\n if (compress !== false) {\n try {\n deflated = await toByteString(deflate(text));\n } catch (error: any) {\n console.error(\"encode: cannot deflate\", error);\n }\n }\n return {\n version: \"1\",\n encoding: \"bstring\",\n compressed: !!deflated,\n encoded: deflated || (await toByteString(text)),\n };\n};\n\nexport const decode = async (data: EncodedData): Promise<string> => {\n let decoded: string;\n\n switch (data.encoding) {\n case \"bstring\":\n // if compressed, do not double decode the bstring\n decoded = data.compressed\n ? data.encoded\n : await byteStringToString(data.encoded);\n break;\n default:\n throw new Error(`decode: unknown encoding \"${data.encoding}\"`);\n }\n\n if (data.compressed) {\n return inflate(new Uint8Array(byteStringToArrayBuffer(decoded)), {\n to: \"string\",\n });\n }\n\n return decoded;\n};\n\n// -----------------------------------------------------------------------------\n// binary encoding\n// -----------------------------------------------------------------------------\n\ntype FileEncodingInfo = {\n /* version 2 is the version we're shipping the initial image support with.\n version 1 was a PR version that a lot of people were using anyway.\n Thus, if there are issues we can check whether they're not using the\n unoffic version */\n version: 1 | 2;\n compression: \"pako@1\" | null;\n encryption: \"AES-GCM\" | null;\n};\n\n// -----------------------------------------------------------------------------\nconst CONCAT_BUFFERS_VERSION = 1;\n/** how many bytes we use to encode how many bytes the next chunk has.\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\n *\n * NOTE ! values must not be changed, which would be backwards incompatible !\n */\nconst VERSION_DATAVIEW_BYTES = 4;\nconst NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4;\n// -----------------------------------------------------------------------------\n\nconst DATA_VIEW_BITS_MAP = { 1: 8, 2: 16, 4: 32 } as const;\n\n// getter\nfunction dataView(buffer: Uint8Array, bytes: 1 | 2 | 4, offset: number): number;\n// setter\nfunction dataView(\n buffer: Uint8Array,\n bytes: 1 | 2 | 4,\n offset: number,\n value: number,\n): Uint8Array;\n/**\n * abstraction over DataView that serves as a typed getter/setter in case\n * you're using constants for the byte size and want to ensure there's no\n * discrepenancy in the encoding across refactors.\n *\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\n */\nfunction dataView(\n buffer: Uint8Array,\n bytes: 1 | 2 | 4,\n offset: number,\n value?: number,\n): Uint8Array | number {\n if (value != null) {\n if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\n throw new Error(\n `attempting to set value higher than the allocated bytes (value: ${value}, bytes: ${bytes})`,\n );\n }\n const method = `setUint${DATA_VIEW_BITS_MAP[bytes]}` as const;\n new DataView(buffer.buffer)[method](offset, value);\n return buffer;\n }\n const method = `getUint${DATA_VIEW_BITS_MAP[bytes]}` as const;\n return new DataView(buffer.buffer)[method](offset);\n}\n\n// -----------------------------------------------------------------------------\n\n/**\n * Resulting concatenated buffer has this format:\n *\n * [\n * VERSION chunk (4 bytes)\n * LENGTH chunk 1 (4 bytes)\n * DATA chunk 1 (up to 2^32 bits)\n * LENGTH chunk 2 (4 bytes)\n * DATA chunk 2 (up to 2^32 bits)\n * ...\n * ]\n *\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\n */\nconst concatBuffers = (...buffers: Uint8Array[]) => {\n const bufferView = new Uint8Array(\n VERSION_DATAVIEW_BYTES +\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length +\n buffers.reduce((acc, buffer) => acc + buffer.byteLength, 0),\n );\n\n let cursor = 0;\n\n // as the first chunk we'll encode the version for backwards compatibility\n dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\n cursor += VERSION_DATAVIEW_BYTES;\n\n for (const buffer of buffers) {\n dataView(\n bufferView,\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES,\n cursor,\n buffer.byteLength,\n );\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\n\n bufferView.set(buffer, cursor);\n cursor += buffer.byteLength;\n }\n\n return bufferView;\n};\n\n/** can only be used on buffers created via `concatBuffers()` */\nconst splitBuffers = (concatenatedBuffer: Uint8Array) => {\n const buffers = [];\n\n let cursor = 0;\n\n // first chunk is the version\n const version = dataView(\n concatenatedBuffer,\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES,\n cursor,\n );\n // If version is outside of the supported versions, throw an error.\n // This usually means the buffer wasn't encoded using this API, so we'd only\n // waste compute.\n if (version > CONCAT_BUFFERS_VERSION) {\n throw new Error(`invalid version ${version}`);\n }\n\n cursor += VERSION_DATAVIEW_BYTES;\n\n while (true) {\n const chunkSize = dataView(\n concatenatedBuffer,\n NEXT_CHUNK_SIZE_DATAVIEW_BYTES,\n cursor,\n );\n cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\n\n buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\n cursor += chunkSize;\n if (cursor >= concatenatedBuffer.byteLength) {\n break;\n }\n }\n\n return buffers;\n};\n\n// helpers for (de)compressing data with JSON metadata including encryption\n// -----------------------------------------------------------------------------\n\n/** @private */\nconst _encryptAndCompress = async (\n data: Uint8Array | string,\n encryptionKey: string,\n) => {\n const { encryptedBuffer, iv } = await encryptData(\n encryptionKey,\n deflate(data),\n );\n\n return { iv, buffer: new Uint8Array(encryptedBuffer) };\n};\n\n/**\n * The returned buffer has following format:\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\n *\n * [\n * encodingMetadataBuffer,\n * iv,\n * [\n * contentsMetadataBuffer\n * contentsBuffer\n * ]\n * ]\n */\nexport const compressData = async <T extends Record<string, any> = never>(\n dataBuffer: Uint8Array,\n options: {\n encryptionKey: string;\n } & ([T] extends [never]\n ? {\n metadata?: T;\n }\n : {\n metadata: T;\n }),\n): Promise<Uint8Array> => {\n const fileInfo: FileEncodingInfo = {\n version: 2,\n compression: \"pako@1\",\n encryption: \"AES-GCM\",\n };\n\n const encodingMetadataBuffer = new TextEncoder().encode(\n JSON.stringify(fileInfo),\n );\n\n const contentsMetadataBuffer = new TextEncoder().encode(\n JSON.stringify(options.metadata || null),\n );\n\n const { iv, buffer } = await _encryptAndCompress(\n concatBuffers(contentsMetadataBuffer, dataBuffer),\n options.encryptionKey,\n );\n\n return concatBuffers(encodingMetadataBuffer, iv, buffer);\n};\n\n/** @private */\nconst _decryptAndDecompress = async (\n iv: Uint8Array,\n decryptedBuffer: Uint8Array,\n decryptionKey: string,\n isCompressed: boolean,\n) => {\n decryptedBuffer = new Uint8Array(\n await decryptData(iv, decryptedBuffer, decryptionKey),\n );\n\n if (isCompressed) {\n return inflate(decryptedBuffer);\n }\n\n return decryptedBuffer;\n};\n\nexport const decompressData = async <T extends Record<string, any>>(\n bufferView: Uint8Array,\n options: { decryptionKey: string },\n) => {\n // first chunk is encoding metadata (ignored for now)\n const [encodingMetadataBuffer, iv, buffer] = splitBuffers(bufferView);\n\n const encodingMetadata: FileEncodingInfo = JSON.parse(\n new TextDecoder().decode(encodingMetadataBuffer),\n );\n\n try {\n const [contentsMetadataBuffer, contentsBuffer] = splitBuffers(\n await _decryptAndDecompress(\n iv,\n buffer,\n options.decryptionKey,\n !!encodingMetadata.compression,\n ),\n );\n\n const metadata = JSON.parse(\n new TextDecoder().decode(contentsMetadataBuffer),\n ) as T;\n\n return {\n /** metadata source is always JSON so we can decode it here */\n metadata,\n /** data can be anything so the caller must decode it */\n data: contentsBuffer,\n };\n } catch (error: any) {\n console.error(\n `Error during decompressing and decrypting the file.`,\n encodingMetadata,\n );\n throw error;\n }\n};\n\n// -----------------------------------------------------------------------------\n", "import { ENCRYPTION_KEY_BITS } from \"../constants\";\nimport { blobToArrayBuffer } from \"./blob\";\n\nexport const IV_LENGTH_BYTES = 12;\n\nexport const createIV = () => {\n const arr = new Uint8Array(IV_LENGTH_BYTES);\n return window.crypto.getRandomValues(arr);\n};\n\nexport const generateEncryptionKey = async <\n T extends \"string\" | \"cryptoKey\" = \"string\",\n>(\n returnAs?: T,\n): Promise<T extends \"cryptoKey\" ? CryptoKey : string> => {\n const key = await window.crypto.subtle.generateKey(\n {\n name: \"AES-GCM\",\n length: ENCRYPTION_KEY_BITS,\n },\n true, // extractable\n [\"encrypt\", \"decrypt\"],\n );\n return (\n returnAs === \"cryptoKey\"\n ? key\n : (await window.crypto.subtle.exportKey(\"jwk\", key)).k\n ) as T extends \"cryptoKey\" ? CryptoKey : string;\n};\n\nexport const getCryptoKey = (key: string, usage: KeyUsage) =>\n window.crypto.subtle.importKey(\n \"jwk\",\n {\n alg: \"A128GCM\",\n ext: true,\n k: key,\n key_ops: [\"encrypt\", \"decrypt\"],\n kty: \"oct\",\n },\n {\n name: \"AES-GCM\",\n length: ENCRYPTION_KEY_BITS,\n },\n false, // extractable\n [usage],\n );\n\nexport const encryptData = async (\n key: string | CryptoKey,\n data: Uint8Array | ArrayBuffer | Blob | File | string,\n): Promise<{ encryptedBuffer: ArrayBuffer; iv: Uint8Array }> => {\n const importedKey =\n typeof key === \"string\" ? await getCryptoKey(key, \"encrypt\") : key;\n const iv = createIV();\n const buffer: ArrayBuffer | Uint8Array =\n typeof data === \"string\"\n ? new TextEncoder().encode(data)\n : data instanceof Uint8Array\n ? data\n : data instanceof Blob\n ? await blobToArrayBuffer(data)\n : data;\n\n // We use symmetric encryption. AES-GCM is the recommended algorithm and\n // includes checks that the ciphertext has not been modified by an attacker.\n const encryptedBuffer = await window.crypto.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv,\n },\n importedKey,\n buffer as ArrayBuffer | Uint8Array,\n );\n\n return { encryptedBuffer, iv };\n};\n\nexport const decryptData = async (\n iv: Uint8Array,\n encrypted: Uint8Array | ArrayBuffer,\n privateKey: string,\n): Promise<ArrayBuffer> => {\n const key = await getCryptoKey(privateKey, \"decrypt\");\n return window.crypto.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv,\n },\n key,\n encrypted,\n );\n};\n", "import cssVariables from \"./css/variables.module.scss\";\nimport { AppProps } from \"./types\";\nimport { ExcalidrawElement, FontFamilyValues } from \"./element/types\";\nimport { COLOR_PALETTE } from \"./colors\";\nexport const isDarwin = /Mac|iPod|iPhone|iPad/.test(navigator.platform);\nexport const isWindows = /^Win/.test(navigator.platform);\nexport const isAndroid = /\\b(android)\\b/i.test(navigator.userAgent);\nexport const isFirefox =\n \"netscape\" in window &&\n navigator.userAgent.indexOf(\"rv:\") > 1 &&\n navigator.userAgent.indexOf(\"Gecko\") > 1;\nexport const isChrome = navigator.userAgent.indexOf(\"Chrome\") !== -1;\nexport const isSafari =\n !isChrome && navigator.userAgent.indexOf(\"Safari\") !== -1;\nexport const isIOS =\n /iPad|iPhone/.test(navigator.platform) ||\n // iPadOS 13+\n (navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document);\n// keeping function so it can be mocked in test\nexport const isBrave = () =>\n (navigator as any).brave?.isBrave?.name === \"isBrave\";\n\nexport const APP_NAME = \"Excalidraw\";\n\nexport const DRAGGING_THRESHOLD = 10; // px\nexport const LINE_CONFIRM_THRESHOLD = 8; // px\nexport const ELEMENT_SHIFT_TRANSLATE_AMOUNT = 5;\nexport const ELEMENT_TRANSLATE_AMOUNT = 1;\nexport const TEXT_TO_CENTER_SNAP_THRESHOLD = 30;\nexport const SHIFT_LOCKING_ANGLE = Math.PI / 12;\nexport const CURSOR_TYPE = {\n TEXT: \"text\",\n CROSSHAIR: \"crosshair\",\n GRABBING: \"grabbing\",\n GRAB: \"grab\",\n POINTER: \"pointer\",\n MOVE: \"move\",\n AUTO: \"\",\n};\nexport const POINTER_BUTTON = {\n MAIN: 0,\n WHEEL: 1,\n SECONDARY: 2,\n TOUCH: -1,\n ERASER: 5,\n} as const;\n\nexport const POINTER_EVENTS = {\n enabled: \"all\",\n disabled: \"none\",\n // asserted as any so it can be freely assigned to React Element\n // \"pointerEnvets\" CSS prop\n inheritFromUI: \"var(--ui-pointerEvents)\" as any,\n} as const;\n\nexport enum EVENT {\n COPY = \"copy\",\n PASTE = \"paste\",\n CUT = \"cut\",\n KEYDOWN = \"keydown\",\n KEYUP = \"keyup\",\n MOUSE_MOVE = \"mousemove\",\n RESIZE = \"resize\",\n UNLOAD = \"unload\",\n FOCUS = \"focus\",\n BLUR = \"blur\",\n DRAG_OVER = \"dragover\",\n DROP = \"drop\",\n GESTURE_END = \"gestureend\",\n BEFORE_UNLOAD = \"beforeunload\",\n GESTURE_START = \"gesturestart\",\n GESTURE_CHANGE = \"gesturechange\",\n POINTER_MOVE = \"pointermove\",\n POINTER_DOWN = \"pointerdown\",\n POINTER_UP = \"pointerup\",\n STATE_CHANGE = \"statechange\",\n WHEEL = \"wheel\",\n TOUCH_START = \"touchstart\",\n TOUCH_END = \"touchend\",\n HASHCHANGE = \"hashchange\",\n VISIBILITY_CHANGE = \"visibilitychange\",\n SCROLL = \"scroll\",\n // custom events\n EXCALIDRAW_LINK = \"excalidraw-link\",\n MENU_ITEM_SELECT = \"menu.itemSelect\",\n MESSAGE = \"message\",\n FULLSCREENCHANGE = \"fullscreenchange\",\n}\n\nexport const YOUTUBE_STATES = {\n UNSTARTED: -1,\n ENDED: 0,\n PLAYING: 1,\n PAUSED: 2,\n BUFFERING: 3,\n CUED: 5,\n} as const;\n\nexport const ENV = {\n TEST: \"test\",\n DEVELOPMENT: \"development\",\n};\n\nexport const CLASSES = {\n SHAPE_ACTIONS_MENU: \"App-menu__left\",\n};\n\n// 1-based in case we ever do `if(element.fontFamily)`\nexport const FONT_FAMILY = {\n Virgil: 1,\n Helvetica: 2,\n Cascadia: 3,\n Assistant: 4,\n};\n\nexport const THEME = {\n LIGHT: \"light\",\n DARK: \"dark\",\n} as const;\n\nexport const FRAME_STYLE = {\n strokeColor: \"#bbb\" as ExcalidrawElement[\"strokeColor\"],\n strokeWidth: 2 as ExcalidrawElement[\"strokeWidth\"],\n strokeStyle: \"solid\" as ExcalidrawElement[\"strokeStyle\"],\n fillStyle: \"solid\" as ExcalidrawElement[\"fillStyle\"],\n roughness: 0 as ExcalidrawElement[\"roughness\"],\n roundness: null as ExcalidrawElement[\"roundness\"],\n backgroundColor: \"transparent\" as ExcalidrawElement[\"backgroundColor\"],\n radius: 8,\n nameOffsetY: 3,\n nameColorLightTheme: \"#999999\",\n nameColorDarkTheme: \"#7a7a7a\",\n nameFontSize: 14,\n nameLineHeight: 1.25,\n};\n\nexport const WINDOWS_EMOJI_FALLBACK_FONT = \"Segoe UI Emoji\";\n\nexport const MIN_FONT_SIZE = 1;\nexport const DEFAULT_FONT_SIZE = 20;\nexport const DEFAULT_FONT_FAMILY: FontFamilyValues = FONT_FAMILY.Virgil;\nexport const DEFAULT_TEXT_ALIGN = \"left\";\nexport const DEFAULT_VERTICAL_ALIGN = \"top\";\nexport const DEFAULT_VERSION = \"{version}\";\nexport const DEFAULT_TRANSFORM_HANDLE_SPACING = 2;\n\nexport const CANVAS_ONLY_ACTIONS = [\"selectAll\"];\n\nexport const GRID_SIZE = 20; // TODO make it configurable?\n\nexport const IMAGE_MIME_TYPES = {\n svg: \"image/svg+xml\",\n png: \"image/png\",\n jpg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n bmp: \"image/bmp\",\n ico: \"image/x-icon\",\n avif: \"image/avif\",\n jfif: \"image/jfif\",\n} as const;\n\nexport const ALLOWED_PASTE_MIME_TYPES = [\"text/plain\", \"text/html\"] as const;\n\nexport const MIME_TYPES = {\n json: \"application/json\",\n // excalidraw data\n excalidraw: \"application/vnd.excalidraw+json\",\n excalidrawlib: \"application/vnd.excalidrawlib+json\",\n // image-encoded excalidraw data\n \"excalidraw.svg\": \"image/svg+xml\",\n \"excalidraw.png\": \"image/png\",\n // binary\n binary: \"application/octet-stream\",\n // image\n ...IMAGE_MIME_TYPES,\n} as const;\n\nexport const EXPORT_IMAGE_TYPES = {\n png: \"png\",\n svg: \"svg\",\n clipboard: \"clipboard\",\n} as const;\n\nexport const EXPORT_DATA_TYPES = {\n excalidraw: \"excalidraw\",\n excalidrawClipboard: \"excalidraw/clipboard\",\n excalidrawLibrary: \"excalidrawlib\",\n excalidrawClipboardWithAPI: \"excalidraw-api/clipboard\",\n} as const;\n\nexport const EXPORT_SOURCE =\n window.EXCALIDRAW_EXPORT_SOURCE || window.location.origin;\n\n// time in milliseconds\nexport const IMAGE_RENDER_TIMEOUT = 500;\nexport const TAP_TWICE_TIMEOUT = 300;\nexport const TOUCH_CTX_MENU_TIMEOUT = 500;\nexport const TITLE_TIMEOUT = 10000;\nexport const VERSION_TIMEOUT = 30000;\nexport const SCROLL_TIMEOUT = 100;\nexport const ZOOM_STEP = 0.1;\nexport const MIN_ZOOM = 0.1;\nexport const HYPERLINK_TOOLTIP_DELAY = 300;\n\n// Report a user inactive after IDLE_THRESHOLD milliseconds\nexport const IDLE_THRESHOLD = 60_000;\n// Report a user active each ACTIVE_THRESHOLD milliseconds\nexport const ACTIVE_THRESHOLD = 3_000;\n\nexport const THEME_FILTER = cssVariables.themeFilter;\n\nexport const URL_QUERY_KEYS = {\n addLibrary: \"addLibrary\",\n} as const;\n\nexport const URL_HASH_KEYS = {\n addLibrary: \"addLibrary\",\n} as const;\n\nexport const DEFAULT_UI_OPTIONS: AppProps[\"UIOptions\"] = {\n canvasActions: {\n changeViewBackgroundColor: true,\n clearCanvas: true,\n export: { saveFileToDisk: true },\n loadScene: true,\n saveToActiveFile: true,\n toggleTheme: null,\n saveAsImage: true,\n },\n tools: {\n image: true,\n },\n};\n\n// breakpoints\n// -----------------------------------------------------------------------------\n// md screen\nexport const MQ_MAX_WIDTH_PORTRAIT = 730;\nexport const MQ_MAX_WIDTH_LANDSCAPE = 1000;\nexport const MQ_MAX_HEIGHT_LANDSCAPE = 500;\n// sidebar\nexport const MQ_RIGHT_SIDEBAR_MIN_WIDTH = 1229;\n// -----------------------------------------------------------------------------\n\nexport const LIBRARY_SIDEBAR_WIDTH = parseInt(cssVariables.rightSidebarWidth);\n\nexport const MAX_DECIMALS_FOR_SVG_EXPORT = 2;\n\nexport const EXPORT_SCALES = [1, 2, 3];\nexport const DEFAULT_EXPORT_PADDING = 10; // px\n\nexport const DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT = 1440;\n\nexport const MAX_ALLOWED_FILE_BYTES = 2 * 1024 * 1024;\n\nexport const SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport const ENCRYPTION_KEY_BITS = 128;\n\nexport const VERSIONS = {\n excalidraw: 2,\n excalidrawLibrary: 2,\n} as const;\n\nexport const BOUND_TEXT_PADDING = 5;\nexport const ARROW_LABEL_WIDTH_FRACTION = 0.7;\nexport const ARROW_LABEL_FONT_SIZE_TO_MIN_WIDTH_RATIO = 11;\n\nexport const VERTICAL_ALIGN = {\n TOP: \"top\",\n MIDDLE: \"middle\",\n BOTTOM: \"bottom\",\n};\n\nexport const TEXT_ALIGN = {\n LEFT: \"left\",\n CENTER: \"center\",\n RIGHT: \"right\",\n};\n\nexport const ELEMENT_READY_TO_ERASE_OPACITY = 20;\n\n// Radius represented as 25% of element's largest side (width/height).\n// Used for LEGACY and PROPORTIONAL_RADIUS algorithms, or when the element is\n// below the cutoff size.\nexport const DEFAULT_PROPORTIONAL_RADIUS = 0.25;\n// Fixed radius for the ADAPTIVE_RADIUS algorithm. In pixels.\nexport const DEFAULT_ADAPTIVE_RADIUS = 32;\n// roundness type (algorithm)\nexport const ROUNDNESS = {\n // Used for legacy rounding (rectangles), which currently works the same\n // as PROPORTIONAL_RADIUS, but we need to differentiate for UI purposes and\n // forwards-compat.\n LEGACY: 1,\n\n // Used for linear elements & diamonds\n PROPORTIONAL_RADIUS: 2,\n\n // Current default algorithm for rectangles, using fixed pixel radius.\n // It's working similarly to a regular border-radius, but attemps to make\n // radius visually similar across differnt element sizes, especially\n // very large and very small elements.\n //\n // NOTE right now we don't allow configuration and use a constant radius\n // (see DEFAULT_ADAPTIVE_RADIUS constant)\n ADAPTIVE_RADIUS: 3,\n} as const;\n\n/** key containt id of precedeing elemnt id we use in reconciliation during\n * collaboration */\nexport const PRECEDING_ELEMENT_KEY = \"__precedingElement__\";\n\nexport const ROUGHNESS = {\n architect: 0,\n artist: 1,\n cartoonist: 2,\n} as const;\n\nexport const STROKE_WIDTH = {\n thin: 1,\n bold: 2,\n extraBold: 4,\n} as const;\n\nexport const DEFAULT_ELEMENT_PROPS: {\n strokeColor: ExcalidrawElement[\"strokeColor\"];\n backgroundColor: ExcalidrawElement[\"backgroundColor\"];\n fillStyle: ExcalidrawElement[\"fillStyle\"];\n strokeWidth: ExcalidrawElement[\"strokeWidth\"];\n strokeStyle: ExcalidrawElement[\"strokeStyle\"];\n roughness: ExcalidrawElement[\"roughness\"];\n opacity: ExcalidrawElement[\"opacity\"];\n locked: ExcalidrawElement[\"locked\"];\n} = {\n strokeColor: COLOR_PALETTE.black,\n backgroundColor: COLOR_PALETTE.transparent,\n fillStyle: \"solid\",\n strokeWidth: 2,\n strokeStyle: \"solid\",\n roughness: ROUGHNESS.artist,\n opacity: 100,\n locked: false,\n};\n\nexport const LIBRARY_SIDEBAR_TAB = \"library\";\n\nexport const DEFAULT_SIDEBAR = {\n name: \"default\",\n defaultTab: LIBRARY_SIDEBAR_TAB,\n} as const;\n\nexport const LIBRARY_DISABLED_TYPES = new Set([\n \"iframe\",\n \"embeddable\",\n \"image\",\n] as const);\n\n// use these constants to easily identify reference sites\nexport const TOOL_TYPE = {\n selection: \"selection\",\n rectangle: \"rectangle\",\n diamond: \"diamond\",\n ellipse: \"ellipse\",\n arrow: \"arrow\",\n line: \"line\",\n freedraw: \"freedraw\",\n text: \"text\",\n image: \"image\",\n eraser: \"eraser\",\n hand: \"hand\",\n frame: \"frame\",\n magicframe: \"magicframe\",\n embeddable: \"embeddable\",\n laser: \"laser\",\n} as const;\n\nexport const EDITOR_LS_KEYS = {\n OAI_API_KEY: \"excalidraw-oai-api-key\",\n // legacy naming (non)scheme\n MERMAID_TO_EXCALIDRAW: \"mermaid-to-excalidraw\",\n PUBLISH_LIBRARY: \"publish-library-data\",\n} as const;\n\n/**\n * not translated as this is used only in public, stateless API as default value\n * where filename is optional and we can't retrieve name from app state\n */\nexport const DEFAULT_FILENAME = \"Untitled\";\n", ":export {\n themeFilter: invert(93%) hue-rotate(180deg);\n rightSidebarWidth: 302px;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvZXhjYWxpZHJhdy9leGNhbGlkcmF3L3BhY2thZ2VzL2V4Y2FsaWRyYXcvY3NzIiwic291cmNlcyI6WyJ2YXJpYWJsZXMubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMktBO0VBQ0U7RUFDQSIsInNvdXJjZXNDb250ZW50IjpbIkBpbXBvcnQgXCJvcGVuLWNvbG9yL29wZW4tY29sb3Iuc2Nzc1wiO1xuXG5AbWl4aW4gaXNNb2JpbGUoKSB7XG4gIEBhdC1yb290IC5leGNhbGlkcmF3LS1tb2JpbGUjeyZ9IHtcbiAgICBAY29udGVudDtcbiAgfVxufVxuXG5AbWl4aW4gdG9vbGJhckJ1dHRvbkNvbG9yU3RhdGVzIHtcbiAgJi5maWxsYWJsZSB7XG4gICAgLlRvb2xJY29uX3R5cGVfcmFkaW8sXG4gICAgLlRvb2xJY29uX3R5cGVfY2hlY2tib3gge1xuICAgICAgJjpjaGVja2VkICsgLlRvb2xJY29uX19pY29uIHtcbiAgICAgICAgLS1pY29uLWZpbGwtY29sb3I6IHZhcigtLWNvbG9yLW9uLXByaW1hcnktY29udGFpbmVyKTtcblxuICAgICAgICBzdmcge1xuICAgICAgICAgIGZpbGw6IHZhcigtLWljb24tZmlsbC1jb2xvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuVG9vbEljb25fdHlwZV9yYWRpbyxcbiAgLlRvb2xJY29uX3R5cGVfY2hlY2tib3gge1xuICAgICY6Y2hlY2tlZCArIC5Ub29sSWNvbl9faWNvbiB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1zdXJmYWNlLXByaW1hcnktY29udGFpbmVyKTtcbiAgICAgIC0ta2V5YmluZGluZy1jb2xvcjogdmFyKC0tY29sb3Itb24tcHJpbWFyeS1jb250YWluZXIpO1xuXG4gICAgICBzdmcge1xuICAgICAgICBjb2xvcjogdmFyKC0tY29sb3Itb24tcHJpbWFyeS1jb250YWluZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5Ub29sSWNvbl9fa2V5YmluZGluZyB7XG4gICAgYm90dG9tOiA0cHg7XG4gICAgcmlnaHQ6IDRweDtcbiAgfVxuXG4gIC5Ub29sSWNvbl9faWNvbiB7XG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1idXR0b24taG92ZXItYmcpO1xuICAgIH1cblxuICAgICY6YWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWJ1dHRvbi1ob3Zlci1iZyk7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1idXR0b24tYWN0aXZlLWJvcmRlcik7XG5cbiAgICAgIHN2ZyB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1vbi1wcmltYXJ5LWNvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBvdXRsaW5lQnV0dG9uU3R5bGVzIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDAuNjI1cmVtO1xuICB3aWR0aDogdmFyKC0tYnV0dG9uLXdpZHRoLCB2YXIoLS1kZWZhdWx0LWJ1dHRvbi1zaXplKSk7XG4gIGhlaWdodDogdmFyKC0tYnV0dG9uLWhlaWdodCwgdmFyKC0tZGVmYXVsdC1idXR0b24tc2l6ZSkpO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idXR0b24tYm9yZGVyLCB2YXIoLS1kZWZhdWx0LWJvcmRlci1jb2xvcikpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1ib3JkZXItcmFkaXVzLWxnKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1idXR0b24tYmcsIHZhcigtLWlzbGFuZC1iZy1jb2xvcikpO1xuICBjb2xvcjogdmFyKC0tYnV0dG9uLWNvbG9yLCB2YXIoLS1jb2xvci1vbi1zdXJmYWNlKSk7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS11aS1mb250KTtcblxuICBzdmcge1xuICAgIHdpZHRoOiB2YXIoLS1idXR0b24td2lkdGgsIHZhcigtLWxnLWljb24tc2l6ZSkpO1xuICAgIGhlaWdodDogdmFyKC0tYnV0dG9uLWhlaWdodCwgdmFyKC0tbGctaWNvbi1zaXplKSk7XG4gIH1cblxuICAmOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1idXR0b24taG92ZXItYmcsIHZhcigtLWlzbGFuZC1iZy1jb2xvcikpO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKFxuICAgICAgLS1idXR0b24taG92ZXItYm9yZGVyLFxuICAgICAgdmFyKC0tYnV0dG9uLWJvcmRlciwgdmFyKC0tZGVmYXVsdC1ib3JkZXItY29sb3IpKVxuICAgICk7XG4gICAgY29sb3I6IHZhcihcbiAgICAgIC0tYnV0dG9uLWhvdmVyLWNvbG9yLFxuICAgICAgdmFyKC0tYnV0dG9uLWNvbG9yLCB2YXIoLS10ZXh0LXByaW1hcnktY29sb3IsIGluaGVyaXQpKVxuICAgICk7XG4gIH1cblxuICAmOmFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYnV0dG9uLWFjdGl2ZS1iZywgdmFyKC0taXNsYW5kLWJnLWNvbG9yKSk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1idXR0b24tYWN0aXZlLWJvcmRlciwgdmFyKC0tY29sb3ItcHJpbWFyeS1kYXJrZXN0KSk7XG4gIH1cblxuICAmLmFjdGl2ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKFxuICAgICAgLS1idXR0b24tc2VsZWN0ZWQtYmcsXG4gICAgICB2YXIoLS1jb2xvci1zdXJmYWNlLXByaW1hcnktY29udGFpbmVyKVxuICAgICk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoXG4gICAgICAtLWJ1dHRvbi1zZWxlY3RlZC1ib3JkZXIsXG4gICAgICB2YXIoLS1jb2xvci1zdXJmYWNlLXByaW1hcnktY29udGFpbmVyKVxuICAgICk7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcihcbiAgICAgICAgLS1idXR0b24tc2VsZWN0ZWQtaG92ZXItYmcsXG4gICAgICAgIHZhcigtLWNvbG9yLXN1cmZhY2UtcHJpbWFyeS1jb250YWluZXIpXG4gICAgICApO1xuICAgIH1cblxuICAgIHN2ZyB7XG4gICAgICBjb2xvcjogdmFyKC0tYnV0dG9uLWNvbG9yLCB2YXIoLS1jb2xvci1vbi1wcmltYXJ5LWNvbnRhaW5lcikpO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gYXZhdGFyU3R5bGVzIHtcbiAgd2lkdGg6IDEuMjVyZW07XG4gIGhlaWdodDogMS4yNXJlbTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDAuNzVyZW07XG4gIGZvbnQtd2VpZ2h0OiA4MDA7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogdmFyKC0tY29sb3ItZ3JheS05MCk7XG4gIGZsZXg6IDAgMCBhdXRvO1xuXG4gICYtaW1nIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgfVxuXG4gICY6OmJlZm9yZSB7XG4gICAgY29udGVudDogXCJcIjtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAtM3B4O1xuICAgIHJpZ2h0OiAtM3B4O1xuICAgIGJvdHRvbTogLTNweDtcbiAgICBsZWZ0OiAtM3B4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWF2YXRhci1ib3JkZXItY29sb3IpO1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gIH1cblxuICAmLS1pcy1mb2xsb3dlZDo6YmVmb3JlIHtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbG9yLXByaW1hcnktaG92ZXIpO1xuICB9XG4gICYtLWlzLWN1cnJlbnQtdXNlciB7XG4gICAgY3Vyc29yOiBhdXRvO1xuICB9XG59XG5cbkBtaXhpbiBmaWxsZWRCdXR0b25PbkNhbnZhcyB7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHZhcigtLWNvbG9yLXN1cmZhY2UtbG93ZXN0KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3Itc3VyZmFjZS1sb3cpO1xuXG4gICY6YWN0aXZlIHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggdmFyKC0tY29sb3ItYnJhbmQtYWN0aXZlKTtcbiAgfVxufVxuXG4kdGhlbWUtZmlsdGVyOiBcImludmVydCg5MyUpIGh1ZS1yb3RhdGUoMTgwZGVnKVwiO1xuJHJpZ2h0LXNpZGViYXItd2lkdGg6IFwiMzAycHhcIjtcblxuOmV4cG9ydCB7XG4gIHRoZW1lRmlsdGVyOiB1bnF1b3RlKCR0aGVtZS1maWx0ZXIpO1xuICByaWdodFNpZGViYXJXaWR0aDogdW5xdW90ZSgkcmlnaHQtc2lkZWJhci13aWR0aCk7XG59XG4iXX0= */", "import oc from \"open-color\";\nimport { Merge } from \"./utility-types\";\n\n// FIXME can't put to utils.ts rn because of circular dependency\nconst pick = <R extends Record<string, any>, K extends readonly (keyof R)[]>(\n source: R,\n keys: K,\n) => {\n return keys.reduce((acc, key: K[number]) => {\n if (key in source) {\n acc[key] = source[key];\n }\n return acc;\n }, {} as Pick<R, K[number]>) as Pick<R, K[number]>;\n};\n\nexport type ColorPickerColor =\n | Exclude<keyof oc, \"indigo\" | \"lime\">\n | \"transparent\"\n | \"bronze\";\nexport type ColorTuple = readonly [string, string, string, string, string];\nexport type ColorPalette = Merge<\n Record<ColorPickerColor, ColorTuple>,\n { black: \"#1e1e1e\"; white: \"#ffffff\"; transparent: \"transparent\" }\n>;\n\n// used general type instead of specific type (ColorPalette) to support custom colors\nexport type ColorPaletteCustom = { [key: string]: ColorTuple | string };\nexport type ColorShadesIndexes = [number, number, number, number, number];\n\nexport const MAX_CUSTOM_COLORS_USED_IN_CANVAS = 5;\nexport const COLORS_PER_ROW = 5;\n\nexport const DEFAULT_CHART_COLOR_INDEX = 4;\n\nexport const DEFAULT_ELEMENT_STROKE_COLOR_INDEX = 4;\nexport const DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX = 1;\nexport const ELEMENTS_PALETTE_SHADE_INDEXES = [0, 2, 4, 6, 8] as const;\nexport const CANVAS_PALETTE_SHADE_INDEXES = [0, 1, 2, 3, 4] as const;\n\nexport const getSpecificColorShades = (\n color: Exclude<\n ColorPickerColor,\n \"transparent\" | \"white\" | \"black\" | \"bronze\"\n >,\n indexArr: Readonly<ColorShadesIndexes>,\n) => {\n return indexArr.map((index) => oc[color][index]) as any as ColorTuple;\n};\n\nexport const COLOR_PALETTE = {\n transparent: \"transparent\",\n black: \"#1e1e1e\",\n white: \"#ffffff\",\n // open-colors\n gray: getSpecificColorShades(\"gray\", ELEMENTS_PALETTE_SHADE_INDEXES),\n red: getSpecificColorShades(\"red\", ELEMENTS_PALETTE_SHADE_INDEXES),\n pink: getSpecificColorShades(\"pink\", ELEMENTS_PALETTE_SHADE_INDEXES),\n grape: getSpecificColorShades(\"grape\", ELEMENTS_PALETTE_SHADE_INDEXES),\n violet: getSpecificColorShades(\"violet\", ELEMENTS_PALETTE_SHADE_INDEXES),\n blue: getSpecificColorShades(\"blue\", ELEMENTS_PALETTE_SHADE_INDEXES),\n cyan: getSpecificColorShades(\"cyan\", ELEMENTS_PALETTE_SHADE_INDEXES),\n teal: getSpecificColorShades(\"teal\", ELEMENTS_PALETTE_SHADE_INDEXES),\n green: getSpecificColorShades(\"green\", ELEMENTS_PALETTE_SHADE_INDEXES),\n yellow: getSpecificColorShades(\"yellow\", ELEMENTS_PALETTE_SHADE_INDEXES),\n orange: getSpecificColorShades(\"orange\", ELEMENTS_PALETTE_SHADE_INDEXES),\n // radix bronze shades 3,5,7,9,11\n bronze: [\"#f8f1ee\", \"#eaddd7\", \"#d2bab0\", \"#a18072\", \"#846358\"],\n} as ColorPalette;\n\nconst COMMON_ELEMENT_SHADES = pick(COLOR_PALETTE, [\n \"cyan\",\n \"blue\",\n \"violet\",\n \"grape\",\n \"pink\",\n \"green\",\n \"teal\",\n \"yellow\",\n \"orange\",\n \"red\",\n]);\n\n// -----------------------------------------------------------------------------\n// quick picks defaults\n// -----------------------------------------------------------------------------\n\n// ORDER matters for positioning in quick picker\nexport const DEFAULT_ELEMENT_STROKE_PICKS = [\n COLOR_PALETTE.black,\n COLOR_PALETTE.red[DEFAULT_ELEMENT_STROKE_COLOR_INDEX],\n COLOR_PALETTE.green[DEFAULT_ELEMENT_STROKE_COLOR_INDEX],\n COLOR_PALETTE.blue[DEFAULT_ELEMENT_STROKE_COLOR_INDEX],\n COLOR_PALETTE.yellow[DEFAULT_ELEMENT_STROKE_COLOR_INDEX],\n] as ColorTuple;\n\n// ORDER matters for positioning in quick picker\nexport const DEFAULT_ELEMENT_BACKGROUND_PICKS = [\n COLOR_PALETTE.transparent,\n COLOR_PALETTE.red[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX],\n COLOR_PALETTE.green[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX],\n COLOR_PALETTE.blue[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX],\n COLOR_PALETTE.yellow[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX],\n] as ColorTuple;\n\n// ORDER matters for positioning in quick picker\nexport const DEFAULT_CANVAS_BACKGROUND_PICKS = [\n COLOR_PALETTE.white,\n // radix slate2\n \"#f8f9fa\",\n // radix blue2\n \"#f5faff\",\n // radix yellow2\n \"#fffce8\",\n // radix bronze2\n \"#fdf8f6\",\n] as ColorTuple;\n\n// -----------------------------------------------------------------------------\n// palette defaults\n// -----------------------------------------------------------------------------\n\nexport const DEFAULT_ELEMENT_STROKE_COLOR_PALETTE = {\n // 1st row\n transparent: COLOR_PALETTE.transparent,\n white: COLOR_PALETTE.white,\n gray: COLOR_PALETTE.gray,\n black: COLOR_PALETTE.black,\n bronze: COLOR_PALETTE.bronze,\n // rest\n ...COMMON_ELEMENT_SHADES,\n} as const;\n\n// ORDER matters for positioning in pallete (5x3 grid)s\nexport const DEFAULT_ELEMENT_BACKGROUND_COLOR_PALETTE = {\n transparent: COLOR_PALETTE.transparent,\n white: COLOR_PALETTE.white,\n gray: COLOR_PALETTE.gray,\n black: COLOR_PALETTE.black,\n bronze: COLOR_PALETTE.bronze,\n\n ...COMMON_ELEMENT_SHADES,\n} as const;\n\n// -----------------------------------------------------------------------------\n// helpers\n// -----------------------------------------------------------------------------\n\n// !!!MUST BE WITHOUT GRAY, TRANSPARENT AND BLACK!!!\nexport const getAllColorsSpecificShade = (index: 0 | 1 | 2 | 3 | 4) =>\n [\n // 2nd row\n COLOR_PALETTE.cyan[index],\n COLOR_PALETTE.blue[index],\n COLOR_PALETTE.violet[index],\n COLOR_PALETTE.grape[index],\n COLOR_PALETTE.pink[index],\n\n // 3rd row\n COLOR_PALETTE.green[index],\n COLOR_PALETTE.teal[index],\n COLOR_PALETTE.yellow[index],\n COLOR_PALETTE.orange[index],\n COLOR_PALETTE.red[index],\n ] as const;\n\nexport const rgbToHex = (r: number, g: number, b: number) =>\n `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;\n\n// -----------------------------------------------------------------------------\n", "{\n \"white\": \"#ffffff\",\n \"black\": \"#000000\",\n \"gray\": [\n \"#f8f9fa\",\n \"#f1f3f5\",\n \"#e9ecef\",\n \"#dee2e6\",\n \"#ced4da\",\n \"#adb5bd\",\n \"#868e96\",\n \"#495057\",\n \"#343a40\",\n \"#212529\"\n ],\n \"red\": [\n \"#fff5f5\",\n \"#ffe3e3\",\n \"#ffc9c9\",\n \"#ffa8a8\",\n \"#ff8787\",\n \"#ff6b6b\",\n \"#fa5252\",\n \"#f03e3e\",\n \"#e03131\",\n \"#c92a2a\"\n ],\n \"pink\": [\n \"#fff0f6\",\n \"#ffdeeb\",\n \"#fcc2d7\",\n \"#faa2c1\",\n \"#f783ac\",\n \"#f06595\",\n \"#e64980\",\n \"#d6336c\",\n \"#c2255c\",\n \"#a61e4d\"\n ],\n \"grape\": [\n \"#f8f0fc\",\n \"#f3d9fa\",\n \"#eebefa\",\n \"#e599f7\",\n \"#da77f2\",\n \"#cc5de8\",\n \"#be4bdb\",\n \"#ae3ec9\",\n \"#9c36b5\",\n \"#862e9c\"\n ],\n \"violet\": [\n \"#f3f0ff\",\n \"#e5dbff\",\n \"#d0bfff\",\n \"#b197fc\",\n \"#9775fa\",\n \"#845ef7\",\n \"#7950f2\",\n \"#7048e8\",\n \"#6741d9\",\n \"#5f3dc4\"\n ],\n \"indigo\": [\n \"#edf2ff\",\n \"#dbe4ff\",\n \"#bac8ff\",\n \"#91a7ff\",\n \"#748ffc\",\n \"#5c7cfa\",\n \"#4c6ef5\",\n \"#4263eb\",\n \"#3b5bdb\",\n \"#364fc7\"\n ],\n \"blue\": [\n \"#e7f5ff\",\n \"#d0ebff\",\n \"#a5d8ff\",\n \"#74c0fc\",\n \"#4dabf7\",\n \"#339af0\",\n \"#228be6\",\n \"#1c7ed6\",\n \"#1971c2\",\n \"#1864ab\"\n ],\n \"cyan\": [\n \"#e3fafc\",\n \"#c5f6fa\",\n \"#99e9f2\",\n \"#66d9e8\",\n \"#3bc9db\",\n \"#22b8cf\",\n \"#15aabf\",\n \"#1098ad\",\n \"#0c8599\",\n \"#0b7285\"\n ],\n \"teal\": [\n \"#e6fcf5\",\n \"#c3fae8\",\n \"#96f2d7\",\n \"#63e6be\",\n \"#38d9a9\",\n \"#20c997\",\n \"#12b886\",\n \"#0ca678\",\n \"#099268\",\n \"#087f5b\"\n ],\n \"green\": [\n \"#ebfbee\",\n \"#d3f9d8\",\n \"#b2f2bb\",\n \"#8ce99a\",\n \"#69db7c\",\n \"#51cf66\",\n \"#40c057\",\n \"#37b24d\",\n \"#2f9e44\",\n \"#2b8a3e\"\n ],\n \"lime\": [\n \"#f4fce3\",\n \"#e9fac8\",\n \"#d8f5a2\",\n \"#c0eb75\",\n \"#a9e34b\",\n \"#94d82d\",\n \"#82c91e\",\n \"#74b816\",\n \"#66a80f\",\n \"#5c940d\"\n ],\n \"yellow\": [\n \"#fff9db\",\n \"#fff3bf\",\n \"#ffec99\",\n \"#ffe066\",\n \"#ffd43b\",\n \"#fcc419\",\n \"#fab005\",\n \"#f59f00\",\n \"#f08c00\",\n \"#e67700\"\n ],\n \"orange\": [\n \"#fff4e6\",\n \"#ffe8cc\",\n \"#ffd8a8\",\n \"#ffc078\",\n \"#ffa94d\",\n \"#ff922b\",\n \"#fd7e14\",\n \"#f76707\",\n \"#e8590c\",\n \"#d9480f\"\n ]\n}", "import { nanoid } from \"nanoid\";\nimport { cleanAppStateForExport } from \"../appState\";\nimport { IMAGE_MIME_TYPES, MIME_TYPES } from \"../constants\";\nimport { clearElementsForExport } from \"../element\";\nimport { ExcalidrawElement, FileId } from \"../element/types\";\nimport { CanvasError, ImageSceneDataError } from \"../errors\";\nimport { calculateScrollCenter } from \"../scene\";\nimport { AppState, DataURL, LibraryItem } from \"../types\";\nimport { ValueOf } from \"../utility-types\";\nimport { bytesToHexString, isPromiseLike } from \"../utils\";\nimport { FileSystemHandle, nativeFileSystemSupported } from \"./filesystem\";\nimport { isValidExcalidrawData, isValidLibrary } from \"./json\";\nimport { restore, restoreLibraryItems } from \"./restore\";\nimport { ImportedLibraryData } from \"./types\";\n\nconst parseFileContents = async (blob: Blob | File) => {\n let contents: string;\n\n if (blob.type === MIME_TYPES.png) {\n try {\n return await (await import(\"./image\")).decodePngMetadata(blob);\n } catch (error: any) {\n if (error.message === \"INVALID\") {\n throw new ImageSceneDataError(\n \"Image doesn't contain scene\",\n \"IMAGE_NOT_CONTAINS_SCENE_DATA\",\n );\n } else {\n throw new ImageSceneDataError(\"Error: cannot restore image\");\n }\n }\n } else {\n if (\"text\" in Blob) {\n contents = await blob.text();\n } else {\n contents = await new Promise((resolve) => {\n const reader = new FileReader();\n reader.readAsText(blob, \"utf8\");\n reader.onloadend = () => {\n if (reader.readyState === FileReader.DONE) {\n resolve(reader.result as string);\n }\n };\n });\n }\n if (blob.type === MIME_TYPES.svg) {\n try {\n return await (\n await import(\"./image\")\n ).decodeSvgMetadata({\n svg: contents,\n });\n } catch (error: any) {\n if (error.message === \"INVALID\") {\n throw new ImageSceneDataError(\n \"Image doesn't contain scene\",\n \"IMAGE_NOT_CONTAINS_SCENE_DATA\",\n );\n } else {\n throw new ImageSceneDataError(\"Error: cannot restore image\");\n }\n }\n }\n }\n return contents;\n};\n\nexport const getMimeType = (blob: Blob | string): string => {\n let name: string;\n if (typeof blob === \"string\") {\n name = blob;\n } else {\n if (blob.type) {\n return blob.type;\n }\n name = blob.name || \"\";\n }\n if (/\\.(excalidraw|json)$/.test(name)) {\n return MIME_TYPES.json;\n } else if (/\\.png$/.test(name)) {\n return MIME_TYPES.png;\n } else if (/\\.jpe?g$/.test(name)) {\n return MIME_TYPES.jpg;\n } else if (/\\.svg$/.test(name)) {\n return MIME_TYPES.svg;\n }\n return \"\";\n};\n\nexport const getFileHandleType = (handle: FileSystemHandle | null) => {\n if (!handle) {\n return null;\n }\n\n return handle.name.match(/\\.(json|excalidraw|png|svg)$/)?.[1] || null;\n};\n\nexport const isImageFileHandleType = (\n type: string | null,\n): type is \"png\" | \"svg\" => {\n return type === \"png\" || type === \"svg\";\n};\n\nexport const isImageFileHandle = (handle: FileSystemHandle | null) => {\n const type = getFileHandleType(handle);\n return type === \"png\" || type === \"svg\";\n};\n\nexport const isSupportedImageFile = (\n blob: Blob | null | undefined,\n): blob is Blob & { type: ValueOf<typeof IMAGE_MIME_TYPES> } => {\n const { type } = blob || {};\n return !!type && (Object.values(IMAGE_MIME_TYPES) as string[]).includes(type);\n};\n\nexport const loadSceneOrLibraryFromBlob = async (\n blob: Blob | File,\n /** @see restore.localAppState */\n localAppState: AppState | null,\n localElements: readonly ExcalidrawElement[] | null,\n /** FileSystemHandle. Defaults to `blob.handle` if defined, otherwise null. */\n fileHandle?: FileSystemHandle | null,\n) => {\n const contents = await parseFileContents(blob);\n let data;\n try {\n try {\n data = JSON.parse(contents);\n } catch (error: any) {\n if (isSupportedImageFile(blob)) {\n throw new ImageSceneDataError(\n \"Image doesn't contain scene\",\n \"IMAGE_NOT_CONTAINS_SCENE_DATA\",\n );\n }\n throw error;\n }\n if (isValidExcalidrawData(data)) {\n return {\n type: MIME_TYPES.excalidraw,\n data: restore(\n {\n elements: clearElementsForExport(data.elements || []),\n appState: {\n theme: localAppState?.theme,\n fileHandle: fileHandle || blob.handle || null,\n ...cleanAppStateForExport(data.appState || {}),\n ...(localAppState\n ? calculateScrollCenter(data.elements || [], localAppState)\n : {}),\n },\n files: data.files,\n },\n localAppState,\n localElements,\n { repairBindings: true, refreshDimensions: false },\n ),\n };\n } else if (isValidLibrary(data)) {\n return {\n type: MIME_TYPES.excalidrawlib,\n data,\n };\n }\n throw new Error(\"Error: invalid file\");\n } catch (error: any) {\n if (error instanceof ImageSceneDataError) {\n throw error;\n }\n throw new Error(\"Error: invalid file\");\n }\n};\n\nexport const loadFromBlob = async (\n blob: Blob,\n /** @see restore.localAppState */\n localAppState: AppState | null,\n localElements: readonly ExcalidrawElement[] | null,\n /** FileSystemHandle. Defaults to `blob.handle` if defined, otherwise null. */\n fileHandle?: FileSystemHandle | null,\n) => {\n const ret = await loadSceneOrLibraryFromBlob(\n blob,\n localAppState,\n localElements,\n fileHandle,\n );\n if (ret.type !== MIME_TYPES.excalidraw) {\n throw new Error(\"Error: invalid file\");\n }\n return ret.data;\n};\n\nexport const parseLibraryJSON = (\n json: string,\n defaultStatus: LibraryItem[\"status\"] = \"unpublished\",\n) => {\n const data: ImportedLibraryData | undefined = JSON.parse(json);\n if (!isValidLibrary(data)) {\n throw new Error(\"Invalid library\");\n }\n const libraryItems = data.libraryItems || data.library;\n return restoreLibraryItems(libraryItems, defaultStatus);\n};\n\nexport const loadLibraryFromBlob = async (\n blob: Blob,\n defaultStatus: LibraryItem[\"status\"] = \"unpublished\",\n) => {\n return parseLibraryJSON(await parseFileContents(blob), defaultStatus);\n};\n\nexport const canvasToBlob = async (\n canvas: HTMLCanvasElement | Promise<HTMLCanvasElement>,\n): Promise<Blob> => {\n return new Promise(async (resolve, reject) => {\n try {\n if (isPromiseLike(canvas)) {\n canvas = await canvas;\n }\n canvas.toBlob((blob) => {\n if (!blob) {\n return reject(\n new CanvasError(\"Error: Canvas too big\", \"CANVAS_POSSIBLY_TOO_BIG\"),\n );\n }\n resolve(blob);\n });\n } catch (error: any) {\n reject(error);\n }\n });\n};\n\n/** generates SHA-1 digest from supplied file (if not supported, falls back\n to a 40-char base64 random id) */\nexport const generateIdFromFile = async (file: File): Promise<FileId> => {\n try {\n const hashBuffer = await window.crypto.subtle.digest(\n \"SHA-1\",\n await blobToArrayBuffer(file),\n );\n return bytesToHexString(new Uint8Array(hashBuffer)) as FileId;\n } catch (error: any) {\n console.error(error);\n // length 40 to align with the HEX length of SHA-1 (which is 160 bit)\n return nanoid(40) as FileId;\n }\n};\n\nexport const getDataURL = async (file: Blob | File): Promise<DataURL> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const dataURL = reader.result as DataURL;\n resolve(dataURL);\n };\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n};\n\nexport const dataURLToFile = (dataURL: DataURL, filename = \"\") => {\n const dataIndexStart = dataURL.indexOf(\",\");\n const byteString = atob(dataURL.slice(dataIndexStart + 1));\n const mimeType = dataURL.slice(0, dataIndexStart).split(\":\")[1].split(\";\")[0];\n\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new File([ab], filename, { type: mimeType });\n};\n\nexport const resizeImageFile = async (\n file: File,\n opts: {\n /** undefined indicates auto */\n outputType?: typeof MIME_TYPES[\"jpg\"];\n maxWidthOrHeight: number;\n },\n): Promise<File> => {\n // SVG files shouldn't a can't be resized\n if (file.type === MIME_TYPES.svg) {\n return file;\n }\n\n const [pica, imageBlobReduce] = await Promise.all([\n import(\"pica\").then((res) => res.default),\n // a wrapper for pica for better API\n import(\"image-blob-reduce\").then((res) => res.default),\n ]);\n\n // CRA's minification settings break pica in WebWorkers, so let's disable\n // them for now\n // https://github.com/nodeca/image-blob-reduce/issues/21#issuecomment-757365513\n const reduce = imageBlobReduce({\n pica: pica({ features: [\"js\", \"wasm\"] }),\n });\n\n if (opts.outputType) {\n const { outputType } = opts;\n reduce._create_blob = function (env) {\n return this.pica.toBlob(env.out_canvas, outputType, 0.8).then((blob) => {\n env.out_blob = blob;\n return env;\n });\n };\n }\n\n if (!isSupportedImageFile(file)) {\n throw new Error(\"Error: unsupported file type\", { cause: \"UNSUPPORTED\" });\n }\n\n return new File(\n [await reduce.toBlob(file, { max: opts.maxWidthOrHeight })],\n file.name,\n {\n type: opts.outputType || file.type,\n },\n );\n};\n\nexport const SVGStringToFile = (SVGString: string, filename: string = \"\") => {\n return new File([new TextEncoder().encode(SVGString)], filename, {\n type: MIME_TYPES.svg,\n }) as File & { type: typeof MIME_TYPES.svg };\n};\n\nexport const ImageURLToFile = async (\n imageUrl: string,\n filename: string = \"\",\n): Promise<File | undefined> => {\n let response;\n try {\n response = await fetch(imageUrl);\n } catch (error: any) {\n throw new Error(\"Error: failed to fetch image\", { cause: \"FETCH_ERROR\" });\n }\n\n if (!response.ok) {\n throw new Error(\"Error: failed to fetch image\", { cause: \"FETCH_ERROR\" });\n }\n\n const blob = await response.blob();\n\n if (blob.type && isSupportedImageFile(blob)) {\n const name = filename || blob.name || \"\";\n return new File([blob], name, { type: blob.type });\n }\n\n throw new Error(\"Error: unsupported file type\", { cause: \"UNSUPPORTED\" });\n};\n\nexport const getFileFromEvent = async (\n event: React.DragEvent<HTMLDivElement>,\n) => {\n const file = event.dataTransfer.files.item(0);\n const fileHandle = await getFileHandle(event);\n\n return { file: file ? await normalizeFile(file) : null, fileHandle };\n};\n\nexport const getFileHandle = async (\n event: React.DragEvent<HTMLDivElement>,\n): Promise<FileSystemHandle | null> => {\n if (nativeFileSystemSupported) {\n try {\n const item = event.dataTransfer.items[0];\n const handle: FileSystemHandle | null =\n (await (item as any).getAsFileSystemHandle()) || null;\n\n return handle;\n } catch (error: any) {\n console.warn(error.name, error.message);\n return null;\n }\n }\n return null;\n};\n\n/**\n * attempts to detect if a buffer is a valid image by checking its leading bytes\n */\nconst getActualMimeTypeFromImage = (buffer: ArrayBuffer) => {\n let mimeType: ValueOf<Pick<typeof MIME_TYPES, \"png\" | \"jpg\" | \"gif\">> | null =\n null;\n\n const first8Bytes = `${[...new Uint8Array(buffer).slice(0, 8)].join(\" \")} `;\n\n // uint8 leading bytes\n const headerBytes = {\n // https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header\n png: \"137 80 78 71 13 10 26 10 \",\n // https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure\n // jpg is a bit wonky. Checking the first three bytes should be enough,\n // but may yield false positives. (https://stackoverflow.com/a/23360709/927631)\n jpg: \"255 216 255 \",\n // https://en.wikipedia.org/wiki/GIF#Example_GIF_file\n gif: \"71 73 70 56 57 97 \",\n };\n\n if (first8Bytes === headerBytes.png) {\n mimeType = MIME_TYPES.png;\n } else if (first8Bytes.startsWith(headerBytes.jpg)) {\n mimeType = MIME_TYPES.jpg;\n } else if (first8Bytes.startsWith(headerBytes.gif)) {\n mimeType = MIME_TYPES.gif;\n }\n return mimeType;\n};\n\nexport const createFile = (\n blob: File | Blob | ArrayBuffer,\n mimeType: ValueOf<typeof MIME_TYPES>,\n name: string | undefined,\n) => {\n return new File([blob], name || \"\", {\n type: mimeType,\n });\n};\n\n/** attempts to detect correct mimeType if none is set, or if an image\n * has an incorrect extension.\n * Note: doesn't handle missing .excalidraw/.excalidrawlib extension */\nexport const normalizeFile = async (file: File) => {\n if (!file.type) {\n if (file?.name?.endsWith(\".excalidrawlib\")) {\n file = createFile(\n await blobToArrayBuffer(file),\n MIME_TYPES.excalidrawlib,\n file.name,\n );\n } else if (file?.name?.endsWith(\".excalidraw\")) {\n file = createFile(\n await blobToArrayBuffer(file),\n MIME_TYPES.excalidraw,\n file.name,\n );\n } else {\n const buffer = await blobToArrayBuffer(file);\n const mimeType = getActualMimeTypeFromImage(buffer);\n if (mimeType) {\n file = createFile(buffer, mimeType, file.name);\n }\n }\n // when the file is an image, make sure the extension corresponds to the\n // actual mimeType (this is an edge case, but happens sometime)\n } else if (isSupportedImageFile(file)) {\n const buffer = await blobToArrayBuffer(file);\n const mimeType = getActualMimeTypeFromImage(buffer);\n if (mimeType && mimeType !== file.type) {\n file = createFile(buffer, mimeType, file.name);\n }\n }\n\n return file;\n};\n\nexport const blobToArrayBuffer = (blob: Blob): Promise<ArrayBuffer> => {\n if (\"arrayBuffer\" in blob) {\n return blob.arrayBuffer();\n }\n // Safari\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (event) => {\n if (!event.target?.result) {\n return reject(new Error(\"Couldn't convert blob to ArrayBuffer\"));\n }\n resolve(event.target.result as ArrayBuffer);\n };\n reader.readAsArrayBuffer(blob);\n });\n};\n", "import { urlAlphabet } from './url-alphabet/index.js'\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n", "let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nexport { urlAlphabet }\n", "import { COLOR_PALETTE } from \"./colors\";\nimport {\n DEFAULT_ELEMENT_PROPS,\n DEFAULT_FONT_FAMILY,\n DEFAULT_FONT_SIZE,\n DEFAULT_TEXT_ALIGN,\n EXPORT_SCALES,\n THEME,\n} from \"./constants\";\nimport { AppState, NormalizedZoomValue } from \"./types\";\n\nconst defaultExportScale = EXPORT_SCALES.includes(devicePixelRatio)\n ? devicePixelRatio\n : 1;\n\nexport const getDefaultAppState = (): Omit<\n AppState,\n \"offsetTop\" | \"offsetLeft\" | \"width\" | \"height\"\n> => {\n return {\n showWelcomeScreen: false,\n theme: THEME.LIGHT,\n collaborators: new Map(),\n currentChartType: \"bar\",\n currentItemBackgroundColor: DEFAULT_ELEMENT_PROPS.backgroundColor,\n currentItemEndArrowhead: \"arrow\",\n currentItemFillStyle: DEFAULT_ELEMENT_PROPS.fillStyle,\n currentItemFontFamily: DEFAULT_FONT_FAMILY,\n currentItemFontSize: DEFAULT_FONT_SIZE,\n currentItemOpacity: DEFAULT_ELEMENT_PROPS.opacity,\n currentItemRoughness: DEFAULT_ELEMENT_PROPS.roughness,\n currentItemStartArrowhead: null,\n currentItemStrokeColor: DEFAULT_ELEMENT_PROPS.strokeColor,\n currentItemRoundness: \"round\",\n currentItemStrokeStyle: DEFAULT_ELEMENT_PROPS.strokeStyle,\n currentItemStrokeWidth: DEFAULT_ELEMENT_PROPS.strokeWidth,\n currentItemTextAlign: DEFAULT_TEXT_ALIGN,\n cursorButton: \"up\",\n activeEmbeddable: null,\n draggingElement: null,\n editingElement: null,\n editingGroupId: null,\n editingLinearElement: null,\n activeTool: {\n type: \"selection\",\n customType: null,\n locked: DEFAULT_ELEMENT_PROPS.locked,\n lastActiveTool: null,\n },\n penMode: false,\n penDetected: false,\n errorMessage: null,\n exportBackground: true,\n exportScale: defaultExportScale,\n exportEmbedScene: false,\n exportWithDarkMode: false,\n fileHandle: null,\n gridSize: null,\n isBindingEnabled: true,\n defaultSidebarDockedPreference: false,\n isLoading: false,\n isResizing: false,\n isRotating: false,\n lastPointerDownWith: \"mouse\",\n multiElement: null,\n name: null,\n contextMenu: null,\n openMenu: null,\n openPopup: null,\n openSidebar: null,\n openDialog: null,\n pasteDialog: { shown: false, data: null },\n previousSelectedElementIds: {},\n resizingElement: null,\n scrolledOutside: false,\n scrollX: 0,\n scrollY: 0,\n selectedElementIds: {},\n selectedGroupIds: {},\n selectedElementsAreBeingDragged: false,\n selectionElement: null,\n shouldCacheIgnoreZoom: false,\n showStats: false,\n startBoundElement: null,\n suggestedBindings: [],\n frameRendering: { enabled: true, clip: true, name: true, outline: true },\n frameToHighlight: null,\n editingFrame: null,\n elementsToHighlight: null,\n toast: null,\n viewBackgroundColor: COLOR_PALETTE.white,\n zenModeEnabled: false,\n zoom: {\n value: 1 as NormalizedZoomValue,\n },\n viewModeEnabled: false,\n pendingImageElementId: null,\n showHyperlinkPopup: false,\n selectedLinearElement: null,\n snapLines: [],\n originSnapOffset: {\n x: 0,\n y: 0,\n },\n objectsSnapModeEnabled: false,\n userToFollow: null,\n followedBy: new Set(),\n };\n};\n\n/**\n * Config containing all AppState keys. Used to determine whether given state\n * prop should be stripped when exporting to given storage type.\n */\nconst APP_STATE_STORAGE_CONF = (<\n Values extends {\n /** whether to keep when storing to browser storage (localStorage/IDB) */\n browser: boolean;\n /** whether to keep when exporting to file/database */\n export: boolean;\n /** server (shareLink/collab/...) */\n server: boolean;\n },\n T extends Record<keyof AppState, Values>,\n>(config: { [K in keyof T]: K extends keyof AppState ? T[K] : never }) =>\n config)({\n showWelcomeScreen: { browser: true, export: false, server: false },\n theme: { browser: true, export: false, server: false },\n collaborators: { browser: false, export: false, server: false },\n currentChartType: { browser: true, export: false, server: false },\n currentItemBackgroundColor: { browser: true, export: false, server: false },\n currentItemEndArrowhead: { browser: true, export: false, server: false },\n currentItemFillStyle: { browser: true, export: false, server: false },\n currentItemFontFamily: { browser: true, export: false, server: false },\n currentItemFontSize: { browser: true, export: false, server: false },\n currentItemRoundness: {\n browser: true,\n export: false,\n server: false,\n },\n currentItemOpacity: { browser: true, export: false, server: false },\n currentItemRoughness: { browser: true, export: false, server: false },\n currentItemStartArrowhead: { browser: true, export: false, server: false },\n currentItemStrokeColor: { browser: true, export: false, server: false },\n currentItemStrokeStyle: { browser: true, export: false, server: false },\n currentItemStrokeWidth: { browser: true, export: false, server: false },\n currentItemTextAlign: { browser: true, export: false, server: false },\n cursorButton: { browser: true, export: false, server: false },\n activeEmbeddable: { browser: false, export: false, server: false },\n draggingElement: { browser: false, export: false, server: false },\n editingElement: { browser: false, export: false, server: false },\n editingGroupId: { browser: true, export: false, server: false },\n editingLinearElement: { browser: false, export: false, server: false },\n activeTool: { browser: true, export: false, server: false },\n penMode: { browser: true, export: false, server: false },\n penDetected: { browser: true, export: false, server: false },\n errorMessage: { browser: false, export: false, server: false },\n exportBackground: { browser: true, export: false, server: false },\n exportEmbedScene: { browser: true, export: false, server: false },\n exportScale: { browser: true, export: false, server: false },\n exportWithDarkMode: { browser: true, export: false, server: false },\n fileHandle: { browser: false, export: false, server: false },\n gridSize: { browser: true, export: true, server: true },\n height: { browser: false, export: false, server: false },\n isBindingEnabled: { browser: false, export: false, server: false },\n defaultSidebarDockedPreference: {\n browser: true,\n export: false,\n server: false,\n },\n isLoading: { browser: false, export: false, server: false },\n isResizing: { browser: false, export: false, server: false },\n isRotating: { browser: false, export: false, server: false },\n lastPointerDownWith: { browser: true, export: false, server: false },\n multiElement: { browser: false, export: false, server: false },\n name: { browser: true, export: false, server: false },\n offsetLeft: { browser: false, export: false, server: false },\n offsetTop: { browser: false, export: false, server: false },\n contextMenu: { browser: false, export: false, server: false },\n openMenu: { browser: true, export: false, server: false },\n openPopup: { browser: false, export: false, server: false },\n openSidebar: { browser: true, export: false, server: false },\n openDialog: { browser: false, export: false, server: false },\n pasteDialog: { browser: false, export: false, server: false },\n previousSelectedElementIds: { browser: true, export: false, server: false },\n resizingElement: { browser: false, export: false, server: false },\n scrolledOutside: { browser: true, export: false, server: false },\n scrollX: { browser: true, export: false, server: false },\n scrollY: { browser: true, export: false, server: false },\n selectedElementIds: { browser: true, export: false, server: false },\n selectedGroupIds: { browser: true, export: false, server: false },\n selectedElementsAreBeingDragged: {\n browser: false,\n export: false,\n server: false,\n },\n selectionElement: { browser: false, export: false, server: false },\n shouldCacheIgnoreZoom: { browser: true, export: false, server: false },\n showStats: { browser: true, export: false, server: false },\n startBoundElement: { browser: false, export: false, server: false },\n suggestedBindings: { browser: false, export: false, server: false },\n frameRendering: { browser: false, export: false, server: false },\n frameToHighlight: { browser: false, export: false, server: false },\n editingFrame: { browser: false, export: false, server: false },\n elementsToHighlight: { browser: false, export: false, server: false },\n toast: { browser: false, export: false, server: false },\n viewBackgroundColor: { browser: true, export: true, server: true },\n width: { browser: false, export: false, server: false },\n zenModeEnabled: { browser: true, export: false, server: false },\n zoom: { browser: true, export: false, server: false },\n viewModeEnabled: { browser: false, export: false, server: false },\n pendingImageElementId: { browser: false, export: false, server: false },\n showHyperlinkPopup: { browser: false, export: false, server: false },\n selectedLinearElement: { browser: true, export: false, server: false },\n snapLines: { browser: false, export: false, server: false },\n originSnapOffset: { browser: false, export: false, server: false },\n objectsSnapModeEnabled: { browser: true, export: false, server: false },\n userToFollow: { browser: false, export: false, server: false },\n followedBy: { browser: false, export: false, server: false },\n});\n\nconst _clearAppStateForStorage = <\n ExportType extends \"export\" | \"browser\" | \"server\",\n>(\n appState: Partial<AppState>,\n exportType: ExportType,\n) => {\n type ExportableKeys = {\n [K in keyof typeof APP_STATE_STORAGE_CONF]: typeof APP_STATE_STORAGE_CONF[K][ExportType] extends true\n ? K\n : never;\n }[keyof typeof APP_STATE_STORAGE_CONF];\n const stateForExport = {} as { [K in ExportableKeys]?: typeof appState[K] };\n for (const key of Object.keys(appState) as (keyof typeof appState)[]) {\n const propConfig = APP_STATE_STORAGE_CONF[key];\n if (propConfig?.[exportType]) {\n const nextValue = appState[key];\n\n // https://github.com/microsoft/TypeScript/issues/31445\n (stateForExport as any)[key] = nextValue;\n }\n }\n return stateForExport;\n};\n\nexport const clearAppStateForLocalStorage = (appState: Partial<AppState>) => {\n return _clearAppStateForStorage(appState, \"browser\");\n};\n\nexport const cleanAppStateForExport = (appState: Partial<AppState>) => {\n return _clearAppStateForStorage(appState, \"export\");\n};\n\nexport const clearAppStateForDatabase = (appState: Partial<AppState>) => {\n return _clearAppStateForStorage(appState, \"server\");\n};\n\nexport const isEraserActive = ({\n activeTool,\n}: {\n activeTool: AppState[\"activeTool\"];\n}) => activeTool.type === \"eraser\";\n\nexport const isHandToolActive = ({\n activeTool,\n}: {\n activeTool: AppState[\"activeTool\"];\n}) => {\n return activeTool.type === \"hand\";\n};\n", "import {\n ExcalidrawElement,\n NonDeletedExcalidrawElement,\n NonDeleted,\n} from \"./types\";\nimport { isInvisiblySmallElement } from \"./sizeHelpers\";\nimport { isLinearElementType } from \"./typeChecks\";\n\nexport {\n newElement,\n newTextElement,\n updateTextElement,\n refreshTextDimensions,\n newLinearElement,\n newImageElement,\n duplicateElement,\n} from \"./newElement\";\nexport {\n getElementAbsoluteCoords,\n getElementBounds,\n getCommonBounds,\n getDiamondPoints,\n getArrowheadPoints,\n getClosestElementBounds,\n} from \"./bounds\";\n\nexport {\n OMIT_SIDES_FOR_MULTIPLE_ELEMENTS,\n getTransformHandlesFromCoords,\n getTransformHandles,\n} from \"./transformHandles\";\nexport {\n hitTest,\n isHittingElementBoundingBoxWithoutHittingElement,\n} from \"./collision\";\nexport {\n resizeTest,\n getCursorForResizingElement,\n getElementWithTransformHandleType,\n getTransformHandleTypeFromCoords,\n} from \"./resizeTest\";\nexport {\n transformElements,\n getResizeOffsetXY,\n getResizeArrowDirection,\n} from \"./resizeElements\";\nexport {\n dragSelectedElements,\n getDragOffsetXY,\n dragNewElement,\n} from \"./dragElements\";\nexport { isTextElement, isExcalidrawElement } from \"./typeChecks\";\nexport { redrawTextBoundingBox } from \"./textElement\";\nexport {\n getPerfectElementSize,\n getLockedLinearCursorAlignSize,\n isInvisiblySmallElement,\n resizePerfectLineForNWHandler,\n getNormalizedDimensions,\n} from \"./sizeHelpers\";\nexport { showSelectedShapeActions } from \"./showSelectedShapeActions\";\n\n/**\n * @deprecated unsafe, use hashElementsVersion instead\n */\nexport const getSceneVersion = (elements: readonly ExcalidrawElement[]) =>\n elements.reduce((acc, el) => acc + el.version, 0);\n\n/**\n * Hashes elements' versionNonce (using djb2 algo). Order of elements matters.\n */\nexport const hashElementsVersion = (\n elements: readonly ExcalidrawElement[],\n): number => {\n let hash = 5381;\n for (let i = 0; i < elements.length; i++) {\n hash = (hash << 5) + hash + elements[i].versionNonce;\n }\n return hash >>> 0; // Ensure unsigned 32-bit integer\n};\n\n// string hash function (using djb2). Not cryptographically secure, use only\n// for versioning and such.\nexport const hashString = (s: string): number => {\n let hash: number = 5381;\n for (let i = 0; i < s.length; i++) {\n const char: number = s.charCodeAt(i);\n hash = (hash << 5) + hash + char;\n }\n return hash >>> 0; // Ensure unsigned 32-bit integer\n};\n\nexport const getVisibleElements = (elements: readonly ExcalidrawElement[]) =>\n elements.filter(\n (el) => !el.isDeleted && !isInvisiblySmallElement(el),\n ) as readonly NonDeletedExcalidrawElement[];\n\nexport const getNonDeletedElements = <T extends ExcalidrawElement>(\n elements: readonly T[],\n) =>\n elements.filter((element) => !element.isDeleted) as readonly NonDeleted<T>[];\n\nexport const isNonDeletedElement = <T extends ExcalidrawElement>(\n element: T,\n): element is NonDeleted<T> => !element.isDeleted;\n\nconst _clearElements = (\n elements: readonly ExcalidrawElement[],\n): ExcalidrawElement[] =>\n getNonDeletedElements(elements).map((element) =>\n isLinearElementType(element.type)\n ? { ...element, lastCommittedPoint: null }\n : element,\n );\n\nexport const clearElementsForDatabase = (\n elements: readonly ExcalidrawElement[],\n) => _clearElements(elements);\n\nexport const clearElementsForExport = (\n elements: readonly ExcalidrawElement[],\n) => _clearElements(elements);\n\nexport const clearElementsForLocalStorage = (\n elements: readonly ExcalidrawElement[],\n) => _clearElements(elements);\n", "import { ElementsMap, ExcalidrawElement } from \"./types\";\nimport { mutateElement } from \"./mutateElement\";\nimport { isFreeDrawElement, isLinearElement } from \"./typeChecks\";\nimport { SHIFT_LOCKING_ANGLE } from \"../constants\";\nimport { AppState, Zoom } from \"../types\";\nimport { getElementBounds } from \"./bounds\";\nimport { viewportCoordsToSceneCoords } from \"../utils\";\n\nexport const isInvisiblySmallElement = (\n element: ExcalidrawElement,\n): boolean => {\n if (isLinearElement(element) || isFreeDrawElement(element)) {\n return element.points.length < 2;\n }\n return element.width === 0 && element.height === 0;\n};\n\nexport const isElementInViewport = (\n element: ExcalidrawElement,\n width: number,\n height: number,\n viewTransformations: {\n zoom: Zoom;\n offsetLeft: number;\n offsetTop: number;\n scrollX: number;\n scrollY: number;\n },\n elementsMap: ElementsMap,\n) => {\n const [x1, y1, x2, y2] = getElementBounds(element, elementsMap); // scene coordinates\n const topLeftSceneCoords = viewportCoordsToSceneCoords(\n {\n clientX: viewTransformations.offsetLeft,\n clientY: viewTransformations.offsetTop,\n },\n viewTransformations,\n );\n const bottomRightSceneCoords = viewportCoordsToSceneCoords(\n {\n clientX: viewTransformations.offsetLeft + width,\n clientY: viewTransformations.offsetTop + height,\n },\n viewTransformations,\n );\n\n return (\n topLeftSceneCoords.x <= x2 &&\n topLeftSceneCoords.y <= y2 &&\n bottomRightSceneCoords.x >= x1 &&\n bottomRightSceneCoords.y >= y1\n );\n};\n\n/**\n * Makes a perfect shape or diagonal/horizontal/vertical line\n */\nexport const getPerfectElementSize = (\n elementType: AppState[\"activeTool\"][\"type\"],\n width: number,\n height: number,\n): { width: number; height: number } => {\n const absWidth = Math.abs(width);\n const absHeight = Math.abs(height);\n\n if (\n elementType === \"line\" ||\n elementType === \"arrow\" ||\n elementType === \"freedraw\"\n ) {\n const lockedAngle =\n Math.round(Math.atan(absHeight / absWidth) / SHIFT_LOCKING_ANGLE) *\n SHIFT_LOCKING_ANGLE;\n if (lockedAngle === 0) {\n height = 0;\n } else if (lockedAngle === Math.PI / 2) {\n width = 0;\n } else {\n height = absWidth * Math.tan(lockedAngle) * Math.sign(height) || height;\n }\n } else if (elementType !== \"selection\") {\n height = absWidth * Math.sign(height);\n }\n return { width, height };\n};\n\nexport const getLockedLinearCursorAlignSize = (\n originX: number,\n originY: number,\n x: number,\n y: number,\n) => {\n let width = x - originX;\n let height = y - originY;\n\n const lockedAngle =\n Math.round(Math.atan(height / width) / SHIFT_LOCKING_ANGLE) *\n SHIFT_LOCKING_ANGLE;\n\n if (lockedAngle === 0) {\n height = 0;\n } else if (lockedAngle === Math.PI / 2) {\n width = 0;\n } else {\n // locked angle line, y = mx + b => mx - y + b = 0\n const a1 = Math.tan(lockedAngle);\n const b1 = -1;\n const c1 = originY - a1 * originX;\n\n // line through cursor, perpendicular to locked angle line\n const a2 = -1 / a1;\n const b2 = -1;\n const c2 = y - a2 * x;\n\n // intersection of the two lines above\n const intersectX = (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);\n const intersectY = (c1 * a2 - c2 * a1) / (a1 * b2 - a2 * b1);\n\n // delta\n width = intersectX - originX;\n height = intersectY - originY;\n }\n\n return { width, height };\n};\n\nexport const resizePerfectLineForNWHandler = (\n element: ExcalidrawElement,\n x: number,\n y: number,\n) => {\n const anchorX = element.x + element.width;\n const anchorY = element.y + element.height;\n const distanceToAnchorX = x - anchorX;\n const distanceToAnchorY = y - anchorY;\n if (Math.abs(distanceToAnchorX) < Math.abs(distanceToAnchorY) / 2) {\n mutateElement(element, {\n x: anchorX,\n width: 0,\n y,\n height: -distanceToAnchorY,\n });\n } else if (Math.abs(distanceToAnchorY) < Math.abs(element.width) / 2) {\n mutateElement(element, {\n y: anchorY,\n height: 0,\n });\n } else {\n const nextHeight =\n Math.sign(distanceToAnchorY) *\n Math.sign(distanceToAnchorX) *\n element.width;\n mutateElement(element, {\n x,\n y: anchorY - nextHeight,\n width: -distanceToAnchorX,\n height: nextHeight,\n });\n }\n};\n\nexport const getNormalizedDimensions = (\n element: Pick<ExcalidrawElement, \"width\" | \"height\" | \"x\" | \"y\">,\n): {\n width: ExcalidrawElement[\"width\"];\n height: ExcalidrawElement[\"height\"];\n x: ExcalidrawElement[\"x\"];\n y: ExcalidrawElement[\"y\"];\n} => {\n const ret = {\n width: element.width,\n height: element.height,\n x: element.x,\n y: element.y,\n };\n\n if (element.width < 0) {\n const nextWidth = Math.abs(element.width);\n ret.width = nextWidth;\n ret.x = element.x - nextWidth;\n }\n\n if (element.height < 0) {\n const nextHeight = Math.abs(element.height);\n ret.height = nextHeight;\n ret.y = element.y - nextHeight;\n }\n\n return ret;\n};\n", "import { ExcalidrawElement } from \"./types\";\nimport Scene from \"../scene/Scene\";\nimport { getSizeFromPoints } from \"../points\";\nimport { randomInteger } from \"../random\";\nimport { Point } from \"../types\";\nimport { getUpdatedTimestamp } from \"../utils\";\nimport { Mutable } from \"../utility-types\";\nimport { ShapeCache } from \"../scene/ShapeCache\";\n\ntype ElementUpdate<TElement extends ExcalidrawElement> = Omit<\n Partial<TElement>,\n \"id\" | \"version\" | \"versionNonce\"\n>;\n\n// This function tracks updates of text elements for the purposes for collaboration.\n// The version is used to compare updates when more than one user is working in\n// the same drawing. Note: this will trigger the component to update. Make sure you\n// are calling it either from a React event handler or within unstable_batchedUpdates().\nexport const mutateElement = <TElement extends Mutable<ExcalidrawElement>>(\n element: TElement,\n updates: ElementUpdate<TElement>,\n informMutation = true,\n): TElement => {\n let didChange = false;\n\n // casting to any because can't use `in` operator\n // (see https://github.com/microsoft/TypeScript/issues/21732)\n const { points, fileId } = updates as any;\n\n if (typeof points !== \"undefined\") {\n updates = { ...getSizeFromPoints(points), ...updates };\n }\n\n for (const key in updates) {\n const value = (updates as any)[key];\n if (typeof value !== \"undefined\") {\n if (\n (element as any)[key] === value &&\n // if object, always update because its attrs could have changed\n // (except for specific keys we handle below)\n (typeof value !== \"object\" ||\n value === null ||\n key === \"groupIds\" ||\n key === \"scale\")\n ) {\n continue;\n }\n\n if (key === \"scale\") {\n const prevScale = (element as any)[key];\n const nextScale = value;\n if (prevScale[0] === nextScale[0] && prevScale[1] === nextScale[1]) {\n continue;\n }\n } else if (key === \"points\") {\n const prevPoints = (element as any)[key];\n const nextPoints = value;\n if (prevPoints.length === nextPoints.length) {\n let didChangePoints = false;\n let index = prevPoints.length;\n while (--index) {\n const prevPoint: Point = prevPoints[index];\n const nextPoint: Point = nextPoints[index];\n if (\n prevPoint[0] !== nextPoint[0] ||\n prevPoint[1] !== nextPoint[1]\n ) {\n didChangePoints = true;\n break;\n }\n }\n if (!didChangePoints) {\n continue;\n }\n }\n }\n\n (element as any)[key] = value;\n didChange = true;\n }\n }\n if (!didChange) {\n return element;\n }\n\n if (\n typeof updates.height !== \"undefined\" ||\n typeof updates.width !== \"undefined\" ||\n typeof fileId != \"undefined\" ||\n typeof points !== \"undefined\"\n ) {\n ShapeCache.delete(element);\n }\n\n element.version++;\n element.versionNonce = randomInteger();\n element.updated = getUpdatedTimestamp();\n\n if (informMutation) {\n Scene.getScene(element)?.informMutation();\n }\n\n return element;\n};\n\nexport const newElementWith = <TElement extends ExcalidrawElement>(\n element: TElement,\n updates: ElementUpdate<TElement>,\n): TElement => {\n let didChange = false;\n for (const key in updates) {\n const value = (updates as any)[key];\n if (typeof value !== \"undefined\") {\n if (\n (element as any)[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)\n ) {\n continue;\n }\n didChange = true;\n }\n }\n\n if (!didChange) {\n return element;\n }\n\n return {\n ...element,\n ...updates,\n updated: getUpdatedTimestamp(),\n version: element.version + 1,\n versionNonce: randomInteger(),\n };\n};\n\n/**\n * Mutates element, bumping `version`, `versionNonce`, and `updated`.\n *\n * NOTE: does not trigger re-render.\n */\nexport const bumpVersion = <T extends Mutable<ExcalidrawElement>>(\n element: T,\n version?: ExcalidrawElement[\"version\"],\n) => {\n element.version = (version ?? element.version) + 1;\n element.versionNonce = randomInteger();\n element.updated = getUpdatedTimestamp();\n return element;\n};\n", "import {\n ExcalidrawElement,\n NonDeletedExcalidrawElement,\n NonDeleted,\n ExcalidrawFrameLikeElement,\n ElementsMapOrArray,\n SceneElementsMap,\n NonDeletedSceneElementsMap,\n} from \"../element/types\";\nimport { isNonDeletedElement } from \"../element\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport { isFrameLikeElement } from \"../element/typeChecks\";\nimport { getSelectedElements } from \"./selection\";\nimport { AppState } from \"../types\";\nimport { Assert, SameType } from \"../utility-types\";\nimport { randomInteger } from \"../random\";\nimport { toBrandedType } from \"../utils\";\n\ntype ElementIdKey = InstanceType<typeof LinearElementEditor>[\"elementId\"];\ntype ElementKey = ExcalidrawElement | ElementIdKey;\n\ntype SceneStateCallback = () => void;\ntype SceneStateCallbackRemover = () => void;\n\ntype SelectionHash = string & { __brand: \"selectionHash\" };\n\nconst getNonDeletedElements = <T extends ExcalidrawElement>(\n allElements: readonly T[],\n) => {\n const elementsMap = new Map() as NonDeletedSceneElementsMap;\n const elements: T[] = [];\n for (const element of allElements) {\n if (!element.isDeleted) {\n elements.push(element as NonDeleted<T>);\n elementsMap.set(element.id, element as NonDeletedExcalidrawElement);\n }\n }\n return { elementsMap, elements };\n};\n\nconst hashSelectionOpts = (\n opts: Parameters<InstanceType<typeof Scene>[\"getSelectedElements\"]>[0],\n) => {\n const keys = [\"includeBoundTextElement\", \"includeElementsInFrames\"] as const;\n\n type HashableKeys = Omit<typeof opts, \"selectedElementIds\" | \"elements\">;\n\n // just to ensure we're hashing all expected keys\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n type _ = Assert<\n SameType<\n Required<HashableKeys>,\n Pick<Required<HashableKeys>, typeof keys[number]>\n >\n >;\n\n let hash = \"\";\n for (const key of keys) {\n hash += `${key}:${opts[key] ? \"1\" : \"0\"}`;\n }\n return hash as SelectionHash;\n};\n\n// ideally this would be a branded type but it'd be insanely hard to work with\n// in our codebase\nexport type ExcalidrawElementsIncludingDeleted = readonly ExcalidrawElement[];\n\nconst isIdKey = (elementKey: ElementKey): elementKey is ElementIdKey => {\n if (typeof elementKey === \"string\") {\n return true;\n }\n return false;\n};\n\nclass Scene {\n // ---------------------------------------------------------------------------\n // static methods/props\n // ---------------------------------------------------------------------------\n\n private static sceneMapByElement = new WeakMap<ExcalidrawElement, Scene>();\n private static sceneMapById = new Map<string, Scene>();\n\n static mapElementToScene(elementKey: ElementKey, scene: Scene) {\n if (isIdKey(elementKey)) {\n // for cases where we don't have access to the element object\n // (e.g. restore serialized appState with id references)\n this.sceneMapById.set(elementKey, scene);\n } else {\n this.sceneMapByElement.set(elementKey, scene);\n // if mapping element objects, also cache the id string when later\n // looking up by id alone\n this.sceneMapById.set(elementKey.id, scene);\n }\n }\n\n static getScene(elementKey: ElementKey): Scene | null {\n if (isIdKey(elementKey)) {\n return this.sceneMapById.get(elementKey) || null;\n }\n return this.sceneMapByElement.get(elementKey) || null;\n }\n\n // ---------------------------------------------------------------------------\n // instance methods/props\n // ---------------------------------------------------------------------------\n\n private callbacks: Set<SceneStateCallback> = new Set();\n\n private nonDeletedElements: readonly NonDeletedExcalidrawElement[] = [];\n private nonDeletedElementsMap = toBrandedType<NonDeletedSceneElementsMap>(\n new Map(),\n );\n private elements: readonly ExcalidrawElement[] = [];\n private nonDeletedFramesLikes: readonly NonDeleted<ExcalidrawFrameLikeElement>[] =\n [];\n private frames: readonly ExcalidrawFrameLikeElement[] = [];\n private elementsMap = toBrandedType<SceneElementsMap>(new Map());\n private selectedElementsCache: {\n selectedElementIds: AppState[\"selectedElementIds\"] | null;\n elements: readonly NonDeletedExcalidrawElement[] | null;\n cache: Map<SelectionHash, NonDeletedExcalidrawElement[]>;\n } = {\n selectedElementIds: null,\n elements: null,\n cache: new Map(),\n };\n private versionNonce: number | undefined;\n\n getElementsMapIncludingDeleted() {\n return this.elementsMap;\n }\n\n getNonDeletedElementsMap() {\n return this.nonDeletedElementsMap;\n }\n\n getElementsIncludingDeleted() {\n return this.elements;\n }\n\n getNonDeletedElements(): readonly NonDeletedExcalidrawElement[] {\n return this.nonDeletedElements;\n }\n\n getFramesIncludingDeleted() {\n return this.frames;\n }\n\n getSelectedElements(opts: {\n // NOTE can be ommitted by making Scene constructor require App instance\n selectedElementIds: AppState[\"selectedElementIds\"];\n /**\n * for specific cases where you need to use elements not from current\n * scene state. This in effect will likely result in cache-miss, and\n * the cache won't be updated in this case.\n */\n elements?: ElementsMapOrArray;\n // selection-related options\n includeBoundTextElement?: boolean;\n includeElementsInFrames?: boolean;\n }): NonDeleted<ExcalidrawElement>[] {\n const hash = hashSelectionOpts(opts);\n\n const elements = opts?.elements || this.nonDeletedElements;\n if (\n this.selectedElementsCache.elements === elements &&\n this.selectedElementsCache.selectedElementIds === opts.selectedElementIds\n ) {\n const cached = this.selectedElementsCache.cache.get(hash);\n if (cached) {\n return cached;\n }\n } else if (opts?.elements == null) {\n // if we're operating on latest scene elements and the cache is not\n // storing the latest elements, clear the cache\n this.selectedElementsCache.cache.clear();\n }\n\n const selectedElements = getSelectedElements(\n elements,\n { selectedElementIds: opts.selectedElementIds },\n opts,\n );\n\n // cache only if we're not using custom elements\n if (opts?.elements == null) {\n this.selectedElementsCache.selectedElementIds = opts.selectedElementIds;\n this.selectedElementsCache.elements = this.nonDeletedElements;\n this.selectedElementsCache.cache.set(hash, selectedElements);\n }\n\n return selectedElements;\n }\n\n getNonDeletedFramesLikes(): readonly NonDeleted<ExcalidrawFrameLikeElement>[] {\n return this.nonDeletedFramesLikes;\n }\n\n getElement<T extends ExcalidrawElement>(id: T[\"id\"]): T | null {\n return (this.elementsMap.get(id) as T | undefined) || null;\n }\n\n getVersionNonce() {\n return this.versionNonce;\n }\n\n getNonDeletedElement(\n id: ExcalidrawElement[\"id\"],\n ): NonDeleted<ExcalidrawElement> | null {\n const element = this.getElement(id);\n if (element && isNonDeletedElement(element)) {\n return element;\n }\n return null;\n }\n\n /**\n * A utility method to help with updating all scene elements, with the added\n * performance optimization of not renewing the array if no change is made.\n *\n * Maps all current excalidraw elements, invoking the callback for each\n * element. The callback should either return a new mapped element, or the\n * original element if no changes are made. If no changes are made to any\n * element, this results in a no-op. Otherwise, the newly mapped elements\n * are set as the next scene's elements.\n *\n * @returns whether a change was made\n */\n mapElements(\n iteratee: (element: ExcalidrawElement) => ExcalidrawElement,\n ): boolean {\n let didChange = false;\n const newElements = this.elements.map((element) => {\n const nextElement = iteratee(element);\n if (nextElement !== element) {\n didChange = true;\n }\n return nextElement;\n });\n if (didChange) {\n this.replaceAllElements(newElements);\n }\n return didChange;\n }\n\n replaceAllElements(nextElements: ElementsMapOrArray) {\n this.elements =\n // ts doesn't like `Array.isArray` of `instanceof Map`\n nextElements instanceof Array\n ? nextElements\n : Array.from(nextElements.values());\n const nextFrameLikes: ExcalidrawFrameLikeElement[] = [];\n this.elementsMap.clear();\n this.elements.forEach((element) => {\n if (isFrameLikeElement(element)) {\n nextFrameLikes.push(element);\n }\n this.elementsMap.set(element.id, element);\n Scene.mapElementToScene(element, this);\n });\n const nonDeletedElements = getNonDeletedElements(this.elements);\n this.nonDeletedElements = nonDeletedElements.elements;\n this.nonDeletedElementsMap = nonDeletedElements.elementsMap;\n\n this.frames = nextFrameLikes;\n this.nonDeletedFramesLikes = getNonDeletedElements(this.frames).elements;\n\n this.informMutation();\n }\n\n informMutation() {\n this.versionNonce = randomInteger();\n\n for (const callback of Array.from(this.callbacks)) {\n callback();\n }\n }\n\n addCallback(cb: SceneStateCallback): SceneStateCallbackRemover {\n if (this.callbacks.has(cb)) {\n throw new Error();\n }\n\n this.callbacks.add(cb);\n\n return () => {\n if (!this.callbacks.has(cb)) {\n throw new Error();\n }\n this.callbacks.delete(cb);\n };\n }\n\n destroy() {\n this.nonDeletedElements = [];\n this.elements = [];\n this.nonDeletedFramesLikes = [];\n this.frames = [];\n this.elementsMap.clear();\n this.selectedElementsCache.selectedElementIds = null;\n this.selectedElementsCache.elements = null;\n this.selectedElementsCache.cache.clear();\n\n Scene.sceneMapById.forEach((scene, elementKey) => {\n if (scene === this) {\n Scene.sceneMapById.delete(elementKey);\n }\n });\n\n // done not for memory leaks, but to guard against possible late fires\n // (I guess?)\n this.callbacks.clear();\n }\n\n insertElementAtIndex(element: ExcalidrawElement, index: number) {\n if (!Number.isFinite(index) || index < 0) {\n throw new Error(\n \"insertElementAtIndex can only be called with index >= 0\",\n );\n }\n const nextElements = [\n ...this.elements.slice(0, index),\n element,\n ...this.elements.slice(index),\n ];\n this.replaceAllElements(nextElements);\n }\n\n insertElementsAtIndex(elements: ExcalidrawElement[], index: number) {\n if (!Number.isFinite(index) || index < 0) {\n throw new Error(\n \"insertElementAtIndex can only be called with index >= 0\",\n );\n }\n const nextElements = [\n ...this.elements.slice(0, index),\n ...elements,\n ...this.elements.slice(index),\n ];\n\n this.replaceAllElements(nextElements);\n }\n\n addNewElement = (element: ExcalidrawElement) => {\n if (element.frameId) {\n this.insertElementAtIndex(element, this.getElementIndex(element.frameId));\n } else {\n this.replaceAllElements([...this.elements, element]);\n }\n };\n\n getElementIndex(elementId: string) {\n return this.elements.findIndex((element) => element.id === elementId);\n }\n\n getContainerElement = (\n element:\n | (ExcalidrawElement & {\n containerId: ExcalidrawElement[\"id\"] | null;\n })\n | null,\n ) => {\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return this.getElement(element.containerId) || null;\n }\n return null;\n };\n}\n\nexport default Scene;\n", "import { ROUNDNESS } from \"../constants\";\nimport { ElementOrToolType } from \"../types\";\nimport { MarkNonNullable } from \"../utility-types\";\nimport { assertNever } from \"../utils\";\nimport {\n ExcalidrawElement,\n ExcalidrawTextElement,\n ExcalidrawEmbeddableElement,\n ExcalidrawLinearElement,\n ExcalidrawBindableElement,\n ExcalidrawFreeDrawElement,\n InitializedExcalidrawImageElement,\n ExcalidrawImageElement,\n ExcalidrawTextElementWithContainer,\n ExcalidrawTextContainer,\n ExcalidrawFrameElement,\n RoundnessType,\n ExcalidrawFrameLikeElement,\n ExcalidrawElementType,\n ExcalidrawIframeElement,\n ExcalidrawIframeLikeElement,\n ExcalidrawMagicFrameElement,\n} from \"./types\";\n\nexport const isInitializedImageElement = (\n element: ExcalidrawElement | null,\n): element is InitializedExcalidrawImageElement => {\n return !!element && element.type === \"image\" && !!element.fileId;\n};\n\nexport const isImageElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawImageElement => {\n return !!element && element.type === \"image\";\n};\n\nexport const isEmbeddableElement = (\n element: ExcalidrawElement | null | undefined,\n): element is ExcalidrawEmbeddableElement => {\n return !!element && element.type === \"embeddable\";\n};\n\nexport const isIframeElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawIframeElement => {\n return !!element && element.type === \"iframe\";\n};\n\nexport const isIframeLikeElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawIframeLikeElement => {\n return (\n !!element && (element.type === \"iframe\" || element.type === \"embeddable\")\n );\n};\n\nexport const isTextElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawTextElement => {\n return element != null && element.type === \"text\";\n};\n\nexport const isFrameElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawFrameElement => {\n return element != null && element.type === \"frame\";\n};\n\nexport const isMagicFrameElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawMagicFrameElement => {\n return element != null && element.type === \"magicframe\";\n};\n\nexport const isFrameLikeElement = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawFrameLikeElement => {\n return (\n element != null &&\n (element.type === \"frame\" || element.type === \"magicframe\")\n );\n};\n\nexport const isFreeDrawElement = (\n element?: ExcalidrawElement | null,\n): element is ExcalidrawFreeDrawElement => {\n return element != null && isFreeDrawElementType(element.type);\n};\n\nexport const isFreeDrawElementType = (\n elementType: ExcalidrawElementType,\n): boolean => {\n return elementType === \"freedraw\";\n};\n\nexport const isLinearElement = (\n element?: ExcalidrawElement | null,\n): element is ExcalidrawLinearElement => {\n return element != null && isLinearElementType(element.type);\n};\n\nexport const isArrowElement = (\n element?: ExcalidrawElement | null,\n): element is ExcalidrawLinearElement => {\n return element != null && element.type === \"arrow\";\n};\n\nexport const isLinearElementType = (\n elementType: ElementOrToolType,\n): boolean => {\n return (\n elementType === \"arrow\" || elementType === \"line\" // || elementType === \"freedraw\"\n );\n};\n\nexport const isBindingElement = (\n element?: ExcalidrawElement | null,\n includeLocked = true,\n): element is ExcalidrawLinearElement => {\n return (\n element != null &&\n (!element.locked || includeLocked === true) &&\n isBindingElementType(element.type)\n );\n};\n\nexport const isBindingElementType = (\n elementType: ElementOrToolType,\n): boolean => {\n return elementType === \"arrow\";\n};\n\nexport const isBindableElement = (\n element: ExcalidrawElement | null,\n includeLocked = true,\n): element is ExcalidrawBindableElement => {\n return (\n element != null &&\n (!element.locked || includeLocked === true) &&\n (element.type === \"rectangle\" ||\n element.type === \"diamond\" ||\n element.type === \"ellipse\" ||\n element.type === \"image\" ||\n element.type === \"iframe\" ||\n element.type === \"embeddable\" ||\n element.type === \"frame\" ||\n element.type === \"magicframe\" ||\n (element.type === \"text\" && !element.containerId))\n );\n};\n\nexport const isTextBindableContainer = (\n element: ExcalidrawElement | null,\n includeLocked = true,\n): element is ExcalidrawTextContainer => {\n return (\n element != null &&\n (!element.locked || includeLocked === true) &&\n (element.type === \"rectangle\" ||\n element.type === \"diamond\" ||\n element.type === \"ellipse\" ||\n isArrowElement(element))\n );\n};\n\nexport const isExcalidrawElement = (\n element: any,\n): element is ExcalidrawElement => {\n const type: ExcalidrawElementType | undefined = element?.type;\n if (!type) {\n return false;\n }\n switch (type) {\n case \"text\":\n case \"diamond\":\n case \"rectangle\":\n case \"iframe\":\n case \"embeddable\":\n case \"ellipse\":\n case \"arrow\":\n case \"freedraw\":\n case \"line\":\n case \"frame\":\n case \"magicframe\":\n case \"image\":\n case \"selection\": {\n return true;\n }\n default: {\n assertNever(type, null);\n return false;\n }\n }\n};\n\nexport const hasBoundTextElement = (\n element: ExcalidrawElement | null,\n): element is MarkNonNullable<ExcalidrawBindableElement, \"boundElements\"> => {\n return (\n isTextBindableContainer(element) &&\n !!element.boundElements?.some(({ type }) => type === \"text\")\n );\n};\n\nexport const isBoundToContainer = (\n element: ExcalidrawElement | null,\n): element is ExcalidrawTextElementWithContainer => {\n return (\n element !== null &&\n \"containerId\" in element &&\n element.containerId !== null &&\n isTextElement(element)\n );\n};\n\nexport const isUsingAdaptiveRadius = (type: string) =>\n type === \"rectangle\" ||\n type === \"embeddable\" ||\n type === \"iframe\" ||\n type === \"image\";\n\nexport const isUsingProportionalRadius = (type: string) =>\n type === \"line\" || type === \"arrow\" || type === \"diamond\";\n\nexport const canApplyRoundnessTypeToElement = (\n roundnessType: RoundnessType,\n element: ExcalidrawElement,\n) => {\n if (\n (roundnessType === ROUNDNESS.ADAPTIVE_RADIUS ||\n // if legacy roundness, it can be applied to elements that currently\n // use adaptive radius\n roundnessType === ROUNDNESS.LEGACY) &&\n isUsingAdaptiveRadius(element.type)\n ) {\n return true;\n }\n if (\n roundnessType === ROUNDNESS.PROPORTIONAL_RADIUS &&\n isUsingProportionalRadius(element.type)\n ) {\n return true;\n }\n\n return false;\n};\n\nexport const getDefaultRoundnessTypeForElement = (\n element: ExcalidrawElement,\n) => {\n if (isUsingProportionalRadius(element.type)) {\n return {\n type: ROUNDNESS.PROPORTIONAL_RADIUS,\n };\n }\n\n if (isUsingAdaptiveRadius(element.type)) {\n return {\n type: ROUNDNESS.ADAPTIVE_RADIUS,\n };\n }\n\n return null;\n};\n", "import { COLOR_PALETTE } from \"./colors\";\nimport {\n DEFAULT_VERSION,\n EVENT,\n FONT_FAMILY,\n isDarwin,\n WINDOWS_EMOJI_FALLBACK_FONT,\n} from \"./constants\";\nimport { FontFamilyValues, FontString } from \"./element/types\";\nimport {\n ActiveTool,\n AppState,\n ToolType,\n UnsubscribeCallback,\n Zoom,\n} from \"./types\";\nimport { MaybePromise, ResolutionType } from \"./utility-types\";\n\nlet mockDateTime: string | null = null;\n\nexport const setDateTimeForTests = (dateTime: string) => {\n mockDateTime = dateTime;\n};\n\nexport const getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n\n return `${year}-${month}-${day}-${hr}${min}`;\n};\n\nexport const capitalizeString = (str: string) =>\n str.charAt(0).toUpperCase() + str.slice(1);\n\nexport const isToolIcon = (\n target: Element | EventTarget | null,\n): target is HTMLElement =>\n target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\n\nexport const isInputLike = (\n target: Element | EventTarget | null,\n): target is\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement\n | HTMLBRElement\n | HTMLDivElement =>\n (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\n\nexport const isInteractive = (target: Element | EventTarget | null) => {\n return (\n isInputLike(target) ||\n (target instanceof Element && !!target.closest(\"label, button\"))\n );\n};\n\nexport const isWritableElement = (\n target: Element | EventTarget | null,\n): target is\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLBRElement\n | HTMLDivElement =>\n (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" ||\n target.type === \"number\" ||\n target.type === \"password\"));\n\nexport const getFontFamilyString = ({\n fontFamily,\n}: {\n fontFamily: FontFamilyValues;\n}) => {\n for (const [fontFamilyString, id] of Object.entries(FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return WINDOWS_EMOJI_FALLBACK_FONT;\n};\n\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nexport const getFontString = ({\n fontSize,\n fontFamily,\n}: {\n fontSize: number;\n fontFamily: FontFamilyValues;\n}) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}` as FontString;\n};\n\nexport const debounce = <T extends any[]>(\n fn: (...args: T) => void,\n timeout: number,\n) => {\n let handle = 0;\n let lastArgs: T | null = null;\n const ret = (...args: T) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n\n// throttle callback to execute once per animation frame\nexport const throttleRAF = <T extends any[]>(\n fn: (...args: T) => void,\n opts?: { trailing?: boolean },\n) => {\n let timerId: number | null = null;\n let lastArgs: T | null = null;\n let lastArgsTrailing: T | null = null;\n\n const scheduleFunc = (args: T) => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n\n const ret = (...args: T) => {\n if (import.meta.env.MODE === \"test\") {\n fn(...args);\n return;\n }\n lastArgs = args;\n if (timerId === null) {\n scheduleFunc(lastArgs);\n } else if (opts?.trailing) {\n lastArgsTrailing = args;\n }\n };\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n return ret;\n};\n\n/**\n * Exponential ease-out method\n *\n * @param {number} k - The value to be tweened.\n * @returns {number} The tweened value.\n */\nexport const easeOut = (k: number) => {\n return 1 - Math.pow(1 - k, 4);\n};\n\nconst easeOutInterpolate = (from: number, to: number, progress: number) => {\n return (to - from) * easeOut(progress) + from;\n};\n\n/**\n * Animates values from `fromValues` to `toValues` using the requestAnimationFrame API.\n * Executes the `onStep` callback on each step with the interpolated values.\n * Returns a function that can be called to cancel the animation.\n *\n * @example\n * // Example usage:\n * const fromValues = { x: 0, y: 0 };\n * const toValues = { x: 100, y: 200 };\n * const onStep = ({x, y}) => {\n * setState(x, y)\n * };\n * const onCancel = () => {\n * console.log(\"Animation canceled\");\n * };\n *\n * const cancelAnimation = easeToValuesRAF({\n * fromValues,\n * toValues,\n * onStep,\n * onCancel,\n * });\n *\n * // To cancel the animation:\n * cancelAnimation();\n */\nexport const easeToValuesRAF = <\n T extends Record<keyof T, number>,\n K extends keyof T,\n>({\n fromValues,\n toValues,\n onStep,\n duration = 250,\n interpolateValue,\n onStart,\n onEnd,\n onCancel,\n}: {\n fromValues: T;\n toValues: T;\n /**\n * Interpolate a single value.\n * Return undefined to be handled by the default interpolator.\n */\n interpolateValue?: (\n fromValue: number,\n toValue: number,\n /** no easing applied */\n progress: number,\n key: K,\n ) => number | undefined;\n onStep: (values: T) => void;\n duration?: number;\n onStart?: () => void;\n onEnd?: () => void;\n onCancel?: () => void;\n}) => {\n let canceled = false;\n let frameId = 0;\n let startTime: number;\n\n function step(timestamp: number) {\n if (canceled) {\n return;\n }\n if (startTime === undefined) {\n startTime = timestamp;\n onStart?.();\n }\n\n const elapsed = Math.min(timestamp - startTime, duration);\n const factor = easeOut(elapsed / duration);\n\n const newValues = {} as T;\n\n Object.keys(fromValues).forEach((key) => {\n const _key = key as keyof T;\n const result = ((toValues[_key] - fromValues[_key]) * factor +\n fromValues[_key]) as T[keyof T];\n newValues[_key] = result;\n });\n\n onStep(newValues);\n\n if (elapsed < duration) {\n const progress = elapsed / duration;\n\n const newValues = {} as T;\n\n Object.keys(fromValues).forEach((key) => {\n const _key = key as K;\n const startValue = fromValues[_key];\n const endValue = toValues[_key];\n\n let result;\n\n result = interpolateValue\n ? interpolateValue(startValue, endValue, progress, _key)\n : easeOutInterpolate(startValue, endValue, progress);\n\n if (result == null) {\n result = easeOutInterpolate(startValue, endValue, progress);\n }\n\n newValues[_key] = result as T[K];\n });\n onStep(newValues);\n\n frameId = window.requestAnimationFrame(step);\n } else {\n onStep(toValues);\n onEnd?.();\n }\n }\n\n frameId = window.requestAnimationFrame(step);\n\n return () => {\n onCancel?.();\n canceled = true;\n window.cancelAnimationFrame(frameId);\n };\n};\n\n// https://github.com/lodash/lodash/blob/es/chunk.js\nexport const chunk = <T extends any>(\n array: readonly T[],\n size: number,\n): T[][] => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\n\nexport const selectNode = (node: Element) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\n\nexport const removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\n\nexport const distance = (x: number, y: number) => Math.abs(x - y);\n\nexport const updateActiveTool = (\n appState: Pick<AppState, \"activeTool\">,\n data: ((\n | {\n type: ToolType;\n }\n | { type: \"custom\"; customType: string }\n ) & { locked?: boolean }) & {\n lastActiveToolBeforeEraser?: ActiveTool | null;\n },\n): AppState[\"activeTool\"] => {\n if (data.type === \"custom\") {\n return {\n ...appState.activeTool,\n type: \"custom\",\n customType: data.customType,\n locked: data.locked ?? appState.activeTool.locked,\n };\n }\n\n return {\n ...appState.activeTool,\n lastActiveTool:\n data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveTool\n : data.lastActiveToolBeforeEraser,\n type: data.type,\n customType: null,\n locked: data.locked ?? appState.activeTool.locked,\n };\n};\n\nexport const isFullScreen = () =>\n document.fullscreenElement?.nodeName === \"HTML\";\n\nexport const allowFullScreen = () =>\n document.documentElement.requestFullscreen();\n\nexport const exitFullScreen = () => document.exitFullscreen();\n\nexport const getShortcutKey = (shortcut: string): string => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\");\n if (isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/gi, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/gi, \"Ctrl\");\n};\n\nexport const viewportCoordsToSceneCoords = (\n { clientX, clientY }: { clientX: number; clientY: number },\n {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY,\n }: {\n zoom: Zoom;\n offsetLeft: number;\n offsetTop: number;\n scrollX: number;\n scrollY: number;\n },\n) => {\n const x = (clientX - offsetLeft) / zoom.value - scrollX;\n const y = (clientY - offsetTop) / zoom.value - scrollY;\n\n return { x, y };\n};\n\nexport const sceneCoordsToViewportCoords = (\n { sceneX, sceneY }: { sceneX: number; sceneY: number },\n {\n zoom,\n offsetLeft,\n offsetTop,\n scrollX,\n scrollY,\n }: {\n zoom: Zoom;\n offsetLeft: number;\n offsetTop: number;\n scrollX: number;\n scrollY: number;\n },\n) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\n\nexport const getGlobalCSSVariable = (name: string) =>\n getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\n\nconst RS_LTR_CHARS =\n \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nexport const isRTL = (text: string) => RE_RTL_CHECK.test(text);\n\nexport const tupleToCoors = (\n xyTuple: readonly [number, number],\n): { x: number; y: number } => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n\n/** use as a rejectionHandler to mute filesystem Abort errors */\nexport const muteFSAbortError = (error?: Error) => {\n if (error?.name === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\n\nexport const findIndex = <T>(\n array: readonly T[],\n cb: (element: T, index: number, array: readonly T[]) => boolean,\n fromIndex: number = 0,\n) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n\nexport const findLastIndex = <T>(\n array: readonly T[],\n cb: (element: T, index: number, array: readonly T[]) => boolean,\n fromIndex: number = array.length - 1,\n) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\n\nexport const isTransparent = (color: string) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (\n isRGBTransparent ||\n isRRGGBBTransparent ||\n color === COLOR_PALETTE.transparent\n );\n};\n\nexport type ResolvablePromise<T> = Promise<T> & {\n resolve: [T] extends [undefined]\n ? (value?: MaybePromise<Awaited<T>>) => void\n : (value: MaybePromise<Awaited<T>>) => void;\n reject: (error: Error) => void;\n};\nexport const resolvablePromise = <T>() => {\n let resolve!: any;\n let reject!: any;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n (promise as any).resolve = resolve;\n (promise as any).reject = reject;\n return promise as ResolvablePromise<T>;\n};\n\n//https://stackoverflow.com/a/9462382/8418\nexport const nFormatter = (num: number, digits: number): string => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return (\n (num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol\n );\n};\n\nexport const getVersion = () => {\n return (\n document.querySelector<HTMLMetaElement>('meta[name=\"version\"]')?.content ||\n DEFAULT_VERSION\n );\n};\n\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nexport const supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used \uD83D\uDC28, but it is sort of supported on Windows 7.\n // Luckily \uD83D\uDE00 isn't supported.\n ctx.fillText(\"\uD83D\uDE00\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\n\nexport const getNearestScrollableContainer = (\n element: HTMLElement,\n): HTMLElement | Document => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (\n hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")\n ) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\n\nexport const focusNearestParent = (element: HTMLInputElement) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\n\nexport const preventUnload = (event: BeforeUnloadEvent) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\n\nexport const bytesToHexString = (bytes: Uint8Array) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\n\nexport const getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nexport const arrayToMap = <T extends { id: string } | string>(\n items: readonly T[] | Map<string, T>,\n) => {\n if (items instanceof Map) {\n return items;\n }\n return items.reduce((acc: Map<string, T>, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\n\nexport const arrayToMapWithIndex = <T extends { id: string }>(\n elements: readonly T[],\n) =>\n elements.reduce((acc, element: T, idx) => {\n acc.set(element.id, [element, idx]);\n return acc;\n }, new Map<string, [element: T, index: number]>());\n\nexport const isTestEnv = () => import.meta.env.MODE === \"test\";\n\nexport const wrapEvent = <T extends Event>(name: EVENT, nativeEvent: T) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\n\nexport const updateObject = <T extends Record<string, any>>(\n obj: T,\n updates: Partial<T>,\n): T => {\n let didChange = false;\n for (const key in updates) {\n const value = (updates as any)[key];\n if (typeof value !== \"undefined\") {\n if (\n (obj as any)[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)\n ) {\n continue;\n }\n didChange = true;\n }\n }\n\n if (!didChange) {\n return obj;\n }\n\n return {\n ...obj,\n ...updates,\n };\n};\n\nexport const isPrimitive = (val: any) => {\n const type = typeof val;\n return val == null || (type !== \"object\" && type !== \"function\");\n};\n\nexport const getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n } catch (error) {\n return \"iframe\";\n }\n};\n\nexport const isRunningInIframe = () => getFrame() === \"iframe\";\n\nexport const isPromiseLike = (\n value: any,\n): value is Promise<ResolutionType<typeof value>> => {\n return (\n !!value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n \"catch\" in value &&\n \"finally\" in value\n );\n};\n\nexport const queryFocusableElements = (container: HTMLElement | null) => {\n const focusableElements = container?.querySelectorAll<HTMLElement>(\n \"button, a, input, select, textarea, div[tabindex], label[tabindex]\",\n );\n\n return focusableElements\n ? Array.from(focusableElements).filter(\n (element) =>\n element.tabIndex > -1 && !(element as HTMLInputElement).disabled,\n )\n : [];\n};\n\n/** use as a fallback after identity check (for perf reasons) */\nconst _defaultIsShallowComparatorFallback = (a: any, b: any): boolean => {\n // consider two empty arrays equal\n if (\n Array.isArray(a) &&\n Array.isArray(b) &&\n a.length === 0 &&\n b.length === 0\n ) {\n return true;\n }\n return a === b;\n};\n\n/**\n * Returns whether object/array is shallow equal.\n * Considers empty object/arrays as equal (whether top-level or second-level).\n */\nexport const isShallowEqual = <\n T extends Record<string, any>,\n K extends readonly unknown[],\n>(\n objA: T,\n objB: T,\n comparators?:\n | { [key in keyof T]?: (a: T[key], b: T[key]) => boolean }\n | (keyof T extends K[number]\n ? K extends readonly (keyof T)[]\n ? K\n : {\n _error: \"keys are either missing or include keys not in compared obj\";\n }\n : {\n _error: \"keys are either missing or include keys not in compared obj\";\n }),\n debug = false,\n) => {\n const aKeys = Object.keys(objA);\n const bKeys = Object.keys(objB);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n if (comparators && Array.isArray(comparators)) {\n for (const key of comparators) {\n const ret =\n objA[key] === objB[key] ||\n _defaultIsShallowComparatorFallback(objA[key], objB[key]);\n if (!ret) {\n if (debug) {\n console.warn(\n `%cisShallowEqual: ${key} not equal ->`,\n \"color: #8B4000\",\n objA[key],\n objB[key],\n );\n }\n return false;\n }\n }\n return true;\n }\n\n return aKeys.every((key) => {\n const comparator = (\n comparators as { [key in keyof T]?: (a: T[key], b: T[key]) => boolean }\n )?.[key as keyof T];\n const ret = comparator\n ? comparator(objA[key], objB[key])\n : objA[key] === objB[key] ||\n _defaultIsShallowComparatorFallback(objA[key], objB[key]);\n\n if (!ret && debug) {\n console.warn(\n `%cisShallowEqual: ${key} not equal ->`,\n \"color: #8B4000\",\n objA[key],\n objB[key],\n );\n }\n return ret;\n });\n};\n\n// taken from Radix UI\n// https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\nexport const composeEventHandlers = <E>(\n originalEventHandler?: (event: E) => void,\n ourEventHandler?: (event: E) => void,\n { checkForDefaultPrevented = true } = {},\n) => {\n return function handleEvent(event: E) {\n originalEventHandler?.(event);\n\n if (\n !checkForDefaultPrevented ||\n !(event as unknown as Event)?.defaultPrevented\n ) {\n return ourEventHandler?.(event);\n }\n };\n};\n\n/**\n * supply `null` as message if non-never value is valid, you just need to\n * typecheck against it\n */\nexport const assertNever = (\n value: never,\n message: string | null,\n softAssert?: boolean,\n): never => {\n if (!message) {\n return value;\n }\n if (softAssert) {\n console.error(message);\n return value;\n }\n\n throw new Error(message);\n};\n\n/**\n * Memoizes on values of `opts` object (strict equality).\n */\nexport const memoize = <T extends Record<string, any>, R extends any>(\n func: (opts: T) => R,\n) => {\n let lastArgs: Map<string, any> | undefined;\n let lastResult: R | undefined;\n\n const ret = function (opts: T) {\n const currentArgs = Object.entries(opts);\n\n if (lastArgs) {\n let argsAreEqual = true;\n for (const [key, value] of currentArgs) {\n if (lastArgs.get(key) !== value) {\n argsAreEqual = false;\n break;\n }\n }\n if (argsAreEqual) {\n return lastResult;\n }\n }\n\n const result = func(opts);\n\n lastArgs = new Map(currentArgs);\n lastResult = result;\n\n return result;\n };\n\n ret.clear = () => {\n lastArgs = undefined;\n lastResult = undefined;\n };\n\n return ret as typeof func & { clear: () => void };\n};\n\n/** Checks if value is inside given collection. Useful for type-safety. */\nexport const isMemberOf = <T extends string>(\n /** Set/Map/Array/Object */\n collection: Set<T> | readonly T[] | Record<T, any> | Map<T, any>,\n /** value to look for */\n value: string,\n): value is T => {\n return collection instanceof Set || collection instanceof Map\n ? collection.has(value as T)\n : \"includes\" in collection\n ? collection.includes(value as T)\n : collection.hasOwnProperty(value);\n};\n\nexport const cloneJSON = <T>(obj: T): T => JSON.parse(JSON.stringify(obj));\n\nexport const isFiniteNumber = (value: any): value is number => {\n return typeof value === \"number\" && Number.isFinite(value);\n};\n\nexport const updateStable = <T extends any[] | Record<string, any>>(\n prevValue: T,\n nextValue: T,\n) => {\n if (isShallowEqual(prevValue, nextValue)) {\n return prevValue;\n }\n return nextValue;\n};\n\n// Window\nexport function addEventListener<K extends keyof WindowEventMap>(\n target: Window & typeof globalThis,\n type: K,\n listener: (this: Window, ev: WindowEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions,\n): UnsubscribeCallback;\nexport function addEventListener(\n target: Window & typeof globalThis,\n type: string,\n listener: (this: Window, ev: Event) => any,\n options?: boolean | AddEventListenerOptions,\n): UnsubscribeCallback;\n// Document\nexport function addEventListener<K extends keyof DocumentEventMap>(\n target: Document,\n type: K,\n listener: (this: Document, ev: DocumentEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions,\n): UnsubscribeCallback;\nexport function addEventListener(\n target: Document,\n type: string,\n listener: (this: Document, ev: Event) => any,\n options?: boolean | AddEventListenerOptions,\n): UnsubscribeCallback;\n// FontFaceSet (document.fonts)\nexport function addEventListener<K extends keyof FontFaceSetEventMap>(\n target: FontFaceSet,\n type: K,\n listener: (this: FontFaceSet, ev: FontFaceSetEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions,\n): UnsubscribeCallback;\n// HTMLElement / mix\nexport function addEventListener<K extends keyof HTMLElementEventMap>(\n target:\n | Document\n | (Window & typeof globalThis)\n | HTMLElement\n | undefined\n | null\n | false,\n type: K,\n listener: (this: HTMLDivElement, ev: HTMLElementEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions,\n): UnsubscribeCallback;\n// implem\nexport function addEventListener(\n /**\n * allows for falsy values so you don't have to type check when adding\n * event listeners to optional elements\n */\n target:\n | Document\n | (Window & typeof globalThis)\n | FontFaceSet\n | HTMLElement\n | undefined\n | null\n | false,\n type: keyof WindowEventMap | keyof DocumentEventMap | string,\n listener: (ev: Event) => any,\n options?: boolean | AddEventListenerOptions,\n): UnsubscribeCallback {\n if (!target) {\n return () => {};\n }\n target?.addEventListener?.(type, listener, options);\n return () => {\n target?.removeEventListener?.(type, listener, options);\n };\n}\n\nconst average = (a: number, b: number) => (a + b) / 2;\nexport function getSvgPathFromStroke(points: number[][], closed = true) {\n const len = points.length;\n\n if (len < 4) {\n return ``;\n }\n\n let a = points[0];\n let b = points[1];\n const c = points[2];\n\n let result = `M${a[0].toFixed(2)},${a[1].toFixed(2)} Q${b[0].toFixed(\n 2,\n )},${b[1].toFixed(2)} ${average(b[0], c[0]).toFixed(2)},${average(\n b[1],\n c[1],\n ).toFixed(2)} T`;\n\n for (let i = 2, max = len - 1; i < max; i++) {\n a = points[i];\n b = points[i + 1];\n result += `${average(a[0], b[0]).toFixed(2)},${average(a[1], b[1]).toFixed(\n 2,\n )} `;\n }\n\n if (closed) {\n result += \"Z\";\n }\n\n return result;\n}\n\nexport const normalizeEOL = (str: string) => {\n return str.replace(/\\r?\\n|\\r/g, \"\\n\");\n};\n\n// -----------------------------------------------------------------------------\ntype HasBrand<T> = {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n [K in keyof T]: K extends `~brand${infer _}` ? true : never;\n}[keyof T];\n\ntype RemoveAllBrands<T> = HasBrand<T> extends true\n ? {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n [K in keyof T as K extends `~brand~${infer _}` ? never : K]: T[K];\n }\n : never;\n\n// adapted from https://github.com/colinhacks/zod/discussions/1994#discussioncomment-6068940\n// currently does not cover all types (e.g. tuples, promises...)\ntype Unbrand<T> = T extends Map<infer E, infer F>\n ? Map<E, F>\n : T extends Set<infer E>\n ? Set<E>\n : T extends Array<infer E>\n ? Array<E>\n : RemoveAllBrands<T>;\n\n/**\n * Makes type into a branded type, ensuring that value is assignable to\n * the base ubranded type. Optionally you can explicitly supply current value\n * type to combine both (useful for composite branded types. Make sure you\n * compose branded types which are not composite themselves.)\n */\nexport const toBrandedType = <BrandedType, CurrentType = BrandedType>(\n value: Unbrand<BrandedType>,\n) => {\n return value as CurrentType & BrandedType;\n};\n\n// -----------------------------------------------------------------------------\n\n// Promise.try, adapted from https://github.com/sindresorhus/p-try\nexport const promiseTry = async <TValue, TArgs extends unknown[]>(\n fn: (...args: TArgs) => PromiseLike<TValue> | TValue,\n ...args: TArgs\n): Promise<TValue> => {\n return new Promise((resolve) => {\n resolve(fn(...args));\n });\n};\n", "import {\n ElementsMap,\n ElementsMapOrArray,\n ExcalidrawElement,\n NonDeletedExcalidrawElement,\n} from \"../element/types\";\nimport { getElementAbsoluteCoords, getElementBounds } from \"../element\";\nimport { AppState, InteractiveCanvasAppState } from \"../types\";\nimport { isBoundToContainer, isFrameLikeElement } from \"../element/typeChecks\";\nimport {\n elementOverlapsWithFrame,\n getContainingFrame,\n getFrameChildren,\n} from \"../frame\";\nimport { isShallowEqual } from \"../utils\";\nimport { isElementInViewport } from \"../element/sizeHelpers\";\n\n/**\n * Frames and their containing elements are not to be selected at the same time.\n * Given an array of selected elements, if there are frames and their containing elements\n * we only keep the frames.\n * @param selectedElements\n */\nexport const excludeElementsInFramesFromSelection = <\n T extends ExcalidrawElement,\n>(\n selectedElements: readonly T[],\n) => {\n const framesInSelection = new Set<T[\"id\"]>();\n\n selectedElements.forEach((element) => {\n if (isFrameLikeElement(element)) {\n framesInSelection.add(element.id);\n }\n });\n\n return selectedElements.filter((element) => {\n if (element.frameId && framesInSelection.has(element.frameId)) {\n return false;\n }\n return true;\n });\n};\n\nexport const getElementsWithinSelection = (\n elements: readonly NonDeletedExcalidrawElement[],\n selection: NonDeletedExcalidrawElement,\n elementsMap: ElementsMap,\n excludeElementsInFrames: boolean = true,\n) => {\n const [selectionX1, selectionY1, selectionX2, selectionY2] =\n getElementAbsoluteCoords(selection, elementsMap);\n\n let elementsInSelection = elements.filter((element) => {\n let [elementX1, elementY1, elementX2, elementY2] = getElementBounds(\n element,\n elementsMap,\n );\n\n const containingFrame = getContainingFrame(element, elementsMap);\n if (containingFrame) {\n const [fx1, fy1, fx2, fy2] = getElementBounds(\n containingFrame,\n elementsMap,\n );\n\n elementX1 = Math.max(fx1, elementX1);\n elementY1 = Math.max(fy1, elementY1);\n elementX2 = Math.min(fx2, elementX2);\n elementY2 = Math.min(fy2, elementY2);\n }\n\n return (\n element.locked === false &&\n element.type !== \"selection\" &&\n !isBoundToContainer(element) &&\n selectionX1 <= elementX1 &&\n selectionY1 <= elementY1 &&\n selectionX2 >= elementX2 &&\n selectionY2 >= elementY2\n );\n });\n\n elementsInSelection = excludeElementsInFrames\n ? excludeElementsInFramesFromSelection(elementsInSelection)\n : elementsInSelection;\n\n elementsInSelection = elementsInSelection.filter((element) => {\n const containingFrame = getContainingFrame(element, elementsMap);\n\n if (containingFrame) {\n return elementOverlapsWithFrame(element, containingFrame, elementsMap);\n }\n\n return true;\n });\n\n return elementsInSelection;\n};\n\nexport const getVisibleAndNonSelectedElements = (\n elements: readonly NonDeletedExcalidrawElement[],\n selectedElements: readonly NonDeletedExcalidrawElement[],\n appState: AppState,\n elementsMap: ElementsMap,\n) => {\n const selectedElementsSet = new Set(\n selectedElements.map((element) => element.id),\n );\n return elements.filter((element) => {\n const isVisible = isElementInViewport(\n element,\n appState.width,\n appState.height,\n appState,\n elementsMap,\n );\n\n return !selectedElementsSet.has(element.id) && isVisible;\n });\n};\n\n// FIXME move this into the editor instance to keep utility methods stateless\nexport const isSomeElementSelected = (function () {\n let lastElements: readonly NonDeletedExcalidrawElement[] | null = null;\n let lastSelectedElementIds: AppState[\"selectedElementIds\"] | null = null;\n let isSelected: boolean | null = null;\n\n const ret = (\n elements: readonly NonDeletedExcalidrawElement[],\n appState: Pick<AppState, \"selectedElementIds\">,\n ): boolean => {\n if (\n isSelected != null &&\n elements === lastElements &&\n appState.selectedElementIds === lastSelectedElementIds\n ) {\n return isSelected;\n }\n\n isSelected = elements.some(\n (element) => appState.selectedElementIds[element.id],\n );\n lastElements = elements;\n lastSelectedElementIds = appState.selectedElementIds;\n\n return isSelected;\n };\n\n ret.clearCache = () => {\n lastElements = null;\n lastSelectedElementIds = null;\n isSelected = null;\n };\n\n return ret;\n})();\n\n/**\n * Returns common attribute (picked by `getAttribute` callback) of selected\n * elements. If elements don't share the same value, returns `null`.\n */\nexport const getCommonAttributeOfSelectedElements = <T>(\n elements: readonly NonDeletedExcalidrawElement[],\n appState: Pick<AppState, \"selectedElementIds\">,\n getAttribute: (element: ExcalidrawElement) => T,\n): T | null => {\n const attributes = Array.from(\n new Set(\n getSelectedElements(elements, appState).map((element) =>\n getAttribute(element),\n ),\n ),\n );\n return attributes.length === 1 ? attributes[0] : null;\n};\n\nexport const getSelectedElements = (\n elements: ElementsMapOrArray,\n appState: Pick<InteractiveCanvasAppState, \"selectedElementIds\">,\n opts?: {\n includeBoundTextElement?: boolean;\n includeElementsInFrames?: boolean;\n },\n) => {\n const selectedElements: ExcalidrawElement[] = [];\n for (const element of elements.values()) {\n if (appState.selectedElementIds[element.id]) {\n selectedElements.push(element);\n continue;\n }\n if (\n opts?.includeBoundTextElement &&\n isBoundToContainer(element) &&\n appState.selectedElementIds[element?.containerId]\n ) {\n selectedElements.push(element);\n continue;\n }\n }\n\n if (opts?.includeElementsInFrames) {\n const elementsToInclude: ExcalidrawElement[] = [];\n selectedElements.forEach((element) => {\n if (isFrameLikeElement(element)) {\n getFrameChildren(elements, element.id).forEach((e) =>\n elementsToInclude.push(e),\n );\n }\n elementsToInclude.push(element);\n });\n\n return elementsToInclude;\n }\n\n return selectedElements;\n};\n\nexport const getTargetElements = (\n elements: ElementsMapOrArray,\n appState: Pick<AppState, \"selectedElementIds\" | \"editingElement\">,\n) =>\n appState.editingElement\n ? [appState.editingElement]\n : getSelectedElements(elements, appState, {\n includeBoundTextElement: true,\n });\n\n/**\n * returns prevState's selectedElementids if no change from previous, so as to\n * retain reference identity for memoization\n */\nexport const makeNextSelectedElementIds = (\n nextSelectedElementIds: AppState[\"selectedElementIds\"],\n prevState: Pick<AppState, \"selectedElementIds\">,\n) => {\n if (isShallowEqual(prevState.selectedElementIds, nextSelectedElementIds)) {\n return prevState.selectedElementIds;\n }\n\n return nextSelectedElementIds;\n};\n", "import {\n getCommonBounds,\n getElementAbsoluteCoords,\n isTextElement,\n} from \"./element\";\nimport {\n ElementsMap,\n ElementsMapOrArray,\n ExcalidrawElement,\n ExcalidrawFrameLikeElement,\n NonDeleted,\n NonDeletedExcalidrawElement,\n} from \"./element/types\";\nimport { isPointWithinBounds } from \"./math\";\nimport {\n getBoundTextElement,\n getContainerElement,\n} from \"./element/textElement\";\nimport { arrayToMap } from \"./utils\";\nimport { mutateElement } from \"./element/mutateElement\";\nimport { AppClassProperties, AppState, StaticCanvasAppState } from \"./types\";\nimport { getElementsWithinSelection, getSelectedElements } from \"./scene\";\nimport { getElementsInGroup, selectGroupsFromGivenElements } from \"./groups\";\nimport type { ExcalidrawElementsIncludingDeleted } from \"./scene/Scene\";\nimport { getElementLineSegments } from \"./element/bounds\";\nimport { doLineSegmentsIntersect, elementsOverlappingBBox } from \"../utils/\";\nimport { isFrameElement, isFrameLikeElement } from \"./element/typeChecks\";\nimport { ReadonlySetLike } from \"./utility-types\";\n\n// --------------------------- Frame State ------------------------------------\nexport const bindElementsToFramesAfterDuplication = (\n nextElements: ExcalidrawElement[],\n oldElements: readonly ExcalidrawElement[],\n oldIdToDuplicatedId: Map<ExcalidrawElement[\"id\"], ExcalidrawElement[\"id\"]>,\n) => {\n const nextElementMap = arrayToMap(nextElements) as Map<\n ExcalidrawElement[\"id\"],\n ExcalidrawElement\n >;\n\n for (const element of oldElements) {\n if (element.frameId) {\n // use its frameId to get the new frameId\n const nextElementId = oldIdToDuplicatedId.get(element.id);\n const nextFrameId = oldIdToDuplicatedId.get(element.frameId);\n if (nextElementId) {\n const nextElement = nextElementMap.get(nextElementId);\n if (nextElement) {\n mutateElement(\n nextElement,\n {\n frameId: nextFrameId ?? element.frameId,\n },\n false,\n );\n }\n }\n }\n }\n};\n\nexport function isElementIntersectingFrame(\n element: ExcalidrawElement,\n frame: ExcalidrawFrameLikeElement,\n elementsMap: ElementsMap,\n) {\n const frameLineSegments = getElementLineSegments(frame, elementsMap);\n\n const elementLineSegments = getElementLineSegments(element, elementsMap);\n\n const intersecting = frameLineSegments.some((frameLineSegment) =>\n elementLineSegments.some((elementLineSegment) =>\n doLineSegmentsIntersect(frameLineSegment, elementLineSegment),\n ),\n );\n\n return intersecting;\n}\n\nexport const getElementsCompletelyInFrame = (\n elements: readonly ExcalidrawElement[],\n frame: ExcalidrawFrameLikeElement,\n elementsMap: ElementsMap,\n) =>\n omitGroupsContainingFrameLikes(\n getElementsWithinSelection(elements, frame, elementsMap, false),\n ).filter(\n (element) =>\n (!isFrameLikeElement(element) && !element.frameId) ||\n element.frameId === frame.id,\n );\n\nexport const isElementContainingFrame = (\n elements: readonly ExcalidrawElement[],\n element: ExcalidrawElement,\n frame: ExcalidrawFrameLikeElement,\n elementsMap: ElementsMap,\n) => {\n return getElementsWithinSelection(elements, element, elementsMap).some(\n (e) => e.id === frame.id,\n );\n};\n\nexport const getElementsIntersectingFrame = (\n elements: readonly ExcalidrawElement[],\n frame: ExcalidrawFrameLikeElement,\n) => {\n const elementsMap = arrayToMap(elements);\n return elements.filter((element) =>\n isElementIntersectingFrame(element, frame, elementsMap),\n );\n};\n\nexport const elementsAreInFrameBounds = (\n elements: readonly ExcalidrawElement[],\n frame: ExcalidrawFrameLikeElement,\n elementsMap: ElementsMap,\n) => {\n const [frameX1, frameY1, frameX2, frameY2] = getElementAbsoluteCoords(\n frame,\n elementsMap,\n );\n\n const [elementX1, elementY1, elementX2, elementY2] =\n getCommonBounds(elements);\n\n return (\n frameX1 <= elementX1 &&\n frameY1 <= elementY1 &&\n frameX2 >= elementX2 &&\n frameY2 >= elementY2\n );\n};\n\nexport const elementOverlapsWithFrame = (\n element: ExcalidrawElement,\n frame: ExcalidrawFrameLikeElement,\n elementsMap: ElementsMap,\n) => {\n return (\n elementsAreInFrameBounds([element], frame, elementsMap) ||\n isElementIntersectingFrame(element, frame, elementsMap) ||\n isElementContainingFrame([frame], element, frame, elementsMap)\n );\n};\n\nexport const isCursorInFrame = (\n cursorCoords: {\n x: number;\n y: number;\n },\n frame: NonDeleted<ExcalidrawFrameLikeElement>,\n elementsMap: ElementsMap,\n) => {\n const [fx1, fy1, fx2, fy2] = getElementAbsoluteCoords(frame, elementsMap);\n\n return isPointWithinBounds(\n [fx1, fy1],\n [cursorCoords.x, cursorCoords.y],\n [fx2, fy2],\n );\n};\n\nexport const groupsAreAtLeastIntersectingTheFrame = (\n elements: readonly NonDeletedExcalidrawElement[],\n groupIds: readonly string[],\n frame: ExcalidrawFrameLikeElement,\n) => {\n const elementsMap = arrayToMap(elements);\n const elementsInGroup = groupIds.flatMap((groupId) =>\n getElementsInGroup(elements, groupId),\n );\n\n if (elementsInGroup.length === 0) {\n return true;\n }\n\n return !!elementsInGroup.find(\n (element) =>\n elementsAreInFrameBounds([element], frame, elementsMap) ||\n isElementIntersectingFrame(element, frame, elementsMap),\n );\n};\n\nexport const groupsAreCompletelyOutOfFrame = (\n elements: readonly NonDeletedExcalidrawElement[],\n groupIds: readonly string[],\n frame: ExcalidrawFrameLikeElement,\n) => {\n const elementsMap = arrayToMap(elements);\n const elementsInGroup = groupIds.flatMap((groupId) =>\n getElementsInGroup(elements, groupId),\n );\n\n if (elementsInGroup.length === 0) {\n return true;\n }\n\n return (\n elementsInGroup.find(\n (element) =>\n elementsAreInFrameBounds([element], frame, elementsMap) ||\n isElementIntersectingFrame(element, frame, elementsMap),\n ) === undefined\n );\n};\n\n// --------------------------- Frame Utils ------------------------------------\n\n/**\n * Returns a map of frameId to frame elements. Includes empty frames.\n */\nexport const groupByFrameLikes = (elements: readonly ExcalidrawElement[]) => {\n const frameElementsMap = new Map<\n ExcalidrawElement[\"id\"],\n ExcalidrawElement[]\n >();\n\n for (const element of elements) {\n const frameId = isFrameLikeElement(element) ? element.id : element.frameId;\n if (frameId && !frameElementsMap.has(frameId)) {\n frameElementsMap.set(frameId, getFrameChildren(elements, frameId));\n }\n }\n\n return frameElementsMap;\n};\n\nexport const getFrameChildren = (\n allElements: ElementsMapOrArray,\n frameId: string,\n) => {\n const frameChildren: ExcalidrawElement[] = [];\n for (const element of allElements.values()) {\n if (element.frameId === frameId) {\n frameChildren.push(element);\n }\n }\n return frameChildren;\n};\n\nexport const getFrameLikeElements = (\n allElements: ExcalidrawElementsIncludingDeleted,\n): ExcalidrawFrameLikeElement[] => {\n return allElements.filter((element): element is ExcalidrawFrameLikeElement =>\n isFrameLikeElement(element),\n );\n};\n\n/**\n * Returns ExcalidrawFrameElements and non-frame-children elements.\n *\n * Considers children as root elements if they point to a frame parent\n * non-existing in the elements set.\n *\n * Considers non-frame bound elements (container or arrow labels) as root.\n */\nexport const getRootElements = (\n allElements: ExcalidrawElementsIncludingDeleted,\n) => {\n const frameElements = arrayToMap(getFrameLikeElements(allElements));\n return allElements.filter(\n (element) =>\n frameElements.has(element.id) ||\n !element.frameId ||\n !frameElements.has(element.frameId),\n );\n};\n\nexport const getElementsInResizingFrame = (\n allElements: ExcalidrawElementsIncludingDeleted,\n frame: ExcalidrawFrameLikeElement,\n appState: AppState,\n elementsMap: ElementsMap,\n): ExcalidrawElement[] => {\n const prevElementsInFrame = getFrameChildren(allElements, frame.id);\n const nextElementsInFrame = new Set<ExcalidrawElement>(prevElementsInFrame);\n\n const elementsCompletelyInFrame = new Set([\n ...getElementsCompletelyInFrame(allElements, frame, elementsMap),\n ...prevElementsInFrame.filter((element) =>\n isElementContainingFrame(allElements, element, frame, elementsMap),\n ),\n ]);\n\n const elementsNotCompletelyInFrame = prevElementsInFrame.filter(\n (element) => !elementsCompletelyInFrame.has(element),\n );\n\n // for elements that are completely in the frame\n // if they are part of some groups, then those groups are still\n // considered to belong to the frame\n const groupsToKeep = new Set<string>(\n Array.from(elementsCompletelyInFrame).flatMap(\n (element) => element.groupIds,\n ),\n );\n\n for (const element of elementsNotCompletelyInFrame) {\n if (!isElementIntersectingFrame(element, frame, elementsMap)) {\n if (element.groupIds.length === 0) {\n nextElementsInFrame.delete(element);\n }\n } else if (element.groupIds.length > 0) {\n // group element intersects with the frame, we should keep the groups\n // that this element is part of\n for (const id of element.groupIds) {\n groupsToKeep.add(id);\n }\n }\n }\n\n for (const element of elementsNotCompletelyInFrame) {\n if (element.groupIds.length > 0) {\n let shouldRemoveElement = true;\n\n for (const id of element.groupIds) {\n if (groupsToKeep.has(id)) {\n shouldRemoveElement = false;\n }\n }\n\n if (shouldRemoveElement) {\n nextElementsInFrame.delete(element);\n }\n }\n }\n\n const individualElementsCompletelyInFrame = Array.from(\n elementsCompletelyInFrame,\n ).filter((element) => element.groupIds.length === 0);\n\n for (const element of individualElementsCompletelyInFrame) {\n nextElementsInFrame.add(element);\n }\n\n const newGroupElementsCompletelyInFrame = Array.from(\n elementsCompletelyInFrame,\n ).filter((element) => element.groupIds.length > 0);\n\n const groupIds = selectGroupsFromGivenElements(\n newGroupElementsCompletelyInFrame,\n appState,\n );\n\n // new group elements\n for (const [id, isSelected] of Object.entries(groupIds)) {\n if (isSelected) {\n const elementsInGroup = getElementsInGroup(allElements, id);\n\n if (elementsAreInFrameBounds(elementsInGroup, frame, elementsMap)) {\n for (const element of elementsInGroup) {\n nextElementsInFrame.add(element);\n }\n }\n }\n }\n\n return [...nextElementsInFrame].filter((element) => {\n return !(isTextElement(element) && element.containerId);\n });\n};\n\nexport const getElementsInNewFrame = (\n elements: ExcalidrawElementsIncludingDeleted,\n frame: ExcalidrawFrameLikeElement,\n elementsMap: ElementsMap,\n) => {\n return omitGroupsContainingFrameLikes(\n elements,\n getElementsCompletelyInFrame(elements, frame, elementsMap),\n );\n};\n\nexport const getContainingFrame = (\n element: ExcalidrawElement,\n elementsMap: ElementsMap,\n) => {\n if (!element.frameId) {\n return null;\n }\n return (elementsMap.get(element.frameId) ||\n null) as null | ExcalidrawFrameLikeElement;\n};\n\n// --------------------------- Frame Operations -------------------------------\n\n/** */\nexport const filterElementsEligibleAsFrameChildren = (\n elements: readonly ExcalidrawElement[],\n frame: ExcalidrawFrameLikeElement,\n) => {\n const otherFrames = new Set<ExcalidrawFrameLikeElement[\"id\"]>();\n const elementsMap = arrayToMap(elements);\n elements = omitGroupsContainingFrameLikes(elements);\n\n for (const element of elements) {\n if (isFrameLikeElement(element) && element.id !== frame.id) {\n otherFrames.add(element.id);\n }\n }\n\n const processedGroups = new Set<ExcalidrawElement[\"id\"]>();\n\n const eligibleElements: ExcalidrawElement[] = [];\n\n for (const element of elements) {\n // don't add frames or their children\n if (\n isFrameLikeElement(element) ||\n (element.frameId && otherFrames.has(element.frameId))\n ) {\n continue;\n }\n\n if (element.groupIds.length) {\n const shallowestGroupId = element.groupIds.at(-1)!;\n if (!processedGroups.has(shallowestGroupId)) {\n processedGroups.add(shallowestGroupId);\n const groupElements = getElementsInGroup(elements, shallowestGroupId);\n if (\n groupElements.some((el) =>\n elementOverlapsWithFrame(el, frame, elementsMap),\n )\n ) {\n for (const child of groupElements) {\n eligibleElements.push(child);\n }\n }\n }\n } else {\n const overlaps = elementOverlapsWithFrame(element, frame, elementsMap);\n if (overlaps) {\n eligibleElements.push(element);\n }\n }\n }\n\n return eligibleElements;\n};\n\n/**\n * Retains (or repairs for target frame) the ordering invriant where children\n * elements come right before the parent frame:\n * [el, el, child, child, frame, el]\n *\n * @returns mutated allElements (same data structure)\n */\nexport const addElementsToFrame = <T extends ElementsMapOrArray>(\n allElements: T,\n elementsToAdd: NonDeletedExcalidrawElement[],\n frame: ExcalidrawFrameLikeElement,\n): T => {\n const elementsMap = arrayToMap(allElements);\n const currTargetFrameChildrenMap = new Map<ExcalidrawElement[\"id\"], true>();\n for (const element of allElements.values()) {\n if (element.frameId === frame.id) {\n currTargetFrameChildrenMap.set(element.id, true);\n }\n }\n\n const suppliedElementsToAddSet = new Set(elementsToAdd.map((el) => el.id));\n\n const finalElementsToAdd: ExcalidrawElement[] = [];\n\n const otherFrames = new Set<ExcalidrawFrameLikeElement[\"id\"]>();\n\n for (const element of elementsToAdd) {\n if (isFrameLikeElement(element) && element.id !== frame.id) {\n otherFrames.add(element.id);\n }\n }\n\n // - add bound text elements if not already in the array\n // - filter out elements that are already in the frame\n for (const element of omitGroupsContainingFrameLikes(\n allElements,\n elementsToAdd,\n )) {\n // don't add frames or their children\n if (\n isFrameLikeElement(element) ||\n (element.frameId && otherFrames.has(element.frameId))\n ) {\n continue;\n }\n\n if (!currTargetFrameChildrenMap.has(element.id)) {\n finalElementsToAdd.push(element);\n }\n\n const boundTextElement = getBoundTextElement(element, elementsMap);\n if (\n boundTextElement &&\n !suppliedElementsToAddSet.has(boundTextElement.id) &&\n !currTargetFrameChildrenMap.has(boundTextElement.id)\n ) {\n finalElementsToAdd.push(boundTextElement);\n }\n }\n\n for (const element of finalElementsToAdd) {\n mutateElement(\n element,\n {\n frameId: frame.id,\n },\n false,\n );\n }\n\n return allElements;\n};\n\nexport const removeElementsFromFrame = (\n elementsToRemove: ReadonlySetLike<NonDeletedExcalidrawElement>,\n elementsMap: ElementsMap,\n) => {\n const _elementsToRemove = new Map<\n ExcalidrawElement[\"id\"],\n ExcalidrawElement\n >();\n\n const toRemoveElementsByFrame = new Map<\n ExcalidrawFrameLikeElement[\"id\"],\n ExcalidrawElement[]\n >();\n\n for (const element of elementsToRemove) {\n if (element.frameId) {\n _elementsToRemove.set(element.id, element);\n\n const arr = toRemoveElementsByFrame.get(element.frameId) || [];\n arr.push(element);\n\n const boundTextElement = getBoundTextElement(element, elementsMap);\n if (boundTextElement) {\n _elementsToRemove.set(boundTextElement.id, boundTextElement);\n arr.push(boundTextElement);\n }\n\n toRemoveElementsByFrame.set(element.frameId, arr);\n }\n }\n\n for (const [, element] of _elementsToRemove) {\n mutateElement(\n element,\n {\n frameId: null,\n },\n false,\n );\n }\n};\n\nexport const removeAllElementsFromFrame = <T extends ExcalidrawElement>(\n allElements: readonly T[],\n frame: ExcalidrawFrameLikeElement,\n) => {\n const elementsInFrame = getFrameChildren(allElements, frame.id);\n removeElementsFromFrame(elementsInFrame, arrayToMap(allElements));\n return allElements;\n};\n\nexport const replaceAllElementsInFrame = <T extends ExcalidrawElement>(\n allElements: readonly T[],\n nextElementsInFrame: ExcalidrawElement[],\n frame: ExcalidrawFrameLikeElement,\n app: AppClassProperties,\n): T[] => {\n return addElementsToFrame(\n removeAllElementsFromFrame(allElements, frame),\n nextElementsInFrame,\n frame,\n ).slice();\n};\n\n/** does not mutate elements, but returns new ones */\nexport const updateFrameMembershipOfSelectedElements = <\n T extends ElementsMapOrArray,\n>(\n allElements: T,\n appState: AppState,\n app: AppClassProperties,\n) => {\n const selectedElements = app.scene.getSelectedElements({\n selectedElementIds: appState.selectedElementIds,\n // supplying elements explicitly in case we're passed non-state elements\n elements: allElements,\n });\n const elementsToFilter = new Set<ExcalidrawElement>(selectedElements);\n\n if (appState.editingGroupId) {\n for (const element of selectedElements) {\n if (element.groupIds.length === 0) {\n elementsToFilter.add(element);\n } else {\n element.groupIds\n .flatMap((gid) => getElementsInGroup(allElements, gid))\n .forEach((element) => elementsToFilter.add(element));\n }\n }\n }\n\n const elementsToRemove = new Set<ExcalidrawElement>();\n\n const elementsMap = arrayToMap(allElements);\n\n elementsToFilter.forEach((element) => {\n if (\n element.frameId &&\n !isFrameLikeElement(element) &&\n !isElementInFrame(element, elementsMap, appState)\n ) {\n elementsToRemove.add(element);\n }\n });\n\n if (elementsToRemove.size > 0) {\n removeElementsFromFrame(elementsToRemove, elementsMap);\n }\n return allElements;\n};\n\n/**\n * filters out elements that are inside groups that contain a frame element\n * anywhere in the group tree\n */\nexport const omitGroupsContainingFrameLikes = (\n allElements: ElementsMapOrArray,\n /** subset of elements you want to filter. Optional perf optimization so we\n * don't have to filter all elements unnecessarily\n */\n selectedElements?: readonly ExcalidrawElement[],\n) => {\n const uniqueGroupIds = new Set<string>();\n const elements = selectedElements || allElements;\n\n for (const el of elements.values()) {\n const topMostGroupId = el.groupIds[el.groupIds.length - 1];\n if (topMostGroupId) {\n uniqueGroupIds.add(topMostGroupId);\n }\n }\n\n const rejectedGroupIds = new Set<string>();\n for (const groupId of uniqueGroupIds) {\n if (\n getElementsInGroup(allElements, groupId).some((el) =>\n isFrameLikeElement(el),\n )\n ) {\n rejectedGroupIds.add(groupId);\n }\n }\n\n const ret: ExcalidrawElement[] = [];\n\n for (const element of elements.values()) {\n if (!rejectedGroupIds.has(element.groupIds[element.groupIds.length - 1])) {\n ret.push(element);\n }\n }\n\n return ret;\n};\n\n/**\n * depending on the appState, return target frame, which is the frame the given element\n * is going to be added to or remove from\n */\nexport const getTargetFrame = (\n element: ExcalidrawElement,\n elementsMap: ElementsMap,\n appState: StaticCanvasAppState,\n) => {\n const _element = isTextElement(element)\n ? getContainerElement(element, elementsMap) || element\n : element;\n\n return appState.selectedElementIds[_element.id] &&\n appState.selectedElementsAreBeingDragged\n ? appState.frameToHighlight\n : getContainingFrame(_element, elementsMap);\n};\n\n// TODO: this a huge bottleneck for large scenes, optimise\n// given an element, return if the element is in some frame\nexport const isElementInFrame = (\n element: ExcalidrawElement,\n allElementsMap: ElementsMap,\n appState: StaticCanvasAppState,\n) => {\n const frame = getTargetFrame(element, allElementsMap, appState);\n const _element = isTextElement(element)\n ? getContainerElement(element, allElementsMap) || element\n : element;\n\n if (frame) {\n // Perf improvement:\n // For an element that's already in a frame, if it's not being dragged\n // then there is no need to refer to geometry (which, yes, is slow) to check if it's in a frame.\n // It has to be in its containing frame.\n if (\n !appState.selectedElementIds[element.id] ||\n !appState.selectedElementsAreBeingDragged\n ) {\n return true;\n }\n\n if (_element.groupIds.length === 0) {\n return elementOverlapsWithFrame(_element, frame, allElementsMap);\n }\n\n const allElementsInGroup = new Set(\n _element.groupIds.flatMap((gid) =>\n getElementsInGroup(allElementsMap, gid),\n ),\n );\n\n if (appState.editingGroupId && appState.selectedElementsAreBeingDragged) {\n const selectedElements = new Set(\n getSelectedElements(allElementsMap, appState),\n );\n\n const editingGroupOverlapsFrame = appState.frameToHighlight !== null;\n\n if (editingGroupOverlapsFrame) {\n return true;\n }\n\n selectedElements.forEach((selectedElement) => {\n allElementsInGroup.delete(selectedElement);\n });\n }\n\n for (const elementInGroup of allElementsInGroup) {\n if (isFrameLikeElement(elementInGroup)) {\n return false;\n }\n }\n\n for (const elementInGroup of allElementsInGroup) {\n if (elementOverlapsWithFrame(elementInGroup, frame, allElementsMap)) {\n return true;\n }\n }\n }\n\n return false;\n};\n\nexport const getFrameLikeTitle = (\n element: ExcalidrawFrameLikeElement,\n frameIdx: number,\n) => {\n // TODO name frames \"AI\" only if specific to AI frames\n return element.name === null\n ? isFrameElement(element)\n ? `Frame ${frameIdx}`\n : `AI Frame $${frameIdx}`\n : element.name;\n};\n\nexport const getElementsOverlappingFrame = (\n elements: readonly ExcalidrawElement[],\n frame: ExcalidrawFrameLikeElement,\n) => {\n return (\n elementsOverlappingBBox({\n elements,\n bounds: frame,\n type: \"overlap\",\n })\n // removes elements who are overlapping, but are in a different frame,\n // and thus invisible in target frame\n .filter((el) => !el.frameId || el.frameId === frame.id)\n );\n};\n", "import { NormalizedZoomValue, Point, Zoom } from \"./types\";\nimport {\n DEFAULT_ADAPTIVE_RADIUS,\n LINE_CONFIRM_THRESHOLD,\n DEFAULT_PROPORTIONAL_RADIUS,\n ROUNDNESS,\n} from \"./constants\";\nimport {\n ExcalidrawElement,\n ExcalidrawLinearElement,\n NonDeleted,\n} from \"./element/types\";\nimport { getCurvePathOps } from \"./element/bounds\";\nimport { Mutable } from \"./utility-types\";\nimport { ShapeCache } from \"./scene/ShapeCache\";\n\nexport const rotate = (\n // target point to rotate\n x: number,\n y: number,\n // point to rotate against\n cx: number,\n cy: number,\n angle: number,\n): [number, number] =>\n // \uD835\uDC4E\u2032\uD835\uDC65=(\uD835\uDC4E\uD835\uDC65\u2212\uD835\uDC50\uD835\uDC65)cos\uD835\uDF03\u2212(\uD835\uDC4E\uD835\uDC66\u2212\uD835\uDC50\uD835\uDC66)sin\uD835\uDF03+\uD835\uDC50\uD835\uDC65\n // \uD835\uDC4E\u2032\uD835\uDC66=(\uD835\uDC4E\uD835\uDC65\u2212\uD835\uDC50\uD835\uDC65)sin\uD835\uDF03+(\uD835\uDC4E\uD835\uDC66\u2212\uD835\uDC50\uD835\uDC66)cos\uD835\uDF03+\uD835\uDC50\uD835\uDC66.\n // https://math.stackexchange.com/questions/2204520/how-do-i-rotate-a-line-segment-in-a-specific-point-on-the-line\n [\n (x - cx) * Math.cos(angle) - (y - cy) * Math.sin(angle) + cx,\n (x - cx) * Math.sin(angle) + (y - cy) * Math.cos(angle) + cy,\n ];\n\nexport const rotatePoint = (\n point: Point,\n center: Point,\n angle: number,\n): [number, number] => rotate(point[0], point[1], center[0], center[1], angle);\n\nexport const adjustXYWithRotation = (\n sides: {\n n?: boolean;\n e?: boolean;\n s?: boolean;\n w?: boolean;\n },\n x: number,\n y: number,\n angle: number,\n deltaX1: number,\n deltaY1: number,\n deltaX2: number,\n deltaY2: number,\n): [number, number] => {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n if (sides.e && sides.w) {\n x += deltaX1 + deltaX2;\n } else if (sides.e) {\n x += deltaX1 * (1 + cos);\n y += deltaX1 * sin;\n x += deltaX2 * (1 - cos);\n y += deltaX2 * -sin;\n } else if (sides.w) {\n x += deltaX1 * (1 - cos);\n y += deltaX1 * -sin;\n x += deltaX2 * (1 + cos);\n y += deltaX2 * sin;\n }\n\n if (sides.n && sides.s) {\n y += deltaY1 + deltaY2;\n } else if (sides.n) {\n x += deltaY1 * sin;\n y += deltaY1 * (1 - cos);\n x += deltaY2 * -sin;\n y += deltaY2 * (1 + cos);\n } else if (sides.s) {\n x += deltaY1 * -sin;\n y += deltaY1 * (1 + cos);\n x += deltaY2 * sin;\n y += deltaY2 * (1 - cos);\n }\n return [x, y];\n};\n\nexport const getPointOnAPath = (point: Point, path: Point[]) => {\n const [px, py] = point;\n const [start, ...other] = path;\n let [lastX, lastY] = start;\n let kLine: number = 0;\n let idx: number = 0;\n\n // if any item in the array is true, it means that a point is\n // on some segment of a line based path\n const retVal = other.some(([x2, y2], i) => {\n // we always take a line when dealing with line segments\n const x1 = lastX;\n const y1 = lastY;\n\n lastX = x2;\n lastY = y2;\n\n // if a point is not within the domain of the line segment\n // it is not on the line segment\n if (px < x1 || px > x2) {\n return false;\n }\n\n // check if all points lie on the same line\n // y1 = kx1 + b, y2 = kx2 + b\n // y2 - y1 = k(x2 - x2) -> k = (y2 - y1) / (x2 - x1)\n\n // coefficient for the line (p0, p1)\n const kL = (y2 - y1) / (x2 - x1);\n\n // coefficient for the line segment (p0, point)\n const kP1 = (py - y1) / (px - x1);\n\n // coefficient for the line segment (point, p1)\n const kP2 = (py - y2) / (px - x2);\n\n // because we are basing both lines from the same starting point\n // the only option for collinearity is having same coefficients\n\n // using it for floating point comparisons\n const epsilon = 0.3;\n\n // if coefficient is more than an arbitrary epsilon,\n // these lines are nor collinear\n if (Math.abs(kP1 - kL) > epsilon && Math.abs(kP2 - kL) > epsilon) {\n return false;\n }\n\n // store the coefficient because we are goint to need it\n kLine = kL;\n idx = i;\n\n return true;\n });\n\n // Return a coordinate that is always on the line segment\n if (retVal === true) {\n return { x: point[0], y: kLine * point[0], segment: idx };\n }\n\n return null;\n};\n\nexport const distance2d = (x1: number, y1: number, x2: number, y2: number) => {\n const xd = x2 - x1;\n const yd = y2 - y1;\n return Math.hypot(xd, yd);\n};\n\nexport const centerPoint = (a: Point, b: Point): Point => {\n return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n};\n\n// Checks if the first and last point are close enough\n// to be considered a loop\nexport const isPathALoop = (\n points: ExcalidrawLinearElement[\"points\"],\n /** supply if you want the loop detection to account for current zoom */\n zoomValue: Zoom[\"value\"] = 1 as NormalizedZoomValue,\n): boolean => {\n if (points.length >= 3) {\n const [first, last] = [points[0], points[points.length - 1]];\n const distance = distance2d(first[0], first[1], last[0], last[1]);\n\n // Adjusting LINE_CONFIRM_THRESHOLD to current zoom so that when zoomed in\n // really close we make the threshold smaller, and vice versa.\n return distance <= LINE_CONFIRM_THRESHOLD / zoomValue;\n }\n return false;\n};\n\n// Draw a line from the point to the right till infiinty\n// Check how many lines of the polygon does this infinite line intersects with\n// If the number of intersections is odd, point is in the polygon\nexport const isPointInPolygon = (\n points: Point[],\n x: number,\n y: number,\n): boolean => {\n const vertices = points.length;\n\n // There must be at least 3 vertices in polygon\n if (vertices < 3) {\n return false;\n }\n const extreme: Point = [Number.MAX_SAFE_INTEGER, y];\n const p: Point = [x, y];\n let count = 0;\n for (let i = 0; i < vertices; i++) {\n const current = points[i];\n const next = points[(i + 1) % vertices];\n if (doSegmentsIntersect(current, next, p, extreme)) {\n if (orderedColinearOrientation(current, p, next) === 0) {\n return isPointWithinBounds(current, p, next);\n }\n count++;\n }\n }\n // true if count is off\n return count % 2 === 1;\n};\n\n// Returns whether `q` lies inside the segment/rectangle defined by `p` and `r`.\n// This is an approximation to \"does `q` lie on a segment `pr`\" check.\nexport const isPointWithinBounds = (p: Point, q: Point, r: Point) => {\n return (\n q[0] <= Math.max(p[0], r[0]) &&\n q[0] >= Math.min(p[0], r[0]) &&\n q[1] <= Math.max(p[1], r[1]) &&\n q[1] >= Math.min(p[1], r[1])\n );\n};\n\n// For the ordered points p, q, r, return\n// 0 if p, q, r are colinear\n// 1 if Clockwise\n// 2 if counterclickwise\nconst orderedColinearOrientation = (p: Point, q: Point, r: Point) => {\n const val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1]);\n if (val === 0) {\n return 0;\n }\n return val > 0 ? 1 : 2;\n};\n\n// Check is p1q1 intersects with p2q2\nconst doSegmentsIntersect = (p1: Point, q1: Point, p2: Point, q2: Point) => {\n const o1 = orderedColinearOrientation(p1, q1, p2);\n const o2 = orderedColinearOrientation(p1, q1, q2);\n const o3 = orderedColinearOrientation(p2, q2, p1);\n const o4 = orderedColinearOrientation(p2, q2, q1);\n\n if (o1 !== o2 && o3 !== o4) {\n return true;\n }\n\n // p1, q1 and p2 are colinear and p2 lies on segment p1q1\n if (o1 === 0 && isPointWithinBounds(p1, p2, q1)) {\n return true;\n }\n\n // p1, q1 and p2 are colinear and q2 lies on segment p1q1\n if (o2 === 0 && isPointWithinBounds(p1, q2, q1)) {\n return true;\n }\n\n // p2, q2 and p1 are colinear and p1 lies on segment p2q2\n if (o3 === 0 && isPointWithinBounds(p2, p1, q2)) {\n return true;\n }\n\n // p2, q2 and q1 are colinear and q1 lies on segment p2q2\n if (o4 === 0 && isPointWithinBounds(p2, q1, q2)) {\n return true;\n }\n\n return false;\n};\n\n// TODO: Rounding this point causes some shake when free drawing\nexport const getGridPoint = (\n x: number,\n y: number,\n gridSize: number | null,\n): [number, number] => {\n if (gridSize) {\n return [\n Math.round(x / gridSize) * gridSize,\n Math.round(y / gridSize) * gridSize,\n ];\n }\n return [x, y];\n};\n\nexport const getCornerRadius = (x: number, element: ExcalidrawElement) => {\n if (\n element.roundness?.type === ROUNDNESS.PROPORTIONAL_RADIUS ||\n element.roundness?.type === ROUNDNESS.LEGACY\n ) {\n return x * DEFAULT_PROPORTIONAL_RADIUS;\n }\n\n if (element.roundness?.type === ROUNDNESS.ADAPTIVE_RADIUS) {\n const fixedRadiusSize = element.roundness?.value ?? DEFAULT_ADAPTIVE_RADIUS;\n\n const CUTOFF_SIZE = fixedRadiusSize / DEFAULT_PROPORTIONAL_RADIUS;\n\n if (x <= CUTOFF_SIZE) {\n return x * DEFAULT_PROPORTIONAL_RADIUS;\n }\n\n return fixedRadiusSize;\n }\n\n return 0;\n};\n\nexport const getControlPointsForBezierCurve = (\n element: NonDeleted<ExcalidrawLinearElement>,\n endPoint: Point,\n) => {\n const shape = ShapeCache.generateElementShape(element, null);\n if (!shape) {\n return null;\n }\n\n const ops = getCurvePathOps(shape[0]);\n let currentP: Mutable<Point> = [0, 0];\n let index = 0;\n let minDistance = Infinity;\n let controlPoints: Mutable<Point>[] | null = null;\n\n while (index < ops.length) {\n const { op, data } = ops[index];\n if (op === \"move\") {\n currentP = data as unknown as Mutable<Point>;\n }\n if (op === \"bcurveTo\") {\n const p0 = currentP;\n const p1 = [data[0], data[1]] as Mutable<Point>;\n const p2 = [data[2], data[3]] as Mutable<Point>;\n const p3 = [data[4], data[5]] as Mutable<Point>;\n const distance = distance2d(p3[0], p3[1], endPoint[0], endPoint[1]);\n if (distance < minDistance) {\n minDistance = distance;\n controlPoints = [p0, p1, p2, p3];\n }\n currentP = p3;\n }\n index++;\n }\n\n return controlPoints;\n};\n\nexport const getBezierXY = (\n p0: Point,\n p1: Point,\n p2: Point,\n p3: Point,\n t: number,\n) => {\n const equation = (t: number, idx: number) =>\n Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n const tx = equation(t, 0);\n const ty = equation(t, 1);\n return [tx, ty];\n};\n\nexport const getPointsInBezierCurve = (\n element: NonDeleted<ExcalidrawLinearElement>,\n endPoint: Point,\n) => {\n const controlPoints: Mutable<Point>[] = getControlPointsForBezierCurve(\n element,\n endPoint,\n )!;\n if (!controlPoints) {\n return [];\n }\n const pointsOnCurve: Mutable<Point>[] = [];\n let t = 1;\n // Take 20 points on curve for better accuracy\n while (t > 0) {\n const point = getBezierXY(\n controlPoints[0],\n controlPoints[1],\n controlPoints[2],\n controlPoints[3],\n t,\n );\n pointsOnCurve.push([point[0], point[1]]);\n t -= 0.05;\n }\n if (pointsOnCurve.length) {\n if (arePointsEqual(pointsOnCurve.at(-1)!, endPoint)) {\n pointsOnCurve.push([endPoint[0], endPoint[1]]);\n }\n }\n return pointsOnCurve;\n};\n\nexport const getBezierCurveArcLengths = (\n element: NonDeleted<ExcalidrawLinearElement>,\n endPoint: Point,\n) => {\n const arcLengths: number[] = [];\n arcLengths[0] = 0;\n const points = getPointsInBezierCurve(element, endPoint);\n let index = 0;\n let distance = 0;\n while (index < points.length - 1) {\n const segmentDistance = distance2d(\n points[index][0],\n points[index][1],\n points[index + 1][0],\n points[index + 1][1],\n );\n distance += segmentDistance;\n arcLengths.push(distance);\n index++;\n }\n\n return arcLengths;\n};\n\nexport const getBezierCurveLength = (\n element: NonDeleted<ExcalidrawLinearElement>,\n endPoint: Point,\n) => {\n const arcLengths = getBezierCurveArcLengths(element, endPoint);\n return arcLengths.at(-1) as number;\n};\n\n// This maps interval to actual interval t on the curve so that when t = 0.5, its actually the point at 50% of the length\nexport const mapIntervalToBezierT = (\n element: NonDeleted<ExcalidrawLinearElement>,\n endPoint: Point,\n interval: number, // The interval between 0 to 1 for which you want to find the point on the curve,\n) => {\n const arcLengths = getBezierCurveArcLengths(element, endPoint);\n const pointsCount = arcLengths.length - 1;\n const curveLength = arcLengths.at(-1) as number;\n const targetLength = interval * curveLength;\n let low = 0;\n let high = pointsCount;\n let index = 0;\n // Doing a binary search to find the largest length that is less than the target length\n while (low < high) {\n index = Math.floor(low + (high - low) / 2);\n if (arcLengths[index] < targetLength) {\n low = index + 1;\n } else {\n high = index;\n }\n }\n if (arcLengths[index] > targetLength) {\n index--;\n }\n if (arcLengths[index] === targetLength) {\n return index / pointsCount;\n }\n\n return (\n 1 -\n (index +\n (targetLength - arcLengths[index]) /\n (arcLengths[index + 1] - arcLengths[index])) /\n pointsCount\n );\n};\n\nexport const arePointsEqual = (p1: Point, p2: Point) => {\n return p1[0] === p2[0] && p1[1] === p2[1];\n};\n\nexport const isRightAngle = (angle: number) => {\n // if our angles were mathematically accurate, we could just check\n //\n // angle % (Math.PI / 2) === 0\n //\n // but since we're in floating point land, we need to round.\n //\n // Below, after dividing by Math.PI, a multiple of 0.5 indicates a right\n // angle, which we can check with modulo after rounding.\n return Math.round((angle / Math.PI) * 10000) % 5000 === 0;\n};\n\n// Given two ranges, return if the two ranges overlap with each other\n// e.g. [1, 3] overlaps with [2, 4] while [1, 3] does not overlap with [4, 5]\nexport const rangesOverlap = (\n [a0, a1]: [number, number],\n [b0, b1]: [number, number],\n) => {\n if (a0 <= b0) {\n return a1 >= b0;\n }\n\n if (a0 >= b0) {\n return b1 >= a0;\n }\n\n return false;\n};\n\n// Given two ranges,return ther intersection of the two ranges if any\n// e.g. the intersection of [1, 3] and [2, 4] is [2, 3]\nexport const rangeIntersection = (\n rangeA: [number, number],\n rangeB: [number, number],\n): [number, number] | null => {\n const rangeStart = Math.max(rangeA[0], rangeB[0]);\n const rangeEnd = Math.min(rangeA[1], rangeB[1]);\n\n if (rangeStart <= rangeEnd) {\n return [rangeStart, rangeEnd];\n }\n\n return null;\n};\n\nexport const isValueInRange = (value: number, min: number, max: number) => {\n return value >= min && value <= max;\n};\n", "import {\n ExcalidrawElement,\n ExcalidrawLinearElement,\n Arrowhead,\n ExcalidrawFreeDrawElement,\n NonDeleted,\n ExcalidrawTextElementWithContainer,\n ElementsMap,\n} from \"./types\";\nimport { distance2d, rotate, rotatePoint } from \"../math\";\nimport rough from \"roughjs/bin/rough\";\nimport { Drawable, Op } from \"roughjs/bin/core\";\nimport { AppState, Point } from \"../types\";\nimport { generateRoughOptions } from \"../scene/Shape\";\nimport {\n isArrowElement,\n isBoundToContainer,\n isFreeDrawElement,\n isLinearElement,\n isTextElement,\n} from \"./typeChecks\";\nimport { rescalePoints } from \"../points\";\nimport { getBoundTextElement, getContainerElement } from \"./textElement\";\nimport { LinearElementEditor } from \"./linearElementEditor\";\nimport { Mutable } from \"../utility-types\";\nimport { ShapeCache } from \"../scene/ShapeCache\";\nimport { arrayToMap } from \"../utils\";\n\nexport type RectangleBox = {\n x: number;\n y: number;\n width: number;\n height: number;\n angle: number;\n};\n\ntype MaybeQuadraticSolution = [number | null, number | null] | false;\n\n/**\n * x and y position of top left corner, x and y position of bottom right corner\n */\nexport type Bounds = readonly [\n minX: number,\n minY: number,\n maxX: number,\n maxY: number,\n];\n\nexport type SceneBounds = readonly [\n sceneX: number,\n sceneY: number,\n sceneX2: number,\n sceneY2: number,\n];\n\nexport class ElementBounds {\n private static boundsCache = new WeakMap<\n ExcalidrawElement,\n {\n bounds: Bounds;\n version: ExcalidrawElement[\"version\"];\n }\n >();\n\n static getBounds(element: ExcalidrawElement, elementsMap: ElementsMap) {\n const cachedBounds = ElementBounds.boundsCache.get(element);\n\n if (\n cachedBounds?.version &&\n cachedBounds.version === element.version &&\n // we don't invalidate cache when we update containers and not labels,\n // which is causing problems down the line. Fix TBA.\n !isBoundToContainer(element)\n ) {\n return cachedBounds.bounds;\n }\n const bounds = ElementBounds.calculateBounds(element, elementsMap);\n\n ElementBounds.boundsCache.set(element, {\n version: element.version,\n bounds,\n });\n\n return bounds;\n }\n\n private static calculateBounds(\n element: ExcalidrawElement,\n elementsMap: ElementsMap,\n ): Bounds {\n let bounds: Bounds;\n\n const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(\n element,\n elementsMap,\n );\n if (isFreeDrawElement(element)) {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(\n element.points.map(([x, y]) =>\n rotate(x, y, cx - element.x, cy - element.y, element.angle),\n ),\n );\n\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n } else if (isLinearElement(element)) {\n bounds = getLinearElementRotatedBounds(element, cx, cy, elementsMap);\n } else if (element.type === \"diamond\") {\n const [x11, y11] = rotate(cx, y1, cx, cy, element.angle);\n const [x12, y12] = rotate(cx, y2, cx, cy, element.angle);\n const [x22, y22] = rotate(x1, cy, cx, cy, element.angle);\n const [x21, y21] = rotate(x2, cy, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n } else if (element.type === \"ellipse\") {\n const w = (x2 - x1) / 2;\n const h = (y2 - y1) / 2;\n const cos = Math.cos(element.angle);\n const sin = Math.sin(element.angle);\n const ww = Math.hypot(w * cos, h * sin);\n const hh = Math.hypot(h * cos, w * sin);\n bounds = [cx - ww, cy - hh, cx + ww, cy + hh];\n } else {\n const [x11, y11] = rotate(x1, y1, cx, cy, element.angle);\n const [x12, y12] = rotate(x1, y2, cx, cy, element.angle);\n const [x22, y22] = rotate(x2, y2, cx, cy, element.angle);\n const [x21, y21] = rotate(x2, y1, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n\n return bounds;\n }\n}\n\n// Scene -> Scene coords, but in x1,x2,y1,y2 format.\n//\n// If the element is created from right to left, the width is going to be negative\n// This set of functions retrieves the absolute position of the 4 points.\nexport const getElementAbsoluteCoords = (\n element: ExcalidrawElement,\n elementsMap: ElementsMap,\n includeBoundText: boolean = false,\n): [number, number, number, number, number, number] => {\n if (isFreeDrawElement(element)) {\n return getFreeDrawElementAbsoluteCoords(element);\n } else if (isLinearElement(element)) {\n return LinearElementEditor.getElementAbsoluteCoords(\n element,\n elementsMap,\n includeBoundText,\n );\n } else if (isTextElement(element)) {\n const container = elementsMap\n ? getContainerElement(element, elementsMap)\n : null;\n if (isArrowElement(container)) {\n const coords = LinearElementEditor.getBoundTextElementPosition(\n container,\n element as ExcalidrawTextElementWithContainer,\n elementsMap,\n );\n return [\n coords.x,\n coords.y,\n coords.x + element.width,\n coords.y + element.height,\n coords.x + element.width / 2,\n coords.y + element.height / 2,\n ];\n }\n }\n return [\n element.x,\n element.y,\n element.x + element.width,\n element.y + element.height,\n element.x + element.width / 2,\n element.y + element.height / 2,\n ];\n};\n\n/*\n * for a given element, `getElementLineSegments` returns line segments\n * that can be used for visual collision detection (useful for frames)\n * as opposed to bounding box collision detection\n */\nexport const getElementLineSegments = (\n element: ExcalidrawElement,\n elementsMap: ElementsMap,\n): [Point, Point][] => {\n const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(\n element,\n elementsMap,\n );\n\n const center: Point = [cx, cy];\n\n if (isLinearElement(element) || isFreeDrawElement(element)) {\n const segments: [Point, Point][] = [];\n\n let i = 0;\n\n while (i < element.points.length - 1) {\n segments.push([\n rotatePoint(\n [\n element.points[i][0] + element.x,\n element.points[i][1] + element.y,\n ] as Point,\n center,\n element.angle,\n ),\n rotatePoint(\n [\n element.points[i + 1][0] + element.x,\n element.points[i + 1][1] + element.y,\n ] as Point,\n center,\n element.angle,\n ),\n ]);\n i++;\n }\n\n return segments;\n }\n\n const [nw, ne, sw, se, n, s, w, e] = (\n [\n [x1, y1],\n [x2, y1],\n [x1, y2],\n [x2, y2],\n [cx, y1],\n [cx, y2],\n [x1, cy],\n [x2, cy],\n ] as Point[]\n ).map((point) => rotatePoint(point, center, element.angle));\n\n if (element.type === \"diamond\") {\n return [\n [n, w],\n [n, e],\n [s, w],\n [s, e],\n ];\n }\n\n if (element.type === \"ellipse\") {\n return [\n [n, w],\n [n, e],\n [s, w],\n [s, e],\n [n, w],\n [n, e],\n [s, w],\n [s, e],\n ];\n }\n\n return [\n [nw, ne],\n [sw, se],\n [nw, sw],\n [ne, se],\n [nw, e],\n [sw, e],\n [ne, w],\n [se, w],\n ];\n};\n\n/**\n * Scene -> Scene coords, but in x1,x2,y1,y2 format.\n *\n * Rectangle here means any rectangular frame, not an excalidraw element.\n */\nexport const getRectangleBoxAbsoluteCoords = (boxSceneCoords: RectangleBox) => {\n return [\n boxSceneCoords.x,\n boxSceneCoords.y,\n boxSceneCoords.x + boxSceneCoords.width,\n boxSceneCoords.y + boxSceneCoords.height,\n boxSceneCoords.x + boxSceneCoords.width / 2,\n boxSceneCoords.y + boxSceneCoords.height / 2,\n ];\n};\n\nexport const pointRelativeTo = (\n element: ExcalidrawElement,\n absoluteCoords: Point,\n): Point => {\n return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];\n};\n\nexport const getDiamondPoints = (element: ExcalidrawElement) => {\n // Here we add +1 to avoid these numbers to be 0\n // otherwise rough.js will throw an error complaining about it\n const topX = Math.floor(element.width / 2) + 1;\n const topY = 0;\n const rightX = element.width;\n const rightY = Math.floor(element.height / 2) + 1;\n const bottomX = topX;\n const bottomY = element.height;\n const leftX = 0;\n const leftY = rightY;\n\n return [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY];\n};\n\nexport const getCurvePathOps = (shape: Drawable): Op[] => {\n for (const set of shape.sets) {\n if (set.type === \"path\") {\n return set.ops;\n }\n }\n return shape.sets[0].ops;\n};\n\n// reference: https://eliot-jones.com/2019/12/cubic-bezier-curve-bounding-boxes\nconst getBezierValueForT = (\n t: number,\n p0: number,\n p1: number,\n p2: number,\n p3: number,\n) => {\n const oneMinusT = 1 - t;\n return (\n Math.pow(oneMinusT, 3) * p0 +\n 3 * Math.pow(oneMinusT, 2) * t * p1 +\n 3 * oneMinusT * Math.pow(t, 2) * p2 +\n Math.pow(t, 3) * p3\n );\n};\n\nconst solveQuadratic = (\n p0: number,\n p1: number,\n p2: number,\n p3: number,\n): MaybeQuadraticSolution => {\n const i = p1 - p0;\n const j = p2 - p1;\n const k = p3 - p2;\n\n const a = 3 * i - 6 * j + 3 * k;\n const b = 6 * j - 6 * i;\n const c = 3 * i;\n\n const sqrtPart = b * b - 4 * a * c;\n const hasSolution = sqrtPart >= 0;\n\n if (!hasSolution) {\n return false;\n }\n\n let s1 = null;\n let s2 = null;\n\n let t1 = Infinity;\n let t2 = Infinity;\n\n if (a === 0) {\n t1 = t2 = -c / b;\n } else {\n t1 = (-b + Math.sqrt(sqrtPart)) / (2 * a);\n t2 = (-b - Math.sqrt(sqrtPart)) / (2 * a);\n }\n\n if (t1 >= 0 && t1 <= 1) {\n s1 = getBezierValueForT(t1, p0, p1, p2, p3);\n }\n\n if (t2 >= 0 && t2 <= 1) {\n s2 = getBezierValueForT(t2, p0, p1, p2, p3);\n }\n\n return [s1, s2];\n};\n\nconst getCubicBezierCurveBound = (\n p0: Point,\n p1: Point,\n p2: Point,\n p3: Point,\n): Bounds => {\n const solX = solveQuadratic(p0[0], p1[0], p2[0], p3[0]);\n const solY = solveQuadratic(p0[1], p1[1], p2[1], p3[1]);\n\n let minX = Math.min(p0[0], p3[0]);\n let maxX = Math.max(p0[0], p3[0]);\n\n if (solX) {\n const xs = solX.filter((x) => x !== null) as number[];\n minX = Math.min(minX, ...xs);\n maxX = Math.max(maxX, ...xs);\n }\n\n let minY = Math.min(p0[1], p3[1]);\n let maxY = Math.max(p0[1], p3[1]);\n if (solY) {\n const ys = solY.filter((y) => y !== null) as number[];\n minY = Math.min(minY, ...ys);\n maxY = Math.max(maxY, ...ys);\n }\n return [minX, minY, maxX, maxY];\n};\n\nexport const getMinMaxXYFromCurvePathOps = (\n ops: Op[],\n transformXY?: (x: number, y: number) => [number, number],\n): Bounds => {\n let currentP: Point = [0, 0];\n\n const { minX, minY, maxX, maxY } = ops.reduce(\n (limits, { op, data }) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data as unknown as Point;\n // move operation does not draw anything; so, it always\n // returns false\n } else if (op === \"bcurveTo\") {\n const _p1 = [data[0], data[1]] as Point;\n const _p2 = [data[2], data[3]] as Point;\n const _p3 = [data[4], data[5]] as Point;\n\n const p1 = transformXY ? transformXY(..._p1) : _p1;\n const p2 = transformXY ? transformXY(..._p2) : _p2;\n const p3 = transformXY ? transformXY(..._p3) : _p3;\n\n const p0 = transformXY ? transformXY(...currentP) : currentP;\n currentP = _p3;\n\n const [minX, minY, maxX, maxY] = getCubicBezierCurveBound(\n p0,\n p1,\n p2,\n p3,\n );\n\n limits.minX = Math.min(limits.minX, minX);\n limits.minY = Math.min(limits.minY, minY);\n\n limits.maxX = Math.max(limits.maxX, maxX);\n limits.maxY = Math.max(limits.maxY, maxY);\n } else if (op === \"lineTo\") {\n // TODO: Implement this\n } else if (op === \"qcurveTo\") {\n // TODO: Implement this\n }\n return limits;\n },\n { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity },\n );\n return [minX, minY, maxX, maxY];\n};\n\nexport const getBoundsFromPoints = (\n points: ExcalidrawFreeDrawElement[\"points\"],\n): Bounds => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const [x, y] of points) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n\n return [minX, minY, maxX, maxY];\n};\n\nconst getFreeDrawElementAbsoluteCoords = (\n element: ExcalidrawFreeDrawElement,\n): [number, number, number, number, number, number] => {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points);\n const x1 = minX + element.x;\n const y1 = minY + element.y;\n const x2 = maxX + element.x;\n const y2 = maxY + element.y;\n return [x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2];\n};\n\n/** @returns number in pixels */\nexport const getArrowheadSize = (arrowhead: Arrowhead): number => {\n switch (arrowhead) {\n case \"arrow\":\n return 25;\n case \"diamond\":\n case \"diamond_outline\":\n return 12;\n default:\n return 15;\n }\n};\n\n/** @returns number in degrees */\nexport const getArrowheadAngle = (arrowhead: Arrowhead): number => {\n switch (arrowhead) {\n case \"bar\":\n return 90;\n case \"arrow\":\n return 20;\n default:\n return 25;\n }\n};\n\nexport const getArrowheadPoints = (\n element: ExcalidrawLinearElement,\n shape: Drawable[],\n position: \"start\" | \"end\",\n arrowhead: Arrowhead,\n) => {\n const ops = getCurvePathOps(shape[0]);\n if (ops.length < 1) {\n return null;\n }\n\n // The index of the bCurve operation to examine.\n const index = position === \"start\" ? 1 : ops.length - 1;\n\n const data = ops[index].data;\n const p3 = [data[4], data[5]] as Point;\n const p2 = [data[2], data[3]] as Point;\n const p1 = [data[0], data[1]] as Point;\n\n // We need to find p0 of the bezier curve.\n // It is typically the last point of the previous\n // curve; it can also be the position of moveTo operation.\n const prevOp = ops[index - 1];\n let p0: Point = [0, 0];\n if (prevOp.op === \"move\") {\n p0 = prevOp.data as unknown as Point;\n } else if (prevOp.op === \"bcurveTo\") {\n p0 = [prevOp.data[4], prevOp.data[5]];\n }\n\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t: number, idx: number) =>\n Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n\n // Ee know the last point of the arrow (or the first, if start arrowhead).\n const [x2, y2] = position === \"start\" ? p0 : p3;\n\n // By using cubic bezier equation (B(t)) and the given parameters,\n // we calculate a point that is closer to the last point.\n // The value 0.3 is chosen arbitrarily and it works best for all\n // the tested cases.\n const [x1, y1] = [equation(0.3, 0), equation(0.3, 1)];\n\n // Find the normalized direction vector based on the\n // previously calculated points.\n const distance = Math.hypot(x2 - x1, y2 - y1);\n const nx = (x2 - x1) / distance;\n const ny = (y2 - y1) / distance;\n\n const size = getArrowheadSize(arrowhead);\n\n let length = 0;\n\n {\n // Length for -> arrows is based on the length of the last section\n const [cx, cy] =\n position === \"end\"\n ? element.points[element.points.length - 1]\n : element.points[0];\n const [px, py] =\n element.points.length > 1\n ? position === \"end\"\n ? element.points[element.points.length - 2]\n : element.points[1]\n : [0, 0];\n\n length = Math.hypot(cx - px, cy - py);\n }\n\n // Scale down the arrowhead until we hit a certain size so that it doesn't look weird.\n // This value is selected by minimizing a minimum size with the last segment of the arrowhead\n const lengthMultiplier =\n arrowhead === \"diamond\" || arrowhead === \"diamond_outline\" ? 0.25 : 0.5;\n const minSize = Math.min(size, length * lengthMultiplier);\n const xs = x2 - nx * minSize;\n const ys = y2 - ny * minSize;\n\n if (\n arrowhead === \"dot\" ||\n arrowhead === \"circle\" ||\n arrowhead === \"circle_outline\"\n ) {\n const diameter = Math.hypot(ys - y2, xs - x2) + element.strokeWidth - 2;\n return [x2, y2, diameter];\n }\n\n const angle = getArrowheadAngle(arrowhead);\n\n // Return points\n const [x3, y3] = rotate(xs, ys, x2, y2, (-angle * Math.PI) / 180);\n const [x4, y4] = rotate(xs, ys, x2, y2, (angle * Math.PI) / 180);\n\n if (arrowhead === \"diamond\" || arrowhead === \"diamond_outline\") {\n // point opposite to the arrowhead point\n let ox;\n let oy;\n\n if (position === \"start\") {\n const [px, py] = element.points.length > 1 ? element.points[1] : [0, 0];\n\n [ox, oy] = rotate(\n x2 + minSize * 2,\n y2,\n x2,\n y2,\n Math.atan2(py - y2, px - x2),\n );\n } else {\n const [px, py] =\n element.points.length > 1\n ? element.points[element.points.length - 2]\n : [0, 0];\n\n [ox, oy] = rotate(\n x2 - minSize * 2,\n y2,\n x2,\n y2,\n Math.atan2(y2 - py, x2 - px),\n );\n }\n\n return [x2, y2, x3, y3, ox, oy, x4, y4];\n }\n\n return [x2, y2, x3, y3, x4, y4];\n};\n\nconst generateLinearElementShape = (\n element: ExcalidrawLinearElement,\n): Drawable => {\n const generator = rough.generator();\n const options = generateRoughOptions(element);\n\n const method = (() => {\n if (element.roundness) {\n return \"curve\";\n }\n if (options.fill) {\n return \"polygon\";\n }\n return \"linearPath\";\n })();\n\n return generator[method](element.points as Mutable<Point>[], options);\n};\n\nconst getLinearElementRotatedBounds = (\n element: ExcalidrawLinearElement,\n cx: number,\n cy: number,\n elementsMap: ElementsMap,\n): Bounds => {\n const boundTextElement = getBoundTextElement(element, elementsMap);\n\n if (element.points.length < 2) {\n const [pointX, pointY] = element.points[0];\n const [x, y] = rotate(\n element.x + pointX,\n element.y + pointY,\n cx,\n cy,\n element.angle,\n );\n\n let coords: Bounds = [x, y, x, y];\n if (boundTextElement) {\n const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText(\n element,\n elementsMap,\n [x, y, x, y],\n boundTextElement,\n );\n coords = [\n coordsWithBoundText[0],\n coordsWithBoundText[1],\n coordsWithBoundText[2],\n coordsWithBoundText[3],\n ];\n }\n return coords;\n }\n\n // first element is always the curve\n const cachedShape = ShapeCache.get(element)?.[0];\n const shape = cachedShape ?? generateLinearElementShape(element);\n const ops = getCurvePathOps(shape);\n const transformXY = (x: number, y: number) =>\n rotate(element.x + x, element.y + y, cx, cy, element.angle);\n const res = getMinMaxXYFromCurvePathOps(ops, transformXY);\n let coords: Bounds = [res[0], res[1], res[2], res[3]];\n if (boundTextElement) {\n const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText(\n element,\n elementsMap,\n coords,\n boundTextElement,\n );\n coords = [\n coordsWithBoundText[0],\n coordsWithBoundText[1],\n coordsWithBoundText[2],\n coordsWithBoundText[3],\n ];\n }\n return coords;\n};\n\nexport const getElementBounds = (\n element: ExcalidrawElement,\n elementsMap: ElementsMap,\n): Bounds => {\n return ElementBounds.getBounds(element, elementsMap);\n};\n\nexport const getCommonBounds = (\n elements: readonly ExcalidrawElement[],\n): Bounds => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n\n const elementsMap = arrayToMap(elements);\n\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element, elementsMap);\n minX = Math.min(minX, x1);\n minY = Math.min(minY, y1);\n maxX = Math.max(maxX, x2);\n maxY = Math.max(maxY, y2);\n });\n\n return [minX, minY, maxX, maxY];\n};\n\nexport const getDraggedElementsBounds = (\n elements: ExcalidrawElement[],\n dragOffset: { x: number; y: number },\n) => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return [\n minX + dragOffset.x,\n minY + dragOffset.y,\n maxX + dragOffset.x,\n maxY + dragOffset.y,\n ];\n};\n\nexport const getResizedElementAbsoluteCoords = (\n element: ExcalidrawElement,\n nextWidth: number,\n nextHeight: number,\n normalizePoints: boolean,\n): Bounds => {\n if (!(isLinearElement(element) || isFreeDrawElement(element))) {\n return [\n element.x,\n element.y,\n element.x + nextWidth,\n element.y + nextHeight,\n ];\n }\n\n const points = rescalePoints(\n 0,\n nextWidth,\n rescalePoints(1, nextHeight, element.points, normalizePoints),\n normalizePoints,\n );\n\n let bounds: Bounds;\n\n if (isFreeDrawElement(element)) {\n // Free Draw\n bounds = getBoundsFromPoints(points);\n } else {\n // Line\n const gen = rough.generator();\n const curve = !element.roundness\n ? gen.linearPath(\n points as [number, number][],\n generateRoughOptions(element),\n )\n : gen.curve(points as [number, number][], generateRoughOptions(element));\n\n const ops = getCurvePathOps(curve);\n bounds = getMinMaxXYFromCurvePathOps(ops);\n }\n\n const [minX, minY, maxX, maxY] = bounds;\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\n\nexport const getElementPointsCoords = (\n element: ExcalidrawLinearElement,\n points: readonly (readonly [number, number])[],\n): Bounds => {\n // This might be computationally heavey\n const gen = rough.generator();\n const curve =\n element.roundness == null\n ? gen.linearPath(\n points as [number, number][],\n generateRoughOptions(element),\n )\n : gen.curve(points as [number, number][], generateRoughOptions(element));\n const ops = getCurvePathOps(curve);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\n\nexport const getClosestElementBounds = (\n elements: readonly ExcalidrawElement[],\n from: { x: number; y: number },\n): Bounds => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n\n let minDistance = Infinity;\n let closestElement = elements[0];\n const elementsMap = arrayToMap(elements);\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element, elementsMap);\n const distance = distance2d((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);\n\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element;\n }\n });\n\n return getElementBounds(closestElement, elementsMap);\n};\n\nexport interface BoundingBox {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n midX: number;\n midY: number;\n width: number;\n height: number;\n}\n\nexport const getCommonBoundingBox = (\n elements: ExcalidrawElement[] | readonly NonDeleted<ExcalidrawElement>[],\n): BoundingBox => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n midX: (minX + maxX) / 2,\n midY: (minY + maxY) / 2,\n };\n};\n\n/**\n * returns scene coords of user's editor viewport (visible canvas area) bounds\n */\nexport const getVisibleSceneBounds = ({\n scrollX,\n scrollY,\n width,\n height,\n zoom,\n}: AppState): SceneBounds => {\n return [\n -scrollX,\n -scrollY,\n -scrollX + width / zoom.value,\n -scrollY + height / zoom.value,\n ];\n};\n", "import { RoughCanvas } from './canvas';\nimport { RoughGenerator } from './generator';\nimport { RoughSVG } from './svg';\nexport default {\n canvas(canvas, config) {\n return new RoughCanvas(canvas, config);\n },\n svg(svg, config) {\n return new RoughSVG(svg, config);\n },\n generator(config) {\n return new RoughGenerator(config);\n },\n newSeed() {\n return RoughGenerator.newSeed();\n },\n};\n", "import { RoughGenerator } from './generator';\nexport class RoughCanvas {\n constructor(canvas, config) {\n this.canvas = canvas;\n this.ctx = this.canvas.getContext('2d');\n this.gen = new RoughGenerator(config);\n }\n draw(drawable) {\n const sets = drawable.sets || [];\n const o = drawable.options || this.getDefaultOptions();\n const ctx = this.ctx;\n const precision = drawable.options.fixedDecimalPlaceDigits;\n for (const drawing of sets) {\n switch (drawing.type) {\n case 'path':\n ctx.save();\n ctx.strokeStyle = o.stroke === 'none' ? 'transparent' : o.stroke;\n ctx.lineWidth = o.strokeWidth;\n if (o.strokeLineDash) {\n ctx.setLineDash(o.strokeLineDash);\n }\n if (o.strokeLineDashOffset) {\n ctx.lineDashOffset = o.strokeLineDashOffset;\n }\n this._drawToContext(ctx, drawing, precision);\n ctx.restore();\n break;\n case 'fillPath': {\n ctx.save();\n ctx.fillStyle = o.fill || '';\n const fillRule = (drawable.shape === 'curve' || drawable.shape === 'polygon' || drawable.shape === 'path') ? 'evenodd' : 'nonzero';\n this._drawToContext(ctx, drawing, precision, fillRule);\n ctx.restore();\n break;\n }\n case 'fillSketch':\n this.fillSketch(ctx, drawing, o);\n break;\n }\n }\n }\n fillSketch(ctx, drawing, o) {\n let fweight = o.fillWeight;\n if (fweight < 0) {\n fweight = o.strokeWidth / 2;\n }\n ctx.save();\n if (o.fillLineDash) {\n ctx.setLineDash(o.fillLineDash);\n }\n if (o.fillLineDashOffset) {\n ctx.lineDashOffset = o.fillLineDashOffset;\n }\n ctx.strokeStyle = o.fill || '';\n ctx.lineWidth = fweight;\n this._drawToContext(ctx, drawing, o.fixedDecimalPlaceDigits);\n ctx.restore();\n }\n _drawToContext(ctx, drawing, fixedDecimals, rule = 'nonzero') {\n ctx.beginPath();\n for (const item of drawing.ops) {\n const data = ((typeof fixedDecimals === 'number') && fixedDecimals >= 0) ? (item.data.map((d) => +d.toFixed(fixedDecimals))) : item.data;\n switch (item.op) {\n case 'move':\n ctx.moveTo(data[0], data[1]);\n break;\n case 'bcurveTo':\n ctx.bezierCurveTo(data[0], data[1], data[2], data[3], data[4], data[5]);\n break;\n case 'lineTo':\n ctx.lineTo(data[0], data[1]);\n break;\n }\n }\n if (drawing.type === 'fillPath') {\n ctx.fill(rule);\n }\n else {\n ctx.stroke();\n }\n }\n get generator() {\n return this.gen;\n }\n getDefaultOptions() {\n return this.gen.defaultOptions;\n }\n line(x1, y1, x2, y2, options) {\n const d = this.gen.line(x1, y1, x2, y2, options);\n this.draw(d);\n return d;\n }\n rectangle(x, y, width, height, options) {\n const d = this.gen.rectangle(x, y, width, height, options);\n this.draw(d);\n return d;\n }\n ellipse(x, y, width, height, options) {\n const d = this.gen.ellipse(x, y, width, height, options);\n this.draw(d);\n return d;\n }\n circle(x, y, diameter, options) {\n const d = this.gen.circle(x, y, diameter, options);\n this.draw(d);\n return d;\n }\n linearPath(points, options) {\n const d = this.gen.linearPath(points, options);\n this.draw(d);\n return d;\n }\n polygon(points, options) {\n const d = this.gen.polygon(points, options);\n this.draw(d);\n return d;\n }\n arc(x, y, width, height, start, stop, closed = false, options) {\n const d = this.gen.arc(x, y, width, height, start, stop, closed, options);\n this.draw(d);\n return d;\n }\n curve(points, options) {\n const d = this.gen.curve(points, options);\n this.draw(d);\n return d;\n }\n path(d, options) {\n const drawing = this.gen.path(d, options);\n this.draw(drawing);\n return drawing;\n }\n}\n", "import { line, solidFillPolygon, patternFillPolygons, rectangle, ellipseWithParams, generateEllipseParams, linearPath, arc, patternFillArc, curve, svgPath } from './renderer.js';\nimport { randomSeed } from './math.js';\nimport { curveToBezier } from 'points-on-curve/lib/curve-to-bezier.js';\nimport { pointsOnBezierCurves } from 'points-on-curve';\nimport { pointsOnPath } from 'points-on-path';\nconst NOS = 'none';\nexport class RoughGenerator {\n constructor(config) {\n this.defaultOptions = {\n maxRandomnessOffset: 2,\n roughness: 1,\n bowing: 1,\n stroke: '#000',\n strokeWidth: 1,\n curveTightness: 0,\n curveFitting: 0.95,\n curveStepCount: 9,\n fillStyle: 'hachure',\n fillWeight: -1,\n hachureAngle: -41,\n hachureGap: -1,\n dashOffset: -1,\n dashGap: -1,\n zigzagOffset: -1,\n seed: 0,\n disableMultiStroke: false,\n disableMultiStrokeFill: false,\n preserveVertices: false,\n fillShapeRoughnessGain: 0.8,\n };\n this.config = config || {};\n if (this.config.options) {\n this.defaultOptions = this._o(this.config.options);\n }\n }\n static newSeed() {\n return randomSeed();\n }\n _o(options) {\n return options ? Object.assign({}, this.defaultOptions, options) : this.defaultOptions;\n }\n _d(shape, sets, options) {\n return { shape, sets: sets || [], options: options || this.defaultOptions };\n }\n line(x1, y1, x2, y2, options) {\n const o = this._o(options);\n return this._d('line', [line(x1, y1, x2, y2, o)], o);\n }\n rectangle(x, y, width, height, options) {\n const o = this._o(options);\n const paths = [];\n const outline = rectangle(x, y, width, height, o);\n if (o.fill) {\n const points = [[x, y], [x + width, y], [x + width, y + height], [x, y + height]];\n if (o.fillStyle === 'solid') {\n paths.push(solidFillPolygon([points], o));\n }\n else {\n paths.push(patternFillPolygons([points], o));\n }\n }\n if (o.stroke !== NOS) {\n paths.push(outline);\n }\n return this._d('rectangle', paths, o);\n }\n ellipse(x, y, width, height, options) {\n const o = this._o(options);\n const paths = [];\n const ellipseParams = generateEllipseParams(width, height, o);\n const ellipseResponse = ellipseWithParams(x, y, o, ellipseParams);\n if (o.fill) {\n if (o.fillStyle === 'solid') {\n const shape = ellipseWithParams(x, y, o, ellipseParams).opset;\n shape.type = 'fillPath';\n paths.push(shape);\n }\n else {\n paths.push(patternFillPolygons([ellipseResponse.estimatedPoints], o));\n }\n }\n if (o.stroke !== NOS) {\n paths.push(ellipseResponse.opset);\n }\n return this._d('ellipse', paths, o);\n }\n circle(x, y, diameter, options) {\n const ret = this.ellipse(x, y, diameter, diameter, options);\n ret.shape = 'circle';\n return ret;\n }\n linearPath(points, options) {\n const o = this._o(options);\n return this._d('linearPath', [linearPath(points, false, o)], o);\n }\n arc(x, y, width, height, start, stop, closed = false, options) {\n const o = this._o(options);\n const paths = [];\n const outline = arc(x, y, width, height, start, stop, closed, true, o);\n if (closed && o.fill) {\n if (o.fillStyle === 'solid') {\n const fillOptions = Object.assign({}, o);\n fillOptions.disableMultiStroke = true;\n const shape = arc(x, y, width, height, start, stop, true, false, fillOptions);\n shape.type = 'fillPath';\n paths.push(shape);\n }\n else {\n paths.push(patternFillArc(x, y, width, height, start, stop, o));\n }\n }\n if (o.stroke !== NOS) {\n paths.push(outline);\n }\n return this._d('arc', paths, o);\n }\n curve(points, options) {\n const o = this._o(options);\n const paths = [];\n const outline = curve(points, o);\n if (o.fill && o.fill !== NOS && points.length >= 3) {\n if (o.fillStyle === 'solid') {\n const fillShape = curve(points, Object.assign(Object.assign({}, o), { disableMultiStroke: true, roughness: o.roughness ? (o.roughness + o.fillShapeRoughnessGain) : 0 }));\n paths.push({\n type: 'fillPath',\n ops: this._mergedShape(fillShape.ops),\n });\n }\n else {\n const bcurve = curveToBezier(points);\n const polyPoints = pointsOnBezierCurves(bcurve, 10, (1 + o.roughness) / 2);\n paths.push(patternFillPolygons([polyPoints], o));\n }\n }\n if (o.stroke !== NOS) {\n paths.push(outline);\n }\n return this._d('curve', paths, o);\n }\n polygon(points, options) {\n const o = this._o(options);\n const paths = [];\n const outline = linearPath(points, true, o);\n if (o.fill) {\n if (o.fillStyle === 'solid') {\n paths.push(solidFillPolygon([points], o));\n }\n else {\n paths.push(patternFillPolygons([points], o));\n }\n }\n if (o.stroke !== NOS) {\n paths.push(outline);\n }\n return this._d('polygon', paths, o);\n }\n path(d, options) {\n const o = this._o(options);\n const paths = [];\n if (!d) {\n return this._d('path', paths, o);\n }\n d = (d || '').replace(/\\n/g, ' ').replace(/(-\\s)/g, '-').replace('/(\\s\\s)/g', ' ');\n const hasFill = o.fill && o.fill !== 'transparent' && o.fill !== NOS;\n const hasStroke = o.stroke !== NOS;\n const simplified = !!(o.simplification && (o.simplification < 1));\n const distance = simplified ? (4 - 4 * (o.simplification || 1)) : ((1 + o.roughness) / 2);\n const sets = pointsOnPath(d, 1, distance);\n const shape = svgPath(d, o);\n if (hasFill) {\n if (o.fillStyle === 'solid') {\n if (sets.length === 1) {\n const fillShape = svgPath(d, Object.assign(Object.assign({}, o), { disableMultiStroke: true, roughness: o.roughness ? (o.roughness + o.fillShapeRoughnessGain) : 0 }));\n paths.push({\n type: 'fillPath',\n ops: this._mergedShape(fillShape.ops),\n });\n }\n else {\n paths.push(solidFillPolygon(sets, o));\n }\n }\n else {\n paths.push(patternFillPolygons(sets, o));\n }\n }\n if (hasStroke) {\n if (simplified) {\n sets.forEach((set) => {\n paths.push(linearPath(set, false, o));\n });\n }\n else {\n paths.push(shape);\n }\n }\n return this._d('path', paths, o);\n }\n opsToPath(drawing, fixedDecimals) {\n let path = '';\n for (const item of drawing.ops) {\n const data = ((typeof fixedDecimals === 'number') && fixedDecimals >= 0) ? (item.data.map((d) => +d.toFixed(fixedDecimals))) : item.data;\n switch (item.op) {\n case 'move':\n path += `M${data[0]} ${data[1]} `;\n break;\n case 'bcurveTo':\n path += `C${data[0]} ${data[1]}, ${data[2]} ${data[3]}, ${data[4]} ${data[5]} `;\n break;\n case 'lineTo':\n path += `L${data[0]} ${data[1]} `;\n break;\n }\n }\n return path.trim();\n }\n toPaths(drawable) {\n const sets = drawable.sets || [];\n const o = drawable.options || this.defaultOptions;\n const paths = [];\n for (const drawing of sets) {\n let path = null;\n switch (drawing.type) {\n case 'path':\n path = {\n d: this.opsToPath(drawing),\n stroke: o.stroke,\n strokeWidth: o.strokeWidth,\n fill: NOS,\n };\n break;\n case 'fillPath':\n path = {\n d: this.opsToPath(drawing),\n stroke: NOS,\n strokeWidth: 0,\n fill: o.fill || NOS,\n };\n break;\n case 'fillSketch':\n path = this.fillSketch(drawing, o);\n break;\n }\n if (path) {\n paths.push(path);\n }\n }\n return paths;\n }\n fillSketch(drawing, o) {\n let fweight = o.fillWeight;\n if (fweight < 0) {\n fweight = o.strokeWidth / 2;\n }\n return {\n d: this.opsToPath(drawing),\n stroke: o.fill || NOS,\n strokeWidth: fweight,\n fill: NOS,\n };\n }\n _mergedShape(input) {\n return input.filter((d, i) => {\n if (i === 0) {\n return true;\n }\n if (d.op === 'move') {\n return false;\n }\n return true;\n });\n }\n}\n", "import { getFiller } from './fillers/filler.js';\nimport { Random } from './math.js';\nimport { parsePath, normalize, absolutize } from 'path-data-parser';\nconst helper = {\n randOffset,\n randOffsetWithRange,\n ellipse,\n doubleLineOps: doubleLineFillOps,\n};\nexport function line(x1, y1, x2, y2, o) {\n return { type: 'path', ops: _doubleLine(x1, y1, x2, y2, o) };\n}\nexport function linearPath(points, close, o) {\n const len = (points || []).length;\n if (len > 2) {\n const ops = [];\n for (let i = 0; i < (len - 1); i++) {\n ops.push(..._doubleLine(points[i][0], points[i][1], points[i + 1][0], points[i + 1][1], o));\n }\n if (close) {\n ops.push(..._doubleLine(points[len - 1][0], points[len - 1][1], points[0][0], points[0][1], o));\n }\n return { type: 'path', ops };\n }\n else if (len === 2) {\n return line(points[0][0], points[0][1], points[1][0], points[1][1], o);\n }\n return { type: 'path', ops: [] };\n}\nexport function polygon(points, o) {\n return linearPath(points, true, o);\n}\nexport function rectangle(x, y, width, height, o) {\n const points = [\n [x, y],\n [x + width, y],\n [x + width, y + height],\n [x, y + height],\n ];\n return polygon(points, o);\n}\nexport function curve(points, o) {\n let o1 = _curveWithOffset(points, 1 * (1 + o.roughness * 0.2), o);\n if (!o.disableMultiStroke) {\n const o2 = _curveWithOffset(points, 1.5 * (1 + o.roughness * 0.22), cloneOptionsAlterSeed(o));\n o1 = o1.concat(o2);\n }\n return { type: 'path', ops: o1 };\n}\nexport function ellipse(x, y, width, height, o) {\n const params = generateEllipseParams(width, height, o);\n return ellipseWithParams(x, y, o, params).opset;\n}\nexport function generateEllipseParams(width, height, o) {\n const psq = Math.sqrt(Math.PI * 2 * Math.sqrt((Math.pow(width / 2, 2) + Math.pow(height / 2, 2)) / 2));\n const stepCount = Math.ceil(Math.max(o.curveStepCount, (o.curveStepCount / Math.sqrt(200)) * psq));\n const increment = (Math.PI * 2) / stepCount;\n let rx = Math.abs(width / 2);\n let ry = Math.abs(height / 2);\n const curveFitRandomness = 1 - o.curveFitting;\n rx += _offsetOpt(rx * curveFitRandomness, o);\n ry += _offsetOpt(ry * curveFitRandomness, o);\n return { increment, rx, ry };\n}\nexport function ellipseWithParams(x, y, o, ellipseParams) {\n const [ap1, cp1] = _computeEllipsePoints(ellipseParams.increment, x, y, ellipseParams.rx, ellipseParams.ry, 1, ellipseParams.increment * _offset(0.1, _offset(0.4, 1, o), o), o);\n let o1 = _curve(ap1, null, o);\n if ((!o.disableMultiStroke) && (o.roughness !== 0)) {\n const [ap2] = _computeEllipsePoints(ellipseParams.increment, x, y, ellipseParams.rx, ellipseParams.ry, 1.5, 0, o);\n const o2 = _curve(ap2, null, o);\n o1 = o1.concat(o2);\n }\n return {\n estimatedPoints: cp1,\n opset: { type: 'path', ops: o1 },\n };\n}\nexport function arc(x, y, width, height, start, stop, closed, roughClosure, o) {\n const cx = x;\n const cy = y;\n let rx = Math.abs(width / 2);\n let ry = Math.abs(height / 2);\n rx += _offsetOpt(rx * 0.01, o);\n ry += _offsetOpt(ry * 0.01, o);\n let strt = start;\n let stp = stop;\n while (strt < 0) {\n strt += Math.PI * 2;\n stp += Math.PI * 2;\n }\n if ((stp - strt) > (Math.PI * 2)) {\n strt = 0;\n stp = Math.PI * 2;\n }\n const ellipseInc = (Math.PI * 2) / o.curveStepCount;\n const arcInc = Math.min(ellipseInc / 2, (stp - strt) / 2);\n const ops = _arc(arcInc, cx, cy, rx, ry, strt, stp, 1, o);\n if (!o.disableMultiStroke) {\n const o2 = _arc(arcInc, cx, cy, rx, ry, strt, stp, 1.5, o);\n ops.push(...o2);\n }\n if (closed) {\n if (roughClosure) {\n ops.push(..._doubleLine(cx, cy, cx + rx * Math.cos(strt), cy + ry * Math.sin(strt), o), ..._doubleLine(cx, cy, cx + rx * Math.cos(stp), cy + ry * Math.sin(stp), o));\n }\n else {\n ops.push({ op: 'lineTo', data: [cx, cy] }, { op: 'lineTo', data: [cx + rx * Math.cos(strt), cy + ry * Math.sin(strt)] });\n }\n }\n return { type: 'path', ops };\n}\nexport function svgPath(path, o) {\n const segments = normalize(absolutize(parsePath(path)));\n const ops = [];\n let first = [0, 0];\n let current = [0, 0];\n for (const { key, data } of segments) {\n switch (key) {\n case 'M': {\n current = [data[0], data[1]];\n first = [data[0], data[1]];\n break;\n }\n case 'L':\n ops.push(..._doubleLine(current[0], current[1], data[0], data[1], o));\n current = [data[0], data[1]];\n break;\n case 'C': {\n const [x1, y1, x2, y2, x, y] = data;\n ops.push(..._bezierTo(x1, y1, x2, y2, x, y, current, o));\n current = [x, y];\n break;\n }\n case 'Z':\n ops.push(..._doubleLine(current[0], current[1], first[0], first[1], o));\n current = [first[0], first[1]];\n break;\n }\n }\n return { type: 'path', ops };\n}\n// Fills\nexport function solidFillPolygon(polygonList, o) {\n const ops = [];\n for (const points of polygonList) {\n if (points.length) {\n const offset = o.maxRandomnessOffset || 0;\n const len = points.length;\n if (len > 2) {\n ops.push({ op: 'move', data: [points[0][0] + _offsetOpt(offset, o), points[0][1] + _offsetOpt(offset, o)] });\n for (let i = 1; i < len; i++) {\n ops.push({ op: 'lineTo', data: [points[i][0] + _offsetOpt(offset, o), points[i][1] + _offsetOpt(offset, o)] });\n }\n }\n }\n }\n return { type: 'fillPath', ops };\n}\nexport function patternFillPolygons(polygonList, o) {\n return getFiller(o, helper).fillPolygons(polygonList, o);\n}\nexport function patternFillArc(x, y, width, height, start, stop, o) {\n const cx = x;\n const cy = y;\n let rx = Math.abs(width / 2);\n let ry = Math.abs(height / 2);\n rx += _offsetOpt(rx * 0.01, o);\n ry += _offsetOpt(ry * 0.01, o);\n let strt = start;\n let stp = stop;\n while (strt < 0) {\n strt += Math.PI * 2;\n stp += Math.PI * 2;\n }\n if ((stp - strt) > (Math.PI * 2)) {\n strt = 0;\n stp = Math.PI * 2;\n }\n const increment = (stp - strt) / o.curveStepCount;\n const points = [];\n for (let angle = strt; angle <= stp; angle = angle + increment) {\n points.push([cx + rx * Math.cos(angle), cy + ry * Math.sin(angle)]);\n }\n points.push([cx + rx * Math.cos(stp), cy + ry * Math.sin(stp)]);\n points.push([cx, cy]);\n return patternFillPolygons([points], o);\n}\nexport function randOffset(x, o) {\n return _offsetOpt(x, o);\n}\nexport function randOffsetWithRange(min, max, o) {\n return _offset(min, max, o);\n}\nexport function doubleLineFillOps(x1, y1, x2, y2, o) {\n return _doubleLine(x1, y1, x2, y2, o, true);\n}\n// Private helpers\nfunction cloneOptionsAlterSeed(ops) {\n const result = Object.assign({}, ops);\n result.randomizer = undefined;\n if (ops.seed) {\n result.seed = ops.seed + 1;\n }\n return result;\n}\nfunction random(ops) {\n if (!ops.randomizer) {\n ops.randomizer = new Random(ops.seed || 0);\n }\n return ops.randomizer.next();\n}\nfunction _offset(min, max, ops, roughnessGain = 1) {\n return ops.roughness * roughnessGain * ((random(ops) * (max - min)) + min);\n}\nfunction _offsetOpt(x, ops, roughnessGain = 1) {\n return _offset(-x, x, ops, roughnessGain);\n}\nfunction _doubleLine(x1, y1, x2, y2, o, filling = false) {\n const singleStroke = filling ? o.disableMultiStrokeFill : o.disableMultiStroke;\n const o1 = _line(x1, y1, x2, y2, o, true, false);\n if (singleStroke) {\n return o1;\n }\n const o2 = _line(x1, y1, x2, y2, o, true, true);\n return o1.concat(o2);\n}\nfunction _line(x1, y1, x2, y2, o, move, overlay) {\n const lengthSq = Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2);\n const length = Math.sqrt(lengthSq);\n let roughnessGain = 1;\n if (length < 200) {\n roughnessGain = 1;\n }\n else if (length > 500) {\n roughnessGain = 0.4;\n }\n else {\n roughnessGain = (-0.0016668) * length + 1.233334;\n }\n let offset = o.maxRandomnessOffset || 0;\n if ((offset * offset * 100) > lengthSq) {\n offset = length / 10;\n }\n const halfOffset = offset / 2;\n const divergePoint = 0.2 + random(o) * 0.2;\n let midDispX = o.bowing * o.maxRandomnessOffset * (y2 - y1) / 200;\n let midDispY = o.bowing * o.maxRandomnessOffset * (x1 - x2) / 200;\n midDispX = _offsetOpt(midDispX, o, roughnessGain);\n midDispY = _offsetOpt(midDispY, o, roughnessGain);\n const ops = [];\n const randomHalf = () => _offsetOpt(halfOffset, o, roughnessGain);\n const randomFull = () => _offsetOpt(offset, o, roughnessGain);\n const preserveVertices = o.preserveVertices;\n if (move) {\n if (overlay) {\n ops.push({\n op: 'move', data: [\n x1 + (preserveVertices ? 0 : randomHalf()),\n y1 + (preserveVertices ? 0 : randomHalf()),\n ],\n });\n }\n else {\n ops.push({\n op: 'move', data: [\n x1 + (preserveVertices ? 0 : _offsetOpt(offset, o, roughnessGain)),\n y1 + (preserveVertices ? 0 : _offsetOpt(offset, o, roughnessGain)),\n ],\n });\n }\n }\n if (overlay) {\n ops.push({\n op: 'bcurveTo',\n data: [\n midDispX + x1 + (x2 - x1) * divergePoint + randomHalf(),\n midDispY + y1 + (y2 - y1) * divergePoint + randomHalf(),\n midDispX + x1 + 2 * (x2 - x1) * divergePoint + randomHalf(),\n midDispY + y1 + 2 * (y2 - y1) * divergePoint + randomHalf(),\n x2 + (preserveVertices ? 0 : randomHalf()),\n y2 + (preserveVertices ? 0 : randomHalf()),\n ],\n });\n }\n else {\n ops.push({\n op: 'bcurveTo',\n data: [\n midDispX + x1 + (x2 - x1) * divergePoint + randomFull(),\n midDispY + y1 + (y2 - y1) * divergePoint + randomFull(),\n midDispX + x1 + 2 * (x2 - x1) * divergePoint + randomFull(),\n midDispY + y1 + 2 * (y2 - y1) * divergePoint + randomFull(),\n x2 + (preserveVertices ? 0 : randomFull()),\n y2 + (preserveVertices ? 0 : randomFull()),\n ],\n });\n }\n return ops;\n}\nfunction _curveWithOffset(points, offset, o) {\n const ps = [];\n ps.push([\n points[0][0] + _offsetOpt(offset, o),\n points[0][1] + _offsetOpt(offset, o),\n ]);\n ps.push([\n points[0][0] + _offsetOpt(offset, o),\n points[0][1] + _offsetOpt(offset, o),\n ]);\n for (let i = 1; i < points.length; i++) {\n ps.push([\n points[i][0] + _offsetOpt(offset, o),\n points[i][1] + _offsetOpt(offset, o),\n ]);\n if (i === (points.length - 1)) {\n ps.push([\n points[i][0] + _offsetOpt(offset, o),\n points[i][1] + _offsetOpt(offset, o),\n ]);\n }\n }\n return _curve(ps, null, o);\n}\nfunction _curve(points, closePoint, o) {\n const len = points.length;\n const ops = [];\n if (len > 3) {\n const b = [];\n const s = 1 - o.curveTightness;\n ops.push({ op: 'move', data: [points[1][0], points[1][1]] });\n for (let i = 1; (i + 2) < len; i++) {\n const cachedVertArray = points[i];\n b[0] = [cachedVertArray[0], cachedVertArray[1]];\n b[1] = [cachedVertArray[0] + (s * points[i + 1][0] - s * points[i - 1][0]) / 6, cachedVertArray[1] + (s * points[i + 1][1] - s * points[i - 1][1]) / 6];\n b[2] = [points[i + 1][0] + (s * points[i][0] - s * points[i + 2][0]) / 6, points[i + 1][1] + (s * points[i][1] - s * points[i + 2][1]) / 6];\n b[3] = [points[i + 1][0], points[i + 1][1]];\n ops.push({ op: 'bcurveTo', data: [b[1][0], b[1][1], b[2][0], b[2][1], b[3][0], b[3][1]] });\n }\n if (closePoint && closePoint.length === 2) {\n const ro = o.maxRandomnessOffset;\n ops.push({ op: 'lineTo', data: [closePoint[0] + _offsetOpt(ro, o), closePoint[1] + _offsetOpt(ro, o)] });\n }\n }\n else if (len === 3) {\n ops.push({ op: 'move', data: [points[1][0], points[1][1]] });\n ops.push({\n op: 'bcurveTo',\n data: [\n points[1][0], points[1][1],\n points[2][0], points[2][1],\n points[2][0], points[2][1],\n ],\n });\n }\n else if (len === 2) {\n ops.push(..._doubleLine(points[0][0], points[0][1], points[1][0], points[1][1], o));\n }\n return ops;\n}\nfunction _computeEllipsePoints(increment, cx, cy, rx, ry, offset, overlap, o) {\n const coreOnly = o.roughness === 0;\n const corePoints = [];\n const allPoints = [];\n if (coreOnly) {\n increment = increment / 4;\n allPoints.push([\n cx + rx * Math.cos(-increment),\n cy + ry * Math.sin(-increment),\n ]);\n for (let angle = 0; angle <= Math.PI * 2; angle = angle + increment) {\n const p = [\n cx + rx * Math.cos(angle),\n cy + ry * Math.sin(angle),\n ];\n corePoints.push(p);\n allPoints.push(p);\n }\n allPoints.push([\n cx + rx * Math.cos(0),\n cy + ry * Math.sin(0),\n ]);\n allPoints.push([\n cx + rx * Math.cos(increment),\n cy + ry * Math.sin(increment),\n ]);\n }\n else {\n const radOffset = _offsetOpt(0.5, o) - (Math.PI / 2);\n allPoints.push([\n _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset - increment),\n _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset - increment),\n ]);\n const endAngle = Math.PI * 2 + radOffset - 0.01;\n for (let angle = radOffset; angle < endAngle; angle = angle + increment) {\n const p = [\n _offsetOpt(offset, o) + cx + rx * Math.cos(angle),\n _offsetOpt(offset, o) + cy + ry * Math.sin(angle),\n ];\n corePoints.push(p);\n allPoints.push(p);\n }\n allPoints.push([\n _offsetOpt(offset, o) + cx + rx * Math.cos(radOffset + Math.PI * 2 + overlap * 0.5),\n _offsetOpt(offset, o) + cy + ry * Math.sin(radOffset + Math.PI * 2 + overlap * 0.5),\n ]);\n allPoints.push([\n _offsetOpt(offset, o) + cx + 0.98 * rx * Math.cos(radOffset + overlap),\n _offsetOpt(offset, o) + cy + 0.98 * ry * Math.sin(radOffset + overlap),\n ]);\n allPoints.push([\n _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset + overlap * 0.5),\n _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset + overlap * 0.5),\n ]);\n }\n return [allPoints, corePoints];\n}\nfunction _arc(increment, cx, cy, rx, ry, strt, stp, offset, o) {\n const radOffset = strt + _offsetOpt(0.1, o);\n const points = [];\n points.push([\n _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset - increment),\n _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset - increment),\n ]);\n for (let angle = radOffset; angle <= stp; angle = angle + increment) {\n points.push([\n _offsetOpt(offset, o) + cx + rx * Math.cos(angle),\n _offsetOpt(offset, o) + cy + ry * Math.sin(angle),\n ]);\n }\n points.push([\n cx + rx * Math.cos(stp),\n cy + ry * Math.sin(stp),\n ]);\n points.push([\n cx + rx * Math.cos(stp),\n cy + ry * Math.sin(stp),\n ]);\n return _curve(points, null, o);\n}\nfunction _bezierTo(x1, y1, x2, y2, x, y, current, o) {\n const ops = [];\n const ros = [o.maxRandomnessOffset || 1, (o.maxRandomnessOffset || 1) + 0.3];\n let f = [0, 0];\n const iterations = o.disableMultiStroke ? 1 : 2;\n const preserveVertices = o.preserveVertices;\n for (let i = 0; i < iterations; i++) {\n if (i === 0) {\n ops.push({ op: 'move', data: [current[0], current[1]] });\n }\n else {\n ops.push({ op: 'move', data: [current[0] + (preserveVertices ? 0 : _offsetOpt(ros[0], o)), current[1] + (preserveVertices ? 0 : _offsetOpt(ros[0], o))] });\n }\n f = preserveVertices ? [x, y] : [x + _offsetOpt(ros[i], o), y + _offsetOpt(ros[i], o)];\n ops.push({\n op: 'bcurveTo',\n data: [\n x1 + _offsetOpt(ros[i], o), y1 + _offsetOpt(ros[i], o),\n x2 + _offsetOpt(ros[i], o), y2 + _offsetOpt(ros[i], o),\n f[0], f[1],\n ],\n });\n }\n return ops;\n}\n", "import { HachureFiller } from './hachure-filler';\nimport { ZigZagFiller } from './zigzag-filler';\nimport { HatchFiller } from './hatch-filler';\nimport { DotFiller } from './dot-filler';\nimport { DashedFiller } from './dashed-filler';\nimport { ZigZagLineFiller } from './zigzag-line-filler';\nconst fillers = {};\nexport function getFiller(o, helper) {\n let fillerName = o.fillStyle || 'hachure';\n if (!fillers[fillerName]) {\n switch (fillerName) {\n case 'zigzag':\n if (!fillers[fillerName]) {\n fillers[fillerName] = new ZigZagFiller(helper);\n }\n break;\n case 'cross-hatch':\n if (!fillers[fillerName]) {\n fillers[fillerName] = new HatchFiller(helper);\n }\n break;\n case 'dots':\n if (!fillers[fillerName]) {\n fillers[fillerName] = new DotFiller(helper);\n }\n break;\n case 'dashed':\n if (!fillers[fillerName]) {\n fillers[fillerName] = new DashedFiller(helper);\n }\n break;\n case 'zigzag-line':\n if (!fillers[fillerName]) {\n fillers[fillerName] = new ZigZagLineFiller(helper);\n }\n break;\n case 'hachure':\n default:\n fillerName = 'hachure';\n if (!fillers[fillerName]) {\n fillers[fillerName] = new HachureFiller(helper);\n }\n break;\n }\n }\n return fillers[fillerName];\n}\n", "import { polygonHachureLines } from './scan-line-hachure';\nexport class HachureFiller {\n constructor(helper) {\n this.helper = helper;\n }\n fillPolygons(polygonList, o) {\n return this._fillPolygons(polygonList, o);\n }\n _fillPolygons(polygonList, o) {\n const lines = polygonHachureLines(polygonList, o);\n const ops = this.renderLines(lines, o);\n return { type: 'fillSketch', ops };\n }\n renderLines(lines, o) {\n const ops = [];\n for (const line of lines) {\n ops.push(...this.helper.doubleLineOps(line[0][0], line[0][1], line[1][0], line[1][1], o));\n }\n return ops;\n }\n}\n", "import { hachureLines } from 'hachure-fill';\nexport function polygonHachureLines(polygonList, o) {\n var _a;\n const angle = o.hachureAngle + 90;\n let gap = o.hachureGap;\n if (gap < 0) {\n gap = o.strokeWidth * 4;\n }\n gap = Math.max(gap, 0.1);\n let skipOffset = 1;\n if (o.roughness >= 1) {\n if ((((_a = o.randomizer) === null || _a === void 0 ? void 0 : _a.next()) || Math.random()) > 0.7) {\n skipOffset = gap;\n }\n }\n return hachureLines(polygonList, gap, angle, skipOffset || 1);\n}\n", "function rotatePoints(points, center, degrees) {\n if (points && points.length) {\n const [cx, cy] = center;\n const angle = (Math.PI / 180) * degrees;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n for (const p of points) {\n const [x, y] = p;\n p[0] = ((x - cx) * cos) - ((y - cy) * sin) + cx;\n p[1] = ((x - cx) * sin) + ((y - cy) * cos) + cy;\n }\n }\n}\nfunction rotateLines(lines, center, degrees) {\n const points = [];\n lines.forEach((line) => points.push(...line));\n rotatePoints(points, center, degrees);\n}\nfunction areSamePoints(p1, p2) {\n return p1[0] === p2[0] && p1[1] === p2[1];\n}\nexport function hachureLines(polygons, hachureGap, hachureAngle, hachureStepOffset = 1) {\n const angle = hachureAngle;\n const gap = Math.max(hachureGap, 0.1);\n const polygonList = (polygons[0] && polygons[0][0] && (typeof polygons[0][0] === 'number')) ? [polygons] : polygons;\n const rotationCenter = [0, 0];\n if (angle) {\n for (const polygon of polygonList) {\n rotatePoints(polygon, rotationCenter, angle);\n }\n }\n const lines = straightHachureLines(polygonList, gap, hachureStepOffset);\n if (angle) {\n for (const polygon of polygonList) {\n rotatePoints(polygon, rotationCenter, -angle);\n }\n rotateLines(lines, rotationCenter, -angle);\n }\n return lines;\n}\nfunction straightHachureLines(polygons, gap, hachureStepOffset) {\n const vertexArray = [];\n for (const polygon of polygons) {\n const vertices = [...polygon];\n if (!areSamePoints(vertices[0], vertices[vertices.length - 1])) {\n vertices.push([vertices[0][0], vertices[0][1]]);\n }\n if (vertices.length > 2) {\n vertexArray.push(vertices);\n }\n }\n const lines = [];\n gap = Math.max(gap, 0.1);\n // Create sorted edges table\n const edges = [];\n for (const vertices of vertexArray) {\n for (let i = 0; i < vertices.length - 1; i++) {\n const p1 = vertices[i];\n const p2 = vertices[i + 1];\n if (p1[1] !== p2[1]) {\n const ymin = Math.min(p1[1], p2[1]);\n edges.push({\n ymin,\n ymax: Math.max(p1[1], p2[1]),\n x: ymin === p1[1] ? p1[0] : p2[0],\n islope: (p2[0] - p1[0]) / (p2[1] - p1[1]),\n });\n }\n }\n }\n edges.sort((e1, e2) => {\n if (e1.ymin < e2.ymin) {\n return -1;\n }\n if (e1.ymin > e2.ymin) {\n return 1;\n }\n if (e1.x < e2.x) {\n return -1;\n }\n if (e1.x > e2.x) {\n return 1;\n }\n if (e1.ymax === e2.ymax) {\n return 0;\n }\n return (e1.ymax - e2.ymax) / Math.abs((e1.ymax - e2.ymax));\n });\n if (!edges.length) {\n return lines;\n }\n // Start scanning\n let activeEdges = [];\n let y = edges[0].ymin;\n let iteration = 0;\n while (activeEdges.length || edges.length) {\n if (edges.length) {\n let ix = -1;\n for (let i = 0; i < edges.length; i++) {\n if (edges[i].ymin > y) {\n break;\n }\n ix = i;\n }\n const removed = edges.splice(0, ix + 1);\n removed.forEach((edge) => {\n activeEdges.push({ s: y, edge });\n });\n }\n activeEdges = activeEdges.filter((ae) => {\n if (ae.edge.ymax <= y) {\n return false;\n }\n return true;\n });\n activeEdges.sort((ae1, ae2) => {\n if (ae1.edge.x === ae2.edge.x) {\n return 0;\n }\n return (ae1.edge.x - ae2.edge.x) / Math.abs((ae1.edge.x - ae2.edge.x));\n });\n // fill between the edges\n if ((hachureStepOffset !== 1) || (iteration % gap === 0)) {\n if (activeEdges.length > 1) {\n for (let i = 0; i < activeEdges.length; i = i + 2) {\n const nexti = i + 1;\n if (nexti >= activeEdges.length) {\n break;\n }\n const ce = activeEdges[i].edge;\n const ne = activeEdges[nexti].edge;\n lines.push([\n [Math.round(ce.x), y],\n [Math.round(ne.x), y],\n ]);\n }\n }\n }\n y += hachureStepOffset;\n activeEdges.forEach((ae) => {\n ae.edge.x = ae.edge.x + (hachureStepOffset * ae.edge.islope);\n });\n iteration++;\n }\n return lines;\n}\n", "import { HachureFiller } from './hachure-filler';\nimport { polygonHachureLines } from './scan-line-hachure';\nimport { lineLength } from '../geometry';\nexport class ZigZagFiller extends HachureFiller {\n fillPolygons(polygonList, o) {\n let gap = o.hachureGap;\n if (gap < 0) {\n gap = o.strokeWidth * 4;\n }\n gap = Math.max(gap, 0.1);\n const o2 = Object.assign({}, o, { hachureGap: gap });\n const lines = polygonHachureLines(polygonList, o2);\n const zigZagAngle = (Math.PI / 180) * o.hachureAngle;\n const zigzagLines = [];\n const dgx = gap * 0.5 * Math.cos(zigZagAngle);\n const dgy = gap * 0.5 * Math.sin(zigZagAngle);\n for (const [p1, p2] of lines) {\n if (lineLength([p1, p2])) {\n zigzagLines.push([\n [p1[0] - dgx, p1[1] + dgy],\n [...p2],\n ], [\n [p1[0] + dgx, p1[1] - dgy],\n [...p2],\n ]);\n }\n }\n const ops = this.renderLines(zigzagLines, o);\n return { type: 'fillSketch', ops };\n }\n}\n", "export function lineLength(line) {\n const p1 = line[0];\n const p2 = line[1];\n return Math.sqrt(Math.pow(p1[0] - p2[0], 2) + Math.pow(p1[1] - p2[1], 2));\n}\n", "import { HachureFiller } from './hachure-filler';\nexport class HatchFiller extends HachureFiller {\n fillPolygons(polygonList, o) {\n const set = this._fillPolygons(polygonList, o);\n const o2 = Object.assign({}, o, { hachureAngle: o.hachureAngle + 90 });\n const set2 = this._fillPolygons(polygonList, o2);\n set.ops = set.ops.concat(set2.ops);\n return set;\n }\n}\n", "import { lineLength } from '../geometry';\nimport { polygonHachureLines } from './scan-line-hachure';\nexport class DotFiller {\n constructor(helper) {\n this.helper = helper;\n }\n fillPolygons(polygonList, o) {\n o = Object.assign({}, o, { hachureAngle: 0 });\n const lines = polygonHachureLines(polygonList, o);\n return this.dotsOnLines(lines, o);\n }\n dotsOnLines(lines, o) {\n const ops = [];\n let gap = o.hachureGap;\n if (gap < 0) {\n gap = o.strokeWidth * 4;\n }\n gap = Math.max(gap, 0.1);\n let fweight = o.fillWeight;\n if (fweight < 0) {\n fweight = o.strokeWidth / 2;\n }\n const ro = gap / 4;\n for (const line of lines) {\n const length = lineLength(line);\n const dl = length / gap;\n const count = Math.ceil(dl) - 1;\n const offset = length - (count * gap);\n const x = ((line[0][0] + line[1][0]) / 2) - (gap / 4);\n const minY = Math.min(line[0][1], line[1][1]);\n for (let i = 0; i < count; i++) {\n const y = minY + offset + (i * gap);\n const cx = (x - ro) + Math.random() * 2 * ro;\n const cy = (y - ro) + Math.random() * 2 * ro;\n const el = this.helper.ellipse(cx, cy, fweight, fweight, o);\n ops.push(...el.ops);\n }\n }\n return { type: 'fillSketch', ops };\n }\n}\n", "import { lineLength } from '../geometry';\nimport { polygonHachureLines } from './scan-line-hachure';\nexport class DashedFiller {\n constructor(helper) {\n this.helper = helper;\n }\n fillPolygons(polygonList, o) {\n const lines = polygonHachureLines(polygonList, o);\n return { type: 'fillSketch', ops: this.dashedLine(lines, o) };\n }\n dashedLine(lines, o) {\n const offset = o.dashOffset < 0 ? (o.hachureGap < 0 ? (o.strokeWidth * 4) : o.hachureGap) : o.dashOffset;\n const gap = o.dashGap < 0 ? (o.hachureGap < 0 ? (o.strokeWidth * 4) : o.hachureGap) : o.dashGap;\n const ops = [];\n lines.forEach((line) => {\n const length = lineLength(line);\n const count = Math.floor(length / (offset + gap));\n const startOffset = (length + gap - (count * (offset + gap))) / 2;\n let p1 = line[0];\n let p2 = line[1];\n if (p1[0] > p2[0]) {\n p1 = line[1];\n p2 = line[0];\n }\n const alpha = Math.atan((p2[1] - p1[1]) / (p2[0] - p1[0]));\n for (let i = 0; i < count; i++) {\n const lstart = i * (offset + gap);\n const lend = lstart + offset;\n const start = [p1[0] + (lstart * Math.cos(alpha)) + (startOffset * Math.cos(alpha)), p1[1] + lstart * Math.sin(alpha) + (startOffset * Math.sin(alpha))];\n const end = [p1[0] + (lend * Math.cos(alpha)) + (startOffset * Math.cos(alpha)), p1[1] + (lend * Math.sin(alpha)) + (startOffset * Math.sin(alpha))];\n ops.push(...this.helper.doubleLineOps(start[0], start[1], end[0], end[1], o));\n }\n });\n return ops;\n }\n}\n", "import { lineLength } from '../geometry';\nimport { polygonHachureLines } from './scan-line-hachure';\nexport class ZigZagLineFiller {\n constructor(helper) {\n this.helper = helper;\n }\n fillPolygons(polygonList, o) {\n const gap = o.hachureGap < 0 ? (o.strokeWidth * 4) : o.hachureGap;\n const zo = o.zigzagOffset < 0 ? gap : o.zigzagOffset;\n o = Object.assign({}, o, { hachureGap: gap + zo });\n const lines = polygonHachureLines(polygonList, o);\n return { type: 'fillSketch', ops: this.zigzagLines(lines, zo, o) };\n }\n zigzagLines(lines, zo, o) {\n const ops = [];\n lines.forEach((line) => {\n const length = lineLength(line);\n const count = Math.round(length / (2 * zo));\n let p1 = line[0];\n let p2 = line[1];\n if (p1[0] > p2[0]) {\n p1 = line[1];\n p2 = line[0];\n }\n const alpha = Math.atan((p2[1] - p1[1]) / (p2[0] - p1[0]));\n for (let i = 0; i < count; i++) {\n const lstart = i * 2 * zo;\n const lend = (i + 1) * 2 * zo;\n const dz = Math.sqrt(2 * Math.pow(zo, 2));\n const start = [p1[0] + (lstart * Math.cos(alpha)), p1[1] + lstart * Math.sin(alpha)];\n const end = [p1[0] + (lend * Math.cos(alpha)), p1[1] + (lend * Math.sin(alpha))];\n const middle = [start[0] + dz * Math.cos(alpha + Math.PI / 4), start[1] + dz * Math.sin(alpha + Math.PI / 4)];\n ops.push(...this.helper.doubleLineOps(start[0], start[1], middle[0], middle[1], o), ...this.helper.doubleLineOps(middle[0], middle[1], end[0], end[1], o));\n }\n });\n return ops;\n }\n}\n", "export function randomSeed() {\n return Math.floor(Math.random() * 2 ** 31);\n}\nexport class Random {\n constructor(seed) {\n this.seed = seed;\n }\n next() {\n if (this.seed) {\n return ((2 ** 31 - 1) & (this.seed = Math.imul(48271, this.seed))) / 2 ** 31;\n }\n else {\n return Math.random();\n }\n }\n}\n", "export { parsePath, serialize } from './parser.js';\nexport { absolutize } from './absolutize.js';\nexport { normalize } from './normalize.js';\n", "const COMMAND = 0;\nconst NUMBER = 1;\nconst EOD = 2;\nconst PARAMS = { A: 7, a: 7, C: 6, c: 6, H: 1, h: 1, L: 2, l: 2, M: 2, m: 2, Q: 4, q: 4, S: 4, s: 4, T: 2, t: 2, V: 1, v: 1, Z: 0, z: 0 };\nfunction tokenize(d) {\n const tokens = new Array();\n while (d !== '') {\n if (d.match(/^([ \\t\\r\\n,]+)/)) {\n d = d.substr(RegExp.$1.length);\n }\n else if (d.match(/^([aAcChHlLmMqQsStTvVzZ])/)) {\n tokens[tokens.length] = { type: COMMAND, text: RegExp.$1 };\n d = d.substr(RegExp.$1.length);\n }\n else if (d.match(/^(([-+]?[0-9]+(\\.[0-9]*)?|[-+]?\\.[0-9]+)([eE][-+]?[0-9]+)?)/)) {\n tokens[tokens.length] = { type: NUMBER, text: `${parseFloat(RegExp.$1)}` };\n d = d.substr(RegExp.$1.length);\n }\n else {\n return [];\n }\n }\n tokens[tokens.length] = { type: EOD, text: '' };\n return tokens;\n}\nfunction isType(token, type) {\n return token.type === type;\n}\nexport function parsePath(d) {\n const segments = [];\n const tokens = tokenize(d);\n let mode = 'BOD';\n let index = 0;\n let token = tokens[index];\n while (!isType(token, EOD)) {\n let paramsCount = 0;\n const params = [];\n if (mode === 'BOD') {\n if (token.text === 'M' || token.text === 'm') {\n index++;\n paramsCount = PARAMS[token.text];\n mode = token.text;\n }\n else {\n return parsePath('M0,0' + d);\n }\n }\n else if (isType(token, NUMBER)) {\n paramsCount = PARAMS[mode];\n }\n else {\n index++;\n paramsCount = PARAMS[token.text];\n mode = token.text;\n }\n if ((index + paramsCount) < tokens.length) {\n for (let i = index; i < index + paramsCount; i++) {\n const numbeToken = tokens[i];\n if (isType(numbeToken, NUMBER)) {\n params[params.length] = +numbeToken.text;\n }\n else {\n throw new Error('Param not a number: ' + mode + ',' + numbeToken.text);\n }\n }\n if (typeof PARAMS[mode] === 'number') {\n const segment = { key: mode, data: params };\n segments.push(segment);\n index += paramsCount;\n token = tokens[index];\n if (mode === 'M')\n mode = 'L';\n if (mode === 'm')\n mode = 'l';\n }\n else {\n throw new Error('Bad segment: ' + mode);\n }\n }\n else {\n throw new Error('Path data ended short');\n }\n }\n return segments;\n}\nexport function serialize(segments) {\n const tokens = [];\n for (const { key, data } of segments) {\n tokens.push(key);\n switch (key) {\n case 'C':\n case 'c':\n tokens.push(data[0], `${data[1]},`, data[2], `${data[3]},`, data[4], data[5]);\n break;\n case 'S':\n case 's':\n case 'Q':\n case 'q':\n tokens.push(data[0], `${data[1]},`, data[2], data[3]);\n break;\n default:\n tokens.push(...data);\n break;\n }\n }\n return tokens.join(' ');\n}\n", "// Translate relative commands to absolute commands\nexport function absolutize(segments) {\n let cx = 0, cy = 0;\n let subx = 0, suby = 0;\n const out = [];\n for (const { key, data } of segments) {\n switch (key) {\n case 'M':\n out.push({ key: 'M', data: [...data] });\n [cx, cy] = data;\n [subx, suby] = data;\n break;\n case 'm':\n cx += data[0];\n cy += data[1];\n out.push({ key: 'M', data: [cx, cy] });\n subx = cx;\n suby = cy;\n break;\n case 'L':\n out.push({ key: 'L', data: [...data] });\n [cx, cy] = data;\n break;\n case 'l':\n cx += data[0];\n cy += data[1];\n out.push({ key: 'L', data: [cx, cy] });\n break;\n case 'C':\n out.push({ key: 'C', data: [...data] });\n cx = data[4];\n cy = data[5];\n break;\n case 'c': {\n const newdata = data.map((d, i) => (i % 2) ? (d + cy) : (d + cx));\n out.push({ key: 'C', data: newdata });\n cx = newdata[4];\n cy = newdata[5];\n break;\n }\n case 'Q':\n out.push({ key: 'Q', data: [...data] });\n cx = data[2];\n cy = data[3];\n break;\n case 'q': {\n const newdata = data.map((d, i) => (i % 2) ? (d + cy) : (d + cx));\n out.push({ key: 'Q', data: newdata });\n cx = newdata[2];\n cy = newdata[3];\n break;\n }\n case 'A':\n out.push({ key: 'A', data: [...data] });\n cx = data[5];\n cy = data[6];\n break;\n case 'a':\n cx += data[5];\n cy += data[6];\n out.push({ key: 'A', data: [data[0], data[1], data[2], data[3], data[4], cx, cy] });\n break;\n case 'H':\n out.push({ key: 'H', data: [...data] });\n cx = data[0];\n break;\n case 'h':\n cx += data[0];\n out.push({ key: 'H', data: [cx] });\n break;\n case 'V':\n out.push({ key: 'V', data: [...data] });\n cy = data[0];\n break;\n case 'v':\n cy += data[0];\n out.push({ key: 'V', data: [cy] });\n break;\n case 'S':\n out.push({ key: 'S', data: [...data] });\n cx = data[2];\n cy = data[3];\n break;\n case 's': {\n const newdata = data.map((d, i) => (i % 2) ? (d + cy) : (d + cx));\n out.push({ key: 'S', data: newdata });\n cx = newdata[2];\n cy = newdata[3];\n break;\n }\n case 'T':\n out.push({ key: 'T', data: [...data] });\n cx = data[0];\n cy = data[1];\n break;\n case 't':\n cx += data[0];\n cy += data[1];\n out.push({ key: 'T', data: [cx, cy] });\n break;\n case 'Z':\n case 'z':\n out.push({ key: 'Z', data: [] });\n cx = subx;\n cy = suby;\n break;\n }\n }\n return out;\n}\n", "// Normalize path to include only M, L, C, and Z commands\nexport function normalize(segments) {\n const out = [];\n let lastType = '';\n let cx = 0, cy = 0;\n let subx = 0, suby = 0;\n let lcx = 0, lcy = 0;\n for (const { key, data } of segments) {\n switch (key) {\n case 'M':\n out.push({ key: 'M', data: [...data] });\n [cx, cy] = data;\n [subx, suby] = data;\n break;\n case 'C':\n out.push({ key: 'C', data: [...data] });\n cx = data[4];\n cy = data[5];\n lcx = data[2];\n lcy = data[3];\n break;\n case 'L':\n out.push({ key: 'L', data: [...data] });\n [cx, cy] = data;\n break;\n case 'H':\n cx = data[0];\n out.push({ key: 'L', data: [cx, cy] });\n break;\n case 'V':\n cy = data[0];\n out.push({ key: 'L', data: [cx, cy] });\n break;\n case 'S': {\n let cx1 = 0, cy1 = 0;\n if (lastType === 'C' || lastType === 'S') {\n cx1 = cx + (cx - lcx);\n cy1 = cy + (cy - lcy);\n }\n else {\n cx1 = cx;\n cy1 = cy;\n }\n out.push({ key: 'C', data: [cx1, cy1, ...data] });\n lcx = data[0];\n lcy = data[1];\n cx = data[2];\n cy = data[3];\n break;\n }\n case 'T': {\n const [x, y] = data;\n let x1 = 0, y1 = 0;\n if (lastType === 'Q' || lastType === 'T') {\n x1 = cx + (cx - lcx);\n y1 = cy + (cy - lcy);\n }\n else {\n x1 = cx;\n y1 = cy;\n }\n const cx1 = cx + 2 * (x1 - cx) / 3;\n const cy1 = cy + 2 * (y1 - cy) / 3;\n const cx2 = x + 2 * (x1 - x) / 3;\n const cy2 = y + 2 * (y1 - y) / 3;\n out.push({ key: 'C', data: [cx1, cy1, cx2, cy2, x, y] });\n lcx = x1;\n lcy = y1;\n cx = x;\n cy = y;\n break;\n }\n case 'Q': {\n const [x1, y1, x, y] = data;\n const cx1 = cx + 2 * (x1 - cx) / 3;\n const cy1 = cy + 2 * (y1 - cy) / 3;\n const cx2 = x + 2 * (x1 - x) / 3;\n const cy2 = y + 2 * (y1 - y) / 3;\n out.push({ key: 'C', data: [cx1, cy1, cx2, cy2, x, y] });\n lcx = x1;\n lcy = y1;\n cx = x;\n cy = y;\n break;\n }\n case 'A': {\n const r1 = Math.abs(data[0]);\n const r2 = Math.abs(data[1]);\n const angle = data[2];\n const largeArcFlag = data[3];\n const sweepFlag = data[4];\n const x = data[5];\n const y = data[6];\n if (r1 === 0 || r2 === 0) {\n out.push({ key: 'C', data: [cx, cy, x, y, x, y] });\n cx = x;\n cy = y;\n }\n else {\n if (cx !== x || cy !== y) {\n const curves = arcToCubicCurves(cx, cy, x, y, r1, r2, angle, largeArcFlag, sweepFlag);\n curves.forEach(function (curve) {\n out.push({ key: 'C', data: curve });\n });\n cx = x;\n cy = y;\n }\n }\n break;\n }\n case 'Z':\n out.push({ key: 'Z', data: [] });\n cx = subx;\n cy = suby;\n break;\n }\n lastType = key;\n }\n return out;\n}\nfunction degToRad(degrees) {\n return (Math.PI * degrees) / 180;\n}\nfunction rotate(x, y, angleRad) {\n const X = x * Math.cos(angleRad) - y * Math.sin(angleRad);\n const Y = x * Math.sin(angleRad) + y * Math.cos(angleRad);\n return [X, Y];\n}\nfunction arcToCubicCurves(x1, y1, x2, y2, r1, r2, angle, largeArcFlag, sweepFlag, recursive) {\n const angleRad = degToRad(angle);\n let params = [];\n let f1 = 0, f2 = 0, cx = 0, cy = 0;\n if (recursive) {\n [f1, f2, cx, cy] = recursive;\n }\n else {\n [x1, y1] = rotate(x1, y1, -angleRad);\n [x2, y2] = rotate(x2, y2, -angleRad);\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (r1 * r1) + (y * y) / (r2 * r2);\n if (h > 1) {\n h = Math.sqrt(h);\n r1 = h * r1;\n r2 = h * r2;\n }\n const sign = (largeArcFlag === sweepFlag) ? -1 : 1;\n const r1Pow = r1 * r1;\n const r2Pow = r2 * r2;\n const left = r1Pow * r2Pow - r1Pow * y * y - r2Pow * x * x;\n const right = r1Pow * y * y + r2Pow * x * x;\n const k = sign * Math.sqrt(Math.abs(left / right));\n cx = k * r1 * y / r2 + (x1 + x2) / 2;\n cy = k * -r2 * x / r1 + (y1 + y2) / 2;\n f1 = Math.asin(parseFloat(((y1 - cy) / r2).toFixed(9)));\n f2 = Math.asin(parseFloat(((y2 - cy) / r2).toFixed(9)));\n if (x1 < cx) {\n f1 = Math.PI - f1;\n }\n if (x2 < cx) {\n f2 = Math.PI - f2;\n }\n if (f1 < 0) {\n f1 = Math.PI * 2 + f1;\n }\n if (f2 < 0) {\n f2 = Math.PI * 2 + f2;\n }\n if (sweepFlag && f1 > f2) {\n f1 = f1 - Math.PI * 2;\n }\n if (!sweepFlag && f2 > f1) {\n f2 = f2 - Math.PI * 2;\n }\n }\n let df = f2 - f1;\n if (Math.abs(df) > (Math.PI * 120 / 180)) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n if (sweepFlag && f2 > f1) {\n f2 = f1 + (Math.PI * 120 / 180) * (1);\n }\n else {\n f2 = f1 + (Math.PI * 120 / 180) * (-1);\n }\n x2 = cx + r1 * Math.cos(f2);\n y2 = cy + r2 * Math.sin(f2);\n params = arcToCubicCurves(x2, y2, x2old, y2old, r1, r2, angle, 0, sweepFlag, [f2, f2old, cx, cy]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = 4 / 3 * r1 * t;\n const hy = 4 / 3 * r2 * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2, m3, m4].concat(params);\n }\n else {\n params = [m2, m3, m4].concat(params);\n const curves = [];\n for (let i = 0; i < params.length; i += 3) {\n const r1 = rotate(params[i][0], params[i][1], angleRad);\n const r2 = rotate(params[i + 1][0], params[i + 1][1], angleRad);\n const r3 = rotate(params[i + 2][0], params[i + 2][1], angleRad);\n curves.push([r1[0], r1[1], r2[0], r2[1], r3[0], r3[1]]);\n }\n return curves;\n }\n}\n", "function clone(p) {\n return [...p];\n}\nexport function curveToBezier(pointsIn, curveTightness = 0) {\n const len = pointsIn.length;\n if (len < 3) {\n throw new Error('A curve must have at least three points.');\n }\n const out = [];\n if (len === 3) {\n out.push(clone(pointsIn[0]), clone(pointsIn[1]), clone(pointsIn[2]), clone(pointsIn[2]));\n }\n else {\n const points = [];\n points.push(pointsIn[0], pointsIn[0]);\n for (let i = 1; i < pointsIn.length; i++) {\n points.push(pointsIn[i]);\n if (i === (pointsIn.length - 1)) {\n points.push(pointsIn[i]);\n }\n }\n const b = [];\n const s = 1 - curveTightness;\n out.push(clone(points[0]));\n for (let i = 1; (i + 2) < points.length; i++) {\n const cachedVertArray = points[i];\n b[0] = [cachedVertArray[0], cachedVertArray[1]];\n b[1] = [cachedVertArray[0] + (s * points[i + 1][0] - s * points[i - 1][0]) / 6, cachedVertArray[1] + (s * points[i + 1][1] - s * points[i - 1][1]) / 6];\n b[2] = [points[i + 1][0] + (s * points[i][0] - s * points[i + 2][0]) / 6, points[i + 1][1] + (s * points[i][1] - s * points[i + 2][1]) / 6];\n b[3] = [points[i + 1][0], points[i + 1][1]];\n out.push(b[1], b[2], b[3]);\n }\n }\n return out;\n}\n", "// distance between 2 points\nfunction distance(p1, p2) {\n return Math.sqrt(distanceSq(p1, p2));\n}\n// distance between 2 points squared\nfunction distanceSq(p1, p2) {\n return Math.pow(p1[0] - p2[0], 2) + Math.pow(p1[1] - p2[1], 2);\n}\n// Sistance squared from a point p to the line segment vw\nfunction distanceToSegmentSq(p, v, w) {\n const l2 = distanceSq(v, w);\n if (l2 === 0) {\n return distanceSq(p, v);\n }\n let t = ((p[0] - v[0]) * (w[0] - v[0]) + (p[1] - v[1]) * (w[1] - v[1])) / l2;\n t = Math.max(0, Math.min(1, t));\n return distanceSq(p, lerp(v, w, t));\n}\nfunction lerp(a, b, t) {\n return [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n ];\n}\n// Adapted from https://seant23.wordpress.com/2010/11/12/offset-bezier-curves/\nfunction flatness(points, offset) {\n const p1 = points[offset + 0];\n const p2 = points[offset + 1];\n const p3 = points[offset + 2];\n const p4 = points[offset + 3];\n let ux = 3 * p2[0] - 2 * p1[0] - p4[0];\n ux *= ux;\n let uy = 3 * p2[1] - 2 * p1[1] - p4[1];\n uy *= uy;\n let vx = 3 * p3[0] - 2 * p4[0] - p1[0];\n vx *= vx;\n let vy = 3 * p3[1] - 2 * p4[1] - p1[1];\n vy *= vy;\n if (ux < vx) {\n ux = vx;\n }\n if (uy < vy) {\n uy = vy;\n }\n return ux + uy;\n}\nfunction getPointsOnBezierCurveWithSplitting(points, offset, tolerance, newPoints) {\n const outPoints = newPoints || [];\n if (flatness(points, offset) < tolerance) {\n const p0 = points[offset + 0];\n if (outPoints.length) {\n const d = distance(outPoints[outPoints.length - 1], p0);\n if (d > 1) {\n outPoints.push(p0);\n }\n }\n else {\n outPoints.push(p0);\n }\n outPoints.push(points[offset + 3]);\n }\n else {\n // subdivide\n const t = .5;\n const p1 = points[offset + 0];\n const p2 = points[offset + 1];\n const p3 = points[offset + 2];\n const p4 = points[offset + 3];\n const q1 = lerp(p1, p2, t);\n const q2 = lerp(p2, p3, t);\n const q3 = lerp(p3, p4, t);\n const r1 = lerp(q1, q2, t);\n const r2 = lerp(q2, q3, t);\n const red = lerp(r1, r2, t);\n getPointsOnBezierCurveWithSplitting([p1, q1, r1, red], 0, tolerance, outPoints);\n getPointsOnBezierCurveWithSplitting([red, r2, q3, p4], 0, tolerance, outPoints);\n }\n return outPoints;\n}\nexport function simplify(points, distance) {\n return simplifyPoints(points, 0, points.length, distance);\n}\n// Ramer\u2013Douglas\u2013Peucker algorithm\n// https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm\nfunction simplifyPoints(points, start, end, epsilon, newPoints) {\n const outPoints = newPoints || [];\n // find the most distance point from the endpoints\n const s = points[start];\n const e = points[end - 1];\n let maxDistSq = 0;\n let maxNdx = 1;\n for (let i = start + 1; i < end - 1; ++i) {\n const distSq = distanceToSegmentSq(points[i], s, e);\n if (distSq > maxDistSq) {\n maxDistSq = distSq;\n maxNdx = i;\n }\n }\n // if that point is too far, split\n if (Math.sqrt(maxDistSq) > epsilon) {\n simplifyPoints(points, start, maxNdx + 1, epsilon, outPoints);\n simplifyPoints(points, maxNdx, end, epsilon, outPoints);\n }\n else {\n if (!outPoints.length) {\n outPoints.push(s);\n }\n outPoints.push(e);\n }\n return outPoints;\n}\nexport function pointsOnBezierCurves(points, tolerance = 0.15, distance) {\n const newPoints = [];\n const numSegments = (points.length - 1) / 3;\n for (let i = 0; i < numSegments; i++) {\n const offset = i * 3;\n getPointsOnBezierCurveWithSplitting(points, offset, tolerance, newPoints);\n }\n if (distance && distance > 0) {\n return simplifyPoints(newPoints, 0, newPoints.length, distance);\n }\n return newPoints;\n}\n", "import { pointsOnBezierCurves, simplify } from 'points-on-curve';\nimport { parsePath, absolutize, normalize } from 'path-data-parser';\nexport function pointsOnPath(path, tolerance, distance) {\n const segments = parsePath(path);\n const normalized = normalize(absolutize(segments));\n const sets = [];\n let currentPoints = [];\n let start = [0, 0];\n let pendingCurve = [];\n const appendPendingCurve = () => {\n if (pendingCurve.length >= 4) {\n currentPoints.push(...pointsOnBezierCurves(pendingCurve, tolerance));\n }\n pendingCurve = [];\n };\n const appendPendingPoints = () => {\n appendPendingCurve();\n if (currentPoints.length) {\n sets.push(currentPoints);\n currentPoints = [];\n }\n };\n for (const { key, data } of normalized) {\n switch (key) {\n case 'M':\n appendPendingPoints();\n start = [data[0], data[1]];\n currentPoints.push(start);\n break;\n case 'L':\n appendPendingCurve();\n currentPoints.push([data[0], data[1]]);\n break;\n case 'C':\n if (!pendingCurve.length) {\n const lastPoint = currentPoints.length ? currentPoints[currentPoints.length - 1] : start;\n pendingCurve.push([lastPoint[0], lastPoint[1]]);\n }\n pendingCurve.push([data[0], data[1]]);\n pendingCurve.push([data[2], data[3]]);\n pendingCurve.push([data[4], data[5]]);\n break;\n case 'Z':\n appendPendingCurve();\n currentPoints.push([start[0], start[1]]);\n break;\n }\n }\n appendPendingPoints();\n if (!distance) {\n return sets;\n }\n const out = [];\n for (const set of sets) {\n const simplifiedSet = simplify(set, distance);\n if (simplifiedSet.length) {\n out.push(simplifiedSet);\n }\n }\n return out;\n}\n", "import { SVGNS } from './core';\nimport { RoughGenerator } from './generator';\nexport class RoughSVG {\n constructor(svg, config) {\n this.svg = svg;\n this.gen = new RoughGenerator(config);\n }\n draw(drawable) {\n const sets = drawable.sets || [];\n const o = drawable.options || this.getDefaultOptions();\n const doc = this.svg.ownerDocument || window.document;\n const g = doc.createElementNS(SVGNS, 'g');\n const precision = drawable.options.fixedDecimalPlaceDigits;\n for (const drawing of sets) {\n let path = null;\n switch (drawing.type) {\n case 'path': {\n path = doc.createElementNS(SVGNS, 'path');\n path.setAttribute('d', this.opsToPath(drawing, precision));\n path.setAttribute('stroke', o.stroke);\n path.setAttribute('stroke-width', o.strokeWidth + '');\n path.setAttribute('fill', 'none');\n if (o.strokeLineDash) {\n path.setAttribute('stroke-dasharray', o.strokeLineDash.join(' ').trim());\n }\n if (o.strokeLineDashOffset) {\n path.setAttribute('stroke-dashoffset', `${o.strokeLineDashOffset}`);\n }\n break;\n }\n case 'fillPath': {\n path = doc.createElementNS(SVGNS, 'path');\n path.setAttribute('d', this.opsToPath(drawing, precision));\n path.setAttribute('stroke', 'none');\n path.setAttribute('stroke-width', '0');\n path.setAttribute('fill', o.fill || '');\n if (drawable.shape === 'curve' || drawable.shape === 'polygon') {\n path.setAttribute('fill-rule', 'evenodd');\n }\n break;\n }\n case 'fillSketch': {\n path = this.fillSketch(doc, drawing, o);\n break;\n }\n }\n if (path) {\n g.appendChild(path);\n }\n }\n return g;\n }\n fillSketch(doc, drawing, o) {\n let fweight = o.fillWeight;\n if (fweight < 0) {\n fweight = o.strokeWidth / 2;\n }\n const path = doc.createElementNS(SVGNS, 'path');\n path.setAttribute('d', this.opsToPath(drawing, o.fixedDecimalPlaceDigits));\n path.setAttribute('stroke', o.fill || '');\n path.setAttribute('stroke-width', fweight + '');\n path.setAttribute('fill', 'none');\n if (o.fillLineDash) {\n path.setAttribute('stroke-dasharray', o.fillLineDash.join(' ').trim());\n }\n if (o.fillLineDashOffset) {\n path.setAttribute('stroke-dashoffset', `${o.fillLineDashOffset}`);\n }\n return path;\n }\n get generator() {\n return this.gen;\n }\n getDefaultOptions() {\n return this.gen.defaultOptions;\n }\n opsToPath(drawing, fixedDecimalPlaceDigits) {\n return this.gen.opsToPath(drawing, fixedDecimalPlaceDigits);\n }\n line(x1, y1, x2, y2, options) {\n const d = this.gen.line(x1, y1, x2, y2, options);\n return this.draw(d);\n }\n rectangle(x, y, width, height, options) {\n const d = this.gen.rectangle(x, y, width, height, options);\n return this.draw(d);\n }\n ellipse(x, y, width, height, options) {\n const d = this.gen.ellipse(x, y, width, height, options);\n return this.draw(d);\n }\n circle(x, y, diameter, options) {\n const d = this.gen.circle(x, y, diameter, options);\n return this.draw(d);\n }\n linearPath(points, options) {\n const d = this.gen.linearPath(points, options);\n return this.draw(d);\n }\n polygon(points, options) {\n const d = this.gen.polygon(points, options);\n return this.draw(d);\n }\n arc(x, y, width, height, start, stop, closed = false, options) {\n const d = this.gen.arc(x, y, width, height, start, stop, closed, options);\n return this.draw(d);\n }\n curve(points, options) {\n const d = this.gen.curve(points, options);\n return this.draw(d);\n }\n path(d, options) {\n const drawing = this.gen.path(d, options);\n return this.draw(drawing);\n }\n}\n", "export const SVGNS = 'http://www.w3.org/2000/svg';\n", "import type { Drawable, Options } from \"roughjs/bin/core\";\nimport type { RoughGenerator } from \"roughjs/bin/generator\";\nimport { getDiamondPoints, getArrowheadPoints } from \"../element\";\nimport type { ElementShapes } from \"./types\";\nimport type {\n ExcalidrawElement,\n NonDeletedExcalidrawElement,\n ExcalidrawSelectionElement,\n ExcalidrawLinearElement,\n Arrowhead,\n} from \"../element/types\";\nimport { isPathALoop, getCornerRadius } from \"../math\";\nimport { generateFreeDrawShape } from \"../renderer/renderElement\";\nimport { isTransparent, assertNever } from \"../utils\";\nimport { simplify } from \"points-on-curve\";\nimport { ROUGHNESS } from \"../constants\";\nimport {\n isEmbeddableElement,\n isIframeElement,\n isIframeLikeElement,\n isLinearElement,\n} from \"../element/typeChecks\";\nimport { canChangeRoundness } from \"./comparisons\";\nimport { EmbedsValidationStatus } from \"../types\";\n\nconst getDashArrayDashed = (strokeWidth: number) => [8, 8 + strokeWidth];\n\nconst getDashArrayDotted = (strokeWidth: number) => [1.5, 6 + strokeWidth];\n\nfunction adjustRoughness(element: ExcalidrawElement): number {\n const roughness = element.roughness;\n\n const maxSize = Math.max(element.width, element.height);\n const minSize = Math.min(element.width, element.height);\n\n // don't reduce roughness if\n if (\n // both sides relatively big\n (minSize >= 20 && maxSize >= 50) ||\n // is round & both sides above 15px\n (minSize >= 15 &&\n !!element.roundness &&\n canChangeRoundness(element.type)) ||\n // relatively long linear element\n (isLinearElement(element) && maxSize >= 50)\n ) {\n return roughness;\n }\n\n return Math.min(roughness / (maxSize < 10 ? 3 : 2), 2.5);\n}\n\nexport const generateRoughOptions = (\n element: ExcalidrawElement,\n continuousPath = false,\n): Options => {\n const options: Options = {\n seed: element.seed,\n strokeLineDash:\n element.strokeStyle === \"dashed\"\n ? getDashArrayDashed(element.strokeWidth)\n : element.strokeStyle === \"dotted\"\n ? getDashArrayDotted(element.strokeWidth)\n : undefined,\n // for non-solid strokes, disable multiStroke because it tends to make\n // dashes/dots overlay each other\n disableMultiStroke: element.strokeStyle !== \"solid\",\n // for non-solid strokes, increase the width a bit to make it visually\n // similar to solid strokes, because we're also disabling multiStroke\n strokeWidth:\n element.strokeStyle !== \"solid\"\n ? element.strokeWidth + 0.5\n : element.strokeWidth,\n // when increasing strokeWidth, we must explicitly set fillWeight and\n // hachureGap because if not specified, roughjs uses strokeWidth to\n // calculate them (and we don't want the fills to be modified)\n fillWeight: element.strokeWidth / 2,\n hachureGap: element.strokeWidth * 4,\n roughness: adjustRoughness(element),\n stroke: element.strokeColor,\n preserveVertices:\n continuousPath || element.roughness < ROUGHNESS.cartoonist,\n };\n\n switch (element.type) {\n case \"rectangle\":\n case \"iframe\":\n case \"embeddable\":\n case \"diamond\":\n case \"ellipse\": {\n options.fillStyle = element.fillStyle;\n options.fill = isTransparent(element.backgroundColor)\n ? undefined\n : element.backgroundColor;\n if (element.type === \"ellipse\") {\n options.curveFitting = 1;\n }\n return options;\n }\n case \"line\":\n case \"freedraw\": {\n if (isPathALoop(element.points)) {\n options.fillStyle = element.fillStyle;\n options.fill =\n element.backgroundColor === \"transparent\"\n ? undefined\n : element.backgroundColor;\n }\n return options;\n }\n case \"arrow\":\n return options;\n default: {\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n};\n\nconst modifyIframeLikeForRoughOptions = (\n element: NonDeletedExcalidrawElement,\n isExporting: boolean,\n embedsValidationStatus: EmbedsValidationStatus | null,\n) => {\n if (\n isIframeLikeElement(element) &&\n (isExporting ||\n (isEmbeddableElement(element) &&\n embedsValidationStatus?.get(element.id) !== true)) &&\n isTransparent(element.backgroundColor) &&\n isTransparent(element.strokeColor)\n ) {\n return {\n ...element,\n roughness: 0,\n backgroundColor: \"#d3d3d3\",\n fillStyle: \"solid\",\n } as const;\n } else if (isIframeElement(element)) {\n return {\n ...element,\n strokeColor: isTransparent(element.strokeColor)\n ? \"#000000\"\n : element.strokeColor,\n backgroundColor: isTransparent(element.backgroundColor)\n ? \"#f4f4f6\"\n : element.backgroundColor,\n };\n }\n return element;\n};\n\nconst getArrowheadShapes = (\n element: ExcalidrawLinearElement,\n shape: Drawable[],\n position: \"start\" | \"end\",\n arrowhead: Arrowhead,\n generator: RoughGenerator,\n options: Options,\n canvasBackgroundColor: string,\n) => {\n const arrowheadPoints = getArrowheadPoints(\n element,\n shape,\n position,\n arrowhead,\n );\n\n if (arrowheadPoints === null) {\n return [];\n }\n\n switch (arrowhead) {\n case \"dot\":\n case \"circle\":\n case \"circle_outline\": {\n const [x, y, diameter] = arrowheadPoints;\n\n // always use solid stroke for arrowhead\n delete options.strokeLineDash;\n\n return [\n generator.circle(x, y, diameter, {\n ...options,\n fill:\n arrowhead === \"circle_outline\"\n ? canvasBackgroundColor\n : element.strokeColor,\n\n fillStyle: \"solid\",\n stroke: element.strokeColor,\n roughness: Math.min(0.5, options.roughness || 0),\n }),\n ];\n }\n case \"triangle\":\n case \"triangle_outline\": {\n const [x, y, x2, y2, x3, y3] = arrowheadPoints;\n\n // always use solid stroke for arrowhead\n delete options.strokeLineDash;\n\n return [\n generator.polygon(\n [\n [x, y],\n [x2, y2],\n [x3, y3],\n [x, y],\n ],\n {\n ...options,\n fill:\n arrowhead === \"triangle_outline\"\n ? canvasBackgroundColor\n : element.strokeColor,\n fillStyle: \"solid\",\n roughness: Math.min(1, options.roughness || 0),\n },\n ),\n ];\n }\n case \"diamond\":\n case \"diamond_outline\": {\n const [x, y, x2, y2, x3, y3, x4, y4] = arrowheadPoints;\n\n // always use solid stroke for arrowhead\n delete options.strokeLineDash;\n\n return [\n generator.polygon(\n [\n [x, y],\n [x2, y2],\n [x3, y3],\n [x4, y4],\n [x, y],\n ],\n {\n ...options,\n fill:\n arrowhead === \"diamond_outline\"\n ? canvasBackgroundColor\n : element.strokeColor,\n fillStyle: \"solid\",\n roughness: Math.min(1, options.roughness || 0),\n },\n ),\n ];\n }\n case \"bar\":\n case \"arrow\":\n default: {\n const [x2, y2, x3, y3, x4, y4] = arrowheadPoints;\n\n if (element.strokeStyle === \"dotted\") {\n // for dotted arrows caps, reduce gap to make it more legible\n const dash = getDashArrayDotted(element.strokeWidth - 1);\n options.strokeLineDash = [dash[0], dash[1] - 1];\n } else {\n // for solid/dashed, keep solid arrow cap\n delete options.strokeLineDash;\n }\n options.roughness = Math.min(1, options.roughness || 0);\n return [\n generator.line(x3, y3, x2, y2, options),\n generator.line(x4, y4, x2, y2, options),\n ];\n }\n }\n};\n\n/**\n * Generates the roughjs shape for given element.\n *\n * Low-level. Use `ShapeCache.generateElementShape` instead.\n *\n * @private\n */\nexport const _generateElementShape = (\n element: Exclude<NonDeletedExcalidrawElement, ExcalidrawSelectionElement>,\n generator: RoughGenerator,\n {\n isExporting,\n canvasBackgroundColor,\n embedsValidationStatus,\n }: {\n isExporting: boolean;\n canvasBackgroundColor: string;\n embedsValidationStatus: EmbedsValidationStatus | null;\n },\n): Drawable | Drawable[] | null => {\n switch (element.type) {\n case \"rectangle\":\n case \"iframe\":\n case \"embeddable\": {\n let shape: ElementShapes[typeof element.type];\n // this is for rendering the stroke/bg of the embeddable, especially\n // when the src url is not set\n\n if (element.roundness) {\n const w = element.width;\n const h = element.height;\n const r = getCornerRadius(Math.min(w, h), element);\n shape = generator.path(\n `M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${\n h - r\n } Q ${w} ${h}, ${w - r} ${h} L ${r} ${h} Q 0 ${h}, 0 ${\n h - r\n } L 0 ${r} Q 0 0, ${r} 0`,\n generateRoughOptions(\n modifyIframeLikeForRoughOptions(\n element,\n isExporting,\n embedsValidationStatus,\n ),\n true,\n ),\n );\n } else {\n shape = generator.rectangle(\n 0,\n 0,\n element.width,\n element.height,\n generateRoughOptions(\n modifyIframeLikeForRoughOptions(\n element,\n isExporting,\n embedsValidationStatus,\n ),\n false,\n ),\n );\n }\n return shape;\n }\n case \"diamond\": {\n let shape: ElementShapes[typeof element.type];\n\n const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY] =\n getDiamondPoints(element);\n if (element.roundness) {\n const verticalRadius = getCornerRadius(Math.abs(topX - leftX), element);\n\n const horizontalRadius = getCornerRadius(\n Math.abs(rightY - topY),\n element,\n );\n\n shape = generator.path(\n `M ${topX + verticalRadius} ${topY + horizontalRadius} L ${\n rightX - verticalRadius\n } ${rightY - horizontalRadius}\n C ${rightX} ${rightY}, ${rightX} ${rightY}, ${\n rightX - verticalRadius\n } ${rightY + horizontalRadius}\n L ${bottomX + verticalRadius} ${bottomY - horizontalRadius}\n C ${bottomX} ${bottomY}, ${bottomX} ${bottomY}, ${\n bottomX - verticalRadius\n } ${bottomY - horizontalRadius}\n L ${leftX + verticalRadius} ${leftY + horizontalRadius}\n C ${leftX} ${leftY}, ${leftX} ${leftY}, ${leftX + verticalRadius} ${\n leftY - horizontalRadius\n }\n L ${topX - verticalRadius} ${topY + horizontalRadius}\n C ${topX} ${topY}, ${topX} ${topY}, ${topX + verticalRadius} ${\n topY + horizontalRadius\n }`,\n generateRoughOptions(element, true),\n );\n } else {\n shape = generator.polygon(\n [\n [topX, topY],\n [rightX, rightY],\n [bottomX, bottomY],\n [leftX, leftY],\n ],\n generateRoughOptions(element),\n );\n }\n return shape;\n }\n case \"ellipse\": {\n const shape: ElementShapes[typeof element.type] = generator.ellipse(\n element.width / 2,\n element.height / 2,\n element.width,\n element.height,\n generateRoughOptions(element),\n );\n return shape;\n }\n case \"line\":\n case \"arrow\": {\n let shape: ElementShapes[typeof element.type];\n const options = generateRoughOptions(element);\n\n // points array can be empty in the beginning, so it is important to add\n // initial position to it\n const points = element.points.length ? element.points : [[0, 0]];\n\n // curve is always the first element\n // this simplifies finding the curve for an element\n if (!element.roundness) {\n if (options.fill) {\n shape = [generator.polygon(points as [number, number][], options)];\n } else {\n shape = [generator.linearPath(points as [number, number][], options)];\n }\n } else {\n shape = [generator.curve(points as [number, number][], options)];\n }\n\n // add lines only in arrow\n if (element.type === \"arrow\") {\n const { startArrowhead = null, endArrowhead = \"arrow\" } = element;\n\n if (startArrowhead !== null) {\n const shapes = getArrowheadShapes(\n element,\n shape,\n \"start\",\n startArrowhead,\n generator,\n options,\n canvasBackgroundColor,\n );\n shape.push(...shapes);\n }\n\n if (endArrowhead !== null) {\n if (endArrowhead === undefined) {\n // Hey, we have an old arrow here!\n }\n\n const shapes = getArrowheadShapes(\n element,\n shape,\n \"end\",\n endArrowhead,\n generator,\n options,\n canvasBackgroundColor,\n );\n shape.push(...shapes);\n }\n }\n return shape;\n }\n case \"freedraw\": {\n let shape: ElementShapes[typeof element.type];\n generateFreeDrawShape(element);\n\n if (isPathALoop(element.points)) {\n // generate rough polygon to fill freedraw shape\n const simplifiedPoints = simplify(element.points, 0.75);\n shape = generator.curve(simplifiedPoints as [number, number][], {\n ...generateRoughOptions(element),\n stroke: \"none\",\n });\n } else {\n shape = null;\n }\n return shape;\n }\n case \"frame\":\n case \"magicframe\":\n case \"text\":\n case \"image\": {\n const shape: ElementShapes[typeof element.type] = null;\n // we return (and cache) `null` to make sure we don't regenerate\n // `element.canvas` on rerenders\n return shape;\n }\n default: {\n assertNever(\n element,\n `generateElementShape(): Unimplemented type ${(element as any)?.type}`,\n );\n return null;\n }\n }\n};\n", "import {\n ExcalidrawElement,\n ExcalidrawTextElement,\n NonDeletedExcalidrawElement,\n ExcalidrawFreeDrawElement,\n ExcalidrawImageElement,\n ExcalidrawTextElementWithContainer,\n ExcalidrawFrameLikeElement,\n NonDeletedSceneElementsMap,\n ElementsMap,\n} from \"../element/types\";\nimport {\n isTextElement,\n isLinearElement,\n isFreeDrawElement,\n isInitializedImageElement,\n isArrowElement,\n hasBoundTextElement,\n isMagicFrameElement,\n} from \"../element/typeChecks\";\nimport { getElementAbsoluteCoords } from \"../element/bounds\";\nimport type { RoughCanvas } from \"roughjs/bin/canvas\";\n\nimport {\n StaticCanvasRenderConfig,\n RenderableElementsMap,\n} from \"../scene/types\";\nimport { distance, getFontString, isRTL } from \"../utils\";\nimport { getCornerRadius, isRightAngle } from \"../math\";\nimport rough from \"roughjs/bin/rough\";\nimport {\n AppState,\n StaticCanvasAppState,\n Zoom,\n InteractiveCanvasAppState,\n ElementsPendingErasure,\n} from \"../types\";\nimport { getDefaultAppState } from \"../appState\";\nimport {\n BOUND_TEXT_PADDING,\n ELEMENT_READY_TO_ERASE_OPACITY,\n FRAME_STYLE,\n MIME_TYPES,\n} from \"../constants\";\nimport { getStroke, StrokeOptions } from \"perfect-freehand\";\nimport {\n getBoundTextElement,\n getContainerCoords,\n getContainerElement,\n getLineHeightInPx,\n getBoundTextMaxHeight,\n getBoundTextMaxWidth,\n getVerticalOffset,\n} from \"../element/textElement\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\n\nimport { getContainingFrame } from \"../frame\";\nimport { ShapeCache } from \"../scene/ShapeCache\";\n\n// using a stronger invert (100% vs our regular 93%) and saturate\n// as a temp hack to make images in dark theme look closer to original\n// color scheme (it's still not quite there and the colors look slightly\n// desatured, alas...)\nexport const IMAGE_INVERT_FILTER =\n \"invert(100%) hue-rotate(180deg) saturate(1.25)\";\n\nconst defaultAppState = getDefaultAppState();\n\nconst isPendingImageElement = (\n element: ExcalidrawElement,\n renderConfig: StaticCanvasRenderConfig,\n) =>\n isInitializedImageElement(element) &&\n !renderConfig.imageCache.has(element.fileId);\n\nconst shouldResetImageFilter = (\n element: ExcalidrawElement,\n renderConfig: StaticCanvasRenderConfig,\n appState: StaticCanvasAppState,\n) => {\n return (\n appState.theme === \"dark\" &&\n isInitializedImageElement(element) &&\n !isPendingImageElement(element, renderConfig) &&\n renderConfig.imageCache.get(element.fileId)?.mimeType !== MIME_TYPES.svg\n );\n};\n\nconst getCanvasPadding = (element: ExcalidrawElement) =>\n element.type === \"freedraw\" ? element.strokeWidth * 12 : 20;\n\nexport const getRenderOpacity = (\n element: ExcalidrawElement,\n containingFrame: ExcalidrawFrameLikeElement | null,\n elementsPendingErasure: ElementsPendingErasure,\n) => {\n // multiplying frame opacity with element opacity to combine them\n // (e.g. frame 50% and element 50% opacity should result in 25% opacity)\n let opacity = ((containingFrame?.opacity ?? 100) * element.opacity) / 10000;\n\n // if pending erasure, multiply again to combine further\n // (so that erasing always results in lower opacity than original)\n if (\n elementsPendingErasure.has(element.id) ||\n (containingFrame && elementsPendingErasure.has(containingFrame.id))\n ) {\n opacity *= ELEMENT_READY_TO_ERASE_OPACITY / 100;\n }\n\n return opacity;\n};\n\nexport interface ExcalidrawElementWithCanvas {\n element: ExcalidrawElement | ExcalidrawTextElement;\n canvas: HTMLCanvasElement;\n theme: AppState[\"theme\"];\n scale: number;\n zoomValue: AppState[\"zoom\"][\"value\"];\n canvasOffsetX: number;\n canvasOffsetY: number;\n boundTextElementVersion: number | null;\n containingFrameOpacity: number;\n}\n\nconst cappedElementCanvasSize = (\n element: NonDeletedExcalidrawElement,\n elementsMap: ElementsMap,\n zoom: Zoom,\n): {\n width: number;\n height: number;\n scale: number;\n} => {\n // these limits are ballpark, they depend on specific browsers and device.\n // We've chosen lower limits to be safe. We might want to change these limits\n // based on browser/device type, if we get reports of low quality rendering\n // on zoom.\n //\n // ~ safari mobile canvas area limit\n const AREA_LIMIT = 16777216;\n // ~ safari width/height limit based on developer.mozilla.org.\n const WIDTH_HEIGHT_LIMIT = 32767;\n\n const padding = getCanvasPadding(element);\n\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const elementWidth =\n isLinearElement(element) || isFreeDrawElement(element)\n ? distance(x1, x2)\n : element.width;\n const elementHeight =\n isLinearElement(element) || isFreeDrawElement(element)\n ? distance(y1, y2)\n : element.height;\n\n let width = elementWidth * window.devicePixelRatio + padding * 2;\n let height = elementHeight * window.devicePixelRatio + padding * 2;\n\n let scale: number = zoom.value;\n\n // rescale to ensure width and height is within limits\n if (\n width * scale > WIDTH_HEIGHT_LIMIT ||\n height * scale > WIDTH_HEIGHT_LIMIT\n ) {\n scale = Math.min(WIDTH_HEIGHT_LIMIT / width, WIDTH_HEIGHT_LIMIT / height);\n }\n\n // rescale to ensure canvas area is within limits\n if (width * height * scale * scale > AREA_LIMIT) {\n scale = Math.sqrt(AREA_LIMIT / (width * height));\n }\n\n width = Math.floor(width * scale);\n height = Math.floor(height * scale);\n\n return { width, height, scale };\n};\n\nconst generateElementCanvas = (\n element: NonDeletedExcalidrawElement,\n elementsMap: RenderableElementsMap,\n zoom: Zoom,\n renderConfig: StaticCanvasRenderConfig,\n appState: StaticCanvasAppState,\n): ExcalidrawElementWithCanvas => {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\")!;\n const padding = getCanvasPadding(element);\n\n const { width, height, scale } = cappedElementCanvasSize(\n element,\n elementsMap,\n zoom,\n );\n\n canvas.width = width;\n canvas.height = height;\n\n let canvasOffsetX = 0;\n let canvasOffsetY = 0;\n\n if (isLinearElement(element) || isFreeDrawElement(element)) {\n const [x1, y1] = getElementAbsoluteCoords(element, elementsMap);\n\n canvasOffsetX =\n element.x > x1\n ? distance(element.x, x1) * window.devicePixelRatio * scale\n : 0;\n\n canvasOffsetY =\n element.y > y1\n ? distance(element.y, y1) * window.devicePixelRatio * scale\n : 0;\n\n context.translate(canvasOffsetX, canvasOffsetY);\n }\n\n context.save();\n context.translate(padding * scale, padding * scale);\n context.scale(\n window.devicePixelRatio * scale,\n window.devicePixelRatio * scale,\n );\n\n const rc = rough.canvas(canvas);\n\n // in dark theme, revert the image color filter\n if (shouldResetImageFilter(element, renderConfig, appState)) {\n context.filter = IMAGE_INVERT_FILTER;\n }\n\n drawElementOnCanvas(element, rc, context, renderConfig, appState);\n context.restore();\n\n return {\n element,\n canvas,\n theme: appState.theme,\n scale,\n zoomValue: zoom.value,\n canvasOffsetX,\n canvasOffsetY,\n boundTextElementVersion:\n getBoundTextElement(element, elementsMap)?.version || null,\n containingFrameOpacity:\n getContainingFrame(element, elementsMap)?.opacity || 100,\n };\n};\n\nexport const DEFAULT_LINK_SIZE = 14;\n\nconst IMAGE_PLACEHOLDER_IMG = document.createElement(\"img\");\nIMAGE_PLACEHOLDER_IMG.src = `data:${MIME_TYPES.svg},${encodeURIComponent(\n `<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"image\" class=\"svg-inline--fa fa-image fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"#888\" d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z\"></path></svg>`,\n)}`;\n\nconst IMAGE_ERROR_PLACEHOLDER_IMG = document.createElement(\"img\");\nIMAGE_ERROR_PLACEHOLDER_IMG.src = `data:${MIME_TYPES.svg},${encodeURIComponent(\n `<svg viewBox=\"0 0 668 668\" xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2\"><path d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48ZM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56ZM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.81709 0 0 .81709 124.825 145.825)\"/><path d=\"M256 8C119.034 8 8 119.033 8 256c0 136.967 111.034 248 248 248s248-111.034 248-248S392.967 8 256 8Zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676ZM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.30366 0 0 .30366 506.822 60.065)\"/></svg>`,\n)}`;\n\nconst drawImagePlaceholder = (\n element: ExcalidrawImageElement,\n context: CanvasRenderingContext2D,\n zoomValue: AppState[\"zoom\"][\"value\"],\n) => {\n context.fillStyle = \"#E7E7E7\";\n context.fillRect(0, 0, element.width, element.height);\n\n const imageMinWidthOrHeight = Math.min(element.width, element.height);\n\n const size = Math.min(\n imageMinWidthOrHeight,\n Math.min(imageMinWidthOrHeight * 0.4, 100),\n );\n\n context.drawImage(\n element.status === \"error\"\n ? IMAGE_ERROR_PLACEHOLDER_IMG\n : IMAGE_PLACEHOLDER_IMG,\n element.width / 2 - size / 2,\n element.height / 2 - size / 2,\n size,\n size,\n );\n};\n\nconst drawElementOnCanvas = (\n element: NonDeletedExcalidrawElement,\n rc: RoughCanvas,\n context: CanvasRenderingContext2D,\n renderConfig: StaticCanvasRenderConfig,\n appState: StaticCanvasAppState,\n) => {\n switch (element.type) {\n case \"rectangle\":\n case \"iframe\":\n case \"embeddable\":\n case \"diamond\":\n case \"ellipse\": {\n context.lineJoin = \"round\";\n context.lineCap = \"round\";\n rc.draw(ShapeCache.get(element)!);\n break;\n }\n case \"arrow\":\n case \"line\": {\n context.lineJoin = \"round\";\n context.lineCap = \"round\";\n\n ShapeCache.get(element)!.forEach((shape) => {\n rc.draw(shape);\n });\n break;\n }\n case \"freedraw\": {\n // Draw directly to canvas\n context.save();\n context.fillStyle = element.strokeColor;\n\n const path = getFreeDrawPath2D(element) as Path2D;\n const fillShape = ShapeCache.get(element);\n\n if (fillShape) {\n rc.draw(fillShape);\n }\n\n context.fillStyle = element.strokeColor;\n context.fill(path);\n\n context.restore();\n break;\n }\n case \"image\": {\n const img = isInitializedImageElement(element)\n ? renderConfig.imageCache.get(element.fileId)?.image\n : undefined;\n if (img != null && !(img instanceof Promise)) {\n if (element.roundness && context.roundRect) {\n context.beginPath();\n context.roundRect(\n 0,\n 0,\n element.width,\n element.height,\n getCornerRadius(Math.min(element.width, element.height), element),\n );\n context.clip();\n }\n context.drawImage(\n img,\n 0 /* hardcoded for the selection box*/,\n 0,\n element.width,\n element.height,\n );\n } else {\n drawImagePlaceholder(element, context, appState.zoom.value);\n }\n break;\n }\n default: {\n if (isTextElement(element)) {\n const rtl = isRTL(element.text);\n const shouldTemporarilyAttach = rtl && !context.canvas.isConnected;\n if (shouldTemporarilyAttach) {\n // to correctly render RTL text mixed with LTR, we have to append it\n // to the DOM\n document.body.appendChild(context.canvas);\n }\n context.canvas.setAttribute(\"dir\", rtl ? \"rtl\" : \"ltr\");\n context.save();\n context.font = getFontString(element);\n context.fillStyle = element.strokeColor;\n context.textAlign = element.textAlign as CanvasTextAlign;\n\n // Canvas does not support multiline text by default\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n\n const horizontalOffset =\n element.textAlign === \"center\"\n ? element.width / 2\n : element.textAlign === \"right\"\n ? element.width\n : 0;\n\n const lineHeightPx = getLineHeightInPx(\n element.fontSize,\n element.lineHeight,\n );\n\n const verticalOffset = getVerticalOffset(\n element.fontFamily,\n element.fontSize,\n lineHeightPx,\n );\n\n for (let index = 0; index < lines.length; index++) {\n context.fillText(\n lines[index],\n horizontalOffset,\n index * lineHeightPx + verticalOffset,\n );\n }\n context.restore();\n if (shouldTemporarilyAttach) {\n context.canvas.remove();\n }\n } else {\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n }\n};\n\nexport const elementWithCanvasCache = new WeakMap<\n ExcalidrawElement,\n ExcalidrawElementWithCanvas\n>();\n\nconst generateElementWithCanvas = (\n element: NonDeletedExcalidrawElement,\n elementsMap: RenderableElementsMap,\n renderConfig: StaticCanvasRenderConfig,\n appState: StaticCanvasAppState,\n) => {\n const zoom: Zoom = renderConfig ? appState.zoom : defaultAppState.zoom;\n const prevElementWithCanvas = elementWithCanvasCache.get(element);\n const shouldRegenerateBecauseZoom =\n prevElementWithCanvas &&\n prevElementWithCanvas.zoomValue !== zoom.value &&\n !appState?.shouldCacheIgnoreZoom;\n const boundTextElementVersion =\n getBoundTextElement(element, elementsMap)?.version || null;\n\n const containingFrameOpacity =\n getContainingFrame(element, elementsMap)?.opacity || 100;\n\n if (\n !prevElementWithCanvas ||\n shouldRegenerateBecauseZoom ||\n prevElementWithCanvas.theme !== appState.theme ||\n prevElementWithCanvas.boundTextElementVersion !== boundTextElementVersion ||\n prevElementWithCanvas.containingFrameOpacity !== containingFrameOpacity\n ) {\n const elementWithCanvas = generateElementCanvas(\n element,\n elementsMap,\n zoom,\n renderConfig,\n appState,\n );\n\n elementWithCanvasCache.set(element, elementWithCanvas);\n\n return elementWithCanvas;\n }\n return prevElementWithCanvas;\n};\n\nconst drawElementFromCanvas = (\n elementWithCanvas: ExcalidrawElementWithCanvas,\n context: CanvasRenderingContext2D,\n renderConfig: StaticCanvasRenderConfig,\n appState: StaticCanvasAppState,\n allElementsMap: NonDeletedSceneElementsMap,\n) => {\n const element = elementWithCanvas.element;\n const padding = getCanvasPadding(element);\n const zoom = elementWithCanvas.scale;\n let [x1, y1, x2, y2] = getElementAbsoluteCoords(element, allElementsMap);\n\n // Free draw elements will otherwise \"shuffle\" as the min x and y change\n if (isFreeDrawElement(element)) {\n x1 = Math.floor(x1);\n x2 = Math.ceil(x2);\n y1 = Math.floor(y1);\n y2 = Math.ceil(y2);\n }\n\n const cx = ((x1 + x2) / 2 + appState.scrollX) * window.devicePixelRatio;\n const cy = ((y1 + y2) / 2 + appState.scrollY) * window.devicePixelRatio;\n\n context.save();\n context.scale(1 / window.devicePixelRatio, 1 / window.devicePixelRatio);\n\n const boundTextElement = getBoundTextElement(element, allElementsMap);\n\n if (isArrowElement(element) && boundTextElement) {\n const tempCanvas = document.createElement(\"canvas\");\n const tempCanvasContext = tempCanvas.getContext(\"2d\")!;\n\n // Take max dimensions of arrow canvas so that when canvas is rotated\n // the arrow doesn't get clipped\n const maxDim = Math.max(distance(x1, x2), distance(y1, y2));\n tempCanvas.width =\n maxDim * window.devicePixelRatio * zoom +\n padding * elementWithCanvas.scale * 10;\n tempCanvas.height =\n maxDim * window.devicePixelRatio * zoom +\n padding * elementWithCanvas.scale * 10;\n const offsetX = (tempCanvas.width - elementWithCanvas.canvas!.width) / 2;\n const offsetY = (tempCanvas.height - elementWithCanvas.canvas!.height) / 2;\n\n tempCanvasContext.translate(tempCanvas.width / 2, tempCanvas.height / 2);\n tempCanvasContext.rotate(element.angle);\n\n tempCanvasContext.drawImage(\n elementWithCanvas.canvas!,\n -elementWithCanvas.canvas.width / 2,\n -elementWithCanvas.canvas.height / 2,\n elementWithCanvas.canvas.width,\n elementWithCanvas.canvas.height,\n );\n\n const [, , , , boundTextCx, boundTextCy] = getElementAbsoluteCoords(\n boundTextElement,\n allElementsMap,\n );\n\n tempCanvasContext.rotate(-element.angle);\n\n // Shift the canvas to the center of the bound text element\n const shiftX =\n tempCanvas.width / 2 -\n (boundTextCx - x1) * window.devicePixelRatio * zoom -\n offsetX -\n padding * zoom;\n\n const shiftY =\n tempCanvas.height / 2 -\n (boundTextCy - y1) * window.devicePixelRatio * zoom -\n offsetY -\n padding * zoom;\n tempCanvasContext.translate(-shiftX, -shiftY);\n // Clear the bound text area\n tempCanvasContext.clearRect(\n -(boundTextElement.width / 2 + BOUND_TEXT_PADDING) *\n window.devicePixelRatio *\n zoom,\n -(boundTextElement.height / 2 + BOUND_TEXT_PADDING) *\n window.devicePixelRatio *\n zoom,\n (boundTextElement.width + BOUND_TEXT_PADDING * 2) *\n window.devicePixelRatio *\n zoom,\n (boundTextElement.height + BOUND_TEXT_PADDING * 2) *\n window.devicePixelRatio *\n zoom,\n );\n\n context.translate(cx, cy);\n context.drawImage(\n tempCanvas,\n (-(x2 - x1) / 2) * window.devicePixelRatio - offsetX / zoom - padding,\n (-(y2 - y1) / 2) * window.devicePixelRatio - offsetY / zoom - padding,\n tempCanvas.width / zoom,\n tempCanvas.height / zoom,\n );\n } else {\n // we translate context to element center so that rotation and scale\n // originates from the element center\n context.translate(cx, cy);\n\n context.rotate(element.angle);\n\n if (\n \"scale\" in elementWithCanvas.element &&\n !isPendingImageElement(element, renderConfig)\n ) {\n context.scale(\n elementWithCanvas.element.scale[0],\n elementWithCanvas.element.scale[1],\n );\n }\n\n // revert afterwards we don't have account for it during drawing\n context.translate(-cx, -cy);\n\n context.drawImage(\n elementWithCanvas.canvas!,\n (x1 + appState.scrollX) * window.devicePixelRatio -\n (padding * elementWithCanvas.scale) / elementWithCanvas.scale,\n (y1 + appState.scrollY) * window.devicePixelRatio -\n (padding * elementWithCanvas.scale) / elementWithCanvas.scale,\n elementWithCanvas.canvas!.width / elementWithCanvas.scale,\n elementWithCanvas.canvas!.height / elementWithCanvas.scale,\n );\n\n if (\n import.meta.env.VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX ===\n \"true\" &&\n hasBoundTextElement(element)\n ) {\n const textElement = getBoundTextElement(\n element,\n allElementsMap,\n ) as ExcalidrawTextElementWithContainer;\n const coords = getContainerCoords(element);\n context.strokeStyle = \"#c92a2a\";\n context.lineWidth = 3;\n context.strokeRect(\n (coords.x + appState.scrollX) * window.devicePixelRatio,\n (coords.y + appState.scrollY) * window.devicePixelRatio,\n getBoundTextMaxWidth(element, textElement) * window.devicePixelRatio,\n getBoundTextMaxHeight(element, textElement) * window.devicePixelRatio,\n );\n }\n }\n context.restore();\n\n // Clear the nested element we appended to the DOM\n};\n\nexport const renderSelectionElement = (\n element: NonDeletedExcalidrawElement,\n context: CanvasRenderingContext2D,\n appState: InteractiveCanvasAppState,\n) => {\n context.save();\n context.translate(element.x + appState.scrollX, element.y + appState.scrollY);\n context.fillStyle = \"rgba(0, 0, 200, 0.04)\";\n\n // render from 0.5px offset to get 1px wide line\n // https://stackoverflow.com/questions/7530593/html5-canvas-and-line-width/7531540#7531540\n // TODO can be be improved by offseting to the negative when user selects\n // from right to left\n const offset = 0.5 / appState.zoom.value;\n\n context.fillRect(offset, offset, element.width, element.height);\n context.lineWidth = 1 / appState.zoom.value;\n context.strokeStyle = \" rgb(105, 101, 219)\";\n context.strokeRect(offset, offset, element.width, element.height);\n\n context.restore();\n};\n\nexport const renderElement = (\n element: NonDeletedExcalidrawElement,\n elementsMap: RenderableElementsMap,\n allElementsMap: NonDeletedSceneElementsMap,\n rc: RoughCanvas,\n context: CanvasRenderingContext2D,\n renderConfig: StaticCanvasRenderConfig,\n appState: StaticCanvasAppState,\n) => {\n context.globalAlpha = getRenderOpacity(\n element,\n getContainingFrame(element, elementsMap),\n renderConfig.elementsPendingErasure,\n );\n\n switch (element.type) {\n case \"magicframe\":\n case \"frame\": {\n if (appState.frameRendering.enabled && appState.frameRendering.outline) {\n context.save();\n context.translate(\n element.x + appState.scrollX,\n element.y + appState.scrollY,\n );\n context.fillStyle = \"rgba(0, 0, 200, 0.04)\";\n\n context.lineWidth = FRAME_STYLE.strokeWidth / appState.zoom.value;\n context.strokeStyle = FRAME_STYLE.strokeColor;\n\n // TODO change later to only affect AI frames\n if (isMagicFrameElement(element)) {\n context.strokeStyle =\n appState.theme === \"light\" ? \"#7affd7\" : \"#1d8264\";\n }\n\n if (FRAME_STYLE.radius && context.roundRect) {\n context.beginPath();\n context.roundRect(\n 0,\n 0,\n element.width,\n element.height,\n FRAME_STYLE.radius / appState.zoom.value,\n );\n context.stroke();\n context.closePath();\n } else {\n context.strokeRect(0, 0, element.width, element.height);\n }\n\n context.restore();\n }\n break;\n }\n case \"freedraw\": {\n // TODO investigate if we can do this in situ. Right now we need to call\n // beforehand because math helpers (such as getElementAbsoluteCoords)\n // rely on existing shapes\n ShapeCache.generateElementShape(element, null);\n\n if (renderConfig.isExporting) {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x1 + x2) / 2 + appState.scrollX;\n const cy = (y1 + y2) / 2 + appState.scrollY;\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\n context.save();\n context.translate(cx, cy);\n context.rotate(element.angle);\n context.translate(-shiftX, -shiftY);\n drawElementOnCanvas(element, rc, context, renderConfig, appState);\n context.restore();\n } else {\n const elementWithCanvas = generateElementWithCanvas(\n element,\n elementsMap,\n renderConfig,\n appState,\n );\n drawElementFromCanvas(\n elementWithCanvas,\n context,\n renderConfig,\n appState,\n allElementsMap,\n );\n }\n\n break;\n }\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\":\n case \"line\":\n case \"arrow\":\n case \"image\":\n case \"text\":\n case \"iframe\":\n case \"embeddable\": {\n // TODO investigate if we can do this in situ. Right now we need to call\n // beforehand because math helpers (such as getElementAbsoluteCoords)\n // rely on existing shapes\n ShapeCache.generateElementShape(element, renderConfig);\n if (renderConfig.isExporting) {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x1 + x2) / 2 + appState.scrollX;\n const cy = (y1 + y2) / 2 + appState.scrollY;\n let shiftX = (x2 - x1) / 2 - (element.x - x1);\n let shiftY = (y2 - y1) / 2 - (element.y - y1);\n if (isTextElement(element)) {\n const container = getContainerElement(element, elementsMap);\n if (isArrowElement(container)) {\n const boundTextCoords =\n LinearElementEditor.getBoundTextElementPosition(\n container,\n element as ExcalidrawTextElementWithContainer,\n elementsMap,\n );\n shiftX = (x2 - x1) / 2 - (boundTextCoords.x - x1);\n shiftY = (y2 - y1) / 2 - (boundTextCoords.y - y1);\n }\n }\n context.save();\n context.translate(cx, cy);\n\n if (shouldResetImageFilter(element, renderConfig, appState)) {\n context.filter = \"none\";\n }\n const boundTextElement = getBoundTextElement(element, elementsMap);\n\n if (isArrowElement(element) && boundTextElement) {\n const tempCanvas = document.createElement(\"canvas\");\n\n const tempCanvasContext = tempCanvas.getContext(\"2d\")!;\n\n // Take max dimensions of arrow canvas so that when canvas is rotated\n // the arrow doesn't get clipped\n const maxDim = Math.max(distance(x1, x2), distance(y1, y2));\n const padding = getCanvasPadding(element);\n tempCanvas.width =\n maxDim * appState.exportScale + padding * 10 * appState.exportScale;\n tempCanvas.height =\n maxDim * appState.exportScale + padding * 10 * appState.exportScale;\n\n tempCanvasContext.translate(\n tempCanvas.width / 2,\n tempCanvas.height / 2,\n );\n tempCanvasContext.scale(appState.exportScale, appState.exportScale);\n\n // Shift the canvas to left most point of the arrow\n shiftX = element.width / 2 - (element.x - x1);\n shiftY = element.height / 2 - (element.y - y1);\n\n tempCanvasContext.rotate(element.angle);\n const tempRc = rough.canvas(tempCanvas);\n\n tempCanvasContext.translate(-shiftX, -shiftY);\n\n drawElementOnCanvas(\n element,\n tempRc,\n tempCanvasContext,\n renderConfig,\n appState,\n );\n\n tempCanvasContext.translate(shiftX, shiftY);\n\n tempCanvasContext.rotate(-element.angle);\n\n // Shift the canvas to center of bound text\n const [, , , , boundTextCx, boundTextCy] = getElementAbsoluteCoords(\n boundTextElement,\n elementsMap,\n );\n const boundTextShiftX = (x1 + x2) / 2 - boundTextCx;\n const boundTextShiftY = (y1 + y2) / 2 - boundTextCy;\n tempCanvasContext.translate(-boundTextShiftX, -boundTextShiftY);\n\n // Clear the bound text area\n tempCanvasContext.clearRect(\n -boundTextElement.width / 2,\n -boundTextElement.height / 2,\n boundTextElement.width,\n boundTextElement.height,\n );\n context.scale(1 / appState.exportScale, 1 / appState.exportScale);\n context.drawImage(\n tempCanvas,\n -tempCanvas.width / 2,\n -tempCanvas.height / 2,\n tempCanvas.width,\n tempCanvas.height,\n );\n } else {\n context.rotate(element.angle);\n\n if (element.type === \"image\") {\n // note: scale must be applied *after* rotating\n context.scale(element.scale[0], element.scale[1]);\n }\n\n context.translate(-shiftX, -shiftY);\n drawElementOnCanvas(element, rc, context, renderConfig, appState);\n }\n\n context.restore();\n // not exporting \u2192 optimized rendering (cache & render from element\n // canvases)\n } else {\n const elementWithCanvas = generateElementWithCanvas(\n element,\n elementsMap,\n renderConfig,\n appState,\n );\n\n const currentImageSmoothingStatus = context.imageSmoothingEnabled;\n\n if (\n // do not disable smoothing during zoom as blurry shapes look better\n // on low resolution (while still zooming in) than sharp ones\n !appState?.shouldCacheIgnoreZoom &&\n // angle is 0 -> always disable smoothing\n (!element.angle ||\n // or check if angle is a right angle in which case we can still\n // disable smoothing without adversely affecting the result\n isRightAngle(element.angle))\n ) {\n // Disabling smoothing makes output much sharper, especially for\n // text. Unless for non-right angles, where the aliasing is really\n // terrible on Chromium.\n //\n // Note that `context.imageSmoothingQuality=\"high\"` has almost\n // zero effect.\n //\n context.imageSmoothingEnabled = false;\n }\n\n drawElementFromCanvas(\n elementWithCanvas,\n context,\n renderConfig,\n appState,\n allElementsMap,\n );\n\n // reset\n context.imageSmoothingEnabled = currentImageSmoothingStatus;\n }\n break;\n }\n default: {\n // @ts-ignore\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n\n context.globalAlpha = 1;\n};\n\nexport const pathsCache = new WeakMap<ExcalidrawFreeDrawElement, Path2D>([]);\n\nexport function generateFreeDrawShape(element: ExcalidrawFreeDrawElement) {\n const svgPathData = getFreeDrawSvgPath(element);\n const path = new Path2D(svgPathData);\n pathsCache.set(element, path);\n return path;\n}\n\nexport function getFreeDrawPath2D(element: ExcalidrawFreeDrawElement) {\n return pathsCache.get(element);\n}\n\nexport function getFreeDrawSvgPath(element: ExcalidrawFreeDrawElement) {\n // If input points are empty (should they ever be?) return a dot\n const inputPoints = element.simulatePressure\n ? element.points\n : element.points.length\n ? element.points.map(([x, y], i) => [x, y, element.pressures[i]])\n : [[0, 0, 0.5]];\n\n // Consider changing the options for simulated pressure vs real pressure\n const options: StrokeOptions = {\n simulatePressure: element.simulatePressure,\n size: element.strokeWidth * 4.25,\n thinning: 0.6,\n smoothing: 0.5,\n streamline: 0.5,\n easing: (t) => Math.sin((t * Math.PI) / 2), // https://easings.net/#easeOutSine\n last: !!element.lastCommittedPoint, // LastCommittedPoint is added on pointerup\n };\n\n return getSvgPathFromStroke(getStroke(inputPoints as number[][], options));\n}\n\nfunction med(A: number[], B: number[]) {\n return [(A[0] + B[0]) / 2, (A[1] + B[1]) / 2];\n}\n\n// Trim SVG path data so number are each two decimal points. This\n// improves SVG exports, and prevents rendering errors on points\n// with long decimals.\nconst TO_FIXED_PRECISION = /(\\s?[A-Z]?,?-?[0-9]*\\.[0-9]{0,2})(([0-9]|e|-)*)/g;\n\nfunction getSvgPathFromStroke(points: number[][]): string {\n if (!points.length) {\n return \"\";\n }\n\n const max = points.length - 1;\n\n return points\n .reduce(\n (acc, point, i, arr) => {\n if (i === max) {\n acc.push(point, med(point, arr[0]), \"L\", arr[0], \"Z\");\n } else {\n acc.push(point, med(point, arr[i + 1]));\n }\n return acc;\n },\n [\"M\", points[0], \"Q\"],\n )\n .join(\" \")\n .replace(TO_FIXED_PRECISION, \"$1\");\n}\n", "function $(e,t,u,x=h=>h){return e*x(.5-t*(.5-u))}function se(e){return[-e[0],-e[1]]}function l(e,t){return[e[0]+t[0],e[1]+t[1]]}function a(e,t){return[e[0]-t[0],e[1]-t[1]]}function b(e,t){return[e[0]*t,e[1]*t]}function he(e,t){return[e[0]/t,e[1]/t]}function R(e){return[e[1],-e[0]]}function B(e,t){return e[0]*t[0]+e[1]*t[1]}function ue(e,t){return e[0]===t[0]&&e[1]===t[1]}function ge(e){return Math.hypot(e[0],e[1])}function de(e){return e[0]*e[0]+e[1]*e[1]}function A(e,t){return de(a(e,t))}function G(e){return he(e,ge(e))}function ie(e,t){return Math.hypot(e[1]-t[1],e[0]-t[0])}function L(e,t,u){let x=Math.sin(u),h=Math.cos(u),y=e[0]-t[0],n=e[1]-t[1],f=y*h-n*x,d=y*x+n*h;return[f+t[0],d+t[1]]}function K(e,t,u){return l(e,b(a(t,e),u))}function ee(e,t,u){return l(e,b(t,u))}var{min:C,PI:xe}=Math,pe=.275,V=xe+1e-4;function ce(e,t={}){let{size:u=16,smoothing:x=.5,thinning:h=.5,simulatePressure:y=!0,easing:n=r=>r,start:f={},end:d={},last:D=!1}=t,{cap:S=!0,easing:j=r=>r*(2-r)}=f,{cap:q=!0,easing:c=r=>--r*r*r+1}=d;if(e.length===0||u<=0)return[];let p=e[e.length-1].runningLength,g=f.taper===!1?0:f.taper===!0?Math.max(u,p):f.taper,T=d.taper===!1?0:d.taper===!0?Math.max(u,p):d.taper,te=Math.pow(u*x,2),_=[],M=[],H=e.slice(0,10).reduce((r,i)=>{let o=i.pressure;if(y){let s=C(1,i.distance/u),W=C(1,1-s);o=C(1,r+(W-r)*(s*pe))}return(r+o)/2},e[0].pressure),m=$(u,h,e[e.length-1].pressure,n),U,X=e[0].vector,z=e[0].point,F=z,O=z,E=F,J=!1;for(let r=0;r<e.length;r++){let{pressure:i}=e[r],{point:o,vector:s,distance:W,runningLength:I}=e[r];if(r<e.length-1&&p-I<3)continue;if(h){if(y){let v=C(1,W/u),Z=C(1,1-v);i=C(1,H+(Z-H)*(v*pe))}m=$(u,h,i,n)}else m=u/2;U===void 0&&(U=m);let le=I<g?j(I/g):1,fe=p-I<T?c((p-I)/T):1;m=Math.max(.01,m*Math.min(le,fe));let re=(r<e.length-1?e[r+1]:e[r]).vector,Y=r<e.length-1?B(s,re):1,be=B(s,X)<0&&!J,ne=Y!==null&&Y<0;if(be||ne){let v=b(R(X),m);for(let Z=1/13,w=0;w<=1;w+=Z)O=L(a(o,v),o,V*w),_.push(O),E=L(l(o,v),o,V*-w),M.push(E);z=O,F=E,ne&&(J=!0);continue}if(J=!1,r===e.length-1){let v=b(R(s),m);_.push(a(o,v)),M.push(l(o,v));continue}let oe=b(R(K(re,s,Y)),m);O=a(o,oe),(r<=1||A(z,O)>te)&&(_.push(O),z=O),E=l(o,oe),(r<=1||A(F,E)>te)&&(M.push(E),F=E),H=i,X=s}let P=e[0].point.slice(0,2),k=e.length>1?e[e.length-1].point.slice(0,2):l(e[0].point,[1,1]),Q=[],N=[];if(e.length===1){if(!(g||T)||D){let r=ee(P,G(R(a(P,k))),-(U||m)),i=[];for(let o=1/13,s=o;s<=1;s+=o)i.push(L(r,P,V*2*s));return i}}else{if(!(g||T&&e.length===1))if(S)for(let i=1/13,o=i;o<=1;o+=i){let s=L(M[0],P,V*o);Q.push(s)}else{let i=a(_[0],M[0]),o=b(i,.5),s=b(i,.51);Q.push(a(P,o),a(P,s),l(P,s),l(P,o))}let r=R(se(e[e.length-1].vector));if(T||g&&e.length===1)N.push(k);else if(q){let i=ee(k,r,m);for(let o=1/29,s=o;s<1;s+=o)N.push(L(i,k,V*3*s))}else N.push(l(k,b(r,m)),l(k,b(r,m*.99)),a(k,b(r,m*.99)),a(k,b(r,m)))}return _.concat(N,M.reverse(),Q)}function me(e,t={}){var q;let{streamline:u=.5,size:x=16,last:h=!1}=t;if(e.length===0)return[];let y=.15+(1-u)*.85,n=Array.isArray(e[0])?e:e.map(({x:c,y:p,pressure:g=.5})=>[c,p,g]);if(n.length===2){let c=n[1];n=n.slice(0,-1);for(let p=1;p<5;p++)n.push(K(n[0],c,p/4))}n.length===1&&(n=[...n,[...l(n[0],[1,1]),...n[0].slice(2)]]);let f=[{point:[n[0][0],n[0][1]],pressure:n[0][2]>=0?n[0][2]:.25,vector:[1,1],distance:0,runningLength:0}],d=!1,D=0,S=f[0],j=n.length-1;for(let c=1;c<n.length;c++){let p=h&&c===j?n[c].slice(0,2):K(S.point,n[c],y);if(ue(S.point,p))continue;let g=ie(p,S.point);if(D+=g,c<j&&!d){if(D<x)continue;d=!0}S={point:p,pressure:n[c][2]>=0?n[c][2]:.5,vector:G(a(S.point,p)),distance:g,runningLength:D},f.push(S)}return f[0].vector=((q=f[1])==null?void 0:q.vector)||[0,0],f}function ae(e,t={}){return ce(me(e,t),t)}var _e=ae;export{_e as default,ae as getStroke,ce as getStrokeOutlinePoints,me as getStrokePoints};\n", "import { getFontString, arrayToMap, isTestEnv, normalizeEOL } from \"../utils\";\nimport {\n ElementsMap,\n ExcalidrawElement,\n ExcalidrawElementType,\n ExcalidrawTextContainer,\n ExcalidrawTextElement,\n ExcalidrawTextElementWithContainer,\n FontFamilyValues,\n FontString,\n NonDeletedExcalidrawElement,\n} from \"./types\";\nimport { mutateElement } from \"./mutateElement\";\nimport {\n ARROW_LABEL_FONT_SIZE_TO_MIN_WIDTH_RATIO,\n ARROW_LABEL_WIDTH_FRACTION,\n BOUND_TEXT_PADDING,\n DEFAULT_FONT_FAMILY,\n DEFAULT_FONT_SIZE,\n FONT_FAMILY,\n TEXT_ALIGN,\n VERTICAL_ALIGN,\n} from \"../constants\";\nimport { MaybeTransformHandleType } from \"./transformHandles\";\nimport { isTextElement } from \".\";\nimport { isBoundToContainer, isArrowElement } from \"./typeChecks\";\nimport { LinearElementEditor } from \"./linearElementEditor\";\nimport { AppState } from \"../types\";\nimport { isTextBindableContainer } from \"./typeChecks\";\nimport { getElementAbsoluteCoords } from \".\";\nimport { getSelectedElements } from \"../scene\";\nimport { isHittingElementNotConsideringBoundingBox } from \"./collision\";\n\nimport { ExtractSetType, MakeBrand } from \"../utility-types\";\nimport {\n resetOriginalContainerCache,\n updateOriginalContainerCache,\n} from \"./containerCache\";\n\nexport const normalizeText = (text: string) => {\n return (\n normalizeEOL(text)\n // replace tabs with spaces so they render and measure correctly\n .replace(/\\t/g, \" \")\n );\n};\n\nconst splitIntoLines = (text: string) => {\n return normalizeText(text).split(\"\\n\");\n};\n\nexport const redrawTextBoundingBox = (\n textElement: ExcalidrawTextElement,\n container: ExcalidrawElement | null,\n elementsMap: ElementsMap,\n) => {\n let maxWidth = undefined;\n const boundTextUpdates = {\n x: textElement.x,\n y: textElement.y,\n text: textElement.text,\n width: textElement.width,\n height: textElement.height,\n };\n\n boundTextUpdates.text = textElement.text;\n\n if (container) {\n maxWidth = getBoundTextMaxWidth(container, textElement);\n boundTextUpdates.text = wrapText(\n textElement.originalText,\n getFontString(textElement),\n maxWidth,\n );\n }\n const metrics = measureText(\n boundTextUpdates.text,\n getFontString(textElement),\n textElement.lineHeight,\n );\n\n boundTextUpdates.width = metrics.width;\n boundTextUpdates.height = metrics.height;\n\n if (container) {\n const maxContainerHeight = getBoundTextMaxHeight(\n container,\n textElement as ExcalidrawTextElementWithContainer,\n );\n const maxContainerWidth = getBoundTextMaxWidth(container, textElement);\n\n if (!isArrowElement(container) && metrics.height > maxContainerHeight) {\n const nextHeight = computeContainerDimensionForBoundText(\n metrics.height,\n container.type,\n );\n mutateElement(container, { height: nextHeight });\n updateOriginalContainerCache(container.id, nextHeight);\n }\n if (metrics.width > maxContainerWidth) {\n const nextWidth = computeContainerDimensionForBoundText(\n metrics.width,\n container.type,\n );\n mutateElement(container, { width: nextWidth });\n }\n const updatedTextElement = {\n ...textElement,\n ...boundTextUpdates,\n } as ExcalidrawTextElementWithContainer;\n const { x, y } = computeBoundTextPosition(\n container,\n updatedTextElement,\n elementsMap,\n );\n boundTextUpdates.x = x;\n boundTextUpdates.y = y;\n }\n\n mutateElement(textElement, boundTextUpdates);\n};\n\nexport const bindTextToShapeAfterDuplication = (\n newElements: ExcalidrawElement[],\n oldElements: ExcalidrawElement[],\n oldIdToDuplicatedId: Map<ExcalidrawElement[\"id\"], ExcalidrawElement[\"id\"]>,\n): void => {\n const newElementsMap = arrayToMap(newElements) as Map<\n ExcalidrawElement[\"id\"],\n ExcalidrawElement\n >;\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id) as string;\n const boundTextElementId = getBoundTextElementId(element);\n\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = newElementsMap.get(newElementId);\n if (newContainer) {\n mutateElement(newContainer, {\n boundElements: (element.boundElements || [])\n .filter(\n (boundElement) =>\n boundElement.id !== newTextElementId &&\n boundElement.id !== boundTextElementId,\n )\n .concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = newElementsMap.get(newTextElementId);\n if (newTextElement && isTextElement(newTextElement)) {\n mutateElement(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\n\nexport const handleBindTextResize = (\n container: NonDeletedExcalidrawElement,\n elementsMap: ElementsMap,\n transformHandleType: MaybeTransformHandleType,\n shouldMaintainAspectRatio = false,\n) => {\n const boundTextElementId = getBoundTextElementId(container);\n if (!boundTextElementId) {\n return;\n }\n resetOriginalContainerCache(container.id);\n const textElement = getBoundTextElement(container, elementsMap);\n if (textElement && textElement.text) {\n if (!container) {\n return;\n }\n\n let text = textElement.text;\n let nextHeight = textElement.height;\n let nextWidth = textElement.width;\n const maxWidth = getBoundTextMaxWidth(container, textElement);\n const maxHeight = getBoundTextMaxHeight(container, textElement);\n let containerHeight = container.height;\n if (\n shouldMaintainAspectRatio ||\n (transformHandleType !== \"n\" && transformHandleType !== \"s\")\n ) {\n if (text) {\n text = wrapText(\n textElement.originalText,\n getFontString(textElement),\n maxWidth,\n );\n }\n const metrics = measureText(\n text,\n getFontString(textElement),\n textElement.lineHeight,\n );\n nextHeight = metrics.height;\n nextWidth = metrics.width;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = computeContainerDimensionForBoundText(\n nextHeight,\n container.type,\n );\n\n const diff = containerHeight - container.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY =\n !isArrowElement(container) &&\n (transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\")\n ? container.y - diff\n : container.y;\n mutateElement(container, {\n height: containerHeight,\n y: updatedY,\n });\n }\n\n mutateElement(textElement, {\n text,\n width: nextWidth,\n height: nextHeight,\n });\n\n if (!isArrowElement(container)) {\n mutateElement(\n textElement,\n computeBoundTextPosition(container, textElement, elementsMap),\n );\n }\n }\n};\n\nexport const computeBoundTextPosition = (\n container: ExcalidrawElement,\n boundTextElement: ExcalidrawTextElementWithContainer,\n elementsMap: ElementsMap,\n) => {\n if (isArrowElement(container)) {\n return LinearElementEditor.getBoundTextElementPosition(\n container,\n boundTextElement,\n elementsMap,\n );\n }\n const containerCoords = getContainerCoords(container);\n const maxContainerHeight = getBoundTextMaxHeight(container, boundTextElement);\n const maxContainerWidth = getBoundTextMaxWidth(container, boundTextElement);\n\n let x;\n let y;\n if (boundTextElement.verticalAlign === VERTICAL_ALIGN.TOP) {\n y = containerCoords.y;\n } else if (boundTextElement.verticalAlign === VERTICAL_ALIGN.BOTTOM) {\n y = containerCoords.y + (maxContainerHeight - boundTextElement.height);\n } else {\n y =\n containerCoords.y +\n (maxContainerHeight / 2 - boundTextElement.height / 2);\n }\n if (boundTextElement.textAlign === TEXT_ALIGN.LEFT) {\n x = containerCoords.x;\n } else if (boundTextElement.textAlign === TEXT_ALIGN.RIGHT) {\n x = containerCoords.x + (maxContainerWidth - boundTextElement.width);\n } else {\n x =\n containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);\n }\n return { x, y };\n};\n\nexport const measureText = (\n text: string,\n font: FontString,\n lineHeight: ExcalidrawTextElement[\"lineHeight\"],\n) => {\n text = text\n .split(\"\\n\")\n // replace empty lines with single space because leading/trailing empty\n // lines would be stripped from computation\n .map((x) => x || \" \")\n .join(\"\\n\");\n const fontSize = parseFloat(font);\n const height = getTextHeight(text, fontSize, lineHeight);\n const width = getTextWidth(text, font);\n return { width, height };\n};\n\n/**\n * To get unitless line-height (if unknown) we can calculate it by dividing\n * height-per-line by fontSize.\n */\nexport const detectLineHeight = (textElement: ExcalidrawTextElement) => {\n const lineCount = splitIntoLines(textElement.text).length;\n return (textElement.height /\n lineCount /\n textElement.fontSize) as ExcalidrawTextElement[\"lineHeight\"];\n};\n\n/**\n * We calculate the line height from the font size and the unitless line height,\n * aligning with the W3C spec.\n */\nexport const getLineHeightInPx = (\n fontSize: ExcalidrawTextElement[\"fontSize\"],\n lineHeight: ExcalidrawTextElement[\"lineHeight\"],\n) => {\n return fontSize * lineHeight;\n};\n\n/**\n * Calculates vertical offset for a text with alphabetic baseline.\n */\nexport const getVerticalOffset = (\n fontFamily: ExcalidrawTextElement[\"fontFamily\"],\n fontSize: ExcalidrawTextElement[\"fontSize\"],\n lineHeightPx: number,\n) => {\n const { unitsPerEm, ascender, descender } =\n FONT_METRICS[fontFamily] || FONT_METRICS[FONT_FAMILY.Helvetica];\n\n const fontSizeEm = fontSize / unitsPerEm;\n const lineGap = lineHeightPx - fontSizeEm * ascender + fontSizeEm * descender;\n\n const verticalOffset = fontSizeEm * ascender + lineGap;\n return verticalOffset;\n};\n\n// FIXME rename to getApproxMinContainerHeight\nexport const getApproxMinLineHeight = (\n fontSize: ExcalidrawTextElement[\"fontSize\"],\n lineHeight: ExcalidrawTextElement[\"lineHeight\"],\n) => {\n return getLineHeightInPx(fontSize, lineHeight) + BOUND_TEXT_PADDING * 2;\n};\n\nlet canvas: HTMLCanvasElement | undefined;\n\nconst getLineWidth = (text: string, font: FontString) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\")!;\n canvas2dContext.font = font;\n const width = canvas2dContext.measureText(text).width;\n\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if (isTestEnv()) {\n return width * 10;\n }\n return width;\n};\n\nexport const getTextWidth = (text: string, font: FontString) => {\n const lines = splitIntoLines(text);\n let width = 0;\n lines.forEach((line) => {\n width = Math.max(width, getLineWidth(line, font));\n });\n return width;\n};\n\nexport const getTextHeight = (\n text: string,\n fontSize: number,\n lineHeight: ExcalidrawTextElement[\"lineHeight\"],\n) => {\n const lineCount = splitIntoLines(text).length;\n return getLineHeightInPx(fontSize, lineHeight) * lineCount;\n};\n\nexport const parseTokens = (text: string) => {\n // Splitting words containing \"-\" as those are treated as separate words\n // by css wrapping algorithm eg non-profit => non-, profit\n const words = text.split(\"-\");\n if (words.length > 1) {\n // non-proft org => ['non-', 'profit org']\n words.forEach((word, index) => {\n if (index !== words.length - 1) {\n words[index] = word += \"-\";\n }\n });\n }\n // Joining the words with space and splitting them again with space to get the\n // final list of tokens\n // ['non-', 'profit org'] =>,'non- proft org' => ['non-','profit','org']\n return words.join(\" \").split(\" \");\n};\n\nexport const wrapText = (text: string, font: FontString, maxWidth: number) => {\n // if maxWidth is not finite or NaN which can happen in case of bugs in\n // computation, we need to make sure we don't continue as we'll end up\n // in an infinite loop\n if (!Number.isFinite(maxWidth) || maxWidth < 0) {\n return text;\n }\n\n const lines: Array<string> = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getLineWidth(\" \", font);\n\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n\n const push = (str: string) => {\n if (str.trim()) {\n lines.push(str);\n }\n };\n\n const resetParams = () => {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n };\n originalLines.forEach((originalLine) => {\n const currentLineWidth = getTextWidth(originalLine, font);\n\n // Push the line if its <= maxWidth\n if (currentLineWidth <= maxWidth) {\n lines.push(originalLine);\n return; // continue\n }\n\n const words = parseTokens(originalLine);\n resetParams();\n\n let index = 0;\n\n while (index < words.length) {\n const currentWordWidth = getLineWidth(words[index], font);\n\n // This will only happen when single word takes entire width\n if (currentWordWidth === maxWidth) {\n push(words[index]);\n index++;\n }\n\n // Start breaking longer words exceeding max width\n else if (currentWordWidth > maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n\n push(currentLine);\n\n resetParams();\n\n while (words[index].length > 0) {\n const currentChar = String.fromCodePoint(\n words[index].codePointAt(0)!,\n );\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(currentChar.length);\n\n if (currentLineWidthTillNow >= maxWidth) {\n push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n } else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n push(currentLine);\n resetParams();\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line unless the line ends with hyphen to sync\n // with css word-wrap\n } else if (!currentLine.endsWith(\"-\")) {\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n index++;\n } else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n\n if (currentLineWidthTillNow > maxWidth) {\n push(currentLine);\n resetParams();\n\n break;\n }\n index++;\n\n // if word ends with \"-\" then we don't need to add space\n // to sync with css word-wrap\n const shouldAppendSpace = !word.endsWith(\"-\");\n currentLine += word;\n\n if (shouldAppendSpace) {\n currentLine += \" \";\n }\n\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n if (shouldAppendSpace) {\n lines.push(currentLine.slice(0, -1));\n } else {\n lines.push(currentLine);\n }\n resetParams();\n break;\n }\n }\n }\n }\n if (currentLine.slice(-1) === \" \") {\n // only remove last trailing space which we have added when joining words\n currentLine = currentLine.slice(0, -1);\n push(currentLine);\n }\n });\n return lines.join(\"\\n\");\n};\n\nexport const charWidth = (() => {\n const cachedCharWidth: { [key: FontString]: Array<number> } = {};\n\n const calculate = (char: string, font: FontString) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getLineWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n\n return cachedCharWidth[font][ascii];\n };\n\n const getCache = (font: FontString) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\n\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\n\n// FIXME rename to getApproxMinContainerWidth\nexport const getApproxMinLineWidth = (\n font: FontString,\n lineHeight: ExcalidrawTextElement[\"lineHeight\"],\n) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (\n measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font, lineHeight).width +\n BOUND_TEXT_PADDING * 2\n );\n }\n return maxCharWidth + BOUND_TEXT_PADDING * 2;\n};\n\nexport const getMinCharWidth = (font: FontString) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n\n return Math.min(...cacheWithOutEmpty);\n};\n\nexport const getMaxCharWidth = (font: FontString) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\n\nexport const getApproxCharsToFitInWidth = (font: FontString, width: number) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getLineWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getLineWidth(str, font);\n }\n return str.length;\n};\n\nexport const getBoundTextElementId = (container: ExcalidrawElement | null) => {\n return container?.boundElements?.length\n ? container?.boundElements?.filter((ele) => ele.type === \"text\")[0]?.id ||\n null\n : null;\n};\n\nexport const getBoundTextElement = (\n element: ExcalidrawElement | null,\n elementsMap: ElementsMap,\n) => {\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n\n if (boundTextElementId) {\n return (elementsMap.get(boundTextElementId) ||\n null) as ExcalidrawTextElementWithContainer | null;\n }\n return null;\n};\n\nexport const getContainerElement = (\n element: ExcalidrawTextElement | null,\n elementsMap: ElementsMap,\n): ExcalidrawTextContainer | null => {\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return (elementsMap.get(element.containerId) ||\n null) as ExcalidrawTextContainer | null;\n }\n return null;\n};\n\nexport const getContainerCenter = (\n container: ExcalidrawElement,\n appState: AppState,\n elementsMap: ElementsMap,\n) => {\n if (!isArrowElement(container)) {\n return {\n x: container.x + container.width / 2,\n y: container.y + container.height / 2,\n };\n }\n const points = LinearElementEditor.getPointsGlobalCoordinates(\n container,\n elementsMap,\n );\n if (points.length % 2 === 1) {\n const index = Math.floor(container.points.length / 2);\n const midPoint = LinearElementEditor.getPointGlobalCoordinates(\n container,\n container.points[index],\n elementsMap,\n );\n return { x: midPoint[0], y: midPoint[1] };\n }\n const index = container.points.length / 2 - 1;\n let midSegmentMidpoint = LinearElementEditor.getEditorMidPoints(\n container,\n elementsMap,\n appState,\n )[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = LinearElementEditor.getSegmentMidPoint(\n container,\n points[index],\n points[index + 1],\n index + 1,\n elementsMap,\n );\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\n\nexport const getContainerCoords = (container: NonDeletedExcalidrawElement) => {\n let offsetX = BOUND_TEXT_PADDING;\n let offsetY = BOUND_TEXT_PADDING;\n\n if (container.type === \"ellipse\") {\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6172\n offsetX += (container.width / 2) * (1 - Math.sqrt(2) / 2);\n offsetY += (container.height / 2) * (1 - Math.sqrt(2) / 2);\n }\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6265\n if (container.type === \"diamond\") {\n offsetX += container.width / 4;\n offsetY += container.height / 4;\n }\n return {\n x: container.x + offsetX,\n y: container.y + offsetY,\n };\n};\n\nexport const getTextElementAngle = (\n textElement: ExcalidrawTextElement,\n container: ExcalidrawTextContainer | null,\n) => {\n if (!container || isArrowElement(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\n\nexport const getBoundTextElementPosition = (\n container: ExcalidrawElement,\n boundTextElement: ExcalidrawTextElementWithContainer,\n elementsMap: ElementsMap,\n) => {\n if (isArrowElement(container)) {\n return LinearElementEditor.getBoundTextElementPosition(\n container,\n boundTextElement,\n elementsMap,\n );\n }\n};\n\nexport const shouldAllowVerticalAlign = (\n selectedElements: NonDeletedExcalidrawElement[],\n elementsMap: ElementsMap,\n) => {\n return selectedElements.some((element) => {\n if (isBoundToContainer(element)) {\n const container = getContainerElement(element, elementsMap);\n if (isArrowElement(container)) {\n return false;\n }\n return true;\n }\n return false;\n });\n};\n\nexport const suppportsHorizontalAlign = (\n selectedElements: NonDeletedExcalidrawElement[],\n elementsMap: ElementsMap,\n) => {\n return selectedElements.some((element) => {\n if (isBoundToContainer(element)) {\n const container = getContainerElement(element, elementsMap);\n if (isArrowElement(container)) {\n return false;\n }\n return true;\n }\n\n return isTextElement(element);\n });\n};\n\nexport const getTextBindableContainerAtPosition = (\n elements: readonly ExcalidrawElement[],\n appState: AppState,\n x: number,\n y: number,\n elementsMap: ElementsMap,\n): ExcalidrawTextContainer | null => {\n const selectedElements = getSelectedElements(elements, appState);\n if (selectedElements.length === 1) {\n return isTextBindableContainer(selectedElements[0], false)\n ? selectedElements[0]\n : null;\n }\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n for (let index = elements.length - 1; index >= 0; --index) {\n if (elements[index].isDeleted) {\n continue;\n }\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(\n elements[index],\n elementsMap,\n );\n if (\n isArrowElement(elements[index]) &&\n isHittingElementNotConsideringBoundingBox(\n elements[index],\n appState,\n null,\n [x, y],\n elementsMap,\n )\n ) {\n hitElement = elements[index];\n break;\n } else if (x1 < x && x < x2 && y1 < y && y < y2) {\n hitElement = elements[index];\n break;\n }\n }\n\n return isTextBindableContainer(hitElement, false) ? hitElement : null;\n};\n\nconst VALID_CONTAINER_TYPES = new Set([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"arrow\",\n]);\n\nexport const isValidTextContainer = (element: {\n type: ExcalidrawElementType;\n}) => VALID_CONTAINER_TYPES.has(element.type);\n\nexport const computeContainerDimensionForBoundText = (\n dimension: number,\n containerType: ExtractSetType<typeof VALID_CONTAINER_TYPES>,\n) => {\n dimension = Math.ceil(dimension);\n const padding = BOUND_TEXT_PADDING * 2;\n\n if (containerType === \"ellipse\") {\n return Math.round(((dimension + padding) / Math.sqrt(2)) * 2);\n }\n if (containerType === \"arrow\") {\n return dimension + padding * 8;\n }\n if (containerType === \"diamond\") {\n return 2 * (dimension + padding);\n }\n return dimension + padding;\n};\n\nexport const getBoundTextMaxWidth = (\n container: ExcalidrawElement,\n boundTextElement: ExcalidrawTextElement | null,\n) => {\n const { width } = container;\n if (isArrowElement(container)) {\n const minWidth =\n (boundTextElement?.fontSize ?? DEFAULT_FONT_SIZE) *\n ARROW_LABEL_FONT_SIZE_TO_MIN_WIDTH_RATIO;\n return Math.max(ARROW_LABEL_WIDTH_FRACTION * width, minWidth);\n }\n if (container.type === \"ellipse\") {\n // The width of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.width / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse -https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((width / 2) * Math.sqrt(2)) - BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The width of the largest rectangle inscribed inside a rhombus is\n // Math.round(width / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(width / 2) - BOUND_TEXT_PADDING * 2;\n }\n return width - BOUND_TEXT_PADDING * 2;\n};\n\nexport const getBoundTextMaxHeight = (\n container: ExcalidrawElement,\n boundTextElement: ExcalidrawTextElementWithContainer,\n) => {\n const { height } = container;\n if (isArrowElement(container)) {\n const containerHeight = height - BOUND_TEXT_PADDING * 8 * 2;\n if (containerHeight <= 0) {\n return boundTextElement.height;\n }\n return height;\n }\n if (container.type === \"ellipse\") {\n // The height of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.height / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse - https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((height / 2) * Math.sqrt(2)) - BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The height of the largest rectangle inscribed inside a rhombus is\n // Math.round(height / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(height / 2) - BOUND_TEXT_PADDING * 2;\n }\n return height - BOUND_TEXT_PADDING * 2;\n};\n\nexport const isMeasureTextSupported = () => {\n const width = getTextWidth(\n DUMMY_TEXT,\n getFontString({\n fontSize: DEFAULT_FONT_SIZE,\n fontFamily: DEFAULT_FONT_FAMILY,\n }),\n );\n return width > 0;\n};\n\n/**\n * Unitless line height\n *\n * In previous versions we used `normal` line height, which browsers interpret\n * differently, and based on font-family and font-size.\n *\n * To make line heights consistent across browsers we hardcode the values for\n * each of our fonts based on most common average line-heights.\n * See https://github.com/excalidraw/excalidraw/pull/6360#issuecomment-1477635971\n * where the values come from.\n */\nconst DEFAULT_LINE_HEIGHT = {\n // ~1.25 is the average for Virgil in WebKit and Blink.\n // Gecko (FF) uses ~1.28.\n [FONT_FAMILY.Virgil]: 1.25 as ExcalidrawTextElement[\"lineHeight\"],\n // ~1.15 is the average for Helvetica in WebKit and Blink.\n [FONT_FAMILY.Helvetica]: 1.15 as ExcalidrawTextElement[\"lineHeight\"],\n // ~1.2 is the average for Cascadia in WebKit and Blink, and kinda Gecko too\n [FONT_FAMILY.Cascadia]: 1.2 as ExcalidrawTextElement[\"lineHeight\"],\n};\n\n/** OS/2 sTypoAscender, https://learn.microsoft.com/en-us/typography/opentype/spec/os2#stypoascender */\ntype sTypoAscender = number & MakeBrand<\"sTypoAscender\">;\n\n/** OS/2 sTypoDescender, https://learn.microsoft.com/en-us/typography/opentype/spec/os2#stypodescender */\ntype sTypoDescender = number & MakeBrand<\"sTypoDescender\">;\n\n/** head.unitsPerEm, usually either 1000 or 2048 */\ntype unitsPerEm = number & MakeBrand<\"unitsPerEm\">;\n\n/**\n * Hardcoded metrics for default fonts, read by https://opentype.js.org/font-inspector.html.\n * For custom fonts, read these metrics from OS/2 table and extend this object.\n *\n * WARN: opentype does NOT open WOFF2 correctly, make sure to convert WOFF2 to TTF first.\n */\nexport const FONT_METRICS: Record<\n number,\n {\n unitsPerEm: number;\n ascender: sTypoAscender;\n descender: sTypoDescender;\n }\n> = {\n [FONT_FAMILY.Virgil]: {\n unitsPerEm: 1000 as unitsPerEm,\n ascender: 886 as sTypoAscender,\n descender: -374 as sTypoDescender,\n },\n [FONT_FAMILY.Helvetica]: {\n unitsPerEm: 2048 as unitsPerEm,\n ascender: 1577 as sTypoAscender,\n descender: -471 as sTypoDescender,\n },\n [FONT_FAMILY.Cascadia]: {\n unitsPerEm: 2048 as unitsPerEm,\n ascender: 1977 as sTypoAscender,\n descender: -480 as sTypoDescender,\n },\n [FONT_FAMILY.Assistant]: {\n unitsPerEm: 1000 as unitsPerEm,\n ascender: 1021 as sTypoAscender,\n descender: -287 as sTypoDescender,\n },\n};\n\nexport const getDefaultLineHeight = (fontFamily: FontFamilyValues) => {\n if (fontFamily in DEFAULT_LINE_HEIGHT) {\n return DEFAULT_LINE_HEIGHT[fontFamily];\n }\n return DEFAULT_LINE_HEIGHT[DEFAULT_FONT_FAMILY];\n};\n", "import {\n NonDeleted,\n ExcalidrawLinearElement,\n ExcalidrawElement,\n PointBinding,\n ExcalidrawBindableElement,\n ExcalidrawTextElementWithContainer,\n ElementsMap,\n NonDeletedExcalidrawElement,\n NonDeletedSceneElementsMap,\n} from \"./types\";\nimport {\n distance2d,\n rotate,\n isPathALoop,\n getGridPoint,\n rotatePoint,\n centerPoint,\n getControlPointsForBezierCurve,\n getBezierXY,\n getBezierCurveLength,\n mapIntervalToBezierT,\n arePointsEqual,\n} from \"../math\";\nimport { getElementAbsoluteCoords, getLockedLinearCursorAlignSize } from \".\";\nimport {\n Bounds,\n getCurvePathOps,\n getElementPointsCoords,\n getMinMaxXYFromCurvePathOps,\n} from \"./bounds\";\nimport {\n Point,\n AppState,\n PointerCoords,\n InteractiveCanvasAppState,\n} from \"../types\";\nimport { mutateElement } from \"./mutateElement\";\nimport History from \"../history\";\n\nimport {\n bindOrUnbindLinearElement,\n getHoveredElementForBinding,\n isBindingEnabled,\n} from \"./binding\";\nimport { tupleToCoors } from \"../utils\";\nimport { isBindingElement } from \"./typeChecks\";\nimport { KEYS, shouldRotateWithDiscreteAngle } from \"../keys\";\nimport { getBoundTextElement, handleBindTextResize } from \"./textElement\";\nimport { DRAGGING_THRESHOLD } from \"../constants\";\nimport { Mutable } from \"../utility-types\";\nimport { ShapeCache } from \"../scene/ShapeCache\";\n\nconst editorMidPointsCache: {\n version: number | null;\n points: (Point | null)[];\n zoom: number | null;\n} = { version: null, points: [], zoom: null };\nexport class LinearElementEditor {\n public readonly elementId: ExcalidrawElement[\"id\"] & {\n _brand: \"excalidrawLinearElementId\";\n };\n /** indices */\n public readonly selectedPointsIndices: readonly number[] | null;\n\n public readonly pointerDownState: Readonly<{\n prevSelectedPointsIndices: readonly number[] | null;\n /** index */\n lastClickedPoint: number;\n origin: Readonly<{ x: number; y: number }> | null;\n segmentMidpoint: {\n value: Point | null;\n index: number | null;\n added: boolean;\n };\n }>;\n\n /** whether you're dragging a point */\n public readonly isDragging: boolean;\n public readonly lastUncommittedPoint: Point | null;\n public readonly pointerOffset: Readonly<{ x: number; y: number }>;\n public readonly startBindingElement:\n | ExcalidrawBindableElement\n | null\n | \"keep\";\n public readonly endBindingElement: ExcalidrawBindableElement | null | \"keep\";\n public readonly hoverPointIndex: number;\n public readonly segmentMidPointHoveredCoords: Point | null;\n\n constructor(element: NonDeleted<ExcalidrawLinearElement>) {\n this.elementId = element.id as string & {\n _brand: \"excalidrawLinearElementId\";\n };\n LinearElementEditor.normalizePoints(element);\n\n this.selectedPointsIndices = null;\n this.lastUncommittedPoint = null;\n this.isDragging = false;\n this.pointerOffset = { x: 0, y: 0 };\n this.startBindingElement = \"keep\";\n this.endBindingElement = \"keep\";\n this.pointerDownState = {\n prevSelectedPointsIndices: null,\n lastClickedPoint: -1,\n origin: null,\n\n segmentMidpoint: {\n value: null,\n index: null,\n added: false,\n },\n };\n this.hoverPointIndex = -1;\n this.segmentMidPointHoveredCoords = null;\n }\n\n // ---------------------------------------------------------------------------\n // static methods\n // ---------------------------------------------------------------------------\n\n static POINT_HANDLE_SIZE = 10;\n /**\n * @param id the `elementId` from the instance of this class (so that we can\n * statically guarantee this method returns an ExcalidrawLinearElement)\n */\n static getElement(\n id: InstanceType<typeof LinearElementEditor>[\"elementId\"],\n elementsMap: ElementsMap,\n ) {\n const element = elementsMap.get(id);\n if (element) {\n return element as NonDeleted<ExcalidrawLinearElement>;\n }\n return null;\n }\n\n static handleBoxSelection(\n event: PointerEvent,\n appState: AppState,\n setState: React.Component<any, AppState>[\"setState\"],\n elementsMap: NonDeletedSceneElementsMap,\n ) {\n if (\n !appState.editingLinearElement ||\n appState.draggingElement?.type !== \"selection\"\n ) {\n return false;\n }\n const { editingLinearElement } = appState;\n const { selectedPointsIndices, elementId } = editingLinearElement;\n\n const element = LinearElementEditor.getElement(elementId, elementsMap);\n if (!element) {\n return false;\n }\n\n const [selectionX1, selectionY1, selectionX2, selectionY2] =\n getElementAbsoluteCoords(appState.draggingElement, elementsMap);\n\n const pointsSceneCoords = LinearElementEditor.getPointsGlobalCoordinates(\n element,\n elementsMap,\n );\n\n const nextSelectedPoints = pointsSceneCoords.reduce(\n (acc: number[], point, index) => {\n if (\n (point[0] >= selectionX1 &&\n point[0] <= selectionX2 &&\n point[1] >= selectionY1 &&\n point[1] <= selectionY2) ||\n (event.shiftKey && selectedPointsIndices?.includes(index))\n ) {\n acc.push(index);\n }\n\n return acc;\n },\n [],\n );\n\n setState({\n editingLinearElement: {\n ...editingLinearElement,\n selectedPointsIndices: nextSelectedPoints.length\n ? nextSelectedPoints\n : null,\n },\n });\n }\n\n /** @returns whether point was dragged */\n static handlePointDragging(\n event: PointerEvent,\n appState: AppState,\n scenePointerX: number,\n scenePointerY: number,\n maybeSuggestBinding: (\n element: NonDeleted<ExcalidrawLinearElement>,\n pointSceneCoords: { x: number; y: number }[],\n ) => void,\n linearElementEditor: LinearElementEditor,\n elementsMap: NonDeletedSceneElementsMap,\n ): boolean {\n if (!linearElementEditor) {\n return false;\n }\n const { selectedPointsIndices, elementId } = linearElementEditor;\n const element = LinearElementEditor.getElement(elementId, elementsMap);\n if (!element) {\n return false;\n }\n\n // point that's being dragged (out of all selected points)\n const draggingPoint = element.points[\n linearElementEditor.pointerDownState.lastClickedPoint\n ] as [number, number] | undefined;\n\n if (selectedPointsIndices && draggingPoint) {\n if (\n shouldRotateWithDiscreteAngle(event) &&\n selectedPointsIndices.length === 1 &&\n element.points.length > 1\n ) {\n const selectedIndex = selectedPointsIndices[0];\n const referencePoint =\n element.points[selectedIndex === 0 ? 1 : selectedIndex - 1];\n\n const [width, height] = LinearElementEditor._getShiftLockedDelta(\n element,\n elementsMap,\n referencePoint,\n [scenePointerX, scenePointerY],\n event[KEYS.CTRL_OR_CMD] ? null : appState.gridSize,\n );\n\n LinearElementEditor.movePoints(element, [\n {\n index: selectedIndex,\n point: [width + referencePoint[0], height + referencePoint[1]],\n isDragging:\n selectedIndex ===\n linearElementEditor.pointerDownState.lastClickedPoint,\n },\n ]);\n } else {\n const newDraggingPointPosition = LinearElementEditor.createPointAt(\n element,\n elementsMap,\n scenePointerX - linearElementEditor.pointerOffset.x,\n scenePointerY - linearElementEditor.pointerOffset.y,\n event[KEYS.CTRL_OR_CMD] ? null : appState.gridSize,\n );\n\n const deltaX = newDraggingPointPosition[0] - draggingPoint[0];\n const deltaY = newDraggingPointPosition[1] - draggingPoint[1];\n\n LinearElementEditor.movePoints(\n element,\n selectedPointsIndices.map((pointIndex) => {\n const newPointPosition =\n pointIndex ===\n linearElementEditor.pointerDownState.lastClickedPoint\n ? LinearElementEditor.createPointAt(\n element,\n elementsMap,\n scenePointerX - linearElementEditor.pointerOffset.x,\n scenePointerY - linearElementEditor.pointerOffset.y,\n event[KEYS.CTRL_OR_CMD] ? null : appState.gridSize,\n )\n : ([\n element.points[pointIndex][0] + deltaX,\n element.points[pointIndex][1] + deltaY,\n ] as const);\n return {\n index: pointIndex,\n point: newPointPosition,\n isDragging:\n pointIndex ===\n linearElementEditor.pointerDownState.lastClickedPoint,\n };\n }),\n );\n }\n\n const boundTextElement = getBoundTextElement(element, elementsMap);\n if (boundTextElement) {\n handleBindTextResize(element, elementsMap, false);\n }\n\n // suggest bindings for first and last point if selected\n if (isBindingElement(element, false)) {\n const coords: { x: number; y: number }[] = [];\n\n const firstSelectedIndex = selectedPointsIndices[0];\n if (firstSelectedIndex === 0) {\n coords.push(\n tupleToCoors(\n LinearElementEditor.getPointGlobalCoordinates(\n element,\n element.points[0],\n elementsMap,\n ),\n ),\n );\n }\n\n const lastSelectedIndex =\n selectedPointsIndices[selectedPointsIndices.length - 1];\n if (lastSelectedIndex === element.points.length - 1) {\n coords.push(\n tupleToCoors(\n LinearElementEditor.getPointGlobalCoordinates(\n element,\n element.points[lastSelectedIndex],\n elementsMap,\n ),\n ),\n );\n }\n\n if (coords.length) {\n maybeSuggestBinding(element, coords);\n }\n }\n\n return true;\n }\n\n return false;\n }\n\n static handlePointerUp(\n event: PointerEvent,\n editingLinearElement: LinearElementEditor,\n appState: AppState,\n elements: readonly NonDeletedExcalidrawElement[],\n elementsMap: NonDeletedSceneElementsMap,\n ): LinearElementEditor {\n const { elementId, selectedPointsIndices, isDragging, pointerDownState } =\n editingLinearElement;\n const element = LinearElementEditor.getElement(elementId, elementsMap);\n if (!element) {\n return editingLinearElement;\n }\n\n const bindings: Mutable<\n Partial<\n Pick<\n InstanceType<typeof LinearElementEditor>,\n \"startBindingElement\" | \"endBindingElement\"\n >\n >\n > = {};\n\n if (isDragging && selectedPointsIndices) {\n for (const selectedPoint of selectedPointsIndices) {\n if (\n selectedPoint === 0 ||\n selectedPoint === element.points.length - 1\n ) {\n if (isPathALoop(element.points, appState.zoom.value)) {\n LinearElementEditor.movePoints(element, [\n {\n index: selectedPoint,\n point:\n selectedPoint === 0\n ? element.points[element.points.length - 1]\n : element.points[0],\n },\n ]);\n }\n\n const bindingElement = isBindingEnabled(appState)\n ? getHoveredElementForBinding(\n tupleToCoors(\n LinearElementEditor.getPointAtIndexGlobalCoordinates(\n element,\n selectedPoint!,\n elementsMap,\n ),\n ),\n elements,\n elementsMap,\n )\n : null;\n\n bindings[\n selectedPoint === 0 ? \"startBindingElement\" : \"endBindingElement\"\n ] = bindingElement;\n }\n }\n }\n\n return {\n ...editingLinearElement,\n ...bindings,\n // if clicking without previously dragging a point(s), and not holding\n // shift, deselect all points except the one clicked. If holding shift,\n // toggle the point.\n selectedPointsIndices:\n isDragging || event.shiftKey\n ? !isDragging &&\n event.shiftKey &&\n pointerDownState.prevSelectedPointsIndices?.includes(\n pointerDownState.lastClickedPoint,\n )\n ? selectedPointsIndices &&\n selectedPointsIndices.filter(\n (pointIndex) =>\n pointIndex !== pointerDownState.lastClickedPoint,\n )\n : selectedPointsIndices\n : selectedPointsIndices?.includes(pointerDownState.lastClickedPoint)\n ? [pointerDownState.lastClickedPoint]\n : selectedPointsIndices,\n isDragging: false,\n pointerOffset: { x: 0, y: 0 },\n };\n }\n\n static getEditorMidPoints = (\n element: NonDeleted<ExcalidrawLinearElement>,\n elementsMap: ElementsMap,\n appState: InteractiveCanvasAppState,\n ): typeof editorMidPointsCache[\"points\"] => {\n const boundText = getBoundTextElement(element, elementsMap);\n\n // Since its not needed outside editor unless 2 pointer lines or bound text\n if (\n !appState.editingLinearElement &&\n element.points.length > 2 &&\n !boundText\n ) {\n return [];\n }\n if (\n editorMidPointsCache.version === element.version &&\n editorMidPointsCache.zoom === appState.zoom.value\n ) {\n return editorMidPointsCache.points;\n }\n LinearElementEditor.updateEditorMidPointsCache(\n element,\n elementsMap,\n appState,\n );\n return editorMidPointsCache.points!;\n };\n\n static updateEditorMidPointsCache = (\n element: NonDeleted<ExcalidrawLinearElement>,\n elementsMap: ElementsMap,\n appState: InteractiveCanvasAppState,\n ) => {\n const points = LinearElementEditor.getPointsGlobalCoordinates(\n element,\n elementsMap,\n );\n\n let index = 0;\n const midpoints: (Point | null)[] = [];\n while (index < points.length - 1) {\n if (\n LinearElementEditor.isSegmentTooShort(\n element,\n element.points[index],\n element.points[index + 1],\n appState.zoom,\n )\n ) {\n midpoints.push(null);\n index++;\n continue;\n }\n const segmentMidPoint = LinearElementEditor.getSegmentMidPoint(\n element,\n points[index],\n points[index + 1],\n index + 1,\n elementsMap,\n );\n midpoints.push(segmentMidPoint);\n index++;\n }\n editorMidPointsCache.points = midpoints;\n editorMidPointsCache.version = element.version;\n editorMidPointsCache.zoom = appState.zoom.value;\n };\n\n static getSegmentMidpointHitCoords = (\n linearElementEditor: LinearElementEditor,\n scenePointer: { x: number; y: number },\n appState: AppState,\n elementsMap: ElementsMap,\n ) => {\n const { elementId } = linearElementEditor;\n const element = LinearElementEditor.getElement(elementId, elementsMap);\n if (!element) {\n return null;\n }\n const clickedPointIndex = LinearElementEditor.getPointIndexUnderCursor(\n element,\n elementsMap,\n appState.zoom,\n scenePointer.x,\n scenePointer.y,\n );\n if (clickedPointIndex >= 0) {\n return null;\n }\n const points = LinearElementEditor.getPointsGlobalCoordinates(\n element,\n elementsMap,\n );\n if (points.length >= 3 && !appState.editingLinearElement) {\n return null;\n }\n\n const threshold =\n LinearElementEditor.POINT_HANDLE_SIZE / appState.zoom.value;\n\n const existingSegmentMidpointHitCoords =\n linearElementEditor.segmentMidPointHoveredCoords;\n if (existingSegmentMidpointHitCoords) {\n const distance = distance2d(\n existingSegmentMidpointHitCoords[0],\n existingSegmentMidpointHitCoords[1],\n scenePointer.x,\n scenePointer.y,\n );\n if (distance <= threshold) {\n return existingSegmentMidpointHitCoords;\n }\n }\n let index = 0;\n const midPoints: typeof editorMidPointsCache[\"points\"] =\n LinearElementEditor.getEditorMidPoints(element, elementsMap, appState);\n while (index < midPoints.length) {\n if (midPoints[index] !== null) {\n const distance = distance2d(\n midPoints[index]![0],\n midPoints[index]![1],\n scenePointer.x,\n scenePointer.y,\n );\n if (distance <= threshold) {\n return midPoints[index];\n }\n }\n\n index++;\n }\n return null;\n };\n\n static isSegmentTooShort(\n element: NonDeleted<ExcalidrawLinearElement>,\n startPoint: Point,\n endPoint: Point,\n zoom: AppState[\"zoom\"],\n ) {\n let distance = distance2d(\n startPoint[0],\n startPoint[1],\n endPoint[0],\n endPoint[1],\n );\n if (element.points.length > 2 && element.roundness) {\n distance = getBezierCurveLength(element, endPoint);\n }\n\n return distance * zoom.value < LinearElementEditor.POINT_HANDLE_SIZE * 4;\n }\n\n static getSegmentMidPoint(\n element: NonDeleted<ExcalidrawLinearElement>,\n startPoint: Point,\n endPoint: Point,\n endPointIndex: number,\n elementsMap: ElementsMap,\n ) {\n let segmentMidPoint = centerPoint(startPoint, endPoint);\n if (element.points.length > 2 && element.roundness) {\n const controlPoints = getControlPointsForBezierCurve(\n element,\n element.points[endPointIndex],\n );\n if (controlPoints) {\n const t = mapIntervalToBezierT(\n element,\n element.points[endPointIndex],\n 0.5,\n );\n\n const [tx, ty] = getBezierXY(\n controlPoints[0],\n controlPoints[1],\n controlPoints[2],\n controlPoints[3],\n t,\n );\n segmentMidPoint = LinearElementEditor.getPointGlobalCoordinates(\n element,\n [tx, ty],\n elementsMap,\n );\n }\n }\n\n return segmentMidPoint;\n }\n\n static getSegmentMidPointIndex(\n linearElementEditor: LinearElementEditor,\n appState: AppState,\n midPoint: Point,\n elementsMap: ElementsMap,\n ) {\n const element = LinearElementEditor.getElement(\n linearElementEditor.elementId,\n elementsMap,\n );\n if (!element) {\n return -1;\n }\n const midPoints = LinearElementEditor.getEditorMidPoints(\n element,\n elementsMap,\n appState,\n );\n let index = 0;\n while (index < midPoints.length) {\n if (LinearElementEditor.arePointsEqual(midPoint, midPoints[index])) {\n return index + 1;\n }\n index++;\n }\n return -1;\n }\n\n static handlePointerDown(\n event: React.PointerEvent<HTMLElement>,\n appState: AppState,\n history: History,\n scenePointer: { x: number; y: number },\n linearElementEditor: LinearElementEditor,\n elements: readonly NonDeletedExcalidrawElement[],\n elementsMap: NonDeletedSceneElementsMap,\n ): {\n didAddPoint: boolean;\n hitElement: NonDeleted<ExcalidrawElement> | null;\n linearElementEditor: LinearElementEditor | null;\n } {\n const ret: ReturnType<typeof LinearElementEditor[\"handlePointerDown\"]> = {\n didAddPoint: false,\n hitElement: null,\n linearElementEditor: null,\n };\n\n if (!linearElementEditor) {\n return ret;\n }\n\n const { elementId } = linearElementEditor;\n const element = LinearElementEditor.getElement(elementId, elementsMap);\n\n if (!element) {\n return ret;\n }\n const segmentMidpoint = LinearElementEditor.getSegmentMidpointHitCoords(\n linearElementEditor,\n scenePointer,\n appState,\n elementsMap,\n );\n let segmentMidpointIndex = null;\n if (segmentMidpoint) {\n segmentMidpointIndex = LinearElementEditor.getSegmentMidPointIndex(\n linearElementEditor,\n appState,\n segmentMidpoint,\n elementsMap,\n );\n }\n if (event.altKey && appState.editingLinearElement) {\n if (linearElementEditor.lastUncommittedPoint == null) {\n mutateElement(element, {\n points: [\n ...element.points,\n LinearElementEditor.createPointAt(\n element,\n elementsMap,\n scenePointer.x,\n scenePointer.y,\n event[KEYS.CTRL_OR_CMD] ? null : appState.gridSize,\n ),\n ],\n });\n ret.didAddPoint = true;\n }\n history.resumeRecording();\n ret.linearElementEditor = {\n ...linearElementEditor,\n pointerDownState: {\n prevSelectedPointsIndices: linearElementEditor.selectedPointsIndices,\n lastClickedPoint: -1,\n origin: { x: scenePointer.x, y: scenePointer.y },\n segmentMidpoint: {\n value: segmentMidpoint,\n index: segmentMidpointIndex,\n added: false,\n },\n },\n selectedPointsIndices: [element.points.length - 1],\n lastUncommittedPoint: null,\n endBindingElement: getHoveredElementForBinding(\n scenePointer,\n elements,\n elementsMap,\n ),\n };\n\n ret.didAddPoint = true;\n return ret;\n }\n\n const clickedPointIndex = LinearElementEditor.getPointIndexUnderCursor(\n element,\n elementsMap,\n appState.zoom,\n scenePointer.x,\n scenePointer.y,\n );\n // if we clicked on a point, set the element as hitElement otherwise\n // it would get deselected if the point is outside the hitbox area\n if (clickedPointIndex >= 0 || segmentMidpoint) {\n ret.hitElement = element;\n } else {\n // You might be wandering why we are storing the binding elements on\n // LinearElementEditor and passing them in, instead of calculating them\n // from the end points of the `linearElement` - this is to allow disabling\n // binding (which needs to happen at the point the user finishes moving\n // the point).\n const { startBindingElement, endBindingElement } = linearElementEditor;\n if (isBindingEnabled(appState) && isBindingElement(element)) {\n bindOrUnbindLinearElement(\n element,\n startBindingElement,\n endBindingElement,\n elementsMap,\n );\n }\n }\n\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const targetPoint =\n clickedPointIndex > -1 &&\n rotate(\n element.x + element.points[clickedPointIndex][0],\n element.y + element.points[clickedPointIndex][1],\n cx,\n cy,\n element.angle,\n );\n\n const nextSelectedPointsIndices =\n clickedPointIndex > -1 || event.shiftKey\n ? event.shiftKey ||\n linearElementEditor.selectedPointsIndices?.includes(clickedPointIndex)\n ? normalizeSelectedPoints([\n ...(linearElementEditor.selectedPointsIndices || []),\n clickedPointIndex,\n ])\n : [clickedPointIndex]\n : null;\n ret.linearElementEditor = {\n ...linearElementEditor,\n pointerDownState: {\n prevSelectedPointsIndices: linearElementEditor.selectedPointsIndices,\n lastClickedPoint: clickedPointIndex,\n origin: { x: scenePointer.x, y: scenePointer.y },\n segmentMidpoint: {\n value: segmentMidpoint,\n index: segmentMidpointIndex,\n added: false,\n },\n },\n selectedPointsIndices: nextSelectedPointsIndices,\n pointerOffset: targetPoint\n ? {\n x: scenePointer.x - targetPoint[0],\n y: scenePointer.y - targetPoint[1],\n }\n : { x: 0, y: 0 },\n };\n\n return ret;\n }\n\n static arePointsEqual(point1: Point | null, point2: Point | null) {\n if (!point1 && !point2) {\n return true;\n }\n if (!point1 || !point2) {\n return false;\n }\n return arePointsEqual(point1, point2);\n }\n\n static handlePointerMove(\n event: React.PointerEvent<HTMLCanvasElement>,\n scenePointerX: number,\n scenePointerY: number,\n appState: AppState,\n elementsMap: ElementsMap,\n ): LinearElementEditor | null {\n if (!appState.editingLinearElement) {\n return null;\n }\n const { elementId, lastUncommittedPoint } = appState.editingLinearElement;\n const element = LinearElementEditor.getElement(elementId, elementsMap);\n if (!element) {\n return appState.editingLinearElement;\n }\n\n const { points } = element;\n const lastPoint = points[points.length - 1];\n\n if (!event.altKey) {\n if (lastPoint === lastUncommittedPoint) {\n LinearElementEditor.deletePoints(element, [points.length - 1]);\n }\n return {\n ...appState.editingLinearElement,\n lastUncommittedPoint: null,\n };\n }\n\n let newPoint: Point;\n\n if (shouldRotateWithDiscreteAngle(event) && points.length >= 2) {\n const lastCommittedPoint = points[points.length - 2];\n\n const [width, height] = LinearElementEditor._getShiftLockedDelta(\n element,\n elementsMap,\n lastCommittedPoint,\n [scenePointerX, scenePointerY],\n event[KEYS.CTRL_OR_CMD] ? null : appState.gridSize,\n );\n\n newPoint = [\n width + lastCommittedPoint[0],\n height + lastCommittedPoint[1],\n ];\n } else {\n newPoint = LinearElementEditor.createPointAt(\n element,\n elementsMap,\n scenePointerX - appState.editingLinearElement.pointerOffset.x,\n scenePointerY - appState.editingLinearElement.pointerOffset.y,\n event[KEYS.CTRL_OR_CMD] ? null : appState.gridSize,\n );\n }\n\n if (lastPoint === lastUncommittedPoint) {\n LinearElementEditor.movePoints(element, [\n {\n index: element.points.length - 1,\n point: newPoint,\n },\n ]);\n } else {\n LinearElementEditor.addPoints(element, appState, [{ point: newPoint }]);\n }\n return {\n ...appState.editingLinearElement,\n lastUncommittedPoint: element.points[element.points.length - 1],\n };\n }\n\n /** scene coords */\n static getPointGlobalCoordinates(\n element: NonDeleted<ExcalidrawLinearElement>,\n point: Point,\n elementsMap: ElementsMap,\n ) {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n\n let { x, y } = element;\n [x, y] = rotate(x + point[0], y + point[1], cx, cy, element.angle);\n return [x, y] as const;\n }\n\n /** scene coords */\n static getPointsGlobalCoordinates(\n element: NonDeleted<ExcalidrawLinearElement>,\n elementsMap: ElementsMap,\n ): Point[] {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n return element.points.map((point) => {\n let { x, y } = element;\n [x, y] = rotate(x + point[0], y + point[1], cx, cy, element.angle);\n return [x, y] as const;\n });\n }\n\n static getPointAtIndexGlobalCoordinates(\n element: NonDeleted<ExcalidrawLinearElement>,\n\n indexMaybeFromEnd: number, // -1 for last element\n elementsMap: ElementsMap,\n ): Point {\n const index =\n indexMaybeFromEnd < 0\n ? element.points.length + indexMaybeFromEnd\n : indexMaybeFromEnd;\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n\n const point = element.points[index];\n const { x, y } = element;\n return point\n ? rotate(x + point[0], y + point[1], cx, cy, element.angle)\n : rotate(x, y, cx, cy, element.angle);\n }\n\n static pointFromAbsoluteCoords(\n element: NonDeleted<ExcalidrawLinearElement>,\n absoluteCoords: Point,\n elementsMap: ElementsMap,\n ): Point {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const [x, y] = rotate(\n absoluteCoords[0],\n absoluteCoords[1],\n cx,\n cy,\n -element.angle,\n );\n return [x - element.x, y - element.y];\n }\n\n static getPointIndexUnderCursor(\n element: NonDeleted<ExcalidrawLinearElement>,\n elementsMap: ElementsMap,\n zoom: AppState[\"zoom\"],\n x: number,\n y: number,\n ) {\n const pointHandles = LinearElementEditor.getPointsGlobalCoordinates(\n element,\n elementsMap,\n );\n let idx = pointHandles.length;\n // loop from right to left because points on the right are rendered over\n // points on the left, thus should take precedence when clicking, if they\n // overlap\n while (--idx > -1) {\n const point = pointHandles[idx];\n if (\n distance2d(x, y, point[0], point[1]) * zoom.value <\n // +1px to account for outline stroke\n LinearElementEditor.POINT_HANDLE_SIZE + 1\n ) {\n return idx;\n }\n }\n return -1;\n }\n\n static createPointAt(\n element: NonDeleted<ExcalidrawLinearElement>,\n elementsMap: ElementsMap,\n scenePointerX: number,\n scenePointerY: number,\n gridSize: number | null,\n ): Point {\n const pointerOnGrid = getGridPoint(scenePointerX, scenePointerY, gridSize);\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const [rotatedX, rotatedY] = rotate(\n pointerOnGrid[0],\n pointerOnGrid[1],\n cx,\n cy,\n -element.angle,\n );\n\n return [rotatedX - element.x, rotatedY - element.y];\n }\n\n /**\n * Normalizes line points so that the start point is at [0,0]. This is\n * expected in various parts of the codebase. Also returns new x/y to account\n * for the potential normalization.\n */\n static getNormalizedPoints(element: ExcalidrawLinearElement) {\n const { points } = element;\n\n const offsetX = points[0][0];\n const offsetY = points[0][1];\n\n return {\n points: points.map((point, _idx) => {\n return [point[0] - offsetX, point[1] - offsetY] as const;\n }),\n x: element.x + offsetX,\n y: element.y + offsetY,\n };\n }\n\n // element-mutating methods\n // ---------------------------------------------------------------------------\n\n static normalizePoints(element: NonDeleted<ExcalidrawLinearElement>) {\n mutateElement(element, LinearElementEditor.getNormalizedPoints(element));\n }\n\n static duplicateSelectedPoints(appState: AppState, elementsMap: ElementsMap) {\n if (!appState.editingLinearElement) {\n return false;\n }\n\n const { selectedPointsIndices, elementId } = appState.editingLinearElement;\n\n const element = LinearElementEditor.getElement(elementId, elementsMap);\n\n if (!element || selectedPointsIndices === null) {\n return false;\n }\n\n const { points } = element;\n\n const nextSelectedIndices: number[] = [];\n\n let pointAddedToEnd = false;\n let indexCursor = -1;\n const nextPoints = points.reduce((acc: Point[], point, index) => {\n ++indexCursor;\n acc.push(point);\n\n const isSelected = selectedPointsIndices.includes(index);\n if (isSelected) {\n const nextPoint = points[index + 1];\n\n if (!nextPoint) {\n pointAddedToEnd = true;\n }\n acc.push(\n nextPoint\n ? [(point[0] + nextPoint[0]) / 2, (point[1] + nextPoint[1]) / 2]\n : [point[0], point[1]],\n );\n\n nextSelectedIndices.push(indexCursor + 1);\n ++indexCursor;\n }\n\n return acc;\n }, []);\n\n mutateElement(element, { points: nextPoints });\n\n // temp hack to ensure the line doesn't move when adding point to the end,\n // potentially expanding the bounding box\n if (pointAddedToEnd) {\n const lastPoint = element.points[element.points.length - 1];\n LinearElementEditor.movePoints(element, [\n {\n index: element.points.length - 1,\n point: [lastPoint[0] + 30, lastPoint[1] + 30],\n },\n ]);\n }\n\n return {\n appState: {\n ...appState,\n editingLinearElement: {\n ...appState.editingLinearElement,\n selectedPointsIndices: nextSelectedIndices,\n },\n },\n };\n }\n\n static deletePoints(\n element: NonDeleted<ExcalidrawLinearElement>,\n pointIndices: readonly number[],\n ) {\n let offsetX = 0;\n let offsetY = 0;\n\n const isDeletingOriginPoint = pointIndices.includes(0);\n\n // if deleting first point, make the next to be [0,0] and recalculate\n // positions of the rest with respect to it\n if (isDeletingOriginPoint) {\n const firstNonDeletedPoint = element.points.find((point, idx) => {\n return !pointIndices.includes(idx);\n });\n if (firstNonDeletedPoint) {\n offsetX = firstNonDeletedPoint[0];\n offsetY = firstNonDeletedPoint[1];\n }\n }\n\n const nextPoints = element.points.reduce((acc: Point[], point, idx) => {\n if (!pointIndices.includes(idx)) {\n acc.push(\n !acc.length ? [0, 0] : [point[0] - offsetX, point[1] - offsetY],\n );\n }\n return acc;\n }, []);\n\n LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);\n }\n\n static addPoints(\n element: NonDeleted<ExcalidrawLinearElement>,\n appState: AppState,\n targetPoints: { point: Point }[],\n ) {\n const offsetX = 0;\n const offsetY = 0;\n\n const nextPoints = [...element.points, ...targetPoints.map((x) => x.point)];\n LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);\n }\n\n static movePoints(\n element: NonDeleted<ExcalidrawLinearElement>,\n targetPoints: { index: number; point: Point; isDragging?: boolean }[],\n otherUpdates?: { startBinding?: PointBinding; endBinding?: PointBinding },\n ) {\n const { points } = element;\n\n // in case we're moving start point, instead of modifying its position\n // which would break the invariant of it being at [0,0], we move\n // all the other points in the opposite direction by delta to\n // offset it. We do the same with actual element.x/y position, so\n // this hacks are completely transparent to the user.\n let offsetX = 0;\n let offsetY = 0;\n\n const selectedOriginPoint = targetPoints.find(({ index }) => index === 0);\n\n if (selectedOriginPoint) {\n offsetX =\n selectedOriginPoint.point[0] + points[selectedOriginPoint.index][0];\n offsetY =\n selectedOriginPoint.point[1] + points[selectedOriginPoint.index][1];\n }\n\n const nextPoints = points.map((point, idx) => {\n const selectedPointData = targetPoints.find((p) => p.index === idx);\n if (selectedPointData) {\n if (selectedOriginPoint) {\n return point;\n }\n\n const deltaX =\n selectedPointData.point[0] - points[selectedPointData.index][0];\n const deltaY =\n selectedPointData.point[1] - points[selectedPointData.index][1];\n\n return [point[0] + deltaX, point[1] + deltaY] as const;\n }\n return offsetX || offsetY\n ? ([point[0] - offsetX, point[1] - offsetY] as const)\n : point;\n });\n\n LinearElementEditor._updatePoints(\n element,\n nextPoints,\n offsetX,\n offsetY,\n otherUpdates,\n );\n }\n\n static shouldAddMidpoint(\n linearElementEditor: LinearElementEditor,\n pointerCoords: PointerCoords,\n appState: AppState,\n elementsMap: ElementsMap,\n ) {\n const element = LinearElementEditor.getElement(\n linearElementEditor.elementId,\n elementsMap,\n );\n\n if (!element) {\n return false;\n }\n\n const { segmentMidpoint } = linearElementEditor.pointerDownState;\n\n if (\n segmentMidpoint.added ||\n segmentMidpoint.value === null ||\n segmentMidpoint.index === null ||\n linearElementEditor.pointerDownState.origin === null\n ) {\n return false;\n }\n\n const origin = linearElementEditor.pointerDownState.origin!;\n const dist = distance2d(\n origin.x,\n origin.y,\n pointerCoords.x,\n pointerCoords.y,\n );\n if (\n !appState.editingLinearElement &&\n dist < DRAGGING_THRESHOLD / appState.zoom.value\n ) {\n return false;\n }\n return true;\n }\n\n static addMidpoint(\n linearElementEditor: LinearElementEditor,\n pointerCoords: PointerCoords,\n appState: AppState,\n snapToGrid: boolean,\n elementsMap: ElementsMap,\n ) {\n const element = LinearElementEditor.getElement(\n linearElementEditor.elementId,\n elementsMap,\n );\n if (!element) {\n return;\n }\n const { segmentMidpoint } = linearElementEditor.pointerDownState;\n const ret: {\n pointerDownState: LinearElementEditor[\"pointerDownState\"];\n selectedPointsIndices: LinearElementEditor[\"selectedPointsIndices\"];\n } = {\n pointerDownState: linearElementEditor.pointerDownState,\n selectedPointsIndices: linearElementEditor.selectedPointsIndices,\n };\n\n const midpoint = LinearElementEditor.createPointAt(\n element,\n elementsMap,\n pointerCoords.x,\n pointerCoords.y,\n snapToGrid ? appState.gridSize : null,\n );\n const points = [\n ...element.points.slice(0, segmentMidpoint.index!),\n midpoint,\n ...element.points.slice(segmentMidpoint.index!),\n ];\n\n mutateElement(element, {\n points,\n });\n\n ret.pointerDownState = {\n ...linearElementEditor.pointerDownState,\n segmentMidpoint: {\n ...linearElementEditor.pointerDownState.segmentMidpoint,\n added: true,\n },\n lastClickedPoint: segmentMidpoint.index!,\n };\n ret.selectedPointsIndices = [segmentMidpoint.index!];\n return ret;\n }\n\n private static _updatePoints(\n element: NonDeleted<ExcalidrawLinearElement>,\n nextPoints: readonly Point[],\n offsetX: number,\n offsetY: number,\n otherUpdates?: { startBinding?: PointBinding; endBinding?: PointBinding },\n ) {\n const nextCoords = getElementPointsCoords(element, nextPoints);\n const prevCoords = getElementPointsCoords(element, element.points);\n const nextCenterX = (nextCoords[0] + nextCoords[2]) / 2;\n const nextCenterY = (nextCoords[1] + nextCoords[3]) / 2;\n const prevCenterX = (prevCoords[0] + prevCoords[2]) / 2;\n const prevCenterY = (prevCoords[1] + prevCoords[3]) / 2;\n const dX = prevCenterX - nextCenterX;\n const dY = prevCenterY - nextCenterY;\n const rotated = rotate(offsetX, offsetY, dX, dY, element.angle);\n mutateElement(element, {\n ...otherUpdates,\n points: nextPoints,\n x: element.x + rotated[0],\n y: element.y + rotated[1],\n });\n }\n\n private static _getShiftLockedDelta(\n element: NonDeleted<ExcalidrawLinearElement>,\n elementsMap: ElementsMap,\n referencePoint: Point,\n scenePointer: Point,\n gridSize: number | null,\n ) {\n const referencePointCoords = LinearElementEditor.getPointGlobalCoordinates(\n element,\n referencePoint,\n elementsMap,\n );\n\n const [gridX, gridY] = getGridPoint(\n scenePointer[0],\n scenePointer[1],\n gridSize,\n );\n\n const { width, height } = getLockedLinearCursorAlignSize(\n referencePointCoords[0],\n referencePointCoords[1],\n gridX,\n gridY,\n );\n\n return rotatePoint([width, height], [0, 0], -element.angle);\n }\n\n static getBoundTextElementPosition = (\n element: ExcalidrawLinearElement,\n boundTextElement: ExcalidrawTextElementWithContainer,\n elementsMap: ElementsMap,\n ): { x: number; y: number } => {\n const points = LinearElementEditor.getPointsGlobalCoordinates(\n element,\n elementsMap,\n );\n if (points.length < 2) {\n mutateElement(boundTextElement, { isDeleted: true });\n }\n let x = 0;\n let y = 0;\n if (element.points.length % 2 === 1) {\n const index = Math.floor(element.points.length / 2);\n const midPoint = LinearElementEditor.getPointGlobalCoordinates(\n element,\n element.points[index],\n elementsMap,\n );\n x = midPoint[0] - boundTextElement.width / 2;\n y = midPoint[1] - boundTextElement.height / 2;\n } else {\n const index = element.points.length / 2 - 1;\n\n let midSegmentMidpoint = editorMidPointsCache.points[index];\n if (element.points.length === 2) {\n midSegmentMidpoint = centerPoint(points[0], points[1]);\n }\n if (\n !midSegmentMidpoint ||\n editorMidPointsCache.version !== element.version\n ) {\n midSegmentMidpoint = LinearElementEditor.getSegmentMidPoint(\n element,\n points[index],\n points[index + 1],\n index + 1,\n elementsMap,\n );\n }\n x = midSegmentMidpoint[0] - boundTextElement.width / 2;\n y = midSegmentMidpoint[1] - boundTextElement.height / 2;\n }\n return { x, y };\n };\n\n static getMinMaxXYWithBoundText = (\n element: ExcalidrawLinearElement,\n elementsMap: ElementsMap,\n elementBounds: Bounds,\n boundTextElement: ExcalidrawTextElementWithContainer,\n ): [number, number, number, number, number, number] => {\n let [x1, y1, x2, y2] = elementBounds;\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const { x: boundTextX1, y: boundTextY1 } =\n LinearElementEditor.getBoundTextElementPosition(\n element,\n boundTextElement,\n elementsMap,\n );\n const boundTextX2 = boundTextX1 + boundTextElement.width;\n const boundTextY2 = boundTextY1 + boundTextElement.height;\n\n const topLeftRotatedPoint = rotatePoint([x1, y1], [cx, cy], element.angle);\n const topRightRotatedPoint = rotatePoint([x2, y1], [cx, cy], element.angle);\n\n const counterRotateBoundTextTopLeft = rotatePoint(\n [boundTextX1, boundTextY1],\n\n [cx, cy],\n\n -element.angle,\n );\n const counterRotateBoundTextTopRight = rotatePoint(\n [boundTextX2, boundTextY1],\n\n [cx, cy],\n\n -element.angle,\n );\n const counterRotateBoundTextBottomLeft = rotatePoint(\n [boundTextX1, boundTextY2],\n\n [cx, cy],\n\n -element.angle,\n );\n const counterRotateBoundTextBottomRight = rotatePoint(\n [boundTextX2, boundTextY2],\n\n [cx, cy],\n\n -element.angle,\n );\n\n if (\n topLeftRotatedPoint[0] < topRightRotatedPoint[0] &&\n topLeftRotatedPoint[1] >= topRightRotatedPoint[1]\n ) {\n x1 = Math.min(x1, counterRotateBoundTextBottomLeft[0]);\n x2 = Math.max(\n x2,\n Math.max(\n counterRotateBoundTextTopRight[0],\n counterRotateBoundTextBottomRight[0],\n ),\n );\n y1 = Math.min(y1, counterRotateBoundTextTopLeft[1]);\n\n y2 = Math.max(y2, counterRotateBoundTextBottomRight[1]);\n } else if (\n topLeftRotatedPoint[0] >= topRightRotatedPoint[0] &&\n topLeftRotatedPoint[1] > topRightRotatedPoint[1]\n ) {\n x1 = Math.min(x1, counterRotateBoundTextBottomRight[0]);\n x2 = Math.max(\n x2,\n Math.max(\n counterRotateBoundTextTopLeft[0],\n counterRotateBoundTextTopRight[0],\n ),\n );\n y1 = Math.min(y1, counterRotateBoundTextBottomLeft[1]);\n\n y2 = Math.max(y2, counterRotateBoundTextTopRight[1]);\n } else if (topLeftRotatedPoint[0] >= topRightRotatedPoint[0]) {\n x1 = Math.min(x1, counterRotateBoundTextTopRight[0]);\n x2 = Math.max(x2, counterRotateBoundTextBottomLeft[0]);\n y1 = Math.min(y1, counterRotateBoundTextBottomRight[1]);\n\n y2 = Math.max(y2, counterRotateBoundTextTopLeft[1]);\n } else if (topLeftRotatedPoint[1] <= topRightRotatedPoint[1]) {\n x1 = Math.min(\n x1,\n Math.min(\n counterRotateBoundTextTopRight[0],\n counterRotateBoundTextTopLeft[0],\n ),\n );\n\n x2 = Math.max(x2, counterRotateBoundTextBottomRight[0]);\n y1 = Math.min(y1, counterRotateBoundTextTopRight[1]);\n y2 = Math.max(y2, counterRotateBoundTextBottomLeft[1]);\n }\n\n return [x1, y1, x2, y2, cx, cy];\n };\n\n static getElementAbsoluteCoords = (\n element: ExcalidrawLinearElement,\n elementsMap: ElementsMap,\n includeBoundText: boolean = false,\n ): [number, number, number, number, number, number] => {\n let coords: [number, number, number, number, number, number];\n let x1;\n let y1;\n let x2;\n let y2;\n if (element.points.length < 2 || !ShapeCache.get(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce(\n (limits, [x, y]) => {\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n\n return limits;\n },\n { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity },\n );\n x1 = minX + element.x;\n y1 = minY + element.y;\n x2 = maxX + element.x;\n y2 = maxY + element.y;\n } else {\n const shape = ShapeCache.generateElementShape(element, null);\n\n // first element is always the curve\n const ops = getCurvePathOps(shape[0]);\n\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n x1 = minX + element.x;\n y1 = minY + element.y;\n x2 = maxX + element.x;\n y2 = maxY + element.y;\n }\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n coords = [x1, y1, x2, y2, cx, cy];\n\n if (!includeBoundText) {\n return coords;\n }\n const boundTextElement = getBoundTextElement(element, elementsMap);\n if (boundTextElement) {\n coords = LinearElementEditor.getMinMaxXYWithBoundText(\n element,\n elementsMap,\n [x1, y1, x2, y2],\n boundTextElement,\n );\n }\n\n return coords;\n };\n}\n\nconst normalizeSelectedPoints = (\n points: (number | null)[],\n): number[] | null => {\n let nextPoints = [\n ...new Set(points.filter((p) => p !== null && p !== -1)),\n ] as number[];\n nextPoints = nextPoints.sort((a, b) => a - b);\n return nextPoints.length ? nextPoints : null;\n};\n", "import {\n ExcalidrawLinearElement,\n ExcalidrawBindableElement,\n NonDeleted,\n NonDeletedExcalidrawElement,\n PointBinding,\n ExcalidrawElement,\n ElementsMap,\n NonDeletedSceneElementsMap,\n} from \"./types\";\nimport { getElementAtPosition } from \"../scene\";\nimport { AppState } from \"../types\";\nimport {\n isBindableElement,\n isBindingElement,\n isLinearElement,\n} from \"./typeChecks\";\nimport {\n bindingBorderTest,\n distanceToBindableElement,\n maxBindingGap,\n determineFocusDistance,\n intersectElementWithLine,\n determineFocusPoint,\n} from \"./collision\";\nimport { mutateElement } from \"./mutateElement\";\nimport Scene from \"../scene/Scene\";\nimport { LinearElementEditor } from \"./linearElementEditor\";\nimport { arrayToMap, tupleToCoors } from \"../utils\";\nimport { KEYS } from \"../keys\";\nimport { getBoundTextElement, handleBindTextResize } from \"./textElement\";\n\nexport type SuggestedBinding =\n | NonDeleted<ExcalidrawBindableElement>\n | SuggestedPointBinding;\n\nexport type SuggestedPointBinding = [\n NonDeleted<ExcalidrawLinearElement>,\n \"start\" | \"end\" | \"both\",\n NonDeleted<ExcalidrawBindableElement>,\n];\n\nexport const shouldEnableBindingForPointerEvent = (\n event: React.PointerEvent<HTMLElement>,\n) => {\n return !event[KEYS.CTRL_OR_CMD];\n};\n\nexport const isBindingEnabled = (appState: AppState): boolean => {\n return appState.isBindingEnabled;\n};\n\nconst getNonDeletedElements = (\n scene: Scene,\n ids: readonly ExcalidrawElement[\"id\"][],\n): NonDeleted<ExcalidrawElement>[] => {\n const result: NonDeleted<ExcalidrawElement>[] = [];\n ids.forEach((id) => {\n const element = scene.getNonDeletedElement(id);\n if (element != null) {\n result.push(element);\n }\n });\n return result;\n};\n\nexport const bindOrUnbindLinearElement = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n startBindingElement: ExcalidrawBindableElement | null | \"keep\",\n endBindingElement: ExcalidrawBindableElement | null | \"keep\",\n elementsMap: NonDeletedSceneElementsMap,\n): void => {\n const boundToElementIds: Set<ExcalidrawBindableElement[\"id\"]> = new Set();\n const unboundFromElementIds: Set<ExcalidrawBindableElement[\"id\"]> = new Set();\n bindOrUnbindLinearElementEdge(\n linearElement,\n startBindingElement,\n endBindingElement,\n \"start\",\n boundToElementIds,\n unboundFromElementIds,\n elementsMap,\n );\n bindOrUnbindLinearElementEdge(\n linearElement,\n endBindingElement,\n startBindingElement,\n \"end\",\n boundToElementIds,\n unboundFromElementIds,\n elementsMap,\n );\n\n const onlyUnbound = Array.from(unboundFromElementIds).filter(\n (id) => !boundToElementIds.has(id),\n );\n\n getNonDeletedElements(Scene.getScene(linearElement)!, onlyUnbound).forEach(\n (element) => {\n mutateElement(element, {\n boundElements: element.boundElements?.filter(\n (element) =>\n element.type !== \"arrow\" || element.id !== linearElement.id,\n ),\n });\n },\n );\n};\n\nconst bindOrUnbindLinearElementEdge = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n bindableElement: ExcalidrawBindableElement | null | \"keep\",\n otherEdgeBindableElement: ExcalidrawBindableElement | null | \"keep\",\n startOrEnd: \"start\" | \"end\",\n // Is mutated\n boundToElementIds: Set<ExcalidrawBindableElement[\"id\"]>,\n // Is mutated\n unboundFromElementIds: Set<ExcalidrawBindableElement[\"id\"]>,\n elementsMap: NonDeletedSceneElementsMap,\n): void => {\n if (bindableElement !== \"keep\") {\n if (bindableElement != null) {\n // Don't bind if we're trying to bind or are already bound to the same\n // element on the other edge already (\"start\" edge takes precedence).\n if (\n otherEdgeBindableElement == null ||\n (otherEdgeBindableElement === \"keep\"\n ? !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(\n linearElement,\n bindableElement,\n startOrEnd,\n )\n : startOrEnd === \"start\" ||\n otherEdgeBindableElement.id !== bindableElement.id)\n ) {\n bindLinearElement(\n linearElement,\n bindableElement,\n startOrEnd,\n elementsMap,\n );\n boundToElementIds.add(bindableElement.id);\n }\n } else {\n const unbound = unbindLinearElement(linearElement, startOrEnd);\n if (unbound != null) {\n unboundFromElementIds.add(unbound);\n }\n }\n }\n};\n\nexport const bindOrUnbindSelectedElements = (\n selectedElements: NonDeleted<ExcalidrawElement>[],\n elements: readonly ExcalidrawElement[],\n elementsMap: NonDeletedSceneElementsMap,\n): void => {\n selectedElements.forEach((selectedElement) => {\n if (isBindingElement(selectedElement)) {\n bindOrUnbindLinearElement(\n selectedElement,\n getElligibleElementForBindingElement(\n selectedElement,\n \"start\",\n elements,\n elementsMap,\n ),\n getElligibleElementForBindingElement(\n selectedElement,\n \"end\",\n elements,\n elementsMap,\n ),\n elementsMap,\n );\n } else if (isBindableElement(selectedElement)) {\n maybeBindBindableElement(selectedElement, elementsMap);\n }\n });\n};\n\nconst maybeBindBindableElement = (\n bindableElement: NonDeleted<ExcalidrawBindableElement>,\n elementsMap: NonDeletedSceneElementsMap,\n): void => {\n getElligibleElementsForBindableElementAndWhere(\n bindableElement,\n elementsMap,\n ).forEach(([linearElement, where]) =>\n bindOrUnbindLinearElement(\n linearElement,\n where === \"end\" ? \"keep\" : bindableElement,\n where === \"start\" ? \"keep\" : bindableElement,\n elementsMap,\n ),\n );\n};\n\nexport const maybeBindLinearElement = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n appState: AppState,\n scene: Scene,\n pointerCoords: { x: number; y: number },\n elementsMap: NonDeletedSceneElementsMap,\n): void => {\n if (appState.startBoundElement != null) {\n bindLinearElement(\n linearElement,\n appState.startBoundElement,\n \"start\",\n elementsMap,\n );\n }\n const hoveredElement = getHoveredElementForBinding(\n pointerCoords,\n scene.getNonDeletedElements(),\n elementsMap,\n );\n if (\n hoveredElement != null &&\n !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(\n linearElement,\n hoveredElement,\n \"end\",\n )\n ) {\n bindLinearElement(linearElement, hoveredElement, \"end\", elementsMap);\n }\n};\n\nexport const bindLinearElement = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n hoveredElement: ExcalidrawBindableElement,\n startOrEnd: \"start\" | \"end\",\n elementsMap: NonDeletedSceneElementsMap,\n): void => {\n mutateElement(linearElement, {\n [startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\"]: {\n elementId: hoveredElement.id,\n ...calculateFocusAndGap(\n linearElement,\n hoveredElement,\n startOrEnd,\n elementsMap,\n ),\n } as PointBinding,\n });\n\n const boundElementsMap = arrayToMap(hoveredElement.boundElements || []);\n if (!boundElementsMap.has(linearElement.id)) {\n mutateElement(hoveredElement, {\n boundElements: (hoveredElement.boundElements || []).concat({\n id: linearElement.id,\n type: \"arrow\",\n }),\n });\n }\n};\n\n// Don't bind both ends of a simple segment\nconst isLinearElementSimpleAndAlreadyBoundOnOppositeEdge = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n bindableElement: ExcalidrawBindableElement,\n startOrEnd: \"start\" | \"end\",\n): boolean => {\n const otherBinding =\n linearElement[startOrEnd === \"start\" ? \"endBinding\" : \"startBinding\"];\n return isLinearElementSimpleAndAlreadyBound(\n linearElement,\n otherBinding?.elementId,\n bindableElement,\n );\n};\n\nexport const isLinearElementSimpleAndAlreadyBound = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n alreadyBoundToId: ExcalidrawBindableElement[\"id\"] | undefined,\n bindableElement: ExcalidrawBindableElement,\n): boolean => {\n return (\n alreadyBoundToId === bindableElement.id && linearElement.points.length < 3\n );\n};\n\nexport const unbindLinearElements = (\n elements: NonDeleted<ExcalidrawElement>[],\n elementsMap: NonDeletedSceneElementsMap,\n): void => {\n elements.forEach((element) => {\n if (isBindingElement(element)) {\n bindOrUnbindLinearElement(element, null, null, elementsMap);\n }\n });\n};\n\nconst unbindLinearElement = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n startOrEnd: \"start\" | \"end\",\n): ExcalidrawBindableElement[\"id\"] | null => {\n const field = startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\";\n const binding = linearElement[field];\n if (binding == null) {\n return null;\n }\n mutateElement(linearElement, { [field]: null });\n return binding.elementId;\n};\n\nexport const getHoveredElementForBinding = (\n pointerCoords: {\n x: number;\n y: number;\n },\n elements: readonly NonDeletedExcalidrawElement[],\n elementsMap: NonDeletedSceneElementsMap,\n): NonDeleted<ExcalidrawBindableElement> | null => {\n const hoveredElement = getElementAtPosition(\n elements,\n (element) =>\n isBindableElement(element, false) &&\n bindingBorderTest(element, pointerCoords, elementsMap),\n );\n return hoveredElement as NonDeleted<ExcalidrawBindableElement> | null;\n};\n\nconst calculateFocusAndGap = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n hoveredElement: ExcalidrawBindableElement,\n startOrEnd: \"start\" | \"end\",\n elementsMap: NonDeletedSceneElementsMap,\n): { focus: number; gap: number } => {\n const direction = startOrEnd === \"start\" ? -1 : 1;\n const edgePointIndex = direction === -1 ? 0 : linearElement.points.length - 1;\n const adjacentPointIndex = edgePointIndex - direction;\n\n const edgePoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n linearElement,\n edgePointIndex,\n elementsMap,\n );\n const adjacentPoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n linearElement,\n adjacentPointIndex,\n elementsMap,\n );\n return {\n focus: determineFocusDistance(\n hoveredElement,\n adjacentPoint,\n edgePoint,\n elementsMap,\n ),\n gap: Math.max(\n 1,\n distanceToBindableElement(hoveredElement, edgePoint, elementsMap),\n ),\n };\n};\n\n// Supports translating, rotating and scaling `changedElement` with bound\n// linear elements.\n// Because scaling involves moving the focus points as well, it is\n// done before the `changedElement` is updated, and the `newSize` is passed\n// in explicitly.\nexport const updateBoundElements = (\n changedElement: NonDeletedExcalidrawElement,\n elementsMap: ElementsMap,\n\n options?: {\n simultaneouslyUpdated?: readonly ExcalidrawElement[];\n newSize?: { width: number; height: number };\n },\n) => {\n const boundLinearElements = (changedElement.boundElements ?? []).filter(\n (el) => el.type === \"arrow\",\n );\n if (boundLinearElements.length === 0) {\n return;\n }\n const { newSize, simultaneouslyUpdated } = options ?? {};\n const simultaneouslyUpdatedElementIds = getSimultaneouslyUpdatedElementIds(\n simultaneouslyUpdated,\n );\n const scene = Scene.getScene(changedElement)!;\n getNonDeletedElements(\n scene,\n boundLinearElements.map((el) => el.id),\n ).forEach((element) => {\n if (!isLinearElement(element)) {\n return;\n }\n\n const bindableElement = changedElement as ExcalidrawBindableElement;\n // In case the boundElements are stale\n if (!doesNeedUpdate(element, bindableElement)) {\n return;\n }\n const startBinding = maybeCalculateNewGapWhenScaling(\n bindableElement,\n element.startBinding,\n newSize,\n );\n const endBinding = maybeCalculateNewGapWhenScaling(\n bindableElement,\n element.endBinding,\n newSize,\n );\n // `linearElement` is being moved/scaled already, just update the binding\n if (simultaneouslyUpdatedElementIds.has(element.id)) {\n mutateElement(element, { startBinding, endBinding });\n return;\n }\n updateBoundPoint(\n element,\n \"start\",\n startBinding,\n changedElement as ExcalidrawBindableElement,\n elementsMap,\n );\n updateBoundPoint(\n element,\n \"end\",\n endBinding,\n changedElement as ExcalidrawBindableElement,\n elementsMap,\n );\n const boundText = getBoundTextElement(\n element,\n scene.getNonDeletedElementsMap(),\n );\n if (boundText) {\n handleBindTextResize(element, scene.getNonDeletedElementsMap(), false);\n }\n });\n};\n\nconst doesNeedUpdate = (\n boundElement: NonDeleted<ExcalidrawLinearElement>,\n changedElement: ExcalidrawBindableElement,\n) => {\n return (\n boundElement.startBinding?.elementId === changedElement.id ||\n boundElement.endBinding?.elementId === changedElement.id\n );\n};\n\nconst getSimultaneouslyUpdatedElementIds = (\n simultaneouslyUpdated: readonly ExcalidrawElement[] | undefined,\n): Set<ExcalidrawElement[\"id\"]> => {\n return new Set((simultaneouslyUpdated || []).map((element) => element.id));\n};\n\nconst updateBoundPoint = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n startOrEnd: \"start\" | \"end\",\n binding: PointBinding | null | undefined,\n changedElement: ExcalidrawBindableElement,\n elementsMap: ElementsMap,\n): void => {\n if (\n binding == null ||\n // We only need to update the other end if this is a 2 point line element\n (binding.elementId !== changedElement.id && linearElement.points.length > 2)\n ) {\n return;\n }\n const bindingElement = Scene.getScene(linearElement)!.getElement(\n binding.elementId,\n ) as ExcalidrawBindableElement | null;\n if (bindingElement == null) {\n // We're not cleaning up after deleted elements atm., so handle this case\n return;\n }\n const direction = startOrEnd === \"start\" ? -1 : 1;\n const edgePointIndex = direction === -1 ? 0 : linearElement.points.length - 1;\n const adjacentPointIndex = edgePointIndex - direction;\n const adjacentPoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n linearElement,\n adjacentPointIndex,\n elementsMap,\n );\n const focusPointAbsolute = determineFocusPoint(\n bindingElement,\n binding.focus,\n adjacentPoint,\n elementsMap,\n );\n let newEdgePoint;\n // The linear element was not originally pointing inside the bound shape,\n // we can point directly at the focus point\n if (binding.gap === 0) {\n newEdgePoint = focusPointAbsolute;\n } else {\n const intersections = intersectElementWithLine(\n bindingElement,\n adjacentPoint,\n focusPointAbsolute,\n binding.gap,\n elementsMap,\n );\n if (intersections.length === 0) {\n // This should never happen, since focusPoint should always be\n // inside the element, but just in case, bail out\n newEdgePoint = focusPointAbsolute;\n } else {\n // Guaranteed to intersect because focusPoint is always inside the shape\n newEdgePoint = intersections[0];\n }\n }\n LinearElementEditor.movePoints(\n linearElement,\n [\n {\n index: edgePointIndex,\n point: LinearElementEditor.pointFromAbsoluteCoords(\n linearElement,\n newEdgePoint,\n elementsMap,\n ),\n },\n ],\n { [startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\"]: binding },\n );\n};\n\nconst maybeCalculateNewGapWhenScaling = (\n changedElement: ExcalidrawBindableElement,\n currentBinding: PointBinding | null | undefined,\n newSize: { width: number; height: number } | undefined,\n): PointBinding | null | undefined => {\n if (currentBinding == null || newSize == null) {\n return currentBinding;\n }\n const { gap, focus, elementId } = currentBinding;\n const { width: newWidth, height: newHeight } = newSize;\n const { width, height } = changedElement;\n const newGap = Math.max(\n 1,\n Math.min(\n maxBindingGap(changedElement, newWidth, newHeight),\n gap * (newWidth < newHeight ? newWidth / width : newHeight / height),\n ),\n );\n return { elementId, gap: newGap, focus };\n};\n\n// TODO: this is a bottleneck, optimise\nexport const getEligibleElementsForBinding = (\n selectedElements: NonDeleted<ExcalidrawElement>[],\n elements: readonly ExcalidrawElement[],\n elementsMap: NonDeletedSceneElementsMap,\n): SuggestedBinding[] => {\n const includedElementIds = new Set(selectedElements.map(({ id }) => id));\n return selectedElements.flatMap((selectedElement) =>\n isBindingElement(selectedElement, false)\n ? (getElligibleElementsForBindingElement(\n selectedElement as NonDeleted<ExcalidrawLinearElement>,\n elements,\n elementsMap,\n ).filter(\n (element) => !includedElementIds.has(element.id),\n ) as SuggestedBinding[])\n : isBindableElement(selectedElement, false)\n ? getElligibleElementsForBindableElementAndWhere(\n selectedElement,\n elementsMap,\n ).filter((binding) => !includedElementIds.has(binding[0].id))\n : [],\n );\n};\n\nconst getElligibleElementsForBindingElement = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n elements: readonly ExcalidrawElement[],\n elementsMap: NonDeletedSceneElementsMap,\n): NonDeleted<ExcalidrawBindableElement>[] => {\n return [\n getElligibleElementForBindingElement(\n linearElement,\n \"start\",\n elements,\n elementsMap,\n ),\n getElligibleElementForBindingElement(\n linearElement,\n \"end\",\n elements,\n elementsMap,\n ),\n ].filter(\n (element): element is NonDeleted<ExcalidrawBindableElement> =>\n element != null,\n );\n};\n\nconst getElligibleElementForBindingElement = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n startOrEnd: \"start\" | \"end\",\n elements: readonly ExcalidrawElement[],\n elementsMap: NonDeletedSceneElementsMap,\n): NonDeleted<ExcalidrawBindableElement> | null => {\n return getHoveredElementForBinding(\n getLinearElementEdgeCoors(linearElement, startOrEnd, elementsMap),\n elements,\n elementsMap,\n );\n};\n\nconst getLinearElementEdgeCoors = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n startOrEnd: \"start\" | \"end\",\n elementsMap: NonDeletedSceneElementsMap,\n): { x: number; y: number } => {\n const index = startOrEnd === \"start\" ? 0 : -1;\n return tupleToCoors(\n LinearElementEditor.getPointAtIndexGlobalCoordinates(\n linearElement,\n index,\n elementsMap,\n ),\n );\n};\n\nconst getElligibleElementsForBindableElementAndWhere = (\n bindableElement: NonDeleted<ExcalidrawBindableElement>,\n elementsMap: NonDeletedSceneElementsMap,\n): SuggestedPointBinding[] => {\n const scene = Scene.getScene(bindableElement)!;\n return scene\n .getNonDeletedElements()\n .map((element) => {\n if (!isBindingElement(element, false)) {\n return null;\n }\n const canBindStart = isLinearElementEligibleForNewBindingByBindable(\n element,\n \"start\",\n bindableElement,\n elementsMap,\n );\n const canBindEnd = isLinearElementEligibleForNewBindingByBindable(\n element,\n \"end\",\n bindableElement,\n elementsMap,\n );\n if (!canBindStart && !canBindEnd) {\n return null;\n }\n return [\n element,\n canBindStart && canBindEnd ? \"both\" : canBindStart ? \"start\" : \"end\",\n bindableElement,\n ];\n })\n .filter((maybeElement) => maybeElement != null) as SuggestedPointBinding[];\n};\n\nconst isLinearElementEligibleForNewBindingByBindable = (\n linearElement: NonDeleted<ExcalidrawLinearElement>,\n startOrEnd: \"start\" | \"end\",\n bindableElement: NonDeleted<ExcalidrawBindableElement>,\n elementsMap: NonDeletedSceneElementsMap,\n): boolean => {\n const existingBinding =\n linearElement[startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\"];\n return (\n existingBinding == null &&\n !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(\n linearElement,\n bindableElement,\n startOrEnd,\n ) &&\n bindingBorderTest(\n bindableElement,\n getLinearElementEdgeCoors(linearElement, startOrEnd, elementsMap),\n elementsMap,\n )\n );\n};\n\n// We need to:\n// 1: Update elements not selected to point to duplicated elements\n// 2: Update duplicated elements to point to other duplicated elements\nexport const fixBindingsAfterDuplication = (\n sceneElements: readonly ExcalidrawElement[],\n oldElements: readonly ExcalidrawElement[],\n oldIdToDuplicatedId: Map<ExcalidrawElement[\"id\"], ExcalidrawElement[\"id\"]>,\n // There are three copying mechanisms: Copy-paste, duplication and alt-drag.\n // Only when alt-dragging the new \"duplicates\" act as the \"old\", while\n // the \"old\" elements act as the \"new copy\" - essentially working reverse\n // to the other two.\n duplicatesServeAsOld?: \"duplicatesServeAsOld\" | undefined,\n): void => {\n // First collect all the binding/bindable elements, so we only update\n // each once, regardless of whether they were duplicated or not.\n const allBoundElementIds: Set<ExcalidrawElement[\"id\"]> = new Set();\n const allBindableElementIds: Set<ExcalidrawElement[\"id\"]> = new Set();\n const shouldReverseRoles = duplicatesServeAsOld === \"duplicatesServeAsOld\";\n oldElements.forEach((oldElement) => {\n const { boundElements } = oldElement;\n if (boundElements != null && boundElements.length > 0) {\n boundElements.forEach((boundElement) => {\n if (shouldReverseRoles && !oldIdToDuplicatedId.has(boundElement.id)) {\n allBoundElementIds.add(boundElement.id);\n }\n });\n allBindableElementIds.add(oldIdToDuplicatedId.get(oldElement.id)!);\n }\n if (isBindingElement(oldElement)) {\n if (oldElement.startBinding != null) {\n const { elementId } = oldElement.startBinding;\n if (shouldReverseRoles && !oldIdToDuplicatedId.has(elementId)) {\n allBindableElementIds.add(elementId);\n }\n }\n if (oldElement.endBinding != null) {\n const { elementId } = oldElement.endBinding;\n if (shouldReverseRoles && !oldIdToDuplicatedId.has(elementId)) {\n allBindableElementIds.add(elementId);\n }\n }\n if (oldElement.startBinding != null || oldElement.endBinding != null) {\n allBoundElementIds.add(oldIdToDuplicatedId.get(oldElement.id)!);\n }\n }\n });\n\n // Update the linear elements\n (\n sceneElements.filter(({ id }) =>\n allBoundElementIds.has(id),\n ) as ExcalidrawLinearElement[]\n ).forEach((element) => {\n const { startBinding, endBinding } = element;\n mutateElement(element, {\n startBinding: newBindingAfterDuplication(\n startBinding,\n oldIdToDuplicatedId,\n ),\n endBinding: newBindingAfterDuplication(endBinding, oldIdToDuplicatedId),\n });\n });\n\n // Update the bindable shapes\n sceneElements\n .filter(({ id }) => allBindableElementIds.has(id))\n .forEach((bindableElement) => {\n const { boundElements } = bindableElement;\n if (boundElements != null && boundElements.length > 0) {\n mutateElement(bindableElement, {\n boundElements: boundElements.map((boundElement) =>\n oldIdToDuplicatedId.has(boundElement.id)\n ? {\n id: oldIdToDuplicatedId.get(boundElement.id)!,\n type: boundElement.type,\n }\n : boundElement,\n ),\n });\n }\n });\n};\n\nconst newBindingAfterDuplication = (\n binding: PointBinding | null,\n oldIdToDuplicatedId: Map<ExcalidrawElement[\"id\"], ExcalidrawElement[\"id\"]>,\n): PointBinding | null => {\n if (binding == null) {\n return null;\n }\n const { elementId, focus, gap } = binding;\n return {\n focus,\n gap,\n elementId: oldIdToDuplicatedId.get(elementId) ?? elementId,\n };\n};\n\nexport const fixBindingsAfterDeletion = (\n sceneElements: readonly ExcalidrawElement[],\n deletedElements: readonly ExcalidrawElement[],\n): void => {\n const deletedElementIds = new Set(\n deletedElements.map((element) => element.id),\n );\n // non-deleted which bindings need to be updated\n const affectedElements: Set<ExcalidrawElement[\"id\"]> = new Set();\n deletedElements.forEach((deletedElement) => {\n if (isBindableElement(deletedElement)) {\n deletedElement.boundElements?.forEach((element) => {\n if (!deletedElementIds.has(element.id)) {\n affectedElements.add(element.id);\n }\n });\n } else if (isBindingElement(deletedElement)) {\n if (deletedElement.startBinding) {\n affectedElements.add(deletedElement.startBinding.elementId);\n }\n if (deletedElement.endBinding) {\n affectedElements.add(deletedElement.endBinding.elementId);\n }\n }\n });\n sceneElements\n .filter(({ id }) => affectedElements.has(id))\n .forEach((element) => {\n if (isBindableElement(element)) {\n mutateElement(element, {\n boundElements: newBoundElementsAfterDeletion(\n element.boundElements,\n deletedElementIds,\n ),\n });\n } else if (isBindingElement(element)) {\n mutateElement(element, {\n startBinding: newBindingAfterDeletion(\n element.startBinding,\n deletedElementIds,\n ),\n endBinding: newBindingAfterDeletion(\n element.endBinding,\n deletedElementIds,\n ),\n });\n }\n });\n};\n\nconst newBindingAfterDeletion = (\n binding: PointBinding | null,\n deletedElementIds: Set<ExcalidrawElement[\"id\"]>,\n): PointBinding | null => {\n if (binding == null || deletedElementIds.has(binding.elementId)) {\n return null;\n }\n return binding;\n};\n\nconst newBoundElementsAfterDeletion = (\n boundElements: ExcalidrawElement[\"boundElements\"],\n deletedElementIds: Set<ExcalidrawElement[\"id\"]>,\n) => {\n if (!boundElements) {\n return null;\n }\n return boundElements.filter((ele) => !deletedElementIds.has(ele.id));\n};\n", "export {\n isSomeElementSelected,\n getElementsWithinSelection,\n getCommonAttributeOfSelectedElements,\n getSelectedElements,\n getTargetElements,\n} from \"./selection\";\nexport { calculateScrollCenter } from \"./scroll\";\nexport {\n hasBackground,\n hasStrokeWidth,\n hasStrokeStyle,\n canHaveArrowheads,\n canChangeRoundness,\n getElementAtPosition,\n getElementsAtPosition,\n} from \"./comparisons\";\nexport { getNormalizedZoom } from \"./zoom\";\n", "import { AppState, PointerCoords, Zoom } from \"../types\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport {\n getCommonBounds,\n getClosestElementBounds,\n getVisibleElements,\n} from \"../element\";\n\nimport {\n sceneCoordsToViewportCoords,\n viewportCoordsToSceneCoords,\n} from \"../utils\";\n\nconst isOutsideViewPort = (appState: AppState, cords: Array<number>) => {\n const [x1, y1, x2, y2] = cords;\n const { x: viewportX1, y: viewportY1 } = sceneCoordsToViewportCoords(\n { sceneX: x1, sceneY: y1 },\n appState,\n );\n const { x: viewportX2, y: viewportY2 } = sceneCoordsToViewportCoords(\n { sceneX: x2, sceneY: y2 },\n appState,\n );\n return (\n viewportX2 - viewportX1 > appState.width ||\n viewportY2 - viewportY1 > appState.height\n );\n};\n\nexport const centerScrollOn = ({\n scenePoint,\n viewportDimensions,\n zoom,\n}: {\n scenePoint: PointerCoords;\n viewportDimensions: { height: number; width: number };\n zoom: Zoom;\n}) => {\n return {\n scrollX: viewportDimensions.width / 2 / zoom.value - scenePoint.x,\n scrollY: viewportDimensions.height / 2 / zoom.value - scenePoint.y,\n };\n};\n\nexport const calculateScrollCenter = (\n elements: readonly ExcalidrawElement[],\n appState: AppState,\n): { scrollX: number; scrollY: number } => {\n elements = getVisibleElements(elements);\n\n if (!elements.length) {\n return {\n scrollX: 0,\n scrollY: 0,\n };\n }\n let [x1, y1, x2, y2] = getCommonBounds(elements);\n\n if (isOutsideViewPort(appState, [x1, y1, x2, y2])) {\n [x1, y1, x2, y2] = getClosestElementBounds(\n elements,\n viewportCoordsToSceneCoords(\n { clientX: appState.scrollX, clientY: appState.scrollY },\n appState,\n ),\n );\n }\n\n const centerX = (x1 + x2) / 2;\n const centerY = (y1 + y2) / 2;\n\n return centerScrollOn({\n scenePoint: { x: centerX, y: centerY },\n viewportDimensions: { width: appState.width, height: appState.height },\n zoom: appState.zoom,\n });\n};\n", "import { isIframeElement } from \"../element/typeChecks\";\nimport {\n ExcalidrawIframeElement,\n NonDeletedExcalidrawElement,\n} from \"../element/types\";\nimport { ElementOrToolType } from \"../types\";\n\nexport const hasBackground = (type: ElementOrToolType) =>\n type === \"rectangle\" ||\n type === \"iframe\" ||\n type === \"embeddable\" ||\n type === \"ellipse\" ||\n type === \"diamond\" ||\n type === \"line\" ||\n type === \"freedraw\";\n\nexport const hasStrokeColor = (type: ElementOrToolType) =>\n type !== \"image\" && type !== \"frame\" && type !== \"magicframe\";\n\nexport const hasStrokeWidth = (type: ElementOrToolType) =>\n type === \"rectangle\" ||\n type === \"iframe\" ||\n type === \"embeddable\" ||\n type === \"ellipse\" ||\n type === \"diamond\" ||\n type === \"freedraw\" ||\n type === \"arrow\" ||\n type === \"line\";\n\nexport const hasStrokeStyle = (type: ElementOrToolType) =>\n type === \"rectangle\" ||\n type === \"iframe\" ||\n type === \"embeddable\" ||\n type === \"ellipse\" ||\n type === \"diamond\" ||\n type === \"arrow\" ||\n type === \"line\";\n\nexport const canChangeRoundness = (type: ElementOrToolType) =>\n type === \"rectangle\" ||\n type === \"iframe\" ||\n type === \"embeddable\" ||\n type === \"arrow\" ||\n type === \"line\" ||\n type === \"diamond\" ||\n type === \"image\";\n\nexport const canHaveArrowheads = (type: ElementOrToolType) => type === \"arrow\";\n\nexport const getElementAtPosition = (\n elements: readonly NonDeletedExcalidrawElement[],\n isAtPositionFn: (element: NonDeletedExcalidrawElement) => boolean,\n) => {\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n // because array is ordered from lower z-index to highest and we want element z-index\n // with higher z-index\n for (let index = elements.length - 1; index >= 0; --index) {\n const element = elements[index];\n if (element.isDeleted) {\n continue;\n }\n if (isAtPositionFn(element)) {\n hitElement = element;\n break;\n }\n }\n\n return hitElement;\n};\n\nexport const getElementsAtPosition = (\n elements: readonly NonDeletedExcalidrawElement[],\n isAtPositionFn: (element: NonDeletedExcalidrawElement) => boolean,\n) => {\n const iframeLikes: ExcalidrawIframeElement[] = [];\n // The parameter elements comes ordered from lower z-index to higher.\n // We want to preserve that order on the returned array.\n // Exception being embeddables which should be on top of everything else in\n // terms of hit testing.\n const elsAtPos = elements.filter((element) => {\n const hit = !element.isDeleted && isAtPositionFn(element);\n if (hit) {\n if (isIframeElement(element)) {\n iframeLikes.push(element);\n return false;\n }\n return true;\n }\n return false;\n });\n return elsAtPos.concat(iframeLikes);\n};\n", "import { MIN_ZOOM } from \"../constants\";\nimport { AppState, NormalizedZoomValue } from \"../types\";\n\nexport const getNormalizedZoom = (zoom: number): NormalizedZoomValue => {\n return Math.max(MIN_ZOOM, Math.min(zoom, 30)) as NormalizedZoomValue;\n};\n\nexport const getStateForZoom = (\n {\n viewportX,\n viewportY,\n nextZoom,\n }: {\n viewportX: number;\n viewportY: number;\n nextZoom: NormalizedZoomValue;\n },\n appState: AppState,\n) => {\n const appLayerX = viewportX - appState.offsetLeft;\n const appLayerY = viewportY - appState.offsetTop;\n\n const currentZoom = appState.zoom.value;\n\n // get original scroll position without zoom\n const baseScrollX = appState.scrollX + (appLayerX - appLayerX / currentZoom);\n const baseScrollY = appState.scrollY + (appLayerY - appLayerY / currentZoom);\n\n // get scroll offsets for target zoom level\n const zoomOffsetScrollX = -(appLayerX - appLayerX / nextZoom);\n const zoomOffsetScrollY = -(appLayerY - appLayerY / nextZoom);\n\n return {\n scrollX: baseScrollX + zoomOffsetScrollX,\n scrollY: baseScrollY + zoomOffsetScrollY,\n zoom: {\n value: nextZoom,\n },\n };\n};\n", "import * as GA from \"../ga\";\nimport * as GAPoint from \"../gapoints\";\nimport * as GADirection from \"../gadirections\";\nimport * as GALine from \"../galines\";\nimport * as GATransform from \"../gatransforms\";\n\nimport {\n distance2d,\n rotatePoint,\n isPathALoop,\n isPointInPolygon,\n rotate,\n} from \"../math\";\nimport { pointsOnBezierCurves } from \"points-on-curve\";\n\nimport {\n NonDeletedExcalidrawElement,\n ExcalidrawBindableElement,\n ExcalidrawElement,\n ExcalidrawRectangleElement,\n ExcalidrawDiamondElement,\n ExcalidrawTextElement,\n ExcalidrawEllipseElement,\n NonDeleted,\n ExcalidrawFreeDrawElement,\n ExcalidrawImageElement,\n ExcalidrawLinearElement,\n StrokeRoundness,\n ExcalidrawFrameLikeElement,\n ExcalidrawIframeLikeElement,\n ElementsMap,\n} from \"./types\";\n\nimport {\n getElementAbsoluteCoords,\n getCurvePathOps,\n getRectangleBoxAbsoluteCoords,\n RectangleBox,\n} from \"./bounds\";\nimport { FrameNameBoundsCache, Point } from \"../types\";\nimport { Drawable } from \"roughjs/bin/core\";\nimport { AppState } from \"../types\";\nimport {\n hasBoundTextElement,\n isFrameLikeElement,\n isIframeLikeElement,\n isImageElement,\n} from \"./typeChecks\";\nimport { isTextElement } from \".\";\nimport { isTransparent } from \"../utils\";\nimport { shouldShowBoundingBox } from \"./transformHandles\";\nimport { getBoundTextElement } from \"./textElement\";\nimport { Mutable } from \"../utility-types\";\nimport { ShapeCache } from \"../scene/ShapeCache\";\n\nconst isElementDraggableFromInside = (\n element: NonDeletedExcalidrawElement,\n): boolean => {\n if (element.type === \"arrow\") {\n return false;\n }\n\n if (element.type === \"freedraw\") {\n return true;\n }\n const isDraggableFromInside =\n !isTransparent(element.backgroundColor) ||\n hasBoundTextElement(element) ||\n isIframeLikeElement(element);\n if (element.type === \"line\") {\n return isDraggableFromInside && isPathALoop(element.points);\n }\n return isDraggableFromInside || isImageElement(element);\n};\n\nexport const hitTest = (\n element: NonDeletedExcalidrawElement,\n appState: AppState,\n frameNameBoundsCache: FrameNameBoundsCache,\n x: number,\n y: number,\n elementsMap: ElementsMap,\n): boolean => {\n // How many pixels off the shape boundary we still consider a hit\n const threshold = 10 / appState.zoom.value;\n const point: Point = [x, y];\n\n if (\n isElementSelected(appState, element) &&\n shouldShowBoundingBox([element], appState)\n ) {\n return isPointHittingElementBoundingBox(\n element,\n elementsMap,\n point,\n threshold,\n frameNameBoundsCache,\n );\n }\n\n const boundTextElement = getBoundTextElement(element, elementsMap);\n if (boundTextElement) {\n const isHittingBoundTextElement = hitTest(\n boundTextElement,\n appState,\n frameNameBoundsCache,\n x,\n y,\n elementsMap,\n );\n if (isHittingBoundTextElement) {\n return true;\n }\n }\n return isHittingElementNotConsideringBoundingBox(\n element,\n appState,\n frameNameBoundsCache,\n point,\n elementsMap,\n );\n};\n\nexport const isHittingElementBoundingBoxWithoutHittingElement = (\n element: NonDeletedExcalidrawElement,\n appState: AppState,\n frameNameBoundsCache: FrameNameBoundsCache,\n x: number,\n y: number,\n elementsMap: ElementsMap,\n): boolean => {\n const threshold = 10 / appState.zoom.value;\n\n // So that bound text element hit is considered within bounding box of container even if its outside actual bounding box of element\n // eg for linear elements text can be outside the element bounding box\n const boundTextElement = getBoundTextElement(element, elementsMap);\n if (\n boundTextElement &&\n hitTest(boundTextElement, appState, frameNameBoundsCache, x, y, elementsMap)\n ) {\n return false;\n }\n\n return (\n !isHittingElementNotConsideringBoundingBox(\n element,\n appState,\n frameNameBoundsCache,\n [x, y],\n elementsMap,\n ) &&\n isPointHittingElementBoundingBox(\n element,\n elementsMap,\n [x, y],\n threshold,\n frameNameBoundsCache,\n )\n );\n};\n\nexport const isHittingElementNotConsideringBoundingBox = (\n element: NonDeletedExcalidrawElement,\n appState: AppState,\n frameNameBoundsCache: FrameNameBoundsCache | null,\n point: Point,\n elementsMap: ElementsMap,\n): boolean => {\n const threshold = 10 / appState.zoom.value;\n const check = isTextElement(element)\n ? isStrictlyInside\n : isElementDraggableFromInside(element)\n ? isInsideCheck\n : isNearCheck;\n return hitTestPointAgainstElement({\n element,\n elementsMap,\n point,\n threshold,\n check,\n frameNameBoundsCache,\n });\n};\n\nconst isElementSelected = (\n appState: AppState,\n element: NonDeleted<ExcalidrawElement>,\n) => appState.selectedElementIds[element.id];\n\nexport const isPointHittingElementBoundingBox = (\n element: NonDeleted<ExcalidrawElement>,\n elementsMap: ElementsMap,\n [x, y]: Point,\n threshold: number,\n frameNameBoundsCache: FrameNameBoundsCache | null,\n) => {\n // frames needs be checked differently so as to be able to drag it\n // by its frame, whether it has been selected or not\n // this logic here is not ideal\n // TODO: refactor it later...\n if (isFrameLikeElement(element)) {\n return hitTestPointAgainstElement({\n element,\n elementsMap,\n point: [x, y],\n threshold,\n check: isInsideCheck,\n frameNameBoundsCache,\n });\n }\n\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const elementCenterX = (x1 + x2) / 2;\n const elementCenterY = (y1 + y2) / 2;\n // reverse rotate to take element's angle into account.\n const [rotatedX, rotatedY] = rotate(\n x,\n y,\n elementCenterX,\n elementCenterY,\n -element.angle,\n );\n\n return (\n rotatedX > x1 - threshold &&\n rotatedX < x2 + threshold &&\n rotatedY > y1 - threshold &&\n rotatedY < y2 + threshold\n );\n};\n\nexport const bindingBorderTest = (\n element: NonDeleted<ExcalidrawBindableElement>,\n { x, y }: { x: number; y: number },\n elementsMap: ElementsMap,\n): boolean => {\n const threshold = maxBindingGap(element, element.width, element.height);\n const check = isOutsideCheck;\n const point: Point = [x, y];\n return hitTestPointAgainstElement({\n element,\n elementsMap,\n point,\n threshold,\n check,\n frameNameBoundsCache: null,\n });\n};\n\nexport const maxBindingGap = (\n element: ExcalidrawElement,\n elementWidth: number,\n elementHeight: number,\n): number => {\n // Aligns diamonds with rectangles\n const shapeRatio = element.type === \"diamond\" ? 1 / Math.sqrt(2) : 1;\n const smallerDimension = shapeRatio * Math.min(elementWidth, elementHeight);\n // We make the bindable boundary bigger for bigger elements\n return Math.max(16, Math.min(0.25 * smallerDimension, 32));\n};\n\ntype HitTestArgs = {\n element: NonDeletedExcalidrawElement;\n elementsMap: ElementsMap;\n point: Point;\n threshold: number;\n check: (distance: number, threshold: number) => boolean;\n frameNameBoundsCache: FrameNameBoundsCache | null;\n};\n\nconst hitTestPointAgainstElement = (args: HitTestArgs): boolean => {\n switch (args.element.type) {\n case \"rectangle\":\n case \"iframe\":\n case \"embeddable\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n case \"ellipse\":\n const distance = distanceToBindableElement(\n args.element,\n args.point,\n args.elementsMap,\n );\n return args.check(distance, args.threshold);\n case \"freedraw\": {\n if (\n !args.check(\n distanceToRectangle(args.element, args.point, args.elementsMap),\n args.threshold,\n )\n ) {\n return false;\n }\n\n return hitTestFreeDrawElement(\n args.element,\n args.point,\n args.threshold,\n args.elementsMap,\n );\n }\n case \"arrow\":\n case \"line\":\n return hitTestLinear(args);\n case \"selection\":\n console.warn(\n \"This should not happen, we need to investigate why it does.\",\n );\n return false;\n case \"frame\":\n case \"magicframe\": {\n // check distance to frame element first\n if (\n args.check(\n distanceToBindableElement(args.element, args.point, args.elementsMap),\n args.threshold,\n )\n ) {\n return true;\n }\n\n const frameNameBounds = args.frameNameBoundsCache?.get(args.element);\n\n if (frameNameBounds) {\n return args.check(\n distanceToRectangleBox(frameNameBounds, args.point),\n args.threshold,\n );\n }\n return false;\n }\n }\n};\n\nexport const distanceToBindableElement = (\n element: ExcalidrawBindableElement,\n point: Point,\n elementsMap: ElementsMap,\n): number => {\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"iframe\":\n case \"embeddable\":\n case \"frame\":\n case \"magicframe\":\n return distanceToRectangle(element, point, elementsMap);\n case \"diamond\":\n return distanceToDiamond(element, point, elementsMap);\n case \"ellipse\":\n return distanceToEllipse(element, point, elementsMap);\n }\n};\n\nconst isStrictlyInside = (distance: number, threshold: number): boolean => {\n return distance < 0;\n};\n\nconst isInsideCheck = (distance: number, threshold: number): boolean => {\n return distance < threshold;\n};\n\nconst isNearCheck = (distance: number, threshold: number): boolean => {\n return Math.abs(distance) < threshold;\n};\n\nconst isOutsideCheck = (distance: number, threshold: number): boolean => {\n return 0 <= distance && distance < threshold;\n};\n\nconst distanceToRectangle = (\n element:\n | ExcalidrawRectangleElement\n | ExcalidrawTextElement\n | ExcalidrawFreeDrawElement\n | ExcalidrawImageElement\n | ExcalidrawIframeLikeElement\n | ExcalidrawFrameLikeElement,\n point: Point,\n elementsMap: ElementsMap,\n): number => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(\n element,\n point,\n elementsMap,\n );\n return Math.max(\n GAPoint.distanceToLine(pointRel, GALine.equation(0, 1, -hheight)),\n GAPoint.distanceToLine(pointRel, GALine.equation(1, 0, -hwidth)),\n );\n};\n\nconst distanceToRectangleBox = (box: RectangleBox, point: Point): number => {\n const [, pointRel, hwidth, hheight] = pointRelativeToDivElement(point, box);\n return Math.max(\n GAPoint.distanceToLine(pointRel, GALine.equation(0, 1, -hheight)),\n GAPoint.distanceToLine(pointRel, GALine.equation(1, 0, -hwidth)),\n );\n};\n\nconst distanceToDiamond = (\n element: ExcalidrawDiamondElement,\n point: Point,\n elementsMap: ElementsMap,\n): number => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(\n element,\n point,\n elementsMap,\n );\n const side = GALine.equation(hheight, hwidth, -hheight * hwidth);\n return GAPoint.distanceToLine(pointRel, side);\n};\n\nconst distanceToEllipse = (\n element: ExcalidrawEllipseElement,\n point: Point,\n elementsMap: ElementsMap,\n): number => {\n const [pointRel, tangent] = ellipseParamsForTest(element, point, elementsMap);\n return -GALine.sign(tangent) * GAPoint.distanceToLine(pointRel, tangent);\n};\n\nconst ellipseParamsForTest = (\n element: ExcalidrawEllipseElement,\n point: Point,\n elementsMap: ElementsMap,\n): [GA.Point, GA.Line] => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(\n element,\n point,\n elementsMap,\n );\n const [px, py] = GAPoint.toTuple(pointRel);\n\n // We're working in positive quadrant, so start with `t = 45deg`, `tx=cos(t)`\n let tx = 0.707;\n let ty = 0.707;\n\n const a = hwidth;\n const b = hheight;\n\n // This is a numerical method to find the params tx, ty at which\n // the ellipse has the closest point to the given point\n [0, 1, 2, 3].forEach((_) => {\n const xx = a * tx;\n const yy = b * ty;\n\n const ex = ((a * a - b * b) * tx ** 3) / a;\n const ey = ((b * b - a * a) * ty ** 3) / b;\n\n const rx = xx - ex;\n const ry = yy - ey;\n\n const qx = px - ex;\n const qy = py - ey;\n\n const r = Math.hypot(ry, rx);\n const q = Math.hypot(qy, qx);\n\n tx = Math.min(1, Math.max(0, ((qx * r) / q + ex) / a));\n ty = Math.min(1, Math.max(0, ((qy * r) / q + ey) / b));\n const t = Math.hypot(ty, tx);\n tx /= t;\n ty /= t;\n });\n\n const closestPoint = GA.point(a * tx, b * ty);\n\n const tangent = GALine.orthogonalThrough(pointRel, closestPoint);\n return [pointRel, tangent];\n};\n\nconst hitTestFreeDrawElement = (\n element: ExcalidrawFreeDrawElement,\n point: Point,\n threshold: number,\n elementsMap: ElementsMap,\n): boolean => {\n // Check point-distance-to-line-segment for every segment in the\n // element's points (its input points, not its outline points).\n // This is... okay? It's plenty fast, but the GA library may\n // have a faster option.\n\n let x: number;\n let y: number;\n\n if (element.angle === 0) {\n x = point[0] - element.x;\n y = point[1] - element.y;\n } else {\n // Counter-rotate the point around center before testing\n const [minX, minY, maxX, maxY] = getElementAbsoluteCoords(\n element,\n elementsMap,\n );\n const rotatedPoint = rotatePoint(\n point,\n [minX + (maxX - minX) / 2, minY + (maxY - minY) / 2],\n -element.angle,\n );\n x = rotatedPoint[0] - element.x;\n y = rotatedPoint[1] - element.y;\n }\n\n let [A, B] = element.points;\n let P: readonly [number, number];\n\n // For freedraw dots\n if (\n distance2d(A[0], A[1], x, y) < threshold ||\n distance2d(B[0], B[1], x, y) < threshold\n ) {\n return true;\n }\n\n // For freedraw lines\n for (let i = 0; i < element.points.length; i++) {\n const delta = [B[0] - A[0], B[1] - A[1]];\n const length = Math.hypot(delta[1], delta[0]);\n\n const U = [delta[0] / length, delta[1] / length];\n const C = [x - A[0], y - A[1]];\n const d = (C[0] * U[0] + C[1] * U[1]) / Math.hypot(U[1], U[0]);\n P = [A[0] + U[0] * d, A[1] + U[1] * d];\n\n const da = distance2d(P[0], P[1], A[0], A[1]);\n const db = distance2d(P[0], P[1], B[0], B[1]);\n\n P = db < da && da > length ? B : da < db && db > length ? A : P;\n\n if (Math.hypot(y - P[1], x - P[0]) < threshold) {\n return true;\n }\n\n A = B;\n B = element.points[i + 1];\n }\n\n const shape = ShapeCache.get(element);\n\n // for filled freedraw shapes, support\n // selecting from inside\n if (shape && shape.sets.length) {\n return element.fillStyle === \"solid\"\n ? hitTestCurveInside(shape, x, y, \"round\")\n : hitTestRoughShape(shape, x, y, threshold);\n }\n\n return false;\n};\n\nconst hitTestLinear = (args: HitTestArgs): boolean => {\n const { element, threshold } = args;\n if (!ShapeCache.get(element)) {\n return false;\n }\n\n const [point, pointAbs, hwidth, hheight] = pointRelativeToElement(\n args.element,\n args.point,\n args.elementsMap,\n );\n const side1 = GALine.equation(0, 1, -hheight);\n const side2 = GALine.equation(1, 0, -hwidth);\n if (\n !isInsideCheck(GAPoint.distanceToLine(pointAbs, side1), threshold) ||\n !isInsideCheck(GAPoint.distanceToLine(pointAbs, side2), threshold)\n ) {\n return false;\n }\n const [relX, relY] = GAPoint.toTuple(point);\n\n const shape = ShapeCache.get(element as ExcalidrawLinearElement);\n\n if (!shape) {\n return false;\n }\n\n if (args.check === isInsideCheck) {\n const hit = shape.some((subshape) =>\n hitTestCurveInside(\n subshape,\n relX,\n relY,\n element.roundness ? \"round\" : \"sharp\",\n ),\n );\n if (hit) {\n return true;\n }\n }\n\n // hit test all \"subshapes\" of the linear element\n return shape.some((subshape) =>\n hitTestRoughShape(subshape, relX, relY, threshold),\n );\n};\n\n// Returns:\n// 1. the point relative to the elements (x, y) position\n// 2. the point relative to the element's center with positive (x, y)\n// 3. half element width\n// 4. half element height\n//\n// Note that for linear elements the (x, y) position is not at the\n// top right corner of their boundary.\n//\n// Rectangles, diamonds and ellipses are symmetrical over axes,\n// and other elements have a rectangular boundary,\n// so we only need to perform hit tests for the positive quadrant.\nconst pointRelativeToElement = (\n element: ExcalidrawElement,\n pointTuple: Point,\n elementsMap: ElementsMap,\n): [GA.Point, GA.Point, number, number] => {\n const point = GAPoint.from(pointTuple);\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const center = coordsCenter(x1, y1, x2, y2);\n // GA has angle orientation opposite to `rotate`\n const rotate = GATransform.rotation(center, element.angle);\n const pointRotated = GATransform.apply(rotate, point);\n const pointRelToCenter = GA.sub(pointRotated, GADirection.from(center));\n const pointRelToCenterAbs = GAPoint.abs(pointRelToCenter);\n const elementPos = GA.offset(element.x, element.y);\n const pointRelToPos = GA.sub(pointRotated, elementPos);\n const halfWidth = (x2 - x1) / 2;\n const halfHeight = (y2 - y1) / 2;\n return [pointRelToPos, pointRelToCenterAbs, halfWidth, halfHeight];\n};\n\nconst pointRelativeToDivElement = (\n pointTuple: Point,\n rectangle: RectangleBox,\n): [GA.Point, GA.Point, number, number] => {\n const point = GAPoint.from(pointTuple);\n const [x1, y1, x2, y2] = getRectangleBoxAbsoluteCoords(rectangle);\n const center = coordsCenter(x1, y1, x2, y2);\n const rotate = GATransform.rotation(center, rectangle.angle);\n const pointRotated = GATransform.apply(rotate, point);\n const pointRelToCenter = GA.sub(pointRotated, GADirection.from(center));\n const pointRelToCenterAbs = GAPoint.abs(pointRelToCenter);\n const elementPos = GA.offset(rectangle.x, rectangle.y);\n const pointRelToPos = GA.sub(pointRotated, elementPos);\n const halfWidth = (x2 - x1) / 2;\n const halfHeight = (y2 - y1) / 2;\n return [pointRelToPos, pointRelToCenterAbs, halfWidth, halfHeight];\n};\n\n// Returns point in absolute coordinates\nexport const pointInAbsoluteCoords = (\n element: ExcalidrawElement,\n elementsMap: ElementsMap,\n // Point relative to the element position\n point: Point,\n): Point => {\n const [x, y] = point;\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x2 - x1) / 2;\n const cy = (y2 - y1) / 2;\n const [rotatedX, rotatedY] = rotate(x, y, cx, cy, element.angle);\n return [element.x + rotatedX, element.y + rotatedY];\n};\n\nconst relativizationToElementCenter = (\n element: ExcalidrawElement,\n elementsMap: ElementsMap,\n): GA.Transform => {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const center = coordsCenter(x1, y1, x2, y2);\n // GA has angle orientation opposite to `rotate`\n const rotate = GATransform.rotation(center, element.angle);\n const translate = GA.reverse(\n GATransform.translation(GADirection.from(center)),\n );\n return GATransform.compose(rotate, translate);\n};\n\nconst coordsCenter = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): GA.Point => {\n return GA.point((x1 + x2) / 2, (y1 + y2) / 2);\n};\n\n// The focus distance is the oriented ratio between the size of\n// the `element` and the \"focus image\" of the element on which\n// all focus points lie, so it's a number between -1 and 1.\n// The line going through `a` and `b` is a tangent to the \"focus image\"\n// of the element.\nexport const determineFocusDistance = (\n element: ExcalidrawBindableElement,\n\n // Point on the line, in absolute coordinates\n a: Point,\n // Another point on the line, in absolute coordinates (closer to element)\n b: Point,\n elementsMap: ElementsMap,\n): number => {\n const relateToCenter = relativizationToElementCenter(element, elementsMap);\n const aRel = GATransform.apply(relateToCenter, GAPoint.from(a));\n const bRel = GATransform.apply(relateToCenter, GAPoint.from(b));\n const line = GALine.through(aRel, bRel);\n const q = element.height / element.width;\n const hwidth = element.width / 2;\n const hheight = element.height / 2;\n const n = line[2];\n const m = line[3];\n const c = line[1];\n const mabs = Math.abs(m);\n const nabs = Math.abs(n);\n let ret;\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"iframe\":\n case \"embeddable\":\n case \"frame\":\n case \"magicframe\":\n ret = c / (hwidth * (nabs + q * mabs));\n break;\n case \"diamond\":\n ret = mabs < nabs ? c / (nabs * hwidth) : c / (mabs * hheight);\n break;\n case \"ellipse\":\n ret = c / (hwidth * Math.sqrt(n ** 2 + q ** 2 * m ** 2));\n break;\n }\n return ret || 0;\n};\n\nexport const determineFocusPoint = (\n element: ExcalidrawBindableElement,\n // The oriented, relative distance from the center of `element` of the\n // returned focusPoint\n focus: number,\n adjecentPoint: Point,\n elementsMap: ElementsMap,\n): Point => {\n if (focus === 0) {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const center = coordsCenter(x1, y1, x2, y2);\n return GAPoint.toTuple(center);\n }\n const relateToCenter = relativizationToElementCenter(element, elementsMap);\n const adjecentPointRel = GATransform.apply(\n relateToCenter,\n GAPoint.from(adjecentPoint),\n );\n const reverseRelateToCenter = GA.reverse(relateToCenter);\n let point;\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n case \"iframe\":\n case \"embeddable\":\n case \"frame\":\n case \"magicframe\":\n point = findFocusPointForRectangulars(element, focus, adjecentPointRel);\n break;\n case \"ellipse\":\n point = findFocusPointForEllipse(element, focus, adjecentPointRel);\n break;\n }\n return GAPoint.toTuple(GATransform.apply(reverseRelateToCenter, point));\n};\n\n// Returns 2 or 0 intersection points between line going through `a` and `b`\n// and the `element`, in ascending order of distance from `a`.\nexport const intersectElementWithLine = (\n element: ExcalidrawBindableElement,\n\n // Point on the line, in absolute coordinates\n a: Point,\n // Another point on the line, in absolute coordinates\n b: Point,\n // If given, the element is inflated by this value\n gap: number = 0,\n elementsMap: ElementsMap,\n): Point[] => {\n const relateToCenter = relativizationToElementCenter(element, elementsMap);\n const aRel = GATransform.apply(relateToCenter, GAPoint.from(a));\n const bRel = GATransform.apply(relateToCenter, GAPoint.from(b));\n const line = GALine.through(aRel, bRel);\n const reverseRelateToCenter = GA.reverse(relateToCenter);\n const intersections = getSortedElementLineIntersections(\n element,\n line,\n aRel,\n gap,\n );\n return intersections.map((point) =>\n GAPoint.toTuple(GATransform.apply(reverseRelateToCenter, point)),\n );\n};\n\nconst getSortedElementLineIntersections = (\n element: ExcalidrawBindableElement,\n // Relative to element center\n line: GA.Line,\n // Relative to element center\n nearPoint: GA.Point,\n gap: number = 0,\n): GA.Point[] => {\n let intersections: GA.Point[];\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n case \"iframe\":\n case \"embeddable\":\n case \"frame\":\n case \"magicframe\":\n const corners = getCorners(element);\n intersections = corners\n .flatMap((point, i) => {\n const edge: [GA.Point, GA.Point] = [point, corners[(i + 1) % 4]];\n return intersectSegment(line, offsetSegment(edge, gap));\n })\n .concat(\n corners.flatMap((point) => getCircleIntersections(point, gap, line)),\n );\n break;\n case \"ellipse\":\n intersections = getEllipseIntersections(element, gap, line);\n break;\n }\n if (intersections.length < 2) {\n // Ignore the \"edge\" case of only intersecting with a single corner\n return [];\n }\n const sortedIntersections = intersections.sort(\n (i1, i2) =>\n GAPoint.distance(i1, nearPoint) - GAPoint.distance(i2, nearPoint),\n );\n return [\n sortedIntersections[0],\n sortedIntersections[sortedIntersections.length - 1],\n ];\n};\n\nconst getCorners = (\n element:\n | ExcalidrawRectangleElement\n | ExcalidrawImageElement\n | ExcalidrawDiamondElement\n | ExcalidrawTextElement\n | ExcalidrawIframeLikeElement\n | ExcalidrawFrameLikeElement,\n scale: number = 1,\n): GA.Point[] => {\n const hx = (scale * element.width) / 2;\n const hy = (scale * element.height) / 2;\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"iframe\":\n case \"embeddable\":\n case \"frame\":\n case \"magicframe\":\n return [\n GA.point(hx, hy),\n GA.point(hx, -hy),\n GA.point(-hx, -hy),\n GA.point(-hx, hy),\n ];\n case \"diamond\":\n return [\n GA.point(0, hy),\n GA.point(hx, 0),\n GA.point(0, -hy),\n GA.point(-hx, 0),\n ];\n }\n};\n\n// Returns intersection of `line` with `segment`, with `segment` moved by\n// `gap` in its polar direction.\n// If intersection coincides with second segment point returns empty array.\nconst intersectSegment = (\n line: GA.Line,\n segment: [GA.Point, GA.Point],\n): GA.Point[] => {\n const [a, b] = segment;\n const aDist = GAPoint.distanceToLine(a, line);\n const bDist = GAPoint.distanceToLine(b, line);\n if (aDist * bDist >= 0) {\n // The intersection is outside segment `(a, b)`\n return [];\n }\n return [GAPoint.intersect(line, GALine.through(a, b))];\n};\n\nconst offsetSegment = (\n segment: [GA.Point, GA.Point],\n distance: number,\n): [GA.Point, GA.Point] => {\n const [a, b] = segment;\n const offset = GATransform.translationOrthogonal(\n GADirection.fromTo(a, b),\n distance,\n );\n return [GATransform.apply(offset, a), GATransform.apply(offset, b)];\n};\n\nconst getEllipseIntersections = (\n element: ExcalidrawEllipseElement,\n gap: number,\n line: GA.Line,\n): GA.Point[] => {\n const a = element.width / 2 + gap;\n const b = element.height / 2 + gap;\n const m = line[2];\n const n = line[3];\n const c = line[1];\n const squares = a * a * m * m + b * b * n * n;\n const discr = squares - c * c;\n if (squares === 0 || discr <= 0) {\n return [];\n }\n const discrRoot = Math.sqrt(discr);\n const xn = -a * a * m * c;\n const yn = -b * b * n * c;\n return [\n GA.point(\n (xn + a * b * n * discrRoot) / squares,\n (yn - a * b * m * discrRoot) / squares,\n ),\n GA.point(\n (xn - a * b * n * discrRoot) / squares,\n (yn + a * b * m * discrRoot) / squares,\n ),\n ];\n};\n\nexport const getCircleIntersections = (\n center: GA.Point,\n radius: number,\n line: GA.Line,\n): GA.Point[] => {\n if (radius === 0) {\n return GAPoint.distanceToLine(line, center) === 0 ? [center] : [];\n }\n const m = line[2];\n const n = line[3];\n const c = line[1];\n const [a, b] = GAPoint.toTuple(center);\n const r = radius;\n const squares = m * m + n * n;\n const discr = r * r * squares - (m * a + n * b + c) ** 2;\n if (squares === 0 || discr <= 0) {\n return [];\n }\n const discrRoot = Math.sqrt(discr);\n const xn = a * n * n - b * m * n - m * c;\n const yn = b * m * m - a * m * n - n * c;\n\n return [\n GA.point((xn + n * discrRoot) / squares, (yn - m * discrRoot) / squares),\n GA.point((xn - n * discrRoot) / squares, (yn + m * discrRoot) / squares),\n ];\n};\n\n// The focus point is the tangent point of the \"focus image\" of the\n// `element`, where the tangent goes through `point`.\nexport const findFocusPointForEllipse = (\n ellipse: ExcalidrawEllipseElement,\n // Between -1 and 1 (not 0) the relative size of the \"focus image\" of\n // the element on which the focus point lies\n relativeDistance: number,\n // The point for which we're trying to find the focus point, relative\n // to the ellipse center.\n point: GA.Point,\n): GA.Point => {\n const relativeDistanceAbs = Math.abs(relativeDistance);\n const a = (ellipse.width * relativeDistanceAbs) / 2;\n const b = (ellipse.height * relativeDistanceAbs) / 2;\n\n const orientation = Math.sign(relativeDistance);\n const [px, pyo] = GAPoint.toTuple(point);\n\n // The calculation below can't handle py = 0\n const py = pyo === 0 ? 0.0001 : pyo;\n\n const squares = px ** 2 * b ** 2 + py ** 2 * a ** 2;\n // Tangent mx + ny + 1 = 0\n const m =\n (-px * b ** 2 +\n orientation * py * Math.sqrt(Math.max(0, squares - a ** 2 * b ** 2))) /\n squares;\n\n let n = (-m * px - 1) / py;\n\n if (n === 0) {\n // if zero {-0, 0}, fall back to a same-sign value in the similar range\n n = (Object.is(n, -0) ? -1 : 1) * 0.01;\n }\n\n const x = -(a ** 2 * m) / (n ** 2 * b ** 2 + m ** 2 * a ** 2);\n return GA.point(x, (-m * x - 1) / n);\n};\n\nexport const findFocusPointForRectangulars = (\n element:\n | ExcalidrawRectangleElement\n | ExcalidrawImageElement\n | ExcalidrawDiamondElement\n | ExcalidrawTextElement\n | ExcalidrawIframeLikeElement\n | ExcalidrawFrameLikeElement,\n // Between -1 and 1 for how far away should the focus point be relative\n // to the size of the element. Sign determines orientation.\n relativeDistance: number,\n // The point for which we're trying to find the focus point, relative\n // to the element center.\n point: GA.Point,\n): GA.Point => {\n const relativeDistanceAbs = Math.abs(relativeDistance);\n const orientation = Math.sign(relativeDistance);\n const corners = getCorners(element, relativeDistanceAbs);\n\n let maxDistance = 0;\n let tangentPoint: null | GA.Point = null;\n corners.forEach((corner) => {\n const distance = orientation * GALine.through(point, corner)[1];\n if (distance > maxDistance) {\n maxDistance = distance;\n tangentPoint = corner;\n }\n });\n return tangentPoint!;\n};\n\nconst pointInBezierEquation = (\n p0: Point,\n p1: Point,\n p2: Point,\n p3: Point,\n [mx, my]: Point,\n lineThreshold: number,\n) => {\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t: number, idx: number) =>\n Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n\n // go through t in increments of 0.01\n let t = 0;\n while (t <= 1.0) {\n const tx = equation(t, 0);\n const ty = equation(t, 1);\n\n const diff = Math.sqrt(Math.pow(tx - mx, 2) + Math.pow(ty - my, 2));\n\n if (diff < lineThreshold) {\n return true;\n }\n\n t += 0.01;\n }\n\n return false;\n};\n\nconst hitTestCurveInside = (\n drawable: Drawable,\n x: number,\n y: number,\n roundness: StrokeRoundness,\n) => {\n const ops = getCurvePathOps(drawable);\n const points: Mutable<Point>[] = [];\n let odd = false; // select one line out of double lines\n for (const operation of ops) {\n if (operation.op === \"move\") {\n odd = !odd;\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n }\n } else if (operation.op === \"bcurveTo\") {\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n points.push([operation.data[2], operation.data[3]]);\n points.push([operation.data[4], operation.data[5]]);\n }\n } else if (operation.op === \"lineTo\") {\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n }\n }\n }\n if (points.length >= 4) {\n if (roundness === \"sharp\") {\n return isPointInPolygon(points, x, y);\n }\n const polygonPoints = pointsOnBezierCurves(points, 10, 5);\n return isPointInPolygon(polygonPoints, x, y);\n }\n return false;\n};\n\nconst hitTestRoughShape = (\n drawable: Drawable,\n x: number,\n y: number,\n lineThreshold: number,\n) => {\n // read operations from first opSet\n const ops = getCurvePathOps(drawable);\n\n // set start position as (0,0) just in case\n // move operation does not exist (unlikely but it is worth safekeeping it)\n let currentP: Point = [0, 0];\n\n return ops.some(({ op, data }, idx) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data as unknown as Point;\n // move operation does not draw anything; so, it always\n // returns false\n } else if (op === \"bcurveTo\") {\n // create points from bezier curve\n // bezier curve stores data as a flattened array of three positions\n // [x1, y1, x2, y2, x3, y3]\n const p1 = [data[0], data[1]] as Point;\n const p2 = [data[2], data[3]] as Point;\n const p3 = [data[4], data[5]] as Point;\n\n const p0 = currentP;\n currentP = p3;\n\n // check if points are on the curve\n // cubic bezier curves require four parameters\n // the first parameter is the last stored position (p0)\n const retVal = pointInBezierEquation(\n p0,\n p1,\n p2,\n p3,\n [x, y],\n lineThreshold,\n );\n\n // set end point of bezier curve as the new starting point for\n // upcoming operations as each operation is based on the last drawn\n // position of the previous operation\n return retVal;\n } else if (op === \"lineTo\") {\n return hitTestCurveInside(drawable, x, y, \"sharp\");\n } else if (op === \"qcurveTo\") {\n // TODO: Implement this\n console.warn(\"qcurveTo is not implemented yet\");\n }\n\n return false;\n });\n};\n", "/**\n * This is a 2D Projective Geometric Algebra implementation.\n *\n * For wider context on geometric algebra visit see https://bivector.net.\n *\n * For this specific algebra see cheatsheet https://bivector.net/2DPGA.pdf.\n *\n * Converted from generator written by enki, with a ton of added on top.\n *\n * This library uses 8-vectors to represent points, directions and lines\n * in 2D space.\n *\n * An array `[a, b, c, d, e, f, g, h]` represents a n(8)vector:\n * a + b*e0 + c*e1 + d*e2 + e*e01 + f*e20 + g*e12 + h*e012\n *\n * See GAPoint, GALine, GADirection and GATransform modules for common\n * operations.\n */\n\nexport type Point = NVector;\nexport type Direction = NVector;\nexport type Line = NVector;\nexport type Transform = NVector;\n\nexport const point = (x: number, y: number): Point => [0, 0, 0, 0, y, x, 1, 0];\n\nexport const origin = (): Point => [0, 0, 0, 0, 0, 0, 1, 0];\n\nexport const direction = (x: number, y: number): Direction => {\n const norm = Math.hypot(x, y); // same as `inorm(direction(x, y))`\n return [0, 0, 0, 0, y / norm, x / norm, 0, 0];\n};\n\nexport const offset = (x: number, y: number): Direction => [\n 0,\n 0,\n 0,\n 0,\n y,\n x,\n 0,\n 0,\n];\n\n/// This is the \"implementation\" part of the library\n\ntype NVector = readonly [\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n number,\n];\n\n// These are labels for what each number in an nvector represents\nconst NVECTOR_BASE = [\"1\", \"e0\", \"e1\", \"e2\", \"e01\", \"e20\", \"e12\", \"e012\"];\n\n// Used to represent points, lines and transformations\nexport const nvector = (value: number = 0, index: number = 0): NVector => {\n const result = [0, 0, 0, 0, 0, 0, 0, 0];\n if (index < 0 || index > 7) {\n throw new Error(`Expected \\`index\\` between 0 and 7, got \\`${index}\\``);\n }\n if (value !== 0) {\n result[index] = value;\n }\n return result as unknown as NVector;\n};\n\nconst STRING_EPSILON = 0.000001;\nexport const toString = (nvector: NVector): string => {\n const result = nvector\n .map((value, index) =>\n Math.abs(value) > STRING_EPSILON\n ? value.toFixed(7).replace(/(\\.|0+)$/, \"\") +\n (index > 0 ? NVECTOR_BASE[index] : \"\")\n : null,\n )\n .filter((representation) => representation != null)\n .join(\" + \");\n return result === \"\" ? \"0\" : result;\n};\n\n// Reverse the order of the basis blades.\nexport const reverse = (nvector: NVector): NVector => [\n nvector[0],\n nvector[1],\n nvector[2],\n nvector[3],\n -nvector[4],\n -nvector[5],\n -nvector[6],\n -nvector[7],\n];\n\n// Poincare duality operator.\nexport const dual = (nvector: NVector): NVector => [\n nvector[7],\n nvector[6],\n nvector[5],\n nvector[4],\n nvector[3],\n nvector[2],\n nvector[1],\n nvector[0],\n];\n\n// Clifford Conjugation\nexport const conjugate = (nvector: NVector): NVector => [\n nvector[0],\n -nvector[1],\n -nvector[2],\n -nvector[3],\n -nvector[4],\n -nvector[5],\n -nvector[6],\n nvector[7],\n];\n\n// Main involution\nexport const involute = (nvector: NVector): NVector => [\n nvector[0],\n -nvector[1],\n -nvector[2],\n -nvector[3],\n nvector[4],\n nvector[5],\n nvector[6],\n -nvector[7],\n];\n\n// Multivector addition\nexport const add = (a: NVector, b: NVector | number): NVector => {\n if (isNumber(b)) {\n return [a[0] + b, a[1], a[2], a[3], a[4], a[5], a[6], a[7]];\n }\n return [\n a[0] + b[0],\n a[1] + b[1],\n a[2] + b[2],\n a[3] + b[3],\n a[4] + b[4],\n a[5] + b[5],\n a[6] + b[6],\n a[7] + b[7],\n ];\n};\n\n// Multivector subtraction\nexport const sub = (a: NVector, b: NVector | number): NVector => {\n if (isNumber(b)) {\n return [a[0] - b, a[1], a[2], a[3], a[4], a[5], a[6], a[7]];\n }\n return [\n a[0] - b[0],\n a[1] - b[1],\n a[2] - b[2],\n a[3] - b[3],\n a[4] - b[4],\n a[5] - b[5],\n a[6] - b[6],\n a[7] - b[7],\n ];\n};\n\n// The geometric product.\nexport const mul = (a: NVector, b: NVector | number): NVector => {\n if (isNumber(b)) {\n return [\n a[0] * b,\n a[1] * b,\n a[2] * b,\n a[3] * b,\n a[4] * b,\n a[5] * b,\n a[6] * b,\n a[7] * b,\n ];\n }\n return [\n mulScalar(a, b),\n b[1] * a[0] +\n b[0] * a[1] -\n b[4] * a[2] +\n b[5] * a[3] +\n b[2] * a[4] -\n b[3] * a[5] -\n b[7] * a[6] -\n b[6] * a[7],\n b[2] * a[0] + b[0] * a[2] - b[6] * a[3] + b[3] * a[6],\n b[3] * a[0] + b[6] * a[2] + b[0] * a[3] - b[2] * a[6],\n b[4] * a[0] +\n b[2] * a[1] -\n b[1] * a[2] +\n b[7] * a[3] +\n b[0] * a[4] +\n b[6] * a[5] -\n b[5] * a[6] +\n b[3] * a[7],\n b[5] * a[0] -\n b[3] * a[1] +\n b[7] * a[2] +\n b[1] * a[3] -\n b[6] * a[4] +\n b[0] * a[5] +\n b[4] * a[6] +\n b[2] * a[7],\n b[6] * a[0] + b[3] * a[2] - b[2] * a[3] + b[0] * a[6],\n b[7] * a[0] +\n b[6] * a[1] +\n b[5] * a[2] +\n b[4] * a[3] +\n b[3] * a[4] +\n b[2] * a[5] +\n b[1] * a[6] +\n b[0] * a[7],\n ];\n};\n\nexport const mulScalar = (a: NVector, b: NVector): number =>\n b[0] * a[0] + b[2] * a[2] + b[3] * a[3] - b[6] * a[6];\n\n// The outer/exterior/wedge product.\nexport const meet = (a: NVector, b: NVector): NVector => [\n b[0] * a[0],\n b[1] * a[0] + b[0] * a[1],\n b[2] * a[0] + b[0] * a[2],\n b[3] * a[0] + b[0] * a[3],\n b[4] * a[0] + b[2] * a[1] - b[1] * a[2] + b[0] * a[4],\n b[5] * a[0] - b[3] * a[1] + b[1] * a[3] + b[0] * a[5],\n b[6] * a[0] + b[3] * a[2] - b[2] * a[3] + b[0] * a[6],\n b[7] * a[0] +\n b[6] * a[1] +\n b[5] * a[2] +\n b[4] * a[3] +\n b[3] * a[4] +\n b[2] * a[5] +\n b[1] * a[6],\n];\n\n// The regressive product.\nexport const join = (a: NVector, b: NVector): NVector => [\n joinScalar(a, b),\n a[1] * b[7] + a[4] * b[5] - a[5] * b[4] + a[7] * b[1],\n a[2] * b[7] - a[4] * b[6] + a[6] * b[4] + a[7] * b[2],\n a[3] * b[7] + a[5] * b[6] - a[6] * b[5] + a[7] * b[3],\n a[4] * b[7] + a[7] * b[4],\n a[5] * b[7] + a[7] * b[5],\n a[6] * b[7] + a[7] * b[6],\n a[7] * b[7],\n];\n\nexport const joinScalar = (a: NVector, b: NVector): number =>\n a[0] * b[7] +\n a[1] * b[6] +\n a[2] * b[5] +\n a[3] * b[4] +\n a[4] * b[3] +\n a[5] * b[2] +\n a[6] * b[1] +\n a[7] * b[0];\n\n// The inner product.\nexport const dot = (a: NVector, b: NVector): NVector => [\n b[0] * a[0] + b[2] * a[2] + b[3] * a[3] - b[6] * a[6],\n b[1] * a[0] +\n b[0] * a[1] -\n b[4] * a[2] +\n b[5] * a[3] +\n b[2] * a[4] -\n b[3] * a[5] -\n b[7] * a[6] -\n b[6] * a[7],\n b[2] * a[0] + b[0] * a[2] - b[6] * a[3] + b[3] * a[6],\n b[3] * a[0] + b[6] * a[2] + b[0] * a[3] - b[2] * a[6],\n b[4] * a[0] + b[7] * a[3] + b[0] * a[4] + b[3] * a[7],\n b[5] * a[0] + b[7] * a[2] + b[0] * a[5] + b[2] * a[7],\n b[6] * a[0] + b[0] * a[6],\n b[7] * a[0] + b[0] * a[7],\n];\n\nexport const norm = (a: NVector): number =>\n Math.sqrt(Math.abs(a[0] * a[0] - a[2] * a[2] - a[3] * a[3] + a[6] * a[6]));\n\nexport const inorm = (a: NVector): number =>\n Math.sqrt(Math.abs(a[7] * a[7] - a[5] * a[5] - a[4] * a[4] + a[1] * a[1]));\n\nexport const normalized = (a: NVector): NVector => {\n const n = norm(a);\n if (n === 0 || n === 1) {\n return a;\n }\n const sign = a[6] < 0 ? -1 : 1;\n return mul(a, sign / n);\n};\n\nexport const inormalized = (a: NVector): NVector => {\n const n = inorm(a);\n if (n === 0 || n === 1) {\n return a;\n }\n return mul(a, 1 / n);\n};\n\nconst isNumber = (a: any): a is number => typeof a === \"number\";\n\nexport const E0: NVector = nvector(1, 1);\nexport const E1: NVector = nvector(1, 2);\nexport const E2: NVector = nvector(1, 3);\nexport const E01: NVector = nvector(1, 4);\nexport const E20: NVector = nvector(1, 5);\nexport const E12: NVector = nvector(1, 6);\nexport const E012: NVector = nvector(1, 7);\nexport const I = E012;\n", "import * as GA from \"./ga\";\nimport * as GALine from \"./galines\";\nimport { Point, Line, join } from \"./ga\";\n\nexport const from = ([x, y]: readonly [number, number]): Point => [\n 0,\n 0,\n 0,\n 0,\n y,\n x,\n 1,\n 0,\n];\n\nexport const toTuple = (point: Point): [number, number] => [point[5], point[4]];\n\nexport const abs = (point: Point): Point => [\n 0,\n 0,\n 0,\n 0,\n Math.abs(point[4]),\n Math.abs(point[5]),\n 1,\n 0,\n];\n\nexport const intersect = (line1: Line, line2: Line): Point =>\n GA.normalized(GA.meet(line1, line2));\n\n// Projects `point` onto the `line`.\n// The returned point is the closest point on the `line` to the `point`.\nexport const project = (point: Point, line: Line): Point =>\n intersect(GALine.orthogonal(line, point), line);\n\nexport const distance = (point1: Point, point2: Point): number =>\n GA.norm(join(point1, point2));\n\nexport const distanceToLine = (point: Point, line: Line): number =>\n GA.joinScalar(point, line);\n", "import * as GA from \"./ga\";\nimport { Line, Point } from \"./ga\";\n\n/**\n * A line is stored as an array `[0, c, a, b, 0, 0, 0, 0]` representing:\n * c * e0 + a * e1 + b*e2\n *\n * This maps to a standard formula `a * x + b * y + c`.\n *\n * `(-b, a)` corresponds to a 2D vector parallel to the line. The lines\n * have a natural orientation, corresponding to that vector.\n *\n * The magnitude (\"norm\") of the line is `sqrt(a ^ 2 + b ^ 2)`.\n * `c / norm(line)` is the oriented distance from line to origin.\n */\n\n// Returns line with direction (x, y) through origin\nexport const vector = (x: number, y: number): Line =>\n GA.normalized([0, 0, -y, x, 0, 0, 0, 0]);\n\n// For equation ax + by + c = 0.\nexport const equation = (a: number, b: number, c: number): Line =>\n GA.normalized([0, c, a, b, 0, 0, 0, 0]);\n\nexport const through = (from: Point, to: Point): Line =>\n GA.normalized(GA.join(to, from));\n\nexport const orthogonal = (line: Line, point: Point): Line =>\n GA.dot(line, point);\n\n// Returns a line perpendicular to the line through `against` and `intersection`\n// going through `intersection`.\nexport const orthogonalThrough = (against: Point, intersection: Point): Line =>\n orthogonal(through(against, intersection), intersection);\n\nexport const parallel = (line: Line, distance: number): Line => {\n const result = line.slice();\n result[1] -= distance;\n return result as unknown as Line;\n};\n\nexport const parallelThrough = (line: Line, point: Point): Line =>\n orthogonal(orthogonal(point, line), point);\n\nexport const distance = (line1: Line, line2: Line): number =>\n GA.inorm(GA.meet(line1, line2));\n\nexport const angle = (line1: Line, line2: Line): number =>\n Math.acos(GA.dot(line1, line2)[0]);\n\n// The orientation of the line\nexport const sign = (line: Line): number => Math.sign(line[1]);\n", "import * as GA from \"./ga\";\nimport { Line, Direction, Point } from \"./ga\";\n\n/**\n * A direction is stored as an array `[0, 0, 0, 0, y, x, 0, 0]` representing\n * vector `(x, y)`.\n */\n\nexport const from = (point: Point): Point => [\n 0,\n 0,\n 0,\n 0,\n point[4],\n point[5],\n 0,\n 0,\n];\n\nexport const fromTo = (from: Point, to: Point): Direction =>\n GA.inormalized([0, 0, 0, 0, to[4] - from[4], to[5] - from[5], 0, 0]);\n\nexport const orthogonal = (direction: Direction): Direction =>\n GA.inormalized([0, 0, 0, 0, -direction[5], direction[4], 0, 0]);\n\nexport const orthogonalToLine = (line: Line): Direction => GA.mul(line, GA.I);\n", "import * as GA from \"./ga\";\nimport { Line, Direction, Point, Transform } from \"./ga\";\nimport * as GADirection from \"./gadirections\";\n\n/**\n * TODO: docs\n */\n\nexport const rotation = (pivot: Point, angle: number): Transform =>\n GA.add(GA.mul(pivot, Math.sin(angle / 2)), Math.cos(angle / 2));\n\nexport const translation = (direction: Direction): Transform => [\n 1,\n 0,\n 0,\n 0,\n -(0.5 * direction[5]),\n 0.5 * direction[4],\n 0,\n 0,\n];\n\nexport const translationOrthogonal = (\n direction: Direction,\n distance: number,\n): Transform => {\n const scale = 0.5 * distance;\n return [1, 0, 0, 0, scale * direction[4], scale * direction[5], 0, 0];\n};\n\nexport const translationAlong = (line: Line, distance: number): Transform =>\n GA.add(GA.mul(GADirection.orthogonalToLine(line), 0.5 * distance), 1);\n\nexport const compose = (motor1: Transform, motor2: Transform): Transform =>\n GA.mul(motor2, motor1);\n\nexport const apply = (\n motor: Transform,\n nvector: Point | Direction | Line,\n): Point | Direction | Line =>\n GA.normalized(GA.mul(GA.mul(motor, nvector), GA.reverse(motor)));\n", "// distance between 2 points\nfunction distance(p1, p2) {\n return Math.sqrt(distanceSq(p1, p2));\n}\n// distance between 2 points squared\nfunction distanceSq(p1, p2) {\n return Math.pow(p1[0] - p2[0], 2) + Math.pow(p1[1] - p2[1], 2);\n}\n// Sistance squared from a point p to the line segment vw\nfunction distanceToSegmentSq(p, v, w) {\n const l2 = distanceSq(v, w);\n if (l2 === 0) {\n return distanceSq(p, v);\n }\n let t = ((p[0] - v[0]) * (w[0] - v[0]) + (p[1] - v[1]) * (w[1] - v[1])) / l2;\n t = Math.max(0, Math.min(1, t));\n return distanceSq(p, lerp(v, w, t));\n}\nfunction lerp(a, b, t) {\n return [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n ];\n}\n// Adapted from https://seant23.wordpress.com/2010/11/12/offset-bezier-curves/\nfunction flatness(points, offset) {\n const p1 = points[offset + 0];\n const p2 = points[offset + 1];\n const p3 = points[offset + 2];\n const p4 = points[offset + 3];\n let ux = 3 * p2[0] - 2 * p1[0] - p4[0];\n ux *= ux;\n let uy = 3 * p2[1] - 2 * p1[1] - p4[1];\n uy *= uy;\n let vx = 3 * p3[0] - 2 * p4[0] - p1[0];\n vx *= vx;\n let vy = 3 * p3[1] - 2 * p4[1] - p1[1];\n vy *= vy;\n if (ux < vx) {\n ux = vx;\n }\n if (uy < vy) {\n uy = vy;\n }\n return ux + uy;\n}\nfunction getPointsOnBezierCurveWithSplitting(points, offset, tolerance, newPoints) {\n const outPoints = newPoints || [];\n if (flatness(points, offset) < tolerance) {\n const p0 = points[offset + 0];\n if (outPoints.length) {\n const d = distance(outPoints[outPoints.length - 1], p0);\n if (d > 1) {\n outPoints.push(p0);\n }\n }\n else {\n outPoints.push(p0);\n }\n outPoints.push(points[offset + 3]);\n }\n else {\n // subdivide\n const t = .5;\n const p1 = points[offset + 0];\n const p2 = points[offset + 1];\n const p3 = points[offset + 2];\n const p4 = points[offset + 3];\n const q1 = lerp(p1, p2, t);\n const q2 = lerp(p2, p3, t);\n const q3 = lerp(p3, p4, t);\n const r1 = lerp(q1, q2, t);\n const r2 = lerp(q2, q3, t);\n const red = lerp(r1, r2, t);\n getPointsOnBezierCurveWithSplitting([p1, q1, r1, red], 0, tolerance, outPoints);\n getPointsOnBezierCurveWithSplitting([red, r2, q3, p4], 0, tolerance, outPoints);\n }\n return outPoints;\n}\nexport function simplify(points, distance) {\n return simplifyPoints(points, 0, points.length, distance);\n}\n// Ramer\u2013Douglas\u2013Peucker algorithm\n// https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm\nexport function simplifyPoints(points, start, end, epsilon, newPoints) {\n const outPoints = newPoints || [];\n // find the most distance point from the endpoints\n const s = points[start];\n const e = points[end - 1];\n let maxDistSq = 0;\n let maxNdx = 1;\n for (let i = start + 1; i < end - 1; ++i) {\n const distSq = distanceToSegmentSq(points[i], s, e);\n if (distSq > maxDistSq) {\n maxDistSq = distSq;\n maxNdx = i;\n }\n }\n // if that point is too far, split\n if (Math.sqrt(maxDistSq) > epsilon) {\n simplifyPoints(points, start, maxNdx + 1, epsilon, outPoints);\n simplifyPoints(points, maxNdx, end, epsilon, outPoints);\n }\n else {\n if (!outPoints.length) {\n outPoints.push(s);\n }\n outPoints.push(e);\n }\n return outPoints;\n}\nexport function pointsOnBezierCurves(points, tolerance = 0.15, distance) {\n const newPoints = [];\n const numSegments = (points.length - 1) / 3;\n for (let i = 0; i < numSegments; i++) {\n const offset = i * 3;\n getPointsOnBezierCurveWithSplitting(points, offset, tolerance, newPoints);\n }\n if (distance && distance > 0) {\n return simplifyPoints(newPoints, 0, newPoints.length, distance);\n }\n return newPoints;\n}\n", "import {\n ElementsMap,\n ExcalidrawElement,\n NonDeletedExcalidrawElement,\n PointerType,\n} from \"./types\";\n\nimport { Bounds, getElementAbsoluteCoords } from \"./bounds\";\nimport { rotate } from \"../math\";\nimport { InteractiveCanvasAppState, Zoom } from \"../types\";\nimport { isTextElement } from \".\";\nimport { isFrameLikeElement, isLinearElement } from \"./typeChecks\";\nimport { DEFAULT_TRANSFORM_HANDLE_SPACING } from \"../constants\";\n\nexport type TransformHandleDirection =\n | \"n\"\n | \"s\"\n | \"w\"\n | \"e\"\n | \"nw\"\n | \"ne\"\n | \"sw\"\n | \"se\";\n\nexport type TransformHandleType = TransformHandleDirection | \"rotation\";\n\nexport type TransformHandle = Bounds;\nexport type TransformHandles = Partial<{\n [T in TransformHandleType]: TransformHandle;\n}>;\nexport type MaybeTransformHandleType = TransformHandleType | false;\n\nconst transformHandleSizes: { [k in PointerType]: number } = {\n mouse: 8,\n pen: 16,\n touch: 28,\n};\n\nconst ROTATION_RESIZE_HANDLE_GAP = 16;\n\nexport const OMIT_SIDES_FOR_MULTIPLE_ELEMENTS = {\n e: true,\n s: true,\n n: true,\n w: true,\n};\n\nexport const OMIT_SIDES_FOR_FRAME = {\n e: true,\n s: true,\n n: true,\n w: true,\n rotation: true,\n};\n\nconst OMIT_SIDES_FOR_TEXT_ELEMENT = {\n e: true,\n s: true,\n n: true,\n w: true,\n};\n\nconst OMIT_SIDES_FOR_LINE_SLASH = {\n e: true,\n s: true,\n n: true,\n w: true,\n nw: true,\n se: true,\n};\n\nconst OMIT_SIDES_FOR_LINE_BACKSLASH = {\n e: true,\n s: true,\n n: true,\n w: true,\n};\n\nconst generateTransformHandle = (\n x: number,\n y: number,\n width: number,\n height: number,\n cx: number,\n cy: number,\n angle: number,\n): TransformHandle => {\n const [xx, yy] = rotate(x + width / 2, y + height / 2, cx, cy, angle);\n return [xx - width / 2, yy - height / 2, width, height];\n};\n\nexport const getTransformHandlesFromCoords = (\n [x1, y1, x2, y2, cx, cy]: [number, number, number, number, number, number],\n angle: number,\n zoom: Zoom,\n pointerType: PointerType,\n omitSides: { [T in TransformHandleType]?: boolean } = {},\n margin = 4,\n): TransformHandles => {\n const size = transformHandleSizes[pointerType];\n const handleWidth = size / zoom.value;\n const handleHeight = size / zoom.value;\n\n const handleMarginX = size / zoom.value;\n const handleMarginY = size / zoom.value;\n\n const width = x2 - x1;\n const height = y2 - y1;\n const dashedLineMargin = margin / zoom.value;\n const centeringOffset =\n (size - DEFAULT_TRANSFORM_HANDLE_SPACING * 2) / (2 * zoom.value);\n\n const transformHandles: TransformHandles = {\n nw: omitSides.nw\n ? undefined\n : generateTransformHandle(\n x1 - dashedLineMargin - handleMarginX + centeringOffset,\n y1 - dashedLineMargin - handleMarginY + centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n ),\n ne: omitSides.ne\n ? undefined\n : generateTransformHandle(\n x2 + dashedLineMargin - centeringOffset,\n y1 - dashedLineMargin - handleMarginY + centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n ),\n sw: omitSides.sw\n ? undefined\n : generateTransformHandle(\n x1 - dashedLineMargin - handleMarginX + centeringOffset,\n y2 + dashedLineMargin - centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n ),\n se: omitSides.se\n ? undefined\n : generateTransformHandle(\n x2 + dashedLineMargin - centeringOffset,\n y2 + dashedLineMargin - centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n ),\n rotation: omitSides.rotation\n ? undefined\n : generateTransformHandle(\n x1 + width / 2 - handleWidth / 2,\n y1 -\n dashedLineMargin -\n handleMarginY +\n centeringOffset -\n ROTATION_RESIZE_HANDLE_GAP / zoom.value,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n ),\n };\n\n // We only want to show height handles (all cardinal directions) above a certain size\n // Note: we render using \"mouse\" size so we should also use \"mouse\" size for this check\n const minimumSizeForEightHandles =\n (5 * transformHandleSizes.mouse) / zoom.value;\n if (Math.abs(width) > minimumSizeForEightHandles) {\n if (!omitSides.n) {\n transformHandles.n = generateTransformHandle(\n x1 + width / 2 - handleWidth / 2,\n y1 - dashedLineMargin - handleMarginY + centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n );\n }\n if (!omitSides.s) {\n transformHandles.s = generateTransformHandle(\n x1 + width / 2 - handleWidth / 2,\n y2 + dashedLineMargin - centeringOffset,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n );\n }\n }\n if (Math.abs(height) > minimumSizeForEightHandles) {\n if (!omitSides.w) {\n transformHandles.w = generateTransformHandle(\n x1 - dashedLineMargin - handleMarginX + centeringOffset,\n y1 + height / 2 - handleHeight / 2,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n );\n }\n if (!omitSides.e) {\n transformHandles.e = generateTransformHandle(\n x2 + dashedLineMargin - centeringOffset,\n y1 + height / 2 - handleHeight / 2,\n handleWidth,\n handleHeight,\n cx,\n cy,\n angle,\n );\n }\n }\n\n return transformHandles;\n};\n\nexport const getTransformHandles = (\n element: ExcalidrawElement,\n zoom: Zoom,\n elementsMap: ElementsMap,\n\n pointerType: PointerType = \"mouse\",\n): TransformHandles => {\n // so that when locked element is selected (especially when you toggle lock\n // via keyboard) the locked element is visually distinct, indicating\n // you can't move/resize\n if (element.locked) {\n return {};\n }\n\n let omitSides: { [T in TransformHandleType]?: boolean } = {};\n if (element.type === \"freedraw\" || isLinearElement(element)) {\n if (element.points.length === 2) {\n // only check the last point because starting point is always (0,0)\n const [, p1] = element.points;\n if (p1[0] === 0 || p1[1] === 0) {\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\n } else if (p1[0] > 0 && p1[1] < 0) {\n omitSides = OMIT_SIDES_FOR_LINE_SLASH;\n } else if (p1[0] > 0 && p1[1] > 0) {\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\n } else if (p1[0] < 0 && p1[1] > 0) {\n omitSides = OMIT_SIDES_FOR_LINE_SLASH;\n } else if (p1[0] < 0 && p1[1] < 0) {\n omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\n }\n }\n } else if (isTextElement(element)) {\n omitSides = OMIT_SIDES_FOR_TEXT_ELEMENT;\n } else if (isFrameLikeElement(element)) {\n omitSides = {\n rotation: true,\n };\n }\n const dashedLineMargin = isLinearElement(element)\n ? DEFAULT_TRANSFORM_HANDLE_SPACING + 8\n : DEFAULT_TRANSFORM_HANDLE_SPACING;\n return getTransformHandlesFromCoords(\n getElementAbsoluteCoords(element, elementsMap, true),\n element.angle,\n zoom,\n pointerType,\n omitSides,\n dashedLineMargin,\n );\n};\n\nexport const shouldShowBoundingBox = (\n elements: readonly NonDeletedExcalidrawElement[],\n appState: InteractiveCanvasAppState,\n) => {\n if (appState.editingLinearElement) {\n return false;\n }\n if (elements.length > 1) {\n return true;\n }\n const element = elements[0];\n if (!isLinearElement(element)) {\n return true;\n }\n\n return element.points.length > 2;\n};\n", "import { Drawable } from \"roughjs/bin/core\";\nimport { RoughGenerator } from \"roughjs/bin/generator\";\nimport {\n ExcalidrawElement,\n ExcalidrawSelectionElement,\n} from \"../element/types\";\nimport { elementWithCanvasCache } from \"../renderer/renderElement\";\nimport { _generateElementShape } from \"./Shape\";\nimport { ElementShape, ElementShapes } from \"./types\";\nimport { COLOR_PALETTE } from \"../colors\";\nimport { AppState, EmbedsValidationStatus } from \"../types\";\n\nexport class ShapeCache {\n private static rg = new RoughGenerator();\n private static cache = new WeakMap<ExcalidrawElement, ElementShape>();\n\n /**\n * Retrieves shape from cache if available. Use this only if shape\n * is optional and you have a fallback in case it's not cached.\n */\n public static get = <T extends ExcalidrawElement>(element: T) => {\n return ShapeCache.cache.get(\n element,\n ) as T[\"type\"] extends keyof ElementShapes\n ? ElementShapes[T[\"type\"]] | undefined\n : ElementShape | undefined;\n };\n\n public static set = <T extends ExcalidrawElement>(\n element: T,\n shape: T[\"type\"] extends keyof ElementShapes\n ? ElementShapes[T[\"type\"]]\n : Drawable,\n ) => ShapeCache.cache.set(element, shape);\n\n public static delete = (element: ExcalidrawElement) =>\n ShapeCache.cache.delete(element);\n\n public static destroy = () => {\n ShapeCache.cache = new WeakMap();\n };\n\n /**\n * Generates & caches shape for element if not already cached, otherwise\n * returns cached shape.\n */\n public static generateElementShape = <\n T extends Exclude<ExcalidrawElement, ExcalidrawSelectionElement>,\n >(\n element: T,\n renderConfig: {\n isExporting: boolean;\n canvasBackgroundColor: AppState[\"viewBackgroundColor\"];\n embedsValidationStatus: EmbedsValidationStatus;\n } | null,\n ) => {\n // when exporting, always regenerated to guarantee the latest shape\n const cachedShape = renderConfig?.isExporting\n ? undefined\n : ShapeCache.get(element);\n\n // `null` indicates no rc shape applicable for this element type,\n // but it's considered a valid cache value (= do not regenerate)\n if (cachedShape !== undefined) {\n return cachedShape;\n }\n\n elementWithCanvasCache.delete(element);\n\n const shape = _generateElementShape(\n element,\n ShapeCache.rg,\n renderConfig || {\n isExporting: false,\n canvasBackgroundColor: COLOR_PALETTE.white,\n embedsValidationStatus: null,\n },\n ) as T[\"type\"] extends keyof ElementShapes\n ? ElementShapes[T[\"type\"]]\n : Drawable | null;\n\n ShapeCache.cache.set(element, shape);\n\n return shape;\n };\n}\n", "import { isDarwin } from \"./constants\";\n\nexport const CODES = {\n EQUAL: \"Equal\",\n MINUS: \"Minus\",\n NUM_ADD: \"NumpadAdd\",\n NUM_SUBTRACT: \"NumpadSubtract\",\n NUM_ZERO: \"Numpad0\",\n BRACKET_RIGHT: \"BracketRight\",\n BRACKET_LEFT: \"BracketLeft\",\n ONE: \"Digit1\",\n TWO: \"Digit2\",\n THREE: \"Digit3\",\n NINE: \"Digit9\",\n QUOTE: \"Quote\",\n ZERO: \"Digit0\",\n SLASH: \"Slash\",\n C: \"KeyC\",\n D: \"KeyD\",\n H: \"KeyH\",\n V: \"KeyV\",\n Z: \"KeyZ\",\n R: \"KeyR\",\n S: \"KeyS\",\n} as const;\n\nexport const KEYS = {\n ARROW_DOWN: \"ArrowDown\",\n ARROW_LEFT: \"ArrowLeft\",\n ARROW_RIGHT: \"ArrowRight\",\n ARROW_UP: \"ArrowUp\",\n PAGE_UP: \"PageUp\",\n PAGE_DOWN: \"PageDown\",\n BACKSPACE: \"Backspace\",\n ALT: \"Alt\",\n CTRL_OR_CMD: isDarwin ? \"metaKey\" : \"ctrlKey\",\n DELETE: \"Delete\",\n ENTER: \"Enter\",\n ESCAPE: \"Escape\",\n QUESTION_MARK: \"?\",\n SPACE: \" \",\n TAB: \"Tab\",\n CHEVRON_LEFT: \"<\",\n CHEVRON_RIGHT: \">\",\n PERIOD: \".\",\n COMMA: \",\",\n SUBTRACT: \"-\",\n\n A: \"a\",\n C: \"c\",\n D: \"d\",\n E: \"e\",\n F: \"f\",\n G: \"g\",\n H: \"h\",\n I: \"i\",\n L: \"l\",\n O: \"o\",\n P: \"p\",\n Q: \"q\",\n R: \"r\",\n S: \"s\",\n T: \"t\",\n V: \"v\",\n X: \"x\",\n Y: \"y\",\n Z: \"z\",\n K: \"k\",\n W: \"w\",\n\n 0: \"0\",\n 1: \"1\",\n 2: \"2\",\n 3: \"3\",\n 4: \"4\",\n 5: \"5\",\n 6: \"6\",\n 7: \"7\",\n 8: \"8\",\n 9: \"9\",\n} as const;\n\nexport type Key = keyof typeof KEYS;\n\nexport const isArrowKey = (key: string) =>\n key === KEYS.ARROW_LEFT ||\n key === KEYS.ARROW_RIGHT ||\n key === KEYS.ARROW_DOWN ||\n key === KEYS.ARROW_UP;\n\nexport const shouldResizeFromCenter = (event: MouseEvent | KeyboardEvent) =>\n event.altKey;\n\nexport const shouldMaintainAspectRatio = (event: MouseEvent | KeyboardEvent) =>\n event.shiftKey;\n\nexport const shouldRotateWithDiscreteAngle = (\n event: MouseEvent | KeyboardEvent | React.PointerEvent<HTMLCanvasElement>,\n) => event.shiftKey;\n", "import { ExcalidrawTextContainer } from \"./types\";\n\nexport const originalContainerCache: {\n [id: ExcalidrawTextContainer[\"id\"]]:\n | {\n height: ExcalidrawTextContainer[\"height\"];\n }\n | undefined;\n} = {};\n\nexport const updateOriginalContainerCache = (\n id: ExcalidrawTextContainer[\"id\"],\n height: ExcalidrawTextContainer[\"height\"],\n) => {\n const data =\n originalContainerCache[id] || (originalContainerCache[id] = { height });\n data.height = height;\n return data;\n};\n\nexport const resetOriginalContainerCache = (\n id: ExcalidrawTextContainer[\"id\"],\n) => {\n if (originalContainerCache[id]) {\n delete originalContainerCache[id];\n }\n};\n\nexport const getOriginalContainerHeightFromCache = (\n id: ExcalidrawTextContainer[\"id\"],\n) => {\n return originalContainerCache[id]?.height ?? null;\n};\n", "import { Point } from \"./types\";\n\nexport const getSizeFromPoints = (points: readonly Point[]) => {\n const xs = points.map((point) => point[0]);\n const ys = points.map((point) => point[1]);\n return {\n width: Math.max(...xs) - Math.min(...xs),\n height: Math.max(...ys) - Math.min(...ys),\n };\n};\n\n/** @arg dimension, 0 for rescaling only x, 1 for y */\nexport const rescalePoints = (\n dimension: 0 | 1,\n newSize: number,\n points: readonly Point[],\n normalize: boolean,\n): Point[] => {\n const coordinates = points.map((point) => point[dimension]);\n const maxCoordinate = Math.max(...coordinates);\n const minCoordinate = Math.min(...coordinates);\n const size = maxCoordinate - minCoordinate;\n const scale = size === 0 ? 1 : newSize / size;\n\n let nextMinCoordinate = Infinity;\n\n const scaledPoints = points.map((point): Point => {\n const newCoordinate = point[dimension] * scale;\n const newPoint = [...point];\n newPoint[dimension] = newCoordinate;\n if (newCoordinate < nextMinCoordinate) {\n nextMinCoordinate = newCoordinate;\n }\n return newPoint as unknown as Point;\n });\n\n if (!normalize) {\n return scaledPoints;\n }\n\n if (scaledPoints.length === 2) {\n // we don't translate two-point lines\n return scaledPoints;\n }\n\n const translation = minCoordinate - nextMinCoordinate;\n\n const nextPoints = scaledPoints.map(\n (scaledPoint) =>\n scaledPoint.map((value, currentDimension) => {\n return currentDimension === dimension ? value + translation : value;\n }) as [number, number],\n );\n return nextPoints;\n};\n", "import {\n GroupId,\n ExcalidrawElement,\n NonDeleted,\n NonDeletedExcalidrawElement,\n ElementsMapOrArray,\n ElementsMap,\n} from \"./element/types\";\nimport {\n AppClassProperties,\n AppState,\n InteractiveCanvasAppState,\n} from \"./types\";\nimport { getSelectedElements } from \"./scene\";\nimport { getBoundTextElement } from \"./element/textElement\";\nimport { makeNextSelectedElementIds } from \"./scene/selection\";\nimport { Mutable } from \"./utility-types\";\n\nexport const selectGroup = (\n groupId: GroupId,\n appState: InteractiveCanvasAppState,\n elements: readonly NonDeleted<ExcalidrawElement>[],\n): Pick<\n InteractiveCanvasAppState,\n \"selectedGroupIds\" | \"selectedElementIds\" | \"editingGroupId\"\n> => {\n const elementsInGroup = elements.reduce(\n (acc: Record<string, true>, element) => {\n if (element.groupIds.includes(groupId)) {\n acc[element.id] = true;\n }\n return acc;\n },\n {},\n );\n\n if (Object.keys(elementsInGroup).length < 2) {\n if (\n appState.selectedGroupIds[groupId] ||\n appState.editingGroupId === groupId\n ) {\n return {\n selectedElementIds: appState.selectedElementIds,\n selectedGroupIds: { ...appState.selectedGroupIds, [groupId]: false },\n editingGroupId: null,\n };\n }\n return appState;\n }\n\n return {\n editingGroupId: appState.editingGroupId,\n selectedGroupIds: { ...appState.selectedGroupIds, [groupId]: true },\n selectedElementIds: {\n ...appState.selectedElementIds,\n ...elementsInGroup,\n },\n };\n};\n\nexport const selectGroupsForSelectedElements = (function () {\n type SelectGroupsReturnType = Pick<\n InteractiveCanvasAppState,\n \"selectedGroupIds\" | \"editingGroupId\" | \"selectedElementIds\"\n >;\n\n let lastSelectedElements: readonly NonDeleted<ExcalidrawElement>[] | null =\n null;\n let lastElements: readonly NonDeleted<ExcalidrawElement>[] | null = null;\n let lastReturnValue: SelectGroupsReturnType | null = null;\n\n const _selectGroups = (\n selectedElements: readonly NonDeleted<ExcalidrawElement>[],\n elements: readonly NonDeleted<ExcalidrawElement>[],\n appState: Pick<AppState, \"selectedElementIds\" | \"editingGroupId\">,\n prevAppState: InteractiveCanvasAppState,\n ): SelectGroupsReturnType => {\n if (\n lastReturnValue !== undefined &&\n elements === lastElements &&\n selectedElements === lastSelectedElements &&\n appState.editingGroupId === lastReturnValue?.editingGroupId\n ) {\n return lastReturnValue;\n }\n\n const selectedGroupIds: Record<GroupId, boolean> = {};\n // Gather all the groups withing selected elements\n for (const selectedElement of selectedElements) {\n let groupIds = selectedElement.groupIds;\n if (appState.editingGroupId) {\n // handle the case where a group is nested within a group\n const indexOfEditingGroup = groupIds.indexOf(appState.editingGroupId);\n if (indexOfEditingGroup > -1) {\n groupIds = groupIds.slice(0, indexOfEditingGroup);\n }\n }\n if (groupIds.length > 0) {\n const lastSelectedGroup = groupIds[groupIds.length - 1];\n selectedGroupIds[lastSelectedGroup] = true;\n }\n }\n\n // Gather all the elements within selected groups\n const groupElementsIndex: Record<GroupId, string[]> = {};\n const selectedElementIdsInGroups = elements.reduce(\n (acc: Record<string, true>, element) => {\n const groupId = element.groupIds.find((id) => selectedGroupIds[id]);\n\n if (groupId) {\n acc[element.id] = true;\n\n // Populate the index\n if (!Array.isArray(groupElementsIndex[groupId])) {\n groupElementsIndex[groupId] = [element.id];\n } else {\n groupElementsIndex[groupId].push(element.id);\n }\n }\n return acc;\n },\n {},\n );\n\n for (const groupId of Object.keys(groupElementsIndex)) {\n // If there is one element in the group, and the group is selected or it's being edited, it's not a group\n if (groupElementsIndex[groupId].length < 2) {\n if (selectedGroupIds[groupId]) {\n selectedGroupIds[groupId] = false;\n }\n }\n }\n\n lastElements = elements;\n lastSelectedElements = selectedElements;\n\n lastReturnValue = {\n editingGroupId: appState.editingGroupId,\n selectedGroupIds,\n selectedElementIds: makeNextSelectedElementIds(\n {\n ...appState.selectedElementIds,\n ...selectedElementIdsInGroups,\n },\n prevAppState,\n ),\n };\n\n return lastReturnValue;\n };\n\n /**\n * When you select an element, you often want to actually select the whole group it's in, unless\n * you're currently editing that group.\n */\n const selectGroupsForSelectedElements = (\n appState: Pick<AppState, \"selectedElementIds\" | \"editingGroupId\">,\n elements: readonly NonDeletedExcalidrawElement[],\n prevAppState: InteractiveCanvasAppState,\n /**\n * supply null in cases where you don't have access to App instance and\n * you don't care about optimizing selectElements retrieval\n */\n app: AppClassProperties | null,\n ): Mutable<\n Pick<\n InteractiveCanvasAppState,\n \"selectedGroupIds\" | \"editingGroupId\" | \"selectedElementIds\"\n >\n > => {\n const selectedElements = app\n ? app.scene.getSelectedElements({\n selectedElementIds: appState.selectedElementIds,\n // supplying elements explicitly in case we're passed non-state elements\n elements,\n })\n : getSelectedElements(elements, appState);\n\n if (!selectedElements.length) {\n return {\n selectedGroupIds: {},\n editingGroupId: null,\n selectedElementIds: makeNextSelectedElementIds(\n appState.selectedElementIds,\n prevAppState,\n ),\n };\n }\n\n return _selectGroups(selectedElements, elements, appState, prevAppState);\n };\n\n selectGroupsForSelectedElements.clearCache = () => {\n lastElements = null;\n lastSelectedElements = null;\n lastReturnValue = null;\n };\n\n return selectGroupsForSelectedElements;\n})();\n\n/**\n * If the element's group is selected, don't render an individual\n * selection border around it.\n */\nexport const isSelectedViaGroup = (\n appState: InteractiveCanvasAppState,\n element: ExcalidrawElement,\n) => getSelectedGroupForElement(appState, element) != null;\n\nexport const getSelectedGroupForElement = (\n appState: InteractiveCanvasAppState,\n element: ExcalidrawElement,\n) =>\n element.groupIds\n .filter((groupId) => groupId !== appState.editingGroupId)\n .find((groupId) => appState.selectedGroupIds[groupId]);\n\nexport const getSelectedGroupIds = (\n appState: InteractiveCanvasAppState,\n): GroupId[] =>\n Object.entries(appState.selectedGroupIds)\n .filter(([groupId, isSelected]) => isSelected)\n .map(([groupId, isSelected]) => groupId);\n\n// given a list of elements, return the the actual group ids that should be selected\n// or used to update the elements\nexport const selectGroupsFromGivenElements = (\n elements: readonly NonDeleted<ExcalidrawElement>[],\n appState: InteractiveCanvasAppState,\n) => {\n let nextAppState: InteractiveCanvasAppState = {\n ...appState,\n selectedGroupIds: {},\n };\n\n for (const element of elements) {\n let groupIds = element.groupIds;\n if (appState.editingGroupId) {\n const indexOfEditingGroup = groupIds.indexOf(appState.editingGroupId);\n if (indexOfEditingGroup > -1) {\n groupIds = groupIds.slice(0, indexOfEditingGroup);\n }\n }\n if (groupIds.length > 0) {\n const groupId = groupIds[groupIds.length - 1];\n nextAppState = {\n ...nextAppState,\n ...selectGroup(groupId, nextAppState, elements),\n };\n }\n }\n\n return nextAppState.selectedGroupIds;\n};\n\nexport const editGroupForSelectedElement = (\n appState: AppState,\n element: NonDeleted<ExcalidrawElement>,\n): AppState => {\n return {\n ...appState,\n editingGroupId: element.groupIds.length ? element.groupIds[0] : null,\n selectedGroupIds: {},\n selectedElementIds: {\n [element.id]: true,\n },\n };\n};\n\nexport const isElementInGroup = (element: ExcalidrawElement, groupId: string) =>\n element.groupIds.includes(groupId);\n\nexport const getElementsInGroup = (\n elements: ElementsMapOrArray,\n groupId: string,\n) => {\n const elementsInGroup: ExcalidrawElement[] = [];\n for (const element of elements.values()) {\n if (isElementInGroup(element, groupId)) {\n elementsInGroup.push(element);\n }\n }\n return elementsInGroup;\n};\n\nexport const getSelectedGroupIdForElement = (\n element: ExcalidrawElement,\n selectedGroupIds: { [groupId: string]: boolean },\n) => element.groupIds.find((groupId) => selectedGroupIds[groupId]);\n\nexport const getNewGroupIdsForDuplication = (\n groupIds: ExcalidrawElement[\"groupIds\"],\n editingGroupId: AppState[\"editingGroupId\"],\n mapper: (groupId: GroupId) => GroupId,\n) => {\n const copy = [...groupIds];\n const positionOfEditingGroupId = editingGroupId\n ? groupIds.indexOf(editingGroupId)\n : -1;\n const endIndex =\n positionOfEditingGroupId > -1 ? positionOfEditingGroupId : groupIds.length;\n for (let index = 0; index < endIndex; index++) {\n copy[index] = mapper(copy[index]);\n }\n\n return copy;\n};\n\nexport const addToGroup = (\n prevGroupIds: ExcalidrawElement[\"groupIds\"],\n newGroupId: GroupId,\n editingGroupId: AppState[\"editingGroupId\"],\n) => {\n // insert before the editingGroupId, or push to the end.\n const groupIds = [...prevGroupIds];\n const positionOfEditingGroupId = editingGroupId\n ? groupIds.indexOf(editingGroupId)\n : -1;\n const positionToInsert =\n positionOfEditingGroupId > -1 ? positionOfEditingGroupId : groupIds.length;\n groupIds.splice(positionToInsert, 0, newGroupId);\n return groupIds;\n};\n\nexport const removeFromSelectedGroups = (\n groupIds: ExcalidrawElement[\"groupIds\"],\n selectedGroupIds: { [groupId: string]: boolean },\n) => groupIds.filter((groupId) => !selectedGroupIds[groupId]);\n\nexport const getMaximumGroups = (\n elements: ExcalidrawElement[],\n elementsMap: ElementsMap,\n): ExcalidrawElement[][] => {\n const groups: Map<String, ExcalidrawElement[]> = new Map<\n String,\n ExcalidrawElement[]\n >();\n elements.forEach((element: ExcalidrawElement) => {\n const groupId =\n element.groupIds.length === 0\n ? element.id\n : element.groupIds[element.groupIds.length - 1];\n\n const currentGroupMembers = groups.get(groupId) || [];\n\n // Include bound text if present when grouping\n const boundTextElement = getBoundTextElement(element, elementsMap);\n if (boundTextElement) {\n currentGroupMembers.push(boundTextElement);\n }\n groups.set(groupId, [...currentGroupMembers, element]);\n });\n\n return Array.from(groups.values());\n};\n\nexport const elementsAreInSameGroup = (elements: ExcalidrawElement[]) => {\n const allGroups = elements.flatMap((element) => element.groupIds);\n const groupCount = new Map<string, number>();\n let maxGroup = 0;\n\n for (const group of allGroups) {\n groupCount.set(group, (groupCount.get(group) ?? 0) + 1);\n if (groupCount.get(group)! > maxGroup) {\n maxGroup = groupCount.get(group)!;\n }\n }\n\n return maxGroup === elements.length;\n};\n", "export * from \"./export\";\nexport * from \"./withinBounds\";\nexport * from \"./bbox\";\n", "import {\n exportToCanvas as _exportToCanvas,\n exportToSvg as _exportToSvg,\n} from \"../excalidraw/scene/export\";\nimport { getDefaultAppState } from \"../excalidraw/appState\";\nimport { AppState, BinaryFiles } from \"../excalidraw/types\";\nimport {\n ExcalidrawElement,\n ExcalidrawFrameLikeElement,\n NonDeleted,\n} from \"../excalidraw/element/types\";\nimport { restore } from \"../excalidraw/data/restore\";\nimport { MIME_TYPES } from \"../excalidraw/constants\";\nimport { encodePngMetadata } from \"../excalidraw/data/image\";\nimport { serializeAsJSON } from \"../excalidraw/data/json\";\nimport {\n copyBlobToClipboardAsPng,\n copyTextToSystemClipboard,\n copyToClipboard,\n} from \"../excalidraw/clipboard\";\n\nexport { MIME_TYPES };\n\ntype ExportOpts = {\n elements: readonly NonDeleted<ExcalidrawElement>[];\n appState?: Partial<Omit<AppState, \"offsetTop\" | \"offsetLeft\">>;\n files: BinaryFiles | null;\n maxWidthOrHeight?: number;\n exportingFrame?: ExcalidrawFrameLikeElement | null;\n getDimensions?: (\n width: number,\n height: number,\n ) => { width: number; height: number; scale?: number };\n};\n\nexport const exportToCanvas = ({\n elements,\n appState,\n files,\n maxWidthOrHeight,\n getDimensions,\n exportPadding,\n exportingFrame,\n}: ExportOpts & {\n exportPadding?: number;\n}) => {\n const { elements: restoredElements, appState: restoredAppState } = restore(\n { elements, appState },\n null,\n null,\n );\n const { exportBackground, viewBackgroundColor } = restoredAppState;\n return _exportToCanvas(\n restoredElements,\n { ...restoredAppState, offsetTop: 0, offsetLeft: 0, width: 0, height: 0 },\n files || {},\n { exportBackground, exportPadding, viewBackgroundColor, exportingFrame },\n (width: number, height: number) => {\n const canvas = document.createElement(\"canvas\");\n\n if (maxWidthOrHeight) {\n if (typeof getDimensions === \"function\") {\n console.warn(\n \"`getDimensions()` is ignored when `maxWidthOrHeight` is supplied.\",\n );\n }\n\n const max = Math.max(width, height);\n\n // if content is less then maxWidthOrHeight, fallback on supplied scale\n const scale =\n maxWidthOrHeight < max\n ? maxWidthOrHeight / max\n : appState?.exportScale ?? 1;\n\n canvas.width = width * scale;\n canvas.height = height * scale;\n\n return {\n canvas,\n scale,\n };\n }\n\n const ret = getDimensions?.(width, height) || { width, height };\n\n canvas.width = ret.width;\n canvas.height = ret.height;\n\n return {\n canvas,\n scale: ret.scale ?? 1,\n };\n },\n );\n};\n\nexport const exportToBlob = async (\n opts: ExportOpts & {\n mimeType?: string;\n quality?: number;\n exportPadding?: number;\n },\n): Promise<Blob> => {\n let { mimeType = MIME_TYPES.png, quality } = opts;\n\n if (mimeType === MIME_TYPES.png && typeof quality === \"number\") {\n console.warn(`\"quality\" will be ignored for \"${MIME_TYPES.png}\" mimeType`);\n }\n\n // typo in MIME type (should be \"jpeg\")\n if (mimeType === \"image/jpg\") {\n mimeType = MIME_TYPES.jpg;\n }\n\n if (mimeType === MIME_TYPES.jpg && !opts.appState?.exportBackground) {\n console.warn(\n `Defaulting \"exportBackground\" to \"true\" for \"${MIME_TYPES.jpg}\" mimeType`,\n );\n opts = {\n ...opts,\n appState: { ...opts.appState, exportBackground: true },\n };\n }\n\n const canvas = await exportToCanvas(opts);\n\n quality = quality ? quality : /image\\/jpe?g/.test(mimeType) ? 0.92 : 0.8;\n\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n async (blob) => {\n if (!blob) {\n return reject(new Error(\"couldn't export to blob\"));\n }\n if (\n blob &&\n mimeType === MIME_TYPES.png &&\n opts.appState?.exportEmbedScene\n ) {\n blob = await encodePngMetadata({\n blob,\n metadata: serializeAsJSON(\n // NOTE as long as we're using the Scene hack, we need to ensure\n // we pass the original, uncloned elements when serializing\n // so that we keep ids stable\n opts.elements,\n opts.appState,\n opts.files || {},\n \"local\",\n ),\n });\n }\n resolve(blob);\n },\n mimeType,\n quality,\n );\n });\n};\n\nexport const exportToSvg = async ({\n elements,\n appState = getDefaultAppState(),\n files = {},\n exportPadding,\n renderEmbeddables,\n exportingFrame,\n}: Omit<ExportOpts, \"getDimensions\"> & {\n exportPadding?: number;\n renderEmbeddables?: boolean;\n}): Promise<SVGSVGElement> => {\n const { elements: restoredElements, appState: restoredAppState } = restore(\n { elements, appState },\n null,\n null,\n );\n\n const exportAppState = {\n ...restoredAppState,\n exportPadding,\n };\n\n return _exportToSvg(restoredElements, exportAppState, files, {\n exportingFrame,\n renderEmbeddables,\n });\n};\n\nexport const exportToClipboard = async (\n opts: ExportOpts & {\n mimeType?: string;\n quality?: number;\n type: \"png\" | \"svg\" | \"json\";\n },\n) => {\n if (opts.type === \"svg\") {\n const svg = await exportToSvg(opts);\n await copyTextToSystemClipboard(svg.outerHTML);\n } else if (opts.type === \"png\") {\n await copyBlobToClipboardAsPng(exportToBlob(opts));\n } else if (opts.type === \"json\") {\n await copyToClipboard(opts.elements, opts.files);\n } else {\n throw new Error(\"Invalid export type\");\n }\n};\n", "import rough from \"roughjs/bin/rough\";\nimport {\n ExcalidrawElement,\n ExcalidrawFrameLikeElement,\n ExcalidrawTextElement,\n NonDeletedExcalidrawElement,\n NonDeletedSceneElementsMap,\n} from \"../element/types\";\nimport {\n Bounds,\n getCommonBounds,\n getElementAbsoluteCoords,\n} from \"../element/bounds\";\nimport { renderSceneToSvg } from \"../renderer/staticSvgScene\";\nimport { arrayToMap, distance, getFontString, toBrandedType } from \"../utils\";\nimport { AppState, BinaryFiles } from \"../types\";\nimport {\n DEFAULT_EXPORT_PADDING,\n FONT_FAMILY,\n FRAME_STYLE,\n SVG_NS,\n THEME_FILTER,\n} from \"../constants\";\nimport { getDefaultAppState } from \"../appState\";\nimport { serializeAsJSON } from \"../data/json\";\nimport {\n getInitializedImageElements,\n updateImageCache,\n} from \"../element/image\";\nimport {\n getElementsOverlappingFrame,\n getFrameLikeElements,\n getFrameLikeTitle,\n getRootElements,\n} from \"../frame\";\nimport { newTextElement } from \"../element\";\nimport { Mutable } from \"../utility-types\";\nimport { newElementWith } from \"../element/mutateElement\";\nimport { isFrameElement, isFrameLikeElement } from \"../element/typeChecks\";\nimport { RenderableElementsMap } from \"./types\";\nimport { renderStaticScene } from \"../renderer/staticScene\";\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\n\nconst truncateText = (element: ExcalidrawTextElement, maxWidth: number) => {\n if (element.width <= maxWidth) {\n return element;\n }\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\")!;\n ctx.font = getFontString({\n fontFamily: element.fontFamily,\n fontSize: element.fontSize,\n });\n\n let text = element.text;\n\n const metrics = ctx.measureText(text);\n\n if (metrics.width > maxWidth) {\n // we iterate from the right, removing characters one by one instead\n // of bulding the string up. This assumes that it's more likely\n // your frame names will overflow by not that many characters\n // (if ever), so it sohuld be faster this way.\n for (let i = text.length; i > 0; i--) {\n const newText = `${text.slice(0, i)}...`;\n if (ctx.measureText(newText).width <= maxWidth) {\n text = newText;\n break;\n }\n }\n }\n return newElementWith(element, { text, width: maxWidth });\n};\n\n/**\n * When exporting frames, we need to render frame labels which are currently\n * being rendered in DOM when editing. Adding the labels as regular text\n * elements seems like a simple hack. In the future we'll want to move to\n * proper canvas rendering, even within editor (instead of DOM).\n */\nconst addFrameLabelsAsTextElements = (\n elements: readonly NonDeletedExcalidrawElement[],\n opts: Pick<AppState, \"exportWithDarkMode\">,\n) => {\n const nextElements: NonDeletedExcalidrawElement[] = [];\n let frameIndex = 0;\n let magicFrameIndex = 0;\n for (const element of elements) {\n if (isFrameLikeElement(element)) {\n if (isFrameElement(element)) {\n frameIndex++;\n } else {\n magicFrameIndex++;\n }\n let textElement: Mutable<ExcalidrawTextElement> = newTextElement({\n x: element.x,\n y: element.y - FRAME_STYLE.nameOffsetY,\n fontFamily: FONT_FAMILY.Assistant,\n fontSize: FRAME_STYLE.nameFontSize,\n lineHeight:\n FRAME_STYLE.nameLineHeight as ExcalidrawTextElement[\"lineHeight\"],\n strokeColor: opts.exportWithDarkMode\n ? FRAME_STYLE.nameColorDarkTheme\n : FRAME_STYLE.nameColorLightTheme,\n text: getFrameLikeTitle(\n element,\n isFrameElement(element) ? frameIndex : magicFrameIndex,\n ),\n });\n textElement.y -= textElement.height;\n\n textElement = truncateText(textElement, element.width);\n\n nextElements.push(textElement);\n }\n nextElements.push(element);\n }\n\n return nextElements;\n};\n\nconst getFrameRenderingConfig = (\n exportingFrame: ExcalidrawFrameLikeElement | null,\n frameRendering: AppState[\"frameRendering\"] | null,\n): AppState[\"frameRendering\"] => {\n frameRendering = frameRendering || getDefaultAppState().frameRendering;\n return {\n enabled: exportingFrame ? true : frameRendering.enabled,\n outline: exportingFrame ? false : frameRendering.outline,\n name: exportingFrame ? false : frameRendering.name,\n clip: exportingFrame ? true : frameRendering.clip,\n };\n};\n\nconst prepareElementsForRender = ({\n elements,\n exportingFrame,\n frameRendering,\n exportWithDarkMode,\n}: {\n elements: readonly ExcalidrawElement[];\n exportingFrame: ExcalidrawFrameLikeElement | null | undefined;\n frameRendering: AppState[\"frameRendering\"];\n exportWithDarkMode: AppState[\"exportWithDarkMode\"];\n}) => {\n let nextElements: readonly ExcalidrawElement[];\n\n if (exportingFrame) {\n nextElements = getElementsOverlappingFrame(elements, exportingFrame);\n } else if (frameRendering.enabled && frameRendering.name) {\n nextElements = addFrameLabelsAsTextElements(elements, {\n exportWithDarkMode,\n });\n } else {\n nextElements = elements;\n }\n\n return nextElements;\n};\n\nexport const exportToCanvas = async (\n elements: readonly NonDeletedExcalidrawElement[],\n appState: AppState,\n files: BinaryFiles,\n {\n exportBackground,\n exportPadding = DEFAULT_EXPORT_PADDING,\n viewBackgroundColor,\n exportingFrame,\n }: {\n exportBackground: boolean;\n exportPadding?: number;\n viewBackgroundColor: string;\n exportingFrame?: ExcalidrawFrameLikeElement | null;\n },\n createCanvas: (\n width: number,\n height: number,\n ) => { canvas: HTMLCanvasElement; scale: number } = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return { canvas, scale: appState.exportScale };\n },\n) => {\n const frameRendering = getFrameRenderingConfig(\n exportingFrame ?? null,\n appState.frameRendering ?? null,\n );\n\n const elementsForRender = prepareElementsForRender({\n elements,\n exportingFrame,\n exportWithDarkMode: appState.exportWithDarkMode,\n frameRendering,\n });\n\n if (exportingFrame) {\n exportPadding = 0;\n }\n\n const [minX, minY, width, height] = getCanvasSize(\n exportingFrame ? [exportingFrame] : getRootElements(elementsForRender),\n exportPadding,\n );\n\n const { canvas, scale = 1 } = createCanvas(width, height);\n\n const defaultAppState = getDefaultAppState();\n\n const { imageCache } = await updateImageCache({\n imageCache: new Map(),\n fileIds: getInitializedImageElements(elementsForRender).map(\n (element) => element.fileId,\n ),\n files,\n });\n\n renderStaticScene({\n canvas,\n rc: rough.canvas(canvas),\n elementsMap: toBrandedType<RenderableElementsMap>(\n arrayToMap(elementsForRender),\n ),\n allElementsMap: toBrandedType<NonDeletedSceneElementsMap>(\n arrayToMap(elements),\n ),\n visibleElements: elementsForRender,\n scale,\n appState: {\n ...appState,\n frameRendering,\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n shouldCacheIgnoreZoom: false,\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\n },\n renderConfig: {\n canvasBackgroundColor: viewBackgroundColor,\n imageCache,\n renderGrid: false,\n isExporting: true,\n // empty disables embeddable rendering\n embedsValidationStatus: new Map(),\n elementsPendingErasure: new Set(),\n },\n });\n\n return canvas;\n};\n\nexport const exportToSvg = async (\n elements: readonly NonDeletedExcalidrawElement[],\n appState: {\n exportBackground: boolean;\n exportPadding?: number;\n exportScale?: number;\n viewBackgroundColor: string;\n exportWithDarkMode?: boolean;\n exportEmbedScene?: boolean;\n frameRendering?: AppState[\"frameRendering\"];\n },\n files: BinaryFiles | null,\n opts?: {\n /**\n * if true, all embeddables passed in will be rendered when possible.\n */\n renderEmbeddables?: boolean;\n exportingFrame?: ExcalidrawFrameLikeElement | null;\n },\n): Promise<SVGSVGElement> => {\n const frameRendering = getFrameRenderingConfig(\n opts?.exportingFrame ?? null,\n appState.frameRendering ?? null,\n );\n\n let {\n exportPadding = DEFAULT_EXPORT_PADDING,\n exportWithDarkMode = false,\n viewBackgroundColor,\n exportScale = 1,\n exportEmbedScene,\n } = appState;\n\n const { exportingFrame = null } = opts || {};\n\n const elementsForRender = prepareElementsForRender({\n elements,\n exportingFrame,\n exportWithDarkMode,\n frameRendering,\n });\n\n if (exportingFrame) {\n exportPadding = 0;\n }\n\n let metadata = \"\";\n\n // we need to serialize the \"original\" elements before we put them through\n // the tempScene hack which duplicates and regenerates ids\n if (exportEmbedScene) {\n try {\n metadata = await (\n await import(\"../data/image\")\n ).encodeSvgMetadata({\n // when embedding scene, we want to embed the origionally supplied\n // elements which don't contain the temp frame labels.\n // But it also requires that the exportToSvg is being supplied with\n // only the elements that we're exporting, and no extra.\n text: serializeAsJSON(elements, appState, files || {}, \"local\"),\n });\n } catch (error: any) {\n console.error(error);\n }\n }\n\n const [minX, minY, width, height] = getCanvasSize(\n exportingFrame ? [exportingFrame] : getRootElements(elementsForRender),\n exportPadding,\n );\n\n // initialize SVG root\n const svgRoot = document.createElementNS(SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", THEME_FILTER);\n }\n\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (import.meta.env.VITE_IS_EXCALIDRAW_NPM_PACKAGE) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${import.meta.env.VITE_PKG_NAME}@${\n import.meta.env.PKG_VERSION\n }`;\n\n if (assetPath?.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n\n const offsetX = -minX + exportPadding;\n const offsetY = -minY + exportPadding;\n\n const frameElements = getFrameLikeElements(elements);\n\n let exportingFrameClipPath = \"\";\n const elementsMap = arrayToMap(elements);\n for (const frame of frameElements) {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(frame, elementsMap);\n const cx = (x2 - x1) / 2 - (frame.x - x1);\n const cy = (y2 - y1) / 2 - (frame.y - y1);\n\n exportingFrameClipPath += `<clipPath id=${frame.id}>\n <rect transform=\"translate(${frame.x + offsetX} ${\n frame.y + offsetY\n }) rotate(${frame.angle} ${cx} ${cy})\"\n width=\"${frame.width}\"\n height=\"${frame.height}\"\n >\n </rect>\n </clipPath>`;\n }\n\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n @font-face {\n font-family: \"Assistant\";\n src: url(\"${assetPath}Assistant-Regular.woff2\");\n }\n </style>\n ${exportingFrameClipPath}\n </defs>\n `;\n\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n\n const rsvg = rough.svg(svgRoot);\n\n const renderEmbeddables = opts?.renderEmbeddables ?? false;\n\n renderSceneToSvg(\n elementsForRender,\n toBrandedType<RenderableElementsMap>(arrayToMap(elementsForRender)),\n rsvg,\n svgRoot,\n files || {},\n {\n offsetX,\n offsetY,\n isExporting: true,\n exportWithDarkMode,\n renderEmbeddables,\n frameRendering,\n canvasBackgroundColor: viewBackgroundColor,\n embedsValidationStatus: renderEmbeddables\n ? new Map(\n elementsForRender\n .filter((element) => isFrameLikeElement(element))\n .map((element) => [element.id, true]),\n )\n : new Map(),\n },\n );\n\n return svgRoot;\n};\n\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (\n elements: readonly NonDeletedExcalidrawElement[],\n exportPadding: number,\n): Bounds => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n const width = distance(minX, maxX) + exportPadding * 2;\n const height = distance(minY, maxY) + exportPadding * 2;\n\n return [minX, minY, width, height];\n};\n\nexport const getExportSize = (\n elements: readonly NonDeletedExcalidrawElement[],\n exportPadding: number,\n scale: number,\n): [number, number] => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map(\n (dimension) => Math.trunc(dimension * scale),\n );\n\n return [width, height];\n};\n", "import { Drawable } from \"roughjs/bin/core\";\nimport { RoughSVG } from \"roughjs/bin/svg\";\nimport {\n FRAME_STYLE,\n MAX_DECIMALS_FOR_SVG_EXPORT,\n MIME_TYPES,\n SVG_NS,\n} from \"../constants\";\nimport { normalizeLink, toValidURL } from \"../data/url\";\nimport { getElementAbsoluteCoords } from \"../element\";\nimport {\n createPlaceholderEmbeddableLabel,\n getEmbedLink,\n} from \"../element/embeddable\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport {\n getBoundTextElement,\n getContainerElement,\n getLineHeightInPx,\n getVerticalOffset,\n} from \"../element/textElement\";\nimport {\n isArrowElement,\n isIframeLikeElement,\n isInitializedImageElement,\n isTextElement,\n} from \"../element/typeChecks\";\nimport {\n ExcalidrawElement,\n ExcalidrawTextElementWithContainer,\n NonDeletedExcalidrawElement,\n} from \"../element/types\";\nimport { getContainingFrame } from \"../frame\";\nimport { getCornerRadius, isPathALoop } from \"../math\";\nimport { ShapeCache } from \"../scene/ShapeCache\";\nimport { RenderableElementsMap, SVGRenderConfig } from \"../scene/types\";\nimport { AppState, BinaryFiles } from \"../types\";\nimport { getFontFamilyString, isRTL, isTestEnv } from \"../utils\";\nimport { getFreeDrawSvgPath, IMAGE_INVERT_FILTER } from \"./renderElement\";\n\nconst roughSVGDrawWithPrecision = (\n rsvg: RoughSVG,\n drawable: Drawable,\n precision?: number,\n) => {\n if (typeof precision === \"undefined\") {\n return rsvg.draw(drawable);\n }\n const pshape: Drawable = {\n sets: drawable.sets,\n shape: drawable.shape,\n options: { ...drawable.options, fixedDecimalPlaceDigits: precision },\n };\n return rsvg.draw(pshape);\n};\n\nconst maybeWrapNodesInFrameClipPath = (\n element: NonDeletedExcalidrawElement,\n root: SVGElement,\n nodes: SVGElement[],\n frameRendering: AppState[\"frameRendering\"],\n elementsMap: RenderableElementsMap,\n) => {\n if (!frameRendering.enabled || !frameRendering.clip) {\n return null;\n }\n const frame = getContainingFrame(element, elementsMap);\n if (frame) {\n const g = root.ownerDocument!.createElementNS(SVG_NS, \"g\");\n g.setAttributeNS(SVG_NS, \"clip-path\", `url(#${frame.id})`);\n nodes.forEach((node) => g.appendChild(node));\n return g;\n }\n\n return null;\n};\n\nconst renderElementToSvg = (\n element: NonDeletedExcalidrawElement,\n elementsMap: RenderableElementsMap,\n rsvg: RoughSVG,\n svgRoot: SVGElement,\n files: BinaryFiles,\n offsetX: number,\n offsetY: number,\n renderConfig: SVGRenderConfig,\n) => {\n const offset = { x: offsetX, y: offsetY };\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n let cx = (x2 - x1) / 2 - (element.x - x1);\n let cy = (y2 - y1) / 2 - (element.y - y1);\n if (isTextElement(element)) {\n const container = getContainerElement(element, elementsMap);\n if (isArrowElement(container)) {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(container, elementsMap);\n\n const boundTextCoords = LinearElementEditor.getBoundTextElementPosition(\n container,\n element as ExcalidrawTextElementWithContainer,\n elementsMap,\n );\n cx = (x2 - x1) / 2 - (boundTextCoords.x - x1);\n cy = (y2 - y1) / 2 - (boundTextCoords.y - y1);\n offsetX = offsetX + boundTextCoords.x - element.x;\n offsetY = offsetY + boundTextCoords.y - element.y;\n }\n }\n const degree = (180 * element.angle) / Math.PI;\n\n // element to append node to, most of the time svgRoot\n let root = svgRoot;\n\n // if the element has a link, create an anchor tag and make that the new root\n if (element.link) {\n const anchorTag = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"a\");\n anchorTag.setAttribute(\"href\", normalizeLink(element.link));\n root.appendChild(anchorTag);\n root = anchorTag;\n }\n\n const addToRoot = (node: SVGElement, element: ExcalidrawElement) => {\n if (isTestEnv()) {\n node.setAttribute(\"data-id\", element.id);\n }\n root.appendChild(node);\n };\n\n const opacity =\n ((getContainingFrame(element, elementsMap)?.opacity ?? 100) *\n element.opacity) /\n 10000;\n\n switch (element.type) {\n case \"selection\": {\n // Since this is used only during editing experience, which is canvas based,\n // this should not happen\n throw new Error(\"Selection rendering is not supported for SVG\");\n }\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\": {\n const shape = ShapeCache.generateElementShape(element, null);\n const node = roughSVGDrawWithPrecision(\n rsvg,\n shape,\n MAX_DECIMALS_FOR_SVG_EXPORT,\n );\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\"stroke-linecap\", \"round\");\n node.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n\n const g = maybeWrapNodesInFrameClipPath(\n element,\n root,\n [node],\n renderConfig.frameRendering,\n elementsMap,\n );\n\n addToRoot(g || node, element);\n break;\n }\n case \"iframe\":\n case \"embeddable\": {\n // render placeholder rectangle\n const shape = ShapeCache.generateElementShape(element, renderConfig);\n const node = roughSVGDrawWithPrecision(\n rsvg,\n shape,\n MAX_DECIMALS_FOR_SVG_EXPORT,\n );\n const opacity = element.opacity / 100;\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\"stroke-linecap\", \"round\");\n node.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n addToRoot(node, element);\n\n const label: ExcalidrawElement =\n createPlaceholderEmbeddableLabel(element);\n renderElementToSvg(\n label,\n elementsMap,\n rsvg,\n root,\n files,\n label.x + offset.x - element.x,\n label.y + offset.y - element.y,\n renderConfig,\n );\n\n // render embeddable element + iframe\n const embeddableNode = roughSVGDrawWithPrecision(\n rsvg,\n shape,\n MAX_DECIMALS_FOR_SVG_EXPORT,\n );\n embeddableNode.setAttribute(\"stroke-linecap\", \"round\");\n embeddableNode.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n while (embeddableNode.firstChild) {\n embeddableNode.removeChild(embeddableNode.firstChild);\n }\n const radius = getCornerRadius(\n Math.min(element.width, element.height),\n element,\n );\n\n const embedLink = getEmbedLink(toValidURL(element.link || \"\"));\n\n // if rendering embeddables explicitly disabled or\n // embedding documents via srcdoc (which doesn't seem to work for SVGs)\n // replace with a link instead\n if (\n renderConfig.renderEmbeddables === false ||\n embedLink?.type === \"document\"\n ) {\n const anchorTag = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"a\");\n anchorTag.setAttribute(\"href\", normalizeLink(element.link || \"\"));\n anchorTag.setAttribute(\"target\", \"_blank\");\n anchorTag.setAttribute(\"rel\", \"noopener noreferrer\");\n anchorTag.style.borderRadius = `${radius}px`;\n\n embeddableNode.appendChild(anchorTag);\n } else {\n const foreignObject = svgRoot.ownerDocument!.createElementNS(\n SVG_NS,\n \"foreignObject\",\n );\n foreignObject.style.width = `${element.width}px`;\n foreignObject.style.height = `${element.height}px`;\n foreignObject.style.border = \"none\";\n const div = foreignObject.ownerDocument!.createElementNS(SVG_NS, \"div\");\n div.setAttribute(\"xmlns\", \"http://www.w3.org/1999/xhtml\");\n div.style.width = \"100%\";\n div.style.height = \"100%\";\n const iframe = div.ownerDocument!.createElement(\"iframe\");\n iframe.src = embedLink?.link ?? \"\";\n iframe.style.width = \"100%\";\n iframe.style.height = \"100%\";\n iframe.style.border = \"none\";\n iframe.style.borderRadius = `${radius}px`;\n iframe.style.top = \"0\";\n iframe.style.left = \"0\";\n iframe.allowFullscreen = true;\n div.appendChild(iframe);\n foreignObject.appendChild(div);\n\n embeddableNode.appendChild(foreignObject);\n }\n addToRoot(embeddableNode, element);\n break;\n }\n case \"line\":\n case \"arrow\": {\n const boundText = getBoundTextElement(element, elementsMap);\n const maskPath = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"mask\");\n if (boundText) {\n maskPath.setAttribute(\"id\", `mask-${element.id}`);\n const maskRectVisible = svgRoot.ownerDocument!.createElementNS(\n SVG_NS,\n \"rect\",\n );\n offsetX = offsetX || 0;\n offsetY = offsetY || 0;\n maskRectVisible.setAttribute(\"x\", \"0\");\n maskRectVisible.setAttribute(\"y\", \"0\");\n maskRectVisible.setAttribute(\"fill\", \"#fff\");\n maskRectVisible.setAttribute(\n \"width\",\n `${element.width + 100 + offsetX}`,\n );\n maskRectVisible.setAttribute(\n \"height\",\n `${element.height + 100 + offsetY}`,\n );\n\n maskPath.appendChild(maskRectVisible);\n const maskRectInvisible = svgRoot.ownerDocument!.createElementNS(\n SVG_NS,\n \"rect\",\n );\n const boundTextCoords = LinearElementEditor.getBoundTextElementPosition(\n element,\n boundText,\n elementsMap,\n );\n\n const maskX = offsetX + boundTextCoords.x - element.x;\n const maskY = offsetY + boundTextCoords.y - element.y;\n\n maskRectInvisible.setAttribute(\"x\", maskX.toString());\n maskRectInvisible.setAttribute(\"y\", maskY.toString());\n maskRectInvisible.setAttribute(\"fill\", \"#000\");\n maskRectInvisible.setAttribute(\"width\", `${boundText.width}`);\n maskRectInvisible.setAttribute(\"height\", `${boundText.height}`);\n maskRectInvisible.setAttribute(\"opacity\", \"1\");\n maskPath.appendChild(maskRectInvisible);\n }\n const group = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"g\");\n if (boundText) {\n group.setAttribute(\"mask\", `url(#mask-${element.id})`);\n }\n group.setAttribute(\"stroke-linecap\", \"round\");\n\n const shapes = ShapeCache.generateElementShape(element, renderConfig);\n shapes.forEach((shape) => {\n const node = roughSVGDrawWithPrecision(\n rsvg,\n shape,\n MAX_DECIMALS_FOR_SVG_EXPORT,\n );\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n if (\n element.type === \"line\" &&\n isPathALoop(element.points) &&\n element.backgroundColor !== \"transparent\"\n ) {\n node.setAttribute(\"fill-rule\", \"evenodd\");\n }\n group.appendChild(node);\n });\n\n const g = maybeWrapNodesInFrameClipPath(\n element,\n root,\n [group, maskPath],\n renderConfig.frameRendering,\n elementsMap,\n );\n if (g) {\n addToRoot(g, element);\n root.appendChild(g);\n } else {\n addToRoot(group, element);\n root.append(maskPath);\n }\n break;\n }\n case \"freedraw\": {\n const backgroundFillShape = ShapeCache.generateElementShape(\n element,\n renderConfig,\n );\n const node = backgroundFillShape\n ? roughSVGDrawWithPrecision(\n rsvg,\n backgroundFillShape,\n MAX_DECIMALS_FOR_SVG_EXPORT,\n )\n : svgRoot.ownerDocument!.createElementNS(SVG_NS, \"g\");\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n node.setAttribute(\"stroke\", \"none\");\n const path = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"path\");\n path.setAttribute(\"fill\", element.strokeColor);\n path.setAttribute(\"d\", getFreeDrawSvgPath(element));\n node.appendChild(path);\n\n const g = maybeWrapNodesInFrameClipPath(\n element,\n root,\n [node],\n renderConfig.frameRendering,\n elementsMap,\n );\n\n addToRoot(g || node, element);\n break;\n }\n case \"image\": {\n const width = Math.round(element.width);\n const height = Math.round(element.height);\n const fileData =\n isInitializedImageElement(element) && files[element.fileId];\n if (fileData) {\n const symbolId = `image-${fileData.id}`;\n let symbol = svgRoot.querySelector(`#${symbolId}`);\n if (!symbol) {\n symbol = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"symbol\");\n symbol.id = symbolId;\n\n const image = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"image\");\n\n image.setAttribute(\"width\", \"100%\");\n image.setAttribute(\"height\", \"100%\");\n image.setAttribute(\"href\", fileData.dataURL);\n\n symbol.appendChild(image);\n\n root.prepend(symbol);\n }\n\n const use = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"use\");\n use.setAttribute(\"href\", `#${symbolId}`);\n\n // in dark theme, revert the image color filter\n if (\n renderConfig.exportWithDarkMode &&\n fileData.mimeType !== MIME_TYPES.svg\n ) {\n use.setAttribute(\"filter\", IMAGE_INVERT_FILTER);\n }\n\n use.setAttribute(\"width\", `${width}`);\n use.setAttribute(\"height\", `${height}`);\n use.setAttribute(\"opacity\", `${opacity}`);\n\n // We first apply `scale` transforms (horizontal/vertical mirroring)\n // on the <use> element, then apply translation and rotation\n // on the <g> element which wraps the <use>.\n // Doing this separately is a quick hack to to work around compositing\n // the transformations correctly (the transform-origin was not being\n // applied correctly).\n if (element.scale[0] !== 1 || element.scale[1] !== 1) {\n const translateX = element.scale[0] !== 1 ? -width : 0;\n const translateY = element.scale[1] !== 1 ? -height : 0;\n use.setAttribute(\n \"transform\",\n `scale(${element.scale[0]}, ${element.scale[1]}) translate(${translateX} ${translateY})`,\n );\n }\n\n const g = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"g\");\n g.appendChild(use);\n g.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n\n if (element.roundness) {\n const clipPath = svgRoot.ownerDocument!.createElementNS(\n SVG_NS,\n \"clipPath\",\n );\n clipPath.id = `image-clipPath-${element.id}`;\n\n const clipRect = svgRoot.ownerDocument!.createElementNS(\n SVG_NS,\n \"rect\",\n );\n const radius = getCornerRadius(\n Math.min(element.width, element.height),\n element,\n );\n clipRect.setAttribute(\"width\", `${element.width}`);\n clipRect.setAttribute(\"height\", `${element.height}`);\n clipRect.setAttribute(\"rx\", `${radius}`);\n clipRect.setAttribute(\"ry\", `${radius}`);\n clipPath.appendChild(clipRect);\n addToRoot(clipPath, element);\n\n g.setAttributeNS(SVG_NS, \"clip-path\", `url(#${clipPath.id})`);\n }\n\n const clipG = maybeWrapNodesInFrameClipPath(\n element,\n root,\n [g],\n renderConfig.frameRendering,\n elementsMap,\n );\n addToRoot(clipG || g, element);\n }\n break;\n }\n // frames are not rendered and only acts as a container\n case \"frame\":\n case \"magicframe\": {\n if (\n renderConfig.frameRendering.enabled &&\n renderConfig.frameRendering.outline\n ) {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n\n rect.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n\n rect.setAttribute(\"width\", `${element.width}px`);\n rect.setAttribute(\"height\", `${element.height}px`);\n // Rounded corners\n rect.setAttribute(\"rx\", FRAME_STYLE.radius.toString());\n rect.setAttribute(\"ry\", FRAME_STYLE.radius.toString());\n\n rect.setAttribute(\"fill\", \"none\");\n rect.setAttribute(\"stroke\", FRAME_STYLE.strokeColor);\n rect.setAttribute(\"stroke-width\", FRAME_STYLE.strokeWidth.toString());\n\n addToRoot(rect, element);\n }\n break;\n }\n default: {\n if (isTextElement(element)) {\n const node = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"g\");\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n\n node.setAttribute(\n \"transform\",\n `translate(${offsetX || 0} ${\n offsetY || 0\n }) rotate(${degree} ${cx} ${cy})`,\n );\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const lineHeightPx = getLineHeightInPx(\n element.fontSize,\n element.lineHeight,\n );\n const horizontalOffset =\n element.textAlign === \"center\"\n ? element.width / 2\n : element.textAlign === \"right\"\n ? element.width\n : 0;\n const verticalOffset = getVerticalOffset(\n element.fontFamily,\n element.fontSize,\n lineHeightPx,\n );\n const direction = isRTL(element.text) ? \"rtl\" : \"ltr\";\n const textAnchor =\n element.textAlign === \"center\"\n ? \"middle\"\n : element.textAlign === \"right\" || direction === \"rtl\"\n ? \"end\"\n : \"start\";\n for (let i = 0; i < lines.length; i++) {\n const text = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"text\");\n text.textContent = lines[i];\n text.setAttribute(\"x\", `${horizontalOffset}`);\n text.setAttribute(\"y\", `${i * lineHeightPx + verticalOffset}`);\n text.setAttribute(\"font-family\", getFontFamilyString(element));\n text.setAttribute(\"font-size\", `${element.fontSize}px`);\n text.setAttribute(\"fill\", element.strokeColor);\n text.setAttribute(\"text-anchor\", textAnchor);\n text.setAttribute(\"style\", \"white-space: pre;\");\n text.setAttribute(\"direction\", direction);\n text.setAttribute(\"dominant-baseline\", \"alphabetic\");\n node.appendChild(text);\n }\n\n const g = maybeWrapNodesInFrameClipPath(\n element,\n root,\n [node],\n renderConfig.frameRendering,\n elementsMap,\n );\n\n addToRoot(g || node, element);\n } else {\n // @ts-ignore\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n }\n};\n\nexport const renderSceneToSvg = (\n elements: readonly NonDeletedExcalidrawElement[],\n elementsMap: RenderableElementsMap,\n rsvg: RoughSVG,\n svgRoot: SVGElement,\n files: BinaryFiles,\n renderConfig: SVGRenderConfig,\n) => {\n if (!svgRoot) {\n return;\n }\n\n // render elements\n elements\n .filter((el) => !isIframeLikeElement(el))\n .forEach((element) => {\n if (!element.isDeleted) {\n try {\n renderElementToSvg(\n element,\n elementsMap,\n rsvg,\n svgRoot,\n files,\n element.x + renderConfig.offsetX,\n element.y + renderConfig.offsetY,\n renderConfig,\n );\n } catch (error: any) {\n console.error(error);\n }\n }\n });\n\n // render embeddables on top\n elements\n .filter((el) => isIframeLikeElement(el))\n .forEach((element) => {\n if (!element.isDeleted) {\n try {\n renderElementToSvg(\n element,\n elementsMap,\n rsvg,\n svgRoot,\n files,\n element.x + renderConfig.offsetX,\n element.y + renderConfig.offsetY,\n renderConfig,\n );\n } catch (error: any) {\n console.error(error);\n }\n }\n });\n};\n", "import { sanitizeUrl } from \"@braintree/sanitize-url\";\n\nexport const normalizeLink = (link: string) => {\n link = link.trim();\n if (!link) {\n return link;\n }\n return sanitizeUrl(link);\n};\n\nexport const isLocalLink = (link: string | null) => {\n return !!(link?.includes(location.origin) || link?.startsWith(\"/\"));\n};\n\n/**\n * Returns URL sanitized and safe for usage in places such as\n * iframe's src attribute or <a> href attributes.\n */\nexport const toValidURL = (link: string) => {\n link = normalizeLink(link);\n\n // make relative links into fully-qualified urls\n if (link.startsWith(\"/\")) {\n return `${location.origin}${link}`;\n }\n\n try {\n new URL(link);\n } catch {\n // if link does not parse as URL, assume invalid and return blank page\n return \"about:blank\";\n }\n\n return link;\n};\n", "import { register } from \"../actions/register\";\nimport { FONT_FAMILY, VERTICAL_ALIGN } from \"../constants\";\nimport { ExcalidrawProps } from \"../types\";\nimport { getFontString, updateActiveTool } from \"../utils\";\nimport { setCursorForShape } from \"../cursor\";\nimport { newTextElement } from \"./newElement\";\nimport { wrapText } from \"./textElement\";\nimport { isIframeElement } from \"./typeChecks\";\nimport {\n ExcalidrawElement,\n ExcalidrawIframeLikeElement,\n IframeData,\n} from \"./types\";\n\nconst embeddedLinkCache = new Map<string, IframeData>();\n\nconst RE_YOUTUBE =\n /^(?:http(?:s)?:\\/\\/)?(?:www\\.)?youtu(?:be\\.com|\\.be)\\/(embed\\/|watch\\?v=|shorts\\/|playlist\\?list=|embed\\/videoseries\\?list=)?([a-zA-Z0-9_-]+)(?:\\?t=|&t=|\\?start=|&start=)?([a-zA-Z0-9_-]+)?[^\\s]*$/;\n\nconst RE_VIMEO =\n /^(?:http(?:s)?:\\/\\/)?(?:(?:w){3}.)?(?:player\\.)?vimeo\\.com\\/(?:video\\/)?([^?\\s]+)(?:\\?.*)?$/;\nconst RE_FIGMA = /^https:\\/\\/(?:www\\.)?figma\\.com/;\n\nconst RE_GH_GIST = /^https:\\/\\/gist\\.github\\.com/;\nconst RE_GH_GIST_EMBED =\n /^<script[\\s\\S]*?\\ssrc=[\"'](https:\\/\\/gist.github.com\\/.*?)\\.js[\"']/i;\n\n// not anchored to start to allow <blockquote> twitter embeds\nconst RE_TWITTER = /(?:http(?:s)?:\\/\\/)?(?:(?:w){3}.)?(?:twitter|x).com/;\nconst RE_TWITTER_EMBED =\n /^<blockquote[\\s\\S]*?\\shref=[\"'](https:\\/\\/(?:twitter|x).com\\/[^\"']*)/i;\n\nconst RE_VALTOWN =\n /^https:\\/\\/(?:www\\.)?val.town\\/(v|embed)\\/[a-zA-Z_$][0-9a-zA-Z_$]+\\.[a-zA-Z_$][0-9a-zA-Z_$]+/;\n\nconst RE_GENERIC_EMBED =\n /^<(?:iframe|blockquote)[\\s\\S]*?\\s(?:src|href)=[\"']([^\"']*)[\"'][\\s\\S]*?>$/i;\n\nconst RE_GIPHY =\n /giphy.com\\/(?:clips|embed|gifs)\\/[a-zA-Z0-9]*?-?([a-zA-Z0-9]+)(?:[^a-zA-Z0-9]|$)/;\n\nconst ALLOWED_DOMAINS = new Set([\n \"youtube.com\",\n \"youtu.be\",\n \"vimeo.com\",\n \"player.vimeo.com\",\n \"figma.com\",\n \"link.excalidraw.com\",\n \"gist.github.com\",\n \"twitter.com\",\n \"x.com\",\n \"*.simplepdf.eu\",\n \"stackblitz.com\",\n \"val.town\",\n \"giphy.com\",\n \"dddice.com\",\n]);\n\nexport const createSrcDoc = (body: string) => {\n return `<html><body>${body}</body></html>`;\n};\n\nexport const getEmbedLink = (\n link: string | null | undefined,\n): IframeData | null => {\n if (!link) {\n return null;\n }\n\n if (embeddedLinkCache.has(link)) {\n return embeddedLinkCache.get(link)!;\n }\n\n const originalLink = link;\n\n let type: \"video\" | \"generic\" = \"generic\";\n let aspectRatio = { w: 560, h: 840 };\n const ytLink = link.match(RE_YOUTUBE);\n if (ytLink?.[2]) {\n const time = ytLink[3] ? `&start=${ytLink[3]}` : ``;\n const isPortrait = link.includes(\"shorts\");\n type = \"video\";\n switch (ytLink[1]) {\n case \"embed/\":\n case \"watch?v=\":\n case \"shorts/\":\n link = `https://www.youtube.com/embed/${ytLink[2]}?enablejsapi=1${time}`;\n break;\n case \"playlist?list=\":\n case \"embed/videoseries?list=\":\n link = `https://www.youtube.com/embed/videoseries?list=${ytLink[2]}&enablejsapi=1${time}`;\n break;\n default:\n link = `https://www.youtube.com/embed/${ytLink[2]}?enablejsapi=1${time}`;\n break;\n }\n aspectRatio = isPortrait ? { w: 315, h: 560 } : { w: 560, h: 315 };\n embeddedLinkCache.set(originalLink, {\n link,\n intrinsicSize: aspectRatio,\n type,\n });\n return { link, intrinsicSize: aspectRatio, type };\n }\n\n const vimeoLink = link.match(RE_VIMEO);\n if (vimeoLink?.[1]) {\n const target = vimeoLink?.[1];\n const error = !/^\\d+$/.test(target)\n ? new URIError(\"Invalid embed link format\")\n : undefined;\n type = \"video\";\n link = `https://player.vimeo.com/video/${target}?api=1`;\n aspectRatio = { w: 560, h: 315 };\n //warning deliberately ommited so it is displayed only once per link\n //same link next time will be served from cache\n embeddedLinkCache.set(originalLink, {\n link,\n intrinsicSize: aspectRatio,\n type,\n });\n return { link, intrinsicSize: aspectRatio, type, error };\n }\n\n const figmaLink = link.match(RE_FIGMA);\n if (figmaLink) {\n type = \"generic\";\n link = `https://www.figma.com/embed?embed_host=share&url=${encodeURIComponent(\n link,\n )}`;\n aspectRatio = { w: 550, h: 550 };\n embeddedLinkCache.set(originalLink, {\n link,\n intrinsicSize: aspectRatio,\n type,\n });\n return { link, intrinsicSize: aspectRatio, type };\n }\n\n const valLink = link.match(RE_VALTOWN);\n if (valLink) {\n link =\n valLink[1] === \"embed\" ? valLink[0] : valLink[0].replace(\"/v\", \"/embed\");\n embeddedLinkCache.set(originalLink, {\n link,\n intrinsicSize: aspectRatio,\n type,\n });\n return { link, intrinsicSize: aspectRatio, type };\n }\n\n if (RE_TWITTER.test(link)) {\n // the embed srcdoc still supports twitter.com domain only\n link = link.replace(/\\bx.com\\b/, \"twitter.com\");\n\n let ret: IframeData;\n // assume embed code\n if (/<blockquote/.test(link)) {\n const srcDoc = createSrcDoc(link);\n ret = {\n type: \"document\",\n srcdoc: () => srcDoc,\n intrinsicSize: { w: 480, h: 480 },\n };\n // assume regular tweet url\n } else {\n ret = {\n type: \"document\",\n srcdoc: (theme: string) =>\n createSrcDoc(\n `<blockquote class=\"twitter-tweet\" data-dnt=\"true\" data-theme=\"${theme}\"><a href=\"${link}\"></a></blockquote> <script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>`,\n ),\n intrinsicSize: { w: 480, h: 480 },\n };\n }\n embeddedLinkCache.set(originalLink, ret);\n return ret;\n }\n\n if (RE_GH_GIST.test(link)) {\n let ret: IframeData;\n // assume embed code\n if (/<script>/.test(link)) {\n const srcDoc = createSrcDoc(link);\n ret = {\n type: \"document\",\n srcdoc: () => srcDoc,\n intrinsicSize: { w: 550, h: 720 },\n };\n // assume regular url\n } else {\n ret = {\n type: \"document\",\n srcdoc: () =>\n createSrcDoc(`\n <script src=\"${link}.js\"></script>\n <style type=\"text/css\">\n * { margin: 0px; }\n table, .gist { height: 100%; }\n .gist .gist-file { height: calc(100vh - 2px); padding: 0px; display: grid; grid-template-rows: 1fr auto; }\n </style>\n `),\n intrinsicSize: { w: 550, h: 720 },\n };\n }\n embeddedLinkCache.set(link, ret);\n return ret;\n }\n\n embeddedLinkCache.set(link, { link, intrinsicSize: aspectRatio, type });\n return { link, intrinsicSize: aspectRatio, type };\n};\n\nexport const createPlaceholderEmbeddableLabel = (\n element: ExcalidrawIframeLikeElement,\n): ExcalidrawElement => {\n let text: string;\n if (isIframeElement(element)) {\n text = \"IFrame element\";\n } else {\n text =\n !element.link || element?.link === \"\" ? \"Empty Web-Embed\" : element.link;\n }\n\n const fontSize = Math.max(\n Math.min(element.width / 2, element.width / text.length),\n element.width / 30,\n );\n const fontFamily = FONT_FAMILY.Helvetica;\n\n const fontString = getFontString({\n fontSize,\n fontFamily,\n });\n\n return newTextElement({\n x: element.x + element.width / 2,\n y: element.y + element.height / 2,\n strokeColor:\n element.strokeColor !== \"transparent\" ? element.strokeColor : \"black\",\n backgroundColor: \"transparent\",\n fontFamily,\n fontSize,\n text: wrapText(text, fontString, element.width - 20),\n textAlign: \"center\",\n verticalAlign: VERTICAL_ALIGN.MIDDLE,\n angle: element.angle ?? 0,\n });\n};\n\nexport const actionSetEmbeddableAsActiveTool = register({\n name: \"setEmbeddableAsActiveTool\",\n trackEvent: { category: \"toolbar\" },\n perform: (elements, appState, _, app) => {\n const nextActiveTool = updateActiveTool(appState, {\n type: \"embeddable\",\n });\n\n setCursorForShape(app.canvas, {\n ...appState,\n activeTool: nextActiveTool,\n });\n\n return {\n elements,\n appState: {\n ...appState,\n activeTool: updateActiveTool(appState, {\n type: \"embeddable\",\n }),\n },\n commitToHistory: false,\n };\n },\n});\n\nconst validateHostname = (\n url: string,\n /** using a Set assumes it already contains normalized bare domains */\n allowedHostnames: Set<string> | string,\n): boolean => {\n try {\n const { hostname } = new URL(url);\n\n const bareDomain = hostname.replace(/^www\\./, \"\");\n const bareDomainWithFirstSubdomainWildcarded = bareDomain.replace(\n /^([^.]+)/,\n \"*\",\n );\n\n if (allowedHostnames instanceof Set) {\n return (\n ALLOWED_DOMAINS.has(bareDomain) ||\n ALLOWED_DOMAINS.has(bareDomainWithFirstSubdomainWildcarded)\n );\n }\n\n if (bareDomain === allowedHostnames.replace(/^www\\./, \"\")) {\n return true;\n }\n } catch (error) {\n // ignore\n }\n return false;\n};\n\nexport const maybeParseEmbedSrc = (str: string): string => {\n const twitterMatch = str.match(RE_TWITTER_EMBED);\n if (twitterMatch && twitterMatch.length === 2) {\n return twitterMatch[1];\n }\n\n const gistMatch = str.match(RE_GH_GIST_EMBED);\n if (gistMatch && gistMatch.length === 2) {\n return gistMatch[1];\n }\n\n if (RE_GIPHY.test(str)) {\n return `https://giphy.com/embed/${RE_GIPHY.exec(str)![1]}`;\n }\n\n const match = str.match(RE_GENERIC_EMBED);\n if (match && match.length === 2) {\n return match[1];\n }\n return str;\n};\n\nexport const embeddableURLValidator = (\n url: string | null | undefined,\n validateEmbeddable: ExcalidrawProps[\"validateEmbeddable\"],\n): boolean => {\n if (!url) {\n return false;\n }\n if (validateEmbeddable != null) {\n if (typeof validateEmbeddable === \"function\") {\n const ret = validateEmbeddable(url);\n // if return value is undefined, leave validation to default\n if (typeof ret === \"boolean\") {\n return ret;\n }\n } else if (typeof validateEmbeddable === \"boolean\") {\n return validateEmbeddable;\n } else if (validateEmbeddable instanceof RegExp) {\n return validateEmbeddable.test(url);\n } else if (Array.isArray(validateEmbeddable)) {\n for (const domain of validateEmbeddable) {\n if (domain instanceof RegExp) {\n if (url.match(domain)) {\n return true;\n }\n } else if (validateHostname(url, domain)) {\n return true;\n }\n }\n return false;\n }\n }\n\n return validateHostname(url, ALLOWED_DOMAINS);\n};\n", "import { Action } from \"./types\";\n\nexport let actions: readonly Action[] = [];\n\nexport const register = <T extends Action>(action: T) => {\n actions = actions.concat(action);\n return action as T & {\n keyTest?: unknown extends T[\"keyTest\"] ? never : T[\"keyTest\"];\n };\n};\n", "import { CURSOR_TYPE, MIME_TYPES, THEME } from \"./constants\";\nimport OpenColor from \"open-color\";\nimport { AppState, DataURL } from \"./types\";\nimport { isHandToolActive, isEraserActive } from \"./appState\";\n\nconst laserPointerCursorSVG_tag = `<svg viewBox=\"0 0 24 24\" stroke-width=\"1\" width=\"28\" height=\"28\" xmlns=\"http://www.w3.org/2000/svg\">`;\nconst laserPointerCursorBackgroundSVG = `<path d=\"M6.164 11.755a5.314 5.314 0 0 1-4.932-5.298 5.314 5.314 0 0 1 5.311-5.311 5.314 5.314 0 0 1 5.307 5.113l8.773 8.773a3.322 3.322 0 0 1 0 4.696l-.895.895a3.322 3.322 0 0 1-4.696 0l-8.868-8.868Z\" style=\"fill:#fff\"/>`;\nconst laserPointerCursorIconSVG = `<path stroke=\"#1b1b1f\" fill=\"#fff\" d=\"m7.868 11.113 7.773 7.774a2.359 2.359 0 0 0 1.667.691 2.368 2.368 0 0 0 2.357-2.358c0-.625-.248-1.225-.69-1.667L11.201 7.78 9.558 9.469l-1.69 1.643v.001Zm10.273 3.606-3.333 3.333m-3.25-6.583 2 2m-7-7 3 3M3.664 3.625l1 1M2.529 6.922l1.407-.144m5.735-2.932-1.118.866M4.285 9.823l.758-1.194m1.863-6.207-.13 1.408\"/>`;\n\nconst laserPointerCursorDataURL_lightMode = `data:${\n MIME_TYPES.svg\n},${encodeURIComponent(\n `${laserPointerCursorSVG_tag}${laserPointerCursorIconSVG}</svg>`,\n)}`;\nconst laserPointerCursorDataURL_darkMode = `data:${\n MIME_TYPES.svg\n},${encodeURIComponent(\n `${laserPointerCursorSVG_tag}${laserPointerCursorBackgroundSVG}${laserPointerCursorIconSVG}</svg>`,\n)}`;\n\nexport const resetCursor = (interactiveCanvas: HTMLCanvasElement | null) => {\n if (interactiveCanvas) {\n interactiveCanvas.style.cursor = \"\";\n }\n};\n\nexport const setCursor = (\n interactiveCanvas: HTMLCanvasElement | null,\n cursor: string,\n) => {\n if (interactiveCanvas) {\n interactiveCanvas.style.cursor = cursor;\n }\n};\n\nlet eraserCanvasCache: any;\nlet previewDataURL: string;\nexport const setEraserCursor = (\n interactiveCanvas: HTMLCanvasElement | null,\n theme: AppState[\"theme\"],\n) => {\n const cursorImageSizePx = 20;\n\n const drawCanvas = () => {\n const isDarkTheme = theme === THEME.DARK;\n eraserCanvasCache = document.createElement(\"canvas\");\n eraserCanvasCache.theme = theme;\n eraserCanvasCache.height = cursorImageSizePx;\n eraserCanvasCache.width = cursorImageSizePx;\n const context = eraserCanvasCache.getContext(\"2d\")!;\n context.lineWidth = 1;\n context.beginPath();\n context.arc(\n eraserCanvasCache.width / 2,\n eraserCanvasCache.height / 2,\n 5,\n 0,\n 2 * Math.PI,\n );\n context.fillStyle = isDarkTheme ? OpenColor.black : OpenColor.white;\n context.fill();\n context.strokeStyle = isDarkTheme ? OpenColor.white : OpenColor.black;\n context.stroke();\n previewDataURL = eraserCanvasCache.toDataURL(MIME_TYPES.svg) as DataURL;\n };\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n drawCanvas();\n }\n\n setCursor(\n interactiveCanvas,\n `url(${previewDataURL}) ${cursorImageSizePx / 2} ${\n cursorImageSizePx / 2\n }, auto`,\n );\n};\n\nexport const setCursorForShape = (\n interactiveCanvas: HTMLCanvasElement | null,\n appState: Pick<AppState, \"activeTool\" | \"theme\">,\n) => {\n if (!interactiveCanvas) {\n return;\n }\n if (appState.activeTool.type === \"selection\") {\n resetCursor(interactiveCanvas);\n } else if (isHandToolActive(appState)) {\n interactiveCanvas.style.cursor = CURSOR_TYPE.GRAB;\n } else if (isEraserActive(appState)) {\n setEraserCursor(interactiveCanvas, appState.theme);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n // Ignore custom type as well and let host decide\n } else if (appState.activeTool.type === \"laser\") {\n const url =\n appState.theme === THEME.LIGHT\n ? laserPointerCursorDataURL_lightMode\n : laserPointerCursorDataURL_darkMode;\n interactiveCanvas.style.cursor = `url(${url}), auto`;\n } else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n interactiveCanvas.style.cursor = CURSOR_TYPE.CROSSHAIR;\n } else if (appState.activeTool.type !== \"image\") {\n interactiveCanvas.style.cursor = CURSOR_TYPE.AUTO;\n }\n};\n", "import {\n ExcalidrawElement,\n ExcalidrawImageElement,\n ExcalidrawTextElement,\n ExcalidrawLinearElement,\n ExcalidrawGenericElement,\n NonDeleted,\n TextAlign,\n GroupId,\n VerticalAlign,\n Arrowhead,\n ExcalidrawFreeDrawElement,\n FontFamilyValues,\n ExcalidrawTextContainer,\n ExcalidrawFrameElement,\n ExcalidrawEmbeddableElement,\n ExcalidrawMagicFrameElement,\n ExcalidrawIframeElement,\n ElementsMap,\n} from \"./types\";\nimport {\n arrayToMap,\n getFontString,\n getUpdatedTimestamp,\n isTestEnv,\n} from \"../utils\";\nimport { randomInteger, randomId } from \"../random\";\nimport { bumpVersion, newElementWith } from \"./mutateElement\";\nimport { getNewGroupIdsForDuplication } from \"../groups\";\nimport { AppState } from \"../types\";\nimport { getElementAbsoluteCoords } from \".\";\nimport { adjustXYWithRotation } from \"../math\";\nimport { getResizedElementAbsoluteCoords } from \"./bounds\";\nimport {\n measureText,\n normalizeText,\n wrapText,\n getBoundTextMaxWidth,\n getDefaultLineHeight,\n} from \"./textElement\";\nimport {\n DEFAULT_ELEMENT_PROPS,\n DEFAULT_FONT_FAMILY,\n DEFAULT_FONT_SIZE,\n DEFAULT_TEXT_ALIGN,\n DEFAULT_VERTICAL_ALIGN,\n VERTICAL_ALIGN,\n} from \"../constants\";\nimport { MarkOptional, Merge, Mutable } from \"../utility-types\";\n\nexport type ElementConstructorOpts = MarkOptional<\n Omit<ExcalidrawGenericElement, \"id\" | \"type\" | \"isDeleted\" | \"updated\">,\n | \"width\"\n | \"height\"\n | \"angle\"\n | \"groupIds\"\n | \"frameId\"\n | \"boundElements\"\n | \"seed\"\n | \"version\"\n | \"versionNonce\"\n | \"link\"\n | \"strokeStyle\"\n | \"fillStyle\"\n | \"strokeColor\"\n | \"backgroundColor\"\n | \"roughness\"\n | \"strokeWidth\"\n | \"roundness\"\n | \"locked\"\n | \"opacity\"\n | \"customData\"\n>;\n\nconst _newElementBase = <T extends ExcalidrawElement>(\n type: T[\"type\"],\n {\n x,\n y,\n strokeColor = DEFAULT_ELEMENT_PROPS.strokeColor,\n backgroundColor = DEFAULT_ELEMENT_PROPS.backgroundColor,\n fillStyle = DEFAULT_ELEMENT_PROPS.fillStyle,\n strokeWidth = DEFAULT_ELEMENT_PROPS.strokeWidth,\n strokeStyle = DEFAULT_ELEMENT_PROPS.strokeStyle,\n roughness = DEFAULT_ELEMENT_PROPS.roughness,\n opacity = DEFAULT_ELEMENT_PROPS.opacity,\n width = 0,\n height = 0,\n angle = 0,\n groupIds = [],\n frameId = null,\n roundness = null,\n boundElements = null,\n link = null,\n locked = DEFAULT_ELEMENT_PROPS.locked,\n ...rest\n }: ElementConstructorOpts & Omit<Partial<ExcalidrawGenericElement>, \"type\">,\n) => {\n // assign type to guard against excess properties\n const element: Merge<ExcalidrawGenericElement, { type: T[\"type\"] }> = {\n id: rest.id || randomId(),\n type,\n x,\n y,\n width,\n height,\n angle,\n strokeColor,\n backgroundColor,\n fillStyle,\n strokeWidth,\n strokeStyle,\n roughness,\n opacity,\n groupIds,\n frameId,\n roundness,\n seed: rest.seed ?? randomInteger(),\n version: rest.version || 1,\n versionNonce: rest.versionNonce ?? 0,\n isDeleted: false as false,\n boundElements,\n updated: getUpdatedTimestamp(),\n link,\n locked,\n customData: rest.customData,\n };\n return element;\n};\n\nexport const newElement = (\n opts: {\n type: ExcalidrawGenericElement[\"type\"];\n } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawGenericElement> =>\n _newElementBase<ExcalidrawGenericElement>(opts.type, opts);\n\nexport const newEmbeddableElement = (\n opts: {\n type: \"embeddable\";\n } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawEmbeddableElement> => {\n return _newElementBase<ExcalidrawEmbeddableElement>(\"embeddable\", opts);\n};\n\nexport const newIframeElement = (\n opts: {\n type: \"iframe\";\n } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawIframeElement> => {\n return {\n ..._newElementBase<ExcalidrawIframeElement>(\"iframe\", opts),\n };\n};\n\nexport const newFrameElement = (\n opts: {\n name?: string;\n } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawFrameElement> => {\n const frameElement = newElementWith(\n {\n ..._newElementBase<ExcalidrawFrameElement>(\"frame\", opts),\n type: \"frame\",\n name: opts?.name || null,\n },\n {},\n );\n\n return frameElement;\n};\n\nexport const newMagicFrameElement = (\n opts: {\n name?: string;\n } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawMagicFrameElement> => {\n const frameElement = newElementWith(\n {\n ..._newElementBase<ExcalidrawMagicFrameElement>(\"magicframe\", opts),\n type: \"magicframe\",\n name: opts?.name || null,\n },\n {},\n );\n\n return frameElement;\n};\n\n/** computes element x/y offset based on textAlign/verticalAlign */\nconst getTextElementPositionOffsets = (\n opts: {\n textAlign: ExcalidrawTextElement[\"textAlign\"];\n verticalAlign: ExcalidrawTextElement[\"verticalAlign\"];\n },\n metrics: {\n width: number;\n height: number;\n },\n) => {\n return {\n x:\n opts.textAlign === \"center\"\n ? metrics.width / 2\n : opts.textAlign === \"right\"\n ? metrics.width\n : 0,\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0,\n };\n};\n\nexport const newTextElement = (\n opts: {\n text: string;\n fontSize?: number;\n fontFamily?: FontFamilyValues;\n textAlign?: TextAlign;\n verticalAlign?: VerticalAlign;\n containerId?: ExcalidrawTextContainer[\"id\"] | null;\n lineHeight?: ExcalidrawTextElement[\"lineHeight\"];\n strokeWidth?: ExcalidrawTextElement[\"strokeWidth\"];\n } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawTextElement> => {\n const fontFamily = opts.fontFamily || DEFAULT_FONT_FAMILY;\n const fontSize = opts.fontSize || DEFAULT_FONT_SIZE;\n const lineHeight = opts.lineHeight || getDefaultLineHeight(fontFamily);\n const text = normalizeText(opts.text);\n const metrics = measureText(\n text,\n getFontString({ fontFamily, fontSize }),\n lineHeight,\n );\n const textAlign = opts.textAlign || DEFAULT_TEXT_ALIGN;\n const verticalAlign = opts.verticalAlign || DEFAULT_VERTICAL_ALIGN;\n const offsets = getTextElementPositionOffsets(\n { textAlign, verticalAlign },\n metrics,\n );\n\n const textElement = newElementWith(\n {\n ..._newElementBase<ExcalidrawTextElement>(\"text\", opts),\n text,\n fontSize,\n fontFamily,\n textAlign,\n verticalAlign,\n x: opts.x - offsets.x,\n y: opts.y - offsets.y,\n width: metrics.width,\n height: metrics.height,\n containerId: opts.containerId || null,\n originalText: text,\n lineHeight,\n },\n {},\n );\n return textElement;\n};\n\nconst getAdjustedDimensions = (\n element: ExcalidrawTextElement,\n elementsMap: ElementsMap,\n nextText: string,\n): {\n x: number;\n y: number;\n width: number;\n height: number;\n} => {\n const { width: nextWidth, height: nextHeight } = measureText(\n nextText,\n getFontString(element),\n element.lineHeight,\n );\n const { textAlign, verticalAlign } = element;\n let x: number;\n let y: number;\n if (\n textAlign === \"center\" &&\n verticalAlign === VERTICAL_ALIGN.MIDDLE &&\n !element.containerId\n ) {\n const prevMetrics = measureText(\n element.text,\n getFontString(element),\n element.lineHeight,\n );\n const offsets = getTextElementPositionOffsets(element, {\n width: nextWidth - prevMetrics.width,\n height: nextHeight - prevMetrics.height,\n });\n\n x = element.x - offsets.x;\n y = element.y - offsets.y;\n } else {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n\n const [nextX1, nextY1, nextX2, nextY2] = getResizedElementAbsoluteCoords(\n element,\n nextWidth,\n nextHeight,\n false,\n );\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n\n [x, y] = adjustXYWithRotation(\n {\n s: true,\n e: textAlign === \"center\" || textAlign === \"left\",\n w: textAlign === \"center\" || textAlign === \"right\",\n },\n element.x,\n element.y,\n element.angle,\n deltaX1,\n deltaY1,\n deltaX2,\n deltaY2,\n );\n }\n\n return {\n width: nextWidth,\n height: nextHeight,\n x: Number.isFinite(x) ? x : element.x,\n y: Number.isFinite(y) ? y : element.y,\n };\n};\n\nexport const refreshTextDimensions = (\n textElement: ExcalidrawTextElement,\n container: ExcalidrawTextContainer | null,\n elementsMap: ElementsMap,\n text = textElement.text,\n) => {\n if (textElement.isDeleted) {\n return;\n }\n if (container) {\n text = wrapText(\n text,\n getFontString(textElement),\n getBoundTextMaxWidth(container, textElement),\n );\n }\n const dimensions = getAdjustedDimensions(textElement, elementsMap, text);\n return { text, ...dimensions };\n};\n\nexport const updateTextElement = (\n textElement: ExcalidrawTextElement,\n container: ExcalidrawTextContainer | null,\n elementsMap: ElementsMap,\n {\n text,\n isDeleted,\n originalText,\n }: {\n text: string;\n isDeleted?: boolean;\n originalText: string;\n },\n): ExcalidrawTextElement => {\n return newElementWith(textElement, {\n originalText,\n isDeleted: isDeleted ?? textElement.isDeleted,\n ...refreshTextDimensions(textElement, container, elementsMap, originalText),\n });\n};\n\nexport const newFreeDrawElement = (\n opts: {\n type: \"freedraw\";\n points?: ExcalidrawFreeDrawElement[\"points\"];\n simulatePressure: boolean;\n } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawFreeDrawElement> => {\n return {\n ..._newElementBase<ExcalidrawFreeDrawElement>(opts.type, opts),\n points: opts.points || [],\n pressures: [],\n simulatePressure: opts.simulatePressure,\n lastCommittedPoint: null,\n };\n};\n\nexport const newLinearElement = (\n opts: {\n type: ExcalidrawLinearElement[\"type\"];\n startArrowhead?: Arrowhead | null;\n endArrowhead?: Arrowhead | null;\n points?: ExcalidrawLinearElement[\"points\"];\n } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawLinearElement> => {\n return {\n ..._newElementBase<ExcalidrawLinearElement>(opts.type, opts),\n points: opts.points || [],\n lastCommittedPoint: null,\n startBinding: null,\n endBinding: null,\n startArrowhead: opts.startArrowhead || null,\n endArrowhead: opts.endArrowhead || null,\n };\n};\n\nexport const newImageElement = (\n opts: {\n type: ExcalidrawImageElement[\"type\"];\n status?: ExcalidrawImageElement[\"status\"];\n fileId?: ExcalidrawImageElement[\"fileId\"];\n scale?: ExcalidrawImageElement[\"scale\"];\n } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawImageElement> => {\n return {\n ..._newElementBase<ExcalidrawImageElement>(\"image\", opts),\n // in the future we'll support changing stroke color for some SVG elements,\n // and `transparent` will likely mean \"use original colors of the image\"\n strokeColor: \"transparent\",\n status: opts.status ?? \"pending\",\n fileId: opts.fileId ?? null,\n scale: opts.scale ?? [1, 1],\n };\n};\n\n// Simplified deep clone for the purpose of cloning ExcalidrawElement.\n//\n// Only clones plain objects and arrays. Doesn't clone Date, RegExp, Map, Set,\n// Typed arrays and other non-null objects.\n//\n// Adapted from https://github.com/lukeed/klona\n//\n// The reason for `deepCopyElement()` wrapper is type safety (only allow\n// passing ExcalidrawElement as the top-level argument).\nconst _deepCopyElement = (val: any, depth: number = 0) => {\n // only clone non-primitives\n if (val == null || typeof val !== \"object\") {\n return val;\n }\n\n const objectType = Object.prototype.toString.call(val);\n\n if (objectType === \"[object Object]\") {\n const tmp =\n typeof val.constructor === \"function\"\n ? Object.create(Object.getPrototypeOf(val))\n : {};\n for (const key in val) {\n if (val.hasOwnProperty(key)) {\n // don't copy non-serializable objects like these caches. They'll be\n // populated when the element is rendered.\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\n continue;\n }\n tmp[key] = _deepCopyElement(val[key], depth + 1);\n }\n }\n return tmp;\n }\n\n if (Array.isArray(val)) {\n let k = val.length;\n const arr = new Array(k);\n while (k--) {\n arr[k] = _deepCopyElement(val[k], depth + 1);\n }\n return arr;\n }\n\n // we're not cloning non-array & non-plain-object objects because we\n // don't support them on excalidraw elements yet. If we do, we need to make\n // sure we start cloning them, so let's warn about it.\n if (import.meta.env.DEV) {\n if (\n objectType !== \"[object Object]\" &&\n objectType !== \"[object Array]\" &&\n objectType.startsWith(\"[object \")\n ) {\n console.warn(\n `_deepCloneElement: unexpected object type ${objectType}. This value will not be cloned!`,\n );\n }\n }\n\n return val;\n};\n\n/**\n * Clones ExcalidrawElement data structure. Does not regenerate id, nonce, or\n * any value. The purpose is to to break object references for immutability\n * reasons, whenever we want to keep the original element, but ensure it's not\n * mutated.\n *\n * Only clones plain objects and arrays. Doesn't clone Date, RegExp, Map, Set,\n * Typed arrays and other non-null objects.\n */\nexport const deepCopyElement = <T extends ExcalidrawElement>(\n val: T,\n): Mutable<T> => {\n return _deepCopyElement(val);\n};\n\n/**\n * utility wrapper to generate new id. In test env it reuses the old + postfix\n * for test assertions.\n */\nexport const regenerateId = (\n /** supply null if no previous id exists */\n previousId: string | null,\n) => {\n if (isTestEnv() && previousId) {\n let nextId = `${previousId}_copy`;\n // `window.h` may not be defined in some unit tests\n if (\n window.h?.app\n ?.getSceneElementsIncludingDeleted()\n .find((el) => el.id === nextId)\n ) {\n nextId += \"_copy\";\n }\n return nextId;\n }\n return randomId();\n};\n\n/**\n * Duplicate an element, often used in the alt-drag operation.\n * Note that this method has gotten a bit complicated since the\n * introduction of gruoping/ungrouping elements.\n * @param editingGroupId The current group being edited. The new\n * element will inherit this group and its\n * parents.\n * @param groupIdMapForOperation A Map that maps old group IDs to\n * duplicated ones. If you are duplicating\n * multiple elements at once, share this map\n * amongst all of them\n * @param element Element to duplicate\n * @param overrides Any element properties to override\n */\nexport const duplicateElement = <TElement extends ExcalidrawElement>(\n editingGroupId: AppState[\"editingGroupId\"],\n groupIdMapForOperation: Map<GroupId, GroupId>,\n element: TElement,\n overrides?: Partial<TElement>,\n): Readonly<TElement> => {\n let copy = deepCopyElement(element);\n\n copy.id = regenerateId(copy.id);\n copy.boundElements = null;\n copy.updated = getUpdatedTimestamp();\n copy.seed = randomInteger();\n copy.groupIds = getNewGroupIdsForDuplication(\n copy.groupIds,\n editingGroupId,\n (groupId) => {\n if (!groupIdMapForOperation.has(groupId)) {\n groupIdMapForOperation.set(groupId, regenerateId(groupId));\n }\n return groupIdMapForOperation.get(groupId)!;\n },\n );\n if (overrides) {\n copy = Object.assign(copy, overrides);\n }\n return copy;\n};\n\n/**\n * Clones elements, regenerating their ids (including bindings) and group ids.\n *\n * If bindings don't exist in the elements array, they are removed. Therefore,\n * it's advised to supply the whole elements array, or sets of elements that\n * are encapsulated (such as library items), if the purpose is to retain\n * bindings to the cloned elements intact.\n *\n * NOTE by default does not randomize or regenerate anything except the id.\n */\nexport const duplicateElements = (\n elements: readonly ExcalidrawElement[],\n opts?: {\n /** NOTE also updates version flags and `updated` */\n randomizeSeed: boolean;\n },\n) => {\n const clonedElements: ExcalidrawElement[] = [];\n\n const origElementsMap = arrayToMap(elements);\n\n // used for for migrating old ids to new ids\n const elementNewIdsMap = new Map<\n /* orig */ ExcalidrawElement[\"id\"],\n /* new */ ExcalidrawElement[\"id\"]\n >();\n\n const maybeGetNewId = (id: ExcalidrawElement[\"id\"]) => {\n // if we've already migrated the element id, return the new one directly\n if (elementNewIdsMap.has(id)) {\n return elementNewIdsMap.get(id)!;\n }\n // if we haven't migrated the element id, but an old element with the same\n // id exists, generate a new id for it and return it\n if (origElementsMap.has(id)) {\n const newId = regenerateId(id);\n elementNewIdsMap.set(id, newId);\n return newId;\n }\n // if old element doesn't exist, return null to mark it for removal\n return null;\n };\n\n const groupNewIdsMap = new Map</* orig */ GroupId, /* new */ GroupId>();\n\n for (const element of elements) {\n const clonedElement: Mutable<ExcalidrawElement> = _deepCopyElement(element);\n\n clonedElement.id = maybeGetNewId(element.id)!;\n\n if (opts?.randomizeSeed) {\n clonedElement.seed = randomInteger();\n bumpVersion(clonedElement);\n }\n\n if (clonedElement.groupIds) {\n clonedElement.groupIds = clonedElement.groupIds.map((groupId) => {\n if (!groupNewIdsMap.has(groupId)) {\n groupNewIdsMap.set(groupId, regenerateId(groupId));\n }\n return groupNewIdsMap.get(groupId)!;\n });\n }\n\n if (\"containerId\" in clonedElement && clonedElement.containerId) {\n const newContainerId = maybeGetNewId(clonedElement.containerId);\n clonedElement.containerId = newContainerId;\n }\n\n if (\"boundElements\" in clonedElement && clonedElement.boundElements) {\n clonedElement.boundElements = clonedElement.boundElements.reduce(\n (\n acc: Mutable<NonNullable<ExcalidrawElement[\"boundElements\"]>>,\n binding,\n ) => {\n const newBindingId = maybeGetNewId(binding.id);\n if (newBindingId) {\n acc.push({ ...binding, id: newBindingId });\n }\n return acc;\n },\n [],\n );\n }\n\n if (\"endBinding\" in clonedElement && clonedElement.endBinding) {\n const newEndBindingId = maybeGetNewId(clonedElement.endBinding.elementId);\n clonedElement.endBinding = newEndBindingId\n ? {\n ...clonedElement.endBinding,\n elementId: newEndBindingId,\n }\n : null;\n }\n if (\"startBinding\" in clonedElement && clonedElement.startBinding) {\n const newEndBindingId = maybeGetNewId(\n clonedElement.startBinding.elementId,\n );\n clonedElement.startBinding = newEndBindingId\n ? {\n ...clonedElement.startBinding,\n elementId: newEndBindingId,\n }\n : null;\n }\n\n if (clonedElement.frameId) {\n clonedElement.frameId = maybeGetNewId(clonedElement.frameId);\n }\n\n clonedElements.push(clonedElement);\n }\n\n return clonedElements;\n};\n", "import { Random } from \"roughjs/bin/math\";\nimport { nanoid } from \"nanoid\";\nimport { isTestEnv } from \"./utils\";\n\nlet random = new Random(Date.now());\nlet testIdBase = 0;\n\nexport const randomInteger = () => Math.floor(random.next() * 2 ** 31);\n\nexport const reseed = (seed: number) => {\n random = new Random(seed);\n testIdBase = 0;\n};\n\nexport const randomId = () => (isTestEnv() ? `id${testIdBase++}` : nanoid());\n", "import { fileOpen, fileSave } from \"./filesystem\";\nimport { cleanAppStateForExport, clearAppStateForDatabase } from \"../appState\";\nimport {\n DEFAULT_FILENAME,\n EXPORT_DATA_TYPES,\n EXPORT_SOURCE,\n MIME_TYPES,\n VERSIONS,\n} from \"../constants\";\nimport { clearElementsForDatabase, clearElementsForExport } from \"../element\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { AppState, BinaryFiles, LibraryItems } from \"../types\";\nimport { isImageFileHandle, loadFromBlob, normalizeFile } from \"./blob\";\n\nimport {\n ExportedDataState,\n ImportedDataState,\n ExportedLibraryData,\n ImportedLibraryData,\n} from \"./types\";\n\n/**\n * Strips out files which are only referenced by deleted elements\n */\nconst filterOutDeletedFiles = (\n elements: readonly ExcalidrawElement[],\n files: BinaryFiles,\n) => {\n const nextFiles: BinaryFiles = {};\n for (const element of elements) {\n if (\n !element.isDeleted &&\n \"fileId\" in element &&\n element.fileId &&\n files[element.fileId]\n ) {\n nextFiles[element.fileId] = files[element.fileId];\n }\n }\n return nextFiles;\n};\n\nexport const serializeAsJSON = (\n elements: readonly ExcalidrawElement[],\n appState: Partial<AppState>,\n files: BinaryFiles,\n type: \"local\" | \"database\",\n): string => {\n const data: ExportedDataState = {\n type: EXPORT_DATA_TYPES.excalidraw,\n version: VERSIONS.excalidraw,\n source: EXPORT_SOURCE,\n elements:\n type === \"local\"\n ? clearElementsForExport(elements)\n : clearElementsForDatabase(elements),\n appState:\n type === \"local\"\n ? cleanAppStateForExport(appState)\n : clearAppStateForDatabase(appState),\n files:\n type === \"local\"\n ? filterOutDeletedFiles(elements, files)\n : // will be stripped from JSON\n undefined,\n };\n\n return JSON.stringify(data, null, 2);\n};\n\nexport const saveAsJSON = async (\n elements: readonly ExcalidrawElement[],\n appState: AppState,\n files: BinaryFiles,\n /** filename */\n name: string = appState.name || DEFAULT_FILENAME,\n) => {\n const serialized = serializeAsJSON(elements, appState, files, \"local\");\n const blob = new Blob([serialized], {\n type: MIME_TYPES.excalidraw,\n });\n\n const fileHandle = await fileSave(blob, {\n name,\n extension: \"excalidraw\",\n description: \"Excalidraw file\",\n fileHandle: isImageFileHandle(appState.fileHandle)\n ? null\n : appState.fileHandle,\n });\n return { fileHandle };\n};\n\nexport const loadFromJSON = async (\n localAppState: AppState,\n localElements: readonly ExcalidrawElement[] | null,\n) => {\n const file = await fileOpen({\n description: \"Excalidraw files\",\n // ToDo: Be over-permissive until https://bugs.webkit.org/show_bug.cgi?id=34442\n // gets resolved. Else, iOS users cannot open `.excalidraw` files.\n // extensions: [\"json\", \"excalidraw\", \"png\", \"svg\"],\n });\n return loadFromBlob(\n await normalizeFile(file),\n localAppState,\n localElements,\n file.handle,\n );\n};\n\nexport const isValidExcalidrawData = (data?: {\n type?: any;\n elements?: any;\n appState?: any;\n}): data is ImportedDataState => {\n return (\n data?.type === EXPORT_DATA_TYPES.excalidraw &&\n (!data.elements ||\n (Array.isArray(data.elements) &&\n (!data.appState || typeof data.appState === \"object\")))\n );\n};\n\nexport const isValidLibrary = (json: any): json is ImportedLibraryData => {\n return (\n typeof json === \"object\" &&\n json &&\n json.type === EXPORT_DATA_TYPES.excalidrawLibrary &&\n (json.version === 1 || json.version === 2)\n );\n};\n\nexport const serializeLibraryAsJSON = (libraryItems: LibraryItems) => {\n const data: ExportedLibraryData = {\n type: EXPORT_DATA_TYPES.excalidrawLibrary,\n version: VERSIONS.excalidrawLibrary,\n source: EXPORT_SOURCE,\n libraryItems,\n };\n return JSON.stringify(data, null, 2);\n};\n\nexport const saveLibraryAsJSON = async (libraryItems: LibraryItems) => {\n const serialized = serializeLibraryAsJSON(libraryItems);\n await fileSave(\n new Blob([serialized], {\n type: MIME_TYPES.excalidrawlib,\n }),\n {\n name: \"library\",\n extension: \"excalidrawlib\",\n description: \"Excalidraw library file\",\n },\n );\n};\n", "import {\n fileOpen as _fileOpen,\n fileSave as _fileSave,\n FileSystemHandle,\n supported as nativeFileSystemSupported,\n} from \"browser-fs-access\";\nimport { EVENT, MIME_TYPES } from \"../constants\";\nimport { AbortError } from \"../errors\";\nimport { debounce } from \"../utils\";\n\ntype FILE_EXTENSION = Exclude<keyof typeof MIME_TYPES, \"binary\">;\n\nconst INPUT_CHANGE_INTERVAL_MS = 500;\n\nexport const fileOpen = <M extends boolean | undefined = false>(opts: {\n extensions?: FILE_EXTENSION[];\n description: string;\n multiple?: M;\n}): Promise<M extends false | undefined ? File : File[]> => {\n // an unsafe TS hack, alas not much we can do AFAIK\n type RetType = M extends false | undefined ? File : File[];\n\n const mimeTypes = opts.extensions?.reduce((mimeTypes, type) => {\n mimeTypes.push(MIME_TYPES[type]);\n\n return mimeTypes;\n }, [] as string[]);\n\n const extensions = opts.extensions?.reduce((acc, ext) => {\n if (ext === \"jpg\") {\n return acc.concat(\".jpg\", \".jpeg\");\n }\n return acc.concat(`.${ext}`);\n }, [] as string[]);\n\n return _fileOpen({\n description: opts.description,\n extensions,\n mimeTypes,\n multiple: opts.multiple ?? false,\n legacySetup: (resolve, reject, input) => {\n const scheduleRejection = debounce(reject, INPUT_CHANGE_INTERVAL_MS);\n const focusHandler = () => {\n checkForFile();\n document.addEventListener(EVENT.KEYUP, scheduleRejection);\n document.addEventListener(EVENT.POINTER_UP, scheduleRejection);\n scheduleRejection();\n };\n const checkForFile = () => {\n // this hack might not work when expecting multiple files\n if (input.files?.length) {\n const ret = opts.multiple ? [...input.files] : input.files[0];\n resolve(ret as RetType);\n }\n };\n requestAnimationFrame(() => {\n window.addEventListener(EVENT.FOCUS, focusHandler);\n });\n const interval = window.setInterval(() => {\n checkForFile();\n }, INPUT_CHANGE_INTERVAL_MS);\n return (rejectPromise) => {\n clearInterval(interval);\n scheduleRejection.cancel();\n window.removeEventListener(EVENT.FOCUS, focusHandler);\n document.removeEventListener(EVENT.KEYUP, scheduleRejection);\n document.removeEventListener(EVENT.POINTER_UP, scheduleRejection);\n if (rejectPromise) {\n // so that something is shown in console if we need to debug this\n console.warn(\"Opening the file was canceled (legacy-fs).\");\n rejectPromise(new AbortError());\n }\n };\n },\n }) as Promise<RetType>;\n};\n\nexport const fileSave = (\n blob: Blob | Promise<Blob>,\n opts: {\n /** supply without the extension */\n name: string;\n /** file extension */\n extension: FILE_EXTENSION;\n description: string;\n /** existing FileSystemHandle */\n fileHandle?: FileSystemHandle | null;\n },\n) => {\n return _fileSave(\n blob,\n {\n fileName: `${opts.name}.${opts.extension}`,\n description: opts.description,\n extensions: [`.${opts.extension}`],\n },\n opts.fileHandle,\n );\n};\n\nexport type { FileSystemHandle };\nexport { nativeFileSystemSupported };\n", "const e=(()=>{if(\"undefined\"==typeof self)return!1;if(\"top\"in self&&self!==top)try{top}catch(e){return!1}else if(\"showOpenFilePicker\"in self)return\"showOpenFilePicker\";return!1})(),t=e?import(\"./file-open-002ab408.js\"):import(\"./file-open-7c801643.js\");async function n(...e){return(await t).default(...e)}const i=e?import(\"./directory-open-4ed118d0.js\"):import(\"./directory-open-01563666.js\");async function r(...e){return(await i).default(...e)}const o=e?import(\"./file-save-745eba88.js\"):import(\"./file-save-3189631c.js\");async function s(...e){return(await o).default(...e)}export{r as directoryOpen,n as fileOpen,s as fileSave,e as supported};\n", "type CANVAS_ERROR_NAMES = \"CANVAS_ERROR\" | \"CANVAS_POSSIBLY_TOO_BIG\";\n\nexport class CanvasError extends Error {\n constructor(\n message: string = \"Couldn't export canvas.\",\n name: CANVAS_ERROR_NAMES = \"CANVAS_ERROR\",\n ) {\n super();\n this.name = name;\n this.message = message;\n }\n}\n\nexport class AbortError extends DOMException {\n constructor(message: string = \"Request Aborted\") {\n super(message, \"AbortError\");\n }\n}\n\ntype ImageSceneDataErrorCode =\n | \"IMAGE_NOT_CONTAINS_SCENE_DATA\"\n | \"IMAGE_SCENE_DATA_ERROR\";\n\nexport class ImageSceneDataError extends Error {\n public code;\n constructor(\n message = \"Image Scene Data Error\",\n code: ImageSceneDataErrorCode = \"IMAGE_SCENE_DATA_ERROR\",\n ) {\n super(message);\n this.name = \"EncodingError\";\n this.code = code;\n }\n}\n", "// -----------------------------------------------------------------------------\n// ExcalidrawImageElement & related helpers\n// -----------------------------------------------------------------------------\n\nimport { MIME_TYPES, SVG_NS } from \"../constants\";\nimport { AppClassProperties, DataURL, BinaryFiles } from \"../types\";\nimport { isInitializedImageElement } from \"./typeChecks\";\nimport {\n ExcalidrawElement,\n FileId,\n InitializedExcalidrawImageElement,\n} from \"./types\";\n\nexport const loadHTMLImageElement = (dataURL: DataURL) => {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n image.onload = () => {\n resolve(image);\n };\n image.onerror = (error) => {\n reject(error);\n };\n image.src = dataURL;\n });\n};\n\n/** NOTE: updates cache even if already populated with given image. Thus,\n * you should filter out the images upstream if you want to optimize this. */\nexport const updateImageCache = async ({\n fileIds,\n files,\n imageCache,\n}: {\n fileIds: FileId[];\n files: BinaryFiles;\n imageCache: AppClassProperties[\"imageCache\"];\n}) => {\n const updatedFiles = new Map<FileId, true>();\n const erroredFiles = new Map<FileId, true>();\n\n await Promise.all(\n fileIds.reduce((promises, fileId) => {\n const fileData = files[fileId as string];\n if (fileData && !updatedFiles.has(fileId)) {\n updatedFiles.set(fileId, true);\n return promises.concat(\n (async () => {\n try {\n if (fileData.mimeType === MIME_TYPES.binary) {\n throw new Error(\"Only images can be added to ImageCache\");\n }\n\n const imagePromise = loadHTMLImageElement(fileData.dataURL);\n const data = {\n image: imagePromise,\n mimeType: fileData.mimeType,\n } as const;\n // store the promise immediately to indicate there's an in-progress\n // initialization\n imageCache.set(fileId, data);\n\n const image = await imagePromise;\n\n imageCache.set(fileId, { ...data, image });\n } catch (error: any) {\n erroredFiles.set(fileId, true);\n }\n })(),\n );\n }\n return promises;\n }, [] as Promise<any>[]),\n );\n\n return {\n imageCache,\n /** includes errored files because they cache was updated nonetheless */\n updatedFiles,\n /** files that failed when creating HTMLImageElement */\n erroredFiles,\n };\n};\n\nexport const getInitializedImageElements = (\n elements: readonly ExcalidrawElement[],\n) =>\n elements.filter((element) =>\n isInitializedImageElement(element),\n ) as InitializedExcalidrawImageElement[];\n\nexport const isHTMLSVGElement = (node: Node | null): node is SVGElement => {\n // lower-casing due to XML/HTML convention differences\n // https://johnresig.com/blog/nodename-case-sensitivity\n return node?.nodeName.toLowerCase() === \"svg\";\n};\n\nexport const normalizeSVG = async (SVGString: string) => {\n const doc = new DOMParser().parseFromString(SVGString, MIME_TYPES.svg);\n const svg = doc.querySelector(\"svg\");\n const errorNode = doc.querySelector(\"parsererror\");\n if (errorNode || !isHTMLSVGElement(svg)) {\n throw new Error(\"Invalid SVG\");\n } else {\n if (!svg.hasAttribute(\"xmlns\")) {\n svg.setAttribute(\"xmlns\", SVG_NS);\n }\n\n if (!svg.hasAttribute(\"width\") || !svg.hasAttribute(\"height\")) {\n const viewBox = svg.getAttribute(\"viewBox\");\n let width = svg.getAttribute(\"width\") || \"50\";\n let height = svg.getAttribute(\"height\") || \"50\";\n if (viewBox) {\n const match = viewBox.match(/\\d+ +\\d+ +(\\d+) +(\\d+)/);\n if (match) {\n [, width, height] = match;\n }\n }\n svg.setAttribute(\"width\", width);\n svg.setAttribute(\"height\", height);\n }\n\n return svg.outerHTML;\n }\n};\n", "import { FRAME_STYLE } from \"../constants\";\nimport { getElementAbsoluteCoords } from \"../element\";\n\nimport {\n elementOverlapsWithFrame,\n getTargetFrame,\n isElementInFrame,\n} from \"../frame\";\nimport {\n isEmbeddableElement,\n isIframeLikeElement,\n} from \"../element/typeChecks\";\nimport { renderElement } from \"../renderer/renderElement\";\nimport { createPlaceholderEmbeddableLabel } from \"../element/embeddable\";\nimport { StaticCanvasAppState, Zoom } from \"../types\";\nimport {\n ElementsMap,\n ExcalidrawFrameLikeElement,\n NonDeletedExcalidrawElement,\n} from \"../element/types\";\nimport {\n StaticCanvasRenderConfig,\n StaticSceneRenderConfig,\n} from \"../scene/types\";\nimport {\n EXTERNAL_LINK_IMG,\n getLinkHandleFromCoords,\n} from \"../components/hyperlink/helpers\";\nimport { bootstrapCanvas, getNormalizedCanvasDimensions } from \"./helpers\";\nimport { throttleRAF } from \"../utils\";\n\nconst strokeGrid = (\n context: CanvasRenderingContext2D,\n gridSize: number,\n scrollX: number,\n scrollY: number,\n zoom: Zoom,\n width: number,\n height: number,\n) => {\n const BOLD_LINE_FREQUENCY = 5;\n\n enum GridLineColor {\n Bold = \"#cccccc\",\n Regular = \"#e5e5e5\",\n }\n\n const offsetX =\n -Math.round(zoom.value / gridSize) * gridSize + (scrollX % gridSize);\n const offsetY =\n -Math.round(zoom.value / gridSize) * gridSize + (scrollY % gridSize);\n\n const lineWidth = Math.min(1 / zoom.value, 1);\n\n const spaceWidth = 1 / zoom.value;\n const lineDash = [lineWidth * 3, spaceWidth + (lineWidth + spaceWidth)];\n\n context.save();\n context.lineWidth = lineWidth;\n\n for (let x = offsetX; x < offsetX + width + gridSize * 2; x += gridSize) {\n const isBold =\n Math.round(x - scrollX) % (BOLD_LINE_FREQUENCY * gridSize) === 0;\n context.beginPath();\n context.setLineDash(isBold ? [] : lineDash);\n context.strokeStyle = isBold ? GridLineColor.Bold : GridLineColor.Regular;\n context.moveTo(x, offsetY - gridSize);\n context.lineTo(x, offsetY + height + gridSize * 2);\n context.stroke();\n }\n for (let y = offsetY; y < offsetY + height + gridSize * 2; y += gridSize) {\n const isBold =\n Math.round(y - scrollY) % (BOLD_LINE_FREQUENCY * gridSize) === 0;\n context.beginPath();\n context.setLineDash(isBold ? [] : lineDash);\n context.strokeStyle = isBold ? GridLineColor.Bold : GridLineColor.Regular;\n context.moveTo(offsetX - gridSize, y);\n context.lineTo(offsetX + width + gridSize * 2, y);\n context.stroke();\n }\n context.restore();\n};\n\nconst frameClip = (\n frame: ExcalidrawFrameLikeElement,\n context: CanvasRenderingContext2D,\n renderConfig: StaticCanvasRenderConfig,\n appState: StaticCanvasAppState,\n) => {\n context.translate(frame.x + appState.scrollX, frame.y + appState.scrollY);\n context.beginPath();\n if (context.roundRect) {\n context.roundRect(\n 0,\n 0,\n frame.width,\n frame.height,\n FRAME_STYLE.radius / appState.zoom.value,\n );\n } else {\n context.rect(0, 0, frame.width, frame.height);\n }\n context.clip();\n context.translate(\n -(frame.x + appState.scrollX),\n -(frame.y + appState.scrollY),\n );\n};\n\nlet linkCanvasCache: any;\nconst renderLinkIcon = (\n element: NonDeletedExcalidrawElement,\n context: CanvasRenderingContext2D,\n appState: StaticCanvasAppState,\n elementsMap: ElementsMap,\n) => {\n if (element.link && !appState.selectedElementIds[element.id]) {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const [x, y, width, height] = getLinkHandleFromCoords(\n [x1, y1, x2, y2],\n element.angle,\n appState,\n );\n const centerX = x + width / 2;\n const centerY = y + height / 2;\n context.save();\n context.translate(appState.scrollX + centerX, appState.scrollY + centerY);\n context.rotate(element.angle);\n\n if (!linkCanvasCache || linkCanvasCache.zoom !== appState.zoom.value) {\n linkCanvasCache = document.createElement(\"canvas\");\n linkCanvasCache.zoom = appState.zoom.value;\n linkCanvasCache.width =\n width * window.devicePixelRatio * appState.zoom.value;\n linkCanvasCache.height =\n height * window.devicePixelRatio * appState.zoom.value;\n const linkCanvasCacheContext = linkCanvasCache.getContext(\"2d\")!;\n linkCanvasCacheContext.scale(\n window.devicePixelRatio * appState.zoom.value,\n window.devicePixelRatio * appState.zoom.value,\n );\n linkCanvasCacheContext.fillStyle = \"#fff\";\n linkCanvasCacheContext.fillRect(0, 0, width, height);\n linkCanvasCacheContext.drawImage(EXTERNAL_LINK_IMG, 0, 0, width, height);\n linkCanvasCacheContext.restore();\n context.drawImage(\n linkCanvasCache,\n x - centerX,\n y - centerY,\n width,\n height,\n );\n } else {\n context.drawImage(\n linkCanvasCache,\n x - centerX,\n y - centerY,\n width,\n height,\n );\n }\n context.restore();\n }\n};\nconst _renderStaticScene = ({\n canvas,\n rc,\n elementsMap,\n allElementsMap,\n visibleElements,\n scale,\n appState,\n renderConfig,\n}: StaticSceneRenderConfig) => {\n if (canvas === null) {\n return;\n }\n\n const { renderGrid = true, isExporting } = renderConfig;\n\n const [normalizedWidth, normalizedHeight] = getNormalizedCanvasDimensions(\n canvas,\n scale,\n );\n\n const context = bootstrapCanvas({\n canvas,\n scale,\n normalizedWidth,\n normalizedHeight,\n theme: appState.theme,\n isExporting,\n viewBackgroundColor: appState.viewBackgroundColor,\n });\n\n // Apply zoom\n context.scale(appState.zoom.value, appState.zoom.value);\n\n // Grid\n if (renderGrid && appState.gridSize) {\n strokeGrid(\n context,\n appState.gridSize,\n appState.scrollX,\n appState.scrollY,\n appState.zoom,\n normalizedWidth / appState.zoom.value,\n normalizedHeight / appState.zoom.value,\n );\n }\n\n const groupsToBeAddedToFrame = new Set<string>();\n\n visibleElements.forEach((element) => {\n if (\n element.groupIds.length > 0 &&\n appState.frameToHighlight &&\n appState.selectedElementIds[element.id] &&\n (elementOverlapsWithFrame(\n element,\n appState.frameToHighlight,\n elementsMap,\n ) ||\n element.groupIds.find((groupId) => groupsToBeAddedToFrame.has(groupId)))\n ) {\n element.groupIds.forEach((groupId) =>\n groupsToBeAddedToFrame.add(groupId),\n );\n }\n });\n\n // Paint visible elements\n visibleElements\n .filter((el) => !isIframeLikeElement(el))\n .forEach((element) => {\n try {\n const frameId = element.frameId || appState.frameToHighlight?.id;\n\n if (\n frameId &&\n appState.frameRendering.enabled &&\n appState.frameRendering.clip\n ) {\n context.save();\n\n const frame = getTargetFrame(element, elementsMap, appState);\n\n // TODO do we need to check isElementInFrame here?\n if (frame && isElementInFrame(element, elementsMap, appState)) {\n frameClip(frame, context, renderConfig, appState);\n }\n renderElement(\n element,\n elementsMap,\n allElementsMap,\n rc,\n context,\n renderConfig,\n appState,\n );\n context.restore();\n } else {\n renderElement(\n element,\n elementsMap,\n allElementsMap,\n rc,\n context,\n renderConfig,\n appState,\n );\n }\n if (!isExporting) {\n renderLinkIcon(element, context, appState, elementsMap);\n }\n } catch (error: any) {\n console.error(error);\n }\n });\n\n // render embeddables on top\n visibleElements\n .filter((el) => isIframeLikeElement(el))\n .forEach((element) => {\n try {\n const render = () => {\n renderElement(\n element,\n elementsMap,\n allElementsMap,\n rc,\n context,\n renderConfig,\n appState,\n );\n\n if (\n isIframeLikeElement(element) &&\n (isExporting ||\n (isEmbeddableElement(element) &&\n renderConfig.embedsValidationStatus.get(element.id) !==\n true)) &&\n element.width &&\n element.height\n ) {\n const label = createPlaceholderEmbeddableLabel(element);\n renderElement(\n label,\n elementsMap,\n allElementsMap,\n rc,\n context,\n renderConfig,\n appState,\n );\n }\n if (!isExporting) {\n renderLinkIcon(element, context, appState, elementsMap);\n }\n };\n // - when exporting the whole canvas, we DO NOT apply clipping\n // - when we are exporting a particular frame, apply clipping\n // if the containing frame is not selected, apply clipping\n const frameId = element.frameId || appState.frameToHighlight?.id;\n\n if (\n frameId &&\n appState.frameRendering.enabled &&\n appState.frameRendering.clip\n ) {\n context.save();\n\n const frame = getTargetFrame(element, elementsMap, appState);\n\n if (frame && isElementInFrame(element, elementsMap, appState)) {\n frameClip(frame, context, renderConfig, appState);\n }\n render();\n context.restore();\n } else {\n render();\n }\n } catch (error: any) {\n console.error(error);\n }\n });\n};\n\n/** throttled to animation framerate */\nexport const renderStaticSceneThrottled = throttleRAF(\n (config: StaticSceneRenderConfig) => {\n _renderStaticScene(config);\n },\n { trailing: true },\n);\n\n/**\n * Static scene is the non-ui canvas where we render elements.\n */\nexport const renderStaticScene = (\n renderConfig: StaticSceneRenderConfig,\n throttle?: boolean,\n) => {\n if (throttle) {\n renderStaticSceneThrottled(renderConfig);\n return;\n }\n\n _renderStaticScene(renderConfig);\n};\n", "import { MIME_TYPES } from \"../../constants\";\nimport { Bounds, getElementAbsoluteCoords } from \"../../element/bounds\";\nimport { isPointHittingElementBoundingBox } from \"../../element/collision\";\nimport { ElementsMap, NonDeletedExcalidrawElement } from \"../../element/types\";\nimport { rotate } from \"../../math\";\nimport { DEFAULT_LINK_SIZE } from \"../../renderer/renderElement\";\nimport { AppState, Point, UIAppState } from \"../../types\";\n\nexport const EXTERNAL_LINK_IMG = document.createElement(\"img\");\nEXTERNAL_LINK_IMG.src = `data:${MIME_TYPES.svg}, ${encodeURIComponent(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#1971c2\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-external-link\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"></path><polyline points=\"15 3 21 3 21 9\"></polyline><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"></line></svg>`,\n)}`;\n\nexport const getLinkHandleFromCoords = (\n [x1, y1, x2, y2]: Bounds,\n angle: number,\n appState: Pick<UIAppState, \"zoom\">,\n): Bounds => {\n const size = DEFAULT_LINK_SIZE;\n const linkWidth = size / appState.zoom.value;\n const linkHeight = size / appState.zoom.value;\n const linkMarginY = size / appState.zoom.value;\n const centerX = (x1 + x2) / 2;\n const centerY = (y1 + y2) / 2;\n const centeringOffset = (size - 8) / (2 * appState.zoom.value);\n const dashedLineMargin = 4 / appState.zoom.value;\n\n // Same as `ne` resize handle\n const x = x2 + dashedLineMargin - centeringOffset;\n const y = y1 - dashedLineMargin - linkMarginY + centeringOffset;\n\n const [rotatedX, rotatedY] = rotate(\n x + linkWidth / 2,\n y + linkHeight / 2,\n centerX,\n centerY,\n angle,\n );\n return [\n rotatedX - linkWidth / 2,\n rotatedY - linkHeight / 2,\n linkWidth,\n linkHeight,\n ];\n};\n\nexport const isPointHittingLinkIcon = (\n element: NonDeletedExcalidrawElement,\n elementsMap: ElementsMap,\n appState: AppState,\n [x, y]: Point,\n) => {\n const threshold = 4 / appState.zoom.value;\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const [linkX, linkY, linkWidth, linkHeight] = getLinkHandleFromCoords(\n [x1, y1, x2, y2],\n element.angle,\n appState,\n );\n const hitLink =\n x > linkX - threshold &&\n x < linkX + threshold + linkWidth &&\n y > linkY - threshold &&\n y < linkY + linkHeight + threshold;\n return hitLink;\n};\n\nexport const isPointHittingLink = (\n element: NonDeletedExcalidrawElement,\n elementsMap: ElementsMap,\n appState: AppState,\n [x, y]: Point,\n isMobile: boolean,\n) => {\n if (!element.link || appState.selectedElementIds[element.id]) {\n return false;\n }\n const threshold = 4 / appState.zoom.value;\n if (\n !isMobile &&\n appState.viewModeEnabled &&\n isPointHittingElementBoundingBox(\n element,\n elementsMap,\n [x, y],\n threshold,\n null,\n )\n ) {\n return true;\n }\n return isPointHittingLinkIcon(element, elementsMap, appState, [x, y]);\n};\n", "import { StaticCanvasAppState, AppState } from \"../types\";\n\nimport { StaticCanvasRenderConfig } from \"../scene/types\";\n\nimport { THEME_FILTER } from \"../constants\";\n\nexport const fillCircle = (\n context: CanvasRenderingContext2D,\n cx: number,\n cy: number,\n radius: number,\n stroke = true,\n) => {\n context.beginPath();\n context.arc(cx, cy, radius, 0, Math.PI * 2);\n context.fill();\n if (stroke) {\n context.stroke();\n }\n};\n\nexport const getNormalizedCanvasDimensions = (\n canvas: HTMLCanvasElement,\n scale: number,\n): [number, number] => {\n // When doing calculations based on canvas width we should used normalized one\n return [canvas.width / scale, canvas.height / scale];\n};\n\nexport const bootstrapCanvas = ({\n canvas,\n scale,\n normalizedWidth,\n normalizedHeight,\n theme,\n isExporting,\n viewBackgroundColor,\n}: {\n canvas: HTMLCanvasElement;\n scale: number;\n normalizedWidth: number;\n normalizedHeight: number;\n theme?: AppState[\"theme\"];\n isExporting?: StaticCanvasRenderConfig[\"isExporting\"];\n viewBackgroundColor?: StaticCanvasAppState[\"viewBackgroundColor\"];\n}): CanvasRenderingContext2D => {\n const context = canvas.getContext(\"2d\")!;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.scale(scale, scale);\n\n if (isExporting && theme === \"dark\") {\n context.filter = THEME_FILTER;\n }\n\n // Paint background\n if (typeof viewBackgroundColor === \"string\") {\n const hasTransparence =\n viewBackgroundColor === \"transparent\" ||\n viewBackgroundColor.length === 5 || // #RGBA\n viewBackgroundColor.length === 9 || // #RRGGBBA\n /(hsla|rgba)\\(/.test(viewBackgroundColor);\n if (hasTransparence) {\n context.clearRect(0, 0, normalizedWidth, normalizedHeight);\n }\n context.save();\n context.fillStyle = viewBackgroundColor;\n context.fillRect(0, 0, normalizedWidth, normalizedHeight);\n context.restore();\n } else {\n context.clearRect(0, 0, normalizedWidth, normalizedHeight);\n }\n\n return context;\n};\n", "import {\n ExcalidrawElement,\n ExcalidrawElementType,\n ExcalidrawSelectionElement,\n ExcalidrawTextElement,\n FontFamilyValues,\n PointBinding,\n StrokeRoundness,\n} from \"../element/types\";\nimport {\n AppState,\n BinaryFiles,\n LibraryItem,\n NormalizedZoomValue,\n} from \"../types\";\nimport { ImportedDataState, LegacyAppState } from \"./types\";\nimport {\n getNonDeletedElements,\n getNormalizedDimensions,\n isInvisiblySmallElement,\n refreshTextDimensions,\n} from \"../element\";\nimport { isTextElement, isUsingAdaptiveRadius } from \"../element/typeChecks\";\nimport { randomId } from \"../random\";\nimport {\n DEFAULT_FONT_FAMILY,\n DEFAULT_TEXT_ALIGN,\n DEFAULT_VERTICAL_ALIGN,\n PRECEDING_ELEMENT_KEY,\n FONT_FAMILY,\n ROUNDNESS,\n DEFAULT_SIDEBAR,\n DEFAULT_ELEMENT_PROPS,\n} from \"../constants\";\nimport { getDefaultAppState } from \"../appState\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport { bumpVersion } from \"../element/mutateElement\";\nimport { getUpdatedTimestamp, updateActiveTool } from \"../utils\";\nimport { arrayToMap } from \"../utils\";\nimport { MarkOptional, Mutable } from \"../utility-types\";\nimport {\n detectLineHeight,\n getContainerElement,\n getDefaultLineHeight,\n} from \"../element/textElement\";\nimport { normalizeLink } from \"./url\";\n\ntype RestoredAppState = Omit<\n AppState,\n \"offsetTop\" | \"offsetLeft\" | \"width\" | \"height\"\n>;\n\nexport const AllowedExcalidrawActiveTools: Record<\n AppState[\"activeTool\"][\"type\"],\n boolean\n> = {\n selection: true,\n text: true,\n rectangle: true,\n diamond: true,\n ellipse: true,\n line: true,\n image: true,\n arrow: true,\n freedraw: true,\n eraser: false,\n custom: true,\n frame: true,\n embeddable: true,\n hand: true,\n laser: false,\n magicframe: false,\n};\n\nexport type RestoredDataState = {\n elements: ExcalidrawElement[];\n appState: RestoredAppState;\n files: BinaryFiles;\n};\n\nconst getFontFamilyByName = (fontFamilyName: string): FontFamilyValues => {\n if (Object.keys(FONT_FAMILY).includes(fontFamilyName)) {\n return FONT_FAMILY[\n fontFamilyName as keyof typeof FONT_FAMILY\n ] as FontFamilyValues;\n }\n return DEFAULT_FONT_FAMILY;\n};\n\nconst repairBinding = (binding: PointBinding | null) => {\n if (!binding) {\n return null;\n }\n return { ...binding, focus: binding.focus || 0 };\n};\n\nconst restoreElementWithProperties = <\n T extends Required<Omit<ExcalidrawElement, \"customData\">> & {\n customData?: ExcalidrawElement[\"customData\"];\n /** @deprecated */\n boundElementIds?: readonly ExcalidrawElement[\"id\"][];\n /** @deprecated */\n strokeSharpness?: StrokeRoundness;\n /** metadata that may be present in elements during collaboration */\n [PRECEDING_ELEMENT_KEY]?: string;\n },\n K extends Pick<T, keyof Omit<Required<T>, keyof ExcalidrawElement>>,\n>(\n element: T,\n extra: Pick<\n T,\n // This extra Pick<T, keyof K> ensure no excess properties are passed.\n // @ts-ignore TS complains here but type checks the call sites fine.\n keyof K\n > &\n Partial<Pick<ExcalidrawElement, \"type\" | \"x\" | \"y\" | \"customData\">>,\n): T => {\n const base: Pick<T, keyof ExcalidrawElement> & {\n [PRECEDING_ELEMENT_KEY]?: string;\n } = {\n type: extra.type || element.type,\n // all elements must have version > 0 so getSceneVersion() will pick up\n // newly added elements\n version: element.version || 1,\n versionNonce: element.versionNonce ?? 0,\n isDeleted: element.isDeleted ?? false,\n id: element.id || randomId(),\n fillStyle: element.fillStyle || DEFAULT_ELEMENT_PROPS.fillStyle,\n strokeWidth: element.strokeWidth || DEFAULT_ELEMENT_PROPS.strokeWidth,\n strokeStyle: element.strokeStyle ?? DEFAULT_ELEMENT_PROPS.strokeStyle,\n roughness: element.roughness ?? DEFAULT_ELEMENT_PROPS.roughness,\n opacity:\n element.opacity == null ? DEFAULT_ELEMENT_PROPS.opacity : element.opacity,\n angle: element.angle || 0,\n x: extra.x ?? element.x ?? 0,\n y: extra.y ?? element.y ?? 0,\n strokeColor: element.strokeColor || DEFAULT_ELEMENT_PROPS.strokeColor,\n backgroundColor:\n element.backgroundColor || DEFAULT_ELEMENT_PROPS.backgroundColor,\n width: element.width || 0,\n height: element.height || 0,\n seed: element.seed ?? 1,\n groupIds: element.groupIds ?? [],\n frameId: element.frameId ?? null,\n roundness: element.roundness\n ? element.roundness\n : element.strokeSharpness === \"round\"\n ? {\n // for old elements that would now use adaptive radius algo,\n // use legacy algo instead\n type: isUsingAdaptiveRadius(element.type)\n ? ROUNDNESS.LEGACY\n : ROUNDNESS.PROPORTIONAL_RADIUS,\n }\n : null,\n boundElements: element.boundElementIds\n ? element.boundElementIds.map((id) => ({ type: \"arrow\", id }))\n : element.boundElements ?? [],\n updated: element.updated ?? getUpdatedTimestamp(),\n link: element.link ? normalizeLink(element.link) : null,\n locked: element.locked ?? false,\n };\n\n if (\"customData\" in element || \"customData\" in extra) {\n base.customData =\n \"customData\" in extra ? extra.customData : element.customData;\n }\n\n if (PRECEDING_ELEMENT_KEY in element) {\n base[PRECEDING_ELEMENT_KEY] = element[PRECEDING_ELEMENT_KEY];\n }\n\n return {\n ...base,\n ...getNormalizedDimensions(base),\n ...extra,\n } as unknown as T;\n};\n\nconst restoreElement = (\n element: Exclude<ExcalidrawElement, ExcalidrawSelectionElement>,\n): typeof element | null => {\n switch (element.type) {\n case \"text\":\n let fontSize = element.fontSize;\n let fontFamily = element.fontFamily;\n if (\"font\" in element) {\n const [fontPx, _fontFamily]: [string, string] = (\n element as any\n ).font.split(\" \");\n fontSize = parseFloat(fontPx);\n fontFamily = getFontFamilyByName(_fontFamily);\n }\n const text = (typeof element.text === \"string\" && element.text) || \"\";\n\n // line-height might not be specified either when creating elements\n // programmatically, or when importing old diagrams.\n // For the latter we want to detect the original line height which\n // will likely differ from our per-font fixed line height we now use,\n // to maintain backward compatibility.\n const lineHeight =\n element.lineHeight ||\n (element.height\n ? // detect line-height from current element height and font-size\n detectLineHeight(element)\n : // no element height likely means programmatic use, so default\n // to a fixed line height\n getDefaultLineHeight(element.fontFamily));\n element = restoreElementWithProperties(element, {\n fontSize,\n fontFamily,\n text,\n textAlign: element.textAlign || DEFAULT_TEXT_ALIGN,\n verticalAlign: element.verticalAlign || DEFAULT_VERTICAL_ALIGN,\n containerId: element.containerId ?? null,\n originalText: element.originalText || text,\n\n lineHeight,\n });\n\n // if empty text, mark as deleted. We keep in array\n // for data integrity purposes (collab etc.)\n if (!text && !element.isDeleted) {\n element = { ...element, originalText: text, isDeleted: true };\n element = bumpVersion(element);\n }\n\n return element;\n case \"freedraw\": {\n return restoreElementWithProperties(element, {\n points: element.points,\n lastCommittedPoint: null,\n simulatePressure: element.simulatePressure,\n pressures: element.pressures,\n });\n }\n case \"image\":\n return restoreElementWithProperties(element, {\n status: element.status || \"pending\",\n fileId: element.fileId,\n scale: element.scale || [1, 1],\n });\n case \"line\":\n // @ts-ignore LEGACY type\n // eslint-disable-next-line no-fallthrough\n case \"draw\":\n case \"arrow\": {\n const {\n startArrowhead = null,\n endArrowhead = element.type === \"arrow\" ? \"arrow\" : null,\n } = element;\n let x = element.x;\n let y = element.y;\n let points = // migrate old arrow model to new one\n !Array.isArray(element.points) || element.points.length < 2\n ? [\n [0, 0],\n [element.width, element.height],\n ]\n : element.points;\n\n if (points[0][0] !== 0 || points[0][1] !== 0) {\n ({ points, x, y } = LinearElementEditor.getNormalizedPoints(element));\n }\n\n return restoreElementWithProperties(element, {\n type:\n (element.type as ExcalidrawElementType | \"draw\") === \"draw\"\n ? \"line\"\n : element.type,\n startBinding: repairBinding(element.startBinding),\n endBinding: repairBinding(element.endBinding),\n lastCommittedPoint: null,\n startArrowhead,\n endArrowhead,\n points,\n x,\n y,\n });\n }\n\n // generic elements\n case \"ellipse\":\n case \"rectangle\":\n case \"diamond\":\n case \"iframe\":\n case \"embeddable\":\n return restoreElementWithProperties(element, {});\n case \"magicframe\":\n case \"frame\":\n return restoreElementWithProperties(element, {\n name: element.name ?? null,\n });\n\n // Don't use default case so as to catch a missing an element type case.\n // We also don't want to throw, but instead return void so we filter\n // out these unsupported elements from the restored array.\n }\n return null;\n};\n\n/**\n * Repairs contaienr element's boundElements array by removing duplicates and\n * fixing containerId of bound elements if not present. Also removes any\n * bound elements that do not exist in the elements array.\n *\n * NOTE mutates elements.\n */\nconst repairContainerElement = (\n container: Mutable<ExcalidrawElement>,\n elementsMap: Map<string, Mutable<ExcalidrawElement>>,\n) => {\n if (container.boundElements) {\n // copy because we're not cloning on restore, and we don't want to mutate upstream\n const boundElements = container.boundElements.slice();\n\n // dedupe bindings & fix boundElement.containerId if not set already\n const boundIds = new Set<ExcalidrawElement[\"id\"]>();\n container.boundElements = boundElements.reduce(\n (\n acc: Mutable<NonNullable<ExcalidrawElement[\"boundElements\"]>>,\n binding,\n ) => {\n const boundElement = elementsMap.get(binding.id);\n if (boundElement && !boundIds.has(binding.id)) {\n boundIds.add(binding.id);\n\n if (boundElement.isDeleted) {\n return acc;\n }\n\n acc.push(binding);\n\n if (\n isTextElement(boundElement) &&\n // being slightly conservative here, preserving existing containerId\n // if defined, lest boundElements is stale\n !boundElement.containerId\n ) {\n (boundElement as Mutable<ExcalidrawTextElement>).containerId =\n container.id;\n }\n }\n return acc;\n },\n [],\n );\n }\n};\n\n/**\n * Repairs target bound element's container's boundElements array,\n * or removes contaienrId if container does not exist.\n *\n * NOTE mutates elements.\n */\nconst repairBoundElement = (\n boundElement: Mutable<ExcalidrawTextElement>,\n elementsMap: Map<string, Mutable<ExcalidrawElement>>,\n) => {\n const container = boundElement.containerId\n ? elementsMap.get(boundElement.containerId)\n : null;\n\n if (!container) {\n boundElement.containerId = null;\n return;\n }\n\n if (boundElement.isDeleted) {\n return;\n }\n\n if (\n container.boundElements &&\n !container.boundElements.find((binding) => binding.id === boundElement.id)\n ) {\n // copy because we're not cloning on restore, and we don't want to mutate upstream\n const boundElements = (\n container.boundElements || (container.boundElements = [])\n ).slice();\n boundElements.push({ type: \"text\", id: boundElement.id });\n container.boundElements = boundElements;\n }\n};\n\n/**\n * Remove an element's frameId if its containing frame is non-existent\n *\n * NOTE mutates elements.\n */\nconst repairFrameMembership = (\n element: Mutable<ExcalidrawElement>,\n elementsMap: Map<string, Mutable<ExcalidrawElement>>,\n) => {\n if (element.frameId) {\n const containingFrame = elementsMap.get(element.frameId);\n\n if (!containingFrame) {\n element.frameId = null;\n }\n }\n};\n\nexport const restoreElements = (\n elements: ImportedDataState[\"elements\"],\n /** NOTE doesn't serve for reconciliation */\n localElements: readonly ExcalidrawElement[] | null | undefined,\n opts?: { refreshDimensions?: boolean; repairBindings?: boolean } | undefined,\n): ExcalidrawElement[] => {\n // used to detect duplicate top-level element ids\n const existingIds = new Set<string>();\n const localElementsMap = localElements ? arrayToMap(localElements) : null;\n const restoredElements = (elements || []).reduce((elements, element) => {\n // filtering out selection, which is legacy, no longer kept in elements,\n // and causing issues if retained\n if (element.type !== \"selection\" && !isInvisiblySmallElement(element)) {\n let migratedElement: ExcalidrawElement | null = restoreElement(element);\n if (migratedElement) {\n const localElement = localElementsMap?.get(element.id);\n if (localElement && localElement.version > migratedElement.version) {\n migratedElement = bumpVersion(migratedElement, localElement.version);\n }\n if (existingIds.has(migratedElement.id)) {\n migratedElement = { ...migratedElement, id: randomId() };\n }\n existingIds.add(migratedElement.id);\n\n elements.push(migratedElement);\n }\n }\n return elements;\n }, [] as ExcalidrawElement[]);\n\n if (!opts?.repairBindings) {\n return restoredElements;\n }\n\n // repair binding. Mutates elements.\n const restoredElementsMap = arrayToMap(restoredElements);\n for (const element of restoredElements) {\n if (element.frameId) {\n repairFrameMembership(element, restoredElementsMap);\n }\n\n if (isTextElement(element) && element.containerId) {\n repairBoundElement(element, restoredElementsMap);\n } else if (element.boundElements) {\n repairContainerElement(element, restoredElementsMap);\n }\n\n if (opts.refreshDimensions && isTextElement(element)) {\n Object.assign(\n element,\n refreshTextDimensions(\n element,\n getContainerElement(element, restoredElementsMap),\n restoredElementsMap,\n ),\n );\n }\n }\n\n return restoredElements;\n};\n\nconst coalesceAppStateValue = <\n T extends keyof ReturnType<typeof getDefaultAppState>,\n>(\n key: T,\n appState: Exclude<ImportedDataState[\"appState\"], null | undefined>,\n defaultAppState: ReturnType<typeof getDefaultAppState>,\n) => {\n const value = appState[key];\n // NOTE the value! assertion is needed in TS 4.5.5 (fixed in newer versions)\n return value !== undefined ? value! : defaultAppState[key];\n};\n\nconst LegacyAppStateMigrations: {\n [K in keyof LegacyAppState]: (\n ImportedDataState: Exclude<ImportedDataState[\"appState\"], null | undefined>,\n defaultAppState: ReturnType<typeof getDefaultAppState>,\n ) => [LegacyAppState[K][1], AppState[LegacyAppState[K][1]]];\n} = {\n isSidebarDocked: (appState, defaultAppState) => {\n return [\n \"defaultSidebarDockedPreference\",\n appState.isSidebarDocked ??\n coalesceAppStateValue(\n \"defaultSidebarDockedPreference\",\n appState,\n defaultAppState,\n ),\n ];\n },\n};\n\nexport const restoreAppState = (\n appState: ImportedDataState[\"appState\"],\n localAppState: Partial<AppState> | null | undefined,\n): RestoredAppState => {\n appState = appState || {};\n const defaultAppState = getDefaultAppState();\n const nextAppState = {} as typeof defaultAppState;\n\n // first, migrate all legacy AppState properties to new ones. We do it\n // in one go before migrate the rest of the properties in case the new ones\n // depend on checking any other key (i.e. they are coupled)\n for (const legacyKey of Object.keys(\n LegacyAppStateMigrations,\n ) as (keyof typeof LegacyAppStateMigrations)[]) {\n if (legacyKey in appState) {\n const [nextKey, nextValue] = LegacyAppStateMigrations[legacyKey](\n appState,\n defaultAppState,\n );\n (nextAppState as any)[nextKey] = nextValue;\n }\n }\n\n for (const [key, defaultValue] of Object.entries(defaultAppState) as [\n keyof typeof defaultAppState,\n any,\n ][]) {\n // if AppState contains a legacy key, prefer that one and migrate its\n // value to the new one\n const suppliedValue = appState[key];\n\n const localValue = localAppState ? localAppState[key] : undefined;\n (nextAppState as any)[key] =\n suppliedValue !== undefined\n ? suppliedValue\n : localValue !== undefined\n ? localValue\n : defaultValue;\n }\n\n return {\n ...nextAppState,\n cursorButton: localAppState?.cursorButton || \"up\",\n // reset on fresh restore so as to hide the UI button if penMode not active\n penDetected:\n localAppState?.penDetected ??\n (appState.penMode ? appState.penDetected ?? false : false),\n activeTool: {\n ...updateActiveTool(\n defaultAppState,\n nextAppState.activeTool.type &&\n AllowedExcalidrawActiveTools[nextAppState.activeTool.type]\n ? nextAppState.activeTool\n : { type: \"selection\" },\n ),\n lastActiveTool: null,\n locked: nextAppState.activeTool.locked ?? false,\n },\n // Migrates from previous version where appState.zoom was a number\n zoom:\n typeof appState.zoom === \"number\"\n ? {\n value: appState.zoom as NormalizedZoomValue,\n }\n : appState.zoom?.value\n ? appState.zoom\n : defaultAppState.zoom,\n openSidebar:\n // string (legacy)\n typeof (appState.openSidebar as any as string) === \"string\"\n ? { name: DEFAULT_SIDEBAR.name }\n : nextAppState.openSidebar,\n };\n};\n\nexport const restore = (\n data: Pick<ImportedDataState, \"appState\" | \"elements\" | \"files\"> | null,\n /**\n * Local AppState (`this.state` or initial state from localStorage) so that we\n * don't overwrite local state with default values (when values not\n * explicitly specified).\n * Supply `null` if you can't get access to it.\n */\n localAppState: Partial<AppState> | null | undefined,\n localElements: readonly ExcalidrawElement[] | null | undefined,\n elementsConfig?: { refreshDimensions?: boolean; repairBindings?: boolean },\n): RestoredDataState => {\n return {\n elements: restoreElements(data?.elements, localElements, elementsConfig),\n appState: restoreAppState(data?.appState, localAppState || null),\n files: data?.files || {},\n };\n};\n\nconst restoreLibraryItem = (libraryItem: LibraryItem) => {\n const elements = restoreElements(\n getNonDeletedElements(libraryItem.elements),\n null,\n );\n return elements.length ? { ...libraryItem, elements } : null;\n};\n\nexport const restoreLibraryItems = (\n libraryItems: ImportedDataState[\"libraryItems\"] = [],\n defaultStatus: LibraryItem[\"status\"],\n) => {\n const restoredItems: LibraryItem[] = [];\n for (const item of libraryItems) {\n // migrate older libraries\n if (Array.isArray(item)) {\n const restoredItem = restoreLibraryItem({\n status: defaultStatus,\n elements: item,\n id: randomId(),\n created: Date.now(),\n });\n if (restoredItem) {\n restoredItems.push(restoredItem);\n }\n } else {\n const _item = item as MarkOptional<\n LibraryItem,\n \"id\" | \"status\" | \"created\"\n >;\n const restoredItem = restoreLibraryItem({\n ..._item,\n id: _item.id || randomId(),\n status: _item.status || defaultStatus,\n created: _item.created || Date.now(),\n });\n if (restoredItem) {\n restoredItems.push(restoredItem);\n }\n }\n }\n return restoredItems;\n};\n", "import {\n ExcalidrawElement,\n NonDeletedExcalidrawElement,\n} from \"./element/types\";\nimport { BinaryFiles } from \"./types\";\nimport { tryParseSpreadsheet, Spreadsheet, VALID_SPREADSHEET } from \"./charts\";\nimport {\n ALLOWED_PASTE_MIME_TYPES,\n EXPORT_DATA_TYPES,\n MIME_TYPES,\n} from \"./constants\";\nimport {\n isFrameLikeElement,\n isInitializedImageElement,\n} from \"./element/typeChecks\";\nimport { deepCopyElement } from \"./element/newElement\";\nimport { mutateElement } from \"./element/mutateElement\";\nimport { getContainingFrame } from \"./frame\";\nimport { arrayToMap, isMemberOf, isPromiseLike } from \"./utils\";\n\ntype ElementsClipboard = {\n type: typeof EXPORT_DATA_TYPES.excalidrawClipboard;\n elements: readonly NonDeletedExcalidrawElement[];\n files: BinaryFiles | undefined;\n};\n\nexport type PastedMixedContent = { type: \"text\" | \"imageUrl\"; value: string }[];\n\nexport interface ClipboardData {\n spreadsheet?: Spreadsheet;\n elements?: readonly ExcalidrawElement[];\n files?: BinaryFiles;\n text?: string;\n mixedContent?: PastedMixedContent;\n errorMessage?: string;\n programmaticAPI?: boolean;\n}\n\ntype AllowedPasteMimeTypes = typeof ALLOWED_PASTE_MIME_TYPES[number];\n\ntype ParsedClipboardEvent =\n | { type: \"text\"; value: string }\n | { type: \"mixedContent\"; value: PastedMixedContent };\n\nexport const probablySupportsClipboardReadText =\n \"clipboard\" in navigator && \"readText\" in navigator.clipboard;\n\nexport const probablySupportsClipboardWriteText =\n \"clipboard\" in navigator && \"writeText\" in navigator.clipboard;\n\nexport const probablySupportsClipboardBlob =\n \"clipboard\" in navigator &&\n \"write\" in navigator.clipboard &&\n \"ClipboardItem\" in window &&\n \"toBlob\" in HTMLCanvasElement.prototype;\n\nconst clipboardContainsElements = (\n contents: any,\n): contents is { elements: ExcalidrawElement[]; files?: BinaryFiles } => {\n if (\n [\n EXPORT_DATA_TYPES.excalidraw,\n EXPORT_DATA_TYPES.excalidrawClipboard,\n EXPORT_DATA_TYPES.excalidrawClipboardWithAPI,\n ].includes(contents?.type) &&\n Array.isArray(contents.elements)\n ) {\n return true;\n }\n return false;\n};\n\nexport const createPasteEvent = ({\n types,\n files,\n}: {\n types?: { [key in AllowedPasteMimeTypes]?: string };\n files?: File[];\n}) => {\n if (!types && !files) {\n console.warn(\"createPasteEvent: no types or files provided\");\n }\n\n const event = new ClipboardEvent(\"paste\", {\n clipboardData: new DataTransfer(),\n });\n\n if (types) {\n for (const [type, value] of Object.entries(types)) {\n try {\n event.clipboardData?.setData(type, value);\n if (event.clipboardData?.getData(type) !== value) {\n throw new Error(`Failed to set \"${type}\" as clipboardData item`);\n }\n } catch (error: any) {\n throw new Error(error.message);\n }\n }\n }\n\n if (files) {\n let idx = -1;\n for (const file of files) {\n idx++;\n try {\n event.clipboardData?.items.add(file);\n if (event.clipboardData?.files[idx] !== file) {\n throw new Error(\n `Failed to set file \"${file.name}\" as clipboardData item`,\n );\n }\n } catch (error: any) {\n throw new Error(error.message);\n }\n }\n }\n\n return event;\n};\n\nexport const serializeAsClipboardJSON = ({\n elements,\n files,\n}: {\n elements: readonly NonDeletedExcalidrawElement[];\n files: BinaryFiles | null;\n}) => {\n const elementsMap = arrayToMap(elements);\n const framesToCopy = new Set(\n elements.filter((element) => isFrameLikeElement(element)),\n );\n let foundFile = false;\n\n const _files = elements.reduce((acc, element) => {\n if (isInitializedImageElement(element)) {\n foundFile = true;\n if (files && files[element.fileId]) {\n acc[element.fileId] = files[element.fileId];\n }\n }\n return acc;\n }, {} as BinaryFiles);\n\n if (foundFile && !files) {\n console.warn(\n \"copyToClipboard: attempting to file element(s) without providing associated `files` object.\",\n );\n }\n\n // select bound text elements when copying\n const contents: ElementsClipboard = {\n type: EXPORT_DATA_TYPES.excalidrawClipboard,\n elements: elements.map((element) => {\n if (\n getContainingFrame(element, elementsMap) &&\n !framesToCopy.has(getContainingFrame(element, elementsMap)!)\n ) {\n const copiedElement = deepCopyElement(element);\n mutateElement(copiedElement, {\n frameId: null,\n });\n return copiedElement;\n }\n\n return element;\n }),\n files: files ? _files : undefined,\n };\n\n return JSON.stringify(contents);\n};\n\nexport const copyToClipboard = async (\n elements: readonly NonDeletedExcalidrawElement[],\n files: BinaryFiles | null,\n /** supply if available to make the operation more certain to succeed */\n clipboardEvent?: ClipboardEvent | null,\n) => {\n await copyTextToSystemClipboard(\n serializeAsClipboardJSON({ elements, files }),\n clipboardEvent,\n );\n};\n\nconst parsePotentialSpreadsheet = (\n text: string,\n): { spreadsheet: Spreadsheet } | { errorMessage: string } | null => {\n const result = tryParseSpreadsheet(text);\n if (result.type === VALID_SPREADSHEET) {\n return { spreadsheet: result.spreadsheet };\n }\n return null;\n};\n\n/** internal, specific to parsing paste events. Do not reuse. */\nfunction parseHTMLTree(el: ChildNode) {\n let result: PastedMixedContent = [];\n for (const node of el.childNodes) {\n if (node.nodeType === 3) {\n const text = node.textContent?.trim();\n if (text) {\n result.push({ type: \"text\", value: text });\n }\n } else if (node instanceof HTMLImageElement) {\n const url = node.getAttribute(\"src\");\n if (url && url.startsWith(\"http\")) {\n result.push({ type: \"imageUrl\", value: url });\n }\n } else {\n result = result.concat(parseHTMLTree(node));\n }\n }\n return result;\n}\n\nconst maybeParseHTMLPaste = (\n event: ClipboardEvent,\n): { type: \"mixedContent\"; value: PastedMixedContent } | null => {\n const html = event.clipboardData?.getData(\"text/html\");\n\n if (!html) {\n return null;\n }\n\n try {\n const doc = new DOMParser().parseFromString(html, \"text/html\");\n\n const content = parseHTMLTree(doc.body);\n\n if (content.length) {\n return { type: \"mixedContent\", value: content };\n }\n } catch (error: any) {\n console.error(`error in parseHTMLFromPaste: ${error.message}`);\n }\n\n return null;\n};\n\nexport const readSystemClipboard = async () => {\n const types: { [key in AllowedPasteMimeTypes]?: string } = {};\n\n try {\n if (navigator.clipboard?.readText) {\n return { \"text/plain\": await navigator.clipboard?.readText() };\n }\n } catch (error: any) {\n // @ts-ignore\n if (navigator.clipboard?.read) {\n console.warn(\n `navigator.clipboard.readText() failed (${error.message}). Failling back to navigator.clipboard.read()`,\n );\n } else {\n throw error;\n }\n }\n\n let clipboardItems: ClipboardItems;\n\n try {\n clipboardItems = await navigator.clipboard?.read();\n } catch (error: any) {\n if (error.name === \"DataError\") {\n console.warn(\n `navigator.clipboard.read() error, clipboard is probably empty: ${error.message}`,\n );\n return types;\n }\n throw error;\n }\n\n for (const item of clipboardItems) {\n for (const type of item.types) {\n if (!isMemberOf(ALLOWED_PASTE_MIME_TYPES, type)) {\n continue;\n }\n try {\n types[type] = await (await item.getType(type)).text();\n } catch (error: any) {\n console.warn(\n `Cannot retrieve ${type} from clipboardItem: ${error.message}`,\n );\n }\n }\n }\n\n if (Object.keys(types).length === 0) {\n console.warn(\"No clipboard data found from clipboard.read().\");\n return types;\n }\n\n return types;\n};\n\n/**\n * Parses \"paste\" ClipboardEvent.\n */\nconst parseClipboardEvent = async (\n event: ClipboardEvent,\n isPlainPaste = false,\n): Promise<ParsedClipboardEvent> => {\n try {\n const mixedContent = !isPlainPaste && event && maybeParseHTMLPaste(event);\n\n if (mixedContent) {\n if (mixedContent.value.every((item) => item.type === \"text\")) {\n return {\n type: \"text\",\n value:\n event.clipboardData?.getData(\"text/plain\") ||\n mixedContent.value\n .map((item) => item.value)\n .join(\"\\n\")\n .trim(),\n };\n }\n\n return mixedContent;\n }\n\n const text = event.clipboardData?.getData(\"text/plain\");\n\n return { type: \"text\", value: (text || \"\").trim() };\n } catch {\n return { type: \"text\", value: \"\" };\n }\n};\n\n/**\n * Attempts to parse clipboard. Prefers system clipboard.\n */\nexport const parseClipboard = async (\n event: ClipboardEvent,\n isPlainPaste = false,\n): Promise<ClipboardData> => {\n const parsedEventData = await parseClipboardEvent(event, isPlainPaste);\n\n if (parsedEventData.type === \"mixedContent\") {\n return {\n mixedContent: parsedEventData.value,\n };\n }\n\n try {\n // if system clipboard contains spreadsheet, use it even though it's\n // technically possible it's staler than in-app clipboard\n const spreadsheetResult =\n !isPlainPaste && parsePotentialSpreadsheet(parsedEventData.value);\n\n if (spreadsheetResult) {\n return spreadsheetResult;\n }\n } catch (error: any) {\n console.error(error);\n }\n\n try {\n const systemClipboardData = JSON.parse(parsedEventData.value);\n const programmaticAPI =\n systemClipboardData.type === EXPORT_DATA_TYPES.excalidrawClipboardWithAPI;\n if (clipboardContainsElements(systemClipboardData)) {\n return {\n elements: systemClipboardData.elements,\n files: systemClipboardData.files,\n text: isPlainPaste\n ? JSON.stringify(systemClipboardData.elements, null, 2)\n : undefined,\n programmaticAPI,\n };\n }\n } catch {}\n\n return { text: parsedEventData.value };\n};\n\nexport const copyBlobToClipboardAsPng = async (blob: Blob | Promise<Blob>) => {\n try {\n // in Safari so far we need to construct the ClipboardItem synchronously\n // (i.e. in the same tick) otherwise browser will complain for lack of\n // user intent. Using a Promise ClipboardItem constructor solves this.\n // https://bugs.webkit.org/show_bug.cgi?id=222262\n //\n // Note that Firefox (and potentially others) seems to support Promise\n // ClipboardItem constructor, but throws on an unrelated MIME type error.\n // So we need to await this and fallback to awaiting the blob if applicable.\n await navigator.clipboard.write([\n new window.ClipboardItem({\n [MIME_TYPES.png]: blob,\n }),\n ]);\n } catch (error: any) {\n // if we're using a Promise ClipboardItem, let's try constructing\n // with resolution value instead\n if (isPromiseLike(blob)) {\n await navigator.clipboard.write([\n new window.ClipboardItem({\n [MIME_TYPES.png]: await blob,\n }),\n ]);\n } else {\n throw error;\n }\n }\n};\n\nexport const copyTextToSystemClipboard = async (\n text: string | null,\n clipboardEvent?: ClipboardEvent | null,\n) => {\n // (1) first try using Async Clipboard API\n if (probablySupportsClipboardWriteText) {\n try {\n // NOTE: doesn't work on FF on non-HTTPS domains, or when document\n // not focused\n await navigator.clipboard.writeText(text || \"\");\n return;\n } catch (error: any) {\n console.error(error);\n }\n }\n\n // (2) if fails and we have access to ClipboardEvent, use plain old setData()\n try {\n if (clipboardEvent) {\n clipboardEvent.clipboardData?.setData(\"text/plain\", text || \"\");\n if (clipboardEvent.clipboardData?.getData(\"text/plain\") !== text) {\n throw new Error(\"Failed to setData on clipboardEvent\");\n }\n return;\n }\n } catch (error: any) {\n console.error(error);\n }\n\n // (3) if that fails, use document.execCommand\n if (!copyTextViaExecCommand(text)) {\n throw new Error(\"Error copying to clipboard.\");\n }\n};\n\n// adapted from https://github.com/zenorocha/clipboard.js/blob/ce79f170aa655c408b6aab33c9472e8e4fa52e19/src/clipboard-action.js#L48\nconst copyTextViaExecCommand = (text: string | null) => {\n // execCommand doesn't allow copying empty strings, so if we're\n // clearing clipboard using this API, we must copy at least an empty char\n if (!text) {\n text = \" \";\n }\n\n const isRTL = document.documentElement.getAttribute(\"dir\") === \"rtl\";\n\n const textarea = document.createElement(\"textarea\");\n\n textarea.style.border = \"0\";\n textarea.style.padding = \"0\";\n textarea.style.margin = \"0\";\n textarea.style.position = \"absolute\";\n textarea.style[isRTL ? \"right\" : \"left\"] = \"-9999px\";\n const yPosition = window.pageYOffset || document.documentElement.scrollTop;\n textarea.style.top = `${yPosition}px`;\n // Prevent zooming on iOS\n textarea.style.fontSize = \"12pt\";\n\n textarea.setAttribute(\"readonly\", \"\");\n textarea.value = text;\n\n document.body.appendChild(textarea);\n\n let success = false;\n\n try {\n textarea.select();\n textarea.setSelectionRange(0, textarea.value.length);\n\n success = document.execCommand(\"copy\");\n } catch (error: any) {\n console.error(error);\n }\n\n textarea.remove();\n\n return success;\n};\n", "import {\n COLOR_PALETTE,\n DEFAULT_CHART_COLOR_INDEX,\n getAllColorsSpecificShade,\n} from \"./colors\";\nimport {\n DEFAULT_FONT_FAMILY,\n DEFAULT_FONT_SIZE,\n VERTICAL_ALIGN,\n} from \"./constants\";\nimport { newElement, newLinearElement, newTextElement } from \"./element\";\nimport { NonDeletedExcalidrawElement } from \"./element/types\";\nimport { randomId } from \"./random\";\n\nexport type ChartElements = readonly NonDeletedExcalidrawElement[];\n\nconst BAR_WIDTH = 32;\nconst BAR_GAP = 12;\nconst BAR_HEIGHT = 256;\nconst GRID_OPACITY = 50;\n\nexport interface Spreadsheet {\n title: string | null;\n labels: string[] | null;\n values: number[];\n}\n\nexport const NOT_SPREADSHEET = \"NOT_SPREADSHEET\";\nexport const VALID_SPREADSHEET = \"VALID_SPREADSHEET\";\n\ntype ParseSpreadsheetResult =\n | { type: typeof NOT_SPREADSHEET; reason: string }\n | { type: typeof VALID_SPREADSHEET; spreadsheet: Spreadsheet };\n\n/**\n * @private exported for testing\n */\nexport const tryParseNumber = (s: string): number | null => {\n const match = /^([-+]?)[$\u20AC\u00A3\u00A5\u20A9]?([-+]?)([\\d.,]+)[%]?$/.exec(s);\n if (!match) {\n return null;\n }\n return parseFloat(`${(match[1] || match[2]) + match[3]}`.replace(/,/g, \"\"));\n};\n\nconst isNumericColumn = (lines: string[][], columnIndex: number) =>\n lines.slice(1).every((line) => tryParseNumber(line[columnIndex]) !== null);\n\n/**\n * @private exported for testing\n */\nexport const tryParseCells = (cells: string[][]): ParseSpreadsheetResult => {\n const numCols = cells[0].length;\n\n if (numCols > 2) {\n return { type: NOT_SPREADSHEET, reason: \"More than 2 columns\" };\n }\n\n if (numCols === 1) {\n if (!isNumericColumn(cells, 0)) {\n return { type: NOT_SPREADSHEET, reason: \"Value is not numeric\" };\n }\n\n const hasHeader = tryParseNumber(cells[0][0]) === null;\n const values = (hasHeader ? cells.slice(1) : cells).map((line) =>\n tryParseNumber(line[0]),\n );\n\n if (values.length < 2) {\n return { type: NOT_SPREADSHEET, reason: \"Less than two rows\" };\n }\n\n return {\n type: VALID_SPREADSHEET,\n spreadsheet: {\n title: hasHeader ? cells[0][0] : null,\n labels: null,\n values: values as number[],\n },\n };\n }\n\n const labelColumnNumeric = isNumericColumn(cells, 0);\n const valueColumnNumeric = isNumericColumn(cells, 1);\n\n if (!labelColumnNumeric && !valueColumnNumeric) {\n return { type: NOT_SPREADSHEET, reason: \"Value is not numeric\" };\n }\n\n const [labelColumnIndex, valueColumnIndex] = valueColumnNumeric\n ? [0, 1]\n : [1, 0];\n const hasHeader = tryParseNumber(cells[0][valueColumnIndex]) === null;\n const rows = hasHeader ? cells.slice(1) : cells;\n\n if (rows.length < 2) {\n return { type: NOT_SPREADSHEET, reason: \"Less than 2 rows\" };\n }\n\n return {\n type: VALID_SPREADSHEET,\n spreadsheet: {\n title: hasHeader ? cells[0][valueColumnIndex] : null,\n labels: rows.map((row) => row[labelColumnIndex]),\n values: rows.map((row) => tryParseNumber(row[valueColumnIndex])!),\n },\n };\n};\n\nconst transposeCells = (cells: string[][]) => {\n const nextCells: string[][] = [];\n for (let col = 0; col < cells[0].length; col++) {\n const nextCellRow: string[] = [];\n for (let row = 0; row < cells.length; row++) {\n nextCellRow.push(cells[row][col]);\n }\n nextCells.push(nextCellRow);\n }\n return nextCells;\n};\n\nexport const tryParseSpreadsheet = (text: string): ParseSpreadsheetResult => {\n // Copy/paste from excel, spreadsheets, tsv, csv.\n // For now we only accept 2 columns with an optional header\n\n // Check for tab separated values\n let lines = text\n .trim()\n .split(\"\\n\")\n .map((line) => line.trim().split(\"\\t\"));\n\n // Check for comma separated files\n if (lines.length && lines[0].length !== 2) {\n lines = text\n .trim()\n .split(\"\\n\")\n .map((line) => line.trim().split(\",\"));\n }\n\n if (lines.length === 0) {\n return { type: NOT_SPREADSHEET, reason: \"No values\" };\n }\n\n const numColsFirstLine = lines[0].length;\n const isSpreadsheet = lines.every((line) => line.length === numColsFirstLine);\n\n if (!isSpreadsheet) {\n return {\n type: NOT_SPREADSHEET,\n reason: \"All rows don't have same number of columns\",\n };\n }\n\n const result = tryParseCells(lines);\n if (result.type !== VALID_SPREADSHEET) {\n const transposedResults = tryParseCells(transposeCells(lines));\n if (transposedResults.type === VALID_SPREADSHEET) {\n return transposedResults;\n }\n }\n return result;\n};\n\nconst bgColors = getAllColorsSpecificShade(DEFAULT_CHART_COLOR_INDEX);\n\n// Put all the common properties here so when the whole chart is selected\n// the properties dialog shows the correct selected values\nconst commonProps = {\n fillStyle: \"hachure\",\n fontFamily: DEFAULT_FONT_FAMILY,\n fontSize: DEFAULT_FONT_SIZE,\n opacity: 100,\n roughness: 1,\n strokeColor: COLOR_PALETTE.black,\n roundness: null,\n strokeStyle: \"solid\",\n strokeWidth: 1,\n verticalAlign: VERTICAL_ALIGN.MIDDLE,\n locked: false,\n} as const;\n\nconst getChartDimensions = (spreadsheet: Spreadsheet) => {\n const chartWidth =\n (BAR_WIDTH + BAR_GAP) * spreadsheet.values.length + BAR_GAP;\n const chartHeight = BAR_HEIGHT + BAR_GAP * 2;\n return { chartWidth, chartHeight };\n};\n\nconst chartXLabels = (\n spreadsheet: Spreadsheet,\n x: number,\n y: number,\n groupId: string,\n backgroundColor: string,\n): ChartElements => {\n return (\n spreadsheet.labels?.map((label, index) => {\n return newTextElement({\n groupIds: [groupId],\n backgroundColor,\n ...commonProps,\n text: label.length > 8 ? `${label.slice(0, 5)}...` : label,\n x: x + index * (BAR_WIDTH + BAR_GAP) + BAR_GAP * 2,\n y: y + BAR_GAP / 2,\n width: BAR_WIDTH,\n angle: 5.87,\n fontSize: 16,\n textAlign: \"center\",\n verticalAlign: \"top\",\n });\n }) || []\n );\n};\n\nconst chartYLabels = (\n spreadsheet: Spreadsheet,\n x: number,\n y: number,\n groupId: string,\n backgroundColor: string,\n): ChartElements => {\n const minYLabel = newTextElement({\n groupIds: [groupId],\n backgroundColor,\n ...commonProps,\n x: x - BAR_GAP,\n y: y - BAR_GAP,\n text: \"0\",\n textAlign: \"right\",\n });\n\n const maxYLabel = newTextElement({\n groupIds: [groupId],\n backgroundColor,\n ...commonProps,\n x: x - BAR_GAP,\n y: y - BAR_HEIGHT - minYLabel.height / 2,\n text: Math.max(...spreadsheet.values).toLocaleString(),\n textAlign: \"right\",\n });\n\n return [minYLabel, maxYLabel];\n};\n\nconst chartLines = (\n spreadsheet: Spreadsheet,\n x: number,\n y: number,\n groupId: string,\n backgroundColor: string,\n): ChartElements => {\n const { chartWidth, chartHeight } = getChartDimensions(spreadsheet);\n const xLine = newLinearElement({\n backgroundColor,\n groupIds: [groupId],\n ...commonProps,\n type: \"line\",\n x,\n y,\n startArrowhead: null,\n endArrowhead: null,\n width: chartWidth,\n points: [\n [0, 0],\n [chartWidth, 0],\n ],\n });\n\n const yLine = newLinearElement({\n backgroundColor,\n groupIds: [groupId],\n ...commonProps,\n type: \"line\",\n x,\n y,\n startArrowhead: null,\n endArrowhead: null,\n height: chartHeight,\n points: [\n [0, 0],\n [0, -chartHeight],\n ],\n });\n\n const maxLine = newLinearElement({\n backgroundColor,\n groupIds: [groupId],\n ...commonProps,\n type: \"line\",\n x,\n y: y - BAR_HEIGHT - BAR_GAP,\n startArrowhead: null,\n endArrowhead: null,\n strokeStyle: \"dotted\",\n width: chartWidth,\n opacity: GRID_OPACITY,\n points: [\n [0, 0],\n [chartWidth, 0],\n ],\n });\n\n return [xLine, yLine, maxLine];\n};\n\n// For the maths behind it https://excalidraw.com/#json=6320864370884608,O_5xfD-Agh32tytHpRJx1g\nconst chartBaseElements = (\n spreadsheet: Spreadsheet,\n x: number,\n y: number,\n groupId: string,\n backgroundColor: string,\n debug?: boolean,\n): ChartElements => {\n const { chartWidth, chartHeight } = getChartDimensions(spreadsheet);\n\n const title = spreadsheet.title\n ? newTextElement({\n backgroundColor,\n groupIds: [groupId],\n ...commonProps,\n text: spreadsheet.title,\n x: x + chartWidth / 2,\n y: y - BAR_HEIGHT - BAR_GAP * 2 - DEFAULT_FONT_SIZE,\n roundness: null,\n textAlign: \"center\",\n })\n : null;\n\n const debugRect = debug\n ? newElement({\n backgroundColor,\n groupIds: [groupId],\n ...commonProps,\n type: \"rectangle\",\n x,\n y: y - chartHeight,\n width: chartWidth,\n height: chartHeight,\n strokeColor: COLOR_PALETTE.black,\n fillStyle: \"solid\",\n opacity: 6,\n })\n : null;\n\n return [\n ...(debugRect ? [debugRect] : []),\n ...(title ? [title] : []),\n ...chartXLabels(spreadsheet, x, y, groupId, backgroundColor),\n ...chartYLabels(spreadsheet, x, y, groupId, backgroundColor),\n ...chartLines(spreadsheet, x, y, groupId, backgroundColor),\n ];\n};\n\nconst chartTypeBar = (\n spreadsheet: Spreadsheet,\n x: number,\n y: number,\n): ChartElements => {\n const max = Math.max(...spreadsheet.values);\n const groupId = randomId();\n const backgroundColor = bgColors[Math.floor(Math.random() * bgColors.length)];\n\n const bars = spreadsheet.values.map((value, index) => {\n const barHeight = (value / max) * BAR_HEIGHT;\n return newElement({\n backgroundColor,\n groupIds: [groupId],\n ...commonProps,\n type: \"rectangle\",\n x: x + index * (BAR_WIDTH + BAR_GAP) + BAR_GAP,\n y: y - barHeight - BAR_GAP,\n width: BAR_WIDTH,\n height: barHeight,\n });\n });\n\n return [\n ...bars,\n ...chartBaseElements(\n spreadsheet,\n x,\n y,\n groupId,\n backgroundColor,\n import.meta.env.DEV,\n ),\n ];\n};\n\nconst chartTypeLine = (\n spreadsheet: Spreadsheet,\n x: number,\n y: number,\n): ChartElements => {\n const max = Math.max(...spreadsheet.values);\n const groupId = randomId();\n const backgroundColor = bgColors[Math.floor(Math.random() * bgColors.length)];\n\n let index = 0;\n const points = [];\n for (const value of spreadsheet.values) {\n const cx = index * (BAR_WIDTH + BAR_GAP);\n const cy = -(value / max) * BAR_HEIGHT;\n points.push([cx, cy]);\n index++;\n }\n\n const maxX = Math.max(...points.map((element) => element[0]));\n const maxY = Math.max(...points.map((element) => element[1]));\n const minX = Math.min(...points.map((element) => element[0]));\n const minY = Math.min(...points.map((element) => element[1]));\n\n const line = newLinearElement({\n backgroundColor,\n groupIds: [groupId],\n ...commonProps,\n type: \"line\",\n x: x + BAR_GAP + BAR_WIDTH / 2,\n y: y - BAR_GAP,\n startArrowhead: null,\n endArrowhead: null,\n height: maxY - minY,\n width: maxX - minX,\n strokeWidth: 2,\n points: points as any,\n });\n\n const dots = spreadsheet.values.map((value, index) => {\n const cx = index * (BAR_WIDTH + BAR_GAP) + BAR_GAP / 2;\n const cy = -(value / max) * BAR_HEIGHT + BAR_GAP / 2;\n return newElement({\n backgroundColor,\n groupIds: [groupId],\n ...commonProps,\n fillStyle: \"solid\",\n strokeWidth: 2,\n type: \"ellipse\",\n x: x + cx + BAR_WIDTH / 2,\n y: y + cy - BAR_GAP * 2,\n width: BAR_GAP,\n height: BAR_GAP,\n });\n });\n\n const lines = spreadsheet.values.map((value, index) => {\n const cx = index * (BAR_WIDTH + BAR_GAP) + BAR_GAP / 2;\n const cy = (value / max) * BAR_HEIGHT + BAR_GAP / 2 + BAR_GAP;\n return newLinearElement({\n backgroundColor,\n groupIds: [groupId],\n ...commonProps,\n type: \"line\",\n x: x + cx + BAR_WIDTH / 2 + BAR_GAP / 2,\n y: y - cy,\n startArrowhead: null,\n endArrowhead: null,\n height: cy,\n strokeStyle: \"dotted\",\n opacity: GRID_OPACITY,\n points: [\n [0, 0],\n [0, cy],\n ],\n });\n });\n\n return [\n ...chartBaseElements(\n spreadsheet,\n x,\n y,\n groupId,\n backgroundColor,\n import.meta.env.DEV,\n ),\n line,\n ...lines,\n ...dots,\n ];\n};\n\nexport const renderSpreadsheet = (\n chartType: string,\n spreadsheet: Spreadsheet,\n x: number,\n y: number,\n): ChartElements => {\n if (chartType === \"line\") {\n return chartTypeLine(spreadsheet, x, y);\n }\n return chartTypeBar(spreadsheet, x, y);\n};\n", "import type {\n ExcalidrawElement,\n ExcalidrawFreeDrawElement,\n ExcalidrawLinearElement,\n NonDeletedExcalidrawElement,\n} from \"../excalidraw/element/types\";\nimport {\n isArrowElement,\n isExcalidrawElement,\n isFreeDrawElement,\n isLinearElement,\n isTextElement,\n} from \"../excalidraw/element/typeChecks\";\nimport { isValueInRange, rotatePoint } from \"../excalidraw/math\";\nimport type { Point } from \"../excalidraw/types\";\nimport { Bounds, getElementBounds } from \"../excalidraw/element/bounds\";\nimport { arrayToMap } from \"../excalidraw/utils\";\n\ntype Element = NonDeletedExcalidrawElement;\ntype Elements = readonly NonDeletedExcalidrawElement[];\n\ntype Points = readonly Point[];\n\n/** @returns vertices relative to element's top-left [0,0] position */\nconst getNonLinearElementRelativePoints = (\n element: Exclude<\n Element,\n ExcalidrawLinearElement | ExcalidrawFreeDrawElement\n >,\n): [TopLeft: Point, TopRight: Point, BottomRight: Point, BottomLeft: Point] => {\n if (element.type === \"diamond\") {\n return [\n [element.width / 2, 0],\n [element.width, element.height / 2],\n [element.width / 2, element.height],\n [0, element.height / 2],\n ];\n }\n return [\n [0, 0],\n [0 + element.width, 0],\n [0 + element.width, element.height],\n [0, element.height],\n ];\n};\n\n/** @returns vertices relative to element's top-left [0,0] position */\nconst getElementRelativePoints = (element: ExcalidrawElement): Points => {\n if (isLinearElement(element) || isFreeDrawElement(element)) {\n return element.points;\n }\n return getNonLinearElementRelativePoints(element);\n};\n\nconst getMinMaxPoints = (points: Points) => {\n const ret = points.reduce(\n (limits, [x, y]) => {\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n\n return limits;\n },\n {\n minX: Infinity,\n minY: Infinity,\n maxX: -Infinity,\n maxY: -Infinity,\n cx: 0,\n cy: 0,\n },\n );\n\n ret.cx = (ret.maxX + ret.minX) / 2;\n ret.cy = (ret.maxY + ret.minY) / 2;\n\n return ret;\n};\n\nconst getRotatedBBox = (element: Element): Bounds => {\n const points = getElementRelativePoints(element);\n\n const { cx, cy } = getMinMaxPoints(points);\n const centerPoint: Point = [cx, cy];\n\n const rotatedPoints = points.map((point) =>\n rotatePoint([point[0], point[1]], centerPoint, element.angle),\n );\n const { minX, minY, maxX, maxY } = getMinMaxPoints(rotatedPoints);\n\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\n\nexport const isElementInsideBBox = (\n element: Element,\n bbox: Bounds,\n eitherDirection = false,\n): boolean => {\n const elementBBox = getRotatedBBox(element);\n\n const elementInsideBbox =\n bbox[0] <= elementBBox[0] &&\n bbox[2] >= elementBBox[2] &&\n bbox[1] <= elementBBox[1] &&\n bbox[3] >= elementBBox[3];\n\n if (!eitherDirection) {\n return elementInsideBbox;\n }\n\n if (elementInsideBbox) {\n return true;\n }\n\n return (\n elementBBox[0] <= bbox[0] &&\n elementBBox[2] >= bbox[2] &&\n elementBBox[1] <= bbox[1] &&\n elementBBox[3] >= bbox[3]\n );\n};\n\nexport const elementPartiallyOverlapsWithOrContainsBBox = (\n element: Element,\n bbox: Bounds,\n): boolean => {\n const elementBBox = getRotatedBBox(element);\n\n return (\n (isValueInRange(elementBBox[0], bbox[0], bbox[2]) ||\n isValueInRange(bbox[0], elementBBox[0], elementBBox[2])) &&\n (isValueInRange(elementBBox[1], bbox[1], bbox[3]) ||\n isValueInRange(bbox[1], elementBBox[1], elementBBox[3]))\n );\n};\n\nexport const elementsOverlappingBBox = ({\n elements,\n bounds,\n type,\n errorMargin = 0,\n}: {\n elements: Elements;\n bounds: Bounds | ExcalidrawElement;\n /** safety offset. Defaults to 0. */\n errorMargin?: number;\n /**\n * - overlap: elements overlapping or inside bounds\n * - contain: elements inside bounds or bounds inside elements\n * - inside: elements inside bounds\n **/\n type: \"overlap\" | \"contain\" | \"inside\";\n}) => {\n if (isExcalidrawElement(bounds)) {\n bounds = getElementBounds(bounds, arrayToMap(elements));\n }\n const adjustedBBox: Bounds = [\n bounds[0] - errorMargin,\n bounds[1] - errorMargin,\n bounds[2] + errorMargin,\n bounds[3] + errorMargin,\n ];\n\n const includedElementSet = new Set<string>();\n\n for (const element of elements) {\n if (includedElementSet.has(element.id)) {\n continue;\n }\n\n const isOverlaping =\n type === \"overlap\"\n ? elementPartiallyOverlapsWithOrContainsBBox(element, adjustedBBox)\n : type === \"inside\"\n ? isElementInsideBBox(element, adjustedBBox)\n : isElementInsideBBox(element, adjustedBBox, true);\n\n if (isOverlaping) {\n includedElementSet.add(element.id);\n\n if (element.boundElements) {\n for (const boundElement of element.boundElements) {\n includedElementSet.add(boundElement.id);\n }\n }\n\n if (isTextElement(element) && element.containerId) {\n includedElementSet.add(element.containerId);\n }\n\n if (isArrowElement(element)) {\n if (element.startBinding) {\n includedElementSet.add(element.startBinding.elementId);\n }\n\n if (element.endBinding) {\n includedElementSet.add(element.endBinding?.elementId);\n }\n }\n }\n }\n\n return elements.filter((element) => includedElementSet.has(element.id));\n};\n", "import { Bounds } from \"../excalidraw/element/bounds\";\nimport { Point } from \"../excalidraw/types\";\n\nexport type LineSegment = [Point, Point];\n\nexport function getBBox(line: LineSegment): Bounds {\n return [\n Math.min(line[0][0], line[1][0]),\n Math.min(line[0][1], line[1][1]),\n Math.max(line[0][0], line[1][0]),\n Math.max(line[0][1], line[1][1]),\n ];\n}\n\nexport function crossProduct(a: Point, b: Point) {\n return a[0] * b[1] - b[0] * a[1];\n}\n\nexport function doBBoxesIntersect(a: Bounds, b: Bounds) {\n return a[0] <= b[2] && a[2] >= b[0] && a[1] <= b[3] && a[3] >= b[1];\n}\n\nexport function translate(a: Point, b: Point): Point {\n return [a[0] - b[0], a[1] - b[1]];\n}\n\nconst EPSILON = 0.000001;\n\nexport function isPointOnLine(l: LineSegment, p: Point) {\n const p1 = translate(l[1], l[0]);\n const p2 = translate(p, l[0]);\n\n const r = crossProduct(p1, p2);\n\n return Math.abs(r) < EPSILON;\n}\n\nexport function isPointRightOfLine(l: LineSegment, p: Point) {\n const p1 = translate(l[1], l[0]);\n const p2 = translate(p, l[0]);\n\n return crossProduct(p1, p2) < 0;\n}\n\nexport function isLineSegmentTouchingOrCrossingLine(\n a: LineSegment,\n b: LineSegment,\n) {\n return (\n isPointOnLine(a, b[0]) ||\n isPointOnLine(a, b[1]) ||\n (isPointRightOfLine(a, b[0])\n ? !isPointRightOfLine(a, b[1])\n : isPointRightOfLine(a, b[1]))\n );\n}\n\n// https://martin-thoma.com/how-to-check-if-two-line-segments-intersect/\nexport function doLineSegmentsIntersect(a: LineSegment, b: LineSegment) {\n return (\n doBBoxesIntersect(getBBox(a), getBBox(b)) &&\n isLineSegmentTouchingOrCrossingLine(a, b) &&\n isLineSegmentTouchingOrCrossingLine(b, a)\n );\n}\n", "import {\n ExcalidrawElement,\n PointerType,\n NonDeletedExcalidrawElement,\n ElementsMap,\n} from \"./types\";\n\nimport {\n OMIT_SIDES_FOR_MULTIPLE_ELEMENTS,\n getTransformHandlesFromCoords,\n getTransformHandles,\n TransformHandleType,\n TransformHandle,\n MaybeTransformHandleType,\n} from \"./transformHandles\";\nimport { AppState, Zoom } from \"../types\";\nimport { Bounds } from \"./bounds\";\n\nconst isInsideTransformHandle = (\n transformHandle: TransformHandle,\n x: number,\n y: number,\n) =>\n x >= transformHandle[0] &&\n x <= transformHandle[0] + transformHandle[2] &&\n y >= transformHandle[1] &&\n y <= transformHandle[1] + transformHandle[3];\n\nexport const resizeTest = (\n element: NonDeletedExcalidrawElement,\n elementsMap: ElementsMap,\n appState: AppState,\n x: number,\n y: number,\n zoom: Zoom,\n pointerType: PointerType,\n): MaybeTransformHandleType => {\n if (!appState.selectedElementIds[element.id]) {\n return false;\n }\n\n const { rotation: rotationTransformHandle, ...transformHandles } =\n getTransformHandles(element, zoom, elementsMap, pointerType);\n\n if (\n rotationTransformHandle &&\n isInsideTransformHandle(rotationTransformHandle, x, y)\n ) {\n return \"rotation\" as TransformHandleType;\n }\n\n const filter = Object.keys(transformHandles).filter((key) => {\n const transformHandle =\n transformHandles[key as Exclude<TransformHandleType, \"rotation\">]!;\n if (!transformHandle) {\n return false;\n }\n return isInsideTransformHandle(transformHandle, x, y);\n });\n\n if (filter.length > 0) {\n return filter[0] as TransformHandleType;\n }\n\n return false;\n};\n\nexport const getElementWithTransformHandleType = (\n elements: readonly NonDeletedExcalidrawElement[],\n appState: AppState,\n scenePointerX: number,\n scenePointerY: number,\n zoom: Zoom,\n pointerType: PointerType,\n elementsMap: ElementsMap,\n) => {\n return elements.reduce((result, element) => {\n if (result) {\n return result;\n }\n const transformHandleType = resizeTest(\n element,\n elementsMap,\n appState,\n scenePointerX,\n scenePointerY,\n zoom,\n pointerType,\n );\n return transformHandleType ? { element, transformHandleType } : null;\n }, null as { element: NonDeletedExcalidrawElement; transformHandleType: MaybeTransformHandleType } | null);\n};\n\nexport const getTransformHandleTypeFromCoords = (\n [x1, y1, x2, y2]: Bounds,\n scenePointerX: number,\n scenePointerY: number,\n zoom: Zoom,\n pointerType: PointerType,\n): MaybeTransformHandleType => {\n const transformHandles = getTransformHandlesFromCoords(\n [x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2],\n 0,\n zoom,\n pointerType,\n OMIT_SIDES_FOR_MULTIPLE_ELEMENTS,\n );\n\n const found = Object.keys(transformHandles).find((key) => {\n const transformHandle =\n transformHandles[key as Exclude<TransformHandleType, \"rotation\">]!;\n return (\n transformHandle &&\n isInsideTransformHandle(transformHandle, scenePointerX, scenePointerY)\n );\n });\n return (found || false) as MaybeTransformHandleType;\n};\n\nconst RESIZE_CURSORS = [\"ns\", \"nesw\", \"ew\", \"nwse\"];\nconst rotateResizeCursor = (cursor: string, angle: number) => {\n const index = RESIZE_CURSORS.indexOf(cursor);\n if (index >= 0) {\n const a = Math.round(angle / (Math.PI / 4));\n cursor = RESIZE_CURSORS[(index + a) % RESIZE_CURSORS.length];\n }\n return cursor;\n};\n\n/*\n * Returns bi-directional cursor for the element being resized\n */\nexport const getCursorForResizingElement = (resizingElement: {\n element?: ExcalidrawElement;\n transformHandleType: MaybeTransformHandleType;\n}): string => {\n const { element, transformHandleType } = resizingElement;\n const shouldSwapCursors =\n element && Math.sign(element.height) * Math.sign(element.width) === -1;\n let cursor = null;\n\n switch (transformHandleType) {\n case \"n\":\n case \"s\":\n cursor = \"ns\";\n break;\n case \"w\":\n case \"e\":\n cursor = \"ew\";\n break;\n case \"nw\":\n case \"se\":\n if (shouldSwapCursors) {\n cursor = \"nesw\";\n } else {\n cursor = \"nwse\";\n }\n break;\n case \"ne\":\n case \"sw\":\n if (shouldSwapCursors) {\n cursor = \"nwse\";\n } else {\n cursor = \"nesw\";\n }\n break;\n case \"rotation\":\n return \"grab\";\n }\n\n if (cursor && element) {\n cursor = rotateResizeCursor(cursor, element.angle);\n }\n\n return cursor ? `${cursor}-resize` : \"\";\n};\n", "import { MIN_FONT_SIZE, SHIFT_LOCKING_ANGLE } from \"../constants\";\nimport { rescalePoints } from \"../points\";\n\nimport {\n rotate,\n adjustXYWithRotation,\n centerPoint,\n rotatePoint,\n} from \"../math\";\nimport {\n ExcalidrawLinearElement,\n ExcalidrawTextElement,\n NonDeletedExcalidrawElement,\n NonDeleted,\n ExcalidrawElement,\n ExcalidrawTextElementWithContainer,\n ExcalidrawImageElement,\n ElementsMap,\n} from \"./types\";\nimport type { Mutable } from \"../utility-types\";\nimport {\n getElementAbsoluteCoords,\n getCommonBounds,\n getResizedElementAbsoluteCoords,\n getCommonBoundingBox,\n getElementPointsCoords,\n} from \"./bounds\";\nimport {\n isArrowElement,\n isBoundToContainer,\n isFrameLikeElement,\n isFreeDrawElement,\n isImageElement,\n isLinearElement,\n isTextElement,\n} from \"./typeChecks\";\nimport { mutateElement } from \"./mutateElement\";\nimport { getFontString } from \"../utils\";\nimport { updateBoundElements } from \"./binding\";\nimport {\n TransformHandleType,\n MaybeTransformHandleType,\n TransformHandleDirection,\n} from \"./transformHandles\";\nimport { Point, PointerDownState } from \"../types\";\nimport Scene from \"../scene/Scene\";\nimport {\n getApproxMinLineWidth,\n getBoundTextElement,\n getBoundTextElementId,\n getContainerElement,\n handleBindTextResize,\n getBoundTextMaxWidth,\n getApproxMinLineHeight,\n} from \"./textElement\";\nimport { LinearElementEditor } from \"./linearElementEditor\";\n\nexport const normalizeAngle = (angle: number): number => {\n if (angle < 0) {\n return angle + 2 * Math.PI;\n }\n if (angle >= 2 * Math.PI) {\n return angle - 2 * Math.PI;\n }\n return angle;\n};\n\n// Returns true when transform (resizing/rotation) happened\nexport const transformElements = (\n originalElements: PointerDownState[\"originalElements\"],\n transformHandleType: MaybeTransformHandleType,\n selectedElements: readonly NonDeletedExcalidrawElement[],\n elementsMap: ElementsMap,\n shouldRotateWithDiscreteAngle: boolean,\n shouldResizeFromCenter: boolean,\n shouldMaintainAspectRatio: boolean,\n pointerX: number,\n pointerY: number,\n centerX: number,\n centerY: number,\n) => {\n if (selectedElements.length === 1) {\n const [element] = selectedElements;\n if (transformHandleType === \"rotation\") {\n rotateSingleElement(\n element,\n elementsMap,\n pointerX,\n pointerY,\n shouldRotateWithDiscreteAngle,\n );\n updateBoundElements(element, elementsMap);\n } else if (\n isTextElement(element) &&\n (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\")\n ) {\n resizeSingleTextElement(\n element,\n elementsMap,\n transformHandleType,\n shouldResizeFromCenter,\n pointerX,\n pointerY,\n );\n updateBoundElements(element, elementsMap);\n } else if (transformHandleType) {\n resizeSingleElement(\n originalElements,\n shouldMaintainAspectRatio,\n element,\n elementsMap,\n transformHandleType,\n shouldResizeFromCenter,\n pointerX,\n pointerY,\n );\n }\n\n return true;\n } else if (selectedElements.length > 1) {\n if (transformHandleType === \"rotation\") {\n rotateMultipleElements(\n originalElements,\n selectedElements,\n elementsMap,\n pointerX,\n pointerY,\n shouldRotateWithDiscreteAngle,\n centerX,\n centerY,\n );\n return true;\n } else if (\n transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\"\n ) {\n resizeMultipleElements(\n originalElements,\n selectedElements,\n elementsMap,\n transformHandleType,\n shouldResizeFromCenter,\n pointerX,\n pointerY,\n );\n return true;\n }\n }\n return false;\n};\n\nconst rotateSingleElement = (\n element: NonDeletedExcalidrawElement,\n elementsMap: ElementsMap,\n pointerX: number,\n pointerY: number,\n shouldRotateWithDiscreteAngle: boolean,\n) => {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n let angle: number;\n if (isFrameLikeElement(element)) {\n angle = 0;\n } else {\n angle = (5 * Math.PI) / 2 + Math.atan2(pointerY - cy, pointerX - cx);\n if (shouldRotateWithDiscreteAngle) {\n angle += SHIFT_LOCKING_ANGLE / 2;\n angle -= angle % SHIFT_LOCKING_ANGLE;\n }\n angle = normalizeAngle(angle);\n }\n const boundTextElementId = getBoundTextElementId(element);\n\n mutateElement(element, { angle });\n if (boundTextElementId) {\n const textElement =\n Scene.getScene(element)?.getElement<ExcalidrawTextElementWithContainer>(\n boundTextElementId,\n );\n\n if (textElement && !isArrowElement(element)) {\n mutateElement(textElement, { angle });\n }\n }\n};\n\nconst rescalePointsInElement = (\n element: NonDeletedExcalidrawElement,\n width: number,\n height: number,\n normalizePoints: boolean,\n) =>\n isLinearElement(element) || isFreeDrawElement(element)\n ? {\n points: rescalePoints(\n 0,\n width,\n rescalePoints(1, height, element.points, normalizePoints),\n normalizePoints,\n ),\n }\n : {};\n\nconst measureFontSizeFromWidth = (\n element: NonDeleted<ExcalidrawTextElement>,\n elementsMap: ElementsMap,\n nextWidth: number,\n): { size: number } | null => {\n // We only use width to scale font on resize\n let width = element.width;\n\n const hasContainer = isBoundToContainer(element);\n if (hasContainer) {\n const container = getContainerElement(element, elementsMap);\n if (container) {\n width = getBoundTextMaxWidth(container, element);\n }\n }\n const nextFontSize = element.fontSize * (nextWidth / width);\n if (nextFontSize < MIN_FONT_SIZE) {\n return null;\n }\n\n return {\n size: nextFontSize,\n };\n};\n\nconst getSidesForTransformHandle = (\n transformHandleType: TransformHandleType,\n shouldResizeFromCenter: boolean,\n) => {\n return {\n n:\n /^(n|ne|nw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(s|se|sw)$/.test(transformHandleType)),\n s:\n /^(s|se|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(n|ne|nw)$/.test(transformHandleType)),\n w:\n /^(w|nw|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(e|ne|se)$/.test(transformHandleType)),\n e:\n /^(e|ne|se)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(w|nw|sw)$/.test(transformHandleType)),\n };\n};\n\nconst resizeSingleTextElement = (\n element: NonDeleted<ExcalidrawTextElement>,\n elementsMap: ElementsMap,\n transformHandleType: \"nw\" | \"ne\" | \"sw\" | \"se\",\n shouldResizeFromCenter: boolean,\n pointerX: number,\n pointerY: number,\n) => {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n // rotation pointer with reverse angle\n const [rotatedX, rotatedY] = rotate(\n pointerX,\n pointerY,\n cx,\n cy,\n -element.angle,\n );\n let scale: number;\n switch (transformHandleType) {\n case \"se\":\n scale = Math.max(\n (rotatedX - x1) / (x2 - x1),\n (rotatedY - y1) / (y2 - y1),\n );\n break;\n case \"nw\":\n scale = Math.max(\n (x2 - rotatedX) / (x2 - x1),\n (y2 - rotatedY) / (y2 - y1),\n );\n break;\n case \"ne\":\n scale = Math.max(\n (rotatedX - x1) / (x2 - x1),\n (y2 - rotatedY) / (y2 - y1),\n );\n break;\n case \"sw\":\n scale = Math.max(\n (x2 - rotatedX) / (x2 - x1),\n (rotatedY - y1) / (y2 - y1),\n );\n break;\n }\n if (scale > 0) {\n const nextWidth = element.width * scale;\n const nextHeight = element.height * scale;\n const metrics = measureFontSizeFromWidth(element, elementsMap, nextWidth);\n if (metrics === null) {\n return;\n }\n const [nextX1, nextY1, nextX2, nextY2] = getResizedElementAbsoluteCoords(\n element,\n nextWidth,\n nextHeight,\n false,\n );\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n const [nextElementX, nextElementY] = adjustXYWithRotation(\n getSidesForTransformHandle(transformHandleType, shouldResizeFromCenter),\n element.x,\n element.y,\n element.angle,\n deltaX1,\n deltaY1,\n deltaX2,\n deltaY2,\n );\n mutateElement(element, {\n fontSize: metrics.size,\n width: nextWidth,\n height: nextHeight,\n x: nextElementX,\n y: nextElementY,\n });\n }\n};\n\nexport const resizeSingleElement = (\n originalElements: PointerDownState[\"originalElements\"],\n shouldMaintainAspectRatio: boolean,\n element: NonDeletedExcalidrawElement,\n elementsMap: ElementsMap,\n transformHandleDirection: TransformHandleDirection,\n shouldResizeFromCenter: boolean,\n pointerX: number,\n pointerY: number,\n) => {\n const stateAtResizeStart = originalElements.get(element.id)!;\n // Gets bounds corners\n const [x1, y1, x2, y2] = getResizedElementAbsoluteCoords(\n stateAtResizeStart,\n stateAtResizeStart.width,\n stateAtResizeStart.height,\n true,\n );\n const startTopLeft: Point = [x1, y1];\n const startBottomRight: Point = [x2, y2];\n const startCenter: Point = centerPoint(startTopLeft, startBottomRight);\n\n // Calculate new dimensions based on cursor position\n const rotatedPointer = rotatePoint(\n [pointerX, pointerY],\n startCenter,\n -stateAtResizeStart.angle,\n );\n\n // Get bounds corners rendered on screen\n const [esx1, esy1, esx2, esy2] = getResizedElementAbsoluteCoords(\n element,\n element.width,\n element.height,\n true,\n );\n\n const boundsCurrentWidth = esx2 - esx1;\n const boundsCurrentHeight = esy2 - esy1;\n\n // It's important we set the initial scale value based on the width and height at resize start,\n // otherwise previous dimensions affected by modifiers will be taken into account.\n const atStartBoundsWidth = startBottomRight[0] - startTopLeft[0];\n const atStartBoundsHeight = startBottomRight[1] - startTopLeft[1];\n let scaleX = atStartBoundsWidth / boundsCurrentWidth;\n let scaleY = atStartBoundsHeight / boundsCurrentHeight;\n\n let boundTextFont: { fontSize?: number } = {};\n const boundTextElement = getBoundTextElement(element, elementsMap);\n\n if (transformHandleDirection.includes(\"e\")) {\n scaleX = (rotatedPointer[0] - startTopLeft[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"s\")) {\n scaleY = (rotatedPointer[1] - startTopLeft[1]) / boundsCurrentHeight;\n }\n if (transformHandleDirection.includes(\"w\")) {\n scaleX = (startBottomRight[0] - rotatedPointer[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"n\")) {\n scaleY = (startBottomRight[1] - rotatedPointer[1]) / boundsCurrentHeight;\n }\n\n // Linear elements dimensions differ from bounds dimensions\n const eleInitialWidth = stateAtResizeStart.width;\n const eleInitialHeight = stateAtResizeStart.height;\n // We have to use dimensions of element on screen, otherwise the scaling of the\n // dimensions won't match the cursor for linear elements.\n let eleNewWidth = element.width * scaleX;\n let eleNewHeight = element.height * scaleY;\n\n // adjust dimensions for resizing from center\n if (shouldResizeFromCenter) {\n eleNewWidth = 2 * eleNewWidth - eleInitialWidth;\n eleNewHeight = 2 * eleNewHeight - eleInitialHeight;\n }\n\n // adjust dimensions to keep sides ratio\n if (shouldMaintainAspectRatio) {\n const widthRatio = Math.abs(eleNewWidth) / eleInitialWidth;\n const heightRatio = Math.abs(eleNewHeight) / eleInitialHeight;\n if (transformHandleDirection.length === 1) {\n eleNewHeight *= widthRatio;\n eleNewWidth *= heightRatio;\n }\n if (transformHandleDirection.length === 2) {\n const ratio = Math.max(widthRatio, heightRatio);\n eleNewWidth = eleInitialWidth * ratio * Math.sign(eleNewWidth);\n eleNewHeight = eleInitialHeight * ratio * Math.sign(eleNewHeight);\n }\n }\n\n if (boundTextElement) {\n const stateOfBoundTextElementAtResize = originalElements.get(\n boundTextElement.id,\n ) as typeof boundTextElement | undefined;\n if (stateOfBoundTextElementAtResize) {\n boundTextFont = {\n fontSize: stateOfBoundTextElementAtResize.fontSize,\n };\n }\n if (shouldMaintainAspectRatio) {\n const updatedElement = {\n ...element,\n width: eleNewWidth,\n height: eleNewHeight,\n };\n\n const nextFont = measureFontSizeFromWidth(\n boundTextElement,\n elementsMap,\n getBoundTextMaxWidth(updatedElement, boundTextElement),\n );\n if (nextFont === null) {\n return;\n }\n boundTextFont = {\n fontSize: nextFont.size,\n };\n } else {\n const minWidth = getApproxMinLineWidth(\n getFontString(boundTextElement),\n boundTextElement.lineHeight,\n );\n const minHeight = getApproxMinLineHeight(\n boundTextElement.fontSize,\n boundTextElement.lineHeight,\n );\n eleNewWidth = Math.max(eleNewWidth, minWidth);\n eleNewHeight = Math.max(eleNewHeight, minHeight);\n }\n }\n\n const [newBoundsX1, newBoundsY1, newBoundsX2, newBoundsY2] =\n getResizedElementAbsoluteCoords(\n stateAtResizeStart,\n eleNewWidth,\n eleNewHeight,\n true,\n );\n const newBoundsWidth = newBoundsX2 - newBoundsX1;\n const newBoundsHeight = newBoundsY2 - newBoundsY1;\n\n // Calculate new topLeft based on fixed corner during resize\n let newTopLeft = [...startTopLeft] as [number, number];\n if ([\"n\", \"w\", \"nw\"].includes(transformHandleDirection)) {\n newTopLeft = [\n startBottomRight[0] - Math.abs(newBoundsWidth),\n startBottomRight[1] - Math.abs(newBoundsHeight),\n ];\n }\n if (transformHandleDirection === \"ne\") {\n const bottomLeft = [startTopLeft[0], startBottomRight[1]];\n newTopLeft = [bottomLeft[0], bottomLeft[1] - Math.abs(newBoundsHeight)];\n }\n if (transformHandleDirection === \"sw\") {\n const topRight = [startBottomRight[0], startTopLeft[1]];\n newTopLeft = [topRight[0] - Math.abs(newBoundsWidth), topRight[1]];\n }\n\n // Keeps opposite handle fixed during resize\n if (shouldMaintainAspectRatio) {\n if ([\"s\", \"n\"].includes(transformHandleDirection)) {\n newTopLeft[0] = startCenter[0] - newBoundsWidth / 2;\n }\n if ([\"e\", \"w\"].includes(transformHandleDirection)) {\n newTopLeft[1] = startCenter[1] - newBoundsHeight / 2;\n }\n }\n\n const flipX = eleNewWidth < 0;\n const flipY = eleNewHeight < 0;\n\n // Flip horizontally\n if (flipX) {\n if (transformHandleDirection.includes(\"e\")) {\n newTopLeft[0] -= Math.abs(newBoundsWidth);\n }\n if (transformHandleDirection.includes(\"w\")) {\n newTopLeft[0] += Math.abs(newBoundsWidth);\n }\n }\n\n // Flip vertically\n if (flipY) {\n if (transformHandleDirection.includes(\"s\")) {\n newTopLeft[1] -= Math.abs(newBoundsHeight);\n }\n if (transformHandleDirection.includes(\"n\")) {\n newTopLeft[1] += Math.abs(newBoundsHeight);\n }\n }\n\n if (shouldResizeFromCenter) {\n newTopLeft[0] = startCenter[0] - Math.abs(newBoundsWidth) / 2;\n newTopLeft[1] = startCenter[1] - Math.abs(newBoundsHeight) / 2;\n }\n\n // adjust topLeft to new rotation point\n const angle = stateAtResizeStart.angle;\n const rotatedTopLeft = rotatePoint(newTopLeft, startCenter, angle);\n const newCenter: Point = [\n newTopLeft[0] + Math.abs(newBoundsWidth) / 2,\n newTopLeft[1] + Math.abs(newBoundsHeight) / 2,\n ];\n const rotatedNewCenter = rotatePoint(newCenter, startCenter, angle);\n newTopLeft = rotatePoint(rotatedTopLeft, rotatedNewCenter, -angle);\n\n // For linear elements (x,y) are the coordinates of the first drawn point not the top-left corner\n // So we need to readjust (x,y) to be where the first point should be\n const newOrigin = [...newTopLeft];\n const linearElementXOffset = stateAtResizeStart.x - newBoundsX1;\n const linearElementYOffset = stateAtResizeStart.y - newBoundsY1;\n newOrigin[0] += linearElementXOffset;\n newOrigin[1] += linearElementYOffset;\n\n const nextX = newOrigin[0];\n const nextY = newOrigin[1];\n\n // Readjust points for linear elements\n let rescaledElementPointsY;\n let rescaledPoints;\n if (isLinearElement(element) || isFreeDrawElement(element)) {\n rescaledElementPointsY = rescalePoints(\n 1,\n eleNewHeight,\n (stateAtResizeStart as ExcalidrawLinearElement).points,\n true,\n );\n\n rescaledPoints = rescalePoints(\n 0,\n eleNewWidth,\n rescaledElementPointsY,\n true,\n );\n }\n\n const resizedElement = {\n width: Math.abs(eleNewWidth),\n height: Math.abs(eleNewHeight),\n x: nextX,\n y: nextY,\n points: rescaledPoints,\n };\n\n if (\"scale\" in element && \"scale\" in stateAtResizeStart) {\n mutateElement(element, {\n scale: [\n // defaulting because scaleX/Y can be 0/-0\n (Math.sign(newBoundsX2 - stateAtResizeStart.x) ||\n stateAtResizeStart.scale[0]) * stateAtResizeStart.scale[0],\n (Math.sign(newBoundsY2 - stateAtResizeStart.y) ||\n stateAtResizeStart.scale[1]) * stateAtResizeStart.scale[1],\n ],\n });\n }\n\n if (\n isArrowElement(element) &&\n boundTextElement &&\n shouldMaintainAspectRatio\n ) {\n const fontSize =\n (resizedElement.width / element.width) * boundTextElement.fontSize;\n if (fontSize < MIN_FONT_SIZE) {\n return;\n }\n boundTextFont.fontSize = fontSize;\n }\n\n if (\n resizedElement.width !== 0 &&\n resizedElement.height !== 0 &&\n Number.isFinite(resizedElement.x) &&\n Number.isFinite(resizedElement.y)\n ) {\n mutateElement(element, resizedElement);\n\n updateBoundElements(element, elementsMap, {\n newSize: { width: resizedElement.width, height: resizedElement.height },\n });\n\n if (boundTextElement && boundTextFont != null) {\n mutateElement(boundTextElement, {\n fontSize: boundTextFont.fontSize,\n });\n }\n handleBindTextResize(\n element,\n elementsMap,\n transformHandleDirection,\n shouldMaintainAspectRatio,\n );\n }\n};\n\nexport const resizeMultipleElements = (\n originalElements: PointerDownState[\"originalElements\"],\n selectedElements: readonly NonDeletedExcalidrawElement[],\n elementsMap: ElementsMap,\n transformHandleType: \"nw\" | \"ne\" | \"sw\" | \"se\",\n shouldResizeFromCenter: boolean,\n pointerX: number,\n pointerY: number,\n) => {\n // map selected elements to the original elements. While it never should\n // happen that pointerDownState.originalElements won't contain the selected\n // elements during resize, this coupling isn't guaranteed, so to ensure\n // type safety we need to transform only those elements we filter.\n const targetElements = selectedElements.reduce(\n (\n acc: {\n /** element at resize start */\n orig: NonDeletedExcalidrawElement;\n /** latest element */\n latest: NonDeletedExcalidrawElement;\n }[],\n element,\n ) => {\n const origElement = originalElements.get(element.id);\n if (origElement) {\n acc.push({ orig: origElement, latest: element });\n }\n return acc;\n },\n [],\n );\n\n // getCommonBoundingBox() uses getBoundTextElement() which returns null for\n // original elements from pointerDownState, so we have to find and add these\n // bound text elements manually. Additionally, the coordinates of bound text\n // elements aren't always up to date.\n const boundTextElements = targetElements.reduce((acc, { orig }) => {\n if (!isLinearElement(orig)) {\n return acc;\n }\n const textId = getBoundTextElementId(orig);\n if (!textId) {\n return acc;\n }\n const text = originalElements.get(textId) ?? null;\n if (!isBoundToContainer(text)) {\n return acc;\n }\n const xy = LinearElementEditor.getBoundTextElementPosition(\n orig,\n text,\n elementsMap,\n );\n return [...acc, { ...text, ...xy }];\n }, [] as ExcalidrawTextElementWithContainer[]);\n\n const { minX, minY, maxX, maxY, midX, midY } = getCommonBoundingBox(\n targetElements.map(({ orig }) => orig).concat(boundTextElements),\n );\n\n // const originalHeight = maxY - minY;\n // const originalWidth = maxX - minX;\n\n const direction = transformHandleType;\n\n const mapDirectionsToAnchors: Record<typeof direction, Point> = {\n ne: [minX, maxY],\n se: [minX, minY],\n sw: [maxX, minY],\n nw: [maxX, maxY],\n };\n\n // anchor point must be on the opposite side of the dragged selection handle\n // or be the center of the selection if shouldResizeFromCenter\n const [anchorX, anchorY]: Point = shouldResizeFromCenter\n ? [midX, midY]\n : mapDirectionsToAnchors[direction];\n\n const scale =\n Math.max(\n Math.abs(pointerX - anchorX) / (maxX - minX) || 0,\n Math.abs(pointerY - anchorY) / (maxY - minY) || 0,\n ) * (shouldResizeFromCenter ? 2 : 1);\n\n if (scale === 0) {\n return;\n }\n\n const mapDirectionsToPointerPositions: Record<\n typeof direction,\n [x: boolean, y: boolean]\n > = {\n ne: [pointerX >= anchorX, pointerY <= anchorY],\n se: [pointerX >= anchorX, pointerY >= anchorY],\n sw: [pointerX <= anchorX, pointerY >= anchorY],\n nw: [pointerX <= anchorX, pointerY <= anchorY],\n };\n\n /**\n * to flip an element:\n * 1. determine over which axis is the element being flipped\n * (could be x, y, or both) indicated by `flipFactorX` & `flipFactorY`\n * 2. shift element's position by the amount of width or height (or both) or\n * mirror points in the case of linear & freedraw elemenets\n * 3. adjust element angle\n */\n const [flipFactorX, flipFactorY] = mapDirectionsToPointerPositions[\n direction\n ].map((condition) => (condition ? 1 : -1));\n const isFlippedByX = flipFactorX < 0;\n const isFlippedByY = flipFactorY < 0;\n\n const elementsAndUpdates: {\n element: NonDeletedExcalidrawElement;\n update: Mutable<\n Pick<ExcalidrawElement, \"x\" | \"y\" | \"width\" | \"height\" | \"angle\">\n > & {\n points?: ExcalidrawLinearElement[\"points\"];\n fontSize?: ExcalidrawTextElement[\"fontSize\"];\n scale?: ExcalidrawImageElement[\"scale\"];\n boundTextFontSize?: ExcalidrawTextElement[\"fontSize\"];\n };\n }[] = [];\n\n for (const { orig, latest } of targetElements) {\n // bounded text elements are updated along with their container elements\n if (isTextElement(orig) && isBoundToContainer(orig)) {\n continue;\n }\n\n const width = orig.width * scale;\n const height = orig.height * scale;\n const angle = normalizeAngle(orig.angle * flipFactorX * flipFactorY);\n\n const isLinearOrFreeDraw = isLinearElement(orig) || isFreeDrawElement(orig);\n const offsetX = orig.x - anchorX;\n const offsetY = orig.y - anchorY;\n const shiftX = isFlippedByX && !isLinearOrFreeDraw ? width : 0;\n const shiftY = isFlippedByY && !isLinearOrFreeDraw ? height : 0;\n const x = anchorX + flipFactorX * (offsetX * scale + shiftX);\n const y = anchorY + flipFactorY * (offsetY * scale + shiftY);\n\n const rescaledPoints = rescalePointsInElement(\n orig,\n width * flipFactorX,\n height * flipFactorY,\n false,\n );\n\n const update: typeof elementsAndUpdates[0][\"update\"] = {\n x,\n y,\n width,\n height,\n angle,\n ...rescaledPoints,\n };\n\n if (isImageElement(orig) && targetElements.length === 1) {\n update.scale = [orig.scale[0] * flipFactorX, orig.scale[1] * flipFactorY];\n }\n\n if (isLinearElement(orig) && (isFlippedByX || isFlippedByY)) {\n const origBounds = getElementPointsCoords(orig, orig.points);\n const newBounds = getElementPointsCoords(\n { ...orig, x, y },\n rescaledPoints.points!,\n );\n const origXY = [orig.x, orig.y];\n const newXY = [x, y];\n\n const linearShift = (axis: \"x\" | \"y\") => {\n const i = axis === \"x\" ? 0 : 1;\n return (\n (newBounds[i + 2] -\n newXY[i] -\n (origXY[i] - origBounds[i]) * scale +\n (origBounds[i + 2] - origXY[i]) * scale -\n (newXY[i] - newBounds[i])) /\n 2\n );\n };\n\n if (isFlippedByX) {\n update.x -= linearShift(\"x\");\n }\n\n if (isFlippedByY) {\n update.y -= linearShift(\"y\");\n }\n }\n\n if (isTextElement(orig)) {\n const metrics = measureFontSizeFromWidth(orig, elementsMap, width);\n if (!metrics) {\n return;\n }\n update.fontSize = metrics.size;\n }\n\n const boundTextElement = originalElements.get(\n getBoundTextElementId(orig) ?? \"\",\n ) as ExcalidrawTextElementWithContainer | undefined;\n\n if (boundTextElement) {\n const newFontSize = boundTextElement.fontSize * scale;\n if (newFontSize < MIN_FONT_SIZE) {\n return;\n }\n update.boundTextFontSize = newFontSize;\n }\n\n elementsAndUpdates.push({\n element: latest,\n update,\n });\n }\n\n const elementsToUpdate = elementsAndUpdates.map(({ element }) => element);\n\n for (const {\n element,\n update: { boundTextFontSize, ...update },\n } of elementsAndUpdates) {\n const { width, height, angle } = update;\n\n mutateElement(element, update, false);\n\n updateBoundElements(element, elementsMap, {\n simultaneouslyUpdated: elementsToUpdate,\n newSize: { width, height },\n });\n\n const boundTextElement = getBoundTextElement(element, elementsMap);\n if (boundTextElement && boundTextFontSize) {\n mutateElement(\n boundTextElement,\n {\n fontSize: boundTextFontSize,\n angle: isLinearElement(element) ? undefined : angle,\n },\n false,\n );\n handleBindTextResize(element, elementsMap, transformHandleType, true);\n }\n }\n\n Scene.getScene(elementsAndUpdates[0].element)?.informMutation();\n};\n\nconst rotateMultipleElements = (\n originalElements: PointerDownState[\"originalElements\"],\n elements: readonly NonDeletedExcalidrawElement[],\n elementsMap: ElementsMap,\n pointerX: number,\n pointerY: number,\n shouldRotateWithDiscreteAngle: boolean,\n centerX: number,\n centerY: number,\n) => {\n let centerAngle =\n (5 * Math.PI) / 2 + Math.atan2(pointerY - centerY, pointerX - centerX);\n if (shouldRotateWithDiscreteAngle) {\n centerAngle += SHIFT_LOCKING_ANGLE / 2;\n centerAngle -= centerAngle % SHIFT_LOCKING_ANGLE;\n }\n\n elements\n .filter((element) => !isFrameLikeElement(element))\n .forEach((element) => {\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const origAngle =\n originalElements.get(element.id)?.angle ?? element.angle;\n const [rotatedCX, rotatedCY] = rotate(\n cx,\n cy,\n centerX,\n centerY,\n centerAngle + origAngle - element.angle,\n );\n mutateElement(\n element,\n {\n x: element.x + (rotatedCX - cx),\n y: element.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n },\n false,\n );\n updateBoundElements(element, elementsMap, {\n simultaneouslyUpdated: elements,\n });\n\n const boundText = getBoundTextElement(element, elementsMap);\n if (boundText && !isArrowElement(element)) {\n mutateElement(\n boundText,\n {\n x: boundText.x + (rotatedCX - cx),\n y: boundText.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n },\n false,\n );\n }\n });\n\n Scene.getScene(elements[0])?.informMutation();\n};\n\nexport const getResizeOffsetXY = (\n transformHandleType: MaybeTransformHandleType,\n selectedElements: NonDeletedExcalidrawElement[],\n elementsMap: ElementsMap,\n x: number,\n y: number,\n): [number, number] => {\n const [x1, y1, x2, y2] =\n selectedElements.length === 1\n ? getElementAbsoluteCoords(selectedElements[0], elementsMap)\n : getCommonBounds(selectedElements);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const angle = selectedElements.length === 1 ? selectedElements[0].angle : 0;\n [x, y] = rotate(x, y, cx, cy, -angle);\n switch (transformHandleType) {\n case \"n\":\n return rotate(x - (x1 + x2) / 2, y - y1, 0, 0, angle);\n case \"s\":\n return rotate(x - (x1 + x2) / 2, y - y2, 0, 0, angle);\n case \"w\":\n return rotate(x - x1, y - (y1 + y2) / 2, 0, 0, angle);\n case \"e\":\n return rotate(x - x2, y - (y1 + y2) / 2, 0, 0, angle);\n case \"nw\":\n return rotate(x - x1, y - y1, 0, 0, angle);\n case \"ne\":\n return rotate(x - x2, y - y1, 0, 0, angle);\n case \"sw\":\n return rotate(x - x1, y - y2, 0, 0, angle);\n case \"se\":\n return rotate(x - x2, y - y2, 0, 0, angle);\n default:\n return [0, 0];\n }\n};\n\nexport const getResizeArrowDirection = (\n transformHandleType: MaybeTransformHandleType,\n element: NonDeleted<ExcalidrawLinearElement>,\n): \"origin\" | \"end\" => {\n const [, [px, py]] = element.points;\n const isResizeEnd =\n (transformHandleType === \"nw\" && (px < 0 || py < 0)) ||\n (transformHandleType === \"ne\" && px >= 0) ||\n (transformHandleType === \"sw\" && px <= 0) ||\n (transformHandleType === \"se\" && (px > 0 || py > 0));\n return isResizeEnd ? \"end\" : \"origin\";\n};\n", "import { updateBoundElements } from \"./binding\";\nimport { Bounds, getCommonBounds } from \"./bounds\";\nimport { mutateElement } from \"./mutateElement\";\nimport { getPerfectElementSize } from \"./sizeHelpers\";\nimport { NonDeletedExcalidrawElement } from \"./types\";\nimport { AppState, PointerDownState } from \"../types\";\nimport { getBoundTextElement } from \"./textElement\";\nimport { getGridPoint } from \"../math\";\nimport Scene from \"../scene/Scene\";\nimport { isArrowElement, isFrameLikeElement } from \"./typeChecks\";\n\nexport const dragSelectedElements = (\n pointerDownState: PointerDownState,\n selectedElements: NonDeletedExcalidrawElement[],\n offset: { x: number; y: number },\n appState: AppState,\n scene: Scene,\n snapOffset: {\n x: number;\n y: number;\n },\n gridSize: AppState[\"gridSize\"],\n) => {\n // we do not want a frame and its elements to be selected at the same time\n // but when it happens (due to some bug), we want to avoid updating element\n // in the frame twice, hence the use of set\n const elementsToUpdate = new Set<NonDeletedExcalidrawElement>(\n selectedElements,\n );\n const frames = selectedElements\n .filter((e) => isFrameLikeElement(e))\n .map((f) => f.id);\n\n if (frames.length > 0) {\n for (const element of scene.getNonDeletedElements()) {\n if (element.frameId !== null && frames.includes(element.frameId)) {\n elementsToUpdate.add(element);\n }\n }\n }\n\n const commonBounds = getCommonBounds(\n Array.from(elementsToUpdate).map(\n (el) => pointerDownState.originalElements.get(el.id) ?? el,\n ),\n );\n const adjustedOffset = calculateOffset(\n commonBounds,\n offset,\n snapOffset,\n gridSize,\n );\n\n elementsToUpdate.forEach((element) => {\n updateElementCoords(pointerDownState, element, adjustedOffset);\n if (\n // skip arrow labels since we calculate its position during render\n !isArrowElement(element)\n ) {\n const textElement = getBoundTextElement(\n element,\n scene.getNonDeletedElementsMap(),\n );\n if (textElement) {\n updateElementCoords(pointerDownState, textElement, adjustedOffset);\n }\n }\n updateBoundElements(element, scene.getElementsMapIncludingDeleted(), {\n simultaneouslyUpdated: Array.from(elementsToUpdate),\n });\n });\n};\n\nconst calculateOffset = (\n commonBounds: Bounds,\n dragOffset: { x: number; y: number },\n snapOffset: { x: number; y: number },\n gridSize: AppState[\"gridSize\"],\n): { x: number; y: number } => {\n const [x, y] = commonBounds;\n let nextX = x + dragOffset.x + snapOffset.x;\n let nextY = y + dragOffset.y + snapOffset.y;\n\n if (snapOffset.x === 0 || snapOffset.y === 0) {\n const [nextGridX, nextGridY] = getGridPoint(\n x + dragOffset.x,\n y + dragOffset.y,\n gridSize,\n );\n\n if (snapOffset.x === 0) {\n nextX = nextGridX;\n }\n\n if (snapOffset.y === 0) {\n nextY = nextGridY;\n }\n }\n return {\n x: nextX - x,\n y: nextY - y,\n };\n};\n\nconst updateElementCoords = (\n pointerDownState: PointerDownState,\n element: NonDeletedExcalidrawElement,\n dragOffset: { x: number; y: number },\n) => {\n const originalElement =\n pointerDownState.originalElements.get(element.id) ?? element;\n\n const nextX = originalElement.x + dragOffset.x;\n const nextY = originalElement.y + dragOffset.y;\n\n mutateElement(element, {\n x: nextX,\n y: nextY,\n });\n};\n\nexport const getDragOffsetXY = (\n selectedElements: NonDeletedExcalidrawElement[],\n x: number,\n y: number,\n): [number, number] => {\n const [x1, y1] = getCommonBounds(selectedElements);\n return [x - x1, y - y1];\n};\n\nexport const dragNewElement = (\n draggingElement: NonDeletedExcalidrawElement,\n elementType: AppState[\"activeTool\"][\"type\"],\n originX: number,\n originY: number,\n x: number,\n y: number,\n width: number,\n height: number,\n shouldMaintainAspectRatio: boolean,\n shouldResizeFromCenter: boolean,\n /** whether to keep given aspect ratio when `isResizeWithSidesSameLength` is\n true */\n widthAspectRatio?: number | null,\n originOffset: {\n x: number;\n y: number;\n } | null = null,\n) => {\n if (shouldMaintainAspectRatio && draggingElement.type !== \"selection\") {\n if (widthAspectRatio) {\n height = width / widthAspectRatio;\n } else {\n // Depending on where the cursor is at (x, y) relative to where the starting point is\n // (originX, originY), we use ONLY width or height to control size increase.\n // This allows the cursor to always \"stick\" to one of the sides of the bounding box.\n if (Math.abs(y - originY) > Math.abs(x - originX)) {\n ({ width, height } = getPerfectElementSize(\n elementType,\n height,\n x < originX ? -width : width,\n ));\n } else {\n ({ width, height } = getPerfectElementSize(\n elementType,\n width,\n y < originY ? -height : height,\n ));\n }\n\n if (height < 0) {\n height = -height;\n }\n }\n }\n\n let newX = x < originX ? originX - width : originX;\n let newY = y < originY ? originY - height : originY;\n\n if (shouldResizeFromCenter) {\n width += width;\n height += height;\n newX = originX - width / 2;\n newY = originY - height / 2;\n }\n\n if (width !== 0 && height !== 0) {\n mutateElement(draggingElement, {\n x: newX + (originOffset?.x ?? 0),\n y: newY + (originOffset?.y ?? 0),\n width,\n height,\n });\n }\n};\n", "import { NonDeletedExcalidrawElement } from \"./types\";\nimport { getSelectedElements } from \"../scene\";\nimport { UIAppState } from \"../types\";\n\nexport const showSelectedShapeActions = (\n appState: UIAppState,\n elements: readonly NonDeletedExcalidrawElement[],\n) =>\n Boolean(\n !appState.viewModeEnabled &&\n ((appState.activeTool.type !== \"custom\" &&\n (appState.editingElement ||\n (appState.activeTool.type !== \"selection\" &&\n appState.activeTool.type !== \"eraser\" &&\n appState.activeTool.type !== \"hand\" &&\n appState.activeTool.type !== \"laser\"))) ||\n getSelectedElements(elements, appState).length),\n );\n"],
5
+ "mappings": "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",
6
+ "names": ["module", "CRC32", "table", "n", "L", "i", "chunk", "i", "encode", "i", "decode", "i", "i", "chunk", "i", "l", "chunk", "s", "n", "n", "require_crc32", "n", "t", "i", "s", "b", "n", "deflate", "i", "require_deflate", "chunk", "deflate", "from", "CODES", "CODES", "inflate", "from", "n", "require_inflate", "chunk", "inflate", "deflate", "inflate", "sanitizeUrl", "b", "from", "newValues", "a", "b", "i", "line", "polygon", "i", "ae", "ce", "o", "helper", "o", "line", "line", "o", "o2", "o", "o2", "helper", "o", "line", "offset", "i", "helper", "o", "offset", "line", "i", "helper", "o", "line", "i", "o", "helper", "i", "i", "curve", "sign", "t", "i", "r1", "r2", "o", "i", "o2", "offset", "b", "s", "i", "b", "s", "distance", "t", "a", "b", "offset", "s", "e", "i", "distance", "normalized", "o", "distance", "i", "canvas", "o", "o", "canvas", "e", "t", "n", "i", "o", "s", "I", "nvector", "a", "b", "n", "sign", "a", "b", "from", "line", "point", "line", "point", "distance", "point", "line", "from", "point", "distance", "nvector", "distance", "distanceSq", "distanceToSegmentSq", "t", "lerp", "a", "b", "flatness", "offset", "getPointsOnBezierCurveWithSplitting", "simplify", "simplifyPoints", "s", "e", "i", "pointsOnBezierCurves", "rotate", "point", "rotate", "distance", "a", "b", "t", "A", "B", "i", "C", "from", "rectangle", "rotate", "translate", "from", "a", "b", "line", "n", "point", "i", "distance", "offset", "ellipse", "equation", "t", "pointsOnBezierCurves", "element", "point", "distance", "t", "rotate", "a", "b", "newTextElement", "shouldMaintainAspectRatio", "line", "index", "canvas", "offset", "i", "t", "getSvgPathFromStroke", "A", "B", "point", "simplify", "point", "normalize", "translation", "rotate", "i", "se", "n", "s", "e", "point", "t", "i", "a", "b", "minX", "minY", "maxX", "maxY", "equation", "distance", "rotate", "coords", "curve", "from", "rotate", "point", "a", "b", "distance", "i", "t", "equation", "point", "selectGroupsForSelectedElements", "random", "offset", "x1", "y1", "x2", "y2", "element", "opacity", "i", "e", "e", "mimeTypes", "rotate", "canvas", "GridLineColor", "canvas", "canvas", "i", "defaultAppState", "elements", "defaultAppState", "getNonDeletedElements", "s", "line", "hasHeader", "index", "isRTL", "exportToCanvas", "canvas", "exportToSvg", "centerPoint", "point", "line", "a", "b", "l", "e", "element", "e", "getNonDeletedElements", "a", "shouldRotateWithDiscreteAngle", "shouldResizeFromCenter", "shouldMaintainAspectRatio", "rotate", "i", "offset", "e", "shouldMaintainAspectRatio", "shouldResizeFromCenter", "i", "s", "getNonDeletedElements", "canvas", "i", "i", "decodePng", "chunk", "tEXt", "encodePng"]
7
+ }