fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 16.5 kB
Source Map (JSON)
{"version":3,"file":"matrix.mjs","sources":["../../../../src/util/misc/matrix.ts"],"sourcesContent":["import { iMatrix } from '../../constants';\nimport type { XY } from '../../Point';\nimport { Point } from '../../Point';\nimport type { TDegree, TRadian, TMat2D } from '../../typedefs';\nimport { cos } from './cos';\nimport { degreesToRadians, radiansToDegrees } from './radiansDegreesConversion';\nimport { sin } from './sin';\n\nexport type TRotateMatrixArgs = {\n angle?: TDegree;\n};\n\nexport type TTranslateMatrixArgs = {\n translateX?: number;\n translateY?: number;\n};\n\nexport type TScaleMatrixArgs = {\n scaleX?: number;\n scaleY?: number;\n flipX?: boolean;\n flipY?: boolean;\n skewX?: TDegree;\n skewY?: TDegree;\n};\n\nexport type TComposeMatrixArgs = TTranslateMatrixArgs &\n TRotateMatrixArgs &\n TScaleMatrixArgs;\n\nexport type TQrDecomposeOut = Required<\n Omit<TComposeMatrixArgs, 'flipX' | 'flipY'>\n>;\n\nexport const isIdentityMatrix = (mat: TMat2D) =>\n mat.every((value, index) => value === iMatrix[index]);\n\n/**\n * Apply transform t to point p\n * @deprecated use {@link Point#transform}\n * @param {Point | XY} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {Point} The transformed point\n */\nexport const transformPoint = (\n p: XY,\n t: TMat2D,\n ignoreOffset?: boolean,\n): Point => new Point(p).transform(t, ignoreOffset);\n\n/**\n * Invert transformation t\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\nexport const invertTransform = (t: TMat2D): TMat2D => {\n const a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0], 0, 0] as TMat2D,\n { x, y } = new Point(t[4], t[5]).transform(r, true);\n r[4] = -x;\n r[5] = -y;\n return r;\n};\n\n/**\n * Multiply matrix A by matrix B to nest transformations\n * @param {TMat2D} a First transformMatrix\n * @param {TMat2D} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {TMat2D} The product of the two transform matrices\n */\nexport const multiplyTransformMatrices = (\n a: TMat2D,\n b: TMat2D,\n is2x2?: boolean,\n): TMat2D =>\n [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5],\n ] as TMat2D;\n\n/**\n * Multiplies {@link TMat2D} such that a matrix defines the plane for the rest of the matrices **after** it\n *\n * `multiplyTransformMatrixArray([A, B, C, D])` is equivalent to `A(B(C(D)))`\n *\n * @param matrices an array of matrices\n * @param [is2x2] flag to multiply matrices as 2x2 matrices\n * @returns the multiplication product\n */\nexport const multiplyTransformMatrixArray = (\n matrices: (TMat2D | undefined | null | false)[],\n is2x2?: boolean,\n) =>\n matrices.reduceRight(\n (product: TMat2D, curr) =>\n curr && product\n ? multiplyTransformMatrices(curr, product, is2x2)\n : curr || product,\n undefined as unknown as TMat2D,\n ) || iMatrix.concat();\n\nexport const calcPlaneRotation = ([a, b]: TMat2D) =>\n Math.atan2(b, a) as TRadian;\n\n/**\n * Decomposes standard 2x3 matrix into transform components\n * @param {TMat2D} a transformMatrix\n * @return {Object} Components of transform\n */\nexport const qrDecompose = (a: TMat2D): TQrDecomposeOut => {\n const angle = calcPlaneRotation(a),\n denom = Math.pow(a[0], 2) + Math.pow(a[1], 2),\n scaleX = Math.sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = Math.atan2(a[0] * a[2] + a[1] * a[3], denom);\n return {\n angle: radiansToDegrees(angle),\n scaleX,\n scaleY,\n skewX: radiansToDegrees(skewX),\n skewY: 0 as TDegree,\n translateX: a[4] || 0,\n translateY: a[5] || 0,\n };\n};\n\n/**\n * Generate a translation matrix\n *\n * A translation matrix in the form of\n * [ 1 0 x ]\n * [ 0 1 y ]\n * [ 0 0 1 ]\n *\n * See @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#translate for more details\n *\n * @param {number} x translation on X axis\n * @param {number} [y] translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createTranslateMatrix = (x: number, y = 0): TMat2D => [\n 1,\n 0,\n 0,\n 1,\n x,\n y,\n];\n\n/**\n * Generate a rotation matrix around around a point (x,y), defaulting to (0,0)\n *\n * A matrix in the form of\n * [cos(a) -sin(a) -x*cos(a)+y*sin(a)+x]\n * [sin(a) cos(a) -x*sin(a)-y*cos(a)+y]\n * [0 0 1 ]\n *\n *\n * @param {TDegree} angle rotation in degrees\n * @param {XY} [pivotPoint] pivot point to rotate around\n * @returns {TMat2D} matrix\n */\nexport function createRotateMatrix(\n { angle = 0 }: TRotateMatrixArgs = {},\n { x = 0, y = 0 }: Partial<XY> = {},\n): TMat2D {\n const angleRadiant = degreesToRadians(angle),\n cosValue = cos(angleRadiant),\n sinValue = sin(angleRadiant);\n return [\n cosValue,\n sinValue,\n -sinValue,\n cosValue,\n x ? x - (cosValue * x - sinValue * y) : 0,\n y ? y - (sinValue * x + cosValue * y) : 0,\n ];\n}\n\n/**\n * Generate a scale matrix around the point (0,0)\n *\n * A matrix in the form of\n * [x 0 0]\n * [0 y 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#scale\n *\n * @param {number} x scale on X axis\n * @param {number} [y] scale on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createScaleMatrix = (x: number, y: number = x): TMat2D => [\n x,\n 0,\n 0,\n y,\n 0,\n 0,\n];\n\nexport const angleToSkew = (angle: TDegree) =>\n Math.tan(degreesToRadians(angle));\n\nexport const skewToAngle = (value: TRadian) =>\n radiansToDegrees(Math.atan(value));\n\n/**\n * Generate a skew matrix for the X axis\n *\n * A matrix in the form of\n * [1 x 0]\n * [0 1 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewx\n *\n * @param {TDegree} skewValue translation on X axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewXMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n 0,\n angleToSkew(skewValue),\n 1,\n 0,\n 0,\n];\n\n/**\n * Generate a skew matrix for the Y axis\n *\n * A matrix in the form of\n * [1 0 0]\n * [y 1 0]\n * [0 0 1]\n *\n * @link https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform#skewy\n *\n * @param {TDegree} skewValue translation on Y axis\n * @returns {TMat2D} matrix\n */\nexport const createSkewYMatrix = (skewValue: TDegree): TMat2D => [\n 1,\n angleToSkew(skewValue),\n 0,\n 1,\n 0,\n 0,\n];\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\nexport const calcDimensionsMatrix = ({\n scaleX = 1,\n scaleY = 1,\n flipX = false,\n flipY = false,\n skewX = 0 as TDegree,\n skewY = 0 as TDegree,\n}: TScaleMatrixArgs) => {\n let matrix = createScaleMatrix(\n flipX ? -scaleX : scaleX,\n flipY ? -scaleY : scaleY,\n );\n if (skewX) {\n matrix = multiplyTransformMatrices(matrix, createSkewXMatrix(skewX), true);\n }\n if (skewY) {\n matrix = multiplyTransformMatrices(matrix, createSkewYMatrix(skewY), true);\n }\n return matrix;\n};\n\n/**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * Before changing this function look at: src/benchmarks/calcTransformMatrix.mjs\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\nexport const composeMatrix = (options: TComposeMatrixArgs): TMat2D => {\n const { translateX = 0, translateY = 0, angle = 0 as TDegree } = options;\n let matrix = createTranslateMatrix(translateX, translateY);\n if (angle) {\n matrix = multiplyTransformMatrices(matrix, createRotateMatrix({ angle }));\n }\n const scaleMatrix = calcDimensionsMatrix(options);\n if (!isIdentityMatrix(scaleMatrix)) {\n matrix = multiplyTransformMatrices(matrix, scaleMatrix);\n }\n return matrix;\n};\n"],"names":["isIdentityMatrix","mat","every","value","index","iMatrix","transformPoint","p","t","ignoreOffset","Point","transform","invertTransform","a","r","x","y","multiplyTransformMatrices","b","is2x2","multiplyTransformMatrixArray","matrices","reduceRight","product","curr","undefined","concat","calcPlaneRotation","_ref","Math","atan2","qrDecompose","angle","denom","pow","scaleX","sqrt","scaleY","skewX","radiansToDegrees","skewY","translateX","translateY","createTranslateMatrix","arguments","length","createRotateMatrix","angleRadiant","degreesToRadians","cosValue","cos","sinValue","sin","createScaleMatrix","angleToSkew","tan","createSkewXMatrix","skewValue","createSkewYMatrix","calcDimensionsMatrix","_ref2","flipX","flipY","matrix","composeMatrix","options","scaleMatrix"],"mappings":";;;;;;AAkCO,MAAMA,gBAAgB,GAAIC,GAAW,IAC1CA,GAAG,CAACC,KAAK,CAAC,CAACC,KAAK,EAAEC,KAAK,KAAKD,KAAK,KAAKE,OAAO,CAACD,KAAK,CAAC,EAAC;;AAEvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,cAAc,GAAGA,CAC5BC,CAAK,EACLC,CAAS,EACTC,YAAsB,KACZ,IAAIC,KAAK,CAACH,CAAC,CAAC,CAACI,SAAS,CAACH,CAAC,EAAEC,YAAY,EAAC;;AAEnD;AACA;AACA;AACA;AACA;AACaG,MAAAA,eAAe,GAAIJ,CAAS,IAAa;EACpD,MAAMK,CAAC,GAAG,CAAC,IAAIL,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC,CAAC,CAAC,CAAC,CAAC;AACvCM,IAAAA,CAAC,GAAG,CAACD,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,EAAE,CAACK,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,EAAE,CAACK,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,EAAEK,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAW;AAC9D,IAAA;MAAEO,CAAC;AAAEC,MAAAA,CAAAA;KAAG,GAAG,IAAIN,KAAK,CAACF,CAAC,CAAC,CAAC,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,CAAC,CAACG,SAAS,CAACG,CAAC,EAAE,IAAI,CAAC,CAAA;AACrDA,EAAAA,CAAC,CAAC,CAAC,CAAC,GAAG,CAACC,CAAC,CAAA;AACTD,EAAAA,CAAC,CAAC,CAAC,CAAC,GAAG,CAACE,CAAC,CAAA;AACT,EAAA,OAAOF,CAAC,CAAA;AACV,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACaG,MAAAA,yBAAyB,GAAGA,CACvCJ,CAAS,EACTK,CAAS,EACTC,KAAe,KAEf,CACEN,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,EACzBL,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,EACzBL,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,EACzBL,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,EACzBC,KAAK,GAAG,CAAC,GAAGN,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,EAC5CM,KAAK,GAAG,CAAC,GAAGN,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,GAAGK,CAAC,CAAC,CAAC,CAAC,GAAGL,CAAC,CAAC,CAAC,CAAC,EACnC;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MACaO,4BAA4B,GAAGA,CAC1CC,QAA+C,EAC/CF,KAAe,KAEfE,QAAQ,CAACC,WAAW,CAClB,CAACC,OAAe,EAAEC,IAAI,KACpBA,IAAI,IAAID,OAAO,GACXN,yBAAyB,CAACO,IAAI,EAAED,OAAO,EAAEJ,KAAK,CAAC,GAC/CK,IAAI,IAAID,OAAO,EACrBE,SACF,CAAC,IAAIpB,OAAO,CAACqB,MAAM,GAAE;AAEhB,MAAMC,iBAAiB,GAAGC,IAAA,IAAA;AAAA,EAAA,IAAC,CAACf,CAAC,EAAEK,CAAC,CAAS,GAAAU,IAAA,CAAA;AAAA,EAAA,OAC9CC,IAAI,CAACC,KAAK,CAACZ,CAAC,EAAEL,CAAC,CAAC,CAAA;AAAA,EAAW;;AAE7B;AACA;AACA;AACA;AACA;AACakB,MAAAA,WAAW,GAAIlB,CAAS,IAAsB;AACzD,EAAA,MAAMmB,KAAK,GAAGL,iBAAiB,CAACd,CAAC,CAAC;IAChCoB,KAAK,GAAGJ,IAAI,CAACK,GAAG,CAACrB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAGgB,IAAI,CAACK,GAAG,CAACrB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7CsB,IAAAA,MAAM,GAAGN,IAAI,CAACO,IAAI,CAACH,KAAK,CAAC;IACzBI,MAAM,GAAG,CAACxB,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC,CAAC,CAAC,CAAC,IAAIsB,MAAM;IAC7CG,KAAK,GAAGT,IAAI,CAACC,KAAK,CAACjB,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC,CAAC,CAAC,CAAC,GAAGA,CAAC,CAAC,CAAC,CAAC,EAAEoB,KAAK,CAAC,CAAA;EACtD,OAAO;AACLD,IAAAA,KAAK,EAAEO,gBAAgB,CAACP,KAAK,CAAC;IAC9BG,MAAM;IACNE,MAAM;AACNC,IAAAA,KAAK,EAAEC,gBAAgB,CAACD,KAAK,CAAC;AAC9BE,IAAAA,KAAK,EAAE,CAAY;AACnBC,IAAAA,UAAU,EAAE5B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrB6B,IAAAA,UAAU,EAAE7B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;GACrB,CAAA;AACH,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACa8B,MAAAA,qBAAqB,GAAG,UAAC5B,CAAS,EAAA;AAAA,EAAA,IAAEC,CAAC,GAAA4B,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAnB,SAAA,GAAAmB,SAAA,CAAA,CAAA,CAAA,GAAG,CAAC,CAAA;AAAA,EAAA,OAAa,CACjE,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,EACD7B,CAAC,EACDC,CAAC,CACF,CAAA;AAAA,EAAA;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS8B,kBAAkBA,GAGxB;EAAA,IAFR;AAAEd,IAAAA,KAAK,GAAG,CAAA;AAAqB,GAAC,GAAAY,SAAA,CAAAC,MAAA,GAAAD,CAAAA,IAAAA,SAAA,CAAAnB,CAAAA,CAAAA,KAAAA,SAAA,GAAAmB,SAAA,CAAG,CAAA,CAAA,GAAA,EAAE,CAAA;EAAA,IACrC;AAAE7B,IAAAA,CAAC,GAAG,CAAC;AAAEC,IAAAA,CAAC,GAAG,CAAA;AAAe,GAAC,GAAA4B,SAAA,CAAAC,MAAA,GAAAD,CAAAA,IAAAA,SAAA,CAAAnB,CAAAA,CAAAA,KAAAA,SAAA,GAAAmB,SAAA,CAAG,CAAA,CAAA,GAAA,EAAE,CAAA;AAElC,EAAA,MAAMG,YAAY,GAAGC,gBAAgB,CAAChB,KAAK,CAAC;AAC1CiB,IAAAA,QAAQ,GAAGC,GAAG,CAACH,YAAY,CAAC;AAC5BI,IAAAA,QAAQ,GAAGC,GAAG,CAACL,YAAY,CAAC,CAAA;AAC9B,EAAA,OAAO,CACLE,QAAQ,EACRE,QAAQ,EACR,CAACA,QAAQ,EACTF,QAAQ,EACRlC,CAAC,GAAGA,CAAC,IAAIkC,QAAQ,GAAGlC,CAAC,GAAGoC,QAAQ,GAAGnC,CAAC,CAAC,GAAG,CAAC,EACzCA,CAAC,GAAGA,CAAC,IAAImC,QAAQ,GAAGpC,CAAC,GAAGkC,QAAQ,GAAGjC,CAAC,CAAC,GAAG,CAAC,CAC1C,CAAA;AACH,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACaqC,MAAAA,iBAAiB,GAAG,UAACtC,CAAS,EAAA;AAAA,EAAA,IAAEC,CAAS,GAAA4B,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAnB,SAAA,GAAAmB,SAAA,CAAA,CAAA,CAAA,GAAG7B,CAAC,CAAA;AAAA,EAAA,OAAa,CACrEA,CAAC,EACD,CAAC,EACD,CAAC,EACDC,CAAC,EACD,CAAC,EACD,CAAC,CACF,CAAA;AAAA,EAAA;AAEYsC,MAAAA,WAAW,GAAItB,KAAc,IACxCH,IAAI,CAAC0B,GAAG,CAACP,gBAAgB,CAAChB,KAAK,CAAC,EAAC;;AAKnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMwB,iBAAiB,GAAIC,SAAkB,IAAa,CAC/D,CAAC,EACD,CAAC,EACDH,WAAW,CAACG,SAAS,CAAC,EACtB,CAAC,EACD,CAAC,EACD,CAAC,EACF;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,iBAAiB,GAAID,SAAkB,IAAa,CAC/D,CAAC,EACDH,WAAW,CAACG,SAAS,CAAC,EACtB,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,EACF;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACaE,MAAAA,oBAAoB,GAAGC,KAAA,IAOZ;EAAA,IAPa;AACnCzB,IAAAA,MAAM,GAAG,CAAC;AACVE,IAAAA,MAAM,GAAG,CAAC;AACVwB,IAAAA,KAAK,GAAG,KAAK;AACbC,IAAAA,KAAK,GAAG,KAAK;AACbxB,IAAAA,KAAK,GAAG,CAAY;AACpBE,IAAAA,KAAK,GAAG,CAAA;AACQ,GAAC,GAAAoB,KAAA,CAAA;AACjB,EAAA,IAAIG,MAAM,GAAGV,iBAAiB,CAC5BQ,KAAK,GAAG,CAAC1B,MAAM,GAAGA,MAAM,EACxB2B,KAAK,GAAG,CAACzB,MAAM,GAAGA,MACpB,CAAC,CAAA;AACD,EAAA,IAAIC,KAAK,EAAE;IACTyB,MAAM,GAAG9C,yBAAyB,CAAC8C,MAAM,EAAEP,iBAAiB,CAAClB,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;AAC5E,GAAA;AACA,EAAA,IAAIE,KAAK,EAAE;IACTuB,MAAM,GAAG9C,yBAAyB,CAAC8C,MAAM,EAAEL,iBAAiB,CAAClB,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;AAC5E,GAAA;AACA,EAAA,OAAOuB,MAAM,CAAA;AACf,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACaC,MAAAA,aAAa,GAAIC,OAA2B,IAAa;EACpE,MAAM;AAAExB,IAAAA,UAAU,GAAG,CAAC;AAAEC,IAAAA,UAAU,GAAG,CAAC;AAAEV,IAAAA,KAAK,GAAG,CAAA;AAAa,GAAC,GAAGiC,OAAO,CAAA;AACxE,EAAA,IAAIF,MAAM,GAAGpB,qBAAqB,CAACF,UAAU,EAAEC,UAAU,CAAC,CAAA;AAC1D,EAAA,IAAIV,KAAK,EAAE;AACT+B,IAAAA,MAAM,GAAG9C,yBAAyB,CAAC8C,MAAM,EAAEjB,kBAAkB,CAAC;AAAEd,MAAAA,KAAAA;AAAM,KAAC,CAAC,CAAC,CAAA;AAC3E,GAAA;AACA,EAAA,MAAMkC,WAAW,GAAGP,oBAAoB,CAACM,OAAO,CAAC,CAAA;AACjD,EAAA,IAAI,CAACjE,gBAAgB,CAACkE,WAAW,CAAC,EAAE;AAClCH,IAAAA,MAAM,GAAG9C,yBAAyB,CAAC8C,MAAM,EAAEG,WAAW,CAAC,CAAA;AACzD,GAAA;AACA,EAAA,OAAOH,MAAM,CAAA;AACf;;;;"}