UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 17.8 kB
{"version":3,"file":"croppingHandlers.mjs","sources":["../../extensions/cropping_controls/croppingHandlers.ts"],"sourcesContent":["import type {\n TModificationEvents,\n Transform,\n TransformActionHandler,\n FabricImage,\n ObjectEvents,\n Control,\n TMat2D,\n} from 'fabric';\nimport { controlsUtils, Point, util } from 'fabric';\n\nconst { wrapWithFixedAnchor, wrapWithFireEvent } = controlsUtils;\n\n/**\n * Wrap controlsUtils.changeObjectWidth with image constrains\n */\nexport const changeImageWidth: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const { width } = target;\n const image = target as FabricImage;\n const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n const availableWidth = image._element.width - image.cropX;\n if (modified) {\n if (image.width > availableWidth) {\n image.width = availableWidth;\n }\n if (image.width < 1) {\n image.width = 1;\n }\n }\n return width !== image.width;\n};\n\nexport const changeCropWidth = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageWidth),\n);\n\n/**\n * Wrap controlsUtils.changeObjectHeight with image constrains\n */\nexport const changeImageHeight: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const { height } = target;\n const image = target as FabricImage;\n const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n const availableHeight = image._element.height - image.cropY;\n if (modified) {\n if (image.height > availableHeight) {\n image.height = availableHeight;\n }\n if (image.height < 1) {\n image.height = 1;\n }\n }\n return height !== image.height;\n};\n\nexport const changeCropHeight = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageHeight),\n);\n\nexport const changeImageCropX: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const image = target as FabricImage;\n const { width, cropX } = image;\n const modified = controlsUtils.changeObjectWidth(eventData, transform, x, y);\n let newCropX = cropX + width - image.width;\n image.width = width;\n if (modified) {\n if (newCropX < 0) {\n newCropX = 0;\n }\n image.cropX = newCropX;\n // calculate new width on the base of how much crop we have now\n image.width += cropX - newCropX;\n }\n return newCropX !== cropX;\n};\n\nexport const changeImageCropY: TransformActionHandler = (\n eventData,\n transform,\n x,\n y,\n) => {\n const { target } = transform;\n const image = target as FabricImage;\n const { height, cropY } = image;\n const modified = controlsUtils.changeObjectHeight(eventData, transform, x, y);\n let newCropY = cropY + height - image.height;\n image.height = height;\n if (modified) {\n if (newCropY < 0) {\n newCropY = 0;\n }\n image.cropY = newCropY;\n image.height += cropY - newCropY;\n }\n return newCropY !== cropY;\n};\n\nexport const changeCropX = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageCropX),\n);\n\nexport const changeCropY = wrapWithFireEvent(\n 'CROPPING' as TModificationEvents,\n wrapWithFixedAnchor(changeImageCropY),\n);\n\n/**\n * A function to counter the move action and change cropX/cropY of an image\n * Keep the image steady, but moves it inside its own cropping rectangle\n */\nexport const cropPanMoveHandler = ({ transform }: ObjectEvents['moving']) => {\n // this makes the image pan too fast.\n const { target, original } = transform as Transform;\n const fabricImage = target as FabricImage;\n const p = new Point(\n target.left - original.left,\n target.top - original.top,\n ).transform(\n util.invertTransform(\n util.createRotateMatrix({ angle: fabricImage.getTotalAngle() }),\n ),\n );\n let cropX = original.cropX! - p.x / fabricImage.scaleX;\n let cropY = original.cropY! - p.y / fabricImage.scaleY;\n const { width, height, _element } = fabricImage;\n if (cropX < 0) {\n cropX = 0;\n }\n if (cropY < 0) {\n cropY = 0;\n }\n if (cropX + width > _element.width) {\n cropX = _element.width - width;\n }\n if (cropY + height > _element.height) {\n cropY = _element.height - height;\n }\n fabricImage.cropX = cropX;\n fabricImage.cropY = cropY;\n fabricImage.left = original.left;\n fabricImage.top = original.top;\n};\n\n/**\n * This position handler works only for this specific use case.\n * It does not support padding nor offset, and it reduces all possible positions\n * to the main 4 corners only.\n * Any position that is < 0 is the extreme left/top, the rest are right/bottom\n */\nexport function ghostScalePositionHandler(\n this: Control,\n dim: Point, // currentDimension\n finalMatrix: TMat2D,\n fabricObject: FabricImage,\n // currentControl: Control,\n) {\n const matrix = fabricObject.calcTransformMatrix();\n const vpt = fabricObject.getViewportTransform();\n const _finalMatrix = util.multiplyTransformMatrices(vpt, matrix);\n\n let x = 0;\n let y = 0;\n if (this.x < 0) {\n x = -fabricObject.width / 2 - fabricObject.cropX;\n } else {\n x =\n fabricObject.getElement().width -\n fabricObject.width / 2 -\n fabricObject.cropX;\n }\n\n if (this.y < 0) {\n y = -fabricObject.height / 2 - fabricObject.cropY;\n } else {\n y =\n fabricObject.getElement().height -\n fabricObject.height / 2 -\n fabricObject.cropY;\n }\n return new Point(x, y).transform(_finalMatrix);\n}\n\nconst calcScale = (currentPoint: Point, height: number, width: number) =>\n Math.min(Math.abs(currentPoint.x / width), Math.abs(currentPoint.y / height));\n\n/**\n * Action handler generator that handles scaling of an image in crop mode.\n * The goal is to keep the current bounding box steady.\n * So this action handler has its own calculations for a dynamic anchor point\n */\nexport const scaleEquallyCropGenerator =\n (cx: number, cy: number): TransformActionHandler =>\n (eventData, transform, x, y) => {\n const { target } = transform as unknown as { target: FabricImage };\n const { width: fullWidth, height: fullHeight } = target.getElement();\n const remainderX = fullWidth - target.width - target.cropX;\n const remainderY = fullHeight - target.height - target.cropY;\n const anchorOriginX =\n cx < 0 ? 1 + remainderX / target.width : -target.cropX / target.width;\n const anchorOriginY =\n cy < 0 ? 1 + remainderY / target.height : -target.cropY / target.height;\n const constraint = target.translateToOriginPoint(\n target.getCenterPoint(),\n anchorOriginX,\n anchorOriginY,\n );\n const newPoint = controlsUtils.getLocalPoint(\n transform,\n anchorOriginX,\n anchorOriginY,\n x,\n y,\n );\n const scale = calcScale(newPoint, fullHeight, fullWidth);\n const scaleChangeX = scale / target.scaleX;\n const scaleChangeY = scale / target.scaleY;\n const scaledRemainderX = remainderX / scaleChangeX;\n const scaledRemainderY = remainderY / scaleChangeY;\n const newWidth = target.width / scaleChangeX;\n const newHeight = target.height / scaleChangeY;\n const newCropX =\n cx < 0\n ? fullWidth - newWidth - scaledRemainderX\n : target.cropX / scaleChangeX;\n const newCropY =\n cy < 0\n ? fullHeight - newHeight - scaledRemainderY\n : target.cropY / scaleChangeY;\n\n if (\n (cx < 0 ? scaledRemainderX : newCropX) + newWidth > fullWidth ||\n (cy < 0 ? scaledRemainderY : newCropY) + newHeight > fullHeight\n ) {\n return false;\n }\n\n target.scaleX = scale;\n target.scaleY = scale;\n target.width = newWidth;\n target.height = newHeight;\n target.cropX = newCropX;\n target.cropY = newCropY;\n const newAnchorOriginX =\n cx < 0 ? 1 + scaledRemainderX / newWidth : -newCropX / newWidth;\n const newAnchorOriginY =\n cy < 0 ? 1 + scaledRemainderY / newHeight : -newCropY / newHeight;\n target.setPositionByOrigin(constraint, newAnchorOriginX, newAnchorOriginY);\n return true;\n };\n\nexport function renderGhostImage(\n this: FabricImage,\n { ctx }: { ctx: CanvasRenderingContext2D },\n) {\n const alpha = ctx.globalAlpha;\n ctx.globalAlpha *= 0.5;\n ctx.drawImage(\n this._element,\n -this.width / 2 - this.cropX,\n -this.height / 2 - this.cropY,\n );\n ctx.globalAlpha = alpha;\n}\n"],"names":["wrapWithFixedAnchor","wrapWithFireEvent","controlsUtils","changeImageWidth","eventData","transform","x","y","target","width","image","modified","changeObjectWidth","availableWidth","_element","cropX","changeCropWidth","changeImageHeight","height","changeObjectHeight","availableHeight","cropY","changeCropHeight","changeImageCropX","newCropX","changeImageCropY","newCropY","changeCropX","changeCropY","cropPanMoveHandler","_ref","original","fabricImage","p","Point","left","top","util","invertTransform","createRotateMatrix","angle","getTotalAngle","scaleX","scaleY","ghostScalePositionHandler","dim","finalMatrix","fabricObject","matrix","calcTransformMatrix","vpt","getViewportTransform","_finalMatrix","multiplyTransformMatrices","getElement","calcScale","currentPoint","Math","min","abs","scaleEquallyCropGenerator","cx","cy","fullWidth","fullHeight","remainderX","remainderY","anchorOriginX","anchorOriginY","constraint","translateToOriginPoint","getCenterPoint","newPoint","getLocalPoint","scale","scaleChangeX","scaleChangeY","scaledRemainderX","scaledRemainderY","newWidth","newHeight","newAnchorOriginX","newAnchorOriginY","setPositionByOrigin","renderGhostImage","_ref2","ctx","alpha","globalAlpha","drawImage"],"mappings":";;AAWA,MAAM;EAAEA,mBAAmB;AAAEC,EAAAA;AAAkB,CAAC,GAAGC,aAAa;;AAEhE;AACA;AACA;AACO,MAAMC,gBAAwC,GAAGA,CACtDC,SAAS,EACTC,SAAS,EACTC,CAAC,EACDC,CAAC,KACE;EACH,MAAM;AAAEC,IAAAA;AAAO,GAAC,GAAGH,SAAS;EAC5B,MAAM;AAAEI,IAAAA;AAAM,GAAC,GAAGD,MAAM;EACxB,MAAME,KAAK,GAAGF,MAAqB;AACnC,EAAA,MAAMG,QAAQ,GAAGT,aAAa,CAACU,iBAAiB,CAACR,SAAS,EAAEC,SAAS,EAAEC,CAAC,EAAEC,CAAC,CAAC;EAC5E,MAAMM,cAAc,GAAGH,KAAK,CAACI,QAAQ,CAACL,KAAK,GAAGC,KAAK,CAACK,KAAK;AACzD,EAAA,IAAIJ,QAAQ,EAAE;AACZ,IAAA,IAAID,KAAK,CAACD,KAAK,GAAGI,cAAc,EAAE;MAChCH,KAAK,CAACD,KAAK,GAAGI,cAAc;AAC9B,IAAA;AACA,IAAA,IAAIH,KAAK,CAACD,KAAK,GAAG,CAAC,EAAE;MACnBC,KAAK,CAACD,KAAK,GAAG,CAAC;AACjB,IAAA;AACF,EAAA;AACA,EAAA,OAAOA,KAAK,KAAKC,KAAK,CAACD,KAAK;AAC9B;AAEO,MAAMO,eAAe,GAAGf,iBAAiB,CAC9C,UAAU,EACVD,mBAAmB,CAACG,gBAAgB,CACtC;;AAEA;AACA;AACA;AACO,MAAMc,iBAAyC,GAAGA,CACvDb,SAAS,EACTC,SAAS,EACTC,CAAC,EACDC,CAAC,KACE;EACH,MAAM;AAAEC,IAAAA;AAAO,GAAC,GAAGH,SAAS;EAC5B,MAAM;AAAEa,IAAAA;AAAO,GAAC,GAAGV,MAAM;EACzB,MAAME,KAAK,GAAGF,MAAqB;AACnC,EAAA,MAAMG,QAAQ,GAAGT,aAAa,CAACiB,kBAAkB,CAACf,SAAS,EAAEC,SAAS,EAAEC,CAAC,EAAEC,CAAC,CAAC;EAC7E,MAAMa,eAAe,GAAGV,KAAK,CAACI,QAAQ,CAACI,MAAM,GAAGR,KAAK,CAACW,KAAK;AAC3D,EAAA,IAAIV,QAAQ,EAAE;AACZ,IAAA,IAAID,KAAK,CAACQ,MAAM,GAAGE,eAAe,EAAE;MAClCV,KAAK,CAACQ,MAAM,GAAGE,eAAe;AAChC,IAAA;AACA,IAAA,IAAIV,KAAK,CAACQ,MAAM,GAAG,CAAC,EAAE;MACpBR,KAAK,CAACQ,MAAM,GAAG,CAAC;AAClB,IAAA;AACF,EAAA;AACA,EAAA,OAAOA,MAAM,KAAKR,KAAK,CAACQ,MAAM;AAChC;AAEO,MAAMI,gBAAgB,GAAGrB,iBAAiB,CAC/C,UAAU,EACVD,mBAAmB,CAACiB,iBAAiB,CACvC;AAEO,MAAMM,gBAAwC,GAAGA,CACtDnB,SAAS,EACTC,SAAS,EACTC,CAAC,EACDC,CAAC,KACE;EACH,MAAM;AAAEC,IAAAA;AAAO,GAAC,GAAGH,SAAS;EAC5B,MAAMK,KAAK,GAAGF,MAAqB;EACnC,MAAM;IAAEC,KAAK;AAAEM,IAAAA;AAAM,GAAC,GAAGL,KAAK;AAC9B,EAAA,MAAMC,QAAQ,GAAGT,aAAa,CAACU,iBAAiB,CAACR,SAAS,EAAEC,SAAS,EAAEC,CAAC,EAAEC,CAAC,CAAC;EAC5E,IAAIiB,QAAQ,GAAGT,KAAK,GAAGN,KAAK,GAAGC,KAAK,CAACD,KAAK;EAC1CC,KAAK,CAACD,KAAK,GAAGA,KAAK;AACnB,EAAA,IAAIE,QAAQ,EAAE;IACZ,IAAIa,QAAQ,GAAG,CAAC,EAAE;AAChBA,MAAAA,QAAQ,GAAG,CAAC;AACd,IAAA;IACAd,KAAK,CAACK,KAAK,GAAGS,QAAQ;AACtB;AACAd,IAAAA,KAAK,CAACD,KAAK,IAAIM,KAAK,GAAGS,QAAQ;AACjC,EAAA;EACA,OAAOA,QAAQ,KAAKT,KAAK;AAC3B;AAEO,MAAMU,gBAAwC,GAAGA,CACtDrB,SAAS,EACTC,SAAS,EACTC,CAAC,EACDC,CAAC,KACE;EACH,MAAM;AAAEC,IAAAA;AAAO,GAAC,GAAGH,SAAS;EAC5B,MAAMK,KAAK,GAAGF,MAAqB;EACnC,MAAM;IAAEU,MAAM;AAAEG,IAAAA;AAAM,GAAC,GAAGX,KAAK;AAC/B,EAAA,MAAMC,QAAQ,GAAGT,aAAa,CAACiB,kBAAkB,CAACf,SAAS,EAAEC,SAAS,EAAEC,CAAC,EAAEC,CAAC,CAAC;EAC7E,IAAImB,QAAQ,GAAGL,KAAK,GAAGH,MAAM,GAAGR,KAAK,CAACQ,MAAM;EAC5CR,KAAK,CAACQ,MAAM,GAAGA,MAAM;AACrB,EAAA,IAAIP,QAAQ,EAAE;IACZ,IAAIe,QAAQ,GAAG,CAAC,EAAE;AAChBA,MAAAA,QAAQ,GAAG,CAAC;AACd,IAAA;IACAhB,KAAK,CAACW,KAAK,GAAGK,QAAQ;AACtBhB,IAAAA,KAAK,CAACQ,MAAM,IAAIG,KAAK,GAAGK,QAAQ;AAClC,EAAA;EACA,OAAOA,QAAQ,KAAKL,KAAK;AAC3B;AAEO,MAAMM,WAAW,GAAG1B,iBAAiB,CAC1C,UAAU,EACVD,mBAAmB,CAACuB,gBAAgB,CACtC;AAEO,MAAMK,WAAW,GAAG3B,iBAAiB,CAC1C,UAAU,EACVD,mBAAmB,CAACyB,gBAAgB,CACtC;;AAEA;AACA;AACA;AACA;AACO,MAAMI,kBAAkB,GAAGC,IAAA,IAA2C;EAAA,IAA1C;AAAEzB,IAAAA;AAAkC,GAAC,GAAAyB,IAAA;AACtE;EACA,MAAM;IAAEtB,MAAM;AAAEuB,IAAAA;AAAS,GAAC,GAAG1B,SAAsB;EACnD,MAAM2B,WAAW,GAAGxB,MAAqB;AACzC,EAAA,MAAMyB,CAAC,GAAG,IAAIC,KAAK,CACjB1B,MAAM,CAAC2B,IAAI,GAAGJ,QAAQ,CAACI,IAAI,EAC3B3B,MAAM,CAAC4B,GAAG,GAAGL,QAAQ,CAACK,GACxB,CAAC,CAAC/B,SAAS,CACTgC,IAAI,CAACC,eAAe,CAClBD,IAAI,CAACE,kBAAkB,CAAC;AAAEC,IAAAA,KAAK,EAAER,WAAW,CAACS,aAAa;GAAI,CAChE,CACF,CAAC;AACD,EAAA,IAAI1B,KAAK,GAAGgB,QAAQ,CAAChB,KAAK,GAAIkB,CAAC,CAAC3B,CAAC,GAAG0B,WAAW,CAACU,MAAM;AACtD,EAAA,IAAIrB,KAAK,GAAGU,QAAQ,CAACV,KAAK,GAAIY,CAAC,CAAC1B,CAAC,GAAGyB,WAAW,CAACW,MAAM;EACtD,MAAM;IAAElC,KAAK;IAAES,MAAM;AAAEJ,IAAAA;AAAS,GAAC,GAAGkB,WAAW;EAC/C,IAAIjB,KAAK,GAAG,CAAC,EAAE;AACbA,IAAAA,KAAK,GAAG,CAAC;AACX,EAAA;EACA,IAAIM,KAAK,GAAG,CAAC,EAAE;AACbA,IAAAA,KAAK,GAAG,CAAC;AACX,EAAA;AACA,EAAA,IAAIN,KAAK,GAAGN,KAAK,GAAGK,QAAQ,CAACL,KAAK,EAAE;AAClCM,IAAAA,KAAK,GAAGD,QAAQ,CAACL,KAAK,GAAGA,KAAK;AAChC,EAAA;AACA,EAAA,IAAIY,KAAK,GAAGH,MAAM,GAAGJ,QAAQ,CAACI,MAAM,EAAE;AACpCG,IAAAA,KAAK,GAAGP,QAAQ,CAACI,MAAM,GAAGA,MAAM;AAClC,EAAA;EACAc,WAAW,CAACjB,KAAK,GAAGA,KAAK;EACzBiB,WAAW,CAACX,KAAK,GAAGA,KAAK;AACzBW,EAAAA,WAAW,CAACG,IAAI,GAAGJ,QAAQ,CAACI,IAAI;AAChCH,EAAAA,WAAW,CAACI,GAAG,GAAGL,QAAQ,CAACK,GAAG;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASQ,yBAAyBA,CAEvCC,GAAU;AAAE;AACZC,WAAmB,EACnBC;AACA;AAAA,EACA;AACA,EAAA,MAAMC,MAAM,GAAGD,YAAY,CAACE,mBAAmB,EAAE;AACjD,EAAA,MAAMC,GAAG,GAAGH,YAAY,CAACI,oBAAoB,EAAE;EAC/C,MAAMC,YAAY,GAAGf,IAAI,CAACgB,yBAAyB,CAACH,GAAG,EAAEF,MAAM,CAAC;EAEhE,IAAI1C,CAAC,GAAG,CAAC;EACT,IAAIC,CAAC,GAAG,CAAC;AACT,EAAA,IAAI,IAAI,CAACD,CAAC,GAAG,CAAC,EAAE;IACdA,CAAC,GAAG,CAACyC,YAAY,CAACtC,KAAK,GAAG,CAAC,GAAGsC,YAAY,CAAChC,KAAK;AAClD,EAAA,CAAC,MAAM;AACLT,IAAAA,CAAC,GACCyC,YAAY,CAACO,UAAU,EAAE,CAAC7C,KAAK,GAC/BsC,YAAY,CAACtC,KAAK,GAAG,CAAC,GACtBsC,YAAY,CAAChC,KAAK;AACtB,EAAA;AAEA,EAAA,IAAI,IAAI,CAACR,CAAC,GAAG,CAAC,EAAE;IACdA,CAAC,GAAG,CAACwC,YAAY,CAAC7B,MAAM,GAAG,CAAC,GAAG6B,YAAY,CAAC1B,KAAK;AACnD,EAAA,CAAC,MAAM;AACLd,IAAAA,CAAC,GACCwC,YAAY,CAACO,UAAU,EAAE,CAACpC,MAAM,GAChC6B,YAAY,CAAC7B,MAAM,GAAG,CAAC,GACvB6B,YAAY,CAAC1B,KAAK;AACtB,EAAA;EACA,OAAO,IAAIa,KAAK,CAAC5B,CAAC,EAAEC,CAAC,CAAC,CAACF,SAAS,CAAC+C,YAAY,CAAC;AAChD;AAEA,MAAMG,SAAS,GAAGA,CAACC,YAAmB,EAAEtC,MAAc,EAAET,KAAa,KACnEgD,IAAI,CAACC,GAAG,CAACD,IAAI,CAACE,GAAG,CAACH,YAAY,CAAClD,CAAC,GAAGG,KAAK,CAAC,EAAEgD,IAAI,CAACE,GAAG,CAACH,YAAY,CAACjD,CAAC,GAAGW,MAAM,CAAC,CAAC;;AAE/E;AACA;AACA;AACA;AACA;MACa0C,yBAAyB,GACpCA,CAACC,EAAU,EAAEC,EAAU,KACvB,CAAC1D,SAAS,EAAEC,SAAS,EAAEC,CAAC,EAAEC,CAAC,KAAK;EAC9B,MAAM;AAAEC,IAAAA;AAAO,GAAC,GAAGH,SAA+C;EAClE,MAAM;AAAEI,IAAAA,KAAK,EAAEsD,SAAS;AAAE7C,IAAAA,MAAM,EAAE8C;AAAW,GAAC,GAAGxD,MAAM,CAAC8C,UAAU,EAAE;EACpE,MAAMW,UAAU,GAAGF,SAAS,GAAGvD,MAAM,CAACC,KAAK,GAAGD,MAAM,CAACO,KAAK;EAC1D,MAAMmD,UAAU,GAAGF,UAAU,GAAGxD,MAAM,CAACU,MAAM,GAAGV,MAAM,CAACa,KAAK;EAC5D,MAAM8C,aAAa,GACjBN,EAAE,GAAG,CAAC,GAAG,CAAC,GAAGI,UAAU,GAAGzD,MAAM,CAACC,KAAK,GAAG,CAACD,MAAM,CAACO,KAAK,GAAGP,MAAM,CAACC,KAAK;EACvE,MAAM2D,aAAa,GACjBN,EAAE,GAAG,CAAC,GAAG,CAAC,GAAGI,UAAU,GAAG1D,MAAM,CAACU,MAAM,GAAG,CAACV,MAAM,CAACa,KAAK,GAAGb,MAAM,CAACU,MAAM;AACzE,EAAA,MAAMmD,UAAU,GAAG7D,MAAM,CAAC8D,sBAAsB,CAC9C9D,MAAM,CAAC+D,cAAc,EAAE,EACvBJ,aAAa,EACbC,aACF,CAAC;AACD,EAAA,MAAMI,QAAQ,GAAGtE,aAAa,CAACuE,aAAa,CAC1CpE,SAAS,EACT8D,aAAa,EACbC,aAAa,EACb9D,CAAC,EACDC,CACF,CAAC;EACD,MAAMmE,KAAK,GAAGnB,SAAS,CAACiB,QAAQ,EAAER,UAAU,EAAED,SAAS,CAAC;AACxD,EAAA,MAAMY,YAAY,GAAGD,KAAK,GAAGlE,MAAM,CAACkC,MAAM;AAC1C,EAAA,MAAMkC,YAAY,GAAGF,KAAK,GAAGlE,MAAM,CAACmC,MAAM;AAC1C,EAAA,MAAMkC,gBAAgB,GAAGZ,UAAU,GAAGU,YAAY;AAClD,EAAA,MAAMG,gBAAgB,GAAGZ,UAAU,GAAGU,YAAY;AAClD,EAAA,MAAMG,QAAQ,GAAGvE,MAAM,CAACC,KAAK,GAAGkE,YAAY;AAC5C,EAAA,MAAMK,SAAS,GAAGxE,MAAM,CAACU,MAAM,GAAG0D,YAAY;AAC9C,EAAA,MAAMpD,QAAQ,GACZqC,EAAE,GAAG,CAAC,GACFE,SAAS,GAAGgB,QAAQ,GAAGF,gBAAgB,GACvCrE,MAAM,CAACO,KAAK,GAAG4D,YAAY;AACjC,EAAA,MAAMjD,QAAQ,GACZoC,EAAE,GAAG,CAAC,GACFE,UAAU,GAAGgB,SAAS,GAAGF,gBAAgB,GACzCtE,MAAM,CAACa,KAAK,GAAGuD,YAAY;EAEjC,IACE,CAACf,EAAE,GAAG,CAAC,GAAGgB,gBAAgB,GAAGrD,QAAQ,IAAIuD,QAAQ,GAAGhB,SAAS,IAC7D,CAACD,EAAE,GAAG,CAAC,GAAGgB,gBAAgB,GAAGpD,QAAQ,IAAIsD,SAAS,GAAGhB,UAAU,EAC/D;AACA,IAAA,OAAO,KAAK;AACd,EAAA;EAEAxD,MAAM,CAACkC,MAAM,GAAGgC,KAAK;EACrBlE,MAAM,CAACmC,MAAM,GAAG+B,KAAK;EACrBlE,MAAM,CAACC,KAAK,GAAGsE,QAAQ;EACvBvE,MAAM,CAACU,MAAM,GAAG8D,SAAS;EACzBxE,MAAM,CAACO,KAAK,GAAGS,QAAQ;EACvBhB,MAAM,CAACa,KAAK,GAAGK,QAAQ;AACvB,EAAA,MAAMuD,gBAAgB,GACpBpB,EAAE,GAAG,CAAC,GAAG,CAAC,GAAGgB,gBAAgB,GAAGE,QAAQ,GAAG,CAACvD,QAAQ,GAAGuD,QAAQ;AACjE,EAAA,MAAMG,gBAAgB,GACpBpB,EAAE,GAAG,CAAC,GAAG,CAAC,GAAGgB,gBAAgB,GAAGE,SAAS,GAAG,CAACtD,QAAQ,GAAGsD,SAAS;EACnExE,MAAM,CAAC2E,mBAAmB,CAACd,UAAU,EAAEY,gBAAgB,EAAEC,gBAAgB,CAAC;AAC1E,EAAA,OAAO,IAAI;AACb;AAEK,SAASE,gBAAgBA,CAAAC,KAAA,EAG9B;EAAA,IADA;AAAEC,IAAAA;AAAuC,GAAC,GAAAD,KAAA;AAE1C,EAAA,MAAME,KAAK,GAAGD,GAAG,CAACE,WAAW;EAC7BF,GAAG,CAACE,WAAW,IAAI,GAAG;AACtBF,EAAAA,GAAG,CAACG,SAAS,CACX,IAAI,CAAC3E,QAAQ,EACb,CAAC,IAAI,CAACL,KAAK,GAAG,CAAC,GAAG,IAAI,CAACM,KAAK,EAC5B,CAAC,IAAI,CAACG,MAAM,GAAG,CAAC,GAAG,IAAI,CAACG,KAC1B,CAAC;EACDiE,GAAG,CAACE,WAAW,GAAGD,KAAK;AACzB;;;;"}