@liquid-js/qr-code-styling 3.0.0-4 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +137 -137
- package/lib/qr-code-styling-node.js.map +1 -1
- package/lib/qr-code-styling.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qr-code-styling-node.js","sources":["../src/types/qrcode.ts","../src/utils/merge.ts","../src/utils/gradient.ts","../src/utils/options.ts","../src/utils/qrcode.ts","../src/utils/svg.ts","../src/figures/corner-dot.ts","../src/figures/corner-square.ts","../src/figures/dot.ts","../src/tools/browser-image-tools.ts","../src/core/qr-svg.ts","../src/utils/image.ts","../src/core/qr-code-styling.ts","../src/tools/browser-utils.ts","../src/node.ts"],"sourcesContent":["type TypeNumber =\n | 0\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9\n | 10\n | 11\n | 12\n | 13\n | 14\n | 15\n | 16\n | 17\n | 18\n | 19\n | 20\n | 21\n | 22\n | 23\n | 24\n | 25\n | 26\n | 27\n | 28\n | 29\n | 30\n | 31\n | 32\n | 33\n | 34\n | 35\n | 36\n | 37\n | 38\n | 39\n | 40;\n\nconst TypeNumber = Array(41)\n .fill(0)\n .map((_, i) => i) as unknown as {\n [P in TypeNumber]: P;\n};\n\nexport { TypeNumber };\n\nexport enum ErrorCorrectionLevel {\n L = \"L\",\n M = \"M\",\n Q = \"Q\",\n H = \"H\"\n}\n\nexport enum Mode {\n numeric = \"Numeric\",\n alphanumeric = \"Alphanumeric\",\n byte = \"Byte\",\n kanji = \"Kanji\",\n unicode = \"Unicode\"\n}\n\nexport interface QRCode {\n addData(data: string, mode?: Mode.alphanumeric | Mode.byte | Mode.kanji | Mode.numeric): void;\n make(): void;\n getModuleCount(): number;\n isDark(row: number, col: number): boolean;\n}\n","const isObject = (obj: Record<string, unknown> | undefined): boolean =>\n !!obj && typeof obj === \"object\" && !Array.isArray(obj);\n\nexport type UnknownObject =\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n }\n | undefined;\n\nexport function mergeDeep(target: UnknownObject, ...sources: UnknownObject[]): UnknownObject {\n if (!sources.length) return target;\n const source = sources.shift();\n if (source === undefined || !isObject(target) || !isObject(source)) return target;\n target = { ...target };\n Object.keys(source).forEach((key: string): void => {\n const targetValue = target[key];\n const sourceValue = source[key];\n\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\n target[key] = sourceValue;\n } else if (isObject(targetValue) && isObject(sourceValue)) {\n target[key] = mergeDeep(Object.assign({}, targetValue), sourceValue);\n } else {\n target[key] = sourceValue;\n }\n });\n\n return mergeDeep(target, ...sources);\n}\n","export enum GradientType {\n radial = \"radial\",\n linear = \"linear\"\n}\n\nexport type Gradient = {\n /**\n * Type of gradient spread\n *\n * @default GradientType.linear\n */\n type: `${GradientType}`;\n /**\n * Rotation of gradient (in radians, Math.PI === 180 degrees)\n *\n * @default 0\n */\n rotation?: number;\n /** Gradient colors. */\n colorStops: {\n /** Position of color in gradient range */\n offset: number;\n /** Color of stop in gradient range */\n color: string;\n }[];\n};\n\nexport function sanitizeGradient(gradient: Gradient): Gradient {\n const newGradient = { ...gradient };\n\n if (!newGradient.colorStops || !newGradient.colorStops.length) {\n throw \"Field 'colorStops' is required in gradient\";\n }\n\n if (newGradient.rotation) {\n newGradient.rotation = Number(newGradient.rotation);\n } else {\n newGradient.rotation = 0;\n }\n\n newGradient.colorStops = newGradient.colorStops.map((colorStop: { offset: number; color: string }) => ({\n ...colorStop,\n offset: Number(colorStop.offset)\n }));\n\n return newGradient;\n}\n","import { browserImageTools } from \"../tools/browser-image-tools.js\";\nimport { ErrorCorrectionLevel, TypeNumber } from \"../types/qrcode.js\";\nimport { Gradient, sanitizeGradient } from \"./gradient.js\";\n\nexport enum DotType {\n dot = \"dot\",\n randomDot = \"random-dot\",\n rounded = \"rounded\",\n verticalLine = \"vertical-line\",\n horizontalLine = \"horizontal-line\",\n classy = \"classy\",\n classyRounded = \"classy-rounded\",\n square = \"square\",\n smallSquare = \"small-square\",\n extraRounded = \"extra-rounded\",\n diamond = \"diamond\"\n}\n\nexport enum CornerDotType {\n dot = \"dot\",\n square = \"square\",\n heart = \"heart\",\n extraRounded = \"extra-rounded\",\n classy = \"classy\",\n outpoint = \"outpoint\",\n inpoint = \"inpoint\"\n}\n\nexport enum CornerSquareType {\n dot = \"dot\",\n square = \"square\",\n extraRounded = \"extra-rounded\",\n classy = \"classy\",\n outpoint = \"outpoint\",\n inpoint = \"inpoint\"\n}\n\nexport enum ShapeType {\n square = \"square\",\n circle = \"circle\"\n}\n\nexport interface Options {\n /** Use a custom DOM domplementation */\n document: Document;\n /** Use a custom image fetching & serializaton implementation */\n imageTools?: typeof browserImageTools;\n /** @ignore */\n width: number;\n /** @ignore */\n height: number;\n /** The data will be encoded in the QR code */\n data: string;\n /** The image will be copied to the center of the QR code */\n image?: string | Buffer | Blob;\n /**\n * QR code shape\n *\n * @default ShapeType.square\n */\n shape: `${ShapeType}`;\n /** Options will be passed to `qrcode-generator` lib */\n qrOptions: {\n typeNumber: TypeNumber;\n mode?: `${Mode}`;\n /** @default ErrorCorrectionLevel.Q */\n errorCorrectionLevel: `${ErrorCorrectionLevel}`;\n };\n imageOptions: {\n /**\n * Hide all dots covered by the image\n *\n * @default true\n */\n hideBackgroundDots: boolean;\n /**\n * Coefficient of the image size\n *\n * @default 0.4\n */\n imageSize: number;\n /**\n * Margin of the image (in blocks)\n *\n * @default 0\n */\n margin: number;\n /**\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLImageElement/crossOrigin)\n */\n crossOrigin?: string;\n };\n dotsOptions: {\n /**\n * QR dot size (in pixels)\n *\n * @default 10\n */\n size: number;\n /**\n * Color of QR dots\n *\n * @default \"#000\"\n */\n color: string;\n /** Gradient of QR dots */\n gradient?: Gradient;\n /**\n * Style of QR dots\n *\n * @default DotType.square\n */\n type: `${DotType}`;\n };\n /** Corners Square options, omitted values match dots */\n cornersSquareOptions?: {\n /** Color of Corners Square */\n color?: string;\n /** Gradient of Corners Square */\n gradient?: Gradient;\n /** Style of Corners Square */\n type?: `${CornerSquareType}`;\n };\n /** Corners Dot options, omitted values match squares */\n cornersDotOptions?: {\n /** Color of Corners Dot */\n color?: string;\n /** Gradient of Corners Dot */\n gradient?: Gradient;\n /** Style of Corners Dot */\n type?: `${CornerDotType}`;\n };\n /** QR background styling options, false to disable background */\n backgroundOptions?:\n | {\n /** Background roundnes, from 0 (square) to 1 (circle) */\n round?: number;\n /** Background color */\n color?: string;\n /** Background Gradient */\n gradient?: Gradient;\n /**\n * Margin (in blocks) between background and the QR code\n *\n * @default 0\n */\n margin?: number;\n }\n | false;\n /** `import { stringToBytesFuncs } from \"@liquid-js/qr-code-styling/kanji\";` to add Kanji support */\n stringToBytesFuncs?: { [encoding: string]: (s: string) => number[] };\n}\n\nexport const defaultOptions: Options = {\n document: undefined as never,\n shape: ShapeType.square,\n width: undefined as never,\n height: undefined as never,\n data: \"\",\n qrOptions: {\n typeNumber: TypeNumber[0],\n mode: undefined,\n errorCorrectionLevel: ErrorCorrectionLevel.Q\n },\n imageOptions: {\n hideBackgroundDots: true,\n imageSize: 0.4,\n crossOrigin: undefined,\n margin: 0\n },\n dotsOptions: {\n type: DotType.square,\n color: \"#000\",\n size: 10\n }\n};\n\nexport function sanitizeOptions(options: Options): Options {\n const newOptions = { ...options };\n\n newOptions.imageOptions = {\n ...newOptions.imageOptions,\n hideBackgroundDots: Boolean(newOptions.imageOptions.hideBackgroundDots),\n imageSize: Math.min(1, Number(newOptions.imageOptions.imageSize)) || 1,\n margin: Number(newOptions.imageOptions.margin)\n };\n\n newOptions.dotsOptions = {\n ...newOptions.dotsOptions\n };\n if (newOptions.dotsOptions.gradient) {\n newOptions.dotsOptions.gradient = sanitizeGradient(newOptions.dotsOptions.gradient);\n }\n // Ensure integer dot size\n newOptions.dotsOptions.size = Math.round(Math.max(0, newOptions.dotsOptions.size) || 10);\n\n if (newOptions.cornersSquareOptions) {\n newOptions.cornersSquareOptions = {\n ...newOptions.cornersSquareOptions\n };\n if (newOptions.cornersSquareOptions.gradient) {\n newOptions.cornersSquareOptions.gradient = sanitizeGradient(newOptions.cornersSquareOptions.gradient);\n }\n }\n\n if (newOptions.cornersDotOptions) {\n newOptions.cornersDotOptions = {\n ...newOptions.cornersDotOptions\n };\n if (newOptions.cornersDotOptions.gradient) {\n newOptions.cornersDotOptions.gradient = sanitizeGradient(newOptions.cornersDotOptions.gradient);\n }\n }\n\n if (newOptions.backgroundOptions) {\n newOptions.backgroundOptions = {\n ...newOptions.backgroundOptions\n };\n if (newOptions.backgroundOptions.gradient) {\n newOptions.backgroundOptions.gradient = sanitizeGradient(newOptions.backgroundOptions.gradient);\n }\n }\n\n if (!newOptions.document) newOptions.document = document;\n\n return newOptions;\n}\n","import { ErrorCorrectionLevel, Mode } from \"../types/qrcode.js\";\n\nexport const ErrorCorrectionPercents = {\n [ErrorCorrectionLevel.L]: 0.07,\n [ErrorCorrectionLevel.M]: 0.15,\n [ErrorCorrectionLevel.Q]: 0.25,\n [ErrorCorrectionLevel.H]: 0.3\n};\n\nexport function getMode(data: string): Mode {\n switch (true) {\n case /^[0-9]*$/.test(data):\n return Mode.numeric;\n case /^[0-9A-Z $%*+\\-./:]*$/.test(data):\n return Mode.alphanumeric;\n // eslint-disable-next-line no-control-regex\n case /[^\\u0000-\\u00ff]/.test(data):\n return Mode.unicode;\n default:\n return Mode.byte;\n }\n}\n","const rx = /\\.?0+$/;\n\nexport function numToAttr(value: number) {\n return value.toFixed(7).replace(rx, \"\");\n}\n\nexport function svgPath(strings: TemplateStringsArray, ...values: unknown[]) {\n return strings\n .reduce((t, v, i) => {\n let p: unknown = \"\";\n if (i) p = values[i - 1];\n if (typeof p == \"number\") p = numToAttr(p);\n return `${t}${p}${v}`;\n }, \"\")\n .trim()\n .replace(/[\\s\\n\\r]+/gim, \" \");\n}\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from \"../types/helper.js\";\nimport { CornerDotType } from \"../utils/options.js\";\nimport { numToAttr, svgPath } from \"../utils/svg.js\";\n\nexport class QRCornerDot {\n private _element?: SVGElement;\n\n get element() {\n return this._element;\n }\n\n constructor(\n private readonly type: `${CornerDotType}`,\n private readonly document: Document\n ) {}\n\n draw(args: DrawArgs): void {\n const type = this.type;\n let drawFunction;\n\n switch (type) {\n case CornerDotType.square:\n drawFunction = this.drawSquare;\n break;\n case CornerDotType.heart:\n drawFunction = this.drawHeart;\n break;\n case CornerDotType.extraRounded:\n drawFunction = this.drawRounded;\n break;\n case CornerDotType.classy:\n drawFunction = this.drawClassy;\n break;\n case CornerDotType.inpoint:\n drawFunction = this.drawInpoint;\n break;\n case CornerDotType.outpoint:\n drawFunction = this.drawOutpoint;\n break;\n case CornerDotType.dot:\n default:\n drawFunction = this.drawDot;\n }\n\n drawFunction.call(this, args);\n }\n\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\n const cx = x + size / 2;\n const cy = y + size / 2;\n\n draw();\n this._element?.setAttribute(\"transform\", `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`);\n }\n\n private basicDot(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n this._element.setAttribute(\"cx\", numToAttr(x + size / 2));\n this._element.setAttribute(\"cy\", numToAttr(y + size / 2));\n this._element.setAttribute(\"r\", numToAttr(size / 2));\n }\n });\n }\n\n private basicSquare(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n this._element.setAttribute(\"x\", numToAttr(x));\n this._element.setAttribute(\"y\", numToAttr(y));\n this._element.setAttribute(\"width\", numToAttr(size));\n this._element.setAttribute(\"height\", numToAttr(size));\n }\n });\n }\n\n private basicHeart(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const path = [\n \"M\",\n 0.925,\n 0.3538125,\n \"c\",\n 0,\n 0.0325869,\n -0.0054931,\n 0.0644619,\n -0.0164688,\n 0.095625,\n \"S\",\n 0.87825,\n 0.5147812,\n 0.850625,\n 0.5519688,\n \"C\",\n 0.823,\n 0.5891563,\n 0.7858125,\n 0.631125,\n 0.7390625,\n 0.677875,\n \"S\",\n 0.6331632,\n 0.7802256,\n 0.561625,\n 0.8446875,\n \"L\",\n 0.5,\n 0.8999375,\n \"l\",\n -0.061625,\n -0.05525,\n \"C\",\n 0.3668368,\n 0.7802256,\n 0.3076875,\n 0.724625,\n 0.2609375,\n 0.677875,\n \"S\",\n 0.177,\n 0.5891563,\n 0.149375,\n 0.5519688,\n \"S\",\n 0.1024444,\n 0.4806007,\n 0.0914688,\n 0.4494375,\n \"S\",\n 0.075,\n 0.3863994,\n 0.075,\n 0.3538125,\n \"C\",\n 0.075,\n 0.2872256,\n 0.0973125,\n 0.231625,\n 0.1419375,\n 0.187,\n \"S\",\n 0.2421631,\n 0.1200625,\n 0.30875,\n 0.1200625,\n \"c\",\n 0.0368369,\n 0,\n 0.0718994,\n 0.0077881,\n 0.1051875,\n 0.023375,\n \"S\",\n 0.4759131,\n 0.1809756,\n 0.5,\n 0.2093125,\n \"c\",\n 0.0240868,\n -0.0283369,\n 0.0527744,\n -0.0502881,\n 0.0860625,\n -0.065875,\n \"c\",\n 0.0332882,\n -0.0155869,\n 0.0683507,\n -0.023375,\n 0.1051875,\n -0.023375,\n \"c\",\n 0.0665869,\n 0,\n 0.1221875,\n 0.0223125,\n 0.1668125,\n 0.0669375,\n \"S\",\n 0.925,\n 0.2872256,\n 0.925,\n 0.3538125,\n \"z\"\n ];\n let move = false;\n let i = 0;\n this._element.setAttribute(\n \"d\",\n path\n .map((v) => {\n if (typeof v == \"string\") {\n i = 0;\n move = v.toUpperCase() == v;\n return v;\n }\n i++;\n v = v * size;\n if (move) {\n v += i % 2 == 1 ? x : y;\n }\n return numToAttr(v);\n })\n .join(\" \")\n );\n }\n\n private basicRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n this._element.setAttribute(\"x\", numToAttr(x));\n this._element.setAttribute(\"y\", numToAttr(y));\n this._element.setAttribute(\"width\", numToAttr(size));\n this._element.setAttribute(\"height\", numToAttr(size));\n this._element.setAttribute(\"rx\", numToAttr(size / 4));\n this._element.setAttribute(\"ry\", numToAttr(size / 4));\n }\n });\n }\n\n private basicClassy(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y + 2.5 * dotSize}\n v ${2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\n h ${4.5 * dotSize}\n v ${-4.5 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\n h ${-2 * dotSize}\n H ${x}\n z`\n );\n }\n });\n }\n\n private basicInpoint(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y + dotSize / 2}\n v ${dotSize / 4}\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${dotSize / 4}, ${dotSize / 4}\n h ${(dotSize / 4) * 3}\n v ${(-dotSize / 4) * 3}\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${-dotSize / 4}, ${-dotSize / 4}\n h ${-dotSize / 2}\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${-dotSize / 4}, ${dotSize / 4}\n z`\n );\n }\n });\n }\n\n private drawDot({ x, y, size, rotation }: DrawArgs): void {\n this.basicDot({ x, y, size, rotation });\n }\n\n private drawSquare({ x, y, size, rotation }: DrawArgs): void {\n this.basicSquare({ x, y, size, rotation });\n }\n\n private drawHeart({ x, y, size, rotation }: DrawArgs): void {\n const scaleFactor = 0.2;\n this.basicHeart({\n x: x - (scaleFactor * size) / 2,\n y: y - (scaleFactor * size) / 2,\n size: size * (1 + scaleFactor),\n rotation\n });\n }\n\n private drawRounded({ x, y, size, rotation }: DrawArgs): void {\n this.basicRounded({ x, y, size, rotation });\n }\n\n private drawClassy({ x, y, size, rotation }: DrawArgs): void {\n this.basicClassy({ x, y, size, rotation });\n }\n\n private drawInpoint({ x, y, size, rotation }: DrawArgs): void {\n this.basicInpoint({ x, y, size, rotation });\n }\n\n private drawOutpoint({ x, y, size, rotation }: DrawArgs): void {\n this.basicInpoint({ x, y, size, rotation: (rotation || 0) + Math.PI });\n }\n}\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from \"../types/helper.js\";\nimport { CornerSquareType } from \"../utils/options.js\";\nimport { numToAttr, svgPath } from \"../utils/svg.js\";\n\nexport class QRCornerSquare {\n private _element?: SVGElement;\n\n get element() {\n return this._element;\n }\n\n constructor(\n private readonly type: `${CornerSquareType}`,\n private readonly document: Document\n ) {}\n\n draw(args: DrawArgs): void {\n const type = this.type;\n let drawFunction;\n\n switch (type) {\n case CornerSquareType.square:\n drawFunction = this.drawSquare;\n break;\n case CornerSquareType.extraRounded:\n drawFunction = this.drawExtraRounded;\n break;\n case CornerSquareType.classy:\n drawFunction = this.drawClassy;\n break;\n case CornerSquareType.outpoint:\n drawFunction = this.drawOutpoint;\n break;\n case CornerSquareType.inpoint:\n drawFunction = this.drawInpoint;\n break;\n case CornerSquareType.dot:\n default:\n drawFunction = this.drawDot;\n }\n\n drawFunction.call(this, args);\n }\n\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\n const cx = x + size / 2;\n const cy = y + size / 2;\n\n draw();\n this._element?.setAttribute(\"transform\", `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`);\n }\n\n private basicDot(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x + size / 2} ${y}\n a ${size / 2} ${size / 2} 0 1 0 0.1 0\n z\n m 0 ${dotSize}\n a ${size / 2 - dotSize} ${size / 2 - dotSize} 0 1 1 -0.1 0\n Z`\n );\n }\n });\n }\n\n private basicSquare(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y}\n v ${size}\n h ${size}\n v ${-size}\n z\n M ${x + dotSize} ${y + dotSize}\n h ${size - 2 * dotSize}\n v ${size - 2 * dotSize}\n h ${-size + 2 * dotSize}\n z`\n );\n }\n });\n }\n\n private basicExtraRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y + 2.5 * dotSize}\n v ${2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\n h ${2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${-dotSize * 2.5}\n v ${-2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\n h ${-2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${dotSize * 2.5}\n z\n M ${x + 2.5 * dotSize} ${y + dotSize}\n h ${2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\n v ${2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${dotSize * 1.5}\n h ${-2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\n v ${-2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${-dotSize * 1.5}\n z`\n );\n }\n });\n }\n\n private basicClassy(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y + 2.5 * dotSize}\n v ${2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\n h ${4.5 * dotSize}\n v ${-4.5 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\n h ${-2 * dotSize}\n H ${x}\n z\n M ${x + 2.5 * dotSize} ${y + dotSize}\n h ${2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\n v ${3.5 * dotSize}\n h ${-3.5 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\n v ${-3.5 * dotSize}\n z`\n );\n }\n });\n }\n\n private basicInpoint(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n const dotSize = size / 7;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y + 2.5 * dotSize}\n v ${2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\n h ${4.5 * dotSize}\n v ${-4.5 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\n h ${-2 * dotSize}\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${dotSize * 2.5}\n z\n M ${x + 2.5 * dotSize} ${y + dotSize}\n h ${2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\n v ${3.5 * dotSize}\n h ${-3.5 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\n v ${-2 * dotSize}\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${-dotSize * 1.5}\n z`\n );\n }\n });\n }\n\n private drawDot({ x, y, size, rotation }: DrawArgs): void {\n this.basicDot({ x, y, size, rotation });\n }\n\n private drawSquare({ x, y, size, rotation }: DrawArgs): void {\n this.basicSquare({ x, y, size, rotation });\n }\n\n private drawExtraRounded({ x, y, size, rotation }: DrawArgs): void {\n this.basicExtraRounded({ x, y, size, rotation });\n }\n\n private drawClassy({ x, y, size, rotation }: DrawArgs): void {\n this.basicClassy({ x, y, size, rotation });\n }\n\n private drawInpoint({ x, y, size, rotation }: DrawArgs): void {\n this.basicInpoint({ x, y, size, rotation });\n }\n\n private drawOutpoint({ x, y, size, rotation }: DrawArgs): void {\n this.basicInpoint({ x, y, size, rotation: (rotation || 0) + Math.PI });\n }\n}\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from \"../types/helper.js\";\nimport { DotType } from \"../utils/options.js\";\nimport { numToAttr, svgPath } from \"../utils/svg.js\";\n\nexport class QRDot {\n private _element?: SVGElement;\n\n get element() {\n return this._element;\n }\n\n constructor(\n private readonly type: `${DotType}`,\n private readonly document: Document\n ) {}\n\n draw(args: DrawArgs): void {\n const type = this.type;\n let drawFunction;\n\n switch (type) {\n case DotType.dot:\n drawFunction = this.drawDot;\n break;\n case DotType.randomDot:\n drawFunction = this.drawRandomDot;\n break;\n case DotType.classy:\n drawFunction = this.drawClassy;\n break;\n case DotType.classyRounded:\n drawFunction = this.drawClassyRounded;\n break;\n case DotType.rounded:\n drawFunction = this.drawRounded;\n break;\n case DotType.verticalLine:\n drawFunction = this.drawVerticalLine;\n break;\n case DotType.horizontalLine:\n drawFunction = this.drawHorizontalLine;\n break;\n case DotType.extraRounded:\n drawFunction = this.drawExtraRounded;\n break;\n case DotType.diamond:\n drawFunction = this.drawDiamond;\n break;\n case DotType.smallSquare:\n drawFunction = this.drawSmallSquare;\n break;\n case DotType.square:\n default:\n drawFunction = this.drawSquare;\n }\n\n drawFunction.call(this, args);\n }\n\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\n const cx = x + size / 2;\n const cy = y + size / 2;\n\n draw();\n this._element?.setAttribute(\"transform\", `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`);\n }\n\n private basicDot(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n this._element.setAttribute(\"cx\", numToAttr(x + size / 2));\n this._element.setAttribute(\"cy\", numToAttr(y + size / 2));\n this._element.setAttribute(\"r\", numToAttr(size / 2));\n }\n });\n }\n\n private basicSquare(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n this._element.setAttribute(\"x\", numToAttr(x));\n this._element.setAttribute(\"y\", numToAttr(y));\n this._element.setAttribute(\"width\", numToAttr(size));\n this._element.setAttribute(\"height\", numToAttr(size));\n }\n });\n }\n\n //if rotation === 0 - right side is rounded\n private basicSideRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y}\n v ${size}\n h ${size / 2}\n a ${size / 2} ${size / 2}, 0, 0, 0, 0 ${-size}\n z`\n );\n }\n });\n }\n\n //if rotation === 0 - top right corner is rounded\n private basicCornerRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y}\n v ${size}\n h ${size}\n v ${-size / 2}\n a ${size / 2} ${size / 2}, 0, 0, 0, ${-size / 2} ${-size / 2}\n z`\n );\n }\n });\n }\n\n //if rotation === 0 - top right corner is rounded\n private basicCornerExtraRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y}\n v ${size}\n h ${size}\n a ${size} ${size}, 0, 0, 0, ${-size} ${-size}\n z`\n );\n }\n });\n }\n\n //if rotation === 0 - left bottom and right top corners are rounded\n private basicCornersRounded(args: BasicFigureDrawArgs): void {\n const { size, x, y } = args;\n\n this.rotateFigure({\n ...args,\n draw: () => {\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n this._element.setAttribute(\n \"d\",\n svgPath`M ${x} ${y}\n v ${size / 2}\n a ${size / 2} ${size / 2}, 0, 0, 0, ${size / 2} ${size / 2}\n h ${size / 2}\n v ${-size / 2}\n a ${size / 2} ${size / 2}, 0, 0, 0, ${-size / 2} ${-size / 2}\n z`\n );\n }\n });\n }\n\n private drawDot({ x, y, size }: DrawArgs): void {\n this.basicDot({ x, y, size, rotation: 0 });\n }\n\n private drawRandomDot({ x, y, size }: DrawArgs): void {\n const randomFactor = Math.random() * (1 - 0.75) + 0.75;\n this.basicDot({ x, y, size: size * randomFactor, rotation: 0 });\n }\n\n private drawSquare({ x, y, size }: DrawArgs): void {\n this.basicSquare({ x, y, size, rotation: 0 });\n }\n\n private drawSmallSquare({ x, y, size }: DrawArgs): void {\n const originalSize = size;\n\n size = originalSize * 0.7;\n x = x + originalSize * 0.15;\n y = y + originalSize * 0.15;\n\n this.basicSquare({ x, y, size, rotation: 0 });\n }\n\n private drawDiamond({ x, y, size }: DrawArgs): void {\n this.basicSquare({ x, y, size, rotation: Math.PI / 4 });\n }\n\n private drawRounded({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (neighborsCount === 0) {\n this.basicDot({ x, y, size, rotation: 0 });\n return;\n }\n\n if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\n this.basicSquare({ x, y, size, rotation: 0 });\n return;\n }\n\n if (neighborsCount === 2) {\n let rotation = 0;\n\n if (leftNeighbor && topNeighbor) {\n rotation = Math.PI / 2;\n } else if (topNeighbor && rightNeighbor) {\n rotation = Math.PI;\n } else if (rightNeighbor && bottomNeighbor) {\n rotation = -Math.PI / 2;\n }\n\n this.basicCornerRounded({ x, y, size, rotation });\n return;\n }\n\n if (neighborsCount === 1) {\n let rotation = 0;\n\n if (topNeighbor) {\n rotation = Math.PI / 2;\n } else if (rightNeighbor) {\n rotation = Math.PI;\n } else if (bottomNeighbor) {\n rotation = -Math.PI / 2;\n }\n\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n }\n\n private drawVerticalLine({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (\n neighborsCount === 0 ||\n (leftNeighbor && !(topNeighbor || bottomNeighbor)) ||\n (rightNeighbor && !(topNeighbor || bottomNeighbor))\n ) {\n this.basicDot({ x, y, size, rotation: 0 });\n return;\n }\n\n if (topNeighbor && bottomNeighbor) {\n this.basicSquare({ x, y, size, rotation: 0 });\n return;\n }\n\n if (topNeighbor && !bottomNeighbor) {\n const rotation = Math.PI / 2;\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n\n if (bottomNeighbor && !topNeighbor) {\n const rotation = -Math.PI / 2;\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n }\n\n private drawHorizontalLine({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (\n neighborsCount === 0 ||\n (topNeighbor && !(leftNeighbor || rightNeighbor)) ||\n (bottomNeighbor && !(leftNeighbor || rightNeighbor))\n ) {\n this.basicDot({ x, y, size, rotation: 0 });\n return;\n }\n\n if (leftNeighbor && rightNeighbor) {\n this.basicSquare({ x, y, size, rotation: 0 });\n return;\n }\n\n if (leftNeighbor && !rightNeighbor) {\n const rotation = 0;\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n\n if (rightNeighbor && !leftNeighbor) {\n const rotation = Math.PI;\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n }\n\n private drawExtraRounded({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (neighborsCount === 0) {\n this.basicDot({ x, y, size, rotation: 0 });\n return;\n }\n\n if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\n this.basicSquare({ x, y, size, rotation: 0 });\n return;\n }\n\n if (neighborsCount === 2) {\n let rotation = 0;\n\n if (leftNeighbor && topNeighbor) {\n rotation = Math.PI / 2;\n } else if (topNeighbor && rightNeighbor) {\n rotation = Math.PI;\n } else if (rightNeighbor && bottomNeighbor) {\n rotation = -Math.PI / 2;\n }\n\n this.basicCornerExtraRounded({ x, y, size, rotation });\n return;\n }\n\n if (neighborsCount === 1) {\n let rotation = 0;\n\n if (topNeighbor) {\n rotation = Math.PI / 2;\n } else if (rightNeighbor) {\n rotation = Math.PI;\n } else if (bottomNeighbor) {\n rotation = -Math.PI / 2;\n }\n\n this.basicSideRounded({ x, y, size, rotation });\n return;\n }\n }\n\n private drawClassy({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (neighborsCount === 0) {\n this.basicCornersRounded({ x, y, size, rotation: Math.PI / 2 });\n return;\n }\n\n if (!leftNeighbor && !topNeighbor) {\n this.basicCornerRounded({ x, y, size, rotation: -Math.PI / 2 });\n return;\n }\n\n if (!rightNeighbor && !bottomNeighbor) {\n this.basicCornerRounded({ x, y, size, rotation: Math.PI / 2 });\n return;\n }\n\n this.basicSquare({ x, y, size, rotation: 0 });\n }\n\n private drawClassyRounded({ x, y, size, getNeighbor }: DrawArgs): void {\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n if (neighborsCount === 0) {\n this.basicCornersRounded({ x, y, size, rotation: Math.PI / 2 });\n return;\n }\n\n if (!leftNeighbor && !topNeighbor) {\n this.basicCornerExtraRounded({ x, y, size, rotation: -Math.PI / 2 });\n return;\n }\n\n if (!rightNeighbor && !bottomNeighbor) {\n this.basicCornerExtraRounded({ x, y, size, rotation: Math.PI / 2 });\n return;\n }\n\n this.basicSquare({ x, y, size, rotation: 0 });\n }\n}\n","export const browserImageTools = {\n toDataURL(url: string | Buffer | Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n if (typeof url == \"string\") {\n const xhr = new XMLHttpRequest();\n xhr.onload = function () {\n const reader = new FileReader();\n reader.onloadend = function () {\n resolve(reader.result as string);\n };\n reader.readAsDataURL(xhr.response);\n };\n xhr.onerror = xhr.onabort = xhr.ontimeout = reject;\n xhr.open(\"GET\", url);\n xhr.responseType = \"blob\";\n xhr.send();\n } else {\n const reader = new FileReader();\n reader.onloadend = function () {\n resolve(reader.result as string);\n };\n reader.readAsDataURL(url as Blob);\n }\n });\n },\n getSize(src: string | Blob | Buffer, crossOrigin?: string): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n\n if (crossOrigin === \"string\") {\n image.crossOrigin = crossOrigin;\n }\n\n image.onload = (): void => {\n resolve({ width: image.width, height: image.height });\n };\n image.onerror = image.onabort = reject;\n\n if (typeof src == \"string\") image.src = src;\n else\n browserImageTools\n .toDataURL(src)\n .then((url) => (image.src = url))\n .catch(reject);\n });\n }\n};\n","import { QRCornerDot } from \"../figures/corner-dot.js\";\nimport { QRCornerSquare } from \"../figures/corner-square.js\";\nimport { QRDot } from \"../figures/dot.js\";\nimport { browserImageTools } from \"../tools/browser-image-tools.js\";\nimport { Gradient, GradientType } from \"../utils/gradient.js\";\nimport { calculateImageSize } from \"../utils/image.js\";\nimport { Options, ShapeType } from \"../utils/options.js\";\nimport { numToAttr } from \"../utils/svg.js\";\n\nconst squareMask = [\n [1, 1, 1, 1, 1, 1, 1],\n [1, 0, 0, 0, 0, 0, 1],\n [1, 0, 0, 0, 0, 0, 1],\n [1, 0, 0, 0, 0, 0, 1],\n [1, 0, 0, 0, 0, 0, 1],\n [1, 0, 0, 0, 0, 0, 1],\n [1, 1, 1, 1, 1, 1, 1]\n];\n\nconst dotMask = [\n [0, 0, 0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0, 0, 0],\n [0, 0, 1, 1, 1, 0, 0],\n [0, 0, 1, 1, 1, 0, 0],\n [0, 0, 1, 1, 1, 0, 0],\n [0, 0, 0, 0, 0, 0, 0],\n [0, 0, 0, 0, 0, 0, 0]\n];\n\nconst alignmentCount = [\n [35, 49],\n [28, 36],\n [21, 25],\n [14, 16],\n [7, 9],\n [2, 4],\n [1, 1]\n];\n\nexport class QRSVG {\n private _element: SVGElement;\n\n get element() {\n return this._element;\n }\n\n private defs: SVGElement;\n\n private backgroundMask?: SVGElement;\n private backgroundMaskGroup?: SVGElement;\n\n private dotsMask?: SVGElement;\n private dotsMaskGroup?: SVGElement;\n\n private qr?: QRCode;\n private document: Document;\n private imageTools: typeof browserImageTools;\n\n constructor(\n private options: Pick<\n Options,\n | \"width\"\n | \"height\"\n | \"document\"\n | \"imageTools\"\n | \"image\"\n | \"imageOptions\"\n | \"dotsOptions\"\n | \"cornersDotOptions\"\n | \"cornersSquareOptions\"\n | \"backgroundOptions\"\n | \"shape\"\n > & { errorCorrectionPercent: number }\n ) {\n this.document = options.document;\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n const width = numToAttr(options.width);\n const height = numToAttr(options.height);\n this._element.setAttribute(\"width\", width);\n this._element.setAttribute(\"height\", height);\n this._element.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n this.defs = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\");\n this._element.appendChild(this.defs);\n this.imageTools = options.imageTools || browserImageTools;\n }\n\n get width(): number {\n return this.options.width;\n }\n\n get height(): number {\n return this.options.height;\n }\n\n async drawQR(qr: QRCode): Promise<void> {\n const count = qr.getModuleCount();\n const typeNumber = parseInt(((count - 17) / 4).toFixed(0), 10);\n const dotSize = this.options.dotsOptions.size;\n let drawImageSize = {\n hideXDots: 0,\n hideYDots: 0,\n width: 0,\n height: 0\n };\n\n this.qr = qr;\n\n if (this.options.image) {\n //We need it to get image size\n const size = await this.imageTools.getSize(this.options.image, this.options.imageOptions.crossOrigin);\n const { imageOptions, errorCorrectionPercent } = this.options;\n const coverLevel = imageOptions.imageSize * errorCorrectionPercent;\n const alignment = alignmentCount.find((v) => v[0] <= typeNumber) || [0, 0];\n const maxHiddenDots = Math.floor(coverLevel * (count * count - 3 * 8 * 8 - 2 * (count - 16) - alignment[1] * 25));\n\n drawImageSize = calculateImageSize({\n originalWidth: size.width,\n originalHeight: size.height,\n maxHiddenDots,\n maxHiddenAxisDots: count - 14,\n dotSize,\n margin: imageOptions.margin\n });\n }\n\n this.drawBackground();\n this.drawDots((i: number, j: number): boolean => {\n if (this.options.imageOptions.hideBackgroundDots) {\n if (\n i >= (count - drawImageSize.hideXDots) / 2 &&\n i < (count + drawImageSize.hideXDots) / 2 &&\n j >= (count - drawImageSize.hideYDots) / 2 &&\n j < (count + drawImageSize.hideYDots) / 2\n ) {\n return false;\n }\n }\n\n if (squareMask[i]?.[j] || squareMask[i - count + 7]?.[j] || squareMask[i]?.[j - count + 7]) {\n return false;\n }\n\n if (dotMask[i]?.[j] || dotMask[i - count + 7]?.[j] || dotMask[i]?.[j - count + 7]) {\n return false;\n }\n\n return true;\n });\n this.drawCorners();\n\n if (this.options.image && drawImageSize.width > 0 && drawImageSize.height > 0) {\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize });\n }\n }\n\n drawBackground(): void {\n const element = this._element;\n const options = this.options;\n\n if (element && options.backgroundOptions) {\n const gradientOptions = options.backgroundOptions.gradient;\n const color = options.backgroundOptions.color;\n\n this.createColor({\n options: gradientOptions,\n color: color,\n additionalRotation: 0,\n x: 0,\n y: 0,\n height: options.height,\n width: options.width,\n name: \"background-color\"\n });\n\n const size = Math.min(options.width, options.height);\n const element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n [this.backgroundMask, this.backgroundMaskGroup] = this.createMask(\"mask-background-color\");\n this.defs.appendChild(this.backgroundMask);\n\n element.setAttribute(\"x\", numToAttr((options.width - size) / 2));\n element.setAttribute(\"y\", numToAttr((options.height - size) / 2));\n element.setAttribute(\"width\", numToAttr(size));\n element.setAttribute(\"height\", numToAttr(size));\n element.setAttribute(\"rx\", numToAttr((size / 2) * (options.backgroundOptions.round || 0)));\n\n this.backgroundMaskGroup.appendChild(element);\n }\n }\n\n drawDots(filter?: (i: number, j: number) => boolean): void {\n if (!this.qr) {\n throw \"QR code is not defined\";\n }\n\n const options = this.options;\n const count = this.qr.getModuleCount();\n\n if (count > options.width || count > options.height) {\n throw \"The canvas is too small.\";\n }\n\n const minSize = Math.min(options.width, options.height);\n const dotSize = this.options.dotsOptions.size;\n const xBeginning = Math.floor((options.width - count * dotSize) / 2);\n const yBeginning = Math.floor((options.height - count * dotSize) / 2);\n const dot = new QRDot(options.dotsOptions.type, this.document);\n\n [this.dotsMask, this.dotsMaskGroup] = this.createMask(\"mask-dot-color\");\n this.defs.appendChild(this.dotsMask);\n\n for (let i = 0; i < count; i++) {\n for (let j = 0; j < count; j++) {\n if (filter && !filter(i, j)) {\n continue;\n }\n if (!this.qr?.isDark(j, i)) {\n continue;\n }\n\n dot.draw({\n x: xBeginning + i * dotSize,\n y: yBeginning + j * dotSize,\n size: dotSize,\n getNeighbor: (xOffset: number, yOffset: number): boolean => {\n if (i + xOffset < 0 || j + yOffset < 0 || i + xOffset >= count || j + yOffset >= count) return false;\n if (filter && !filter(i + xOffset, j + yOffset)) return false;\n return !!this.qr && this.qr.isDark(j + yOffset, i + xOffset);\n }\n });\n\n if (dot.element && this.dotsMask) {\n this.dotsMaskGroup.appendChild(dot.element);\n }\n }\n }\n\n let colorX = xBeginning;\n let colorY = yBeginning;\n let colorCount = count;\n\n if (options.shape === ShapeType.circle) {\n const margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0;\n const additionalDots = Math.floor((minSize / dotSize - count - 2 * margin) / 2);\n const fakeCount = count + additionalDots * 2;\n const xFakeBeginning = xBeginning - additionalDots * dotSize;\n const yFakeBeginning = yBeginning - additionalDots * dotSize;\n colorX = xFakeBeginning;\n colorY = yFakeBeginning;\n colorCount = count + additionalDots * 2;\n const fakeMatrix: number[][] = [];\n const center = Math.floor(fakeCount / 2);\n\n for (let i = 0; i < fakeCount; i++) {\n fakeMatrix[i] = [];\n for (let j = 0; j < fakeCount; j++) {\n if (\n i >= additionalDots - 1 &&\n i <= fakeCount - additionalDots &&\n j >= additionalDots - 1 &&\n j <= fakeCount - additionalDots\n ) {\n fakeMatrix[i][j] = 0;\n continue;\n }\n\n if (Math.sqrt((i - center) * (i - center) + (j - center) * (j - center)) > center) {\n fakeMatrix[i][j] = 0;\n continue;\n }\n\n //Get random dots from QR code to show it outside of QR code\n fakeMatrix[i][j] = this.qr.isDark(\n j - 2 * additionalDots < 0 ? j : j >= count ? j - 2 * additionalDots : j - additionalDots,\n i - 2 * additionalDots < 0 ? i : i >= count ? i - 2 * additionalDots : i - additionalDots\n )\n ? 1\n : 0;\n }\n }\n\n for (let i = 0; i < fakeCount; i++) {\n for (let j = 0; j < fakeCount; j++) {\n if (!fakeMatrix[i][j]) continue;\n\n dot.draw({\n x: xFakeBeginning + i * dotSize,\n y: yFakeBeginning + j * dotSize,\n size: dotSize,\n getNeighbor: (xOffset: number, yOffset: number): boolean => {\n return !!fakeMatrix[i + xOffset]?.[j + yOffset];\n }\n });\n if (dot.element && this.dotsMask) {\n this.dotsMaskGroup.appendChild(dot.element);\n }\n }\n }\n }\n\n this.createColor({\n options: options.dotsOptions?.gradient,\n color: options.dotsOptions.color,\n additionalRotation: 0,\n x: colorX,\n y: colorY,\n height: colorCount * dotSize,\n width: colorCount * dotSize,\n name: \"dot-color\"\n });\n }\n\n drawCorners(): void {\n if (!this.qr) {\n throw \"QR code is not defined\";\n }\n\n const element = this._element;\n const options = this.options;\n\n if (!element) {\n throw \"Element code is not defined\";\n }\n\n const count = this.qr.getModuleCount();\n const dotSize = this.options.dotsOptions.size;\n const cornersSquareSize = dotSize * 7;\n const cornersDotSize = dotSize * 3;\n const xBeginning = Math.floor((options.width - count * dotSize) / 2);\n const yBeginning = Math.floor((options.height - count * dotSize) / 2);\n\n [\n [0, 0, 0],\n [1, 0, Math.PI / 2],\n [0, 1, -Math.PI / 2]\n ].forEach(([column, row, rotation]) => {\n const x = xBeginning + column * dotSize * (count - 7);\n const y = yBeginning + row * dotSize * (count - 7);\n let cornersSquareMask = this.dotsMask;\n let cornersSquareMaskGroup = this.dotsMaskGroup;\n let cornersDotMask = this.dotsMask;\n let cornersDotMaskGroup = this.dotsMaskGroup;\n\n if (options.cornersSquareOptions?.gradient || options.cornersSquareOptions?.color) {\n [cornersSquareMask, cornersSquareMaskGroup] = this.createMask(`mask-corners-square-color-${column}-${row}`);\n this.defs.appendChild(cornersSquareMask);\n cornersDotMask = cornersSquareMask;\n cornersDotMaskGroup = cornersSquareMaskGroup;\n\n this.createColor({\n options: options.cornersSquareOptions?.gradient,\n color: options.cornersSquareOptions?.color,\n additionalRotation: rotation,\n x,\n y,\n height: cornersSquareSize,\n width: cornersSquareSize,\n name: `corners-square-color-${column}-${row}`\n });\n }\n\n if (options.cornersSquareOptions?.type) {\n const cornersSquare = new QRCornerSquare(options.cornersSquareOptions.type, this.document);\n\n cornersSquare.draw({\n x,\n y,\n size: cornersSquareSize,\n rotation\n });\n\n if (cornersSquare.element && cornersSquareMaskGroup) {\n cornersSquareMaskGroup.appendChild(cornersSquare.element);\n }\n } else {\n const dot = new QRDot(options.dotsOptions.type, this.document);\n\n for (let i = 0; i < squareMask.length; i++) {\n for (let j = 0; j < squareMask[i].length; j++) {\n if (!squareMask[i]?.[j]) {\n continue;\n }\n\n dot.draw({\n x: x + i * dotSize,\n y: y + j * dotSize,\n size: dotSize,\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!squareMask[i + xOffset]?.[j + yOffset]\n });\n\n if (dot.element && cornersSquareMaskGroup) {\n cornersSquareMaskGroup.appendChild(dot.element);\n }\n }\n }\n }\n\n if (options.cornersDotOptions?.gradient || options.cornersDotOptions?.color) {\n [cornersDotMask, cornersDotMaskGroup] = this.createMask(`mask-corners-dot-color-${column}-${row}`);\n this.defs.appendChild(cornersDotMask);\n\n this.createColor({\n options: options.cornersDotOptions?.gradient,\n color: options.cornersDotOptions?.color,\n additionalRotation: rotation,\n x: x + dotSize * 2,\n y: y + dotSize * 2,\n height: cornersDotSize,\n width: cornersDotSize,\n name: `corners-dot-color-${column}-${row}`\n });\n }\n\n if (options.cornersDotOptions?.type) {\n const cornersDot = new QRCornerDot(options.cornersDotOptions.type, this.document);\n\n cornersDot.draw({\n x: x + dotSize * 2,\n y: y + dotSize * 2,\n size: cornersDotSize,\n rotation\n });\n\n if (cornersDot.element && cornersDotMaskGroup) {\n cornersDotMaskGroup.appendChild(cornersDot.element);\n }\n } else {\n const dot = new QRDot(options.dotsOptions.type, this.document);\n\n for (let i = 0; i < dotMask.length; i++) {\n for (let j = 0; j < dotMask[i].length; j++) {\n if (!dotMask[i]?.[j]) {\n continue;\n }\n\n dot.draw({\n x: x + i * dotSize,\n y: y + j * dotSize,\n size: dotSize,\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!dotMask[i + xOffset]?.[j + yOffset]\n });\n\n if (dot.element && cornersDotMaskGroup) {\n cornersDotMaskGroup.appendChild(dot.element);\n }\n }\n }\n }\n });\n }\n\n async drawImage({\n width,\n height,\n count,\n dotSize\n }: {\n width: number;\n height: number;\n count: number;\n dotSize: number;\n }): Promise<void> {\n const options = this.options;\n const xBeginning = Math.floor((options.width - count * dotSize) / 2);\n const yBeginning = Math.floor((options.height - count * dotSize) / 2);\n const margin = options.imageOptions.margin * dotSize;\n const dx = xBeginning + margin + (count * dotSize - width) / 2;\n const dy = yBeginning + margin + (count * dotSize - height) / 2;\n const dw = width - margin * 2;\n const dh = height - margin * 2;\n\n const imageUrl = await this.imageTools.toDataURL(options.image || \"\");\n let image: SVGElement = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"image\");\n image.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", imageUrl || \"\");\n\n if (imageUrl.startsWith(\"data:image/svg+xml;\")) {\n let data = imageUrl.substring(19);\n const i = data.indexOf(\",\");\n const encoding = data.substring(0, i);\n data = data.substring(i + 1);\n\n switch (encoding) {\n case \"base64\":\n data = typeof atob == \"function\" ? atob(data) : Buffer.from(data, \"base64\").toString(\"utf8\");\n break;\n default:\n data = \"\";\n break;\n }\n\n if (data) {\n const container = new DOMParser().parseFromString(data, \"text/xml\");\n const rootEl = Array.from(container.getElementsByTagName(\"svg\"));\n if (rootEl.length) image = rootEl[0];\n }\n }\n\n image.setAttribute(\"x\", numToAttr(dx));\n image.setAttribute(\"y\", numToAttr(dy));\n image.setAttribute(\"width\", `${numToAttr(dw)}px`);\n image.setAttribute(\"height\", `${numToAttr(dh)}px`);\n\n this._element.appendChild(image);\n }\n\n private createColor({\n options,\n color,\n additionalRotation,\n x,\n y,\n height,\n width,\n name\n }: {\n options?: Gradient;\n color?: string;\n additionalRotation: number;\n x: number;\n y: number;\n height: number;\n width: number;\n name: string;\n }): void {\n const size = width > height ? width : height;\n const rect = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n rect.setAttribute(\"x\", numToAttr(x));\n rect.setAttribute(\"y\", numToAttr(y));\n rect.setAttribute(\"height\", numToAttr(height));\n rect.setAttribute(\"width\", numToAttr(width));\n rect.setAttribute(\"style\", `mask:url(#mask-${name})`);\n\n if (options) {\n let gradient: SVGElement;\n if (options.type === GradientType.radial) {\n gradient = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"radialGradient\");\n gradient.setAttribute(\"id\", name);\n gradient.setAttribute(\"gradientUnits\", \"userSpaceOnUse\");\n gradient.setAttribute(\"fx\", numToAttr(x + width / 2));\n gradient.setAttribute(\"fy\", numToAttr(y + height / 2));\n gradient.setAttribute(\"cx\", numToAttr(x + width / 2));\n gradient.setAttribute(\"cy\", numToAttr(y + height / 2));\n gradient.setAttribute(\"r\", numToAttr(size / 2));\n } else {\n const rotation = ((options.rotation || 0) + additionalRotation) % (2 * Math.PI);\n const positiveRotation = (rotation + 2 * Math.PI) % (2 * Math.PI);\n let x0 = x + width / 2;\n let y0 = y + height / 2;\n let x1 = x + width / 2;\n let y1 = y + height / 2;\n\n if (\n (positiveRotation >= 0 && positiveRotation <= 0.25 * Math.PI) ||\n (positiveRotation > 1.75 * Math.PI && positiveRotation <= 2 * Math.PI)\n ) {\n x0 = x0 - width / 2;\n y0 = y0 - (height / 2) * Math.tan(rotation);\n x1 = x1 + width / 2;\n y1 = y1 + (height / 2) * Math.tan(rotation);\n } else if (positiveRotation > 0.25 * Math.PI && positiveRotation <= 0.75 * Math.PI) {\n y0 = y0 - height / 2;\n x0 = x0 - width / 2 / Math.tan(rotation);\n y1 = y1 + height / 2;\n x1 = x1 + width / 2 / Math.tan(rotation);\n } else if (positiveRotation > 0.75 * Math.PI && positiveRotation <= 1.25 * Math.PI) {\n x0 = x0 + width / 2;\n y0 = y0 + (height / 2) * Math.tan(rotation);\n x1 = x1 - width / 2;\n y1 = y1 - (height / 2) * Math.tan(rotation);\n } else if (positiveRotation > 1.25 * Math.PI && positiveRotation <= 1.75 * Math.PI) {\n y0 = y0 + height / 2;\n x0 = x0 + width / 2 / Math.tan(rotation);\n y1 = y1 - height / 2;\n x1 = x1 - width / 2 / Math.tan(rotation);\n }\n\n gradient = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"linearGradient\");\n gradient.setAttribute(\"id\", name);\n gradient.setAttribute(\"gradientUnits\", \"userSpaceOnUse\");\n gradient.setAttribute(\"x1\", numToAttr(x0));\n gradient.setAttribute(\"y1\", numToAttr(y0));\n gradient.setAttribute(\"x2\", numToAttr(x1));\n gradient.setAttribute(\"y2\", numToAttr(y1));\n }\n\n options.colorStops.forEach(({ offset, color }: { offset: number; color: string }) => {\n const stop = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"stop\");\n stop.setAttribute(\"offset\", `${numToAttr(100 * offset)}%`);\n stop.setAttribute(\"stop-color\", color);\n gradient.appendChild(stop);\n });\n\n rect.setAttribute(\"fill\", `url(#${name})`);\n this.defs.appendChild(gradient);\n } else if (color) {\n rect.setAttribute(\"fill\", color);\n }\n\n this._element.appendChild(rect);\n }\n\n private createMask(id: string) {\n const options = this.options;\n\n const mask = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"mask\");\n mask.setAttribute(\"id\", id);\n mask.setAttribute(\"maskUnits\", \"userSpaceOnUse\");\n mask.setAttribute(\"x\", \"0\");\n mask.setAttribute(\"y\", \"0\");\n mask.setAttribute(\"width\", numToAttr(options.width));\n mask.setAttribute(\"height\", numToAttr(options.height));\n\n const group = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n group.setAttribute(\"fill\", \"#fff\");\n mask.appendChild(group);\n\n return [mask, group];\n }\n}\n","interface ImageSizeOptions {\n originalHeight: number;\n originalWidth: number;\n maxHiddenDots: number;\n maxHiddenAxisDots?: number;\n dotSize: number;\n margin: number;\n}\n\ninterface ImageSizeResult {\n height: number;\n width: number;\n hideYDots: number;\n hideXDots: number;\n}\n\nexport function calculateImageSize({\n originalHeight,\n originalWidth,\n maxHiddenDots,\n maxHiddenAxisDots,\n dotSize,\n margin\n}: ImageSizeOptions): ImageSizeResult {\n const hideDots = { x: 0, y: 0 };\n const imageSize = { x: 0, y: 0 };\n\n if (\n originalHeight <= 0 ||\n originalWidth <= 0 ||\n maxHiddenDots <= 0 ||\n dotSize <= 0 ||\n 4 * margin ** 2 > maxHiddenDots\n ) {\n return {\n height: 0,\n width: 0,\n hideYDots: 0,\n hideXDots: 0\n };\n }\n\n //If set, ensure maxHiddenAxisDots is odd and at least 1\n if (maxHiddenAxisDots && maxHiddenAxisDots % 2 == 0) maxHiddenAxisDots = Math.max(1, maxHiddenAxisDots - 1);\n\n //Determine the bigger and smaller image dimension\n const dimMax = Math.max(originalWidth, originalHeight);\n const dimMin = Math.min(originalWidth, originalHeight);\n\n //Find max image size along the bigger dimension\n let lower = 0,\n upper = (maxHiddenAxisDots || maxHiddenDots) - 2 * margin;\n do {\n const size = lower + (upper - lower) / 2;\n let dotsMax = Math.max(1, Math.ceil(size + 2 * margin));\n if (dotsMax % 2 == 0) dotsMax++;\n let dotsMin = Math.max(1, Math.ceil((size * dimMin) / dimMax + 2 * margin));\n if (dotsMin % 2 == 0) dotsMin++;\n\n if (dotsMax * dotsMin > maxHiddenDots) upper = size;\n else lower = size;\n } while (Math.abs(lower - upper) > 0.001);\n\n //Calculate how many dots the given size corresponds to\n const size = lower;\n let hideMax = Math.max(1, Math.ceil(size + 2 * margin));\n if (hideMax % 2 == 0) hideMax++;\n let hideMin = Math.max(1, Math.ceil((size * dimMin) / dimMax + 2 * margin));\n if (hideMin % 2 == 0) hideMin++;\n\n //Set hidden dots along bigger and smaller dimension to the right axis\n if (originalWidth > originalHeight) {\n hideDots.x = hideMax;\n hideDots.y = hideMin;\n } else {\n hideDots.x = hideMin;\n hideDots.y = hideMax;\n }\n\n //Fit image to the hidden dots\n const maxW = (hideDots.x - 2 * margin) * dotSize;\n const maxH = (hideDots.y - 2 * margin) * dotSize;\n imageSize.x = maxW;\n imageSize.y = (maxW * originalHeight) / originalWidth;\n if (imageSize.y > maxH) {\n imageSize.y = maxH;\n imageSize.x = (maxH * originalWidth) / originalHeight;\n }\n\n return {\n height: Math.round(imageSize.y + 2 * margin * dotSize),\n width: Math.round(imageSize.x + 2 * margin * dotSize),\n hideYDots: hideDots.y,\n hideXDots: hideDots.x\n };\n}\n","import qrcode from \"qrcode-generator\";\nimport { RecursivePartial } from \"../types/helper.js\";\nimport { Mode } from \"../types/qrcode.js\";\nimport { mergeDeep } from \"../utils/merge.js\";\nimport { Options, ShapeType, defaultOptions, sanitizeOptions } from \"../utils/options.js\";\nimport { ErrorCorrectionPercents, getMode } from \"../utils/qrcode.js\";\nimport { QRSVG } from \"./qr-svg.js\";\n\nexport type ExtensionFunction = (svg: SVGElement, options: RecursivePartial<Options>) => void;\n\nexport class QRCodeStyling {\n private options: Options;\n private container?: HTMLElement;\n private qr?: QRCode;\n private extension?: ExtensionFunction;\n private svgDrawingPromise?: Promise<void>;\n private qrSVG?: QRSVG;\n\n get size() {\n if (this.qrSVG)\n return {\n width: this.qrSVG.width,\n height: this.qrSVG.height\n };\n return undefined;\n }\n\n constructor(options?: RecursivePartial<Options>) {\n this.options = options ? sanitizeOptions(mergeDeep(defaultOptions, options) as Options) : defaultOptions;\n this.update();\n }\n\n update(\n /** The same options as for initialization */\n options?: RecursivePartial<Options>\n ): void {\n if (this.container) this.container.innerHTML = \"\";\n\n this.options = options ? sanitizeOptions(mergeDeep(this.options, options) as Options) : this.options;\n\n if (!this.options.data) {\n return;\n }\n\n if (this.options.stringToBytesFuncs) {\n Object.assign(qrcode.stringToBytesFuncs, this.options.stringToBytesFuncs);\n delete this.options.stringToBytesFuncs;\n }\n\n this.qr = qrcode(this.options.qrOptions.typeNumber, this.options.qrOptions.errorCorrectionLevel);\n let mode = this.options.qrOptions.mode || getMode(this.options.data);\n if (mode == Mode.unicode) {\n qrcode.stringToBytes = qrcode.stringToBytesFuncs[\"UTF-8\"];\n mode = Mode.byte;\n } else {\n qrcode.stringToBytes = qrcode.stringToBytesFuncs[\"default\"];\n }\n this.qr.addData(this.options.data, mode);\n this.qr.make();\n\n this.setupSvg();\n\n this.append(this.container);\n }\n\n append(\n /** This container will be used for appending of the QR code */\n container?: HTMLElement\n ): void {\n if (!container) {\n return;\n }\n\n if (this.qrSVG?.element) {\n container.appendChild(this.qrSVG.element);\n }\n\n this.container = container;\n }\n\n /**\n *\n * @example\n *\n * ```js\n * const extension = (svg, options) => {\n * const { width, height } = options;\n * const size = Math.min(width, height);\n * const border = options.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n * const borderAttributes = {\n * fill: \"none\",\n * x: (width - size + 40) / 2,\n * y: (height - size + 40) / 2,\n * width: size - 40,\n * height: size - 40,\n * stroke: \"black\",\n * \"stroke-width\": 40,\n * rx: 100\n * };\n * Object.keys(borderAttributes).forEach((attribute) => {\n * border.setAttribute(attribute, borderAttributes[attribute]);\n * });\n * svg.appendChild(border);\n * };\n * ```\n */\n applyExtension(\n /** Extension is a function that takes svg and previously applied options and modifies an svg */\n extension: ExtensionFunction\n ): void {\n if (!extension) {\n throw \"Extension function should be defined.\";\n }\n\n this.extension = extension;\n this.update();\n }\n\n deleteExtension(): void {\n this.extension = undefined;\n this.update();\n }\n\n async serialize(): Promise<string | undefined> {\n if (!this.qr) throw \"QR code is empty\";\n\n if (!this.qrSVG?.element || !this.svgDrawingPromise) {\n this.setupSvg();\n }\n await this.svgDrawingPromise;\n\n if (!this.qrSVG?.element) {\n return;\n }\n\n const serializer = new XMLSerializer();\n let source = serializer.serializeToString(this.qrSVG.element);\n\n source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source;\n return source;\n }\n\n private setupSvg(): void {\n if (!this.qr) {\n return;\n }\n const count = Math.ceil((this.options.shape == ShapeType.circle ? Math.sqrt(2) : 1) * this.qr.getModuleCount());\n const margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0;\n const size = Math.ceil(this.options.dotsOptions.size * (count + 2 * margin));\n this.qrSVG = new QRSVG({\n ...this.options,\n width: size,\n height: size,\n errorCorrectionPercent: ErrorCorrectionPercents[this.options.qrOptions.errorCorrectionLevel]\n });\n\n this.svgDrawingPromise = this.qrSVG.drawQR(this.qr).then(() => {\n if (!this.qrSVG?.element) return;\n this.extension?.(this.qrSVG.element, this.options);\n });\n }\n}\n","import { QRCodeStyling } from \"../core/qr-code-styling.js\";\nimport { RecursivePartial } from \"../types/helper.js\";\nimport { CanvasOptions, defaultCanvasOptions, sanitizeCanvasOptions } from \"../utils/canvas-options.js\";\nimport { mergeDeep } from \"../utils/merge.js\";\n\nexport enum FileExtension {\n svg = \"svg\",\n png = \"png\",\n jpeg = \"jpeg\",\n webp = \"webp\"\n}\n\nexport function drawToCanvas(\n qrCode: QRCodeStyling,\n options?: RecursivePartial<CanvasOptions>\n): { canvas: HTMLCanvasElement; canvasDrawingPromise: Promise<void> | undefined } | undefined {\n const { width, height, margin } = options\n ? sanitizeCanvasOptions(mergeDeep(defaultCanvasOptions, options) as CanvasOptions)\n : defaultCanvasOptions;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const size = Math.min(width, height) - 2 * margin;\n\n const canvasDrawingPromise = qrCode.serialize().then((xml) => {\n if (!xml) return;\n const svg64 = btoa(xml);\n const image64 = \"data:image/svg+xml;base64,\" + svg64;\n const image = new Image();\n\n return new Promise<void>((resolve, reject) => {\n image.onload = (): void => {\n // Ensure pixel-perfect rendering of SVG to avoid artefact, then downscale to requested size\n const aaFactor = Math.ceil((2 * size) / Math.min(image.width, image.height));\n let aaCanvas: HTMLCanvasElement | OffscreenCanvas;\n try {\n aaCanvas = new OffscreenCanvas(image.width * aaFactor, image.height * aaFactor);\n } catch (_) {\n // Fallback to regular canvas element\n aaCanvas = document.createElement(\"canvas\");\n aaCanvas.width = image.width * aaFactor;\n aaCanvas.height = image.height * aaFactor;\n }\n aaCanvas.getContext(\"2d\")?.drawImage(image, 0, 0, aaCanvas.width, aaCanvas.height);\n\n canvas?.getContext(\"2d\")?.drawImage(aaCanvas, (width - size) / 2, (height - size) / 2, size, size);\n resolve();\n };\n image.onerror = image.onabort = reject;\n\n image.src = image64;\n });\n });\n\n return { canvas, canvasDrawingPromise };\n}\n\nexport async function download(\n qrCode: QRCodeStyling,\n downloadOptions: `${FileExtension}` | { name?: string; extension: `${FileExtension}` },\n options?: RecursivePartial<CanvasOptions>\n): Promise<void> {\n let extension: `${FileExtension}` = FileExtension.png;\n let name = \"qr\";\n\n //TODO remove deprecated code in the v2\n if (typeof downloadOptions === \"string\") {\n extension = downloadOptions;\n console.warn(\n \"Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument\"\n );\n } else if (typeof downloadOptions === \"object\" && downloadOptions !== null) {\n if (downloadOptions.name) {\n name = downloadOptions.name;\n }\n if (downloadOptions.extension) {\n extension = downloadOptions.extension;\n }\n }\n\n if (extension.toLowerCase() === \"svg\") {\n let source = await qrCode.serialize();\n source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source;\n const url = \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(source);\n downloadURI(url, `${name}.svg`);\n } else {\n const res = drawToCanvas(qrCode, options);\n if (!res) return;\n const { canvas, canvasDrawingPromise } = res;\n await canvasDrawingPromise;\n const url = canvas.toDataURL(`image/${extension}`);\n downloadURI(url, `${name}.${extension}`);\n }\n}\n\nexport function downloadURI(uri: string, name: string): void {\n const link = document.createElement(\"a\");\n link.download = name;\n link.href = uri;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n","import { DOMImplementation, DOMParser, XMLSerializer } from \"@xmldom/xmldom\";\nimport { fileTypeFromBuffer } from \"file-type\";\nimport sharp from \"sharp\";\nimport { QRCodeStyling as _QRCodeStyling } from \"./core/qr-code-styling.js\";\nimport type * as _browserUtils from \"./tools/browser-utils.js\";\nimport { RecursivePartial } from \"./types/helper.js\";\nimport { Options } from \"./utils/options.js\";\nexport { type ExtensionFunction } from \"./core/qr-code-styling.js\";\nexport { FileExtension } from \"./tools/browser-utils.js\";\nexport { type RecursivePartial } from \"./types/helper.js\";\nexport { ErrorCorrectionLevel, Mode, TypeNumber } from \"./types/qrcode.js\";\nexport { type CanvasOptions } from \"./utils/canvas-options.js\";\nexport { GradientType, type Gradient } from \"./utils/gradient.js\";\nexport { CornerDotType, CornerSquareType, DotType, ShapeType, type Options } from \"./utils/options.js\";\nexport { ErrorCorrectionPercents } from \"./utils/qrcode.js\";\n\nexport const browserUtils: typeof _browserUtils | undefined = undefined;\n\nexport class QRCodeStyling extends _QRCodeStyling {\n constructor(options: RecursivePartial<Options>) {\n const dom = new DOMImplementation().createDocument(null, null);\n const imageCache = new Map<string, Promise<{ contentType?: string | null; data: Buffer }>>();\n\n const loadImage = async function (url: string | Buffer | Blob) {\n if (typeof url == \"string\") {\n let pr = imageCache.get(url);\n if (pr) return pr;\n pr = fetch(url).then((res) =>\n res\n .arrayBuffer()\n .then((buff) => Buffer.from(buff))\n .then(async (data) => ({\n contentType: res.headers.get(\"Content-Type\") || (await fileTypeFromBuffer(data).then((r) => r?.mime)),\n data\n }))\n );\n imageCache.set(url, pr);\n return pr;\n } else {\n const buff = Buffer.from(url as Buffer);\n const mime = await fileTypeFromBuffer(buff).then((r) => r?.mime);\n return {\n contentType: mime,\n data: buff\n };\n }\n };\n\n global.XMLSerializer = XMLSerializer;\n global.DOMParser = DOMParser;\n\n super({\n ...options,\n document: options.document || dom,\n imageTools: options.imageTools || {\n toDataURL: (url: string | Buffer | Blob): Promise<string> =>\n loadImage(url).then(\n ({ contentType, data }) =>\n `data:${contentType?.replace(\"application/xml\", \"image/svg+xml\")};base64,${data.toString(\"base64\")}`\n ),\n getSize: async (src: string | Blob | Buffer): Promise<{ width: number; height: number }> => {\n const { data } = Buffer.isBuffer(options.image) ? { data: options.image } : await loadImage(src);\n const meta = await sharp(data).metadata();\n return {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n width: meta.width!,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n height: meta.height!\n };\n }\n }\n });\n }\n}\n"],"names":["TypeNumber","Array","fill","map","_","i","ErrorCorrectionLevel","Mode","L","M","Q","H","numeric","alphanumeric","kanji","unicode","isObject","obj","isArray","target","sources","length","undefined","source","keys","forEach","key","targetValue","sourceValue","mergeDeep","Object","assign","GradientType","DotType","CornerDotType","CornerSquareType","ShapeType","sanitizeGradient","gradient","colorStops","newGradient","rotation","Number","colorStop","offset","radial","linear","dot","randomDot","rounded","verticalLine","horizontalLine","classy","classyRounded","square","smallSquare","extraRounded","diamond","heart","outpoint","inpoint","circle","defaultOptions","document","shape","width","height","data","qrOptions","typeNumber","mode","errorCorrectionLevel","imageOptions","hideBackgroundDots","imageSize","crossOrigin","margin","dotsOptions","type","color","size","sanitizeOptions","options","newOptions","Math","min","round","max","cornersSquareOptions","cornersDotOptions","backgroundOptions","ErrorCorrectionPercents","rx","numToAttr","value","toFixed","replace","strings","values","reduce","t","v","p","trim","element","this","_element","constructor","draw","args","drawFunction","drawSquare","drawHeart","drawRounded","drawClassy","drawInpoint","drawOutpoint","drawDot","call","rotateFigure","x","y","cx","cy","setAttribute","PI","basicDot","createElementNS","basicSquare","basicHeart","move","path","toUpperCase","join","basicRounded","basicClassy","svgPath","dotSize","basicInpoint","scaleFactor","drawExtraRounded","basicExtraRounded","drawRandomDot","drawClassyRounded","drawVerticalLine","drawHorizontalLine","drawDiamond","drawSmallSquare","basicSideRounded","basicCornerRounded","basicCornerExtraRounded","basicCornersRounded","random","getNeighbor","leftNeighbor","rightNeighbor","topNeighbor","neighborsCount","bottomNeighbor","leftNeighbor_rotation","browserImageTools","toDataURL","url","Promise","resolve","reject","xhr","XMLHttpRequest","onload","xhr.onload","reader","FileReader","onloadend","reader.onloadend","result","readAsDataURL","response","onerror","onabort","ontimeout","open","responseType","send","getSize","src","image","Image","then","catch","squareMask","dotMask","alignmentCount","defs","appendChild","imageTools","drawQR","qr","parseInt","count","drawImageSize","hideXDots","hideYDots","errorCorrectionPercent","coverLevel","alignment","find","calculateImageSize","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dimMax","dimMin","lower","upper","dotsMax","ceil","dotsMin","abs","hideMax","hideMin","maxW","maxH","floor","drawBackground","drawDots","j","drawCorners","drawImage","createColor","additionalRotation","name","backgroundMask","backgroundMaskGroup","createMask","filter","getModuleCount","minSize","QRDot","dotsMask","dotsMaskGroup","isDark","xBeginning","yBeginning","xOffset","yOffset","colorX","colorY","colorCount","additionalDots","fakeCount","xFakeBeginning","yFakeBeginning","fakeMatrix","center","sqrt","column","row","cornersSquareMask","cornersSquareMaskGroup","cornersDotMask","cornersDotMaskGroup","cornersSquareSize","cornersDotMask_cornersSquare_dot","QRCornerSquare","cornersSquare","cornersDotSize","column_cornersDot","QRCornerDot","cornersDot","dx","dy","dw","dh","setAttributeNS","imageUrl","startsWith","substring","indexOf","encoding","container_data","atob","Buffer","from","toString","container","parseFromString","DOMParser","rootEl","getElementsByTagName","rect","x0","y0","x1","y1","positiveRotation","tan","stop","id","mask","group","qrSVG","update","innerHTML","stringToBytesFuncs","qrcode","getMode","test","byte","stringToBytes","addData","make","setupSvg","append","applyExtension","extension","deleteExtension","serialize","svgDrawingPromise","serializeToString","XMLSerializer","QRSVG","FileExtension","svg","png","jpeg","webp","QRCodeStyling","QRCodeStyling$1","async","loadImage","pr","imageCache","get","fetch","res","arrayBuffer","buff","contentType","headers","fileTypeFromBuffer","r","mime","set","dom","createDocument","DOMImplementation","Map","super","isBuffer","meta","sharp","metadata"],"mappings":";;;;;;;;AA2CA,IAAAA,aAAgBC,MAAQ,IACrBC,KAAK,GACLC,KAAI,CAACC,GAAGC,MAAMA;;IAMLC,sBAOAC;;CAPAD,uBAAAA,yBAAAA,uBAKX,KAJCE,IAAA;AACAF,qBAAAG,IAAA,KACAH,qBAAAI,IAAA,KACAJ,qBAAAK,IAAA;CAGUJ,OAAAA,SAAAA,OAMX,KALCK,UAAA,WACAL,KAAAM,eAAA;AACAN,KAAA,OAAA,QACAA,KAAAO,QAAA,SACAP,KAAAQ,UAAA;;AC/DF,IAAMC,oBACJC,OAAwB,mBAAfA,cAA4BC,QAAaD;;mBAS1BE,WAA0BC;IAC9C,KAACA,QAAQC,QAAQ,OAAOF;IAC5B,aAAYC;IACZ,YAAeE,MAAXC,UAAyBP,SAASG,WAAYH,SAASO,WAC3DJ,SAAS;WAAKA;OACPK,OAAAA,KAAKD,QAAQE,SAASC;0BACVP,2BACAI;QAEPL,MAAAA,QAAQS,gBAAgB1B,MAAMiB,QAAQU,eAC9CT,OAAOO,OAAOE,cACLZ,SAASW,gBAAgBX,SAASY,eAC3CT,OAAOO,OAAOG,UAAUC,OAAOC,OAAO,IAAIJ,cAAcC,eAExDT,OAAOO,OAAOE;AALhB,SASKC,UAAUV,WAAWC,YAf+CD;AAHD;;ICVhEa,cCIAC,SAcAC,eAUAC,kBASAC;;ADVNC,SAAUA,iBAAiBC;IAG3B,6BAFa;WAAQA;OAERC,eAAeC,qBAAYD,WAAWlB,QACrD,MAAM;IAcR,OAVEmB,qBAAYC,WADVD,qBAAYC,WACSC,OAAOF,qBAAYC,YAEnB;IAGbF,qBAAAA,aAAaC,qBAAYD,WAAWpC,KAAKwC,cAAkD;WAClGA;QACHC,QAAQF,OAAOC,UAAUC;UAGpBJ;AAlB0C;;CA3BvCR,eAAAA,iBAAAA,eAGX,KAFCa,SAAA,UACAb,aAAAc,SAAA;CCEUb,UAAAA,YAAAA,UAYX,KAXCc,MAAA,OACAd,QAAAe,YAAA;AACAf,QAAAgB,UAAA,WACAhB,QAAAiB,eAAA,iBACAjB,QAAAkB,iBAAA;AACAlB,QAAAmB,SAAA,UACAnB,QAAAoB,gBAAA,kBACApB,QAAAqB,SAAA;AACArB,QAAAsB,cAAA,gBACAtB,QAAAuB,eAAA,iBACAvB,QAAAwB,UAAA;CAGUvB,gBAAAA,kBAAAA,gBAQX,KAPCa,MAAA,OACAb,cAAAoB,SAAA;AACApB,cAAAwB,QAAA,SACAxB,cAAAsB,eAAA,iBACAtB,cAAAkB,SAAA;AACAlB,cAAAyB,WAAA,YACAzB,cAAA0B,UAAA,YAGUzB,mBAAAA,qBAAAA,mBAOX,KANCY,MAAA;AACAZ,iBAAAmB,SAAA,UACAnB,iBAAAqB,eAAA;AACArB,iBAAAiB,SAAA,UACAjB,iBAAAwB,WAAA,YACAxB,iBAAAyB,UAAA;CAGUxB,YAAAA,cAAAA,YAGX,KAFCkB,SAAA,UACAlB,UAAAyB,SAAA;;AAkHK,IAAAC,iBAAgC;IACrCC,eAAUzC;IACV0C,OAAO5B,UAAUkB;IACjBW,YAAO3C;IACP4C,aAAQ5C;IACR6C,MAAM;IACNC,WAAW;QACTC,YAAYrE,WAAW;QACvBsE,WAAMhD;QACNiD,sBAAsBjE,qBAAqBI;;IAE7C8D,cAAc;QACZC,qBAAoB;QACpBC,WAAW;QACXC,kBAAarD;QACbsD,QAAQ;;IAEVC,aAAa;QACXC,MAAM7C,QAAQqB;QACdyB,OAAO;QACPC,MAAM;;;;AAIJC,SAAUA,gBAAgBC;IAgD9B,6BA/CgB;WAAQA;OAEbV,eAAe;WACrBW,mBAAWX;QACdC,sBAA4BU,mBAAWX,aAAaC;QACpDC,WAAWU,KAAKC,IAAI,GAAG3C,OAAOyC,mBAAWX,aAAaE,eAAe;QACrEE,QAAQlC,OAAOyC,mBAAWX,aAAaI;OAG9BC,mBAAAA,cAAc;WACpBM,mBAAWN;OAEZM,mBAAWN,YAAYvC,aACzB6C,mBAAWN,YAAYvC,WAAWD,iBAAiB8C,mBAAWN,YAAYvC;IAGjEuC,mBAAAA,YAAYG,OAAOI,KAAKE,MAAMF,KAAKG,IAAI,GAAGJ,mBAAWN,YAAYG,SAAS;IAEjFG,mBAAWK,yBACbL,mBAAWK,uBAAuB;WAC7BL,mBAAWK;OAEZL,mBAAWK,qBAAqBlD,aAClC6C,mBAAWK,qBAAqBlD,WAAWD,iBAAiB8C,mBAAWK,qBAAqBlD;IAI5F6C,mBAAWM,sBACbN,mBAAWM,oBAAoB;WAC1BN,mBAAWM;OAEZN,mBAAWM,kBAAkBnD,aAC/B6C,mBAAWM,kBAAkBnD,WAAWD,iBAAiB8C,mBAAWM,kBAAkBnD;IAItF6C,mBAAWO,sBACbP,mBAAWO,oBAAoB;WAC1BP,mBAAWO;OAEZP,mBAAWO,kBAAkBpD,aAC/B6C,mBAAWO,kBAAkBpD,WAAWD,iBAAiB8C,mBAAWO,kBAAkBpD;IAIrF6C,mBAAWpB,aAAUoB,mBAAWpB,WAAWA,WAEzCoB;AAhDuC;;AC/KnC,IAAAQ,0BAA0B;IACrC,CAACrF,qBAAqBE,IAAI;IAC1B,CAACF,qBAAqBG,IAAI;IAC1B,CAACH,qBAAqBI,IAAI;IAC1B,CAACJ,qBAAqBK,IAAI;;;ACN5B,IAAMiF,KAAK;;AAELC,SAAUA,UAAUC;IACxB,OAAOA,MAAMC,QAAQ,GAAGC,QAAQJ,IAAI;AADC;;iBAIfK,YAAkCC;IACjDD,OAAAA,QACJE,QAAO,CAACC,GAAGC,GAAGhG;QACb,IAAIiG,IAAa;QAGjB,OAFAjG,MAAOiG,IAAIJ,OAAO7F,IAAI,KACtB,mBAAAiG,MAA0BA,IAAIT,UAAUS,KACjC,GAAGF,IAAIE,IAAID;AAAlB,QACC,IACFE,OACAP,QAAQ,gBAAgB;AAT8C;;;ICCrE,WAAAQ;QACK,OAAAC,KAAKC;AADH;IAIXC,WAAAA,CACmB7B,MACAf;QADIe,KAAAA,OAAJA,MACQf,KAAAA,WAARA;AAAkB;IAGjC,IAAA6C,CAACC;QAEH,IAAIC;QADM,QAAAL,KAAO3B;UAIV5C,KAAAA,cAAcoB;YACjBwD,eAAeL,KAAKM;YACpB;;UACG7E,KAAAA,cAAcwB;YACjBoD,eAAeL,KAAKO;YACpB;;UACG9E,KAAAA,cAAcsB;YACjBsD,eAAeL,KAAKQ;YACpB;;UACG/E,KAAAA,cAAckB;YACjB0D,eAAeL,KAAKS;YACpB;;UACGhF,KAAAA,cAAc0B;YACjBkD,eAAeL,KAAKU;YACpB;;UACGjF,KAAAA,cAAcyB;YACjBmD,eAAeL,KAAKW;YACpB;;UAEF;YACEN,eAAeL,KAAKY;;QAGxBP,aAAaQ,KAAKb,MAAMI;AA5BP;IA+BXU,YAAAA,EAAeC,GAAAA,MAAGC,GAAAA,MAAGzC,MAAMvC,WAAW,GAAGmE;QAC/Cc,eAAmB,GACnBC,eAAmB,GAEnBf,QACKF,KAAAA,UAAUkB,aAAa,aAAa,UAAU/B,UAAW,MAAMpD,WAAY2C,KAAKyC,OAAOH,QAAMC;AAL3B;IAQzD,QAAAG,CAACjB;QACf,KAAM7B,MAAMwC,GAAGC,KAAQZ;QAElBU,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBAC5EtB,KAAKC,SAASkB,aAAa,MAAM/B,UAAU2B,IAAIxC,OAAO,KACtDyB,KAAKC,SAASkB,aAAa,MAAM/B,UAAU4B,IAAIzC,OAAO;gBACtDyB,KAAKC,SAASkB,aAAa,KAAK/B,UAAUb,OAAO;AAAjD;;AAToC;IAcvB,WAAAgD,CAACnB;QAClB,KAAM7B,MAAMwC,GAAGC,KAAQZ;QAElBU,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASkB,aAAa,KAAK/B,UAAU2B,KACrCd,KAAAA,SAASkB,aAAa,KAAK/B,UAAU4B;gBACrCf,KAAAA,SAASkB,aAAa,SAAS/B,UAAUb,QACzC0B,KAAAA,SAASkB,aAAa,UAAU/B,UAAUb;AAA/C;;AAVuC;IAe3B,UAAAiD,CAACpB;QACjB,KAAM7B,MAAMwC,GAAGC,KAAQZ;QAEvBJ,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;QA6G5E,IAAIG,QAAO,GACP7H,IAAI;QACHqG,KAAAA,SAASkB,aACZ,KA/GWO,EACX,KACA,MACA,UACA,KACA,GACA,WACC,UACD,WACC,UACD,SACA,KACA,QACA,UACA,SACA,UACA,KACA,MACA,UACA,UACA,SACA,UACA,SACA,KACA,UACA,UACA,SACA,UACA,KACA,IACA,UACA,MACC,UACA,QACD,KACA,UACA,UACA,UACA,SACA,UACA,SACA,KACA,MACA,UACA,SACA,UACA,KACA,UACA,UACA,UACA,UACA,KACA,MApDWA,UAsDX,MACA,UACA,KACA,MACA,UACA,UACA,SACA,UACA,MACA,KACA,UACA,UACA,QACA,UACA,KACA,UACA,GACA,UACA,UACA,UACA,SACA,KACA,UACA,UACA,IACA,UACA,KACA,WACC,UACD,WACC,UACD,WACC,SACD,KACA,WACC,UACD,WACC,SACD,WACC,SACD,KACA,UACA,GACA,UACA,UACA,UACA,UACA,KACA,MACA,UACA,MACA,UACA,MAOGhI,KAAKkG,KACY,mBAAhBA,KACEhG,IAAI;QACJ6H,OAAO7B,EAAE+B,iBAAiB/B,GACnBA,MAEThG,KACIgG,KAAIrB,MACRkD,SACE7B,KAAc,KAAThG,IAAI,IAASmH,IAAIC;QAEjB5B,UAAUQ,MAElBgC,KAAK;AAlIgC;IAsIxB,YAAAC,CAACzB;QACnB,KAAM7B,MAAMwC,GAAGC,KAAQZ;QAElBU,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASkB,aAAa,KAAK/B,UAAU2B,KACrCd,KAAAA,SAASkB,aAAa,KAAK/B,UAAU4B;gBACrCf,KAAAA,SAASkB,aAAa,SAAS/B,UAAUb,QACzC0B,KAAAA,SAASkB,aAAa,UAAU/B,UAAUb;gBAC/CyB,KAAKC,SAASkB,aAAa,MAAM/B,UAAUb,OAAO,KAClDyB,KAAKC,SAASkB,aAAa,MAAM/B,UAAUb,OAAO;AAAlD;;AAZwC;IAiB3B,WAAAuD,CAAC1B;QAClB,KAAM7B,MAAMwC,GAAGC,KAAQZ,gBACV7B,OAAO;QACfuC,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASkB,aAAa,aAAa,YACxCnB,KAAKC,SAASkB,aACZ,KACAY,OAAA,KAAYhB,KAAKC,IAAI,MAAMgB,aACvB,IAAIA,aACJ,MAAMA,WAAW,MAAMA,qBAA+B,MAAVA,WAA2B,MAAVA,aAC7D,MAAMA,cACL,MAAMA,aACP,MAAMA,WAAW,MAAMA,qBAAgC,OAAVA,WAA4B,OAAVA,cAC9D,IAAIA,aACLjB;AATN;;AARuC;IAwBzB,YAAAkB,CAAC7B;QACnB,KAAM7B,MAAMwC,GAAGC,KAAQZ;QAGlBU,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASkB,aAAa,aAAa,YACxCnB,KAAKC,SAASkB,aACZ,KACAY,OAAA,KAAYhB,KAAKC,IATPzC,OASqB,OATrBA,OAUI,OAVJA,OAWI,MAXJA,OAWoB,WAXpBA,OAWyC,MAXzCA,OAWyD,OAXzDA,OAYK,IAAK,QAZVA,OAaM,IAAK,OAbXA,OAcI,MAdJA,OAcoB,YAdpBA,OAc0C,OAd1CA,OAc2D,QAd3DA,OAeK,OAfLA,OAgBI,MAhBJA,OASV,YATUA,OAgB0C,MAhB1CA,OAgB0D;AATtE;;AATwC;IAyBtCqC,OAAAA,EAAUG,GAAGC,GAAGzC,MAAMvC;QAC5BgE,KAAKqB,SAAS;YAAEN;YAAGC;YAAGzC;YAAMvC;;AADoB;IAI1CsE,UAAAA,EAAaS,GAAGC,GAAGzC,MAAMvC;QAC/BgE,KAAKuB,YAAY;YAAER;YAAGC;YAAGzC;YAAMvC;;AADoB;IAI7CuE,SAAAA,EAAYQ,GAAGC,GAAGzC,MAAMvC;QAE9BgE,KAAKwB,WAAW;YACdT,GAAGA,IAFemB,KAEI3D,OAAQ;YAC9ByC,GAAGA,IAHekB,KAGI3D,OAAQ;YAC9BA,MAAc,MAARA;YACNvC;;AANgD;IAU5CwE,WAAAA,EAAcO,GAAGC,GAAGzC,MAAMvC;QAChCgE,KAAK6B,aAAa;YAAEd;YAAGC;YAAGzC;YAAMvC;;AADoB;IAI9CyE,UAAAA,EAAaM,GAAGC,GAAGzC,MAAMvC;QAC/BgE,KAAK8B,YAAY;YAAEf;YAAGC;YAAGzC;YAAMvC;;AADoB;IAI7C0E,WAAAA,EAAcK,GAAGC,GAAGzC,MAAMvC;QAChCgE,KAAKiC,aAAa;YAAElB;YAAGC;YAAGzC;YAAMvC;;AADoB;IAI9C2E,YAAAA,EAAeI,GAAGC,GAAGzC,MAAMvC;QAC5BiG,KAAAA,aAAa;YAAElB;YAAGC;YAAGzC;YAAMvC,WAAWA,YAAY,KAAK2C,KAAKyC;;AADZ;;;;ICnTnD,WAAArB;QACK,OAAAC,KAAKC;AADH;IAIXC,WAAAA,CACmB7B,MACAf;QADIe,KAAAA,OAAJA,MACQf,KAAAA,WAARA;AAAkB;IAGjC,IAAA6C,CAACC;QAEH,IAAIC;QADM,QAAAL,KAAO3B;UAIV3C,KAAAA,iBAAiBmB;YACpBwD,eAAeL,KAAKM;YACpB;;UACG5E,KAAAA,iBAAiBqB;YACpBsD,eAAeL,KAAKmC;YACpB;;UACGzG,KAAAA,iBAAiBiB;YACpB0D,eAAeL,KAAKS;YACpB;;UACG/E,KAAAA,iBAAiBwB;YACpBmD,eAAeL,KAAKW;YACpB;;UACGjF,KAAAA,iBAAiByB;YACpBkD,eAAeL,KAAKU;YACpB;;UAEF;YACEL,eAAeL,KAAKY;;QAGxBP,aAAaQ,KAAKb,MAAMI;AAzBP;IA4BXU,YAAAA,EAAeC,GAAAA,IAAGC,GAAAA,IAAGzC,MAAMvC,WAAW,GAAGmE;QAC/Cc,aAAmB,GACnBC,aAAmB,GAEnBf,QACKF,KAAAA,UAAUkB,aAAa,aAAa,UAAU/B,UAAW,MAAMpD,WAAY2C,KAAKyC,OAAOH,MAAMC;AAL3B;IAQzD,QAAAG,CAACjB;QACf,KAAM7B,MAAMwC,GAAGC,KAAQZ,gBACV7B,OAAO;QAEfuC,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASkB,aAAa,aAAa,YACxCnB,KAAKC,SAASkB,aACZ,KACAY,OAAA,KAAYhB,IAAIxC,OAAO,KAAKyC,OACxBzC,OAAO,KAAKA,OAAO,uBAEjByD,aACFzD,OAAO,IAAIyD,WAAWzD,OAAO,IAAIyD;AANvC;;AAToC;IAsBvB,WAAAT,CAACnB;QAClB,KAAM7B,MAAMwC,GAAGC,KAAQZ,gBACV7B,OAAO;QAEfuC,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASkB,aAAa,aAAa,YACnClB,KAAAA,SAASkB,aACZ,KACAY,OAAA,KAAYhB,KAAKC,OACbzC,UACAA,WACCA,YAEDwC,IAAIiB,WAAWhB,IAAIgB,aACnBzD,OAAO,IAAIyD,aACXzD,OAAO,IAAIyD,aACH,IAAIA,UAAXzD;AAVP;;AATuC;IA0BpB,iBAAA6D,CAAChC;QACxB,KAAM7B,MAAMwC,GAAGC,KAAQZ,gBACV7B,OAAO;QAEfuC,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASkB,aAAa,aAAa,YACxCnB,KAAKC,SAASkB,aACZ,KACAY,OAAA,KAAYhB,KAAKC,IAAI,MAAMgB,aACvB,IAAIA,aACJ,MAAMA,WAAW,MAAMA,qBAA+B,MAAVA,WAA2B,MAAVA,aAC7D,IAAIA,aACJ,MAAMA,WAAW,MAAMA,qBAA+B,MAAVA,WAA4B,OAAVA,cAC7D,IAAIA,aACL,MAAMA,WAAW,MAAMA,qBAAgC,OAAVA,WAA4B,OAAVA,cAC9D,IAAIA,aACL,MAAMA,WAAW,MAAMA,qBAAgC,OAAVA,WAA2B,MAAVA,eAE9DjB,IAAI,MAAMiB,WAAWhB,IAAIgB,aACzB,IAAIA,aACJ,MAAMA,WAAW,MAAMA,qBAA+B,MAAVA,WAA2B,MAAVA,aAC7D,IAAIA,aACJ,MAdJA,WAcqB,MAAMA,qBAAgC,OAAVA,WAA2B,MAAVA,cAC7D,IAAIA,aACL,MAAMA,WAAW,MAAMA,qBAAgC,OAAVA,WAA4B,OAAVA,cAC9D,IAAIA,aACL,MAAMA,WAAW,MAAMA,qBAA+B,MAAVA,WAA4B,OAAVA;AApBpE;;AAT6C;IAoChC,WAAAF,CAAC1B;QAClB,KAAM7B,MAAMwC,GAAGC,KAAQZ,gBACV7B,OAAO;QAEfuC,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASkB,aAAa,aAAa,YACxCnB,KAAKC,SAASkB,aACZ,KACAY,OAAA,KAAYhB,KAAKC,IAAI,MAAMgB,aACvB,IAAIA,aACJ,MAAMA,WAAW,MAAMA,qBAA+B,MAAVA,WAA2B,MAAVA,aAC7D,MAAMA,cACL,MAAMA,aACP,MAAMA,WAAW,MAAMA,qBAAgC,OAAVA,WAA4B,OAAVA,cAC9D,IAAIA,aACLjB,SAEAA,IATJ,MASciB,WAAWhB,IAAIgB,aACzB,IAAIA,aACJ,MAAMA,WAAW,MAAMA,qBAA+B,MAAVA,WAA2B,MAAVA,aAC7D,MAAMA,cACL,MAAMA,aACP,MAAMA,WAAW,MAAMA,qBAAgC,OAAVA,WAA4B,OAAVA,cAC9D,MAAMA;AAjBb;;AATuC;IAiCzB,YAAAC,CAAC7B;QACnB,KAAM7B,MAAMwC,GAAGC,KAAQZ,gBACV7B,OAAO;QAEfuC,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASkB,aAAa,aAAa,YACxCnB,KAAKC,SAASkB,aACZ,KACAY,OAAA,KAAYhB,KAAKC,IAAI,MAAMgB,aACvB,IAAIA,aACJ,MAAMA,WAAW,MAAMA,qBAA+B,MAAVA,WAA2B,MAAVA,aAC7D,MAAMA,cACL,MAAMA,aACP,MAAMA,WAAW,MAAMA,qBAAgC,OAAVA,WAA4B,OAAVA,cAC9D,IAAIA,aACL,MAAMA,WAAW,MAAMA,qBAAgC,OAAVA,WAA2B,MAAVA,eAE9DjB,IAAI,MAAMiB,WAAWhB,IAAIgB,aACzB,IAAIA,aACJ,MAAMA,WAAW,MAAMA,qBAA+B,MAAVA,WAA2B,MAAVA,aAC7D,MAAMA,cACL,MAAMA,aACP,MAAMA,WAAW,MAAMA,qBAAgC,OAAVA,WAA4B,OAAVA,cAC9D,IAAIA,aACL,MAAMA,WAAW,MAAMA,qBAA+B,MAAVA,WAA4B,OAAVA;AAlBpE;;AATwC;IAkCtCpB,OAAAA,EAAUG,GAAGC,GAAGzC,MAAMvC;QAC5BgE,KAAKqB,SAAS;YAAEN;YAAGC;YAAGzC;YAAMvC;;AADoB;IAI1CsE,UAAAA,EAAaS,GAAGC,GAAGzC,MAAMvC;QAC/BgE,KAAKuB,YAAY;YAAER;YAAGC;YAAGzC;YAAMvC;;AADoB;IAI7CmG,gBAAAA,EAAmBpB,GAAGC,GAAGzC,MAAMvC;QACrCgE,KAAKoC,kBAAkB;YAAErB;YAAGC;YAAGzC;YAAMvC;;AADoB;IAInDyE,UAAAA,EAAaM,GAAGC,GAAGzC,MAAMvC;QAC/BgE,KAAK8B,YAAY;YAAEf;YAAGC;YAAGzC;YAAMvC;;AADoB;IAI7C0E,WAAAA,EAAcK,GAAGC,GAAGzC,MAAMvC;QAChCgE,KAAKiC,aAAa;YAAElB;YAAGC;YAAGzC;YAAMvC;;AADoB;IAI9C2E,YAAAA,EAAeI,GAAGC,GAAGzC,MAAMvC;QAC5BiG,KAAAA,aAAa;YAAElB;YAAGC;YAAGzC;YAAMvC,WAAWA,YAAY,KAAK2C,KAAKyC;;AADZ;;;;ICxNnD,WAAArB;QACK,OAAAC,KAAKC;AADH;IAIXC,WAAAA,CACmB7B,MACAf;QADIe,KAAAA,OAAJA,MACQf,KAAAA,WAARA;AAAkB;IAGjC,IAAA6C,CAACC;QAEH,IAAIC;QADM,QAAAL,KAAO3B;UAIV7C,KAAAA,QAAQc;YACX+D,eAAeL,KAAKY;YACpB;;UACGpF,KAAAA,QAAQe;YACX8D,eAAeL,KAAKqC;YACpB;;UACG7G,KAAAA,QAAQmB;YACX0D,eAAeL,KAAKS;YACpB;;UACGjF,KAAAA,QAAQoB;YACXyD,eAAeL,KAAKsC;YACpB;;UACG9G,KAAAA,QAAQgB;YACX6D,eAAeL,KAAKQ;YACpB;;UACGhF,KAAAA,QAAQiB;YACX4D,eAAeL,KAAKuC;YACpB;;UACG/G,KAAAA,QAAQkB;YACX2D,eAAeL,KAAKwC;YACpB;;UACGhH,KAAAA,QAAQuB;YACXsD,eAAeL,KAAKmC;YACpB;;UACG3G,KAAAA,QAAQwB;YACXqD,eAAeL,KAAKyC;YACpB;;UACGjH,KAAAA,QAAQsB;YACXuD,eAAeL,KAAK0C;YACpB;;UAEF;YACErC,eAAeL,KAAKM;;QAGxBD,aAAaQ,KAAKb,MAAMI;AAxCP;IA2CXU,YAAAA,EAAeC,GAAAA,IAAGC,GAAAA,IAAGzC,MAAMvC,WAAW,GAAGmE;QAC/Cc,aAAmB,GACnBC,aAAmB,GAEnBf,QACKF,KAAAA,UAAUkB,aAAa,aAAa,UAAU/B,UAAW,MAAMpD,WAAY2C,KAAKyC,OAAOH,MAAMC;AAL3B;IAQzD,QAAAG,CAACjB;QACf,KAAM7B,MAAMwC,GAAGC,KAAQZ;QAElBU,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBAC5EtB,KAAKC,SAASkB,aAAa,MAAM/B,UAAU2B,IAAIxC,OAAO,KACtDyB,KAAKC,SAASkB,aAAa,MAAM/B,UAAU4B,IAAIzC,OAAO;gBACtDyB,KAAKC,SAASkB,aAAa,KAAK/B,UAAUb,OAAO;AAAjD;;AAToC;IAcvB,WAAAgD,CAACnB;QAClB,KAAM7B,MAAMwC,GAAGC,KAAQZ;QAElBU,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASkB,aAAa,KAAK/B,UAAU2B,KACrCd,KAAAA,SAASkB,aAAa,KAAK/B,UAAU4B;gBACrCf,KAAAA,SAASkB,aAAa,SAAS/B,UAAUb,QACzC0B,KAAAA,SAASkB,aAAa,UAAU/B,UAAUb;AAA/C;;AAVuC;IAgBrB,gBAAAoE,CAACvC;QACvB,KAAM7B,MAAMwC,GAAGC,KAAQZ;QAElBU,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBAC5EtB,KAAKC,SAASkB,aACZ,KACAY,OAAA,KAAYhB,KAAKC,OACbzC,UACAA,OAAO,OACPA,OAAO,KAAKA,OAAO,kBAAkBA;AAL3C;;AAP4C;IAoBxB,kBAAAqE,CAACxC;QACzB,KAAM7B,MAAMwC,GAAGC,KAAQZ;QAElBU,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBAC5EtB,KAAKC,SAASkB,aACZ,KACAY,OAAA,KAAYhB,KAAKC,OACbzC,UACAA,WACCA,OAAO,OACRA,OAAO,KAAKA,OAAO,gBAAgBA,OAAO,MAAMA,OAAO;AAN7D;;AAP8C;IAqBrB,uBAAAsE,CAACzC;QAC9B,KAAM7B,MAAMwC,GAAGC,KAAQZ;QAElBU,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvErB,KAAAA,SAASkB,aACZ,KACAY,OAAA,KAAYhB,KAAKC,OACbzC,UACAA,UACAA,QAAQA,mBAAmBA,SAASA;AAL1C;;AAPmD;IAoB9B,mBAAAuE,CAAC1C;QAC1B,KAAM7B,MAAMwC,GAAGC,KAAQZ;QAElBU,KAAAA,aAAa;eACbV;YACHD,MAAM;gBACJH,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBAC5EtB,KAAKC,SAASkB,aACZ,KACAY,OAAA,KAAYhB,KAAKC,OACbzC,OAAO,OACPA,OAAO,KAAKA,OAAO,eAAeA,OAAO,KAAKA,OAAO,OACrDA,OAAO,QACNA,OAAO,OACRA,OAAO,KAAKA,OAAO,gBAAgBA,OAAO,MAAMA,OAAO;AAP7D;;AAP+C;IAqBtC,OAAAqC,EAAGG,GAAGC,GAAGzC;QACtByB,KAAKqB,SAAS;YAAEN;YAAGC;YAAGzC;YAAMvC,UAAU;;AADA;IAInB,aAAAqG,EAAGtB,GAAGC,GAAGzC;QAEvB8C,KAAAA,SAAS;YAAEN;YAAGC;YAAGzC,MAAMA,QADU,MAAjBI,KAAAoE,WAA0B;YACE/G,UAAU;;AAFf;IAK5B,UAAAsE,EAAGS,GAAGC,GAAGzC;QACzByB,KAAKuB,YAAY;YAAER;YAAGC;YAAGzC;YAAMvC,UAAU;;AADA;IAIpB,eAAA0G,EAAG3B,GAAGC,GAAGzC;QAOzBgD,KAAAA,YAAY;YAAER,GAHfA,IAAmB,MAHFxC;YAMCyC,GAFlBA,IAAmB,MAJFzC;YAMIA,MAJH,KAFDA;YAMUvC,UAAU;;AAPK;IAU7B,WAAAyG,EAAG1B,GAAGC,GAAGzC;QACrBgD,KAAAA,YAAY;YAAER;YAAGC;YAAGzC;YAAMvC,UAAU2C,KAAKyC,KAAK;;AADT;IAIpCZ,WAAAA,EAAcO,GAAGC,GAAGzC,MAAMyE,aAAAA;QAChC,IAAMC,wBAAeD,0DAA0B,GAAG,KAAI;QAChDE,IAAAA,gBAAgBF,yDAAe,GAAa,KAAI,GAChDG,cAAcH,yDAAe,SAAkB;QAGrD,IAAAI,0BAAoBH,wBAAeC,gBAAmBC,eAFhDE,6BAAiBL,yDAAe,GAAa,KAAI;QAIhC,MAAnBI,0BACFpD,KAAKqB,SAAS;YAAEN;YAAGC;YAAGzC;YAAMvC,UAAU;aAInB,IAAjBoH,2BAAuBH,yBAAgBC,iBAAmBC,eAAeE,6BAC3ErD,KAAKuB,YAAY;YAAER;YAAGC;YAAGzC;YAAMvC,UAAU;aAIpB,MAAnBoH,2BACEpH,0BAAW,GAEXiH,yBAAgBE,cAClBnH,0BAAW2C,KAAKyC,KAAK,IACZ+B,eAAeD,gBACxBlH,0BAAW2C,KAAKyC,KACP8B,iBAAiBG,+BAC1BrH,2BAAY2C,KAAKyC,KAAK;QAGxBpB,KAAK4C,mBAAmB;YAAE7B;YAAGC;YAAGzC;YAAMvC,UAAAA;cAIjB,MAAnBoH,4BACEpH,wBAAW,GAEXmH,cAAJG,wBACa3E,KAAKyC,KAAK,IACZ8B,gBACTlH,wBAAW2C,KAAKyC,KACPiC,+BACTrH,yBAAY2C,KAAKyC,KAAK;QAGxBpB,KAAK2C,iBAAiB;YAAE5B;YAAGC;YAAGzC;YAAMvC,UAAAA;;AA5CiB;IAiDjDuG,gBAAAA,EAAmBxB,GAAGC,GAAGzC,MAAMyE,aAAAA;QACrC,IAAMC,eAAeD,kCAA0B,GAAG,KAAI,GAChDE,gBAAgBF,iCAAe,GAAa,KAAI,GAChDG,cAAcH,iCAAe,SAAkB;QAKrD,MAFoBC,eAAeC,gBAAmBC,eAFhDE,iBAAiBL,iCAAe,GAAa,KAAI,MAMpDC,iBAAkBE,gBAAeE,kBACjCH,kBAAmBC,gBAAeE,iBAEnCrD,KAAKqB,SAAS;YAAEN;YAAGC;YAAGzC;YAAMvC,UAAU;aAIpCmH,eAAeE,iBACjBrD,KAAKuB,YAAY;YAAER;YAAGC;YAAGzC;YAAMvC,UAAU;aAIvCmH,gBAAgBE,iBAElBrD,KAAK2C,iBAAiB;YAAE5B;YAAGC;YAAGzC;YAAMvC,UADnB2C,KAAAyC,KAAO;aAKtBiC,mBAAmBF,eAErBnD,KAAK2C,iBAAiB;YAAE5B;YAAGC;YAAGzC;YAAMvC,WADnB2C,UAAW;;AA7B8B;IAmCtD6D,kBAAAA,EAAqBzB,GAAGC,GAAGzC,MAAMyE,aAAAA;QACvC,IAAMC,eAAeD,kCAA0B,GAAG,KAAI,GAChDE,gBAAgBF,iCAAe,GAAa,KAAI,GAChDG,cAAcH,iCAAe,SAAkB;QAKrD,MAFoBC,eAAeC,gBAAmBC,eAFhDE,iBAAiBL,iCAAe,GAAa,KAAI,MAMpDG,gBAAiBF,iBAAgBC,iBACjCG,mBAAoBJ,iBAAgBC,gBAErClD,KAAKqB,SAAS;YAAEN;YAAGC;YAAGzC;YAAMvC,UAAU;aAIpCiH,gBAAgBC,gBAClBlD,KAAKuB,YAAY;YAAER;YAAGC;YAAGzC;YAAMvC,UAAU;aAIvCiH,iBAAiBC,gBAEnBlD,KAAK2C,iBAAiB;YAAE5B;YAAGC;YAAGzC;YAAMvC,UADnBA;aAKfkH,kBAAkBD,gBAEpBjD,KAAK2C,iBAAiB;YAAE5B;YAAGC;YAAGzC;YAAMvC,UADtB2C,KAAOyC;;AA7BuC;IAmCxDe,gBAAAA,EAAmBpB,GAAGC,GAAGzC,MAAMyE,aAAAA;QACrC,IAAMC,eAAeD,kCAA0B,GAAG,KAAI;QAChDE,IAAAA,gBAAgBF,iCAAe,GAAa,KAAI,GAChDG,cAAcH,iCAAe,SAAkB;QAGrD,IAAAI,iBAAoBH,eAAeC,gBAAmBC,eAFhDE,iBAAiBL,iCAAe,GAAa,KAAI;QAIvD,MAAII,iBACFpD,KAAKqB,SAAS;YAAEN;YAAGC;YAAGzC;YAAMvC,UAAU;aAInB,IAAjBoH,kBAAuBH,gBAAgBC,iBAAmBC,eAAeE,iBAC3ErD,KAAKuB,YAAY;YAAER;YAAGC;YAAGzC;YAAMvC,UAAU;aAIpB,MAAnBoH,kBACEpH,iBAAW,GAEXiH,gBAAgBE,cAClBnH,iBAAW2C,KAAKyC,KAAK,IACZ+B,eAAeD,gBACxBlH,iBAAW2C,KAAKyC,KACP8B,iBAAiBG,mBAC1BrH,kBAAY2C,KAAKyC,KAAK;QAGxBpB,KAAK6C,wBAAwB;YAAE9B;YAAGC;YAAGzC;YAAMvC,UAAAA;cAItB,MAAnBoH,mBACEpH,eAAW,GAEXmH,cACFnH,eAAW2C,KAAKyC,KAAK,IACZ8B,gBACTlH,eAAW2C,KAAKyC,KACPiC,mBACTrH,gBAAY2C,KAAKyC,KAAK;QAGxBpB,KAAK2C,iBAAiB;YAAE5B;YAAGC;YAAGzC;YAAMvC,UAAAA;;AA5CsB;IAiDtDyE,UAAAA,EAAaM,GAAGC,GAAGzC,MAAMyE,aAAAA;QAC/B,IAAMC,eAAeD,kCAA0B,GAAG,KAAI,GAChDE,gBAAgBF,iCAAe,GAAa,KAAI,GAChDG,cAAcH,iCAAe,SAAkB;QAK9B,MAFHC,eAAeC,gBAAmBC,eAFhDE,iBAAiBL,iCAAe,GAAa,KAAI,KAKrDhD,KAAK8C,oBAAoB;YAAE/B;YAAGC;YAAGzC;YAAMvC,UAAU2C,KAAKyC,KAAK;aAIxD6B,gBAAiBE,cAKjBD,iBAAkBG,iBAKvBrD,KAAKuB,YAAY;YAAER;YAAGC;YAAGzC;YAAMvC,UAAU;aAJvCgE,KAAK4C,mBAAmB;YAAE7B;YAAGC;YAAGzC;YAAMvC,UAAU2C,KAAKyC,KAAK;aAL1DpB,KAAK4C,mBAAmB;YAAE7B;YAAGC;YAAGzC;YAAMvC,WAAW2C,KAAKyC,KAAK;;AAdP;IA0BhDkB,iBAAAA,EAAoBvB,GAAGC,GAAGzC,MAAMyE,aAAAA;QACtC,IAAMC,eAAeD,kCAA0B,GAAG,KAAI,GAChDE,gBAAgBF,iCAAe,GAAa,KAAI,GAChDG,cAAcH,iCAAe,SAAkB;QAK9B,MAFHC,eAAeC,gBAAmBC,eAFhDE,iBAAiBL,iCAAe,GAAa,KAAI,KAKrDhD,KAAK8C,oBAAoB;YAAE/B;YAAGC;YAAGzC;YAAMvC,UAAU2C,KAAKyC,KAAK;aAIxD6B,gBAAiBE,cAKjBD,iBAAkBG,iBAKvBrD,KAAKuB,YAAY;YAAER;YAAGC;YAAGzC;YAAMvC,UAAU;aAJvCgE,KAAK6C,wBAAwB;YAAE9B;YAAGC;YAAGzC;YAAMvC,UAAU2C,KAAKyC,KAAK;aAL/DpB,KAAK6C,wBAAwB;YAAE9B;YAAGC;YAAGzC;YAAMvC,WAAW2C,KAAKyC,KAAK;;AAdL;;;AChZ1D,IAAAmC,oBAA0B;IAC/BC,WAAUC,OACD,IAAIC,SAAQ,CAACC,SAASC;QAC3B,IAAkB,mBAAPH,KAAiB;YACpBI,MAAAA,MAAM,IAAIC;YAChBD,IAAIE,SAASC;gBACLC,MAAAA,SAAS,IAAIC;gBACnBD,OAAOE,YAAYC;oBACjBT,QAAQM,OAAOI;AADjB,mBAGAJ,OAAOK,cAAcT,IAAIU;AAL3B,eAOIC,IAAAA,UAAUX,IAAIY,UAAUZ,IAAIa,YAAYd,QAC5CC,IAAIc,KAAK,OAAOlB,MACZmB,IAAAA,eAAe;YACfC,IAAAA;AAZsB,eAarB;YACCZ,MAAAA,SAAS,IAAIC;YACnBD,OAAOE,YAAYC;gBACjBT,QAAQM,OAAOI;AADjB,eAGAJ,OAAOK,cAAcb;AALhB;AAAA;IASXqB,SAAO,CAACC,KAA6B7G,gBAC5B,IAAIwF,SAAQ,CAACC,SAASC;QACrBoB,MAAAA,QAAQ,IAAIC;QAEE,aAAhB/G,gBACF8G,MAAM9G,cAAcA,cAGtB8G,MAAMjB,SAAS;YACbJ,QAAQ;gBAAEnG,OAAOwH,MAAMxH;gBAAOC,QAAQuH,MAAMvH;;AAA5C,WAEFuH,MAAMR,UAAUQ,MAAMP,UAAUb,QAEd,mBAAlBmB,MAA4BC,MAAMD,MAAMA,MAEtCxB,kBACGC,UAAUuB,KACVG,MAAMzB,OAASuB,MAAMD,MAAMtB,MAC3B0B,MAAMvB;AALX;;;AC7BN,IAAAwB,aAAmB,EACjB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,OAGrBC,UAAgB,EACd,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KACnB,EAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,OAGrBC,iBAAuB,EACrB,EAAC,IAAI,MACL,EAAC,IAAI,MACL,EAAC,IAAI,MACL,EAAC,IAAI,MACL,EAAC,GAAG,KACJ,EAAC,GAAG,KACJ,EAAC,GAAG;;;IAMA,WAAAvF;QACK,OAAAC,KAAKC;AADH;IAgBX,WAAAC,CACUzB;QAAOA,KAAAA,UAAPA,SAeRuB,KAAK1C,WAAWmB,QAAQnB,UACxB0C,KAAKC,WAAWD,KAAK1C,SAASgE,gBAAgB,8BAA8B;QAC5E,IAAA9D,QAAc4B,UAAAX,QAAiBjB,QAC/BC,SAAe2B,UAAAX,QAAiBhB;QAC3BwC,KAAAA,SAASkB,aAAa,SAAS3D,QAC/ByC,KAAAA,SAASkB,aAAa,UAAU1D;QACrCuC,KAAKC,SAASkB,aAAa,WAAW,OAAO3D,SAASC,WACtDuC,KAAKuF,OAAOvF,KAAK1C,SAASgE,gBAAgB,8BAA8B;QACnErB,KAAAA,SAASuF,YAAYxF,KAAKuF,OAC/BvF,KAAKyF,aAAahH,QAAQgH,cAAclC;AAXF;IAcpC,SAAA/F;QACF,OAAOwC,KAAKvB,QAAQjB;AADb;IAIL,UAAAC;QACF,OAAOuC,KAAKvB,QAAQhB;AADZ;IAIE,YAAAiI,CAACC;oBACAA,0BACX/H,aAAmBgI,WAASC,QAAU,SAAOvG,YAAY,KACzD0C,UAAahC,KAAOvB,oBAASF,MACzBuH,gBAAgB;YAClBC,WAAW;YACXC,WAAW;YACXxI,OAAO;YACPC,QAAQ;;QAKV,IAFKkI,KAAAA,KAAKA,SAEN3F,KAAKvB,QAAQuG,OAAO;YAEtBzG,gBAAmByB,KAAAyF,WAAeX,QAAQ9E,KAAKvB,eAAcuB,KAAEvB,QAAKV,aAAoBG;YACxF,KAAMH,cAAckI,0BAA6BjG,KAAAvB,SACjDyH,aAAmBnI,aAAAE,YAAsBgI,wBACzCE,YAAkBb,eAAAc,MAAmBxG,KAAQA,EAAA,MAAQhC,gBAAW,EAAA,GAAM;YAGtEkI,gBCnGUO,UACdC,gBACAC,eACAC,eAAAA,qDACAC,mBAAAA,4DACAzE,SACA7D;gBAMoB,IAAA,KAAlBmI,kBACiB,KAAjBC,iBACiB,KAAjBC,uDACW,KAAXxE,WACA,IAAI7D,UAAU,IAAIqI,qDAElB,OAAO;oBACL/I,QAAQ;oBACRD,OAAO;oBACPwI,WAAW;oBACXD,WAAW;;gBAKXU,8DAA8C,KAAzBA,6DAAoB,MAAQA,6DAAoB9H,KAAKG,IAAI,GAAG2H,6DAAoB;gBAGzGC,IAAAA,uCAAY/H,KAAOG,IAAIyH,eAAcD,iBACrCK,+CAAYhI,KAAOC,IAAI2H,eAAcD,iBAGjCM,kBAAQ;gBACVC,8DAASJ,8DAAqBD,uDAAiB,IAAIrI;gBAClD,GAAA;oBACDI,IAAAA,OAAUqI,mBAAQC,6DAAYD,mBAAS,GACnCE,UAAUnI,KAAKG,IAAI,GAAGH,KAAKoI,KAAKxI,OAAO,IAAIJ;oBAC5B,KAAf2I,UAAU,KAAQA;oBAClBE,IAAAA,UAAUrI,KAAKG,IAAI,GAAGH,KAAKoI,KAAMxI,OAAOoI,+CAAUD,uCAAS,IAAIvI;oBAChD,KAAf6I,UAAU,KAAQA,WAEtBF,UAAcE,UAAUR,sDAAeK,6DAAQtI,OAC1CqI,kBAAQrI;AARf,yBASmC,OAA1BI,KAAKsI,IAAIL,kBAAQC;gBA4B1B,OAvBmB,MADfK,sDAAUvI,KAAKG,IAAI,GAAGH,KAAKoI,KAAKxI,kBAAO,IAAIJ,YACjC,KAAQ+I;gBAEH,MADfC,+CAAUxI,KAAKG,IAAI,GAAGH,KAAKoI,KAAMxI,kBAAOoI,+CAAUD,uCAAS,IAAIvI,YACrD,KAAQgJ;gBAGlBZ,gBAAgBD,iBACTvF,uCAAImG,uDAGJnG,uCAAIoG;gBACJnG,+CAAIkG;gBAMLnG,sDAFJqG,8DAAgBrG,uCAAE,IAAI5C,UAAS6D;iBAG3BhB,6DAAKoG,6DAAOd,iBAAkBC,kBAFlCc,mBAAgBrG,+CAAE,IAAI7C,UAAS6D,aAIzBhB,6DAAIqG;gBACJtG,sDAAKsG,kBAAOd,gBAAiBD;gBAGlC;oBACL7I,QAAQkB,KAAKE,MAAgBmC,6DAAI,IAAI7C,SAAS6D;oBAC9CxE,OAAOmB,KAAKE,MAAgBkC,sDAAI,IAAI5C,SAAS6D;oBAC7CgE,WAAoBhF;oBACpB+E,WAAoBhF;;AAtEL,aD4FGsF,CAAmB;gBACjCE,eAAehI,QAAKf;gBACpB8I,gBAAgB/H,QAAKd;gBACrB+I,eALoB7H,KAAA2I,MAAUpB,cAAWL,QAAYA,QAAQ,MAAS,KAAIA,QAAS,MAAqB,KAAfM,UAAY;gBAMrGM,mBAAmBZ,QAAQ;gBAC3B7D;gBACA7D,QAAQJ,aAAaI;;AAdD;QAkBnBoJ,KAAAA,kBACLvH,KAAKwH,UAAS,CAAC5N,GAAW6N,QACpBzH,KAAKvB,QAAQV,aAAaC,sBAE1BpE,MAAMiM,QAAQC,cAAcC,aAAa,KACzCnM,KAAKiM,QAAQC,cAAcC,aAAa,KACxC0B,MAAM5B,QAAQC,cAAcE,aAAa,KACzCyB,KAAK5B,QAAQC,cAAcE,aAAa,KAMxCZ,WAAWxL,KAAK6N,MAAMrC,WAAWxL,IAAIiM,QAAQ,KAAK4B,MAAMrC,WAAWxL,KAAK6N,IAAI5B,QAAQ,MAIpFR,QAAQzL,KAAK6N,MAAMpC,QAAQzL,IAAIiM,QAAQ,KAAK4B,MAAMpC,QAAQzL,KAAK6N,IAAI5B,QAAQ;QAM5E6B,KAAAA,eAED1H,KAAKvB,QAAQuG,SAA+B,IAAtBc,cAActI,SAAoC,IAAvBsI,cAAcrI,gBAC3DuC,KAAK2H,UAAU;YAAEnK,OAAOsI,cAActI;YAAOC,QAAQqI,cAAcrI;YAAQoI;YAAO7D;;AAzDrE;IA6DvBuF,cAAAA;sBAEevH,KAAOvB;QAEpB,IAHauB,KAAOC,YAGLxB,QAAQQ,mBAAmB;YAIxCe,KAAK4H,YAAY;gBACfnJ,SAJsBA,QAAAQ,kBAAyBpD;gBAK/CyC,OAJYG,QAAAQ,kBAAyBX;gBAKrCuJ,oBAAoB;gBACpB9G,GAAG;gBACHC,GAAG;gBACHvD,QAAQgB,QAAQhB;gBAChBD,OAAOiB,QAAQjB;gBACfsK,MAAM;;YAGFvJ,IAAAA,OAAOI,KAAAC,IAAQH,QAAQjB,OAAMiB,QAAEhB,SAC/BsC,UAAUC,KAAA1C,SAAKgE,gBAAS,8BAA4C;aACzEtB,KAAK+H,gBAAgB/H,KAAKgI,uBAAuBhI,KAAKiI,WAAW;YAC7D1C,KAAAA,KAAKC,YAAYxF,KAAK+H,iBAE3BhI,QAAQoB,aAAa,KAAK/B,WAAWX,QAAQjB,QAAQe,QAAQ;YAC7DwB,QAAQoB,aAAa,KAAK/B,WAAWX,QAAQhB,SAASc,QAAQ,KACtD4C,QAAAA,aAAa,SAAS/B,UAAUb;YAChC4C,QAAAA,aAAa,UAAU/B,UAAUb,QACzCwB,QAAQoB,aAAa,MAAM/B,UAAWb,OAAO,KAAME,QAAQQ,kBAAkBJ,SAAS;YAEtFmB,KAAKgI,oBAAoBxC,YAAYzF;AA1BG;AAJ9B;IAkCN,QAAAyH,CAACU;QACH,KAAClI,KAAK2F,IACR,MAAM;sBAGK3F,KAAOvB,SACpBoH,QAAc7F,KAAA2F,GAAOwC;QAEjBtC,IAAAA,QAAQpH,QAAQjB,SAASqI,QAAQpH,QAAQhB,QAC3C,MAAM;QAGR,IAAM2K,yBAAUzJ,KAAAC,IAAQH,QAAQjB,OAAMiB,QAAEhB;QACxC,IAAAuE,UAAahC,KAAOvB,oBAASF;QAC7B,gCAAgBI,YAAaF,QAAEjB,gBAAqBwE,WAAc,gCAClDrD,YAAaF,QAAEhB,iBAAsBuE,WAAc;QACnE,UAAS,IAAOqG,MAAA5J,QAAaL,YAAYC,MAAK2B,KAAE1C;SAE/C0C,KAAKsI,UAAUtI,KAAKuI,iBAAiBvI,KAAKiI,WAAW,mBACjD1C,KAAAA,KAAKC,YAAYxF,KAAKsI;QAEtB,KAAA,IAAI1O,IAAI,GAAGA,IAAIiM,OAAOjM,KACpB,KAAA,IAAI6N,IAAI,GAAGA,IAAI5B,OAAO4B,KACrBS,WAAWA,OAAOtO,GAAG6N,OAGpBzH,KAAK2F,IAAI6C,OAAOf,GAAG7N,OAIxB0C,IAAI6D,KAAK;YACPY,GAAG0H,4BAAa7O,IAAIoI;YACpBhB,GAAG0H,4BAAajB,IAAIzF;YACpBzD,MAAMyD;YACNgB,aAAa,CAAC2F,SAAiBC,cACX,IAAdhP,IAAI+O,WAA6B,IAAdlB,IAAImB,WAAehP,IAAI+O,WAAW9C,SAAS4B,IAAImB,WACtE/C,SAAIqC,WAAWA,OAAOtO,IAAI+O,SAASlB,IAAImB,gBAC9B5I,KAAK2F,MAAM3F,KAAK2F,GAAG6C,OAAOf,IAAImB,SAAShP,IAAI+O;YAIpDrM,IAAIyD,WAAWC,KAAKsI,YACtBtI,KAAKuI,cAAc/C,YAAYlJ,IAAIyD;QAKzC,IAAI8I,SAASJ,2BACTK,SAASJ,2BACTK,aAAalD;QAEjB,IAAIpH,QAAQlB,UAAU5B,UAAUyB,QAAQ;YAEtC4L,yBAAuBrK,KAAA2I,OAAUc,yBAASpG,UAAa6D,aAD3C7F,KAAQvB,kCAAkCA,0BAASN,UAAwB,MACV;YAC7E,IAAA8K,YAAkBpD,QAAsB;YAGxCgD,SAFAK,sDAAkDlH,SAGlD8G,SAFAK,sDAAkDnH;YAGlD+G,aAAalD,QAAyB,IAAjBmD;YACfI,IAAAA,aAAyB,IAC/BC,SAAY1K,KAAO2I,MAAM2B,YAAU;YAE9B,KAAA,IAAIrP,IAAI,GAAGA,IAAIqP,WAAWrP,KAAK;gBAClCwP,WAAWxP,KAAK;gBACX,KAAA,IAAI6N,IAAI,GAAGA,IAAIwB,WAAWxB,KAO3B2B,WAAWxP,GAAG6N,KALd7N,KAAKoP,yBAAiB,KACtBpP,KAAKqP,YAAYD,0BACjBvB,KAAKuB,yBAAiB,KACtBvB,KAAKwB,YAAYD,0BAMfrK,KAAK2K,MAAM1P,IAAIyP,WAAWzP,IAAIyP,WAAW5B,IAAI4B,WAAW5B,IAAI4B,WAAWA,SAJtD,IAUFrJ,KAAK2F,GAAG6C,OACA,IAAzBf,IAAI,IAAIuB,yBAAqBvB,IAAIA,KAAK5B,QAAQ4B,IAAI,IAAIuB,yBAAiBvB,IAAIuB,wBAClD,IAAzBpP,IAAI,IAAIoP,yBAAqBpP,IAAIA,KAAKiM,QAAQjM,IAAI,IAAIoP,yBAAiBpP,IAAIoP,0BAEzE,IACA;AAxB4B;YA4B/B,KAAA,IAAIpP,IAAI,GAAGA,IAAIqP,WAAWrP,KACxB,KAAA,IAAI6N,IAAI,GAAGA,IAAIwB,WAAWxB,KACxB2B,WAAWxP,GAAG6N,OAEnBnL,IAAI6D,KAAK;gBACPY,GAAGmI,4BAAiBtP,IAAIoI;gBACxBhB,GAAGmI,4BAAiB1B,IAAIzF;gBACxBzD,MAAMyD;gBACNgB,aAAa,CAAC2F,SAAiBC,cACpBQ,WAAWxP,IAAI+O,WAAWlB,IAAImB;gBAGvCtM,IAAIyD,WAAWC,KAAKsI,YACtBtI,KAAKuI,cAAc/C,YAAYlJ,IAAIyD;AArDH;QA2DxCC,KAAK4H,YAAY;YACfnJ,SAASA,QAAQL,aAAavC;YAC9ByC,OAAOG,QAAQL,YAAYE;YAC3BuJ,oBAAoB;YACpB9G,GAAG8H;YACH7H,GAAG8H;YACHrL,QAAQsL,aAAa/G;YACrBxE,OAAOuL,aAAa/G;YACpB8F,MAAM;;AAtHyC;IA0HnDJ,WAAAA;QACM,KAAC1H,KAAK2F,IACR,MAAM;sBAIK3F,KAAOvB;QAEhB,KAHSuB,KAAOC,UAIlB,MAAM;QAGR4F,IAAAA,QAAc7F,KAAA2F,GAAOwC,kBACrBnG,UAAahC,KAAOvB,oBAASF,0BACI,IAAVyD,0BACO,IAAVA,sBACJrD,YAAaF,QAAEjB,gBAAqBwE,WAAc,iBAClDrD,YAAaF,QAAEhB,iBAAsBuE,WAAc;QAGjE,EAAA,EAAC,GAAG,GAAG,KACP,EAAC,GAAG,GAAGrD,KAAKyC,KAAK,KACjB,EAAC,GAAG,IAAIzC,KAAKyC,KAAK,MAClBpG,SAAQ,EAAEuO,mBAAQC,KAAKxN;YACjB+E,IAAAA,IAAI0H,aAAac,oBAASvH,WAAW6D,QAAQ,IAC7C7E,IAAI0H,aAAac,MAAMxH,WAAW6D,QAAQ;YAC5C4D,IAAAA,wCAAoBzJ,KAAKsI;YACzBoB,IAAAA,yBAAyB1J,KAAKuI;YAC9BoB,IAAAA,mCAAiB3J,KAAKsI;YAqB1B,IApBIsB,wCAAsB5J,KAAKuI,gBAE3B9J,QAAQM,sBAAsBlD,YAAY4C,QAAQM,sBAAsBT,YACzEmL,uCAAmBC,0BAA0B1J,KAAKiI,WAAW,6BAA6BsB,qBAAUC;YACrGxJ,KAAKuF,KAAKC,YAAYiE,wCACtBE,mCAAiBF;YACjBG,wCAAsBF,wBAEtB1J,KAAK4H,YAAY;gBACfnJ,SAASA,QAAQM,sBAAsBlD;gBACvCyC,OAAOG,QAAQM,sBAAsBT;gBACjBtC,oBAAAA;gBACpB+E;gBACAC;gBACAvD,QAAQoM;gBACRrM,OAAOqM;gBACP/B,MAAM,wBAAwByB,qBAAUC;iBAIxC/K,QAAQM,sBAAsBV,OAUhCyL,mCATmB,IAAOC,eAAAtL,QAAsBM,qBAAqBV,MAAK2B,KAAE1C,WAE9D6C,KAAK;gBACjBY;gBACAC;gBACAzC,MAAMsL;gBACN7N,UAAAA;gBAGEgO,iCAAcjK,WAAW2J,0BAC3BA,uBAAuBlE,YAAYwE,iCAAcjK,eAE9C;mDACI,IAAOsI,MAAA5J,QAAaL,YAAYC,MAAK2B,KAAE1C;gBAE3C,KAAA,IAAI1D,IAAI,GAAGA,IAAIwL,WAAWxK,QAAQhB,KACrC,KAAK,IAAI6N,IAAI,GAAGA,IAAIrC,WAAWxL,GAAGgB,QAAQ6M,KACnCrC,WAAWxL,KAAK6N,OAIrBnL,iCAAI6D,KAAK;oBACPY,GAAGA,IAAInH,IAAIoI;oBACXhB,GAAGA,IAAIyG,IAAIzF;oBACXzD,MAAMyD;oBACNgB,aAAa,CAAC2F,SAAiBC,cAA+BxD,WAAWxL,IAAI+O,WAAWlB,IAAImB;oBAG1FtM,iCAAIyD,WAAW2J,0BACjBA,uBAAuBlE,YAAYlJ,iCAAIyD;AAjBxC;YAuCP,KAhBItB,QAAQO,mBAAmBnD,YAAY4C,QAAQO,mBAAmBV,YACnEqL,kCAAgBC,yCAAuB5J,KAAKiI,WAAW,0BAA0BsB,qBAAUC;YAC5FxJ,KAAKuF,KAAKC,YAAYmE,mCAEtB3J,KAAK4H,YAAY;gBACfnJ,SAASA,QAAQO,mBAAmBnD;gBACpCyC,OAAOG,QAAQO,mBAAmBV;gBAClCuJ,oBAAoB7L;gBACpB+E,GAAGA,IAAc,IAAViB;gBACPhB,GAAGA,IAAc,IAAVgB;gBACPvE,QAAQwM;gBACRzM,OAAOyM;gBACPnC,MAAM,qBAAqByB,qBAAUC;iBAIrC/K,QAAQO,mBAAmBX,OAU7B6L,oBATgB,IAAOC,YAAA1L,QAAmBO,kBAAkBX,MAAK2B,KAAE1C,WAExD6C,KAAK;gBACdY,GAAGA,IAAc,IAAViB;gBACPhB,GAAGA,IAAc,IAAVgB;gBACPzD,MAAM0L;gBACNjO,UAAAA;gBAGEoO,kBAAWrK,WAAW6J,yCACxBA,sCAAoBpE,YAAY4E,kBAAWrK,eAExC;sBACI,IAAOsI,MAAA5J,QAAaL,YAAYC,MAAK2B,KAAE1C;gBAE3C,KAAA,IAAI1D,IAAI,GAAGA,IAAIyL,QAAQzK,QAAQhB,KAClC,KAAK,IAAI6N,IAAI,GAAGA,IAAIpC,QAAQzL,GAAGgB,QAAQ6M,KAChCpC,QAAQzL,KAAK6N,OAIlBnL,IAAI6D,KAAK;oBACPY,GAAGA,IAAInH,IAAIoI;oBACXhB,GAAGA,IAAIyG,IAAIzF;oBACXzD,MAAMyD;oBACNgB,aAAa,CAAC2F,SAAiBC,cAA+BvD,QAAQzL,IAAI+O,WAAWlB,IAAImB;oBAGvFtM,IAAIyD,WAAW6J,yCACjBA,sCAAoBpE,YAAYlJ,IAAIyD;AAjBrC;AAAA;AAlHA;IA2IL4H,eAAAA,EACJnK,OAAAA,UACAC,QAAAA,WACAoI,OACA7D;QAOA,YAAahC,KAAOvB,SAGpBN,iBAAYM,MAAUV,sBAAuBiE;QACvCqI,IAAAA,KAHU1L,YAAaF,MAAEjB,gBAAqBwE,WAAc,uBAGpC6D,kBAAmBrI,YAAQ;QASzD,IARM8M,QAHU3L,YAAaF,MAAEhB,iBAAsBuE,WAAc,uBAGrC6D,kBAAmBpI,aAAS;QAC1D8M,YAAyB,oBACzBC,aAA0B,2CAEHxK,KAAAyF,WAAejC,UAAU/E,eAAkB;SAC9DuG,QAAoBhF,KAAK1C,SAASgE,gBAAgB,8BAA8B,UAC9EmJ,eAAe,gCAAgC,cAAcC,kBAAY;QAE3EA,eAASC,WAAW,wBAAwB;YAE9C/Q,WADI8D,iBAAOgN,eAASE,UAAU,KACpBC,QAAY;YACtBC,IAAAA,WAAcpN,eAAOkN,UAAU,GAAEhR;YAGjC,IAFAmR,iBAAOrN,eAAKkN,UAAUhR,UAAI,IAGnB,aADCkR,UAEJC,iBAAsB,4BAAaC,KAAKtN,kBAAQuN,OAAOC,KAAKxN,gBAAM,UAAUyN,SAAS,cAGrFzN,iBAAO;YAIPA,mBACI0N,kBAAyBC,IAAbC,WAAaD,gBAAG3N,gBAAoB;aAChD6N,iBAAS/R,MAAA0R,KAAUE,eAAUI,qBAAqB,SAC7C5Q,WAAQoK,QAAQ+F,eAAO;AAlBU;QAsB1C5J,MAAAA,aAAa,KAAK/B,UAAUiL,MAC5BlJ,MAAAA,aAAa,KAAK/B,UAAUkL;QAC5BnJ,MAAAA,aAAa,SAAS,GAAG/B,UAAUmL,gBACnCpJ,MAAAA,aAAa,UAAU,GAAG/B,UAAUoL;QAE1CxK,KAAKC,SAASuF,YAAYR;AAzC3B;IA4CkB,WAAA4C,EACjBnJ,SACAH,OACAuJ,oBAAAA,qCACA9G,GACAC,GACAvD,QACAD,OACAsK;QAWA,IAAAvJ,OAAUf,QAAQC,SAAYD,QAAQC;QAChCgO,IAAAA,OAAOzL,KAAA1C,SAAKgE,gBAAS,8BAA4C;QAOvE,IANKH,KAAAA,aAAa,KAAK/B,UAAU2B,KAC5BI,KAAAA,aAAa,KAAK/B,UAAU4B;QAC5BG,KAAAA,aAAa,UAAU/B,UAAU3B,UACjC0D,KAAAA,aAAa,SAAS/B,UAAU5B;QAChC2D,KAAAA,aAAa,SAAS,kBAAkB2G,UAEzCrJ,SAAS;YACX,IAAI5C;YACJ,IAAI4C,QAAQJ,SAAS9C,aAAaa,QAChCP,WAAWmE,KAAK1C,SAASgE,gBAAgB,8BAA8B;YACvEzF,SAASsF,aAAa,MAAM2G,OAC5BjM,SAASsF,aAAa,iBAAiB;YACvCtF,SAASsF,aAAa,MAAM/B,UAAU2B,IAAIvD,QAAQ,KAClD3B,SAASsF,aAAa,MAAM/B,UAAU4B,IAAIvD,SAAS;YACnD5B,SAASsF,aAAa,MAAM/B,UAAU2B,IAAIvD,QAAQ,KAClD3B,SAASsF,aAAa,MAAM/B,UAAU4B,IAAIvD,SAAS;YACnD5B,SAASsF,aAAa,KAAK/B,UAAUb,OAAO,UACvC;gBAGDmN,OAAK3K,IAAIvD,QAAQ;gBACrB,IAAImO,KAAK3K,IAAIvD,SAAS;gBAClBmO,KAASpO,QAAQ,GACjBqO,KAASpO,SAAS,GAGC,wDARNgB,QAAEzC,YAAgB,KAAS6L,4CAAwBlJ,YAClC,IAAOA,KAAAyC,WAAazC,aAO1BmN,uCAAoB,MAAOnN,KAAKyC,MACzD0K,sCAAmB,OAAOnN,KAAKyC,MAAM0K,uCAAoB,IAAInN,KAAKyC,MAE9DsK,QAAKlO,QAAQ;gBACbmO,MAAMlO,SAAS,IAAKkB,KAAKoN,IAAI/P,QAC7B4P,KAAKpO,QAAQ,GACbqO,KAAMpO,SAAS,IAAKkB,KAAKoN,IAAI/P,UACzB8P,sCAAmB,MAAOnN,KAAKyC,MAAM0K,uCAAoB,MAAOnN,KAAKyC,MACzEuK,MAAKlO,SAAS;gBACdiO,QAAKlO,QAAQ,IAAImB,KAAKoN,IAAI/P,QAC1B6P,KAAKpO,SAAS,GACdmO,KAAKpO,QAAQ,IAAImB,KAAKoN,IAAI/P,UACtB8P,sCAAmB,MAAOnN,KAAKyC,MAAM0K,uCAAoB,OAAOnN,KAAKyC,MACzEsK,QAAKlO,QAAQ;gBACbmO,MAAMlO,SAAS,IAAKkB,KAAKoN,IAAI/P,QAC7B4P,KAAKpO,QAAQ,GACbqO,KAAMpO,SAAS,IAAKkB,KAAKoN,IAAI/P,UACzB8P,sCAAmB,OAAOnN,KAAKyC,MAAM0K,uCAAoB,OAAOnN,KAAKyC,OACzEuK,MAAKlO,SAAS;gBACdiO,QAAKlO,QAAQ,IAAImB,KAAKoN,IAAI/P,QAC1B6P,KAAKpO,SAAS,GACdmO,KAAKpO,QAAQ,IAAImB,KAAKoN,IAAI/P;gBAGjCH,WAAWmE,KAAK1C,SAASgE,gBAAgB,8BAA8B;gBACvEzF,SAASsF,aAAa,MAAM2G,OAC5BjM,SAASsF,aAAa,iBAAiB;gBAC9BA,SAAAA,aAAa,MAAM/B,UAAUsM,QAC7BvK,SAAAA,aAAa,MAAM/B,UAAUuM;gBAC7BxK,SAAAA,aAAa,MAAM/B,UAAUwM,KAC7BzK,SAAAA,aAAa,MAAM/B,UAAUyM;AAvCjC;YA0CPpN,QAAQ3C,WAAWd,SAAQ,EAAGmB,QAAQmC;gBAC9B0N,IAAAA,OAAOhM,KAAA1C,SAAKgE,gBAAS,8BAA4C;gBACvE0K,KAAK7K,aAAa,UAAU,GAAG/B,UAAU,MAAMjD,aAC/C6P,KAAK7K,aAAa,cAAc7C;gBAChCzC,SAAS2J,YAAYwG;AAArB,iBAGG7K,KAAAA,aAAa,QAAQ,QAAQ2G,UAClC9H,KAAKuF,KAAKC,YAAY3J;AA7DxB,eA8DOyC,SACLmN,KAAKtK,aAAa,QAAQ7C;QAG5B0B,KAAKC,SAASuF,YAAYiG;AA3E3B;IA8EiB,UAAAxD,CAACgE;QACjB,cAAajM,KAAOvB,SAEdyN,OAAOlM,KAAA1C,SAAKgE,gBAAS,8BAA4C;QAYvE,OAXA4K,KAAK/K,aAAa,MAAM8K,WACxBC,KAAK/K,aAAa,aAAa;QAC/B+K,KAAK/K,aAAa,KAAK,MACvB+K,KAAK/K,aAAa,KAAK,MAClBA,KAAAA,aAAa,SAAS/B,UAAUX,QAAQjB;QACxC2D,KAAAA,aAAa,UAAU/B,UAAUX,QAAQhB,WAExC0O,WAAQnM,KAAA1C,SAAKgE,gBAAS,8BAA4C,MAClEH,aAAa,QAAQ;QAC3B+K,KAAK1G,YAAY2G,WAEV,EAACD,MAAMC;AAfa;;;;IEtkBzB,QAAA5N;QACE,IAAAyB,KAAKoM,OACP,OAAO;YACL5O,OAAOwC,KAAKoM,MAAM5O;YAClBC,QAAQuC,KAAKoM,MAAM3O;;AAJjB;IASR,WAAAyC,CAAYzB;QACVuB,KAAKvB,UAAUA,UAAUD,gBAAgBpD,UAAUiC,gBAAgBoB,YAAuBpB;QACrFgP,KAAAA;AAFwC;IAKzC,MAAAA,CAEJ5N;QAES2M,KAAAA,cAAWpL,KAAKoL,UAAUkB,YAAY,KAE/CtM,KAAKvB,UAAUA,OAAUD,gBAAgBpD,UAAU4E,KAAKvB,SAASA,SAAuBuB,KAAKvB;QAEnFA,KAAAA,QAAQf,SAIdsC,KAAKvB,QAAQ8N,uBACflR,OAAOC,OAAOkR,OAAOD,oBAAoBvM,KAAKvB,QAAQ8N;eAC/CvM,KAAKvB,QAAQ8N,qBAGtBvM,KAAK2F,KAAK6G,OAAOxM,KAAKvB,QAAQd,UAAUC,YAAYoC,KAAKvB,QAAQd,UAAUG;SACvED,OAAOmC,KAAKvB,QAAQd,UAAUE,QRzChC4O,SAAkB/O;YACtB,SAAQ;cACN,KAAK,WAAWgP,KAAKhP;gBACZ5D,OAAAA,KAAKK;;cACd,KAAK,wBAAwBuS,KAAKhP;gBACzB5D,OAAAA,KAAKM;;cAEd,KAAK,mBAAmBsS,KAAKhP;gBACpB5D,OAAAA,KAAKQ;;cACd;gBACSR,OAAAA,KAAK6S;;AAVkB,SQyCUF,CAAQzM,KAAKvB,QAAQf,UACnD5D,KAAKQ,WACfkS,OAAOI,gBAAgBJ,OAAOD,mBAAmB;QACjD1O,OAAY8O,KAAAA,QAEZH,OAAOI,gBAAgBJ,OAAOD,mBAAP,SAEzBvM,KAAK2F,GAAGkH,QAAQ7M,KAAKvB,QAAQf,MAAMG;QACnCmC,KAAK2F,GAAGmH,QAER9M,KAAK+M,YAEL/M,KAAKgN,OAAOhN,KAAKoL;AA5BkB;IA+B/B,MAAA4B,CAEJ5B;QAEAA,cAIIpL,KAAKoM,OAAOrM,WACdqL,UAAU5F,YAAYxF,KAAKoM,MAAMrM;QAGnCC,KAAKoL,YAAYA;AAVM;IAuCX,cAAA6B,CAEZC;QAEA,KAAKA,WACH,MAAM;QAGHA,KAAAA,YAAYA,WACZb,KAAAA;AAPuB;IAU9Bc,eAAAA;QACEnN,KAAKkN,iBAAYrS,GACZwR,KAAAA;AAFQ;IAKTe,eAAAA;QACA,KAACpN,KAAK2F,IAAI,MAAM;QAOpB,IALK3F,KAAKoM,OAAOrM,WAAYC,KAAKqN,qBAChCrN,KAAK+M,kBAED/M,KAAKqN;QAENrN,KAAKoM,OAAOrM,SAQjB,OADS,+CAFeuN,IADDC,eACCD,kBAAkBtN,KAAKoM,MAAMrM;AAbxC;IAmBPgN,QAAAA;QACD,IAAA/M,KAAK2F,IAAV;YAGA,IAAME,QAAQlH,KAAAoI,MAAS/G,KAAEvB,QAAYlB,SAAM5B,mBAAuBgD,KAAA2K,KAAK,KAAU,KAAKtJ,KAAA2F,GAAOwC;YAE7F5J,QAAaI,KAAAoI,KAAS/G,KAAKvB,QAAQL,4BAA0B,KADjD4B,KAAQvB,kCAAkCA,0BAASN,UAAwB;YAEvF6B,KAAKoM,QAAQ,IAAIoB,MAAM;mBAClBxN,KAAKvB;gBACRjB,OAAOe;gBACPd,QAAQc;gBACR0H,wBAAwB/G,wBAAwBc,KAAKvB,QAAQd,UAAUG;gBAGzEkC,KAAKqN,oBAAoBrN,KAAKoM,MAAM1G,OAAO1F,KAAK2F,IAAIT,MAAK;gBAClDlF,KAAKoM,OAAOrM,WACjBC,KAAKkN,YAAYlN,KAAKoM,MAAMrM,SAASC,KAAKvB;AAD1C;AAdF;AADc;;;ICzINgP;;CAAAA,gBAAAA,kBAAAA,gBAKX,KAJCC,MAAA,OACAD,cAAAE,MAAA;AACAF,cAAAG,OAAA,QACAH,cAAAI,OAAA;;ACSI,MAAOC,sBAAPC;IACJ,WAAA7N,CAAYzB;QAIQuP,eAAAC,UAAAxK;YAChB,IAAkB,mBAAPA,MAAiB;gBAC1B,IAAIyK,KAAKC,WAAWC,IAAI3K;gBACxB,OAAIyK,OACJA,KAAKG,MAAM5K,MAAKyB,MAAMoJ,OACpBA,IACGC,cACArJ,MAAMsJ,QAASvD,OAAOC,KAAKsD,QAC3BtJ,MAAK8I,eAAiB;oBACrBS,aAAaH,IAAII,QAAQN,IAAI,yBAA0BO,mBAAmBjR,MAAMwH,MAAM0J,KAAMA,GAAGC;oBAC/FnR;wBAGNyQ,WAAWW,IAAIrL,MAAKyK,KACbA;AAbmB;YAiB1B,OAFMM,OAAOvD,OAAOC,KAAKzH,OAElB;gBACLgL,mBAFiBE,mBAAmBH,MAAMtJ,MAAM0J,KAAMA,GAAGC;gBAGzDnR,MAAM8Q;;AApBiD;QAH7D,IAAMO,OAA2BC,IAArBC,mBAAqBD,eAAG,MAAmB,oBACvC,IAAOE;QA2BhB3B,OAAAA,gBAAgBA,iBAChBjC,OAAAA,YAAYA,aAEnB6D,MAAM;eACD1Q;YACHnB,UAAUmB,QAAQnB,YAAYyR;YAC9BtJ,YAAYhH,QAAQgH,cAAc;gBAChCjC,WAAYC,OACVwK,UAAUxK,KAAKyB,MACb,EAAGuJ,aAAa/Q,UACd,QAAQ+Q,aAAalP,QAAQ,mBAAmB,2BAA2B7B,KAAKyN,SAAS;gBAE/FrG,SAASA,iBACDpH,QAAQuN,OAASmE,SAAS3Q,QAAQuG,SAAU;oBAAAtH,MAAMe,QAASuG;0BAAWiJ,UAAelJ,QAEpF;oBAELvH,QAHF6R,aAAmBC,MAAA5R,MAAU6R,YAGf/R;oBAEZC,QAAQ4R,KAAK5R;;;;AAhDuB;;;;;"}
|
|
1
|
+
{"version":3,"file":"qr-code-styling-node.js","sources":["../src/types/qrcode.ts","../src/utils/merge.ts","../src/utils/gradient.ts","../src/utils/options.ts","../src/utils/qrcode.ts","../src/utils/svg.ts","../src/figures/corner-dot.ts","../src/figures/corner-square.ts","../src/figures/dot.ts","../src/tools/browser-image-tools.ts","../src/core/qr-svg.ts","../src/utils/image.ts","../src/core/qr-code-styling.ts","../src/tools/browser-utils.ts","../src/node.ts"],"sourcesContent":["type TypeNumber =\r\n | 0\r\n | 1\r\n | 2\r\n | 3\r\n | 4\r\n | 5\r\n | 6\r\n | 7\r\n | 8\r\n | 9\r\n | 10\r\n | 11\r\n | 12\r\n | 13\r\n | 14\r\n | 15\r\n | 16\r\n | 17\r\n | 18\r\n | 19\r\n | 20\r\n | 21\r\n | 22\r\n | 23\r\n | 24\r\n | 25\r\n | 26\r\n | 27\r\n | 28\r\n | 29\r\n | 30\r\n | 31\r\n | 32\r\n | 33\r\n | 34\r\n | 35\r\n | 36\r\n | 37\r\n | 38\r\n | 39\r\n | 40;\r\n\r\nconst TypeNumber = Array(41)\r\n .fill(0)\r\n .map((_, i) => i) as unknown as {\r\n [P in TypeNumber]: P;\r\n};\r\n\r\nexport { TypeNumber };\r\n\r\nexport enum ErrorCorrectionLevel {\r\n L = \"L\",\r\n M = \"M\",\r\n Q = \"Q\",\r\n H = \"H\"\r\n}\r\n\r\nexport enum Mode {\r\n numeric = \"Numeric\",\r\n alphanumeric = \"Alphanumeric\",\r\n byte = \"Byte\",\r\n kanji = \"Kanji\",\r\n unicode = \"Unicode\"\r\n}\r\n\r\nexport interface QRCode {\r\n addData(data: string, mode?: Mode.alphanumeric | Mode.byte | Mode.kanji | Mode.numeric): void;\r\n make(): void;\r\n getModuleCount(): number;\r\n isDark(row: number, col: number): boolean;\r\n}\r\n","const isObject = (obj: Record<string, unknown> | undefined): boolean =>\r\n !!obj && typeof obj === \"object\" && !Array.isArray(obj);\r\n\r\nexport type UnknownObject =\r\n | {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n [key: string]: any;\r\n }\r\n | undefined;\r\n\r\nexport function mergeDeep(target: UnknownObject, ...sources: UnknownObject[]): UnknownObject {\r\n if (!sources.length) return target;\r\n const source = sources.shift();\r\n if (source === undefined || !isObject(target) || !isObject(source)) return target;\r\n target = { ...target };\r\n Object.keys(source).forEach((key: string): void => {\r\n const targetValue = target[key];\r\n const sourceValue = source[key];\r\n\r\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\r\n target[key] = sourceValue;\r\n } else if (isObject(targetValue) && isObject(sourceValue)) {\r\n target[key] = mergeDeep(Object.assign({}, targetValue), sourceValue);\r\n } else {\r\n target[key] = sourceValue;\r\n }\r\n });\r\n\r\n return mergeDeep(target, ...sources);\r\n}\r\n","export enum GradientType {\r\n radial = \"radial\",\r\n linear = \"linear\"\r\n}\r\n\r\nexport type Gradient = {\r\n /**\r\n * Type of gradient spread\r\n *\r\n * @default GradientType.linear\r\n */\r\n type: `${GradientType}`;\r\n /**\r\n * Rotation of gradient (in radians, Math.PI === 180 degrees)\r\n *\r\n * @default 0\r\n */\r\n rotation?: number;\r\n /** Gradient colors. */\r\n colorStops: {\r\n /** Position of color in gradient range */\r\n offset: number;\r\n /** Color of stop in gradient range */\r\n color: string;\r\n }[];\r\n};\r\n\r\nexport function sanitizeGradient(gradient: Gradient): Gradient {\r\n const newGradient = { ...gradient };\r\n\r\n if (!newGradient.colorStops || !newGradient.colorStops.length) {\r\n throw \"Field 'colorStops' is required in gradient\";\r\n }\r\n\r\n if (newGradient.rotation) {\r\n newGradient.rotation = Number(newGradient.rotation);\r\n } else {\r\n newGradient.rotation = 0;\r\n }\r\n\r\n newGradient.colorStops = newGradient.colorStops.map((colorStop: { offset: number; color: string }) => ({\r\n ...colorStop,\r\n offset: Number(colorStop.offset)\r\n }));\r\n\r\n return newGradient;\r\n}\r\n","import { browserImageTools } from \"../tools/browser-image-tools.js\";\r\nimport { ErrorCorrectionLevel, TypeNumber } from \"../types/qrcode.js\";\r\nimport { Gradient, sanitizeGradient } from \"./gradient.js\";\r\n\r\nexport enum DotType {\r\n dot = \"dot\",\r\n randomDot = \"random-dot\",\r\n rounded = \"rounded\",\r\n verticalLine = \"vertical-line\",\r\n horizontalLine = \"horizontal-line\",\r\n classy = \"classy\",\r\n classyRounded = \"classy-rounded\",\r\n square = \"square\",\r\n smallSquare = \"small-square\",\r\n extraRounded = \"extra-rounded\",\r\n diamond = \"diamond\"\r\n}\r\n\r\nexport enum CornerDotType {\r\n dot = \"dot\",\r\n square = \"square\",\r\n heart = \"heart\",\r\n extraRounded = \"extra-rounded\",\r\n classy = \"classy\",\r\n outpoint = \"outpoint\",\r\n inpoint = \"inpoint\"\r\n}\r\n\r\nexport enum CornerSquareType {\r\n dot = \"dot\",\r\n square = \"square\",\r\n extraRounded = \"extra-rounded\",\r\n classy = \"classy\",\r\n outpoint = \"outpoint\",\r\n inpoint = \"inpoint\"\r\n}\r\n\r\nexport enum ShapeType {\r\n square = \"square\",\r\n circle = \"circle\"\r\n}\r\n\r\nexport interface Options {\r\n /** Use a custom DOM domplementation */\r\n document: Document;\r\n /** Use a custom image fetching & serializaton implementation */\r\n imageTools?: typeof browserImageTools;\r\n /** @ignore */\r\n width: number;\r\n /** @ignore */\r\n height: number;\r\n /** The data will be encoded in the QR code */\r\n data: string;\r\n /** The image will be copied to the center of the QR code */\r\n image?: string | Buffer | Blob;\r\n /**\r\n * QR code shape\r\n *\r\n * @default ShapeType.square\r\n */\r\n shape: `${ShapeType}`;\r\n /** Options will be passed to `qrcode-generator` lib */\r\n qrOptions: {\r\n typeNumber: TypeNumber;\r\n mode?: `${Mode}`;\r\n /** @default ErrorCorrectionLevel.Q */\r\n errorCorrectionLevel: `${ErrorCorrectionLevel}`;\r\n };\r\n imageOptions: {\r\n /**\r\n * Hide all dots covered by the image\r\n *\r\n * @default true\r\n */\r\n hideBackgroundDots: boolean;\r\n /**\r\n * Coefficient of the image size\r\n *\r\n * @default 0.4\r\n */\r\n imageSize: number;\r\n /**\r\n * Margin of the image (in blocks)\r\n *\r\n * @default 0\r\n */\r\n margin: number;\r\n /**\r\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLImageElement/crossOrigin)\r\n */\r\n crossOrigin?: string;\r\n };\r\n dotsOptions: {\r\n /**\r\n * QR dot size (in pixels)\r\n *\r\n * @default 10\r\n */\r\n size: number;\r\n /**\r\n * Color of QR dots\r\n *\r\n * @default \"#000\"\r\n */\r\n color: string;\r\n /** Gradient of QR dots */\r\n gradient?: Gradient;\r\n /**\r\n * Style of QR dots\r\n *\r\n * @default DotType.square\r\n */\r\n type: `${DotType}`;\r\n };\r\n /** Corners Square options, omitted values match dots */\r\n cornersSquareOptions?: {\r\n /** Color of Corners Square */\r\n color?: string;\r\n /** Gradient of Corners Square */\r\n gradient?: Gradient;\r\n /** Style of Corners Square */\r\n type?: `${CornerSquareType}`;\r\n };\r\n /** Corners Dot options, omitted values match squares */\r\n cornersDotOptions?: {\r\n /** Color of Corners Dot */\r\n color?: string;\r\n /** Gradient of Corners Dot */\r\n gradient?: Gradient;\r\n /** Style of Corners Dot */\r\n type?: `${CornerDotType}`;\r\n };\r\n /** QR background styling options, false to disable background */\r\n backgroundOptions?:\r\n | {\r\n /** Background roundnes, from 0 (square) to 1 (circle) */\r\n round?: number;\r\n /** Background color */\r\n color?: string;\r\n /** Background Gradient */\r\n gradient?: Gradient;\r\n /**\r\n * Margin (in blocks) between background and the QR code\r\n *\r\n * @default 0\r\n */\r\n margin?: number;\r\n }\r\n | false;\r\n /** `import { stringToBytesFuncs } from \"@liquid-js/qr-code-styling/kanji\";` to add Kanji support */\r\n stringToBytesFuncs?: { [encoding: string]: (s: string) => number[] };\r\n}\r\n\r\nexport const defaultOptions: Options = {\r\n document: undefined as never,\r\n shape: ShapeType.square,\r\n width: undefined as never,\r\n height: undefined as never,\r\n data: \"\",\r\n qrOptions: {\r\n typeNumber: TypeNumber[0],\r\n mode: undefined,\r\n errorCorrectionLevel: ErrorCorrectionLevel.Q\r\n },\r\n imageOptions: {\r\n hideBackgroundDots: true,\r\n imageSize: 0.4,\r\n crossOrigin: undefined,\r\n margin: 0\r\n },\r\n dotsOptions: {\r\n type: DotType.square,\r\n color: \"#000\",\r\n size: 10\r\n }\r\n};\r\n\r\nexport function sanitizeOptions(options: Options): Options {\r\n const newOptions = { ...options };\r\n\r\n newOptions.imageOptions = {\r\n ...newOptions.imageOptions,\r\n hideBackgroundDots: Boolean(newOptions.imageOptions.hideBackgroundDots),\r\n imageSize: Math.min(1, Number(newOptions.imageOptions.imageSize)) || 1,\r\n margin: Number(newOptions.imageOptions.margin)\r\n };\r\n\r\n newOptions.dotsOptions = {\r\n ...newOptions.dotsOptions\r\n };\r\n if (newOptions.dotsOptions.gradient) {\r\n newOptions.dotsOptions.gradient = sanitizeGradient(newOptions.dotsOptions.gradient);\r\n }\r\n // Ensure integer dot size\r\n newOptions.dotsOptions.size = Math.round(Math.max(0, newOptions.dotsOptions.size) || 10);\r\n\r\n if (newOptions.cornersSquareOptions) {\r\n newOptions.cornersSquareOptions = {\r\n ...newOptions.cornersSquareOptions\r\n };\r\n if (newOptions.cornersSquareOptions.gradient) {\r\n newOptions.cornersSquareOptions.gradient = sanitizeGradient(newOptions.cornersSquareOptions.gradient);\r\n }\r\n }\r\n\r\n if (newOptions.cornersDotOptions) {\r\n newOptions.cornersDotOptions = {\r\n ...newOptions.cornersDotOptions\r\n };\r\n if (newOptions.cornersDotOptions.gradient) {\r\n newOptions.cornersDotOptions.gradient = sanitizeGradient(newOptions.cornersDotOptions.gradient);\r\n }\r\n }\r\n\r\n if (newOptions.backgroundOptions) {\r\n newOptions.backgroundOptions = {\r\n ...newOptions.backgroundOptions\r\n };\r\n if (newOptions.backgroundOptions.gradient) {\r\n newOptions.backgroundOptions.gradient = sanitizeGradient(newOptions.backgroundOptions.gradient);\r\n }\r\n }\r\n\r\n if (!newOptions.document) newOptions.document = document;\r\n\r\n return newOptions;\r\n}\r\n","import { ErrorCorrectionLevel, Mode } from \"../types/qrcode.js\";\r\n\r\nexport const ErrorCorrectionPercents = {\r\n [ErrorCorrectionLevel.L]: 0.07,\r\n [ErrorCorrectionLevel.M]: 0.15,\r\n [ErrorCorrectionLevel.Q]: 0.25,\r\n [ErrorCorrectionLevel.H]: 0.3\r\n};\r\n\r\nexport function getMode(data: string): Mode {\r\n switch (true) {\r\n case /^[0-9]*$/.test(data):\r\n return Mode.numeric;\r\n case /^[0-9A-Z $%*+\\-./:]*$/.test(data):\r\n return Mode.alphanumeric;\r\n // eslint-disable-next-line no-control-regex\r\n case /[^\\u0000-\\u00ff]/.test(data):\r\n return Mode.unicode;\r\n default:\r\n return Mode.byte;\r\n }\r\n}\r\n","const rx = /\\.?0+$/;\r\n\r\nexport function numToAttr(value: number) {\r\n return value.toFixed(7).replace(rx, \"\");\r\n}\r\n\r\nexport function svgPath(strings: TemplateStringsArray, ...values: unknown[]) {\r\n return strings\r\n .reduce((t, v, i) => {\r\n let p: unknown = \"\";\r\n if (i) p = values[i - 1];\r\n if (typeof p == \"number\") p = numToAttr(p);\r\n return `${t}${p}${v}`;\r\n }, \"\")\r\n .trim()\r\n .replace(/[\\s\\n\\r]+/gim, \" \");\r\n}\r\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from \"../types/helper.js\";\r\nimport { CornerDotType } from \"../utils/options.js\";\r\nimport { numToAttr, svgPath } from \"../utils/svg.js\";\r\n\r\nexport class QRCornerDot {\r\n private _element?: SVGElement;\r\n\r\n get element() {\r\n return this._element;\r\n }\r\n\r\n constructor(\r\n private readonly type: `${CornerDotType}`,\r\n private readonly document: Document\r\n ) {}\r\n\r\n draw(args: DrawArgs): void {\r\n const type = this.type;\r\n let drawFunction;\r\n\r\n switch (type) {\r\n case CornerDotType.square:\r\n drawFunction = this.drawSquare;\r\n break;\r\n case CornerDotType.heart:\r\n drawFunction = this.drawHeart;\r\n break;\r\n case CornerDotType.extraRounded:\r\n drawFunction = this.drawRounded;\r\n break;\r\n case CornerDotType.classy:\r\n drawFunction = this.drawClassy;\r\n break;\r\n case CornerDotType.inpoint:\r\n drawFunction = this.drawInpoint;\r\n break;\r\n case CornerDotType.outpoint:\r\n drawFunction = this.drawOutpoint;\r\n break;\r\n case CornerDotType.dot:\r\n default:\r\n drawFunction = this.drawDot;\r\n }\r\n\r\n drawFunction.call(this, args);\r\n }\r\n\r\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\r\n const cx = x + size / 2;\r\n const cy = y + size / 2;\r\n\r\n draw();\r\n this._element?.setAttribute(\"transform\", `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`);\r\n }\r\n\r\n private basicDot(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._element.setAttribute(\"cx\", numToAttr(x + size / 2));\r\n this._element.setAttribute(\"cy\", numToAttr(y + size / 2));\r\n this._element.setAttribute(\"r\", numToAttr(size / 2));\r\n }\r\n });\r\n }\r\n\r\n private basicSquare(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n this._element.setAttribute(\"x\", numToAttr(x));\r\n this._element.setAttribute(\"y\", numToAttr(y));\r\n this._element.setAttribute(\"width\", numToAttr(size));\r\n this._element.setAttribute(\"height\", numToAttr(size));\r\n }\r\n });\r\n }\r\n\r\n private basicHeart(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n const path = [\r\n \"M\",\r\n 0.925,\r\n 0.3538125,\r\n \"c\",\r\n 0,\r\n 0.0325869,\r\n -0.0054931,\r\n 0.0644619,\r\n -0.0164688,\r\n 0.095625,\r\n \"S\",\r\n 0.87825,\r\n 0.5147812,\r\n 0.850625,\r\n 0.5519688,\r\n \"C\",\r\n 0.823,\r\n 0.5891563,\r\n 0.7858125,\r\n 0.631125,\r\n 0.7390625,\r\n 0.677875,\r\n \"S\",\r\n 0.6331632,\r\n 0.7802256,\r\n 0.561625,\r\n 0.8446875,\r\n \"L\",\r\n 0.5,\r\n 0.8999375,\r\n \"l\",\r\n -0.061625,\r\n -0.05525,\r\n \"C\",\r\n 0.3668368,\r\n 0.7802256,\r\n 0.3076875,\r\n 0.724625,\r\n 0.2609375,\r\n 0.677875,\r\n \"S\",\r\n 0.177,\r\n 0.5891563,\r\n 0.149375,\r\n 0.5519688,\r\n \"S\",\r\n 0.1024444,\r\n 0.4806007,\r\n 0.0914688,\r\n 0.4494375,\r\n \"S\",\r\n 0.075,\r\n 0.3863994,\r\n 0.075,\r\n 0.3538125,\r\n \"C\",\r\n 0.075,\r\n 0.2872256,\r\n 0.0973125,\r\n 0.231625,\r\n 0.1419375,\r\n 0.187,\r\n \"S\",\r\n 0.2421631,\r\n 0.1200625,\r\n 0.30875,\r\n 0.1200625,\r\n \"c\",\r\n 0.0368369,\r\n 0,\r\n 0.0718994,\r\n 0.0077881,\r\n 0.1051875,\r\n 0.023375,\r\n \"S\",\r\n 0.4759131,\r\n 0.1809756,\r\n 0.5,\r\n 0.2093125,\r\n \"c\",\r\n 0.0240868,\r\n -0.0283369,\r\n 0.0527744,\r\n -0.0502881,\r\n 0.0860625,\r\n -0.065875,\r\n \"c\",\r\n 0.0332882,\r\n -0.0155869,\r\n 0.0683507,\r\n -0.023375,\r\n 0.1051875,\r\n -0.023375,\r\n \"c\",\r\n 0.0665869,\r\n 0,\r\n 0.1221875,\r\n 0.0223125,\r\n 0.1668125,\r\n 0.0669375,\r\n \"S\",\r\n 0.925,\r\n 0.2872256,\r\n 0.925,\r\n 0.3538125,\r\n \"z\"\r\n ];\r\n let move = false;\r\n let i = 0;\r\n this._element.setAttribute(\r\n \"d\",\r\n path\r\n .map((v) => {\r\n if (typeof v == \"string\") {\r\n i = 0;\r\n move = v.toUpperCase() == v;\r\n return v;\r\n }\r\n i++;\r\n v = v * size;\r\n if (move) {\r\n v += i % 2 == 1 ? x : y;\r\n }\r\n return numToAttr(v);\r\n })\r\n .join(\" \")\r\n );\r\n }\r\n\r\n private basicRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n this._element.setAttribute(\"x\", numToAttr(x));\r\n this._element.setAttribute(\"y\", numToAttr(y));\r\n this._element.setAttribute(\"width\", numToAttr(size));\r\n this._element.setAttribute(\"height\", numToAttr(size));\r\n this._element.setAttribute(\"rx\", numToAttr(size / 4));\r\n this._element.setAttribute(\"ry\", numToAttr(size / 4));\r\n }\r\n });\r\n }\r\n\r\n private basicClassy(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n const dotSize = size / 7;\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\r\n this._element.setAttribute(\r\n \"d\",\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n H ${x}\r\n z`\r\n );\r\n }\r\n });\r\n }\r\n\r\n private basicInpoint(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n const dotSize = size;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\r\n this._element.setAttribute(\r\n \"d\",\r\n svgPath`M ${x} ${y + dotSize / 2}\r\n v ${dotSize / 4}\r\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${dotSize / 4}, ${dotSize / 4}\r\n h ${(dotSize / 4) * 3}\r\n v ${(-dotSize / 4) * 3}\r\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${-dotSize / 4}, ${-dotSize / 4}\r\n h ${-dotSize / 2}\r\n a ${dotSize / 4}, ${dotSize / 4} 0 0 0 ${-dotSize / 4}, ${dotSize / 4}\r\n z`\r\n );\r\n }\r\n });\r\n }\r\n\r\n private drawDot({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicDot({ x, y, size, rotation });\r\n }\r\n\r\n private drawSquare({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicSquare({ x, y, size, rotation });\r\n }\r\n\r\n private drawHeart({ x, y, size, rotation }: DrawArgs): void {\r\n const scaleFactor = 0.2;\r\n this.basicHeart({\r\n x: x - (scaleFactor * size) / 2,\r\n y: y - (scaleFactor * size) / 2,\r\n size: size * (1 + scaleFactor),\r\n rotation\r\n });\r\n }\r\n\r\n private drawRounded({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicRounded({ x, y, size, rotation });\r\n }\r\n\r\n private drawClassy({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicClassy({ x, y, size, rotation });\r\n }\r\n\r\n private drawInpoint({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicInpoint({ x, y, size, rotation });\r\n }\r\n\r\n private drawOutpoint({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicInpoint({ x, y, size, rotation: (rotation || 0) + Math.PI });\r\n }\r\n}\r\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from \"../types/helper.js\";\r\nimport { CornerSquareType } from \"../utils/options.js\";\r\nimport { numToAttr, svgPath } from \"../utils/svg.js\";\r\n\r\nexport class QRCornerSquare {\r\n private _element?: SVGElement;\r\n\r\n get element() {\r\n return this._element;\r\n }\r\n\r\n constructor(\r\n private readonly type: `${CornerSquareType}`,\r\n private readonly document: Document\r\n ) {}\r\n\r\n draw(args: DrawArgs): void {\r\n const type = this.type;\r\n let drawFunction;\r\n\r\n switch (type) {\r\n case CornerSquareType.square:\r\n drawFunction = this.drawSquare;\r\n break;\r\n case CornerSquareType.extraRounded:\r\n drawFunction = this.drawExtraRounded;\r\n break;\r\n case CornerSquareType.classy:\r\n drawFunction = this.drawClassy;\r\n break;\r\n case CornerSquareType.outpoint:\r\n drawFunction = this.drawOutpoint;\r\n break;\r\n case CornerSquareType.inpoint:\r\n drawFunction = this.drawInpoint;\r\n break;\r\n case CornerSquareType.dot:\r\n default:\r\n drawFunction = this.drawDot;\r\n }\r\n\r\n drawFunction.call(this, args);\r\n }\r\n\r\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\r\n const cx = x + size / 2;\r\n const cy = y + size / 2;\r\n\r\n draw();\r\n this._element?.setAttribute(\"transform\", `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`);\r\n }\r\n\r\n private basicDot(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n const dotSize = size / 7;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\r\n this._element.setAttribute(\r\n \"d\",\r\n svgPath`M ${x + size / 2} ${y}\r\n a ${size / 2} ${size / 2} 0 1 0 0.1 0\r\n z\r\n m 0 ${dotSize}\r\n a ${size / 2 - dotSize} ${size / 2 - dotSize} 0 1 1 -0.1 0\r\n Z`\r\n );\r\n }\r\n });\r\n }\r\n\r\n private basicSquare(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n const dotSize = size / 7;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\r\n this._element.setAttribute(\r\n \"d\",\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n v ${-size}\r\n z\r\n M ${x + dotSize} ${y + dotSize}\r\n h ${size - 2 * dotSize}\r\n v ${size - 2 * dotSize}\r\n h ${-size + 2 * dotSize}\r\n z`\r\n );\r\n }\r\n });\r\n }\r\n\r\n private basicExtraRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n const dotSize = size / 7;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\r\n this._element.setAttribute(\r\n \"d\",\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${-dotSize * 2.5}\r\n v ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${dotSize * 2.5}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${dotSize * 1.5}\r\n h ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${-dotSize * 1.5}\r\n z`\r\n );\r\n }\r\n });\r\n }\r\n\r\n private basicClassy(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n const dotSize = size / 7;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\r\n this._element.setAttribute(\r\n \"d\",\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n H ${x}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${3.5 * dotSize}\r\n h ${-3.5 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-3.5 * dotSize}\r\n z`\r\n );\r\n }\r\n });\r\n }\r\n\r\n private basicInpoint(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n const dotSize = size / 7;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._element.setAttribute(\"clip-rule\", \"evenodd\");\r\n this._element.setAttribute(\r\n \"d\",\r\n svgPath`M ${x} ${y + 2.5 * dotSize}\r\n v ${2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}\r\n h ${4.5 * dotSize}\r\n v ${-4.5 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}\r\n h ${-2 * dotSize}\r\n a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${dotSize * 2.5}\r\n z\r\n M ${x + 2.5 * dotSize} ${y + dotSize}\r\n h ${2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}\r\n v ${3.5 * dotSize}\r\n h ${-3.5 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}\r\n v ${-2 * dotSize}\r\n a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${-dotSize * 1.5}\r\n z`\r\n );\r\n }\r\n });\r\n }\r\n\r\n private drawDot({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicDot({ x, y, size, rotation });\r\n }\r\n\r\n private drawSquare({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicSquare({ x, y, size, rotation });\r\n }\r\n\r\n private drawExtraRounded({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicExtraRounded({ x, y, size, rotation });\r\n }\r\n\r\n private drawClassy({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicClassy({ x, y, size, rotation });\r\n }\r\n\r\n private drawInpoint({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicInpoint({ x, y, size, rotation });\r\n }\r\n\r\n private drawOutpoint({ x, y, size, rotation }: DrawArgs): void {\r\n this.basicInpoint({ x, y, size, rotation: (rotation || 0) + Math.PI });\r\n }\r\n}\r\n","import { BasicFigureDrawArgs, DrawArgs, RotateFigureArgs } from \"../types/helper.js\";\r\nimport { DotType } from \"../utils/options.js\";\r\nimport { numToAttr, svgPath } from \"../utils/svg.js\";\r\n\r\nexport class QRDot {\r\n private _element?: SVGElement;\r\n\r\n get element() {\r\n return this._element;\r\n }\r\n\r\n constructor(\r\n private readonly type: `${DotType}`,\r\n private readonly document: Document\r\n ) {}\r\n\r\n draw(args: DrawArgs): void {\r\n const type = this.type;\r\n let drawFunction;\r\n\r\n switch (type) {\r\n case DotType.dot:\r\n drawFunction = this.drawDot;\r\n break;\r\n case DotType.randomDot:\r\n drawFunction = this.drawRandomDot;\r\n break;\r\n case DotType.classy:\r\n drawFunction = this.drawClassy;\r\n break;\r\n case DotType.classyRounded:\r\n drawFunction = this.drawClassyRounded;\r\n break;\r\n case DotType.rounded:\r\n drawFunction = this.drawRounded;\r\n break;\r\n case DotType.verticalLine:\r\n drawFunction = this.drawVerticalLine;\r\n break;\r\n case DotType.horizontalLine:\r\n drawFunction = this.drawHorizontalLine;\r\n break;\r\n case DotType.extraRounded:\r\n drawFunction = this.drawExtraRounded;\r\n break;\r\n case DotType.diamond:\r\n drawFunction = this.drawDiamond;\r\n break;\r\n case DotType.smallSquare:\r\n drawFunction = this.drawSmallSquare;\r\n break;\r\n case DotType.square:\r\n default:\r\n drawFunction = this.drawSquare;\r\n }\r\n\r\n drawFunction.call(this, args);\r\n }\r\n\r\n private rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\r\n const cx = x + size / 2;\r\n const cy = y + size / 2;\r\n\r\n draw();\r\n this._element?.setAttribute(\"transform\", `rotate(${numToAttr((180 * rotation) / Math.PI)},${cx},${cy})`);\r\n }\r\n\r\n private basicDot(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n this._element.setAttribute(\"cx\", numToAttr(x + size / 2));\r\n this._element.setAttribute(\"cy\", numToAttr(y + size / 2));\r\n this._element.setAttribute(\"r\", numToAttr(size / 2));\r\n }\r\n });\r\n }\r\n\r\n private basicSquare(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n this._element.setAttribute(\"x\", numToAttr(x));\r\n this._element.setAttribute(\"y\", numToAttr(y));\r\n this._element.setAttribute(\"width\", numToAttr(size));\r\n this._element.setAttribute(\"height\", numToAttr(size));\r\n }\r\n });\r\n }\r\n\r\n //if rotation === 0 - right side is rounded\r\n private basicSideRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._element.setAttribute(\r\n \"d\",\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size / 2}\r\n a ${size / 2} ${size / 2}, 0, 0, 0, 0 ${-size}\r\n z`\r\n );\r\n }\r\n });\r\n }\r\n\r\n //if rotation === 0 - top right corner is rounded\r\n private basicCornerRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._element.setAttribute(\r\n \"d\",\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n v ${-size / 2}\r\n a ${size / 2} ${size / 2}, 0, 0, 0, ${-size / 2} ${-size / 2}\r\n z`\r\n );\r\n }\r\n });\r\n }\r\n\r\n //if rotation === 0 - top right corner is rounded\r\n private basicCornerExtraRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._element.setAttribute(\r\n \"d\",\r\n svgPath`M ${x} ${y}\r\n v ${size}\r\n h ${size}\r\n a ${size} ${size}, 0, 0, 0, ${-size} ${-size}\r\n z`\r\n );\r\n }\r\n });\r\n }\r\n\r\n //if rotation === 0 - left bottom and right top corners are rounded\r\n private basicCornersRounded(args: BasicFigureDrawArgs): void {\r\n const { size, x, y } = args;\r\n\r\n this.rotateFigure({\r\n ...args,\r\n draw: () => {\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._element.setAttribute(\r\n \"d\",\r\n svgPath`M ${x} ${y}\r\n v ${size / 2}\r\n a ${size / 2} ${size / 2}, 0, 0, 0, ${size / 2} ${size / 2}\r\n h ${size / 2}\r\n v ${-size / 2}\r\n a ${size / 2} ${size / 2}, 0, 0, 0, ${-size / 2} ${-size / 2}\r\n z`\r\n );\r\n }\r\n });\r\n }\r\n\r\n private drawDot({ x, y, size }: DrawArgs): void {\r\n this.basicDot({ x, y, size, rotation: 0 });\r\n }\r\n\r\n private drawRandomDot({ x, y, size }: DrawArgs): void {\r\n const randomFactor = Math.random() * (1 - 0.75) + 0.75;\r\n this.basicDot({ x, y, size: size * randomFactor, rotation: 0 });\r\n }\r\n\r\n private drawSquare({ x, y, size }: DrawArgs): void {\r\n this.basicSquare({ x, y, size, rotation: 0 });\r\n }\r\n\r\n private drawSmallSquare({ x, y, size }: DrawArgs): void {\r\n const originalSize = size;\r\n\r\n size = originalSize * 0.7;\r\n x = x + originalSize * 0.15;\r\n y = y + originalSize * 0.15;\r\n\r\n this.basicSquare({ x, y, size, rotation: 0 });\r\n }\r\n\r\n private drawDiamond({ x, y, size }: DrawArgs): void {\r\n this.basicSquare({ x, y, size, rotation: Math.PI / 4 });\r\n }\r\n\r\n private drawRounded({ x, y, size, getNeighbor }: DrawArgs): void {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\r\n\r\n if (neighborsCount === 0) {\r\n this.basicDot({ x, y, size, rotation: 0 });\r\n return;\r\n }\r\n\r\n if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\r\n this.basicSquare({ x, y, size, rotation: 0 });\r\n return;\r\n }\r\n\r\n if (neighborsCount === 2) {\r\n let rotation = 0;\r\n\r\n if (leftNeighbor && topNeighbor) {\r\n rotation = Math.PI / 2;\r\n } else if (topNeighbor && rightNeighbor) {\r\n rotation = Math.PI;\r\n } else if (rightNeighbor && bottomNeighbor) {\r\n rotation = -Math.PI / 2;\r\n }\r\n\r\n this.basicCornerRounded({ x, y, size, rotation });\r\n return;\r\n }\r\n\r\n if (neighborsCount === 1) {\r\n let rotation = 0;\r\n\r\n if (topNeighbor) {\r\n rotation = Math.PI / 2;\r\n } else if (rightNeighbor) {\r\n rotation = Math.PI;\r\n } else if (bottomNeighbor) {\r\n rotation = -Math.PI / 2;\r\n }\r\n\r\n this.basicSideRounded({ x, y, size, rotation });\r\n return;\r\n }\r\n }\r\n\r\n private drawVerticalLine({ x, y, size, getNeighbor }: DrawArgs): void {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\r\n\r\n if (\r\n neighborsCount === 0 ||\r\n (leftNeighbor && !(topNeighbor || bottomNeighbor)) ||\r\n (rightNeighbor && !(topNeighbor || bottomNeighbor))\r\n ) {\r\n this.basicDot({ x, y, size, rotation: 0 });\r\n return;\r\n }\r\n\r\n if (topNeighbor && bottomNeighbor) {\r\n this.basicSquare({ x, y, size, rotation: 0 });\r\n return;\r\n }\r\n\r\n if (topNeighbor && !bottomNeighbor) {\r\n const rotation = Math.PI / 2;\r\n this.basicSideRounded({ x, y, size, rotation });\r\n return;\r\n }\r\n\r\n if (bottomNeighbor && !topNeighbor) {\r\n const rotation = -Math.PI / 2;\r\n this.basicSideRounded({ x, y, size, rotation });\r\n return;\r\n }\r\n }\r\n\r\n private drawHorizontalLine({ x, y, size, getNeighbor }: DrawArgs): void {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\r\n\r\n if (\r\n neighborsCount === 0 ||\r\n (topNeighbor && !(leftNeighbor || rightNeighbor)) ||\r\n (bottomNeighbor && !(leftNeighbor || rightNeighbor))\r\n ) {\r\n this.basicDot({ x, y, size, rotation: 0 });\r\n return;\r\n }\r\n\r\n if (leftNeighbor && rightNeighbor) {\r\n this.basicSquare({ x, y, size, rotation: 0 });\r\n return;\r\n }\r\n\r\n if (leftNeighbor && !rightNeighbor) {\r\n const rotation = 0;\r\n this.basicSideRounded({ x, y, size, rotation });\r\n return;\r\n }\r\n\r\n if (rightNeighbor && !leftNeighbor) {\r\n const rotation = Math.PI;\r\n this.basicSideRounded({ x, y, size, rotation });\r\n return;\r\n }\r\n }\r\n\r\n private drawExtraRounded({ x, y, size, getNeighbor }: DrawArgs): void {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\r\n\r\n if (neighborsCount === 0) {\r\n this.basicDot({ x, y, size, rotation: 0 });\r\n return;\r\n }\r\n\r\n if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\r\n this.basicSquare({ x, y, size, rotation: 0 });\r\n return;\r\n }\r\n\r\n if (neighborsCount === 2) {\r\n let rotation = 0;\r\n\r\n if (leftNeighbor && topNeighbor) {\r\n rotation = Math.PI / 2;\r\n } else if (topNeighbor && rightNeighbor) {\r\n rotation = Math.PI;\r\n } else if (rightNeighbor && bottomNeighbor) {\r\n rotation = -Math.PI / 2;\r\n }\r\n\r\n this.basicCornerExtraRounded({ x, y, size, rotation });\r\n return;\r\n }\r\n\r\n if (neighborsCount === 1) {\r\n let rotation = 0;\r\n\r\n if (topNeighbor) {\r\n rotation = Math.PI / 2;\r\n } else if (rightNeighbor) {\r\n rotation = Math.PI;\r\n } else if (bottomNeighbor) {\r\n rotation = -Math.PI / 2;\r\n }\r\n\r\n this.basicSideRounded({ x, y, size, rotation });\r\n return;\r\n }\r\n }\r\n\r\n private drawClassy({ x, y, size, getNeighbor }: DrawArgs): void {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\r\n\r\n if (neighborsCount === 0) {\r\n this.basicCornersRounded({ x, y, size, rotation: Math.PI / 2 });\r\n return;\r\n }\r\n\r\n if (!leftNeighbor && !topNeighbor) {\r\n this.basicCornerRounded({ x, y, size, rotation: -Math.PI / 2 });\r\n return;\r\n }\r\n\r\n if (!rightNeighbor && !bottomNeighbor) {\r\n this.basicCornerRounded({ x, y, size, rotation: Math.PI / 2 });\r\n return;\r\n }\r\n\r\n this.basicSquare({ x, y, size, rotation: 0 });\r\n }\r\n\r\n private drawClassyRounded({ x, y, size, getNeighbor }: DrawArgs): void {\r\n const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\r\n const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\r\n const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\r\n const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\r\n\r\n const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\r\n\r\n if (neighborsCount === 0) {\r\n this.basicCornersRounded({ x, y, size, rotation: Math.PI / 2 });\r\n return;\r\n }\r\n\r\n if (!leftNeighbor && !topNeighbor) {\r\n this.basicCornerExtraRounded({ x, y, size, rotation: -Math.PI / 2 });\r\n return;\r\n }\r\n\r\n if (!rightNeighbor && !bottomNeighbor) {\r\n this.basicCornerExtraRounded({ x, y, size, rotation: Math.PI / 2 });\r\n return;\r\n }\r\n\r\n this.basicSquare({ x, y, size, rotation: 0 });\r\n }\r\n}\r\n","export const browserImageTools = {\r\n toDataURL(url: string | Buffer | Blob): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n if (typeof url == \"string\") {\r\n const xhr = new XMLHttpRequest();\r\n xhr.onload = function () {\r\n const reader = new FileReader();\r\n reader.onloadend = function () {\r\n resolve(reader.result as string);\r\n };\r\n reader.readAsDataURL(xhr.response);\r\n };\r\n xhr.onerror = xhr.onabort = xhr.ontimeout = reject;\r\n xhr.open(\"GET\", url);\r\n xhr.responseType = \"blob\";\r\n xhr.send();\r\n } else {\r\n const reader = new FileReader();\r\n reader.onloadend = function () {\r\n resolve(reader.result as string);\r\n };\r\n reader.readAsDataURL(url as Blob);\r\n }\r\n });\r\n },\r\n getSize(src: string | Blob | Buffer, crossOrigin?: string): Promise<{ width: number; height: number }> {\r\n return new Promise((resolve, reject) => {\r\n const image = new Image();\r\n\r\n if (crossOrigin === \"string\") {\r\n image.crossOrigin = crossOrigin;\r\n }\r\n\r\n image.onload = (): void => {\r\n resolve({ width: image.width, height: image.height });\r\n };\r\n image.onerror = image.onabort = reject;\r\n\r\n if (typeof src == \"string\") image.src = src;\r\n else\r\n browserImageTools\r\n .toDataURL(src)\r\n .then((url) => (image.src = url))\r\n .catch(reject);\r\n });\r\n }\r\n};\r\n","import { QRCornerDot } from \"../figures/corner-dot.js\";\r\nimport { QRCornerSquare } from \"../figures/corner-square.js\";\r\nimport { QRDot } from \"../figures/dot.js\";\r\nimport { browserImageTools } from \"../tools/browser-image-tools.js\";\r\nimport { Gradient, GradientType } from \"../utils/gradient.js\";\r\nimport { calculateImageSize } from \"../utils/image.js\";\r\nimport { Options, ShapeType } from \"../utils/options.js\";\r\nimport { numToAttr } from \"../utils/svg.js\";\r\n\r\nconst squareMask = [\r\n [1, 1, 1, 1, 1, 1, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 0, 0, 0, 0, 0, 1],\r\n [1, 1, 1, 1, 1, 1, 1]\r\n];\r\n\r\nconst dotMask = [\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 1, 1, 1, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0],\r\n [0, 0, 0, 0, 0, 0, 0]\r\n];\r\n\r\nconst alignmentCount = [\r\n [35, 49],\r\n [28, 36],\r\n [21, 25],\r\n [14, 16],\r\n [7, 9],\r\n [2, 4],\r\n [1, 1]\r\n];\r\n\r\nexport class QRSVG {\r\n private _element: SVGElement;\r\n\r\n get element() {\r\n return this._element;\r\n }\r\n\r\n private defs: SVGElement;\r\n\r\n private backgroundMask?: SVGElement;\r\n private backgroundMaskGroup?: SVGElement;\r\n\r\n private dotsMask?: SVGElement;\r\n private dotsMaskGroup?: SVGElement;\r\n\r\n private qr?: QRCode;\r\n private document: Document;\r\n private imageTools: typeof browserImageTools;\r\n\r\n constructor(\r\n private options: Pick<\r\n Options,\r\n | \"width\"\r\n | \"height\"\r\n | \"document\"\r\n | \"imageTools\"\r\n | \"image\"\r\n | \"imageOptions\"\r\n | \"dotsOptions\"\r\n | \"cornersDotOptions\"\r\n | \"cornersSquareOptions\"\r\n | \"backgroundOptions\"\r\n | \"shape\"\r\n > & { errorCorrectionPercent: number }\r\n ) {\r\n this.document = options.document;\r\n this._element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n const width = numToAttr(options.width);\r\n const height = numToAttr(options.height);\r\n this._element.setAttribute(\"width\", width);\r\n this._element.setAttribute(\"height\", height);\r\n this._element.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\r\n this.defs = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\");\r\n this._element.appendChild(this.defs);\r\n this.imageTools = options.imageTools || browserImageTools;\r\n }\r\n\r\n get width(): number {\r\n return this.options.width;\r\n }\r\n\r\n get height(): number {\r\n return this.options.height;\r\n }\r\n\r\n async drawQR(qr: QRCode): Promise<void> {\r\n const count = qr.getModuleCount();\r\n const typeNumber = parseInt(((count - 17) / 4).toFixed(0), 10);\r\n const dotSize = this.options.dotsOptions.size;\r\n let drawImageSize = {\r\n hideXDots: 0,\r\n hideYDots: 0,\r\n width: 0,\r\n height: 0\r\n };\r\n\r\n this.qr = qr;\r\n\r\n if (this.options.image) {\r\n //We need it to get image size\r\n const size = await this.imageTools.getSize(this.options.image, this.options.imageOptions.crossOrigin);\r\n const { imageOptions, errorCorrectionPercent } = this.options;\r\n const coverLevel = imageOptions.imageSize * errorCorrectionPercent;\r\n const alignment = alignmentCount.find((v) => v[0] <= typeNumber) || [0, 0];\r\n const maxHiddenDots = Math.floor(coverLevel * (count * count - 3 * 8 * 8 - 2 * (count - 16) - alignment[1] * 25));\r\n\r\n drawImageSize = calculateImageSize({\r\n originalWidth: size.width,\r\n originalHeight: size.height,\r\n maxHiddenDots,\r\n maxHiddenAxisDots: count - 14,\r\n dotSize,\r\n margin: imageOptions.margin\r\n });\r\n }\r\n\r\n this.drawBackground();\r\n this.drawDots((i: number, j: number): boolean => {\r\n if (this.options.imageOptions.hideBackgroundDots) {\r\n if (\r\n i >= (count - drawImageSize.hideXDots) / 2 &&\r\n i < (count + drawImageSize.hideXDots) / 2 &&\r\n j >= (count - drawImageSize.hideYDots) / 2 &&\r\n j < (count + drawImageSize.hideYDots) / 2\r\n ) {\r\n return false;\r\n }\r\n }\r\n\r\n if (squareMask[i]?.[j] || squareMask[i - count + 7]?.[j] || squareMask[i]?.[j - count + 7]) {\r\n return false;\r\n }\r\n\r\n if (dotMask[i]?.[j] || dotMask[i - count + 7]?.[j] || dotMask[i]?.[j - count + 7]) {\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n this.drawCorners();\r\n\r\n if (this.options.image && drawImageSize.width > 0 && drawImageSize.height > 0) {\r\n await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize });\r\n }\r\n }\r\n\r\n drawBackground(): void {\r\n const element = this._element;\r\n const options = this.options;\r\n\r\n if (element && options.backgroundOptions) {\r\n const gradientOptions = options.backgroundOptions.gradient;\r\n const color = options.backgroundOptions.color;\r\n\r\n this.createColor({\r\n options: gradientOptions,\r\n color: color,\r\n additionalRotation: 0,\r\n x: 0,\r\n y: 0,\r\n height: options.height,\r\n width: options.width,\r\n name: \"background-color\"\r\n });\r\n\r\n const size = Math.min(options.width, options.height);\r\n const element = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n [this.backgroundMask, this.backgroundMaskGroup] = this.createMask(\"mask-background-color\");\r\n this.defs.appendChild(this.backgroundMask);\r\n\r\n element.setAttribute(\"x\", numToAttr((options.width - size) / 2));\r\n element.setAttribute(\"y\", numToAttr((options.height - size) / 2));\r\n element.setAttribute(\"width\", numToAttr(size));\r\n element.setAttribute(\"height\", numToAttr(size));\r\n element.setAttribute(\"rx\", numToAttr((size / 2) * (options.backgroundOptions.round || 0)));\r\n\r\n this.backgroundMaskGroup.appendChild(element);\r\n }\r\n }\r\n\r\n drawDots(filter?: (i: number, j: number) => boolean): void {\r\n if (!this.qr) {\r\n throw \"QR code is not defined\";\r\n }\r\n\r\n const options = this.options;\r\n const count = this.qr.getModuleCount();\r\n\r\n if (count > options.width || count > options.height) {\r\n throw \"The canvas is too small.\";\r\n }\r\n\r\n const minSize = Math.min(options.width, options.height);\r\n const dotSize = this.options.dotsOptions.size;\r\n const xBeginning = Math.floor((options.width - count * dotSize) / 2);\r\n const yBeginning = Math.floor((options.height - count * dotSize) / 2);\r\n const dot = new QRDot(options.dotsOptions.type, this.document);\r\n\r\n [this.dotsMask, this.dotsMaskGroup] = this.createMask(\"mask-dot-color\");\r\n this.defs.appendChild(this.dotsMask);\r\n\r\n for (let i = 0; i < count; i++) {\r\n for (let j = 0; j < count; j++) {\r\n if (filter && !filter(i, j)) {\r\n continue;\r\n }\r\n if (!this.qr?.isDark(j, i)) {\r\n continue;\r\n }\r\n\r\n dot.draw({\r\n x: xBeginning + i * dotSize,\r\n y: yBeginning + j * dotSize,\r\n size: dotSize,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => {\r\n if (i + xOffset < 0 || j + yOffset < 0 || i + xOffset >= count || j + yOffset >= count) return false;\r\n if (filter && !filter(i + xOffset, j + yOffset)) return false;\r\n return !!this.qr && this.qr.isDark(j + yOffset, i + xOffset);\r\n }\r\n });\r\n\r\n if (dot.element && this.dotsMask) {\r\n this.dotsMaskGroup.appendChild(dot.element);\r\n }\r\n }\r\n }\r\n\r\n let colorX = xBeginning;\r\n let colorY = yBeginning;\r\n let colorCount = count;\r\n\r\n if (options.shape === ShapeType.circle) {\r\n const margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0;\r\n const additionalDots = Math.floor((minSize / dotSize - count - 2 * margin) / 2);\r\n const fakeCount = count + additionalDots * 2;\r\n const xFakeBeginning = xBeginning - additionalDots * dotSize;\r\n const yFakeBeginning = yBeginning - additionalDots * dotSize;\r\n colorX = xFakeBeginning;\r\n colorY = yFakeBeginning;\r\n colorCount = count + additionalDots * 2;\r\n const fakeMatrix: number[][] = [];\r\n const center = Math.floor(fakeCount / 2);\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n fakeMatrix[i] = [];\r\n for (let j = 0; j < fakeCount; j++) {\r\n if (\r\n i >= additionalDots - 1 &&\r\n i <= fakeCount - additionalDots &&\r\n j >= additionalDots - 1 &&\r\n j <= fakeCount - additionalDots\r\n ) {\r\n fakeMatrix[i][j] = 0;\r\n continue;\r\n }\r\n\r\n if (Math.sqrt((i - center) * (i - center) + (j - center) * (j - center)) > center) {\r\n fakeMatrix[i][j] = 0;\r\n continue;\r\n }\r\n\r\n //Get random dots from QR code to show it outside of QR code\r\n fakeMatrix[i][j] = this.qr.isDark(\r\n j - 2 * additionalDots < 0 ? j : j >= count ? j - 2 * additionalDots : j - additionalDots,\r\n i - 2 * additionalDots < 0 ? i : i >= count ? i - 2 * additionalDots : i - additionalDots\r\n )\r\n ? 1\r\n : 0;\r\n }\r\n }\r\n\r\n for (let i = 0; i < fakeCount; i++) {\r\n for (let j = 0; j < fakeCount; j++) {\r\n if (!fakeMatrix[i][j]) continue;\r\n\r\n dot.draw({\r\n x: xFakeBeginning + i * dotSize,\r\n y: yFakeBeginning + j * dotSize,\r\n size: dotSize,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => {\r\n return !!fakeMatrix[i + xOffset]?.[j + yOffset];\r\n }\r\n });\r\n if (dot.element && this.dotsMask) {\r\n this.dotsMaskGroup.appendChild(dot.element);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.createColor({\r\n options: options.dotsOptions?.gradient,\r\n color: options.dotsOptions.color,\r\n additionalRotation: 0,\r\n x: colorX,\r\n y: colorY,\r\n height: colorCount * dotSize,\r\n width: colorCount * dotSize,\r\n name: \"dot-color\"\r\n });\r\n }\r\n\r\n drawCorners(): void {\r\n if (!this.qr) {\r\n throw \"QR code is not defined\";\r\n }\r\n\r\n const element = this._element;\r\n const options = this.options;\r\n\r\n if (!element) {\r\n throw \"Element code is not defined\";\r\n }\r\n\r\n const count = this.qr.getModuleCount();\r\n const dotSize = this.options.dotsOptions.size;\r\n const cornersSquareSize = dotSize * 7;\r\n const cornersDotSize = dotSize * 3;\r\n const xBeginning = Math.floor((options.width - count * dotSize) / 2);\r\n const yBeginning = Math.floor((options.height - count * dotSize) / 2);\r\n\r\n [\r\n [0, 0, 0],\r\n [1, 0, Math.PI / 2],\r\n [0, 1, -Math.PI / 2]\r\n ].forEach(([column, row, rotation]) => {\r\n const x = xBeginning + column * dotSize * (count - 7);\r\n const y = yBeginning + row * dotSize * (count - 7);\r\n let cornersSquareMask = this.dotsMask;\r\n let cornersSquareMaskGroup = this.dotsMaskGroup;\r\n let cornersDotMask = this.dotsMask;\r\n let cornersDotMaskGroup = this.dotsMaskGroup;\r\n\r\n if (options.cornersSquareOptions?.gradient || options.cornersSquareOptions?.color) {\r\n [cornersSquareMask, cornersSquareMaskGroup] = this.createMask(`mask-corners-square-color-${column}-${row}`);\r\n this.defs.appendChild(cornersSquareMask);\r\n cornersDotMask = cornersSquareMask;\r\n cornersDotMaskGroup = cornersSquareMaskGroup;\r\n\r\n this.createColor({\r\n options: options.cornersSquareOptions?.gradient,\r\n color: options.cornersSquareOptions?.color,\r\n additionalRotation: rotation,\r\n x,\r\n y,\r\n height: cornersSquareSize,\r\n width: cornersSquareSize,\r\n name: `corners-square-color-${column}-${row}`\r\n });\r\n }\r\n\r\n if (options.cornersSquareOptions?.type) {\r\n const cornersSquare = new QRCornerSquare(options.cornersSquareOptions.type, this.document);\r\n\r\n cornersSquare.draw({\r\n x,\r\n y,\r\n size: cornersSquareSize,\r\n rotation\r\n });\r\n\r\n if (cornersSquare.element && cornersSquareMaskGroup) {\r\n cornersSquareMaskGroup.appendChild(cornersSquare.element);\r\n }\r\n } else {\r\n const dot = new QRDot(options.dotsOptions.type, this.document);\r\n\r\n for (let i = 0; i < squareMask.length; i++) {\r\n for (let j = 0; j < squareMask[i].length; j++) {\r\n if (!squareMask[i]?.[j]) {\r\n continue;\r\n }\r\n\r\n dot.draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!squareMask[i + xOffset]?.[j + yOffset]\r\n });\r\n\r\n if (dot.element && cornersSquareMaskGroup) {\r\n cornersSquareMaskGroup.appendChild(dot.element);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (options.cornersDotOptions?.gradient || options.cornersDotOptions?.color) {\r\n [cornersDotMask, cornersDotMaskGroup] = this.createMask(`mask-corners-dot-color-${column}-${row}`);\r\n this.defs.appendChild(cornersDotMask);\r\n\r\n this.createColor({\r\n options: options.cornersDotOptions?.gradient,\r\n color: options.cornersDotOptions?.color,\r\n additionalRotation: rotation,\r\n x: x + dotSize * 2,\r\n y: y + dotSize * 2,\r\n height: cornersDotSize,\r\n width: cornersDotSize,\r\n name: `corners-dot-color-${column}-${row}`\r\n });\r\n }\r\n\r\n if (options.cornersDotOptions?.type) {\r\n const cornersDot = new QRCornerDot(options.cornersDotOptions.type, this.document);\r\n\r\n cornersDot.draw({\r\n x: x + dotSize * 2,\r\n y: y + dotSize * 2,\r\n size: cornersDotSize,\r\n rotation\r\n });\r\n\r\n if (cornersDot.element && cornersDotMaskGroup) {\r\n cornersDotMaskGroup.appendChild(cornersDot.element);\r\n }\r\n } else {\r\n const dot = new QRDot(options.dotsOptions.type, this.document);\r\n\r\n for (let i = 0; i < dotMask.length; i++) {\r\n for (let j = 0; j < dotMask[i].length; j++) {\r\n if (!dotMask[i]?.[j]) {\r\n continue;\r\n }\r\n\r\n dot.draw({\r\n x: x + i * dotSize,\r\n y: y + j * dotSize,\r\n size: dotSize,\r\n getNeighbor: (xOffset: number, yOffset: number): boolean => !!dotMask[i + xOffset]?.[j + yOffset]\r\n });\r\n\r\n if (dot.element && cornersDotMaskGroup) {\r\n cornersDotMaskGroup.appendChild(dot.element);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n async drawImage({\r\n width,\r\n height,\r\n count,\r\n dotSize\r\n }: {\r\n width: number;\r\n height: number;\r\n count: number;\r\n dotSize: number;\r\n }): Promise<void> {\r\n const options = this.options;\r\n const xBeginning = Math.floor((options.width - count * dotSize) / 2);\r\n const yBeginning = Math.floor((options.height - count * dotSize) / 2);\r\n const margin = options.imageOptions.margin * dotSize;\r\n const dx = xBeginning + margin + (count * dotSize - width) / 2;\r\n const dy = yBeginning + margin + (count * dotSize - height) / 2;\r\n const dw = width - margin * 2;\r\n const dh = height - margin * 2;\r\n\r\n const imageUrl = await this.imageTools.toDataURL(options.image || \"\");\r\n let image: SVGElement = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"image\");\r\n image.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", imageUrl || \"\");\r\n\r\n if (imageUrl.startsWith(\"data:image/svg+xml;\")) {\r\n let data = imageUrl.substring(19);\r\n const i = data.indexOf(\",\");\r\n const encoding = data.substring(0, i);\r\n data = data.substring(i + 1);\r\n\r\n switch (encoding) {\r\n case \"base64\":\r\n data = typeof atob == \"function\" ? atob(data) : Buffer.from(data, \"base64\").toString(\"utf8\");\r\n break;\r\n default:\r\n data = \"\";\r\n break;\r\n }\r\n\r\n if (data) {\r\n const container = new DOMParser().parseFromString(data, \"text/xml\");\r\n const rootEl = Array.from(container.getElementsByTagName(\"svg\"));\r\n if (rootEl.length) image = rootEl[0];\r\n }\r\n }\r\n\r\n image.setAttribute(\"x\", numToAttr(dx));\r\n image.setAttribute(\"y\", numToAttr(dy));\r\n image.setAttribute(\"width\", `${numToAttr(dw)}px`);\r\n image.setAttribute(\"height\", `${numToAttr(dh)}px`);\r\n\r\n this._element.appendChild(image);\r\n }\r\n\r\n private createColor({\r\n options,\r\n color,\r\n additionalRotation,\r\n x,\r\n y,\r\n height,\r\n width,\r\n name\r\n }: {\r\n options?: Gradient;\r\n color?: string;\r\n additionalRotation: number;\r\n x: number;\r\n y: number;\r\n height: number;\r\n width: number;\r\n name: string;\r\n }): void {\r\n const size = width > height ? width : height;\r\n const rect = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n rect.setAttribute(\"x\", numToAttr(x));\r\n rect.setAttribute(\"y\", numToAttr(y));\r\n rect.setAttribute(\"height\", numToAttr(height));\r\n rect.setAttribute(\"width\", numToAttr(width));\r\n rect.setAttribute(\"style\", `mask:url(#mask-${name})`);\r\n\r\n if (options) {\r\n let gradient: SVGElement;\r\n if (options.type === GradientType.radial) {\r\n gradient = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"radialGradient\");\r\n gradient.setAttribute(\"id\", name);\r\n gradient.setAttribute(\"gradientUnits\", \"userSpaceOnUse\");\r\n gradient.setAttribute(\"fx\", numToAttr(x + width / 2));\r\n gradient.setAttribute(\"fy\", numToAttr(y + height / 2));\r\n gradient.setAttribute(\"cx\", numToAttr(x + width / 2));\r\n gradient.setAttribute(\"cy\", numToAttr(y + height / 2));\r\n gradient.setAttribute(\"r\", numToAttr(size / 2));\r\n } else {\r\n const rotation = ((options.rotation || 0) + additionalRotation) % (2 * Math.PI);\r\n const positiveRotation = (rotation + 2 * Math.PI) % (2 * Math.PI);\r\n let x0 = x + width / 2;\r\n let y0 = y + height / 2;\r\n let x1 = x + width / 2;\r\n let y1 = y + height / 2;\r\n\r\n if (\r\n (positiveRotation >= 0 && positiveRotation <= 0.25 * Math.PI) ||\r\n (positiveRotation > 1.75 * Math.PI && positiveRotation <= 2 * Math.PI)\r\n ) {\r\n x0 = x0 - width / 2;\r\n y0 = y0 - (height / 2) * Math.tan(rotation);\r\n x1 = x1 + width / 2;\r\n y1 = y1 + (height / 2) * Math.tan(rotation);\r\n } else if (positiveRotation > 0.25 * Math.PI && positiveRotation <= 0.75 * Math.PI) {\r\n y0 = y0 - height / 2;\r\n x0 = x0 - width / 2 / Math.tan(rotation);\r\n y1 = y1 + height / 2;\r\n x1 = x1 + width / 2 / Math.tan(rotation);\r\n } else if (positiveRotation > 0.75 * Math.PI && positiveRotation <= 1.25 * Math.PI) {\r\n x0 = x0 + width / 2;\r\n y0 = y0 + (height / 2) * Math.tan(rotation);\r\n x1 = x1 - width / 2;\r\n y1 = y1 - (height / 2) * Math.tan(rotation);\r\n } else if (positiveRotation > 1.25 * Math.PI && positiveRotation <= 1.75 * Math.PI) {\r\n y0 = y0 + height / 2;\r\n x0 = x0 + width / 2 / Math.tan(rotation);\r\n y1 = y1 - height / 2;\r\n x1 = x1 - width / 2 / Math.tan(rotation);\r\n }\r\n\r\n gradient = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"linearGradient\");\r\n gradient.setAttribute(\"id\", name);\r\n gradient.setAttribute(\"gradientUnits\", \"userSpaceOnUse\");\r\n gradient.setAttribute(\"x1\", numToAttr(x0));\r\n gradient.setAttribute(\"y1\", numToAttr(y0));\r\n gradient.setAttribute(\"x2\", numToAttr(x1));\r\n gradient.setAttribute(\"y2\", numToAttr(y1));\r\n }\r\n\r\n options.colorStops.forEach(({ offset, color }: { offset: number; color: string }) => {\r\n const stop = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"stop\");\r\n stop.setAttribute(\"offset\", `${numToAttr(100 * offset)}%`);\r\n stop.setAttribute(\"stop-color\", color);\r\n gradient.appendChild(stop);\r\n });\r\n\r\n rect.setAttribute(\"fill\", `url(#${name})`);\r\n this.defs.appendChild(gradient);\r\n } else if (color) {\r\n rect.setAttribute(\"fill\", color);\r\n }\r\n\r\n this._element.appendChild(rect);\r\n }\r\n\r\n private createMask(id: string) {\r\n const options = this.options;\r\n\r\n const mask = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"mask\");\r\n mask.setAttribute(\"id\", id);\r\n mask.setAttribute(\"maskUnits\", \"userSpaceOnUse\");\r\n mask.setAttribute(\"x\", \"0\");\r\n mask.setAttribute(\"y\", \"0\");\r\n mask.setAttribute(\"width\", numToAttr(options.width));\r\n mask.setAttribute(\"height\", numToAttr(options.height));\r\n\r\n const group = this.document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\r\n group.setAttribute(\"fill\", \"#fff\");\r\n mask.appendChild(group);\r\n\r\n return [mask, group];\r\n }\r\n}\r\n","interface ImageSizeOptions {\r\n originalHeight: number;\r\n originalWidth: number;\r\n maxHiddenDots: number;\r\n maxHiddenAxisDots?: number;\r\n dotSize: number;\r\n margin: number;\r\n}\r\n\r\ninterface ImageSizeResult {\r\n height: number;\r\n width: number;\r\n hideYDots: number;\r\n hideXDots: number;\r\n}\r\n\r\nexport function calculateImageSize({\r\n originalHeight,\r\n originalWidth,\r\n maxHiddenDots,\r\n maxHiddenAxisDots,\r\n dotSize,\r\n margin\r\n}: ImageSizeOptions): ImageSizeResult {\r\n const hideDots = { x: 0, y: 0 };\r\n const imageSize = { x: 0, y: 0 };\r\n\r\n if (\r\n originalHeight <= 0 ||\r\n originalWidth <= 0 ||\r\n maxHiddenDots <= 0 ||\r\n dotSize <= 0 ||\r\n 4 * margin ** 2 > maxHiddenDots\r\n ) {\r\n return {\r\n height: 0,\r\n width: 0,\r\n hideYDots: 0,\r\n hideXDots: 0\r\n };\r\n }\r\n\r\n //If set, ensure maxHiddenAxisDots is odd and at least 1\r\n if (maxHiddenAxisDots && maxHiddenAxisDots % 2 == 0) maxHiddenAxisDots = Math.max(1, maxHiddenAxisDots - 1);\r\n\r\n //Determine the bigger and smaller image dimension\r\n const dimMax = Math.max(originalWidth, originalHeight);\r\n const dimMin = Math.min(originalWidth, originalHeight);\r\n\r\n //Find max image size along the bigger dimension\r\n let lower = 0,\r\n upper = (maxHiddenAxisDots || maxHiddenDots) - 2 * margin;\r\n do {\r\n const size = lower + (upper - lower) / 2;\r\n let dotsMax = Math.max(1, Math.ceil(size + 2 * margin));\r\n if (dotsMax % 2 == 0) dotsMax++;\r\n let dotsMin = Math.max(1, Math.ceil((size * dimMin) / dimMax + 2 * margin));\r\n if (dotsMin % 2 == 0) dotsMin++;\r\n\r\n if (dotsMax * dotsMin > maxHiddenDots) upper = size;\r\n else lower = size;\r\n } while (Math.abs(lower - upper) > 0.001);\r\n\r\n //Calculate how many dots the given size corresponds to\r\n const size = lower;\r\n let hideMax = Math.max(1, Math.ceil(size + 2 * margin));\r\n if (hideMax % 2 == 0) hideMax++;\r\n let hideMin = Math.max(1, Math.ceil((size * dimMin) / dimMax + 2 * margin));\r\n if (hideMin % 2 == 0) hideMin++;\r\n\r\n //Set hidden dots along bigger and smaller dimension to the right axis\r\n if (originalWidth > originalHeight) {\r\n hideDots.x = hideMax;\r\n hideDots.y = hideMin;\r\n } else {\r\n hideDots.x = hideMin;\r\n hideDots.y = hideMax;\r\n }\r\n\r\n //Fit image to the hidden dots\r\n const maxW = (hideDots.x - 2 * margin) * dotSize;\r\n const maxH = (hideDots.y - 2 * margin) * dotSize;\r\n imageSize.x = maxW;\r\n imageSize.y = (maxW * originalHeight) / originalWidth;\r\n if (imageSize.y > maxH) {\r\n imageSize.y = maxH;\r\n imageSize.x = (maxH * originalWidth) / originalHeight;\r\n }\r\n\r\n return {\r\n height: Math.round(imageSize.y + 2 * margin * dotSize),\r\n width: Math.round(imageSize.x + 2 * margin * dotSize),\r\n hideYDots: hideDots.y,\r\n hideXDots: hideDots.x\r\n };\r\n}\r\n","import qrcode from \"qrcode-generator\";\r\nimport { RecursivePartial } from \"../types/helper.js\";\r\nimport { Mode } from \"../types/qrcode.js\";\r\nimport { mergeDeep } from \"../utils/merge.js\";\r\nimport { Options, ShapeType, defaultOptions, sanitizeOptions } from \"../utils/options.js\";\r\nimport { ErrorCorrectionPercents, getMode } from \"../utils/qrcode.js\";\r\nimport { QRSVG } from \"./qr-svg.js\";\r\n\r\nexport type ExtensionFunction = (svg: SVGElement, options: RecursivePartial<Options>) => void;\r\n\r\nexport class QRCodeStyling {\r\n private options: Options;\r\n private container?: HTMLElement;\r\n private qr?: QRCode;\r\n private extension?: ExtensionFunction;\r\n private svgDrawingPromise?: Promise<void>;\r\n private qrSVG?: QRSVG;\r\n\r\n get size() {\r\n if (this.qrSVG)\r\n return {\r\n width: this.qrSVG.width,\r\n height: this.qrSVG.height\r\n };\r\n return undefined;\r\n }\r\n\r\n constructor(options?: RecursivePartial<Options>) {\r\n this.options = options ? sanitizeOptions(mergeDeep(defaultOptions, options) as Options) : defaultOptions;\r\n this.update();\r\n }\r\n\r\n update(\r\n /** The same options as for initialization */\r\n options?: RecursivePartial<Options>\r\n ): void {\r\n if (this.container) this.container.innerHTML = \"\";\r\n\r\n this.options = options ? sanitizeOptions(mergeDeep(this.options, options) as Options) : this.options;\r\n\r\n if (!this.options.data) {\r\n return;\r\n }\r\n\r\n if (this.options.stringToBytesFuncs) {\r\n Object.assign(qrcode.stringToBytesFuncs, this.options.stringToBytesFuncs);\r\n delete this.options.stringToBytesFuncs;\r\n }\r\n\r\n this.qr = qrcode(this.options.qrOptions.typeNumber, this.options.qrOptions.errorCorrectionLevel);\r\n let mode = this.options.qrOptions.mode || getMode(this.options.data);\r\n if (mode == Mode.unicode) {\r\n qrcode.stringToBytes = qrcode.stringToBytesFuncs[\"UTF-8\"];\r\n mode = Mode.byte;\r\n } else {\r\n qrcode.stringToBytes = qrcode.stringToBytesFuncs[\"default\"];\r\n }\r\n this.qr.addData(this.options.data, mode);\r\n this.qr.make();\r\n\r\n this.setupSvg();\r\n\r\n this.append(this.container);\r\n }\r\n\r\n append(\r\n /** This container will be used for appending of the QR code */\r\n container?: HTMLElement\r\n ): void {\r\n if (!container) {\r\n return;\r\n }\r\n\r\n if (this.qrSVG?.element) {\r\n container.appendChild(this.qrSVG.element);\r\n }\r\n\r\n this.container = container;\r\n }\r\n\r\n /**\r\n *\r\n * @example\r\n *\r\n * ```js\r\n * const extension = (svg, options) => {\r\n * const { width, height } = options;\r\n * const size = Math.min(width, height);\r\n * const border = options.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\r\n * const borderAttributes = {\r\n * fill: \"none\",\r\n * x: (width - size + 40) / 2,\r\n * y: (height - size + 40) / 2,\r\n * width: size - 40,\r\n * height: size - 40,\r\n * stroke: \"black\",\r\n * \"stroke-width\": 40,\r\n * rx: 100\r\n * };\r\n * Object.keys(borderAttributes).forEach((attribute) => {\r\n * border.setAttribute(attribute, borderAttributes[attribute]);\r\n * });\r\n * svg.appendChild(border);\r\n * };\r\n * ```\r\n */\r\n applyExtension(\r\n /** Extension is a function that takes svg and previously applied options and modifies an svg */\r\n extension: ExtensionFunction\r\n ): void {\r\n if (!extension) {\r\n throw \"Extension function should be defined.\";\r\n }\r\n\r\n this.extension = extension;\r\n this.update();\r\n }\r\n\r\n deleteExtension(): void {\r\n this.extension = undefined;\r\n this.update();\r\n }\r\n\r\n async serialize(): Promise<string | undefined> {\r\n if (!this.qr) throw \"QR code is empty\";\r\n\r\n if (!this.qrSVG?.element || !this.svgDrawingPromise) {\r\n this.setupSvg();\r\n }\r\n await this.svgDrawingPromise;\r\n\r\n if (!this.qrSVG?.element) {\r\n return;\r\n }\r\n\r\n const serializer = new XMLSerializer();\r\n let source = serializer.serializeToString(this.qrSVG.element);\r\n\r\n source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source;\r\n return source;\r\n }\r\n\r\n private setupSvg(): void {\r\n if (!this.qr) {\r\n return;\r\n }\r\n const count = Math.ceil((this.options.shape == ShapeType.circle ? Math.sqrt(2) : 1) * this.qr.getModuleCount());\r\n const margin = (this.options.backgroundOptions && this.options.backgroundOptions.margin) || 0;\r\n const size = Math.ceil(this.options.dotsOptions.size * (count + 2 * margin));\r\n this.qrSVG = new QRSVG({\r\n ...this.options,\r\n width: size,\r\n height: size,\r\n errorCorrectionPercent: ErrorCorrectionPercents[this.options.qrOptions.errorCorrectionLevel]\r\n });\r\n\r\n this.svgDrawingPromise = this.qrSVG.drawQR(this.qr).then(() => {\r\n if (!this.qrSVG?.element) return;\r\n this.extension?.(this.qrSVG.element, this.options);\r\n });\r\n }\r\n}\r\n","import { QRCodeStyling } from \"../core/qr-code-styling.js\";\r\nimport { RecursivePartial } from \"../types/helper.js\";\r\nimport { CanvasOptions, defaultCanvasOptions, sanitizeCanvasOptions } from \"../utils/canvas-options.js\";\r\nimport { mergeDeep } from \"../utils/merge.js\";\r\n\r\nexport enum FileExtension {\r\n svg = \"svg\",\r\n png = \"png\",\r\n jpeg = \"jpeg\",\r\n webp = \"webp\"\r\n}\r\n\r\nexport function drawToCanvas(\r\n qrCode: QRCodeStyling,\r\n options?: RecursivePartial<CanvasOptions>\r\n): { canvas: HTMLCanvasElement; canvasDrawingPromise: Promise<void> | undefined } | undefined {\r\n const { width, height, margin } = options\r\n ? sanitizeCanvasOptions(mergeDeep(defaultCanvasOptions, options) as CanvasOptions)\r\n : defaultCanvasOptions;\r\n\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = width;\r\n canvas.height = height;\r\n\r\n const size = Math.min(width, height) - 2 * margin;\r\n\r\n const canvasDrawingPromise = qrCode.serialize().then((xml) => {\r\n if (!xml) return;\r\n const svg64 = btoa(xml);\r\n const image64 = \"data:image/svg+xml;base64,\" + svg64;\r\n const image = new Image();\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n image.onload = (): void => {\r\n // Ensure pixel-perfect rendering of SVG to avoid artefact, then downscale to requested size\r\n const aaFactor = Math.ceil((2 * size) / Math.min(image.width, image.height));\r\n let aaCanvas: HTMLCanvasElement | OffscreenCanvas;\r\n try {\r\n aaCanvas = new OffscreenCanvas(image.width * aaFactor, image.height * aaFactor);\r\n } catch (_) {\r\n // Fallback to regular canvas element\r\n aaCanvas = document.createElement(\"canvas\");\r\n aaCanvas.width = image.width * aaFactor;\r\n aaCanvas.height = image.height * aaFactor;\r\n }\r\n aaCanvas.getContext(\"2d\")?.drawImage(image, 0, 0, aaCanvas.width, aaCanvas.height);\r\n\r\n canvas?.getContext(\"2d\")?.drawImage(aaCanvas, (width - size) / 2, (height - size) / 2, size, size);\r\n resolve();\r\n };\r\n image.onerror = image.onabort = reject;\r\n\r\n image.src = image64;\r\n });\r\n });\r\n\r\n return { canvas, canvasDrawingPromise };\r\n}\r\n\r\nexport async function download(\r\n qrCode: QRCodeStyling,\r\n downloadOptions: `${FileExtension}` | { name?: string; extension: `${FileExtension}` },\r\n options?: RecursivePartial<CanvasOptions>\r\n): Promise<void> {\r\n let extension: `${FileExtension}` = FileExtension.png;\r\n let name = \"qr\";\r\n\r\n //TODO remove deprecated code in the v2\r\n if (typeof downloadOptions === \"string\") {\r\n extension = downloadOptions;\r\n console.warn(\r\n \"Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument\"\r\n );\r\n } else if (typeof downloadOptions === \"object\" && downloadOptions !== null) {\r\n if (downloadOptions.name) {\r\n name = downloadOptions.name;\r\n }\r\n if (downloadOptions.extension) {\r\n extension = downloadOptions.extension;\r\n }\r\n }\r\n\r\n if (extension.toLowerCase() === \"svg\") {\r\n let source = await qrCode.serialize();\r\n source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source;\r\n const url = \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(source);\r\n downloadURI(url, `${name}.svg`);\r\n } else {\r\n const res = drawToCanvas(qrCode, options);\r\n if (!res) return;\r\n const { canvas, canvasDrawingPromise } = res;\r\n await canvasDrawingPromise;\r\n const url = canvas.toDataURL(`image/${extension}`);\r\n downloadURI(url, `${name}.${extension}`);\r\n }\r\n}\r\n\r\nexport function downloadURI(uri: string, name: string): void {\r\n const link = document.createElement(\"a\");\r\n link.download = name;\r\n link.href = uri;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n}\r\n","import { DOMImplementation, DOMParser, XMLSerializer } from \"@xmldom/xmldom\";\r\nimport { fileTypeFromBuffer } from \"file-type\";\r\nimport sharp from \"sharp\";\r\nimport { QRCodeStyling as _QRCodeStyling } from \"./core/qr-code-styling.js\";\r\nimport type * as _browserUtils from \"./tools/browser-utils.js\";\r\nimport { RecursivePartial } from \"./types/helper.js\";\r\nimport { Options } from \"./utils/options.js\";\r\nexport { type ExtensionFunction } from \"./core/qr-code-styling.js\";\r\nexport { FileExtension } from \"./tools/browser-utils.js\";\r\nexport { type RecursivePartial } from \"./types/helper.js\";\r\nexport { ErrorCorrectionLevel, Mode, TypeNumber } from \"./types/qrcode.js\";\r\nexport { type CanvasOptions } from \"./utils/canvas-options.js\";\r\nexport { GradientType, type Gradient } from \"./utils/gradient.js\";\r\nexport { CornerDotType, CornerSquareType, DotType, ShapeType, type Options } from \"./utils/options.js\";\r\nexport { ErrorCorrectionPercents } from \"./utils/qrcode.js\";\r\n\r\nexport const browserUtils: typeof _browserUtils | undefined = undefined;\r\n\r\nexport class QRCodeStyling extends _QRCodeStyling {\r\n constructor(options: RecursivePartial<Options>) {\r\n const dom = new DOMImplementation().createDocument(null, null);\r\n const imageCache = new Map<string, Promise<{ contentType?: string | null; data: Buffer }>>();\r\n\r\n const loadImage = async function (url: string | Buffer | Blob) {\r\n if (typeof url == \"string\") {\r\n let pr = imageCache.get(url);\r\n if (pr) return pr;\r\n pr = fetch(url).then((res) =>\r\n res\r\n .arrayBuffer()\r\n .then((buff) => Buffer.from(buff))\r\n .then(async (data) => ({\r\n contentType: res.headers.get(\"Content-Type\") || (await fileTypeFromBuffer(data).then((r) => r?.mime)),\r\n data\r\n }))\r\n );\r\n imageCache.set(url, pr);\r\n return pr;\r\n } else {\r\n const buff = Buffer.from(url as Buffer);\r\n const mime = await fileTypeFromBuffer(buff).then((r) => r?.mime);\r\n return {\r\n contentType: mime,\r\n data: buff\r\n };\r\n }\r\n };\r\n\r\n global.XMLSerializer = XMLSerializer;\r\n global.DOMParser = DOMParser;\r\n\r\n super({\r\n ...options,\r\n document: options.document || dom,\r\n imageTools: options.imageTools || {\r\n toDataURL: (url: string | Buffer | Blob): Promise<string> =>\r\n loadImage(url).then(\r\n ({ contentType, data }) =>\r\n `data:${contentType?.replace(\"application/xml\", \"image/svg+xml\")};base64,${data.toString(\"base64\")}`\r\n ),\r\n getSize: async (src: string | Blob | Buffer): Promise<{ width: number; height: number }> => {\r\n const { data } = Buffer.isBuffer(options.image) ? { data: options.image } : await loadImage(src);\r\n const meta = await sharp(data).metadata();\r\n return {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n width: meta.width!,\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n height: meta.height!\r\n };\r\n }\r\n }\r\n });\r\n }\r\n}\r\n"],"names":["TypeNumber","Array","fill","map","_","i","ErrorCorrectionLevel","Mode","L","M","Q","H","numeric","alphanumeric","kanji","unicode","isObject","obj","isArray","target","sources","length","undefined","source","keys","forEach","key","targetValue","sourceValue","mergeDeep","Object","assign","GradientType","DotType","CornerDotType","CornerSquareType","ShapeType","sanitizeGradient","gradient","colorStops","newGradient","rotation","Number","colorStop","offset","radial","linear","dot","randomDot","rounded","verticalLine","horizontalLine","classy","classyRounded","square","smallSquare","extraRounded","diamond","heart","outpoint","inpoint","circle","defaultOptions","document","shape","width","height","data","qrOptions","typeNumber","mode","errorCorrectionLevel","imageOptions","hideBackgroundDots","imageSize","crossOrigin","margin","dotsOptions","type","color","size","sanitizeOptions","options","newOptions","Math","min","round","max","cornersSquareOptions","cornersDotOptions","backgroundOptions","ErrorCorrectionPercents","rx","numToAttr","value","toFixed","replace","strings","values","reduce","t","v","p","trim","element","this","_element","constructor","draw","args","drawFunction","drawSquare","drawHeart","drawRounded","drawClassy","drawInpoint","drawOutpoint","drawDot","call","rotateFigure","x","y","cx","cy","setAttribute","PI","basicDot","createElementNS","basicSquare","basicHeart","move","path","toUpperCase","join","basicRounded","basicClassy","svgPath","dotSize","basicInpoint","scaleFactor","drawExtraRounded","basicExtraRounded","drawRandomDot","drawClassyRounded","drawVerticalLine","drawHorizontalLine","drawDiamond","drawSmallSquare","basicSideRounded","basicCornerRounded","basicCornerExtraRounded","basicCornersRounded","random","getNeighbor","leftNeighbor","rightNeighbor","topNeighbor","neighborsCount","bottomNeighbor","leftNeighbor_rotation","browserImageTools","toDataURL","url","Promise","resolve","reject","xhr","XMLHttpRequest","onload","xhr.onload","reader","FileReader","onloadend","reader.onloadend","result","readAsDataURL","response","onerror","onabort","ontimeout","open","responseType","send","getSize","src","image","Image","then","catch","squareMask","dotMask","alignmentCount","defs","appendChild","imageTools","drawQR","qr","parseInt","count","drawImageSize","hideXDots","hideYDots","errorCorrectionPercent","coverLevel","alignment","find","calculateImageSize","originalHeight","originalWidth","maxHiddenDots","maxHiddenAxisDots","dimMax","dimMin","lower","upper","dotsMax","ceil","dotsMin","abs","hideMax","hideMin","maxW","maxH","floor","drawBackground","drawDots","j","drawCorners","drawImage","createColor","additionalRotation","name","backgroundMask","backgroundMaskGroup","createMask","filter","getModuleCount","minSize","QRDot","dotsMask","dotsMaskGroup","isDark","xBeginning","yBeginning","xOffset","yOffset","colorX","colorY","colorCount","additionalDots","fakeCount","xFakeBeginning","yFakeBeginning","fakeMatrix","center","sqrt","column","row","cornersSquareMask","cornersSquareMaskGroup","cornersDotMask","cornersDotMaskGroup","cornersSquareSize","cornersDotMask_cornersSquare_dot","QRCornerSquare","cornersSquare","cornersDotSize","column_cornersDot","QRCornerDot","cornersDot","dx","dy","dw","dh","setAttributeNS","imageUrl","startsWith","substring","indexOf","encoding","container_data","atob","Buffer","from","toString","container","parseFromString","DOMParser","rootEl","getElementsByTagName","rect","x0","y0","x1","y1","positiveRotation","tan","stop","id","mask","group","qrSVG","update","innerHTML","stringToBytesFuncs","qrcode","getMode","test","byte","stringToBytes","addData","make","setupSvg","append","applyExtension","extension","deleteExtension","serialize","svgDrawingPromise","serializeToString","XMLSerializer","QRSVG","FileExtension","svg","png","jpeg","webp","QRCodeStyling","QRCodeStyling$1","async","loadImage","pr","imageCache","get","fetch","res","arrayBuffer","buff","contentType","headers","fileTypeFromBuffer","r","mime","set","dom","createDocument","DOMImplementation","Map","super","isBuffer","meta","sharp","metadata"],"mappings":"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"}
|